DisplayCAL-3.5.0.0/0000755000076500000000000000000013242313606013476 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/0000755000076500000000000000000013242313606015423 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/__init__.py0000644000076500000000000000021712665102054017535 0ustar devwheel00000000000000# -*- coding: utf-8 -*- try: import __version__ except ImportError: __version__ = "0.0.0.0" else: __version__ = __version__.VERSION_STRING DisplayCAL-3.5.0.0/DisplayCAL/__version__.py0000644000076500000000000000027213242313605020256 0ustar devwheel00000000000000# generated by setup.py BUILD_DATE = '2018-02-18T15:11:01.986371Z' LASTMOD = '2018-02-18T15:09:40.061052Z' VERSION = (3, 5, 0, 0) VERSION_BASE = (3, 5, 0, 0) VERSION_STRING = '3.5.0.0' DisplayCAL-3.5.0.0/DisplayCAL/argyll_cgats.py0000644000076500000000000003710013142403032020441 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import decimal Decimal = decimal.Decimal import os import traceback from time import strftime from debughelpers import Error from options import debug from ordereddict import OrderedDict from safe_print import safe_print from util_io import StringIOu as StringIO from util_str import safe_unicode import CGATS import ICCProfile as ICCP import localization as lang cals = {} def quote_nonoption_args(args): """ Puts quotes around all arguments which are not options (ie. which do not start with a hyphen '-') """ args = list(args) for i, arg in enumerate(args): if arg[0] != "-": args[i] = '"' + arg + '"' return args def add_dispcal_options_to_cal(cal, options_dispcal): # Add dispcal options to cal options_dispcal = quote_nonoption_args(options_dispcal) try: cgats = CGATS.CGATS(cal) cgats[0].add_section("ARGYLL_DISPCAL_ARGS", " ".join(options_dispcal).encode("UTF-7", "replace")) return cgats except Exception, exception: safe_print(safe_unicode(traceback.format_exc())) def add_options_to_ti3(ti3, options_dispcal=None, options_colprof=None): # Add dispcal and colprof options to ti3 try: cgats = CGATS.CGATS(ti3) if options_colprof: options_colprof = quote_nonoption_args(options_colprof) cgats[0].add_section("ARGYLL_COLPROF_ARGS", " ".join(options_colprof).encode("UTF-7", "replace")) if options_dispcal and 1 in cgats: options_dispcal = quote_nonoption_args(options_dispcal) cgats[1].add_section("ARGYLL_DISPCAL_ARGS", " ".join(options_dispcal).encode("UTF-7", "replace")) return cgats except Exception, exception: safe_print(safe_unicode(traceback.format_exc())) def cal_to_fake_profile(cal): """ Create and return a 'fake' ICCProfile with just a vcgt tag. cal must refer to a valid Argyll CAL file and can be a CGATS instance or a filename. """ vcgt, cal = cal_to_vcgt(cal, True) if not vcgt: return profile = ICCP.ICCProfile() profile.fileName = cal.filename profile._data = "\0" * 128 profile._tags.desc = ICCP.TextDescriptionType("", "desc") profile._tags.desc.ASCII = safe_unicode( os.path.basename(cal.filename)).encode("ascii", "asciize") profile._tags.desc.Unicode = safe_unicode(os.path.basename(cal.filename)) profile._tags.vcgt = vcgt profile.size = len(profile.data) profile.is_loaded = True return profile def cal_to_vcgt(cal, return_cgats=False): """ Create a vcgt tag from calibration data. cal must refer to a valid Argyll CAL file and can be a CGATS instance or a filename. """ if not isinstance(cal, CGATS.CGATS): try: cal = CGATS.CGATS(cal) except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: safe_print(u"Warning - couldn't process CGATS file '%s': %s" % tuple(safe_unicode(s) for s in (cal, exception))) return None required_fields = ("RGB_I", "RGB_R", "RGB_G", "RGB_B") data_format = cal.queryv1("DATA_FORMAT") if data_format: for field in required_fields: if not field in data_format.values(): if debug: safe_print("[D] Missing required field:", field) return None for field in data_format.values(): if not field in required_fields: if debug: safe_print("[D] Unknown field:", field) return None entries = cal.queryv(required_fields) if len(entries) < 1: if debug: safe_print("[D] No entries found in calibration", cal.filename) return None vcgt = ICCP.VideoCardGammaTableType("", "vcgt") vcgt.update({ "channels": 3, "entryCount": len(entries), "entrySize": 2, "data": [[], [], []] }) for n in entries: for i in range(3): vcgt.data[i].append(entries[n][i + 1] * 65535.0) if return_cgats: return vcgt, cal return vcgt def can_update_cal(path): """ Check if cal can be updated by checking for required fields. """ try: calstat = os.stat(path) except Exception, exception: safe_print(u"Warning - os.stat('%s') failed: %s" % tuple(safe_unicode(s) for s in (path, exception))) return False if not path in cals or cals[path].mtime != calstat.st_mtime: try: cal = CGATS.CGATS(path) except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: if path in cals: del cals[path] safe_print(u"Warning - couldn't process CGATS file '%s': %s" % tuple(safe_unicode(s) for s in (path, exception))) else: if cal.queryv1("DEVICE_CLASS") == "DISPLAY" and not None in \ (cal.queryv1("TARGET_WHITE_XYZ"), cal.queryv1("TARGET_GAMMA"), cal.queryv1("BLACK_POINT_CORRECTION"), cal.queryv1("QUALITY")): cals[path] = cal return path in cals and cals[path].mtime == calstat.st_mtime def extract_cal_from_profile(profile, out_cal_path=None, raise_on_missing_cal=True): """ Extract calibration from 'targ' tag in profile or vcgt as fallback """ # Check if calibration is included in TI3 targ = profile.tags.get("targ", profile.tags.get("CIED")) if isinstance(targ, ICCP.Text): cal = extract_cal_from_ti3(targ) check = cal get_cgats = CGATS.CGATS arg = cal else: # Convert calibration information from embedded WCS profile # (if present) to VideCardFormulaType if the latter is not present if (isinstance(profile.tags.get("MS00"), ICCP.WcsProfilesTagType) and not "vcgt" in profile.tags): profile.tags["vcgt"] = profile.tags["MS00"].get_vcgt() # Get the calibration from profile vcgt check = isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType) get_cgats = vcgt_to_cal arg = profile if not check: if raise_on_missing_cal: raise Error(lang.getstr("profile.no_vcgt")) else: return False else: try: cgats = get_cgats(arg) except (IOError, CGATS.CGATSError), exception: raise Error(lang.getstr("cal_extraction_failed")) if out_cal_path: cgats.write(out_cal_path) return cgats def extract_cal_from_ti3(ti3): """ Extract and return the CAL section of a TI3. ti3 can be a file object or a string holding the data. """ if isinstance(ti3, CGATS.CGATS): ti3 = str(ti3) if isinstance(ti3, basestring): ti3 = StringIO(ti3) cal = False cal_lines = [] for line in ti3: line = line.strip() if line == "CAL": line = "CAL " # Make sure CGATS file identifiers are # always a minimum of 7 characters cal = True if cal: cal_lines.append(line) if line == 'END_DATA': break if isinstance(ti3, file): ti3.close() return "\n".join(cal_lines) def extract_fix_copy_cal(source_filename, target_filename=None): """ Return the CAL section from a profile's embedded measurement data. Try to 'fix it' (add information needed to make the resulting .cal file 'updateable') and optionally copy it to target_filename. """ from worker import get_options_from_profile try: profile = ICCP.ICCProfile(source_filename) except (IOError, ICCP.ICCProfileInvalidError), exception: return exception if "CIED" in profile.tags or "targ" in profile.tags: cal_lines = [] ti3 = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) ti3_lines = [line.strip() for line in ti3] ti3.close() cal_found = False for line in ti3_lines: line = line.strip() if line == "CAL": line = "CAL " # Make sure CGATS file identifiers are #always a minimum of 7 characters cal_found = True if cal_found: cal_lines.append(line) if line == 'DEVICE_CLASS "DISPLAY"': options_dispcal = get_options_from_profile(profile)[0] if options_dispcal: whitepoint = False b = profile.tags.lumi.Y for o in options_dispcal: if o[0] == "y": cal_lines.append('KEYWORD "DEVICE_TYPE"') if o[1] == "c": cal_lines.append('DEVICE_TYPE "CRT"') else: cal_lines.append('DEVICE_TYPE "LCD"') continue if o[0] in ("t", "T"): continue if o[0] == "w": continue if o[0] in ("g", "G"): if o[1:] == "240": trc = "SMPTE240M" elif o[1:] == "709": trc = "REC709" elif o[1:] == "l": trc = "L_STAR" elif o[1:] == "s": trc = "sRGB" else: trc = o[1:] if o[0] == "G": try: trc = 0 - Decimal(trc) except decimal.InvalidOperation, \ exception: continue cal_lines.append('KEYWORD "TARGET_GAMMA"') cal_lines.append('TARGET_GAMMA "%s"' % trc) continue if o[0] == "f": cal_lines.append('KEYWORD ' '"DEGREE_OF_BLACK_OUTPUT_OFFSET"') cal_lines.append( 'DEGREE_OF_BLACK_OUTPUT_OFFSET "%s"' % o[1:]) continue if o[0] == "k": cal_lines.append('KEYWORD ' '"BLACK_POINT_CORRECTION"') cal_lines.append( 'BLACK_POINT_CORRECTION "%s"' % o[1:]) continue if o[0] == "B": cal_lines.append('KEYWORD ' '"TARGET_BLACK_BRIGHTNESS"') cal_lines.append( 'TARGET_BLACK_BRIGHTNESS "%s"' % o[1:]) continue if o[0] == "q": if o[1] == "l": q = "low" elif o[1] == "m": q = "medium" else: q = "high" cal_lines.append('KEYWORD "QUALITY"') cal_lines.append('QUALITY "%s"' % q) continue if not whitepoint: cal_lines.append('KEYWORD "NATIVE_TARGET_WHITE"') cal_lines.append('NATIVE_TARGET_WHITE ""') if cal_lines: if target_filename: try: f = open(target_filename, "w") f.write("\n".join(cal_lines)) f.close() except Exception, exception: return exception return cal_lines else: return None def extract_device_gray_primaries(ti3, gray=True, logfn=None): """ Extract gray or primaries into new TI3 Return extracted ti3, extracted RGB to XYZ mapping and remaining RGB to XYZ """ filename = ti3.filename ti3 = ti3.queryi1("DATA") ti3.filename = filename ti3_extracted = CGATS.CGATS("""CTI3 DEVICE_CLASS "DISPLAY" COLOR_REP "RGB_XYZ" BEGIN_DATA_FORMAT END_DATA_FORMAT BEGIN_DATA END_DATA""")[0] ti3_extracted.DATA_FORMAT.update(ti3.DATA_FORMAT) subset = [(100.0, 100.0, 100.0), (0.0, 0.0, 0.0)] if not gray: subset.extend([(100.0, 0.0, 0.0), (0.0, 100.0, 0.0), (0.0, 0.0, 100.0), (50.0, 50.0, 50.0)]) if logfn: logfn(u"Extracting neutrals and primaries from %s" % ti3.filename) else: if logfn: logfn(u"Extracting neutrals from %s" % ti3.filename) RGB_XYZ_extracted = OrderedDict() RGB_XYZ_remaining = OrderedDict() dupes = {} for i, item in ti3.DATA.iteritems(): if not i: # Check if fields are missing for prefix in ("RGB", "XYZ"): for suffix in prefix: key = "%s_%s" % (prefix, suffix) if not key in item: return Error(lang.getstr("error.testchart.missing_fields", (ti3.filename, key))) RGB = (item["RGB_R"], item["RGB_G"], item["RGB_B"]) XYZ = (item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"]) for RGB_XYZ in (RGB_XYZ_extracted, RGB_XYZ_remaining): if RGB in RGB_XYZ: if RGB != (100.0, 100.0, 100.0): # Add to existing values for averaging later # if it's not white (all other readings are scaled to the # white Y by dispread, so we don't alter it. Note that it's # always the first encountered white that will have Y = 100, # even if subsequent white readings may be higher) XYZ = tuple(RGB_XYZ[RGB][i] + XYZ[i] for i in xrange(3)) if not RGB in dupes: dupes[RGB] = 1.0 dupes[RGB] += 1.0 elif RGB in subset: # We have white already, remove it from the subset so any # additional white readings we encounter are ignored subset.remove(RGB) if ((gray and item["RGB_R"] == item["RGB_G"] == item["RGB_B"] and not RGB in [(100.0, 100.0, 100.0), (0.0, 0.0, 0.0)]) or RGB in subset): ti3_extracted.DATA.add_data(item) RGB_XYZ_extracted[RGB] = XYZ elif not RGB in [(100.0, 100.0, 100.0), (0.0, 0.0, 0.0)]: RGB_XYZ_remaining[RGB] = XYZ for RGB, count in dupes.iteritems(): for RGB_XYZ in (RGB_XYZ_extracted, RGB_XYZ_remaining): if RGB in RGB_XYZ: # Average values XYZ = tuple(RGB_XYZ[RGB][i] / count for i in xrange(3)) RGB_XYZ[RGB] = XYZ return ti3_extracted, RGB_XYZ_extracted, RGB_XYZ_remaining def ti3_to_ti1(ti3_data): """ Create and return TI1 data converted from TI3. ti3_data can be a file object, a list of strings or a string holding the data. """ ti3 = CGATS.CGATS(ti3_data) if not ti3: return "" ti3[0].type = "CTI1" ti3[0].DESCRIPTOR = "Argyll Calibration Target chart information 1" ti3[0].ORIGINATOR = "Argyll targen" if hasattr(ti3[0], "COLOR_REP"): color_rep = ti3[0].COLOR_REP.split('_')[0] else: color_rep = "RGB" ti3[0].add_keyword("COLOR_REP", color_rep) ti3[0].remove_keyword("DEVICE_CLASS") if hasattr(ti3[0], "LUMINANCE_XYZ_CDM2"): ti3[0].remove_keyword("LUMINANCE_XYZ_CDM2") if hasattr(ti3[0], "ARGYLL_COLPROF_ARGS"): del ti3[0].ARGYLL_COLPROF_ARGS return str(ti3[0]) def vcgt_to_cal(profile): """ Return a CAL (CGATS instance) from vcgt """ cgats = CGATS.CGATS(file_identifier="CAL ") context = cgats.add_data({"DESCRIPTOR": "Argyll Device Calibration State"}) context.add_data({"ORIGINATOR": "vcgt"}) context.add_data({"CREATED": strftime("%a %b %d %H:%M:%S %Y", profile.dateTime.timetuple())}) context.add_keyword("DEVICE_CLASS", "DISPLAY") context.add_keyword("COLOR_REP", "RGB") context.add_keyword("RGB_I") key = "DATA_FORMAT" context[key] = CGATS.CGATS() context[key].key = key context[key].parent = context context[key].root = cgats context[key].type = key context[key].add_data(("RGB_I", "RGB_R", "RGB_G", "RGB_B")) key = "DATA" context[key] = CGATS.CGATS() context[key].key = key context[key].parent = context context[key].root = cgats context[key].type = key values = profile.tags.vcgt.getNormalizedValues() for i, triplet in enumerate(values): context[key].add_data(("%.7f" % (i / float(len(values) - 1)), ) + triplet) return cgats def verify_cgats(cgats, required, ignore_unknown=True): """ Verify and return a CGATS instance or None on failure. Verify if a CGATS instance has a section with all required fields. Return the section as CGATS instance on success, None on failure. If ignore_unknown evaluates to True, ignore fields which are not required. Otherwise, the CGATS data must contain only the required fields, no more, no less. """ cgats_1 = cgats.queryi1(required) if cgats_1 and cgats_1.parent and cgats_1.parent.parent: cgats_1 = cgats_1.parent.parent if cgats_1.queryv1("NUMBER_OF_SETS"): if cgats_1.queryv1("DATA_FORMAT"): for field in required: if not field in cgats_1.queryv1("DATA_FORMAT").values(): raise CGATS.CGATSKeyError("Missing required field: %s" % field) if not ignore_unknown: for field in cgats_1.queryv1("DATA_FORMAT").values(): if not field in required: raise CGATS.CGATSError("Unknown field: %s" % field) else: raise CGATS.CGATSInvalidError("Missing DATA_FORMAT") else: raise CGATS.CGATSInvalidError("Missing NUMBER_OF_SETS") modified = cgats_1.modified cgats_1.filename = cgats.filename cgats_1.modified = modified return cgats_1 else: raise CGATS.CGATSKeyError("Missing required fields: %s" % ", ".join(required)) def verify_ti1_rgb_xyz(cgats): """ Verify and return a CGATS instance or None on failure. Verify if a CGATS instance has a TI1 section with all required fields for RGB devices. Return the TI1 section as CGATS instance on success, None on failure. """ return verify_cgats(cgats, ("RGB_R", "RGB_B", "RGB_G", "XYZ_X", "XYZ_Y", "XYZ_Z")) DisplayCAL-3.5.0.0/DisplayCAL/argyll_instruments.json0000644000076500000000000002750512774161562022307 0ustar devwheel00000000000000{ /* instrument names from Argyll source spectro/insttypes.c vid: USB Vendor ID pid: USB Product ID hid: Is the device a USB HID (Human Interface Device) class device? spectral: Does the instrument support spectral readings? adaptive_mode: Does the instrument support adaptive emissive readings? highres_mode: Does the instrument support high-res spectral readings? projector_mode: Does the instrument support a special projector mode? sensor_cal: Does the instrument need to calibrate its sensor by putting it on a reference tile or black surface? A value of false for sensor_cal means the instrument can be left on the display A value of true for sensor_cal means the instrument must be removed from the display for sensor calibration if it cannot be skipped skip_sensor_cal: Can the sensor calibration be skipped? integration_time: Approx. integration time (seconds) for black and white, based on measurements on wide-gamut IPS display with 0.23 cd/m2 black and 130 cd/m2 white level, rounded to multiple of .1 seconds. Instruments which I don't own have been estimated. A value of null for any of the keys means unknown/not tested Instruments can have an id (short string) that is different than the long instrument name. In case no id is given, the instrument name is the same as the id. */ "DTP92": { "usb_ids": [ { "vid": 0x0765, "pid": 0xD092, "hid": false } ], "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null }, "DTP94": { "usb_ids": [ { "vid": 0x0765, "pid": 0xD094, "hid": false } ], "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": false, "skip_sensor_cal": false, // DTP94 instrument access fails // when using -N option to skip automatic sensor calibration // (dispread -D9 output: "Setting no-sensor_calibrate failed // failed with 'Unsupported function'") "integration_time": [4.0, 1.1] // Estimated }, "Spectrolino": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true }, "SpectroScan": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true }, "SpectroScanT": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true }, "Spectrocam": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": null }, "i1 Display": { // Argyll 1.3.5 and earlier "usb_ids": [ { "vid": 0x0670, "pid": 0x0001, "hid": false } ], "id": "i1D1", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": false, "skip_sensor_cal": false, "integration_time": [4.0, 1.0] // Using i1D2 values }, "i1 Display 1": { // Argyll 1.3.6 and newer "usb_ids": [ { "vid": 0x0670, "pid": 0x0001, "hid": false } ], "id": "i1D1", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": false, "integration_time": [4.0, 1.0] // Using i1D2 values }, "i1 Display 2": { // Argyll 1.3.6 and newer "usb_ids": [ { "vid": 0x0971, "pid": 0x2003, "hid": false } ], "id": "i1D2", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": false, "skip_sensor_cal": false, // i1 Display 2 instrument access fails // when using -N option to skip automatic sensor calibration // (dispread -D9 output: "Setting no-sensor_calibrate failed // failed with 'Unsupported function'") "integration_time": [4.0, 1.0] // Measured }, "i1 DisplayPro, ColorMunki Display": { "usb_ids": [ { "vid": 0x0765, "pid": 0x5020, "hid": true } ], "id": "i1D3", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": false, "skip_sensor_cal": false, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [2.6, 0.2] // Measured }, "i1 Monitor": { // like i1Pro "usb_ids": [ { "vid": 0x0971, "pid": 0x2001, "hid": false } ], "spectral": true, "adaptive_mode": true, "highres_mode": true, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true, "integration_time": [9.2, 3.9] // Using i1 Pro values }, "i1 Pro": { "usb_ids": [ { "vid": 0x0971, "pid": 0x2000, "hid": false } ], "spectral": true, "adaptive_mode": true, "highres_mode": true, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true, "integration_time": [9.2, 3.9] // Measured (i1 Pro Rev. A) }, "i1 Pro 2": { "usb_ids": [ { "vid": 0x0971, "pid": 0x2000, "hid": false } ], "spectral": true, "adaptive_mode": true, "highres_mode": true, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true, "integration_time": [9.2, 3.9] // Using i1 Pro values }, "ColorHug": { "usb_ids": [ { "vid": 0x04D8, "pid": 0xF8DA, "hid": true }, { "vid": 0x273F, "pid": 0x1001, "hid": true } ], "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [1.8, 0.8] // Measured (ColorHug #660) }, "ColorHug2": { "usb_ids": [ { "vid": 0x273F, "pid": 0x1004, "hid": true } ], "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [2.0, 0.6] // Measured (ColorHug2 prototype #2) }, "ColorMunki": { "usb_ids": [ { "vid": 0x0971, "pid": 0x2007, "hid": false } ], "spectral": true, "adaptive_mode": true, "highres_mode": true, "projector_mode": true, "sensor_cal": true, "skip_sensor_cal": true, "integration_time": [9.2, 3.9] // Using i1 Pro values }, "Colorimtre HCFR": { "usb_ids": [ { // V3.1 "vid": 0x04DB, "pid": 0x005B, "hid": false }, { // V4.0 "vid": 0x04D8, "pid": 0xFE17, "hid": false } ], "id": "HCFR", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null }, "ColorMunki Smile": { // Argyll 1.5.x and newer "usb_ids": [ { "vid": 0x0765, "pid": 0x6003, "hid": false } ], "id": "Smile", "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": false, "skip_sensor_cal": false, "integration_time": [4.0, 1.0] // Using i1D2 values }, "EX1": { "usb_ids": [ { "vid": 0x2457, "pid": 0x4000, "hid": false } ], "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": true, "skip_sensor_cal": true, "integration_time": [9.2, 3.9] // Using i1 Pro values }, "K-10": { "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [1.1, 0.1] // Using i1D3 values halved }, "Spyder1": { "usb_ids": [ { "vid": 0x085C, "pid": 0x0100, "hid": false } ], "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [10.5, 2.3] // Using Spyder3 values }, "Spyder2": { "usb_ids": [ { "vid": 0x085C, "pid": 0x0200, "hid": false } ], "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [10.5, 2.3] // Using Spyder3 values }, "Spyder3": { "usb_ids": [ { "vid": 0x085C, "pid": 0x0300, "hid": false } ], "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [10.5, 2.3] // Estimated }, "Spyder4": { "usb_ids": [ { "vid": 0x085C, "pid": 0x0400, "hid": false } ], "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [10.5, 2.3] // Using Spyder3 values }, "Spyder5": { "usb_ids": [ { "vid": 0x085C, "pid": 0x0500, "hid": false } ], "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [10.5, 2.3] // Using Spyder3 values }, "Huey": { "usb_ids": [ { "vid": 0x0971, "pid": 0x2005, "hid": true }, { // HueyL "vid": 0x0765, "pid": 0x5001, "hid": true }, { // HueyL "vid": 0x0765, "pid": 0x5010, "hid": true } ], "spectral": false, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [4.0, 1.0] // Using i1D2 values }, "specbos": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "measurement_mode_map": {"c": "r", "l": "n"}, "integration_time": [3.3, 0.8] // Estimated, VERY rough }, "specbos 1201": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [10.3, 2.8] // Estimated, VERY rough }, "spectraval": { "spectral": true, "adaptive_mode": false, "highres_mode": false, "projector_mode": false, "sensor_cal": null, "skip_sensor_cal": null, "integration_time": [3.3, 0.8] // Estimated, VERY rough }, "Dummy Meter / Hires & Projector": { // dummy instrument, just for testing "spectral": false, "adaptive_mode": false, "highres_mode": true, "projector_mode": true, "sensor_cal": false, "skip_sensor_cal": false }, "Dummy Spectro / Hires & Projector": { // dummy instrument, just for testing "spectral": true, "adaptive_mode": false, "highres_mode": true, "projector_mode": true, "sensor_cal": true, "skip_sensor_cal": true }, "Dummy Meter / Adaptive, Hires & Projector": { // dummy instrument, just for testing "spectral": false, "adaptive_mode": true, "highres_mode": true, "projector_mode": true, "sensor_cal": false, "skip_sensor_cal": false }, "Dummy Spectro / Adaptive, Hires & Projector": { // dummy instrument, just for testing "spectral": true, "adaptive_mode": true, "highres_mode": true, "projector_mode": true, "sensor_cal": true, "skip_sensor_cal": true } }DisplayCAL-3.5.0.0/DisplayCAL/argyll_instruments.py0000644000076500000000000000137313004407520021741 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from itertools import izip import re from jsondict import JSONDict from util_str import strtr instruments = JSONDict("argyll_instruments.json") vendors = [ "ColorVision", "Datacolor", "GretagMacbeth", "Hughski", "Image Engineering", "JETI", "Klein", "X-Rite", "Xrite" ] def get_canonical_instrument_name(instrument_name, replacements=None, inverse=False): replacements = replacements or {} if inverse: replacements = dict(izip(replacements.itervalues(), replacements.iterkeys())) return strtr(remove_vendor_names(instrument_name), replacements) def remove_vendor_names(txt): for vendor in vendors: txt = re.sub(re.compile(re.escape(vendor) + r"\s*", re.I), "", txt) txt = txt.strip() return txt DisplayCAL-3.5.0.0/DisplayCAL/argyll_names.py0000644000076500000000000000373113074665645020476 0ustar devwheel00000000000000# -*- coding: utf-8 -*- # Argyll CMS tools used by DisplayCAL names = [ "applycal", "average", "cctiff", "ccxxmake", "dispcal", "dispread", "collink", "colprof", "dispwin", "fakeread", "iccgamut", "icclu", "xicclu", "spotread", "spyd2en", "spyd4en", "targen", "tiffgamut", "timage", "txt2ti3", "i1d3ccss", "viewgam", "oeminst", "profcheck", "spec2cie" ] # Argyll CMS tools optionally used by DisplayCAL optional = ["applycal", "average", "cctiff", "ccxxmake", "i1d3ccss", "oeminst", "spec2cie", "spyd2en", "spyd4en", "tiffgamut", "timage"] prefixes_suffixes = ["argyll"] # Alternative tool names (from older Argyll CMS versions or with filename # prefix/suffix like on some Linux distros) altnames = {"txt2ti3": ["logo2cgats"], "icclu": ["xicclu"], "ccxxmake": ["ccmxmake"], "i1d3ccss": ["oeminst"], "spyd2en": ["oeminst"], "spyd4en": ["oeminst"]} def add_prefixes_suffixes(name, altname): for prefix_suffix in prefixes_suffixes: altnames[name].append("%s-%s" % (altname, prefix_suffix)) altnames[name].append("%s-%s" % (prefix_suffix, altname)) # Automatically populate the alternative tool names with prefixed/suffixed # versions for name in names: if not name in altnames: altnames[name] = [] _altnames = list(altnames[name]) for altname in _altnames: add_prefixes_suffixes(name, altname) altnames[name].append(name) add_prefixes_suffixes(name, name) altnames[name].reverse() # Viewing conditions supported by colprof (only predefined choices) viewconds = [ "pp", "pe", "pc", # Argyll 1.1.1 "mt", "mb", "md", "jm", "jd", "tv", # Argyll 1.6 "pcd", "ob", "cx" ] # Intents supported by colprof # pa = Argyll >= 1.3.3 # lp = Argyll >= 1.8.3 intents = ["a", "aa", "aw", "la", "lp", "ms", "p", "pa", "r", "s"] # Video input/output encodings supported by collink (Argyll >= 1.6) video_encodings = ["n", "t", "6", "7", "5", "2", "C", "x", "X"] # Observers observers = ["1931_2", "1955_2", "1964_10", "1964_10c", "1978_2", "shaw"] DisplayCAL-3.5.0.0/DisplayCAL/argyll_RGB2XYZ.py0000644000076500000000000001037712665102055020470 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import math import colormath # from xcolorants.c icx_ink_table = { "C": [ [ 0.12, 0.18, 0.48 ], [ 0.12, 0.18, 0.48 ] ], "M": [ [ 0.38, 0.19, 0.20 ], [ 0.38, 0.19, 0.20 ] ], "Y": [ [ 0.76, 0.81, 0.11 ], [ 0.76, 0.81, 0.11 ] ], "K": [ [ 0.01, 0.01, 0.01 ], [ 0.04, 0.04, 0.04 ] ], "O": [ [ 0.59, 0.41, 0.03 ], [ 0.59, 0.41, 0.05 ] ], "R": [ [ 0.412414, 0.212642, 0.019325 ], [ 0.40, 0.21, 0.05 ] ], "G": [ [ 0.357618, 0.715136, 0.119207 ], [ 0.11, 0.27, 0.21 ] ], "B": [ [ 0.180511, 0.072193, 0.950770 ], [ 0.11, 0.27, 0.47 ] ], "W": [ [ 0.950543, 1.0, 1.089303 ], # D65 ? colormath.get_standard_illuminant("D50") ], # D50 "LC": [ [ 0.76, 0.89, 1.08 ], [ 0.76, 0.89, 1.08 ] ], "LM": [ [ 0.83, 0.74, 1.02 ], [ 0.83, 0.74, 1.02 ] ], "LY": [ [ 0.88, 0.97, 0.72 ], [ 0.88, 0.97, 0.72 ] ], "LK": [ [ 0.56, 0.60, 0.65 ], [ 0.56, 0.60, 0.65 ] ], "MC": [ [ 0.61, 0.81, 1.07 ], [ 0.61, 0.81, 1.07 ] ], "MM": [ [ 0.74, 0.53, 0.97 ], [ 0.74, 0.53, 0.97 ] ], "MY": [ [ 0.82, 0.93, 0.40 ], [ 0.82, 0.93, 0.40 ] ], "MK": [ [ 0.27, 0.29, 0.31 ], [ 0.27, 0.29, 0.31 ] ], "LLK": [ [ 0.76, 0.72, 0.65 ], # Very rough - should substiture real numbers [ 0.76, 0.72, 0.65 ] ], "": [ [ 0.0, 0.0, 0.0 ], [ 0.0, 0.0, 0.0 ] ] } s = { "Ynorm": 0.0, "iix": { 0: "R", 1: "G", 2: "B" } } s["Ynorm"] = 0.0 for e in xrange(3): s["Ynorm"] += icx_ink_table[s["iix"][e]][0][1] s["Ynorm"] = 1.0 / s["Ynorm"] def XYZ_denormalize_remove_glare(X, Y, Z): XYZ = [X, Y, Z] # De-Normalise Y from 1.0, & remove black glare for j in xrange(3): XYZ[j] = (XYZ[j] - icx_ink_table["K"][0][j]) / (1.0 - icx_ink_table["K"][0][j]) XYZ[j] /= s["Ynorm"] return tuple(XYZ) def XYZ_normalize_add_glare(X, Y, Z): XYZ = [X, Y, Z] # Normalise Y to 1.0, & add black glare for j in xrange(3): XYZ[j] *= s["Ynorm"] XYZ[j] = XYZ[j] * (1.0 - icx_ink_table["K"][0][j]) + \ icx_ink_table["K"][0][j] return tuple(XYZ) def RGB2XYZ(R, G, B): # from xcolorants.c -> icxColorantLu_to_XYZ d = (R, G, B) # We assume a simple additive model with gamma XYZ = [0.0, 0.0, 0.0] for e in xrange(3): v = d[e] if (v < 0.0): v = 0.0 elif (v > 1.0): v = 1.0 if (v <= 0.03928): v /= 12.92 else: v = math.pow((0.055 + v) / 1.055, 2.4) # Gamma for j in xrange(3): XYZ[j] += v * icx_ink_table[s["iix"][e]][0][j] return XYZ_normalize_add_glare(*XYZ) def XYZ2RGB(X, Y, Z): return colormath.XYZ2RGB(*XYZ_denormalize_remove_glare(X, Y, Z)) if __name__ == '__main__': for RGB, XYZ in iter(( ((1.0, 1.0, 1.0), (0.951065, 1.000000, 1.088440)), ((0.0, 0.0, 0.0), (0.010000, 0.010000, 0.010000)), ((0.5, 0.0, 0.0), (0.097393, 0.055060, 0.014095)), ((1.0, 0.0, 0.0), (0.418302, 0.220522, 0.029132)), ((0.0, 0.5, 0.0), (0.085782, 0.161542, 0.035261)), ((0.5, 0.5, 0.0), (0.173175, 0.206603, 0.039356)), ((1.0, 0.5, 0.0), (0.494083, 0.372064, 0.054393)), ((0.0, 1.0, 0.0), (0.364052, 0.718005, 0.128018)), ((0.5, 1.0, 0.0), (0.451445, 0.763065, 0.132113)), ((1.0, 1.0, 0.0), (0.772354, 0.928527, 0.147151)), ((0.0, 0.0, 0.5), (0.048252, 0.025298, 0.211475)), ((0.5, 0.0, 0.5), (0.135645, 0.070358, 0.215570)), ((1.0, 0.0, 0.5), (0.456553, 0.235820, 0.230607)), ((0.0, 0.5, 0.5), (0.124033, 0.176840, 0.236735)), ((0.5, 0.5, 0.5), (0.211427, 0.221901, 0.240831)), ((1.0, 0.5, 0.5), (0.532335, 0.387362, 0.255868)), ((0.0, 1.0, 0.5), (0.402304, 0.733303, 0.329493)), ((0.5, 1.0, 0.5), (0.489697, 0.778364, 0.333588)), ((1.0, 1.0, 0.5), (0.810605, 0.943825, 0.348625)), ((0.0, 0.0, 1.0), (0.188711, 0.081473, 0.951290)), ((0.5, 0.0, 1.0), (0.276104, 0.126533, 0.955385)), ((1.0, 0.0, 1.0), (0.597013, 0.291995, 0.970422)), ((0.0, 0.5, 1.0), (0.264493, 0.233015, 0.976550)), ((0.5, 0.5, 1.0), (0.351886, 0.278076, 0.980645)), ((1.0, 0.5, 1.0), (0.672794, 0.443537, 0.995683)), ((0.0, 1.0, 1.0), (0.542763, 0.789478, 1.069308)), ((0.5, 1.0, 1.0), (0.630157, 0.834539, 1.073403)))): XYZ1 = tuple(str(round(c, 6)) for c in RGB2XYZ(*RGB)) XYZ2 = tuple(str(c) for c in XYZ) try: assert(XYZ1 == XYZ2) except AssertionError: raise AssertionError('RGB2XYZ%r == (%s) != (%s)' % (RGB, ', '.join(XYZ1), ', '.join(XYZ2))) DisplayCAL-3.5.0.0/DisplayCAL/audio.py0000644000076500000000000002577513004407520017111 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Audio wrapper module Can use pygame, pyglet, pyo or wx. pyglet or pygame will be used by default if available. pyglet can only be used if version >= 1.2.2 is available. pyo is still buggy under Linux and has a few quirks under Windows. pyglet seems like the best bet in the long run as pygame development is stagnant since 2009. wx doesn't support fading, changing volume, multiple concurrent sounds, and only supports wav format. Example: sound = Sound("test.wav", loop=True) sound.Play(fade_ms=1000) """ import sys import threading import time from log import safe_print _ch = {} _initialized = False _lib = None _lib_version = None _server = None _snd = {} _sounds = {} def init(lib=None, samplerate=44100, channels=2, buffersize=2048, reinit=False): """ (Re-)Initialize sound subsystem """ # Note on buffer size: Too high values cause crackling during fade, too low # values cause choppy playback of ogg files when using pyo (good value for # pyo is >= 2048) global _initialized, _lib, _lib_version, _server, pygame, pyglet, pyo, wx if _initialized and not reinit: # To re-initialize, explicitly set reinit to True return # Select the audio library we're going to use. # User choice or pyglet > pygame > pyo > wx if not lib: if sys.platform in ("darwin", "win32"): # Mac OS X, Windows libs = ("pyglet", "pygame", "pyo", "wx") else: # Linux libs = ("pygame", "pyglet", "pyo", "wx") for lib in libs: try: return init(lib, samplerate, channels, buffersize, reinit) except Exception, exception: pass raise exception elif lib == "pygame": try: import pygame, pygame.mixer version = [] for item in pygame.__version__.split("."): try: version.append(int(item)) except ValueError: version.append(item) if version < [1, 9, 2]: raise ImportError("pygame version %s is too old" % pygame.__version__) _lib = "pygame" except ImportError: _lib = None else: if _initialized: pygame.mixer.quit() pygame.mixer.init(frequency=samplerate, channels=channels, buffer=buffersize) _server = pygame.mixer _lib_version = pygame.__version__ elif lib == "pyglet": try: import pyglet version = [] for item in pyglet.version.split("."): try: version.append(int(item)) except ValueError: version.append(item) if version < [1, 2, 2]: raise ImportError("pyglet version %s is too old" % pyglet.version) _lib = "pyglet" except ImportError: _lib = None else: # Work around localization preventing fallback to RIFFSourceLoader pyglet.lib.LibraryLoader.darwin_not_found_error = "" pyglet.lib.LibraryLoader.linux_not_found_error = "" # Set audio driver preference pyglet.options["audio"] = ("pulse", "openal", "directsound", "silent") _server = pyglet.media _lib_version = pyglet.version elif lib == "pyo": try: import pyo _lib = "pyo" except ImportError: _lib = None else: if isinstance(_server, pyo.Server): _server.reinit(sr=samplerate, nchnls=channels, buffersize=buffersize, duplex=0) else: _server = pyo.Server(sr=samplerate, nchnls=channels, buffersize=buffersize, duplex=0).boot() _server.start() _lib_version = ".".join(str(v) for v in pyo.getVersion()) elif lib == "wx": try: import wx _lib = "wx" except ImportError: _lib = None else: _server = wx _lib_version = wx.__version__ if not _lib: raise RuntimeError("No audio library available") _initialized = True return _server def safe_init(lib=None, samplerate=22050, channels=2, buffersize=2048, reinit=False): """ Like init(), but catch any exceptions """ global _initialized try: return init(lib, samplerate, channels, buffersize, reinit) except Exception, exception: # So we can check if initialization failed _initialized = exception return exception def Sound(filename, loop=False, raise_exceptions=False): """ Sound caching mechanism """ if (filename, loop) in _sounds: # Cache hit return _sounds[(filename, loop)] else: try: sound = _Sound(filename, loop) except Exception, exception: if raise_exceptions: raise safe_print(exception) sound = _Sound(None, loop) _sounds[(filename, loop)] = sound return sound class DummySound(object): """ Dummy sound wrapper class """ def __init__(self, filename=None, loop=False): pass def fade(self, fade_ms, fade_in=None): return True @property def is_playing(self): return False def play(self, fade_ms=0): return True @property def play_count(self): return 0 def safe_fade(self, fade_ms, fade_in=None): return True def safe_play(self, fade_ms=0): return True def safe_stop(self, fade_ms=0): return True def stop(self, fade_ms=0): return True volume = 0 class _Sound(object): """ Sound wrapper class """ def __init__(self, filename, loop=False): self._filename = filename self._is_playing = False self._lib = _lib self._loop = loop self._play_timestamp = 0 self._play_count = 0 self._thread = -1 if not _initialized: init() if _initialized and not isinstance(_initialized, Exception): if not self._lib and _lib: self._lib = _lib if not self._snd and self._filename: if self._lib == "pyo": self._snd = pyo.SfPlayer(self._filename, loop=self._loop) elif self._lib == "pyglet": snd = pyglet.media.load(self._filename, streaming=False) self._ch = pyglet.media.Player() self._snd = snd elif self._lib == "pygame": self._snd = pygame.mixer.Sound(self._filename) elif self._lib == "wx": self._snd = wx.Sound(self._filename) def _get_ch(self): return _ch.get((self._filename, self._loop)) def _set_ch(self, ch): _ch[(self._filename, self._loop)] = ch _ch = property(_get_ch, _set_ch) def _fade(self, fade_ms, fade_in, thread): volume = self.volume if fade_ms and ((fade_in and volume < 1) or (not fade_in and volume)): count = 200 for i in xrange(count + 1): if fade_in: self.volume = volume + i / float(count) * (1.0 - volume) else: self.volume = volume - i / float(count) * volume time.sleep(fade_ms / 1000.0 / count) if self._thread is not thread: # If we are no longer the current thread, return immediately return if not self.volume: self.stop() def _get_volume(self): volume = 1.0 if self._snd: if self._lib == "pyo": volume = self._snd.mul elif self._lib == "pyglet": volume = self._ch.volume elif self._lib == "pygame": volume = self._snd.get_volume() return volume def _set_volume(self, volume): if self._snd and self._lib != "wx": if self._lib == "pyo": self._snd.mul = volume elif self._lib == "pyglet": self._ch.volume = volume elif self._lib == "pygame": self._snd.set_volume(volume) return True return False def _get_snd(self): return _snd.get((self._filename, self._loop)) def _set_snd(self, snd): _snd[(self._filename, self._loop)] = snd _snd = property(_get_snd, _set_snd) def fade(self, fade_ms, fade_in=None): """ Fade in/out. If fade_in is None, fade in/out depending on current volume. """ if fade_in is None: fade_in = not self.volume if fade_in and not self.is_playing: return self.play(fade_ms=fade_ms) elif self._snd and self._lib != "wx": self._thread += 1 threading.Thread(target=self._fade, args=(fade_ms, fade_in, self._thread)).start() return True return False @property def is_playing(self): if self._lib == "pyo": return bool(self._snd and self._snd.isOutputting()) elif self._lib == "pyglet": return bool(self._ch and self._ch.playing and self._ch.source and (self._loop or time.time() - self._play_timestamp < self._ch.source.duration)) elif self._lib == "pygame": return bool(self._ch and self._ch.get_busy()) return self._is_playing def play(self, fade_ms=0): if self._snd: volume = self.volume self.stop() if self._lib == "pyglet": # Can't reuse the player, won't replay the sound under Mac OS X # and Linux even when seeking to start position which allows # replaying the sound under Windows. self._ch.delete() self._ch = pyglet.media.Player() self.volume = volume if not self.is_playing and fade_ms and volume == 1: self.volume = 0 self._play_timestamp = time.time() if self._lib == "pyo": self._snd.out() elif self._lib == "pyglet": if self._loop: snd = pyglet.media.SourceGroup(self._snd.audio_format, self._snd.video_format) snd.loop = True snd.queue(self._snd) else: snd = self._snd self._ch.queue(snd) self._ch.play() elif self._lib == "pygame": self._ch = self._snd.play(-1 if self._loop else 0, fade_ms=0) elif self._lib == "wx" and self._snd.IsOk(): flags = wx.SOUND_ASYNC if self._loop: flags |= wx.SOUND_LOOP # The best we can do is have the correct state reflected # for looping sounds only self._is_playing = True # wx.Sound.Play is supposed to return True on success. # When I tested this, it always returned False, but still # played the sound. self._snd.Play(flags) if self._lib: self._play_count += 1 if fade_ms and self._lib != "wx": self.fade(fade_ms, True) return True return False @property def play_count(self): return self._play_count def safe_fade(self, fade_ms, fade_in=None): """ Like fade(), but catch any exceptions """ if not _initialized: safe_init() try: return self.fade(fade_ms, fade_in) except Exception, exception: return exception def safe_play(self, fade_ms=0): """ Like play(), but catch any exceptions """ if not _initialized: safe_init() try: return self.play(fade_ms) except Exception, exception: return exception def safe_stop(self, fade_ms=0): """ Like stop(), but catch any exceptions """ try: return self.stop(fade_ms) except Exception, exception: return exception def stop(self, fade_ms=0): if self._snd and self.is_playing: if self._lib == "wx": self._snd.Stop() self._is_playing = False elif fade_ms: self.fade(fade_ms, False) else: if self._lib == "pyglet": self._ch.pause() else: self._snd.stop() if self._lib == "pygame": self._ch = None return True else: return False volume = property(_get_volume, _set_volume) if __name__ == "__main__": import wx from config import get_data_path sound = Sound(get_data_path("theme/engine_hum_loop.wav"), True) app = wx.App(0) frame = wx.Frame(None, -1, "Test") frame.Bind(wx.EVT_CLOSE, lambda event: (sound.stop(1000) and _lib != "wx" and time.sleep(1), event.Skip())) panel = wx.Panel(frame) panel.Sizer = wx.BoxSizer() button = wx.Button(panel, -1, "Play") button.Bind(wx.EVT_BUTTON, lambda event: not sound.is_playing and sound.play(3000)) panel.Sizer.Add(button, 1) button = wx.Button(panel, -1, "Stop") button.Bind(wx.EVT_BUTTON, lambda event: sound.is_playing and sound.stop(3000)) panel.Sizer.Add(button, 1) panel.Sizer.SetSizeHints(frame) frame.Show() app.MainLoop() DisplayCAL-3.5.0.0/DisplayCAL/beep.wav0000644000076500000000000005147412665102055017072 0ustar devwheel00000000000000RIFF4SWAVEfmt DdataS64$%+*^^mnTTllMLuxAB CCZYuu ) * =< xw<>^\  KI./  YWgfLL 8 7 (($% fg** Z Z \]a_45wu y y bcxw  |{LM}{xyi h   nm ACCBH I  32FI_^  & (  hfPS  EEED /-ut77vw]\gg II24 ,+NO""10 dd53km!"""$$t u ~~hf77N O 55QQ xw) ' gfhiAAPP  WW  - + hg \ [ DC    11 aajja `  DDed)*225 6 53 ~  FF  )) YWE F FG iis s --67ggwwQSJI srzz fgmlVX\ [ bb 87. - NO   >=! ! __ )(I K POEE ML%% u u ~~00t t  USC C  yztw   42$$uu;<  mk\^ \]NN= < DC~~a ` ,-ONrr 99&'OQVV   KL@>ab32<< zz==\]  JL/-  WYfgMM 7 7 &&%' ef+, X X ]]a`56uu y z abww  }~KK}{xyi h   on CBCBG I  11IJ^`   % '  ghRS  EDCC -.us77wu[]hg  JJ13 ,,OM!$// bc55mm!!#!%'t v ~gg89O N 65PPyx( ) hhhi@AON  YX  , + ig ] ] CC     22abkka _  ! BCed+,125 5 33 }  FF  )+ XWD E IH jls q -,79fgwwRTJH sr|| ffmnXX[ Z bc 89. . OP   ;= _` ()J K PMFGKL%% t t ~}10r u  TUD D  yytu   44$$ut::  km][ \ZNP= < DEb b --ONqp <9&%PQWW   JL@@bc21<; yx=?\]   KK./  VXegNM 9 7 &(%& fg,+ X Y ^\_`54tw y y baxw  }}JJ~}xyi g   mn !BBBBH H  12HH^_  ' '  fgRQ  EFCD .-uu79xvZ[hh  JI42 +-OO"!01 dd44ln"" "'$t t ~hg89N O 66POzx( ( ghih?@PP  YX + , gg [ \ DB     22abkja `  BCdf,*125 4 43 ~~  GG  *( ZYE E IG kjr s ,,88ffvwSQJJ ss{| hgllWX\ \ `` 79- . QO  =>!  __ ))K L NMEG MJ&& t u }}10s t  UT  ! ts][UT65  89onQQ||32morsGFMN55##,,_^onTUlmMNvxBB EDXYuu + ) =; yx=>\\!  JK/.  YWefNL 7 7 ('$% he*+ Y Y ^]`_56vt y y bawy  ~}KL{{yyi i  on!BACBH H  22IH_^  ' '  hhOP  EDDE ..tv88vv\]hg  II22 ,+PO!"/0 ee44mm !"!&&u t ~}ih99N N 54QQ yx' ) hghhA>PO  WY - - ff ] [ BC     12 ackj^ _   CDed,)037 5 34 |}  FE  )) WZF D IH iks r ,-76ghwvQQJJ ts{{ gflmVV\ Z ac 88- / QP   ==" ! _` *+J K NOFEKK&$ t t |}11s s  USC D  zzuv   22#$vu;;  ml[[ [\PN< < DD` b ,,MOqq ::'(PNVW   KL@>bd11<< xz>=]\  JJ./  XWfgML 7 7 ('#% fg+, X X ^^__76ts x y abxx  }|KL||yyi i  ooACCBH H  43HI_^  & '  ggQQ  FCDB ..ut98ww\Zgh KI23 -,NN"#0/ dd55mn !""&'s t }fh8:N P 46QP xx( ( gghg>@OO  VX  * + gf \ \ CB    13bakj_ `   CCde+)225 6 43 |  FF  ** ZYE E HH kjq s -,78ggxxQRKJ ss{z ghmkWW[ [ cb :8/ / QP  =>! ~`a *+K L ONFE MK%% u v |}10t t  TTC D  zzvw   34%"tv;:  lk[^ \\NN; < DDb a ,-NMqq ::''NQXX   LK?@bb21;: zy>>^^ II-/  YWdgNM 8 6 ()%# ee*+ Y W \^``66ut y y abxx  ~}JK}|wzj g   lo CBBBH H  34HH^^   ( (  hgPR  EECF /.vv78wx[[hg  II33 +,NO$#//  dd53kn !!&&s r ~gg78N O 56PPxy( ) ghhh>@ON  WW - * gg \ \ BC    31!a`jka a  BBee*)128 6 23 |~  GG  +( YYC E HH kir s .-87gfxvRQIJ tq{| hfkmVW] \ `b 99. / QO   ==! ! `_ ))L L NNFE KL%$ u s }|21t t  TU  " ut[[TS57 87noQQ}|41mntsHHOMDisplayCAL-3.5.0.0/DisplayCAL/cacert.pem0000644000076500000000000102136013242301247017370 0ustar devwheel00000000000000 # Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA # Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA # Label: "GlobalSign Root CA" # Serial: 4835703278459707669005204 # MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a # SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c # SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- # Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 # Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 # Label: "GlobalSign Root CA - R2" # Serial: 4835703278459682885658125 # MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 # SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe # SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG 3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO 291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- # Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only # Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only # Label: "Verisign Class 3 Public Primary Certification Authority - G3" # Serial: 206684696279472310254277870180966723415 # MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 # SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 # SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te 2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- # Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Label: "Entrust.net Premium 2048 Secure Server CA" # Serial: 946069240 # MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 # SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 # SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH 4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er fF6adulZkMV8gzURZVE= -----END CERTIFICATE----- # Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust # Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust # Label: "Baltimore CyberTrust Root" # Serial: 33554617 # MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 # SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 # SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- # Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network # Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network # Label: "AddTrust External Root" # Serial: 1 # MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f # SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 # SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- # Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. # Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. # Label: "Entrust Root Certification Authority" # Serial: 1164660820 # MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 # SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 # SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi 94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP 9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m 0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- # Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. # Subject: CN=GeoTrust Global CA O=GeoTrust Inc. # Label: "GeoTrust Global CA" # Serial: 144470 # MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 # SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 # SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU 1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV 5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== -----END CERTIFICATE----- # Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. # Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. # Label: "GeoTrust Universal CA" # Serial: 1 # MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 # SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 # SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB /wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG 9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- # Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. # Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. # Label: "GeoTrust Universal CA 2" # Serial: 1 # MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 # SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 # SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m 1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH 6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- # Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association # Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association # Label: "Visa eCommerce Root" # Serial: 25952180776285836048024890241505565794 # MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 # SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 # SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h 2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq 299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd 7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw ++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- # Issuer: CN=AAA Certificate Services O=Comodo CA Limited # Subject: CN=AAA Certificate Services O=Comodo CA Limited # Label: "Comodo AAA Services root" # Serial: 1 # MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 # SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 # SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe 3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- # Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority # Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority # Label: "QuoVadis Root CA" # Serial: 985026699 # MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 # SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 # SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK SnQ2+Q== -----END CERTIFICATE----- # Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited # Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited # Label: "QuoVadis Root CA 2" # Serial: 1289 # MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b # SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 # SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp +ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og /zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y 4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza 8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- # Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited # Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited # Label: "QuoVadis Root CA 3" # Serial: 1478 # MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf # SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 # SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB 4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd 8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A 4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd +LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B 4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK 4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- # Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 # Subject: O=SECOM Trust.net OU=Security Communication RootCA1 # Label: "Security Communication Root CA" # Serial: 0 # MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a # SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 # SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== -----END CERTIFICATE----- # Issuer: CN=Sonera Class2 CA O=Sonera # Subject: CN=Sonera Class2 CA O=Sonera # Label: "Sonera Class 2 Root CA" # Serial: 29 # MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb # SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 # SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt 5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s 3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu 8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ 3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M -----END CERTIFICATE----- # Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Label: "XRamp Global CA Root" # Serial: 107108908803651509692980124233745014957 # MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 # SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 # SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ O+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- # Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority # Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority # Label: "Go Daddy Class 2 CA" # Serial: 0 # MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 # SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 # SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h /t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf ReYNnyicsbkqWletNw+vHX/bvZ8= -----END CERTIFICATE----- # Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority # Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority # Label: "Starfield Class 2 CA" # Serial: 0 # MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 # SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a # SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf 8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN +lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA 1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- # Issuer: O=Government Root Certification Authority # Subject: O=Government Root Certification Authority # Label: "Taiwan GRCA" # Serial: 42023070807708724159991140556527066870 # MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e # SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 # SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl pYYsfPQS -----END CERTIFICATE----- # Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert Assured ID Root CA" # Serial: 17154717934120587862167794914071425081 # MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 # SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 # SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- # Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert Global Root CA" # Serial: 10944719598952040374951832963794454346 # MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e # SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 # SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- # Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert High Assurance EV Root CA" # Serial: 3553400076410547919724730734378100087 # MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a # SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 # SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- # Issuer: CN=Class 2 Primary CA O=Certplus # Subject: CN=Class 2 Primary CA O=Certplus # Label: "Certplus Class 2 Primary CA" # Serial: 177770208045934040241468760488327595043 # MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b # SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb # SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- # Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. # Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. # Label: "DST Root CA X3" # Serial: 91299735575339953335919266965803778155 # MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 # SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 # SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw 7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- # Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG # Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG # Label: "SwissSign Gold CA - G2" # Serial: 13492815561806991280 # MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 # SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 # SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c 6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn 8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a 77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- # Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG # Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG # Label: "SwissSign Silver CA - G2" # Serial: 5700383053117599563 # MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 # SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb # SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH 6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ 2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- # Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. # Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. # Label: "GeoTrust Primary Certification Authority" # Serial: 32798226551256963324313806436981982369 # MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf # SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 # SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl 4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- # Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only # Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only # Label: "thawte Primary Root CA" # Serial: 69529181992039203566298953787712940909 # MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 # SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 # SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 jVaMaA== -----END CERTIFICATE----- # Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only # Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only # Label: "VeriSign Class 3 Public Primary Certification Authority - G5" # Serial: 33037644167568058970164719475676101450 # MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c # SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 # SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- # Issuer: CN=SecureTrust CA O=SecureTrust Corporation # Subject: CN=SecureTrust CA O=SecureTrust Corporation # Label: "SecureTrust CA" # Serial: 17199774589125277788362757014266862032 # MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 # SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 # SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO 0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj 7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS 8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ 3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- # Issuer: CN=Secure Global CA O=SecureTrust Corporation # Subject: CN=Secure Global CA O=SecureTrust Corporation # Label: "Secure Global CA" # Serial: 9751836167731051554232119481456978597 # MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de # SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b # SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa /FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- # Issuer: CN=COMODO Certification Authority O=COMODO CA Limited # Subject: CN=COMODO Certification Authority O=COMODO CA Limited # Label: "COMODO Certification Authority" # Serial: 104350513648249232941998508985834464573 # MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 # SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b # SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI 2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp +2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW /zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB ZQ== -----END CERTIFICATE----- # Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. # Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. # Label: "Network Solutions Certificate Authority" # Serial: 116697915152937497490437556386812487904 # MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e # SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce # SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH /nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- # Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited # Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited # Label: "COMODO ECC Certification Authority" # Serial: 41578283867086692638256921589707938090 # MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 # SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 # SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- # Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed # Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed # Label: "OISTE WISeKey Global Root GA CA" # Serial: 86718877871133159090080555911823548314 # MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 # SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 # SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg 4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ /L7fCg0= -----END CERTIFICATE----- # Issuer: CN=Certigna O=Dhimyotis # Subject: CN=Certigna O=Dhimyotis # Label: "Certigna" # Serial: 18364802974209362175 # MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff # SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 # SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q 130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG 9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- # Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center # Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center # Label: "Deutsche Telekom Root CA 2" # Serial: 38 # MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 # SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf # SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl 6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- # Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc # Subject: CN=Cybertrust Global Root O=Cybertrust, Inc # Label: "Cybertrust Global Root" # Serial: 4835703278459682877484360 # MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 # SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 # SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- # Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority # Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority # Label: "ePKI Root Certification Authority" # Serial: 28956088682735189655030529057352760477 # MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 # SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 # SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS /jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D hNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- # Issuer: O=certSIGN OU=certSIGN ROOT CA # Subject: O=certSIGN OU=certSIGN ROOT CA # Label: "certSIGN ROOT CA" # Serial: 35210227249154 # MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 # SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b # SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do 0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ 44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN 9u6wWk5JRFRYX0KD -----END CERTIFICATE----- # Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only # Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only # Label: "GeoTrust Primary Certification Authority - G3" # Serial: 28809105769928564313984085209975885599 # MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 # SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd # SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz +uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn 5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G spki4cErx5z481+oghLrGREt -----END CERTIFICATE----- # Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only # Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only # Label: "thawte Primary Root CA - G2" # Serial: 71758320672825410020661621085256472406 # MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f # SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 # SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- # Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only # Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only # Label: "thawte Primary Root CA - G3" # Serial: 127614157056681299805556476275995414779 # MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 # SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 # SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA 2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu MdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- # Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only # Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only # Label: "GeoTrust Primary Certification Authority - G2" # Serial: 80682863203381065782177908751794619243 # MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a # SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 # SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz rD6ogRLQy7rQkgu2npaqBA+K -----END CERTIFICATE----- # Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only # Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only # Label: "VeriSign Universal Root Certification Authority" # Serial: 85209574734084581917763752644031726877 # MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 # SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 # SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF 9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN /BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz 4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 7M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- # Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only # Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only # Label: "VeriSign Class 3 Public Primary Certification Authority - G4" # Serial: 63143484348153506665311985501458640051 # MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 # SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a # SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC 4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- # Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) # Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) # Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" # Serial: 80544274841616 # MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 # SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 # SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C +C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- # Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden # Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden # Label: "Staat der Nederlanden Root CA - G2" # Serial: 10000012 # MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a # SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 # SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp 5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy 5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv 6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen 5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL +63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== -----END CERTIFICATE----- # Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post # Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post # Label: "Hongkong Post Root CA 1" # Serial: 1000 # MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca # SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 # SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi AmvZWg== -----END CERTIFICATE----- # Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. # Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. # Label: "SecureSign RootCA11" # Serial: 1 # MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 # SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 # SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni 8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN QSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- # Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. # Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. # Label: "Microsec e-Szigno Root CA 2009" # Serial: 14014712776195784473 # MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 # SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e # SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 +rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c 2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW -----END CERTIFICATE----- # Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 # Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 # Label: "GlobalSign Root CA - R3" # Serial: 4835703278459759426209954 # MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 # SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad # SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK 6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH WD9f -----END CERTIFICATE----- # Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 # Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 # Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" # Serial: 6047274297262753887 # MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 # SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa # SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF 6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF 661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS 3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF 3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- # Issuer: CN=Izenpe.com O=IZENPE S.A. # Subject: CN=Izenpe.com O=IZENPE S.A. # Label: "Izenpe.com" # Serial: 917563065490389241595536686991402621 # MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 # SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 # SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- # Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. # Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. # Label: "Chambers of Commerce Root - 2008" # Serial: 11806822484801597146 # MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 # SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c # SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR 5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s +12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 +HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF 5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ d0jQ -----END CERTIFICATE----- # Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. # Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. # Label: "Global Chambersign Root - 2008" # Serial: 14541511773111788494 # MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 # SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c # SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r 6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- # Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. # Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. # Label: "Go Daddy Root Certificate Authority - G2" # Serial: 0 # MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 # SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b # SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH /PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu 9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo 2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI 4uJEvlz36hz1 -----END CERTIFICATE----- # Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. # Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. # Label: "Starfield Root Certificate Authority - G2" # Serial: 0 # MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 # SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e # SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg 8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- # Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. # Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. # Label: "Starfield Services Root Certificate Authority - G2" # Serial: 0 # MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 # SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f # SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk 6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn 0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN sSi6 -----END CERTIFICATE----- # Issuer: CN=AffirmTrust Commercial O=AffirmTrust # Subject: CN=AffirmTrust Commercial O=AffirmTrust # Label: "AffirmTrust Commercial" # Serial: 8608355977964138876 # MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 # SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 # SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- # Issuer: CN=AffirmTrust Networking O=AffirmTrust # Subject: CN=AffirmTrust Networking O=AffirmTrust # Label: "AffirmTrust Networking" # Serial: 8957382827206547757 # MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f # SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f # SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp 6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- # Issuer: CN=AffirmTrust Premium O=AffirmTrust # Subject: CN=AffirmTrust Premium O=AffirmTrust # Label: "AffirmTrust Premium" # Serial: 7893706540734352110 # MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 # SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 # SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ +jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S 5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B 8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc 0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e KeC2uAloGRwYQw== -----END CERTIFICATE----- # Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust # Subject: CN=AffirmTrust Premium ECC O=AffirmTrust # Label: "AffirmTrust Premium ECC" # Serial: 8401224907861490260 # MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d # SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb # SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D 0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== -----END CERTIFICATE----- # Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority # Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority # Label: "Certum Trusted Network CA" # Serial: 279744 # MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 # SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e # SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- # Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA # Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA # Label: "TWCA Root Certification Authority" # Serial: 1 # MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 # SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 # SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx 3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- # Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 # Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 # Label: "Security Communication RootCA2" # Serial: 0 # MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 # SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 # SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy 1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- # Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority # Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority # Label: "Hellenic Academic and Research Institutions RootCA 2011" # Serial: 0 # MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 # SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d # SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD 75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp 5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p 6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI l7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- # Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 # Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 # Label: "Actalis Authentication Root CA" # Serial: 6271844772424770508 # MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 # SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac # SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX 4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ 51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- # Issuer: O=Trustis Limited OU=Trustis FPS Root CA # Subject: O=Trustis Limited OU=Trustis FPS Root CA # Label: "Trustis FPS Root CA" # Serial: 36053640375399034304724988975563710553 # MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d # SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 # SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA 0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN ZetX2fNXlrtIzYE= -----END CERTIFICATE----- # Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 # Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 # Label: "Buypass Class 2 Root CA" # Serial: 2 # MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 # SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 # SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr 6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN 9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h 9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo +fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h 3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= -----END CERTIFICATE----- # Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 # Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 # Label: "Buypass Class 3 Root CA" # Serial: 2 # MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec # SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 # SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX 0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c /3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D 34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv 033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq 4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= -----END CERTIFICATE----- # Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center # Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center # Label: "T-TeleSec GlobalRoot Class 3" # Serial: 1 # MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef # SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 # SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN 8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ 1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT 91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p TpPDpFQUWw== -----END CERTIFICATE----- # Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus # Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus # Label: "EE Certification Centre Root CA" # Serial: 112324828676200291871926431888494945866 # MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f # SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 # SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE 1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= -----END CERTIFICATE----- # Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH # Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH # Label: "D-TRUST Root Class 3 CA 2 2009" # Serial: 623603 # MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f # SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 # SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp /hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y Johw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- # Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH # Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH # Label: "D-TRUST Root Class 3 CA 2 EV 2009" # Serial: 623604 # MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 # SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 # SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp 3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 -----END CERTIFICATE----- # Issuer: CN=CA Disig Root R2 O=Disig a.s. # Subject: CN=CA Disig Root R2 O=Disig a.s. # Label: "CA Disig Root R2" # Serial: 10572350602393338211 # MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 # SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 # SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka +elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- # Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV # Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV # Label: "ACCVRAIZ1" # Serial: 6828503384748696800 # MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 # SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 # SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ 0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA 7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH 7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- # Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA # Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA # Label: "TWCA Global Root CA" # Serial: 3262 # MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 # SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 # SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF 10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz 0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc 46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm 4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL 1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh 15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW 6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy KwbQBM0= -----END CERTIFICATE----- # Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera # Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera # Label: "TeliaSonera Root CA v1" # Serial: 199041966741090107964904287217786801558 # MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c # SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 # SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ /jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs 81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG 9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- # Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi # Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi # Label: "E-Tugra Certification Authority" # Serial: 7667447206703254355 # MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 # SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 # SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c 77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 +GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- # Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center # Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center # Label: "T-TeleSec GlobalRoot Class 2" # Serial: 1 # MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a # SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 # SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi 1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP BSeOE6Fuwg== -----END CERTIFICATE----- # Issuer: CN=Atos TrustedRoot 2011 O=Atos # Subject: CN=Atos TrustedRoot 2011 O=Atos # Label: "Atos TrustedRoot 2011" # Serial: 6643877497813316402 # MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 # SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 # SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ 4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- # Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited # Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited # Label: "QuoVadis Root CA 1 G3" # Serial: 687049649626669250736271037606554624078720034195 # MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab # SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 # SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh 4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc 3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD -----END CERTIFICATE----- # Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited # Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited # Label: "QuoVadis Root CA 2 G3" # Serial: 390156079458959257446133169266079962026824725800 # MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 # SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 # SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz 8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l 7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE +V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M -----END CERTIFICATE----- # Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited # Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited # Label: "QuoVadis Root CA 3 G3" # Serial: 268090761170461462463995952157327242137089239581 # MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 # SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d # SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR /xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP 0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf 3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl 8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- # Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert Assured ID Root G2" # Serial: 15385348160840213938643033620894905419 # MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d # SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f # SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I 0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- # Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert Assured ID Root G3" # Serial: 15459312981008553731928384953135426796 # MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb # SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 # SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv 6pZjamVFkpUBtA== -----END CERTIFICATE----- # Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert Global Root G2" # Serial: 4293743540046975378534879503202253541 # MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 # SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 # SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI 2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx 1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV 5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY 1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- # Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert Global Root G3" # Serial: 7089244469030293291760083333884364146 # MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca # SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e # SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 sycX -----END CERTIFICATE----- # Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert Trusted Root G4" # Serial: 7451500558977370777930084869016614236 # MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 # SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 # SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t 9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd +SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N 0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie 4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 /YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ -----END CERTIFICATE----- # Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited # Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited # Label: "COMODO RSA Certification Authority" # Serial: 101909084537582093308941363524873193117 # MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 # SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 # SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR 6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC 9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV /erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z +pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB /wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM 4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV 2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl 0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB NVOFBkpdn627G190 -----END CERTIFICATE----- # Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network # Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network # Label: "USERTrust RSA Certification Authority" # Serial: 2645093764781058787591871645665788717 # MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 # SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e # SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B 3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT 79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs 8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG jjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- # Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network # Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network # Label: "USERTrust ECC Certification Authority" # Serial: 123013823720199481456569720443997572134 # MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 # SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 # SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- # Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 # Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 # Label: "GlobalSign ECC Root CA - R4" # Serial: 14367148294922964480859022125800977897474 # MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e # SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb # SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c -----BEGIN CERTIFICATE----- MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs ewv4n4Q= -----END CERTIFICATE----- # Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 # Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 # Label: "GlobalSign ECC Root CA - R5" # Serial: 32785792099990507226680698011560947931244 # MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 # SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa # SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc 8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg 515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO xwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- # Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden # Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden # Label: "Staat der Nederlanden Root CA - G3" # Serial: 10003001 # MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 # SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc # SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR 9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az 5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh /WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw 0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq 4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR 1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM 94B7IWcnMFk= -----END CERTIFICATE----- # Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden # Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden # Label: "Staat der Nederlanden EV Root CA" # Serial: 10000013 # MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba # SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb # SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a -----BEGIN CERTIFICATE----- MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS /ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH 1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u 2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc 7uzXLg== -----END CERTIFICATE----- # Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust # Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust # Label: "IdenTrust Commercial Root CA 1" # Serial: 13298821034946342390520003877796839426 # MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 # SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 # SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT 3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU +ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 +wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG 4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A 7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H -----END CERTIFICATE----- # Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust # Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust # Label: "IdenTrust Public Sector Root CA 1" # Serial: 13298821034946342390521976156843933698 # MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba # SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd # SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF /YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R 3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy 9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ 2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 +bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv 8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- # Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only # Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only # Label: "Entrust Root Certification Authority - G2" # Serial: 1246989352 # MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 # SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 # SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v 1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== -----END CERTIFICATE----- # Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only # Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only # Label: "Entrust Root Certification Authority - EC1" # Serial: 51543124481930649114116133369 # MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc # SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 # SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- # Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority # Subject: CN=CFCA EV ROOT O=China Financial Certification Authority # Label: "CFCA EV ROOT" # Serial: 407555286 # MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 # SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 # SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 /ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp 7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN 5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe /v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ 5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- # Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. # Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. # Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" # Serial: 156233699172481 # MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e # SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb # SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 -----BEGIN CERTIFICATE----- MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom /4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z 5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW +qtB4Uu2NQvAmxU= -----END CERTIFICATE----- # Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 # Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 # Label: "Certinomis - Root CA" # Serial: 1 # MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f # SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 # SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 -----BEGIN CERTIFICATE----- MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb 5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ 0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ 8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= -----END CERTIFICATE----- # Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed # Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed # Label: "OISTE WISeKey Global Root GB CA" # Serial: 157768595616588414422159278966750757568 # MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d # SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed # SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX 1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P 99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- # Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. # Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. # Label: "SZAFIR ROOT CA2" # Serial: 357043034767186914217277344587386743377558296292 # MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 # SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de # SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT 3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw 3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw 8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== -----END CERTIFICATE----- # Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority # Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority # Label: "Certum Trusted Network CA 2" # Serial: 44979900017204383099463764357512596969 # MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 # SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 # SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 -----BEGIN CERTIFICATE----- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn 0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n 3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P 5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi DrW5viSP -----END CERTIFICATE----- # Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority # Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority # Label: "Hellenic Academic and Research Institutions RootCA 2015" # Serial: 0 # MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce # SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 # SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA 4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV 9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot 9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 vm9qp/UsQu0yrbYhnr68 -----END CERTIFICATE----- # Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority # Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority # Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" # Serial: 0 # MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef # SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 # SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 -----BEGIN CERTIFICATE----- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- # Issuer: CN=Certplus Root CA G1 O=Certplus # Subject: CN=Certplus Root CA G1 O=Certplus # Label: "Certplus Root CA G1" # Serial: 1491911565779898356709731176965615564637713 # MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 # SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 # SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt 6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP 0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f 6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN 1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV 4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh 66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 /SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j 2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy 6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl ++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= -----END CERTIFICATE----- # Issuer: CN=Certplus Root CA G2 O=Certplus # Subject: CN=Certplus Root CA G2 O=Certplus # Label: "Certplus Root CA G2" # Serial: 1492087096131536844209563509228951875861589 # MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 # SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a # SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 -----BEGIN CERTIFICATE----- MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat 93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal U5ORGpOucGpnutee5WEaXw== -----END CERTIFICATE----- # Issuer: CN=OpenTrust Root CA G1 O=OpenTrust # Subject: CN=OpenTrust Root CA G1 O=OpenTrust # Label: "OpenTrust Root CA G1" # Serial: 1492036577811947013770400127034825178844775 # MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da # SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e # SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 -----BEGIN CERTIFICATE----- MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX /uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj 1oxx -----END CERTIFICATE----- # Issuer: CN=OpenTrust Root CA G2 O=OpenTrust # Subject: CN=OpenTrust Root CA G2 O=OpenTrust # Label: "OpenTrust Root CA G2" # Serial: 1492012448042702096986875987676935573415441 # MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb # SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b # SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 -----BEGIN CERTIFICATE----- MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh /LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU 3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM S1IK -----END CERTIFICATE----- # Issuer: CN=OpenTrust Root CA G3 O=OpenTrust # Subject: CN=OpenTrust Root CA G3 O=OpenTrust # Label: "OpenTrust Root CA G3" # Serial: 1492104908271485653071219941864171170455615 # MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 # SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 # SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 -----BEGIN CERTIFICATE----- MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm 3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx 4nxp5V2a+EEfOzmTk51V6s2N8fvB -----END CERTIFICATE----- # Issuer: CN=ISRG Root X1 O=Internet Security Research Group # Subject: CN=ISRG Root X1 O=Internet Security Research Group # Label: "ISRG Root X1" # Serial: 172886928669790476064670243504169061120 # MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e # SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 # SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- # Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM # Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM # Label: "AC RAIZ FNMT-RCM" # Serial: 485876308206448804701554682760554759 # MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d # SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 # SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z 374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf 77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp 6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp 1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B 9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- # Issuer: CN=Amazon Root CA 1 O=Amazon # Subject: CN=Amazon Root CA 1 O=Amazon # Label: "Amazon Root CA 1" # Serial: 143266978916655856878034712317230054538369994 # MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 # SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 # SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM 9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L 93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU 5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy rqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- # Issuer: CN=Amazon Root CA 2 O=Amazon # Subject: CN=Amazon Root CA 2 O=Amazon # Label: "Amazon Root CA 2" # Serial: 143266982885963551818349160658925006970653239 # MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 # SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a # SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg 1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K 8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r 2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR 8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz 7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 +XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI 0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl 7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE 76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H 9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT 4PsJYGw= -----END CERTIFICATE----- # Issuer: CN=Amazon Root CA 3 O=Amazon # Subject: CN=Amazon Root CA 3 O=Amazon # Label: "Amazon Root CA 3" # Serial: 143266986699090766294700635381230934788665930 # MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 # SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e # SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 -----BEGIN CERTIFICATE----- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM YyRIHN8wfdVoOw== -----END CERTIFICATE----- # Issuer: CN=Amazon Root CA 4 O=Amazon # Subject: CN=Amazon Root CA 4 O=Amazon # Label: "Amazon Root CA 4" # Serial: 143266989758080763974105200630763877849284878 # MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd # SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be # SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 -----BEGIN CERTIFICATE----- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi 9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW 1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- # Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. # Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. # Label: "LuxTrust Global Root 2" # Serial: 59914338225734147123941058376788110305822489521 # MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c # SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f # SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 -----BEGIN CERTIFICATE----- MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ 96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ 8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT +Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ 2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr -----END CERTIFICATE----- # Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM # Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM # Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" # Serial: 1 # MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 # SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca # SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c 8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= -----END CERTIFICATE----- # Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. # Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. # Label: "GDCA TrustAUTH R5 ROOT" # Serial: 9009899650740120186 # MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 # SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 # SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 -----BEGIN CERTIFICATE----- MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io 2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV 09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- # Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority # Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority # Label: "TrustCor RootCert CA-1" # Serial: 15752444095811006489 # MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 # SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a # SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme 9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I /5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN zl/HHk484IkzlQsPpTLWPFp5LBk= -----END CERTIFICATE----- # Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority # Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority # Label: "TrustCor RootCert CA-2" # Serial: 2711694510199101698 # MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 # SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 # SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 -----BEGIN CERTIFICATE----- MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq 1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp 2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF 3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL /V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW 2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp 5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu 1uwJ -----END CERTIFICATE----- # Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority # Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority # Label: "TrustCor ECA-1" # Serial: 9548242946988625984 # MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c # SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd # SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb 3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi tJ/X5g== -----END CERTIFICATE----- # Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation # Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation # Label: "SSL.com Root Certification Authority RSA" # Serial: 8875640296558310041 # MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 # SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb # SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 -----BEGIN CERTIFICATE----- MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh /l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm +Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY Ic2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- # Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation # Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation # Label: "SSL.com Root Certification Authority ECC" # Serial: 8495723813297216424 # MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e # SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a # SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 -----BEGIN CERTIFICATE----- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI 7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl -----END CERTIFICATE----- # Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation # Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation # Label: "SSL.com EV Root Certification Authority RSA R2" # Serial: 6248227494352943350 # MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 # SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a # SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c -----BEGIN CERTIFICATE----- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa 4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM 79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz /bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== -----END CERTIFICATE----- # Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation # Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation # Label: "SSL.com EV Root Certification Authority ECC" # Serial: 3182246526754555285 # MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 # SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d # SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 -----BEGIN CERTIFICATE----- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX 5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- DisplayCAL-3.5.0.0/DisplayCAL/camera_shutter.wav0000644000076500000000000007236612665102055021170 0ustar devwheel00000000000000RIFFtWAVEfmt DXdatat~~}}~~~~}}}}~~~~}}~~||{{~~||}}}}~~}}}}}}}}{{zz~~zz{{~~}}{{zz{{||{{{{}}yy~~||{{}}}}}}~~tt~~ttppgg[[llssss~~}}ssee__[[tt{{{{ssvv||uuooxxjj__dduu{{TT[[xxbbnnvvmm}}ttMMNNccqqggkk}}llhhoozzwwee^^ppxx^^OOggzzooyyqqbbeeppvvwwzz}}||nnnnuuzzttxxxxnnqqttvv}}vvoommxxyylljjqq{{{{||ssooooss{{qquu||{{vvooooww~~xxkkoowwuu{{}}ttww{{}}}}}}{{{{wwuu}}{{xx{{}}~~~~rrss}}||||~~{{zz}}~~zzwwyy}}{{||}}~~{{uuoorr}}~~{{wwwwzz}}||||{{||}}{{~~~~||zz{{}}zzww||}}}}~~}}||yyzz~~}}}}~~}}}}}}~~~~}}~~~~~~~~~~~~}}}}~~~~~~||}}}}}}~~~~||||~~~~~~}}~~~~}}{{}}}}||}}||}}}}}}~~}}}}~~~~~~||~~}}}}}}}}xx{{||{{~~{{}}{{uu{{vvrrttvvvvqqzz}}vvuuxxttxx}}~~~~{{ttww{{xxwwxx}}~~zz}}{{uuww~~||wwttxx{{}}{{{{~~}}{{xx{{~~||{{}}~~||}}}}}}}}}}~~}}~~}}||}}}}}}||||~~}}}}}}}}}}{{{{}}~~}}||||~~~~}}}}~~~~}}||||~~~~~~}}~~~~~~}}}}~~~~~~}}}}~~}}}}~~~~~~~~}}}}}}}}~~}}}}}}}}}}~~~~}}}}}}~~}}}}||}}~~~~}}}}~~}}}}}}}}~~~~~~||}}}}~~~~}}~~}}}}}}~~~~}}}}}}}}~~~~}}}}~~~~~~~~~~}}~~~~~~}}~~}}}}}}{{||}}||~~}}}}{{yyzzrroovv{{vvpprr}}||vvqqqqvvzzuuttyyzzwwzz||yyrrsszzxxttuu{{~~yyzz}}}}yyxx{{~~~~~~}}~~~~~~~~~~~~}}~~~~~~~~}}}}}}}}}}}}~~}}}}~~}}{{}}~~}}~~~~~~~~}}}}||}}}}}}}}~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}~~}}~~~~~~}}}}~~~~{{{{}}}}{{||}}}}}}}}~~~~~~}}}}~~||}}~~~~~~}}~~}}~~~~~~}}~~~~~~}}}}}}}}}}~~}}}}~~~~~~~~}}~~}}||}}~~~~~~~~~~~~}}~~~~}}~~~~~~~~~~}}}}~~~~}}}}~~}}}}~~~~~~~~}}~~~~}}}}~~~~}}~~~~}}~~~~~~~~~~~~}}~~}}~~~~}}}}}}}}~~~~~~~~~~~~~~}}}}~~~~}}}}}}}}~~}}||}}~~~~~~~~~~~~~~}}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~}}||||}}}}||||~~}}}}~~~~{{vv||{{rrrrxxzzzzxx||}}}}}}~~}}}}{{xxxx}}{{xxvvxxzz{{}}yyww{{yyuuyy{{||||yy{{}}}}}}{{xxxxzz~~~~||zzzz{{}}}}{{{{||~~~~{{yyzz~~}}{{{{{{~~}}{{zz{{}}zzxxwwxx}}~~}}||||{{zz{{}}}}{{{{}}yy``oozzhhooqqjjllvveessgggg{{rrbboojjggzz^^YYuujjttssxxvvooxx~~}}xxvvrrooss{{}}uuqqssxx}}{{zz{{~~~~~~~~{{yy{{||yy{{}}}}{{~~}}~~}}{{{{yyyy~~}}yyxx~~}}{{}}}}{{yy{{||{{}}~~~~}}{{{{}}||||||zzzz{{}}}}}}||{{||}}}}~~}}}}}}||}}~~~~}}}}}}}}}}}}}}zz{{}}}}}}||yywwxxzz}}~~{{{{~~}}{{{{{{{{}}}}{{{{~~~~~~}}{{yyzz||}}~~}}||}}}}||}}~~}}{{||~~}}}}}}{{}}~~}}}}{{xxwwww{{}}}}||||}}{{{{{{}}~~~~~~||zz{{}}}}~~~~}}||||}}~~}}||}}~~~~~~~~~~}}}}}}~~}}}}~~}}}}}}~~}}}}~~~~~~}}}}~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~}}~~~~~~}}}}~~~~}}}}~~}}}}}}}}}}}}}}}}}}~~}}||}}}}||}}{{}}~~}}||}}~~{{||}}||~~zz}}{{rryy{{zzzzsswwyyvvvvttvvxxzz}}zzww{{yyzz}}xx||}}{{}}}}zzvvuu{{||xxxxzz{{{{~~wwuu{{~~zzxxzz}}}}||}}}}||~~}}||~~||{{{{}}~~~~}}}}}}~~{{||}}||||}}||{{yyxxxx{{~~~~}}}}~~||{{zz{{~~}}}}~~}}||zz~~{{{{xx||||zz~~}}{{zz||yyvvqqvv}}xxxxzz~~zzvvssssttxxzzxxwwxx~~||~~xxqqxx}}zzxx}}}}~~||{{}}xxyy~~~~{{{{}}{{xx}}}}{{}}}}yy{{||{{}}~~}}||||||xxvvxx}}{{{{}}}}~~~~~~||||||~~}}{{}}{{zz{{}}~~~~~~~~~~}}||||}}{{zzxxyy{{~~~~}}||||}}}}~~~~~~~~~~{{{{{{}}~~}}}}}}}}{{||}}~~~~}}}}}}~~~~~~~~~~~~~~~~}}}}}}~~~~~~}}}}}}~~~~~~}}}}}}~~~~~~~~}}}}~~~~}}~~~~}}}}~~~~}}~~~~~~~~~~}}||}}~~~~~~~~~~~~}}}}}}}}}}~~}}~~~~~~~~~~~~}}}}~~~~~~~~}}}}~~~~}}}}~~~~}}}}~~}}}}~~~~}}}}~~~~~~~~~~}}}}}}~~~~}}}}~~~~}}}}}}~~~~}}~~~~~~~~}}}}~~}}{{{{}}~~}}}}~~~~~~~~~~~~~~}}~~~~}}~~~~~~~~}}~~~~}}}}}}}}~~~~}}||||}}~~~~~~}}}}}}}}}}}}||||}}~~~~}}}}}}}}}}}}{{yy{{~~~~~~}}~~}}}}}}~~~~~~}}{{{{||}}||||{{{{{{}}~~}}}}}}}}}}~~}}{{{{{{{{}}}}~~~~~~}}}}}}||||||}}~~~~}}{{{{||||}}}}||{{{{{{{{||}}~~~~}}~~}}}}}}}}~~}}}}}}}}}}}}}}}}~~}}}}}}}}||||||}}||}}}}}}~~~~~~}}{{{{{{{{{{{{{{{{}}~~~~}}||||||}}{{wwww{{~~}}}}}}~~}}{{yyzz||~~~~~~}}||||}}~~~~~~||}}}}~~||{{||~~~~~~~~}}}}||}}~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~}}~~~~~~~~}}}}}}~~~~}}}}}}}}}}}}~~~~}}}}}}}}~~~~~~}}||||}}}}}}~~~~~~}}}}~~}}}}}}~~~~~~~~}}}}||{{{{}}}}~~}}}}}}~~~~}}~~~~}}}}}}~~~~~~~~}}}}~~~~~~~~~~}}~~~~~~~~~~~~}}}}~~~~~~~~~~~~}}~~}}}}}}}}~~~~}}||}}~~~~~~~~~~}}}}}}~~{{zz{{}}~~~~~~~~~~}}}}~~~~}}}}}}~~~~~~~~~~}}}}||}}~~~~~~~~}}~~}}||||||}}~~}}||{{{{{{}}}}||}}~~~~~~}}||{{{{}}}}{{zzzz{{}}}}||{{||||}}~~}}}}||}}~~~~}}}}}}}}}}}}}}}}~~}}}}~~}}||||||||}}~~~~}}}}~~}}}}||||}}}}~~}}}}}}~~~~}}||}}}}}}~~}}{{}}}}~~~~}}}}~~~~~~}}~~~~}}}}~~~~~~||||||}}~~~~~~}}~~}}}}~~~~}}}}~~}}}}{{zz||~~}}}}}}}}||{{||||}}~~}}{{}}~~~~~~yy}}xxzz~~}}||||{{~~}}{{{{||{{{{}}}}~~}}}}}}}}~~}}}}}}}}||||}}}}~~||}}~~}}}}}}{{||}}}}||xxxxyyzz||~~}}||{{||}}~~~~}}||{{{{}}}}{{zz{{{{}}}}||||||}}}}~~}}{{zzzz{{}}~~}}{{{{{{}}~~}}{{{{{{}}~~~~}}}}}}||||~~}}{{zzzz{{||~~~~||{{yyxxyy{{}}~~}}{{{{{{{{{{}}}}||}}}}}}}}}}{{yy{{{{yy{{zz{{zz{{xx}}zzvvvvwwzz{{wwoovv{{oommrryywwuu{{}}ttrrvv{{zz}}}}ssqqvvyyyy~~yyuussvvxx{{~~~~{{zz{{{{yy{{}}}}xxvvvvxx||~~xxxx{{{{{{{{wwuuvvzz}}{{xxvvvvuuxx{{}}~~}}||yyxxxxyy}}||yyxxwwyy}}||{{zzzz}}~~}}}}~~}}}}}}~~}}~~~~||zzyyyy{{~~||{{{{{{{{{{zzzz}}}}zzxxyy{{{{zz{{}}~~}}}}}}{{{{}}~~}}{{||}}~~{{yy{{~~~~~~}}xxvvyyzz{{}}{{{{}}~~~~~~~~~~}}zzxxzz}}}}}}}}}}||||}}}}{{zz{{||~~~~~~~~}}||}}}}||}}~~}}||{{{{{{||}}~~~~}}~~}}{{zzyyzz{{||}}}}}}~~~~}}}}||{{zzzz{{}}~~}}}}}}||}}||}}}}{{{{{{}}}}||||~~}}}}}}{{{{{{{{}}}}}}}}}}~~~~}}||{{{{||}}~~~~}}~~}}~~~~}}}}}}~~||zzzz{{~~}}||||}}~~~~~~~~}}||}}}}~~}}{{{{}}{{{{{{}}}}}}}}~~~~~~}}}}}}}}~~~~{{zz{{||}}}}}}}}zzxxxx{{}}~~}}}}}}}}}}||}}~~}}{{xxzz||~~~~||{{{{{{}}||zzyyzz{{||}}~~}}}}{{zz{{||~~~~}}}}{{{{||}}}}}}||{{}}}}||||}}}}}}}}~~}}||{{||}}}}}}~~~~}}{{zz{{||}}||||}}||zz{{{{||}}~~~~}}{{||}}}}}}~~~~~~}}{{||~~}}{{zz{{||}}~~~~||zzyy{{{{{{{{||||||~~}}||{{}}}}}}}}}}}}~~}}||{{||||||~~}}}}||||}}~~~~~~}}{{yyxxxxzz~~~~}}~~~~~~}}}}}}}}}}~~{{zz{{}}}}{{zzyyyyyyyy{{~~}}}}}}}}||}}~~{{yyxxyy}}~~}}{{zz{{{{}}}}{{{{{{||}}||{{zzzz||~~}}}}||}}}}}}~~}}||{{{{{{{{}}}}||{{{{{{||}}~~}}}}}}||}}~~{{zzzz{{||}}~~}}{{{{{{}}}}{{{{{{}}}}||{{{{{{{{~~~~}}||{{zz{{}}}}||{{{{}}~~||{{{{||}}}}}}}}}}}}||{{}}}}{{{{{{||}}}}}}||||||~~}}||{{{{}}~~}}{{{{}}~~}}{{{{{{||}}}}~~}}{{{{{{{{~~~~||{{zzzz{{}}~~}}}}}}||||}}}}||{{{{}}~~}}{{{{zz{{~~||{{||zzxxxxzz}}}}zzzz}}~~{{yyyy{{}}{{{{||}}}}{{zzyy{{}}}}{{{{{{||}}~~}}{{zzzz{{||~~}}}}||||||}}}}||{{{{{{{{||}}}}}}||{{{{||~~~~}}{{zzzz{{||~~}}{{yyyy{{}}}}{{zzzz{{{{}}}}~~||{{{{{{||}}~~||{{zzzz{{{{}}}}{{{{{{{{}}||zzxxxxxxzz{{~~~~}}}}}}}}}}~~}}{{yyxxyyzz||~~}}||||||}}~~}}{{{{zzzz{{||}}~~||||{{{{||}}~~}}{{zzyyzzzz||~~}}||||||}}~~~~}}||{{{{{{{{}}}}}}||{{{{||}}}}||{{zzzz{{||~~}}}}}}||||}}~~~~}}{{{{{{{{{{~~~~}}}}}}||}}~~~~}}{{{{{{{{}}~~~~~~}}}}}}}}}}}}}}||{{{{||}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}~~~~~~}}}}~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}~~}}}}}}~~}}||||||||||||||}}}}~~}}}}~~~~}}{{{{||}}}}}}~~~~}}}}}}}}~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~}}}}||}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~}}}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}~~}}~~~~~~~~}}}}}}~~~~~~}}}}~~~~~~}}}}}}}}~~~~}}}}}}}}~~}}}}}}}}}}~~~~}}}}}}~~~~~~~~}}~~~~~~~~~~~~~~}}}}}}}}~~~~~~~~}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}~~}}}}~~~~}}}}~~~~~~~~~~~~}}}}}}}}}}~~}}}}}}~~}}}}{{~~{{ww}}}}||||}}~~}}{{}}}}||}}||~~}}||{{}}}}}}~~~~}}}}}}}}}}~~}}}}}}}}~~}}~~~~~~}}}}}}}}}}~~}}{{||~~~~}}}}}}~~~~~~}}}}~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~}}}}~~~~}}}}~~~~}}~~~~~~~~~~~~~~}}}}~~}}}}}}}}~~~~~~~~}}}}~~~~}}}}||||}}~~}}}}}}||||||}}}}~~~~~~~~}}}}~~}}}}}}}}~~~~}}~~~~~~}}}}||||||}}}}~~~~~~~~}}}}}}}}~~~~}}}}~~}}}}~~~~~~}}}}~~~~}}||~~~~~~}}||}}~~}}}}~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}~~~~}}}}}}}}~~}}}}~~~~~~~~}}}}~~}}}}}}}}~~}}||||||}}}}~~}}||}}~~~~~~~~}}}}}}~~}}~~~~}}}}||||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||}}}}}}~~~~}}}}~~~~~~~~}}}}~~~~~~~~~~~~}}}}~~~~}}}}}}}}~~}}}}~~}}}}}}~~~~~~~~}}}}}}~~~~}}}}}}}}}}~~~~~~~~~~~~}}~~~~}}}}~~~~~~~~~~~~~~~~~~}}}}~~~~}}~~~~}}}}~~~~}}}}}}}}~~~~~~~~~~~~~~~~}}}}||}}~~}}}}}}}}~~~~}}}}}}~~~~}}||||}}}}~~~~~~~~~~~~~~}}~~~~~~}}}}~~~~~~~~~~~~~~}}}}}}~~~~}}}}}}~~}}||||||||}}~~~~~~~~}}}}~~}}}}}}~~~~~~~~}}}}}}~~~~~~~~}}}}}}}}~~~~||{{||}}~~}}}}~~~~~~}}}}~~~~}}}}}}}}}}~~}}}}||||}}~~~~}}}}}}}}~~~~}}}}}}}}~~}}}}}}~~}}}}}}}}}}}}}}~~}}{{{{{{{{}}}}||||}}}}~~~~||||{{{{}}}}}}~~}}}}}}}}~~~~~~}}}}}}~~}}}}}}}}}}}}~~~~}}}}}}||}}~~~~}}}}}}||}}~~~~~~~~~~~~~~~~~~}}}}~~}}}}||||}}~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}~~}}}}}}}}}}~~}}}}||}}~~~~~~~~~~~~~~}}~~~~}}~~~~~~}}}}~~~~~~~~}}~~~~}}}}~~~~~~~~~~}}~~}}||{{||}}~~}}~~}}{{||}}~~~~~~}}}}~~~~}}~~~~}}}}}}~~}}}}~~~~}}}}}}~~~~~~~~}}{{||}}}}~~~~~~~~}}||}}}}~~}}~~~~}}||||}}~~~~}}}}}}}}}}~~}}||}}}}}}}}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}}}~~}}~~~~}}}}}}}}~~~~~~}}}}}}~~~~}}~~~~}}~~~~}}}}~~~~~~~~}}}}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~}}}}~~~~~~}}}}||||}}~~}}~~~~}}}}~~~~}}}}}}}}~~~~}}~~~~~~~~~~~~~~~~}}~~~~~~~~}}}}}}}}~~~~}}}}~~~~}}}}}}~~~~~~~~~~}}{{yy}}||vvvv||~~zzzz}}||}}}}vvvv}}}}{{{{{{{{zzyyxxzz}}~~}}~~~~}}~~}}{{xxxxxxxx||}}{{yyzz}}{{vvrrrruuxx}}}}||}}}}{{||}}{{}}~~}}||}}~~~~}}{{yyyyyyzz{{}}}}{{{{{{||{{{{||{{zz||}}~~}}}}||{{}}}}||}}~~~~}}~~}}{{||}}{{yy{{}}}}}}}}~~||}}~~}}}}~~}}{{||}}~~~~~~||||}}}}}}~~~~}}~~~~}}~~~~~~{{yyxxxxzz{{}}}}}}}}}}~~}}||}}}}}}~~}}}}~~}}}}~~~~}}}}}}||}}}}}}||||}}}}}}}}~~}}~~~~~~~~}}}}}}}}~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}}}~~~~~~~~}}}}~~}}||||}}~~~~}}}}}}~~~~~~}}~~~~}}}}}}}}}}}}}}~~~~}}~~||}}~~~~}}~~||{{{{}}{{xxttzz}}||~~zz{{{{wwzzuuwwyy}}zz{{ssllxxxx}}~~~~yyqq}}}}wwvvuuvv}}}}}}{{rrvv||xxwwvvvv}}~~||{{zz||~~~~~~{{xxxx{{~~}}~~~~||{{zzzz~~~~{{zzyy{{~~~~}}~~}}||}}~~}}}}}}}}~~}}~~}}}}}}}}~~}}}}~~}}}}~~}}~~~~||||}}~~~~zzxxzzzz{{}}}}}}}}}}~~}}{{yyyy{{~~}}||}}~~||zzxx{{~~~~{{||}}}}}}{{}}}}{{zzwwxx~~~~}}{{{{||}}}}}}}}||yyvvwwzz{{~~~~~~~~||{{{{zzxxzz{{}}~~}}{{yywwvvvvwwxxzz{{{{{{||~~}}xxrrooxxkkbblltt}}xx{{||{{yyvv{{~~~~}}}}{{||}}vvuuzzxxoonnvv}}||zzzz~~{{{{~~}}~~}}}}~~~~~~~~}}~~}}}}~~~~}}{{}}~~}}}}~~~~}}~~~~~~~~}}~~~~}}||||~~}}||}}~~~~}}}}||{{}}}}{{||~~~~~~}}}}~~}}}}}}~~~~}}}}~~~~}}}}}}}}}}~~~~~~~~}}{{||}}}}~~~~~~~~}}~~~~~~~~~~~~}}}}~~}}}}}}}}~~~~}}~~~~~~~~~~~~}}~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}~~~~~~~~~~~~}}~~~~~~~~}}}}}}~~~~}}}}~~~~~~~~~~~~}}}}}}~~~~}}~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~DisplayCAL-3.5.0.0/DisplayCAL/ccmx.py0000644000076500000000000000627212665102055016740 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement # Python 2.5 import codecs import os import sys import time import demjson CCMX_TEMPLATE = '''CCMX DESCRIPTOR "%(Name)s" KEYWORD "INSTRUMENT" INSTRUMENT "%(Device)s" KEYWORD "DISPLAY" DISPLAY "%(Display)s" KEYWORD "DISPLAY_TYPE_BASE_ID" DISPLAY_TYPE_BASE_ID "1" KEYWORD "REFERENCE" REFERENCE "%(ReferenceDevice)s" ORIGINATOR "%(Originator)s" CREATED "%(DateTime)s" KEYWORD "COLOR_REP" COLOR_REP "XYZ" NUMBER_OF_FIELDS 3 BEGIN_DATA_FORMAT XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 3 BEGIN_DATA %(MatrixXYZ)s END_DATA ''' def convert_devicecorrections_to_ccmx(path, target_dir): """ Convert iColorDisplay DeviceCorrections.txt to individual Argyll CCMX files """ with codecs.open(path, 'r', 'utf8') as devcorrections_file: lines = devcorrections_file.read().strip().splitlines() # Convert to JSON # The DeviceCorrections.txt format is as follows, so a conversion is pretty # straightforward: # "Description here, e.g. Instrument X for Monitor Y" = # { # Name = "Description here, e.g. Instrument X for Monitor Y" # Device = "Instrument X" # Display = "Monitor Y" # ReferenceDevice = "eye-one Pro Rev.D" # MatrixXYZ = "3 3 1482250784 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 " # } # "Description here, e.g. Instrument X for Monitor Y" = # { # Name = "Description here, e.g. Instrument X for Monitor Y" # Device = "Instrument X" # Display = "Monitor Y" # ReferenceDevice = "eye-one Pro Rev.D" # MatrixXYZ = "3 3 1482250784 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 " # } # ...etc. # NOTE: The first three numbers in MatrixXYZ are irrelevant for our purposes. for i, line in enumerate(lines): parts = line.strip().split('=') if len(parts) == 2: for j, part in enumerate(parts): part = part.strip() if part and not part.startswith('"') and not part.endswith('"'): parts[j] = '"%s"' % part if parts[-1].strip() not in('', '{') and i < len(lines) - 1: parts[-1] += ',' lines[i] = ':'.join(parts) devcorrections_data = '{%s}' % ''.join(lines).replace(',}', '}') # Parse JSON devcorrections = demjson.decode(devcorrections_data) # Convert to ccmx imported = 0 skipped = 0 for name, devcorrection in devcorrections.iteritems(): values = {'DateTime': time.strftime('%a %b %d %H:%M:%S %Y'), 'Originator': "Quato iColorDisplay", 'Name': "%s & %s" % (devcorrection.get("Device"), devcorrection.get("Display"))} for key in ('Device', 'Display', 'ReferenceDevice', 'MatrixXYZ'): value = devcorrection.get(key) if value is None: break if key == 'MatrixXYZ': # The first three numbers in the matrix are irrelevant for our # purposes (see format example above). matrix = value.split()[3:] value = '\n'.join([' '.join(part) for part in (matrix[0:3], matrix[3:6], matrix[6:9])]) values[key] = value if value is None: skipped += 1 continue imported += 1 with codecs.open(os.path.join(target_dir, name + '.ccmx'), 'w', 'utf8') as ccmx: ccmx.write(CCMX_TEMPLATE % values) return imported, skipped if __name__ == '__main__': convert_devicecorrections_to_ccmx(sys.argv[1], os.path.dirname(sys.argv[1])) DisplayCAL-3.5.0.0/DisplayCAL/CGATS.py0000644000076500000000000016036313220271163016644 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Simple CGATS file parser class Copyright (C) 2008 Florian Hoech """ from __future__ import with_statement import math, os, re, sys import colormath from log import safe_print from options import debug, verbose from util_io import GzipFileProper, StringIOu as StringIO def get_device_value_labels(color_rep=None): return filter(bool, map(lambda v: v[1] if not color_rep or v[0] == color_rep else False, {"CMYK": ("CMYK_C", "CMYK_M", "CMYK_Y", "CMYK_K"), "RGB": ("RGB_R", "RGB_G", "RGB_B")}.iteritems())) def rpad(value, width): """ Right-pad a value to a given width. value is converted to a string first. If value wasn't a number originally, return the quoted string. """ strval = str(value) if not isinstance(value, (int, float, long, complex)): return '"%s"' % strval i = strval.find(".") if i > -1: if i < width - 1: strval = str(round(value, width - i - 1)).ljust(width, '0') else: strval = str(int(round(value))) return strval def rcut(value, width): """ Cut off any chars beyond width on the right-hand side. value is converted to a string first. If value wasn't a number originally, return the quoted string. """ strval = str(value) if not isinstance(value, (int, float, long, complex)): return '"%s"' % strval i = strval.find(".") if i > -1: if i < width - 1: strval = str(round(value, width - i - 1)) else: strval = str(int(round(value))) return strval def sort_RGB_gray_to_top(a, b): if a[0] == a[1] == a[2]: if b[0] == b[1] == b[2]: return 0 return -1 else: return 0 def sort_RGB_to_top_factory(i1, i2, i3, i4): def sort_RGB_to_top(a, b): if a[i1] == a[i2] and 0 <= a[i3] < a[i4]: if b[i1] == b[i2] and 0 <= b[i3] < b[i4]: return 0 return -1 else: return 0 return sort_RGB_to_top def sort_RGB_white_to_top(a, b): sum1, sum2 = sum(a[:3]), sum(b[:3]) if sum1 == 300: return -1 else: return 0 def sort_by_HSI(a, b): a = list(colormath.RGB2HSI(*a[:3])) b = list(colormath.RGB2HSI(*b[:3])) a[0] = round(math.degrees(a[0])) b[0] = round(math.degrees(b[0])) if a > b: return 1 elif a < b: return -1 else: return 0 def sort_by_HSL(a, b): a = list(colormath.RGB2HSL(*a[:3])) b = list(colormath.RGB2HSL(*b[:3])) a[0] = round(math.degrees(a[0])) b[0] = round(math.degrees(b[0])) if a > b: return 1 elif a < b: return -1 else: return 0 def sort_by_HSV(a, b): a = list(colormath.RGB2HSV(*a[:3])) b = list(colormath.RGB2HSV(*b[:3])) a[0] = round(math.degrees(a[0])) b[0] = round(math.degrees(b[0])) if a > b: return 1 elif a < b: return -1 else: return 0 def sort_by_RGB(a, b): if a[:3] > b[:3]: return 1 elif a[:3] < b[:3]: return -1 else: return 0 def sort_by_BGR(a, b): if a[:3][::-1] > b[:3][::-1]: return 1 elif a[:3] == b[:3]: return 0 else: return -1 def sort_by_RGB_sum(a, b): sum1, sum2 = sum(a[:3]), sum(b[:3]) if sum1 > sum2: return 1 elif sum1 < sum2: return -1 else: return 0 def sort_by_RGB_pow_sum(a, b): sum1, sum2 = sum(v ** 2.2 for v in a[:3]), sum(v ** 2.2 for v in b[:3]) if sum1 > sum2: return 1 elif sum1 < sum2: return -1 else: return 0 def sort_by_L(a, b): Lab1 = colormath.XYZ2Lab(*a[3:]) Lab2 = colormath.XYZ2Lab(*b[3:]) if Lab1[0] > Lab2[0]: return 1 elif Lab1[0] < Lab2[0]: return -1 else: return 0 def sort_by_luma_factory(RY, GY, BY, gamma=1): def sort_by_luma(a, b): a = RY * a[0] ** gamma + GY * a[1] ** gamma + BY * a[2] ** gamma b = RY * b[0] ** gamma + GY * b[1] ** gamma + BY * b[2] ** gamma if a > b: return 1 elif a < b: return -1 else: return 0 return sort_by_luma sort_by_rec709_luma = sort_by_luma_factory(0.2126, 0.7152, 0.0722) class CGATSError(Exception): pass class CGATSInvalidError(CGATSError, IOError): pass class CGATSInvalidOperationError(CGATSError): pass class CGATSKeyError(CGATSError, KeyError): pass class CGATSTypeError(CGATSError, TypeError): pass class CGATSValueError(CGATSError, ValueError): pass class CGATS(dict): """ CGATS structure. CGATS files are treated mostly as 'soup', so only basic checking is in place. """ datetime = None filename = None fileName = property(lambda self: self.filename, lambda self, filename: setattr(self, "filename", filename)) key = None _modified = False mtime = None parent = None root = None type = 'ROOT' vmaxlen = 0 def __init__(self, cgats=None, normalize_fields=False, file_identifier="CTI3", emit_keywords=False): """ Return a CGATS instance. cgats can be a path, a string holding CGATS data, or a file object. If normalize_fields evaluates to True, convert all KEYWORDs and all fields in DATA_FORMAT to UPPERCASE and SampleId or SampleName to SAMPLE_ID or SAMPLE_NAME respectively file_identifier is used as fallback if no file identifier is present """ self.normalize_fields = normalize_fields self.file_identifier = file_identifier self.emit_keywords = emit_keywords self.root = self self._keys = [] if cgats: if isinstance(cgats, list): raw_lines = cgats else: if isinstance(cgats, basestring): if cgats.find('\n') < 0 and cgats.find('\r') < 0: # assume filename cgats = open(cgats, 'rU') self.filename = cgats.name else: # assume text cgats = StringIO(cgats) elif isinstance(cgats, file): self.filename = cgats.name elif not isinstance(cgats, StringIO): raise CGATSInvalidError('Unsupported type: %s' % type(cgats)) if self.filename not in ('', None): self.mtime = os.stat(self.filename).st_mtime cgats.seek(0) raw_lines = cgats.readlines() cgats.close() context = self for raw_line in raw_lines: # Replace 1.#IND00 with NaN raw_line = raw_line.replace("1.#IND00", "NaN") # strip control chars and leading/trailing whitespace line = re.sub('[^\x09\x20-\x7E\x80-\xFF]', '', raw_line.strip()) comment_offset = line.find('#') if comment_offset >= 0: # strip comment line = line[:comment_offset].strip() values = [value.strip('"') for value in line.split()] if line[:6] == 'BEGIN_': key = line[6:] if key in context: # Start new CGATS new = len(self) self[new] = CGATS() self[new].key = '' self[new].parent = self self[new].root = self.root self[new].type = '' context = self[new] if line == 'BEGIN_DATA_FORMAT': context['DATA_FORMAT'] = CGATS() context['DATA_FORMAT'].key = 'DATA_FORMAT' context['DATA_FORMAT'].parent = context context['DATA_FORMAT'].root = self context['DATA_FORMAT'].type = 'DATA_FORMAT' context = context['DATA_FORMAT'] elif line == 'END_DATA_FORMAT': context = context.parent elif line == 'BEGIN_DATA': context['DATA'] = CGATS() context['DATA'].key = 'DATA' context['DATA'].parent = context context['DATA'].root = self context['DATA'].type = 'DATA' context = context['DATA'] elif line == 'END_DATA': context = context.parent elif line[:6] == 'BEGIN_': key = line[6:] context[key] = CGATS() context[key].key = key context[key].parent = context context[key].root = self context[key].type = 'SECTION' context = context[key] elif line[:4] == 'END_': context = context.parent elif context.type in ('DATA_FORMAT', 'DATA'): if len(values): context = context.add_data(values) elif context.type == 'SECTION': context = context.add_data(line) elif len(values) > 1: if values[0] == 'Date:': context.datetime = line else: match = re.match( '([^"]+?)(?:\s+("[^"]+"|[^\s]+))?(?:\s*#(.*))?$', line) if match: key, value, comment = match.groups() if value != None: context = context.add_data({key: value.strip('"')}) else: context = context.add_data({key: ''}) elif values and values[0] not in ('Comment:', 'Date:') and \ len(line) >= 3 and not re.search("[^ 0-9A-Za-z]", line): context = self.add_data(line) self.setmodified(False) def __delattr__(self, name): del self[name] self.setmodified() def __delitem__(self, name): if (self.type not in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION') and name in self._keys): self._keys.remove(name) dict.__delitem__(self, name) self.setmodified() def __getattr__(self, name): if name in self: return self[name] else: raise AttributeError(name) def __getitem__(self, name): if name == -1: return self.get(len(self) - 1) elif name in ('NUMBER_OF_FIELDS', 'NUMBER_OF_SETS'): return getattr(self, name) elif name in self: if str(name).upper() in ('INDEX', 'SAMPLE_ID', 'SAMPLEID'): if type(self.get(name)) not in (int, float): return self.get(name) if str(name).upper() == 'INDEX': return self.key if type(self.get(name)) == float: return 1.0 / (self.NUMBER_OF_SETS - 1) * self.key return self.key + 1 return self.get(name) raise CGATSKeyError(name) def get(self, name, default=None): if name == -1: return dict.get(self, len(self) - 1, default) elif name in ('NUMBER_OF_FIELDS', 'NUMBER_OF_SETS'): return getattr(self, name, default) else: return dict.get(self, name, default) def get_colorants(self): color_rep = (self.queryv1("COLOR_REP") or "").split("_") if len(color_rep) == 2: query = {} colorants = [] for i in xrange(len(color_rep[0])): for j, channelname in enumerate(color_rep[0]): query["_".join([color_rep[0], channelname])] = {i: 100}.get(j, 0) colorants.append(self.queryi1(query)) return colorants def get_descriptor(self): """ Return descriptor """ desc = self.queryv1("DESCRIPTOR") is_ccss = self.get(0, self).type == "CCSS" if not desc or desc == "Not specified" or is_ccss: if not is_ccss: desc = self.queryv1("INSTRUMENT") if desc: display = self.queryv1("DISPLAY") if display: desc += " & " + display else: tech = self.queryv1("TECHNOLOGY") if tech: if (desc and desc != "Not specified" and desc != "CCSS for " + tech): display = desc else: display = self.queryv1("DISPLAY") if display: tech += " (%s)" % display desc = tech if not desc and self.filename: desc = os.path.splitext(os.path.basename(self.filename))[0] return desc def __setattr__(self, name, value): if name == '_keys': object.__setattr__(self, name, value) elif name == 'modified': self.setmodified(value) elif name in ('datetime', 'filename', 'fileName', 'file_identifier', 'key', 'mtime', 'normalize_fields', 'parent', 'root', 'type', 'vmaxlen', 'emit_keywords'): object.__setattr__(self, name, value) self.setmodified() else: self[name] = value def __setitem__(self, name, value): if (self.type not in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION') and not name in self): self._keys.append(name) dict.__setitem__(self, name, value) self.setmodified() def setmodified(self, modified=True): """ Set 'modified' state on the 'root' object. """ if self.root and self.root._modified != modified: object.__setattr__(self.root, '_modified', modified) def __str__(self): result = [] data = None if self.type == 'SAMPLE': result.append(' '.join(rpad(self[item], self.parent.vmaxlen + (1 if self[item] < 0 else 0)) for item in self.parent.parent['DATA_FORMAT'].values())) elif self.type == 'DATA': data = self elif self.type == 'DATA_FORMAT': result.append(' '.join(self.values())) else: if self.datetime: result.append(self.datetime) if self.type == 'SECTION': result.append('BEGIN_' + self.key) elif self.parent and self.parent.type == 'ROOT': result.append(self.type.ljust(7)) # Make sure CGATS file # identifiers are always # a minimum of 7 characters result.append('') if self.type in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION'): iterable = self else: iterable = self._keys for key in iterable: value = self[key] if key == 'DATA': data = value elif type(value) in (float, int, str, unicode): if key not in ('NUMBER_OF_FIELDS', 'NUMBER_OF_SETS'): if type(key) == int: result.append(str(value)) else: if 'KEYWORDS' in self and \ key in self['KEYWORDS'].values(): if self.emit_keywords: result.append('KEYWORD "%s"' % key) result.append('%s "%s"' % (key, value)) elif key not in ('DATA_FORMAT', 'KEYWORDS'): if (value.type == 'SECTION' and result[-1:] and result[-1:][0] != ''): result.append('') result.append(str(value)) if self.type == 'SECTION': result.append('END_' + self.key) if self.type == 'SECTION' or data: result.append('') if data and data.parent['DATA_FORMAT']: if 'KEYWORDS' in data.parent and self.emit_keywords: for item in data.parent['DATA_FORMAT'].values(): if item in data.parent['KEYWORDS'].values(): result.append('KEYWORD "%s"' % item) result.append('NUMBER_OF_FIELDS %s' % len(data.parent['DATA_FORMAT'])) result.append('BEGIN_DATA_FORMAT') result.append(' '.join(data.parent['DATA_FORMAT'].values())) result.append('END_DATA_FORMAT') result.append('') result.append('NUMBER_OF_SETS %s' % (len(data))) result.append('BEGIN_DATA') for key in data: result.append(' '.join([rpad(data[key][item], data.vmaxlen + (1 if data[key][item] < 0 else 0)) for item in data.parent['DATA_FORMAT'].values()])) result.append('END_DATA') return '\n'.join(result) def add_keyword(self, keyword, value=None): """ Add a keyword to the list of keyword values. """ if self.type in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION'): context = self.parent elif self.type == 'SAMPLE': context = self.parent.parent else: context = self if not 'KEYWORDS' in context: context['KEYWORDS'] = CGATS() context['KEYWORDS'].key = 'KEYWORDS' context['KEYWORDS'].parent = context context['KEYWORDS'].root = self.root context['KEYWORDS'].type = 'KEYWORDS' if not keyword in context['KEYWORDS'].values(): newkey = len(context['KEYWORDS']) while newkey in context['KEYWORDS']: newkey += 1 context['KEYWORDS'][newkey] = keyword if value != None: context[keyword] = value def add_section(self, key, value): self[key] = CGATS() self[key].key = key self[key].parent = self self[key].root = self self[key].type = 'SECTION' self[key].add_data(value) def remove_keyword(self, keyword, remove_value=True): """ Remove a keyword from the list of keyword values. """ if self.type in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION'): context = self.parent elif self.type == 'SAMPLE': context = self.parent.parent else: context = self for key in context['KEYWORDS'].keys(): if context['KEYWORDS'][key] == keyword: del context['KEYWORDS'][key] if remove_value: del context[keyword] def insert(self, key=None, data=None): """ Insert data at index key. Also see add_data method. """ self.add_data(data, key) def append(self, data): """ Append data. Also see add_data method. """ self.add_data(data) def get_data(self, field_names=None): data = self.queryv1("DATA") if not data: return False elif field_names: data = data.queryi(field_names) return data def get_RGB_XYZ_values(self): field_names = ("RGB_R", "RGB_G", "RGB_B", "XYZ_X", "XYZ_Y", "XYZ_Z") data = self.get_data(field_names) if not data: return False, False valueslist = [] for key, item in data.iteritems(): values = [] for field_name in field_names: values.append(item[field_name]) valueslist.append(values) return data, valueslist def set_RGB_XYZ_values(self, valueslist): field_names = ("RGB_R", "RGB_G", "RGB_B", "XYZ_X", "XYZ_Y", "XYZ_Z") for i, values in enumerate(valueslist): for j, field_name in enumerate(field_names): self[i][field_name] = values[j] return True def checkerboard(self, sort1=sort_by_L, sort2=sort_RGB_white_to_top, split_grays=False, shift=False): data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False numvalues = len(valueslist) if sort1: valueslist.sort(sort1) if sort2: valueslist.sort(sort2) gray = [] if split_grays: # Split values into gray and color. First gray in a consecutive # sequence of two or more grays will be added to color list, # following grays will be added to gray list. color = [] prev_i = -1 prev_values = [] added = {prev_i: True} # Keep track of entries we have added for i, values in enumerate(valueslist): if debug: safe_print(i + 1, "IN", values[:3]) is_gray = values[:3] == [values[:3][0]] * 3 prev = color cur = color if is_gray: if not prev_values: if debug: safe_print("WARNING - skipping gray because no prev") elif values[:3] == prev_values[:3]: # Same gray as prev value prev = color cur = gray if prev_i not in added: if debug: safe_print("INFO - appending prev %s to color " "because prev was same gray but got " "skipped" % prev_values[:3]) if debug: safe_print("INFO - appending cur to gray because " "prev %s was same gray" % prev_values[:3]) elif prev_values[:3] == [prev_values[:3][0]] * 3: # Prev value was different gray prev = gray cur = gray if prev_i not in added: if debug: safe_print("INFO - appending prev %s to gray " "because prev was different gray " "but got skipped" % prev_values[:3]) if debug: safe_print("INFO - appending cur to gray because " "prev %s was different gray" % prev_values[:3]) elif i < numvalues - 1: if debug: safe_print("WARNING - skipping gray because " "prev %s was not gray" % prev_values[:3]) else: # Last if debug: safe_print("INFO - appending cur to color " "because prev %s was not gray but " "cur is last" % prev_values[:3]) if not is_gray or cur is gray or i == numvalues - 1: if prev_i not in added: if debug and prev is cur is color: safe_print("INFO - appending prev %s to color because " "prev got skipped" % prev_values[:3]) prev.append(prev_values) added[prev_i] = True if debug and not is_gray and cur is color: safe_print("INFO - appending cur to color") cur.append(values) added[i] = True prev_i = i prev_values = values if (len(color) == 2 and color[0][:3] == [0, 0, 0] and color[1][:3] == [100, 100, 100]): if debug: safe_print("INFO - appending color to gray because color " "is only black and white") gray.extend(color) color = [] if sort1: gray.sort(sort1) if sort2: gray.sort(sort2) if debug: for i, values in enumerate(gray): safe_print("%4i" % (i + 1), "GRAY", ("%8.4f " * 3) % tuple(values[:3])) for i, values in enumerate(color): safe_print("%4i" % (i + 1), "COLOR", ("%8.4f " * 3) % tuple(values[:3])) else: color = valueslist checkerboard = [] for valueslist in [gray, color]: if not valueslist: continue split = int(round(len(valueslist) / 2.0)) valueslist1 = valueslist[:split] valueslist2 = valueslist[split:] if shift: # Shift values. # # If split is even: # A1 A2 A3 A4 -> A1 B2 B3 B1 B4 # B1 B2 B3 B4 -> A3 A4 A2 # # If split is uneven: # A1 A2 A3 -> A1 B1 B2 B3 B4 # B1 B2 B3 B4 -> A2 A3 offset = 0 if split == len(valueslist) / 2.0: # Even split offset += 1 valueslist1_orig = list(valueslist1) valueslist2_orig = list(valueslist2) valueslist1 = valueslist2_orig[offset:] valueslist2 = valueslist1_orig[offset + 1:] valueslist1.insert(0, valueslist1_orig[0]) if offset: valueslist1.insert(-1, valueslist2_orig[0]) valueslist2.extend(valueslist1_orig[1:2]) # Interleave. # 1 2 3 4 5 6 7 8 -> 1 5 2 6 3 7 4 8 while valueslist1 or valueslist2: for valueslist in (valueslist1, valueslist2): if valueslist: values = valueslist.pop(0) checkerboard.append(values) if (shift and checkerboard[-1][:3] == [100, 100, 100]): # Move white patch to front if debug: safe_print("INFO - moving white to front") checkerboard.insert(0, checkerboard.pop()) if len(checkerboard) != numvalues: # This should never happen safe_print("Number of patches incorrect after re-ordering (is %i, " "should be %i)" % (len(checkerboard), numvalues)) return False return data.set_RGB_XYZ_values(checkerboard) def sort_RGB_gray_to_top(self): return self.sort_data_RGB_XYZ(sort_RGB_gray_to_top) def sort_RGB_to_top(self, r=0, g=0, b=0): """ Sort quantities of R, G or B (or combinations) to top. Example: sort_RGB_to_top(True, 0, 0) - sort red values to top Example: sort_RGB_to_top(0, True, True) - sort cyan values to top """ if r and g and b: fn = sort_RGB_gray_to_top elif r and g: fn = sort_RGB_to_top_factory(0, 1, 2, 0) elif r and b: fn = sort_RGB_to_top_factory(0, 2, 1, 0) elif g and b: fn = sort_RGB_to_top_factory(1, 2, 0, 1) elif r: fn = sort_RGB_to_top_factory(1, 2, 1, 0) elif g: fn = sort_RGB_to_top_factory(0, 2, 0, 1) elif b: fn = sort_RGB_to_top_factory(0, 1, 0, 2) return self.sort_data_RGB_XYZ(fn) def sort_RGB_white_to_top(self): return self.sort_data_RGB_XYZ(sort_RGB_white_to_top) def sort_by_HSI(self): return self.sort_data_RGB_XYZ(sort_by_HSI) def sort_by_HSL(self): return self.sort_data_RGB_XYZ(sort_by_HSL) def sort_by_HSV(self): return self.sort_data_RGB_XYZ(sort_by_HSV) def sort_by_L(self): return self.sort_data_RGB_XYZ(sort_by_L) def sort_by_RGB(self): return self.sort_data_RGB_XYZ(sort_by_RGB) def sort_by_BGR(self): return self.sort_data_RGB_XYZ(sort_by_BGR) def sort_by_RGB_pow_sum(self): return self.sort_data_RGB_XYZ(sort_by_RGB_pow_sum) def sort_by_RGB_sum(self): return self.sort_data_RGB_XYZ(sort_by_RGB_sum) def sort_by_rec709_luma(self): return self.sort_data_RGB_XYZ(sort_by_rec709_luma) def sort_data_RGB_XYZ(self, cmp=None, key=None, reverse=False): """ Sort RGB/XYZ data """ data, valueslist = self.get_RGB_XYZ_values() if not valueslist: return False valueslist.sort(cmp, key, reverse) return data.set_RGB_XYZ_values(valueslist) @property def modified(self): if self.root: return self.root._modified return self._modified def moveby1(self, start, inc=1): """ Move items from start by icrementing or decrementing their key by inc. """ r = xrange(start, len(self) + 1) if inc > 0: r = reversed(r) for key in r: if key in self: if key + inc < 0: break else: self[key].key += inc self[key + inc] = self[key] if key == len(self) - 1: break def add_data(self, data, key=None): """ Add data to the CGATS structure. data can be a CGATS instance, a dict, a list, a tuple, or a string or unicode instance. """ context = self if self.type == 'DATA': if isinstance(data, (dict, list, tuple)): if self.parent['DATA_FORMAT']: fl, il = len(self.parent['DATA_FORMAT']), len(data) if fl != il: raise CGATSTypeError('DATA entries take exactly %s ' 'values (%s given)' % (fl, il)) dataset = CGATS() i = -1 for item in self.parent['DATA_FORMAT'].values(): i += 1 if isinstance(data, dict): try: value = data[item] except KeyError: raise CGATSKeyError(item) else: value = data[i] if item.upper() in ('INDEX', 'SAMPLE_ID', 'SAMPLEID'): if self.root.normalize_fields and \ item.upper() == 'SAMPLEID': item = 'SAMPLE_ID' # allow alphanumeric INDEX / SAMPLE_ID if isinstance(value, basestring): match = re.match( '(?:\d+|((?:\d*\.\d+|\d+)(?:e[+-]?\d+)?))$', value) if match: if match.groups()[0]: value = float(value) else: value = int(value) elif item.upper() not in ('SAMPLE_NAME', 'SAMPLE_LOC', 'SAMPLENAME'): try: value = float(value) except ValueError: raise CGATSValueError('Invalid data type for ' '%s (expected float, ' 'got %s)' % (item, type(value))) else: strval = str(abs(value)) if (self.parent.type != "CAL" and item.startswith("RGB_") or item.startswith("CMYK_")): # Assuming 0..100, 4 decimal digits is # enough for roughly 19 bits integer # device values parts = strval.split(".") if len(parts) == 2 and len(parts[-1]) > 4: value = round(value, 4) strval = str(abs(value)) lencheck = len(strval.split("e")[0]) if lencheck > self.vmaxlen: self.vmaxlen = lencheck elif self.root.normalize_fields and \ item.upper() == 'SAMPLENAME': item = 'SAMPLE_NAME' dataset[item] = value if type(key) == int: # accept only integer keys. # move existing items self.moveby1(key) else: key = len(self) dataset.key = key dataset.parent = self dataset.root = self.root dataset.type = 'SAMPLE' self[key] = dataset else: raise CGATSInvalidOperationError('Cannot add to DATA ' 'because of missing DATA_FORMAT') else: raise CGATSTypeError('Invalid data type for %s (expected ' 'CGATS, dict, list or tuple, got %s)' % (self.type, type(data))) elif self.type == 'ROOT': if isinstance(data, basestring) and data.find('\n') < 0 and \ data.find('\r') < 0: if type(key) == int: # accept only integer keys. # move existing items self.moveby1(key) else: key = len(self) self[key] = CGATS() self[key].key = key self[key].parent = self self[key].root = self.root self[key].type = data context = self[key] elif not len(self): context = self.add_data(self.file_identifier) # create root element context = context.add_data(data, key) else: raise CGATSTypeError('Invalid data type for %s (expected str ' 'or unicode without line endings, got %s)' % (self.type, type(data))) elif self.type == 'SECTION': if isinstance(data, basestring): if type(key) == int: # accept only integer keys. # move existing items self.moveby1(key) else: key = len(self) self[key] = data else: raise CGATSTypeError('Invalid data type for %s (expected str' 'or unicode, got %s)' % (self.type, type(data))) elif self.type in ('DATA_FORMAT', 'KEYWORDS') or \ (self.parent and self.parent.type == 'ROOT'): if isinstance(data, (dict, list, tuple)): for var in data: if var in ('NUMBER_OF_FIELDS', 'NUMBER_OF_SETS'): self[var] = None else: if isinstance(data, dict): if self.type in ('DATA_FORMAT', 'KEYWORDS'): key, value = len(self), data[var] else: key, value = var, data[var] else: key, value = len(self), var if self.root.normalize_fields: if isinstance(value, basestring): value = value.upper() if value == 'SAMPLEID': value = 'SAMPLE_ID' elif value == 'SAMPLENAME': value = 'SAMPLE_NAME' if var == 'KEYWORD': self.emit_keywords = True if value != 'KEYWORD': self.add_keyword(value) else: safe_print('Warning: cannot add keyword ' '"KEYWORD"') else: if (isinstance(value, basestring) and key not in ("DESCRIPTOR", "ORIGINATOR", "CREATED", "DEVICE_CLASS", "COLOR_REP", "TARGET_INSTRUMENT", "LUMINANCE_XYZ_CDM2", "OBSERVER", "INSTRUMENT", "MANUFACTURER_ID", "MANUFACTURER", "REFERENCE", "REFERENCE_OBSERVER", "DISPLAY", "TECHNOLOGY", "REFERENCE_FILENAME", "REFERENCE_HASH", "TARGET_FILENAME", "TARGET_HASH", "FIT_METHOD")): match = re.match( '(?:\d+|((?:\d*\.\d+|\d+)(?:e[+-]?\d+)?))$', value) if match: if match.groups()[0]: value = float(value) else: value = int(value) if self.type in ('DATA_FORMAT', 'KEYWORDS'): raise CGATSTypeError('Invalid data ' 'type for %s ' '(expected str ' 'or unicode, got ' '%s)' % (self.type, type(value))) self[key] = value else: raise CGATSTypeError('Invalid data type for %s (expected ' 'CGATS, dict, list or tuple, got %s)' % (self.type, type(data))) else: raise CGATSInvalidOperationError('Cannot add data to %s' % self.type) return context def export_3d(self, filename, colorspace="RGB", RGB_black_offset=40, normalize_RGB_white=False, compress=True, format="VRML"): if colorspace not in ("DIN99", "DIN99b", "DIN99c", "DIN99d", "LCH(ab)", "LCH(uv)", "Lab", "Luv", "Lu'v'", "RGB", "xyY", "HSI", "HSL", "HSV", "ICtCp", "IPT", "Lpt"): raise ValueError("export_3d: Unknown colorspace %r" % colorspace) import x3dom data = self.queryv1("DATA") if self.queryv1("ACCURATE_EXPECTED_VALUES") == "true": cat = "Bradford" else: cat = "XYZ scaling" radius = 15.0 / (len(data) ** (1.0 / 3.0)) scale = 1.0 if colorspace.startswith("DIN99"): if colorspace == "DIN99": scale = 100.0 / 40 else: scale = 100.0 / 50 radius /= scale white = data.queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if white: white = white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] else: white = "D50" white = colormath.get_whitepoint(white) d50 = colormath.get_whitepoint("D50") if colorspace == "Lu'v'": white_u_, white_v_ = colormath.XYZ2Lu_v_(*d50)[1:] elif colorspace == "xyY": white_x, white_y = colormath.XYZ2xyY(*d50)[:2] vrml = """#VRML V2.0 utf8 Transform { children [ NavigationInfo { type "EXAMINE" } DirectionalLight { direction 0 0 -1 direction 0 -1 0 } Viewpoint { fieldOfView %(fov)s position 0 0 %(z)s } %(axes)s %(children)s ] } """ child = """ # Sphere Transform { translation %(x).6f %(y).6f %(z).6f children [ Shape{ geometry Sphere { radius %(radius).6f} appearance Appearance { material Material { diffuseColor %(R).6f %(G).6f %(B).6f} } } ] } """ axes = "" if (colorspace not in ("Lab", "Luv", "ICtCp", "IPT", "Lpt") and not colorspace.startswith("DIN99")): if colorspace in ("Lu'v'", "xyY"): maxz = scale = 100 maxxy = 200 radius /= 2.0 if colorspace == "Lu'v'": xlabel, ylabel, zlabel = "u' 0.6", "v' 0.6", "L* 100" offsetx, offsety = -.3, -.3 scale = maxxy / .6 else: xlabel, ylabel, zlabel = "x 0.8", "y 0.8", "Y 100" offsetx, offsety = -.4, -.4 scale = maxxy / .8 axes = x3dom.get_vrml_axes(xlabel, ylabel, zlabel, offsetx * scale, offsety * scale, 0, maxxy, maxxy, maxz) elif colorspace in ("LCH(ab)", "LCH(uv)"): if colorspace == "LCH(ab)": xlabel, ylabel, zlabel = "H(ab)", "C(ab)", "L*" else: xlabel, ylabel, zlabel = "H(uv)", "C(uv)", "L*" axes = x3dom.get_vrml_axes(xlabel, ylabel, zlabel, -180, -100, 0, 360, 200, 100, False) else: pxcolor = "1.0 0.0 0.0" nxcolor = "0.0 1.0 0.0" pycolor = "1.0 1.0 0.0" nycolor = "0.0 0.0 1.0" if colorspace.startswith("DIN99"): axes += """Transform { translation %.1f %.1f -50.0 children [ Shape { geometry Text { string ["%s"] fontStyle FontStyle { family "SANS" style "BOLD" size %.1f } } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7 } } } ] } """ % (100 / scale, 100 / scale, colorspace, 10.0 / scale) (pxlabel, nxlabel, pylabel, nylabel, pllabel) = ('"a", "+%i"' % (100 / scale), '"a", "-%i"' % (100 / scale), '"b +%i"' % (100 / scale), '"b -%i"' % (100 / scale), '"L", "+100"') elif colorspace == "ICtCp": scale = 2.0 radius /= 2.0 (pxlabel, nxlabel, pylabel, nylabel, pllabel) = ('"Ct", "+%.1f"' % .5, '"Ct", "-%.1f"' % .5, '"Cp +%.1f"' % .5, '"Cp -%.1f"' % .5, '"I"') pxcolor = "0.5 0.0 1.0" nxcolor = "0.8 1.0 0.0" pycolor = "1.0 0.0 0.25" nycolor = "0.0 1.0 1.0" elif colorspace == "IPT": (pxlabel, nxlabel, pylabel, nylabel, pllabel) = ('"P", "+%.1f"' % 1, '"P", "-%.1f"' % 1, '"T +%.1f"' % 1, '"T -%.1f"' % 1, '"I"') else: if colorspace == "Luv": x = "u" y = "v" elif colorspace == "Lpt": x = "p" y = "t" else: x = "a" y = "b" (pxlabel, nxlabel, pylabel, nylabel, pllabel) = ('"%s*", "+100"' % x, '"%s*", "-100"' % x, '"%s* +100"' % y, '"%s* -100"' % y, '"L*", "+100"') values = {"wh": 2.0 / scale, "ab": 100.0 / scale, "aboffset": 50.0 / scale, "fontsize": 10.0 / scale, "ap": 102.0 / scale, "an": 108.0 / scale, "Ln": 3.0, "bp0": 3.0, "bp1": 103.0 / scale, "bn0": 3.0, "bn1": 107.0 / scale, "pxlabel": pxlabel, "nxlabel": nxlabel, "pylabel": pylabel, "nylabel": nylabel, "pllabel": pllabel, "pxcolor": pxcolor, "nxcolor": nxcolor, "pycolor": pycolor, "nycolor": nycolor} axes += """# L* axis Transform { translation 0.0 0.0 0.0 children [ Shape { geometry Box { size %(wh).1f %(wh).1f 100.0 } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7 } } } ] } # L* axis label Transform { translation -%(Ln).1f -%(wh).1f 55.0 children [ Shape { geometry Text { string [%(pllabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7} } } ] } # +x axis Transform { translation %(aboffset).1f 0.0 -50.0 children [ Shape { geometry Box { size %(ab).1f %(wh).1f %(wh).1f } appearance Appearance { material Material { diffuseColor %(pxcolor)s } } } ] } # +x axis label Transform { translation %(ap).1f -%(wh).1f -50.0 children [ Shape { geometry Text { string [%(pxlabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor %(pxcolor)s } } } ] } # -x axis Transform { translation -%(aboffset).1f 0.0 -50.0 children [ Shape { geometry Box { size %(ab).1f %(wh).1f %(wh).1f } appearance Appearance { material Material { diffuseColor %(nxcolor)s } } } ] } # -x axis label Transform { translation -%(an).1f -%(wh).1f -50.0 children [ Shape { geometry Text { string [%(nxlabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor %(nxcolor)s } } } ] } # +y axis Transform { translation 0.0 %(aboffset).1f -50.0 children [ Shape { geometry Box { size %(wh).1f %(ab).1f %(wh).1f } appearance Appearance { material Material { diffuseColor %(pycolor)s } } } ] } # +y axis label Transform { translation -%(bp0).1f %(bp1).1f -50.0 children [ Shape { geometry Text { string [%(pylabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor %(pycolor)s } } } ] } # -y axis Transform { translation 0.0 -%(aboffset).1f -50.0 children [ Shape { geometry Box { size %(wh).1f %(ab).1f %(wh).1f } appearance Appearance { material Material { diffuseColor %(nycolor)s } } } ] } # -y axis label Transform { translation -%(bn0).1f -%(bn1).1f -50.0 children [ Shape { geometry Text { string [%(nylabel)s] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor %(nycolor)s } } } ] } # Zero Transform { translation -%(Ln).1f -%(wh).1f -55.0 children [ Shape { geometry Text { string ["0"] fontStyle FontStyle { family "SANS" style "BOLD" size %(fontsize).1f } } appearance Appearance { material Material { diffuseColor 0.7 0.7 0.7} } } ] } """ % values children = [] sqrt3_100 = math.sqrt(3) * 100 sqrt3_50 = math.sqrt(3) * 50 for entry in data.itervalues(): X, Y, Z = colormath.adapt(entry["XYZ_X"], entry["XYZ_Y"], entry["XYZ_Z"], white, "D65" if colorspace in ("ICtCp", "IPT") else "D50", cat=cat) L, a, b = colormath.XYZ2Lab(X, Y, Z) if colorspace == "RGB": # Fudge device locations into Lab space x, y, z = (entry["RGB_G"] - 50, entry["RGB_B"] - 50, entry["RGB_R"] - 50) elif colorspace == "HSI": H, S, z = colormath.RGB2HSI(entry["RGB_R"] / 100.0, entry["RGB_G"] / 100.0, entry["RGB_B"] / 100.0) rad = H * 360 * math.pi / 180 x, y = S * z * math.cos(rad), S * z * math.sin(rad) # Fudge device locations into Lab space x, y, z = x * sqrt3_100, y * sqrt3_100, z * sqrt3_100 - sqrt3_50 elif colorspace == "HSL": H, S, z = colormath.RGB2HSL(entry["RGB_R"] / 100.0, entry["RGB_G"] / 100.0, entry["RGB_B"] / 100.0) rad = H * 360 * math.pi / 180 if z > .5: S *= 1 - z else: S *= z x, y = S * math.cos(rad), S * math.sin(rad) # Fudge device locations into Lab space x, y, z = x * sqrt3_100, y * sqrt3_100, z * sqrt3_100 - sqrt3_50 elif colorspace == "HSV": H, S, z = colormath.RGB2HSV(entry["RGB_R"] / 100.0, entry["RGB_G"] / 100.0, entry["RGB_B"] / 100.0) rad = H * 360 * math.pi / 180 x, y = S * z * math.cos(rad), S * z * math.sin(rad) # Fudge device locations into Lab space x, y, z = x * sqrt3_50, y * sqrt3_50, z * sqrt3_100 - sqrt3_50 elif colorspace == "Lab": x, y, z = a, b, L - 50 elif colorspace in ("DIN99", "DIN99b"): if colorspace == "DIN99": L99, a99, b99 = colormath.Lab2DIN99(L, a, b) else: L99, a99, b99 = colormath.Lab2DIN99b(L, a, b) x, y, z = a99, b99, L99 - 50 elif colorspace in ("DIN99c", "DIN99d"): if colorspace == "DIN99c": L99, a99, b99 = colormath.XYZ2DIN99c(X, Y, Z) else: L99, a99, b99 = colormath.XYZ2DIN99d(X, Y, Z) x, y, z = a99, b99, L99 - 50 elif colorspace in ("LCH(ab)", "LCH(uv)"): if colorspace == "LCH(ab)": L, C, H = colormath.Lab2LCHab(L, a, b) else: L, u, v = colormath.XYZ2Luv(X, Y, Z) L, C, H = colormath.Luv2LCHuv(L, u, v) x, y, z = H - 180, C - 100, L - 50 elif colorspace == "Luv": L, u, v = colormath.XYZ2Luv(X, Y, Z) x, y, z = u, v, L - 50 elif colorspace == "Lu'v'": L, u_, v_ = colormath.XYZ2Lu_v_(X, Y, Z) x, y, z = ((u_ + offsetx) * scale, (v_ + offsety) * scale, L / 100.0 * maxz - 50) elif colorspace == "xyY": x, y, Y = colormath.XYZ2xyY(X, Y, Z) x, y, z = ((x + offsetx) * scale, (y + offsety) * scale, Y / 100.0 * maxz - 50) elif colorspace == "ICtCp": I, Ct, Cp = colormath.XYZ2ICtCp(X / 100.0, Y / 100.0, Z / 100.0, clamp=False) x, y, z = Ct * 100, Cp * 100, I * 100 - 50 elif colorspace == "IPT": I, P, T = colormath.XYZ2IPT(X / 100.0, Y / 100.0, Z / 100.0) x, y, z = P * 100, T * 100, I * 100 - 50 elif colorspace == "Lpt": L, p, t = colormath.XYZ2Lpt(X, Y, Z) x, y, z = p, t, L - 50 if RGB_black_offset != 40: # Keep reference hue and saturation # Lab to sRGB using reference black offset of 40 like Argyll CMS R, G, B = colormath.Lab2RGB(L * (100.0 - 40.0) / 100.0 + 40.0, a, b, scale=.7, noadapt=not normalize_RGB_white) H_ref, S_ref, V_ref = colormath.RGB2HSV(R, G, B) # Lab to sRGB using actual black offset R, G, B = colormath.Lab2RGB(L * (100.0 - RGB_black_offset) / 100.0 + RGB_black_offset, a, b, scale=.7, noadapt=not normalize_RGB_white) if RGB_black_offset != 40: H, S, V = colormath.RGB2HSV(R, G, B) # Use reference H and S to go back to RGB R, G, B = colormath.HSV2RGB(H_ref, S_ref, V) children.append(child % {"x": x, "y": y, "z": z, "R": R + .05, "G": G + .05, "B": B + .05, "radius": radius}) children = "".join(children) # Choose viewpoint fov and z position based on colorspace fov = 45 z = 340 if colorspace in ("LCH(ab)", "LCH(uv)"): # Use a very narrow field of view for LCH fov /= 16.0 z *= 16 elif colorspace.startswith("DIN99") or colorspace == "ICtCp": fov /= scale out = vrml % {"children": children, "axes": axes, "fov": fov / 180.0 * math.pi, "z": z} if format != "VRML": safe_print("Generating", format) x3d = x3dom.vrml2x3dom(out) if format == "HTML": out = x3d.html(title=os.path.basename(filename)) else: out = x3d.x3d() if compress: writer = GzipFileProper else: writer = open safe_print("Writing", filename) with writer(filename, "wb") as outfile: outfile.write(out) @property def NUMBER_OF_FIELDS(self): """Get number of fields""" if 'DATA_FORMAT' in self: return len(self['DATA_FORMAT']) return 0 @property def NUMBER_OF_SETS(self): """Get number of sets""" if 'DATA' in self: return len(self['DATA']) return 0 def query(self, query, query_value = None, get_value = False, get_first = False): """ Return CGATS object of items or values where query matches. Query can be a dict with key / value pairs, a tuple or a string. Return empty CGATS object if no matching items found. """ modified = self.modified if not get_first: result = CGATS() else: result = None if not isinstance(query, dict): if type(query) not in (list, tuple): query = (query, ) items = [self] + [self[key] for key in self] for item in items: if isinstance(item, (dict, list, tuple)): if not get_first: n = len(result) if get_value: result_n = CGATS() else: result_n = None match_count = 0 for query_key in query: if query_key in item or (type(item) is CGATS and ((query_key == 'NUMBER_OF_FIELDS' and 'DATA_FORMAT' in item) or (query_key == 'NUMBER_OF_SETS' and 'DATA' in item))): if query_value is None and isinstance(query, dict): current_query_value = query[query_key] else: current_query_value = query_value if current_query_value != None: if item[query_key] != current_query_value: break if get_value: result_n[len(result_n)] = item[query_key] match_count += 1 else: break if match_count == len(query): if not get_value: result_n = item if result_n != None: if get_first: if get_value and isinstance(result_n, dict) and \ len(result_n) == 1: result = result_n[0] else: result = result_n break elif len(result_n): if get_value and isinstance(result_n, dict) and \ len(result_n) == 1: result[n] = result_n[0] else: result[n] = result_n if type(item) == CGATS and item != self: result_n = item.query(query, query_value, get_value, get_first) if result_n != None: if get_first: result = result_n break elif len(result_n): for i in result_n: n = len(result) if result_n[i] not in result.values(): result[n] = result_n[i] if isinstance(result, CGATS): result.setmodified(modified) return result def queryi(self, query, query_value=None): """ Query and return matching items. See also query method. """ return self.query(query, query_value, get_value=False, get_first=False) def queryi1(self, query, query_value=None): """ Query and return first matching item. See also query method. """ return self.query(query, query_value, get_value=False, get_first=True) def queryv(self, query, query_value=None): """ Query and return matching values. See also query method. """ return self.query(query, query_value, get_value=True, get_first=False) def queryv1(self, query, query_value=None): """ Query and return first matching value. See also query method. """ return self.query(query, query_value, get_value=True, get_first=True) def remove(self, item): """ Remove an item from the internal CGATS structure. """ if type(item) == CGATS: key = item.key else: key = item maxindex = len(self) - 1 result = self[key] if type(key) == int and key != maxindex: self.moveby1(key + 1, -1) name = len(self) - 1 if (self.type not in ('DATA', 'DATA_FORMAT', 'KEYWORDS', 'SECTION') and name in self._keys): self._keys.remove(name) dict.pop(self, name) self.setmodified() return result def convert_XYZ_to_Lab(self): """ Convert XYZ to D50 L*a*b* and add it as additional fields """ color_rep = (self.queryv1("COLOR_REP") or "").split("_") if color_rep[1] == "LAB": # Nothing to do return if (len(color_rep) != 2 or color_rep[0] not in ("RGB", "CMYK") or color_rep[1] != "XYZ"): raise NotImplementedError("Got unsupported color representation %s" % "_".join(color_rep)) data = self.queryv1("DATA") if not data: raise CGATSError("No data") if color_rep[0] == "RGB": white = data.queryv1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) elif color_rep[0] == "CMYK": white = data.queryv1({"CMYK_C": 0, "CMYK_M": 0, "CMYK_Y": 0, "CMYK_K": 0}) if not white: raise CGATSError("Missing white patch") device_labels = [] for channel in color_rep[0]: device_labels.append(color_rep[0] + "_" + channel) # Always XYZ cie_labels = [] for channel in color_rep[1]: cie_labels.append(color_rep[1] + "_" + channel) # Add entries to DATA_FORMAT Lab_data_format = ("LAB_L", "LAB_A", "LAB_B") for label in Lab_data_format: if not label in data.parent.DATA_FORMAT.values(): data.parent.DATA_FORMAT.add_data((label, )) # Add L*a*b* to each sample for key, sample in data.iteritems(): cie_values = [sample[label] for label in cie_labels] Lab = colormath.XYZ2Lab(*cie_values) for i, label in enumerate(Lab_data_format): sample[label] = Lab[i] def fix_zero_measurements(self, warn_only=False, logfile=safe_print): """ Fix (or warn about) <= zero measurements If XYZ/Lab = 0, the sample gets removed. If only one component of XYZ/Lab is <= 0, it gets fudged so that the component is nonzero (because otherwise, Argyll's colprof will remove it, which can have bad effects if it's an 'essential' sample) """ color_rep = (self.queryv1("COLOR_REP") or "").split("_") data = self.queryv1("DATA") if len(color_rep) == 2 and data: # Check for XYZ/Lab = 0 readings cie_labels = [] for channel in color_rep[1]: cie_labels.append(color_rep[1] + "_" + channel) device_labels = [] for channel in color_rep[0]: device_labels.append(color_rep[0] + "_" + channel) remove = [] for key, sample in data.iteritems(): cie_values = [sample[label] for label in cie_labels] # Check if zero if filter(lambda v: v, cie_values): # Not all zero. Check if some component(s) equal or below zero if min(cie_values) <= 0: for label in cie_labels: if sample[label] <= 0: if warn_only: if logfile: logfile.write("Warning: Sample ID %i (RGB %s) has %s <= 0!\n" % (sample.SAMPLE_ID, " ".join(str(sample.queryv1(device_labels)).split()), label)) else: # Fudge to be nonzero sample[label] = 0.000001 if logfile: logfile.write("Fudged sample ID %i (RGB %s) %s to be non-zero\n" % (sample.SAMPLE_ID, " ".join(str(sample.queryv1(device_labels)).split()), label)) continue # All zero device_values = [sample[label] for label in device_labels] if not max(device_values): # Skip device black continue if warn_only: if logfile: logfile.write("Warning: Sample ID %i (RGB %s) has %s = 0!\n" % (sample.SAMPLE_ID, " ".join(str(sample.queryv1(device_labels)).split()), color_rep[1])) else: # Queue sample for removal remove.insert(0, sample) if logfile: logfile.write("Removed sample ID %i (RGB %s) with %s = 0\n" % (sample.SAMPLE_ID, " ".join(str(sample.queryv1(device_labels)).split()), color_rep[1])) for sample in remove: # Remove sample data.pop(sample) def fix_device_values_scaling(self, color_rep=None): """ Attempt to fix device value scaling so that max = 100 Return number of fixed DATA sections """ fixed = 0 for labels in get_device_value_labels(color_rep): for dataset in self.query("DATA").itervalues(): for item in dataset.queryi(labels).itervalues(): for label in labels: if item[label] > 100: dataset.scale_device_values(color_rep=color_rep) fixed += 1 break return fixed def quantize_device_values(self, bits=8): """ Quantize device values to n bits """ q = 2 ** bits - 1.0 for data in self.queryv("DATA").itervalues(): if data.parent.type == "CAL": maxv = 1.0 else: maxv = 100.0 color_rep = (data.parent.queryv1("COLOR_REP") or "").split("_")[0] for labels in get_device_value_labels(color_rep): for item in data.queryi(labels).itervalues(): for label in labels: item[label] = round(item[label] / maxv * q) / q * maxv def scale_device_values(self, factor=100.0 / 255, color_rep=None): """ Scales device values by multiplying with factor. """ for labels in get_device_value_labels(color_rep): for data in self.queryv("DATA").itervalues(): for item in data.queryi(labels).itervalues(): for label in labels: item[label] *= factor def adapt(self, whitepoint_source=None, whitepoint_destination=None, cat="Bradford"): """ Perform chromatic adaptation if possible (needs XYZ or LAB) Return number of affected DATA sections. """ n = 0 for dataset in self.query("DATA").itervalues(): if not dataset.has_cie(): continue if not whitepoint_source: whitepoint_source = dataset.get_white_cie("XYZ") if whitepoint_source: n += 1 for item in dataset.queryv1("DATA").itervalues(): if "XYZ_X" in item: X, Y, Z = item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] else: X, Y, Z = colormath.Lab2XYZ(item["LAB_L"], item["LAB_A"], item["LAB_B"], scale=100) X, Y, Z = colormath.adapt(X, Y, Z, whitepoint_source, whitepoint_destination, cat) if "LAB_L" in item: (item["LAB_L"], item["LAB_A"], item["LAB_B"]) = colormath.XYZ2Lab(X, Y, Z) if "XYZ_X" in item: item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] = X, Y, Z return n def apply_bpc(self, bp_out=(0, 0, 0), weight=False): """ Apply black point compensation. Scales XYZ so that black (RGB 0) = zero. Needs a CGATS structure with RGB and XYZ data and atleast one black and white patch. Return number of affected DATA sections. """ n = 0 for dataset in self.query("DATA").itervalues(): if dataset.type.strip() == "CAL": is_Lab = False labels = ("RGB_R", "RGB_G", "RGB_B") data = dataset.queryi(labels) # Get black black1 = data.queryi1({"RGB_I": 0}) # Get white white1 = data.queryi1({"RGB_I": 1}) if not black1 or not white1: # Can't apply bpc continue black = [] white = [] for label in labels: black.append(black1[label]) white.append(white1[label]) max_v = 1.0 else: is_Lab = "_LAB" in (dataset.queryv1("COLOR_REP") or "") if is_Lab: labels = ("LAB_L", "LAB_A", "LAB_B") index = 0 # Index of L* in labels else: labels = ("XYZ_X", "XYZ_Y", "XYZ_Z") index = 1 # Index of Y in labels data = dataset.queryi(("RGB_R", "RGB_G", "RGB_B") + labels) # Get blacks blacks = data.queryi({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}) # Get whites whites = data.queryi({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if not blacks or not whites: # Can't apply bpc continue black = [0, 0, 0] for i in blacks: if blacks[i][labels[index]] > black[index]: for j, label in enumerate(labels): black[j] = blacks[i][label] if is_Lab: black = colormath.Lab2XYZ(*black) white = [0, 0, 0] for i in whites: if whites[i][labels[index]] > white[index]: for j, label in enumerate(labels): white[j] = whites[i][label] if is_Lab: max_v = 100.0 white = colormath.Lab2XYZ(*white) else: max_v = white[1] black = [v / max_v for v in black] white = [v / max_v for v in white] # Apply black point compensation n += 1 for i in data: values = data[i].queryv1(labels).values() if is_Lab: values = colormath.Lab2XYZ(*values) else: values = [v / max_v for v in values] if weight: values = colormath.apply_bpc(values[0], values[1], values[2], black, bp_out, white, weight) else: values = colormath.blend_blackpoint(values[0], values[1], values[2], black, bp_out) values = [v * max_v for v in values] if is_Lab: values = colormath.XYZ2Lab(*values) for j, label in enumerate(labels): if is_Lab and j > 0: data[i][label] = values[j] else: data[i][label] = max(0.0, values[j]) return n def get_white_cie(self, colorspace=None): """ Get the 'white' from the CIE values (if any). """ data_format = self.has_cie() if data_format: if "RGB_R" in data_format.values(): white = {"RGB_R": 100, "RGB_G": 100, "RGB_B": 100} elif "CMYK_C" in data_format.values(): white = {"CMYK_C": 0, "CMYK_M": 0, "CMYK_Y": 0, "CMYK_K": 0} else: white = None if white: white = self.queryi1(white) if not white: for key in ("LUMINANCE_XYZ_CDM2", "APPROX_WHITE_POINT"): white = self.queryv1(key) if white: try: white = [float(v) for v in white.split()] except ValueError: white = None else: if len(white) == 3: white = [v / white[1] * 100 for v in white] white = {"XYZ_X": white[0], "XYZ_Y": white[1], "XYZ_Z": white[2]} break else: white = None if not white: return if white and (("XYZ_X" in white and "XYZ_Y" in white and "XYZ_Z" in white) or ("LAB_L" in white and "LAB_B" in white and "LAB_B" in white)): if colorspace == "XYZ": if "XYZ_X" in white: return white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] else: return colormath.Lab2XYZ(white["LAB_L"], white["LAB_A"], white["LAB_B"], scale=100) elif colorspace == "Lab": if "LAB_L" in white: return white["LAB_L"], white["LAB_A"], white["LAB_B"] else: return colormath.XYZ2Lab(white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"]) return white def has_cie(self): """ Check if DATA_FORMAT defines any CIE XYZ or LAB columns. Return the DATA_FORMAT on success or None on failure. """ data_format = self.queryv1("DATA_FORMAT") if data_format: cie = {} for ch in ("L", "A", "B"): cie[ch] = "LAB_%s" % ch in data_format.values() if len(cie.values()) in (0, 3): for ch in ("X", "Y", "Z"): cie[ch] = "XYZ_%s" % ch in data_format.values() if len(filter(lambda v: v is not None, cie.itervalues())) in (3, 6): return data_format pop = remove def write(self, stream_or_filename=None): """ Write CGATS text to stream. """ if not stream_or_filename: stream_or_filename = self.filename if isinstance(stream_or_filename, basestring): stream = open(stream_or_filename, "w") else: stream = stream_or_filename stream.write(str(self)) if isinstance(stream_or_filename, basestring): stream.close() DisplayCAL-3.5.0.0/DisplayCAL/chromecast_patterngenerator.py0000644000076500000000000000641513125210435023573 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from time import sleep # 0install: Make sure imported protobuf is from implementation to ensure # correct version import sys if not getattr(sys, "frozen", False): import os import re for pth in sys.path: if (os.path.basename(pth).startswith("protobuf-") and re.match("sha\d+(?:new)?", os.path.basename(os.path.dirname(pth)))): if "google" in sys.modules: del sys.modules["google"] try: import pkg_resources except ImportError: import pkgutil syspath = sys.path[:] sys.path[:] = [pth] import google.protobuf sys.path[:] = syspath break from pychromecast import get_chromecasts from pychromecast.controllers import BaseController import localization as lang from log import safe_print class ChromeCastPatternGeneratorController(BaseController): def __init__(self): super(ChromeCastPatternGeneratorController, self).__init__( "urn:x-cast:net.hoech.cast.patterngenerator", "B5C2CBFC") self.request_id = 0 def receive_message(self, message, data): return True # Indicate we handled this message def send(self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), offset_x=0.5, offset_y=0.5, h_scale=1, v_scale=1): fg = "#%02X%02X%02X" % tuple(round(v * 255) for v in rgb) bg = "#%02X%02X%02X" % tuple(round(v * 255) for v in bgrgb) self.request_id += 1 self.send_message({"requestId": self.request_id, "foreground": fg, "offset": [offset_x, offset_y], "scale": [h_scale, v_scale], "background": bg}) class ChromeCastPatternGenerator(object): def __init__(self, name, logfile=None): self._controller = ChromeCastPatternGeneratorController() self.name = name self.listening = False self.logfile = logfile def disconnect_client(self): self.listening = False if hasattr(self, "_cc"): if self._cc.app_id: self._cc.quit_app() if hasattr(self, "conn"): del self.conn def send(self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), bits=None, use_video_levels=None, x=0, y=0, w=1, h=1): if w < 1: x /= (1.0 - w) else: x = 0 if h < 1: y /= (1.0 - h) else: y = 0 self._controller.send(rgb, bgrgb, x, y, w * 10, h * 10) def wait(self): self.listening = True if self.logfile: self.logfile.write(lang.getstr("connecting.to", ("Chromecast", " " + self.name)) + "\n") if not hasattr(self, "_cc"): # Find our ChromeCast try: self._cc = next(cc for cc in get_chromecasts() if cc.device.friendly_name == self.name) except StopIteration: self.listening = False raise self._cc.register_handler(self._controller) # Wait for ChromeCast device to be ready while self.listening: self._cc.wait(0.05) if self._cc.status: break if self.listening: # Launch pattern generator app self._controller.launch() # Wait for it while (self.listening and self._cc.app_id != self._controller.supporting_app_id): sleep(0.05) self.conn = True safe_print(lang.getstr("connection.established")) if __name__ == "__main__": pg = ChromeCastPatternGenerator(u"Smörebröd") # Find our ChromeCast and connect to it, then launch the pattern generator # app on the ChromeCast device pg.wait() # Display test color (yellow window on blue background) pg.send((1, 1, 0), (0, 0, 1), x=0.375, y=0.375, w=0.25, h=0.25) DisplayCAL-3.5.0.0/DisplayCAL/colord.py0000644000076500000000000002463213242301247017264 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement from binascii import hexlify import os import re import subprocess as sp import sys import warnings from time import sleep from options import use_gi try: if not use_gi: raise ImportError("") from gi.repository import Colord from gi.repository import Gio except ImportError: Colord = None Gio = None else: cancellable = Gio.Cancellable.new(); if sys.platform not in ("darwin", "win32"): from defaultpaths import xdg_data_home from util_os import which from util_str import safe_str, safe_unicode import localization as lang if not Colord or not hasattr(Colord, 'quirk_vendor_name'): from config import get_data_path import demjson quirk_cache = {'suffixes': [], 'vendor_names': {}} prefix = "/org/freedesktop/ColorManager/" device_ids = {} def client_connect(): """ Connect to colord """ client = Colord.Client.new() # Connect to colord if not client.connect_sync(cancellable): raise CDError("Couldn't connect to colord") return client def device_connect(client, device_id): """ Connect to device """ if isinstance(device_id, unicode): device_id = device_id.encode('UTF-8') try: device = client.find_device_sync(device_id, cancellable) except Exception, exception: raise CDError(exception.args[0]) # Connect to device if not device.connect_sync(cancellable): raise CDError("Couldn't connect to device with ID %r" % device_id) return device def device_id_from_edid(edid, quirk=True, use_serial_32=True, truncate_edid_strings=False, omit_manufacturer=False, query=False): """ Assemble device key from EDID """ # https://github.com/hughsie/colord/blob/master/doc/device-and-profile-naming-spec.txt # Should match device ID returned by gcm_session_get_output_id in # gnome-settings-daemon/plugins/color/gsd-color-state.c # and Edid::deviceId in colord-kde/colord-kded/Edid.cpp respectively if "hash" in edid: device_id = device_ids.get(edid["hash"]) if device_id: return device_id elif sys.platform not in ("darwin", "win32") and (query and which("colormgr")): try: device = find("device-by-property", ["OutputEdidMd5", edid["hash"]]) except CDError, exception: warnings.warn(safe_str(exception), Warning) else: device_id = re.search(r":\s*(xrandr-[^\r\n]+)", device) if device_id: device_id = device_id.groups()[0] device_ids[edid["hash"]] = device_id return device_id parts = ["xrandr"] edid_keys = ["monitor_name", "serial_ascii"] if not omit_manufacturer: edid_keys.insert(0, "manufacturer") if use_serial_32: edid_keys.append("serial_32") for name in edid_keys: value = edid.get(name) if value: if name == "serial_32" and "serial_ascii" in edid: # Only add numeric serial if no ascii serial continue elif name == "manufacturer": if quirk: value = quirk_manufacturer(value) elif isinstance(value, basestring) and truncate_edid_strings: # Older versions of colord used only the first 12 bytes value = value[:12] parts.append(str(value)) if len(parts) > 1: device_id = "-".join(parts) return device_id def find(what, search): colormgr = which("colormgr") if not colormgr: raise CDError("colormgr helper program not found") if not isinstance(search, list): search = [search] args = ["find-%s" % what] + search try: p = sp.Popen([safe_str(colormgr)] + args, stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception, exception: raise CDError(safe_str(exception)) else: errmsg = "Could not find %s for %s" % (what, search) if p.returncode != 0: raise CDObjectQueryError(stdout.strip() or errmsg) result = stdout.strip() if not result: raise CDObjectNotFoundError(errmsg) return result def get_default_profile(device_id): """ Get default profile filename for device """ if not Colord: colormgr = which("colormgr") if not colormgr: raise CDError("colormgr helper program not found") # Find device object path device = get_object_path(device_id, "device") # Get default profile try: p = sp.Popen([safe_str(colormgr), "device-get-default-profile", device], stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception, exception: raise CDError(safe_str(exception)) else: errmsg = "Couldn't get default profile for device %s" % device_id if p.returncode != 0: raise CDError(stdout.strip() or errmsg) match = re.search(":\s*([^\r\n]+\.ic[cm])", stdout, re.I) if match: return safe_unicode(match.groups()[0]) else: raise CDError(errmsg) client = client_connect() # Connect to existing device device = device_connect(client, device_id) # Get default profile profile = device.get_default_profile() if not profile: # No assigned profile return # Connect to profile if not profile.connect_sync(cancellable): raise CDError("Couldn't get default profile for device ID %r" % device_id) filename = profile.get_filename() if not isinstance(filename, unicode): filename = filename.decode('UTF-8') return filename def get_display_device_ids(): displays = [] colormgr = which("colormgr") if not colormgr: raise CDError("colormgr helper program not found") try: p = sp.Popen([safe_str(colormgr), "get-devices-by-kind", "display"], stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception, exception: raise CDError(safe_str(exception)) else: for line in stdout.splitlines(): item = line.split(":", 1) if len(item) > 1 and item[1].strip().startswith("xrandr-"): # Found device ID displays.append(item[1].strip()) return displays def get_object_path(search, object_type): result = find(object_type, search) if result: result = result.splitlines()[0].split(":", 1)[-1].strip() if not result: raise CDObjectNotFoundError("Could not find object path for %s" % search) return result def install_profile(device_id, profile, profile_installname=None, timeout=20, logfn=None): """ Install profile for device profile_installname filename of the installed profile (full path). The profile is copied to this location. If profile_installname is None, it defaults to ~/.local/share/icc/ timeout Time to allow for colord to pick up new profiles (recommended not below 2 secs) """ if profile.ID == "\0" * 16: profile.calculateID() profile_id = "icc-" + hexlify(profile.ID) # Write profile to destination if not profile_installname: profile_installname = os.path.join(xdg_data_home, 'icc', os.path.basename(profile.fileName)) profile_installdir = os.path.dirname(profile_installname) if not os.path.isdir(profile_installdir): os.makedirs(profile_installdir) profile.write(profile_installname) if isinstance(profile_installname, unicode): profile_installname = profile_installname.encode('UTF-8') if Colord: client = client_connect() else: colormgr = which("colormgr") if not colormgr: raise CDError("colormgr helper program not found") profile = None # Query colord for newly added profile for i in xrange(int(timeout / 1.0)): try: if Colord: profile = client.find_profile_sync(profile_id, cancellable) else: profile = get_object_path(profile_id, "profile") except CDObjectQueryError, exception: # Profile not found pass if profile: break # Give colord time to pick up the profile sleep(1) if not profile: raise CDTimeout("Querying for profile %r returned no result for %s secs" % (profile_id, timeout)) errmsg = "Could not make profile %s default for device %s" % (profile_id, device_id) if Colord: # Connect to profile if not profile.connect_sync(cancellable): raise CDError("Could not connect to profile") # Connect to existing device device = device_connect(client, device_id) # Add profile to device try: device.add_profile_sync(Colord.DeviceRelation.HARD, profile, cancellable) except Exception, exception: # Profile may already have been added warnings.warn(safe_str(exception), Warning) # Make profile default for device if not device.make_profile_default_sync(profile, cancellable): raise CDError(errmsg) else: # Find device object path device = get_object_path(device_id, "device") if logfn: logfn("-" * 80) logfn(lang.getstr("commandline")) from worker import printcmdline cmd = safe_str(colormgr) # Add profile to device # (Ignore returncode as profile may already have been added) args = [cmd, "device-add-profile", device, profile] printcmdline(args[0], args[1:], fn=logfn) if logfn: logfn("") try: p = sp.Popen(args, stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception, exception: raise CDError(safe_str(exception)) if logfn and stdout.strip(): logfn(stdout.strip()) if logfn: logfn("") logfn(lang.getstr("commandline")) # Make profile default for device args = [cmd, "device-make-profile-default", device, profile] printcmdline(args[0], args[1:], fn=logfn) if logfn: logfn("") try: p = sp.Popen(args, stdout=sp.PIPE, stderr=sp.STDOUT) stdout, stderr = p.communicate() except Exception, exception: raise CDError(safe_str(exception)) else: if p.returncode != 0: raise CDError(stdout.strip() or errmsg) if logfn and stdout.strip(): logfn(stdout.strip()) def quirk_manufacturer(manufacturer): if Colord and hasattr(Colord, 'quirk_vendor_name'): return Colord.quirk_vendor_name(manufacturer) if not quirk_cache['suffixes'] or not quirk_cache['vendor_names']: quirk_filename = get_data_path('quirk.json') if quirk_filename: with open(quirk_filename) as quirk_file: quirk = demjson.decode(quirk_file.read()) quirk_cache['suffixes'] = quirk['suffixes'] quirk_cache['vendor_names'] = quirk['vendor_names'] # Correct some company names for old, new in quirk_cache['vendor_names'].iteritems(): if manufacturer.startswith(old): manufacturer = new break # Get rid of suffixes for suffix in quirk_cache['suffixes']: if manufacturer.endswith(suffix): manufacturer = manufacturer[0:len(manufacturer) - len(suffix)] manufacturer = manufacturer.rstrip() return manufacturer class CDError(Exception): pass class CDObjectQueryError(CDError): pass class CDObjectNotFoundError(CDObjectQueryError): pass class CDTimeout(CDError): pass if __name__ == "__main__": import sys for arg in sys.argv[1:]: print get_default_profile(arg) DisplayCAL-3.5.0.0/DisplayCAL/ColorLookupTable.fx0000644000076500000000000000506212665102055021207 0ustar devwheel00000000000000// Color Look Up Table Shader ================================================== // Configuration --------------------------------------------------------------- #define CLUT_ENABLED 1 // Key to toggle CLUT on or off. See MSDN, "Virtual-Key Codes", // msdn.microsoft.com/library/windows/desktop/dd375731%28v=vs.85%29.aspx // for a list of key codes. #define CLUT_TOGGLEKEY 0x24 // 0x24 = HOME key // NOTE that only textures with a height of 2 ^ n and a width of ^ 2 // will work correctly! E.g. x: 256x16, 1024x32, 4096x64 #define CLUT_TEXTURE "ColorLookupTable.png" #define CLUT_TEXTURE_WIDTH ${WIDTH} #define CLUT_SIZE ${HEIGHT} // END Configuration ----------------------------------------------------------- #pragma message "\nColor Look Up Table Shader ${VERSION}\n" #pragma reshade showtogglemessage texture2D ColorLookupTable_texColor : COLOR; texture ColorLookupTable_texCLUT < string source = CLUT_TEXTURE; > { Width = CLUT_TEXTURE_WIDTH; Height = CLUT_SIZE; Format = ${FORMAT}; }; sampler2D ColorLookupTable_samplerColor { Texture = ColorLookupTable_texColor; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Clamp; AddressV = Clamp; }; sampler2D ColorLookupTable_samplerCLUT { Texture = ColorLookupTable_texCLUT; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Clamp; AddressV = Clamp; }; void ColorLookupTable_VS(in uint id : SV_VertexID, out float4 position : SV_Position, out float2 texcoord : TEXCOORD0) { texcoord.x = (id == 2) ? 2.0 : 0.0; texcoord.y = (id == 1) ? 2.0 : 0.0; position = float4(texcoord * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); } #define CLUTscale float2(1.0 / CLUT_TEXTURE_WIDTH, 1.0 / CLUT_SIZE) float4 ColorLookupTable_PS(in float4 position : SV_Position, in float2 texcoord : TEXCOORD) : SV_Target { float4 color = tex2D(ColorLookupTable_samplerColor, texcoord.xy); float3 CLUTcoord = float3((color.rg * (CLUT_SIZE - 1) + 0.5) * CLUTscale, color.b * (CLUT_SIZE - 1)); float shift = floor(CLUTcoord.z); CLUTcoord.x += shift * CLUTscale.y; color.rgb = lerp(tex2D(ColorLookupTable_samplerCLUT, CLUTcoord.xy).rgb, tex2D(ColorLookupTable_samplerCLUT, float2(CLUTcoord.x + CLUTscale.y, CLUTcoord.y)).rgb, CLUTcoord.z - shift); return color; } technique ColorLookupTable < bool enabled = CLUT_ENABLED; toggle = CLUT_TOGGLEKEY; > { pass { VertexShader = ColorLookupTable_VS; PixelShader = ColorLookupTable_PS; } } DisplayCAL-3.5.0.0/DisplayCAL/colormath.py0000644000076500000000000027463213242301247020001 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Diverse color mathematical functions. Note: In most cases, unless otherwise stated RGB is R'G'B' (gamma-compressed) """ import colorsys import logging import math import sys import warnings def get_transfer_function_phi(alpha, gamma): return (math.pow(1 + alpha, gamma) * math.pow(gamma - 1, gamma - 1)) / (math.pow(alpha, gamma - 1) * math.pow(gamma, gamma)) LSTAR_E = 216.0 / 24389.0 # Intent of CIE standard, actual CIE standard = 0.008856 LSTAR_K = 24389.0 / 27.0 # Intent of CIE standard, actual CIE standard = 903.3 REC709_K0 = 0.081 # 0.099 / (1.0 / 0.45 - 1) REC709_P = 4.5 # get_transfer_function_phi(0.099, 1.0 / 0.45) SMPTE240M_K0 = 0.0913 # 0.1115 / (1.0 / 0.45 - 1) SMPTE240M_P = 4.0 # get_transfer_function_phi(0.1115, 1.0 / 0.45) SMPTE2084_M1 = (2610.0 / 4096) * .25 SMPTE2084_M2 = (2523.0 / 4096) * 128 SMPTE2084_C1 = (3424.0 / 4096) SMPTE2084_C2 = (2413.0 / 4096) * 32 SMPTE2084_C3 = (2392.0 / 4096) * 32 SRGB_K0 = 0.04045 # 0.055 / (2.4 - 1) SRGB_P = 12.92 # get_transfer_function_phi(0.055, 2.4) def specialpow(a, b, slope_limit=0): """ Wrapper for power, Rec. 601/709, SMPTE 240M, sRGB and L* functions Positive b = power, -2.4 = sRGB, -3.0 = L*, -240 = SMPTE 240M, -601 = Rec. 601, -709 = Rec. 709 (Rec. 601 and 709 transfer functions are identical) """ if b >= 0.0: # Power curve if a < 0.0: if slope_limit: return min(-math.pow(-a, b), a / slope_limit) return -math.pow(-a, b) else: if slope_limit: return max(math.pow(a, b), a / slope_limit) return math.pow(a, b) if a < 0.0: signScale = -1.0 a = -a else: signScale = 1.0 if b in (1.0 / -601, 1.0 / -709): # XYZ -> RGB, Rec. 601/709 TRC if a < REC709_K0 / REC709_P: v = a * REC709_P else: v = 1.099 * math.pow(a, 0.45) - 0.099 elif b == 1.0 / -240: # XYZ -> RGB, SMPTE 240M TRC if a < SMPTE240M_K0 / SMPTE240M_P: v = a * SMPTE240M_P else: v = 1.1115 * math.pow(a, 0.45) - 0.1115 elif b == 1.0 / -3.0: # XYZ -> RGB, L* TRC if a <= LSTAR_E: v = 0.01 * a * LSTAR_K else: v = 1.16 * math.pow(a, 1.0 / 3.0) - 0.16 elif b == 1.0 / -2.4: # XYZ -> RGB, sRGB TRC if a <= SRGB_K0 / SRGB_P: v = a * SRGB_P else: v = 1.055 * math.pow(a, 1.0 / 2.4) - 0.055 elif b == 1.0 / -2084: # XYZ -> RGB, SMPTE 2084 (PQ) v = ((2413.0 * (a ** SMPTE2084_M1) + 107) / (2392.0 * (a ** SMPTE2084_M1) + 128)) ** SMPTE2084_M2 elif b == -2.4: # RGB -> XYZ, sRGB TRC if a <= SRGB_K0: v = a / SRGB_P else: v = math.pow((a + 0.055) / 1.055, 2.4) elif b == -3.0: # RGB -> XYZ, L* TRC if a <= 0.08: # E * K * 0.01 v = 100.0 * a / LSTAR_K else: v = math.pow((a + 0.16) / 1.16, 3.0) elif b == -240: # RGB -> XYZ, SMPTE 240M TRC if a < SMPTE240M_K0: v = a / SMPTE240M_P else: v = math.pow((0.1115 + a) / 1.1115, 1.0 / 0.45) elif b in (-601, -709): # RGB -> XYZ, Rec. 601/709 TRC if a < REC709_K0: v = a / REC709_P else: v = math.pow((a + .099) / 1.099, 1.0 / 0.45) elif b == -2084: # RGB -> XYZ, SMPTE 2084 (PQ) # See https://www.smpte.org/sites/default/files/2014-05-06-EOTF-Miller-1-2-handout.pdf v = (max(a ** (1.0 / SMPTE2084_M2) - SMPTE2084_C1, 0) / (SMPTE2084_C2 - SMPTE2084_C3 * a ** (1.0 / SMPTE2084_M2))) ** (1.0 / SMPTE2084_M1) else: raise ValueError("Invalid gamma %r" % b) return v * signScale def DICOM(j, inverse=False): if inverse: log10Y = math.log10(j) A = 71.498068 B = 94.593053 C = 41.912053 D = 9.8247004 E = 0.28175407 F = -1.1878455 G = -0.18014349 H = 0.14710899 I = -0.017046845 return (A + B * log10Y + C * math.pow(log10Y, 2) + D * math.pow(log10Y, 3) + E * math.pow(log10Y, 4) + F * math.pow(log10Y, 5) + G * math.pow(log10Y, 6) + H * math.pow(log10Y, 7) + I * math.pow(log10Y, 8)) else: logj = math.log(j) a = -1.3011877 b = -2.5840191E-2 c = 8.0242636E-2 d = -1.0320229E-1 e = 1.3646699E-1 f = 2.8745620E-2 g = -2.5468404E-2 h = -3.1978977E-3 k = 1.2992634E-4 m = 1.3635334E-3 return ((a + c * logj + e * math.pow(logj, 2) + g * math.pow(logj, 3) + m * math.pow(logj, 4)) / (1 + b * logj + d * math.pow(logj, 2) + f * math.pow(logj, 3) + h * math.pow(logj, 4) + k * math.pow(logj, 5))) class HLG(object): """ Hybrid Log Gamma (HLG) as defined in Rec BT.2100 """ def __init__(self, black_cdm2=0.0, white_cdm2=1000.0, system_gamma=1.2, ambient_cdm2=5, rgb_space="Rec. 2020"): self.black_cdm2 = black_cdm2 self.white_cdm2 = white_cdm2 self.rgb_space = get_rgb_space(rgb_space) self.system_gamma = system_gamma self.ambient_cdm2 = ambient_cdm2 @property def gamma(self): """ System gamma for nominal peak luminance and ambient """ # Adjust system gamma for peak luminance != 1000 cd/m2 gamma = self.system_gamma + 0.42 * math.log10(self.white_cdm2 / 1000.0) if self.ambient_cdm2 > 0: # Adjust system gamma for ambient surround != 5 cd/m2 (BT.2390-3) gamma -= 0.076 * math.log10(self.ambient_cdm2 / 5.0) return gamma def oetf(self, v, inverse=False): """ Hybrid Log Gamma (HLG) OETF Relative scene linear light to non-linear HLG signal, or inverse Input domain 0..1 Output range 0..1 """ if v == 1: return 1.0 a = 0.17883277 b = 1 - 4 * a c = 0.5 - a * math.log(4 * a) if inverse: # Non-linear HLG signal to relative scene linear light if 0 <= v <= 1 / 2.: v = v ** 2 / 3. else: v = (math.exp((v - c) / a) + b) / 12. else: # Relative scene linear light to non-linear HLG signal if 0 <= v <= 1 / 12.: v = math.sqrt(3 * v) else: v = a * math.log(12 * v - b) + c return v def eotf(self, RGB, inverse=False, apply_black_offset=True): """ Hybrid Log Gamma (HLG) EOTF Non-linear HLG signal to display light, or inverse Input domain 0..1 Output range 0..1 """ if isinstance(RGB, (float, int)): R, G, B = (RGB,) * 3 else: R, G, B = RGB if inverse: # Display light -> relative scene linear light -> HLG signal R, G, B = (self.oetf(v) for v in self.ootf((R, G, B), True, apply_black_offset)) else: # HLG signal -> relative scene linear light -> display light R, G, B = self.ootf([self.oetf(v, True) for v in (R, G, B)], False, apply_black_offset) return G if isinstance(RGB, (float, int)) else (R, G, B) def ootf(self, RGB, inverse=False, apply_black_offset=True): """ Hybrid Log Gamma (HLG) OOTF Relative scene linear light to display light, or inverse Input domain 0..1 Output range 0..1 """ if isinstance(RGB, (float, int)): R, G, B = (RGB,) * 3 else: R, G, B = RGB if apply_black_offset: black_cdm2 = float(self.black_cdm2) else: black_cdm2 = 0 alpha = (self.white_cdm2 - black_cdm2) / self.white_cdm2 beta = black_cdm2 / self.white_cdm2 Y = 0.2627 * R + 0.6780 * G + 0.0593 * B if inverse: if Y > beta: R, G, B = (((Y - beta) / alpha) ** ((1 - self.gamma) / self.gamma) * ((v - beta) / alpha) for v in (R, G, B)) else: R, G, B = 0, 0, 0 else: if Y: Y **= (self.gamma - 1) R, G, B = (alpha * Y * E + beta for E in (R, G, B)) return G if isinstance(RGB, (float, int)) else (R, G, B) def RGB2XYZ(self, R, G, B, apply_black_offset=True): """ Non-linear HLG signal to display XYZ """ X, Y, Z = self.rgb_space[-1] * [self.oetf(v, True) for v in (R, G, B)] X, Y, Z = (max(v, 0) for v in (X, Y, Z)) Yy = self.ootf(Y, apply_black_offset=False) if Y: X, Y, Z = (v / Y * Yy for v in (X, Y, Z)) else: X, Y, Z = (v * Yy for v in self.rgb_space[1]) if apply_black_offset: beta = self.ootf(0) bp_out = [v * beta for v in self.rgb_space[1]] X, Y, Z = apply_bpc(X, Y, Z, (0, 0, 0), bp_out, self.rgb_space[1]) return X, Y, Z def XYZ2RGB(self, X, Y, Z, apply_black_offset=True): """ Display XYZ to non-linear HLG signal """ if apply_black_offset: beta = self.ootf(0) bp_in = [v * beta for v in self.rgb_space[1]] X, Y, Z = apply_bpc(X, Y, Z, bp_in, (0, 0, 0), self.rgb_space[1]) Yy = self.ootf(Y, True, apply_black_offset=False) if Y: X, Y, Z = (v / Y * Yy for v in (X, Y, Z)) R, G, B = self.rgb_space[-1].inverted() * (X, Y, Z) R, G, B = (max(v, 0) for v in (R, G, B)) R, G, B = [self.oetf(v) for v in (R, G, B)] return R, G, B rgb_spaces = { # http://brucelindbloom.com/WorkingSpaceInfo.html # ACES: https://github.com/ampas/aces-dev/blob/master/docs/ACES_1.0.1.pdf?raw=true # Adobe RGB: http://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf # DCI P3: http://www.hp.com/united-states/campaigns/workstations/pdfs/lp2480zx-dci--p3-emulation.pdf # http://dcimovies.com/specification/DCI_DCSS_v12_with_errata_2012-1010.pdf # Rec. 2020: http://en.wikipedia.org/wiki/Rec._2020 # # name gamma white primaries # point Rx Ry RY Gx Gy GY Bx By BY "ACES": (1.0, (0.95265, 1.0, 1.00883), (0.7347, 0.2653, 0.343961), (0.0000, 1.0000, 0.728164), (0.0001,-0.0770,-0.072125)), "ACEScg": (1.0, (0.95265, 1.0, 1.00883), (0.7130, 0.2930, 0.272230), (0.1650, 0.8300, 0.674080), (0.1280, 0.0440, 0.053690)), "Adobe RGB (1998)": (2 + 51 / 256.0, "D65", (0.6400, 0.3300, 0.297361), (0.2100, 0.7100, 0.627355), (0.1500, 0.0600, 0.075285)), "Apple RGB": (1.8, "D65", (0.6250, 0.3400, 0.244634), (0.2800, 0.5950, 0.672034), (0.1550, 0.0700, 0.083332)), "Best RGB": (2.2, "D50", (0.7347, 0.2653, 0.228457), (0.2150, 0.7750, 0.737352), (0.1300, 0.0350, 0.034191)), "Beta RGB": (2.2, "D50", (0.6888, 0.3112, 0.303273), (0.1986, 0.7551, 0.663786), (0.1265, 0.0352, 0.032941)), "Bruce RGB": (2.2, "D65", (0.6400, 0.3300, 0.240995), (0.2800, 0.6500, 0.683554), (0.1500, 0.0600, 0.075452)), "CIE RGB": (2.2, "E", (0.7350, 0.2650, 0.176204), (0.2740, 0.7170, 0.812985), (0.1670, 0.0090, 0.010811)), "ColorMatch RGB": (1.8, "D50", (0.6300, 0.3400, 0.274884), (0.2950, 0.6050, 0.658132), (0.1500, 0.0750, 0.066985)), # "DCDM X'Y'Z'": (2.6, "E", (1.0000, 0.0000, 0.000000), (0.0000, 1.0000, 1.000000), (0.0000, 0.0000, 0.000000)), "DCI P3": (2.6, (0.89459, 1.0, 0.95442), (0.6800, 0.3200, 0.209475), (0.2650, 0.6900, 0.721592), (0.1500, 0.0600, 0.068903)), "Don RGB 4": (2.2, "D50", (0.6960, 0.3000, 0.278350), (0.2150, 0.7650, 0.687970), (0.1300, 0.0350, 0.033680)), "ECI RGB": (1.8, "D50", (0.6700, 0.3300, 0.320250), (0.2100, 0.7100, 0.602071), (0.1400, 0.0800, 0.077679)), "ECI RGB v2": (-3.0, "D50", (0.6700, 0.3300, 0.320250), (0.2100, 0.7100, 0.602071), (0.1400, 0.0800, 0.077679)), "Ekta Space PS5": (2.2, "D50", (0.6950, 0.3050, 0.260629), (0.2600, 0.7000, 0.734946), (0.1100, 0.0050, 0.004425)), "NTSC 1953": (2.2, "C", (0.6700, 0.3300, 0.298839), (0.2100, 0.7100, 0.586811), (0.1400, 0.0800, 0.114350)), "PAL/SECAM": (2.2, "D65", (0.6400, 0.3300, 0.222021), (0.2900, 0.6000, 0.706645), (0.1500, 0.0600, 0.071334)), "ProPhoto RGB": (1.8, "D50", (0.7347, 0.2653, 0.288040), (0.1596, 0.8404, 0.711874), (0.0366, 0.0001, 0.000086)), "Rec. 709": (-709, "D65", (0.6400, 0.3300, 0.212656), (0.3000, 0.6000, 0.715158), (0.1500, 0.0600, 0.072186)), "Rec. 2020": (-709, "D65", (0.7080, 0.2920, 0.262694), (0.1700, 0.7970, 0.678009), (0.1310, 0.0460, 0.059297)), "SMPTE-C": (2.2, "D65", (0.6300, 0.3400, 0.212395), (0.3100, 0.5950, 0.701049), (0.1550, 0.0700, 0.086556)), "SMPTE 240M": (-240, "D65", (0.6300, 0.3400, 0.212395), (0.3100, 0.5950, 0.701049), (0.1550, 0.0700, 0.086556)), "sRGB": (-2.4, "D65", (0.6400, 0.3300, 0.212656), (0.3000, 0.6000, 0.715158), (0.1500, 0.0600, 0.072186)), "Wide Gamut RGB": (2.2, "D50", (0.7350, 0.2650, 0.258187), (0.1150, 0.8260, 0.724938), (0.1570, 0.0180, 0.016875)) } def get_cat_matrix(cat="Bradford"): if isinstance(cat, basestring): cat = cat_matrices[cat] if not isinstance(cat, Matrix3x3): cat = Matrix3x3(cat) return cat def cbrt(x): return math.pow(x, 1.0 / 3.0) if x >= 0 else -math.pow(-x, 1.0 / 3.0) def var(a): """ Variance """ s = 0.0 l = len(a) while l: l -= 1 s += a[l] l = len(a) m = s / l s = 0.0 while l: l -= 1 s += (a[l] - m) ** 2 return s / len(a) def XYZ2LMS(X, Y, Z, cat="Bradford"): """ Convert from XYZ to cone response domain """ cat = get_cat_matrix(cat) p, y, b = cat * [X, Y, Z] return p, y, b def LMS_wp_adaption_matrix(whitepoint_source=None, whitepoint_destination=None, cat="Bradford"): """ Prepare a matrix to match the whitepoints in cone response domain """ # chromatic adaption # based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html # cat = adaption matrix or predefined choice ('CAT02', 'Bradford', # 'Von Kries', 'XYZ Scaling', see cat_matrices), defaults to 'Bradford' cat = get_cat_matrix(cat) XYZWS = get_whitepoint(whitepoint_source) XYZWD = get_whitepoint(whitepoint_destination) if XYZWS[1] <= 1.0 and XYZWD[1] > 1.0: # make sure the scaling is identical XYZWD = [v / XYZWD[1] * XYZWS[1] for v in XYZWD] if XYZWD[1] <= 1.0 and XYZWS[1] > 1.0: # make sure the scaling is identical XYZWS = [v / XYZWS[1] * XYZWD[1] for v in XYZWS] Ls, Ms, Ss = XYZ2LMS(XYZWS[0], XYZWS[1], XYZWS[2], cat) Ld, Md, Sd = XYZ2LMS(XYZWD[0], XYZWD[1], XYZWD[2], cat) return Matrix3x3([[Ld/Ls, 0, 0], [0, Md/Ms, 0], [0, 0, Sd/Ss]]) def wp_adaption_matrix(whitepoint_source=None, whitepoint_destination=None, cat="Bradford"): """ Prepare a matrix to match the whitepoints in cone response doamin and transform back to XYZ """ # chromatic adaption # based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html # cat = adaption matrix or predefined choice ('CAT02', 'Bradford', # 'Von Kries', 'XYZ Scaling', see cat_matrices), defaults to 'Bradford' cat = get_cat_matrix(cat) return cat.inverted() * LMS_wp_adaption_matrix(whitepoint_source, whitepoint_destination, cat) * cat def adapt(X, Y, Z, whitepoint_source=None, whitepoint_destination=None, cat="Bradford"): """ Transform XYZ under source illuminant to XYZ under destination illuminant """ # chromatic adaption # based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html # cat = adaption matrix or predefined choice ('CAT02', 'Bradford', # 'Von Kries', 'XYZ Scaling', see cat_matrices), defaults to 'Bradford' return wp_adaption_matrix(whitepoint_source, whitepoint_destination, cat) * (X, Y, Z) def apply_bpc(X, Y, Z, bp_in, bp_out, wp_out="D50", weight=False): """ Apply black point compensation """ wp_out = get_whitepoint(wp_out) XYZ = [X, Y, Z] if weight: L = XYZ2Lab(*[v * 100 for v in (X, Y, Z)])[0] bp_in_Lab = XYZ2Lab(*[v * 100 for v in bp_in]) bp_out_Lab = XYZ2Lab(*[v * 100 for v in bp_out]) vv = (L - bp_in_Lab[0]) / (100.0 - bp_in_Lab[0]) # 0 at bp, 1 at wp vv = 1.0 - vv if vv < 0.0: vv = 0.0 elif vv > 1.0: vv = 1.0 vv = math.pow(vv, min(40.0, 40.0 / (max(bp_in_Lab[0], bp_out_Lab[0]) or 1.0))) bp_in = Lab2XYZ(*[v * vv for v in bp_in_Lab]) bp_out = Lab2XYZ(*[v * vv for v in bp_out_Lab]) for i, v in enumerate(XYZ): XYZ[i] = ((wp_out[i] - bp_out[i]) * v - wp_out[i] * (bp_in[i] - bp_out[i])) / (wp_out[i] - bp_in[i]) return XYZ def avg(*args): return float(sum(args)) / len(args) def blend_blackpoint(X, Y, Z, bp_in=None, bp_out=None, power=40.0): """ Blend to destination black as L approaches black, optionally compensating for input black first """ L, a, b = XYZ2Lab(*[v * 100 for v in (X, Y, Z)]) for bp in (bp_in, bp_out): if not bp or tuple(bp) == (0, 0, 0): continue bpLab = XYZ2Lab(*[v * 100 for v in bp]) if bp is bp_in: bL = bpLab[0] else: bL = 0 vv = (L - bL) / (100.0 - bL) # 0 at bp, 1 at wp vv = 1.0 - vv if vv < 0.0: vv = 0.0 elif vv > 1.0: vv = 1.0 vv = math.pow(vv, power) if bp is bp_in: vv = -vv oldmin = bp_in[1] newmin = 0.0 else: oldmin = 0.0 newmin = bp_out[1] oldrange = 1.0 - oldmin newrange = 1.0 - newmin Y = (newrange * Y - 1.0 * (oldmin - newmin)) / oldrange L = XYZ2Lab(0, Y * 100, 0)[0] a += vv * bpLab[1] b += vv * bpLab[2] X, Y, Z = Lab2XYZ(L, a, b) return X, Y, Z def interp(x, xp, fp, left=None, right=None): """ One-dimensional linear interpolation similar to numpy.interp Values do NOT have to be monotonically increasing interp(0, [0, 0], [0, 1]) will return 0 """ if not isinstance(x, (int, long, float, complex)): yi = [] for n in x: yi.append(interp(n, xp, fp, left, right)) return yi if x in xp: return fp[xp.index(x)] elif x < xp[0]: return fp[0] if left is None else left elif x > xp[-1]: return fp[-1] if right is None else right else: # Interpolate lower = 0 higher = len(fp) - 1 for i, v in enumerate(xp): if v < x and i > lower: lower = i elif v > x and i < higher: higher = i step = float(x - xp[lower]) steps = (xp[higher] - xp[lower]) / step return fp[lower] + (fp[higher] - fp[lower]) / steps def interp_resize(iterable, new_size, use_numpy=False): """ Change size of iterable through linear interpolation """ result = [] x_new = range(len(iterable)) interp = Interp(x_new, iterable, use_numpy=use_numpy) for i in xrange(new_size): result.append(interp(i / (new_size - 1.0) * (len(iterable) - 1.0))) return result def smooth_avg(values, passes=1, window=None): """ Smooth values (moving average). passses Number of passes window Tuple or list containing weighting factors. Its length determines the size of the window to use. Defaults to (1.0, 1.0, 1.0) """ if not window or len(window) < 3 or len(window) % 2 != 1: window = (1.0, 1.0, 1.0) for x in xrange(0, passes): data = [] for j, v in enumerate(values): tmpwindow = window while j > 0 and j < len(values) - 1 and len(tmpwindow) >= 3: tl = (len(tmpwindow) - 1) / 2 # print j, tl, tmpwindow if tl > 0 and j - tl >= 0 and j + tl <= len(values) - 1: windowslice = values[j - tl:j + tl + 1] windowsize = 0 for k, weight in enumerate(tmpwindow): windowsize += float(weight) * windowslice[k] v = windowsize / sum(tmpwindow) break else: tmpwindow = tmpwindow[1:-1] data.append(v) values = data return data def compute_bpc(bp_in, bp_out): """ Black point compensation. Implemented as a linear scaling in XYZ. Black points should come relative to the white point. Fills and returns a matrix/offset element. [matrix]*bp_in + offset = bp_out [matrix]*D50 + offset = D50 """ # This is a linear scaling in the form ax+b, where # a = (bp_out - D50) / (bp_in - D50) # b = - D50* (bp_out - bp_in) / (bp_in - D50) D50 = get_standard_illuminant("D50") tx = bp_in[0] - D50[0] ty = bp_in[1] - D50[1] tz = bp_in[2] - D50[2] ax = (bp_out[0] - D50[0]) / tx ay = (bp_out[1] - D50[1]) / ty az = (bp_out[2] - D50[2]) / tz bx = - D50[0] * (bp_out[0] - bp_in[0]) / tx by = - D50[1] * (bp_out[1] - bp_in[1]) / ty bz = - D50[2] * (bp_out[2] - bp_in[2]) / tz matrix = Matrix3x3([[ax, 0, 0], [0, ay, 0], [0, 0, az]]) offset = [bx, by, bz] return matrix, offset def delta(L1, a1, b1, L2, a2, b2, method="1976", p1=None, p2=None, p3=None, cie94_use_symmetric_chrominance=True): """ Compute the delta of two samples CIE 1994 & CMC calculation code derived from formulas on www.brucelindbloom.com CIE 1994 code uses some alterations seen on www.farbmetrik-gall.de/cielab/korrcielab/cie94.html (see notes in code below) CIE 2000 calculation code derived from Excel spreadsheet available at www.ece.rochester.edu/~gsharma/ciede2000 method: either "CIE94", "CMC", "CIE2K" or "CIE76" (default if method is not set) p1, p2, p3 arguments have different meaning for each calculation method: CIE 1994: If p1 is not None, calculation will be adjusted for textiles, otherwise graphics arts (default if p1 is not set) CMC(l:c): p1 equals l (lightness) weighting factor and p2 equals c (chroma) weighting factor. Commonly used values are CMC(1:1) for perceptability (default if p1 and p2 are not set) and CMC(2:1) for acceptability CIE 2000: p1 becomes kL (lightness) weighting factor, p2 becomes kC (chroma) weighting factor and p3 becomes kH (hue) weighting factor (all three default to 1 if not set) """ if isinstance(method, basestring): method = method.lower() else: method = str(int(method)) if method in ("94", "1994", "cie94", "cie1994"): textiles = p1 dL = L1 - L2 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) dC = C1 - C2 dH2 = math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2) - math.pow(dC, 2) dH = math.sqrt(dH2) if dH2 > 0 else 0 SL = 1.0 K1 = 0.048 if textiles else 0.045 K2 = 0.014 if textiles else 0.015 if cie94_use_symmetric_chrominance: C_ = math.sqrt(C1 * C2) else: C_ = C1 SC = 1.0 + K1 * C_ SH = 1.0 + K2 * C_ KL = 2.0 if textiles else 1.0 KC = 1.0 KH = 1.0 dE = math.sqrt(math.pow(dL / (KL * SL), 2) + math.pow(dC / (KC * SC), 2) + math.pow(dH / (KH * SH), 2)) elif method in ("cmc(2:1)", "cmc21", "cmc(1:1)", "cmc11", "cmc"): if method in ("cmc(2:1)", "cmc21"): p1 = 2.0 l = p1 if isinstance(p1, (float, int)) else 1.0 c = p2 if isinstance(p2, (float, int)) else 1.0 dL = L1 - L2 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) dC = C1 - C2 dH2 = math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2) - math.pow(dC, 2) dH = math.sqrt(dH2) if dH2 > 0 else 0 SL = 0.511 if L1 < 16 else (0.040975 * L1) / (1 + 0.01765 * L1) SC = (0.0638 * C1) / (1 + 0.0131 * C1) + 0.638 F = math.sqrt(math.pow(C1, 4) / (math.pow(C1, 4) + 1900.0)) H1 = math.degrees(math.atan2(b1, a1)) + (0 if b1 >= 0 else 360.0) T = 0.56 + abs(0.2 * math.cos(math.radians(H1 + 168.0))) if 164 <= H1 and H1 <= 345 else 0.36 + abs(0.4 * math.cos(math.radians(H1 + 35))) SH = SC * (F * T + 1 - F) dE = math.sqrt(math.pow(dL / (l * SL), 2) + math.pow(dC / (c * SC), 2) + math.pow(dH / SH, 2)) elif method in ("00", "2k", "2000", "cie00", "cie2k", "cie2000"): pow25_7 = math.pow(25, 7) k_L = p1 if isinstance(p1, (float, int)) else 1.0 k_C = p2 if isinstance(p2, (float, int)) else 1.0 k_H = p3 if isinstance(p3, (float, int)) else 1.0 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) C_avg = avg(C1, C2) G = .5 * (1 - math.sqrt(math.pow(C_avg, 7) / (math.pow(C_avg, 7) + pow25_7))) L1_ = L1 a1_ = (1 + G) * a1 b1_ = b1 L2_ = L2 a2_ = (1 + G) * a2 b2_ = b2 C1_ = math.sqrt(math.pow(a1_, 2) + math.pow(b1_, 2)) C2_ = math.sqrt(math.pow(a2_, 2) + math.pow(b2_, 2)) h1_ = 0 if a1_ == 0 and b1_ == 0 else math.degrees(math.atan2(b1_, a1_)) + (0 if b1_ >= 0 else 360.0) h2_ = 0 if a2_ == 0 and b2_ == 0 else math.degrees(math.atan2(b2_, a2_)) + (0 if b2_ >= 0 else 360.0) dh_cond = 1.0 if h2_ - h1_ > 180 else (2.0 if h2_ - h1_ < -180 else 0) dh_ = h2_ - h1_ if dh_cond == 0 else (h2_ - h1_ - 360.0 if dh_cond == 1 else h2_ + 360.0 - h1_) dL_ = L2_ - L1_ dL = dL_ dC_ = C2_ - C1_ dC = dC_ dH_ = 2 * math.sqrt(C1_ * C2_) * math.sin(math.radians(dh_ / 2.0)) dH = dH_ L__avg = avg(L1_, L2_) C__avg = avg(C1_, C2_) h__avg_cond = 3.0 if C1_ * C2_ == 0 else (0 if abs(h2_ - h1_) <= 180 else (1.0 if h2_ + h1_ < 360 else 2.0)) h__avg = h1_ + h2_ if h__avg_cond == 3 else (avg(h1_, h2_) if h__avg_cond == 0 else (avg(h1_, h2_) + 180.0 if h__avg_cond == 1 else avg(h1_, h2_) - 180.0)) AB = math.pow(L__avg - 50.0, 2) # (L'_ave-50)^2 S_L = 1 + .015 * AB / math.sqrt(20.0 + AB) S_C = 1 + .045 * C__avg T = (1 - .17 * math.cos(math.radians(h__avg - 30.0)) + .24 * math.cos(math.radians(2.0 * h__avg)) + .32 * math.cos(math.radians(3.0 * h__avg + 6.0)) - .2 * math.cos(math.radians(4 * h__avg - 63.0))) S_H = 1 + .015 * C__avg * T dTheta = 30.0 * math.exp(-1 * math.pow((h__avg - 275.0) / 25.0, 2)) R_C = 2.0 * math.sqrt(math.pow(C__avg, 7) / (math.pow(C__avg, 7) + pow25_7)) R_T = -math.sin(math.radians(2.0 * dTheta)) * R_C AJ = dL_ / S_L / k_L # dL' / k_L / S_L AK = dC_ / S_C / k_C # dC' / k_C / S_C AL = dH_ / S_H / k_H # dH' / k_H / S_H dE = math.sqrt(math.pow(AJ, 2) + math.pow(AK, 2) + math.pow(AL, 2) + R_T * AK * AL) else: # dE 1976 dL = L1 - L2 C1 = math.sqrt(math.pow(a1, 2) + math.pow(b1, 2)) C2 = math.sqrt(math.pow(a2, 2) + math.pow(b2, 2)) dC = C1 - C2 dH2 = math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2) - math.pow(dC, 2) dH = math.sqrt(dH2) if dH2 > 0 else 0 dE = math.sqrt(math.pow(dL, 2) + math.pow(a1 - a2, 2) + math.pow(b1 - b2, 2)) return {"E": dE, "L": dL, "C": dC, "H": dH, "a": a1 - a2, "b": b1 - b2} def is_similar_matrix(matrix1, matrix2, digits=3): """ Compare two matrices and check if they are the same up to n digits after the decimal point """ return matrix1.rounded(digits) == matrix2.rounded(digits) def four_color_matrix(XrR, YrR, ZrR, XrG, YrG, ZrG, XrB, YrB, ZrB, XrW, YrW, ZrW, XmR, YmR, ZmR, XmG, YmG, ZmG, XmB, YmB, ZmB, XmW, YmW, ZmW, Y_correction=True): """ Four-Color Matrix Method for Correction of Tristimulus Colorimeters Based on paper published in Proc., IS&T Fifth Color Imaging Conference, 301-305 (1997) and IS&T Sixth Color Imaging Conference (1998). """ XYZ = locals() xyz = {} M = {} k = {} for s in "mr": xyz[s] = {} for color in "RGBW": X, Y, Z = (XYZ[component + s + color] for component in "XYZ") x, y = XYZ2xyY(X, Y, Z)[:2] xyz[s][color] = x, y, 1 - x - y M[s] = Matrix3x3([xyz[s][color] for color in "RGB"]).transposed() k[s] = M[s].inverted() * xyz[s]["W"] M[s + "RGB"] = M[s] * Matrix3x3([[k[s][0], 0, 0], [0, k[s][1], 0], [0, 0, k[s][2]]]) R = M["rRGB"] * M["mRGB"].inverted() if Y_correction: # The Y calibration factor kY is obtained as the ratio of the reference # luminance value to the matrix-corrected Y value, as defined in # Four-Color Matrix Method for Correction of Tristimulus Colorimeters – # Part 2 MW = XmW, YmW, ZmW kY = YrW / (R * MW)[1] R[:] = [[kY * v for v in row] for row in R] return R def get_gamma(values, scale=1.0, vmin=0.0, vmax=1.0, average=True, least_squares=False): """ Return average or least squares gamma or a list of gamma values """ if least_squares: logxy = [] logx2 = [] else: gammas = [] vmin /= scale vmax /= scale for x, y in values: x /= scale y = (y / scale - vmin) * (vmax + vmin) if x > 0 and x < 1 and y > 0: if least_squares: logxy.append(math.log(x) * math.log(y)) logx2.append(math.pow(math.log(x), 2)) else: gammas.append(math.log(y) / math.log(x)) if average or least_squares: if least_squares: if not logxy or not logx2: return 0 return sum(logxy) / sum(logx2) else: if not gammas: return 0 return sum(gammas) / len(gammas) else: return gammas def guess_cat(chad, whitepoint_source=None, whitepoint_destination=None): """ Try and guess the chromatic adaption transform used in a chromatic adaption matrix as found in an ICC profile's 'chad' tag """ if chad == [[1, 0, 0], [0, 1, 0], [0, 0, 1]]: return "XYZ scaling" for cat in cat_matrices: if is_similar_matrix((chad * cat_matrices[cat].inverted() * LMS_wp_adaption_matrix(whitepoint_destination, whitepoint_source, cat)).inverted(), cat_matrices[cat], 2): return cat def CIEDCCT2xyY(T, scale=1.0): """ Convert from CIE correlated daylight temperature to xyY. T = temperature in Kelvin. Based on formula from http://brucelindbloom.com/Eqn_T_to_xy.html """ if isinstance(T, basestring): # Assume standard illuminant, e.g. "D50" return XYZ2xyY(*get_standard_illuminant(T, scale=scale)) if 4000 <= T and T <= 7000: xD = (((-4.607 * math.pow(10, 9)) / math.pow(T, 3)) + ((2.9678 * math.pow(10, 6)) / math.pow(T, 2)) + ((0.09911 * math.pow(10, 3)) / T) + 0.244063) elif 7000 < T and T <= 25000: xD = (((-2.0064 * math.pow(10, 9)) / math.pow(T, 3)) + ((1.9018 * math.pow(10, 6)) / math.pow(T, 2)) + ((0.24748 * math.pow(10, 3)) / T) + 0.237040) else: return None yD = -3 * math.pow(xD, 2) + 2.87 * xD - 0.275 return xD, yD, scale def CIEDCCT2XYZ(T, scale=1.0): """ Convert from CIE correlated daylight temperature to XYZ. T = temperature in Kelvin. """ xyY = CIEDCCT2xyY(T, scale) if xyY: return xyY2XYZ(*xyY) def DIN992Lab(L99, a99, b99, kCH=1.0, kE=1.0): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99LCH2Lab(L99, C99, H99, kCH, kE) def DIN99b2Lab(L99, a99, b99): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99bcdLCH2Lab(L99, C99, H99, 0, 303.67, .0039, 26, .83, 23, .075) def DIN99bLCH2Lab(L99, C99, H99): return DIN99bcdLCH2Lab(L99, C99, H99, 0, 303.67, .0039, 26, .83, 23, .075) def DIN99c2Lab(L99, a99, b99, whitepoint=None): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99bcdLCH2Lab(L99, C99, H99, .1, 317.651, .0037, 0, .94, 23, .066, whitepoint) def DIN99d2Lab(L99, a99, b99, whitepoint=None): C99, H99 = DIN99familyab2DIN99CH(a99, b99) return DIN99bcdLCH2Lab(L99, C99, H99, .12, 325.221, .0036, 50, 1.14, 22.5, .06, whitepoint) def DIN99dLCH2Lab(L99, C99, H99, whitepoint=None): return DIN99bcdLCH2Lab(L99, C99, H99, .12, 325.221, .0036, 50, 1.14, 22.5, .06, whitepoint) def DIN99LCH2Lab(L99, C99, H99, kCH, kE=1.0): G = (math.exp(.045 * C99 * kCH * kE) - 1) / .045 return DIN99familyLHCG2Lab(L99, H99, C99, G, kE, 105.51, .0158, 16, .7) def DIN99bcdLCH2Lab(L99, C99, H99, x, l1, l2, deg, f1, c1, c2, whitepoint=None): G = (math.exp(C99 / c1) - 1) / c2 H99 -= deg L, a, b = DIN99familyLHCG2Lab(L99, H99, C99, G, 1.0, l1, l2, deg, f1) if x: whitepoint99d = XYZ2DIN99cdXYZ(*get_whitepoint(whitepoint, 100), x=x) X, Y, Z = Lab2XYZ(L, a, b, whitepoint99d, scale=100) X, Y, Z = DIN99cdXYZ2XYZ(X, Y, Z, x) L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return L, a, b def DIN99cdXYZ2XYZ(X, Y, Z, x): X = (X + x * Z) / (1 + x) return X, Y, Z def DIN99familyLHCG2Lab(L99, H99, C99, G, kE, l1, l2, deg, f1): L = (math.exp((L99 * kE) / l1) - 1) / l2 h99ef = H99 * math.pi / 180 e = G * math.cos(h99ef) f = G * math.sin(h99ef) rad = deg * math.pi / 180 a = e * math.cos(rad) - (f / f1) * math.sin(rad) b = e * math.sin(rad) + (f / f1) * math.cos(rad) return L, a, b def DIN99familyCH2DIN99ab(C99, H99): h99ef = H99 * math.pi / 180 return C99 * math.cos(h99ef), C99 * math.sin(h99ef) def DIN99familyab2DIN99CH(a99, b99): C99 = math.sqrt(math.pow(a99, 2) + math.pow(b99, 2)) if a99 > 0: if b99 >= 0: h99ef = math.atan2(b99, a99) else: h99ef = 2 * math.pi + math.atan2(b99, a99) elif a99 < 0: h99ef = math.atan2(b99, a99) else: if b99 > 0: h99ef = math.pi / 2 elif b99 < 0: h99ef = (3 * math.pi) / 2 else: h99ef = 0.0 H99 = h99ef * 180 / math.pi return C99, H99 def HSL2RGB(H, S, L, scale=1.0): return tuple(v * scale for v in colorsys.hls_to_rgb(H, L, S)) def HSV2RGB(H, S, V, scale=1.0): return tuple(v * scale for v in colorsys.hsv_to_rgb(H, S, V)) def get_DBL_MIN(): t = "0.0" i = 10 n = 0 while True: if i > 1: i -= 1 else: t += "0" i = 9 if float(t + str(i)) == 0.0: if n > 1: break n += 1 t += str(i) i = 10 else: if n > 1: n -= 1 DBL_MIN = float(t + str(i)) return DBL_MIN DBL_MIN = get_DBL_MIN() def LCHab2Lab(L, C, H): a = C * math.cos(H * math.pi / 180.0) b = C * math.sin(H * math.pi / 180.0) return L, a, b def Lab2DIN99(L, a, b, kCH=1.0, kE=1.0): L99, C99, H99 = Lab2DIN99LCH(L, a, b, kCH, kE) a99, b99 = DIN99familyCH2DIN99ab(C99, H99) return L99, a99, b99 def Lab2DIN99b(L, a, b, kE=1.0): L99, C99, H99 = Lab2DIN99bLCH(L, a, b, kE) a99, b99 = DIN99familyCH2DIN99ab(C99, H99) return L99, a99, b99 def Lab2DIN99c(L, a, b, kE=1.0, whitepoint=None): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale=100) return XYZ2DIN99c(X, Y, Z, whitepoint) def Lab2DIN99d(L, a, b, kE=1.0, whitepoint=None): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale=100) return XYZ2DIN99d(X, Y, Z, whitepoint) def Lab2DIN99LCH(L, a, b, kCH=1.0, kE=1.0): L99, G, h99ef, rad = Lab2DIN99familyLGhrad(L, a, b, kE, 105.51, .0158, 16, .7) C99 = math.log(1 + .045 * G) / .045 * kCH * kE H99 = h99ef * 180 / math.pi return L99, C99, H99 def Lab2DIN99bLCH(L, a, b, kE=1.0): return Lab2DIN99bcdLCH(L, a, b, 303.67, .0039, 26, .83, 23, .075) def Lab2DIN99bcdLCH(L, a, b, l1, l2, deg, f1, c1, c2): L99, G, h99ef, rad = Lab2DIN99familyLGhrad(L, a, b, 1.0, l1, l2, deg, f1) C99 = c1 * math.log(1 + c2 * G) H99 = h99ef * 180 / math.pi + deg return L99, C99, H99 def Lab2DIN99familyLGhrad(L, a, b, kE, l1, l2, deg, f1): L99 = (1.0 / kE) * l1 * math.log(1 + l2 * L) rad = deg * math.pi / 180 if rad: ar = math.cos(rad) # a rotation term br = math.sin(rad) # b rotation term e = a * ar + b * br f = f1 * (b * ar - a * br) else: e = a f = f1 * b G = math.sqrt(math.pow(e, 2) + math.pow(f, 2)) h99ef = math.atan2(f, e) return L99, G, h99ef, rad def Lab2LCHab(L, a, b): C = math.sqrt(math.pow(a, 2) + math.pow(b, 2)) H = 180.0 * math.atan2(b, a) / math.pi if (H < 0.0): H += 360.0 return L, C, H def Lab2Luv(L, a, b, whitepoint=None, scale=100): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale) return XYZ2Luv(X, Y, Z, whitepoint) def Lab2RGB(L, a, b, rgb_space=None, scale=1.0, round_=False, clamp=True, whitepoint=None, whitepoint_source=None, noadapt=False, cat="Bradford"): """ Convert from Lab to RGB """ X, Y, Z = Lab2XYZ(L, a, b, whitepoint) if not noadapt: rgb_space = get_rgb_space(rgb_space) X, Y, Z = adapt(X, Y, Z, whitepoint_source, rgb_space[1], cat) return XYZ2RGB(X, Y, Z, rgb_space, scale, round_, clamp) def Lab2XYZ(L, a, b, whitepoint=None, scale=1.0): """ Convert from Lab to XYZ. The input L value needs to be in the nominal range [0.0, 100.0] and other input values scaled accordingly. The output XYZ values are in the nominal range [0.0, scale]. whitepoint can be string (e.g. "D50"), a tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. Based on formula from http://brucelindbloom.com/Eqn_Lab_to_XYZ.html """ fy = (L + 16) / 116.0 fx = a / 500.0 + fy fz = fy - b / 200.0 if math.pow(fx, 3.0) > LSTAR_E: xr = math.pow(fx, 3.0) else: xr = (116.0 * fx - 16) / LSTAR_K if L > LSTAR_K * LSTAR_E: yr = math.pow((L + 16) / 116.0, 3.0) else: yr = L / LSTAR_K if math.pow(fz, 3.0) > LSTAR_E: zr = math.pow(fz, 3.0) else: zr = (116.0 * fz - 16) / LSTAR_K Xr, Yr, Zr = get_whitepoint(whitepoint, scale) X = xr * Xr Y = yr * Yr Z = zr * Zr return X, Y, Z def Lab2xyY(L, a, b, whitepoint=None, scale=1.0): X, Y, Z = Lab2XYZ(L, a, b, whitepoint, scale) return XYZ2xyY(X, Y, Z, whitepoint) def Luv2LCHuv(L, u, v): C = math.sqrt(math.pow(u, 2) + math.pow(v, 2)) H = 180.0 * math.atan2(v, u) / math.pi if (H < 0.0): H += 360.0 return L, C, H def Luv2RGB(L, u, v, rgb_space=None, scale=1.0, round_=False, clamp=True, whitepoint=None): """ Convert from Luv to RGB """ X, Y, Z = Luv2XYZ(L, u, v, whitepoint) return XYZ2RGB(X, Y, Z, rgb_space, scale, round_, clamp) def u_v_2xy(u, v): """ Convert from u'v' to xy """ x = (9.0 * u) / (6 * u - 16 * v + 12) y = (4 * v) / (6 * u - 16 * v + 12) return x, y def Luv2XYZ(L, u, v, whitepoint=None, scale=1.0): """ Convert from Luv to XYZ """ Xr, Yr, Zr = get_whitepoint(whitepoint) Y = math.pow((L + 16.0) / 116.0, 3) if L > LSTAR_K * LSTAR_E else L / LSTAR_K uo = (4.0 * Xr) / (Xr + 15.0 * Yr + 3.0 * Zr) vo = (9.0 * Yr) / (Xr + 15.0 * Yr + 3.0 * Zr) a = (1.0 / 3.0) * (((52.0 * L) / (u + 13 * L * uo)) -1) b = -5.0 * Y c = -(1.0 / 3.0) d = Y * (((39.0 * L) / (v + 13 * L * vo)) - 5) X = (d - b) / (a - c) Z = X * a + b return tuple([v * scale for v in X, Y, Z]) def RGB2HSI(R, G, B, scale=1.0): I = (R + G + B) / 3.0 if I: S = 1 - min(R, G, B) / I else: S = 0 if not R == G == B: H = math.atan2(math.sqrt(3) * (G - B), 2 * R - G - B) / math.pi / 2 if H < 0: H += 1.0 if H > 1: H -= 1.0 else: H = 0 return H * scale, S * scale, I * scale def RGB2HSL(R, G, B, scale=1.0): H, L, S = colorsys.rgb_to_hls(R, G, B) return tuple(v * scale for v in (H, S, L)) def RGB2HSV(R, G, B, scale=1.0): return tuple(v * scale for v in colorsys.rgb_to_hsv(R, G, B)) def LinearRGB2ICtCp(R, G, B, oetf=lambda FD: specialpow(FD, 1.0 / -2084)): """ Rec. 2020 linear RGB to non-linear ICtCp """ # http://www.dolby.com/us/en/technologies/dolby-vision/ICtCp-white-paper.pdf LMS = LinearRGB2LMS_matrix * (R, G, B) L_, M_, S_ = (oetf(FD) for FD in LMS) I, Ct, Cp = L_M_S_2ICtCp_matrix * (L_, M_, S_) return I, Ct, Cp def ICtCp2LinearRGB(I, Ct, Cp, eotf=lambda v: specialpow(v, -2084)): """ Non-linear ICtCp to Rec. 2020 linear RGB """ # http://www.dolby.com/us/en/technologies/dolby-vision/ICtCp-white-paper.pdf L_M_S_ = ICtCp2L_M_S__matrix * (I, Ct, Cp) L, M, S = (eotf(v) for v in L_M_S_) R, G, B = LMS2LinearRGB_matrix * (L, M, S) return R, G, B def XYZ2ICtCp(X, Y, Z, rgb_space="Rec. 2020", clamp=False, oetf=lambda E: specialpow(E, 1.0 / -2084)): R, G, B = XYZ2RGB(X, Y, Z, rgb_space, clamp=clamp, oetf=lambda v: v) return LinearRGB2ICtCp(R, G, B, oetf) def ICtCp2XYZ(I, Ct, Cp, rgb_space="Rec. 2020", eotf=lambda v: specialpow(v, -2084)): R, G, B = ICtCp2LinearRGB(I, Ct, Cp, eotf) return RGB2XYZ(R, G, B, rgb_space, eotf=lambda v: v) def RGB2Lab(R, G, B, rgb_space=None, whitepoint=None, noadapt=False, cat="Bradford"): X, Y, Z = RGB2XYZ(R, G, B, rgb_space, scale=100) if not noadapt: rgb_space = get_rgb_space(rgb_space) X, Y, Z = adapt(X, Y, Z, rgb_space[1], whitepoint, cat) return XYZ2Lab(X, Y, Z, whitepoint=whitepoint) def RGB2XYZ(R, G, B, rgb_space=None, scale=1.0, eotf=None): """ Convert from RGB to XYZ. Use optional RGB colorspace definition, which can be a named colorspace (e.g. "CIE RGB") or must be a tuple in the following format: (gamma, whitepoint, red, green, blue) whitepoint can be a string (e.g. "D50"), a tuple of XYZ coordinates, or a color temperatur in degrees K (float or int). Gamma should be a float. The RGB primaries red, green, blue should be lists or tuples of xyY coordinates (only x and y will be used, so Y can be zero or None). If no colorspace is given, it defaults to sRGB. Based on formula from http://brucelindbloom.com/Eqn_RGB_to_XYZ.html Implementation Notes: 1. The transformation matrix [M] is calculated from the RGB reference primaries as discussed here: http://brucelindbloom.com/Eqn_RGB_XYZ_Matrix.html 2. The gamma values for many common RGB color spaces may be found here: http://brucelindbloom.com/WorkingSpaceInfo.html#Specifications 3. Your input RGB values may need to be scaled before using the above. For example, if your values are in the range [0, 255], you must first divide each by 255.0. 4. The output XYZ values are in the nominal range [0.0, scale]. 5. The XYZ values will be relative to the same reference white as the RGB system. If you want XYZ relative to a different reference white, you must apply a chromatic adaptation transform [http://brucelindbloom.com/Eqn_ChromAdapt.html] to the XYZ color to convert it from the reference white of the RGB system to the desired reference white. 6. Sometimes the more complicated special case of sRGB shown above is replaced by a "simplified" version using a straight gamma function with gamma = 2.2. """ trc, whitepoint, rxyY, gxyY, bxyY, matrix = get_rgb_space(rgb_space) RGB = [R, G, B] is_trc = isinstance(trc, (list, tuple)) for i, v in enumerate(RGB): if is_trc: gamma = trc[i] else: gamma = trc if eotf: RGB[i] = eotf(v) elif isinstance(gamma, (list, tuple)): RGB[i] = interp(v, [n / float(len(gamma) - 1) for n in xrange(len(gamma))], gamma) else: RGB[i] = specialpow(v, gamma) XYZ = matrix * RGB return tuple(v * scale for v in XYZ) def RGB2YCbCr(R, G, B, rgb_space="NTSC 1953", bits=8): """ R'G'B' to Y'CbCr quantized to n bits """ return YPbPr2YCbCr(*RGB2YPbPr(R, G, B, rgb_space), bits=bits) def RGB2YPbPr(R, G, B, rgb_space="NTSC 1953"): """ R'G'B' to Y'PbPr """ return RGB2YPbPr_matrix(rgb_space) * (R, G, B) def RGB2YPbPr_matrix(rgb_space="NTSC 1953"): (trc, whitepoint, (rx, ry, rY), (gx, gy, gY), (bx, by, bY), matrix) = get_rgb_space(rgb_space) if matrix == get_rgb_space("NTSC 1953")[-1]: ndigits = 3 else: ndigits = 4 KR = round(rY, ndigits) KB = round(bY, ndigits) KG = 1.0 - KR - KB Pb_scale = ((1 - KB) / 0.5) Pr_scale = ((1 - KR) / 0.5) return Matrix3x3([[KR, KG, KB], [-KR / Pb_scale, -KG / Pb_scale, 0.5], [0.5, -KG / Pr_scale, -KB / Pr_scale]]) def YCbCr2YPbPr(Y, Cb, Cr, bits=8): """ Y'CbCr to Y'PbPr """ bitlevels = 2 ** bits Yblack = 16 / 256.0 * bitlevels Yscale = 219 / 256.0 * bitlevels Y -= Yblack Y /= Yscale Cneutral = 128 / 256.0 * bitlevels Cscale = 224 / 256.0 * bitlevels Cb -= Cneutral Cb /= Cscale Cr -= Cneutral Cr /= Cscale return Y, Cb, Cr def YCbCr2RGB(Y, Cb, Cr, rgb_space="NTSC 1953", bits=8, scale=1.0, round_=False, clamp=True): """ Y'CbCr to R'G'B' """ Y, Pb, Pr = YCbCr2YPbPr(Y, Cb, Cr, bits) return YPbPr2RGB(Y, Pb, Pr, rgb_space, scale, round_, clamp) def YPbPr2RGB(Y, Pb, Pr, rgb_space="NTSC 1953", scale=1.0, round_=False, clamp=True): """ Y'PbPr to R'G'B' """ RGB = RGB2YPbPr_matrix(rgb_space).inverted() * (Y, Pb, Pr) for i in xrange(3): if clamp: RGB[i] = min(1.0, max(0.0, RGB[i])) RGB[i] *= scale if round_ is not False: RGB[i] = round(RGB[i], round_) return RGB def YPbPr2YCbCr(Y, Pb, Pr, bits=8): """ Y'PbPr' to Y'CbCr quantized to n bits """ bitlevels = 2 ** bits Yblack = 16 / 256.0 * bitlevels Yscale = 219 / 256.0 * bitlevels Y = Yblack + Yscale * Y Cneutral = 128 / 256.0 * bitlevels Cscale = 224 / 256.0 * bitlevels Cb = Cneutral + Cscale * Pb Cr = Cneutral + Cscale * Pr Y, Cb, Cr = (int(round(v)) for v in (Y, Cb, Cr)) return Y, Cb, Cr def RGBsaturation(R, G, B, saturation, rgb_space=None): """ (De)saturate a RGB color in CIE xy and return the RGB and xyY values """ whitepoint = RGB2XYZ(1, 1, 1, rgb_space=rgb_space) X, Y, Z = RGB2XYZ(R, G, B, rgb_space=rgb_space) XYZ, xyY = XYZsaturation(X, Y, Z, saturation, whitepoint) return XYZ2RGB(*XYZ, rgb_space=rgb_space), xyY def XYZsaturation(X, Y, Z, saturation, whitepoint=None): """ (De)saturate a XYZ color in CIE xy and return the RGB and xyY values """ wx, wy, wY = XYZ2xyY(*get_whitepoint(whitepoint)) x, y, Y = XYZ2xyY(X, Y, Z) x, y, Y = xyYsaturation(x, y, Y, wx, wy, saturation) return xyY2XYZ(x, y, Y), (x, y, Y) def xyYsaturation(x, y, Y, wx, wy, saturation): """ (De)saturate a color in CIE xy and return the RGB and xyY values """ return wx + (x - wx) * saturation, wy + (y - wy) * saturation, Y def convert_range(v, oldmin=0, oldmax=1, newmin=0, newmax=1): oldrange = float(oldmax - oldmin) newrange = newmax - newmin return (((v - oldmin) * newrange) / oldrange) + newmin def rgb_to_xyz_matrix(rx, ry, gx, gy, bx, by, whitepoint=None, scale=1.0): """ Create and return an RGB to XYZ matrix. """ whitepoint = get_whitepoint(whitepoint, scale) Xr, Yr, Zr = xyY2XYZ(rx, ry, scale) Xg, Yg, Zg = xyY2XYZ(gx, gy, scale) Xb, Yb, Zb = xyY2XYZ(bx, by, scale) Sr, Sg, Sb = Matrix3x3(((Xr, Xg, Xb), (Yr, Yg, Yb), (Zr, Zg, Zb))).inverted() * whitepoint return Matrix3x3(((Sr * Xr, Sg * Xg, Sb * Xb), (Sr * Yr, Sg * Yg, Sb * Yb), (Sr * Zr, Sg * Zg, Sb * Zb))) def find_primaries_wp_xy_rgb_space_name(xy, rgb_space_names=None, digits=4): """ Given primaries and whitepoint xy as list, find matching RGB space by comparing primaries and whitepoint (fuzzy match rounded to n digits) and return its name (or None if no match) """ for i, rgb_space_name in enumerate(rgb_space_names or rgb_spaces.iterkeys()): if not rgb_space_names and rgb_space_name in ("ECI RGB", "ECI RGB v2", "SMPTE 240M", "sRGB"): # Skip in favor of base color space (i.e. NTSC 1953, SMPTE-C and # Rec. 709) continue if get_rgb_space_primaries_wp_xy(rgb_space_name, digits) == xy: return rgb_space_name def get_rgb_space(rgb_space=None, scale=1.0): """ Return gamma, whitepoint, primaries and RGB -> XYZ matrix """ if not rgb_space: rgb_space = "sRGB" if isinstance(rgb_space, basestring): rgb_space = rgb_spaces[rgb_space] cachehash = tuple(map(id, rgb_space[:5])), scale cache = get_rgb_space.cache.get(cachehash, None) if cache: return cache gamma = rgb_space[0] or rgb_spaces["sRGB"][0] whitepoint = get_whitepoint(rgb_space[1] or rgb_spaces["sRGB"][1], scale) rx, ry, rY = rxyY = rgb_space[2] or rgb_spaces["sRGB"][2] gx, gy, gY = gxyY = rgb_space[3] or rgb_spaces["sRGB"][3] bx, by, bY = bxyY = rgb_space[4] or rgb_spaces["sRGB"][4] matrix = rgb_to_xyz_matrix(rx, ry, gx, gy, bx, by, whitepoint, scale) rgb_space = gamma, whitepoint, rxyY, gxyY, bxyY, matrix get_rgb_space.cache[cachehash] = rgb_space return rgb_space def get_rgb_space_primaries_wp_xy(rgb_space=None, digits=4): """ Given RGB space, get primaries and whitepoint xy, optionally rounded to n digits (default 4) """ rgb_space = get_rgb_space(rgb_space) xy = [] for i in xrange(3): xy.extend(rgb_space[2:][i][:2]) xy.extend(XYZ2xyY(*get_whitepoint(rgb_space[1]))[:2]) if digits: xy = [round(v, digits) for v in xy] return xy get_rgb_space.cache = {} def get_standard_illuminant(illuminant_name="D50", priority=("ISO 11664-2:2007", "ICC", "ASTM E308-01", "Wyszecki & Stiles", None), scale=1.0): """ Return a standard illuminant as XYZ coordinates. """ cachehash = illuminant_name, tuple(priority), scale cache = get_standard_illuminant.cache.get(cachehash, None) if cache: return cache illuminant = None for standard_name in priority: if not standard_name in standard_illuminants: raise ValueError('Unrecognized standard "%s"' % standard_name) illuminant = standard_illuminants.get(standard_name).get(illuminant_name.upper(), None) if illuminant: illuminant = illuminant["X"] * scale, 1.0 * scale, illuminant["Z"] * scale get_standard_illuminant.cache[cachehash] = illuminant return illuminant raise ValueError('Unrecognized illuminant "%s"' % illuminant_name) get_standard_illuminant.cache = {} def get_whitepoint(whitepoint=None, scale=1.0, planckian=False): """ Return a whitepoint as XYZ coordinates """ if isinstance(whitepoint, (list, tuple)): return whitepoint if not whitepoint: whitepoint = "D50" cachehash = whitepoint, scale, planckian cache = get_whitepoint.cache.get(cachehash, None) if cache: return cache if isinstance(whitepoint, basestring): whitepoint = get_standard_illuminant(whitepoint) elif isinstance(whitepoint, (float, int)): cct = whitepoint if planckian: whitepoint = planckianCT2XYZ(cct) if not whitepoint: raise ValueError("Planckian color temperature %i out of range " "(1667, 25000)" % cct) else: whitepoint = CIEDCCT2XYZ(cct) if not whitepoint: raise ValueError("Daylight color temperature %i out of range " "(4000, 25000)" % cct) if scale > 1.0 and whitepoint[1] == 100: scale = 1.0 whitepoint = tuple(v * scale for v in whitepoint) get_whitepoint.cache[cachehash] = whitepoint return whitepoint get_whitepoint.cache = {} def make_monotonically_increasing(iterable, passes=0, window=None): """ Given an iterable or sequence, make the values strictly monotonically increasing (no repeated successive values) by linear interpolation. If iterable is a dict, keep the keys of the original. If passes is non-zero, apply moving average smoothing to the values before making them monotonically increasing. """ if isinstance(iterable, dict): keys = iterable.keys() values = iterable.values() else: if hasattr(iterable, "next"): values = list(iterable) else: values = iterable keys = xrange(len(values)) if passes: values = smooth_avg(values, passes, window) sequence = zip(keys, values) numvalues = len(sequence) s_new = [] y_min = sequence[0][1] while sequence: x, y = sequence.pop() if (not s_new or y < s_new[0][1]) and (y > y_min or not sequence): s_new.insert(0, (x, y)) sequence = s_new # Interpolate to original size x_new = [item[0] for item in sequence] y = [item[1] for item in sequence] values = [] for i in xrange(numvalues): values.append(interp(i, x_new, y)) if isinstance(iterable, dict): # Add in original keys return iterable.__class__(zip(keys, values)) return values def planckianCT2XYZ(T, scale=1.0): """ Convert from planckian temperature to XYZ. T = temperature in Kelvin. """ xyY = planckianCT2xyY(T, scale) if xyY: return xyY2XYZ(*xyY) def planckianCT2xyY(T, scale=1.0): """ Convert from planckian temperature to xyY. T = temperature in Kelvin. Formula from http://en.wikipedia.org/wiki/Planckian_locus """ if 1667 <= T and T <= 4000: x = ( -0.2661239 * (math.pow(10, 9) / math.pow(T, 3)) - 0.2343580 * (math.pow(10, 6) / math.pow(T, 2)) + 0.8776956 * (math.pow(10, 3) / T) + 0.179910) elif 4000 <= T and T <= 25000: x = ( -3.0258469 * (math.pow(10, 9) / math.pow(T, 3)) + 2.1070379 * (math.pow(10, 6) / math.pow(T, 2)) + 0.2226347 * (math.pow(10, 3) / T) + 0.24039) else: return None if 1667 <= T and T <= 2222: y = ( -1.1063814 * math.pow(x, 3) - 1.34811020 * math.pow(x, 2) + 2.18555832 * x - 0.20219683) elif 2222 <= T and T <= 4000: y = ( -0.9549476 * math.pow(x, 3) - 1.37418593 * math.pow(x, 2) + 2.09137015 * x - 0.16748867) elif 4000 <= T and T <= 25000: y = ( 3.0817580 * math.pow(x, 3) - 5.87338670 * math.pow(x, 2) + 3.75112997 * x - 0.37001483) return x, y, scale def xyY2CCT(x, y, Y=1.0): """ Convert from xyY to correlated color temperature. """ return XYZ2CCT(*xyY2XYZ(x, y, Y)) def xyY2Lab(x, y, Y=1.0, whitepoint=None): X, Y, Z = xyY2XYZ(x, y, Y) return XYZ2Lab(X, Y, Z, whitepoint) def xyY2Lu_v_(x, y, Y=1.0, whitepoint=None): X, Y, Z = xyY2XYZ(x, y, Y) return XYZ2Lu_v_(X, Y, Z, whitepoint) def xyY2RGB(x, y, Y, rgb_space=None, scale=1.0, round_=False, clamp=True): """ Convert from xyY to RGB """ X, Y, Z = xyY2XYZ(x, y, Y) return XYZ2RGB(X, Y, Z, rgb_space, scale, round_, clamp) def xyY2XYZ(x, y, Y=1.0): """ Convert from xyY to XYZ. Based on formula from http://brucelindbloom.com/Eqn_xyY_to_XYZ.html Implementation Notes: 1. Watch out for the case where y = 0. In that case, X = Y = Z = 0 is returned. 2. The output XYZ values are in the nominal range [0.0, Y[xyY]]. """ if y == 0: return 0, 0, 0 X = float(x * Y) / y Z = float((1 - x - y) * Y) / y return X, Y, Z def LERP(a,b,c): """ LERP(a,b,c) = linear interpolation macro. Is 'a' when c == 0.0 and 'b' when c == 1.0 """ return (b - a) * c + a def XYZ2CCT(X, Y, Z): """ Convert from XYZ to correlated color temperature. Derived from ANSI C implementation by Bruce Lindbloom http://brucelindbloom.com/Eqn_XYZ_to_T.html Return: correlated color temperature if successful, else None. Description: This is an implementation of Robertson's method of computing the correlated color temperature of an XYZ color. It can compute correlated color temperatures in the range [1666.7K, infinity]. Reference: "Color Science: Concepts and Methods, Quantitative Data and Formulae", Second Edition, Gunter Wyszecki and W. S. Stiles, John Wiley & Sons, 1982, pp. 227, 228. """ rt = [ # reciprocal temperature (K) DBL_MIN, 10.0e-6, 20.0e-6, 30.0e-6, 40.0e-6, 50.0e-6, 60.0e-6, 70.0e-6, 80.0e-6, 90.0e-6, 100.0e-6, 125.0e-6, 150.0e-6, 175.0e-6, 200.0e-6, 225.0e-6, 250.0e-6, 275.0e-6, 300.0e-6, 325.0e-6, 350.0e-6, 375.0e-6, 400.0e-6, 425.0e-6, 450.0e-6, 475.0e-6, 500.0e-6, 525.0e-6, 550.0e-6, 575.0e-6, 600.0e-6 ] uvt = [ [0.18006, 0.26352, -0.24341], [0.18066, 0.26589, -0.25479], [0.18133, 0.26846, -0.26876], [0.18208, 0.27119, -0.28539], [0.18293, 0.27407, -0.30470], [0.18388, 0.27709, -0.32675], [0.18494, 0.28021, -0.35156], [0.18611, 0.28342, -0.37915], [0.18740, 0.28668, -0.40955], [0.18880, 0.28997, -0.44278], [0.19032, 0.29326, -0.47888], [0.19462, 0.30141, -0.58204], [0.19962, 0.30921, -0.70471], [0.20525, 0.31647, -0.84901], [0.21142, 0.32312, -1.0182], [0.21807, 0.32909, -1.2168], [0.22511, 0.33439, -1.4512], [0.23247, 0.33904, -1.7298], [0.24010, 0.34308, -2.0637], [0.24792, 0.34655, -2.4681], # Note: 0.24792 is a corrected value # for the error found in W&S as 0.24702 [0.25591, 0.34951, -2.9641], [0.26400, 0.35200, -3.5814], [0.27218, 0.35407, -4.3633], [0.28039, 0.35577, -5.3762], [0.28863, 0.35714, -6.7262], [0.29685, 0.35823, -8.5955], [0.30505, 0.35907, -11.324], [0.31320, 0.35968, -15.628], [0.32129, 0.36011, -23.325], [0.32931, 0.36038, -40.770], [0.33724, 0.36051, -116.45] ] if ((X < 1.0e-20 and Y < 1.0e-20 and Z < 1.0e-20) or X + 15.0 * Y + 3.0 * Z == 0): return None # protect against possible divide-by-zero failure us = (4.0 * X) / (X + 15.0 * Y + 3.0 * Z) vs = (6.0 * Y) / (X + 15.0 * Y + 3.0 * Z) dm = 0.0 i = 0 while i < 31: di = (vs - uvt[i][1]) - uvt[i][2] * (us - uvt[i][0]) if i > 0 and ((di < 0.0 and dm >= 0.0) or (di >= 0.0 and dm < 0.0)): break # found lines bounding (us, vs) : i-1 and i dm = di i += 1 if (i == 31): # bad XYZ input, color temp would be less than minimum of 1666.7 # degrees, or too far towards blue return None di = di / math.sqrt(1.0 + uvt[i ][2] * uvt[i ][2]) dm = dm / math.sqrt(1.0 + uvt[i - 1][2] * uvt[i - 1][2]) p = dm / (dm - di) # p = interpolation parameter, 0.0 : i-1, 1.0 : i p = 1.0 / (LERP(rt[i - 1], rt[i], p)) return p def XYZ2DIN99(X, Y, Z, whitepoint=None): X, Y, Z = (max(v, 0) for v in (X, Y, Z)) L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return Lab2DIN99(L, a, b) def XYZ2DIN99b(X, Y, Z, whitepoint=None): L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return Lab2DIN99b(L, a, b) def XYZ2DIN99bLCH(X, Y, Z, whitepoint=None): L, a, b = XYZ2Lab(X, Y, Z, whitepoint) return Lab2DIN99bLCH(L, a, b) def XYZ2DIN99c(X, Y, Z, whitepoint=None): return XYZ2DIN99cd(X, Y, Z, .1, 317.651, .0037, 0, .94, 23, .066, whitepoint) def XYZ2DIN99cd(X, Y, Z, x, l1, l2, deg, f1, c1, c2, whitepoint=None): L99, C99, H99 = XYZ2DIN99cdLCH(X, Y, Z, x, l1, l2, deg, f1, c1, c2, whitepoint) a99, b99 = DIN99familyCH2DIN99ab(C99, H99) return L99, a99, b99 def XYZ2DIN99cdLCH(X, Y, Z, x, l1, l2, deg, f1, c1, c2, whitepoint=None): X, Y, Z = XYZ2DIN99cdXYZ(X, Y, Z, x) whitepoint99d = XYZ2DIN99cdXYZ(*get_whitepoint(whitepoint, 100), x=x) L, a, b = XYZ2Lab(X, Y, Z, whitepoint99d) return Lab2DIN99bcdLCH(L, a, b, l1, l2, deg, f1, c1, c2) def XYZ2DIN99cdXYZ(X, Y, Z, x): X = (1 + x) * X - x * Z return X, Y, Z def XYZ2DIN99d(X, Y, Z, whitepoint=None): return XYZ2DIN99cd(X, Y, Z, .12, 325.221, .0036, 50, 1.14, 22.5, .06, whitepoint) def XYZ2DIN99dLCH(X, Y, Z, whitepoint=None): return XYZ2DIN99cdLCH(X, Y, Z, .12, 325.221, .0036, 50, 1.14, 22.5, .06, whitepoint) def XYZ2IPT(X, Y, Z): XYZ2LMS_matrix = get_cat_matrix("IPT") LMS = XYZ2LMS_matrix * (X, Y, Z) for i, component in enumerate(LMS): if component >= 0: LMS[i] **= 0.43 else: LMS[i] = -(-component) ** 0.43 return LMS2IPT_matrix * LMS def IPT2XYZ(I, P, T): XYZ2LMS_matrix = get_cat_matrix("IPT") LMS2XYZ_matrix = XYZ2LMS_matrix.inverted() LMS = IPT2LMS_matrix * (I, P, T) for i, component in enumerate(LMS): if component >= 0: LMS[i] **= 1 / 0.43 else: LMS[i] = -(-component) ** (1 / 0.43) return LMS2XYZ_matrix * LMS def XYZ2Lab(X, Y, Z, whitepoint=None): """ Convert from XYZ to Lab. The input Y value needs to be in the nominal range [0.0, 100.0] and other input values scaled accordingly. The output L value is in the nominal range [0.0, 100.0]. whitepoint can be string (e.g. "D50"), a tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_Lab.html """ Xr, Yr, Zr = get_whitepoint(whitepoint, 100) xr = X / Xr yr = Y / Yr zr = Z / Zr fx = cbrt(xr) if xr > LSTAR_E else (LSTAR_K * xr + 16) / 116.0 fy = cbrt(yr) if yr > LSTAR_E else (LSTAR_K * yr + 16) / 116.0 fz = cbrt(zr) if zr > LSTAR_E else (LSTAR_K * zr + 16) / 116.0 L = 116 * fy - 16 a = 500 * (fx - fy) b = 200 * (fy - fz) return L, a, b def XYZ2Lpt(X, Y, Z, whitepoint=None): """ Convert from XYZ to Lpt This is a modern update to L*a*b*, based on IPT space. Differences to L*a*b* and IPT: - Using inverse CIE 2012 2degree LMS to XYZ matrix instead of Hunt-Pointer-Estevez Von Kries chromatic adapation in LMS space. - Using L* compression rather than IPT pure 0.43 power. - Tweaked LMS' to IPT matrix to account for change in XYZ to LMS matrix. - Output scaled to L*a*b* type ranges, to maintain 1 JND scale. - L* value is not a non-linear Y value. The input Y value needs to be in the nominal range [0.0, 100.0] and other input values scaled accordingly. The output L value is in the nominal range [0.0, 100.0]. whitepoint can be string (e.g. "D50"), a tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. """ # Adapted from Argyll/icc/icc.c xyz2lms = get_cat_matrix("CIE2012_2") wlms = xyz2lms * get_whitepoint(whitepoint, 100) lms = xyz2lms * (X, Y, Z) for j in xrange(3): lms[j] /= wlms[j] if (lms[j] > 0.008856451586): lms[j] = pow(lms[j], 1.0 / 3.0); else: lms[j] = 7.787036979 * lms[j] + 16.0 / 116.0 lms[j] = 116.0 * lms[j] - 16.0 return LMS2Lpt_matrix * lms def Lpt2XYZ(L, p, t, whitepoint=None, scale=1.0): """ Convert from Lpt to XYZ This is a modern update to L*a*b*, based on IPT space. Differences to L*a*b* and IPT: - Using inverse CIE 2012 2degree LMS to XYZ matrix instead of Hunt-Pointer-Estevez Von Kries chromatic adapation in LMS space. - Using L* compression rather than IPT pure 0.43 power. - Tweaked LMS' to IPT matrix to account for change in XYZ to LMS matrix. - Output scaled to L*a*b* type ranges, to maintain 1 JND scale. - L* value is not a non-linear Y value. The input L* value needs to be in the nominal range [0.0, 100.0] and other input values scaled accordingly. The output XYZ values are in the nominal range [0.0, 1.0]. whitepoint can be string (e.g. "D50"), a tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. """ # Adapted from Argyll/icc/icc.c xyz2lms = get_cat_matrix("CIE2012_2") lms2xyz = xyz2lms.inverted() wlms = xyz2lms * get_whitepoint(whitepoint, scale) lms = Lpt2LMS_matrix * (L, p, t) for j in xrange(3): lms[j] = (lms[j] + 16.0) / 116.0 if lms[j] > 24.0 / 116.0: lms[j] = pow(lms[j], 3.0) else: lms[j] = (lms[j] - 16.0 / 116.0) / 7.787036979 lms[j] *= wlms[j] return lms2xyz * lms def XYZ2Lu_v_(X, Y, Z, whitepoint=None): """ Convert from XYZ to CIE Lu'v' """ if X + Y + Z == 0: # We can't check for X == Y == Z == 0 because they may actually add up # to 0, thus resulting in ZeroDivisionError later L, u_, v_ = XYZ2Lu_v_(*get_whitepoint(whitepoint)) return 0.0, u_, v_ Xr, Yr, Zr = get_whitepoint(whitepoint, 100) yr = Y / Yr L = 116.0 * cbrt(yr) - 16.0 if yr > LSTAR_E else LSTAR_K * yr u_ = (4.0 * X) / (X + 15.0 * Y + 3.0 * Z) v_ = (9.0 * Y) / (X + 15.0 * Y + 3.0 * Z) return L, u_, v_ def XYZ2Luv(X, Y, Z, whitepoint=None): """ Convert from XYZ to Luv """ if X + Y + Z == 0: # We can't check for X == Y == Z == 0 because they may actually add up # to 0, thus resulting in ZeroDivisionError later L, u, v = XYZ2Luv(*get_whitepoint(whitepoint)) return 0.0, u, v Xr, Yr, Zr = get_whitepoint(whitepoint, 100) yr = Y / Yr L = 116.0 * cbrt(yr) - 16.0 if yr > LSTAR_E else LSTAR_K * yr u_ = (4.0 * X) / (X + 15.0 * Y + 3.0 * Z) v_ = (9.0 * Y) / (X + 15.0 * Y + 3.0 * Z) u_r = (4.0 * Xr) / (Xr + 15.0 * Yr + 3.0 * Zr) v_r = (9.0 * Yr) / (Xr + 15.0 * Yr + 3.0 * Zr) u = 13.0 * L * (u_ - u_r) v = 13.0 * L * (v_ - v_r) return L, u, v def XYZ2RGB(X, Y, Z, rgb_space=None, scale=1.0, round_=False, clamp=True, oetf=None): """ Convert from XYZ to RGB. Use optional RGB colorspace definition, which can be a named colorspace (e.g. "CIE RGB") or must be a tuple in the following format: (gamma, whitepoint, red, green, blue) whitepoint can be a string (e.g. "D50"), a tuple of XYZ coordinates, or a color temperatur in degrees K (float or int). Gamma should be a float. The RGB primaries red, green, blue should be lists or tuples of xyY coordinates (only x and y will be used, so Y can be zero or None). If no colorspace is given, it defaults to sRGB. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_RGB.html Implementation Notes: 1. The transformation matrix [M] is calculated from the RGB reference primaries as discussed here: http://brucelindbloom.com/Eqn_RGB_XYZ_Matrix.html 2. gamma is the gamma value of the RGB color system used. Many common ones may be found here: http://brucelindbloom.com/WorkingSpaceInfo.html#Specifications 3. The output RGB values are in the nominal range [0.0, scale]. 4. If the input XYZ color is not relative to the same reference white as the RGB system, you must first apply a chromatic adaptation transform [http://brucelindbloom.com/Eqn_ChromAdapt.html] to the XYZ color to convert it from its own reference white to the reference white of the RGB system. 5. Sometimes the more complicated special case of sRGB shown above is replaced by a "simplified" version using a straight gamma function with gamma = 2.2. """ trc, whitepoint, rxyY, gxyY, bxyY, matrix = get_rgb_space(rgb_space) RGB = matrix.inverted() * [X, Y, Z] is_trc = isinstance(trc, (list, tuple)) for i, v in enumerate(RGB): if is_trc: gamma = trc[i] else: gamma = trc if oetf: RGB[i] = oetf(v) elif isinstance(gamma, (list, tuple)): RGB[i] = interp(v, gamma, [n / float(len(gamma) - 1) for n in xrange(len(gamma))]) else: RGB[i] = specialpow(v, 1.0 / gamma) if clamp: RGB[i] = min(1.0, max(0.0, RGB[i])) RGB[i] *= scale if round_ is not False: RGB[i] = round(RGB[i], round_) return RGB def XYZ2xyY(X, Y, Z, whitepoint=None): """ Convert from XYZ to xyY. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_xyY.html Implementation Notes: 1. Watch out for black, where X = Y = Z = 0. In that case, x and y are set to the chromaticity coordinates of the reference whitepoint. 2. The output Y value is in the nominal range [0.0, Y[XYZ]]. """ if X + Y + Z == 0: # We can't check for X == Y == Z == 0 because they may actually add up # to 0, thus resulting in ZeroDivisionError later x, y, Y = XYZ2xyY(*get_whitepoint(whitepoint)) return x, y, 0.0 x = X / float(X + Y + Z) y = Y / float(X + Y + Z) return x, y, Y def xy_CCT_delta(x, y, daylight=True, method=2000): """ Return CCT and delta to locus """ cct = xyY2CCT(x, y) d = None if cct: locus = None if daylight: # Daylight locus if 4000 <= cct <= 25000: locus = CIEDCCT2XYZ(cct, 100.0) else: # Planckian locus if 1667 <= cct <= 25000: locus = planckianCT2XYZ(cct, 100.0) if locus: L1, a1, b1 = xyY2Lab(x, y, 100.0) L2, a2, b2 = XYZ2Lab(*locus) d = delta(L1, a1, b1, L2, a2, b2, method) return cct, d def dmatrixz(nrl, nrh, ncl, nch): # Adapted from ArgyllCMS numlib/numsup.c #nrl # Row low index #nrh # Row high index #ncl # Col low index #nch # Col high index m = {} if nrh < nrl: # Prevent failure for 0 dimension nrh = nrl if nch < ncl: nch = ncl rows = nrh - nrl + 1 cols = nch - ncl + 1 for i in xrange(rows): m[i + nrl] = {} for j in xrange(cols): m[i][j + ncl] = 0 return m def dvector(nl, nh): # Adapted from ArgyllCMS numlib/numsup.c #nl # Lowest index #nh # Highest index return {} def gam_fit(gf, v): # Adapted from ArgyllCMS xicc/xicc.c """ gamma + input offset function handed to powell() """ gamma = v[0] rv = 0.0 if gamma < 0.0: rv += 100.0 * -gamma gamma = 1e-4 t1 = math.pow(gf.bp, 1.0 / gamma); t2 = math.pow(gf.wp, 1.0 / gamma); b = t1 / (t2 - t1) # Offset a = math.pow(t2 - t1, gamma) # Gain # Comput 50% output for this technical gamma # (All values are without output offset being added in) t1 = a * math.pow(0.5 + b, gamma) t1 = t1 - gf.thyr rv += t1 * t1 return rv def linmin(cp, xi, di, ftol, func, fdata): # Adapted from ArgyllCMS numlib/powell.c """ Line bracketing and minimisation routine. Return value at minimum. """ POWELL_GOLD = 1.618034 POWELL_CGOLD = 0.3819660 POWELL_MAXIT = 100 #cp # Start point, and returned value #xi[] # Search vector #di # Dimensionality #ftol # Tolerance to stop on #func # Error function to evaluate #fdata # Opaque data for func() #ax, xx, bx # Search vector multipliers #af, xf, bf # Function values at those points #xt, XT # Trial point XT = {} if di <= 10: xt = XT else: xt = dvector(0, di-1) # Vector for trial point # -------------------------- # First bracket the solution logging.debug("linmin: Bracketing solution") # The line is measured as startpoint + offset * search vector. # (Search isn't symetric, but it seems to depend on cp being # best current solution ?) ax = 0.0 for i in xrange(di): xt[i] = cp[i] + ax * xi[i] af = func(fdata, xt) # xx being vector offset 0.618 xx = 1.0 / POWELL_GOLD for i in xrange(di): xt[i] = cp[i] + xx * xi[i] xf = func(fdata, xt) logging.debug("linmin: Initial points a:%f:%f -> b:%f:%f" % (ax, af, xx, xf)) # Fix it so that we are decreasing from point a -> x if xf > af: tt = ax ax = xx xx = tt tt = af af = xf xf = tt logging.debug("linmin: Ordered Initial points a:%f:%f -> b:%f:%f" % (ax, af, xx, xf)) bx = xx + POWELL_GOLD * (xx-ax) # Guess b beyond a -> x for i in xrange(di): xt[i] = cp[i] + bx * xi[i] bf = func(fdata, xt) logging.debug("linmin: Initial bracket a:%f:%f x:%f:%f b:%f:%f" % (ax, af, xx, xf, bx, bf)) # While not bracketed while xf > bf: logging.debug("linmin: Not bracketed because xf %f > bf %f" % (xf, bf)) logging.debug(" ax = %f, xx = %f, bx = %f" % (ax, xx, bx)) # Compute ux by parabolic interpolation from a, x & b q = (xx - bx) * (xf - af) r = (xx - ax) * (xf - bf) tt = q - r if tt >= 0.0 and tt < 1e-20: # If +ve too small tt = 1e-20 elif tt <= 0.0 and tt > -1e-20: # If -ve too small tt = -1e-20 ux = xx - ((xx - bx) * q - (xx - ax) * r) / (2.0 * tt) ulim = xx + 100.0 * (bx - xx) # Extrapolation limit if (xx - ux) * (ux - bx) > 0.0: # u is between x and b for i in xrange(di): # Evaluate u xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) if uf < bf: # Minimum is between x and b ax = xx af = xf xx = ux xf = uf break elif uf > xf: # Minimum is between a and u bx = ux bf = uf break # Parabolic fit didn't work, look further out in direction of b ux = bx + POWELL_GOLD * (bx - xx) elif (bx - ux) * (ux - ulim) > 0.0: # u is between b and limit for i in xrange(di): # Evaluate u xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) if uf > bf: # Minimum is between x and u ax = xx af = xf xx = bx xf = bf bx = ux bf = uf break xx = bx xf = bf # Continue looking bx = ux bf = uf ux = bx + POWELL_GOLD * (bx - xx) # Test beyond b elif (ux - ulim) * (ulim - bx) >= 0.0: # u is beyond limit ux = ulim else: # u is to left side of x ? ux = bx + POWELL_GOLD * (bx - xx) # Evaluate u, and move into place at b for i in xrange(di): xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) ax = xx af = xf xx = bx xf = bf bx = ux bf = uf logging.debug("linmin: Got bracket a:%f:%f x:%f:%f b:%f:%f" % (ax, af, xx, xf, bx, bf)) # Got bracketed minimum between a -> x -> b # --------------------------------------- # Now use brent minimiser bewteen a and b if True: # a and b bracket solution # x is best function value so far # w is second best function value so far # v is previous second best, or third best # u is most recently tested point #wx, vx, ux # Search vector multipliers #wf vf = 0.0 #uf # Function values at those points de = 0.0 # Distance moved on previous step e = 0.0 # Distance moved on 2nd previous step # Make sure a and b are in ascending order if ax > bx: tt = ax ax = bx bx = tt tt = af af = bf bf = tt wx = vx = xx # Initial values of other center points wf = xf = xf for iter in xrange(1, POWELL_MAXIT + 1): mx = 0.5 * (ax + bx) # m is center of bracket values #if ABSTOL: #tol1 = ftol # Absolute tollerance #else: tol1 = ftol * abs(xx) + 1e-10 tol2 = 2.0 * tol1 logging.debug("linmin: Got bracket a:%f:%f x:%f:%f b:%f:%f" % (ax, af, xx, xf, bx, bf)) # See if we're done if abs(xx - mx) <= (tol2 - 0.5 * (bx - ax)): logging.debug("linmin: We're done because %f <= %f" % (abs(xx - mx), tol2 - 0.5 * (bx - ax))) break if abs(e) > tol1: # Do a trial parabolic fit r = (xx - wx) * (xf-vf) q = (xx - vx) * (xf-wf) p = (xx - vx) * q - (xx-wx) * r q = 2.0 * (q - r) if q > 0.0: p = -p else: q = -q te = e # Save previous e value e = de # Previous steps distance moved logging.debug("linmin: Trial parabolic fit") if (abs(p) >= abs(0.5 * q * te) or p <= q * (ax - xx) or p >= q * (bx - xx)): # Give up on the parabolic fit, and use the golden section search e = ax - xx if xx >= mx else bx - xx # Override previous distance moved */ de = POWELL_CGOLD * e logging.debug("linmin: Moving to golden section search") else: # Use parabolic fit de = p / q # Change in xb ux = xx + de # Trial point according to parabolic fit if (ux - ax) < tol2 or (bx - ux) < tol2: if (mx - xx) > 0.0: # Don't use parabolic, use tol1 de = tol1 # tol1 is +ve else: de = -tol1 logging.debug("linmin: Using parabolic fit") else: # Keep using the golden section search e = ax - xx if xx >= mx else bx - xx # Override previous distance moved de = POWELL_CGOLD * e logging.debug("linmin: Continuing golden section search") if abs(de) >= tol1: # If de moves as much as tol1 would ux = xx + de # use it logging.debug("linmin: ux = %f = xx %f + de %f" % (ux, xx, de)) else: # else move by tol1 in direction de if de > 0.0: ux = xx + tol1 logging.debug("linmin: ux = %f = xx %f + tol1 %f" % (ux, xx, tol1)) else: ux = xx - tol1 logging.debug("linmin: ux = %f = xx %f - tol1 %f" % (ux, xx, tol1)) # Evaluate function for i in xrange(di): xt[i] = cp[i] + ux * xi[i] uf = func(fdata, xt) if uf <= xf: # Found new best solution if ux >= xx: ax = xx af = xf # New lower bracket else: bx = xx bf = xf # New upper bracket vx = wx vf = wf # New previous 2nd best solution wx = xx wf = xf # New 2nd best solution from previous best xx = ux xf = uf # New best solution from latest logging.debug("linmin: found new best solution") else: # Found a worse solution if ux < xx: ax = ux af = uf # New lower bracket else: bx = ux bf = uf # New upper bracket if uf <= wf or wx == xx: # New 2nd best solution, or equal best vx = wx vf = wf # New previous 2nd best solution wx = ux wf = uf # New 2nd best from latest elif uf <= vf or vx == xx or vx == wx: # New 3rd best, or equal 1st & 2nd vx = ux vf = uf # New previous 2nd best from latest logging.debug("linmin: found new worse solution") # !!! should do something if iter > POWELL_MAXIT !!!! # Solution is at xx, xf # Compute solution vector for i in xrange(di): cp[i] += xx * xi[i] return xf def powell(di, cp, s, ftol, maxit, func, fdata, prog=None, pdata=None): # Adapted from ArgyllCMS powell.c """ Standard interface for powell function return True on sucess, False on failure due to excessive iterions Result will be in cp """ DBL_EPSILON = 2.2204460492503131e-016 #di # Dimentionality #cp # Initial starting point #s # Size of initial search area #ftol # Tolerance of error change to stop on #maxit # Maximum iterations allowed #func # Error function to evaluate #fdata # Opaque data needed by function #prog # Optional progress percentage callback #pdata # Opaque data needed by prog() #dmtx # Direction vector #sp # Sarting point before exploring all the directions #xpt # Extrapolated point #svec # Search vector #retv # Returned function value at p #stopth # Current stop threshold */ startdel = -1.0 # Initial change in function value #curdel # Current change in function value pc = 0 # Percentage complete dmtx = dmatrixz(0, di - 1, 0, di - 1) # Zero filled spt = dvector(0, di - 1) xpt = dvector(0, di - 1) svec = dvector(0, di - 1) # Create initial direction matrix by # placing search start on diagonal for i in xrange(di): dmtx[i][i] = s[i] # Save the starting point spt[i] = cp[i] if prog: # Report initial progress prog(pdata, pc) # Initial function evaluation retv = func(fdata, cp) # Iterate untill we converge on a solution, or give up. for iter in xrange(1, maxit): #lretv # Last function return value ibig = 0 # Index of biggest delta del_ = 0.0 # Biggest function value decrease #pretv # Previous function return value pretv = retv # Save return value at top of iteration # Loop over all directions in the set for i in xrange(di): logging.debug("Looping over direction %d" % i) for j in xrange(di): # Extract this direction to make search vector svec[j] = dmtx[j][i] # Minimize in that direction lretv = retv retv = linmin(cp, svec, di, ftol, func, fdata) # Record bigest function decrease, and dimension it occured on if abs(lretv - retv) > del_: del_ = abs(lretv - retv) ibig = i #if ABSTOL: #stopth = ftol # Absolute tollerance #else stopth = ftol * 0.5 * (abs(pretv) + abs(retv) + DBL_EPSILON) curdel = abs(pretv - retv) if startdel < 0.0: startdel = curdel elif curdel > 0 and startdel > 0: tt = (100.0 * math.pow((math.log(curdel) - math.log(startdel)) / (math.log(stopth) - math.log(startdel)), 4.0) + 0.5) if tt > pc and tt < 100: pc = tt if prog: # Report initial progress prog(pdata, pc) # If we have had at least one change of direction and # reached a suitable tollerance, then finish if iter > 1 and curdel <= stopth: logging.debug("Reached stop tollerance because curdel %f <= stopth " "%f" % (curdel, stopth)) break logging.debug("Not stopping because curdel %f > stopth %f" % (curdel, stopth)) for i in xrange(di): svec[i] = cp[i] - spt[i] # Average direction moved after minimization round xpt[i] = cp[i] + svec[i] # Extrapolated point after round of minimization spt[i] = cp[i] # New start point for next round # Function value at extrapolated point lretv = func(fdata, xpt) if lretv < pretv: # If extrapolation is an improvement t1 = pretv - retv - del_ t2 = pretv - lretv t = 2.0 * (pretv -2.0 * retv + lretv) * t1 * t1 - del_ * t2 * t2 if t < 0.0: # Move to the minimum of the new direction retv = linmin(cp, svec, di, ftol, func, fdata) for i in xrange(di): # Save the new direction dmtx[i][ibig] = svec[i] # by replacing best previous if prog: # Report final progress prog(pdata, 100) if iter < maxit: return True logging.debug("powell: returning False due to excessive iterations") return False # Failed due to execessive iterations def xicc_tech_gamma(egamma, off, outoffset=0.0): # Adapted from ArgyllCMS xicc.c """ Given the effective gamma and the output offset Y, return the technical gamma needed for the correct 50% response. """ gf = gam_fits() op = {} sa = {} if off <= 0.0: return egamma # We set up targets without outo being added outo = off * outoffset # Offset acounted for in output gf.bp = off - outo # Black value for 0 % input gf.wp = 1.0 - outo # White value for 100% input gf.thyr = math.pow(0.5, egamma) - outo # Advetised 50% target op[0] = egamma sa[0] = 0.1 if not powell(1, op, sa, 1e-6, 500, gam_fit, gf): logging.warn("Computing effective gamma and input offset is inaccurate") return op[0] class gam_fits(object): # Adapted from ArgyllCMS xicc/xicc.c def __init__(self, wp=1.0, thyr=.2, bp=0.0): self.wp = wp # 100% input target self.thyr = thyr # 50% input target self.bp = bp # 0% input target class Interp(object): def __init__(self, xp, fp, left=None, right=None, use_numpy=False): if use_numpy: # Use numpy for speed import numpy xp = numpy.array(xp) fp = numpy.array(fp) self.numpy = numpy self.xp = xp self.fp = fp self.left = left self.right = right self.lookup = {} self.use_numpy = use_numpy def __call__(self, x): if not x in self.lookup: self.lookup[x] = self._interp(x) return self.lookup[x] def _interp(self, x): if self.use_numpy: return self.numpy.interp(x, self.xp, self.fp, self.left, self.right) else: return interp(x, self.xp, self.fp, self.left, self.right) class BT1886(object): # Adapted from ArgyllCMS xicc/xicc.c """ BT.1886 like transfer function """ def __init__(self, matrix, XYZbp, outoffset=0.0, gamma=2.4, apply_trc=True): """ Setup BT.1886 for the given target If apply_trc is False, apply only the black point blending portion of BT.1886 mapping. Note that this will only work correctly for an output offset of 1.0 """ if not apply_trc and outoffset < 1: raise ValueError("Output offset must be 1.0 when not applying gamma") self.bwd_matrix = matrix.inverted() self.fwd_matrix = matrix self.gamma = gamma Lab = XYZ2Lab(*[v * 100 for v in XYZbp]) # For bp blend self.outL = Lab[0] # a* b* correction needed self.tab = list(Lab) self.tab[0] = 0 # 0 because bt1886 maps L to target if XYZbp[1] < 0: XYZbp = list(XYZbp) XYZbp[1] = 0.0 # Offset acounted for in output self.outo = XYZbp[1] * outoffset # Balance of offset accounted for in input ino = XYZbp[1] - self.outo # Input offset black to 1/pow bkipow = math.pow(ino, 1.0 / self.gamma) # Input offset white to 1/pow wtipow = math.pow(1.0 - self.outo, 1.0 / self.gamma) # non-linear Y that makes input offset proportion of black point self.ingo = bkipow / (wtipow - bkipow) # Scale to make input of 1 map to 1.0 - self.outo self.outsc = pow(wtipow - bkipow, self.gamma) self.apply_trc = apply_trc def apply(self, X, Y, Z): """ Apply BT.1886 black offset and gamma curve to the XYZ out of the input profile. Do this in the colorspace defined by the input profile matrix lookup, so it will be relative XYZ. We assume that BT.1886 does a Rec709 to gamma viewing adjustment, on top of any source profile transfer curve (i.e. BT.1886 viewing adjustment is assumed to be the mismatch between Rec709 curve and the output offset pure 2.4 gamma curve) """ logging.debug("bt1886 XYZ in %f %f %f" % (X, Y, Z)) out = self.bwd_matrix * (X, Y, Z) logging.debug("bt1886 RGB in %f %f %f" % (out[0], out[1], out[2])) for j in xrange(3): vv = out[j] if self.apply_trc: # Convert linear light to Rec709 transfer curve if vv < 0.018: vv = 4.5 * vv else: vv = 1.099 * math.pow(vv, 0.45) - 0.099 # Apply input offset vv = vv + self.ingo # Apply power and scale if vv > 0.0: if self.apply_trc: vv = self.outsc * math.pow(vv, self.gamma) else: vv *= self.outsc # Apply output portion of offset vv += self.outo out[j] = vv out = self.fwd_matrix * out logging.debug("bt1886 RGB bt.1886 %f %f %f" % (out[0], out[1], out[2])) out = list(XYZ2Lab(*[v * 100 for v in out])) logging.debug("bt1886 Lab after Y adj. %f %f %f" % (out[0], out[1], out[2])) # Blend ab to required black point offset self.tab[] as L approaches black. vv = (out[0] - self.outL) / (100.0 - self.outL) # 0 at bp, 1 at wp vv = 1.0 - vv if vv < 0.0: vv = 0.0 elif vv > 1.0: vv = 1.0 vv = math.pow(vv, 40.0) out[0] += vv * self.tab[0] out[1] += vv * self.tab[1] out[2] += vv * self.tab[2] logging.debug("bt1886 Lab after wp adj. %f %f %f" % (out[0], out[1], out[2])) out = Lab2XYZ(*out) logging.debug("bt1886 XYZ out %f %f %f" % (out[0], out[1], out[2])) return out class BT2390(object): """ Roll-off for SMPTE 2084 (PQ) according to Report ITU-R BT.2390-2 HDR TV """ def __init__(self, black_cdm2, white_cdm2, master_black_cdm2=0, master_white_cdm2=10000): """ Master black and white level are used to tweak the roll-off and clip. """ self.black_cdm2 = black_cdm2 self.white_cdm2 = white_cdm2 self.master_black_cdm2 = master_black_cdm2 self.master_white_cdm2 = master_white_cdm2 self.ominv = black_cdm2 / 10000.0 # Lmin self.omini = specialpow(self.ominv, 1.0 / -2084) # Original minLum self.omaxv = white_cdm2 / 10000.0 # Lmax self.omaxi = specialpow(self.omaxv, 1.0 / -2084) # Original maxLum self.oKS = 1.5 * self.omaxi - 0.5 # BT.2390-2 self.mminv = master_black_cdm2 / 10000.0 # LB self.mmini = specialpow(self.mminv, 1.0 / -2084) self.mmaxv = master_white_cdm2 / 10000.0 # LW self.mmaxi = specialpow(self.mmaxv, 1.0 / -2084) self.mini = (self.omini - self.mmini) / (self.mmaxi - self.mmini) # Normalized minLum self.minv = specialpow(self.mini, -2084) self.maxi = (self.omaxi - self.mmini) / (self.mmaxi - self.mmini) # Normalized maxLum self.maxv = specialpow(self.maxi, -2084) self.KS = 1.5 * self.maxi - 0.5 @staticmethod def P(B, KS, maxi, maxci=1.0): T = (B - KS) / (1 - KS) E2 = ((2 * T ** 3 - 3 * T ** 2 + 1) * KS + (T ** 3 - 2 * T ** 2 + T) * (1 - KS) + (-2 * T ** 3 + 3 * T ** 2) * maxi) if maxci < 1: # Clipping for slightly better target display peak luminance usage s = min(((B - KS) / (maxci - KS)) ** 4, 1.0) E2 = E2 * (1 - s) + maxi * s return E2 def apply(self, v, KS=None, maxi=None, maxci=1.0, mini=None, mmaxi=None, mmini=None, bpc=False, normalize=True): """ Apply roll-off (E' in, E' out) maxci if < 1.0 applies alterante clip. SHOULD NOT BE USED FOR PQ. """ if KS is None: KS = self.KS if maxi is None: maxi = self.maxi if mini is None: mini = self.mini if mmaxi is None: mmaxi = self.mmaxi if mmini is None: mmini = self.mmini if normalize and mmini is not None and mmaxi is not None: # Normalize PQ values based on mastering display black/white levels E1 = min(max((v - mmini) / (mmaxi - mmini), 0), 1.0) else: E1 = v # BT.2390-3 suggests P[E1] if KS <= E1 <=1, but this results in # division by zero if KS = 1. The correct way is to check for # KS < E1 <=1 if KS < E1 <= 1: E2 = self.P(E1, KS, maxi, maxci) else: E2 = E1 # BT.2390-3 suggests 0 <= E2 <= 1, but this results in a discontinuity # if KS < 0 (high LB > Lmin, low Lmax, high LW). To avoid this, check # for E2 <= 1 instead if mini and E2 <= 1: # Apply black level lift minLum = mini maxLum = maxi b = minLum # BT.2390-3 suggests E2 + b * (1 - E2) ** 4, but this clips, if # minLum > 0.25, due to a 'dip' in the function. The solution is to # adjust the exponent according to minLum. For minLum <= 0.25 # (< 5.15 cd/m2), this will give the same result as 'pure' BT.2390-3 if b >= 0: # Only for positive b i.e. minLum >= LB p = min(1.0 / b, 4) else: # For negative b i.e. minLum < LB p = 4 E3 = E2 + b * (1 - E2) ** p # If maxLum < 1, and the input value reaches maxLum, the resulting # output value will be higher than maxLum after applying the black # level lift (note that this is *not* a side-effect of the above # exponent adjustment). Undo this by re-scaling to the nominal output # range [minLum, maxLum]. if maxi < 1: # Only re-scale if maxLum < 1. Note that maxLum can be > 1 # if Lmax > LW despite E2 <= 1 E3 = convert_range(E3, b, maxi + b * (1 - maxi) ** p, b, maxi) else: E3 = E2 if bpc: E3 = convert_range(E3, mini, maxi, 0, maxi) if normalize and mmini is not None and mmaxi is not None: # Invert the normalization of the PQ values E3 = E3 * (mmaxi - mmini) + mmini return max(E3, 0) class Matrix3x3(list): """ Simple 3x3 matrix """ def __init__(self, matrix=None): if matrix: self.update(matrix) def update(self, matrix): if len(matrix) != 3: raise ValueError('Invalid number of rows for 3x3 matrix: %i' % len(matrix)) while len(self): self.pop() for row in matrix: if len(row) != 3: raise ValueError('Invalid number of columns for 3x3 matrix: %i' % len(row)) self.append([]) for column in row: self[-1].append(column) def __add__(self, matrix): instance = self.__class__() instance.update([[self[0][0] + matrix[0][0], self[0][1] + matrix[0][1], self[0][2] + matrix[0][2]], [self[1][0] + matrix[1][0], self[1][1] + matrix[1][1], self[1][2] + matrix[1][2]], [self[2][0] + matrix[2][0], self[2][1] + matrix[2][1], self[2][2] + matrix[2][2]]]) return instance def __iadd__(self, matrix): # inplace self.update(self.__add__(matrix)) return self def __imul__(self, matrix): # inplace self.update(self.__mul__(matrix)) return self def __mul__(self, matrix): if not isinstance(matrix[0], (list, tuple)): return [matrix[0] * self[0][0] + matrix[1] * self[0][1] + matrix[2] * self[0][2], matrix[0] * self[1][0] + matrix[1] * self[1][1] + matrix[2] * self[1][2], matrix[0] * self[2][0] + matrix[1] * self[2][1] + matrix[2] * self[2][2]] instance = self.__class__() instance.update([[self[0][0]*matrix[0][0] + self[0][1]*matrix[1][0] + self[0][2]*matrix[2][0], self[0][0]*matrix[0][1] + self[0][1]*matrix[1][1] + self[0][2]*matrix[2][1], self[0][0]*matrix[0][2] + self[0][1]*matrix[1][2] + self[0][2]*matrix[2][2]], [self[1][0]*matrix[0][0] + self[1][1]*matrix[1][0] + self[1][2]*matrix[2][0], self[1][0]*matrix[0][1] + self[1][1]*matrix[1][1] + self[1][2]*matrix[2][1], self[1][0]*matrix[0][2] + self[1][1]*matrix[1][2] + self[1][2]*matrix[2][2]], [self[2][0]*matrix[0][0] + self[2][1]*matrix[1][0] + self[2][2]*matrix[2][0], self[2][0]*matrix[0][1] + self[2][1]*matrix[1][1] + self[2][2]*matrix[2][1], self[2][0]*matrix[0][2] + self[2][1]*matrix[1][2] + self[2][2]*matrix[2][2]]]) return instance def adjoint(self): return self.cofactors().transposed() def cofactors(self): instance = self.__class__() instance.update([[(self[1][1]*self[2][2] - self[1][2]*self[2][1]), -1 * (self[1][0]*self[2][2] - self[1][2]*self[2][0]), (self[1][0]*self[2][1] - self[1][1]*self[2][0])], [-1 * (self[0][1]*self[2][2] - self[0][2]*self[2][1]), (self[0][0]*self[2][2] - self[0][2]*self[2][0]), -1 * (self[0][0]*self[2][1] -self[0][1]*self[2][0])], [(self[0][1]*self[1][2] - self[0][2]*self[1][1]), -1 * (self[0][0]*self[1][2] - self[1][0]*self[0][2]), (self[0][0]*self[1][1] - self[0][1]*self[1][0])]]) return instance def determinant(self): return ((self[0][0]*self[1][1]*self[2][2] + self[1][0]*self[2][1]*self[0][2] + self[0][1]*self[1][2]*self[2][0]) - (self[2][0]*self[1][1]*self[0][2] + self[1][0]*self[0][1]*self[2][2] + self[2][1]*self[1][2]*self[0][0])) def invert(self): # inplace self.update(self.inverted()) def inverted(self): determinant = self.determinant() matrix = self.adjoint() instance = self.__class__() instance.update([[matrix[0][0] / determinant, matrix[0][1] / determinant, matrix[0][2] / determinant], [matrix[1][0] / determinant, matrix[1][1] / determinant, matrix[1][2] / determinant], [matrix[2][0] / determinant, matrix[2][1] / determinant, matrix[2][2] / determinant]]) return instance def rounded(self, digits=3): matrix = self.__class__() for row in self: matrix.append([]) for column in row: matrix[-1].append(round(column, digits)) return matrix def transpose(self): self.update(self.transposed()) def transposed(self): instance = self.__class__() instance.update([[self[0][0], self[1][0], self[2][0]], [self[0][1], self[1][1], self[2][1]], [self[0][2], self[1][2], self[2][2]]]) return instance class NumberTuple(tuple): def __repr__(self): return "(%s)" % ", ".join(str(value) for value in self) def round(self, digits=4): return self.__class__(round(value, digits) for value in self) # Chromatic adaption transform matrices # Bradford, von Kries (= HPE normalized to D65) from http://brucelindbloom.com/Eqn_ChromAdapt.html # CAT02 from http://en.wikipedia.org/wiki/CIECAM02#CAT02 # HPE normalized to illuminant E, CAT97s from http://en.wikipedia.org/wiki/LMS_color_space#CAT97s # CMCCAT97 from 'Performance Of Five Chromatic Adaptation Transforms Using # Large Number Of Color Patches', http://hrcak.srce.hr/file/95370 # CMCCAT2000, Sharp from 'Computational colour science using MATLAB' # ISBN 0470845627, http://books.google.com/books?isbn=0470845627 # Cross-verification of the matrix numbers has been done using various sources, # most notably 'Chromatic Adaptation Performance of Different RGB Sensors' # http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.918&rep=rep1&type=pdf cat_matrices = {"Bradford": Matrix3x3([[ 0.89510, 0.26640, -0.16140], [-0.75020, 1.71350, 0.03670], [ 0.03890, -0.06850, 1.02960]]), "CAT02": Matrix3x3([[ 0.7328, 0.4296, -0.1624], [-0.7036, 1.6975, 0.0061], [ 0.0030, 0.0136, 0.9834]]), "CAT97s": Matrix3x3([[ 0.8562, 0.3372, -0.1934], [-0.8360, 1.8327, 0.0033], [ 0.0357, -0.0469, 1.0112]]), "CMCCAT97": Matrix3x3([[ 0.8951, -0.7502, 0.0389], [ 0.2664, 1.7135, 0.0685], [-0.1614, 0.0367, 1.0296]]), "CMCCAT2000": Matrix3x3([[ 0.7982, 0.3389, -0.1371], [-0.5918, 1.5512, 0.0406], [ 0.0008, 0.0239, 0.9753]]), # Hunt-Pointer-Estevez, equal-energy illuminant "HPE normalized to illuminant E": Matrix3x3([[ 0.38971, 0.68898, -0.07868], [-0.22981, 1.18340, 0.04641], [ 0.00000, 0.00000, 1.00000]]), # Süsstrunk et al.15 optimized spectrally sharpened matrix "Sharp": Matrix3x3([[ 1.2694, -0.0988, -0.1706], [-0.8364, 1.8006, 0.0357], [ 0.0297, -0.0315, 1.0018]]), # 'Von Kries' as found on Bruce Lindbloom's site: # Hunt-Pointer-Estevez normalized to D65 # (maybe I should call it that instead of 'Von Kries' # to avoid ambiguity?) "HPE normalized to illuminant D65": Matrix3x3([[ 0.40024, 0.70760, -0.08081], [-0.22630, 1.16532, 0.04570], [ 0.00000, 0.00000, 0.91822]]), "XYZ scaling": Matrix3x3([[1, 0, 0], [0, 1, 0], [0, 0, 1]]), "IPT": Matrix3x3([[ 0.4002, 0.7075, -0.0807], [-0.2280, 1.1500, 0.0612], [ 0.0000, 0.0000, 0.9184]]), # Inverse CIE 2012 2deg LMS to XYZ matrix from Argyll/icc/icc.c "CIE2012_2": Matrix3x3([[ 0.2052445519046028, 0.8334486497310412, -0.0386932016356441], [-0.4972221301804286, 1.4034846060306130, 0.0937375241498157], [ 0.0000000000000000, 0.0000000000000000, 1.0000000000000000]])} LMS2IPT_matrix = Matrix3x3([[ 0.4000, 0.4000, 0.2000], [ 4.4550, -4.8510, 0.3960], [ 0.8056, 0.3572, -1.1628]]) IPT2LMS_matrix = LMS2IPT_matrix.inverted() LinearRGB2LMS_matrix = Matrix3x3([[1688 / 4096., 2146 / 4096., 262 / 4096.], [683 / 4096., 2951 / 4096., 462 / 4096.], [99 / 4096., 309 / 4096., 3688 / 4096.]]) LMS2LinearRGB_matrix = LinearRGB2LMS_matrix.inverted() L_M_S_2ICtCp_matrix = Matrix3x3([[.5, .5, 0], [6610 / 4096., -13613 / 4096., 7003 / 4096.], [17933 / 4096., -17390 / 4096., -543 / 4096.]]) ICtCp2L_M_S__matrix = L_M_S_2ICtCp_matrix.inverted() # Tweaked LMS to IPT matrix to account for CIE 2012 2deg XYZ to LMS matrix # From Argyll/icc/icc.c LMS2Lpt_matrix = Matrix3x3([[ 0.6585034777870502, 0.1424555300344579, 0.1990409921784920], [ 5.6413505933276049, -6.1697985811414187, 0.5284479878138138], [ 1.6370552576322106, 0.0192823194340315, -1.6563375770662419]]) Lpt2LMS_matrix = LMS2Lpt_matrix.inverted() standard_illuminants = { # 1st level is the standard name => illuminant definitions # 2nd level is the illuminant name => CIE XYZ coordinates # (Y should always assumed to be 1.0 and is not explicitly defined) None: {"E": {"X": 1.00000, "Z": 1.00000}}, "ASTM E308-01": {"A": {"X": 1.09850, "Z": 0.35585}, "C": {"X": 0.98074, "Z": 1.18232}, "D50": {"X": 0.96422, "Z": 0.82521}, "D55": {"X": 0.95682, "Z": 0.92149}, "D65": {"X": 0.95047, "Z": 1.08883}, "D75": {"X": 0.94972, "Z": 1.22638}, "F2": {"X": 0.99186, "Z": 0.67393}, "F7": {"X": 0.95041, "Z": 1.08747}, "F11": {"X": 1.00962, "Z": 0.64350}}, "ICC": {"D50": {"X": 0.9642, "Z": 0.8249}, "D65": {"X": 0.9505, "Z": 1.0890}}, "ISO 11664-2:2007": {"D65": {"X": xyY2XYZ(0.3127, 0.329)[0], "Z": xyY2XYZ(0.3127, 0.329)[2]}}, "Wyszecki & Stiles": {"A": {"X": 1.09828, "Z": 0.35547}, "B": {"X": 0.99072, "Z": 0.85223}, "C": {"X": 0.98041, "Z": 1.18103}, "D55": {"X": 0.95642, "Z": 0.92085}, "D65": {"X": 0.95017, "Z": 1.08813}, "D75": {"X": 0.94939, "Z": 1.22558}} } def test(): for i in range(4): if i == 0: wp = "native" elif i == 1: wp = "D50" XYZ = get_standard_illuminant(wp) elif i == 2: wp = "D65" XYZ = get_standard_illuminant(wp) elif i == 3: XYZ = get_standard_illuminant("D65", ("ASTM E308-01", )) wp = " ".join([str(v) for v in XYZ]) print ("RGB and corresponding XYZ (nominal range 0.0 - 1.0) with " "whitepoint %s" % wp) for name in rgb_spaces: spc = rgb_spaces[name] if i == 0: XYZ = CIEDCCT2XYZ(spc[1]) spc = spc[0], XYZ, spc[2], spc[3], spc[4] print "%s 1.0, 1.0, 1.0 = XYZ" % name, \ [str(round(v, 4)) for v in RGB2XYZ(1.0, 1.0, 1.0, spc)] print "%s 1.0, 0.0, 0.0 = XYZ" % name, \ [str(round(v, 4)) for v in RGB2XYZ(1.0, 0.0, 0.0, spc)] print "%s 0.0, 1.0, 0.0 = XYZ" % name, \ [str(round(v, 4)) for v in RGB2XYZ(0.0, 1.0, 0.0, spc)] print "%s 0.0, 0.0, 1.0 = XYZ" % name, \ [str(round(v, 4)) for v in RGB2XYZ(0.0, 0.0, 1.0, spc)] print "" if __name__ == '__main__': test()DisplayCAL-3.5.0.0/DisplayCAL/config.py0000644000076500000000000016564013242301247017254 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Runtime configuration and user settings parser """ import ConfigParser ConfigParser.DEFAULTSECT = "Default" from decimal import Decimal import locale import math import os import re import string import sys from time import gmtime, strftime, timezone if sys.platform == "win32": import _winreg from argyll_names import observers, viewconds, intents, video_encodings from defaultpaths import appdata, commonappdata if sys.platform == "win32": from defaultpaths import commonprogramfiles elif sys.platform == "darwin": from defaultpaths import library, library_home, prefs, prefs_home else: from defaultpaths import (xdg_config_dir_default, xdg_config_home, xdg_data_home, xdg_data_home_default, xdg_data_dirs) from defaultpaths import (autostart, autostart_home, home, iccprofiles, iccprofiles_home) from meta import name as appname, build, lastmod, version from options import ascii, debug, verbose from safe_print import enc, fs_enc, original_codepage from util_io import StringIOu as StringIO from util_os import (expanduseru, expandvarsu, getenvu, is_superuser, listdir_re, which) from util_str import create_replace_function, safe_unicode, strtr import colormath import encodedstdio # Runtime configuration if ascii: enc = "ASCII" exe = unicode(sys.executable, fs_enc) exedir = os.path.dirname(exe) exename = os.path.basename(exe) isexe = sys.platform != "darwin" and getattr(sys, "frozen", False) if isexe and os.getenv("_MEIPASS2"): os.environ["_MEIPASS2"] = os.getenv("_MEIPASS2").replace("/", os.path.sep) pyfile = (exe if isexe else (os.path.isfile(sys.argv[0]) and sys.argv[0]) or os.path.join(os.path.dirname(__file__), "main.py")) pypath = exe if isexe else os.path.abspath(unicode(pyfile, fs_enc)) # Mac OS X: isapp should only be true for standalone, not 0install isapp = sys.platform == "darwin" and \ exe.split(os.path.sep)[-3:-1] == ["Contents", "MacOS"] and \ os.path.exists(os.path.join(exedir, "..", "Resources", "xrc")) if isapp: pyname, pyext = os.path.splitext(exe.split(os.path.sep)[-4]) pydir = os.path.normpath(os.path.join(exedir, "..", "Resources")) else: pyname, pyext = os.path.splitext(os.path.basename(pypath)) pydir = os.path.dirname(exe if isexe else os.path.abspath(unicode(__file__, fs_enc))) data_dirs = [pydir] extra_data_dirs = [] # Search directories on PATH for data directories so Argyll reference files # can be found automatically if Argyll directory not explicitly configured for dir_ in getenvu("PATH", "").split(os.pathsep): dir_parent = os.path.dirname(dir_) if os.path.isdir(os.path.join(dir_parent, "ref")): extra_data_dirs.append(dir_parent) appbasename = appname # If old user data directory exists, use its basename if os.path.isdir(os.path.join(appdata, "dispcalGUI")): appbasename = "dispcalGUI" data_dirs.append(os.path.join(appdata, appname)) datahome = os.path.join(appdata, appbasename) if sys.platform == "win32": if pydir.lower().startswith(exedir.lower()) and pydir != exedir: # We are installed in a subfolder of the executable directory (e.g. # C:\Python26\Lib\site-packages\DisplayCAL) - we nee to add # the executable directory to the data directories so files in # subfolders of the executable directory which are not in # Lib\site-packages\DisplayCAL can be found # (e.g. Scripts\displaycal-apply-profiles) data_dirs.append(exedir) script_ext = ".cmd" scale_adjustment_factor = 1.0 config_sys = os.path.join(commonappdata[0], appbasename) confighome = os.path.join(appdata, appbasename) logdir = os.path.join(datahome, "logs") if appbasename != appname: data_dirs.extend(os.path.join(dir_, appname) for dir_ in commonappdata) data_dirs.append(os.path.join(commonprogramfiles, appname)) data_dirs.append(datahome) data_dirs.extend(os.path.join(dir_, appbasename) for dir_ in commonappdata) data_dirs.append(os.path.join(commonprogramfiles, appbasename)) exe_ext = ".exe" profile_ext = ".icm" else: if sys.platform == "darwin": script_ext = ".command" mac_create_app = True scale_adjustment_factor = 1.0 config_sys = os.path.join(prefs, appbasename) confighome = os.path.join(prefs_home, appbasename) logdir = os.path.join(expanduseru("~"), "Library", "Logs", appbasename) if appbasename != appname: data_dirs.append(os.path.join(commonappdata[0], appname)) data_dirs.append(datahome) data_dirs.append(os.path.join(commonappdata[0], appbasename)) else: script_ext = ".sh" scale_adjustment_factor = 1.0 config_sys = os.path.join(xdg_config_dir_default, appbasename) confighome = os.path.join(xdg_config_home, appbasename) logdir = os.path.join(datahome, "logs") if appbasename != appname: datahome_default = os.path.join(xdg_data_home_default, appname) if not datahome_default in data_dirs: data_dirs.append(datahome_default) data_dirs.extend(os.path.join(dir_, appname) for dir_ in xdg_data_dirs) data_dirs.append(datahome) datahome_default = os.path.join(xdg_data_home_default, appbasename) if not datahome_default in data_dirs: data_dirs.append(datahome_default) data_dirs.extend(os.path.join(dir_, appbasename) for dir_ in xdg_data_dirs) extra_data_dirs.extend(os.path.join(dir_, "argyllcms") for dir_ in xdg_data_dirs) extra_data_dirs.extend(os.path.join(dir_, "color", "argyll") for dir_ in xdg_data_dirs) exe_ext = "" profile_ext = ".icc" storage = os.path.join(datahome, "storage") resfiles = [ # Only essentials "argyll_instruments.json", "lang/en.json", "beep.wav", "camera_shutter.wav", "linear.cal", "test.cal", "ref/ClayRGB1998.gam", "ref/sRGB.gam", "ref/verify_extended.ti1", "ti1/d3-e4-s2-g28-m0-b0-f0.ti1", "ti1/d3-e4-s3-g52-m3-b0-f0.ti1", "ti1/d3-e4-s4-g52-m4-b0-f0.ti1", "ti1/d3-e4-s5-g52-m5-b0-f0.ti1", "xrc/extra.xrc", "xrc/gamap.xrc", "xrc/main.xrc", "xrc/mainmenu.xrc", "xrc/report.xrc", "xrc/synthicc.xrc" ] bitmaps = {} # Does the device not support iterative calibration? uncalibratable_displays = ("Untethered$", ) # Can the device generate patterns of its own? patterngenerators = ("madVR$", "Resolve$", "Chromecast ", "Prisma ", "Prisma$") non_argyll_displays = uncalibratable_displays + ("Resolve$", ) # Is the device directly connected or e.g. driven via network? # (note that madVR can technically be both, but the endpoint is always directly # connected to a display so we have videoLUT access via madVR's API. Only # devices which don't support that are considered 'untethered' in this context) untethered_displays = non_argyll_displays + ("Web$", "Chromecast ", "Prisma ", "Prisma$") # Is the device not an actual display device (i.e. is it not a TV or monitor)? virtual_displays = untethered_displays + ("madVR$", ) def is_special_display(display=None, tests=virtual_displays): if not isinstance(display, basestring): display = get_display_name(display) for test in tests: if re.match(test, display): return True return False def is_uncalibratable_display(display=None): return is_special_display(display, uncalibratable_displays) def is_patterngenerator(display=None): return is_special_display(display, patterngenerators) def is_non_argyll_display(display=None): return is_special_display(display, non_argyll_displays) def is_untethered_display(display=None): return is_special_display(display, untethered_displays) def is_virtual_display(display=None): return is_special_display(display, virtual_displays) def check_3dlut_format(devicename): if get_display_name(None, True) == devicename: if devicename == "Prisma": return (getcfg("3dlut.format") == "3dl" and getcfg("3dlut.size") == 17 and getcfg("3dlut.bitdepth.input") == 10 and getcfg("3dlut.bitdepth.output") == 12) def getbitmap(name, display_missing_icon=True, scale=True, use_mask=False): """ Create (if necessary) and return a named bitmap. name has to be a relative path to a png file, omitting the extension, e.g. 'theme/mybitmap' or 'theme/icons/16x16/myicon', which is searched for in the data directories. If a matching file is not found, a placeholder bitmap is returned. The special name 'empty' will always return a transparent bitmap of the given size, e.g. '16x16/empty' or just 'empty' (size defaults to 16x16 if not given). """ from wxaddons import wx if not name in bitmaps: parts = name.split("/") w = 16 h = 16 size = [] if len(parts) > 1: size = parts[-2].split("x") if len(size) == 2: try: w, h = map(int, size) except ValueError: size = [] ow, oh = w, h set_default_app_dpi() if scale: scale = getcfg("app.dpi") / get_default_dpi() else: scale = 1 if scale > 1: # HighDPI support w = int(round(w * scale)) h = int(round(h * scale)) if parts[-1] == "empty": if use_mask and sys.platform == "win32": bmp = wx.EmptyBitmap(w, h) bmp.SetMaskColour(wx.Colour(0, 0, 0)) else: bmp = wx.EmptyBitmapRGBA(w, h, 255, 0, 255, 0) else: if parts[-1].startswith(appname): parts[-1] = parts[-1].lower() oname = parts[-1] if "#" in oname: # Hex format, RRGGBB or RRGGBBAA oname, color = oname.split("#", 1) parts[-1] = oname else: color = None inverted = oname.endswith("-inverted") if inverted: oname = parts[-1] = oname.split("-inverted")[0] name2x = oname + "@2x" name4x = oname + "@4x" path = None for i in xrange(5): if scale > 1: if len(size) == 2: # Icon if i == 0: # HighDPI support. Try scaled size parts[-2] = "%ix%i" % (w, h) elif i == 1: if scale < 1.75 or scale == 2: continue # HighDPI support. Try @4x version parts[-2] = "%ix%i" % (ow, oh) parts[-1] = name4x elif i == 2: # HighDPI support. Try @2x version parts[-2] = "%ix%i" % (ow, oh) parts[-1] = name2x elif i == 3: # HighDPI support. Try original size times two parts[-2] = "%ix%i" % (ow * 2, oh * 2) parts[-1] = oname else: # Try original size parts[-2] = "%ix%i" % (ow, oh) else: # Theme graphic if i in (0, 3): continue elif i == 1: if scale < 1.75 or scale == 2: continue # HighDPI support. Try @4x version parts[-1] = name4x elif i == 2: # HighDPI support. Try @2x version parts[-1] = name2x else: # Try original size parts[-1] = oname if (sys.platform not in ("darwin", "win32") and parts[-1].startswith(appname)): # Search /usr/share/icons on Linux first path = get_data_path(os.path.join(parts[-2], "apps", parts[-1]) + ".png") if not path: path = get_data_path(os.path.sep.join(parts) + ".png") if path or scale == 1: break if path: bmp = wx.Bitmap(path) if not bmp.IsOk(): path = None if path: img = None if scale > 1 and i: rescale = False if i in (1, 2): # HighDPI support. 4x/2x version, determine scaled size w, h = [int(round(v / (2 * (3 - i)) * scale)) for v in bmp.Size] rescale = True elif len(size) == 2: # HighDPI support. Icon rescale = True if rescale and (bmp.Size[0] != w or bmp.Size[1] != h): # HighDPI support. Rescale img = bmp.ConvertToImage() if (not hasattr(wx, "IMAGE_QUALITY_BILINEAR") or oname == "list-add"): # In case bilinear is not supported, and to prevent # black borders after resizing for some images quality = wx.IMAGE_QUALITY_NORMAL elif oname in (): # Hmm. Everything else looks great with bicubic, # but this one gets jaggy unless we use bilinear quality = wx.IMAGE_QUALITY_BILINEAR elif scale < 1.5 or i == 1: quality = wx.IMAGE_QUALITY_BICUBIC else: quality = wx.IMAGE_QUALITY_BILINEAR img.Rescale(w, h, quality=quality) factors = None if (not inverted and len(parts) > 2 and parts[-3] == "icons" and max(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)[:3]) < 102): if not img: img = bmp.ConvertToImage() if img.IsBW(): inverted = True # Invert after resize (avoids jaggies) if inverted: if not img: img = bmp.ConvertToImage() img.Invert() alpha = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT).alpha if oname in ["applications-system", "color", "document-open", "document-save-as", "edit-delete", "image-x-generic", "info", "install", "list-add", "package-x-generic", "question", "rgbsquares", "stock_3d-color-picker", "stock_lock", "stock_lock-open", "stock_refresh", "web", "window-center", "zoom-best-fit", "zoom-in", "zoom-original", "zoom-out"]: # Scale 85 to 255 and adjust alpha factors = (3, 3, 3, alpha / 255.0) else: # Only adjust alpha factors = (1, 1, 1, alpha / 255.0) if color or factors: if not img: img = bmp.ConvertToImage() if color: # Hex format, RRGGBB or RRGGBBAA R = int(color[0:2], 16) / 255.0 G = int(color[2:4], 16) / 255.0 B = int(color[4:6], 16) / 255.0 if len(color) > 6: alpha = int(color[6:8], 16) / 255.0 else: alpha = 1.0 else: R, G, B = factors[:3] if len(factors) > 3: alpha = factors[3] else: alpha = 1.0 img = img.AdjustChannels(R, G, B, alpha) if img: bmp = img.ConvertToBitmap() if not bmp.IsOk(): path = None if not path: img = wx.EmptyImage(w, h) img.SetMaskColour(0, 0, 0) img.InitAlpha() bmp = img.ConvertToBitmap() dc = wx.MemoryDC() dc.SelectObject(bmp) if display_missing_icon: art = wx.ArtProvider.GetBitmap(wx.ART_MISSING_IMAGE, size=(w, h)) dc.DrawBitmap(art, 0, 0, True) dc.SelectObject(wx.NullBitmap) bitmaps[name] = bmp return bitmaps[name] def get_bitmap_as_icon(size, name, scale=True): """ Like geticon, but return a wx.Icon instance """ from wxaddons import wx icon = wx.EmptyIcon() if sys.platform == "darwin" and wx.VERSION >= (2, 9) and size > 128: # FIXME: wxMac 2.9 doesn't support icon sizes above 128 size = 128 bmp = geticon(size, name, scale) icon.CopyFromBitmap(bmp) return icon def get_argyll_data_dir(): if getcfg("argyll.version") < "1.5.0": argyll_data_dirname = "color" else: argyll_data_dirname = "ArgyllCMS" if sys.platform == "darwin" and getcfg("argyll.version") < "1.5.0": return os.path.join(library if is_superuser() else library_home, argyll_data_dirname) else: return os.path.join(commonappdata[0] if is_superuser() else appdata, argyll_data_dirname) def get_display_name(n=None, include_geometry=False): """ Return name of currently configured display """ if n is None: n = getcfg("display.number") - 1 displays = getcfg("displays") if n >= 0 and n < len(displays): if include_geometry: return displays[n] else: return split_display_name(displays[n]) return "" def split_display_name(display): """ Split and return name part of display E.g. 'LCD2690WUXi @ 0, 0, 1920x1200' -> 'LCD2690WUXi' 'madVR' -> 'madVR' """ if "@" in display and not display.startswith("Chromecast "): display = "@".join(display.split("@")[:-1]) return display.strip() def get_argyll_display_number(geometry): """ Translate from wx display geometry to Argyll display index """ geometry = "%i, %i, %ix%i" % tuple(geometry) for i, display in enumerate(getcfg("displays")): if display.find("@ " + geometry) > -1: if debug: from log import safe_print safe_print("[D] Found display %s at index %i" % (geometry, i)) return i def get_display_number(display_no): """ Translate from Argyll display index to wx display index """ if is_virtual_display(display_no): return 0 from wxaddons import wx try: display = getcfg("displays")[display_no] except IndexError: return 0 else: if display.endswith(" [PRIMARY]"): display = " ".join(display.split(" ")[:-1]) for i in xrange(wx.Display.GetCount()): geometry = "%i, %i, %ix%i" % tuple(wx.Display(i).Geometry) if display.endswith("@ " + geometry): if debug: from log import safe_print safe_print("[D] Found display %s at index %i" % (geometry, i)) return i return 0 def get_display_rects(): """ Return the Argyll enumerated display coordinates and sizes """ from wxaddons import wx display_rects = [] for i, display in enumerate(getcfg("displays")): match = re.search("@ (-?\d+), (-?\d+), (\d+)x(\d+)", display) if match: display_rects.append(wx.Rect(*[int(item) for item in match.groups()])) return display_rects def get_icon_bundle(sizes, name): """ Return a wx.IconBundle with given icon sizes """ from wxaddons import wx iconbundle = wx.IconBundle() if not sizes: # Assume ICO format pth = get_data_path("theme/icons/%s.ico" % name) if pth: ico = wx.Icon(pth) if ico.IsOk(): iconbundle.AddIcon(ico) return iconbundle sizes = [16] for size in sizes: iconbundle.AddIcon(get_bitmap_as_icon(size, name, False)) return iconbundle def get_instrument_name(): """ Return name of currently configured instrument """ n = getcfg("comport.number") - 1 instrument_names = getcfg("instruments") if n >= 0 and n < len(instrument_names): return instrument_names[n] return "" def get_measureframe_dimensions(dimensions_measureframe=None, percent=10): """ return measurement area size adjusted for percentage of screen area """ if not dimensions_measureframe: dimensions_measureframe = getcfg("dimensions.measureframe") dimensions_measureframe = [float(n) for n in dimensions_measureframe.split(",")] dimensions_measureframe[2] *= defaults["size.measureframe"] dimensions_measureframe[2] /= get_display_rects()[0][2] dimensions_measureframe[2] *= percent return ",".join([str(min(n, 50)) for n in dimensions_measureframe]) def geticon(size, name, scale=True, use_mask=False): """ Convenience function for getbitmap('theme/icons//'). """ return getbitmap("theme/icons/%(size)sx%(size)s/%(name)s" % {"size": size, "name": name}, scale=scale, use_mask=use_mask) def get_data_path(relpath, rex=None): """ Search data_dirs for relpath and return the path or a file list. If relpath is a file, return the full path, if relpath is a directory, return a list of files in the intersection of searched directories. """ if (not relpath or relpath.endswith(os.path.sep) or (isinstance(os.path.altsep, basestring) and relpath.endswith(os.path.altsep))): return None dirs = list(data_dirs) argyll_dir = (getcfg("argyll.dir") or os.path.dirname(os.path.realpath(which("dispcal" + exe_ext) or ""))) if argyll_dir and os.path.isdir(os.path.join(argyll_dir, "..", "ref")): dirs.append(os.path.dirname(argyll_dir)) dirs.extend(extra_data_dirs) intersection = [] paths = [] for dir_ in dirs: curpath = os.path.join(dir_, relpath) if (dir_.endswith("/argyll") and (relpath + "/").startswith("ref/") and not os.path.exists(curpath)): # Work-around distribution-specific differences for location # of Argyll reference files # Fedora and Ubuntu: /usr/share/color/argyll/ref # openSUSE: /usr/share/color/argyll pth = relpath.split("/", 1)[-1] if pth != "ref": curpath = os.path.join(dir_, pth) else: curpath = dir_ if os.path.exists(curpath): curpath = os.path.normpath(curpath) if os.path.isdir(curpath): try: filelist = listdir_re(curpath, rex) except Exception, exception: from log import safe_print safe_print(u"Error - directory '%s' listing failed: %s" % tuple(safe_unicode(s) for s in (curpath, exception))) else: for filename in filelist: if not filename in intersection: intersection.append(filename) paths.append(os.path.join(curpath, filename)) else: return curpath if paths: paths.sort(key=lambda path: os.path.basename(path).lower()) return None if len(paths) == 0 else paths def get_default_dpi(): if sys.platform == "darwin": return 72.0 else: return 96.0 def runtimeconfig(pyfile): """ Configure remaining runtime options and return runtype. You need to pass in a path to the calling script (e.g. use the __file__ attribute). """ from log import setup_logging setup_logging(logdir, pyname, pyext, confighome=confighome) if debug or verbose >= 1: from log import safe_print if debug: safe_print("[D] pydir:", pydir) if isapp: runtype = ".app" elif isexe: if debug: safe_print("[D] _MEIPASS2 or pydir:", getenvu("_MEIPASS2", exedir)) if getenvu("_MEIPASS2", exedir) not in data_dirs: data_dirs.insert(1, getenvu("_MEIPASS2", exedir)) runtype = exe_ext else: pydir_parent = os.path.dirname(pydir) if debug: safe_print("[D] dirname(os.path.abspath(sys.argv[0])):", os.path.dirname(os.path.abspath(sys.argv[0]))) safe_print("[D] pydir parent:", pydir_parent) if (os.path.dirname(os.path.abspath(sys.argv[0])).decode(fs_enc) == pydir_parent and pydir_parent not in data_dirs): # Add the parent directory of the package directory to our list # of data directories if it is the directory containing the # currently run script (e.g. when running from source) data_dirs.insert(1, pydir_parent) runtype = pyext for dir_ in sys.path: if not isinstance(dir_, unicode): dir_ = unicode(dir_, fs_enc) dir_ = os.path.abspath(os.path.join(dir_, appname)) if dir_ not in data_dirs and os.path.isdir(dir_): data_dirs.append(dir_) if debug: safe_print("[D] from sys.path:", dir_) if sys.platform not in ("darwin", "win32"): data_dirs.extend([os.path.join(dir_, "doc", appname + "-" + version) for dir_ in xdg_data_dirs + [xdg_data_home]]) data_dirs.extend([os.path.join(dir_, "doc", "packages", appname) for dir_ in xdg_data_dirs + [xdg_data_home]]) data_dirs.extend([os.path.join(dir_, "doc", appname) for dir_ in xdg_data_dirs + [xdg_data_home]]) data_dirs.extend([os.path.join(dir_, "doc", appname.lower()) # Debian for dir_ in xdg_data_dirs + [xdg_data_home]]) data_dirs.extend([os.path.join(dir_, "icons", "hicolor") for dir_ in xdg_data_dirs + [xdg_data_home]]) if debug: safe_print("[D] Data files search paths:\n[D]", "\n[D] ".join(data_dirs)) defaults["calibration.file"] = get_data_path("presets/default.icc") or "" defaults["measurement_report.chart"] = get_data_path(os.path.join("ref", "verify_extended.ti1")) or "" return runtype # User settings cfg = ConfigParser.RawConfigParser() cfg.optionxform = str valid_ranges = { "3dlut.hdr_peak_luminance": [120.0, 10000.0], "3dlut.hdr_minmll": [0.0, 0.1], "3dlut.hdr_maxmll": [120.0, 10000.0], "3dlut.trc_gamma": [0.000001, 10], "3dlut.trc_output_offset": [0.0, 1.0], "app.port": [1, 65535], "gamma": [0.000001, 10], "trc": [0.000001, 10], "calibration.ambient_viewcond_adjust.lux": [0, sys.maxint], "calibration.black_luminance": [0.000001, 100000], "calibration.black_output_offset": [0, 1], "calibration.black_point_correction": [0, 1], "calibration.black_point_rate": [0.05, 20], "calibration.luminance": [0.000001, 100000], "iccgamut.surface_detail": [1.0, 50.0], "measurement_report.trc_gamma": [0.01, 10], "measurement_report.trc_output_offset": [0.0, 1.0], "measure.display_settle_time_mult": [0.000001, 10000.0], "measure.min_display_update_delay_ms": [20, 60000], "multiprocessing.max_cpus": [0, 65], "patterngenerator.apl": [0.0, 1.0], "patterngenerator.resolve.port": [1, 65535], "profile_loader.quantize_bits": [8, 16], "synthprofile.trc_gamma": [0.01, 10], "synthprofile.trc_output_offset": [0.0, 1.0], "tc_export_repeat_patch_max": [1, 1000], "tc_export_repeat_patch_min": [1, 1000], "tc_vrml_black_offset": [0, 40], "webserver.portnumber": [1, 65535], "whitepoint.colortemp": [1000, 15000], "whitepoint.visual_editor.bg_v": [0, 255], "whitepoint.visual_editor.b": [0, 255], "whitepoint.visual_editor.g": [0, 255], "whitepoint.visual_editor.r": [0, 255], } valid_values = { "3d.format": ["HTML", "VRML", "X3D"], "3dlut.bitdepth.input": [8, 10, 12, 14, 16], "3dlut.bitdepth.output": [8, 10, 12, 14, 16], "3dlut.encoding.input": list(video_encodings), # collink: xvYCC output encoding is not supported "3dlut.encoding.output": filter(lambda v: v not in ("T", "x", "X"), video_encodings), "3dlut.format": ["3dl", "cube", "eeColor", "icc", "madVR", "mga", "png", "ReShade", "spi3d"], "3dlut.hdr_display": [0, 1], "3dlut.image.layout": ["h", "v"], "3dlut.image.order": ["rgb", "bgr"], "3dlut.rendering_intent": intents, "3dlut.size": [5, 9, 16, 17, 24, 32, 33, 64, 65], "3dlut.trc": ["bt1886", "customgamma", "gamma2.2", "smpte2084.hardclip", "smpte2084.rolloffclip", "hlg"], "3dlut.trc_gamma_type": ["b", "B"], "calibration.quality": ["v", "l", "m", "h", "u"], "colorimeter_correction.observer": observers, "colorimeter_correction.observer.reference": observers, "colorimeter_correction.type": ["matrix", "spectral"], # Measurement modes as supported by Argyll -y parameter # 'l' = 'n' (non-refresh-type display, e.g. LCD) # 'c' = 'r' (refresh-type display, e.g. CRT) # We map 'l' and 'c' to "n" and "r" in # worker.Worker.add_measurement_features if using Argyll >= 1.5 # See http://www.argyllcms.com/doc/instruments.html # for description of per-instrument supported modes "measurement_mode": [None, "auto"] + list(string.digits[1:] + string.ascii_letters), "gamap_default_intent": ["a", "r", "p", "s"], "gamap_perceptual_intent": intents, "gamap_saturation_intent": intents, "gamap_src_viewcond": viewconds, "gamap_out_viewcond": ["mt", "mb", "md", "jm", "jd"], "measurement_report.trc_gamma_type": ["b", "B"], "observer": observers, "patterngenerator.detect_video_levels": [0, 1], "patterngenerator.prisma.preset": ["Movie", "Sports", "Game", "Animation", "PC/Mac", "Black+White", "Custom-1", "Custom-2"], "patterngenerator.use_video_levels": [0, 1], "profile.black_point_compensation": [0, 1], "profile.install_scope": ["l", "u"], "profile.quality": ["l", "m", "h", "u"], "profile.quality.b2a": ["l", "m", "h", "u", "n", None], "profile.b2a.hires.size": [-1, 9, 17, 33, 45, 65], "profile.type": ["g", "G", "l", "s", "S", "x", "X"], "profile_loader.tray_icon_animation_quality": [0, 1, 2], "synthprofile.black_point_compensation": [0, 1], "synthprofile.trc_gamma_type": ["g", "G"], "tc_algo": ["", "t", "r", "R", "q", "Q", "i", "I"], # Q = Argyll >= 1.1.0 "tc_vrml_use_D50": [0, 1], "tc_vrml_cie_colorspace": ["DIN99", "DIN99b", "DIN99c", "DIN99d", "ICtCp", "IPT", "LCH(ab)", "LCH(uv)", "Lab", "Lpt", "Luv", "Lu'v'", "xyY"], "tc_vrml_device_colorspace": ["HSI", "HSL", "HSV", "RGB"], "testchart.auto_optimize": range(19), "testchart.patch_sequence": ["optimize_display_response_delay", "maximize_lightness_difference", "maximize_rec709_luma_difference", "maximize_RGB_difference", "vary_RGB_difference"], "trc": ["240", "709", "l", "s", ""], "trc.type": ["g", "G"], "uniformity.cols": [3, 5, 7, 9], "uniformity.rows": [3, 5, 7, 9], "whitepoint.colortemp.locus": ["t", "T"] } content_rgb_space = colormath.get_rgb_space("DCI P3") crx, cry = content_rgb_space[2:][0][:2] cgx, cgy = content_rgb_space[2:][1][:2] cbx, cby = content_rgb_space[2:][2][:2] cwx, cwy = colormath.XYZ2xyY(*content_rgb_space[1])[:2] defaults = { "3d.format": "HTML", "3dlut.apply_black_offset": 0, "3dlut.apply_trc": 1, "3dlut.bitdepth.input": 10, "3dlut.bitdepth.output": 12, "3dlut.content.colorspace.blue.x": cbx, "3dlut.content.colorspace.blue.y": cby, "3dlut.content.colorspace.green.x": cgx, "3dlut.content.colorspace.green.y": cgy, "3dlut.content.colorspace.red.x": crx, "3dlut.content.colorspace.red.y": cry, "3dlut.content.colorspace.white.x": cwx, "3dlut.content.colorspace.white.y": cwy, "3dlut.create": 0, "3dlut.trc": "bt1886", "3dlut.trc_gamma": 2.4, "3dlut.trc_gamma.backup": 2.4, "3dlut.trc_gamma_type": "B", "3dlut.trc_output_offset": 0.0, "3dlut.encoding.input": "n", "3dlut.encoding.input.backup": "n", "3dlut.encoding.output": "n", "3dlut.encoding.output.backup": "n", "3dlut.format": "cube", "3dlut.gamap.use_b2a": 0, "3dlut.hdr_display": 0, "3dlut.hdr_minmll": 0.0, "3dlut.hdr_maxmll": 10000.0, "3dlut.hdr_peak_luminance": 400.0, "3dlut.hdr_ambient_luminance": 5.0, "3dlut.image.layout": "h", "3dlut.image.order": "rgb", "3dlut.input.profile": "", "3dlut.abstract.profile": "", "3dlut.enable": 1, "3dlut.output.profile": "", "3dlut.output.profile.apply_cal": 1, "3dlut.preserve_sync": 0, "3dlut.rendering_intent": "aw", "3dlut.use_abstract_profile": 0, "3dlut.size": 65, "3dlut.tab.enable": 0, "3dlut.tab.enable.backup": 0, "3dlut.whitepoint.x": 0.3127, "3dlut.whitepoint.y": 0.329, "allow_skip_sensor_cal": 0, "app.allow_network_clients": 0, "app.dpi": get_default_dpi(), "app.port": 15411, "argyll.debug": 0, "argyll.dir": None, "argyll.version": "0.0.0", "drift_compensation.blacklevel": 0, "drift_compensation.whitelevel": 0, "calibration.ambient_viewcond_adjust": 0, "calibration.ambient_viewcond_adjust.lux": 500.0, "calibration.autoload": 0, "calibration.black_luminance": 0.000001, "calibration.black_luminance.backup": 0.000001, "calibration.black_output_offset": 1.0, "calibration.black_output_offset.backup": 1.0, "calibration.black_point_correction": 0.0, "calibration.black_point_correction.auto": 0, "calibration.black_point_correction_choice.show": 1, "calibration.black_point_hack": 0, "calibration.black_point_rate": 4.0, "calibration.black_point_rate.enabled": 0, "calibration.continue_next": 0, "calibration.file": "", "calibration.file.previous": None, "calibration.interactive_display_adjustment": 1, "calibration.interactive_display_adjustment.backup": 1, "calibration.luminance": 120.0, "calibration.luminance.backup": 120.0, "calibration.quality": "l", "calibration.update": 0, "calibration.use_video_lut": 1, "calibration.use_video_lut.backup": 1, "ccmx.use_four_color_matrix_method": 0, "colorimeter_correction.instrument": None, "colorimeter_correction.instrument.reference": None, "colorimeter_correction.measurement_mode": "l", "colorimeter_correction.measurement_mode.reference.adaptive": 1, "colorimeter_correction.measurement_mode.reference.highres": 0, "colorimeter_correction.measurement_mode.reference.projector": 0, "colorimeter_correction.measurement_mode.reference": "l", "colorimeter_correction.observer": "1931_2", "colorimeter_correction.observer.reference": "1931_2", "colorimeter_correction.testchart": "ccxx.ti1", "colorimeter_correction_matrix_file": "AUTO:", "colorimeter_correction.type": "matrix", "comport.number": 1, "comport.number.backup": 1, # Note: worker.Worker.enumerate_displays_and_ports() overwrites copyright "copyright": "No copyright. Created with %s %s and ArgyllCMS" % (appname, version), "dimensions.measureframe": "0.5,0.5,1.5", "dimensions.measureframe.unzoomed": "0.5,0.5,1.5", "dimensions.measureframe.whitepoint.visual_editor": "0.5,0.5,1.5", "display.number": 1, "display_lut.link": 1, "display_lut.number": 1, "display.technology": "LCD", "displays": "", "dry_run": 0, "enumerate_ports.auto": 0, "extra_args.collink": "", "extra_args.colprof": "", "extra_args.dispcal": "", "extra_args.dispread": "", "extra_args.spotread": "", "extra_args.targen": "", "gamap_profile": "", "gamap_perceptual": 0, "gamap_perceptual_intent": "p", "gamap_saturation": 0, "gamap_saturation_intent": "s", "gamap_default_intent": "p", "gamma": 2.2, "iccgamut.surface_detail": 10.0, "instruments": "", "last_launch": "99", "log.autoshow": 0, "log.show": 0, "lang": "en", # The last_[...]_path defaults are set in localization.py "lut_viewer.show": 0, "lut_viewer.show_actual_lut": 0, "madtpg.host": "localhost", "madtpg.native": 1, "madtpg.port": 60562, "measurement_mode": "l", "measurement_mode.adaptive": 1, "measurement_mode.backup": "l", "measurement_mode.highres": 0, "measurement_mode.projector": 0, "measurement_report.apply_black_offset": 0, "measurement_report.apply_trc": 0, "measurement_report.trc_gamma": 2.4, "measurement_report.trc_gamma.backup": 2.4, "measurement_report.trc_gamma_type": "B", "measurement_report.trc_output_offset": 0.0, "measurement_report.chart": "", "measurement_report.chart.fields": "RGB", "measurement_report.devlink_profile": "", "measurement_report.output_profile": "", "measurement_report.whitepoint.simulate": 0, "measurement_report.whitepoint.simulate.relative": 0, "measurement_report.simulation_profile": "", "measurement_report.use_devlink_profile": 0, "measurement_report.use_simulation_profile": 0, "measurement_report.use_simulation_profile_as_output": 0, "measurement.name.expanded": u"", "measurement.play_sound": 1, "measurement.save_path": expanduseru("~"), "measure.darken_background": 0, "measure.darken_background.show_warning": 1, "measure.display_settle_time_mult": 1.0, "measure.display_settle_time_mult.backup": 1.0, "measure.min_display_update_delay_ms": 20, "measure.min_display_update_delay_ms.backup": 20, "measure.override_display_settle_time_mult": 0, "measure.override_display_settle_time_mult.backup": 0, "measure.override_min_display_update_delay_ms": 0, "measure.override_min_display_update_delay_ms.backup": 0, "multiprocessing.max_cpus": 0, "observer": "1931_2", "observer.backup": "1931_2", "patterngenerator.apl": .22, "patterngenerator.detect_video_levels": 1, "patterngenerator.prisma.argyll": 0, "patterngenerator.prisma.host": "", "patterngenerator.prisma.preset": "Custom-1", "patterngenerator.prisma.port": 80, "patterngenerator.resolve": "CM", "patterngenerator.resolve.port": 20002, "patterngenerator.use_video_levels": 0, "position.x": 50, "position.y": 50, "position.info.x": 50, "position.info.y": 50, "position.lut_viewer.x": 50, "position.lut_viewer.y": 50, "position.lut3dframe.x": 50, "position.lut3dframe.y": 50, "position.profile_info.x": 50, "position.profile_info.y": 50, "position.progress.x": 50, "position.progress.y": 50, "position.reportframe.x": 50, "position.reportframe.y": 50, "position.scripting.x": 50, "position.scripting.y": 50, "position.synthiccframe.x": 50, "position.synthiccframe.y": 50, "position.tcgen.x": 50, "position.tcgen.y": 50, # Force black point compensation due to OS X # bugs with non BPC profiles "profile.black_point_compensation": 0 if sys.platform != "darwin" else 1, "profile.black_point_correction": 0.0, "profile.create_gamut_views": 1, "profile.install_scope": "l" if (sys.platform != "win32" and os.geteuid() == 0) # or # (sys.platform == "win32" and # sys.getwindowsversion() >= (6, )) else "u", # Linux, OSX "profile.license": "Public Domain", "profile.load_on_login": 1, "profile.name": u" ".join([ u"%dns", u"%out", u"%Y-%m-%d %H-%M", u"%cb", u"%wp", u"%cB", u"%ck", u"%cg", u"%cq-%pq", u"%pt" ]), "profile.name.expanded": u"", "profile.quality": "h", "profile.quality.b2a": "h", "profile.b2a.hires": 1, "profile.b2a.hires.diagpng": 1, "profile.b2a.hires.size": -1, "profile.b2a.hires.smooth": 1, "profile.save_path": storage, # directory # Force profile type to single shaper + matrix # due to OS X bugs with cLUT profiles and # matrix profiles with individual shaper curves "profile.type": "X" if sys.platform != "darwin" else "S", "profile.update": 0, "profile_loader.buggy_video_drivers": ";".join(["*"]), "profile_loader.check_gamma_ramps": 1, "profile_loader.error.show_msg": 1, "profile_loader.exceptions": "", "profile_loader.fix_profile_associations": 1, "profile_loader.ignore_unchanged_gamma_ramps": 1, "profile_loader.known_apps": ";".join(["basiccolor display.exe", "calclient.exe", "coloreyes display pro.exe", "colorhcfr.exe", "colormunkidisplay.exe", "colornavigator.exe", "cpkeeper.exe", "dell ultrasharp calibration solution.exe", "hp_dreamcolor_calibration_solution.exe", "i1profiler.exe", "icolordisplay.exe", "spectraview.exe", "spectraview profiler.exe", "spyder3elite.exe", "spyder3express.exe", "spyder3pro.exe", "spyder4elite.exe", "spyder4express.exe", "spyder4pro.exe", "spyder5elite.exe", "spyder5express.exe", "spyder5pro.exe", "dispcal.exe", "dispread.exe", "dispwin.exe", "flux.exe", "dccw.exe"]), "profile_loader.known_window_classes": ";".join(["CalClient.exe"]), "profile_loader.quantize_bits": 16, "profile_loader.reset_gamma_ramps": 0, "profile_loader.show_notifications": 0, "profile_loader.track_other_processes": 1, "profile_loader.tray_icon_animation_quality": 2, "profile_loader.use_madhcnet": 0, "profile_loader.verify_calibration": 0, "recent_cals": "", "report.pack_js": 1, "settings.changed": 0, "show_advanced_options": 0, "show_donation_message": 1, "size.info.w": 512, "size.info.h": 384, "size.lut3dframe.w": 512, "size.lut3dframe.h": 384, "size.measureframe": 300, "size.profile_info.w": 432, "size.profile_info.split.w": 960, "size.profile_info.h": 552, "size.lut_viewer.w": 432, "size.lut_viewer.h": 552, "size.reportframe.w": 512, "size.reportframe.h": 256, "size.scripting.w": 512, "size.scripting.h": 384, "size.synthiccframe.w": 512, "size.synthiccframe.h": 384, "skip_legacy_serial_ports": 1, "skip_scripts": 1, "splash.zoom": 0, "startup_sound.enable": 1, "sudo.preserve_environment": 1, "synthprofile.black_luminance": 0.0, "synthprofile.luminance": 120.0, "synthprofile.trc_gamma": 2.4, "synthprofile.trc_gamma_type": "G", "synthprofile.trc_output_offset": 0.0, "tc_adaption": 0.1, "tc_add_ti3_relative": 1, "tc_algo": "", "tc_angle": 0.3333, "tc_black_patches": 4, "tc_export_repeat_patch_max": 1, "tc_export_repeat_patch_min": 1, "tc_filter": 0, "tc_filter_L": 50, "tc_filter_a": 0, "tc_filter_b": 0, "tc_filter_rad": 255, "tc_fullspread_patches": 0, "tc_gamma": 1.0, "tc_gray_patches": 9, "tc_multi_bcc": 0, "tc_multi_bcc_steps": 0, "tc_multi_steps": 3, "tc_neutral_axis_emphasis": 0.5, "tc_dark_emphasis": 0.0, "tc_precond": 0, "tc_precond_profile": "", "tc.saturation_sweeps": 5, "tc.saturation_sweeps.custom.R": 0.0, "tc.saturation_sweeps.custom.G": 0.0, "tc.saturation_sweeps.custom.B": 0.0, "tc_single_channel_patches": 0, "tc_vrml_black_offset": 40, "tc_vrml_cie": 0, "tc_vrml_cie_colorspace": "Lab", "tc_vrml_device_colorspace": "RGB", "tc_vrml_device": 1, "tc_vrml_use_D50": 0, "tc_white_patches": 4, "tc.show": 0, # Profile type forced to matrix due to # OS X bugs with cLUT profiles. Set # smallest testchart. "testchart.auto_optimize": 4 if sys.platform != "darwin" else 1, "testchart.file": "auto", "testchart.file.backup": "auto", "testchart.patch_sequence": "optimize_display_response_delay", "testchart.reference": "", "ti3.check_sanity.auto": 0, "trc": 2.2, "trc.backup": 2.2, "trc.should_use_viewcond_adjust.show_msg": 1, "trc.type": "g", "trc.type.backup": "g", "uniformity.cols": 5, "uniformity.measure.continuous": 0, "uniformity.rows": 5, "untethered.measure.auto": 1, "untethered.measure.manual.delay": 0.75, "untethered.max_delta.chroma": 0.5, "untethered.min_delta": 1.5, "untethered.min_delta.lightness": 1.0, "update_check": 1, "use_fancy_progress": 1, "use_separate_lut_access": 0, "vrml.compress": 1, "webserver.portnumber": 8080, "whitepoint.colortemp": 6500, "whitepoint.colortemp.backup": 6500, "whitepoint.colortemp.locus": "t", "whitepoint.visual_editor.bg_v": 255, "whitepoint.visual_editor.b": 255, "whitepoint.visual_editor.g": 255, "whitepoint.visual_editor.r": 255, "whitepoint.x": 0.3127, "whitepoint.x.backup": 0.3127, "whitepoint.y": 0.3290, "whitepoint.y.backup": 0.3290, "x3dom.cache": 1, "x3dom.embed": 0 } lcode, lenc = locale.getdefaultlocale() if lcode: defaults["lang"] = lcode.split("_")[0].lower() testchart_defaults = { "s": {None: "auto"}, # shaper + matrix "l": {None: "auto"}, # lut "g": {None: "auto"} # gamma + matrix } def _init_testcharts(): for testcharts in testchart_defaults.values(): for chart in filter(lambda value: value != "auto", testcharts.values()): resfiles.append(os.path.join("ti1", chart)) testchart_defaults["G"] = testchart_defaults["g"] testchart_defaults["S"] = testchart_defaults["s"] for key in ("X", "x"): testchart_defaults[key] = testchart_defaults["l"] def getcfg(name, fallback=True, raw=False): """ Get and return an option value from the configuration. If fallback evaluates to True and the option is not set, return its default value. """ if name == "profile.name.expanded" and is_ccxx_testchart(): name = "measurement.name.expanded" value = None hasdef = name in defaults if hasdef: defval = defaults[name] deftype = type(defval) if cfg.has_option(ConfigParser.DEFAULTSECT, name): try: value = unicode(cfg.get(ConfigParser.DEFAULTSECT, name), "UTF-8") except UnicodeDecodeError: pass else: # Check for invalid types and return default if wrong type if raw: pass elif (name != "trc" or value not in valid_values["trc"]) and \ hasdef and deftype in (Decimal, int, float): try: value = deftype(value) except ValueError: value = defval else: valid_range = valid_ranges.get(name) if valid_range: value = min(max(valid_range[0], value), valid_range[1]) elif name in valid_values and value not in valid_values[name]: value = defval elif name.startswith("dimensions.measureframe"): try: value = [max(0, float(n)) for n in value.split(",")] if len(value) != 3: raise ValueError() except ValueError: value = defaults[name] else: value[0] = min(value[0], 1) value[1] = min(value[1], 1) value[2] = min(value[2], 50) value = ",".join([str(n) for n in value]) elif name == "profile.quality" and getcfg("profile.type") in ("g", "G"): # default to high quality for gamma + matrix value = "h" elif name == "trc.type" and getcfg("trc") in valid_values["trc"]: value = "g" elif name in valid_values and value not in valid_values[name]: if debug: print "Invalid config value for %s: %s" % (name, value), value = None elif name == "copyright": # Make sure DisplayCAL and Argyll version are up-to-date pattern = re.compile("(%s(?:\s*v(?:ersion|\.)?)?\s*)\d+(?:\.\d+)*" % appname, re.I) repl = create_replace_function("\\1%s", version) value = re.sub(pattern, repl, value) if appbasename != appname: pattern = re.compile("(%s(?:\s*v(?:ersion|\.)?)?\s*)\d+(?:\.\d+)*" % appbasename, re.I) repl = create_replace_function("\\1%s", version) value = re.sub(pattern, repl, value) pattern = re.compile("(Argyll(?:\s*CMS)?)((?:\s*v(?:ersion|\.)?)?\s*)\d+(?:\.\d+)*", re.I) if defval.split()[-1] != "CMS": repl = create_replace_function("\\1\\2%s", defval.split()[-1]) else: repl = "\\1" value = re.sub(pattern, repl, value) elif name == "measurement_mode": # Map n and r measurement modes to canonical l and c # - the inverse mapping happens per-instrument in # Worker.add_measurement_features(). That way we can have # compatibility with old and current Argyll CMS value = {"n": "l", "r": "c"}.get(value, value) if value is None: if hasdef and fallback: value = defval if debug > 1: print name, "- falling back to", value else: if debug and not hasdef: print "Warning - unknown option:", name if raw: return value if (value and isinstance(value, basestring) and name.endswith("file") and name != "colorimeter_correction_matrix_file" and (name != "testchart.file" or value != "auto") and (not os.path.isabs(value) or not os.path.exists(value))): # colorimeter_correction_matrix_file is special because it's # not (only) a path if debug: print "%s does not exist: %s" % (name, value), # Normalize path (important, this turns altsep into sep under # Windows) value = os.path.normpath(value) # Check if this is a relative path covered by data_dirs if (value.split(os.path.sep)[-3:-2] == [appname] or not os.path.isabs(value)) and ( value.split(os.path.sep)[-2:-1] == ["presets"] or value.split(os.path.sep)[-2:-1] == ["ref"] or value.split(os.path.sep)[-2:-1] == ["ti1"]): value = os.path.join(*value.split(os.path.sep)[-2:]) value = get_data_path(value) elif hasdef: value = None if not value and hasdef: value = defval if debug > 1: print name, "- falling back to", value elif name in ("displays", "instruments"): if not value: return [] value = [strtr(v, [("%" + hex(ord(os.pathsep))[2:].upper(), os.pathsep), ("%25", "%")]) for v in value.split(os.pathsep)] return value def hascfg(name, fallback=True): """ Check if an option name exists in the configuration. Returns a boolean. If fallback evaluates to True and the name does not exist, check defaults also. """ if cfg.has_option(ConfigParser.DEFAULTSECT, name): return True elif fallback: return name in defaults return False def get_ccxx_testchart(): """ Get the path to the default chart for CCMX/CCSS creation """ return get_data_path(os.path.join("ti1", defaults["colorimeter_correction.testchart"])) def get_current_profile(include_display_profile=False): """ Get the currently selected profile (if any) """ path = getcfg("calibration.file", False) if path: import ICCProfile as ICCP try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: return return profile elif include_display_profile: return get_display_profile() def get_display_profile(display_no=None): if display_no is None: display_no = max(getcfg("display.number") - 1, 0) if is_virtual_display(display_no): return None import ICCProfile as ICCP try: return ICCP.get_display_profile(display_no) except Exception, exception: from log import _safe_print, log _safe_print("ICCP.get_display_profile(%s):" % display_no, safe_unicode(exception), fn=log) standard_profiles = [] def get_standard_profiles(paths_only=False): if not standard_profiles: import ICCProfile as ICCP from log import safe_print # Reference profiles (Argyll + DisplayCAL) ref_icc = get_data_path("ref", "\.ic[cm]$") or [] # Other profiles installed on the system other_icc = [] rex = re.compile("\.ic[cm]$", re.IGNORECASE) for icc_dir in set(iccprofiles + iccprofiles_home): for dirpath, dirnames, basenames in os.walk(icc_dir): for basename in filter(rex.search, basenames): filename, ext = os.path.splitext(basename.lower()) if (filename.endswith("_bas") or filename.endswith("_eci") or filename.endswith("adobergb1998") or filename.startswith("eci-rgb") or filename.startswith("ecirgb") or filename.startswith("ekta space") or filename.startswith("ektaspace") or filename.startswith("fogra") or filename.startswith("gracol") or filename.startswith("iso") or filename.startswith("lstar-") or filename.startswith("pso") or filename.startswith("prophoto") or filename.startswith("psr_") or filename.startswith("psrgravure") or filename.startswith("snap") or filename.startswith("srgb") or filename.startswith("swop") or filename in ("applergb", "bestrgb", "betargb", "brucergb", "ciergb", "cie-rgb", "colormatchrgb", "donrgb", "widegamutrgb")): other_icc.append(os.path.join(dirpath, basename)) for path in ref_icc + other_icc: try: profile = ICCP.ICCProfile(path, load=False) except EnvironmentError: pass except Exception, exception: safe_print(exception) else: if (profile.version < 4 and profile.profileClass != "nmcl" and profile.colorSpace != "GRAY" and profile.connectionColorSpace in ("Lab", "XYZ")): standard_profiles.append(profile) if paths_only: return [profile.fileName for profile in standard_profiles] return standard_profiles def get_total_patches(white_patches=None, black_patches=None, single_channel_patches=None, gray_patches=None, multi_steps=None, multi_bcc_steps=None, fullspread_patches=None): if white_patches is None: white_patches = getcfg("tc_white_patches") if black_patches is None and getcfg("argyll.version") >= "1.6": black_patches = getcfg("tc_black_patches") if single_channel_patches is None: single_channel_patches = getcfg("tc_single_channel_patches") single_channel_patches_total = single_channel_patches * 3 if gray_patches is None: gray_patches = getcfg("tc_gray_patches") if gray_patches == 0 and single_channel_patches > 0 and white_patches > 0: gray_patches = 2 if multi_steps is None: multi_steps = getcfg("tc_multi_steps") if multi_bcc_steps is None and getcfg("argyll.version") >= "1.6": multi_bcc_steps = getcfg("tc_multi_bcc_steps") if fullspread_patches is None: fullspread_patches = getcfg("tc_fullspread_patches") total_patches = 0 if multi_steps > 1: multi_patches = int(math.pow(multi_steps, 3)) if multi_bcc_steps > 1: multi_patches += int(math.pow(multi_bcc_steps - 1, 3)) total_patches += multi_patches white_patches -= 1 # white always in multi channel patches multi_step = 255.0 / (multi_steps - 1) multi_values = [] multi_bcc_values = [] if multi_bcc_steps > 1: multi_bcc_step = multi_step for i in range(multi_bcc_steps): multi_values.append(str(multi_bcc_step * i)) for i in range(multi_bcc_steps * 2 - 1): multi_bcc_values.append(str(multi_bcc_step / 2.0 * i)) else: for i in range(multi_steps): multi_values.append(str(multi_step * i)) if single_channel_patches > 1: single_channel_step = 255.0 / (single_channel_patches - 1) for i in range(single_channel_patches): if str(single_channel_step * i) in multi_values: single_channel_patches_total -= 3 if gray_patches > 1: gray_step = 255.0 / (gray_patches - 1) for i in range(gray_patches): if (str(gray_step * i) in multi_values or str(gray_step * i) in multi_bcc_values): gray_patches -= 1 elif gray_patches > 1: white_patches -= 1 # white always in gray patches single_channel_patches_total -= 3 # black always in gray patches elif single_channel_patches_total: # black always only once in single channel patches single_channel_patches_total -= 2 total_patches += max(0, white_patches) + \ max(0, single_channel_patches_total) + \ max(0, gray_patches) + fullspread_patches if black_patches: if gray_patches > 1 or single_channel_patches_total or multi_steps: black_patches -= 1 # black always in other patches total_patches += black_patches return total_patches def get_verified_path(cfg_item_name, path=None): """ Verify and return dir and filename for a path from the user cfg, or a given path """ defaultPath = path or getcfg(cfg_item_name) defaultDir = expanduseru("~") defaultFile = "" if defaultPath: if os.path.exists(defaultPath): defaultDir, defaultFile = (os.path.dirname(defaultPath), os.path.basename(defaultPath)) elif (defaults.get(cfg_item_name) and os.path.exists(defaults[cfg_item_name])): defaultDir, defaultFile = (os.path.dirname(defaults[cfg_item_name]), os.path.basename(defaults[cfg_item_name])) elif os.path.exists(os.path.dirname(defaultPath)): defaultDir = os.path.dirname(defaultPath) return defaultDir, defaultFile def is_ccxx_testchart(testchart=None): """ Check wether the testchart is the default chart for CCMX/CCSS creation """ testchart = testchart or getcfg("testchart.file") return testchart == get_ccxx_testchart() def is_profile(filename=None, include_display_profile=False): filename = filename or getcfg("calibration.file", False) if filename: if os.path.exists(filename): import ICCProfile as ICCP try: profile = ICCP.ICCProfile(filename) except (IOError, ICCP.ICCProfileInvalidError): pass else: return True elif include_display_profile: return bool(get_display_profile()) return False def makecfgdir(which="user", worker=None): if which == "user": if not os.path.exists(confighome): try: os.makedirs(confighome) except Exception, exception: from log import safe_print safe_print(u"Warning - could not create configuration directory " "'%s': %s" % (confighome, safe_unicode(exception))) return False elif not os.path.exists(config_sys): try: if sys.platform == "win32": os.makedirs(config_sys) else: result = worker.exec_cmd("mkdir", ["-p", config_sys], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) if isinstance(result, Exception): raise result except Exception, exception: from log import safe_print safe_print(u"Warning - could not create configuration directory " "'%s': %s" % (config_sys, safe_unicode(exception))) return False return True def initcfg(module=None): """ Initialize the configuration. Read in settings if the configuration file exists, else create the settings directory if nonexistent. """ if module: cfgbasename = "%s-%s" % (appbasename, module) else: cfgbasename = appbasename makecfgdir() if os.path.exists(confighome) and \ not os.path.exists(os.path.join(confighome, cfgbasename + ".ini")): # Set a few defaults which have None as possible value and thus cannot # be set in the 'defaults' collection setcfg("gamap_src_viewcond", "mt") setcfg("gamap_out_viewcond", "mt") # Set default preset setcfg("calibration.file", defaults["calibration.file"]) # Read cfg cfgnames = [] if module not in ("3DLUT-maker", "VRML-to-X3D-converter", "scripting-client"): # Never read base app cfg for 3D LUT maker, VRML converter and # scripting client cfgnames.append(appbasename) if module: cfgnames.append(cfgbasename) else: cfgnames.extend("%s-%s" % (appbasename, othermod) for othermod in ("synthprofile", "testchart-editor")) cfgroots = [confighome] if module == "apply-profiles": cfgroots.append(config_sys) cfgfiles = [] for cfgname in cfgnames: for cfgroot in cfgroots: cfgfile = os.path.join(cfgroot, cfgname + ".ini") if os.path.isfile(cfgfile): cfgfiles.append(cfgfile) # Make user config take precedence break if len(cfgfiles) > 1 and (module != "apply-profiles" or sys.platform != "win32"): # Make most recent file take precedence cfgfiles.sort(key=lambda cfgfile: os.stat(cfgfile).st_mtime) try: cfg.read(cfgfiles) # This won't raise an exception if the file does not exist, only # if it can't be parsed except Exception, exception: from log import safe_print safe_print("Warning - could not parse configuration files:\n%s" % "\n".join(cfgfiles)) # Fix Python 2.7 ConfigParser option values being lists instead of # strings in case of a ParsingError. http://bugs.python.org/issue2414 all_sections = [ConfigParser.DEFAULTSECT] all_sections.extend(cfg.sections()) for section in all_sections: for name, val in cfg.items(section): if isinstance(val, list): cfg.set(section, name, "\n".join(val)) dpiset = False def set_default_app_dpi(): """ Set application DPI """ # Only call this after creating the wx.App object! global dpiset if not dpiset and not getcfg("app.dpi", False): # HighDPI support dpiset = True from wxaddons import wx if sys.platform in ("darwin", "win32"): # Determine screen DPI dpi = wx.ScreenDC().GetPPI()[0] else: if "gtk3" in wx.PlatformInfo: from util_os import which txt_scale = 1 if which("gsettings"): import subprocess as sp p = sp.Popen(["gsettings", "get", "org.gnome.desktop.interface", "text-scaling-factor"], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) stdout, stderr = p.communicate() if stdout: try: txt_scale = float(stdout) except ValueError: pass else: # Linux. Determine font scaling factor font = wx.Font(256, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) txt_scale = font.GetPixelSize()[0] / 256.0 or 1 dpi = int(round(get_default_dpi() * txt_scale)) defaults["app.dpi"] = dpi dpiset = True def setcfg(name, value): """ Set an option value in the configuration. """ if value is None: cfg.remove_option(ConfigParser.DEFAULTSECT, name) else: if name in ("displays", "instruments") and isinstance(value, (list, tuple)): value = os.pathsep.join(strtr(v, [("%", "%25"), (os.pathsep, "%" + hex(ord(os.pathsep))[2:].upper())]) for v in value) cfg.set(ConfigParser.DEFAULTSECT, name, unicode(value).encode("UTF-8")) def writecfg(which="user", worker=None, module=None, options=()): """ Write configuration file. which: 'user' or 'system' worker: worker instance if which == 'system' """ if module: cfgbasename = "%s-%s" % (appbasename, module) else: cfgbasename = appbasename if which == "user": # user config - stores everything and overrides system-wide config cfgfilename = os.path.join(confighome, cfgbasename + ".ini") try: io = StringIO() cfg.write(io) io.seek(0) lines = io.read().strip("\n").split("\n") if options: optionlines = [] for optionline in lines[1:]: for option in options: if optionline.startswith(option): optionlines.append(optionline) else: optionlines = lines[1:] # Sorting works as long as config has only one section lines = lines[:1] + sorted(optionlines) cfgfile = open(cfgfilename, "wb") cfgfile.write(os.linesep.join(lines) + os.linesep) cfgfile.close() except Exception, exception: from log import safe_print safe_print(u"Warning - could not write user configuration file " "'%s': %s" % (cfgfilename, safe_unicode(exception))) return False else: # system-wide config - only stores essentials ie. Argyll directory cfgfilename1 = os.path.join(confighome, cfgbasename + ".local.ini") cfgfilename2 = os.path.join(config_sys, cfgbasename + ".ini") if sys.platform == "win32": cfgfilename = cfgfilename2 else: cfgfilename = cfgfilename1 try: cfgfile = open(cfgfilename, "wb") if getcfg("argyll.dir"): cfgfile.write(os.linesep.join(["[Default]", "%s = %s" % ("argyll.dir", getcfg("argyll.dir"))]) + os.linesep) cfgfile.close() if sys.platform != "win32": # on Linux and OS X, we write the file to the users's config dir # then 'su mv' it to the system-wide config dir result = worker.exec_cmd("mv", ["-f", cfgfilename1, cfgfilename2], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) if isinstance(result, Exception): raise result except Exception, exception: from log import safe_print safe_print(u"Warning - could not write system-wide configuration file " "'%s': %s" % (cfgfilename2, safe_unicode(exception))) return False return True _init_testcharts() runtype = runtimeconfig(pyfile) if isapp and not os.getenv("SSL_CERT_FILE"): # Use our bundled CA file # https://github.com/certifi/python-certifi/blob/master/certifi/cacert.pem cafile = get_data_path("cacert.pem") if cafile: os.environ["SSL_CERT_FILE"] = cafile.encode(fs_enc, "replace") DisplayCAL-3.5.0.0/DisplayCAL/debughelpers.py0000644000076500000000000000664713242301247020461 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import sys import traceback import config from config import fs_enc from log import logbuffer, safe_print from meta import name as appname from options import debug from util_str import safe_unicode wxEventTypes = {} def getevtobjname(event, window=None): """ Get and return the event object's name. """ try: event_object = event.GetEventObject() if not event_object and window: event_object = window.FindWindowById(event.GetId()) if event_object and hasattr(event_object, "GetName"): return event_object.GetName() except Exception, exception: pass def getevttype(event): """ Get and return the event object's type. """ if not wxEventTypes: from wxaddons import wx try: for name in dir(wx): if name.find("EVT_") == 0: attr = getattr(wx, name) if hasattr(attr, "evtType"): wxEventTypes[attr.evtType[0]] = name except Exception, exception: pass typeId = event.GetEventType() if typeId in wxEventTypes: return wxEventTypes[typeId] def handle_error(error, parent=None, silent=False): """ Log an error string and show an error dialog. """ if isinstance(error, tuple): # We got a tuple. Assume (etype, value, tb) tbstr = "".join(traceback.format_exception(*error)) error = error[1] else: tbstr = traceback.format_exc() if (tbstr.strip() != "None" and isinstance(error, Exception) and (debug or not isinstance(error, EnvironmentError) or not getattr(error, "filename", None))): # Print a traceback if in debug mode, for non environment errors, and # for environment errors not related to files msg = "\n\n".join([safe_unicode(v) for v in (error, tbstr)]) else: msg = safe_unicode(error) safe_print(msg) if not silent: try: from wxaddons import wx app = wx.GetApp() if app is None and parent is None: app = wx.App(redirect=False) # wxPython 3 bugfix: We also need a toplevel window frame = wx.Frame(None) parent = False else: frame = None if parent is None: parent = wx.GetActiveWindow() if parent: try: parent.IsShownOnScreen() except: # If the parent is still being constructed, we can't use it parent = None icon = wx.ICON_INFORMATION if not isinstance(error, Info): if isinstance(error, Warning): icon = wx.ICON_WARNING elif isinstance(error, Exception): icon = wx.ICON_ERROR dlg = wx.MessageDialog(parent if parent not in (False, None) and parent.IsShownOnScreen() else None, msg, app.AppName, wx.OK | icon) if frame: # wxPython 3 bugfix: We need to use CallLater and MainLoop wx.CallLater(1, dlg.ShowModal) wx.CallLater(1, frame.Close) app.MainLoop() else: dlg.ShowModal() dlg.Destroy() except Exception, exception: safe_print("Warning: handle_error():", safe_unicode(exception)) def print_callstack(): """ Print call stack """ import inspect stack = inspect.stack() indent = "" for frame, filename, linenum, funcname, line, exc in reversed(stack[1:]): safe_print(indent, funcname, filename, linenum, repr("".join(line).strip())) indent += " " class ResourceError(Exception): pass class Error(Exception): pass class Info(UserWarning): pass class UnloggedError(Error): pass class UnloggedInfo(Info): pass class UnloggedWarning(UserWarning): pass class DownloadError(Error): def __init__(self, *args): Error.__init__(self, *args[:-1]) self.url = args[1] class Warn(UserWarning): pass DisplayCAL-3.5.0.0/DisplayCAL/defaultpaths.py0000644000076500000000000001501213074665645020500 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import os import sys if sys.platform == "win32": try: from win32com.shell.shell import SHGetSpecialFolderPath from win32com.shell.shellcon import (CSIDL_APPDATA, CSIDL_COMMON_APPDATA, CSIDL_COMMON_STARTUP, CSIDL_LOCAL_APPDATA, CSIDL_PROFILE, CSIDL_PROGRAMS, CSIDL_COMMON_PROGRAMS, CSIDL_PROGRAM_FILES_COMMON, CSIDL_STARTUP, CSIDL_SYSTEM) except ImportError: import ctypes (CSIDL_APPDATA, CSIDL_COMMON_APPDATA, CSIDL_COMMON_STARTUP, CSIDL_LOCAL_APPDATA, CSIDL_PROFILE, CSIDL_PROGRAMS, CSIDL_COMMON_PROGRAMS, CSIDL_PROGRAM_FILES_COMMON, CSIDL_STARTUP, CSIDL_SYSTEM) = (26, 35, 24, 28, 40, 43, 2, 23, 7, 37) MAX_PATH = 260 def SHGetSpecialFolderPath(hwndOwner, nFolder, create=0): """ ctypes wrapper around shell32.SHGetSpecialFolderPathW """ buffer = ctypes.create_unicode_buffer(u'\0' * MAX_PATH) ctypes.windll.shell32.SHGetSpecialFolderPathW(0, buffer, nFolder, create) return buffer.value from util_os import expanduseru, expandvarsu, getenvu def get_known_folder_path(folderid, user=True): folder_path = os.path.join(expanduseru("~"), folderid) if sys.platform == "win32" and sys.getwindowsversion() >= (6, ): import win_knownpaths try: folder_path = win_knownpaths.get_path(getattr(win_knownpaths.FOLDERID, folderid), getattr(win_knownpaths.UserHandle, "current" if user else "common")) except Exception, exception: pass return folder_path home = expanduseru("~") if sys.platform == "win32": # Always specify create=1 for SHGetSpecialFolderPath so we don't get an # exception if the folder does not yet exist try: library_home = appdata = SHGetSpecialFolderPath(0, CSIDL_APPDATA, 1) except Exception, exception: raise Exception("FATAL - Could not get/create user application data folder: %s" % exception) try: localappdata = SHGetSpecialFolderPath(0, CSIDL_LOCAL_APPDATA, 1) except Exception, exception: localappdata = os.path.join(appdata, "Local") cache = localappdata # Argyll CMS uses ALLUSERSPROFILE for local system wide app related data # Note: On Windows Vista and later, ALLUSERSPROFILE and COMMON_APPDATA # are actually the same ('C:\ProgramData'), but under Windows XP the former # points to 'C:\Documents and Settings\All Users' while COMMON_APPDATA # points to 'C:\Documents and Settings\All Users\Application Data' allusersprofile = getenvu("ALLUSERSPROFILE") if allusersprofile: commonappdata = [allusersprofile] else: try: commonappdata = [SHGetSpecialFolderPath(0, CSIDL_COMMON_APPDATA, 1)] except Exception, exception: raise Exception("FATAL - Could not get/create common application data folder: %s" % exception) library = commonappdata[0] try: commonprogramfiles = SHGetSpecialFolderPath(0, CSIDL_PROGRAM_FILES_COMMON, 1) except Exception, exception: raise Exception("FATAL - Could not get/create common program files folder: %s" % exception) try: autostart = SHGetSpecialFolderPath(0, CSIDL_COMMON_STARTUP, 1) except Exception, exception: autostart = None try: autostart_home = SHGetSpecialFolderPath(0, CSIDL_STARTUP, 1) except Exception, exception: autostart_home = None try: iccprofiles = [os.path.join(SHGetSpecialFolderPath(0, CSIDL_SYSTEM), "spool", "drivers", "color")] except Exception, exception: raise Exception("FATAL - Could not get system folder: %s" % exception) iccprofiles_home = iccprofiles try: programs = SHGetSpecialFolderPath(0, CSIDL_PROGRAMS, 1) except Exception, exception: programs = None try: commonprograms = [SHGetSpecialFolderPath(0, CSIDL_COMMON_PROGRAMS, 1)] except Exception, exception: commonprograms = [] elif sys.platform == "darwin": library_home = os.path.join(home, "Library") cache = os.path.join(library_home, "Caches") library = os.path.join(os.path.sep, "Library") prefs = os.path.join(os.path.sep, "Library", "Preferences") prefs_home = os.path.join(home, "Library", "Preferences") appdata = os.path.join(home, "Library", "Application Support") commonappdata = [os.path.join(os.path.sep, "Library", "Application Support")] autostart = autostart_home = None iccprofiles = [os.path.join(os.path.sep, "Library", "ColorSync", "Profiles"), os.path.join(os.path.sep, "System", "Library", "ColorSync", "Profiles")] iccprofiles_home = [os.path.join(home, "Library", "ColorSync", "Profiles")] programs = os.path.join(os.path.sep, "Applications") commonprograms = [] else: cache = xdg_cache_home = getenvu("XDG_CACHE_HOME", expandvarsu("$HOME/.cache")) xdg_config_home = getenvu("XDG_CONFIG_HOME", expandvarsu("$HOME/.config")) xdg_config_dir_default = "/etc/xdg" xdg_config_dirs = [os.path.normpath(pth) for pth in getenvu("XDG_CONFIG_DIRS", xdg_config_dir_default).split(os.pathsep)] if not xdg_config_dir_default in xdg_config_dirs: xdg_config_dirs.append(xdg_config_dir_default) xdg_data_home_default = expandvarsu("$HOME/.local/share") library_home = appdata = xdg_data_home = getenvu("XDG_DATA_HOME", xdg_data_home_default) xdg_data_dirs_default = "/usr/local/share:/usr/share:/var/lib" xdg_data_dirs = [os.path.normpath(pth) for pth in getenvu("XDG_DATA_DIRS", xdg_data_dirs_default).split(os.pathsep)] for dir_ in xdg_data_dirs_default.split(os.pathsep): if not dir_ in xdg_data_dirs: xdg_data_dirs.append(dir_) commonappdata = xdg_data_dirs library = commonappdata[0] autostart = None for dir_ in xdg_config_dirs: if os.path.exists(dir_): autostart = os.path.join(dir_, "autostart") break if not autostart: autostart = os.path.join(xdg_config_dir_default, "autostart") autostart_home = os.path.join(xdg_config_home, "autostart") iccprofiles = [] for dir_ in xdg_data_dirs: if os.path.exists(dir_): iccprofiles.append(os.path.join(dir_, "color", "icc")) iccprofiles.append("/var/lib/color") iccprofiles_home = [os.path.join(xdg_data_home, "color", "icc"), os.path.join(xdg_data_home, "icc"), expandvarsu("$HOME/.color/icc")] programs = os.path.join(xdg_data_home, "applications") commonprograms = [os.path.join(dir_, "applications") for dir_ in xdg_data_dirs] if sys.platform in ("darwin", "win32"): iccprofiles_display = iccprofiles iccprofiles_display_home = iccprofiles_home else: iccprofiles_display = [os.path.join(dir_, "devices", "display") for dir_ in iccprofiles] iccprofiles_display_home = [os.path.join(dir_, "devices", "display") for dir_ in iccprofiles_home] del dir_ DisplayCAL-3.5.0.0/DisplayCAL/demjson.py0000644000076500000000000025343612665102054017452 0ustar devwheel00000000000000# -*- coding: utf-8 -*- # r""" A JSON data encoder and decoder. This Python module implements the JSON (http://json.org/) data encoding format; a subset of ECMAScript (aka JavaScript) for encoding primitive data types (numbers, strings, booleans, lists, and associative arrays) in a language-neutral simple text-based syntax. It can encode or decode between JSON formatted strings and native Python data types. Normally you would use the encode() and decode() functions defined by this module, but if you want more control over the processing you can use the JSON class. This implementation tries to be as completely cormforming to all intricacies of the standards as possible. It can operate in strict mode (which only allows JSON-compliant syntax) or a non-strict mode (which allows much more of the whole ECMAScript permitted syntax). This includes complete support for Unicode strings (including surrogate-pairs for non-BMP characters), and all number formats including negative zero and IEEE 754 non-numbers such a NaN or Infinity. The JSON/ECMAScript to Python type mappings are: ---JSON--- ---Python--- null None undefined undefined (note 1) Boolean (true,false) bool (True or False) Integer int or long (note 2) Float float String str or unicode ( "..." or u"..." ) Array [a, ...] list ( [...] ) Object {a:b, ...} dict ( {...} ) -- Note 1. an 'undefined' object is declared in this module which represents the native Python value for this type when in non-strict mode. -- Note 2. some ECMAScript integers may be up-converted to Python floats, such as 1e+40. Also integer -0 is converted to float -0, so as to preserve the sign (which ECMAScript requires). In addition, when operating in non-strict mode, several IEEE 754 non-numbers are also handled, and are mapped to specific Python objects declared in this module: NaN (not a number) nan (float('nan')) Infinity, +Infinity inf (float('inf')) -Infinity neginf (float('-inf')) When encoding Python objects into JSON, you may use types other than native lists or dictionaries, as long as they support the minimal interfaces required of all sequences or mappings. This means you can use generators and iterators, tuples, UserDict subclasses, etc. To make it easier to produce JSON encoded representations of user defined classes, if the object has a method named json_equivalent(), then it will call that method and attempt to encode the object returned from it instead. It will do this recursively as needed and before any attempt to encode the object using it's default strategies. Note that any json_equivalent() method should return "equivalent" Python objects to be encoded, not an already-encoded JSON-formatted string. There is no such aid provided to decode JSON back into user-defined classes as that would dramatically complicate the interface. When decoding strings with this module it may operate in either strict or non-strict mode. The strict mode only allows syntax which is conforming to RFC 4627 (JSON), while the non-strict allows much more of the permissible ECMAScript syntax. The following are permitted when processing in NON-STRICT mode: * Unicode format control characters are allowed anywhere in the input. * All Unicode line terminator characters are recognized. * All Unicode white space characters are recognized. * The 'undefined' keyword is recognized. * Hexadecimal number literals are recognized (e.g., 0xA6, 0177). * String literals may use either single or double quote marks. * Strings may contain \x (hexadecimal) escape sequences, as well as the \v and \0 escape sequences. * Lists may have omitted (elided) elements, e.g., [,,,,,], with missing elements interpreted as 'undefined' values. * Object properties (dictionary keys) can be of any of the types: string literals, numbers, or identifiers (the later of which are treated as if they are string literals)---as permitted by ECMAScript. JSON only permits strings literals as keys. Concerning non-strict and non-ECMAScript allowances: * Octal numbers: If you allow the 'octal_numbers' behavior (which is never enabled by default), then you can use octal integers and octal character escape sequences (per the ECMAScript standard Annex B.1.2). This behavior is allowed, if enabled, because it was valid JavaScript at one time. * Multi-line string literals: Strings which are more than one line long (contain embedded raw newline characters) are never permitted. This is neither valid JSON nor ECMAScript. Some other JSON implementations may allow this, but this module considers that behavior to be a mistake. References: * JSON (JavaScript Object Notation) * RFC 4627. The application/json Media Type for JavaScript Object Notation (JSON) * ECMA-262 3rd edition (1999) * IEEE 754-1985: Standard for Binary Floating-Point Arithmetic. """ __author__ = "Deron Meranda " __date__ = "2008-03-19" __version__ = "1.3" __credits__ = """Copyright (c) 2006-2008 Deron E. Meranda Licensed under GNU GPL 3.0 or later. See LICENSE.txt included with this software. 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. 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. You should have received a copy of the GNU General Public License along with this program. If not, see . """ # ------------------------------ # useful global constants content_type = 'application/json' file_ext = 'json' hexdigits = '0123456789ABCDEFabcdef' octaldigits = '01234567' # ---------------------------------------------------------------------- # Decimal and float types. # # If a JSON number can not be stored in a Python float without loosing # precision and the Python has the decimal type, then we will try to # use decimal instead of float. To make this determination we need to # know the limits of the float type, but Python doesn't have an easy # way to tell what the largest floating-point number it supports. So, # we detemine the precision and scale of the float type by testing it. try: # decimal module was introduced in Python 2.4 import decimal except ImportError: decimal = None def determine_float_precision(): """Returns a tuple (significant_digits, max_exponent) for the float type. """ import math # Just count the digits in pi. The last two decimal digits # may only be partial digits, so discount for them. whole, frac = repr(math.pi).split('.') sigdigits = len(whole) + len(frac) - 2 # This is a simple binary search. We find the largest exponent # that the float() type can handle without going infinite or # raising errors. maxexp = None minv = 0; maxv = 1000 while True: if minv+1 == maxv: maxexp = minv - 1 break elif maxv < minv: maxexp = None break m = (minv + maxv) // 2 try: f = repr(float( '1e+%d' % m )) except ValueError: f = None else: if not f or f[0] < '0' or f[0] > '9': f = None if not f: # infinite maxv = m else: minv = m return sigdigits, maxexp float_sigdigits, float_maxexp = determine_float_precision() # ---------------------------------------------------------------------- # The undefined value. # # ECMAScript has an undefined value (similar to yet distinct from null). # Neither Python or strict JSON have support undefined, but to allow # JavaScript behavior we must simulate it. class _undefined_class(object): """Represents the ECMAScript 'undefined' value.""" __slots__ = [] def __repr__(self): return self.__module__ + '.undefined' def __str__(self): return 'undefined' def __nonzero__(self): return False undefined = _undefined_class() del _undefined_class # ---------------------------------------------------------------------- # Non-Numbers: NaN, Infinity, -Infinity # # ECMAScript has official support for non-number floats, although # strict JSON does not. Python doesn't either. So to support the # full JavaScript behavior we must try to add them into Python, which # is unfortunately a bit of black magic. If our python implementation # happens to be built on top of IEEE 754 we can probably trick python # into using real floats. Otherwise we must simulate it with classes. def _nonnumber_float_constants(): """Try to return the Nan, Infinity, and -Infinity float values. This is unnecessarily complex because there is no standard platform- independent way to do this in Python as the language (opposed to some implementation of it) doesn't discuss non-numbers. We try various strategies from the best to the worst. If this Python interpreter uses the IEEE 754 floating point standard then the returned values will probably be real instances of the 'float' type. Otherwise a custom class object is returned which will attempt to simulate the correct behavior as much as possible. """ try: # First, try (mostly portable) float constructor. Works under # Linux x86 (gcc) and some Unices. nan = float('nan') inf = float('inf') neginf = float('-inf') except ValueError: try: # Try the AIX (PowerPC) float constructors nan = float('NaNQ') inf = float('INF') neginf = float('-INF') except ValueError: try: # Next, try binary unpacking. Should work under # platforms using IEEE 754 floating point. import struct, sys xnan = '7ff8000000000000'.decode('hex') # Quiet NaN xinf = '7ff0000000000000'.decode('hex') xcheck = 'bdc145651592979d'.decode('hex') # -3.14159e-11 # Could use float.__getformat__, but it is a new python feature, # so we use sys.byteorder. if sys.byteorder == 'big': nan = struct.unpack('d', xnan)[0] inf = struct.unpack('d', xinf)[0] check = struct.unpack('d', xcheck)[0] else: nan = struct.unpack('d', xnan[::-1])[0] inf = struct.unpack('d', xinf[::-1])[0] check = struct.unpack('d', xcheck[::-1])[0] neginf = - inf if check != -3.14159e-11: raise ValueError('Unpacking raw IEEE 754 floats does not work') except (ValueError, TypeError): # Punt, make some fake classes to simulate. These are # not perfect though. For instance nan * 1.0 == nan, # as expected, but 1.0 * nan == 0.0, which is wrong. class nan(float): """An approximation of the NaN (not a number) floating point number.""" def __repr__(self): return 'nan' def __str__(self): return 'nan' def __add__(self,x): return self def __radd__(self,x): return self def __sub__(self,x): return self def __rsub__(self,x): return self def __mul__(self,x): return self def __rmul__(self,x): return self def __div__(self,x): return self def __rdiv__(self,x): return self def __divmod__(self,x): return (self,self) def __rdivmod__(self,x): return (self,self) def __mod__(self,x): return self def __rmod__(self,x): return self def __pow__(self,exp): return self def __rpow__(self,exp): return self def __neg__(self): return self def __pos__(self): return self def __abs__(self): return self def __lt__(self,x): return False def __le__(self,x): return False def __eq__(self,x): return False def __neq__(self,x): return True def __ge__(self,x): return False def __gt__(self,x): return False def __complex__(self,*a): raise NotImplementedError('NaN can not be converted to a complex') if decimal: nan = decimal.Decimal('NaN') else: nan = nan() class inf(float): """An approximation of the +Infinity floating point number.""" def __repr__(self): return 'inf' def __str__(self): return 'inf' def __add__(self,x): return self def __radd__(self,x): return self def __sub__(self,x): return self def __rsub__(self,x): return self def __mul__(self,x): if x is neginf or x < 0: return neginf elif x == 0: return nan else: return self def __rmul__(self,x): return self.__mul__(x) def __div__(self,x): if x == 0: raise ZeroDivisionError('float division') elif x < 0: return neginf else: return self def __rdiv__(self,x): if x is inf or x is neginf or x is nan: return nan return 0.0 def __divmod__(self,x): if x == 0: raise ZeroDivisionError('float divmod()') elif x < 0: return (nan,nan) else: return (self,self) def __rdivmod__(self,x): if x is inf or x is neginf or x is nan: return (nan, nan) return (0.0, x) def __mod__(self,x): if x == 0: raise ZeroDivisionError('float modulo') else: return nan def __rmod__(self,x): if x is inf or x is neginf or x is nan: return nan return x def __pow__(self, exp): if exp == 0: return 1.0 else: return self def __rpow__(self, x): if -1 < x < 1: return 0.0 elif x == 1.0: return 1.0 elif x is nan or x is neginf or x < 0: return nan else: return self def __neg__(self): return neginf def __pos__(self): return self def __abs__(self): return self def __lt__(self,x): return False def __le__(self,x): if x is self: return True else: return False def __eq__(self,x): if x is self: return True else: return False def __neq__(self,x): if x is self: return False else: return True def __ge__(self,x): return True def __gt__(self,x): return True def __complex__(self,*a): raise NotImplementedError('Infinity can not be converted to a complex') if decimal: inf = decimal.Decimal('Infinity') else: inf = inf() class neginf(float): """An approximation of the -Infinity floating point number.""" def __repr__(self): return '-inf' def __str__(self): return '-inf' def __add__(self,x): return self def __radd__(self,x): return self def __sub__(self,x): return self def __rsub__(self,x): return self def __mul__(self,x): if x is self or x < 0: return inf elif x == 0: return nan else: return self def __rmul__(self,x): return self.__mul__(self) def __div__(self,x): if x == 0: raise ZeroDivisionError('float division') elif x < 0: return inf else: return self def __rdiv__(self,x): if x is inf or x is neginf or x is nan: return nan return -0.0 def __divmod__(self,x): if x == 0: raise ZeroDivisionError('float divmod()') elif x < 0: return (nan,nan) else: return (self,self) def __rdivmod__(self,x): if x is inf or x is neginf or x is nan: return (nan, nan) return (-0.0, x) def __mod__(self,x): if x == 0: raise ZeroDivisionError('float modulo') else: return nan def __rmod__(self,x): if x is inf or x is neginf or x is nan: return nan return x def __pow__(self,exp): if exp == 0: return 1.0 else: return self def __rpow__(self, x): if x is nan or x is inf or x is inf: return nan return 0.0 def __neg__(self): return inf def __pos__(self): return self def __abs__(self): return inf def __lt__(self,x): return True def __le__(self,x): return True def __eq__(self,x): if x is self: return True else: return False def __neq__(self,x): if x is self: return False else: return True def __ge__(self,x): if x is self: return True else: return False def __gt__(self,x): return False def __complex__(self,*a): raise NotImplementedError('-Infinity can not be converted to a complex') if decimal: neginf = decimal.Decimal('-Infinity') else: neginf = neginf(0) return nan, inf, neginf nan, inf, neginf = _nonnumber_float_constants() del _nonnumber_float_constants # ---------------------------------------------------------------------- # String processing helpers unsafe_string_chars = '"\\' + ''.join([chr(i) for i in range(0x20)]) def skipstringsafe( s, start=0, end=None ): i = start #if end is None: # end = len(s) while i < end and s[i] not in unsafe_string_chars: #c = s[i] #if c in unsafe_string_chars: # break i += 1 return i def skipstringsafe_slow( s, start=0, end=None ): i = start if end is None: end = len(s) while i < end: c = s[i] if c == '"' or c == '\\' or ord(c) <= 0x1f: break i += 1 return i def extend_list_with_sep( orig_seq, extension_seq, sepchar='' ): if not sepchar: orig_seq.extend( extension_seq ) else: for i, x in enumerate(extension_seq): if i > 0: orig_seq.append( sepchar ) orig_seq.append( x ) def extend_and_flatten_list_with_sep( orig_seq, extension_seq, separator='' ): for i, part in enumerate(extension_seq): if i > 0 and separator: orig_seq.append( separator ) orig_seq.extend( part ) # ---------------------------------------------------------------------- # Unicode helpers # # JSON requires that all JSON implementations must support the UTF-32 # encoding (as well as UTF-8 and UTF-16). But earlier versions of # Python did not provide a UTF-32 codec. So we must implement UTF-32 # ourselves in case we need it. def utf32le_encode( obj, errors='strict' ): """Encodes a Unicode string into a UTF-32LE encoded byte string.""" import struct try: import cStringIO as sio except ImportError: import StringIO as sio f = sio.StringIO() write = f.write pack = struct.pack for c in obj: n = ord(c) if 0xD800 <= n <= 0xDFFF: # surrogate codepoints are prohibited by UTF-32 if errors == 'ignore': continue elif errors == 'replace': n = ord('?') else: cname = 'U+%04X'%n raise UnicodeError('UTF-32 can not encode surrogate characters',cname) write( pack('L', n) ) return f.getvalue() def utf32le_decode( obj, errors='strict' ): """Decodes a UTF-32LE byte string into a Unicode string.""" if len(obj) % 4 != 0: raise UnicodeError('UTF-32 decode error, data length not a multiple of 4 bytes') import struct unpack = struct.unpack chars = [] i = 0 for i in range(0, len(obj), 4): seq = obj[i:i+4] n = unpack('L',seq)[0] chars.append( unichr(n) ) return u''.join( chars ) def auto_unicode_decode( s ): """Takes a string and tries to convert it to a Unicode string. This will return a Python unicode string type corresponding to the input string (either str or unicode). The character encoding is guessed by looking for either a Unicode BOM prefix, or by the rules specified by RFC 4627. When in doubt it is assumed the input is encoded in UTF-8 (the default for JSON). """ if isinstance(s, unicode): return s if len(s) < 4: return s.decode('utf8') # not enough bytes, assume default of utf-8 # Look for BOM marker import codecs bom2 = s[:2] bom4 = s[:4] a, b, c, d = map(ord, s[:4]) # values of first four bytes if bom4 == codecs.BOM_UTF32_LE: encoding = 'utf-32le' s = s[4:] elif bom4 == codecs.BOM_UTF32_BE: encoding = 'utf-32be' s = s[4:] elif bom2 == codecs.BOM_UTF16_LE: encoding = 'utf-16le' s = s[2:] elif bom2 == codecs.BOM_UTF16_BE: encoding = 'utf-16be' s = s[2:] # No BOM, so autodetect encoding used by looking at first four bytes # according to RFC 4627 section 3. elif a==0 and b==0 and c==0 and d!=0: # UTF-32BE encoding = 'utf-32be' elif a==0 and b!=0 and c==0 and d!=0: # UTF-16BE encoding = 'utf-16be' elif a!=0 and b==0 and c==0 and d==0: # UTF-32LE encoding = 'utf-32le' elif a!=0 and b==0 and c!=0 and d==0: # UTF-16LE encoding = 'utf-16le' else: #if a!=0 and b!=0 and c!=0 and d!=0: # UTF-8 # JSON spec says default is UTF-8, so always guess it # if we can't guess otherwise encoding = 'utf8' # Make sure the encoding is supported by Python try: cdk = codecs.lookup(encoding) except LookupError: if encoding.startswith('utf-32') \ or encoding.startswith('ucs4') \ or encoding.startswith('ucs-4'): # Python doesn't natively have a UTF-32 codec, but JSON # requires that it be supported. So we must decode these # manually. if encoding.endswith('le'): unis = utf32le_decode(s) else: unis = utf32be_decode(s) else: raise JSONDecodeError('this python has no codec for this character encoding',encoding) else: # Convert to unicode using a standard codec unis = s.decode(encoding) return unis def surrogate_pair_as_unicode( c1, c2 ): """Takes a pair of unicode surrogates and returns the equivalent unicode character. The input pair must be a surrogate pair, with c1 in the range U+D800 to U+DBFF and c2 in the range U+DC00 to U+DFFF. """ n1, n2 = ord(c1), ord(c2) if n1 < 0xD800 or n1 > 0xDBFF or n2 < 0xDC00 or n2 > 0xDFFF: raise JSONDecodeError('illegal Unicode surrogate pair',(c1,c2)) a = n1 - 0xD800 b = n2 - 0xDC00 v = (a << 10) | b v += 0x10000 return unichr(v) def unicode_as_surrogate_pair( c ): """Takes a single unicode character and returns a sequence of surrogate pairs. The output of this function is a tuple consisting of one or two unicode characters, such that if the input character is outside the BMP range then the output is a two-character surrogate pair representing that character. If the input character is inside the BMP then the output tuple will have just a single character...the same one. """ n = ord(c) if n < 0x10000: return (unichr(n),) # in BMP, surrogate pair not required v = n - 0x10000 vh = (v >> 10) & 0x3ff # highest 10 bits vl = v & 0x3ff # lowest 10 bits w1 = 0xD800 | vh w2 = 0xDC00 | vl return (unichr(w1), unichr(w2)) # ---------------------------------------------------------------------- # Type identification def isnumbertype( obj ): """Is the object of a Python number type (excluding complex)?""" return isinstance(obj, (int,long,float)) \ and not isinstance(obj, bool) \ or obj is nan or obj is inf or obj is neginf def isstringtype( obj ): """Is the object of a Python string type?""" if isinstance(obj, basestring): return True # Must also check for some other pseudo-string types import types, UserString return isinstance(obj, types.StringTypes) \ or isinstance(obj, UserString.UserString) \ or isinstance(obj, UserString.MutableString) # ---------------------------------------------------------------------- # Numeric helpers def decode_hex( hexstring ): """Decodes a hexadecimal string into it's integer value.""" # We don't use the builtin 'hex' codec in python since it can # not handle odd numbers of digits, nor raise the same type # of exceptions we want to. n = 0 for c in hexstring: if '0' <= c <= '9': d = ord(c) - ord('0') elif 'a' <= c <= 'f': d = ord(c) - ord('a') + 10 elif 'A' <= c <= 'F': d = ord(c) - ord('A') + 10 else: raise JSONDecodeError('not a hexadecimal number',hexstring) # Could use ((n << 4 ) | d), but python 2.3 issues a FutureWarning. n = (n * 16) + d return n def decode_octal( octalstring ): """Decodes an octal string into it's integer value.""" n = 0 for c in octalstring: if '0' <= c <= '7': d = ord(c) - ord('0') else: raise JSONDecodeError('not an octal number',octalstring) # Could use ((n << 3 ) | d), but python 2.3 issues a FutureWarning. n = (n * 8) + d return n # ---------------------------------------------------------------------- # Exception classes. class JSONError(ValueError): """Our base class for all JSON-related errors. """ def pretty_description(self): err = self.args[0] if len(self.args) > 1: err += ': ' for anum, a in enumerate(self.args[1:]): if anum > 1: err += ', ' astr = repr(a) if len(astr) > 20: astr = astr[:20] + '...' err += astr return err class JSONDecodeError(JSONError): """An exception class raised when a JSON decoding error (syntax error) occurs.""" class JSONEncodeError(JSONError): """An exception class raised when a python object can not be encoded as a JSON string.""" #---------------------------------------------------------------------- # The main JSON encoder/decoder class. class JSON(object): """An encoder/decoder for JSON data streams. Usually you will call the encode() or decode() methods. The other methods are for lower-level processing. Whether the JSON parser runs in strict mode (which enforces exact compliance with the JSON spec) or the more forgiving non-string mode can be affected by setting the 'strict' argument in the object's initialization; or by assigning True or False to the 'strict' property of the object. You can also adjust a finer-grained control over strictness by allowing or preventing specific behaviors. You can get a list of all the available behaviors by accessing the 'behaviors' property. Likewise the allowed_behaviors and prevented_behaviors list which behaviors will be allowed and which will not. Call the allow() or prevent() methods to adjust these. """ _escapes_json = { # character escapes in JSON '"': '"', '/': '/', '\\': '\\', 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t', } _escapes_js = { # character escapes in Javascript '"': '"', '\'': '\'', '\\': '\\', 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t', 'v': '\v', '0': '\x00' } # Following is a reverse mapping of escape characters, used when we # output JSON. Only those escapes which are always safe (e.g., in JSON) # are here. It won't hurt if we leave questionable ones out. _rev_escapes = {'\n': '\\n', '\t': '\\t', '\b': '\\b', '\r': '\\r', '\f': '\\f', '"': '\\"', '\\': '\\\\'} def __init__(self, strict=False, compactly=True, escape_unicode=False): """Creates a JSON encoder/decoder object. If 'strict' is set to True, then only strictly-conforming JSON output will be produced. Note that this means that some types of values may not be convertable and will result in a JSONEncodeError exception. If 'compactly' is set to True, then the resulting string will have all extraneous white space removed; if False then the string will be "pretty printed" with whitespace and indentation added to make it more readable. If 'escape_unicode' is set to True, then all non-ASCII characters will be represented as a unicode escape sequence; if False then the actual real unicode character will be inserted if possible. The 'escape_unicode' can also be a function, which when called with a single argument of a unicode character will return True if the character should be escaped or False if it should not. If you wish to extend the encoding to ba able to handle additional types, you should subclass this class and override the encode_default() method. """ import sys self._set_strictness(strict) self._encode_compactly = compactly try: # see if we were passed a predicate function b = escape_unicode(u'A') self._encode_unicode_as_escapes = escape_unicode except (ValueError, NameError, TypeError): # Just set to True or False. We could use lambda x:True # to make it more consistent (always a function), but it # will be too slow, so we'll make explicit tests later. self._encode_unicode_as_escapes = bool(escape_unicode) self._sort_dictionary_keys = True # The following is a boolean map of the first 256 characters # which will quickly tell us which of those characters never # need to be escaped. self._asciiencodable = [32 <= c < 128 and not self._rev_escapes.has_key(chr(c)) for c in range(0,255)] def _set_strictness(self, strict): """Changes the strictness behavior. Pass True to be very strict about JSON syntax, or False to be looser. """ self._allow_any_type_at_start = not strict self._allow_all_numeric_signs = not strict self._allow_comments = not strict self._allow_control_char_in_string = not strict self._allow_hex_numbers = not strict self._allow_initial_decimal_point = not strict self._allow_js_string_escapes = not strict self._allow_non_numbers = not strict self._allow_nonescape_characters = not strict # "\z" -> "z" self._allow_nonstring_keys = not strict self._allow_omitted_array_elements = not strict self._allow_single_quoted_strings = not strict self._allow_trailing_comma_in_literal = not strict self._allow_undefined_values = not strict self._allow_unicode_format_control_chars = not strict self._allow_unicode_whitespace = not strict # Always disable this by default self._allow_octal_numbers = False def allow(self, behavior): """Allow the specified behavior (turn off a strictness check). The list of all possible behaviors is available in the behaviors property. You can see which behaviors are currently allowed by accessing the allowed_behaviors property. """ p = '_allow_' + behavior if hasattr(self, p): setattr(self, p, True) else: raise AttributeError('Behavior is not known',behavior) def prevent(self, behavior): """Prevent the specified behavior (turn on a strictness check). The list of all possible behaviors is available in the behaviors property. You can see which behaviors are currently prevented by accessing the prevented_behaviors property. """ p = '_allow_' + behavior if hasattr(self, p): setattr(self, p, False) else: raise AttributeError('Behavior is not known',behavior) def _get_behaviors(self): return sorted([ n[len('_allow_'):] for n in self.__dict__ \ if n.startswith('_allow_')]) behaviors = property(_get_behaviors, doc='List of known behaviors that can be passed to allow() or prevent() methods') def _get_allowed_behaviors(self): return sorted([ n[len('_allow_'):] for n in self.__dict__ \ if n.startswith('_allow_') and getattr(self,n)]) allowed_behaviors = property(_get_allowed_behaviors, doc='List of known behaviors that are currently allowed') def _get_prevented_behaviors(self): return sorted([ n[len('_allow_'):] for n in self.__dict__ \ if n.startswith('_allow_') and not getattr(self,n)]) prevented_behaviors = property(_get_prevented_behaviors, doc='List of known behaviors that are currently prevented') def _is_strict(self): return not self.allowed_behaviors strict = property(_is_strict, _set_strictness, doc='True if adherence to RFC 4627 syntax is strict, or False is more generous ECMAScript syntax is permitted') def isws(self, c): """Determines if the given character is considered as white space. Note that Javscript is much more permissive on what it considers to be whitespace than does JSON. Ref. ECMAScript section 7.2 """ if not self._allow_unicode_whitespace: return c in ' \t\n\r' else: if not isinstance(c,unicode): c = unicode(c) if c in u' \t\n\r\f\v': return True import unicodedata return unicodedata.category(c) == 'Zs' def islineterm(self, c): """Determines if the given character is considered a line terminator. Ref. ECMAScript section 7.3 """ if c == '\r' or c == '\n': return True if c == u'\u2028' or c == u'\u2029': # unicodedata.category(c) in ['Zl', 'Zp'] return True return False def strip_format_control_chars(self, txt): """Filters out all Unicode format control characters from the string. ECMAScript permits any Unicode "format control characters" to appear at any place in the source code. They are to be ignored as if they are not there before any other lexical tokenization occurs. Note that JSON does not allow them. Ref. ECMAScript section 7.1. """ import unicodedata txt2 = filter( lambda c: unicodedata.category(unicode(c)) != 'Cf', txt ) return txt2 def decode_null(self, s, i=0): """Intermediate-level decoder for ECMAScript 'null' keyword. Takes a string and a starting index, and returns a Python None object and the index of the next unparsed character. """ if i < len(s) and s[i:i+4] == 'null': return None, i+4 raise JSONDecodeError('literal is not the JSON "null" keyword', s) def encode_undefined(self): """Produces the ECMAScript 'undefined' keyword.""" return 'undefined' def encode_null(self): """Produces the JSON 'null' keyword.""" return 'null' def decode_boolean(self, s, i=0): """Intermediate-level decode for JSON boolean literals. Takes a string and a starting index, and returns a Python bool (True or False) and the index of the next unparsed character. """ if s[i:i+4] == 'true': return True, i+4 elif s[i:i+5] == 'false': return False, i+5 raise JSONDecodeError('literal value is not a JSON boolean keyword',s) def encode_boolean(self, b): """Encodes the Python boolean into a JSON Boolean literal.""" if bool(b): return 'true' return 'false' def decode_number(self, s, i=0, imax=None): """Intermediate-level decoder for JSON numeric literals. Takes a string and a starting index, and returns a Python suitable numeric type and the index of the next unparsed character. The returned numeric type can be either of a Python int, long, or float. In addition some special non-numbers may also be returned such as nan, inf, and neginf (technically which are Python floats, but have no numeric value.) Ref. ECMAScript section 8.5. """ if imax is None: imax = len(s) # Detect initial sign character(s) if not self._allow_all_numeric_signs: if s[i] == '+' or (s[i] == '-' and i+1 < imax and \ s[i+1] in '+-'): raise JSONDecodeError('numbers in strict JSON may only have a single "-" as a sign prefix',s[i:]) sign = +1 j = i # j will point after the sign prefix while j < imax and s[j] in '+-': if s[j] == '-': sign = sign * -1 j += 1 # Check for ECMAScript symbolic non-numbers if s[j:j+3] == 'NaN': if self._allow_non_numbers: return nan, j+3 else: raise JSONDecodeError('NaN literals are not allowed in strict JSON') elif s[j:j+8] == 'Infinity': if self._allow_non_numbers: if sign < 0: return neginf, j+8 else: return inf, j+8 else: raise JSONDecodeError('Infinity literals are not allowed in strict JSON') elif s[j:j+2] in ('0x','0X'): if self._allow_hex_numbers: k = j+2 while k < imax and s[k] in hexdigits: k += 1 n = sign * decode_hex( s[j+2:k] ) return n, k else: raise JSONDecodeError('hexadecimal literals are not allowed in strict JSON',s[i:]) else: # Decimal (or octal) number, find end of number. # General syntax is: \d+[\.\d+][e[+-]?\d+] k = j # will point to end of digit sequence could_be_octal = ( k+1 < imax and s[k] == '0' ) # first digit is 0 decpt = None # index into number of the decimal point, if any ept = None # index into number of the e|E exponent start, if any esign = '+' # sign of exponent sigdigits = 0 # number of significant digits (approx, counts end zeros) while k < imax and (s[k].isdigit() or s[k] in '.+-eE'): c = s[k] if c not in octaldigits: could_be_octal = False if c == '.': if decpt is not None or ept is not None: break else: decpt = k-j elif c in 'eE': if ept is not None: break else: ept = k-j elif c in '+-': if not ept: break esign = c else: #digit if not ept: sigdigits += 1 k += 1 number = s[j:k] # The entire number as a string #print 'NUMBER IS: ', repr(number), ', sign', sign, ', esign', esign, \ # ', sigdigits', sigdigits, \ # ', decpt', decpt, ', ept', ept # Handle octal integers first as an exception. If octal # is not enabled (the ECMAScipt standard) then just do # nothing and treat the string as a decimal number. if could_be_octal and self._allow_octal_numbers: n = sign * decode_octal( number ) return n, k # A decimal number. Do a quick check on JSON syntax restrictions. if number[0] == '.' and not self._allow_initial_decimal_point: raise JSONDecodeError('numbers in strict JSON must have at least one digit before the decimal point',s[i:]) elif number[0] == '0' and \ len(number) > 1 and number[1].isdigit(): if self._allow_octal_numbers: raise JSONDecodeError('initial zero digit is only allowed for octal integers',s[i:]) else: raise JSONDecodeError('initial zero digit must not be followed by other digits (octal numbers are not permitted)',s[i:]) # Make sure decimal point is followed by a digit if decpt is not None: if decpt+1 >= len(number) or not number[decpt+1].isdigit(): raise JSONDecodeError('decimal point must be followed by at least one digit',s[i:]) # Determine the exponential part if ept is not None: if ept+1 >= len(number): raise JSONDecodeError('exponent in number is truncated',s[i:]) try: exponent = int(number[ept+1:]) except ValueError: raise JSONDecodeError('not a valid exponent in number',s[i:]) ##print 'EXPONENT', exponent else: exponent = 0 # Try to make an int/long first. if decpt is None and exponent >= 0: # An integer if ept: n = int(number[:ept]) else: n = int(number) n *= sign if exponent: n *= 10**exponent if n == 0 and sign < 0: # minus zero, must preserve negative sign so make a float n = -0.0 else: try: if decimal and (abs(exponent) > float_maxexp or sigdigits > float_sigdigits): try: n = decimal.Decimal(number) n = n.normalize() except decimal.Overflow: if sign<0: n = neginf else: n = inf else: n *= sign else: n = float(number) * sign except ValueError: raise JSONDecodeError('not a valid JSON numeric literal', s[i:j]) return n, k def encode_number(self, n): """Encodes a Python numeric type into a JSON numeric literal. The special non-numeric values of float('nan'), float('inf') and float('-inf') are translated into appropriate JSON literals. Note that Python complex types are not handled, as there is no ECMAScript equivalent type. """ if isinstance(n, complex): if n.imag: raise JSONEncodeError('Can not encode a complex number that has a non-zero imaginary part',n) n = n.real if isinstance(n, (int,long)): return str(n) if decimal and isinstance(n, decimal.Decimal): return str(n) global nan, inf, neginf if n is nan: return 'NaN' elif n is inf: return 'Infinity' elif n is neginf: return '-Infinity' elif isinstance(n, float): # Check for non-numbers. # In python nan == inf == -inf, so must use repr() to distinguish reprn = repr(n).lower() if ('inf' in reprn and '-' in reprn) or n == neginf: return '-Infinity' elif 'inf' in reprn or n is inf: return 'Infinity' elif 'nan' in reprn or n is nan: return 'NaN' return repr(n) else: raise TypeError('encode_number expected an integral, float, or decimal number type',type(n)) def decode_string(self, s, i=0, imax=None): """Intermediate-level decoder for JSON string literals. Takes a string and a starting index, and returns a Python string (or unicode string) and the index of the next unparsed character. """ if imax is None: imax = len(s) if imax < i+2 or s[i] not in '"\'': raise JSONDecodeError('string literal must be properly quoted',s[i:]) closer = s[i] if closer == '\'' and not self._allow_single_quoted_strings: raise JSONDecodeError('string literals must use double quotation marks in strict JSON',s[i:]) i += 1 # skip quote if self._allow_js_string_escapes: escapes = self._escapes_js else: escapes = self._escapes_json ccallowed = self._allow_control_char_in_string chunks = [] _append = chunks.append done = False high_surrogate = None while i < imax: c = s[i] # Make sure a high surrogate is immediately followed by a low surrogate if high_surrogate and (i+1 >= imax or s[i:i+2] != '\\u'): raise JSONDecodeError('High unicode surrogate must be followed by a low surrogate',s[i:]) if c == closer: i += 1 # skip end quote done = True break elif c == '\\': # Escaped character i += 1 if i >= imax: raise JSONDecodeError('escape in string literal is incomplete',s[i-1:]) c = s[i] if '0' <= c <= '7' and self._allow_octal_numbers: # Handle octal escape codes first so special \0 doesn't kick in yet. # Follow Annex B.1.2 of ECMAScript standard. if '0' <= c <= '3': maxdigits = 3 else: maxdigits = 2 for k in range(i, i+maxdigits+1): if k >= imax or s[k] not in octaldigits: break n = decode_octal(s[i:k]) if n < 128: _append( chr(n) ) else: _append( unichr(n) ) i = k continue if escapes.has_key(c): _append(escapes[c]) i += 1 elif c == 'u' or c == 'x': i += 1 if c == 'u': digits = 4 else: # c== 'x' if not self._allow_js_string_escapes: raise JSONDecodeError(r'string literals may not use the \x hex-escape in strict JSON',s[i-1:]) digits = 2 if i+digits >= imax: raise JSONDecodeError('numeric character escape sequence is truncated',s[i-1:]) n = decode_hex( s[i:i+digits] ) if high_surrogate: # Decode surrogate pair and clear high surrogate _append( surrogate_pair_as_unicode( high_surrogate, unichr(n) ) ) high_surrogate = None elif n < 128: # ASCII chars always go in as a str _append( chr(n) ) elif 0xd800 <= n <= 0xdbff: # high surrogate if imax < i + digits + 2 or s[i+digits] != '\\' or s[i+digits+1] != 'u': raise JSONDecodeError('High unicode surrogate must be followed by a low surrogate',s[i-2:]) high_surrogate = unichr(n) # remember until we get to the low surrogate elif 0xdc00 <= n <= 0xdfff: # low surrogate raise JSONDecodeError('Low unicode surrogate must be proceeded by a high surrogate',s[i-2:]) else: # Other chars go in as a unicode char _append( unichr(n) ) i += digits else: # Unknown escape sequence if self._allow_nonescape_characters: _append( c ) i += 1 else: raise JSONDecodeError('unsupported escape code in JSON string literal',s[i-1:]) elif ord(c) <= 0x1f: # A control character if self.islineterm(c): raise JSONDecodeError('line terminator characters must be escaped inside string literals',s[i:]) elif ccallowed: _append( c ) i += 1 else: raise JSONDecodeError('control characters must be escaped inside JSON string literals',s[i:]) else: # A normal character; not an escape sequence or end-quote. # Find a whole sequence of "safe" characters so we can append them # all at once rather than one a time, for speed. j = i i += 1 while i < imax and s[i] not in unsafe_string_chars and s[i] != closer: i += 1 _append(s[j:i]) if not done: raise JSONDecodeError('string literal is not terminated with a quotation mark',s) s = ''.join( chunks ) return s, i def encode_string(self, s): """Encodes a Python string into a JSON string literal. """ # Must handle instances of UserString specially in order to be # able to use ord() on it's simulated "characters". import UserString if isinstance(s, (UserString.UserString, UserString.MutableString)): def tochar(c): return c.data else: # Could use "lambda c:c", but that is too slow. So we set to None # and use an explicit if test inside the loop. tochar = None chunks = [] chunks.append('"') revesc = self._rev_escapes asciiencodable = self._asciiencodable encunicode = self._encode_unicode_as_escapes i = 0 imax = len(s) while i < imax: if tochar: c = tochar(s[i]) else: c = s[i] cord = ord(c) if cord < 256 and asciiencodable[cord] and isinstance(encunicode, bool): # Contiguous runs of plain old printable ASCII can be copied # directly to the JSON output without worry (unless the user # has supplied a custom is-encodable function). j = i i += 1 while i < imax: if tochar: c = tochar(s[i]) else: c = s[i] cord = ord(c) if cord < 256 and asciiencodable[cord]: i += 1 else: break chunks.append( unicode(s[j:i]) ) elif revesc.has_key(c): # Has a shortcut escape sequence, like "\n" chunks.append(revesc[c]) i += 1 elif cord <= 0x1F: # Always unicode escape ASCII-control characters chunks.append(r'\u%04x' % cord) i += 1 elif 0xD800 <= cord <= 0xDFFF: # A raw surrogate character! This should never happen # and there's no way to include it in the JSON output. # So all we can do is complain. cname = 'U+%04X' % cord raise JSONEncodeError('can not include or escape a Unicode surrogate character',cname) elif cord <= 0xFFFF: # Other BMP Unicode character if isinstance(encunicode, bool): doesc = encunicode else: doesc = encunicode( c ) if doesc: chunks.append(r'\u%04x' % cord) else: chunks.append( c ) i += 1 else: # ord(c) >= 0x10000 # Non-BMP Unicode if isinstance(encunicode, bool): doesc = encunicode else: doesc = encunicode( c ) if doesc: for surrogate in unicode_as_surrogate_pair(c): chunks.append(r'\u%04x' % ord(surrogate)) else: chunks.append( c ) i += 1 chunks.append('"') return ''.join( chunks ) def skip_comment(self, txt, i=0): """Skips an ECMAScript comment, either // or /* style. The contents of the comment are returned as a string, as well as the index of the character immediately after the comment. """ if i+1 >= len(txt) or txt[i] != '/' or txt[i+1] not in '/*': return None, i if not self._allow_comments: raise JSONDecodeError('comments are not allowed in strict JSON',txt[i:]) multiline = (txt[i+1] == '*') istart = i i += 2 while i < len(txt): if multiline: if txt[i] == '*' and i+1 < len(txt) and txt[i+1] == '/': j = i+2 break elif txt[i] == '/' and i+1 < len(txt) and txt[i+1] == '*': raise JSONDecodeError('multiline /* */ comments may not nest',txt[istart:i+1]) else: if self.islineterm(txt[i]): j = i # line terminator is not part of comment break i += 1 if i >= len(txt): if not multiline: j = len(txt) # // comment terminated by end of file is okay else: raise JSONDecodeError('comment was never terminated',txt[istart:]) return txt[istart:j], j def skipws(self, txt, i=0, imax=None, skip_comments=True): """Skips whitespace. """ if not self._allow_comments and not self._allow_unicode_whitespace: if imax is None: imax = len(txt) while i < imax and txt[i] in ' \r\n\t': i += 1 return i else: return self.skipws_any(txt, i, imax, skip_comments) def skipws_any(self, txt, i=0, imax=None, skip_comments=True): """Skips all whitespace, including comments and unicode whitespace Takes a string and a starting index, and returns the index of the next non-whitespace character. If skip_comments is True and not running in strict JSON mode, then comments will be skipped over just like whitespace. """ if imax is None: imax = len(txt) while i < imax: if txt[i] == '/': cmt, i = self.skip_comment(txt, i) if i < imax and self.isws(txt[i]): i += 1 else: break return i def decode_composite(self, txt, i=0, imax=None): """Intermediate-level JSON decoder for composite literal types (array and object). Takes text and a starting index, and returns either a Python list or dictionary and the index of the next unparsed character. """ if imax is None: imax = len(txt) i = self.skipws(txt, i, imax) starti = i if i >= imax or txt[i] not in '{[': raise JSONDecodeError('composite object must start with "[" or "{"',txt[i:]) if txt[i] == '[': isdict = False closer = ']' obj = [] else: isdict = True closer = '}' obj = {} i += 1 # skip opener i = self.skipws(txt, i, imax) if i < imax and txt[i] == closer: # empty composite i += 1 done = True else: saw_value = False # set to false at beginning and after commas done = False while i < imax: i = self.skipws(txt, i, imax) if i < imax and (txt[i] == ',' or txt[i] == closer): c = txt[i] i += 1 if c == ',': if not saw_value: # no preceeding value, an elided (omitted) element if isdict: raise JSONDecodeError('can not omit elements of an object (dictionary)') if self._allow_omitted_array_elements: if self._allow_undefined_values: obj.append( undefined ) else: obj.append( None ) else: raise JSONDecodeError('strict JSON does not permit omitted array (list) elements',txt[i:]) saw_value = False continue else: # c == closer if not saw_value and not self._allow_trailing_comma_in_literal: if isdict: raise JSONDecodeError('strict JSON does not allow a final comma in an object (dictionary) literal',txt[i-2:]) else: raise JSONDecodeError('strict JSON does not allow a final comma in an array (list) literal',txt[i-2:]) done = True break # Decode the item if isdict and self._allow_nonstring_keys: r = self.decodeobj(txt, i, identifier_as_string=True) else: r = self.decodeobj(txt, i, identifier_as_string=False) if r: if saw_value: # two values without a separating comma raise JSONDecodeError('values must be separated by a comma', txt[i:r[1]]) saw_value = True i = self.skipws(txt, r[1], imax) if isdict: key = r[0] # Ref 11.1.5 if not isstringtype(key): if isnumbertype(key): if not self._allow_nonstring_keys: raise JSONDecodeError('strict JSON only permits string literals as object properties (dictionary keys)',txt[starti:]) else: raise JSONDecodeError('object properties (dictionary keys) must be either string literals or numbers',txt[starti:]) if i >= imax or txt[i] != ':': raise JSONDecodeError('object property (dictionary key) has no value, expected ":"',txt[starti:]) i += 1 i = self.skipws(txt, i, imax) rval = self.decodeobj(txt, i) if rval: i = self.skipws(txt, rval[1], imax) obj[key] = rval[0] else: raise JSONDecodeError('object property (dictionary key) has no value',txt[starti:]) else: # list obj.append( r[0] ) else: # not r if isdict: raise JSONDecodeError('expected a value, or "}"',txt[i:]) elif not self._allow_omitted_array_elements: raise JSONDecodeError('expected a value or "]"',txt[i:]) else: raise JSONDecodeError('expected a value, "," or "]"',txt[i:]) # end while if not done: if isdict: raise JSONDecodeError('object literal (dictionary) is not terminated',txt[starti:]) else: raise JSONDecodeError('array literal (list) is not terminated',txt[starti:]) return obj, i def decode_javascript_identifier(self, name): """Convert a JavaScript identifier into a Python string object. This method can be overriden by a subclass to redefine how JavaScript identifiers are turned into Python objects. By default this just converts them into strings. """ return name def decodeobj(self, txt, i=0, imax=None, identifier_as_string=False, only_object_or_array=False): """Intermediate-level JSON decoder. Takes a string and a starting index, and returns a two-tuple consting of a Python object and the index of the next unparsed character. If there is no value at all (empty string, etc), the None is returned instead of a tuple. """ if imax is None: imax = len(txt) obj = None i = self.skipws(txt, i, imax) if i >= imax: raise JSONDecodeError('Unexpected end of input') c = txt[i] if c == '[' or c == '{': obj, i = self.decode_composite(txt, i, imax) elif only_object_or_array: raise JSONDecodeError('JSON document must start with an object or array type only', txt[i:i+20]) elif c == '"' or c == '\'': obj, i = self.decode_string(txt, i, imax) elif c.isdigit() or c in '.+-': obj, i = self.decode_number(txt, i, imax) elif c.isalpha() or c in'_$': j = i while j < imax and (txt[j].isalnum() or txt[j] in '_$'): j += 1 kw = txt[i:j] if kw == 'null': obj, i = None, j elif kw == 'true': obj, i = True, j elif kw == 'false': obj, i = False, j elif kw == 'undefined': if self._allow_undefined_values: obj, i = undefined, j else: raise JSONDecodeError('strict JSON does not allow undefined elements',txt[i:]) elif kw == 'NaN' or kw == 'Infinity': obj, i = self.decode_number(txt, i) else: if identifier_as_string: obj, i = self.decode_javascript_identifier(kw), j else: raise JSONDecodeError('unknown keyword or identifier',kw) else: raise JSONDecodeError('can not decode value',txt[i:]) return obj, i def decode(self, txt): """Decodes a JSON-endoded string into a Python object.""" if self._allow_unicode_format_control_chars: txt = self.strip_format_control_chars(txt) r = self.decodeobj(txt, 0, only_object_or_array=not self._allow_any_type_at_start) if not r: raise JSONDecodeError('can not decode value',txt) else: obj, i = r i = self.skipws(txt, i) if i < len(txt): raise JSONDecodeError('unexpected or extra text',txt[i:]) return obj def encode(self, obj, nest_level=0): """Encodes the Python object into a JSON string representation. This method will first attempt to encode an object by seeing if it has a json_equivalent() method. If so than it will call that method and then recursively attempt to encode the object resulting from that call. Next it will attempt to determine if the object is a native type or acts like a squence or dictionary. If so it will encode that object directly. Finally, if no other strategy for encoding the object of that type exists, it will call the encode_default() method. That method currently raises an error, but it could be overridden by subclasses to provide a hook for extending the types which can be encoded. """ chunks = [] self.encode_helper(chunks, obj, nest_level) return ''.join( chunks ) def encode_helper(self, chunklist, obj, nest_level): #print 'encode_helper(chunklist=%r, obj=%r, nest_level=%r)'%(chunklist,obj,nest_level) if hasattr(obj, 'json_equivalent'): json = self.encode_equivalent( obj, nest_level=nest_level ) if json is not None: chunklist.append( json ) return if obj is None: chunklist.append( self.encode_null() ) elif obj is undefined: if self._allow_undefined_values: chunklist.append( self.encode_undefined() ) else: raise JSONEncodeError('strict JSON does not permit "undefined" values') elif isinstance(obj, bool): chunklist.append( self.encode_boolean(obj) ) elif isinstance(obj, (int,long,float,complex)) or \ (decimal and isinstance(obj, decimal.Decimal)): chunklist.append( self.encode_number(obj) ) elif isinstance(obj, basestring) or isstringtype(obj): chunklist.append( self.encode_string(obj) ) else: self.encode_composite(chunklist, obj, nest_level) def encode_composite(self, chunklist, obj, nest_level): """Encodes just dictionaries, lists, or sequences. Basically handles any python type for which iter() can create an iterator object. This method is not intended to be called directly. Use the encode() method instead. """ #print 'encode_complex_helper(chunklist=%r, obj=%r, nest_level=%r)'%(chunklist,obj,nest_level) try: # Is it a dictionary or UserDict? Try iterkeys method first. it = obj.iterkeys() except AttributeError: try: # Is it a sequence? Try to make an iterator for it. it = iter(obj) except TypeError: it = None if it is not None: # Does it look like a dictionary? Check for a minimal dict or # UserDict interface. isdict = hasattr(obj, '__getitem__') and hasattr(obj, 'keys') compactly = self._encode_compactly if isdict: chunklist.append('{') if compactly: dictcolon = ':' else: dictcolon = ' : ' else: chunklist.append('[') #print nest_level, 'opening sequence:', repr(chunklist) if not compactly: indent0 = ' ' * nest_level indent = ' ' * (nest_level+1) chunklist.append(' ') sequence_chunks = [] # use this to allow sorting afterwards if dict try: # while not StopIteration numitems = 0 while True: obj2 = it.next() if obj2 is obj: raise JSONEncodeError('trying to encode an infinite sequence',obj) if isdict and not isstringtype(obj2): # Check JSON restrictions on key types if isnumbertype(obj2): if not self._allow_nonstring_keys: raise JSONEncodeError('object properties (dictionary keys) must be strings in strict JSON',obj2) else: raise JSONEncodeError('object properties (dictionary keys) can only be strings or numbers in ECMAScript',obj2) # Encode this item in the sequence and put into item_chunks item_chunks = [] self.encode_helper( item_chunks, obj2, nest_level=nest_level+1 ) if isdict: item_chunks.append(dictcolon) obj3 = obj[obj2] self.encode_helper(item_chunks, obj3, nest_level=nest_level+2) #print nest_level, numitems, 'item:', repr(obj2) #print nest_level, numitems, 'sequence_chunks:', repr(sequence_chunks) #print nest_level, numitems, 'item_chunks:', repr(item_chunks) #extend_list_with_sep(sequence_chunks, item_chunks) sequence_chunks.append(item_chunks) #print nest_level, numitems, 'new sequence_chunks:', repr(sequence_chunks) numitems += 1 except StopIteration: pass if isdict and self._sort_dictionary_keys: sequence_chunks.sort() # Note sorts by JSON repr, not original Python object if compactly: sep = ',' else: sep = ',\n' + indent #print nest_level, 'closing sequence' #print nest_level, 'chunklist:', repr(chunklist) #print nest_level, 'sequence_chunks:', repr(sequence_chunks) extend_and_flatten_list_with_sep( chunklist, sequence_chunks, sep ) #print nest_level, 'new chunklist:', repr(chunklist) if not compactly: if numitems > 1: chunklist.append('\n' + indent0) else: chunklist.append(' ') if isdict: chunklist.append('}') else: chunklist.append(']') else: # Can't create an iterator for the object json2 = self.encode_default( obj, nest_level=nest_level ) chunklist.append( json2 ) def encode_equivalent( self, obj, nest_level=0 ): """This method is used to encode user-defined class objects. The object being encoded should have a json_equivalent() method defined which returns another equivalent object which is easily JSON-encoded. If the object in question has no json_equivalent() method available then None is returned instead of a string so that the encoding will attempt the next strategy. If a caller wishes to disable the calling of json_equivalent() methods, then subclass this class and override this method to just return None. """ if hasattr(obj, 'json_equivalent') \ and callable(getattr(obj,'json_equivalent')): obj2 = obj.json_equivalent() if obj2 is obj: # Try to prevent careless infinite recursion raise JSONEncodeError('object has a json_equivalent() method that returns itself',obj) json2 = self.encode( obj2, nest_level=nest_level ) return json2 else: return None def encode_default( self, obj, nest_level=0 ): """This method is used to encode objects into JSON which are not straightforward. This method is intended to be overridden by subclasses which wish to extend this encoder to handle additional types. """ raise JSONEncodeError('can not encode object into a JSON representation',obj) # ------------------------------ def encode( obj, strict=False, compactly=True, escape_unicode=False, encoding=None ): """Encodes a Python object into a JSON-encoded string. If 'strict' is set to True, then only strictly-conforming JSON output will be produced. Note that this means that some types of values may not be convertable and will result in a JSONEncodeError exception. If 'compactly' is set to True, then the resulting string will have all extraneous white space removed; if False then the string will be "pretty printed" with whitespace and indentation added to make it more readable. If 'escape_unicode' is set to True, then all non-ASCII characters will be represented as a unicode escape sequence; if False then the actual real unicode character will be inserted. If no encoding is specified (encoding=None) then the output will either be a Python string (if entirely ASCII) or a Python unicode string type. However if an encoding name is given then the returned value will be a python string which is the byte sequence encoding the JSON value. As the default/recommended encoding for JSON is UTF-8, you should almost always pass in encoding='utf8'. """ import sys encoder = None # Custom codec encoding function bom = None # Byte order mark to prepend to final output cdk = None # Codec to use if encoding is not None: import codecs try: cdk = codecs.lookup(encoding) except LookupError: cdk = None if cdk: pass elif not cdk: # No built-in codec was found, see if it is something we # can do ourself. encoding = encoding.lower() if encoding.startswith('utf-32') or encoding.startswith('utf32') \ or encoding.startswith('ucs4') \ or encoding.startswith('ucs-4'): # Python doesn't natively have a UTF-32 codec, but JSON # requires that it be supported. So we must decode these # manually. if encoding.endswith('le'): encoder = utf32le_encode elif encoding.endswith('be'): encoder = utf32be_encode else: encoder = utf32be_encode bom = codecs.BOM_UTF32_BE elif encoding.startswith('ucs2') or encoding.startswith('ucs-2'): # Python has no UCS-2, but we can simulate with # UTF-16. We just need to force us to not try to # encode anything past the BMP. encoding = 'utf-16' if not escape_unicode and not callable(escape_unicode): escape_unicode = lambda c: (0xD800 <= ord(c) <= 0xDFFF) or ord(c) >= 0x10000 else: raise JSONEncodeError('this python has no codec for this character encoding',encoding) if not escape_unicode and not callable(escape_unicode): if encoding and encoding.startswith('utf'): # All UTF-x encodings can do the whole Unicode repertoire, so # do nothing special. pass else: # Even though we don't want to escape all unicode chars, # the encoding being used may force us to do so anyway. # We must pass in a function which says which characters # the encoding can handle and which it can't. def in_repertoire( c, encoding_func ): try: x = encoding_func( c, errors='strict' ) except UnicodeError: return False return True if encoder: escape_unicode = lambda c: not in_repertoire(c, encoder) elif cdk: escape_unicode = lambda c: not in_repertoire(c, cdk[0]) else: pass # Let the JSON object deal with it j = JSON( strict=strict, compactly=compactly, escape_unicode=escape_unicode ) unitxt = j.encode( obj ) if encoder: txt = encoder( unitxt ) elif encoding is not None: txt = unitxt.encode( encoding ) else: txt = unitxt if bom: txt = bom + txt return txt def decode( txt, strict=False, encoding=None, **kw ): """Decodes a JSON-encoded string into a Python object. If 'strict' is set to True, then those strings that are not entirely strictly conforming to JSON will result in a JSONDecodeError exception. The input string can be either a python string or a python unicode string. If it is already a unicode string, then it is assumed that no character set decoding is required. However, if you pass in a non-Unicode text string (i.e., a python type 'str') then an attempt will be made to auto-detect and decode the character encoding. This will be successful if the input was encoded in any of UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE), and of course plain ASCII works too. Note though that if you know the character encoding, then you should convert to a unicode string yourself, or pass it the name of the 'encoding' to avoid the guessing made by the auto detection, as with python_object = demjson.decode( input_bytes, encoding='utf8' ) Optional keywords arguments must be of the form allow_xxxx=True/False or prevent_xxxx=True/False where each will allow or prevent the specific behavior, after the evaluation of the 'strict' argument. For example, if strict=True then by also passing 'allow_comments=True' then comments will be allowed. If strict=False then prevent_comments=True will allow everything except comments. """ # Initialize the JSON object j = JSON( strict=strict ) for keyword, value in kw.items(): if keyword.startswith('allow_'): behavior = keyword[6:] allow = bool(value) elif keyword.startswith('prevent_'): behavior = keyword[8:] allow = not bool(value) else: raise ValueError('unknown keyword argument', keyword) if allow: j.allow(behavior) else: j.prevent(behavior) # Convert the input string into unicode if needed. if isinstance(txt,unicode): unitxt = txt else: if encoding is None: unitxt = auto_unicode_decode( txt ) else: cdk = None # codec decoder = None import codecs try: cdk = codecs.lookup(encoding) except LookupError: encoding = encoding.lower() decoder = None if encoding.startswith('utf-32') \ or encoding.startswith('ucs4') \ or encoding.startswith('ucs-4'): # Python doesn't natively have a UTF-32 codec, but JSON # requires that it be supported. So we must decode these # manually. if encoding.endswith('le'): decoder = utf32le_decode elif encoding.endswith('be'): decoder = utf32be_decode else: if txt.startswith( codecs.BOM_UTF32_BE ): decoder = utf32be_decode txt = txt[4:] elif txt.startswith( codecs.BOM_UTF32_LE ): decoder = utf32le_decode txt = txt[4:] else: if encoding.startswith('ucs'): raise JSONDecodeError('UCS-4 encoded string must start with a BOM') decoder = utf32be_decode # Default BE for UTF, per unicode spec elif encoding.startswith('ucs2') or encoding.startswith('ucs-2'): # Python has no UCS-2, but we can simulate with # UTF-16. We just need to force us to not try to # encode anything past the BMP. encoding = 'utf-16' if decoder: unitxt = decoder(txt) elif encoding: unitxt = txt.decode(encoding) else: raise JSONDecodeError('this python has no codec for this character encoding',encoding) # Check that the decoding seems sane. Per RFC 4627 section 3: # "Since the first two characters of a JSON text will # always be ASCII characters [RFC0020], ..." # # This check is probably not necessary, but it allows us to # raise a suitably descriptive error rather than an obscure # syntax error later on. # # Note that the RFC requirements of two ASCII characters seems # to be an incorrect statement as a JSON string literal may # have as it's first character any unicode character. Thus # the first two characters will always be ASCII, unless the # first character is a quotation mark. And in non-strict # mode we can also have a few other characters too. if len(unitxt) > 2: first, second = unitxt[:2] if first in '"\'': pass # second can be anything inside string literal else: if ((ord(first) < 0x20 or ord(first) > 0x7f) or \ (ord(second) < 0x20 or ord(second) > 0x7f)) and \ (not j.isws(first) and not j.isws(second)): # Found non-printable ascii, must check unicode # categories to see if the character is legal. # Only whitespace, line and paragraph separators, # and format control chars are legal here. import unicodedata catfirst = unicodedata.category(unicode(first)) catsecond = unicodedata.category(unicode(second)) if catfirst not in ('Zs','Zl','Zp','Cf') or \ catsecond not in ('Zs','Zl','Zp','Cf'): raise JSONDecodeError('the decoded string is gibberish, is the encoding correct?',encoding) # Now ready to do the actual decoding obj = j.decode( unitxt ) return obj # end file DisplayCAL-3.5.0.0/DisplayCAL/DisplayCAL.py0000644000076500000000000216702013242301247017730 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ DisplayCAL - display calibration and characterization powered by ArgyllCMS Copyright (C) 2008, 2009 Florian Hoech 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. 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. You should have received a copy of the GNU General Public License along with this program; if not, see """ from __future__ import with_statement import sys # Standard modules import datetime import decimal Decimal = decimal.Decimal import glob import math import os import platform if sys.platform == "darwin": from platform import mac_ver import re import shutil import socket import subprocess as sp import threading import traceback import urllib2 import zipfile if sys.platform == "win32": import _winreg from hashlib import md5 from time import gmtime, localtime, sleep, strftime, strptime, struct_time from zlib import crc32 # 3rd party modules import demjson # Config import config from config import (appbasename, autostart, autostart_home, build, script_ext, defaults, enc, exe, exe_ext, fs_enc, getbitmap, geticon, get_ccxx_testchart, get_current_profile, get_display_profile, get_data_path, getcfg, get_total_patches, get_verified_path, hascfg, is_ccxx_testchart, is_profile, initcfg, isapp, isexe, profile_ext, pydir, resfiles, setcfg, writecfg) # Custom modules import CGATS import ICCProfile as ICCP import audio import ccmx import colord import colormath import localization as lang import madvr import pyi_md5pickuphelper import report if sys.platform == "win32": import util_win import wexpect from argyll_cgats import (cal_to_fake_profile, can_update_cal, ti3_to_ti1, extract_cal_from_profile, verify_ti1_rgb_xyz) from argyll_instruments import (get_canonical_instrument_name, instruments) from argyll_names import viewconds from colormath import (CIEDCCT2xyY, planckianCT2xyY, xyY2CCT, XYZ2CCT, XYZ2Lab, XYZ2xyY) from debughelpers import ResourceError, getevtobjname, getevttype, handle_error from edid import pnpidcache, get_manufacturer_name from log import log, logbuffer, safe_print from meta import (VERSION, VERSION_BASE, author, name as appname, domain, version, version_short) from options import debug, test, test_update, verbose from ordereddict import OrderedDict from patterngenerators import WebWinHTTPPatternGeneratorServer try: from chromecast_patterngenerator import ChromeCastPatternGenerator as CCPG except ImportError: CCPG = None.__class__ from trash import trash, TrashAborted, TrashcanUnavailableError from util_decimal import float2dec, stripzeros from util_io import LineCache, StringIOu as StringIO, TarFileProper from util_list import index_fallback_ignorecase, intlist, natsort from util_os import (expanduseru, get_program_file, getenvu, is_superuser, launch_file, listdir_re, waccess, dlopen, which) from util_str import (ellipsis, make_filename_safe, safe_str, safe_unicode, strtr, universal_newlines, wrap) import util_x from worker import (Error, Info, UnloggedError, UnloggedInfo, UnloggedWarning, Warn, Worker, check_create_dir, check_file_isfile, check_set_argyll_bin, check_ti3, check_ti3_criteria1, check_ti3_criteria2, get_arg, get_argyll_util, get_cfg_option_from_args, get_options_from_cal, get_argyll_version, get_current_profile_path, get_options_from_profile, get_options_from_ti3, make_argyll_compatible_path, parse_argument_string, set_argyll_bin, show_result_dialog, technology_strings_170, technology_strings_171, check_argyll_bin, http_request) from wxLUT3DFrame import LUT3DFrame try: from wxLUTViewer import LUTFrame except ImportError: LUTFrame = None if sys.platform in ("darwin", "win32") or isexe: from wxMeasureFrame import MeasureFrame from wxDisplayUniformityFrame import DisplayUniformityFrame from wxMeasureFrame import get_default_size from wxProfileInfo import ProfileInfoFrame from wxReportFrame import ReportFrame from wxSynthICCFrame import SynthICCFrame from wxTestchartEditor import TestchartEditor from wxVisualWhitepointEditor import VisualWhitepointEditor from wxaddons import (wx, BetterWindowDisabler, CustomEvent, CustomGridCellEvent) from wxfixes import (ThemedGenButton, BitmapWithThemedButton, set_bitmap_labels, TempXmlResource, wx_Panel) from wxwindows import (AboutDialog, AuiBetterTabArt, BaseApp, BaseFrame, BetterStaticFancyText, BorderGradientButton, BitmapBackgroundPanel, BitmapBackgroundPanelText, ConfirmDialog, CustomGrid, CustomCellBoolRenderer, FileBrowseBitmapButtonWithChoiceHistory, FileDrop, FlatShadedButton, HtmlWindow, HyperLinkCtrl, InfoDialog, LogWindow, ProgressDialog, TabButton, TooltipWindow, get_gradient_panel, get_dialogs) import floatspin import xh_fancytext import xh_filebrowsebutton import xh_floatspin import xh_hstretchstatbmp import xh_bitmapctrls # wxPython try: # Only wx.lib.aui.AuiNotebook looks reasonable across _all_ platforms. # Other tabbed book controls like wx.Notebook or wx.aui.AuiNotebook are # impossible to get to look right under GTK because there's no way to # set the correct background color for the pages. from wx.lib.agw import aui except ImportError: # Fall back to wx.aui under ancient wxPython versions from wx import aui from wx import xrc from wx.lib import delayedresult, platebtn from wx.lib.art import flagart from wx.lib.scrolledpanel import ScrolledPanel def swap_dict_keys_values(mydict): """ Swap dictionary keys and values """ return dict([(v, k) for (k, v) in mydict.iteritems()]) def app_update_check(parent=None, silent=False, snapshot=False, argyll=False): """ Check for application update. Show an error dialog if a failure occurs. """ global app_is_uptodate if argyll: if test_update: argyll_version = [0, 0, 0] elif parent and hasattr(parent, "worker"): argyll_version = parent.worker.argyll_version else: argyll_version = intlist(getcfg("argyll.version").split(".")) curversion_tuple = tuple(argyll_version) version_file = "Argyll/VERSION" readme_file = "Argyll/ChangesSummary.html" elif snapshot: # Snapshot curversion_tuple = VERSION version_file = "SNAPSHOT_VERSION" readme_file = "SNAPSHOT_README.html" else: # Stable safe_print(lang.getstr("update_check")) curversion_tuple = VERSION_BASE version_file = "VERSION" readme_file = "README.html" resp = http_request(parent, domain, "GET", "/" + version_file, failure_msg=lang.getstr("update_check.fail"), silent=silent) if resp is False: if silent: # Check if we need to run instrument setup wx.CallAfter(parent.check_instrument_setup, check_donation, (parent, snapshot)) return data = resp.read() if not wx.GetApp(): return try: newversion_tuple = tuple(int(n) for n in data.split(".")) except ValueError: safe_print(lang.getstr("update_check.fail.version", domain)) if not silent: wx.CallAfter(InfoDialog, parent, msg=lang.getstr("update_check.fail.version", domain), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False) return newversion_tuple = (0, 0, 0, 0) if not argyll: app_is_uptodate = newversion_tuple <= curversion_tuple if newversion_tuple > curversion_tuple: # Get changelog resp = http_request(parent, domain, "GET", "/" + readme_file, silent=True) chglog = None if resp: readme = safe_unicode(resp.read(), "utf-8") if argyll: chglog = readme else: chglog = re.search('
' '.+?

.+?

' '.+?
.+?', readme, re.S) if chglog: chglog = chglog.group() chglog = re.sub('
', "", chglog) chglog = re.sub("<\/?d[l|d]>", "", chglog) chglog = re.sub("<(?:h2|dt)>.+?", "", chglog) chglog = re.sub("

.+?

", "", chglog) chglog = u""" %s """ % chglog if chglog: chglog = re.sub(re.compile(r"(.+?)", flags=re.I | re.S), r"

\1

", chglog) chglog = re.sub(re.compile('href="(#[^"]+)"', flags=re.I), r'href="https://%s/\1"' % domain, chglog) if not wx.GetApp(): return wx.CallAfter(app_update_confirm, parent, newversion_tuple, chglog, snapshot, argyll, silent) elif not argyll and not snapshot and VERSION > VERSION_BASE: app_update_check(parent, silent, True) elif not argyll: safe_print(lang.getstr("update_check.uptodate", appname)) if check_argyll_bin(): app_update_check(parent, silent, argyll=True) elif silent: wx.CallAfter(parent.set_argyll_bin_handler, True, silent, parent.check_instrument_setup, (check_donation, (parent, snapshot))) else: wx.CallAfter(parent.set_argyll_bin_handler, True) elif not silent: safe_print(lang.getstr("update_check.uptodate", "ArgyllCMS")) wx.CallAfter(app_uptodate, parent, "ArgyllCMS" if not globals().get("app_is_uptodate") else appname) else: safe_print(lang.getstr("update_check.uptodate", "ArgyllCMS")) # Check if we need to run instrument setup wx.CallAfter(parent.check_instrument_setup, check_donation, (parent, snapshot)) def check_donation(parent, snapshot): # Show donation popup if user did not choose "don't show again". # Reset donation popup after a major update. if (not snapshot and VERSION[0] > tuple(intlist(getcfg("last_launch").split(".")))[0]): setcfg("show_donation_message", 1) setcfg("last_launch", version) if getcfg("show_donation_message"): wx.CallAfter(donation_message, parent) def app_uptodate(parent=None, appname=appname): """ Show a dialog confirming application is up-to-date """ dlg = InfoDialog(parent, msg=lang.getstr("update_check.uptodate", appname), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), show=False, log=False) update_check = wx.CheckBox(dlg, -1, lang.getstr("update_check.onstartup")) update_check.SetValue(getcfg("update_check")) dlg.Bind(wx.EVT_CHECKBOX, lambda event: setcfg("update_check", int(event.IsChecked())), id=update_check.GetId()) dlg.sizer3.Add(update_check, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ShowModalThenDestroy() if parent and getattr(parent, "menuitem_app_auto_update_check", None): parent.menuitem_app_auto_update_check.Check(bool(getcfg("update_check"))) def app_update_confirm(parent=None, newversion_tuple=(0, 0, 0, 0), chglog=None, snapshot=False, argyll=False, silent=False): """ Show a dialog confirming application update, with cancel option """ zeroinstall = (not argyll and os.path.exists(os.path.normpath(os.path.join(pydir, "..", appname + ".pyw"))) and re.match("sha\d+(?:new)?", os.path.basename(os.path.dirname(pydir))) and (which("0install-win.exe") or which("0install"))) download = argyll and not check_argyll_bin() if zeroinstall or sys.platform in ("darwin", "win32") or argyll: ok = lang.getstr("download" if download else "update_now") alt = lang.getstr("go_to_website") else: ok = lang.getstr("go_to_website") alt = None newversion = ".".join(str(n) for n in newversion_tuple) if argyll: newversion_desc = "ArgyllCMS" else: newversion_desc = appname newversion_desc += " " + newversion if snapshot: newversion_desc += " Beta" if download: msg = lang.getstr("download") + " " + newversion_desc else: msg = lang.getstr("update_check.new_version", newversion_desc) dlg = ConfirmDialog(parent, msg=msg, ok=ok, alt=alt, cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), log=True) scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 if (argyll and sys.platform not in ("darwin", "win32") and not dlopen("libXss.so") and not dlopen("libXss.so.1")): sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Insert(0, sizer, flag=wx.BOTTOM | wx.ALIGN_LEFT, border=12) sizer.Add(wx.StaticBitmap(dlg, -1, geticon(16, "dialog-warning"))) warning_text = lang.getstr("library.not_found.warning", (lang.getstr("libXss.so"), "libXss.so")) warning = wx.StaticText(dlg, -1, warning_text) warning.ForegroundColour = "#F07F00" sizer.Add(warning, flag=wx.LEFT, border=8) warning.Wrap((500 - 16 - 8) * scale) if chglog: htmlwnd = HtmlWindow(dlg, -1, size=(500 * scale, 300 * scale), style=wx.BORDER_THEME) htmlwnd.SetPage(chglog) dlg.sizer3.Add(htmlwnd, 1, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=12) update_check = wx.CheckBox(dlg, -1, lang.getstr("update_check.onstartup")) update_check.SetValue(getcfg("update_check")) dlg.Bind(wx.EVT_CHECKBOX, lambda event: setcfg("update_check", int(event.IsChecked())), id=update_check.GetId()) dlg.sizer3.Add(update_check, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() dlg.Destroy() if parent and getattr(parent, "menuitem_app_auto_update_check", None): parent.menuitem_app_auto_update_check.Check(bool(getcfg("update_check"))) if result == wx.ID_OK and (zeroinstall or (sys.platform in ("darwin", "win32") or argyll)): if parent and hasattr(parent, "worker"): worker = parent.worker else: worker = Worker() if snapshot: # Snapshot folder = "/snapshot" else: # Stable folder = "" if zeroinstall: if parent: parent.Close() else: wx.GetApp().ExitMainLoop() if sys.platform == "win32": kwargs = dict(stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) else: kwargs = {} sp.Popen([zeroinstall.encode(fs_enc), "run", "--refresh", "--version", newversion, "http://%s/0install/%s.xml" % (domain.lower(), appname)], **kwargs) else: consumer = worker.process_download dlname = appname sep = "-" if argyll: consumer = worker.process_argyll_download dlname = "Argyll" sep = "_V" if sys.platform == "win32": # Determine 32 or 64 bit OS key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SYSTEM\CurrentControlSet\Control" r"\Session Manager\Environment") try: value = _winreg.QueryValueEx(key, "PROCESSOR_ARCHITECTURE")[0] except WindowsError: value = "x86" finally: _winreg.CloseKey(key) if value.lower() == "amd64": suffix = "_win64_exe.zip" else: # Assume win32 suffix = "_win32_exe.zip" elif sys.platform == "darwin": # We only support OS X 10.5+ suffix = "_osx10.6_x86_64_bin.tgz" else: # Linux if platform.architecture()[0] == "64bit": # Assume x86_64 suffix = "_linux_x86_64_bin.tgz" else: # Assume x86 suffix = "_linux_x86_bin.tgz" elif sys.platform == "win32": if snapshot: # Snapshots are only avaialble as ZIP suffix = "-win32.zip" else: # Regular stable versions are available as setup suffix = "-Setup.exe" else: suffix = ".dmg" worker.start(consumer, worker.download, ckwargs={"exit": dlname == appname}, wargs=("https://%s/download%s/%s%s%s%s" % (domain.lower(), folder, dlname, sep, newversion, suffix),), progress_msg=lang.getstr("downloading"), fancy=False) return elif result != wx.ID_CANCEL: path = "/" if argyll: path += "argyll" if sys.platform == "darwin": path += "-mac" elif sys.platform == "win32": path += "-win" else: # Linux path += "-linux" launch_file("https://" + domain + path) elif not argyll: # Check for Argyll update if check_argyll_bin(): parent.app_update_check_handler(None, silent, True) elif silent: parent.set_argyll_bin_handler(True, silent, parent.check_instrument_setup, (check_donation, (parent, snapshot))) else: parent.set_argyll_bin_handler(True) return if silent: # Check if we need to run instrument setup parent.check_instrument_setup(check_donation, (parent, snapshot)) def donation_message(parent=None): """ Show donation message """ dlg = ConfirmDialog(parent, title=lang.getstr("welcome"), msg=lang.getstr("donation_message"), ok=lang.getstr("contribute"), cancel=lang.getstr("not_now"), bitmap=getbitmap("theme/headericon"), bitmap_margin=0) header = wx.StaticText(dlg, -1, lang.getstr("donation_header")) font = header.Font font.PointSize += 4 header.SetFont(font) if sys.platform != "darwin": header.MinSize = header.GetTextExtent(header.Label) dlg.sizer3.Insert(0, header, flag=wx.BOTTOM | wx.EXPAND, border=14) if sys.platform == "win32": font = dlg.message.Font font.PointSize += 1 dlg.message.SetFont(font) chkbox = wx.CheckBox(dlg.buttonpanel, -1, lang.getstr("dialog.do_not_show_again")) dlg.sizer2.Insert(0, chkbox, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=max(dlg.sizer3.MinSize[0] - dlg.sizer2.MinSize[0] - chkbox.Size[0], 12)) dlg.sizer2.Insert(0, (88, -1)) dlg.buttonpanel.Layout() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if dlg.ShowModal() == wx.ID_OK: launch_file("https://" + domain + "/#donate") show_again = False else: show_again = not chkbox.Value setcfg("show_donation_message", int(show_again)) dlg.Destroy() def colorimeter_correction_web_check_choose(resp, parent=None): """ Let user choose a colorimeter correction and confirm overwrite """ if resp is not False: data = resp.read() if data.strip().startswith("CC"): cgats = CGATS.CGATS(data) else: InfoDialog(parent, msg=lang.getstr("colorimeter_correction.web_check.failure"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) return else: return dlg = ConfirmDialog(parent, title=lang.getstr("colorimeter_correction.web_check"), msg=lang.getstr("colorimeter_correction.web_check.choose"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), nowrap=True) scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 dlg_list_ctrl = wx.ListCtrl(dlg, -1, size=(640 * scale, 150 * scale), style=wx.LC_REPORT | wx.LC_SINGLE_SEL, name="colorimeter_corrections") dlg_list_ctrl.InsertColumn(0, lang.getstr("type")) dlg_list_ctrl.InsertColumn(1, lang.getstr("description")) dlg_list_ctrl.InsertColumn(2, lang.getstr("display.manufacturer")) dlg_list_ctrl.InsertColumn(3, lang.getstr("display")) dlg_list_ctrl.InsertColumn(4, lang.getstr("instrument")) dlg_list_ctrl.InsertColumn(5, lang.getstr("reference")) dlg_list_ctrl.InsertColumn(6, lang.getstr("observer")) dlg_list_ctrl.InsertColumn(7, lang.getstr("method")) dlg_list_ctrl.InsertColumn(8, u"ΔE*00 " + lang.getstr("profile.self_check.avg")) dlg_list_ctrl.InsertColumn(9, u"ΔE*00 " + lang.getstr("profile.self_check.max")) dlg_list_ctrl.InsertColumn(10, lang.getstr("created")) dlg_list_ctrl.SetColumnWidth(0, 50) dlg_list_ctrl.SetColumnWidth(1, 350) dlg_list_ctrl.SetColumnWidth(2, 150) dlg_list_ctrl.SetColumnWidth(3, 100) dlg_list_ctrl.SetColumnWidth(4, 75) dlg_list_ctrl.SetColumnWidth(5, 75) dlg_list_ctrl.SetColumnWidth(6, 75) dlg_list_ctrl.SetColumnWidth(7, 75) dlg_list_ctrl.SetColumnWidth(8, 100) dlg_list_ctrl.SetColumnWidth(9, 100) dlg_list_ctrl.SetColumnWidth(10, 150) types = {"CCSS": lang.getstr("spectral").replace(":", ""), "CCMX": lang.getstr("matrix").replace(":", "")} for i in cgats: index = dlg_list_ctrl.InsertStringItem(i, "") ccxx_type = cgats[i].type.strip() dlg_list_ctrl.SetStringItem(index, 0, types.get(ccxx_type, safe_unicode(ccxx_type, "UTF-8"))) dlg_list_ctrl.SetStringItem(index, 1, get_canonical_instrument_name(safe_unicode(cgats[i].queryv1("DESCRIPTOR") or lang.getstr("unknown"), "UTF-8"))) dlg_list_ctrl.SetStringItem(index, 2, safe_unicode(cgats[i].queryv1("MANUFACTURER") or lang.getstr("unknown"), "UTF-8")) dlg_list_ctrl.SetStringItem(index, 3, safe_unicode(cgats[i].queryv1("DISPLAY") or lang.getstr("unknown"), "UTF-8")) dlg_list_ctrl.SetStringItem(index, 4, get_canonical_instrument_name(safe_unicode(cgats[i].queryv1("INSTRUMENT") or lang.getstr("unknown") if ccxx_type == "CCMX" else "i1 DisplayPro, ColorMunki Display, Spyder4/5", "UTF-8"))) dlg_list_ctrl.SetStringItem(index, 5, get_canonical_instrument_name(safe_unicode(cgats[i].queryv1("REFERENCE") or lang.getstr("unknown"), "UTF-8"))) created = cgats[i].queryv1("CREATED") if created: try: created = strptime(created) except ValueError: datetmp = re.search("\w+ (\w{3}) (\d{2}) (\d{2}(?::[0-5][0-9]){2}) (\d{4})", created) if datetmp: datetmp = "%s-%s-%s %s" % (datetmp.groups()[3], {"Jan": "01", "Feb": "02", "Mar": "03", "Apr": "04", "May": "05", "Jun": "06", "Jul": "07", "Aug": "08", "Sep": "09", "Oct": "10", "Nov": "11", "Dec": "12"}.get(datetmp.groups()[0]), datetmp.groups()[1], datetmp.groups()[2]) try: created = strptime(datetmp, "%Y-%m-%d %H:%M:%S") except ValueError: pass if isinstance(created, struct_time): created = strftime("%Y-%m-%d %H:%M:%S", created) dlg_list_ctrl.SetStringItem(index, 6, parent.observers_ab.get(cgats[i].queryv1("REFERENCE_OBSERVER"), lang.getstr("unknown" if ccxx_type == "CCMX" else "not_applicable"))) dlg_list_ctrl.SetStringItem(index, 7, safe_unicode(cgats[i].queryv1("FIT_METHOD") or lang.getstr("unknown" if ccxx_type == "CCMX" else "not_applicable"), "UTF-8")) dlg_list_ctrl.SetStringItem(index, 8, safe_unicode(cgats[i].queryv1("FIT_AVG_DE00") or lang.getstr("unknown" if ccxx_type == "CCMX" else "not_applicable"))) dlg_list_ctrl.SetStringItem(index, 9, safe_unicode(cgats[i].queryv1("FIT_MAX_DE00") or lang.getstr("unknown" if ccxx_type == "CCMX" else "not_applicable"))) dlg_list_ctrl.SetStringItem(index, 10, safe_unicode(created or lang.getstr("unknown"), "UTF-8")) dlg.Bind(wx.EVT_LIST_ITEM_SELECTED, lambda event: dlg.ok.Enable(), dlg_list_ctrl) dlg.Bind(wx.EVT_LIST_ITEM_DESELECTED, lambda event: dlg.ok.Disable(), dlg_list_ctrl) dlg.Bind(wx.EVT_LIST_ITEM_ACTIVATED, lambda event: dlg.EndModal(wx.ID_OK), dlg_list_ctrl) dlg.sizer3.Add(dlg_list_ctrl, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) lstr = lang.getstr("colorimeter_correction.web_check.info") lstr_en = lang.getstr("colorimeter_correction.web_check.info", lcode="en") if lstr != lstr_en or lang.getcode() == "en": info_txt = wx.StaticText(dlg, -1, lstr) info_txt.Wrap(640 * scale) dlg.sizer3.Add(info_txt, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) if len(cgats) > 1: # We got several matches dlg.ok.Disable() else: item = dlg_list_ctrl.GetItem(0) dlg_list_ctrl.SetItemState(item.GetId(), wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() index = dlg_list_ctrl.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) dlg.Destroy() if result != wx.ID_OK: return False # Important: Do not use parsed CGATS, order of keywords may be # different than raw data so MD5 will be different cgats = re.sub("\n(CCMX|CCSS)( *\n)", "\n<>\n\\1\\2", data).split("\n<>\n") colorimeter_correction_check_overwrite(parent, cgats[index]) def colorimeter_correction_check_overwrite(parent=None, cgats=None, update_comports=False): """ Check if a colorimeter correction file will be overwritten and present a dialog to confirm or cancel the operation. Write the file. """ result = check_create_dir(config.get_argyll_data_dir()) if isinstance(result, Exception): show_result_dialog(result, parent) return path = get_cgats_path(cgats) if os.path.isfile(path): dlg = ConfirmDialog(parent, msg=lang.getstr("dialog.confirm_overwrite", path), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return False try: cgatsfile = open(path, 'wb') cgatsfile.write(cgats) cgatsfile.close() except EnvironmentError, exception: show_result_dialog(exception, parent) return False if getcfg("colorimeter_correction_matrix_file").split(":")[0] != "AUTO": setcfg("colorimeter_correction_matrix_file", ":" + path) if update_comports: cgats = CGATS.CGATS(cgats) instrument = (cgats.queryv1("INSTRUMENT") or getcfg("colorimeter_correction.instrument")) if instrument: instrument = get_canonical_instrument_name(instrument) else: instrument = None if instrument and instrument in parent.worker.instruments: setcfg("comport.number", parent.worker.instruments.index(instrument) + 1) parent.update_comports(force=True) else: parent.update_colorimeter_correction_matrix_ctrl_items(True) return True def get_cgats_measurement_mode(cgats, instrument): base_id = cgats.queryv1("DISPLAY_TYPE_BASE_ID") refresh = cgats.queryv1("DISPLAY_TYPE_REFRESH") mode = None if base_id: # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.get_ccxx_measurement_modes # - DisplayCAL.MainFrame.set_ccxx_measurement_mode # - worker.Worker.check_add_display_type_base_id # - worker.Worker.instrument_can_use_ccxx if instrument in ("ColorHug", "ColorHug2"): mode = {1: "F", 2: "R"}.get(base_id) elif instrument == "ColorMunki Smile": mode = {1: "f"}.get(base_id) elif instrument == "Colorimtre HCFR": mode = {1: "R"}.get(base_id) elif instrument == "K-10": mode = {1: "F"}.get(base_id) else: mode = {1: "l", 2: "c", 3: "g"}.get(base_id) elif refresh == "NO": mode = "l" elif refresh == "YES": mode = "c" return mode def get_cgats_path(cgats): descriptor = re.search('\nDESCRIPTOR\s+"(.+?)"\n', cgats) if descriptor: descriptor = descriptor.groups()[0] description = safe_unicode(descriptor or lang.getstr("unnamed"), "UTF-8") name = re.sub(r"[\\/:;*?\"<>|]+", "_", make_argyll_compatible_path(description))[:255] return os.path.join(config.get_argyll_data_dir(), "%s.%s" % (name, cgats[:7].strip().lower())) def get_header(parent, bitmap=None, label=None, size=(-1, 64), x=80, y=44, repeat_sub_bitmap_h=(220, 0, 2, 64)): w, h = 222, 64 scale = getcfg("app.dpi") / config.get_default_dpi() if scale > 1: size = tuple(int(math.floor(v * scale)) if v > 0 else v for v in size) x, y = [int(round(v * scale)) if v else v for v in (x, y)] repeat_sub_bitmap_h = tuple(int(math.floor(v * scale)) for v in repeat_sub_bitmap_h) w, h = [int(round(v * scale)) for v in (w, h)] header = BitmapBackgroundPanelText(parent) header.label_x = x header.label_y = y header.scalebitmap = (False, ) * 2 header.textshadow = False header.SetBackgroundColour("#0e59a9") header.SetForegroundColour("#FFFFFF") header.SetMaxFontSize(11) label = label or lang.getstr("header") if not bitmap: bitmap = getbitmap("theme/header", False) if bitmap.Size[0] >= w and bitmap.Size[1] >= h: bitmap = bitmap.GetSubBitmap((0, 0, w, h)) header.MinSize = size header.repeat_sub_bitmap_h = repeat_sub_bitmap_h header.SetBitmap(bitmap) header.SetLabel(label) return header def get_profile_load_on_login_label(os_cal): label = lang.getstr("profile.load_on_login") if sys.platform == "win32" and not os_cal: lstr = lang.getstr("calibration.preserve") if lang.getcode() != "de": lstr = lstr[0].lower() + lstr[1:] label += u" && " + lstr return label def upload_colorimeter_correction(parent=None, params=None): """ Upload colorimeter correction to online database """ path = "/index.php" failure_msg = lang.getstr("colorimeter_correction.upload.failure") # Check for duplicate resp = http_request(parent, "colorimetercorrections." + domain, "GET", path, # Remove CREATED date for calculating hash {"get": True, "hash": md5(re.sub('\nCREATED\s+".+?"\n', "\n\n", safe_str(params['cgats'], "UTF-8")).strip()).hexdigest()}, silent=True) if resp and resp.read().strip().startswith("CC"): wx.CallAfter(InfoDialog, parent, msg=lang.getstr("colorimeter_correction.upload.exists"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) return else: # Upload params['put'] = True resp = http_request(parent, "colorimetercorrections." + domain, "POST", path, params, failure_msg=failure_msg) if resp is not False: if resp.status == 201: wx.CallAfter(InfoDialog, parent, msg=lang.getstr("colorimeter_correction.upload.success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) else: wx.CallAfter(InfoDialog, parent, msg="\n\n".join([failure_msg, resp.read().strip()]), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) def install_scope_handler(event=None, dlg=None): dlg = dlg or event.EventObject.TopLevelParent auth_needed = dlg.install_systemwide.GetValue() if hasattr(dlg.ok, "SetAuthNeeded"): dlg.ok.SetAuthNeeded(auth_needed) if hasattr(dlg, "alt"): dlg.alt.SetAuthNeeded(auth_needed) dlg.buttonpanel.Layout() class Dummy(object): """ Useful if we need an object to attach arbitrary attributes.""" pass class ExtraArgsFrame(BaseFrame): """ Extra commandline arguments window. """ def __init__(self, parent): self.res = TempXmlResource(get_data_path(os.path.join("xrc", "extra.xrc"))) self.res.InsertHandler(xh_floatspin.FloatSpinCtrlXmlHandler()) self.res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, parent, "extra_args") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, parent, "extra_args") self.init() self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.set_child_ctrls_as_attrs(self) child = self.environment_label font = child.Font font.SetWeight(wx.BOLD) child.Font = font # Bind event handlers self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_dispcal_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_dispread_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_spotread_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_colprof_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_collink_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.extra_args_handler, id=self.extra_args_targen_ctrl.GetId()) self.setup_language() self.update_controls() def OnClose(self, event): self.Hide() def extra_args_handler(self, event): mapping = {self.extra_args_dispcal_ctrl.GetId(): "extra_args.dispcal", self.extra_args_dispread_ctrl.GetId(): "extra_args.dispread", self.extra_args_spotread_ctrl.GetId(): "extra_args.spotread", self.extra_args_colprof_ctrl.GetId(): "extra_args.colprof", self.extra_args_collink_ctrl.GetId(): "extra_args.collink", self.extra_args_targen_ctrl.GetId(): "extra_args.targen"} pref = mapping.get(event.GetId()) if pref: ctrl = self.FindWindowById(event.GetId()) value = ctrl.GetValue() setcfg(pref, value) def update_controls(self): self.extra_args_dispcal_ctrl.ChangeValue(getcfg("extra_args.dispcal")) self.extra_args_dispread_ctrl.ChangeValue(getcfg("extra_args.dispread")) self.extra_args_spotread_ctrl.ChangeValue(getcfg("extra_args.spotread")) self.extra_args_colprof_ctrl.ChangeValue(getcfg("extra_args.colprof")) self.extra_args_collink_ctrl.ChangeValue(getcfg("extra_args.collink")) self.extra_args_targen_ctrl.ChangeValue(getcfg("extra_args.targen")) self.Sizer.SetSizeHints(self) self.Sizer.Layout() class GamapFrame(BaseFrame): """ Gamut mapping options window. """ def __init__(self, parent): self.res = TempXmlResource(get_data_path(os.path.join("xrc", "gamap.xrc"))) self.res.InsertHandler(xh_filebrowsebutton.FileBrowseButtonWithHistoryXmlHandler()) self.res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, parent, "gamapframe") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, parent, "gamapframe") self.init() self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.panel = self.FindWindowByName("panel") self.set_child_ctrls_as_attrs(self) child = self.gamut_mapping_ciecam02_label font = child.Font font.SetWeight(wx.BOLD) child.Font = font self.gamap_profile = self.FindWindowByName("gamap_profile") self.gamap_profile.changeCallback = self.gamap_profile_handler self.gamap_profile.SetHistory(get_data_path("ref", "\.(icm|icc)$")) self.gamap_profile.SetMaxFontSize(11) self.droptarget = FileDrop(self) self.droptarget.drophandlers = { ".icc": self.drop_handler, ".icm": self.drop_handler } self.gamap_profile.SetDropTarget(self.droptarget) # Bind event handlers self.Bind(wx.EVT_CHECKBOX, self.gamap_perceptual_cb_handler, id=self.gamap_perceptual_cb.GetId()) self.Bind(wx.EVT_CHOICE, self.gamap_perceptual_intent_handler, id=self.gamap_perceptual_intent_ctrl.GetId()) self.Bind(wx.EVT_CHECKBOX, self.gamap_saturation_cb_handler, id=self.gamap_saturation_cb.GetId()) self.Bind(wx.EVT_CHOICE, self.gamap_saturation_intent_handler, id=self.gamap_saturation_intent_ctrl.GetId()) self.Bind(wx.EVT_CHOICE, self.gamap_src_viewcond_handler, id=self.gamap_src_viewcond_ctrl.GetId()) self.Bind(wx.EVT_CHOICE, self.gamap_out_viewcond_handler, id=self.gamap_out_viewcond_ctrl.GetId()) self.Bind(wx.EVT_CHOICE, self.gamap_default_intent_handler, id=self.gamap_default_intent_ctrl.GetId()) self.Bind(wx.EVT_CHECKBOX, self.profile_quality_b2a_ctrl_handler, id=self.low_quality_b2a_cb.GetId()) self.Bind(wx.EVT_CHECKBOX, self.profile_quality_b2a_ctrl_handler, id=self.b2a_hires_cb.GetId()) for v in config.valid_values["profile.b2a.hires.size"]: if v > -1: v = "%sx%sx%s" % ((v, ) * 3) else: v = lang.getstr("auto") self.b2a_size_ctrl.Append(v) self.Bind(wx.EVT_CHOICE, self.b2a_size_ctrl_handler, id=self.b2a_size_ctrl.GetId()) self.Bind(wx.EVT_CHECKBOX, self.profile_quality_b2a_ctrl_handler, id=self.b2a_smooth_cb.GetId()) self.viewconds_ab = OrderedDict() self.viewconds_ba = {} self.viewconds_out_ab = OrderedDict() self.intents_ab = OrderedDict() self.intents_ba = OrderedDict() self.default_intent_ab = {} self.default_intent_ba = {} for i, ri in enumerate(config.valid_values["gamap_default_intent"]): self.default_intent_ab[i] = ri self.default_intent_ba[ri] = i self.setup_language() self.update_controls() self.update_layout() def OnClose(self, event): self.Hide() def b2a_size_ctrl_handler(self, event): v = config.valid_values["profile.b2a.hires.size"][self.b2a_size_ctrl.GetSelection()] if v != getcfg("profile.b2a.hires.size") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("profile.b2a.hires.size", v) def drop_handler(self, path): self.gamap_profile.SetPath(path) self.gamap_profile_handler() def gamap_profile_handler(self, event=None): v = self.gamap_profile.GetPath() p = bool(v) and os.path.exists(v) if p: try: profile = ICCP.ICCProfile(v) except (IOError, ICCP.ICCProfileInvalidError), exception: p = False InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + v, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.gamap_profile.SetPath("") v = None else: if event: # pre-select suitable viewing condition if profile.profileClass == "prtr": self.gamap_src_viewcond_ctrl.SetStringSelection( lang.getstr("gamap.viewconds.pp")) else: self.gamap_src_viewcond_ctrl.SetStringSelection( lang.getstr("gamap.viewconds.mt")) self.gamap_src_viewcond_handler() enable_gamap = getcfg("profile.type") in ("l", "x", "X") self.gamap_perceptual_cb.Enable(enable_gamap) self.gamap_perceptual_intent_ctrl.Enable(self.gamap_perceptual_cb.GetValue()) self.gamap_saturation_cb.Enable(enable_gamap) self.gamap_saturation_intent_ctrl.Enable(self.gamap_saturation_cb.GetValue()) c = self.gamap_perceptual_cb.GetValue() or \ self.gamap_saturation_cb.GetValue() self.gamap_profile.Enable(c) self.gamap_src_viewcond_ctrl.Enable(p and c) self.gamap_out_viewcond_ctrl.Enable(p and c) if not ((p and c) or getcfg("profile.b2a.hires")): setcfg("gamap_default_intent", "p") self.gamap_default_intent_ctrl.SetSelection(self.default_intent_ba[getcfg("gamap_default_intent")]) self.gamap_default_intent_ctrl.Enable((p and c) or (getcfg("profile.b2a.hires") and enable_gamap)) if v != getcfg("gamap_profile") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_profile", v or None) def gamap_perceptual_cb_handler(self, event=None): v = self.gamap_perceptual_cb.GetValue() if not v: self.gamap_saturation_cb.SetValue(False) self.gamap_saturation_cb_handler() if int(v) != getcfg("gamap_perceptual") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_perceptual", int(v)) self.gamap_profile_handler() def gamap_perceptual_intent_handler(self, event=None): v = self.intents_ba[self.gamap_perceptual_intent_ctrl.GetStringSelection()] if v != getcfg("gamap_perceptual_intent") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_perceptual_intent", v) def gamap_saturation_cb_handler(self, event=None): v = self.gamap_saturation_cb.GetValue() if v: self.gamap_perceptual_cb.SetValue(True) self.gamap_perceptual_cb_handler() if int(v) != getcfg("gamap_saturation") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_saturation", int(v)) self.gamap_profile_handler() def gamap_saturation_intent_handler(self, event=None): v = self.intents_ba[self.gamap_saturation_intent_ctrl.GetStringSelection()] if v != getcfg("gamap_saturation_intent") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_saturation_intent", v) def gamap_src_viewcond_handler(self, event=None): v = self.viewconds_ba[self.gamap_src_viewcond_ctrl.GetStringSelection()] if v != getcfg("gamap_src_viewcond") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_src_viewcond", v) def gamap_out_viewcond_handler(self, event=None): v = self.viewconds_ba[self.gamap_out_viewcond_ctrl.GetStringSelection()] if v != getcfg("gamap_out_viewcond") and self.Parent and \ hasattr(self.Parent, "profile_settings_changed"): self.Parent.profile_settings_changed() setcfg("gamap_out_viewcond", v) def gamap_default_intent_handler(self, event=None): v = self.gamap_default_intent_ctrl.GetSelection() if (self.default_intent_ab[v] != getcfg("gamap_default_intent") and self.Parent and hasattr(self.Parent, "profile_settings_changed")): self.Parent.profile_settings_changed() setcfg("gamap_default_intent", self.default_intent_ab[v]) def profile_quality_b2a_ctrl_handler(self, event): if (event.GetId() == self.low_quality_b2a_cb.GetId() and self.low_quality_b2a_cb.GetValue()): self.b2a_hires_cb.Enable(False) else: self.b2a_hires_cb.Enable(getcfg("profile.type") in ("l", "x", "X")) hires = self.b2a_hires_cb.GetValue() self.low_quality_b2a_cb.Enable(not hires) if hires: if event.GetId() == self.b2a_smooth_cb.GetId(): setcfg("profile.b2a.hires.smooth", int(self.b2a_smooth_cb.GetValue())) else: self.b2a_smooth_cb.SetValue(bool(getcfg("profile.b2a.hires.smooth"))) else: self.b2a_smooth_cb.SetValue(False) if self.low_quality_b2a_cb.GetValue(): v = "l" else: v = None if (v != getcfg("profile.quality.b2a") or hires != getcfg("profile.b2a.hires")) and self.Parent: self.Parent.profile_settings_changed() setcfg("profile.quality.b2a", v) setcfg("profile.b2a.hires", int(hires)) self.b2a_size_ctrl.Enable(hires) self.b2a_smooth_cb.Enable(hires) self.gamap_profile_handler() if self.Parent: self.Parent.update_bpc() self.Parent.lut3d_update_b2a_controls() if hasattr(self.Parent, "lut3dframe"): self.Parent.lut3dframe.update_controls() def setup_language(self): """ Substitute translated strings for menus, controls, labels and tooltips. """ BaseFrame.setup_language(self) self.gamap_profile.dialogTitle = lang.getstr("gamap.profile") self.gamap_profile.fileMask = lang.getstr("filetype.icc") + "|*.icc;*.icm" intents = list(config.intents) if (self.Parent and hasattr(self.Parent, "worker") and self.Parent.worker.argyll_version < [1, 3, 3]): intents.remove("pa") if (self.Parent and hasattr(self.Parent, "worker") and self.Parent.worker.argyll_version < [1, 8, 3]): intents.remove("lp") for v in intents: lstr = lang.getstr("gamap.intents.%s" % v) self.intents_ab[v] = lstr self.intents_ba[lstr] = v self.gamap_perceptual_intent_ctrl.SetItems( self.intents_ab.values()) self.gamap_saturation_intent_ctrl.SetItems( self.intents_ab.values()) self.viewconds_ab[None] = lang.getstr("none") self.viewconds_ba[lang.getstr("none")] = None for v in viewconds: if self.Parent and hasattr(self.Parent, "worker") and ( (v == "pc" and self.Parent.worker.argyll_version < [1, 1, 1]) or (v == "tv" and self.Parent.worker.argyll_version < [1, 6, 0])): continue lstr = lang.getstr("gamap.viewconds.%s" % v) self.viewconds_ab[v] = lstr self.viewconds_ba[lstr] = v if v not in ("pp", "pe", "pc", "pcd", "ob", "cx"): self.viewconds_out_ab[v] = lstr self.gamap_src_viewcond_ctrl.SetItems( self.viewconds_ab.values()) self.gamap_out_viewcond_ctrl.SetItems( [lang.getstr("none")] + self.viewconds_out_ab.values()) self.gamap_default_intent_ctrl.SetItems([lang.getstr("gamap.intents." + v) for v in config.valid_values["gamap_default_intent"]]) def update_controls(self): """ Update controls with values from the configuration """ # B2A quality enable_gamap = getcfg("profile.type") in ("l", "x", "X") enable_b2a_extra = getcfg("profile.type") in ("l", "x", "X") b2a_hires = enable_b2a_extra and bool(getcfg("profile.b2a.hires")) self.low_quality_b2a_cb.SetValue(enable_gamap and getcfg("profile.quality.b2a") in ("l", "n") and not b2a_hires) self.low_quality_b2a_cb.Enable(enable_gamap and not b2a_hires) self.b2a_hires_cb.SetValue(b2a_hires) self.b2a_hires_cb.Enable(enable_b2a_extra and not self.low_quality_b2a_cb.GetValue()) self.b2a_size_ctrl.SetSelection( config.valid_values["profile.b2a.hires.size"].index( getcfg("profile.b2a.hires.size"))) self.b2a_size_ctrl.Enable(b2a_hires) self.b2a_smooth_cb.SetValue(b2a_hires and bool(getcfg("profile.b2a.hires.smooth"))) self.b2a_smooth_cb.Enable(b2a_hires) # CIECAM02 self.gamap_profile.SetPath(getcfg("gamap_profile")) self.gamap_perceptual_cb.SetValue(enable_gamap and bool(getcfg("gamap_perceptual"))) self.gamap_perceptual_intent_ctrl.SetStringSelection( self.intents_ab.get(getcfg("gamap_perceptual_intent"), self.intents_ab.get(defaults["gamap_perceptual_intent"]))) self.gamap_saturation_cb.SetValue(enable_gamap and bool(getcfg("gamap_saturation"))) self.gamap_saturation_intent_ctrl.SetStringSelection( self.intents_ab.get(getcfg("gamap_saturation_intent"), self.intents_ab.get(defaults["gamap_saturation_intent"]))) self.gamap_src_viewcond_ctrl.SetStringSelection( self.viewconds_ab.get(getcfg("gamap_src_viewcond", False), self.viewconds_ab.get(defaults.get("gamap_src_viewcond")))) self.gamap_out_viewcond_ctrl.SetStringSelection( self.viewconds_ab.get(getcfg("gamap_out_viewcond"), self.viewconds_ab.get(defaults.get("gamap_out_viewcond")))) self.gamap_profile_handler() class MainFrame(ReportFrame, BaseFrame): """ Display calibrator main application window. """ # Shared methods from 3D LUT UI for lut3d_ivar_name, lut3d_ivar in LUT3DFrame.__dict__.iteritems(): if lut3d_ivar_name.startswith("lut3d_"): locals()[lut3d_ivar_name] = lut3d_ivar # XYZbpout will be set to the blackpoint of the selected profile. This is # used to determine if 3D LUT or measurement report black output offset # controls should be shown. Set a initial value slightly above zero so # output offset controls are shown if the selected profile doesn't exist # and "Create 3D LUT after profiling" is disabled. XYZbpout = [0.001, 0.001, 0.001] def __init__(self, worker): # Check for required resource files and get pre-canned testcharts self.dist_testcharts = [] self.dist_testchart_names = [] missing = [] for filename in resfiles: path, ext = (get_data_path(os.path.sep.join(filename.split("/"))), os.path.splitext(filename)[1]) if (not path or not os.path.isfile(path)): missing.append(filename) elif ext.lower() == ".ti1": self.dist_testcharts.append(path) self.dist_testchart_names.append(os.path.basename(path)) if missing: wx.CallAfter(show_result_dialog, lang.getstr("resources.notfound.warning") + "\n" + safe_unicode("\n".join(missing)), self) # Initialize GUI self.res = TempXmlResource(get_data_path(os.path.join("xrc", "main.xrc"))) self.res.InsertHandler(xh_fancytext.StaticFancyTextCtrlXmlHandler()) self.res.InsertHandler(xh_floatspin.FloatSpinCtrlXmlHandler()) self.res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, None, "mainframe") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, None, "mainframe") self.init() self.worker = worker self.worker.owner = self result = self.worker.create_tempdir() if isinstance(result, Exception): safe_print(result) self.init_frame() self.init_defaults() self.set_child_ctrls_as_attrs(self) self.init_infoframe() if sys.platform in ("darwin", "win32") or isexe: self.init_measureframe() self.init_menus() self.init_controls() self.show_advanced_options_handler() self.setup_language() self.update_displays(update_ccmx_items=False) self.update_comports() self.update_controls(update_ccmx_items=False) self.set_size(True, True) self.calpanel.SetScrollRate(2, 2) x, y = getcfg("position.x", False), getcfg("position.y", False) if not None in (x, y): self.SetSaneGeometry(x, y) else: self.Center() self.Bind(wx.EVT_MOVE, self.OnMove, self) if verbose >= 1: safe_print(lang.getstr("success")) # Check for and load default calibration if len(self.worker.displays): if getcfg("calibration.file", False): # Load LUT curves from last used .cal file self.load_cal(silent=True) else: # Load LUT curves from current display profile (if any, and # if it contains curves) self.load_display_profile_cal(None) self.init_timers() if verbose >= 1: safe_print(lang.getstr("ready")) def log(self): """ Append log buffer contents to the log window. """ # We do this after all initialization because the log.log() function # expects the window to be fully created and accessible via # wx.GetApp().frame.infoframe if not hasattr(self, "logoffset"): # Skip the very first line, which is just '=' * 80 self.logoffset = 1 else: self.logoffset = 0 logbuffer.seek(0) msg = "".join([line.decode("UTF-8", "replace") for line in logbuffer][self.logoffset:]).rstrip() logbuffer.truncate(0) if msg: self.infoframe.Log(msg) def init_defaults(self): """ Initialize GUI-specific defaults. """ defaults.update({ "position.info.x": self.GetDisplay().ClientArea[0] + 30, "position.info.y": self.GetDisplay().ClientArea[1] + 30, "position.lut_viewer.x": self.GetDisplay().ClientArea[0] + 40, "position.lut_viewer.y": self.GetDisplay().ClientArea[1] + 40, "position.progress.x": self.GetDisplay().ClientArea[0] + 30, "position.progress.y": self.GetDisplay().ClientArea[1] + 30, "position.x": self.GetDisplay().ClientArea[0] + 20, "position.y": self.GetDisplay().ClientArea[1] + 20 }) self.recent_cals = getcfg("recent_cals").split(os.pathsep) while "" in self.recent_cals: self.recent_cals.remove("") self.recent_cals.insert(0, "") self.presets = [] presets = get_data_path("presets", ".*\.(?:icc|icm)$") if isinstance(presets, list): self.presets = natsort(presets) self.presets.reverse() for preset in self.presets: if preset in self.recent_cals: self.recent_cals.remove(preset) self.recent_cals.insert(1, preset) self.static_labels = [] self.updatingctrls = False # Left side - internal enumeration, right side - commmandline self.whitepoint_colortemp_loci_ab = { 0: "t", 1: "T" } # Left side - commmandline, right side - internal enumeration self.whitepoint_colortemp_loci_ba = { "t": 0, "T": 1 } # Left side - commmandline, right side - internal enumeration self.quality_ab = { 1: "v", 2: "l", 3: "m", 4: "h", 5: "u" } self.quality_b2a_ab = { 0: "n", 1: "l", 2: "m", 3: "h", 4: "u" } # Left side - commmandline, right side - internal enumeration self.quality_ba = swap_dict_keys_values(self.quality_ab) self.testchart_defaults = config.testchart_defaults self.testcharts = [] self.testchart_names = [] # Left side - commmandline, right side - .cal file self.trc_ab = { "l": "L_STAR", "709": "REC709", "s": "sRGB", "240": "SMPTE240M" } # Left side - .cal file, right side - commmandline self.trc_ba = swap_dict_keys_values(self.trc_ab) # Left side - internal enumeration, right side - commmandline self.trc_types_ab = { 0: "g", 1: "G" } # Left side - commmandline, right side - internal enumeration self.trc_types_ba = swap_dict_keys_values(self.trc_types_ab) self.trc_presets = [ "1.8", "2.0", "2.2", "2.4" ] self.whitepoint_presets = [ "5000", "5500", "6000", "6500" ] def init_frame(self): """ Initialize the main window and its event handlers. Controls are initialized in a separate step (see init_controls). """ # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title safe_print("") title = "%s %s" % (appname, version_short) if VERSION > VERSION_BASE: title += " Beta" self.SetTitle(title) self.SetMaxSize((-1, -1)) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.Bind(wx.EVT_SIZE, self.OnResize, self) self.Bind(wx.EVT_DISPLAY_CHANGED, self.check_update_controls) self.droptarget = FileDrop(self) self.droptarget.drophandlers = { ".7z": self.cal_drop_handler, ".cal": self.cal_drop_handler, ".ccmx": self.ccxx_drop_handler, ".ccss": self.ccxx_drop_handler, ".icc": self.cal_drop_handler, ".icm": self.cal_drop_handler, ".tar.gz": self.cal_drop_handler, ".ti1": self.ti1_drop_handler, ".ti3": self.ti3_drop_handler, ".tgz": self.cal_drop_handler, ".zip": self.cal_drop_handler } # Main panel self.panel = self.FindWindowByName("panel") self.panel.SetDropTarget(self.droptarget) # Header # Its width also determines the initial min width of the main window # after SetSizeHints and Layout self.headerbordertop = self.FindWindowByName("headerbordertop") self.header = get_header(self.panel) self.headerpanel = self.FindWindowByName("headerpanel") self.headerpanel.ContainingSizer.Insert(1, self.header, flag=wx.EXPAND) y = 64 w = 80 h = 120 scale = max(getcfg("app.dpi") / config.get_default_dpi(), 1) if scale > 1: y, w, h = [int(math.floor(v * scale)) for v in (y, w, h)] self.header_btm = BitmapBackgroundPanel(self.headerpanel, size=(w, -1)) self.header_btm.BackgroundColour = "#0e59a9" self.header_btm.scalebitmap = False, False header_bmp = getbitmap("theme/header", False) if header_bmp.Size[0] >= w and header_bmp.Size[1] >= h + y: header_bmp = header_bmp.GetSubBitmap((0, y, w, h)) self.header_btm.SetBitmap(header_bmp) self.headerpanel.Sizer.Insert(0, self.header_btm, flag=wx.ALIGN_TOP | wx.EXPAND) #separator = BitmapBackgroundPanel(self.panel, size=(-1, 1)) #separator.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW)) #self.panel.Sizer.Insert(2, separator, flag=wx.EXPAND) # Calibration settings panel self.calpanel = self.FindWindowByName("calpanel") self.display_instrument_panel = self.FindWindowByName("display_instrument_panel") self.calibration_settings_panel = self.FindWindowByName("calibration_settings_panel") self.profile_settings_panel = self.FindWindowByName("profile_settings_panel") self.lut3d_settings_panel = self.FindWindowByName("lut3d_settings_panel") # Verification / measurement report res = TempXmlResource(get_data_path(os.path.join("xrc", "report.xrc"))) res.InsertHandler(xh_fancytext.StaticFancyTextCtrlXmlHandler()) res.InsertHandler(xh_filebrowsebutton.FileBrowseButtonWithHistoryXmlHandler()) res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) res.InsertHandler(xh_bitmapctrls.BitmapButton()) res.InsertHandler(xh_bitmapctrls.StaticBitmap()) self.mr_settings_panel = res.LoadPanel(self.calpanel, "panel") self.calpanel.Sizer.Add(self.mr_settings_panel, 1, flag=wx.EXPAND) # Make info panels use theme color for panel_name in ["display_instrument_info_panel", "calibration_settings_info_panel", "profile_settings_info_panel", "lut3d_settings_info_panel", "mr_settings_info_panel"]: panel = self.FindWindowByName(panel_name) panel.BackgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW) # Button panel self.buttonpanel = self.FindWindowByName("buttonpanel") sizer = self.buttonpanel.ContainingSizer if hasattr(sizer, "GetItemIndex"): # wxPython 2.8.12+ ##separator = BitmapBackgroundPanel(self.panel, size=(-1, 1)) ##separator.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT)) ##sizer.Insert(sizer.GetItemIndex(self.buttonpanel), separator, ##flag=wx.EXPAND) self.buttonpanelheader = BitmapBackgroundPanel(self.panel, size=(-1, 15 * scale)) ##bmp = getbitmap("theme/gradient", False) bmp = getbitmap("theme/shadow-bordertop", False) ##if bmp.Size[0] >= 8 and bmp.Size[1] >= 96: ##bmp = bmp.GetSubBitmap((0, 1, 8, 15)).ConvertToImage().Mirror(False).ConvertToBitmap() ##image = bmp.ConvertToImage() ##databuffer = image.GetDataBuffer() ##for i, byte in enumerate(databuffer): ##if byte > "\0": ##databuffer[i] = chr(int(min(round(ord(byte) * ##(255.0 / 223.0)), 255))) ##bmp = image.ConvertToBitmap() self.buttonpanelheader.SetBitmap(bmp) sizer.Insert(sizer.GetItemIndex(self.buttonpanel), self.buttonpanelheader, flag=wx.EXPAND) ##bgcolor = self.buttonpanel.BackgroundColour ##self.buttonpanel.SetBackgroundColour(wx.Colour(*[int(v * .93) ##for v in bgcolor[:3]])) self.buttonpanel.SetBackgroundColour(self.buttonpanel.BackgroundColour) self.buttonpanelheader.SetBackgroundColour(self.buttonpanel.BackgroundColour) self.buttonpanelheader.blend = True # Tab panel self.tabpanel = self.FindWindowByName("tabpanel") sizer = self.tabpanel.ContainingSizer if hasattr(sizer, "GetItemIndex"): # wxPython 2.8.12+ ##separator = BitmapBackgroundPanel(self.panel, size=(-1, 1)) ##separator.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW)) ##sizer.Insert(sizer.GetItemIndex(self.tabpanel) + 1, separator, ##flag=wx.EXPAND) ##self.tabpanelheader = BitmapBackgroundPanel(self.panel, ##size=(-1, 15)) self.tabpanelheader = BitmapBackgroundPanel(self.panel, size=(-1, 14)) ##self.tabpanelfooter = BitmapBackgroundPanel(self.panel, ##size=(-1, 15)) ##bmp = getbitmap("theme/gradient", False) ##if bmp.Size[0] >= 8 and bmp.Size[1] >= 96: ##sub = bmp.GetSubBitmap((0, 1, 8, 15)).ConvertToImage() ##bmp = sub.Mirror(False).ConvertToBitmap() ##image2 = bmp.ConvertToImage() ##databuffer = image2.GetDataBuffer() ##for i, byte in enumerate(databuffer): ##if byte > "\0": ##databuffer[i] = chr(int(min(round((ord(byte) - 153) * ##(255.0 / 70.0)), 255))) ##bmp = image2.ConvertToBitmap() ##self.tabpanelheader.SetBitmap(bmp) ##bmp = image.Mirror(False).ConvertToBitmap() ##self.tabpanelfooter.SetBitmap(bmp) sizer.Insert(sizer.GetItemIndex(self.tabpanel), self.tabpanelheader, flag=wx.EXPAND) ##sizer.Insert(sizer.GetItemIndex(self.tabpanel) + 1, ##self.tabpanelfooter, flag=wx.EXPAND) self.tabpanel.BackgroundColour = "#202020" self.tabpanel.ForegroundColour = "#EEEEEE" self.tabpanelheader.SetBackgroundColour(self.tabpanel.BackgroundColour) self.tabpanelheader.blend = True ##self.tabpanelfooter.SetBackgroundColour(self.tabpanel.BackgroundColour) ##self.tabpanelfooter.blend = True # Add tab buttons self.display_instrument_btn = TabButton(self.tabpanel, -1, label="display-instrument", bmp=geticon(32, "display-instrument"), style=platebtn.PB_STYLE_TOGGLE) self.display_instrument_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert(1, self.display_instrument_btn, flag=wx.LEFT, border=16) self.calibration_settings_btn = TabButton(self.tabpanel, -1, label="calibration", bmp=geticon(32, "calibration"), style=platebtn.PB_STYLE_TOGGLE) self.calibration_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert(2, self.calibration_settings_btn, flag=wx.LEFT, border=32) self.profile_settings_btn = TabButton(self.tabpanel, -1, label="profiling", bmp=geticon(32, "profiling"), style=platebtn.PB_STYLE_TOGGLE) self.profile_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert(3, self.profile_settings_btn, flag=wx.LEFT, border=32) self.lut3d_settings_btn = TabButton(self.tabpanel, -1, label="3dlut", bmp=geticon(32, "3dlut"), style=platebtn.PB_STYLE_TOGGLE) self.lut3d_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert(4, self.lut3d_settings_btn, flag=wx.LEFT | wx.RIGHT, border=32) self.mr_settings_btn = TabButton(self.tabpanel, -1, label="verification", bmp=geticon(32, "dialog-ok"), style=platebtn.PB_STYLE_TOGGLE) self.mr_settings_btn.Bind(wx.EVT_TOGGLEBUTTON, self.tab_select_handler) self.tabpanel.Sizer.Insert(5, self.mr_settings_btn, flag=wx.RIGHT, border=16) for btn in (self.display_instrument_btn, self.calibration_settings_btn, self.profile_settings_btn, self.lut3d_settings_btn, self.mr_settings_btn): set_bitmap_labels(btn, True, False, False) btn.SetPressColor(wx.Colour(0x66, 0x66, 0x66)) btn.SetLabelColor(self.tabpanel.ForegroundColour, wx.WHITE) self.tab_select_handler(self.display_instrument_btn) self.profile_info = {} self.measureframes = [] def init_timers(self): """ Setup the timers for display/instrument detection and profile name. """ self.update_profile_name_timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.update_profile_name, self.update_profile_name_timer) def OnMove(self, event=None): # When moving, check if we are on another screen and resize if needed. if self.IsShownOnScreen() and not self.IsMaximized() and not \ self.IsIconized(): x, y = self.GetScreenPosition() setcfg("position.x", x) setcfg("position.y", y) display_client_rect = self.GetDisplay().ClientArea if (not hasattr(self, "display_client_rect") or self.display_client_rect != display_client_rect): # We just moved to this workspace if sys.platform not in ("darwin", "win32"): # Linux safety_margin = 40 else: safety_margin = 20 resize = False if (self.Size[0] > display_client_rect[2] or self.Size[1] > display_client_rect[3] - safety_margin): # Our size is too large for that workspace, adjust resize = True elif (self.Size[0] < (self.Size[0] - self.calpanel.Size[0] + self.calpanel.VirtualSize[0]) or self.Size[1] < (self.Size[1] - self.calpanel.Size[1] + self.calpanel.VirtualSize[1])): # Our full size fits on that workspace resize = True self.display_client_rect = display_client_rect if resize: wx.CallAfter(self.set_size, True) if event: event.Skip() def OnResize(self, event): # Hide the header bitmap on small screens scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 self.header.GetContainingSizer().Show( self.header, self.Size[1] > 480 * scale) if not hasattr(self, "header_btm_bmp"): self.header_btm_bmp = self.header_btm.GetBitmap() self.header_btm_min_bmp = getbitmap("theme/header_minimal", False) if self.Size[1] > 480 * scale: if self.header_btm.GetBitmap() is not self.header_btm_bmp: self.header_btm.SetBitmap(self.header_btm_bmp) elif self.header_btm.GetBitmap() is not self.header_btm_min_bmp: self.header_btm.SetBitmap(self.header_btm_min_bmp) event.Skip() def cal_drop_handler(self, path): """ Drag'n'drop handler for .cal files. Settings and calibration are loaded from dropped files. """ if not self.worker.is_working(): self.load_cal_handler(None, path) def ccxx_drop_handler(self, path): """ Drag'n'drop handler for .ccmx/.ccss files. """ if not self.worker.is_working(): self.colorimeter_correction_matrix_ctrl_handler(None, path) def ti1_drop_handler(self, path): """ Drag'n'drop handler for .ti1 files. Dropped files are added to the testchart chooser and selected. """ if not self.worker.is_working(): self.testchart_btn_handler(None, path) def ti3_drop_handler(self, path): """ Drag'n'drop handler for .ti3 files. Dropped files are used to create an ICC profile. """ if not self.worker.is_working(): self.create_profile_handler(None, path) def init_gamapframe(self): """ Create & initialize the gamut mapping options window and its controls. """ self.gamapframe = GamapFrame(self) def init_infoframe(self, show=None): """ Create & initialize the info (log) window and its controls. """ self.infoframe = LogWindow(self) self.infoframe.Bind(wx.EVT_CLOSE, self.infoframe_close_handler, self.infoframe) self.infoframe.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) if show: self.infoframe_toggle_handler(show=show) def init_lut3dframe(self): """ Create & initialize the 3D LUT creation window and its controls. """ self.lut3dframe = LUT3DFrame(self) def init_reportframe(self): """ Create & initialize the measurement report creation window and its controls. """ self.reportframe = ReportFrame(self) self.reportframe.measurement_report_btn.Bind(wx.EVT_BUTTON, self.measurement_report_handler) def init_synthiccframe(self): """ Create & initialize the 3D LUT creation window and its controls. """ self.synthiccframe = SynthICCFrame(self) def infoframe_close_handler(self, event): self.infoframe_toggle_handler(event) def setup_language(self): """ Substitute translated strings for menus, controls, labels and tooltips. """ # Set language specific defaults lang.update_defaults() # Translate controls and labels BaseFrame.setup_language(self) settings = [lang.getstr("settings.new")] for cal in self.recent_cals[1:]: lstr = lang.getstr(os.path.basename(cal)) if cal == getcfg("calibration.file", False) and getcfg("settings.changed"): lstr = "* " + lstr settings.append(lstr) self.calibration_file_ctrl.SetItems(settings) self.setup_observer_ctrl() self.whitepoint_ctrl.SetItems([lang.getstr("as_measured"), lang.getstr("whitepoint.colortemp"), lang.getstr("whitepoint.xy")]) self.whitepoint_colortemp_loci = [ lang.getstr("whitepoint.colortemp.locus.daylight"), lang.getstr("whitepoint.colortemp.locus.blackbody") ] self.whitepoint_colortemp_locus_ctrl.SetItems( self.whitepoint_colortemp_loci) self.luminance_ctrl.SetItems([lang.getstr("as_measured"), lang.getstr("custom")]) self.black_luminance_ctrl.SetItems([lang.getstr("as_measured"), lang.getstr("custom")]) self.trc_ctrl.SetItems([lang.getstr("as_measured"), "Gamma 2.2", lang.getstr("trc.lstar"), lang.getstr("trc.rec709"), lang.getstr("trc.rec1886"), lang.getstr("trc.smpte240m"), lang.getstr("trc.srgb"), lang.getstr("custom")]) self.trc_types = [ lang.getstr("trc.type.relative"), lang.getstr("trc.type.absolute") ] self.trc_type_ctrl.SetItems(self.trc_types) self.update_profile_type_ctrl_items() self.default_testchart_names = [] for testcharts in self.testchart_defaults.values(): for chart in testcharts.values(): chart = lang.getstr(chart) if not chart in self.default_testchart_names: self.default_testchart_names.append(chart) items = [lang.getstr("testchart." + v) for v in config.valid_values["testchart.patch_sequence"]] self.testchart_patch_sequence_ctrl.Items = items self.lut3d_setup_language() self.mr_setup_language() def set_size(self, set_height=False, fit_width=False): if not self.IsFrozen(): self.Freeze() self.SetMinSize((0, 0)) if set_height: if sys.platform not in ("darwin", "win32"): # Linux safety_margin = 40 else: safety_margin = 20 borders_tb = self.Size[1] - self.ClientSize[1] height = min(self.GetDisplay().ClientArea[3] - borders_tb - safety_margin, self.headerbordertop.Size[1] + self.header.Size[1] + self.headerpanel.Sizer.MinSize[1] + 1 + ((getattr(self, "tabpanelheader", None) and self.tabpanelheader.Size[1] + 1) or 0) + self.tabpanel.Sizer.MinSize[1] + ((getattr(self, "tabpanelfooter", None) and self.tabpanelfooter.Size[1] + 1) or 0) + self.display_instrument_panel.Sizer.MinSize[1] + ((getattr(self, "buttonpanelheader", None) and self.buttonpanelheader.Size[1] + 1) or 0) + self.buttonpanel.Sizer.MinSize[1]) else: height = self.ClientSize[1] borders_lr = self.Size[0] - self.ClientSize[0] scale = getcfg("app.dpi") / config.get_default_dpi() margin = 34 header_min_h = 64 if scale > 1: margin = int(round(margin * scale)) header_min_h = int(round(header_min_h * scale)) size = (min(self.GetDisplay().ClientArea[2], max(self.GetMinSize()[0], max(self.display_instrument_panel.Sizer.MinSize[0], self.calibration_settings_panel.Sizer.MinSize[0], self.profile_settings_panel.Sizer.MinSize[0], self.lut3d_settings_panel.Sizer.MinSize[0], self.mr_settings_panel.Sizer.MinSize[0]) + margin, self.tabpanel.GetSizer().GetMinSize()[0])), height) self.SetMaxSize((-1, -1)) if not self.IsMaximized() and not self.IsIconized(): self.SetClientSize(((size[0] if fit_width else max(size[0], self.Size[0])) - borders_lr, size[1])) self.SetMinSize((size[0], self.GetSize()[1] - self.calpanel.GetSize()[1] + header_min_h)) if self.IsFrozen(): self.Thaw() if self.IsShown(): self.calpanel.Layout() def update_profile_type_ctrl(self): self.profile_type_ctrl.SetSelection( self.profile_types_ba.get(getcfg("profile.type"), self.profile_types_ba.get(defaults["profile.type"], 0))) def update_profile_type_ctrl_items(self): """ Populate the profile type control with available choices depending on Argyll version. """ self.profile_types = [ lang.getstr("profile.type.lut.lab"), lang.getstr("profile.type.shaper_matrix"), lang.getstr("profile.type.single_shaper_matrix"), lang.getstr("profile.type.gamma_matrix"), lang.getstr("profile.type.single_gamma_matrix") ] self.profile_types_ab = {} profile_types_index = 0 if self.worker.argyll_version[0:3] > [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string and not "RC1" in self.worker.argyll_version_string and not "RC2" in self.worker.argyll_version_string and not "RC3" in self.worker.argyll_version_string): # Argyll 1.1.0_RC3 had a bug when using -aX # which was fixed in 1.1.0_RC4 self.profile_types.insert(profile_types_index, lang.getstr("profile.type.lut_matrix.xyz")) self.profile_types_ab[profile_types_index] = "X" # XYZ LUT + accurate matrix profile_types_index += 1 if self.worker.argyll_version[0:3] > [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string and not "RC1" in self.worker.argyll_version_string and not "RC2" in self.worker.argyll_version_string): # Windows wants matrix tags in XYZ LUT profiles, # which is satisfied with Argyll >= 1.1.0_RC3 self.profile_types.insert(profile_types_index, lang.getstr("profile.type.lut_rg_swapped_matrix.xyz")) self.profile_types_ab[profile_types_index] = "x" # XYZ LUT + dummy matrix (R <-> G swapped) profile_types_index += 1 elif sys.platform != "win32": self.profile_types.insert(profile_types_index, lang.getstr("profile.type.lut.xyz")) self.profile_types_ab[profile_types_index] = "x" # XYZ LUT profile_types_index += 1 self.profile_type_ctrl.SetItems(self.profile_types) self.profile_types_ab[profile_types_index] = "l" self.profile_types_ab[profile_types_index + 1] = "s" self.profile_types_ab[profile_types_index + 2] = "S" self.profile_types_ab[profile_types_index + 3] = "g" self.profile_types_ab[profile_types_index + 4] = "G" self.profile_types_ba = swap_dict_keys_values(self.profile_types_ab) def init_measureframe(self): """ Create & initialize the measurement window and its controls. """ self.measureframe = MeasureFrame(self, -1) def init_menus(self): """ Initialize the menus and menuitem event handlers. """ res = TempXmlResource(get_data_path(os.path.join("xrc", "mainmenu.xrc"))) self.menubar = res.LoadMenuBar("menu") file_ = self.menubar.GetMenu(self.menubar.FindMenu("menu.file")) menuitem = file_.FindItemById(file_.FindItem("calibration.load")) self.Bind(wx.EVT_MENU, self.load_cal_handler, menuitem) menuitem = file_.FindItemById(file_.FindItem("testchart.set")) self.Bind(wx.EVT_MENU, self.testchart_btn_handler, menuitem) self.menuitem_testchart_edit = file_.FindItemById(file_.FindItem("testchart.edit")) self.Bind(wx.EVT_MENU, self.create_testchart_btn_handler, self.menuitem_testchart_edit) menuitem = file_.FindItemById(file_.FindItem("profile.set_save_path")) self.Bind(wx.EVT_MENU, self.profile_save_path_btn_handler, menuitem) self.menuitem_profile_info = file_.FindItemById(file_.FindItem("profile.info")) self.Bind(wx.EVT_MENU, self.profile_info_handler, self.menuitem_profile_info) self.menuitem_create_profile = file_.FindItemById( file_.FindItem("create_profile")) self.Bind(wx.EVT_MENU, self.create_profile_handler, self.menuitem_create_profile) self.menuitem_create_profile_from_edid = file_.FindItemById( file_.FindItem("create_profile_from_edid")) self.Bind(wx.EVT_MENU, self.create_profile_from_edid, self.menuitem_create_profile_from_edid) self.menuitem_install_display_profile = file_.FindItemById( file_.FindItem("install_display_profile")) self.Bind(wx.EVT_MENU, self.select_install_profile_handler, self.menuitem_install_display_profile) self.menuitem_profile_share = file_.FindItemById( file_.FindItem("profile.share")) self.Bind(wx.EVT_MENU, self.profile_share_handler, self.menuitem_profile_share) if sys.platform != "darwin" or wx.VERSION >= (2, 9): file_.AppendSeparator() self.menuitem_prefs = file_.Append( -1 if wx.VERSION < (2, 9) or sys.platform != "darwin" else wx.ID_PREFERENCES, "&" + "menuitem.set_argyll_bin") self.Bind(wx.EVT_MENU, self.set_argyll_bin_handler, self.menuitem_prefs) if sys.platform != "darwin" or wx.VERSION >= (2, 9): file_.AppendSeparator() self.menuitem_quit = file_.Append( -1 if wx.VERSION < (2, 9) else wx.ID_EXIT, "&menuitem.quit\tCtrl+Q") self.Bind(wx.EVT_MENU, self.OnClose, self.menuitem_quit) options = self.menubar.GetMenu(self.menubar.FindMenu("menu.options")) self.menuitem_advanced_options = options.FindItemById(options.FindItem("advanced")) options_advanced = self.menuitem_advanced_options.SubMenu self.menu_advanced_options = options_advanced self.menuitem_skip_legacy_serial_ports = options_advanced.FindItemById( options_advanced.FindItem("skip_legacy_serial_ports")) self.Bind(wx.EVT_MENU, self.skip_legacy_serial_ports_handler, self.menuitem_skip_legacy_serial_ports) self.menuitem_use_separate_lut_access = options_advanced.FindItemById( options_advanced.FindItem("use_separate_lut_access")) if sys.platform not in ("darwin", "win32") or test: self.Bind(wx.EVT_MENU, self.use_separate_lut_access_handler, self.menuitem_use_separate_lut_access) else: options_advanced.RemoveItem(self.menuitem_use_separate_lut_access) self.menuitem_do_not_use_video_lut = options_advanced.FindItemById( options_advanced.FindItem("calibration.do_not_use_video_lut")) self.Bind(wx.EVT_MENU, self.do_not_use_video_lut_handler, self.menuitem_do_not_use_video_lut) self.menuitem_allow_skip_sensor_cal = options_advanced.FindItemById( options_advanced.FindItem("allow_skip_sensor_cal")) self.Bind(wx.EVT_MENU, self.allow_skip_sensor_cal_handler, self.menuitem_allow_skip_sensor_cal) self.menuitem_show_advanced_options = options.FindItemById( options.FindItem("show_advanced_options")) self.Bind(wx.EVT_MENU, self.show_advanced_options_handler, self.menuitem_show_advanced_options) self.menuitem_enable_3dlut_tab = options.FindItemById( options.FindItem("3dlut.tab.enable")) self.Bind(wx.EVT_MENU, self.enable_3dlut_tab_handler, self.menuitem_enable_3dlut_tab) menuitem = options_advanced.FindItemById(options_advanced.FindItem("extra_args")) self.Bind(wx.EVT_MENU, self.extra_args_handler, menuitem) self.menuitem_enable_argyll_debug = options_advanced.FindItemById( options_advanced.FindItem("enable_argyll_debug")) self.Bind(wx.EVT_MENU, self.enable_argyll_debug_handler, self.menuitem_enable_argyll_debug) self.menuitem_enable_dry_run = options_advanced.FindItemById( options_advanced.FindItem("dry_run")) self.Bind(wx.EVT_MENU, self.enable_dry_run_handler, self.menuitem_enable_dry_run) self.menuitem_startup_sound = options.FindItemById( options.FindItem("startup_sound.enable")) self.Bind(wx.EVT_MENU, self.startup_sound_enable_handler, self.menuitem_startup_sound) self.menuitem_use_fancy_progress = options.FindItemById( options.FindItem("use_fancy_progress")) self.Bind(wx.EVT_MENU, self.use_fancy_progress_handler, self.menuitem_use_fancy_progress) menuitem = options.FindItemById(options.FindItem("restore_defaults")) self.Bind(wx.EVT_MENU, self.restore_defaults_handler, menuitem) tools = self.menubar.GetMenu(self.menubar.FindMenu("menu.tools")) tools_vcgt = tools.FindItemById(tools.FindItem("video_card_gamma_table")).SubMenu tools_reports = tools.FindItemById(tools.FindItem("report")).SubMenu tools_advanced = tools.FindItemById(tools.FindItem("advanced")).SubMenu tools_instrument = tools.FindItemById(tools.FindItem("instrument")).SubMenu tools_ccxx = tools.FindItemById(tools.FindItem("colorimeter_correction_matrix_file")).SubMenu self.menuitem_load_lut_from_cal_or_profile = tools_vcgt.FindItemById( tools_vcgt.FindItem("calibration.load_from_cal_or_profile")) self.Bind(wx.EVT_MENU, self.load_profile_cal_handler, self.menuitem_load_lut_from_cal_or_profile) self.menuitem_load_lut_from_display_profile = tools_vcgt.FindItemById( tools_vcgt.FindItem("calibration.load_from_display_profile")) self.Bind(wx.EVT_MENU, self.load_display_profile_cal, self.menuitem_load_lut_from_display_profile) self.menuitem_lut_reset = tools_vcgt.FindItemById( tools_vcgt.FindItem("calibration.reset")) self.Bind(wx.EVT_MENU, self.reset_cal, self.menuitem_lut_reset) self.menuitem_measurement_report = tools_reports.FindItemById( tools_reports.FindItem("measurement_report")) self.Bind(wx.EVT_MENU, self.measurement_report_handler, self.menuitem_measurement_report) self.menuitem_report_uncalibrated = tools_reports.FindItemById( tools_reports.FindItem("report.uncalibrated")) self.Bind(wx.EVT_MENU, self.report_uncalibrated_handler, self.menuitem_report_uncalibrated) self.menuitem_report_calibrated = tools_reports.FindItemById( tools_reports.FindItem("report.calibrated")) self.Bind(wx.EVT_MENU, self.report_calibrated_handler, self.menuitem_report_calibrated) self.menuitem_calibration_verify = tools_reports.FindItemById( tools_reports.FindItem("calibration.verify")) self.Bind(wx.EVT_MENU, self.verify_calibration_handler, self.menuitem_calibration_verify) menuitem = tools_reports.FindItemById( tools_reports.FindItem("measurement_report.update")) self.Bind(wx.EVT_MENU, self.update_measurement_report, menuitem) self.menuitem_measure_uniformity = tools_reports.FindItemById( tools_reports.FindItem("report.uniformity")) self.Bind(wx.EVT_MENU, self.measure_uniformity_handler, self.menuitem_measure_uniformity) self.menuitem_measure_testchart = tools_advanced.FindItemById( tools_advanced.FindItem("measure.testchart")) self.Bind(wx.EVT_MENU, self.measure_handler, self.menuitem_measure_testchart) self.menuitem_profile_hires_b2a = tools_advanced.FindItemById( tools_advanced.FindItem("profile.b2a.hires")) self.Bind(wx.EVT_MENU, self.profile_hires_b2a_handler, self.menuitem_profile_hires_b2a) self.menuitem_measurement_file_check = tools_advanced.FindItemById( tools_advanced.FindItem("measurement_file.check_sanity")) self.Bind(wx.EVT_MENU, self.measurement_file_check_handler, self.menuitem_measurement_file_check) self.menuitem_measurement_file_check_auto = tools_advanced.FindItemById( tools_advanced.FindItem("measurement_file.check_sanity.auto")) self.Bind(wx.EVT_MENU, self.measurement_file_check_auto_handler, self.menuitem_measurement_file_check_auto) self.menuitem_choose_colorimeter_correction = tools_ccxx.FindItemById( tools_ccxx.FindItem("colorimeter_correction_matrix_file.choose")) self.Bind(wx.EVT_MENU, self.colorimeter_correction_matrix_ctrl_handler, self.menuitem_choose_colorimeter_correction) self.menuitem_colorimeter_correction_web = tools_ccxx.FindItemById( tools_ccxx.FindItem("colorimeter_correction.web_check")) self.Bind(wx.EVT_MENU, self.colorimeter_correction_web_handler, self.menuitem_colorimeter_correction_web) self.menuitem_import_colorimeter_correction = tools_ccxx.FindItemById( tools_ccxx.FindItem("colorimeter_correction.import")) self.Bind(wx.EVT_MENU, self.import_colorimeter_corrections_handler, self.menuitem_import_colorimeter_correction) self.menuitem_create_colorimeter_correction = tools_ccxx.FindItemById( tools_ccxx.FindItem("colorimeter_correction.create")) self.Bind(wx.EVT_MENU, self.create_colorimeter_correction_handler, self.menuitem_create_colorimeter_correction) self.menuitem_upload_colorimeter_correction = tools_ccxx.FindItemById( tools_ccxx.FindItem("colorimeter_correction.upload")) self.Bind(wx.EVT_MENU, self.upload_colorimeter_correction_handler, self.menuitem_upload_colorimeter_correction) self.menuitem_synthicc_create = tools_advanced.FindItemById( tools_advanced.FindItem("synthicc.create")) self.Bind(wx.EVT_MENU, self.synthicc_create_handler, self.menuitem_synthicc_create) self.menuitem_install_argyll_instrument_conf = tools_instrument.FindItemById( tools_instrument.FindItem("argyll.instrument.configuration_files.install")) self.menuitem_uninstall_argyll_instrument_conf = tools_instrument.FindItemById( tools_instrument.FindItem("argyll.instrument.configuration_files.uninstall")) if sys.platform in ("darwin", "win32") and not test: tools_instrument.RemoveItem(self.menuitem_install_argyll_instrument_conf) tools_instrument.RemoveItem(self.menuitem_uninstall_argyll_instrument_conf) else: # Linux may need instrument access being setup self.Bind(wx.EVT_MENU, self.install_argyll_instrument_conf, self.menuitem_install_argyll_instrument_conf) self.Bind(wx.EVT_MENU, self.uninstall_argyll_instrument_conf, self.menuitem_uninstall_argyll_instrument_conf) self.menuitem_install_argyll_instrument_drivers = tools_instrument.FindItemById( tools_instrument.FindItem("argyll.instrument.drivers.install")) self.menuitem_uninstall_argyll_instrument_drivers = tools_instrument.FindItemById( tools_instrument.FindItem("argyll.instrument.drivers.uninstall")) if sys.platform == "win32" or test: # Windows may need an Argyll CMS instrument driver self.Bind(wx.EVT_MENU, self.install_argyll_instrument_drivers, self.menuitem_install_argyll_instrument_drivers) else: # Other OS do not need an Argyll CMS instrument driver tools_instrument.RemoveItem(self.menuitem_install_argyll_instrument_drivers) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, )) or test: # Windows Vista and newer can uninstall Argyll CMS instrument driver self.Bind(wx.EVT_MENU, self.uninstall_argyll_instrument_drivers, self.menuitem_uninstall_argyll_instrument_drivers) else: # Other OS cannot uninstall Argyll CMS instrument driver tools_instrument.RemoveItem(self.menuitem_uninstall_argyll_instrument_drivers) self.menuitem_enable_spyder2 = tools_instrument.FindItemById( tools_instrument.FindItem("enable_spyder2")) self.Bind(wx.EVT_MENU, self.enable_spyder2_handler, self.menuitem_enable_spyder2) self.menuitem_calibrate_instrument = tools_instrument.FindItemById( tools_instrument.FindItem("calibrate_instrument")) self.Bind(wx.EVT_MENU, self.calibrate_instrument_handler, self.menuitem_calibrate_instrument) menuitem = tools.FindItemById( tools.FindItem("detect_displays_and_ports")) self.Bind(wx.EVT_MENU, self.check_update_controls, menuitem) self.menuitem_show_lut = tools.FindItemById( tools.FindItem("calibration.show_lut")) self.Bind(wx.EVT_MENU, self.init_lut_viewer, self.menuitem_show_lut) self.menuitem_show_log = tools.FindItemById(tools.FindItem("infoframe.toggle")) self.Bind(wx.EVT_MENU, self.infoframe_toggle_handler, self.menuitem_show_log) self.menuitem_log_autoshow = tools.FindItemById( tools.FindItem("log.autoshow")) self.Bind(wx.EVT_MENU, self.infoframe_autoshow_handler, self.menuitem_log_autoshow) languages = self.menubar.GetMenu(self.menubar.FindMenu("menu.language")) llist = [(lang.ldict[lcode].get("!language", ""), lcode) for lcode in lang.ldict] llist.sort() for lstr, lcode in llist: menuitem = languages.Append(-1, "&" + lstr, kind=wx.ITEM_RADIO) if (lcode.upper().replace("EN", "US") in flagart.catalog): if (sys.platform in ("darwin", "win32") or menuitem.GetKind() == wx.ITEM_NORMAL): # This can fail under Linux with wxPython 3.0 # because only normal menu items can have bitmaps # there. Working fine on all other platforms. pyimg = flagart.catalog[lcode.upper().replace("EN", "US")] if pyimg.Image.IsOk(): bmp = pyimg.getBitmap() if bmp.IsOk(): menuitem.SetBitmap(bmp) if lang.getcode() == lcode: menuitem.Check() font = menuitem.Font font.SetWeight(wx.BOLD) menuitem.SetFont(font) # Map numerical event id to language string lang.ldict[lcode].menuitem_id = menuitem.GetId() self.Bind(wx.EVT_MENU, self.set_language_handler, menuitem) help = self.menubar.GetMenu(self.menubar.FindMenu("menu.help")) self.menuitem_about = help.Append( -1 if wx.VERSION < (2, 9) else wx.ID_ABOUT, "&menu.about") self.Bind(wx.EVT_MENU, self.aboutdialog_handler, self.menuitem_about) self.menuitem_readme = help.FindItemById(help.FindItem("readme")) self.menuitem_readme.Enable(isinstance(get_data_path("README.html"), basestring)) self.Bind(wx.EVT_MENU, self.readme_handler, self.menuitem_readme) self.menuitem_license = help.FindItemById(help.FindItem("license")) self.menuitem_license.Enable(isinstance(get_data_path("LICENSE.txt"), basestring) or os.path.isfile("/usr/share/common-licenses/GPL-3")) self.Bind(wx.EVT_MENU, self.license_handler, self.menuitem_license) menuitem = help.FindItemById(help.FindItem("go_to_website")) self.Bind(wx.EVT_MENU, lambda event: launch_file("https://%s/" % domain), menuitem) menuitem = help.FindItemById(help.FindItem("help_support")) self.Bind(wx.EVT_MENU, self.help_support_handler, menuitem) menuitem = help.FindItemById(help.FindItem("bug_report")) self.Bind(wx.EVT_MENU, self.bug_report_handler, menuitem) self.menuitem_app_auto_update_check = help.FindItemById( help.FindItem("update_check.onstartup")) self.Bind(wx.EVT_MENU, self.app_auto_update_check_handler, self.menuitem_app_auto_update_check) menuitem = help.FindItemById(help.FindItem("update_check")) self.Bind(wx.EVT_MENU, self.app_update_check_handler, menuitem) if sys.platform == "darwin": wx.GetApp().SetMacAboutMenuItemId(self.menuitem_about.GetId()) wx.GetApp().SetMacPreferencesMenuItemId(self.menuitem_prefs.GetId()) wx.GetApp().SetMacExitMenuItemId(self.menuitem_quit.GetId()) wx.GetApp().SetMacHelpMenuTitleName(lang.getstr("menu.help")) def update_menus(self): """ Enable/disable menu items based on available Argyll functionality. """ self.menuitem_testchart_edit.Enable(self.create_testchart_btn.Enabled) self.menuitem_measure_testchart.Enable(bool(self.worker.displays) and bool(self.worker.instruments)) self.menuitem_create_profile.Enable(bool(self.worker.displays)) edid = self.worker.get_display_edid() self.menuitem_create_profile_from_edid.Enable(bool(self.worker.displays and edid and edid.get("monitor_name", edid.get("ascii", edid["product_id"])) and edid["red_x"] and edid["red_y"] and edid["green_x"] and edid["green_y"] and edid["blue_x"] and edid["blue_y"])) self.menuitem_profile_hires_b2a.Enable(self.worker.argyll_version > [0, 0, 0]) self.menuitem_install_display_profile.Enable(bool(self.worker.displays) and not config.is_virtual_display()) calibration_loading_supported = self.worker.calibration_loading_supported self.menuitem_load_lut_from_cal_or_profile.Enable( bool(self.worker.displays) and calibration_loading_supported) self.menuitem_load_lut_from_display_profile.Enable( bool(self.worker.displays) and calibration_loading_supported) self.menuitem_skip_legacy_serial_ports.Check(bool(getcfg("skip_legacy_serial_ports"))) if sys.platform not in ("darwin", "win32") or test: has_separate_lut_access = self.worker.has_separate_lut_access() self.menuitem_use_separate_lut_access.Check(has_separate_lut_access or bool(getcfg("use_separate_lut_access"))) self.menuitem_use_separate_lut_access.Enable(not has_separate_lut_access) has_lut_access = self.worker.has_lut_access() do_not_use_video_lut = (self.worker.argyll_version >= [1, 3, 3] and (not has_lut_access or not getcfg("calibration.use_video_lut"))) self.menuitem_do_not_use_video_lut.Check(do_not_use_video_lut) self.menuitem_do_not_use_video_lut.Enable(self.worker.argyll_version >= [1, 3, 3] and has_lut_access) self.menuitem_allow_skip_sensor_cal.Check(bool(getcfg("allow_skip_sensor_cal"))) self.menuitem_calibrate_instrument.Enable( bool(self.worker.get_instrument_features().get("sensor_cal"))) self.menuitem_enable_3dlut_tab.Check(bool(getcfg("3dlut.tab.enable"))) self.menuitem_enable_argyll_debug.Check(bool(getcfg("argyll.debug"))) self.menuitem_enable_dry_run.Check(bool(getcfg("dry_run"))) self.menuitem_startup_sound.Check(bool(getcfg("startup_sound.enable"))) self.menuitem_use_fancy_progress.Check(bool(getcfg("use_fancy_progress"))) self.menuitem_advanced_options.Enable(bool(getcfg("show_advanced_options"))) spyd2en = get_argyll_util("spyd2en") spyder2_firmware_exists = self.worker.spyder2_firmware_exists() if sys.platform not in ("darwin", "win32") or test: installed = self.worker.get_argyll_instrument_conf("installed") installable = self.worker.get_argyll_instrument_conf() # Only enable if not yet installed and installable self.menuitem_install_argyll_instrument_conf.Enable( bool(not installed and installable)) # Only enable if installed and (re-)installable self.menuitem_uninstall_argyll_instrument_conf.Enable( bool(installed and installable)) self.menuitem_enable_spyder2.Enable(bool(spyd2en)) self.menuitem_enable_spyder2.Check(bool(spyd2en) and spyder2_firmware_exists) self.menuitem_show_lut.Enable(bool(LUTFrame) and self.worker.argyll_version > [0, 0, 0]) self.menuitem_show_lut.Check(bool(getcfg("lut_viewer.show"))) if hasattr(self, "lut_viewer"): self.lut_viewer.update_controls() self.menuitem_lut_reset.Enable(bool(self.worker.displays) and calibration_loading_supported) mr_enable = getcfg("calibration.file", False) not in self.presets[1:] self.menuitem_measurement_report.Enable(mr_enable) self.menuitem_report_calibrated.Enable(bool(self.worker.displays) and bool(self.worker.instruments) and not config.is_non_argyll_display()) self.menuitem_report_uncalibrated.Enable(bool(self.worker.displays) and bool(self.worker.instruments) and not config.is_non_argyll_display()) self.menuitem_calibration_verify.Enable(bool(self.worker.displays) and bool(self.worker.instruments) and not config.is_non_argyll_display()) self.mr_settings_btn.Enable(bool(self.worker.displays) and bool(self.worker.instruments)) self.menuitem_measure_uniformity.Enable(bool(self.worker.displays) and bool(self.worker.instruments)) self.menuitem_measurement_file_check_auto.Check(bool(getcfg("ti3.check_sanity.auto"))) self.menuitem_create_colorimeter_correction.Enable(bool(get_argyll_util("ccxxmake"))) self.menuitem_show_log.Check(bool(getcfg("log.show"))) self.menuitem_log_autoshow.Enable(not bool(getcfg("log.show"))) self.menuitem_log_autoshow.Check(bool(getcfg("log.autoshow"))) self.menuitem_app_auto_update_check.Check(bool(getcfg("update_check"))) def init_controls(self): """ Initialize the main window controls and their event handlers. """ for child in (self.display_box_label, self.instrument_box_label, self.calibration_settings_label, self.profile_settings_label, self.lut3d_settings_label, self.mr_settings_label): font = child.Font font.SetWeight(wx.BOLD) child.Font = font # Settings file controls # ====================== # Settings file dropdown self.Bind(wx.EVT_CHOICE, self.calibration_file_ctrl_handler, id=self.calibration_file_ctrl.GetId()) self.Bind(wx.EVT_BUTTON, self.load_cal_handler, id=self.calibration_file_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.create_session_archive_handler, id=self.create_session_archive_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.delete_calibration_handler, id=self.delete_calibration_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.install_profile_handler, id=self.install_profile_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.profile_info_handler, id=self.profile_info_btn.GetId()) # Update calibration checkbox self.Bind(wx.EVT_CHECKBOX, self.calibration_update_ctrl_handler, id=self.calibration_update_cb.GetId()) # Display self.Bind(wx.EVT_CHOICE, self.display_ctrl_handler, id=self.display_ctrl.GetId()) self.Bind(wx.EVT_CHOICE, self.display_lut_ctrl_handler, id=self.display_lut_ctrl.GetId()) self.Bind(wx.EVT_BUTTON, self.display_lut_link_ctrl_handler, id=self.display_lut_link_ctrl.GetId()) # Instrument self.Bind(wx.EVT_CHOICE, self.comport_ctrl_handler, id=self.comport_ctrl.GetId()) self.Bind(wx.EVT_CHOICE, self.measurement_mode_ctrl_handler, id=self.measurement_mode_ctrl.GetId()) self.Bind(wx.EVT_BUTTON, self.check_update_controls, id=self.detect_displays_and_ports_btn.GetId()) # Display update delay & settle time min_val, max_val = config.valid_ranges["measure.min_display_update_delay_ms"] self.min_display_update_delay_ms.SetRange(min_val, max_val) min_val, max_val = config.valid_ranges["measure.display_settle_time_mult"] self.display_settle_time_mult.SetDigits(len(str(stripzeros(min_val)).split(".")[-1])) self.display_settle_time_mult.SetIncrement(min_val) self.display_settle_time_mult.SetRange(min_val, max_val) self.Bind(wx.EVT_CHECKBOX, self.display_delay_handler, id=self.override_min_display_update_delay_ms.GetId()) self.Bind(wx.EVT_TEXT, self.display_delay_handler, id=self.min_display_update_delay_ms.GetId()) self.Bind(wx.EVT_CHECKBOX, self.display_delay_handler, id=self.override_display_settle_time_mult.GetId()) self.Bind(floatspin.EVT_FLOATSPIN, self.display_delay_handler, id=self.display_settle_time_mult.GetId()) # Output levels self.output_levels_auto.Bind(wx.EVT_RADIOBUTTON, self.output_levels_handler) self.output_levels_full_range.Bind(wx.EVT_RADIOBUTTON, self.output_levels_handler) self.output_levels_limited_range.Bind(wx.EVT_RADIOBUTTON, self.output_levels_handler) # Observer self.observer_ctrl.Bind(wx.EVT_CHOICE, self.observer_ctrl_handler) # Colorimeter correction matrix self.Bind(wx.EVT_CHOICE, self.colorimeter_correction_matrix_ctrl_handler, id=self.colorimeter_correction_matrix_ctrl.GetId()) self.Bind(wx.EVT_BUTTON, self.colorimeter_correction_matrix_ctrl_handler, id=self.colorimeter_correction_matrix_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.colorimeter_correction_web_handler, id=self.colorimeter_correction_web_btn.GetId()) self.colorimeter_correction_create_btn.Bind(wx.EVT_BUTTON, self.create_colorimeter_correction_handler) # Calibration settings # ==================== # Whitepoint self.Bind(wx.EVT_CHOICE, self.whitepoint_ctrl_handler, id=self.whitepoint_ctrl.GetId()) self.Bind(wx.EVT_COMBOBOX, self.whitepoint_ctrl_handler, id=self.whitepoint_colortemp_textctrl.GetId()) self.whitepoint_colortemp_textctrl.SetItems(self.whitepoint_presets) self.whitepoint_colortemp_textctrl.Bind( wx.EVT_KILL_FOCUS, self.whitepoint_ctrl_handler) self.Bind(wx.EVT_CHOICE, self.whitepoint_colortemp_locus_ctrl_handler, id=self.whitepoint_colortemp_locus_ctrl.GetId()) self.whitepoint_x_textctrl.Bind(floatspin.EVT_FLOATSPIN, self.whitepoint_ctrl_handler) self.whitepoint_y_textctrl.Bind(floatspin.EVT_FLOATSPIN, self.whitepoint_ctrl_handler) self.Bind(wx.EVT_BUTTON, self.ambient_measure_handler, id=self.whitepoint_measure_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.visual_whitepoint_editor_handler, id=self.visual_whitepoint_editor_btn.GetId()) # White luminance self.Bind(wx.EVT_CHOICE, self.luminance_ctrl_handler, id=self.luminance_ctrl.GetId()) self.luminance_textctrl.Bind(floatspin.EVT_FLOATSPIN, self.luminance_ctrl_handler) self.Bind(wx.EVT_CHECKBOX, self.whitelevel_drift_compensation_handler, id=self.whitelevel_drift_compensation.GetId()) self.Bind(wx.EVT_BUTTON, self.luminance_measure_handler, id=self.luminance_measure_btn.GetId()) # Black luminance self.Bind(wx.EVT_CHOICE, self.black_luminance_ctrl_handler, id=self.black_luminance_ctrl.GetId()) self.black_luminance_textctrl.Bind(floatspin.EVT_FLOATSPIN, self.black_luminance_ctrl_handler) self.Bind(wx.EVT_CHECKBOX, self.blacklevel_drift_compensation_handler, id=self.blacklevel_drift_compensation.GetId()) self.Bind(wx.EVT_BUTTON, self.luminance_measure_handler, id=self.black_luminance_measure_btn.GetId()) # Tonal response curve (TRC) self.Bind(wx.EVT_CHOICE, self.trc_ctrl_handler, id=self.trc_ctrl.GetId()) self.trc_textctrl.SetItems(self.trc_presets) self.trc_textctrl.SetValue(str(defaults["gamma"])) self.Bind(wx.EVT_COMBOBOX, self.trc_ctrl_handler, id=self.trc_textctrl.GetId()) self.trc_textctrl.Bind(wx.EVT_KILL_FOCUS, self.trc_ctrl_handler) self.Bind(wx.EVT_CHOICE, self.trc_type_ctrl_handler, id=self.trc_type_ctrl.GetId()) # Viewing condition adjustment for ambient in Lux self.Bind(wx.EVT_CHECKBOX, self.ambient_viewcond_adjust_ctrl_handler, id=self.ambient_viewcond_adjust_cb.GetId()) self.ambient_viewcond_adjust_textctrl.Bind( floatspin.EVT_FLOATSPIN, self.ambient_viewcond_adjust_ctrl_handler) self.Bind(wx.EVT_BUTTON, self.ambient_measure_handler, id=self.ambient_measure_btn.GetId()) # Black level output offset self.Bind(wx.EVT_SLIDER, self.black_output_offset_ctrl_handler, id=self.black_output_offset_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.black_output_offset_ctrl_handler, id=self.black_output_offset_intctrl.GetId()) # Black point hue correction self.Bind(wx.EVT_CHECKBOX, self.black_point_correction_auto_handler, id=self.black_point_correction_auto_cb.GetId()) self.Bind(wx.EVT_SLIDER, self.black_point_correction_ctrl_handler, id=self.black_point_correction_ctrl.GetId()) self.Bind(wx.EVT_TEXT, self.black_point_correction_ctrl_handler, id=self.black_point_correction_intctrl.GetId()) # Black point correction rate self.Bind(wx.EVT_SLIDER, self.black_point_rate_ctrl_handler, id=self.black_point_rate_ctrl.GetId()) self.Bind(floatspin.EVT_FLOATSPIN, self.black_point_rate_ctrl_handler, id=self.black_point_rate_floatctrl.GetId()) # Calibration quality self.Bind(wx.EVT_SLIDER, self.calibration_quality_ctrl_handler, id=self.calibration_quality_ctrl.GetId()) # Interactive display adjustment self.Bind(wx.EVT_CHECKBOX, self.interactive_display_adjustment_ctrl_handler, id=self.interactive_display_adjustment_cb.GetId()) # Profiling settings # ================== # Testchart file self.Bind(wx.EVT_CHOICE, self.testchart_ctrl_handler, id=self.testchart_ctrl.GetId()) self.Bind(wx.EVT_BUTTON, self.testchart_btn_handler, id=self.testchart_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.create_testchart_btn_handler, id=self.create_testchart_btn.GetId()) self.testchart_patches_amount_ctrl.SetRange(config.valid_values["testchart.auto_optimize"][1], config.valid_values["testchart.auto_optimize"][-1]) self.testchart_patches_amount_ctrl.Bind(wx.EVT_SLIDER, self.testchart_patches_amount_ctrl_handler) # Patch sequence self.Bind(wx.EVT_CHOICE, self.testchart_patch_sequence_ctrl_handler, id=self.testchart_patch_sequence_ctrl.GetId()) # Profile quality self.Bind(wx.EVT_SLIDER, self.profile_quality_ctrl_handler, id=self.profile_quality_ctrl.GetId()) # Profile type self.Bind(wx.EVT_CHOICE, self.profile_type_ctrl_handler, id=self.profile_type_ctrl.GetId()) # Advanced (gamut mapping) self.Bind(wx.EVT_BUTTON, self.gamap_btn_handler, id=self.gamap_btn.GetId()) # Black point compensation self.Bind(wx.EVT_CHECKBOX, self.black_point_compensation_ctrl_handler, id=self.black_point_compensation_cb.GetId()) # Profile name self.Bind(wx.EVT_TEXT, self.profile_name_ctrl_handler, id=self.profile_name_textctrl.GetId()) self.profile_name_info_btn.Bind(wx.EVT_BUTTON, self.profile_name_info_btn_handler) self.profile_name_info_btn.SetToolTipString(lang.getstr("profile.name")) self.Bind(wx.EVT_BUTTON, self.profile_save_path_btn_handler, id=self.profile_save_path_btn.GetId()) # 3D LUT controls # =============== self.lut3d_create_cb.Bind(wx.EVT_CHECKBOX, self.lut3d_create_cb_handler) self.lut3d_init_input_profiles() self.lut3d_input_profile_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_input_colorspace_handler) self.lut3d_bind_event_handlers() # Main buttons # ============ for btn_name in ("calibrate_btn", "calibrate_and_profile_btn", "profile_btn", "lut3d_create_btn", "measurement_report_btn"): btn = getattr(self, btn_name) # wx.Button does not look correct when a custom background color is # set because the button label background inherits the button # background. Replace with ThemedGenButton which does not have # that issue subst = BorderGradientButton(btn.Parent, bitmap=geticon(16, "start"), label=btn.Label, name=btn.Name) subst.SetBackgroundColour(btn.Parent.BackgroundColour) if sys.platform == "win32": subst.SetTopStartColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT)) subst.SetTopEndColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT)) # Not used subst.SetBottomStartColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT)) # Not used subst.SetBottomEndColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT)) else: subst.SetTopStartColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)) subst.SetBottomEndColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)) subst.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT)) subst.SetPressedTopColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT)) subst.SetPressedBottomColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT)) setattr(self, btn_name, subst) btn.ContainingSizer.Replace(btn, subst) btn.Destroy() self.Bind(wx.EVT_BUTTON, self.calibrate_btn_handler, id=self.calibrate_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.calibrate_and_profile_btn_handler, id=self.calibrate_and_profile_btn.GetId()) self.Bind(wx.EVT_BUTTON, self.profile_btn_handler, id=self.profile_btn.GetId()) self.lut3d_create_btn.Bind(wx.EVT_BUTTON, self.lut3d_create_handler) self.measurement_report_btn.Bind(wx.EVT_BUTTON, self.measurement_report_handler) def set_language_handler(self, event): """ Set a new language globally and on-the-fly. """ for lcode in lang.ldict: if lang.ldict[lcode].menuitem_id == event.GetId(): # Get the previously marked menu item menuitem = self.menubar.FindItemById( lang.ldict[lang.getcode()].menuitem_id) if hasattr(self, "tcframe"): if not self.tcframe.tc_close_handler(): # Do not change language, mark previous menu item menuitem.Check() return self.tcframe.Destroy() del self.tcframe # Set the previously marked menu item's font weight to normal font = menuitem.Font font.SetWeight(wx.NORMAL) menuitem.SetFont(font) # Set the currently marked menu item's font weight to bold menuitem = self.menubar.FindItemById(lang.ldict[lcode].menuitem_id) font = menuitem.Font font.SetWeight(wx.BOLD) menuitem.SetFont(font) setcfg("lang", lcode) writecfg() self.panel.Freeze() self.header.SetLabel(lang.getstr("header")) self.setup_language() if hasattr(self, "extra_args"): self.extra_args.Sizer.SetSizeHints(self.extra_args) self.extra_args.Sizer.Layout() if hasattr(self, "gamapframe"): self.gamapframe.panel.Freeze() self.gamapframe.setup_language() self.gamapframe.update_layout() self.gamapframe.panel.Thaw() if getattr(self, "lut3dframe", None): self.lut3dframe.panel.Freeze() self.lut3dframe.setup_language() self.lut3dframe.update_controls() self.lut3dframe.update_layout() self.lut3dframe.panel.Thaw() if getattr(self, "reportframe", None): self.reportframe.panel.Freeze() self.reportframe.setup_language() self.reportframe.update_controls() self.reportframe.update_layout() self.reportframe.panel.Thaw() if getattr(self, "synthiccframe", None): self.synthiccframe.panel.Freeze() self.synthiccframe.setup_language() self.synthiccframe.update_controls() self.synthiccframe.update_layout() self.synthiccframe.panel.Thaw() self.update_measurement_modes() self.update_controls() self.update_displays() self.set_testcharts() self.update_layout() self.panel.Thaw() if hasattr(self, "aboutdialog"): self.aboutdialog.Destroy() del self.aboutdialog log_txt = self.infoframe.log_txt.GetValue().encode("UTF-8", "replace") if log_txt: # Remember current log window contents if not self.infoframe.IsShownOnScreen(): # Append buffer of non-shown log window logbuffer.seek(0) log_txt += logbuffer.read() logbuffer.truncate(0) logbuffer.write(log_txt) self.infoframe.Destroy() self.init_infoframe(show=getcfg("log.show")) if sys.platform in ("darwin", "win32") or isexe: self.measureframe.Destroy() self.init_measureframe() if hasattr(self, "lut_viewer"): self.lut_viewer.Destroy() del self.lut_viewer if getcfg("lut_viewer.show"): # Using wx.CallAfter fixes wrong positioning under wxGTK # with wxPython 3 wx.CallAfter(self.init_lut_viewer, show=True) if hasattr(self, "profile_name_tooltip_window"): self.profile_name_tooltip_window.Destroy() del self.profile_name_tooltip_window for progress_wnd in self.worker.progress_wnds: if progress_wnd: progress_wnd.Destroy() wx.CallAfter(self.Raise) threading.Thread(target=self.set_remote_language).start() break def set_remote_language(self): # Set language of all running standalone tools (if supported) app_ip, app_port = sys._appsocket.getsockname() for host in self.get_scripting_hosts(): ip_port, name = host.split(None, 1) ip, port = ip_port.split(":", 1) port = int(port) if ip == app_ip and port == app_port: continue try: conn = self.connect(ip, port) if isinstance(conn, Exception): safe_print("Warning - couldn't connect to", ip_port, "(%s):" % name, conn) continue conn.send_command("getappname") remote_appname = conn.get_single_response() if remote_appname == appname: safe_print("Warning - connected to self, skipping") del conn continue conn.send_command("setlanguage %s" % lang.getcode()) response = conn.get_single_response() if response not in ("ok", "invalid"): safe_print("Warning - couldn't set language for", name, "(%s):" % ip_port, response) if remote_appname == appname + "-apply-profiles": # Update notification text of profile loader conn.send_command("notify '%s' silent sticky" % lang.getstr("app.detected.calibration_loading_disabled", appname)) response = conn.get_single_response() if response != "ok": safe_print("Warning - couldn't update profile loader " "notification text:", response) del conn except Exception, exception: safe_print("Warning - error while trying to set language for", name, "(%s)" % ip_port, exception) def update_layout(self): """ Update main window layout. """ self.set_size(False, True) def restore_defaults_handler(self, event=None, include=(), exclude=(), override=None): if event: dlg = ConfirmDialog(self, msg=lang.getstr("app.confirm_restore_defaults"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=getbitmap( "theme/icons/32x32/dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return if getcfg("settings.changed"): self.settings_discard_changes() skip = [ "allow_skip_sensor_cal", "app.allow_network_clients", "app.port", "argyll.dir", "argyll.version", "calibration.autoload", "calibration.black_point_rate.enabled", "calibration.file.previous", "calibration.update", "colorimeter_correction.instrument", "colorimeter_correction.instrument.reference", "colorimeter_correction.measurement_mode", "colorimeter_correction.measurement_mode.reference", "colorimeter_correction.measurement_mode.reference.projector", "colorimeter_correction_matrix_file", "comport.number", "copyright", "dimensions.measureframe.whitepoint.visual_editor", "display.number", "display.technology", "display_lut.link", "display_lut.number", "displays", "dry_run", "enumerate_ports.auto", "gamma", "iccgamut.surface_detail", "instruments", "lang", "last_3dlut_path", "last_cal_path", "last_cal_or_icc_path", "last_colorimeter_ti3_path", "last_filedialog_path", "last_icc_path", "last_reference_ti3_path", "last_testchart_export_path", "last_ti1_path", "last_ti3_path", "last_vrml_path", "log.show", "lut_viewer.show", "lut_viewer.show_actual_lut", "measurement_mode", "measurement_mode.projector", "measurement.name.expanded", "measurement.play_sound", "measurement.save_path", "multiprocessing.max_cpus", "patterngenerator.apl", "patterngenerator.resolve", "patterngenerator.resolve.port", "profile.b2a.hires.diagpng", "profile.create_gamut_views", "profile.install_scope", "profile.license", "profile.load_on_login", "profile.name", "profile.name.expanded", "profile.save_path", "profile_loader.check_gamma_ramps", "profile_loader.error.show_msg", "profile_loader.exceptions", "profile_loader.fix_profile_associations", "profile_loader.known_apps", "profile_loader.known_window_classes", "profile_loader.reset_gamma_ramps", "profile_loader.use_madhcnet", "profile_loader.verify_calibration", "profile.update", "position.x", "position.y", "position.info.x", "position.info.y", "position.lut_viewer.x", "position.lut_viewer.y", "position.lut3dframe.x", "position.lut3dframe.y", "position.synthiccframe.x", "position.synthiccframe.y", "position.profile_info.x", "position.profile_info.y", "position.progress.x", "position.progress.y", "position.reportframe.x", "position.reportframe.y", "position.scripting.x", "position.scripting.y", "position.tcgen.x", "position.tcgen.y", "recent_cals", "report.pack_js", "settings.changed", "show_advanced_options", "show_donation_message", "skip_legacy_serial_ports", "skip_scripts", "sudo.preserve_environment", "tc_precond_profile", "tc_vrml_cie", "tc_vrml_cie_colorspace", "tc_vrml_device", "tc_vrml_device_colorspace", "tc.show", "uniformity.measure.continuous", "untethered.measure.auto", "untethered.measure.manual.delay", "untethered.max_delta.chroma", "untethered.min_delta", "untethered.min_delta.lightness", "update_check", "webserver.portnumber", "whitepoint.visual_editor.bg_v", "whitepoint.visual_editor.b", "whitepoint.visual_editor.g", "whitepoint.visual_editor.r", "x3dom.cache", "x3dom.embed" ] override_default = { "app.dpi": None, "calibration.black_luminance": None, "calibration.luminance": None, "gamap_src_viewcond": "mt", "gamap_out_viewcond": "mt", "testchart.file": "auto", "trc": defaults["gamma"], "whitepoint.colortemp": None, "whitepoint.x": None, "whitepoint.y": None } if override: override_default.update(override) override = override_default for name in defaults: if name not in skip and name not in override: if (len(include) == 0 or False in [name.find(item) != 0 for item in include]) and \ (len(exclude) == 0 or not (False in [name.find(item) != 0 for item in exclude])): if name.endswith(".backup"): if name == "measurement_mode.backup": setcfg("measurement_mode", getcfg("measurement_mode.backup")) default = None else: default = defaults[name] if verbose >= 3: safe_print("Restoring %s to %s" % (name, default)) setcfg(name, default) for name in override: if (len(include) == 0 or False in [name.find(item) != 0 for item in include]) and \ (len(exclude) == 0 or not (False in [name.find(item) != 0 for item in exclude])): setcfg(name, override[name]) if event: writecfg() self.update_displays() self.update_controls() self.update_menus() if hasattr(self, "tcframe"): self.tcframe.tc_update_controls() def cal_changed(self, setchanged=True): """ Called internally when calibration settings controls are changed. Exceptions are the calibration quality and interactive display adjustment controls, which do not cause a 'calibration changed' event. """ if not self.updatingctrls and self.IsShownOnScreen(): # update_controls which is called from cal_changed might cause a # another cal_changed call, in which case we can skip it if debug: safe_print("[D] cal_changed") if setchanged: setcfg("settings.changed", 1) self.worker.options_dispcal = [] if getcfg("calibration.file", False): setcfg("calibration.file", None) # Load LUT curves from current display profile (if any, and if # it contains curves) self.load_display_profile_cal(None) self.calibration_file_ctrl.SetStringSelection( lang.getstr("settings.new")) self.calibration_file_ctrl.SetToolTip(None) self.create_session_archive_btn.Disable() self.delete_calibration_btn.Disable() self.install_profile_btn.Disable() do_update_controls = self.calibration_update_cb.GetValue() self.calibration_update_cb.SetValue(False) setcfg("calibration.update", 0) self.calibration_update_cb.Disable() setcfg("profile.update", 0) if do_update_controls: self.update_controls() self.settings_discard_changes(keep_changed_state=True) def update_displays(self, update_ccmx_items=False, set_height=False): """ Update the display selector controls. """ if debug: safe_print("[D] update_displays") self.panel.Freeze() self.displays = [] for item in self.worker.displays: self.displays.append(item.replace("[PRIMARY]", lang.getstr("display.primary"))) self.displays[-1] = lang.getstr(self.displays[-1]) self.display_ctrl.SetItems(self.displays) self.display_ctrl.Enable(len(self.worker.displays) > 1) display_lut_sizer = self.display_ctrl.GetContainingSizer() display_sizer = self.display_lut_link_ctrl.GetContainingSizer() comport_sizer = self.comport_ctrl.GetContainingSizer() if sys.platform not in ("darwin", "win32") or test: use_lut_ctrl = (self.worker.has_separate_lut_access() or bool(getcfg("use_separate_lut_access"))) menubar = self.GetMenuBar() menuitem = self.menu_advanced_options.FindItemById( self.menu_advanced_options.FindItem(lang.getstr("use_separate_lut_access"))) menuitem.Check(use_lut_ctrl) else: use_lut_ctrl = False if use_lut_ctrl: self.display_lut_ctrl.Clear() for i, disp in enumerate(self.displays): if self.worker.lut_access[i]: self.display_lut_ctrl.Append(disp) comport_sizer.SetCols(1) comport_sizer.SetRows(2) else: comport_sizer.SetCols(2) comport_sizer.SetRows(1) setcfg("display_lut.link", 1) display_lut_sizer.Show(self.display_label, use_lut_ctrl) display_lut_sizer.Show(self.display_lut_label, use_lut_ctrl) display_lut_sizer.Show(self.display_lut_ctrl, use_lut_ctrl) display_sizer.Show(self.display_lut_link_ctrl, use_lut_ctrl) self.get_set_display(update_ccmx_items) self.calpanel.Layout() self.panel.Thaw() if self.IsShown(): self.set_size(set_height) self.update_scrollbars() def update_scrollbars(self): self.Freeze() self.calpanel.SetVirtualSize(self.calpanel.GetBestVirtualSize()) self.Thaw() def update_comports(self, force=False): """ Update the comport selector control. """ self.comport_ctrl.Freeze() self.comport_ctrl.SetItems(self.worker.instruments) if self.worker.instruments: self.comport_ctrl.SetSelection( min(max(0, len(self.worker.instruments) - 1), max(0, int(getcfg("comport.number")) - 1))) self.comport_ctrl.Enable(len(self.worker.instruments) > 1) self.comport_ctrl.Thaw() self.comport_ctrl_handler(force=force) def update_measurement_mode(self): """ Update the measurement mode control. """ measurement_mode = getcfg("measurement_mode") instrument_features = self.worker.get_instrument_features() if instrument_features.get("adaptive_mode") and ( self.worker.argyll_version[0:3] > [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string and not "RC1" in self.worker.argyll_version_string and not "RC2" in self.worker.argyll_version_string)) and \ getcfg("measurement_mode.adaptive"): measurement_mode += "V" if instrument_features.get("highres_mode") and \ getcfg("measurement_mode.highres"): measurement_mode += "H" self.measurement_mode_ctrl.SetSelection( min(self.measurement_modes_ba[self.get_instrument_type()].get( measurement_mode, 1), len(self.measurement_mode_ctrl.GetItems()) - 1)) def get_measurement_modes(self, instrument_name, instrument_type, cfgname="measurement_mode"): measurement_mode = getcfg(cfgname) #if self.get_instrument_type() == "spect": #measurement_mode = strtr(measurement_mode, {"c": "", "l": ""}) if instrument_name != "DTP92": measurement_modes = dict({instrument_type: [lang.getstr("measurement_mode.refresh"), lang.getstr("measurement_mode.lcd")]}) measurement_modes_ab = dict({instrument_type: ["c", "l"]}) else: measurement_modes = dict({instrument_type: [lang.getstr("measurement_mode.refresh")]}) measurement_modes_ab = dict({instrument_type: ["c"]}) if (instrument_name in ("Spyder4", "Spyder5") and self.worker.spyder4_cal_exists()): # Spyder4 Argyll CMS >= 1.3.6 # Spyder5 Argyll CMS >= 1.7.0 # See http://www.argyllcms.com/doc/instruments.html#spyd4 # for description of supported modes measurement_modes[instrument_type].extend([lang.getstr("measurement_mode.lcd.ccfl"), lang.getstr("measurement_mode.lcd.wide_gamut.ccfl"), lang.getstr("measurement_mode.lcd.white_led"), lang.getstr("measurement_mode.lcd.wide_gamut.rgb_led"), lang.getstr("measurement_mode.lcd.ccfl.2")]) if self.worker.argyll_version >= [1, 5, 0]: measurement_modes_ab[instrument_type].extend(["f", "L", "e", "B", "x"]) else: measurement_modes_ab[instrument_type].extend(["3", "4", "5", "6", "7"]) elif instrument_name in ("ColorHug", "ColorHug2"): # Argyll CMS 1.3.6, spectro/colorhug.c, colorhug_disptypesel # Note: projector mode (-yp) is not the same as ColorMunki # projector mode! (-p) # ColorHug2 needs Argyll CMS 1.7 measurement_modes[instrument_type].extend([lang.getstr("projector"), lang.getstr("measurement_mode.lcd.white_led"), lang.getstr("measurement_mode.factory"), lang.getstr("measurement_mode.raw"), lang.getstr("auto")]) measurement_modes_ab[instrument_type].extend(["p", "e", "F", "R", "auto"]) elif (instrument_name == "DTP94" and self.worker.argyll_version >= [1, 5, 0]): # Argyll CMS 1.5.x introduces new measurement mode measurement_modes[instrument_type].extend([lang.getstr("measurement_mode.generic")]) measurement_modes_ab[instrument_type].append("g") elif instrument_name == "ColorMunki Smile": # Only supported in Argyll CMS 1.5.x and newer measurement_modes[instrument_type] = [lang.getstr("measurement_mode.lcd.ccfl"), lang.getstr("measurement_mode.lcd.white_led")] measurement_modes_ab[instrument_type] = ["f", "e"] elif (instrument_name == "Colorimtre HCFR" and self.worker.argyll_version >= [1, 5, 0]): # Argyll CMS 1.5.x introduces new measurement mode measurement_modes[instrument_type].extend([lang.getstr("measurement_mode.raw")]) measurement_modes_ab[instrument_type].append("R") elif instrument_name == "K-10": measurement_modes[instrument_type] = [] measurement_modes_ab[instrument_type] = [] for mode, desc in self.worker.get_instrument_measurement_modes().iteritems(): measurement_modes[instrument_type].append(lang.getstr(desc)) measurement_modes_ab[instrument_type].append(mode) if not measurement_mode in measurement_modes_ab[instrument_type]: measurement_mode = "F" instrument_features = self.worker.get_instrument_features(instrument_name) if instrument_features.get("projector_mode") and \ self.worker.argyll_version >= [1, 1, 0]: # Projector mode introduced in Argyll 1.1.0 Beta measurement_modes[instrument_type].append(lang.getstr("projector")) measurement_modes_ab[instrument_type].append("p") if not measurement_mode in measurement_modes_ab[instrument_type]: if measurement_modes_ab[instrument_type]: measurement_mode = measurement_modes_ab[instrument_type][0] else: measurement_mode = defaults["measurement_mode"] if instrument_features.get("adaptive_mode") and ( self.worker.argyll_version[0:3] > [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string and not "RC1" in self.worker.argyll_version_string and not "RC2" in self.worker.argyll_version_string)): # Adaptive mode introduced in Argyll 1.1.0 RC3 for key in iter(measurement_modes): instrument_modes = list(measurement_modes[key]) for i, mode in reversed(zip(xrange(0, len(instrument_modes)), instrument_modes)): if mode == lang.getstr("default"): mode = lang.getstr("measurement_mode.adaptive") else: mode = "%s %s" % (mode, lang.getstr("measurement_mode.adaptive")) measurement_modes[key].insert(i + 1, mode) modesig = measurement_modes_ab[key][i] measurement_modes_ab[key].insert(i + 1, (modesig or "") + "V") if getcfg(cfgname + ".adaptive"): measurement_mode += "V" if instrument_features.get("highres_mode"): for key in iter(measurement_modes): instrument_modes = list(measurement_modes[key]) for i, mode in reversed(zip(xrange(0, len(instrument_modes)), instrument_modes)): if mode == lang.getstr("default"): mode = lang.getstr("measurement_mode.highres") else: mode = "%s %s" % (mode, lang.getstr("measurement_mode.highres")) measurement_modes[key].insert(i + 1, mode) modesig = measurement_modes_ab[key][i] measurement_modes_ab[key].insert(i + 1, (modesig or "") + "H") if getcfg(cfgname + ".highres"): measurement_mode += "H" measurement_modes_ab = dict(zip(measurement_modes_ab.keys(), [dict(zip(range(len(measurement_modes_ab[key])), measurement_modes_ab[key])) for key in measurement_modes_ab])) measurement_modes_ba = dict(zip(measurement_modes_ab.keys(), [swap_dict_keys_values(measurement_modes_ab[key]) for key in measurement_modes_ab])) return (measurement_mode, measurement_modes, measurement_modes_ab, measurement_modes_ba) def update_measurement_modes(self): """ Populate the measurement mode control. """ instrument_name = self.worker.get_instrument_name() instrument_type = self.get_instrument_type() (measurement_mode, measurement_modes, measurement_modes_ab, measurement_modes_ba) = self.get_measurement_modes(instrument_name, instrument_type) self.measurement_modes_ab = measurement_modes_ab self.measurement_modes_ba = measurement_modes_ba self.measurement_mode_ctrl.Freeze() self.measurement_mode_ctrl.SetItems(measurement_modes[instrument_type]) self.measurement_mode_ctrl.SetSelection( min(self.measurement_modes_ba[instrument_type].get(measurement_mode, 1), len(measurement_modes[instrument_type]) - 1)) measurement_mode = self.get_measurement_mode() or "l" if measurement_mode != "auto": measurement_mode = measurement_mode[0] setcfg("measurement_mode", measurement_mode) self.measurement_mode_ctrl.Enable( bool(self.worker.instruments) and len(measurement_modes[instrument_type]) > 1) self.measurement_mode_ctrl.Thaw() def update_colorimeter_correction_matrix_ctrl(self): """ Show or hide the colorimeter correction matrix controls """ self.panel.Freeze() self.update_adjustment_controls() instrument_features = self.worker.get_instrument_features() show_control = (self.worker.instrument_can_use_ccxx(False) and not is_ccxx_testchart() and getcfg("measurement_mode") != "auto") self.colorimeter_correction_matrix_ctrl.GetContainingSizer().Show( self.colorimeter_correction_matrix_ctrl, show_control) self.colorimeter_correction_matrix_label.GetContainingSizer().Show( self.colorimeter_correction_matrix_label, show_control) self.colorimeter_correction_matrix_btn.GetContainingSizer().Show( self.colorimeter_correction_matrix_btn, show_control) self.colorimeter_correction_web_btn.GetContainingSizer().Show( self.colorimeter_correction_web_btn, show_control) self.colorimeter_correction_create_btn.ContainingSizer.Show( self.colorimeter_correction_create_btn, show_control) self.calpanel.Layout() self.panel.Thaw() if self.IsShown(): wx.CallAfter(self.set_size, True) wx.CallLater(1, self.update_scrollbars) def delete_colorimeter_correction_matrix_ctrl_item(self, path): if path in self.ccmx_cached_paths: self.ccmx_cached_paths.remove(path) if path in self.ccmx_cached_descriptors: del self.ccmx_cached_descriptors[path] if path in self.ccmx_instruments: del self.ccmx_instruments[path] delete = False for key, value in self.ccmx_mapping.iteritems(): if value == path: delete = True break if delete: del self.ccmx_mapping[key] def update_colorimeter_correction_matrix_ctrl_items(self, force=False, warn_on_mismatch=False, update_measurement_mode=True): """ Show the currently selected correction matrix and list all files in ccmx directories below force If True, reads the ccmx directory again, otherwise uses a previously cached result if available """ items = [lang.getstr("colorimeter_correction.file.none"), lang.getstr("auto")] self.ccmx_item_paths = [] index = 0 ccxx_path = None ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if len(ccmx) > 1 and not os.path.isfile(ccmx[1]): ccmx = ccmx[:1] if force or not getattr(self, "ccmx_cached_paths", None): ccmx_paths = self.get_argyll_data_files("lu", "*.ccmx") ccss_paths = self.get_argyll_data_files("lu", "*.ccss") ccmx_paths.sort(key=os.path.basename) ccss_paths.sort(key=os.path.basename) self.ccmx_cached_paths = ccmx_paths + ccss_paths self.ccmx_cached_descriptors = {} self.ccmx_instruments = {} self.ccmx_mapping = {} types = {"ccss": lang.getstr("spectral").replace(":", ""), "ccmx": lang.getstr("matrix").replace(":", "")} add_basename_to_desc_on_mismatch = False for i, path in enumerate(self.ccmx_cached_paths): if self.ccmx_cached_descriptors.get(path): desc = self.ccmx_cached_descriptors[path] elif os.path.isfile(path): try: cgats = CGATS.CGATS(path) except (IOError, CGATS.CGATSError), exception: safe_print("%s:" % path, exception) continue desc = safe_unicode(cgats.get_descriptor(), "UTF-8") # If the description is not the same as the 'sane' # filename, add the filename after the description # (max 31 chars) # See also colorimeter_correction_check_overwite, the # way the filename is processed must be the same if (add_basename_to_desc_on_mismatch and re.sub(r"[\\/:;*?\"<>|]+", "_", make_argyll_compatible_path(desc)) != os.path.splitext(os.path.basename(path))[0]): desc = "%s <%s>" % (ellipsis(desc, 66, "m"), ellipsis(os.path.basename(path), 31, "m")) else: desc = ellipsis(desc, 100, "m") self.ccmx_cached_descriptors[path] = desc self.ccmx_instruments[path] = get_canonical_instrument_name( str(cgats.queryv1("INSTRUMENT") or ""), {"DTP94-LCD mode": "DTP94", "eye-one display": "i1 Display", "Spyder 2 LCD": "Spyder2", "Spyder 3": "Spyder3"}) key = "%s\0%s" % (self.ccmx_instruments[path], str(cgats.queryv1("DISPLAY") or "")) if (not self.ccmx_mapping.get(key) or (len(ccmx) > 1 and path == ccmx[1])): # Prefer the selected CCMX self.ccmx_mapping[key] = path else: continue if (self.worker.get_instrument_name().lower().replace(" ", "") in self.ccmx_instruments.get(path, "").lower().replace(" ", "") or (path.lower().endswith(".ccss") and self.worker.instrument_supports_ccss())): # Only add the correction to the list if it matches the # currently selected instrument or if it is a CCSS if len(ccmx) > 1 and ccmx[0] != "AUTO" and ccmx[1] == path: ccxx_path = path items.append("%s: %s" % (types.get(os.path.splitext(path)[1].lower()[1:]), desc)) self.ccmx_item_paths.append(path) items_paths = [] for i, item in enumerate(items[2:]): items_paths.append({"item": item, "path": self.ccmx_item_paths[i]}) items_paths.sort(key=lambda item_path: item_path["item"].lower()) for i, item_path in enumerate(items_paths): items[i + 2] = item_path["item"] self.ccmx_item_paths[i] = item_path["path"] if ccxx_path: index = self.ccmx_item_paths.index(ccxx_path) + 2 if (len(ccmx) > 1 and ccmx[1] and ccmx[1] not in self.ccmx_cached_paths and (not ccmx[1].lower().endswith(".ccss") or self.worker.instrument_supports_ccss())): self.ccmx_cached_paths.insert(0, ccmx[1]) desc = self.ccmx_cached_descriptors.get(ccmx[1]) if not desc and os.path.isfile(ccmx[1]): try: cgats = CGATS.CGATS(ccmx[1]) except (IOError, CGATS.CGATSError), exception: safe_print("%s:" % ccmx[1], exception) else: desc = safe_unicode(cgats.get_descriptor(), "UTF-8") # If the description is not the same as the 'sane' # filename, add the filename after the description # (max 31 chars) # See also colorimeter_correction_check_overwite, the # way the filename is processed must be the same if (add_basename_to_desc_on_mismatch and re.sub(r"[\\/:;*?\"<>|]+", "_", make_argyll_compatible_path(desc)) != os.path.splitext(os.path.basename(ccmx[1]))[0]): desc = "%s <%s>" % (ellipsis(desc, 66, "m"), ellipsis(os.path.basename(ccmx[1]), 31, "m")) else: desc = ellipsis(desc, 100, "m") self.ccmx_cached_descriptors[ccmx[1]] = desc self.ccmx_instruments[ccmx[1]] = get_canonical_instrument_name( str(cgats.queryv1("INSTRUMENT") or ""), {"DTP94-LCD mode": "DTP94", "eye-one display": "i1 Display", "Spyder 2 LCD": "Spyder2", "Spyder 3": "Spyder3"}) key = "%s\0%s" % (self.ccmx_instruments[ccmx[1]], str(cgats.queryv1("DISPLAY") or "")) self.ccmx_mapping[key] = ccmx[1] if (desc and (self.worker.get_instrument_name().lower().replace(" ", "") in self.ccmx_instruments.get(ccmx[1], "").lower().replace(" ", "") or ccmx[1].lower().endswith(".ccss"))): # Only add the correction to the list if it matches the # currently selected instrument or if it is a CCSS items.insert(2, "%s: %s" % (types.get(os.path.splitext(ccmx[1])[1].lower()[1:]), desc)) self.ccmx_item_paths.insert(0, ccmx[1]) if ccmx[0] != "AUTO": index = 2 if ccmx[0] == "AUTO": if len(ccmx) < 2: ccmx.append("") display_name = self.worker.get_display_name(False, True, False) if self.worker.instrument_supports_ccss(): # Prefer CCSS ccmx[1] = self.ccmx_mapping.get("\0%s" % display_name, "") if not self.worker.instrument_supports_ccss() or not ccmx[1]: ccmx[1] = self.ccmx_mapping.get("%s\0%s" % (self.worker.get_instrument_name(), display_name), "") if (self.worker.instrument_can_use_ccxx() and len(ccmx) > 1 and ccmx[1] and ccmx[1] not in self.ccmx_item_paths): # CCMX does not match the currently selected instrument, # don't use ccmx = [""] if warn_on_mismatch: show_result_dialog(Warn(lang.getstr("colorimeter_correction.instrument_mismatch")), self) elif ccmx[0] == "AUTO": index = 1 if ccmx[1]: items[1] += " (%s: %s)" % (types.get(os.path.splitext(ccmx[1])[1].lower()[1:]), self.ccmx_cached_descriptors[ccmx[1]]) else: items[1] += " (%s)" % lang.getstr("colorimeter_correction.file.none") use_ccmx = (self.worker.instrument_can_use_ccxx(False) and len(ccmx) > 1 and ccmx[1]) tech = None observer = None if use_ccmx: mode = None try: cgats = CGATS.CGATS(ccmx[1]) except (IOError, CGATS.CGATSError), exception: safe_print("%s:" % ccmx[1], exception) else: if getcfg("measurement_mode") != "auto": tech = cgats.queryv1("TECHNOLOGY") # Set appropriate measurement mode # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.get_cgats_measurement_mode mode = get_cgats_measurement_mode(cgats, self.worker.get_instrument_name()) observer = cgats.queryv1("OBSERVER") if observer in self.observers_ab: setcfg("observer", observer) self.update_observer_ctrl() self.observer_ctrl.Disable() if mode or (getcfg("measurement_mode") != "auto" and not self.worker.instrument_can_use_ccxx()): if (update_measurement_mode or mode == getcfg("measurement_mode")): setcfg("measurement_mode", mode) self.update_measurement_mode() else: ccmx = ["", ""] index = 0 tech = None if not tech: tech = self.worker.get_instrument_measurement_modes().get( getcfg("measurement_mode")) setcfg("display.technology", tech) setcfg("colorimeter_correction_matrix_file", ":".join(ccmx)) self.colorimeter_correction_matrix_ctrl.Freeze() self.colorimeter_correction_matrix_ctrl.SetItems(items) self.colorimeter_correction_matrix_ctrl.SetSelection(index) self.colorimeter_correction_matrix_ctrl.Thaw() if use_ccmx: tooltip = ccmx[1] else: tooltip = "" self.update_main_controls() self.colorimeter_correction_matrix_ctrl.SetToolTipString(tooltip) self.update_estimated_measurement_times() if not observer in self.observers_ab: self.observer_ctrl.Enable() self.show_observer_ctrl() def update_main_controls(self): """ Enable/disable the calibrate and profile buttons based on available Argyll functionality. """ self.panel.Freeze() update_cal = self.calibration_update_cb.GetValue() self.measurement_mode_ctrl.Enable( bool(self.worker.instruments) and len(self.measurement_mode_ctrl.GetItems()) > 1) update_profile = update_cal and is_profile() self.visual_whitepoint_editor_btn.Enable(bool(self.worker.displays) and bool(self.worker.instruments) and not update_cal) self.whitepoint_measure_btn.Enable(bool(self.worker.instruments) and not update_cal) self.ambient_measure_btn.Enable(bool(self.worker.instruments) and not update_cal) self.luminance_measure_btn.Enable(bool(self.worker.instruments) and not update_cal) self.black_luminance_measure_btn.Enable(bool(self.worker.instruments) and not update_cal) lut3d_create_btn_show = (self.lut3d_settings_panel.IsShown() and not getcfg("3dlut.create")) mr_btn_show = self.mr_settings_panel.IsShown() enable_cal = (not config.is_uncalibratable_display() and (self.interactive_display_adjustment_cb.GetValue() or self.trc_ctrl.GetSelection() > 0)) calibrate_and_profile_btn_show = (not lut3d_create_btn_show and not mr_btn_show and enable_cal and not update_profile) calibrate_btn_show = (not lut3d_create_btn_show and not mr_btn_show and enable_cal) profile_btn_show = (not lut3d_create_btn_show and not mr_btn_show and not calibrate_and_profile_btn_show and not update_cal) if ((config.is_uncalibratable_display() and self.calibration_settings_panel.IsShown()) or (not getcfg("3dlut.tab.enable") and self.lut3d_settings_panel.IsShown())): self.tab_select_handler(self.display_instrument_btn) if (config.is_uncalibratable_display() and not self.calibration_settings_btn.IsEnabled()): self.calibration_settings_btn._pressed = False self.calibration_settings_btn._SetState(platebtn.PLATE_NORMAL) self.calibration_settings_btn.Enable(not config.is_uncalibratable_display()) self.lut3d_settings_btn.Enable(bool(getcfg("3dlut.tab.enable"))) self.calibrate_btn.Show(not calibrate_and_profile_btn_show and calibrate_btn_show) self.calibrate_btn.Enable(not calibrate_and_profile_btn_show and calibrate_btn_show and not is_ccxx_testchart() and bool(self.worker.displays) and bool(self.worker.instruments)) self.calibrate_and_profile_btn.Show(calibrate_and_profile_btn_show) self.calibrate_and_profile_btn.Enable(calibrate_and_profile_btn_show and not is_ccxx_testchart() and bool(self.worker.displays) and bool(self.worker.instruments)) self.profile_btn.Show(profile_btn_show) self.profile_btn.Enable(profile_btn_show and bool(self.worker.displays) and bool(self.worker.instruments)) self.lut3d_create_btn.Show(lut3d_create_btn_show) self.measurement_report_btn.Show(mr_btn_show) self.buttonpanel.Layout() self.lut3d_create_btn.Enable(is_profile() and getcfg("calibration.file", False) not in self.presets) self.panel.Layout() self.panel.Thaw() def update_calibration_file_ctrl(self, silent=False): """ Update items shown in the calibration file control and set a tooltip with the path of the currently selected file """ cal = getcfg("calibration.file", False) if cal: result = check_file_isfile(cal, silent=silent) if isinstance(result, Exception) and not silent: show_result_dialog(result, self) else: result = False if not isinstance(result, Exception) and result: filename, ext = os.path.splitext(cal) if not cal in self.recent_cals: self.recent_cals.append(cal) recent_cals = [] for recent_cal in self.recent_cals: if recent_cal not in self.presets: recent_cals.append(recent_cal) setcfg("recent_cals", os.pathsep.join(recent_cals)) self.calibration_file_ctrl.Append( lang.getstr(os.path.basename(cal))) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) self.calibration_file_ctrl.SetToolTipString(cal) if ext.lower() in (".icc", ".icm"): profile_path = cal else: profile_path = filename + profile_ext profile_exists = os.path.exists(profile_path) else: filename = None if cal in self.recent_cals[1:]: # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.recent_cals.remove(cal) self.calibration_file_ctrl.Delete(idx) cal = None self.calibration_file_ctrl.SetStringSelection( lang.getstr("settings.new")) self.calibration_file_ctrl.SetToolTip(None) setcfg("calibration.file", None) setcfg("calibration.update", 0) profile_path = None profile_exists = False return cal, filename, profile_path, profile_exists def update_controls(self, update_profile_name=True, update_ccmx_items=True, silent=False): """ Update all controls based on configuration and available Argyll functionality. """ self.updatingctrls = True self.panel.Freeze() (cal, filename, profile_path, profile_exists) = self.update_calibration_file_ctrl(silent) self.create_session_archive_btn.Enable(bool(cal) and cal not in self.presets) self.delete_calibration_btn.Enable(bool(cal) and cal not in self.presets) self.install_profile_btn.Enable(profile_exists and profile_path == cal and cal not in self.presets) is_profile_ = is_profile(include_display_profile=True) self.profile_info_btn.Enable(is_profile_) enable_update = (bool(cal) and os.path.exists(filename + ".cal") and can_update_cal(filename + ".cal")) if not enable_update: setcfg("calibration.update", 0) update_cal = getcfg("calibration.update") self.calibration_update_cb.Enable(enable_update) self.calibration_update_cb.SetValue(bool(update_cal)) if not update_cal or not profile_exists: setcfg("profile.update", 0) update_profile = update_cal and profile_exists enable_profile = not(update_profile) if update_ccmx_items: self.update_colorimeter_correction_matrix_ctrl_items() self.update_measurement_mode() self.update_observer_ctrl() for name in ("min_display_update_delay_ms", "display_settle_time_mult"): value = bool(getcfg("measure.override_%s" % name)) getattr(self, "override_%s" % name).SetValue(value) self.update_display_delay_ctrl(name, value) self.update_adjustment_controls() self.whitepoint_colortemp_textctrl.Enable(not update_cal) self.whitepoint_colortemp_locus_ctrl.Enable(not update_cal) self.whitepoint_x_textctrl.Enable(not update_cal) self.whitepoint_y_textctrl.Enable(not update_cal) self.luminance_textctrl.Enable(not update_cal) self.black_luminance_textctrl.Enable(not update_cal) self.trc_ctrl.Enable(not update_cal) self.trc_textctrl.Enable(not update_cal) self.trc_type_ctrl.Enable(not update_cal) self.ambient_viewcond_adjust_cb.Enable(not update_cal) self.black_output_offset_ctrl.Enable(not update_cal) self.black_output_offset_intctrl.Enable(not update_cal) self.black_point_correction_auto_cb.Enable(not update_cal) self.black_point_correction_ctrl.Enable(not update_cal) self.black_point_correction_intctrl.Enable(not update_cal) self.update_black_point_rate_ctrl() self.update_drift_compensation_ctrls() self.testchart_btn.Enable(enable_profile) self.testchart_patches_amount_ctrl.Enable(enable_profile) self.create_testchart_btn.Enable(enable_profile) self.profile_type_ctrl.Enable(enable_profile) self.whitepoint_colortemp_locus_ctrl.SetSelection( self.whitepoint_colortemp_loci_ba.get( getcfg("whitepoint.colortemp.locus"), self.whitepoint_colortemp_loci_ba.get( defaults["whitepoint.colortemp.locus"]))) self.whitelevel_drift_compensation.SetValue( bool(getcfg("drift_compensation.whitelevel"))) self.blacklevel_drift_compensation.SetValue( bool(getcfg("drift_compensation.blacklevel"))) trc = getcfg("trc") bt1886 = (trc == 2.4 and getcfg("trc.type") == "G" and getcfg("calibration.black_output_offset") == 0) if trc in ("l", "709", "240", "s"): self.trc_type_ctrl.SetSelection(0) if trc == "l": self.trc_ctrl.SetSelection(2) elif trc == "709": self.trc_ctrl.SetSelection(3) elif trc == "240": self.trc_ctrl.SetSelection(5) elif trc == "s": self.trc_ctrl.SetSelection(6) elif bt1886: self.trc_ctrl.SetSelection(4) self.trc_textctrl.SetValue(str(trc)) self.trc_type_ctrl.SetSelection(1) else: if trc: if (trc == 2.2 and getcfg("trc.type") == "g" and getcfg("calibration.black_output_offset") == 1): # Gamma 2.2 relative 100% output offset self.trc_ctrl.SetSelection(1) else: # Custom self.trc_ctrl.SetSelection(7) self.trc_textctrl.SetValue(str(trc)) else: self.trc_ctrl.SetSelection(0) self.trc_type_ctrl.SetSelection( self.trc_types_ba.get(getcfg("trc.type"), self.trc_types_ba.get(defaults["trc.type"]))) self.show_trc_controls() self.ambient_viewcond_adjust_cb.SetValue( bool(int(getcfg("calibration.ambient_viewcond_adjust")))) self.ambient_viewcond_adjust_textctrl.SetValue( getcfg("calibration.ambient_viewcond_adjust.lux")) self.ambient_viewcond_adjust_textctrl.Enable( not update_cal and bool(int(getcfg("calibration.ambient_viewcond_adjust")))) self.update_profile_type_ctrl() self.update_black_output_offset_ctrl() self.black_point_correction_ctrl.SetValue( int(Decimal(str(getcfg("calibration.black_point_correction"))) * 100)) self.black_point_correction_intctrl.SetValue( int(Decimal(str(getcfg("calibration.black_point_correction"))) * 100)) self.black_point_rate_ctrl.SetValue( int(Decimal(str(getcfg("calibration.black_point_rate"))) * 100)) self.black_point_rate_floatctrl.SetValue( getcfg("calibration.black_point_rate")) q = self.quality_ba.get(getcfg("calibration.quality"), self.quality_ba.get( defaults["calibration.quality"])) self.calibration_quality_ctrl.SetValue(q) self.set_calibration_quality_label(self.quality_ab[q]) self.update_bpc(enable_profile) self.testchart_ctrl.Enable(enable_profile) if self.set_default_testchart() is None: self.set_testchart(update_profile_name=not update_profile_name) self.testchart_patch_sequence_ctrl.SetStringSelection( lang.getstr("testchart." + getcfg("testchart.patch_sequence"))) simple_gamma_model = self.get_profile_type() in ("g", "G") if simple_gamma_model: q = 3 else: q = self.quality_ba.get(getcfg("profile.quality"), self.quality_ba.get( defaults["profile.quality"])) - 1 self.profile_quality_ctrl.SetValue(q) if q == 1: self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.low")) elif q == 2: self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.medium")) elif q == 3: self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.high")) elif q == 4: self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.ultra")) self.profile_quality_ctrl.Enable(enable_profile and not simple_gamma_model) enable_gamap = self.get_profile_type() in ("l", "x", "X") self.gamap_btn.Enable(enable_profile and enable_gamap) if getattr(self, "extra_args", None): self.extra_args.update_controls() if hasattr(self, "gamapframe"): self.gamapframe.update_controls() if (self.lut3d_settings_panel.IsShown() or self.mr_settings_panel.IsShown()): if self.mr_settings_panel.IsShown(): self.mr_update_controls() else: self.set_profile("output") self.lut3d_update_controls() if getattr(self, "lut3dframe", None): self.lut3dframe.update_controls() if getattr(self, "reportframe", None): self.reportframe.update_controls() if update_profile_name: self.profile_name_textctrl.ChangeValue(getcfg("profile.name")) self.update_profile_name() self.update_main_controls() self.panel.Thaw() self.updatingctrls = False def update_trc_control(self): if self.trc_ctrl.GetSelection() in (1, 4, 7): if (getcfg("trc.type") == "G" and getcfg("calibration.black_output_offset") == 0 and getcfg("trc") == 2.4): self.trc_ctrl.SetSelection(4) # BT.1886 elif (getcfg("trc.type") == "g" and getcfg("calibration.black_output_offset") == 1 and getcfg("trc") == 2.2): # Gamma 2.2 relative 100% output offset self.trc_ctrl.SetSelection(1) else: self.trc_ctrl.SetSelection(7) # Custom def show_trc_controls(self, freeze=False): show_advanced_options = bool(getcfg("show_advanced_options")) if freeze: self.panel.Freeze() for ctrl in (self.trc_gamma_label, self.trc_textctrl, self.trc_type_ctrl): ctrl.Show(self.trc_ctrl.GetSelection() == 7 or (self.trc_ctrl.GetSelection() in (1, 4) and show_advanced_options)) for ctrl in (self.black_output_offset_label, self.black_output_offset_ctrl, self.black_output_offset_intctrl, self.black_output_offset_intctrl_label): ctrl.Show(self.trc_ctrl.GetSelection() == 7 or (self.trc_ctrl.GetSelection() > 0 and show_advanced_options)) for ctrl in (self.ambient_viewcond_adjust_cb, self.ambient_viewcond_adjust_textctrl, self.ambient_viewcond_adjust_textctrl_label, self.ambient_measure_btn, self.black_point_correction_label, self.black_point_correction_auto_cb): ctrl.GetContainingSizer().Show(ctrl, self.trc_ctrl.GetSelection() > 0 and show_advanced_options) self.update_black_point_rate_ctrl() for ctrl in (self.calibration_quality_label, self.calibration_quality_ctrl, self.calibration_quality_info, self.cal_meas_time): ctrl.GetContainingSizer().Show(ctrl, self.trc_ctrl.GetSelection() > 0) # Make the height of the last row in the calibration settings sizer # match the other rows if self.trc_ctrl.GetSelection() > 0: minheight = self.trc_ctrl.Size[1] + 8 else: minheight = 0 self.calibration_quality_ctrl.ContainingSizer.SetMinSize((0, minheight)) self.black_point_correction_auto_handler() if freeze: self.panel.Thaw() def update_black_output_offset_ctrl(self): self.black_output_offset_ctrl.SetValue( int(Decimal(str(getcfg("calibration.black_output_offset"))) * 100)) self.black_output_offset_intctrl.SetValue( int(Decimal(str(getcfg("calibration.black_output_offset"))) * 100)) def update_black_point_rate_ctrl(self): self.panel.Freeze() enable = not(self.calibration_update_cb.GetValue()) show = (self.trc_ctrl.GetSelection() > 0 and bool(getcfg("show_advanced_options")) and defaults["calibration.black_point_rate.enabled"]) self.black_point_rate_label.GetContainingSizer().Show( self.black_point_rate_label, show) self.black_point_rate_ctrl.GetContainingSizer().Show( self.black_point_rate_ctrl, show) self.black_point_rate_ctrl.Enable( enable and getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"]) self.black_point_rate_floatctrl.GetContainingSizer().Show( self.black_point_rate_floatctrl, show) self.black_point_rate_floatctrl.Enable( enable and getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"]) self.calpanel.Layout() self.panel.Thaw() def update_bpc(self, enable_profile=True): enable_bpc = ((self.get_profile_type() in ("s", "S") or (self.get_profile_type() in ("l", "x", "X") and (getcfg("profile.b2a.hires") or getcfg("profile.quality.b2a") in ("l", "n")))) and enable_profile) self.black_point_compensation_cb.Enable(enable_bpc) self.black_point_compensation_cb.SetValue(enable_bpc and bool(int(getcfg("profile.black_point_compensation")))) def update_drift_compensation_ctrls(self): self.panel.Freeze() self.blacklevel_drift_compensation.GetContainingSizer().Show( self.blacklevel_drift_compensation, self.worker.argyll_version >= [1, 3, 0]) self.whitelevel_drift_compensation.GetContainingSizer().Show( self.whitelevel_drift_compensation, self.worker.argyll_version >= [1, 3, 0]) self.calpanel.Layout() self.panel.Thaw() def update_estimated_measurement_time(self, which): """ Update the estimated measurement time shown """ if which == "testchart": patches = int(self.testchart_patches_amount.Label) elif which == "cal": # See dispcal.c if getcfg("calibration.quality") == "v": # Very low isteps = 10 rsteps = 16 maxits = 1 mxrpts = 10 elif getcfg("calibration.quality") == "l": # Low isteps = 12 rsteps = 32 maxits = 2 mxrpts = 10 elif getcfg("calibration.quality") == "m": # Medium isteps = 16 rsteps = 64 maxits = 3 mxrpts = 12 elif getcfg("calibration.quality") == "h": # High isteps = 20 rsteps = 96 maxits = 4 mxrpts = 16 elif getcfg("calibration.quality") == "u": # Ultra isteps = 24 rsteps = 128 maxits = 5 mxrpts = 24 # 1st iteration rsteps /= 1 << (maxits - 1) patches = rsteps # 2nd..nth iteration for i in xrange(maxits - 1): rsteps *= 2 patches += rsteps # Multiply by estimated repeats patches *= mxrpts / 1.5 # Amount of precal patches is always 9 patches += 9 # Initial amount of cal patches is always isteps * 4 patches += isteps * 4 elif which == "chart": patches = int(self.chart_patches_amount.Label) ReportFrame.update_estimated_measurement_time(self, which, patches) def update_estimated_measurement_times(self): self.update_estimated_measurement_time("cal") self.update_estimated_measurement_time("testchart") self.update_estimated_measurement_time("chart") def blacklevel_drift_compensation_handler(self, event): setcfg("drift_compensation.blacklevel", int(self.blacklevel_drift_compensation.GetValue())) self.update_estimated_measurement_times() def whitelevel_drift_compensation_handler(self, event): setcfg("drift_compensation.whitelevel", int(self.whitelevel_drift_compensation.GetValue())) self.update_estimated_measurement_times() def calibration_update_ctrl_handler(self, event): if debug: safe_print("[D] calibration_update_ctrl_handler called for ID %s " "%s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) setcfg("calibration.update", int(self.calibration_update_cb.GetValue())) setcfg("profile.update", int(self.calibration_update_cb.GetValue() and is_profile())) self.update_controls() def enable_spyder2_handler(self, event, check_instrument_setup=False, callafter=None, callafter_args=None): self.update_menus() if check_set_argyll_bin(): msg = lang.getstr("oem.import.auto") if sys.platform == "win32": msg = " ".join([lang.getstr("oem.import.auto_windows"), msg]) dlg = ConfirmDialog(self, title=lang.getstr("enable_spyder2"), msg=msg, ok=lang.getstr("auto"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), alt=lang.getstr("file.select")) needroot = self.worker.argyll_version < [1, 2, 0] dlg.install_user = wx.RadioButton(dlg, -1, lang.getstr("install_user"), style=wx.RB_GROUP) dlg.install_user.Enable(not needroot) dlg.install_user.SetValue(not needroot) dlg.sizer3.Add(dlg.install_user, flag=wx.TOP | wx.ALIGN_LEFT, border=16) dlg.install_systemwide = wx.RadioButton(dlg, -1, lang.getstr("install_local_system")) dlg.install_user.Enable(not needroot) dlg.install_systemwide.SetValue(needroot) dlg.install_user.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) dlg.install_systemwide.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) install_scope_handler(dlg=dlg) dlg.sizer3.Add(dlg.install_systemwide, flag=wx.TOP | wx.ALIGN_LEFT, border=4) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if event: choice = dlg.ShowModal() else: choice = wx.ID_OK asroot = dlg.install_systemwide.GetValue() dlg.Destroy() if choice == wx.ID_CANCEL: return if choice == wx.ID_OK: # Auto path = None else: # Prompt for installer executable defaultDir, defaultFile = expanduseru("~"), "" dlg = wx.FileDialog(self, lang.getstr("file.select"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.any") + "|*", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result != wx.ID_OK: return if asroot: result = self.worker.authenticate(get_argyll_util("spyd2en"), lang.getstr("enable_spyder2"), self) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, self) return self.worker.start(self.enable_spyder2_consumer, self.enable_spyder2_producer, cargs=(check_instrument_setup, callafter, callafter_args), wargs=(path, asroot), progress_msg=lang.getstr("enable_spyder2"), fancy=False) return (event and None) or True def enable_spyder2(self, path, asroot): cmd, args = get_argyll_util("spyd2en"), ["-v"] if asroot and self.worker.argyll_version >= [1, 2, 0]: args.append("-Sl") if path: args.append(path) result = self.worker.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, silent=False, asroot=asroot, title=lang.getstr("enable_spyder2")) if asroot and sys.platform == "win32": # Wait for async process sleep(1) if result and not isinstance(result, Exception): result = self.worker.spyder2_firmware_exists(scope="l" if asroot else "u") return result def enable_spyder2_producer(self, path, asroot): if not path: if sys.platform in ("darwin", "win32"): # Look for Spyder.lib/CVSpyder.dll ourself because spyd2en # will only try some fixed paths if sys.platform == "darwin": wildcard = os.path.join(os.path.sep, "Applications", "Spyder2*", "Spyder2*.app", "Contents", "MacOSClassic", "Spyder.lib") else: wildcard = os.path.join(getenvu("PROGRAMFILES", ""), "ColorVision", "Spyder2*", "CVSpyder.dll") for path in glob.glob(wildcard): break if getcfg("dry_run"): return if path: result = self.enable_spyder2(path, asroot) if result and not isinstance(result, Exception): return result # Download from web path = self.worker.download("https://%s/spyd2" % domain.lower()) if isinstance(path, Exception): return path elif not path: # Cancelled return return self.enable_spyder2(path, asroot) def enable_spyder2_consumer(self, result, check_instrument_setup, callafter=None, callafter_args=()): if not isinstance(result, Exception) and result: result = UnloggedInfo(lang.getstr("enable_spyder2_success")) self.update_menus() elif result is False: result = UnloggedError("".join(self.worker.errors)) if result: show_result_dialog(result, self) if check_instrument_setup: self.check_instrument_setup(callafter, callafter_args) elif callafter: wx.CallAfter(callafter, *callafter_args) def extra_args_handler(self, event): if not hasattr(self, "extra_args"): self.extra_args = ExtraArgsFrame(self) self.extra_args.Center() if self.extra_args.IsShownOnScreen(): self.extra_args.Raise() else: self.extra_args.Show() def startup_sound_enable_handler(self, event): setcfg("startup_sound.enable", int(self.menuitem_startup_sound.IsChecked())) def use_fancy_progress_handler(self, event): setcfg("use_fancy_progress", int(self.menuitem_use_fancy_progress.IsChecked())) def use_separate_lut_access_handler(self, event): setcfg("use_separate_lut_access", int(self.menuitem_use_separate_lut_access.IsChecked())) self.update_displays(set_height=True) def do_not_use_video_lut_handler(self, event): do_not_use_video_lut = self.menuitem_do_not_use_video_lut.IsChecked() is_patterngenerator = config.is_patterngenerator() if do_not_use_video_lut != is_patterngenerator: dlg = ConfirmDialog(self, msg=lang.getstr("calibration.do_not_use_video_lut.warning"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-warning"), log=False) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: self.menuitem_do_not_use_video_lut.Check(is_patterngenerator) return setcfg("calibration.use_video_lut", int(not do_not_use_video_lut)) if not is_patterngenerator: setcfg("calibration.use_video_lut.backup", None) def skip_legacy_serial_ports_handler(self, event): setcfg("skip_legacy_serial_ports", int(self.menuitem_skip_legacy_serial_ports.IsChecked())) def calibrate_instrument_handler(self, event): self.worker.start(lambda result: show_result_dialog(result, self) if isinstance(result, Exception) else None, self.worker.calibrate_instrument_producer, fancy=False) def allow_skip_sensor_cal_handler(self, event): setcfg("allow_skip_sensor_cal", int(self.menuitem_allow_skip_sensor_cal.IsChecked())) def update_adjustment_controls(self): update_cal = getcfg("calibration.update") auto = self.get_measurement_mode() == "auto" do_cal = bool(getcfg("calibration.interactive_display_adjustment", False) or getcfg("trc")) enable = (not update_cal and not auto and do_cal) for option in ("whitepoint.colortemp", "whitepoint.x", "whitepoint.y", "calibration.luminance", "calibration.black_luminance", "calibration.interactive_display_adjustment"): backup = getcfg("%s.backup" % option, False) if auto and backup is None: # Backup current settings setcfg("%s.backup" % option, getcfg(option, False)) elif not auto and backup is not None: setcfg(option, getcfg("%s.backup" % option)) setcfg("%s.backup" % option, None) if auto or not do_cal: setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) self.whitepoint_colortemp_textctrl.Hide() self.whitepoint_colortemp_label.Hide() self.whitepoint_x_textctrl.Hide() self.whitepoint_x_label.Hide() self.whitepoint_y_textctrl.Hide() self.whitepoint_y_label.Hide() self.visual_whitepoint_editor_btn.Hide() self.whitepoint_measure_btn.Hide() self.luminance_ctrl.SetSelection(0) self.luminance_textctrl.Hide() self.luminance_textctrl_label.Hide() setcfg("calibration.luminance", None) self.black_luminance_textctrl.Hide() self.black_luminance_textctrl_label.Hide() setcfg("calibration.black_luminance", None) setcfg("calibration.interactive_display_adjustment", 0) self.whitepoint_ctrl.Enable(enable) self.luminance_ctrl.Enable(enable) self.black_luminance_ctrl.Enable(enable) self.interactive_display_adjustment_cb.Enable(not update_cal and not auto) self.interactive_display_adjustment_cb.SetValue(not update_cal and bool(int(getcfg("calibration.interactive_display_adjustment")))) self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(getcfg("whitepoint.colortemp")))) self.whitepoint_x_textctrl.SetValue(round(getcfg("whitepoint.x"), 4)) self.whitepoint_y_textctrl.SetValue(round(getcfg("whitepoint.y"), 4)) sel = self.whitepoint_ctrl.GetSelection() if getcfg("whitepoint.colortemp", False): self.whitepoint_ctrl.SetSelection(1) elif getcfg("whitepoint.x", False) and getcfg("whitepoint.y", False): self.whitepoint_ctrl.SetSelection(2) else: self.whitepoint_ctrl.SetSelection(0) self.whitepoint_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.whitepoint_ctrl), sel > -1 and self.whitepoint_ctrl.GetSelection() != sel) show_advanced_options = bool(getcfg("show_advanced_options")) for ctrl in (self.whitepoint_colortemp_locus_label, self.whitepoint_colortemp_locus_ctrl): ctrl.Show(self.whitepoint_ctrl.GetSelection() in (0, 1) and not auto and do_cal and show_advanced_options) for name in ("luminance", "black_luminance"): userconf = bool(getcfg("calibration." + name, False)) getattr(self, name + "_ctrl").SetSelection(int(userconf)) getattr(self, name + "_textctrl").SetValue(getcfg("calibration." + name)) if name == "black_luminance": userconf = show_advanced_options and userconf getattr(self, name + "_textctrl").Show(userconf) getattr(self, name + "_textctrl_label").Show(userconf) getattr(self, name + "_measure_btn").Show(userconf) def enable_3dlut_tab_handler(self, event): setcfg("3dlut.tab.enable", int(self.menuitem_enable_3dlut_tab.IsChecked())) setcfg("3dlut.tab.enable.backup", getcfg("3dlut.tab.enable")) if not getcfg("3dlut.tab.enable"): setcfg("3dlut.create", 0) self.lut3d_update_controls() self.update_main_controls() def enable_argyll_debug_handler(self, event): if not getcfg("argyll.debug"): dlg = ConfirmDialog(self, msg=lang.getstr("argyll.debug.warning1"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), log=False) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: self.menuitem_enable_argyll_debug.Check(False) return InfoDialog(self, msg=lang.getstr("argyll.debug.warning2"), bitmap=geticon(32, "dialog-warning"), log=False) setcfg("argyll.debug", int(self.menuitem_enable_argyll_debug.IsChecked())) def enable_dry_run_handler(self, event): setcfg("dry_run", int(self.menuitem_enable_dry_run.IsChecked())) self.menuitem_enable_argyll_debug.Enable(not self.menuitem_enable_dry_run.IsChecked()) def enable_menus(self, enable=True): for menu, label in self.menubar.GetMenus(): for item in menu.GetMenuItems(): item.Enable(enable) if enable: self.update_menus() def lut3d_check_bpc(self): if getcfg("3dlut.create") and getcfg("profile.black_point_compensation"): # Warn about BPC if creating 3D LUT dlg = ConfirmDialog(self, msg=lang.getstr("black_point_compensation.3dlut.warning"), ok=lang.getstr("turn_off"), cancel=lang.getstr("setting.keep_current"), bitmap=geticon(32, "dialog-warning")) if dlg.ShowModal() == wx.ID_OK: setcfg("profile.black_point_compensation", 0) self.update_bpc() def check_3dlut_relcol_rendering_intent(self): if (getcfg("3dlut.tab.enable") and getcfg("3dlut.rendering_intent") in ("a", "aa", "aw", "pa")): wx.CallAfter(self.lut3d_confirm_relcol_rendering_intent) def lut3d_confirm_relcol_rendering_intent(self): dlg = ConfirmDialog(self, msg=lang.getstr("3dlut.confirm_relcol_rendering_intent"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: self.lut3d_set_option("3dlut.rendering_intent", "r") self.lut3d_rendering_intent_ctrl.SetSelection(self.rendering_intents_ba[getcfg("3dlut.rendering_intent")]) def lut3d_create_cb_handler(self, event): v = int(self.lut3d_create_cb.GetValue()) if v != getcfg("3dlut.create"): self.profile_settings_changed() setcfg("3dlut.create", v) self.calpanel.Freeze() self.lut3d_show_trc_controls() self.lut3d_update_apply_cal_control() self.lut3d_update_b2a_controls() self.calpanel.Thaw() self.lut3d_check_bpc() self.update_main_controls() def lut3d_init_input_profiles(self): self.input_profiles = OrderedDict() for profile_filename in ["ACES.icm", "ACEScg.icm", "DCDM X'Y'Z'.icm", "Rec709.icm", "Rec2020.icm", "EBU3213_PAL.icm", "SMPTE_RP145_NTSC.icm", "SMPTE431_P3.icm", getcfg("3dlut.input.profile")]: if not os.path.isabs(profile_filename): profile_filename = get_data_path("ref/" + profile_filename) if profile_filename: try: profile = ICCP.ICCProfile(profile_filename) except (IOError, ICCP.ICCProfileInvalidError), exception: safe_print("%s:" % profile_filename, exception) else: if profile_filename not in self.input_profiles.values(): desc = profile.getDescription() desc = re.sub(r"\s*(?:color profile|primaries with " "\S+ transfer function)$", "", desc) self.input_profiles[desc] = profile_filename self.input_profiles.sort() self.lut3d_input_profile_ctrl.SetItems(self.input_profiles.keys()) def lut3d_input_colorspace_handler(self, event): if event: self.lut3d_set_option("3dlut.input.profile", self.input_profiles[self.lut3d_input_profile_ctrl.GetStringSelection()], event) lut3d_input_profile = ICCP.ICCProfile(getcfg("3dlut.input.profile")) if (lut3d_input_profile and "rTRC" in lut3d_input_profile.tags and "gTRC" in lut3d_input_profile.tags and "bTRC" in lut3d_input_profile.tags and lut3d_input_profile.tags.rTRC == lut3d_input_profile.tags.gTRC == lut3d_input_profile.tags.bTRC and isinstance(lut3d_input_profile.tags.rTRC, ICCP.CurveType)): tf = lut3d_input_profile.tags.rTRC.get_transfer_function(outoffset=1.0) # Set gamma to profile gamma if single gamma profile if tf[0][0].startswith("Gamma"): if not getcfg("3dlut.trc_gamma.backup", False): # Backup current gamma setcfg("3dlut.trc_gamma.backup", getcfg("3dlut.trc_gamma")) setcfg("3dlut.trc_gamma", round(tf[0][1], 2)) # Restore previous gamma if not single gamma # profile elif getcfg("3dlut.trc_gamma.backup", False): setcfg("3dlut.trc_gamma", getcfg("3dlut.trc_gamma.backup")) setcfg("3dlut.trc_gamma.backup", None) self.lut3d_update_trc_controls() self.lut3d_show_trc_controls() if getattr(self, "lut3dframe", None): self.lut3dframe.update_controls() self.lut3d_input_profile_ctrl.SetToolTipString( getcfg("3dlut.input.profile")) def lut3d_set_path(self, path=None): self.lut3d_path = self.worker.lut3d_get_filename(path) devlink = os.path.splitext(self.lut3d_path)[0] + profile_ext setcfg("measurement_report.devlink_profile", devlink) def lut3d_show_controls(self): show = True#bool(getcfg("3dlut.create")) self.lut3d_input_profile_label.Show(show) self.lut3d_input_profile_ctrl.Show(show) self.lut3d_show_trc_controls() self.lut3d_show_encoding_controls(show) self.lut3d_format_label.Show(show) self.lut3d_format_ctrl.Show(show) show_advanced_options = getcfg("show_advanced_options") for ctrl in (self.lut3d_apply_cal_cb, self.gamut_mapping_mode, self.gamut_mapping_inverse_a2b, self.gamut_mapping_b2a): ctrl.GetContainingSizer().Show(ctrl, show_advanced_options and show) for ctrl in (self.lut3d_size_label, self.lut3d_size_ctrl): ctrl.GetContainingSizer().Show(ctrl, show) def lut3d_update_apply_cal_control(self): profile = not getcfg("3dlut.create") and get_current_profile(True) enable_apply_cal = bool(getcfg("3dlut.create") or (profile and isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType))) self.lut3d_apply_cal_cb.SetValue(enable_apply_cal and bool(getcfg("3dlut.output.profile.apply_cal"))) self.lut3d_apply_cal_cb.Enable(enable_apply_cal) def lut3d_update_b2a_controls(self): # Allow using B2A instead of inverse A2B? if getcfg("3dlut.create"): allow_b2a_gamap = (getcfg("profile.type") in ("l", "x", "X") and getcfg("profile.b2a.hires")) else: profile = get_current_profile(True) allow_b2a_gamap = (profile and "B2A0" in profile.tags and isinstance(profile.tags.B2A0, ICCP.LUT16Type) and profile.tags.B2A0.clut_grid_steps >= 17) self.gamut_mapping_b2a.Enable(bool(allow_b2a_gamap)) if not allow_b2a_gamap: setcfg("3dlut.gamap.use_b2a", 0) self.gamut_mapping_inverse_a2b.SetValue( not getcfg("3dlut.gamap.use_b2a")) self.gamut_mapping_b2a.SetValue( bool(getcfg("3dlut.gamap.use_b2a"))) def lut3d_update_controls(self): self.lut3d_create_cb.SetValue(bool(getcfg("3dlut.create"))) lut3d_input_profile = getcfg("3dlut.input.profile") if not lut3d_input_profile in self.input_profiles.values(): if (not lut3d_input_profile or not os.path.isfile(lut3d_input_profile)): lut3d_input_profile = defaults["3dlut.input.profile"] setcfg("3dlut.input.profile", lut3d_input_profile) else: try: profile = ICCP.ICCProfile(lut3d_input_profile) except (IOError, ICCP.ICCProfileInvalidError), exception: safe_print("%s:" % lut3d_input_profile, exception) else: desc = profile.getDescription() desc = re.sub(r"\s*(?:color profile|primaries with " "\S+ transfer function)$", "", desc) self.input_profiles[desc] = lut3d_input_profile if lut3d_input_profile in self.input_profiles.values(): self.lut3d_input_profile_ctrl.SetSelection( self.input_profiles.values().index(lut3d_input_profile)) self.lut3d_input_colorspace_handler(None) self.lut3d_update_apply_cal_control() self.lut3d_update_b2a_controls() self.lut3d_update_shared_controls() self.lut3d_update_encoding_controls() self.lut3d_show_controls() def profile_quality_warning_handler(self, event): q = self.get_profile_quality() if q == "u": InfoDialog(self, msg=lang.getstr("quality.ultra.warning"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-warning"), log=False) def profile_quality_ctrl_handler(self, event): if debug: safe_print("[D] profile_quality_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) oldq = getcfg("profile.quality") q = self.get_profile_quality() if q == oldq: return if q == "l": self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.low")) elif q == "m": self.profile_quality_info.SetLabel(lang.getstr( "calibration.quality.medium")) elif q == "h": self.profile_quality_info.SetLabel(lang.getstr( "calibration.quality.high")) elif q == "u": self.profile_quality_info.SetLabel(lang.getstr( "calibration.quality.ultra")) self.profile_settings_changed() setcfg("profile.quality", q) self.update_profile_name() self.set_default_testchart(False) wx.CallAfter(self.check_testchart_patches_amount) def calibration_file_ctrl_handler(self, event): if debug: safe_print("[D] calibration_file_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) sel = self.calibration_file_ctrl.GetSelection() if sel > 0: self.load_cal_handler(None, path=self.recent_cals[sel]) else: self.cal_changed(setchanged=False) if getattr(self, "lut3dframe", None): self.lut3dframe.set_profile("output") if getattr(self, "reportframe", None): self.reportframe.set_profile("output") ### Set measurement report dest profile to current ##setcfg("measurement_report.output_profile", ##get_current_profile_path()) if (self.lut3d_settings_panel.IsShown() or self.mr_settings_panel.IsShown()): if self.mr_settings_panel.IsShown(): self.mr_update_controls() else: self.set_profile("output") if self.lut3d_settings_panel.IsShown(): self.lut3d_show_trc_controls() self.update_main_controls() def settings_discard_changes(self, sel=None, keep_changed_state=False): """ Update the calibration file control and remove the leading asterisk (*) from items """ if sel is None: sel = self.calibration_file_ctrl.GetSelection() if not keep_changed_state: setcfg("settings.changed", 0) items = self.calibration_file_ctrl.GetItems() changed = False for j, item in enumerate(items): #if j != sel and item[0] == "*": if item[0] == "*": items[j] = item[2:] changed = True if changed: self.calibration_file_ctrl.Freeze() self.calibration_file_ctrl.SetItems(items) self.calibration_file_ctrl.SetSelection(sel) self.calibration_file_ctrl.Thaw() def settings_confirm_discard(self): """ Show a dialog for user to confirm or cancel discarding changed settings """ sel = self.calibration_file_ctrl.GetSelection() cal = getcfg("calibration.file", False) or "" if not cal in self.recent_cals: self.recent_cals.append(cal) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) dlg = ConfirmDialog(self, msg=lang.getstr("warning.discard_changes"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return False self.settings_discard_changes(sel) return True def calibration_quality_ctrl_handler(self, event): if debug: safe_print("[D] calibration_quality_ctrl_handler called for ID %s " "%s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) q = self.get_calibration_quality() self.set_calibration_quality_label(q) if q != getcfg("calibration.quality"): self.profile_settings_changed() setcfg("calibration.quality", q) self.update_estimated_measurement_time("cal") self.update_profile_name() def set_calibration_quality_label(self, q): if q == "v": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.veryhigh")) elif q == "l": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.high")) elif q == "m": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.medium")) elif q == "h": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.low")) elif q == "u": self.calibration_quality_info.SetLabel( lang.getstr("calibration.speed.verylow")) def interactive_display_adjustment_ctrl_handler(self, event): if debug: safe_print("[D] interactive_display_adjustment_ctrl_handler called " "for ID %s %s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) v = int(self.interactive_display_adjustment_cb.GetValue()) if v != getcfg("calibration.interactive_display_adjustment"): setcfg("calibration.interactive_display_adjustment", v) self.profile_settings_changed() self.panel.Freeze() self.update_adjustment_controls() self.calpanel.Layout() self.calpanel.Refresh() self.panel.Thaw() self.update_main_controls() self.update_profile_name() def black_point_compensation_ctrl_handler(self, event): v = int(self.black_point_compensation_cb.GetValue()) if v != getcfg("profile.black_point_compensation"): self.profile_settings_changed() setcfg("profile.black_point_compensation", v) self.lut3d_check_bpc() def black_point_correction_auto_handler(self, event=None): if event: auto = self.black_point_correction_auto_cb.GetValue() setcfg("calibration.black_point_correction.auto", int(auto)) self.cal_changed() self.update_profile_name() else: auto = getcfg("calibration.black_point_correction.auto") self.black_point_correction_auto_cb.SetValue(bool(auto)) show = (self.trc_ctrl.GetSelection() > 0 and bool(getcfg("show_advanced_options")) and not auto) self.calpanel.Freeze() self.black_point_correction_ctrl.Show(show) self.black_point_correction_intctrl.Show(show) self.black_point_correction_intctrl_label.Show(show) self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() def black_point_correction_ctrl_handler(self, event): if debug: safe_print("[D] black_point_correction_ctrl_handler called for ID " "%s %s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) if event.GetId() == self.black_point_correction_intctrl.GetId(): self.black_point_correction_ctrl.SetValue( self.black_point_correction_intctrl.GetValue()) else: self.black_point_correction_intctrl.SetValue( self.black_point_correction_ctrl.GetValue()) v = self.get_black_point_correction() if float(v) != getcfg("calibration.black_point_correction"): self.cal_changed() setcfg("calibration.black_point_correction", v) self.black_point_rate_ctrl.Enable( getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"]) self.black_point_rate_floatctrl.Enable( getcfg("calibration.black_point_correction") < 1 and defaults["calibration.black_point_rate.enabled"]) self.update_profile_name() def black_point_rate_ctrl_handler(self, event): if debug: safe_print("[D] black_point_rate_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) if event.GetId() == self.black_point_rate_floatctrl.GetId(): self.black_point_rate_ctrl.SetValue( int(round(self.black_point_rate_floatctrl.GetValue() * 100))) else: self.black_point_rate_floatctrl.SetValue( self.black_point_rate_ctrl.GetValue() / 100.0) v = self.get_black_point_rate() if v != str(getcfg("calibration.black_point_rate")): self.cal_changed() setcfg("calibration.black_point_rate", v) self.update_profile_name() def black_output_offset_ctrl_handler(self, event): if debug: safe_print("[D] black_output_offset_ctrl_handler called for ID %s " "%s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) if event.GetId() == self.black_output_offset_intctrl.GetId(): self.black_output_offset_ctrl.SetValue( self.black_output_offset_intctrl.GetValue()) else: self.black_output_offset_intctrl.SetValue( self.black_output_offset_ctrl.GetValue()) v = self.get_black_output_offset() if float(v) != getcfg("calibration.black_output_offset"): self.cal_changed() setcfg("calibration.black_output_offset", v) self.update_profile_name() self.update_trc_control() #self.show_trc_controls(True) def visual_whitepoint_editor_handler(self, event): if not self.setup_patterngenerator(self): return display_name = config.get_display_name(None, True) if display_name == "madVR": # Disable gamma ramp self.worker.madtpg.set_device_gamma_ramp(None) # Disable 3D LUT self.worker.madtpg.disable_3dlut() if self.worker.madtpg.is_fullscreen(): # Leave fullscreen self.worker.madtpg.leave_fullscreen() elif display_name == "Prisma": # Disable 3D LUT try: self.worker.patterngenerator.disable_processing() except socket.error, exception: show_result_dialog(exception) return pos = self.GetDisplay().ClientArea[:2] geometry = None profile = None if (display_name in ("madVR", "Prisma", "Resolve", "Web @ localhost") or display_name.startswith("Chromecast ")): patterngenerator = self.worker.patterngenerator else: patterngenerator = None display_no = config.get_display_number(getcfg("display.number") - 1) try: display = wx.Display(display_no) except Exception, exception: safe_print("wx.Display(%s):" % display_no, exception) else: pos = display.ClientArea[:2] profile = config.get_current_profile(True) if profile and profile.fileName in self.presets: profile = None else: geometry = display.Geometry.Get() # Has to be tuple! display_name = display_name.replace("[PRIMARY]", lang.getstr("display.primary")) title = display_name + u" ‒ " + lang.getstr("whitepoint.visual_editor") self.wpeditor = VisualWhitepointEditor(self, pos=pos, title=title, patterngenerator=patterngenerator, geometry=geometry, profile=profile) if patterngenerator and CCPG and isinstance(patterngenerator, CCPG): self.wpeditor.Bind(wx.EVT_CLOSE, self.patterngenerator_disconnect) self.wpeditor.RealCenterOnScreen() self.wpeditor.Show() self.wpeditor.Raise() def patterngenerator_disconnect(self, event): try: self.worker.patterngenerator.disconnect_client() except Exception, exception: safe_print(exception) event.Skip() def luminance_measure_handler(self, event): if not self.setup_patterngenerator(self): return evtobjname = event.GetEventObject().Name if evtobjname == "luminance_measure_btn": color = wx.WHITE else: color = wx.BLACK if self.worker.patterngenerator: self.worker.patterngenerator.send(tuple(v / 255.0 for v in color[:3]), (0, 0, 0), x=0.25, y=0.25, w=0.5, h=0.5) frame = wx.Frame(self, title=lang.getstr("measureframe.title"), style=wx.DEFAULT_FRAME_STYLE | wx.FRAME_TOOL_WINDOW | wx.FRAME_FLOAT_ON_PARENT) frame.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) panel = wx.Panel(frame, size=(int(get_default_size()),) * 2) panel.SetBackgroundColour(color) if wx.Platform == "__WXMSW__": btncls = ThemedGenButton else: btncls = wx.Button measure_btn = btncls(panel, label=lang.getstr("measure"), name=evtobjname) measure_btn.Bind(wx.EVT_BUTTON, self.ambient_measure_handler) panel.Sizer = wx.FlexGridSizer(2, 3) panel.Sizer.Add((1,1)) panel.Sizer.Add((1,1)) panel.Sizer.Add((1,1)) panel.Sizer.AddGrowableRow(0) panel.Sizer.Add((1,1)) panel.Sizer.Add(measure_btn, flag=wx.ALL | wx.ALIGN_CENTER, border=12) panel.Sizer.Add((1,1)) panel.Sizer.AddGrowableCol(0) panel.Sizer.AddGrowableCol(2) frame.Sizer = wx.BoxSizer(wx.VERTICAL) frame.Sizer.Add(panel, 1, flag=wx.EXPAND) frame.Sizer.SetSizeHints(frame) frame.Sizer.Layout() if (self.worker.patterngenerator and CCPG and isinstance(self.worker.patterngenerator, CCPG)): frame.Bind(wx.EVT_CLOSE, self.patterngenerator_disconnect) frame.Show() self.measureframes.append(frame) def ambient_measure_handler(self, event): """ Start measuring ambient illumination """ if not check_set_argyll_bin(): return # Minimum Windows version: XP or Server 2003 if sys.platform == "win32" and sys.getwindowsversion() < (5, 1): show_result_dialog(Error(lang.getstr("windows.version.unsupported"))) return safe_print("-" * 80) safe_print(lang.getstr("ambient.measure")) self.stop_timers() evtobjname = event.GetEventObject().Name if evtobjname == "visual_whitepoint_editor_measure_btn": interactive_frame = event.GetEventObject().TopLevelParent while not isinstance(interactive_frame, VisualWhitepointEditor): # Floated panel interactive_frame = interactive_frame.Parent elif evtobjname in ("luminance_measure_btn", "black_luminance_measure_btn"): interactive_frame = "luminance" else: interactive_frame = "ambient" self.worker.interactive = interactive_frame not in ("ambient", "luminance") self.worker.start(self.ambient_measure_consumer, self.ambient_measure_producer, ckwargs={"evtobjname": evtobjname}, wkwargs={"interactive_frame": interactive_frame}, progress_title=lang.getstr("ambient.measure"), interactive_frame=interactive_frame) def ambient_measure_producer(self, interactive_frame): """ Process spotread output for ambient readings """ cmd = get_argyll_util("spotread") if interactive_frame != "ambient": # Emissive mode = "-e" else: # Ambient mode = "-a" args = ["-v", mode, "-x"] if getcfg("extra_args.spotread").strip(): args += parse_argument_string(getcfg("extra_args.spotread")) result = self.worker.add_measurement_features(args, False, allow_nondefault_observer=True, ambient=mode == "-a") if isinstance(result, Exception): return result return self.worker.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) def ambient_measure_consumer(self, result=None, evtobjname=None): self.start_timers() if not result or isinstance(result, Exception): if getattr(self.worker, "subprocess", None): self.worker.quit_terminate_cmd() if isinstance(result, Exception): show_result_dialog(result, self) return result = re.sub("[^\t\n\r\x20-\x7f]", "", "".join(self.worker.output)).strip() if getcfg("whitepoint.colortemp.locus") == "T": K = re.search("Planckian temperature += (\d+(?:\.\d+)?)K", result, re.I) else: K = re.search("Daylight temperature += (\d+(?:\.\d+)?)K", result, re.I) XYZ = re.search("XYZ: (\d+(?:\.\d+)) (\d+(?:\.\d+)) (\d+(?:\.\d+))", result) Yxy = re.search("Yxy: (\d+(?:\.\d+)) (\d+(?:\.\d+)) (\d+(?:\.\d+))", result) lux = re.search("Ambient = (\d+(?:\.\d+)) Lux", result, re.I) if not result or (not K and not XYZ and not Yxy and not lux): show_result_dialog(Error(result + lang.getstr("failure")), self) return safe_print(lang.getstr("success")) set_whitepoint = evtobjname in ("visual_whitepoint_editor_measure_btn", "whitepoint_measure_btn") set_ambient = evtobjname == "ambient_measure_btn" if (set_whitepoint and not set_ambient and lux and getcfg("show_advanced_options")): dlg = ConfirmDialog(self, msg=lang.getstr("ambient.set"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-question")) set_ambient = dlg.ShowModal() == wx.ID_OK dlg.Destroy() if set_ambient: if lux: self.ambient_viewcond_adjust_textctrl.SetValue(float(lux.groups()[0])) self.ambient_viewcond_adjust_cb.SetValue(True) self.ambient_viewcond_adjust_ctrl_handler( CustomEvent(wx.EVT_CHECKBOX.evtType[0], self.ambient_viewcond_adjust_cb)) else: show_result_dialog(Error(lang.getstr("ambient.measure.light_level.missing")), self) if not set_whitepoint and (K or Yxy): dlg = ConfirmDialog(self, msg=lang.getstr("whitepoint.set"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-question")) set_whitepoint = dlg.ShowModal() == wx.ID_OK dlg.Destroy() elif XYZ: if evtobjname == "luminance_measure_btn": self.luminance_textctrl.SetValue(float(XYZ.group(2))) self.luminance_ctrl_handler(CustomEvent(wx.EVT_CHOICE.evtType[0], self.luminance_ctrl)) elif evtobjname == "black_luminance_measure_btn": self.black_luminance_textctrl.SetValue(float(XYZ.group(2))) self.black_luminance_ctrl_handler(CustomEvent(wx.EVT_CHOICE.evtType[0], self.black_luminance_ctrl)) if set_whitepoint: if evtobjname == "visual_whitepoint_editor_measure_btn" and XYZ: RGB = [] for attribute in "rgb": RGB.append(getcfg("whitepoint.visual_editor." + attribute)) if max(RGB) < 255: # Set luminance self.luminance_ctrl.SetSelection(1) self.luminance_textctrl.SetValue(float(XYZ.group(2))) else: self.luminance_ctrl.SetSelection(0) self.luminance_ctrl_handler(CustomEvent(wx.EVT_CHOICE.evtType[0], self.luminance_ctrl)) setcfg("calibration.interactive_display_adjustment", 0) self.interactive_display_adjustment_cb.SetValue(False) if not K and not Yxy: # Monochrome reading? show_result_dialog(Error(lang.getstr("ambient.measure.color.unsupported", self.comport_ctrl.GetStringSelection())), self) return if K: if not Yxy: self.whitepoint_ctrl.SetSelection(1) self.whitepoint_colortemp_textctrl.SetValue(K.groups()[0]) if Yxy: if not K: self.whitepoint_ctrl.SetSelection(2) Y, x, y = Yxy.groups() self.whitepoint_x_textctrl.SetValue(round(float(x), 4)) self.whitepoint_y_textctrl.SetValue(round(float(y), 4)) self.whitepoint_ctrl_handler(CustomEvent(wx.EVT_CHOICE.evtType[0], self.whitepoint_ctrl)) def ambient_viewcond_adjust_ctrl_handler(self, event): if event.GetId() == self.ambient_viewcond_adjust_textctrl.GetId() and \ (not self.ambient_viewcond_adjust_cb.GetValue() or getcfg("calibration.ambient_viewcond_adjust.lux") == self.ambient_viewcond_adjust_textctrl.GetValue()): event.Skip() return if debug: safe_print("[D] ambient_viewcond_adjust_ctrl_handler called for ID " "%s %s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) if event.GetId() == self.ambient_viewcond_adjust_textctrl.GetId(): if self.ambient_viewcond_adjust_textctrl.GetValue(): self.ambient_viewcond_adjust_cb.SetValue(True) else: self.ambient_viewcond_adjust_cb.SetValue(False) if self.ambient_viewcond_adjust_cb.GetValue(): self.ambient_viewcond_adjust_textctrl.Enable() v = self.ambient_viewcond_adjust_textctrl.GetValue() if v: if v < 0.000001 or v > sys.maxint: wx.Bell() self.ambient_viewcond_adjust_textctrl.SetValue( getcfg("calibration.ambient_viewcond_adjust.lux")) if event.GetId() == self.ambient_viewcond_adjust_cb.GetId(): self.ambient_viewcond_adjust_textctrl.SetFocus() else: self.ambient_viewcond_adjust_textctrl.Disable() v1 = int(self.ambient_viewcond_adjust_cb.GetValue()) v2 = self.ambient_viewcond_adjust_textctrl.GetValue() if v1 != getcfg("calibration.ambient_viewcond_adjust") or \ v2 != getcfg("calibration.ambient_viewcond_adjust.lux", False): self.cal_changed() setcfg("calibration.ambient_viewcond_adjust", v1) setcfg("calibration.ambient_viewcond_adjust.lux", v2) self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() def ambient_viewcond_adjust_info_handler(self, event): InfoDialog(self, msg=lang.getstr("calibration.ambient_viewcond_adjust.info"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False) def black_luminance_ctrl_handler(self, event): if event.GetId() == self.black_luminance_textctrl.GetId() and ( self.black_luminance_ctrl.GetSelection() != 1 or getcfg("calibration.black_luminance") == self.black_luminance_textctrl.GetValue() or not self.black_luminance_ctrl.IsShown()): event.Skip() return if debug: safe_print("[D] black_luminance_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) self.calpanel.Freeze() if self.black_luminance_ctrl.GetSelection() == 1: # cd/m2 self.black_luminance_textctrl.Show() self.black_luminance_textctrl_label.Show() self.black_luminance_measure_btn.Show() try: v = self.black_luminance_textctrl.GetValue() if v < 0.000001 or v > 100000: raise ValueError() except ValueError: wx.Bell() self.black_luminance_textctrl.SetValue( getcfg("calibration.black_luminance")) if (event.GetId() == self.black_luminance_ctrl.GetId() and self.black_luminance_ctrl.GetSelection() == 1): self.black_luminance_textctrl.SetFocus() else: self.black_luminance_textctrl.Hide() self.black_luminance_textctrl_label.Hide() self.black_luminance_measure_btn.Hide() self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() v = self.get_black_luminance() if v != str(getcfg("calibration.black_luminance", False)): self.cal_changed() setcfg("calibration.black_luminance", v) self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() def luminance_ctrl_handler(self, event): if event.GetId() == self.luminance_textctrl.GetId() and ( self.luminance_ctrl.GetSelection() != 1 or getcfg("calibration.luminance") == self.luminance_textctrl.GetValue()): event.Skip() return if debug: safe_print("[D] luminance_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) self.calpanel.Freeze() if self.luminance_ctrl.GetSelection() == 1: # cd/m2 self.luminance_textctrl.Show() self.luminance_textctrl_label.Show() self.luminance_measure_btn.Show() try: v = self.luminance_textctrl.GetValue() if v < 0.000001 or v > 100000: raise ValueError() except ValueError: wx.Bell() self.luminance_textctrl.SetValue( getcfg("calibration.luminance")) if (event.GetId() == self.luminance_ctrl.GetId() and self.luminance_ctrl.GetSelection() == 1): self.luminance_textctrl.SetFocus() else: self.luminance_textctrl.Hide() self.luminance_textctrl_label.Hide() self.luminance_measure_btn.Hide() self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() v = self.get_luminance() if v != str(getcfg("calibration.luminance", False)): self.cal_changed() setcfg("calibration.luminance", v) self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() def whitepoint_colortemp_locus_ctrl_handler(self, event): if debug: safe_print("[D] whitepoint_colortemp_locus_ctrl_handler called for " "ID %s %s event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) v = self.get_whitepoint_locus() if v != getcfg("whitepoint.colortemp.locus"): setcfg("whitepoint.colortemp.locus", v) self.whitepoint_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.whitepoint_ctrl), False) self.profile_settings_changed() self.update_profile_name() def whitepoint_ctrl_handler(self, event, cal_changed=None): if event.GetId() == self.whitepoint_colortemp_textctrl.GetId() and ( self.whitepoint_ctrl.GetSelection() != 1 or str(int(getcfg("whitepoint.colortemp"))) == self.whitepoint_colortemp_textctrl.GetValue()): event.Skip() return if event.GetId() == self.whitepoint_x_textctrl.GetId() and ( self.whitepoint_ctrl.GetSelection() != 2 or round(getcfg("whitepoint.x"), 4) == round(self.whitepoint_x_textctrl.GetValue(), 4)): event.Skip() return if event.GetId() == self.whitepoint_y_textctrl.GetId() and ( self.whitepoint_ctrl.GetSelection() != 2 or round(getcfg("whitepoint.y"), 4) == round(self.whitepoint_y_textctrl.GetValue(), 4)): event.Skip() return if (event.GetEventObject() and hasattr(event.GetEventObject(), "IsShown") and not event.GetEventObject().IsShown()): event.Skip() return if debug: safe_print("[D] whitepoint_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) self.calpanel.Freeze() show_advanced_options = bool(getcfg("show_advanced_options")) if self.whitepoint_ctrl.GetSelection() == 2: # x,y chromaticity coordinates self.whitepoint_colortemp_locus_label.Hide() self.whitepoint_colortemp_locus_ctrl.Hide() self.whitepoint_colortemp_textctrl.Hide() self.whitepoint_colortemp_label.Hide() self.whitepoint_x_textctrl.Show() self.whitepoint_x_label.Show() self.whitepoint_y_textctrl.Show() self.whitepoint_y_label.Show() try: v = self.whitepoint_x_textctrl.GetValue() if v < 0 or v > 1: raise ValueError() except ValueError: wx.Bell() self.whitepoint_x_textctrl.SetValue(round(getcfg("whitepoint.x"), 4)) try: v = self.whitepoint_y_textctrl.GetValue() if v < 0 or v > 1: raise ValueError() except ValueError: wx.Bell() self.whitepoint_y_textctrl.SetValue(round(getcfg("whitepoint.y"), 4)) x = self.whitepoint_x_textctrl.GetValue() y = self.whitepoint_y_textctrl.GetValue() k = xyY2CCT(x, y, 1.0) if k: self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(math.ceil(k)))) else: self.whitepoint_colortemp_textctrl.SetValue("") if cal_changed is None: if not getcfg("whitepoint.colortemp", False) and \ x == getcfg("whitepoint.x") and \ y == getcfg("whitepoint.y"): cal_changed = False setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", x) setcfg("whitepoint.y", y) setcfg("3dlut.whitepoint.x", x) setcfg("3dlut.whitepoint.y", y) if (event.GetId() == self.whitepoint_ctrl.GetId() and self.whitepoint_ctrl.GetSelection() == 2 and not self.updatingctrls): self.whitepoint_x_textctrl.SetFocus() elif self.whitepoint_ctrl.GetSelection() == 1: # Color temperature self.whitepoint_colortemp_locus_label.Show(show_advanced_options) self.whitepoint_colortemp_locus_ctrl.Show(show_advanced_options) self.whitepoint_colortemp_textctrl.Show() self.whitepoint_colortemp_label.Show() self.whitepoint_x_textctrl.Hide() self.whitepoint_x_label.Hide() self.whitepoint_y_textctrl.Hide() self.whitepoint_y_label.Hide() try: v = float( self.whitepoint_colortemp_textctrl.GetValue().replace( ",", ".")) if v < 1000 or v > 15000: raise ValueError() self.whitepoint_colortemp_textctrl.SetValue(str(stripzeros(v))) except ValueError: wx.Bell() self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(getcfg("whitepoint.colortemp")))) v = float(self.whitepoint_colortemp_textctrl.GetValue()) if cal_changed is None: if getcfg("whitepoint.colortemp") == v and not \ getcfg("whitepoint.x", False) and not getcfg("whitepoint.y", False): cal_changed = False setcfg("whitepoint.colortemp", int(v)) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) if (event.GetId() == self.whitepoint_ctrl.GetId() and self.whitepoint_ctrl.GetSelection() == 1 and not self.updatingctrls): self.whitepoint_colortemp_textctrl.SetFocus() self.whitepoint_colortemp_textctrl.SelectAll() else: # "As measured" self.whitepoint_colortemp_locus_label.Show(show_advanced_options) self.whitepoint_colortemp_locus_ctrl.Show(show_advanced_options) self.whitepoint_colortemp_textctrl.Hide() self.whitepoint_colortemp_label.Hide() self.whitepoint_x_textctrl.Hide() self.whitepoint_x_label.Hide() self.whitepoint_y_textctrl.Hide() self.whitepoint_y_label.Hide() if (cal_changed is None and not getcfg("whitepoint.colortemp", False) and not getcfg("whitepoint.x", False) and not getcfg("whitepoint.y", False)): cal_changed = False setcfg("whitepoint.colortemp", None) self.whitepoint_colortemp_textctrl.SetValue( str(stripzeros(getcfg("whitepoint.colortemp")))) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) setcfg("3dlut.whitepoint.x", None) setcfg("3dlut.whitepoint.y", None) self.visual_whitepoint_editor_btn.Show(self.whitepoint_ctrl.GetSelection() > 0) self.whitepoint_measure_btn.Show(self.whitepoint_ctrl.GetSelection() > 0) self.calpanel.Layout() self.calpanel.Refresh() self.calpanel.Thaw() self.show_observer_ctrl() if self.whitepoint_ctrl.GetSelection() == 1: # Color temperature if getcfg("whitepoint.colortemp.locus") == "T": # Planckian locus xyY = planckianCT2xyY(getcfg("whitepoint.colortemp")) else: # Daylight locus xyY = CIEDCCT2xyY(getcfg("whitepoint.colortemp")) if xyY: self.whitepoint_x_textctrl.SetValue(round(xyY[0], 4)) self.whitepoint_y_textctrl.SetValue(round(xyY[1], 4)) setcfg("3dlut.whitepoint.x", xyY[0]) setcfg("3dlut.whitepoint.y", xyY[1]) else: self.whitepoint_x_textctrl.SetValue(0) self.whitepoint_y_textctrl.SetValue(0) setcfg("3dlut.whitepoint.x", None) setcfg("3dlut.whitepoint.y", None) if cal_changed is None and not self.updatingctrls: self.profile_settings_changed() self.update_profile_name() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() if (cal_changed is not False and not self.updatingctrls and not getcfg("3dlut.whitepoint.x", False) and not getcfg("3dlut.whitepoint.y", False)): # Should change 3D LUT rendering intent to rel col? wx.CallAfter(self.check_3dlut_relcol_rendering_intent) def trc_type_ctrl_handler(self, event): if debug: safe_print("[D] trc_type_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) v = self.get_trc_type() if v != getcfg("trc.type"): setcfg("trc.type", v) self.cal_changed() self.update_profile_name() self.update_trc_control() self.show_trc_controls(True) def trc_ctrl_handler(self, event, cal_changed=True): if event.GetId() == self.trc_textctrl.GetId() and ( self.trc_ctrl.GetSelection() not in (1, 4, 7) or stripzeros(getcfg("trc")) == stripzeros(self.trc_textctrl.GetValue())): event.Skip() self.show_trc_controls(True) return if debug: safe_print("[D] trc_ctrl_handler called for ID %s %s event type %s " "%s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) self.panel.Freeze() unload_cal = True if event.GetId() == self.trc_ctrl.GetId(): bt1886 = (getcfg("trc.type") == "G" and getcfg("calibration.black_output_offset") == 0 and getcfg("trc") == 2.4) if self.trc_ctrl.GetSelection() == 1: # Gamma 2.2 self.trc_textctrl.SetValue("2.2") setcfg("trc.type", "g") self.trc_type_ctrl.SetSelection(0) setcfg("calibration.black_output_offset", 1) self.black_output_offset_ctrl.SetValue(100) self.black_output_offset_intctrl.SetValue(100) elif self.trc_ctrl.GetSelection() == 4: # BT.1886 if not bt1886 and not getcfg("trc.backup", False): setcfg("trc.backup", self.trc_textctrl.GetValue().replace(",", ".")) setcfg("trc.type.backup", getcfg("trc.type")) setcfg("calibration.black_output_offset.backup", getcfg("calibration.black_output_offset")) self.trc_textctrl.SetValue("2.4") setcfg("trc.type", "G") self.trc_type_ctrl.SetSelection(1) setcfg("calibration.black_output_offset", 0) self.black_output_offset_ctrl.SetValue(0) self.black_output_offset_intctrl.SetValue(0) elif self.trc_ctrl.GetSelection() not in (0, 1, 7): self.restore_trc_backup() if getcfg("calibration.black_output_offset.backup") is not None: setcfg("calibration.black_output_offset", getcfg("calibration.black_output_offset.backup")) setcfg("calibration.black_output_offset.backup", None) self.update_black_output_offset_ctrl() elif self.trc_ctrl.GetSelection() == 0: # As measured unload_cal = False if self.trc_ctrl.GetSelection() in (1, 4, 7): try: v = float(self.trc_textctrl.GetValue().replace(",", ".")) if v == 0 or v > 10: raise ValueError() except ValueError: wx.Bell() self.trc_textctrl.SetValue(str(getcfg("trc"))) else: if str(v) != self.trc_textctrl.GetValue(): self.trc_textctrl.SetValue(str(v)) if (event.GetId() == self.trc_ctrl.GetId() and self.trc_ctrl.GetSelection() == 7): # Have to use CallAfter, otherwise only part of the text will # be selected (wxPython bug?) wx.CallAfter(self.trc_textctrl.SetFocus) wx.CallLater(1, self.trc_textctrl.SelectAll) trc = self.get_trc() if cal_changed: if trc != str(getcfg("trc")): if unload_cal: self.cal_changed() else: self.worker.options_dispcal = [] self.profile_settings_changed() setcfg("trc", trc) if cal_changed: self.update_profile_name() if event.GetId() != self.trc_ctrl.GetId(): self.update_trc_control() else: self.lut3d_update_apply_cal_control() self.update_adjustment_controls() self.show_trc_controls() self.calpanel.Layout() self.calpanel.Refresh() self.panel.Thaw() self.set_size(True) self.update_scrollbars() self.update_main_controls() if event.GetEventType() == wx.EVT_KILL_FOCUS.evtType[0]: event.Skip() if (trc in ("240", "709", "s") and not (bool(int(getcfg("calibration.ambient_viewcond_adjust"))) and getcfg("calibration.ambient_viewcond_adjust.lux")) and getcfg("trc.should_use_viewcond_adjust.show_msg") and getcfg("show_advanced_options")): dlg = InfoDialog(self, msg=lang.getstr("trc.should_use_viewcond_adjust"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), show=False, log=False) chk = wx.CheckBox(dlg, -1, lang.getstr("dialog.do_not_show_again")) dlg.Bind(wx.EVT_CHECKBOX, self.should_use_viewcond_adjust_handler, id=chk.GetId()) dlg.sizer3.Add(chk, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ShowModalThenDestroy() def restore_trc_backup(self): if getcfg("trc.backup"): setcfg("trc", getcfg("trc.backup")) setcfg("trc.backup", None) self.trc_textctrl.SetValue(str(getcfg("trc"))) if getcfg("trc.type.backup"): setcfg("trc.type", getcfg("trc.type.backup")) setcfg("trc.type.backup", None) self.trc_type_ctrl.SetSelection( self.trc_types_ba.get(getcfg("trc.type"), self.trc_types_ba.get(defaults["trc.type"]))) def should_use_viewcond_adjust_handler(self, event): setcfg("trc.should_use_viewcond_adjust.show_msg", int(not event.GetEventObject().GetValue())) def check_overwrite(self, ext="", filename=None): if not filename: filename = getcfg("profile.name.expanded") + ext dst_file = os.path.join(getcfg("profile.save_path"), getcfg("profile.name.expanded"), filename) else: dst_file = os.path.join(getcfg("profile.save_path"), filename) if os.path.exists(dst_file): dlg = ConfirmDialog(self, msg=lang.getstr("warning.already_exists", filename), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return False return True def measure_uniformity_handler(self, event): """ Start measuring display device uniformity """ dlg = ConfirmDialog(self, msg=lang.getstr("patch.layout.select"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(sizer, flag=wx.TOP, border=12) cols = wx.Choice(dlg, -1, choices=map(str, config.valid_values["uniformity.cols"])) rows = wx.Choice(dlg, -1, choices=map(str, config.valid_values["uniformity.rows"])) cols.SetStringSelection(str(getcfg("uniformity.cols"))) rows.SetStringSelection(str(getcfg("uniformity.rows"))) sizer.Add(cols, flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(wx.StaticText(dlg, -1, "x"), flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=4) sizer.Add(rows, flag=wx.ALIGN_CENTER_VERTICAL) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() result = dlg.ShowModal() if result == wx.ID_OK: setcfg("uniformity.cols", int(cols.GetStringSelection())) setcfg("uniformity.rows", int(rows.GetStringSelection())) dlg.Destroy() if result != wx.ID_OK: return if isinstance(getattr(self.worker, "terminal", None), DisplayUniformityFrame): self.worker.terminal.Destroy() self.worker.terminal = None self.HideAll() self.worker.interactive = True self.worker.start(self.measure_uniformity_consumer, self.measure_uniformity_producer, resume=False, continue_next=False, interactive_frame="uniformity") def measure_uniformity_producer(self): cmd, args = get_argyll_util("spotread"), ["-v", "-e", "-T"] if cmd: result = self.worker.add_measurement_features(args, display=False) if isinstance(result, Exception): return result return self.worker.exec_cmd(cmd, args, skip_scripts=True) else: wx.CallAfter(show_result_dialog, Error(lang.getstr("argyll.util.not_found", "spotread")), self) def measure_uniformity_consumer(self, result): self.Show() if isinstance(result, Exception): show_result_dialog(result, self) if getcfg("dry_run"): return for i, line in enumerate(self.worker.output): if line.startswith("spotread: Warning"): show_result_dialog(Warn(line.strip()), self) def profile_share_get_meta_error(self, profile): """ Check for required metadata in profile to allow sharing. The treshold for average delta E 1976 is 1.0 """ if ("meta" in profile.tags and isinstance(profile.tags.meta, ICCP.DictType)): try: avg_dE76 = float(profile.tags.meta.getvalue("ACCURACY_dE76_avg")) except (TypeError, ValueError): return lang.getstr("profile.share.meta_missing") else: threshold = 1.0 if avg_dE76 and avg_dE76 > threshold: return lang.getstr("profile.share.avg_dE_too_high", ("%.2f" % avg_dE76, "%.2f" % threshold)) else: # Check for EDID metadata metadata = profile.tags.meta if "EDID_mnft" in metadata: # Check and correct manufacturer if necessary manufacturer = get_manufacturer_name(metadata["EDID_mnft"]) if manufacturer: manufacturer = colord.quirk_manufacturer(manufacturer) if (not "EDID_manufacturer" in metadata or metadata["EDID_manufacturer"] != manufacturer): metadata["EDID_manufacturer"] = manufacturer if (not "EDID_model_id" in metadata or (not "EDID_model" in metadata and metadata["EDID_model_id"] == "0") or not "EDID_mnft_id" in metadata or not "EDID_mnft" in metadata or not "EDID_manufacturer" in metadata or not "OPENICC_automatic_generated" in metadata): return lang.getstr("profile.share.meta_missing") if ("B2A0" in profile.tags and isinstance(profile.tags.B2A0, ICCP.LUT16Type) and profile.tags.B2A0.input_entries_count < 1024): # 1024 is the Argyll value for a medium quality profile return lang.getstr("profile.share.b2a_resolution_too_low") else: return lang.getstr("profile.share.meta_missing") def profile_share_handler(self, event): """ Share ICC profile via http://icc.opensuse.org """ # Select profile profile = get_current_profile(include_display_profile=True) ignore = not profile or self.profile_share_get_meta_error(profile) kwargs = {"ignore_current_profile": ignore, "prefer_current_profile": isinstance(event.EventObject, wx.Button), "title": lang.getstr("profile.share")} profile = self.select_profile(**kwargs) if not profile: return # Check meta and profcheck data error = self.profile_share_get_meta_error(profile) if error: InfoDialog(getattr(self, "modaldlg", self), msg=error, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return # Get options from profile options_dispcal, options_colprof = get_options_from_profile(profile) gamma = None for option in options_dispcal: if option.startswith("g") or option.startswith("G"): option = option[1:] gamma = {"240": "SMPTE 240M", "709": "Rec. 709", "l": "L*", "s": "sRGB"}.get(option, "Gamma %s" % option) metadata = profile.tags.meta # Model will be shown in overview on http://icc.opensuse.org model = metadata.getvalue("EDID_model", profile.getDeviceModelDescription() or metadata["EDID_model_id"], None) description = model date = metadata.getvalue("EDID_date", "", None).split("-T") if len(date) == 2: year = int(date[0]) week = int(date[1]) date = datetime.date(int(year), 1, 1) + datetime.timedelta(weeks=week) description += " '" + strftime("%y", date.timetuple()) if isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType): if profile.tags.vcgt.is_linear(): vcgt = "linear VCGT" else: vcgt = "VCGT" else: vcgt = "no VCGT" if vcgt: description += ", " + vcgt whitepoint = "%iK" % round(XYZ2CCT(*profile.tags.wtpt.values())) description += ", " + whitepoint description += u", %i cd/m²" % profile.tags.lumi.Y if gamma: description += ", " + gamma instrument = metadata.getvalue("MEASUREMENT_device") if instrument: for instrument_name in instruments: if instrument_name.lower() == instrument: instrument = instrument_name break description += ", " + instrument description += ", " + strftime("%Y-%m-%d", profile.dateTime.timetuple()) dlg = ConfirmDialog( getattr(self, "modaldlg", self), title=lang.getstr("profile.share"), msg=lang.getstr("profile.share.enter_info"), ok=lang.getstr("upload"), cancel=lang.getstr("cancel"), bitmap=geticon(32, appname + "-profile-info"), alt=lang.getstr("save"), wrap=100) # Description field boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("description")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.description_txt_ctrl = wx.TextCtrl(dlg, -1, description) boxsizer.Add(dlg.description_txt_ctrl, 1, flag=wx.ALL | wx.EXPAND, border=4) # Display properties boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("display.properties")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) box_gridsizer = wx.FlexGridSizer(0, 1, 0, 0) boxsizer.Add(box_gridsizer, 1, flag=wx.ALL, border=4) # Display panel surface type, connection gridsizer = wx.FlexGridSizer(0, 4, 4, 8) box_gridsizer.Add(gridsizer, 1, wx.ALIGN_LEFT) # Panel surface type gridsizer.Add(wx.StaticText(dlg, -1, lang.getstr("panel.surface")), 1, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL) paneltypes = ["glossy", "matte"] dlg.panel_ctrl = wx.Choice(dlg, -1, choices=[""] + [lang.getstr(panel) for panel in paneltypes]) panel_surface = metadata.getvalue("SCREEN_surface", "") try: index = dlg.panel_ctrl.GetItems().index(lang.getstr(panel_surface)) except ValueError: index = 0 dlg.panel_ctrl.SetSelection(index) gridsizer.Add(dlg.panel_ctrl, 1, flag=wx.RIGHT | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, border=8) # Connection type gridsizer.Add(wx.StaticText(dlg, -1, lang.getstr("display.connection.type")), 1, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL) connections = ["dvi", "displayport", "hdmi", "internal", "vga"] dlg.connection_ctrl = wx.Choice(dlg, -1, choices=[lang.getstr(contype) for contype in connections]) connection_type = metadata.getvalue("CONNECTION_type", "dvi") try: index = dlg.connection_ctrl.GetItems().index(lang.getstr(connection_type)) except ValueError: index = 0 dlg.connection_ctrl.SetSelection(index) gridsizer.Add(dlg.connection_ctrl, 1, flag=wx.RIGHT | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, border=8) if sys.platform == "darwin": display_settings_tabs = wx.Notebook(dlg, -1) else: display_settings_tabs = aui.AuiNotebook(dlg, -1, style=aui.AUI_NB_TOP) display_settings_tabs._agwFlags = aui.AUI_NB_TOP try: art = AuiBetterTabArt() if sys.platform == "win32": art.SetDefaultColours(aui.StepColour(dlg.BackgroundColour, 96)) display_settings_tabs.SetArtProvider(art) except Exception, exception: safe_print(exception) pass dlg.display_settings = display_settings_tabs # Column layout scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 display_settings = ((# 1st tab lang.getstr("osd") + ": " + lang.getstr("settings.basic"), # Tab title 2, # Number of columns (# 1st (left) column (("preset", 150), ("brightness", 50), ("contrast", 50), ("trc.gamma", 50), ("blacklevel", 50), ("hue", 50)), # 2nd (right) column (("", 0), ("whitepoint.colortemp", 125), ("whitepoint", 50), ("saturation", 50)))), (# 2nd tab lang.getstr("osd") + ": " + lang.getstr("settings.additional"), # Tab title 3, # Number of columns (# 1st (left) column (("hue", 50), ), # 2nd (middle) column (("offset", 50), ), # 3rd (right) column (("saturation", 50), )))) display_settings_ctrls = [] for tab_num, settings in enumerate(display_settings): panel = wx.Panel(display_settings_tabs, -1) panel.SetSizer(wx.BoxSizer(wx.VERTICAL)) gridsizer = wx.FlexGridSizer(0, settings[1] * 2, 4, 12) panel.GetSizer().Add(gridsizer, 1, wx.ALL | wx.EXPAND, border=8) display_settings_tabs.AddPage(panel, settings[0]) ctrls = [] texts = [] for column in settings[2]: for name, width in column: if name in ("whitepoint", ): components = ("red", "green", "blue") elif tab_num == 1 and name in ("hue", "offset", "saturation"): components = ("red", "green", "blue", "cyan", "magenta", "yellow") else: components = ("", ) nameprefix = name for component in components: if component: name = nameprefix + "_" + component if name: label = name if ("_" in label): label = label.split("_") for i, part in enumerate(label): label[i] = lang.getstr(part) label = " ".join(label) else: label = lang.getstr(label) text = wx.StaticText(panel, -1, label) ctrl = wx.TextCtrl(panel, -1, metadata.getvalue("OSD_settings_%s" % re.sub("[ .]", "_", name), ""), size=(width * scale, -1), name=name) else: text = (0, 0) ctrl = (0, 0) texts.append(text) ctrls.append(ctrl) display_settings_ctrls.append(ctrl) # Add the controls to the sizer rows = int(math.ceil(len(ctrls) / float(settings[1]))) for row_num in range(rows): for column_num in range(settings[1]): ctrl_index = row_num + column_num * rows if ctrl_index < len(ctrls): gridsizer.Add(texts[ctrl_index], 1, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT) gridsizer.Add(ctrls[ctrl_index], 1, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.RIGHT, border=4) if isinstance(display_settings_tabs, aui.AuiNotebook): if sys.platform != "win32": display_settings_tabs.SetTabCtrlHeight(display_settings_tabs.GetTabCtrlHeight() + 2) height = display_settings_tabs.GetHeightForPageHeight(panel.Sizer.MinSize[1]) else: height = -1 display_settings_tabs.SetMinSize((dlg.sizer3.MinSize[0] - 16, height)) box_gridsizer.Add(display_settings_tabs, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=8) # License field ##dlg.sizer3.Add(wx.StaticText(dlg, -1, lang.getstr("license")), 1, ##flag=wx.TOP | wx.ALIGN_LEFT, border=12) ##dlg.license_ctrl = wx.Choice(dlg, -1, ##choices=["http://www.color.org/registry/icc_license_2011.txt", ##"http://www.gzip.org/zlib/zlib_license.html"]) ##dlg.license_ctrl.SetSelection(0) ##sizer4 = wx.BoxSizer(wx.HORIZONTAL) ##dlg.sizer3.Add(sizer4, 1, ##flag=wx.TOP | wx.ALIGN_LEFT, border=4) ##sizer4.Add(dlg.license_ctrl, 1, ##flag=wx.RIGHT | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, ##border=8) # License link button ##dlg.license_link_ctrl = wx.BitmapButton(dlg, -1, ##geticon(16, "dialog-information"), ##style=wx.NO_BORDER) ##dlg.license_link_ctrl.SetToolTipString(lang.getstr("license")) ##dlg.Bind(wx.EVT_BUTTON, ##lambda event: launch_file(dlg.license_ctrl.GetValue()), ##dlg.license_link_ctrl) ##sizer4.Add(dlg.license_link_ctrl, flag=wx.ALIGN_LEFT | ##wx.ALIGN_CENTER_VERTICAL) # Link to ICC Profile Taxi service hyperlink = HyperLinkCtrl(dlg.buttonpanel, -1, label="icc.opensuse.org", URL="https://icc.opensuse.org/") dlg.sizer2.Insert(0, hyperlink, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=int(round((32 + 12) * scale))) dlg.description_txt_ctrl.SetFocus() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() if result == wx.ID_CANCEL: return # Get meta prefix prefixes = (metadata.getvalue("prefix", "", None) or "CONNECTION_").split(",") if not "CONNECTION_" in prefixes: prefixes.append("CONNECTION_") # Update meta panel = dlg.panel_ctrl.GetSelection() if panel > 0: metadata["SCREEN_surface"] = paneltypes[panel - 1] if not "SCREEN_" in prefixes: prefixes.append("SCREEN_") # Update meta metadata["CONNECTION_type"] = connections[dlg.connection_ctrl.GetSelection()] for ctrl in display_settings_ctrls: if isinstance(ctrl, wx.TextCtrl) and ctrl.GetValue().strip(): metadata["OSD_settings_%s" % re.sub("[ .]", "_", ctrl.Name)] = ctrl.GetValue().strip() if not "OSD_" in prefixes: prefixes.append("OSD_") # Set meta prefix metadata["prefix"] = ",".join(prefixes) # Calculate profile ID profile.calculateID() # Save profile try: profile.write() except EnvironmentError, exception: show_result_dialog(exception, self) if result != wx.ID_OK: return # Get profile data data = profile.data # Add metadata which should not be reflected in profile metadata["model"] = model metadata["vcgt"] = int("vcgt" in profile.tags) # Upload params = {"description": dlg.description_txt_ctrl.GetValue(), ##"licence": dlg.license_ctrl.GetValue()} "licence": "http://www.color.org/registry/icc_license_2011.txt"} files = [("metadata", "metadata.json", '{"org":{"freedesktop":{"openicc":{"device":{"monitor":[%s]}}}}}' % metadata.to_json()), ("profile", "profile.icc", data)] self.worker.interactive = False self.worker.start(self.profile_share_consumer, http_request, ckwargs={}, wkwargs={"domain": domain.lower() if test else "icc.opensuse.org", "request_type": "POST", "path": "/print_r_post.php" if test else "/upload", "params": params, "files": files}, progress_msg=lang.getstr("profile.share"), stop_timers=False, cancelable=False, show_remaining_time=False, fancy=False) def profile_share_consumer(self, result, parent=None): """ This function receives the response from the profile upload """ if result is not False: safe_print(safe_unicode(result.read().strip(), "UTF-8")) parent = parent or getattr(self, "modaldlg", self) dlg = InfoDialog(parent, msg=lang.getstr("profile.share.success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), show=False) # Link to ICC Profile Taxi service hyperlink = HyperLinkCtrl(dlg.buttonpanel, -1, label="icc.opensuse.org", URL="https://icc.opensuse.org/") border = (dlg.sizer3.MinSize[0] - dlg.sizer2.MinSize[0] - hyperlink.Size[0]) if border < 24: border = 24 dlg.sizer2.Insert(0, hyperlink, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=border) dlg.sizer2.Insert(0, (44, 1)) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg.ShowModalThenDestroy(parent) def install_argyll_instrument_conf(self, event=None, uninstall=False): if uninstall: filenames = self.worker.get_argyll_instrument_conf("installed") if filenames: dlgs = [] dlg = ConfirmDialog(self, title=lang.getstr("argyll.instrument.configuration_files.uninstall"), msg=lang.getstr("dialog.confirm_uninstall"), ok=lang.getstr("uninstall"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) dlgs.append(dlg) dlg.sizer3.Add((0, 8)) chks = [] for filename in filenames: dlg.sizer3.Add((0, 4)) chk = wx.CheckBox(dlg, -1, filename) chks.append(chk) chk.SetValue(True) dlg.sizer3.Add(chk, flag=wx.ALIGN_LEFT) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() filenames = [] if result == wx.ID_OK: for chk in chks: if chk.GetValue(): filenames.append(chk.Label) for filename in filenames: if os.path.dirname(filename) == "/lib/udev/rules.d": dlg = ConfirmDialog(self, title=lang.getstr("argyll.instrument.configuration_files.uninstall"), msg=lang.getstr("warning.system_file", filename), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) dlgs.append(dlg) result = dlg.ShowModal() if result != wx.ID_OK: break for dlg in dlgs: dlg.Destroy() if not filenames or result != wx.ID_OK: return cmd = "rm" else: filenames = None cmd = "cp" result = self.worker.authenticate(which(cmd)) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, self) return self.worker.start(self.install_argyll_instrument_conf_consumer, self.worker.install_argyll_instrument_conf, ckwargs={"uninstall": uninstall}, wkwargs={"uninstall": uninstall, "filenames": filenames}, fancy=False) def install_argyll_instrument_conf_consumer(self, result, uninstall=False): if isinstance(result, Exception): show_result_dialog(result, self) elif result is False: show_result_dialog(Error("".join(self.worker.errors)), self) else: self.update_menus() if uninstall: msgid = "argyll.instrument.configuration_files.uninstall.success" else: msgid = "argyll.instrument.configuration_files.install.success" show_result_dialog(Info(lang.getstr(msgid)), self) def install_argyll_instrument_drivers(self, event=None, uninstall=False): if uninstall: title = "argyll.instrument.drivers.uninstall" msg = "argyll.instrument.drivers.uninstall.confirm" ok = "continue" else: title = "argyll.instrument.drivers.install" msg = "argyll.instrument.drivers.install.confirm" ok = "download_install" dlg = ConfirmDialog(self, title=lang.getstr(title), msg=lang.getstr(msg), ok=lang.getstr(ok).replace("&", "&&"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) dlg.launch_devman = wx.CheckBox(dlg, -1, lang.getstr("device_manager.launch")) dlg.launch_devman.SetValue(uninstall) dlg.sizer3.Add(dlg.launch_devman, flag=wx.TOP | wx.ALIGN_LEFT, border=12) if hasattr(dlg.ok, "SetAuthNeeded"): dlg.ok.SetAuthNeeded(True) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() result = dlg.ShowModal() launch_devman = dlg.launch_devman.IsChecked() dlg.Destroy() if result != wx.ID_OK: return safe_print("-" * 80) safe_print(lang.getstr(title)) self.worker.start(lambda result: show_result_dialog(result, self) if isinstance(result, Exception) else self.check_update_controls(True), self.worker.install_argyll_instrument_drivers, wargs=(uninstall, launch_devman), fancy=False) def uninstall_argyll_instrument_conf(self, event=None): self.install_argyll_instrument_conf(uninstall=True) def uninstall_argyll_instrument_drivers(self, event=None): self.install_argyll_instrument_drivers(uninstall=True) def install_profile_handler(self, event=None, profile_path=None, install_3dlut=None): """ Install a profile. Show an error dialog if the profile is invalid or unsupported (only 'mntr' RGB profiles are allowed) """ if not check_set_argyll_bin(): return if profile_path is None: profile_path = getcfg("calibration.file", False) if profile_path: result = check_file_isfile(profile_path) if isinstance(result, Exception): show_result_dialog(result, self) else: result = False if install_3dlut is None: install_3dlut = self.lut3d_settings_panel.IsShown() if not isinstance(result, Exception) and result: try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + profile_path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if profile.profileClass != "mntr" or \ profile.colorSpace != "RGB": InfoDialog(self, msg=lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace)) + "\n" + profile_path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return setcfg("calibration.file.previous", getcfg("calibration.file", False)) self.profile_finish( True, profile_path=profile_path, skip_scripts=True, allow_show_log=False, install_3dlut=install_3dlut) def select_install_profile_handler(self, event): """ Show a dialog for user to select a profile for installation """ defaultDir, defaultFile = get_verified_path("last_icc_path") dlg = wx.FileDialog(self, lang.getstr("install_display_profile"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc") + "|*.icc;*.icm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result == wx.ID_OK: setcfg("last_icc_path", path) setcfg("last_cal_or_icc_path", path) self.install_profile_handler(profile_path=path, install_3dlut=False) def load_profile_cal_handler(self, event): """ Show a dialog for user to select a profile to load calibration (vcgt) from. """ if not check_set_argyll_bin(): return defaultDir, defaultFile = get_verified_path("last_cal_or_icc_path") dlg = wx.FileDialog(self, lang.getstr("calibration.load_from_cal_or_profile"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.cal_icc") + "|*.cal;*.icc;*.icm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result == wx.ID_OK: if not os.path.exists(path): InfoDialog(self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return setcfg("last_cal_or_icc_path", path) if verbose >= 1: safe_print(lang.getstr("calibration.loading")) safe_print(path) if os.path.splitext(path)[1].lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: if verbose >= 1: safe_print(lang.getstr("failure")) InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return setcfg("last_icc_path", path) if self.install_cal(capture_output=True, profile_path=path, skip_scripts=True, silent=not getcfg("dry_run"), title=lang.getstr("calibration.load_from_profile")) is True: self.lut_viewer_load_lut(profile=profile) if verbose >= 1: safe_print(lang.getstr("success")) elif not getcfg("dry_run"): if verbose >= 1: safe_print(lang.getstr("failure")) InfoDialog(self, msg=lang.getstr("calibration.load_error") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) else: setcfg("last_cal_path", path) if self.install_cal(capture_output=True, cal=path, skip_scripts=True, silent=not getcfg("dry_run"), title=lang.getstr("calibration.load_from_cal")) is True: self.lut_viewer_load_lut(profile=cal_to_fake_profile(path)) if verbose >= 1: safe_print(lang.getstr("success")) elif not getcfg("dry_run"): if verbose >= 1: safe_print(lang.getstr("failure")) def preview_handler(self, event=None, preview=False): """ Preview profile calibration (vcgt). Toggle between profile curves and previous calibration curves. """ if preview or self.preview.GetValue(): cal = self.cal else: cal = getcfg("calibration.file.previous") if self.cal == cal: cal = False elif not cal: cal = True if cal is False: # linear profile = None else: if cal is True: # display profile profile = get_display_profile() if not profile: cal = False elif cal.lower().endswith(".icc") or \ cal.lower().endswith(".icm"): try: profile = ICCP.ICCProfile(cal) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(exception, self) profile = None else: profile = cal_to_fake_profile(cal) if profile: if verbose >= 1: safe_print(lang.getstr("calibration.loading")) if profile.fileName: safe_print(profile.fileName) else: if verbose >= 1: safe_print(lang.getstr("calibration.resetting")) if self.install_cal(capture_output=True, cal=cal, skip_scripts=True, silent=True, title=lang.getstr("calibration.load_from_cal_or_profile")) is True: self.lut_viewer_load_lut(profile=profile) if verbose >= 1: safe_print(lang.getstr("success")) else: if verbose >= 1: safe_print(lang.getstr("failure")) def profile_load_on_login_handler(self, event=None): setcfg("profile.load_on_login", int(self.profile_load_on_login.GetValue())) if sys.platform == "win32" and sys.getwindowsversion() >= (6, 1): self.profile_load_on_login.Enable(is_superuser() or not util_win.calibration_management_isenabled()) self.profile_load_by_os.Enable(is_superuser() and self.profile_load_on_login.GetValue()) if (not self.profile_load_on_login.GetValue() and self.profile_load_by_os.GetValue() and is_superuser()): self.profile_load_by_os.SetValue(False) self.profile_load_by_os_handler() # Update profile loader config if sys.platform == "win32" and event: prev = self.send_command("apply-profiles", "getcfg profile.load_on_login") if prev: try: prev = int(prev.split()[-1]) except: pass result = self.send_command("apply-profiles", "setcfg profile.load_on_login %i" % getcfg("profile.load_on_login")) if result == "ok" and getcfg("profile.load_on_login") != prev: if getcfg("profile.load_on_login"): lstr = "calibration.preserve" else: lstr = "profile_loader.disable" self.send_command("apply-profiles", "notify '%s'" % lang.getstr(lstr)) else: # Profile loader not running? Fall back to config files # 1. Remember current config items = config.cfg.items(config.ConfigParser.DEFAULTSECT) # 2. Read in profile loader config. Result is unison of current # config and profile loader config. initcfg("apply-profiles") # 3. Restore current config (but do not override profile loader # options) for name, value in items: if not name.startswith("profile_loader"): config.cfg.set(config.ConfigParser.DEFAULTSECT, name, value) # 4. Write profile loader config with values updated from # current config writecfg(module="apply-profiles", options=("profile.load_on_login", "profile_loader")) # 5. Remove profile loader options from current config for name in defaults: if name.startswith("profile_loader"): setcfg(name, None) def profile_load_by_os_handler(self, event=None): if is_superuser(): # Enable calibration management under Windows 7 try: util_win.enable_calibration_management(self.profile_load_by_os.GetValue()) except Exception, exception: safe_print("util_win.enable_calibration_management(True): %s" % safe_unicode(exception)) else: label = get_profile_load_on_login_label( self.profile_load_by_os.GetValue()) self.profile_load_on_login.Label = label self.profile_load_on_login.ContainingSizer.Layout() def install_cal(self, capture_output=False, cal=None, profile_path=None, skip_scripts=False, silent=False, title=appname): """ 'Install' (load) a calibration from a calibration file or profile """ if config.is_virtual_display(): return True # Install using dispwin cmd, args = self.worker.prepare_dispwin(cal, profile_path, False) if not isinstance(cmd, Exception): result = self.worker.exec_cmd(cmd, args, capture_output, low_contrast=False, skip_scripts=skip_scripts, silent=silent, title=title) else: result = cmd if not isinstance(result, Exception) and result: if not silent: if cal is False: InfoDialog(self, msg=lang.getstr("calibration.reset_success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False) else: InfoDialog(self, msg=lang.getstr("calibration.load_success"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False) elif not silent: if isinstance(result, Exception) and getcfg("dry_run"): show_result_dialog(result, self) return if cal is False: InfoDialog(self, msg=lang.getstr("calibration.reset_error"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False) else: InfoDialog(self, msg=lang.getstr("calibration.load_error"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False) return result def update_measurement_report(self, event=None): """ Show file dialog to select a HTML measurement report for updating. Update the selected report and show it afterwards. """ defaultDir, defaultFile = get_verified_path("last_filedialog_path") dlg = wx.FileDialog(self, lang.getstr("measurement_report.update"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.html") + "|*.html;*.htm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() setcfg("last_filedialog_path", path) dlg.Destroy() if result != wx.ID_OK: return try: report.update(path, pack=getcfg("report.pack_js")) except (IOError, OSError), exception: show_result_dialog(exception) else: # show report wx.CallAfter(launch_file, path) def verify_calibration_handler(self, event): if check_set_argyll_bin(): self.setup_measurement(self.verify_calibration) def verify_calibration(self): if self.measure_auto(self.verify_calibration): return safe_print("-" * 80) progress_msg = lang.getstr("calibration.verify") safe_print(progress_msg) self.worker.interactive = False self.worker.start(self.result_consumer, self.worker.verify_calibration, progress_msg=progress_msg, pauseable=True, resume=bool(getattr(self, "measure_auto_after", None))) def select_profile(self, parent=None, title=appname, msg=None, check_profile_class=True, ignore_current_profile=False, prefer_current_profile=False): """ Selects the currently configured profile or display profile. Falls back to user choice via FileDialog if both not set. """ if not parent: parent = self if not msg: msg = lang.getstr("profile.choose") if ignore_current_profile: profile = None else: profile = get_current_profile(include_display_profile=True) if profile and not prefer_current_profile: dlg = ConfirmDialog(self, title=title, msg=msg, ok=lang.getstr("profile.current"), cancel=lang.getstr("cancel"), alt=lang.getstr("browse"), bitmap=geticon(32, appname + "-profile-info")) dlg.ok.SetDefault() result = dlg.ShowModal() if result == wx.ID_CANCEL: return elif result != wx.ID_OK: profile = None if not profile: defaultDir, defaultFile = get_verified_path("last_icc_path") dlg = wx.FileDialog(parent, msg, defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc") + "|*.icc;*.icm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() setcfg("last_icc_path", path) setcfg("last_cal_or_icc_path", path) dlg.Destroy() if result != wx.ID_OK: return try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(parent, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if check_profile_class and (profile.profileClass != "mntr" or profile.colorSpace != "RGB"): InfoDialog(parent, msg=lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace)) + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return return profile def measurement_report_create_handler(self, event): """ Assign and initialize the report creation window """ if not getattr(self, "reportframe", None): self.init_reportframe() if self.reportframe.IsShownOnScreen(): self.reportframe.Raise() else: self.reportframe.Show(not self.reportframe.IsShownOnScreen()) def measurement_report_handler(self, event, path=None): if sys.platform == "darwin" or debug: self.focus_handler(event) if not check_set_argyll_bin(): return sim_ti3 = None sim_gray = None # select measurement data (ti1 or ti3) chart = getcfg("measurement_report.chart") try: chart = CGATS.CGATS(chart, True) except (IOError, CGATS.CGATSError), exception: show_result_dialog(exception, getattr(self, "reportframe", self)) return chart = self.worker.ensure_patch_sequence(chart, False) fields = getcfg("measurement_report.chart.fields") # profile(s) paths = [] use_sim = getcfg("measurement_report.use_simulation_profile") use_sim_as_output = getcfg("measurement_report.use_simulation_profile_as_output") use_devlink = getcfg("measurement_report.use_devlink_profile") ##if not use_sim or not use_sim_as_output: ##paths.append(getcfg("measurement_report.output_profile")) if use_sim: if use_sim_as_output and use_devlink: devlink_path = getcfg("measurement_report.devlink_profile") if devlink_path: paths.append(devlink_path) else: use_devlink = False paths.append(getcfg("measurement_report.simulation_profile")) sim_profile = None devlink = None oprof = profile = get_current_profile(True) for i, profilepath in enumerate(paths): try: profile = ICCP.ICCProfile(profilepath) except (IOError, ICCP.ICCProfileInvalidError), exception: if isinstance(exception, ICCP.ICCProfileInvalidError): msg = lang.getstr("profile.invalid") + "\n" + profilepath else: msg = safe_unicode(exception) InfoDialog(getattr(self, "reportframe", self), msg=msg, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if i in (0, 1) and use_sim: if use_sim_as_output and profile.colorSpace == "RGB": if i == 0 and use_devlink: devlink = profile else: if profile.colorSpace != "RGB": use_sim_as_output = False devlink = None sim_profile = profile profile = oprof if not profile and not oprof: show_result_dialog(Error(lang.getstr("display_profile.not_detected", config.get_display_name(None, True))), getattr(self, "reportframe", self)) return colormanaged = (use_sim and use_sim_as_output and not sim_profile and config.get_display_name(None, True) in ("madVR", "Prisma") and getcfg("3dlut.enable")) if debug: for n, p in {"profile": profile, "devlink": devlink, "sim_profile": sim_profile, "oprof": oprof}.iteritems(): if p: safe_print(n, p.getDescription()) if use_sim: if sim_profile: mprof = sim_profile else: mprof = profile apply_map = (use_sim and mprof.colorSpace == "RGB" and isinstance(mprof.tags.get("rXYZ"), ICCP.XYZType) and isinstance(mprof.tags.get("gXYZ"), ICCP.XYZType) and isinstance(mprof.tags.get("bXYZ"), ICCP.XYZType) and not isinstance(mprof.tags.get("A2B0"), ICCP.LUT16Type)) apply_off = (apply_map and getcfg("measurement_report.apply_black_offset")) apply_trc = (apply_map and getcfg("measurement_report.apply_trc")) bt1886 = None if apply_trc or apply_off: # TRC BT.1886-like, gamma with black offset, or just black offset try: odata = self.worker.xicclu(oprof, (0, 0, 0), pcs="x") if len(odata) != 1 or len(odata[0]) != 3: raise ValueError("Blackpoint is invalid: %s" % odata) except Exception, exception: show_result_dialog(exception, getattr(self, "reportframe", self)) return XYZbp = odata[0] if apply_trc: # TRC BT.1886-like gamma = getcfg("measurement_report.trc_gamma") gamma_type = getcfg("measurement_report.trc_gamma_type") outoffset = getcfg("measurement_report.trc_output_offset") if gamma_type == "b": # Get technical gamma needed to achieve effective gamma gamma = colormath.xicc_tech_gamma(gamma, XYZbp[1], outoffset) else: # Just black offset outoffset = 1.0 gamma = 0.0 for channel in "rgb": gamma += mprof.tags[channel + "TRC"].get_gamma() gamma /= 3.0 rXYZ = mprof.tags.rXYZ.values() gXYZ = mprof.tags.gXYZ.values() bXYZ = mprof.tags.bXYZ.values() mtx = colormath.Matrix3x3([[rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]]]) bt1886 = colormath.BT1886(mtx, XYZbp, outoffset, gamma, apply_trc) if apply_trc: # Make sure the profile has the expected Rec. 709 TRC # for BT.1886 for i, channel in enumerate(("r", "g", "b")): if channel + "TRC" in mprof.tags: mprof.tags[channel + "TRC"].set_trc(-709) # Set profile filename to None so it gets written to temp # directory (this makes sure we're actually using the changed # profile for lookup) mprof.fileName = None if sim_profile: sim_intent = ("a" if getcfg("measurement_report.whitepoint.simulate") else "r") void, sim_ti3, sim_gray = self.worker.chart_lookup(chart, sim_profile, check_missing_fields=True, intent=sim_intent, bt1886=bt1886) # NOTE: we ignore the ti1 and gray patches here # only the ti3 is valuable at this point if not sim_ti3: return intent = ("r" if sim_intent == "r" or getcfg("measurement_report.whitepoint.simulate.relative") else "a") bt1886 = None else: sim_intent = None intent = "r" if fields in ("LAB", "XYZ"): if getcfg("measurement_report.whitepoint.simulate"): sim_intent = "a" if not getcfg("measurement_report.whitepoint.simulate.relative"): intent = "a" else: chart.fix_device_values_scaling() chart.adapt(cat=profile.guess_cat() or "Bradford") # lookup test patches ti1, ti3_ref, gray = self.worker.chart_lookup(sim_ti3 or chart, profile, bool(sim_ti3) or fields in ("LAB", "XYZ"), fields=None if bool(sim_ti3) else fields, intent=intent, bt1886=bt1886) if not ti3_ref: return if not gray and sim_gray: gray = sim_gray if devlink: void, ti1, void = self.worker.chart_lookup(ti1, devlink, check_missing_fields=True, white_patches=1, white_patches_total=False) if not ti1: return # let the user choose a location for the result defaultFile = u"Measurement Report %s — %s — %s" % (version_short, re.sub(r"[\\/:;*?\"<>|]+", "_", self.display_ctrl.GetStringSelection().replace(" " + lang.getstr("display.primary"), "")), strftime("%Y-%m-%d %H-%M.html")) if not path: defaultDir = get_verified_path(None, os.path.join(getcfg("profile.save_path"), defaultFile))[0] dlg = wx.FileDialog(getattr(self, "reportframe", self), lang.getstr("save_as"), defaultDir, defaultFile, wildcard=lang.getstr("filetype.html") + "|*.html;*.htm", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = make_argyll_compatible_path(dlg.GetPath()) if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), getattr(self, "reportframe", self)) return dlg.Destroy() if result != wx.ID_OK: return else: path = make_argyll_compatible_path(path) save_path = os.path.splitext(path)[0] + ".html" setcfg("last_filedialog_path", save_path) # check if file(s) already exist if os.path.exists(save_path): dlg = ConfirmDialog( getattr(self, "reportframe", self), msg=lang.getstr("dialog.confirm_overwrite", save_path), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return # setup for measurement self.setup_measurement(self.measurement_report, ti1, oprof, profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc, colormanaged, use_sim, use_sim_as_output) def measurement_report(self, ti1, oprof, profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc, colormanaged, use_sim, use_sim_as_output): safe_print("-" * 80) progress_msg = lang.getstr("measurement_report") safe_print(progress_msg) # setup temp dir temp = self.worker.create_tempdir() if isinstance(temp, Exception): show_result_dialog(temp, getattr(self, "reportframe", self)) return # filenames name, ext = os.path.splitext(os.path.basename(save_path)) ti1_path = os.path.join(temp, name + ".ti1") profile_path = os.path.join(temp, name + ".icc") # write ti1 to temp dir try: ti1_file = open(ti1_path, "w") except EnvironmentError, exception: InfoDialog(getattr(self, "reportframe", self), msg=lang.getstr("error.file.create", ti1_path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.worker.wrapup(False) return ti1_file.write(str(ti1)) ti1_file.close() # write profile to temp dir profile.write(profile_path) # Check if we need to apply calibration if (not use_sim_as_output or (devlink and not "-a" in parse_argument_string( devlink.tags.get("meta", {}).get("collink.args", {}).get("value", "-a" if getcfg("3dlut.output.profile.apply_cal") else "")))): calprof = oprof else: calprof = profile cal_path = os.path.join(temp, name + ".cal") try: # Extract calibration from profile cal = extract_cal_from_profile(calprof, cal_path, False) except Exception, exception: wx.CallAfter(show_result_dialog, Error(lang.getstr("cal_extraction_failed")), getattr(self, "reportframe", self)) self.Show() return if not cal: # Use linear calibration cal_path = get_data_path("linear.cal") # start readings self.worker.dispread_after_dispcal = False self.worker.interactive = config.get_display_name() == "Untethered" self.worker.start(self.measurement_report_consumer, self.worker.measure_ti1, cargs=(os.path.splitext(ti1_path)[0] + ".ti3", profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc, use_sim, use_sim_as_output, oprof), wargs=(ti1_path, cal_path, colormanaged), progress_msg=progress_msg, pauseable=True) def measurement_report_consumer(self, result, ti3_path, profile, sim_profile, intent, sim_intent, devlink, ti3_ref, sim_ti3, save_path, chart, gray, apply_trc, use_sim, use_sim_as_output, oprof): self.Show() if not isinstance(result, Exception) and result: # get item 0 of the ti3 to strip the CAL part from the measured data try: ti3_measured = CGATS.CGATS(ti3_path)[0] except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exc: result = exc else: safe_print(lang.getstr("success")) result = self.measurement_file_check_confirm(ti3_measured) # cleanup self.worker.wrapup(False if not isinstance(result, Exception) else result) if isinstance(result, Exception) or not result: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, getattr(self, "reportframe", self)) return # Account for additional white patches white_rgb = {'RGB_R': 100, 'RGB_G': 100, 'RGB_B': 100} white_ref = ti3_ref.queryi(white_rgb) if devlink: # Remove additional white patch (device white = 100 before # accounting for effect of devicelink) # This is always the first patch ONLY ti3_measured.DATA.remove(0) # The new offset is the difference in length between measured and # ref because the white patch is always added at the start offset = len(ti3_measured.DATA) - len(ti3_ref.DATA) # Set full white RGB to 100 for i in xrange(offset): for label in ("RGB_R", "RGB_G", "RGB_B"): ti3_measured.DATA[i][label] = 100.0 # Restore original device values for i in ti3_ref.DATA: for label in ("RGB_R", "RGB_G", "RGB_B"): ti3_measured.DATA[i + offset][label] = ti3_ref.DATA[i][label] # White patches (device white = 100 after accounting for effect of # devicelink) white_measured = ti3_measured.queryi(white_rgb) # Update white cd/m2 luminance = float(ti3_measured.LUMINANCE_XYZ_CDM2.split()[1]) white_XYZ_cdm2 = [0, 0, 0] for i, label in enumerate(("XYZ_X", "XYZ_Y", "XYZ_Z")): white_XYZ_cdm2[i] = white_measured[0][label] * luminance / 100.0 ti3_measured.LUMINANCE_XYZ_CDM2 = "%.6f %.6f %.6f" % tuple(white_XYZ_cdm2) # Scale to actual white Y after accounting for effect of devicelink scale = 100.0 / white_measured[0]["XYZ_Y"] for i in ti3_measured.DATA: for label in ("XYZ_X", "XYZ_Y", "XYZ_Z"): ti3_measured.DATA[i][label] *= scale else: white_measured = ti3_measured.queryi(white_rgb) offset = max(len(white_measured) - len(white_ref), 0) # If patches were removed from the measured TI3, we need to remove them # from reference and simulation TI3 if isinstance(result, tuple): ref_removed = [] sim_removed = [] for item in reversed(result[0]): key = item.key - offset ref_removed.insert(0, ti3_ref.DATA.pop(key)) if sim_ti3: sim_removed.insert(0, sim_ti3.DATA.pop(key)) for item in ref_removed: safe_print("Removed patch #%i from reference TI3: %s" % (item.key, item)) for item in sim_removed: safe_print("Removed patch #%i from simulation TI3: %s" % (item.key, item)) # Update offset white_ref = ti3_ref.queryi(white_rgb) offset = max(len(white_measured) - len(white_ref), 0) # Determine if we should use planckian locus for assumed target wp # Detection will only work for profiles created by DisplayCAL planckian = False if (profile.tags.get("CIED", "") or profile.tags.get("targ", ""))[0:4] == "CTI3": options_dispcal = get_options_from_profile(profile)[0] for option in options_dispcal: if option.startswith("T"): planckian = True break # calculate amount of calibration grayscale tone values cal_entrycount = 256 if isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType): rgb = [[], [], []] vcgt = profile.tags.vcgt if "data" in vcgt: # table cal_entrycount = vcgt['entryCount'] for i in range(0, cal_entrycount): for j in range(0, 3): rgb[j].append(float(vcgt['data'][j][i]) / (math.pow(256, vcgt['entrySize']) - 1) * 255) else: # formula step = 100.0 / 255.0 for i in range(0, cal_entrycount): # float2dec(v) fixes miniscule deviations in the calculated gamma for j, name in enumerate(("red", "green", "blue")): vmin = float2dec(vcgt[name + "Min"] * 255) v = float2dec(math.pow(step * i / 100.0, vcgt[name + "Gamma"])) vmax = float2dec(vcgt[name + "Max"] * 255) rgb[j].append(float2dec(vmin + v * (vmax - vmin), 8)) cal_rgblevels = [len(set(round(n) for n in channel)) for channel in rgb] else: # Assume linear with all steps cal_rgblevels = [256, 256, 256] if not chart.filename.lower().endswith(".ti1") or sim_ti3: # make the device values match for i in ti3_ref.DATA: for color in ("RGB_R", "RGB_G", "RGB_B"): if sim_ti3 and sim_ti3.DATA[i].get(color) is not None: ti3_ref.DATA[i][color] = sim_ti3.DATA[i][color] else: ti3_ref.DATA[i][color] = ti3_measured.DATA[i + offset][color] cat = "Bradford" # create a 'joined' ti3 from ref ti3, with XYZ values from measured ti3 # this makes sure CMYK data in the original ref will be present in # the newly joined ti3 ti3_joined = CGATS.CGATS(str(ti3_ref))[0] ti3_joined.LUMINANCE_XYZ_CDM2 = ti3_measured.LUMINANCE_XYZ_CDM2 # add XYZ to DATA_FORMAT if not yet present labels_xyz = ("XYZ_X", "XYZ_Y", "XYZ_Z") if not "XYZ_X" in ti3_joined.DATA_FORMAT.values() and \ not "XYZ_Y" in ti3_joined.DATA_FORMAT.values() and \ not "XYZ_Z" in ti3_joined.DATA_FORMAT.values(): ti3_joined.DATA_FORMAT.add_data(labels_xyz) # set XYZ in joined ti3 to XYZ of measurements for i in ti3_joined.DATA: for color in labels_xyz: ti3_joined.DATA[i][color] = ti3_measured.DATA[i + offset][color] wtpt_profile_norm = tuple(n * 100 for n in profile.tags.wtpt.values()) if isinstance(profile.tags.get("chad"), ICCP.chromaticAdaptionTag): # undo chromatic adaption of profile whitepoint WX, WY, WZ = profile.tags.chad.inverted() * wtpt_profile_norm wtpt_profile_norm = tuple((n / WY) * 100.0 for n in (WX, WY, WZ)) # guess chromatic adaption transform (Bradford, CAT02...) cat = profile.guess_cat() or cat elif isinstance(profile.tags.get("arts"), ICCP.chromaticAdaptionTag): cat = profile.guess_cat() or cat if oprof and isinstance(oprof.tags.get("lumi"), ICCP.XYZType): # calculate unscaled whitepoint scale = oprof.tags.lumi.Y / 100.0 wtpt_profile = tuple(n * scale for n in wtpt_profile_norm) else: wtpt_profile = wtpt_profile_norm if sim_profile: wtpt_sim_profile_norm = tuple(n * 100 for n in sim_profile.tags.wtpt.values()) if "chad" in sim_profile.tags: # undo chromatic adaption of profile whitepoint WX, WY, WZ = sim_profile.tags.chad.inverted() * wtpt_sim_profile_norm wtpt_sim_profile_norm = tuple((n / WY) * 100.0 for n in (WX, WY, WZ)) wtpt_measured = tuple(float(n) for n in ti3_joined.LUMINANCE_XYZ_CDM2.split()) # normalize so that Y = 100 wtpt_measured_norm = tuple((n / wtpt_measured[1]) * 100 for n in wtpt_measured) if intent != "a" and sim_intent != "a": white = ti3_joined.queryi(white_rgb) for i in white: white[i].update({'XYZ_X': wtpt_measured_norm[0], 'XYZ_Y': wtpt_measured_norm[1], 'XYZ_Z': wtpt_measured_norm[2]}) black = ti3_joined.queryi1({'RGB_R': 0, 'RGB_G': 0, 'RGB_B': 0}) if black: bkpt_measured_norm = black["XYZ_X"], black["XYZ_Y"], black["XYZ_Z"] bkpt_measured = tuple(wtpt_measured[1] / 100 * n for n in bkpt_measured_norm) else: bkpt_measured_norm = None bkpt_measured = None # set Lab values labels_Lab = ("LAB_L", "LAB_A", "LAB_B") for data in (ti3_ref, ti3_joined): if "XYZ_X" in data.DATA_FORMAT.values() and \ "XYZ_Y" in data.DATA_FORMAT.values() and \ "XYZ_Z" in data.DATA_FORMAT.values(): if not "LAB_L" in data.DATA_FORMAT.values() and \ not "LAB_A" in data.DATA_FORMAT.values() and \ not "LAB_B" in data.DATA_FORMAT.values(): # add Lab fields to DATA_FORMAT if not present data.DATA_FORMAT.add_data(labels_Lab) has_Lab = False else: has_Lab = True if data is ti3_joined or not has_Lab: for i in data.DATA: X, Y, Z = [data.DATA[i][color] for color in labels_xyz] if data is ti3_joined: # we need to adapt the measured values to D50 #print X, Y, Z, '->', X, Y, Z = colormath.adapt(X, Y, Z, wtpt_measured_norm, cat=cat) #print X, Y, Z Lab = XYZ2Lab(X, Y, Z) for j, color in enumerate(labels_Lab): data.DATA[i][color] = Lab[j] if data is ti3_ref and sim_intent == "a" and intent == "a": for i in data.DATA: # we need to adapt the reference values to D50 L, a, b = [data.DATA[i][color] for color in labels_Lab] X, Y, Z = colormath.Lab2XYZ(L, a, b, scale=100) #print X, Y, Z, '->', X, Y, Z = colormath.adapt(X, Y, Z, wtpt_profile_norm, cat=cat) #print X, Y, Z Lab = XYZ2Lab(X, Y, Z) for j, color in enumerate(labels_Lab): data.DATA[i][color] = Lab[j] # gather data for report instrument = self.comport_ctrl.GetStringSelection() measurement_mode = self.measurement_mode_ctrl.GetStringSelection() instrument += u" \u2014 " + measurement_mode observer = get_cfg_option_from_args("observer", "-Q", self.worker.options_dispread) if observer != defaults["observer"]: instrument += u" \u2014 " + self.observers_ab.get(observer, observer) ccmx = "None" reference_observer = None if self.worker.instrument_can_use_ccxx(): ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if len(ccmx) > 1 and ccmx[1]: ccmxpath = ccmx[1] ccmx = os.path.basename(ccmx[1]) try: cgats = CGATS.CGATS(ccmxpath) except (IOError, CGATS.CGATSError), exception: safe_print("%s:" % ccmxpath, exception) else: desc = safe_unicode(cgats.get_descriptor(), "UTF-8") # If the description is not the same as the 'sane' # filename, add the filename after the description # (max 31 chars) # See also colorimeter_correction_check_overwite, the # way the filename is processed must be the same if (re.sub(r"[\\/:;*?\"<>|]+", "_", make_argyll_compatible_path(desc)) != os.path.splitext(ccmx)[0]): ccmx = "%s &lt;%s&gt;" % (desc, ellipsis(ccmx, 31, "m")) if cgats.get(0, cgats).type == "CCMX": reference_observer = cgats.queryv1("REFERENCE_OBSERVER") if (reference_observer and reference_observer != defaults["observer"]): reference_observer = self.observers_ab.get(reference_observer, reference_observer) if not reference_observer.lower() in ccmx.lower(): ccmx += u" \u2014 " + reference_observer else: ccmx = "None" if not sim_profile and use_sim and use_sim_as_output: sim_profile = profile if (getcfg("measurement_report.trc_gamma") != 2.4 or getcfg("measurement_report.trc_gamma_type") != "B" or getcfg("measurement_report.trc_output_offset")): trc = '' else: trc = "BT.1886" placeholders2data = {"${PLANCKIAN}": 'checked="checked"' if planckian else "", "${DISPLAY}": self.display_ctrl.GetStringSelection().replace(" " + lang.getstr("display.primary"), ""), "${INSTRUMENT}": instrument, "${CORRECTION_MATRIX}": ccmx, "${BLACKPOINT}": "%f %f %f" % (bkpt_measured if bkpt_measured else (-1, ) * 3), "${WHITEPOINT}": "%f %f %f" % wtpt_measured, "${WHITEPOINT_NORMALIZED}": "%f %f %f" % wtpt_measured_norm, "${PROFILE}": profile.getDescription(), "${PROFILE_WHITEPOINT}": "%f %f %f" % wtpt_profile, "${PROFILE_WHITEPOINT_NORMALIZED}": "%f %f %f" % wtpt_profile_norm, "${SIMULATION_PROFILE}": sim_profile.getDescription() if sim_profile else '', "${TRC_GAMMA}": str(getcfg("measurement_report.trc_gamma") if apply_trc else 'null'), "${TRC_GAMMA_TYPE}": str(getcfg("measurement_report.trc_gamma_type") if apply_trc else ''), "${TRC_OUTPUT_OFFSET}": str(getcfg("measurement_report.trc_output_offset") if apply_trc else 0), "${TRC}": trc if apply_trc else '', "${WHITEPOINT_SIMULATION}": str(sim_intent == "a").lower(), "${WHITEPOINT_SIMULATION_RELATIVE}": str(sim_intent == "a" and intent == "r").lower(), "${DEVICELINK_PROFILE}": devlink.getDescription() if devlink else '', "${TESTCHART}": os.path.basename(chart.filename), "${ADAPTION}": str(profile.guess_cat(False) or cat), "${DATETIME}": strftime("%Y-%m-%d %H:%M:%S"), "${REF}": str(ti3_ref).decode(enc, "replace").replace('"', """), "${MEASURED}": str(ti3_joined).decode(enc, "replace").replace('"', """), "${CAL_ENTRYCOUNT}": str(cal_entrycount), "${CAL_RGBLEVELS}": repr(cal_rgblevels), "${GRAYSCALE}": repr(gray) if gray else 'null', "${REPORT_VERSION}": version_short} # create report try: report.create(save_path, placeholders2data, getcfg("report.pack_js")) except (IOError, OSError), exception: show_result_dialog(exception, self) else: # show report wx.CallAfter(launch_file, save_path) def load_cal(self, cal=None, silent=False): """ Load a calibration from a .cal file or ICC profile. Defaults to currently configured file if cal parameter is not given. """ load_vcgt = getcfg("calibration.autoload") or cal if not cal: cal = getcfg("calibration.file", False) if cal: if check_set_argyll_bin(): if verbose >= 1 and load_vcgt: safe_print(lang.getstr("calibration.loading")) safe_print(cal) if not load_vcgt or \ self.install_cal(capture_output=True, cal=cal, skip_scripts=True, silent=silent, title=lang.getstr("calibration.load_from_cal_or_profile")) is True: if (cal.lower().endswith(".icc") or cal.lower().endswith(".icm")): try: profile = ICCP.ICCProfile(cal) except (IOError, ICCP.ICCProfileInvalidError), exception: safe_print(exception) profile = None else: profile = cal_to_fake_profile(cal) self.lut_viewer_load_lut(profile=profile) if verbose >= 1 and silent and load_vcgt: safe_print(lang.getstr("success")) return True if verbose >= 1 and load_vcgt: safe_print(lang.getstr("failure")) return False def reset_cal(self, event=None): """ Reset video card gamma table to linear """ if check_set_argyll_bin(): if verbose >= 1: safe_print(lang.getstr("calibration.resetting")) if self.install_cal(capture_output=True, cal=False, skip_scripts=True, silent=not (getcfg("dry_run") and event), title=lang.getstr("calibration.reset")) is True: profile = ICCP.ICCProfile() profile._data = "\0" * 128 profile._tags.desc = ICCP.TextDescriptionType("", "desc") profile._tags.vcgt = ICCP.VideoCardGammaTableType("", "vcgt") profile._tags.vcgt.update({ "channels": 3, "entryCount": 256, "entrySize": 1, "data": [range(0, 256), range(0, 256), range(0, 256)] }) profile.size = len(profile.data) profile.is_loaded = True self.lut_viewer_load_lut(profile=profile) if verbose >= 1: safe_print(lang.getstr("success")) return True if verbose >= 1 and not getcfg("dry_run"): safe_print(lang.getstr("failure")) return False def load_display_profile_cal(self, event=None, lut_viewer_load_lut=True): """ Load calibration (vcgt) from current display profile """ profile = get_display_profile() if check_set_argyll_bin(): if verbose >= 1 and (getcfg("calibration.autoload") or event): safe_print( lang.getstr("calibration.loading_from_display_profile")) if profile and profile.fileName: safe_print(profile.fileName) if (not getcfg("calibration.autoload") and not event) or \ self.install_cal(capture_output=True, cal=True, skip_scripts=True, silent=not (getcfg("dry_run") and event), title=lang.getstr("calibration.load_from_display_profile")) is True: if lut_viewer_load_lut: self.lut_viewer_load_lut(profile=profile) if verbose >= 1 and (getcfg("calibration.autoload") or event): safe_print(lang.getstr("success")) return True if (verbose >= 1 and not getcfg("dry_run") and (getcfg("calibration.autoload") or event)): safe_print(lang.getstr("failure")) return False def report_calibrated_handler(self, event): """ Report on calibrated display and exit """ self.setup_measurement(self.report) def report_uncalibrated_handler(self, event): """ Report on uncalibrated display and exit """ self.setup_measurement(self.report, False) def report(self, report_calibrated=True): if check_set_argyll_bin(): if self.measure_auto(self.report, report_calibrated): return safe_print("-" * 80) if report_calibrated: progress_msg = lang.getstr("report.calibrated") else: progress_msg = lang.getstr("report.uncalibrated") safe_print(progress_msg) self.worker.interactive = False self.worker.start(self.result_consumer, self.worker.report, wkwargs={"report_calibrated": report_calibrated}, progress_msg=progress_msg, pauseable=True, resume=bool(getattr(self, "measure_auto_after", None))) def result_consumer(self, result): """ Generic result consumer. Shows the info window on success if enabled in the configuration or an info/warn/error dialog if result was an exception. """ if isinstance(result, Exception) and result: wx.CallAfter(show_result_dialog, result, self) else: wx.CallAfter(self.infoframe_toggle_handler, show=True) self.worker.wrapup(False) self.Show() def calibrate_btn_handler(self, event): if sys.platform == "darwin" or debug: self.focus_handler(event) if (not isinstance(event, CustomEvent) and not getcfg("profile.update") and (not getcfg("calibration.update") or is_profile()) and getcfg("trc")): update_profile = getcfg("calibration.update") and is_profile() if update_profile: msg = lang.getstr("calibration.update_profile_choice") ok = lang.getstr("profile.update") else: msg = lang.getstr("calibration.create_fast_matrix_shaper_choice") ok = lang.getstr("calibration.create_fast_matrix_shaper") dlg = ConfirmDialog(self, msg=msg, ok=ok, alt=lang.getstr("button.calibrate"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question")) result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_CANCEL: return if update_profile and result == wx.ID_OK: setcfg("profile.update", 1) else: result = None self.worker.dispcal_create_fast_matrix_shaper = result == wx.ID_OK if check_set_argyll_bin() and self.check_overwrite(".cal") and \ ((not getcfg("profile.update") and not self.worker.dispcal_create_fast_matrix_shaper) or self.check_overwrite(profile_ext)): self.setup_measurement(self.just_calibrate) def just_calibrate(self): """ Just calibrate, optionally creating a fast matrix shaper profile """ if self.measure_auto(self.just_calibrate): return safe_print("-" * 80) safe_print(lang.getstr("button.calibrate")) setcfg("calibration.continue_next", 0) if getcfg("calibration.interactive_display_adjustment") and \ not getcfg("calibration.update"): # Interactive adjustment, do not show progress dialog self.worker.interactive = True else: # No interactive adjustment, show progress dialog self.worker.interactive = False self.worker.start_calibration(self.just_calibrate_finish, remove=True, progress_msg=lang.getstr("calibration"), resume=bool(getattr(self, "measure_auto_after", None))) def just_calibrate_finish(self, result): start_timers = True if not isinstance(result, Exception) and result: wx.CallAfter(self.update_calibration_file_ctrl) if getcfg("log.autoshow"): wx.CallAfter(self.infoframe_toggle_handler, show=True) if getcfg("profile.update") or \ self.worker.dispcal_create_fast_matrix_shaper: start_timers = False wx.CallAfter(self.profile_finish, True, success_msg=lang.getstr("calibration.complete"), install_3dlut=getcfg("3dlut.create")) elif getcfg("trc"): wx.CallAfter(self.load_cal, silent=True) wx.CallAfter(InfoDialog, self, msg=lang.getstr("calibration.complete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif not getcfg("dry_run"): wx.CallAfter(InfoDialog, self, msg=lang.getstr("calibration.incomplete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.Show(start_timers=start_timers) def setup_measurement(self, pending_function, *pending_function_args, **pending_function_kwargs): display_name = config.get_display_name(None, True) if (display_name == "Web @ localhost" or display_name.startswith("Chromecast ")): for name, patterngenerator in self.worker.patterngenerators.items(): if isinstance(patterngenerator, (WebWinHTTPPatternGeneratorServer, CCPG)): # Need to free connection for dispwin patterngenerator.disconnect_client() if isinstance(patterngenerator, WebWinHTTPPatternGeneratorServer): patterngenerator.server_close() self.worker.patterngenerators.pop(name) elif not self.setup_patterngenerator(self): return writecfg() if pending_function_kwargs.get("wrapup", True): self.worker.wrapup(False) if "wrapup" in pending_function_kwargs: del pending_function_kwargs["wrapup"] self.HideAll() self.set_pending_function(pending_function, *pending_function_args, **pending_function_kwargs) if ((config.is_virtual_display() and display_name not in ("Resolve", "Prisma") and not display_name.startswith("Chromecast ") and not display_name.startswith("Prisma ")) or getcfg("dry_run")): self.call_pending_function() elif sys.platform in ("darwin", "win32") or isexe: self.measureframe.Show() else: wx.CallAfter(self.start_measureframe_subprocess) def setup_observer_ctrl(self): """ Setup observer control. Choice of available observers varies with ArgyllCMS version. """ self.observers_ab = OrderedDict() for observer in config.valid_values["observer"]: self.observers_ab[observer] = lang.getstr("observer." + observer) self.observers_ba = swap_dict_keys_values(self.observers_ab) self.observer_ctrl.SetItems(self.observers_ab.values()) def setup_patterngenerator(self, parent=None, title=appname, upload=False): retval = True display_name = config.get_display_name(None, True) if display_name == "Prisma": # Ask for prisma hostname or IP dlg = ConfirmDialog(parent, title=title, msg=lang.getstr("patterngenerator.prisma.specify_host"), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question")) host = getcfg("patterngenerator.prisma.host") dlg.host = wx.ComboBox(dlg, -1, host) def check_host_empty(event): dlg.ok.Enable(bool(dlg.host.GetValue())) dlg.host.Bind(wx.EVT_TEXT, check_host_empty) dlg.host.Bind(wx.EVT_COMBOBOX, check_host_empty) dlg.sizer3.Add(dlg.host, 0, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=12) dlg.errormsg = wx.StaticText(dlg, -1, "") dlg.sizer3.Add(dlg.errormsg, 0, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=6) if upload: # Show preset selection & filename sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(sizer, 0, flag=wx.TOP | wx.ALIGN_LEFT | wx.EXPAND, border=12) sizer.Add(wx.StaticText(dlg, -1, lang.getstr("3dlut.holder.assign_preset")), flag=wx.ALIGN_CENTER_VERTICAL) preset = wx.Choice(dlg, -1, choices=config.valid_values["patterngenerator.prisma.preset"]) preset.SetStringSelection(getcfg("patterngenerator.prisma.preset")) sizer.Add(preset, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=8) # Filename basename = os.path.basename(getcfg("3dlut.input.profile")) name = os.path.splitext(basename)[0] # Shorten long name gamut = {"SMPTE_RP145_NTSC": "NTSC", "EBU3213_PAL": "PAL", "SMPTE431_P3": "P3"}.get(name, name) # Use file created date & time for filename filename = strftime("%%s-%Y%m%dT%H%M%S.3dl", localtime(os.stat(self.lut3d_path).st_ctime)) % gamut dlg.sizer3.Add(wx.StaticText(dlg, -1, "%s: %s" % (lang.getstr("filename.upload"), filename)), flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() def check_host(host): try: ip = socket.gethostbyname(host) self.worker.patterngenerator.host = ip self.worker.patterngenerator.connect() except socket.error, exception: result = exception else: result = ip wx.CallAfter(check_host_consumer, result) def check_host_consumer(result): if not dlg: return if isinstance(result, Exception): dlg.Freeze() if isinstance(result, socket.gaierror): dlg.errormsg.Label = lang.getstr("host.invalid.lookup_failed") else: width = dlg.errormsg.Size[0] dlg.errormsg.Label = safe_unicode(result) dlg.errormsg.Wrap(width) dlg.errormsg.ForegroundColour = wx.Colour(204, 0, 0) dlg.ok.Enable() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Refresh() dlg.Thaw() wx.Bell() else: dlg.EndModal(wx.ID_OK) def check_host_handler(event): host = dlg.host.GetValue() if host: dlg.Freeze() dlg.errormsg.Label = lang.getstr("please_wait") dlg.errormsg.ForegroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT) dlg.ok.Disable() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Refresh() dlg.Thaw() thread = threading.Thread(target=check_host, args=(host, )) thread.start() else: wx.Bell() def add_client(addr_client): if not dlg: return name = addr_client[1]["name"] if sys.platform != "win32" and not name.endswith(".local"): name += ".local" dlg.host.Append(name) if not dlg.host.GetValue(): dlg.host.SetSelection(0) check_host_empty(None) def discover(): self.worker.patterngenerator.bind("on_client_added", lambda addr_client: wx.CallAfter(add_client, addr_client)) self.worker.patterngenerator.listen() self.worker.patterngenerator.announce() thread = threading.Thread(target=discover) dlg.ok.Bind(wx.EVT_BUTTON, check_host_handler) dlg.ok.Enable(bool(host)) if self.worker.patterngenerator: self.worker.patterngenerator.disconnect_client() else: self.worker.setup_patterngenerator() wx.CallAfter(thread.start) result = dlg.ShowModal() self.worker.patterngenerator.listening = False host = dlg.host.GetValue() if result == wx.ID_OK: if upload: setcfg("patterngenerator.prisma.preset", preset.GetStringSelection()) retval = filename dlg.Destroy() if result != wx.ID_OK or not host: return setcfg("patterngenerator.prisma.host", host) elif display_name == "madVR": # Connect to madTPG (launch local instance under Windows) self.worker.madtpg_connect() elif (display_name in ("Resolve", "Web @ localhost") or display_name.startswith("Chromecast ")): logfile = LineCache(3) try: self.worker.setup_patterngenerator(logfile) except Exception, exception: show_result_dialog(exception, self) return if not hasattr(self.worker.patterngenerator, "conn"): # Wait for connection def closedlg(self): win = self.get_top_window() if isinstance(win, ConfirmDialog): win.EndModal(wx.ID_CANCEL) def waitforcon(self): self.worker.patterngenerator.wait() if hasattr(self.worker.patterngenerator, "conn"): # Close dialog wx.CallAfter(closedlg, self) threading.Thread(target=waitforcon, name="PatternGeneratorConnectionListener", args=(self, )).start() while not logfile.read(): sleep(.1) if show_result_dialog(Info(logfile.read()), self, confirm=lang.getstr("cancel")): self.worker.patterngenerator.listening = False return return retval def start_measureframe_subprocess(self): args = u'"%s" -c "%s"' % (exe, "import sys;" "sys.path.insert(0, %r);" "import wxMeasureFrame;" "wxMeasureFrame.main();" "sys.exit(wxMeasureFrame.MeasureFrame.exitcode)" % pydir) if wx.Display.GetCount() == 1 and len(self.worker.display_rects) > 1: # Separate X screens, TwinView or similar display = wx.Display(0) geometry = display.Geometry union = wx.Rect() xy = [] for rect in self.worker.display_rects: if rect[:2] in xy or rect[2:] == geometry[2:]: # Overlapping x y coordinates or screen filling whole # reported geometry, so assume separate X screens union = None break xy.append(rect[:2]) union = union.Union(rect) if union == geometry: # Assume TwinView or similar where Argyll enumerates 1+n # displays but wx only 'sees' one that is the union of them pass else: # Assume separate X screens display_no = getcfg("display.number") - 1 x_hostname, x_display, x_screen = util_x.get_display() x_screen = display_no try: import RealDisplaySizeMM as RDSMM except ImportError, exception: InfoDialog(self, msg=safe_unicode(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-warning")) else: display = RDSMM.get_x_display(display_no) if display: x_hostname, x_display, x_screen = display args = "DISPLAY=%s:%s.%s %s" % (x_hostname, x_display, x_screen, args) delayedresult.startWorker(self.measureframe_consumer, self.measureframe_subprocess, wargs=(args, )) def measureframe_subprocess(self, args): returncode = -1 try: p = sp.Popen(args.encode(fs_enc), shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) except Exception, exception: stderr = safe_str(exception) else: self._measureframe_subprocess = p stdout, stderr = p.communicate() returncode = self._measureframe_subprocess.returncode del self._measureframe_subprocess return returncode, stderr def measureframe_consumer(self, delayedResult): returncode, stderr = delayedResult.get() if returncode != -1: config.initcfg() self.get_set_display() if returncode != 255: self.Show(start_timers=True) self.restore_measurement_mode() self.restore_testchart() if returncode != 0 and stderr and stderr.strip(): InfoDialog(self, msg=safe_unicode(stderr.strip()), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) else: self.call_pending_function() def get_set_display(self, update_ccmx_items=False): """ Get the currently configured display number, and set the display device selection """ if debug: safe_print("[D] get_set_display") if self.worker.displays: self.display_ctrl.SetSelection( min(max(0, len(self.worker.displays) - 1), max(0, getcfg("display.number") - 1))) self.display_ctrl_handler( CustomEvent(wx.EVT_CHOICE.evtType[0], self.display_ctrl), load_lut=False, update_ccmx_items=update_ccmx_items) def get_ccxx_measurement_modes(self, instrument_name, swap=False): """ Get measurement modes suitable for colorimeter correction creation """ # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.set_ccxx_measurement_mode # - DisplayCAL.MainFrame.update_colorimeter_correction_matrix_ctrl_items # - worker.Worker.check_add_display_type_base_id # - worker.Worker.instrument_can_use_ccxx modes = {"ColorHug": {"F": lang.getstr("measurement_mode.factory"), "R": lang.getstr("measurement_mode.raw")}, "ColorHug2": {"F": lang.getstr("measurement_mode.factory"), "R": lang.getstr("measurement_mode.raw")}, "ColorMunki Smile": {"f": lang.getstr("measurement_mode.lcd.ccfl")}, "Colorimtre HCFR": {"R": lang.getstr("measurement_mode.raw")}, "K-10": {"F": lang.getstr("measurement_mode.factory")}}.get( instrument_name, {"c": lang.getstr("measurement_mode.refresh"), "l": lang.getstr("measurement_mode.lcd")}) if swap: modes = swap_dict_keys_values(modes) return modes def set_ccxx_measurement_mode(self): """ Set measurement mode suitable for colorimeter correction creation """ # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.get_ccxx_measurement_modes # - DisplayCAL.MainFrame.update_colorimeter_correction_matrix_ctrl_items # - worker.Worker.check_add_display_type_base_id # - worker.Worker.instrument_can_use_ccxx measurement_mode = None if getcfg("measurement_mode") == "auto": # Make changes in worker.Worker.add_instrument_features too! if self.worker.get_instrument_name() == "ColorHug": measurement_mode = "R" elif self.worker.get_instrument_name() == "ColorHug2": measurement_mode = "F" else: measurement_mode = "l" elif (self.worker.get_instrument_name() in ("ColorHug", "ColorHug2") and getcfg("measurement_mode") not in ("F", "R")): # Automatically set factory measurement mode if not already # factory or raw measurement mode measurement_mode = "F" elif (self.worker.get_instrument_name() == "ColorMunki Smile" and getcfg("measurement_mode") != "f"): # Automatically set LCD measurement mode if not already # LCD CCFL measurement mode measurement_mode = "f" elif (self.worker.get_instrument_name() == "Colorimtre HCFR" and getcfg("measurement_mode") != "R"): # Automatically set raw measurement mode if not already # raw measurement mode measurement_mode = "R" elif (self.worker.get_instrument_name() in ("Spyder4", "Spyder5") and getcfg("measurement_mode") not in ("l", "c")): # Automatically set LCD measurement mode if not already # LCD or refresh measurement mode measurement_mode = "l" if not getcfg("measurement_mode.backup", False): setcfg("measurement_mode.backup", getcfg("measurement_mode")) if measurement_mode: setcfg("measurement_mode", measurement_mode) self.update_measurement_mode() def set_pending_function(self, pending_function, *pending_function_args, **pending_function_kwargs): self.pending_function = pending_function self.pending_function_args = pending_function_args self.pending_function_kwargs = pending_function_kwargs def call_pending_function(self): # Needed for proper display updates under GNOME writecfg() if sys.platform in ("darwin", "win32") or isexe: self.measureframe.Hide() if debug: safe_print("[D] Calling pending function with args:", self.pending_function_args) wx.CallLater(100, self.pending_function, *self.pending_function_args, **self.pending_function_kwargs) self.pending_function = None def calibrate_and_profile_btn_handler(self, event): """ Setup calibration and characterization measurements """ if sys.platform == "darwin" or debug: self.focus_handler(event) if check_set_argyll_bin() and self.check_overwrite(".cal") and \ self.check_overwrite(".ti3") and self.check_overwrite(profile_ext): self.setup_measurement(self.calibrate_and_profile) def calibrate_and_profile(self): """ Start calibration measurements """ if self.measure_auto(self.calibrate_and_profile): return safe_print("-" * 80) safe_print(lang.getstr("button.calibrate_and_profile").replace("&&", "&")) setcfg("calibration.continue_next", 1) self.worker.dispcal_create_fast_matrix_shaper = False self.worker.dispread_after_dispcal = True if getcfg("calibration.interactive_display_adjustment") and \ not getcfg("calibration.update"): # Interactive adjustment, do not show progress dialog self.worker.interactive = True else: # No interactive adjustment, show progress dialog self.worker.interactive = False self.worker.start_calibration(self.calibrate_finish, progress_msg=lang.getstr("calibration"), continue_next=True, resume=bool(getattr(self, "measure_auto_after", None))) def calibrate_finish(self, result): """ Start characterization measurements """ self.worker.interactive = False if not isinstance(result, Exception) and result: wx.CallAfter(self.update_calibration_file_ctrl) if getcfg("trc"): cal = True else: cal = get_data_path("linear.cal") self.worker.start_measurement(self.calibrate_and_profile_finish, apply_calibration=cal, progress_msg=lang.getstr("measuring.characterization"), resume=True, continue_next=True) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) self.Show() def calibrate_and_profile_finish(self, result): """ Build profile from characterization measurements """ start_timers = True if not isinstance(result, Exception) and result: result = self.check_copy_ti3() if not isinstance(result, Exception) and result: start_timers = False wx.CallAfter(self.start_profile_worker, lang.getstr("calibration_profiling.complete"), resume=True) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif not getcfg("dry_run"): wx.CallAfter(InfoDialog, self, msg=lang.getstr("profiling.incomplete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.Show(start_timers=start_timers) def check_copy_ti3(self): result = self.measurement_file_check_confirm(parent=getattr(self.worker, "progress_wnd", self)) if isinstance(result, tuple): result = self.worker.wrapup(copy=True, remove=False, ext_filter=[".ti3"]) if isinstance(result, Exception) or not result: self.worker.stop_progress() return result def start_profile_worker(self, success_msg, resume=False): name = getcfg("profile.name.expanded") path = os.path.join(getcfg("profile.save_path"), name, name + profile_ext) self.lut3d_set_path(path) continue_next = (getcfg("3dlut.create") and not os.path.isfile(self.lut3d_path)) self.worker.interactive = False self.worker.start(self.profile_finish, self.worker.create_profile, ckwargs={"success_msg": success_msg, "failure_msg": lang.getstr( "profiling.incomplete"), "install_3dlut": getcfg("3dlut.create")}, wkwargs={"tags": True}, progress_msg=lang.getstr("create_profile"), resume=resume, continue_next=continue_next) def gamap_btn_handler(self, event): if not hasattr(self, "gamapframe"): self.init_gamapframe() if self.gamapframe.IsShownOnScreen(): self.gamapframe.Raise() else: self.gamapframe.Center() self.gamapframe.SetPosition((-1, self.GetPosition()[1] + self.GetSize()[1] - self.gamapframe.GetSize()[1] - 100)) self.gamapframe.Show(not self.gamapframe.IsShownOnScreen()) def current_cal_choice(self, silent=False): """ Prompt user to either keep or clear the current calibration, with option to embed or not embed Return None if the current calibration should be embedded Return False if no calibration should be embedded Return filename if a .cal file should be used Return wx.ID_CANCEL if whole operation should be cancelled """ if config.is_uncalibratable_display(): return False cal = getcfg("calibration.file", False) options_dispcal = None if cal: filename, ext = os.path.splitext(cal) if ext.lower() in (".icc", ".icm"): self.worker.options_dispcal = [] try: profile = ICCP.ICCProfile(cal) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.update_profile_name_timer.Start(1000) return wx.ID_CANCEL else: # get dispcal options if present options_dispcal = [ "-" + arg for arg in get_options_from_profile(profile)[0]] if os.path.isfile(filename + ".cal"): cal = filename + ".cal" else: cal = None if (self.worker.argyll_version < [1, 1, 0] or not self.worker.has_lut_access()): # If Argyll < 1.1, we cannot save the current VideoLUT to use it. # For web, there is no point in using the current VideoLUT as it # may not be from the display we render on (and we cannot save it # to begin with as there is no VideoLUT access). # So an existing .cal file or no calibration are the only options. can_use_current_cal = False else: can_use_current_cal = True if cal: msgstr = "dialog.cal_info" icon = "information" elif can_use_current_cal: msgstr = "dialog.current_cal_warning" icon = "warning" else: msgstr = "dialog.linear_cal_info" icon = "information" dlg = ConfirmDialog(self, msg=lang.getstr(msgstr, os.path.basename(cal) if cal else None), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-%s" % icon)) border = 12 if can_use_current_cal or cal: dlg.reset_cal_ctrl = wx.CheckBox(dlg, -1, lang.getstr("calibration.use_linear_instead")) dlg.sizer3.Add(dlg.reset_cal_ctrl, flag=wx.TOP | wx.ALIGN_LEFT, border=border) border = 4 dlg.embed_cal_ctrl = wx.CheckBox(dlg, -1, lang.getstr("calibration.embed")) def embed_cal_ctrl_handler(event): embed_cal = dlg.embed_cal_ctrl.GetValue() dlg.reset_cal_ctrl.Enable(embed_cal) if not embed_cal: dlg.reset_cal_ctrl.SetValue(True) if can_use_current_cal or cal: dlg.embed_cal_ctrl.Bind(wx.EVT_CHECKBOX, embed_cal_ctrl_handler) dlg.embed_cal_ctrl.SetValue(bool(can_use_current_cal or cal)) dlg.sizer3.Add(dlg.embed_cal_ctrl, flag=wx.TOP | wx.ALIGN_LEFT, border=border) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if silent: result = wx.ID_OK else: result = dlg.ShowModal() if can_use_current_cal or cal: reset_cal = dlg.reset_cal_ctrl.GetValue() embed_cal = dlg.embed_cal_ctrl.GetValue() dlg.Destroy() if result == wx.ID_CANCEL: self.update_profile_name_timer.Start(1000) return wx.ID_CANCEL if not embed_cal: if can_use_current_cal and reset_cal: self.reset_cal() return False elif not (can_use_current_cal or cal) or reset_cal: return get_data_path("linear.cal") elif cal: if options_dispcal: self.worker.options_dispcal = options_dispcal return cal def restore_measurement_mode(self): if getcfg("measurement_mode.backup", False): setcfg("measurement_mode", getcfg("measurement_mode.backup")) setcfg("measurement_mode.backup", None) if getcfg("comport.number.backup", False): setcfg("comport.number", getcfg("comport.number.backup")) setcfg("comport.number.backup", None) self.update_comports() else: self.update_measurement_mode() if getcfg("observer.backup", False): setcfg("observer", getcfg("observer.backup")) setcfg("observer.backup", None) def restore_testchart(self): if getcfg("testchart.file.backup", False): self.set_testchart(getcfg("testchart.file.backup")) setcfg("testchart.file.backup", None) def measure_auto(self, measure_auto_after, *measure_auto_after_args): """ Automatically create a CCMX with EDID reference """ if (getcfg("measurement_mode") == "auto" and not getattr(self, "measure_auto_after", None)): if not self.worker.get_display_edid(): self.measure_auto_finish(Error("EDID not available")) return True self.measure_auto_after = measure_auto_after self.measure_auto_after_args = measure_auto_after_args if not is_ccxx_testchart(): ccxx_testchart = get_ccxx_testchart() if not ccxx_testchart: self.measure_auto_finish(Error(lang.getstr("not_found", lang.getstr("ccxx.ti1")))) return True setcfg("testchart.file.backup", getcfg("testchart.file")) self.set_testchart(ccxx_testchart) self.setup_ccxx_measurement() self.just_measure(get_data_path("linear.cal"), self.measure_auto_finish) return True def measure_auto_finish(self, result): ti3_path = os.path.join(self.worker.tempdir or "", getcfg("profile.name.expanded") + ".ti3") self.restore_testchart() if isinstance(result, Exception) or not result: self.measure_auto_after = None if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) self.Show() self.worker.stop_progress() else: edid = self.worker.get_display_edid() defaultFile = edid.get("monitor_name", edid.get("ascii", str(edid["product_id"]))) + profile_ext profile_path = os.path.join(self.worker.tempdir, defaultFile) profile = ICCP.ICCProfile.from_edid(edid) try: profile.write(profile_path) except Exception, exception: self.measure_auto_finish(exception) return luminance = None if self.worker.get_instrument_name() == "ColorHug": # Get the factory calibration so we can do luminance scaling # NOTE that this currently only works for the ColorHug, # NOT the ColorHug2! (but it's probably not needed for the # ColorHug2 anyway) for line in self.worker.output: if line.lower().startswith("serial number:"): serial = line.split(":", 1)[-1].strip() calibration = "calibration-%s.ti3" % serial path = os.path.join(config.get_argyll_data_dir(), calibration) if not os.path.isfile(path): safe_print("Retrieving factory calibration for " "ColorHug", serial) url = ("https://raw.githubusercontent.com/hughski" "/colorhug-calibration/master/data/" + calibration) try: response = urllib2.urlopen(url) except Exception, exception: self.measure_auto_finish(exception) return body = response.read() response.close() if body.strip().startswith("CTI3"): safe_print("Successfully retrieved", url) try: with open(path, "wb") as calibrationfile: calibrationfile.write(body) except Exception, exception: safe_print(exception) else: safe_print("Got unexpected answer from %s:" % url) safe_print(body) if os.path.isfile(path): safe_print("Using factory calibration", path) try: cgats = CGATS.CGATS(path) except (IOError, CGATS.CGATSError), exception: safe_print(exception) else: white = cgats.queryi1({"RGB_R": 1, "RGB_G": 1, "RGB_B": 1}) if white: luminance = white["XYZ_Y"] safe_print("Using luminance %.2f from " "factory calibration" % luminance) if self.create_colorimeter_correction_handler(None, [profile_path, ti3_path], luminance=luminance): self.measure_auto_after(*self.measure_auto_after_args) else: self.Show() self.worker.stop_progress() self.measure_auto_after = None def measure_handler(self, event=None): self.setup_ccxx_measurement() if check_set_argyll_bin() and self.check_overwrite(".ti3"): if is_ccxx_testchart(): # Use linear calibration for measuring CCXX testchart apply_calibration = get_data_path("linear.cal") else: apply_calibration = self.current_cal_choice() if apply_calibration != wx.ID_CANCEL: self.setup_measurement(self.just_measure, apply_calibration) else: self.restore_measurement_mode() self.restore_testchart() def profile_btn_handler(self, event): """ Setup characterization measurements """ if sys.platform == "darwin" or debug: self.focus_handler(event) if check_set_argyll_bin() and self.check_overwrite(".ti3") and \ self.check_overwrite(profile_ext): apply_calibration = self.current_cal_choice(silent=isinstance(event, CustomEvent)) if apply_calibration != wx.ID_CANCEL: self.setup_measurement(self.just_profile, apply_calibration) def setup_ccxx_measurement(self): if is_ccxx_testchart(): # Allow different location to store measurements path = getcfg("profile.save_path") if not path: self.profile_save_path_btn_handler(None) path = getcfg("profile.save_path") if path: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return setcfg("measurement.save_path", path) if getcfg("observer") == "1931_2": basename = ("%s & %s %s" % (self.worker.get_instrument_name(), self.worker.get_display_name(True, True), strftime("%Y-%m-%d %H-%M-%S"))) else: basename = ("%s (%s %s) & %s %s" % (self.worker.get_instrument_name(), lang.getstr("observer." + getcfg("observer")), lang.getstr("observer"), self.worker.get_display_name(True, True), strftime("%Y-%m-%d %H-%M-%S"))) setcfg("measurement.name.expanded", make_filename_safe(basename)) else: return def just_measure(self, apply_calibration, consumer=None): if self.measure_auto(self.just_measure, apply_calibration): return safe_print("-" * 80) safe_print(lang.getstr("measure")) self.worker.dispread_after_dispcal = False self.worker.interactive = config.get_display_name() == "Untethered" setcfg("calibration.file.previous", None) continue_next = bool(consumer) resume = bool(getattr(self, "measure_auto_after", None)) if not consumer: consumer = self.just_measure_finish self.worker.start_measurement(consumer, apply_calibration, progress_msg=lang.getstr("measuring.characterization"), continue_next=continue_next, resume=resume) def just_measure_finish(self, result): if not isinstance(result, Exception) and result: result = self.check_copy_ti3() self.worker.wrapup(copy=False, remove=True) if isinstance(result, Exception) or not result: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif is_ccxx_testchart(): try: cgats = CGATS.CGATS(os.path.join(getcfg("measurement.save_path"), getcfg("measurement.name.expanded"), getcfg("measurement.name.expanded")) + ".ti3") except Exception, exception: wx.CallAfter(show_result_dialog, exception, self) else: if cgats.queryv1("INSTRUMENT_TYPE_SPECTRAL") == "YES": setcfg("last_reference_ti3_path", cgats.filename) else: setcfg("last_colorimeter_ti3_path", cgats.filename) if getcfg("comport.number.backup", False): # Measurements were started from colorimeter correction # creation dialog paths = [] if (getcfg("last_reference_ti3_path", False) and os.path.isfile(getcfg("last_reference_ti3_path")) and (getcfg("colorimeter_correction.type") == "spectral" or (getcfg("last_colorimeter_ti3_path", False) and os.path.isfile(getcfg("last_colorimeter_ti3_path")) and self.worker.get_instrument_name() == getcfg("colorimeter_correction.instrument")))): paths.append(getcfg("last_reference_ti3_path")) if (self.worker.get_instrument_name() == getcfg("colorimeter_correction.instrument")): paths.append(getcfg("last_colorimeter_ti3_path")) wx.CallAfter(self.create_colorimeter_correction_handler, True, paths=paths) else: wx.CallAfter(self.just_measure_show_result, os.path.join(getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded") + ".ti3")) self.Show(start_timers=True) self.restore_measurement_mode() self.restore_testchart() def just_measure_show_result(self, path): dlg = ConfirmDialog(self, msg=lang.getstr("measurements.complete"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question")) if dlg.ShowModal() == wx.ID_OK: launch_file(os.path.dirname(path)) dlg.Destroy() def just_profile(self, apply_calibration): """ Start characterization measurements """ if self.measure_auto(self.just_profile, apply_calibration): return safe_print("-" * 80) safe_print(lang.getstr("button.profile")) self.worker.dispread_after_dispcal = False self.worker.interactive = config.get_display_name() == "Untethered" setcfg("calibration.file.previous", None) self.worker.start_measurement(self.just_profile_finish, apply_calibration, progress_msg=lang.getstr("measuring.characterization"), continue_next=config.get_display_name() != "Untethered", resume=bool(getattr(self, "measure_auto_after", None))) def just_profile_finish(self, result): """ Build profile from characterization measurements """ start_timers = True if not isinstance(result, Exception) and result: result = self.check_copy_ti3() if not isinstance(result, Exception) and result: start_timers = False wx.CallAfter(self.start_profile_worker, lang.getstr("profiling.complete"), resume=True) else: if isinstance(result, Exception): wx.CallAfter(show_result_dialog, result, self) elif not getcfg("dry_run"): wx.CallAfter(InfoDialog, self, msg=lang.getstr("profiling.incomplete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.Show(start_timers=start_timers) def profile_finish(self, result, profile_path=None, success_msg="", failure_msg="", preview=True, skip_scripts=False, allow_show_log=True, install_3dlut=False): if not isinstance(result, Exception) and result: if getcfg("log.autoshow") and allow_show_log: self.infoframe_toggle_handler(show=True) self.install_3dlut = install_3dlut if profile_path: profile_save_path = os.path.splitext(profile_path)[0] else: profile_save_path = os.path.join( getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded")) profile_path = profile_save_path + profile_ext self.cal = profile_path profile = None filename, ext = os.path.splitext(profile_path) extra = [] cinfo = [] vinfo = [] has_cal = False try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + profile_path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.start_timers(True) setcfg("calibration.file.previous", None) return else: has_cal = isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType) if profile.profileClass != "mntr" or \ profile.colorSpace != "RGB": InfoDialog(self, msg=lang.getstr("profiling.complete"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) self.start_timers(True) setcfg("calibration.file.previous", None) return if getcfg("calibration.file", False) != profile_path: # Load profile (options_dispcal, options_colprof) = get_options_from_profile(profile) if options_dispcal or options_colprof: cal = profile_save_path + ".cal" sel = self.calibration_file_ctrl.GetSelection() if options_dispcal and self.recent_cals[sel] == cal: self.recent_cals.remove(cal) self.calibration_file_ctrl.Delete(sel) if getcfg("settings.changed"): self.settings_discard_changes() if options_dispcal and options_colprof: self.load_cal_handler(None, path=profile_path, update_profile_name=False, silent=True, load_vcgt=False) else: setcfg("calibration.file", profile_path) setcfg("3dlut.output.profile", profile_path) setcfg("measurement_report.output_profile", profile_path) self.update_controls(update_profile_name=False) # Get 3D LUT options self.lut3d_set_path() # Check if we want to automatically create 3D LUT if (install_3dlut and getcfg("3dlut.create") and not os.path.isfile(self.lut3d_path)): # Update curve viewer if shown self.lut_viewer_load_lut(profile=profile) # Create 3D LUT self.lut3d_create_handler(None) return elif hasattr(self.worker, "_disabler"): # This shouldn't happen self.worker.stop_progress() if "meta" in profile.tags: for key in ("avg", "max", "rms"): try: dE = float(profile.tags.meta.getvalue("ACCURACY_dE76_%s" % key)) except (TypeError, ValueError): pass else: lstr = lang.getstr("profile.self_check") + ":" if not lstr in extra: extra.append(lstr) extra.append(u" %s %.2f" % (lang.getstr("profile.self_check.%s" % key), dE)) gamuts = (("srgb", "sRGB", ICCP.GAMUT_VOLUME_SRGB), ("adobe-rgb", "Adobe RGB", ICCP.GAMUT_VOLUME_ADOBERGB), ("dci-p3", "DCI P3", ICCP.GAMUT_VOLUME_SMPTE431_P3)) for key, name, volume in gamuts: try: gamut_coverage = float(profile.tags.meta.getvalue("GAMUT_coverage(%s)" % key)) except (TypeError, ValueError): gamut_coverage = None if gamut_coverage: cinfo.append("%.1f%% %s" % (gamut_coverage * 100, name)) try: gamut_volume = float(profile.tags.meta.getvalue("GAMUT_volume")) except (TypeError, ValueError): gamut_volume = None if gamut_volume: for key, name, volume in gamuts: vinfo.append("%.1f%% %s" % (gamut_volume * ICCP.GAMUT_VOLUME_SRGB / volume * 100, name)) if len(vinfo) == len(cinfo): break if config.is_virtual_display() or install_3dlut: installable = False title = appname if self.lut3d_path and os.path.isfile(self.lut3d_path): # 3D LUT file already exists if (getcfg("3dlut.format") in ("madVR", "ReShade") or config.check_3dlut_format("Prisma")): ok = lang.getstr("3dlut.install") else: ok = lang.getstr("3dlut.save_as") else: ok = lang.getstr("3dlut.create") cancel = lang.getstr("cancel") else: # Check if profile is a LUT-type, and if yes, if LUT is of high # enough resolution (we assume anything >= 17 to be ok) if ("B2A0" in profile.tags and isinstance(profile.tags.B2A0, ICCP.LUT16Type) and profile.tags.B2A0.clut_grid_steps < 17): # Nope. Not allowing to install. Offer to re-generate B2A # tables. dlg = ConfirmDialog(self, msg=lang.getstr("profile.b2a.lowres.warning"), bitmap=geticon(32, "dialog-warning")) choice = dlg.ShowModal() if choice == wx.ID_OK: self.profile_hires_b2a_handler(None, profile) return installable = True title = lang.getstr("profile.install") ok = lang.getstr("profile.install") cancel = lang.getstr("profile.do_not_install") if not success_msg: if installable: success_msg = lang.getstr("dialog.install_profile", (os.path.basename(profile_path), self.display_ctrl.GetStringSelection())) else: success_msg = lang.getstr("profiling.complete") if extra: extra = ",".join(extra).replace(":,", ":").replace(",,", "\n") success_msg = "\n\n".join([success_msg, extra]).strip() # Always load calibration curves self.load_cal(cal=profile_path, silent=True) # Check profile metadata share_profile = None if not self.profile_share_get_meta_error(profile): share_profile = lang.getstr("profile.share") dlg = ConfirmDialog(self, msg=success_msg, title=title, ok=ok, cancel=cancel, bitmap=geticon(32, appname + "-profile-info"), alt=share_profile) if cinfo or vinfo: gamut_info_sizer = wx.FlexGridSizer(2, 2, 0, 24) dlg.sizer3.Add(gamut_info_sizer, flag=wx.TOP, border=14) if cinfo: label = wx.StaticText(dlg, -1, lang.getstr("gamut.coverage")) font = label.GetFont() font.SetWeight(wx.BOLD) label.SetFont(font) gamut_info_sizer.Add(label) if vinfo: label = wx.StaticText(dlg, -1, lang.getstr("gamut.volume")) font = label.GetFont() font.SetWeight(wx.BOLD) label.SetFont(font) else: label = (1, 1) gamut_info_sizer.Add(label) if cinfo: gamut_info_sizer.Add(wx.StaticText(dlg, -1, "\n".join(cinfo))) if vinfo: gamut_info_sizer.Add(wx.StaticText(dlg, -1, "\n".join(vinfo))) self.modaldlg = dlg if share_profile: # Show share profile button dlg.Unbind(wx.EVT_BUTTON, dlg.alt) dlg.Bind(wx.EVT_BUTTON, self.profile_share_handler, id=dlg.alt.GetId()) if preview and has_cal and self.worker.calibration_loading_supported: # Show calibration preview checkbox self.preview = wx.CheckBox(dlg, -1, lang.getstr("calibration.preview")) self.preview.SetValue(True) dlg.Bind(wx.EVT_CHECKBOX, self.preview_handler, id=self.preview.GetId()) dlg.sizer3.Add(self.preview, flag=wx.TOP | wx.ALIGN_LEFT, border=14) if LUTFrame and not ProfileInfoFrame: # Disabled, use profile information window instead self.show_lut = wx.CheckBox(dlg, -1, lang.getstr( "calibration.show_lut")) dlg.Bind(wx.EVT_CHECKBOX, self.show_lut_handler, id=self.show_lut.GetId()) dlg.sizer3.Add(self.show_lut, flag=wx.TOP | wx.ALIGN_LEFT, border=4) self.show_lut.SetValue(bool(getcfg("lut_viewer.show"))) if not getattr(self, "lut_viewer", None): self.init_lut_viewer(profile=profile, show=getcfg("lut_viewer.show")) else: dlg.sizer3.Add((0, 10)) self.show_profile_info = wx.CheckBox(dlg, -1, lang.getstr("profile.info.show")) dlg.Bind(wx.EVT_CHECKBOX, self.profile_info_handler, id=self.show_profile_info.GetId()) dlg.sizer3.Add(self.show_profile_info, flag=wx.TOP | wx.ALIGN_LEFT, border=4) if profile.ID == "\0" * 16: id = profile.calculateID(False) else: id = profile.ID if id in self.profile_info: self.show_profile_info.SetValue( self.profile_info[id].IsShownOnScreen()) if installable: if sys.platform == "win32": # Get profile loader config cur = self.send_command("apply-profiles", "getcfg profile.load_on_login") if cur: try: cur = int(cur.split()[-1]) except: pass else: setcfg("profile.load_on_login", cur) else: # Profile loader not running? Fall back to config files # 1. Remember current config items = config.cfg.items(config.ConfigParser.DEFAULTSECT) # 2. Read in profile loader config. Result is unison of # current config and profile loader config. initcfg("apply-profiles") # 3. Restore current config (but do not override profile # loader options) for name, value in items: if (name != "profile.load_on_login" and not name.startswith("profile_loader")): config.cfg.set(config.ConfigParser.DEFAULTSECT, name, value) # 4. Remove profile loader options from current config for name in defaults: if name.startswith("profile_loader"): setcfg(name, None) if sys.platform != "darwin" or test: os_cal = (sys.platform == "win32" and sys.getwindowsversion() >= (6, 1) and util_win.calibration_management_isenabled()) label = get_profile_load_on_login_label(os_cal) self.profile_load_on_login = wx.CheckBox(dlg, -1, label) self.profile_load_on_login.SetValue( bool(getcfg("profile.load_on_login") or os_cal)) dlg.Bind(wx.EVT_CHECKBOX, self.profile_load_on_login_handler, id=self.profile_load_on_login.GetId()) dlg.sizer3.Add(self.profile_load_on_login, flag=wx.TOP | wx.ALIGN_LEFT, border=14) dlg.sizer3.Add((1, 4)) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, 1)): self.profile_load_by_os = wx.CheckBox(dlg, -1, lang.getstr("profile.load_on_login.handled_by_os")) self.profile_load_by_os.SetValue( bool(os_cal)) dlg.Bind(wx.EVT_CHECKBOX, self.profile_load_by_os_handler, id=self.profile_load_by_os.GetId()) dlg.sizer3.Add(self.profile_load_by_os, flag=wx.LEFT | wx.ALIGN_LEFT, border=16) dlg.sizer3.Add((1, 4)) self.profile_load_on_login_handler() if ((sys.platform == "darwin" or (sys.platform != "win32" and self.worker.argyll_version >= [1, 1, 0])) and (os.geteuid() == 0 or which("sudo"))) or \ (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and self.worker.argyll_version > [1, 1, 1]) or test: # Linux, OSX or Vista and later # NOTE: System install scope is currently not implemented # correctly in dispwin 1.1.0, but a patch is trivial and # should be in the next version # 2010-06-18: Do not offer system install in DisplayCAL when # installing via GCM or oyranos FIXME: oyranos-monitor can't # be run via sudo self.install_profile_user = wx.RadioButton( dlg, -1, lang.getstr("profile.install_user"), style=wx.RB_GROUP) self.install_profile_user.SetValue( getcfg("profile.install_scope") == "u") dlg.Bind(wx.EVT_RADIOBUTTON, self.install_profile_scope_handler, id=self.install_profile_user.GetId()) dlg.sizer3.Add(self.install_profile_user, flag=wx.TOP | wx.ALIGN_LEFT, border=10) self.install_profile_systemwide = wx.RadioButton( dlg, -1, lang.getstr("profile.install_local_system")) self.install_profile_systemwide.SetValue( getcfg("profile.install_scope") == "l") dlg.Bind(wx.EVT_RADIOBUTTON, self.install_profile_scope_handler, id=self.install_profile_systemwide.GetId()) dlg.sizer3.Add(self.install_profile_systemwide, flag=wx.TOP | wx.ALIGN_LEFT, border=4) if sys.platform == "darwin" and \ os.path.isdir("/Network/Library/ColorSync/Profiles"): self.install_profile_network = wx.RadioButton( dlg, -1, lang.getstr("profile.install_network")) self.install_profile_network.SetValue( getcfg("profile.install_scope") == "n") dlg.Bind(wx.EVT_RADIOBUTTON, self.install_profile_scope_handler, id=self.install_profile_network.GetId()) dlg.sizer3.Add(self.install_profile_network, flag=wx.TOP | wx.ALIGN_LEFT, border=4) self.install_profile_scope_handler(None) else: setcfg("profile.install_scope", "u") dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg._disabler = BetterWindowDisabler([dlg, getattr(self, "lut_viewer", None)] + self.profile_info.values()) dlg.profile = profile dlg.profile_path = profile_path dlg.skip_scripts = skip_scripts dlg.preview = preview dlg.OnCloseIntercept = self.profile_finish_close_handler if sys.platform != "win32": # Make sure we stay under our dialog self.Bind(wx.EVT_ACTIVATE, self.modaldlg_raise_handler) dlg.Show() else: if isinstance(result, Exception): show_result_dialog(result, self) if getcfg("dry_run"): return InfoDialog(self, msg=failure_msg, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) if sys.platform == "darwin": # For some reason, the call to enable_menus() in Show() # sometimes isn't enough under Mac OS X (e.g. after calibrate & # profile) self.enable_menus() self.start_timers(True) setcfg("calibration.file.previous", None) def profile_finish_close_handler(self, event): if event.GetEventObject() == self.modaldlg: result = wx.ID_CANCEL else: result = event.GetId() lut3d = config.is_virtual_display() or self.install_3dlut # madVR has an API for installing 3D LUTs # Prisma has a HTTP REST interface for uploading and # configuring 3D LUTs if getcfg("3dlut.format") == "madVR" and not hasattr(self.worker, "madtpg"): try: self.worker.madtpg_init() except Exception, exception: safe_print("Could not initialize madTPG:", exception) madtpg = getattr(self.worker, "madtpg", None) # Note: madVR HDR 3D LUT install API was added September 2017, # we don't require it so check availability install_3dlut_api = ((getcfg("3dlut.format") == "madVR" and (not getcfg("3dlut.trc").startswith("smpte2084") or hasattr(madtpg, "load_hdr_3dlut_file"))) or config.check_3dlut_format("Prisma")) if result != wx.ID_OK or lut3d: if self.modaldlg.preview: if getcfg("calibration.file", False): # Load LUT curves from last used .cal file self.load_cal(silent=True) if not getcfg("calibration.autoload"): # Reload display profile into videoLUT self.load_display_profile_cal(True, False) else: # Load LUT curves from current display profile (if any, # and if it contains curves) self.load_display_profile_cal(True) if getattr(self, "preview", None): self.preview.SetValue(False) if (result != wx.ID_OK or not self.lut3d_path or not os.path.isfile(self.lut3d_path) or not install_3dlut_api): self.profile_finish_consumer() if result == wx.ID_OK: producer = None if lut3d: if self.lut3d_path and os.path.isfile(self.lut3d_path): # 3D LUT file already exists if install_3dlut_api: filename = self.setup_patterngenerator(self.modaldlg, lang.getstr("3dlut.install"), True) if not filename: return producer = self.worker.install_3dlut wargs = (self.lut3d_path, filename) wkwargs = None progress_msg = lang.getstr("3dlut.install") else: # Copy to user-selectable location wx.CallAfter(self.lut3d_create_handler, None, copy_from_path=self.lut3d_path) else: # Need to create 3D LUT wx.CallAfter(self.lut3d_create_handler, None) else: if getcfg("profile.install_scope") in ("l", "n"): result = self.worker.authenticate("dispwin", lang.getstr("profile.install"), self.modaldlg) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, parent=self.modaldlg) self.modaldlg.Raise() return producer = self.worker.install_profile wargs = () wkwargs = {"profile_path": self.modaldlg.profile_path, "skip_scripts": self.modaldlg.skip_scripts} progress_msg = lang.getstr("profile.install") if producer: safe_print("-" * 80) safe_print(progress_msg) self.worker.interactive = False self.worker.start(self.profile_finish_consumer, producer, wargs=wargs, wkwargs=wkwargs, parent=self.modaldlg, progress_msg=progress_msg, stop_timers=False, fancy=False) def profile_finish_consumer(self, result=None): if isinstance(result, Exception): show_result_dialog(result, parent=self.modaldlg) if not getcfg("dry_run") and not isinstance(result, (Info, Warning)): self.modaldlg.Raise() return elif result: # Check all profile install methods argyll_install, colord_install, oy_install, loader_install = result allgood = (argyll_install in (None, True) and colord_install in (None, True) and oy_install in (None, True) and loader_install in (None, True)) somegood = (argyll_install is True or colord_install is True or oy_install is True or loader_install is True) linux = sys.platform not in ("darwin", "win32") if allgood: msg = lang.getstr("profile.install.success") icon = "dialog-information" elif somegood and linux: msg = lang.getstr("profile.install.warning") icon = "dialog-warning" else: msg = lang.getstr("profile.install.error") icon = "dialog-error" dlg = InfoDialog(self.modaldlg, msg=msg, ok=lang.getstr("ok"), bitmap=geticon(32, icon), show=False) if not allgood and linux: sizer = wx.FlexGridSizer(0, 2, 8, 8) dlg.sizer3.Add(sizer, 1, flag=wx.TOP, border=12) for name, result in (("ArgyllCMS", argyll_install), ("colord", colord_install), ("Oyranos", oy_install), (lang.getstr("profile_loader"), loader_install)): if result is not None: if result is True: icon = "checkmark" result = lang.getstr("ok") elif isinstance(result, Warning): icon = "dialog-warning" else: icon = "x" if not result: result = lang.getstr("failure") result = wrap(safe_unicode(result)) sizer.Add(wx.StaticBitmap(dlg, -1, geticon(16, icon)), flag=wx.TOP, border=2) sizer.Add(wx.StaticText(dlg, -1, ": ".join([name, result]))) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg.ShowModalThenDestroy(self.modaldlg) # Unbind automatic lowering self.Unbind(wx.EVT_ACTIVATE) self.Raise() del self.modaldlg._disabler self.modaldlg.Destroy() # The C part of modaldlg will not be gone instantly, so we must # dereference it before we can delete the python attribute self.modaldlg = None del self.modaldlg if sys.platform == "darwin": # For some reason, the call to enable_menus() in Show() # sometimes isn't enough under Mac OS X (e.g. after calibrate & # profile) self.enable_menus() self.start_timers(True) setcfg("calibration.file.previous", None) def profile_info_close_handler(self, event): if getattr(self, "show_profile_info", None): # If the profile install dialog is shown, just hide info window self.profile_info[event.GetEventObject().profileID].Hide() self.show_profile_info.SetValue(False) else: # Remove the frame from the hash table self.profile_info.pop(event.GetEventObject().profileID) # Closes the window event.Skip() def profile_info_handler(self, event=None, profile=None): if profile: pass elif (event and event.GetEventObject() is getattr(self, "show_profile_info", False)): # Use the profile that was requested to be installed profile = self.modaldlg.profile else: profile = self.select_profile(title=lang.getstr("profile.info"), check_profile_class=False, prefer_current_profile=True, ignore_current_profile=event and event.GetEventObject() is not self.profile_info_btn) if not profile: return if profile.ID == "\0" * 16: id = profile.calculateID(False) else: id = profile.ID show = (not getattr(self, "show_profile_info", None) or self.show_profile_info.GetValue()) if show: if not id in self.profile_info: # Create profile info window and store in hash table self.profile_info[id] = ProfileInfoFrame(None, -1) self.profile_info[id].Unbind(wx.EVT_CLOSE) self.profile_info[id].Bind(wx.EVT_CLOSE, self.profile_info_close_handler) if (not self.profile_info[id].profile or self.profile_info[id].profile.calculateID(False) != id): # Load profile if info window has no profile or ID is different self.profile_info[id].profileID = id self.profile_info[id].LoadProfile(profile) if self.profile_info.get(id): if self.profile_info[id].IsIconized() and show: self.profile_info[id].Restore() else: self.profile_info[id].Show(show) if show: self.profile_info[id].Raise() def get_commands(self): return (self.get_common_commands() + ["3DLUT-maker [create filename]", "calibrate", "calibrate-profile", "create-colorimeter-correction", "create-profile [filename]", "curve-viewer [filename]", appname + " [filename]", "enable-spyder2", "import-colorimeter-corrections [filename...]", "install-profile [filename]", "load ", "measure", "measure-uniformity", "measurement-report [filename]", "profile", "profile-info [filename]", "report-calibrated", "report-uncalibrated", "set-argyll-dir [dirname]", "synthprofile [filename]", "testchart-editor [filename | create filename]", "verify-calibration"]) def process_data(self, data): """ Process data """ if not self.IsShownOnScreen() and data[0] != "measure": # If we were hidden, perform necessary cleanup in case the # measurement window is shown and we're not starting measurements if isinstance(getattr(self, "_measureframe_subprocess", None), sp.Popen): self._measureframe_subprocess.terminate() elif hasattr(self, "measureframe"): self.measureframe.close_handler(None) else: return "busy" response = "ok" if data[0] == "3DLUT-maker" and (len(data) == 1 or (len(data) == 3 and data[1] == "create")): # 3D LUT maker if len(data) == 3: self.lut3d_create_handler(None, data[-1]) else: self.tab_select_handler(self.lut3d_settings_btn, True) elif data[0] == "curve-viewer" and len(data) < 3: # Curve viewer profile = None if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: return "fail" wx.CallAfter(self.init_lut_viewer, profile=profile, show=True) elif data[0] == "profile-info" and len(data) < 3: # Profile info profile = None if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: return "fail" wx.CallAfter(self.profile_info_handler, profile=profile) elif data[0] == "synthprofile" and len(data) < 3: # Synthetic profile creator self.synthicc_create_handler(None) if len(data) == 2: response = self.synthiccframe.process_data(data) elif data[0] == "testchart-editor" and (len(data) < 3 or (len(data) == 3 and data[1] == "create")): # Testchart editor if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: path = None if not hasattr(self, "tcframe"): self.init_tcframe(path=path) setcfg("tc.show", 1) self.tcframe.Show() else: if self.tcframe.IsIconized(): self.tcframe.Restore() else: self.tcframe.Show() if path: self.tcframe.tc_load_cfg_from_ti1(path=path) self.tcframe.Raise() if len(data) == 3: # Create testchart response = self.tcframe.process_data(data) elif (data[0] == appname and len(data) < 3) or (data[0] == "load" and len(data) == 2): # Main window if self.IsIconized(): self.Restore() self.Raise() if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: self.droptarget.OnDropFiles(0, 0, [path]) elif data[0] == "calibrate" and len(data) == 1: # Calibrate wx.CallAfter(self.calibrate_btn_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.calibrate_btn)) elif data[0] == "calibrate-profile" and len(data) == 1: # Calibrate & profile wx.CallAfter(self.calibrate_and_profile_btn_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.calibrate_and_profile_btn)) elif data[0] == "create-profile" and len(data) < 3: if len(data) == 2: profile_path = data[1] else: profile_path = None wx.CallAfter(self.create_profile_handler, None, path=profile_path) elif data[0] == "import-colorimeter-corrections": wx.CallAfter(self.import_colorimeter_corrections_handler, None, paths=data[1:]) elif data[0] == "install-profile" and len(data) < 3: if len(data) == 2: wx.CallAfter(self.install_profile_handler, profile_path=data[1], install_3dlut=False) else: wx.CallAfter(self.select_install_profile_handler, None) elif data[0] == "measure" and len(data) == 1: # Start measurement if getattr(self, "pending_function", None): if isinstance(getattr(self, "_measureframe_subprocess", None), sp.Popen): p = self._measureframe_subprocess self._measureframe_subprocess = Dummy() self._measureframe_subprocess.returncode = 255 p.terminate() else: self.worker.wrapup(False) self.HideAll() self.call_pending_function() else: response = "fail" elif data[0] == "measurement-report" and len(data) < 3: # Measurement report if len(data) == 2: wx.CallAfter(self.measurement_report_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.measurement_report_btn), path=data[1]) else: self.tab_select_handler(self.mr_settings_btn, True) elif data[0] == "profile" and len(data) == 1: # Profile wx.CallAfter(self.profile_btn_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.profile_btn)) elif data[0] == "refresh" and len(data) == 1: # Refresh main window self.update_displays() self.update_controls() self.update_menus() if hasattr(self, "tcframe"): self.tcframe.tc_update_controls() elif data[0] == "restore-defaults": # Restore defaults wx.CallAfter(self.restore_defaults_handler, include=data[1:]) elif data[0] == "setlanguage" and len(data) == 2: setcfg("lang", data[1]) menuitem = self.menubar.FindItemById(lang.ldict[lang.getcode()].menuitem_id) event = CustomEvent(wx.EVT_MENU.typeId, menuitem) wx.CallAfter(self.set_language_handler, event) elif (data[0] in ("create-colorimeter-correction", "enable-spyder2", "measure-uniformity", "report-calibrated", "report-uncalibrated", "verify-calibration")) and len(data) == 1: wx.CallAfter(getattr(self, data[0].replace("-", "_") + "_handler"), True) elif data[0] == "set-argyll-dir" and len(data) <= 2: if (getattr(self.worker, "thread", None) and self.worker.thread.isAlive()): return "blocked" if len(data) == 2: setcfg("argyll.dir", data[1]) # Always write cfg directly after setting Argyll directory so # subprocesses that read the configuration will use the right # executables writecfg() wx.CallAfter(self.check_update_controls, True) else: wx.CallAfter(self.set_argyll_bin_handler, True) else: response = "invalid" return response def modaldlg_raise_handler(self, event): """ Prevent modal dialog from being lowered (keep on top) """ self.modaldlg.Raise() def observer_ctrl_handler(self, event): observer = self.observers_ba.get(self.observer_ctrl.GetStringSelection()) setcfg("observer", observer) def output_levels_handler(self, event): auto = self.output_levels_auto.GetValue() setcfg("patterngenerator.detect_video_levels", int(auto)) if not auto: setcfg("patterngenerator.use_video_levels", int(self.output_levels_limited_range.GetValue())) def init_lut_viewer(self, event=None, profile=None, show=None): if debug: safe_print("[D] init_lut_viewer", profile.getDescription() if profile else None, "show:", show) if LUTFrame: lut_viewer = getattr(self, "lut_viewer", None) if not lut_viewer: self.lut_viewer = LUTFrame(None, -1) self.lut_viewer.client.worker = self.worker self.lut_viewer.update_controls() self.lut_viewer.Bind(wx.EVT_CLOSE, self.lut_viewer_close_handler, self.lut_viewer) if not profile and not hasattr(self, "current_cal"): path = getcfg("calibration.file", False) if path: name, ext = os.path.splitext(path) if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), \ exception: msg = lang.getstr("profile.invalid") + "\n" + path if event or not lut_viewer: show_result_dialog(Error(msg), self) else: safe_print(msg) profile = None else: profile = cal_to_fake_profile(path) else: profile = get_display_profile() or False if show is None: show = not self.lut_viewer.IsShownOnScreen() if debug: safe_print("[D] init_lut_viewer (2)", profile.getDescription() if profile else None, "show:", show) self.show_lut_handler(profile=profile, show=show) def lut_viewer_load_lut(self, event=None, profile=None, force_draw=False): if debug: safe_print("[D] lut_viewer_load_lut", profile.getDescription() if profile else None, "force_draw:", force_draw) if LUTFrame: self.current_cal = profile if getattr(self, "lut_viewer", None) and \ (self.lut_viewer.IsShownOnScreen() or force_draw): self.lut_viewer.load_lut(profile) def show_lut_handler(self, event=None, profile=None, show=None): if debug: safe_print("[D] show_lut_handler", profile.getDescription() if profile else None, "show:", show) if show is None: show = bool((hasattr(self, "show_lut") and self.show_lut and self.show_lut.GetValue()) or (not hasattr(self, "show_lut") or not self.show_lut)) setcfg("lut_viewer.show", int(show)) if not profile and hasattr(self, "current_cal"): profile = self.current_cal if show: self.lut_viewer_load_lut(event, profile, force_draw=True) if getattr(self, "lut_viewer", None): self.menuitem_show_lut.Check(show) if self.lut_viewer.IsIconized() and show: self.lut_viewer.Restore() else: self.lut_viewer.Show(show) if show: self.lut_viewer.Raise() def lut_viewer_close_handler(self, event=None): setcfg("lut_viewer.show", 0) self.lut_viewer.Hide() self.menuitem_show_lut.Check(False) if hasattr(self, "show_lut") and self.show_lut: self.show_lut.SetValue(self.lut_viewer.IsShownOnScreen()) def show_advanced_options_handler(self, event=None): """ Show or hide advanced calibration settings """ show_advanced_options = bool(getcfg("show_advanced_options")) if event: show_advanced_options = not show_advanced_options setcfg("show_advanced_options", int(show_advanced_options)) self.panel.Freeze() self.menuitem_show_advanced_options.Check(show_advanced_options) self.menuitem_advanced_options.Enable(show_advanced_options) self.override_display_settle_time_mult.Show( show_advanced_options and getcfg("argyll.version") >= "1.7") self.display_settle_time_mult.Show( show_advanced_options and getcfg("argyll.version") >= "1.7") for ctrl in (self.override_min_display_update_delay_ms, self.min_display_update_delay_ms, self.min_display_update_delay_ms_label, self.output_levels_label, self.output_levels_auto, self.output_levels_full_range, self.output_levels_limited_range, self.black_luminance_label, self.black_luminance_ctrl, # Profiling options self.black_point_compensation_cb, self.profile_type_label, self.profile_type_ctrl, self.gamap_btn, # Patch sequence self.testchart_patch_sequence_label, self.testchart_patch_sequence_ctrl): ctrl.GetContainingSizer().Show(ctrl, show_advanced_options) self.whitepoint_colortemp_locus_label.Show(show_advanced_options and self.whitepoint_ctrl.GetSelection() != 2) self.whitepoint_colortemp_locus_ctrl.Show(show_advanced_options and self.whitepoint_ctrl.GetSelection() != 2) self.black_luminance_textctrl.Show(show_advanced_options and bool(getcfg("calibration.black_luminance", False))) self.black_luminance_textctrl_label.Show(show_advanced_options and bool(getcfg("calibration.black_luminance", False))) self.lut3d_show_controls() self.mr_show_trc_controls() if event: self.show_observer_ctrl() self.show_trc_controls() self.calpanel.Layout() self.calpanel.Refresh() self.panel.Thaw() if event: self.set_size(True) self.update_scrollbars() def show_observer_ctrl(self): self.panel.Freeze() show = bool((getcfg("calibration.interactive_display_adjustment", False) or getcfg("trc")) and getcfg("show_advanced_options") and self.worker.instrument_can_use_nondefault_observer()) self.observer_label.Show(show) self.observer_ctrl.Show(show) self.calpanel.Layout() self.panel.Thaw() self.update_scrollbars() def update_observer_ctrl(self): self.observer_ctrl.SetStringSelection(self.observers_ab[getcfg("observer")]) def install_profile_scope_handler(self, event): if self.install_profile_systemwide.GetValue(): setcfg("profile.install_scope", "l") if hasattr(self.modaldlg.ok, "SetAuthNeeded"): self.modaldlg.ok.SetAuthNeeded(True) elif sys.platform == "darwin" and \ os.path.isdir("/Network/Library/ColorSync/Profiles") and \ self.install_profile_network.GetValue(): setcfg("profile.install_scope", "n") elif self.install_profile_user.GetValue(): setcfg("profile.install_scope", "u") if hasattr(self.modaldlg.ok, "SetAuthNeeded"): self.modaldlg.ok.SetAuthNeeded(False) self.modaldlg.buttonpanel.Layout() def start_timers(self, wrapup=False): if wrapup: self.worker.wrapup(False) if not self.update_profile_name_timer.IsRunning(): self.update_profile_name_timer.Start(1000) def stop_timers(self): self.update_profile_name_timer.Stop() def synthicc_create_handler(self, event): """ Assign and initialize the synthetic ICC creation window """ if not getattr(self, "synthiccframe", None): self.init_synthiccframe() if self.synthiccframe.IsShownOnScreen(): if self.synthiccframe.IsIconized(): self.synthiccframe.Restore() self.synthiccframe.Raise() else: self.synthiccframe.Show(not self.synthiccframe.IsShownOnScreen()) def tab_select_handler(self, event, update_main_controls=False): if hasattr(event, "EventObject") and not event.EventObject.IsEnabled(): return self.panel.Freeze() btn2tab = {self.display_instrument_btn: self.display_instrument_panel, self.calibration_settings_btn: self.calibration_settings_panel, self.profile_settings_btn: self.profile_settings_panel, self.lut3d_settings_btn: self.lut3d_settings_panel, self.mr_settings_btn: self.mr_settings_panel} for btn, tab in btn2tab.iteritems(): if event.GetId() == btn.Id: if tab is self.mr_settings_panel and not tab.IsShown(): if not hasattr(self, "XYZbpin"): self.mr_init_controls() else: self.mr_update_controls() elif tab is self.lut3d_settings_panel and not tab.IsShown(): self.set_profile("output") self.lut3d_show_trc_controls() if hasattr(self, "install_profile_btn"): if tab is self.lut3d_settings_panel: self.install_profile_btn.SetToolTipString( lang.getstr("3dlut.install")) else: self.install_profile_btn.SetToolTipString( lang.getstr("profile.install")) tab.Show() btn._pressed = True btn._SetState(platebtn.PLATE_PRESSED) else: tab.Hide() btn._pressed = False btn._SetState(platebtn.PLATE_NORMAL) self.calpanel.Layout() if isinstance(event, wx.Event) or update_main_controls: self.update_main_controls() self.panel.Thaw() self.update_scrollbars() self.calpanel.Layout() self.calpanel.Update() def colorimeter_correction_matrix_ctrl_handler(self, event, path=None): measurement_mode = getcfg("measurement_mode") if (event and event.GetId() == self.colorimeter_correction_matrix_ctrl.GetId()): ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if self.colorimeter_correction_matrix_ctrl.GetSelection() == 0: # Off ccmx = ["", ""] elif self.colorimeter_correction_matrix_ctrl.GetSelection() == 1: # Auto ccmx = ["AUTO", ""] else: path = self.ccmx_item_paths[ self.colorimeter_correction_matrix_ctrl.GetSelection() - 2] ccmx = ["", path] setcfg("colorimeter_correction_matrix_file", ":".join(ccmx)) self.update_colorimeter_correction_matrix_ctrl_items() else: if not path: ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) defaultDir, defaultFile = get_verified_path(None, ccmx.pop()) dlg = wx.FileDialog(self, lang.getstr("colorimeter_correction_matrix_file.choose"), defaultDir=defaultDir if defaultFile else config.get_argyll_data_dir(), defaultFile=defaultFile, wildcard=lang.getstr("filetype.ccmx") + "|*.ccmx;*.ccss", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if (getcfg("colorimeter_correction_matrix_file").split(":")[0] != "AUTO" or path not in self.ccmx_cached_paths): setcfg("colorimeter_correction_matrix_file", ":" + path) self.update_colorimeter_correction_matrix_ctrl_items(warn_on_mismatch=True) if measurement_mode != getcfg("measurement_mode"): # Check if black point correction should be turned on self.measurement_mode_ctrl_handler() def colorimeter_correction_web_handler(self, event): """ Check the web for cccmx or ccss files """ if self.worker.instrument_supports_ccss(): filetype = 'ccss,ccmx' else: filetype = 'ccmx' params = {'get': True, 'type': filetype, 'manufacturer_id': self.worker.get_display_edid().get("manufacturer_id", ""), 'display': self.worker.get_display_name(False, True) or "Unknown", 'instrument': self.worker.get_instrument_name() or "Unknown"} self.worker.interactive = False self.worker.start(colorimeter_correction_web_check_choose, http_request, ckwargs={"parent": self}, wargs=(self, "colorimetercorrections." + domain, "GET", "/index.php", params), progress_msg=lang.getstr("colorimeter_correction.web_check"), stop_timers=False, cancelable=False, show_remaining_time=False, fancy=False) def create_colorimeter_correction_handler(self, event=None, paths=None, luminance=None): """ Create a CCSS or CCMX file from one or more .ti3 files Atleast one of the ti3 files must be a measured with a spectrometer. """ parent = self if event else None id_measure_reference = wx.NewId() id_measure_colorimeter = wx.NewId() if not paths: dlg = ConfirmDialog(parent, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("colorimeter_correction.create.info"), ok=lang.getstr("colorimeter_correction.create"), cancel=lang.getstr("cancel"), ##alt=lang.getstr("browse"), bitmap=geticon(32, "dialog-information"), wrap=90) # Colorimeter correction type # We deliberately don't use RadioBox because there's no way to # set the correct background color (this matters under MSWindows # where the dialog background is usually white) unless you use # Phoenix. boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("type")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.correction_type_matrix = wx.RadioButton(dlg, -1, lang.getstr("matrix"), style=wx.RB_GROUP) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.ALL | wx.EXPAND, border=4) hsizer.Add(dlg.correction_type_matrix) dlg.four_color_matrix = wx.CheckBox(dlg, -1, lang.getstr("ccmx.use_four_color_matrix_method")) dlg.four_color_matrix.SetValue( bool(getcfg("ccmx.use_four_color_matrix_method"))) hsizer.Add(dlg.four_color_matrix, flag=wx.LEFT, border=8) dlg.correction_type_spectral = wx.RadioButton(dlg, -1, lang.getstr("spectral") + " (i1 DisplayPro, " "ColorMunki " "Display, Spyder4/5)") boxsizer.Add(dlg.correction_type_spectral, flag=wx.ALL | wx.EXPAND, border=4) {"matrix": dlg.correction_type_matrix, "spectral": dlg.correction_type_spectral}.get( getcfg("colorimeter_correction.type"), "matrix").SetValue(True) # Get instruments reference_instruments = [] colorimeters = [] for instrument in self.worker.instruments: if instruments.get(instrument, {}).get("spectral"): reference_instruments.append(instrument) else: colorimeters.append(instrument) # Reference instrument boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, "%s (%s)" % (lang.getstr("instrument"), lang.getstr("reference"))), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.EXPAND) dlg.reference_instrument = wx.Choice(dlg, -1, choices=reference_instruments) hsizer.Add(dlg.reference_instrument, 1, flag=wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4) hsizer.Add(wx.StaticText(dlg, -1, lang.getstr("measurement_mode")), flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8) dlg.measurement_mode_reference = wx.Choice(dlg, -1, choices=[]) def set_ok_btn_state(): dlg.ok.Enable(bool(getcfg("last_reference_ti3_path", False) and os.path.isfile(getcfg("last_reference_ti3_path")) and ((getcfg("last_colorimeter_ti3_path", False) and os.path.isfile(getcfg("last_colorimeter_ti3_path"))) or dlg.correction_type_spectral.GetValue()))) def check_last_ccxx_ti3(event): cfgname = "colorimeter_correction.measurement_mode" if event.GetId() in (dlg.instrument.Id, dlg.measurement_mode.Id, dlg.observer_ctrl.Id, dlg.colorimeter_ti3.textControl.Id): name = "colorimeter" instrument = dlg.instrument.GetStringSelection() measurement_mode = self.get_ccxx_measurement_modes( instrument, True).get(dlg.measurement_mode.GetStringSelection()) observer_ctrl = dlg.observer_ctrl else: name = "reference" cfgname += "." + name instrument = dlg.reference_instrument.GetStringSelection() if hasattr(dlg, "modes_ab"): measurement_mode = dlg.modes_ab["spect"][ dlg.measurement_mode_reference.GetSelection()] else: measurement_mode = None observer_ctrl = dlg.observer_reference_ctrl if debug or verbose >= 2: safe_print("check_last_ccxx_ti3", name) safe_print("instrument =", instrument) safe_print("measurement_mode =", measurement_mode) if event.GetId() == getattr(dlg, name + "_ti3").textControl.Id: setcfg("last_%s_ti3_path" % name, getattr(dlg, name + "_ti3").GetValue()) ti3 = getcfg("last_%s_ti3_path" % name, False) if debug or verbose >= 2: safe_print("last_%s_ti3_path =" % name, ti3) if ti3: if os.path.isfile(ti3): try: cgats = CGATS.CGATS(ti3) except (IOError, CGATS.CGATSError), exception: show_result_dialog(exception, dlg) cgats = CGATS.CGATS() cgats_instrument = cgats.queryv1("TARGET_INSTRUMENT") if cgats_instrument: cgats_instrument = get_canonical_instrument_name( cgats_instrument) if debug or verbose >= 2: safe_print("cgats_instrument =", cgats_instrument) if name == "reference": if getcfg(cfgname + ".projector"): cgats_measurement_mode = "p" else: cgats_measurement_mode = getcfg(cfgname) else: cgats_measurement_mode = get_cgats_measurement_mode( cgats, cgats_instrument) if cgats_measurement_mode: instrument_features = self.worker.get_instrument_features(instrument) if (instrument_features.get("adaptive_mode") and getcfg(cfgname + ".adaptive")): cgats_measurement_mode += "V" if (instrument_features.get("highres_mode") and cgats.queryv1("SPECTRAL_BANDS") > 36): cgats_measurement_mode += "H" if debug or verbose >= 2: safe_print("cgats_measurement_mode =", cgats_measurement_mode) cgats_observer = cgats.queryv1("OBSERVER") if not cgats_observer: cgats_observer = defaults["observer"] if event.GetId() == dlg.reference_ti3.textControl.Id: setcfg("colorimeter_correction.observer.reference", cgats_observer) observer_ctrl.SetStringSelection( self.observers_ab[getcfg("colorimeter_correction.observer.reference")]) if self.worker.instrument_can_use_nondefault_observer(instrument): observer = self.observers_ba[observer_ctrl.GetStringSelection()] else: observer = defaults["observer"] if debug or verbose >= 2: safe_print("observer =", observer) if debug or verbose >= 2: safe_print("cgats_observer =", cgats_observer) if (cgats_instrument != instrument or cgats_measurement_mode != measurement_mode or cgats_observer != observer): ti3 = None else: ti3 = None if debug or verbose >= 2: safe_print("last_%s_ti3_path =" % name, ti3) if ti3: bmp = geticon(16, "checkmark") else: bmp = geticon(16, "empty") getattr(dlg, "measure_" + name).SetBitmapLabel(bmp) getattr(dlg, "measure_" + name).Refresh() getattr(dlg, "measure_" + name)._bmp.SetToolTipString(ti3 or "") if isinstance(event, wx.Event): set_ok_btn_state() dlg.measurement_mode_reference.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add(dlg.measurement_mode_reference, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=8) # Make measure button height match instrument choice height btn_h = dlg.reference_instrument.Size[1] if sys.platform == "win32" and sys.getwindowsversion() < (6, 2): # Windows 7 / Vista / XP btn_h += 2 dlg.measure_reference = BitmapWithThemedButton(dlg, id_measure_reference, geticon(16, "empty"), lang.getstr("measure"), size=(-1, btn_h)) if sys.platform == "win32": dlg.measure_reference.SetBackgroundColour(dlg.BackgroundColour) dlg.measure_reference.Bind(wx.EVT_BUTTON, dlg.OnClose) hsizer.Add(dlg.measure_reference, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4) dlg.measure_reference.Enable(bool(self.worker.displays and reference_instruments)) dlg.observer_reference_label = wx.StaticText(dlg, -1, lang.getstr("observer")) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.BOTTOM, border=4) hsizer.Add(dlg.observer_reference_label, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=4) dlg.observer_reference_ctrl = wx.Choice(dlg, -1, choices=self.observers_ab.values()) dlg.observer_reference_ctrl.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add(dlg.observer_reference_ctrl, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=8) dlg.observer_reference_ctrl.SetStringSelection( self.observers_ab[getcfg("colorimeter_correction.observer.reference")]) dlg.observer_reference_label.Show(bool(getcfg("show_advanced_options"))) dlg.observer_reference_ctrl.Show(bool(getcfg("show_advanced_options"))) # Reference TI3 defaultDir, defaultFile = get_verified_path("last_reference_ti3_path") dlg.reference_ti3 = FileBrowseBitmapButtonWithChoiceHistory(dlg, -1, dialogTitle=lang.getstr("measurement_file.choose.reference"), toolTip=lang.getstr("browse"), startDirectory=defaultDir, fileMask=lang.getstr("filetype.ti3") + "|*.ti3;*.icm;*.icc") if defaultFile: dlg.reference_ti3.SetPath(os.path.join(defaultDir, defaultFile)) dlg.reference_ti3.changeCallback = check_last_ccxx_ti3 dlg.reference_ti3.SetMaxFontSize(11) dlg.reference_ti3_droptarget = FileDrop(dlg) def reference_ti3_drop_handler(path): dlg.reference_ti3.SetPath(path) check_last_ccxx_ti3(dlg.reference_ti3.textControl) set_ok_btn_state() dlg.reference_ti3_droptarget.drophandlers = { ".icc": reference_ti3_drop_handler, ".icm": reference_ti3_drop_handler, ".ti3": reference_ti3_drop_handler } dlg.reference_ti3.SetDropTarget(dlg.reference_ti3_droptarget) boxsizer.Add(dlg.reference_ti3, flag=wx.RIGHT | wx.BOTTOM | wx.LEFT | wx.EXPAND, border=4) def reference_instrument_handler(event): mode, modes, dlg.modes_ab, modes_ba = self.get_measurement_modes( dlg.reference_instrument.GetStringSelection(), "spect", "colorimeter_correction.measurement_mode.reference") dlg.measurement_mode_reference.SetItems(modes["spect"]) dlg.measurement_mode_reference.SetSelection( min(modes_ba["spect"].get(mode, 1), len(modes["spect"]) - 1)) dlg.measurement_mode_reference.Enable(len(modes["spect"]) > 1) boxsizer.Layout() if event: check_last_ccxx_ti3(event) instrument = getcfg("colorimeter_correction.instrument.reference") if instrument in reference_instruments: dlg.reference_instrument.SetStringSelection(instrument) elif reference_instruments: dlg.reference_instrument.SetSelection(0) else: dlg.measurement_mode_reference.Disable() if reference_instruments: reference_instrument_handler(None) if len(reference_instruments) < 2: dlg.reference_instrument.Disable() else: dlg.reference_instrument.Bind(wx.EVT_CHOICE, reference_instrument_handler) # Instrument boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("instrument")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.EXPAND) dlg.instrument = wx.Choice(dlg, -1, choices=colorimeters) hsizer.Add(dlg.instrument, 1, flag=wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4) hsizer.Add(wx.StaticText(dlg, -1, lang.getstr("measurement_mode")), flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8) dlg.measurement_mode = wx.Choice(dlg, -1, choices=[]) dlg.measurement_mode.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add(dlg.measurement_mode, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=8) dlg.measure_colorimeter = BitmapWithThemedButton(dlg, id_measure_colorimeter, geticon(16, "empty"), lang.getstr("measure"), size=(-1, btn_h)) if sys.platform == "win32": dlg.measure_colorimeter.SetBackgroundColour(dlg.BackgroundColour) dlg.measure_colorimeter.Bind(wx.EVT_BUTTON, dlg.OnClose) hsizer.Add(dlg.measure_colorimeter, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=4) dlg.measure_colorimeter.Enable(bool(self.worker.displays and colorimeters)) dlg.observer_label = wx.StaticText(dlg, -1, lang.getstr("observer")) hsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.Add(hsizer, flag=wx.BOTTOM, border=4) hsizer.Add(dlg.observer_label, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=4) dlg.observer_ctrl = wx.Choice(dlg, -1, choices=self.observers_ab.values()) dlg.observer_ctrl.Bind(wx.EVT_CHOICE, check_last_ccxx_ti3) hsizer.Add(dlg.observer_ctrl, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=8) dlg.observer_ctrl.SetStringSelection( self.observers_ab[getcfg("colorimeter_correction.observer")]) # Colorimeter TI3 defaultDir, defaultFile = get_verified_path("last_colorimeter_ti3_path") dlg.colorimeter_ti3 = FileBrowseBitmapButtonWithChoiceHistory(dlg, -1, dialogTitle=lang.getstr("measurement_file.choose.colorimeter"), toolTip=lang.getstr("browse"), startDirectory=defaultDir, fileMask=lang.getstr("filetype.ti3") + "|*.ti3;*.icm;*.icc") if defaultFile: dlg.colorimeter_ti3.SetPath(os.path.join(defaultDir, defaultFile)) dlg.colorimeter_ti3.changeCallback = check_last_ccxx_ti3 dlg.colorimeter_ti3.SetMaxFontSize(11) dlg.colorimeter_ti3_droptarget = FileDrop(dlg) def colorimeter_ti3_drop_handler(path): dlg.colorimeter_ti3.SetPath(path) check_last_ccxx_ti3(dlg.colorimeter_ti3.textControl) set_ok_btn_state() dlg.colorimeter_ti3_droptarget.drophandlers = { ".icc": colorimeter_ti3_drop_handler, ".icm": colorimeter_ti3_drop_handler, ".ti3": colorimeter_ti3_drop_handler } dlg.colorimeter_ti3.SetDropTarget(dlg.colorimeter_ti3_droptarget) boxsizer.Add(dlg.colorimeter_ti3, flag=wx.RIGHT | wx.BOTTOM | wx.LEFT | wx.EXPAND, border=4) def show_observer_ctrl(): instrument_name = dlg.instrument.GetStringSelection() show = bool(getcfg("show_advanced_options") and self.worker.instrument_can_use_nondefault_observer(instrument_name) and getcfg("colorimeter_correction.observer") != defaults["colorimeter_correction.observer"]) dlg.observer_label.Show(show) dlg.observer_ctrl.Show(show) instrument_name = dlg.reference_instrument.GetStringSelection() show = bool(dlg.correction_type_matrix.GetValue() and getcfg("show_advanced_options") and self.worker.instrument_can_use_nondefault_observer(instrument_name)) dlg.observer_reference_label.Show(show) dlg.observer_reference_ctrl.Show(show) def instrument_handler(event): dlg.Freeze() modes = self.get_ccxx_measurement_modes( dlg.instrument.GetStringSelection()) dlg.measurement_mode.SetItems(modes.values()) dlg.measurement_mode.SetStringSelection( modes.get(getcfg("colorimeter_correction.measurement_mode"), modes.values()[-1])) dlg.measurement_mode.Enable(len(modes) > 1) show_observer_ctrl() boxsizer.Layout() if event: check_last_ccxx_ti3(event) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Refresh() dlg.Thaw() instrument = getcfg("colorimeter_correction.instrument") if instrument in colorimeters: dlg.instrument.SetStringSelection(instrument) elif colorimeters: dlg.instrument.SetSelection(0) else: dlg.measurement_mode.Disable() if colorimeters: instrument_handler(None) if len(colorimeters) < 2: dlg.instrument.Disable() else: dlg.instrument.Bind(wx.EVT_CHOICE, instrument_handler) # Bind event handlers def correction_type_handler(event): dlg.Freeze() for item in list(boxsizer.Children) + [boxsizer.StaticBox]: if isinstance(item, (wx.SizerItem, wx.Window)): item.Show(dlg.correction_type_matrix.GetValue()) matrix = dlg.correction_type_matrix.GetValue() dlg.four_color_matrix.Enable(matrix) if not matrix: dlg.four_color_matrix.SetValue(False) show_observer_ctrl() set_ok_btn_state() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Refresh() dlg.Thaw() dlg.correction_type_matrix.Bind(wx.EVT_RADIOBUTTON, correction_type_handler) dlg.correction_type_spectral.Bind(wx.EVT_RADIOBUTTON, correction_type_handler) # Layout check_last_ccxx_ti3(dlg.measurement_mode_reference) check_last_ccxx_ti3(dlg.measurement_mode) correction_type_handler(None) result = dlg.ShowModal() if result != wx.ID_CANCEL: observer = self.observers_ba.get(dlg.observer_reference_ctrl.GetStringSelection()) setcfg("colorimeter_correction.observer.reference", observer) if result in (id_measure_reference, id_measure_colorimeter): setcfg("colorimeter_correction.instrument.reference", dlg.reference_instrument.GetStringSelection()) mode, modes, modes_ab, modes_ba = self.get_measurement_modes( dlg.reference_instrument.GetStringSelection(), "spect", "colorimeter_correction.measurement_mode.reference") mode = modes_ab.get("spect", {}).get( dlg.measurement_mode_reference.GetSelection()) or "l" setcfg("colorimeter_correction.measurement_mode.reference", (strtr(mode, {"V": "", "H": ""}) if mode else None) or None) setcfg("colorimeter_correction.measurement_mode.reference.adaptive", 1 if mode and "V" in mode else 0) setcfg("colorimeter_correction.measurement_mode.reference.highres", 1 if mode and "H" in mode else 0) setcfg("colorimeter_correction.measurement_mode.reference.projector", 1 if mode and "p" in mode else None) observer = self.observers_ba.get(dlg.observer_ctrl.GetStringSelection()) setcfg("colorimeter_correction.observer", observer) setcfg("colorimeter_correction.instrument", dlg.instrument.GetStringSelection()) modes = self.get_ccxx_measurement_modes( dlg.instrument.GetStringSelection(), True) if dlg.measurement_mode.GetStringSelection() in modes: setcfg("colorimeter_correction.measurement_mode", modes[dlg.measurement_mode.GetStringSelection()]) elif result == wx.ID_OK: paths = [getcfg("last_reference_ti3_path")] if dlg.correction_type_matrix.GetValue(): paths.append(getcfg("last_colorimeter_ti3_path")) setcfg("ccmx.use_four_color_matrix_method", int(dlg.four_color_matrix.GetValue())) if result != wx.ID_CANCEL: setcfg("colorimeter_correction.type", {True: "matrix", False: "spectral"}[dlg.correction_type_matrix.GetValue()]) dlg.Destroy() else: result = -1 if result == wx.ID_CANCEL: return elif result in (id_measure_reference, id_measure_colorimeter): # Select CCXX testchart ccxx_testchart = get_ccxx_testchart() if not ccxx_testchart: show_result_dialog(Error(lang.getstr("not_found", lang.getstr("ccxx.ti1"))), self) return if not is_ccxx_testchart(): # Backup testchart selection setcfg("testchart.file.backup", getcfg("testchart.file")) self.set_testchart(ccxx_testchart) # Backup instrument selection setcfg("comport.number.backup", getcfg("comport.number")) # Backup observer setcfg("observer.backup", getcfg("observer")) if result == id_measure_reference: # Switch to reference instrument setcfg("comport.number", self.worker.instruments.index( getcfg("colorimeter_correction.instrument.reference")) + 1) # Set measurement mode setcfg("measurement_mode", getcfg("colorimeter_correction.measurement_mode.reference")) setcfg("measurement_mode.adaptive", getcfg("colorimeter_correction.measurement_mode.reference.adaptive")) setcfg("measurement_mode.highres", getcfg("colorimeter_correction.measurement_mode.reference.highres")) setcfg("measurement_mode.projector", getcfg("colorimeter_correction.measurement_mode.reference.projector")) # Set observer setcfg("observer", getcfg("colorimeter_correction.observer.reference")) else: # Switch to colorimeter setcfg("comport.number", self.worker.instruments.index( getcfg("colorimeter_correction.instrument")) + 1) # Set measurement mode setcfg("measurement_mode", getcfg("colorimeter_correction.measurement_mode")) # Set observer setcfg("observer", getcfg("colorimeter_correction.observer")) self.measure_handler() return try: ccxx_testchart = get_ccxx_testchart() if not ccxx_testchart: raise Error(lang.getstr("not_found", lang.getstr("ccxx.ti1"))) ccxx = CGATS.CGATS(ccxx_testchart) except (Error, IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: show_result_dialog(exception, self) return cgats_list = [] reference_ti3 = None colorimeter_ti3 = None spectral = False if getcfg("colorimeter_correction.type") == "matrix": ti3_range = (0, 1) else: ti3_range = (0, ) for n in xrange(len(paths or ti3_range)): path = None if not paths: if reference_ti3: defaultDir, defaultFile = get_verified_path("last_colorimeter_ti3_path") msg = lang.getstr("measurement_file.choose.colorimeter") else: defaultDir, defaultFile = get_verified_path("last_reference_ti3_path") msg = lang.getstr("measurement_file.choose.reference") dlg = wx.FileDialog(parent, msg, defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.ti3") + "|*.ti3;*.icm;*.icc", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() else: path = paths[n] if path: try: if os.path.splitext(path.lower())[1] in (".icm", ".icc"): profile = ICCP.ICCProfile(path) meta = profile.tags.get("meta", {}) cgats = self.worker.ti1_lookup_to_ti3(ccxx, profile, pcs="x", intent="a")[1] cgats.add_keyword("DATA_SOURCE", meta.get("DATA_source", {}).get("value", "").upper() or "Unknown") if cgats.DATA_SOURCE == "EDID": instrument = "EDID" else: targ = profile.tags.get("CIED", profile.tags.get("targ", "")) instrument = None if targ[0:4] == "CTI3": targ = CGATS.CGATS(targ) instrument = targ.queryv1("TARGET_INSTRUMENT") if not instrument: instrument = meta.get("MEASUREMENT_device", {}).get("value", "Unknown") cgats.add_keyword("TARGET_INSTRUMENT", instrument) spectral = "YES" if instruments.get(get_canonical_instrument_name(cgats.TARGET_INSTRUMENT), {}).get("spectral", False) else "NO" cgats.add_keyword("INSTRUMENT_TYPE_SPECTRAL", spectral) cgats.ARGYLL_COLPROF_ARGS = CGATS.CGATS() cgats.ARGYLL_COLPROF_ARGS.key = "ARGYLL_COLPROF_ARGS" cgats.ARGYLL_COLPROF_ARGS.parent = cgats cgats.ARGYLL_COLPROF_ARGS.root = cgats cgats.ARGYLL_COLPROF_ARGS.type = "SECTION" display = meta.get("EDID_model", meta.get("EDID_model_id", {})).get("value", "").encode("UTF-7") manufacturer = meta.get("EDID_manufacturer", {}).get("value", "").encode("UTF-7") cgats.ARGYLL_COLPROF_ARGS.add_data('-M "%s" -A "%s"' % (display, manufacturer)) cgats = CGATS.CGATS(str(cgats)) else: cgats = CGATS.CGATS(path) if not cgats.queryv1("DATA"): raise CGATS.CGATSError("Missing DATA") except Exception, exception: safe_print(exception) InfoDialog(self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.file_invalid", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return else: cgats_list.append(cgats) # Check if measurement contains spectral values # Check if instrument type is spectral if (cgats.queryv1("SPECTRAL_BANDS") or cgats.queryv1("DATA_SOURCE") == "EDID"): if reference_ti3: # We already have a reference ti3 reference_ti3 = None break reference_ti3 = cgats setcfg("last_reference_ti3_path", path) if cgats.queryv1("SPECTRAL_BANDS"): spectral = True if (event and getcfg("colorimeter_correction.type") == "matrix"): result = -1 else: result = wx.ID_OK if result == wx.ID_OK: break elif result == wx.ID_CANCEL: return elif cgats.queryv1("INSTRUMENT_TYPE_SPECTRAL") == "YES": if reference_ti3: # We already have a reference ti3 reference_ti3 = None break reference_ti3 = cgats setcfg("last_reference_ti3_path", path) elif cgats.queryv1("INSTRUMENT_TYPE_SPECTRAL") == "NO": if colorimeter_ti3: # We already have a colorimeter ti3 colorimeter_ti3 = None break colorimeter_ti3 = cgats setcfg("last_colorimeter_ti3_path", path) else: # User canceled dialog return # Check if atleast one file has been measured with a reference if not reference_ti3: InfoDialog(self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.one_reference"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if event: cfgname = "colorimeter_correction.measurement_mode" else: cfgname = "measurement_mode" if len(cgats_list) == 2: if not colorimeter_ti3: # If 2 files, check if atleast one file has NOT been measured # with a spectro (CCMX creation) InfoDialog(self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.one_colorimeter"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return # Use only the device combinations from CCXX testchart reference_new = CGATS.CGATS("BEGIN_DATA\nEND_DATA") reference_new.DATA_FORMAT = reference_ti3.queryv1("DATA_FORMAT") colorimeter_new = CGATS.CGATS("BEGIN_DATA\nEND_DATA") colorimeter_new.DATA_FORMAT = colorimeter_ti3.queryv1("DATA_FORMAT") data_reference = reference_ti3.queryv1("DATA") data_colorimeter = colorimeter_ti3.queryv1("DATA") required = ccxx.queryv(("RGB_R", "RGB_G", "RGB_B")) devicecombination2name = {"RGB_R=100 RGB_G=100 RGB_B=100": "white", "RGB_R=100 RGB_G=0 RGB_B=0": "red", "RGB_R=0 RGB_G=100 RGB_B=0": "green", "RGB_R=0 RGB_G=0 RGB_B=100": "blue"} for i, values in required.iteritems(): patch = OrderedDict([("RGB_R", values[0]), ("RGB_G", values[1]), ("RGB_B", values[2])]) devicecombination = " ".join(["=".join([key, "%i" % value]) for key, value in patch.iteritems()]) name = devicecombination2name.get(devicecombination, devicecombination) item = data_reference.queryi1(patch) if item: reference_new.DATA.add_data(item) else: show_result_dialog(lang.getstr("error.testchart.missing_fields", (os.path.basename(reference_ti3.filename), lang.getstr(name)))) return item = data_colorimeter.queryi1(patch) if item: colorimeter_new.DATA.add_data(item) else: show_result_dialog(lang.getstr("error.testchart.missing_fields", (os.path.basename(colorimeter_ti3.filename), lang.getstr(name)))) return reference_ti3.queryi1("DATA").DATA = reference_new.DATA colorimeter_ti3.queryi1("DATA").DATA = colorimeter_new.DATA # If the reference comes from EDID, normalize luminance if reference_ti3.queryv1("DATA_SOURCE") == "EDID": white = colorimeter_ti3.queryi1("DATA").queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if luminance: scale = luminance / 100.0 else: scale = 1.0 white = " ".join([str(v) for v in (white["XYZ_X"] * scale, white["XYZ_Y"] * scale, white["XYZ_Z"] * scale)]) colorimeter_ti3.queryi1("DATA").LUMINANCE_XYZ_CDM2 = white # Add display base ID if missing self.worker.check_add_display_type_base_id(colorimeter_ti3, cfgname) elif not spectral: # If 1 file, check if it contains spectral values (CCSS creation) InfoDialog(self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("error.measurement.missing_spectral"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return # Add display type for cgats in cgats_list: if not cgats.queryv1("DISPLAY_TYPE_REFRESH"): cgats[0].add_keyword("DISPLAY_TYPE_REFRESH", {"c": "YES", "l": "NO"}.get(getcfg(cfgname), "NO")) safe_print("Added DISPLAY_TYPE_REFRESH %r" % cgats[0].DISPLAY_TYPE_REFRESH) options_dispcal, options_colprof = get_options_from_ti3(reference_ti3) display = None manufacturer = None manufacturer_display = None for option in options_colprof: if option.startswith("M"): display = option[1:].strip(' "') elif option.startswith("A"): manufacturer = option[1:].strip(' "') if manufacturer: quirk_manufacturer = colord.quirk_manufacturer(manufacturer) if (manufacturer and display and not quirk_manufacturer.lower() in display.lower()): manufacturer_display = " ".join([quirk_manufacturer, display]) elif display: manufacturer_display = display if len(cgats_list) == 2: instrument = colorimeter_ti3.queryv1("TARGET_INSTRUMENT") if instrument: instrument = safe_unicode(instrument, "UTF-8") instrument = get_canonical_instrument_name(instrument) observer = getcfg("colorimeter_correction.observer.reference") if observer == "1931_2": description = "%s & %s" % (instrument or self.worker.get_instrument_name(), manufacturer_display or self.worker.get_display_name(True, True)) else: description = "%s (%s %s) & %s" % (instrument or self.worker.get_instrument_name(), lang.getstr("observer." + observer), lang.getstr("observer"), manufacturer_display or self.worker.get_display_name(True, True)) else: description = manufacturer_display or self.worker.get_display_name(True, True) target_instrument = reference_ti3.queryv1("TARGET_INSTRUMENT") if target_instrument: target_instrument = safe_unicode(target_instrument, "UTF-8") target_instrument = get_canonical_instrument_name(target_instrument) description = "%s (%s)" % (description, target_instrument) args = [] tech = {"YES": "Unknown"}.get(reference_ti3.queryv1("DISPLAY_TYPE_REFRESH"), "LCD") if self.worker.argyll_version >= [1, 7, 1]: technology_strings = technology_strings_171 else: technology_strings = technology_strings_170 if event: # Allow user to alter description, display and instrument dlg = ConfirmDialog( parent, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("colorimeter_correction.create.details"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("description")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.description_txt_ctrl = wx.TextCtrl(dlg, -1, description, size=(400, -1)) boxsizer.Add(dlg.description_txt_ctrl, 1, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4) if not display or config.is_virtual_display(display): boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("display")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.display_txt_ctrl = wx.TextCtrl(dlg, -1, display or self.worker.get_display_name(False, True, False), size=(400, -1)) boxsizer.Add(dlg.display_txt_ctrl, 1, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4) if not manufacturer or config.is_virtual_display(display): boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("display.manufacturer")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) dlg.manufacturer_txt_ctrl = wx.TextCtrl(dlg, -1, manufacturer or "", size=(400, -1)) if (not manufacturer and display == self.worker.get_display_name(False, True, False)): dlg.manufacturer_txt_ctrl.Value = self.worker.get_display_edid().get("manufacturer", "") boxsizer.Add(dlg.manufacturer_txt_ctrl, 1, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4) # Display technology boxsizer = wx.StaticBoxSizer(wx.StaticBox(dlg, -1, lang.getstr("display.tech")), wx.VERTICAL) dlg.sizer3.Add(boxsizer, 1, flag=wx.TOP | wx.EXPAND, border=12) if sys.platform not in ("darwin", "win32"): boxsizer.Add((1, 8)) loctech = {} techloc = {} for technology_string in technology_strings.values(): key = technology_string.lower().replace(" ", "_") loc = lang.getstr(key) if loc == key: loc = technology_string loctech[loc] = technology_string techloc[technology_string] = loc dlg.display_tech_ctrl = wx.Choice(dlg, -1, choices=sorted(loctech.keys())) dlg.display_tech_ctrl.SetStringSelection(techloc[tech]) boxsizer.Add(dlg.display_tech_ctrl, flag=wx.ALL | wx.ALIGN_LEFT | wx.EXPAND, border=4) dlg.description_txt_ctrl.SetFocus() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() description = safe_str(dlg.description_txt_ctrl.GetValue().strip(), "UTF-8") if not display or config.is_virtual_display(display): display = dlg.display_txt_ctrl.GetValue() if (dlg.display_tech_ctrl.IsEnabled() and dlg.display_tech_ctrl.GetStringSelection()): tech = loctech[dlg.display_tech_ctrl.GetStringSelection()] if not manufacturer or config.is_virtual_display(display): manufacturer = dlg.manufacturer_txt_ctrl.GetValue() dlg.Destroy() else: result = wx.ID_OK description += " AUTO" args.extend(["-E", description]) if display: args.extend(["-I", safe_str(display.strip(), "UTF-8")]) ccxxmake_version = get_argyll_version("ccxxmake") if reference_ti3 and (not colorimeter_ti3 or ccxxmake_version >= [1, 7]): if ccxxmake_version >= [1, 7]: args.extend(["-t", dict((v, k) for k, v in technology_strings.iteritems())[tech]]) else: args.extend(["-T", safe_str(tech, "UTF-8")]) if result != wx.ID_OK: return # Prepare our files cwd = self.worker.create_tempdir() ti3_tmp_names = [] if reference_ti3: reference_ti3.write(os.path.join(cwd, 'reference.ti3')) ti3_tmp_names.append('reference.ti3') result = True if colorimeter_ti3: # Create CCMX colorimeter_ti3.write(os.path.join(cwd, 'colorimeter.ti3')) ti3_tmp_names.append('colorimeter.ti3') name = "correction" ext = ".ccmx" # CCSS-capable instruments enable creating a CCMX that maps from # non-standard observer A used for the colorimeter measurements # to non-standard observer B used for the reference measurements. # To get correct readings (= matching reference observer B) when # using such a CCMX, observer A needs to be used, not observer B. observer = colorimeter_ti3.queryv1("OBSERVER") reference_observer = getcfg("colorimeter_correction.observer.reference") if spectral and reference_observer != reference_ti3.queryv1("OBSERVER"): # We can override the observer if we have spectral data # Need to use spec2cie to convert spectral data to # CIE XYZ with given observer, because we later use the XYZ spec2cie = get_argyll_util("spec2cie") if not spec2cie: show_result_dialog(Error(lang.getstr("argyll.util.not_found", "spec2cie"))) self.worker.wrapup(False) return os.rename(os.path.join(cwd, "reference.ti3"), os.path.join(cwd, "reference_orig.ti3")) result = self.worker.exec_cmd(spec2cie, ["-o", reference_observer, os.path.join(cwd, "reference_orig.ti3"), os.path.join(cwd, "reference.ti3")], capture_output=True, skip_scripts=True, silent=False, working_dir=cwd) if not isinstance(result, Exception) and result: reference_ti3 = CGATS.CGATS(os.path.join(cwd, "reference.ti3")) # spec2cie doesn't update "LUMINANCE_XYZ_CDM2", and doesn't # normalize measurement data to Y=100 XYZ_CDM2 = reference_ti3.queryv1("LUMINANCE_XYZ_CDM2") white = reference_ti3.queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) scale = white["XYZ_Y"] / 100.0 if XYZ_CDM2: # Fix LUMINANCE_XYZ_CDM2 # Note that for oberservers other than 1931 2 degree, # Y is not in cd/m2, but we try and keep the same # relationship XYZ_CDM2 = [float(v) for v in XYZ_CDM2.split()] XYZ_CDM2 = ["%.6f" % (v * XYZ_CDM2[1] / 100.0) for v in white.queryv1(("XYZ_X", "XYZ_Y", "XYZ_Z")).values()] reference_ti3[0].LUMINANCE_XYZ_CDM2 = " ".join(XYZ_CDM2) data_format = reference_ti3.queryv1("DATA_FORMAT") # Remove L*a*b*. Do not use iter, as we change the # dictionary in-place for i, column in data_format.items(): if column.startswith("LAB_"): del data_format[i] # Normalize to Y=100 data = reference_ti3.queryv1("DATA") for i, sample in data.iteritems(): for column in data_format.itervalues(): if column.startswith("XYZ_") or column.startswith("SPEC_"): sample[column] /= scale reference_ti3.write() # The -o observer argument for ccxxmake isn't really needed # when we used spec2cie. Add it regardless for good measure args.append("-o") args.append(reference_observer) else: reference_observer = reference_ti3.queryv1("OBSERVER") else: # Create CCSS args.append("-S") name = "calibration" ext = ".ccss" observer = None reference_observer = None args.append("-f") args.append(",".join(ti3_tmp_names)) args.append(name + ext) if not isinstance(result, Exception) and result: result = self.worker.create_ccxx(args, cwd) source = os.path.join(self.worker.tempdir, name + ext) if isinstance(result, Exception): show_result_dialog(result, self) elif result and os.path.isfile(source): if colorimeter_ti3: white_abs = [] for j, meas in enumerate((reference_ti3, colorimeter_ti3)): # Get absolute whitepoint white = (meas.queryv1("LUMINANCE_XYZ_CDM2") or meas.queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100})) if isinstance(white, basestring): white = [float(v) for v in white.split()] elif isinstance(white, CGATS.CGATS): white = white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] else: # This shouldn't happen white = colormath.get_whitepoint("D65", scale=100) safe_print(appname + ": Warning - could not find white - " "dE calculation will be inaccurate") white_abs.append(white) if debug or verbose > 1: safe_print("ref white %.6f %.6f %.6f" % tuple(white_abs[0])) white_ref = [v / white_abs[0][1] for v in white_abs[0]] if getcfg("ccmx.use_four_color_matrix_method"): safe_print(appname + ": Creating matrix using four-color method") XYZ = [] for j, meas in enumerate((reference_ti3, colorimeter_ti3)): for R, G, B in [(100, 0, 0), (0, 100, 0), (0, 0, 100), (100, 100, 100)]: item = meas.queryi1("DATA").queryi1({"RGB_R": R, "RGB_G": G, "RGB_B": B}) X, Y, Z = item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] X, Y, Z = (v * white_abs[j][1] / 100.0 for v in (X, Y, Z)) XYZ.extend((X, Y, Z)) R = colormath.four_color_matrix(*XYZ) safe_print(appname + ": Correction matrix is:") ccmx = CGATS.CGATS(source) for i in xrange(3): safe_print(" %.6f %.6f %.6f" % tuple(R[i])) for j, component in enumerate("XYZ"): ccmx[0].DATA[i]["XYZ_" + component] = R[i][j] ccmx.write() # Important: Do not use parsed CGATS, order of keywords may be # different than raw data so MD5 will be different try: cgatsfile = open(source, "rb") except Exception, exception: show_result_dialog(exception, self) self.worker.wrapup(False) return cgats = universal_newlines(cgatsfile.read()) cgatsfile.close() if (reference_ti3[0].get("TARGET_INSTRUMENT") and not re.search('\nREFERENCE\s+".+?"\n', cgats)): # By default, CCSS files don't contain reference instrument cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nREFERENCE "%s"\\1' % reference_ti3[0].get("TARGET_INSTRUMENT").replace("\\", "\\\\"), cgats) if not re.search('\nTECHNOLOGY\s+".+?"\n', cgats) and tech: # By default, CCMX files don't contain technology string cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nTECHNOLOGY "%s"\\1' % safe_str(tech, "UTF-8"), cgats) manufacturer_id = None if manufacturer: if not pnpidcache: # Populate pnpidcache get_manufacturer_name("???") manufacturers = dict([name, id] for id, name in pnpidcache.iteritems()) manufacturer_id = manufacturers.get(manufacturer) if manufacturer_id and not re.search('\nMANUFACTURER_ID\s+".+?"\n', cgats): # By default, CCMX/CCSS files don't contain manufacturer ID cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nMANUFACTURER_ID "%s"\\1' % safe_str(manufacturer_id, "UTF-8").replace("\\", "\\\\"), cgats) if manufacturer and not re.search('\nMANUFACTURER\s+".+?"\n', cgats): # By default, CCMX/CCSS files don't contain manufacturer cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nMANUFACTURER "%s"\\1' % safe_str(manufacturer, "UTF-8").replace("\\", "\\\\"), cgats) if observer and not re.search('\nOBSERVER\s+".+?"\n', cgats): # By default, CCMX/CCSS files don't contain observer cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nOBSERVER "%s"\\1' % safe_str(observer, "UTF-8").replace("\\", "\\\\"), cgats) if (reference_observer and not re.search('\nREFERENCE_OBSERVER\s+".+?"\n', cgats)): # By default, CCMX/CCSS files don't contain observer cgats = re.sub('(\nDISPLAY\s+"[^"]*"\n)', '\nREFERENCE_OBSERVER "%s"\\1' % safe_str(reference_observer, "UTF-8").replace("\\", "\\\\"), cgats) result = check_create_dir(config.get_argyll_data_dir()) if isinstance(result, Exception): show_result_dialog(result, self) self.worker.wrapup(False) return if colorimeter_ti3: # CCMX # Show reference vs corrected colorimeter values along with # delta E matrix = colormath.Matrix3x3() ccmx = CGATS.CGATS(cgats) for i, sample in ccmx.queryv1("DATA").iteritems(): matrix.append([]) for component in "XYZ": matrix[i].append(sample["XYZ_%s" % component]) dlg = ConfirmDialog(parent, msg=lang.getstr("colorimeter_correction.create.success"), ok=lang.getstr("save"), cancel=lang.getstr("testchart.discard"), bitmap=geticon(32, "dialog-information")) sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(sizer, 1, flag=wx.TOP | wx.EXPAND, border=12) labels = ("%s (%s)" % (get_canonical_instrument_name( reference_ti3.queryv1("TARGET_INSTRUMENT") or lang.getstr("instrument")), lang.getstr("reference")), "%s (%s)" % (get_canonical_instrument_name( ccmx.queryv1("INSTRUMENT") or lang.getstr("instrument")), lang.getstr("corrected"))) scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 for i, label in enumerate(labels): txt = wx.StaticText(dlg, -1, label, size=(80 * scale * (3 + i), -1), style=wx.ALIGN_CENTER_HORIZONTAL) font = txt.Font font.SetWeight(wx.BOLD) txt.Font = font sizer.Add(txt, flag=wx.LEFT, border=40) if "gtk3" in wx.PlatformInfo: style = wx.BORDER_SIMPLE else: style = wx.BORDER_THEME grid = CustomGrid(dlg, -1, size=(640 * scale + wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), -1), style=style) grid.Size = grid.Size[0], grid.GetDefaultRowSize() * 4 dlg.sizer3.Add(grid, flag=wx.TOP | wx.ALIGN_LEFT, border=4) grid.DisableDragColSize() grid.DisableDragRowSize() grid.SetCellHighlightPenWidth(0) grid.SetCellHighlightROPenWidth(0) grid.SetColLabelSize(grid.GetDefaultRowSize()) grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) grid.SetMargins(0, 0) grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) grid.SetRowLabelSize(40) grid.SetScrollRate(0, 5) grid.draw_horizontal_grid_lines = False grid.draw_vertical_grid_lines = False grid.EnableEditing(False) grid.EnableGridLines(False) grid.CreateGrid(0, 9) for i, label in enumerate(["x", "y", "Y", "", "", "x", "y", "Y", u"ΔE*00"]): if i in (3, 4): # Rectangular (width = height) size = grid.GetDefaultRowSize() else: size = 80 * scale grid.SetColSize(i, size) grid.SetColLabelValue(i, label) grid.BeginBatch() ref_data = reference_ti3.queryv1("DATA") tgt_data = colorimeter_ti3.queryv1("DATA") deltaE_94 = [] deltaE_00 = [] safe_print("") safe_print(" Reference xyY |" " Corrected xyY |" " DE94 | DE00 ") safe_print("-" * 80) for i, ref in ref_data.iteritems(): tgt = tgt_data[i] grid.AppendRows(1) row = grid.GetNumberRows() - 1 grid.SetRowLabelValue(row, "%d" % ref.SAMPLE_ID) XYZ = [] XYZabs = [] xyYabs = [] for j, sample in enumerate((ref, tgt)): # Get samples XYZ.append([]) for component in "XYZ": XYZ[j].append(sample["XYZ_%s" % component]) # Scale to absolute brightness XYZabs.append(list(XYZ[j])) for k, value in enumerate(XYZabs[j]): XYZabs[j][k] = value * white_abs[j][1] / 100.0 if j == 1: # Apply matrix to colorimeter measurements XYZabs[j] = matrix * XYZabs[j] xyYabs.append(colormath.XYZ2xyY(*XYZabs[j])) # Set cell values for k, value in enumerate(xyYabs[j]): grid.SetCellValue(row, j * 5 + k, "%.4f" % value) # Show sRGB approximation of measured patch X, Y, Z = [v / max(white_abs[0][1], (matrix * white_abs[1])[1]) for v in XYZabs[j]] # Adapt from reference white to D65 X, Y, Z = colormath.adapt(X, Y, Z, white_ref, "D65") # Convert XYZ to sRGB RGB = [int(round(v)) for v in colormath.XYZ2RGB(X, Y, Z, scale=255)] grid.SetCellBackgroundColour(row, 3 + j, wx.Colour(*RGB)) if debug or verbose > 1: safe_print("ref %.6f %.6f %.6f, " % tuple(XYZabs[0]), "col %.6f %.6f %.6f" % tuple(XYZabs[1])) Lab_ref = colormath.XYZ2Lab(*XYZabs[0] + [white_abs[0]]) Lab_tgt = colormath.XYZ2Lab(*XYZabs[1] + [white_abs[0]]) if debug or verbose > 1: safe_print("ref Lab %.6f %.6f %.6f, " % Lab_ref, "col Lab %.6f %.6f %.6f" % Lab_tgt) # For comparison to Argyll DE94 values deltaE = colormath.delta(*Lab_ref + Lab_tgt + ("94", ))["E"] deltaE_94.append(deltaE) deltaE = colormath.delta(*Lab_ref + Lab_tgt + ("00", ))["E"] deltaE_00.append(deltaE) safe_print(" %.6f %.6f %8.4f |" " %.6f %.6f %8.4f | %.6f | %.6f " % (tuple(xyYabs[0]) + tuple(xyYabs[1]) + (deltaE_94[-1], deltaE_00[-1]))) grid.SetCellValue(row, 8, "%.4f" % deltaE) safe_print("") safe_print(appname + ": Fit error is max %.6f, avg %.6f DE94" % (max(deltaE_94), sum(deltaE_94) / len(deltaE_94))) safe_print(appname + ": Fit error is max %.6f, avg %.6f DE00" % (max(deltaE_00), sum(deltaE_00) / len(deltaE_00))) grid.DefaultCellBackgroundColour = grid.LabelBackgroundColour grid.EndBatch() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if event: result = dlg.ShowModal() else: result = wx.ID_OK dlg.Destroy() if result != wx.ID_OK: self.worker.wrapup(False) return # Add dE fit error to CGATS as meta for label, fit_error in (("MAX_DE94", max(deltaE_94)), ("AVG_DE94", sum(deltaE_94) / len(deltaE_94)), ("MAX_DE00", max(deltaE_00)), ("AVG_DE00", sum(deltaE_00) / len(deltaE_00))): cgats = re.sub('(\nREFERENCE\s+"[^"]*"\n)', '\\1FIT_%s "%.6f"\n' % (label, fit_error), cgats) metadata = [] # Add measurement file names and checksum to CCXX for label, meas in (("REFERENCE", reference_ti3), ("TARGET", colorimeter_ti3)): if meas and meas.filename: metadata.append(label + '_FILENAME "%s"' % safe_str(meas.filename, "UTF-8")) metadata.append(label + '_HASH "md5:%s"' % md5(str(meas).strip()).hexdigest()) if debug or test: # Add original measurement data to CGATS as meta ccmx_data_format = [] for colorspace in ("RGB", "XYZ"): for component in colorspace: ccmx_data_format.append(colorspace + "_" + component) for label, meas in (("REFERENCE", reference_ti3), ("TARGET", colorimeter_ti3)): XYZ_CDM2 = meas.queryv1("LUMINANCE_XYZ_CDM2") if XYZ_CDM2: metadata.append(label + '_LUMINANCE_XYZ_CDM2 "%s"' % XYZ_CDM2) if not colorimeter_ti3: break metadata.append(label + '_DATA_FORMAT "%s"' % " ".join(ccmx_data_format)) data_format = meas.queryv1("DATA_FORMAT") data = meas.queryv1("DATA") for i, sample in data.iteritems(): RGB_XYZ = [] for column in ccmx_data_format: RGB_XYZ.append(str(sample[column])) metadata.append(label + '_DATA_%i "%s"' % (i + 1, " ".join(RGB_XYZ))) # Line length limit for CGATS keywords 1024 chars, add # spectral data as individual keywords for column in data_format.itervalues(): if (column not in ccmx_data_format and column != "SAMPLE_ID"): metadata.append(label + '_DATA_%i_%s "%s"' % (i + 1, column, sample[column])) if colorimeter_ti3 and getcfg("ccmx.use_four_color_matrix_method"): cgats = re.sub(r'(\nORIGINATOR\s+)"Argyll[^"]+"', r'\1"%s %s"' % (appname, version), cgats) metadata.append('FIT_METHOD "xy"') else: metadata.append(u'FIT_METHOD "ΔE*94"'.encode("UTF-8")) if metadata: cgats = re.sub('(\nREFERENCE\s+"[^"]*"\n)', '\\1%s\n' % "\n".join(metadata).replace("\\", "\\\\"), cgats) if event: if colorimeter_correction_check_overwrite(self, cgats, True): self.upload_colorimeter_correction(cgats) else: path = get_cgats_path(cgats) with open(path, "wb") as cgatsfile: cgatsfile.write(cgats) setcfg("colorimeter_correction_matrix_file", ":" + path) elif result is not None: InfoDialog(self, title=lang.getstr("colorimeter_correction.create"), msg=lang.getstr("colorimeter_correction.create.failure") + "\n" + "".join(self.worker.errors), ok=lang.getstr("cancel"), bitmap=geticon(32, "dialog-error"), log=False) self.worker.wrapup(False) return True def upload_colorimeter_correction(self, cgats): """ Ask the user if he wants to upload a colorimeter correction to the online database. Upload the file. """ dlg = ConfirmDialog(self, msg=lang.getstr("colorimeter_correction.upload.confirm"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: ccxx = CGATS.CGATS(cgats) # Remove platform-specific/potentially sensitive information cgats = re.sub(r'\n(?:REFERENCE|TARGET)_FILENAME\s+"[^"]+"\n', "\n", cgats) params = {"cgats": cgats} # Also upload reference and target CGATS (if available) for label in ("REFERENCE", "TARGET"): filename = safe_unicode(ccxx.queryv1(label + "_FILENAME") or "", "UTF-8") algo_hash = (ccxx.queryv1(label + "_HASH") or "").split(":", 1) if (filename and os.path.isfile(filename) and algo_hash[0] in globals()): meas = str(CGATS.CGATS(filename)).strip() # Check hash if globals()[algo_hash[0]](meas).hexdigest() == algo_hash[-1]: params[label.lower() + "_cgats"] = meas if debug or test: safe_print(params.keys()) # Upload correction self.worker.interactive = False self.worker.start(lambda result: result, upload_colorimeter_correction, wargs=(self, params), progress_msg=lang.getstr("colorimeter_correction.upload"), stop_timers=False, cancelable=False, show_remaining_time=False, fancy=False) def upload_colorimeter_correction_handler(self, event): """ Let user choose a ccss/ccmx file to upload """ path = None defaultDir, defaultFile = get_verified_path("last_filedialog_path") dlg = wx.FileDialog(self, lang.getstr("colorimeter_correction_matrix_file.choose"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.ccmx") + "|*.ccmx;*.ccss", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: setcfg("last_filedialog_path", path) # Important: Do not use parsed CGATS, order of keywords may be # different than raw data so MD5 will be different cgatsfile = open(path, "rb") cgats = cgatsfile.read() cgatsfile.close() originator = re.search('\nORIGINATOR\s+"Argyll', cgats) if not originator: originator = re.search('\nORIGINATOR\s+"' + appname, cgats) if not originator: InfoDialog(self, msg=lang.getstr("colorimeter_correction.upload.deny"), ok=lang.getstr("cancel"), bitmap=geticon(32, "dialog-error")) else: self.upload_colorimeter_correction(cgats) def comport_ctrl_handler(self, event=None, force=False): if debug and event: safe_print("[D] comport_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) if self.comport_ctrl.GetSelection() > -1: setcfg("comport.number", self.comport_ctrl.GetSelection() + 1) self.menuitem_calibrate_instrument.Enable( bool(self.worker.get_instrument_features().get("sensor_cal"))) self.update_measurement_modes() enable_ccxx = (self.worker.instrument_can_use_ccxx(False) and not is_ccxx_testchart() and getcfg("measurement_mode") != "auto") self.menuitem_choose_colorimeter_correction.Enable(enable_ccxx) self.menuitem_colorimeter_correction_web.Enable(enable_ccxx) self.update_colorimeter_correction_matrix_ctrl() self.update_colorimeter_correction_matrix_ctrl_items(force) def import_colorimeter_corrections_handler(self, event, paths=None, callafter=None, callafter_args=()): """ Convert correction matrices from other profiling softwares to Argyll's CCMX or CCSS format (or to spyd4cal.bin in case of the Spyder4/5) Currently supported: iColor Display (native import to CCMX), i1 Profiler (import to CCSS via Argyll CMS >= 1.3.4) Spyder4/5 (import to spyd4cal.bin via Argyll CMS >= 1.3.6) """ msg = " ".join([lang.getstr("oem.import.auto"), lang.getstr("oem.import.auto.download_selection")]) if sys.platform == "win32": msg = " ".join([lang.getstr("oem.import.auto_windows"), msg]) result = None i1d3 = None i1d3ccss = None spyd4 = None spyd4en = None icd = None oeminst = get_argyll_util("oeminst") importers = OrderedDict() if not oeminst: i1d3ccss = get_argyll_util("i1d3ccss") spyd4en = get_argyll_util("spyd4en") dlg = ConfirmDialog(self, title=lang.getstr("colorimeter_correction.import"), msg=msg, ok=lang.getstr("auto"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information"), alt=lang.getstr("file.select")) dlg.sizer3.Add((1, 8)) def check_importers(event): result = False for name in ("i1d3", "icd", "spyd4"): if hasattr(dlg, name) and getattr(dlg, name).IsChecked(): result = True break dlg.ok.Enable(result) for (name, desc, instruments, importer) in [("i1d3", "i1 Profiler", ("i1 DisplayPro, ColorMunki Display", "Spyder4", "Spyder5"), i1d3ccss or oeminst), ("icd", "iColor Display", ("DTP94", "i1 Display 2", "Spyder2", "Spyder3"), True), ("spyd4", "Spyder4/5", ("Spyder4", "Spyder5"), spyd4en or oeminst)]: if importer: for instrument in instruments: if instrument not in desc: desc += " (%s)" % ", ".join(instruments) break setattr(dlg, name, wx.CheckBox(dlg, -1, desc)) for instrument in instruments: if instruments == ("i1 DisplayPro, ColorMunki Display", "Spyder4", "Spyder5"): check = "" in self.ccmx_instruments.itervalues() elif instruments == ("Spyder4", "Spyder5"): check = self.worker.spyder4_cal_exists() else: check = instrument in self.ccmx_instruments.itervalues() if instrument in self.worker.instruments and not check: getattr(dlg, name).SetValue(True) break dlg.sizer3.Add(getattr(dlg, name), flag=wx.TOP | wx.ALIGN_LEFT, border=8) getattr(dlg, name).Bind(wx.EVT_CHECKBOX, check_importers) dlg.install_user = wx.RadioButton(dlg, -1, lang.getstr("install_user"), style=wx.RB_GROUP) dlg.install_user.SetValue(True) dlg.sizer3.Add(dlg.install_user, flag=wx.TOP | wx.ALIGN_LEFT, border=16) dlg.install_systemwide = wx.RadioButton(dlg, -1, lang.getstr("install_local_system")) dlg.install_user.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) dlg.install_systemwide.Bind(wx.EVT_RADIOBUTTON, install_scope_handler) install_scope_handler(dlg=dlg) check_importers(None) dlg.sizer3.Add(dlg.install_systemwide, flag=wx.TOP | wx.ALIGN_LEFT, border=4) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() if event: choice = dlg.ShowModal() elif paths: choice = wx.ID_ANY else: choice = wx.ID_OK for name, importer in [("i1d3", i1d3ccss or oeminst), ("spyd4", spyd4en or oeminst), ("icd", True)]: if importer and getattr(dlg, name).GetValue(): importers[name] = importer asroot = dlg.install_systemwide.GetValue() dlg.Destroy() if choice == wx.ID_CANCEL: return if choice != wx.ID_OK and not paths: dlg = wx.FileDialog(self, lang.getstr("colorimeter_correction.import.choose"), wildcard=lang.getstr("filetype.any") + "|*.cab;*.edr;*.exe;*.txt", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) choice2 = dlg.ShowModal() paths = [dlg.GetPath()] dlg.Destroy() if choice2 != wx.ID_OK: return elif not paths: paths = [] if asroot: result = self.worker.authenticate(oeminst or i1d3ccss or spyd4en, lang.getstr("colorimeter_correction.import"), self) if result not in (True, None): if isinstance(result, Exception): show_result_dialog(result, self) return self.worker.interactive = False self.worker.start(self.import_colorimeter_corrections_consumer, self.import_colorimeter_corrections_producer, cargs=(callafter, callafter_args), wargs=(result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, paths, choice == wx.ID_OK, asroot, importers), progress_msg=lang.getstr("colorimeter_correction.import"), fancy=False) return (event and None) or True def import_colorimeter_correction(self, result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, path, asroot): """ Import colorimter correction(s) from path """ if debug: safe_print("import_colorimeter_correction <-") safe_print(" result:", result) safe_print(" i1d3:", i1d3) safe_print(" i1d3ccss:", i1d3ccss) safe_print(" spyd4:", spyd4) safe_print(" spyd4en:", spyd4en) safe_print(" icd:", icd) safe_print(" oeminst:", oeminst) safe_print(" path:", path) safe_print(" asroot:", asroot) if path and os.path.exists(path): filename, ext = os.path.splitext(path) kind = None if ext.lower() == ".txt": kind = "icd" result = True else: icolordisplay = "icolordisplay" in os.path.basename(path).lower() if ext.lower() == ".dmg": if icolordisplay: kind = "icd" result = self.worker.exec_cmd(which("hdiutil"), ["attach", path], capture_output=True, skip_scripts=True) if result and not isinstance(result, Exception): for path in glob.glob(os.path.join(os.path.sep, "Volumes", "iColorDisplay*", "iColorDisplay*.app", "Contents", "Resources", "DeviceCorrections.txt")): break else: result = Error(lang.getstr("file.missing", "DeviceCorrections.txt")) elif i1d3ccss and ext.lower() == ".edr": kind = "xrite" elif ext.lower() in (".cab", ".exe"): if icolordisplay: kind = "icd" sevenzip = get_program_file("7z", "7-zip") if sevenzip: if not getcfg("dry_run"): # Extract from NSIS installer temp = self.worker.create_tempdir() if isinstance(temp, Exception): result = temp else: result = self.worker.exec_cmd(sevenzip, ["e", "-y", path, "DeviceCorrections.txt"], capture_output=True, skip_scripts=True, working_dir=temp) if (result and not isinstance(result, Exception)): path = os.path.join(temp, "DeviceCorrections.txt") else: self.worker.wrapup(False) else: result = Error(lang.getstr("file.missing", "7z" + exe_ext)) elif i1d3ccss and ("colormunki" in os.path.basename(path).lower() or "i1profiler" in os.path.basename(path).lower() or os.path.basename(path).lower() == "i1d3"): # Assume X-Rite installer kind = "xrite" elif spyd4en and ("spyder4" in os.path.basename(path).lower() or os.path.basename(path).lower() == "spyd4"): # Assume Spyder4/5 kind = "spyder4" if kind == "icd": if (not getcfg("dry_run") and result and not isinstance(result, Exception)): # Assume iColorDisplay DeviceCorrections.txt ccmx_dir = config.get_argyll_data_dir() if not os.path.exists(ccmx_dir): result = check_create_dir(ccmx_dir) if isinstance(result, Exception): return result, i1d3, spyd4, icd safe_print(lang.getstr("colorimeter_correction.import")) safe_print(path) try: imported, skipped = ccmx.convert_devicecorrections_to_ccmx(path, ccmx_dir) if imported == 0: raise Info() except (UnicodeDecodeError, demjson.JSONDecodeError), exception: if isinstance(exception, demjson.JSONDecodeError): exception = exception.pretty_description() result = Error(lang.getstr("file.invalid") + "\n" + safe_unicode(exception)) except Info: result = False except Exception, exception: result = exception else: result = icd = True if skipped > 0: result = Warn(lang.getstr("colorimeter_correction.import.partial_warning", ("iColor Display", skipped, imported + skipped))) self.worker.wrapup(False) elif kind == "xrite": # Import .edr if asroot and sys.platform == "win32": ccss = self.get_argyll_data_files("l", "*.ccss", True) result = i1d3 = self.worker.import_edr([path], asroot=asroot) if asroot and sys.platform == "win32": result = i1d3 = self.get_argyll_data_files("l", "*.ccss", True) != ccss elif kind == "spyder4": # Import spyd4cal.bin result = spyd4 = self.worker.import_spyd4cal([path], asroot=asroot) if asroot and sys.platform == "win32": result = spyd4 = self.get_argyll_data_files("l", "spyd4cal.bin") elif oeminst and not icolordisplay: if asroot and sys.platform == "win32": ccss = self.get_argyll_data_files("l", "*.ccss", True) result = self.worker.import_colorimeter_corrections(oeminst, [path], asroot) if (".ccss" in "".join(self.worker.output) or (asroot and sys.platform == "win32" and self.get_argyll_data_files("l", "*.ccss", True) != ccss)): i1d3 = result if ("spyd4cal.bin" in "".join(self.worker.output) or (asroot and sys.platform == "win32" and self.get_argyll_data_files("l", "spyd4cal.bin"))): spyd4 = result else: result = Error(lang.getstr("error.file_type_unsupported") + "\n" + path) if debug: safe_print("import_colorimeter_correction ->") safe_print(" result:", result) safe_print(" i1d3:", i1d3) safe_print(" i1d3ccss:", i1d3ccss) safe_print(" spyd4:", spyd4) safe_print(" spyd4en:", spyd4en) safe_print(" icd:", icd) safe_print(" oeminst:", oeminst) safe_print(" path:", path) safe_print(" asroot:", asroot) return result, i1d3, spyd4, icd def import_colorimeter_corrections_producer(self, result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, paths, auto, asroot, importers): """ Import colorimetercorrections from paths """ if auto and not paths: paths = [] if importers.get("icd"): # Look for iColorDisplay if sys.platform == "win32": paths += glob.glob(os.path.join(getenvu("PROGRAMFILES", ""), "Quato", "iColorDisplay", "DeviceCorrections.txt")) elif sys.platform == "darwin": paths += glob.glob(os.path.join(os.path.sep, "Applications", "iColorDisplay*.app", "DeviceCorrections.txt")) paths += glob.glob(os.path.join(os.path.sep, "Volumes", "iColorDisplay*", "iColorDisplay*.app", "DeviceCorrections.txt")) if importers.get("i1d3") and (oeminst or i1d3ccss) and not i1d3: # Look for *.edr files if sys.platform == "win32": paths += glob.glob(os.path.join(getenvu("PROGRAMFILES", ""), "X-Rite", "Devices", "i1d3", "Calibrations", "*.edr")) elif sys.platform == "darwin": paths += glob.glob(os.path.join(os.path.sep, "Library", "Application Support", "X-Rite", "Devices", "i1d3xrdevice", "Contents", "Resources", "Calibrations", "*.edr")) paths += glob.glob(os.path.join(os.path.sep, "Volumes", "i1Profiler", "*.exe")) paths += glob.glob(os.path.join(os.path.sep, "Volumes", "ColorMunki Display", "*.exe")) if importers.get("spyd4") and (oeminst or spyd4en) and not spyd4: # Look for dccmtr.dll if sys.platform == "win32": paths += glob.glob(os.path.join(getenvu("PROGRAMFILES", ""), "Datacolor", "Spyder4*", "dccmtr.dll")) paths += glob.glob(os.path.join(getenvu("PROGRAMFILES", ""), "Datacolor", "Spyder5*", "dccmtr.dll")) elif sys.platform == "darwin": # Look for setup.exe on CD-ROM paths += glob.glob(os.path.join(os.path.sep, "Volumes", "Datacolor", "Data", "setup.exe")) paths += glob.glob(os.path.join(os.path.sep, "Volumes", "Datacolor_ISO", "Data", "setup.exe")) for path in paths: (result, i1d3, spyd4, icd) = self.import_colorimeter_correction(result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, path, asroot) paths = [] for name, importer in importers.iteritems(): imported = locals().get(name, False) if not imported and auto: # Automatic download if name == "icd" and sys.platform == "darwin": name += ".dmg" self.worker.recent.clear() self.worker.lastmsg.clear() result = self.worker.download("https://%s/%s" % (domain.lower(), name)) if isinstance(result, Exception): break elif result: paths.append(result) else: # Cancelled result = None break if not isinstance(result, Exception) and result: for path in paths: (result, i1d3, spyd4, icd) = self.import_colorimeter_correction(result, i1d3, i1d3ccss, spyd4, spyd4en, icd, oeminst, path, asroot) return result, i1d3, spyd4, icd def import_colorimeter_corrections_consumer(self, results, callafter=None, callafter_args=()): result, i1d3, spyd4, icd = results if isinstance(result, Exception): show_result_dialog(result, self) imported = [] failures = [] mapping = {"i1 Profiler/ColorMunki Display": i1d3, "Spyder4/5": spyd4, "iColor Display": icd} for name, subresult in mapping.iteritems(): if subresult and not isinstance(subresult, Exception): imported.append(name) elif subresult is not None: failures.append(name) if imported: self.update_measurement_modes() self.update_colorimeter_correction_matrix_ctrl_items(True) InfoDialog(self, msg=lang.getstr("colorimeter_correction.import.success", "\n".join(imported)), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) if failures or (not imported and result is not None): error = ("".join(self.worker.errors) or lang.getstr("colorimeter_correction.import.failure") + "\n\n" + "\n".join(failures)) show_result_dialog(UnloggedError(error), self) if callafter: wx.CallAfter(callafter, *callafter_args) def import_session_archive(self, path): """ Import compressed session archive """ filename, ext = os.path.splitext(path) basename = os.path.basename(filename) # Without extension if self.check_overwrite(filename=basename): self.worker.start(self.import_session_archive_consumer, self.import_session_archive_producer, cargs=(basename, ), wargs=(path, basename, ext), progress_msg=lang.getstr("archive.import"), fancy=False) def import_session_archive_producer(self, path, basename, ext): temp = self.worker.create_tempdir() if isinstance(temp, Exception): return temp if ext.lower() == ".7z": sevenzip = get_program_file("7z", "7-zip") if sevenzip: # Extract from 7z archive (flat hierarchy, not using dirnames) result = self.worker.exec_cmd(sevenzip, ["e", "-y", path], capture_output=True, log_output=False, skip_scripts=True, working_dir=temp) if not result or isinstance(result, Exception): return result # Check if a session archive is_session_archive = False for ext in (".icc", ".icm", ".cal"): if os.path.isfile(os.path.join(temp, basename + ext)): is_session_archive = True break if not is_session_archive: # Doesn't seem to be a session archive return Error(lang.getstr("error.not_a_session_archive", os.path.basename(path))) if os.path.isdir(os.path.join(temp, basename)): # Remove empty directory shutil.rmtree(os.path.join(temp, basename)) else: return Error(lang.getstr("file.missing", "7z" + exe_ext)) else: if (path.lower().endswith(".tgz") or path.lower().endswith(".tar.gz")): # Gzipped TAR archive archive = TarFileProper.open(path, "r", encoding="UTF-8") getinfo = archive.getmember getnames = archive.getnames else: # ZIP archive = zipfile.ZipFile(path, "r") getinfo = archive.getinfo getnames = archive.namelist try: with archive: # Check if a session archive info = None for ext in (".icc", ".icm", ".cal"): for name in (basename + "/" + basename + ext, basename + ext): if isinstance(archive, zipfile.ZipFile): # If the ZIP file was created with Unicode # names stored in the file, 'name' will already # be Unicode. Otherwise, it'll either be 7-bit # ASCII or (legacy) cp437 encoding names = (name, safe_str(name, "cp437")) else: # Gzipped TAR archive, assume UTF-8 names = (safe_str(name, "UTF-8"), ) for name in names: try: info = getinfo(name) except KeyError: continue break if info: break if info: break if not info: # Doesn't seem to be a session archive return Error(lang.getstr("error.not_a_session_archive", os.path.basename(path))) # Extract from archive (flat hierarchy, not using dirnames) for name in getnames(): if not isinstance(archive, zipfile.ZipFile): # Gzipped TAR archive.extract(name, temp, False) continue # If the ZIP file was created with Unicode names stored # in the file, 'name' will already be Unicode. # Otherwise, it'll either be 7-bit ASCII or (legacy) # cp437 encoding outname = safe_unicode(name, "cp437") with open(os.path.join(temp, os.path.basename(outname)), "wb") as outfile: outfile.write(archive.read(name)) except Exception, exception: from traceback import format_exc safe_print(traceback.format_exc()) return exception return os.path.join(getcfg("profile.save_path"), basename, basename + ext) def import_session_archive_consumer(self, result, basename): if result and not isinstance(result, Exception): # Copy to storage folder self.worker.wrapup(dst_path=os.path.join(getcfg("profile.save_path"), basename, basename + ".ext")) # Load settings from profile self.load_cal_handler(None, result) else: show_result_dialog(result) self.worker.wrapup(False) def display_ctrl_handler(self, event, load_lut=True, update_ccmx_items=True): if debug: safe_print("[D] display_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) display_no = self.display_ctrl.GetSelection() profile = None if display_no > -1: setcfg("display.number", display_no + 1) if load_lut: profile = get_display_profile(display_no) if not getcfg("calibration.file", False): # Current self.profile_info_btn.Enable(bool(profile)) if self.display_lut_link_ctrl.IsShown(): self.display_lut_link_ctrl_handler(CustomEvent( wx.EVT_BUTTON.evtType[0], self.display_lut_link_ctrl), bool(int(getcfg("display_lut.link")))) if load_lut: if debug: safe_print("[D] display_ctrl_handler -> lut_viewer_load_lut", profile.getDescription() if profile else None) self.lut_viewer_load_lut(profile=profile) if debug: safe_print("[D] display_ctrl_handler -> lut_viewer_load_lut END") # Check if the selected display is a pattern generator. If so, # don't use videoLUT for calibration. Restore previous value # when switching back to a display with videoLUT access. if config.is_patterngenerator(): if getcfg("calibration.use_video_lut.backup", False) is None: setcfg("calibration.use_video_lut.backup", getcfg("calibration.use_video_lut")) setcfg("calibration.use_video_lut", 0) elif getcfg("calibration.use_video_lut.backup", False) is not None: setcfg("calibration.use_video_lut", getcfg("calibration.use_video_lut.backup")) setcfg("calibration.use_video_lut.backup", None) update_delay_ctrls = False if config.get_display_name() == "Resolve": # Special case: Resolve. Needs a minimum display update delay of # atleast 600 ms for repeatable measurements. This is a Resolve # issue. There seem to be quite a few bugs that were introduced in # Resolve via the version 10.1.x to 11.x transition. if getcfg("measure.min_display_update_delay_ms.backup", False) is None: setcfg("measure.override_min_display_update_delay_ms.backup", getcfg("measure.override_min_display_update_delay_ms")) setcfg("measure.min_display_update_delay_ms.backup", getcfg("measure.min_display_update_delay_ms")) setcfg("measure.override_min_display_update_delay_ms", 1) setcfg("measure.min_display_update_delay_ms", 600) update_delay_ctrls = True elif getcfg("measure.min_display_update_delay_ms.backup", False) is not None: setcfg("measure.override_min_display_update_delay_ms", getcfg("measure.override_min_display_update_delay_ms.backup")) setcfg("measure.min_display_update_delay_ms", getcfg("measure.min_display_update_delay_ms.backup")) setcfg("measure.override_min_display_update_delay_ms.backup", None) setcfg("measure.min_display_update_delay_ms.backup", None) update_delay_ctrls = True if (config.is_virtual_display() or config.get_display_name() == "SII REPEATER"): # Enable 3D LUT tab for madVR, Resolve & eeColor if getcfg("3dlut.tab.enable.backup", False) is None: setcfg("3dlut.tab.enable.backup", getcfg("3dlut.tab.enable")) setcfg("3dlut.tab.enable", 1) elif (getcfg("3dlut.tab.enable.backup", False) is not None and not getcfg("3dlut.create")): setcfg("3dlut.tab.enable", getcfg("3dlut.tab.enable.backup")) setcfg("3dlut.tab.enable.backup", None) if update_delay_ctrls: override = bool(getcfg("measure.override_min_display_update_delay_ms")) getattr(self, "override_min_display_update_delay_ms").SetValue(override) self.update_display_delay_ctrl("min_display_update_delay_ms", override) show_levels_config = (config.get_display_name() != "madVR" and getcfg("show_advanced_options")) self.output_levels_label.Show(show_levels_config) self.output_levels_auto.Show(show_levels_config) self.output_levels_full_range.Show(show_levels_config) self.output_levels_limited_range.Show(show_levels_config) if getcfg("patterngenerator.detect_video_levels"): self.output_levels_auto.SetValue(True) else: use_video_levels = bool(getcfg("patterngenerator.use_video_levels")) self.output_levels_full_range.SetValue(not use_video_levels) self.output_levels_limited_range.SetValue(use_video_levels) # Check if display is calibratable at all. Unset calibration update # checkbox if this is not the case. if config.is_uncalibratable_display(): setcfg("calibration.update", False) self.calibration_update_cb.SetValue(False) if self.IsShownOnScreen(): self.update_menus() if (update_ccmx_items and getcfg("colorimeter_correction_matrix_file").split(":")[0] == "AUTO"): self.update_colorimeter_correction_matrix_ctrl_items() else: self.update_estimated_measurement_times() self.update_main_controls() if getattr(self, "reportframe", None): self.reportframe.update_controls() if getattr(self, "lut3dframe", None): self.lut3dframe.update_controls() ##if (event and not isinstance(event, CustomEvent) and ##not getcfg("calibration.file", False)): ### Set measurement report dest profile to current ##setcfg("measurement_report.output_profile", ##get_current_profile_path()) if not isinstance(event, CustomEvent): if config.get_display_name().startswith("Chromecast "): # Show a warning re Chromecast limitation show_result_dialog(UnloggedWarning(lang.getstr("chromecast_limitations_warning")), parent=self) if (config.get_display_name() == "Untethered" and getcfg("testchart.file") == "auto"): # Untethered does not support auto-optimization self.set_testchart() def display_delay_handler(self, event): mapping = {self.override_min_display_update_delay_ms.GetId(): "measure.override_min_display_update_delay_ms", self.min_display_update_delay_ms.GetId(): "measure.min_display_update_delay_ms", self.override_display_settle_time_mult.GetId(): "measure.override_display_settle_time_mult", self.display_settle_time_mult.GetId(): "measure.display_settle_time_mult"} pref = mapping.get(event.GetId()) if pref: ctrl = self.FindWindowById(event.GetId()) value = ctrl.GetValue() if ctrl.Name.startswith("override_"): self.update_display_delay_ctrl(ctrl.Name[9:], value) value = int(value) setcfg(pref, value) self.update_estimated_measurement_times() def update_display_delay_ctrl(self, name, enable): spinctrl = getattr(self, name) spinctrl.Enable(enable) spinvalue = getcfg("measure.%s" % name) if not enable: # Restore previous environment variable value backup = os.getenv("ARGYLL_%s_BACKUP" % name.upper()) current = os.getenv("ARGYLL_%s" % name.upper()) if backup or current: valuetype = type(defaults["measure.%s" % name]) try: spinvalue = valuetype(backup or current) except (TypeError, ValueError): pass spinctrl.SetValue(spinvalue) def display_lut_ctrl_handler(self, event): if debug: safe_print("[D] display_lut_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) try: i = self.displays.index(self.display_lut_ctrl.GetStringSelection()) except ValueError: i = min(0, self.display_ctrl.GetSelection()) setcfg("display_lut.number", i + 1) def display_lut_link_ctrl_handler(self, event, link=None): if debug: safe_print("[D] display_lut_link_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) bitmap_link = geticon(16, "stock_lock") bitmap_unlink = geticon(16, "stock_lock-open") if link is None: link = not bool(int(getcfg("display_lut.link"))) link = (not len(self.worker.displays) or (link and self.worker.lut_access[max(min(len(self.worker.displays), getcfg("display.number")), 0) - 1])) lut_no = -1 if link: self.display_lut_link_ctrl.SetBitmapLabel(bitmap_link) try: lut_no = self.display_lut_ctrl.Items.index(self.display_ctrl.GetStringSelection()) except ValueError: pass else: self.display_lut_link_ctrl.SetBitmapLabel(bitmap_unlink) set_bitmap_labels(self.display_lut_link_ctrl) if lut_no < 0: try: lut_no = self.display_lut_ctrl.Items.index(self.display_ctrl.Items[getcfg("display_lut.number") - 1]) except (IndexError, ValueError): lut_no = min(0, self.display_ctrl.GetSelection()) self.display_lut_ctrl.SetSelection(lut_no) self.display_lut_ctrl.Enable(not link and self.display_lut_ctrl.GetCount() > 1) setcfg("display_lut.link", int(link)) try: i = self.displays.index(self.display_lut_ctrl.Items[lut_no]) except (IndexError, ValueError): i = min(0, self.display_ctrl.GetSelection()) setcfg("display_lut.number", i + 1) def measurement_mode_ctrl_handler(self, event=None): if debug: safe_print("[D] measurement_mode_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) v = self.get_measurement_mode() if v and "p" in v and self.worker.argyll_version < [1, 1, 0]: self.measurement_mode_ctrl.SetSelection( self.measurement_modes_ba[self.get_instrument_type()].get( defaults["measurement_mode"], 1)) v = None InfoDialog(self, msg=lang.getstr("projector_mode_unavailable"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) if v and "V" in v and self.worker.argyll_version < [1, 1, 0] or ( self.worker.argyll_version[0:3] == [1, 1, 0] and ( "Beta" in self.worker.argyll_version_string or "RC1" in self.worker.argyll_version_string or "RC2" in self.worker.argyll_version_string)): # adaptive emissive mode was added in RC3 self.measurement_mode_ctrl.SetSelection( self.measurement_modes_ba[self.get_instrument_type()].get( defaults["measurement_mode"], 1)) v = None InfoDialog(self, msg=lang.getstr("adaptive_mode_unavailable"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) cal_changed = v != getcfg("measurement_mode") and \ getcfg("calibration.file", False) not in self.presets[1:] setcfg("measurement_mode", (strtr(v, {"V": "", "H": ""}) if v else None) or None) instrument_features = self.worker.get_instrument_features() if instrument_features.get("adaptive_mode"): setcfg("measurement_mode.adaptive", 1 if v and "V" in v else 0) if instrument_features.get("highres_mode"): setcfg("measurement_mode.highres", 1 if v and "H" in v else 0) if (v and self.worker.get_instrument_name() in ("ColorHug", "ColorHug2") and "p" in v): # ColorHug projector mode is just a correction matrix # Avoid setting ColorMunki projector mode v = v.replace("p", "") # ColorMunki projector mode is an actual special sensor dial position setcfg("measurement_mode.projector", 1 if v and "p" in v else None) self.update_colorimeter_correction_matrix_ctrl() self.update_colorimeter_correction_matrix_ctrl_items(update_measurement_mode=False) if (v and self.get_trc() and (not "c" in v or "p" in v) and float(self.get_black_point_correction()) > 0 and getcfg("calibration.black_point_correction_choice.show") and not getcfg("calibration.black_point_correction.auto")): if "c" in v: ok = lang.getstr("calibration.turn_on_black_point_correction") else: ok = lang.getstr("turn_off") title = "calibration.black_point_correction" msg = "calibration.black_point_correction_choice" cancel = "setting.keep_current" dlg = ConfirmDialog(self, title=lang.getstr(title), msg=lang.getstr(msg), ok=ok, cancel=lang.getstr(cancel), bitmap=geticon(32, "dialog-question")) chk = wx.CheckBox(dlg, -1, lang.getstr("dialog.do_not_show_again")) dlg.Bind(wx.EVT_CHECKBOX, self.black_point_correction_choice_dialog_handler, id=chk.GetId()) dlg.sizer3.Add(chk, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: if "c" in v: bkpt_corr = 1.0 else: bkpt_corr = 0.0 if not cal_changed and \ bkpt_corr != getcfg("calibration.black_point_correction"): self.cal_changed() setcfg("calibration.black_point_correction", bkpt_corr) self.update_controls(update_profile_name=False) self.update_profile_name() if v == "auto": wx.CallAfter(show_result_dialog, UnloggedInfo(lang.getstr("display.reset.info")), self) def black_point_correction_choice_dialog_handler(self, event): setcfg("calibration.black_point_correction_choice.show", int(not event.GetEventObject().GetValue())) def profile_type_ctrl_handler(self, event): if debug and event: safe_print("[D] profile_type_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) v = self.get_profile_type() lut_type = v in ("l", "x", "X") self.gamap_btn.Enable(lut_type) proftype_changed = False if v in ("l", "x", "X"): # XYZ LUT type if getcfg("profile.type") not in ("l", "x", "X"): # Disable black point compensation for LUT profiles setcfg("profile.black_point_compensation", 0) proftype_changed = True elif v in ("s", "S"): # Shaper + matrix type if getcfg("profile.type") not in ("s", "S"): # Enable black point compensation for shaper profiles setcfg("profile.black_point_compensation", 1) else: setcfg("profile.black_point_compensation", 0) if v in ("s", "S", "g", "G"): if getcfg("profile.type") not in ("s", "S", "g", "G"): proftype_changed = True self.update_bpc() self.profile_quality_ctrl.Enable(v not in ("g", "G")) if v in ("g", "G"): self.profile_quality_ctrl.SetValue(3) self.profile_quality_info.SetLabel( lang.getstr("calibration.quality.high")) if v != getcfg("profile.type"): self.profile_settings_changed() setcfg("profile.type", v) if hasattr(self, "gamapframe"): self.gamapframe.update_controls() self.set_default_testchart(force=proftype_changed) self.update_profile_name() if event: self.check_testchart_patches_amount() def check_testchart_patches_amount(self): """ Check if the selected testchart has at least the recommended amount of patches. Give user the choice to use the recommended amount if patch count is lower. """ recommended = {"G": 6, "g": 6, "l": 125, "lh": 125, "S": 12, "s": 12, "X": 73, "Xh": 73, "x": 73, "xh": 73} # lower quality actually needs *higher* patchcount while high quality # can get away with fewer patches and still improved result recommended = recommended.get(self.get_profile_type() + self.get_profile_quality(), recommended[self.get_profile_type()]) patches = int(self.testchart_patches_amount.GetLabel()) if recommended > patches and not is_ccxx_testchart(): self.profile_quality_ctrl.Disable() dlg = ConfirmDialog( self, msg=lang.getstr("profile.testchart_recommendation"), ok=lang.getstr("OK"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question")) result = dlg.ShowModal() self.profile_quality_ctrl.Enable(not getcfg("profile.update") and self.get_profile_type() not in ("g", "G")) dlg.Destroy() if result == wx.ID_OK: setcfg("testchart.auto_optimize", max(config.valid_values["testchart.auto_optimize"][1], int(round(colormath.cbrt(recommended))))) self.set_testchart("auto") def measurement_file_check_auto_handler(self, event): if not getcfg("ti3.check_sanity.auto"): dlg = ConfirmDialog(self, msg=lang.getstr("measurement_file.check_sanity.auto.warning"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning"), log=False) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: self.menuitem_measurement_file_check_auto.Check(False) return setcfg("ti3.check_sanity.auto", int(self.menuitem_measurement_file_check_auto.IsChecked())) def measurement_file_check_handler(self, event): # select measurement data (ti3 or profile) path = None defaultDir, defaultFile = get_verified_path("last_ti3_path") dlg = wx.FileDialog(self, lang.getstr("measurement_file.choose"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc_ti3") + "|*.icc;*.icm;*.ti3", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if not os.path.exists(path): show_result_dialog(Error(lang.getstr("file.missing", path)), self) return tags = OrderedDict() # Get filename and extension of file filename, ext = os.path.splitext(path) if ext.lower() != ".ti3": try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + path), self) return if (profile.tags.get("CIED", "") or profile.tags.get("targ", ""))[0:4] != "CTI3": show_result_dialog(Error(lang.getstr("profile.no_embedded_ti3") + "\n" + path), self) return ti3 = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) else: profile = None try: ti3 = open(path, "rU") except Exception, exception: show_result_dialog(Error(lang.getstr("error.file.open", path)), self) return setcfg("last_ti3_path", path) ti3 = CGATS.CGATS(ti3) if self.measurement_file_check_confirm(ti3, True): if ti3.modified: if profile: # Regenerate the profile? dlg = ConfirmDialog(self, msg=lang.getstr("profile.confirm_regeneration"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) dlg.Center() result = dlg.ShowModal() if result == wx.ID_OK: self.worker.wrapup(False) tmp_working_dir = self.worker.create_tempdir() if isinstance(tmp_working_dir, Exception): show_result_dialog(tmp_working_dir, self) return profile.tags.targ = ICCP.TextType("text\0\0\0\0" + str(ti3) + "\0", "targ") profile.tags.DevD = profile.tags.CIED = profile.tags.targ tmp_path = os.path.join(tmp_working_dir, os.path.basename(path)) profile.write(tmp_path) self.create_profile_handler(None, tmp_path, True) else: dlg = wx.FileDialog(self, lang.getstr("save_as"), os.path.dirname(path), os.path.basename(path), wildcard=lang.getstr("filetype.ti3") + "|*.ti3", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result == wx.ID_OK: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return try: ti3.write(path) except EnvironmentError, exception: show_result_dialog(exception, self) else: show_result_dialog(UnloggedInfo(lang.getstr("errors.none_found")), self) def measurement_file_check_confirm(self, ti3=None, force=False, parent=None): if not getcfg("ti3.check_sanity.auto") and not force: return True if not ti3: profile_save_path = self.worker.tempdir if profile_save_path and os.path.isdir(profile_save_path): profile_name = getcfg("profile.name.expanded") ti3 = os.path.join(profile_save_path, make_argyll_compatible_path(profile_name) + ".ti3") if not os.path.isfile(ti3): ti3 = None if not ti3: # Let the caller handle missing files return True try: if not isinstance(ti3, CGATS.CGATS): ti3 = CGATS.CGATS(ti3) ti3_1 = verify_ti1_rgb_xyz(ti3) except (IOError, CGATS.CGATSError), exception: show_result_dialog(exception, self) return False suspicious = check_ti3(ti3_1) if not suspicious: return True self.Show(start_timers=False) dlg = MeasurementFileCheckSanityDialog(parent or self, ti3_1, suspicious, force) result = dlg.ShowModal() if result == wx.ID_OK: indexes = [] for index in xrange(dlg.grid.GetNumberRows()): if dlg.grid.GetCellValue(index, 0) == "": indexes.insert(0, index) data = ti3_1.queryv1("DATA") removed = [] for index in indexes: removed.insert(0, data.pop(dlg.suspicious_items[index])) for item in removed: safe_print("Removed patch #%i from TI3: %s" % (item.key, item)) for index, fields in dlg.mods.iteritems(): if index not in indexes: item = dlg.suspicious_items[index] for field, value in fields.iteritems(): old = item[field] if old != value: item[field] = value safe_print(u"Updated patch #%s in TI3: %s %.4f \u2192 %.4f" % (item.SAMPLE_ID, field, old, value)) dlg.Destroy() if result == wx.ID_CANCEL: return False elif result == wx.ID_OK: if ti3.modified: if ti3.filename and os.path.exists(ti3.filename) and not force: try: ti3.write() except EnvironmentError, exception: show_result_dialog(exception, self) return False safe_print("Written updated TI3 to", ti3.filename) return removed, ti3 return True def profile_name_ctrl_handler(self, event): if debug: safe_print("[D] profile_name_ctrl_handler called for ID %s %s " "event type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) oldval = self.profile_name_textctrl.GetValue() if not self.check_profile_name() or len(oldval) > 80: wx.Bell() x = self.profile_name_textctrl.GetInsertionPoint() if oldval == "": newval = defaults.get("profile.name", "") else: newval = re.sub(r"[\\/:;*?\"<>|]+", "", oldval).lstrip("-")[:80] # Windows silently strips any combination of trailing spaces and dots newval = newval.rstrip(" .") self.profile_name_textctrl.ChangeValue(newval) self.profile_name_textctrl.SetInsertionPoint(x - (len(oldval) - len(newval))) self.update_profile_name() def create_profile_name_btn_handler(self, event): self.update_profile_name() def create_session_archive_handler(self, event): """ Create 7z or ZIP archive of the currently selected profile folder """ filename = getcfg("calibration.file", False) if not filename: return path_name, ext = os.path.splitext(filename) # Check for 7-Zip sevenzip = get_program_file("7z", "7-zip") if sevenzip: format = "7z" else: format = "zip" wildcard = lang.getstr("filetype." + format) + "|*." + format if format == "7z": wildcard += "|" + lang.getstr("filetype.zip") + "|*.zip" wildcard += "|" + lang.getstr("filetype.tgz") + "|*.tgz" # Ask where to save archive defaultDir, defaultFile = get_verified_path("last_archive_save_path") dlg = wx.FileDialog(self, lang.getstr("archive.create"), defaultDir, "%s.%s" % (os.path.basename(path_name), format), wildcard=wildcard, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() archive_path = dlg.GetPath() if sevenzip and dlg.GetFilterIndex(): # ZIP or TGZ sevenzip = None dlg.Destroy() if result != wx.ID_OK: return setcfg("last_archive_save_path", archive_path) dirname = os.path.dirname(filename) dirfilenames = [os.path.join(dirname, filename) for filename in os.listdir(dirname)] dirfilenames.sort() # Select filenames filenames = (glob.glob(path_name + "*") + glob.glob(os.path.join(dirname, "*.ccmx")) + glob.glob(os.path.join(dirname, "*.ccss")) + glob.glob(os.path.join(dirname, "0_16.ti1")) + glob.glob(os.path.join(dirname, "0_16.ti3")) + glob.glob(os.path.join(dirname, "0_16.log"))) # Remove duplicates & sort filenames = sorted(set(filenames)) lut3d_ext = ["." + strtr(lut3d_format, {"eeColor": "txt", "madVR": "3dlut"}) for lut3d_format in filter(lambda format: format not in ("icc", "icm"), config.valid_values["3dlut.format"])] has_3dlut = False for filename in filenames: if os.path.splitext(filename)[1].lower() in lut3d_ext: has_3dlut = True break if has_3dlut: # Should 3D LUT files be included? dlg = ConfirmDialog(self, msg=lang.getstr("archive.include_3dluts"), ok=lang.getstr("no"), alt=lang.getstr("yes"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-question")) result = dlg.ShowModal() if result == wx.ID_CANCEL: return if result != wx.ID_OK: # Include 3D LUTs lut3d_ext = None self.worker.interactive = False self.worker.start(self.create_session_archive_consumer, self.create_session_archive_producer, wargs=(dirname, dirfilenames, filenames, archive_path, lut3d_ext if has_3dlut else None, sevenzip), progress_msg=lang.getstr("archive.create"), stop_timers=False, cancelable=bool(sevenzip), fancy=False) def create_session_archive_producer(self, dirname, dirfilenames, filenames, archive_path, exclude_ext, sevenzip): """ Create session archive """ if sevenzip: # Create 7z archive if filenames == dirfilenames: # Add whole folder to archive, so that the 7z archive # has one folder in it containing all files filenames = [dirname] if os.path.isfile(archive_path): os.remove(archive_path) args = ["a", "-y"] if exclude_ext: for ext in exclude_ext: args.append("-xr!*" + ext) return self.worker.exec_cmd(sevenzip, args + [archive_path] + filenames, capture_output=True) else: # Create gzipped TAR or ZIP archive dirbasename = "" if filenames == dirfilenames: # Add whole folder to archive, so that the ZIP archive # has one folder in it containing all files dirbasename = os.path.basename(dirname) if (archive_path.lower().endswith(".tgz") or archive_path.lower().endswith(".tar.gz")): # Create gzipped tar archive archive = TarFileProper.open(archive_path, "w:gz", encoding="UTF-8") writefile = archive.add else: archive = zipfile.ZipFile(archive_path, "w", zipfile.ZIP_DEFLATED) writefile = archive.write try: with archive: for filename in filenames: if exclude_ext: if os.path.splitext(filename)[1].lower() in exclude_ext: continue writefile(filename, os.path.join(dirbasename, os.path.basename(filename))) except Exception, exception: return exception else: return True def create_session_archive_consumer(self, result): if not result: result = UnloggedError("".join(self.worker.errors)) if isinstance(result, Exception): show_result_dialog(result, parent=self) def profile_save_path_btn_handler(self, event): defaultPath = os.path.join(*get_verified_path("profile.save_path")) profile_name = getcfg("profile.name.expanded") dlg = wx.DirDialog(self, lang.getstr("dialog.set_profile_save_path", profile_name), defaultPath=defaultPath) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() profile_save_dir = os.path.join(path, profile_name) if not os.path.isdir(profile_save_dir): try: os.makedirs(profile_save_dir) except: pass if not waccess(os.path.join(profile_save_dir, profile_name), os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return try: os.rmdir(profile_save_dir) except: pass setcfg("profile.save_path", path) self.update_profile_name() dlg.Destroy() def profile_name_info_btn_handler(self, event): if not hasattr(self, "profile_name_tooltip_window"): self.profile_name_tooltip_window = TooltipWindow( self, msg=self.profile_name_info(), cols=2, title=lang.getstr("profile.name"), bitmap=geticon(32, "dialog-information")) else: self.profile_name_tooltip_window.Show() self.profile_name_tooltip_window.Raise() def profile_name_info(self): info = ["%nn " + lang.getstr("computer.name"), "%dn " + lang.getstr("display"), "%dns " + lang.getstr("display_short"), "%dnw " + lang.getstr("display") + " (" + lang.getstr("windows_only") + ")", "%dnws " + lang.getstr("display_short") + " (" + lang.getstr("windows_only") + ")", "%out " + lang.getstr("display.output"), "%ds " + lang.getstr("edid.serial") + " (" + lang.getstr("if_available") + ")", "%crc32 " + lang.getstr("edid.crc32") + " (" + lang.getstr("if_available") + ")", "%in " + lang.getstr("instrument"), "%im " + lang.getstr("measurement_mode"), "%wp " + lang.getstr("whitepoint"), "%cb " + lang.getstr("calibration.luminance"), "%cB " + lang.getstr("calibration.black_luminance"), "%cg " + lang.getstr("trc"), "%ca " + lang.getstr("calibration.ambient_viewcond_adjust"), "%cf " + lang.getstr("calibration.black_output_offset"), "%ck " + lang.getstr("calibration.black_point_correction")] if defaults["calibration.black_point_rate.enabled"]: info.append("%cA " + lang.getstr("calibration.black_point_rate")) info.extend(["%cq " + lang.getstr("calibration.speed"), "%pq " + lang.getstr("profile.quality"), "%pt " + lang.getstr("profile.type"), "%tpa " + lang.getstr("testchart.info")]) return lang.getstr("profile.name.placeholders") + "\n" + \ "\n".join(info) def profile_hires_b2a_handler(self, event, profile=None): if not profile: profile = self.select_profile(title=lang.getstr("profile.b2a.hires"), ignore_current_profile=True) if profile: if not ("A2B0" in profile.tags or "A2B1" in profile.tags): result = Error(lang.getstr("profile.required_tags_missing", " %s ".join(["A2B0", "A2B1"]) % lang.getstr("or"))) elif (("A2B0" in profile.tags and not isinstance(profile.tags.A2B0, ICCP.LUT16Type)) or ("A2B1" in profile.tags and not isinstance(profile.tags.A2B1, ICCP.LUT16Type))): result = Error(lang.getstr("profile.required_tags_missing", "LUT16Type")) elif profile.connectionColorSpace not in ("XYZ", "Lab"): result = Error(lang.getstr("profile.unsupported", (profile.connectionColorSpace, profile.connectionColorSpace))) else: result = None if result: show_result_dialog(result, self) else: self.interactive = False ##self.profile_hires_b2a_consumer(self.worker.update_profile_B2A(profile), profile) self.worker.start(self.profile_hires_b2a_consumer, self.worker.update_profile_B2A, cargs=(profile, ), wargs=(profile, ), wkwargs={"clutres": getcfg("profile.b2a.hires.size")}) def profile_hires_b2a_consumer(self, result, profile): self.start_timers() if isinstance(result, Exception): show_result_dialog(result, self) elif result: if not profile.fileName or not os.path.isfile(profile.fileName): # Let the user choose a location for the profile defaultDir, defaultFile = os.path.split(profile.fileName) dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir, defaultFile, wildcard=lang.getstr("filetype.icc") + "|*" + profile_ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() profile_save_path = dlg.GetPath() dlg.Destroy() else: result = wx.ID_OK profile_save_path = profile.fileName if result == wx.ID_OK: filename, ext = os.path.splitext(profile_save_path) if ext.lower() not in (".icc", ".icm"): profile_save_path += profile_ext if not waccess(profile_save_path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", profile_save_path)), self) return profile.setDescription(os.path.basename(filename)) profile.calculateID() profile.write(profile_save_path) if profile_save_path == get_current_profile_path(): self.lut3d_update_b2a_controls() self.install_profile_handler(None, profile_save_path, install_3dlut=False) else: show_result_dialog(lang.getstr("error.profile.file_not_created"), self) def create_profile_handler(self, event, path=None, skip_ti3_check=False): """ Create profile from existing measurements """ if not check_set_argyll_bin(): return if path is None: selectedpaths = [] # select measurement data (ti3 or profile) defaultDir, defaultFile = get_verified_path("last_ti3_path") dlg = wx.FileDialog(self, lang.getstr("create_profile"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc_ti3") + "|*.icc;*.icm;*.ti3", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: selectedpaths = dlg.GetPaths() dlg.Destroy() elif path: selectedpaths = [path] collected_ti3s = [] for path in selectedpaths: if not os.path.exists(path): InfoDialog(self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return tags = OrderedDict() # Get filename and extension of source file source_filename, source_ext = os.path.splitext(path) if source_ext.lower() != ".ti3": try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if (profile.tags.get("CIED", "") or profile.tags.get("targ", ""))[0:4] != "CTI3": InfoDialog(self, msg=lang.getstr("profile.no_embedded_ti3") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return ti3 = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) # Preserve custom tags for tagname in ("mmod", "meta"): if tagname in profile.tags: tags[tagname] = profile.tags[tagname] else: try: ti3 = open(path, "rU") except Exception, exception: InfoDialog(self, msg=lang.getstr("error.file.open", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return ti3_lines = [line.strip() for line in ti3] ti3.close() if not "CAL" in ti3_lines: dlg = ConfirmDialog(self, msg=lang.getstr("dialog.ti3_no_cal_info"), ok=lang.getstr("continue"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return collected_ti3s.append((path, ti3_lines)) if collected_ti3s: if len(collected_ti3s) > 1: source_filename = os.path.splitext(defaults["last_ti3_path"])[0] source_ext = ".ti3" path = collected_ti3s[0][0] is_tmp = False tmp_working_dir = self.worker.tempdir if tmp_working_dir: if sys.platform == "win32": if path.lower().startswith(tmp_working_dir.lower()): is_tmp = True elif path.startswith(tmp_working_dir): is_tmp = True if is_tmp: defaultDir, defaultFile = get_verified_path("last_ti3_path") else: defaultDir, defaultFile = os.path.split(path) setcfg("last_ti3_path", path) # let the user choose a location for the profile dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir, os.path.basename(source_filename) + profile_ext, wildcard=lang.getstr("filetype.icc") + "|*" + profile_ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() profile_save_path = os.path.split(dlg.GetPath()) profile_save_path = os.path.join(profile_save_path[0], make_argyll_compatible_path(profile_save_path[1])) dlg.Destroy() if result == wx.ID_OK: if not waccess(profile_save_path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", profile_save_path)), self) return filename, ext = os.path.splitext(profile_save_path) if ext.lower() not in (".icc", ".icm"): profile_save_path += profile_ext if os.path.exists(profile_save_path): dlg = ConfirmDialog( self, msg=lang.getstr("dialog.confirm_overwrite", (profile_save_path)), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return setcfg("last_cal_or_icc_path", profile_save_path) setcfg("last_icc_path", profile_save_path) # get filename and extension of target file profile_name = os.path.basename( os.path.splitext(profile_save_path)[0]) # create temporary working dir tmp_working_dir = self.worker.create_tempdir() if isinstance(tmp_working_dir, Exception): self.worker.wrapup(False) show_result_dialog(tmp_working_dir, self) return # Copy ti3 to temp dir ti3_tmp_path = os.path.join(tmp_working_dir, make_argyll_compatible_path(profile_name + ".ti3")) if len(collected_ti3s) > 1: # Collect files for averaging collected_paths = [] for ti3_path, ti3_lines in collected_ti3s: collected_path = os.path.join(tmp_working_dir, os.path.basename(ti3_path)) with open(collected_path, "w") as ti3_file: ti3_file.write("\n".join(ti3_lines)) collected_paths.append(collected_path) # Average the TI3 files args = ["-v"] + collected_paths + [ti3_tmp_path] cmd = get_argyll_util("average") result = self.worker.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) for collected_path in collected_paths: os.remove(collected_path) if isinstance(result, Exception) or not result: self.worker.wrapup(False) show_result_dialog(result or Error("\n".join(self.worker.errors)), self) return path = ti3_tmp_path self.worker.options_dispcal = [] self.worker.options_targen = [] display_name = None display_manufacturer = None try: if source_ext.lower() == ".ti3": if path != ti3_tmp_path: shutil.copyfile(path, ti3_tmp_path) # Get dispcal options if present (options_dispcal, options_colprof) = get_options_from_ti3(path) self.worker.options_dispcal = [ "-" + arg for arg in options_dispcal] arg = get_arg("M", options_colprof) if arg: display_name = arg[1][2:].strip('"') arg = get_arg("A", options_colprof) if arg: display_manufacturer = arg[1][2:].strip('"') else: # Binary mode because we want to avoid automatic # newlines conversion ti3 = open(ti3_tmp_path, "wb") ti3.write(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) ti3.close() # Get dispcal options if present self.worker.options_dispcal = [ "-" + arg for arg in get_options_from_profile(profile)[0]] if "dmdd" in profile.tags: display_name = profile.getDeviceModelDescription() if "dmnd" in profile.tags: display_manufacturer = profile.getDeviceManufacturerDescription() if is_tmp and path != ti3_tmp_path: profile.close() os.remove(path) ti3 = CGATS.CGATS(ti3_tmp_path) if ti3.queryv1("COLOR_REP") and \ ti3.queryv1("COLOR_REP")[:3] == "RGB": self.worker.options_targen = ["-d3"] except Exception, exception: handle_error(Error(u"Error - temporary .ti3 file could not " u"be created: " + safe_unicode(exception)), parent=self) self.worker.wrapup(False) return setcfg("calibration.file.previous", None) safe_print("-" * 80) if (not skip_ti3_check and not self.measurement_file_check_confirm(ti3)): self.worker.wrapup(False) return # Run colprof self.worker.interactive = False self.worker.start( self.profile_finish, self.worker.create_profile, ckwargs={ "profile_path": profile_save_path, "failure_msg": lang.getstr( "error.profile.file_not_created"), "install_3dlut": getcfg("3dlut.create")}, wkwargs={"dst_path": profile_save_path, "display_name": display_name, "display_manufacturer": display_manufacturer, "tags": tags}, progress_msg=lang.getstr("create_profile")) def create_profile_from_edid(self, event): edid = self.worker.get_display_edid() defaultFile = edid.get("monitor_name", edid.get("ascii", str(edid["product_id"]))) + profile_ext defaultDir = get_verified_path(None, os.path.join(getcfg("profile.save_path"), defaultFile))[0] # let the user choose a location for the profile dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir, defaultFile, wildcard=lang.getstr("filetype.icc") + "|*" + profile_ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() profile_save_path = os.path.split(dlg.GetPath()) profile_save_path = os.path.join(profile_save_path[0], make_argyll_compatible_path(profile_save_path[1])) dlg.Destroy() if result == wx.ID_OK: if not waccess(profile_save_path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", profile_save_path)), self) return profile = ICCP.ICCProfile.from_edid(edid) try: profile.write(profile_save_path) except Exception, exception: InfoDialog(self, msg=safe_unicode(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) else: if getcfg("profile.create_gamut_views"): safe_print("-" * 80) safe_print(lang.getstr("gamut.view.create")) self.worker.interactive = False self.worker.start(self.create_profile_from_edid_finish, self.worker.calculate_gamut, cargs=(profile, ), wargs=(profile_save_path, ), progress_msg=lang.getstr("gamut.view.create"), resume=False) else: self.create_profile_from_edid_finish(True, profile) def create_profile_from_edid_finish(self, result, profile): if isinstance(result, Exception): show_result_dialog(result, self) elif result: if isinstance(result, tuple): profile.set_gamut_metadata(result[0], result[1]) prefixes = profile.tags.meta.getvalue("prefix", "", None).split(",") # Set license profile.tags.meta["License"] = getcfg("profile.license") # Set device ID device_id = self.worker.get_device_id(quirk=True) if device_id: profile.tags.meta["MAPPING_device_id"] = device_id prefixes.append("MAPPING_") profile.tags.meta["prefix"] = ",".join(prefixes) profile.calculateID() safe_print("-" * 80) try: profile.write() except Exception, exception: show_result_dialog(exception, self) return self.profile_finish(True, profile.fileName, install_3dlut=getcfg("3dlut.create")) def create_profile_name(self): """ Replace placeholders in profile name with values from configuration """ profile_name = self.profile_name_textctrl.GetValue() # Computername if "%nn" in profile_name: profile_name = profile_name.replace("%nn", safe_unicode(platform.node()) or "\0") # Windows display name (EnumDisplayDevices / DeviceString) if "%dnws" in profile_name: display_win32_short = self.worker.get_display_name_short(False, False) profile_name = profile_name.replace("%dnws", display_win32_short or "\0") if "%dnw" in profile_name: display_win32 = self.worker.get_display_name(True, False) profile_name = profile_name.replace("%dnw", display_win32 or "\0") # EDID if "%ds" in profile_name or "%crc32" in profile_name: edid = self.worker.get_display_edid() # Serial if "%ds" in profile_name: serial = edid.get("serial_ascii", hex(edid.get("serial_32", 0))[2:]) if serial and serial not in ("0", "1010101", "fffffff"): profile_name = profile_name.replace("%ds", serial) else: profile_name = profile_name.replace("%ds", "\0") # CRC32 if "%crc32" in profile_name: if edid.get("edid"): profile_name = profile_name.replace("%crc32", "%X" % (crc32(edid["edid"]) & 0xFFFFFFFF)) else: profile_name = profile_name.replace("%crc32", "\0") # Display name if "%dns" in profile_name: display_short = self.worker.get_display_name_short(False, True) profile_name = profile_name.replace("%dns", display_short or "\0") if "%dn" in profile_name: display = self.worker.get_display_name(True, True) profile_name = profile_name.replace("%dn", display or "\0") # Output # if config.is_virtual_display(): output = "\0" else: output = "#%s" % getcfg("display.number") profile_name = profile_name.replace("%out", output or "\0") # Instrument name if "%in" in profile_name: instrument = self.comport_ctrl.GetStringSelection() profile_name = profile_name.replace("%in", instrument or "\0") # Measurement mode if "%im" in profile_name: mode = "" measurement_mode = self.get_measurement_mode() if measurement_mode: if "c" in measurement_mode: mode += lang.getstr("measurement_mode.refresh") elif "l" in measurement_mode: mode += lang.getstr("measurement_mode.lcd") if "p" in measurement_mode: if mode: mode += "-" mode += lang.getstr("projector") if "V" in measurement_mode: if mode: mode += "-" mode += lang.getstr("measurement_mode.adaptive") if "H" in measurement_mode: if mode: mode += "-" mode += lang.getstr("measurement_mode.highres") else: mode += lang.getstr("default") profile_name = profile_name.replace("%im", mode) trc = self.get_trc() do_cal = self.interactive_display_adjustment_cb.GetValue() or trc # Whitepoint if "%wp" in profile_name: whitepoint = self.get_whitepoint() whitepoint_locus = self.get_whitepoint_locus() if isinstance(whitepoint, str): if whitepoint.find(",") < 0: if whitepoint_locus == "t": whitepoint = "D" + whitepoint else: whitepoint += "K" else: whitepoint = "x ".join(whitepoint.split(",")) + "y" profile_name = profile_name.replace("%wp", (do_cal and whitepoint) or "\0") # Luminance if "%cb" in profile_name: luminance = self.get_luminance() profile_name = profile_name.replace("%cb", "\0" if luminance is None or not do_cal else luminance + u"cdm²") # Black luminance if "%cB" in profile_name: black_luminance = self.get_black_luminance() profile_name = profile_name.replace("%cB", "\0" if black_luminance is None or not do_cal else black_luminance + u"cdm²") # TRC / black output offset if "%cg" in profile_name or "%cf" in profile_name: black_output_offset = self.get_black_output_offset() # TRC if "%cg" in profile_name and trc: trc_type = self.get_trc_type() bt1886 = (trc == "2.4" and trc_type == "G" and black_output_offset == "0") if bt1886: trc = "Rec. 1886" elif trc not in ("l", "709", "s", "240"): if trc_type == "G": trc += " (%s)" % lang.getstr("trc.type.absolute").lower() else: trc = strtr(trc, {"l": "L", "709": "Rec. 709", "s": "sRGB", "240": "SMPTE240M"}) profile_name = profile_name.replace("%cg", trc or "\0") # Ambient adjustment if "%ca" in profile_name: ambient = self.get_ambient() profile_name = profile_name.replace("%ca", "\0" if ambient is None or not trc else ambient + "lx") # Black output offset if "%cf" in profile_name: f = int(float(black_output_offset) * 100) profile_name = profile_name.replace("%cf", ("%i%%" % f) if trc else "\0") # Black point correction / rate if "%ck" in profile_name or "%cA" in profile_name: black_point_correction = self.get_black_point_correction() # Black point correction if "%ck" in profile_name: k = int(float(black_point_correction) * 100) auto = self.black_point_correction_auto_cb.GetValue() profile_name = profile_name.replace("%ck", (str(k) + "% " if k > 0 and k < 100 else "") + (lang.getstr("neutral") if k > 0 else "\0").lower() if trc and not auto else "\0") # Black point rate if "%cA" in profile_name: black_point_rate = self.get_black_point_rate() if black_point_rate and float(black_point_correction) < 1 and trc: profile_name = profile_name.replace("%cA", black_point_rate) else: profile_name = profile_name.replace("%cA", "\0") # Calibration / profile quality if "%cq" in profile_name or "%pq" in profile_name: calibration_quality = self.get_calibration_quality() profile_quality = getcfg("profile.quality") aspects = { "c": calibration_quality if trc else "", "p": profile_quality } msgs = { "u": "VS", "h": "S", "m": "M", "l": "F", "v": "VF", "": "\0" } quality = {} if "%cq" in profile_name: quality["c"] = msgs[aspects["c"]] if "%pq" in profile_name: quality["p"] = msgs[aspects["p"]] if len(quality) == 2 and (quality["c"] == quality["p"] or quality["c"] == "\0"): profile_name = re.sub("%cq\W*%pq", quality["p"], profile_name) for q in quality: profile_name = profile_name.replace("%%%sq" % q, quality[q]) # Profile type if "%pt" in profile_name: profile_type = { "G": "1xGamma+MTX", "g": "3xGamma+MTX", "l": "LabLUT", "S": "1xCurve+MTX", "s": "3xCurve+MTX", "X": "XYZLUT+MTX", "x": "XYZLUT" }.get(self.get_profile_type()) profile_name = profile_name.replace("%pt", profile_type or "\0") # Amount of test patches if "%tpa" in profile_name: profile_name = profile_name.replace("%tpa", self.testchart_patches_amount.GetLabel()) # Date / time directives = ( "a", "A", "b", "B", "d", "H", "I", "j", "m", "M", "p", "S", "U", "w", "W", "y", "Y" ) for directive in directives: if "%%%s" % directive in profile_name: try: profile_name = profile_name.replace("%%%s" % directive, strftime("%%%s" % directive)) except UnicodeDecodeError: pass # All whitespace to space profile_name = re.sub("\s", " ", profile_name) # Get rid of inserted NULL bytes # Try to keep spacing intact if "\0" in profile_name: profile_name = re.sub("^(\0[_\- ]?)+|([_\- ]?\0)+$", "", profile_name) # Surrounded by underscores while "_\0" in profile_name or "\0_" in profile_name: while re.search("_\0+_", profile_name): profile_name = re.sub("_\0+_", "_", profile_name) profile_name = re.sub("_\0+", "_", profile_name) profile_name = re.sub("\0+_", "_", profile_name) # Surrounded by dashes while "-\0" in profile_name or "\0-" in profile_name: while re.search("-\0+-", profile_name): profile_name = re.sub("-\0+-", "-", profile_name) profile_name = re.sub("-\0+", "-", profile_name) profile_name = re.sub("\0+-", "-", profile_name) # Surrounded by whitespace while " \0" in profile_name or "\0 " in profile_name: while re.search(" \0+ ", profile_name): profile_name = re.sub(" \0+ ", " ", profile_name) profile_name = re.sub(" \0+", " ", profile_name) profile_name = re.sub("\0+ ", " ", profile_name) profile_name = re.sub("\0+", "", profile_name) # Windows silently strips any combination of trailing spaces and dots profile_name = profile_name.rstrip(" .") # Get rid of characters considered invalid for filenames. # Also strip leading dashes which might trick Argyll tools into # mistaking parts of the profile name as an option parameter profile_name = re.sub(r"[\\/:;*?\"<>|]+", "_", profile_name).lstrip("-") # Windows: MAX_PATH = 260, e.g. C:\256-char-path # Subtracting NUL and the four-char extension (e.g. .icm) leaves us # with 255 characters, e.g. # C:\Users\\AppData\Roaming\DisplayCAL\storage\\.icm # Mac OS X HFS+ has a 255-character limit. profile_save_path = getcfg("profile.save_path") maxpath = 255 # Leave headroom of 31 chars maxpath -= 31 if maxpath < len(profile_save_path): maxpath = len(profile_save_path) + 2 profile_path = os.path.join(profile_save_path, profile_name, profile_name) while len(profile_path) > maxpath: profile_name = profile_name[:-1] profile_path = os.path.join(profile_save_path, profile_name, profile_name) return profile_name def update_profile_name(self, event=None): profile_name = self.create_profile_name() if not self.check_profile_name(profile_name): self.profile_name_textctrl.ChangeValue(getcfg("profile.name")) profile_name = self.create_profile_name() if not self.check_profile_name(profile_name): self.profile_name_textctrl.ChangeValue( defaults.get("profile.name", "")) profile_name = self.create_profile_name() profile_name = make_argyll_compatible_path(profile_name) if profile_name != self.profile_name.GetLabel(): setcfg("profile.name", self.profile_name_textctrl.GetValue()) self.profile_name.SetToolTipString(profile_name) self.profile_name.SetLabel(profile_name.replace("&", "&&")) setcfg("profile.name.expanded", profile_name) def check_profile_name(self, profile_name=None): if profile_name is None: profile_name = self.profile_name_textctrl.GetValue() if (re.match(r"^[^\\/:;*?\"<>|]+$", profile_name) and not profile_name.startswith("-") and # Windows silently strips any combination of trailing spaces and dots profile_name == profile_name.rstrip(" .")): return True else: return False def get_ambient(self): if self.ambient_viewcond_adjust_cb.GetValue(): return str(stripzeros( self.ambient_viewcond_adjust_textctrl.GetValue())) return None def get_argyll_data_files(self, scope, wildcard, include_lastmod=False): """ Get paths of Argyll data files. scope should be a string containing "l" (local system) and/or "u" (user) """ data_files = [] if sys.platform != "darwin": if "l" in scope: for commonappdata in config.commonappdata: data_files += glob.glob(os.path.join(commonappdata, "color", wildcard)) data_files += glob.glob(os.path.join(commonappdata, "ArgyllCMS", wildcard)) if "u" in scope: data_files += glob.glob(os.path.join(config.appdata, "color", wildcard)) else: if "l" in scope: data_files += glob.glob(os.path.join(config.library, "color", wildcard)) data_files += glob.glob(os.path.join(config.library, "ArgyllCMS", wildcard)) if (self.worker.argyll_version >= [1, 9] and self.worker.argyll_version <= [1, 9, 1]): # Argyll CMS 1.9 and 1.9.1 use *nix locations due to a # configuration problem data_files += glob.glob(os.path.join("/usr/local/share", "ArgyllCMS", wildcard)) if "u" in scope: data_files += glob.glob(os.path.join(config.library_home, "color", wildcard)) if (self.worker.argyll_version >= [1, 9] and self.worker.argyll_version <= [1, 9, 1]): # Argyll CMS 1.9 and 1.9.1 use *nix locations due to a # configuration problem data_files += glob.glob(os.path.join(config.home, ".local", "share", "ArgyllCMS", wildcard)) if "u" in scope: data_files += glob.glob(os.path.join(config.appdata, "ArgyllCMS", wildcard)) if include_lastmod: filenames = list(data_files) data_files = [] for filename in filenames: try: lastmod = os.stat(filename).st_mtime except EnvironmentError: lastmod = -1 data_files.append((filename, lastmod)) return data_files def get_instrument_type(self): # Return the instrument type, "color" (colorimeter) or "spect" # (spectrometer) spect = self.worker.get_instrument_features().get("spectral", False) return "spect" if spect else "color" def get_measurement_mode(self): """ Return the measurement mode as string. Examples Argyll options -V -H (adaptive highres mode) Returned string 'VH' Argyll option -yl Returned string 'l' Argyll options -p -H (projector highres mode) Returned string 'pH' """ return self.measurement_modes_ab.get(self.get_instrument_type(), {}).get( self.measurement_mode_ctrl.GetSelection()) def get_profile_type(self): return self.profile_types_ab.get(self.profile_type_ctrl.GetSelection(), getcfg("profile.type")) def get_whitepoint(self): if self.whitepoint_ctrl.GetSelection() == 0: # Native return None elif self.whitepoint_ctrl.GetSelection() == 1: # Color temperature in kelvin return str(stripzeros( self.whitepoint_colortemp_textctrl.GetValue().replace(",", "."))) elif self.whitepoint_ctrl.GetSelection() == 2: x = self.whitepoint_x_textctrl.GetValue() try: x = round(x, 4) except ValueError: pass y = self.whitepoint_y_textctrl.GetValue() try: y = round(y, 4) except ValueError: pass return str(stripzeros(x)) + "," + str(stripzeros(y)) def get_whitepoint_locus(self): n = self.whitepoint_colortemp_locus_ctrl.GetSelection() if not n in self.whitepoint_colortemp_loci_ab: n = 0 return str(self.whitepoint_colortemp_loci_ab[n]) def get_luminance(self): if self.luminance_ctrl.GetSelection() == 0: return None else: return str(stripzeros(self.luminance_textctrl.GetValue())) def get_black_luminance(self): if self.black_luminance_ctrl.GetSelection() == 0: return None else: return str(stripzeros( self.black_luminance_textctrl.GetValue())) def get_black_output_offset(self): return str(Decimal(self.black_output_offset_ctrl.GetValue()) / 100) def get_black_point_correction(self): return str(Decimal(self.black_point_correction_ctrl.GetValue()) / 100) def get_black_point_rate(self): if defaults["calibration.black_point_rate.enabled"]: return str(self.black_point_rate_floatctrl.GetValue()) else: return None def get_trc_type(self): if self.trc_type_ctrl.GetSelection() == 1: return "G" else: return "g" def get_trc(self): if self.trc_ctrl.GetSelection() in (1, 4, 7): return str(stripzeros(self.trc_textctrl.GetValue().replace(",", "."))) elif self.trc_ctrl.GetSelection() == 2: return "l" elif self.trc_ctrl.GetSelection() == 3: return "709" elif self.trc_ctrl.GetSelection() == 5: return "240" elif self.trc_ctrl.GetSelection() == 6: return "s" else: return "" def get_calibration_quality(self): return self.quality_ab[self.calibration_quality_ctrl.GetValue()] def get_profile_quality(self): return self.quality_ab[self.profile_quality_ctrl.GetValue() + 1] def profile_settings_changed(self): ##cal = getcfg("calibration.file", False) ##if cal: ##filename, ext = os.path.splitext(cal) ##if ext.lower() in (".icc", ".icm"): ##if not os.path.exists(filename + ".cal") and \ ##not cal in self.presets: ##self.cal_changed() ##return if not self.updatingctrls: setcfg("settings.changed", 1) if not self.calibration_file_ctrl.GetStringSelection().startswith("*"): sel = self.calibration_file_ctrl.GetSelection() if sel > 0: items = self.calibration_file_ctrl.GetItems() items[sel] = "* " + items[sel] self.calibration_file_ctrl.Freeze() self.calibration_file_ctrl.SetItems(items) self.calibration_file_ctrl.SetSelection(sel) self.calibration_file_ctrl.Thaw() def testchart_ctrl_handler(self, event): if debug: safe_print("[D] testchart_ctrl_handler called for ID %s %s event " "type %s %s" % (event.GetId(), getevtobjname(event, self), event.GetEventType(), getevttype(event))) self.set_testchart(self.testcharts[self.testchart_ctrl.GetSelection()]) wx.CallAfter(self.check_testchart_patches_amount) def testchart_btn_handler(self, event, path=None): if path is None: defaultDir, defaultFile = get_verified_path("testchart.file") dlg = wx.FileDialog(self, lang.getstr("dialog.set_testchart"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc_ti1_ti3") + "|*.icc;*.icm;*.ti1;*.ti3", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if not os.path.exists(path): InfoDialog(self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return filename, ext = os.path.splitext(path) if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return ti3_lines = [line.strip() for line in StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", ""))] if not "CTI3" in ti3_lines: InfoDialog(self, msg=lang.getstr("profile.no_embedded_ti3") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return self.set_testchart(path) writecfg() self.profile_settings_changed() def testchart_patches_amount_ctrl_handler(self, event): auto = self.testchart_patches_amount_ctrl.GetValue() if event: setcfg("testchart.auto_optimize", auto) self.profile_settings_changed() proftype = getcfg("profile.type") if auto > 4: s = min(auto, 11) * 4 - 3 g = s * 3 - 2 patches_amount = get_total_patches(4, 4, s, g, auto, auto, 0) + 34 patches_amount += 120 if event and proftype not in ("l", "x", "X"): setcfg("profile.type", "x" if getcfg("3dlut.create") else "X") else: if auto == 1: patches_amount = 34 elif auto == 2: patches_amount = 79 elif auto == 3: patches_amount = 115 else: patches_amount = 175 if event: if auto > 1 and proftype not in ("x", "X"): setcfg("profile.type", "x" if getcfg("3dlut.create") else "X") elif auto < 2 and proftype not in ("g", "G", "s", "S"): setcfg("profile.type", "S" if getcfg("trc") else "s") if proftype != getcfg("profile.type"): self.update_profile_type_ctrl() # Reset profile type to previous value so the handler method will # recognize a change in profile type and update BPC accordingly setcfg("profile.type", proftype) self.profile_type_ctrl_handler(None) self.testchart_patches_amount.SetLabel(str(patches_amount)) self.update_estimated_measurement_time("testchart") self.update_profile_name() def testchart_patch_sequence_ctrl_handler(self, event): sel = self.testchart_patch_sequence_ctrl.Selection setcfg("testchart.patch_sequence", config.valid_values["testchart.patch_sequence"][sel]) self.profile_settings_changed() self.update_estimated_measurement_time("testchart") def create_testchart_btn_handler(self, event): if not hasattr(self, "tcframe"): self.init_tcframe() elif not hasattr(self.tcframe, "ti1") or \ getcfg("testchart.file") not in (self.tcframe.ti1.filename, "auto"): self.tcframe.tc_load_cfg_from_ti1(cfg="testchart.file", parent_set_chart_methodname="set_testchart") setcfg("tc.show", 1) self.tcframe.Show() self.tcframe.Raise() return def init_tcframe(self, path=None): self.tcframe = TestchartEditor(self, path=path) def set_default_testchart(self, alert=True, force=False): path = getcfg("testchart.file") ##print "set_default_testchart", path if getcfg("profile.type") in ("x", "X"): # XYZ cLUT if getcfg("testchart.auto_optimize") < 2: setcfg("testchart.auto_optimize", 3) elif getcfg("profile.type") == "l": # L*a*b* cLUT if getcfg("testchart.auto_optimize") < 5: setcfg("testchart.auto_optimize", 5) else: # Gamma or shaper + matrix if getcfg("testchart.auto_optimize") > 2: setcfg("testchart.auto_optimize", 1) if path == "auto": self.set_testchart(path) return if os.path.basename(path) in self.dist_testchart_names: path = self.dist_testcharts[ self.dist_testchart_names.index(os.path.basename(path))] if debug: safe_print("[D] set_default_testchart testchart.file:", path) setcfg("testchart.file", path) if force or (lang.getstr(os.path.basename(path)) in [""] + self.default_testchart_names) or not os.path.isfile(path): if (not force and lang.getstr(os.path.basename(path)) in [""] + self.default_testchart_names): ti1 = os.path.basename(path) else: ti1 = self.testchart_defaults[self.get_profile_type()].get( self.get_profile_quality(), self.testchart_defaults[self.get_profile_type()][None]) if ti1 != "auto": path = get_data_path(os.path.join("ti1", ti1)) if not path or not os.path.isfile(path): if alert: InfoDialog(self, msg=lang.getstr("error.testchart.missing", ti1), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) elif verbose >= 1: safe_print(lang.getstr("error.testchart.missing", ti1)) return False else: path = ti1 self.set_testchart(path) return True return None def set_testcharts(self, path=None): idx = self.testchart_ctrl.GetSelection() self.testchart_ctrl.Freeze() self.testchart_ctrl.SetItems(self.get_testchart_names(path)) self.testchart_ctrl.SetSelection(idx) self.testchart_ctrl.Thaw() def set_testchart(self, path=None, update_profile_name=True): if path is None: path = getcfg("testchart.file") filename, ext = os.path.splitext(path) ti1_path = filename + ".ti1" if (ext.lower() in (".icc", ".icm") and getcfg("testchart.patch_sequence") != "optimize_display_response_delay" and os.path.isfile(ti1_path)): # Use actual testchart file so choosing the default patch # sequence of optimizing response delay will actually work # (because the ti1 is guaranteed to be in that sequence if created # via targen by DisplayCAL) path = ti1_path ##print "set_testchart", path if path == "auto" and config.get_display_name() == "Untethered": self._current_testchart_path = path if self.IsShown(): wx.CallAfter(show_result_dialog, UnloggedInfo(lang.getstr("testchart.auto_optimize.untethered.unsupported")), self) path = getcfg("calibration.file", False) if not path or path.lower().endswith(".cal"): path = defaults["testchart.file"] self.create_testchart_btn.Enable(path != "auto" and not getcfg("profile.update")) self.menuitem_testchart_edit.Enable(self.create_testchart_btn.Enabled) self.testchart_patches_amount_label.Show(path == "auto") self.testchart_patches_amount_ctrl.Show(path == "auto") if path == "auto": if path != getcfg("testchart.file"): self.profile_settings_changed() setcfg("testchart.file", path) if path not in self.testcharts: self.set_testcharts(path) self.testchart_ctrl.SetSelection(0) self.testchart_ctrl.SetToolTipString("") self.worker.options_targen = ["-d3"] auto = getcfg("testchart.auto_optimize") or 7 self.testchart_patches_amount_ctrl.SetValue(auto) self.testchart_patches_amount_ctrl_handler(None) self._current_testchart_path = path else: self.set_testchart_from_path(path) self.check_testchart() if update_profile_name: self.update_profile_name() def set_testchart_from_path(self, path): result = check_file_isfile(path) if isinstance(result, Exception): show_result_dialog(result, self) self.set_default_testchart(force=True) return if getattr(self, "_current_testchart_path", None) == path: # Nothing to do return filename, ext = os.path.splitext(path) try: if ext.lower() in (".ti1", ".ti3"): if ext.lower() == ".ti3": ti1 = CGATS.CGATS(ti3_to_ti1(open(path, "rU"))) else: ti1 = CGATS.CGATS(path) else: # icc or icm profile profile = ICCP.ICCProfile(path) ti1 = CGATS.CGATS(ti3_to_ti1(profile.tags.get("CIED", "") or profile.tags.get("targ", ""))) try: ti1_1 = verify_ti1_rgb_xyz(ti1) except CGATS.CGATSError, exception: msg = {CGATS.CGATSKeyError: lang.getstr("error.testchart.missing_fields", (path, "RGB_R, RGB_G, RGB_B, " " XYZ_X, XYZ_Y, XYZ_Z"))}.get(exception.__class__, lang.getstr("error.testchart.invalid", path) + "\n" + lang.getstr(safe_unicode(exception))) InfoDialog(self, msg=msg, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.set_default_testchart(force=True) return if path != getcfg("calibration.file", False): self.profile_settings_changed() if debug: safe_print("[D] set_testchart testchart.file:", path) setcfg("testchart.file", path) if path not in self.testcharts: self.set_testcharts(path) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.testcharts, path) self.testchart_ctrl.SetSelection(idx) self.testchart_ctrl.SetToolTipString(path) if ti1.queryv1("COLOR_REP") and \ ti1.queryv1("COLOR_REP")[:3] == "RGB": self.worker.options_targen = ["-d3"] self.testchart_patches_amount.SetLabel( str(ti1.queryv1("NUMBER_OF_SETS"))) self._current_testchart_path = path except Exception, exception: error = traceback.format_exc() if debug else exception InfoDialog(self, msg=lang.getstr("error.testchart.read", path) + "\n\n" + safe_unicode(error), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) self.set_default_testchart(force=True) else: self.update_estimated_measurement_time("testchart") if hasattr(self, "tcframe") and \ self.tcframe.IsShownOnScreen() and \ (not hasattr(self.tcframe, "ti1") or getcfg("testchart.file") != self.tcframe.ti1.filename): self.tcframe.tc_load_cfg_from_ti1(cfg="testchart.file", parent_set_chart_methodname="set_testchart") def check_testchart(self): if is_ccxx_testchart(): self.set_ccxx_measurement_mode() else: self.restore_measurement_mode() self.update_colorimeter_correction_matrix_ctrl() if not self.updatingctrls: self.update_main_controls() def get_testchart_names(self, path=None): testchart_names = [] self.testcharts = [] if path is None: path = getcfg("testchart.file") ##print "get_testchart_names", path if path != "auto" and os.path.exists(path): testchart_dir = os.path.dirname(path) try: testcharts = listdir_re(testchart_dir, re.escape(os.path.splitext(os.path.basename(path))[0]) + r"\.(?:icc|icm|ti1|ti3)$") except Exception, exception: safe_print(u"Error - directory '%s' listing failed: %s" % tuple(safe_unicode(s) for s in (testchart_dir, exception))) else: for testchart_name in testcharts: if testchart_name not in testchart_names: testchart_names.append(testchart_name) self.testcharts.append(os.pathsep.join((testchart_name, testchart_dir))) default_testcharts = get_data_path("ti1", "\.(?:icc|icm|ti1|ti3)$") if isinstance(default_testcharts, list): for testchart in default_testcharts: testchart_dir = os.path.dirname(testchart) testchart_name = os.path.basename(testchart) if testchart_name not in testchart_names: testchart_names.append(testchart_name) self.testcharts.append(os.pathsep.join((testchart_name, testchart_dir))) self.testcharts = ["auto"] + natsort(self.testcharts) self.testchart_names = [] i = 0 for chart in self.testcharts: chart = chart.split(os.pathsep) chart.reverse() self.testcharts[i] = os.path.join(*chart) if chart[-1] == "auto": testchart_name = "auto_optimized" else: testchart_name = chart[-1] self.testchart_names.append(lang.getstr(testchart_name)) i += 1 return self.testchart_names def set_argyll_bin_handler(self, event, silent=False, callafter=None, callafter_args=()): """ Set Argyll CMS binary executables directory """ if ((getattr(self.worker, "thread", None) and self.worker.thread.isAlive()) or not self.Shown or not self.Enabled or get_dialogs()): return if ((event and set_argyll_bin(self, silent, callafter, callafter_args)) or (not event and check_argyll_bin())): self.check_update_controls(True, callafter=callafter, callafter_args=callafter_args) if sys.platform == "win32": self.send_command("apply-profiles", 'setcfg argyll.dir "%s" force' % getcfg("argyll.dir")) def check_update_controls(self, event=None, silent=False, callafter=None, callafter_args=()): """ Update controls and menuitems when changes in displays or instruments are detected. Return True if update was needed and carried out, False otherwise. """ if (self.worker.is_working() or not self.Shown or not self.Enabled or get_dialogs()): return False argyll_bin_dir = self.worker.argyll_bin_dir argyll_version = list(self.worker.argyll_version) displays = list(self.worker.displays) comports = list(self.worker.instruments) if event: enumerate_ports = not isinstance(event, wx.DisplayChangedEvent) else: # Use configured value enumerate_ports = getcfg("enumerate_ports.auto") if event or silent: args = (self.check_update_controls_consumer, self.check_update_controls_producer) kwargs = dict(cargs=(argyll_bin_dir, argyll_version, displays, comports, event, callafter, callafter_args), wkwargs={"silent": True, "enumerate_ports": enumerate_ports, "displays": displays, "profile_loader_load_cal": isinstance(event, wx.DisplayChangedEvent)}) if silent: self.thread = delayedresult.startWorker(*args, **kwargs) else: kwargs["progress_msg"] = lang.getstr("enumerating_displays_and_comports") kwargs["stop_timers"] = False kwargs["show_remaining_time"] = False kwargs["fancy"] = False self.worker.start(*args, **kwargs) else: self.worker.enumerate_displays_and_ports(silent, enumerate_ports=enumerate_ports) return self.check_update_controls_consumer(True, argyll_bin_dir, argyll_version, displays, comports, event, callafter, callafter_args) def check_update_controls_producer(self, silent=False, enumerate_ports=True, displays=None, profile_loader_load_cal=False): result = self.worker.enumerate_displays_and_ports(silent, enumerate_ports=enumerate_ports) if (sys.platform == "win32" and displays != self.worker.displays and profile_loader_load_cal and not util_win.calibration_management_isenabled()): # Tell profile loader to load calibration self.send_command("apply-profiles", "apply-profiles display-changed") return result def check_update_controls_consumer(self, result, argyll_bin_dir, argyll_version, displays, comports, event=None, callafter=None, callafter_args=None): if isinstance(result, delayedresult.DelayedResult): try: result.get() except Exception, exception: if hasattr(exception, "originalTraceback"): error = exception.originalTraceback else: error = traceback.format_exc() result = Error(error) if isinstance(result, Exception): raise result if argyll_bin_dir != self.worker.argyll_bin_dir or \ argyll_version != self.worker.argyll_version: self.show_advanced_options_handler() self.worker.measurement_modes = {} self.update_measurement_modes() if comports == self.worker.instruments: self.update_colorimeter_correction_matrix_ctrl() self.update_black_point_rate_ctrl() self.update_drift_compensation_ctrls() self.setup_observer_ctrl() self.update_observer_ctrl() self.update_profile_type_ctrl_items() self.profile_type_ctrl.SetSelection( self.profile_types_ba.get(getcfg("profile.type"), self.profile_types_ba.get(defaults["profile.type"], 0))) self.lut3d_setup_language() self.lut3d_init_input_profiles() self.lut3d_update_controls() if hasattr(self, "aboutdialog"): if self.aboutdialog.IsShownOnScreen(): self.aboutdialog_handler(None) if hasattr(self, "extra_args"): self.extra_args.update_controls() if hasattr(self, "gamapframe"): visible = self.gamapframe.IsShownOnScreen() self.gamapframe.Close() self.gamapframe.Destroy() del self.gamapframe if visible: self.gamap_btn_handler(None) if getattr(self, "lut3dframe", None): visible = self.lut3dframe.IsShownOnScreen() self.lut3dframe.Close() self.lut3dframe.Destroy() del self.lut3dframe if visible: self.lut3d_create_handler(None) if getattr(self, "reportframe", None): visible = self.reportframe.IsShownOnScreen() self.reportframe.Close() self.reportframe.Destroy() del self.reportframe if visible: self.measurement_report_create_handler(None) if hasattr(self, "tcframe"): visible = self.tcframe.IsShownOnScreen() self.tcframe.tc_close_handler() self.tcframe.Destroy() del self.tcframe if visible: self.create_testchart_btn_handler(None) if displays != self.worker.displays: self.update_displays(update_ccmx_items=True) if verbose >= 1: safe_print(lang.getstr("display_detected")) if comports != self.worker.instruments: self.update_comports() if verbose >= 1: safe_print(lang.getstr("comport_detected")) if event and not callafter: # Check if we should import colorimeter corrections # or other instrument setup self.check_instrument_setup() if displays != self.worker.displays or \ comports != self.worker.instruments: if self.IsShownOnScreen(): self.update_menus() self.update_main_controls() returnvalue = True else: returnvalue = False if len(self.worker.displays): if getcfg("calibration.file", False): # Load LUT curves from last used .cal file self.load_cal(silent=True) else: # Load LUT curves from current display profile (if any, # and if it contains curves) self.load_display_profile_cal(None) if callafter: callafter(*callafter_args) return returnvalue def check_instrument_setup(self, callafter=None, callafter_args=()): # Check if we should import colorimeter corrections # or do other instrument specific setup if (self.worker.is_working() or not self.Shown or not self.Enabled or get_dialogs()): return if getcfg("colorimeter_correction_matrix_file") in ("AUTO:", ""): # Check for applicable corrections ccmx_instruments = self.ccmx_instruments.itervalues() i1d3 = ("i1 DisplayPro, ColorMunki Display" in self.worker.instruments and not "" in ccmx_instruments) icd = (("DTP94" in self.worker.instruments and not "DTP94" in ccmx_instruments) or ("i1 Display 2" in self.worker.instruments and not "i1 Display 2" in ccmx_instruments) or ("Spyder2" in self.worker.instruments and not "Spyder2" in ccmx_instruments) or ("Spyder3" in self.worker.instruments and not "Spyder3" in ccmx_instruments)) else: # Already using a suitable correction i1d3 = False icd = False spyd2 = ("Spyder2" in self.worker.instruments and not self.worker.spyder2_firmware_exists()) spyd4 = (("Spyder4" in self.worker.instruments or "Spyder5" in self.worker.instruments) and not self.worker.spyder4_cal_exists()) if spyd2: spyd2 = self.enable_spyder2_handler(True, i1d3 or icd or spyd4, callafter=callafter, callafter_args=callafter_args) result = spyd2 if not spyd2 and (i1d3 or icd or spyd4): result = self.import_colorimeter_corrections_handler(True, callafter=callafter, callafter_args=callafter_args) if not result and callafter: callafter(*callafter_args) def load_cal_handler(self, event, path=None, update_profile_name=True, silent=False, load_vcgt=True): """ Load settings and calibration """ if not check_set_argyll_bin(): return if path is None: wildcard = lang.getstr("filetype.cal_icc") + "|*.cal;*.icc;*.icm" sevenzip = get_program_file("7z", "7-zip") if sevenzip: wildcard += ";*.7z" wildcard += ";*.tar.gz;*.tgz;*.zip" defaultDir, defaultFile = get_verified_path("last_cal_or_icc_path") dlg = wx.FileDialog(self, lang.getstr("dialog.load_cal"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=wildcard, style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if getcfg("settings.changed") and not self.settings_confirm_discard(): return if not os.path.exists(path): sel = self.calibration_file_ctrl.GetSelection() if len(self.recent_cals) > sel and \ self.recent_cals[sel] == path: self.recent_cals.remove(self.recent_cals[sel]) recent_cals = [] for recent_cal in self.recent_cals: if recent_cal not in self.presets: recent_cals.append(recent_cal) setcfg("recent_cals", os.pathsep.join(recent_cals)) self.calibration_file_ctrl.Delete(sel) cal = getcfg("calibration.file", False) or "" if not cal in self.recent_cals: self.recent_cals.append(cal) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) InfoDialog(self, msg=lang.getstr("file.missing", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return is_preset = path in self.presets basename = os.path.basename(path) is_3dlut_preset = basename.startswith("video_") filename, ext = os.path.splitext(path) if ext.lower() in (".7z", ".tar.gz", ".tgz", ".zip"): self.import_session_archive(path) return if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return if profile.profileClass != "mntr" or \ profile.colorSpace != "RGB": InfoDialog(self, msg=lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace)) + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return cal = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) else: try: cal = open(path, "rU") except Exception, exception: InfoDialog(self, msg=lang.getstr("error.file.open", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return ti3_lines = [line.strip() for line in cal] cal.close() setcfg("last_cal_or_icc_path", path) update_ccmx_items = True set_size = True display_match = False display_changed = False instrument_id = None instrument_match = False if ext.lower() in (".icc", ".icm"): setcfg("last_icc_path", path) if path not in self.presets: setcfg("3dlut.output.profile", path) setcfg("measurement_report.output_profile", path) # Disable 3D LUT tab when switching from madVR / Resolve setcfg("3dlut.tab.enable", 0) setcfg("3dlut.tab.enable.backup", 0) (options_dispcal, options_colprof) = get_options_from_profile(profile) # Get and set the display # First try to find the correct display by comparing # the model (if present) display_name = profile.getDeviceModelDescription() # Second try to find the correct display by comparing # the EDID hash (if present) edid_md5 = profile.tags.get("meta", {}).get("EDID_md5", {}).get("value") if display_name or edid_md5: display_name_indexes = [] edid_md5_indexes = [] for i, edid in enumerate(self.worker.display_edid): if display_name in (edid.get("monitor_name", False), self.worker.display_names[i]): display_name_indexes.append(i) if edid_md5 == edid.get("hash", False): edid_md5_indexes.append(i) if len(display_name_indexes) == 1: display_index = display_name_indexes[0] safe_print("Found display device matching model " "description at index #%i" % display_index) elif len(edid_md5_indexes) == 1: display_index = edid_md5_indexes[0] safe_print("Found display device matching EDID MD5 " "at index #%i" % display_index) else: # We got several matches. As we can't be sure which # is the right one, do nothing. display_index = None if display_index is not None: # Found it display_match = True if (config.get_display_name(None, False) != config.get_display_name(display_index, False)): # Only need to update if currently selected display # does not match found one setcfg("display.number", display_index + 1) self.get_set_display() display_changed = True if config.get_display_name() in ("madVR", "Resolve", "SII REPEATER"): # Don't disable 3D LUT tab when switching from # madVR / Resolve / eeColor setcfg("3dlut.tab.enable.backup", 1) # Get and set the instrument instrument_id = profile.tags.get("meta", {}).get("MEASUREMENT_device", {}).get("value") if instrument_id: for i, instrument in enumerate(self.worker.instruments): if instrument.lower() == instrument_id: # Found it instrument_match = True if (self.worker.get_instrument_name().lower() == instrument_id): # No need to update anything break setcfg("comport.number", i + 1) self.update_comports() # No need to update ccmx items in update_controls, # as comport_ctrl_handler took care of it update_ccmx_items = False # comport_ctrl_handler already called set_size set_size = False break else: try: (options_dispcal, options_colprof) = get_options_from_cal(path) except (IOError, CGATS.CGATSError), exception: InfoDialog(self, msg=lang.getstr("calibration.file.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return black_point_correction = False if options_dispcal or options_colprof: if debug: safe_print("[D] options_dispcal:", options_dispcal) if debug: safe_print("[D] options_colprof:", options_colprof) ccxxsetting = getcfg("colorimeter_correction_matrix_file").split(":", 1)[0] ccmx = None # Check if TRC was set trc = False if options_dispcal: for o in options_dispcal: if o[0] in ("g", "G"): trc = True # Restore defaults self.restore_defaults_handler( include=("calibration", "drift_compensation", "measure.darken_background", "measure.override_min_display_update_delay_ms", "measure.min_display_update_delay_ms", "measure.override_display_settle_time_mult", "measure.display_settle_time_mult", "observer", "trc", "whitepoint"), exclude=("calibration.black_point_correction_choice.show", "calibration.update", "calibration.use_video_lut", "measure.darken_background.show_warning", "trc.should_use_viewcond_adjust.show_msg"), override={"trc": ""} if not trc else None) # Parse options if options_dispcal: self.worker.options_dispcal = ["-" + arg for arg in options_dispcal] for o in options_dispcal: if o[0] == "d" and o[1:] in ("web", "madvr"): # Special case web and madvr so it can be used in # preset templates which are TI3 files for i, display_name in enumerate(self.worker.display_names): if display_name.lower() == o[1:]: # Found it display_match = True if getcfg("display.number") != i + 1: setcfg("display.number", i + 1) self.get_set_display() display_changed = True break continue if o[0] == "m": setcfg("calibration.interactive_display_adjustment", 0) continue ##if o[0] == "o": ##setcfg("profile.update", 1) ##continue ##if o[0] == "u": ##setcfg("calibration.update", 1) ##continue if o[0] == "q": setcfg("calibration.quality", o[1]) continue if o[0] == "y" and getcfg("measurement_mode") != "auto": setcfg("measurement_mode", o[1]) continue if o[0] in ("t", "T"): setcfg("whitepoint.colortemp.locus", o[0]) if o[1:]: setcfg("whitepoint.colortemp", int(float(o[1:]))) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) continue if o[0] == "w": o = o[1:].split(",") setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", o[0]) setcfg("whitepoint.y", o[1]) continue if o[0] == "b": setcfg("calibration.luminance", o[1:]) continue if o[0] in ("g", "G"): setcfg("trc.type", o[0]) setcfg("trc", o[1:]) continue if o[0] == "f": setcfg("calibration.black_output_offset", o[1:]) continue if o[0] == "a": setcfg("calibration.ambient_viewcond_adjust", 1) setcfg("calibration.ambient_viewcond_adjust.lux", o[1:]) continue if o[0] == "k": if stripzeros(o[1:]) >= 0: black_point_correction = True setcfg("calibration.black_point_correction", o[1:]) continue if o[0] == "A": setcfg("calibration.black_point_rate", o[1:]) continue if o[0] == "B": setcfg("calibration.black_luminance", o[1:]) continue if o[0] in ("p", "P") and len(o[1:]) >= 5: setcfg("dimensions.measureframe", o[1:]) setcfg("dimensions.measureframe.unzoomed", o[1:]) continue if o[0] == "V": setcfg("measurement_mode.adaptive", 1) continue if o[0:2] == "YA": setcfg("measurement_mode.adaptive", 0) continue if o[0] == "H": setcfg("measurement_mode.highres", 1) continue if o[0] == "p" and len(o[1:]) == 0: setcfg("measurement_mode.projector", 1) continue if o[0] == "F": setcfg("measure.darken_background", 1) continue if o[0] == "X": o = o.split(None, 1) ccmx = o[-1][1:-1] if not os.path.isabs(ccmx): ccmx = os.path.join(os.path.dirname(path), ccmx) # Need to update ccmx items again even if # comport_ctrl_handler already did update_ccmx_items = True continue if o[0] == "I": if "b" in o[1:]: setcfg("drift_compensation.blacklevel", 1) if "w" in o[1:]: setcfg("drift_compensation.whitelevel", 1) continue if o[0] == "Q": setcfg("observer", o[1:]) # Need to update ccmx items again even if # comport_ctrl_handler already did because CCMX # observer may override calibration observer update_ccmx_items = True continue if o[0] == "E": setcfg("patterngenerator.use_video_levels", 1) continue if trc and not black_point_correction: setcfg("calibration.black_point_correction.auto", 1) if not ccmx: ccxx = (glob.glob(os.path.join(os.path.dirname(path), "*.ccmx")) or glob.glob(os.path.join(os.path.dirname(path), "*.ccss"))) if ccxx and len(ccxx) == 1: ccmx = ccxx[0] update_ccmx_items = True if ccmx: setcfg("colorimeter_correction_matrix_file", "%s:%s" % (ccxxsetting, ccmx)) if options_colprof: # restore defaults self.restore_defaults_handler( include=("profile", "gamap_", "3dlut.create", "3dlut.output.profile.apply_cal", "3dlut.trc", "testchart.auto_optimize", "testchart.patch_sequence"), exclude=("3dlut.tab.enable.backup", "profile.update", "profile.name", "gamap_default_intent")) for o in options_colprof: if o[0] == "q": setcfg("profile.quality", o[1]) continue if o[0] == "b": setcfg("profile.quality.b2a", o[1] or "l") continue if o[0] == "a": if (is_preset and not is_3dlut_preset and sys.platform == "darwin"): # Force profile type to single shaper + matrix # due to OS X bugs with cLUT profiles and # matrix profiles with individual shaper curves o = "aS" # Force black point compensation due to OS X # bugs with non BPC profiles setcfg("profile.black_point_compensation", 1) setcfg("profile.type", o[1]) continue if o[0] in ("s", "S"): o = o.split(None, 1) setcfg("gamap_profile", o[-1][1:-1]) setcfg("gamap_perceptual", 1) if o[0] == "S": setcfg("gamap_saturation", 1) continue if o[0] == "c": setcfg("gamap_src_viewcond", o[1:]) continue if o[0] == "d": setcfg("gamap_out_viewcond", o[1:]) continue if o[0] == "t": setcfg("gamap_perceptual_intent", o[1:]) continue if o[0] == "T": setcfg("gamap_saturation_intent", o[1:]) continue setcfg("calibration.file", path) if "CTI3" in ti3_lines: if debug: safe_print("[D] load_cal_handler testchart.file:", path) setcfg("testchart.file", path) if 'USE_BLACK_POINT_COMPENSATION "YES"' in ti3_lines: setcfg("profile.black_point_compensation", 1) elif ('USE_BLACK_POINT_COMPENSATION "NO"' in ti3_lines and (sys.platform != "darwin" or is_3dlut_preset)): # Only disable BPC if not OS X, or if a 3D LUT preset setcfg("profile.black_point_compensation", 0) if 'HIRES_B2A "YES"' in ti3_lines: setcfg("profile.b2a.hires", 1) elif 'HIRES_B2A "NO"' in ti3_lines: setcfg("profile.b2a.hires", 0) if 'SMOOTH_B2A "YES"' in ti3_lines: if not 'HIRES_B2A "NO"' in ti3_lines: setcfg("profile.b2a.hires", 1) setcfg("profile.b2a.hires.smooth", 1) elif 'SMOOTH_B2A "NO"' in ti3_lines: if not 'HIRES_B2A "YES"' in ti3_lines: setcfg("profile.b2a.hires", 0) setcfg("profile.b2a.hires.smooth", 0) if 'BEGIN_DATA_FORMAT' in ti3_lines: cfgend = ti3_lines.index('BEGIN_DATA_FORMAT') cfgpart = CGATS.CGATS("\n".join(ti3_lines[:cfgend])) lut3d_trc_set = False simset = False # Only HDR 3D LUTs will have this set for keyword, cfgname in {"SMOOTH_B2A_SIZE": "profile.b2a.hires.size", "HIRES_B2A_SIZE": "profile.b2a.hires.size", # NOTE that profile black point # correction is not the same # as calibration black point # correction! # See Worker.create_profile in # worker.py "BLACK_POINT_CORRECTION": "profile.black_point_correction", "MIN_DISPLAY_UPDATE_DELAY_MS": "measure.min_display_update_delay_ms", "DISPLAY_SETTLE_TIME_MULT": "measure.display_settle_time_mult", "AUTO_OPTIMIZE": "testchart.auto_optimize", "PATCH_SEQUENCE": "testchart.patch_sequence", "3DLUT_SOURCE_PROFILE": "3dlut.input.profile", "3DLUT_TRC": "3dlut.trc", "3DLUT_HDR_PEAK_LUMINANCE": "3dlut.hdr_peak_luminance", "3DLUT_HDR_DISPLAY": "3dlut.hdr_display", "3DLUT_HDR_MAXCLL": # MaxCLL is no longer used, map to mastering display max light level (MaxMLL) "3dlut.hdr_maxmll", "3DLUT_HDR_MAXMLL": "3dlut.hdr_maxmll", "3DLUT_HDR_MINMLL": "3dlut.hdr_minmll", "3DLUT_HDR_AMBIENT_LUMINANCE": "3dlut.hdr_ambient_luminance", "3DLUT_GAMMA": "3dlut.trc_gamma", "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET": "3dlut.trc_output_offset", "3DLUT_INPUT_ENCODING": "3dlut.encoding.input", "3DLUT_OUTPUT_ENCODING": "3dlut.encoding.output", "3DLUT_GAMUT_MAPPING_MODE": "3dlut.gamap.use_b2a", "3DLUT_RENDERING_INTENT": "3dlut.rendering_intent", "3DLUT_FORMAT": "3dlut.format", "3DLUT_SIZE": "3dlut.size", "3DLUT_INPUT_BITDEPTH": "3dlut.bitdepth.input", "3DLUT_OUTPUT_BITDEPTH": "3dlut.bitdepth.output", "3DLUT_APPLY_CAL": "3dlut.output.profile.apply_cal", "SIMULATION_PROFILE": "measurement_report.simulation_profile"}.iteritems(): cfgvalue = cfgpart.queryv1(keyword) if keyword in ("MIN_DISPLAY_UPDATE_DELAY_MS", "DISPLAY_SETTLE_TIME_MULT"): backup = getcfg("measure.override_%s.backup" % keyword.lower(), False) if (cfgvalue is not None and display_match and (instrument_match or not instrument_id)): # Only set display update delay if a matching # display/instrument stored in profile meta # tag or no instrument ID (i.e. a preset) if backup is None: setcfg("measure.override_%s.backup" % keyword.lower(), getcfg("measure.override_" + keyword.lower())) setcfg("measure.%s.backup" % keyword.lower(), getcfg("measure." + keyword.lower())) setcfg("measure.override_" + keyword.lower(), 1) elif backup is not None: setcfg("measure.override_" + keyword.lower(), backup) cfgvalue = getcfg("measure.%s.backup" % keyword.lower()) setcfg("measure.override_%s.backup" % keyword.lower(), None) setcfg("measure.%s.backup" % keyword.lower(), None) elif cfgvalue is not None: if keyword == "AUTO_OPTIMIZE" and cfgvalue: setcfg("testchart.file", "auto") if (is_preset and not is_3dlut_preset and sys.platform == "darwin"): # Profile type forced to matrix due to # OS X bugs with cLUT profiles. Set # smallest testchart. cfgvalue = 1 elif keyword == "PATCH_SEQUENCE": cfgvalue = cfgvalue.lower().replace("_rgb_", "_RGB_") elif keyword == "3DLUT_GAMMA": try: cfgvalue = float(cfgvalue) except: pass else: if cfgvalue < 0: gamma_type = "B" cfgvalue = abs(cfgvalue) else: gamma_type = "b" setcfg("3dlut.trc_gamma_type", gamma_type) # Sync measurement report settings setcfg("measurement_report.trc_gamma_type", gamma_type) setcfg("measurement_report.apply_black_offset", 0) setcfg("measurement_report.apply_trc", 1) elif keyword == "3DLUT_GAMUT_MAPPING_MODE": if cfgvalue == "G": cfgvalue = 0 else: cfgvalue = 1 if keyword.startswith("3DLUT"): setcfg("3dlut.create", 1) setcfg("3dlut.tab.enable", 1) setcfg("3dlut.tab.enable.backup", 1) if cfgvalue is not None: cfgvalue = safe_unicode(cfgvalue, "UTF-7") if (cfgname.endswith("profile") and (not os.path.isabs(cfgvalue) or not os.path.isfile(cfgvalue))): if os.path.basename(os.path.dirname(cfgvalue)) == "ref": # Fall back to ref file if not absolute # path or not found cfgvalue = (get_data_path("ref/" + os.path.basename(cfgvalue)) or cfgvalue) elif not os.path.dirname(cfgvalue): # Use profile dir cfgvalue = os.path.join(os.path.dirname(path), cfgvalue) setcfg(cfgname, cfgvalue) if keyword == "SIMULATION_PROFILE": # Only HDR 3D LUTs will have this set simset = True # Sync measurement report settings if cfgname == "3dlut.input.profile": if not simset: setcfg("measurement_report.simulation_profile", cfgvalue) setcfg("measurement_report.use_simulation_profile", 1) setcfg("measurement_report.use_simulation_profile_as_output", 1) elif cfgname in ("3dlut.trc_gamma", "3dlut.trc_output_offset"): cfgname = cfgname.replace("3dlut", "measurement_report") setcfg(cfgname, cfgvalue) elif cfgname == "3dlut.format": if cfgvalue == "madVR" and not simset: setcfg("3dlut.enable", 1) if (cfgvalue == "madVR" and not simset) or cfgvalue == "eeColor": setcfg("measurement_report.use_devlink_profile", 0) elif cfgname == "3dlut.trc": lut3d_trc_set = True # Content color space (currently only used for HDR) for color in ("white", "red", "green", "blue"): for coord in "xy": keyword = ("3DLUT_CONTENT_COLORSPACE_%s_%s" % (color.upper(), coord.upper())) cfgvalue = cfgpart.queryv1(keyword) if cfgvalue is None: continue cfgvalue = safe_unicode(cfgvalue, "UTF-7") try: cfgvalue = round(float(cfgvalue), 4) except ValueError: pass setcfg("3dlut.content.colorspace.%s.%s" % (color, coord), cfgvalue) # Make sure 3D LUT TRC enumeration matches parameters for # older profiles not containing 3DLUT_TRC if not lut3d_trc_set: if (getcfg("3dlut.trc_gamma_type") == "B" and getcfg("3dlut.trc_output_offset") == 0 and getcfg("3dlut.trc_gamma") == 2.4): setcfg("3dlut.trc", "bt1886") # BT.1886 elif (getcfg("3dlut.trc_gamma_type") == "b" and getcfg("3dlut.trc_output_offset") == 1 and getcfg("3dlut.trc_gamma") == 2.2): setcfg("3dlut.trc", "gamma2.2") # Pure power gamma 2.2 else: setcfg("3dlut.trc", "customgamma") # Custom if not display_changed: self.update_menus() if not update_ccmx_items: self.update_estimated_measurement_time("cal") self.lut3d_set_path() if config.get_display_name() == "Resolve": setcfg("3dlut.enable", 0) setcfg("measurement_report.use_devlink_profile", 1) elif config.get_display_name(None, True) == "Prisma": setcfg("3dlut.enable", 1) setcfg("measurement_report.use_devlink_profile", 0) if getcfg("3dlut.format") == "madVR" and simset: # Currently not possible to verify HDR 3D LUTs # through madVR in another way setcfg("3dlut.enable", 0) setcfg("measurement_report.use_devlink_profile", 1) self.update_controls( update_profile_name=update_profile_name, update_ccmx_items=update_ccmx_items) if set_size: self.set_size(True) writecfg() if ext.lower() in (".icc", ".icm"): if load_vcgt: # load calibration into lut self.load_cal(silent=True) if options_dispcal and options_colprof: return elif options_dispcal: msg = lang.getstr("settings_loaded.cal_and_lut") else: msg = lang.getstr("settings_loaded.profile_and_lut") elif options_dispcal and options_colprof: msg = lang.getstr("settings_loaded.cal_and_profile") elif options_dispcal: if not load_vcgt: msg = lang.getstr("settings_loaded.cal") else: # load calibration into lut self.load_cal(silent=True) msg = lang.getstr("settings_loaded.cal_and_lut") else: msg = lang.getstr("settings_loaded.profile") #if not silent: #InfoDialog(self, msg=msg + "\n" + path, ok=lang.getstr("ok"), #bitmap=geticon(32, "dialog-information")) return elif ext.lower() in (".icc", ".icm"): sel = self.calibration_file_ctrl.GetSelection() if len(self.recent_cals) > sel and self.recent_cals[sel] == path: self.recent_cals.remove(self.recent_cals[sel]) self.calibration_file_ctrl.Delete(sel) cal = getcfg("calibration.file", False) or "" if not cal in self.recent_cals: self.recent_cals.append(cal) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.calibration_file_ctrl.SetSelection(idx) if not silent: InfoDialog(self, msg=lang.getstr("no_settings") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return # Old .cal file without ARGYLL_DISPCAL_ARGS section setcfg("last_cal_path", path) # Restore defaults self.restore_defaults_handler( include=("calibration", "profile.update", "measure.override_min_display_update_delay_ms", "measure.min_display_update_delay_ms", "measure.override_display_settle_time_mult", "measure.display_settle_time_mult", "trc", "whitepoint"), exclude=("calibration.black_point_correction_choice.show", "calibration.update", "trc.should_use_viewcond_adjust.show_msg")) self.worker.options_dispcal = [] settings = [] for line in ti3_lines: line = line.strip().split(" ", 1) if len(line) > 1: value = line[1][1:-1] # strip quotes if line[0] == "DEVICE_CLASS": if value != "DISPLAY": InfoDialog(self, msg=lang.getstr( "calibration.file.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return elif line[0] == "DEVICE_TYPE": measurement_mode = value.lower()[0] if measurement_mode in ("c", "l"): setcfg("measurement_mode", measurement_mode) self.worker.options_dispcal.append("-y" + measurement_mode) elif line[0] == "NATIVE_TARGET_WHITE": setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", None) setcfg("whitepoint.y", None) settings.append(lang.getstr("whitepoint")) elif line[0] == "TARGET_WHITE_XYZ": XYZ = value.split() i = 0 try: for component in XYZ: # Normalize to 0.0 - 1.0 XYZ[i] = float(component) / 100 i += 1 except ValueError, exception: continue x, y, Y = XYZ2xyY(XYZ[0], XYZ[1], XYZ[2]) k = XYZ2CCT(XYZ[0], XYZ[1], XYZ[2]) if not lang.getstr("whitepoint") in settings: setcfg("whitepoint.colortemp", None) setcfg("whitepoint.x", round(x, 4)) setcfg("whitepoint.y", round(y, 4)) self.worker.options_dispcal.append( "-w%s,%s" % (getcfg("whitepoint.x"), getcfg("whitepoint.y"))) settings.append(lang.getstr("whitepoint")) setcfg("calibration.luminance", stripzeros(round(Y * 100, 3))) self.worker.options_dispcal.append( "-b%s" % getcfg("calibration.luminance")) settings.append(lang.getstr("calibration.luminance")) elif line[0] == "TARGET_GAMMA": setcfg("trc", None) if value in ("L_STAR", "REC709", "SMPTE240M", "sRGB"): setcfg("trc.type", "g") if value == "L_STAR": setcfg("trc", "l") elif value == "REC709": setcfg("trc", "709") elif value == "SMPTE240M": setcfg("trc", "240") elif value == "sRGB": setcfg("trc", "s") else: try: value = stripzeros(value) if float(value) < 0: setcfg("trc.type", "G") value = abs(value) else: setcfg("trc.type", "g") setcfg("trc", value) except ValueError: continue self.worker.options_dispcal.append( "-" + getcfg("trc.type") + str(getcfg("trc"))) settings.append(lang.getstr("trc")) elif line[0] == "DEGREE_OF_BLACK_OUTPUT_OFFSET": setcfg("calibration.black_output_offset", stripzeros(value)) self.worker.options_dispcal.append( "-f%s" % getcfg("calibration.black_output_offset")) settings.append( lang.getstr("calibration.black_output_offset")) elif line[0] == "BLACK_POINT_CORRECTION": if stripzeros(value) >= 0: black_point_correction = True setcfg("calibration.black_point_correction", stripzeros(value)) self.worker.options_dispcal.append( "-k%s" % getcfg("calibration.black_point_correction")) settings.append( lang.getstr("calibration.black_point_correction")) elif line[0] == "TARGET_BLACK_BRIGHTNESS": setcfg("calibration.black_luminance", stripzeros(value)) self.worker.options_dispcal.append( "-B%s" % getcfg("calibration.black_luminance")) settings.append(lang.getstr("calibration.black_luminance")) elif line[0] == "QUALITY": setcfg("calibration.quality", value.lower()[0]) self.worker.options_dispcal.append( "-q" + getcfg("calibration.quality")) settings.append(lang.getstr("calibration.quality")) if not black_point_correction: setcfg("calibration.black_point_correction.auto", 1) setcfg("calibration.file", path) self.update_controls(update_profile_name=update_profile_name) if "CTI3" in ti3_lines: if debug: safe_print("[D] load_cal_handler testchart.file:", path) setcfg("testchart.file", path) writecfg() if load_vcgt: # load calibration into lut self.load_cal(silent=True) if len(settings) == 0: msg = lang.getstr("no_settings") else: msg = lang.getstr("settings_loaded", ", ".join(settings)) if not silent and len(settings) == 0: InfoDialog(self, msg=msg + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information")) if (load_vcgt and getattr(self, "lut_viewer", None) and sys.platform == "win32"): # Needed under Windows when using double buffering self.lut_viewer.Refresh() def delete_calibration_handler(self, event): cal = getcfg("calibration.file", False) if cal and os.path.exists(cal): caldir = os.path.dirname(cal) try: dircontents = os.listdir(caldir) except Exception, exception: InfoDialog(self, msg=safe_unicode(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return self.related_files = OrderedDict() for entry in dircontents: fn, ext = os.path.splitext(entry) if ext.lower() in (".app", script_ext): fn, ext = os.path.splitext(fn) if (fn.startswith(os.path.splitext(os.path.basename(cal))[0]) or ext.lower() in (".ccss", ".ccmx") or entry.lower() in ("0_16.ti1", "0_16.ti3", "0_16.log")): self.related_files[entry] = True self.dlg = dlg = ConfirmDialog( self, msg=lang.getstr("dialog.confirm_delete"), ok=lang.getstr("delete"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) if self.related_files: scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 scrolled = ScrolledPanel(dlg, -1, style=wx.VSCROLL) sizer = scrolled.Sizer = wx.BoxSizer(wx.VERTICAL) dlg.sizer3.Add(scrolled, flag=wx.TOP | wx.EXPAND, border=12) for i, related_file in enumerate(self.related_files): if i: sizer.Add((0, 4)) chk = wx.CheckBox(scrolled, -1, related_file) chk.SetValue(self.related_files[related_file]) dlg.Bind(wx.EVT_CHECKBOX, self.delete_calibration_related_handler, id=chk.GetId()) sizer.Add(chk, flag=wx.ALIGN_LEFT) scrolled.SetupScrolling() scrolled.MinSize = (min(scrolled.GetVirtualSize()[0] + 4 * scale + wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), self.GetDisplay().ClientArea[2] - (12 * 3 + 32) * scale), min(((chk.Size[1] + 4) * min(len(self.related_files), 20) - 4) * scale, max(self.GetDisplay().ClientArea[3] - dlg.Size[1] - 40 * scale, chk.Size[1]))) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center() result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: delete_related_files = [] if self.related_files: for related_file in self.related_files: if self.related_files[related_file]: delete_related_files.append( os.path.join(os.path.dirname(cal), related_file)) if sys.platform == "darwin": trashcan = lang.getstr("trashcan.mac") elif sys.platform == "win32": trashcan = lang.getstr("trashcan.windows") else: trashcan = lang.getstr("trashcan.linux") orphan_related_files = delete_related_files try: if (sys.platform == "darwin" and len(delete_related_files) + 1 == len(dircontents) and ".DS_Store" in dircontents) or \ len(delete_related_files) == len(dircontents): # Delete whole folder deleted = trash([os.path.dirname(cal)]) else: deleted = trash(delete_related_files) orphan_related_files = filter(lambda related_file: os.path.exists(related_file), delete_related_files) if orphan_related_files: InfoDialog(self, msg=lang.getstr("error.deletion", trashcan) + "\n\n" + "\n".join(os.path.basename(related_file) for related_file in orphan_related_files), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) except TrashAborted, exception: if exception.args[0] == -1: # Whole operation was aborted return except TrashcanUnavailableError, exception: InfoDialog(self, msg=lang.getstr("error.trashcan_unavailable", trashcan), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) except Exception, exception: InfoDialog(self, msg=lang.getstr("error.deletion", trashcan) + "\n\n" + safe_unicode(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) # The case-sensitive index could fail because of # case insensitive file systems, e.g. if the # stored filename string is # "C:\Users\Name\AppData\DisplayCAL\storage\MyFile" # but the actual filename is # "C:\Users\Name\AppData\DisplayCAL\storage\myfile" # (maybe because the user renamed the file) idx = index_fallback_ignorecase(self.recent_cals, cal) self.recent_cals.remove(cal) self.calibration_file_ctrl.Delete(idx) setcfg("calibration.file", None) setcfg("settings.changed", 1) recent_cals = [] for recent_cal in self.recent_cals: if recent_cal not in self.presets: recent_cals.append(recent_cal) setcfg("recent_cals", os.pathsep.join(recent_cals)) update_colorimeter_correction_matrix_ctrl_items = False update_testcharts = False for path in delete_related_files: if path not in orphan_related_files: if (os.path.splitext(path)[1].lower() in (".ccss", ".ccmx")): self.delete_colorimeter_correction_matrix_ctrl_item(path) update_colorimeter_correction_matrix_ctrl_items = True elif path in self.testcharts: update_testcharts = True if update_testcharts: self.set_testcharts() self.update_controls(False, update_colorimeter_correction_matrix_ctrl_items) self.load_display_profile_cal() def delete_calibration_related_handler(self, event): chk = self.dlg.FindWindowById(event.GetId()) self.related_files[chk.GetLabel()]=chk.GetValue() def aboutdialog_handler(self, event): if hasattr(self, "aboutdialog"): self.aboutdialog.Destroy() self.aboutdialog = AboutDialog(self, -1, lang.getstr("menu.about"), size=(100, 100)) self.aboutdialog.BackgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW) items = [] scale = max(getcfg("app.dpi") / config.get_default_dpi(), 1) items.append(wx_Panel(self.aboutdialog, -1, size=(-1, int(round(6 * scale))))) items[-1].BackgroundColour = "#66CC00" items.append(get_header(self.aboutdialog, getbitmap("theme/header", False), label=wrap(lang.getstr("header"), 32), size=(320, 120), repeat_sub_bitmap_h=(220, 0, 2, 184))) bmp = getbitmap("theme/gradient", False) if bmp.Size[0] >= 8 and bmp.Size[1] >= 96: separator = BitmapBackgroundPanel(self.aboutdialog, size=(-1, 1)) separator.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW)) items.append(separator) shadow = BitmapBackgroundPanel(self.aboutdialog, size=(-1, 15)) bmp = bmp.GetSubBitmap((0, 1, 8, 15)).ConvertToImage().Mirror(False).ConvertToBitmap() image = bmp.ConvertToImage() databuffer = image.GetDataBuffer() for i, byte in enumerate(databuffer): if byte > "\0": databuffer[i] = chr(int(min(round(ord(byte) * (255.0 / 223.0)), 255))) bmp = image.ConvertToBitmap() shadow.BackgroundColour = self.aboutdialog.BackgroundColour shadow.SetBitmap(bmp) shadow.blend = True items.append(shadow) items.append((1, 8)) version_title = version_short if VERSION > VERSION_BASE: version_title += " Beta" items.append([HyperLinkCtrl(self.aboutdialog, -1, label=appname, URL="https://%s/" % domain), wx.StaticText(self.aboutdialog, -1, u" %s © %s" % (version_title, author))]) items.append(wx.StaticText(self.aboutdialog, -1, "")) items.append([HyperLinkCtrl(self.aboutdialog, -1, label="ArgyllCMS", URL="https://www.argyllcms.com/"), wx.StaticText(self.aboutdialog, -1, u" %s © Graeme Gill" % re.sub(r"(?:\.0)+$", ".0", self.worker.argyll_version_string))]) items.append(wx.StaticText(self.aboutdialog, -1, "")) items.append(wx.StaticText(self.aboutdialog, -1, u"%s:" % lang.getstr("translations"))) lauthors = {} for lcode in lang.ldict: lauthor = lang.ldict[lcode].get("!author", "") language = lang.ldict[lcode].get("!language", "") if lauthor and language: if not lauthors.get(lauthor): lauthors[lauthor] = [] lauthors[lauthor].append(language) lauthors = [(lauthors[lauthor], lauthor) for lauthor in lauthors] lauthors.sort() for langs, lauthor in lauthors: items.append(wx.StaticText(self.aboutdialog, -1, "%s - %s" % (", ".join(langs), lauthor))) items.append(wx.StaticText(self.aboutdialog, -1, "")) # Apricity OS icons items.append([HyperLinkCtrl(self.aboutdialog, -1, label="Apricity Icons", URL="https://github.com/Apricity-OS/apricity-icons"), wx.StaticText(self.aboutdialog, -1, u" © Apricity OS Team")]) # Suru icons items.append([HyperLinkCtrl(self.aboutdialog, -1, label="Suru Icons", URL="https://github.com/snwh/suru-icon-theme"), wx.StaticText(self.aboutdialog, -1, u" © Sam Hewitt")]) # Gnome icons items.append([wx.StaticText(self.aboutdialog, -1, u"Some icons © "), HyperLinkCtrl(self.aboutdialog, -1, label="GNOME Project", URL="https://www.gnome.org/")]) items.append(wx.StaticText(self.aboutdialog, -1, "")) match = re.match("([^(]+)\s*(\([^(]+\))?\s*(\[[^[]+\])?", sys.version) if match: pyver_long = match.groups() else: pyver_long = [sys.version] items.append([HyperLinkCtrl(self.aboutdialog, -1, label="Python", URL="https://www.python.org/"), wx.StaticText(self.aboutdialog, -1, " " + pyver_long[0].strip())]) items.append([HyperLinkCtrl(self.aboutdialog, -1, label="wxPython", URL="https://www.wxpython.org/"), wx.StaticText(self.aboutdialog, -1, " " + wx.version())]) items.append(wx.StaticText(self.aboutdialog, -1, lang.getstr("audio.lib", "%s %s" % (audio._lib, audio._lib_version)))) items.append(wx.StaticText(self.aboutdialog, -1, "")) self.aboutdialog.add_items(items) self.aboutdialog.Layout() self.aboutdialog.Center() self.aboutdialog.Show() def readme_handler(self, event): if lang.getcode() == "fr": readme = get_data_path("README-fr.html") else: readme = None if not readme: readme = get_data_path("README.html") if readme: launch_file(readme) def license_handler(self, event): license = get_data_path("LICENSE.txt") if not license: # Debian license = "/usr/share/common-licenses/GPL-3" if license and os.path.isfile(license): launch_file(license) def help_support_handler(self, event): launch_file("https://%s/#help" % domain) def bug_report_handler(self, event): launch_file("https://%s/#reportbug" % domain) def app_update_check_handler(self, event, silent=False, argyll=False): if not hasattr(self, "app_update_check") or \ not self.app_update_check.isAlive(): self.app_update_check = threading.Thread(target=app_update_check, args=(self, silent, False, argyll)) self.app_update_check.start() def app_auto_update_check_handler(self, event): setcfg("update_check", int(self.menuitem_app_auto_update_check.IsChecked())) def infoframe_toggle_handler(self, event=None, show=None): if show is None: show = not self.infoframe.IsShownOnScreen() setcfg("log.show", int(show)) if show: self.log() else: logbuffer.truncate(0) self.infoframe.Show(show) self.menuitem_show_log.Check(show) self.menuitem_log_autoshow.Enable(not show) def infoframe_autoshow_handler(self, event): setcfg("log.autoshow", int(self.menuitem_log_autoshow.IsChecked())) def HideAll(self): self.stop_timers() if hasattr(self, "gamapframe"): self.gamapframe.Hide() if hasattr(self, "aboutdialog"): self.aboutdialog.Hide() if hasattr(self, "extra_args"): self.extra_args.Hide() logbuffer.truncate(0) self.infoframe.Hide() if hasattr(self, "tcframe"): self.tcframe.Hide() if getattr(self, "lut_viewer", None) and \ self.lut_viewer.IsShownOnScreen(): self.lut_viewer.Hide() if getattr(self, "lut3dframe", None): self.lut3dframe.Hide() if getattr(self, "reportframe", None): self.reportframe.Hide() if getattr(self, "synthiccframe", None): self.synthiccframe.Hide() if getattr(self, "wpeditor", None): self.wpeditor.Close() for profile_info in self.profile_info.values(): profile_info.Close() while self.measureframes: measureframe = self.measureframes.pop() if measureframe: measureframe.Close() self.Hide() self.enable_menus(False) def Show(self, show=True, start_timers=True): if not self.IsShownOnScreen(): if hasattr(self, "tcframe"): self.tcframe.Show(getcfg("tc.show")) if getcfg("log.show"): wx.CallAfter(self.infoframe_toggle_handler, show=True) if (LUTFrame and getcfg("lut_viewer.show") and self.worker.argyll_version > [0, 0, 0]): if getattr(self, "lut_viewer", None): self.init_lut_viewer(show=True) else: # Using wx.CallAfter fixes wrong positioning under wxGTK # with wxPython 3 on first initialization wx.CallAfter(self.init_lut_viewer, show=True) else: setcfg("lut_viewer.show", 0) for profile_info in reversed(self.profile_info.values()): profile_info.Show() if start_timers: self.start_timers() self.enable_menus() wx.Frame.Show(self, show) if self.worker.progress_wnd and self.worker.progress_wnd.IsShown(): self.Lower() self.worker.progress_wnd.Raise() def OnClose(self, event=None): if (getattr(self.worker, "thread", None) and self.worker.thread.isAlive()): if isinstance(event, wx.CloseEvent) and event.CanVeto(): event.Veto() self.worker.abort_subprocess(True) return if sys.platform == "darwin" or debug: self.focus_handler(event) if not hasattr(self, "tcframe") or self.tcframe.tc_close_handler(): # If resources are missing, XRC shows an error dialog. # If the user never closees that dialog before he quits the # application, this dialog will hinder exiting the main loop. win = self.get_top_window() if isinstance(win, wx.Dialog) and win.IsModal(): win.RequestUserAttention() win.Raise() if isinstance(event, wx.CloseEvent) and event.CanVeto(): event.Veto() return for win in wx.GetTopLevelWindows(): if win and not win.IsBeingDeleted(): if isinstance(win, VisualWhitepointEditor): win.Close(force=True) writecfg() if getattr(self, "thread", None) and self.thread.isAlive(): self.Disable() if debug: safe_print("Waiting for child thread to exit...") self.thread.join() self.listening = False if isinstance(getattr(self.worker, "madtpg", None), madvr.MadTPG_Net): self.worker.madtpg.shutdown() for patterngenerator in self.worker.patterngenerators.values(): patterngenerator.listening = False self.HideAll() if (self.worker.tempdir and os.path.isdir(self.worker.tempdir) and not os.listdir(self.worker.tempdir)): self.worker.wrapup(False) wx.GetApp().ExitMainLoop() elif isinstance(event, wx.CloseEvent) and event.CanVeto(): event.Veto() class StartupFrame(wx.Frame): def __init__(self): title = "%s %s" % (appname, version_short) if VERSION > VERSION_BASE: title += " Beta" wx.Frame.__init__(self, None, title="%s: %s" % (title, lang.getstr("startup")), style=wx.FRAME_SHAPED | wx.NO_BORDER) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) if wx.VERSION >= (2, 8, 12, 1): # Setup shape. Required to get rid of window shadow under Ubuntu. # Note that shaped windows seem to be broken (won't show at all) # with wxGTK 2.8.12.0 and possibly earlier. self.mask_bmp = getbitmap("theme/splash-mask") if wx.Platform == "__WXGTK__": # wxGTK requires that the window be created before you can # set its shape, so delay the call to SetWindowShape until # this event. self.Bind(wx.EVT_WINDOW_CREATE, self.SetWindowShape) else: # On wxMSW and wxMac the window has already been created. self.SetWindowShape() # Setup splash screen self.splash_bmp = getbitmap("theme/splash") self.splash_anim = [] for pth in get_data_path("theme/splash_anim", r"\.png$") or []: self.splash_anim.append(getbitmap(os.path.splitext(pth)[0])) self.zoom_scales = [] if getcfg("splash.zoom"): # Zoom in instead of fade numframes = 15 self.splash_alpha = self.splash_bmp.ConvertToImage().GetAlphaData() minv = 1.0 / self.splash_bmp.Size[0] for x in xrange(numframes): scale = minv + colormath.specialpow(0.35 + x / (numframes - 1.0) * (1 - 0.35), -2084) * (1 - minv) self.zoom_scales.append(scale) self.zoom_scales.append(1.02) self.zoom_scales.append(1.0) # Fade in major version number self.splash_version_anim = [] splash_version = getbitmap("theme/splash_version") if splash_version: im = splash_version.ConvertToImage() for alpha in [0, .2, .4, .6, .8, 1, .95, .9, .85, .8, .75]: imcopy = im.AdjustChannels(1, 1, 1, alpha) self.splash_version_anim.append(imcopy.ConvertToBitmap()) self.frame = 0 clientarea = self.GetDisplay().ClientArea self.splash_x, self.splash_y = (clientarea[0] + int(clientarea[2] / 2.0 - self.splash_bmp.Size[0] / 2.0), clientarea[1] + int(clientarea[3] / 2.0 - self.splash_bmp.Size[1] / 2.0)) self.Pulse("\n".join([lang.getstr("welcome_back" if hascfg("recent_cals") else "welcome"), lang.getstr("startup")])) self._bufferbitmap = wx.EmptyBitmap(self.splash_bmp.Size[0], self.splash_bmp.Size[1]) self._buffereddc = wx.MemoryDC(self._bufferbitmap) self.worker = Worker() # Grab a bitmap of the screen area we're going to draw on if sys.platform != "darwin": dc = wx.ScreenDC() # Grabbing from ScreenDC is not supported under Mac OS X self._buffereddc.Blit(0, 0, self.splash_bmp.Size[0], self.splash_bmp.Size[1], dc, self.splash_x, self.splash_y) elif not isinstance(self.worker.create_tempdir(), Exception): # Use screencapture utility under Mac OS X splashdimensions = (self.splash_x, self.splash_y, self.splash_bmp.Size[0], self.splash_bmp.Size[1]) is_mavericks = intlist(mac_ver()[0].split(".")) >= [10, 9] if is_mavericks: # Under 10.9 we can specify screen region as arguments extra_args = ["-R%i,%i,%i,%i" % splashdimensions] else: extra_args = [] bmp_path = os.path.join(self.worker.tempdir, "screencap.png") if self.worker.exec_cmd(which("screencapture"), extra_args + ["-x", "screencap.png"], capture_output=True, skip_scripts=True, silent=True) and os.path.isfile(bmp_path): bmp = wx.Bitmap(bmp_path) if bmp.IsOk(): if (not is_mavericks and bmp.Size[0] >= self.splash_x + self.splash_bmp.Size[0] and bmp.Size[1] >= self.splash_y + self.splash_bmp.Size[1]): # Pre 10.9 we have to get the splashscreen region # from the full screenshot bitmap bmp = bmp.GetSubBitmap(splashdimensions) elif (is_mavericks and bmp.Size[0] == self.splash_bmp.Size[0] * 2 and bmp.Size[1] == self.splash_bmp.Size[1] * 2): # Retina, screencapture is double our bitmap size if wx.VERSION > (3, ): quality = wx.IMAGE_QUALITY_BILINEAR else: quality = wx.IMAGE_QUALITY_HIGH img = bmp.ConvertToImage() img.Rescale(self.splash_bmp.Size[0], self.splash_bmp.Size[1], quality) bmp = img.ConvertToBitmap() self._buffereddc.DrawBitmap(bmp, 0, 0) self.worker.wrapup(False) self.SetClientSize(self.splash_bmp.Size) self.SetPosition((self.splash_x, self.splash_y)) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.Bind(wx.EVT_PAINT, self.OnPaint) if len(self.zoom_scales): self._alpha = 255 else: self.SetTransparent(0) self._alpha = 0 audio.safe_init() if audio._lib: safe_print(lang.getstr("audio.lib", "%s %s" % (audio._lib, audio._lib_version))) # Startup sound # Needs to be stereo! if getcfg("startup_sound.enable"): self.startup_sound = audio.Sound(get_data_path("theme/intro_new.wav")) self.startup_sound.volume = .8 self.startup_sound.safe_play() self.Show() # We need to use CallLater instead of CallAfter otherwise dialogs # will not show while the main frame is not yet initialized wx.CallLater(1, self.startup) def startup(self): if sys.platform not in ("darwin", "win32"): # Drawing of window shadow can be prevented under some desktop # environments that would normally try to draw a shadow by never # making the window fully opaque endalpha = 254 else: endalpha = 255 if self.IsShown() and self._alpha < endalpha: self._alpha += 15 if self._alpha > endalpha: self._alpha = endalpha self.SetTransparent(self._alpha) if sys.platform not in ("darwin", "win32"): self.Refresh() self.Update() wx.CallLater(1, self.startup) return if self.frame < (len(self.zoom_scales) + len(self.splash_anim) + len(self.splash_version_anim)) - 1: self.frame += 1 self.Refresh() self.Update() if self.frame < len(self.zoom_scales): wx.CallLater(1, self.startup) else: wx.CallLater(1000 / 30.0, self.startup) return # Give 10 seconds for display & instrument enumeration to run. # This should be plenty and will kill the subprocess in case it hangs. self.timeout = wx.CallLater(10000, self.worker.abort_subprocess) delayedresult.startWorker(self.setup_frame, self.worker.enumerate_displays_and_ports, wkwargs={"enumerate_ports": getcfg("enumerate_ports.auto") or not getcfg("instruments", raw=True), "silent": True}) def setup_frame(self, result): if self.timeout.IsRunning(): self.timeout.Stop() self.timeout = None try: result.get() except Exception, exception: if hasattr(exception, "originalTraceback"): error = exception.originalTraceback else: error = traceback.format_exc() raise Error(error) if verbose >= 1: safe_print(lang.getstr("initializing_gui")) app = wx.GetApp() app.frame = MainFrame(self.worker) self.setup_frame_finish(app) def setup_frame_finish(self, app): if self.IsShown() and self._alpha > 0: self._alpha -= 15 if self._alpha < 0: self._alpha = 0 self.SetTransparent(self._alpha) if sys.platform not in ("darwin", "win32"): self.Refresh() self.Update() wx.CallLater(1, self.setup_frame_finish, app) return app.SetTopWindow(app.frame) app.frame.listen() app.frame.Show() app.process_argv(1) wx.CallAfter(app.frame.Raise) # Check for updates if configured if getcfg("update_check"): # Give time for the main window to gain focus before checking for # update, otherwise the main window may steal the update # confirmation dialog's focus which looks weird wx.CallAfter(app.frame.app_update_check_handler, None, silent=True) else: # Check if we need to run instrument setup wx.CallAfter(app.frame.check_instrument_setup, check_donation, (app.frame, VERSION > VERSION_BASE)) # If resources are missing, XRC shows an error dialog which immediately # gets hidden when we close ourselves because we are the parent. # Hide instead. win = app.frame.get_top_window() if isinstance(win, wx.Dialog): self.Hide() else: self.Close() def OnEraseBackground(self, event): pass def OnPaint(self, event): if sys.platform != "win32": # AutoBufferedPaintDCFactory is the magic needed for crisp text # rendering in HiDPI mode under OS X and Linux cls = wx.AutoBufferedPaintDCFactory else: cls = wx.BufferedPaintDC self.Draw(cls(self)) def Draw(self, dc): # Background dc.SetBackgroundMode(wx.TRANSPARENT) if isinstance(dc, wx.ScreenDC): dc.StartDrawingOnTop() x, y = self.splash_x, self.splash_y else: dc.Clear() if hasattr(self, "_buffereddc"): dc.Blit(0, 0, self.splash_bmp.Size[0], self.splash_bmp.Size[1], self._buffereddc, 0, 0) x = y = 0 if self.frame < len(self.zoom_scales): pdc = dc bufferbitmap = wx.EmptyBitmap(self.splash_bmp.Size[0], self.splash_bmp.Size[1]) dc = wx.MemoryDC() dc.SelectObject(bufferbitmap) dc.SetBackgroundMode(wx.TRANSPARENT) dc.DrawBitmap(self.splash_bmp, x, y) # Text rect = wx.Rect(0, int(self.splash_bmp.Size[1] * 0.75), self.splash_bmp.Size[0], 40) dc.SetFont(self.GetFont()) # Version label label_str = version_short if VERSION > VERSION_BASE: label_str += " Beta" dc.SetTextForeground("#101010") yoff = 10 scale = getcfg("app.dpi") / config.get_default_dpi() if scale > 1: yoff = int(round(yoff * scale)) yoff -= 10 dc.DrawLabel(label_str, wx.Rect(rect.x, 110 + yoff, rect.width, 32), wx.ALIGN_CENTER | wx.ALIGN_TOP) dc.SetTextForeground(wx.BLACK) dc.DrawLabel(label_str, wx.Rect(rect.x, 111 + yoff, rect.width, 32), wx.ALIGN_CENTER | wx.ALIGN_TOP) dc.SetTextForeground("#CCCCCC") dc.DrawLabel(label_str, wx.Rect(rect.x, 112 + yoff, rect.width, 32), wx.ALIGN_CENTER | wx.ALIGN_TOP) # Message dc.SetTextForeground("#101010") dc.DrawLabel(self._msg, wx.Rect(rect.x, rect.y + 2, rect.width, rect.height), wx.ALIGN_CENTER | wx.ALIGN_TOP) dc.SetTextForeground(wx.BLACK) dc.DrawLabel(self._msg, wx.Rect(rect.x, rect.y + 1, rect.width, rect.height), wx.ALIGN_CENTER | wx.ALIGN_TOP) dc.SetTextForeground("#CCCCCC") dc.DrawLabel(self._msg, rect, wx.ALIGN_CENTER | wx.ALIGN_TOP) if self.frame < len(self.zoom_scales): # Zoom dc.DrawBitmap(self.splash_anim[0], x, y) dc.SelectObject(wx.NullBitmap) scale = self.zoom_scales[self.frame] frame = bufferbitmap.ConvertToImage() frame.SetAlphaData(self.splash_alpha) if scale < 1: frame = frame.Blur(int(round(1 * (1 - scale)))) if wx.VERSION > (3, ): quality = wx.IMAGE_QUALITY_BILINEAR else: quality = wx.IMAGE_QUALITY_HIGH frame.Rescale(max(int(round(self.splash_bmp.Size[0] * scale)), 1), max(int(round(self.splash_bmp.Size[1] * scale)), 1), quality) frame.Resize(self.splash_bmp.Size, (int(round(self.splash_bmp.Size[0] / 2 - frame.Width / 2)), int(round(self.splash_bmp.Size[1] / 2 - frame.Height / 2)))) pdc.DrawBitmap(frame.ConvertToBitmap(), x, y) else: # Animation if self.splash_anim: dc.DrawBitmap(self.splash_anim[min(self.frame - len(self.zoom_scales), len(self.splash_anim) - 1)], x, y) if self.frame > len(self.zoom_scales) + len(self.splash_anim) - 1: dc.DrawBitmap(self.splash_version_anim[self.frame - len(self.zoom_scales) - len(self.splash_anim)], x, y) if isinstance(dc, wx.ScreenDC): dc.EndDrawingOnTop() def Pulse(self, msg=None): if msg: self._msg = msg if self.IsShown(): self.Refresh() self.Update() return True, False def SetWindowShape(self, *evt): r = wx.RegionFromBitmapColour(self.mask_bmp, wx.BLACK) self.hasShape = self.SetShape(r) UpdatePulse = Pulse class MeasurementFileCheckSanityDialog(ConfirmDialog): def __init__(self, parent, ti3, suspicious, force=False): scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 ConfirmDialog.__init__(self, parent, title=os.path.basename(ti3.filename) if ti3.filename else lang.getstr("measurement_file.check_sanity"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), alt=lang.getstr("invert_selection"), bitmap=geticon(32, "dialog-warning"), wrap=120) msg_col1 = lang.getstr("warning.suspicious_delta_e") msg_col2 = lang.getstr("warning.suspicious_delta_e.info") margin = 12 dlg = self dlg.sizer3.Remove(0) # Remove message textbox dlg.message.Destroy() dlg.sizer4 = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(dlg.sizer4) dlg.message_col1 = wx.StaticText(dlg, -1, msg_col1) dlg.message_col1.Wrap(450 * scale) dlg.sizer4.Add(dlg.message_col1, flag=wx.RIGHT, border = 20) dlg.message_col2 = wx.StaticText(dlg, -1, msg_col2) dlg.message_col2.Wrap(450 * scale) dlg.sizer4.Add(dlg.message_col2, flag=wx.LEFT, border = 20) dlg.Unbind(wx.EVT_BUTTON, dlg.alt) dlg.Bind(wx.EVT_BUTTON, dlg.invert_selection_handler, id=dlg.alt.GetId()) dlg.select_all_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("deselect_all")) dlg.sizer2.Insert(2, dlg.select_all_btn) dlg.sizer2.Insert(2, (margin, margin)) dlg.Bind(wx.EVT_BUTTON, dlg.select_all_handler, id=dlg.select_all_btn.GetId()) dlg.ti3 = ti3 dlg.suspicious = suspicious dlg.mods = {} dlg.force = force if "gtk3" in wx.PlatformInfo: style = wx.BORDER_SIMPLE else: style = wx.BORDER_THEME dlg.grid = CustomGrid(dlg, -1, size=(940 * scale, 200 * scale), style=style) grid = dlg.grid grid.DisableDragRowSize() grid.SetCellHighlightPenWidth(0) grid.SetCellHighlightROPenWidth(0) grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) grid.SetMargins(0, 0) grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) grid.SetScrollRate(5, 5) grid.draw_horizontal_grid_lines = False grid.draw_vertical_grid_lines = False grid.CreateGrid(0, 15) grid.SetColLabelSize(int(round(self.grid.GetDefaultRowSize() * 2.4))) dc = wx.MemoryDC(wx.EmptyBitmap(1, 1)) dc.SetFont(grid.GetLabelFont()) w, h = dc.GetTextExtent("99%s" % dlg.ti3.DATA[dlg.ti3.NUMBER_OF_SETS - 1].SAMPLE_ID) grid.SetRowLabelSize(max(w, grid.GetDefaultRowSize())) w, h = dc.GetTextExtent("9999999999") for i in xrange(grid.GetNumberCols()): if i in (4, 5) or i > 8: attr = wx.grid.GridCellAttr() attr.SetReadOnly(True) grid.SetColAttr(i, attr) if i == 0: size = 22 * scale elif i in (4, 5): size = self.grid.GetDefaultRowSize() else: size = w grid.SetColSize(i, size) for i, label in enumerate(["", "R %", "G %", "B %", "", "", "X", "Y", "Z", u"\u0394E*00\nXYZ A/B", u"0.5 \u0394E*00\nRGB A/B", u"\u0394E*00\nRGB-XYZ", u"\u0394L*00\nRGB-XYZ", u"\u0394C*00\nRGB-XYZ", u"\u0394H*00\nRGB-XYZ"]): grid.SetColLabelValue(i, label) attr = wx.grid.GridCellAttr() #attr.SetReadOnly(True) attr.SetRenderer(CustomCellBoolRenderer()) grid.SetColAttr(0, attr) font = grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 grid.SetDefaultCellFont(font) grid.DisableDragColSize() grid.EnableGridLines(False) black = ti3.queryi1({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}) if black: black = black["XYZ_X"], black["XYZ_Y"], black["XYZ_Z"] dlg.black = black white = ti3.queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if white: white = white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] dlg.white = white dlg.suspicious_items = [] grid.BeginBatch() for i, (prev, item, delta, sRGB_delta, prev_delta_to_sRGB, delta_to_sRGB) in enumerate(suspicious): for cur in (prev, item): if cur and cur not in dlg.suspicious_items: dlg.suspicious_items.append(cur) grid.AppendRows(1) row = grid.GetNumberRows() - 1 grid.SetRowLabelValue(row, "%d" % cur.SAMPLE_ID) RGB = [] for k, label in enumerate("RGB"): value = cur["RGB_%s" % label] grid.SetCellValue(row, 1 + k, "%.4f" % value) RGB.append(value) XYZ = [] for k, label in enumerate("XYZ"): value = cur["XYZ_%s" % label] grid.SetCellValue(row, 6 + k, "%.4f" % value) XYZ.append(value) if cur is prev: dlg.update_row(row, RGB, XYZ, None, None, prev_delta_to_sRGB) else: dlg.update_row(row, RGB, XYZ, delta, sRGB_delta, delta_to_sRGB) grid.EndBatch() grid.Bind(wx.EVT_KEY_DOWN, dlg.key_handler) grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, dlg.cell_change_handler) grid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, dlg.cell_click_handler) dlg.sizer3.Add(grid, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.buttonpanel.Layout() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() # This workaround is needed to update cell colours grid.SelectAll() grid.ClearSelection() dlg.Center() def cell_change_handler(self, event): dlg = self grid = dlg.grid if event.Col > 0: item = dlg.suspicious_items[event.Row] label = "_RGB__XYZ"[event.Col] if event.Col < 6: label = "RGB_%s" % label else: label = "XYZ_%s" % label strval = "0" + grid.GetCellValue(event.Row, event.Col).replace(",", ".") try: value = float(strval) if (label[:3] == "RGB" or label == "XYZ_Y") and value > 100: raise ValueError("Value %r is invalid" % value) elif value < 0: raise ValueError("Negative value %r is invalid" % value) except ValueError: wx.Bell() strval = "%.4f" % item[label] if "." in strval: strval = strval.rstrip("0").rstrip(".") grid.SetCellValue(event.Row, event.Col, re.sub("^0+(?!\.)", "", strval) or "0") else: grid.SetCellValue(event.Row, event.Col, re.sub("^0+(?!\.)", "", strval) or "0") RGB = [] for i in (1, 2, 3): RGB.append(float(grid.GetCellValue(event.Row, i))) XYZ = [] for i in (6, 7, 8): XYZ.append(float(grid.GetCellValue(event.Row, i))) # Update row (sRGBLab, Lab, delta_to_sRGB, criteria1, debuginfo) = check_ti3_criteria1(RGB, XYZ, dlg.black, dlg.white, print_debuginfo=True) if grid.GetCellValue(event.Row, 9): prev = dlg.suspicious_items[event.Row - 1] prev_RGB = prev["RGB_R"], prev["RGB_G"], prev["RGB_B"] prev_XYZ = prev["XYZ_X"], prev["XYZ_Y"], prev["XYZ_Z"] (prev_sRGBLab, prev_Lab, prev_delta_to_sRGB, prev_criteria1, prev_debuginfo) = check_ti3_criteria1(prev_RGB, prev_XYZ, dlg.black, dlg.white, print_debuginfo=False) (delta, sRGB_delta, criteria2) = check_ti3_criteria2(prev_Lab, Lab, prev_sRGBLab, sRGBLab, prev_RGB, RGB) else: delta, sRGB_delta = (None, ) * 2 dlg.update_row(event.Row, RGB, XYZ, delta, sRGB_delta, delta_to_sRGB) if item[label] != value: if not dlg.mods.get(event.Row): dlg.mods[event.Row] = {} dlg.mods[event.Row][label] = value dlg.ok.Enable(not dlg.force or bool(dlg.mods)) # This workaround is needed to update cell colours cells = grid.GetSelection() grid.SelectAll() grid.ClearSelection() for row, col in cells: grid.SelectBlock(row, col, row, col, True) else: dlg.check_select_status() def cell_click_handler(self, event): if event.Col == 0: if self.grid.GetCellValue(event.Row, event.Col): value = "" else: value = "1" self.grid.SetCellValue(event.Row, event.Col, value) self.check_select_status() event.Skip() def check_select_status(self, has_false_values=None, has_true_values=None): dlg = self if None in (has_false_values, has_true_values): for index in xrange(dlg.grid.GetNumberRows()): if dlg.grid.GetCellValue(index, 0) != "1": has_false_values = True else: has_true_values = True dlg.ok.Enable(has_false_values or not self.force or bool(dlg.mods)) if has_true_values: dlg.select_all_btn.SetLabel(lang.getstr("deselect_all")) else: dlg.select_all_btn.SetLabel(lang.getstr("select_all")) def invert_selection_handler(self, event): dlg = self has_false_values = False has_true_values = False for index in xrange(dlg.grid.GetNumberRows()): if dlg.grid.GetCellValue(index, 0) == "1": value = "" has_false_values = True else: value = "1" has_true_values = True dlg.grid.SetCellValue(index, 0, value) self.check_select_status(has_false_values, has_true_values) def key_handler(self, event): dlg = self if event.KeyCode == wx.WXK_SPACE: if dlg.grid.GridCursorCol == 0: dlg.cell_click_handler(CustomGridCellEvent(wx.grid.EVT_GRID_CELL_CHANGE.evtType[0], dlg.grid, dlg.grid.GridCursorRow, dlg.grid.GridCursorCol)) else: event.Skip() def mark_cell(self, row, col, ok=False): grid = self.grid font = grid.GetCellFont(row, col) font.SetWeight(wx.FONTWEIGHT_NORMAL if ok else wx.FONTWEIGHT_BOLD) grid.SetCellFont(row, col, font) grid.SetCellTextColour(row, col, grid.GetDefaultCellTextColour() if ok else wx.Colour(204, 0, 0)) def select_all_handler(self, event): dlg = self if dlg.select_all_btn.GetLabel() == lang.getstr("select_all"): value = "1" else: value = "" for index in xrange(dlg.grid.GetNumberRows()): dlg.grid.SetCellValue(index, 0, value) self.check_select_status(not value, value) def update_row(self, row, RGB, XYZ, delta, sRGB_delta, delta_to_sRGB): dlg = self grid = dlg.grid # XXX: Careful when rounding floats! # Incorrect: int(round(50 * 2.55)) = 127 (127.499999) # Correct: int(round(50 / 100.0 * 255)) = 128 (127.5) RGB255 = [int(round(v / 100.0 * 255)) for v in RGB] dlg.grid.SetCellBackgroundColour(row, 4, wx.Colour(*RGB255)) if dlg.white: XYZ = colormath.adapt(XYZ[0], XYZ[1], XYZ[2], dlg.white, "D65") RGB255 = [int(round(v)) for v in colormath.XYZ2RGB(XYZ[0] / 100.0, XYZ[1] / 100.0, XYZ[2] / 100.0, scale=255)] dlg.grid.SetCellBackgroundColour(row, 5, wx.Colour(*RGB255)) grid.SetCellValue(row, 0, "1" if (not delta or (delta["E_ok"] and delta["L_ok"])) and delta_to_sRGB["ok"] else "") for col in xrange(3): dlg.mark_cell(row, 6 + col, (not delta or (delta["E_ok"] and (delta["L_ok"] or col != 1))) and delta_to_sRGB["ok"]) if delta: grid.SetCellValue(row, 9, "%.2f" % delta["E"]) dlg.mark_cell(row, 9, delta["E_ok"]) if sRGB_delta: grid.SetCellValue(row, 10, "%.2f" % sRGB_delta["E"]) for col, ELCH in enumerate("ELCH"): grid.SetCellValue(row, 11 + col, "%.2f" % delta_to_sRGB[ELCH]) dlg.mark_cell(row, 11 + col, delta_to_sRGB["%s_ok" % ELCH]) def main(): initcfg() lang.init() # Startup messages if verbose >= 1: safe_print(lang.getstr("startup")) if sys.platform != "darwin": if not autostart: safe_print(lang.getstr("warning.autostart_system")) if not autostart_home: safe_print(lang.getstr("warning.autostart_user")) app = BaseApp(0) # Don't redirect stdin/stdout app.TopWindow = StartupFrame() app.MainLoop() if __name__ == "__main__": main() DisplayCAL-3.5.0.0/DisplayCAL/edid.py0000644000076500000000000003057213221730150016703 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from hashlib import md5 import codecs import math import os import string import struct import sys import warnings if sys.platform == "win32": from threading import _MainThread, currentThread wmi = None if sys.getwindowsversion() >= (6, ): # Use WMI for Vista/Win7 import pythoncom try: import wmi except: pass else: # Use registry as fallback for Win2k/XP/2003 import _winreg import pywintypes import win32api elif sys.platform == "darwin": import binascii import re import subprocess as sp import config from config import enc from log import log, safe_print from util_str import make_ascii_printable, safe_str, strtr if sys.platform == "win32": import util_win elif sys.platform != "darwin": try: import RealDisplaySizeMM as RDSMM except ImportError, exception: warnings.warn(safe_str(exception, enc), Warning) RDSMM = None HEADER = (0, 8) MANUFACTURER_ID = (8, 10) PRODUCT_ID = (10, 12) SERIAL_32 = (12, 16) WEEK_OF_MANUFACTURE = 16 YEAR_OF_MANUFACTURE = 17 EDID_VERSION = 18 EDID_REVISION = 19 MAX_H_SIZE_CM = 21 MAX_V_SIZE_CM = 22 GAMMA = 23 FEATURES = 24 LO_RG_XY = 25 LO_BW_XY = 26 HI_R_X = 27 HI_R_Y = 28 HI_G_X = 29 HI_G_Y = 30 HI_B_X = 31 HI_B_Y = 32 HI_W_X = 33 HI_W_Y = 34 BLOCKS = ((54, 72), (72, 90), (90, 108), (108, 126)) BLOCK_TYPE = 3 BLOCK_CONTENTS = (5, 18) BLOCK_TYPE_SERIAL_ASCII = "\xff" BLOCK_TYPE_ASCII = "\xfe" BLOCK_TYPE_MONITOR_NAME = "\xfc" BLOCK_TYPE_COLOR_POINT = "\xfb" BLOCK_TYPE_COLOR_MANAGEMENT_DATA = "\xf9" EXTENSION_FLAG = 126 CHECKSUM = 127 BLOCK_DI_EXT = "\x40" TRC = (81, 127) pnpidcache = {} def combine_hi_8lo(hi, lo): return hi << 8 | lo def get_edid(display_no=0, display_name=None, device=None): """ Get and parse EDID. Return dict. On Mac OS X, you need to specify a display name. On all other platforms, you need to specify a display number (zero-based). """ edid = None if sys.platform == "win32": if not device: # The ordering will work as long as Argyll continues using # EnumDisplayMonitors monitors = util_win.get_real_display_devices_info() moninfo = monitors[display_no] device = util_win.get_active_display_device(moninfo["Device"]) if not device: return {} id = device.DeviceID.split("\\")[1] wmi_connection = None not_main_thread = currentThread().__class__ is not _MainThread if wmi: if not_main_thread: pythoncom.CoInitialize() wmi_connection = wmi.WMI(namespace="WMI") if wmi_connection: # Use WMI for Vista/Win7 # http://msdn.microsoft.com/en-us/library/Aa392707 try: msmonitors = wmi_connection.WmiMonitorDescriptorMethods() except Exception, exception: if not_main_thread: pythoncom.CoUninitialize() raise WMIError(safe_str(exception)) for msmonitor in msmonitors: if msmonitor.InstanceName.split("\\")[1] == id: try: edid = msmonitor.WmiGetMonitorRawEEdidV1Block(0) except: # No EDID entry pass else: edid = "".join(chr(i) for i in edid[0]) break if not_main_thread: pythoncom.CoUninitialize() elif sys.getwindowsversion() < (6, ): # Use registry as fallback for Win2k/XP/2003 # http://msdn.microsoft.com/en-us/library/ff546173%28VS.85%29.aspx # "The Enum tree is reserved for use by operating system components, # and its layout is subject to change. (...) Drivers and Windows # applications must not access the Enum tree directly." # But do we care? Probably not, as older Windows' API isn't likely # gonna change. driver = "\\".join(device.DeviceID.split("\\")[-2:]) subkey = "\\".join(["SYSTEM", "CurrentControlSet", "Enum", "DISPLAY", id]) try: key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey) except WindowsError: # Registry error safe_print("Windows registry error: Key", "\\".join(["HKEY_LOCAL_MACHINE", subkey]), "does not exist.") return {} numsubkeys, numvalues, mtime = _winreg.QueryInfoKey(key) for i in range(numsubkeys): hkname = _winreg.EnumKey(key, i) hk = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "\\".join([subkey, hkname])) try: test = _winreg.QueryValueEx(hk, "Driver")[0] except WindowsError: # No Driver entry continue if test == driver: # Found our display device try: devparms = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "\\".join([subkey, hkname, "Device Parameters"])) except WindowsError: # No Device Parameters (registry error?) safe_print("Windows registry error: Key", "\\".join(["HKEY_LOCAL_MACHINE", subkey, hkname, "Device Parameters"]), "does not exist.") continue try: edid = _winreg.QueryValueEx(devparms, "EDID")[0] except WindowsError: # No EDID entry pass else: raise WMIError("No WMI connection") elif sys.platform == "darwin": # Get EDID via ioreg p = sp.Popen(["ioreg", "-c", "IODisplay", "-S", "-w0"], stdout=sp.PIPE) stdout, stderr = p.communicate() if stdout: for edid in [binascii.unhexlify(edid_hex) for edid_hex in re.findall('"IODisplayEDID"\s*=\s*<([0-9A-Fa-f]*)>', stdout)]: if edid and len(edid) >= 128: parsed_edid = parse_edid(edid) if parsed_edid.get("monitor_name", parsed_edid.get("ascii")) == display_name: # On Mac OS X, you need to specify a display name # because the order is unknown return parsed_edid return {} elif RDSMM: display = RDSMM.get_display(display_no) if display: edid = display.get("edid") if edid and len(edid) >= 128: return parse_edid(edid) return {} def parse_manufacturer_id(block): """ Parse the manufacturer id and return decoded string. The range is always ASCII charcode 64 to 95. """ h = combine_hi_8lo(ord(block[0]), ord(block[1])) manufacturer_id = [] for shift in (10, 5, 0): manufacturer_id.append(chr(((h >> shift) & 0x1f) + ord('A') - 1)) return "".join(manufacturer_id).strip() def get_manufacturer_name(manufacturer_id): """ Try and get a nice descriptive string for our manufacturer id. This uses either hwdb or pnp.ids which will be looked for in several places. If it can't find the file, it returns None. Examples: SAM -> Samsung Electric Company NEC -> NEC Corporation hwdb/pnp.ids can be created from Excel data available from Microsoft: http://www.microsoft.com/whdc/system/pnppwr/pnp/pnpid.mspx """ if not pnpidcache: paths = ["/usr/lib/udev/hwdb.d/20-acpi-vendor.hwdb", # systemd "/usr/share/hwdata/pnp.ids", # hwdata, e.g. Red Hat "/usr/share/misc/pnp.ids", # pnputils, e.g. Debian "/usr/share/libgnome-desktop/pnp.ids"] # fallback gnome-desktop if sys.platform in ("darwin", "win32"): paths.append(os.path.join(config.pydir, "pnp.ids")) # fallback for path in paths: if os.path.isfile(path): try: pnp_ids = codecs.open(path, "r", "UTF-8", "replace") except IOError: pass else: id, name = None, None try: for line in pnp_ids: if path.endswith("hwdb"): if line.strip().startswith("acpi:"): id = line.split(":")[1][:3] continue elif line.strip().startswith("ID_VENDOR_FROM_DATABASE"): name = line.split("=", 1)[1].strip() else: continue if not id or not name or id in pnpidcache: continue else: try: # Strip leading/trailing whitespace # (non-breaking spaces too) id, name = line.strip(string.whitespace + u"\u00a0").split(None, 1) except ValueError: continue pnpidcache[id] = name except OSError: continue finally: pnp_ids.close() break return pnpidcache.get(manufacturer_id) def edid_get_bit(value, bit): return (value & (1 << bit)) >> bit def edid_get_bits(value, begin, end): mask = (1 << (end - begin + 1)) - 1 return (value >> begin) & mask def edid_decode_fraction(high, low): result = 0.0 high = (high << 2) | low for i in xrange(0, 10): result += edid_get_bit(high, i) * math.pow(2, i - 10) return result def edid_parse_string(desc): # Return value should match colord's cd_edid_parse_string in cd-edid.c # Remember: In C, NULL terminates a string, so do the same here # Replace newline with NULL, then strip anything after first NULL byte # (if any), then strip trailing whitespace desc = strtr(desc[:13], {"\n": "\0", "\r": "\0"}).split("\0")[0].rstrip() if desc: # Replace all non-printable chars with NULL # Afterwards, the amount of NULL bytes is the number of replaced chars desc = make_ascii_printable(desc, subst="\0") if desc.count("\0") <= 4: # Only use string if max 4 replaced chars # Replace any NULL chars with dashes to make a printable string return desc.replace("\0", "-") def parse_edid(edid): """ Parse raw EDID data (binary string) and return dict. """ hash = md5(edid).hexdigest() header = edid[HEADER[0]:HEADER[1]] manufacturer_id = parse_manufacturer_id(edid[MANUFACTURER_ID[0]:MANUFACTURER_ID[1]]) manufacturer = get_manufacturer_name(manufacturer_id) product_id = struct.unpack(" i / 5: white_x = edid_decode_fraction(ord(edid[i + 2]), edid_get_bits(ord(edid[i + 1]), 2, 3)) result["white_x_" + str(ord(block[i]))] = white_x if not result.get("white_x"): result["white_x"] = white_x white_y = edid_decode_fraction(ord(edid[i + 3]), edid_get_bits(ord(edid[i + 1]), 0, 1)) result["white_y_" + str(ord(block[i]))] = white_y if not result.get("white_y"): result["white_y"] = white_y if block[i + 4] != "\xff": gamma = ord(block[i + 4]) / 100.0 + 1 result["gamma_" + str(ord(block[i]))] = gamma if not result.get("gamma"): result["gamma"] = gamma elif block[BLOCK_TYPE] == BLOCK_TYPE_COLOR_MANAGEMENT_DATA: # TODO: Implement? How could it be used? result["color_management_data"] = block[BLOCK_CONTENTS[0]:BLOCK_CONTENTS[1]] result["ext_flag"] = ord(edid[EXTENSION_FLAG]) result["checksum"] = ord(edid[CHECKSUM]) result["checksum_valid"] = sum(ord(char) for char in edid) % 256 == 0 if len(edid) > 128 and result["ext_flag"] > 0: # Parse extension blocks block = edid[128:] while block: if block[0] == BLOCK_DI_EXT: if block[TRC[0]] != "\0": # TODO: Implement pass block = block[128:] return result class WMIError(Exception): pass DisplayCAL-3.5.0.0/DisplayCAL/embeddedimage.py0000644000076500000000000000465212665102055020542 0ustar devwheel00000000000000#---------------------------------------------------------------------- # Name: wx.lib.embeddedimage # Purpose: Defines a class used for embedding PNG images in Python # code. The primary method of using this module is via # the code generator in wx.tools.img2py. # # Author: Anthony Tuininga # # Created: 26-Nov-2007 # RCS-ID: $Id: embeddedimage.py 59672 2009-03-20 20:59:42Z RD $ # Copyright: (c) 2007 by Anthony Tuininga # Licence: wxWindows license #---------------------------------------------------------------------- import base64 import cStringIO import wx try: b64decode = base64.b64decode except AttributeError: b64decode = base64.decodestring class PyEmbeddedImage(object): """ PyEmbeddedImage is primarily intended to be used by code generated by img2py as a means of embedding image data in a python module so the image can be used at runtime without needing to access the image from an image file. This makes distributing icons and such that an application uses simpler since tools like py2exe will automatically bundle modules that are imported, and the application doesn't have to worry about how to locate the image files on the user's filesystem. The class can also be used for image data that may be acquired from some other source at runtime, such as over the network or from a database. In this case pass False for isBase64 (unless the data actually is base64 encoded.) Any image type that wx.ImageFromStream can handle should be okay. """ def __init__(self, data, isBase64=True): self.data = data self.isBase64 = isBase64 def GetBitmap(self): return wx.BitmapFromImage(self.GetImage()) def GetData(self): if self.isBase64: data = b64decode(self.data) return data def GetIcon(self): icon = wx.EmptyIcon() icon.CopyFromBitmap(self.GetBitmap()) return icon def GetImage(self): stream = cStringIO.StringIO(self.GetData()) return wx.ImageFromStream(stream) # added for backwards compatibility getBitmap = GetBitmap getData = GetData getIcon = GetIcon getImage = GetImage # define properties, for convenience Bitmap = property(GetBitmap) Icon = property(GetIcon) Image = property(GetImage) DisplayCAL-3.5.0.0/DisplayCAL/encodedstdio.py0000644000076500000000000001244612665102054020451 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import codecs import locale import os import sys from encoding import get_encoding _codecs = {} _stdio = {} def codec_register_alias(alias, name): """ Register an alias for encoding 'name' """ _codecs[alias] = codecs.CodecInfo(name=alias, encode=codecs.getencoder(name), decode=codecs.getdecoder(name), incrementalencoder=codecs.getincrementalencoder(name), incrementaldecoder=codecs.getincrementaldecoder(name), streamwriter=codecs.getwriter(name), streamreader=codecs.getreader(name)) def conditional_decode(text, encoding='UTF-8', errors='strict'): """ Decode text if not unicode """ if not isinstance(text, unicode): text = text.decode(encoding, errors) return text def conditional_encode(text, encoding='UTF-8', errors='strict'): """ Encode text if unicode """ if isinstance(text, unicode): text = text.encode(encoding, errors) return text def encodestdio(encodings=None, errors=None): """ After this function is called, Unicode strings written to stdout/stderr are automatically encoded and strings read from stdin automatically decoded with the given encodings and error handling. encodings and errors can be a dict with mappings for stdin/stdout/stderr, e.g. encodings={'stdin': 'UTF-8', 'stdout': 'UTF-8', 'stderr': 'UTF-8'} or errors={'stdin': 'strict', 'stdout': 'replace', 'stderr': 'replace'} In the case of errors, stdin uses a default 'strict' error handling and stdout/stderr both use 'replace'. """ if not encodings: encodings = {'stdin': None, 'stdout': None, 'stderr': None} if not errors: errors = {'stdin': 'strict', 'stdout': 'replace', 'stderr': 'replace'} for stream_name in set(encodings.keys() + errors.keys()): stream = getattr(sys, stream_name) encoding = encodings.get(stream_name) if not encoding: encoding = get_encoding(stream) error_handling = errors.get(stream_name, 'strict') if isinstance(stream, EncodedStream): stream.encoding = encoding stream.errors = error_handling else: setattr(sys, stream_name, EncodedStream(stream, encoding, error_handling)) def read(stream, size=-1): """ Read from stream. Uses os.read() if stream is a tty, stream.read() otherwise. """ if stream.isatty(): data = os.read(stream.fileno(), size) else: data = stream.read(size) return data def write(stream, data): """ Write to stream. Uses os.write() if stream is a tty, stream.write() otherwise. """ if stream.isatty(): os.write(stream.fileno(), data) else: stream.write(data) class EncodedStream(object): """ Unicode strings written to an EncodedStream are automatically encoded and strings read from it automtically decoded with the given encoding and error handling. Uses os.read() and os.write() for proper handling of unicode codepages for stdout/stderr under Windows """ def __init__(self, stream, encoding='UTF-8', errors='strict'): self.stream = stream self.encoding = encoding self.errors = errors def __getattr__(self, name): return getattr(self.stream, name) def __iter__(self): return iter(self.readlines()) def __setattr__(self, name, value): if name == 'softspace': setattr(self.stream, name, value) else: object.__setattr__(self, name, value) def next(self): return self.readline() def read(self, size=-1): return conditional_decode(read(self.stream, size), self.encoding, self.errors) def readline(self, size=-1): return conditional_decode(self.stream.readline(size), self.encoding, self.errors) def readlines(self, size=-1): return [conditional_decode(line, self.encoding, self.errors) for line in self.stream.readlines(size)] def xreadlines(self): return self def write(self, text): write(self.stream, conditional_encode(text, self.encoding, self.errors)) def writelines(self, lines): for line in lines: self.write(line) # Store references to original stdin/stdout/stderr for _stream_name in ('stdin', 'stdout', 'stderr'): _stream = getattr(sys, _stream_name) if isinstance(_stream, EncodedStream): _stdio[_stream_name] = _stream.stream else: _stdio[_stream_name] = _stream # Register codec aliases for codepages 65000 and 65001 codec_register_alias('65000', 'utf_7') codec_register_alias('65001', 'utf_8') codec_register_alias('cp65000', 'utf_7') codec_register_alias('cp65001', 'utf_8') codecs.register(lambda alias: _codecs.get(alias)) if __name__ == '__main__': test = u'test \u00e4\u00f6\u00fc\ufffe test' try: print test except (LookupError, IOError, UnicodeError), exception: print 'could not print %r:' % test, exception print 'wrapping stdout/stderr via encodestdio()' encodestdio() print test print 'exiting normally' DisplayCAL-3.5.0.0/DisplayCAL/encoding.py0000644000076500000000000000241312665102055017565 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import locale import sys if sys.platform == "win32": from ctypes import windll def get_encoding(stream): """ Return stream encoding. """ enc = None if stream in (sys.stdin, sys.stdout, sys.stderr): if sys.platform == "darwin": # There is no way to determine it reliably under OS X 10.4? return "UTF-8" elif sys.platform == "win32": if sys.version_info >= (2, 6): # Windows/Python 2.6+: If a locale is set, the actual encoding # of stdio changes, but the encoding attribute isn't updated enc = locale.getlocale()[1] if not enc: try: # GetConsoleCP and GetConsoleOutputCP return zero if # we're not running as console executable. Fall back # to GetOEMCP if stream is (sys.stdin): enc = "cp%i" % (windll.kernel32.GetConsoleCP() or windll.kernel32.GetOEMCP()) else: enc = "cp%i" % (windll.kernel32.GetConsoleOutputCP() or windll.kernel32.GetOEMCP()) except: pass enc = enc or getattr(stream, "encoding", None) or \ locale.getpreferredencoding() or sys.getdefaultencoding() return enc def get_encodings(): """ Return console encoding, filesystem encoding. """ enc = get_encoding(sys.stdout) fs_enc = sys.getfilesystemencoding() or enc return enc, fs_enc DisplayCAL-3.5.0.0/DisplayCAL/floatspin.py0000644000076500000000000017430013220271163017776 0ustar devwheel00000000000000# --------------------------------------------------------------------------- # # FLOATSPIN Control wxPython IMPLEMENTATION # Python Code By: # # Andrea Gavana, @ 16 Nov 2005 # Latest Revision: 03 Jan 2014, 23.00 GMT # # Modifications for DisplayCAL: # - Select text on focus # - Always accept "," (comma) as decimal point # - Only call SyncSpinToText if TextCtrl value has actually changed # - Set value to min/max if not in range # - Use a different method for tab traversal because the original code didn't # work under wxGTK # - If CMD or CTRL are held, don't block keycodes that are not allowed (fixes # copy/paste/select all keyboard shortcuts not working) # - Do default action if return key is pressed (currently only works if the # default item is a button) # - Fix children not reflecting enbled state under wxMac # # TODO List/Caveats # # 1. Ay Idea? # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To Me At: # # andrea.gavana@gmail.com # andrea.gavana@maerskoil.com # # Or, Obviously, To The wxPython Mailing List!!! # # # End Of Comments # --------------------------------------------------------------------------- # """ :class:`FloatSpin` implements a floating point :class:`SpinCtrl`. Description =========== :class:`FloatSpin` implements a floating point :class:`SpinCtrl`. It is built using a custom :class:`PyControl`, composed by a :class:`TextCtrl` and a :class:`SpinButton`. In order to correctly handle floating points numbers without rounding errors or non-exact floating point representations, :class:`FloatSpin` uses the great :class:`FixedPoint` class from Tim Peters. What you can do: - Set the number of representative digits for your floating point numbers; - Set the floating point format (``%f``, ``%F``, ``%e``, ``%E``, ``%g``, ``%G``); - Set the increment of every ``EVT_FLOATSPIN`` event; - Set minimum, maximum values for :class:`FloatSpin` as well as its range; - Change font and colour for the underline :class:`TextCtrl`. Usage ===== Usage example:: import wx import wx.lib.agw.floatspin as FS class MyFrame(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, -1, "FloatSpin Demo") panel = wx.Panel(self) floatspin = FS.FloatSpin(panel, -1, pos=(50, 50), min_val=0, max_val=1, increment=0.01, value=0.1, agwStyle=FS.FS_LEFT) floatspin.SetFormat("%f") floatspin.SetDigits(2) # our normal wxApp-derived class, as usual app = wx.App(0) frame = MyFrame(None) app.SetTopWindow(frame) frame.Show() app.MainLoop() Events ====== :class:`FloatSpin` catches 3 different types of events: 1) Spin events: events generated by spinning up/down the spinbutton; 2) Char events: playing with up/down arrows of the keyboard increase/decrease the value of :class:`FloatSpin`; 3) Mouse wheel event: using the wheel will change the value of :class:`FloatSpin`. In addition, there are some other functionalities: - It remembers the initial value as a default value, call meth:~FloatSpin.SetToDefaultValue`, or press ``Esc`` to return to it; - ``Shift`` + arrow = 2 * increment (or ``Shift`` + mouse wheel); - ``Ctrl`` + arrow = 10 * increment (or ``Ctrl`` + mouse wheel); - ``Alt`` + arrow = 100 * increment (or ``Alt`` + mouse wheel); - Combinations of ``Shift``, ``Ctrl``, ``Alt`` increment the :class:`FloatSpin` value by the product of the factors; - ``PgUp`` & ``PgDn`` = 10 * increment * the product of the ``Shift``, ``Ctrl``, ``Alt`` factors; - ``Space`` sets the control's value to it's last valid state. Window Styles ============= This class supports the following window styles: =============== =========== ================================================== Window Styles Hex Value Description =============== =========== ================================================== ``FS_READONLY`` 0x1 Sets :class:`FloatSpin` as read-only control. ``FS_LEFT`` 0x2 Horizontally align the underlying :class:`TextCtrl` on the left. ``FS_CENTRE`` 0x4 Horizontally align the underlying :class:`TextCtrl` on center. ``FS_RIGHT`` 0x8 Horizontally align the underlying :class:`TextCtrl` on the right. =============== =========== ================================================== Events Processing ================= This class processes the following events: ================= ================================================== Event Name Description ================= ================================================== ``EVT_FLOATSPIN`` Emitted when the user changes the value of :class:`FloatSpin`, either with the mouse or with the keyboard. ================= ================================================== License And Version =================== :class:`FloatSpin` control is distributed under the wxPython license. Latest revision: Andrea Gavana @ 03 Jan 2014, 23.00 GMT Version 0.9 Backward Incompatibilities ========================== Modifications to allow `min_val` or `max_val` to be ``None`` done by: James Bigler, SCI Institute, University of Utah, March 14, 2007 :note: Note that the changes I made will break backward compatibility, because I changed the contructor's parameters from `min` / `max` to `min_val` / `max_val` to be consistent with the other functions and to eliminate any potential confusion with the built in `min` and `max` functions. You specify open ranges like this (you can equally do this in the constructor):: SetRange(min_val=1, max_val=None) # [1, ] SetRange(min_val=None, max_val=0) # [ , 0] or no range:: SetRange(min_val=None, max_val=None) # [ , ] """ def Property(func): return property(**func()) #---------------------------------------------------------------------- # Beginning Of FLOATSPIN wxPython Code #---------------------------------------------------------------------- import wx import locale from math import ceil, floor # Set The Styles For The Underline wx.TextCtrl FS_READONLY = 1 """ Sets :class:`FloatSpin` as read-only control. """ FS_LEFT = 2 """ Horizontally align the underlying :class:`TextCtrl` on the left. """ FS_CENTRE = 4 """ Horizontally align the underlying :class:`TextCtrl` on center. """ FS_RIGHT = 8 """ Horizontally align the underlying :class:`TextCtrl` on the right. """ # Define The FloatSpin Event wxEVT_FLOATSPIN = wx.NewEventType() #-----------------------------------# # FloatSpinEvent #-----------------------------------# EVT_FLOATSPIN = wx.PyEventBinder(wxEVT_FLOATSPIN, 1) """ Emitted when the user changes the value of :class:`FloatSpin`, either with the mouse or""" \ """ with the keyboard. """ # ---------------------------------------------------------------------------- # # Class FloatSpinEvent # ---------------------------------------------------------------------------- # class FloatSpinEvent(wx.PyCommandEvent): """ This event will be sent when a ``EVT_FLOATSPIN`` event is mapped in the parent. """ def __init__(self, eventType, eventId=1, nSel=-1, nOldSel=-1): """ Default class constructor. :param `eventType`: the event type; :param `eventId`: the event identifier; :param `nSel`: the current selection; :param `nOldSel`: the old selection. """ wx.PyCommandEvent.__init__(self, eventType, eventId) self._eventType = eventType def SetPosition(self, pos): """ Sets event position. :param `pos`: an integer specyfing the event position. """ self._position = pos def GetPosition(self): """ Returns event position. """ return self._position #---------------------------------------------------------------------------- # FloatTextCtrl #---------------------------------------------------------------------------- class FloatTextCtrl(wx.TextCtrl): """ A class which holds a :class:`TextCtrl`, one of the two building blocks of :class:`FloatSpin`. """ def __init__(self, parent, id=wx.ID_ANY, value="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.TE_NOHIDESEL | wx.TE_PROCESS_ENTER, validator=wx.DefaultValidator, name=wx.TextCtrlNameStr): """ Default class constructor. Used internally. Do not call directly this class in your code! :param `parent`: the :class:`FloatTextCtrl` parent; :param `id`: an identifier for the control: a value of -1 is taken to mean a default; :param `value`: default text value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the window style; :param `validator`: the window validator; :param `name`: the window name. """ wx.TextCtrl.__init__(self, parent, id, value, pos, size, style, validator, name) self._parent = parent self._selection = (-1, -1) self._value = value self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy) self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) self.Bind(wx.EVT_SET_FOCUS, self.OnFocus) self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) def OnDestroy(self, event): """ Handles the ``wx.EVT_WINDOW_DESTROY`` event for :class:`FloatTextCtrl`. :param `event`: a :class:`WindowDestroyEvent` event to be processed. :note: This method tries to correctly handle the control destruction under MSW. """ if self._parent: self._parent._textctrl = None self._parent = None def OnKeyDown(self, event): """ Handles the ``wx.EVT_KEYDOWN`` event for :class:`FloatTextCtrl`. :param `event`: a :class:`KeyEvent` event to be processed. """ if self._parent: self._parent.OnKeyDown(event) def OnFocus(self, event): self._value = self.Value self.RestoreSelection() event.Skip() def OnKillFocus(self, event): """ Handles the ``wx.EVT_KILL_FOCUS`` event for :class:`FloatTextCtrl`. :param `event`: a :class:`FocusEvent` event to be processed. :note: This method synchronizes the :class:`SpinButton` and the :class:`TextCtrl` when focus is lost. """ self._selection = self.GetSelection() if self._parent and self.Value != self._value: self._parent.SyncSpinToText(True) self.SetSelection(0, 0) event.Skip() def RestoreSelection(self): """ Restores the selection under Mac OS X, selects all under other platforms (consistent with default wx.TextCtrl behaviour) """ if "__WXMAC__" in wx.PlatformInfo and self._selection != (-1, -1): self.SetSelection(*self._selection) else: self.SelectAll() #---------------------------------------------------------------------------- # # FloatSpin # This Is The Main Class Implementation # ---------------------------------------------------------------------------- # class FloatSpin(wx.PyControl): """ :class:`FloatSpin` implements a floating point :class:`SpinCtrl`. It is built using a custom :class:`PyControl`, composed by a :class:`TextCtrl` and a :class:`SpinButton`. In order to correctly handle floating points numbers without rounding errors or non-exact floating point representations, :class:`FloatSpin` uses the great :class:`FixedPoint` class from Tim Peters. """ _spinwidth = 0 def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(95,-1), style=0, value=0.0, min_val=None, max_val=None, increment=1.0, digits=-1, agwStyle=FS_LEFT, name="FloatSpin"): """ Default class constructor. :param `parent`: the :class:`FloatSpin` parent; :param `id`: an identifier for the control: a value of -1 is taken to mean a default; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the window style; :param `value`: is the current value for :class:`FloatSpin`; :param `min_val`: the minimum value, ignored if ``None``; :param `max_val`: the maximum value, ignored if ``None``; :param `increment`: the increment for every :class:`FloatSpinEvent` event; :param `digits`: number of representative digits for your floating point numbers; :param `agwStyle`: one of the following bits: =============== =========== ================================================== Window Styles Hex Value Description =============== =========== ================================================== ``FS_READONLY`` 0x1 Sets :class:`FloatSpin` as read-only control. ``FS_LEFT`` 0x2 Horizontally align the underlying :class:`TextCtrl` on the left. ``FS_CENTRE`` 0x4 Horizontally align the underlying :class:`TextCtrl` on center. ``FS_RIGHT`` 0x8 Horizontally align the underlying :class:`TextCtrl` on the right. =============== =========== ================================================== :param `name`: the window name. """ wx.PyControl.__init__(self, parent, id, pos, size, style|wx.NO_BORDER| wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_CHILDREN, wx.DefaultValidator, name) # Don't call SetRange here, because it will try to modify # self._value whose value doesn't exist yet. self.SetRangeDontClampValue(min_val, max_val) self._value = self.ClampValue(FixedPoint(str(value), 20)) self._defaultvalue = self._value self._increment = FixedPoint(str(increment), 20) self._spinmodifier = FixedPoint(str(1.0), 20) self._digits = digits self._snapticks = False self._spinbutton = None self._ignore_spin_event = False self._textctrl = None self._spinctrl_bestsize = wx.Size(-999, -999) self._enabled = True # start Philip Semanchuk addition # The textbox & spin button are drawn slightly differently # depending on the platform. The difference is most pronounced # under OS X. if "__WXMAC__" in wx.PlatformInfo: self._gap = 8 self._spin_top = 3 self._text_left = 4 self._text_top = 4 elif "__WXMSW__" in wx.PlatformInfo: self._gap = 1 self._spin_top = 0 self._text_left = 0 self._text_top = 0 else: # GTK if "gtk3" in wx.PlatformInfo: self._gap = 1 else: self._gap = -1 self._spin_top = 0 self._text_left = 0 self._text_top = 0 # end Philip Semanchuk addition self.SetLabel(name) self.SetForegroundColour(parent.GetForegroundColour()) width = size[0] height = size[1] best_size = self.DoGetBestSize() if width == -1: width = best_size.GetWidth() if height == -1: height = best_size.GetHeight() self._validkeycode = [43, 44, 45, 46, 69, 101] self._validkeycode.extend(range(48, 58)) self._validkeycode.extend([wx.WXK_BACK, wx.WXK_DELETE, wx.WXK_LEFT, wx.WXK_RIGHT, wx.WXK_NUMPAD0, wx.WXK_NUMPAD1, wx.WXK_NUMPAD2, wx.WXK_NUMPAD3, wx.WXK_NUMPAD4, wx.WXK_NUMPAD5, wx.WXK_NUMPAD6, wx.WXK_NUMPAD7, wx.WXK_NUMPAD8, wx.WXK_NUMPAD9, wx.WXK_NUMPAD_ADD, wx.WXK_NUMPAD_DECIMAL, wx.WXK_NUMPAD_SEPARATOR, wx.WXK_NUMPAD_SUBTRACT]) self._spinbutton = wx.SpinButton(self, wx.ID_ANY, wx.DefaultPosition, size=(-1, height), style=wx.SP_ARROW_KEYS | wx.SP_VERTICAL | wx.SP_WRAP) self._spinbutton.SetRange(-2 ** 32 / 2.0, 2 ** 32 / 2.0 - 1) self._spinbutton.AcceptsFocusFromKeyboard = lambda: False if "gtk3" in wx.PlatformInfo: if not FloatSpin._spinwidth: spin = wx.SpinCtrl(self, -1) text = wx.TextCtrl(self, -1) FloatSpin._spinwidth = spin.Size[0] - text.Size[0] + 11 spin.Destroy() text.Destroy() self._spinbutton.MaxSize = FloatSpin._spinwidth, height txtstyle = wx.TE_NOHIDESEL | wx.TE_PROCESS_ENTER if agwStyle & FS_RIGHT: txtstyle = txtstyle | wx.TE_RIGHT elif agwStyle & FS_CENTRE: txtstyle = txtstyle | wx.TE_CENTER if agwStyle & FS_READONLY: txtstyle = txtstyle | wx.TE_READONLY self._textctrl = FloatTextCtrl(self, wx.ID_ANY, "", wx.DefaultPosition, (width-self._spinbutton.GetSize().GetWidth(), height), txtstyle) # start Philip Semanchuk addition # Setting the textctrl's size in the ctor also sets its min size. # But the textctrl is entirely controlled by the parent floatspin # control and should accept whatever size its parent dictates, so # here we tell it to forget its min size. self._textctrl.SetMinSize(wx.DefaultSize) # Setting the spin buttons's size in the ctor also sets its min size. # Under OS X that results in a rendering artifact because spin buttons # are a little shorter than textboxes. # Setting the min size to the default allows OS X to draw the spin # button correctly. However, Windows and KDE take the call to # SetMinSize() as a cue to size the spin button taller than the # textbox, so we avoid the call there. if "__WXMAC__" in wx.PlatformInfo: self._spinbutton.SetMinSize(wx.DefaultSize) # end Philip Semanchuk addition self._mainsizer = wx.BoxSizer(wx.HORIZONTAL) # Ensure the spin button is shown, and the text widget takes # all remaining free space self._mainsizer.Add(self._textctrl, 1) if "gtk3" in wx.PlatformInfo: self._mainsizer.Add((self._gap, 1), 0) self._mainsizer.Add(self._spinbutton, 0) self.SetSizer(self._mainsizer) self._mainsizer.Layout() self.SetFormat() if not (agwStyle & FS_READONLY): self.Bind(wx.EVT_SPIN_UP, self.OnSpinUp) self.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown) self._spinbutton.Bind(wx.EVT_LEFT_DOWN, self.OnSpinMouseDown) self._spinbutton.Bind(wx.EVT_LEFT_UP, self.OnSpinMouseUp) self._textctrl.Bind(wx.EVT_TEXT_ENTER, self.OnTextEnter) self._textctrl.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) self._spinbutton.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) self.Bind(wx.EVT_SET_FOCUS, self.OnFocus) if not "gtk3" in wx.PlatformInfo: self.Bind(wx.EVT_SIZE, self.OnSize) if hasattr(self, "SetBestSize"): # Not Phoenix # start Philip Semanchuk move self.SetBestSize((width, height)) # end Philip Semanchuk move def OnDestroy(self, event): """ Handles the ``wx.EVT_WINDOW_DESTROY`` event for :class:`FloatSpin`. :param `event`: a :class:`WindowDestroyEvent` event to be processed. :note: This method tries to correctly handle the control destruction under MSW. """ # Null This Since MSW Sends KILL_FOCUS On Deletion if self._textctrl: self._textctrl._parent = None self._textctrl.Destroy() self._textctrl = None self._spinbutton.Destroy() self._spinbutton = None def DoGetBestSize(self): """ Gets the size which best suits the window: for a control, it would be the minimal size which doesn't truncate the control, for a panel - the same size as it would have after a call to `Fit()`. :note: Overridden from :class:`PyControl`. """ if self._spinctrl_bestsize.x == -999: spin = wx.SpinCtrl(self, -1) self._spinctrl_bestsize = spin.GetBestSize() # oops something went wrong, set to reasonable value if self._spinctrl_bestsize.GetWidth() < 20: self._spinctrl_bestsize.SetWidth(95) if self._spinctrl_bestsize.GetHeight() < 10: self._spinctrl_bestsize.SetHeight(22) spin.Destroy() return self._spinctrl_bestsize def DoSendEvent(self): """ Send the event to the parent. """ event = wx.CommandEvent(wx.wxEVT_COMMAND_SPINCTRL_UPDATED, self.GetId()) event.SetEventObject(self) event.SetInt(int(self._value + 0.5)) if self._textctrl: event.SetString(self._textctrl.GetValue()) self.GetEventHandler().ProcessEvent(event) eventOut = FloatSpinEvent(wxEVT_FLOATSPIN, self.GetId()) eventOut.SetPosition(int(self._value + 0.5)) eventOut.SetEventObject(self) self.GetEventHandler().ProcessEvent(eventOut) def Disable(self): self.Enable(False) def Enable(self, enable=True): """ Enable the child controls. This is needed under wxMac """ wx.PyControl.Enable(self, enable) self._enabled = enable if self._textctrl: self._textctrl.Enable(enable) self._spinbutton.Enable(enable) @Property def Enabled(): def fget(self): return self._enabled def fset(self, enable=True): self.Enable(enable) return locals() def IsEnabled(self): return self._enabled def OnSpinMouseDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for :class:`FloatSpin`. :param `event`: a :class:`MouseEvent` event to be processed. :note: This method works on the underlying :class:`SpinButton`. """ modifier = FixedPoint(str(1.0), 20) if event.ShiftDown(): modifier = modifier*2.0 if event.ControlDown(): modifier = modifier*10.0 if event.AltDown(): modifier = modifier*100.0 self._spinmodifier = modifier self._ignore_spin_event = False event.Skip() def OnSpinMouseUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for :class:`FloatSpin`. :param `event`: a :class:`MouseEvent` event to be processed. :note: This method works on the underlying :class:`SpinButton`. """ if self._textctrl: if "__WXMSW__" in wx.PlatformInfo: self._textctrl.SetFocus() self._textctrl.SelectAll() elif not "__WXMAC__" in wx.PlatformInfo: self._textctrl.SetFocus() self._textctrl.SetSelection(0, 0) self._ignore_spin_event = False event.Skip() def OnSpinUp(self, event): """ Handles the ``wx.EVT_SPIN_UP`` event for :class:`FloatSpin`. :param `event`: a :class:`SpinEvent` event to be processed. """ if self._ignore_spin_event: self._ignore_spin_event = False return if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) if self.InRange(self._value + self._increment*self._spinmodifier): self._value = self._value + self._increment*self._spinmodifier elif self._max is not None: self._value = self._max self.SetValue(self._value) if "__WXMAC__" in wx.PlatformInfo: self._textctrl.SelectAll() self.DoSendEvent() def OnSpinDown(self, event): """ Handles the ``wx.EVT_SPIN_DOWN`` event for :class:`FloatSpin`. :param `event`: a :class:`SpinEvent` event to be processed. """ if self._ignore_spin_event: self._ignore_spin_event = False return if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) if self.InRange(self._value - self._increment*self._spinmodifier): self._value = self._value - self._increment*self._spinmodifier elif self._min is not None: self._value = self._min self.SetValue(self._value) if "__WXMAC__" in wx.PlatformInfo: self._textctrl.SelectAll() self.DoSendEvent() def OnTextEnter(self, event): """ Handles the ``wx.EVT_TEXT_ENTER`` event for :class:`FloatSpin`. :param `event`: a :class:`KeyEvent` event to be processed. :note: This method works on the underlying :class:`TextCtrl`. """ self.SyncSpinToText(True) event.Skip() def OnKeyDown(self, event): """ Handles the ``wx.EVT_KEYDOWN`` event for :class:`FloatSpin`. :param `event`: a :class:`KeyEvent` event to be processed. :note: This method works on the underlying :class:`TextCtrl`. """ modifier = FixedPoint(str(1.0), 20) if event.ShiftDown(): modifier = modifier*2.0 if event.ControlDown(): modifier = modifier*10.0 if event.AltDown(): modifier = modifier*100.0 keycode = event.GetKeyCode() if keycode == wx.WXK_UP: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value + self._increment*modifier) self.DoSendEvent() elif keycode == wx.WXK_DOWN: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value - self._increment*modifier) self.DoSendEvent() elif keycode == wx.WXK_PAGEUP: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value + 10.0*self._increment*modifier) self.DoSendEvent() elif keycode == wx.WXK_PAGEDOWN: if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) self.SetValue(self._value - 10.0*self._increment*modifier) self.DoSendEvent() elif keycode == wx.WXK_SPACE: self.SetValue(self._value) if self._textctrl: self._textctrl.SelectAll() event.Skip(False) elif keycode == wx.WXK_ESCAPE: self.SetToDefaultValue() if self._textctrl: self._textctrl.SelectAll() self.DoSendEvent() elif keycode == wx.WXK_TAB: # The original event code doesn't work under wxGTK focus_next_keyboard_focusable_control(event.EventObject) elif keycode in (wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER): default = self.TopLevelParent.DefaultItem if (default and default.Enabled and default.IsShownOnScreen() and isinstance(default, wx.Button)): default.ProcessEvent(wx.PyCommandEvent(wx.EVT_BUTTON.typeId, default.GetId())) else: if (not event.CmdDown() and not event.ControlDown() and keycode not in self._validkeycode): return event.Skip() def OnMouseWheel(self, event): """ Handles the ``wx.EVT_MOUSEWHEEL`` event for :class:`FloatSpin`. :param `event`: a :class:`MouseEvent` event to be processed. """ modifier = FixedPoint(str(1.0), 20) if event.ShiftDown(): modifier = modifier*2.0 if event.ControlDown(): modifier = modifier*10.0 if event.AltDown(): modifier = modifier*100.0 if self._textctrl and self._textctrl.IsModified(): self.SyncSpinToText(False) if event.GetWheelRotation() > 0: self.SetValue(self._value + self._increment*modifier) else: self.SetValue(self._value - self._increment*modifier) if self._textctrl: if "__WXMAC__" in wx.PlatformInfo: self._textctrl.SelectAll() else: self._textctrl.SetFocus() self._textctrl.SetSelection(0, 0) self.DoSendEvent() def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for :class:`FloatSpin`. :param `event`: a :class:`SizeEvent` event to be processed. :note: This method resizes the text control and reposition the spin button when resized. """ # start Philip Semanchuk addition event_width = event.GetSize().width self._textctrl.SetPosition((self._text_left, self._text_top)) text_width, text_height = self._textctrl.Size spin_width, _ = self._spinbutton.Size text_width = event_width - (spin_width + self._gap + self._text_left) self._textctrl.SetSize(wx.Size(text_width, event.GetSize().height)) # The spin button is always snug against the right edge of the # control. self._spinbutton.SetPosition((event_width - spin_width, self._spin_top)) event.Skip() # end Philip Semanchuk addition def ReplaceDoubleZero(self, strs): """ Replaces the (somewhat) python ugly `+e000` with `+e00`. :param `strs`: a string (possibly) containing a `+e00` substring. """ if self._textformat not in ["%g", "%e", "%E", "%G"]: return strs if strs.find("e+00") >= 0: strs = strs.replace("e+00", "e+0") elif strs.find("e-00") >= 0: strs = strs.replace("e-00", "e-0") elif strs.find("E+00") >= 0: strs = strs.replace("E+00", "E+0") elif strs.find("E-00") >= 0: strs = strs.replace("E-00", "E-0") return strs def SetValue(self, value): """ Sets the :class:`FloatSpin` value. :param `value`: the new value. """ if not self._textctrl or not self.InRange(value): return if self._snapticks and self._increment != 0.0: finite, snap_value = self.IsFinite(value) if not finite: # FIXME What To Do About A Failure? if (snap_value - floor(snap_value) < ceil(snap_value) - snap_value): value = self._defaultvalue + floor(snap_value)*self._increment else: value = self._defaultvalue + ceil(snap_value)*self._increment decimal = locale.localeconv()["decimal_point"] strs = ("%100." + str(self._digits) + self._textformat[1])%value strs = strs.replace(".", decimal) strs = strs.replace(",", ".") strs = strs.strip() strs = self.ReplaceDoubleZero(strs) # Sync spinbutton so that events generated by it match up with the # actual spin direction. # This fixes an issue under GTK and Mac OS X where the EVT_SPIN event # generated by pressing the spin up/down buttons is dependent on the # spin button value (e.g. if the down button is pressed when the button # value is at its minimum, there will always be a EVT_SPIN_UP generated # under GTK, and no event at all under Mac OS X). min_val = self._min if self._min is not None else self._spinbutton.Min max_val = self._max if self._max is not None else self._spinbutton.Max # Scale the value to the spinbutton range spinvalue = int(round(((value - min_val) / float(max_val - min_val)) * self._spinbutton.Max)) # Setting the spin button value causes a EVT_SPIN event to be generated # under GTK, which we need to ignore self._ignore_spin_event = True self._spinbutton.SetValue(spinvalue) if value != self._value or strs != self._textctrl.GetValue(): self._textctrl.SetValue(strs) self._textctrl.DiscardEdits() self._value = value def GetValue(self): """ Returns the :class:`FloatSpin` value. """ return float(self._value) def SetRangeDontClampValue(self, min_val, max_val): """ Sets the allowed range. :param `min_val`: the minimum value for :class:`FloatSpin`. If it is ``None`` it is ignored; :param `max_val`: the maximum value for :class:`FloatSpin`. If it is ``None`` it is ignored. :note: This method doesn't modify the current value. """ if (min_val != None): self._min = FixedPoint(str(min_val), 20) else: self._min = None if (max_val != None): self._max = FixedPoint(str(max_val), 20) else: self._max = None def SetRange(self, min_val, max_val): """ Sets the allowed range. :param `min_val`: the minimum value for :class:`FloatSpin`. If it is ``None`` it is ignored; :param `max_val`: the maximum value for :class:`FloatSpin`. If it is ``None`` it is ignored. :note: This method doesn't modify the current value. :note: You specify open ranges like this (you can equally do this in the constructor):: SetRange(min_val=1, max_val=None) SetRange(min_val=None, max_val=0) or no range:: SetRange(min_val=None, max_val=None) """ self.SetRangeDontClampValue(min_val, max_val) value = self.ClampValue(self._value) if (value != self._value): self.SetValue(value) def ClampValue(self, var): """ Clamps `var` between `_min` and `_max` depending if the range has been specified. :param `var`: the value to be clamped. :return: A clamped copy of `var`. """ if (self._min != None): if (var < self._min): var = self._min return var if (self._max != None): if (var > self._max): var = self._max return var def SetIncrement(self, increment): """ Sets the increment for every ``EVT_FLOATSPIN`` event. :param `increment`: a floating point number specifying the :class:`FloatSpin` increment. """ if increment < 1./10.0**self._digits: raise Exception("\nERROR: Increment Should Be Greater Or Equal To 1/(10**digits).") self._increment = FixedPoint(str(increment), 20) self.SetValue(self._value) def GetIncrement(self): """ Returns the increment for every ``EVT_FLOATSPIN`` event. """ return self._increment def SetDigits(self, digits=-1): """ Sets the number of digits to show. :param `digits`: the number of digits to show. If `digits` < 0, :class:`FloatSpin` tries to calculate the best number of digits based on input values passed in the constructor. """ if digits < 0: incr = str(self._increment) if incr.find(".") < 0: digits = 0 else: digits = len(incr[incr.find(".")+1:]) self._digits = digits self.SetValue(self._value) def GetDigits(self): """ Returns the number of digits shown. """ return self._digits def SetFormat(self, fmt="%f"): """ Set the string format to use. :param `fmt`: the new string format to use. One of the following strings: ====== ================================= Format Description ====== ================================= 'e' Floating point exponential format (lowercase) 'E' Floating point exponential format (uppercase) 'f' Floating point decimal format 'F' Floating point decimal format 'g' Floating point format. Uses lowercase exponential format if exponent is less than -4 or not less than precision, decimal format otherwise 'G' Floating point format. Uses uppercase exponential format if exponent is less than -4 or not less than precision, decimal format otherwise ====== ================================= """ if fmt not in ["%f", "%g", "%e", "%E", "%F", "%G"]: raise Exception('\nERROR: Bad Float Number Format: ' + repr(fmt) + '. It Should Be ' \ 'One Of "%f", "%g", "%e", "%E", "%F", "%G"') self._textformat = fmt if self._digits < 0: self.SetDigits() else: self.SetValue(self._value) def GetFormat(self): """ Returns the string format in use. :see: :meth:`~FloatSpin.SetFormat` for a list of valid string formats. """ return self._textformat def SetDefaultValue(self, defaultvalue): """ Sets the :class:`FloatSpin` default value. :param `defaultvalue`: a floating point value representing the new default value for :class:`FloatSpin`. """ if self.InRange(defaultvalue): self._defaultvalue = FixedPoint(str(defaultvalue), 20) def GetDefaultValue(self): """ Returns the :class:`FloatSpin` default value. """ return self._defaultvalue def IsDefaultValue(self): """ Returns whether the current value is the default value or not. """ return self._value == self._defaultvalue def SetToDefaultValue(self): """ Sets :class:`FloatSpin` value to its default value. """ self.SetValue(self._defaultvalue) def SetSnapToTicks(self, forceticks=True): """ Force the value to always be divisible by the increment. Initially ``False``. :param `forceticks`: ``True`` to force the snap to ticks option, ``False`` otherwise. :note: This uses the default value as the basis, you will get strange results for very large differences between the current value and default value when the increment is very small. """ if self._snapticks != forceticks: self._snapticks = forceticks self.SetValue(self._value) def GetSnapToTicks(self): """ Returns whether the snap to ticks option is active or not. """ return self._snapticks def OnFocus(self, event): """ Handles the ``wx.EVT_SET_FOCUS`` event for :class:`FloatSpin`. :param `event`: a :class:`FocusEvent` event to be processed. """ if self._textctrl: self._textctrl.SetFocus() event.Skip() def SyncSpinToText(self, send_event=True, force_valid=True): """ Synchronize the underlying :class:`TextCtrl` with :class:`SpinButton`. :param `send_event`: ``True`` to send a ``EVT_FLOATSPIN`` event, ``False`` otherwise; :param `force_valid`: ``True`` to force a valid value (i.e. inside the provided range), ``False`` otherwise. """ if not self._textctrl: return curr = self._textctrl.GetValue() curr = curr.strip() decimal = locale.localeconv()["decimal_point"] curr = curr.replace(decimal, ".") curr = curr.replace(",", ".") if curr: try: curro = float(curr) curr = FixedPoint(curr, 20) except: self.SetValue(self._value) return if force_valid or not self.HasRange() or self.InRange(curr): if force_valid and self.HasRange(): curr = self.ClampValue(curr) if self._value != curr: self.SetValue(curr) if send_event: self.DoSendEvent() elif force_valid: # textctrl is out of sync, discard and reset self.SetValue(self.GetValue()) def SetFont(self, font=None): """ Sets the underlying :class:`TextCtrl` font. :param `font`: a valid instance of :class:`Font`. """ if font is None: font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) if not self._textctrl: return False return self._textctrl.SetFont(font) def GetFont(self): """ Returns the underlying :class:`TextCtrl` font. """ if not self._textctrl: return self.GetFont() return self._textctrl.GetFont() def GetMin(self): """ Returns the minimum value for :class:`FloatSpin`. It can be a number or ``None`` if no minimum is present. """ return self._min def GetMax(self): """ Returns the maximum value for :class:`FloatSpin`. It can be a number or ``None`` if no minimum is present. """ return self._max def HasRange(self): """ Returns whether :class:`FloatSpin` range has been set or not. """ return (self._min != None) or (self._max != None) def InRange(self, value): """ Returns whether a value is inside :class:`FloatSpin` range. :param `value`: the value to test. """ if (not self.HasRange()): return True if (self._min != None): if (value < self._min): return False if (self._max != None): if (value > self._max): return False return True def GetTextCtrl(self): """ Returns the underlying :class:`TextCtrl`. """ return self._textctrl def IsFinite(self, value): """ Tries to determine if a value is finite or infinite/NaN. :param `value`: the value to test. """ try: snap_value = (value - self._defaultvalue)/self._increment finite = True except: finite = False snap_value = None return finite, snap_value if wx.VERSION >= (3, ): # Use wx.SpinCtrlDouble EVT_FLOATSPIN = wx.EVT_SPINCTRLDOUBLE class FloatSpin(wx.SpinCtrlDouble): _spinwidth = 0 def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(95,-1), style=wx.SP_ARROW_KEYS | wx.ALIGN_RIGHT, value=0.0, min_val=None, max_val=None, increment=1.0, digits=-1, agwStyle=FS_LEFT, name="FloatSpin"): if "gtk3" in wx.PlatformInfo: if not FloatSpin._spinwidth: spin = wx.SpinCtrl(parent, -1) text = wx.TextCtrl(parent, -1) FloatSpin._spinwidth = spin.Size[0] - text.Size[0] + 11 spin.Destroy() text.Destroy() size = size[0] + FloatSpin._spinwidth, size[1] if agwStyle & FS_RIGHT: style = style | wx.TE_RIGHT elif agwStyle & FS_CENTRE: style = style | wx.TE_CENTER if agwStyle & FS_READONLY: style = style | wx.TE_READONLY wx.SpinCtrlDouble.__init__(self, parent, id, str(value), pos, size, style, min_val or 0, max_val or 100, value, increment, name) if digits > -1: self.SetDigits(digits) # Class FixedPoint, version 0.0.4. # Released to the public domain 28-Mar-2001, # by Tim Peters (tim.one@home.com). # Provided as-is; use at your own risk; no warranty; no promises; enjoy! # 28-Mar-01 ver 0.0,4 # Use repr() instead of str() inside __str__, because str(long) changed # since this was first written (used to produce trailing "L", doesn't # now). # # 09-May-99 ver 0,0,3 # Repaired __sub__(FixedPoint, string); was blowing up. # Much more careful conversion of float (now best possible). # Implemented exact % and divmod. # # 14-Oct-98 ver 0,0,2 # Added int, long, frac. Beefed up docs. Removed DECIMAL_POINT # and MINUS_SIGN globals to discourage bloating this class instead # of writing formatting wrapper classes (or subclasses) # # 11-Oct-98 ver 0,0,1 # posted to c.l.py __version__ = 0, 0, 4 # The default value for the number of decimal digits carried after the # decimal point. This only has effect at compile-time. DEFAULT_PRECISION = 2 """ The default value for the number of decimal digits carried after the decimal point. This only has effect at compile-time. """ class FixedPoint(object): """ FixedPoint objects support decimal arithmetic with a fixed number of digits (called the object's precision) after the decimal point. The number of digits before the decimal point is variable & unbounded. The precision is user-settable on a per-object basis when a FixedPoint is constructed, and may vary across FixedPoint objects. The precision may also be changed after construction via `FixedPoint.set_precision(p)`. Note that if the precision of a FixedPoint is reduced via :meth:`FixedPoint.set_precision() `, information may be lost to rounding. Example:: >>> x = FixedPoint("5.55") # precision defaults to 2 >>> print x 5.55 >>> x.set_precision(1) # round to one fraction digit >>> print x 5.6 >>> print FixedPoint("5.55", 1) # same thing setting to 1 in constructor 5.6 >>> repr(x) # returns constructor string that reproduces object exactly "FixedPoint('5.6', 1)" >>> When :class:`FixedPoint` objects of different precision are combined via + - * /, the result is computed to the larger of the inputs' precisions, which also becomes the precision of the resulting :class:`FixedPoint` object. Example:: >>> print FixedPoint("3.42") + FixedPoint("100.005", 3) 103.425 >>> When a :class:`FixedPoint` is combined with other numeric types (ints, floats, strings representing a number) via + - * /, then similarly the computation is carried out using -- and the result inherits -- the :class:`FixedPoint`'s precision. Example:: >>> print FixedPoint(1) / 7 0.14 >>> print FixedPoint(1, 30) / 7 0.142857142857142857142857142857 >>> The string produced by `str(x)` (implictly invoked by `print`) always contains at least one digit before the decimal point, followed by a decimal point, followed by exactly `x.get_precision()` digits. If `x` is negative, `str(x)[0] == "-"`. The :class:`FixedPoint` constructor can be passed an int, long, string, float, :class:`FixedPoint`, or any object convertible to a float via `float()` or to a long via `long()`. Passing a precision is optional; if specified, the precision must be a non-negative int. There is no inherent limit on the size of the precision, but if very very large you'll probably run out of memory. Note that conversion of floats to :class:`FixedPoint` can be surprising, and should be avoided whenever possible. Conversion from string is exact (up to final rounding to the requested precision), so is greatly preferred. Example:: >>> print FixedPoint(1.1e30) 1099999999999999993725589651456.00 >>> print FixedPoint("1.1e30") 1100000000000000000000000000000.00 >>> """ # the exact value is self.n / 10**self.p; # self.n is a long; self.p is an int def __init__(self, value=0, precision=DEFAULT_PRECISION): """ Default class constructor. :param `value`: the initial value; :param `precision`: must be an int >= 0, and defaults to ``DEFAULT_PRECISION``. """ self.n = self.p = 0 self.set_precision(precision) p = self.p if isinstance(value, type("42.3e5")): n, exp = _string2exact(value) # exact value is n*10**exp = n*10**(exp+p)/10**p effective_exp = exp + p if effective_exp > 0: n = n * _tento(effective_exp) elif effective_exp < 0: n = _roundquotient(n, _tento(-effective_exp)) self.n = n return if isinstance(value, type(42)) or isinstance(value, type(42L)): self.n = long(value) * _tento(p) return if isinstance(value, FixedPoint): temp = value.copy() temp.set_precision(p) self.n, self.p = temp.n, temp.p return if isinstance(value, type(42.0)): # XXX ignoring infinities and NaNs and overflows for now import math f, e = math.frexp(abs(value)) assert f == 0 or 0.5 <= f < 1.0 # |value| = f * 2**e exactly # Suck up CHUNK bits at a time; 28 is enough so that we suck # up all bits in 2 iterations for all known binary double- # precision formats, and small enough to fit in an int. CHUNK = 28 top = 0L # invariant: |value| = (top + f) * 2**e exactly while f: f = math.ldexp(f, CHUNK) digit = int(f) assert digit >> CHUNK == 0 top = (top << CHUNK) | digit f = f - digit assert 0.0 <= f < 1.0 e = e - CHUNK # now |value| = top * 2**e exactly # want n such that n / 10**p = top * 2**e, or # n = top * 10**p * 2**e top = top * _tento(p) if e >= 0: n = top << e else: n = _roundquotient(top, 1L << -e) if value < 0: n = -n self.n = n return if isinstance(value, type(42-42j)): raise TypeError("can't convert complex to FixedPoint: " + `value`) # can we coerce to a float? yes = 1 try: asfloat = float(value) except: yes = 0 if yes: self.__init__(asfloat, p) return # similarly for long yes = 1 try: aslong = long(value) except: yes = 0 if yes: self.__init__(aslong, p) return raise TypeError("can't convert to FixedPoint: " + `value`) def get_precision(self): """ Return the precision of this :class:`FixedPoint`. :note: The precision is the number of decimal digits carried after the decimal point, and is an int >= 0. """ return self.p def set_precision(self, precision=DEFAULT_PRECISION): """ Change the precision carried by this :class:`FixedPoint` to `precision`. :param `precision`: must be an int >= 0, and defaults to ``DEFAULT_PRECISION``. :note: If `precision` is less than this :class:`FixedPoint`'s current precision, information may be lost to rounding. """ try: p = int(precision) except: raise TypeError("precision not convertable to int: " + `precision`) if p < 0: raise ValueError("precision must be >= 0: " + `precision`) if p > self.p: self.n = self.n * _tento(p - self.p) elif p < self.p: self.n = _roundquotient(self.n, _tento(self.p - p)) self.p = p def __str__(self): n, p = self.n, self.p i, f = divmod(abs(n), _tento(p)) if p: frac = repr(f)[:-1] frac = "0" * (p - len(frac)) + frac else: frac = "" return "-"[:n<0] + \ repr(i)[:-1] + \ "." + frac def __repr__(self): return "FixedPoint" + `(str(self), self.p)` def copy(self): """ Create a copy of the current :class:`FixedPoint`. """ return _mkFP(self.n, self.p) __copy__ = __deepcopy__ = copy def __cmp__(self, other): if (other is None): return 1 xn, yn, p = _norm(self, other) return cmp(xn, yn) def __hash__(self): # caution! == values must have equal hashes, and a FixedPoint # is essentially a rational in unnormalized form. There's # really no choice here but to normalize it, so hash is # potentially expensive. n, p = self.__reduce() # Obscurity: if the value is an exact integer, p will be 0 now, # so the hash expression reduces to hash(n). So FixedPoints # that happen to be exact integers hash to the same things as # their int or long equivalents. This is Good. But if a # FixedPoint happens to have a value exactly representable as # a float, their hashes may differ. This is a teensy bit Bad. return hash(n) ^ hash(p) def __nonzero__(self): return self.n != 0 def __neg__(self): return _mkFP(-self.n, self.p) def __abs__(self): if self.n >= 0: return self.copy() else: return -self def __add__(self, other): n1, n2, p = _norm(self, other) # n1/10**p + n2/10**p = (n1+n2)/10**p return _mkFP(n1 + n2, p) __radd__ = __add__ def __sub__(self, other): if not isinstance(other, FixedPoint): other = FixedPoint(other, self.p) return self.__add__(-other) def __rsub__(self, other): return (-self) + other def __mul__(self, other): n1, n2, p = _norm(self, other) # n1/10**p * n2/10**p = (n1*n2/10**p)/10**p return _mkFP(_roundquotient(n1 * n2, _tento(p)), p) __rmul__ = __mul__ def __div__(self, other): n1, n2, p = _norm(self, other) if n2 == 0: raise ZeroDivisionError("FixedPoint division") if n2 < 0: n1, n2 = -n1, -n2 # n1/10**p / (n2/10**p) = n1/n2 = (n1*10**p/n2)/10**p return _mkFP(_roundquotient(n1 * _tento(p), n2), p) def __rdiv__(self, other): n1, n2, p = _norm(self, other) return _mkFP(n2, p) / self def __divmod__(self, other): n1, n2, p = _norm(self, other) if n2 == 0: raise ZeroDivisionError("FixedPoint modulo") # floor((n1/10**p)/(n2*10**p)) = floor(n1/n2) q = n1 / n2 # n1/10**p - q * n2/10**p = (n1 - q * n2)/10**p return q, _mkFP(n1 - q * n2, p) def __rdivmod__(self, other): n1, n2, p = _norm(self, other) return divmod(_mkFP(n2, p), self) def __mod__(self, other): return self.__divmod__(other)[1] def __rmod__(self, other): n1, n2, p = _norm(self, other) return _mkFP(n2, p).__mod__(self) # caution! float can lose precision def __float__(self): n, p = self.__reduce() return float(n) / float(_tento(p)) # XXX should this round instead? # XXX note e.g. long(-1.9) == -1L and long(1.9) == 1L in Python # XXX note that __int__ inherits whatever __long__ does, # XXX and .frac() is affected too def __long__(self): answer = abs(self.n) / _tento(self.p) if self.n < 0: answer = -answer return answer def __int__(self): return int(self.__long__()) def frac(self): """ Returns fractional portion as a :class:`FixedPoint`. :note: In :class:`FixedPoint`, this equality holds true:: x = x.frac() + long(x) """ return self - long(self) # return n, p s.t. self == n/10**p and n % 10 != 0 def __reduce(self): n, p = self.n, self.p if n == 0: p = 0 while p and n % 10 == 0: p = p - 1 n = n / 10 return n, p # return 10L**n def _tento(n, cache={}): try: return cache[n] except KeyError: answer = cache[n] = 10L ** n return answer # return xn, yn, p s.t. # p = max(x.p, y.p) # x = xn / 10**p # y = yn / 10**p # # x must be FixedPoint to begin with; if y is not FixedPoint, # it inherits its precision from x. # # Note that this is called a lot, so default-arg tricks are helpful. def _norm(x, y, isinstance=isinstance, FixedPoint=FixedPoint, _tento=_tento): assert isinstance(x, FixedPoint) if not isinstance(y, FixedPoint): y = FixedPoint(y, x.p) xn, yn = x.n, y.n xp, yp = x.p, y.p if xp > yp: yn = yn * _tento(xp - yp) p = xp elif xp < yp: xn = xn * _tento(yp - xp) p = yp else: p = xp # same as yp return xn, yn, p def _mkFP(n, p, FixedPoint=FixedPoint): f = FixedPoint() f.n = n f.p = p return f # divide x by y, rounding to int via nearest-even # y must be > 0 # XXX which rounding modes are useful? def _roundquotient(x, y): assert y > 0 n, leftover = divmod(x, y) c = cmp(leftover << 1, y) # c < 0 <-> leftover < y/2, etc if c > 0 or (c == 0 and (n & 1) == 1): n = n + 1 return n # crud for parsing strings import re # There's an optional sign at the start, and an optional exponent # at the end. The exponent has an optional sign and at least one # digit. In between, must have either at least one digit followed # by an optional fraction, or a decimal point followed by at least # one digit. Yuck. _parser = re.compile(r""" \s* (?P[-+])? ( (?P\d+) (\. (?P\d*))? | \. (?P\d+) ) ([eE](?P[-+]? \d+))? \s* $ """, re.VERBOSE).match del re # return n, p s.t. float string value == n * 10**p exactly def _string2exact(s): m = _parser(s) if m is None: raise ValueError("can't parse as number: " + `s`) exp = m.group('exp') if exp is None: exp = 0 else: exp = int(exp) intpart = m.group('int') if intpart is None: intpart = "0" fracpart = m.group('onlyfrac') else: fracpart = m.group('frac') if fracpart is None or fracpart == "": fracpart = "0" assert intpart assert fracpart i, f = long(intpart), long(fracpart) nfrac = len(fracpart) i = i * _tento(nfrac) + f exp = exp - nfrac if m.group('sign') == "-": i = -i return i, exp def get_all_keyboard_focusable_children(parent): """ Get all keyboard focusable children of parent """ children = [] try: iter(parent.Children) # Under Mac OS X panels may have non-iterator children except: pass else: for child in parent.Children: if child.Enabled and child.IsShownOnScreen(): if child.AcceptsFocusFromKeyboard(): if not isinstance(child, wx.RadioButton) or child.Value: children.append(child) if child.Children: children.extend(get_all_keyboard_focusable_children(child)) return children def focus_next_keyboard_focusable_control(control): """ Focus the next control in tab order that can gain focus. If the shift key is held down, tab order is reversed. """ # Find the last panel in the hierarchy of parents parent = control.Parent focusparent = None while parent: if isinstance(parent, (wx.Panel, wx.PyPanel)): focusparent = parent parent = parent.Parent if focusparent: children = get_all_keyboard_focusable_children(focusparent) if wx.GetKeyState(wx.WXK_SHIFT): children = list(reversed(children)) for i, child in enumerate(children): if child is control: for next in children[i + 1:] + children[:i]: if next is not child.Parent: next.SetFocus() break break DisplayCAL-3.5.0.0/DisplayCAL/gtypes.py0000644000076500000000000000055712665102054017320 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from ctypes import Structure, c_char_p, c_int, c_uint class gchar_p(c_char_p): # represents "[const] gchar*" pass class gint(c_int): pass class guint(c_uint): pass class guint32(c_uint): pass class GQuark(guint32): pass class GError(Structure): _fields_ = [("domain", GQuark), ("code", gint), ("message", gchar_p)] DisplayCAL-3.5.0.0/DisplayCAL/ICCProfile.py0000644000076500000000000060123213242301247017716 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement from copy import copy from hashlib import md5 import atexit import binascii import ctypes import datetime import locale import math import os import re import struct import sys import warnings import zlib from itertools import izip, imap from time import localtime, mktime, strftime from UserString import UserString if sys.platform == "win32": import _winreg else: import subprocess as sp if sys.platform == "darwin": from platform import mac_ver if sys.platform == "win32": try: import win32api import win32gui except ImportError: pass try: import colord except ImportError: class Colord: Colord = None def quirk_manufacturer(self, manufacturer): return manufacturer def which(self, executable, paths=None): return None colord = Colord() import colormath import edid import imfile from colormath import NumberTuple from defaultpaths import iccprofiles, iccprofiles_home from encoding import get_encodings from options import test_input_curve_clipping from ordereddict import OrderedDict try: from log import safe_print except ImportError: from safe_print import safe_print from util_decimal import float2dec from util_list import intlist from util_str import hexunescape, safe_str, safe_unicode if sys.platform not in ("darwin", "win32"): from defaultpaths import xdg_config_dirs, xdg_config_home from edid import get_edid from util_x import get_display try: import xrandr except ImportError: xrandr = None from util_os import dlopen, which elif sys.platform == "win32": import util_win if sys.getwindowsversion() < (6, ): # WCS only available under Vista and later mscms = None else: mscms = util_win._get_mscms_dll_handle() if mscms: mscms.WcsGetDefaultColorProfileSize.restype = ctypes.c_bool mscms.WcsGetDefaultColorProfile.restype = ctypes.c_bool mscms.WcsAssociateColorProfileWithDevice.restype = ctypes.c_bool mscms.WcsDisassociateColorProfileFromDevice.restype = ctypes.c_bool elif sys.platform == "darwin": from util_mac import osascript # Gamut volumes in cubic colorspace units (L*a*b*) as reported by Argyll's # iccgamut GAMUT_VOLUME_SRGB = 833675.435316 # rel. col. GAMUT_VOLUME_ADOBERGB = 1209986.014983 # rel. col. GAMUT_VOLUME_SMPTE431_P3 = 1176953.485921 # rel. col. # http://msdn.microsoft.com/en-us/library/dd371953%28v=vs.85%29.aspx COLORPROFILESUBTYPE = {"NONE": 0x0000, "RGB_WORKING_SPACE": 0x0001, "PERCEPTUAL": 0x0002, "ABSOLUTE_COLORIMETRIC": 0x0004, "RELATIVE_COLORIMETRIC": 0x0008, "SATURATION": 0x0010, "CUSTOM_WORKING_SPACE": 0x0020} # http://msdn.microsoft.com/en-us/library/dd371955%28v=vs.85%29.aspx (wrong) # http://msdn.microsoft.com/en-us/library/windows/hardware/ff546018%28v=vs.85%29.aspx (ok) COLORPROFILETYPE = {"ICC": 0, "DMP": 1, "CAMP": 2, "GMMP": 3} WCS_PROFILE_MANAGEMENT_SCOPE = {"SYSTEM_WIDE": 0, "CURRENT_USER": 1} ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE = 2015 debug = False enc, fs_enc = get_encodings() cmms = {"argl": "ArgyllCMS", "ADBE": "Adobe", "ACMS": "Agfa", "Agfa": "Agfa", "APPL": "Apple", "appl": "Apple", "CCMS": "ColorGear", "UCCM": "ColorGear Lite", "DL&C": "Digital Light & Color", "EFI ": "EFI", "FF ": "Fuji Film", "HCMM": "Harlequin RIP", "LgoS": "LogoSync", "HDM ": "Heidelberg", "Lino": "Linotype", "lino": "Linotype", "lcms": "Little CMS", "KCMS": "Kodak", "MCML": "Konica Minolta", "MSFT": "Microsoft", "SIGN": "Mutoh", "RGMS": "DeviceLink", "SICC": "SampleICC", "32BT": "the imaging factory", "WTG ": "Ware to Go", "zc00": "Zoran"} encodings = { "mac": { 141: "africaans", 36: "albanian", 85: "amharic", 12: "arabic", 51: "armenian", 68: "assamese", 134: "aymara", 49: "azerbaijani-cyrllic", 50: "azerbaijani-arabic", 129: "basque", 67: "bengali", 137: "dzongkha", 142: "breton", 44: "bulgarian", 77: "burmese", 46: "byelorussian", 78: "khmer", 130: "catalan", 92: "chewa", 33: "simpchinese", 19: "tradchinese", 18: "croatian", 38: "czech", 7: "danish", 4: "dutch", 0: "roman", 94: "esperanto", 27: "estonian", 30: "faeroese", 31: "farsi", 13: "finnish", 34: "flemish", 1: "french", 140: "galician", 144: "scottishgaelic", 145: "manxgaelic", 52: "georgian", 2: "german", 14: "greek-monotonic", 148: "greek-polytonic", 133: "guarani", 69: "gujarati", 10: "hebrew", 21: "hindi", 26: "hungarian", 15: "icelandic", 81: "indonesian", 143: "inuktitut", 35: "irishgaelic", 146: "irishgaelic-dotsabove", 3: "italian", 11: "japanese", 138: "javaneserom", 73: "kannada", 61: "kashmiri", 48: "kazakh", 90: "kiryarwanda", 54: "kirghiz", 91: "rundi", 23: "korean", 60: "kurdish", 79: "lao", 131: "latin", 28: "latvian", 24: "lithuanian", 43: "macedonian", 93: "malagasy", 83: "malayroman-latin", 84: "malayroman-arabic", 72: "malayalam", 16: "maltese", 66: "marathi", 53: "moldavian", 57: "mongolian", 58: "mongolian-cyrillic", 64: "nepali", 9: "norwegian", 71: "oriya", 87: "oromo", 59: "pashto", 25: "polish", 8: "portuguese", 70: "punjabi", 132: "quechua", 37: "romanian", 32: "russian", 29: "sami", 65: "sanskrit", 42: "serbian", 62: "sindhi", 76: "sinhalese", 39: "slovak", 40: "slovenian", 88: "somali", 6: "spanish", 139: "sundaneserom", 89: "swahili", 5: "swedish", 82: "tagalog", 55: "tajiki", 74: "tamil", 135: "tatar", 75: "telugu", 22: "thai", 63: "tibetan", 86: "tigrinya", 147: "tongan", 17: "turkish", 56: "turkmen", 136: "uighur", 45: "ukrainian", 20: "urdu", 47: "uzbek", 80: "vietnamese", 128: "welsh", 41: "yiddish" } } colorants = { 0: { "description": "unknown", "channels": () }, 1: { "description": "ITU-R BT.709", "channels": ((0.64, 0.33), (0.3, 0.6), (0.15, 0.06)) }, 2: { "description": "SMPTE RP145-1994", "channels": ((0.63, 0.34), (0.31, 0.595), (0.155, 0.07)) }, 3: { "description": "EBU Tech.3213-E", "channels": ((0.64, 0.33), (0.29, 0.6), (0.15, 0.06)) }, 4: { "description": "P22", "channels": ((0.625, 0.34), (0.28, 0.605), (0.155, 0.07)) } } geometry = { 0: "unknown", 1: "0/45 or 45/0", 2: "0/d or d/0" } illuminants = { 0: "unknown", 1: "D50", 2: "D65", 3: "D93", 4: "F2", 5: "D55", 6: "A", 7: "E", 8: "F8" } observers = { 0: "unknown", 1: "CIE 1931", 2: "CIE 1964" } manufacturers = {"ADBE": "Adobe Systems Incorporated", "APPL": "Apple Computer, Inc.", "agfa": "Agfa Graphics N.V.", "argl": "ArgyllCMS", "bICC": "basICColor GmbH", "DL&C": "Digital Light & Color", "EPSO": "Seiko Epson Corporation", "HDM ": "Heidelberger Druckmaschinen AG", "HP ": "Hewlett-Packard", "KODA": "Kodak", "lcms": "Little CMS", "MONS": "Monaco Systems Inc.", "MSFT": "Microsoft Corporation", "qato": "QUATOGRAPHIC Technology GmbH", "XRIT": "X-Rite"} platform = {"APPL": "Apple", "MSFT": "Microsoft", "SGI ": "Silicon Graphics", "SUNW": "Sun Microsystems"} profileclass = {"scnr": "Input device profile", "mntr": "Display device profile", "prtr": "Output device profile", "link": "DeviceLink profile", "spac": "Color space Conversion profile", "abst": "Abstract profile", "nmcl": "Named color profile"} tags = {"A2B0": "Device to PCS: Intent 0", "A2B1": "Device to PCS: Intent 1", "A2B2": "Device to PCS: Intent 2", "B2A0": "PCS to device: Intent 0", "B2A1": "PCS to device: Intent 1", "B2A2": "PCS to device: Intent 2", "CIED": "Characterization measurement values", # Non-standard "DevD": "Characterization device values", # Non-standard "arts": "Absolute to media relative transform", # Non-standard (Argyll) "bkpt": "Media black point", "bTRC": "Blue tone response curve", "bXYZ": "Blue matrix column", "chad": "Chromatic adaptation transform", "ciis": "Colorimetric intent image state", "clro": "Colorant order", "cprt": "Copyright", "desc": "Description", "dmnd": "Device manufacturer name", "dmdd": "Device model name", "gamt": "Out of gamut tag", "gTRC": "Green tone response curve", "gXYZ": "Green matrix column", "kTRC": "Gray tone response curve", "lumi": "Luminance", "meas": "Measurement type", "mmod": "Make and model", "ncl2": "Named colors", "rTRC": "Red tone response curve", "rXYZ": "Red matrix column", "targ": "Characterization target", "tech": "Technology", "vcgt": "Video card gamma table", "view": "Viewing conditions", "vued": "Viewing conditions description", "wtpt": "Media white point"} tech = {"fscn": "Film scanner", "dcam": "Digital camera", "rscn": "Reflective scanner", "ijet": "Ink jet printer", "twax": "Thermal wax printer", "epho": "Electrophotographic printer", "esta": "Electrostatic printer", "dsub": "Dye sublimation printer", "rpho": "Photographic paper printer", "fprn": "Film writer", "vidm": "Video monitor", "vidc": "Video camera", "pjtv": "Projection television", "CRT ": "Cathode ray tube display", "PMD ": "Passive matrix display", "AMD ": "Active matrix display", "KPCD": "Photo CD", "imgs": "Photographic image setter", "grav": "Gravure", "offs": "Offset lithography", "silk": "Silkscreen", "flex": "Flexography", "mpfs": "Motion picture film scanner", "mpfr": "Motion picture film recorder", "dmpc": "Digital motion picture camera", "dcpj": "Digital cinema projector"} ciis = {"scoe": "Scene colorimetry estimates", "sape": "Scene appearance estimates", "fpce": "Focal plane colorimetry estimates", "rhoc": "Reflection hardcopy original colorimetry", "rpoc": "Reflection print output colorimetry"} def PCSLab_dec_to_uInt16(L, a, b): return [v * (655.35, 256, 256)[i] + (0, 32768, 32768)[i] for i, v in enumerate((L, a, b))] def PCSLab_uInt16_to_dec(L_uInt16, a_uInt16, b_uInt16): return [(v - (0, 32768, 32768)[i]) / (65535.0, 32768.0, 32768.0)[i] * (100, 128, 128)[i] for i, v in enumerate((L_uInt16, a_uInt16, b_uInt16))] def Property(func): return property(**func()) def create_RGB_A2B_XYZ(input_curves, clut): """ Create RGB device A2B from input curve XYZ values and cLUT Note that input curves and cLUT should already be adapted to D50. """ if len(input_curves) != 3: raise ValueError("Wrong number of input curves: %i" % len(input_curves)) white_XYZ = clut[-1][-1] clutres = len(clut[0]) itable = LUT16Type(None, "A2B0") itable.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) # Input curve interpolation # Normlly the input curves would either be linear (= 1:1 mapping to # cLUT) or the respective tone response curve. # We use a overall linear curve that is 'bent' in intervals # to accomodate the non-linear TRC. Thus, we can get away with much # fewer cLUT grid points. # Use higher interpolation size than actual number of curve entries steps = 2 ** 15 + 1 maxv = steps - 1.0 fwd = [] bwd = [] for i, input_curve in enumerate(input_curves): if isinstance(input_curve, (tuple, list)): linear = [v / (len(input_curve) - 1.0) for v in xrange(len(input_curve))] fwd.append(colormath.Interp(linear, input_curve, use_numpy=True)) bwd.append(colormath.Interp(input_curve, linear, use_numpy=True)) else: # Gamma fwd.append(lambda v, p=input_curve: colormath.specialpow(v, p)) bwd.append(lambda v, p=input_curve: colormath.specialpow(v, 1.0 / p)) itable.input.append([]) itable.output.append([0, 65535]) for i in xrange(3): maxi = bwd[i](white_XYZ[1]) segment = 1.0 / (clutres - 1.0) * maxi iv = 0.0 prevpow = fwd[i](0.0) nextpow = fwd[i](segment) prevv = 0 pprevpow = 0 clipped = False xp = [] for j in xrange(steps): v = (j / maxv) * maxi if v > iv + segment: iv += segment prevpow = nextpow nextpow = fwd[i](iv + segment) if nextpow > prevpow: prevs = 1.0 - (v - iv) / segment nexts = (v - iv) / segment vv = (prevs * prevpow + nexts * nextpow) prevv = v pprevpow = prevpow else: clipped = True # Linearly interpolate vv = colormath.convert_range(v, prevv, 1, prevpow, 1) out = bwd[i](vv) xp.append(out) # Fill input curves from interpolated values interp = colormath.Interp(xp, range(steps), use_numpy=True) entries = 2049 threshold = bwd[i](pprevpow) k = None for j in xrange(entries): n = j / (entries - 1.0) v = interp(n) / maxv if clipped and n + (1 / (entries - 1.0)) > threshold: # Linear interpolate shaper for last n cLUT steps to prevent # clipping in shaper if k is None: k = j ov = v v = min(ov + (1.0 - ov) * ((j - k) / (entries - k - 1.0)), 1.0) itable.input[i].append(v * 65535) # Fill cLUT clut = list(clut) itable.clut = [] step = 1.0 / (clutres - 1.0) for R in xrange(clutres): for G in xrange(clutres): row = list(clut.pop(0)) itable.clut.append([]) for B in xrange(clutres): X, Y, Z = row.pop(0) itable.clut[-1].append([max(v / white_XYZ[1] * 32768, 0) for v in (X, Y, Z)]) return itable def create_synthetic_clut_profile(rgb_space, description, XYZbp=None, white_Y=1.0, clutres=9): """ Create a synthetic cLUT profile from a colorspace definition """ profile = ICCProfile() profile.tags.desc = TextDescriptionType("", "desc") profile.tags.desc.ASCII = description profile.tags.cprt = TextType("text\0\0\0\0Public domain\0", "cprt") profile.tags.wtpt = XYZType(profile=profile) (profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z) = colormath.get_whitepoint(rgb_space[1]) itable = profile.tags.A2B0 = LUT16Type(None, "A2B0", profile) itable.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) otable = profile.tags.B2A0 = LUT16Type(None, "B2A0", profile) Xr, Yr, Zr = colormath.adapt(*colormath.RGB2XYZ(1, 0, 0, rgb_space=rgb_space), whitepoint_source=rgb_space[1]) Xg, Yg, Zg = colormath.adapt(*colormath.RGB2XYZ(0, 1, 0, rgb_space=rgb_space), whitepoint_source=rgb_space[1]) Xb, Yb, Zb = colormath.adapt(*colormath.RGB2XYZ(0, 0, 1, rgb_space=rgb_space), whitepoint_source=rgb_space[1]) m1 = colormath.Matrix3x3(((Xr, Xg, Xb), (Yr, Yg, Yb), (Zr, Zg, Zb))).inverted() scale = 1 + (32767 / 32768.0) m3 = colormath.Matrix3x3(((scale, 0, 0), (0, scale, 0), (0, 0, scale))) otable.matrix = m1 * m3 # Input curve interpolation # Normlly the input curves would either be linear (= 1:1 mapping to # cLUT) or the respective tone response curve. # We use a overall linear curve that is 'bent' in intervals # to accomodate the non-linear TRC. Thus, we can get away with much # fewer cLUT grid points. # Use higher interpolation size than actual number of curve entries steps = 2 ** 15 + 1 maxv = steps - 1.0 gamma = rgb_space[0] maxi = colormath.specialpow(white_Y, 1.0 / gamma) segment = 1.0 / (clutres - 1.0) * maxi iv = 0.0 prevpow = 0.0 nextpow = colormath.specialpow(segment, gamma) xp = [] for j in xrange(steps): v = (j / maxv) * maxi if v > iv + segment: iv += segment prevpow = nextpow nextpow = colormath.specialpow(iv + segment, gamma) prevs = 1.0 - (v - iv) / segment nexts = (v - iv) / segment vv = (prevs * prevpow + nexts * nextpow) out = colormath.specialpow(vv, 1.0 / gamma) xp.append(out) interp = colormath.Interp(xp, range(steps), use_numpy=True) # Create input and output curves for i in xrange(3): itable.input.append([]) itable.output.append([0, 65535]) otable.input.append([]) otable.output.append([0, 65535]) for j in xrange(4096): otable.input[i].append(colormath.specialpow(j / 4095.0 * white_Y, 1.0 / gamma) * 65535) # Fill input curves from interpolated values entries = 2049 for j in xrange(entries): v = j / (entries - 1.0) for i in xrange(3): itable.input[i].append(interp(v) / maxv * 65535) # Create and fill cLUT itable.clut = [] step = 1.0 / (clutres - 1.0) for R in xrange(clutres): for G in xrange(clutres): itable.clut.append([]) for B in xrange(clutres): X, Y, Z = colormath.adapt(*colormath.RGB2XYZ(*[v * step * maxi for v in (R, G, B)], rgb_space=rgb_space), whitepoint_source=rgb_space[1]) X, Y, Z = colormath.blend_blackpoint(X, Y, Z, None, XYZbp) itable.clut[-1].append([max(v / white_Y * 32768, 0) for v in (X, Y, Z)]) otable.clut = [] for R in xrange(2): for G in xrange(2): otable.clut.append([]) for B in xrange(2): otable.clut[-1].append([v * 65535 for v in (R , G, B)]) return profile def create_synthetic_smpte2084_clut_profile(rgb_space, description, black_cdm2=0, white_cdm2=400, master_black_cdm2=0, master_white_cdm2=10000, content_rgb_space="DCI P3", rolloff=True, clutres=33, mode="ICtCp", forward_xicclu=None, backward_xicclu=None, generate_B2A=False, worker=None, logfile=None): """ Create a synthetic cLUT profile with the SMPTE 2084 TRC from a colorspace definition mode: The gamut mapping mode when rolling off. Valid values: "ICtCp" (default), "XYZ", "HSV" (inaccurate), "RGB" (not recommended, saturation loss) """ if not rolloff: raise NotImplementedError("rolloff needs to be True") return create_synthetic_hdr_clut_profile("PQ", rgb_space, description, black_cdm2, white_cdm2, master_black_cdm2, master_white_cdm2, 1.2, # Not used for PQ 5.0, # Not used for PQ 1.0, # Not used for PQ content_rgb_space, clutres, mode, forward_xicclu, backward_xicclu, generate_B2A, worker, logfile) def create_synthetic_hdr_clut_profile(hdr_format, rgb_space, description, black_cdm2=0, white_cdm2=400, master_black_cdm2=0, # Not used for HLG master_white_cdm2=10000, # Not used for HLG system_gamma=1.2, # Not used for PQ ambient_cdm2=5, # Not used for PQ maxsignal=1.0, # Not used for PQ content_rgb_space="DCI P3", clutres=33, mode="ICtCp", # Not used for HLG forward_xicclu=None, backward_xicclu=None, generate_B2A=False, worker=None, logfile=None): """ Create a synthetic HDR cLUT profile from a colorspace definition """ rgb_space = colormath.get_rgb_space(rgb_space) content_rgb_space = colormath.get_rgb_space(content_rgb_space) if hdr_format == "PQ": bt2390 = colormath.BT2390(black_cdm2, white_cdm2, master_black_cdm2, master_white_cdm2) maxv = white_cdm2 / 10000.0 eotf = lambda v: colormath.specialpow(v, -2084) oetf = eotf_inverse = lambda v: colormath.specialpow(v, 1.0 / -2084) eetf = bt2390.apply # Apply a slight power to the segments to optimize encoding encpow = min(max(bt2390.omaxi * (5 / 3.0), 1.0), 1.5) def encf(v): if v < bt2390.mmaxi: v = colormath.convert_range(v, 0, bt2390.mmaxi, 0, 1) v = colormath.specialpow(v, 1.0 / encpow, 2) return colormath.convert_range(v, 0, 1, 0, bt2390.mmaxi) else: return v elif hdr_format == "HLG": # Note: Unlike the PQ black level lift, we apply HLG black offset as # separate final step, not as part of the HLG EOTF hlg = colormath.HLG(0, white_cdm2, system_gamma, ambient_cdm2, rgb_space) if maxsignal < 1: # Adjust EOTF so that EOTF[maxsignal] gives (approx) white_cdm2 while hlg.eotf(maxsignal) * hlg.white_cdm2 < white_cdm2: hlg.white_cdm2 += 1 lscale = 1.0 / hlg.oetf(1.0, True) hlg.white_cdm2 *= lscale if lscale < 1 and logfile: logfile.write("Nominal peak luminance after scaling = %.2f\n" % hlg.white_cdm2) Ymax = hlg.eotf(maxsignal) maxv = 1.0 eotf = hlg.eotf eotf_inverse = lambda v: hlg.eotf(v, True) oetf = hlg.oetf eetf = lambda v: v encf = lambda v: v else: raise NotImplementedError("Unknown HDR format %r" % hdr_format) profile = ICCProfile() profile.tags.desc = TextDescriptionType("", "desc") profile.tags.desc.ASCII = description profile.tags.cprt = TextType("text\0\0\0\0Public domain\0", "cprt") profile.tags.wtpt = XYZType(profile=profile) (profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z) = colormath.get_whitepoint(rgb_space[1]) itable = profile.tags.A2B0 = LUT16Type(None, "A2B0", profile) itable.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) # HDR RGB debugtable0 = profile.tags.DBG0 = LUT16Type(None, "DBG0", profile) debugtable0.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) # Display RGB debugtable1 = profile.tags.DBG1 = LUT16Type(None, "DBG1", profile) debugtable1.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) # Display XYZ debugtable2 = profile.tags.DBG2 = LUT16Type(None, "DBG2", profile) debugtable2.matrix = colormath.Matrix3x3([(1, 0, 0), (0, 1, 0), (0, 0, 1)]) if generate_B2A: otable = profile.tags.B2A0 = LUT16Type(None, "B2A0", profile) Xr, Yr, Zr = colormath.adapt(*colormath.RGB2XYZ(1, 0, 0, rgb_space=rgb_space), whitepoint_source=rgb_space[1]) Xg, Yg, Zg = colormath.adapt(*colormath.RGB2XYZ(0, 1, 0, rgb_space=rgb_space), whitepoint_source=rgb_space[1]) Xb, Yb, Zb = colormath.adapt(*colormath.RGB2XYZ(0, 0, 1, rgb_space=rgb_space), whitepoint_source=rgb_space[1]) m1 = colormath.Matrix3x3(((Xr, Xg, Xb), (Yr, Yg, Yb), (Zr, Zg, Zb))) m2 = m1.inverted() scale = 1 + (32767 / 32768.0) m3 = colormath.Matrix3x3(((scale, 0, 0), (0, scale, 0), (0, 0, scale))) otable.matrix = m2 * m3 # Input curve interpolation # Normlly the input curves would either be linear (= 1:1 mapping to # cLUT) or the respective tone response curve. # We use a overall linear curve that is 'bent' in intervals # to accomodate the non-linear TRC. Thus, we can get away with much # fewer cLUT grid points. # Use higher interpolation size than actual number of curve entries steps = 2 ** 15 + 1 maxstep = steps - 1.0 segment = 1.0 / (clutres - 1.0) iv = 0.0 prevpow = eotf(eetf(0)) # Apply a slight power to segments to optimize encoding nextpow = eotf(eetf(encf(segment))) prevv = 0 pprevpow = [0] clipped = False xp = [] if generate_B2A: oxp = [] for j in xrange(steps): v = (j / maxstep) if v > iv + segment: iv += segment prevpow = nextpow # Apply a slight power to segments to optimize encoding nextpow = eotf(eetf(encf(iv + segment))) if nextpow > prevpow or test_input_curve_clipping: prevs = 1.0 - (v - iv) / segment nexts = (v - iv) / segment vv = (prevs * prevpow + nexts * nextpow) prevv = v if prevpow > pprevpow[-1]: pprevpow.append(prevpow) else: clipped = True # Linearly interpolate vv = colormath.convert_range(v, prevv, 1, prevpow, 1) out = eotf_inverse(vv) xp.append(out) if generate_B2A: oxp.append(eotf(eetf(v)) / maxv) interp = colormath.Interp(xp, range(steps), use_numpy=True) if generate_B2A: ointerp = colormath.Interp(oxp, range(steps), use_numpy=True) # Save interpolation input values for diagnostic purposes profile.tags.kTRC = CurveType() interp_inverse = colormath.Interp(range(steps), xp, use_numpy=True) profile.tags.kTRC[:] = [interp_inverse(colormath.convert_range(v, 0, 2048, 0, maxstep)) * 65535 for v in xrange(2049)] # Create input and output curves for i in xrange(3): itable.input.append([]) itable.output.append([0, 65535]) debugtable0.input.append([0, 65535]) debugtable0.output.append([0, 65535]) debugtable1.input.append([0, 65535]) debugtable1.output.append([0, 65535]) debugtable2.input.append([0, 65535]) debugtable2.output.append([0, 65535]) if generate_B2A: otable.input.append([]) otable.output.append([0, 65535]) # Generate device-to-PCS shaper curves from interpolated values if logfile: logfile.write("Generating device-to-PCS shaper curves...\n") entries = 1025 prevperc = 0 if generate_B2A: endperc = 1 else: endperc = 2 threshold = eotf_inverse(pprevpow[-2]) k = None end = eotf_inverse(pprevpow[-1]) l = entries - 1 if end > threshold: for j in xrange(entries): n = j / (entries - 1.0) if eetf(n) > end: l = j - 1 break for j in xrange(entries): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") n = j / (entries - 1.0) v = interp(eetf(n)) / maxstep if hdr_format == "PQ": ##threshold = 1.0 - segment * math.ceil((1.0 - bt2390.mmaxi) * ##(clutres - 1.0) + 1) ##check = n >= threshold check = eetf(n + (1 / (entries - 1.0))) > threshold elif hdr_format == "HLG": check = maxsignal < 1 and n >= maxsignal if check and not test_input_curve_clipping: # Linear interpolate shaper for last n cLUT steps to prevent # clipping in shaper if k is None: k = j ov = v ev = interp(eetf(l / (entries - 1.0))) / maxstep ##v = min(ov + (1.0 - ov) * ((j - k) / (entries - k - 1.0)), 1.0) v = min(colormath.convert_range(j, k, l, ov, ev), n) for i in xrange(3): itable.input[i].append(v * 65535) perc = math.floor(n * endperc) if logfile and perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc startperc = perc if generate_B2A: # Generate PCS-to-device shaper curves from interpolated values if logfile: logfile.write("\rGenerating PCS-to-device shaper curves...\n") logfile.write("\r%i%%" % perc) for j in xrange(4096): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") n = j / 4095.0 v = ointerp(n) / maxstep * 65535 for i in xrange(3): otable.input[i].append(v) perc = startperc + math.floor(n * 20) if logfile and perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc startperc = perc # Scene RGB -> HDR tone mapping -> HDR XYZ -> backward lookup -> display RGB if logfile: logfile.write("\rApplying HDR tone mapping...\n") logfile.write("\r%i%%" % perc) itable.clut = [] debugtable0.clut = [] debugtable1.clut = [] debugtable2.clut = [] clutmax = clutres - 1.0 step = 1.0 / clutmax count = 0 # Lpt is the preferred mode for chroma blending. Some preliminary visual # comparison has shown it does overall the best job preserving hue and # saturation (blue hues superior to IPT). DIN99d is the second best, # but vibrant red turns slightly orange when desaturated (DIN99d has best # blue saturation preservation though). ICtCp should NOT be used as it has # a tendency to blow out highlights (maybe this is not due to ICtCp itself # and more the way it is used here, because it works just fine for the # initial roll-off saturation adjustment where it is the preferred mode). blendmode = "Lpt" IPT_white_XYZ = colormath.get_cat_matrix("IPT").inverted() * (1, 1, 1) Cmode = ("all", "primaries_secondaries")[0] RGB_in = [] HDR_ICtCp = [] HDR_RGB = [] HDR_XYZ = [] HDR_min_I = [] for R in xrange(clutres): for G in xrange(clutres): for B in xrange(clutres): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") # Apply a slight power to the segments to optimize encoding RGB = [encf(v * step) for v in (R, G, B)] RGB_in.append(RGB) if debug and R == G == B: safe_print("RGB %5.3f %5.3f %5.3f" % tuple(RGB), end=" ") if hdr_format == "HLG": X, Y, Z = hlg.RGB2XYZ(*RGB) if Y: Y1 = Y I1 = hlg.eotf(Y, True) I2 = min(I1, maxsignal) Y2 = hlg.eotf(I2) Y3 = Y2 / Ymax X, Y, Z = (v / Y * Y3 if Y else v for v in (X, Y, Z)) if R == G == B and logfile and debug: logfile.write("\rE %.4f -> E' %.4f -> roll-off -> %.4f -> E %.4f -> scale (%i%%) -> %.4f\n" % (Y1, I1, I2, Y2, Y3 / Y2 * 100, Y3)) elif mode == "XYZ": X, Y, Z = colormath.RGB2XYZ(*RGB, rgb_space=rgb_space, eotf=eotf) if Y: I1 = colormath.specialpow(Y, 1.0 / -2084) I2 = eetf(I1) Y2 = colormath.specialpow(I2, -2084) X, Y, Z = (v / Y * Y2 for v in (X, Y, Z)) else: I1 = I2 = 0 elif mode == "HSV": HSV = list(colormath.RGB2HSV(*RGB)) I1 = HSV[2] HSV[2] = eetf(I1) I2 = HSV[2] elif mode == "ICtCp": LinearRGB = [eotf(v) for v in RGB] I1, Ct1, Cp1 = colormath.LinearRGB2ICtCp(*LinearRGB, oetf=eotf_inverse) if debug and R == G == B: safe_print("-> ICtCp % 5.3f % 5.3f % 5.3f" % (I1, Ct1, Cp1,), end=" ") I2 = eetf(I1) elif mode == "RGB": I1 = colormath.RGB2HSV(*RGB)[2] for i, v in enumerate(RGB): RGB[i] = eetf(v) I2 = colormath.RGB2HSV(*RGB)[2] if hdr_format == "PQ" and I1 and I2: if forward_xicclu and backward_xicclu: # Only desaturate light colors (dark colors will be # desaturated according to display max chroma) dsat = 1.0 else: # Desaturate dark and light colors dsat = I1 / I2 min_I = min(dsat, I2 / I1) else: min_I = 1 if hdr_format == "HLG": pass elif mode == "XYZ": X, Y, Z = colormath.XYZsaturation(X, Y, Z, min_I, rgb_space[1])[0] RGB = colormath.XYZ2RGB(X, Y, Z, rgb_space, oetf=eotf_inverse) elif mode == "HSV": if debug and R == G == B: safe_print("* %5.3f" % min_I, "->", end=" ") HSV[1] *= min_I RGB = colormath.HSV2RGB(*HSV) elif mode == "ICtCp": if debug and R == G == B: safe_print("* %5.3f" % min_I, "->", end=" ") Ct2, Cp2 = (min_I * v for v in (Ct1, Cp1)) if debug and R == G == B: safe_print("% 5.3f % 5.3f % 5.3f" % (I2, Ct2, Cp2), "->", end=" ") LinearRGB = colormath.ICtCp2LinearRGB(I2, Ct2, Cp2, eotf=eotf) ##if min(LinearRGB) < 0 or max(LinearRGB) > 1: ##print 'WARNING:', LinearRGB ##LinearRGB = [max(min(v, 1), 0) for v in LinearRGB] RGB = [eotf_inverse(v) for v in LinearRGB] I, Ct, Cp = I2, Ct2, Cp2 X, Y, Z = colormath.ICtCp2XYZ(I2, Ct2, Cp2, rgb_space, eotf=eotf) if debug and R == G == B: safe_print("RGB %5.3f %5.3f %5.3f" % tuple(RGB)) if hdr_format != "PQ" or mode != "ICtCp": I, Ct, Cp = colormath.XYZ2ICtCp(X, Y, Z, oetf=eotf_inverse) HDR_ICtCp.append((I, Ct, Cp)) HDR_RGB.append(RGB) if mode not in ("XYZ", "ICtCp"): X, Y, Z = colormath.RGB2XYZ(*RGB, rgb_space=rgb_space, eotf=eotf) X, Y, Z = (v / maxv for v in (X, Y, Z)) # Clip to XYZ encoding range of 0..65535 by going through # RGB, clamping to 1, and back to XYZ. Does a pretty good job # at preserving hue. XR, XG, XB = colormath.XYZ2RGB(X, Y, Z, rgb_space=rgb_space, oetf=eotf_inverse) X, Y, Z = colormath.RGB2XYZ(XR, XG, XB, rgb_space=rgb_space, eotf=eotf) # Adapt to D50 X, Y, Z = colormath.adapt(X, Y, Z, whitepoint_source=rgb_space[1]) if max(X, Y, Z) * 32768 > 65535: # This should not happen safe_print("#%i" % row, X, Y, Z) HDR_XYZ.append((X, Y, Z)) HDR_min_I.append(min_I) count += 1 perc = startperc + math.floor(count / clutres ** 3.0 * (100 - startperc)) if logfile and perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc prevperc = startperc = perc = 0 if forward_xicclu and backward_xicclu and logfile: logfile.write("\rDoing backward lookup...\n") logfile.write("\r%i%%" % perc) count = 0 for i, (X, Y, Z) in enumerate(HDR_XYZ): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") if (forward_xicclu and backward_xicclu and Cmode != "primaries_secondaries"): # HDR XYZ -> backward lookup -> display RGB backward_xicclu((X, Y, Z)) count += 1 perc = startperc + math.floor(count / clutres ** 3.0 * (100 - startperc)) if (logfile and perc > prevperc and backward_xicclu.__class__.__name__ == "Xicclu"): logfile.write("\r%i%%" % perc) prevperc = perc prevperc = startperc = perc = 0 Cdiff = [] Cmax = {} Cdmax = {} if forward_xicclu and backward_xicclu: # Display RGB -> backward lookup -> display XYZ backward_xicclu.close() display_RGB = backward_xicclu.get() if logfile: logfile.write("\rDoing forward lookup...\n") logfile.write("\r%i%%" % perc) # Smooth row = 0 for col_0 in xrange(clutres): for col_1 in xrange(clutres): debugtable1.clut.append([]) for col_2 in xrange(clutres): RGBdisp = display_RGB[row] debugtable1.clut[-1].append([min(max(v * 65535, 0), 65535) for v in RGBdisp]) row += 1 debugtable1.smooth() display_RGB = [] for block in debugtable1.clut: for row in block: display_RGB.append([v / 65535.0 for v in row]) for i, (R, G, B) in enumerate(display_RGB): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") forward_xicclu((R, G, B)) perc = startperc + math.floor((i + 1) / clutres ** 3.0 * (100 - startperc)) if (logfile and perc > prevperc and forward_xicclu.__class__.__name__ == "Xicclu"): logfile.write("\r%i%%" % perc) prevperc = perc prevperc = startperc = perc = 0 if Cmode == "primaries_secondaries": # Compare to chroma of content primaries/secondaries to determine # general chroma compression factor forward_xicclu((0, 0, 1)) forward_xicclu((0, 1, 0)) forward_xicclu((1, 0, 0)) forward_xicclu((0, 1, 1)) forward_xicclu((1, 0, 1)) forward_xicclu((1, 1, 0)) forward_xicclu.close() display_XYZ = forward_xicclu.get() if Cmode == "primaries_secondaries": for i in xrange(6): if i == 0: # Blue j = clutres - 1 elif i == 1: # Green j = clutres ** 2 - clutres elif i == 2: # Red j = clutres ** 3 - clutres ** 2 elif i == 3: # Cyan j = clutres ** 2 - 1 elif i == 4: # Magenta j = clutres ** 3 - clutres ** 2 + clutres - 1 elif i == 5: # Yellow j = clutres ** 3 - clutres R, G, B = RGB_in[j] XYZsrc = HDR_XYZ[j] XYZdisp = display_XYZ[-(6 - i)] XYZc = colormath.RGB2XYZ(R, G, B, content_rgb_space, eotf=eotf) XYZc = colormath.adapt(*XYZc, whitepoint_source=content_rgb_space[1]) L, C, H = colormath.XYZ2DIN99dLCH(*(v * 100 for v in XYZc)) Ld, Cd, Hd = colormath.XYZ2DIN99dLCH(*(v * 100 for v in XYZdisp)) Cdmaxk = tuple(map(round, (Ld, Hd))) if C > Cmax.get(Cdmaxk, -1): Cmax[Cdmaxk] = C Cdiff.append(min(Cd / C, 1.0)) if Cd > Cdmax.get(Cdmaxk, -1): Cdmax[Cdmaxk] = Cd safe_print("RGB in %5.2f %5.2f %5.2f" % (R, G, B)) safe_print("Content BT2020 XYZ (DIN99d) %5.2f %5.2f %5.2f" % tuple(v * 100 for v in XYZc)) safe_print("Content BT2020 LCH (DIN99d) %5.2f %5.2f %5.2f" % (L, C, H)) safe_print("Display XYZ %5.2f %5.2f %5.2f" % tuple(v * 100 for v in XYZdisp)) safe_print("Display LCH (DIN99d) %5.2f %5.2f %5.2f" % (Ld, Cd, Hd)) if logfile: logfile.write("\r%s chroma compression factor: %6.4f\n" % ({0: "B", 1: "G", 2: "R", 3: "C", 4: "M", 5: "Y"}[i], Cdiff[-1])) # Tweak so that it gives roughly 0.91 for a Rec. 709 target general_compression_factor = (sum(Cdiff) / len(Cdiff)) * 0.99 else: display_RGB = False display_XYZ = False display_LCH = [] if Cmode != "primaries_secondaries" and display_XYZ: # Determine compression factor by comparing display to content # colorspace in BT.2020 if logfile: logfile.write("\rDetermining chroma compression factors...\n") logfile.write("\r%i%%" % perc) for i, (R, G, B) in enumerate(HDR_RGB): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") XYZsrc = HDR_XYZ[i] if display_XYZ: XYZdisp = display_XYZ[i] ### Adjust luminance from destination to source ##Ydisp = XYZdisp[1] ##if Ydisp: ##XYZdisp = [v / Ydisp * XYZsrc[1] for v in XYZdisp] else: XYZdisp = XYZsrc X, Y, Z = (v * maxv for v in XYZsrc) X, Y, Z = colormath.adapt(X, Y, Z, whitepoint_destination=content_rgb_space[1]) R, G, B = colormath.XYZ2RGB(X, Y, Z, content_rgb_space, oetf=eotf_inverse) XYZc = colormath.RGB2XYZ(R, G, B, content_rgb_space, eotf=eotf) XYZc = colormath.adapt(*XYZc, whitepoint_source=content_rgb_space[1], whitepoint_destination=rgb_space[1]) RGBc_r2020 = colormath.XYZ2RGB(*XYZc, rgb_space=rgb_space, oetf=eotf_inverse) XYZc_r2020 = colormath.RGB2XYZ(*RGBc_r2020, rgb_space=rgb_space, eotf=eotf) if blendmode == "ICtCp": I, Ct, Cp = colormath.XYZ2ICtCp(*XYZc_r2020, rgb_space=rgb_space, oetf=eotf_inverse) L, C, H = colormath.Lab2LCHab(I * 100, Cp * 100, Ct * 100) XYZdispa = colormath.adapt(*XYZdisp, whitepoint_destination=rgb_space[1]) Id, Ctd, Cpd = colormath.XYZ2ICtCp(*(v * maxv for v in XYZdispa), rgb_space=rgb_space, oetf=eotf_inverse) Ld, Cd, Hd = colormath.Lab2LCHab(Id * 100, Cpd * 100, Ctd * 100) elif blendmode == "IPT": XYZc_r2020 = colormath.adapt(*XYZc_r2020, whitepoint_source=rgb_space[1], whitepoint_destination=IPT_white_XYZ) I, CP, CT = colormath.XYZ2IPT(*XYZc_r2020) L, C, H = colormath.Lab2LCHab(I * 100, CP * 100, CT * 100) XYZdispa = colormath.adapt(*XYZdisp, whitepoint_destination=IPT_white_XYZ) Id, Pd, Td = colormath.XYZ2IPT(*XYZdispa) Ld, Cd, Hd = colormath.Lab2LCHab(Id * 100, Pd * 100, Td * 100) elif blendmode == "Lpt": XYZc_r2020 = colormath.adapt(*XYZc_r2020, whitepoint_source=rgb_space[1]) L, p, t = colormath.XYZ2Lpt(*(v / maxv * 100 for v in XYZc_r2020)) L, C, H = colormath.Lab2LCHab(L, p, t) Ld, pd, td = colormath.XYZ2Lpt(*(v * 100 for v in XYZdisp)) Ld, Cd, Hd = colormath.Lab2LCHab(Ld, pd, td) elif blendmode == "XYZ": XYZc_r2020 = colormath.adapt(*XYZc_r2020, whitepoint_source=rgb_space[1]) wx, wy = colormath.XYZ2xyY(*colormath.get_whitepoint())[:2] x, y, Y = colormath.XYZ2xyY(*XYZc_r2020) x -= wx y -= wy L, C, H = colormath.Lab2LCHab(*(v * 100 for v in (Y, x, y))) x, y, Y = colormath.XYZ2xyY(*XYZdisp) x -= wx y -= wy Ld, Cd, Hd = colormath.Lab2LCHab(*(v * 100 for v in (Y, x, y))) else: # DIN99d XYZc_r202099 = colormath.adapt(*XYZc_r2020, whitepoint_source=rgb_space[1]) L, C, H = colormath.XYZ2DIN99dLCH(*(v / maxv * 100 for v in XYZc_r202099)) Ld, Cd, Hd = colormath.XYZ2DIN99dLCH(*(v * 100 for v in XYZdisp)) Cdmaxk = tuple(map(round, (Ld, Hd), (2, 2))) if C > Cmax.get(Cdmaxk, -1): Cmax[Cdmaxk] = C if C: ##print '%6.3f %6.3f' % (Cd, C) Cdiff.append(min(Cd / C, 1.0)) ##if Cdiff[-1] < 0.0001: ##raise RuntimeError("#%i RGB % 5.3f % 5.3f % 5.3f Cdiff %5.3f" % (i, R, G, B, Cdiff[-1])) else: Cdiff.append(1.0) display_LCH.append((Ld, Cd, Hd)) if Cd > Cdmax.get(Cdmaxk, -1): Cdmax[Cdmaxk] = Cd if debug: safe_print("RGB in %5.2f %5.2f %5.2f" % tuple(RGB_in[i])) safe_print("RGB out %5.2f %5.2f %5.2f" % (R, G, B)) safe_print("Content BT2020 XYZ %5.2f %5.2f %5.2f" % tuple(v / maxv * 100 for v in XYZc_r2020)) safe_print("Content BT2020 LCH %5.2f %5.2f %5.2f" % (L, C, H)) safe_print("Display XYZ %5.2f %5.2f %5.2f" % tuple(v * 100 for v in XYZdisp)) safe_print("Display LCH %5.2f %5.2f %5.2f" % (Ld, Cd, Hd)) perc = startperc + math.floor(i / clutres ** 3.0 * (80 - startperc)) if logfile and perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc startperc = perc general_compression_factor = (sum(Cdiff) / len(Cdiff)) if display_XYZ: Cmaxv = max(Cmax.values()) Cdmaxv = max(Cdmax.values()) if logfile and display_LCH and Cmode == "primaries_secondaries": logfile.write("\rChroma compression factor: %6.4f\n" % general_compression_factor) # Chroma compress to display XYZ if logfile: if display_XYZ: logfile.write("\rApplying chroma compression and filling cLUT...\n") else: logfile.write("\rFilling cLUT...\n") logfile.write("\r%i%%" % perc) row = 0 oog_count = 0 ##if forward_xicclu: ##forward_xicclu.spawn() ##if backward_xicclu: ##backward_xicclu.spawn() for col_0 in xrange(clutres): for col_1 in xrange(clutres): itable.clut.append([]) debugtable0.clut.append([]) if not display_RGB: debugtable1.clut.append([]) debugtable2.clut.append([]) for col_2 in xrange(clutres): if worker and worker.thread_abort: if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() raise Exception("aborted") R, G, B = HDR_RGB[row] I, Ct, Cp = HDR_ICtCp[row] X, Y, Z = HDR_XYZ[row] min_I = HDR_min_I[row] if not (col_0 == col_1 == col_2) and display_XYZ: # Desaturate based on compression factor if display_LCH: blend = 1 else: # Blending threshold: Don't desaturate dark colors # (< 26 cd/m2). Preserves more "pop" thresh_I = .381 blend = min_I * min(max((I - thresh_I) / (.5081 - thresh_I), 0), 1) if blend: if blendmode == "XYZ": wx, wy = colormath.XYZ2xyY(*colormath.get_whitepoint())[:2] x, y, Y = colormath.XYZ2xyY(X, Y, Z) x -= wx y -= wy L, C, H = colormath.Lab2LCHab(*(v * 100 for v in (Y, x, y))) elif blendmode == "ICtCp": L, C, H = colormath.Lab2LCHab(I * 100, Cp * 100, Ct * 100) elif blendmode == "DIN99d": XYZ = X, Y, Z L, C, H = colormath.XYZ2DIN99dLCH(*[v * 100 for v in XYZ]) elif blendmode == "IPT": XYZ = colormath.adapt(X, Y, Z, whitepoint_destination=IPT_white_XYZ) I, CP, CT = colormath.XYZ2IPT(*XYZ) L, C, H = colormath.Lab2LCHab(I * 100, CP * 100, CT * 100) elif blendmode == "Lpt": XYZ = X, Y, Z L, p, t = colormath.XYZ2Lpt(*[v * 100 for v in XYZ]) L, C, H = colormath.Lab2LCHab(L, p, t) if blendmode: if display_LCH: Ld, Cd, Hd = display_LCH[row] ##Cdmaxk = tuple(map(round, (Ld, Hd), (2, 2))) ### Lookup HDR max chroma for given display ### luminance and hue ##HCmax = Cmax[Cdmaxk] ##if C and HCmax: ### Lookup display max chroma for given display ### luminance and hue ##HCdmax = Cdmax[Cdmaxk] ### Display max chroma in 0..1 range ##maxCc = min(HCdmax / HCmax, 1.0) ##KSCc = 1.5 * maxCc - 0.5 ### HDR chroma in 0..1 range ##Cc1 = min(C / HCmax, 1.0) ##if Cc1 >= KSCc <= 1 and maxCc > KSCc >= 0: ### Roll-off chroma ##Cc2 = bt2390.apply(Cc1, KSCc, ##maxCc, 1.0, 0, ##normalize=False) ##C = HCmax * Cc2 ##else: ### Use display chroma as-is (clip) ##if debug: ##safe_print("CLUT grid point %i %i %i: " ##"C %6.4f Cd %6.4f HCmax %6.4f maxCc " ##"%6.4f KSCc %6.4f Cc1 %6.4f" % ##(col_0, col_1, col_2, C, Cd, ##HCmax, maxCc, KSCc, Cc1)) ##C = Cd if C: C *= min(Cd / C, 1.0) if L and blendmode == "ICtCp": C *= min(Ld / L, 1.0) L *= min(Ld / L, 1.0) ** min(Ld / L, L / Ld) else: Cc = general_compression_factor Cc **= (C / Cmaxv) C = C * (1 - blend) + (C * Cc) * blend if blendmode == "ICtCp": I, Cp, Ct = [v / 100.0 for v in colormath.LCHab2Lab(L, C, H)] XYZ = colormath.ICtCp2XYZ(I, Ct, Cp, rgb_space=rgb_space, eotf=eotf) X, Y, Z = (v / maxv for v in XYZ) # Adapt to D50 X, Y, Z = colormath.adapt(X, Y, Z, whitepoint_source=rgb_space[1]) elif blendmode == "DIN99d": L, a, b = colormath.DIN99dLCH2Lab(L, C, H) X, Y, Z = colormath.Lab2XYZ(L, a, b) elif blendmode == "IPT": I, CP, CT = [v / 100.0 for v in colormath.LCHab2Lab(L, C, H)] X, Y, Z = colormath.IPT2XYZ(I, CP, CT) # Adapt to D50 X, Y, Z = colormath.adapt(X, Y, Z, whitepoint_source=IPT_white_XYZ) elif blendmode == "Lpt": L, p, t = colormath.LCHab2Lab(L, C, H) X, Y, Z = colormath.Lpt2XYZ(L, p, t) elif blendmode == "XYZ": Y, x, y = [v / 100.0 for v in colormath.LCHab2Lab(L, C, H)] x += wx y += wy X, Y, Z = colormath.xyY2XYZ(x, y, Y) else: safe_print("CLUT grid point %i %i %i: blend = 0" % (col_0, col_1, col_2)) ##if backward_xicclu and forward_xicclu: ##backward_xicclu((X, Y, Z)) ##else: ##HDR_XYZ[row] = (X, Y, Z) ##row += 1 ##perc = startperc + math.floor(row / clutres ** 3.0 * ##(90 - startperc)) ##if logfile and perc > prevperc: ##logfile.write("\r%i%%" % perc) ##prevperc = perc ##startperc = perc ##if backward_xicclu and forward_xicclu: ### Get XYZ clipped to display RGB ##backward_xicclu.exit() ##for R, G, B in backward_xicclu.get(): ##forward_xicclu((R, G, B)) ##forward_xicclu.exit() ##display_XYZ = forward_xicclu.get() ##else: ##display_XYZ = HDR_XYZ ##row = 0 ##for a in xrange(clutres): ##for b in xrange(clutres): ##itable.clut.append([]) ##debugtable0.clut.append([]) ##for c in xrange(clutres): ##if worker and worker.thread_abort: ##if forward_xicclu: ##forward_xicclu.exit() ##if backward_xicclu: ##backward_xicclu.exit() ##raise Exception("aborted") ##X, Y, Z = display_XYZ[row] itable.clut[-1].append([min(max(v * 32768, 0), 65535) for v in (X, Y, Z)]) debugtable0.clut[-1].append([min(max(v * 65535, 0), 65535) for v in (R, G, B)]) if not display_RGB: debugtable1.clut[-1].append([0, 0, 0]) if display_XYZ: XYZdisp = display_XYZ[row] else: XYZdisp = [0, 0, 0] debugtable2.clut[-1].append([min(max(v * 65535, 0), 65535) for v in XYZdisp]) row += 1 perc = startperc + math.floor(row / clutres ** 3.0 * (100 - startperc)) if logfile and perc > prevperc: logfile.write("\r%i%%" % perc) prevperc = perc startperc = perc if debug: safe_print("Num OOG:", oog_count) if generate_B2A: ##if logfile: ##logfile.write("\rGenerating PCS-to-device table...\n") ##logfile.write("\r%i%%" % perc) otable.clut = [] ##rgb_space_out = list(rgb_space) ##rgb_space_out[0] = [[v / 65535.0 for v in otable.input[0]]] * 3 ##count = 0 ##for R in xrange(clutres): ##for G in xrange(clutres): ##otable.clut.append([]) ##for B in xrange(clutres): ##RGB = [v * step for v in (R, G, B)] ##R_G_B_ = [ointerp(v) / maxstep for v in RGB] ##X, Y, Z = m1 * R_G_B_ ##X, Y, Z = colormath.adapt(X, Y, Z, "D50", rgb_space[1]) ##RGB = colormath.XYZ2RGB(X, Y, Z, rgb_space_out) ##otable.clut[-1].append([v * 65535 for v in RGB]) ##count += 1 ##perc = 35 + round(count / clutres ** 3.0 * 65) ##if logfile and perc > prevperc: ##logfile.write("\r%i%%" % perc) ##prevperc = perc for R in xrange(2): for G in xrange(2): otable.clut.append([]) for B in xrange(2): otable.clut[-1].append([v * 65535 for v in (R , G, B)]) if logfile: logfile.write("\n") if forward_xicclu: forward_xicclu.exit() if backward_xicclu: backward_xicclu.exit() if hdr_format == "HLG" and black_cdm2: # Apply black offset XYZbp = colormath.get_whitepoint(scale=black_cdm2 / float(white_cdm2)) if logfile: logfile.write("Applying black offset...\n") profile.tags.A2B0.apply_black_offset(XYZbp, logfile=logfile, thread_abort=worker and worker.thread_abort) return profile def create_synthetic_hlg_clut_profile(rgb_space, description, black_cdm2=0, white_cdm2=400, system_gamma=1.2, ambient_cdm2=5, maxsignal=1.0, content_rgb_space="DCI P3", rolloff=True, clutres=33, mode="ICtCp", forward_xicclu=None, backward_xicclu=None, generate_B2A=False, worker=None, logfile=None): """ Create a synthetic cLUT profile with the HLG TRC from a colorspace definition mode: The gamut mapping mode when rolling off. Valid values: "ICtCp" (default), "XYZ", "HSV" (inaccurate), "RGB" (not recommended, saturation loss) """ if not rolloff: raise NotImplementedError("rolloff needs to be True") return create_synthetic_hdr_clut_profile("HLG", rgb_space, description, black_cdm2, white_cdm2, 0, # Not used for HLG 10000, # Not used for HLG system_gamma, ambient_cdm2, maxsignal, content_rgb_space, clutres, mode, # Not used for HLG forward_xicclu, backward_xicclu, generate_B2A, worker, logfile) def _colord_get_display_profile(display_no=0, path_only=False): edid = get_edid(display_no) if edid: # Try a range of possible device IDs device_ids = [colord.device_id_from_edid(edid, quirk=True, query=True), colord.device_id_from_edid(edid, quirk=True, truncate_edid_strings=True), colord.device_id_from_edid(edid, quirk=True, use_serial_32=False), colord.device_id_from_edid(edid, quirk=True, use_serial_32=False, truncate_edid_strings=True), colord.device_id_from_edid(edid, quirk=False), colord.device_id_from_edid(edid, quirk=False, truncate_edid_strings=True), colord.device_id_from_edid(edid, quirk=False, use_serial_32=False), colord.device_id_from_edid(edid, quirk=False, use_serial_32=False, truncate_edid_strings=True), # Try with manufacturer omitted colord.device_id_from_edid(edid, omit_manufacturer=True), colord.device_id_from_edid(edid, truncate_edid_strings=True, omit_manufacturer=True), colord.device_id_from_edid(edid, use_serial_32=False, omit_manufacturer=True), colord.device_id_from_edid(edid, use_serial_32=False, truncate_edid_strings=True, omit_manufacturer=True)] else: # Fall back to XrandR name try: import RealDisplaySizeMM as RDSMM except ImportError, exception: warnings.warn(safe_str(exception, enc), Warning) return display = RDSMM.get_display(display_no) if display: xrandr_name = display.get("xrandr_name") if xrandr_name: edid = {"monitor_name": xrandr_name} device_ids = ["xrandr-" + xrandr_name] if edid: for device_id in OrderedDict.fromkeys(device_ids).iterkeys(): if device_id: try: profile_path = colord.get_default_profile(device_id) except colord.CDObjectQueryError: # Device ID was not found, try next one continue except colord.CDError, exception: warnings.warn(safe_str(exception, enc), Warning) else: if profile_path: if "hash" in edid: colord.device_ids[edid["hash"]] = device_id if path_only: safe_print("Got profile from colord for display %i " "(%s):" % (display_no, device_id), profile_path) return profile_path return ICCProfile(profile_path) break def _ucmm_get_display_profile(display_no, name, path_only=False): """ Argyll UCMM """ search = [] edid = get_edid(display_no) if edid: # Look for matching EDID entry first search.append(("EDID", "0x" + binascii.hexlify(edid["edid"]).upper())) # Fallback to X11 name search.append(("NAME", name)) for path in [xdg_config_home] + xdg_config_dirs: color_jcnf = os.path.join(path, "color.jcnf") if os.path.isfile(color_jcnf): import json with open(color_jcnf) as f: data = json.load(f) displays = data.get("devices", {}).get("display") if isinstance(displays, dict): # Look for matching entry for key, value in search: for item in displays.itervalues(): if isinstance(item, dict): if item.get(key) == value: profile_path = item.get("ICC_PROFILE") if path_only: safe_print("Got profile from Argyll UCMM " "for display %i (%s %s):" % (display_no, key, value), profile_path) return profile_path return ICCProfile(profile_path) def _wcs_get_display_profile(devicekey, scope=WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"], profile_type=COLORPROFILETYPE["ICC"], profile_subtype=COLORPROFILESUBTYPE["NONE"], profile_id=0, path_only=False): buf = ctypes.create_unicode_buffer(256) if not mscms.WcsGetDefaultColorProfile(scope, devicekey, profile_type, profile_subtype, profile_id, ctypes.sizeof(buf), # Bytes ctypes.byref(buf)): raise util_win.get_windows_error(ctypes.windll.kernel32.GetLastError()) if buf.value: if path_only: return os.path.join(iccprofiles[0], buf.value) return ICCProfile(buf.value) def _winreg_get_display_profile(monkey, current_user=False, path_only=False): filename = None filenames = _winreg_get_display_profiles(monkey, current_user) if filenames: # last existing file in the list is active filename = filenames.pop() if not filename and not current_user: # fall back to sRGB filename = os.path.join(iccprofiles[0], "sRGB Color Space Profile.icm") if filename: if path_only: return os.path.join(iccprofiles[0], filename) return ICCProfile(filename) return None def _winreg_get_display_profiles(monkey, current_user=False): filenames = [] try: if current_user and sys.getwindowsversion() >= (6, ): # Vista / Windows 7 ONLY # User has to place a check in 'use my settings for this device' # in the color management control panel at least once to cause # this key to be created, otherwise it won't exist subkey = "\\".join(["Software", "Microsoft", "Windows NT", "CurrentVersion", "ICM", "ProfileAssociations", "Display"] + monkey) key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, subkey) else: subkey = "\\".join(["SYSTEM", "CurrentControlSet", "Control", "Class"] + monkey) key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey) numsubkeys, numvalues, mtime = _winreg.QueryInfoKey(key) for i in range(numvalues): name, value, type_ = _winreg.EnumValue(key, i) if name == "ICMProfile" and value: if type_ == _winreg.REG_BINARY: # Win2k/XP # convert to list of strings value = value.decode('utf-16').split("\0") elif type_ == _winreg.REG_MULTI_SZ: # Vista / Windows 7 # nothing to be done, _winreg returns a list of strings pass if not isinstance(value, list): value = [value] while "" in value: value.remove("") filenames.extend(value) _winreg.CloseKey(key) except WindowsError, exception: if exception.args[0] == 2: # Key does not exist pass else: raise return filter(lambda filename: os.path.isfile(os.path.join(iccprofiles[0], filename)), filenames) def get_display_profile(display_no=0, x_hostname=None, x_display=None, x_screen=None, path_only=False, devicekey=None, use_active_display_device=True, use_registry=True): """ Return ICC Profile for display n or None """ profile = None if sys.platform == "win32": if not "win32api" in sys.modules: raise ImportError("pywin32 not available") if not devicekey: # The ordering will work as long as Argyll continues using # EnumDisplayMonitors monitors = util_win.get_real_display_devices_info() moninfo = monitors[display_no] if not mscms and not devicekey: # Via GetICMProfile. Sucks royally in a multi-monitor setup # where one monitor is disabled, because it'll always get # the profile of the first monitor regardless if that is the active # one or not. Yuck. Also, in this case it does not reflect runtime # changes to profile assignments. Double yuck. buflen = ctypes.c_ulong(260) dc = win32gui.CreateDC(moninfo["Device"], None, None) try: buf = ctypes.create_unicode_buffer(buflen.value) if ctypes.windll.gdi32.GetICMProfileW(dc, ctypes.byref(buflen), # WCHARs ctypes.byref(buf)): if path_only: profile = buf.value else: profile = ICCProfile(buf.value) finally: win32gui.DeleteDC(dc) else: if devicekey: device = None elif use_active_display_device: # This would be the correct way. Unfortunately that is not # what other apps (or Windows itself) do. device = util_win.get_active_display_device(moninfo["Device"]) else: # This is wrong, but it's what other apps use. Matches # GetICMProfile sucky behavior i.e. should return the same # profile, but atleast reflects runtime changes to profile # assignments. device = util_win.get_first_display_device(moninfo["Device"]) if device: devicekey = device.DeviceKey if devicekey: if mscms: # Via WCS if util_win.per_user_profiles_isenabled(devicekey=devicekey): scope = WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] else: scope = WCS_PROFILE_MANAGEMENT_SCOPE["SYSTEM_WIDE"] if not use_registry: # NOTE: WcsGetDefaultColorProfile causes the whole system # to hitch if the profile of the active display device is # queried. Windows bug? return _wcs_get_display_profile(unicode(devicekey), scope, path_only=path_only) else: scope = None # Via registry monkey = devicekey.split("\\")[-2:] # pun totally intended # Current user scope current_user = scope == WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] if current_user: profile = _winreg_get_display_profile(monkey, True, path_only=path_only) else: # System scope profile = _winreg_get_display_profile(monkey, path_only=path_only) else: if sys.platform == "darwin": if intlist(mac_ver()[0].split(".")) >= [10, 6]: options = ["Image Events"] else: options = ["ColorSyncScripting"] else: options = ["_ICC_PROFILE"] try: import RealDisplaySizeMM as RDSMM except ImportError, exception: warnings.warn(safe_str(exception, enc), Warning) display = get_display() else: display = RDSMM.get_x_display(display_no) if x_hostname is None: x_hostname = display[0] if x_display is None: x_display = display[1] if x_screen is None: x_screen = display[2] x_display_name = "%s:%s.%s" % (x_hostname, x_display, x_screen) for option in options: if sys.platform == "darwin": # applescript: one-based index applescript = ['tell app "%s"' % option, 'set displayProfile to location of display profile of display %i' % (display_no + 1), 'return POSIX path of displayProfile', 'end tell'] retcode, output, errors = osascript(applescript) if retcode == 0 and output.strip(): filename = output.strip("\n").decode(fs_enc) if path_only: profile = filename else: profile = ICCProfile(filename) elif errors.strip(): raise IOError(errors.strip()) else: # Linux # Try colord if colord.which("colormgr"): profile = _colord_get_display_profile(display_no, path_only=path_only) if profile: return profile if path_only: # No way to figure out the profile path from X atom, so use # Argyll's UCMM if libcolordcompat.so is not present if dlopen("libcolordcompat.so"): # UCMM configuration might be stale, ignore return profile = _ucmm_get_display_profile(display_no, x_display_name, path_only) return profile # Try XrandR if xrandr and RDSMM and option == "_ICC_PROFILE": with xrandr.XDisplay(x_display_name) as display: if debug: safe_print("Using XrandR") for i, atom_id in enumerate([RDSMM.get_x_icc_profile_output_atom_id(display_no), RDSMM.get_x_icc_profile_atom_id(display_no)]): if atom_id: if i == 0: meth = display.get_output_property what = RDSMM.GetXRandROutputXID(display_no) else: meth = display.get_window_property what = display.root_window(0) try: property = meth(what, atom_id) except ValueError, exception: warnings.warn(safe_str(exception, enc), Warning) else: if property: profile = ICCProfile("".join(chr(n) for n in property)) if profile: return profile if debug: if i == 0: safe_print("Couldn't get _ICC_PROFILE XrandR output property") safe_print("Using X11") else: safe_print("Couldn't get _ICC_PROFILE X atom") return # Read up to 8 MB of any X properties if debug: safe_print("Using xprop") xprop = which("xprop") if not xprop: return atom = "%s%s" % (option, "" if display_no == 0 else "_%s" % display_no) tgt_proc = sp.Popen([xprop, "-display", "%s:%s.%s" % (x_hostname, x_display, x_screen), "-len", "8388608", "-root", "-notype", atom], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) stdout, stderr = [data.strip("\n") for data in tgt_proc.communicate()] if stdout: if sys.platform == "darwin": filename = unicode(stdout, "UTF-8") if path_only: profile = filename else: profile = ICCProfile(filename) else: raw = [item.strip() for item in stdout.split("=")] if raw[0] == atom and len(raw) == 2: bin = "".join([chr(int(part)) for part in raw[1].split(", ")]) profile = ICCProfile(bin) elif stderr and tgt_proc.wait() != 0: raise IOError(stderr) if profile: break return profile def _wcs_set_display_profile(devicekey, profile_name, scope=WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"]): """ Set the current default WCS color profile for the given device. If the device is a display, this will also set its video card gamma ramps to linear* if the given profile is the display's current default profile and Windows calibration management isn't enabled. Note that the profile needs to have been already installed. * 0..65535 will get mapped to 0..65280, which is a Windows bug """ # We need to disassociate the profile first in case it's not the default # so we can make it the default again. # Note that disassociating the current default profile for a display will # also set its video card gamma ramps to linear if Windows calibration # management isn't enabled. mscms.WcsDisassociateColorProfileFromDevice(scope, profile_name, devicekey) if not mscms.WcsAssociateColorProfileWithDevice(scope, profile_name, devicekey): raise util_win.get_windows_error(ctypes.windll.kernel32.GetLastError()) return True def _wcs_unset_display_profile(devicekey, profile_name, scope=WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"]): """ Unset the current default WCS color profile for the given device. If the device is a display, this will also set its video card gamma ramps to linear* if the given profile is the display's current default profile and Windows calibration management isn't enabled. Note that the profile needs to have been already installed. * 0..65535 will get mapped to 0..65280, which is a Windows bug """ # Disassociating a profile will always (regardless of whether or # not the profile was associated or even exists) result in Windows # error code 2015 ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE. # This is probably a Windows bug. # To have a meaningful return value, we thus check wether the profile that # should be removed is currently associated, and only fail if it is not, # or if disassociating it fails for some reason. monkey = devicekey.split("\\")[-2:] current_user = scope == WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] profiles = _winreg_get_display_profiles(monkey, current_user) if not mscms.WcsDisassociateColorProfileFromDevice(scope, profile_name, devicekey): errcode = ctypes.windll.kernel32.GetLastError() if (errcode == ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE and profile_name in profiles): # Check if profile is still associated profiles = _winreg_get_display_profiles(monkey, current_user) if not profile_name in profiles: # Successfully disassociated return True raise util_win.get_windows_error(errcode) return True def set_display_profile(profile_name, display_no=0, devicekey=None, use_active_display_device=True): # Currently only implemented for Windows. # The profile to be assigned has to be already installed! if not devicekey: device = util_win.get_display_device(display_no, use_active_display_device) if not device: return False devicekey = device.DeviceKey if mscms: if util_win.per_user_profiles_isenabled(devicekey=devicekey): scope = WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] else: scope = WCS_PROFILE_MANAGEMENT_SCOPE["SYSTEM_WIDE"] return _wcs_set_display_profile(unicode(devicekey), profile_name, scope) else: # TODO: Implement for XP return False def unset_display_profile(profile_name, display_no=0, devicekey=None, use_active_display_device=True): # Currently only implemented for Windows. # The profile to be unassigned has to be already installed! if not devicekey: device = util_win.get_display_device(display_no, use_active_display_device) if not device: return False devicekey = device.DeviceKey if mscms: if util_win.per_user_profiles_isenabled(devicekey=devicekey): scope = WCS_PROFILE_MANAGEMENT_SCOPE["CURRENT_USER"] else: scope = WCS_PROFILE_MANAGEMENT_SCOPE["SYSTEM_WIDE"] return _wcs_unset_display_profile(unicode(devicekey), profile_name, scope) else: # TODO: Implement for XP return False def _blend_blackpoint(pcs, row, bp_in, bp_out, wp=None, use_bpc=False, weight=False, D50="D50"): if pcs == "Lab": L, a, b = PCSLab_uInt16_to_dec(*row) X, Y, Z = colormath.Lab2XYZ(L, a, b, D50) else: X, Y, Z = [v / 32768.0 for v in row] if use_bpc: X, Y, Z = colormath.apply_bpc(X, Y, Z, bp_in, bp_out, wp, weight=weight) else: if wp: X, Y, Z = colormath.adapt(X, Y, Z, wp, D50) if bp_in: bp_in = colormath.adapt(*bp_in, whitepoint_source=wp, whitepoint_destination=D50) if bp_out: bp_out = colormath.adapt(*bp_out, whitepoint_source=wp, whitepoint_destination=D50) X, Y, Z = colormath.blend_blackpoint(X, Y, Z, bp_in, bp_out) if wp: X, Y, Z = colormath.adapt(X, Y, Z, D50, wp) if pcs == "Lab": L, a, b = colormath.XYZ2Lab(X, Y, Z, D50) row = [min(max(0, v), 65535) for v in PCSLab_dec_to_uInt16(L, a, b)] else: row = [min(max(0, v) * 32768.0, 65535) for v in (X, Y, Z)] return row def _mp_apply_black(blocks, thread_abort_event, progress_queue, pcs, bp, bp_out, wp, nonzero_bp, use_bpc, weight, D50, interp, rinterp, abortmessage="Aborted"): """ Worker for applying black point compensation or offset This should be spawned as a multiprocessing process """ from debughelpers import Info for interp_tuple in (interp, rinterp): if interp_tuple: # Use numpy for speed interp_list = list(interp_tuple) for i, ointerp in enumerate(interp_list): interp_list[i] = colormath.Interp(ointerp.xp, ointerp.fp, use_numpy=True) interp_list[i].lookup = ointerp.lookup if interp_tuple is interp: interp = interp_list else: rinterp = interp_list prevperc = 0 count = 0 numblocks = len(blocks) for block in blocks: if thread_abort_event and thread_abort_event.is_set(): return Info(abortmessage) for i, row in enumerate(block): if not use_bpc or nonzero_bp: for column, value in enumerate(row): row[column] = interp[column](value) row = _blend_blackpoint(pcs, row, bp, bp_out, wp if use_bpc else None, use_bpc, weight, D50) if not use_bpc or nonzero_bp: for column, value in enumerate(row): row[column] = rinterp[column](value) block[i] = row count += 1.0 perc = round(count / numblocks * 100) if progress_queue and perc > prevperc: progress_queue.put(perc - prevperc) prevperc = perc return blocks def hexrepr(bytestring, mapping=None): hexrepr = "0x%s" % binascii.hexlify(bytestring).upper() ascii = safe_unicode(re.sub("[^\x20-\x7e]", "", bytestring)).encode("ASCII", "replace") if ascii == bytestring: hexrepr += " '%s'" % ascii if mapping: value = mapping.get(ascii) if value: hexrepr += " " + value return hexrepr def dateTimeNumber(binaryString): """ Byte Offset Content Encoded as... 0..1 number of the year (actual year, e.g. 1994) uInt16Number 2..3 number of the month (1-12) uInt16Number 4..5 number of the day of the month (1-31) uInt16Number 6..7 number of hours (0-23) uInt16Number 8..9 number of minutes (0-59) uInt16Number 10..11 number of seconds (0-59) uInt16Number """ Y, m, d, H, M, S = [uInt16Number(chunk) for chunk in (binaryString[:2], binaryString[2:4], binaryString[4:6], binaryString[6:8], binaryString[8:10], binaryString[10:12])] return datetime.datetime(*(Y, m, d, H, M, S)) def dateTimeNumber_tohex(dt): data = [uInt16Number_tohex(n) for n in dt.timetuple()[:6]] return "".join(data) def s15Fixed16Number(binaryString): return struct.unpack(">i", binaryString)[0] / 65536.0 def s15Fixed16Number_tohex(num): return struct.pack(">i", int(round(num * 65536))) def u16Fixed16Number(binaryString): return struct.unpack(">I", binaryString)[0] / 65536.0 def u16Fixed16Number_tohex(num): return struct.pack(">I", int(round(num * 65536)) & 0xFFFFFFFF) def u8Fixed8Number(binaryString): return struct.unpack(">H", binaryString)[0] / 256.0 def u8Fixed8Number_tohex(num): return struct.pack(">H", int(round(num * 256))) def uInt16Number(binaryString): return struct.unpack(">H", binaryString)[0] def uInt16Number_tohex(num): return struct.pack(">H", int(round(num))) def uInt32Number(binaryString): return struct.unpack(">I", binaryString)[0] def uInt32Number_tohex(num): return struct.pack(">I", int(round(num))) def uInt64Number(binaryString): return struct.unpack(">Q", binaryString)[0] def uInt64Number_tohex(num): return struct.pack(">Q", int(round(num))) def uInt8Number(binaryString): return struct.unpack(">H", "\0" + binaryString)[0] def uInt8Number_tohex(num): return struct.pack(">H", int(round(num)))[1] def videoCardGamma(tagData, tagSignature): reserved = uInt32Number(tagData[4:8]) tagType = uInt32Number(tagData[8:12]) if tagType == 0: # table return VideoCardGammaTableType(tagData, tagSignature) elif tagType == 1: # formula return VideoCardGammaFormulaType(tagData, tagSignature) class CRInterpolation(object): """ Catmull-Rom interpolation. Curve passes through the points exactly, with neighbouring points influencing curvature. points[] should be at least 3 points long. """ def __init__(self, points): self.points = points def __call__(self, pos): lbound = int(math.floor(pos) - 1) ubound = int(math.ceil(pos) + 1) t = pos % 1.0 if abs((lbound + 1) - pos) < 0.0001: # sitting on a datapoint, so just return that return self.points[lbound + 1] if lbound < 0: p = self.points[:ubound + 1] # extend to the left linearly while len(p) < 4: p.insert(0, p[0] - (p[1] - p[0])) else: p = self.points[lbound:ubound + 1] # extend to the right linearly while len(p) < 4: p.append(p[-1] - (p[-2] - p[-1])) t2 = t * t return 0.5 * ((2 * p[1]) + (-p[0] + p[2]) * t + ((2 * p[0]) - (5 * p[1]) + (4 * p[2]) - p[3]) * t2 + (-p[0] + (3 * p[1]) - (3 * p[2]) + p[3]) * (t2 * t)) class ADict(dict): """ Convenience class for dictionary key access via attributes. Instead of writing aodict[key], you can also write aodict.key """ def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs) def __getattr__(self, name): if name in self: return self[name] else: return self.__getattribute__(name) def __setattr__(self, name, value): self[name] = value class AODict(ADict, OrderedDict): def __init__(self, *args, **kwargs): OrderedDict.__init__(self, *args, **kwargs) def __setattr__(self, name, value): if name == "_keys": object.__setattr__(self, name, value) else: self[name] = value class LazyLoadTagAODict(AODict): """ Lazy-load (and parse) tag data on access """ def __init__(self, profile, *args, **kwargs): self.profile = profile AODict.__init__(self) def __getitem__(self, key): tag = AODict.__getitem__(self, key) if isinstance(tag, ICCProfileTag): # Return already parsed tag return tag # Load and parse tag data tagSignature = key typeSignature, tagDataOffset, tagDataSize, tagData = tag try: if tagSignature in tagSignature2Tag: tag = tagSignature2Tag[tagSignature](tagData, tagSignature) elif typeSignature in typeSignature2Type: args = tagData, tagSignature if typeSignature in ("clrt", "ncl2"): args += (self.profile.connectionColorSpace, ) if typeSignature == "ncl2": args += (self.profile.colorSpace, ) elif typeSignature in ("XYZ ", "mft2", "curv", "MS10"): args += (self.profile, ) tag = typeSignature2Type[typeSignature](*args) else: tag = ICCProfileTag(tagData, tagSignature) except Exception, exception: raise ICCProfileInvalidError("Couldn't parse tag %r (type %r, offet %i, size %i): %r" % (tagSignature, typeSignature, tagDataOffset, tagDataSize, exception)) self[key] = tag return tag def __setattr__(self, name, value): if name == "profile": object.__setattr__(self, name, value) else: AODict.__setattr__(self, name, value) def get(self, key, default=None): if key in self: return self[key] return default class ICCProfileTag(object): def __init__(self, tagData, tagSignature): self.tagData = tagData self.tagSignature = tagSignature def __setattr__(self, name, value): if not isinstance(self, dict) or name in ("_keys", "tagData", "tagSignature"): object.__setattr__(self, name, value) else: self[name] = value def __repr__(self): """ t.__repr__() <==> repr(t) """ if isinstance(self, OrderedDict): return OrderedDict.__repr__(self) elif isinstance(self, dict): return dict.__repr__(self) elif isinstance(self, UserString): return UserString.__repr__(self) elif isinstance(self, list): return list.__repr__(self) else: if not self: return "%s.%s()" % (self.__class__.__module__, self.__class__.__name__) return "%s.%s(%r)" % (self.__class__.__module__, self.__class__.__name__, self.tagData) class Text(ICCProfileTag, UserString, str): def __init__(self, seq): UserString.__init__(self, seq) def __unicode__(self): return unicode(self.data, fs_enc, errors="replace") class Colorant(object): def __init__(self, binaryString="\0" * 4): self._type = uInt32Number(binaryString) self._channels = [] def __getitem__(self, key): return self.__getattribute__(key) def __iter__(self): return iter(self.keys()) def __repr__(self): items = [] for key, value in (("type", self.type), ("description", self.description)): items.append("%s: %s" % (repr(key), repr(value))) channels = [] for xy in self.channels: channels.append("[%s]" % ", ".join([str(v) for v in xy])) items.append("'channels': [%s]" % ", ".join(channels)) return "{%s}" % ", ".join(items) def __setitem__(self, key, value): object.__setattr__(self, key, value) @Property def channels(): def fget(self): if not self._channels and self._type and self._type in colorants: return [list(xy) for xy in colorants[self._type]["channels"]] return self._channels def fset(self, channels): self._channels = channels return locals() @Property def description(): def fget(self): return colorants.get(self._type, colorants[0])["description"] def fset(self, value): pass return locals() def get(self, key, default=None): return getattr(self, key, default) def items(self): return zip(self.keys(), self.values()) def iteritems(self): return izip(self.keys(), self.itervalues()) iterkeys = __iter__ def itervalues(self): return imap(self.get, self.keys()) def keys(self): return ["type", "description", "channels"] def round(self, digits=4): colorant = self.__class__() colorant.type = self.type for xy in self.channels: colorant._channels.append([round(value, digits) for value in xy]) return colorant @Property def type(): def fget(self): return self._type def fset(self, value): if value and value != self._type and value in colorants: self._channels = [] self._type = value return locals() def update(self, *args, **kwargs): if len(args) > 1: raise TypeError("update expected at most 1 arguments, got %i" % len(args)) for iterable in args + tuple(kwargs.items()): if hasattr(iterable, "iteritems"): self.update(iterable.iteritems()) elif hasattr(iterable, "keys"): for key in iterable.keys(): self[key] = iterable[key] else: for key, val in iterable: self[key] = val def values(self): return map(self.get, self.keys()) class Geometry(ADict): def __init__(self, binaryString): self.type = uInt32Number(binaryString) self.description = geometry[self.type] class Illuminant(ADict): def __init__(self, binaryString): self.type = uInt32Number(binaryString) self.description = illuminants[self.type] class LUT16Type(ICCProfileTag): def __init__(self, tagData=None, tagSignature=None, profile=None): ICCProfileTag.__init__(self, tagData, tagSignature) self.profile = profile self._matrix = None self._input = None self._clut = None self._output = None self._i = (tagData and uInt8Number(tagData[8])) or 0 # Input channel count self._o = (tagData and uInt8Number(tagData[9])) or 0 # Output channel count self._g = (tagData and uInt8Number(tagData[10])) or 0 # cLUT grid res self._n = (tagData and uInt16Number(tagData[48:50])) or 0 # Input channel entries count self._m = (tagData and uInt16Number(tagData[50:52])) or 0 # Output channel entries count def apply_black_offset(self, XYZbp, logfile=None, thread_abort=None, abortmessage="Aborted"): # Apply only the black point blending portion of BT.1886 mapping self._apply_black(XYZbp, False, False, logfile, thread_abort, abortmessage) def apply_bpc(self, bp_out=(0, 0, 0), weight=False, logfile=None, thread_abort=None, abortmessage="Aborted"): return self._apply_black(bp_out, True, weight, logfile, thread_abort, abortmessage) def _apply_black(self, bp_out, use_bpc=False, weight=False, logfile=None, thread_abort=None, abortmessage="Aborted"): pcs = self.profile and self.profile.connectionColorSpace bp_row = list(self.clut[0][0]) wp_row = list(self.clut[-1][-1]) nonzero_bp = tuple(bp_out) != (0, 0, 0) interp = [] rinterp = [] if not use_bpc or nonzero_bp: osize = len(self.output[0]) omaxv = osize - 1.0 orange = [i / omaxv * 65535 for i in xrange(osize)] for i in xrange(3): interp.append(colormath.Interp(orange, self.output[i])) rinterp.append(colormath.Interp(self.output[i], orange)) for row in (bp_row, wp_row): for column, value in enumerate(row): row[column] = interp[column](value) if use_bpc: method = "apply_bpc" else: method = "apply_black_offset" if pcs == "Lab": bp = colormath.Lab2XYZ(*PCSLab_uInt16_to_dec(*bp_row)) wp = colormath.Lab2XYZ(*PCSLab_uInt16_to_dec(*wp_row)) elif not pcs or pcs == "XYZ": if not pcs: warnings.warn("LUT16Type.%s: PCS not specified, " "assuming XYZ" % method, Warning) bp = [v / 32768.0 for v in bp_row] wp = [v / 32768.0 for v in wp_row] else: raise ValueError("LUT16Type.%s: Unsupported PCS %r" % (method, pcs)) if [round(v * 32768) for v in bp] != [round(v * 32768) for v in bp_out]: D50 = colormath.get_whitepoint("D50") from multiprocess import pool_slice if len(self.clut[0]) < 33: num_workers = 1 else: num_workers = None ##if pcs != "Lab" and nonzero_bp: ##bp_out_offset = bp_out ##bp_out = (0, 0, 0) if bp != bp_out: self.clut = sum(pool_slice(_mp_apply_black, self.clut, (pcs, bp, bp_out, wp, nonzero_bp, use_bpc, weight, D50, interp, rinterp, abortmessage), {}, num_workers, thread_abort, logfile), []) ##if pcs != "Lab" and nonzero_bp: ### Apply black offset to output curves ##out = [[], [], []] ##for i in xrange(2049): ##v = i / 2048.0 ##X, Y, Z = colormath.blend_blackpoint(v, v, v, (0, 0, 0), ##bp_out_offset) ##out[0].append(X * 2048 / 4095.0 * 65535) ##out[1].append(Y * 2048 / 4095.0 * 65535) ##out[2].append(Z * 2048 / 4095.0 * 65535) ##for i in xrange(2049, 4096): ##v = i / 4095.0 ##out[0].append(v * 65535) ##out[1].append(v * 65535) ##out[2].append(v * 65535) ##self.output = out @Property def clut(): def fget(self): if self._clut is None: i, o, g, n = self._i, self._o, self._g, self._n tagData = self._tagData self._clut = [[[uInt16Number(tagData[52 + n * i * 2 + o * 2 * (g * x + y) + z * 2: 54 + n * i * 2 + o * 2 * (g * x + y) + z * 2]) for z in xrange(o)] for y in xrange(g)] for x in xrange(g ** i / g)] return self._clut def fset(self, value): self._clut = value return locals() def clut_writepng(self, stream_or_filename): """ Write the cLUT as PNG image organized in * sized squares, ordered vertically """ if len(self.clut[0][0]) != 3: raise NotImplementedError("clut_writepng: output channels != 3") imfile.write(self.clut, stream_or_filename) @property def clut_grid_steps(self): """ Return number of grid points per dimension. """ return self._g @Property def input(): def fget(self): if self._input is None: i, n = self._i, self._n tagData = self._tagData self._input = [[uInt16Number(tagData[52 + n * 2 * z + y * 2: 54 + n * 2 * z + y * 2]) for y in xrange(n)] for z in xrange(i)] return self._input def fset(self, value): self._input = value return locals() @property def input_channels_count(self): """ Return number of input channels. """ return self._i @property def input_entries_count(self): """ Return number of entries per input channel. """ return self._n def invert(self): """ Invert input and output tables. """ # Invert input/output 1d LUTs for channel in (self.input, self.output): for e, entries in enumerate(channel): lut = OrderedDict() maxv = len(entries) - 1.0 for i, entry in enumerate(entries): lut[entry / 65535.0 * maxv] = i / maxv * 65535 xp = lut.keys() fp = lut.values() for i in xrange(len(entries)): if not i in lut: lut[i] = colormath.interp(i, xp, fp) lut.sort() channel[e] = lut.values() @Property def matrix(): def fget(self): if self._matrix is None: tagData = self._tagData return colormath.Matrix3x3([(s15Fixed16Number(tagData[12:16]), s15Fixed16Number(tagData[16:20]), s15Fixed16Number(tagData[20:24])), (s15Fixed16Number(tagData[24:28]), s15Fixed16Number(tagData[28:32]), s15Fixed16Number(tagData[32:36])), (s15Fixed16Number(tagData[36:40]), s15Fixed16Number(tagData[40:44]), s15Fixed16Number(tagData[44:48]))]) return self._matrix def fset(self, value): self._matrix = value return locals() @Property def output(): def fget(self): if self._output is None: i, o, g, n, m = self._i, self._o,self._g, self._n, self._m tagData = self._tagData self._output = [[uInt16Number(tagData[52 + n * i * 2 + m * 2 * z + y * 2 + g ** i * o * 2: 54 + n * i * 2 + m * 2 * z + y * 2 + g ** i * o * 2]) for y in xrange(m)] for z in xrange(o)] return self._output def fset(self, value): self._output = value return locals() @property def output_channels_count(self): """ Return number of output channels. """ return self._o @property def output_entries_count(self): """ Return number of entries per output channel. """ return self._m def smooth(self, diagpng=2, pcs=None, filename=None, logfile=None): """ Apply extra smoothing to the cLUT """ if not pcs: if self.profile: pcs = self.profile.connectionColorSpace else: raise TypeError("PCS not specified") if not filename and self.profile: filename = self.profile.fileName clutres = len(self.clut[0]) sig = self.tagSignature or id(self) if diagpng and filename: # Generate diagnostic images fname, ext = os.path.splitext(filename) if diagpng == 2: self.clut_writepng(fname + ".%s.pre-smoothing.CLUT.png" % sig) if logfile: logfile.write("Smoothing %s...\n" % sig) # Create a list of number of 2D grids, each one with a # size of (width x height) x grids = [] for i, block in enumerate(self.clut): if i % clutres == 0: grids.append([]) grids[-1].append([]) for RGB in block: grids[-1][-1].append(RGB) for i, grid in enumerate(grids): for y in xrange(clutres): for x in xrange(clutres): is_dark = sum(grid[y][x]) < 65535 * .03125 * 3 if pcs == "XYZ": is_gray = x == y == i elif clutres // 2 != clutres / 2.0: # For CIELab cLUT, gray will only # fall on a cLUT point if uneven cLUT res is_gray = x == y == clutres // 2 else: is_gray = False ##print i, y, x, "%i %i %i" % tuple(v / 655.35 * 2.55 for v in grid[y][x]), is_dark, raw_input(is_gray) if is_gray else '' if is_dark or is_gray: # Don't smooth dark colors and gray axis continue RGB = [[v] for v in grid[y][x]] # Use either "plus"-shaped or box filter depending if one # channel is fully saturated if clutres - 1 in (i, y, x): # Filter with a "plus" (+) shape if (pcs == "Lab" and i > clutres / 2.0): # Smoothing factor for L*a*b* -> RGB cLUT above 50% smooth = 0.25 else: smooth = 1.0 for j, c in enumerate((x, y)): if c > 0 and c < clutres - 1 and y < clutres - 1: for n in (-1, 1): RGBn = grid[(y, y + n)[j]][(x + n, x)[j]] for k in xrange(3): RGB[k].append(RGBn[k] * smooth + RGB[k][0] * (1 - smooth)) else: # Box filter, 3x3 # Center pixel weight = 1.0, surround = 0.5 for j in (0, 1): for n in (-1, 1): yi, xi = (y, y + n)[j], (x + n, x)[j] if (xi > -1 and yi > -1 and xi < clutres and yi < clutres): RGBn = grid[yi][xi] for k in xrange(3): RGB[k].append(RGBn[k] * 0.5 + RGB[k][0] * 0.5) yi, xi = y - n, (x + n, x - n)[j] if (xi > -1 and yi > -1 and xi < clutres and yi < clutres): RGBn = grid[yi][xi] for k in xrange(3): RGB[k].append(RGBn[k] * 0.5 + RGB[k][0] * 0.5) grid[y][x] = [sum(v) / float(len(v)) for v in RGB] for j, row in enumerate(grid): self.clut[i * clutres + j] = [[v for v in RGB] for RGB in row] if diagpng and filename: self.clut_writepng(fname + ".%s.post.CLUT.extrasmooth.png" % sig) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): if (self._matrix, self._input, self._clut, self._output) == (None, ) * 4: return self._tagData tagData = ["mft2", "\0" * 4, uInt8Number_tohex(len(self.input)), uInt8Number_tohex(len(self.output)), uInt8Number_tohex(len(self.clut and self.clut[0])), "\0", s15Fixed16Number_tohex(self.matrix[0][0]), s15Fixed16Number_tohex(self.matrix[0][1]), s15Fixed16Number_tohex(self.matrix[0][2]), s15Fixed16Number_tohex(self.matrix[1][0]), s15Fixed16Number_tohex(self.matrix[1][1]), s15Fixed16Number_tohex(self.matrix[1][2]), s15Fixed16Number_tohex(self.matrix[2][0]), s15Fixed16Number_tohex(self.matrix[2][1]), s15Fixed16Number_tohex(self.matrix[2][2]), uInt16Number_tohex(len(self.input and self.input[0])), uInt16Number_tohex(len(self.output and self.output[0]))] for entries in self.input: tagData.extend(uInt16Number_tohex(v) for v in entries) for block in self.clut: for entries in block: tagData.extend(uInt16Number_tohex(v) for v in entries) for entries in self.output: tagData.extend(uInt16Number_tohex(v) for v in entries) return "".join(tagData) def fset(self, tagData): self._tagData = tagData return locals() class Observer(ADict): def __init__(self, binaryString): self.type = uInt32Number(binaryString) self.description = observers[self.type] class ChromaticityType(ICCProfileTag, Colorant): def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) if not tagData: Colorant.__init__(self, uInt32Number_tohex(1)) return deviceChannelsCount = uInt16Number(tagData[8:10]) Colorant.__init__(self, uInt32Number_tohex(uInt16Number(tagData[10:12]))) channels = tagData[12:] for count in xrange(deviceChannelsCount): self._channels.append([u16Fixed16Number(channels[:4]), u16Fixed16Number(channels[4:8])]) channels = channels[8:] __repr__ = Colorant.__repr__ @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["chrm", "\0" * 4, uInt16Number_tohex(len(self.channels))] tagData.append(uInt16Number_tohex(self.type)) for channel in self.channels: for xy in channel: tagData.append(u16Fixed16Number_tohex(xy)) return "".join(tagData) def fset(self, tagData): pass return locals() class ColorantTableType(ICCProfileTag, AODict): def __init__(self, tagData=None, tagSignature=None, pcs=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) if not tagData: return colorantCount = uInt32Number(tagData[8:12]) data = tagData[12:] for count in xrange(colorantCount): pcsvalues = [uInt16Number(data[32:34]), uInt16Number(data[34:36]), uInt16Number(data[36:38])] for i, pcsvalue in enumerate(pcsvalues): if pcs in ("Lab", "RGB", "CMYK", "YCbr"): keys = ["L", "a", "b"] if i == 0: # L* range 0..100 + (25500 / 65280.0) pcsvalues[i] = pcsvalue / 65536.0 * 256 / 255.0 * 100 else: # a, b range -128..127 + (255 / 256.0) pcsvalues[i] = -128 + (pcsvalue / 65536.0 * 256) elif pcs == "XYZ": # X, Y, Z range 0..100 + (32767 / 32768.0) keys = ["X", "Y", "Z"] pcsvalues[i] = pcsvalue / 32768.0 * 100 else: safe_print("Warning: Non-standard profile connection " "space '%s'" % pcs) return end = data[:32].find("\0") if end < 0: end = 32 name = data[:end] self[name] = AODict(zip(keys, pcsvalues)) data = data[38:] class CurveType(ICCProfileTag, list): def __init__(self, tagData=None, tagSignature=None, profile=None): ICCProfileTag.__init__(self, tagData, tagSignature) self.profile = profile self._reset() if not tagData: return curveEntriesCount = uInt32Number(tagData[8:12]) curveEntries = tagData[12:] if curveEntriesCount == 1: # Gamma self.append(u8Fixed8Number(curveEntries[:2])) elif curveEntriesCount: # Curve for count in xrange(curveEntriesCount): self.append(uInt16Number(curveEntries[:2])) curveEntries = curveEntries[2:] else: # Identity self.append(1.0) def __delitem__(self, y): list.__delitem__(self, y) self._reset() def __delslice__(self, i, j): list.__delslice__(self, i, j) self._reset() def __iadd__(self, y): list.__iadd__(self, y) self._reset() def __imul__(self, y): list.__imul__(self, y) self._reset() def __setitem__(self, i, y): list.__setitem__(self, i, y) self._reset() def __setslice__(self, i, j, y): list.__setslice__(self, i, j, y) self._reset() def _reset(self): self._transfer_function = {} self._bt1886 = {} def append(self, object): list.append(self, object) self._reset() def apply_bpc(self, black_Y_out=0, weight=False): if len(self) < 2: return D50_xyY = colormath.XYZ2xyY(*colormath.get_whitepoint("D50")) bp_in = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], self[0] / 65535.0) bp_out = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], black_Y_out) wp_out = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], self[-1] / 65535.0) for i, v in enumerate(self): X, Y, Z = colormath.xyY2XYZ(D50_xyY[0], D50_xyY[1], v / 65535.0) self[i] = colormath.apply_bpc(X, Y, Z, bp_in, bp_out, wp_out, weight)[1] * 65535.0 def extend(self, iterable): list.extend(self, iterable) self._reset() def get_gamma(self, use_vmin_vmax=False, average=True, least_squares=False, slice=(0.01, 0.99), lstar_slice=True): """ Return average or least squares gamma or a list of gamma values """ if len(self) <= 1: if len(self): values = self else: # Identity values = [1.0] if average or least_squares: return values[0] return [values[0]] if lstar_slice: start = slice[0] * 100 end = slice[1] * 100 values = [] for i, y in enumerate(self): n = colormath.XYZ2Lab(0, y / 65535.0 * 100, 0)[0] if n >= start and n <= end: values.append((i / (len(self) - 1.0) * 65535.0, y)) else: maxv = len(self) - 1.0 maxi = int(maxv) starti = int(round(slice[0] * maxi)) endi = int(round(slice[1] * maxi)) + 1 values = zip([(v / maxv) * 65535 for v in xrange(starti, endi)], self[starti:endi]) vmin = 0 vmax = 65535.0 if use_vmin_vmax: if len(self) > 2: vmin = self[0] vmax = self[-1] return colormath.get_gamma(values, 65535.0, vmin, vmax, average, least_squares) def get_transfer_function(self, best=True, slice=(0.05, 0.95), black_Y=None, outoffset=None): """ Return transfer function name, exponent and match percentage """ if len(self) == 1: # Gamma return ("Gamma %.2f" % round(self[0], 2), self[0], 1.0), 1.0 if not len(self): # Identity return ("Gamma 1.0", 1.0, 1.0), 1.0 transfer_function = self._transfer_function.get((best, slice)) if transfer_function: return transfer_function trc = CurveType() match = {} otrc = CurveType() otrc[:] = self if otrc[0]: otrc.apply_bpc() vmin = otrc[0] vmax = otrc[-1] if self.profile and isinstance(self.profile.tags.get("lumi"), XYZType): white_cdm2 = self.profile.tags.lumi.Y else: white_cdm2 = 100.0 if black_Y is None: black_Y = self[0] / 65535.0 black_cdm2 = black_Y * white_cdm2 maxv = len(otrc) - 1.0 maxi = int(maxv) starti = int(round(0.4 * maxi)) endi = int(round(0.6 * maxi)) gamma = otrc.get_gamma(True, slice=(0.4, 0.6), lstar_slice=False) egamma = colormath.get_gamma([(0.5, 0.5 ** gamma)], vmin=-black_Y) outoffset_unspecified = outoffset is None if outoffset_unspecified: outoffset = 1.0 tfs = [("Rec. 709", -709, outoffset), ("Rec. 1886", -1886, 0), ("SMPTE 240M", -240, outoffset), ("SMPTE 2084", -2084, outoffset), ("DICOM", -1023, outoffset), ("HLG", -2, outoffset), ("L*", -3.0, outoffset), ("sRGB", -2.4, outoffset), ("Gamma %.2f %i%%" % (round(gamma, 2), round(outoffset * 100)), gamma, outoffset)] if outoffset_unspecified and black_Y: for i in xrange(100): tfs.append(("Gamma %.2f %i%%" % (round(gamma, 2), i), gamma, i / 100.0)) for name, exp, outoffset in tfs: if name in ("DICOM", "Rec. 1886", "SMPTE 2084", "HLG"): try: if name == "DICOM": trc.set_dicom_trc(black_cdm2, white_cdm2, size=len(self)) elif name == "Rec. 1886": trc.set_bt1886_trc(black_Y, size=len(self)) elif name == "SMPTE 2084": trc.set_smpte2084_trc(black_cdm2, white_cdm2, size=len(self)) elif name == "HLG": trc.set_hlg_trc(black_cdm2, white_cdm2, size=len(self)) except ValueError: continue elif exp > 0 and black_Y: trc.set_bt1886_trc(black_Y, outoffset, egamma, "b") else: trc.set_trc(exp, len(self), vmin, vmax) if trc[0]: trc.apply_bpc() if otrc == trc: match[(name, exp, outoffset)] = 1.0 else: match[(name, exp, outoffset)] = 0.0 count = 0 start = slice[0] * len(self) end = slice[1] * len(self) for i, n in enumerate(otrc): ##n = colormath.XYZ2Lab(0, n / 65535.0 * 100, 0)[0] if i >= start and i <= end: n = colormath.get_gamma([(i / (len(self) - 1.0) * 65535.0, n)], 65535.0, vmin, vmax, False) if n: n = n[0] ##n2 = colormath.XYZ2Lab(0, trc[i] / 65535.0 * 100, 0)[0] n2 = colormath.get_gamma([(i / (len(self) - 1.0) * 65535.0, trc[i])], 65535.0, vmin, vmax, False) if n2 and n2[0]: n2 = n2[0] match[(name, exp, outoffset)] += 1 - (max(n, n2) - min(n, n2)) / ((n + n2) / 2.0) count += 1 if count: match[(name, exp, outoffset)] /= count if not best: self._transfer_function[(best, slice)] = match return match match, (name, exp, outoffset) = sorted(zip(match.values(), match.keys()))[-1] self._transfer_function[(best, slice)] = (name, exp, outoffset), match return (name, exp, outoffset), match def insert(self, object): list.insert(self, object) self._reset() def pop(self, index): list.pop(self, index) self._reset() def remove(self, value): list.remove(self, value) self._reset() def reverse(self): list.reverse(self) self._reset() def set_bt1886_trc(self, black_Y=0, outoffset=0.0, gamma=2.4, gamma_type="B", size=None): """ Set the response to the BT. 1886 curve This response is special in that it depends on the actual black level of the display. """ bt1886 = self._bt1886.get((gamma, black_Y, outoffset)) if bt1886: return bt1886 if gamma_type in ("b", "g"): # Get technical gamma needed to achieve effective gamma gamma = colormath.xicc_tech_gamma(gamma, black_Y, outoffset) rXYZ = colormath.RGB2XYZ(1.0, 0, 0) gXYZ = colormath.RGB2XYZ(0, 1.0, 0) bXYZ = colormath.RGB2XYZ(0, 0, 1.0) mtx = colormath.Matrix3x3([[rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]]]) wXYZ = colormath.RGB2XYZ(1.0, 1.0, 1.0) x, y = colormath.XYZ2xyY(*wXYZ)[:2] XYZbp = colormath.xyY2XYZ(x, y, black_Y) bt1886 = colormath.BT1886(mtx, XYZbp, outoffset, gamma) self._bt1886[(gamma, black_Y, outoffset)] = bt1886 self.set_trc(-709, size) for i, v in enumerate(self): X, Y, Z = colormath.xyY2XYZ(x, y, v / 65535.0) self[i] = bt1886.apply(X, Y, Z)[1] * 65535.0 def set_dicom_trc(self, black_cdm2=.05, white_cdm2=100, size=None): """ Set the response to the DICOM Grayscale Standard Display Function This response is special in that it depends on the actual black and white level of the display. """ # See http://medical.nema.org/Dicom/2011/11_14pu.pdf # Luminance levels depend on the start level of 0.05 cd/m2 # and end level of 4000 cd/m2 if black_cdm2 < .05 or black_cdm2 >= white_cdm2: raise ValueError("The black level of %f cd/m2 is out of range " "for DICOM. Valid range begins at 0.05 cd/m2." % black_cdm2) if white_cdm2 > 4000 or white_cdm2 <= black_cdm2: raise ValueError("The white level of %f cd/m2 is out of range " "for DICOM. Valid range is up to 4000 cd/m2." % white_cdm2) black_jndi = colormath.DICOM(black_cdm2, True) white_jndi = colormath.DICOM(white_cdm2, True) white_dicomY = math.pow(10, colormath.DICOM(white_jndi)) if not size: size = len(self) if size < 2: size = 1024 self[:] = [] for i in xrange(size): v = math.pow(10, colormath.DICOM(black_jndi + (float(i) / (size - 1)) * (white_jndi - black_jndi))) / white_dicomY self.append(v * 65535) def set_hlg_trc(self, black_cdm2=0, white_cdm2=100, system_gamma=1.2, ambient_cdm2=5, maxsignal=1.0, size=None): """ Set the response to the Hybrid Log-Gamma (HLG) function This response is special in that it depends on the actual black and white level of the display, system gamma and ambient. XYZbp Black point in absolute XYZ, Y range 0..white_cdm2 maxsignal Set clipping point (optional) size Number of steps. Recommended >= 1024 """ if black_cdm2 < 0 or black_cdm2 >= white_cdm2: raise ValueError("The black level of %f cd/m2 is out of range " "for HLG. Valid range begins at 0 cd/m2." % black_cdm2) values = [] hlg = colormath.HLG(black_cdm2, white_cdm2, system_gamma, ambient_cdm2) if maxsignal < 1: # Adjust EOTF so that EOTF[maxsignal] gives (approx) white_cdm2 while hlg.eotf(maxsignal) * hlg.white_cdm2 < white_cdm2: hlg.white_cdm2 += 1 lscale = 1.0 / hlg.oetf(1.0, True) hlg.white_cdm2 *= lscale if lscale < 1 and logfile: logfile.write("Nominal peak luminance after scaling = %.2f\n" % hlg.white_cdm2) maxv = hlg.eotf(maxsignal) if not size: size = len(self) if size < 2: size = 1024 for i in xrange(size): n = i / (size - 1.0) v = hlg.eotf(min(n, maxsignal)) values.append(min(v / maxv, 1.0)) self[:] = [min(v * 65535, 65535) for v in values] def set_smpte2084_trc(self, black_cdm2=0, white_cdm2=100, master_black_cdm2=0, master_white_cdm2=None, rolloff=False, size=None): """ Set the response to the SMPTE 2084 perceptual quantizer (PQ) function This response is special in that it depends on the actual black and white level of the display. black_cdm2 Black point in absolute Y, range 0..white_cdm2 master_black_cdm2 (Optional) Used to normalize PQ values master_white_cdm2 (Optional) Used to normalize PQ values rolloff BT.2390 size Number of steps. Recommended >= 1024 """ # See https://www.smpte.org/sites/default/files/2014-05-06-EOTF-Miller-1-2-handout.pdf # Luminance levels depend on the end level of 10000 cd/m2 if black_cdm2 < 0 or black_cdm2 >= white_cdm2: raise ValueError("The black level of %f cd/m2 is out of range " "for SMPTE 2084. Valid range begins at 0 cd/m2." % black_cdm2) if max(white_cdm2, master_white_cdm2) > 10000: raise ValueError("The white level of %f cd/m2 is out of range " "for SMPTE 2084. Valid range is up to 10000 cd/m2." % max(white_cdm2, master_white_cdm2)) values = [] maxv = white_cdm2 / 10000.0 maxi = colormath.specialpow(maxv, 1.0 / -2084) if rolloff: # Rolloff as defined in ITU-R BT.2390 if not master_white_cdm2: master_white_cdm2 = 10000 bt2390 = colormath.BT2390(black_cdm2, white_cdm2, master_black_cdm2, master_white_cdm2) maxi_out = maxi else: if not master_white_cdm2: master_white_cdm2 = white_cdm2 maxi_out = colormath.specialpow(master_white_cdm2 / 10000.0, 1.0 / -2084) if not size: size = len(self) if size < 2: size = 1024 for i in xrange(size): n = i / (size - 1.0) if rolloff: n = bt2390.apply(n) v = colormath.specialpow(n * (maxi / maxi_out), -2084) values.append(min(v / maxv, 1.0)) self[:] = [min(v * 65535, 65535) for v in values] if black_cdm2 and not rolloff: self.apply_bpc(black_cdm2 / white_cdm2) def set_trc(self, power=2.2, size=None, vmin=0, vmax=65535): """ Set the response to a certain function. Positive power, or -2.4 = sRGB, -3.0 = L*, -240 = SMPTE 240M, -601 = Rec. 601, -709 = Rec. 709 (Rec. 601 and 709 transfer functions are identical) """ if not size: size = len(self) or 1024 if size == 1: if power >= 0.0 and not vmin: self[:] = [power] return else: size = 1024 self[:] = [] for i in xrange(0, size): self.append(vmin + colormath.specialpow(float(i) / (size - 1), power) * (vmax - vmin)) def smooth_cr(self, length=64): """ Smooth curves (Catmull-Rom). """ raise NotImplementedError() def smooth_avg(self, passes=1, window=None): """ Smooth curves (moving average). passses Number of passes window Tuple or list containing weighting factors. Its length determines the size of the window to use. Defaults to (1.0, 1.0, 1.0) """ self[:] = colormath.smooth_avg(self, passes, window) def sort(self, cmp=None, key=None, reverse=False): list.sort(self, cmp, key, reverse) self._reset() @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): if len(self) == 1 and self[0] == 1.0: # Identity curveEntriesCount = 0 else: curveEntriesCount = len(self) tagData = ["curv", "\0" * 4, uInt32Number_tohex(curveEntriesCount)] if curveEntriesCount == 1: # Gamma tagData.append(u8Fixed8Number_tohex(self[0])) elif curveEntriesCount: # Curve for curveEntry in self: tagData.append(uInt16Number_tohex(curveEntry)) return "".join(tagData) def fset(self, tagData): pass return locals() class DateTimeType(ICCProfileTag, datetime.datetime): def __new__(cls, tagData, tagSignature): dt = dateTimeNumber(tagData[8:20]) return datetime.datetime.__new__(cls, dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second) class DictList(list): def __getitem__(self, key): for item in self: if item[0] == key: return item raise KeyError(key) def __setitem__(self, key, value): if not isinstance(value, DictListItem): self.append(DictListItem((key, value))) class DictListItem(list): def __iadd__(self, value): self[-1] += value return self class DictType(ICCProfileTag, AODict): """ ICC dictType Tag Implements all features of 'Dictionary Type and Metadata TAG Definition' (ICC spec revision 2010-02-25), including shared data (the latter will only be effective for mutable types, ie. MultiLocalizedUnicodeType) Examples: tag[key] Returns the (non-localized) value tag.getname(key, locale='en_US') Returns the localized name if present tag.getvalue(key, locale='en_US') Returns the localized value if present tag[key] = value Sets the (non-localized) value """ def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) if not tagData: return numrecords = uInt32Number(tagData[8:12]) recordlen = uInt32Number(tagData[12:16]) if recordlen not in (16, 24, 32): safe_print("Error (non-critical): '%s' invalid record length " "(expected 16, 24 or 32, got %s)" % (tagData[:4], recordlen)) return elements = {} for n in range(0, numrecords): record = tagData[16 + n * recordlen:16 + (n + 1) * recordlen] if len(record) < recordlen: safe_print("Error (non-critical): '%s' record %s too short " "(expected %s bytes, got %s bytes)" % (tagData[:4], n, recordlen, len(record))) break for key, offsetpos in (("name", 0), ("value", 8), ("display_name", 16), ("display_value", 24)): if (offsetpos in (0, 8) or recordlen == offsetpos + 8 or recordlen == offsetpos + 16): # Required: # Bytes 0..3, 4..7: Name offset and size # Bytes 8..11, 12..15: Value offset and size # Optional: # Bytes 16..23, 24..23: Display name offset and size # Bytes 24..27, 28..31: Display value offset and size offset = uInt32Number(record[offsetpos:offsetpos + 4]) size = uInt32Number(record[offsetpos + 4:offsetpos + 8]) if offset > 0: if (offset, size) in elements: # Use existing element if same offset and size # This will really only make a difference for # mutable types ie. MultiLocalizedUnicodeType data = elements[(offset, size)] else: data = tagData[offset:offset + size] try: if key.startswith("display_"): data = MultiLocalizedUnicodeType(data, "mluc") else: data = data.decode("UTF-16-BE", "replace").rstrip("\0") except Exception, exception: safe_print("Error (non-critical): could not " "decode '%s', offset %s, length %s" % (tagData[:4], offset, size)) # Remember element by offset and size elements[(offset, size)] = data if key == "name": name = data self[name] = "" else: self.get(name)[key] = data def __getitem__(self, name): return self.get(name).value def __setitem__(self, name, value): AODict.__setitem__(self, name, ADict(value=value)) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): numrecords = len(self) recordlen = 16 keys = ("name", "value") for value in self.itervalues(): if "display_value" in value: recordlen = 32 break elif "display_name" in value: recordlen = 24 if recordlen > 16: keys += ("display_name", ) if recordlen > 24: keys += ("display_value", ) tagData = ["dict", "\0" * 4, uInt32Number_tohex(numrecords), uInt32Number_tohex(recordlen)] storage_offset = 16 + numrecords * recordlen storage = [] elements = [] offsets = [] for item in self.iteritems(): for key in keys: if key == "name": element = item[0] else: element = item[1].get(key) if element is None: offset = 0 size = 0 else: if element in elements: # Use existing offset and size if same element offset, size = offsets[elements.index(element)] else: offset = storage_offset + len("".join(storage)) if isinstance(element, MultiLocalizedUnicodeType): data = element.tagData else: data = unicode(element).encode("UTF-16-BE") size = len(data) if isinstance(element, MultiLocalizedUnicodeType): # Remember element, offset and size elements.append(element) offsets.append((offset, size)) # Pad all data with binary zeros so it lies on # 4-byte boundaries padding = int(math.ceil(size / 4.0)) * 4 - size data += "\0" * padding storage.append(data) tagData.append(uInt32Number_tohex(offset)) tagData.append(uInt32Number_tohex(size)) tagData.extend(storage) return "".join(tagData) def fset(self, tagData): pass return locals() def getname(self, name, default=None, locale="en_US"): """ Convenience function to get (localized) names """ item = self.get(name, default) if item is default: return default if locale and "display_name" in item: return item.display_name.get_localized_string(*locale.split("_")) else: return name def getvalue(self, name, default=None, locale="en_US"): """ Convenience function to get (localized) values """ item = self.get(name, default) if item is default: return default if locale and "display_value" in item: return item.display_value.get_localized_string(*locale.split("_")) else: return item.value def setitem(self, name, value, display_name=None, display_value=None): """ Convenience function to set items display_name and display_value (if given) should be dict types with country -> language -> string mappings, e.g.: {"en": {"US": u"localized string"}, "de": {"DE": u"localized string", "CH": u"localized string"}} """ self[name] = value item = self.get(name) if display_name: item.display_name = MultiLocalizedUnicodeType() item.display_name.update(display_name) if display_value: item.display_value = MultiLocalizedUnicodeType() item.display_value.update(display_value) def to_json(self, encoding="UTF-8", errors="replace", locale="en_US"): """ Return a JSON representation Display names/values are used if present. """ json = [] for name in self: value = self.getvalue(name, None, locale) name = self.getname(name, None, locale) #try: #value = str(int(value)) #except ValueError: #try: #value = str(float(value)) #except ValueError: value = '"%s"' % repr(unicode(value))[2:-1].replace('"', '\\"') json.append('"%s": %s' % tuple([re.sub(r"\\x([0-9a-f]{2})", "\\u00\\1", item) for item in [repr(unicode(name))[2:-1], value]])) return "{%s}" % ",\n".join(json) class MakeAndModelType(ICCProfileTag, ADict): def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) self.update({"manufacturer": tagData[10:12], "model": tagData[14:16]}) class MeasurementType(ICCProfileTag, ADict): def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) self.update({ "observer": Observer(tagData[8:12]), "backing": XYZNumber(tagData[12:24]), "geometry": Geometry(tagData[24:28]), "flare": u16Fixed16Number(tagData[28:32]), "illuminantType": Illuminant(tagData[32:36]) }) class MultiLocalizedUnicodeType(ICCProfileTag, AODict): # ICC v4 def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) if not tagData: return recordsCount = uInt32Number(tagData[8:12]) recordSize = uInt32Number(tagData[12:16]) # 12 if recordSize != 12: safe_print("Warning (non-critical): '%s' invalid record length " "(expected 12, got %s)" % (tagData[:4], recordSize)) if recordSize < 12: recordSize = 12 records = tagData[16:16 + recordSize * recordsCount] for count in xrange(recordsCount): record = records[:recordSize] if len(record) < 12: continue recordLanguageCode = record[:2] recordCountryCode = record[2:4] recordLength = uInt32Number(record[4:8]) recordOffset = uInt32Number(record[8:12]) self.add_localized_string(recordLanguageCode, recordCountryCode, unicode(tagData[recordOffset:recordOffset + recordLength], "utf-16-be", "replace")) records = records[recordSize:] def __str__(self): return unicode(self).encode(sys.getdefaultencoding()) def __unicode__(self): """ Return tag as string. """ # TODO: Needs some work re locales # (currently if en-UK or en-US is not found, simply the first entry # is returned) if "en" in self: for countryCode in ("UK", "US"): if countryCode in self["en"]: return self["en"][countryCode] elif len(self): return self.values()[0].values()[0] else: return u"" def add_localized_string(self, languagecode, countrycode, localized_string): """ Convenience function for adding localized strings """ if languagecode not in self: self[languagecode] = AODict() self[languagecode][countrycode] = localized_string.strip("\0") def get_localized_string(self, languagecode="en", countrycode="US"): """ Convenience function for retrieving localized strings Falls back to first locale available if the requested one isn't """ try: return self[languagecode][countrycode] except KeyError: return unicode(self) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["mluc", "\0" * 4] recordsCount = 0 for languageCode in self: for countryCode in self[languageCode]: recordsCount += 1 tagData.append(uInt32Number_tohex(recordsCount)) recordSize = 12 tagData.append(uInt32Number_tohex(recordSize)) storage_offset = 16 + recordSize * recordsCount storage = [] offsets = [] for languageCode in self: for countryCode in self[languageCode]: tagData.append(languageCode + countryCode) data = self[languageCode][countryCode].encode("UTF-16-BE") if data in storage: offset, recordLength = offsets[storage.index(data)] else: recordLength = len(data) offset = len("".join(storage)) offsets.append((offset, recordLength)) storage.append(data) tagData.append(uInt32Number_tohex(recordLength)) tagData.append(uInt32Number_tohex(storage_offset + offset)) tagData.append("".join(storage)) return "".join(tagData) def fset(self, tagData): pass return locals() class s15Fixed16ArrayType(ICCProfileTag, list): def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) if tagData: data = tagData[8:] while data: self.append(s15Fixed16Number(data[0:4])) data = data[4:] @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["sf32", "\0" * 4] for value in self: tagData.append(s15Fixed16Number_tohex(value)) return "".join(tagData) def fset(self, tagData): pass return locals() def SignatureType(tagData, tagSignature): tag = Text(tagData[8:12].rstrip("\0")) tag.tagData = tagData tag.tagSignature = tagSignature return tag class TextDescriptionType(ICCProfileTag, ADict): # ICC v2 def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) self.ASCII = "" if not tagData: return ASCIIDescriptionLength = uInt32Number(tagData[8:12]) if ASCIIDescriptionLength: ASCIIDescription = tagData[12:12 + ASCIIDescriptionLength].strip("\0\n\r ") if ASCIIDescription: self.ASCII = ASCIIDescription unicodeOffset = 12 + ASCIIDescriptionLength self.unicodeLanguageCode = uInt32Number( tagData[unicodeOffset:unicodeOffset + 4]) unicodeDescriptionLength = uInt32Number(tagData[unicodeOffset + 4:unicodeOffset + 8]) if unicodeDescriptionLength: if unicodeOffset + 8 + unicodeDescriptionLength * 2 > len(tagData): # Damn you MS. The Unicode character count should be the number of # double-byte characters (including trailing unicode NUL), not the # number of bytes as in the profiles created by Vista and later safe_print("Warning (non-critical): '%s' Unicode part end points " "past the tag data, assuming number of bytes instead " "of number of characters for length" % tagData[:4]) unicodeDescriptionLength /= 2 if tagData[unicodeOffset + 8 + unicodeDescriptionLength:unicodeOffset + 8 + unicodeDescriptionLength + 2] == "\0\0": safe_print("Warning (non-critical): '%s' Unicode part " "seems to be a single-byte string (double-byte " "string expected)" % tagData[:4]) charBytes = 1 # fix for fubar'd desc else: charBytes = 2 unicodeDescription = tagData[unicodeOffset + 8:unicodeOffset + 8 + (unicodeDescriptionLength) * charBytes] try: if charBytes == 1: unicodeDescription = unicode(unicodeDescription, errors="replace") else: if unicodeDescription[:2] == "\xfe\xff": # UTF-16 Big Endian if debug: safe_print("UTF-16 Big endian") unicodeDescription = unicodeDescription[2:] if len(unicodeDescription.split(" ")) == \ unicodeDescriptionLength - 1: safe_print("Warning (non-critical): '%s' " "Unicode part starts with UTF-16 big " "endian BOM, but actual contents seem " "to be UTF-16 little endian" % tagData[:4]) # fix fubar'd desc unicodeDescription = unicode( "\0".join(unicodeDescription.split(" ")), "utf-16-le", errors="replace") else: unicodeDescription = unicode(unicodeDescription, "utf-16-be", errors="replace") elif unicodeDescription[:2] == "\xff\xfe": # UTF-16 Little Endian if debug: safe_print("UTF-16 Little endian") unicodeDescription = unicodeDescription[2:] if unicodeDescription[0] == "\0": safe_print("Warning (non-critical): '%s' " "Unicode part starts with UTF-16 " "little endian BOM, but actual " "contents seem to be UTF-16 big " "endian" % tagData[:4]) # fix fubar'd desc unicodeDescription = unicode(unicodeDescription, "utf-16-be", errors="replace") else: unicodeDescription = unicode(unicodeDescription, "utf-16-le", errors="replace") else: if debug: safe_print("ASSUMED UTF-16 Big Endian") unicodeDescription = unicode(unicodeDescription, "utf-16-be", errors="replace") unicodeDescription = unicodeDescription.strip("\0\n\r ") if unicodeDescription: if unicodeDescription.find("\0") < 0: self.Unicode = unicodeDescription else: safe_print("Error (non-critical): could not decode " "'%s' Unicode part - null byte(s) " "encountered" % tagData[:4]) except UnicodeDecodeError: safe_print("UnicodeDecodeError (non-critical): could not " "decode '%s' Unicode part" % tagData[:4]) else: charBytes = 1 macOffset = unicodeOffset + 8 + unicodeDescriptionLength * charBytes self.macScriptCode = 0 if len(tagData) > macOffset + 2: self.macScriptCode = uInt16Number(tagData[macOffset:macOffset + 2]) macDescriptionLength = ord(tagData[macOffset + 2]) if macDescriptionLength: try: macDescription = unicode(tagData[macOffset + 3:macOffset + 3 + macDescriptionLength], "mac-" + encodings["mac"][self.macScriptCode], errors="replace").strip("\0\n\r ") if macDescription: self.Macintosh = macDescription except KeyError: safe_print("KeyError (non-critical): could not " "decode '%s' Macintosh part (unsupported " "encoding %s)" % (tagData[:4], self.macScriptCode)) except LookupError: safe_print("LookupError (non-critical): could not " "decode '%s' Macintosh part (unsupported " "encoding '%s')" % (tagData[:4], encodings["mac"][self.macScriptCode])) except UnicodeDecodeError: safe_print("UnicodeDecodeError (non-critical): could not " "decode '%s' Macintosh part" % tagData[:4]) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["desc", "\0" * 4, uInt32Number_tohex(len(self.ASCII) + 1), # count of ASCII chars + 1 safe_unicode(self.ASCII).encode("ASCII", "replace") + "\0", # ASCII desc, \0 terminated uInt32Number_tohex(self.get("unicodeLanguageCode", 0))] if "Unicode" in self: tagData.extend([uInt32Number_tohex(len(self.Unicode) + 2), # count of Unicode chars + 2 (UTF-16-BE BOM + trailing UTF-16 NUL, 1 char = 2 byte) "\xfe\xff" + self.Unicode.encode("utf-16-be", "replace") + "\0\0"]) # Unicode desc, \0\0 terminated else: tagData.append(uInt32Number_tohex(0)) # Unicode desc length = 0 tagData.append(uInt16Number_tohex(self.get("macScriptCode", 0))) if "Macintosh" in self: macDescription = self.Macintosh[:66] tagData.extend([uInt8Number_tohex(len(macDescription) + 1), # count of Macintosh chars + 1 macDescription.encode("mac-" + encodings["mac"][self.get("macScriptCode", 0)], "replace") + ("\0" * (67 - len(macDescription)))]) else: tagData.extend(["\0", # Mac desc length = 0 "\0" * 67]) return "".join(tagData) def fset(self, tagData): pass return locals() def __str__(self): return unicode(self).encode(sys.getdefaultencoding()) def __unicode__(self): if not "Unicode" in self and len(safe_unicode(self.ASCII)) < 67: # Do not use Macintosh description if ASCII length >= 67 localizedTypes = ("Macintosh", "ASCII") else: localizedTypes = ("Unicode", "ASCII") for localizedType in localizedTypes: if localizedType in self: value = self[localizedType] if not isinstance(value, unicode): # Even ASCII description may contain non-ASCII chars, so # assume system encoding and convert to unicode, replacing # unknown chars value = safe_unicode(value) return value def TextType(tagData, tagSignature): tag = Text(tagData[8:].rstrip("\0")) tag.tagData = tagData tag.tagSignature = tagSignature return tag class VideoCardGammaType(ICCProfileTag, ADict): # Private tag # http://developer.apple.com/documentation/GraphicsImaging/Reference/ColorSync_Manager/Reference/reference.html#//apple_ref/doc/uid/TP30000259-CH3g-C001473 def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) def is_linear(self, r=True, g=True, b=True): r_points, g_points, b_points, linear_points = self.get_values() if ((r and g and b and r_points == g_points == b_points) or (r and g and r_points == g_points) or not (g or b)): points = r_points elif ((r and b and r_points == b_points) or (g and b and g_points == b_points) or not (r or g)): points = b_points elif g: points = g_points return points == linear_points def get_unique_values(self, r=True, g=True, b=True): r_points, g_points, b_points, linear_points = self.get_values() r_unique = set(round(y) for x, y in r_points) g_unique = set(round(y) for x, y in g_points) b_unique = set(round(y) for x, y in b_points) return r_unique, g_unique, b_unique def get_values(self, r=True, g=True, b=True): r_points = [] g_points = [] b_points = [] linear_points = [] vcgt = self if "data" in vcgt: # table data = list(vcgt['data']) while len(data) < 3: data.append(data[0]) irange = range(0, vcgt['entryCount']) vmax = math.pow(256, vcgt['entrySize']) - 1 for i in irange: j = i * (255.0 / (vcgt['entryCount'] - 1)) linear_points.append([j, int(round(i / float(vcgt['entryCount'] - 1) * 65535))]) if r: n = int(round(float(data[0][i]) / vmax * 65535)) r_points.append([j, n]) if g: n = int(round(float(data[1][i]) / vmax * 65535)) g_points.append([j, n]) if b: n = int(round(float(data[2][i]) / vmax * 65535)) b_points.append([j, n]) else: # formula irange = range(0, 256) step = 100.0 / 255.0 for i in irange: linear_points.append([i, i / 255.0 * 65535]) if r: vmin = vcgt["redMin"] * 65535 v = math.pow(step * i / 100.0, vcgt["redGamma"]) vmax = vcgt["redMax"] * 65535 r_points.append([i, int(round(vmin + v * (vmax - vmin)))]) if g: vmin = vcgt["greenMin"] * 65535 v = math.pow(step * i / 100.0, vcgt["greenGamma"]) vmax = vcgt["greenMax"] * 65535 g_points.append([i, int(round(vmin + v * (vmax - vmin)))]) if b: vmin = vcgt["blueMin"] * 65535 v = math.pow(step * i / 100.0, vcgt["blueGamma"]) vmax = vcgt["blueMax"] * 65535 b_points.append([i, int(round(vmin + v * (vmax - vmin)))]) return r_points, g_points, b_points, linear_points def printNormalizedValues(self, amount=None, digits=12): """ Normalizes and prints all values in the vcgt (range of 0.0...1.0). For a 256-entry table with linear values from 0 to 65535: # REF C1 C2 C3 001 0.000000000000 0.000000000000 0.000000000000 0.000000000000 002 0.003921568627 0.003921568627 0.003921568627 0.003921568627 003 0.007843137255 0.007843137255 0.007843137255 0.007843137255 ... You can also specify the amount of values to print (where a value lesser than the entry count will leave out intermediate values) and the number of digits. """ if amount is None: if hasattr(self, 'entryCount'): amount = self.entryCount else: amount = 256 # common value values = self.getNormalizedValues(amount) entryCount = len(values) channels = len(values[0]) header = ['REF'] for k in xrange(channels): header.append('C' + str(k + 1)) header = [title.ljust(digits + 2) for title in header] safe_print("#".ljust(len(str(amount)) + 1) + " ".join(header)) for i, value in enumerate(values): formatted_values = [str(round(channel, digits)).ljust(digits + 2, '0') for channel in value] safe_print(str(i + 1).rjust(len(str(amount)), '0'), str(round(i / float(entryCount - 1), digits)).ljust(digits + 2, '0'), " ".join(formatted_values)) class VideoCardGammaFormulaType(VideoCardGammaType): def __init__(self, tagData, tagSignature): VideoCardGammaType.__init__(self, tagData, tagSignature) data = tagData[12:] self.update({ "redGamma": u16Fixed16Number(data[0:4]), "redMin": u16Fixed16Number(data[4:8]), "redMax": u16Fixed16Number(data[8:12]), "greenGamma": u16Fixed16Number(data[12:16]), "greenMin": u16Fixed16Number(data[16:20]), "greenMax": u16Fixed16Number(data[20:24]), "blueGamma": u16Fixed16Number(data[24:28]), "blueMin": u16Fixed16Number(data[28:32]), "blueMax": u16Fixed16Number(data[32:36]) }) def getNormalizedValues(self, amount=None): if amount is None: amount = 256 # common value step = 1.0 / float(amount - 1) rgb = AODict([("red", []), ("green", []), ("blue", [])]) for i in xrange(0, amount): for key in rgb: rgb[key].append(float(self[key + "Min"]) + math.pow(step * i / 1.0, float(self[key + "Gamma"])) * float(self[key + "Max"] - self[key + "Min"])) return zip(*rgb.values()) def getTableType(self, entryCount=256, entrySize=2, quantizer=round): """ Return gamma as table type. """ maxValue = math.pow(256, entrySize) - 1 tagData = [self.tagData[:8], uInt32Number_tohex(0), # type 0 = table uInt16Number_tohex(3), # channels uInt16Number_tohex(entryCount), uInt16Number_tohex(entrySize)] int2hex = { 1: uInt8Number_tohex, 2: uInt16Number_tohex, 4: uInt32Number_tohex, 8: uInt64Number_tohex } for key in ("red", "green", "blue"): for i in xrange(0, entryCount): vmin = float(self[key + "Min"]) vmax = float(self[key + "Max"]) gamma = float(self[key + "Gamma"]) v = (vmin + math.pow(1.0 / (entryCount - 1) * i, gamma) * float(vmax - vmin)) tagData.append(int2hex[entrySize](quantizer(v * maxValue))) return VideoCardGammaTableType("".join(tagData), self.tagSignature) class VideoCardGammaTableType(VideoCardGammaType): def __init__(self, tagData, tagSignature): VideoCardGammaType.__init__(self, tagData, tagSignature) if not tagData: self.update({"channels": 0, "entryCount": 0, "entrySize": 0, "data": []}) return data = tagData[12:] channels = uInt16Number(data[0:2]) entryCount = uInt16Number(data[2:4]) entrySize = uInt16Number(data[4:6]) self.update({ "channels": channels, "entryCount": entryCount, "entrySize": entrySize, "data": [] }) hex2int = { 1: uInt8Number, 2: uInt16Number, 4: uInt32Number, 8: uInt64Number } if entrySize not in hex2int: raise ValueError("Invalid VideoCardGammaTableType entry size %i" % entrySize) i = 0 while i < channels: self.data.append([]) j = 0 while j < entryCount: index = 6 + i * entryCount * entrySize + j * entrySize self.data[i].append(hex2int[entrySize](data[index:index + entrySize])) j = j + 1 i = i + 1 def getNormalizedValues(self, amount=None): if amount is None: amount = self.entryCount maxValue = math.pow(256, self.entrySize) - 1 values = zip(*[[entry / maxValue for entry in channel] for channel in self.data]) if amount <= self.entryCount: step = self.entryCount / float(amount - 1) all = values values = [] for i, value in enumerate(all): if i == 0 or (i + 1) % step < 1 or i + 1 == self.entryCount: values.append(value) return values def getFormulaType(self): """ Return formula representing gamma value at 50% input. """ maxValue = math.pow(256, self.entrySize) - 1 tagData = [self.tagData[:8], uInt32Number_tohex(1)] # type 1 = formula data = list(self.data) while len(data) < 3: data.append(data[0]) for channel in data: l = (len(channel) - 1) / 2.0 floor = float(channel[int(math.floor(l))]) ceil = float(channel[int(math.ceil(l))]) vmin = channel[0] / maxValue vmax = channel[-1] / maxValue v = (vmin + ((floor + ceil) / 2.0) * (vmax - vmin)) / maxValue gamma = (math.log(v) / math.log(.5)) print vmin, gamma, vmax tagData.append(u16Fixed16Number_tohex(gamma)) tagData.append(u16Fixed16Number_tohex(vmin)) tagData.append(u16Fixed16Number_tohex(vmax)) return VideoCardGammaFormulaType("".join(tagData), self.tagSignature) def quantize(self, bits=16, quantizer=round): """ Quantize to n bits of precision. Note that when the quantize bits are not 8, 16, 32 or 64, double quantization will occur: First from the table precision bits according to entrySize to the chosen quantization bits, and then back to the table precision bits. """ oldmax = math.pow(256, self.entrySize) - 1 if bits in (8, 16, 32, 64): self.entrySize = bits / 8 bitv = 2.0 ** bits newmax = math.pow(256, self.entrySize) - 1 for i, channel in enumerate(self.data): for j, value in enumerate(channel): channel[j] = int(quantizer(value / oldmax * bitv) / bitv * newmax) def resize(self, length=128): data = [[], [], []] for i, channel in enumerate(self.data): for j in xrange(0, length): j *= (len(channel) - 1) / float(length - 1) if int(j) != j: floor = channel[int(math.floor(j))] ceil = channel[min(int(math.ceil(j)), len(channel) - 1)] interpolated = xrange(floor, ceil + 1) fraction = j - int(j) index = int(round(fraction * (ceil - floor))) v = interpolated[index] else: v = channel[int(j)] data[i].append(v) self.data = data self.entryCount = len(data[0]) def resized(self, length=128): resized = self.__class__(self.tagData, self.tagSignature) resized.resize(length) return resized def smooth_cr(self, length=64): """ Smooth video LUT curves (Catmull-Rom). """ resized = self.resized(length) for i in xrange(0, len(self.data)): step = float(length - 1) / (len(self.data[i]) - 1) interpolation = CRInterpolation(resized.data[i]) for j in xrange(0, len(self.data[i])): self.data[i][j] = interpolation(j * step) def smooth_avg(self, passes=1, window=None): """ Smooth video LUT curves (moving average). passses Number of passes window Tuple or list containing weighting factors. Its length determines the size of the window to use. Defaults to (1.0, 1.0, 1.0) """ for i, channel in enumerate(self.data): self.data[i] = colormath.smooth_avg(channel, passes, window) self.entryCount = len(self.data[0]) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["vcgt", "\0" * 4, uInt32Number_tohex(0), # type 0 = table uInt16Number_tohex(len(self.data)), # channels uInt16Number_tohex(self.entryCount), uInt16Number_tohex(self.entrySize)] int2hex = { 1: uInt8Number_tohex, 2: uInt16Number_tohex, 4: uInt32Number_tohex, 8: uInt64Number_tohex } for channel in self.data: for i in xrange(0, self.entryCount): tagData.append(int2hex[self.entrySize](channel[i])) return "".join(tagData) def fset(self, tagData): pass return locals() class ViewingConditionsType(ICCProfileTag, ADict): def __init__(self, tagData, tagSignature): ICCProfileTag.__init__(self, tagData, tagSignature) self.update({ "illuminant": XYZNumber(tagData[8:20]), "surround": XYZNumber(tagData[20:32]), "illuminantType": Illuminant(tagData[32:36]) }) class TagData(object): def __init__(self, tagData, offset, size): self.tagData = tagData self.offset = offset self.size = size def __contains__(self, item): return item in str(self) def __str__(self): return self.tagData[self.offset:self.offset + self.size] class WcsProfilesTagType(ICCProfileTag, ADict): def __init__(self, tagData, tagSignature, profile): ICCProfileTag.__init__(self, tagData, tagSignature) self.profile = profile for i, modelname in enumerate(["ColorDeviceModel", "ColorAppearanceModel", "GamutMapModel"]): j = i * 8 offset = uInt32Number(tagData[8 + j:12 + j]) size = uInt32Number(tagData[12 + j:16 + j]) if offset and size: from StringIO import StringIO from xml.etree import ElementTree it = ElementTree.iterparse(StringIO(tagData[offset:offset + size])) for event, elem in it: elem.tag = elem.tag.split('}', 1)[-1] # Strip all namespaces self[modelname] = it.root def get_vcgt(self, quantize=False, quantizer=round): """ Return calibration information (if present) as VideoCardGammaType If quantize is set, a table quantized to bits is returned. Note that when the quantize bits are not 8, 16, 32 or 64, multiple quantizations will occur: For quantization bits below 32, first to 32 bits, then to the chosen quantization bits, then back to 32 bits (which will be the final table precision bits). """ if quantize and not isinstance(quantize, int): raise ValueError("Invalid quantization bits: %r" % quantize) if "ColorDeviceModel" in self: # Parse calibration information to VCGT cal = self.ColorDeviceModel.find("Calibration") if cal is None: return agammaconf = cal.find("AdapterGammaConfiguration") if agammaconf is None: return pcurves = agammaconf.find("ParameterizedCurves") if pcurves is None: return vcgtData = "vcgt" vcgtData += "\0" * 4 vcgtData += uInt32Number_tohex(1) # Type 1 = formula for color in ("Red", "Green", "Blue"): trc = pcurves.find(color + "TRC") if trc is None: trc = {} vcgtData += u16Fixed16Number_tohex(float(trc.get("Gamma", 1))) vcgtData += u16Fixed16Number_tohex(float(trc.get("Offset1", 0))) vcgtData += u16Fixed16Number_tohex(float(trc.get("Gain", 1))) vcgt = VideoCardGammaFormulaType(vcgtData, "vcgt") if quantize: if quantize in (8, 16, 32, 64): entrySize = quantize / 8 elif quantize < 32: entrySize = 4 else: entrySize = 8 vcgt = vcgt.getTableType(entrySize=entrySize, quantizer=quantizer) if quantize not in (8, 16, 32, 64): vcgt.quantize(quantize, quantizer) return vcgt class XYZNumber(AODict): """ Byte Offset Content Encoded as... 0..3 CIE X s15Fixed16Number 4..7 CIE Y s15Fixed16Number 8..11 CIE Z s15Fixed16Number """ def __init__(self, binaryString="\0" * 12): AODict.__init__(self) self.X, self.Y, self.Z = [s15Fixed16Number(chunk) for chunk in (binaryString[:4], binaryString[4:8], binaryString[8:12])] def __repr__(self): XYZ = [] for key, value in self.iteritems(): XYZ.append("(%s, %s)" % (repr(key), str(value))) return "%s.%s([%s])" % (self.__class__.__module__, self.__class__.__name__, ", ".join(XYZ)) def adapt(self, whitepoint_source=None, whitepoint_destination=None, cat="Bradford"): XYZ = self.__class__() XYZ.X, XYZ.Y, XYZ.Z = colormath.adapt(self.X, self.Y, self.Z, whitepoint_source, whitepoint_destination, cat) return XYZ def round(self, digits=4): XYZ = self.__class__() for key in self: XYZ[key] = round(self[key], digits) return XYZ def tohex(self): data = [s15Fixed16Number_tohex(n) for n in self.values()] return "".join(data) @property def hex(self): return self.tohex() @property def Lab(self): return colormath.XYZ2Lab(*[v * 100 for v in self.values()]) @property def xyY(self): return NumberTuple(colormath.XYZ2xyY(self.X, self.Y, self.Z)) class XYZType(ICCProfileTag, XYZNumber): def __init__(self, tagData="\0" * 20, tagSignature=None, profile=None): ICCProfileTag.__init__(self, tagData, tagSignature) XYZNumber.__init__(self, tagData[8:20]) self.profile = profile __repr__ = XYZNumber.__repr__ def __setattr__(self, name, value): if name in ("_keys", "profile", "tagData", "tagSignature"): object.__setattr__(self, name, value) else: self[name] = value def adapt(self, whitepoint_source=None, whitepoint_destination=None, cat=None): if self.profile and isinstance(self.profile.tags.get("arts"), chromaticAdaptionTag): cat = self.profile.tags.arts else: cat = "Bradford" XYZ = self.__class__(profile=self.profile) XYZ.X, XYZ.Y, XYZ.Z = colormath.adapt(self.X, self.Y, self.Z, whitepoint_source, whitepoint_destination, cat) return XYZ @property def ir(self): """ Get illuminant-relative values """ pcs_illuminant = self.profile.illuminant.values() if "chad" in self.profile.tags and self.profile.creator != "appl": # Apple profiles have a bug where they contain a 'chad' tag, # but the media white is not under PCS illuminant if self is self.profile.tags.wtpt: XYZ = self.__class__(profile=self.profile) XYZ.X, XYZ.Y, XYZ.Z = self.values() else: # Go from XYZ mediawhite-relative under PCS illuminant to XYZ # under PCS illuminant if isinstance(self.profile.tags.get("arts"), chromaticAdaptionTag): cat = self.profile.tags.arts else: cat = "XYZ scaling" XYZ = self.adapt(pcs_illuminant, self.profile.tags.wtpt.values(), cat=cat) # Go from XYZ under PCS illuminant to XYZ illuminant-relative XYZ.X, XYZ.Y, XYZ.Z = self.profile.tags.chad.inverted() * XYZ.values() return XYZ else: if self in (self.profile.tags.wtpt, self.profile.tags.get("bkpt")): # For profiles without 'chad' tag, the white/black point should # already be illuminant-relative return self elif "chad" in self.profile.tags: XYZ = self.__class__(profile=self.profile) # Go from XYZ under PCS illuminant to XYZ illuminant-relative XYZ.X, XYZ.Y, XYZ.Z = self.profile.tags.chad.inverted() * self.values() return XYZ else: # Go from XYZ under PCS illuminant to XYZ illuminant-relative return self.adapt(pcs_illuminant, self.profile.tags.wtpt.values()) @property def pcs(self): """ Get PCS-relative values """ if (self in (self.profile.tags.wtpt, self.profile.tags.get("bkpt")) and (not "chad" in self.profile.tags or self.profile.creator == "appl")): # Apple profiles have a bug where they contain a 'chad' tag, # but the media white is not under PCS illuminant if "chad" in self.profile.tags: XYZ = self.__class__(profile=self.profile) XYZ.X, XYZ.Y, XYZ.Z = self.profile.tags.chad * self.values() return XYZ pcs_illuminant = self.profile.illuminant.values() return self.adapt(self.profile.tags.wtpt.values(), pcs_illuminant) else: # Values should already be under PCS illuminant return self @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["XYZ ", "\0" * 4] tagData.append(self.tohex()) return "".join(tagData) def fset(self, tagData): pass return locals() @property def xyY(self): if self is self.profile.tags.get("bkpt"): ref = self.profile.tags.bkpt else: ref = self.profile.tags.wtpt return NumberTuple(colormath.XYZ2xyY(self.X, self.Y, self.Z, (ref.X, 1.0, ref.Z))) class chromaticAdaptionTag(colormath.Matrix3x3, s15Fixed16ArrayType): def __init__(self, tagData=None, tagSignature=None): ICCProfileTag.__init__(self, tagData, tagSignature) if tagData: data = tagData[8:] if data: matrix = [] while data: if len(matrix) == 0 or len(matrix[-1]) == 3: matrix.append([]) matrix[-1].append(s15Fixed16Number(data[0:4])) data = data[4:] self.update(matrix) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["sf32", "\0" * 4] for row in self: for column in row: tagData.append(s15Fixed16Number_tohex(column)) return "".join(tagData) def fset(self, tagData): pass return locals() def get_cat(self): """ Compare to known CAT matrices and return matching name (if any) """ for cat_name, cat_matrix in colormath.cat_matrices.iteritems(): if colormath.is_similar_matrix(self, cat_matrix, 4): return cat_name class NamedColor2Value(object): def __init__(self, valueData="\0" * 38, deviceCoordCount=0, pcs="XYZ", device="RGB"): self._pcsname = pcs self._devicename = device end = valueData[0:32].find("\0") if end < 0: end = 32 self.rootName = valueData[0:end] self.pcsvalues = [ uInt16Number(valueData[32:34]), uInt16Number(valueData[34:36]), uInt16Number(valueData[36:38])] self.pcs = AODict() for i, pcsvalue in enumerate(self.pcsvalues): if pcs == "Lab": if i == 0: # L* range 0..100 + (25500 / 65280.0) self.pcs[pcs[i]] = pcsvalue / 65536.0 * 256 / 255.0 * 100 else: # a, b range -128..127 + (255/256.0) self.pcs[pcs[i]] = -128 + (pcsvalue / 65536.0 * 256) elif pcs == "XYZ": # X, Y, Z range 0..100 + (32767 / 32768.0) self.pcs[pcs[i]] = pcsvalue / 32768.0 * 100 deviceCoords = [] if deviceCoordCount > 0: for i in xrange(38, 38+deviceCoordCount*2, 2): deviceCoords.append( uInt16Number( valueData[i:i+2])) self.devicevalues = deviceCoords if device == "Lab": # L* range 0..100 + (25500 / 65280.0) # a, b range range -128..127 + (255 / 256.0) self.device = tuple(v / 65536.0 * 256 / 255.0 * 100 if i == 0 else -128 + (v / 65536.0 * 256) for i, v in enumerate(deviceCoords)) elif device == "XYZ": # X, Y, Z range 0..100 + (32767 / 32768.0) self.device = tuple(v / 32768.0 * 100 for v in deviceCoords) else: # Device range 0..100 self.device = tuple(v / 65535.0 * 100 for v in deviceCoords) @property def name(self): return unicode(Text(self.rootName.strip('\0')), 'latin-1') def __repr__(self): pcs = [] dev = [] for key, value in self.pcs.iteritems(): pcs.append("%s=%s" % (str(key), str(value))) for value in self.device: dev.append("%s" % value) return "%s(%s, {%s}, [%s])" % ( self.__class__.__name__, self.name, ", ".join(pcs), ", ".join(dev)) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): valueData = [] valueData.append(self.rootName.ljust(32, "\0")) valueData.extend( [uInt16Number_tohex(pcsval) for pcsval in self.pcsvalues]) valueData.extend( [uInt16Number_tohex(deviceval) for deviceval in self.devicevalues]) return "".join(valueData) def fset(self, tagData): pass return locals() class NamedColor2ValueTuple(tuple): __slots__ = () REPR_OUTPUT_SIZE = 10 def __repr__(self): data = list(self[:self.REPR_OUTPUT_SIZE + 1]) if len(data) > self.REPR_OUTPUT_SIZE: data[-1] = "...(remaining elements truncated)..." return repr(data) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): return "".join([val.tagData for val in self]) def fset(self, tagData): pass return locals() class NamedColor2Type(ICCProfileTag, AODict): REPR_OUTPUT_SIZE = 10 def __init__(self, tagData="\0" * 84, tagSignature=None, pcs=None, device=None): ICCProfileTag.__init__(self, tagData, tagSignature) AODict.__init__(self) colorCount = uInt32Number(tagData[12:16]) deviceCoordCount = uInt32Number(tagData[16:20]) stride = 38 + 2*deviceCoordCount self.vendorData = tagData[8:12] self.colorCount = colorCount self.deviceCoordCount = deviceCoordCount self._prefix = Text(tagData[20:52]) self._suffix = Text(tagData[52:84]) self._pcsname = pcs self._devicename = device keys = [] values = [] if colorCount > 0: start = 84 end = start + (stride*colorCount) for i in xrange(start, end, stride): nc2 = NamedColor2Value( tagData[i:i+stride], deviceCoordCount, pcs=pcs, device=device) keys.append(nc2.name) values.append(nc2) self.update(OrderedDict(zip(keys, values))) def __setattr__(self, name, value): object.__setattr__(self, name, value) @property def prefix(self): return unicode(self._prefix.strip('\0'), 'latin-1') @property def suffix(self): return unicode(self._suffix.strip('\0'), 'latin-1') @property def colorValues(self): return NamedColor2ValueTuple(self.values()) def add_color(self, rootName, *deviceCoordinates, **pcsCoordinates): if self._pcsname == "Lab": keys = ["L", "a", "b"] elif self._pcsname == "XYZ": keys = ["X", "Y", "Z"] else: keys = ["X", "Y", "Z"] if not set(pcsCoordinates.keys()).issuperset(set(keys)): raise ICCProfileInvalidError("Can't add namedColor2 without all 3 PCS coordinates: '%s'" % set(keys) - set(pcsCoordinates.keys())) if len(deviceCoordinates) != self.deviceCoordCount: raise ICCProfileInvalidError("Can't add namedColor2 without all %s device coordinates (called with %s)" % ( self.deviceCoordCount, len(deviceCoordinates))) nc2value = NamedColor2Value() nc2value._pcsname = self._pcsname nc2value._devicename = self._devicename nc2value.rootName = rootName if rootName in self.keys(): raise ICCProfileInvalidError("Can't add namedColor2 with existant name: '%s'" % rootName) nc2value.devicevalues = [] nc2value.device = tuple(deviceCoordinates) nc2value.pcs = AODict(copy(pcsCoordinates)) for idx, key in enumerate(keys): val = nc2value.pcs[key] if key == "L": nc2value.pcsvalues[idx] = val * 65536 / (256 / 255.0) / 100.0 elif key in ("a", "b"): nc2value.pcsvalues[idx] = (val + 128) * 65536 / 256.0 elif key in ("X", "Y", "Z"): nc2value.pcsvalues[idx] = val * 32768 / 100.0 for idx, val in enumerate(nc2value.device): if self._devicename == "Lab": if idx == 0: # L* range 0..100 + (25500 / 65280.0) nc2value.devicevalues[idx] = val * 65536 / (256 / 255.0) / 100.0 else: # a, b range -128..127 + (255/256.0) nc2value.devicevalues[idx] = (val + 128) * 65536 / 256.0 elif self._devicename == "XYZ": # X, Y. Z range 0..100 + (32767 / 32768.0) nc2value.devicevalues[idx] = val * 32768 / 100.0 else: # Device range 0..100 nc2value.devicevalues[idx] = val * 65535 / 100.0 self[nc2value.name] = nc2value def __repr__(self): data = self.items()[:self.REPR_OUTPUT_SIZE + 1] if len(data) > self.REPR_OUTPUT_SIZE: data[-1] = ('...', "(remaining elements truncated)") return repr(OrderedDict(data)) @Property def tagData(): doc = """ Return raw tag data. """ def fget(self): tagData = ["ncl2", "\0" * 4, self.vendorData, uInt32Number_tohex(len(self.items())), uInt32Number_tohex(self.deviceCoordCount), self._prefix.ljust(32), self._suffix.ljust(32)] tagData.append(self.colorValues.tagData) return "".join(tagData) def fset(self, tagData): pass return locals() tagSignature2Tag = { "arts": chromaticAdaptionTag, "chad": chromaticAdaptionTag } typeSignature2Type = { "chrm": ChromaticityType, "clrt": ColorantTableType, "curv": CurveType, "desc": TextDescriptionType, # ICC v2 "dict": DictType, # ICC v2 + v4 "dtim": DateTimeType, "meas": MeasurementType, "mluc": MultiLocalizedUnicodeType, # ICC v4 "mft2": LUT16Type, "mmod": MakeAndModelType, # Apple private tag "ncl2": NamedColor2Type, "sf32": s15Fixed16ArrayType, "sig ": SignatureType, "text": TextType, "vcgt": videoCardGamma, "view": ViewingConditionsType, "MS10": WcsProfilesTagType, "XYZ ": XYZType } class ICCProfileInvalidError(IOError): pass class ICCProfile: """ Returns a new ICCProfile object. Optionally initialized with a string containing binary profile data or a filename, or a file-like object. Also if the 'load' keyword argument is False (default True), only the header will be read initially and loading of the tags will be deferred to when they are accessed the first time. """ def __init__(self, profile=None, load=True): self.ID = "\0" * 16 self._data = "" self._file = None self._tags = LazyLoadTagAODict(self) self.fileName = None self.is_loaded = False self.size = 0 if profile is not None: data = None if type(profile) in (str, unicode): if profile.find("\0") < 0: # filename if (not os.path.isfile(profile) and not os.path.sep in profile and (not isinstance(os.path.altsep, basestring) or not os.path.altsep in profile)): for path in iccprofiles_home + filter(lambda x: x not in iccprofiles_home, iccprofiles): if os.path.isdir(path): for path, dirs, files in os.walk(path): path = os.path.join(path, profile) if os.path.isfile(path): profile = path break if os.path.isfile(path): break profile = open(profile, "rb") else: # binary string data = profile self.is_loaded = True if not data: # file object self._file = profile self.fileName = self._file.name self._file.seek(0) data = self._file.read(128) self.close() if not data or len(data) < 128: raise ICCProfileInvalidError("Not enough data") if data[36:40] != "acsp": raise ICCProfileInvalidError("Profile signature mismatch - " "expected 'acsp', found '" + data[36:40] + "'") header = data[:128] self.size = uInt32Number(header[0:4]) self.preferredCMM = header[4:8] minorrev_bugfixrev = binascii.hexlify(header[8:12][1]) self.version = float(str(ord(header[8:12][0])) + "." + str(int("0x0" + minorrev_bugfixrev[0], 16)) + str(int("0x0" + minorrev_bugfixrev[1], 16))) self.profileClass = header[12:16] self.colorSpace = header[16:20].strip() self.connectionColorSpace = header[20:24].strip() try: self.dateTime = dateTimeNumber(header[24:36]) except ValueError: raise ICCProfileInvalidError("Profile creation date/time invalid") self.platform = header[40:44] flags = uInt32Number(header[44:48]) self.embedded = flags & 1 != 0 self.independent = flags & 2 == 0 deviceAttributes = uInt64Number(header[56:64]) self.device = { "manufacturer": header[48:52], "model": header[52:56], "attributes": { "reflective": deviceAttributes & 1 == 0, "glossy": deviceAttributes & 2 == 0, "positive": deviceAttributes & 4 == 0, "color": deviceAttributes & 8 == 0 } } self.intent = uInt32Number(header[64:68]) self.illuminant = XYZNumber(header[68:80]) self.creator = header[80:84] if header[84:100] != "\0" * 16: self.ID = header[84:100] self._data = data[:self.size] if load: self.tags else: # Default to RGB display device profile self.preferredCMM = "" self.version = 2.4 self.profileClass = "mntr" self.colorSpace = "RGB" self.connectionColorSpace = "XYZ" self.dateTime = datetime.datetime.now() self.platform = "" self.embedded = False self.independent = True self.device = { "manufacturer": "", "model": "", "attributes": { "reflective": True, "glossy": True, "positive": True, "color": True } } self.intent = 0 self.illuminant = XYZNumber("\0\0\xf6\xd6\0\x01\0\0\0\0\xd3-") # D50 self.creator = "" def __len__(self): """ Return the number of tags. Can also be used in boolean comparisons (profiles with no tags evaluate to false) """ return len(self.tags) @property def data(self): """ Get raw binary profile data. This will re-assemble the various profile parts (header, tag table and data) on-the-fly. """ # Assemble tag table and tag data tagCount = len(self.tags) tagTable = [] tagTableSize = tagCount * 12 tagsData = [] tagsDataOffset = [] tagDataOffset = 128 + 4 + tagTableSize for tagSignature in self.tags: tag = AODict.__getitem__(self.tags, tagSignature) if isinstance(tag, ICCProfileTag): tagData = self.tags[tagSignature].tagData else: tagData = tag[3] tagDataSize = len(tagData) # Pad all data with binary zeros so it lies on 4-byte boundaries padding = int(math.ceil(tagDataSize / 4.0)) * 4 - tagDataSize tagData += "\0" * padding tagTable.append(tagSignature) if tagData in tagsData: tagTable.append(uInt32Number_tohex(tagsDataOffset[tagsData.index(tagData)])) else: tagTable.append(uInt32Number_tohex(tagDataOffset)) tagTable.append(uInt32Number_tohex(tagDataSize)) if not tagData in tagsData: tagsData.append(tagData) tagsDataOffset.append(tagDataOffset) tagDataOffset += tagDataSize + padding header = self.header(tagTableSize, len("".join(tagsData))) data = "".join([header, uInt32Number_tohex(tagCount), "".join(tagTable), "".join(tagsData)]) return data def header(self, tagTableSize, tagDataSize): "Profile Header" # Profile size: 128 bytes header + 4 bytes tag count + tag table + data header = [uInt32Number_tohex(128 + 4 + tagTableSize + tagDataSize), self.preferredCMM[:4].ljust(4, " ") if self.preferredCMM else "\0" * 4, # Next three lines are ICC version chr(int(str(self.version).split(".")[0])), binascii.unhexlify(("%.2f" % self.version).split(".")[1]), "\0" * 2, self.profileClass[:4].ljust(4, " "), self.colorSpace[:4].ljust(4, " "), self.connectionColorSpace[:4].ljust(4, " "), dateTimeNumber_tohex(self.dateTime), "acsp", self.platform[:4].ljust(4, " ") if self.platform else "\0" * 4,] flags = 0 if self.embedded: flags += 1 if not self.independent: flags += 2 header.extend([uInt32Number_tohex(flags), self.device["manufacturer"][:4].rjust(4, "\0") if self.device["manufacturer"] else "\0" * 4, self.device["model"][:4].rjust(4, "\0") if self.device["model"] else "\0" * 4]) deviceAttributes = 0 for name, bit in {"reflective": 1, "glossy": 2, "positive": 4, "color": 8}.iteritems(): if not self.device["attributes"][name]: deviceAttributes += bit if sys.platform == "darwin" and self.version < 4: # Dont't include ID under Mac OS X unless v4 profile # to stop pedantic ColorSync utility from complaining # about header padding not being null id = "" else: id = self.ID[:16] header.extend([uInt64Number_tohex(deviceAttributes), uInt32Number_tohex(self.intent), self.illuminant.tohex(), self.creator[:4].ljust(4, " ") if self.creator else "\0" * 4, id.ljust(16, "\0"), self._data[100:128] if len(self._data[100:128]) == 28 else "\0" * 28]) return "".join(header) @property def tags(self): "Profile Tag Table" if not self._tags: self.load() if self._data and len(self._data) > 131: # tag table and tagged element data tagCount = uInt32Number(self._data[128:132]) if debug: print "tagCount:", tagCount tagTable = self._data[132:132 + tagCount * 12] discard_len = 0 tags = {} while tagTable: tag = tagTable[:12] if len(tag) < 12: raise ICCProfileInvalidError("Tag table is truncated") tagSignature = tag[:4] if debug: print "tagSignature:", tagSignature tagDataOffset = uInt32Number(tag[4:8]) if debug: print " tagDataOffset:", tagDataOffset tagDataSize = uInt32Number(tag[8:12]) if debug: print " tagDataSize:", tagDataSize if tagSignature in self._tags: safe_print("Error (non-critical): Tag '%s' already " "encountered. Skipping..." % tagSignature) else: if (tagDataOffset, tagDataSize) in tags: if debug: print " tagDataOffset and tagDataSize indicate shared tag" else: start = tagDataOffset - discard_len if debug: print " tagData start:", start end = tagDataOffset - discard_len + tagDataSize if debug: print " tagData end:", end tagData = self._data[start:end] if len(tagData) < tagDataSize: raise ICCProfileInvalidError("Tag data for tag %r (offet %i, size %i) is truncated" % (tagSignature, tagDataOffset, tagDataSize)) typeSignature = tagData[:4] if len(typeSignature) < 4: raise ICCProfileInvalidError("Tag type signature for tag %r (offet %i, size %i) is truncated" % (tagSignature, tagDataOffset, tagDataSize)) if debug: print " typeSignature:", typeSignature tags[(tagDataOffset, tagDataSize)] = (typeSignature, tagDataOffset, tagDataSize, tagData) self._tags[tagSignature] = tags[(tagDataOffset, tagDataSize)] tagTable = tagTable[12:] self._data = self._data[:128] return self._tags def calculateID(self, setID=True): """ Calculates, sets, and returns the profile's ID (checksum). Calling this function always recalculates the checksum on-the-fly, in contrast to just accessing the ID property. The entire profile, based on the size field in the header, is used to calculate the ID after the values in the Profile Flags field (bytes 44 to 47), Rendering Intent field (bytes 64 to 67) and Profile ID field (bytes 84 to 99) in the profile header have been temporarily replaced with zeros. """ data = self.data[:44] + "\0\0\0\0" + self.data[48:64] + "\0\0\0\0" + \ self.data[68:84] + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + \ self.data[100:] ID = md5(data).digest() if setID: self.ID = ID return ID def close(self): """ Closes the associated file object (if any). """ if self._file and not self._file.closed: self._file.close() @staticmethod def from_named_rgb_space(rgb_space_name, iccv4=False, cat="Bradford"): rgb_space = colormath.get_rgb_space(rgb_space_name) return ICCProfile.from_rgb_space(rgb_space, rgb_space_name, iccv4, cat) @staticmethod def from_rgb_space(rgb_space, description, iccv4=False, cat="Bradford"): rx, ry = rgb_space[2:][0][:2] gx, gy = rgb_space[2:][1][:2] bx, by = rgb_space[2:][2][:2] wx, wy = colormath.XYZ2xyY(*rgb_space[1])[:2] return ICCProfile.from_chromaticities(rx, ry, gx, gy, bx, by, wx, wy, rgb_space[0], description, "No copyright") @staticmethod def from_edid(edid, iccv4=False, cat="Bradford"): """ Create an ICC Profile from EDID data and return it You may override the gamma from EDID by setting it to a list of curve values. """ description = edid.get("monitor_name", edid.get("ascii", str(edid["product_id"] or edid["hash"]))) manufacturer = edid.get("manufacturer", "") manufacturer_id = edid["edid"][8:10] model_name = description model_id = edid["edid"][10:12] copyright = "Created from EDID" # Get chromaticities of primaries xy = {} for color in ("red", "green", "blue", "white"): x, y = edid.get(color + "_x", 0.0), edid.get(color + "_y", 0.0) xy[color[0] + "x"] = x xy[color[0] + "y"] = y gamma = edid.get("gamma", 2.2) profile = ICCProfile.from_chromaticities(xy["rx"], xy["ry"], xy["gx"], xy["gy"], xy["bx"], xy["by"], xy["wx"], xy["wy"], gamma, description, copyright, manufacturer, model_name, manufacturer_id, model_id, iccv4, cat) profile.set_edid_metadata(edid) spec_prefixes = "DATA_,OPENICC_" prefixes = (profile.tags.meta.getvalue("prefix", "", None) or spec_prefixes).split(",") for prefix in spec_prefixes.split(","): if not prefix in prefixes: prefixes.append(prefix) profile.tags.meta["prefix"] = ",".join(prefixes) profile.tags.meta["OPENICC_automatic_generated"] = "1" profile.tags.meta["DATA_source"] = "edid" profile.calculateID() return profile @staticmethod def from_chromaticities(rx, ry, gx, gy, bx, by, wx, wy, gamma, description, copyright, manufacturer=None, model_name=None, manufacturer_id="\0\0", model_id="\0\0", iccv4=False, cat="Bradford"): """ Create an ICC Profile from chromaticities and return it """ wXYZ = colormath.xyY2XYZ(wx, wy, 1.0) # Calculate RGB to XYZ matrix from chromaticities and white mtx = colormath.rgb_to_xyz_matrix(rx, ry, gx, gy, bx, by, wXYZ) rgb = {"r": (1.0, 0.0, 0.0), "g": (0.0, 1.0, 0.0), "b": (0.0, 0.0, 1.0)} XYZ = {} for color in "rgb": # Calculate XYZ for primaries XYZ[color] = mtx * rgb[color] profile = ICCProfile.from_XYZ(XYZ["r"], XYZ["g"], XYZ["b"], wXYZ, gamma, description, copyright, manufacturer, model_name, manufacturer_id, model_id, iccv4, cat) return profile @staticmethod def from_XYZ(rXYZ, gXYZ, bXYZ, wXYZ, gamma, description, copyright, manufacturer=None, model_name=None, manufacturer_id="\0\0", model_id="\0\0", iccv4=False, cat="Bradford"): """ Create an ICC Profile from XYZ values and return it """ profile = ICCProfile() if iccv4: profile.version = 4.2 profile.setDescription(description) profile.setCopyright(copyright) if manufacturer: profile.setDeviceManufacturerDescription(manufacturer) if model_name: profile.setDeviceModelDescription(model_name) profile.device["manufacturer"] = "\0\0" + manufacturer_id[1] + manufacturer_id[0] profile.device["model"] = "\0\0" + model_id[1] + model_id[0] # Add Apple-specific 'mmod' tag (TODO: need full spec) if manufacturer_id != "\0\0" or model_id != "\0\0": mmod = ("mmod" + ("\x00" * 6) + manufacturer_id + ("\x00" * 2) + model_id[1] + model_id[0] + ("\x00" * 4) + ("\x00" * 20)) profile.tags.mmod = ICCProfileTag(mmod, "mmod") profile.tags.wtpt = XYZType(profile=profile) D50 = colormath.get_whitepoint("D50") if iccv4: # Set wtpt to D50 and store actual white -> D50 transform in chad (profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z) = D50 profile.tags.chad = chromaticAdaptionTag() matrix = colormath.wp_adaption_matrix(wXYZ, D50, cat) profile.tags.chad.update(matrix) else: # Store actual white in wtpt (profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z) = wXYZ profile.tags.chrm = ChromaticityType() profile.tags.chrm.type = 0 for color in "rgb": X, Y, Z = locals()[color + "XYZ"] # Get chromaticity of primary x, y = colormath.XYZ2xyY(X, Y, Z)[:2] profile.tags.chrm.channels.append((x, y)) # Write XYZ and TRC tags (don't forget to adapt to D50) tagname = color + "XYZ" profile.tags[tagname] = XYZType(profile=profile) (profile.tags[tagname].X, profile.tags[tagname].Y, profile.tags[tagname].Z) = colormath.adapt(X, Y, Z, wXYZ, D50, cat) tagname = color + "TRC" profile.tags[tagname] = CurveType(profile=profile) if isinstance(gamma, (list, tuple)): profile.tags[tagname].extend(gamma) else: profile.tags[tagname].set_trc(gamma, 1) profile.calculateID() return profile def set_blackpoint(self, XYZbp): self.tags.bkpt = XYZType(tagSignature="bkpt", profile=self) self.tags.bkpt.X, self.tags.bkpt.Y, self.tags.bkpt.Z = XYZbp def apply_black_offset(self, XYZbp, power=40.0, include_A2B=True, set_blackpoint=True, logfiles=None, thread_abort=None, abortmessage="Aborted"): # Apply only the black point blending portion of BT.1886 mapping if include_A2B: tables = [] for i in xrange(3): a2b = self.tags.get("A2B%i" % i) if isinstance(a2b, LUT16Type) and not a2b in tables: a2b.apply_black_offset(XYZbp, logfiles, thread_abort, abortmessage) tables.append(a2b) if set_blackpoint: self.set_blackpoint(XYZbp) if not self.tags.get("rTRC"): return rXYZ = self.tags.rXYZ.values() gXYZ = self.tags.gXYZ.values() bXYZ = self.tags.bXYZ.values() mtx = colormath.Matrix3x3([[rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]]]) imtx = mtx.inverted() for channel in "rgb": tag = CurveType(profile=self) if len(self.tags[channel + "TRC"]) == 1: gamma = self.tags[channel + "TRC"].get_gamma() tag.set_trc(gamma, 1024) else: tag.extend(self.tags[channel + "TRC"]) self.tags[channel + "TRC"] = tag rgbbp_in = [] for channel in "rgb": rgbbp_in.append(self.tags["%sTRC" % channel][0] / 65535.0) bp_in = mtx * rgbbp_in if tuple(bp_in) == tuple(XYZbp): return size = len(self.tags.rTRC) for i in xrange(size): rgb = [] for channel in "rgb": rgb.append(self.tags["%sTRC" % channel][i] / 65535.0) X, Y, Z = mtx * rgb XYZ = colormath.blend_blackpoint(X, Y, Z, bp_in, XYZbp, power) rgb = imtx * XYZ for j in xrange(3): self.tags["%sTRC" % "rgb"[j]][i] = min(max(rgb[j], 0), 1) * 65535 def set_bt1886_trc(self, XYZbp, outoffset=0.0, gamma=2.4, gamma_type="B", size=None): if gamma_type in ("b", "g"): # Get technical gamma needed to achieve effective gamma gamma = colormath.xicc_tech_gamma(gamma, XYZbp[1], outoffset) rXYZ = self.tags.rXYZ.values() gXYZ = self.tags.gXYZ.values() bXYZ = self.tags.bXYZ.values() mtx = colormath.Matrix3x3([[rXYZ[0], gXYZ[0], bXYZ[0]], [rXYZ[1], gXYZ[1], bXYZ[1]], [rXYZ[2], gXYZ[2], bXYZ[2]]]) bt1886 = colormath.BT1886(mtx, XYZbp, outoffset, gamma) values = OrderedDict() for i, channel in enumerate(("r", "g", "b")): self.tags[channel + "TRC"] = CurveType(profile=self) self.tags[channel + "TRC"].set_trc(-709, size) for j, v in enumerate(self.tags[channel + "TRC"]): if not values.get(j): values[j] = [] values[j].append(v / 65535.0) for i, (r, g, b) in values.iteritems(): X, Y, Z = mtx * (r, g, b) values[i] = bt1886.apply(X, Y, Z) for i, XYZ in values.iteritems(): rgb = mtx.inverted() * XYZ for j, channel in enumerate(("r", "g", "b")): self.tags[channel + "TRC"][i] = max(min(rgb[j] * 65535, 65535), 0) self.set_blackpoint(XYZbp) def set_dicom_trc(self, XYZbp, white_cdm2=100, size=1024): """ Set the response to the DICOM Grayscale Standard Display Function This response is special in that it depends on the actual black and white level of the display. XYZbp Black point in absolute XYZ, Y range 0.05..white_cdm2 """ self.set_trc_tags() for channel in "rgb": self.tags["%sTRC" % channel].set_dicom_trc(XYZbp[1], white_cdm2, size) self.apply_black_offset([v / white_cdm2 for v in XYZbp], 40.0 * (white_cdm2 / 40.0)) def set_hlg_trc(self, XYZbp=(0, 0, 0), white_cdm2=100, system_gamma=1.2, ambient_cdm2=5, maxsignal=1.0, size=1024, blend_blackpoint=True): """ Set the response to the Hybrid Log-Gamma (HLG) function This response is special in that it depends on the actual black and white level of the display, system gamma and ambient. XYZbp Black point in absolute XYZ, Y range 0..white_cdm2 maxsignal Set clipping point (optional) size Number of steps. Recommended >= 1024 """ self.set_trc_tags() for channel in "rgb": self.tags["%sTRC" % channel].set_hlg_trc(XYZbp[1], white_cdm2, system_gamma, ambient_cdm2, maxsignal, size) if tuple(XYZbp) != (0, 0, 0) and blend_blackpoint: self.apply_black_offset([v / white_cdm2 for v in XYZbp], 40.0 * (white_cdm2 / 100.0)) def set_smpte2084_trc(self, XYZbp=(0, 0, 0), white_cdm2=100, master_black_cdm2=0, master_white_cdm2=10000, rolloff=False, size=1024, blend_blackpoint=True): """ Set the response to the SMPTE 2084 perceptual quantizer (PQ) function This response is special in that it depends on the actual black and white level of the display. XYZbp Black point in absolute XYZ, Y range 0..white_cdm2 master_black_cdm2 (Optional) Used to normalize PQ values master_white_cdm2 (Optional) Used to normalize PQ values rolloff BT.2390 size Number of steps. Recommended >= 1024 """ self.set_trc_tags() for channel in "rgb": self.tags["%sTRC" % channel].set_smpte2084_trc(XYZbp[1], white_cdm2, master_black_cdm2, master_white_cdm2, rolloff, size) if tuple(XYZbp) != (0, 0, 0) and blend_blackpoint: self.apply_black_offset([v / white_cdm2 for v in XYZbp], 40.0 * (white_cdm2 / 100.0)) def set_trc_tags(self, identical=False): for channel in "rgb": if identical and channel != "r": tag = self.tags.rTRC else: tag = CurveType(profile=self) self.tags["%sTRC" % channel] = tag def set_localizable_desc(self, tagname, description, languagecode="en", countrycode="US"): # Handle ICCv2 <> v4 differences and encoding if self.version < 4: self.tags[tagname] = TextDescriptionType() if isinstance(description, unicode): asciidesc = description.encode("ASCII", "asciize") else: asciidesc = description self.tags[tagname].ASCII = asciidesc if asciidesc != description: self.tags[tagname].Unicode = description else: self.set_localizable_text(self, tagname, description, languagecode, countrycode) def set_localizable_text(self, tagname, text, languagecode="en", countrycode="US"): # Handle ICCv2 <> v4 differences and encoding if self.version < 4: if isinstance(text, unicode): text = text.encode("ASCII", "asciize") self.tags[tagname] = TextType("text\0\0\0\0%s\0" % text, tagname) else: self.tags[tagname] = MultiLocalizedUnicodeType() self.tags[tagname].add_localized_string(languagecode, countrycode, text) def setCopyright(self, copyright, languagecode="en", countrycode="US"): self.set_localizable_text("cprt", copyright, languagecode, countrycode) def setDescription(self, description, languagecode="en", countrycode="US"): self.set_localizable_desc("desc", description, languagecode, countrycode) def setDeviceManufacturerDescription(self, description, languagecode="en", countrycode="US"): self.set_localizable_desc("dmnd", description, languagecode, countrycode) def setDeviceModelDescription(self, description, languagecode="en", countrycode="US"): self.set_localizable_desc("dmdd", description, languagecode, countrycode) def getCopyright(self): """ Return profile copyright. """ return unicode(self.tags.get("cprt", "")) def getDescription(self): """ Return profile description. """ return unicode(self.tags.get("desc", "")) def getDeviceManufacturerDescription(self): """ Return device manufacturer description. """ return unicode(self.tags.get("dmnd", "")) def getDeviceModelDescription(self): """ Return device model description. """ return unicode(self.tags.get("dmdd", "")) def getViewingConditionsDescription(self): """ Return viewing conditions description. """ return unicode(self.tags.get("vued", "")) def guess_cat(self, matrix=True): """ Get or guess chromatic adaptation transform. If 'matrix' is True, and 'arts' tag is present, return actual matrix instead of name. """ illuminant = self.illuminant.values() if isinstance(self.tags.get("chad"), chromaticAdaptionTag): return colormath.guess_cat(self.tags.chad, self.tags.chad.inverted() * illuminant, illuminant) elif isinstance(self.tags.get("arts"), chromaticAdaptionTag): if matrix: return self.tags.arts return self.tags.arts.get_cat() def isSame(self, profile, force_calculation=False): """ Compare the ID of profiles. Returns a boolean indicating if the profiles have the same ID. profile can be a ICCProfile instance, a binary string containing profile data, a filename or a file object. """ if not isinstance(profile, self.__class__): profile = self.__class__(profile) if force_calculation or self.ID == "\0" * 16: id1 = self.calculateID(False) else: id1 = self.ID if force_calculation or profile.ID == "\0" * 16: id2 = profile.calculateID(False) else: id2 = profile.ID return id1 == id2 def load(self): """ Loads the profile from the file object. Normally, you don't need to call this method, since the ICCProfile class automatically loads the profile when necessary (load does nothing if the profile was passed in as a binary string). """ if not self.is_loaded and self._file: if self._file.closed: self._file = open(self._file.name, "rb") self._file.seek(len(self._data)) self._data += self._file.read(self.size - len(self._data)) self._file.close() self.is_loaded = True def print_info(self): safe_print("=" * 80) safe_print("ICC profile information") safe_print("-" * 80) safe_print("File name:", os.path.basename(self.fileName or "")) for label, value in self.get_info(): if not value: safe_print(label) else: safe_print(label + ":", value) def get_info(self): info = DictList() info["Size"] = "%i Bytes (%.2f KiB)" % (self.size, self.size / 1024.0) info["Preferred CMM"] = hexrepr(self.preferredCMM, cmms) info["ICC version"] = "%s" % self.version info["Profile class"] = profileclass.get(self.profileClass, self.profileClass) info["Color model"] = self.colorSpace info["Profile connection space (PCS)"] = self.connectionColorSpace info["Created"] = strftime("%Y-%m-%d %H:%M:%S", self.dateTime.timetuple()) info["Platform"] = platform.get(self.platform, hexrepr(self.platform)) info["Is embedded"] = {True: "Yes"}.get(self.embedded, "No") info["Can be used independently"] = {True: "Yes"}.get(self.independent, "No") info["Device"] = "" info[" Manufacturer"] = "0x%s" % binascii.hexlify(self.device["manufacturer"]).upper() if (self.device["manufacturer"][0:2] == "\0\0" and self.device["manufacturer"][2:4] != "\0\0"): mnft_id = self.device["manufacturer"][3] + self.device["manufacturer"][2] mnft_id = edid.parse_manufacturer_id(mnft_id) manufacturer = edid.get_manufacturer_name(mnft_id) else: manufacturer = safe_unicode(re.sub("[^\x20-\x7e]", "", self.device["manufacturer"])).encode("ASCII", "replace") if manufacturer != self.device["manufacturer"]: manufacturer = None else: manufacturer = "'%s'" % manufacturer if manufacturer is not None: info[" Manufacturer"] += " %s" % manufacturer info[" Model"] = hexrepr(self.device["model"]) info[" Attributes"] = "\n".join([{True: "Reflective"}.get(self.device["attributes"]["reflective"], "Transparency"), {True: "Glossy"}.get(self.device["attributes"]["glossy"], "Matte"), {True: "Positive"}.get(self.device["attributes"]["positive"], "Negative"), {True: "Color"}.get(self.device["attributes"]["color"], "Black & white")]) info["Default rendering intent"] = {0: "Perceptual", 1: "Media-relative colorimetric", 2: "Saturation", 3: "ICC-absolute colorimetric"}.get(self.intent, "Unknown") info["PCS illuminant XYZ"] = " ".join([" ".join(["%6.2f" % (v * 100) for v in self.illuminant.values()]), "(xy %s," % " ".join("%6.4f" % v for v in self.illuminant.xyY[:2]), "CCT %iK)" % (colormath.XYZ2CCT(*self.illuminant.values()) or 0)]) info["Creator"] = hexrepr(self.creator, manufacturers) info["Checksum"] = "0x%s" % binascii.hexlify(self.ID).upper() calcID = self.calculateID(False) if self.ID != "\0" * 16: info[" Checksum OK"] = {True: "Yes"}.get(self.ID == calcID, "No") if self.ID != calcID: info[" Calculated checksum"] = "0x%s" % binascii.hexlify(calcID).upper() for sig, tag in self.tags.iteritems(): name = tags.get(sig, "'%s'" % sig) if isinstance(tag, chromaticAdaptionTag): info[name] = self.guess_cat(False) or "Unknown" name = " Matrix" for i, row in enumerate(tag): if i > 0: name = " " * 2 info[name] = " ".join("%6.4f" % v for v in row) elif isinstance(tag, ChromaticityType): info["Chromaticity (illuminant-relative)"] = "" for i, channel in enumerate(tag.channels): if self.colorSpace.endswith("CLR"): colorant_name = "" else: colorant_name = "(%s) " % self.colorSpace[i:i + 1] info[" Channel %i %sxy" % (i + 1, colorant_name)] = " ".join( "%6.4f" % v for v in channel) elif isinstance(tag, ColorantTableType): info["Colorants (PCS-relative)"] = "" maxlen = max(map(len, tag.keys())) for colorant_name, colorant in tag.iteritems(): values = colorant.values() if "".join(colorant.keys()) == "Lab": values = colormath.Lab2XYZ(*values) else: values = [v / 100.0 for v in values] XYZxy = [" ".join("%6.2f" % v for v in colorant.values())] if values != [0, 0, 0]: XYZxy.append("(xy %s)" % " ".join("%6.4f" % v for v in colormath.XYZ2xyY(*values)[:2])) info[" %s %s" % (colorant_name, "".join(colorant.keys()))] = " ".join(XYZxy) elif isinstance(tag, CurveType): if len(tag) == 1: info[name] = "Gamma %3.2f" % tag[0] elif len(tag): info[name] = "" info[" Number of entries"] = "%i" % len(tag) #info[" Average gamma"] = "%3.2f" % tag.get_gamma() transfer_function = tag.get_transfer_function(slice=(0, 1.0), outoffset=1.0) if round(transfer_function[1], 2) == 1.0: value = u"%s" % ( transfer_function[0][0]) else: if transfer_function[1] >= .95: value = u"≈ %s (Δ %.2f%%)" % ( transfer_function[0][0], 100 - transfer_function[1] * 100) else: value = "Unknown" info[" Transfer function"] = value info[" Minimum Y"] = "%6.4f" % (tag[0] / 65535.0 * 100) info[" Maximum Y"] = "%6.2f" % (tag[-1] / 65535.0 * 100) elif isinstance(tag, DictType): if sig == "meta": name = "Metadata" else: name = "Generic name-value data" info[name] = "" for key in tag: key = tag.getname(key) value = tag.getvalue(key) if key == "prefix": value = "\n".join(value.split(",")) info[" %s" % key] = value elif isinstance(tag, LUT16Type): info[name] = "" name = " Matrix" for i, row in enumerate(tag.matrix): if i > 0: name = " " * 2 info[name] = " ".join("%6.4f" % v for v in row) info[" Input Table"] = "" info[" Channels"] = "%i" % tag.input_channels_count info[" Number of entries per channel"] = "%i" % tag.input_entries_count info[" Color Look Up Table"] = "" info[" Grid Steps"] = "%i" % tag.clut_grid_steps info[" Entries"] = "%i" % (tag.clut_grid_steps ** tag.input_channels_count) info[" Output Table"] = "" info[" Channels"] = "%i" % tag.output_channels_count info[" Number of entries per channel"] = "%i" % tag.output_entries_count elif isinstance(tag, MakeAndModelType): info[name] = "" info[" Manufacturer"] = "0x%s %s" % ( binascii.hexlify(tag.manufacturer).upper(), edid.get_manufacturer_name(edid.parse_manufacturer_id(tag.manufacturer)) or "") info[" Model"] = "0x%s" % binascii.hexlify(tag.model).upper() elif isinstance(tag, MeasurementType): info[name] = "" info[" Observer"] = tag.observer.description info[" Backing XYZ"] = " ".join("%6.2f" % v for v in tag.backing.values()) info[" Geometry"] = tag.geometry.description info[" Flare"] = "%.2f%%" % (tag.flare * 100) info[" Illuminant"] = tag.illuminantType.description elif isinstance(tag, MultiLocalizedUnicodeType): info[name] = "" for language, countries in tag.iteritems(): for country, value in countries.iteritems(): if country.strip("\0 "): country = "/" + country info[" %s%s" % (language, country)] = value elif isinstance(tag, NamedColor2Type): info[name] = "" info[" Device color components"] = "%i" % ( tag.deviceCoordCount,) info[" Colors (PCS-relative)"] = "%i (%i Bytes) " % ( tag.colorCount, len(tag.tagData)) i = 1 for k, v in tag.iteritems(): pcsout = [] devout = [] for kk, vv in v.pcs.iteritems(): pcsout.append("%03.2f" % vv) for vv in v.device: devout.append("%03.2f" % vv) formatstr = " %%0%is %%s%%s%%s" % len(str(tag.colorCount)) key = formatstr % (i, tag.prefix, k, tag.suffix) info[key] = "%s %s" % ("".join(v.pcs.keys()), " ".join(pcsout)) if (self.colorSpace != self.connectionColorSpace or " ".join(pcsout) != " ".join(devout)): info[key] += " (%s %s)" % (self.colorSpace, " ".join(devout)) i += 1 elif isinstance(tag, Text): if sig == "cprt": info[name] = unicode(tag) elif sig == "ciis": info[name] = ciis.get(tag, "'%s'" % tag) elif sig == "tech": info[name] = tech.get(tag, "'%s'" % tag) elif tag.find("\n") > -1 or tag.find("\r") > -1: info[name] = "[%i Bytes]" % len(tag) else: info[name] = (unicode(tag)[:60 - len(name)] + ("...[%i more Bytes]" % (len(tag) - (60 - len(name))) if len(tag) > 60 - len(name) else "")) elif isinstance(tag, TextDescriptionType): if not tag.get("Unicode") and not tag.get("Macintosh"): info["%s (ASCII)" % name] = safe_unicode(tag.ASCII) else: info[name] = "" info[" ASCII"] = safe_unicode(tag.ASCII) if tag.get("Unicode"): info[" Unicode"] = tag.Unicode if tag.get("Macintosh"): info[" Macintosh"] = tag.Macintosh elif isinstance(tag, VideoCardGammaFormulaType): info[name] = "" #linear = tag.is_linear() #info[" Is linear"] = {0: "No", 1: "Yes"}[linear] for key in ("red", "green", "blue"): info[" %s gamma" % key.capitalize()] = "%.2f" % tag[key + "Gamma"] info[" %s minimum" % key.capitalize()] = "%.2f" % tag[key + "Min"] info[" %s maximum" % key.capitalize()] = "%.2f" % tag[key + "Max"] elif isinstance(tag, VideoCardGammaTableType): info[name] = "" info[" Bitdepth"] = "%i" % (tag.entrySize * 8) info[" Channels"] = "%i" % tag.channels info[" Number of entries per channel"] = "%i" % tag.entryCount r_points, g_points, b_points, linear_points = tag.get_values() points = r_points, g_points, b_points #if r_points == g_points == b_points == linear_points: #info[" Is linear" % i] = {True: "Yes"}.get(points[i] == linear_points, "No") #else: if True: unique = tag.get_unique_values() for i, channel in enumerate(tag.data): scale = math.pow(2, tag.entrySize * 8) - 1 vmin = 0 vmax = scale gamma = colormath.get_gamma([((len(channel) / 2 - 1) / (len(channel) - 1.0) * scale, channel[len(channel) / 2 - 1])], scale, vmin, vmax, False, False) if gamma: info[" Channel %i gamma at 50%% input" % (i + 1)] = "%.2f" % gamma[0] vmin = channel[0] vmax = channel[-1] info[" Channel %i minimum" % (i + 1)] = "%6.4f%%" % (vmin / scale * 100) info[" Channel %i maximum" % (i + 1)] = "%6.2f%%" % (vmax / scale * 100) info[" Channel %i unique values" % (i + 1)] = "%i @ 8 Bit" % len(unique[i]) info[" Channel %i is linear" % (i + 1)] = {True: "Yes"}.get(points[i] == linear_points, "No") elif isinstance(tag, ViewingConditionsType): info[name] = "" info[" Illuminant"] = tag.illuminantType.description info[" Illuminant XYZ"] = "%s (xy %s)" % ( " ".join("%6.2f" % v for v in tag.illuminant.values()), " ".join("%6.4f" % v for v in tag.illuminant.xyY[:2])) XYZxy = [" ".join("%6.2f" % v for v in tag.surround.values())] if tag.surround.values() != [0, 0, 0]: XYZxy.append("(xy %s)" % " ".join("%6.4f" % v for v in tag.surround.xyY[:2])) info[" Surround XYZ"] = " ".join(XYZxy) elif isinstance(tag, XYZType): if sig == "lumi": info[name] = u"%.2f cd/m²" % self.tags.lumi.Y elif sig in ("bkpt", "wtpt"): format = {"bkpt": "%6.4f", "wtpt": "%6.2f"}[sig] info[name] = "" if self.profileClass == "mntr" and sig == "wtpt": info[" Is illuminant"] = "Yes" if self.profileClass == "mntr" or "chad" in self.tags: label = "Illuminant-relative" else: label = "PCS-relative" #if (self.connectionColorSpace == "Lab" and #self.profileClass == "prtr"): if self.profileClass == "prtr": color = [" ".join([format % v for v in tag.ir.Lab])] info[" %s Lab" % label] = " ".join(color) else: color = [" ".join(format % (v * 100) for v in tag.ir.values())] if tag.ir.values() != [0, 0, 0]: xy = " ".join("%6.4f" % v for v in tag.ir.xyY[:2]) color.append("(xy %s)" % xy) cct, delta = colormath.xy_CCT_delta(*tag.ir.xyY[:2]) else: cct = None info[" %s XYZ" % label] = " ".join(color) if cct: info[" %s CCT" % label] = "%iK" % cct if delta: info[u" ΔE 2000 to daylight locus"] = "%.2f" % delta["E"] kwargs = {"daylight": False} cct, delta = colormath.xy_CCT_delta(*tag.ir.xyY[:2], **kwargs) if delta: info[u" ΔE 2000 to blackbody locus"] = "%.2f" % delta["E"] if "chad" in self.tags: color = [" ".join(format % (v * 100) for v in tag.pcs.values())] if tag.pcs.values() != [0, 0, 0]: xy = " ".join("%6.4f" % v for v in tag.pcs.xyY[:2]) color.append("(xy %s)" % xy) info[" PCS-relative XYZ"] = " ".join(color) cct, delta = colormath.xy_CCT_delta(*tag.pcs.xyY[:2]) if cct: info[" PCS-relative CCT"] = "%iK" % cct #if delta: #info[u" ΔE 2000 to daylight locus"] = "%.2f" % delta["E"] #kwargs = {"daylight": False} #cct, delta = colormath.xy_CCT_delta(*tag.pcs.xyY[:2], **kwargs) #if delta: #info[u" ΔE 2000 to blackbody locus"] = "%.2f" % delta["E"] else: info[name] = "" info[" Illuminant-relative XYZ"] = " ".join( [" ".join("%6.2f" % (v * 100) for v in tag.ir.values()), "(xy %s)" % " ".join("%6.4f" % v for v in tag.ir.xyY[:2])]) info[" PCS-relative XYZ"] = " ".join( [" ".join("%6.2f" % (v * 100) for v in tag.values()), "(xy %s)" % " ".join("%6.4f" % v for v in tag.xyY[:2])]) elif isinstance(tag, ICCProfileTag): info[name] = "'%s' [%i Bytes]" % (tag.tagData[:4], len(tag.tagData)) return info def get_rgb_space(self, relation="ir", gamma=None): tags = self.tags if not "wtpt" in tags: return False rgb_space = [gamma or [], getattr(tags.wtpt, relation).values()] for component in ("r", "g", "b"): if (not "%sXYZ" % component in tags or (not gamma and (not "%sTRC" % component in tags or not isinstance(tags["%sTRC" % component], CurveType)))): return False rgb_space.append(getattr(tags["%sXYZ" % component], relation).xyY) if not gamma: if len(tags["%sTRC" % component]) > 1: rgb_space[0].append([v / 65535.0 for v in tags["%sTRC" % component]]) else: rgb_space[0].append(tags["%sTRC" % component][0]) return rgb_space def read(self, profile): """ Read profile from binary string, filename or file object. Same as self.__init__(profile) """ self.__init__(profile) def set_edid_metadata(self, edid): """ Sets metadata from EDID Key names follow the ICC meta Tag for Monitor Profiles specification http://www.oyranos.org/wiki/index.php?title=ICC_meta_Tag_for_Monitor_Profiles_0.1 and the GNOME Color Manager metadata specification http://gitorious.org/colord/master/blobs/master/doc/metadata-spec.txt """ if not "meta" in self.tags: self.tags.meta = DictType() spec_prefixes = "EDID_" prefixes = (self.tags.meta.getvalue("prefix", "", None) or spec_prefixes).split(",") for prefix in spec_prefixes.split(","): if not prefix in prefixes: prefixes.append(prefix) # OpenICC keys (some shared with GCM) self.tags.meta.update((("prefix", ",".join(prefixes)), ("EDID_mnft", edid["manufacturer_id"]), ("EDID_mnft_id", struct.unpack(">H", edid["edid"][8:10])[0]), ("EDID_model_id", edid["product_id"]), ("EDID_date", "%0.4i-T%i" % (edid["year_of_manufacture"], edid["week_of_manufacture"])), ("EDID_red_x", edid["red_x"]), ("EDID_red_y", edid["red_y"]), ("EDID_green_x", edid["green_x"]), ("EDID_green_y", edid["green_y"]), ("EDID_blue_x", edid["blue_x"]), ("EDID_blue_y", edid["blue_y"]), ("EDID_white_x", edid["white_x"]), ("EDID_white_y", edid["white_y"]))) manufacturer = edid.get("manufacturer") if manufacturer: self.tags.meta["EDID_manufacturer"] = colord.quirk_manufacturer(manufacturer) if "gamma" in edid: self.tags.meta["EDID_gamma"] = edid["gamma"] monitor_name = edid.get("monitor_name", edid.get("ascii")) if monitor_name: self.tags.meta["EDID_model"] = monitor_name if edid.get("serial_ascii"): self.tags.meta["EDID_serial"] = edid["serial_ascii"] elif edid.get("serial_32"): self.tags.meta["EDID_serial"] = str(edid["serial_32"]) # GCM keys self.tags.meta["EDID_md5"] = edid["hash"] def set_gamut_metadata(self, gamut_volume=None, gamut_coverage=None): """ Sets gamut volume and coverage metadata keys """ if gamut_volume or gamut_coverage: if not "meta" in self.tags: self.tags.meta = DictType() # Update meta prefix prefixes = (self.tags.meta.getvalue("prefix", "", None) or "GAMUT_").split(",") if not "GAMUT_" in prefixes: prefixes.append("GAMUT_") self.tags.meta["prefix"] = ",".join(prefixes) if gamut_volume: # Set gamut size self.tags.meta["GAMUT_volume"] = gamut_volume if gamut_coverage: # Set gamut coverage for key, factor in gamut_coverage.iteritems(): self.tags.meta["GAMUT_coverage(%s)" % key] = factor def write(self, stream_or_filename=None): """ Write profile to stream. This will re-assemble the various profile parts (header, tag table and data) on-the-fly. """ if not stream_or_filename: if self._file: if not self._file.closed: self.close() stream_or_filename = self.fileName if isinstance(stream_or_filename, basestring): stream = open(stream_or_filename, "wb") if not self.fileName: self.fileName = stream_or_filename else: stream = stream_or_filename stream.write(self.data) if isinstance(stream_or_filename, basestring): stream.close() DisplayCAL-3.5.0.0/DisplayCAL/imfile.py0000644000076500000000000003052212750222204017240 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement import math import os import struct import time import zlib from meta import name as appname, version from util_str import safe_str def write(data, stream_or_filename, bitdepth=16, format=None, dimensions=None, extrainfo=None): Image(data, bitdepth, extrainfo).write(stream_or_filename, format, dimensions) def write_rgb_clut(stream_or_filename, clutres=33, bitdepth=16, format=None): clut = [] for R in xrange(clutres): for G in xrange(clutres): clut.append([]) for B in xrange(clutres): RGB = [v * (1.0 / (clutres - 1)) for v in (R, G, B)] clut[-1].append([v * (2 ** bitdepth - 1) for v in RGB]) write(clut, stream_or_filename, bitdepth, format) class Image(object): """ Write 8 or 16 bit image files in DPX, PNG or TIFF format. Writing of single color images is highly optimized when using a single pixel as image data and setting dimensions explicitly. """ def __init__(self, data, bitdepth=16, extrainfo=None): self.bitdepth = bitdepth self.data = data self.extrainfo = extrainfo or {} def _pack(self, n): n = int(round(n)) if self.bitdepth == 16: data = struct.pack(">H", n) elif self.bitdepth == 8: data = chr(n) else: raise ValueError("Unsupported bitdepth: %r" % self.bitdepth) return data def _write_dpx(self, stream, dimensions=None): # Very helpful: http://www.fileformat.info/format/dpx/egff.htm # http://www.simplesystems.org/users/bfriesen/dpx/S268M_Revised.pdf # Generic file header (768 bytes) stream.write("SDPX") # Magic number stream.write(struct.pack(">I", 8192)) # Offset to image data stream.write("V2.0\0\0\0\0") # ASCII version # Optimize for single color optimize = len(self.data) == 1 and len(self.data[0]) == 1 and dimensions # Image data imgdata = [] # 10-bit code adapted from GraphicsMagick dpx.c:WriteSamples if self.bitdepth == 10: shifts = (22, 12, 2) # RGB for i, scanline in enumerate(self.data): if self.bitdepth == 10: packed = [] for RGB in scanline: packed_u32 = 0 for datum, sample in enumerate(RGB): packed_u32 |= (sample << shifts[datum]) packed.append(struct.pack(">I", packed_u32)) scanline = "".join(packed) else: scanline = "".join("".join(self._pack(v) for v in RGB) for RGB in scanline) if not optimize: # Pad lines with binary zeros so they end on 4-byte boundaries scanline = scanline.ljust(int(math.ceil(len(scanline) / 4.0)) * 4, "\0") imgdata.append(scanline) imgdata = "".join(imgdata) if optimize: # Optimize for single color imgdata *= dimensions[0] # Pad lines with binary zeros so they end on 4-byte boundaries imgdata = imgdata.ljust(int(math.ceil(len(imgdata) / 4.0)) * 4, "\0") imgdata *= dimensions[1] w, h = dimensions else: w, h = len(self.data[0]), len(self.data) # Generic file header (cont.) stream.write(struct.pack(">I", 8192 + len(imgdata))) # File size stream.write("\0\0\0\1") # DittoKey (1 = not same as previous frame) stream.write(struct.pack(">I", 768 + 640 + 256)) # Generic section header length stream.write(struct.pack(">I", 256 + 128)) # Industry-specific section header length stream.write(struct.pack(">I", 0)) # User-defined data length stream.write(safe_str(stream.name or "").ljust(100, "\0")[-100:]) # File name # Date & timestamp tzoffset = round((time.mktime(time.localtime()) - time.mktime(time.gmtime())) / 60.0 / 60.0) if tzoffset < 0: tzoffset = "%.2i" % tzoffset else: tzoffset = "+%.2i" % tzoffset stream.write(time.strftime("%Y:%m:%d:%H:%M:%S") + tzoffset + "\0\0") stream.write(safe_str("%s %s" % (appname, version)).ljust(100, "\0")) # Creator stream.write("\0" * 200) # Project stream.write("\0" * 200) # Copyright stream.write("\xff" * 4) # EncryptKey 0xffffffff = not encrypted stream.write("\0" * 104) # Reserved # Generic image header (640 bytes) stream.write("\0\0") # Orientation 0 = left to right, top to bottom stream.write("\0\1") # Number of image elements stream.write(struct.pack(">I", w)) # Pixels per line stream.write(struct.pack(">I", h)) # Lines per image element # Generic image header - image element stream.write("\0" * 4) # 0 = unsigned data stream.write("\0" * 4) # Reference low data code value stream.write("\xff" * 4) # Reference low quantity stream.write(struct.pack(">I", 2 ** self.bitdepth - 1)) # Reference high data code value stream.write("\xff" * 4) # Reference high quantity stream.write(chr(50)) # Descriptor 50 = RGB stream.write("\2") # Transfer 2 = linear stream.write("\2") # Colorimetric 2 = not applicable stream.write(chr(self.bitdepth)) # BitSize stream.write("\0\1") # Packing 1 = filled 32-bit words stream.write("\0\0") # Encoding 0 = not encoded stream.write(struct.pack(">I", 8192)) # Image data offset stream.write("\0" * 4) # End of line padding stream.write("\0" * 4) # End of image padding stream.write("RGB / Linear".ljust(32, "\0")) # Description # Seven additional unused image elements stream.write("\0" * 72 * 7) # Generic image header (cont.) stream.write("\0" * 52) # Reserved # Generic image source header (256 bytes) sw, sh = [self.extrainfo.get("original_" + dim, locals()[dim[0]]) for dim in ("width", "height")] # X offset stream.write(struct.pack(">I", self.extrainfo.get("offset_x", (sw - w) / 2))) # Y offset stream.write(struct.pack(">I", self.extrainfo.get("offset_y", (sh - h) / 2))) # X center stream.write(struct.pack(">f", self.extrainfo.get("center_x", sw / 2.0))) # Y center stream.write(struct.pack(">f", self.extrainfo.get("center_y", sh / 2.0))) stream.write(struct.pack(">I", sw)) # X original size stream.write(struct.pack(">I", sh)) # Y original size stream.write("\0" * 100) # Source image file name stream.write("\0" * 24) # Source image date & timestamp stream.write("\0" * 32) # Input device name stream.write("\0" * 32) # Input device serial number stream.write("\0" * 2 * 4) # Border stream.write("\0\0\0\1" * 2) # Pixel aspect ratio stream.write("\xff" * 4) # X scanned size stream.write("\xff" * 4) # Y scanned size stream.write("\0" * 20) # Reserved # Industry-specific film info header (256 bytes) stream.write("\0" * 2) # Film mfg. ID code stream.write("\0" * 2) # Film type stream.write("\0" * 2) # Offset in perfs stream.write("\0" * 6) # Prefix stream.write("\0" * 4) # Count stream.write("\0" * 32) # Format # Frame position in sequence stream.write(struct.pack(">I", self.extrainfo.get("frame_position", 2 ** 32 - 1))) # Sequence length stream.write(struct.pack(">I", self.extrainfo.get("sequence_length", 2 ** 32 - 1))) # Held count stream.write(struct.pack(">I", self.extrainfo.get("held_count", 1))) # Frame rate of original if "frame_rate" in self.extrainfo: stream.write(struct.pack(">f", self.extrainfo["frame_rate"])) else: stream.write("\xff" * 4) # Shutter angle of camera in degrees stream.write("\xff" * 4) stream.write("\0" * 32) # Frame identification - e.g. keyframe stream.write("\0" * 100) # Slate stream.write("\0" * 56) # Reserved # Industry-specific TV info header (128 bytes) # SMPTE time code stream.write("".join(chr(int(str(v), 16)) for v in self.extrainfo.get("timecode", ["ff"] * 4))) stream.write("\xff" * 4) # User bits stream.write("\xff") # Interlace stream.write("\xff") # Field number stream.write("\xff") # Video signal standard stream.write("\0") # Zero for byte alignment stream.write("\xff" * 4) # H sampling rate Hz stream.write("\xff" * 4) # V sampling rate Hz # Temporal sampling or frame rate Hz if "frame_rate" in self.extrainfo: stream.write(struct.pack(">f", self.extrainfo["frame_rate"])) else: stream.write("\xff" * 4) stream.write("\xff" * 4) # Time offset in ms from sync to 1st pixel stream.write("\xff" * 4) # Gamma stream.write("\xff" * 4) # Black level code value stream.write("\xff" * 4) # Black gain stream.write("\xff" * 4) # Breakpoint stream.write("\xff" * 4) # Reference white level code value stream.write("\xff" * 4) # Integration time in s stream.write("\0" * 76) # Reserved # Padding so image data begins at 8K boundary stream.write("\0" * 6144) # Write image data stream.write(imgdata) def _write_png(self, stream, dimensions=None): # Header stream.write("\x89PNG\r\n\x1a\n") # IHDR image header length stream.write(struct.pack(">I", 13)) # IHDR image header chunk type ihdr = ["IHDR"] # Optimize for single color optimize = len(self.data) == 1 and len(self.data[0]) == 1 and dimensions # IHDR: width, height if optimize: w, h = dimensions else: w, h = len(self.data[0]), len(self.data) ihdr.extend([struct.pack(">I", w), struct.pack(">I", h)]) # IHDR: Bit depth ihdr.append(chr(self.bitdepth)) # IHDR: Color type 2 (truecolor) ihdr.append("\2") # IHDR: Compression method 0 (deflate) ihdr.append("\0") # IHDR: Filter method 0 (adaptive) ihdr.append("\0") # IHDR: Interlace method 0 (none) ihdr.append("\0") ihdr = "".join(ihdr) stream.write(ihdr) stream.write(struct.pack(">I", zlib.crc32(ihdr) & 0xFFFFFFFF)) # IDAT image data chunk type imgdata = [] for i, scanline in enumerate(self.data): # Add a scanline, filter type 0 imgdata.append("\0") for RGB in scanline: RGB = "".join(self._pack(v) for v in RGB) if optimize: RGB *= dimensions[0] imgdata.append(RGB) imgdata = "".join(imgdata) if optimize: imgdata *= dimensions[1] imgdata = zlib.compress(imgdata, 9) stream.write(struct.pack(">I", len(imgdata))) idat = ["IDAT"] idat.append(imgdata) idat = "".join(idat) stream.write(idat) stream.write(struct.pack(">I", zlib.crc32(idat) & 0xFFFFFFFF)) # IEND chunk stream.write("\0" * 4) stream.write("IEND") stream.write(struct.pack(">I", zlib.crc32("IEND") & 0xFFFFFFFF)) def _write_tiff(self, stream, dimensions=None): # Very helpful: http://www.fileformat.info/format/tiff/corion.htm # Header stream.write("MM\0*") # Note: We use big-endian byte order # Offset of image directory stream.write("\0\0\0\x08") # Image data imgdata = [] for i, scanline in enumerate(self.data): for RGB in scanline: imgdata.append("".join(self._pack(v) for v in RGB)) imgdata = "".join(imgdata) if len(self.data) == 1 and len(self.data[0]) == 1 and dimensions: # Optimize for single color imgdata *= dimensions[0] * dimensions[1] w, h = dimensions else: w, h = len(self.data[0]), len(self.data) # Image file directory (IFD) # Tag, type, length, offset or data, is data (otherwise offset) ifd = [(0x100, 3, 1, w, True), # ImageWidth (0x101, 3, 1, h, True), # ImageLength (0x106, 3, 1, 2, True), # PhotometricInterpretation (0x115, 3, 1, 3, True), # SamplesPerPixel (0x117, 4, 1, len(imgdata), True) # StripByteCounts ] # BitsPerSample ifd.append((0x102, 3, 3, 10 + (len(ifd) + 2) * 12 + 4, False)) # StripOffsets ifd.append((0x111, 3, 1, 10 + (len(ifd) + 1) * 12 + 4 + 6, True)) ifd.sort() # Must be ascending order! stream.write(struct.pack(">H", len(ifd))) # Number of entries for tag, tagtype, length, payload, is_data in ifd: stream.write(struct.pack(">H", tag)) stream.write(struct.pack(">H", tagtype)) stream.write(struct.pack(">I", length)) if is_data and tagtype == 3: # A word left-aligned in a dword stream.write(struct.pack(">H", payload)) stream.write("\0\0") else: stream.write(struct.pack(">I", payload)) # PlanarConfiguration default is 1 = RGBRGBRGB... # End of IFD stream.write("\0" * 4) # BitsPerSample (6 bytes) stream.write(struct.pack(">H", self.bitdepth) * 3) # Write image data stream.write(imgdata) def write(self, stream_or_filename, format=None, dimensions=None): if not format: if isinstance(stream_or_filename, basestring): format = os.path.splitext(stream_or_filename)[1].lstrip(".").upper() if format == "TIF": format += "F" else: format = "PNG" if not hasattr(self, "_write_" + format.lower()): raise ValueError("Unsupported format: %r" % format) if isinstance(stream_or_filename, basestring): stream = open(stream_or_filename, "wb") else: stream = stream_or_filename with stream: getattr(self, "_write_" + format.lower())(stream, dimensions) DisplayCAL-3.5.0.0/DisplayCAL/jsondict.py0000644000076500000000000000772012665102055017622 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import codecs import os import demjson from config import get_data_path from debughelpers import handle_error from util_str import safe_unicode class JSONDict(dict): """ JSON dictionary with key -> value mappings. The actual mappings are loaded from the source JSON file when they are accessed. """ def __init__(self, path=None, encoding="UTF-8", errors="strict"): dict.__init__(self) self._isloaded = False self.path = path self.encoding = encoding self.errors = errors def __cmp__(self, other): self.load() return dict.__cmp__(self, other) def __contains__(self, key): self.load() return dict.__contains__(self, key) def __delitem__(self, key): self.load() dict.__delitem__(self, key) def __delslice__(self, i, j): self.load() dict.__delslice__(self, i, j) def __eq__(self, other): self.load() return dict.__eq__(self, other) def __ge__(self, other): self.load() return dict.__ge__(self, other) def __getitem__(self, name): self.load() return dict.__getitem__(self, name) def __getslice__(self, i, j): self.load() return dict.__getslice__(self, i, j) def __gt__(self, other): self.load() return dict.__gt__(self, other) def __iter__(self): self.load() return dict.__iter__(self) def __le__(self, other): self.load() return dict.__le__(self, other) def __len__(self): self.load() return dict.__len__(self) def __lt__(self, other): self.load() return dict.__lt__(self, other) def __ne__(self, other): self.load() return dict.__ne__(self, other) def __repr__(self): self.load() return dict.__repr__(self) def __setitem__(self, name, value): self.load() dict.__setitem__(self, name, value) def __sizeof__(self): self.load() return dict.__sizeof__(self) def clear(self): if not self._isloaded: self._isloaded = True dict.clear(self) def copy(self): self.load() return dict.copy(self) def get(self, name, fallback=None): self.load() return dict.get(self, name, fallback) def has_key(self, name): self.load() return dict.has_key(self, name) def items(self): self.load() return dict.items(self) def iteritems(self): self.load() return dict.iteritems(self) def iterkeys(self): self.load() return dict.iterkeys(self) def itervalues(self): self.load() return dict.itervalues(self) def keys(self): self.load() return dict.keys(self) def load(self, path=None, encoding=None, errors=None): if not self._isloaded and (path or self.path): self._isloaded = True if not path: path = self.path if path and not os.path.isabs(path): path = get_data_path(path) if path and os.path.isfile(path): self.path = path if encoding: self.encoding = encoding if errors: self.errors = errors else: handle_error(UserWarning(u"Warning - JSON file '%s' not found" % safe_unicode(path))) return try: jsonfile = codecs.open(path, "rU", self.encoding, self.errors) try: dict.update(self, demjson.decode(jsonfile.read())) except (UnicodeDecodeError, demjson.JSONDecodeError), exception: handle_error(UserWarning( u"Warning - JSON file '%s': %s" % tuple(safe_unicode(s) for s in (path, safe_unicode(exception).capitalize() if isinstance(exception, demjson.JSONDecodeError) else exception)))) except Exception, exception: handle_error(UserWarning(u"Warning - JSON file '%s': %s" % tuple(safe_unicode(s) for s in (path, exception)))) else: jsonfile.close() def pop(self, key, *args): self.load() return dict.pop(self, key, *args) def popitem(self, name, value): self.load() return dict.popitem(self, name, value) def setdefault(self, name, value=None): self.load() return dict.setdefault(self, name, value) def update(self, other): self.load() dict.update(self, other) def values(self): self.load() return dict.values(self) DisplayCAL-3.5.0.0/DisplayCAL/jspacker.py0000644000076500000000000005426712665102054017616 0ustar devwheel00000000000000# -*- coding: utf-8 -*- ## ParseMaster, version 1.0 (pre-release) (2005/05/12) x6 ## Copyright 2005, Dean Edwards ## Web: http://dean.edwards.name/ ## ## This software is licensed under the CC-GNU LGPL ## Web: http://creativecommons.org/licenses/LGPL/2.1/ ## ## Ported to Python by Florian Schulze import os, re, sys # a multi-pattern parser class Pattern: def __init__(self, expression, replacement, length): self.expression = expression self.replacement = replacement self.length = length def __str__(self): return "(" + self.expression + ")" class Patterns(list): def __str__(self): return '|'.join([str(e) for e in self]) class ParseMaster: # constants EXPRESSION = 0 REPLACEMENT = 1 LENGTH = 2 GROUPS = re.compile(r"""\(""", re.M)#g SUB_REPLACE = re.compile(r"""\$\d""", re.M) INDEXED = re.compile(r"""^\$\d+$""", re.M) TRIM = re.compile(r"""(['"])\1\+(.*)\+\1\1$""", re.M) ESCAPE = re.compile(r"""\\.""", re.M)#g #QUOTE = re.compile(r"""'""", re.M) DELETED = re.compile("""\x01[^\x01]*\x01""", re.M)#g def __init__(self): # private self._patterns = Patterns() # patterns stored by index self._escaped = [] self.ignoreCase = False self.escapeChar = None def DELETE(self, match, offset): return "\x01" + match.group(offset) + "\x01" def _repl(self, a, o, r, i): while (i): m = a.group(o+i-1) if m is None: s = "" else: s = m r = r.replace("$" + str(i), s) i = i - 1 r = ParseMaster.TRIM.sub("$1", r) return r # public def add(self, expression="^$", replacement=None): if replacement is None: replacement = self.DELETE # count the number of sub-expressions # - add one because each pattern is itself a sub-expression length = len(ParseMaster.GROUPS.findall(self._internalEscape(str(expression)))) + 1 # does the pattern deal with sub-expressions? if (isinstance(replacement, str) and ParseMaster.SUB_REPLACE.match(replacement)): # a simple lookup? (e.g. "$2") if (ParseMaster.INDEXED.match(replacement)): # store the index (used for fast retrieval of matched strings) replacement = int(replacement[1:]) - 1 else: # a complicated lookup (e.g. "Hello $2 $1") # build a function to do the lookup i = length r = replacement replacement = lambda a,o: self._repl(a,o,r,i) # pass the modified arguments self._patterns.append(Pattern(expression, replacement, length)) # execute the global replacement def execute(self, string): if self.ignoreCase: r = re.compile(str(self._patterns), re.I | re.M) else: r = re.compile(str(self._patterns), re.M) string = self._escape(string, self.escapeChar) string = r.sub(self._replacement, string) string = self._unescape(string, self.escapeChar) string = ParseMaster.DELETED.sub("", string) return string # clear the patterns collections so that this object may be re-used def reset(self): self._patterns = Patterns() # this is the global replace function (it's quite complicated) def _replacement(self, match): i = 1 # loop through the patterns for pattern in self._patterns: if match.group(i) is not None: replacement = pattern.replacement if callable(replacement): return replacement(match, i) elif isinstance(replacement, (int, long)): return match.group(replacement+i) else: return replacement else: i = i+pattern.length # encode escaped characters def _escape(self, string, escapeChar=None): def repl(match): char = match.group(1) self._escaped.append(char) return escapeChar if escapeChar is None: return string r = re.compile("\\"+escapeChar+"(.)", re.M) result = r.sub(repl, string) return result # decode escaped characters def _unescape(self, string, escapeChar=None): def repl(match): try: #result = eval("'"+escapeChar + self._escaped.pop(0)+"'") result = escapeChar + self._escaped.pop(0) return result except IndexError: return escapeChar if escapeChar is None: return string r = re.compile("\\"+escapeChar, re.M) result = r.sub(repl, string) return result def _internalEscape(self, string): return ParseMaster.ESCAPE.sub("", string) ## packer, version 2.0 (2005/04/20) ## Copyright 2004-2005, Dean Edwards ## License: http://creativecommons.org/licenses/LGPL/2.1/ ## Ported to Python by Florian Schulze ## http://dean.edwards.name/packer/ class JavaScriptPacker: def __init__(self): pass def basicCompression(self, script): return self.getCompressionParseMaster(False, script) def specialCompression(self, script): return self.getCompressionParseMaster(True, script) def getCompressionParseMaster(self, specialChars, script): IGNORE = "$1" parser = ParseMaster() parser.escapeChar = '\\' # protect strings parser.add(r"""'[^'\n\r]*'""", IGNORE) parser.add(r'"[^"\n\r]*"', IGNORE) # remove comments parser.add(r"""//[^\n\r]*[\n\r]""") parser.add(r"""/\*[^*]*\*+([^/][^*]*\*+)*/""") # protect regular expressions parser.add(r"""\s+(\/[^\/\n\r\*][^\/\n\r]*\/g?i?)""", "$2") parser.add(r"""[^\w\$\/'"*)\?:]\/[^\/\n\r\*][^\/\n\r]*\/g?i?""", IGNORE) # remove: ;;; doSomething(); if specialChars: parser.add(""";;;[^\n\r]+[\n\r]""") # remove redundant semi-colons parser.add(r"""\(;;\)""", "$2") # protect for (;;) loops parser.add(r""";+\s*([};])""", "$2") # apply the above script = parser.execute(script) # remove white-space parser.add(r"""(\b|\$)\s+(\b|\$)""", "$2 $3") parser.add(r"""([+\-])\s+([+\-])""", "$2 $3") parser.add(r"""\s+""", "") return parser.execute(script) def getEncoder(self, ascii): mapping = {} base = ord('0') mapping.update(dict([(i, chr(i+base)) for i in range(10)])) base = ord('a') mapping.update(dict([(i+10, chr(i+base)) for i in range(26)])) base = ord('A') mapping.update(dict([(i+36, chr(i+base)) for i in range(26)])) base = 161 mapping.update(dict([(i+62, chr(i+base)) for i in range(95)])) # zero encoding # characters: 0123456789 def encode10(charCode): return str(charCode) # inherent base36 support # characters: 0123456789abcdefghijklmnopqrstuvwxyz def encode36(charCode): l = [] remainder = charCode while 1: result, remainder = divmod(remainder, 36) l.append(mapping[remainder]) if not result: break remainder = result l.reverse() return "".join(l) # hitch a ride on base36 and add the upper case alpha characters # characters: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ def encode62(charCode): l = [] remainder = charCode while 1: result, remainder = divmod(remainder, 62) l.append(mapping[remainder]) if not result: break remainder = result l.reverse() return "".join(l) # use high-ascii values def encode95(charCode): l = [] remainder = charCode while 1: result, remainder = divmod(remainder, 95) l.append(mapping[remainder+62]) if not result: break remainder = result l.reverse() return "".join(l) if ascii <= 10: return encode10 elif ascii <= 36: return encode36 elif ascii <= 62: return encode62 return encode95 def escape(self, script): script = script.replace("\\","\\\\") script = script.replace("'","\\'") script = script.replace('\n','\\n') #return re.sub(r"""([\\'](?!\n))""", "\\$1", script) return script def escape95(self, script): result = [] for x in script: if x>'\xa1': x = "\\x%0x" % ord(x) result.append(x) return "".join(result) def encodeKeywords(self, script, encoding, fastDecode): # escape high-ascii values already in the script (i.e. in strings) if (encoding > 62): script = self.escape95(script) # create the parser parser = ParseMaster() encode = self.getEncoder(encoding) # for high-ascii, don't encode single character low-ascii if encoding > 62: regexp = r"""\w\w+""" else: regexp = r"""\w+""" # build the word list keywords = self.analyze(script, regexp, encode) encoded = keywords['encoded'] # encode def repl(match, offset): return encoded.get(match.group(offset), "") parser.add(regexp, repl) # if encoded, wrap the script in a decoding function script = parser.execute(script) script = self.bootStrap(script, keywords, encoding, fastDecode) return script def analyze(self, script, regexp, encode): # analyse # retreive all words in the script regexp = re.compile(regexp, re.M) all = regexp.findall(script) sorted = [] # list of words sorted by frequency encoded = {} # dictionary of word->encoding protected = {} # instances of "protected" words if all: unsorted = [] _protected = {} values = {} count = {} all.reverse() for word in all: word = "$"+word if word not in count: count[word] = 0 j = len(unsorted) unsorted.append(word) # make a dictionary of all of the protected words in this script # these are words that might be mistaken for encoding values[j] = encode(j) _protected["$"+values[j]] = j count[word] = count[word] + 1 # prepare to sort the word list, first we must protect # words that are also used as codes. we assign them a code # equivalent to the word itself. # e.g. if "do" falls within our encoding range # then we store keywords["do"] = "do"; # this avoids problems when decoding sorted = [None] * len(unsorted) for word in unsorted: if word in _protected and isinstance(_protected[word], int): sorted[_protected[word]] = word[1:] protected[_protected[word]] = True count[word] = 0 unsorted.sort(lambda a,b: count[b]-count[a]) j = 0 for i in range(len(sorted)): if sorted[i] is None: sorted[i] = unsorted[j][1:] j = j + 1 encoded[sorted[i]] = values[i] return {'sorted': sorted, 'encoded': encoded, 'protected': protected} def encodePrivate(self, charCode): return "_"+str(charCode) def encodeSpecialChars(self, script): parser = ParseMaster() # replace: $name -> n, $$name -> $$na def repl(match, offset): #print offset, match.groups() length = len(match.group(offset + 2)) start = length - max(length - len(match.group(offset + 3)), 0) return match.group(offset + 1)[start:start+length] + match.group(offset + 4) parser.add(r"""((\$+)([a-zA-Z\$_]+))(\d*)""", repl) # replace: _name -> _0, double-underscore (__name) is ignored regexp = r"""\b_[A-Za-z\d]\w*""" # build the word list keywords = self.analyze(script, regexp, self.encodePrivate) # quick ref encoded = keywords['encoded'] def repl(match, offset): return encoded.get(match.group(offset), "") parser.add(regexp, repl) return parser.execute(script) # build the boot function used for loading and decoding def bootStrap(self, packed, keywords, encoding, fastDecode): ENCODE = re.compile(r"""\$encode\(\$count\)""") # $packed: the packed script #packed = self.escape(packed) #packed = [packed[x*10000:(x+1)*10000] for x in range((len(packed)/10000)+1)] #packed = "'" + "'+\n'".join(packed) + "'\n" packed = "'" + self.escape(packed) + "'" # $count: number of words contained in the script count = len(keywords['sorted']) # $ascii: base for encoding ascii = min(count, encoding) or 1 # $keywords: list of words contained in the script for i in keywords['protected']: keywords['sorted'][i] = "" # convert from a string to an array keywords = "'" + "|".join(keywords['sorted']) + "'.split('|')" encoding_functions = { 10: """ function($charCode) { return $charCode; }""", 36: """ function($charCode) { return $charCode.toString(36); }""", 62: """ function($charCode) { return ($charCode < _encoding ? "" : arguments.callee(parseInt($charCode / _encoding))) + (($charCode = $charCode % _encoding) > 35 ? String.fromCharCode($charCode + 29) : $charCode.toString(36)); }""", 95: """ function($charCode) { return ($charCode < _encoding ? "" : arguments.callee($charCode / _encoding)) + String.fromCharCode($charCode % _encoding + 161); }""" } # $encode: encoding function (used for decoding the script) encode = encoding_functions[encoding] encode = encode.replace('_encoding',"$ascii") encode = encode.replace('arguments.callee', "$encode") if ascii > 10: inline = "$count.toString($ascii)" else: inline = "$count" # $decode: code snippet to speed up decoding if fastDecode: # create the decoder decode = r"""// does the browser support String.replace where the // replacement value is a function? if (!''.replace(/^/, String)) { // decode all the values we need while ($count--) { $decode[$encode($count)] = $keywords[$count] || $encode($count); } // global replacement function $keywords = [function($encoded){return $decode[$encoded]}]; // generic match $encode = function(){return'\\w+'}; // reset the loop counter - we are now doing a global replace $count = 1; }""" if encoding > 62: decode = decode.replace('\\\\w', "[\\xa1-\\xff]") else: # perform the encoding inline for lower ascii values if ascii < 36: decode = ENCODE.sub(inline, decode) # special case: when $count==0 there ar no keywords. i want to keep # the basic shape of the unpacking funcion so i'll frig the code... if not count: raise NotImplemented #) $decode = $decode.replace(/(\$count)\s*=\s*1/, "$1=0"); # boot function unpack = r"""function($packed, $ascii, $count, $keywords, $encode, $decode) { while ($count--) { if ($keywords[$count]) { $packed = $packed.replace(new RegExp("\\b" + $encode($count) + "\\b", "g"), $keywords[$count]); } } return $packed; }""" if fastDecode: # insert the decoder #unpack = re.sub(r"""\{""", "{" + decode + ";", unpack) unpack = unpack.replace('{', "{" + decode + ";", 1) if encoding > 62: # high-ascii # get rid of the word-boundaries for regexp matches unpack = re.sub(r"""'\\\\b'\s*\+|\+\s*'\\\\b'""", "", unpack) if ascii > 36 or encoding > 62 or fastDecode: # insert the encode function #unpack = re.sub(r"""\{""", "{$encode=" + encode + ";", unpack) unpack = unpack.replace('{', "{$encode=" + encode + ";", 1) else: # perform the encoding inline unpack = ENCODE.sub(inline, unpack) # pack the boot function too unpack = self.pack(unpack, 0, False, True) # arguments params = [packed, str(ascii), str(count), keywords] if fastDecode: # insert placeholders for the decoder params.extend(['0', "{}"]) # the whole thing return "eval(" + unpack + "(" + ",".join(params) + "))\n"; def pack(self, script, encoding=0, fastDecode=False, specialChars=False, compaction=True): script = script+"\n" self._encoding = encoding self._fastDecode = fastDecode if specialChars: script = self.specialCompression(script) script = self.encodeSpecialChars(script) else: if compaction: script = self.basicCompression(script) if encoding: script = self.encodeKeywords(script, encoding, fastDecode) return script def run(): p = JavaScriptPacker() script = open(sys.argv[1]).read() result = p.pack(script, encoding=62, fastDecode=True, compaction=True) open(sys.argv[1] + 'pack', 'w').write(result) def run1(): test_scripts = [] test_scripts.append(("""// ----------------------------------------------------------------------- // public interface // ----------------------------------------------------------------------- cssQuery.toString = function() { return "function cssQuery() {\n [version " + version + "]\n}"; };""", 0, False, False, """cssQuery.toString=function(){return"function cssQuery() {\n [version "+version+"]\n}"};""")) test_scripts.append(("""function test(_localvar) { var $name = 'foo'; var $$dummy = 2; return $name + $$dummy; }""", 0, False, True, """function test(_0){var n='foo';var du=2;return n+du}""")) test_scripts.append(("""function _test($localvar) { var $name = 1; var _dummy = 2; var __foo = 3; return $name + _dummy + $localvar + __foo; }""", 0, False, True, """function _1(l){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}""")) test_scripts.append(("""function _test($localvar) { var $name = 1; var _dummy = 2; var __foo = 3; return $name + _dummy + $localvar + __foo; } function _bar(_ocalvar) { var $name = 1; var _dummy = 2; var __foo = 3; return $name + _dummy + $localvar + __foo; }""", 0, False, True, """function _3(l){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}function _2(_1){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}""")) test_scripts.append(("cssQuery1.js", 0, False, False, "cssQuery1-p1.js")) test_scripts.append(("cssQuery.js", 0, False, False, "cssQuery-p1.js")) test_scripts.append(("pack.js", 0, False, False, "pack-p1.js")) test_scripts.append(("cssQuery.js", 0, False, True, "cssQuery-p2.js")) # the following ones are different, because javascript might use an # unstable sort algorithm while python uses an stable sort algorithm test_scripts.append(("pack.js", 0, False, True, "pack-p2.js")) test_scripts.append(("test.js", 0, False, True, """function _4(l){var n=1;var _0=2;var __foo=3;return n+_0+l+__foo}function _3(_1){var n=1;var _2=2;var __foo=3;return n+_2+l+__foo}""")) test_scripts.append(("test.js", 10, False, False, """eval(function(p,a,c,k,e,d){while(c--){if(k[c]){p=p.replace(new RegExp("\\b"+e(c)+"\\b","g"),k[c])}}return p}('8 13($6){0 $4=1;0 7=2;0 5=3;9 $4+7+$6+5}8 11(12){0 $4=1;0 10=2;0 5=3;9 $4+10+$6+5}',10,14,'var||||name|__foo|localvar|_dummy|function|return|_2|_bar|_ocalvar|_test'.split('|'))) """)) test_scripts.append(("test.js", 62, False, False, """eval(function(p,a,c,k,e,d){while(c--){if(k[c]){p=p.replace(new RegExp("\\b"+e(c)+"\\b","g"),k[c])}}return p}('8 d($6){0 $4=1;0 7=2;0 5=3;9 $4+7+$6+5}8 b(c){0 $4=1;0 a=2;0 5=3;9 $4+a+$6+5}',14,14,'var||||name|__foo|localvar|_dummy|function|return|_2|_bar|_ocalvar|_test'.split('|'))) """)) test_scripts.append(("test.js", 95, False, False, "test-p4.js")) test_scripts.append(("cssQuery.js", 0, False, True, "cssQuery-p3.js")) test_scripts.append(("cssQuery.js", 62, False, True, "cssQuery-p4.js")) import difflib p = JavaScriptPacker() for script, encoding, fastDecode, specialChars, expected in test_scripts: if os.path.exists(script): _script = open(script).read() else: _script = script if os.path.exists(expected): _expected = open(expected).read() else: _expected = expected print script[:20], encoding, fastDecode, specialChars, expected[:20] print "="*40 result = p.pack(_script, encoding, fastDecode, specialChars) print len(result), len(_script) if (result != _expected): print "ERROR!!!!!!!!!!!!!!!!" print _expected print result #print list(difflib.unified_diff(result, _expected)) if __name__=='__main__': run() DisplayCAL-3.5.0.0/DisplayCAL/lang/0000755000076500000000000000000013242313606016344 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/lang/de.json0000644000076500000000000026312013242301041017621 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "Florian Höch", "!language": "Deutsch", "!language_name": "GERMAN", "3dlut": "3D LUT", "3dlut.1dlut.videolut.nonlinear": "Die Grafikkarten-Gammatabelle des Anzeigegeräts enthält nichtlineare Kalibrierungskurven, und die 3D LUT enthält angewendete Kalibrierungskurven. Bitte setzen Sie die Grafikkarten-Gammatabelle vor jeder Verwendung der 3D LUT in einen linearen Zustand zurück, oder erstellen Sie eine 3D LUT ohne angewendete Kaliebrierungskurven (in letzterem Fall aktivieren Sie „Erweiterte Optionen zeigen“ im „Optionen“-Menü und deaktivieren Sie „Kaliebrierung (vcgt) anwenden“ sowie „Nach Profilierung 3D LUT erstellen“, und erzeugen Sie eine neue 3D LUT).", "3dlut.bitdepth.input": "3D LUT Eingabe-Bittiefe", "3dlut.bitdepth.output": "3D LUT Ausgabe-Bittiefe", "3dlut.confirm_relcol_rendering_intent": "Möchten Sie den gemessenen Weißpunkt auch für die 3D LUT verwenden (3D LUT Farbübertragung wird auf relativ farbmetrisch gesetzt)?", "3dlut.content.colorspace": "Inhalts-Farbraum", "3dlut.create": "3D LUT erstellen...", "3dlut.create_after_profiling": "Nach Profilierung 3D LUT erstellen", "3dlut.enable": "3D LUT verwenden", "3dlut.encoding.input": "Eingabe-Kodierung", "3dlut.encoding.output": "Ausgabe-Kodierung", "3dlut.encoding.output.warning.madvr": "Warnung: Diese Ausgabe-Kodierung ist nicht empfohlen und wird „Clipping“ verursachen, falls madVR nicht ausgabeseitig auf „TV-Pegel (16-235)“ unter „Geräte“ → „%s“ → „Eigenschaften“ eingestellt ist. Benutzung auf eigene Gefahr!", "3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "3dlut.encoding.type_C": "TV Rec. 2020 konstante Luminanz YCbCr UHD", "3dlut.encoding.type_T": "TV RGB 16-235 (WTW abschneiden)", "3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "3dlut.encoding.type_n": "Voller Bereich RGB 0-255", "3dlut.encoding.type_t": "TV RGB 16-235", "3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (Rec. 709 Primärfarben) SD", "3dlut.format": "3D LUT Dateiformat", "3dlut.format.3dl": "Autodesk / Kodak (.3dl)", "*3dlut.format.ReShade": "ReShade (.png, .fx)", "3dlut.format.cube": "IRIDAS (.cube)", "3dlut.format.eeColor": "eeColor Processor (.txt)", "3dlut.format.icc": "Geräteverknüpfungs-Profil (.icc/.icm)", "3dlut.format.madVR": "madVR (.3dlut)", "3dlut.format.madVR.hdr": "HDR-Inhalte verarbeiten", "3dlut.format.madVR.hdr.confirm": "Bitte beachten: Das Anzeigegerät muss im HDR-Modus profiliert worden sein. Falls das Anzeigegerät HDR nicht nativ unterstützt, wählen Sie bitte „Abbrechen“.", "3dlut.format.madVR.hdr_to_sdr": "HDR-Inhalte zu SDR konvertieren", "3dlut.format.mga": "Pandora (.mga)", "*3dlut.format.png": "PNG (.png)", "3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "3dlut.frame.title": "3D LUT erstellen", "3dlut.hdr.rolloff.diffuse_white": "Diffuses Weiß (Referenz 94.38 cd/m²)", "*3dlut.hdr.system_gamma": "System gamma (reference 1.2)", "3dlut.holder.assign_preset": "3D LUT folgender Voreinstellung zuweisen:", "3dlut.holder.out_of_memory": "%s hat keinen ausreichenden 3D LUT Speicherplatz mehr (mindestens %i KB benötigt). Bitte löschen Sie einige 3D LUTs von %s, um Platz zu schaffen. Konsultieren Sie die Dokumentation Ihres %s, um weitere Informationen zu erhalten.", "3dlut.input.colorspace": "Quellfarbraum", "3dlut.input.profile": "Quellprofil", "3dlut.install": "3D LUT installieren", "3dlut.install.failure": "Installation der 3D LUT ist fehlgeschlagen (unbekannter Fehler).", "3dlut.install.success": "3D LUT erfolgreich installiert!", "3dlut.install.unsupported": "Das gewählte 3D LUT Format unterstützt keine Installation.", "3dlut.save_as": "3D LUT sichern unter...", "3dlut.settings": "3D LUT Einstellungen", "3dlut.size": "3D LUT Größe", "3dlut.tab.enable": "3D-LUT-Reiter aktivieren", "3dlut.use_abstract_profile": "Abstraktes (“Look”) Profil", "CMP_Digital_Target-3.cie": "CMP Digital Target 3", "CMP_Digital_Target-4.cie": "CMP Digital Target 4", "CMYK_IDEAlliance_ControlStrip_2009.ti1": "CMYK IDEAlliance Control Strip 2009", "CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": "CMYK IDEAlliance ISO 12647-7 Control Wedge 2013", "CMYK_ISO_12647-7_outer_gamut.ti1": "CMYK ISO 12647-7 äußerer Farbumfang", "ColorChecker.cie": "ColorChecker", "ColorCheckerDC.cie": "ColorChecker DC", "ColorCheckerPassport.cie": "ColorChecker Passport", "ColorCheckerSG.cie": "ColorChecker SG", "FograStrip2.ti1": "Fogra-Medienkeil CMYK V2.0", "FograStrip3.ti1": "Fogra-Medienkeil CMYK V3.0", "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008 Farbgenauigkeit und Graubalance", "ISO_14861_color_accuracy_RGB318.ti1": "ISO 14861:2015 Farbgenauigkeit und Graubalance", "QPcard_201.cie": "QPcard 201", "QPcard_202.cie": "QPcard 202", "SpyderChecker.cie": "SpyderCHECKR", "Untethered": "Nicht verbunden", "[rgb]TRC": "Farbtonwiedergabekurven", "aborted": "...abgebrochen.", "aborting": "Breche ab, bitte warten (dies kann einige Sekunden dauern)...", "abstract_profile": "Abstraktes Profil", "active_matrix_display": "Aktiv-Matrix Anzeigegerät", "adaptive_mode_unavailable": "Der adaptive Modus ist erst mit ArgyllCMS 1.1.0 RC3 oder neuer verfügbar.", "add": "Hinzufügen...", "advanced": "Erweitert", "allow_skip_sensor_cal": "Überspringen der Spektrometer-Kalibrierung erlauben", "ambient.measure": "Umgebungslicht messen", "ambient.measure.color.unsupported": "%s: Die Farbe des Umgebungslichts konnte mit diesem Messgerät nicht ermittelt werden, da es scheinbar nur einen monochromen Umgebungslichtsensor besitzt (es wurde nur ein Helligkeitswert zurückgegeben).", "ambient.measure.light_level.missing": "Es wurde kein Helligkeitswert zurückgegeben.", "ambient.set": "Möchten sie auch die Umgebungshelligkeit auf den gemessenen Wert setzen?", "app.client.connect": "Skript-Client %s:%s hat Verbindung hergestellt", "app.client.disconnect": "Skript-Client %s:%s hat Verbindung getrennt", "app.client.ignored": "Verbindungsversuch von Skript-Client %s:%s abgewiesen: %s", "app.client.network.disallowed": "Verbindungsversuch von Skript-Client %s:%s abgewiesen: Netzwerkclients sind nicht zugelassen.", "app.confirm_restore_defaults": "Wollen Sie wirklich Ihre Einstellungen verwerfen und die Standardeinstellungen wiederherstellen?", "app.detected": "%s erkannt.", "app.detected.calibration_loading_disabled": "%s erkannt. Kalibrierung laden deaktiviert.", "app.detection_lost": "%s nicht länger erkannt.", "app.detection_lost.calibration_loading_enabled": "%s nicht länger erkannt. Kalibrierung laden aktiviert.", "app.incoming_message": "Skript-Anfrage erhalten von %s:%s: %s", "app.incoming_message.invalid": "Skript-Anfrage ungültig!", "app.listening": "Starte Skript-Host unter %s:%s", "app.otherinstance": "%s läuft bereits.", "app.otherinstance.notified": "Bereits laufende Instanz wurde benachrichtigt.", "apply": "Anwenden", "apply_black_output_offset": "Schwarzausgabeoffset anwenden (100%)", "apply_cal": "Kalibrierung (vcgt) anwenden", "apply_cal.error": "Kalibrierung konnte nicht angewendet werden.", "archive.create": "Komprimierte Archivdatei erstellen...", "archive.import": "Archivdatei importieren...", "archive.include_3dluts": "Möchten Sie auch 3D-LUT-Dateien dem Archiv hinzufügen (nicht empfohlen, führt zu größerer Archivdatei)?", "argyll.debug.warning1": "Bitte benutzen Sie diese Option nur, wenn Sie Debugging-Informationen wirklich benötigen (z.B. zur tiefgreifenden Fehlersuche in ArgyllCMS)! In der Regel ist diese Option nur für Software-Entwickler zum Auffinden und Beheben von Problemen nützlich. Möchten Sie die Debugging-Ausgabe wirklich aktivieren?", "argyll.debug.warning2": "Bitte vergessen Sie nicht, die Debugging-Ausgabe für den normalen Betrieb der Software wieder zu deaktivieren.", "argyll.dir": "ArgyllCMS-Programmverzeichnis:", "argyll.dir.invalid": "ArgyllCMS-Programmdateien nicht gefunden!\nBitte legen Sie das Verzeichnis fest, in dem sich die ausführbaren Dateien mit den folgenden möglichen Namen und eventuellem „argyll-“-Präfix oder „-argyll“-Suffix befinden: %s", "argyll.error.detail": "Detaillierte ArgyllCMS-Fehlermeldung:", "argyll.instrument.configuration_files.install": "ArgyllCMS Messgeräte-Konfigurationsdateien installieren...", "argyll.instrument.configuration_files.install.success": "Installation der ArgyllCMS Messgeräte-Konfigurationsdateien abgeschlossen.", "argyll.instrument.configuration_files.uninstall": "ArgyllCMS Messgeräte-Konfigurationsdateien deinstallieren...", "argyll.instrument.configuration_files.uninstall.success": "Deinstallation der ArgyllCMS Messgeräte-Konfigurationsdateien abgeschlossen.", "argyll.instrument.driver.missing": "Eventuell ist der ArgyllCMS-Treiber für Ihr Messgarät nicht oder nicht korrekt installiert. Bitte überprüfen Sie, ob Ihr Messgerät im Geräte-Manager von Windows unter „Argyll LibUSB-1.0A devices“ angezeigt wird und installieren Sie ggf. den ArgyllCMS-Treiber. Folgen Sie dazu der Anleitung in der Dokumentation.", "argyll.instrument.drivers.install": "ArgyllCMS Messgeräte-Treiber installieren...", "argyll.instrument.drivers.install.confirm": "Sie müssen die ArgyllCMS-spezifischen Treiber nur dann installieren, wenn Ihr Messgerät kein ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval oder K-10 ist.\n\nMöchten Sie fortfahren?", "argyll.instrument.drivers.install.failure": "Installation der ArgyllCMS Messgeräte-Treiber fehlgeschlagen.", "argyll.instrument.drivers.install.restart": "Zur Installation der ArgyllCMS-Messgeräte-Treiber müssen Sie das Erzwingen der Treibersignatur deaktivieren. Dazu muss ein System-Neustart durchgeführt werden. Wählen Sie auf der Seite, die daraufhin erscheint, die Option „Problembehandlung“, dann „Erweiterte Optionen“, „Starteinstellungen“ und schließlich „Neu starten“. Beim Neustart wählen Sie in den Startoptionen „Erzwingen der Treibersignatur deaktivieren“. Nach dem Neustart wählen Sie den Menüpunkt „ArgyllCMS Messgeräte-Treiber installieren...“ erneut, um die Treiber zu installlieren. Falls die Option „Problembehandlung“ nicht angezeigt wird, befolgen Sie den in der DisplayCAL-Dokumentation im Abschnitt “Messgeräte-Installation unter Windows” beschriebenen alternativen Weg, die Treibersignatur-Prüfung zu deaktivieren.", "argyll.instrument.drivers.uninstall": "ArgyllCMS Messgeräte-Treiber deinstallieren...", "argyll.instrument.drivers.uninstall.confirm": "Hinweis: Die Deinstallation wirkt sich nicht auf gerade verwendete Messgeräte-Treiber aus, sondern entfernt den Treiber nur aus dem Windows-Treiberspeicher. Um zu einem installierten Hersteller-Treiber für Ihr Messgerät zurück zu wechseln, müssen Sie manuell im Geräte-Manager von Windows zu dem Hersteller-Treiber umschalten. Wählen Sie dazu per Rechtsklick auf Ihren Messgeräte-Eintrag den Menüpunkt „Treibersoftware aktualisieren...“, dann „Auf dem Computer nach Treibersoftware suchen“, „Aus einer Liste von Gerätetreibern auswählen“ und schliesslich den zu Ihrem Messgerät passenden Hersteller-Treiber aus der Liste.\n\nMöchten Sie fortfahren?", "argyll.instrument.drivers.uninstall.failure": "Deinstallation der ArgyllCMS Messgeräte-Treiber fehlgeschlagen.", "argyll.instrument.drivers.uninstall.success": "Deinstallation der ArgyllCMS Messgeräte-Treiber abgeschlossen.", "argyll.util.not_found": "ArgyllCMS „%s“ Hilfsprogramm nicht gefunden!", "as_measured": "Wie gemessen", "attributes": "Attribute", "audio.lib": "Audio-Modul: %s", "auth": "Authentifizierung", "auth.failed": "Authentifizierung fehlgeschlagen.", "auto": "Automatisch", "auto_optimized": "Automatisch optimiert", "autostart_remove_old": "Entferne alten Autostart-Eintrag", "backing_xyz": "Messunterlage XYZ", "backlight": "Hintergrundbeleuchtung", "bitdepth": "Bittiefe", "black": "Schwarz", "black_lab": "Schwarz L*a*b*", "black_point": "Schwarzpunkt", "black_point_compensation": "Tiefenkompensierung", "black_point_compensation.3dlut.warning": "Wenn Sie eine 3D LUT erstellen möchten, sollten Sie die Tiefenkompensierungs-Profileinstellung ausschalten, da sie die Funktion der Tonwertkurvenanpassung beeinflusst. Möchten Sie die Tiefenkompensierung jetzt ausschalten?", "black_point_compensation.info": "Tiefenkompensierung verhindert effektiv den Verlust von Tiefenzeichnung, wirkt sich aber negativ auf die Genauigkeit der Farbkonvertierung aus.", "black_white": "Schwarzweiss", "black_xyz": "Schwarz XYZ", "blacklevel": "Schwarzwert", "blue": "Blau", "blue_gamma": "Blau Gamma", "blue_lab": "Blau L*a*b*", "blue_matrix_column": "Blauer Matrix-Farbwert", "blue_maximum": "Blau Maximum", "blue_minimum": "Blau Minimum", "blue_tone_response_curve": "Blaue Farbtonwiedergabekurve", "blue_xyz": "Blau XYZ", "brightness": "Helligkeit", "browse": "Durchsuchen...", "bug_report": "Fehler melden...", "button.calibrate": "Nur Kalibrieren", "button.calibrate_and_profile": "Kalibrieren & profilieren", "button.profile": "Nur profilieren", "cal_extraction_failed": "Konnte die Kalibrierungsdaten nicht aus dem Profil extrahieren.", "calculated_checksum": "Errechnete Prüfsumme", "calibrate_instrument": "Spektrometer-Kalibrierung durchführen", "calibration": "Kalibrierung", "calibration.ambient_viewcond_adjust": "Umgebungshelligkeits-Anpassung", "calibration.ambient_viewcond_adjust.info": "Um eine Anpassung der Betrachtungsbedingungen während der Berechnung der Kalibrierungskurven durchzuführen, aktivieren Sie das Kontrollkästchen und tragen die Umgebungshelligkeit ein. Sie können die Umgebungshelligkeit auch messen, falls von Ihrem Messgerät unterstützt.", "calibration.black_luminance": "Schwarzluminanz", "calibration.black_output_offset": "Schwarzausgabeoffset", "calibration.black_point_correction": "Schwarztonkorrektur", "calibration.black_point_correction_choice": "Sie können die Schwarztonkorrektur ausschalten, um den Schwarzwert gering zu halten und den Kontrast zu verbessern (empfohlen für LCD), oder einschalten, um Schwarz auf den Farbton des gewählten Weißpunkts zu optimieren (empfohlen für CRT). Bitte wählen Sie Ihre bevorzugte Schwarztonkorrektur-Einstellung.", "calibration.black_point_rate": "Rate", "calibration.check_all": "Einstellungen überprüfen", "calibration.complete": "Kalibrierung abgeschlossen!", "calibration.create_fast_matrix_shaper": "Matrix-Profil erstellen", "calibration.create_fast_matrix_shaper_choice": "Möchten Sie aus den Messwerten der Kalibrierung ein einfaches Matrix-Profil erstellen oder nur kalibrieren?", "calibration.do_not_use_video_lut": "Zum Anwenden der Kalibrierung nicht die Grafikkarten-Gammatabelle verwenden", "calibration.do_not_use_video_lut.warning": "Wollen Sie die empfohlene Einstellung wirklich ändern?", "calibration.embed": "Kalibrierungskurven in Profil einbetten", "calibration.file": "Einstellungen", "calibration.file.invalid": "Die gewählte Einstellungsdatei ist ungültig.", "calibration.file.none": "", "calibration.incomplete": "Die Kalibrierung wurde nicht abgeschlossen.", "calibration.interactive_display_adjustment": "Interaktive Anzeigegeräte-Einstellung", "calibration.interactive_display_adjustment.black_level.crt": "Wählen Sie „Messung starten“ und benutzen Sie den Helligkeits- und/oder die RGB-Versatz-Regler Ihres Anzeigegerätes, um den gewünschten Schwarzpegel einzustellen.", "calibration.interactive_display_adjustment.black_point.crt": "Wählen Sie „Messung starten“ und benutzen Sie die RGB-Versatz-Regler Ihres Anzeigegerätes, um den gewünschten Schwarzpunkt einzustellen.", "calibration.interactive_display_adjustment.check_all": "Wählen Sie „Messung starten“, um alle Einstellungen zu überprüfen.", "calibration.interactive_display_adjustment.generic_hint.plural": "Eine gute Übereinstimmung ist erreicht, wenn die Balken in die markierte mittige Position gebracht werden können.", "calibration.interactive_display_adjustment.generic_hint.singular": "Eine gute Übereinstimmung ist erreicht, wenn der Balken in die markierte mittige Position gebracht werden kann.", "calibration.interactive_display_adjustment.start": "Messung starten", "calibration.interactive_display_adjustment.stop": "Messung stoppen", "calibration.interactive_display_adjustment.white_level.crt": "Wählen Sie „Messung starten“ und benutzen Sie den Kontrast- und/oder die RGB-Zuwachs-Regler Ihres Anzeigegerätes, um den gewünschten Weißpegel einzustellen.", "calibration.interactive_display_adjustment.white_level.lcd": "Wählen Sie „Messung starten“ und benutzen Sie den Hintegrundbeleuchtungs- bzw. Helligkeitsregler Ihres Anzeigegerätes, um den gewünschten Weißpegel einzustellen.", "calibration.interactive_display_adjustment.white_point": "Wählen Sie „Messung starten“ und benutzen Sie die Farbtemperatur- und/oder RGB-Zuwachs-Regler Ihres Anzeigegerätes, um den gewünschten Weißpunkt einzustellen.", "calibration.load": "Einstellungen laden...", "calibration.load.handled_by_os": "Kalibrierung wird vom Betriebssystem geladen.", "calibration.load_error": "Kalibrierungskurven konnten nicht geladen werden.", "calibration.load_from_cal": "Kalibrierungskurven aus Kalibrierungsdatei laden...", "calibration.load_from_cal_or_profile": "Kalibrierungskurven aus Kalibrierungsdatei oder Profil laden...", "calibration.load_from_display_profile": "Kalibrierungskurven von aktuellem Anzeigegeräteprofil laden", "calibration.load_from_display_profiles": "Kalibrierung von aktuellen Anzeigegeräteprofilen laden", "calibration.load_from_profile": "Kalibrierungskurven aus Profil laden...", "calibration.load_success": "Kalibrierungskurven geladen.", "calibration.loading": "Lade Kalibrierungskurven aus Datei...", "calibration.loading_from_display_profile": "Lade Kalibrierungskurven des aktuellen Anzeigegeräteprofils...", "calibration.luminance": "Weißluminanz", "calibration.lut_viewer.title": "Kurven", "calibration.preserve": "Kalibrierungszustand aufrechterhalten", "calibration.preview": "Kalibrierungsvorschau", "calibration.quality": "Kalibrierungsqualität", "calibration.quality.high": "Hoch", "calibration.quality.low": "Niedrig", "calibration.quality.medium": "Mittel", "calibration.quality.ultra": "Ultra", "calibration.quality.verylow": "Sehr niedrig", "calibration.reset": "Grafikkarten-Gammatabelle zurücksetzen", "calibration.reset_error": "Grafikkarten-Gammatabelle konnte nicht zurückgesetzt werden.", "calibration.reset_success": "Grafikkarten-Gammatabelle zurückgesetzt.", "calibration.resetting": "Setze Grafikkarten-Gammatabelle zurück...", "calibration.settings": "Kalibrierungseinstellungen", "calibration.show_actual_lut": "Kalibrierungskurven aus der Grafikkarte zeigen", "calibration.show_lut": "Kurven zeigen", "calibration.skip": "Weiter zur Profilierung", "calibration.speed": "Kalibrierungsgeschwindigkeit", "calibration.speed.high": "Hoch", "calibration.speed.low": "Niedrig", "calibration.speed.medium": "Mittel", "calibration.speed.veryhigh": "Sehr hoch", "calibration.speed.verylow": "Sehr niedrig", "calibration.start": "Weiter zur Kalibrierung", "calibration.turn_on_black_point_correction": "Einschalten", "calibration.update": "Kalibrierung aktualisieren", "calibration.update_profile_choice": "Möchten Sie auch die Kalibrierungskurven im bestehenden Profil aktualisieren oder nur kalibrieren?", "calibration.use_linear_instead": "Lineare Kalibrierung stattdessen verwenden", "calibration.verify": "Kalibrierung überprüfen", "calibration_profiling.complete": "Kalibrierung und Profilierung abgeschlossen!", "calibrationloader.description": "Setzt ICC-Profile und lädt Kalibrierungskurven für alle konfigurierten Anzeigegeräte", "can_be_used_independently": "Kann unabhängig verwendet werden", "cancel": "Abbrechen", "cathode_ray_tube_display": "Kathodenstrahlröhrenmonitor", "ccmx.use_four_color_matrix_method": "Minimiere xy-Farbortunterschiede", "ccxx.ti1": "Testform für Colorimeter-Korrektur", "centered": "Zentriert", "channel_1_c_xy": "Kanal 1 (C) xy", "channel_1_gamma_at_50_input": "Kanal 1 Gamma bei 50% Stimulus", "channel_1_is_linear": "Kanal 1 ist linear", "channel_1_maximum": "Kanal 1 Maximum", "channel_1_minimum": "Kanal 1 Minimum", "channel_1_r_xy": "Kanal 1 (R) xy", "channel_1_unique_values": "Kanal 1 eindeutige Tonwerte", "channel_2_g_xy": "Kanal 2 (G) xy", "channel_2_gamma_at_50_input": "Kanal 2 Gamma bei 50% Stimulus", "channel_2_is_linear": "Kanal 2 ist linear", "channel_2_m_xy": "Kanal 2 (M) xy", "channel_2_maximum": "Kanal 2 Maximum", "channel_2_minimum": "Kanal 2 Minimum", "channel_2_unique_values": "Kanal 2 eindeutige Tonwerte", "channel_3_b_xy": "Kanal 3 (B) xy", "channel_3_gamma_at_50_input": "Kanal 3 Gamma bei 50% Stimulus", "channel_3_is_linear": "Kanal 3 ist linear", "channel_3_maximum": "Kanal 3 Maximum", "channel_3_minimum": "Kanal 3 Minimum", "channel_3_unique_values": "Kanal 3 eindeutige Tonwerte", "channel_3_y_xy": "Kanal 3 (Y) xy", "channel_4_k_xy": "Kanal 4 (K) xy", "channels": "Kanäle", "characterization_device_values": "Gerätefarbwerte", "characterization_measurement_values": "Farbmesswerte", "characterization_target": "Charakterisierungsdaten", "checking_lut_access": "Überprüfe Grafikkarten-Gammatabellen-Zugriff auf Anzeigegerät %s...", "checksum": "Prüfsumme", "checksum_ok": "Prüfsumme OK", "chromatic_adaptation_matrix": "Matrix zur chromatischen Anpassung", "chromatic_adaptation_transform": "Methode zur chromatischen Anpassung", "chromaticity_illuminant_relative": "Chromatizität (Leuchtmittel-Bezug)", "chromecast_limitations_warning": "Bitte beachten Sie, dass die Genauigkeit über Chromecast nicht so gut ist wie über eine direkte Verbindung zum Anzeigegerät oder madTPG, da Chromecast RGB in YCbCr konvertiert und hochskaliert.", "clear": "Löschen", "close": "Schließen", "color": "Farbe", "color_look_up_table": "Farbwerte-Tabelle", "color_model": "Farbmodell", "color_space_conversion_profile": "Farbraum-Konvertierungsprofil", "colorant_order": "Farbmittel-Druckreihenfolge", "colorants_pcs_relative": "Farbmittel (PCS-Bezug)", "colorimeter_correction.create": "Colorimeter-Korrektur erstellen...", "colorimeter_correction.create.details": "Bitte überprüfen Sie die angezeigten Informationen und ändern diese wenn nötig. Die Beschreibung sollte auch wichtige Zusatzinformationen enthalten (z.B. spezielle Anzeigegeräte-Einstellungen, Abweichung vom CIE-Normbeobachter o.ä.).", "colorimeter_correction.create.failure": "Erstellen der Korrektur fehlgeschlagen.", "colorimeter_correction.create.info": "Um eine Colorimeter-Korrektur zu erstellen, müssen Sie zuerst einige Farbfelder mit einem Spektrometer messen, und falls Sie eine Korrekturmatrix statt einer Spektralkorrektur erstellen möchten, auch mit dem zu korrigierenden Colorimeter.\nAlternativ können Sie per Auswahl von „Durchsuchen...“ auch bereits erzeugte Messwerte verwenden.", "colorimeter_correction.create.success": "Korrektur erfolgreich erstellt.", "colorimeter_correction.file.none": "Keine", "colorimeter_correction.import": "Colorimeter-Korrekturen von anderer Anzeigegeräteprofilierungs-Software importieren...", "colorimeter_correction.import.choose": "Bitte wählen Sie eine Datei mit Colorimeter-Korrekturen aus.", "colorimeter_correction.import.failure": "Es konnte keine Colorimeter-Korrektur importiert werden.", "colorimeter_correction.import.partial_warning": "Nicht alle Colorimeter-Korrekturen konnten von %s importiert werden. %i von %i Einträge mussten übersprungen werden.", "colorimeter_correction.import.success": "Colorimeter-Korrekturen und/oder Messmodi wurden erfolgreich von folgenden Softwares importiert:\n\n%s", "colorimeter_correction.instrument_mismatch": "Die gewählte Colorimeter-Korrektur ist nicht für das gewählte Messgerät geeignet.", "colorimeter_correction.upload": "Colorimeter-Korrektur hochladen...", "colorimeter_correction.upload.confirm": "Möchten Sie die Colorimeter-Korrekturdatei in die Online-Datenbank hochladen (empfohlen)? Hochgeladene Dateien werden als lizenzfrei („Public Domain“) behandelt, damit sie uneingeschränkt genutzt werden können.", "colorimeter_correction.upload.deny": "Diese Korrekturdatei darf nicht hochgeladen werden.", "colorimeter_correction.upload.exists": "Die Colorimeter-Korrekturdatei existiert bereits in der Datenbank.", "colorimeter_correction.upload.failure": "Die Korrekturdatei konnte nicht in die Online-Datenbank eingetragen werden.", "colorimeter_correction.upload.success": "Die Korrekturdatei wurde in die Online-Datenbank eingetragen.", "colorimeter_correction.web_check": "Online nach Colorimeter-Korrektur suchen...", "colorimeter_correction.web_check.choose": "Für das gewählte Anzeige- und Messgerät wurden folgende Colorimeter-Korrekturen gefunden:", "colorimeter_correction.web_check.failure": "Für das gewählte Anzeige- und Messgerät wurden keine Colorimeter-Korrekturen gefunden.", "colorimeter_correction.web_check.info": "Bitte beachten Sie, dass alle Colorimeter-Korrekturen von Nutzern bereitgestellt wurden. Die Brauchbarkeit der Korrekturen für Ihre Situation zu beurteilen, liegt in Ihrer eigenen Verantwortung. Diese Korrekturen können die absolute Genauigkeit Ihres Colorimeters mit Ihrem Anzeigegerät verbessern oder auch nicht.", "colorimeter_correction_matrix_file": "Korrektur", "colorimeter_correction_matrix_file.choose": "Colorimeter-Korrektur auswählen...", "colorimetric_intent_image_state": "Farbmetrischer Abbildungs-Zustand", "colors_pcs_relative": "Farben (PCS-Bezug)", "colorspace": "Farbraum", "colorspace.show_outline": "Umriss zeigen", "commandline": "Befehlszeile:", "commands": "Befehle", "comparison_profile": "Vergleichsprofil", "comport_detected": "Eine Änderung in der Messgeräte-/Port-Konfiguration wurde erkannt.", "compression.gzip": "GZIP-Komprimierung", "computer.name": "Computername", "connected.to.at": "Verbunden mit %s unter %s:%s", "connecting.to": "Verbinde mit %s:%s...", "connection.broken": "Verbindung abgebrochen", "connection.established": "Verbindung hergestellt", "connection.fail": "Verbindungs-Fehler (%s)", "connection.fail.http": "HTTP-Fehler %s", "connection.waiting": "Warte auf Verbindung unter", "continue": "Fortfahren", "contrast": "Kontrast", "contribute": "Einen Beitrag leisten", "converting": "Konvertiere", "copyright": "Urheberrecht", "corrected": "korrigiert", "create_profile": "Profil aus Messwertdatei erstellen...", "create_profile_from_edid": "Profil aus EDID erstellen...", "created": "Erstellt", "creator": "Ersteller", "current": "Aktuell", "custom": "Benutzerdefiniert", "cyan": "Cyan", "d3-e4-s2-g28-m0-b0-f0.ti1": "Kleine Testform für Matrix-Profile", "d3-e4-s3-g52-m3-b0-f0.ti1": "Standard-Testform", "d3-e4-s4-g52-m4-b0-f0.ti1": "Kleine Testform für LUT-Profile", "d3-e4-s5-g52-m5-b0-f0.ti1": "Erweiterte Testform für LUT-Profile", "d3-e4-s9-g52-m9-b0-f0.ti1": "Große Testform für LUT-Profile", "d3-e4-s17-g52-m17-b0-f0.ti1": "Sehr große Testform für LUT-Profile", "deactivated": "deaktiviert", "default": "Standard", "default.icc": "Standard (Gamma 2.2)", "default_crt": "Standard-CRT", "default_rendering_intent": "Standard-Farbübertragung", "delete": "Löschen", "delta_e_2000_to_blackbody_locus": "ΔE 2000 zu Schwarzkörper-Farbort", "delta_e_2000_to_daylight_locus": "ΔE 2000 zu Tageslicht-Farbort", "delta_e_to_locus": "ΔE*00 zu %s-Farbort", "description": "Beschreibung", "description_ascii": "Beschreibung (ASCII)", "description_macintosh": "Beschreibung (Macintosh)", "description_unicode": "Beschreibung (Unicode)", "deselect_all": "Alles abwählen", "detect_displays_and_ports": "Anzeigegeräte- und Messgeräte-Erkennung", "device": "Gerät", "device.name.placeholder": "", "device_color_components": "Gerätefarbwerte-Komponenten", "device_manager.launch": "Geräte-Manager starten", "device_manufacturer_name": "Gerätehersteller", "device_manufacturer_name_ascii": "Gerätehersteller (ASCII)", "device_manufacturer_name_macintosh": "Gerätehersteller (Macintosh)", "device_manufacturer_name_unicode": "Gerätehersteller (Unicode)", "device_model_name": "Gerätemodell", "device_model_name_ascii": "Gerätemodell (ASCII)", "device_model_name_macintosh": "Gerätemodell (Macintosh)", "device_model_name_unicode": "Gerätemodell (Unicode)", "device_to_pcs_intent_0": "Gerät zu PCS: Anpassungsart 0", "device_to_pcs_intent_1": "Gerät zu PCS: Anpassungsart 1", "device_to_pcs_intent_2": "Gerät zu PCS: Anpassungsart 2", "devicelink_profile": "Geräteverknüpfungs-Profil", "dialog.argyll.notfound.choice": "ArgyllCMS, das Farbmanagement-System, das benötigt wird, um DisplayCAL zu verwenden, scheint nicht auf diesem Computer installiert zu sein. Möchten Sie es automatisch herunterladen oder selbst danach suchen?", "dialog.cal_info": "Die Kalibrierungsdatei “%s” wird verwendet. Wollen Sie fortfahren?", "dialog.confirm_cancel": "Möchten Sie wirklich abbrechen?", "dialog.confirm_delete": "Möchten Sie die gewählte(n) Datei(en) wirklich löschen?", "dialog.confirm_overwrite": "Die Datei “%s” existiert bereits. Möchten Sie die Datei überschreiben?", "dialog.confirm_uninstall": "Möchten Sie die gewählte(n) Datei(en) wirklich deinstallieren?", "dialog.current_cal_warning": "Die gerade geladenen Kalibrierungskurven werden verwendet. Wollen Sie fortfahren?", "dialog.do_not_show_again": "Diese Meldung nicht erneut anzeigen", "dialog.enter_password": "Bitte geben Sie Ihr Kennwort ein.", "dialog.install_profile": "Möchten Sie das Profil „%s“ installieren und als Standard für Anzeigegerät „%s“ setzen?", "dialog.linear_cal_info": "Lineare Kalibrierungskurven werden verwendet. Wollen Sie fortfahren?", "dialog.load_cal": "Einstellungen laden", "dialog.select_argyll_version": "Version %s von ArgyllCMS wurde gefunden. Die zur Zeit ausgewählte Version ist %s. Möchten Sie die neuere Version verwenden?", "dialog.set_argyll_bin": "Bitte wählen Sie das ArgyllCMS-Programmverzeichnis aus.", "dialog.set_profile_save_path": "Profilordner „%s“ erzeugen in:", "dialog.set_testchart": "Testform auswählen", "dialog.ti3_no_cal_info": "Die Messwerte enthalten keine Kalibrierungskurven. Wollen Sie wirklich fortfahren?", "digital_camera": "Digitale Kamera", "digital_cinema_projector": "Digitaler Kino-Projector", "digital_motion_picture_camera": "Digitale Kinofilm-Kamera", "direction.backward": "PCS → B2A → Gerät", "direction.backward.inverted": "PCS ← B2A ← Gerät", "direction.forward": "Gerät → A2B → PCS", "direction.forward.inverted": "Gerät ← A2B ← PCS", "directory": "Verzeichnis", "disconnected.from": "Verbindung mit %s:%s getrennt", "display": "Anzeigegerät", "display-instrument": "Anzeige- & Messgerät", "display.connection.type": "Anschlusstyp", "display.manufacturer": "Anzeigegerätehersteller", "display.output": "Ausgang #", "display.primary": "(Primär)", "display.properties": "Anzeigegeräteeingenschaften", "display.reset.info": "Bitte setzen Sie das Anzeigegerät auf die Werkseinstellungen zurück und stellen danach die Helligkeit auf einen angenehmen Wert ein.", "display.settings": "Anzeigegeräteeinstellungen", "display.tech": "Anzeigegerätetechnologie", "display_detected": "Eine Änderung in der Anzeigegerätekonfiguration wurde erkannt.", "display_device_profile": "Anzeigegeräteprofil", "display_lut.link": "Anzeigegerät und Grafikkarten-Gammatabellen-Zugriff getrennt oder gemeinsam ändern", "display_peak_luminance": "Anzeigegeräte-Spitzen-Weißluminanz", "display_profile.not_detected": "Es wurde kein aktuelles Profil für das Anzeigegerät „%s“ erkannt.", "display_short": "Anzeigegerät (Kurzname)", "displayport": "DisplayPort", "displays.identify": "Anzeigegeräte identifizieren", "dlp_screen": "DLP-Bildschirm", "donation_header": "Ihre Unterstützung ist willkommen!", "donation_message": "Bitte erwägen Sie einen finanziellen Beitrag, falls Sie die Entwicklung von, technische Hilfestellung für, und weitere Verfügbarkeit von DisplayCAL und ArgyllCMS unterstützen möchten. Da DisplayCAL ohne ArgyllCMS nicht nutzbar ist, werden alle erhaltenen finanziellen Beiträge auf beide Projekte aufgeteilt.\nFür nicht-kommerzielle, unregelmäßige private Verwendung ist ein einmaliger Beitrag angmessen. Falls Sie DisplayCAL professionell/kommerziell einsetzen, würde ein jährlicher oder monatlicher Beitrag die weitere Verfügbarkeit beider Projekte sehr unterstützen.\n\nDanke an alle Unterstützer!", "download": "Herunterladen", "download.fail": "Download fehlgeschlagen:", "download.fail.empty_response": "Download fehlgeschlagen: %s gab ein leeres Dokument zurück.", "download.fail.wrong_size": "Download fehlgeschlagen: Die Datei hat nicht die erwartete Größe von %s Bytes (%s Bytes erhalten).", "download_install": "Herunterladen & installieren", "downloading": "Wird heruntergeladen", "drift_compensation.blacklevel": "Schwarzabgleich-Drift-Kompensierung", "drift_compensation.blacklevel.info": "Schwarzabgleich-Drift-Kompensierung versucht, Messwertabweichungen verursacht durch ein sich erwärmendes Messgerät auszugleichen. Dazu wird in gewissen Zeitabständen ein schwarzes Farbfeld gemessen, was die Messzeit insgesamt verlängert. Viele Colorimeter haben eine eingebaute Temperaturkompensierung, was eine Schwarzabgleich-Drift-Kompensierung überflüssig macht, allerdings fehlt diese bei den meisten Spektrometern.", "drift_compensation.whitelevel": "Weißluminanz-Drift-Kompensierung", "drift_compensation.whitelevel.info": "Weißluminanz-Drift-Kompensierung versucht, Messwertabweichungen verursacht durch Helligkeitsänderungen eines sich erwärmenden Anzeigegerätes ausgleichen. Dazu wird in gewissen Zeitabständen ein weißes Farbfeld gemessen, was die Messzeit insgesamt verlängert.", "dry_run": "Trockenlauf", "dry_run.end": "Trockenlauf beendet.", "dry_run.info": "Trockenlauf. Schauen Sie im Protokoll nach, um die Befehlszeile zu sehen.", "dvi": "DVI", "dye_sublimation_printer": "Sublimationsdrucker", "edid.crc32": "EDID-CRC32-Prüfsumme", "edid.serial": "EDID-Seriennummer", "elapsed_time": "Verstrichene Zeit", "electrophotographic_printer": "Elektrophotographischer Drucker", "electrostatic_printer": "Elektrostatischer Drucker", "enable_argyll_debug": "ArgyllCMS Debugging-Ausgabe aktivieren", "enable_spyder2": "Spyder 2 Colorimeter freischalten...", "enable_spyder2_failure": "Spyder 2 konnte nicht freigeschaltet werden. Bitte installieren Sie die Spyder 2 Software manuell (falls noch nicht geschehen) und führen dann diese Funktion erneut aus.", "enable_spyder2_success": "Spyder 2 wurde erfolgreich freigeschaltet.", "entries": "Einträge", "enumerate_ports.auto": "Automatische Messgeräte-Erkennung", "enumerating_displays_and_comports": "Anzeigegeräte- und Messgeräte-Erkennung...", "environment": "Umgebung", "error": "Fehler", "error.access_denied.write": "Sie haben keinen Schreibzugriff auf %s", "error.already_exists": "Der Name „%s“ kann nicht verwendet werden, da bereits ein anderes Objekt mit diesem Namen existiert. Bitte wählen Sie einen anderen Namen oder ein anderes Verzeichnis.", "error.autostart_creation": "Der Autostart-Eintrag für %s, um die Kalibrierungskurven bei der Anmeldung zu laden, konnte nicht angelegt werden.", "error.autostart_remove_old": "Der alte Autostart-Eintrag, welcher Kalibrierungskurven bei der Anmeldung lädt, konnte nicht entfernt werden: %s", "error.autostart_system": "Der systemweite Autostart-Eintrag, um die Kalibrierungskurven bei der Anmeldung zu laden, konnte nicht angelegt werden, weil das systemweite Autostart-Verzeichnis nicht ermittelt werden konnte.", "error.autostart_user": "Der benutzerspezifische Autostart-Eintrag, um die Kalibrierungskurven bei der Anmeldung zu laden, konnte nicht angelegt werden, weil das benutzerspezifische Autostart-Verzeichnis nicht ermittelt werden konnte.", "error.cal_extraction": "Die Kalibrierung konnte nicht aus dem Profil “%s” extrahiert werden.", "error.calibration.file_missing": "Die Kalibrierungsdatei „%s“ fehlt.", "error.calibration.file_not_created": "Es wurde keine Kalibrierungsdatei erstellt.", "error.copy_failed": "Die Datei „%s“ konnte nicht nach „%s“ kopiert werden.", "error.deletion": "Beim Bewegen von Dateien in den %s ist ein Fehler aufgetreten. Einige Dateien wurden eventuell nicht entfernt.", "error.dir_creation": "Das Verzeichnis „%s“ konnte nicht erstellt werden. Eventuell bestehen keine Zugriffsrechte. Bitte erlauben Sie den Schreibzugriff oder wählen Sie ein anderes Verzeichnis.", "error.dir_notdir": "Das Verzeichnis „%s“ konnte nicht erstellt werden, da bereits ein anderes Objekt mit diesem Namen existiert. Bitte wählen Sie ein anderes Verzeichnis.", "error.file.create": "Die Datei „%s“ konnte nicht erstellt werden.", "error.file.open": "Die Datei „%s“ konnte nicht geöffnet werden.", "error.file_type_unsupported": "Nicht unterstützter Dateityp.", "error.generic": "Es ist ein interner Fehler aufgetreten.\n\nFehlernummer: %s\nFehlermeldung: %s", "error.luminance.invalid": "Die gemessene Spitzen-Helligkeit war ungültig. Stellen Sie sicher, dass der Messgeräte-Sensor nicht blockiert ist, und nehmen Sie eine eventuell vorhandene Schutzkappe ab.", "error.measurement.file_invalid": "Die Messwertedatei „%s“ ist ungültig.", "error.measurement.file_missing": "Die Messwertedatei „%s“ fehlt.", "error.measurement.file_not_created": "Es wurde keine Messwertedatei erstellt.", "error.measurement.missing_spectral": "Die Messwertdatei enthält keine Spektralwerte.", "error.measurement.one_colorimeter": "Es wird genau eine Colorimeter-Messwertdatei benötigt.", "error.measurement.one_reference": "Es wird genau eine Referenzmesswertdatei benötigt.", "error.no_files_extracted_from_archive": "Es wurden keine Dateien von „%s“ extrahiert.", "error.not_a_session_archive": "Die Archivdatei „%s“ scheint kein gültiges Sitzungsarchiv zu sein.", "error.profile.file_missing": "Die Profildatei „%s“ fehlt.", "error.profile.file_not_created": "Es wurde keine Profildatei erstellt.", "error.source_dest_same": "Quell- und Zielprofil sind identisch.", "error.testchart.creation_failed": "Die Testform „%s“ konnte nicht erstellt werden. Eventuell bestehen keine Zugriffsrechte, oder die Quelldatei ist nicht vorhanden.", "error.testchart.invalid": "Die Testform „%s“ ist ungültig.", "error.testchart.missing": "Die Testform „%s“ existiert nicht.", "error.testchart.missing_fields": "Der Testform „%s“ fehlen folgende Felder: %s", "error.testchart.read": "Die Testform „%s“ konnte nicht gelesen werden.", "error.tmp_creation": "Konnte das temporäre Arbeitsverzeichnis nicht erstellen.", "error.trashcan_unavailable": "Der %s ist nicht verfügbar. Es wurden keine Dateien entfernt.", "errors.none_found": "Keine Fehler gefunden.", "estimated_measurement_time": "Geschätzte Messzeit ungefähr %s Stunde(n) %s Minuten", "exceptions": "Ausnahmen...", "executable": "Ausführbare Datei", "export": "Exportieren...", "extra_args": "Zusätzliche Befehlszeilen-Parameter setzen...", "factory_default": "Werksstandard", "failure": "...fehlgeschlagen!", "file.hash.malformed": "Die Integrität von %s kann nicht überprüft werden, da die Prüfsummen-Datei fehlerhaft formatiert ist.", "file.hash.missing": "Die Integrität von %s kann nicht überprüft werden, da kein entsprechender Eintrag in der Prüfsummen-Datei gefunden wurde.", "file.hash.verification.fail": "Die Prüfsumme von %s weicht ab:\n\nErwartet %s\nTatsächlich %s", "file.invalid": "Datei ungültig.", "file.missing": "Die Datei „%s“ existiert nicht.", "file.notfile": "„%s“ ist keine Datei.", "file.select": "Datei auswählen", "filename": "Dateiname", "filename.upload": "Upload-Dateiname", "filetype.7z": "7-Zip-Dateien", "filetype.any": "Alle Dateitypen", "filetype.cal": "Kalibrierungsdateien (*.cal)", "filetype.cal_icc": "Kalibrierungsdateien und Profile (*.cal;*.icc;*.icm)", "filetype.ccmx": "Korrekturmatrizen/Spektralkalibrierungen (*.ccmx;*.ccss)", "filetype.html": "HTML-Dateien (*.html;*.htm)", "filetype.icc": "Profile (*.icc;*.icm)", "filetype.icc_mpp": "Profile (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "Testformdateien (*.icc;*.icm;*.ti1;*.ti3)", "filetype.icc_ti3": "Messwertdateien (*.icc;*.icm;*.ti3)", "filetype.log": "Protokolldateien (*.log)", "filetype.png": "Portable Network Graphics (*.png)", "filetype.tgz": "Komprimiertes TAR-Archiv", "filetype.ti1": "Testformdateien (*.ti1)", "filetype.ti1_ti3_txt": "Testformdateien (*.ti1), Messwertdateien (*.ti3;*.txt)", "filetype.ti3": "Messwertdateien (*.ti3)", "filetype.tif": "Tagged Image File (*.tif)", "filetype.txt": "DeviceCorrections.txt", "filetype.vrml": "VRML-Dateien (*.wrl)", "filetype.x3d": "X3D-Dateien (*.x3d)", "filetype.zip": "ZIP-Dateien", "film_scanner": "Filmscanner", "film_writer": "Filmbelichter", "finish": "Fertigstellen", "flare": "Streulicht", "flexography": "Flexodruck", "focal_plane_colorimetry_estimates": "Fokusebene-Farbmetrik-Anhaltswerte", "forced": "forciert", "format.select": "Bitte wählen Sie das gewünschte Format.", "fullscreen.message": "Vollbildmodus aktiviert.\nDrücken Sie die ESC-Taste, um den Vollbildmodus zu verlassen.", "fullscreen.osx.warning": "Falls Sie das Fenster über die Zoom-Taste in der Titelleiste in den Vollbildmodus schalten, drücken Sie bitte CMD + TAB, um in den Normalmodus zurückzukehren, nachdem das Fenster geschlossen wurde. Alternativ betreten Sie den Vollbildmodus, indem Sie die Titelleiste doppelklicken oder die Wahltaste halten, während Sie die Zoom-Taste klicken.", "gamap.default_intent": "Standard-Farbübertragung", "gamap.intents.a": "Absolut farbmetrisch", "gamap.intents.aa": "Absolutes Erscheinungsbild", "gamap.intents.aw": "Absolut farbmetrisch mit Weißpunkt-Skalierung", "gamap.intents.la": "Luminanz angleichen", "gamap.intents.lp": "Luminanz erhaltendes Wahrnehmungs-Erscheinungsbild", "gamap.intents.ms": "Sättigung erhalten", "gamap.intents.p": "Wahrnehmung", "gamap.intents.pa": "Wahrnehmungs-Erscheinungsbild", "gamap.intents.r": "Relativ farbmetrisch", "gamap.intents.s": "Sättigung", "gamap.out_viewcond": "Betrachtungsbedingungen (Ziel)", "gamap.perceptual": "Gamut-Mapping für Wahrnehmungs-Farbübertragung", "gamap.profile": "Quellprofil", "gamap.saturation": "Gamut-Mapping für Sättigungs-Farbübertragung", "gamap.src_viewcond": "Betrachtungsbedingungen (Quelle)", "gamap.viewconds.cx": "Dias auf Leuchtkasten", "gamap.viewconds.jd": "Projektor in lichtloser Umgebung", "gamap.viewconds.jm": "Projektor in abgedunkelter Umgebung", "gamap.viewconds.mb": "Monitor in heller Arbeitsumgebung", "gamap.viewconds.md": "Monitor in abgedunkelter Arbeitsumgebung", "gamap.viewconds.mt": "Monitor in typischer Arbeitsumgebung", "gamap.viewconds.ob": "Außenaufnahme in hellem Licht", "gamap.viewconds.pc": "Druck unter Normlicht (kritische Abmusterung nach ISO-3664 P1)", "gamap.viewconds.pcd": "Photo CD - Außenaufnahme", "gamap.viewconds.pe": "Druck unter Normlicht (Abmusterung nach CIE 116-1995)", "gamap.viewconds.pp": "Druck (ISO-3664 P2)", "gamap.viewconds.tv": "TV/Filmstudio", "gamapframe.title": "Erweiterte Gamut-Mapping-Einstellungen", "gamut": "Farbumfang", "gamut.coverage": "Farbraumabdeckung", "gamut.view.create": "Generiere Gamut-Ansichten...", "gamut.volume": "Farbraumvolumen", "gamut_mapping.ciecam02": "CIECAM02 Gamut-Mapping", "gamut_mapping.mode": "Gamut-Mapping Modus", "gamut_mapping.mode.b2a": "Bezugsfarbraum-zu-Gerätefarbraum", "gamut_mapping.mode.inverse_a2b": "Invers Gerätefarbraum-zu-Bezugsfarbraum", "gamut_plot.tooltip": "Klicken und ziehen Sie die Maus im Diagramm, um den Ausschnitt zu verschieben, oder zoomen Sie mit dem Mausrad und den +/- Tasten. Doppelklick setzt die Ansicht zurück.", "generic_name_value_data": "Generische Wertetabelle", "geometry": "Messgeometrie", "glossy": "Glänzend", "*go_to": "Go to %s", "go_to_website": "Gehe zur Website", "gravure": "Tiefdruck", "gray_tone_response_curve": "Graue Farbtonwiedergabekurve", "grayscale": "Graustufen", "green": "Grün", "green_gamma": "Grün Gamma", "green_lab": "Grün L*a*b*", "green_matrix_column": "Grüner Matrix-Farbwert", "green_maximum": "Grün Maximum", "green_minimum": "Grün Minimum", "green_tone_response_curve": "Grüne Farbtonwiedergabekurve", "green_xyz": "Grün XYZ", "grid_steps": "Raster-Schritte", "hdmi": "HDMI", "hdr_maxcll": "Maximaler Inhalts-Luminanzpegel", "hdr_mincll": "Minimaler Inhalts-Luminanzpegel", "header": "Anzeigegeräte-Kalibrierung und Charakterisierung powered by ArgyllCMS", "help_support": "Hilfe und Unterstützung...", "host.invalid.lookup_failed": "Ungültiger Host (Adressauflösung fehlgeschlagen)", "hue": "Farbton", "icc_absolute_colorimetric": "ICC-absolut farbmetrisch", "icc_version": "ICC-Version", "if_available": "falls verfügbar", "illuminant": "Leuchtmittel", "illuminant_relative_cct": "Leuchtmittel-Bezug CCT", "illuminant_relative_lab": "Leuchtmittel-Bezug L*a*b*", "illuminant_relative_xyz": "Leuchtmittel-Bezug XYZ", "illuminant_xyz": "Leuchtmittel XYZ", "illumination": "Beleuchtung", "in": "Eingang", "info.3dlut_settings": "Eine 3D LUT (LUT = Look Up Table) oder ein ICC-Geräteverknüpfungs-Profil können von manchen farbverwaltungsfähigen Applikationen zur vollständigen Farbkorrektur der Anzeige verwendet werden.\n\nMehrere (zusäzliche) 3D LUTs von einem existierenden Profil erzeugen\nMit dem gewünschten Profil unter Einstellungen gewählt, deaktivieren Sie „Nach Profilierung 3D LUT erstellen“.\n\nDen richtigen Quellfarbraum und eine passende Tonwertkurve auswählen\nFür 3D LUTs und ICC-Geräteverknüpfungs-Profile müssen der Quellfarbraum und die Tonwertkurve vor Erstellung der 3D LUT festgelegt werden, und sind fester Bestandteil der gesamten Farbtransformation (ungleich ICC-Geräteprofilen, die dynamisch verknüpft werden). Zum Bespiel wird HD-Videomaterial üblicherweise entsprechend dem Rec.-709-Farbstandard und einer Gamma-Tonwertkurve mit dem Exponenten 2.2-2.4 (relativ mit Schwarzausgabeoffset von 100%) oder Rec. 1886 Tonwertkurve (absolut mit Schwarzausgabeoffset 0%) aufbereitet. Eine Mischung von Rec.-1886-ähnlicher und exponentieller Gamma-Kurve ist ebenfalls möglich, indem das Schwarzausgabeoffset auf einen Wert zwischen 0% und 100% gesetzt wird.\n\nGamma „absolut“ vs. „relativ“\nUm den Schwarzwert eines Anzeigegerätes zu berücksichtigen, muss die Tonwertkurve entsprechend versetzt und skaliert werden.\n„Absolut“ resultiert in einer tatsächlichen Ausgabe bei 50% Eingabe, die nicht derjenigen einer idealisierten Gammakurve entspricht (es sei denn der Schwarzwert ist null).\n„Relativ“ resultiert in einer tatsächlichen Ausgabe bei 50% Eingabe, die derjenigen einer idealisierten Gammakurve entspricht.\n\nFarbübertragung\nFalls Sie auf einen Weißpunkt kalibriert haben, der von dem des gewählten Quellfarbraums abweicht, und Sie diesen stattdessen für die 3D LUT verwenden möchten, wählen Sie „Relativ farbmetrisch“. Anderenfalls wählen Sie „Absolut farbmetrisch mit Weißpunkt-Skalierung“ (Weißpunkt-Skalierung verhindert Clipping im absolut farbmetrischen Modus, das anderenfalls auftreten könnte falls der Quellfarbraum-Weißpunkt außerhalb des Anzeigegeräte-Farbraums liegt). Außerdem haben Sie die Möglichkeit, eine nicht-farbmetrische Farbübertragung zu verwenden, die den Quellfarbraum komprimiert oder ausdehnt, um in den Anzeigegeräte-Farbraum zu passen (nicht empfohlen, wenn farbmetrische Genauigkeit erforderlich ist).", "info.calibration_settings": "Kalibrierung wird durch interaktive Einstellung des Anzeigegeräts zur Erreichung des gewählten Weißpunkts und/oder der gewählten Luminanz als auch optional durch Generierung von 1D-LUT-Kalibrierungskurven (LUT = Look Up Table) zur Erreichung der gewählten Tonwertkurve und Graubalance ausgeführt. Bitte beachten Sie, falls Sie während der Kalibrierung ausschliesslich das Anzeigegerät einstellen und die Generierung von 1D-LUT-Kurven auslassen möchten, dass die Tonwertkurven-Einstellung in diesem Fall auf „Wie gemessen“ gesetzt werden muss. 1D-LUT-Kalibrierung kann nicht zur vollständigen Farbkorrektur der Anzeige verwendet werden, dazu müssen Sie ein ICC-Geräteprofil oder eine 3D LUT erstellen und diese mit farbverwaltungsfähigen Applikationen verwenden. 1D-LUT-Kalibrierung kann jedoch die Profilierung und 3D-LUT-Kalibrierung ergänzen und unterstützen.", "info.display_instrument": "Falls das Anzeigegerät OLED-, Plasma- oder andere Technologie mit variabler Helligkeitsregelung abhängig vom Bildinhalt verwendet, aktivieren Sie Weißluminanz-Drift-Kompensierung.\n\nFalls das Messgerät ein Spektrometer ist und Sie es im Kontaktmodus auf einem Anzeigegerät mit stabilem Schwarzwert verwenden, so können Sie auch Schwarzabgleich-Drift-Kompensierung aktivieren.\n\nFalls das Messgerät ein Colorimeter ist, sollten Sie eine(n) für das Anzeigegerät oder dessen Anzeigetechnologie geeignete(n) Messmodus bzw. Korrektur verwenden. Beachten Sie, dass manche Messgeräte (ColorHug, ColorHug2, K-10, Spyder4/5) eine Korrektur in einigen ihrer Messmodi beinhalten.", "info.display_instrument.warmup": "Sie sollten das Anzeigegerät mindestens 30 Minuten aufwärmen lassen, bevor Sie mit Messungen beginnen. Falls Sie das Messgerät im Kontaktmodus verwenden, so ist es eine gute Idee, es während dieser Zeit am Anzeigegerät zu belassen.", "info.mr_settings": "Sie können die Genauigkeit eines ICC-Geräteprofils oder einer 3D LUT mit einem Messwertreport überprüfen, welcher detaillierte Statistiken über die Farbfehler der gemessenen Felder enthält.\n\nWenn Sie eine 3D LUT überprüfen, stellen Sie sicher, dass Sie die selben Einstellungen verwenden, die zur Erstellung der 3D LUT zur Anwendung kamen.", "info.profile_settings": "Profilierung ist der Prozess der Charakterisierung eines Anzeigegeräts, bei dem seine vollständige Wiedergabecharakteristik in einem ICC-Geräteprofil aufgezeichnet wird. Das ICC-Geräteprofil kann von Applikationen, die ICC-Farbverwaltung unterstützen, zur vollständigen Farbkorrektur der Anzeige verwendet werden, und/oder es kann zur Erstellung einer 3D LUT (LUT = Look Up Table) dienen, welche denselben Zweck für Applikationen erfüllt, die 3D LUTs unterstützen.\n\nDie Anzahl der Messfelder hat Auswirkungen auf die erreichbare Genauigkeit des resultierenden Profils. Für ein ausreichend genaues 3x3-Matrix-und-Kurven-basiertes Profil können bereits einige dutzend Messfelder genug sein, falls das Anzeigegerät gute additive Farbmischungseigenschaften und Linearität besitzt. Einige professionelle Anzeigegeräte fallen in diese Kategorie. Für höchstmögliche Genauigkeit empfiehlt sich ein LUT-basiertes Profil von mehreren hundert bis zu mehreren tausend Messfeldern. Die „Automatisch optimiert“ Testform-Einstellung berücksichtigt Nichtlinearitäten und tatsächliche Wiedergabecharakteristik eines Anzeigegeräts, und sollte für bestmögliche Resultate verwendet werden. Mit dieser Einstellung lässt sich per Schieberegler ein Kompromiss zwischen Profilgenauigkeit und Mess- sowie Profilberechnungszeit wählen.", "infoframe.default_text": "", "infoframe.title": "Protokoll", "infoframe.toggle": "Protokollfenster zeigen", "initial": "Start", "initializing_gui": "Initialisiere GUI...", "ink_jet_printer": "Tintenstrahldrucker", "input_device_profile": "Eingabegeräteprofil", "input_table": "Eingabe-Tabelle", "install_display_profile": "Anzeigegeräteprofil installieren...", "install_local_system": "Systemweit installieren", "install_user": "Nur für aktuellen Benutzer installieren", "instrument": "Messgerät", "instrument.calibrate": "Setzen Sie das Messgerät auf einen dunklen, nichtreflektierenden Untergrund oder auf eine eventuell zum Messgerät-Zubehör gehörende Kalibrierplatte und drücken Sie dann OK, um das Messgerät zu eichen.", "instrument.calibrate.colormunki": "Drehen Sie den ColorMunki-Sensor in die Kalibrierposition und drücken Sie dann OK, um das Messgerät zu eichen.", "instrument.calibrate.reflective": "Setzen Sie das Messgerät auf die zum Messgerät-Zubehör gehörende Weißkachel mit der Seriennummer %s und drücken Sie dann OK, um das Messgerät zu eichen.", "instrument.calibrating": "Messgerätekalibrierung...", "instrument.connect": "Bitte schließen Sie jetzt Ihr Messgerät an.", "instrument.initializing": "Initialisiere Messgerät, bitte warten...", "instrument.measure_ambient": "Falls Ihr Messgerät einen speziellen Aufsatz zur Umgebungslichtmessung benötigt, bringen Sie diesen bitte an. Platzieren Sie das Messgerät zur Umgebungslichtmessung mit der nach oben gerichteten Messöffnung neben Ihrem Anzeigegerät, oder legen Sie zur Messung eines Normlichtkastens eine Metamerie-freie Graukarte hinein und richten Sie das Messgerät darauf. Weitere Infos zum Messen von Umgebungslicht entnehmen Sie bitte der Dokumentation Ihres Messgeräts. Klicken Sie zum Durchführen der Messung auf OK.", "instrument.place_on_screen": "Setzen Sie das Messgerät auf die Messfläche und klicken Sie OK, um fortzufahren.", "instrument.place_on_screen.madvr": "(%i) Bitte setzen Sie Ihr %s auf die Messfläche", "instrument.reposition_sensor": "Die Messung konnte nicht durchgeführt werden, weil sich der Messgerätesensor in der falschen Position befindet. Bitte korrigieren Sie die Sensorposition und klicken Sie OK, um fortzufahren.", "internal": "Intern", "invert_selection": "Auswahl umkehren", "is_embedded": "Ist eingebettet", "is_illuminant": "Ist Leuchtmittel", "is_linear": "Ist linear", "laptop.icc": "Laptop (Gamma 2.2)", "libXss.so": "X11-Erweiterung für Bildschirmschoner", "library.not_found.warning": "Die Bibliothek „%s“ (%s) wurde nicht gefunden. Bitte stellen Sie sicher, dass diese installiert ist, bevor Sie fortfahren.", "license": "Lizenz", "license_info": "Lizensiert unter der GPL", "linear": "linear", "link.address.copy": "Link-Adresse kopieren", "log.autoshow": "Protokollfenster automatisch zeigen", "luminance": "Helligkeit", "lut_access": "Grafikkarten-Gammatabellen-Zugriff", "madhcnet.outdated": "Die installierte Version von %s gefunden unter %s ist veraltet. Bitte aktualisieren Sie auf die neueste madVR-Version (mindestens %i.%i.%i.%i).", "madtpg.launch.failure": "madTPG wurde nicht gefunden oder konnte nicht gestartet werden.", "madvr.not_found": "Der madVR-DirectShow-Filter wurde nicht in der Registrierungsdatenbank gefunden. Bitte stellen Sie sicher, dass madVR installiert ist.", "madvr.outdated": "Die benutzte Version von madVR ist veraltet. Bitte aktualisieren Sie auf die neueste Version (mindestens %i.%i.%i.%i).", "madvr.wrong_levels_detected": "Der gemessene Leuchtdichte-Unterschied zwischen RGB-Stufe 0 und 16 ist unterhalb 0.02 cd/m. Entweder die Eingabe-Wertebereich- und/oder Schwarzpegel-Einstellung des Anzeigegeräts, und/oder die Ausgabe-Wertebereich-Einstellung der Grafikkarte und/oder von madVR ist inkorrekt ‒ falls Ihre Grafikkarte Vollbereichs-RGB (0-255) ausgibt, ändern Sie bitte madVRs Ausgabe-Wertebereich für Ihr Anzeigegerät auf TV (16-235).", "magenta": "Magenta", "make_and_model": "Gerätehersteller und Modell", "manufacturer": "Hersteller", "mastering_display_black_luminance": "Referenz-Schwarzluminanz", "mastering_display_peak_luminance": "Referenz-Spitzen-Weißluminanz", "matrix": "Matrix", "matte": "Matt", "max": "Max", "maximal": "Maximal", "measure": "Messen", "measure.darken_background": "Schwarzer Hintergrund", "measure.darken_background.warning": "Achtung: Wenn „Schwarzer Hintergrund“ gewählt ist, verdeckt er den gesamten Bildschirm und Sie werden das Einstellungsfenster nicht sehen können! Falls Sie eine Mehrschirmkonfiguration verwenden, verschieben Sie das Einstellungsfenster vor der Messung auf einen anderen Bildschirm, oder benutzen Sie die Tastatur (um die Messung abzubrechen, drücken Sie Q. Falls die Messung bereits läuft, drücken Sie nach einer kurzen Pause nochmals Q).", "measure.override_display_settle_time_mult": "Anzeigegerät-Ausregelzeit-Multiplikator", "measure.override_min_display_update_delay_ms": "Minimale Anzeigegerät-Aktualisierungsverzögerung", "measure.testchart": "Testform messen", "measureframe.center": "Zentrieren", "measureframe.info": "Platzieren Sie das Messfenster an der gewünschten Stelle und passen Sie gegebenenfalls die Größe an. In etwa die gesamte Fensterfläche wird zur Anzeige der Messfelder genutzt, der Kreis dient nur als Positionierhilfe für ihr Messgerät.\nPlatzieren Sie das Messgerät auf dem Messfenster und klicken Sie dann auf „Messung starten“. Um abzubrechen und zum Hauptfenster zurückzukehren, schließen Sie das Messfenster.", "measureframe.measurebutton": "Messung starten", "measureframe.title": "Messfenster", "measureframe.zoomin": "Vergrößern", "measureframe.zoommax": "Maximieren/Wiederherstellen", "measureframe.zoomnormal": "Normale Größe", "measureframe.zoomout": "Verkleinern", "measurement.play_sound": "Akustische Rückmeldung bei fortlaufender Messung", "measurement.untethered": "Nicht verbundene Messung", "measurement_file.check_sanity": "Messwertdatei überprüfen...", "measurement_file.check_sanity.auto": "Messwertdateien automatisch überprüfen", "measurement_file.check_sanity.auto.warning": "Bitte beachten Sie, dass es sich bei der automatischen Messwertüberprüfung um ein experimentelles Feature handelt. Verwendung auf eigene Gefahr.", "measurement_file.choose": "Bitte eine Messwertdatei auswählen", "measurement_file.choose.colorimeter": "Bitte eine Colorimeter-Messwertdatei auswählen", "measurement_file.choose.reference": "Bitte eine Referenz-Messwertdatei auswählen", "measurement_mode": "Modus", "measurement_mode.adaptive": "Adaptiv", "measurement_mode.dlp": "DLP", "measurement_mode.factory": "Werkskalibrierung", "measurement_mode.generic": "Generisch", "measurement_mode.highres": "HiRes", "measurement_mode.lcd": "LCD (generisch)", "measurement_mode.lcd.ccfl": "LCD (CCFL)", "measurement_mode.lcd.ccfl.2": "LCD (CCFL Typ 2)", "measurement_mode.lcd.oled": "LCD (OLED)", "measurement_mode.lcd.white_led": "LCD (Weisse LED)", "measurement_mode.lcd.wide_gamut.ccfl": "Erweiterter Farbumfang LCD (CCFL)", "measurement_mode.lcd.wide_gamut.rgb_led": "Erweiterter Farbumfang LCD (RGB LED)", "measurement_mode.raw": "Raw", "measurement_mode.refresh": "Refresh (generisch)", "measurement_report": "Messwertreport...", "measurement_report.update": "Messwert- oder Ausleuchtungs-Report aktualisieren...", "measurement_report_choose_chart": "Bitte wählen Sie die zu messende Testform.", "measurement_report_choose_chart_or_reference": "Bitte wählen Sie eine Testform oder Referenzdatei.", "measurement_report_choose_profile": "Bitte wählen Sie das zu überprüfende Profil.", "measurement_type": "Messungsart", "measurements.complete": "Messung abgeschlossen! Möchten Sie den Ordner mit den Messwertdateien öffnen?", "measuring.characterization": "Messe Farbfelder für Charakterisierung...", "media_black_point": "Medien-Schwarzpunkt", "media_relative_colorimetric": "Medien-relativ farbmetrisch", "media_white_point": "Medien-Weißpunkt", "menu.about": "Über...", "menu.file": "Datei", "menu.help": "?", "menu.language": "Sprache", "menu.options": "Optionen", "menu.tools": "Werkzeuge", "menuitem.quit": "Beenden", "menuitem.set_argyll_bin": "ArgyllCMS-Programmverzeichnis festlegen...", "metadata": "Metadaten", "method": "Methode", "min": "Min", "minimal": "Minimal", "model": "Modell", "motion_picture_film_scanner": "Kinofilm-Scanner", "mswin.open_display_settings": "Windows-Anzeigeeinstellungen öffnen...", "named_color_profile": "Farbwerte-Profil", "named_colors": "Farbwerte", "native": "Nativ", "negative": "Negativ", "no": "Nein", "no_settings": "Die Datei enthält keine Einstellungen.", "none": "Keine", "not_applicable": "Nicht zutreffend", "not_connected": "Nicht verbunden", "not_found": "„%s“ wurde nicht gefunden.", "not_now": "Nicht jetzt", "number_of_entries": "Anzahl Werte", "number_of_entries_per_channel": "Anzahl Werte pro Kanal", "observer": "Beobachter", "observer.1931_2": "CIE 1931 2°", "observer.1955_2": "Stiles & Birch 1955 2°", "observer.1964_10": "CIE 1964 10°", "observer.1964_10c": "CIE 1964 10° / 1931 2° Hybrid", "observer.1978_2": "Judd & Voss 1978 2°", "*observer.2012_2": "CIE 2012 2°", "*observer.2012_10": "CIE 2012 10°", "observer.shaw": "Shaw & Fairchild 1997 2°", "oem.import.auto": "Falls Ihr Colorimeter mit einer Software-CD für Windows geliefert wurde, legen Sie diese bitte ein (brechen Sie eine eventuell automatisch startende Software-Installation ab).\n\nFalls Sie keine CD besitzen und die benötigten Dateien nicht automatisch gefunden werden können, werden diese aus dem Web heruntergeladen.", "oem.import.auto.download_selection": "Eine Vorauswahl wurde anhand der erkannten Messgeräte festgelegt. Bitte wählen Sie die herunterzuladende(n) Datei(en).", "oem.import.auto_windows": "Falls Sie die Hersteller-Software Ihres Colorimeters installiert haben, können die benötigten Dateien in den meisten Fällen automatisch gefunden werden.", "office_web.icc": "Büro & Web (D65, Gamma 2.2)", "offset": "Versatz", "offset_lithography": "Offsetdruck", "ok": "OK", "or": "oder", "osd": "OSD", "other": "Andere", "out": "Ausgang", "out_of_gamut_tag": "Gamut-Prüftabelle", "output.profile": "Zielprofil", "output_device_profile": "Ausgabegeräteprofil", "output_levels": "Ausgabe-Wertebereich", "output_offset": "Ausgabe-Offset", "output_table": "Ausgabe-Tabelle", "overwrite": "Überschreiben", "panel.surface": "Paneloberfläche", "panel.type": "Panel-Typ", "passive_matrix_display": "Passiv-Matrix Anzeigegerät", "patch.layout.select": "Bitte wählen Sie eine Messfeld-Anordnung:", "patches": "Felder", "patterngenerator.prisma.specify_host": "Bitte geben Sie den Host-Namen Ihres Prisma Video-Prozessors an, zum Beispiel prisma-0123 (Windows) bzw. prisma-0123.local (Linux/Mac OS X). Sie finden den Host-Namen auf einem Etikett an der Unterseite Ihres Prisma, solang er nicht über das administrative Web-Interface geändert wurde. Alternativ geben Sie die IP-Adresse ein (falls bekannt), z.B. 192.168.1.234", "patterngenerator.sync_lost": "Synchronisierung mit Testfeld-Generator verloren.", "pause": "Pause", "pcs_illuminant_xyz": "PCS-Leuchtmittel XYZ", "pcs_relative_cct": "PCS-Bezug CCT", "pcs_relative_lab": "PCS-Bezug L*a*b*", "pcs_relative_xyz": "PCS-Bezug XYZ", "pcs_to_device_intent_0": "PCS zu Gerät: Anpassungsart 0", "pcs_to_device_intent_1": "PCS zu Gerät: Anpassungsart 1", "pcs_to_device_intent_2": "PCS zu Gerät: Anpassungsart 2", "perceptual": "Wahrnehmung", "photo.icc": "Photo (D50, Gamma 2.2)", "photo_imagesetter": "Photo-Filmbelichter", "photographic_paper_printer": "Fotopapier-Drucker", "platform": "Plattform", "please_wait": "Bitte warten...", "port.invalid": "Ungültige Portnummer: %s", "positive": "Positiv", "preferred_cmm": "Bevorzugtes CMM", "prepress.icc": "Druckvorstufe (D50, 130 cd/m², L*)", "preset": "Voreinstellung", "preview": "Vorschau", "profile": "Profil", "profile.advanced_gamap": "Erweitert...", "profile.b2a.hires": "Effektive Auflösung der farbmetrischen Bezugsfarbraum-zu-Gerätefarbraum-Tabelle verbessern", "profile.b2a.lowres.warning": "Das Profil enthält scheinbar keine hochauflösende Bezugsfarbraum-zu-Gerätefarbraum-Tabellen, die zur Verwendung als Anzeigegeräteprofil notwendig sind. Möchten Sie hochauflösende Tabellen jetzt erzeugen? Das wird einige Minuten dauern.", "profile.b2a.smooth": "Glätten", "profile.choose": "Bitte wählen Sie ein Profil.", "profile.confirm_regeneration": "Möchten Sie das Profil neu erstellen?", "profile.current": "Aktuelles Profil", "profile.do_not_install": "Profil nicht installieren", "profile.iccv4.unsupported": "ICC-Profile der Version 4 werden nicht unterstützt.", "profile.import.success": "Das Profil wurde importiert. Sie müssen es eventuell manuell in den Systemeinstellungen „Farbe“ zuweisen und aktivieren.", "profile.info": "Profilinformationen", "profile.info.show": "Profilinformationen zeigen", "profile.install": "Profil installieren", "profile.install.error": "Das Profil konnte nicht installiert/aktiviert werden.", "profile.install.success": "Das Profil wurde installiert und aktiviert.", "profile.install.warning": "Das Profil wurde installiert, allerdings sind Probleme aufgetreten.", "profile.install_local_system": "Profil als Systemstandard installieren", "profile.install_network": "Profil im Netzwerk installieren", "profile.install_user": "Profil nur für aktuellen Benutzer installieren", "profile.invalid": "Ungültiges Profil.", "profile.load_error": "Anzeigegeräteprofil konnte nicht geladen werden.", "profile.load_on_login": "Kalibrierung beim Anmelden laden", "profile.load_on_login.handled_by_os": "Kalibrierung vom Betriebssystem laden lassen (niedrige Präzision und Zuverlässigkeit)", "profile.name": "Profilname", "profile.name.placeholders": "Sie können folgende Platzhalter im Profilnamen verwenden:\n\n%a Abgekürzter Wochentagsname\n%A Voller Wochentagsname\n%b Abgekürzter Monatsname\n%B Voller Monatsname\n%d Tag des Monats\n%H Stunde (24-Stunden-Format)\n%I Stunde (12-Stunden-Format)\n%j Tag des Jahres\n%m Monat\n%M Minute\n%p AM/PM\n%S Sekunde\n%U Woche (Sonntag als erster Wochentag)\n%w Wochentag (Sonntag ist 0)\n%W Woche (Montag als erster Wochentag)\n%y Jahr ohne Jahrhundert\n%Y Jahr inklusive Jahrhundert", "profile.no_embedded_ti3": "Das Profil enthält keine Argyll-kompatiblen Messwerte.", "profile.no_vcgt": "Das Profil enthält keine Kalibrierungskurven.", "profile.only_named_color": "Nur Profile des Typs „Named Color“ können verwendet werden.", "profile.quality": "Profilqualität", "profile.quality.b2a.low": "Niedrige Qualität für Bezugsfarbraum-zu-Gerätefarbraum-Tabellen verwenden", "profile.quality.b2a.low.info": "Wählen Sie diese Option, wenn das Profil ausschliesslich mit inversem Gerätefarbraum-zu-Bezugsfarbraum-Gamut-Mapping zum Erstellen eines Geräteverknüpfungs-Profils oder einer 3D LUT verwendet werden soll", "profile.required_tags_missing": "Es fehlen benötigte Tags im Profil: %s", "profile.self_check": "Profil-Selbsttest ΔE*76", "profile.self_check.avg": "Durchschnitt", "profile.self_check.max": "Maximum", "profile.self_check.rms": "RMS", "profile.set_save_path": "Ablagepfad auswählen...", "profile.settings": "Profilierungseinstellungen", "profile.share": "Profil hochladen...", "profile.share.avg_dE_too_high": "Das Profil weist ein zu hohes Delta E auf (ist = %s, Schwellenwert = %s).", "profile.share.b2a_resolution_too_low": "Die Bezugsfarbraum-zu-Gerätefarbraum-Tabellen des Profils sind zu niedrig aufgelöst.", "profile.share.enter_info": "Sie können Ihr Profil mit anderen Nutzern über den OpenSUSE „ICC Profile Taxi“-Service teilen.\n\nBitte geben Sie dazu eine aussagekräftige Beschreibung und die zutreffenden Anzeigegeräteeigenschaften an. Lesen Sie die Anzeigegeräteeinstellungen vom On-Screen-Menü ihres Anzeigegerätes ab und tragen nur die für ihr Anzeigegerät zutreffenden Einstellungen ein, die von Standardeinstellungen abweichen.\nEin Beispiel: Für die meisten Anzeigegeräte sind das der Name der gewählten Voreinstellung, Helligkeit, Kontrast, Farbtemperatur und/oder Weißpunkt-RGB-Werte, sowie Gamma. Bei Laptops und Notebooks in der Regel nur die Helligkeit. Falls Sie bei der Kalibrierung ihres Anzeigegerätes weitere Einstellungen gemacht haben, tragen Sie auch diese ein falls möglich.", "profile.share.meta_missing": "Das Profil enthält nicht die notwendigen Meta-Informationen.", "profile.share.success": "Profil erfolgreich hochgeladen.", "profile.tags.A2B0.shaper_curves.input": "A2B0 Eingangs-Kurven", "profile.tags.A2B0.shaper_curves.output": "A2B0 Ausgangs-Kurven", "profile.tags.A2B1.shaper_curves.input": "A2B1 Eingangs-Kurven", "profile.tags.A2B1.shaper_curves.output": "A2B1 Ausgangs-Kurven", "profile.tags.A2B2.shaper_curves.input": "A2B2 Eingangs-Kurven", "profile.tags.A2B2.shaper_curves.output": "A2B2 Ausgangs-Kurven", "profile.tags.B2A0.shaper_curves.input": "B2A0 Eingangs-Kurven", "profile.tags.B2A0.shaper_curves.output": "B2A0 Ausgangs-Kurven", "profile.tags.B2A1.shaper_curves.input": "B2A1 Eingangs-Kurven", "profile.tags.B2A1.shaper_curves.output": "B2A1 Ausgangs-Kurven", "profile.tags.B2A2.shaper_curves.input": "B2A2 Eingangs-Kurven", "profile.tags.B2A2.shaper_curves.output": "B2A2 Ausgangs-Kurven", "profile.testchart_recommendation": "Um ein hochwertiges Profil zu erzeugen, wird eine Testform mit einer höheren Anzahl Testfelder empfohlen, die dann allerdings auch mehr Zeit zum Messen benötigt. Möchten Sie die empfohlene Testform verwenden?", "profile.type": "Profiltyp", "profile.type.gamma_matrix": "Gamma + Matrix", "profile.type.lut.lab": "L*a*b* LUT", "profile.type.lut.xyz": "XYZ LUT", "profile.type.lut_matrix.xyz": "XYZ LUT + Matrix", "profile.type.lut_rg_swapped_matrix.xyz": "XYZ LUT + vertauschte Matrix", "profile.type.shaper_matrix": "Kurven + Matrix", "profile.type.single_gamma_matrix": "Einzelnes Gamma + Matrix", "profile.type.single_shaper_matrix": "Einzelne Kurve + Matrix", "profile.unsupported": "Nicht unterstützter Profil-Typ (%s) und/oder -Farbraum (%s).", "profile.update": "Profil aktualisieren", "profile_associations": "Profilzuweisungen...", "profile_associations.changing_system_defaults.warning": "Sie ändern zur Zeit die Systemstandards", "profile_associations.use_my_settings": "Eigene Einstellungen für das Anzeigegerät verwenden", "profile_class": "Profilklasse", "profile_connection_space_pcs": "Bezugsfarbraum (PCS)", "profile_loader": "Profil-Lader", "profile_loader.disable": "Profil-Lader deaktivieren", "profile_loader.exceptions.known_app.error": "Der Profil-Lader deaktiviert sich automatisch, während %s ausgeführt wird. Dieses Verhalten kann nicht überschrieben oder ausser Kraft gesetzt werden.", "profile_loader.exit_warning": "Möchten Sie den Profil-Lader wirklich beenden? Die Kalibrierung wird dann nicht mehr automatisch neu geladen, wenn sich die Anzeigegerätekonfiguration ändert!", "profile_loader.fix_profile_associations": "Profilzuweisungen automatisch reparieren", "profile_loader.fix_profile_associations_warning": "So lange der Profil-Lader läuft, kann er sich um Profilzuweisungen kümmern, wenn Sie die Anzeigegerätekonfiguration ändern.\n\nBevor Sie fortfahren, stellen Sie bitte sicher, dass die oben gezeigten Profilzuweisungen korrekt sind. Falls dies nicht der Fall ist, folgen Sie diesen Schritten:\n\n1. Öffnen Sie die Windows-Anzeigeeinstellungen.\n2. Aktivieren Sie alle angeschlossenen Anzeigegeräte („Diese Anzeigen erweitern“).\n3. Öffnen Sie die Profilzuweisungen.\n4. Stellen Sie sicher, dass jedem Anzeigegerät das korrekte Profil zugewiesen ist. Dann schliessen Sie die Profilzuweisungen.\n5. In den Windows-Anzeigeeinstellungen, kehren Sie zur vorherigen Anzeigekonfiguration zurück.\n6. Nun können Sie „Profilzuweisungen automatisch reparieren“ aktivieren.", "profile_loader.info": "Kalibrierungszustand wurde heute bisher %i mal (wieder)hergestellt.\nRechtsklick aufs Icon für Menü.", "profiling": "Profilierung", "profiling.complete": "Profilierung abgeschlossen!", "profiling.incomplete": "Die Profilierung wurde nicht abgeschlossen.", "projection_television": "Rückprojektions-Fernseher", "projector": "Projektor", "projector_mode_unavailable": "Der Projektor-Modus ist erst mit ArgyllCMS 1.1.0 Beta oder neuer verfügbar.", "quality.ultra.warning": "Ultra-Qualität sollte so gut wie nie benutzt werden, ausser um damit zu belegen, dass sie so gut wie nie benutzt werden sollte (sehr lange Verarbeitungszeit!). Verwenden Sie stattdessen hohe oder mittlere Qualität.", "readme": "LiesMich", "ready": "Bereit.", "red": "Rot", "red_gamma": "Rot Gamma", "red_lab": "Rot L*a*b*", "red_matrix_column": "Roter Matrix-Farbwert", "red_maximum": "Rot Maximum", "red_minimum": "Rot Minimum", "red_tone_response_curve": "Rote Farbtonwiedergabekurve", "red_xyz": "Rot XYZ", "reference": "Referenz", "reflection_hardcopy_original_colorimetry": "Auflicht-Vorlagen-Originalfarbmetrik", "reflection_print_output_colorimetry": "Druckausgabe-Farbmetrik", "reflective": "Aufsicht", "reflective_scanner": "Auflicht-Scanner", "remaining_time": "Verbleibende Zeit (ca.)", "remove": "Entfernen", "rendering_intent": "Farbübertragung", "report": "Bericht", "report.calibrated": "Kalibriertes Anzeigegerät messen (Kurzreport)", "report.uncalibrated": "Unkalibriertes Anzeigegerät messen (Kurzreport)", "report.uniformity": "Anzeigegeräteausleuchtung messen...", "reset": "Zurücksetzen", "resources.notfound.error": "Kritischer Fehler: Eine benötigte Datei wurde nicht gefunden:", "resources.notfound.warning": "Warnung: Einige benötigte Dateien wurden nicht gefunden:", "response.invalid": "Ungültige Antwort von %s: %s", "response.invalid.missing_key": "Ungültige Antwort von %s: Fehlender Schlüssel „%s“: %s", "response.invalid.value": "Ungültige Antwort von %s: Wert von Schlüssel „%s“ entspricht nicht dem erwarteten Wert „%s“: %s", "restore_defaults": "Standardeinstellungen wiederherstellen", "rgb.trc": "RGB Übertragungsfunktion", "rgb.trc.averaged": "gemittelte RGB Übertragungsfunktion", "sRGB.icc": "sRGB", "saturation": "Sättigung", "save": "Sichern", "save_as": "Sichern unter...", "scene_appearance_estimates": "Szenen-Erscheinungsbild-Anhaltswerte", "scene_colorimetry_estimates": "Szenen-Farbmetrik-Anhaltswerte", "scripting-client": "DisplayCAL Skript-Client", "scripting-client.cmdhelptext": "Drücken Sie die Tabulator-Taste bei leerer Befehlszeile zur Anzeige der möglichen Befehle im momentanen Kontext, oder zur Autovervollständigung bei bereits eingetippten Anfangsbuchstaben. Tippen Sie „getcommands“ für eine Liste unterstützter Befehle und möglicher Parameter der verbundenen Applikation.", "scripting-client.detected-hosts": "Erkannte Skript-Hosts:", "select_all": "Alles auswählen", "set_as_default": "Als Standard setzen", "setting.keep_current": "Aktuelle Einstellung beibehalten", "settings.additional": "Weitere Einstellungen", "settings.basic": "Grundlegende Einstellungen", "settings.new": "", "settings_loaded": "Kalibrierungskurven und die folgenden Einstellungen wurden geladen: %s. Andere Kalibrierungseinstellungen wurden auf Standardwerte zurückgesetzt und die Profilierungseinstellungen nicht verändert.", "settings_loaded.cal": "Das Profil enthielt nur Kalibrierungseinstellungen. Andere Einstellungen wurden nicht verändert. Keine Kalibrierungskurven gefunden.", "settings_loaded.cal_and_lut": "Das Profil enthielt nur Kalibrierungseinstellungen. Andere Einstellungen wurden nicht verändert und die Kalibrierungskurven geladen.", "settings_loaded.cal_and_profile": "Einstellungen wurden geladen. Keine Kalibrierungskurven gefunden.", "settings_loaded.profile": "Das Profil enthielt nur Profilierungseinstellungen. Andere Einstellungen wurden nicht verändert. Keine Kalibrierungskurven gefunden.", "settings_loaded.profile_and_lut": "Das Profil enthielt nur Profilierungseinstellungen. Andere Einstellungen wurden nicht verändert und die Kalibrierungskurven geladen.", "show_advanced_options": "Erweiterte Optionen zeigen", "show_notifications": "Benachrichtigungen anzeigen", "silkscreen": "Siebdruck", "simulation_profile": "Simulationsprofil", "size": "Größe", "skip_legacy_serial_ports": "Veraltete serielle Anschlüsse auslassen", "softproof.icc": "Softproof (5800K, 160 cd/m², L*)", "spectral": "Spektral", "*ssl.certificate_verify_failed": "The remote certificate could not be verified.", "*ssl.certificate_verify_failed.root_ca_missing": "The remote certificate could not be verified because no suitable root certificates were found on the local system.", "*ssl.handshake_failure": "Handshake failure. A secure connection could not be established.", "startup": "Starte...", "startup_sound.enable": "Start-Klang aktivieren", "success": "...ok.", "surround_xyz": "Umgebungslicht XYZ", "synthicc.create": "Synthethisches ICC Profil erzeugen...", "target": "Ziel", "tc.3d": "3D-Datei zur Diagnose erstellen", "tc.I": "Kubisches Raster (wahrnehmungsorientiert)", "tc.Q": "Wahrnehmungsorientiert füllend (quasi-zufällig)", "tc.R": "Wahrnehmungsorientiert (zufällig)", "tc.adaption": "Anpassung", "tc.algo": "Verteilung", "tc.angle": "Winkel", "tc.black": "Schwarze Felder", "tc.dark_emphasis": "Betonung dunkler Bereiche", "tc.fullspread": "Iterative Felder", "tc.gray": "Neutrale Felder", "tc.i": "Kubisches Raster (Geräte-Farbraum)", "tc.limit.sphere": "Felder auf Kugel begrenzen", "tc.limit.sphere_radius": "Radius", "tc.multidim": "Multidimensional", "tc.multidim.patches": "Schritte = %s Felder (%s neutrale)", "tc.neutral_axis_emphasis": "Grauachsengewichtung", "tc.ofp": "Optimierte Fernste-Punkte-Abtastung", "tc.patch": "Feld", "tc.patches.selected": "ausgewählt", "tc.patches.total": "Felder gesamt", "tc.precond": "Profil zur Vorkonditionierung", "tc.precond.notset": "Bitte wählen Sie ein Profil zur Vorkonditionierung.", "tc.preview.create": "Erstelle Vorschau, bitte warten...", "tc.q": "Geräte-Farbraum füllend (quasi-zufällig)", "tc.r": "Geräte-Farbraum (zufällig)", "tc.single": "Einzelkanal-Felder", "tc.single.perchannel": "pro Kanal", "tc.t": "Inkrementelle Ferne-Punkte-Abtastung", "tc.vrml.black_offset": "RGB Schwarz-Offset (L*)", "tc.vrml.use_D50": "Neutrales RGB-Weiß", "tc.white": "Weiße Felder", "technology": "Technologie", "tempdir_should_still_contain_files": "Erzeugte Dateien sollten sich noch im temporären Verzeichnis „%s“ befinden.", "testchart.add_saturation_sweeps": "Sättigungsfelder hinzufügen", "testchart.add_ti3_patches": "Referenzfelder hinzufügen...", "testchart.auto_optimize.untethered.unsupported": "Das virtuelle nicht verbundene Anzeigegerät unterstützt keine automatische Testform-Optimierung.", "testchart.change_patch_order": "Feldreihenfolge ändern", "testchart.confirm_select": "Datei gespeichert. Möchten Sie diese Testform auswählen?", "testchart.create": "Testform erstellen", "testchart.discard": "Verwerfen", "testchart.dont_select": "Nicht auswählen", "testchart.edit": "Testform bearbeiten...", "testchart.export.repeat_patch": "Jedes Feld wiederholen:", "testchart.file": "Testform", "testchart.info": "Anzahl Felder in gewählter Testform", "testchart.interleave": "Verschränken", "testchart.maximize_RGB_difference": "RGB-Unterschiede maximieren", "testchart.maximize_lightness_difference": "Helligkeitsunterschiede maximieren", "testchart.maximize_rec709_luma_difference": "Luma-Unterschiede maximieren", "testchart.optimize_display_response_delay": "Anzeigegerät-Aktualisierungsverzögerung minimieren", "testchart.patch_sequence": "Testfeld-Abfolge", "testchart.patches_amount": "Feldanzahl", "testchart.read": "Lese Testform...", "testchart.save_or_discard": "Die Testform wurde nicht gesichert.", "testchart.select": "Auswählen", "testchart.separate_fixed_points": "Bitte wählen Sie die Felder, die in einem separaten Arbeitsschritt hinzugefügt werden sollen.", "testchart.set": "Testform auswählen...", "testchart.shift_interleave": "Versetzen & verschränken", "testchart.sort_RGB_blue_to_top": "RGB-Blau nach oben", "testchart.sort_RGB_cyan_to_top": "RGB-Cyan nach oben", "testchart.sort_RGB_gray_to_top": "RGB-Grau nach oben", "testchart.sort_RGB_green_to_top": "RGB-Grün nach oben", "testchart.sort_RGB_magenta_to_top": "RGB-Magenta nach oben", "testchart.sort_RGB_red_to_top": "RGB-Rot nach oben", "testchart.sort_RGB_white_to_top": "RGB-Weiß nach oben", "testchart.sort_RGB_yellow_to_top": "RGB-Gelb nach oben", "testchart.sort_by_BGR": "Nach BGR sortieren", "testchart.sort_by_HSI": "Nach HSI sortieren", "testchart.sort_by_HSL": "Nach HSL sortieren", "testchart.sort_by_HSV": "Nach HSV sortieren", "testchart.sort_by_L": "Nach L* sortieren", "testchart.sort_by_RGB": "Nach RGB sortieren", "testchart.sort_by_RGB_sum": "Nach Summe von RGB sortieren", "testchart.sort_by_rec709_luma": "Nach Luma sortieren", "testchart.vary_RGB_difference": "RGB-Unterschiede variieren", "testchart_or_reference": "Testform oder Referenz", "thermal_wax_printer": "Thermosublimationsdrucker", "tone_values": "Tonwertstufen", "transfer_function": "Übertragungsfunktion", "translations": "Übersetzungen", "transparency": "Durchsicht", "trashcan.linux": "Mülleimer", "trashcan.mac": "Papierkorb", "trashcan.windows": "Papierkorb", "trc": "Tonwertkurve", "trc.dicom": "DICOM", "trc.gamma": "Gamma", "*trc.hlg": "Hybrid Log-Gamma", "trc.lstar": "L*", "trc.rec709": "Rec. 709", "trc.rec1886": "Rec. 1886", "trc.should_use_viewcond_adjust": "Wenn Sie die Rec.-709-, SMPTE-240M- oder sRGB-Kurven verwenden, sollten Sie auch eine Anpassung der Betrachtungsbedingungen an Ihr Umgebungslicht durchführen, um ein korrektes Ergebnis zu erhalten. Aktivieren Sie hierzu das Kontrollkästchen „Umgebungshelligkeit“ und geben Sie einen Wert in Lux ein, oder messen Sie das Umgebungslicht während der Kalibrierung (falls von Ihrem Messgerät unterstützt).", "trc.smpte240m": "SMPTE 240M", "trc.smpte2084": "SMPTE 2084", "trc.smpte2084.hardclip": "SMPTE 2084 (hart begrenzen)", "trc.smpte2084.rolloffclip": "SMPTE 2084 (abrollend begrenzen)", "trc.srgb": "sRGB", "trc.type.absolute": "Absolut", "trc.type.relative": "Relativ", "turn_off": "Ausschalten", "type": "Typ", "udev_hotplug.unavailable": "Weder udev noch hotplug wurden erkannt.", "unassigned": "Nicht zugewiesen", "uninstall": "Deinstallieren", "uninstall_display_profile": "Anzeigegeräteprofil deinstallieren...", "unknown": "Unbekannt", "unmodified": "Unverändert", "unnamed": "Unbenannt", "unspecified": "Keine Angabe", "update_check": "Auf Programmaktualisierung überprüfen...", "update_check.fail": "Programmaktualisierungsüberprüfung fehlgeschlagen:", "update_check.fail.version": "Versionsdatei vom Server %s konnte nicht korrekt interpretiert werden.", "update_check.new_version": "Es ist eine Programmaktualisierung verfügbar: %s", "update_check.onstartup": "Beim Start auf Programmaktualisierung überprüfen", "update_check.uptodate": "%s ist auf dem neuesten Stand.", "update_now": "Jetzt aktualisieren", "upload": "Hochladen", "use_fancy_progress": "Ausgefallene Fortschrittsanzeige verwenden", "use_separate_lut_access": "Gesonderten Grafikkarten-Gammatabellen-Zugriff verwenden", "use_simulation_profile_as_output": "Simulationsprofil als Anzeigegeräteprofil verwenden", "vcgt": "Kalibrierungskurven", "vcgt.mismatch": "Die Grafikkarten-Gammatabelle für Anzeigegerät %s stimmt nicht mit dem gewünschten Zustand überein.", "vcgt.unknown_format": "Unbekanntes Grafikkarten-Gammatabellen-Format in Profil „%s“.", "verification": "Überprüfung", "verification.settings": "Überprüfungseinstellungen", "verify.ti1": "Überprüfungs-Testform", "verify_extended.ti1": "Erweiterte Überprüfungs-Testform", "verify_grayscale.ti1": "Graubalance-Überprüfungs-Testform", "verify_large.ti1": "Große Überprüfungs-Testform", "verify_video.ti1": "Überprüfungs-Testform (Video)", "verify_video_extended.ti1": "Erweiterte Überprüfungs-Testform (Video)", "verify_video_extended_hlg_p3_2020.ti1": "Erweiterte Überprüfungs-Testform (HDR-Video, Rec. 2020/P3, Hybrid Log-Gamma)", "verify_video_extended_smpte2084_100_p3_2020.ti1": "Erweiterte Überprüfungs-Testform (HDR-Video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²)", "verify_video_extended_smpte2084_200_p3_2020.ti1": "Erweiterte Überprüfungs-Testform (HDR-Video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²)", "verify_video_extended_smpte2084_500_p3_2020.ti1": "Erweiterte Überprüfungs-Testform (HDR-Video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²)", "verify_video_extended_smpte2084_1000_p3_2020.ti1": "Erweiterte Überprüfungs-Testform (HDR-Video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²)", "verify_video_large.ti1": "Große Überprüfungs-Testform (Video)", "verify_video_xl.ti1": "Sehr große Überprüfungs-Testform (Video)", "verify_video_xxl.ti1": "XXL Überprüfungs-Testform (Video)", "verify_video_xxxl.ti1": "XXXL Überprüfungs-Testform (Video)", "verify_xl.ti1": "Sehr große Überprüfungs-Testform", "verify_xxl.ti1": "XXL Überprüfungs-Testform", "verify_xxxl.ti1": "XXXL Überprüfungs-Testform", "vga": "VGA", "video.icc": "Video (D65, Rec. 1886)", "video_Prisma.icc": "Video 3D LUT für Prisma (D65, Rec. 709 / Rec. 1886)", "video_ReShade.icc": "Video 3D LUT für ReShade (D65, Rec. 709 / Rec. 1886)", "video_camera": "Video-Kamera", "video_card_gamma_table": "Grafikkarten-Gammatabelle", "video_eeColor.icc": "Video 3D LUT für eeColor (D65, Rec. 709 / Rec. 1886)", "video_madVR.icc": "Video 3D LUT für madVR (D65, Rec. 709 / Rec. 1886)", "video_madVR_ST2084.icc": "Video 3D LUT für madVR HDR (D65, Rec. 2020 / SMPTE 2084)", "video_monitor": "Video-Monitor", "video_resolve.icc": "Video 3D LUT für Resolve (D65, Rec. 709 / Rec. 1886)", "view.3d": "3D-Ansicht", "viewing_conditions": "Betrachtungbedingungen", "viewing_conditions_description": "Beschreibung der Betrachtungbedingungen", "vrml_to_x3d_converter": "VRML zu X3D Konverter", "warning": "Warnung", "warning.already_exists": "Die Datei „%s“ existiert bereits am gewählten Ort und wird überschrieben. Wollen Sie wirklich fortfahren?", "warning.autostart_system": "Das systemweite Autostart-Verzeichnis konnte nicht ermittelt werden.", "warning.autostart_user": "Das benutzerspezifische Autostart-Verzeichnis konnte nicht ermittelt werden.", "warning.discard_changes": "Möchten Sie die Änderungen an den aktuellen Einstellungen wirklich verwerfen?", "warning.input_value_clipping": "Warnung: Werte unterhalb des Anzeigegeräteprofil-Schwarzpunkts werden abgeschnitten!", "warning.suspicious_delta_e": "Warnung: Verdächtige Messwerte wurden gefunden. Bitte beachten Sie, dass die Prüfung ein in gewissem Unfang sRGB-ähnliches Anzeigegerät annimmt. Weicht Ihr Anzeigegerät über eine bestimmte Toleranzschwelle hinaus davon ab (z.B. Bildschirme mit erweitertem Farbumfang oder Tonwertkurve stark abweichend von sRGB), so sind gefundene Fehler eventuell nicht aussagekräftig.\n\nEines oder alle der folgenden Kriterien trafen zu:\n\n• Aufeinanderfolgende Farbfelder mit unterschiedlichen RGB-Werten, aber verdächtig niedrigem ΔE*00 der Messwerte gegeneinander.\n• RGB-Grau mit aufsteigenden RGB-Werten gegenüber dem vorherigenn Farbfeld, aber fallender Helligkeit (L*).\n• RGB-Grau mit absteigenden RGB-Werten gegenüber dem vorherigenn Farbfeld, aber steigender Helligkeit (L*).\n• Ungewöhnlich hohes ΔE*00 und ΔL*00 oder ΔH*00 oder ΔC*00 der gemessenen Werte zum sRGB-Äquivalent der RGB-Werte.\n\nDies könnte auf Messfehler hindeuten. Werte, die als problematisch erachtet werden (was nicht stimmen muss!), werden rot hervorgehaben. Überprüfen Sie die Messwerte sorgfältig und wählen Sie Felder, die Sie übernehmen möchten. Sie können die RGB- und XYZ-Werte auch bearbeiten.", "warning.suspicious_delta_e.info": "Erklärung der Δ-Spalten:\n\nΔE*00 XYZ A/B: ΔE*00 der Messwerte des Farbfelds zu den Messwerten des vorherigen Farbfelds. Fehlt dieser Wert, so war er für die Prüfung nicht ausschlaggebend. Ist er angegeben, so wurde er als zu niedrig vermutet.\n\n0.5 ΔE*00 RGB A/B: ΔE*00 des sRGB-Äquivalents der RGB-Werte des Farbfelds zum sRGB-Äquivalent der RGB-Werte des vorherigen Farbfelds (Faktor 0.5). Ist dieser Wert angegeben, so gibt er den Vergleichswert (Mindestwert) an, der bei der Prüfung auf vermutet zu niedriges ΔE*00 XYZ A/B Verwendung fand. Er dient als sehr grobe Orientierung.\n\nΔE*00 RGB-XYZ: ΔE*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte.\nΔL*00 RGB-XYZ: ΔL*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte.\nΔC*00 RGB-XYZ: ΔC*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte.\nΔH*00 RGB-XYZ: ΔH*00 der Messwerte zum sRGB-Äquivalent der RGB-Werte.", "warning.system_file": "Warnung: “%s” ist eine Systemdatei. Möchten Sie wirklich fortfahren?", "webserver.waiting": "Webserver wartet unter", "welcome": "Willkommen!", "welcome_back": "Willkommen zurück!", "white": "Weiß", "whitepoint": "Weißpunkt", "whitepoint.colortemp": "Farbtemperatur", "whitepoint.colortemp.locus.blackbody": "Schwarzkörper", "whitepoint.colortemp.locus.curve": "Farbtemperatur-Kurve", "whitepoint.colortemp.locus.daylight": "Tageslicht", "whitepoint.set": "Möchten sie auch den Weißpunkt auf den gemessenen Wert setzen?", "whitepoint.simulate": "Weißpunkt simulieren", "whitepoint.simulate.relative": "Relativ zum Anzeigegeräteprofil-Weißpunkt", "whitepoint.visual_editor": "Visueller Weißpunkt-Editor", "whitepoint.visual_editor.display_changed.warning": "Achtung: Die Anzeigegeräte-Konfiguration hat sich geändert und der visuelle Weißpunkt-Editor ist eventuell nicht länger in der Lage, Anzeigegeräteprofile korrekt wiederherzustellen. Bitte überprüfen Sie die Anzeigegeräte-Profilzuweisungen sorgfältig, nachdem Sie den Editor geschlossen haben, und starten Sie DisplayCAL neu.", "whitepoint.xy": "Farbort", "window.title": "DisplayCAL", "windows.version.unsupported": "Diese Version von Windows wird nicht unterstützt.", "windows_only": "Nur Windows", "working_dir": "Arbeitsverzeichnis:", "yellow": "Gelb", "yellow_lab": "Gelb L*a*b*", "yellow_xyz": "Gelb XYZ", "yes": "Ja", } DisplayCAL-3.5.0.0/DisplayCAL/lang/en.json0000644000076500000000000024446313242301041017644 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "Florian Höch", "!language": "English", "!language_name": "ENGLISH", "3dlut": "3D LUT", "3dlut.1dlut.videolut.nonlinear": "The display device's video card gamma tables 1D LUT calibration is non-linear, but the 3D LUT contains applied 1D LUT calibration. Make sure to manually reset the video card gamma tables to linear before using the 3D LUT, or create a 3D LUT without calibration applied (to do the latter, enable “Show advanced options” in the “Options” menu and disable “Apply calibration (vcgt)” as well as “Create 3D LUT after profiling” in the 3D LUT settings, then create a new 3D LUT).", "3dlut.bitdepth.input": "3D LUT input bitdepth", "3dlut.bitdepth.output": "3D LUT output bitdepth", "3dlut.confirm_relcol_rendering_intent": "Do you want the 3D LUT to use the measured white point as well (3D LUT rendering intent will be set to relative colorimetric)?", "3dlut.content.colorspace": "Content colorspace", "3dlut.create": "Create 3D LUT...", "3dlut.create_after_profiling": "Create 3D LUT after profiling", "3dlut.enable": "Enable 3D LUT", "3dlut.encoding.input": "Input encoding", "3dlut.encoding.output": "Output encoding", "3dlut.encoding.output.warning.madvr": "Warning: This output encoding is not recommended and will cause clipping if madVR is not set up to output “TV levels (16-235)” under “Devices” → “%s” → “Properties”. Use at own risk!", "3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "3dlut.encoding.type_C": "TV Rec. 2020 Constant Luminance YCbCr UHD", "3dlut.encoding.type_T": "TV RGB 16-235 (clip WTW)", "3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "3dlut.encoding.type_n": "Full range RGB 0-255", "3dlut.encoding.type_t": "TV RGB 16-235", "3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD", "3dlut.format": "3D LUT file format", "3dlut.format.3dl": "Autodesk / Kodak (.3dl)", "3dlut.format.ReShade": "ReShade (.png, .fx)", "3dlut.format.cube": "IRIDAS (.cube)", "3dlut.format.eeColor": "eeColor Processor (.txt)", "3dlut.format.icc": "Device link profile (.icc/.icm)", "3dlut.format.madVR": "madVR (.3dlut)", "3dlut.format.madVR.hdr": "Process HDR content", "3dlut.format.madVR.hdr.confirm": "Note that you need to have profiled the display in HDR mode. If the display doesn't support HDR natively, click “Cancel”.", "3dlut.format.madVR.hdr_to_sdr": "Convert HDR content to SDR", "3dlut.format.mga": "Pandora (.mga)", "3dlut.format.png": "PNG (.png)", "3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "3dlut.frame.title": "Create 3D LUT", "3dlut.hdr.rolloff.diffuse_white": "Diffuse white (reference 94.38 cd/m²)", "3dlut.hdr.system_gamma": "System gamma (reference 1.2)", "3dlut.holder.assign_preset": "Assign 3D LUT to preset:", "3dlut.holder.out_of_memory": "%s is out of 3D LUT storage space (at least %i KB required). Please delete a few 3D LUTs from %s to make space for new ones. See your %s's documentation for more information.", "3dlut.input.colorspace": "Source colorspace", "3dlut.input.profile": "Source profile", "3dlut.install": "Install 3D LUT", "3dlut.install.failure": "3D LUT installation failed (unknown error).", "3dlut.install.success": "3D LUT installation successful!", "3dlut.install.unsupported": "3D LUT installation is not supported for the selected 3D LUT format.", "3dlut.save_as": "Save 3D LUT as...", "3dlut.settings": "3D LUT settings", "3dlut.size": "3D LUT size", "3dlut.tab.enable": "Enable 3D LUT tab", "3dlut.use_abstract_profile": "Abstract (“Look”) profile", "CMP_Digital_Target-3.cie": "CMP Digital Target 3", "CMP_Digital_Target-4.cie": "CMP Digital Target 4", "CMYK_IDEAlliance_ControlStrip_2009.ti1": "CMYK IDEAlliance Control Strip 2009", "CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": "CMYK IDEAlliance ISO 12647-7 Control Wedge 2013", "CMYK_ISO_12647-7_outer_gamut.ti1": "CMYK ISO 12647-7 outer gamut", "ColorChecker.cie": "ColorChecker", "ColorCheckerDC.cie": "ColorChecker DC", "ColorCheckerPassport.cie": "ColorChecker Passport", "ColorCheckerSG.cie": "ColorChecker SG", "FograStrip2.ti1": "Fogra Media Wedge CMYK V2.0", "FograStrip3.ti1": "Fogra Media Wedge CMYK V3.0", "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008 color accuracy and gray balance", "ISO_14861_color_accuracy_RGB318.ti1": "ISO 14861:2015 color accuracy and gray balance", "QPcard_201.cie": "QPcard 201", "QPcard_202.cie": "QPcard 202", "SpyderChecker.cie": "SpyderCHECKR", "Untethered": "Untethered", "[rgb]TRC": "Tone response curves", "aborted": "...aborted.", "aborting": "Aborting, please wait (this may take a few seconds)...", "abstract_profile": "Abstract profile", "active_matrix_display": "Active matrix display", "adaptive_mode_unavailable": "Adaptive mode is only available with ArgyllCMS 1.1.0 RC3 or newer.", "add": "Add...", "advanced": "Advanced", "allow_skip_sensor_cal": "Allow skipping of spectrometer self-calibration", "ambient.measure": "Measure ambient", "ambient.measure.color.unsupported": "%s: The color of ambient light could not be determined using this instrument because its ambient sensor seems to be monochromatic (only got a light level reading).", "ambient.measure.light_level.missing": "Didn't get a light level reading.", "ambient.set": "Do you also want to set the ambient light level to the measured value?", "app.client.connect": "Scripting client %s:%s connected", "app.client.disconnect": "Scripting client %s:%s disconnected", "app.client.ignored": "Refused connection attempt of scripting client %s:%s: %s", "app.client.network.disallowed": "Refused connection attempt of scripting client %s:%s: Network clients are not allowed.", "app.confirm_restore_defaults": "Do you really want to discard your changes and restore defaults?", "app.detected": "Detected %s.", "app.detected.calibration_loading_disabled": "Detected %s. Calibration loading disabled.", "app.detection_lost": "No longer detecting %s.", "app.detection_lost.calibration_loading_enabled": "No longer detecting %s. Calibration loading enabled.", "app.incoming_message": "Received scripting request from %s:%s: %s", "app.incoming_message.invalid": "Scripting request invalid!", "app.listening": "Setting up scripting host at %s:%s", "app.otherinstance": "%s is already running.", "app.otherinstance.notified": "Already running instance has been notified.", "apply": "Apply", "apply_black_output_offset": "Apply black output offset (100%)", "apply_cal": "Apply calibration (vcgt)", "apply_cal.error": "Calibration could not be applied.", "archive.create": "Create compressed archive...", "archive.import": "Import archive...", "archive.include_3dluts": "Do you want to include 3D LUT files in the archive (not recommended, leads to larger archive file size)?", "argyll.debug.warning1": "Please only use this option if you actually need debugging information (e.g. for troubleshooting ArgyllCMS functionality)! It is normally only useful for software developers to aid in problem diagnosis and resolution. Are you sure you want to enable debugging output?", "argyll.debug.warning2": "Please remember to disable debugging output for normal operation of the software.", "argyll.dir": "ArgyllCMS executable directory:", "argyll.dir.invalid": "ArgyllCMS executables not found!\nPlease select the directory which contains the executable files (maybe prefixed or suffixed “argyll-” / “-argyll”): %s", "argyll.error.detail": "Detailed ArgyllCMS error message:", "argyll.instrument.configuration_files.install": "Install ArgyllCMS instrument configuration files...", "argyll.instrument.configuration_files.install.success": "Installation of ArgyllCMS instrument configuration files complete.", "argyll.instrument.configuration_files.uninstall": "Uninstall ArgyllCMS instrument configuration files...", "argyll.instrument.configuration_files.uninstall.success": "Uninstallation of ArgyllCMS instrument configuration files complete.", "argyll.instrument.driver.missing": "The ArgyllCMS driver for your measurement device seems not to be installed or installed incorrectly. Please check if your measurement device is shown in Windows' Device Manager under „Argyll LibUSB-1.0A devices“ and (re-)install the driver if necessary. Please read the documentation for installation instructions.", "argyll.instrument.drivers.install": "Install ArgyllCMS instrument drivers...", "argyll.instrument.drivers.install.confirm": "You only need to install the ArgyllCMS specific drivers if you have a measurement instrument that is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10.\n\nDo you want to proceed?", "argyll.instrument.drivers.install.failure": "Installation of ArgyllCMS instrument drivers failed.", "argyll.instrument.drivers.install.restart": "You need to disable Driver Signature Enforcement to install the ArgyllCMS instrument drivers. For this purpose, the system needs to be restarted. Select “Troubleshoot” on the page that will appear, then “Advanced Options”, “Startup Settings” and finally “Restart”. On startup, select “Disable Driver Signature Enforcement”. After the restart, choose “Install ArgyllCMS instrument drivers...” in the menu again to install the drivers. If you don't see the “Troubleshoot” option, please refer to the DisplayCAL documentation section “Instrument driver installation under Windows” for an alternate method to disable Driver Signature Enforcement.", "argyll.instrument.drivers.uninstall": "Uninstall ArgyllCMS instrument drivers...", "argyll.instrument.drivers.uninstall.confirm": "Note: Uninstallation doesn't affect instrument drivers that are currently in use, but just removes the driver from Windows' Driver Store. If you want to switch back to an installed vendor-supplied driver for your instrument, you'll have to use Windows' Device Manager to manually switch to the vendor driver. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the vendor driver for your instrument from the list.\n\nDo you want to proceed?", "argyll.instrument.drivers.uninstall.failure": "Uninstallation of ArgyllCMS instrument drivers failed.", "argyll.instrument.drivers.uninstall.success": "Uninstallation of ArgyllCMS instrument drivers complete.", "argyll.util.not_found": "ArgyllCMS “%s” executable not found!", "as_measured": "As measured", "attributes": "Attributes", "audio.lib": "Audio module: %s", "auth": "Authentification", "auth.failed": "Authentification failed.", "auto": "Auto", "auto_optimized": "Auto-optimized", "autostart_remove_old": "Removing old autostart entry", "backing_xyz": "Backing XYZ", "backlight": "Backlight", "bitdepth": "Bitdepth", "black": "Black", "black_lab": "Black L*a*b*", "black_point": "Black point", "black_point_compensation": "Black point compensation", "black_point_compensation.3dlut.warning": "When creating a 3D LUT, the black point compensation profiling setting should be turned off, because it affects the function of the tone curve adjustment. Would you like to turn off black point compensation?", "black_point_compensation.info": "Black point compensation effectively prevents black crush, but reduces the accuracy of color conversion.", "black_white": "Black & white", "black_xyz": "Black XYZ", "blacklevel": "Black level", "blue": "Blue", "blue_gamma": "Blue gamma", "blue_lab": "Blue L*a*b*", "blue_matrix_column": "Blue matrix column", "blue_maximum": "Blue maximum", "blue_minimum": "Blue minimum", "blue_tone_response_curve": "Blue tone response curve", "blue_xyz": "Blue XYZ", "brightness": "Brightness", "browse": "Browse...", "bug_report": "Report a bug...", "button.calibrate": "Calibrate only", "button.calibrate_and_profile": "Calibrate & profile", "button.profile": "Profile only", "cal_extraction_failed": "Could not extract calibration data from the profile.", "calculated_checksum": "Calculated checksum", "calibrate_instrument": "Spectrometer self-calibration", "calibration": "Calibration", "calibration.ambient_viewcond_adjust": "Ambient light level adjustment", "calibration.ambient_viewcond_adjust.info": "To perform a viewing condition adjustment when computing calibration curves, tick the checkbox and enter your ambient light level. You can also optionally measure ambient light, if supported by your instrument.", "calibration.black_luminance": "Black level", "calibration.black_output_offset": "Black output offset", "calibration.black_point_correction": "Black point correction", "calibration.black_point_correction_choice": "You may turn off black point correction, to optimize black level and contrast ratio (recommended for most LCD monitors), or you can turn it on to make black the same hue as the whitepoint (recommended for most CRT monitors). Please select your black point correction preference.", "calibration.black_point_rate": "Rate", "calibration.check_all": "Check settings", "calibration.complete": "Calibration complete!", "calibration.create_fast_matrix_shaper": "Create matrix profile", "calibration.create_fast_matrix_shaper_choice": "Do you want to create a fast matrix shaper profile from calibration measurements or just calibrate?", "calibration.do_not_use_video_lut": "Do not use video card gamma table to apply calibration", "calibration.do_not_use_video_lut.warning": "Do you really want to change the recommended setting?", "calibration.embed": "Embed calibration curves in profile", "calibration.file": "Settings", "calibration.file.invalid": "The chosen settings file is invalid.", "calibration.file.none": "", "calibration.incomplete": "Calibration has not been finished.", "calibration.interactive_display_adjustment": "Interactive display adjustment", "calibration.interactive_display_adjustment.black_level.crt": "Select “Start measurement” and adjust your display's brightness and/or RGB offset controls to match the desired level.", "calibration.interactive_display_adjustment.black_point.crt": "Select “Start measurement” and adjust your display's RGB offset controls to match the desired black point.", "calibration.interactive_display_adjustment.check_all": "Select “Start measurement” to check on the overall settings.", "calibration.interactive_display_adjustment.generic_hint.plural": "A good match is obtained if all bars can be brought to the marked position in the center.", "calibration.interactive_display_adjustment.generic_hint.singular": "A good match is obtained if the bar can be brought to the marked position in the center.", "calibration.interactive_display_adjustment.start": "Start measurement", "calibration.interactive_display_adjustment.stop": "Stop measurement", "calibration.interactive_display_adjustment.white_level.crt": "Select “Start measurement” and adjust your display's contrast and/or RGB gain controls to match the desired level.", "calibration.interactive_display_adjustment.white_level.lcd": "Select “Start measurement” and adjust your display's backlight/brightness control to match the desired level.", "calibration.interactive_display_adjustment.white_point": "Select “Start measurement” and adjust your display's color temperature and/or RGB gain controls to match the desired white point.", "calibration.load": "Load settings...", "calibration.load.handled_by_os": "Calibration loading is handled by the operating system.", "calibration.load_error": "Calibration curves could not be loaded.", "calibration.load_from_cal": "Load calibration curves from calibration file...", "calibration.load_from_cal_or_profile": "Load calibration curves from calibration file or profile...", "calibration.load_from_display_profile": "Load calibration curves from current display device profile", "calibration.load_from_display_profiles": "Load calibration from current display device profile(s)", "calibration.load_from_profile": "Load calibration curves from profile...", "calibration.load_success": "Calibration curves successfully loaded.", "calibration.loading": "Loading calibration curves from file...", "calibration.loading_from_display_profile": "Loading calibration curves of current display device profile...", "calibration.luminance": "White level", "calibration.lut_viewer.title": "Curves", "calibration.preserve": "Preserve calibration state", "calibration.preview": "Preview calibration", "calibration.quality": "Calibration quality", "calibration.quality.high": "High", "calibration.quality.low": "Low", "calibration.quality.medium": "Medium", "calibration.quality.ultra": "Ultra", "calibration.quality.verylow": "Very low", "calibration.reset": "Reset video card gamma table", "calibration.reset_error": "Video card gamma table could not be reset.", "calibration.reset_success": "Video card gamma table successfully reset.", "calibration.resetting": "Resetting video card gamma table to linear...", "calibration.settings": "Calibration settings", "calibration.show_actual_lut": "Show calibration curves from video card", "calibration.show_lut": "Show curves", "calibration.skip": "Continue on to profiling", "calibration.speed": "Calibration speed", "calibration.speed.high": "High", "calibration.speed.low": "Low", "calibration.speed.medium": "Medium", "calibration.speed.veryhigh": "Very high", "calibration.speed.verylow": "Very low", "calibration.start": "Continue on to calibration", "calibration.turn_on_black_point_correction": "Turn on", "calibration.update": "Update calibration", "calibration.update_profile_choice": "Do you want to also update the calibration curves in the existing profile or just calibrate?", "calibration.use_linear_instead": "Use linear calibration instead", "calibration.verify": "Verify calibration", "calibration_profiling.complete": "Calibration and profiling complete!", "calibrationloader.description": "Sets ICC profiles and loads calibration curves for all configured display devices", "can_be_used_independently": "Can be used independently", "cancel": "Cancel", "cathode_ray_tube_display": "Cathode ray tube display", "ccmx.use_four_color_matrix_method": "Minimize xy chromaticity difference", "ccxx.ti1": "Testchart for colorimeter correction", "centered": "Centered", "channel_1_c_xy": "Channel 1 (C) xy", "channel_1_gamma_at_50_input": "Channel 1 gamma at 50% input", "channel_1_is_linear": "Channel 1 is linear", "channel_1_maximum": "Channel 1 maximum", "channel_1_minimum": "Channel 1 minimum", "channel_1_r_xy": "Channel 1 (R) xy", "channel_1_unique_values": "Channel 1 unique values", "channel_2_g_xy": "Channel 2 (G) xy", "channel_2_gamma_at_50_input": "Channel 2 gamma at 50% input", "channel_2_is_linear": "Channel 2 is linear", "channel_2_m_xy": "Channel 2 (M) xy", "channel_2_maximum": "Channel 2 maximum", "channel_2_minimum": "Channel 2 minimum", "channel_2_unique_values": "Channel 2 unique values", "channel_3_b_xy": "Channel 3 (B) xy", "channel_3_gamma_at_50_input": "Channel 3 gamma at 50% input", "channel_3_is_linear": "Channel 3 is linear", "channel_3_maximum": "Channel 3 maximum", "channel_3_minimum": "Channel 3 minimum", "channel_3_unique_values": "Channel 3 unique values", "channel_3_y_xy": "Channel 3 (Y) xy", "channel_4_k_xy": "Channel 4 (K) xy", "channels": "Channels", "characterization_device_values": "Characterization device values", "characterization_measurement_values": "Characterization measurement values", "characterization_target": "Characterization target", "checking_lut_access": "Checking video card gamma table access for display %s...", "checksum": "Checksum", "checksum_ok": "Checksum OK", "chromatic_adaptation_matrix": "Chromatic adaptation matrix", "chromatic_adaptation_transform": "Chromatic adaptation transform", "chromaticity_illuminant_relative": "Chromaticity (illuminant-relative)", "chromecast_limitations_warning": "Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling.", "clear": "Clear", "close": "Close", "color": "Color", "color_look_up_table": "Color Look Up Table", "color_model": "Color model", "color_space_conversion_profile": "Color space Conversion profile", "colorant_order": "Colorant order", "colorants_pcs_relative": "Colorants (PCS-relative)", "colorimeter_correction.create": "Create colorimeter correction...", "colorimeter_correction.create.details": "Please check the fields below and change them when necessary. The description should also contain important details (e.g. specific display settings, non-default CIE observer or the like).", "colorimeter_correction.create.failure": "Correction creation failed.", "colorimeter_correction.create.info": "To create a colorimeter correction, you first need to measure the required test colors with a spectrometer, and in case you want to create a correction matrix instead of a spectral correction, also with the colorimeter.\nAlternatively you can also use existing measurements by choosing “Browse...”.", "colorimeter_correction.create.success": "Correction successfully created.", "colorimeter_correction.file.none": "None", "colorimeter_correction.import": "Import colorimeter corrections from other display profiling software...", "colorimeter_correction.import.choose": "Please choose the colorimeter correction file to import.", "colorimeter_correction.import.failure": "No colorimeter corrections could be imported.", "colorimeter_correction.import.partial_warning": "Not all colorimeter corrections could be imported from %s. %i of %i entries had to be skipped.", "colorimeter_correction.import.success": "Colorimeter corrections and/or measurement modes have been successfully imported from the following softwares:\n\n%s", "colorimeter_correction.instrument_mismatch": "The selected colorimeter correction is not suitable for the selected instrument.", "colorimeter_correction.upload": "Upload colorimeter correction...", "colorimeter_correction.upload.confirm": "Do you want to upload the colorimeter correction to the online database (recommended)? Any uploaded files will be assumed to have been placed in the public domain, so that they can be used freely.", "colorimeter_correction.upload.deny": "This colorimeter correction may not be uploaded.", "colorimeter_correction.upload.exists": "The colorimeter correction already exists in the database.", "colorimeter_correction.upload.failure": "The correction couldn't be entered into the online database.", "colorimeter_correction.upload.success": "The correction was successfully uploaded to the online database.", "colorimeter_correction.web_check": "Check online for colorimeter correction...", "colorimeter_correction.web_check.choose": "The following colorimeter corrections for the selected display and instrument have been found:", "colorimeter_correction.web_check.failure": "No colorimeter corrections for the selected display and instrument have been found.", "colorimeter_correction.web_check.info": "Please note that all colorimeter corrections have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate. They may or may not improve the absolute accuracy of your colorimeter with your display.", "colorimeter_correction_matrix_file": "Correction", "colorimeter_correction_matrix_file.choose": "Choose colorimeter correction...", "colorimetric_intent_image_state": "Colorimetric image state", "colors_pcs_relative": "Colors (PCS-relative)", "colorspace": "Colorspace", "colorspace.show_outline": "Show outline", "commandline": "Command line:", "commands": "Commands", "comparison_profile": "Comparison profile", "comport_detected": "A change in the instrument/port configuration has been detected.", "compression.gzip": "GZIP compression", "computer.name": "Computername", "connected.to.at": "Connected to %s at %s:%s", "connecting.to": "Connecting to %s:%s...", "connection.broken": "Connection broken", "connection.established": "Connection established", "connection.fail": "Connection error (%s)", "connection.fail.http": "HTTP error %s", "connection.waiting": "Waiting for connection at", "continue": "Continue", "contrast": "Contrast", "contribute": "Contribute", "converting": "Converting", "copyright": "Copyright", "corrected": "corrected", "create_profile": "Create profile from measurement data...", "create_profile_from_edid": "Create profile from extended display identification data...", "created": "Created", "creator": "Creator", "current": "Current", "custom": "Custom", "cyan": "Cyan", "d3-e4-s2-g28-m0-b0-f0.ti1": "Small testchart for matrix profiles", "d3-e4-s3-g52-m3-b0-f0.ti1": "Default testchart", "d3-e4-s4-g52-m4-b0-f0.ti1": "Small testchart for LUT profiles", "d3-e4-s5-g52-m5-b0-f0.ti1": "Extended testchart for LUT profiles", "d3-e4-s9-g52-m9-b0-f0.ti1": "Large testchart for LUT profiles", "d3-e4-s17-g52-m17-b0-f0.ti1": "Very large testchart for LUT profiles", "deactivated": "deactivated", "default": "Default", "default.icc": "Default (Gamma 2.2)", "default_crt": "Default CRT", "default_rendering_intent": "Default rendering intent", "delete": "Delete", "delta_e_2000_to_blackbody_locus": "ΔE 2000 to blackbody locus", "delta_e_2000_to_daylight_locus": "ΔE 2000 to daylight locus", "delta_e_to_locus": "ΔE*00 to %s locus", "description": "Description", "description_ascii": "Description (ASCII)", "description_macintosh": "Description (Macintosh)", "description_unicode": "Description (Unicode)", "deselect_all": "Deselect all", "detect_displays_and_ports": "Detect display devices and instruments", "device": "Device", "device.name.placeholder": "", "device_color_components": "Device color components", "device_manager.launch": "Launch Device Manager", "device_manufacturer_name": "Device manufacturer name", "device_manufacturer_name_ascii": "Device manufacturer name (ASCII)", "device_manufacturer_name_macintosh": "Device manufacturer name (Macintosh)", "device_manufacturer_name_unicode": "Device manufacturer name (Unicode)", "device_model_name": "Device model name", "device_model_name_ascii": "Device model name (ASCII)", "device_model_name_macintosh": "Device model name (Macintosh)", "device_model_name_unicode": "Device model name (Unicode)", "device_to_pcs_intent_0": "Device to PCS: Intent 0", "device_to_pcs_intent_1": "Device to PCS: Intent 1", "device_to_pcs_intent_2": "Device to PCS: Intent 2", "devicelink_profile": "Device link profile", "dialog.argyll.notfound.choice": "ArgyllCMS, the color engine that is needed to run DisplayCAL, doesn't seem to be installed on this computer. Do you want to automatically download it or browse for it manually?", "dialog.cal_info": "The calibration file “%s” will be used. Do you want to continue?", "dialog.confirm_cancel": "Do you really want to cancel?", "dialog.confirm_delete": "Do you really want to delete the selected file(s)?", "dialog.confirm_overwrite": "The file “%s” already exists. Do you want to overwrite it?", "dialog.confirm_uninstall": "Do you really want to uninstall the selected file(s)?", "dialog.current_cal_warning": "The current calibration curves will be used. Do you want to continue?", "dialog.do_not_show_again": "Do not show this message again", "dialog.enter_password": "Please enter your password.", "dialog.install_profile": "Do you want to install the profile “%s” and make it the default for display “%s”?", "dialog.linear_cal_info": "Linear calibration curves will be used. Do you want to continue?", "dialog.load_cal": "Load settings", "dialog.select_argyll_version": "Version %s of ArgyllCMS was found. The currently selected version is %s. Do you want to use the newer version?", "dialog.set_argyll_bin": "Please locate the directory where the ArgyllCMS executables reside.", "dialog.set_profile_save_path": "Create profile directory “%s” here:", "dialog.set_testchart": "Choose testchart file", "dialog.ti3_no_cal_info": "The measurement data does not contain calibration curves. Do you really want to continue?", "digital_camera": "Digital camera", "digital_cinema_projector": "Digital cinema projector", "digital_motion_picture_camera": "Digital motion picture camera", "direction.backward": "PCS → B2A → device", "direction.backward.inverted": "PCS ← B2A ← device", "direction.forward": "Device → A2B → PCS", "direction.forward.inverted": "Device ← A2B ← PCS", "directory": "Directory", "disconnected.from": "Disconnected from %s:%s", "display": "Display", "display-instrument": "Display & instrument", "display.connection.type": "Connection", "display.manufacturer": "Display device manufacturer", "display.output": "Output #", "display.primary": "(Primary)", "display.properties": "Display device properties", "display.reset.info": "Please reset the display device to factory defaults, then adjust its brightness to a comfortable level.", "display.settings": "Display device settings", "display.tech": "Display technology", "display_detected": "A change in the display device configuration has been detected.", "display_device_profile": "Display device profile", "display_lut.link": "Link/unlink display and video card gamma table access", "display_peak_luminance": "Display peak luminance", "display_profile.not_detected": "No current profile detected for display “%s”", "display_short": "Display device (abbreviated)", "displayport": "DisplayPort", "displays.identify": "Identify display devices", "dlp_screen": "DLP Screen", "donation_header": "Your support is appreciated!", "donation_message": "If you would like to support the development of, technical assistance with, and continued availability of DisplayCAL and ArgyllCMS, please consider a financial contribution. As DisplayCAL wouldn't be useful without ArgyllCMS, all contributions received for DisplayCAL will be split between both projects.\nFor light personal non-commercial use, a one-time contribution may be appropriate. If you're using DisplayCAL professionally, an annual or monthly contribution would make a great deal of difference in ensuring that both projects continue to be available.\n\nThanks to all contributors!", "download": "Download", "download.fail": "Download failed:", "download.fail.empty_response": "Download failed: %s returned an empty document.", "download.fail.wrong_size": "Download failed: The file does not have the expected size of %s bytes (received %s bytes).", "download_install": "Download & install", "downloading": "Downloading", "drift_compensation.blacklevel": "Black level drift compensation", "drift_compensation.blacklevel.info": "Black level drift compensation tries to counter measurement deviations caused by black calibration drift of a warming up measurement device. For this purpose, a black test patch is measured periodically, which increases the overall time needed for measurements. Many colorimeters have built-in temperature compensation, in which case black level drift compensation should not be needed, but most spectrometers are not temperature compensated.", "drift_compensation.whitelevel": "White level drift compensation", "drift_compensation.whitelevel.info": "White level drift compensation tries to counter measurement deviations caused by luminance changes of a warming up display device. For this purpose, a white test patch is measured periodically, which increases the overall time needed for measurements.", "dry_run": "Dry run", "dry_run.end": "Dry run ended.", "dry_run.info": "Dry run. Check the log to see the command line.", "dvi": "DVI", "dye_sublimation_printer": "Dye sublimation printer", "edid.crc32": "EDID CRC32 checksum", "edid.serial": "EDID serial", "elapsed_time": "Elapsed time", "electrophotographic_printer": "Electrophotographic printer", "electrostatic_printer": "Electrostatic printer", "enable_argyll_debug": "Enable ArgyllCMS debugging output", "enable_spyder2": "Enable Spyder 2 Colorimeter...", "enable_spyder2_failure": "Spyder 2 could not be enabled. Please install the Spyder 2 software manually if it hasn't been installed yet, then run this command again.", "enable_spyder2_success": "Spyder 2 successfully enabled.", "entries": "Entries", "enumerate_ports.auto": "Automatically detect instruments", "enumerating_displays_and_comports": "Enumerating display devices and communication ports...", "environment": "Environment", "error": "Error", "error.access_denied.write": "You do not have write access to %s", "error.already_exists": "The name “%s” can not be used, because another object of the same name already exists. Please choose another name or another directory.", "error.autostart_creation": "Creation of the autostart entry for %s to load the calibration curves on login has failed.", "error.autostart_remove_old": "The old autostart entry which loads calibration curves on login could not be removed: %s", "error.autostart_system": "The system-wide autostart entry to load the calibration curves on login could not be created, because the system-wide autostart directory could not be determined.", "error.autostart_user": "The user-specific autostart entry to load the calibration curves on login could not be created, because the user-specific autostart directory could not be determined.", "error.cal_extraction": "The calibration could not be extracted from “%s”.", "error.calibration.file_missing": "The calibration file “%s” is missing.", "error.calibration.file_not_created": "No calibration file has been created.", "error.copy_failed": "The file “%s” could not be copied to “%s”.", "error.deletion": "An error occured while moving files to the %s. Some files might not have been removed.", "error.dir_creation": "The directory “%s” could not be created. Maybe there are access restrictions. Please allow writing access or choose another directory.", "error.dir_notdir": "The directory “%s” could not be created, because another object of the same name already exists. Please choose another directory.", "error.file.create": "The file “%s” could not be created.", "error.file.open": "The file “%s” could not be opened.", "error.file_type_unsupported": "Unsupported filetype.", "error.generic": "An internal error occured.\n\nError code: %s\nError message: %s", "error.luminance.invalid": "The measured peak luminance was invalid. Make sure the instrument sensor is not blocked, and remove any protective cap (if present).", "error.measurement.file_invalid": "The measurement file „%s“ is invalid.", "error.measurement.file_missing": "The measurement file “%s” is missing.", "error.measurement.file_not_created": "No measurement file has been created.", "error.measurement.missing_spectral": "The measurement file does not contain spectral values.", "error.measurement.one_colorimeter": "Exactly one colorimeter measurement is needed.", "error.measurement.one_reference": "Exactly one reference measurement is needed.", "error.no_files_extracted_from_archive": "No files have been extracted from “%s”.", "error.not_a_session_archive": "The archive “%s” doesn't seem to be a session archive.", "error.profile.file_missing": "The profile “%s” is missing.", "error.profile.file_not_created": "No profile has been created.", "error.source_dest_same": "Source and destination profile are the same.", "error.testchart.creation_failed": "The testchart file “%s” could not be created. Maybe there are access restrictions, or the source file does not exist.", "error.testchart.invalid": "The testchart file “%s” is invalid.", "error.testchart.missing": "The testchart file “%s” is missing.", "error.testchart.missing_fields": "The testchart file „%s“ does not contain required fields: %s", "error.testchart.read": "The testchart file “%s” could not be read.", "error.tmp_creation": "Could not create temporary working directory.", "error.trashcan_unavailable": "The %s is not available. No files were removed.", "errors.none_found": "No errors found.", "estimated_measurement_time": "Estimated measurement time approximately %s hour(s) %s minutes", "exceptions": "Exceptions...", "executable": "Executable", "export": "Export...", "extra_args": "Set additional commandline arguments...", "factory_default": "Factory Default", "failure": "...failed!", "file.hash.malformed": "The integrity of %s cannot be verified because the checksum file is malformed.", "file.hash.missing": "The integrity of %s cannot be verified because it doesn't have an entry in the checksum file.", "file.hash.verification.fail": "Checksum verification failed for %s:\n\nExpected %s\nActual %s", "file.invalid": "File invalid.", "file.missing": "The file “%s” does not exist.", "file.notfile": "“%s” is not a file.", "file.select": "Select file", "filename": "File name", "filename.upload": "Upload filename", "filetype.7z": "7-Zip files", "filetype.any": "Any Filetype", "filetype.cal": "Calibration files (*.cal)", "filetype.cal_icc": "Calibration and profile files (*.cal;*.icc;*.icm)", "filetype.ccmx": "Correction matrices/Calibration spectral samples (*.ccmx;*.ccss)", "filetype.html": "HTML files (*.html;*.htm)", "filetype.icc": "Profile files (*.icc;*.icm)", "filetype.icc_mpp": "Profile files (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "Testchart files (*.icc;*.icm;*.ti1;*.ti3)", "filetype.icc_ti3": "Measurement files (*.icc;*.icm;*.ti3)", "filetype.log": "Log files (*.log)", "filetype.png": "Portable Network Graphics (*.png)", "filetype.tgz": "Compressed TAR archive", "filetype.ti1": "Testchart files (*.ti1)", "filetype.ti1_ti3_txt": "Testchart files (*.ti1), Measurement files (*.ti3;*.txt)", "filetype.ti3": "Measurement files (*.ti3)", "filetype.tif": "Tagged Image File (*.tif)", "filetype.txt": "DeviceCorrections.txt", "filetype.vrml": "VRML files (*.wrl)", "filetype.x3d": "X3D files (*.x3d)", "filetype.zip": "ZIP files", "film_scanner": "Film scanner", "film_writer": "Film writer", "finish": "Finish", "flare": "Flare", "flexography": "Flexography", "focal_plane_colorimetry_estimates": "Focal plane colorimetry estimates", "forced": "forced", "format.select": "Please select the desired format.", "fullscreen.message": "Fullscreen mode activated.\nPress ESC to leave fullscreen.", "fullscreen.osx.warning": "If you enter fullscreen mode using the zoom button in the window title bar, please press CMD + TAB to switch back to normal mode after the window has been closed. Alternatively, you can go fullscreen by double-clicking the title bar or holding the OPTION key while clicking the zoom button.", "gamap.default_intent": "Default rendering intent", "gamap.intents.a": "Absolute colorimetric", "gamap.intents.aa": "Absolute appearance", "gamap.intents.aw": "Absolute colorimetric with white point scaling", "gamap.intents.la": "Luminance matched appearance", "gamap.intents.lp": "Luminance preserving perceptual appearance", "gamap.intents.ms": "Preserve saturation", "gamap.intents.p": "Perceptual", "gamap.intents.pa": "Perceptual appearance", "gamap.intents.r": "Relative colorimetric", "gamap.intents.s": "Saturation", "gamap.out_viewcond": "Destination viewing conditions", "gamap.perceptual": "Gamut mapping for perceptual intent", "gamap.profile": "Source profile", "gamap.saturation": "Gamut mapping for saturation intent", "gamap.src_viewcond": "Source viewing conditions", "gamap.viewconds.cx": "Cut sheet transparencies on a viewing box", "gamap.viewconds.jd": "Projector in dark environment", "gamap.viewconds.jm": "Projector in dim environment", "gamap.viewconds.mb": "Monitor in bright work environment", "gamap.viewconds.md": "Monitor in darkened work environment", "gamap.viewconds.mt": "Monitor in typical work environment", "gamap.viewconds.ob": "Original scene - bright Outdoors", "gamap.viewconds.pc": "Critical print evaluation environment (ISO-3664 P1)", "gamap.viewconds.pcd": "Photo CD - original scene outdoors", "gamap.viewconds.pe": "Print evaluation environment (CIE 116-1995)", "gamap.viewconds.pp": "Practical reflection print (ISO-3664 P2)", "gamap.viewconds.tv": "Television/film studio", "gamapframe.title": "Advanced gamut mapping options", "gamut": "Gamut", "gamut.coverage": "Gamut coverage", "gamut.view.create": "Generating gamut views...", "gamut.volume": "Gamut volume", "gamut_mapping.ciecam02": "CIECAM02 gamut mapping", "gamut_mapping.mode": "Gamut mapping mode", "gamut_mapping.mode.b2a": "PCS-to-device", "gamut_mapping.mode.inverse_a2b": "Inverse device-to-PCS", "gamut_plot.tooltip": "Click and drag the mouse inside the plot to move the viewport, or zoom with the mouse wheel and +/- keys. Double-click resets the viewport.", "generic_name_value_data": "Generic name-value data", "geometry": "Geometry", "glossy": "Glossy", "go_to": "Go to %s", "go_to_website": "Go to Website", "gravure": "Gravure", "gray_tone_response_curve": "Gray tone response curve", "grayscale": "grayscale", "green": "Green", "green_gamma": "Green gamma", "green_lab": "Green L*a*b*", "green_matrix_column": "Green matrix column", "green_maximum": "Green maximum", "green_minimum": "Green minimum", "green_tone_response_curve": "Green tone response curve", "green_xyz": "Green XYZ", "grid_steps": "Grid Steps", "hdmi": "HDMI", "hdr_maxcll": "Maximum content light level", "hdr_mincll": "Minimum content light level", "header": "Display calibration and characterization powered by ArgyllCMS", "help_support": "Help and support...", "host.invalid.lookup_failed": "Invalid host (address lookup failed)", "hue": "Hue", "icc_absolute_colorimetric": "ICC-absolute colorimetric", "icc_version": "ICC version", "if_available": "if available", "illuminant": "Illuminant", "illuminant_relative_cct": "Illuminant-relative CCT", "illuminant_relative_lab": "Illuminant-relative L*a*b*", "illuminant_relative_xyz": "Illuminant-relative XYZ", "illuminant_xyz": "Illuminant XYZ", "illumination": "Illumination", "in": "In", "info.3dlut_settings": "A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction.\n\nCreating several (additional) 3D LUTs from an existing profile\nWith the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox.\n\nChoosing the right source colorspace and tone response curve\nFor 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%.\n\n“Absolute” vs. “relative” gamma\nTo accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly.\n“Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero).\n“Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve.\n\nRendering intent\nIf you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required).", "info.calibration_settings": "Calibration is done by interactively adjusting the display to meet the chosen whitepoint and/or luminance as well as optionally creating 1D LUT calibration curves (LUT = Look Up Table) to meet the chosen tone response curve and ensure gray balance. Note that if during calibration you only want to adjust the display and skip the generation of 1D LUT curves, you need to set the tone response curve to “As measured”. 1D LUT calibration can not be used for full display color correction, you need to create a ICC device profile or 3D LUT and use them with applications that support them for that purpose. 1D LUT calibration complements profiling and 3D LUT calibration though.", "info.display_instrument": "If your display is a OLED, Plasma or other technology with variable light output depending on picture content, enable white level drift compensation.\n\nIf your instrument is a spectrometer and you use it in contact mode on a display with stable black level, you may want to enable instrument black level drift compensation.\n\nIf your instrument is a colorimeter, you should use a measurement mode and/or correction suitable for your display or display technology type. Note that some instruments (ColorHug, ColorHug2, K-10, Spyder4/5) may have a correction built into some of their measurement modes.", "info.display_instrument.warmup": "You should let the display warm up for at least 30 minutes before commencing measurements. If you use your instrument in contact mode, it is a good idea to leave it on the display during that time as well.", "info.mr_settings": "You can verify the accuracy of an ICC profile or 3D LUT via a measurement report that contains detailed statistics about the color errors of the measured patches.\n\nWhen verifying a 3D LUT, make sure to use the same settings as the 3D LUT was created with.", "info.profile_settings": "Profiling is the process of characterizing the display and recording its response in a ICC device profile. The ICC device profile can be used by applications that support ICC color management for full display color correction, and/or it can be used to create a 3D LUT (LUT = Look Up Table) which serves the same purpose for applications that support 3D LUTs.\n\nThe amount of patches measured influences the attainable accuracy of the resulting profile. For a reasonable quality 3x3 matrix and curves based profile, a few dozen patches can be enough if the display has good additive color mixing properties and linearity. Some professional displays fall into that category. If the highest possible accuracy is desired, a LUT-based profile from around several hundred up to several thousand patches is recommended. The “Auto-optimized” testchart setting automatically takes into account the non-linearities and actual response of the display, and should be used for best quality results. With this, you can adjust a slider to choose a compromise between resulting profile accuracy and measurement as well as computation time.", "infoframe.default_text": "", "infoframe.title": "Log", "infoframe.toggle": "Show log window", "initial": "Initial", "initializing_gui": "Initializing GUI...", "ink_jet_printer": "Ink jet printer", "input_device_profile": "Input device profile", "input_table": "Input Table", "install_display_profile": "Install display device profile...", "install_local_system": "Install system-wide", "install_user": "Install for current user only", "instrument": "Instrument", "instrument.calibrate": "Place the instrument on a dark, matte surface or onto its calibration plate and press OK to calibrate the instrument.", "instrument.calibrate.colormunki": "Set the ColorMunki sensor to calibration position and press OK to calibrate the instrument.", "instrument.calibrate.reflective": "Place the instrument onto its reflective white reference serial no. %s and press OK to calibrate the instrument.", "instrument.calibrating": "Calibrating instrument...", "instrument.connect": "Please connect your measurement instrument now.", "instrument.initializing": "Setting up the instrument, please wait...", "instrument.measure_ambient": "If your instrument requires a special cap to measure ambient, please attach it. To measure ambient light, place the instrument upwards, beside the display. Or if you want to measure a viewing booth, put a metamerism-free gray card inside the booth and point the instrument towards it. Further instructions how to measure ambient may be available in your instrument's documentation. Press OK to commence measurement.", "instrument.place_on_screen": "Place the instrument on the test window and click OK to continue.", "instrument.place_on_screen.madvr": "(%i) Please place your %s on the test area", "instrument.reposition_sensor": "The measurement failed because the instrument sensor is in the wrong position. Please correct the sensor position, then click OK to continue.", "internal": "Internal", "invert_selection": "Invert selection", "is_embedded": "Is embedded", "is_illuminant": "Is illuminant", "is_linear": "Is linear", "laptop.icc": "Laptop (Gamma 2.2)", "libXss.so": "X11 screen saver extension", "library.not_found.warning": "The library “%s” (%s) was not found. Please make sure it is installed before proceeding.", "license": "License", "license_info": "Licensed under the GPL", "linear": "linear", "link.address.copy": "Copy link address", "log.autoshow": "Show log window automatically", "luminance": "Luminance", "lut_access": "Video card gamma table access", "madhcnet.outdated": "The installed version of %s found at %s is outdated. Please update to the latest madVR version (at least %i.%i.%i.%i).", "madtpg.launch.failure": "madTPG was not found or could not be launched.", "madvr.not_found": "madVR DirectShow filter was not found in the registry. Please make sure it is installed.", "madvr.outdated": "The used version of madVR is outdated. Please update to the latest version (at least %i.%i.%i.%i).", "madvr.wrong_levels_detected": "The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235).", "magenta": "Magenta", "make_and_model": "Make and model", "manufacturer": "Manufacturer", "mastering_display_black_luminance": "Mastering display black level", "mastering_display_peak_luminance": "Mastering display peak luminance", "matrix": "Matrix", "matte": "Matte", "max": "Max", "maximal": "Maximal", "measure": "Measure", "measure.darken_background": "Black background", "measure.darken_background.warning": "Attention: If „black background“ is chosen, it will cover the whole screen and you will not be able to see the display adjustment window! If you have a multi-screen setup, move the display adjustment window to another screen before starting the measurement, or use the keyboard (to abort the measurement, press Q. If the measurement is already running, wait briefly, then press Q again).", "measure.override_display_settle_time_mult": "Override display settle time multiplier", "measure.override_min_display_update_delay_ms": "Override minimum display update delay", "measure.testchart": "Measure testchart", "measureframe.center": "Center", "measureframe.info": "Move the measurement window to the desired screen position and resize if needed. Approximately the whole window area will be used to display measurement patches, the circle is just there as a guide to help you place your measurement device.\nPlace the measurement device on the window and click on „Start measurement“. To cancel and return to the main window, close the measurement window.", "measureframe.measurebutton": "Start measurement", "measureframe.title": "Measurement area", "measureframe.zoomin": "Enlarge", "measureframe.zoommax": "Maximize/Restore", "measureframe.zoomnormal": "Normal size", "measureframe.zoomout": "Shrink", "measurement.play_sound": "Acoustic feedback on continuous measurements", "measurement.untethered": "Untethered measurement", "measurement_file.check_sanity": "Check measurement file...", "measurement_file.check_sanity.auto": "Check measurement files automatically", "measurement_file.check_sanity.auto.warning": "Please note automatic checking of measurements is an experimental feature. Use at own risk.", "measurement_file.choose": "Please choose a measurement file", "measurement_file.choose.colorimeter": "Please choose a colorimeter measurement file", "measurement_file.choose.reference": "Please choose a reference measurement file", "measurement_mode": "Mode", "measurement_mode.adaptive": "Adaptive", "measurement_mode.dlp": "DLP", "measurement_mode.factory": "Factory calibration", "measurement_mode.generic": "Generic", "measurement_mode.highres": "HiRes", "measurement_mode.lcd": "LCD (generic)", "measurement_mode.lcd.ccfl": "LCD (CCFL)", "measurement_mode.lcd.ccfl.2": "LCD (CCFL Type 2)", "measurement_mode.lcd.oled": "LCD (OLED)", "measurement_mode.lcd.white_led": "LCD (White LED)", "measurement_mode.lcd.wide_gamut.ccfl": "Wide Gamut LCD (CCFL)", "measurement_mode.lcd.wide_gamut.rgb_led": "Wide Gamut LCD (RGB LED)", "measurement_mode.raw": "Raw", "measurement_mode.refresh": "Refresh (generic)", "measurement_report": "Measurement report...", "measurement_report.update": "Update measurement or uniformity report...", "measurement_report_choose_chart": "Please choose the testchart to measure.", "measurement_report_choose_chart_or_reference": "Please choose a testchart or reference.", "measurement_report_choose_profile": "Please choose the profile to validate.", "measurement_type": "Measurement type", "measurements.complete": "Measurements complete! Do you want to open the folder containing the measurement files?", "measuring.characterization": "Measuring color swatches for characterization...", "media_black_point": "Media black point", "media_relative_colorimetric": "Media-relative colorimetric", "media_white_point": "Media white point", "menu.about": "About...", "menu.file": "File", "menu.help": "?", "menu.language": "Language", "menu.options": "Options", "menu.tools": "Tools", "menuitem.quit": "Quit", "menuitem.set_argyll_bin": "Locate ArgyllCMS executables...", "metadata": "Metadata", "method": "Method", "min": "Min", "minimal": "Minimal", "model": "Model", "motion_picture_film_scanner": "Motion picture film scanner", "mswin.open_display_settings": "Open Windows display settings...", "named_color_profile": "Named color profile", "named_colors": "Named colors", "native": "Native", "negative": "Negative", "no": "No", "no_settings": "The file does not contain settings.", "none": "None", "not_applicable": "Not applicable", "not_connected": "Not connected", "not_found": "“%s” was not found.", "not_now": "Not now", "number_of_entries": "Number of entries", "number_of_entries_per_channel": "Number of entries per channel", "observer": "Observer", "observer.1931_2": "CIE 1931 2°", "observer.1955_2": "Stiles & Birch 1955 2°", "observer.1964_10": "CIE 1964 10°", "observer.1964_10c": "CIE 1964 10° / 1931 2° hybrid", "observer.1978_2": "Judd & Voss 1978 2°", "observer.2012_2": "CIE 2012 2°", "observer.2012_10": "CIE 2012 10°", "observer.shaw": "Shaw & Fairchild 1997 2°", "oem.import.auto": "If your colorimeter came with a software CD for Windows, please insert it now (abort any possibly automatic software installation).\n\nIf you don't have a CD and the required files cannot be found otherwise, they will be downloaded from the Web.", "oem.import.auto.download_selection": "A preselection was made based on the detected instrument(s). Please select the file(s) to download.", "oem.import.auto_windows": "If the vendor software for your colorimeter is installed, the required files can be found automatically in most cases.", "office_web.icc": "Office & Web (D65, Gamma 2.2)", "offset": "Offset", "offset_lithography": "Offset lithography", "ok": "OK", "or": "or", "osd": "OSD", "other": "Other", "out": "Out", "out_of_gamut_tag": "Out of gamut tag", "output.profile": "Destination profile", "output_device_profile": "Output device profile", "output_levels": "Output levels", "output_offset": "Output offset", "output_table": "Output Table", "overwrite": "Overwrite", "panel.surface": "Panel surface", "panel.type": "Panel type", "passive_matrix_display": "Passive matrix display", "patch.layout.select": "Please select a patch layout:", "patches": "Patches", "patterngenerator.prisma.specify_host": "Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234", "patterngenerator.sync_lost": "Lost sync with the pattern generator.", "pause": "Pause", "pcs_illuminant_xyz": "PCS illuminant XYZ", "pcs_relative_cct": "PCS-relative CCT", "pcs_relative_lab": "PCS-relative L*a*b*", "pcs_relative_xyz": "PCS-relative XYZ", "pcs_to_device_intent_0": "PCS to device: Intent 0", "pcs_to_device_intent_1": "PCS to device: Intent 1", "pcs_to_device_intent_2": "PCS to device: Intent 2", "perceptual": "Perceptual", "photo.icc": "Photo (D50, Gamma 2.2)", "photo_imagesetter": "Photo imagesetter", "photographic_paper_printer": "Photographic paper printer", "platform": "Platform", "please_wait": "Please wait...", "port.invalid": "Invalid port: %s", "positive": "Positive", "preferred_cmm": "Preferred CMM", "prepress.icc": "Prepress (D50, 130 cd/m², L*)", "preset": "Preset", "preview": "Preview", "profile": "Profile", "profile.advanced_gamap": "Advanced...", "profile.b2a.hires": "Enhance effective resolution of colorimetric PCS-to-device table", "profile.b2a.lowres.warning": "The profile is seemingly missing high-quality PCS-to-device tables, which are essential for proper operation. Do you want to generate high-quality tables now? This will take a few minutes.", "profile.b2a.smooth": "Smoothing", "profile.choose": "Please choose a profile.", "profile.confirm_regeneration": "Do you want to regenerate the profile?", "profile.current": "Current profile", "profile.do_not_install": "Don't install profile", "profile.iccv4.unsupported": "Version 4 ICC profiles are not supported.", "profile.import.success": "The profile has been imported. You may need to manually assign and activate it under “Color” system settings.", "profile.info": "Profile information", "profile.info.show": "Show profile information", "profile.install": "Install profile", "profile.install.error": "The profile could not be installed/activated.", "profile.install.success": "The profile has been installed and activated.", "profile.install.warning": "The profile has been installed, but there may be problems.", "profile.install_local_system": "Install profile as system default", "profile.install_network": "Install profile network-wide", "profile.install_user": "Install profile for current user only", "profile.invalid": "Invalid profile.", "profile.load_error": "Display profile couldn't be loaded.", "profile.load_on_login": "Load calibration on login", "profile.load_on_login.handled_by_os": "Let the operating system handle calibration loading (low precision and reliability)", "profile.name": "Profile name", "profile.name.placeholders": "You may use the following placeholders in the profile name:\n\n%a Abbreviated weekday name\n%A Full weekday name\n%b Abbreviated month name\n%B Full month name\n%d Day of the month\n%H Hour (24-hour clock)\n%I Hour (12-hour clock)\n%j Day of the year\n%m Month\n%M Minute\n%p AM/PM\n%S Second\n%U Week (Sunday as first day of the week)\n%w Weekday (sunday is 0)\n%W Week (Monday as first day of the week)\n%y Year without century\n%Y Year with century", "profile.no_embedded_ti3": "The profile does not contain Argyll compatible measurement data.", "profile.no_vcgt": "The profile does not contain calibration curves.", "profile.only_named_color": "Only profiles of type “Named Color” can be used.", "profile.quality": "Profile quality", "profile.quality.b2a.low": "Low quality PCS-to-device tables", "profile.quality.b2a.low.info": "Choose this option if the profile is only going to be used with inverse device-to-PCS gamut mapping to create a device link or 3D LUT", "profile.required_tags_missing": "The profile is missing required tags: %s", "profile.self_check": "Profile self check ΔE*76", "profile.self_check.avg" : "average", "profile.self_check.max" : "maximum", "profile.self_check.rms" : "RMS", "profile.set_save_path": "Choose save path...", "profile.settings": "Profiling settings", "profile.share": "Upload profile...", "profile.share.avg_dE_too_high": "The profile yields a too high delta E (actual = %s, threshold = %s).", "profile.share.b2a_resolution_too_low": "The resolution of the profile's PCS to device tables is too low.", "profile.share.enter_info": "You may share your profile with other users via the OpenSUSE “ICC Profile Taxi” service.\n\nPlease provide a meaningful description and enter display device properties below. Read display device settings from your display device's OSD and only enter settings applicable to your display device which have changed from defaults.\nExample: For most display devices, these are the name of the chosen preset, brightness, contrast, color temperature and/or whitepoint RGB gains, as well as gamma. On laptops and notebooks, usually only the brightness. If you have changed additional settings while calibrating your display device, enter them too if possible.", "profile.share.meta_missing": "The profile does not contain the necessary meta information.", "profile.share.success": "Profile uploaded successfully.", "profile.tags.A2B0.shaper_curves.input": "A2B0 input shaper curves", "profile.tags.A2B0.shaper_curves.output": "A2B0 output shaper curves", "profile.tags.A2B1.shaper_curves.input": "A2B1 input shaper curves", "profile.tags.A2B1.shaper_curves.output": "A2B1 output shaper curves", "profile.tags.A2B2.shaper_curves.input": "A2B2 input shaper curves", "profile.tags.A2B2.shaper_curves.output": "A2B2 output shaper curves", "profile.tags.B2A0.shaper_curves.input": "B2A0 input shaper curves", "profile.tags.B2A0.shaper_curves.output": "B2A0 output shaper curves", "profile.tags.B2A1.shaper_curves.input": "B2A1 input shaper curves", "profile.tags.B2A1.shaper_curves.output": "B2A1 output shaper curves", "profile.tags.B2A2.shaper_curves.input": "B2A2 input shaper curves", "profile.tags.B2A2.shaper_curves.output": "B2A2 output shaper curves", "profile.testchart_recommendation": "For a higher quality profile, a testchart with more samples is recommended, but it will take more time to measure. Do you want to use the recommended testchart?", "profile.type": "Profile type", "profile.type.gamma_matrix": "Gamma + matrix", "profile.type.lut.lab": "L*a*b* LUT", "profile.type.lut.xyz": "XYZ LUT", "profile.type.lut_matrix.xyz": "XYZ LUT + matrix", "profile.type.lut_rg_swapped_matrix.xyz": "XYZ LUT + swapped matrix", "profile.type.shaper_matrix": "Curves + matrix", "profile.type.single_gamma_matrix": "Single gamma + matrix", "profile.type.single_shaper_matrix": "Single curve + matrix", "profile.unsupported": "Unsupported profile type (%s) and/or colorspace (%s).", "profile.update": "Update profile", "profile_associations": "Profile associations...", "profile_associations.changing_system_defaults.warning": "You are currently changing system defaults", "profile_associations.use_my_settings": "Use my settings for this display device", "profile_class": "Profile class", "profile_connection_space_pcs": "Profile connection space (PCS)", "profile_loader": "Profile loader", "profile_loader.disable": "Disable profile loader", "profile_loader.exceptions.known_app.error": "The profile loader disables itself automatically while %s is running. You cannot override this behavior.", "profile_loader.exit_warning": "Do you really want to quit the profile loader? Calibration will no longer be automatically reloaded if you change the display configuration!", "profile_loader.fix_profile_associations": "Automatically fix profile associations", "profile_loader.fix_profile_associations_warning": "As long as the profile loader is running, it can take care of profile associations when you change the display configuration.\n\nBefore you proceed, please make sure the profile associations shown above are correct. If they aren't, follow these steps:\n\n1. Open Windows display settings.\n2. Activate all connected displays (extended desktop).\n3. Open profile associations.\n4. Make sure each display device has the correct profile assigned. Then close profile associations.\n5. In Windows display settings, revert to the previous display configuration and close display settings.\n6. Now you can enable “Automatically fix profile associations”.", "profile_loader.info": "Calibration state was (re)applied %i time(s) so far today.\nRight-click icon for menu.", "profiling": "Profiling", "profiling.complete": "Profiling complete!", "profiling.incomplete": "Profiling has not been finished.", "projection_television": "Projection television", "projector": "Projector", "projector_mode_unavailable": "Projector mode is only available with ArgyllCMS 1.1.0 Beta or newer.", "quality.ultra.warning": "Ultra quality should almost never be used, except to prove that it should almost never be used (long processing time!). Maybe choose high or medium quality instead.", "readme": "ReadMe", "ready": "Ready.", "red": "Red", "red_gamma": "Red gamma", "red_lab": "Red L*a*b*", "red_matrix_column": "Red matrix column", "red_maximum": "Red maximum", "red_minimum": "Red minimum", "red_tone_response_curve": "Red tone response curve", "red_xyz": "Red XYZ", "reference": "Reference", "reflection_hardcopy_original_colorimetry": "Reflection hardcopy original colorimetry", "reflection_print_output_colorimetry": "Reflection print output colorimetry", "reflective": "Reflective", "reflective_scanner": "Reflective scanner", "remaining_time": "Remaining time (ca.)", "remove": "Remove", "rendering_intent": "Rendering intent", "report": "Report", "report.calibrated": "Report on calibrated display device", "report.uncalibrated": "Report on uncalibrated display device", "report.uniformity": "Measure display device uniformity...", "reset": "Reset", "resources.notfound.error": "Fatal error: A required file has not been found:", "resources.notfound.warning": "Warning: Some required files have not been found:", "response.invalid": "Invalid response from %s: %s", "response.invalid.missing_key": "Invalid response from %s: Missing key “%s”: %s", "response.invalid.value": "Invalid response from %s: Value of key “%s” does not match expected value “%s”: %s", "restore_defaults": "Restore defaults", "rgb.trc": "RGB transfer function", "rgb.trc.averaged": "averaged RGB transfer function", "sRGB.icc": "sRGB", "saturation": "Saturation", "save": "Save", "save_as": "Save as...", "scene_appearance_estimates": "Scene appearance estimates", "scene_colorimetry_estimates": "Scene colorimetry estimates", "scripting-client": "DisplayCAL Scripting Client", "scripting-client.cmdhelptext": "Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application.", "scripting-client.detected-hosts": "Detected scripting hosts:", "select_all": "Select all", "set_as_default": "Set as default", "setting.keep_current": "Keep current setting", "settings.additional": "Additional settings", "settings.basic": "Basic settings", "settings.new": "", "settings_loaded": "Calibration curves and the following calibration settings have been loaded: %s. Other calibration options have been restored to default and profiling options have not been changed.", "settings_loaded.cal": "The profile contained just calibration settings. Other options have not been changed. No calibration curves have been found.", "settings_loaded.cal_and_lut": "The profile contained just calibration settings. Other options have not been changed and calibration curves have been loaded.", "settings_loaded.cal_and_profile": "Settings have been loaded. No calibration curves have been found.", "settings_loaded.profile": "The profile contained just profiling settings. Other options have not been changed. No calibration curves have been found.", "settings_loaded.profile_and_lut": "The profile contained just profiling settings. Other options have not been changed and calibration curves have been loaded.", "show_advanced_options": "Show advanced options", "show_notifications": "Show notifications", "silkscreen": "Silkscreen", "simulation_profile": "Simulation profile", "size": "Size", "skip_legacy_serial_ports": "Skip legacy serial ports", "softproof.icc": "Softproof (5800K, 160 cd/m², L*)", "spectral": "Spectral", "ssl.certificate_verify_failed": "The remote certificate could not be verified.", "ssl.certificate_verify_failed.root_ca_missing": "The remote certificate could not be verified because no suitable root certificates were found on the local system.", "ssl.handshake_failure": "Handshake failure. A secure connection could not be established.", "startup": "Starting up...", "startup_sound.enable": "Enable startup sound", "success": "...ok.", "surround_xyz": "Surround XYZ", "synthicc.create": "Create synthetic ICC profile...", "target": "Target", "tc.3d": "Create diagnostic 3D file", "tc.I": "Perceptual space body centered cubic grid", "tc.Q": "Perceptual space filling quasi-random", "tc.R": "Perceptual space random", "tc.adaption": "Adaption", "tc.algo": "Distribution", "tc.angle": "Angle", "tc.black": "Black patches", "tc.dark_emphasis": "Dark region emphasis", "tc.fullspread": "Iterative patches", "tc.gray": "Neutral patches", "tc.i": "Device space body centered cubic grid", "tc.limit.sphere": "Limit samples to sphere", "tc.limit.sphere_radius": "Radius", "tc.multidim": "Multidimensional", "tc.multidim.patches": "steps = %s patches (%s neutral)", "tc.neutral_axis_emphasis": "Neutral axis emphasis", "tc.ofp": "Optimized farthest point sampling", "tc.patch": "Patch", "tc.patches.selected": "selected", "tc.patches.total": "Total patches", "tc.precond": "Preconditioning profile", "tc.precond.notset": "Please select a preconditioning profile.", "tc.preview.create": "Creating preview, please wait...", "tc.q": "Device space filling quasi-random", "tc.r": "Device space random", "tc.single": "Single channel patches", "tc.single.perchannel": "per channel", "tc.t": "Incremental far point sampling", "tc.vrml.black_offset": "RGB black offset (L*)", "tc.vrml.use_D50": "Neutral RGB white", "tc.white": "White patches", "technology": "Technology", "tempdir_should_still_contain_files": "Created files should still be in the temporary directory “%s”.", "testchart.add_saturation_sweeps": "Add saturation sweeps", "testchart.add_ti3_patches": "Add reference patches...", "testchart.auto_optimize.untethered.unsupported": "The untethered virtual display does not support testchart auto-optimization.", "testchart.change_patch_order": "Change patch order", "testchart.confirm_select": "File saved. Do you want to select this testchart?", "testchart.create": "Create testchart", "testchart.discard": "Discard", "testchart.dont_select": "Don't select", "testchart.edit": "Edit testchart...", "testchart.export.repeat_patch": "Repeat each patch:", "testchart.file": "Testchart", "testchart.info": "Amount of patches in selected testchart", "testchart.interleave": "Interleave", "testchart.maximize_lightness_difference": "Maximize lightness difference", "testchart.maximize_RGB_difference": "Maximize RGB difference", "testchart.maximize_rec709_luma_difference": "Maximize luma difference", "testchart.optimize_display_response_delay": "Minimize display response delay", "testchart.patch_sequence": "Patch sequence", "testchart.patches_amount": "Amount of patches", "testchart.read": "Reading testchart...", "testchart.save_or_discard": "The testchart has not been saved.", "testchart.select": "Select", "testchart.separate_fixed_points": "Please choose the patches to add in a separate step.", "testchart.set": "Choose testchart file...", "testchart.shift_interleave": "Shift & interleave", "testchart.sort_RGB_blue_to_top": "Sort RGB blue to top", "testchart.sort_RGB_cyan_to_top": "Sort RGB cyan to top", "testchart.sort_RGB_gray_to_top": "Sort RGB gray to top", "testchart.sort_RGB_green_to_top": "Sort RGB green to top", "testchart.sort_RGB_magenta_to_top": "Sort RGB magenta to top", "testchart.sort_RGB_red_to_top": "Sort RGB red to top", "testchart.sort_RGB_white_to_top": "Sort RGB white to top", "testchart.sort_RGB_yellow_to_top": "Sort RGB yellow to top", "testchart.sort_by_BGR": "Sort by BGR", "testchart.sort_by_HSI": "Sort by HSI", "testchart.sort_by_HSL": "Sort by HSL", "testchart.sort_by_HSV": "Sort by HSV", "testchart.sort_by_L": "Sort by L*", "testchart.sort_by_RGB": "Sort by RGB", "testchart.sort_by_RGB_sum": "Sort by sum of RGB", "testchart.sort_by_rec709_luma": "Sort by luma", "testchart.vary_RGB_difference": "Vary RGB difference", "testchart_or_reference": "Testchart or reference", "thermal_wax_printer": "Thermal wax printer", "tone_values": "Tone values", "transfer_function": "Transfer function", "translations": "Translations", "transparency": "Transparency", "trashcan.linux": "trash", "trashcan.mac": "trash", "trashcan.windows": "recycle bin", "trc": "Tone curve", "trc.dicom": "DICOM", "trc.hlg": "Hybrid Log-Gamma", "trc.gamma": "Gamma", "trc.lstar": "L*", "trc.rec709": "Rec. 709", "trc.rec1886": "Rec. 1886", "trc.should_use_viewcond_adjust": "When using the SMPTE 240M, Rec. 709 or sRGB curves, you should use an adjustment for your ambient light levels as well to get correct results. To do that, tick the checkbox near “Ambient light level” and enter a value in Lux. You can also optionally measure ambient light while calibrating, if supported by your instrument.", "trc.smpte240m": "SMPTE 240M", "trc.smpte2084": "SMPTE 2084", "trc.smpte2084.hardclip": "SMPTE 2084 (hard clip)", "trc.smpte2084.rolloffclip": "SMPTE 2084 (roll-off)", "trc.srgb": "sRGB", "trc.type.absolute": "Absolute", "trc.type.relative": "Relative", "turn_off": "Turn off", "type": "Type", "udev_hotplug.unavailable": "Neither udev nor hotplug detected.", "unassigned": "Unassigned", "uninstall": "Uninstall", "uninstall_display_profile": "Uninstall display device profile...", "unknown": "Unknown", "unmodified": "Unmodified", "unnamed": "Unnamed", "unspecified": "Unspecified", "update_check": "Check for application update...", "update_check.fail": "Check for application update failed:", "update_check.fail.version": "Remote version file from server %s couldn't be parsed.", "update_check.new_version": "An update is available: %s", "update_check.onstartup": "Check for application update on startup", "update_check.uptodate": "%s is up-to-date.", "update_now": "Update now", "upload": "Upload", "use_fancy_progress": "Use fancy progress dialog", "use_separate_lut_access": "Use separate video card gamma table access", "use_simulation_profile_as_output": "Use simulation profile as display profile", "vcgt": "Calibration curves", "vcgt.mismatch": "The video card gamma tables for display %s do not match the desired state.", "vcgt.unknown_format": "Unknown video card gamma table format in profile “%s”.", "verification": "Verification", "verification.settings": "Verification settings", "verify.ti1": "Verification testchart", "verify_extended.ti1": "Extended verification testchart", "verify_grayscale.ti1": "Graybalance verification testchart", "verify_large.ti1": "Large verification testchart", "verify_video.ti1": "Verification testchart (video)", "verify_video_extended.ti1": "Extended verification testchart (video)", "verify_video_extended_hlg_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, Hybrid Log-Gamma)", "verify_video_extended_smpte2084_100_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²)", "verify_video_extended_smpte2084_200_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²)", "verify_video_extended_smpte2084_500_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²)", "verify_video_extended_smpte2084_1000_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²)", "verify_video_large.ti1": "Large verification testchart (video)", "verify_video_xl.ti1": "Extra large verification testchart (video)", "verify_video_xxl.ti1": "XXL verification testchart (video)", "verify_video_xxxl.ti1": "XXXL verification testchart (video)", "verify_xl.ti1": "Extra large verification testchart", "verify_xxl.ti1": "XXL verification testchart", "verify_xxxl.ti1": "XXXL verification testchart", "vga": "VGA", "video.icc": "Video (D65, Rec. 1886)", "video_Prisma.icc": "Video 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886)", "video_ReShade.icc": "Video 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886)", "video_camera": "Video camera", "video_card_gamma_table": "Video card gamma table", "video_eeColor.icc": "Video 3D LUT for eeColor (D65, Rec. 709 / Rec. 1886)", "video_madVR.icc": "Video 3D LUT for madVR (D65, Rec. 709 / Rec. 1886)", "video_madVR_ST2084.icc": "Video 3D LUT for madVR HDR (D65, Rec. 2020 / SMPTE 2084)", "video_monitor": "Video monitor", "video_resolve.icc": "Video 3D LUT for Resolve (D65, Rec. 709 / Rec. 1886)", "view.3d": "3D view", "viewing_conditions": "Viewing conditions", "viewing_conditions_description": "Viewing conditions description", "vrml_to_x3d_converter": "VRML to X3D converter", "warning": "Warning", "warning.already_exists": "The file “%s” already exists at the chosen location and will be overwritten. Do you want to continue?", "warning.autostart_system": "The system-wide autostart directory could not be determined.", "warning.autostart_user": "The user-specific autostart directory could not be determined.", "warning.discard_changes": "Do you really want to discard the changes to the current settings?", "warning.input_value_clipping": "Warning: Values below the display profile blackpoint will be clipped!", "warning.suspicious_delta_e": "Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful.\n\nOne or all of the following criteria matched:\n\n• Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other.\n• RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*).\n• RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*).\n• Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers.\n\nThis could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values.", "warning.suspicious_delta_e.info": "Explanation of the Δ columns:\n\nΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low.\n\n0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation.\n\nΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers.", "warning.system_file": "Warning: “%s” is a system file. Do you really want to continue?", "webserver.waiting": "Webserver waiting at", "welcome": "Welcome!", "welcome_back": "Welcome back!", "white": "White", "whitepoint": "Whitepoint", "whitepoint.colortemp": "Color temperature", "whitepoint.colortemp.locus.blackbody": "Blackbody", "whitepoint.colortemp.locus.curve": "Color temperature curve", "whitepoint.colortemp.locus.daylight": "Daylight", "whitepoint.set": "Do you also want to set the whitepoint to the measured value?", "whitepoint.simulate": "Simulate whitepoint", "whitepoint.simulate.relative": "Relative to display profile whitepoint", "whitepoint.visual_editor": "Visual whitepoint editor", "whitepoint.visual_editor.display_changed.warning": "Attention: The display configuration has changed and the visual whitepoint editor may no longer be able to correctly restore display profiles. Please check display profile associations carefully after closing the editor and restart DisplayCAL.", "whitepoint.xy": "Chromaticity coordinates", "window.title": "DisplayCAL", "windows.version.unsupported": "This version of Windows is not supported.", "windows_only": "Windows only", "working_dir": "Working directory:", "yellow": "Yellow", "yellow_lab": "Yellow L*a*b*", "yellow_xyz": "Yellow XYZ", "yes": "Yes", } DisplayCAL-3.5.0.0/DisplayCAL/lang/es.json0000644000076500000000000025407413242301041017650 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "Roberto Quintero", "!language": "Español", "!language_name": "SPANISH", "*3dlut": "3D LUT", "*3dlut.1dlut.videolut.nonlinear": "The display device's video card gamma tables 1D LUT calibration is non-linear, but the 3D LUT contains applied 1D LUT calibration. Make sure to manually reset the video card gamma tables to linear before using the 3D LUT, or create a 3D LUT without calibration applied (to do the latter, enable “Show advanced options” in the “Options” menu and disable “Apply calibration (vcgt)” as well as “Create 3D LUT after profiling” in the 3D LUT settings, then create a new 3D LUT).", "3dlut.bitdepth.input": "Profundidad de bits de entrada 3D LUT", "3dlut.bitdepth.output": "Profundidad de bits de salida 3D LUT", "*3dlut.confirm_relcol_rendering_intent": "Do you want the 3D LUT to use the measured white point as well (3D LUT rendering intent will be set to relative colorimetric)?", "*3dlut.content.colorspace": "Content colorspace", "3dlut.create": "Crear 3D LUT...", "*3dlut.create_after_profiling": "Create 3D LUT after profiling", "*3dlut.enable": "Enable 3D LUT", "*3dlut.encoding.input": "Input encoding", "*3dlut.encoding.output": "Output encoding", "*3dlut.encoding.output.warning.madvr": "Warning: This output encoding is not recommended and will cause clipping if madVR is not set up to output “TV levels (16-235)” under “Devices” → “%s” → “Properties”. Use at own risk!", "*3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "*3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "*3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "*3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "*3dlut.encoding.type_C": "TV Rec. 2020 Constant Luminance YCbCr UHD", "*3dlut.encoding.type_T": "TV RGB 16-235 (clip WTW)", "*3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "*3dlut.encoding.type_n": "Full range RGB 0-255", "*3dlut.encoding.type_t": "TV RGB 16-235", "*3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD", "3dlut.format": "Formato de archivo 3D LUT", "*3dlut.format.3dl": "Autodesk / Kodak (.3dl)", "*3dlut.format.ReShade": "ReShade (.png, .fx)", "*3dlut.format.cube": "IRIDAS (.cube)", "*3dlut.format.eeColor": "eeColor Processor (.txt)", "*3dlut.format.icc": "Device link profile (.icc/.icm)", "*3dlut.format.madVR": "madVR (.3dlut)", "*3dlut.format.madVR.hdr": "Process HDR content", "*3dlut.format.madVR.hdr.confirm": "Note that you need to have profiled the display in HDR mode. If the display doesn't support HDR natively, click “Cancel”.", "*3dlut.format.madVR.hdr_to_sdr": "Convert HDR content to SDR", "*3dlut.format.mga": "Pandora (.mga)", "*3dlut.format.png": "PNG (.png)", "*3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "3dlut.frame.title": "Crear 3D LUT", "*3dlut.hdr.rolloff.diffuse_white": "Diffuse white (reference 94.38 cd/m²)", "*3dlut.hdr.system_gamma": "System gamma (reference 1.2)", "*3dlut.holder.assign_preset": "Assign 3D LUT to preset:", "*3dlut.holder.out_of_memory": "%s is out of 3D LUT storage space (at least %i KB required). Please delete a few 3D LUTs from %s to make space for new ones. See your %s's documentation for more information.", "*3dlut.input.colorspace": "Source colorspace", "3dlut.input.profile": "Perfil de origen", "*3dlut.install": "Install 3D LUT", "*3dlut.install.failure": "3D LUT installation failed (unknown error).", "*3dlut.install.success": "3D LUT installation successful!", "*3dlut.install.unsupported": "3D LUT installation is not supported for the selected 3D LUT format.", "*3dlut.save_as": "Save 3D LUT as...", "*3dlut.settings": "3D LUT settings", "3dlut.size": "Tamaño 3D LUT", "*3dlut.tab.enable": "Enable 3D LUT tab", "*3dlut.use_abstract_profile": "Abstract (“Look”) profile", "*CMP_Digital_Target-3.cie": "CMP Digital Target 3", "*CMP_Digital_Target-4.cie": "CMP Digital Target 4", "*CMYK_IDEAlliance_ControlStrip_2009.ti1": "CMYK IDEAlliance Control Strip 2009", "*CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": "CMYK IDEAlliance ISO 12647-7 Control Wedge 2013", "*CMYK_ISO_12647-7_outer_gamut.ti1": "CMYK ISO 12647-7 outer gamut", "*ColorChecker.cie": "ColorChecker", "*ColorCheckerDC.cie": "ColorChecker DC", "*ColorCheckerPassport.cie": "ColorChecker Passport", "*ColorCheckerSG.cie": "ColorChecker SG", "*FograStrip2.ti1": "Fogra Media Wedge CMYK V2.0", "*FograStrip3.ti1": "Fogra Media Wedge CMYK V3.0", "*ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008 color accuracy and gray balance", "*ISO_14861_color_accuracy_RGB318.ti1": "ISO 14861:2015 color accuracy and gray balance", "*QPcard_201.cie": "QPcard 201", "*QPcard_202.cie": "QPcard 202", "*SpyderChecker.cie": "SpyderCHECKR", "*Untethered": "Untethered", "[rgb]TRC": "Curva de respuesta tonal", "aborted": "...abortada.", "aborting": "Abortando, por favor espere (esto llevará unos segundos)...", "*abstract_profile": "Abstract profile", "*active_matrix_display": "Active matrix display", "adaptive_mode_unavailable": "El modo adaptivo esta solo disponible con ArgyllCMS 1.1.0 RC3 o reciente.", "*add": "Add...", "*advanced": "Advanced", "allow_skip_sensor_cal": "Permitir saltarse la autocalibración del espectrofotometro", "ambient.measure": "Medicion ambiente", "*ambient.measure.color.unsupported": "%s: The color of ambient light could not be determined using this instrument because its ambient sensor seems to be monochromatic (only got a light level reading).", "*ambient.measure.light_level.missing": "Didn't get a light level reading.", "ambient.set": "¿Desea tambien ajustar la luz ambiente a los niveles medidos?", "*app.client.connect": "Scripting client %s:%s connected", "*app.client.disconnect": "Scripting client %s:%s disconnected", "*app.client.ignored": "Refused connection attempt of scripting client %s:%s: %s", "*app.client.network.disallowed": "Refused connection attempt of scripting client %s:%s: Network clients are not allowed.", "app.confirm_restore_defaults": "¿Desea descartar sus cambios y restaurar los valores por defecto?", "*app.detected": "Detected %s.", "*app.detected.calibration_loading_disabled": "Detected %s. Calibration loading disabled.", "*app.detection_lost": "No longer detecting %s.", "*app.detection_lost.calibration_loading_enabled": "No longer detecting %s. Calibration loading enabled.", "*app.incoming_message": "Received scripting request from %s:%s: %s", "*app.incoming_message.invalid": "Scripting request invalid!", "*app.listening": "Setting up scripting host at %s:%s", "*app.otherinstance": "%s is already running.", "*app.otherinstance.notified": "Already running instance has been notified.", "apply": "Aplicar", "*apply_black_output_offset": "Apply black output offset (100%)", "apply_cal": "Aplicar calibracion (vcgt)", "apply_cal.error": "La calibracion no puede ser aplicada.", "*archive.create": "Create compressed archive...", "*archive.import": "Import archive...", "*archive.include_3dluts": "Do you want to include 3D LUT files in the archive (not recommended, leads to larger archive file size)?", "argyll.debug.warning1": "Por favor utilize solo esta opcion si necesita informacion de depuracion (p.e. para solucionar problemas en la funcionalidad de ArgyllCMS)! Normalmente solo es util para desarrolladoes de software para ayudar en el diagnostico de problemas y su resolucion. ¿Está seguro de querer activar la salida de depuración?", "argyll.debug.warning2": "Por favor recuerde desactivar la salida de depuración para un funcionamiento normal del programa.", "argyll.dir": "Directorio de ejecutables de ArgyllCMS:", "argyll.dir.invalid": "Los ejecutables de ArgyllCMS no se han encontrado!\nPor favor seleccione el directorio que contiene los archivos ejecutables (quizá el prefijo o sufijo “argyll-” / “-argyll”): %s", "argyll.error.detail": "Mensaje de error de ArgyllCMS detallado:", "*argyll.instrument.configuration_files.install": "Install ArgyllCMS instrument configuration files...", "*argyll.instrument.configuration_files.install.success": "Installation of ArgyllCMS instrument configuration files complete.", "*argyll.instrument.configuration_files.uninstall": "Uninstall ArgyllCMS instrument configuration files...", "*argyll.instrument.configuration_files.uninstall.success": "Uninstallation of ArgyllCMS instrument configuration files complete.", "argyll.instrument.driver.missing": "El controlador ArgyllCMS para su instrumento de medición parece no estar instalado o está instalado incorrectamente. Por favor compruebe que su instruemento de medición se muestra en Windows' gestor de perifericos debajo de „Argyll LibUSB-1.0A devices“ y (re-)instalar el controlador si es necesario. Por favor lea la documentacion para instrucciones de instalación.", "*argyll.instrument.drivers.install": "Install ArgyllCMS instrument drivers...", "*argyll.instrument.drivers.install.confirm": "You only need to install the ArgyllCMS specific drivers if you have a measurement instrument that is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10.\n\nDo you want to proceed?", "*argyll.instrument.drivers.install.failure": "Installation of ArgyllCMS instrument drivers failed.", "*argyll.instrument.drivers.install.restart": "You need to disable Driver Signature Enforcement to install the ArgyllCMS instrument drivers. For this purpose, the system needs to be restarted. Select “Troubleshoot” on the page that will appear, then “Advanced Options”, “Startup Settings” and finally “Restart”. On startup, select “Disable Driver Signature Enforcement”. After the restart, choose “Install ArgyllCMS instrument drivers...” in the menu again to install the drivers. If you don't see the “Troubleshoot” option, please refer to the DisplayCAL documentation section “Instrument driver installation under Windows” for an alternate method to disable Driver Signature Enforcement.", "*argyll.instrument.drivers.uninstall": "Uninstall ArgyllCMS instrument drivers...", "*argyll.instrument.drivers.uninstall.confirm": "Note: Uninstallation doesn't affect instrument drivers that are currently in use, but just removes the driver from Windows' Driver Store. If you want to switch back to an installed vendor-supplied driver for your instrument, you'll have to use Windows' Device Manager to manually switch to the vendor driver. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the vendor driver for your instrument from the list.\n\nDo you want to proceed?", "*argyll.instrument.drivers.uninstall.failure": "Uninstallation of ArgyllCMS instrument drivers failed.", "*argyll.instrument.drivers.uninstall.success": "Uninstallation of ArgyllCMS instrument drivers complete.", "argyll.util.not_found": "El ejecutable de ArgyllCMS “%s” no se encuentra!", "as_measured": "Nativo", "*attributes": "Attributes", "*audio.lib": "Audio module: %s", "auth": "Autentificacion", "auth.failed": "Autentificacion fallida.", "auto": "Auto", "*auto_optimized": "Auto-optimized", "autostart_remove_old": "Removiendo la entrada antigua de autoinicio", "*backing_xyz": "Backing XYZ", "backlight": "Luz de fondo", "*bitdepth": "Bitdepth", "black": "Negro", "*black_lab": "Black L*a*b*", "black_point": "Punto negro", "black_point_compensation": "Compensación del punto negro", "*black_point_compensation.3dlut.warning": "When creating a 3D LUT, the black point compensation profiling setting should be turned off, because it affects the function of the tone curve adjustment. Would you like to turn off black point compensation?", "black_point_compensation.info": "La compensación del punto negro previene el aplastamiento del negro, pero reduce la precisión de la conversión de color.", "*black_white": "Black & white", "*black_xyz": "Black XYZ", "blacklevel": "Nivel de negro", "blue": "Azul", "*blue_gamma": "Blue gamma", "*blue_lab": "Blue L*a*b*", "*blue_matrix_column": "Blue matrix column", "*blue_maximum": "Blue maximum", "*blue_minimum": "Blue minimum", "*blue_tone_response_curve": "Blue tone response curve", "*blue_xyz": "Blue XYZ", "brightness": "Brillo", "browse": "Seleccionar...", "bug_report": "Notificar un error...", "button.calibrate": "Solo calibrar", "button.calibrate_and_profile": "Calibrar y perfilar", "button.profile": "Solo perfilar", "cal_extraction_failed": "No se pueden extraer datos de calibracion del perfil.", "*calculated_checksum": "Calculated checksum", "*calibrate_instrument": "Spectrometer self-calibration", "calibration": "Calibracion", "calibration.ambient_viewcond_adjust": "Nivel de luz ambiente", "calibration.ambient_viewcond_adjust.info": "Para realizar un ajuste de las condiciones de visualización cuando se calculan las curvas de calibración, active la casilla e introduzca su nivel de luz ambiente. Opcionalmente puede medir la luz ambiente mientras calibra, si lo soporta su instrumento.", "calibration.black_luminance": "Nivel de negro", "calibration.black_output_offset": "Compensacion salida del negro", "calibration.black_point_correction": "Corrección punto negro", "calibration.black_point_correction_choice": "Debe desactivar la corrección del punto negro, para optimizar el nivel de negro y el ratio de contraste (recomendado para la mayoria de los monitores LCD), o puede activarlo para hacer el negro del mismo matiz que el punto blanco (recomendado para la mayoria de los monitores CRT). Por favor seleccione su preferencia de corrección de punto negro.", "calibration.black_point_rate": "Tasa", "calibration.check_all": "Comprobrar ajustes", "calibration.complete": "Calibración completada!", "calibration.create_fast_matrix_shaper": "Crear perfil de matriz", "calibration.create_fast_matrix_shaper_choice": "¿Quiere crear un perfil de matriz rapido de las mediciones de calibracion o solo calibrar?", "*calibration.do_not_use_video_lut": "Do not use video card gamma table to apply calibration", "*calibration.do_not_use_video_lut.warning": "Do you really want to change the recommended setting?", "*calibration.embed": "Embed calibration curves in profile", "calibration.file": "Ajustes", "calibration.file.invalid": "El archivo de configuración seleccionado no es valido.", "calibration.file.none": "", "calibration.incomplete": "La calibración no ha terminado.", "calibration.interactive_display_adjustment": "Ajuste del monitor interactivo", "calibration.interactive_display_adjustment.black_level.crt": "Seleccione “Comenzar medicion” y ajustar el brillo de su pantalla y/o los controles desplazamiento RGB para conseguir el nivel deseado.", "calibration.interactive_display_adjustment.black_point.crt": "Seleccione “Comenzar medicion” y ajustar los controles desplazamiento RGB de su pantalla para conseguir el punto negro deseado.", "calibration.interactive_display_adjustment.check_all": "Seleccione “Comenzar medicion” para comprobar los ajustes generales.", "calibration.interactive_display_adjustment.generic_hint.plural": "Un buen resultado se obtiene si todas las barras pueden ser llevadas a la posición marcada en el centro.", "calibration.interactive_display_adjustment.generic_hint.singular": "Un buen resultado se obtiene si la barra puede ser llevada a la posición marcada en el centro.", "calibration.interactive_display_adjustment.start": "Comenzar medicion", "calibration.interactive_display_adjustment.stop": "Parar medicion", "calibration.interactive_display_adjustment.white_level.crt": "Seleccione “Comenzar medicion” y ajustar el contraste de su pantalla y/o los controles de ganancia RGB para conseguir el nivel deseado.", "calibration.interactive_display_adjustment.white_level.lcd": "Seleccione “Comenzar medicion” y ajustar los controles luz de fondo/brillo de su pantalla para conseguir el punto negro deseado.", "calibration.interactive_display_adjustment.white_point": "Seleccione “Comenzar medicion” y ajustar los controles temperatura de color y/o ganacia RGB de su pantalla para conseguir el punto blanco deseado.", "calibration.load": "Cargando ajustes...", "*calibration.load.handled_by_os": "Calibration loading is handled by the operating system.", "calibration.load_error": "Las curvas de calibración no pueden ser cargadas.", "calibration.load_from_cal": "Cargando curvas de calibración desde el archivo de calibracion...", "calibration.load_from_cal_or_profile": "Cargando curvas de calibración desde el archivo de calibración o del perfil...", "calibration.load_from_display_profile": "Cargar curvas de calibración desde el perfil de pantalla actual", "*calibration.load_from_display_profiles": "Load calibration from current display device profile(s)", "calibration.load_from_profile": "Cargar curvas de calibración desde el perfil...", "calibration.load_success": "Curvas de calibración cargadas correctamente.", "calibration.loading": "Cargando curvas de calibración desde archivo...", "calibration.loading_from_display_profile": "Cargar curvas de calibración del perfil de pantalla actual...", "calibration.luminance": "Nivel de blanco", "calibration.lut_viewer.title": "Curvas", "*calibration.preserve": "Preserve calibration state", "calibration.preview": "Calibracion previa", "calibration.quality": "Calidad de la calibración", "calibration.quality.high": "Alta", "calibration.quality.low": "Baja", "calibration.quality.medium": "Media", "calibration.quality.ultra": "Ultra", "calibration.quality.verylow": "Muy baja", "calibration.reset": "Resetear curvas de calibración", "calibration.reset_error": "Las curvas de calibración no pueden ser reseteadas.", "calibration.reset_success": "Curvas de calibración reseteadas correctamente.", "calibration.resetting": "Reseteando curvas de calibración a valores por defecto...", "calibration.settings": "Valores de calibración", "calibration.show_actual_lut": "Mostrar curvas de calibracion de la tarjeta grafica", "calibration.show_lut": "Mostrar curvas", "*calibration.skip": "Continue on to profiling", "calibration.speed": "Velocidad de la calibración", "calibration.speed.high": "Alta", "calibration.speed.low": "Baja", "calibration.speed.medium": "Media", "calibration.speed.veryhigh": "Muy alta", "calibration.speed.verylow": "Muy baja", "calibration.start": "Continúe con la calibración", "calibration.turn_on_black_point_correction": "Activar", "calibration.update": "Calibración actualizada", "calibration.update_profile_choice": "¿Quiere actualizar también las curvas de calibración en el perfil existente o solo calibrar?", "*calibration.use_linear_instead": "Use linear calibration instead", "calibration.verify": "Verificando calibración", "calibration_profiling.complete": "Calibración y perfilado completado!", "calibrationloader.description": "Establece los perfiles ICC y carga curvas de calibración para todos los dispositivos de visualización configurados", "*can_be_used_independently": "Can be used independently", "cancel": "Cancelar", "*cathode_ray_tube_display": "Cathode ray tube display", "*ccmx.use_four_color_matrix_method": "Minimize xy chromaticity difference", "ccxx.ti1": "Carta de ajustes para correcion de colorimetro", "*centered": "Centered", "*channel_1_c_xy": "Channel 1 (C) xy", "*channel_1_gamma_at_50_input": "Channel 1 gamma at 50% input", "*channel_1_is_linear": "Channel 1 is linear", "*channel_1_maximum": "Channel 1 maximum", "*channel_1_minimum": "Channel 1 minimum", "*channel_1_r_xy": "Channel 1 (R) xy", "*channel_1_unique_values": "Channel 1 unique values", "*channel_2_g_xy": "Channel 2 (G) xy", "*channel_2_gamma_at_50_input": "Channel 2 gamma at 50% input", "*channel_2_is_linear": "Channel 2 is linear", "*channel_2_m_xy": "Channel 2 (M) xy", "*channel_2_maximum": "Channel 2 maximum", "*channel_2_minimum": "Channel 2 minimum", "*channel_2_unique_values": "Channel 2 unique values", "*channel_3_b_xy": "Channel 3 (B) xy", "*channel_3_gamma_at_50_input": "Channel 3 gamma at 50% input", "*channel_3_is_linear": "Channel 3 is linear", "*channel_3_maximum": "Channel 3 maximum", "*channel_3_minimum": "Channel 3 minimum", "*channel_3_unique_values": "Channel 3 unique values", "*channel_3_y_xy": "Channel 3 (Y) xy", "*channel_4_k_xy": "Channel 4 (K) xy", "*channels": "Channels", "*characterization_device_values": "Characterization device values", "*characterization_measurement_values": "Characterization measurement values", "*characterization_target": "Characterization target", "checking_lut_access": "Chequeando acceso calibración para la pantalla %s...", "*checksum": "Checksum", "*checksum_ok": "Checksum OK", "*chromatic_adaptation_matrix": "Chromatic adaptation matrix", "*chromatic_adaptation_transform": "Chromatic adaptation transform", "*chromaticity_illuminant_relative": "Chromaticity (illuminant-relative)", "*chromecast_limitations_warning": "Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling.", "clear": "Limpiar", "*close": "Close", "*color": "Color", "*color_look_up_table": "Color Look Up Table", "*color_model": "Color model", "*color_space_conversion_profile": "Color space Conversion profile", "*colorant_order": "Colorant order", "*colorants_pcs_relative": "Colorants (PCS-relative)", "colorimeter_correction.create": "Crear correccion de colorimetro...", "colorimeter_correction.create.details": "Por favor comprobar los campos de abajo y cambiarlos cuando sea necesario. La descripcion puede contener detalles importantes (p.e. ajustes de pantalla especificas, observador no CIE por defecto o similar).", "colorimeter_correction.create.failure": "Creacion de correcion fallada.", "colorimeter_correction.create.info": "Para crear una correcion de matriz de colorimetro (CCMX) o un ejemplo de archivo de calibracion espectral (CCSS), primero nedesita medir “carta de ajustes para correcion de colorimetro” con un espectrofotometro, y en caso de crear un archivo CCMX, tambien con el colorimetro.", "colorimeter_correction.create.success": "Correcion creada con exito.", "colorimeter_correction.file.none": "Ninguno", "colorimeter_correction.import": "Importar correciones de colorimetro desde otros programas de calibracion de pantallas...", "colorimeter_correction.import.choose": "Por favor seleccione el archivo de correccion de colorimetro a importar.", "colorimeter_correction.import.failure": "No se pueden importar las correciones de colorimetro.", "*colorimeter_correction.import.partial_warning": "Not all colorimeter corrections could be imported from %s. %i of %i entries had to be skipped.", "colorimeter_correction.import.success": "Las correciones de colorimetro han sido importadas con exito de los siguientes programas:\n\n%s", "*colorimeter_correction.instrument_mismatch": "The selected colorimeter correction is not suitable for the selected instrument.", "colorimeter_correction.upload": "Subir correcion de colorimetro...", "colorimeter_correction.upload.confirm": "¿Quiere subir la correccion de colorimetro a la base de datos en linea (recomendado)? Cualquier archivo subido se asume será de dominio publico, asi que pueden ser usados libremente.", "colorimeter_correction.upload.deny": "Esta correccion de colorimetro no puede ser subida.", "colorimeter_correction.upload.exists": "La correcion de colorimetro ya existe en la base de datos.", "colorimeter_correction.upload.failure": "La correccion no pudo ser introducida en la base de datos en linea.", "colorimeter_correction.upload.success": "La correcion fue subida con exito a la base de datos en linea.", "colorimeter_correction.web_check": "Comprobar en linea para correcion de colorimetro...", "colorimeter_correction.web_check.choose": "Se han encontrado las siguientes correciones de colorimetro para la pantalla e instrumento seleccionado :", "colorimeter_correction.web_check.failure": "No se han encontrado correciones de colorimetro para la pantalla y el instrumento seleccionado.", "*colorimeter_correction.web_check.info": "Please note that all colorimeter corrections have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate. They may or may not improve the absolute accuracy of your colorimeter with your display.", "colorimeter_correction_matrix_file": "Correccion", "colorimeter_correction_matrix_file.choose": "seleccionar correcion de colorimetro...", "*colorimetric_intent_image_state": "Colorimetric image state", "*colors_pcs_relative": "Colors (PCS-relative)", "colorspace": "Espacio de color", "colorspace.show_outline": "Mostrar borde", "commandline": "Linea de comandos:", "*commands": "Commands", "comparison_profile": "Perfil de comparacion", "comport_detected": "Ha sido detectado un cambio en el instrumento/puerto de ajustes.", "*compression.gzip": "GZIP compression", "*computer.name": "Computername", "*connected.to.at": "Connected to %s at %s:%s", "*connecting.to": "Connecting to %s:%s...", "*connection.broken": "Connection broken", "*connection.established": "Connection established", "connection.fail": "Error de Conexion (%s)", "connection.fail.http": "Error HTTP %s", "*connection.waiting": "Waiting for connection at", "continue": "Continuar", "contrast": "Contraste", "*contribute": "Contribute", "*converting": "Converting", "*copyright": "Copyright", "corrected": "corregido", "create_profile": "Crear perfil desde datos de medición...", "create_profile_from_edid": "Crear perfil a partir de EDID...", "created": "Creado", "*creator": "Creator", "current": "Actual", "custom": "Otro", "cyan": "Cian", "*d3-e4-s2-g28-m0-b0-f0.ti1": "Small testchart for matrix profiles", "*d3-e4-s3-g52-m3-b0-f0.ti1": "Default testchart", "*d3-e4-s4-g52-m4-b0-f0.ti1": "Small testchart for LUT profiles", "*d3-e4-s5-g52-m5-b0-f0.ti1": "Extended testchart for LUT profiles", "*d3-e4-s9-g52-m9-b0-f0.ti1": "Large testchart for LUT profiles", "*d3-e4-s17-g52-m17-b0-f0.ti1": "Very large testchart for LUT profiles", "*deactivated": "deactivated", "default": "Por defecto", "*default.icc": "Default (Gamma 2.2)", "*default_crt": "Default CRT", "*default_rendering_intent": "Default rendering intent", "delete": "Borrar", "*delta_e_2000_to_blackbody_locus": "ΔE 2000 to blackbody locus", "*delta_e_2000_to_daylight_locus": "ΔE 2000 to daylight locus", "delta_e_to_locus": "ΔE*00 a %s locus", "description": "Descripcion", "*description_ascii": "Description (ASCII)", "*description_macintosh": "Description (Macintosh)", "*description_unicode": "Description (Unicode)", "*deselect_all": "Deselect all", "detect_displays_and_ports": "Detectar pantallas e instrumentos", "*device": "Device", "*device.name.placeholder": "", "*device_color_components": "Device color components", "*device_manager.launch": "Launch Device Manager", "*device_manufacturer_name": "Device manufacturer name", "*device_manufacturer_name_ascii": "Device manufacturer name (ASCII)", "*device_manufacturer_name_macintosh": "Device manufacturer name (Macintosh)", "*device_manufacturer_name_unicode": "Device manufacturer name (Unicode)", "*device_model_name": "Device model name", "*device_model_name_ascii": "Device model name (ASCII)", "*device_model_name_macintosh": "Device model name (Macintosh)", "*device_model_name_unicode": "Device model name (Unicode)", "*device_to_pcs_intent_0": "Device to PCS: Intent 0", "*device_to_pcs_intent_1": "Device to PCS: Intent 1", "*device_to_pcs_intent_2": "Device to PCS: Intent 2", "*devicelink_profile": "Device link profile", "*dialog.argyll.notfound.choice": "ArgyllCMS, the color engine that is needed to run DisplayCAL, doesn't seem to be installed on this computer. Do you want to automatically download it or browse for it manually?", "*dialog.cal_info": "The calibration file “%s” will be used. Do you want to continue?", "*dialog.confirm_cancel": "Do you really want to cancel?", "dialog.confirm_delete": "Realmente desea borrar el(los) archivo(s) seleccionado(s)?", "dialog.confirm_overwrite": "El archivo “%s” ya existe. ¿Desea sobreescribirlo?", "dialog.confirm_uninstall": "Realmente desinstalar borrar el(los) archivo(s) seleccionado(s)?", "dialog.current_cal_warning": "Las curvas de calibracion actual seran usadas. ¿Desea continuar?", "dialog.do_not_show_again": "No mostrar este mensaje de nuevo", "dialog.enter_password": "Por favor introduzca su contraseña.", "dialog.install_profile": "Desea instalar el perfil “%s” y hacerlo predeterminado para la pantalla “%s”?", "*dialog.linear_cal_info": "Linear calibration curves will be used. Do you want to continue?", "dialog.load_cal": "Cargar configuración", "*dialog.select_argyll_version": "Version %s of ArgyllCMS was found. The currently selected version is %s. Do you want to use the newer version?", "dialog.set_argyll_bin": "Por favor localizar el directorio donde residen los ejecutables de Argyll.", "dialog.set_profile_save_path": "Crear directorio de perfil “%s” aqui:", "dialog.set_testchart": "Escoja el archivo de carta de ajustes", "dialog.ti3_no_cal_info": "Los datos de medicion no contienen curvas de calibracion. ¿Realmente desea continuar?", "*digital_camera": "Digital camera", "*digital_cinema_projector": "Digital cinema projector", "*digital_motion_picture_camera": "Digital motion picture camera", "*direction.backward": "PCS → B2A → device", "*direction.backward.inverted": "PCS ← B2A ← device", "*direction.forward": "Device → A2B → PCS", "*direction.forward.inverted": "Device ← A2B ← PCS", "*directory": "Directory", "*disconnected.from": "Disconnected from %s:%s", "display": "Pantalla", "*display-instrument": "Display & instrument", "display.connection.type": "Conexion", "display.manufacturer": "Fabricante de pantalla", "*display.output": "Output #", "display.primary": "(Primaria)", "display.properties": "Propiedades de pantalla", "*display.reset.info": "Please reset the display device to factory defaults, then adjust its brightness to a comfortable level.", "display.settings": "ajustes de pantalla", "display.tech": "tecnologia de pantalla", "display_detected": "Se ha detectado un cambio en la ajustes de la pantalla.", "*display_device_profile": "Display device profile", "display_lut.link": "Enlace/desenlace acceso a pantalla y calibración", "*display_peak_luminance": "Display peak luminance", "*display_profile.not_detected": "No current profile detected for display “%s”", "display_short": "Pantalla (abreviado)", "displayport": "DisplayPort", "*displays.identify": "Identify display devices", "*dlp_screen": "DLP Screen", "*donation_header": "Your support is appreciated!", "*donation_message": "If you would like to support the development of, technical assistance with, and continued availability of DisplayCAL and ArgyllCMS, please consider a financial contribution. As DisplayCAL wouldn't be useful without ArgyllCMS, all contributions received for DisplayCAL will be split between both projects.\nFor light personal non-commercial use, a one-time contribution may be appropriate. If you're using DisplayCAL professionally, an annual or monthly contribution would make a great deal of difference in ensuring that both projects continue to be available.\n\nThanks to all contributors!", "*download": "Download", "*download.fail": "Download failed:", "*download.fail.empty_response": "Download failed: %s returned an empty document.", "*download.fail.wrong_size": "Download failed: The file does not have the expected size of %s bytes (received %s bytes).", "*download_install": "Download & install", "*downloading": "Downloading", "drift_compensation.blacklevel": "Compensacion de la desviacion del nivel del negro", "drift_compensation.blacklevel.info": "La compensacion de la desviacion del nivel del negro trata de contar desviaciones de la medicion por desviacion de la calibracion del negro marcadas por las advertencias del instrumento de medicion. Para este proposito, un parche de negro es medido periodicamente, lo que incrementa el tiempo total necesario para las mediciones. Muchos colorimetros tiene incorporada compensacion de temepratura, en cuyo caso la compensacion de la desviacion del negro no es necesaria, pero la mayor parte de los espectrofotometros no tiene compensacion de temperatura.", "drift_compensation.whitelevel": "Desviacion de la compensacion del nivel de blanco", "drift_compensation.whitelevel.info": "La desviacion de la compensacion del nivel de blanco trata de contar desviaciones de la medicion causadas por cambios de luminancia marcadas por las advertencias de la pantalla. Para este proposito, un parche de blanco es medido periodicamente, lo que incrementa el tiempo total necesario para las mediciones.", "*dry_run": "Dry run", "*dry_run.end": "Dry run ended.", "*dry_run.info": "Dry run. Check the log to see the command line.", "dvi": "DVI", "*dye_sublimation_printer": "Dye sublimation printer", "*edid.crc32": "EDID CRC32 checksum", "*edid.serial": "EDID serial", "elapsed_time": "Tiempo transcurrido", "*electrophotographic_printer": "Electrophotographic printer", "*electrostatic_printer": "Electrostatic printer", "enable_argyll_debug": "Activar salida de errores ArgyllCMS", "enable_spyder2": "Activar colorimetro Spyder 2 ...", "enable_spyder2_failure": "Spyder 2 no puede ser activado.", "enable_spyder2_success": "Spyder 2 activado correctamente.", "*entries": "Entries", "enumerate_ports.auto": "Detectar automaticamente instrumentos", "enumerating_displays_and_comports": "Enumeranado pantallas y puertos de comunicación...", "*environment": "Environment", "error": "Error", "error.access_denied.write": "No tiene acceso de escritura a %s", "error.already_exists": "El nombre “%s” no pude ser usado, porque otro objeto del mismo nombre todavia existe. Por favor escoja otro nombre u otro directotio.", "error.autostart_creation": "La creación de la entrada de autoarranque para %s para cargar las curvas de calibración en la entrada ha fallado.", "error.autostart_remove_old": "La entrada de autoarranque antigua que carga las curvas de calibracion al inicio del sistema no puede ser eliminada: %s", "error.autostart_system": "La entrada de autoarranque del sistema que carga las curvas de calibracion al inicio no puede ser creada, porque el directorio de autoarranque del sistema no se puede determinar.", "error.autostart_user": "La entrada de autoarrqnue de usuario que carga las curvas de clibracion al inicio no puede ser creada, porque el directorio de autoarranque del usuario no se puede determinar.", "error.cal_extraction": "La calibracion no puede ser extraida de “%s”.", "error.calibration.file_missing": "El archivo de calibración “%s” no se encuentra.", "error.calibration.file_not_created": "El archivo de calibración no ha sido creado.", "error.copy_failed": "El archivo “%s” no se puede copiar en “%s”.", "error.deletion": "Ocurrio un error mientras se movian archivos a %s. Algunos archivos no se han eliminado.", "error.dir_creation": "El directorio “%s” no puede ser creado. Quizás haya restricciones de acceso. Por favor permita el acceso de escritura o escoja otro directorio.", "error.dir_notdir": "El directorio “%s” no puede ser creado, porque otro objeto del mismo nombre existe. Por favor escoja otro directorio.", "error.file.create": "El archivo “%s” no se puede crear.", "error.file.open": "El archivo “%s” no se puede abrir.", "error.file_type_unsupported": "Tipo de archivo no soportado.", "error.generic": "Un error de sistema ha ocurrido.\n\nCodigo de error: %s\nMensaje de error: %s", "*error.luminance.invalid": "The measured peak luminance was invalid. Make sure the instrument sensor is not blocked, and remove any protective cap (if present).", "error.measurement.file_invalid": "El archivo de medicion „%s“ no es valido.", "error.measurement.file_missing": "El archivo de medición “%s” no se encuentra.", "error.measurement.file_not_created": "No se ha creado archivo de medición.", "error.measurement.missing_spectral": "El archivo de medicion no contiene valores espectrales.", "error.measurement.one_colorimeter": "Se necesita exactamente una medicion de colorimetro.", "error.measurement.one_reference": "Se necesita exactamente una medicion de referencia.", "*error.no_files_extracted_from_archive": "No files have been extracted from “%s”.", "*error.not_a_session_archive": "The archive “%s” doesn't seem to be a session archive.", "error.profile.file_missing": "El perfil “%s” no se encuentra.", "error.profile.file_not_created": "Ningun perfil ha sido creado.", "error.source_dest_same": "El archivo de origen y destino es el mismo.", "error.testchart.creation_failed": "El archivo de carta de ajustes “%s” no puede ser creado. Quizas haya restricciones de acceso, o el archivo de origen no existe.", "error.testchart.invalid": "El archivo de carta de ajustes “%s” no es valido.", "error.testchart.missing": "El archivo de carta de ajustes “%s” no se encuentra.", "error.testchart.missing_fields": "El archivo de carta de ajustes „%s“ no contiene los campos requeridos: %s", "error.testchart.read": "El archivo de carta de ajustes “%s” no se puede leer.", "error.tmp_creation": "No se puede crear directorio de trabajo temporal.", "error.trashcan_unavailable": "El %s no esta disponible. No se eliminaron archivos.", "*errors.none_found": "No errors found.", "*estimated_measurement_time": "Estimated measurement time approximately %s hour(s) %s minutes", "*exceptions": "Exceptions...", "*executable": "Executable", "export": "Exportar...", "extra_args": "Establecer argumentos adicionales de línea de comandos...", "*factory_default": "Factory Default", "failure": "...fallado!", "*file.hash.malformed": "The integrity of %s cannot be verified because the checksum file is malformed.", "*file.hash.missing": "The integrity of %s cannot be verified because it doesn't have an entry in the checksum file.", "*file.hash.verification.fail": "Checksum verification failed for %s:\n\nExpected %s\nActual %s", "*file.invalid": "File invalid.", "file.missing": "El archivo no existe “%s” no existe.", "file.notfile": "“%s” no es un archivo.", "file.select": "Seleccionar archivo", "*filename": "File name", "*filename.upload": "Upload filename", "*filetype.7z": "7-Zip files", "filetype.any": "Cualquier tipo de archivo", "filetype.cal": "Archivos de calibracion (*.cal)", "filetype.cal_icc": "Archivos de calibracion y perfiles (*.cal;*.icc;*.icm)", "filetype.ccmx": "Matrices de correccion/Ejemplos de calibration espectral (*.ccmx;*.ccss)", "filetype.html": "Archivos HTML (*.html;*.htm)", "filetype.icc": "Archivos de perfil (*.icc;*.icm)", "filetype.icc_mpp": "Archivos de perfil (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "Archivos carta de pruebas (*.icc;*.icm;*.ti1;*.ti3)", "filetype.icc_ti3": "Archivos de medicion (*.icc;*.icm;*.ti3)", "filetype.log": "Archivos Log (*.log)", "filetype.png": "Portable Network Graphics (*.png)", "*filetype.tgz": "Compressed TAR archive", "filetype.ti1": "Archivos carta de ajustes (*.ti1)", "filetype.ti1_ti3_txt": "Archivos de carta de ajustes (*.ti1), Archivos de medicion (*.ti3;*.txt)", "filetype.ti3": "Archivos de medicion (*.icc;*.icm;*.ti3)", "filetype.tif": "Tagged Image File (*.tif)", "filetype.txt": "Correcciones periferico.txt", "*filetype.vrml": "VRML files (*.wrl)", "*filetype.x3d": "X3D files (*.x3d)", "*filetype.zip": "ZIP files", "*film_scanner": "Film scanner", "*film_writer": "Film writer", "*finish": "Finish", "*flare": "Flare", "*flexography": "Flexography", "*focal_plane_colorimetry_estimates": "Focal plane colorimetry estimates", "*forced": "forced", "*format.select": "Please select the desired format.", "*fullscreen.message": "Fullscreen mode activated.\nPress ESC to leave fullscreen.", "*fullscreen.osx.warning": "If you enter fullscreen mode using the zoom button in the window title bar, please press CMD + TAB to switch back to normal mode after the window has been closed. Alternatively, you can go fullscreen by double-clicking the title bar or holding the OPTION key while clicking the zoom button.", "gamap.default_intent": "Intento de renderizado por defecto para el perfil de la pantalla", "gamap.intents.a": "Absoluto colorimetrico", "gamap.intents.aa": "Apariencia absoluto", "gamap.intents.aw": "Colorimetrico absoluto con escalado de punto blanco", "gamap.intents.la": "Apariencia de luminancia ajustada", "*gamap.intents.lp": "Luminance preserving perceptual appearance", "gamap.intents.ms": "Preservar saturacion", "gamap.intents.p": "Perceptual", "gamap.intents.pa": "Apariencia perceptual", "gamap.intents.r": "Relativo colorimetrico", "gamap.intents.s": "Saturacion", "gamap.out_viewcond": "Condiciones de visualizacion de salida", "gamap.perceptual": "Aplicar mapeado de gama a la tabla perceptual", "gamap.profile": "Perfil de origen", "gamap.saturation": "Aplicar mapeado de gama a la tabla saturacion", "gamap.src_viewcond": "Condiciones de visualizacion de entrada", "gamap.viewconds.cx": "Cortar hoja de transparencias en una caja de luz", "gamap.viewconds.jd": "Proyector en entorno oscuro", "gamap.viewconds.jm": "Proyector en entorno tenue", "gamap.viewconds.mb": "Monitor en entorno de trabajo claro", "gamap.viewconds.md": "Monitor en entorno de trabajo oscuro", "gamap.viewconds.mt": "Monitor en entorno de trabajo tipico", "gamap.viewconds.ob": "Escena original - Exteriores claro", "*gamap.viewconds.pc": "Critical print evaluation environment (ISO-3664 P1)", "gamap.viewconds.pcd": "Photo CD - Escena original exteriores", "gamap.viewconds.pe": "Evaluacion entorno de impresion (CIE 116-1995)", "gamap.viewconds.pp": "Impresion reflexiva practica (ISO-3664 P2)", "*gamap.viewconds.tv": "Television/film studio", "gamapframe.title": "Opciones de mapeado de gama avanzadas", "gamut": "Gama", "gamut.coverage": "Cobertura de la gama", "gamut.view.create": "Generanado vistas de gama...", "gamut.volume": "Volumen de gama", "*gamut_mapping.ciecam02": "CIECAM02 gamut mapping", "*gamut_mapping.mode": "Gamut mapping mode", "*gamut_mapping.mode.b2a": "PCS-to-device", "*gamut_mapping.mode.inverse_a2b": "Inverse device-to-PCS", "gamut_plot.tooltip": "Pulsar y arrastrar el raton dentro de la zona para mover el punto de vision, o hacer zoom con la rueda del raton y +/- teclas. Doble pulsacion reinicia el punto de vision.", "*generic_name_value_data": "Generic name-value data", "*geometry": "Geometry", "glossy": "Brillante", "*go_to": "Go to %s", "go_to_website": "ir a la pagina web", "*gravure": "Gravure", "*gray_tone_response_curve": "Gray tone response curve", "grayscale": "escala de gris", "green": "Verde", "*green_gamma": "Green gamma", "*green_lab": "Green L*a*b*", "*green_matrix_column": "Green matrix column", "*green_maximum": "Green maximum", "*green_minimum": "Green minimum", "*green_tone_response_curve": "Green tone response curve", "*green_xyz": "Green XYZ", "*grid_steps": "Grid Steps", "hdmi": "HDMI", "*hdr_maxcll": "Maximum content light level", "*hdr_mincll": "Minimum content light level", "*header": "Display calibration and characterization powered by ArgyllCMS", "help_support": "Ayuda y soporte...", "*host.invalid.lookup_failed": "Invalid host (address lookup failed)", "hue": "Color", "*icc_absolute_colorimetric": "ICC-absolute colorimetric", "*icc_version": "ICC version", "*if_available": "if available", "*illuminant": "Illuminant", "*illuminant_relative_cct": "Illuminant-relative CCT", "*illuminant_relative_lab": "Illuminant-relative L*a*b*", "*illuminant_relative_xyz": "Illuminant-relative XYZ", "*illuminant_xyz": "Illuminant XYZ", "illumination": "Iluminacion", "in": "Entrada", "*info.3dlut_settings": "A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction.\n\nCreating several (additional) 3D LUTs from an existing profile\nWith the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox.\n\nChoosing the right source colorspace and tone response curve\nFor 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%.\n\n“Absolute” vs. “relative” gamma\nTo accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly.\n“Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero).\n“Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve.\n\nRendering intent\nIf you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required).", "*info.calibration_settings": "Calibration is done by interactively adjusting the display to meet the chosen whitepoint and/or luminance as well as optionally creating 1D LUT calibration curves (LUT = Look Up Table) to meet the chosen tone response curve and ensure gray balance. Note that if during calibration you only want to adjust the display and skip the generation of 1D LUT curves, you need to set the tone response curve to “As measured”. 1D LUT calibration can not be used for full display color correction, you need to create a ICC device profile or 3D LUT and use them with applications that support them for that purpose. 1D LUT calibration complements profiling and 3D LUT calibration though.", "*info.display_instrument": "If your display is a OLED, Plasma or other technology with variable light output depending on picture content, enable white level drift compensation.\n\nIf your instrument is a spectrometer and you use it in contact mode on a display with stable black level, you may want to enable instrument black level drift compensation.\n\nIf your instrument is a colorimeter, you should use a measurement mode and/or correction suitable for your display or display technology type. Note that some instruments (ColorHug, ColorHug2, K-10, Spyder4/5) may have a correction built into some of their measurement modes.", "*info.display_instrument.warmup": "You should let the display warm up for at least 30 minutes before commencing measurements. If you use your instrument in contact mode, it is a good idea to leave it on the display during that time as well.", "*info.mr_settings": "You can verify the accuracy of an ICC profile or 3D LUT via a measurement report that contains detailed statistics about the color errors of the measured patches.\n\nWhen verifying a 3D LUT, make sure to use the same settings as the 3D LUT was created with.", "*info.profile_settings": "Profiling is the process of characterizing the display and recording its response in a ICC device profile. The ICC device profile can be used by applications that support ICC color management for full display color correction, and/or it can be used to create a 3D LUT (LUT = Look Up Table) which serves the same purpose for applications that support 3D LUTs.\n\nThe amount of patches measured influences the attainable accuracy of the resulting profile. For a reasonable quality 3x3 matrix and curves based profile, a few dozen patches can be enough if the display has good additive color mixing properties and linearity. Some professional displays fall into that category. If the highest possible accuracy is desired, a LUT-based profile from around several hundred up to several thousand patches is recommended. The “Auto-optimized” testchart setting automatically takes into account the non-linearities and actual response of the display, and should be used for best quality results. With this, you can adjust a slider to choose a compromise between resulting profile accuracy and measurement as well as computation time.", "infoframe.default_text": "", "infoframe.title": "Info", "infoframe.toggle": "Mostrar/ocultar ventana de informacion", "initial": "Inicial", "initializing_gui": "Inicializando GUI...", "*ink_jet_printer": "Ink jet printer", "*input_device_profile": "Input device profile", "*input_table": "Input Table", "install_display_profile": "Instalar perfil del monitor...", "*install_local_system": "Install system-wide", "*install_user": "Install for current user only", "instrument": "Instrumento/Puerto", "instrument.calibrate": "Poner el instrumento en una superficie oscura, mate o en su placa y presionar OK para calibrar el instrumento.", "instrument.calibrate.colormunki": "Poner el sensor ColorMunki en posicion de calibracion y presionar OK para calibrar el instrumento.", "*instrument.calibrate.reflective": "Place the instrument onto its reflective white reference serial no. %s and press OK to calibrate the instrument.", "instrument.calibrating": "Calibrando instrumento...", "*instrument.connect": "Please connect your measurement instrument now.", "instrument.initializing": "Configurando instrumento, por favor espere...", "instrument.measure_ambient": "Si su instrumento requiere de una tapa especial para medir la luz ambiente, por favor coloquela. Para medir la luz ambiente, coloque el instrumento hacia arriba, al lado de la pantalla. O si desea medir una caja de luz, coloque una carta de gris sin metamerismo dentro de la caja de luz y ponga el instrumento hacia ella. Instrucciones adicionales de como medir la luz ambiente pueden estar disponibles en la documentacion del instrumento. Presione OK para comenzar la medicion.", "instrument.place_on_screen": "Coloque el instrumwento en la ventana de test. Pulse OK. Presione ESC, Q o CTRL^C para abortar, cualquier otra tecla para iniciar la medición.", "*instrument.place_on_screen.madvr": "(%i) Please place your %s on the test area", "*instrument.reposition_sensor": "The measurement failed because the instrument sensor is in the wrong position. Please correct the sensor position, then click OK to continue.", "internal": "Interno", "*invert_selection": "Invert selection", "*is_embedded": "Is embedded", "*is_illuminant": "Is illuminant", "*is_linear": "Is linear", "laptop.icc": "Portatil (Gamma 2.2)", "*libXss.so": "X11 screen saver extension", "*library.not_found.warning": "The library “%s” (%s) was not found. Please make sure it is installed before proceeding.", "license": "Licencia", "license_info": "Licenciado bajo la GPL", "linear": "lineal", "*link.address.copy": "Copy link address", "log.autoshow": "Mostar ventana de log automaticamente", "*luminance": "Luminance", "lut_access": "Acceso a calibración", "*madhcnet.outdated": "The installed version of %s found at %s is outdated. Please update to the latest madVR version (at least %i.%i.%i.%i).", "*madtpg.launch.failure": "madTPG was not found or could not be launched.", "*madvr.not_found": "madVR DirectShow filter was not found in the registry. Please make sure it is installed.", "*madvr.outdated": "The used version of madVR is outdated. Please update to the latest version (at least %i.%i.%i.%i).", "*madvr.wrong_levels_detected": "The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235).", "magenta": "Magenta", "*make_and_model": "Make and model", "*manufacturer": "Manufacturer", "*mastering_display_black_luminance": "Mastering display black level", "*mastering_display_peak_luminance": "Mastering display peak luminance", "matrix": "Matriz", "matte": "Mate", "max": "Max", "maximal": "Maximo", "measure": "Medicion", "measure.darken_background": "Color de fondo negro", "*measure.darken_background.warning": "Attention: If „black background“ is chosen, it will cover the whole screen and you will not be able to see the display adjustment window! If you have a multi-screen setup, move the display adjustment window to another screen before starting the measurement, or use the keyboard (to abort the measurement, press Q. If the measurement is already running, wait briefly, then press Q again).", "*measure.override_display_settle_time_mult": "Override display settle time multiplier", "*measure.override_min_display_update_delay_ms": "Override minimum display update delay", "measure.testchart": "Carta de pruebas de ajustes", "measureframe.center": "Centro", "measureframe.info": "Mover la ventana de medicion a la posición de pantalla deseada y redimensionarla si es necesario. Aproximadamente todo el area de la ventana se utilizara para mostrar los parches de medicion, el circulo es como una guia para ayudarle a situar su instrumento de medicion.\nSitue el instrumento de medicion en la pantalla y pulse en „Comenzar medicion“. Para cancelar y volver a la pantalla principal, cierre la ventana de medicion.", "measureframe.measurebutton": "Comenzar medicion", "measureframe.title": "Area de medicion", "measureframe.zoomin": "Aumentar", "measureframe.zoommax": "Maximizar/Restaurar", "measureframe.zoomnormal": "Tamaño normal", "measureframe.zoomout": "Encoger", "measurement.play_sound": "Aviso acustico en la medicion continua", "*measurement.untethered": "Untethered measurement", "*measurement_file.check_sanity": "Check measurement file...", "*measurement_file.check_sanity.auto": "Check measurement files automatically", "*measurement_file.check_sanity.auto.warning": "Please note automatic checking of measurements is an experimental feature. Use at own risk.", "measurement_file.choose": "Por favor seleccione un archivo de medicion", "measurement_file.choose.colorimeter": "Por favor seleccione un archivo de medicion de colorimetro", "measurement_file.choose.reference": "Por favor seleccione un archivo de medicion de referencia", "measurement_mode": "Tipo", "measurement_mode.adaptive": "Adaptivo", "*measurement_mode.dlp": "DLP", "measurement_mode.factory": "Calibration de fabrica", "*measurement_mode.generic": "Generic", "measurement_mode.highres": "AltaRes", "measurement_mode.lcd": "LCD (genérico)", "measurement_mode.lcd.ccfl": "LCD (CCFL)", "measurement_mode.lcd.ccfl.2": "LCD (CCFL Type 2)", "*measurement_mode.lcd.oled": "LCD (OLED)", "measurement_mode.lcd.white_led": "LCD (LED Blanco)", "measurement_mode.lcd.wide_gamut.ccfl": "LCD Gama Amplia(CCFL)", "measurement_mode.lcd.wide_gamut.rgb_led": "LCD Gama Amplia (RGB LED)", "measurement_mode.raw": "Raw", "measurement_mode.refresh": "Refresco (generico)", "*measurement_report": "Measurement report...", "*measurement_report.update": "Update measurement or uniformity report...", "measurement_report_choose_chart": "Por favor seleccione la carta de ajustes a medir.", "measurement_report_choose_chart_or_reference": "Por favor seleccione una carta de ajustes o referencia.", "measurement_report_choose_profile": "Por favor seleccione el perfil a validar.", "*measurement_type": "Measurement type", "measurements.complete": "Mediciones completadas! ¿Desea abrir la carpeta que contiene los archivos de medicion?", "measuring.characterization": "Midiendo muestras de color para caracterizacion...", "*media_black_point": "Media black point", "*media_relative_colorimetric": "Media-relative colorimetric", "*media_white_point": "Media white point", "menu.about": "Acerca...", "menu.file": "Archivo", "menu.help": "?", "menu.language": "Idioma", "menu.options": "Opciones", "menu.tools": "Herramientas", "menuitem.quit": "Salir", "menuitem.set_argyll_bin": "Localizar ejecutables de ArgyllCMS...", "*metadata": "Metadata", "*method": "Method", "min": "Min", "minimal": "Minimo", "*model": "Model", "*motion_picture_film_scanner": "Motion picture film scanner", "*mswin.open_display_settings": "Open Windows display settings...", "*named_color_profile": "Named color profile", "*named_colors": "Named colors", "native": "Nativo", "*negative": "Negative", "no": "No", "no_settings": "El archivo no contiene ajustes.", "*none": "None", "*not_applicable": "Not applicable", "*not_connected": "Not connected", "*not_found": "“%s” was not found.", "*not_now": "Not now", "*number_of_entries": "Number of entries", "*number_of_entries_per_channel": "Number of entries per channel", "*observer": "Observer", "*observer.1931_2": "CIE 1931 2°", "*observer.1955_2": "Stiles & Birch 1955 2°", "*observer.1964_10": "CIE 1964 10°", "*observer.1964_10c": "CIE 1964 10° / 1931 2° hybrid", "*observer.1978_2": "Judd & Voss 1978 2°", "*observer.2012_2": "CIE 2012 2°", "*observer.2012_10": "CIE 2012 10°", "*observer.shaw": "Shaw & Fairchild 1997 2°", "*oem.import.auto": "If your colorimeter came with a software CD for Windows, please insert it now (abort any possibly automatic software installation).\n\nIf you don't have a CD and the required files cannot be found otherwise, they will be downloaded from the Web.", "*oem.import.auto.download_selection": "A preselection was made based on the detected instrument(s). Please select the file(s) to download.", "*oem.import.auto_windows": "If the vendor software for your colorimeter is installed, the required files can be found automatically in most cases.", "office_web.icc": "Oficina y Web (D65, Gamma 2.2)", "offset": "Offset", "*offset_lithography": "Offset lithography", "ok": "OK", "or": "o", "osd": "OSD", "other": "Otro", "out": "Salida", "*out_of_gamut_tag": "Out of gamut tag", "output.profile": "Perfil de destino", "*output_device_profile": "Output device profile", "*output_levels": "Output levels", "*output_offset": "Output offset", "*output_table": "Output Table", "overwrite": "Sobreescribir", "panel.surface": "Superficie del panel", "panel.type": "Tipo de panel", "*passive_matrix_display": "Passive matrix display", "*patch.layout.select": "Please select a patch layout:", "patches": "Parches", "*patterngenerator.prisma.specify_host": "Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234", "*patterngenerator.sync_lost": "Lost sync with the pattern generator.", "pause": "Pausa", "*pcs_illuminant_xyz": "PCS illuminant XYZ", "*pcs_relative_cct": "PCS-relative CCT", "*pcs_relative_lab": "PCS-relative L*a*b*", "*pcs_relative_xyz": "PCS-relative XYZ", "*pcs_to_device_intent_0": "PCS to device: Intent 0", "*pcs_to_device_intent_1": "PCS to device: Intent 1", "*pcs_to_device_intent_2": "PCS to device: Intent 2", "*perceptual": "Perceptual", "photo.icc": "Foto (D50, Gamma 2.2)", "*photo_imagesetter": "Photo imagesetter", "*photographic_paper_printer": "Photographic paper printer", "*platform": "Platform", "please_wait": "Por favor esperar...", "*port.invalid": "Invalid port: %s", "*positive": "Positive", "*preferred_cmm": "Preferred CMM", "prepress.icc": "Preprensa (D50, 130 cd/m², L*)", "preset": "Preestablecido", "preview": "Previo", "profile": "Perfil", "profile.advanced_gamap": "Avanzado...", "*profile.b2a.hires": "Enhance effective resolution of colorimetric PCS-to-device table", "*profile.b2a.lowres.warning": "The profile is seemingly missing high-quality PCS-to-device tables, which are essential for proper operation. Do you want to generate high-quality tables now? This will take a few minutes.", "*profile.b2a.smooth": "Smoothing", "*profile.choose": "Please choose a profile.", "*profile.confirm_regeneration": "Do you want to regenerate the profile?", "profile.current": "Perfil actual", "profile.do_not_install": "No instalar el perfil", "*profile.iccv4.unsupported": "Version 4 ICC profiles are not supported.", "*profile.import.success": "The profile has been imported. You may need to manually assign and activate it under “Color” system settings.", "profile.info": "Information de perfil", "profile.info.show": "Mostrar information del perfil", "profile.install": "Instalar el perfil", "profile.install.error": "El perfil no puede ser instalado/activado.", "profile.install.success": "El perfil ha sido instalado y activado.", "*profile.install.warning": "The profile has been installed, but there may be problems.", "profile.install_local_system": "Instalar perfil en todo el sistema", "profile.install_network": "Instalar perfil en toda la red", "profile.install_user": "Instalar perfil solo para el usuario actual", "profile.invalid": "Perfil no valido.", "profile.load_error": "El perfil de pantalla no puede ser cargado.", "profile.load_on_login": "Cargar la calibracion en la entrada", "profile.load_on_login.handled_by_os": "Dejar al sistema operativo el manejo de la carga de la calibracion (baja precisión y fiabilidad)", "profile.name": "Nombre del perfil", "profile.name.placeholders": "Debe de utilizar los siguientes argumentos en el nombre de perfil:\n\n%a Nombre del dia de la semana abreviado\n%A Nombre del dia de la semana completo\n%b Nombre del mes abreviado\n%B Nombre del mes completo\n%d Dia del mes\n%H Hora (reloj 24-horas)\n%I Hora (reloj12-horas)\n%j Dia del año\n%m Mes\n%M Minuto\n%p AM/PM\n%S Segundos\n%U Semana (Domingo como primer dia de la semana)\n%w Dia de la semana (domingo es 0)\n%W Semana (Lunes como primer dia de la semana)\n%y Año sin el siglo\n%Y Año con el siglo", "profile.no_embedded_ti3": "El perfil no contiene datos de medicion compatibles con Argyll.", "profile.no_vcgt": "El perfil no contiene curvas de calibracion.", "*profile.only_named_color": "Only profiles of type “Named Color” can be used.", "profile.quality": "Calidad del perfil", "*profile.quality.b2a.low": "Low quality PCS-to-device tables", "*profile.quality.b2a.low.info": "Choose this option if the profile is only going to be used with inverse device-to-PCS gamut mapping to create a device link or 3D LUT", "*profile.required_tags_missing": "The profile is missing required tags: %s", "*profile.self_check": "Profile self check ΔE*76", "*profile.self_check.avg": "average", "*profile.self_check.max": "maximum", "*profile.self_check.rms": "RMS", "profile.set_save_path": "Seleccionar ruta de guardado...", "profile.settings": "Opciones de perfilado", "profile.share": "Subido perfil...", "profile.share.avg_dE_too_high": "El perfil muestra un valor delta E demasiado alto (actual = %s, umbral = %s).", "*profile.share.b2a_resolution_too_low": "The resolution of the profile's PCS to device tables is too low.", "profile.share.enter_info": "Puede compartir su perfil con otros usuarios via el servicio OpenSUSE “ICC Profile Taxi”.\n\nPor favor proporcione una descripcion significativa e introduzca las propiedades de la pantalla mas abajo. Leer ajustes de la pantalla del menu OSD de la misma y aplicar solo las ajustes aplicables a la pantalla que se alteraron de las que trae por defecto.\nEjemplo: Para la mayor parte de las pantallas, estos son los nombres de los preajustes escogidos, brillo, contraste, color temperatura y/o ganancia del punto blanco RGB, asi como la gamma. En portatiles and ultraligeros, habitualmente solo el brillo. Si ha cambiado ajustes adicionales mientras calibraba su pantalla, introduzcalas si es posible.", "profile.share.meta_missing": "El perfil no contiene la meta informacion necesaria.", "profile.share.success": "Perfil subido satisfactoriamente.", "*profile.tags.A2B0.shaper_curves.input": "A2B0 input shaper curves", "*profile.tags.A2B0.shaper_curves.output": "A2B0 output shaper curves", "*profile.tags.A2B1.shaper_curves.input": "A2B1 input shaper curves", "*profile.tags.A2B1.shaper_curves.output": "A2B1 output shaper curves", "*profile.tags.A2B2.shaper_curves.input": "A2B2 input shaper curves", "*profile.tags.A2B2.shaper_curves.output": "A2B2 output shaper curves", "*profile.tags.B2A0.shaper_curves.input": "B2A0 input shaper curves", "*profile.tags.B2A0.shaper_curves.output": "B2A0 output shaper curves", "*profile.tags.B2A1.shaper_curves.input": "B2A1 input shaper curves", "*profile.tags.B2A1.shaper_curves.output": "B2A1 output shaper curves", "*profile.tags.B2A2.shaper_curves.input": "B2A2 input shaper curves", "*profile.tags.B2A2.shaper_curves.output": "B2A2 output shaper curves", "profile.testchart_recommendation": "Para un perfil de mayor calidad, es recomendable una carta de ajustes con mas parches, pero llevará mas tiempo medirla. ¿Desea usar la carta de ajustes recomendada?", "profile.type": "Tipo de perfil", "profile.type.gamma_matrix": "Gamma + matriz", "profile.type.lut.lab": "L*a*b* LUT", "profile.type.lut.xyz": "XYZ LUT", "profile.type.lut_matrix.xyz": "XYZ LUT + matriz", "profile.type.lut_rg_swapped_matrix.xyz": "XYZ LUT + matriz swapped", "profile.type.shaper_matrix": "Curvas + matriz", "profile.type.single_gamma_matrix": "Gamma simple + matriz", "profile.type.single_shaper_matrix": "Curva simple + matriz", "profile.unsupported": "Tipo de perfil no soportado (%s) y/o espacio de color (%s).", "profile.update": "Actualizar perfil", "*profile_associations": "Profile associations...", "*profile_associations.changing_system_defaults.warning": "You are currently changing system defaults", "*profile_associations.use_my_settings": "Use my settings for this display device", "*profile_class": "Profile class", "*profile_connection_space_pcs": "Profile connection space (PCS)", "*profile_loader": "Profile loader", "*profile_loader.disable": "Disable profile loader", "*profile_loader.exceptions.known_app.error": "The profile loader disables itself automatically while %s is running. You cannot override this behavior.", "*profile_loader.exit_warning": "Do you really want to quit the profile loader? Calibration will no longer be automatically reloaded if you change the display configuration!", "*profile_loader.fix_profile_associations": "Automatically fix profile associations", "*profile_loader.fix_profile_associations_warning": "As long as the profile loader is running, it can take care of profile associations when you change the display configuration.\n\nBefore you proceed, please make sure the profile associations shown above are correct. If they aren't, follow these steps:\n\n1. Open Windows display settings.\n2. Activate all connected displays (extended desktop).\n3. Open profile associations.\n4. Make sure each display device has the correct profile assigned. Then close profile associations.\n5. In Windows display settings, revert to the previous display configuration and close display settings.\n6. Now you can enable “Automatically fix profile associations”.", "*profile_loader.info": "Calibration state was (re)applied %i time(s) so far today.\nRight-click icon for menu.", "*profiling": "Profiling", "profiling.complete": "Perfilado completado!", "profiling.incomplete": "El perfilado todavia no ha terminado.", "*projection_television": "Projection television", "projector": "Proyector", "projector_mode_unavailable": "El modo proyector esta solo disponible con ArgyllCMS 1.1.0 Beta o mas actual.", "quality.ultra.warning": "La calidad Ultra no deberia ser usada nunca, excepto para probar que no deberia ser nunca usada (tiempo muy largo de procesado!). Quizas deberia escoger calidad media o alta.", "readme": "Leame", "ready": "Listo.", "red": "Rojo", "*red_gamma": "Red gamma", "*red_lab": "Red L*a*b*", "*red_matrix_column": "Red matrix column", "*red_maximum": "Red maximum", "*red_minimum": "Red minimum", "*red_tone_response_curve": "Red tone response curve", "*red_xyz": "Red XYZ", "reference": "Referencia", "*reflection_hardcopy_original_colorimetry": "Reflection hardcopy original colorimetry", "*reflection_print_output_colorimetry": "Reflection print output colorimetry", "*reflective": "Reflective", "*reflective_scanner": "Reflective scanner", "*remaining_time": "Remaining time (ca.)", "*remove": "Remove", "rendering_intent": "Intento de renderizado", "*report": "Report", "report.calibrated": "Informe de pantalla calibrada", "report.uncalibrated": "Informe de pantalla no calibrada", "*report.uniformity": "Measure display device uniformity...", "*reset": "Reset", "resources.notfound.error": "Error fatal: no se encuentra el archivo requerido:", "resources.notfound.warning": "Cuidado: no se encuentran algunos archivos requeridos:", "*response.invalid": "Invalid response from %s: %s", "*response.invalid.missing_key": "Invalid response from %s: Missing key “%s”: %s", "*response.invalid.value": "Invalid response from %s: Value of key “%s” does not match expected value “%s”: %s", "restore_defaults": "Restaurar valores por defecto", "rgb.trc": "Funcion de transferencia RGB", "rgb.trc.averaged": "Funcion de transferencia RGB promedio", "sRGB.icc": "sRGB", "saturation": "Saturacion", "save": "Guardar", "save_as": "Guardar como...", "*scene_appearance_estimates": "Scene appearance estimates", "*scene_colorimetry_estimates": "Scene colorimetry estimates", "*scripting-client": "DisplayCAL Scripting Client", "*scripting-client.cmdhelptext": "Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application.", "*scripting-client.detected-hosts": "Detected scripting hosts:", "*select_all": "Select all", "*set_as_default": "Set as default", "setting.keep_current": "Mantener valores actuales", "settings.additional": "ajustes adicionales", "settings.basic": "ajustes basicas", "settings.new": "", "settings_loaded": "Las siguientes ajustes de calibracion han sido cargadas: %s. Otras opciones de calibracion han sido restauradas a sus valores por defecto y las opciones de perfilado no han sido cambiadas. Las curvas calibración han sido cargadas.", "settings_loaded.cal": "El perfil solo contiene ajsutes de calibracion. Otras opciones no se han cambiado. No se han encontrado curvas de calibracion.", "settings_loaded.cal_and_lut": "El perfil solo contiene ajsutes de calibracion. Otras opciones no se han cambiado y las curvas de calibracion se han cargado.", "settings_loaded.cal_and_profile": "Las ajustes han sido cargadas. No se han encontrado curvas calibración.", "settings_loaded.profile": "El perfil contiene solo ajustes del perfil. Otras opciones no han sido cambiadas. No se han encontrado curvas calibración.", "settings_loaded.profile_and_lut": "El perfil contiene solo ajustes del perfil. Otras opciones no han sido cambiadas y las curvas calibración han sido cargadas.", "show_advanced_options": "Mostar opciones avanzadas", "*show_notifications": "Show notifications", "*silkscreen": "Silkscreen", "*simulation_profile": "Simulation profile", "*size": "Size", "*skip_legacy_serial_ports": "Skip legacy serial ports", "*softproof.icc": "Softproof (5800K, 160 cd/m², L*)", "spectral": "Espectral", "*ssl.certificate_verify_failed": "The remote certificate could not be verified.", "*ssl.certificate_verify_failed.root_ca_missing": "The remote certificate could not be verified because no suitable root certificates were found on the local system.", "*ssl.handshake_failure": "Handshake failure. A secure connection could not be established.", "startup": "Comenzando...", "*startup_sound.enable": "Enable startup sound", "success": "...hecho.", "*surround_xyz": "Surround XYZ", "*synthicc.create": "Create synthetic ICC profile...", "target": "Destino", "tc.3d": "Crear archivo 3D de diagnostico", "tc.I": "Cuerpo espacial del dipositivo centrado en rejilla cubica perceptual", "tc.Q": "Llenado de espacio perceptual quasi-random", "tc.R": "Espacio perceptual aleatorio", "tc.adaption": "Adaptacion", "tc.algo": "Distribucion", "tc.angle": "Angulo", "*tc.black": "Black patches", "*tc.dark_emphasis": "Dark region emphasis", "tc.fullspread": "Parches interactivos", "tc.gray": "Parches neutros", "tc.i": "Cuerpo espacial del dipositivo centrado en rejilla cubica", "tc.limit.sphere": "Limitar ejemplos a esfera", "tc.limit.sphere_radius": "Radio", "tc.multidim": "Multidimensional", "tc.multidim.patches": "pasos = %s parches (%s neutral)", "*tc.neutral_axis_emphasis": "Neutral axis emphasis", "tc.ofp": "Punto de ejemplo mas lejano optimizado", "tc.patch": "Parche", "tc.patches.selected": "Seleccionado", "tc.patches.total": "Parches totales", "tc.precond": "Precondicionando perfil", "*tc.precond.notset": "Please select a preconditioning profile.", "tc.preview.create": "Creando previo, por favor espere...", "tc.q": "Llenado del espacio de dispositivo quasi-random", "tc.r": "Espacio del dispositivo aleatorio", "tc.single": "Parches de un canal", "tc.single.perchannel": "Por canal", "tc.t": "Punto de ejemplo lejano incremental", "*tc.vrml.black_offset": "RGB black offset (L*)", "*tc.vrml.use_D50": "Neutral RGB white", "tc.white": "Parches blancos", "*technology": "Technology", "*tempdir_should_still_contain_files": "Created files should still be in the temporary directory “%s”.", "*testchart.add_saturation_sweeps": "Add saturation sweeps", "*testchart.add_ti3_patches": "Add reference patches...", "*testchart.auto_optimize.untethered.unsupported": "The untethered virtual display does not support testchart auto-optimization.", "*testchart.change_patch_order": "Change patch order", "testchart.confirm_select": "Archivo guardado. Desea seleccionar este testchart?", "testchart.create": "Crear archivo de carta de ajustes", "testchart.discard": "Descartar", "testchart.dont_select": "No seleccionar", "testchart.edit": "Editar carta de ajustes...", "*testchart.export.repeat_patch": "Repeat each patch:", "testchart.file": "Carta de ajustes", "testchart.info": "Numero de parches en la carta de ajustes seleccionado", "*testchart.interleave": "Interleave", "*testchart.maximize_RGB_difference": "Maximize RGB difference", "*testchart.maximize_lightness_difference": "Maximize lightness difference", "*testchart.maximize_rec709_luma_difference": "Maximize luma difference", "*testchart.optimize_display_response_delay": "Minimize display response delay", "*testchart.patch_sequence": "Patch sequence", "*testchart.patches_amount": "Amount of patches", "testchart.read": "Leyendo carta de ajustes...", "testchart.save_or_discard": "La carta de ajustes no ha sido guardado.", "testchart.select": "Seleccionar", "*testchart.separate_fixed_points": "Please choose the patches to add in a separate step.", "testchart.set": "Seleccione archivo carta de ajustes...", "*testchart.shift_interleave": "Shift & interleave", "*testchart.sort_RGB_blue_to_top": "Sort RGB blue to top", "*testchart.sort_RGB_cyan_to_top": "Sort RGB cyan to top", "*testchart.sort_RGB_gray_to_top": "Sort RGB gray to top", "*testchart.sort_RGB_green_to_top": "Sort RGB green to top", "*testchart.sort_RGB_magenta_to_top": "Sort RGB magenta to top", "*testchart.sort_RGB_red_to_top": "Sort RGB red to top", "*testchart.sort_RGB_white_to_top": "Sort RGB white to top", "*testchart.sort_RGB_yellow_to_top": "Sort RGB yellow to top", "*testchart.sort_by_BGR": "Sort by BGR", "*testchart.sort_by_HSI": "Sort by HSI", "*testchart.sort_by_HSL": "Sort by HSL", "*testchart.sort_by_HSV": "Sort by HSV", "*testchart.sort_by_L": "Sort by L*", "*testchart.sort_by_RGB": "Sort by RGB", "*testchart.sort_by_RGB_sum": "Sort by sum of RGB", "*testchart.sort_by_rec709_luma": "Sort by luma", "*testchart.vary_RGB_difference": "Vary RGB difference", "*testchart_or_reference": "Testchart or reference", "*thermal_wax_printer": "Thermal wax printer", "tone_values": "Valores tonales", "*transfer_function": "Transfer function", "translations": "Traducciones", "*transparency": "Transparency", "trashcan.linux": "papelera", "trashcan.mac": "papelera", "trashcan.windows": "papelera de reciclaje", "trc": "Curva tonal", "*trc.dicom": "DICOM", "trc.gamma": "Gamma", "*trc.hlg": "Hybrid Log-Gamma", "trc.lstar": "L*", "trc.rec709": "Rec. 709", "trc.rec1886": "Rec. 1886", "trc.should_use_viewcond_adjust": "Cuando se usan las curvas SMPTE 240M, Rec. 709 o sRGB, debe usar un ajuste en las condiciones de visualizacion para los niveles de luz ambiente tan buenos como pueda para obtener los resultados que desee. Para hacer esto, marque la casilla cerca de “Nivel de luz ambiente” e introduzca un valor en Lux. Opcionalmente puede medir la luz ambiente cuando realiza una calibracion, si lo soporta su instrumento.", "trc.smpte240m": "SMPTE 240M", "*trc.smpte2084": "SMPTE 2084", "*trc.smpte2084.hardclip": "SMPTE 2084 (hard clip)", "*trc.smpte2084.rolloffclip": "SMPTE 2084 (roll-off)", "trc.srgb": "sRGB", "trc.type.absolute": "Absoluto", "trc.type.relative": "Relativo", "turn_off": "Desactivar", "type": "Tipo", "*udev_hotplug.unavailable": "Neither udev nor hotplug detected.", "*unassigned": "Unassigned", "uninstall": "Desinstalar", "uninstall_display_profile": "Desinstalar perfil de pantalla...", "unknown": "desconocido", "*unmodified": "Unmodified", "unnamed": "Sin nombre", "*unspecified": "Unspecified", "update_check": "Comprobar actualizacion de la aplicacion...", "update_check.fail": "Comprobar fallo de actualizacion de la aplicacion:", "update_check.fail.version": "Version del archivo remoto desde el servidor %s no se pudo analizar.", "update_check.new_version": "Una actualizacion esta disponible: %s", "update_check.onstartup": "Comprobar actualizacion de la aplicacion al inicio", "update_check.uptodate": "%s esta actualizada.", "*update_now": "Update now", "upload": "Subir", "*use_fancy_progress": "Use fancy progress dialog", "use_separate_lut_access": "Usar acceso separado a la tabla de gamma de la tarjeta grafica ", "*use_simulation_profile_as_output": "Use simulation profile as display profile", "vcgt": "Curvas de calibracion", "*vcgt.mismatch": "The video card gamma tables for display %s do not match the desired state.", "*vcgt.unknown_format": "Unknown video card gamma table format in profile “%s”.", "*verification": "Verification", "*verification.settings": "Verification settings", "verify.ti1": "Carta de ajustes de verificacion de perfil", "verify_extended.ti1": "Carta de ajustes de verificacion de perfil extendida", "*verify_grayscale.ti1": "Graybalance verification testchart", "*verify_large.ti1": "Large verification testchart", "*verify_video.ti1": "Verification testchart (video)", "*verify_video_extended.ti1": "Extended verification testchart (video)", "*verify_video_extended_hlg_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, Hybrid Log-Gamma)", "*verify_video_extended_smpte2084_100_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²)", "*verify_video_extended_smpte2084_200_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²)", "*verify_video_extended_smpte2084_500_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²)", "*verify_video_extended_smpte2084_1000_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²)", "*verify_video_large.ti1": "Large verification testchart (video)", "*verify_video_xl.ti1": "Extra large verification testchart (video)", "*verify_video_xxl.ti1": "XXL verification testchart (video)", "*verify_video_xxxl.ti1": "XXXL verification testchart (video)", "*verify_xl.ti1": "Extra large verification testchart", "*verify_xxl.ti1": "XXL verification testchart", "*verify_xxxl.ti1": "XXXL verification testchart", "vga": "VGA", "video.icc": "Video (D65, Rec. 1886)", "*video_Prisma.icc": "Video 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886)", "*video_ReShade.icc": "Video 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886)", "*video_camera": "Video camera", "*video_card_gamma_table": "Video card gamma table", "*video_eeColor.icc": "Video 3D LUT for eeColor (D65, Rec. 709 / Rec. 1886)", "*video_madVR.icc": "Video 3D LUT for madVR (D65, Rec. 709 / Rec. 1886)", "*video_madVR_ST2084.icc": "Video 3D LUT for madVR HDR (D65, Rec. 2020 / SMPTE 2084)", "*video_monitor": "Video monitor", "*video_resolve.icc": "Video 3D LUT for Resolve (D65, Rec. 709 / Rec. 1886)", "*view.3d": "3D view", "*viewing_conditions": "Viewing conditions", "*viewing_conditions_description": "Viewing conditions description", "*vrml_to_x3d_converter": "VRML to X3D converter", "warning": "Cuidado", "warning.already_exists": "El archivo “%s” ya existe en la localizacion escogida y será sobreescrito. Desea continuar?", "warning.autostart_system": "El directorio de autoarranque del sistema no se pudo determinar.", "warning.autostart_user": "El directorio de autoarranque específico del usuario no se pudo determinar.", "warning.discard_changes": "¿Realmente desea descartar los cambios en la configuración actual?", "*warning.input_value_clipping": "Warning: Values below the display profile blackpoint will be clipped!", "*warning.suspicious_delta_e": "Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful.\n\nOne or all of the following criteria matched:\n\n• Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other.\n• RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*).\n• RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*).\n• Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers.\n\nThis could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values.", "*warning.suspicious_delta_e.info": "Explanation of the Δ columns:\n\nΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low.\n\n0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation.\n\nΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers.", "*warning.system_file": "Warning: “%s” is a system file. Do you really want to continue?", "*webserver.waiting": "Webserver waiting at", "*welcome": "Welcome!", "*welcome_back": "Welcome back!", "white": "Blanco", "whitepoint": "Punto blanco", "whitepoint.colortemp": "Temperatura", "whitepoint.colortemp.locus.blackbody": "Cuerpo negro", "whitepoint.colortemp.locus.curve": "Curva de la temperatura de color", "whitepoint.colortemp.locus.daylight": "Luz dia", "whitepoint.set": "¿También desea establecer el punto blanco con el valor medido?", "*whitepoint.simulate": "Simulate whitepoint", "*whitepoint.simulate.relative": "Relative to display profile whitepoint", "*whitepoint.visual_editor": "Visual whitepoint editor", "*whitepoint.visual_editor.display_changed.warning": "Attention: The display configuration has changed and the visual whitepoint editor may no longer be able to correctly restore display profiles. Please check display profile associations carefully after closing the editor and restart DisplayCAL.", "whitepoint.xy": "Coordenadas cromaticidad", "window.title": "DisplayCAL", "*windows.version.unsupported": "This version of Windows is not supported.", "*windows_only": "Windows only", "working_dir": "Directorio de trabajo:", "yellow": "Amarillo", "*yellow_lab": "Yellow L*a*b*", "*yellow_xyz": "Yellow XYZ", "yes": "Si", } DisplayCAL-3.5.0.0/DisplayCAL/lang/fr.json0000644000076500000000000027616513242301041017655 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "Loïc Guégant, François Leclerc, Jean-Luc Coulon", "!language": "Français", "!language_name": "FRENCH", "3dlut": "LUT 3D", "3dlut.1dlut.videolut.nonlinear": "L’étalonnage des tables de gamma de la table de correspondance (« LUT ») 1D de la carte vidéo du périphérique d’affichage n’est pas linéaire, mais la table de correspondance 3D contient l’étalonnage appliqué de la table de correspondance 1D. Assurez-vous de réinitialiser manuellement les tables de gamma de la carte vidéo à une valeur linéaire avant d’utiliser la table de correspondance 3D, ou créez une table de correspondance 3D sans avoir d’étalonnage appliqué (pour ce faire, activez « Afficher les options avancées » dans le menu « Options » et désactivez « Appliquer l’étalonnage (vcgt) » ainsi que « Créer une table de correspondance 3D après la caractérisation » dans les paramètres de table de correspondance 3D, créez ensuite une nouvelle table de correspondance 3D).", "3dlut.bitdepth.input": "Profondeur des couleurs d’entrée de la table de correspondance 3D", "3dlut.bitdepth.output": "Profondeur des couleurs de sortie de la table de correspondance 3D", "3dlut.confirm_relcol_rendering_intent": "Voulez-vous que la LUT 3D utilise aussi le point blanc mesuré (l’intention de rendu de la LUT 3D sera défini à colorimétrie relative) ?", "3dlut.content.colorspace": "Espace de couleur du contenu", "3dlut.create": "Créer une table de correspondance 3D…", "3dlut.create_after_profiling": "Créer la table de correspondance 3D après la caractérisation", "3dlut.enable": "Activer la LUT 3D", "3dlut.encoding.input": "Encodage d’entrée", "3dlut.encoding.output": "Encodage de sortie", "3dlut.encoding.output.warning.madvr": "Attention : cet encodage de sortie n'est pas recommandé et provoquera un écrêtage si madVR n'est pas configuré en sortie « TV levels (16-235) » dans l’onglet « Périphériques » → « %s » → « Propriétés ». À utiliser à vos propres risques !", "3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "3dlut.encoding.type_C": "TV Rec. 2020 à Luminance constante YCbCr UHD", "3dlut.encoding.type_T": "TV RVB 16-235 (clip WTW)", "3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "3dlut.encoding.type_n": "plage RVB complète 0-255", "3dlut.encoding.type_t": "TV RVB 16-235", "3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (primaires Rec. 709) SD", "3dlut.format": "Format de fichier de table de correspondance 3D", "3dlut.format.3dl": "Autodesk / Kodak (.3dl)", "3dlut.format.ReShade": "ReShade (.png, .fx)", "3dlut.format.cube": "IRIDAS (.cube)", "3dlut.format.eeColor": "eeColor Processor (.txt)", "3dlut.format.icc": "Profil de lien de périphérique (.icc/.icm)", "3dlut.format.madVR": "madVR (.3dlut)", "3dlut.format.madVR.hdr": "Traiter un contenu HDR", "3dlut.format.madVR.hdr.confirm": "Notez que vous devez avoir caractérisé l’écran en mode HDR. Si l’écran ne prend pas en charge la HDR de manière native, clicquer « Abandonner ».", "3dlut.format.madVR.hdr_to_sdr": "Convertir le contenu HDR en SDR", "3dlut.format.mga": "Pandora (.mga)", "3dlut.format.png": "PNG (.png)", "3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "3dlut.frame.title": "Création une table de correspondance 3D", "*3dlut.hdr.rolloff.diffuse_white": "Diffuse white (reference 94.38 cd/m²)", "*3dlut.hdr.system_gamma": "System gamma (reference 1.2)", "3dlut.holder.assign_preset": "Assigner la LUT 3D au préréglage :", "3dlut.holder.out_of_memory": "%s se trouve hors de l’espace de stockage de la LUT 3D (il faut au moins %i Ko). Veuillez supprimer quelques LUT 3D de %s afin de libérer de la place pour de nouvelles. Voyez votre documentation de %s pour davantage d’informations.", "3dlut.input.colorspace": "Espace de couleurs source", "3dlut.input.profile": "Profil source", "3dlut.install": "Installer la LUT 3D", "3dlut.install.failure": "Échec de l’installation de la table de correspondance 3D (erreur inconnue).", "3dlut.install.success": "Table de correspondance 3D installée avec succès !", "3dlut.install.unsupported": "L’installation automatique de la table de correspondance 3D n'est pas prise en charge pour le format de table de correspondance 3D indiqué.", "3dlut.save_as": "Enregistrer la table de correspondance 3D sous…", "3dlut.settings": "Paramètres de la table de correspondance 3D", "3dlut.size": "Taille de la table de correspondance 3D", "3dlut.tab.enable": "Activer l’onglet de table de correspondance 3D", "3dlut.use_abstract_profile": "Profil abstrait (« Look »)", "CMP_Digital_Target-3.cie": "CMP Digital Target 3", "CMP_Digital_Target-4.cie": "CMP Digital Target 4", "CMYK_IDEAlliance_ControlStrip_2009.ti1": "IDEAlliance Control Strip 2009", "CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": "Bande de contrôle 2013 CMYK IDEAlliance ISO 12647-7", "CMYK_ISO_12647-7_outer_gamut.ti1": "Gamut externe CMYK ISO 12647-7", "ColorChecker.cie": "ColorChecker", "ColorCheckerDC.cie": "ColorChecker DC", "ColorCheckerPassport.cie": "ColorChecker Passport", "ColorCheckerSG.cie": "ColorChecker SG", "FograStrip2.ti1": "Fogra Media Wedge CMYK V2.0", "FograStrip3.ti1": "Fogra Media Wedge CMYK V3.0", "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008 précision des couleurs et équilibre du gris", "ISO_14861_color_accuracy_RGB318.ti1": "Précision de la couleur et équilibre du gris ISO 14861:2015", "QPcard_201.cie": "QPcard 201", "QPcard_202.cie": "QPcard 202", "SpyderChecker.cie": "SpyderCHECKR", "Untethered": "Non connecté", "[rgb]TRC": "Courbes de réponse de tonalité", "aborted": "… interrompu.", "aborting": "Interruption, veuillez patienter (cela peut prendre quelques secondes)…", "abstract_profile": "Profil abstrait", "active_matrix_display": "Affichage à matrice active", "adaptive_mode_unavailable": "Le mode adaptatif n'est disponible qu’avec ArgyllCMS 1.1.0 RC3 ou ultérieur.", "add": "Ajouter…", "advanced": "Avancé", "allow_skip_sensor_cal": "Permettre de passer outre l’auto-étalonnage du spectromètre", "ambient.measure": "Mesurer la lumière ambiante", "ambient.measure.color.unsupported": "%s : la couleur de la lumière ambiante ne peut pas être déterminée avec la sonde de mesure choisie car son capteur semble être monochromatique (seul un niveau de lumière a pu être mesuré).", "ambient.measure.light_level.missing": "Impossible d’obtenir une lecture du niveau de lumière", "ambient.set": "Voulez-vous également régler le niveau de lumière ambiante à la valeur mesurée ?", "app.client.connect": "Client de scripting %s:%s connecté", "app.client.disconnect": "Client de scripting %s:%s déconnecté", "app.client.ignored": "Tentative de connexion refusée du client de scripting %s:%s: %s", "app.client.network.disallowed": "Tentative de connexion refusée du client de scripting %s:%s : les clients réseau ne sont pas autorisés.", "app.confirm_restore_defaults": "Voulez-vous réellement annuler vos modifications et restaurer les valeurs par défaut ?", "app.detected": "%s a été détecté.", "app.detected.calibration_loading_disabled": "%s détecté. Chargemnt des courbes d’étalonnage désactivé.", "app.detection_lost": "%s n’est plus détecté.", "app.detection_lost.calibration_loading_enabled": "%s n’est plus détecté. Chargement des courbes d’étalonnage activé.", "app.incoming_message": "Demande de scripting reçue de %s:%s : %s", "app.incoming_message.invalid": "Demande de scripting invalide !", "app.listening": "Configuration de l’hôte de scripting à %s:%s", "app.otherinstance": "%s fonctionne déjà.", "app.otherinstance.notified": "Une instance déjà en cours de fonctionnement a été signalée.", "apply": "Appliquer", "apply_black_output_offset": "Appliquer le décalage du noir en sortie (100%)", "apply_cal": "Appliquer l’étalonnage (vcgt)", "apply_cal.error": "L’étalonnage n'a pas pu être appliqué.", "archive.create": "Créer une archive compressée…", "archive.import": "Importer l’archive…", "archive.include_3dluts": "Voulez-vous inclure les fichiers de table de correspondance 3D dans l’archive (non recommandé, produit une taille de fichier d’archive plus importante) ?", "argyll.debug.warning1": "Veuillez n’utiliser cette option que si vous avez vraiment besoin d’informations de débogage (par ex. pour le dépannage d’une fonctionnalité d’ArgyllCMS) ! Ceci n’est en principe utile qu’aux développeurs du logiciel pour aider au diagnostic et à la résolution de problèmes. Êtes-vous sûr de vouloir activer la sortie de débogage ?", "argyll.debug.warning2": "N'oubliez pas de désactiver la sortie de débogage pour le fonctionnement normal du logiciel.", "argyll.dir": "Répertoire des exécutables d’ArgyllCMS :", "argyll.dir.invalid": "Exécutables d’ArgyllCMS introuvables.\nVeuillez sélectionner le répertoire contenant les fichiers exécutables (peut-être préfixé « argyll- » ou suffixé « -argyll ») : %s", "argyll.error.detail": "Message d’erreur détaillé d’ArgyllCMS :", "argyll.instrument.configuration_files.install": "Installer les fichiers de configuration de sondes de mesure d’ArgyllCMS…", "argyll.instrument.configuration_files.install.success": "Installation des fichiers de configuration de sondes de mesure d’ArgyllCMS terminée.", "argyll.instrument.configuration_files.uninstall": "Désinstaller les fichiers de configuration de sondes de mesure d’ArgyllCMS…", "argyll.instrument.configuration_files.uninstall.success": "Désinstallation des fichiers de configuration de sonde de mesure d’ArgyllCMS terminée.", "argyll.instrument.driver.missing": "Le pilote d’ArgyllCMS pour votre sonde de mesure ne semble pas être installé ou n’est pas correctement installé. Veuillez vérifier que votre sonde de mesure apparaît dans le gestionnaire de périphériques de Windows sous « Argyll LibUSB-1.0A devices » et (ré-)installez le pilote, si nécessaire. Veuillez consulter la documentation pour les instructions d’installation.", "argyll.instrument.drivers.install": "Installer les pilotes de sondes de mesure d’ArgyllCMS…", "argyll.instrument.drivers.install.confirm": "Vous n’avez à installer les pilotes spécifiques d’ArgyllCMS que si vous avez une sonde de mesure autre que ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval ou K-10.\n\nNote : si vous avez déjà un pilote du constructeur installé pour votre sonde de mesure, vous devrez utiliser le gestionnaire de périphériques de Windows pour passer manuellement au pilote d’ArgyllCMS après qu’il a été installé. Pour ce faire, faites un clic-droit sur la sonde de mesure et sélectionnez « Mettre le pilote à jour… », choisissez ensuite « Rechercher un pilote logiciel sur mon ordinateur », « Laissez-moi choisir depuis une liste de pilotes de périphérique sur mon ordinateur » et enfin, sélectionnez dans la liste le pilote d’Argyll correspondant à votre sonde de mesure.\n\nVoulez-vous poursuivre ?", "argyll.instrument.drivers.install.failure": "Échec de l’installation des pilote d’ArgyllCMS pour la sonde de mesure.", "argyll.instrument.drivers.install.restart": "Vous devez désactiver la vérification de signature du pilote pour installer les pilotes de sondes de mesure d’ArgyllCMS. Pour cela, le système doit être redémarré. Sélectionnez « Résoudre le problème » sur la page qui apparaîtra, ensuite « Options avancées », « Paramètres de démarrage» et enfin « Redémarrer ». Lors du démarrage, sélectionnez « Désactiver la vérification de la signature du pilote ». Après le redémarrage, choisissez de nouveau « Installer les pilotes des sondes de mesure d’ArgyllCMS… » depuis le menu afin installer les pilotes.", "argyll.instrument.drivers.uninstall": "Désinstaller les pilotes de sondes de mesure d’ArgyllCMS…", "argyll.instrument.drivers.uninstall.confirm": "Note : la désinstallation n’affecte pas les pilotes de sondes de mesure actuellement en cours d’utilisation mais supprime simplement le pilote de la liste de pilotes de Windows. Si vous désirez revenir à un pilote de constructeur installé pour votre sonde de mesure, vous devrez utiliser le gestionnaire de périphériques de Windows pour basculer manuellement vers le pilote du constructeur. Pour ce faire, faites un clic-droit sur la sonde de mesure et sélectionnez « Mettre à jour le pilote… », choisissez ensuite « Recherchez un pilote sur mon ordinateur », « Laissez-moi sélectionner les pilotes de périphérique depuis une liste sur mon ordinateur » et enfin, sélectionnez le pilote du constructeur pour votre sonde depuis la liste.\n\nVoulez-vous poursuivre ?", "argyll.instrument.drivers.uninstall.failure": "Échec de la désinstallation des pilote de sondes de mesure d’ArgyllCMS.", "argyll.instrument.drivers.uninstall.success": "Désinstallation des pilotes de sondes de mesure d’ArgyllCMS terminée.", "argyll.util.not_found": "Exécutable ArgyllCMS « %s » introuvable.", "as_measured": "tel que mesuré", "attributes": "Attributs", "audio.lib": "Module audio : %s", "auth": "Authentification", "auth.failed": "Échec de l’authentification.", "auto": "automatique", "auto_optimized": "optimisée automatiquement", "autostart_remove_old": "Suppression de l’ancienne entrée de démarrage automatique", "backing_xyz": "Valeurs XYZ du support", "backlight": "Rétroéclairage", "bitdepth": "Profondeur des couleurs", "black": "Noir", "black_lab": "Noir L*a*b*", "black_point": "Point noir", "black_point_compensation": "Compensation du point noir", "black_point_compensation.3dlut.warning": "Durant la création de la table de correspondance 3D, la compensation du point noir doit être désactivée car elle affecte la fonction d’ajustement de la courbe de tonalité. Voulez-vous désactiver la compensation du point noir ?", "black_point_compensation.info": "La compensation du point noir empêche efficacement la réduction du noir, mais réduit la précision de la conversion des couleurs.", "black_white": "Noir et blanc", "black_xyz": "Noir XYZ", "blacklevel": "Niveau de noir", "blue": "Bleu", "blue_gamma": "Gamma du bleu", "blue_lab": "Bleu L*a*b*", "blue_matrix_column": "Colonne de la matrice de bleu", "blue_maximum": "Maximum du bleu", "blue_minimum": "Minimum du bleu", "blue_tone_response_curve": "Courbe de réponse de tonalité du bleu", "blue_xyz": "Bleu XYZ", "brightness": "Luminosité", "browse": "Parcourir…", "bug_report": "Signaler un bogue…", "button.calibrate": "Étalonner uniquement", "button.calibrate_and_profile": "Étalonner et caractériser", "button.profile": "Caractériser uniquement", "cal_extraction_failed": "Échec de l’extraction des données d’étalonnage à partir du profil.", "calculated_checksum": "Somme de contrôle calculée", "calibrate_instrument": "Étalonnage du spectromètre", "calibration": "Étalonnage", "calibration.ambient_viewcond_adjust": "Niveau de luminosité ambiante", "calibration.ambient_viewcond_adjust.info": "Pour réaliser un ajustement des conditions de visualisation lors du calcul des courbes d’étalonnage, cochez la case et entrez le niveau de luminosité ambiante actuel. Éventuellement, vous pouvez aussi mesurer la luminosité ambiante si votre sonde de mesure le permet.", "calibration.black_luminance": "Niveau de noir", "calibration.black_output_offset": "Décalage du noir en sortie", "calibration.black_point_correction": "Correction du point noir", "calibration.black_point_correction_choice": "Vous pouvez désactiver la correction du point noir pour optimiser le niveau de noir et le taux de contraste (recommandé pour la plupart des écrans cathodiques). Veuillez indiquer votre choix pour la correction du point noir.", "calibration.black_point_rate": "Taux", "calibration.check_all": "Vérifier les paramètres", "calibration.complete": "Étalonnage terminé.", "calibration.create_fast_matrix_shaper": "Créer un profil à matrice", "calibration.create_fast_matrix_shaper_choice": "Voulez-vous créer profil à matrice/shaper rapide à partir des mesures d’étalonnage ou simplement effectuer l’étalonnage ?", "calibration.do_not_use_video_lut": "Ne pas utiliser la table de gamma de la carte vidéo pour appliquer l’étalonnage", "calibration.do_not_use_video_lut.warning": "Voulez-vous vraiment changer le paramètre recommandé ?", "calibration.embed": "Incorporer les courbes d’étalonnage dans le profil", "calibration.file": "Paramètres", "calibration.file.invalid": "Le fichier de paramètres sélectionné est invalide.", "calibration.file.none": "", "calibration.incomplete": "L’étalonnage n’a pas été achevé.", "calibration.interactive_display_adjustment": "Réglage interactif de l’écran", "calibration.interactive_display_adjustment.black_level.crt": "Sélectionnez « Commencer la mesure » et ajustez la luminosité et/ou les contrôles de décalage RVB de votre écran pour obtenir le niveau désiré.", "calibration.interactive_display_adjustment.black_point.crt": "Sélectionnez « Commencer la mesure » et ajustez les contrôles de décalage RVB de votre écran pour obtenir le point noir désiré.", "calibration.interactive_display_adjustment.check_all": "Sélectionnez « Commencer la mesure » pour vérifier l’ensemble des paramètres.", "calibration.interactive_display_adjustment.generic_hint.plural": "Une bonne correspondance est obtenue si toutes les barres peuvent être amenées à la position indiquée au centre.", "calibration.interactive_display_adjustment.generic_hint.singular": "Une bonne correspondance est obtenue si la barre peut être amenée à la position indiquée au centre.", "calibration.interactive_display_adjustment.start": "Commencer la mesure", "calibration.interactive_display_adjustment.stop": "Arrêter la mesure", "calibration.interactive_display_adjustment.white_level.crt": "Sélectionnez « Commencer la mesure » et ajustez le contraste et/ou les contrôles de gain RVB de votre écran pour obtenir le niveau désiré.", "calibration.interactive_display_adjustment.white_level.lcd": "Sélectionnez « Commencer la mesure » et ajustez le contrôle de rétro-éclairage/luminosité de votre écran pour obtenir le niveau désiré.", "calibration.interactive_display_adjustment.white_point": "Sélectionnez « Commencer la mesure » et ajustez les contrôles de température de couleur et/ou de gain RVB de vote écran pour obtenir le point blanc désiré.", "calibration.load": "Charger les paramètes…", "calibration.load.handled_by_os": "Le chargement de l’étalonnage est effectué par le système d’exploitation.", "calibration.load_error": "Les courbes d’étalonnage n'ont pas pu être chargées.", "calibration.load_from_cal": "Charger les courbes d’étalonnage à partir d’un fichier d’étalonnage…", "calibration.load_from_cal_or_profile": "Charger les courbes d’étalonnage à partir d’un fichier d’étalonnage ou d’un profil…", "calibration.load_from_display_profile": "Charger les courbes d’étalonnage à partir du profil actuel du périphérique d’affichage…", "calibration.load_from_display_profiles": "Charger les courbes d’étalonnage depuis le ou les profiles de l’écran actuel", "calibration.load_from_profile": "Charger les courbes d’étalonnage à partir du profil…", "calibration.load_success": "Les courbes d’étalonnage ont été chargées avec succès.", "calibration.loading": "Chargement des courbes d’étalonnage à partir du fichier…", "calibration.loading_from_display_profile": "Chargement des courbes d’étalonnage du profil actuel du périphérique d’affichage…", "calibration.luminance": "Niveau de blanc", "calibration.lut_viewer.title": "Courbes", "calibration.preserve": "Preserver l’état de l’étalonnage", "calibration.preview": "Aperçu de l’étalonnage", "calibration.quality": "Qualité de l’étalonnage", "calibration.quality.high": "Haute", "calibration.quality.low": "Basse", "calibration.quality.medium": "Moyenne", "calibration.quality.ultra": "Ultra", "calibration.quality.verylow": "Très basse", "calibration.reset": "Réinitialiser la table de gamma de la carte vidéo", "calibration.reset_error": "La table de gamma de la carte graphique n’a pas pu être réinitialisée.", "calibration.reset_success": "La table de gamma de la carte graphique a été réinitialisée avec succès.", "calibration.resetting": "Réinitialisation linéaire de la table de gamma de la carte graphique…", "calibration.settings": "Paramètres d’étalonnage", "calibration.show_actual_lut": "Afficher les courbes d’étalonnage de la carte vidéo", "calibration.show_lut": "Afficher les courbes", "calibration.skip": "Poursuivre par la caractérisation", "calibration.speed": "Vitesse d’étalonnage", "calibration.speed.high": "Haute", "calibration.speed.low": "Basse", "calibration.speed.medium": "Moyenne", "calibration.speed.veryhigh": "Très haute", "calibration.speed.verylow": "Très basse", "calibration.start": "Poursuivre par l’étalonnage", "calibration.turn_on_black_point_correction": "Activer", "calibration.update": "Mettre à jour l’étalonnage", "calibration.update_profile_choice": "Voulez-vous également mettre à jour les courbes d’étalonnage dans le profil existant ou juste faire l’étalonnage ?", "calibration.use_linear_instead": "Utiliser plutôt un étalonnage linéaire", "calibration.verify": "Vérifier l’étalonnage", "calibration_profiling.complete": "Étalonnage et caractérisation terminés.", "calibrationloader.description": "Définit le profil ICC et charge les courbes d’étalonnage pour tous les périphériques d’affichage", "can_be_used_independently": "Ne peut pas être utilisé indépendamment", "cancel": "Annuler", "cathode_ray_tube_display": "Écran à tube à rayons cathodiques", "ccmx.use_four_color_matrix_method": "Minimiser la différence chromatique xy plutôt que delta E", "ccxx.ti1": "mire de test pour la correction du colorimètre", "centered": "Centré", "channel_1_c_xy": "Canal 1 (C) xy", "channel_1_gamma_at_50_input": "Gamma du canal 1 à 50% de l’entrée", "channel_1_is_linear": "Le canal 1 est linéaire", "channel_1_maximum": "Maximum du canal 1", "channel_1_minimum": "Minimum du canal 1", "channel_1_r_xy": "Canal 1 (R) xy", "channel_1_unique_values": "Valeurs uniques du canal 1", "channel_2_g_xy": "Canal 2 (G) xy", "channel_2_gamma_at_50_input": "Gamma du canal 2 à 50% de l’entrée", "channel_2_is_linear": "Le canal 2 est linéaire", "channel_2_m_xy": "Canal 2 (M) xy", "channel_2_maximum": "Maximum du canal 2", "channel_2_minimum": "Minimum du canal 2", "channel_2_unique_values": "Valeurs uniques du canal 2", "channel_3_b_xy": "Canal 3 (B) xy", "channel_3_gamma_at_50_input": "Gamma du canal 3 à 50% de l’entrée", "channel_3_is_linear": "Le canal 3 est linéaire", "channel_3_maximum": "Maximum du canal 3", "channel_3_minimum": "Minimum du canal 3", "channel_3_unique_values": "Valeurs uniques du canal 3", "channel_3_y_xy": "Canal 3 (Y) xy", "channel_4_k_xy": "Canal 4 (K) xy", "channels": "Nombre de canaux", "characterization_device_values": "Valeurs de caractérisation du périphérique", "characterization_measurement_values": "Valeurs des mesures de caractérisation", "characterization_target": "Cible de caractérisation", "checking_lut_access": "Contrôle de l’accès à la table de gamma de la carte vidéo pour l’écran %s…", "checksum": "Somme de contrôle", "checksum_ok": "Somme de contrôle correcte", "chromatic_adaptation_matrix": "Matrice d’adaptation chromatique", "chromatic_adaptation_transform": "Transformée d’adaptation chromatique", "chromaticity_illuminant_relative": "Chromaticité (par rapport à l’illuminant)", "chromecast_limitations_warning": "Veuillez noter que la précision du Chromecast n’est pas aussi bonne que celle d’un écran directement raccordé ou qu’un madTPG, car le Chromecast utilise une conversion de RVB vers YCbCr et un rééchantillonage.", "clear": "Effacer", "close": "Fermer", "color": "Couleur", "color_look_up_table": "Table de correspondance des couleurs", "color_model": "Modèle de couleurs", "color_space_conversion_profile": "Profil de conversion d’espace colorimétrique", "colorant_order": "Ordre des colorants", "colorants_pcs_relative": "Colorants (par rapport à PCS)", "colorimeter_correction.create": "Créer une correction du colorimètre…", "colorimeter_correction.create.details": "Veuillez vérifier les champs ci-dessous et les modifier si nécessaire. La description peut également contenir des détails importants (par ex. des réglages spécifiques à l’écran, un observateur CIE non-standard ou ce genre de chose).", "colorimeter_correction.create.failure": "Échec de la création de la correction.", "colorimeter_correction.create.info": "Pour créer une correction du colorimètre, vous devez d’abord mesurer les couleurs de test à l’aide d’un spectromètre et, dans le cas où vous voulez créer une matrice de correction plutôt qu’une correction spectrale, avec le colorimètre également.\nVous pouvez aussi utiliser des mesures existantes en choisissant « Parcourir »", "colorimeter_correction.create.success": "Correction créée avec succès.", "colorimeter_correction.file.none": "aucune", "colorimeter_correction.import": "Importer les corrections du colorimètre depuis un autre logiciel de caractérisation d’écrans…", "colorimeter_correction.import.choose": "Veuillez choisir le fichier de correction de colorimètre à importer.", "colorimeter_correction.import.failure": "Aucune correction de colorimètre n'a pu être importée.", "colorimeter_correction.import.partial_warning": "Toutes les corrections de colorimètres ne peuvent pas être importées depuis %s. %i de %i entrées doivent être sautées.", "colorimeter_correction.import.success": "Les corrections du colorimètre ont été importées depuis les logiciels suivants :\n\n%s", "colorimeter_correction.instrument_mismatch": "La correction de colorimètre sélectionnée ne convient pas à la sonde de mesure sélectionnée.", "colorimeter_correction.upload": "Charger la correction du colorimètre…", "colorimeter_correction.upload.confirm": "Voulez-vous charger la correction du colorimètre vers la base de données en ligne (recommandé) ? Tout fichier chargé sera considéré comme placé dans le domaine public, de sorte à pouvoir être utilisé librement.", "colorimeter_correction.upload.deny": "Cette correction de colorimètre ne peut être chargée.", "colorimeter_correction.upload.exists": "La correction du colorimètre existe déjà dans la base de données.", "colorimeter_correction.upload.failure": "La correction n'a pu être entrée dans la base de données en ligne.", "colorimeter_correction.upload.success": "La correction a été chargée dans la base de données en ligne.", "colorimeter_correction.web_check": "Chercher en ligne une correction de colorimètre…", "colorimeter_correction.web_check.choose": "Les corrections de colorimètre suivantes pour l’écran et la sonde de mesure sélectionnés ont été trouvées :", "colorimeter_correction.web_check.failure": "Aucune correction de colorimètre pour l’écran et la sonde de mesure sélectionnés n'a été trouvée.", "colorimeter_correction.web_check.info": "Veuillez noter que toutes les corrections de colorimètre sont des contributions de divers utilisateurs, et qu’il est de votre responsabilité de juger de leur utilité dans votre situation particulière. Elles peuvent ou pas améliorer la précision absolue de votre colorimètre associé à votre écran.", "colorimeter_correction_matrix_file": "Matrice de correction", "colorimeter_correction_matrix_file.choose": "Choisir une matrice de correction...", "colorimetric_intent_image_state": "État de l’image colorimétrique", "colors_pcs_relative": "Couleurs (par rapport à PCS)", "colorspace": "Espace de couleurs", "colorspace.show_outline": "Afficher le contour", "commandline": "Ligne de commandes :", "commands": "Commandes", "comparison_profile": "Profil de comparaison", "comport_detected": "Une modification de la configuration de la sonde de mesure ou du port a été détectée.", "compression.gzip": "Compression GZIP", "computer.name": "Nom de l’ordinateur", "connected.to.at": "Connectée à %s à %s:%s", "connecting.to": "Connexion à %s:%s…", "connection.broken": "Perte de connexion", "connection.established": "Connexion établie", "connection.fail": "Erreur de connexion (%s)", "connection.fail.http": "Erreur HTTP %s", "connection.waiting": "Attente de connexion à", "continue": "Continuer", "contrast": "Contraste", "contribute": "Contribuer", "converting": "Conversion", "copyright": "Droit d’auteur", "corrected": "corrigé", "create_profile": "Créer un profil à partir des données des mesures…", "create_profile_from_edid": "Créer un profil à partir des données d’identification étendues de l’écran…", "created": "Créé le", "creator": "Créateur", "current": "Actuel", "custom": "personnalisé", "cyan": "Cyan", "d3-e4-s2-g28-m0-b0-f0.ti1": "Petite mire de test pour les profils à matrice", "d3-e4-s3-g52-m3-b0-f0.ti1": "Mire de test par défaut", "d3-e4-s4-g52-m4-b0-f0.ti1": "Petite mire de test pour les profils à LUT", "d3-e4-s5-g52-m5-b0-f0.ti1": "Mire de test étendue pour les profils à LUT", "d3-e4-s9-g52-m9-b0-f0.ti1": "Grande mire de test pour les profils à LUT", "d3-e4-s17-g52-m17-b0-f0.ti1": "Très grande mire de test pour les profils à LUT", "deactivated": "désactivé", "default": "Valeur par défaut", "default.icc": "Défaut (Gamma 2.2)", "default_crt": "Défaut CRT", "default_rendering_intent": "Intention de rendu par défaut", "delete": "Supprimer", "delta_e_2000_to_blackbody_locus": "ΔE 2000 du locus du corps noir", "delta_e_2000_to_daylight_locus": "ΔE 2000 du locus de la lumière du jour", "delta_e_to_locus": "ΔE*00 vers locus %s", "description": "Description", "description_ascii": "Description (ASCII)", "description_macintosh": "Description (Macintosh)", "description_unicode": "Description (Unicode)", "deselect_all": "Tout désélectionner", "detect_displays_and_ports": "Détecter les périphériques d’affichage et les sondes de mesures", "device": "Périphérique", "device.name.placeholder": "", "device_color_components": "Composantes de couleurs du périphérique", "device_manager.launch": "Lancer le gestionnaire de périphérique", "device_manufacturer_name": "Nom du constructeur du périphérique", "device_manufacturer_name_ascii": "Nom du constructeur du périphérique (ASCII)", "device_manufacturer_name_macintosh": "Nom du constructeur du périphérique (Macintosh)", "device_manufacturer_name_unicode": "Nom du constructeur du périphérique (Unicode)", "device_model_name": "Nom de modèle du périphérique", "device_model_name_ascii": "Device model name (ASCII)", "device_model_name_macintosh": "Nom de modèle du périphérique (Macintosh)", "device_model_name_unicode": "Nom de modèle du périphérique (Unicode)", "device_to_pcs_intent_0": "Périphérique vers PCS : Intention 0", "device_to_pcs_intent_1": "Périphérique vers PCS : Intention 1", "device_to_pcs_intent_2": "Périphérique vers PCS : Intention 3", "devicelink_profile": "Profil de lien de périphérique", "dialog.argyll.notfound.choice": "ArgyllCMS, le moteur de couleurs est nécessaire pour faire tourner DisplayCAL, il ne semble pas être installé sur cet ordinateur. Voulez-vous le télécharger automatiquement ou le rechercher vous-même ?", "dialog.cal_info": "Le fichier d’étalonnage « %s » sera utilisé. Voulez-vous continuer ?", "dialog.confirm_cancel": "Voulez-vous vraiment annuler ?", "dialog.confirm_delete": "Voulez-vous vraiment supprimer le(s) fichier(s) sélectionné(s) ?", "dialog.confirm_overwrite": "Le fichier « %s » existe déjà. Voulez-vous l’écraser ?", "dialog.confirm_uninstall": "Voulez-vous vraiment désinstaller les fichiers sélectionés ?", "dialog.current_cal_warning": "Le profil contiendra les courbes d’étalonnage actuelles. Voulez-vous continuer ?", "dialog.do_not_show_again": "Ne plus afficher ce message", "dialog.enter_password": "Veuillez entrer votre mot de passe.", "dialog.install_profile": "Voulez-vous installer le profil « %s » et en faire le profil par défaut pour l’écran « %s » ?", "dialog.linear_cal_info": "Les courbes d’étalonnage linéaires seront utilisées. Voulez-vous continuer ?", "dialog.load_cal": "Charger les paramètres", "dialog.select_argyll_version": "La version %s d’ArgyllCMS a été trouvée. La version actuellement sélectionnée est %s. Voulez-vous utiliser la version plus récente ?", "dialog.set_argyll_bin": "Veuillez indiquer le répertoire dans lequel se trouvent les exécutables d’ArgyllCMS.", "dialog.set_profile_save_path": "Créer le répertoire du profil « %s » ici :", "dialog.set_testchart": "Sélectionner un fichier de mire de test", "dialog.ti3_no_cal_info": "Les données de mesure ne contiennent pas de courbe d’étalonnage. Voulez-vous réellement continuer ?", "digital_camera": "Appareil photo numérique", "digital_cinema_projector": "Projecteur de cinéma numérique", "digital_motion_picture_camera": "Caméra numérique", "direction.backward": "PCS → B2A → périphérique", "direction.backward.inverted": "PCS ← B2A ← périphérique", "direction.forward": "Périphérique → A2B → PCS", "direction.forward.inverted": "Périphérique ← A2B ← PCS", "directory": "Répertoire", "disconnected.from": "Déconnecté de %s:%s", "display": "Périphérique d’affichage", "display-instrument": "Écrans et sondes de mesure", "display.connection.type": "Connexion", "display.manufacturer": "Fabricant du périphérique d’affichage", "display.output": "Sortie n°", "display.primary": "(Primaire)", "display.properties": "Propriétés du périphérique d’affichage", "display.reset.info": "Veuillez réinitialiser le périphérique d’affichage aux paramètres d’usine, ajustez ensuite sa luminosité à un niveau confortable.", "display.settings": "Paramètres du périphérique d’affichage", "display.tech": "Technologie de l’écran", "display_detected": "Une modification de la configuration du périphérique d’affichage a été détectée.", "display_device_profile": "Profil du périphérique d’affichage", "display_lut.link": "Lier/délier l’accès à l’écran et à la table de correspondance", "display_peak_luminance": "Afficher la luminance crête", "display_profile.not_detected": "Aucun profil actuel détecté pour l’écran « %s »", "display_short": "Périphérique d’affichage (abrégé)", "displayport": "DisplayPort", "displays.identify": "Identifier les périphériques d’affichage", "dlp_screen": "Écran DLP", "donation_header": "Votre soutien est apprécié !", "donation_message": "Si vous désirez supporter le développement, apporter une assistance technique et faire se poursuivre la disponibilité de DisplayCAL et d’ArgyllCMS, pensez à une contribution financière. Comme DisplayCAL ne serai d’aucune utilité sans ArgyllCMS, toutes les donations reçues pour DisplayCAL seront partagées entre les deux projets.\nPour une faible utilisation non commerciale, une donation unique semble appropriée. Si vous utilisez DisplayCAL de manière professionnelles, une contribution annuelle ou mensuelle ferait une grande différence en permettant aux deux projets de continuer d’exister.\n\nMerci à tous les contributeurs !", "download": "Téléchargement", "*download.fail": "Download failed:", "download.fail.empty_response": "Échec de téléchargement : %s a retourné un document vide.", "download.fail.wrong_size": "Échec de téléchargement : le fichier n’a pas la taille attendue de %s octets (%s octets ont été reçu).", "download_install": "Télécharger et installer", "downloading": "Téléchargement", "drift_compensation.blacklevel": "Compensation de la dérive du niveau de noir", "drift_compensation.blacklevel.info": "La compensation de la dérive du niveau de noir tente de prendre en compte les déviations de mesure causées par la dérive de l’étalonnage du noir d’un périphérique de mesure lors de son échauffement. À cette fin, un échantillon de test noir est mesuré périodiquement, ce qui augmente la durée totale nécessaire aux mesures. De nombreux colorimètres ont une compensation intégrée de la température, auquel cas la compensation de la dérive du niveau de noir n'est pas nécessaire, mais la plupart des spectromètres ne sont pas compensés en température.", "drift_compensation.whitelevel": "Compensation de la dérive du niveau de blanc", "drift_compensation.whitelevel.info": "La compensation de la dérive du niveau de blanc tente de prendre en compte les déviations de mesure causées par les changements de luminosité d’un périphérique d’affichage lors de son échauffement. À cette fin, un échantillon de test blanc est mesuré périodiquement, ce qui augmente la durée totale nécessaire aux mesures.", "dry_run": "Fonctionnement à blanc", "dry_run.end": "Fonctionnement à blanc terminé.", "dry_run.info": "Fonctionnement à blanc. Consultez le journal pour voir la ligne de commande.", "dvi": "DVI", "dye_sublimation_printer": "Imprimante à sublimation de colorants", "edid.crc32": "Somme de contrôle EDID CRC32", "edid.serial": "N° de série EDID", "elapsed_time": "Temps écoulé", "electrophotographic_printer": "Imprimante électrophotographique", "electrostatic_printer": "Imprimante électrostatique", "enable_argyll_debug": "Activer la sortie de diagnostic d’ArgyllCMS", "enable_spyder2": "Activer le colorimètre Spyder 2…", "enable_spyder2_failure": "Spyder 2 n'a pas pu être activé.", "enable_spyder2_success": "Spyder 2 a été activé avec succès.", "entries": "Entrées", "enumerate_ports.auto": "Détecter automatiquement les sondes de mesure", "enumerating_displays_and_comports": "Inventaire des périphériques d’affichage et des ports de communication…", "environment": "Environnement", "error": "Erreur", "error.access_denied.write": "Vous n'avez pas l’accès en écriture à %s", "error.already_exists": "Le nom « %s » ne peut pas être utilisé, car un autre objet du même nom existe déjà. Veuillez choisir un autre nom ou un autre répertoire.", "error.autostart_creation": "La création d’une entrée de démarrage automatique pour que %s charge les courbes d’étalonnage à la connexion a échoué.", "error.autostart_remove_old": "L’ancienne entrée d’autodémarrage qui charge les courbes d’étalonnage à la connexion n'a pu être supprimée : %s", "error.autostart_system": "L’entrée d’autodémarrage système pour charger les courbes d’étalonnage à la connexion n'a pas pu être créée car le répertoire d’autodémarrage système n'a pas pu être déterminé.", "error.autostart_user": "L’entrée d’autodémarrage spécifique à l’utilisateur/trice pour charger les courbes d’étalonnage à la connexion n'a pas pu être créée car le répertoire d’autodémarrage spécifique à l’utilisateur/trice n'a pas pu être déterminé.", "error.cal_extraction": "L’étalonnage n'a pas pu être extrait de « %s ».", "error.calibration.file_missing": "Le fichier d’étalonnage « %s » est manquant.", "error.calibration.file_not_created": "Aucun fichier d’étalonnage n'a été créé.", "error.copy_failed": "Le fichier « %s » n'a pas pu être copié vers « %s ».", "error.deletion": "Une erreur s'est produite pendant le déplacement des fichiers vers la %s. Certains fichiers peuvent ne pas avoir été supprimés.", "error.dir_creation": "Le répertoire « %s » n'a pas pu être créé. Il y a peut-être des restrictions d’accès. Veuillez autoriser l’accès en écriture ou sélectionner un répertoire différent.", "error.dir_notdir": "Le répertoire « %s » n'a pas pu être créé, car un autre objet du même nom existe déjà. Veuillez sélectionner un autre répertoire.", "error.file.create": "Le fichier « %s » n'a pu être créé.", "error.file.open": "Le fichier « %s » n'a pas pu être ouvert.", "error.file_type_unsupported": "Type de fichier non supporté.", "error.generic": "Une erreur interne est survenue.\n\nCode erreur : %s\nMessage d’erreur : %s", "error.luminance.invalid": "Le pic de luminance mesuré n’est pas valable. Assurez-vous que le capteur de votre instrument n’est pas bloqué, et enlevé le bouchon de protection (s’il est présent).", "error.measurement.file_invalid": "Le fichier de mesure « %s » est invalide.", "error.measurement.file_missing": "Le fichier de mesure « %s » est manquant.", "error.measurement.file_not_created": "Aucun fichier de mesure n'a été créé.", "error.measurement.missing_spectral": "Le fichier de mesure ne contient pas de valeurs spectrales.", "error.measurement.one_colorimeter": "Une mesure de colorimètre exactement est nécessaire.", "error.measurement.one_reference": "Une mesure de référence du spectromètre exactement est nécessaire.", "error.no_files_extracted_from_archive": "Aucun fichier n’a été extrait de « %s ».", "error.not_a_session_archive": "L’archive « %s » ne semble pas être une archive de session.", "error.profile.file_missing": "Le profil « %s » est manquant.", "error.profile.file_not_created": "Aucun profil n'a été créé.", "error.source_dest_same": "Les fichiers source et cible sont les mêmes.", "error.testchart.creation_failed": "Le fichier de mire de test « %s » n'a pas pu être créé. Peut-être y a-t-il des restrictions d’accès, ou bien le fichier source n'existe pas.", "error.testchart.invalid": "Le fichier de mire de test « %s » est invalide.", "error.testchart.missing": "Le fichier de mire de test « %s » est manquant.", "error.testchart.missing_fields": "Le fichier de mire de test « %s » ne contient pas les champs requis : %s", "error.testchart.read": "Le fichier de mire de test « %s » n'a pas pu être lu.", "error.tmp_creation": "Il n'a pas été possible de créer un répertoire de travail temporaire.", "error.trashcan_unavailable": "La %s n'est pas disponible. Aucun fichier n'a été supprimé.", "errors.none_found": "Aucune erreur trouvée.", "estimated_measurement_time": "Temps de mesure approximatif: %s heure(s) %s minutes", "exceptions": "Exceptions…", "executable": "Exécutable", "export": "Exporter…", "extra_args": "Définir des paramètres de ligne de commandes supplémentaires", "factory_default": "Valeurs d’usine", "failure": "… échec !", "*file.hash.malformed": "The integrity of %s cannot be verified because the checksum file is malformed.", "*file.hash.missing": "The integrity of %s cannot be verified because it doesn't have an entry in the checksum file.", "*file.hash.verification.fail": "Checksum verification failed for %s:\n\nExpected %s\nActual %s", "file.invalid": "Fichier invalide.", "file.missing": "Le fichier « %s » n'existe pas.", "file.notfile": "« %s » n'est pas un fichier.", "file.select": "Sélectionnez un fichier", "filename": "Nom du fichier", "filename.upload": "Nom de fichier pour le téléversement", "filetype.7z": "Fichiers 7-Zip", "filetype.any": "Tout type de fichier", "filetype.cal": "Fichiers d’étalonnage (*.cal)", "filetype.cal_icc": "Fichiers d’étalonnage et de profils (*.cal;*.icc;*.icm)", "filetype.ccmx": "Matrices de correction (*.ccmx;*.ccss)", "filetype.html": "Fichiers HTML (*.html;*.htm)", "filetype.icc": "Fichiers de profils (*.icc;*.icm)", "filetype.icc_mpp": "Fichiers de profils (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "Fichiers de mires de test (*.icc;*.icm;*.ti1;*.ti3)", "filetype.icc_ti3": "Fichiers de mesures (*.icc;*.icm;*.ti3)", "filetype.log": "Fichiers journaux (*.log)", "filetype.png": "Portable Network Graphics (*.png)", "filetype.tgz": "Archive TAR compressée", "filetype.ti1": "Fichiers de mires de test (*.ti1)", "filetype.ti1_ti3_txt": "Fichiers de mires de test (*.ti1), fichiers de mesures (*.ti3;*.txt)", "filetype.ti3": "Fichiers de mesures (*.icc;*.icm;*.ti3)", "filetype.tif": "Tagged Image File (*.tif)", "filetype.txt": "Corrections_du_peripherique.txt", "filetype.vrml": "Fichiers VRML (*.wrl)", "filetype.x3d": "Fichiers X3D (*.x3d)", "filetype.zip": "Fichiers ZIP", "film_scanner": "Scanner film", "film_writer": "Flasheuse de film", "finish": "Finir", "flare": "Diffusion (flare)", "flexography": "Flexographie", "focal_plane_colorimetry_estimates": "Estimation de la colorimétrie dans le plan focal", "forced": "forcé", "format.select": "Veuillez sélectionner le format désiré.", "fullscreen.message": "Mode plein écran activé.\nPresser Échap pour quitter le mode plein écran.", "fullscreen.osx.warning": "Si vous entrez dans le mode plein écran en utilisant le bouton de zoom de la barre de titre, veuillez presser Ctrl + Tab pour revenir au mode normal après que la fenêtre s’est fermée. En remplacement, vous pouvez obtenir le mode plein écran par un double-clic sur la barre de titre ou en maintenant la touche OPTION tout en cliquant le bouton de zoom.", "gamap.default_intent": "Intention de rendu par défaut", "gamap.intents.a": "colorimétrie absolue", "gamap.intents.aa": "apparence absolue", "gamap.intents.aw": "colorimétrie absolue avec adaptation du point blanc", "gamap.intents.la": "apparence avec correspondance de luminance", "gamap.intents.lp": "perceptuelle préservant la luminance", "gamap.intents.ms": "préserver la saturation", "gamap.intents.p": "perceptuelle", "gamap.intents.pa": "apparence perceptuelle", "gamap.intents.r": "colorimétrie relative", "gamap.intents.s": "saturation", "gamap.out_viewcond": "Conditions de visualisation cibles", "gamap.perceptual": "Transposition du gamut pour l’intention perceptuelle", "gamap.profile": "Profil source", "gamap.saturation": "Transposition du gamut pour l’intention de saturation", "gamap.src_viewcond": "Conditions de visualisation sources", "gamap.viewconds.cx": "transparents sur une table lumineuse", "gamap.viewconds.jd": "projecteur en environnement obscur", "gamap.viewconds.jm": "projecteur en environnement tamisé", "gamap.viewconds.mb": "moniteur en environnement de travail lumineux", "gamap.viewconds.md": "moniteur en environnement de travail sombre", "gamap.viewconds.mt": "moniteur en environnement de travail typique", "gamap.viewconds.ob": "scène originale - extérieur lumineux", "gamap.viewconds.pc": "environnement critique de comparaison des imprimés (ISO-3664 P1)", "gamap.viewconds.pcd": "CD photo - scène originale en extérieur", "gamap.viewconds.pe": "environnement de contrôle des imprimés (CIE 116-1995)", "gamap.viewconds.pp": "environnement pratique d’évaluation des imprimés (ISO-3664 P2)", "gamap.viewconds.tv": "studio de télévision ou de cinéma", "gamapframe.title": "Options avancées de transposition du gamut", "gamut": "Gamut", "gamut.coverage": "Étendue du gamut", "gamut.view.create": "Génération des vues du gamut…", "gamut.volume": "Volume du gamut", "gamut_mapping.ciecam02": "Transposition du gamut CIECAM02", "gamut_mapping.mode": "Mode de transposition du gamut", "gamut_mapping.mode.b2a": "PCS-vers-périphérique", "gamut_mapping.mode.inverse_a2b": "Inverse, périphérique-vers-PCS", "gamut_plot.tooltip": "Cliquez-glissez la souris à l’intérieur du graphique pour déplacer la zone affichée, ou zoomez avec la molette de la souris et les touches +/-. Double-cliquez pour réinitialiser la zone affichée.", "generic_name_value_data": "Nom-valeur générique des données", "geometry": "Géométrie", "glossy": "Brillant", "*go_to": "Go to %s", "go_to_website": "Aller au site Internet", "gravure": "Gravure", "gray_tone_response_curve": "Courbe de réponse de tonalité du gris", "grayscale": "échelle de gris", "green": "Vert", "green_gamma": "Gamma du vert", "green_lab": "Vert L*a*b*", "green_matrix_column": "Colonne de la matrice de vert", "green_maximum": "Maximum du vert", "green_minimum": "Minimum du vert", "green_tone_response_curve": "Courbe de réponse de tonalité du vert", "green_xyz": "Vert XYZ", "grid_steps": "Pas de mire", "hdmi": "HDMI", "hdr_maxcll": "Contenu maximum du niveau de lumière", "*hdr_mincll": "Minimum content light level", "header": "Étalonnage et caractérisation d’affichage produits par ArgyllCMS", "help_support": "Aide et assistance…", "host.invalid.lookup_failed": "Hôte invalide (échec de la recherche de l’adresse)", "hue": "Teinte", "icc_absolute_colorimetric": "Colorimétrie absolue ICC", "icc_version": "Version d’ICC", "if_available": "si disponible", "illuminant": "Illuminant", "illuminant_relative_cct": "CCT par rapport à l’illuminant", "illuminant_relative_lab": "L*a*b* par rapport à l’illuminant", "illuminant_relative_xyz": "XYZ par rapport à l’illuminant", "illuminant_xyz": "WYZ de l’illuminant XYZ", "illumination": "Illumination", "in": "entrée", "info.3dlut_settings": "Une LUT 3D (LUT = « Look Up Table » ; table de correspondance) ou un profil lié de périphérique ICC peut être utilisé par une application prenant en charge les LUT 3D ou les liens de périphérique (« device link ») ICC pour une correction de la couleur d’affichage complète.\n\nLe choix de l’espace colorimétrique source adapté et de la courbe de réponse des tonalités\npour les LUT 3D et et les profils ICC de lien de périphérique, l’espace colorimétrique source et la courbe de réponse des tonalités doivent être définies et devenir une part fixe de la transformation de la couleur dans son ensemble (contrairement au profils ICC d’appareils qui sont liés dynamiquement au vol). Comme exemple, le matériaux vidéo HD est habituellement masterisé conformément à la norme Rec. 709 avec soit un gamma de puissance pure de l’ordre de 2.2-2.4 (relative à un décalage du noir de sortie de 100%) ou la courbe de réponse des tonalités Rec. 1886 (absolue avec un décalage du noir de sortie de 0%). Un moyen terme entre quelque chose de similaire à Rec. 1886-like et une pure fonction puissance est aussi possible en définissant le décalage de sortie du noir à une valeur comprise entre 0% et 100%.\n\nGamma « absolu » comparativement à « relatif »\nPour tenir compte d’un niveau de noir non nul sur un système d’affichage réel, la courbe de réponse des tonalités doit être décalée en rapport.\nLe gamma « Absolu » donne un sortie réelle à une entrée de 50% qui ne correspond pas à celle d’une courbe de puissance idéale (à moins que le niveau de noir ne soit nul).\nUn gamma « relatif » donnera une sortie réelle à une entrée de 50% qui correspond à une courbe de puissance idéale.", "info.calibration_settings": "L’étalonnage est effectué en ajustant l’écran de manière interactive afin d’obtenir le point blanc et/ou la luminance choisis mais il sert aussi à la création de courbes d’étalonnage LUT 1D (LUT = « Look Up Table » ; table de correspondance) de manière à obtenir la courbe de tonalité choisie et à assurer un bon équilibre du gris. Notez que si lors de l’étalonnage vous ne voulez qu’ajuster le périphérique d’affichage sans passer par la génération des courbes LUT 1D, vous devez paramétrer la courbe de tonalité sur « tel que mesuré ». L’étalonnage par LUT 1D ne peut pas être utilisé pour une correction complète des couleurs. Pour cela, vous devez créer un profil ICC ou une LUT 3D et les utiliser avec des applications qui les prennent en charge. L’étalonnage par LUT 1D est cependant un complément à la caractérisation et à l’étalonnage LUT 3D.", "info.display_instrument": "Si votre périphérique d’affichage est de type OLED, Plasma ou d’une autre technologie émettant une lumière de sortie variable en fonction de l’image, activez la compensation de la dérive du point blanc.\n\nSi votre sonde de mesure est un spectromètre et que vous l’utilisez en mode contact sur un périphérique d’affichage avec un niveau de noir stable, vous devriez activer la compensation de la dérive du niveau de noir.\n\nSi votre sonde de mesure est un colorimètre, vous devriez utiliser – si elle est disponible – une matrice de correction correspondant à votre périphérique d’affichage ou à son type de technologie. Veuillez noter que certaines sondes (ColorHug, ColorHug2, K-10, Spyder4/5) peuvent intégrer une correction en dur pour certains de leurs modes de mesure.", "info.display_instrument.warmup": "Vous devriez laisser votre périphérique d’affichage chauffer au moins 30 minutes avant de commencer les mesures. Si vous utilisez votre sonde de mesure en mode contact, il est préférable de la placer sur votre périphérique d’affichage pendant ce temps également.", "info.mr_settings": "Vous pouvez vérifier la précision de correction d’un profil ICC ou d’une LUT 2D via un rapport de mesure qui contient les statistiques avancées sur les erreurs de couleurs à partir de mesures d’échantillons.\n\nQuand vous vérifiez une LUT 3D, assurez-vous d’utilisez les mêmes paramètres que ceux spécifiés lors de sa création.", "info.profile_settings": "La caractérisation comme son nom l’indique, est la procédure de caractérisation du périphérique d’affichage et l’enregistrement de sa réponse dans un profil ICC. Le profil ICC du périphérique d’affichage peut être utilisé par des applications qui prennent en charge la gestion de la couleur ICC pour une correction complète des couleurs du périphérique d’affichage. Il peut être utilisé pour créer une LUT 3D (LUT = « Look Up Table » ; table de correspondance) qui a la même fonction pour les applications prenant en charge ce format.", "infoframe.default_text": "", "infoframe.title": "Journal", "infoframe.toggle": "Afficher la fenêtre du journal", "initial": "Initial", "initializing_gui": "Initialisation de l’interface graphique utilisateur/trice…", "ink_jet_printer": "Imprimante à jet d’encre", "input_device_profile": "Profil du périphérique d’entrée", "input_table": "Table d’entrée", "install_display_profile": "Installer le profil du périphérique d’affichage…", "install_local_system": "Installer pour l’ensemble du système", "install_user": "N’installer que pour l’utilisateur actuel", "instrument": "Sonde de mesure", "instrument.calibrate": "Placez la sonde de mesure sur une surface sombre, mate ou sur son support d’étalonnage et appuyez sur « Valider » pour étalonner la sonde de mesure.", "instrument.calibrate.colormunki": "Réglez le capteur ColorMunki sur la position étalonnage et appuyez sur « Valider » pour étalonner la sonde de mesure.", "instrument.calibrate.reflective": "Placez la sonde de mesure sur son numéro de série %s blanc réflectif de référence et pressez « Valider » pour étalonner la sonde de mesure.", "instrument.calibrating": "Étalonnage de la sonde de mesure…", "instrument.connect": "Veuillez connecter votre sonde de mesure maintenant.", "instrument.initializing": "Connexion à la sonde de mesure…", "instrument.measure_ambient": "Si votre sonde de mesure requiert une coiffe spéciale pour mesurer la lumière ambiante, veuillez la mettre en place. Pour mesurer la lumière ambiante, dirigez la sonde de mesure vers le haut, à côté de l’écran, ou si vous voulez mesurer une cabine de visionnage, placez une carte grise sans métamérisme à l’intérieur de la cabine et pointez-y la sonde de mesure. Des instructions complémentaires sur la façon de mesurer la lumière ambiante peuvent être disponibles dans la documentation de votre sonde de mesure. Appuyez sur « Valider » pour commencer la mesure.", "instrument.place_on_screen": "1. Cliquez sur « Valider ». Après 1 à 3 secondes, la fenêtre de mesure va apparaître.\n2. Placez la sonde de mesure sur la fenêtre de mesure.\n3. Appuyez sur Échap, Q ou Ctrl+C pour abandonner, ou sur toute autre touche pour commencer la mesure.", "instrument.place_on_screen.madvr": "(%i) Veuillez placer votre %s sur la zone de test", "instrument.reposition_sensor": "La mesure a échoué car le capteur de la sonde de mesure est dans la mauvaise position. Veuillez corriger la position du capteur, puis cliquer sur « Valider » pour continuer.", "internal": "Interne", "invert_selection": "Inverser la sélection", "is_embedded": "Est intégré", "is_illuminant": "Est l’illuminant", "is_linear": "Est linéaire", "laptop.icc": "Ordinateur portable (Gamma 2.2)", "libXss.so": "Extension d’économiseur d’écran X11", "library.not_found.warning": "Bibliothèque « %s » (%s) introuvable. Veuillez vous assurer qu’elle est installée avant de poursuivre.", "license": "Licence", "license_info": "Sous licence GPL", "linear": "linéaire", "*link.address.copy": "Copy link address", "log.autoshow": "Afficher automatiquement la fenêtre du journal", "luminance": "Luminance", "lut_access": "Accès à la table de correspondance", "madhcnet.outdated": "La version installée de %s trouvée sur %s est dépassée. Veuillez mettre à jour la dernière version madVR (au moins %i.%i.%i.%i).", "madtpg.launch.failure": "madTPG introuvable ou n’a pas pu être lancé.", "madvr.not_found": "Le filtre madVR DirectShow est introuvable dans le registre. Assurez-vous qu’il est installé.", "madvr.outdated": "La version de madVR utilisée est dépassée. Veuillez en effectuer la mise à jour vers la dernière version (au moins %i.%i.%i.%i).", "*madvr.wrong_levels_detected": "The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235).", "magenta": "Magenta", "make_and_model": "Marque et modèle", "manufacturer": "Fabriquant", "*mastering_display_black_luminance": "Mastering display black level", "*mastering_display_peak_luminance": "Mastering display peak luminance", "matrix": "Matrice", "matte": "Mat", "max": "Max", "maximal": "Maximal", "measure": "Mesurer", "measure.darken_background": "Arrière-plan noir", "measure.darken_background.warning": "Attention : si « arrière-plan noir » est choisi, il couvrira tout l’écran et vous ne pourrez pas voir la fenêtre d’ajustement du périphérique d’affichage ! Si vous avez un réglage multi-écrans, déplacez la fenêtre d’ajustement du périphérique d’affichage vers un autre écran avant de commencer la mesure, ou utilisez le clavier (pour interrompre la mesure, pressez Q. Si la mesure est déjà en cours, attendez un instant puis pressez Q à nouveau).", "measure.override_display_settle_time_mult": "Modifier le multiplicateur du temps d’établissement", "measure.override_min_display_update_delay_ms": "Modifier le temps de mise à jour minimum par défaut de l’affichage", "measure.testchart": "Mesurer la mire de test", "measureframe.center": "Centrer", "measureframe.info": "Déplacez la fenêtre de mesure à l’endroit désiré de l’écran et redimensionnez-la si besoin. Pratiquement toute la surface de la fenêtre sera utilisée pour afficher les échantillons à mesurer, le cercle n'est là que pour vous servir de guide pour placer votre périphérique de mesure.\nPlacez le périphérique de mesure sur la fenêtre et cliquez sur « Commencer la mesure ». Pour annuler et revenir à la fenêtre principale, fermez la fenêtre de mesure.", "measureframe.measurebutton": "Commencer la mesure", "measureframe.title": "Zone de mesure", "measureframe.zoomin": "Agrandir", "measureframe.zoommax": "Maximiser / restaurer", "measureframe.zoomnormal": "Taille normale", "measureframe.zoomout": "Réduire", "measurement.play_sound": "Effets sonores au cours des mesures", "measurement.untethered": "Mesure autonome", "measurement_file.check_sanity": "Vérifier le fichier de mesure…", "measurement_file.check_sanity.auto": "Vérifier automatiquement les mesures", "measurement_file.check_sanity.auto.warning": "Veuillez noter que la vérification automatique des mesures est une fonctionnalité expérimentale. À utiliser à vos propres risques.", "measurement_file.choose": "Veuillez choisir un fichier de mesure", "measurement_file.choose.colorimeter": "Veuillez choisir un fichier de mesure du colorimètre", "measurement_file.choose.reference": "Veuillez choisir un fichier de mesure du spectromètre", "measurement_mode": "Mode", "measurement_mode.adaptive": "Adaptatif", "measurement_mode.dlp": "DLP", "measurement_mode.factory": "Étalonnage d’usine", "measurement_mode.generic": "Générique", "measurement_mode.highres": "Haute résolution", "measurement_mode.lcd": "LCD (générique)", "measurement_mode.lcd.ccfl": "LCD (CCFL)", "measurement_mode.lcd.ccfl.2": "LCD (CCFL type 2)", "measurement_mode.lcd.oled": "LCD (OLED)", "measurement_mode.lcd.white_led": "LCD (LED blanc)", "measurement_mode.lcd.wide_gamut.ccfl": "LCD à gamut étendu (CCFL)", "measurement_mode.lcd.wide_gamut.rgb_led": "LCD à gamut étendu (LED RVB)", "measurement_mode.raw": "Brut", "measurement_mode.refresh": "à rafraîchissement (générique)", "measurement_report": "Rapport de mesure…", "measurement_report.update": "Mettre à jour le rapport de mesure…", "measurement_report_choose_chart": "Veuillez choisir la mire de test à mesurer.", "measurement_report_choose_chart_or_reference": "Veuillez choisir une mire de test ou une référence.", "measurement_report_choose_profile": "Veuillez choisir le profil à valider.", "measurement_type": "Type de mesure", "measurements.complete": "Mesures effectuées ! Voulez-vous ouvrir le répertoire contenant les fichiers de mesure ?", "measuring.characterization": "Mesure des échantillons de couleurs pour la caractérisation…", "media_black_point": "Point noir du média", "media_relative_colorimetric": "Colorimétrie relative du média", "media_white_point": "Point blanc du média", "menu.about": "À propos…", "menu.file": "Fichier", "menu.help": "?", "menu.language": "Langue", "menu.options": "Options", "menu.tools": "Outils", "menuitem.quit": "Quitter", "menuitem.set_argyll_bin": "Localiser les exécutables d’ArgyllCMS…", "metadata": "Métadonnées", "method": "Méthode", "min": "Min", "minimal": "Minimal", "model": "Modèle", "motion_picture_film_scanner": "Numériseur de film de cinéma", "mswin.open_display_settings": "Ouvrir les préférences d’affichage de Windows…", "named_color_profile": "Profil colorimétrique nommé", "named_colors": "Couleurs nommées", "native": "Natif", "negative": "Négatif", "no": "Non", "no_settings": "Le fichier ne contient pas de paramètre.", "none": "Aucun", "not_applicable": "Non applicable", "not_connected": "Non connecté", "not_found": "“%s” introuvable.", "not_now": "Pas maintenant", "number_of_entries": "Nombre d’entrées", "number_of_entries_per_channel": "Nombre d’entrées par canal", "observer": "Observateur", "observer.1931_2": "CIE 1931 2°", "observer.1955_2": "Stiles & Birch 1955 2°", "observer.1964_10": "CIE 1964 10°", "observer.1964_10c": "CIE 1964 10° / 1931 2° hybride", "observer.1978_2": "Judd & Voss 1978 2°", "observer.2012_2": "CIE 2012 2°", "observer.2012_10": "CIE 2012 10°", "observer.shaw": "Shaw & Fairchild 1997 2°", "oem.import.auto": "Si votre colorimètre est livré avec un CD de logiciel pour, veuillez l’insérer maintenant (annulez l’installation du logiciel si elle est demandée).\n\nSi vous n’avez pas de CD et que les fichiers nécessaires ne peuvent pas être trouvés d’une autre manière, ils seront téléchargés depuis le Web.", "oem.import.auto.download_selection": "Une présélection a été faite en se basant sur les sondes de mesure détectées. Veuillez sélectionner les fichiers à télécharger.", "oem.import.auto_windows": "Si le logiciel du fabricant de votre colorimètre est installé, les fichiers nécessaires seront trouvé automatiquement dans la plupart des cas.", "office_web.icc": "Bureautique et Internet (D65, Gamma 2.2)", "offset": "Décalage", "offset_lithography": "Lithographie offset", "ok": "Valider", "or": "ou", "osd": "OSD", "other": "Autre", "out": "sortie", "out_of_gamut_tag": "Indicateur de dépassement de gamut", "output.profile": "Profil cible", "output_device_profile": "Profil du périphérique de sortie", "output_levels": "Niveaux de sortie", "output_offset": "Décalage de sortie", "output_table": "Table de sortie", "overwrite": "Écraser", "panel.surface": "Surface du panneau", "panel.type": "Type de panneau", "passive_matrix_display": "Affichage à matrice passive", "patch.layout.select": "Veuillez sélectionner une disposition pour les échantillons :", "patches": "Échantillons", "patterngenerator.prisma.specify_host": "Veuillez indiquer le nom d’hôte de votre Prisma Video Processor, par ex. prisma-0123 (Windows) ou prisma-0123.local (Linux/Mac OS X). Vous pourrez trouver le nom d’hôte sur une étiquette sous le Prisma, à moins qu’il n’ait été modifié par l’intermédiaire de l’interface web d’administration de Prisma. Vous pouvez aussi entrer l’adresse IP (si elle est connue), par ex. 192.168.1.234", "patterngenerator.sync_lost": "Perte de synchronisation avec le générateur de motifs.", "pause": "Pause", "pcs_illuminant_xyz": "XYZ de l’illuminant du PCS", "pcs_relative_cct": "CCT par rapport au PCS", "pcs_relative_lab": "L*a*b* par rapport au PCS", "pcs_relative_xyz": "XYZ par rapport au PCS", "pcs_to_device_intent_0": "PCS vers périphérique : Intention 0", "pcs_to_device_intent_1": "PCS vers périphérique : Intention 1", "pcs_to_device_intent_2": "PCS vers périphérique : Intention 2", "perceptual": "Perceptuelle", "photo.icc": "Photographie (D50, Gamma 2.2)", "photo_imagesetter": "Flasheuse photo", "photographic_paper_printer": "Imprimante sur papier photo", "platform": "Plateforme", "please_wait": "Veuillez patienter…", "port.invalid": "Port %s non valable", "positive": "Positif", "preferred_cmm": "CMM préféré", "prepress.icc": "Pré-presse (D50, 130 cd/m², L*)", "preset": "Pré-réglage", "preview": "Aperçu", "profile": "Profil", "profile.advanced_gamap": "Avancé…", "profile.b2a.hires": "Améliorer la résolution effective de la table colorimétrique PCS-vers-périphérique", "profile.b2a.lowres.warning": "Il semble qu’il manque au profil les tables PCS-vers-périphérique de haute qualité, qui sont essentielle pour un fonctionnement correct. Faut-il générer les tables de haute qualité maintenant ? Ceci prendra quelques minutes.", "profile.b2a.smooth": "Lissage", "profile.choose": "Veuillez choisir un profil.", "profile.confirm_regeneration": "Voulez-vous régénérer le profil ?", "profile.current": "Profil actuel", "profile.do_not_install": "Ne pas installer le profil", "profile.iccv4.unsupported": "Les profils ICC version 4 ICC ne sont pas pris en charge.", "profile.import.success": "Le profil a été importé. Vous devez l’assigner vous-même et l’activer depuis les paramètre « Couleur » du système.", "profile.info": "Informations du profil", "profile.info.show": "Afficher les informations du profil", "profile.install": "Installer le profil", "profile.install.error": "Le profil n'a pas pu être installé/activé.", "profile.install.success": "Le profil a été installé et activé.", "profile.install.warning": "Le profil a été installé mais il peut y avoir des problèmes.", "profile.install_local_system": "Installer le profil sur l’ensemble du système", "profile.install_network": "Installer le profil sur l’ensemble du réseau", "profile.install_user": "Installer le profil pour l’utilisateur actuel uniquement", "profile.invalid": "Profil invalide.", "profile.load_error": "Le profil d’affichage n'a pu être chargé.", "profile.load_on_login": "Charger l’étalonnage à la connexion", "profile.load_on_login.handled_by_os": "Laisser le système d’exploitation traiter le chargement de l’étalonnage (faible qualité)", "profile.name": "Nom du profil", "profile.name.placeholders": "Vous pouvez utiliser les paramètres de substitution suivants dans le nom du profil :\n\n%a Nom du jour de la semaine abrégé\n%A Nom complet du jour de la semaine\n%b Nom du mois abrégé\n%B Nom complet du mois\n%d Jour du mois\n%H Heure (sur 24 heures)\n%I Heure (sur 12 heures)\n%j Jour de l’année\n%m Mois\n%M Minute\n%p AM/PM\n%S Secondes\n%U Semaine (avec dimanche comme premier jour de la semaine)\n%w Jour de la semaine (dimanche correspondant à 0)\n%W Semaine (avec lundi comme premier jour de la semaine)\n%y Année sans le siècle\n%Y Année avec le siècle", "profile.no_embedded_ti3": "Le profil ne contient pas de donnée de mesure compatible avec Argyll.", "profile.no_vcgt": "Le profil ne contient pas de courbes d’une table de correspondance", "profile.only_named_color": "Seuls les profils appelés « Couleur nommée » peuvent être utilisés.", "profile.quality": "Qualité du profil", "profile.quality.b2a.low": "Table PCS vers périphérique de basse qualité", "profile.quality.b2a.low.info": "Choisissez cette option si le profil doit être utilisé avec un mappage de gamut A2B inverse pour créer une liaison entre périphériques ou une table de correspondance 3D", "profile.required_tags_missing": "Le profil manque des balises : %s", "profile.self_check": "Auto-contrôle du profil ΔE*76", "profile.self_check.avg": "moyenne", "profile.self_check.max": "maximum", "profile.self_check.rms": "RMS", "profile.set_save_path": "Choisir le chemin d’enregistrement…", "profile.settings": "Paramètres de caractérisation", "profile.share": "Téléverser un profil…", "profile.share.avg_dE_too_high": "Le profil produit un delta E trop élevé (actuel = %s, seuil = %s).", "profile.share.b2a_resolution_too_low": "La résolution des tables du profil PCS vers périphérique est trop faible.", "profile.share.enter_info": "Vous pouvez partager votre profil avec les autres utilisateurs via le service OpenSUSE « ICC Profile Taxi ».\n\nVeuillez fournir une description significative et entrer les propriétés du périphérique d’affichage ci-dessous. Consultez les réglages du périphérique d’affichage depuis l’OSD de votre périphérique d’affichage et n'entrez que les réglages applicables à votre périphérique d’affichage qui ont changé par rapport aux valeurs par défaut.\nExemple : pour la plupart des périphériques d’affichage, il s'agit du nom de la présélection choisie, luminosité, contraste, température des couleurs et/ou niveaux RVB du point blanc, ainsi que le gamma. Sur les portables et notebooks, généralement uniquement la luminosité. Si vous avez modifié des réglages supplémentaires au cours de l’étalonnage de votre périphérique d’affichage, entrez-les également si possible.", "profile.share.meta_missing": "Le profil ne contient pas la méta-information nécessaire.", "profile.share.success": "Profil chargé.", "*profile.tags.A2B0.shaper_curves.input": "A2B0 input shaper curves", "*profile.tags.A2B0.shaper_curves.output": "A2B0 output shaper curves", "*profile.tags.A2B1.shaper_curves.input": "A2B1 input shaper curves", "*profile.tags.A2B1.shaper_curves.output": "A2B1 output shaper curves", "*profile.tags.A2B2.shaper_curves.input": "A2B2 input shaper curves", "*profile.tags.A2B2.shaper_curves.output": "A2B2 output shaper curves", "*profile.tags.B2A0.shaper_curves.input": "B2A0 input shaper curves", "*profile.tags.B2A0.shaper_curves.output": "B2A0 output shaper curves", "*profile.tags.B2A1.shaper_curves.input": "B2A1 input shaper curves", "*profile.tags.B2A1.shaper_curves.output": "B2A1 output shaper curves", "*profile.tags.B2A2.shaper_curves.input": "B2A2 input shaper curves", "*profile.tags.B2A2.shaper_curves.output": "B2A2 output shaper curves", "profile.testchart_recommendation": "Pour une qualité de profil élevée, une mire de test contenant plus d’échantillons est recommandée, mais celle-ci prendra plus de temps à mesurer. Voulez-vous utiliser la mire de test recommandée ?", "profile.type": "Type de profil", "profile.type.gamma_matrix": "gamma + matrice", "profile.type.lut.lab": "LUT L*a*b*", "profile.type.lut.xyz": "LUT XYZ", "profile.type.lut_matrix.xyz": "LUT XYZ + matrice", "profile.type.lut_rg_swapped_matrix.xyz": "LUT XYZ + matrice inversée", "profile.type.shaper_matrix": "courbes + matrice", "profile.type.single_gamma_matrix": "gamma unique + matrice", "profile.type.single_shaper_matrix": "courbe unique + matrice", "profile.unsupported": "Type de profil (%s) ou espace de couleurs (%s) non pris en charge.", "profile.update": "Mettre à jour le profil", "profile_associations": "Associations du profil…", "profile_associations.changing_system_defaults.warning": "Vous êtes en train de modifier les valeurs par défaut du système", "profile_associations.use_my_settings": "Utiliser mes paramètres pour ce périphérique d’affichage", "profile_class": "Classe de profil", "profile_connection_space_pcs": "Espace de connexion du profil (PCS)", "profile_loader": "Chargeur de profil", "profile_loader.disable": "Désactiver le chargeur de profil", "profile_loader.exceptions.known_app.error": "Le chargeur de profil se désactive lui-même automatiquement lorsque %s est en cours d’exécution. Vous ne pouvez pas outrepasser ce comportement.", "profile_loader.exit_warning": "Voulez-vous vraiment quitter le chargeur de profil ? L’étalonnage ne sera plus automatiquement rechargé si vous modifiez la configuration de l’écran !", "profile_loader.fix_profile_associations": "Corriger autimatiquement les associations du profil", "profile_loader.fix_profile_associations_warning": "Tant que le chargeur de profil est en fonctionnment, il peut s’occuper des associations du profil alors que vous modifiez la configuration de l’écran.\n\nAvant de poursuivre, veuillez vous assurer que les associations de profil ci-dessus sont correctes. Si elles ne le sont pas, suivez ces étapes :\n\n1. Ouvrir la configuration d’affichage de Windows.\n2. Activez tous les écrans connectés (bureau étendu).\n3. Ouvrir la configuration de gestion de la couleur de Windows depuis le panneau de configuration de Windows.\n4. Assurez-vous que le profil correct a été alloué à chaque écran. Fermez ensuite les paramètres de gestion de la couleur.\n5. Dans la configuration d’affichage de Windows, retournez à la configuration d’affichage précédente et fermez la configuration d’affichage.\n6. Vous pouvez maintenant activer « Corriger automatiquement les associations de profil.", "profile_loader.info": "L’état de l’étalonnage a été (ré)appliqué %i fois jusqu’à présent.\nFaites un clic-droit sur l’icône pour obtenir le menu.", "profiling": "Caractérisation", "profiling.complete": "Caractérisation achevée.", "profiling.incomplete": "La caractérisation n'a pas été achevée.", "projection_television": "Projection de télévision", "projector": "Projecteur", "projector_mode_unavailable": "Le mode Projecteur n'est disponible qu’avec ArgyllCMS 1.1.0 Bêta ou ultérieur.", "quality.ultra.warning": "La qualité Ultra ne devrait pratiquement jamais être utilisée, excepté pour prouver qu’elle ne devrait pratiquement jamais être utilisée (durée de traitement longue). Préférez plutôt une qualité moyenne ou élevée.", "readme": "Lisez-moi", "ready": "Prêt.", "red": "Rouge", "red_gamma": "Gamma du rouge", "red_lab": "Rouge L*a*b*", "red_matrix_column": "Colonne rouge de la matrice", "red_maximum": "Rouge maximum", "red_minimum": "Rouge minimum", "red_tone_response_curve": "Courbe de réponse de tonalité du rouge", "red_xyz": "Rouge XYZ", "reference": "Référence", "reflection_hardcopy_original_colorimetry": "Colorimétrie d’origine d’une copie réflective", "reflection_print_output_colorimetry": "Colorimétrie de sortie d’un tirage réflectif", "reflective": "Réflectif", "reflective_scanner": "Scanner réflectif", "remaining_time": "Temps restant (ca.)", "remove": "Supprimer", "rendering_intent": "Intention de rendu", "report": "Rapport", "report.calibrated": "Établir un rapport sur le périphérique d’affichage étalonné", "report.uncalibrated": "Établir un rapport sur le périphérique d’affichage non étalonné", "report.uniformity": "Mesurer l’uniformité du périphérique d’affichage…", "reset": "Réinitialiser", "resources.notfound.error": "Erreur fatale - un fichier requis n'a pas été trouvé :", "resources.notfound.warning": "Attention - des fichiers requis n'ont pas été trouvés :", "response.invalid": "Réponse non valable de %s: %s", "response.invalid.missing_key": "Réponse non valable de %s : clé manquante « %s » : %s", "response.invalid.value": "Réponse non valable de %s : la valeur de la clé « %s » ne correspond pas à la valeur attendue « %s » : %s", "restore_defaults": "Restaurer les valeurs par défaut", "rgb.trc": "Fonction de transfert RVB", "rgb.trc.averaged": "Fonction de transfert RVB moyen", "sRGB.icc": "sRGB", "saturation": "Saturation", "save": "Enregistrer", "save_as": "Enregistrer sous…", "scene_appearance_estimates": "Estimation de l’apparence de la scène", "scene_colorimetry_estimates": "Estimation de la colorimétrie de la scène", "scripting-client": "Client de scripting de DisplayCAL", "scripting-client.cmdhelptext": "Presser la touche de tabulation lors d’une invite de commande vide afin de voir les commandes possibles dans le contexte actuel, ou faire l’auto-complétion des caractères initiaux déjà entrés. Entrez « getcommands » pour une liste des commandes prises en charge et les paramètres possibles des applications connectées.", "scripting-client.detected-hosts": "Hôtes de scripting détectés :", "select_all": "Tout sélectionner", "set_as_default": "Définir comme valeur par défaut", "setting.keep_current": "Conserver le réglage actuel", "settings.additional": "Paramètres supplémentaires", "settings.basic": "Paramètres de base", "settings.new": "", "settings_loaded": "Les courbes d’étalonnage et les paramètres d’étalonnage suivants ont été chargés : %s. Les autres options d’étalonnage ont été restaurées à leurs valeurs par défaut et les options de caractérisation n'ont pas été modifiées.", "settings_loaded.cal": "Le profil ne contenait que des paramètres d’étalonnage. Les autres options n'ont pas été modifiées. Aucune courbe d’étalonnage n'a été trouvée.", "settings_loaded.cal_and_lut": "Le profil ne contenait que des paramètres d’étalonnage. Les autres options n'ont pas été modifiées et les courbes d’étalonnage ont été chargées.", "settings_loaded.cal_and_profile": "Les paramètres ont été chargés. Aucune courbe d’étalonnage n'a été trouvée.", "settings_loaded.profile": "Le profil ne contenait que des réglages de caractérisation. Les autres options n'ont pas été modifiées. Aucune courbe d’étalonnage n'a été trouvée.", "settings_loaded.profile_and_lut": "Le profil ne contenait que des paramètres de caractérisation. Les autres options n'ont pas été modifiées et les courbes d’étalonnage ont été chargées.", "show_advanced_options": "Afficher les options avancées", "*show_notifications": "Show notifications", "silkscreen": "Sérigraphieuse", "simulation_profile": "Profil de simulation", "size": "Taille", "skip_legacy_serial_ports": "Passer les anciens ports série", "softproof.icc": "Épreuvage à l’écran (5800K, 160 cd/m², L*)", "spectral": "Spectral", "*ssl.certificate_verify_failed": "The remote certificate could not be verified.", "*ssl.certificate_verify_failed.root_ca_missing": "The remote certificate could not be verified because no suitable root certificates were found on the local system.", "*ssl.handshake_failure": "Handshake failure. A secure connection could not be established.", "startup": "Démarrage…", "startup_sound.enable": "Activer le son de démarrage", "success": "… opération terminée.", "surround_xyz": "Surround XYZ", "synthicc.create": "Créer un profil ICC synthétique…", "target": "Cible", "tc.3d": "Créer un fichier de diagnostic 3D", "tc.I": "mire cubique centrée de l’espace perceptuel", "tc.Q": "distribution quasi-aléatoire du remplissage de l’espace perceptuel", "tc.R": "distribution aléatoire dans l’espace perceptuel", "tc.adaption": "Adaptation", "tc.algo": "Distribution", "tc.angle": "Angle", "tc.black": "Échantillons noirs", "tc.dark_emphasis": "Accentuation des zones sombres", "tc.fullspread": "Échantillons itératifs", "tc.gray": "Échantillons neutres", "tc.i": "mire cubique centrée de l’espace du périphérique", "tc.limit.sphere": "Limiter les échantillons à la sphère", "tc.limit.sphere_radius": "Rayon", "tc.multidim": "Multidimensionnel", "tc.multidim.patches": "étapes = %s échantillons (%s neutres)", "tc.neutral_axis_emphasis": "Accentuation de l’axe neutre", "tc.ofp": "échantillonnage optimisé du point le plus éloigné", "tc.patch": "Échantillon", "tc.patches.selected": "sélectionné(s) ", "tc.patches.total": "Nombre total d’échantillons ", "tc.precond": "Préconditionnement du profil", "tc.precond.notset": "Veuillez sélectionner un profil de préconditionnement.", "tc.preview.create": "Création de l’aperçu en cours, veuillez patienter…", "tc.q": "distribution quasi-aléatoire du remplissage de l’espace du périphérique", "tc.r": "distribution aléatoire dans l’espace du périphérique", "tc.single": "Échantillons de canal unique", "tc.single.perchannel": "par canal", "tc.t": "échantillonnage incrémental du point éloigné", "tc.vrml.black_offset": "Décalage du noir RVB (L*)", "tc.vrml.use_D50": "Blanc RVB neutre", "tc.white": "Échantillons blancs", "technology": "Technologie", "tempdir_should_still_contain_files": "Les fichiers créés devraient être encore dans le répertoire temporaire “%s”.", "testchart.add_saturation_sweeps": "Ajouter des courbes de saturation", "testchart.add_ti3_patches": "Ajouter des échantillons de référence…", "testchart.auto_optimize.untethered.unsupported": "L’affichage virtuel non connecté ne prend pas en charge l’optimisation automatique des mires de test.", "testchart.change_patch_order": "Changer l’ordre des échantillons", "testchart.confirm_select": "Fichier enregistré. Voulez-vous sélectionner cette mire de test ?", "testchart.create": "Créer une mire de test", "testchart.discard": "Supprimer", "testchart.dont_select": "Ne pas sélectionner", "testchart.edit": "Éditer la mire de test…", "testchart.export.repeat_patch": "Répéter chaque échantillon :", "testchart.file": "Mire de test", "testchart.info": "Nombre d’échantillons de la mire de test sélectionnée", "testchart.interleave": "Entrelacer", "testchart.maximize_RGB_difference": "Maximiser la différence RBV", "testchart.maximize_lightness_difference": "Maximiser la différence de luminosité", "testchart.maximize_rec709_luma_difference": "Maximiser la différence de luma", "testchart.optimize_display_response_delay": "Minimiser le temps de réponse de l’affichage", "testchart.patch_sequence": "Séquence des échantillons", "testchart.patches_amount": "Nombre d’échantillons", "testchart.read": "Lecture de la mire de test…", "testchart.save_or_discard": "La mire de test n'a pas été enregistrée.", "testchart.select": "Sélectionner", "testchart.separate_fixed_points": "Veuillez choisir les échantillons à ajouter dans une étape séparée.", "testchart.set": "Choisir une mire de test", "testchart.shift_interleave": "Décaler et entrelacer", "testchart.sort_RGB_blue_to_top": "Placer le bleu RVB vers le haut", "testchart.sort_RGB_cyan_to_top": "Placer le cyan RVB vers le haut", "testchart.sort_RGB_gray_to_top": "Placer le gris RVB vers le haut", "testchart.sort_RGB_green_to_top": "Placer le vert RVB vers le haut", "testchart.sort_RGB_magenta_to_top": "Placer le magenta RVB vers le haut", "testchart.sort_RGB_red_to_top": "Placer le rouge RVB vers le haut", "testchart.sort_RGB_white_to_top": "Placer le blanc RVB vers le haut", "testchart.sort_RGB_yellow_to_top": "Placer le jaune RVB vers le haut", "testchart.sort_by_BGR": "Trier en fonction de BVR", "testchart.sort_by_HSI": "Trier en fonction de TSI", "testchart.sort_by_HSL": "Trier en fonction de TSL", "testchart.sort_by_HSV": "Trier en fonction de TSV", "testchart.sort_by_L": "Trier en fonction de L*", "testchart.sort_by_RGB": "Trier en fonction de RVB", "testchart.sort_by_RGB_sum": "Trier en fonction de la somme de RVB", "testchart.sort_by_rec709_luma": "Trier en fonction de la luma", "testchart.vary_RGB_difference": "Varier la différence RVB", "testchart_or_reference": "Mire de test ou référence", "thermal_wax_printer": "Imprimante à cire thermique", "tone_values": "Valeurs de teinte", "transfer_function": "Fonction de transfert", "translations": "Traductions ", "transparency": "Transparence", "trashcan.linux": "corbeille", "trashcan.mac": "corbeille", "trashcan.windows": "corbeille", "trc": "Courbe de tonalité", "trc.dicom": "DICOM", "trc.gamma": "Gamma", "*trc.hlg": "Hybrid Log-Gamma", "trc.lstar": "L*", "trc.rec709": "Rec. 709", "trc.rec1886": "Rec. 1886", "trc.should_use_viewcond_adjust": "Si vous utilisez les courbes SMPTE 240M, Rec. 709 ou sRGB, vous devriez recourir à un ajustement des niveaux de votre lumière ambiante afin d’obtenir des résultats corrects. Pour cela, cochez la case à côté de « Niveau de luminosité ambiante » et entrez une valeur en Lux. Vous pouvez éventuellement mesurer aussi la luminosité ambiante au cours de l’étalonnage, si votre sonde de mesure le permet.", "trc.smpte240m": "SMPTE 240M", "trc.smpte2084": "SMPTE 2084", "trc.smpte2084.hardclip": "SMPTE 2084 (écrêtage dur « hard clip »)", "trc.smpte2084.rolloffclip": "SMPTE 2084 (écrêtage progressif « roll-off clip »)", "trc.srgb": "sRGB", "trc.type.absolute": "absolu", "trc.type.relative": "relatif", "turn_off": "Désactiver", "type": "Type", "udev_hotplug.unavailable": "Ni udev ni hotplug n’ont été détectés.", "unassigned": "Non assigné", "uninstall": "Désinstaller", "uninstall_display_profile": "Désinstallation du profil du périphérique d’affichage…", "unknown": "inconnu", "unmodified": "Inchangé", "unnamed": "Sans nom", "unspecified": "Non précisé", "update_check": "Vérifier si l’application est à jour…", "update_check.fail": "Échec de la vérification de la mise à jour de l’application :", "update_check.fail.version": "La version du fichier distant du serveur %s n'a pu être analysée.", "update_check.new_version": "Une mise à jour est disponible : %s", "update_check.onstartup": "Vérifier la mise à jour de l’application au démarrage", "update_check.uptodate": "%s est à jour.", "update_now": "Mettre à jour maintenant", "upload": "Chargement", "use_fancy_progress": "Utiliser un dialogue d’avancement fantaisie", "use_separate_lut_access": "Utiliser un accès séparé à la table de gamma de la carte vidéo", "use_simulation_profile_as_output": "Utiliser un profil de simulation comme profil cible", "vcgt": "Courbes d’étalonnage", "vcgt.mismatch": "Les tables de gamma de carte vidéo de l’écran %s ne correspondent pas à l’état désité.", "vcgt.unknown_format": "Format de tables de gamma de carte vidéo inconnu dans le profil « %s ».", "verification": "Vérification", "verification.settings": "Paramètres de vérification", "verify.ti1": "mire de test de vérification du profil", "verify_extended.ti1": "mire de test étendue de vérification", "verify_grayscale.ti1": "mire de test de vérification d’équilibre du gris", "verify_large.ti1": "mire de test de vérification Large", "verify_video.ti1": "mire de test de vérification (vidéo)", "verify_video_extended.ti1": "mire de test étendue de vérification (vidéo)", "*verify_video_extended_hlg_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, Hybrid Log-Gamma)", "*verify_video_extended_smpte2084_100_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²)", "*verify_video_extended_smpte2084_200_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²)", "*verify_video_extended_smpte2084_500_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²)", "*verify_video_extended_smpte2084_1000_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²)", "verify_video_large.ti1": "mire de test de vérification LARGE (vidéo)", "verify_video_xl.ti1": "mire de test de vérification Extra Large (vidéo)", "verify_video_xxl.ti1": "mire de test de vérification XXL (vidéo)", "verify_video_xxxl.ti1": "mire de test de vérification XXXL (vidéo)", "verify_xl.ti1": "mire de test de vérification Extra Large", "verify_xxl.ti1": "mire de test de vérification XXL", "verify_xxxl.ti1": "mire de test de vérification XXXL", "vga": "VGA", "video.icc": "Vidéo (D65, Rec. 1886)", "video_Prisma.icc": "LUT vidéo 3D pour Prisma (D65, Rec. 709 / Rec. 1886)", "video_ReShade.icc": "LUT vidéo 3D pour ReShade (D65, Rec. 709 / Rec. 1886)", "video_camera": "Caméra vidéo", "video_card_gamma_table": "Table de gamma de la carte vidéo", "video_eeColor.icc": "LUT vidéo 3D pour eeColor (D65, Rec. 709 / Rec. 1886)", "video_madVR.icc": "LUT vidéo 3D pour madVR (D65, Rec. 709 / Rec. 1886)", "video_madVR_ST2084.icc": "LUT 3D de vidéo HDR pour madVR (D65, Rec. 2020 / SMPTE 2084)", "video_monitor": "Moniteur vidéo", "video_resolve.icc": "LUT vidéo 3D pour Resolve (D65, Rec. 709 / Rec. 1886)", "view.3d": "Vue 3D", "viewing_conditions": "Conditions de visualisation", "viewing_conditions_description": "Description des conditions de visualisation", "vrml_to_x3d_converter": "Convertisseur de VRML vers X3D", "warning": "Attention", "warning.already_exists": "Le fichier « %s » existe déjà à l’emplacement choisi et sera écrasé. Voulez-vous continuer ?", "warning.autostart_system": "Le répertoire d’autodémarrage système n'a pu être déterminé.", "warning.autostart_user": "Le répertoire d’autodémarrage spécifique à l’utilisateur/trice n'a pu être déterminé.", "warning.discard_changes": "Voulez-vous réellement annuler les modifications des paramètres actuels ?", "warning.input_value_clipping": "Attention : les valeurs d’entrée en dessous du point noir de la cible seront tronquées !", "warning.suspicious_delta_e": "Attention : des mesures suspectes ont été trouvées. Veuillez noter que ce contrôle suppose un périphérique d’affichage de type sRGB. Si votre périphérique d’affichage diffère de ce pré-supposé (p. ex. s'il a un très grand gamut ou une réponse de ton trop éloignée de sRGB), alors les erreurs trouvées ne sont probablement pas significatives.\n\nUn ou l’ensemble de ces critères ont été vérifiés :\n\n• Échantillons consécutifs avec différents nombres RVB, mais ΔE*00 étrangement bas entre les des mesures.\n• Gris RVB avec nombres RVB croissants par rapport à l’échantillon précédent, mais luminosité décroissante (L*).\n• Gris RVB avec nombres RVB décroissants par rapport à l’échantillon précédent, mais luminosité croissante (L*).\n• ΔE*00 et ΔL*00 ou ΔH*00 ou ΔC*00 inhabituellement élevés des mesures par rapport à l’équivalent sRGB des nombres RVB.\n\nCeci pourrait signifier des erreurs de mesure. Les valeurs considérées comme problématiques (ce qui ne l’est pas forcément !) sont surlignées en rouge. Contrôlez soigneusement les mesures et marquez celles que vous désirez conserver. Vous pouvez également éditer les valeurs RVB et XYZ.", "warning.suspicious_delta_e.info": "Explication des colonnes Δ :\n\nΔE*00 XYZ A/B : ΔE*00 des valeurs mesurées par rapport aux valeurs mesurées de l’échantillon précédent. Si cette valeur est manquante, ce n’était pas un pris en compte lors de la vérification. Si elle est présente, alors elle est supposée être trop basse.\n\n0.5 ΔE*00 RVB A/B : ΔE*00 de l’équivalent sRGB des nombres RVB par rapport à l’équivalent sRGB des nombres RVB de l’échantillon précédent (avec un facteur de 0,5). Si cette valeur est présente, elle représente la valeur (minimale) de comparaison pendant la vérification pour ΔE*00 XYZ A/B considéré comme étant trop bas. Elle sert d’orientation très grossière.\n\nΔE*00 RVB-XYZ : ΔE*00 des valeurs mesurées par rapport à l’équivalent sRGB des nombres RVB.\nΔL*00 RVB-XYZ : ΔL*00 des valeurs mesurées par rapport à l’équivalent sRGB des nombres RVB.\nΔC*00 RVB-XYZ : ΔC*00 des valeurs mesurées par rapport à l’équivalent sRGB des nombres RVB.\nΔH*00 RVB-XYZ : ΔH*00 des valeurs mesurées par rapport à l’équivalent sRGB des nombres RVB.", "warning.system_file": "Attention, « %s » est un système de fichiers. Voulez-vous vraiment poursuivre ?", "webserver.waiting": "Serveur web en attente sur", "welcome": "Bienvenue !", "welcome_back": "Bienvenue à nouveau !", "white": "Blanc", "whitepoint": "Point blanc", "whitepoint.colortemp": "température", "whitepoint.colortemp.locus.blackbody": "corps noir", "whitepoint.colortemp.locus.curve": "Courbe de température des couleurs", "whitepoint.colortemp.locus.daylight": "lumière du jour", "whitepoint.set": "Voulez-vous également régler le point blanc à la valeur mesurée ?", "whitepoint.simulate": "Simuler le point blanc", "whitepoint.simulate.relative": "Par rapport au point blanc du profil cible", "whitepoint.visual_editor": "Éditeur visuel de point blanc", "whitepoint.visual_editor.display_changed.warning": "Attention : la configuration de l’affichage a chagé et l’éditeur visuel de point blanc peut ne plus être capable de restaurer les profils d’affichage. Veuillez vérifier soigneusement les associations du profil d’affichage après avoir fermé l’éditeur et redémarré DisplayCAL.", "whitepoint.xy": "coordonnées de chromaticité", "window.title": "DisplayCAL", "windows.version.unsupported": "Cette version de Windows n'est pas supportée.", "windows_only": "Windows uniquement", "working_dir": "Répertoire de travail :", "yellow": "Jaune", "yellow_lab": "Jaune L*a*b*", "yellow_xyz": "Jaune XYZ", "yes": "Oui", } DisplayCAL-3.5.0.0/DisplayCAL/lang/it.json0000644000076500000000000025270213242301041017651 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "Tommaso Schiavinotto", "!language": "Italiano", "!language_name": "ITALIAN", "*3dlut": "3D LUT", "*3dlut.1dlut.videolut.nonlinear": "The display device's video card gamma tables 1D LUT calibration is non-linear, but the 3D LUT contains applied 1D LUT calibration. Make sure to manually reset the video card gamma tables to linear before using the 3D LUT, or create a 3D LUT without calibration applied (to do the latter, enable “Show advanced options” in the “Options” menu and disable “Apply calibration (vcgt)” as well as “Create 3D LUT after profiling” in the 3D LUT settings, then create a new 3D LUT).", "*3dlut.bitdepth.input": "3D LUT input bitdepth", "*3dlut.bitdepth.output": "3D LUT output bitdepth", "*3dlut.confirm_relcol_rendering_intent": "Do you want the 3D LUT to use the measured white point as well (3D LUT rendering intent will be set to relative colorimetric)?", "*3dlut.content.colorspace": "Content colorspace", "*3dlut.create": "Create 3D LUT...", "*3dlut.create_after_profiling": "Create 3D LUT after profiling", "*3dlut.enable": "Enable 3D LUT", "*3dlut.encoding.input": "Input encoding", "*3dlut.encoding.output": "Output encoding", "*3dlut.encoding.output.warning.madvr": "Warning: This output encoding is not recommended and will cause clipping if madVR is not set up to output “TV levels (16-235)” under “Devices” → “%s” → “Properties”. Use at own risk!", "*3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "*3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "*3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "*3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "*3dlut.encoding.type_C": "TV Rec. 2020 Constant Luminance YCbCr UHD", "*3dlut.encoding.type_T": "TV RGB 16-235 (clip WTW)", "*3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "*3dlut.encoding.type_n": "Full range RGB 0-255", "*3dlut.encoding.type_t": "TV RGB 16-235", "*3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD", "*3dlut.format": "3D LUT file format", "*3dlut.format.3dl": "Autodesk / Kodak (.3dl)", "*3dlut.format.ReShade": "ReShade (.png, .fx)", "*3dlut.format.cube": "IRIDAS (.cube)", "*3dlut.format.eeColor": "eeColor Processor (.txt)", "*3dlut.format.icc": "Device link profile (.icc/.icm)", "*3dlut.format.madVR": "madVR (.3dlut)", "*3dlut.format.madVR.hdr": "Process HDR content", "*3dlut.format.madVR.hdr.confirm": "Note that you need to have profiled the display in HDR mode. If the display doesn't support HDR natively, click “Cancel”.", "*3dlut.format.madVR.hdr_to_sdr": "Convert HDR content to SDR", "*3dlut.format.mga": "Pandora (.mga)", "*3dlut.format.png": "PNG (.png)", "*3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "*3dlut.frame.title": "Create 3D LUT", "*3dlut.hdr.rolloff.diffuse_white": "Diffuse white (reference 94.38 cd/m²)", "*3dlut.hdr.system_gamma": "System gamma (reference 1.2)", "*3dlut.holder.assign_preset": "Assign 3D LUT to preset:", "*3dlut.holder.out_of_memory": "%s is out of 3D LUT storage space (at least %i KB required). Please delete a few 3D LUTs from %s to make space for new ones. See your %s's documentation for more information.", "*3dlut.input.colorspace": "Source colorspace", "*3dlut.input.profile": "Source profile", "*3dlut.install": "Install 3D LUT", "*3dlut.install.failure": "3D LUT installation failed (unknown error).", "*3dlut.install.success": "3D LUT installation successful!", "*3dlut.install.unsupported": "3D LUT installation is not supported for the selected 3D LUT format.", "*3dlut.save_as": "Save 3D LUT as...", "*3dlut.settings": "3D LUT settings", "*3dlut.size": "3D LUT size", "*3dlut.tab.enable": "Enable 3D LUT tab", "*3dlut.use_abstract_profile": "Abstract (“Look”) profile", "*CMP_Digital_Target-3.cie": "CMP Digital Target 3", "*CMP_Digital_Target-4.cie": "CMP Digital Target 4", "*CMYK_IDEAlliance_ControlStrip_2009.ti1": "CMYK IDEAlliance Control Strip 2009", "*CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": "CMYK IDEAlliance ISO 12647-7 Control Wedge 2013", "*CMYK_ISO_12647-7_outer_gamut.ti1": "CMYK ISO 12647-7 outer gamut", "*ColorChecker.cie": "ColorChecker", "*ColorCheckerDC.cie": "ColorChecker DC", "*ColorCheckerPassport.cie": "ColorChecker Passport", "*ColorCheckerSG.cie": "ColorChecker SG", "*FograStrip2.ti1": "Fogra Media Wedge CMYK V2.0", "*FograStrip3.ti1": "Fogra Media Wedge CMYK V3.0", "*ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008 color accuracy and gray balance", "*ISO_14861_color_accuracy_RGB318.ti1": "ISO 14861:2015 color accuracy and gray balance", "*QPcard_201.cie": "QPcard 201", "*QPcard_202.cie": "QPcard 202", "*SpyderChecker.cie": "SpyderCHECKR", "*Untethered": "Untethered", "*[rgb]TRC": "Tone response curves", "aborted": "...annullato.", "*aborting": "Aborting, please wait (this may take a few seconds)...", "*abstract_profile": "Abstract profile", "*active_matrix_display": "Active matrix display", "*adaptive_mode_unavailable": "Adaptive mode is only available with ArgyllCMS 1.1.0 RC3 or newer.", "*add": "Add...", "*advanced": "Advanced", "*allow_skip_sensor_cal": "Allow skipping of spectrometer self-calibration", "*ambient.measure": "Measure ambient", "*ambient.measure.color.unsupported": "%s: The color of ambient light could not be determined using this instrument because its ambient sensor seems to be monochromatic (only got a light level reading).", "*ambient.measure.light_level.missing": "Didn't get a light level reading.", "*ambient.set": "Do you also want to set the ambient light level to the measured value?", "*app.client.connect": "Scripting client %s:%s connected", "*app.client.disconnect": "Scripting client %s:%s disconnected", "*app.client.ignored": "Refused connection attempt of scripting client %s:%s: %s", "*app.client.network.disallowed": "Refused connection attempt of scripting client %s:%s: Network clients are not allowed.", "app.confirm_restore_defaults": "Vuoi davvero perdere le tue modifiche e usare le impostazioni predefinite?", "*app.detected": "Detected %s.", "*app.detected.calibration_loading_disabled": "Detected %s. Calibration loading disabled.", "*app.detection_lost": "No longer detecting %s.", "*app.detection_lost.calibration_loading_enabled": "No longer detecting %s. Calibration loading enabled.", "*app.incoming_message": "Received scripting request from %s:%s: %s", "*app.incoming_message.invalid": "Scripting request invalid!", "*app.listening": "Setting up scripting host at %s:%s", "*app.otherinstance": "%s is already running.", "*app.otherinstance.notified": "Already running instance has been notified.", "apply": "Applicare", "*apply_black_output_offset": "Apply black output offset (100%)", "*apply_cal": "Apply calibration (vcgt)", "*apply_cal.error": "Calibration could not be applied.", "*archive.create": "Create compressed archive...", "*archive.import": "Import archive...", "*archive.include_3dluts": "Do you want to include 3D LUT files in the archive (not recommended, leads to larger archive file size)?", "*argyll.debug.warning1": "Please only use this option if you actually need debugging information (e.g. for troubleshooting ArgyllCMS functionality)! It is normally only useful for software developers to aid in problem diagnosis and resolution. Are you sure you want to enable debugging output?", "*argyll.debug.warning2": "Please remember to disable debugging output for normal operation of the software.", "argyll.dir": "Directory con gli eseguibili di ArgyllCMS:", "argyll.dir.invalid": "Gli eseguibili ArgyllCMS non sono stati trovati!\nSeleziona la directory che contiene gli eseguibili (prefisso o suffisso forse “argyll-” / “-argyll”): %s", "*argyll.error.detail": "Detailed ArgyllCMS error message:", "*argyll.instrument.configuration_files.install": "Install ArgyllCMS instrument configuration files...", "*argyll.instrument.configuration_files.install.success": "Installation of ArgyllCMS instrument configuration files complete.", "*argyll.instrument.configuration_files.uninstall": "Uninstall ArgyllCMS instrument configuration files...", "*argyll.instrument.configuration_files.uninstall.success": "Uninstallation of ArgyllCMS instrument configuration files complete.", "*argyll.instrument.driver.missing": "The ArgyllCMS driver for your measurement device seems not to be installed or installed incorrectly. Please check if your measurement device is shown in Windows' Device Manager under „Argyll LibUSB-1.0A devices“ and (re-)install the driver if necessary. Please read the documentation for installation instructions.", "*argyll.instrument.drivers.install": "Install ArgyllCMS instrument drivers...", "*argyll.instrument.drivers.install.confirm": "You only need to install the ArgyllCMS specific drivers if you have a measurement instrument that is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10.\n\nDo you want to proceed?", "*argyll.instrument.drivers.install.failure": "Installation of ArgyllCMS instrument drivers failed.", "*argyll.instrument.drivers.install.restart": "You need to disable Driver Signature Enforcement to install the ArgyllCMS instrument drivers. For this purpose, the system needs to be restarted. Select “Troubleshoot” on the page that will appear, then “Advanced Options”, “Startup Settings” and finally “Restart”. On startup, select “Disable Driver Signature Enforcement”. After the restart, choose “Install ArgyllCMS instrument drivers...” in the menu again to install the drivers. If you don't see the “Troubleshoot” option, please refer to the DisplayCAL documentation section “Instrument driver installation under Windows” for an alternate method to disable Driver Signature Enforcement.", "*argyll.instrument.drivers.uninstall": "Uninstall ArgyllCMS instrument drivers...", "*argyll.instrument.drivers.uninstall.confirm": "Note: Uninstallation doesn't affect instrument drivers that are currently in use, but just removes the driver from Windows' Driver Store. If you want to switch back to an installed vendor-supplied driver for your instrument, you'll have to use Windows' Device Manager to manually switch to the vendor driver. To do that, right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the vendor driver for your instrument from the list.\n\nDo you want to proceed?", "*argyll.instrument.drivers.uninstall.failure": "Uninstallation of ArgyllCMS instrument drivers failed.", "*argyll.instrument.drivers.uninstall.success": "Uninstallation of ArgyllCMS instrument drivers complete.", "*argyll.util.not_found": "ArgyllCMS “%s” executable not found!", "as_measured": "Nativo", "*attributes": "Attributes", "*audio.lib": "Audio module: %s", "*auth": "Authentification", "*auth.failed": "Authentification failed.", "*auto": "Auto", "*auto_optimized": "Auto-optimized", "*autostart_remove_old": "Removing old autostart entry", "*backing_xyz": "Backing XYZ", "*backlight": "Backlight", "*bitdepth": "Bitdepth", "*black": "Black", "*black_lab": "Black L*a*b*", "*black_point": "Black point", "*black_point_compensation": "Black point compensation", "*black_point_compensation.3dlut.warning": "When creating a 3D LUT, the black point compensation profiling setting should be turned off, because it affects the function of the tone curve adjustment. Would you like to turn off black point compensation?", "*black_point_compensation.info": "Black point compensation effectively prevents black crush, but reduces the accuracy of color conversion.", "*black_white": "Black & white", "*black_xyz": "Black XYZ", "*blacklevel": "Black level", "*blue": "Blue", "*blue_gamma": "Blue gamma", "*blue_lab": "Blue L*a*b*", "*blue_matrix_column": "Blue matrix column", "*blue_maximum": "Blue maximum", "*blue_minimum": "Blue minimum", "*blue_tone_response_curve": "Blue tone response curve", "*blue_xyz": "Blue XYZ", "*brightness": "Brightness", "browse": "Selezionare...", "*bug_report": "Report a bug...", "button.calibrate": "Calibra solamente", "button.calibrate_and_profile": "Calibra & Crea profilo", "button.profile": "Crea solamente il profilo", "cal_extraction_failed": "Impossibile estrare i dati di calibrazione dal profilo.", "*calculated_checksum": "Calculated checksum", "*calibrate_instrument": "Spectrometer self-calibration", "*calibration": "Calibration", "calibration.ambient_viewcond_adjust": "Livello della luce ambientale", "calibration.ambient_viewcond_adjust.info": "Per eseguire una correzione sulle condizioni di visualizzazione quando vengono calcolate le curve di calibrazione, spunta la casella ed inserisci il livello della luce ambientale. Se lo strumento lo permette, è possibile misurare la luce ambientale durante la calibrazione.", "calibration.black_luminance": "Livello del nero", "calibration.black_output_offset": "Compensazione per il livello di uscita del nero", "calibration.black_point_correction": "Correzione del punto di nero", "calibration.black_point_correction_choice": "La correzione del punto di nero può essere disabilitata, per ottimizzare il livello di nero ed il rapporto di contrasto (raccomandato per la maggior parte dei monitor LCD), può essere invece abilitata per fare in modo che il nero abbia la stessa tinta del punto di bianco (raccomandato per la maggior parte dei monitor CRT). Imposta la tua preferenza sulla correzione del punto di nero.", "calibration.black_point_rate": "Rapporto", "*calibration.check_all": "Check settings", "calibration.complete": "Calibrazione completa!", "*calibration.create_fast_matrix_shaper": "Create matrix profile", "*calibration.create_fast_matrix_shaper_choice": "Do you want to create a fast matrix shaper profile from calibration measurements or just calibrate?", "*calibration.do_not_use_video_lut": "Do not use video card gamma table to apply calibration", "*calibration.do_not_use_video_lut.warning": "Do you really want to change the recommended setting?", "*calibration.embed": "Embed calibration curves in profile", "calibration.file": "Impostazioni", "calibration.file.invalid": "Il file delle impostazioni scelto non è valido.", "calibration.file.none": "", "calibration.incomplete": "La calibrazione non è stata completata.", "calibration.interactive_display_adjustment": "Correzione interattiva dello schermo", "*calibration.interactive_display_adjustment.black_level.crt": "Select “Start measurement” and adjust your display's brightness and/or RGB offset controls to match the desired level.", "*calibration.interactive_display_adjustment.black_point.crt": "Select “Start measurement” and adjust your display's RGB offset controls to match the desired black point.", "*calibration.interactive_display_adjustment.check_all": "Select “Start measurement” to check on the overall settings.", "*calibration.interactive_display_adjustment.generic_hint.plural": "A good match is obtained if all bars can be brought to the marked position in the center.", "*calibration.interactive_display_adjustment.generic_hint.singular": "A good match is obtained if the bar can be brought to the marked position in the center.", "*calibration.interactive_display_adjustment.start": "Start measurement", "*calibration.interactive_display_adjustment.stop": "Stop measurement", "*calibration.interactive_display_adjustment.white_level.crt": "Select “Start measurement” and adjust your display's contrast and/or RGB gain controls to match the desired level.", "*calibration.interactive_display_adjustment.white_level.lcd": "Select “Start measurement” and adjust your display's backlight/brightness control to match the desired level.", "*calibration.interactive_display_adjustment.white_point": "Select “Start measurement” and adjust your display's color temperature and/or RGB gain controls to match the desired white point.", "calibration.load": "Caricamento delle impostazioni...", "*calibration.load.handled_by_os": "Calibration loading is handled by the operating system.", "calibration.load_error": "Impossibile leggere le curve calibrazione.", "calibration.load_from_cal": "Caricamento delle curve calibrazione dal file di calibrazione...", "calibration.load_from_cal_or_profile": "Caricamento delle curve calibrazione dal file di calibrazione o di profilo...", "calibration.load_from_display_profile": "Caricamento delle curve calibrazione dal profilo corrente dello schermo", "*calibration.load_from_display_profiles": "Load calibration from current display device profile(s)", "calibration.load_from_profile": "Caricamento delle curve di calibrazione dal profilo...", "calibration.load_success": "Lettura delle curve calibrazione completata con successo.", "calibration.loading": "Caricamento delle curve calibrazione da file...", "calibration.loading_from_display_profile": "Caricamento delle curve calibrazione dell'attuale profilo dello schermo in corso...", "calibration.luminance": "Livello di bianco", "*calibration.lut_viewer.title": "Curves", "*calibration.preserve": "Preserve calibration state", "calibration.preview": "Anteprima calibrazione", "calibration.quality": "Qualità calibrazione", "calibration.quality.high": "Alta", "calibration.quality.low": "Bassa", "calibration.quality.medium": "Media", "calibration.quality.ultra": "Ultra", "*calibration.quality.verylow": "Very low", "calibration.reset": "Ripristino curve calibrazione", "calibration.reset_error": "Le curve calibrazione non possono essere ripristinate.", "calibration.reset_success": "Le curve calibrazione sono state ripristinate con successo.", "calibration.resetting": "Ripristino delle curve calibrazione a lineari in corso...", "calibration.settings": "Impostazioni per la calibrazione", "*calibration.show_actual_lut": "Show calibration curves from video card", "*calibration.show_lut": "Show curves", "*calibration.skip": "Continue on to profiling", "calibration.speed": "Velocità calibrazione", "calibration.speed.high": "Alta", "calibration.speed.low": "Bassa", "calibration.speed.medium": "Media", "calibration.speed.veryhigh": "Molto alta", "calibration.speed.verylow": "Molto bassa", "*calibration.start": "Continue on to calibration", "calibration.turn_on_black_point_correction": "Abilita", "calibration.update": "Aggiorna calibrazione", "*calibration.update_profile_choice": "Do you want to also update the calibration curves in the existing profile or just calibrate?", "*calibration.use_linear_instead": "Use linear calibration instead", "calibration.verify": "Verifica calibrazione", "calibration_profiling.complete": "Calibrazione e creazione profilo completati!", "*calibrationloader.description": "Sets ICC profiles and loads calibration curves for all configured display devices", "*can_be_used_independently": "Can be used independently", "cancel": "Annulla", "*cathode_ray_tube_display": "Cathode ray tube display", "*ccmx.use_four_color_matrix_method": "Minimize xy chromaticity difference", "*ccxx.ti1": "Testchart for colorimeter correction", "*centered": "Centered", "*channel_1_c_xy": "Channel 1 (C) xy", "*channel_1_gamma_at_50_input": "Channel 1 gamma at 50% input", "*channel_1_is_linear": "Channel 1 is linear", "*channel_1_maximum": "Channel 1 maximum", "*channel_1_minimum": "Channel 1 minimum", "*channel_1_r_xy": "Channel 1 (R) xy", "*channel_1_unique_values": "Channel 1 unique values", "*channel_2_g_xy": "Channel 2 (G) xy", "*channel_2_gamma_at_50_input": "Channel 2 gamma at 50% input", "*channel_2_is_linear": "Channel 2 is linear", "*channel_2_m_xy": "Channel 2 (M) xy", "*channel_2_maximum": "Channel 2 maximum", "*channel_2_minimum": "Channel 2 minimum", "*channel_2_unique_values": "Channel 2 unique values", "*channel_3_b_xy": "Channel 3 (B) xy", "*channel_3_gamma_at_50_input": "Channel 3 gamma at 50% input", "*channel_3_is_linear": "Channel 3 is linear", "*channel_3_maximum": "Channel 3 maximum", "*channel_3_minimum": "Channel 3 minimum", "*channel_3_unique_values": "Channel 3 unique values", "*channel_3_y_xy": "Channel 3 (Y) xy", "*channel_4_k_xy": "Channel 4 (K) xy", "*channels": "Channels", "*characterization_device_values": "Characterization device values", "*characterization_measurement_values": "Characterization measurement values", "*characterization_target": "Characterization target", "checking_lut_access": "Controllo dell'accesso per il calibrazione per il monitor %s...", "*checksum": "Checksum", "*checksum_ok": "Checksum OK", "*chromatic_adaptation_matrix": "Chromatic adaptation matrix", "*chromatic_adaptation_transform": "Chromatic adaptation transform", "*chromaticity_illuminant_relative": "Chromaticity (illuminant-relative)", "*chromecast_limitations_warning": "Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling.", "clear": "Pulire", "*close": "Close", "*color": "Color", "*color_look_up_table": "Color Look Up Table", "*color_model": "Color model", "*color_space_conversion_profile": "Color space Conversion profile", "*colorant_order": "Colorant order", "*colorants_pcs_relative": "Colorants (PCS-relative)", "*colorimeter_correction.create": "Create colorimeter correction...", "*colorimeter_correction.create.details": "Please check the fields below and change them when necessary. The description should also contain important details (e.g. specific display settings, non-default CIE observer or the like).", "*colorimeter_correction.create.failure": "Correction creation failed.", "*colorimeter_correction.create.info": "To create a colorimeter correction, you first need to measure the required test colors with a spectrometer, and in case you want to create a correction matrix instead of a spectral correction, also with the colorimeter.\nAlternatively you can also use existing measurements by choosing “Browse...”.", "*colorimeter_correction.create.success": "Correction successfully created.", "*colorimeter_correction.file.none": "None", "*colorimeter_correction.import": "Import colorimeter corrections from other display profiling software...", "*colorimeter_correction.import.choose": "Please choose the colorimeter correction file to import.", "*colorimeter_correction.import.failure": "No colorimeter corrections could be imported.", "*colorimeter_correction.import.partial_warning": "Not all colorimeter corrections could be imported from %s. %i of %i entries had to be skipped.", "*colorimeter_correction.import.success": "Colorimeter corrections and/or measurement modes have been successfully imported from the following softwares:\n\n%s", "*colorimeter_correction.instrument_mismatch": "The selected colorimeter correction is not suitable for the selected instrument.", "*colorimeter_correction.upload": "Upload colorimeter correction...", "*colorimeter_correction.upload.confirm": "Do you want to upload the colorimeter correction to the online database (recommended)? Any uploaded files will be assumed to have been placed in the public domain, so that they can be used freely.", "*colorimeter_correction.upload.deny": "This colorimeter correction may not be uploaded.", "*colorimeter_correction.upload.exists": "The colorimeter correction already exists in the database.", "*colorimeter_correction.upload.failure": "The correction couldn't be entered into the online database.", "*colorimeter_correction.upload.success": "The correction was successfully uploaded to the online database.", "*colorimeter_correction.web_check": "Check online for colorimeter correction...", "*colorimeter_correction.web_check.choose": "The following colorimeter corrections for the selected display and instrument have been found:", "*colorimeter_correction.web_check.failure": "No colorimeter corrections for the selected display and instrument have been found.", "*colorimeter_correction.web_check.info": "Please note that all colorimeter corrections have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate. They may or may not improve the absolute accuracy of your colorimeter with your display.", "*colorimeter_correction_matrix_file": "Correction", "*colorimeter_correction_matrix_file.choose": "Choose colorimeter correction...", "*colorimetric_intent_image_state": "Colorimetric image state", "*colors_pcs_relative": "Colors (PCS-relative)", "*colorspace": "Colorspace", "*colorspace.show_outline": "Show outline", "commandline": "Linea di comando:", "*commands": "Commands", "*comparison_profile": "Comparison profile", "comport_detected": "È stata rilevata una modifica nella configurazione dello strumento o della porta.", "*compression.gzip": "GZIP compression", "*computer.name": "Computername", "*connected.to.at": "Connected to %s at %s:%s", "*connecting.to": "Connecting to %s:%s...", "*connection.broken": "Connection broken", "*connection.established": "Connection established", "*connection.fail": "Connection error (%s)", "*connection.fail.http": "HTTP error %s", "*connection.waiting": "Waiting for connection at", "continue": "Continua", "*contrast": "Contrast", "*contribute": "Contribute", "*converting": "Converting", "*copyright": "Copyright", "corrected": "corretto", "create_profile": "Creazione del profilo dai dati di misurazione...", "*create_profile_from_edid": "Create profile from extended display identification data...", "*created": "Created", "*creator": "Creator", "*current": "Current", "custom": "Altro", "*cyan": "Cyan", "*d3-e4-s2-g28-m0-b0-f0.ti1": "Small testchart for matrix profiles", "*d3-e4-s3-g52-m3-b0-f0.ti1": "Default testchart", "*d3-e4-s4-g52-m4-b0-f0.ti1": "Small testchart for LUT profiles", "*d3-e4-s5-g52-m5-b0-f0.ti1": "Extended testchart for LUT profiles", "*d3-e4-s9-g52-m9-b0-f0.ti1": "Large testchart for LUT profiles", "*d3-e4-s17-g52-m17-b0-f0.ti1": "Very large testchart for LUT profiles", "*deactivated": "deactivated", "*default": "Default", "*default.icc": "Default (Gamma 2.2)", "*default_crt": "Default CRT", "*default_rendering_intent": "Default rendering intent", "*delete": "Delete", "*delta_e_2000_to_blackbody_locus": "ΔE 2000 to blackbody locus", "*delta_e_2000_to_daylight_locus": "ΔE 2000 to daylight locus", "*delta_e_to_locus": "ΔE*00 to %s locus", "*description": "Description", "*description_ascii": "Description (ASCII)", "*description_macintosh": "Description (Macintosh)", "*description_unicode": "Description (Unicode)", "*deselect_all": "Deselect all", "detect_displays_and_ports": "Rileva schermo e strumenti", "*device": "Device", "*device.name.placeholder": "", "*device_color_components": "Device color components", "*device_manager.launch": "Launch Device Manager", "*device_manufacturer_name": "Device manufacturer name", "*device_manufacturer_name_ascii": "Device manufacturer name (ASCII)", "*device_manufacturer_name_macintosh": "Device manufacturer name (Macintosh)", "*device_manufacturer_name_unicode": "Device manufacturer name (Unicode)", "*device_model_name": "Device model name", "*device_model_name_ascii": "Device model name (ASCII)", "*device_model_name_macintosh": "Device model name (Macintosh)", "*device_model_name_unicode": "Device model name (Unicode)", "*device_to_pcs_intent_0": "Device to PCS: Intent 0", "*device_to_pcs_intent_1": "Device to PCS: Intent 1", "*device_to_pcs_intent_2": "Device to PCS: Intent 2", "*devicelink_profile": "Device link profile", "*dialog.argyll.notfound.choice": "ArgyllCMS, the color engine that is needed to run DisplayCAL, doesn't seem to be installed on this computer. Do you want to automatically download it or browse for it manually?", "*dialog.cal_info": "The calibration file “%s” will be used. Do you want to continue?", "*dialog.confirm_cancel": "Do you really want to cancel?", "*dialog.confirm_delete": "Do you really want to delete the selected file(s)?", "dialog.confirm_overwrite": "Il file “%s” già esiste. Sovrascrivere?", "*dialog.confirm_uninstall": "Do you really want to uninstall the selected file(s)?", "*dialog.current_cal_warning": "The current calibration curves will be used. Do you want to continue?", "dialog.do_not_show_again": "Non mostrare più questo messaggio", "*dialog.enter_password": "Please enter your password.", "dialog.install_profile": "Installare il profilo “%s” e renderlo quello predefinito per il monitor “%s”?", "*dialog.linear_cal_info": "Linear calibration curves will be used. Do you want to continue?", "dialog.load_cal": "Caricamento impostazioni", "*dialog.select_argyll_version": "Version %s of ArgyllCMS was found. The currently selected version is %s. Do you want to use the newer version?", "dialog.set_argyll_bin": "Individuare la cartella dove si trovano gli eseguibili di ArgyllCMS.", "dialog.set_profile_save_path": "Creare la directory dei profili “%s” qui:", "dialog.set_testchart": "Scegliere il file con il testchart", "dialog.ti3_no_cal_info": "I dati di misurazione non contengono curve di calibrazione. Continuare?", "*digital_camera": "Digital camera", "*digital_cinema_projector": "Digital cinema projector", "*digital_motion_picture_camera": "Digital motion picture camera", "*direction.backward": "PCS → B2A → device", "*direction.backward.inverted": "PCS ← B2A ← device", "*direction.forward": "Device → A2B → PCS", "*direction.forward.inverted": "Device ← A2B ← PCS", "*directory": "Directory", "*disconnected.from": "Disconnected from %s:%s", "display": "Schermo", "*display-instrument": "Display & instrument", "*display.connection.type": "Connection", "*display.manufacturer": "Display device manufacturer", "*display.output": "Output #", "display.primary": "(Primario)", "*display.properties": "Display device properties", "*display.reset.info": "Please reset the display device to factory defaults, then adjust its brightness to a comfortable level.", "*display.settings": "Display device settings", "*display.tech": "Display technology", "display_detected": "Rilevato un cambiamento nella configurazione dello schermo.", "*display_device_profile": "Display device profile", "display_lut.link": "Collega/Scollega schermo e accesso a calibrazione", "*display_peak_luminance": "Display peak luminance", "*display_profile.not_detected": "No current profile detected for display “%s”", "*display_short": "Display device (abbreviated)", "*displayport": "DisplayPort", "*displays.identify": "Identify display devices", "*dlp_screen": "DLP Screen", "*donation_header": "Your support is appreciated!", "*donation_message": "If you would like to support the development of, technical assistance with, and continued availability of DisplayCAL and ArgyllCMS, please consider a financial contribution. As DisplayCAL wouldn't be useful without ArgyllCMS, all contributions received for DisplayCAL will be split between both projects.\nFor light personal non-commercial use, a one-time contribution may be appropriate. If you're using DisplayCAL professionally, an annual or monthly contribution would make a great deal of difference in ensuring that both projects continue to be available.\n\nThanks to all contributors!", "*download": "Download", "*download.fail": "Download failed:", "*download.fail.empty_response": "Download failed: %s returned an empty document.", "*download.fail.wrong_size": "Download failed: The file does not have the expected size of %s bytes (received %s bytes).", "*download_install": "Download & install", "*downloading": "Downloading", "*drift_compensation.blacklevel": "Black level drift compensation", "*drift_compensation.blacklevel.info": "Black level drift compensation tries to counter measurement deviations caused by black calibration drift of a warming up measurement device. For this purpose, a black test patch is measured periodically, which increases the overall time needed for measurements. Many colorimeters have built-in temperature compensation, in which case black level drift compensation should not be needed, but most spectrometers are not temperature compensated.", "*drift_compensation.whitelevel": "White level drift compensation", "*drift_compensation.whitelevel.info": "White level drift compensation tries to counter measurement deviations caused by luminance changes of a warming up display device. For this purpose, a white test patch is measured periodically, which increases the overall time needed for measurements.", "*dry_run": "Dry run", "*dry_run.end": "Dry run ended.", "*dry_run.info": "Dry run. Check the log to see the command line.", "*dvi": "DVI", "*dye_sublimation_printer": "Dye sublimation printer", "*edid.crc32": "EDID CRC32 checksum", "*edid.serial": "EDID serial", "elapsed_time": "Tempo trascorso", "*electrophotographic_printer": "Electrophotographic printer", "*electrostatic_printer": "Electrostatic printer", "*enable_argyll_debug": "Enable ArgyllCMS debugging output", "enable_spyder2": "Attivazione colorimetro Spyder 2...", "enable_spyder2_failure": "Impossibile attivare Spyder 2 .", "enable_spyder2_success": "Spyder 2 attivato con successo.", "*entries": "Entries", "*enumerate_ports.auto": "Automatically detect instruments", "enumerating_displays_and_comports": "Elenco degli schermi e delle porte di comunicazione in corso...", "*environment": "Environment", "error": "Errore", "*error.access_denied.write": "You do not have write access to %s", "error.already_exists": "Impossibile usare il nome “%s”, perché un altro oggetto con lo stesso nome già esiste. Scegliere un'altro nome o cartella.", "error.autostart_creation": "La creazione della voce di partenza automatica per far caricare a %s le curve di calibrazione è fallita.", "*error.autostart_remove_old": "The old autostart entry which loads calibration curves on login could not be removed: %s", "*error.autostart_system": "The system-wide autostart entry to load the calibration curves on login could not be created, because the system-wide autostart directory could not be determined.", "*error.autostart_user": "The user-specific autostart entry to load the calibration curves on login could not be created, because the user-specific autostart directory could not be determined.", "error.cal_extraction": "Impossibile estrarre la calibrazione da “%s”.", "error.calibration.file_missing": "Manca il file di calibrazione “%s”.", "error.calibration.file_not_created": "Non è stato creato alcun file di calibrazione.", "error.copy_failed": "Impossibile copiare il file “%s” in “%s”.", "*error.deletion": "An error occured while moving files to the %s. Some files might not have been removed.", "error.dir_creation": "Impossibile creare la cartella “%s”. Forse ci sono restrizioni sull'accesso. Permettere l'accesso in scrittura o scegliere un'altra cartella.", "error.dir_notdir": "Impossibile creare la cartella “%s” perché un altro oggetto con lo stesso nome già esiste. Scegliere un'altra cartella.", "*error.file.create": "The file “%s” could not be created.", "*error.file.open": "The file “%s” could not be opened.", "error.file_type_unsupported": "Tipo di file non gestito.", "error.generic": "Errore di sistema.\n\nCodice d'errore: %s\nMessaggio d'errore: %s", "*error.luminance.invalid": "The measured peak luminance was invalid. Make sure the instrument sensor is not blocked, and remove any protective cap (if present).", "*error.measurement.file_invalid": "The measurement file „%s“ is invalid.", "error.measurement.file_missing": "Manca il file delle misure “%s”.", "error.measurement.file_not_created": "Non è stato creato alcun file di misure.", "*error.measurement.missing_spectral": "The measurement file does not contain spectral values.", "*error.measurement.one_colorimeter": "Exactly one colorimeter measurement is needed.", "*error.measurement.one_reference": "Exactly one reference measurement is needed.", "*error.no_files_extracted_from_archive": "No files have been extracted from “%s”.", "*error.not_a_session_archive": "The archive “%s” doesn't seem to be a session archive.", "error.profile.file_missing": "Manca il profilo “%s”.", "error.profile.file_not_created": "Non è stato creato alcun profilo.", "*error.source_dest_same": "Source and destination profile are the same.", "error.testchart.creation_failed": "Impossibile creare il file di testchart “%s”. Forse ci sono restrizioni sull'accesso oppure il file di origine non esiste.", "error.testchart.invalid": "Il file di testchart “%s” non è valido.", "error.testchart.missing": "Manca il file di testchart “%s”.", "*error.testchart.missing_fields": "The testchart file „%s“ does not contain required fields: %s", "error.testchart.read": "Impossibile leggere il file di testchart “%s”.", "error.tmp_creation": "Impossibile creare una cartella di lavoro temporanea.", "*error.trashcan_unavailable": "The %s is not available. No files were removed.", "*errors.none_found": "No errors found.", "*estimated_measurement_time": "Estimated measurement time approximately %s hour(s) %s minutes", "*exceptions": "Exceptions...", "*executable": "Executable", "export": "Esportazione...", "*extra_args": "Set additional commandline arguments...", "*factory_default": "Factory Default", "failure": "...fallito!", "*file.hash.malformed": "The integrity of %s cannot be verified because the checksum file is malformed.", "*file.hash.missing": "The integrity of %s cannot be verified because it doesn't have an entry in the checksum file.", "*file.hash.verification.fail": "Checksum verification failed for %s:\n\nExpected %s\nActual %s", "*file.invalid": "File invalid.", "file.missing": "Il file “%s” non esiste.", "file.notfile": "“%s” non è un file.", "*file.select": "Select file", "*filename": "File name", "*filename.upload": "Upload filename", "*filetype.7z": "7-Zip files", "*filetype.any": "Any Filetype", "filetype.cal": "File di calibrazione(*.cal)", "filetype.cal_icc": "File di calibrazione e profilo (*.cal;*.icc;*.icm)", "*filetype.ccmx": "Correction matrices/Calibration spectral samples (*.ccmx;*.ccss)", "*filetype.html": "HTML files (*.html;*.htm)", "filetype.icc": "File di profile (*.icc;*.icm)", "filetype.icc_mpp": "File di profilo (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "File di testchart (*.icc;*.icm;*.ti1;*.ti3)", "*filetype.icc_ti3": "Measurement files (*.icc;*.icm;*.ti3)", "filetype.log": "File di log (*.log)", "filetype.png": "Portable Network Graphics (*.png)", "*filetype.tgz": "Compressed TAR archive", "filetype.ti1": "File di testchart (*.ti1)", "*filetype.ti1_ti3_txt": "Testchart files (*.ti1), Measurement files (*.ti3;*.txt)", "filetype.ti3": "File di misurazioni (*.icc;*.icm;*.ti3)", "filetype.tif": "Tagged Image File (*.tif)", "*filetype.txt": "DeviceCorrections.txt", "*filetype.vrml": "VRML files (*.wrl)", "*filetype.x3d": "X3D files (*.x3d)", "*filetype.zip": "ZIP files", "*film_scanner": "Film scanner", "*film_writer": "Film writer", "*finish": "Finish", "*flare": "Flare", "*flexography": "Flexography", "*focal_plane_colorimetry_estimates": "Focal plane colorimetry estimates", "*forced": "forced", "*format.select": "Please select the desired format.", "*fullscreen.message": "Fullscreen mode activated.\nPress ESC to leave fullscreen.", "*fullscreen.osx.warning": "If you enter fullscreen mode using the zoom button in the window title bar, please press CMD + TAB to switch back to normal mode after the window has been closed. Alternatively, you can go fullscreen by double-clicking the title bar or holding the OPTION key while clicking the zoom button.", "*gamap.default_intent": "Default rendering intent", "*gamap.intents.a": "Absolute colorimetric", "*gamap.intents.aa": "Absolute appearance", "*gamap.intents.aw": "Absolute colorimetric with white point scaling", "*gamap.intents.la": "Luminance matched appearance", "*gamap.intents.lp": "Luminance preserving perceptual appearance", "*gamap.intents.ms": "Preserve saturation", "*gamap.intents.p": "Perceptual", "*gamap.intents.pa": "Perceptual appearance", "*gamap.intents.r": "Relative colorimetric", "*gamap.intents.s": "Saturation", "gamap.out_viewcond": "Condizioni di visualizzazione obiettivo", "gamap.perceptual": "Applicare la mappatura di gamut alla tabella percettiva", "gamap.profile": "Profilo di origine", "gamap.saturation": "Applicare la mappatura di gamut alla tabella di saturazione", "gamap.src_viewcond": "Condizioni di visualizzazione di partenza", "gamap.viewconds.cx": "Fogli trasparenti ritagliati su una scatola per la visualizzazione", "gamap.viewconds.jd": "Proiettore in un ambiente buio", "gamap.viewconds.jm": "Proiettore in un ambiente con luce soffusa", "gamap.viewconds.mb": "Monitor in un ambiente di lavoro ben illuminato", "gamap.viewconds.md": "Monitor in un ambiente di lavoro buio", "gamap.viewconds.mt": "Monitor in un ambiente di lavoro", "gamap.viewconds.ob": "Scena originale - all'aperto molto illuminato", "*gamap.viewconds.pc": "Critical print evaluation environment (ISO-3664 P1)", "gamap.viewconds.pcd": "Photo CD - scena originale all'aperto", "gamap.viewconds.pe": "Ambiente di valutazione di stampa (CIE 116-1995)", "gamap.viewconds.pp": "Stampa riflessa realistica (ISO-3664 P2)", "*gamap.viewconds.tv": "Television/film studio", "gamapframe.title": "Opzioni avanze per la mappatura di gamut", "*gamut": "Gamut", "*gamut.coverage": "Gamut coverage", "*gamut.view.create": "Generating gamut views...", "*gamut.volume": "Gamut volume", "*gamut_mapping.ciecam02": "CIECAM02 gamut mapping", "*gamut_mapping.mode": "Gamut mapping mode", "*gamut_mapping.mode.b2a": "PCS-to-device", "*gamut_mapping.mode.inverse_a2b": "Inverse device-to-PCS", "*gamut_plot.tooltip": "Click and drag the mouse inside the plot to move the viewport, or zoom with the mouse wheel and +/- keys. Double-click resets the viewport.", "*generic_name_value_data": "Generic name-value data", "*geometry": "Geometry", "*glossy": "Glossy", "*go_to": "Go to %s", "*go_to_website": "Go to Website", "*gravure": "Gravure", "*gray_tone_response_curve": "Gray tone response curve", "*grayscale": "grayscale", "*green": "Green", "*green_gamma": "Green gamma", "*green_lab": "Green L*a*b*", "*green_matrix_column": "Green matrix column", "*green_maximum": "Green maximum", "*green_minimum": "Green minimum", "*green_tone_response_curve": "Green tone response curve", "*green_xyz": "Green XYZ", "*grid_steps": "Grid Steps", "*hdmi": "HDMI", "*hdr_maxcll": "Maximum content light level", "*hdr_mincll": "Minimum content light level", "*header": "Display calibration and characterization powered by ArgyllCMS", "*help_support": "Help and support...", "*host.invalid.lookup_failed": "Invalid host (address lookup failed)", "*hue": "Hue", "*icc_absolute_colorimetric": "ICC-absolute colorimetric", "*icc_version": "ICC version", "*if_available": "if available", "*illuminant": "Illuminant", "*illuminant_relative_cct": "Illuminant-relative CCT", "*illuminant_relative_lab": "Illuminant-relative L*a*b*", "*illuminant_relative_xyz": "Illuminant-relative XYZ", "*illuminant_xyz": "Illuminant XYZ", "*illumination": "Illumination", "*in": "In", "*info.3dlut_settings": "A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction.\n\nCreating several (additional) 3D LUTs from an existing profile\nWith the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox.\n\nChoosing the right source colorspace and tone response curve\nFor 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%.\n\n“Absolute” vs. “relative” gamma\nTo accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly.\n“Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero).\n“Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve.\n\nRendering intent\nIf you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required).", "*info.calibration_settings": "Calibration is done by interactively adjusting the display to meet the chosen whitepoint and/or luminance as well as optionally creating 1D LUT calibration curves (LUT = Look Up Table) to meet the chosen tone response curve and ensure gray balance. Note that if during calibration you only want to adjust the display and skip the generation of 1D LUT curves, you need to set the tone response curve to “As measured”. 1D LUT calibration can not be used for full display color correction, you need to create a ICC device profile or 3D LUT and use them with applications that support them for that purpose. 1D LUT calibration complements profiling and 3D LUT calibration though.", "*info.display_instrument": "If your display is a OLED, Plasma or other technology with variable light output depending on picture content, enable white level drift compensation.\n\nIf your instrument is a spectrometer and you use it in contact mode on a display with stable black level, you may want to enable instrument black level drift compensation.\n\nIf your instrument is a colorimeter, you should use a measurement mode and/or correction suitable for your display or display technology type. Note that some instruments (ColorHug, ColorHug2, K-10, Spyder4/5) may have a correction built into some of their measurement modes.", "*info.display_instrument.warmup": "You should let the display warm up for at least 30 minutes before commencing measurements. If you use your instrument in contact mode, it is a good idea to leave it on the display during that time as well.", "*info.mr_settings": "You can verify the accuracy of an ICC profile or 3D LUT via a measurement report that contains detailed statistics about the color errors of the measured patches.\n\nWhen verifying a 3D LUT, make sure to use the same settings as the 3D LUT was created with.", "*info.profile_settings": "Profiling is the process of characterizing the display and recording its response in a ICC device profile. The ICC device profile can be used by applications that support ICC color management for full display color correction, and/or it can be used to create a 3D LUT (LUT = Look Up Table) which serves the same purpose for applications that support 3D LUTs.\n\nThe amount of patches measured influences the attainable accuracy of the resulting profile. For a reasonable quality 3x3 matrix and curves based profile, a few dozen patches can be enough if the display has good additive color mixing properties and linearity. Some professional displays fall into that category. If the highest possible accuracy is desired, a LUT-based profile from around several hundred up to several thousand patches is recommended. The “Auto-optimized” testchart setting automatically takes into account the non-linearities and actual response of the display, and should be used for best quality results. With this, you can adjust a slider to choose a compromise between resulting profile accuracy and measurement as well as computation time.", "infoframe.default_text": "", "infoframe.title": "Informazioni", "infoframe.toggle": "Mostrare/Nascondere finestra delle informazioni", "*initial": "Initial", "initializing_gui": "Inizializzazione interfaccia grafica...", "*ink_jet_printer": "Ink jet printer", "*input_device_profile": "Input device profile", "*input_table": "Input Table", "install_display_profile": "Installa il profilo del monitor...", "*install_local_system": "Install system-wide", "*install_user": "Install for current user only", "instrument": "Strumento/Porta", "*instrument.calibrate": "Place the instrument on a dark, matte surface or onto its calibration plate and press OK to calibrate the instrument.", "*instrument.calibrate.colormunki": "Set the ColorMunki sensor to calibration position and press OK to calibrate the instrument.", "*instrument.calibrate.reflective": "Place the instrument onto its reflective white reference serial no. %s and press OK to calibrate the instrument.", "*instrument.calibrating": "Calibrating instrument...", "*instrument.connect": "Please connect your measurement instrument now.", "*instrument.initializing": "Setting up the instrument, please wait...", "*instrument.measure_ambient": "If your instrument requires a special cap to measure ambient, please attach it. To measure ambient light, place the instrument upwards, beside the display. Or if you want to measure a viewing booth, put a metamerism-free gray card inside the booth and point the instrument towards it. Further instructions how to measure ambient may be available in your instrument's documentation. Press OK to commence measurement.", "instrument.place_on_screen": "Posizionare lo strumento sulla finestra di test. Clicca su OK. Premere ESC, Q o CTRL^C per annullare, qualsiasi altro tasto avvierà la misurazione.", "*instrument.place_on_screen.madvr": "(%i) Please place your %s on the test area", "*instrument.reposition_sensor": "The measurement failed because the instrument sensor is in the wrong position. Please correct the sensor position, then click OK to continue.", "*internal": "Internal", "*invert_selection": "Invert selection", "*is_embedded": "Is embedded", "*is_illuminant": "Is illuminant", "*is_linear": "Is linear", "*laptop.icc": "Laptop (Gamma 2.2)", "*libXss.so": "X11 screen saver extension", "*library.not_found.warning": "The library “%s” (%s) was not found. Please make sure it is installed before proceeding.", "*license": "License", "license_info": "Rilasciato sotto licenza GPL", "*linear": "linear", "*link.address.copy": "Copy link address", "*log.autoshow": "Show log window automatically", "*luminance": "Luminance", "lut_access": "Accesso a calibrazione", "*madhcnet.outdated": "The installed version of %s found at %s is outdated. Please update to the latest madVR version (at least %i.%i.%i.%i).", "*madtpg.launch.failure": "madTPG was not found or could not be launched.", "*madvr.not_found": "madVR DirectShow filter was not found in the registry. Please make sure it is installed.", "*madvr.outdated": "The used version of madVR is outdated. Please update to the latest version (at least %i.%i.%i.%i).", "*madvr.wrong_levels_detected": "The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235).", "*magenta": "Magenta", "*make_and_model": "Make and model", "*manufacturer": "Manufacturer", "*mastering_display_black_luminance": "Mastering display black level", "*mastering_display_peak_luminance": "Mastering display peak luminance", "*matrix": "Matrix", "*matte": "Matte", "*max": "Max", "*maximal": "Maximal", "measure": "Misurazione", "measure.darken_background": "Sfondo nero", "*measure.darken_background.warning": "Attention: If „black background“ is chosen, it will cover the whole screen and you will not be able to see the display adjustment window! If you have a multi-screen setup, move the display adjustment window to another screen before starting the measurement, or use the keyboard (to abort the measurement, press Q. If the measurement is already running, wait briefly, then press Q again).", "*measure.override_display_settle_time_mult": "Override display settle time multiplier", "*measure.override_min_display_update_delay_ms": "Override minimum display update delay", "*measure.testchart": "Measure testchart", "measureframe.center": "Centrare", "measureframe.info": "Spostare la finestra di misurazione nella posizione dello schermo desiderata e ridimensionarla se necessario. Tutta l'area sarà usata approssimativamente per mostrare i campioni, il cerchio è solo una guida per l'aiuto al posizionamento dello strumento di misurazione.\nPosizionare lo strumento di misurazione sulla finestra e premere su „Avvio misurazione“. Per annullare e ritornare alla finestra principale chiudere la finestra di misurazione.", "measureframe.measurebutton": "Avvio misurazione", "measureframe.title": "Area di misurazione", "measureframe.zoomin": "Allargare", "measureframe.zoommax": "Massimizzare/Ripristinare", "measureframe.zoomnormal": "Dimensioni normali", "measureframe.zoomout": "Restringere", "*measurement.play_sound": "Acoustic feedback on continuous measurements", "*measurement.untethered": "Untethered measurement", "*measurement_file.check_sanity": "Check measurement file...", "*measurement_file.check_sanity.auto": "Check measurement files automatically", "*measurement_file.check_sanity.auto.warning": "Please note automatic checking of measurements is an experimental feature. Use at own risk.", "*measurement_file.choose": "Please choose a measurement file", "*measurement_file.choose.colorimeter": "Please choose a colorimeter measurement file", "*measurement_file.choose.reference": "Please choose a reference measurement file", "measurement_mode": "Modalità", "*measurement_mode.adaptive": "Adaptive", "*measurement_mode.dlp": "DLP", "*measurement_mode.factory": "Factory calibration", "*measurement_mode.generic": "Generic", "*measurement_mode.highres": "HiRes", "measurement_mode.lcd": "LCD (generico)", "*measurement_mode.lcd.ccfl": "LCD (CCFL)", "*measurement_mode.lcd.ccfl.2": "LCD (CCFL Type 2)", "*measurement_mode.lcd.oled": "LCD (OLED)", "*measurement_mode.lcd.white_led": "LCD (White LED)", "*measurement_mode.lcd.wide_gamut.ccfl": "Wide Gamut LCD (CCFL)", "*measurement_mode.lcd.wide_gamut.rgb_led": "Wide Gamut LCD (RGB LED)", "*measurement_mode.raw": "Raw", "*measurement_mode.refresh": "Refresh (generic)", "*measurement_report": "Measurement report...", "*measurement_report.update": "Update measurement or uniformity report...", "*measurement_report_choose_chart": "Please choose the testchart to measure.", "*measurement_report_choose_chart_or_reference": "Please choose a testchart or reference.", "*measurement_report_choose_profile": "Please choose the profile to validate.", "*measurement_type": "Measurement type", "*measurements.complete": "Measurements complete! Do you want to open the folder containing the measurement files?", "*measuring.characterization": "Measuring color swatches for characterization...", "*media_black_point": "Media black point", "*media_relative_colorimetric": "Media-relative colorimetric", "*media_white_point": "Media white point", "menu.about": "A riguardo...", "menu.file": "File", "menu.help": "?", "menu.language": "Lingua", "*menu.options": "Options", "*menu.tools": "Tools", "menuitem.quit": "Esci", "menuitem.set_argyll_bin": "Trova gli eseguibili di ArgyllCMS...", "*metadata": "Metadata", "*method": "Method", "*min": "Min", "*minimal": "Minimal", "*model": "Model", "*motion_picture_film_scanner": "Motion picture film scanner", "*mswin.open_display_settings": "Open Windows display settings...", "*named_color_profile": "Named color profile", "*named_colors": "Named colors", "native": "Nativo", "*negative": "Negative", "no": "No", "no_settings": "Il file non contiene impostazioni.", "*none": "None", "*not_applicable": "Not applicable", "*not_connected": "Not connected", "*not_found": "“%s” was not found.", "*not_now": "Not now", "*number_of_entries": "Number of entries", "*number_of_entries_per_channel": "Number of entries per channel", "*observer": "Observer", "*observer.1931_2": "CIE 1931 2°", "*observer.1955_2": "Stiles & Birch 1955 2°", "*observer.1964_10": "CIE 1964 10°", "*observer.1964_10c": "CIE 1964 10° / 1931 2° hybrid", "*observer.1978_2": "Judd & Voss 1978 2°", "*observer.2012_2": "CIE 2012 2°", "*observer.2012_10": "CIE 2012 10°", "*observer.shaw": "Shaw & Fairchild 1997 2°", "*oem.import.auto": "If your colorimeter came with a software CD for Windows, please insert it now (abort any possibly automatic software installation).\n\nIf you don't have a CD and the required files cannot be found otherwise, they will be downloaded from the Web.", "*oem.import.auto.download_selection": "A preselection was made based on the detected instrument(s). Please select the file(s) to download.", "*oem.import.auto_windows": "If the vendor software for your colorimeter is installed, the required files can be found automatically in most cases.", "*office_web.icc": "Office & Web (D65, Gamma 2.2)", "*offset": "Offset", "*offset_lithography": "Offset lithography", "ok": "OK", "or": "o", "*osd": "OSD", "other": "Altro", "*out": "Out", "*out_of_gamut_tag": "Out of gamut tag", "*output.profile": "Destination profile", "*output_device_profile": "Output device profile", "*output_levels": "Output levels", "*output_offset": "Output offset", "*output_table": "Output Table", "overwrite": "Sovrascrivi", "*panel.surface": "Panel surface", "*panel.type": "Panel type", "*passive_matrix_display": "Passive matrix display", "*patch.layout.select": "Please select a patch layout:", "patches": "Campioni", "*patterngenerator.prisma.specify_host": "Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234", "*patterngenerator.sync_lost": "Lost sync with the pattern generator.", "pause": "Pausa", "*pcs_illuminant_xyz": "PCS illuminant XYZ", "*pcs_relative_cct": "PCS-relative CCT", "*pcs_relative_lab": "PCS-relative L*a*b*", "*pcs_relative_xyz": "PCS-relative XYZ", "*pcs_to_device_intent_0": "PCS to device: Intent 0", "*pcs_to_device_intent_1": "PCS to device: Intent 1", "*pcs_to_device_intent_2": "PCS to device: Intent 2", "*perceptual": "Perceptual", "*photo.icc": "Photo (D50, Gamma 2.2)", "*photo_imagesetter": "Photo imagesetter", "*photographic_paper_printer": "Photographic paper printer", "*platform": "Platform", "*please_wait": "Please wait...", "*port.invalid": "Invalid port: %s", "*positive": "Positive", "*preferred_cmm": "Preferred CMM", "*prepress.icc": "Prepress (D50, 130 cd/m², L*)", "*preset": "Preset", "preview": "Anteprima", "profile": "Profilo", "profile.advanced_gamap": "Avanzato...", "*profile.b2a.hires": "Enhance effective resolution of colorimetric PCS-to-device table", "*profile.b2a.lowres.warning": "The profile is seemingly missing high-quality PCS-to-device tables, which are essential for proper operation. Do you want to generate high-quality tables now? This will take a few minutes.", "*profile.b2a.smooth": "Smoothing", "*profile.choose": "Please choose a profile.", "*profile.confirm_regeneration": "Do you want to regenerate the profile?", "*profile.current": "Current profile", "profile.do_not_install": "Non installare il profilo", "*profile.iccv4.unsupported": "Version 4 ICC profiles are not supported.", "*profile.import.success": "The profile has been imported. You may need to manually assign and activate it under “Color” system settings.", "*profile.info": "Profile information", "*profile.info.show": "Show profile information", "profile.install": "Installare il profilo", "profile.install.error": "Impossibile installare e attivare il profilo.", "profile.install.success": "Il profilo è stato installato ed attivato.", "*profile.install.warning": "The profile has been installed, but there may be problems.", "*profile.install_local_system": "Install profile as system default", "*profile.install_network": "Install profile network-wide", "*profile.install_user": "Install profile for current user only", "profile.invalid": "Profilo non valido.", "*profile.load_error": "Display profile couldn't be loaded.", "*profile.load_on_login": "Load calibration on login", "profile.load_on_login.handled_by_os": "Sistema operativo (di bassa precisione ed affidabilità)", "profile.name": "Nome del profile", "*profile.name.placeholders": "You may use the following placeholders in the profile name:\n\n%a Abbreviated weekday name\n%A Full weekday name\n%b Abbreviated month name\n%B Full month name\n%d Day of the month\n%H Hour (24-hour clock)\n%I Hour (12-hour clock)\n%j Day of the year\n%m Month\n%M Minute\n%p AM/PM\n%S Second\n%U Week (Sunday as first day of the week)\n%w Weekday (sunday is 0)\n%W Week (Monday as first day of the week)\n%y Year without century\n%Y Year with century", "profile.no_embedded_ti3": "Il profilo non contiene dati di misurazione compatibili con Argyll.", "*profile.no_vcgt": "The profile does not contain calibration curves.", "*profile.only_named_color": "Only profiles of type “Named Color” can be used.", "profile.quality": "Qualita del profilo", "*profile.quality.b2a.low": "Low quality PCS-to-device tables", "*profile.quality.b2a.low.info": "Choose this option if the profile is only going to be used with inverse device-to-PCS gamut mapping to create a device link or 3D LUT", "*profile.required_tags_missing": "The profile is missing required tags: %s", "*profile.self_check": "Profile self check ΔE*76", "*profile.self_check.avg": "average", "*profile.self_check.max": "maximum", "*profile.self_check.rms": "RMS", "profile.set_save_path": "Scegli un percorso per salvare...", "profile.settings": "Impostazioni per la creazione del profilo", "*profile.share": "Upload profile...", "*profile.share.avg_dE_too_high": "The profile yields a too high delta E (actual = %s, threshold = %s).", "*profile.share.b2a_resolution_too_low": "The resolution of the profile's PCS to device tables is too low.", "*profile.share.enter_info": "You may share your profile with other users via the OpenSUSE “ICC Profile Taxi” service.\n\nPlease provide a meaningful description and enter display device properties below. Read display device settings from your display device's OSD and only enter settings applicable to your display device which have changed from defaults.\nExample: For most display devices, these are the name of the chosen preset, brightness, contrast, color temperature and/or whitepoint RGB gains, as well as gamma. On laptops and notebooks, usually only the brightness. If you have changed additional settings while calibrating your display device, enter them too if possible.", "*profile.share.meta_missing": "The profile does not contain the necessary meta information.", "*profile.share.success": "Profile uploaded successfully.", "*profile.tags.A2B0.shaper_curves.input": "A2B0 input shaper curves", "*profile.tags.A2B0.shaper_curves.output": "A2B0 output shaper curves", "*profile.tags.A2B1.shaper_curves.input": "A2B1 input shaper curves", "*profile.tags.A2B1.shaper_curves.output": "A2B1 output shaper curves", "*profile.tags.A2B2.shaper_curves.input": "A2B2 input shaper curves", "*profile.tags.A2B2.shaper_curves.output": "A2B2 output shaper curves", "*profile.tags.B2A0.shaper_curves.input": "B2A0 input shaper curves", "*profile.tags.B2A0.shaper_curves.output": "B2A0 output shaper curves", "*profile.tags.B2A1.shaper_curves.input": "B2A1 input shaper curves", "*profile.tags.B2A1.shaper_curves.output": "B2A1 output shaper curves", "*profile.tags.B2A2.shaper_curves.input": "B2A2 input shaper curves", "*profile.tags.B2A2.shaper_curves.output": "B2A2 output shaper curves", "*profile.testchart_recommendation": "For a higher quality profile, a testchart with more samples is recommended, but it will take more time to measure. Do you want to use the recommended testchart?", "profile.type": "Tipo di profilo", "*profile.type.gamma_matrix": "Gamma + matrix", "*profile.type.lut.lab": "L*a*b* LUT", "*profile.type.lut.xyz": "XYZ LUT", "*profile.type.lut_matrix.xyz": "XYZ LUT + matrix", "*profile.type.lut_rg_swapped_matrix.xyz": "XYZ LUT + swapped matrix", "*profile.type.shaper_matrix": "Curves + matrix", "*profile.type.single_gamma_matrix": "Single gamma + matrix", "*profile.type.single_shaper_matrix": "Single curve + matrix", "profile.unsupported": "Tipo di profilo (%s) e/o spazio di colore (%s) non supportato.", "profile.update": "Aggiornamento profilo", "*profile_associations": "Profile associations...", "*profile_associations.changing_system_defaults.warning": "You are currently changing system defaults", "*profile_associations.use_my_settings": "Use my settings for this display device", "*profile_class": "Profile class", "*profile_connection_space_pcs": "Profile connection space (PCS)", "*profile_loader": "Profile loader", "*profile_loader.disable": "Disable profile loader", "*profile_loader.exceptions.known_app.error": "The profile loader disables itself automatically while %s is running. You cannot override this behavior.", "*profile_loader.exit_warning": "Do you really want to quit the profile loader? Calibration will no longer be automatically reloaded if you change the display configuration!", "*profile_loader.fix_profile_associations": "Automatically fix profile associations", "*profile_loader.fix_profile_associations_warning": "As long as the profile loader is running, it can take care of profile associations when you change the display configuration.\n\nBefore you proceed, please make sure the profile associations shown above are correct. If they aren't, follow these steps:\n\n1. Open Windows display settings.\n2. Activate all connected displays (extended desktop).\n3. Open profile associations.\n4. Make sure each display device has the correct profile assigned. Then close profile associations.\n5. In Windows display settings, revert to the previous display configuration and close display settings.\n6. Now you can enable “Automatically fix profile associations”.", "*profile_loader.info": "Calibration state was (re)applied %i time(s) so far today.\nRight-click icon for menu.", "*profiling": "Profiling", "profiling.complete": "Creazione del profilo completa!", "profiling.incomplete": "La creazione del profilo non è stata completata.", "*projection_television": "Projection television", "*projector": "Projector", "*projector_mode_unavailable": "Projector mode is only available with ArgyllCMS 1.1.0 Beta or newer.", "quality.ultra.warning": "La qualità di livello Ultra non dovrebbe quasi mai essere usata, tranne che per dimostrare che non dovrebbe quasi mai essere usata (tempi di elaborazioni lunghi!). Scegliere invece qualità media o alta.", "*readme": "ReadMe", "ready": "Pronto.", "*red": "Red", "*red_gamma": "Red gamma", "*red_lab": "Red L*a*b*", "*red_matrix_column": "Red matrix column", "*red_maximum": "Red maximum", "*red_minimum": "Red minimum", "*red_tone_response_curve": "Red tone response curve", "*red_xyz": "Red XYZ", "*reference": "Reference", "*reflection_hardcopy_original_colorimetry": "Reflection hardcopy original colorimetry", "*reflection_print_output_colorimetry": "Reflection print output colorimetry", "*reflective": "Reflective", "*reflective_scanner": "Reflective scanner", "*remaining_time": "Remaining time (ca.)", "*remove": "Remove", "*rendering_intent": "Rendering intent", "*report": "Report", "report.calibrated": "Rapporto sullo schermo calibrato", "report.uncalibrated": "Rapporto sullo schermo non calibrato", "*report.uniformity": "Measure display device uniformity...", "*reset": "Reset", "*resources.notfound.error": "Fatal error: A required file has not been found:", "*resources.notfound.warning": "Warning: Some required files have not been found:", "*response.invalid": "Invalid response from %s: %s", "*response.invalid.missing_key": "Invalid response from %s: Missing key “%s”: %s", "*response.invalid.value": "Invalid response from %s: Value of key “%s” does not match expected value “%s”: %s", "restore_defaults": "Ripristina i valori predefiniti", "*rgb.trc": "RGB transfer function", "*rgb.trc.averaged": "averaged RGB transfer function", "sRGB.icc": "sRGB", "*saturation": "Saturation", "*save": "Save", "save_as": "Salva con nome...", "*scene_appearance_estimates": "Scene appearance estimates", "*scene_colorimetry_estimates": "Scene colorimetry estimates", "*scripting-client": "DisplayCAL Scripting Client", "*scripting-client.cmdhelptext": "Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application.", "*scripting-client.detected-hosts": "Detected scripting hosts:", "*select_all": "Select all", "*set_as_default": "Set as default", "setting.keep_current": "Mantieni le impostazioni attuali", "*settings.additional": "Additional settings", "*settings.basic": "Basic settings", "*settings.new": "", "settings_loaded": "Sono state caricate le curve calibrazione e le seguenti impostazioni di calibrazione: %s. Le altre opzioni di calibrazione sono state ripristinate ai valori predefiniti e le opzioni di profilo non sono state modificate.", "*settings_loaded.cal": "The profile contained just calibration settings. Other options have not been changed. No calibration curves have been found.", "*settings_loaded.cal_and_lut": "The profile contained just calibration settings. Other options have not been changed and calibration curves have been loaded.", "settings_loaded.cal_and_profile": "Sono state caricate le impostazioni. Le curve calibrazione non sono state trovate.", "settings_loaded.profile": "Il profilo contiene solo le impostazioni del profilo. Le altre opzioni non sono state modificate. Le curve calibrazione non sono state trovate.", "settings_loaded.profile_and_lut": "Il profilo contiene solo le impostazioni del profilo. Le altre opzioni non sono state modificate e le curve calibrazione sono state caricate.", "*show_advanced_options": "Show advanced options", "*show_notifications": "Show notifications", "*silkscreen": "Silkscreen", "*simulation_profile": "Simulation profile", "*size": "Size", "*skip_legacy_serial_ports": "Skip legacy serial ports", "*softproof.icc": "Softproof (5800K, 160 cd/m², L*)", "*spectral": "Spectral", "*ssl.certificate_verify_failed": "The remote certificate could not be verified.", "*ssl.certificate_verify_failed.root_ca_missing": "The remote certificate could not be verified because no suitable root certificates were found on the local system.", "*ssl.handshake_failure": "Handshake failure. A secure connection could not be established.", "startup": "Avvio...", "*startup_sound.enable": "Enable startup sound", "success": "...ok.", "*surround_xyz": "Surround XYZ", "*synthicc.create": "Create synthetic ICC profile...", "*target": "Target", "tc.3d": "Creazione del file VRML diagnostico 3D", "tc.I": "Perceptual space body centered cubic grid", "*tc.Q": "Perceptual space filling quasi-random", "tc.R": "Spazio percettivo casuale", "tc.adaption": "Adattamento", "tc.algo": "Distribuzione", "tc.angle": "Angolo", "*tc.black": "Black patches", "*tc.dark_emphasis": "Dark region emphasis", "tc.fullspread": "Campioni iterativi", "tc.gray": "Campioni neutri", "tc.i": "Device space body centered cubic grid", "tc.limit.sphere": "Limitare il campionamento alla sfera", "tc.limit.sphere_radius": "Raggio", "tc.multidim": "Multidimensionale", "tc.multidim.patches": "passi = %s Campioni (%s neutri)", "*tc.neutral_axis_emphasis": "Neutral axis emphasis", "tc.ofp": "Campionamento con punto più remoto ottimizzato", "tc.patch": "Campione", "tc.patches.selected": "selezionato", "tc.patches.total": "Totale campioni", "tc.precond": "Precondizionamento del profilo", "*tc.precond.notset": "Please select a preconditioning profile.", "tc.preview.create": "Creazione dell'anteprima, attendere prego...", "tc.q": "Riempimento dello spazio del dispositivo quasi-random", "tc.r": "Spazio del dispositivo casuale", "tc.single": "Campioni su singolo canale", "tc.single.perchannel": "per canale", "tc.t": "Campionamento con punto remoto incrementale", "*tc.vrml.black_offset": "RGB black offset (L*)", "*tc.vrml.use_D50": "Neutral RGB white", "tc.white": "Campioni bianchi", "*technology": "Technology", "*tempdir_should_still_contain_files": "Created files should still be in the temporary directory “%s”.", "*testchart.add_saturation_sweeps": "Add saturation sweeps", "*testchart.add_ti3_patches": "Add reference patches...", "*testchart.auto_optimize.untethered.unsupported": "The untethered virtual display does not support testchart auto-optimization.", "*testchart.change_patch_order": "Change patch order", "testchart.confirm_select": "File salvato. Selezionare il testchart?", "testchart.create": "Creazione testchart", "testchart.discard": "Scartare", "testchart.dont_select": "Non selezionare", "testchart.edit": "Modifica testchart...", "*testchart.export.repeat_patch": "Repeat each patch:", "testchart.file": "Testchart", "testchart.info": "Numero di campioni nel testchart selezionati", "*testchart.interleave": "Interleave", "*testchart.maximize_RGB_difference": "Maximize RGB difference", "*testchart.maximize_lightness_difference": "Maximize lightness difference", "*testchart.maximize_rec709_luma_difference": "Maximize luma difference", "*testchart.optimize_display_response_delay": "Minimize display response delay", "*testchart.patch_sequence": "Patch sequence", "*testchart.patches_amount": "Amount of patches", "testchart.read": "Lettura testchart...", "testchart.save_or_discard": "Il testchart non è stato salvato.", "testchart.select": "Selezionare", "*testchart.separate_fixed_points": "Please choose the patches to add in a separate step.", "testchart.set": "Scegli il file di testchart...", "*testchart.shift_interleave": "Shift & interleave", "*testchart.sort_RGB_blue_to_top": "Sort RGB blue to top", "*testchart.sort_RGB_cyan_to_top": "Sort RGB cyan to top", "*testchart.sort_RGB_gray_to_top": "Sort RGB gray to top", "*testchart.sort_RGB_green_to_top": "Sort RGB green to top", "*testchart.sort_RGB_magenta_to_top": "Sort RGB magenta to top", "*testchart.sort_RGB_red_to_top": "Sort RGB red to top", "*testchart.sort_RGB_white_to_top": "Sort RGB white to top", "*testchart.sort_RGB_yellow_to_top": "Sort RGB yellow to top", "*testchart.sort_by_BGR": "Sort by BGR", "*testchart.sort_by_HSI": "Sort by HSI", "*testchart.sort_by_HSL": "Sort by HSL", "*testchart.sort_by_HSV": "Sort by HSV", "*testchart.sort_by_L": "Sort by L*", "*testchart.sort_by_RGB": "Sort by RGB", "*testchart.sort_by_RGB_sum": "Sort by sum of RGB", "*testchart.sort_by_rec709_luma": "Sort by luma", "*testchart.vary_RGB_difference": "Vary RGB difference", "*testchart_or_reference": "Testchart or reference", "*thermal_wax_printer": "Thermal wax printer", "*tone_values": "Tone values", "*transfer_function": "Transfer function", "*translations": "Translations", "*transparency": "Transparency", "*trashcan.linux": "trash", "*trashcan.mac": "trash", "*trashcan.windows": "recycle bin", "trc": "Curva dei toni", "*trc.dicom": "DICOM", "trc.gamma": "Gamma", "*trc.hlg": "Hybrid Log-Gamma", "trc.lstar": "L*", "trc.rec709": "Rec. 709", "trc.rec1886": "Rec. 1886", "trc.should_use_viewcond_adjust": "Per ottenere i risultati voluti, quando vengono usate le curve SMPTE 240M, Rec. 709 o sRGB, si dovrebbero applicare anche delle correzioni alle condizioni di visualizzazione per i livelli della luce ambientale. Per ottenere questo deve essere spuntata la casella vicino a “Livello di luce ambientale” e deve essere inserito un valore in Lux. Facoltativamente è possibile misurare la luce ambientale durante la calibrazione se lo strumento mette a disposizione questa funzionalità.", "trc.smpte240m": "SMPTE 240M", "*trc.smpte2084": "SMPTE 2084", "*trc.smpte2084.hardclip": "SMPTE 2084 (hard clip)", "*trc.smpte2084.rolloffclip": "SMPTE 2084 (roll-off)", "trc.srgb": "sRGB", "trc.type.absolute": "Absoluta", "trc.type.relative": "Relativa", "turn_off": "Disabilita", "*type": "Type", "*udev_hotplug.unavailable": "Neither udev nor hotplug detected.", "*unassigned": "Unassigned", "uninstall": "Disinstalla", "*uninstall_display_profile": "Uninstall display device profile...", "*unknown": "Unknown", "*unmodified": "Unmodified", "unnamed": "Senza nome", "*unspecified": "Unspecified", "*update_check": "Check for application update...", "*update_check.fail": "Check for application update failed:", "*update_check.fail.version": "Remote version file from server %s couldn't be parsed.", "*update_check.new_version": "An update is available: %s", "*update_check.onstartup": "Check for application update on startup", "*update_check.uptodate": "%s is up-to-date.", "*update_now": "Update now", "*upload": "Upload", "*use_fancy_progress": "Use fancy progress dialog", "*use_separate_lut_access": "Use separate video card gamma table access", "*use_simulation_profile_as_output": "Use simulation profile as display profile", "*vcgt": "Calibration curves", "*vcgt.mismatch": "The video card gamma tables for display %s do not match the desired state.", "*vcgt.unknown_format": "Unknown video card gamma table format in profile “%s”.", "*verification": "Verification", "*verification.settings": "Verification settings", "*verify.ti1": "Verification testchart", "*verify_extended.ti1": "Extended verification testchart", "*verify_grayscale.ti1": "Graybalance verification testchart", "*verify_large.ti1": "Large verification testchart", "*verify_video.ti1": "Verification testchart (video)", "*verify_video_extended.ti1": "Extended verification testchart (video)", "*verify_video_extended_hlg_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, Hybrid Log-Gamma)", "*verify_video_extended_smpte2084_100_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²)", "*verify_video_extended_smpte2084_200_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²)", "*verify_video_extended_smpte2084_500_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²)", "*verify_video_extended_smpte2084_1000_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²)", "*verify_video_large.ti1": "Large verification testchart (video)", "*verify_video_xl.ti1": "Extra large verification testchart (video)", "*verify_video_xxl.ti1": "XXL verification testchart (video)", "*verify_video_xxxl.ti1": "XXXL verification testchart (video)", "*verify_xl.ti1": "Extra large verification testchart", "*verify_xxl.ti1": "XXL verification testchart", "*verify_xxxl.ti1": "XXXL verification testchart", "*vga": "VGA", "*video.icc": "Video (D65, Rec. 1886)", "*video_Prisma.icc": "Video 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886)", "*video_ReShade.icc": "Video 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886)", "*video_camera": "Video camera", "*video_card_gamma_table": "Video card gamma table", "*video_eeColor.icc": "Video 3D LUT for eeColor (D65, Rec. 709 / Rec. 1886)", "*video_madVR.icc": "Video 3D LUT for madVR (D65, Rec. 709 / Rec. 1886)", "*video_madVR_ST2084.icc": "Video 3D LUT for madVR HDR (D65, Rec. 2020 / SMPTE 2084)", "*video_monitor": "Video monitor", "*video_resolve.icc": "Video 3D LUT for Resolve (D65, Rec. 709 / Rec. 1886)", "*view.3d": "3D view", "*viewing_conditions": "Viewing conditions", "*viewing_conditions_description": "Viewing conditions description", "*vrml_to_x3d_converter": "VRML to X3D converter", "warning": "Attenzione", "warning.already_exists": "Il file “%s” già esiste nella posizione scelta e sarà sovrascritto. Continuare?", "*warning.autostart_system": "The system-wide autostart directory could not be determined.", "*warning.autostart_user": "The user-specific autostart directory could not be determined.", "*warning.discard_changes": "Do you really want to discard the changes to the current settings?", "*warning.input_value_clipping": "Warning: Values below the display profile blackpoint will be clipped!", "*warning.suspicious_delta_e": "Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful.\n\nOne or all of the following criteria matched:\n\n• Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other.\n• RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*).\n• RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*).\n• Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers.\n\nThis could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values.", "*warning.suspicious_delta_e.info": "Explanation of the Δ columns:\n\nΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low.\n\n0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation.\n\nΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers.", "*warning.system_file": "Warning: “%s” is a system file. Do you really want to continue?", "*webserver.waiting": "Webserver waiting at", "*welcome": "Welcome!", "*welcome_back": "Welcome back!", "*white": "White", "whitepoint": "Punto di bianco", "whitepoint.colortemp": "Temperatura", "whitepoint.colortemp.locus.blackbody": "Corpo nero", "*whitepoint.colortemp.locus.curve": "Color temperature curve", "whitepoint.colortemp.locus.daylight": "Luce diurna", "*whitepoint.set": "Do you also want to set the whitepoint to the measured value?", "*whitepoint.simulate": "Simulate whitepoint", "*whitepoint.simulate.relative": "Relative to display profile whitepoint", "*whitepoint.visual_editor": "Visual whitepoint editor", "*whitepoint.visual_editor.display_changed.warning": "Attention: The display configuration has changed and the visual whitepoint editor may no longer be able to correctly restore display profiles. Please check display profile associations carefully after closing the editor and restart DisplayCAL.", "whitepoint.xy": "Coordinate della cromaticità", "window.title": "DisplayCAL", "*windows.version.unsupported": "This version of Windows is not supported.", "*windows_only": "Windows only", "working_dir": "Directory di lavoro:", "*yellow": "Yellow", "*yellow_lab": "Yellow L*a*b*", "*yellow_xyz": "Yellow XYZ", "yes": "Sì", } DisplayCAL-3.5.0.0/DisplayCAL/lang/ko.json0000644000076500000000000026615713242301041017657 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "김환(Howard Kim)", "!language": "한국어", "!language_name": "KOREAN", "3dlut": "3D LUT", "3dlut.1dlut.videolut.nonlinear": "디스플레이 비디오카드의 1D LUT 캘리브레이션 감마 테이블은 선형이 아닙니다. 하지만 3D LUT는 1D LUT 캘리브레이션을 포함하고 있습니다. 3D LUT를 사용하기 전에 비디오카드 감마 테이블을 선형으로 리셋하거나, 캘리브레이션을 적용하지 말고 3D LUT를 생성하세요. (캘리브레이션 미적용 상태의 3D LUT를 생성하려면, “옵션” 메뉴의 “고급 옵션 보기”를 활성화하고, 3D LUT 설정에 있는 “캘리브레이션 적용(vcgt)”과 “프로파일링 후 3D LUT 생성”을 비활성화한 후 새로운 3D LUT를 생성하세요.).", "3dlut.bitdepth.input": "3D LUT 입력 비트심도", "3dlut.bitdepth.output": "3D LUT 출력 비트심도", "*3dlut.confirm_relcol_rendering_intent": "Do you want the 3D LUT to use the measured white point as well (3D LUT rendering intent will be set to relative colorimetric)?", "3dlut.content.colorspace": "콘텐트 색공간", "3dlut.create": "3D LUT 생성...", "3dlut.create_after_profiling": "프로파일링 후 3D LUT 생성", "3dlut.enable": "3D LUT 활성화", "3dlut.encoding.input": "입력 인코딩", "3dlut.encoding.output": "출력 인코딩", "3dlut.encoding.output.warning.madvr": "경고: 이 출력 인코딩은 권장하지 않으며, “장치” → “%s” → “속성” 아래의 madVR이 “TV 레벨 (16-235)” 출력으로 설정되지 않은 경우 클리핑을 야기할 수 있습니다. 본인 책임하에 사용하세요!", "3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "3dlut.encoding.type_C": "TV Rec. 2020 고정 휘도 YCbCr UHD", "*3dlut.encoding.type_T": "TV RGB 16-235 (clip WTW)", "3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "*3dlut.encoding.type_n": "Full range RGB 0-255", "3dlut.encoding.type_t": "TV RGB 16-235", "*3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD", "3dlut.format": "3D LUT 파일 포맷", "3dlut.format.3dl": "Autodesk / Kodak (.3dl)", "3dlut.format.ReShade": "ReShade (.png, .fx)", "3dlut.format.cube": "IRIDAS (.cube)", "3dlut.format.eeColor": "eeColor Processor (.txt)", "3dlut.format.icc": "장치 링크 프로파일 (.icc/.icm)", "3dlut.format.madVR": "madVR (.3dlut)", "*3dlut.format.madVR.hdr": "Process HDR content", "*3dlut.format.madVR.hdr.confirm": "Note that you need to have profiled the display in HDR mode. If the display doesn't support HDR natively, click “Cancel”.", "*3dlut.format.madVR.hdr_to_sdr": "Convert HDR content to SDR", "3dlut.format.mga": "Pandora (.mga)", "3dlut.format.png": "PNG (.png)", "3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "3dlut.frame.title": "3D LUT 생성", "*3dlut.hdr.rolloff.diffuse_white": "Diffuse white (reference 94.38 cd/m²)", "*3dlut.hdr.system_gamma": "System gamma (reference 1.2)", "3dlut.holder.assign_preset": "3D LUT을 프리셋으로 할당:", "3dlut.holder.out_of_memory": "%s 은 3D LUT 저장공간을 초과합니다 (최소 %i KB 이상이 필요합니다). %s 에서 3D LUT들을 삭제하여 새 LUT를 저장할 공간을 확보하세요. 더 자세한 내용은 %s 의 문서를 확인하세요.", "3dlut.input.colorspace": "소스 색공간", "3dlut.input.profile": "소스 프로파일", "3dlut.install": "3D LUT 설치", "3dlut.install.failure": "3D LUT 설치에 실패했습니다 (알수없는 에러).", "3dlut.install.success": "3D LUT 설치 성공!", "3dlut.install.unsupported": "선택한 3D LUT 포맷의 설치는 지원하지 않습니다.", "3dlut.save_as": "3D LUT 다른 이름으로 저장...", "3dlut.settings": "3D LUT 설정", "3dlut.size": "3D LUT 크기", "3dlut.tab.enable": "3D LUT 탭 활성화", "3dlut.use_abstract_profile": "개요 (“보기”) 프로파일", "CMP_Digital_Target-3.cie": "CMP Digital Target 3", "CMP_Digital_Target-4.cie": "CMP Digital Target 4", "CMYK_IDEAlliance_ControlStrip_2009.ti1": "IDEAlliance Control Strip 2009", "*CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": "CMYK IDEAlliance ISO 12647-7 Control Wedge 2013", "*CMYK_ISO_12647-7_outer_gamut.ti1": "CMYK ISO 12647-7 outer gamut", "ColorChecker.cie": "ColorChecker", "ColorCheckerDC.cie": "ColorChecker DC", "ColorCheckerPassport.cie": "ColorChecker Passport", "ColorCheckerSG.cie": "ColorChecker SG", "FograStrip2.ti1": "Fogra Media Wedge CMYK V2.0", "FograStrip3.ti1": "Fogra Media Wedge CMYK V3.0", "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008 컬러 정확도 및 그레이 밸런스", "ISO_14861_color_accuracy_RGB318.ti1": "ISO 14861:2015 컬러 정확도 및 그레이 밸런스", "QPcard_201.cie": "QPcard 201", "QPcard_202.cie": "QPcard 202", "SpyderChecker.cie": "SpyderCHECKR", "*Untethered": "Untethered", "[rgb]TRC": "톤응답곡선", "aborted": "...취소되었습니다.", "aborting": "취소중, 잠시 기다리세요 (몇초 정도 걸릴 수 있습니다)...", "abstract_profile": "개요 프로파일", "active_matrix_display": "액티브 매트릭스 디스플레이", "adaptive_mode_unavailable": "적응 모드는 ArgyllCMS 1.1.0 RC3 또는 그 이상의 버전에서만 가능합니다.", "add": "추가...", "advanced": "고급", "allow_skip_sensor_cal": "스펙트로미터 자체 캘리브레이션 생략 허용", "ambient.measure": "주변광 측정", "ambient.measure.color.unsupported": "%s: 이 장치의 주변광 센서는 컬러가 아닌 빛의 밝기 수준만 계측가능하여 주변광의 색온도를 결정할 수 없습니다.", "ambient.measure.light_level.missing": "주변광 수준 측정에 실패했습니다.", "ambient.set": "주변광 수준을 측정된 값으로 설정하시겠습니까?", "app.client.connect": "스크립팅 클라이언트 %s:%s 연결", "app.client.disconnect": "스크립팅 클라이언트 %s:%s 연결해제", "app.client.ignored": "스크립팅 클라이언트의 연결 시도가 거부되었습니다 %s:%s: %s", "app.client.network.disallowed": "스크립팅 클라이언트의 연결시도가 거부되었습니다 %s:%s: 네트워크 클라이언트가 허용되지 않았습니다.", "app.confirm_restore_defaults": "변경한 사항을 무시하고 기본값으로 복원하시겠습니까?", "app.detected": "%s 가 감지되었습니다.", "app.detected.calibration_loading_disabled": "%s 가 감지되었습니다. 캘리브레이션 로딩이 비활성화되었습니다.", "app.detection_lost": "%s 가 더이상 감지되지 않습니다.", "app.detection_lost.calibration_loading_enabled": "%s 가 더이상 감지되지 않습니다. 캘리브레이션 로딩이 활성화되었습니다.", "app.incoming_message": "%s:%s: %s 로부터 스크립팅 요청을 받았습니다.", "app.incoming_message.invalid": "스크립팅 요청이 잘못되었습니다!", "app.listening": "%s:%s 의 스크립팅 호스트 설정", "app.otherinstance": "%s 은 이미 실행중입니다.", "app.otherinstance.notified": "이미 실행중임을 안내하였습니다.", "apply": "적용", "apply_black_output_offset": "검정 출력 오프셋 설정 (100%)", "apply_cal": "캘리브레이션 적용 (vcgt)", "apply_cal.error": "캘리브레이션이 적용되지 않았습니다.", "archive.create": "압축파일 생성...", "archive.import": "압축파일 가져오기...", "archive.include_3dluts": "압축파일에 3D LUT 파일을 포함하시겠습니까 (비권장, 압축파일 크기가 거대해 질 수 있음)?", "argyll.debug.warning1": "실제로 디버깅 정보가 필요한 경우에만 이 옵션을 사용하세요 (예; ArgyllCMS 기능의 문제 해결)! 일반적으로 소프트웨어 개발자가 문제 진단이나 해결을 필요로 하는 경우에만 유용합니다. 정말로 디버깅 출력을 활성화 하시겠습니까?", "argyll.debug.warning2": "소프트웨어의 일반적인 작동을 위해 디버깅 출력을 비활성화 하는 것을 잊지 마십시오.", "argyll.dir": "ArgyllCMS 실행파일 디렉토리:", "argyll.dir.invalid": "ArgyllCMS 실행파일을 찾을 수 없습니다!\n실행파일이 들어있는 디렉토리를 선택해 주세요 (“argyll-” 로 시작하거나 “-argyll”로 끝나는 디렉토리입니다.): %s", "argyll.error.detail": "ArgyllCMS 상세 에러 메시지:", "argyll.instrument.configuration_files.install": "ArgyllCMS 장치구성파일 설치...", "argyll.instrument.configuration_files.install.success": "ArgyllCMS 장치구성파일의 설치가 완료되었습니다.", "argyll.instrument.configuration_files.uninstall": "ArgyllCMS 장치구성파일의 설치삭제...", "argyll.instrument.configuration_files.uninstall.success": "ArgyllCMS 장치구성파일의 설치삭제가 완료되었습니다.", "argyll.instrument.driver.missing": "측정장치를 위한 ArgyllCMS 드라이버가 설치되지 않았거나 잘못 설치된 것 같습니다. 측정장치가 윈도우의 장치관리자에 „Argyll LibUSB-1.0A 장치“로 보여지는지 확인하세요. 필요한 경우 드라이버를 다시 설치하세요. 설치 안내 문서를 참조하세요.", "argyll.instrument.drivers.install": "ArgyllCMS 장치 드라이버를 설치합니다...", "argyll.instrument.drivers.install.confirm": "측정장치가 ColorMunki Display, i1display Pro, Huey, ColorHug, specbos, spectraval, K-10이 아닌 경우에만 ArgyllCMS 의 특정 드라이버를 설치할 필요가 있습니다.\n\n계속 진행하시겠습니까?", "argyll.instrument.drivers.install.failure": "ArgyllCMS 장치드라이버의 설치에 실패했습니다.", "argyll.instrument.drivers.install.restart": "ArgyllCMS 의 장치 드라이버를 설치하기 위해서는 “드라이버 서명 적용”을 비활성화 해야만 합니다. 비활성화를 하려면 컴퓨터를 재시작해야 합니다. 나타나는 페이지에서 “문제 해결”을 선택하세요. 그리고 “고급 옵션”, “시작 설정”, 그리고 “다시 시작”을 선택합니다. 시작단계에서 “드라이버 서명 적용 사용 안함”을 선택합니다. 다시 시작 후, 드라이버를 설치하기 위해 메뉴에 있는 “ArgyllCMS 장치 드라이버 설치...” 를 다시 선택합니다. “문제 해결” 옵션을 찾을 수 없으면, 드라이버 서명적용을 비활성화하기 위해 DisplayCAL 문서의 “Instrument driver installation under Windows” 섹션을 참고하세요.", "argyll.instrument.drivers.uninstall": "ArgyllCMS 장치드라이버 설치삭제...", "argyll.instrument.drivers.uninstall.confirm": "참고: 설치삭제는 현재 사용하고 있는 장치의 드라이버에는 영향을 미치지 않으며, 단지 윈도우의 드라이버 저장소에 있는 드라이버 파일을 삭제합니다. 장치 제조사가 제공한 드라이버로 되돌리고자 하는 경우 윈도우의 장치관리자에서 수동으로 드라이버를 교체할 수 있습니다. 드라이버를 교체하려면 해당 장치를 마우스 오른쪽 버튼으로 클릭하고 “드라이버 소프트웨어 업데이트...”를 선택합니다. 그리고 “컴퓨터에서 드라이버 소프트웨어 찾아보기” 선택, “컴퓨터에의 장치 드라이버 목록에서 직접 선택”을 선택한 후 목록에서 장치 제조사가 제공한 드라이버를 선택합니다\n\n계속 진행하시겠습니까?", "argyll.instrument.drivers.uninstall.failure": "ArgyllCMS 장치드라이버의 설치삭제를 실패했습니다.", "argyll.instrument.drivers.uninstall.success": "ArgyllCMS 정치드라이버의 설치삭제가 완료되었습니다.", "argyll.util.not_found": "ArgyllCMS “%s” 실행파일을 찾을 수 없습니다!", "as_measured": "측정한 값으로", "attributes": "속성", "audio.lib": "오디오 모듈: %s", "auth": "인증", "auth.failed": "인증에 실패하였습니다.", "auto": "자동", "auto_optimized": "자동 최적화", "autostart_remove_old": "오래된 자동실행 항목 제거", "backing_xyz": "Backing XYZ", "backlight": "백라이트", "bitdepth": "비트심도", "black": "검정", "black_lab": "검정 L*a*b*", "black_point": "블랙포인트", "black_point_compensation": "블랙포인트 보상", "black_point_compensation.3dlut.warning": "3D LUT를 생성할 때 블랙포인트 보상 프로파일링 설정은 반드시 해제되어 있어야 합니다. 설정되어 있는 경우 톤곡선 조정 기능에 영향을 미치기 때문입니다. 블랙포인트 보상 설정을 해제하시겠습니까?", "black_point_compensation.info": "블랙포인트 보상은 효과적으로 블랙 뭉개짐을 방지하지만, 컬러 변환의 정확도가 저하됩니다.", "black_white": "검정 & 흰색", "black_xyz": "검정 XYZ", "blacklevel": "검정 레벨", "*blue": "Blue", "blue_gamma": "Blue 감마", "*blue_lab": "Blue L*a*b*", "blue_matrix_column": "Blue 행렬 컬럼", "blue_maximum": "최대 Blue", "blue_minimum": "최소 Blue", "blue_tone_response_curve": "Blue 톤응답곡선", "*blue_xyz": "Blue XYZ", "brightness": "밝기", "browse": "찾기...", "bug_report": "버그 신고...", "button.calibrate": "캘리브레이션만 진행", "button.calibrate_and_profile": "캘리브레이션 & 프로파일링", "button.profile": "프로파일링만 진행", "cal_extraction_failed": "프로파일에서 캘리브레이션 데이터를 추출하지 못했습니다.", "calculated_checksum": "계산된 체크섬", "calibrate_instrument": "스펙트로미터 자체 캘리브레이션", "calibration": "캘리브레이션", "calibration.ambient_viewcond_adjust": "주변광 수준 조정", "calibration.ambient_viewcond_adjust.info": "캘리브레이션 곡선 계산시 관찰 조건 조정을 실시하려면, 체크박스에 표시하고 현재 주변광 수준을 입력합니다. 측정장치가 주변광 측정을 지원하는 경우 이를 선택적으로 이용할 수도 있습니다.", "calibration.black_luminance": "검정 레벨", "calibration.black_output_offset": "검정 출력 오프셋", "calibration.black_point_correction": "블랙포인트 보정", "calibration.black_point_correction_choice": "검정 레벨과 명암비의 최적화를 위해 블랙포인트 보정을 끌 수 있습니다 (대부분의 LCD 모니터에 권장). 또는 검정을 흰색과 동일한 색조로 만들기 위해 블랙포인트 보정을 켤 수 있습니다 (대부분의 CRT 모니터에 권장). 블랙포인트 보정 설정을 선택하세요.", "*calibration.black_point_rate": "Rate", "calibration.check_all": "설정 확인", "calibration.complete": "캘리브레이션 완료!", "calibration.create_fast_matrix_shaper": "행렬 프로파일 생성", "calibration.create_fast_matrix_shaper_choice": "캘리브레이션 측정으로부터 빠른 행렬의 날카로운 프로파일을 생성하시겠습니까 아니면 캘리브레이션만 진행하시겠습니까?", "calibration.do_not_use_video_lut": "캘리브레이션 적용에 비디오카드 감마 테이블 사용 안함", "calibration.do_not_use_video_lut.warning": "정말로 권장 설정을 변경하시겠습니까?", "calibration.embed": "프로파일에 캘리브레이션 곡선 내장", "calibration.file": "설정", "calibration.file.invalid": "선택한 설정 파일이 잘못되었습니다.", "calibration.file.none": "<없음>", "calibration.incomplete": "캘리브레이션이 완료되지 않았습니다.", "calibration.interactive_display_adjustment": "인터랙티브 디스플레이 조정", "calibration.interactive_display_adjustment.black_level.crt": "“측정 시작”을 선택하고 목표 레벨에 일치시키기 위해 디스플레이의 밝기 또는 RGB 오프셋 컨트롤을 조정하세요.", "calibration.interactive_display_adjustment.black_point.crt": "“측정 시작”을 선택하고 목표 블랙포인트에 일치시키기 위해 디스플레이의 RGB 오프셋 컨트롤을 조정하세요.", "calibration.interactive_display_adjustment.check_all": "모든 설정을 확인하기 위해 “측정 시작”을 선택하세요.", "calibration.interactive_display_adjustment.generic_hint.plural": "모든 그래프가 가운데 표시된 지점에 위치하면 좋은 일치를 얻을 수 있습니다.", "calibration.interactive_display_adjustment.generic_hint.singular": "그래프가 가운데 표시된 지점에 위치하면 좋은 일치를 얻을 수 있습니다.", "calibration.interactive_display_adjustment.start": "측정 시작", "calibration.interactive_display_adjustment.stop": "측정 중지", "calibration.interactive_display_adjustment.white_level.crt": "“측정 시작”을 선택하고 목표 수준에 일치시키기 위해 디스플레이의 대비(contrast) 또는 RGB 게인 컨트롤을 조정하세요.", "calibration.interactive_display_adjustment.white_level.lcd": "“측정 시작”을 선택하고 목표 수준에 일치시키기 위해 디스플레이의 백라이트 또는 밝기(brightness) 컨트롤을 조정하세요.", "calibration.interactive_display_adjustment.white_point": "“측정 시작”을 선택하고 목표 화이트포인트에 일치시키기 위해 디스플레이의 색온도 또는 RGB 게인 컨트롤을 조정하세요.", "calibration.load": "설정 로드...", "calibration.load.handled_by_os": "캘리브레이션은 운영체제에 의해 로딩됩니다.", "calibration.load_error": "캘리브레이션 곡선이 로드되지 않았습니다.", "calibration.load_from_cal": "캘리브레이션 파일에서 캘리브레이션 곡선 로드...", "calibration.load_from_cal_or_profile": "캘리브레이션 파일 또는 프로파일에서 캘리브레이션 곡선 로드...", "calibration.load_from_display_profile": "현재 디스플레이 장치 프로파일에서 캘리브레이션 곡선 로드", "calibration.load_from_display_profiles": "현재 디스플레이 장치 프로파일에서 캘리브레이션 로드", "calibration.load_from_profile": "프로파일로부터 캘리브레이션 곡선 로드...", "calibration.load_success": "캘리브레이션 곡선이 성공적으로 로드되었습니다.", "calibration.loading": "파일로부터 캘리브레이션 곡선 로딩...", "calibration.loading_from_display_profile": "현재 디스플레이 장치 프로파일로부터 캘리브레이션 곡선 로딩...", "calibration.luminance": "흰색 레벨", "calibration.lut_viewer.title": "곡선", "calibration.preserve": "캘리브레이션 상태 보존", "calibration.preview": "캘리브레이션 미리보기", "calibration.quality": "캘리브레이션 품질", "calibration.quality.high": "높음", "calibration.quality.low": "낮음", "calibration.quality.medium": "중간", "calibration.quality.ultra": "최상", "calibration.quality.verylow": "최저", "calibration.reset": "비디오카드 감마 테이블 리셋", "calibration.reset_error": "비디오카드 감마 테이블이 리셋되지 않았습니다.", "calibration.reset_success": "비디오카드 감마 테이블이 성공적으로 리셋되었습니다.", "calibration.resetting": "비디오카드 감마 테이블을 선형으로 리셋...", "calibration.settings": "캘리브레이션 설정", "calibration.show_actual_lut": "비디오카드의 캘리브레이션 곡선 보기", "calibration.show_lut": "곡선 보기", "calibration.skip": "프로파일링 계속진행", "calibration.speed": "캘리브레이션 속도", "calibration.speed.high": "빠르게", "calibration.speed.low": "느리게", "calibration.speed.medium": "중간", "calibration.speed.veryhigh": "가장 빠르게", "calibration.speed.verylow": "가장 느리게", "calibration.start": "캘리브레이션 계속진행", "calibration.turn_on_black_point_correction": "켜기", "calibration.update": "캘리브레이션 업데이트", "calibration.update_profile_choice": "현재 프로파일에서 캘리브레이션 곡선을 함께 업데이트 하시겠습니까 아니면 캘리브레이션만 진행하시겠습니까?", "calibration.use_linear_instead": "선형 캘리브레이션을 대신 사용", "calibration.verify": "캘리브레이션 검증", "calibration_profiling.complete": "캘리브레이션 및 프로파일링 완료!", "calibrationloader.description": "모든 구성된 디스플레이 장치들에 대해 ICC 프로파일을 설정하고 캘리브레이션 곡선 로드", "can_be_used_independently": "독립적으로 사용 가능", "cancel": "취소", "cathode_ray_tube_display": "CRT 디스플레이", "*ccmx.use_four_color_matrix_method": "Minimize xy chromaticity difference", "ccxx.ti1": "컬러리미터 보정을 위한 테스트차트", "centered": "중심", "channel_1_c_xy": "채널 1 (C) xy", "channel_1_gamma_at_50_input": "채널 1 입력 50% 에서 감마", "channel_1_is_linear": "채널 1 은 선형", "channel_1_maximum": "채널 1 최대", "channel_1_minimum": "채널 1 최소", "channel_1_r_xy": "채널 1 (R) xy", "channel_1_unique_values": "채널 1 고유값", "channel_2_g_xy": "채널 2 (G) xy", "channel_2_gamma_at_50_input": "채널 2 입력 50% 에서 감마", "channel_2_is_linear": "채널 2 는 선형", "channel_2_m_xy": "채널 2 (M) xy", "channel_2_maximum": "채널 2 최대", "channel_2_minimum": "채널 2 최소", "channel_2_unique_values": "채널 2 고유값", "channel_3_b_xy": "채널 3 (B) xy", "channel_3_gamma_at_50_input": "채널 3 입력 50% 에서 감마", "channel_3_is_linear": "채널 3 은 선형", "channel_3_maximum": "채널 3 최대", "channel_3_minimum": "채널 3 최소", "channel_3_unique_values": "채널 3 고유값", "channel_3_y_xy": "채널 3 (Y) xy", "channel_4_k_xy": "채널 4 (K) xy", "channels": "채널", "characterization_device_values": "장치값 특성화", "characterization_measurement_values": "측정값 특성화", "characterization_target": "타겟 특성화", "checking_lut_access": "디스플레이 %s의 비디오카드 감마 테이블 접근 확인...", "checksum": "체크섬", "checksum_ok": "체크섬 OK", "chromatic_adaptation_matrix": "색순응 행렬", "chromatic_adaptation_transform": "색순응 변환", "chromaticity_illuminant_relative": "색도 (광원-상대적)", "chromecast_limitations_warning": "크롬캐스트는 RGB를 YCbCr로 변환하고 업스케일을 하는 관계로, 크롬캐스트의 정확도는 디스플레이나 madTPG에 직접 연결하는 것만큼 좋지 않습니다.", "*clear": "Clear", "*close": "Close", "color": "컬러", "color_look_up_table": "컬러 참조테이블", "color_model": "컬러 모델", "color_space_conversion_profile": "색공간 변환 프로파일", "colorant_order": "원색 순서", "colorants_pcs_relative": "원색 (PCS-상대적)", "colorimeter_correction.create": "컬러리미터 보정치 생성...", "colorimeter_correction.create.details": "아래 항목을 확인하고 필요한 경우 변경해 주세요. 명세에는 중요한 세부사항이 포함되어야 합니다 (예. 특정 디스플레이 설정, 비표준 CIE 관찰자 또는 관련 항목).", "colorimeter_correction.create.failure": "보정치 생성에 실패했습니다.", "colorimeter_correction.create.info": "컬러리미터 보정치를 생성하려면, 먼저 스펙트로미터를 사용하여 테스트 컬러를 측정해야 합니다. 분광 보정 대신 컬러리미터를 사용하여 보정치 행렬을 생성하고자 하는 경우에도 스펙트로미터를 사용한 측정이 필요합니다.\n대안으로 “찾기...”를 선택하여 기존 측정치를 사용할 수도 있습니다.", "colorimeter_correction.create.success": "보정치가 성공적으로 생성되었습니다.", "colorimeter_correction.file.none": "없음", "colorimeter_correction.import": "다른 디스플레이 프로파일링 소프트웨어로부터 컬러리미터 보정치 가져오기...", "colorimeter_correction.import.choose": "가져올 컬러리미터 보정치 파일을 선택하세요.", "colorimeter_correction.import.failure": "컬러리미터 보정치를 가져오지 못했습니다.", "colorimeter_correction.import.partial_warning": "%s로부터 모든 컬러리미터 보정치를 가져오지 못했습니다. %i of %i 항목은 누락되었습니다.", "colorimeter_correction.import.success": "컬러리미터 보정치 또는 측정 모드를 다음 소프트웨어로부터 성공적으로 가져왔습니다:\n\n%s", "colorimeter_correction.instrument_mismatch": "선택한 컬러리미터 보정치는 선택한 장치에 적합하지 않습니다.", "colorimeter_correction.upload": "컬러리미터 보정치 업로드...", "colorimeter_correction.upload.confirm": "컬러리미터 보정치를 온라인 데이터베이스에 업로드 하시겠습니까 (권장)? 업로드한 모든 파일은 공개 및 공유되며 자유롭게 사용됩니다.", "colorimeter_correction.upload.deny": "이 컬러리미터 보정치는 업로드할 수 없습니다.", "colorimeter_correction.upload.exists": "이 컬러리미터 보정치는 이미 데이터베이스에 존재합니다.", "colorimeter_correction.upload.failure": "이 보정치는 온라인 데이터베이스에 포함할 수 없습니다.", "colorimeter_correction.upload.success": "보정치를 성공적으로 온라인 데이터베이스에 업로드하였습니다.", "colorimeter_correction.web_check": "컬러리미터 보정치를 온라인 확인...", "colorimeter_correction.web_check.choose": "선택한 디스플레이와 측정장치를 위한 컬러리미터 보정치를 찾았습니다:", "colorimeter_correction.web_check.failure": "선택한 디스플레이와 측정장치를 위한 컬러리미터 보정치를 찾지 못했습니다.", "colorimeter_correction.web_check.info": "모든 컬러리미터 보정은 다양한 사용자가 제공한 것이므로 사용자의 특정상황에 대한 유용성은 사용자가 직접 결정할 수 있습니다. 사용하는 디스플레이의 특성에 따라 컬러리미터의 절대 정확도가 향상되거나 개선되지 않을 수도 있습니다.", "colorimeter_correction_matrix_file": "보정", "colorimeter_correction_matrix_file.choose": "컬러리미터 보정치 선택...", "colorimetric_intent_image_state": "색도 이미지 상태", "colors_pcs_relative": "컬러 (PCS-상대적)", "colorspace": "색공간", "colorspace.show_outline": "윤곽 보기", "commandline": "명령줄:", "commands": "명령어", "comparison_profile": "프로파일 비교", "comport_detected": "장치/포트의 구성에 변화가 있음을 감지했습니다.", "compression.gzip": "GZIP 압축", "computer.name": "컴퓨터이름", "connected.to.at": "다음에 연결됨 %s at %s:%s", "connecting.to": "다음으로 연결 %s:%s...", "connection.broken": "연결 실패", "connection.established": "연결 성공", "connection.fail": "연결 에러 (%s)", "connection.fail.http": "HTTP 연결 %s", "connection.waiting": "연결을 위해 대기중", "continue": "계속", "contrast": "대비(Contrast)", "contribute": "후원", "converting": "변환", "copyright": "저작권", "corrected": "보정됨", "create_profile": "측정 데이터로부터 프로파일 생성...", "create_profile_from_edid": "확장 디스플레이 식별 데이터로부터 프로파일 생성...", "created": "생성일", "creator": "생성자", "current": "현재", "custom": "사용자정의", "*cyan": "Cyan", "d3-e4-s2-g28-m0-b0-f0.ti1": "행렬 프로파일용 Small 테스트차트", "d3-e4-s3-g52-m3-b0-f0.ti1": "행령 프로파일용 확장 테스트차트", "d3-e4-s4-g52-m4-b0-f0.ti1": "LUT 프로파일용 Small 테스트차트", "d3-e4-s5-g52-m5-b0-f0.ti1": "LUT 프로파일용 확장 테스트차트", "d3-e4-s9-g52-m9-b0-f0.ti1": "LUT 프로파일용 Large 테스트차트", "d3-e4-s17-g52-m17-b0-f0.ti1": "LUT 프로파일용 Very large 테스트차트", "deactivated": "비활성화", "default": "기본값", "default.icc": "기본값 (감마 2.2)", "default_crt": "기본 CRT", "default_rendering_intent": "기본 렌더링 인텐트", "delete": "삭제", "delta_e_2000_to_blackbody_locus": "흑체궤적 기준 ΔE 2000", "delta_e_2000_to_daylight_locus": "주광궤적 기준 ΔE 2000", "delta_e_to_locus": "%s 궤적 기준 ΔE*00", "description": "명세", "description_ascii": "명세 (ASCII)", "description_macintosh": "명세 (Macintosh)", "description_unicode": "명세 (Unicode)", "deselect_all": "전체 선택해제", "detect_displays_and_ports": "디스플레이 및 측정장치 감지", "device": "장치", "device.name.placeholder": "<장치명>", "device_color_components": "장치 컬러 컴포넌트", "device_manager.launch": "장치 관리자 실행", "device_manufacturer_name": "장치 제조사명", "device_manufacturer_name_ascii": "장치 제조사명 (ASCII)", "device_manufacturer_name_macintosh": "장치 제조사명 (Macintosh)", "device_manufacturer_name_unicode": "장치 제조사명 (Unicode)", "device_model_name": "장치 모델명", "device_model_name_ascii": "장치 모델명 (ASCII)", "device_model_name_macintosh": "장치 모델명 (Macintosh)", "device_model_name_unicode": "장치 모델명 (Unicode)", "device_to_pcs_intent_0": "장치 to PCS: Intent 0", "device_to_pcs_intent_1": "장치 to PCS: Intent 1", "device_to_pcs_intent_2": "장치 to PCS: Intent 2", "devicelink_profile": "장치 링크 프로파일", "dialog.argyll.notfound.choice": "DisplayCAL의 실행을 위해서는 이 컴퓨터에 ArgyllCMS 컬러 엔진이 설치되어 있어야 합니다. 자동으로 다운로드 하시겠습니까? 아니면 직접 수동으로 설치하시겠습니까?", "dialog.cal_info": "캘리브레이션 파일 “%s” 이 사용됩니다. 계속하시겠습니까?", "dialog.confirm_cancel": "정말로 취소하시겠습니까?", "dialog.confirm_delete": "정말로 선택한 파일을 삭제하시겠습니까?", "dialog.confirm_overwrite": "파일 “%s” 은 이미 존재합니다. 덮어쓰시겠습니까?", "dialog.confirm_uninstall": "정말로 선택한 파일을 삭제하시겠습니까?", "dialog.current_cal_warning": "현재 캘리브레이션 곡선이 사용됩니다. 계속하시겠습니까?", "dialog.do_not_show_again": "이 메시지를 다시 보지 않음", "dialog.enter_password": "암호를 입력해 주세요.", "dialog.install_profile": "프로파일 “%s” 을 설치하고 디스플레이 “%s” 에 대한 기본값으로 사용하시겠습니까?", "dialog.linear_cal_info": "선형 캘리브레이션 곡선이 사용됩니다. 계속하시겠습니까?", "dialog.load_cal": "설정 로드", "dialog.select_argyll_version": "ArgyllCMS 의 버전 %s 이 발견되었습니다. 현재 선택한 버전은 %s 입니다. 더 새로운 버전을 사용하시겠습니까?", "dialog.set_argyll_bin": "ArgyllCMS 실행 파일이 들어 있는 디렉토리를 선택해 주세요.", "dialog.set_profile_save_path": "프로파일 디렉토리를 “%s” 여기에 생성:", "dialog.set_testchart": "테스트차트 파일 선택", "dialog.ti3_no_cal_info": "측정 데이터가 캘리브레이션 곡선을 가지고 있지 않습니다. 정말 계속하시겠습니까?", "digital_camera": "디지털 카메라", "digital_cinema_projector": "디지털 시네마 프로젝터", "digital_motion_picture_camera": "디지털 영화 카메라", "direction.backward": "PCS → B2A → 장치", "direction.backward.inverted": "PCS ← B2A ← 장치", "direction.forward": "장치 → A2B → PCS", "direction.forward.inverted": "장치 ← A2B ← PCS", "directory": "디렉토리", "disconnected.from": "%s:%s 로부터 연결 해제", "display": "디스플레이", "display-instrument": "디스플레이 & 장치", "display.connection.type": "연결", "display.manufacturer": "디스플레이 장치 제조사", "display.output": "출력 #", "display.primary": "(기본)", "display.properties": "디스플레이 장치 속성", "display.reset.info": "디스플레이 장치를 공장 초기화하세요, 그리고 밝기를 보기에 적정한 수준으로 조정하세요.", "display.settings": "디스플레이 장치 설정", "display.tech": "디스플레이 기술", "display_detected": "디스플레이 장치 구성의 변화가 감지되었습니다.", "display_device_profile": "디스플레이 장치 프로파일", "display_lut.link": "디스플레이 및 비디오카드 감마 테이블 접근 링크/링크해제", "display_peak_luminance": "디스플레이 최대 휘도", "display_profile.not_detected": "디스플레이 “%s”를 위한 기본 프로파일이 감지되지 않았습니다.", "display_short": "디스플레이 장치 (abbreviated)", "displayport": "디스플레이포트", "displays.identify": "디스플레이 장치 식별", "dlp_screen": "DLP 스크린", "donation_header": "귀하의 후원을 부탁드립니다!", "donation_message": "DisplayCAL 과 ArgyllCMS 의 지속적인 개발 및 업데이트, 기술적인 지원을 희망하신다면, 금전적 후원을 고려해 주십시오. DisplayCAL 은 ArgyllCMS 없이는 사용될 수 없기 때문에 DisplayCAL로 들어오는 모든 후원은 두 프로젝트에 나누어 후원됩니다.\n개인사용자의 비상업적 사용의 경우, 단 한번의 후원이라도 감사드립니다. 만약 DisplayCAL을 전문적으로 사용하신다면, 연간 또는 월간 후원을 해 주시면 DisplayCAL 과 ArgyllCMS 두 프로젝트의 지속과발전에 정말 큰 도움이 될 것입니다.\n\n모든 후원자 여러분께 진심으로 감사드립니다!", "download": "다운로드", "*download.fail": "Download failed:", "download.fail.empty_response": "다운로드 실패: %s 빈 도큐먼트로 리턴되었습니다.", "download.fail.wrong_size": "다운로드 실패: 파일이 예상한 %s 바이트의 크기가 아닙니다. (%s 바이트 수신).", "download_install": "다운로드 & 설치", "downloading": "다운로딩", "drift_compensation.blacklevel": "흑색 수준 변동 보상", "drift_compensation.blacklevel.info": "흑색 수준 변동 보상은 측정장치의 과열로 인한 흑색 캘리브레이션의 변동에 따른 측정 편차를 계산합니다. 이를 위해 흑색 패치가 주기적으로 측정되며, 이는 전체 측정시간을 증가시킵니다. 많은 컬러리미터 센서는 온도에 따른 보상 기능이 내장되어 있으며, 흑색수준 변동보상을 사용할 필요가 없습니다. 하지만 대부분의 스펙트로미터는 온도에 따른 보상기능을 가지고 있지 않습니다.", "drift_compensation.whitelevel": "백색 수준 변동 보상", "drift_compensation.whitelevel.info": "백색 수준 변동 보상은 디스플레이 장치의 과열로 인한 휘도의 변화에 따른 측정 편차를 계산합니다. 이를 위해 백색 패치가 주기적으로 측정되며, 이는 전체 측정시간을 증가시킵니다.", "dry_run": "모의 진행", "dry_run.end": "모의 진행 종료.", "dry_run.info": "모의 진행. 명령줄을 보기 위해 로그를 확인하세요.", "dvi": "DVI", "dye_sublimation_printer": "염료승화프린터", "edid.crc32": "EDID CRC32 체크섬", "edid.serial": "EDID 시리얼", "elapsed_time": "경과 시간", "*electrophotographic_printer": "Electrophotographic printer", "*electrostatic_printer": "Electrostatic printer", "enable_argyll_debug": "ArgyllCMS 디버깅 출력 활성화", "enable_spyder2": "Spyder 2 컬러리미터 활성화...", "enable_spyder2_failure": "Spyder 2 가 활성화되지 않았습니다. 아직 설치되지 않았다면 Spyder 2 소프트웨어를 설치한 후, 다시 이 명령을 실행하세요.", "enable_spyder2_success": "Spyder 2 가 성공적으로 활성화 되었습니다.", "entries": "엔트리", "enumerate_ports.auto": "장치 자동 감지", "enumerating_displays_and_comports": "디스플레이 장치 및 통신 포트 나열...", "environment": "환경", "error": "에러", "error.access_denied.write": "%s 의 쓰기 권한이 없습니다.", "error.already_exists": "“%s” 이름은 사용할 수 없습니다. 동일한 이름의 다른 오브젝트가 이미 존재합니다. 다른 이름 또는 다른 디렉토리를 선택하세요.", "error.autostart_creation": "로그인시 캘리브레이션 곡선을 로드하기 위한 %s 의 자동실행 엔트리 생성에 실패하였습니다.", "error.autostart_remove_old": "로그인시 캘리브레이션 곡선을 로드하는 자동실행 엔트리의 오래된 항목을 삭제할 수 없습니다: %s", "error.autostart_system": "전체 시스템을 대상으로 로그인시 캘리브레이션 곡선을 로드하는 자동실행 엔트리를 생성할 수 없습니다. 전체 시스템 자동실행 디렉토리를 확인할 수 없습니다.", "error.autostart_user": "현재 사용자를 대상으로 로그인시 캘리브레이션 곡선을 로드하는 자동실행 엔트리를 생성할 수 없습니다. 현재 사용자 대상 자동실행 디렉토리를 확인할 수 없습니다.", "error.cal_extraction": "“%s” 로부터 캘리브레이션을 추출할 수 없습니다.", "error.calibration.file_missing": "캘리브레이션 파일 “%s” 을 찾을 수 없습니다.", "error.calibration.file_not_created": "캘리브레이션 파일이 생성되지 않았습니다.", "error.copy_failed": "“%s” 파일을 “%s” 파일로 복사하지 못했습니다.", "error.deletion": "%s 로 파일을 이동하는 동안 에러가 발생했습니다. 몇몇 파일이 삭제되지 않았을 수 있습니다.", "error.dir_creation": "“%s” 디렉토리를 생성할 수 없습니다. 접속 권한에 문제가 있는 것 같습니다. 쓰시권한을 부여하거나 다른 디렉토리를 선택하세요.", "error.dir_notdir": "“%s” 디렉토리를 생성할 수 없습니다. 같은 이름을 사용하는 다른 오브젝트가 이미 존재합니다. 다른 디렉토리를 선택하세요.", "error.file.create": "“%s” 파일을 생성할 수 없습니다.", "error.file.open": "“%s” 파일을 열 수 없습니다.", "error.file_type_unsupported": "지원하지 않는 파일 유형입니다.", "error.generic": "내부 에러가 발생했습니다.\n\n에러 코드: %s\n에러 메시지: %s", "*error.luminance.invalid": "The measured peak luminance was invalid. Make sure the instrument sensor is not blocked, and remove any protective cap (if present).", "error.measurement.file_invalid": "측정 파일 „%s“ 이 잘못되었습니다.", "error.measurement.file_missing": "측정 파일 “%s” 을 찾을 수 없습니다.", "error.measurement.file_not_created": "측정 파일이 생성되지 않았습니다.", "error.measurement.missing_spectral": "측정 파일이 분광 값을 가지고 있지 않습니다.", "error.measurement.one_colorimeter": "한개의 컬러리미터 측정(기)만 필요합니다.", "error.measurement.one_reference": "한개의 레퍼런스 측정(기)만 필요합니다.", "error.no_files_extracted_from_archive": "“%s” 로부터 아무 파일도 추출하지 못했습니다.", "error.not_a_session_archive": "“%s” 압축파일은 세션 압축파일이 아닌 것 같습니다.", "error.profile.file_missing": "프로파일 “%s” 을 찾을 수 없습니다.", "error.profile.file_not_created": "프로파일이 생성되지 않았습니다.", "error.source_dest_same": "소스 파일과 타겟 파일이 동일합니다.", "error.testchart.creation_failed": "테스트차트 파일 “%s” 을 생성할 수 없습니다. 접근권한 문제이거나 소스파일이 없는 경우입니다.", "error.testchart.invalid": "테스트차트 파일 “%s” 이 잘못되었습니다.", "error.testchart.missing": "테스트차트 파일 “%s” 을 찾을 수 없습니다.", "error.testchart.missing_fields": "테스트차트 파일 “%s” 이 필요한 항목을 가지고 있지 않습니다: %s", "error.testchart.read": "테스트차트 파일 “%s” 을 읽을 수 없습니다.", "error.tmp_creation": "임시 작업 디렉토리를 생성할 수 없습니다.", "error.trashcan_unavailable": "%s 은 사용할 수 없습니다. 파일이 삭제되었습니다.", "errors.none_found": "에러가 발견되지 않았습니다.", "estimated_measurement_time": "예상 측정 소요시간은 약 %s 시간 %s 분 입니다", "exceptions": "예외...", "executable": "실행", "export": "내보내기...", "extra_args": "추가 명령줄 인수 설정...", "factory_default": "공장 초기화", "failure": "...실패!", "*file.hash.malformed": "The integrity of %s cannot be verified because the checksum file is malformed.", "*file.hash.missing": "The integrity of %s cannot be verified because it doesn't have an entry in the checksum file.", "*file.hash.verification.fail": "Checksum verification failed for %s:\n\nExpected %s\nActual %s", "file.invalid": "파일이 잘못되었습니다.", "file.missing": "“%s” 파일은 존재하지 않습니다.", "file.notfile": "“%s” 은 파일이 아닙니다.", "file.select": "파일 선택", "filename": "파일명", "filename.upload": "파일명 업로드", "filetype.7z": "7-Zip 파일", "filetype.any": "모든 파일 유형", "filetype.cal": "캘리브레이션 파일 (*.cal)", "filetype.cal_icc": "캘리브레이션 및 프로파일링 파일 (*.cal;*.icc;*.icm)", "filetype.ccmx": "보정 matrices/캘리브레이션 분광 샘플 (*.ccmx;*.ccss)", "filetype.html": "HTML 파일 (*.html;*.htm)", "filetype.icc": "프로파일링 파일 (*.icc;*.icm)", "filetype.icc_mpp": "프로파일링 파일 (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "테스트차트 파일 (*.icc;*.icm;*.ti1;*.ti3)", "filetype.icc_ti3": "측정 파일 (*.icc;*.icm;*.ti3)", "filetype.log": "로그 파일 (*.log)", "filetype.png": "Portable Network Graphics (*.png)", "*filetype.tgz": "Compressed TAR archive", "filetype.ti1": "테스트차트 파일 (*.ti1)", "filetype.ti1_ti3_txt": "테스트차트 파일 (*.ti1), 측정 파일 (*.ti3;*.txt)", "filetype.ti3": "측정 파일 (*.ti3)", "filetype.tif": "Tagged Image File (*.tif)", "filetype.txt": "DeviceCorrections.txt", "filetype.vrml": "VRML 파일 (*.wrl)", "filetype.x3d": "X3D 파일 (*.x3d)", "filetype.zip": "ZIP 파일", "film_scanner": "필름 스캐너", "film_writer": "필름 레코더", "finish": "종료", "*flare": "Flare", "*flexography": "Flexography", "focal_plane_colorimetry_estimates": "초점면 색도 예측", "forced": "강제", "format.select": "희망하는 포맷을 선택하세요.", "fullscreen.message": "전체화면 모드가 활성화되었습니다.\n전체화면을 해제하려면 ESC 를 누르세요.", "fullscreen.osx.warning": "윈도우 상단의 줌 버튼을 통해 전체화면 모드에 진입한 경우, 기본 모드로 돌아오려면 윈도우가 닫힌 후에 CMD + TAB 을 누르세요. 윈도우 상단을 더블 클릭하거나, 줌 버튼을 OPTION 키와 함께 클릭하여 전체화면 모드로 진입하는 것도 가능합니다.", "gamap.default_intent": "기본 렌더링 인텐트", "*gamap.intents.a": "Absolute colorimetric", "*gamap.intents.aa": "Absolute appearance", "*gamap.intents.aw": "Absolute colorimetric with white point scaling", "*gamap.intents.la": "Luminance matched appearance", "*gamap.intents.lp": "Luminance preserving perceptual appearance", "*gamap.intents.ms": "Preserve saturation", "*gamap.intents.p": "Perceptual", "*gamap.intents.pa": "Perceptual appearance", "*gamap.intents.r": "Relative colorimetric", "*gamap.intents.s": "Saturation", "gamap.out_viewcond": "목표 관찰 조건", "*gamap.perceptual": "Gamut mapping for perceptual intent", "gamap.profile": "소스 프로파일", "*gamap.saturation": "Gamut mapping for saturation intent", "gamap.src_viewcond": "소스 관찰 조건", "*gamap.viewconds.cx": "Cut sheet transparencies on a viewing box", "gamap.viewconds.jd": "완벽히 어두운 환경에서 프로젝터", "gamap.viewconds.jm": "어둑한 환경에서 프로젝터", "gamap.viewconds.mb": "밝은 작업 환경에서 모니터", "gamap.viewconds.md": "어두운 작업 환경에서 모니터", "gamap.viewconds.mt": "일반적인 작업 환경에서 모니터", "*gamap.viewconds.ob": "Original scene - bright Outdoors", "gamap.viewconds.pc": "중요한 프린트 평가 환경 (ISO-3664 P1)", "*gamap.viewconds.pcd": "Photo CD - original scene outdoors", "gamap.viewconds.pe": "프린트 평가 환경 (CIE 116-1995)", "gamap.viewconds.pp": "현실적인 반사 프린트 (ISO-3664 P2)", "gamap.viewconds.tv": "텔레비전/필름 스튜디오", "gamapframe.title": "고급 색역 매핑 옵션", "gamut": "색역", "gamut.coverage": "색역 커버리지", "gamut.view.create": "색역 보기 생성중...", "gamut.volume": "색역 크기", "gamut_mapping.ciecam02": "CIECAM02 색역 매핑", "gamut_mapping.mode": "색역 매핑 모드", "gamut_mapping.mode.b2a": "PCS-to-장치", "gamut_mapping.mode.inverse_a2b": "장치-to-PCS 반전", "gamut_plot.tooltip": "시점을 이동하기 위해 플롯 안에서 클릭하고 드래그하세요. 또는 마우스 휠을 사용하여 줌인/아웃할 수 있습니다. 시검을 리셋하려면 더블클릭하세요.", "*generic_name_value_data": "Generic name-value data", "*geometry": "Geometry", "*glossy": "Glossy", "*go_to": "Go to %s", "go_to_website": "웹사이트로 가기", "*gravure": "Gravure", "gray_tone_response_curve": "Gray 톤응답곡선", "*grayscale": "grayscale", "*green": "Green", "green_gamma": "Green 감마", "*green_lab": "Green L*a*b*", "green_matrix_column": "Green 행렬 컬럼", "green_maximum": "최대 Green", "green_minimum": "최소 Green", "green_tone_response_curve": "Green 톤응답곡선", "*green_xyz": "Green XYZ", "*grid_steps": "Grid Steps", "hdmi": "HDMI", "*hdr_maxcll": "Maximum content light level", "*hdr_mincll": "Minimum content light level", "header": "디스플레이 캘리브레이션 및 프로파일링 powered by ArgyllCMS", "help_support": "도움말 및 지원...", "host.invalid.lookup_failed": "잘못된 호스트 (address lookup failed)", "*hue": "Hue", "*icc_absolute_colorimetric": "ICC-absolute colorimetric", "icc_version": "ICC 버전", "*if_available": "if available", "illuminant": "광원", "illuminant_relative_cct": "광원 상대적 CCT", "illuminant_relative_lab": "광원 상대적 L*a*b*", "illuminant_relative_xyz": "광원 상대적 XYZ", "illuminant_xyz": "광원 XYZ", "illumination": "조도", "*in": "In", "info.3dlut_settings": "A 3D LUT (LUT = Look Up Table, 참조테이블) 또는 ICC 장치 링크 프로파일은 전체 디스플레이 컬러 보정을 위해 3D LUT 또는 ICC 장치 링크를 지원하는 애플리케이션에서 사용 가능합니다.\n\n이미 있는 프로파일로부터 여러개의 (추가적인) 3D LUT 생성\n“설정”에서 원하는 프로파일을 선택하고, “프로파일링 후 3D LUT 생성”을 체크 해제합니다.\n\n올바른 소스 색공간과 톤응답곡선 선택\n3D LUT 및 ICC 장치 링크 프로파일의 경우 소스 색공간 및 톤응답곡선을 미리 설정하고 전체 색상 변환의 부분 고정이 되어야 합니다 (즉석에서 동적으로 링크되는 ICC 장치 프로파일과 다름). 예를 들어, HD 비디오 자료는 보통 Rec. 709 표준에 따라 순수한 전력 감마 2.2-2.4 (흑백 출력 오프셋 100%) 또는 Rec. 1886 톤응답곡선 (절대 출력 0%의 검은 색 출력)으로 마스터됩니다. 흑색 출력 오프셋을 0 %에서 100 % 사이의 값으로 설정하여 Rec. 1886과 순수 전력 간의 분리도 가능합니다.\n\n“Absolute” vs. “relative” 감마\n실제 디스플레이의 0이 아닌 검정 레벨을 얻으려면 톤응답곡선을 적절하게 간격을 두고 조정해야 합니다.\n“Absolute” 감마는 이상적인 출력 곡선과 일치하지 않는 50 % 입력에서 실제 출력을 생성합니다 (검은 색 레벨이 0이 아닌 경우).\n“Relative” 감마는 이상적인 출력 곡선과 일치하는 50% 입력시 실제 출력을 생성합니다.\n\n렌더링 인텐트\n소스 색공간에 의해 정의된 것과 다른 화이트포인트로 캘리브레이션한 경우 3D LUT 대신 사용하려면 “Relative colorimetric” 을 선택하십시오. 아니면 “Absolute colorimetric with white point scaling” 을 선택하십시오 (화이트포인트 스케일링은 소스 색공간 화이트포인트가 디스플레이 영역 외부에 있을 때 발생할 수 있는 absolue colorimetric 모드에서 클리핑을 방지합니다). 또한 디스플레이 색역 내에서 소스 색공간을 압축하거나 확장할 수 있는 non-colorimetric 모드를 사용할 수도 있습니다 (색도 정확도가 요구되는 경우 권장하지 않음).", "info.calibration_settings": "캘리브레이션 은 지정한 화이트포인트와 흰색 레벨을 맞추기 위해 인터랙티브 디스플레이 조정 기능을 사용합니다. 또한 지정한 톤응답곡선과 그레이 밸런스를 확보하기 위해 1D LUT 캘리브레이션 곡선 (LUT = Look Up Table, 참조테이블) 을 생성할 수 있습니다. 디스플레이의 조정만을 원하고 1D LUT 곡선의 생성을 생략하고 싶으면 톤응답곡선을 “측정한 값으로” 선택하세요. 1D LUT 캘리브레이션만으로는 디스플레이 전체의 컬러를 조정하는 것이 불가능 합니다. 전체 컬러의 조정을 원한다면 ICC 장치 프로파일 이나 3D LUT 을 생성하고 이를 지원하는 애플리케이션을 사용해야만 합니다. 1D LUT 캘리브레이션은 프로파일링과 3D LUT 캘리브레이션의 보조적 수단입니다.", "info.display_instrument": "만약 디스플레이가 OLED, 플라즈마(PDP) 또는 이미지 콘텐츠에 따라 가변적으로 빛을 출력하는(자발광형) 기술을 사용하는 경우, 백색 수준 변동 보상을 활성화하세요.\n\n만약 측정장치가 스펙트로미터 이고 접촉모드로 디스플레이의 안정적인 흑색 수준을 측정하려는 경우, 흑색 수준 변동 보상 을 사용할 수 있습니다.\n\n만약 측정장치가 컬러리미터인 경우, 사용하는 디스플레이에 적합한 보정 을 사용해야 합니다. 몇몇 측정장치들은 (ColorHug, ColorHug2, K-10, Spyder4/5) 보정 기능이 각 장치의 측정모드에 내장되어 있습니다.", "info.display_instrument.warmup": "측정 전 디스플레이는 최소 30 분 이상 예열되어야 합니다. 장치를 접촉 모드로 사용하는 경우, 해당 시간동안 디스플레이 위에 장치를 놔두는 것도 좋습니다.", "info.mr_settings": "측정된 패치의 컬러 에러에 대한 상세한 분석을 포함한 측정 보고서를 통해 ICC 프로파일 또는 3D LUT 의 정확도를 검증 할 수 있습니다.\n\n3D LUT를 검증하는 경우, 3D LUT를 생성했을 때와 동일한 설정을 사용하십시오.", "info.profile_settings": "프로파일링 은 디스플레이 장치의 컬러출력특성을 파악하여 기술하는 것이며, 컬러 출력에 대한 반응을 ICC 장치 프로파일로 저장하는 것입니다. ICC 장치 프로파일은 완전한 디스플레이 컬러 보정 을 위해 ICC 컬러 매니지먼트를 지원하는 애플리케이션에서 사용됩니다. 또한 프로파일을 기반으로 완전한 디스플레이 컬러 보정을 위해 3D LUT (LUT = Look Up Table, 참조테이블) 을 생성할 수도 있습니다.\n\n측정하는 패치의 숫자는 프로파일이 가져올 정확도에 영향을 미칩니다. 괜찮은 수준의 컬러 혼합 및 선형성을 가지고 있는 디스플레이에서는 수십개의 패치만으로 만드는 3x3 행렬 및 곡선 기반 프로파일로도 적정한 수준의 품질을 얻을 수 있습니다. 대게 전문가용 디스플레이들이 이 범주에 속합니다. 만약 최고수준의 정확도를 요구하는 경우에는 수백개에서 수천개 수준의 패치를 기반으로 한 LUT 기반 프로파일이 요구됩니다. “자동 최적화” 테스트차트 설정은 자동으로 디스플레이의 실제 반응과 비선형성을 측정하며, 최고 수준의 결과를 원하는 경우 선택합니다. 이 기능은 슬라이더로 프로파일의 정확도와 컬러측정 및 계산시간에 대한 절충을 할 수 있습니다.", "infoframe.default_text": "", "infoframe.title": "로그", "infoframe.toggle": "로그창 보기", "*initial": "Initial", "initializing_gui": "GUI 초기화...", "ink_jet_printer": "잉크젯 프린터", "input_device_profile": "입력장치 프로파일", "input_table": "입력 테이블", "install_display_profile": "디스플레이 장치 프로파일 설치...", "install_local_system": "시스템 전체에 설치", "install_user": "현재 사용자 계정에만 설치", "instrument": "장치", "instrument.calibrate": "장치를 무광의 검정 표현 위에 올려놓거나 검정 캘리브레이션 플레이트에 올려놓은 후, OK 버튼을 눌러 장치의 자체 캘리브레이션을 진행합니다.", "instrument.calibrate.colormunki": "컬러멍키 센서를 캘리브레이션 포지션에 놓은 후, OK 버튼을 눌러 장치의 자체 캘리브레이션을 진행합니다.", "instrument.calibrate.reflective": "장치를 반사 백색 레퍼런스 serial no. %s 에 올려놓은 후, OK 버튼을 눌러 장치의 자체 캘리브레이션을 진행합니다.", "instrument.calibrating": "장치 자체 캘리브레이션 중...", "instrument.connect": "측정장치를 지금 연결하세요.", "instrument.initializing": "장치를 세팅합니다. 잠시 기다려 주세요...", "instrument.measure_ambient": "장치가 주변광을 측정하기 위해 별도의 마개가 존재한다면, 마개를 장착하세요. 주변광을 측정하기 위해 장치를 모니터 옆에 위를 향하도록 위치시키세요. 만약 관찰 부스와 같은 관찰조명을 측정하려면 중성의 그레이차트를 부스 안에 넣고 장치를 차트를 향하도록 하세요. 주변광 측정에 대한 절차나 방법은 장치 제조사가 제공하는 문서를 참조하세요. OK 버튼을 눌러 측정을 계속합니다.", "instrument.place_on_screen": "장치를 테스트창 위에 배치한 후 OK 를 클릭하면 계속 진행합니다.", "instrument.place_on_screen.madvr": "(%i) 테스트 영역에 %s 센서를 올려놓으세요", "instrument.reposition_sensor": "측정 센서가 잘못된 포지션에 위치하여 측정이 실패하였습니다. 센서를 올바른 포지션에 위치하세요. OK 를 클릭하여 계속합니다.", "*internal": "Internal", "*invert_selection": "Invert selection", "*is_embedded": "Is embedded", "*is_illuminant": "Is illuminant", "*is_linear": "Is linear", "laptop.icc": "노트북 (감마 2.2)", "*libXss.so": "X11 screen saver extension", "library.not_found.warning": "라이브러리 “%s” (%s) 을 찾을 수 없습니다. 계속하기 전 설치여부를 확인하세요.", "license": "라이선스", "*license_info": "Licensed under the GPL", "*linear": "linear", "*link.address.copy": "Copy link address", "log.autoshow": "로그창 자동으로 보기", "luminance": "밝기(휘도)", "lut_access": "비디오카드 감마 테이블 접속", "madhcnet.outdated": "%s 에서 발견된 %s 의 설치된 버전이 오래되었습니다. 최신 madVR 버전으로 업데이트 하십시오 (최소 %i.%i.%i.%i).", "madtpg.launch.failure": "madTPG 를 찾을 수 없거나 실행할 수 없습니다.", "madvr.not_found": "madVR DirectShow 필터를 레지스트리에서 찾을 수 없습니다. 설치되어 있는지 확인해 주세요.", "madvr.outdated": "madVR 버전이 오래되었습니다. 최신 버전으로 업데이트 해주세요 (최소 %i.%i.%i.%i).", "*madvr.wrong_levels_detected": "The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235).", "*magenta": "Magenta", "make_and_model": "제조사 및 모델", "manufacturer": "제조사", "*mastering_display_black_luminance": "Mastering display black level", "*mastering_display_peak_luminance": "Mastering display peak luminance", "matrix": "행렬", "*matte": "Matte", "*max": "Max", "*maximal": "Maximal", "measure": "측정", "measure.darken_background": "검정 배경", "measure.darken_background.warning": "주의: 만약 „검정 배경“ 을 선택했다면 전체 화면에 적용되어 디스플레이 조정창을 볼 수 없게 됩니다! 멀티 모니터 환경이라면 측정을 시작하기 전에 디스플레이 조정창을 다른 스크린으로 이동하세요. 또는 키보드를 사용하세요 (측정을 취소하려면 Q 버튼을 누릅니다. 측정이 진행중이라면 잠시 기다린 후 Q 버튼을 다시 누릅니다).", "measure.override_display_settle_time_mult": "디스플레이 설정시간 승수", "measure.override_min_display_update_delay_ms": "최소 디스플레이 업데이트 지연", "measure.testchart": "테스트차트 측정", "measureframe.center": "Center", "measureframe.info": "측정창을 원하는 곳에 위치하고 필요한 경우 크기를 조절합니다. 전체 윈도우는 디스플레이 측정 패치의 표시에 사용됩니다. 원 모양은 측정장치를 위치할 대략의 가이드입니다.\n측정장치를 올려놓은 후 „측정 시작“ 을 클릭합니다. 취소하고 메인 화면으로 돌아오려면 측정창을 닫습니다.", "measureframe.measurebutton": "측정 시작", "measureframe.title": "측정 영역", "measureframe.zoomin": "확대", "measureframe.zoommax": "최대/복구", "measureframe.zoomnormal": "기본 크기", "measureframe.zoomout": "축소", "measurement.play_sound": "계속되는 측정에 음향 피드백", "measurement.untethered": "Untethered measurement", "measurement_file.check_sanity": "측정 파일 체크...", "measurement_file.check_sanity.auto": "측정 파일 자동 체크", "measurement_file.check_sanity.auto.warning": "측정의 자동 체크 기능은 실험적인 기능힙니다. 본인 책임하에 사용하세요.", "measurement_file.choose": "측정 파일을 선택해 주세요", "measurement_file.choose.colorimeter": "컬러리미터 측정 파일을 선택해 주세요", "measurement_file.choose.reference": "레퍼런스 측정 파일을 선택해 주세요", "measurement_mode": "모드", "*measurement_mode.adaptive": "Adaptive", "*measurement_mode.dlp": "DLP", "measurement_mode.factory": "공장 캘리브레이션", "measurement_mode.generic": "일반", "measurement_mode.highres": "고해상도", "measurement_mode.lcd": "LCD (일반)", "measurement_mode.lcd.ccfl": "LCD (CCFL)", "measurement_mode.lcd.ccfl.2": "LCD (CCFL Type 2)", "measurement_mode.lcd.oled": "LCD (OLED)", "*measurement_mode.lcd.white_led": "LCD (White LED)", "measurement_mode.lcd.wide_gamut.ccfl": "광색역 LCD (CCFL)", "measurement_mode.lcd.wide_gamut.rgb_led": "광색역 LCD (RGB LED)", "*measurement_mode.raw": "Raw", "measurement_mode.refresh": "CRT (Refresh, 일반)", "measurement_report": "측정 보고서...", "measurement_report.update": "측정 업데이트 또는 균일성 보고서...", "measurement_report_choose_chart": "측정한 테스트차트를 선택하세요.", "measurement_report_choose_chart_or_reference": "테스트차트 또는 레퍼런스를 선택하세요.", "measurement_report_choose_profile": "검증할 프로파일을 선택하세요.", "measurement_type": "측정 유형", "measurements.complete": "측정이 완료되었습니다! 측정 파일이 있는 폴더를 여시겠습니까?", "measuring.characterization": "특성화(프로파일링)를 위해 컬러 패치 측정 중...", "media_black_point": "매체 블랙포인트", "media_relative_colorimetric": "매체 상대적 색도", "media_white_point": "매체 화이트포인트", "menu.about": "DisplayCAL에 대하여...", "menu.file": "파일", "menu.help": "?", "menu.language": "언어", "menu.options": "옵션", "menu.tools": "도구", "menuitem.quit": "종료", "menuitem.set_argyll_bin": "ArgyllCMS 실행파일 위치지정...", "*metadata": "Metadata", "*method": "Method", "*min": "Min", "*minimal": "Minimal", "model": "모델", "motion_picture_film_scanner": "영화필름 스캐너", "mswin.open_display_settings": "윈도우 디스플레이 설정 열기...", "*named_color_profile": "Named color profile", "*named_colors": "Named colors", "*native": "Native", "*negative": "Negative", "*no": "No", "no_settings": "파일이 설정을 담고 있지 않습니다.", "*none": "None", "*not_applicable": "Not applicable", "*not_connected": "Not connected", "not_found": "“%s” 을 찾을 수 없습니다.", "not_now": "나중에", "*number_of_entries": "Number of entries", "*number_of_entries_per_channel": "Number of entries per channel", "observer": "관찰자", "observer.1931_2": "CIE 1931 2°", "observer.1955_2": "Stiles & Birch 1955 2°", "observer.1964_10": "CIE 1964 10°", "observer.1964_10c": "CIE 1964 10° / 1931 2° hybrid", "observer.1978_2": "Judd & Voss 1978 2°", "*observer.2012_2": "CIE 2012 2°", "*observer.2012_10": "CIE 2012 10°", "observer.shaw": "Shaw & Fairchild 1997 2°", "oem.import.auto": "컬러리미터가 윈도우용 소프트웨어 CD와 함께 제공된 경우, 지금 CD 를 넣어주세요 (CD의 자동소프트웨어 설치는 취소하십시오).\n\nCD가 없거나 필요한 파일을 찾을 수 없는 경우, 웹에서 다운로드가 진행됩니다.", "oem.import.auto.download_selection": "감지된 센서를 기반으로 한 사전선택값이 준비되어 있습니다. 다운로드할 파일을 선택해 주세요.", "oem.import.auto_windows": "컬러리미터 센서 제조사가 제공하는 소프트웨어가 이미 설치되어 있는 경우, 대부분의 경우 필요한 파일은 자동으로 찾을 수 있습니다.", "office_web.icc": "Office & Web (D65, 감마 2.2)", "*offset": "Offset", "*offset_lithography": "Offset lithography", "*ok": "OK", "*or": "or", "osd": "OSD", "*other": "Other", "*out": "Out", "*out_of_gamut_tag": "Out of gamut tag", "output.profile": "타겟 프로파일", "output_device_profile": "출력 장치 프로파일", "*output_levels": "Output levels", "output_offset": "출력 오프셋", "output_table": "출력 테이블", "overwrite": "덮어쓰기", "*panel.surface": "Panel surface", "panel.type": "패널 유형", "passive_matrix_display": "Passive matrix 디스플레이", "patch.layout.select": "패치 레이아웃을 선택해 주세요:", "*patches": "Patches", "patterngenerator.prisma.specify_host": "Prisma Video Processor의 호스트 이름을 지정하십시오. prisma-0123 (Windows) 또는 prisma-0123.local (Linux / Mac OS X). Prisma의 관리 웹 인터페이스를 통해 변경된 경우가 아니면 Prisma의 밑면에있는 레이블에서 호스트 이름을 찾을 수 있습니다. 또는 IP 주소 (알려진 경우)를 입력하십시오. 예: 192.168.1.234", "*patterngenerator.sync_lost": "Lost sync with the pattern generator.", "pause": "잠시멈춤", "pcs_illuminant_xyz": "PCS 광원 XYZ", "pcs_relative_cct": "PCS 상대적 CCT", "pcs_relative_lab": "PCS 상대적 L*a*b*", "pcs_relative_xyz": "PCS 상대적 XYZ", "pcs_to_device_intent_0": "PCS to 장치: Intent 0", "pcs_to_device_intent_1": "PCS to 장치: Intent 1", "pcs_to_device_intent_2": "PCS to 장치: Intent 2", "perceptual": "Perceptual", "photo.icc": "사진 (D50, 감마 2.2)", "photo_imagesetter": "사진 이미지세터", "photographic_paper_printer": "사진용지 프린터", "platform": "플랫폼", "please_wait": "기다려 주세요...", "port.invalid": "잘못된 포트: %s", "*positive": "Positive", "*preferred_cmm": "Preferred CMM", "prepress.icc": "프리프레스 (D50, 130 cd/m², L*)", "preset": "프리셋", "preview": "미리보기", "profile": "프로파일", "profile.advanced_gamap": "고급...", "*profile.b2a.hires": "Enhance effective resolution of colorimetric PCS-to-device table", "profile.b2a.lowres.warning": "프로파일이 고품질의 PCS-to-장치 테이블을 가지고 있지 않은 것 같습니다. 이는 올바른 작동을 위해 필수적입니다. 고품질 테이블을 지금 생성하시겠습니까? 몇분이 소요될 수 있습니다.", "*profile.b2a.smooth": "Smoothing", "profile.choose": "프로파일을 선택해 주세요.", "profile.confirm_regeneration": "프로파일을 다시 생성하시겠습니까?", "profile.current": "현재 프로파일", "profile.do_not_install": "프로파일 설치 금지", "profile.iccv4.unsupported": "ICC 프로파일 버전4는 지원하지 않습니다.", "profile.import.success": "프로파일을 가져왔습니다. 시스템 설정의 “컬러”에서 수동으로 프로파일을 할당하고 활성화할 필요가 있습니다.", "profile.info": "프로파일 정보", "profile.info.show": "프로파일 정보 보기", "profile.install": "프로파일 설치", "profile.install.error": "프로파일을 설치/활성화하지 못했습니다.", "profile.install.success": "프로파일이 설치되고 활성화되었습니다.", "profile.install.warning": "프로파일이 설치 완료되었지만 문제가 있는 것 같습니다.", "profile.install_local_system": "시스템 기본값으로 프로파일 설치", "profile.install_network": "네트워크 범용으로 프로파일 설치", "profile.install_user": "현재 사용자 전용으로 프로파일 설치", "profile.invalid": "Invalid 프로파일.", "profile.load_error": "디스플레이 프로파일이 로드되지 못했습니다.", "profile.load_on_login": "로그인시 캘리브레이션 로드", "profile.load_on_login.handled_by_os": "운영체제가 캘리브레이션 로딩 (신뢰성과 정밀도가 낮음)", "profile.name": "프로파일명", "profile.name.placeholders": "다음의 기호를 프로파일명에 사용할 수 있습니다:\n\n%a Abbreviated weekday name\n%A Full weekday name\n%b Abbreviated month name\n%B Full month name\n%d Day of the month\n%H Hour (24-hour clock)\n%I Hour (12-hour clock)\n%j Day of the year\n%m Month\n%M Minute\n%p AM/PM\n%S Second\n%U Week (Sunday as first day of the week)\n%w Weekday (sunday is 0)\n%W Week (Monday as first day of the week)\n%y Year without century\n%Y Year with century", "profile.no_embedded_ti3": "프로파일이 Argyll 과 호환되는 측정 데이터를 가지고 있지 않습니다.", "profile.no_vcgt": "프로파일이 캘리브레이션 곡선을 가지고 있지 않습니다.", "*profile.only_named_color": "Only profiles of type “Named Color” can be used.", "profile.quality": "프로파일 품질", "profile.quality.b2a.low": "낮은 품질 PCS-to-장치 테이블", "profile.quality.b2a.low.info": "Choose this option if the profile is only going to be used with inverse device-to-PCS gamut mapping to create a device link or 3D LUT", "profile.required_tags_missing": "프로파일에 다음 태그가 없습니다: %s", "profile.self_check": "프로파일 자가진단 ΔE*76", "profile.self_check.avg": "평균", "profile.self_check.max": "최대", "profile.self_check.rms": "RMS", "profile.set_save_path": "저장할 경로 선택...", "profile.settings": "프로파일링 설정", "profile.share": "프로파일 업로드...", "profile.share.avg_dE_too_high": "프로파일이 너무 높은 delta E 를 보여줍니다. (actual = %s, threshold = %s).", "profile.share.b2a_resolution_too_low": "프로파일 내 PCS to 장치 테이블의 해상도가 너무 낮습니다.", "profile.share.enter_info": "프로파일을 OpenSUSE “ICC profile Taxi” 서비스를 통해 다른 사용자와 공유할 수 있습니다.\n\n아래에 장치 속성과 충분한 설명을 기술하여 주세요. 디스플레이 장치의 OSD 메뉴로부터 설정값을 확인하고 기본값에서 변경된 설정값만을 기술해 주세요.\n예: 대부분의 디스플레이 장치들은 사전설정(chosen preset), 밝기(brightness), 대비(contrast), 색온도(color temperature), RGB 게인(RGB gain), 감마(gamma) 와 같은 설정이 있습니다. 노트북의 경우에는 대부분 밝기(brightness)만 있습니다. 디스플레이 장치의 캘리브레이션 도중 추가적으로 변경한 값이 있다면 가능하다면 함께 기록해 주세요.", "profile.share.meta_missing": "프로파일이 필요한 메타정보를 가지고 있지 않습니다.", "profile.share.success": "프로파일이 성공적으로 업로드되었습니다.", "*profile.tags.A2B0.shaper_curves.input": "A2B0 input shaper curves", "*profile.tags.A2B0.shaper_curves.output": "A2B0 output shaper curves", "*profile.tags.A2B1.shaper_curves.input": "A2B1 input shaper curves", "*profile.tags.A2B1.shaper_curves.output": "A2B1 output shaper curves", "*profile.tags.A2B2.shaper_curves.input": "A2B2 input shaper curves", "*profile.tags.A2B2.shaper_curves.output": "A2B2 output shaper curves", "*profile.tags.B2A0.shaper_curves.input": "B2A0 input shaper curves", "*profile.tags.B2A0.shaper_curves.output": "B2A0 output shaper curves", "*profile.tags.B2A1.shaper_curves.input": "B2A1 input shaper curves", "*profile.tags.B2A1.shaper_curves.output": "B2A1 output shaper curves", "*profile.tags.B2A2.shaper_curves.input": "B2A2 input shaper curves", "*profile.tags.B2A2.shaper_curves.output": "B2A2 output shaper curves", "profile.testchart_recommendation": "고품질의 프로파일을 위해서는 더 많은 샘플의 테스트차트가 권장됩니다. 하지만 더 많은 측정시간이 요구됩니다. 권장 테스트차트를 사용하시겠습니까?", "profile.type": "프로파일 유형", "profile.type.gamma_matrix": "감마 + 행렬", "profile.type.lut.lab": "L*a*b* LUT", "profile.type.lut.xyz": "XYZ LUT", "profile.type.lut_matrix.xyz": "XYZ LUT + 행렬", "profile.type.lut_rg_swapped_matrix.xyz": "XYZ LUT + swapped 행렬", "profile.type.shaper_matrix": "다중 곡선 + 행렬", "profile.type.single_gamma_matrix": "단일 감마 + 행렬", "profile.type.single_shaper_matrix": "단일 곡선 + 행렬", "profile.unsupported": "지원하지 않는 프로파일 유형 (%s) 또는 색공간 (%s) 입니다.", "profile.update": "프로파일 업데이트", "profile_associations": "프로파일 연결...", "profile_associations.changing_system_defaults.warning": "시스템 기본값을 변경합니다", "profile_associations.use_my_settings": "이 디스플레이 장치를 위해 내 설정 사용", "profile_class": "프로파일 클래스", "profile_connection_space_pcs": "프로파일 연결공간 (PCS)", "profile_loader": "프로파일 로더", "profile_loader.disable": "프로파일 로더 비활성화", "profile_loader.exceptions.known_app.error": "%s 이 실행되는 동안 프로파일 로더가 자동으로 비활성화됩니다. 이 동작은 재정의할 수 없습니다.", "profile_loader.exit_warning": "프로파일 로더를 정말로 종료하시겠습니까? 디스플레이 구성을 변경하면 캘리브레이션이 더 이상 자동으로 재로드되지 않습니다!", "profile_loader.fix_profile_associations": "프로파일 연결 자동 고침", "profile_loader.fix_profile_associations_warning": "프로파일 로더가 실행중인 동안에는 디스플레이 구성을 변경할 때 프로파일 연결을 처리 할 수 있습니다.\n\n진행하기 전에 위의 프로파일 연결이 올바른지 확인하십시오. 그렇지 않은 경우 다음 단계를 따르십시오:\n\n1. 윈도우의 디스플레이 설정을 엽니다.\n2. 연결된 모든 디스플레이를 활성화합니다 (확장 데스크탑).\n3. 프로파일 연결을 여세요.\n4. 각 디스플레이 장치에 올바른 프로파일이 할당되어 있는지 확인하십시오. 그런 다음 프로파일 연결을 닫습니다.\n5. 윈도우 디스플레이 설정에서 이전 디스플레이 구성으로 되돌리고 디스플레이 설정을 닫습니다.\n6. 이제 “자동으로 프로파일 연결 수정”을 활성화 할 수 있습니다..", "profile_loader.info": "캘리브레이션 상태가 오늘까지 %i 시간만큼 (재)적용되었습니다.\n메뉴를 보려면 아이콘을 마우스 오른쪽 버튼으로 클릭하세오.", "profiling": "프로파일링", "profiling.complete": "프로파일링 완료!", "profiling.incomplete": "프로파일링이 완료되지 않았습니다.", "projection_television": "프로젝션TV", "projector": "프로젝터", "projector_mode_unavailable": "프로젝터 모드는 ArgyllCMS 1.1.0 Beta 또는 그 이상의 버전에서만 가능합니다.", "quality.ultra.warning": "Ultra 품질은 거의 사용하지 않아야 한다는 것을 증명할 때 빼고는 거의 사용되지 않아야 합니다 (긴 처리 시간!). 높은 품질 또는 중간 품질을 대신 선택할 수 있습니다.", "*readme": "ReadMe", "*ready": "Ready.", "*red": "Red", "red_gamma": "Red 감마", "*red_lab": "Red L*a*b*", "red_matrix_column": "Red 행렬 컬럼", "red_maximum": "최대 Red", "red_minimum": "최소 Red", "red_tone_response_curve": "Red 톤응답곡선", "red_xyz": "Red XYZ", "reference": "레퍼런스", "*reflection_hardcopy_original_colorimetry": "Reflection hardcopy original colorimetry", "*reflection_print_output_colorimetry": "Reflection print output colorimetry", "*reflective": "Reflective", "reflective_scanner": "반사 스캐너", "remaining_time": "남은 시간 (약)", "remove": "삭제", "rendering_intent": "렌더링 인텐트", "report": "보고서", "report.calibrated": "교정후 디스플레이 장치에 대한 보고서", "report.uncalibrated": "교정전 디스플레이 장치에 대한 보고서", "report.uniformity": "디스플레이 장치 균일성 측정...", "*reset": "Reset", "resources.notfound.error": "심각한 오류: 필요한 파일을 찾지 못했습니다:", "resources.notfound.warning": "경고: 필요한 파일을 찾지 못했습니다:", "response.invalid": "잘못된 응답 %s: %s", "response.invalid.missing_key": "잘못된 응답 %s: Missing key “%s”: %s", "response.invalid.value": "잘못된 응답 %s: “%s” 키 값이 예상한 값과 일치하지 않습니다 “%s”: %s", "restore_defaults": "기본값 복원", "*rgb.trc": "RGB transfer function", "*rgb.trc.averaged": "averaged RGB transfer function", "sRGB.icc": "sRGB", "*saturation": "Saturation", "save": "저장", "save_as": "다른 이름으로 저장...", "*scene_appearance_estimates": "Scene appearance estimates", "*scene_colorimetry_estimates": "Scene colorimetry estimates", "scripting-client": "DisplayCAL 스크립팅 클라이언트", "scripting-client.cmdhelptext": "빈 명령 프롬프트에서 Tab 키를 눌러 현재 컨텍스트에서 가능한 명령을 보거나 이미 입력 한 초기 문자를 자동 완성하십시오. 연결된 응용 프로그램에 대해 지원되는 명령 및 가능한 매개 변수 목록을 보려면 “getcommands”를 입력하십시오.", "scripting-client.detected-hosts": "스크립팅 호스트 발견:", "select_all": "전체 선택", "set_as_default": "기본값으로 설정", "setting.keep_current": "현재 설정 유지", "settings.additional": "부가 설정", "settings.basic": "기본 설정", "settings.new": "<현재>", "settings_loaded": "캘리브레이션 곡선 및 다음 캘리브레이션 설정이 로드되었습니다: %s. 다른 캘리브레이션 옵션은 기본값으로 저장되었고 프로파일링 옵션은 변경되지 않았습니다.", "settings_loaded.cal": "프로파일이 캘리브레이션만 가지고 있습니다. 다른 옵션은 변경되지 않았습니다. 캘리브레이션 곡선이 발견되지 않았습니다.", "settings_loaded.cal_and_lut": "프로파일이 캘리브레이션 설정만 가지고 있습니다. 다른 옵션은 변경되지 않았고 캘리브레이션 곡선만 로드되었습니다.", "settings_loaded.cal_and_profile": "설정이 로드되었습니다. 캘리브레이션 곡선은 발견되지 않았습니다.", "settings_loaded.profile": "프로파일이 프로파일 설정만 가지고 있습니다. 다른 옵션은 변경되지 않았습니다. 캘리브레이션 곡선을 발견하지 못했습니다.", "settings_loaded.profile_and_lut": "프로파일이 프로파일링 설정만 가지고 있습니다. 다른 옵션은 변경되지 않았고 캘리브레이션 곡선만 로드되었습니다.", "show_advanced_options": "고급 옵션 보기", "*show_notifications": "Show notifications", "silkscreen": "실크스크린", "simulation_profile": "프로파일 시물레이션", "size": "크기", "skip_legacy_serial_ports": "구형 시리얼 포트 생략", "softproof.icc": "소프트프루프 (5800K, 160 cd/m², L*)", "spectral": "분광", "*ssl.certificate_verify_failed": "The remote certificate could not be verified.", "*ssl.certificate_verify_failed.root_ca_missing": "The remote certificate could not be verified because no suitable root certificates were found on the local system.", "*ssl.handshake_failure": "Handshake failure. A secure connection could not be established.", "startup": "시작하는 중...", "startup_sound.enable": "시작 사운드 허용", "*success": "...ok.", "*surround_xyz": "Surround XYZ", "synthicc.create": "인조 ICC 프로파일 생성...", "*target": "Target", "tc.3d": "진단 3D 파일 생성", "*tc.I": "Perceptual space body centered cubic grid", "*tc.Q": "Perceptual space filling quasi-random", "*tc.R": "Perceptual space random", "*tc.adaption": "Adaption", "*tc.algo": "Distribution", "*tc.angle": "Angle", "*tc.black": "Black patches", "*tc.dark_emphasis": "Dark region emphasis", "*tc.fullspread": "Iterative patches", "*tc.gray": "Neutral patches", "*tc.i": "Device space body centered cubic grid", "*tc.limit.sphere": "Limit samples to sphere", "*tc.limit.sphere_radius": "Radius", "*tc.multidim": "Multidimensional", "*tc.multidim.patches": "steps = %s patches (%s neutral)", "tc.neutral_axis_emphasis": "중성 축 강조", "tc.ofp": "최적화된 최단 포인트 샘플링", "*tc.patch": "Patch", "*tc.patches.selected": "selected", "*tc.patches.total": "Total patches", "tc.precond": "Preconditioning 프로파일", "tc.precond.notset": "Preconditioning 프로파일을 선택해 주세요.", "tc.preview.create": "미리보기 생성중, 잠시 기다려 주세요...", "*tc.q": "Device space filling quasi-random", "*tc.r": "Device space random", "*tc.single": "Single channel patches", "*tc.single.perchannel": "per channel", "*tc.t": "Incremental far point sampling", "*tc.vrml.black_offset": "RGB black offset (L*)", "*tc.vrml.use_D50": "Neutral RGB white", "*tc.white": "White patches", "technology": "기술", "tempdir_should_still_contain_files": "생성 된 파일은 여전히 임시 디렉토리에 있어야 합니다 “%s”.", "testchart.add_saturation_sweeps": "Add saturation sweeps", "testchart.add_ti3_patches": "레퍼런스 패치 추가...", "testchart.auto_optimize.untethered.unsupported": "untethered 가상 디스플레이는 테스트 차트 자동 최적화를 지원하지 않습니다.", "*testchart.change_patch_order": "Change patch order", "testchart.confirm_select": "파일이 저장되었습니다. 이 테스트차트를 선택하시겠습니까?", "testchart.create": "테스트차트 생성", "testchart.discard": "취소", "*testchart.dont_select": "Don't select", "testchart.edit": "테스트차트 편집...", "*testchart.export.repeat_patch": "Repeat each patch:", "testchart.file": "테스트차트", "testchart.info": "선택한 테스트차트 패치의 크기", "*testchart.interleave": "Interleave", "*testchart.maximize_RGB_difference": "Maximize RGB difference", "*testchart.maximize_lightness_difference": "Maximize lightness difference", "*testchart.maximize_rec709_luma_difference": "Maximize luma difference", "*testchart.optimize_display_response_delay": "Minimize display response delay", "*testchart.patch_sequence": "Patch sequence", "testchart.patches_amount": "패치 규모", "testchart.read": "테스트차트 읽는 중...", "testchart.save_or_discard": "테스트차트가 저장되지 않았습니다.", "testchart.select": "선택", "testchart.separate_fixed_points": "별도 단계에서 추가할 패치를 선택하십시오.", "testchart.set": "테스트차트 파일 선택...", "*testchart.shift_interleave": "Shift & interleave", "*testchart.sort_RGB_blue_to_top": "Sort RGB blue to top", "*testchart.sort_RGB_cyan_to_top": "Sort RGB cyan to top", "*testchart.sort_RGB_gray_to_top": "Sort RGB gray to top", "*testchart.sort_RGB_green_to_top": "Sort RGB green to top", "*testchart.sort_RGB_magenta_to_top": "Sort RGB magenta to top", "*testchart.sort_RGB_red_to_top": "Sort RGB red to top", "*testchart.sort_RGB_white_to_top": "Sort RGB white to top", "*testchart.sort_RGB_yellow_to_top": "Sort RGB yellow to top", "*testchart.sort_by_BGR": "Sort by BGR", "*testchart.sort_by_HSI": "Sort by HSI", "*testchart.sort_by_HSL": "Sort by HSL", "*testchart.sort_by_HSV": "Sort by HSV", "*testchart.sort_by_L": "Sort by L*", "*testchart.sort_by_RGB": "Sort by RGB", "*testchart.sort_by_RGB_sum": "Sort by sum of RGB", "*testchart.sort_by_rec709_luma": "Sort by luma", "*testchart.vary_RGB_difference": "Vary RGB difference", "testchart_or_reference": "테스트차트 또는 레퍼런스", "thermal_wax_printer": "염료승화 프린터", "*tone_values": "Tone values", "*transfer_function": "Transfer function", "*translations": "Translations", "*transparency": "Transparency", "trashcan.linux": "휴지통", "trashcan.mac": "휴지통", "trashcan.windows": "휴지통", "trc": "톤응답곡선", "trc.dicom": "DICOM", "trc.gamma": "감마", "*trc.hlg": "Hybrid Log-Gamma", "trc.lstar": "L*", "trc.rec709": "Rec. 709", "trc.rec1886": "Rec. 1886", "trc.should_use_viewcond_adjust": "SMPTE 240M을 사용할 때, Rec. 709 또는 sRGB 곡선의 경우 주변광 레벨에 대한 조정을 사용하여 정확한 결과를 얻어야 합니다. 이를 수행하려면 “주변광 수준” 근처의 체크 박스를 선택하고 Lux에 값을 입력하십시오. 또한 측정장비가 지원하는 경우 캘리브레이션 중에 주변광을 선택적으로 측정할 수 있습니다.", "trc.smpte240m": "SMPTE 240M", "trc.smpte2084": "SMPTE 2084", "*trc.smpte2084.hardclip": "SMPTE 2084 (hard clip)", "*trc.smpte2084.rolloffclip": "SMPTE 2084 (roll-off)", "trc.srgb": "sRGB", "trc.type.absolute": "절대적", "trc.type.relative": "상대적", "turn_off": "끄기", "type": "유형", "udev_hotplug.unavailable": "udev 또는 hotplug가 감지되지 않았습니다.", "*unassigned": "Unassigned", "uninstall": "삭제", "uninstall_display_profile": "설치된 디스플레이 장치 프로파일 삭제...", "*unknown": "Unknown", "*unmodified": "Unmodified", "*unnamed": "Unnamed", "*unspecified": "Unspecified", "update_check": "애플리케이션 업데이트 확인...", "update_check.fail": "애플리케이션 업데이트의 확인에 실패하였습니다:", "update_check.fail.version": "서버 %s 의 리모트 버전 파일을 구문분석 할 수 없습니다.", "update_check.new_version": "업데이트가 가능합니다: %s", "update_check.onstartup": "시작시 애플리케이션 업데이트 확인", "update_check.uptodate": "%s 은 최신 버전입니다.", "update_now": "지금 업데이트", "upload": "업로드", "use_fancy_progress": "멋진 진행 안내창 사용", "use_separate_lut_access": "개별 비디오카드 감마 테이블 접근 사용", "use_simulation_profile_as_output": "시뮬레이션 프로파일을 타겟 프로파일로 사용", "vcgt": "교정 곡선", "vcgt.mismatch": "디스플레이를 위한 비디오카드 감마 테이블 %s 이 목표로 한 상태와 일치하지 않습니다.", "vcgt.unknown_format": "알수 없는 비디오카드 감마 테이블이 프로파일 “%s” 에 있습니다.", "verification": "검증", "verification.settings": "검증 설정", "verify.ti1": "검증 테스트차트", "verify_extended.ti1": "Extended 검증 테스트차트", "verify_grayscale.ti1": "Graybalance 검증 테스트차트", "verify_large.ti1": "Large 검증 테스트차트", "verify_video.ti1": "검증 테스트차트 (비디오)", "verify_video_extended.ti1": "Extended 검증 테스트차트 (비디오)", "*verify_video_extended_hlg_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, Hybrid Log-Gamma)", "*verify_video_extended_smpte2084_100_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²)", "*verify_video_extended_smpte2084_200_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²)", "*verify_video_extended_smpte2084_500_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²)", "*verify_video_extended_smpte2084_1000_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²)", "verify_video_large.ti1": "Large 검증 테스트차트 (비디오)", "verify_video_xl.ti1": "Extra large 검증 테스트차트 (비디오)", "verify_video_xxl.ti1": "XXL 검증 테스트차트 (비디오)", "verify_video_xxxl.ti1": "XXXL 검증 테스트차트 (비디오)", "verify_xl.ti1": "Extra large 검증 테스트차트", "verify_xxl.ti1": "XXL 검증 테스트차트", "verify_xxxl.ti1": "XXXL 검증 테스트차트", "vga": "VGA", "video.icc": "비디오 (D65, Rec. 1886)", "video_Prisma.icc": "비디오 3D LUT for Prisma (D65, Rec. 709 / Rec. 1886)", "video_ReShade.icc": "비디오 3D LUT for ReShade (D65, Rec. 709 / Rec. 1886)", "video_camera": "비디오 카메라", "video_card_gamma_table": "비디오카드 감마 테이블", "video_eeColor.icc": "비디오 3D LUT for eeColor (D65, Rec. 709 / Rec. 1886)", "video_madVR.icc": "비디오 3D LUT for madVR (D65, Rec. 709 / Rec. 1886)", "*video_madVR_ST2084.icc": "Video 3D LUT for madVR HDR (D65, Rec. 2020 / SMPTE 2084)", "video_monitor": "비디오 모니터", "video_resolve.icc": "비디오 3D LUT for Resolve (D65, Rec. 709 / Rec. 1886)", "view.3d": "3D 보기", "*viewing_conditions": "Viewing conditions", "*viewing_conditions_description": "Viewing conditions description", "*vrml_to_x3d_converter": "VRML to X3D converter", "warning": "경고", "warning.already_exists": "선택한 위치에서 “%s” 파일은 이미 존재하며 덮어쓰게 됩니다. 계속하시겠습니까?", "warning.autostart_system": "전체 시스템의 자동시작 디렉토리를 결정할 수 없습니다.", "warning.autostart_user": "현재 유저용 자동시작 디렉토리를 결정할 수 없습니다.", "warning.discard_changes": "정말로 현재 설정의 변경을 취소하시겠습니까?", "warning.input_value_clipping": "경고: 타겟 블랙포인트 아래의 입력값들은 클리핑됩니다!", "warning.suspicious_delta_e": "경고: 의심스러운 측정 값이 발견되었습니다. 이 검사는 sRGB 수준의 디스플레이 장치를 전제로 합니다. 디스플레이 장치가 이 전제와 다른 경우 (예: 광색역 또는 sRGB와 너무 먼 톤응답이있는 경우) 이 경고는 무시해도 됩니다.\n\n다음 기준 중 하나 또는 모두가 해당되었습니다:\n\n• 연속적인 패치는 RGB 번호가 다르지만, 서로에 대한 측정치의 ΔE*00 이 의심스럽습니다.\n• 이전 패치를 향해 RGB 수는 증가되지만 밝기(L*)는 감소하는 RGB 회색.\n• 이전 패치를 향해 RGB 숫자가 감소하는데 밝기(L*)가 증가하는 RGB 회색.\n• RGB 값의 sRGB에 해당하는 측정치의 비정상적으로 높은 ΔE*00 및 ΔL*00 또는 ΔH*00 또는 ΔC*00.\n\n이것은 측정 오류를 암시할 수 있습니다. 문제가 있는 것으로 간주되는 값은 빨간색으로 강조 표시됩니다. 측정값을 주의 깊게 확인하고 허용할 값을 표시하십시오. RGB 및 XYZ 값을 편집할 수도 있습니다.", "warning.suspicious_delta_e.info": "Δ 란에 대한 설명:\n\nΔE*00 XYZ A/B: 이전 패치의 측정 값에 대한 측정 값의 ΔE*00. 이 값이 누락된 경우 검사 대상이 아니었습니다. 이 값이 존재하는 것우, 값이 너무 낮은 값이 의심됩니다.\n\n0.5 ΔE*00 RGB A/B: 이전 패치의 RGB 수치 (0.5 배수)의 sRGB 환산값에 대한 현재 패치의 RGB 수치의 sRGB 환산값의 ΔE*00. 이 값이 있으면 ΔE*00 XYZ A/B가 너무 낮은 것으로 확인되는 비교(최소) 값을 나타냅니다. 매우 개략적인 값입니다.\n\nΔE*00 RGB-XYZ: RGB 수치의 sRGB 환산값에 대한 측정치의 ΔE*00.\nΔL*00 RGB-XYZ: RGB 수치의 sRGB 환산값에 대한 측정치의 ΔL*00.\nΔC*00 RGB-XYZ: RGB 수치의 sRGB 환산값에 대한 측정치의 ΔC*00.\nΔH*00 RGB-XYZ: RGB 수치의 sRGB 환산값에 대한 측정치의 ΔH*00.", "warning.system_file": "경고: “%s” 은 시스템 파일입니다. 정말 계속하시겠습니까?", "webserver.waiting": "웹서버 대기중", "welcome": "환영합니다!", "welcome_back": "환영합니다!", "white": "백색", "whitepoint": "화이트포인트", "whitepoint.colortemp": "색온도", "whitepoint.colortemp.locus.blackbody": "흑체", "whitepoint.colortemp.locus.curve": "색온도 곡선", "whitepoint.colortemp.locus.daylight": "주광", "whitepoint.set": "화이트포인트를 측정된 값으로 설정하시겠습니까?", "whitepoint.simulate": "화이트포인트 시뮬레이트", "whitepoint.simulate.relative": "목표 프로파일 화이트포인트에 비례", "whitepoint.visual_editor": "시각 화이트포인트 편집기", "whitepoint.visual_editor.display_changed.warning": "경고: 디스플레이 구성이 변경되었고, 시각 화이트포인트 편집기가 더이상 디스플레이 프로파일을 정상적으로 복구할 수 없습니다. 편집기를 종료하고 DisplayCAL 을 재실행한 후에 디스플레이 프로파일의 할당을 확인하세요.", "whitepoint.xy": "색도 좌표", "window.title": "DisplayCAL", "windows.version.unsupported": "이 윈도우 버전은 지원하지 않습니다.", "windows_only": "윈도우 전용", "working_dir": "작업 디렉토리:", "*yellow": "Yellow", "*yellow_lab": "Yellow L*a*b*", "*yellow_xyz": "Yellow XYZ", "yes": "네", } DisplayCAL-3.5.0.0/DisplayCAL/lang/zh_cn.json0000644000076500000000000023720313242301041020335 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "林泽帆(Xpesir)", "!language": "简体中文(中国)", "!language_name": "chinese_simplified", "3dlut": "3D LUT", "3dlut.1dlut.videolut.nonlinear": "显示器的显示卡伽玛表 1D LUT 校正并非线性, 但 3D LUT 含有已应用的 1D LUT 校正。 请确保在使用3D LUT 之前已将显示卡伽玛表重置为线性,又或者建立一个未有应用校正的 3D LUT (如用后者的方法,在“选项” 选单中启用“显示进阶选项”及在 3D LUT 设定中停用“应用校正 (vcgt)”以及“检测后建立 3D LUT”,然后建立新的 3D LUT).", "3dlut.bitdepth.input": "3D LUT 输入色彩深度", "3dlut.bitdepth.output": "3D LUT 输出色彩深度", "*3dlut.confirm_relcol_rendering_intent": "Do you want the 3D LUT to use the measured white point as well (3D LUT rendering intent will be set to relative colorimetric)?", "3dlut.content.colorspace": "内容色域", "3dlut.create": "建立 3D LUT...", "3dlut.create_after_profiling": "分析特性后建立 3D LUT", "3dlut.enable": "启用 3D LUT", "3dlut.encoding.input": "输入编码", "3dlut.encoding.output": "输出编码", "3dlut.encoding.output.warning.madvr": "警告:不建议这种输出编码,如未在 madVR 的“设备” → “%s” → “内容”内设定为输出“电视色阶 (16-235)”会引致画面失真 (clipping)。 使用时自行承担风险!", "*3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "*3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "*3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "*3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "*3dlut.encoding.type_C": "TV Rec. 2020 Constant Luminance YCbCr UHD", "*3dlut.encoding.type_T": "TV RGB 16-235 (clip WTW)", "*3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "3dlut.encoding.type_n": "全范围 RGB 0-255", "*3dlut.encoding.type_t": "TV RGB 16-235", "*3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD", "3dlut.format": "3D LUT 文档格式", "*3dlut.format.3dl": "Autodesk / Kodak (.3dl)", "*3dlut.format.ReShade": "ReShade (.png, .fx)", "*3dlut.format.cube": "IRIDAS (.cube)", "3dlut.format.eeColor": "eeColor 处理器 (.txt)", "3dlut.format.icc": "设备连结描述文档 (.icc/.icm)", "*3dlut.format.madVR": "madVR (.3dlut)", "*3dlut.format.madVR.hdr": "Process HDR content", "*3dlut.format.madVR.hdr.confirm": "Note that you need to have profiled the display in HDR mode. If the display doesn't support HDR natively, click “Cancel”.", "*3dlut.format.madVR.hdr_to_sdr": "Convert HDR content to SDR", "*3dlut.format.mga": "Pandora (.mga)", "*3dlut.format.png": "PNG (.png)", "*3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "3dlut.frame.title": "建立 3D LUT", "*3dlut.hdr.rolloff.diffuse_white": "Diffuse white (reference 94.38 cd/m²)", "*3dlut.hdr.system_gamma": "System gamma (reference 1.2)", "3dlut.holder.assign_preset": "指派 3D LUT 到预设方案:", "3dlut.holder.out_of_memory": "%s 的 3D LUT 储存空间不足 (最少需要 %i KB )。 请删除一些3D LUT以释放空间给新的 3D LUT使用。 详情请参阅%s的说明书。", "3dlut.input.colorspace": "原始色域", "3dlut.input.profile": "原始描述文档", "3dlut.install": "安装 3D LUT", "3dlut.install.failure": "3D LUT安装失败 (未知的错误)。", "3dlut.install.success": "3D LUT安装成功!", "3dlut.install.unsupported": "3D LUT安装程序不支持所选取的 3D LUT 格式。", "3dlut.save_as": "储存 3D LUT 为...", "3dlut.settings": "3D LUT设定", "3dlut.size": "3D LUT大小", "3dlut.tab.enable": "启用 3D LUT 分页", "3dlut.use_abstract_profile": "抽象 (“Look”) 描述文档", "*CMP_Digital_Target-3.cie": "CMP Digital Target 3", "*CMP_Digital_Target-4.cie": "CMP Digital Target 4", "*CMYK_IDEAlliance_ControlStrip_2009.ti1": "CMYK IDEAlliance Control Strip 2009", "*CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": "CMYK IDEAlliance ISO 12647-7 Control Wedge 2013", "*CMYK_ISO_12647-7_outer_gamut.ti1": "CMYK ISO 12647-7 outer gamut", "*ColorChecker.cie": "ColorChecker", "*ColorCheckerDC.cie": "ColorChecker DC", "*ColorCheckerPassport.cie": "ColorChecker Passport", "*ColorCheckerSG.cie": "ColorChecker SG", "*FograStrip2.ti1": "Fogra Media Wedge CMYK V2.0", "*FograStrip3.ti1": "Fogra Media Wedge CMYK V3.0", "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008色彩准确度及灰平衡", "ISO_14861_color_accuracy_RGB318.ti1": "ISO 14861:2015色彩准确度及灰平衡", "*QPcard_201.cie": "QPcard 201", "*QPcard_202.cie": "QPcard 202", "*SpyderChecker.cie": "SpyderCHECKR", "Untethered": "非连接式", "[rgb]TRC": "色调响应曲线", "aborted": "...已中止.", "aborting": "正在中止,请等候 (可能需要一段时间)...", "abstract_profile": "抽象描述文档", "active_matrix_display": "动态矩阵显示", "adaptive_mode_unavailable": "自动适应模式仅适用于 CMS 1.1.0 RC3 或更新版本。", "add": "加入...", "advanced": "进阶", "allow_skip_sensor_cal": "允许跳过光谱仪自我校正", "ambient.measure": "检测环境亮度", "ambient.measure.color.unsupported": "%s:无法用此设备测环境光的色温,因为这个设备的环境亮度应器看似只能感应到单色(只有光强度读数)。", "ambient.measure.light_level.missing": "无法检测到亮度读数。", "ambient.set": "你是否还想将环境光强度设定为量度到的数值?", "app.client.connect": "脚本客端 %s:%s 已连线", "app.client.disconnect": "脚本客端 %s:%s 已中断连线", "app.client.ignored": "已拒绝脚本客端 %s:%s: %s 的尝试连接", "app.client.network.disallowed": "已拒绝脚本客端 %s:%s: 的尝试连接 不容许的网络客端", "app.confirm_restore_defaults": "你真的想要放弃变更并还原为预设设定值吗?", "app.detected": "侦测到 %s。", "app.detected.calibration_loading_disabled": "侦测到 %s。已停用校正载入。", "app.detection_lost": "已无法侦测到 %s。", "app.detection_lost.calibration_loading_enabled": "已无法侦测到 %s。 已启用校正载入。", "app.incoming_message": "已收到来自 %s:%s: %s 的脚本请求", "app.incoming_message.invalid": "无效的脚本请求!", "app.listening": "正在设定主机于 %s:%s", "app.otherinstance": "%s 已正在运行。", "app.otherinstance.notified": "已提示正在运行的运作阶段。", "apply": "应用", "apply_black_output_offset": "应用黑位偏移 (100%)", "apply_cal": "应用校正 (vcgt)", "apply_cal.error": "无法应用校正。", "archive.create": "建立压缩档...", "archive.import": "汇入压缩档...", "archive.include_3dluts": "你是否想将 3D LUT 文档包含在压缩档之中(不建议,因为会令压缩档变得很大)?", "argyll.debug.warning1": "请于真正需要除错信息时才使用本选项(例如用来故障排除 ArgyllCMS 的功能)! 一般只在软件开发者用于诊断或解决问题时使用。你是否真的需要启用除错输出?", "argyll.debug.warning2": "请务必记得在正常使用本软件时停用除错输出。", "argyll.dir": "ArgyllCMS 运行目录:", "argyll.dir.invalid": "无法找到 ArgyllCMS 运行文档!\n请选择运行程序的文档夹路径(可能前缀或后缀为 “argyll-” / “-argyll”): %s", "argyll.error.detail": "详细 ArgyllCMS 错误信息:", "argyll.instrument.configuration_files.install": "安装 ArgyllCMS 校色仪描述文档...", "argyll.instrument.configuration_files.install.success": "已成功安装 ArgyllCMS 校色仪描述文档。", "argyll.instrument.configuration_files.uninstall": "卸载 ArgyllCMS 校色仪描述文档...", "argyll.instrument.configuration_files.uninstall.success": "已成功卸载ArgyllCMS校色仪描述文档。", "argyll.instrument.driver.missing": "校色仪的 ArgyllCMS 驱动程序可能尚未安装或未有正确地安装。请检查你的检测设备在 Windows 的设备管理员中是否已出现于 „Argyll LibUSB-1.0A devices“ 之下及在需要时请(重新)安装驱动程序。 请参阅说明文章中的安装步骤。", "argyll.instrument.drivers.install": "安装 ArgyllCMS 校色仪驱动程序...", "argyll.instrument.drivers.install.confirm": "你只需要在使用并非 ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval 或 K-10 的校色仪时,才需要安装 ArgyllCMS 特定的驱动程序。\n\n注意: 如果你已经安装厂商提供驱动程序,在安装完成后,你需要在 Windows 的设备管理员中自已切换成 ArgyllCMS 驱动程序。要这样做的话,右按你的仪器然后选择 “更新驱动程序...”,然后选择 “浏览电脑上的驱动程序软体”,之后选择 “让我从电脑上的设备驱动程序清单中挑选”,最后在清单中选择 Argyll 驱动程序。\n\n你还想继续吗?", "argyll.instrument.drivers.install.failure": "ArgyllCMS 校色仪驱动程序安装失败。", "argyll.instrument.drivers.install.restart": "你需要停用驱动程序数位签章以安装 ArgyllCMS 仪器驱动程序。 要这样做的话,就需要重新启动系统。按一下画面上出现的“疑难排解”,选择 “进阶选项”,“启动选项”最后“重新启动”。 在启动时,选择“停用驱动程序数位签章”。在重新启动后,在选单中再次选择“安装ArgyllCMS校色仪驱动程序...”以安装驱动程序。如果你见不到 “疑难排解”选项,请参考DisplayCAL说明文章中“Windows环境下的仪器驱动程序安装方法”部份 以另一种方法停用驱动程序数位签章。", "argyll.instrument.drivers.uninstall": "卸载 ArgyllCMS 校色仪驱动程序...", "argyll.instrument.drivers.uninstall.confirm": "注意:卸载并不会影响正在使用中仪器的驱动程序,只是将驱动程序从 Windows 驱动程序库中移除。如你想切换回已安装的厂商提供驱动程序,你便需要使用 Windows 设备管理员来手动切换到厂商驱动程序。要这样做的话,右按你的仪器然后选择 “更新驱动程序...”,然后选择 “浏览电脑上的驱动程序软体”,之后选择 “让我从电脑上的设备驱动程序清单中挑选”,最后在清单中选择 Argyll 驱动程序。\n\n你还想继续吗?", "argyll.instrument.drivers.uninstall.failure": "ArgyllCMS 校色仪驱动程序卸载失败。", "argyll.instrument.drivers.uninstall.success": "成功卸载 ArgyllCMS 校色仪驱动程序。", "argyll.util.not_found": "未能找到 ArgyllCMS “%s” 的运行档!", "as_measured": "与检测值相同", "attributes": "参数", "audio.lib": "音效模组:%s", "auth": "身份认证", "auth.failed": "身份认证失败。", "auto": "自动", "auto_optimized": "自动优化", "autostart_remove_old": "移除旧的自动启动项", "*backing_xyz": "Backing XYZ", "backlight": "背光", "bitdepth": "色彩深度", "black": "黑", "black_lab": "黑色 L*a*b*", "black_point": "黑位", "black_point_compensation": "黑位补偿", "black_point_compensation.3dlut.warning": "当建立 3D LUT 时,应该先关闭特性分析设定中的黑位补偿功能,因为会影响色调曲线调整的功能。你是否想关闭黑位补偿?", "black_point_compensation.info": "黑位补偿有效防止黑位被压缩,但会降低色彩转换的准确度。", "black_white": "黑白", "black_xyz": "黑 XYZ", "blacklevel": "黑色亮度", "blue": "蓝", "blue_gamma": "蓝色伽玛", "blue_lab": "蓝色 L*a*b*", "blue_matrix_column": "蓝色矩阵列", "blue_maximum": "蓝色最高", "blue_minimum": "蓝色最低", "blue_tone_response_curve": "蓝色色调响应曲线", "blue_xyz": "蓝色 XYZ", "brightness": "亮度", "browse": "浏览...", "bug_report": "报告错误...", "button.calibrate": "只进行校正", "button.calibrate_and_profile": "校正及特性分析", "button.profile": "只进行特性分析", "cal_extraction_failed": "未能从描述文档中得出校正数据。", "calculated_checksum": "已计算的校验码", "calibrate_instrument": "光谱仪自我校正", "calibration": "校正", "calibration.ambient_viewcond_adjust": "环境光亮度调整", "calibration.ambient_viewcond_adjust.info": "要在计算校正曲线时调整观看条件,请剔选相关选项并输入环境亮度。如你的校色仪支持的话,你亦可以选择检测环境亮度。", "calibration.black_luminance": "黑色亮度", "calibration.black_output_offset": "黑色输出偏移", "calibration.black_point_correction": "黑位修正", "*calibration.black_point_correction_choice": "You may turn off black point correction, to optimize black level and contrast ratio (recommended for most LCD monitors), or you can turn it on to make black the same hue as the whitepoint (recommended for most CRT monitors). Please select your black point correction preference.", "calibration.black_point_rate": "幅度", "calibration.check_all": "检查设定", "calibration.complete": "已完成校正!", "calibration.create_fast_matrix_shaper": "建立矩阵描述文档", "*calibration.create_fast_matrix_shaper_choice": "Do you want to create a fast matrix shaper profile from calibration measurements or just calibrate?", "calibration.do_not_use_video_lut": "不要使用显卡伽玛表来应用校正", "calibration.do_not_use_video_lut.warning": "你是否真的要变更建议的设定?", "calibration.embed": "将校正曲线嵌入到描述文档", "calibration.file": "方案", "calibration.file.invalid": "你所选的为无效的描述文档。", "calibration.file.none": "<无>", "calibration.incomplete": "校正尚未完成。", "calibration.interactive_display_adjustment": "互动显示器调整", "calibration.interactive_display_adjustment.black_level.crt": "按一下“开始检测”然后调校显示器的亮度设定及/或 RGB 调节控制以符合期望的水平。", "calibration.interactive_display_adjustment.black_point.crt": "按一下“开始检测”然后调校显示器的 RGB 调节控制以符合期望的黑位水平。", "calibration.interactive_display_adjustment.check_all": "按一下“开始检测”以检查整体的设定值。", "calibration.interactive_display_adjustment.generic_hint.plural": "当所有指示条都最接近中间所标示的位置时,代表已到达最理想的水平。 ", "calibration.interactive_display_adjustment.generic_hint.singular": "当指示条最接近中间所标示的位置时,代表已到达最理想的水平。", "calibration.interactive_display_adjustment.start": "开始检测", "calibration.interactive_display_adjustment.stop": "停止检测", "calibration.interactive_display_adjustment.white_level.crt": "按一下“开始检测”然后调校显示器的对比度设定及/或 RGB调节控制以符合期望的水平。", "calibration.interactive_display_adjustment.white_level.lcd": "按一下“开始检测”然后调校显示器的背光灯/亮度控制以符合期望的水平。", "calibration.interactive_display_adjustment.white_point": "按一下“开始检测”然后调校显示器的色温及/或 RGB 调节控制以符合期望的白位水平。", "calibration.load": "载入方案...", "calibration.load.handled_by_os": "由作业系统处理校正的载入。", "calibration.load_error": "未能载入校正曲线。", "calibration.load_from_cal": "由校正文档载入校正曲线...", "calibration.load_from_cal_or_profile": "由校正文档或描述文档载入校正曲线...", "calibration.load_from_display_profile": "由目前显示器描述文档载入校正曲线", "calibration.load_from_display_profiles": "由当前的显示器描述文档载入校正", "calibration.load_from_profile": "由描述文档载入校正曲线...", "calibration.load_success": "已成功载入校正曲线。", "calibration.loading": "正由文档载入校正曲线...", "calibration.loading_from_display_profile": "正在载入目前显示器描述文档的校正曲线...", "calibration.luminance": "白色亮度", "calibration.lut_viewer.title": "曲线", "calibration.preserve": "保留校正状态", "calibration.preview": "预览校正", "calibration.quality": "质素", "calibration.quality.high": "高", "calibration.quality.low": "低", "calibration.quality.medium": "中等", "calibration.quality.ultra": "极致", "calibration.quality.verylow": "非常低", "calibration.reset": "重置显示卡的伽玛表", "calibration.reset_error": "无法重置显示卡伽玛表。", "calibration.reset_success": "成功重置显示卡伽玛表。", "calibration.resetting": "正在重置显示卡伽玛表为线性...", "calibration.settings": "校正设定", "calibration.show_actual_lut": "查看显示卡的校正曲线", "calibration.show_lut": "显示曲线", "calibration.skip": "继续分析特性", "calibration.speed": "校正速度", "calibration.speed.high": "快", "calibration.speed.low": "慢", "calibration.speed.medium": "中等", "calibration.speed.veryhigh": "非常快", "calibration.speed.verylow": "非常慢", "calibration.start": "继续校正", "calibration.turn_on_black_point_correction": "开启", "calibration.update": "更新校正", "calibration.update_profile_choice": "你是否还想更新描述文档内现有的校正曲线,还是纯粹只想进行校正?", "calibration.use_linear_instead": "改用线性校正", "calibration.verify": "验证校正结果", "calibration_profiling.complete": "已完成校正和特性分析!", "calibrationloader.description": "为所有已设定的显示器设定ICC描述文档及载入校正曲线", "can_be_used_independently": "可独立使用", "cancel": "取消", "cathode_ray_tube_display": "阴极射线管显示器", "*ccmx.use_four_color_matrix_method": "Minimize xy chromaticity difference", "ccxx.ti1": "用于色度计修正的测色板 ", "centered": "置中", "channel_1_c_xy": "频道1(C) xy", "channel_1_gamma_at_50_input": "频道 1 伽玛于 50% 输入时", "channel_1_is_linear": "频道 1 为线性", "channel_1_maximum": "频道 1 最高", "channel_1_minimum": "频道 1 最低", "channel_1_r_xy": "频道 1(R) xy", "channel_1_unique_values": "频道 1 唯一数值", "channel_2_g_xy": "频道 2(G) xy", "channel_2_gamma_at_50_input": "频道 2 伽玛于 50% 输入时", "channel_2_is_linear": "频道 2 为线性", "channel_2_m_xy": "频道 2 (M) xy", "channel_2_maximum": "频道 2 最高", "channel_2_minimum": "频道 2 最低", "channel_2_unique_values": "频道 2 唯一数值", "channel_3_b_xy": "频道 3 (B) xy", "channel_3_gamma_at_50_input": "频道 3 伽玛于 50% 输入时", "channel_3_is_linear": "频道 3 为线性", "channel_3_maximum": "频道 3 最高", "channel_3_minimum": "频道 3 最低", "channel_3_unique_values": "频道 3 唯一数值", "channel_3_y_xy": "频道 3 (Y) xy", "channel_4_k_xy": "频道 4 (K) xy", "channels": "频道数目", "characterization_device_values": "特性化设备数值", "characterization_measurement_values": "特性化量度数值", "characterization_target": "特性化目标", "checking_lut_access": "正在捡查显示器 %s 能否存取显示卡伽玛表...", "checksum": "校验码", "checksum_ok": "校验码正确", "*chromatic_adaptation_matrix": "Chromatic adaptation matrix", "*chromatic_adaptation_transform": "Chromatic adaptation transform", "*chromaticity_illuminant_relative": "Chromaticity (illuminant-relative)", "*chromecast_limitations_warning": "Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling.", "clear": "清除", "close": "关闭", "color": "彩色", "color_look_up_table": "色彩查找表", "color_model": "色彩模式", "color_space_conversion_profile": "色彩空间转换描述文档", "colorant_order": "Colorant order", "colorants_pcs_relative": "着色 (PCS-相对)", "colorimeter_correction.create": "建立色度计修正...", "*colorimeter_correction.create.details": "Please check the fields below and change them when necessary. The description should also contain important details (e.g. specific display settings, non-default CIE observer or the like).", "colorimeter_correction.create.failure": "修正建立失败。", "colorimeter_correction.create.info": "如需建立色度计修正,你必须先使用光谱仪量度必需的颜色,或假设你需要同样地用色度计建立一个修正矩阵而并光谱修正。\n另外你还可以“浏览...”来选择已有的检测值。.", "colorimeter_correction.create.success": "已成功建立修正档。", "colorimeter_correction.file.none": "无", "colorimeter_correction.import": "由其他显示器描述文档建立软件汇入色度计修正...", "colorimeter_correction.import.choose": "请选择想汇入的色度计修正。", "colorimeter_correction.import.failure": "没有可汇入的色度计修正。", "colorimeter_correction.import.partial_warning": "并非所有色度计修正可以从 %s 汇入。 %i 个,共 %i 个项目需要跳过。", "colorimeter_correction.import.success": "已成功由以下软件汇入色度计修正:\n\n%s", "colorimeter_correction.instrument_mismatch": "所选的色度计修正并不适用于所选的仪器。", "colorimeter_correction.upload": "上传色度计修正...", "colorimeter_correction.upload.confirm": "你是否想上传色度计修正到网上数据库(建议)?任何上传的文档会假定被放置在公共领域,令其可以被自由地使用。", "colorimeter_correction.upload.deny": "该色度计修正可能不被上传。", "colorimeter_correction.upload.exists": "色度计修正已存在于数据库。", "colorimeter_correction.upload.failure": "色度计修正未能输入到数据库。", "colorimeter_correction.upload.success": "色度计修正已成功上传到网上数据库。", "colorimeter_correction.web_check": "捡查网上的色度计修正...", "colorimeter_correction.web_check.choose": "已找到以下用于所选显示器及仪器的色度计修正:", "colorimeter_correction.web_check.failure": "找不到用于所选显示器及仪器的色度计修正。", "*colorimeter_correction.web_check.info": "Please note that all colorimeter corrections have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate. They may or may not improve the absolute accuracy of your colorimeter with your display.", "colorimeter_correction_matrix_file": "修正", "colorimeter_correction_matrix_file.choose": "选择色度计修正...", "colorimetric_intent_image_state": "影像色度状态", "colors_pcs_relative": "色彩 (PCS - 相对)", "colorspace": "色域", "colorspace.show_outline": "显示摘要", "commandline": "指令行:", "commands": "指令", "comparison_profile": "对比的描述文档", "comport_detected": "侦测到仪器/连接埠设定变更。", "compression.gzip": "GZIP压缩", "computer.name": "电脑名称", "connected.to.at": "连线到 %s 在 %s:%s", "connecting.to": "连线到 %s:%s...", "connection.broken": "连线中断", "connection.established": "连线成功", "connection.fail": "连线错误 (%s)", "connection.fail.http": "HTTP 错误%s", "connection.waiting": "正在等待连线于", "continue": "继续", "contrast": "对比", "contribute": "参与", "converting": "转换中", "copyright": "版权", "corrected": "已连接", "create_profile": "使用特性描述数据来建立描述文档...", "create_profile_from_edid": "使用延伸示器识别数据来建立描述文档...", "created": "建立于", "creator": "建立", "current": "目前", "custom": "自订", "cyan": "青色", "d3-e4-s2-g28-m0-b0-f0.ti1": "用于矩阵描述文档的小型测色板", "d3-e4-s3-g52-m3-b0-f0.ti1": "用于矩阵描述文档的扩展测色板", "d3-e4-s4-g52-m4-b0-f0.ti1": "用于 LUT 描述文档的小型测色板", "d3-e4-s5-g52-m5-b0-f0.ti1": "用于 LUT 描述文档的扩展测色板", "d3-e4-s9-g52-m9-b0-f0.ti1": "用于 LUT 描述文档的大型测色板", "d3-e4-s17-g52-m17-b0-f0.ti1": "用于 LUT 描述文档的非常大型测色板", "deactivated": "已关闭", "default": "预设", "default.icc": "预设 (伽玛 2.2)", "default_crt": "预设 CRT", "default_rendering_intent": "预设渲染目的", "delete": "删除", "delta_e_2000_to_blackbody_locus": "ΔE 2000 到黑体场合", "delta_e_2000_to_daylight_locus": "ΔE 2000 到日光场合", "delta_e_to_locus": "ΔE*00 到 %s 场合", "description": "描述", "description_ascii": "描述 (ASCII)", "description_macintosh": "描述 (Macintosh)", "description_unicode": "描述 (Unicode)", "deselect_all": "全部不选取", "detect_displays_and_ports": "侦测显示器和校色仪", "device": "设备", "device.name.placeholder": "<设备名称>", "device_color_components": "设备色彩部件", "device_manager.launch": "开启设备管理员", "device_manufacturer_name": "设备制造商名称", "device_manufacturer_name_ascii": "设备制造商名称 (ASCII)", "device_manufacturer_name_macintosh": "设备制造商名称 (Macintosh)", "device_manufacturer_name_unicode": "设备制造商名称 (Unicode)", "device_model_name": "设备型号名称", "device_model_name_ascii": "设备型号名称 (ASCII)", "device_model_name_macintosh": "设备型号名称 (Macintosh)", "device_model_name_unicode": "设备型号名称 (Unicode)", "device_to_pcs_intent_0": "设备到 PCS:目的 0", "device_to_pcs_intent_1": "设备到 PCS:目的 1", "device_to_pcs_intent_2": "设备到 PCS:目的 2", "devicelink_profile": "DeviceLink 描述文档", "dialog.argyll.notfound.choice": "这台电脑没有安装ArgyllCMS(ArgyllCMS 是 DisplayCAL 正常运行所需要的彩色管理引擎)。你是否需要自动下载或自行浏览以选取其位置?", "dialog.cal_info": "将会使用校正文档 “%s”。 是否继续?", "dialog.confirm_cancel": "你是否真的想取消?", "dialog.confirm_delete": "你是否真的想删除所选的文档?", "dialog.confirm_overwrite": "文档“%s”已存在。 你是否想覆盖它?", "dialog.confirm_uninstall": "你是否真的想删除所选的文档?", "dialog.current_cal_warning": "将会使用当前的校正曲线。 是否继续?", "dialog.do_not_show_again": "不要再显示这个信息", "dialog.enter_password": "请输入你的密码。", "dialog.install_profile": "你是否要安装描述文档 “%s” 并成为显示器 “%s” 的预设描述文档?", "dialog.linear_cal_info": "将会使用线性校正曲线。是否继续?", "dialog.load_cal": "载入设定", "dialog.select_argyll_version": "已找到 %s 版本的 ArgyllCMS。目前所选择的版本为 %s。你是否想使用较新版本?", "dialog.set_argyll_bin": "请选取 ArgyllCMS 运行档所在的目录。", "dialog.set_profile_save_path": "在此建立描述文档 “%s” 的目录:", "dialog.set_testchart": "选择测色板文档文档", "dialog.ti3_no_cal_info": "检测数据不包含校正曲线。你真的要继续吗?", "digital_camera": "数码相机", "digital_cinema_projector": "数码影院投影机", "digital_motion_picture_camera": "数码摄录机", "direction.backward": "PCS → B2A → 设备", "direction.backward.inverted": "PCS ← B2A ← 设备", "direction.forward": "设备 → A2B → PCS", "direction.forward.inverted": "设备 ← A2B ← PCS", "*directory": "Directory", "disconnected.from": "已从 %s:%s 中断连接", "display": "显示器", "display-instrument": "显示器及校色仪", "display.connection.type": "连接方式", "display.manufacturer": "显示器制造商", "display.output": "输出#", "display.primary": "(主要)", "display.properties": "显示器内容", "display.reset.info": "请重置显示器到原厂预设设定,然后将亮度校到你感觉舒服的程度。", "display.settings": "显示器设定", "display.tech": "显示技术", "display_detected": "侦测到显示器的设定有所修改。", "display_device_profile": "显示器描述文档", "display_lut.link": "连结/解除连结显示器及显示卡伽玛表存取", "display_peak_luminance": "显示器最高光亮度", "display_profile.not_detected": "没有侦测到当前用于显示器 “%s” 的描述文档。", "display_short": "显示器 (简称)", "*displayport": "DisplayPort", "displays.identify": "识别显示器", "dlp_screen": "DLP 显示器", "donation_header": "欢迎你的支持!", "donation_message": "如果你想支持 DisplayCAL 和 ArgyllCMS 的开发、技术支持及\n可持续性,请考虑财政上进行资助。因 DisplayCAL 必需依靠 \nArgyllCMS 才可以正常运作的关系,所有捐助将平衡分配给\n两个软件发展项目。\n\n对于一般个人的非商业性的使用,宜作出一次性的资助。\n如您将 DisplayCAL 用于专业用途,每年或每月的定期资助,\n对于这两个软件开发项目的可持续性有很大的帮助。\n\n多谢各位的资助!", "download": "下载中", "*download.fail": "Download failed:", "download.fail.empty_response": "下载失败:%s 的回应为内容空白的文档。", "download.fail.wrong_size": "下载失败: 文档大小并非为预期的 %s 位元组 (已收到 %s 位元组).", "download_install": "下载及安装", "downloading": "下载中", "drift_compensation.blacklevel": "黑色亮度漂移补偿", "drift_compensation.blacklevel.info": "黑色亮度漂移补偿会试图降低在检测设备正在预热时出现的校正黑色校正偏漂移现像而引致的检测值出现偏差所带来影响。 由于此功能会反复地检测黑色色块,会整体增加检测所需的时间。很多色度计都有内置温度补偿功能,因此很多时候都不需要使用黑色亮度漂移补偿,但大部份光谱仪却没有温度补偿的设计。", "drift_compensation.whitelevel": "白色亮度漂移补偿", "drift_compensation.whitelevel.info": "白色亮度漂移补偿会试图降低在显示器正在预热时所出现的亮度变化而引致检测值出现偏差所带来的影响。由于此功能会反复地检测白色色块,会整体增加检测所需的时间。", "dry_run": "空转运行", "dry_run.end": "空转运行完结.", "dry_run.info": "空转运行。检视运作记录以查看指令行。", "*dvi": "DVI", "dye_sublimation_printer": "热升华打印机", "edid.crc32": "EDID CRC32 校验码", "edid.serial": "EDID 序号", "elapsed_time": "已经过时间", "*electrophotographic_printer": "Electrophotographic printer", "*electrostatic_printer": "Electrostatic printer", "enable_argyll_debug": "启用ArgyllCMS除错输出", "enable_spyder2": "启用 Spyder 2 色度计...", "enable_spyder2_failure": "Spyder 2 未能启用。如未安装 Spyder 2 软件请先安装,然后再尝试运行本操作。", "enable_spyder2_success": "Spyder 2 已成功启用", "entries": "项目", "enumerate_ports.auto": "自动侦测校色仪", "enumerating_displays_and_comports": "正在侦测显示器及通信埠...", "environment": "环境", "error": "错误", "error.access_denied.write": "你并没有写入到 %s 的权限", "error.already_exists": "不能使用 “%s” 为名称,因为已存在另一个名称相同的物件。请选择其他名称或另一个路径。", "error.autostart_creation": "在建立登入时载入校正曲线的自动启动项目时失败。", "*error.autostart_remove_old": "The old autostart entry which loads calibration curves on login could not be removed: %s", "*error.autostart_system": "The system-wide autostart entry to load the calibration curves on login could not be created, because the system-wide autostart directory could not be determined.", "*error.autostart_user": "The user-specific autostart entry to load the calibration curves on login could not be created, because the user-specific autostart directory could not be determined.", "error.cal_extraction": "无法从 “%s” 中读取校正。", "error.calibration.file_missing": "校正文档 “%s” 已遗失。", "error.calibration.file_not_created": "未有建立任何校正文档。", "error.copy_failed": "文档 “%s” 未能复制到 “%s”。", "error.deletion": "移动文档到%s时发生错误。某些文档可能尚未移除。", "*error.dir_creation": "The directory “%s” could not be created. Maybe there are access restrictions. Please allow writing access or choose another directory.", "*error.dir_notdir": "The directory “%s” could not be created, because another object of the same name already exists. Please choose another directory.", "error.file.create": "文档“%s”未能建立。", "error.file.open": "文档“%s”不能开启。", "error.file_type_unsupported": "未支持的文档类型。", "error.generic": "发生一个内部错误。\n\n错误码:%s\n错误信息:%s", "*error.luminance.invalid": "The measured peak luminance was invalid. Make sure the instrument sensor is not blocked, and remove any protective cap (if present).", "error.measurement.file_invalid": "检测文档 „%s“为无效的。", "error.measurement.file_missing": "检测文档“%s”已遗失。", "error.measurement.file_not_created": "没有检测文档被建立。", "error.measurement.missing_spectral": "检测文档并不包含光谱数值。", "*error.measurement.one_colorimeter": "Exactly one colorimeter measurement is needed.", "*error.measurement.one_reference": "Exactly one reference measurement is needed.", "error.no_files_extracted_from_archive": "未有文档由“%s”被解压出来。", "error.not_a_session_archive": "压缩档 “%s” 似乎并不是阶段性压缩档。", "error.profile.file_missing": "描述文档 “%s” 已遗失。", "error.profile.file_not_created": "未有建立任何描述文档。", "error.source_dest_same": "来源和目标文档是相同的。", "error.testchart.creation_failed": "测色板文档 “%s” 未能建立。可能有存取限制,或来源文档并不存在。", "error.testchart.invalid": "测色板文档 “%s” 为无效的。", "error.testchart.missing": "测色板文档 “%s” 已遗失。", "error.testchart.missing_fields": "测色板文档 „%s“ 并不包含必要的区块:%s", "error.testchart.read": "测色板文档 “%s” 无法读取。", "error.tmp_creation": "无法建立临时工作目录。", "error.trashcan_unavailable": "%s 并不可用。 并未移除任何文档。", "errors.none_found": "没有发现任何错误。", "estimated_measurement_time": "预算检测时间约 %s 小时 %s 分钟", "*exceptions": "Exceptions...", "executable": "运行档", "export": "汇出...", "extra_args": "设定额外的指令行参数...", "factory_default": "原厂设定", "failure": "...失败!", "*file.hash.malformed": "The integrity of %s cannot be verified because the checksum file is malformed.", "*file.hash.missing": "The integrity of %s cannot be verified because it doesn't have an entry in the checksum file.", "*file.hash.verification.fail": "Checksum verification failed for %s:\n\nExpected %s\nActual %s", "file.invalid": "无的效的文档。", "file.missing": "文档“%s”并不存在", "file.notfile": "“%s”并不是一个文档。", "file.select": "选择文档", "filename": "文档名称", "filename.upload": "上传文档名称", "filetype.7z": "7-Zip文档", "filetype.any": "所有文档类型", "filetype.cal": "校正文档 (*.cal)", "filetype.cal_icc": "校正及描述文档 (*.cal;*.icc;*.icm)", "*filetype.ccmx": "Correction matrices/Calibration spectral samples (*.ccmx;*.ccss)", "filetype.html": "HTML 文档(*.html;*.htm)", "filetype.icc": "色彩描述文档 (*.icc;*.icm)", "filetype.icc_mpp": "描述文档 (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "测色板文档 (*.icc;*.icm;*.ti1;*.ti3)", "filetype.icc_ti3": "检测文档 (*.icc;*.icm;*.ti3)", "filetype.log": "运作记录文档 (*.log)", "filetype.png": "可携式网络图形 (*.png)", "filetype.tgz": "已压缩 TAR 归档文档", "filetype.ti1": "测色板文档 (*.ti1)", "filetype.ti1_ti3_txt": "测色板文档 (*.ti1), 检测文档 (*.ti3;*.txt)", "filetype.ti3": "检测文档 (*.ti3)", "filetype.tif": "标签图档格式 (*.tif)", "*filetype.txt": "DeviceCorrections.txt", "filetype.vrml": "VRML 文档 (*.wrl)", "filetype.x3d": "X3D 文档 (*.x3d)", "filetype.zip": "ZIP 文档", "film_scanner": "菲林扫描器", "film_writer": "菲林写入器", "finish": "完成", "flare": "Flare", "flexography": "柔印", "*focal_plane_colorimetry_estimates": "Focal plane colorimetry estimates", "*forced": "forced", "format.select": "请选择你喜欢的格式。", "*fullscreen.message": "Fullscreen mode activated.\nPress ESC to leave fullscreen.", "*fullscreen.osx.warning": "If you enter fullscreen mode using the zoom button in the window title bar, please press CMD + TAB to switch back to normal mode after the window has been closed. Alternatively, you can go fullscreen by double-clicking the title bar or holding the OPTION key while clicking the zoom button.", "gamap.default_intent": "预设渲染目的", "gamap.intents.a": "绝对色彩浓度", "gamap.intents.aa": "绝对观感", "gamap.intents.aw": "绝对色彩浓度并按比例修正白位", "*gamap.intents.la": "Luminance matched appearance", "*gamap.intents.lp": "Luminance preserving perceptual appearance", "gamap.intents.ms": "保留饱和度", "gamap.intents.p": "感知", "gamap.intents.pa": "感知观感", "gamap.intents.r": "绝对色彩浓度", "gamap.intents.s": "饱和度", "gamap.out_viewcond": "目标观看条件", "*gamap.perceptual": "Gamut mapping for perceptual intent", "gamap.profile": "原始描述文档", "*gamap.saturation": "Gamut mapping for saturation intent", "gamap.src_viewcond": "原始观看条件", "*gamap.viewconds.cx": "Cut sheet transparencies on a viewing box", "gamap.viewconds.jd": "投影机于黑暗的环境", "gamap.viewconds.jm": "投影机于阴暗的环境", "gamap.viewconds.mb": "显示器于明亮的工作环境", "gamap.viewconds.md": "显示器于较暗的工作环境", "gamap.viewconds.mt": "显示器于一般的工作环境", "gamap.viewconds.ob": "原始场景 - 明亮的户外", "gamap.viewconds.pc": "严谨印刷评价环境 (ISO-3664 P1)", "gamap.viewconds.pcd": "相片 CD - 户外原始场景", "gamap.viewconds.pe": "印刷评价环境 (CIE 116-1995)", "gamap.viewconds.pp": "实用反光印刷 (ISO-3664 P2)", "gamap.viewconds.tv": "电视/电影工作室", "gamapframe.title": "进阶色域映射选项", "gamut": "色域", "gamut.coverage": "色域覆蓋", "gamut.view.create": "生成色域图...", "gamut.volume": "色域容积", "gamut_mapping.ciecam02": "CIECAM02 色域映射", "gamut_mapping.mode": "色域映射模式", "gamut_mapping.mode.b2a": "PCS-至-设备", "gamut_mapping.mode.inverse_a2b": "反向 设备-至-PCS", "*gamut_plot.tooltip": "Click and drag the mouse inside the plot to move the viewport, or zoom with the mouse wheel and +/- keys. Double-click resets the viewport.", "*generic_name_value_data": "Generic name-value data", "geometry": "几何", "*glossy": "Glossy", "*go_to": "Go to %s", "go_to_website": "浏览网站", "gravure": "Gravure", "gray_tone_response_curve": "灰色调响应曲线", "grayscale": "灰阶", "green": "绿", "green_gamma": "绿色伽玛", "green_lab": "绿色 L*a*b*", "green_matrix_column": "绿色矩阵列", "green_maximum": "绿色最高", "green_minimum": "绿色最低", "green_tone_response_curve": "绿色色调响应曲线", "*green_xyz": "Green XYZ", "*grid_steps": "Grid Steps", "*hdmi": "HDMI", "*hdr_maxcll": "Maximum content light level", "*hdr_mincll": "Minimum content light level", "header": "采用 ArgyllCMS 技术的显示器颜色校正及特性化工具", "help_support": "帮助与支持...", "host.invalid.lookup_failed": "无效的主机 (地址查询失败)", "hue": "色相", "icc_absolute_colorimetric": "ICC 绝对色度", "icc_version": "ICC 版本", "if_available": "如有", "*illuminant": "Illuminant", "*illuminant_relative_cct": "Illuminant-relative CCT", "*illuminant_relative_lab": "Illuminant-relative L*a*b*", "*illuminant_relative_xyz": "Illuminant-relative XYZ", "illuminant_xyz": "光源 XYZ", "illumination": "照明方式", "*in": "In", "*info.3dlut_settings": "A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction.\n\nCreating several (additional) 3D LUTs from an existing profile\nWith the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox.\n\nChoosing the right source colorspace and tone response curve\nFor 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%.\n\n“Absolute” vs. “relative” gamma\nTo accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly.\n“Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero).\n“Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve.\n\nRendering intent\nIf you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required).", "info.calibration_settings": "校正是以互动地调校显示器的方法以达到所选择的白位及/或亮度,以及选择性地建立1D LUT 校正曲线 (LUT = 查找表) \n以符合所选的色彩反应曲线及确保灰阶的平衡。 注意校正时你只要调校显示器及跳过 1D LUT曲线的建立,你需要设定\n色调反应曲线为“与检测值相同”。 1D LUT 校正并不可以 用于全显示器色彩校正,你需要建立 ICC 设备描述文档3D LUT\n以及在支持的软件上使用它们以达到目的。 虽然 1D LUT 校正会完整了建立特性描述和 3D LUT 校正。", "info.display_instrument": "如你的显示器为OLED等离子显示器或拥有因应画面内容而改变亮度的技术,请启用白色亮度漂移补偿.\n\n如你的校色仪为光谱仪并在接触模式下用于黑阶稳定的显示器, 您可能需要启用校色仪黑位偏移补偿。\n\n如你的校色仪为色度计,你应该使用适用于你的显示器或显示器技术类型的修正。 请留意有些校色仪 (ColorHug, \nColorHug2, K-10, Spyder4/5) 它们的检测模式可能已经内置相关的修正。", "info.display_instrument.warmup": "你应该在检测前先让你的显示器预热最少30分钟。 如果你使用校色仪的接触模式,最好在预热期间将校色仪放\n在显示器上。", "info.mr_settings": "你可以透过内含关于已检测色块其色彩错误之详尽统计数据的检测报告,以验证 ICC 描述文档或 3D LUT 的准确度 。\n\n当验证 3D LUT 时,请确保使用与建立 3D LUT 时的相同设定值。", "*info.profile_settings": "Profiling is the process of characterizing the display and recording its response in a ICC device profile. The ICC device profile can be used by applications that support ICC color management for full display color correction, and/or it can be used to create a 3D LUT (LUT = Look Up Table) which serves the same purpose for applications that support 3D LUTs.\n\nThe amount of patches measured influences the attainable accuracy of the resulting profile. For a reasonable quality 3x3 matrix and curves based profile, a few dozen patches can be enough if the display has good additive color mixing properties and linearity. Some professional displays fall into that category. If the highest possible accuracy is desired, a LUT-based profile from around several hundred up to several thousand patches is recommended. The “Auto-optimized” testchart setting automatically takes into account the non-linearities and actual response of the display, and should be used for best quality results. With this, you can adjust a slider to choose a compromise between resulting profile accuracy and measurement as well as computation time.", "*infoframe.default_text": "", "infoframe.title": "运作记录", "infoframe.toggle": "显示运作记录视窗", "initial": "初步", "initializing_gui": "正在初始化图形界面...", "ink_jet_printer": "喷墨打印机", "input_device_profile": "输入置描述文档", "input_table": "输入表", "install_display_profile": "安装显示器描述文档...", "install_local_system": "安装给整个系统", "install_user": "只安装给目前的使用者", "instrument": "校色仪", "instrument.calibrate": "将校色仪放置在深色、磨沙的表面,又或者放在其附带的校正板上,然后按确定以校正校色仪。", "instrument.calibrate.colormunki": "设定 ColorMunki 感度器到校正位置然后按 OK 以校正校色仪。", "instrument.calibrate.reflective": "将仪器放置在它的序号%s反光白色参考表面上然后按 OK 以校正仪器。", "instrument.calibrating": "正在校正校色仪...", "instrument.connect": "请现在连接你的校色仪。", "instrument.initializing": "正在设定校色仪,请等候...", "instrument.measure_ambient": "假如你的仪器必须装上特制的盖以检测环境光的话,请将其装上。要检测环境光,请将仪器向上摆放,并且置于显示器旁。 又或者如果你要检测对色灯箱,将无色偏灰卡放置在灯箱中然后将仪器指向它。 进一步关于如何量度环境光的方法可能在仪器的说明文档中可以找到。按 OK 进行量度。", "instrument.place_on_screen": "请将校色仪放置在检测视窗上并按确认继续。", "instrument.place_on_screen.madvr": "(%i) 请将你的 %s 放置在检测区域上", "instrument.reposition_sensor": "因校色仪的感应器放置在不正确的位置而令检测失败。请修正感应器放置的位置,然后按确认继续。", "internal": "内置", "invert_selection": "反向选择", "is_embedded": "内嵌的", "is_illuminant": "发光的", "is_linear": "线性的", "laptop.icc": "笔记本电脑 (伽玛2.2)", "*libXss.so": "X11 screen saver extension", "library.not_found.warning": "未能找到程序库“%s” (%s)。请在继续之前确认已经安装。", "license": "许可协议", "license_info": "采用GPL许可协议", "linear": "线性", "*link.address.copy": "Copy link address", "log.autoshow": "自动显示运作记录", "luminance": "亮度", "lut_access": "显示卡伽玛转换表存取", "madhcnet.outdated": "版本%s于 %s上找到的已安装版本已非常陈旧。 请将madVR更新到最新版本 (最好为 %i.%i.%i.%i 或以上).", "madtpg.launch.failure": "找不到 madTPG 或未能启动。", "madvr.not_found": "在注册表中未能找到madVR DirectShow 过滤器。请确认已安装。", "madvr.outdated": "现正使用的 madVR 版本已非常陈旧。 请更新到最新版本 (最好为 %i.%i.%i.%i 或以上).", "*madvr.wrong_levels_detected": "The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235).", "magenta": "洋红", "make_and_model": "制造商和型号", "manufacturer": "制造商", "*mastering_display_black_luminance": "Mastering display black level", "*mastering_display_peak_luminance": "Mastering display peak luminance", "matrix": "Matrix", "matte": "磨砂", "max": "最大", "maximal": "最大化", "measure": "检测", "measure.darken_background": "黑色背景", "measure.darken_background.warning": "注意:如已选取 „黑色背景“,它会覆蓋整个画面以及你将不能见到显示器调校视窗!\n如果你是使用多显示器,在开始检测前请将显示器调校视窗移到另一个显示器中,或使用\n键盘(要中止检测,按Q键。如检测已正在运行中,等候一会,然后再按多一次 Q 键。)。", "measure.override_display_settle_time_mult": "强制设定等候显示稳定时间倍率", "measure.override_min_display_update_delay_ms": "强制设定最低显示更新延迟", "measure.testchart": "检测测色板", "measureframe.center": "中央", "*measureframe.info": "Move the measurement window to the desired screen position and resize if needed. Approximately the whole window area will be used to display measurement patches, the circle is just there as a guide to help you place your measurement device.\nPlace the measurement device on the window and click on „Start measurement“. To cancel and return to the main window, close the measurement window.", "measureframe.measurebutton": "开始检测", "measureframe.title": "检测范围", "measureframe.zoomin": "放大", "measureframe.zoommax": "最大化/还原", "measureframe.zoomnormal": "正常大小", "measureframe.zoomout": "缩小", "measurement.play_sound": "在连续检测时作出声音反馈", "measurement.untethered": "非连接式检测", "measurement_file.check_sanity": "检查检测文档...", "measurement_file.check_sanity.auto": "自动检查检测文档", "measurement_file.check_sanity.auto.warning": "请注意,自动检查检测文档为实验情质的功能。使用时后果自负。", "measurement_file.choose": "请选取检测文档", "measurement_file.choose.colorimeter": "请选择色度计检测文档", "measurement_file.choose.reference": "请选择参考检测文档", "measurement_mode": "模式", "measurement_mode.adaptive": "适应", "measurement_mode.dlp": "DLP", "measurement_mode.factory": "原厂校正", "measurement_mode.generic": "一般", "*measurement_mode.highres": "HiRes", "measurement_mode.lcd": "LCD (一般)", "measurement_mode.lcd.ccfl": "LCD (冷色光管)", "measurement_mode.lcd.ccfl.2": "LCD (冷色光管类型 2)", "measurement_mode.lcd.oled": "LCD (OLED)", "measurement_mode.lcd.white_led": "LCD (白光 LED)", "measurement_mode.lcd.wide_gamut.ccfl": "广色域 LCD (CCFL)", "measurement_mode.lcd.wide_gamut.rgb_led": "广色域 LCD (RGB LED)", "measurement_mode.raw": "Raw", "measurement_mode.refresh": "更新 (一般)", "measurement_report": "检测报告...", "measurement_report.update": "更新检测报告...", "measurement_report_choose_chart": "请选择测色板来检测。", "measurement_report_choose_chart_or_reference": "请选择测色板或参考。", "measurement_report_choose_profile": "请选择想验证的描述文档", "measurement_type": "检测类型", "measurements.complete": "已完成检测!你是否想打开储存检测文档的文档夹?", "measuring.characterization": "正在检测用于特征化的色板...", "media_black_point": "媒体黑位", "media_relative_colorimetric": "媒体相对色度", "media_white_point": "媒体白位", "menu.about": "关于...", "menu.file": "文档", "menu.help": "?", "menu.language": "语言", "menu.options": "选项", "menu.tools": "工具", "menuitem.quit": "离开", "menuitem.set_argyll_bin": "设定 ArgyllCMS 运行目录...", "metadata": "数据描述信息", "*method": "Method", "min": "最小", "minimal": "缩小", "model": "型号", "motion_picture_film_scanner": "影片菲林扫描器", "mswin.open_display_settings": "开启 Windows 显示器设定...", "named_color_profile": "具名称的色彩描述文档", "named_colors": "具名色彩", "native": "原生", "negative": "不是", "no": "否", "no_settings": "文档没有内含设定。", "none": "没有", "not_applicable": "无法提供", "not_connected": "尚未连接", "not_found": "无法找到“%s”。", "not_now": "并非现在", "number_of_entries": "项目数量", "number_of_entries_per_channel": "每个频道的项目数量", "observer": "观察者", "*observer.1931_2": "CIE 1931 2°", "*observer.1955_2": "Stiles & Birch 1955 2°", "*observer.1964_10": "CIE 1964 10°", "*observer.1964_10c": "CIE 1964 10° / 1931 2° hybrid", "*observer.1978_2": "Judd & Voss 1978 2°", "*observer.2012_2": "CIE 2012 2°", "*observer.2012_10": "CIE 2012 10°", "*observer.shaw": "Shaw & Fairchild 1997 2°", "oem.import.auto": "如你的色度计附带适用于 Windows 的光碟,请现在将它插入(中止任何可能出现的自动安装程序)。\n\n如你没有光碟且无法在其他地方找到必须的文档,它们将会从互联络下载到你的电脑。", "oem.import.auto.download_selection": "已经基于侦测到的仪器预先选取了一些选项。请选取要下载的那些文档。", "oem.import.auto_windows": "如果已安装好你的色度计的原厂软件,大部份情况下都会自动找到所需的文档。", "office_web.icc": "办公室及互联网 (D65,伽玛2.2)", "offset": "偏移", "*offset_lithography": "Offset lithography", "ok": "确认", "or": "或", "*osd": "OSD", "other": "其他", "*out": "Out", "out_of_gamut_tag": "色域以外标签", "output.profile": "目标描述文档", "output_device_profile": "输出设备描述文档", "*output_levels": "Output levels", "output_offset": "输出偏移", "output_table": "输出表", "overwrite": "覆盖", "panel.surface": "显示器表面", "panel.type": "显示器类型", "passive_matrix_display": "被动矩阵式显示器", "patch.layout.select": "请选择色块布局:", "patches": "色块", "*patterngenerator.prisma.specify_host": "Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234", "patterngenerator.sync_lost": "与图形生成器失去同步.", "pause": "暂停", "pcs_illuminant_xyz": "PCS 光源 XYZ", "pcs_relative_cct": "PCS-相对 CCT", "pcs_relative_lab": "PCS-相对 L*a*b*", "pcs_relative_xyz": "PCS-相对 XYZ", "pcs_to_device_intent_0": "PCS 到设备:目的 0", "pcs_to_device_intent_1": "PCS 到设备:目的 1", "pcs_to_device_intent_2": "PCS 到设备:目的 2", "perceptual": "感知", "photo.icc": "相片 (D50,伽玛2.2)", "*photo_imagesetter": "Photo imagesetter", "photographic_paper_printer": "相纸印刷机", "platform": "平台", "please_wait": "请等候...", "port.invalid": "无效连接埠:%s", "*positive": "Positive", "preferred_cmm": "偏向CMM", "prepress.icc": "印前作业 (D50, 130 cd/m², L*)", "preset": "预设方案", "preview": "预览", "profile": "描述文档", "profile.advanced_gamap": "进阶...", "profile.b2a.hires": "增强色度 PCS-至-设备转换表的有效精确度", "profile.b2a.lowres.warning": "这个描述文档似乎缺少了高质素的 PCS-到-设备转换表,这对于正常运作非常重要。你是否想现在生成高质素的换算表?这可能需要数分钟。", "profile.b2a.smooth": "平滑化", "profile.choose": "请选择描述文档。", "profile.confirm_regeneration": "你是否想重新生成描述文档?", "profile.current": "目前的描述文档", "profile.do_not_install": "不要安装描述文档", "profile.iccv4.unsupported": "不支持版本 4 的 ICC 描述文档。", "profile.import.success": "描述文档已经汇入。你需要自行指定及在“彩色”系统设定下将其启用。", "profile.info": "描述文档信息", "profile.info.show": "显示描述文档信息", "profile.install": "安装描述文档", "profile.install.error": "描述文档未能安装/启用。", "profile.install.success": "描述文档已成功安装及启用。", "profile.install.warning": "已完成安装描述文档,但可能出现了问题。", "profile.install_local_system": "安装描述文档为系统预设", "profile.install_network": "于整个网络安装设定", "profile.install_user": "只于目前使用者安装描述文档", "profile.invalid": "无效的描述文档。", "profile.load_error": "未能载入显示器描述文档。", "profile.load_on_login": "登入时载入描述文档", "profile.load_on_login.handled_by_os": "让作业系统处理和载入显示器校正(低质素)", "profile.name": "描述文档名称", "*profile.name.placeholders": "You may use the following placeholders in the profile name:\n\n%a Abbreviated weekday name\n%A Full weekday name\n%b Abbreviated month name\n%B Full month name\n%d Day of the month\n%H Hour (24-hour clock)\n%I Hour (12-hour clock)\n%j Day of the year\n%m Month\n%M Minute\n%p AM/PM\n%S Second\n%U Week (Sunday as first day of the week)\n%w Weekday (sunday is 0)\n%W Week (Monday as first day of the week)\n%y Year without century\n%Y Year with century", "profile.no_embedded_ti3": "该描述文档不包含 Argyll 兼容的检测数据。", "profile.no_vcgt": "该描述文档不包含校正曲线。", "profile.only_named_color": "只可使用“具名颜色”类型的描述文档。", "profile.quality": "描述文档品质", "profile.quality.b2a.low": "低质素PCS-到-设备转换表", "profile.quality.b2a.low.info": "如描述文档将只会用与反向设备至 PCS 色域映射,便选取这个选项以建立设备连结或 3D LUT", "profile.required_tags_missing": "描述文档缺少必要的的标记:%s", "profile.self_check": "描述文档自我检查 ΔE*76", "profile.self_check.avg": "平均", "profile.self_check.max": "最大", "*profile.self_check.rms": "RMS", "profile.set_save_path": "选择储存位置...", "profile.settings": "特性分析设定", "profile.share": "上传描述文档...", "profile.share.avg_dE_too_high": "这个描述文档所得的 delta E 数值过高 (实际 = %s,门槛 = %s)。", "*profile.share.b2a_resolution_too_low": "The resolution of the profile's PCS to device tables is too low.", "*profile.share.enter_info": "You may share your profile with other users via the OpenSUSE “ICC Profile Taxi” service.\n\nPlease provide a meaningful description and enter display device properties below. Read display device settings from your display device's OSD and only enter settings applicable to your display device which have changed from defaults.\nExample: For most display devices, these are the name of the chosen preset, brightness, contrast, color temperature and/or whitepoint RGB gains, as well as gamma. On laptops and notebooks, usually only the brightness. If you have changed additional settings while calibrating your display device, enter them too if possible.", "profile.share.meta_missing": "该描述文档不包含必需的数据描述信息。", "profile.share.success": "描述文档已成功上传。", "*profile.tags.A2B0.shaper_curves.input": "A2B0 input shaper curves", "*profile.tags.A2B0.shaper_curves.output": "A2B0 output shaper curves", "*profile.tags.A2B1.shaper_curves.input": "A2B1 input shaper curves", "*profile.tags.A2B1.shaper_curves.output": "A2B1 output shaper curves", "*profile.tags.A2B2.shaper_curves.input": "A2B2 input shaper curves", "*profile.tags.A2B2.shaper_curves.output": "A2B2 output shaper curves", "*profile.tags.B2A0.shaper_curves.input": "B2A0 input shaper curves", "*profile.tags.B2A0.shaper_curves.output": "B2A0 output shaper curves", "*profile.tags.B2A1.shaper_curves.input": "B2A1 input shaper curves", "*profile.tags.B2A1.shaper_curves.output": "B2A1 output shaper curves", "*profile.tags.B2A2.shaper_curves.input": "B2A2 input shaper curves", "*profile.tags.B2A2.shaper_curves.output": "B2A2 output shaper curves", "profile.testchart_recommendation": "如想得到较高品质的描述文档,就建议使用较多样本数量的测色板,但检测会需要用较长的时间。 你是否想使用建议的测色板?", "profile.type": "描述文档类型", "profile.type.gamma_matrix": "伽玛 + 矩阵", "*profile.type.lut.lab": "L*a*b* LUT", "*profile.type.lut.xyz": "XYZ LUT", "profile.type.lut_matrix.xyz": "XYZ LUT+矩阵", "profile.type.lut_rg_swapped_matrix.xyz": "XYZ LUT + 互换的矩阵", "profile.type.shaper_matrix": "曲线 + 矩阵", "profile.type.single_gamma_matrix": "单一伽玛+矩阵", "profile.type.single_shaper_matrix": "单一曲线+矩阵", "profile.unsupported": "未支持的描述文档类型 (%s) 及 / 或色域 (%s).", "profile.update": "更新定档", "profile_associations": "描述文档关联...", "profile_associations.changing_system_defaults.warning": "你现在正在变更系统预设值。", "profile_associations.use_my_settings": "在这个显示器使用我的设定值。", "profile_class": "描述文档等级", "profile_connection_space_pcs": "描述文档连接空间 (PCS)", "profile_loader": "描述文档载入工具", "profile_loader.disable": "停用描述文档载入工具", "profile_loader.exceptions.known_app.error": "描述文档载入工具会在 %s 运行时自动停用。你不能强行阻止这种行为。", "profile_loader.exit_warning": "你是否真的要关闭描述文档载入工具?校正将不会于变更显示器设定时重新载入!", "profile_loader.fix_profile_associations": "自动修正描述文档关联", "profile_loader.fix_profile_associations_warning": "只要描述文档载入工具正在运作,它就会于变更显示设定时处理好描述文档关联。\n\n在你继续之前,你要确保以上的描述文档关联为正确的。如果不是,请跟从以下步骤:\n\n1. 开启 Windows 显示器设定。\n2. 启用所有已连接的显示器 (延伸桌面)。\n3. 于 Windows 控制台中开启 Windows 彩色管理设定。\n4. 确认每个显示器已指定正确的描述文档。然后关闭色彩管理设定。\n5. 在 Windows 显示设定,回复到之前的显示器设定。\n6. 现在你可以启用“自动修正搭述档关联”。", "profile_loader.info": "校正状态在今日已 (重新) 应用了 %i 次。\n右按图示以开启选单。", "profiling": "特性分析", "profiling.complete": "完成特性分析!", "profiling.incomplete": "特性分析尚未完成。", "projection_television": "投影式电视", "projector": "投影机", "projector_mode_unavailable": "只有 ArgyllCMS 1.1.0 Beta 或更新版本才可以使用投影模式。", "*quality.ultra.warning": "Ultra quality should almost never be used, except to prove that it should almost never be used (long processing time!). Maybe choose high or medium quality instead.", "readme": "帮助", "ready": "准备就绪。", "red": "红", "red_gamma": "红色伽玛", "red_lab": "红色 L*a*b*", "red_matrix_column": "红色矩阵列", "red_maximum": "红色最大", "red_minimum": "红色最小", "red_tone_response_curve": "红色色调响应曲线", "red_xyz": "红色 XYZ", "reference": "参考", "*reflection_hardcopy_original_colorimetry": "Reflection hardcopy original colorimetry", "*reflection_print_output_colorimetry": "Reflection print output colorimetry", "reflective": "反光", "reflective_scanner": "反射式扫描器", "remaining_time": "剩余时间 (ca.)", "remove": "移除", "rendering_intent": "渲染目的", "report": "报告", "report.calibrated": "已校正显示器报告", "report.uncalibrated": "未校正显示器报告", "report.uniformity": "检测显示器均匀度...", "reset": "重设", "resources.notfound.error": "严重错误: 无法找到一个必需的文档:", "resources.notfound.warning": "警告: 无法找到某些必需的文档:", "response.invalid": "来自%s: %s的无效回应", "response.invalid.missing_key": "来自 %s 的无效回应:缺少机码“%s”:%s", "response.invalid.value": "来自%s的无效回应: 机码的数值 “%s” 并不符合预期的数值 “%s”:%s", "restore_defaults": "还原到预设值", "rgb.trc": "RGB 传递函数", "rgb.trc.averaged": "平均 RGB 传递函数", "sRGB.icc": "sRGB", "saturation": "饱和度", "save": "储存", "save_as": "储存到...", "*scene_appearance_estimates": "Scene appearance estimates", "*scene_colorimetry_estimates": "Scene colorimetry estimates", "scripting-client": "DisplayCAL 脚本客端", "*scripting-client.cmdhelptext": "Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application.", "scripting-client.detected-hosts": "检测到脚本主机:", "select_all": "选择全部", "set_as_default": "设定为预设", "setting.keep_current": "保留当前设定", "settings.additional": "额外设定", "settings.basic": "基本设定", "settings.new": "<目前>", "settings_loaded": "已经载入校正曲线及以下的校正设定:%s。其他的校正选项已经还原到预设及特性分析设定并未修改。", "settings_loaded.cal": "描述文档只内含校正设定。其他选项并未修改。并没有校正曲线被载入。", "settings_loaded.cal_and_lut": "描述文档只内含校正设定。其他选项并未修改及已经载入校正曲线。", "settings_loaded.cal_and_profile": "已经载入设定值。找不到校正曲线。", "settings_loaded.profile": "描述文档只内含特性分析设定。其他选项并未修改。找不到校正曲线。", "settings_loaded.profile_and_lut": "描述文档只内含特性分析设定。 其他选项并未修改及已经载入校正曲线。", "show_advanced_options": "显示进阶选项", "*show_notifications": "Show notifications", "silkscreen": "丝印", "simulation_profile": "模拟描述文档", "size": "大小", "skip_legacy_serial_ports": "跳过旧式串列埠", "softproof.icc": "显示器校样 (5800K, 160 cd/m², L*)", "spectral": "色谱", "*ssl.certificate_verify_failed": "The remote certificate could not be verified.", "*ssl.certificate_verify_failed.root_ca_missing": "The remote certificate could not be verified because no suitable root certificates were found on the local system.", "*ssl.handshake_failure": "Handshake failure. A secure connection could not be established.", "startup": "正在启动...", "startup_sound.enable": "启动声音", "*success": "...ok.", "surround_xyz": "包围 XYZ", "synthicc.create": "建立合成的 ICC 描述文档...", "target": "目标", "tc.3d": "建立诊断用的 3D 文档", "*tc.I": "Perceptual space body centered cubic grid", "*tc.Q": "Perceptual space filling quasi-random", "*tc.R": "Perceptual space random", "tc.adaption": "适应", "tc.algo": "分布", "tc.angle": "角度", "tc.black": "黑色块", "tc.dark_emphasis": "加强深色区域", "tc.fullspread": "反复的色块", "tc.gray": "中性色块", "tc.i": "设备空间主体置于立方网格中央", "tc.limit.sphere": "限制样本为球体", "tc.limit.sphere_radius": "半径", "tc.multidim": "多维", "tc.multidim.patches": "色阶 = %s 色块 (%s 中性)", "tc.neutral_axis_emphasis": "强调中性主轴", "tc.ofp": "优化最远位置取样", "tc.patch": "色块", "tc.patches.selected": "已选取", "tc.patches.total": "色调色块", "tc.precond": "Preconditioning 描述文档", "tc.precond.notset": "请选择 preconditioning 描述文档", "tc.preview.create": "正在建立预览,请等候...", "*tc.q": "Device space filling quasi-random", "*tc.r": "Device space random", "tc.single": "单一频道色块", "tc.single.perchannel": "每条频道", "*tc.t": "Incremental far point sampling", "tc.vrml.black_offset": "RGB 黑色亮度偏移 (L*)", "tc.vrml.use_D50": "中性 RGB 白色", "tc.white": "白色块", "technology": "技术", "tempdir_should_still_contain_files": "已建立的文档应该还在暂存目录“%s”。", "testchart.add_saturation_sweeps": "加入饱和度扫描", "testchart.add_ti3_patches": "加入参考色块...", "testchart.auto_optimize.untethered.unsupported": "非连接式的虚拟显示器并不支持测色板自动优化。", "testchart.change_patch_order": "改变色块次序", "testchart.confirm_select": "文档已储存。 你是否想选择这个测色板?", "testchart.create": "建立测色板", "testchart.discard": "舍弃", "testchart.dont_select": "不要选择", "testchart.edit": "编辑测色板...", "testchart.export.repeat_patch": "重复每个色块:", "testchart.file": "测色板", "testchart.info": "已选择测色板中的色块数目", "*testchart.interleave": "Interleave", "*testchart.maximize_RGB_difference": "Maximize RGB difference", "*testchart.maximize_lightness_difference": "Maximize lightness difference", "*testchart.maximize_rec709_luma_difference": "Maximize luma difference", "*testchart.optimize_display_response_delay": "Minimize display response delay", "*testchart.patch_sequence": "Patch sequence", "testchart.patches_amount": "色块数目", "testchart.read": "正在读取测色板...", "testchart.save_or_discard": "尚未储存测色板。", "testchart.select": "选择", "testchart.separate_fixed_points": "请选择在个别色阶中加入的色块。", "testchart.set": "选择测色板文档...", "*testchart.shift_interleave": "Shift & interleave", "testchart.sort_RGB_blue_to_top": "将 RGB 蓝色排列到最顶", "testchart.sort_RGB_cyan_to_top": "将 RGB 青色排列到最顶", "testchart.sort_RGB_gray_to_top": "将 RGB 灰色排列到最顶", "testchart.sort_RGB_green_to_top": "将 RGB 绿色排列到最顶", "testchart.sort_RGB_magenta_to_top": "将 RGB 洋红色排列到最顶", "testchart.sort_RGB_red_to_top": "将 RGB 红色排列到最顶", "testchart.sort_RGB_white_to_top": "将 RGB 白色排列到最顶", "testchart.sort_RGB_yellow_to_top": "将 RGB 黄色排列到最顶", "testchart.sort_by_BGR": "以 BGR 排序", "testchart.sort_by_HSI": "以 HSI 排序", "testchart.sort_by_HSL": "以 HSL 排序", "testchart.sort_by_HSV": "以 HSV 排序", "testchart.sort_by_L": "以 L* 排序", "testchart.sort_by_RGB": "以 RGB 排序", "testchart.sort_by_RGB_sum": "以 RGB 总和排序", "*testchart.sort_by_rec709_luma": "Sort by luma", "*testchart.vary_RGB_difference": "Vary RGB difference", "testchart_or_reference": "测色板或参考", "thermal_wax_printer": "热蜡打印机", "tone_values": "色调值", "transfer_function": "转换函数", "translations": "翻译", "transparency": "半透明", "trashcan.linux": "垃圾", "trashcan.mac": "垃圾", "trashcan.windows": "资源回收筒", "trc": "色调曲线", "*trc.dicom": "DICOM", "trc.gamma": "伽玛", "*trc.hlg": "Hybrid Log-Gamma", "*trc.lstar": "L*", "*trc.rec709": "Rec. 709", "*trc.rec1886": "Rec. 1886", "*trc.should_use_viewcond_adjust": "When using the SMPTE 240M, Rec. 709 or sRGB curves, you should use an adjustment for your ambient light levels as well to get correct results. To do that, tick the checkbox near “Ambient light level” and enter a value in Lux. You can also optionally measure ambient light while calibrating, if supported by your instrument.", "*trc.smpte240m": "SMPTE 240M", "*trc.smpte2084": "SMPTE 2084", "*trc.smpte2084.hardclip": "SMPTE 2084 (hard clip)", "*trc.smpte2084.rolloffclip": "SMPTE 2084 (roll-off)", "*trc.srgb": "sRGB", "trc.type.absolute": "绝对", "trc.type.relative": "相对", "turn_off": "关闭", "type": "类型", "udev_hotplug.unavailable": "无论 udev 或热插拔设备都侦测不到。", "*unassigned": "Unassigned", "uninstall": "移除", "uninstall_display_profile": "移除显示器描述文档...", "unknown": "未知", "unmodified": "未修改", "unnamed": "未命名", "unspecified": "未指定", "update_check": "检查程序更新...", "update_check.fail": "检查程序更新失败:", "update_check.fail.version": "无法解读来自伺服器%s的版本信息。", "update_check.new_version": "找到可用的更新:%s", "update_check.onstartup": "启动时检查程序更新", "update_check.uptodate": "%s 为最新版本。", "update_now": "现在更新", "upload": "上传", "use_fancy_progress": "华丽的进度框", "use_separate_lut_access": "个别地存取显示卡的伽玛表", "use_simulation_profile_as_output": "将模拟描述文档当成目标描述文档使用", "vcgt": "校正曲线", "vcgt.mismatch": "用于显示器 %s 的显示卡伽玛表并不符合期望的状态。", "vcgt.unknown_format": "描述文档“%s”内的显示卡伽玛表为未知的格式。", "verification": "验证", "verification.settings": "验证设定", "verify.ti1": "验证测色板", "verify_extended.ti1": "延伸验证测色板", "verify_grayscale.ti1": "灰平衡验证测色板", "verify_large.ti1": "大型验证测色板", "verify_video.ti1": "验证测色板(视讯)", "verify_video_extended.ti1": "延伸验证测色板(视讯)", "*verify_video_extended_hlg_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, Hybrid Log-Gamma)", "*verify_video_extended_smpte2084_100_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²)", "*verify_video_extended_smpte2084_200_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²)", "*verify_video_extended_smpte2084_500_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²)", "*verify_video_extended_smpte2084_1000_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²)", "verify_video_large.ti1": "大型验证测色板(视讯)", "verify_video_xl.ti1": "Extra large 验证测色板(视讯)", "verify_video_xxl.ti1": "XXL 验证测色板(视讯)", "verify_video_xxxl.ti1": "XXXL 验证测色板(视讯)", "verify_xl.ti1": "特大验证测色板", "verify_xxl.ti1": "XXL验证测色板", "verify_xxxl.ti1": "XXXL验证测色板", "*vga": "VGA", "video.icc": "视讯 (D65, Rec. 1886)", "video_Prisma.icc": "用于 Prisma 的视讯 3D LUT (D65, Rec. 709 / Rec. 1886)", "video_ReShade.icc": "用于ReShade的视讯 3D LUT (D65, Rec. 709 / Rec. 1886)", "video_camera": "摄录机", "video_card_gamma_table": "显示卡伽玛表", "video_eeColor.icc": "用于 eeColor 的视讯 3D LUT (D65, Rec. 709 / Rec. 1886)", "video_madVR.icc": "用于 madVR 的视讯 3D LUT (D65, Rec. 709 / Rec. 1886)", "*video_madVR_ST2084.icc": "Video 3D LUT for madVR HDR (D65, Rec. 2020 / SMPTE 2084)", "video_monitor": "视讯显示器", "video_resolve.icc": "用于调色的视讯 3D LUT (D65, Rec. 709 / Rec. 1886)", "view.3d": "以3D检视", "viewing_conditions": "观看环境", "viewing_conditions_description": "观看环境描述", "vrml_to_x3d_converter": "VRML 到 X3D 转换器", "warning": "警告", "warning.already_exists": "文档“%s”已存在于你所选择的位置及将会被覆盖。你是否要继续?", "warning.autostart_system": "无法判断全系统性的自动启动路径。", "warning.autostart_user": "无法判断个别使用者的自动启动路径。", "warning.discard_changes": "你是否真的要舍弃目前的设定值?", "*warning.input_value_clipping": "Warning: Values below the display profile blackpoint will be clipped!", "*warning.suspicious_delta_e": "Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful.\n\nOne or all of the following criteria matched:\n\n• Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other.\n• RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*).\n• RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*).\n• Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers.\n\nThis could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values.", "*warning.suspicious_delta_e.info": "Explanation of the Δ columns:\n\nΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low.\n\n0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation.\n\nΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers.", "warning.system_file": "警告:“%s”为系统文档. 你是否真的要继续?", "webserver.waiting": "网络服务器正在等待于", "welcome": "欢迎!", "welcome_back": "欢迎回来!", "white": "白", "whitepoint": "白位", "whitepoint.colortemp": "色温", "whitepoint.colortemp.locus.blackbody": "黑暗", "whitepoint.colortemp.locus.curve": "色温曲线", "whitepoint.colortemp.locus.daylight": "日光", "whitepoint.set": "你是否想将白位设定为检测到的数值?", "whitepoint.simulate": "模拟白位", "whitepoint.simulate.relative": "相对于目标定档的白位", "*whitepoint.visual_editor": "Visual whitepoint editor", "*whitepoint.visual_editor.display_changed.warning": "Attention: The display configuration has changed and the visual whitepoint editor may no longer be able to correctly restore display profiles. Please check display profile associations carefully after closing the editor and restart DisplayCAL.", "whitepoint.xy": "色度坐标", "window.title": "DisplayCAL", "windows.version.unsupported": "不支持这个版本的 Windows。", "windows_only": "只可在 Windows 运行", "working_dir": "工作文档夹:", "yellow": "黄色", "yellow_lab": "黄色 L*a*b*", "yellow_xyz": "黄色 XYZ", "yes": "是", } DisplayCAL-3.5.0.0/DisplayCAL/lang/zh_hk.json0000644000076500000000000023703413242301041020341 0ustar devwheel00000000000000{ "*": "Note to translators: Keys which are not yet translated are marked with a leading asterisk (*) and are indented with two tabs instead of one. Please remove the asterisk when translated.", "!author": "楊添明", "!language": "繁體中文(香港)", "!language_name": "CHINESE_TRADITIONAL", "3dlut": "3D LUT", "3dlut.1dlut.videolut.nonlinear": "顯示裝置的顯示卡伽瑪表 1D LUT 校正並非線性, 但 3D LUT 含有已套用的 1D LUT 校正。 請確保在使用3D LUT 之前已將顯示卡伽瑪表重置為線性,又或者建立一個未有套用校正的 3D LUT (如用後者的方法,在“選項” 選單中啟用“顯示進階選項”及在 3D LUT 設定中停用“套用校正 (vcgt)”以及“測量後建立 3D LUT”,然後建立新的 3D LUT).", "3dlut.bitdepth.input": "3D LUT 輸入色彩深度", "3dlut.bitdepth.output": "3D LUT 輸出色彩深度", "*3dlut.confirm_relcol_rendering_intent": "Do you want the 3D LUT to use the measured white point as well (3D LUT rendering intent will be set to relative colorimetric)?", "3dlut.content.colorspace": "內容色域", "3dlut.create": "建立 3D LUT...", "3dlut.create_after_profiling": "特性分析後建立 3D LUT", "3dlut.enable": "啟用 3D LUT", "3dlut.encoding.input": "輸入編碼", "3dlut.encoding.output": "輸出編碼", "3dlut.encoding.output.warning.madvr": "警告:不建議這種輸出編碼,如未在 madVR 的“裝置” → “%s” → “內容”內設定為輸出“電視色階 (16-235)”會引致畫面失真 (clipping)。 使用時自行承擔風險!", "*3dlut.encoding.type_2": "TV Rec. 2020 YCbCr UHD", "*3dlut.encoding.type_5": "TV Rec. 709 1250/50Hz YCbCr HD", "*3dlut.encoding.type_6": "TV Rec. 601 YCbCr SD", "*3dlut.encoding.type_7": "TV Rec. 709 1125/60Hz YCbCr HD", "*3dlut.encoding.type_C": "TV Rec. 2020 Constant Luminance YCbCr UHD", "*3dlut.encoding.type_T": "TV RGB 16-235 (clip WTW)", "*3dlut.encoding.type_X": "TV xvYCC Rec. 709 YCbCr HD", "3dlut.encoding.type_n": "全範圍 RGB 0-255", "*3dlut.encoding.type_t": "TV RGB 16-235", "*3dlut.encoding.type_x": "TV xvYCC Rec. 601 YCbCr (Rec. 709 Primaries) SD", "3dlut.format": "3D LUT 檔案格式", "*3dlut.format.3dl": "Autodesk / Kodak (.3dl)", "*3dlut.format.ReShade": "ReShade (.png, .fx)", "*3dlut.format.cube": "IRIDAS (.cube)", "3dlut.format.eeColor": "eeColor 處理器 (.txt)", "3dlut.format.icc": "裝置連結描述檔 (.icc/.icm)", "*3dlut.format.madVR": "madVR (.3dlut)", "*3dlut.format.madVR.hdr": "Process HDR content", "*3dlut.format.madVR.hdr.confirm": "Note that you need to have profiled the display in HDR mode. If the display doesn't support HDR natively, click “Cancel”.", "*3dlut.format.madVR.hdr_to_sdr": "Convert HDR content to SDR", "*3dlut.format.mga": "Pandora (.mga)", "*3dlut.format.png": "PNG (.png)", "*3dlut.format.spi3d": "Sony Imageworks (.spi3d)", "3dlut.frame.title": "建立 3D LUT", "*3dlut.hdr.rolloff.diffuse_white": "Diffuse white (reference 94.38 cd/m²)", "*3dlut.hdr.system_gamma": "System gamma (reference 1.2)", "3dlut.holder.assign_preset": "指派 3D LUT 到預設集:", "3dlut.holder.out_of_memory": "%s 的 3D LUT 儲存空間不足 (最少需要 %i KB )。 請刪除一些3D LUT以釋放空間給新的 3D LUT使用。 詳情請參閱%s的說明書。", "3dlut.input.colorspace": "原始色域", "3dlut.input.profile": "原始描述檔", "3dlut.install": "安裝 3D LUT", "3dlut.install.failure": "3D LUT安裝失敗 (不明的錯誤)。", "3dlut.install.success": "3D LUT安裝成功!", "3dlut.install.unsupported": "3D LUT安裝程序不支援所選取的 3D LUT 格式。", "3dlut.save_as": "儲存 3D LUT 為...", "3dlut.settings": "3D LUT設定", "3dlut.size": "3D LUT大小", "3dlut.tab.enable": "啟用 3D LUT 分頁", "3dlut.use_abstract_profile": "抽象 (“Look”) 描述檔", "*CMP_Digital_Target-3.cie": "CMP Digital Target 3", "*CMP_Digital_Target-4.cie": "CMP Digital Target 4", "*CMYK_IDEAlliance_ControlStrip_2009.ti1": "CMYK IDEAlliance Control Strip 2009", "*CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti1": "CMYK IDEAlliance ISO 12647-7 Control Wedge 2013", "*CMYK_ISO_12647-7_outer_gamut.ti1": "CMYK ISO 12647-7 outer gamut", "*ColorChecker.cie": "ColorChecker", "*ColorCheckerDC.cie": "ColorChecker DC", "*ColorCheckerPassport.cie": "ColorChecker Passport", "*ColorCheckerSG.cie": "ColorChecker SG", "*FograStrip2.ti1": "Fogra Media Wedge CMYK V2.0", "*FograStrip3.ti1": "Fogra Media Wedge CMYK V3.0", "ISO_12646-2008_color_accuracy_and_gray_balance.ti1": "ISO 12646:2008色彩準確度及灰平衡", "ISO_14861_color_accuracy_RGB318.ti1": "ISO 14861:2015色彩準確度及灰平衡", "*QPcard_201.cie": "QPcard 201", "*QPcard_202.cie": "QPcard 202", "*SpyderChecker.cie": "SpyderCHECKR", "Untethered": "非連接式", "[rgb]TRC": "色調響應曲線", "aborted": "...已中止.", "aborting": "正在中止,請等候 (可能需要一段時間)...", "abstract_profile": "抽象描述檔", "active_matrix_display": "動態矩陣顯示", "adaptive_mode_unavailable": "自動適應模式僅適用於 CMS 1.1.0 RC3 或更新版本。", "add": "加入...", "advanced": "進階", "allow_skip_sensor_cal": "允許跳過光譜儀自我校正", "ambient.measure": "測量環境亮度", "ambient.measure.color.unsupported": "%s:無法用此裝置測環境光的色溫,因為這個裝置的環境亮度應器看似只能感應到單色(只有光強度讀數)。", "ambient.measure.light_level.missing": "無法測量到亮度讀數。", "ambient.set": "你是否還想將環境光強度設定為量度到的數值?", "app.client.connect": "腳本客端 %s:%s 已連線", "app.client.disconnect": "腳本客端 %s:%s 已中斷連線", "app.client.ignored": "已拒絕腳本客端 %s:%s: %s 的嘗試連接", "app.client.network.disallowed": "已拒絕腳本客端 %s:%s: 的嘗試連接 不容許的網絡客端", "app.confirm_restore_defaults": "你真的想要放棄變更並還原為預設設定值嗎?", "app.detected": "偵測到 %s。", "app.detected.calibration_loading_disabled": "偵測到 %s。已停用校正載入。", "app.detection_lost": "已無法偵測到 %s。", "app.detection_lost.calibration_loading_enabled": "已無法偵測到 %s。 已啟用校正載入。", "app.incoming_message": "已收到來自 %s:%s: %s 的腳本請求", "app.incoming_message.invalid": "無效的腳本請求!", "app.listening": "正在設定主機於 %s:%s", "app.otherinstance": "%s 已正在執行。", "app.otherinstance.notified": "已提示正在運行的運作階段。", "apply": "套用", "apply_black_output_offset": "套用黑位偏移 (100%)", "apply_cal": "套用校正 (vcgt)", "apply_cal.error": "無法套用校正。", "archive.create": "建立壓縮檔...", "archive.import": "匯入壓縮檔...", "archive.include_3dluts": "你是否想將 3D LUT 檔案包含在壓縮檔之中(不建議,因為會令壓縮檔變得很大)?", "argyll.debug.warning1": "請於真正需要除錯資訊時才使用本選項(例如用來故障排除 ArgyllCMS 的功能)! 一般只在軟件開發者用於診斷或解決問題時使用。你是否真的需要啟用除錯輸出?", "argyll.debug.warning2": "請務必記得在正常使用本軟件時停用除錯輸出。", "argyll.dir": "ArgyllCMS 執行檔位置:", "argyll.dir.invalid": "無法找到 ArgyllCMS 執行檔案!\n請選擇放置執行檔案的資料夾路徑(可能前綴或後綴為 “argyll-” / “-argyll”): %s", "argyll.error.detail": "詳細 ArgyllCMS 錯誤訊息:", "argyll.instrument.configuration_files.install": "安裝 ArgyllCMS 測量儀器描述檔案...", "argyll.instrument.configuration_files.install.success": "已成功安裝 ArgyllCMS 測量儀器描述檔案。", "argyll.instrument.configuration_files.uninstall": "解除安裝 ArgyllCMS 測量儀器描述檔...", "argyll.instrument.configuration_files.uninstall.success": "已成功解除安裝ArgyllCMS測量儀器描述檔。", "argyll.instrument.driver.missing": "測量儀器的 ArgyllCMS 驅動程式可能尚未安裝或未有正確地安裝。請檢查你的測量裝置在 Windows 的裝置管理員中是否已出現於 „Argyll LibUSB-1.0A devices“ 之下及在需要時請(重新)安裝驅動程式。 請參閱說明文章中的安裝步驟。", "argyll.instrument.drivers.install": "安裝 ArgyllCMS 測量儀器驅動程式...", "argyll.instrument.drivers.install.confirm": "你只需要在使用並非 ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval 或 K-10 的測量儀器時,才需要安裝 ArgyllCMS 特定的驅動程式。\n\n注意: 如果你已經安裝廠商提供驅動程式,在安裝完成後,你需要在 Windows 的裝置管理員中自已切換成 ArgyllCMS 驅動程式。要這樣做的話,右按你的儀器然後選擇 “更新驅動程式...”,然後選擇 “瀏覽電腦上的驅動程式軟體”,之後選擇 “讓我從電腦上的裝置驅動程式清單中挑選”,最後在清單中選擇 Argyll 驅動程式。\n\n你還想繼續嗎?", "argyll.instrument.drivers.install.failure": "ArgyllCMS 測量儀器驅動程式安裝失敗。", "argyll.instrument.drivers.install.restart": "你需要停用驅動程式數位簽章以安裝 ArgyllCMS 儀器驅動程式。 要這樣做的話,就需要重新啟動系統。按一下畫面上出現的“疑難排解”,選擇 “進階選項”,“啟動選項”最後“重新啟動”。 在啟動時,選擇“停用驅動程式數位簽章”。在重新啟動後,在選單中再次選擇“安裝ArgyllCMS測量儀器驅動程式...”以安裝驅動程式。如果你見不到 “疑難排解”選項,請參考DisplayCAL說明文章中“Windows環境下的儀器驅動程式安裝方法”部份 以另一種方法停用驅動程式數位簽章。", "argyll.instrument.drivers.uninstall": "解除安裝 ArgyllCMS 測量儀器驅動程式...", "argyll.instrument.drivers.uninstall.confirm": "注意:解除安裝並不會影響正在使用中儀器的驅動程式,只是將驅動程式從 Windows 驅動程式庫中移除。如你想切換回已安裝的廠商提供驅動程式,你便需要使用 Windows 裝置管理員來手動切換到廠商驅動程式。要這樣做的話,右按你的儀器然後選擇 “更新驅動程式...”,然後選擇 “瀏覽電腦上的驅動程式軟體”,之後選擇 “讓我從電腦上的裝置驅動程式清單中挑選”,最後在清單中選擇 Argyll 驅動程式。\n\n你還想繼續嗎?", "argyll.instrument.drivers.uninstall.failure": "ArgyllCMS 測量儀器驅動程式解除安裝失敗。", "argyll.instrument.drivers.uninstall.success": "成功解除安裝 ArgyllCMS 測量儀器驅動程式。", "argyll.util.not_found": "未能找到 ArgyllCMS “%s” 的執行檔!", "as_measured": "與測量值相同", "attributes": "參數", "audio.lib": "音效模組:%s", "auth": "身份認證", "auth.failed": "身份認證失敗。", "auto": "自動", "auto_optimized": "自動優化", "autostart_remove_old": "移除舊的自動啟動項", "*backing_xyz": "Backing XYZ", "backlight": "背光", "bitdepth": "色彩深度", "black": "黑", "black_lab": "黑色 L*a*b*", "black_point": "黑位", "black_point_compensation": "黑位補償", "black_point_compensation.3dlut.warning": "當建立 3D LUT 時,應該先關閉特性分析設定中的黑位補償功能,因為會影響色調曲線調整的功能。你是否想關閉黑位補償?", "black_point_compensation.info": "黑位補償有效防止黑位被壓縮,但會降低色彩轉換的準確度。", "black_white": "黑白", "black_xyz": "黑 XYZ", "blacklevel": "黑色亮度", "blue": "藍", "blue_gamma": "藍色伽瑪", "blue_lab": "藍色 L*a*b*", "blue_matrix_column": "藍色矩陣列", "blue_maximum": "藍色最高", "blue_minimum": "藍色最低", "blue_tone_response_curve": "藍色色調響應曲線", "blue_xyz": "藍色 XYZ", "brightness": "亮度", "browse": "瀏覽...", "bug_report": "報告錯誤...", "button.calibrate": "只進行校正", "button.calibrate_and_profile": "校正及特性分析", "button.profile": "只進行特性分析", "cal_extraction_failed": "未能從描述檔中得出校正數據。", "calculated_checksum": "已計算的校驗碼", "calibrate_instrument": "光譜儀自我校正", "calibration": "校正", "calibration.ambient_viewcond_adjust": "環境光亮度調整", "calibration.ambient_viewcond_adjust.info": "要在計算校正曲線時調整觀看條件,請剔選相關選項並輸入環境亮度。如你的測量儀器支援的話,你亦可以選擇測量環境亮度。", "calibration.black_luminance": "黑色亮度", "calibration.black_output_offset": "黑色輸出偏移", "calibration.black_point_correction": "黑位修正", "*calibration.black_point_correction_choice": "You may turn off black point correction, to optimize black level and contrast ratio (recommended for most LCD monitors), or you can turn it on to make black the same hue as the whitepoint (recommended for most CRT monitors). Please select your black point correction preference.", "calibration.black_point_rate": "幅度", "calibration.check_all": "檢查設定", "calibration.complete": "已完成校正!", "calibration.create_fast_matrix_shaper": "建立矩陣描述檔", "*calibration.create_fast_matrix_shaper_choice": "Do you want to create a fast matrix shaper profile from calibration measurements or just calibrate?", "calibration.do_not_use_video_lut": "不要使用顯卡伽瑪表來套用校正", "calibration.do_not_use_video_lut.warning": "你是否真的要變更建議的設定?", "calibration.embed": "將校正曲線嵌入到描述檔", "calibration.file": "設定集", "calibration.file.invalid": "你所選的為無效的描述檔。", "calibration.file.none": "<無>", "calibration.incomplete": "校正尚未完成。", "calibration.interactive_display_adjustment": "互動顯示器調整", "calibration.interactive_display_adjustment.black_level.crt": "按一下“開始測量”然後調校顯示器的亮度設定及/或 RGB 調節控制以符合期望的水平。", "calibration.interactive_display_adjustment.black_point.crt": "按一下“開始測量”然後調校顯示器的 RGB 調節控制以符合期望的黑位水平。", "calibration.interactive_display_adjustment.check_all": "按一下“開始測量”以檢查整體的設定值。", "calibration.interactive_display_adjustment.generic_hint.plural": "當所有指示條都最接近中間所標示的位置時,代表已到達最理想的水平。 ", "calibration.interactive_display_adjustment.generic_hint.singular": "當指示條最接近中間所標示的位置時,代表已到達最理想的水平。", "calibration.interactive_display_adjustment.start": "開始測量", "calibration.interactive_display_adjustment.stop": "停止測量", "calibration.interactive_display_adjustment.white_level.crt": "按一下“開始測量”然後調校顯示器的對比度設定及/或 RGB調節控制以符合期望的水平。", "calibration.interactive_display_adjustment.white_level.lcd": "按一下“開始測量”然後調校顯示器的背光燈/亮度控制以符合期望的水平。", "calibration.interactive_display_adjustment.white_point": "按一下“開始測量”然後調校顯示器的色溫及/或 RGB 調節控制以符合期望的白位水平。", "calibration.load": "載入設定...", "calibration.load.handled_by_os": "由作業系統處理校正的載入。", "calibration.load_error": "未能載入校正曲線。", "calibration.load_from_cal": "由校正檔案載入校正曲線...", "calibration.load_from_cal_or_profile": "由校正檔案或描述檔載入校正曲線...", "calibration.load_from_display_profile": "由目前顯示裝置描述檔載入校正曲線", "calibration.load_from_display_profiles": "由當前的顯示裝置描述檔載入校正", "calibration.load_from_profile": "由描述檔載入校正曲線...", "calibration.load_success": "已成功載入校正曲線。", "calibration.loading": "正由檔案載入校正曲線...", "calibration.loading_from_display_profile": "正在載入目前顯示裝置描述檔的校正曲線...", "calibration.luminance": "白色亮度", "calibration.lut_viewer.title": "曲線", "calibration.preserve": "保留校正狀態", "calibration.preview": "預覽校正", "calibration.quality": "質素", "calibration.quality.high": "高", "calibration.quality.low": "低", "calibration.quality.medium": "中等", "calibration.quality.ultra": "極致", "calibration.quality.verylow": "非常低", "calibration.reset": "重置顯示卡的伽瑪表", "calibration.reset_error": "無法重置顯示卡伽瑪表。", "calibration.reset_success": "成功重置顯示卡伽瑪表。", "calibration.resetting": "正在重置顯示卡伽瑪表為線性...", "calibration.settings": "校正設定", "calibration.show_actual_lut": "查看顯示卡的校正曲線", "calibration.show_lut": "顯示曲線", "calibration.skip": "繼續分析特性", "calibration.speed": "校正速度", "calibration.speed.high": "快", "calibration.speed.low": "慢", "calibration.speed.medium": "中等", "calibration.speed.veryhigh": "非常快", "calibration.speed.verylow": "非常慢", "calibration.start": "繼續校正", "calibration.turn_on_black_point_correction": "開啟", "calibration.update": "更新校正", "calibration.update_profile_choice": "你是否還想更新描述檔內現有的校正曲線,還是純粹只想進行校正?", "calibration.use_linear_instead": "改用線性校正", "calibration.verify": "驗證校正結果", "calibration_profiling.complete": "已完成校正和特性分析!", "calibrationloader.description": "為所有已設定的顯示裝置設定ICC描述檔及載入校正曲線", "can_be_used_independently": "可獨立使用", "cancel": "取消", "cathode_ray_tube_display": "陰極射線管顯示器", "*ccmx.use_four_color_matrix_method": "Minimize xy chromaticity difference", "ccxx.ti1": "用於色度計修正的測色板 ", "centered": "置中", "channel_1_c_xy": "頻道1(C) xy", "channel_1_gamma_at_50_input": "頻道 1 伽瑪於 50% 輸入時", "channel_1_is_linear": "頻道 1 為線性", "channel_1_maximum": "頻道 1 最高", "channel_1_minimum": "頻道 1 最低", "channel_1_r_xy": "頻道 1(R) xy", "channel_1_unique_values": "頻道 1 唯一數值", "channel_2_g_xy": "頻道 2(G) xy", "channel_2_gamma_at_50_input": "頻道 2 伽瑪於 50% 輸入時", "channel_2_is_linear": "頻道 2 為線性", "channel_2_m_xy": "頻道 2 (M) xy", "channel_2_maximum": "頻道 2 最高", "channel_2_minimum": "頻道 2 最低", "channel_2_unique_values": "頻道 2 唯一數值", "channel_3_b_xy": "頻道 3 (B) xy", "channel_3_gamma_at_50_input": "頻道 3 伽瑪於 50% 輸入時", "channel_3_is_linear": "頻道 3 為線性", "channel_3_maximum": "頻道 3 最高", "channel_3_minimum": "頻道 3 最低", "channel_3_unique_values": "頻道 3 唯一數值", "channel_3_y_xy": "頻道 3 (Y) xy", "channel_4_k_xy": "頻道 4 (K) xy", "channels": "頻道數目", "characterization_device_values": "特性化裝置數值", "characterization_measurement_values": "特性化量度數值", "characterization_target": "特性化目標", "checking_lut_access": "正在撿查顯示器 %s 能否存取顯示卡伽瑪表...", "checksum": "校驗碼", "checksum_ok": "校驗碼正確", "*chromatic_adaptation_matrix": "Chromatic adaptation matrix", "*chromatic_adaptation_transform": "Chromatic adaptation transform", "*chromaticity_illuminant_relative": "Chromaticity (illuminant-relative)", "*chromecast_limitations_warning": "Please note that Chromecast accuracy is not as good as a directly connected display or madTPG, due to the Chromecast using RGB to YCbCr conversion and upscaling.", "clear": "清除", "close": "關閉", "color": "彩色", "color_look_up_table": "色彩查找表", "color_model": "色彩模式", "color_space_conversion_profile": "色彩空間轉換描述檔", "colorant_order": "Colorant order", "colorants_pcs_relative": "著色 (PCS-相對)", "colorimeter_correction.create": "建立色度計修正...", "*colorimeter_correction.create.details": "Please check the fields below and change them when necessary. The description should also contain important details (e.g. specific display settings, non-default CIE observer or the like).", "colorimeter_correction.create.failure": "修正建立失敗。", "colorimeter_correction.create.info": "如需建立色度計修正,你必須先使用光譜儀量度必需的顏色,或假設你需要同樣地用色度計建立一個修正矩陣而並光譜修正。\n另外你還可以“瀏覽...”來選擇已有的測量值。.", "colorimeter_correction.create.success": "已成功建立修正檔。", "colorimeter_correction.file.none": "無", "colorimeter_correction.import": "由其他顯示器描述檔建立軟件匯入色度計修正...", "colorimeter_correction.import.choose": "請選擇想匯入的色度計修正。", "colorimeter_correction.import.failure": "沒有可匯入的色度計修正。", "colorimeter_correction.import.partial_warning": "並非所有色度計修正可以從 %s 匯入。 %i 個,共 %i 個項目需要跳過。", "colorimeter_correction.import.success": "已成功由以下軟件匯入色度計修正:\n\n%s", "colorimeter_correction.instrument_mismatch": "所選的色度計修正並不適用於所選的儀器。", "colorimeter_correction.upload": "上載色度計修正...", "colorimeter_correction.upload.confirm": "你是否想上載色度計修正到網上數據庫(建議)?任何上載的檔案會假定被放置在公共領域,令其可以被自由地使用。", "colorimeter_correction.upload.deny": "該色度計修正可能不被上載。", "colorimeter_correction.upload.exists": "色度計修正已存在於數據庫。", "colorimeter_correction.upload.failure": "色度計修正未能輸入到數據庫。", "colorimeter_correction.upload.success": "色度計修正已成功上載到網上數據庫。", "colorimeter_correction.web_check": "撿查網上的色度計修正...", "colorimeter_correction.web_check.choose": "已找到以下用於所選顯示器及儀器的色度計修正:", "colorimeter_correction.web_check.failure": "找不到用於所選顯示器及儀器的色度計修正。", "*colorimeter_correction.web_check.info": "Please note that all colorimeter corrections have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate. They may or may not improve the absolute accuracy of your colorimeter with your display.", "colorimeter_correction_matrix_file": "修正", "colorimeter_correction_matrix_file.choose": "選擇色度計修正...", "colorimetric_intent_image_state": "影像色度狀態", "colors_pcs_relative": "色彩 (PCS - 相對)", "colorspace": "色域", "colorspace.show_outline": "顯示摘要", "commandline": "指令行:", "commands": "指令", "comparison_profile": "對比的描述檔", "comport_detected": "偵測到儀器/連接埠設定變更。", "compression.gzip": "GZIP壓縮", "computer.name": "電腦名稱", "connected.to.at": "連線到 %s 在 %s:%s", "connecting.to": "連線到 %s:%s...", "connection.broken": "連線中斷", "connection.established": "連線成功", "connection.fail": "連線錯誤 (%s)", "connection.fail.http": "HTTP 錯誤%s", "connection.waiting": "正在等待連線於", "continue": "繼續", "contrast": "對比", "contribute": "參與", "converting": "轉換中", "copyright": "版權", "corrected": "已連接", "create_profile": "使用特性描述數據來建立描述檔...", "create_profile_from_edid": "使用延伸示器辨別數據來建立描述檔...", "created": "建立於", "creator": "建立", "current": "目前", "custom": "自訂", "cyan": "青色", "d3-e4-s2-g28-m0-b0-f0.ti1": "用於矩陣描述檔的小型測色板", "d3-e4-s3-g52-m3-b0-f0.ti1": "用於矩陣描述檔的擴展測色板", "d3-e4-s4-g52-m4-b0-f0.ti1": "用於 LUT 描述檔的小型測色板", "d3-e4-s5-g52-m5-b0-f0.ti1": "用於 LUT 描述檔的擴展測色板", "d3-e4-s9-g52-m9-b0-f0.ti1": "用於 LUT 描述檔的大型測色板", "d3-e4-s17-g52-m17-b0-f0.ti1": "用於 LUT 描述檔的非常大型測色板", "deactivated": "已關閉", "default": "預設", "default.icc": "預設 (伽瑪 2.2)", "default_crt": "預設 CRT", "default_rendering_intent": "預設渲染目的", "delete": "刪除", "delta_e_2000_to_blackbody_locus": "ΔE 2000 到黑體場合", "delta_e_2000_to_daylight_locus": "ΔE 2000 到日光場合", "delta_e_to_locus": "ΔE*00 到 %s 場合", "description": "描述", "description_ascii": "描述 (ASCII)", "description_macintosh": "描述 (Macintosh)", "description_unicode": "描述 (Unicode)", "deselect_all": "全部不選取", "detect_displays_and_ports": "偵測顯示裝置和測量儀器", "device": "裝置", "device.name.placeholder": "<裝置名稱>", "device_color_components": "裝置色彩部件", "device_manager.launch": "開啟裝置管理員", "device_manufacturer_name": "裝置製造商名稱", "device_manufacturer_name_ascii": "裝置製造商名稱 (ASCII)", "device_manufacturer_name_macintosh": "裝置製造商名稱 (Macintosh)", "device_manufacturer_name_unicode": "裝置製造商名稱 (Unicode)", "device_model_name": "裝置型號名稱", "device_model_name_ascii": "裝置型號名稱 (ASCII)", "device_model_name_macintosh": "裝置型號名稱 (Macintosh)", "device_model_name_unicode": "裝置型號名稱 (Unicode)", "device_to_pcs_intent_0": "裝置到 PCS:目的 0", "device_to_pcs_intent_1": "裝置到 PCS:目的 1", "device_to_pcs_intent_2": "裝置到 PCS:目的 2", "devicelink_profile": "DeviceLink 描述檔", "dialog.argyll.notfound.choice": "ArgyllCMS 是 DisplayCAL 正常運行所需要的彩色管理引擎,但似乎並沒有安裝在這部電腦。你是否需要自動下載或自行瀏覽以選取其位置?", "dialog.cal_info": "將會使用校正檔案 “%s”。 你是否想繼續?", "dialog.confirm_cancel": "你是否真的想取消?", "dialog.confirm_delete": "你是否真的想刪除所選的檔案?", "dialog.confirm_overwrite": "檔案“%s”已存在。 你是否想覆寫它?", "dialog.confirm_uninstall": "你是否真的想刪除所選的檔案?", "dialog.current_cal_warning": "將會使用當前的校正曲線。 你是否想繼續?", "dialog.do_not_show_again": "不要再顯示這個訊息", "dialog.enter_password": "請輸入你的密碼。", "dialog.install_profile": "你是否要安裝描述檔 “%s” 並成為顯示器 “%s” 的預設描述檔?", "dialog.linear_cal_info": "將會使用線性校正曲線。你是否想繼續?", "dialog.load_cal": "載入設定", "dialog.select_argyll_version": "已找到 %s 版本的 ArgyllCMS。目前所選擇的版本為 %s。你是否想使用較新版本?", "dialog.set_argyll_bin": "請選取 ArgyllCMS 執行檔所在的目錄。", "dialog.set_profile_save_path": "在此建立描述檔 “%s” 的目錄:", "dialog.set_testchart": "選擇測色板檔案檔案", "dialog.ti3_no_cal_info": "測量數據不包含校正曲線。你真的要繼續嗎?", "digital_camera": "數碼相機", "digital_cinema_projector": "數碼影院投影機", "digital_motion_picture_camera": "數碼攝錄機", "direction.backward": "PCS → B2A → 裝置", "direction.backward.inverted": "PCS ← B2A ← 裝置", "direction.forward": "裝置 → A2B → PCS", "direction.forward.inverted": "裝置 ← A2B ← PCS", "*directory": "Directory", "disconnected.from": "已從 %s:%s 中斷連接", "display": "顯示器", "display-instrument": "顯示裝置及測量儀器", "display.connection.type": "連接方式", "display.manufacturer": "顯示裝置製造商", "display.output": "輸出#", "display.primary": "(主要)", "display.properties": "顯示裝置內容", "display.reset.info": "請重置顯示裝置到原廠預設設定,然後將亮度校到你感覺舒服的程度。", "display.settings": "顯示裝置設定", "display.tech": "顯示技術", "display_detected": "偵測到顯示裝置的設定有所修改。", "display_device_profile": "顯示裝置描述檔", "display_lut.link": "連結/解除連結顯示器及顯示卡伽瑪表存取", "display_peak_luminance": "顯示器最高光亮度", "display_profile.not_detected": "沒有偵測到當前用於顯示器 “%s” 的描述檔。", "display_short": "顯示裝置 (簡稱)", "*displayport": "DisplayPort", "displays.identify": "辨別顯示裝置", "dlp_screen": "DLP 螢幕", "donation_header": "歡迎你的支援!", "donation_message": "如果你想支持 DisplayCAL 和 ArgyllCMS 的開發、技術支援及\n可持續性,請考慮財政上進行資助。因 DisplayCAL 必需依靠 \nArgyllCMS 才可以正常運作的關系,所有捐助將平衡分配給\n兩個軟件發展項目。\n\n對於一般個人的非商業性的使用,宜作出一次性的資助。\n如您將 DisplayCAL 用於專業用途,每年或每月的定期資助,\n對於這兩個軟件開發項目的可持續性有很大的幫助。\n\n多謝各位的資助!", "download": "下載中", "*download.fail": "Download failed:", "download.fail.empty_response": "下載失敗:%s 的回應為內容空白的檔案。", "download.fail.wrong_size": "下載失敗: 檔案大小並非為預期的 %s 位元組 (已收到 %s 位元組).", "download_install": "下載及安裝", "downloading": "下載中", "drift_compensation.blacklevel": "黑色亮度漂移補償", "drift_compensation.blacklevel.info": "黑色亮度漂移補償會試圖降低在測量裝置正在預熱時出現的校正黑色校正偏漂移現像而引致的測量值出現偏差所帶來影響。 由於此功能會反復地測量黑色色塊,會整體增加測量所需的時間。很多色度計都有內置溫度補償功能,因此很多時候都不需要使用黑色亮度漂移補償,但大部份光譜儀卻沒有溫度補償的設計。", "drift_compensation.whitelevel": "白色亮度漂移補償", "drift_compensation.whitelevel.info": "白色亮度漂移補償會試圖降低在顯示裝置正在預熱時所出現的亮度變化而引致測量值出現偏差所帶來的影響。由於此功能會反復地測量白色色塊,會整體增加測量所需的時間。", "dry_run": "空轉運行", "dry_run.end": "空轉運行完結.", "dry_run.info": "空轉運行。檢視運作記錄以查看指令行。", "*dvi": "DVI", "dye_sublimation_printer": "熱昇華打印機", "edid.crc32": "EDID CRC32 校驗碼", "edid.serial": "EDID 序號", "elapsed_time": "已經過時間", "*electrophotographic_printer": "Electrophotographic printer", "*electrostatic_printer": "Electrostatic printer", "enable_argyll_debug": "啟用ArgyllCMS除錯輸出", "enable_spyder2": "啟用 Spyder 2 色度計...", "enable_spyder2_failure": "Spyder 2 未能啟用。如未安裝 Spyder 2 軟件請先安裝,然後再嘗試執行本操作。", "enable_spyder2_success": "Spyder 2 已成功啟用", "entries": "項目", "enumerate_ports.auto": "自動偵測測量儀器", "enumerating_displays_and_comports": "正在偵測顯示裝置及通信埠...", "environment": "環境", "error": "錯誤", "error.access_denied.write": "你並沒有寫入到 %s 的權限", "error.already_exists": "不能使用 “%s” 為名稱,因為已存在另一個名稱相同的物件。請選擇其他名稱或另一個路徑。", "error.autostart_creation": "在建立登入時載入校正曲線的自動啟動項目時失敗。", "*error.autostart_remove_old": "The old autostart entry which loads calibration curves on login could not be removed: %s", "*error.autostart_system": "The system-wide autostart entry to load the calibration curves on login could not be created, because the system-wide autostart directory could not be determined.", "*error.autostart_user": "The user-specific autostart entry to load the calibration curves on login could not be created, because the user-specific autostart directory could not be determined.", "error.cal_extraction": "無法從 “%s” 中讀取校正。", "error.calibration.file_missing": "校正檔案 “%s” 已遺失。", "error.calibration.file_not_created": "未有建立任何校正檔案。", "error.copy_failed": "檔案 “%s” 未能復制到 “%s”。", "error.deletion": "移動檔案到%s時發生錯誤。某些檔案可能尚未移除。", "*error.dir_creation": "The directory “%s” could not be created. Maybe there are access restrictions. Please allow writing access or choose another directory.", "*error.dir_notdir": "The directory “%s” could not be created, because another object of the same name already exists. Please choose another directory.", "error.file.create": "檔案“%s”未能建立。", "error.file.open": "檔案“%s”不能開啟。", "error.file_type_unsupported": "未支援的檔案類型。", "error.generic": "發生一個內部錯誤。\n\n錯誤碼:%s\n錯誤訊息:%s", "*error.luminance.invalid": "The measured peak luminance was invalid. Make sure the instrument sensor is not blocked, and remove any protective cap (if present).", "error.measurement.file_invalid": "測量檔案 „%s“為無效的。", "error.measurement.file_missing": "測量檔案“%s”已遺失。", "error.measurement.file_not_created": "沒有測量檔案被建立。", "error.measurement.missing_spectral": "測量檔案並不包含光譜數值。", "*error.measurement.one_colorimeter": "Exactly one colorimeter measurement is needed.", "*error.measurement.one_reference": "Exactly one reference measurement is needed.", "error.no_files_extracted_from_archive": "未有檔案由“%s”被解壓出來。", "error.not_a_session_archive": "壓縮檔 “%s” 似乎並不是階段性壓縮檔。", "error.profile.file_missing": "描述檔 “%s” 已遺失。", "error.profile.file_not_created": "未有建立任何描述檔。", "error.source_dest_same": "來源和目標檔案是相同的。", "error.testchart.creation_failed": "測色板檔案 “%s” 未能建立。可能有存取限制,或來源檔案並不存在。", "error.testchart.invalid": "測色板檔案 “%s” 為無效的。", "error.testchart.missing": "測色板檔案 “%s” 已遺失。", "error.testchart.missing_fields": "測色板檔案 „%s“ 並不包含必要的區塊:%s", "error.testchart.read": "測色板檔案 “%s” 無法讀取。", "error.tmp_creation": "無法建立臨時工作目錄。", "error.trashcan_unavailable": "%s 並不可用。 並未移除任何文件。", "errors.none_found": "沒有發現任何錯誤。", "estimated_measurement_time": "預算測量時間約 %s 小時 %s 分鐘", "*exceptions": "Exceptions...", "executable": "執行檔", "export": "匯出...", "extra_args": "設定額外的指令行參數...", "factory_default": "原廠設定", "failure": "...失敗!", "*file.hash.malformed": "The integrity of %s cannot be verified because the checksum file is malformed.", "*file.hash.missing": "The integrity of %s cannot be verified because it doesn't have an entry in the checksum file.", "*file.hash.verification.fail": "Checksum verification failed for %s:\n\nExpected %s\nActual %s", "file.invalid": "無的效的檔案。", "file.missing": "檔案“%s”並不存在", "file.notfile": "“%s”並不是一個檔案。", "file.select": "選擇檔案", "filename": "檔案名稱", "filename.upload": "上載檔案名稱", "filetype.7z": "7-Zip檔案", "filetype.any": "所有檔案類型", "filetype.cal": "校正檔案 (*.cal)", "filetype.cal_icc": "校正及描述檔案 (*.cal;*.icc;*.icm)", "*filetype.ccmx": "Correction matrices/Calibration spectral samples (*.ccmx;*.ccss)", "filetype.html": "HTML 檔案(*.html;*.htm)", "filetype.icc": "色彩描述檔案 (*.icc;*.icm)", "filetype.icc_mpp": "描述檔案 (*.icc;*.icm;*.mpp)", "filetype.icc_ti1_ti3": "測色板檔案 (*.icc;*.icm;*.ti1;*.ti3)", "filetype.icc_ti3": "測量檔案 (*.icc;*.icm;*.ti3)", "filetype.log": "運作記錄檔案 (*.log)", "filetype.png": "可攜式網絡圖形 (*.png)", "filetype.tgz": "已壓縮 TAR 歸檔文件", "filetype.ti1": "測色板檔案 (*.ti1)", "filetype.ti1_ti3_txt": "測色板檔案 (*.ti1), 測量檔案 (*.ti3;*.txt)", "filetype.ti3": "測量檔案 (*.ti3)", "filetype.tif": "標籤圖檔格式 (*.tif)", "*filetype.txt": "DeviceCorrections.txt", "filetype.vrml": "VRML 檔案 (*.wrl)", "filetype.x3d": "X3D 檔案 (*.x3d)", "filetype.zip": "ZIP 檔案", "film_scanner": "菲林掃描器", "film_writer": "菲林寫入器", "finish": "完成", "flare": "Flare", "flexography": "柔印", "*focal_plane_colorimetry_estimates": "Focal plane colorimetry estimates", "*forced": "forced", "format.select": "請選擇你喜歡的格式。", "*fullscreen.message": "Fullscreen mode activated.\nPress ESC to leave fullscreen.", "*fullscreen.osx.warning": "If you enter fullscreen mode using the zoom button in the window title bar, please press CMD + TAB to switch back to normal mode after the window has been closed. Alternatively, you can go fullscreen by double-clicking the title bar or holding the OPTION key while clicking the zoom button.", "gamap.default_intent": "預設渲染目的", "gamap.intents.a": "絕對色彩濃度", "gamap.intents.aa": "絕對觀感", "gamap.intents.aw": "絕對色彩濃度並按比例修正白位", "*gamap.intents.la": "Luminance matched appearance", "*gamap.intents.lp": "Luminance preserving perceptual appearance", "gamap.intents.ms": "保留飽和度", "gamap.intents.p": "感知", "gamap.intents.pa": "感知觀感", "gamap.intents.r": "絕對色彩濃度", "gamap.intents.s": "飽和度", "gamap.out_viewcond": "目標觀看條件", "*gamap.perceptual": "Gamut mapping for perceptual intent", "gamap.profile": "原始描述檔", "*gamap.saturation": "Gamut mapping for saturation intent", "gamap.src_viewcond": "原始觀看條件", "*gamap.viewconds.cx": "Cut sheet transparencies on a viewing box", "gamap.viewconds.jd": "投影機於黑暗的環境", "gamap.viewconds.jm": "投影機於陰暗的環境", "gamap.viewconds.mb": "顯示器於明亮的工作環境", "gamap.viewconds.md": "顯示器於較暗的工作環境", "gamap.viewconds.mt": "顯示器於一般的工作環境", "gamap.viewconds.ob": "原始場景 - 明亮的戶外", "gamap.viewconds.pc": "嚴謹印刷評價環境 (ISO-3664 P1)", "gamap.viewconds.pcd": "相片 CD - 戶外原始場景", "gamap.viewconds.pe": "印刷評價環境 (CIE 116-1995)", "gamap.viewconds.pp": "實用反光印刷 (ISO-3664 P2)", "gamap.viewconds.tv": "電視/電影工作室", "gamapframe.title": "進階色域映射選項", "gamut": "色域", "gamut.coverage": "色域覆蓋", "gamut.view.create": "產生色域圖...", "gamut.volume": "色域容積", "gamut_mapping.ciecam02": "CIECAM02 色域映射", "gamut_mapping.mode": "色域映射模式", "gamut_mapping.mode.b2a": "PCS-至-裝置", "gamut_mapping.mode.inverse_a2b": "反向 裝置-至-PCS", "*gamut_plot.tooltip": "Click and drag the mouse inside the plot to move the viewport, or zoom with the mouse wheel and +/- keys. Double-click resets the viewport.", "*generic_name_value_data": "Generic name-value data", "geometry": "幾何", "*glossy": "Glossy", "*go_to": "Go to %s", "go_to_website": "瀏覽網站", "gravure": "Gravure", "gray_tone_response_curve": "灰色調響應曲線", "grayscale": "灰階", "green": "綠", "green_gamma": "綠色伽瑪", "green_lab": "綠色 L*a*b*", "green_matrix_column": "綠色矩陣列", "green_maximum": "綠色最高", "green_minimum": "綠色最低", "green_tone_response_curve": "綠色色調響應曲線", "*green_xyz": "Green XYZ", "*grid_steps": "Grid Steps", "*hdmi": "HDMI", "*hdr_maxcll": "Maximum content light level", "*hdr_mincll": "Minimum content light level", "header": "採用 ArgyllCMS 技術的顯示器校正及特性化工具", "help_support": "幫助與支援...", "host.invalid.lookup_failed": "無效的主機 (地址查詢失敗)", "hue": "色相", "icc_absolute_colorimetric": "ICC 絕對色度", "icc_version": "ICC 版本", "if_available": "如有", "*illuminant": "Illuminant", "*illuminant_relative_cct": "Illuminant-relative CCT", "*illuminant_relative_lab": "Illuminant-relative L*a*b*", "*illuminant_relative_xyz": "Illuminant-relative XYZ", "illuminant_xyz": "光源 XYZ", "illumination": "照明方式", "*in": "In", "*info.3dlut_settings": "A 3D LUT (LUT = Look Up Table) or ICC device link profile can be used by 3D LUT or ICC device link capable applications for full display color correction.\n\nCreating several (additional) 3D LUTs from an existing profile\nWith the desired profile selected under “Settings”, uncheck the “Create 3D LUT after profiling” checkbox.\n\nChoosing the right source colorspace and tone response curve\nFor 3D LUTs and ICC device link profiles, the source colorspace and tone response curve need to be set in advance and become a fixed part of the overall color transformation (unlike ICC device profiles which are linked dynamically on-the-fly). As an example, HD video material is usually mastered according to the Rec. 709 standard with either a pure power gamma of around 2.2-2.4 (relative with black output offset of 100%) or Rec. 1886 tone response curve (absolute with black output offset 0%). A split between Rec. 1886-like and pure power is also possible by setting black output offset to a value between 0% and 100%.\n\n“Absolute” vs. “relative” gamma\nTo accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly.\n“Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero).\n“Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve.\n\nRendering intent\nIf you have calibrated to a different whitepoint than the one mandated by the source colorspace, and want to use that for the 3D LUT instead, select “Relative colorimetric”. Otherwise, select “Absolute colorimetric with white point scaling” (white point scaling will prevent clipping in absolute colorimetric mode that could happen if the source colorspace whitepoint is outside of the display gamut). You also have the option to use a non-colorimetric rendering intent that may compress or expand the source colorspace to fit within the display gamut (not recommended when colorimetric accuracy is required).", "info.calibration_settings": "校正是以互動地調校顯示器的方法以達到所選擇的白位及/或亮度,以及選擇性地建立1D LUT 校正曲線 (LUT = 查找表) \n以符合所選的色彩反應曲線及確保灰階的平衡。 注意校正時你只要調校顯示器及跳過 1D LUT曲線的建立,你需要設定\n色調反應曲線為“與測量值相同”。 1D LUT 校正並不可以 用於全顯示器色彩校正,你需要建立 ICC 裝置描述檔3D LUT\n以及在支援的軟件上使用它們以達到目的。 雖然 1D LUT 校正會完整了建立特性描述和 3D LUT 校正。", "info.display_instrument": "如你的顯示器為OLED等離子螢幕或擁有因應畫面內容而改變亮度的技術,請啟用白色亮度漂移補償.\n\n如你的測量儀器為光譜儀並在接觸模式下用於黑階穩定的顯示器, 您可能需要啟用測量儀器黑位偏移補償。\n\n如你的測量儀器為色度計,你應該使用適用於你的顯示器或顯示器技術類型的修正。 請留意有些測量儀器 (ColorHug, \nColorHug2, K-10, Spyder4/5) 它們的測量模式可能已經內置相關的修正。", "info.display_instrument.warmup": "你應該在測量前先讓你的顯示器預熱最少30分鐘。 如果你使用測量儀器的接觸模式,最好在預熱期間將測量儀器放\n在顯示器上。", "info.mr_settings": "你可以透過內含關於已測量色塊其色彩錯誤之詳盡統計數據的測量報告,以驗證 ICC 描述檔或 3D LUT 的準確度 。\n\n當驗證 3D LUT 時,請確保使用與建立 3D LUT 時的相同設定值。", "*info.profile_settings": "Profiling is the process of characterizing the display and recording its response in a ICC device profile. The ICC device profile can be used by applications that support ICC color management for full display color correction, and/or it can be used to create a 3D LUT (LUT = Look Up Table) which serves the same purpose for applications that support 3D LUTs.\n\nThe amount of patches measured influences the attainable accuracy of the resulting profile. For a reasonable quality 3x3 matrix and curves based profile, a few dozen patches can be enough if the display has good additive color mixing properties and linearity. Some professional displays fall into that category. If the highest possible accuracy is desired, a LUT-based profile from around several hundred up to several thousand patches is recommended. The “Auto-optimized” testchart setting automatically takes into account the non-linearities and actual response of the display, and should be used for best quality results. With this, you can adjust a slider to choose a compromise between resulting profile accuracy and measurement as well as computation time.", "*infoframe.default_text": "", "infoframe.title": "運作記錄", "infoframe.toggle": "顯示運作記錄視窗", "initial": "初步", "initializing_gui": "正在初始化圖形界面...", "ink_jet_printer": "噴墨打印機", "input_device_profile": "輸入置描述檔", "input_table": "輸入表", "install_display_profile": "安裝顯示裝置描述檔...", "install_local_system": "安裝給整個系統", "install_user": "只安裝給目前的使用者", "instrument": "測量儀器", "instrument.calibrate": "將測量儀器放置在深色、磨沙的表面,又或者放在其附帶的校正板上,然後按確定以校正測量儀器。", "instrument.calibrate.colormunki": "設定 ColorMunki 感度器到校正位置然後按 OK 以校正測量儀器。", "instrument.calibrate.reflective": "將儀器放置在它的序號%s反光白色參考表面上然後按 OK 以校正儀器。", "instrument.calibrating": "正在校正測量儀器...", "instrument.connect": "請現在連接你的測量儀器。", "instrument.initializing": "正在設定測量儀器,請等候...", "instrument.measure_ambient": "假如你的儀器必須裝上特製的蓋以測量環境光的話,請將其裝上。要測量環境光,請將儀器向上擺放,並且置於顯示器旁。 又或者如果你要測量對色燈箱,將無色偏灰卡放置在燈箱中然後將儀器指向它。 進一步關於如何量度環境光的方法可能在儀器的說明文件中可以找到。按 OK 進行量度。", "instrument.place_on_screen": "請將測量儀器放置在測量視窗上並按確認繼續。", "instrument.place_on_screen.madvr": "(%i) 請將你的 %s 放置在測量區域上", "instrument.reposition_sensor": "因測量儀器的感應器放置在不正確的位置而令測量失敗。請修正感應器放置的位置,然後按確認繼續。", "internal": "內置", "invert_selection": "反向選擇", "is_embedded": "內嵌的", "is_illuminant": "發光的", "is_linear": "線性的", "laptop.icc": "手提電腦 (伽瑪2.2)", "*libXss.so": "X11 screen saver extension", "library.not_found.warning": "未能找到程式庫“%s” (%s)。請在繼續之前確認已經安裝。", "license": "許可協議", "license_info": "採用GPL許可協議", "linear": "線性", "*link.address.copy": "Copy link address", "log.autoshow": "自動顯示運作記錄", "luminance": "亮度", "lut_access": "顯示卡伽瑪轉換表存取", "madhcnet.outdated": "版本%s於 %s上找到的已安裝版本已非常陳舊。 請將madVR更新到最新版本 (最好為 %i.%i.%i.%i 或以上).", "madtpg.launch.failure": "找不到 madTPG 或未能啟動。", "madvr.not_found": "在注冊表中未能找到madVR DirectShow 過濾器。請確認已安裝。", "madvr.outdated": "現正使用的 madVR 版本已非常陳舊。 請更新到最新版本 (最好為 %i.%i.%i.%i 或以上).", "*madvr.wrong_levels_detected": "The measured luminance difference between RGB level 0 and 16 is below 0.02 cd/m². Either the display device's input- and/or black level setting is incorrect, and/or the output levels configuration of the graphics card and/or madVR is wrong — if your graphics card driver is set to output full range RGB (0-255), please change madVR's output levels for your display device to TV levels (16-235).", "magenta": "洋紅", "make_and_model": "製造商和型號", "manufacturer": "製造商", "*mastering_display_black_luminance": "Mastering display black level", "*mastering_display_peak_luminance": "Mastering display peak luminance", "matrix": "Matrix", "matte": "磨砂", "max": "最大", "maximal": "最大化", "measure": "測量", "measure.darken_background": "黑色背景", "measure.darken_background.warning": "注意:如已選取 „黑色背景“,它會覆蓋整個畫面以及你將不能見到顯示器調校視窗!\n如果你是使用多螢幕,在開始測量前請將顯示器調校視窗移到另一個螢幕中,或使用\n鍵盤(要中止測量,按Q鍵。如測量已正在執行中,等候一會,然後再按多一次 Q 鍵。)。", "measure.override_display_settle_time_mult": "強制設定等候顯示穩定時間倍率", "measure.override_min_display_update_delay_ms": "強制設定最低顯示更新延遲", "measure.testchart": "測量測色板", "measureframe.center": "中央", "*measureframe.info": "Move the measurement window to the desired screen position and resize if needed. Approximately the whole window area will be used to display measurement patches, the circle is just there as a guide to help you place your measurement device.\nPlace the measurement device on the window and click on „Start measurement“. To cancel and return to the main window, close the measurement window.", "measureframe.measurebutton": "開始測量", "measureframe.title": "測量範圍", "measureframe.zoomin": "放大", "measureframe.zoommax": "最大化/還原", "measureframe.zoomnormal": "正常大小", "measureframe.zoomout": "縮小", "measurement.play_sound": "在連續測量時作出聲音反饋", "measurement.untethered": "非連接式測量", "measurement_file.check_sanity": "檢查測量檔案...", "measurement_file.check_sanity.auto": "自動檢查測量檔案", "measurement_file.check_sanity.auto.warning": "請注意,自動檢查測量檔案為實驗情質的功能。使用時後果自負。", "measurement_file.choose": "請選取測量檔案", "measurement_file.choose.colorimeter": "請選擇色度計測量檔案", "measurement_file.choose.reference": "請選擇參考測量檔案", "measurement_mode": "模式", "measurement_mode.adaptive": "適應", "measurement_mode.dlp": "DLP", "measurement_mode.factory": "原廠校正", "measurement_mode.generic": "一般", "*measurement_mode.highres": "HiRes", "measurement_mode.lcd": "LCD (一般)", "measurement_mode.lcd.ccfl": "LCD (冷色光管)", "measurement_mode.lcd.ccfl.2": "LCD (冷色光管類型 2)", "measurement_mode.lcd.oled": "LCD (OLED)", "measurement_mode.lcd.white_led": "LCD (白光 LED)", "measurement_mode.lcd.wide_gamut.ccfl": "廣色域 LCD (CCFL)", "measurement_mode.lcd.wide_gamut.rgb_led": "廣色域 LCD (RGB LED)", "measurement_mode.raw": "Raw", "measurement_mode.refresh": "更新 (一般)", "measurement_report": "測量報告...", "measurement_report.update": "更新測量報告...", "measurement_report_choose_chart": "請選擇測色板來測量。", "measurement_report_choose_chart_or_reference": "請選擇測色板或參考。", "measurement_report_choose_profile": "請選擇想驗證的描述檔", "measurement_type": "測量類型", "measurements.complete": "已完成測量!你是否想開啟放置測量檔案的資料夾?", "measuring.characterization": "正在測量用於特徵化的色板...", "media_black_point": "媒體黑位", "media_relative_colorimetric": "媒體相對色度", "media_white_point": "媒體白位", "menu.about": "關於...", "menu.file": "檔案", "menu.help": "?", "menu.language": "語言", "menu.options": "選項", "menu.tools": "工具", "menuitem.quit": "離開", "menuitem.set_argyll_bin": "設定 ArgyllCMS 執行檔位置...", "metadata": "數據描述資訊", "*method": "Method", "min": "最小", "minimal": "縮小", "model": "型號", "motion_picture_film_scanner": "影片菲林掃描器", "mswin.open_display_settings": "開啟 Windows 顯示器設定...", "named_color_profile": "具名稱的色彩描述檔", "named_colors": "具名色彩", "native": "原生", "negative": "不是", "no": "否", "no_settings": "檔案沒有內含設定。", "none": "沒有", "not_applicable": "無法提供", "not_connected": "尚未連接", "not_found": "無法找到“%s”。", "not_now": "並非現在", "number_of_entries": "項目數量", "number_of_entries_per_channel": "每個頻道的項目數量", "observer": "觀察者", "*observer.1931_2": "CIE 1931 2°", "*observer.1955_2": "Stiles & Birch 1955 2°", "*observer.1964_10": "CIE 1964 10°", "*observer.1964_10c": "CIE 1964 10° / 1931 2° hybrid", "*observer.1978_2": "Judd & Voss 1978 2°", "*observer.2012_2": "CIE 2012 2°", "*observer.2012_10": "CIE 2012 10°", "*observer.shaw": "Shaw & Fairchild 1997 2°", "oem.import.auto": "如你的色度計附帶適用於 Windows 的光碟,請現在將它插入(中止任何可能出現的自動安裝程式)。\n\n如你沒有光碟且無法在其他地方找到必須的檔案,它們將會從互聯絡下載到你的電腦。", "oem.import.auto.download_selection": "已經基於偵測到的儀器預先選取了一些選項。請選取要下載的那些檔案。", "oem.import.auto_windows": "如果已安裝好你的色度計的原廠軟件,大部份情況下都會自動找到所需的檔案。", "office_web.icc": "辦公室及互聯網 (D65,伽瑪2.2)", "offset": "偏移", "*offset_lithography": "Offset lithography", "ok": "確認", "or": "或", "*osd": "OSD", "other": "其他", "*out": "Out", "out_of_gamut_tag": "色域以外標籤", "output.profile": "目標描述檔", "output_device_profile": "輸出裝置描述檔", "*output_levels": "Output levels", "output_offset": "輸出偏移", "output_table": "輸出表", "overwrite": "覆寫", "panel.surface": "螢幕表面", "panel.type": "螢幕類型", "passive_matrix_display": "被動矩陣式顯示器", "patch.layout.select": "請選擇色塊布局:", "patches": "色塊", "*patterngenerator.prisma.specify_host": "Please specify the hostname of your Prisma Video Processor, e.g. prisma-0123 (Windows) or prisma-0123.local (Linux/Mac OS X). You can find the hostname on a label at the underside of the Prisma, unless it was changed via the Prisma's administrative web interface. Alternatively, enter the IP address (if known), e.g. 192.168.1.234", "patterngenerator.sync_lost": "與圖形產生器失去同步.", "pause": "暫停", "pcs_illuminant_xyz": "PCS 光源 XYZ", "pcs_relative_cct": "PCS-相對 CCT", "pcs_relative_lab": "PCS-相對 L*a*b*", "pcs_relative_xyz": "PCS-相對 XYZ", "pcs_to_device_intent_0": "PCS 到裝置:目的 0", "pcs_to_device_intent_1": "PCS 到裝置:目的 1", "pcs_to_device_intent_2": "PCS 到裝置:目的 2", "perceptual": "感知", "photo.icc": "相片 (D50,伽瑪2.2)", "*photo_imagesetter": "Photo imagesetter", "photographic_paper_printer": "相紙印刷機", "platform": "平台", "please_wait": "請等候...", "port.invalid": "無效連接埠:%s", "*positive": "Positive", "preferred_cmm": "偏向CMM", "prepress.icc": "印前作業 (D50, 130 cd/m², L*)", "preset": "預設集", "preview": "預覽", "profile": "描述檔", "profile.advanced_gamap": "進階...", "profile.b2a.hires": "增強色度 PCS-至-裝置轉換表的有效精確度", "profile.b2a.lowres.warning": "這個描述檔似乎缺少了高質素的 PCS-到-裝置轉換表,這對於正常運作非常重要。你是否想現在產生高質素的換算表?這可能需要數分鐘。", "profile.b2a.smooth": "平滑化", "profile.choose": "請選擇描述檔。", "profile.confirm_regeneration": "你是否想重新產生描述檔?", "profile.current": "目前的描述檔", "profile.do_not_install": "不要安裝描述檔", "profile.iccv4.unsupported": "不支援版本 4 的 ICC 描述檔。", "profile.import.success": "描述檔已經匯入。你需要自行指定及在“彩色”系統設定下將其啟用。", "profile.info": "描述檔資訊", "profile.info.show": "顯示描述檔資訊", "profile.install": "安裝描述檔", "profile.install.error": "描述檔未能安裝/啟用。", "profile.install.success": "描述檔已成功安裝及啟用。", "profile.install.warning": "已完成安裝描述檔,但可能出現了問題。", "profile.install_local_system": "安裝描述檔為系統預設", "profile.install_network": "於整個網絡安裝設定", "profile.install_user": "只於目前使用者安裝描述檔", "profile.invalid": "無效的描述檔。", "profile.load_error": "未能載入顯示器描述檔。", "profile.load_on_login": "登入時載入描述檔", "profile.load_on_login.handled_by_os": "讓作業系統處理和載入顯示器校正(低質素)", "profile.name": "描述檔名稱", "*profile.name.placeholders": "You may use the following placeholders in the profile name:\n\n%a Abbreviated weekday name\n%A Full weekday name\n%b Abbreviated month name\n%B Full month name\n%d Day of the month\n%H Hour (24-hour clock)\n%I Hour (12-hour clock)\n%j Day of the year\n%m Month\n%M Minute\n%p AM/PM\n%S Second\n%U Week (Sunday as first day of the week)\n%w Weekday (sunday is 0)\n%W Week (Monday as first day of the week)\n%y Year without century\n%Y Year with century", "profile.no_embedded_ti3": "該描述檔不包含 Argyll 兼容的測量數據。", "profile.no_vcgt": "該描述檔不包含校正曲線。", "profile.only_named_color": "只可使用“具名顏色”類型的描述檔。", "profile.quality": "描述檔品質", "profile.quality.b2a.low": "低質素PCS-到-裝置轉換表", "profile.quality.b2a.low.info": "如描述檔將只會用與反向裝置至 PCS 色域映射,便選取這個選項以建立裝置連結或 3D LUT", "profile.required_tags_missing": "描述檔缺少必要的的標記:%s", "profile.self_check": "描述檔自我檢查 ΔE*76", "profile.self_check.avg": "平均", "profile.self_check.max": "最大", "*profile.self_check.rms": "RMS", "profile.set_save_path": "選擇儲存位置...", "profile.settings": "特性分析設定", "profile.share": "上載描述檔...", "profile.share.avg_dE_too_high": "這個描述檔所得的 delta E 數值過高 (實際 = %s,門檻 = %s)。", "*profile.share.b2a_resolution_too_low": "The resolution of the profile's PCS to device tables is too low.", "*profile.share.enter_info": "You may share your profile with other users via the OpenSUSE “ICC Profile Taxi” service.\n\nPlease provide a meaningful description and enter display device properties below. Read display device settings from your display device's OSD and only enter settings applicable to your display device which have changed from defaults.\nExample: For most display devices, these are the name of the chosen preset, brightness, contrast, color temperature and/or whitepoint RGB gains, as well as gamma. On laptops and notebooks, usually only the brightness. If you have changed additional settings while calibrating your display device, enter them too if possible.", "profile.share.meta_missing": "該描述檔不包含必需的數據描述資訊。", "profile.share.success": "描述檔已成功上載。", "*profile.tags.A2B0.shaper_curves.input": "A2B0 input shaper curves", "*profile.tags.A2B0.shaper_curves.output": "A2B0 output shaper curves", "*profile.tags.A2B1.shaper_curves.input": "A2B1 input shaper curves", "*profile.tags.A2B1.shaper_curves.output": "A2B1 output shaper curves", "*profile.tags.A2B2.shaper_curves.input": "A2B2 input shaper curves", "*profile.tags.A2B2.shaper_curves.output": "A2B2 output shaper curves", "*profile.tags.B2A0.shaper_curves.input": "B2A0 input shaper curves", "*profile.tags.B2A0.shaper_curves.output": "B2A0 output shaper curves", "*profile.tags.B2A1.shaper_curves.input": "B2A1 input shaper curves", "*profile.tags.B2A1.shaper_curves.output": "B2A1 output shaper curves", "*profile.tags.B2A2.shaper_curves.input": "B2A2 input shaper curves", "*profile.tags.B2A2.shaper_curves.output": "B2A2 output shaper curves", "profile.testchart_recommendation": "如想得到較高品質的描述檔,就建議使用較多樣本數量的測色板,但測量會需要用較長的時間。 你是否想使用建議的測色板?", "profile.type": "描述檔類型", "profile.type.gamma_matrix": "伽瑪 + 矩陣", "*profile.type.lut.lab": "L*a*b* LUT", "*profile.type.lut.xyz": "XYZ LUT", "profile.type.lut_matrix.xyz": "XYZ LUT+矩陣", "profile.type.lut_rg_swapped_matrix.xyz": "XYZ LUT + 互換的矩陣", "profile.type.shaper_matrix": "曲線 + 矩陣", "profile.type.single_gamma_matrix": "單一伽瑪+矩陣", "profile.type.single_shaper_matrix": "單一曲線+矩陣", "profile.unsupported": "未支援的描述檔類型 (%s) 及 / 或色域 (%s).", "profile.update": "更新定檔", "profile_associations": "描述檔關聯...", "profile_associations.changing_system_defaults.warning": "你現在正在變更系統預設值。", "profile_associations.use_my_settings": "在這個顯示器使用我的設定值。", "profile_class": "描述檔等級", "profile_connection_space_pcs": "描述檔連接空間 (PCS)", "profile_loader": "描述檔載入工具", "profile_loader.disable": "停用描述檔載入工具", "profile_loader.exceptions.known_app.error": "描述檔載入工具會在 %s 執行時自動停用。你不能強行阻止這種行為。", "profile_loader.exit_warning": "你是否真的要關閉描述檔載入工具?校正將不會於變更顯示器設定時重新載入!", "profile_loader.fix_profile_associations": "自動修正描述檔關聯", "profile_loader.fix_profile_associations_warning": "只要描述檔載入工具正在運作,它就會於變更顯示設定時處理好描述檔關聯。\n\n在你繼續之前,你要確保以上的描述檔關聯為正確的。如果不是,請跟從以下步驟:\n\n1. 開啟 Windows 顯示器設定。\n2. 啟用所有已連接的顯示器 (延伸桌面)。\n3. 於 Windows 控制台中開啟 Windows 彩色管理設定。\n4. 確認每個顯示裝置已指定正確的描述檔。然後關閉色彩管理設定。\n5. 在 Windows 顯示設定,回復到之前的顯示器設定。\n6. 現在你可以啟用“自動修正搭述檔關聯”。", "profile_loader.info": "校正狀態在今日已 (重新) 套用了 %i 次。\n右按圖示以開啟選單。", "profiling": "特性分析", "profiling.complete": "完成特性分析!", "profiling.incomplete": "特性分析尚未完成。", "projection_television": "投影式電視", "projector": "投影機", "projector_mode_unavailable": "只有 ArgyllCMS 1.1.0 Beta 或更新版本才可以使用投影模式。", "*quality.ultra.warning": "Ultra quality should almost never be used, except to prove that it should almost never be used (long processing time!). Maybe choose high or medium quality instead.", "readme": "幫助", "ready": "準備就緒。", "red": "紅", "red_gamma": "紅色伽瑪", "red_lab": "紅色 L*a*b*", "red_matrix_column": "紅色矩陣列", "red_maximum": "紅色最大", "red_minimum": "紅色最小", "red_tone_response_curve": "紅色色調響應曲線", "red_xyz": "紅色 XYZ", "reference": "參考", "*reflection_hardcopy_original_colorimetry": "Reflection hardcopy original colorimetry", "*reflection_print_output_colorimetry": "Reflection print output colorimetry", "reflective": "反光", "reflective_scanner": "反射式掃描器", "remaining_time": "剩餘時間 (ca.)", "remove": "移除", "rendering_intent": "渲染目的", "report": "報告", "report.calibrated": "已校正顯示裝置報告", "report.uncalibrated": "未校正顯示裝置報告", "report.uniformity": "測量顯示裝置均勻度...", "reset": "重設", "resources.notfound.error": "嚴重錯誤: 無法找到一個必需的檔案:", "resources.notfound.warning": "警告: 無法找到某些必需的檔案:", "response.invalid": "來自%s: %s的無效回應", "response.invalid.missing_key": "來自 %s 的無效回應:缺少機碼“%s”:%s", "response.invalid.value": "來自%s的無效回應: 機碼的數值 “%s” 並不符合預期的數值 “%s”:%s", "restore_defaults": "還原到預設值", "rgb.trc": "RGB 傳遞函數", "rgb.trc.averaged": "平均 RGB 傳遞函數", "sRGB.icc": "sRGB", "saturation": "飽和度", "save": "儲存", "save_as": "儲存到...", "*scene_appearance_estimates": "Scene appearance estimates", "*scene_colorimetry_estimates": "Scene colorimetry estimates", "scripting-client": "DisplayCAL 腳本客端", "*scripting-client.cmdhelptext": "Press the tab key at an empty command prompt to view the possible commands in the current context, or to auto-complete already typed initial letters. Type “getcommands” for a list of supported commands and possible parameters for the connected application.", "scripting-client.detected-hosts": "檢測到腳本主機:", "select_all": "選擇全部", "set_as_default": "設定為預設", "setting.keep_current": "保留當前設定", "settings.additional": "額外設定", "settings.basic": "基本設定", "settings.new": "<目前>", "settings_loaded": "已經載入校正曲線及以下的校正設定:%s。其他的校正選項已經還原到預設及特性分析設定並未修改。", "settings_loaded.cal": "描述檔只內含校正設定。其他選項並未修改。並沒有校正曲線被載入。", "settings_loaded.cal_and_lut": "描述檔只內含校正設定。其他選項並未修改及已經載入校正曲線。", "settings_loaded.cal_and_profile": "已經載入設定值。找不到校正曲線。", "settings_loaded.profile": "描述檔只內含特性分析設定。其他選項並未修改。找不到校正曲線。", "settings_loaded.profile_and_lut": "描述檔只內含特性分析設定。 其他選項並未修改及已經載入校正曲線。", "show_advanced_options": "顯示進階選項", "*show_notifications": "Show notifications", "silkscreen": "絲印", "simulation_profile": "模擬描述檔", "size": "大小", "skip_legacy_serial_ports": "跳過舊式串列埠", "softproof.icc": "螢幕校樣 (5800K, 160 cd/m², L*)", "spectral": "色譜", "*ssl.certificate_verify_failed": "The remote certificate could not be verified.", "*ssl.certificate_verify_failed.root_ca_missing": "The remote certificate could not be verified because no suitable root certificates were found on the local system.", "*ssl.handshake_failure": "Handshake failure. A secure connection could not be established.", "startup": "正在啟動...", "startup_sound.enable": "啟用啟動音效", "*success": "...ok.", "surround_xyz": "包圍 XYZ", "synthicc.create": "建立合成的 ICC 描述檔...", "target": "目標", "tc.3d": "建立診斷用的 3D 檔案", "*tc.I": "Perceptual space body centered cubic grid", "*tc.Q": "Perceptual space filling quasi-random", "*tc.R": "Perceptual space random", "tc.adaption": "適應", "tc.algo": "分布", "tc.angle": "角度", "tc.black": "黑色塊", "tc.dark_emphasis": "加強深色區域", "tc.fullspread": "反复的色塊", "tc.gray": "中性色塊", "tc.i": "裝置空間主體置於立方網格中央", "tc.limit.sphere": "限制樣本為球體", "tc.limit.sphere_radius": "半徑", "tc.multidim": "多維", "tc.multidim.patches": "色階 = %s 色塊 (%s 中性)", "tc.neutral_axis_emphasis": "強調中性主軸", "tc.ofp": "優化最遠位置取樣", "tc.patch": "色塊", "tc.patches.selected": "已選取", "tc.patches.total": "色調色塊", "tc.precond": "Preconditioning 描述檔", "tc.precond.notset": "請選擇 preconditioning 描述檔", "tc.preview.create": "正在建立預覽,請等候...", "*tc.q": "Device space filling quasi-random", "*tc.r": "Device space random", "tc.single": "單一頻道色塊", "tc.single.perchannel": "每條頻道", "*tc.t": "Incremental far point sampling", "tc.vrml.black_offset": "RGB 黑色亮度偏移 (L*)", "tc.vrml.use_D50": "中性 RGB 白色", "tc.white": "白色塊", "technology": "技術", "tempdir_should_still_contain_files": "已建立的檔案應該還在暫存目錄“%s”。", "testchart.add_saturation_sweeps": "加入飽和度掃描", "testchart.add_ti3_patches": "加入參考色塊...", "testchart.auto_optimize.untethered.unsupported": "非連接式的虛擬顯示裝置並不支援測色板自動優化。", "testchart.change_patch_order": "改變色塊次序", "testchart.confirm_select": "檔案已儲存。 你是否想選擇這個測色板?", "testchart.create": "建立測色板", "testchart.discard": "捨棄", "testchart.dont_select": "不要選擇", "testchart.edit": "編輯測色板...", "testchart.export.repeat_patch": "重復每個色塊:", "testchart.file": "測色板", "testchart.info": "已選擇測色板中的色塊數目", "*testchart.interleave": "Interleave", "*testchart.maximize_RGB_difference": "Maximize RGB difference", "*testchart.maximize_lightness_difference": "Maximize lightness difference", "*testchart.maximize_rec709_luma_difference": "Maximize luma difference", "*testchart.optimize_display_response_delay": "Minimize display response delay", "*testchart.patch_sequence": "Patch sequence", "testchart.patches_amount": "色塊數目", "testchart.read": "正在讀取測色板...", "testchart.save_or_discard": "尚未儲存測色板。", "testchart.select": "選擇", "testchart.separate_fixed_points": "請選擇在個別色階中加入的色塊。", "testchart.set": "選擇測色板檔案...", "*testchart.shift_interleave": "Shift & interleave", "testchart.sort_RGB_blue_to_top": "將 RGB 藍色排列到最頂", "testchart.sort_RGB_cyan_to_top": "將 RGB 青色排列到最頂", "testchart.sort_RGB_gray_to_top": "將 RGB 灰色排列到最頂", "testchart.sort_RGB_green_to_top": "將 RGB 綠色排列到最頂", "testchart.sort_RGB_magenta_to_top": "將 RGB 洋紅色排列到最頂", "testchart.sort_RGB_red_to_top": "將 RGB 紅色排列到最頂", "testchart.sort_RGB_white_to_top": "將 RGB 白色排列到最頂", "testchart.sort_RGB_yellow_to_top": "將 RGB 黃色排列到最頂", "testchart.sort_by_BGR": "以 BGR 排序", "testchart.sort_by_HSI": "以 HSI 排序", "testchart.sort_by_HSL": "以 HSL 排序", "testchart.sort_by_HSV": "以 HSV 排序", "testchart.sort_by_L": "以 L* 排序", "testchart.sort_by_RGB": "以 RGB 排序", "testchart.sort_by_RGB_sum": "以 RGB 總和排序", "*testchart.sort_by_rec709_luma": "Sort by luma", "*testchart.vary_RGB_difference": "Vary RGB difference", "testchart_or_reference": "測色板或參考", "thermal_wax_printer": "熱蠟打印機", "tone_values": "色調值", "transfer_function": "轉換函數", "translations": "翻譯", "transparency": "半透明", "trashcan.linux": "垃圾", "trashcan.mac": "垃圾", "trashcan.windows": "資源回收筒", "trc": "色調曲線", "*trc.dicom": "DICOM", "trc.gamma": "伽瑪", "*trc.hlg": "Hybrid Log-Gamma", "*trc.lstar": "L*", "*trc.rec709": "Rec. 709", "*trc.rec1886": "Rec. 1886", "*trc.should_use_viewcond_adjust": "When using the SMPTE 240M, Rec. 709 or sRGB curves, you should use an adjustment for your ambient light levels as well to get correct results. To do that, tick the checkbox near “Ambient light level” and enter a value in Lux. You can also optionally measure ambient light while calibrating, if supported by your instrument.", "*trc.smpte240m": "SMPTE 240M", "*trc.smpte2084": "SMPTE 2084", "*trc.smpte2084.hardclip": "SMPTE 2084 (hard clip)", "*trc.smpte2084.rolloffclip": "SMPTE 2084 (roll-off)", "*trc.srgb": "sRGB", "trc.type.absolute": "絕對", "trc.type.relative": "相對", "turn_off": "關閉", "type": "類型", "udev_hotplug.unavailable": "無論 udev 或熱插拔裝置都偵測不到。", "*unassigned": "Unassigned", "uninstall": "移除", "uninstall_display_profile": "移除顯示裝置描述檔...", "unknown": "未知", "unmodified": "未修改", "unnamed": "未命名", "unspecified": "未指定", "update_check": "檢查程式更新...", "update_check.fail": "檢查程式更新失敗:", "update_check.fail.version": "無法解讀來自伺服器%s的版本資訊。", "update_check.new_version": "找到可用的更新:%s", "update_check.onstartup": "啟動時檢查程式更新", "update_check.uptodate": "%s 為最新版本。", "update_now": "現在更新", "upload": "上載", "use_fancy_progress": "啟用花巧的進度框", "use_separate_lut_access": "個別地存取顯示卡的伽瑪表", "use_simulation_profile_as_output": "將模擬描述檔當成目標描述檔使用", "vcgt": "校正曲線", "vcgt.mismatch": "用於顯示器 %s 的顯示卡伽瑪表並不符合期望的狀態。", "vcgt.unknown_format": "描述檔“%s”內的顯示卡伽瑪表為未知的格式。", "verification": "驗證", "verification.settings": "驗證設定", "verify.ti1": "驗證測色板", "verify_extended.ti1": "延伸驗證測色板", "verify_grayscale.ti1": "灰平衡驗證測色板", "verify_large.ti1": "大型驗證測色板", "verify_video.ti1": "驗證測色板(視訊)", "verify_video_extended.ti1": "延伸驗證測色板(視訊)", "*verify_video_extended_hlg_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, Hybrid Log-Gamma)", "*verify_video_extended_smpte2084_100_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 100 cd/m²)", "*verify_video_extended_smpte2084_200_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 200 cd/m²)", "*verify_video_extended_smpte2084_500_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 500 cd/m²)", "*verify_video_extended_smpte2084_1000_p3_2020.ti1": "Extended verification testchart (HDR video, Rec. 2020/P3, SMPTE 2084, 1000 cd/m²)", "verify_video_large.ti1": "大型驗證測色板(視訊)", "verify_video_xl.ti1": "Extra large 驗證測色板(視訊)", "verify_video_xxl.ti1": "XXL 驗證測色板(視訊)", "verify_video_xxxl.ti1": "XXXL 驗證測色板(視訊)", "verify_xl.ti1": "特大驗證測色板", "verify_xxl.ti1": "XXL驗證測色板", "verify_xxxl.ti1": "XXXL驗證測色板", "*vga": "VGA", "video.icc": "視訊 (D65, Rec. 1886)", "video_Prisma.icc": "用於 Prisma 的視訊 3D LUT (D65, Rec. 709 / Rec. 1886)", "video_ReShade.icc": "用於ReShade的視訊 3D LUT (D65, Rec. 709 / Rec. 1886)", "video_camera": "攝錄機", "video_card_gamma_table": "顯示卡伽瑪表", "video_eeColor.icc": "用於 eeColor 的視訊 3D LUT (D65, Rec. 709 / Rec. 1886)", "video_madVR.icc": "用於 madVR 的視訊 3D LUT (D65, Rec. 709 / Rec. 1886)", "*video_madVR_ST2084.icc": "Video 3D LUT for madVR HDR (D65, Rec. 2020 / SMPTE 2084)", "video_monitor": "視訊顯示器", "video_resolve.icc": "用於調色的視訊 3D LUT (D65, Rec. 709 / Rec. 1886)", "view.3d": "以3D檢視", "viewing_conditions": "觀看環境", "viewing_conditions_description": "觀看環境描述", "vrml_to_x3d_converter": "VRML 到 X3D 轉換器", "warning": "警告", "warning.already_exists": "檔案“%s”已存在於你所選擇的位置及將會被覆寫。你是否要繼續?", "warning.autostart_system": "無法判斷全系統性的自動啟動路徑。", "warning.autostart_user": "無法判斷個別使用者的自動啟動路徑。", "warning.discard_changes": "你是否真的要捨棄目前的設定值?", "*warning.input_value_clipping": "Warning: Values below the display profile blackpoint will be clipped!", "*warning.suspicious_delta_e": "Warning: Suspicious measurements have been found. Please note this check assumes an sRGB-like display device. If your display device differs from this assumption (e.g. if it has a very wide gamut or a tone response too far from sRGB), then errors found are probably not meaningful.\n\nOne or all of the following criteria matched:\n\n• Consecutive patches with different RGB numbers, but suspiciously low ΔE*00 of the measurements against each other.\n• RGB gray with increasing RGB numbers towards the previous patch, but declining lightness (L*).\n• RGB gray with decreasing RGB numbers towards the previous patch, but rising lightness (L*).\n• Unusually high ΔE*00 and ΔL*00 or ΔH*00 or ΔC*00 of measurements to the sRGB equivalent of the RGB numbers.\n\nThis could hint at measurement errors. Values that are considered problematic (which does not have to be true!) are highlighted in red. Check the measurements carefully and mark the ones you want to accept. You can also edit the RGB and XYZ values.", "*warning.suspicious_delta_e.info": "Explanation of the Δ columns:\n\nΔE*00 XYZ A/B: ΔE*00 of measured values towards measured values of the previous patch. If this value is missing, it wasn't a factor while checking. If it is present, then it is assumed to be too low.\n\n0.5 ΔE*00 RGB A/B: ΔE*00 of the sRGB equivalent of the RGB numbers towards the sRGB equivalent of the RGB numbers of the previous patch (with a factor of 0.5). If this value is present, it represents the comparison (minimal) value during checking for assumed too low ΔE*00 XYZ A/B. It serves as a very rough orientation.\n\nΔE*00 RGB-XYZ: ΔE*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔL*00 RGB-XYZ: ΔL*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔC*00 RGB-XYZ: ΔC*00 of measured values towards the sRGB equivalent of the RGB numbers.\nΔH*00 RGB-XYZ: ΔH*00 of measured values towards the sRGB equivalent of the RGB numbers.", "warning.system_file": "警告:“%s”為系統檔案. 你是否真的要繼續?", "webserver.waiting": "網絡服務器正在等待於", "welcome": "歡迎!", "welcome_back": "歡迎回來!", "white": "白", "whitepoint": "白位", "whitepoint.colortemp": "色溫", "whitepoint.colortemp.locus.blackbody": "黑暗", "whitepoint.colortemp.locus.curve": "色溫曲線", "whitepoint.colortemp.locus.daylight": "日光", "whitepoint.set": "你是否想將白位設定為測量到的數值?", "whitepoint.simulate": "模擬白位", "whitepoint.simulate.relative": "相對於目標定檔的白位", "*whitepoint.visual_editor": "Visual whitepoint editor", "*whitepoint.visual_editor.display_changed.warning": "Attention: The display configuration has changed and the visual whitepoint editor may no longer be able to correctly restore display profiles. Please check display profile associations carefully after closing the editor and restart DisplayCAL.", "whitepoint.xy": "色度坐標", "window.title": "DisplayCAL", "windows.version.unsupported": "不支援這個版本的 Windows。", "windows_only": "只可在 Windows 執行", "working_dir": "工作資料夾:", "yellow": "黃色", "yellow_lab": "黃色 L*a*b*", "yellow_xyz": "黃色 XYZ", "yes": "是", } DisplayCAL-3.5.0.0/DisplayCAL/lib/0000755000076500000000000000000013242313606016171 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/lib/__init__.py0000644000076500000000000000000112665102036020272 0ustar devwheel00000000000000#DisplayCAL-3.5.0.0/DisplayCAL/lib/agw/0000755000076500000000000000000013242313606016747 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/lib/agw/__init__.py0000644000076500000000000001366312665102036021072 0ustar devwheel00000000000000 """ This is the Advanced Generic Widgets package (AGW). It provides many custom-drawn wxPython controls: some of them can be used as a replacement of the platform native controls, others are simply an addition to the already rich wxPython widgets set. Description: AGW contains many different modules, listed below. Items labelled with an asterisk were already present in `wx.lib` before: - AdvancedSplash: reproduces the behaviour of `wx.SplashScreen`, with more advanced features like custom shapes and text animations; - AquaButton: this is another custom-drawn button class which *approximatively* mimics the behaviour of Aqua buttons on the Mac; - AUI: a pure-Python implementation of `wx.aui`, with many bug fixes and new features like HUD docking and L{AuiNotebook} tab arts; - BalloonTip: allows you to display tooltips in a balloon style window (actually a frame), similarly to the Windows XP balloon help; - ButtonPanel (*): a panel with gradient background shading with the possibility to add buttons and controls still respecting the gradient background; - CubeColourDialog: an alternative implementation of `wx.ColourDialog`, it offers different functionalities like colour wheel and RGB cube; - CustomTreeCtrl (*): mimics the behaviour of `wx.TreeCtrl`, with almost the same base functionalities plus a bunch of enhancements and goodies; - FlatMenu: as the name implies, it is a generic menu implementation, offering the same `wx.MenuBar`/`wx.Menu`/`wx.ToolBar` capabilities and much more; - FlatNotebook (*): a full implementation of the `wx.Notebook`, and designed to be a drop-in replacement for `wx.Notebook` with enhanced capabilities; - FloatSpin: this class implements a floating point spinctrl, cabable (in theory) of handling infinite-precision floating point numbers; - FoldPanelBar (*): a control that contains multiple panels that can be expanded or collapsed a la Windows Explorer/Outlook command bars; - FourWaySplitter: this is a layout manager which manages four children like four panes in a window, similar to many CAD software interfaces; - GenericMessageDialog: it is a possible replacement for the standard `wx.MessageDialog`, with a fancier look and extended functionalities; - GradientButton: another custom-drawn button class which mimics Windows CE mobile gradient buttons, using a tri-vertex blended gradient background; - HyperLinkCtrl (*): this widget acts line an hyper link in a typical browser; - HyperTreeList: a class that mimics the behaviour of `wx.gizmos.TreeListCtrl`, with almost the same base functionalities plus some more enhancements; - KnobCtrl: a widget which lets the user select a numerical value by rotating it, like a slider with a wheel shape; - LabelBook and FlatImageBook: these are a quasi-full implementations of `wx.ListBook`, with additional features; - MultiDirDialog: it represents a possible replacement for `wx.DirDialog`, with the additional ability of selecting multiple folders at once and a fancier look; - PeakMeter: this widget mimics the behaviour of LED equalizers that are usually found in stereos and MP3 players; - PersistentControls: widgets which automatically save their state when they are destroyed and restore it when they are recreated, even during another program invocation; - PieCtrl and ProgressPie: these are simple classes that reproduce the behavior of a pie chart, in a static or progress-gauge-like way; - PyBusyInfo: constructs a busy info window and displays a message in it: it is similar to `wx.BusyInfo`; - PyCollapsiblePane: a pure Python implementation of the original wxWidgets C++ code of `wx.CollapsiblePane`, with customizable buttons; - PyGauge: a generic `wx.Gauge` implementation, it supports the determinate mode functions as `wx.Gauge`; - PyProgress: it is similar to `wx.ProgressDialog` in indeterminated mode, but with a different gauge appearance and a different spinning behavior; - RibbonBar: the RibbonBar library is a set of classes for writing a ribbon user interface, similar to the user interface present in recent versions of Microsoft Office; - RulerCtrl: it implements a ruler window that can be placed on top, bottom, left or right to any wxPython widget. It is somewhat similar to the rulers you can find in text editors software; - ShapedButton: this class tries to fill the lack of "custom shaped" controls in wxPython. It can be used to build round buttons or elliptic buttons; - SpeedMeter: this widget tries to reproduce the behavior of some car controls (but not only), by creating an "angular" control; - SuperToolTip: a class that mimics the behaviour of `wx.TipWindow` and generic tooltips, with many features and highly customizable; - ThumbnailCtrl: a widget that can be used to display a series of images in a "thumbnail" format; it mimics, for example, the Windows Explorer behavior when you select the "view thumbnails" option; - ToasterBox: a cross-platform widget to make the creation of MSN-style "toaster" popups easier; - UltimateListCtrl: mimics the behaviour of `wx.ListCtrl`, with almost the same base functionalities plus some more enhancements; - ZoomBar: a class that *appoximatively* mimics the behaviour of the Mac Dock, inside a `wx.Panel`. Bugs and Limitations: many, patches and fixes welcome :-D See the demos for an example of what AGW can do, and on how to use it. Copyright: Andrea Gavana License: Same as the version of wxPython you are using it with. SVN for latest code: http://svn.wxwidgets.org/viewvc/wx/wxPython/3rdParty/AGW/ Mailing List: wxpython-users@lists.wxwidgets.org My personal web page: http://xoomer.alice.it/infinity77 Please let me know if you are using AGW! You can contact me at: andrea.gavana@gmail.com gavana@kpo.kz AGW version: 0.9.1 Last updated: 21 Jun 2011, 22.00 GMT """ __version__ = "0.9.1" __author__ = "Andrea Gavana " DisplayCAL-3.5.0.0/DisplayCAL/lib/agw/artmanager.py0000644000076500000000000021253512665102036021453 0ustar devwheel00000000000000""" This module contains drawing routines and customizations for the AGW widgets L{LabelBook} and L{FlatMenu}. """ import wx import cStringIO import random from fmresources import * # ---------------------------------------------------------------------------- # # Class DCSaver # ---------------------------------------------------------------------------- # _ = wx.GetTranslation _libimported = None if wx.Platform == "__WXMSW__": osVersion = wx.GetOsVersion() # Shadows behind menus are supported only in XP if osVersion[1] == 5 and osVersion[2] == 1: try: import win32api import win32con import winxpgui _libimported = "MH" except: try: import ctypes _libimported = "ctypes" except: pass else: _libimported = None class DCSaver(object): """ Construct a DC saver. The dc is copied as-is. """ def __init__(self, pdc): """ Default class constructor. :param `pdc`: an instance of `wx.DC`. """ self._pdc = pdc self._pen = pdc.GetPen() self._brush = pdc.GetBrush() def __del__(self): """ While destructing, restores the dc pen and brush. """ if self._pdc: self._pdc.SetPen(self._pen) self._pdc.SetBrush(self._brush) # ---------------------------------------------------------------------------- # # Class RendererBase # ---------------------------------------------------------------------------- # class RendererBase(object): """ Base class for all theme renderers. """ def __init__(self): """ Default class constructor. Intentionally empty. """ pass def DrawButtonBorders(self, dc, rect, penColour, brushColour): """ Draws borders for buttons. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `penColour`: a valid `wx.Colour` for the pen border; :param `brushColour`: a valid `wx.Colour` for the brush. """ # Keep old pen and brush dcsaver = DCSaver(dc) dc.SetPen(wx.Pen(penColour)) dc.SetBrush(wx.Brush(brushColour)) dc.DrawRectangleRect(rect) def DrawBitmapArea(self, dc, xpm_name, rect, baseColour, flipSide): """ Draws the area below a bitmap and the bitmap itself using a gradient shading. :param `dc`: an instance of `wx.DC`; :param `xpm_name`: a name of a XPM bitmap; :param `rect`: the bitmap client rectangle; :param `baseColour`: a valid `wx.Colour` for the bitmap background; :param `flipSide`: ``True`` to flip the gradient direction, ``False`` otherwise. """ # draw the gradient area if not flipSide: ArtManager.Get().PaintDiagonalGradientBox(dc, rect, wx.WHITE, ArtManager.Get().LightColour(baseColour, 20), True, False) else: ArtManager.Get().PaintDiagonalGradientBox(dc, rect, ArtManager.Get().LightColour(baseColour, 20), wx.WHITE, True, False) # draw arrow arrowDown = wx.BitmapFromXPMData(xpm_name) arrowDown.SetMask(wx.Mask(arrowDown, wx.WHITE)) dc.DrawBitmap(arrowDown, rect.x + 1 , rect.y + 1, True) def DrawBitmapBorders(self, dc, rect, penColour, bitmapBorderUpperLeftPen): """ Draws borders for a bitmap. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `penColour`: a valid `wx.Colour` for the pen border; :param `bitmapBorderUpperLeftPen`: a valid `wx.Colour` for the pen upper left border. """ # Keep old pen and brush dcsaver = DCSaver(dc) # lower right size dc.SetPen(wx.Pen(penColour)) dc.DrawLine(rect.x, rect.y + rect.height - 1, rect.x + rect.width, rect.y + rect.height - 1) dc.DrawLine(rect.x + rect.width - 1, rect.y, rect.x + rect.width - 1, rect.y + rect.height) # upper left side dc.SetPen(wx.Pen(bitmapBorderUpperLeftPen)) dc.DrawLine(rect.x, rect.y, rect.x + rect.width, rect.y) dc.DrawLine(rect.x, rect.y, rect.x, rect.y + rect.height) def GetMenuFaceColour(self): """ Returns the foreground colour for the menu. """ return ArtManager.Get().LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), 80) def GetTextColourEnable(self): """ Returns the colour used for text colour when enabled. """ return wx.BLACK def GetTextColourDisable(self): """ Returns the colour used for text colour when disabled. """ return ArtManager.Get().LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_GRAYTEXT), 30) def GetFont(self): """ Returns the font used for text. """ return wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) # ---------------------------------------------------------------------------- # # Class RendererXP # ---------------------------------------------------------------------------- # class RendererXP(RendererBase): """ Xp-Style renderer. """ def __init__(self): """ Default class constructor. """ RendererBase.__init__(self) def DrawButton(self, dc, rect, state, input=None): """ Draws a button using the XP theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `state`: the button state; :param `input`: a flag used to call the right method. """ if input is None or type(input) == type(False): self.DrawButtonTheme(dc, rect, state, input) else: self.DrawButtonColour(dc, rect, state, input) def DrawButtonTheme(self, dc, rect, state, useLightColours=None): """ Draws a button using the XP theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `state`: the button state; :param `useLightColours`: ``True`` to use light colours, ``False`` otherwise. """ # switch according to the status if state == ControlFocus: penColour = ArtManager.Get().FrameColour() brushColour = ArtManager.Get().BackgroundColour() elif state == ControlPressed: penColour = ArtManager.Get().FrameColour() brushColour = ArtManager.Get().HighlightBackgroundColour() else: penColour = ArtManager.Get().FrameColour() brushColour = ArtManager.Get().BackgroundColour() # Draw the button borders self.DrawButtonBorders(dc, rect, penColour, brushColour) def DrawButtonColour(self, dc, rect, state, colour): """ Draws a button using the XP theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `state`: the button state; :param `colour`: a valid `wx.Colour` instance. """ # switch according to the status if statet == ControlFocus: penColour = colour brushColour = ArtManager.Get().LightColour(colour, 75) elif state == ControlPressed: penColour = colour brushColour = ArtManager.Get().LightColour(colour, 60) else: penColour = colour brushColour = ArtManager.Get().LightColour(colour, 75) # Draw the button borders self.DrawButtonBorders(dc, rect, penColour, brushColour) def DrawMenuBarBg(self, dc, rect): """ Draws the menu bar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the menu bar's client rectangle. """ # For office style, we simple draw a rectangle with a gradient colouring artMgr = ArtManager.Get() vertical = artMgr.GetMBVerticalGradient() dcsaver = DCSaver(dc) # fill with gradient startColour = artMgr.GetMenuBarFaceColour() if artMgr.IsDark(startColour): startColour = artMgr.LightColour(startColour, 50) endColour = artMgr.LightColour(startColour, 90) artMgr.PaintStraightGradientBox(dc, rect, startColour, endColour, vertical) # Draw the border if artMgr.GetMenuBarBorder(): dc.SetPen(wx.Pen(startColour)) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawRectangleRect(rect) def DrawToolBarBg(self, dc, rect): """ Draws the toolbar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the toolbar's client rectangle. """ artMgr = ArtManager.Get() if not artMgr.GetRaiseToolbar(): return # For office style, we simple draw a rectangle with a gradient colouring vertical = artMgr.GetMBVerticalGradient() dcsaver = DCSaver(dc) # fill with gradient startColour = artMgr.GetMenuBarFaceColour() if artMgr.IsDark(startColour): startColour = artMgr.LightColour(startColour, 50) startColour = artMgr.LightColour(startColour, 20) endColour = artMgr.LightColour(startColour, 90) artMgr.PaintStraightGradientBox(dc, rect, startColour, endColour, vertical) artMgr.DrawBitmapShadow(dc, rect) def GetTextColourEnable(self): """ Returns the colour used for text colour when enabled. """ return wx.BLACK # ---------------------------------------------------------------------------- # # Class RendererMSOffice2007 # ---------------------------------------------------------------------------- # class RendererMSOffice2007(RendererBase): """ Windows MS Office 2007 style. """ def __init__(self): """ Default class constructor. """ RendererBase.__init__(self) def GetColoursAccordingToState(self, state): """ Returns a `wx.Colour` according to the menu item state. :param `state`: one of the following bits: ==================== ======= ========================== Item State Value Description ==================== ======= ========================== ``ControlPressed`` 0 The item is pressed ``ControlFocus`` 1 The item is focused ``ControlDisabled`` 2 The item is disabled ``ControlNormal`` 3 Normal state ==================== ======= ========================== """ # switch according to the status if state == ControlFocus: upperBoxTopPercent = 95 upperBoxBottomPercent = 50 lowerBoxTopPercent = 40 lowerBoxBottomPercent = 90 concaveUpperBox = True concaveLowerBox = True elif state == ControlPressed: upperBoxTopPercent = 75 upperBoxBottomPercent = 90 lowerBoxTopPercent = 90 lowerBoxBottomPercent = 40 concaveUpperBox = True concaveLowerBox = True elif state == ControlDisabled: upperBoxTopPercent = 100 upperBoxBottomPercent = 100 lowerBoxTopPercent = 70 lowerBoxBottomPercent = 70 concaveUpperBox = True concaveLowerBox = True else: upperBoxTopPercent = 90 upperBoxBottomPercent = 50 lowerBoxTopPercent = 30 lowerBoxBottomPercent = 75 concaveUpperBox = True concaveLowerBox = True return upperBoxTopPercent, upperBoxBottomPercent, lowerBoxTopPercent, lowerBoxBottomPercent, \ concaveUpperBox, concaveLowerBox def DrawButton(self, dc, rect, state, useLightColours): """ Draws a button using the MS Office 2007 theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `state`: the button state; :param `useLightColours`: ``True`` to use light colours, ``False`` otherwise. """ self.DrawButtonColour(dc, rect, state, ArtManager.Get().GetThemeBaseColour(useLightColours)) def DrawButtonColour(self, dc, rect, state, colour): """ Draws a button using the MS Office 2007 theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `state`: the button state; :param `colour`: a valid `wx.Colour` instance. """ artMgr = ArtManager.Get() # Keep old pen and brush dcsaver = DCSaver(dc) # Define the rounded rectangle base on the given rect # we need an array of 9 points for it baseColour = colour # Define the middle points leftPt = wx.Point(rect.x, rect.y + (rect.height / 2)) rightPt = wx.Point(rect.x + rect.width-1, rect.y + (rect.height / 2)) # Define the top region top = wx.RectPP((rect.GetLeft(), rect.GetTop()), rightPt) bottom = wx.RectPP(leftPt, (rect.GetRight(), rect.GetBottom())) upperBoxTopPercent, upperBoxBottomPercent, lowerBoxTopPercent, lowerBoxBottomPercent, \ concaveUpperBox, concaveLowerBox = self.GetColoursAccordingToState(state) topStartColour = artMgr.LightColour(baseColour, upperBoxTopPercent) topEndColour = artMgr.LightColour(baseColour, upperBoxBottomPercent) bottomStartColour = artMgr.LightColour(baseColour, lowerBoxTopPercent) bottomEndColour = artMgr.LightColour(baseColour, lowerBoxBottomPercent) artMgr.PaintStraightGradientBox(dc, top, topStartColour, topEndColour) artMgr.PaintStraightGradientBox(dc, bottom, bottomStartColour, bottomEndColour) rr = wx.Rect(rect.x, rect.y, rect.width, rect.height) dc.SetBrush(wx.TRANSPARENT_BRUSH) frameColour = artMgr.LightColour(baseColour, 60) dc.SetPen(wx.Pen(frameColour)) dc.DrawRectangleRect(rr) wc = artMgr.LightColour(baseColour, 80) dc.SetPen(wx.Pen(wc)) rr.Deflate(1, 1) dc.DrawRectangleRect(rr) def DrawMenuBarBg(self, dc, rect): """ Draws the menu bar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the menu bar's client rectangle. """ # Keep old pen and brush dcsaver = DCSaver(dc) artMgr = ArtManager.Get() baseColour = artMgr.GetMenuBarFaceColour() dc.SetBrush(wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.DrawRectangleRect(rect) # Define the rounded rectangle base on the given rect # we need an array of 9 points for it regPts = [wx.Point() for ii in xrange(9)] radius = 2 regPts[0] = wx.Point(rect.x, rect.y + radius) regPts[1] = wx.Point(rect.x+radius, rect.y) regPts[2] = wx.Point(rect.x+rect.width-radius-1, rect.y) regPts[3] = wx.Point(rect.x+rect.width-1, rect.y + radius) regPts[4] = wx.Point(rect.x+rect.width-1, rect.y + rect.height - radius - 1) regPts[5] = wx.Point(rect.x+rect.width-radius-1, rect.y + rect.height-1) regPts[6] = wx.Point(rect.x+radius, rect.y + rect.height-1) regPts[7] = wx.Point(rect.x, rect.y + rect.height - radius - 1) regPts[8] = regPts[0] # Define the middle points factor = artMgr.GetMenuBgFactor() leftPt1 = wx.Point(rect.x, rect.y + (rect.height / factor)) leftPt2 = wx.Point(rect.x, rect.y + (rect.height / factor)*(factor-1)) rightPt1 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)) rightPt2 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)*(factor-1)) # Define the top region topReg = [wx.Point() for ii in xrange(7)] topReg[0] = regPts[0] topReg[1] = regPts[1] topReg[2] = wx.Point(regPts[2].x+1, regPts[2].y) topReg[3] = wx.Point(regPts[3].x + 1, regPts[3].y) topReg[4] = wx.Point(rightPt1.x, rightPt1.y+1) topReg[5] = wx.Point(leftPt1.x, leftPt1.y+1) topReg[6] = topReg[0] # Define the middle region middle = wx.RectPP(leftPt1, wx.Point(rightPt2.x - 2, rightPt2.y)) # Define the bottom region bottom = wx.RectPP(leftPt2, wx.Point(rect.GetRight() - 1, rect.GetBottom())) topStartColour = artMgr.LightColour(baseColour, 90) topEndColour = artMgr.LightColour(baseColour, 60) bottomStartColour = artMgr.LightColour(baseColour, 40) bottomEndColour = artMgr.LightColour(baseColour, 20) topRegion = wx.RegionFromPoints(topReg) artMgr.PaintGradientRegion(dc, topRegion, topStartColour, topEndColour) artMgr.PaintStraightGradientBox(dc, bottom, bottomStartColour, bottomEndColour) artMgr.PaintStraightGradientBox(dc, middle, topEndColour, bottomStartColour) def DrawToolBarBg(self, dc, rect): """ Draws the toolbar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the toolbar's client rectangle. """ artMgr = ArtManager.Get() if not artMgr.GetRaiseToolbar(): return # Keep old pen and brush dcsaver = DCSaver(dc) baseColour = artMgr.GetMenuBarFaceColour() baseColour = artMgr.LightColour(baseColour, 20) dc.SetBrush(wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))) dc.DrawRectangleRect(rect) radius = 2 # Define the rounded rectangle base on the given rect # we need an array of 9 points for it regPts = [None]*9 regPts[0] = wx.Point(rect.x, rect.y + radius) regPts[1] = wx.Point(rect.x+radius, rect.y) regPts[2] = wx.Point(rect.x+rect.width-radius-1, rect.y) regPts[3] = wx.Point(rect.x+rect.width-1, rect.y + radius) regPts[4] = wx.Point(rect.x+rect.width-1, rect.y + rect.height - radius - 1) regPts[5] = wx.Point(rect.x+rect.width-radius-1, rect.y + rect.height-1) regPts[6] = wx.Point(rect.x+radius, rect.y + rect.height-1) regPts[7] = wx.Point(rect.x, rect.y + rect.height - radius - 1) regPts[8] = regPts[0] # Define the middle points factor = artMgr.GetMenuBgFactor() leftPt1 = wx.Point(rect.x, rect.y + (rect.height / factor)) rightPt1 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)) leftPt2 = wx.Point(rect.x, rect.y + (rect.height / factor)*(factor-1)) rightPt2 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)*(factor-1)) # Define the top region topReg = [None]*7 topReg[0] = regPts[0] topReg[1] = regPts[1] topReg[2] = wx.Point(regPts[2].x+1, regPts[2].y) topReg[3] = wx.Point(regPts[3].x + 1, regPts[3].y) topReg[4] = wx.Point(rightPt1.x, rightPt1.y+1) topReg[5] = wx.Point(leftPt1.x, leftPt1.y+1) topReg[6] = topReg[0] # Define the middle region middle = wx.RectPP(leftPt1, wx.Point(rightPt2.x - 2, rightPt2.y)) # Define the bottom region bottom = wx.RectPP(leftPt2, wx.Point(rect.GetRight() - 1, rect.GetBottom())) topStartColour = artMgr.LightColour(baseColour, 90) topEndColour = artMgr.LightColour(baseColour, 60) bottomStartColour = artMgr.LightColour(baseColour, 40) bottomEndColour = artMgr.LightColour(baseColour, 20) topRegion = wx.RegionFromPoints(topReg) artMgr.PaintGradientRegion(dc, topRegion, topStartColour, topEndColour) artMgr.PaintStraightGradientBox(dc, bottom, bottomStartColour, bottomEndColour) artMgr.PaintStraightGradientBox(dc, middle, topEndColour, bottomStartColour) artMgr.DrawBitmapShadow(dc, rect) def GetTextColourEnable(self): """ Returns the colour used for text colour when enabled. """ return wx.NamedColour("MIDNIGHT BLUE") # ---------------------------------------------------------------------------- # # Class ArtManager # ---------------------------------------------------------------------------- # class ArtManager(wx.EvtHandler): """ This class provides various art utilities, such as creating shadow, providing lighter / darker colours for a given colour, etc... """ _alignmentBuffer = 7 _menuTheme = StyleXP _verticalGradient = False _renderers = {StyleXP: None, Style2007: None} _bmpShadowEnabled = False _ms2007sunken = False _drowMBBorder = True _menuBgFactor = 5 _menuBarColourScheme = _("Default") _raiseTB = True _bitmaps = {} _transparency = 255 def __init__(self): """ Default class constructor. """ wx.EvtHandler.__init__(self) self._menuBarBgColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE) # connect an event handler to the system colour change event self.Bind(wx.EVT_SYS_COLOUR_CHANGED, self.OnSysColourChange) def SetTransparency(self, amount): """ Sets the alpha channel value for transparent windows. :param `amount`: the actual transparency value (between 0 and 255). """ if self._transparency == amount: return if amount < 0 or amount > 255: raise Exception("Invalid transparency value") self._transparency = amount def GetTransparency(self): """ Returns the alpha channel value for transparent windows. """ return self._transparency def ConvertToBitmap(self, xpm, alpha=None): """ Convert the given image to a bitmap, optionally overlaying an alpha channel to it. :param `xpm`: a list of strings formatted as XPM; :param `alpha`: a list of alpha values, the same size as the xpm bitmap. """ if alpha is not None: img = wx.BitmapFromXPMData(xpm) img = img.ConvertToImage() x, y = img.GetWidth(), img.GetHeight() img.InitAlpha() for jj in xrange(y): for ii in xrange(x): img.SetAlpha(ii, jj, alpha[jj*x+ii]) else: stream = cStringIO.StringIO(xpm) img = wx.ImageFromStream(stream) return wx.BitmapFromImage(img) def Initialize(self): """ Initializes the bitmaps and colours. """ # create wxBitmaps from the xpm's self._rightBottomCorner = self.ConvertToBitmap(shadow_center_xpm, shadow_center_alpha) self._bottom = self.ConvertToBitmap(shadow_bottom_xpm, shadow_bottom_alpha) self._bottomLeft = self.ConvertToBitmap(shadow_bottom_left_xpm, shadow_bottom_left_alpha) self._rightTop = self.ConvertToBitmap(shadow_right_top_xpm, shadow_right_top_alpha) self._right = self.ConvertToBitmap(shadow_right_xpm, shadow_right_alpha) # initialise the colour map self.InitColours() self.SetMenuBarColour(self._menuBarColourScheme) # Create common bitmaps self.FillStockBitmaps() def FillStockBitmaps(self): """ Initializes few standard bitmaps. """ bmp = self.ConvertToBitmap(arrow_down, alpha=None) bmp.SetMask(wx.Mask(bmp, wx.Colour(0, 128, 128))) self._bitmaps.update({"arrow_down": bmp}) bmp = self.ConvertToBitmap(arrow_up, alpha=None) bmp.SetMask(wx.Mask(bmp, wx.Colour(0, 128, 128))) self._bitmaps.update({"arrow_up": bmp}) def GetStockBitmap(self, name): """ Returns a bitmap from a stock. :param `name`: the bitmap name. :return: The stock bitmap, if `name` was found in the stock bitmap dictionary. Othewise, `wx.NullBitmap` is returned. """ if self._bitmaps.has_key(name): return self._bitmaps[name] return wx.NullBitmap def Get(self): """ Accessor to the unique art manager object. """ if not hasattr(self, "_instance"): self._instance = ArtManager() self._instance.Initialize() # Initialize the renderers map self._renderers[StyleXP] = RendererXP() self._renderers[Style2007] = RendererMSOffice2007() return self._instance Get = classmethod(Get) def Free(self): """ Destructor for the unique art manager object. """ if hasattr(self, "_instance"): del self._instance Free = classmethod(Free) def OnSysColourChange(self, event): """ Handles the ``wx.EVT_SYS_COLOUR_CHANGED`` event for L{ArtManager}. :param `event`: a `wx.SysColourChangedEvent` event to be processed. """ # reinitialise the colour map self.InitColours() def LightColour(self, colour, percent): """ Return light contrast of `colour`. The colour returned is from the scale of `colour` ==> white. :param `colour`: the input colour to be brightened; :param `percent`: determines how light the colour will be. `percent` = 100 returns white, `percent` = 0 returns `colour`. """ end_colour = wx.WHITE rd = end_colour.Red() - colour.Red() gd = end_colour.Green() - colour.Green() bd = end_colour.Blue() - colour.Blue() high = 100 # We take the percent way of the colour from colour -. white i = percent r = colour.Red() + ((i*rd*100)/high)/100 g = colour.Green() + ((i*gd*100)/high)/100 b = colour.Blue() + ((i*bd*100)/high)/100 return wx.Colour(r, g, b) def DarkColour(self, colour, percent): """ Like the L{LightColour} function, but create the colour darker by `percent`. :param `colour`: the input colour to be darkened; :param `percent`: determines how dark the colour will be. `percent` = 100 returns black, `percent` = 0 returns `colour`. """ end_colour = wx.BLACK rd = end_colour.Red() - colour.Red() gd = end_colour.Green() - colour.Green() bd = end_colour.Blue() - colour.Blue() high = 100 # We take the percent way of the colour from colour -. white i = percent r = colour.Red() + ((i*rd*100)/high)/100 g = colour.Green() + ((i*gd*100)/high)/100 b = colour.Blue() + ((i*bd*100)/high)/100 return wx.Colour(r, g, b) def PaintStraightGradientBox(self, dc, rect, startColour, endColour, vertical=True): """ Paint the rectangle with gradient colouring; the gradient lines are either horizontal or vertical. :param `dc`: an instance of `wx.DC`; :param `rect`: the rectangle to be filled with gradient shading; :param `startColour`: the first colour of the gradient shading; :param `endColour`: the second colour of the gradient shading; :param `vertical`: ``True`` for gradient colouring in the vertical direction, ``False`` for horizontal shading. """ dcsaver = DCSaver(dc) if vertical: high = rect.GetHeight()-1 direction = wx.SOUTH else: high = rect.GetWidth()-1 direction = wx.EAST if high < 1: return dc.GradientFillLinear(rect, startColour, endColour, direction) def PaintGradientRegion(self, dc, region, startColour, endColour, vertical=True): """ Paint a region with gradient colouring. :param `dc`: an instance of `wx.DC`; :param `region`: a region to be filled with gradient shading (an instance of `wx.Region`); :param `startColour`: the first colour of the gradient shading; :param `endColour`: the second colour of the gradient shading; :param `vertical`: ``True`` for gradient colouring in the vertical direction, ``False`` for horizontal shading. """ # The way to achieve non-rectangle memDC = wx.MemoryDC() rect = region.GetBox() bitmap = wx.EmptyBitmap(rect.width, rect.height) memDC.SelectObject(bitmap) # Colour the whole rectangle with gradient rr = wx.Rect(0, 0, rect.width, rect.height) self.PaintStraightGradientBox(memDC, rr, startColour, endColour, vertical) # Convert the region to a black and white bitmap with the white pixels being inside the region # we draw the bitmap over the gradient coloured rectangle, with mask set to white, # this will cause our region to be coloured with the gradient, while area outside the # region will be painted with black. then we simply draw the bitmap to the dc with mask set to # black tmpRegion = wx.Region(rect.x, rect.y, rect.width, rect.height) tmpRegion.Offset(-rect.x, -rect.y) regionBmp = tmpRegion.ConvertToBitmap() regionBmp.SetMask(wx.Mask(regionBmp, wx.WHITE)) # The function ConvertToBitmap() return a rectangle bitmap # which is shorter by 1 pixl on the height and width (this is correct behavior, since # DrawLine does not include the second point as part of the line) # we fix this issue by drawing our own line at the bottom and left side of the rectangle memDC.SetPen(wx.BLACK_PEN) memDC.DrawBitmap(regionBmp, 0, 0, True) memDC.DrawLine(0, rr.height - 1, rr.width, rr.height - 1) memDC.DrawLine(rr.width - 1, 0, rr.width - 1, rr.height) memDC.SelectObject(wx.NullBitmap) bitmap.SetMask(wx.Mask(bitmap, wx.BLACK)) dc.DrawBitmap(bitmap, rect.x, rect.y, True) def PaintDiagonalGradientBox(self, dc, rect, startColour, endColour, startAtUpperLeft=True, trimToSquare=True): """ Paint rectangle with gradient colouring; the gradient lines are diagonal and may start from the upper left corner or from the upper right corner. :param `dc`: an instance of `wx.DC`; :param `rect`: the rectangle to be filled with gradient shading; :param `startColour`: the first colour of the gradient shading; :param `endColour`: the second colour of the gradient shading; :param `startAtUpperLeft`: ``True`` to start the gradient lines at the upper left corner of the rectangle, ``False`` to start at the upper right corner; :param `trimToSquare`: ``True`` to trim the gradient lines in a square. """ # Save the current pen and brush savedPen = dc.GetPen() savedBrush = dc.GetBrush() # gradient fill from colour 1 to colour 2 with top to bottom if rect.height < 1 or rect.width < 1: return # calculate some basic numbers size = rect.width sizeX = sizeY = 0 proportion = 1 if rect.width > rect.height: if trimToSquare: size = rect.height sizeX = sizeY = rect.height - 1 else: proportion = float(rect.height)/float(rect.width) size = rect.width sizeX = rect.width - 1 sizeY = rect.height -1 else: if trimToSquare: size = rect.width sizeX = sizeY = rect.width - 1 else: sizeX = rect.width - 1 size = rect.height sizeY = rect.height - 1 proportion = float(rect.width)/float(rect.height) # calculate gradient coefficients col2 = endColour col1 = startColour rf, gf, bf = 0, 0, 0 rstep = float(col2.Red() - col1.Red())/float(size) gstep = float(col2.Green() - col1.Green())/float(size) bstep = float(col2.Blue() - col1.Blue())/float(size) # draw the upper triangle for i in xrange(size): currCol = wx.Colour(col1.Red() + rf, col1.Green() + gf, col1.Blue() + bf) dc.SetBrush(wx.Brush(currCol, wx.SOLID)) dc.SetPen(wx.Pen(currCol)) if startAtUpperLeft: if rect.width > rect.height: dc.DrawLine(rect.x + i, rect.y, rect.x, int(rect.y + proportion*i)) dc.DrawPoint(rect.x, int(rect.y + proportion*i)) else: dc.DrawLine(int(rect.x + proportion*i), rect.y, rect.x, rect.y + i) dc.DrawPoint(rect.x, rect.y + i) else: if rect.width > rect.height: dc.DrawLine(rect.x + sizeX - i, rect.y, rect.x + sizeX, int(rect.y + proportion*i)) dc.DrawPoint(rect.x + sizeX, int(rect.y + proportion*i)) else: xTo = (int(rect.x + sizeX - proportion * i) > rect.x and [int(rect.x + sizeX - proportion*i)] or [rect.x])[0] dc.DrawLine(xTo, rect.y, rect.x + sizeX, rect.y + i) dc.DrawPoint(rect.x + sizeX, rect.y + i) rf += rstep/2 gf += gstep/2 bf += bstep/2 # draw the lower triangle for i in xrange(size): currCol = wx.Colour(col1.Red() + rf, col1.Green() + gf, col1.Blue() + bf) dc.SetBrush(wx.Brush(currCol, wx.SOLID)) dc.SetPen(wx.Pen(currCol)) if startAtUpperLeft: if rect.width > rect.height: dc.DrawLine(rect.x + i, rect.y + sizeY, rect.x + sizeX, int(rect.y + proportion * i)) dc.DrawPoint(rect.x + sizeX, int(rect.y + proportion * i)) else: dc.DrawLine(int(rect.x + proportion * i), rect.y + sizeY, rect.x + sizeX, rect.y + i) dc.DrawPoint(rect.x + sizeX, rect.y + i) else: if rect.width > rect.height: dc.DrawLine(rect.x, (int)(rect.y + proportion * i), rect.x + sizeX - i, rect.y + sizeY) dc.DrawPoint(rect.x + sizeX - i, rect.y + sizeY) else: xTo = (int(rect.x + sizeX - proportion*i) > rect.x and [int(rect.x + sizeX - proportion*i)] or [rect.x])[0] dc.DrawLine(rect.x, rect.y + i, xTo, rect.y + sizeY) dc.DrawPoint(xTo, rect.y + sizeY) rf += rstep/2 gf += gstep/2 bf += bstep/2 # Restore the pen and brush dc.SetPen( savedPen ) dc.SetBrush( savedBrush ) def PaintCrescentGradientBox(self, dc, rect, startColour, endColour, concave=True): """ Paint a region with gradient colouring. The gradient is in crescent shape which fits the 2007 style. :param `dc`: an instance of `wx.DC`; :param `rect`: the rectangle to be filled with gradient shading; :param `startColour`: the first colour of the gradient shading; :param `endColour`: the second colour of the gradient shading; :param `concave`: ``True`` for a concave effect, ``False`` for a convex one. """ diagonalRectWidth = rect.GetWidth()/4 spare = rect.width - 4*diagonalRectWidth leftRect = wx.Rect(rect.x, rect.y, diagonalRectWidth, rect.GetHeight()) rightRect = wx.Rect(rect.x + 3 * diagonalRectWidth + spare, rect.y, diagonalRectWidth, rect.GetHeight()) if concave: self.PaintStraightGradientBox(dc, rect, self.MixColours(startColour, endColour, 50), endColour) self.PaintDiagonalGradientBox(dc, leftRect, startColour, endColour, True, False) self.PaintDiagonalGradientBox(dc, rightRect, startColour, endColour, False, False) else: self.PaintStraightGradientBox(dc, rect, endColour, self.MixColours(endColour, startColour, 50)) self.PaintDiagonalGradientBox(dc, leftRect, endColour, startColour, False, False) self.PaintDiagonalGradientBox(dc, rightRect, endColour, startColour, True, False) def FrameColour(self): """ Return the surrounding colour for a control. """ return wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION) def BackgroundColour(self): """ Returns the background colour of a control when not in focus. """ return self.LightColour(self.FrameColour(), 75) def HighlightBackgroundColour(self): """ Returns the background colour of a control when it is in focus. """ return self.LightColour(self.FrameColour(), 60) def MixColours(self, firstColour, secondColour, percent): """ Return mix of input colours. :param `firstColour`: the first colour to be mixed, an instance of `wx.Colour`; :param `secondColour`: the second colour to be mixed, an instance of `wx.Colour`; :param `percent`: the relative percentage of `firstColour` with respect to `secondColour`. """ # calculate gradient coefficients redOffset = float((secondColour.Red() * (100 - percent) / 100) - (firstColour.Red() * percent / 100)) greenOffset = float((secondColour.Green() * (100 - percent) / 100) - (firstColour.Green() * percent / 100)) blueOffset = float((secondColour.Blue() * (100 - percent) / 100) - (firstColour.Blue() * percent / 100)) return wx.Colour(firstColour.Red() + redOffset, firstColour.Green() + greenOffset, firstColour.Blue() + blueOffset) def RandomColour(): """ Creates a random colour. """ r = random.randint(0, 255) # Random value betweem 0-255 g = random.randint(0, 255) # Random value betweem 0-255 b = random.randint(0, 255) # Random value betweem 0-255 return wx.Colour(r, g, b) def IsDark(self, colour): """ Returns whether a colour is dark or light. :param `colour`: an instance of `wx.Colour`. """ evg = (colour.Red() + colour.Green() + colour.Blue())/3 if evg < 127: return True return False def TruncateText(self, dc, text, maxWidth): """ Truncates a given string to fit given width size. if the text does not fit into the given width it is truncated to fit. the format of the fixed text is . :param `dc`: an instance of `wx.DC`; :param `text`: the text to be (eventually) truncated; :param `maxWidth`: the maximum width allowed for the text. """ textLen = len(text) tempText = text rectSize = maxWidth fixedText = "" textW, textH = dc.GetTextExtent(text) if rectSize >= textW: return text # The text does not fit in the designated area, # so we need to truncate it a bit suffix = ".." w, h = dc.GetTextExtent(suffix) rectSize -= w for i in xrange(textLen, -1, -1): textW, textH = dc.GetTextExtent(tempText) if rectSize >= textW: fixedText = tempText fixedText += ".." return fixedText tempText = tempText[:-1] def DrawButton(self, dc, rect, theme, state, input=None): """ Colour rectangle according to the theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the rectangle to be filled with gradient shading; :param `theme`: the theme to use to draw the button; :param `state`: the button state; :param `input`: a flag used to call the right method. """ if input is None or type(input) == type(False): self.DrawButtonTheme(dc, rect, theme, state, input) else: self.DrawButtonColour(dc, rect, theme, state, input) def DrawButtonTheme(self, dc, rect, theme, state, useLightColours=True): """ Draws a button using the appropriate theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `theme`: the theme to use to draw the button; :param `state`: the button state; :param `useLightColours`: ``True`` to use light colours, ``False`` otherwise. """ renderer = self._renderers[theme] # Set background colour if non given by caller renderer.DrawButton(dc, rect, state, useLightColours) def DrawButtonColour(self, dc, rect, theme, state, colour): """ Draws a button using the appropriate theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the button's client rectangle; :param `theme`: the theme to use to draw the button; :param `state`: the button state; :param `colour`: a valid `wx.Colour` instance. """ renderer = self._renderers[theme] renderer.DrawButton(dc, rect, state, colour) def CanMakeWindowsTransparent(self): """ Used internally. :return: ``True`` if the system supports transparency of toplevel windows, otherwise returns ``False``. """ if wx.Platform == "__WXMSW__": version = wx.GetOsDescription() found = version.find("XP") >= 0 or version.find("2000") >= 0 or version.find("NT") >= 0 return found elif wx.Platform == "__WXMAC__": return True else: return False # on supported windows systems (Win2000 and greater), this function # will make a frame window transparent by a certain amount def MakeWindowTransparent(self, wnd, amount): """ Used internally. Makes a toplevel window transparent if the system supports it. :param `wnd`: the toplevel window to make transparent; :param `amount`: the window transparency to apply. """ if wnd.GetSize() == (0, 0): return # this API call is not in all SDKs, only the newer ones, so # we will runtime bind this if wx.Platform == "__WXMSW__": hwnd = wnd.GetHandle() if not hasattr(self, "_winlib"): if _libimported == "MH": self._winlib = win32api.LoadLibrary("user32") elif _libimported == "ctypes": self._winlib = ctypes.windll.user32 if _libimported == "MH": pSetLayeredWindowAttributes = win32api.GetProcAddress(self._winlib, "SetLayeredWindowAttributes") if pSetLayeredWindowAttributes is None: return exstyle = win32api.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) if 0 == (exstyle & 0x80000): win32api.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, exstyle | 0x80000) winxpgui.SetLayeredWindowAttributes(hwnd, 0, amount, 2) elif _libimported == "ctypes": style = self._winlib.GetWindowLongA(hwnd, 0xffffffecL) style |= 0x00080000 self._winlib.SetWindowLongA(hwnd, 0xffffffecL, style) self._winlib.SetLayeredWindowAttributes(hwnd, 0, amount, 2) else: if not wnd.CanSetTransparent(): return wnd.SetTransparent(amount) return # assumption: the background was already drawn on the dc def DrawBitmapShadow(self, dc, rect, where=BottomShadow|RightShadow): """ Draws a shadow using background bitmap. :param `dc`: an instance of `wx.DC`; :param `rect`: the bitmap's client rectangle; :param `where`: where to draw the shadow. This can be any combination of the following bits: ========================== ======= ================================ Shadow Settings Value Description ========================== ======= ================================ ``RightShadow`` 1 Right side shadow ``BottomShadow`` 2 Not full bottom shadow ``BottomShadowFull`` 4 Full bottom shadow ========================== ======= ================================ """ shadowSize = 5 # the rect must be at least 5x5 pixles if rect.height < 2*shadowSize or rect.width < 2*shadowSize: return # Start by drawing the right bottom corner if where & BottomShadow or where & BottomShadowFull: dc.DrawBitmap(self._rightBottomCorner, rect.x+rect.width, rect.y+rect.height, True) # Draw right side shadow xx = rect.x + rect.width yy = rect.y + rect.height - shadowSize if where & RightShadow: while yy - rect.y > 2*shadowSize: dc.DrawBitmap(self._right, xx, yy, True) yy -= shadowSize dc.DrawBitmap(self._rightTop, xx, yy - shadowSize, True) if where & BottomShadow: xx = rect.x + rect.width - shadowSize yy = rect.height + rect.y while xx - rect.x > 2*shadowSize: dc.DrawBitmap(self._bottom, xx, yy, True) xx -= shadowSize dc.DrawBitmap(self._bottomLeft, xx - shadowSize, yy, True) if where & BottomShadowFull: xx = rect.x + rect.width - shadowSize yy = rect.height + rect.y while xx - rect.x >= 0: dc.DrawBitmap(self._bottom, xx, yy, True) xx -= shadowSize dc.DrawBitmap(self._bottom, xx, yy, True) def DropShadow(self, wnd, drop=True): """ Adds a shadow under the window (Windows Only). :param `wnd`: the window for which we are dropping a shadow; :param `drop`: ``True`` to drop a shadow, ``False`` to remove it. """ if not self.CanMakeWindowsTransparent() or not _libimported: return if "__WXMSW__" in wx.Platform: hwnd = wnd.GetHandle() if not hasattr(self, "_winlib"): if _libimported == "MH": self._winlib = win32api.LoadLibrary("user32") elif _libimported == "ctypes": self._winlib = ctypes.windll.user32 if _libimported == "MH": csstyle = win32api.GetWindowLong(hwnd, win32con.GCL_STYLE) else: csstyle = self._winlib.GetWindowLongA(hwnd, win32con.GCL_STYLE) if drop: if csstyle & CS_DROPSHADOW: return else: csstyle |= CS_DROPSHADOW #Nothing to be done else: if csstyle & CS_DROPSHADOW: csstyle &= ~(CS_DROPSHADOW) else: return #Nothing to be done win32api.SetWindowLong(hwnd, win32con.GCL_STYLE, csstyle) def GetBitmapStartLocation(self, dc, rect, bitmap, text="", style=0): """ Returns the top left `x` and `y` cordinates of the bitmap drawing. :param `dc`: an instance of `wx.DC`; :param `rect`: the bitmap's client rectangle; :param `bitmap`: the bitmap associated with the button; :param `text`: the button label; :param `style`: the button style. This can be one of the following bits: ============================== ======= ================================ Button style Value Description ============================== ======= ================================ ``BU_EXT_XP_STYLE`` 1 A button with a XP style ``BU_EXT_2007_STYLE`` 2 A button with a MS Office 2007 style ``BU_EXT_LEFT_ALIGN_STYLE`` 4 A left-aligned button ``BU_EXT_CENTER_ALIGN_STYLE`` 8 A center-aligned button ``BU_EXT_RIGHT_ALIGN_STYLE`` 16 A right-aligned button ``BU_EXT_RIGHT_TO_LEFT_STYLE`` 32 A button suitable for right-to-left languages ============================== ======= ================================ """ alignmentBuffer = self.GetAlignBuffer() # get the startLocationY fixedTextWidth = fixedTextHeight = 0 if not text: fixedTextHeight = bitmap.GetHeight() else: fixedTextWidth, fixedTextHeight = dc.GetTextExtent(text) startLocationY = rect.y + (rect.height - fixedTextHeight)/2 # get the startLocationX if style & BU_EXT_RIGHT_TO_LEFT_STYLE: startLocationX = rect.x + rect.width - alignmentBuffer - bitmap.GetWidth() else: if style & BU_EXT_RIGHT_ALIGN_STYLE: maxWidth = rect.x + rect.width - (2 * alignmentBuffer) - bitmap.GetWidth() # the alignment is for both sides # get the truncaed text. The text may stay as is, it is not a must that is will be trancated fixedText = self.TruncateText(dc, text, maxWidth) # get the fixed text dimentions fixedTextWidth, fixedTextHeight = dc.GetTextExtent(fixedText) # calculate the start location startLocationX = maxWidth - fixedTextWidth elif style & BU_EXT_LEFT_ALIGN_STYLE: # calculate the start location startLocationX = alignmentBuffer else: # meaning BU_EXT_CENTER_ALIGN_STYLE maxWidth = rect.x + rect.width - (2 * alignmentBuffer) - bitmap.GetWidth() # the alignment is for both sides # get the truncaed text. The text may stay as is, it is not a must that is will be trancated fixedText = self.TruncateText(dc, text, maxWidth) # get the fixed text dimentions fixedTextWidth, fixedTextHeight = dc.GetTextExtent(fixedText) if maxWidth > fixedTextWidth: # calculate the start location startLocationX = (maxWidth - fixedTextWidth) / 2 else: # calculate the start location startLocationX = maxWidth - fixedTextWidth # it is very important to validate that the start location is not less than the alignment buffer if startLocationX < alignmentBuffer: startLocationX = alignmentBuffer return startLocationX, startLocationY def GetTextStartLocation(self, dc, rect, bitmap, text, style=0): """ Returns the top left `x` and `y` cordinates of the text drawing. In case the text is too long, the text is being fixed (the text is cut and a '...' mark is added in the end). :param `dc`: an instance of `wx.DC`; :param `rect`: the text's client rectangle; :param `bitmap`: the bitmap associated with the button; :param `text`: the button label; :param `style`: the button style. :see: L{GetBitmapStartLocation} for a list of valid button styles. """ alignmentBuffer = self.GetAlignBuffer() # get the bitmap offset bitmapOffset = 0 if bitmap != wx.NullBitmap: bitmapOffset = bitmap.GetWidth() # get the truncated text. The text may stay as is, it is not a must that is will be trancated maxWidth = rect.x + rect.width - (2 * alignmentBuffer) - bitmapOffset # the alignment is for both sides fixedText = self.TruncateText(dc, text, maxWidth) # get the fixed text dimentions fixedTextWidth, fixedTextHeight = dc.GetTextExtent(fixedText) startLocationY = (rect.height - fixedTextHeight) / 2 + rect.y # get the startLocationX if style & BU_EXT_RIGHT_TO_LEFT_STYLE: startLocationX = maxWidth - fixedTextWidth + alignmentBuffer else: if style & BU_EXT_LEFT_ALIGN_STYLE: # calculate the start location startLocationX = bitmapOffset + alignmentBuffer elif style & BU_EXT_RIGHT_ALIGN_STYLE: # calculate the start location startLocationX = maxWidth - fixedTextWidth + bitmapOffset + alignmentBuffer else: # meaning wxBU_EXT_CENTER_ALIGN_STYLE # calculate the start location startLocationX = (maxWidth - fixedTextWidth) / 2 + bitmapOffset + alignmentBuffer # it is very important to validate that the start location is not less than the alignment buffer if startLocationX < alignmentBuffer: startLocationX = alignmentBuffer return startLocationX, startLocationY, fixedText def DrawTextAndBitmap(self, dc, rect, text, enable=True, font=wx.NullFont, fontColour=wx.BLACK, bitmap=wx.NullBitmap, grayBitmap=wx.NullBitmap, style=0): """ Draws the text & bitmap on the input dc. :param `dc`: an instance of `wx.DC`; :param `rect`: the text and bitmap client rectangle; :param `text`: the button label; :param `enable`: ``True`` if the button is enabled, ``False`` otherwise; :param `font`: the font to use to draw the text, an instance of `wx.Font`; :param `fontColour`: the colour to use to draw the text, an instance of `wx.Colour`; :param `bitmap`: the bitmap associated with the button; :param `grayBitmap`: a greyed-out version of the input `bitmap` representing a disabled bitmap; :param `style`: the button style. :see: L{GetBitmapStartLocation} for a list of valid button styles. """ # enable colours if enable: dc.SetTextForeground(fontColour) else: dc.SetTextForeground(wx.SystemSettings_GetColour(wx.SYS_COLOUR_GRAYTEXT)) # set the font if font == wx.NullFont: font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) dc.SetFont(font) startLocationX = startLocationY = 0 if bitmap != wx.NullBitmap: # calculate the bitmap start location startLocationX, startLocationY = self.GetBitmapStartLocation(dc, rect, bitmap, text, style) # draw the bitmap if enable: dc.DrawBitmap(bitmap, startLocationX, startLocationY, True) else: dc.DrawBitmap(grayBitmap, startLocationX, startLocationY, True) # calculate the text start location location, labelOnly = self.GetAccelIndex(text) startLocationX, startLocationY, fixedText = self.GetTextStartLocation(dc, rect, bitmap, labelOnly, style) # after all the caculations are finished, it is time to draw the text # underline the first letter that is marked with a '&' if location == -1 or font.GetUnderlined() or location >= len(fixedText): # draw the text dc.DrawText(fixedText, startLocationX, startLocationY) else: # underline the first '&' before = fixedText[0:location] underlineLetter = fixedText[location] after = fixedText[location+1:] # before dc.DrawText(before, startLocationX, startLocationY) # underlineLetter if "__WXGTK__" not in wx.Platform: w1, h = dc.GetTextExtent(before) font.SetUnderlined(True) dc.SetFont(font) dc.DrawText(underlineLetter, startLocationX + w1, startLocationY) else: w1, h = dc.GetTextExtent(before) dc.DrawText(underlineLetter, startLocationX + w1, startLocationY) # Draw the underline ourselves since using the Underline in GTK, # causes the line to be too close to the letter uderlineLetterW, uderlineLetterH = dc.GetTextExtent(underlineLetter) curPen = dc.GetPen() dc.SetPen(wx.BLACK_PEN) dc.DrawLine(startLocationX + w1, startLocationY + uderlineLetterH - 2, startLocationX + w1 + uderlineLetterW, startLocationY + uderlineLetterH - 2) dc.SetPen(curPen) # after w2, h = dc.GetTextExtent(underlineLetter) font.SetUnderlined(False) dc.SetFont(font) dc.DrawText(after, startLocationX + w1 + w2, startLocationY) def CalcButtonBestSize(self, label, bmp): """ Returns the best fit size for the supplied label & bitmap. :param `label`: the button label; :param `bmp`: the bitmap associated with the button. """ if "__WXMSW__" in wx.Platform: HEIGHT = 22 else: HEIGHT = 26 dc = wx.MemoryDC() dc.SelectBitmap(wx.EmptyBitmap(1, 1)) dc.SetFont(wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)) width, height, dummy = dc.GetMultiLineTextExtent(label) width += 2*self.GetAlignBuffer() if bmp.Ok(): # allocate extra space for the bitmap heightBmp = bmp.GetHeight() + 2 if height < heightBmp: height = heightBmp width += bmp.GetWidth() + 2 if height < HEIGHT: height = HEIGHT dc.SelectBitmap(wx.NullBitmap) return wx.Size(width, height) def GetMenuFaceColour(self): """ Returns the colour used for the menu foreground. """ renderer = self._renderers[self.GetMenuTheme()] return renderer.GetMenuFaceColour() def GetTextColourEnable(self): """ Returns the colour used for enabled menu items. """ renderer = self._renderers[self.GetMenuTheme()] return renderer.GetTextColourEnable() def GetTextColourDisable(self): """ Returns the colour used for disabled menu items. """ renderer = self._renderers[self.GetMenuTheme()] return renderer.GetTextColourDisable() def GetFont(self): """ Returns the font used by this theme. """ renderer = self._renderers[self.GetMenuTheme()] return renderer.GetFont() def GetAccelIndex(self, label): """ Returns the mnemonic index of the label and the label stripped of the ampersand mnemonic (e.g. 'lab&el' ==> will result in 3 and labelOnly = label). :param `label`: a string containining an ampersand. """ indexAccel = 0 while True: indexAccel = label.find("&", indexAccel) if indexAccel == -1: return indexAccel, label if label[indexAccel:indexAccel+2] == "&&": label = label[0:indexAccel] + label[indexAccel+1:] indexAccel += 1 else: break labelOnly = label[0:indexAccel] + label[indexAccel+1:] return indexAccel, labelOnly def GetThemeBaseColour(self, useLightColours=True): """ Returns the theme (Blue, Silver, Green etc.) base colour, if no theme is active it return the active caption colour, lighter in 30%. :param `useLightColours`: ``True`` to use light colours, ``False`` otherwise. """ if not useLightColours and not self.IsDark(self.FrameColour()): return wx.NamedColour("GOLD") else: return self.LightColour(self.FrameColour(), 30) def GetAlignBuffer(self): """ Return the padding buffer for a text or bitmap. """ return self._alignmentBuffer def SetMenuTheme(self, theme): """ Set the menu theme, possible values (Style2007, StyleXP, StyleVista). :param `theme`: a rendering theme class, either `StyleXP`, `Style2007` or `StyleVista`. """ self._menuTheme = theme def GetMenuTheme(self): """ Returns the currently used menu theme. """ return self._menuTheme def AddMenuTheme(self, render): """ Adds a new theme to the stock. :param `render`: a rendering theme class, which must be derived from L{RendererBase}. """ # Add new theme lastRenderer = len(self._renderers) self._renderers[lastRenderer] = render return lastRenderer def SetMS2007ButtonSunken(self, sunken): """ Sets MS 2007 button style sunken or not. :param `sunken`: ``True`` to have a sunken border effect, ``False`` otherwise. """ self._ms2007sunken = sunken def GetMS2007ButtonSunken(self): """ Returns the sunken flag for MS 2007 buttons. """ return self._ms2007sunken def GetMBVerticalGradient(self): """ Returns ``True`` if the menu bar should be painted with vertical gradient. """ return self._verticalGradient def SetMBVerticalGradient(self, v): """ Sets the menu bar gradient style. :param `v`: ``True`` for a vertical shaded gradient, ``False`` otherwise. """ self._verticalGradient = v def DrawMenuBarBorder(self, border): """ Enables menu border drawing (XP style only). :param `border`: ``True`` to draw the menubar border, ``False`` otherwise. """ self._drowMBBorder = border def GetMenuBarBorder(self): """ Returns menu bar border drawing flag. """ return self._drowMBBorder def GetMenuBgFactor(self): """ Gets the visibility depth of the menu in Metallic style. The higher the value, the menu bar will look more raised """ return self._menuBgFactor def DrawDragSash(self, rect): """ Draws resize sash. :param `rect`: the sash client rectangle. """ dc = wx.ScreenDC() mem_dc = wx.MemoryDC() bmp = wx.EmptyBitmap(rect.width, rect.height) mem_dc.SelectObject(bmp) mem_dc.SetBrush(wx.WHITE_BRUSH) mem_dc.SetPen(wx.Pen(wx.WHITE, 1)) mem_dc.DrawRectangle(0, 0, rect.width, rect.height) dc.Blit(rect.x, rect.y, rect.width, rect.height, mem_dc, 0, 0, wx.XOR) def TakeScreenShot(self, rect, bmp): """ Takes a screenshot of the screen at given position & size (rect). :param `rect`: the screen rectangle we wish to capture; :param `bmp`: currently unused. """ # Create a DC for the whole screen area dcScreen = wx.ScreenDC() # Create a Bitmap that will later on hold the screenshot image # Note that the Bitmap must have a size big enough to hold the screenshot # -1 means using the current default colour depth bmp = wx.EmptyBitmap(rect.width, rect.height) # Create a memory DC that will be used for actually taking the screenshot memDC = wx.MemoryDC() # Tell the memory DC to use our Bitmap # all drawing action on the memory DC will go to the Bitmap now memDC.SelectObject(bmp) # Blit (in this case copy) the actual screen on the memory DC # and thus the Bitmap memDC.Blit( 0, # Copy to this X coordinate 0, # Copy to this Y coordinate rect.width, # Copy this width rect.height, # Copy this height dcScreen, # From where do we copy? rect.x, # What's the X offset in the original DC? rect.y # What's the Y offset in the original DC? ) # Select the Bitmap out of the memory DC by selecting a new # uninitialized Bitmap memDC.SelectObject(wx.NullBitmap) def DrawToolBarBg(self, dc, rect): """ Draws the toolbar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the toolbar's client rectangle. """ renderer = self._renderers[self.GetMenuTheme()] # Set background colour if non given by caller renderer.DrawToolBarBg(dc, rect) def DrawMenuBarBg(self, dc, rect): """ Draws the menu bar background according to the active theme. :param `dc`: an instance of `wx.DC`; :param `rect`: the menubar's client rectangle. """ renderer = self._renderers[self.GetMenuTheme()] # Set background colour if non given by caller renderer.DrawMenuBarBg(dc, rect) def SetMenuBarColour(self, scheme): """ Sets the menu bar colour scheme to use. :param `scheme`: a string representing a colour scheme (i.e., 'Default', 'Dark', 'Dark Olive Green', 'Generic'). """ self._menuBarColourScheme = scheme # set default colour if scheme in self._colourSchemeMap.keys(): self._menuBarBgColour = self._colourSchemeMap[scheme] def GetMenuBarColourScheme(self): """ Returns the current colour scheme. """ return self._menuBarColourScheme def GetMenuBarFaceColour(self): """ Returns the menu bar face colour. """ return self._menuBarBgColour def GetMenuBarSelectionColour(self): """ Returns the menu bar selection colour. """ return self._menuBarSelColour def InitColours(self): """ Initialise the colour map. """ self._colourSchemeMap = {_("Default"): wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE), _("Dark"): wx.BLACK, _("Dark Olive Green"): wx.NamedColour("DARK OLIVE GREEN"), _("Generic"): wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION)} def GetColourSchemes(self): """ Returns the available colour schemes. """ return self._colourSchemeMap.keys() def CreateGreyBitmap(self, bmp): """ Creates a grey bitmap image from the input bitmap. :param `bmp`: a valid `wx.Bitmap` object to be greyed out. """ img = bmp.ConvertToImage() return wx.BitmapFromImage(img.ConvertToGreyscale()) def GetRaiseToolbar(self): """ Returns ``True`` if we are dropping a shadow under a toolbar. """ return self._raiseTB def SetRaiseToolbar(self, rais): """ Enables/disables toobar shadow drop. :param `rais`: ``True`` to drop a shadow below a toolbar, ``False`` otherwise. """ self._raiseTB = rais DisplayCAL-3.5.0.0/DisplayCAL/lib/agw/fmresources.py0000644000076500000000000003237212665102036021666 0ustar devwheel00000000000000import wx # Overall menu styles StyleDefault = 0 StyleXP = 1 Style2007 = 2 StyleVista = 3 # Menu shadows RightShadow = 1 # Right side shadow BottomShadow = 2 # Not full bottom shadow BottomShadowFull = 4 # Full bottom shadow # Button styles BU_EXT_XP_STYLE = 1 BU_EXT_2007_STYLE = 2 BU_EXT_LEFT_ALIGN_STYLE = 4 BU_EXT_CENTER_ALIGN_STYLE = 8 BU_EXT_RIGHT_ALIGN_STYLE = 16 BU_EXT_RIGHT_TO_LEFT_STYLE = 32 # Control state ControlPressed = 0 ControlFocus = 1 ControlDisabled = 2 ControlNormal = 3 # FlatMenu styles FM_OPT_IS_LCD = 1 """ Use this style if your computer uses a LCD screen. """ FM_OPT_MINIBAR = 2 """ Use this if you plan to use the toolbar only. """ FM_OPT_SHOW_CUSTOMIZE = 4 """ Show "customize link" in the `More` menu, you will need to write your own handler. See demo. """ FM_OPT_SHOW_TOOLBAR = 8 """ Set this option is you are planning to use the toolbar. """ # Control status ControlStatusNoFocus = 0 ControlStatusFocus = 1 ControlStatusPressed = 2 # HitTest constants NoWhere = 0 MenuItem = 1 ToolbarItem = 2 DropDownArrowButton = 3 FTB_ITEM_TOOL = 0 FTB_ITEM_SEPARATOR = 1 FTB_ITEM_CHECK = 2 FTB_ITEM_RADIO = 3 FTB_ITEM_RADIO_MENU = 4 FTB_ITEM_CUSTOM = 5 LargeIcons = 32 SmallIcons = 16 MENU_HT_NONE = 0 MENU_HT_ITEM = 1 MENU_HT_SCROLL_UP = 2 MENU_HT_SCROLL_DOWN = 3 MENU_DEC_TOP = 0 MENU_DEC_BOTTOM = 1 MENU_DEC_LEFT = 2 MENU_DEC_RIGHT = 3 DROP_DOWN_ARROW_WIDTH = 16 SPACER = 12 MARGIN = 3 TOOLBAR_SPACER = 4 TOOLBAR_MARGIN = 4 SEPARATOR_WIDTH = 12 SCROLL_BTN_HEIGHT = 20 CS_DROPSHADOW = 0x00020000 INB_BOTTOM = 1 INB_LEFT = 2 INB_RIGHT = 4 INB_TOP = 8 INB_BORDER = 16 INB_SHOW_ONLY_TEXT = 32 INB_SHOW_ONLY_IMAGES = 64 INB_FIT_BUTTON = 128 INB_DRAW_SHADOW = 256 INB_USE_PIN_BUTTON = 512 INB_GRADIENT_BACKGROUND = 1024 INB_WEB_HILITE = 2048 INB_NO_RESIZE = 4096 INB_FIT_LABELTEXT = 8192 INB_DEFAULT_STYLE = INB_BORDER | INB_TOP | INB_USE_PIN_BUTTON INB_TAB_AREA_BACKGROUND_COLOUR = 100 INB_ACTIVE_TAB_COLOUR = 101 INB_TABS_BORDER_COLOUR = 102 INB_TEXT_COLOUR = 103 INB_ACTIVE_TEXT_COLOUR = 104 INB_HILITE_TAB_COLOUR = 105 INB_LABEL_BOOK_DEFAULT = INB_DRAW_SHADOW | INB_BORDER | INB_USE_PIN_BUTTON | INB_LEFT # HitTest results IMG_OVER_IMG = 0 IMG_OVER_PIN = 1 IMG_OVER_EW_BORDER = 2 IMG_NONE = 3 # Pin button states INB_PIN_NONE = 0 INB_PIN_HOVER = 200 INB_PIN_PRESSED = 201 # Windows Vista Colours rgbSelectOuter = wx.Colour(170, 200, 245) rgbSelectInner = wx.Colour(230, 250, 250) rgbSelectTop = wx.Colour(210, 240, 250) rgbSelectBottom = wx.Colour(185, 215, 250) check_mark_xpm = [" 16 16 16 1", "` c #000000", ". c #800000", "# c #008000", "a c #808000", "b c #000080", "c c #800080", "d c #008080", "e c #808080", "f c #c0c0c0", "g c #ff0000", "h c #00ff00", "i c #ffff00", "j c #0000ff", "k c #ff00ff", "l c #00ffff", "m c #ffffff", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmm`mmmmm", "mmmmmmmmm``mmmmm", "mmmm`mmm```mmmmm", "mmmm``m```mmmmmm", "mmmm`````mmmmmmm", "mmmmm```mmmmmmmm", "mmmmmm`mmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm" ] radio_item_xpm = [" 16 16 16 1", "` c #000000", ". c #800000", "# c #008000", "a c #808000", "b c #000080", "c c #800080", "d c #008080", "e c #808080", "f c #c0c0c0", "g c #ff0000", "h c #00ff00", "i c #ffff00", "j c #0000ff", "k c #ff00ff", "l c #00ffff", "m c #ffffff", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmm```mmmmmmm", "mmmmm`````mmmmmm", "mmmmm`````mmmmmm", "mmmmmm```mmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm"] menu_right_arrow_xpm = [ " 16 16 8 1", "` c #ffffff", ". c #000000", "# c #000000", "a c #000000", "b c #000000", "c c #000000", "d c #000000", "e c #000000", "````````````````", "````````````````", "````````````````", "````````````````", "````````````````", "``````.`````````", "``````..````````", "``````...```````", "``````....``````", "``````...```````", "``````..````````", "``````.`````````", "````````````````", "````````````````", "````````````````", "````````````````" ] #---------------------------------- # Shadow images #---------------------------------- shadow_right_xpm = ["5 5 1 1"," c Black"," "," "," "," "," "] # shadow_right.xpm 5x5 shadow_right_alpha = [168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46] shadow_right_top_xpm = ["5 10 1 1"," c Black"," "," "," "," ", " "," "," "," "," "," "] shadow_right_top_alpha = [40, 35, 28, 18, 11, 67, 58, 46, 31, 18, 101, 87, 69, 46, 28, 128, 110, 87, 58, 35, 148, 128, 101, 67, 40, 161, 139, 110, 73, 44, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46, 168, 145, 115, 76, 46] # shadow_buttom.xpm 5x5 shadow_bottom_alpha = [184, 184, 184, 184, 184, 168, 168, 168, 168, 168, 145, 145, 145, 145, 145, 115, 115, 115, 115, 115, 76, 76, 76, 76, 76] shadow_bottom_left_xpm = ["10 5 1 1"," c Black"," "," ", " "," "," "] shadow_bottom_left_alpha = [22, 44, 73, 110, 139, 161, 176, 184, 184, 184, 20, 40, 67, 101, 128, 148, 161, 168, 168, 168, 17, 35, 58, 87, 110, 128, 139, 145, 145, 145, 13, 28, 46, 69, 87, 101, 110, 115, 115, 115, 9, 18, 31, 46, 58, 67, 73, 76, 76, 76] shadow_center_xpm = ["5 5 1 1"," c Black"," "," "," "," "," "] shadow_center_alpha = [161, 139, 110, 73, 44, 148, 128, 101, 67, 40, 128, 110, 87, 58, 35, 101, 87, 69, 46, 28, 67, 58, 46, 31, 18] shadow_bottom_xpm = ["5 5 1 1"," c Black"," "," "," "," "," "] arrow_down_xpm = ["16 16 3 1", ". c Black", "X c #FFFFFF", " c #008080", " ", " ", " ", " ", " ....... ", " XXXXXXX ", " ", " ....... ", " X.....X ", " X...X ", " X.X ", " X ", " ", " ", " ", " "] #--------------------------------------------- # Pin images #--------------------------------------------- pin_left_xpm = [" 16 16 8 1", "` c #ffffff", ". c #000000", "# c #808080", "a c #000000", "b c #000000", "c c #000000", "d c #000000", "e c #000000", "````````````````", "````````````````", "```````.````````", "```````.````````", "```````.......``", "```````.`````.``", "`````...`````.``", "``......#####.``", "`````...#####.``", "```````.......``", "```````.......``", "```````.````````", "```````.````````", "````````````````", "````````````````", "````````````````"] pin_down_xpm = [" 16 16 8 1", "` c #ffffff", ". c #000000", "# c #808080", "a c #000000", "b c #000000", "c c #000000", "d c #000000", "e c #000000", "````````````````", "````````````````", "````.......`````", "````.``##..`````", "````.``##..`````", "````.``##..`````", "````.``##..`````", "````.``##..`````", "``...........```", "``````...```````", "``````...```````", "```````.````````", "```````.````````", "```````.````````", "````````````````", "````````````````"] arrow_up = 'BM\xf6\x00\x00\x00\x00\x00\x00\x00v\x00\x00\x00(\x00\x00\x00\x10\x00\x00\ \x00\x10\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x80\x00\x00\x00\x12\x0b\x00\x00\x12\ \x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x80\x80\x00\ \x00w\xfcM\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00""""""""""""""""""""""""""""""""""\x00\x00\x00\x02""""\x11\x11\ \x11\x12""""""""""""\x00\x00\x00\x02""""\x10\x00\x00\x12""""!\x00\x01""""""\x10\x12""""""!\ """"""""""""""""""""""""""""""""""""' arrow_down = 'BM\xf6\x00\x00\x00\x00\x00\x00\x00v\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00\ \x10\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x0b\x00\x00\x12\x0b\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x80\x80\x00\x00w\ \xfcM\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00"""""""""""""""""""""""""""""""""""!"""""""\x10\x12"""""!\x00\x01\ """""\x10\x00\x00\x12""""\x00\x00\x00\x02""""""""""""\x11\x11\x11\x12""""\x00\x00\x00\x02\ """"""""""""""""""""""""""""""""""' menu_up_arrow_xpm = ["16 16 2 1", ". c Black", " c White", " ", " ", " ", " ", " ", " ", " . ", " ... ", " ..... ", " ", " ", " ", " ", " ", " ", " "] menu_down_arrow_xpm = ["16 16 2 1", ". c Black", " c White", " ", " ", " ", " ", " ", " ", " ..... ", " ... ", " . ", " ", " ", " ", " ", " ", " ", " "] def getMenuUpArrowBitmap(): bmp = wx.BitmapFromXPMData(menu_up_arrow_xpm) bmp.SetMask(wx.Mask(bmp, wx.WHITE)) return bmp def getMenuDownArrowBitmap(): bmp = wx.BitmapFromXPMData(menu_down_arrow_xpm) bmp.SetMask(wx.Mask(bmp, wx.WHITE)) return bmp DisplayCAL-3.5.0.0/DisplayCAL/lib/agw/fourwaysplitter.py0000644000076500000000000010372512665102036022615 0ustar devwheel00000000000000# --------------------------------------------------------------------------------- # # FOURWAYSPLITTER wxPython IMPLEMENTATION # # Andrea Gavana, @ 03 Nov 2006 # Latest Revision: 14 Apr 2010, 12.00 GMT # # # TODO List # # 1. Any idea? # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To Me At: # # gavana@kpo.kz # andrea.gavana@gmail.com # # Or, Obviously, To The wxPython Mailing List!!! # # # End Of Comments # --------------------------------------------------------------------------------- # """ FourWaySplitter is a layout manager which manages 4 children like 4 panes in a window. Description =========== The FourWaySplitter is a layout manager which manages four children like four panes in a window. You can use a four-way splitter for example in a CAD program where you may want to maintain three orthographic views, and one oblique view of a model. The FourWaySplitter allows interactive repartitioning of the panes by means of moving the central splitter bars. When the FourWaySplitter is itself resized, each child is proportionally resized, maintaining the same split-percentage. The main characteristics of FourWaySplitter are: - Handles horizontal, vertical or four way sizing via the sashes; - Delayed or live update when resizing; - Possibility to swap windows; - Setting the vertical and horizontal split fractions; - Possibility to expand a window by hiding the onther 3. And a lot more. See the demo for a complete review of the functionalities. Supported Platforms =================== FourWaySplitter has been tested on the following platforms: * Windows (Windows XP); * Linux Ubuntu (Dapper 6.06) Window Styles ============= This class supports the following window styles: ================== =========== ================================================== Window Styles Hex Value Description ================== =========== ================================================== ``SP_NOSASH`` 0x10 No sash will be drawn on `FourWaySplitter`. ``SP_LIVE_UPDATE`` 0x80 Don't draw XOR line but resize the child windows immediately. ``SP_3DBORDER`` 0x200 Draws a 3D effect border. ================== =========== ================================================== Events Processing ================= This class processes the following events: ================================== ================================================== Event Name Description ================================== ================================================== ``EVT_SPLITTER_SASH_POS_CHANGED`` The sash position was changed. This event is generated after the user releases the mouse after dragging the splitter. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED` event. ``EVT_SPLITTER_SASH_POS_CHANGING`` The sash position is in the process of being changed. You may prevent this change from happening by calling `Veto` or you may also modify the position of the tracking bar to properly reflect the position that would be set if the drag were to be completed at this point. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING` event. ================================== ================================================== License And Version =================== FourWaySplitter is distributed under the wxPython license. Latest Revision: Andrea Gavana @ 14 Apr 2010, 12.00 GMT Version 0.4 """ __docformat__ = "epytext" import wx _RENDER_VER = (2,6,1,1) # Tolerance for mouse shape and sizing _TOLERANCE = 5 # Modes NOWHERE = 0 FLAG_CHANGED = 1 FLAG_PRESSED = 2 # FourWaySplitter styles SP_NOSASH = wx.SP_NOSASH """ No sash will be drawn on `FourWaySplitter`. """ SP_LIVE_UPDATE = wx.SP_LIVE_UPDATE """ Don't draw XOR line but resize the child windows immediately. """ SP_3DBORDER = wx.SP_3DBORDER """ Draws a 3D effect border. """ # FourWaySplitter events EVT_SPLITTER_SASH_POS_CHANGING = wx.EVT_SPLITTER_SASH_POS_CHANGING """ The sash position is in the process of being changed. You may prevent this change""" \ """ from happening by calling `Veto` or you may also modify the position of the tracking""" \ """ bar to properly reflect the position that would be set if the drag were to be""" \ """ completed at this point. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING` event.""" EVT_SPLITTER_SASH_POS_CHANGED = wx.EVT_SPLITTER_SASH_POS_CHANGED """ The sash position was changed. This event is generated after the user releases the""" \ """ mouse after dragging the splitter. Processes a `wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED` event. """ # ---------------------------------------------------------------------------- # # Class FourWaySplitterEvent # ---------------------------------------------------------------------------- # class FourWaySplitterEvent(wx.PyCommandEvent): """ This event class is almost the same as `wx.SplitterEvent` except it adds an accessor for the sash index that is being changed. The same event type IDs and event binders are used as with `wx.SplitterEvent`. """ def __init__(self, evtType=wx.wxEVT_NULL, splitter=None): """ Default class constructor. :param `evtType`: the event type; :param `splitter`: the associated L{FourWaySplitter} window. """ wx.PyCommandEvent.__init__(self, evtType) if splitter: self.SetEventObject(splitter) self.SetId(splitter.GetId()) self.sashIdx = -1 self.sashPos = -1 self.isAllowed = True def SetSashIdx(self, idx): """ Sets the index of the sash currently involved in the event. :param `idx`: an integer between 0 and 3, representing the index of the sash involved in the event. """ self.sashIdx = idx def SetSashPosition(self, pos): """ In the case of ``EVT_SPLITTER_SASH_POS_CHANGED`` events, sets the new sash position. In the case of ``EVT_SPLITTER_SASH_POS_CHANGING`` events, sets the new tracking bar position so visual feedback during dragging will represent that change that will actually take place. Set to -1 from the event handler code to prevent repositioning. :param `pos`: the new sash position. :note: May only be called while processing ``EVT_SPLITTER_SASH_POS_CHANGING`` and ``EVT_SPLITTER_SASH_POS_CHANGED`` events. """ self.sashPos = pos def GetSashIdx(self): """ Returns the index of the sash currently involved in the event. """ return self.sashIdx def GetSashPosition(self): """ Returns the new sash position. :note: May only be called while processing ``EVT_SPLITTER_SASH_POS_CHANGING`` and ``EVT_SPLITTER_SASH_POS_CHANGED`` events. """ return self.sashPos # methods from wx.NotifyEvent def Veto(self): """ Prevents the change announced by this event from happening. :note: It is in general a good idea to notify the user about the reasons for vetoing the change because otherwise the applications behaviour (which just refuses to do what the user wants) might be quite surprising. """ self.isAllowed = False def Allow(self): """ This is the opposite of L{Veto}: it explicitly allows the event to be processed. For most events it is not necessary to call this method as the events are allowed anyhow but some are forbidden by default (this will be mentioned in the corresponding event description). """ self.isAllowed = True def IsAllowed(self): """ Returns ``True`` if the change is allowed (L{Veto} hasn't been called) or ``False`` otherwise (if it was). """ return self.isAllowed # ---------------------------------------------------------------------------- # # Class FourWaySplitter # ---------------------------------------------------------------------------- # class FourWaySplitter(wx.PyPanel): """ This class is very similar to `wx.SplitterWindow` except that it allows for four windows and two sashes. Many of the same styles, constants, and methods behave the same as in `wx.SplitterWindow`. However, in addition of the ability to drag the vertical and the horizontal sash, by dragging at the intersection between the two sashes, it is possible to resize the four windows at the same time. :note: These things are not yet supported: * Minimum pane size (minimum of what? Width? Height?); * Using negative sash positions to indicate a position offset from the end; * User controlled unsplitting with double clicks on the sash (but supported via the L{FourWaySplitter.SetExpanded} method); * Sash gravity. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="FourWaySplitter"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.PyPanel` window style; :param `agwStyle`: the AGW-specific window style. It can be a combination of the following bits: ================== =========== ================================================== Window Styles Hex Value Description ================== =========== ================================================== ``SP_NOSASH`` 0x10 No sash will be drawn on L{FourWaySplitter}. ``SP_LIVE_UPDATE`` 0x80 Don't draw XOR line but resize the child windows immediately. ``SP_3DBORDER`` 0x200 Draws a 3D effect border. ================== =========== ================================================== :param `name`: the window name. """ # always turn on tab traversal style |= wx.TAB_TRAVERSAL # and turn off any border styles style &= ~wx.BORDER_MASK style |= wx.BORDER_NONE self._agwStyle = agwStyle # initialize the base class wx.PyPanel.__init__(self, parent, id, pos, size, style, name) self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) self._windows = [] self._splitx = 0 self._splity = 0 self._expanded = -1 self._fhor = 5000 self._fver = 5000 self._offx = 0 self._offy = 0 self._mode = NOWHERE self._flags = 0 self._isHot = False self._sashTrackerPen = wx.Pen(wx.BLACK, 2, wx.SOLID) self._sashCursorWE = wx.StockCursor(wx.CURSOR_SIZEWE) self._sashCursorNS = wx.StockCursor(wx.CURSOR_SIZENS) self._sashCursorSIZING = wx.StockCursor(wx.CURSOR_SIZING) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_MOTION, self.OnMotion) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow) def SetAGWWindowStyleFlag(self, agwStyle): """ Sets the L{FourWaySplitter} window style flags. :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: ================== =========== ================================================== Window Styles Hex Value Description ================== =========== ================================================== ``SP_NOSASH`` 0x10 No sash will be drawn on L{FourWaySplitter}. ``SP_LIVE_UPDATE`` 0x80 Don't draw XOR line but resize the child windows immediately. ``SP_3DBORDER`` 0x200 Draws a 3D effect border. ================== =========== ================================================== """ self._agwStyle = agwStyle self.Refresh() def GetAGWWindowStyleFlag(self): """ Returns the L{FourWaySplitter} window style. :see: L{SetAGWWindowStyleFlag} for a list of possible window styles. """ return self._agwStyle def AppendWindow(self, window): """ Add a new window to the splitter at the right side or bottom of the window stack. :param `window`: an instance of `wx.Window`. """ self.InsertWindow(len(self._windows), window) def InsertWindow(self, idx, window, sashPos=-1): """ Insert a new window into the splitter at the position given in `idx`. :param `idx`: the index at which the window will be inserted; :param `window`: an instance of `wx.Window`; :param `sashPos`: the sash position after the window insertion. """ assert window not in self._windows, "A window can only be in the splitter once!" self._windows.insert(idx, window) self._SizeWindows() def DetachWindow(self, window): """ Removes the window from the stack of windows managed by the splitter. The window will still exist so you should `Hide` or `Destroy` it as needed. :param `window`: an instance of `wx.Window`. """ assert window in self._windows, "Unknown window!" idx = self._windows.index(window) del self._windows[idx] self._SizeWindows() def ReplaceWindow(self, oldWindow, newWindow): """ Replaces `oldWindow` (which is currently being managed by the splitter) with `newWindow`. The `oldWindow` window will still exist so you should `Hide` or `Destroy` it as needed. :param `oldWindow`: an instance of `wx.Window`; :param `newWindow`: another instance of `wx.Window`. """ assert oldWindow in self._windows, "Unknown window!" idx = self._windows.index(oldWindow) self._windows[idx] = newWindow self._SizeWindows() def ExchangeWindows(self, window1, window2): """ Trade the positions in the splitter of the two windows. :param `window1`: an instance of `wx.Window`; :param `window2`: another instance of `wx.Window`. """ assert window1 in self._windows, "Unknown window!" assert window2 in self._windows, "Unknown window!" idx1 = self._windows.index(window1) idx2 = self._windows.index(window2) self._windows[idx1] = window2 self._windows[idx2] = window1 if "__WXMSW__" in wx.Platform: self.Freeze() self._SizeWindows() if "__WXMSW__" in wx.Platform: self.Thaw() def GetWindow(self, idx): """ Returns the window at the index `idx`. :param `idx`: the index at which the window is located. """ if len(self._windows) > idx: return self._windows[idx] return None # Get top left child def GetTopLeft(self): """ Returns the top left window (window index: 0). """ return self.GetWindow(0) # Get top right child def GetTopRight(self): """ Returns the top right window (window index: 1). """ return self.GetWindow(1) # Get bottom left child def GetBottomLeft(self): """ Returns the bottom left window (window index: 2). """ return self.GetWindow(2) # Get bottom right child def GetBottomRight(self): """ Returns the bottom right window (window index: 3). """ return self.GetWindow(3) def DoGetBestSize(self): """ Gets the size which best suits the window: for a control, it would be the minimal size which doesn't truncate the control, for a panel - the same size as it would have after a call to `Fit()`. :note: Overridden from `wx.PyPanel`. """ if not self._windows: # something is better than nothing... return wx.Size(10, 10) width = height = 0 border = self._GetBorderSize() tl = self.GetTopLeft() tr = self.GetTopRight() bl = self.GetBottomLeft() br = self.GetBottomRight() for win in self._windows: w, h = win.GetEffectiveMinSize() width += w height += h if tl and tr: width += self._GetSashSize() if bl and br: height += self._GetSashSize() return wx.Size(width+2*border, height+2*border) # Recompute layout def _SizeWindows(self): """ Recalculate the layout based on split positions and split fractions. :see: L{SetHSplit} and L{SetVSplit} for more information about split fractions. """ win0 = self.GetTopLeft() win1 = self.GetTopRight() win2 = self.GetBottomLeft() win3 = self.GetBottomRight() width, height = self.GetSize() barSize = self._GetSashSize() border = self._GetBorderSize() if self._expanded < 0: totw = width - barSize - 2*border toth = height - barSize - 2*border self._splitx = (self._fhor*totw)/10000 self._splity = (self._fver*toth)/10000 rightw = totw - self._splitx bottomh = toth - self._splity if win0: win0.SetDimensions(0, 0, self._splitx, self._splity) win0.Show() if win1: win1.SetDimensions(self._splitx + barSize, 0, rightw, self._splity) win1.Show() if win2: win2.SetDimensions(0, self._splity + barSize, self._splitx, bottomh) win2.Show() if win3: win3.SetDimensions(self._splitx + barSize, self._splity + barSize, rightw, bottomh) win3.Show() else: if self._expanded < len(self._windows): for ii, win in enumerate(self._windows): if ii == self._expanded: win.SetDimensions(0, 0, width-2*border, height-2*border) win.Show() else: win.Hide() # Determine split mode def GetMode(self, pt): """ Determines the split mode for L{FourWaySplitter}. :param `pt`: the point at which the mouse has been clicked, an instance of `wx.Point`. :return: One of the following 3 split modes: ================= ============================== Split Mode Description ================= ============================== ``wx.HORIZONTAL`` the user has clicked on the horizontal sash ``wx.VERTICAL`` The user has clicked on the vertical sash ``wx.BOTH`` The user has clicked at the intersection between the 2 sashes ================= ============================== """ barSize = self._GetSashSize() flag = wx.BOTH if pt.x < self._splitx - _TOLERANCE: flag &= ~wx.VERTICAL if pt.y < self._splity - _TOLERANCE: flag &= ~wx.HORIZONTAL if pt.x >= self._splitx + barSize + _TOLERANCE: flag &= ~wx.VERTICAL if pt.y >= self._splity + barSize + _TOLERANCE: flag &= ~wx.HORIZONTAL return flag # Move the split intelligently def MoveSplit(self, x, y): """ Moves the split accordingly to user action. :param `x`: the new splitter `x` coordinate; :param `y`: the new splitter `y` coordinate. """ width, height = self.GetSize() barSize = self._GetSashSize() if x < 0: x = 0 if y < 0: y = 0 if x > width - barSize: x = width - barSize if y > height - barSize: y = height - barSize self._splitx = x self._splity = y # Adjust layout def AdjustLayout(self): """ Adjust layout of L{FourWaySplitter}. Mainly used to recalculate the correct values for split fractions. """ width, height = self.GetSize() barSize = self._GetSashSize() border = self._GetBorderSize() self._fhor = (width > barSize and \ [(10000*self._splitx+(width-barSize-1))/(width-barSize)] \ or [0])[0] self._fver = (height > barSize and \ [(10000*self._splity+(height-barSize-1))/(height-barSize)] \ or [0])[0] self._SizeWindows() # Button being pressed def OnLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for L{FourWaySplitter}. :param `event`: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return pt = event.GetPosition() self.CaptureMouse() self._mode = self.GetMode(pt) if self._mode: self._offx = pt.x - self._splitx self._offy = pt.y - self._splity if not self.GetAGWWindowStyleFlag() & wx.SP_LIVE_UPDATE: self.DrawSplitter(wx.ClientDC(self)) self.DrawTrackSplitter(self._splitx, self._splity) self._flags |= FLAG_PRESSED # Button being released def OnLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for L{FourWaySplitter}. :param `event`: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return if self.HasCapture(): self.ReleaseMouse() flgs = self._flags self._flags &= ~FLAG_CHANGED self._flags &= ~FLAG_PRESSED if flgs & FLAG_PRESSED: if not self.GetAGWWindowStyleFlag() & wx.SP_LIVE_UPDATE: self.DrawTrackSplitter(self._splitx, self._splity) self.DrawSplitter(wx.ClientDC(self)) self.AdjustLayout() if flgs & FLAG_CHANGED: event = FourWaySplitterEvent(wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, self) event.SetSashIdx(self._mode) event.SetSashPosition(wx.Point(self._splitx, self._splity)) self.GetEventHandler().ProcessEvent(event) self._mode = NOWHERE def OnLeaveWindow(self, event): """ Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{FourWaySplitter}. :param `event`: a `wx.MouseEvent` event to be processed. """ self.SetCursor(wx.STANDARD_CURSOR) self._RedrawIfHotSensitive(False) def OnEnterWindow(self, event): """ Handles the ``wx.EVT_ENTER_WINDOW`` event for L{FourWaySplitter}. :param `event`: a `wx.MouseEvent` event to be processed. """ self._RedrawIfHotSensitive(True) def _RedrawIfHotSensitive(self, isHot): """ Used internally. Redraw the splitter if we are using a hot-sensitive splitter. :param `isHot`: ``True`` if the splitter is in a hot state, ``False`` otherwise. """ if not wx.VERSION >= _RENDER_VER: return if wx.RendererNative.Get().GetSplitterParams(self).isHotSensitive: self._isHot = isHot dc = wx.ClientDC(self) self.DrawSplitter(dc) def OnMotion(self, event): """ Handles the ``wx.EVT_MOTION`` event for L{FourWaySplitter}. :param `event`: a `wx.MouseEvent` event to be processed. """ if self.HasFlag(wx.SP_NOSASH): return pt = event.GetPosition() # Moving split if self._flags & FLAG_PRESSED: oldsplitx = self._splitx oldsplity = self._splity if self._mode == wx.BOTH: self.MoveSplit(pt.x - self._offx, pt.y - self._offy) elif self._mode == wx.VERTICAL: self.MoveSplit(pt.x - self._offx, self._splity) elif self._mode == wx.HORIZONTAL: self.MoveSplit(self._splitx, pt.y - self._offy) # Send a changing event if not self.DoSendChangingEvent(wx.Point(self._splitx, self._splity)): self._splitx = oldsplitx self._splity = oldsplity return if oldsplitx != self._splitx or oldsplity != self._splity: if not self.GetAGWWindowStyleFlag() & wx.SP_LIVE_UPDATE: self.DrawTrackSplitter(oldsplitx, oldsplity) self.DrawTrackSplitter(self._splitx, self._splity) else: self.AdjustLayout() self._flags |= FLAG_CHANGED # Change cursor based on position ff = self.GetMode(pt) if ff == wx.BOTH: self.SetCursor(self._sashCursorSIZING) elif ff == wx.VERTICAL: self.SetCursor(self._sashCursorWE) elif ff == wx.HORIZONTAL: self.SetCursor(self._sashCursorNS) else: self.SetCursor(wx.STANDARD_CURSOR) event.Skip() def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{FourWaySplitter}. :param `event`: a `wx.PaintEvent` event to be processed. """ if self: dc = wx.PaintDC(self) self.DrawSplitter(dc) def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{FourWaySplitter}. :param `event`: a `wx.SizeEvent` event to be processed. """ parent = wx.GetTopLevelParent(self) if parent.IsIconized(): event.Skip() return self._SizeWindows() def DoSendChangingEvent(self, pt): """ Sends a ``EVT_SPLITTER_SASH_POS_CHANGING`` event. :param `pt`: the point at which the splitter is being positioned. """ # send the event event = FourWaySplitterEvent(wx.wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING, self) event.SetSashIdx(self._mode) event.SetSashPosition(pt) if self.GetEventHandler().ProcessEvent(event) and not event.IsAllowed(): # the event handler vetoed the change or missing event.Skip() return False else: # or it might have changed the value return True def _GetSashSize(self): """ Used internally. """ if self.HasFlag(wx.SP_NOSASH): return 0 if wx.VERSION >= _RENDER_VER: return wx.RendererNative.Get().GetSplitterParams(self).widthSash else: return 5 def _GetBorderSize(self): """ Used internally. """ if wx.VERSION >= _RENDER_VER: return wx.RendererNative.Get().GetSplitterParams(self).border else: return 0 # Draw the horizontal split def DrawSplitter(self, dc): """ Actually draws the sashes. :param `dc`: an instance of `wx.DC`. """ backColour = self.GetBackgroundColour() dc.SetBrush(wx.Brush(backColour, wx.SOLID)) dc.SetPen(wx.Pen(backColour)) dc.Clear() if wx.VERSION >= _RENDER_VER: if self.HasFlag(wx.SP_3DBORDER): wx.RendererNative.Get().DrawSplitterBorder( self, dc, self.GetClientRect()) else: barSize = self._GetSashSize() # if we are not supposed to use a sash then we're done. if self.HasFlag(wx.SP_NOSASH): return flag = 0 if self._isHot: flag = wx.CONTROL_CURRENT width, height = self.GetSize() if self._mode & wx.VERTICAL: if wx.VERSION >= _RENDER_VER: wx.RendererNative.Get().DrawSplitterSash(self, dc, self.GetClientSize(), self._splitx, wx.VERTICAL, flag) else: dc.DrawRectangle(self._splitx, 0, barSize, height) if self._mode & wx.HORIZONTAL: if wx.VERSION >= _RENDER_VER: wx.RendererNative.Get().DrawSplitterSash(self, dc, self.GetClientSize(), self._splity, wx.VERTICAL, flag) else: dc.DrawRectangle(0, self._splity, width, barSize) def DrawTrackSplitter(self, x, y): """ Draws a fake sash in case we don't have ``wx.SP_LIVE_UPDATE`` style. :param `x`: the `x` position of the sash; :param `y`: the `y` position of the sash. :note: This method relies on `wx.ScreenDC` which is currently unavailable on wxMac. """ # Draw a line to represent the dragging sash, for when not # doing live updates w, h = self.GetClientSize() dc = wx.ScreenDC() dc.SetLogicalFunction(wx.INVERT) dc.SetPen(self._sashTrackerPen) dc.SetBrush(wx.TRANSPARENT_BRUSH) if self._mode == wx.VERTICAL: x1 = x y1 = 2 x2 = x y2 = h-2 if x1 > w: x1 = w x2 = w elif x1 < 0: x1 = 0 x2 = 0 x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) dc.SetLogicalFunction(wx.COPY) elif self._mode == wx.HORIZONTAL: x1 = 2 y1 = y x2 = w-2 y2 = y if y1 > h: y1 = h y2 = h elif y1 < 0: y1 = 0 y2 = 0 x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) dc.SetLogicalFunction(wx.COPY) elif self._mode == wx.BOTH: x1 = 2 x2 = w-2 y1 = y y2 = y x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) x1 = x x2 = x y1 = 2 y2 = h-2 x1, y1 = self.ClientToScreenXY(x1, y1) x2, y2 = self.ClientToScreenXY(x2, y2) dc.DrawLine(x1, y1, x2, y2) dc.SetLogicalFunction(wx.COPY) # Change horizontal split [fraction*10000] def SetHSplit(self, s): """ Change horizontal split fraction. :param `s`: the split fraction, which is an integer value between 0 and 10000 (inclusive), indicating how much space to allocate to the leftmost panes. For example, to split the panes at 35 percent, use:: fourSplitter.SetHSplit(3500) """ if s < 0: s = 0 if s > 10000: s =10000 if s != self._fhor: self._fhor = s self._SizeWindows() # Change vertical split [fraction*10000] def SetVSplit(self, s): """ Change vertical split fraction. :param `s`: the split fraction, which is an integer value between 0 and 10000 (inclusive), indicating how much space to allocate to the topmost panes. For example, to split the panes at 35 percent, use:: fourSplitter.SetVSplit(3500) """ if s < 0: s = 0 if s > 10000: s =10000 if s != self._fver: self._fver = s self._SizeWindows() # Expand one or all of the four panes def SetExpanded(self, expanded): """ This method is used to expand one of the four window to fill the whole client size (when `expanded` >= 0) or to return to the four-window view (when `expanded` < 0). :param `expanded`: an integer >= 0 to expand a window to fill the whole client size, or an integer < 0 to return to the four-window view. """ if expanded >= 4: raise Exception("ERROR: SetExpanded: index out of range: %d"%expanded) if self._expanded != expanded: self._expanded = expanded self._SizeWindows() DisplayCAL-3.5.0.0/DisplayCAL/lib/agw/gradientbutton.py0000644000076500000000000004731113104456141022357 0ustar devwheel00000000000000# --------------------------------------------------------------------------------- # # GRADIENTBUTTON wxPython IMPLEMENTATION # # Andrea Gavana, @ 07 October 2008 # Latest Revision: 27 Nov 2009, 17.00 GMT # # # TODO List # # 1) Anything to do? # # # For all kind of problems, requests of enhancements and bug reports, please # write to me at: # # andrea.gavana@gmail.com # gavana@kpo.kz # # Or, obviously, to the wxPython mailing list!!! # # # End Of Comments # --------------------------------------------------------------------------------- # """ GradientButton is another custom-drawn button class which mimics Windows CE mobile gradient buttons. Description =========== GradientButton is another custom-drawn button class which mimics Windows CE mobile gradient buttons, using a tri-vertex blended gradient plus some ClearType bold font (best effect with Tahoma Bold). GradientButton supports: * Triple blended gradient background, with customizable colours; * Custom colours for the "pressed" state; * Rounded-corners buttons; * Text-only or image+text buttons. And a lot more. Check the demo for an almost complete review of the functionalities. Supported Platforms =================== GradientButton has been tested on the following platforms: * Windows (Windows XP). Window Styles ============= `No particular window styles are available for this class.` Events Processing ================= This class processes the following events: ================= ================================================== Event Name Description ================= ================================================== ``wx.EVT_BUTTON`` Process a `wx.wxEVT_COMMAND_BUTTON_CLICKED` event, when the button is clicked. ================= ================================================== License And Version =================== GradientButton is distributed under the wxPython license. Latest Revision: Andrea Gavana @ 27 Nov 2009, 17.00 GMT Version 0.3 """ import wx HOVER = 1 CLICK = 2 class GradientButtonEvent(wx.PyCommandEvent): """ Event sent from L{GradientButton} when the button is activated. """ def __init__(self, eventType, eventId): """ Default class constructor. :param `eventType`: the event type; :param `eventId`: the event identifier. """ wx.PyCommandEvent.__init__(self, eventType, eventId) self.isDown = False self.theButton = None def SetButtonObj(self, btn): """ Sets the event object for the event. :param `btn`: the button object, an instance of L{GradientButton}. """ self.theButton = btn def GetButtonObj(self): """ Returns the object associated with this event. """ return self.theButton class GradientButton(wx.PyControl): """ This is the main class implementation of L{GradientButton}. """ def __init__(self, parent, id=wx.ID_ANY, bitmap=None, label="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.NO_BORDER, validator=wx.DefaultValidator, name="gradientbutton"): """ Default class constructor. :param `parent`: the L{GradientButton} parent; :param `id`: window identifier. A value of -1 indicates a default value; :param `bitmap`: the button bitmap (if any); :param `label`: the button text label; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the button style (unused); :param `validator`: the validator associated to the button; :param `name`: the button name. """ wx.PyControl.__init__(self, parent, id, pos, size, style, validator, name) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_ERASE_BACKGROUND, lambda event: None) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeave) self.Bind(wx.EVT_ENTER_WINDOW, self.OnMouseEnter) self.Bind(wx.EVT_SET_FOCUS, self.OnGainFocus) self.Bind(wx.EVT_KILL_FOCUS, self.OnLoseFocus) self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) self.Bind(wx.EVT_KEY_UP, self.OnKeyUp) self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDown) self._mouseAction = None self._bitmap = bitmap self._hasFocus = False self.SetLabel(label) self.InheritAttributes() self.SetInitialSize(size) # The following defaults are better suited to draw the text outline self._bottomStartColour = wx.BLACK rgba = self._bottomStartColour.Red(), self._bottomStartColour.Green(), \ self._bottomStartColour.Blue(), self._bottomStartColour.Alpha() self._bottomEndColour = self.LightColour(self._bottomStartColour, 20) self._topStartColour = self.LightColour(self._bottomStartColour, 40) self._topEndColour = self.LightColour(self._bottomStartColour, 25) self._pressedTopColour = self.LightColour(self._bottomStartColour, 20) self._pressedBottomColour = wx.Colour(*rgba) self.SetForegroundColour(wx.WHITE) for method in dir(self): if method.endswith("Colour"): newMethod = method[0:-6] + "Colour" if not hasattr(self, newMethod): setattr(self, newMethod, method) def LightColour(self, colour, percent): """ Return light contrast of `colour`. The colour returned is from the scale of `colour` ==> white. :param `colour`: the input colour to be brightened; :param `percent`: determines how light the colour will be. `percent` = 100 returns white, `percent` = 0 returns `colour`. """ end_colour = wx.WHITE rd = end_colour.Red() - colour.Red() gd = end_colour.Green() - colour.Green() bd = end_colour.Blue() - colour.Blue() high = 100 # We take the percent way of the colour from colour -. white i = percent r = colour.Red() + ((i*rd*100)/high)/100 g = colour.Green() + ((i*gd*100)/high)/100 b = colour.Blue() + ((i*bd*100)/high)/100 return wx.Colour(r, g, b) def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{GradientButton}. :param `event`: a `wx.SizeEvent` event to be processed. """ event.Skip() self.Refresh() def OnLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for L{GradientButton}. :param `event`: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return self._mouseAction = CLICK self.CaptureMouse() self.Refresh() event.Skip() def OnLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for L{GradientButton}. :param `event`: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled() or not self.HasCapture(): return pos = event.GetPosition() rect = self.GetClientRect() if self.HasCapture(): self.ReleaseMouse() if rect.Contains(pos): self._mouseAction = HOVER self.Notify() else: self._mouseAction = None self.Refresh() event.Skip() def OnMouseEnter(self, event): """ Handles the ``wx.EVT_ENTER_WINDOW`` event for L{GradientButton}. :param `event`: a `wx.MouseEvent` event to be processed. """ if not self.IsEnabled(): return self._mouseAction = HOVER self.Refresh() event.Skip() def OnMouseLeave(self, event): """ Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{GradientButton}. :param `event`: a `wx.MouseEvent` event to be processed. """ self._mouseAction = None self.Refresh() event.Skip() def OnGainFocus(self, event): """ Handles the ``wx.EVT_SET_FOCUS`` event for L{GradientButton}. :param `event`: a `wx.FocusEvent` event to be processed. """ self._hasFocus = True self.Refresh() self.Update() def OnLoseFocus(self, event): """ Handles the ``wx.EVT_KILL_FOCUS`` event for L{GradientButton}. :param `event`: a `wx.FocusEvent` event to be processed. """ self._hasFocus = False self.Refresh() self.Update() def OnKeyDown(self, event): """ Handles the ``wx.EVT_KEY_DOWN`` event for L{GradientButton}. :param `event`: a `wx.KeyEvent` event to be processed. """ if self._hasFocus and event.GetKeyCode() == ord(" "): self._mouseAction = HOVER self.Refresh() event.Skip() def OnKeyUp(self, event): """ Handles the ``wx.EVT_KEY_UP`` event for L{GradientButton}. :param `event`: a `wx.KeyEvent` event to be processed. """ if self._hasFocus and event.GetKeyCode() == ord(" "): self._mouseAction = HOVER self.Notify() self.Refresh() event.Skip() def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{GradientButton}. :param `event`: a `wx.PaintEvent` event to be processed. """ dc = wx.BufferedPaintDC(self) gc = wx.GraphicsContext.Create(dc) dc.SetBackground(wx.Brush(self.GetParent().GetBackgroundColour())) dc.Clear() clientRect = self.GetClientRect() gradientRect = wx.Rect(*clientRect) capture = wx.Window.GetCapture() x, y, width, height = clientRect gradientRect.SetHeight(gradientRect.GetHeight()/2 + ((capture==self and [1] or [0])[0])) if capture != self: if self._mouseAction == HOVER: topStart, topEnd = self.LightColour(self._topStartColour, 10), self.LightColour(self._topEndColour, 10) else: topStart, topEnd = self._topStartColour, self._topEndColour rc1 = wx.Rect(x, y, width, height/2) path1 = self.GetPath(gc, rc1, 8) br1 = gc.CreateLinearGradientBrush(x, y, x, y+height/2, topStart, topEnd) gc.SetBrush(br1) gc.FillPath(path1) #draw main path4 = gc.CreatePath() path4.AddRectangle(x, y+height/2-8, width, 8) path4.CloseSubpath() gc.SetBrush(br1) gc.FillPath(path4) else: rc1 = wx.Rect(x, y, width, height) path1 = self.GetPath(gc, rc1, 8) gc.SetPen(wx.Pen(self._pressedTopColour)) gc.SetBrush(wx.Brush(self._pressedTopColour)) gc.FillPath(path1) gradientRect.Offset((0, gradientRect.GetHeight())) if capture != self: if self._mouseAction == HOVER: bottomStart, bottomEnd = self.LightColour(self._bottomStartColour, 10), self.LightColour(self._bottomEndColour, 10) else: bottomStart, bottomEnd = self._bottomStartColour, self._bottomEndColour rc3 = wx.Rect(x, y+height/2, width, height/2) path3 = self.GetPath(gc, rc3, 8) br3 = gc.CreateLinearGradientBrush(x, y+height/2, x, y+height, bottomStart, bottomEnd) gc.SetBrush(br3) gc.FillPath(path3) #draw main path4 = gc.CreatePath() path4.AddRectangle(x, y+height/2, width, 8) path4.CloseSubpath() gc.SetBrush(br3) gc.FillPath(path4) shadowOffset = 0 else: rc2 = wx.Rect(x+1, gradientRect.height/2, gradientRect.width, gradientRect.height) path2 = self.GetPath(gc, rc2, 8) gc.SetPen(wx.Pen(self._pressedBottomColour)) gc.SetBrush(wx.Brush(self._pressedBottomColour)) gc.FillPath(path2) shadowOffset = 1 font = gc.CreateFont(self.GetFont(), self.GetForegroundColour()) gc.SetFont(font) label = self.GetLabel() # XXX: Using self.GetTextextent instead of gc.GetTextExtent # seems to fix sporadic segfaults with wxPython Phoenix under Windows # if the button is a child of a ProgressDialog. # TODO: Figure out why this is the case. tw, th = self.GetTextExtent(label) if self._bitmap: bw, bh = self._bitmap.GetWidth(), self._bitmap.GetHeight() else: bw = bh = 0 pos_x = (width-bw-tw)/2+shadowOffset # adjust for bitmap and text to centre if self._bitmap: pos_y = (height-bh)/2+shadowOffset gc.DrawBitmap(self._bitmap, pos_x, pos_y, bw, bh) # draw bitmap if available pos_x = pos_x + 2 # extra spacing from bitmap gc.DrawText(label, pos_x + bw + shadowOffset, (height-th)/2+shadowOffset) def GetPath(self, gc, rc, r): """ Returns a rounded `wx.GraphicsPath` rectangle. :param `gc`: an instance of `wx.GraphicsContext`; :param `rc`: a client rectangle; :param `r`: the radious of the rounded part of the rectangle. """ x, y, w, h = rc path = gc.CreatePath() path.AddRoundedRectangle(x, y, w, h, r) path.CloseSubpath() return path def SetInitialSize(self, size=None): """ Given the current font and bezel width settings, calculate and set a good size. :param `size`: an instance of `wx.Size`. """ if size is None: size = wx.DefaultSize wx.PyControl.SetInitialSize(self, size) SetBestSize = SetInitialSize def AcceptsFocus(self): """ Can this window be given focus by mouse click? :note: Overridden from `wx.PyControl`. """ return self.IsShown() and self.IsEnabled() def GetDefaultAttributes(self): """ Overridden base class virtual. By default we should use the same font/colour attributes as the native `wx.Button`. """ return wx.Button.GetClassDefaultAttributes() def ShouldInheritColours(self): """ Overridden base class virtual. Buttons usually don't inherit the parent's colours. :note: Overridden from `wx.PyControl`. """ return False def Enable(self, enable=True): """ Enables/disables the button. :param `enable`: ``True`` to enable the button, ``False`` to disable it. :note: Overridden from `wx.PyControl`. """ wx.PyControl.Enable(self, enable) self.Refresh() def SetTopStartColour(self, colour): """ Sets the top start colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._topStartColour = colour self.Refresh() def GetTopStartColour(self): """ Returns the top start colour for the gradient shading. """ return self._topStartColour def SetTopEndColour(self, colour): """ Sets the top end colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._topEndColour = colour self.Refresh() def GetTopEndColour(self): """ Returns the top end colour for the gradient shading. """ return self._topEndColour def SetBottomStartColour(self, colour): """ Sets the top bottom colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._bottomStartColour = colour self.Refresh() def GetBottomStartColour(self): """ Returns the bottom start colour for the gradient shading. """ return self._bottomStartColour def SetBottomEndColour(self, colour): """ Sets the bottom end colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._bottomEndColour = colour self.Refresh() def GetBottomEndColour(self): """ Returns the bottom end colour for the gradient shading. """ return self._bottomEndColour def SetPressedTopColour(self, colour): """ Sets the pressed top start colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._pressedTopColour = colour self.Refresh() def GetPressedTopColour(self): """ Returns the pressed top start colour for the gradient shading. """ return self._pressedTopColour def SetPressedBottomColour(self, colour): """ Sets the pressed bottom start colour for the gradient shading. :param `colour`: a valid `wx.Colour` object. """ self._pressedBottomColour = colour self.Refresh() def GetPressedBottomColour(self): """ Returns the pressed bottom start colour for the gradient shading. """ return self._pressedBottomColour def SetForegroundColour(self, colour): """ Sets the L{GradientButton} foreground (text) colour. :param `colour`: a valid `wx.Colour` object. :note: Overridden from `wx.PyControl`. """ wx.PyControl.SetForegroundColour(self, colour) self.Refresh() def DoGetBestSize(self): """ Overridden base class virtual. Determines the best size of the button based on the label and bezel size. """ label = self.GetLabel() if not label: return wx.Size(112, 48) dc = wx.ClientDC(self) dc.SetFont(self.GetFont()) retWidth, retHeight = dc.GetTextExtent(label) bmpWidth = bmpHeight = 0 constant = 15 if self._bitmap: bmpWidth, bmpHeight = self._bitmap.GetWidth()+10, self._bitmap.GetHeight() retWidth += bmpWidth retHeight = max(bmpHeight, retHeight) constant = 15 return wx.Size(retWidth+constant, retHeight+constant) def SetDefault(self): """ Sets the default button. """ tlw = wx.GetTopLevelParent(self) if hasattr(tlw, 'SetDefaultItem'): tlw.SetDefaultItem(self) def Notify(self): """ Actually sends a ``wx.EVT_BUTTON`` event to the listener (if any). """ evt = GradientButtonEvent(wx.wxEVT_COMMAND_BUTTON_CLICKED, self.GetId()) evt.SetButtonObj(self) evt.SetEventObject(self) self.GetEventHandler().ProcessEvent(evt) DisplayCAL-3.5.0.0/DisplayCAL/lib/agw/labelbook.py0000644000076500000000000032477412665102036021275 0ustar devwheel00000000000000# --------------------------------------------------------------------------- # # LABELBOOK And FLATIMAGEBOOK Widgets wxPython IMPLEMENTATION # # Original C++ Code From Eran, embedded in the FlatMenu source code # # # License: wxWidgets license # # # Python Code By: # # Andrea Gavana, @ 03 Nov 2006 # Latest Revision: 17 Jan 2011, 15.00 GMT # # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To Me At: # # andrea.gavana@gmail.com # gavana@kpo.kz # # Or, Obviously, To The wxPython Mailing List!!! # # TODO: # LabelBook - Support IMB_SHOW_ONLY_IMAGES # LabelBook - An option for the draw border to only draw the border # between the controls and the pages so the background # colour can flow into the window background # # # # End Of Comments # --------------------------------------------------------------------------- # """ LabelBook and FlatImageBook are a quasi-full generic and owner-drawn implementations of `wx.Notebook`. Description =========== LabelBook and FlatImageBook are a quasi-full implementations of the `wx.Notebook`, and designed to be a drop-in replacement for `wx.Notebook`. The API functions are similar so one can expect the function to behave in the same way. LabelBook anf FlatImageBook share their appearance with `wx.Toolbook` and `wx.Listbook`, while having more options for custom drawings, label positioning, mouse pointing and so on. Moreover, they retain also some visual characteristics of the Outlook address book. Some features: - They are generic controls; - Supports for left, right, top (FlatImageBook only), bottom (FlatImageBook only) book styles; - Possibility to draw images only, text only or both (FlatImageBook only); - Support for a "pin-button", that allows the user to shrink/expand the book tab area; - Shadows behind tabs (LabelBook only); - Gradient shading of the tab area (LabelBook only); - Web-like mouse pointing on tabs style (LabelBook only); - Many customizable colours (tab area, active tab text, tab borders, active tab, highlight) - LabelBook only. And much more. See the demo for a quasi-complete review of all the functionalities of LabelBook and FlatImageBook. Supported Platforms =================== LabelBook and FlatImageBook have been tested on the following platforms: * Windows (Windows XP); * Linux Ubuntu (Dapper 6.06) Window Styles ============= This class supports the following window styles: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for `FlatImageBook`. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for `FlatImageBook`. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around `LabelBook` or `FlatImageBook`. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for `LabelBook`. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for `LabelBook`. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for `LabelBook`. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for `LabelBook`. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for `LabelBook`. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== Events Processing ================= This class processes the following events: =================================== ================================================== Event Name Description =================================== ================================================== ``EVT_IMAGENOTEBOOK_PAGE_CHANGED`` Notify client objects when the active page in `ImageNotebook` has changed. ``EVT_IMAGENOTEBOOK_PAGE_CHANGING`` Notify client objects when the active page in `ImageNotebook` is about to change. ``EVT_IMAGENOTEBOOK_PAGE_CLOSED`` Notify client objects when a page in `ImageNotebook` has been closed. ``EVT_IMAGENOTEBOOK_PAGE_CLOSING`` Notify client objects when a page in `ImageNotebook` is closing. =================================== ================================================== License And Version =================== LabelBook and FlatImageBook are distributed under the wxPython license. Latest Revision: Andrea Gavana @ 17 Jan 2011, 15.00 GMT Version 0.5. """ __docformat__ = "epytext" #---------------------------------------------------------------------- # Beginning Of IMAGENOTEBOOK wxPython Code #---------------------------------------------------------------------- import wx from artmanager import ArtManager, DCSaver from fmresources import * # Check for the new method in 2.7 (not present in 2.6.3.3) if wx.VERSION_STRING < "2.7": wx.Rect.Contains = lambda self, point: wx.Rect.Inside(self, point) # FlatImageBook and LabelBook styles INB_BOTTOM = 1 """ Place labels below the page area. Available only for `FlatImageBook`.""" INB_LEFT = 2 """ Place labels on the left side. Available only for `FlatImageBook`.""" INB_RIGHT = 4 """ Place labels on the right side. """ INB_TOP = 8 """ Place labels above the page area. """ INB_BORDER = 16 """ Draws a border around `LabelBook` or `FlatImageBook`. """ INB_SHOW_ONLY_TEXT = 32 """ Shows only text labels and no images. Available only for `LabelBook`.""" INB_SHOW_ONLY_IMAGES = 64 """ Shows only tab images and no label texts. Available only for `LabelBook`.""" INB_FIT_BUTTON = 128 """ Displays a pin button to show/hide the book control. """ INB_DRAW_SHADOW = 256 """ Draw shadows below the book tabs. Available only for `LabelBook`.""" INB_USE_PIN_BUTTON = 512 """ Displays a pin button to show/hide the book control. """ INB_GRADIENT_BACKGROUND = 1024 """ Draws a gradient shading on the tabs background. Available only for `LabelBook`.""" INB_WEB_HILITE = 2048 """ On mouse hovering, tabs behave like html hyperlinks. Available only for `LabelBook`.""" INB_NO_RESIZE = 4096 """ Don't allow resizing of the tab area. """ INB_FIT_LABELTEXT = 8192 """ Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. """ wxEVT_IMAGENOTEBOOK_PAGE_CHANGED = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED wxEVT_IMAGENOTEBOOK_PAGE_CHANGING = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING wxEVT_IMAGENOTEBOOK_PAGE_CLOSING = wx.NewEventType() wxEVT_IMAGENOTEBOOK_PAGE_CLOSED = wx.NewEventType() #-----------------------------------# # ImageNotebookEvent #-----------------------------------# EVT_IMAGENOTEBOOK_PAGE_CHANGED = wx.EVT_NOTEBOOK_PAGE_CHANGED """ Notify client objects when the active page in `ImageNotebook` has changed. """ EVT_IMAGENOTEBOOK_PAGE_CHANGING = wx.EVT_NOTEBOOK_PAGE_CHANGING """ Notify client objects when the active page in `ImageNotebook` is about to change. """ EVT_IMAGENOTEBOOK_PAGE_CLOSING = wx.PyEventBinder(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, 1) """ Notify client objects when a page in `ImageNotebook` is closing. """ EVT_IMAGENOTEBOOK_PAGE_CLOSED = wx.PyEventBinder(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, 1) """ Notify client objects when a page in `ImageNotebook` has been closed. """ # ---------------------------------------------------------------------------- # # Class ImageNotebookEvent # ---------------------------------------------------------------------------- # class ImageNotebookEvent(wx.PyCommandEvent): """ This events will be sent when a ``EVT_IMAGENOTEBOOK_PAGE_CHANGED``, ``EVT_IMAGENOTEBOOK_PAGE_CHANGING``, ``EVT_IMAGENOTEBOOK_PAGE_CLOSING``, ``EVT_IMAGENOTEBOOK_PAGE_CLOSED`` is mapped in the parent. """ def __init__(self, eventType, eventId=1, sel=-1, oldsel=-1): """ Default class constructor. :param `eventType`: the event type; :param `eventId`: the event identifier; :param `sel`: the current selection; :param `oldsel`: the old selection. """ wx.PyCommandEvent.__init__(self, eventType, eventId) self._eventType = eventType self._sel = sel self._oldsel = oldsel self._allowed = True def SetSelection(self, s): """ Sets the event selection. :param `s`: an integer specifying the new selection. """ self._sel = s def SetOldSelection(self, s): """ Sets the event old selection. :param `s`: an integer specifying the old selection. """ self._oldsel = s def GetSelection(self): """ Returns the event selection. """ return self._sel def GetOldSelection(self): """ Returns the old event selection. """ return self._oldsel def Veto(self): """ Prevents the change announced by this event from happening. :note: It is in general a good idea to notify the user about the reasons for vetoing the change because otherwise the applications behaviour (which just refuses to do what the user wants) might be quite surprising. """ self._allowed = False def Allow(self): """ This is the opposite of L{Veto}: it explicitly allows the event to be processed. For most events it is not necessary to call this method as the events are allowed anyhow but some are forbidden by default (this will be mentioned in the corresponding event description). """ self._allowed = True def IsAllowed(self): """ Returns ``True`` if the change is allowed (L{Veto} hasn't been called) or ``False`` otherwise (if it was). """ return self._allowed # ---------------------------------------------------------------------------- # # Class ImageInfo # ---------------------------------------------------------------------------- # class ImageInfo(object): """ This class holds all the information (caption, image, etc...) belonging to a single tab in L{LabelBook}. """ def __init__(self, strCaption="", imageIndex=-1): """ Default class constructor. :param `strCaption`: the tab caption; :param `imageIndex`: the tab image index based on the assigned (set) `wx.ImageList` (if any). """ self._pos = wx.Point() self._size = wx.Size() self._strCaption = strCaption self._ImageIndex = imageIndex self._captionRect = wx.Rect() def SetCaption(self, value): """ Sets the tab caption. :param `value`: the new tab caption. """ self._strCaption = value def GetCaption(self): """ Returns the tab caption. """ return self._strCaption def SetPosition(self, value): """ Sets the tab position. :param `value`: the new tab position, an instance of `wx.Point`. """ self._pos = value def GetPosition(self): """ Returns the tab position. """ return self._pos def SetSize(self, value): """ Sets the tab size. :param `value`: the new tab size, an instance of `wx.Size`. """ self._size = value def GetSize(self): """ Returns the tab size. """ return self._size def SetImageIndex(self, value): """ Sets the tab image index. :param `value`: an index into the image list.. """ self._ImageIndex = value def GetImageIndex(self): """ Returns the tab image index. """ return self._ImageIndex def SetTextRect(self, rect): """ Sets the client rectangle available for the tab text. :param `rect`: the tab text client rectangle, an instance of `wx.Rect`. """ self._captionRect = rect def GetTextRect(self): """ Returns the client rectangle available for the tab text. """ return self._captionRect # ---------------------------------------------------------------------------- # # Class ImageContainerBase # ---------------------------------------------------------------------------- # class ImageContainerBase(wx.Panel): """ Base class for L{FlatImageBook} image container. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="ImageContainerBase"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ self._nIndex = -1 self._nImgSize = 16 self._ImageList = None self._nHoeveredImgIdx = -1 self._bCollapsed = False self._tabAreaSize = (-1, -1) self._nPinButtonStatus = INB_PIN_NONE self._pagesInfoVec = [] self._pinBtnRect = wx.Rect() wx.Panel.__init__(self, parent, id, pos, size, style | wx.NO_BORDER | wx.NO_FULL_REPAINT_ON_RESIZE, name) def HasAGWFlag(self, flag): """ Tests for existance of flag in the style. :param `flag`: a window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== """ style = self.GetParent().GetAGWWindowStyleFlag() res = (style & flag and [True] or [False])[0] return res def ClearFlag(self, flag): """ Removes flag from the style. :param `flag`: a window style flag. :see: L{HasAGWFlag} for a list of possible window style flags. """ parent = self.GetParent() agwStyle = parent.GetAGWWindowStyleFlag() agwStyle &= ~(flag) parent.SetAGWWindowStyleFlag(agwStyle) def AssignImageList(self, imglist): """ Assigns an image list to the L{ImageContainerBase}. :param `imglist`: an instance of `wx.ImageList`. """ if imglist and imglist.GetImageCount() != 0: self._nImgSize = imglist.GetBitmap(0).GetHeight() self._ImageList = imglist parent = self.GetParent() agwStyle = parent.GetAGWWindowStyleFlag() parent.SetAGWWindowStyleFlag(agwStyle) def GetImageList(self): """ Return the image list for L{ImageContainerBase}. """ return self._ImageList def GetImageSize(self): """ Returns the image size inside the L{ImageContainerBase} image list. """ return self._nImgSize def FixTextSize(self, dc, text, maxWidth): """ Fixes the text, to fit `maxWidth` value. If the text length exceeds `maxWidth` value this function truncates it and appends two dots at the end. ("Long Long Long Text" might become "Long Long..."). :param `dc`: an instance of `wx.DC`; :param `text`: the text to fix/truncate; :param `maxWidth`: the maximum allowed width for the text, in pixels. """ return ArtManager.Get().TruncateText(dc, text, maxWidth) def CanDoBottomStyle(self): """ Allows the parent to examine the children type. Some implementation (such as L{LabelBook}), does not support top/bottom images, only left/right. """ return False def AddPage(self, caption, selected=False, imgIdx=-1): """ Adds a page to the container. :param `caption`: specifies the text for the new tab; :param `selected`: specifies whether the page should be selected; :param `imgIdx`: specifies the optional image index for the new tab. """ self._pagesInfoVec.append(ImageInfo(caption, imgIdx)) if selected or len(self._pagesInfoVec) == 1: self._nIndex = len(self._pagesInfoVec)-1 self.Refresh() def InsertPage(self, page_idx, caption, selected=False, imgIdx=-1): """ Inserts a page into the container at the specified position. :param `page_idx`: specifies the position for the new tab; :param `caption`: specifies the text for the new tab; :param `selected`: specifies whether the page should be selected; :param `imgIdx`: specifies the optional image index for the new tab. """ self._pagesInfoVec.insert(page_idx, ImageInfo(caption, imgIdx)) if selected or len(self._pagesInfoVec) == 1: self._nIndex = len(self._pagesInfoVec)-1 self.Refresh() def SetPageImage(self, page, imgIdx): """ Sets the image for the given page. :param `page`: the index of the tab; :param `imgIdx`: specifies the optional image index for the tab. """ imgInfo = self._pagesInfoVec[page] imgInfo.SetImageIndex(imgIdx) def SetPageText(self, page, text): """ Sets the tab caption for the given page. :param `page`: the index of the tab; :param `text`: the new tab caption. """ imgInfo = self._pagesInfoVec[page] imgInfo.SetCaption(text) def GetPageImage(self, page): """ Returns the image index for the given page. :param `page`: the index of the tab. """ imgInfo = self._pagesInfoVec[page] return imgInfo.GetImageIndex() def GetPageText(self, page): """ Returns the tab caption for the given page. :param `page`: the index of the tab. """ imgInfo = self._pagesInfoVec[page] return imgInfo.GetCaption() def ClearAll(self): """ Deletes all the pages in the container. """ self._pagesInfoVec = [] self._nIndex = wx.NOT_FOUND def DoDeletePage(self, page): """ Does the actual page deletion. :param `page`: the index of the tab. """ # Remove the page from the vector book = self.GetParent() self._pagesInfoVec.pop(page) if self._nIndex >= page: self._nIndex = self._nIndex - 1 # The delete page was the last first on the array, # but the book still has more pages, so we set the # active page to be the first one (0) if self._nIndex < 0 and len(self._pagesInfoVec) > 0: self._nIndex = 0 # Refresh the tabs if self._nIndex >= 0: book._bForceSelection = True book.SetSelection(self._nIndex) book._bForceSelection = False if not self._pagesInfoVec: # Erase the page container drawings dc = wx.ClientDC(self) dc.Clear() def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{ImageContainerBase}. :param `event`: a `wx.SizeEvent` event to be processed. """ self.Refresh() # Call on paint event.Skip() def OnEraseBackground(self, event): """ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{ImageContainerBase}. :param `event`: a `wx.EraseEvent` event to be processed. :note: This method is intentionally empty to reduce flicker. """ pass def HitTest(self, pt): """ Returns the index of the tab at the specified position or ``wx.NOT_FOUND`` if ``None``, plus the flag style of L{HitTest}. :param `pt`: an instance of `wx.Point`, to test for hits. :return: The index of the tab at the specified position plus the hit test flag, which can be one of the following bits: ====================== ======= ================================ HitTest Flags Value Description ====================== ======= ================================ ``IMG_OVER_IMG`` 0 The mouse is over the tab icon ``IMG_OVER_PIN`` 1 The mouse is over the pin button ``IMG_OVER_EW_BORDER`` 2 The mouse is over the east-west book border ``IMG_NONE`` 3 Nowhere ====================== ======= ================================ """ style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: if self._pinBtnRect.Contains(pt): return -1, IMG_OVER_PIN for i in xrange(len(self._pagesInfoVec)): if self._pagesInfoVec[i].GetPosition() == wx.Point(-1, -1): break # For Web Hover style, we test the TextRect if not self.HasAGWFlag(INB_WEB_HILITE): buttonRect = wx.RectPS(self._pagesInfoVec[i].GetPosition(), self._pagesInfoVec[i].GetSize()) else: buttonRect = self._pagesInfoVec[i].GetTextRect() if buttonRect.Contains(pt): return i, IMG_OVER_IMG if self.PointOnSash(pt): return -1, IMG_OVER_EW_BORDER else: return -1, IMG_NONE def PointOnSash(self, pt): """ Tests whether pt is located on the sash. :param `pt`: an instance of `wx.Point`, to test for hits. """ # Check if we are on a the sash border cltRect = self.GetClientRect() if self.HasAGWFlag(INB_LEFT) or self.HasAGWFlag(INB_TOP): if pt.x > cltRect.x + cltRect.width - 4: return True else: if pt.x < 4: return True return False def OnMouseLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for L{ImageContainerBase}. :param `event`: a `wx.MouseEvent` event to be processed. """ newSelection = -1 event.Skip() # Support for collapse/expand style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: if self._pinBtnRect.Contains(event.GetPosition()): self._nPinButtonStatus = INB_PIN_PRESSED dc = wx.ClientDC(self) self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed) return # Incase panel is collapsed, there is nothing # to check if self._bCollapsed: return tabIdx, where = self.HitTest(event.GetPosition()) if where == IMG_OVER_IMG: self._nHoeveredImgIdx = -1 if tabIdx == -1: return self.GetParent().SetSelection(tabIdx) def OnMouseLeaveWindow(self, event): """ Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{ImageContainerBase}. :param `event`: a `wx.MouseEvent` event to be processed. """ bRepaint = self._nHoeveredImgIdx != -1 self._nHoeveredImgIdx = -1 # Make sure the pin button status is NONE # incase we were in pin button style style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: self._nPinButtonStatus = INB_PIN_NONE dc = wx.ClientDC(self) self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed) # Restore cursor wx.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) if bRepaint: self.Refresh() def OnMouseLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for L{ImageContainerBase}. :param `event`: a `wx.MouseEvent` event to be processed. """ style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: bIsLabelContainer = not self.CanDoBottomStyle() if self._pinBtnRect.Contains(event.GetPosition()): self._nPinButtonStatus = INB_PIN_NONE self._bCollapsed = not self._bCollapsed if self._bCollapsed: # Save the current tab area width self._tabAreaSize = self.GetSize() if bIsLabelContainer: self.SetSizeHints(20, self._tabAreaSize.y) else: if style & INB_BOTTOM or style & INB_TOP: self.SetSizeHints(self._tabAreaSize.x, 20) else: self.SetSizeHints(20, self._tabAreaSize.y) else: if bIsLabelContainer: self.SetSizeHints(self._tabAreaSize.x, -1) else: # Restore the tab area size if style & INB_BOTTOM or style & INB_TOP: self.SetSizeHints(-1, self._tabAreaSize.y) else: self.SetSizeHints(self._tabAreaSize.x, -1) self.GetParent().GetSizer().Layout() self.Refresh() return def OnMouseMove(self, event): """ Handles the ``wx.EVT_MOTION`` event for L{ImageContainerBase}. :param `event`: a `wx.MouseEvent` event to be processed. """ style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: # Check to see if we are in the pin button rect if not self._pinBtnRect.Contains(event.GetPosition()) and self._nPinButtonStatus == INB_PIN_PRESSED: self._nPinButtonStatus = INB_PIN_NONE dc = wx.ClientDC(self) self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed) imgIdx, where = self.HitTest(event.GetPosition()) self._nHoeveredImgIdx = imgIdx if not self._bCollapsed: if self._nHoeveredImgIdx >= 0 and self._nHoeveredImgIdx < len(self._pagesInfoVec): # Change the cursor to be Hand if self.HasAGWFlag(INB_WEB_HILITE) and self._nHoeveredImgIdx != self._nIndex: wx.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) else: # Restore the cursor only if we have the Web hover style set, # and we are not currently hovering the sash if self.HasAGWFlag(INB_WEB_HILITE) and not self.PointOnSash(event.GetPosition()): wx.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) # Dont display hover effect when hoevering the # selected label if self._nHoeveredImgIdx == self._nIndex: self._nHoeveredImgIdx = -1 self.Refresh() def DrawPin(self, dc, rect, downPin): """ Draw a pin button, that allows collapsing of the image panel. :param `dc`: an instance of `wx.DC`; :param `rect`: the pin button client rectangle; :param `downPin`: ``True`` if the pin button is facing downwards, ``False`` if it is facing leftwards. """ # Set the bitmap according to the button status if downPin: pinBmp = wx.BitmapFromXPMData(pin_down_xpm) else: pinBmp = wx.BitmapFromXPMData(pin_left_xpm) xx = rect.x + 2 if self._nPinButtonStatus in [INB_PIN_HOVER, INB_PIN_NONE]: dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(wx.BLACK_PEN) dc.DrawRectangle(xx, rect.y, 16, 16) # Draw upper and left border with grey colour dc.SetPen(wx.WHITE_PEN) dc.DrawLine(xx, rect.y, xx + 16, rect.y) dc.DrawLine(xx, rect.y, xx, rect.y + 16) elif self._nPinButtonStatus == INB_PIN_PRESSED: dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(wx.Pen(wx.NamedColour("LIGHT GREY"))) dc.DrawRectangle(xx, rect.y, 16, 16) # Draw upper and left border with grey colour dc.SetPen(wx.BLACK_PEN) dc.DrawLine(xx, rect.y, xx + 16, rect.y) dc.DrawLine(xx, rect.y, xx, rect.y + 16) # Set the masking pinBmp.SetMask(wx.Mask(pinBmp, wx.WHITE)) # Draw the new bitmap dc.DrawBitmap(pinBmp, xx, rect.y, True) # Save the pin rect self._pinBtnRect = rect # ---------------------------------------------------------------------------- # # Class ImageContainer # ---------------------------------------------------------------------------- # class ImageContainer(ImageContainerBase): """ Base class for L{FlatImageBook} image container. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="ImageContainer"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ ImageContainerBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.Bind(wx.EVT_MOTION, self.OnMouseMove) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeaveWindow) def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{ImageContainer}. :param `event`: a `wx.SizeEvent` event to be processed. """ ImageContainerBase.OnSize(self, event) event.Skip() def OnMouseLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for L{ImageContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseLeftDown(self, event) event.Skip() def OnMouseLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for L{ImageContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseLeftUp(self, event) event.Skip() def OnEraseBackground(self, event): """ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{ImageContainer}. :param `event`: a `wx.EraseEvent` event to be processed. """ ImageContainerBase.OnEraseBackground(self, event) def OnMouseMove(self, event): """ Handles the ``wx.EVT_MOTION`` event for L{ImageContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseMove(self, event) event.Skip() def OnMouseLeaveWindow(self, event): """ Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{ImageContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ ImageContainerBase.OnMouseLeaveWindow(self, event) event.Skip() def CanDoBottomStyle(self): """ Allows the parent to examine the children type. Some implementation (such as L{LabelBook}), does not support top/bottom images, only left/right. """ return True def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{ImageContainer}. :param `event`: a `wx.PaintEvent` event to be processed. """ dc = wx.BufferedPaintDC(self) style = self.GetParent().GetAGWWindowStyleFlag() backBrush = wx.WHITE_BRUSH if style & INB_BORDER: borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DSHADOW)) else: borderPen = wx.TRANSPARENT_PEN size = self.GetSize() # Background dc.SetBrush(backBrush) borderPen.SetWidth(1) dc.SetPen(borderPen) dc.DrawRectangle(0, 0, size.x, size.y) bUsePin = (style & INB_USE_PIN_BUTTON and [True] or [False])[0] if bUsePin: # Draw the pin button clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) if self._bCollapsed: return borderPen = wx.BLACK_PEN borderPen.SetWidth(1) dc.SetPen(borderPen) dc.DrawLine(0, size.y, size.x, size.y) dc.DrawPoint(0, size.y) clientSize = 0 bUseYcoord = (style & INB_RIGHT or style & INB_LEFT) if bUseYcoord: clientSize = size.GetHeight() else: clientSize = size.GetWidth() # We reserver 20 pixels for the 'pin' button # The drawing of the images start position. This is # depenedent of the style, especially when Pin button # style is requested if bUsePin: if style & INB_TOP or style & INB_BOTTOM: pos = (style & INB_BORDER and [0] or [1])[0] else: pos = (style & INB_BORDER and [20] or [21])[0] else: pos = (style & INB_BORDER and [0] or [1])[0] nPadding = 4 # Pad text with 2 pixels on the left and right nTextPaddingLeft = 2 count = 0 for i in xrange(len(self._pagesInfoVec)): count = count + 1 # incase the 'fit button' style is applied, we set the rectangle width to the # text width plus padding # Incase the style IS applied, but the style is either LEFT or RIGHT # we ignore it normalFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) dc.SetFont(normalFont) textWidth, textHeight = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption()) # Restore font to be normal normalFont.SetWeight(wx.FONTWEIGHT_NORMAL) dc.SetFont(normalFont) # Default values for the surronounding rectangle # around a button rectWidth = self._nImgSize * 2 # To avoid the recangle to 'touch' the borders rectHeight = self._nImgSize * 2 # Incase the style requires non-fixed button (fit to text) # recalc the rectangle width if style & INB_FIT_BUTTON and \ not ((style & INB_LEFT) or (style & INB_RIGHT)) and \ not self._pagesInfoVec[i].GetCaption() == "" and \ not (style & INB_SHOW_ONLY_IMAGES): rectWidth = ((textWidth + nPadding * 2) > rectWidth and [nPadding * 2 + textWidth] or [rectWidth])[0] # Make the width an even number if rectWidth % 2 != 0: rectWidth += 1 # Check that we have enough space to draw the button # If Pin button is used, consider its space as well (applicable for top/botton style) # since in the left/right, its size is already considered in 'pos' pinBtnSize = (bUsePin and [20] or [0])[0] if pos + rectWidth + pinBtnSize > clientSize: break # Calculate the button rectangle modRectWidth = ((style & INB_LEFT or style & INB_RIGHT) and [rectWidth - 2] or [rectWidth])[0] modRectHeight = ((style & INB_LEFT or style & INB_RIGHT) and [rectHeight] or [rectHeight - 2])[0] if bUseYcoord: buttonRect = wx.Rect(1, pos, modRectWidth, modRectHeight) else: buttonRect = wx.Rect(pos , 1, modRectWidth, modRectHeight) # Check if we need to draw a rectangle around the button if self._nIndex == i: # Set the colours penColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION) brushColour = ArtManager.Get().LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION), 75) dc.SetPen(wx.Pen(penColour)) dc.SetBrush(wx.Brush(brushColour)) # Fix the surrounding of the rect if border is set if style & INB_BORDER: if style & INB_TOP or style & INB_BOTTOM: buttonRect = wx.Rect(buttonRect.x + 1, buttonRect.y, buttonRect.width - 1, buttonRect.height) else: buttonRect = wx.Rect(buttonRect.x, buttonRect.y + 1, buttonRect.width, buttonRect.height - 1) dc.DrawRectangleRect(buttonRect) if self._nHoeveredImgIdx == i: # Set the colours penColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION) brushColour = ArtManager.Get().LightColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION), 90) dc.SetPen(wx.Pen(penColour)) dc.SetBrush(wx.Brush(brushColour)) # Fix the surrounding of the rect if border is set if style & INB_BORDER: if style & INB_TOP or style & INB_BOTTOM: buttonRect = wx.Rect(buttonRect.x + 1, buttonRect.y, buttonRect.width - 1, buttonRect.height) else: buttonRect = wx.Rect(buttonRect.x, buttonRect.y + 1, buttonRect.width, buttonRect.height - 1) dc.DrawRectangleRect(buttonRect) if bUseYcoord: rect = wx.Rect(0, pos, rectWidth, rectWidth) else: rect = wx.Rect(pos, 0, rectWidth, rectWidth) # Incase user set both flags: # INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES # We override them to display both if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES: style ^= INB_SHOW_ONLY_TEXT style ^= INB_SHOW_ONLY_IMAGES self.GetParent().SetAGWWindowStyleFlag(style) # Draw the caption and text imgTopPadding = 10 if not style & INB_SHOW_ONLY_TEXT and self._pagesInfoVec[i].GetImageIndex() != -1: if bUseYcoord: imgXcoord = self._nImgSize / 2 imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [pos + self._nImgSize / 2] or [pos + imgTopPadding])[0] else: imgXcoord = pos + (rectWidth / 2) - (self._nImgSize / 2) imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [self._nImgSize / 2] or [imgTopPadding])[0] self._ImageList.Draw(self._pagesInfoVec[i].GetImageIndex(), dc, imgXcoord, imgYcoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) # Draw the text if not style & INB_SHOW_ONLY_IMAGES and not self._pagesInfoVec[i].GetCaption() == "": dc.SetFont(normalFont) # Check if the text can fit the size of the rectangle, # if not truncate it fixedText = self._pagesInfoVec[i].GetCaption() if not style & INB_FIT_BUTTON or (style & INB_LEFT or (style & INB_RIGHT)): fixedText = self.FixTextSize(dc, self._pagesInfoVec[i].GetCaption(), self._nImgSize *2 - 4) # Update the length of the text textWidth, textHeight = dc.GetTextExtent(fixedText) if bUseYcoord: textOffsetX = ((rectWidth - textWidth) / 2 ) textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [pos + self._nImgSize + imgTopPadding + 3] or \ [pos + ((self._nImgSize * 2 - textHeight) / 2 )])[0] else: textOffsetX = (rectWidth - textWidth) / 2 + pos + nTextPaddingLeft textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [self._nImgSize + imgTopPadding + 3] or \ [((self._nImgSize * 2 - textHeight) / 2 )])[0] dc.SetTextForeground(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOWTEXT)) dc.DrawText(fixedText, textOffsetX, textOffsetY) # Update the page info self._pagesInfoVec[i].SetPosition(buttonRect.GetPosition()) self._pagesInfoVec[i].SetSize(buttonRect.GetSize()) pos += rectWidth # Update all buttons that can not fit into the screen as non-visible for ii in xrange(count, len(self._pagesInfoVec)): self._pagesInfoVec[ii].SetPosition(wx.Point(-1, -1)) # Draw the pin button if bUsePin: clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) # ---------------------------------------------------------------------------- # # Class LabelContainer # ---------------------------------------------------------------------------- # class LabelContainer(ImageContainerBase): """ Base class for L{LabelBook}. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="LabelContainer"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ ImageContainerBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self._nTabAreaWidth = 100 self._oldCursor = wx.NullCursor self._coloursMap = {} self._skin = wx.NullBitmap self._sashRect = wx.Rect() self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) self.Bind(wx.EVT_MOTION, self.OnMouseMove) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeaveWindow) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{LabelContainer}. :param `event`: a `wx.SizeEvent` event to be processed. """ ImageContainerBase.OnSize(self, event) event.Skip() def OnEraseBackground(self, event): """ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{LabelContainer}. :param `event`: a `wx.EraseEvent` event to be processed. """ ImageContainerBase.OnEraseBackground(self, event) def GetTabAreaWidth(self): """ Returns the width of the tab area. """ return self._nTabAreaWidth def SetTabAreaWidth(self, width): """ Sets the width of the tab area. :param `width`: the width of the tab area, in pixels. """ self._nTabAreaWidth = width def CanDoBottomStyle(self): """ Allows the parent to examine the children type. Some implementation (such as L{LabelBook}), does not support top/bottom images, only left/right. """ return False def SetBackgroundBitmap(self, bmp): """ Sets the background bitmap for the control. :param `bmp`: a valid `wx.Bitmap` object. """ self._skin = bmp def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{LabelContainer}. :param `event`: a `wx.PaintEvent` event to be processed. """ style = self.GetParent().GetAGWWindowStyleFlag() dc = wx.BufferedPaintDC(self) backBrush = wx.Brush(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR]) if self.HasAGWFlag(INB_BORDER): borderPen = wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR]) else: borderPen = wx.TRANSPARENT_PEN size = self.GetSize() # Set the pen & brush dc.SetBrush(backBrush) dc.SetPen(borderPen) # Incase user set both flags, we override them to display both # INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES: style ^= INB_SHOW_ONLY_TEXT style ^= INB_SHOW_ONLY_IMAGES self.GetParent().SetAGWWindowStyleFlag(style) if self.HasAGWFlag(INB_GRADIENT_BACKGROUND) and not self._skin.Ok(): # Draw graident in the background area startColour = self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR] endColour = ArtManager.Get().LightColour(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR], 50) ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(0, 0, size.x / 2, size.y), startColour, endColour, False) ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(size.x / 2, 0, size.x / 2, size.y), endColour, startColour, False) else: # Draw the border and background if self._skin.Ok(): dc.SetBrush(wx.TRANSPARENT_BRUSH) self.DrawBackgroundBitmap(dc) dc.DrawRectangleRect(wx.Rect(0, 0, size.x, size.y)) # Draw border if self.HasAGWFlag(INB_BORDER) and self.HasAGWFlag(INB_GRADIENT_BACKGROUND): # Just draw the border with transparent brush dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawRectangleRect(wx.Rect(0, 0, size.x, size.y)) bUsePin = (self.HasAGWFlag(INB_USE_PIN_BUTTON) and [True] or [False])[0] if bUsePin: # Draw the pin button clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) if self._bCollapsed: return dc.SetPen(wx.BLACK_PEN) self.SetSizeHints(self._nTabAreaWidth, -1) # We reserve 20 pixels for the pin button posy = 20 count = 0 for i in xrange(len(self._pagesInfoVec)): count = count+1 # Default values for the surronounding rectangle # around a button rectWidth = self._nTabAreaWidth if self.HasAGWFlag(INB_SHOW_ONLY_TEXT): font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetPointSize(font.GetPointSize() * self.GetParent().GetFontSizeMultiple()) if self.GetParent().GetFontBold(): font.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(font) w, h = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption()) rectHeight = h * 2 else: rectHeight = self._nImgSize * 2 # Check that we have enough space to draw the button if posy + rectHeight > size.GetHeight(): break # Calculate the button rectangle posx = 0 buttonRect = wx.Rect(posx, posy, rectWidth, rectHeight) indx = self._pagesInfoVec[i].GetImageIndex() if indx == -1: bmp = wx.NullBitmap else: bmp = self._ImageList.GetBitmap(indx) self.DrawLabel(dc, buttonRect, self._pagesInfoVec[i].GetCaption(), bmp, self._pagesInfoVec[i], self.HasAGWFlag(INB_LEFT) or self.HasAGWFlag(INB_TOP), i, self._nIndex == i, self._nHoeveredImgIdx == i) posy += rectHeight # Update all buttons that can not fit into the screen as non-visible for ii in xrange(count, len(self._pagesInfoVec)): self._pagesInfoVec[i].SetPosition(wx.Point(-1, -1)) if bUsePin: clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) def DrawBackgroundBitmap(self, dc): """ Draws a bitmap as the background of the control. :param `dc`: an instance of `wx.DC`. """ clientRect = self.GetClientRect() width = clientRect.GetWidth() height = clientRect.GetHeight() coveredY = coveredX = 0 xstep = self._skin.GetWidth() ystep = self._skin.GetHeight() bmpRect = wx.Rect(0, 0, xstep, ystep) if bmpRect != clientRect: mem_dc = wx.MemoryDC() bmp = wx.EmptyBitmap(width, height) mem_dc.SelectObject(bmp) while coveredY < height: while coveredX < width: mem_dc.DrawBitmap(self._skin, coveredX, coveredY, True) coveredX += xstep coveredX = 0 coveredY += ystep mem_dc.SelectObject(wx.NullBitmap) #self._skin = bmp dc.DrawBitmap(bmp, 0, 0) else: dc.DrawBitmap(self._skin, 0, 0) def OnMouseLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` event for L{LabelContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseLeftUp(self, event) return if self.HasCapture(): self.ReleaseMouse() # Sash was being dragged? if not self._sashRect.IsEmpty(): # Remove sash ArtManager.Get().DrawDragSash(self._sashRect) self.Resize(event) self._sashRect = wx.Rect() return self._sashRect = wx.Rect() # Restore cursor if self._oldCursor.Ok(): wx.SetCursor(self._oldCursor) self._oldCursor = wx.NullCursor ImageContainerBase.OnMouseLeftUp(self, event) def Resize(self, event): """ Actually resizes the tab area. :param `event`: an instance of `wx.SizeEvent`. """ # Resize our size self._tabAreaSize = self.GetSize() newWidth = self._tabAreaSize.x x = event.GetX() if self.HasAGWFlag(INB_BOTTOM) or self.HasAGWFlag(INB_RIGHT): newWidth -= event.GetX() else: newWidth = x if newWidth < 100: # Dont allow width to be lower than that newWidth = 100 self.SetSizeHints(newWidth, self._tabAreaSize.y) # Update the tab new area width self._nTabAreaWidth = newWidth self.GetParent().Freeze() self.GetParent().GetSizer().Layout() self.GetParent().Thaw() def OnMouseMove(self, event): """ Handles the ``wx.EVT_MOTION`` event for L{LabelContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseMove(self, event) return # Remove old sash if not self._sashRect.IsEmpty(): ArtManager.Get().DrawDragSash(self._sashRect) if event.LeftIsDown(): if not self._sashRect.IsEmpty(): # Progress sash, and redraw it clientRect = self.GetClientRect() pt = self.ClientToScreen(wx.Point(event.GetX(), 0)) self._sashRect = wx.RectPS(pt, wx.Size(4, clientRect.height)) ArtManager.Get().DrawDragSash(self._sashRect) else: # Sash is not being dragged if self._oldCursor.Ok(): wx.SetCursor(self._oldCursor) self._oldCursor = wx.NullCursor else: if self.HasCapture(): self.ReleaseMouse() if self.PointOnSash(event.GetPosition()): # Change cursor to EW cursor self._oldCursor = self.GetCursor() wx.SetCursor(wx.StockCursor(wx.CURSOR_SIZEWE)) elif self._oldCursor.Ok(): wx.SetCursor(self._oldCursor) self._oldCursor = wx.NullCursor self._sashRect = wx.Rect() ImageContainerBase.OnMouseMove(self, event) def OnMouseLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` event for L{LabelContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseLeftDown(self, event) return imgIdx, where = self.HitTest(event.GetPosition()) if IMG_OVER_EW_BORDER == where and not self._bCollapsed: # We are over the sash if not self._sashRect.IsEmpty(): ArtManager.Get().DrawDragSash(self._sashRect) else: # first time, begin drawing sash self.CaptureMouse() # Change mouse cursor self._oldCursor = self.GetCursor() wx.SetCursor(wx.StockCursor(wx.CURSOR_SIZEWE)) clientRect = self.GetClientRect() pt = self.ClientToScreen(wx.Point(event.GetX(), 0)) self._sashRect = wx.RectPS(pt, wx.Size(4, clientRect.height)) ArtManager.Get().DrawDragSash(self._sashRect) else: ImageContainerBase.OnMouseLeftDown(self, event) def OnMouseLeaveWindow(self, event): """ Handles the ``wx.EVT_LEAVE_WINDOW`` event for L{LabelContainer}. :param `event`: a `wx.MouseEvent` event to be processed. """ if self.HasAGWFlag(INB_NO_RESIZE): ImageContainerBase.OnMouseLeaveWindow(self, event) return # If Sash is being dragged, ignore this event if not self.HasCapture(): ImageContainerBase.OnMouseLeaveWindow(self, event) def DrawRegularHover(self, dc, rect): """ Draws a rounded rectangle around the current tab. :param `dc`: an instance of `wx.DC`; :param `rect`: the current tab client rectangle. """ # The hovered tab with default border dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(wx.Pen(wx.WHITE)) # We draw CCW if self.HasAGWFlag(INB_RIGHT) or self.HasAGWFlag(INB_TOP): # Right images # Upper line dc.DrawLine(rect.x + 1, rect.y, rect.x + rect.width, rect.y) # Right line (white) dc.DrawLine(rect.x + rect.width, rect.y, rect.x + rect.width, rect.y + rect.height) # Bottom diagnol - we change pen dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR])) # Bottom line dc.DrawLine(rect.x + rect.width, rect.y + rect.height, rect.x, rect.y + rect.height) else: # Left images # Upper line white dc.DrawLine(rect.x, rect.y, rect.x + rect.width - 1, rect.y) # Left line dc.DrawLine(rect.x, rect.y, rect.x, rect.y + rect.height) # Bottom diagnol, we change the pen dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR])) # Bottom line dc.DrawLine(rect.x, rect.y + rect.height, rect.x + rect.width, rect.y + rect.height) def DrawWebHover(self, dc, caption, xCoord, yCoord): """ Draws a web style hover effect (cursor set to hand & text is underlined). :param `dc`: an instance of `wx.DC`; :param `caption`: the tab caption text; :param `xCoord`: the x position of the tab caption; :param `yCoord`: the y position of the tab caption. """ # Redraw the text with underlined font underLinedFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) underLinedFont.SetPointSize(underLinedFont.GetPointSize() * self.GetParent().GetFontSizeMultiple()) if self.GetParent().GetFontBold(): underLinedFont.SetWeight(wx.FONTWEIGHT_BOLD) underLinedFont.SetUnderlined(True) dc.SetFont(underLinedFont) dc.DrawText(caption, xCoord, yCoord) def SetColour(self, which, colour): """ Sets a colour for a parameter. :param `which`: can be one of the following parameters: ================================== ======= ================================== Colour Key Value Description ================================== ======= ================================== ``INB_TAB_AREA_BACKGROUND_COLOUR`` 100 The tab area background colour ``INB_ACTIVE_TAB_COLOUR`` 101 The active tab background colour ``INB_TABS_BORDER_COLOUR`` 102 The tabs border colour ``INB_TEXT_COLOUR`` 103 The tab caption text colour ``INB_ACTIVE_TEXT_COLOUR`` 104 The active tab caption text colour ``INB_HILITE_TAB_COLOUR`` 105 The tab caption highlight text colour ================================== ======= ================================== :param `colour`: a valid `wx.Colour` object. """ self._coloursMap[which] = colour def GetColour(self, which): """ Returns a colour for a parameter. :param `which`: the colour key. :see: L{SetColour} for a list of valid colour keys. """ if not self._coloursMap.has_key(which): return wx.Colour() return self._coloursMap[which] def InitializeColours(self): """ Initializes the colours map to be used for this control. """ # Initialize map colours self._coloursMap.update({INB_TAB_AREA_BACKGROUND_COLOUR: ArtManager.Get().LightColour(ArtManager.Get().FrameColour(), 50)}) self._coloursMap.update({INB_ACTIVE_TAB_COLOUR: ArtManager.Get().GetMenuFaceColour()}) self._coloursMap.update({INB_TABS_BORDER_COLOUR: wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DSHADOW)}) self._coloursMap.update({INB_HILITE_TAB_COLOUR: wx.NamedColour("LIGHT BLUE")}) self._coloursMap.update({INB_TEXT_COLOUR: wx.WHITE}) self._coloursMap.update({INB_ACTIVE_TEXT_COLOUR: wx.BLACK}) # dont allow bright colour one on the other if not ArtManager.Get().IsDark(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR]) and \ not ArtManager.Get().IsDark(self._coloursMap[INB_TEXT_COLOUR]): self._coloursMap[INB_TEXT_COLOUR] = ArtManager.Get().DarkColour(self._coloursMap[INB_TEXT_COLOUR], 100) def DrawLabel(self, dc, rect, text, bmp, imgInfo, orientationLeft, imgIdx, selected, hover): """ Draws a label using the specified dc. :param `dc`: an instance of `wx.DC`; :param `rect`: the text client rectangle; :param `text`: the actual text string; :param `bmp`: a bitmap to be drawn next to the text; :param `imgInfo`: an instance of L{ImageInfo}; :param `orientationLeft`: ``True`` if the book has the ``INB_RIGHT`` or ``INB_LEFT`` style set; :param `imgIdx`: the tab image index; :param `selected`: ``True`` if the tab is selected, ``False`` otherwise; :param `hover`: ``True`` if the tab is being hovered with the mouse, ``False`` otherwise. """ dcsaver = DCSaver(dc) nPadding = 6 if orientationLeft: rect.x += nPadding rect.width -= nPadding else: rect.width -= nPadding textRect = wx.Rect(*rect) imgRect = wx.Rect(*rect) font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetPointSize(font.GetPointSize() * self.GetParent().GetFontSizeMultiple()) if self.GetParent().GetFontBold(): font.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(font) # First we define the rectangle for the text w, h = dc.GetTextExtent(text) #------------------------------------------------------------------------- # Label layout: # [ nPadding | Image | nPadding | Text | nPadding ] #------------------------------------------------------------------------- # Text bounding rectangle textRect.x += nPadding textRect.y = rect.y + (rect.height - h)/2 textRect.width = rect.width - 2 * nPadding if bmp.Ok() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT): textRect.x += (bmp.GetWidth() + nPadding) textRect.width -= (bmp.GetWidth() + nPadding) textRect.height = h # Truncate text if needed caption = ArtManager.Get().TruncateText(dc, text, textRect.width) # Image bounding rectangle if bmp.Ok() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT): imgRect.x += nPadding imgRect.width = bmp.GetWidth() imgRect.y = rect.y + (rect.height - bmp.GetHeight())/2 imgRect.height = bmp.GetHeight() # Draw bounding rectangle if selected: # First we colour the tab dc.SetBrush(wx.Brush(self._coloursMap[INB_ACTIVE_TAB_COLOUR])) if self.HasAGWFlag(INB_BORDER): dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR])) else: dc.SetPen(wx.Pen(self._coloursMap[INB_ACTIVE_TAB_COLOUR])) labelRect = wx.Rect(*rect) if orientationLeft: labelRect.width += 3 else: labelRect.width += 3 labelRect.x -= 3 dc.DrawRoundedRectangleRect(labelRect, 3) if not orientationLeft and self.HasAGWFlag(INB_DRAW_SHADOW): dc.SetPen(wx.BLACK_PEN) dc.DrawPoint(labelRect.x + labelRect.width - 1, labelRect.y + labelRect.height - 1) # Draw the text & bitmap if caption != "": if selected: dc.SetTextForeground(self._coloursMap[INB_ACTIVE_TEXT_COLOUR]) else: dc.SetTextForeground(self._coloursMap[INB_TEXT_COLOUR]) dc.DrawText(caption, textRect.x, textRect.y) imgInfo.SetTextRect(textRect) else: imgInfo.SetTextRect(wx.Rect()) if bmp.Ok() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT): dc.DrawBitmap(bmp, imgRect.x, imgRect.y, True) # Drop shadow if self.HasAGWFlag(INB_DRAW_SHADOW) and selected: sstyle = 0 if orientationLeft: sstyle = BottomShadow else: sstyle = BottomShadowFull | RightShadow if self.HasAGWFlag(INB_WEB_HILITE): # Always drop shadow for this style ArtManager.Get().DrawBitmapShadow(dc, rect, sstyle) else: if imgIdx+1 != self._nHoeveredImgIdx: ArtManager.Get().DrawBitmapShadow(dc, rect, sstyle) # Draw hover effect if hover: if self.HasAGWFlag(INB_WEB_HILITE) and caption != "": self.DrawWebHover(dc, caption, textRect.x, textRect.y) else: self.DrawRegularHover(dc, rect) # Update the page information bout position and size imgInfo.SetPosition(rect.GetPosition()) imgInfo.SetSize(rect.GetSize()) # ---------------------------------------------------------------------------- # # Class FlatBookBase # ---------------------------------------------------------------------------- # class FlatBookBase(wx.Panel): """ Base class for the containing window for L{LabelBook} and L{FlatImageBook}. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="FlatBookBase"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ self._pages = None self._bInitializing = True self._pages = None self._bForceSelection = False self._windows = [] self._fontSizeMultiple = 1.0 self._fontBold = False style |= wx.TAB_TRAVERSAL self._agwStyle = agwStyle wx.Panel.__init__(self, parent, id, pos, size, style, name) self._bInitializing = False def SetAGWWindowStyleFlag(self, agwStyle): """ Sets the window style. :param `agwStyle`: can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== """ self._agwStyle = agwStyle # Check that we are not in initialization process if self._bInitializing: return if not self._pages: return # Detach the windows attached to the sizer if self.GetSelection() >= 0: self._mainSizer.Detach(self._windows[self.GetSelection()]) self._mainSizer.Detach(self._pages) # Create new sizer with the requested orientaion className = self.GetName() if className == "LabelBook": self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: self._mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self._mainSizer) # Add the tab container and the separator self._mainSizer.Add(self._pages, 0, wx.EXPAND) if className == "FlatImageBook": if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._pages.SetSizeHints(self._pages._nImgSize * 2, -1) else: self._pages.SetSizeHints(-1, self._pages._nImgSize * 2) # Attach the windows back to the sizer to the sizer if self.GetSelection() >= 0: self.DoSetSelection(self._windows[self.GetSelection()]) if agwStyle & INB_FIT_LABELTEXT: self.ResizeTabArea() self._mainSizer.Layout() dummy = wx.SizeEvent() wx.PostEvent(self, dummy) self._pages.Refresh() def GetAGWWindowStyleFlag(self): """ Returns the L{FlatBookBase} window style. :see: L{SetAGWWindowStyleFlag} for a list of possible window style flags. """ return self._agwStyle def HasAGWFlag(self, flag): """ Returns whether a flag is present in the L{FlatBookBase} style. :param `flag`: one of the possible L{FlatBookBase} window styles. :see: L{SetAGWWindowStyleFlag} for a list of possible window style flags. """ agwStyle = self.GetAGWWindowStyleFlag() res = (agwStyle & flag and [True] or [False])[0] return res def AddPage(self, page, text, select=False, imageId=-1): """ Adds a page to the book. :param `page`: specifies the new page; :param `text`: specifies the text for the new page; :param `select`: specifies whether the page should be selected; :param `imageId`: specifies the optional image index for the new page. :note: The call to this function generates the page changing events. """ if not page: return page.Reparent(self) self._windows.append(page) if select or len(self._windows) == 1: self.DoSetSelection(page) else: page.Hide() self._pages.AddPage(text, select, imageId) self.ResizeTabArea() self.Refresh() def InsertPage(self, page_idx, page, text, select=False, imageId=-1): """ Inserts a page into the book at the specified position. :param `page_idx`: specifies the position for the new page; :param `page`: specifies the new page; :param `text`: specifies the text for the new page; :param `select`: specifies whether the page should be selected; :param `imageId`: specifies the optional image index for the new page. :note: The call to this function generates the page changing events. """ if not page: return page.Reparent(self) self._windows.insert(page_idx, page) if select or len(self._windows) == 1: self.DoSetSelection(page) else: page.Hide() self._pages.InsertPage(page_idx, text, select, imageId) self.ResizeTabArea() self.Refresh() def DeletePage(self, page): """ Deletes the specified page, and the associated window. :param `page`: an integer specifying the page to be deleted. :note: The call to this function generates the page changing events. """ if page >= len(self._windows) or page < 0: return # Fire a closing event event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, self.GetId()) event.SetSelection(page) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) # The event handler allows it? if not event.IsAllowed(): return False self.Freeze() # Delete the requested page pageRemoved = self._windows[page] # If the page is the current window, remove it from the sizer # as well if page == self.GetSelection(): self._mainSizer.Detach(pageRemoved) # Remove it from the array as well self._windows.pop(page) # Now we can destroy it in wxWidgets use Destroy instead of delete pageRemoved.Destroy() self._mainSizer.Layout() self._pages.DoDeletePage(page) self.ResizeTabArea() self.Thaw() # Fire a closed event closedEvent = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, self.GetId()) closedEvent.SetSelection(page) closedEvent.SetEventObject(self) self.GetEventHandler().ProcessEvent(closedEvent) def RemovePage(self, page): """ Deletes the specified page, without deleting the associated window. :param `page`: an integer specifying the page to be removed. :note: The call to this function generates the page changing events. """ if page >= len(self._windows): return False # Fire a closing event event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, self.GetId()) event.SetSelection(page) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) # The event handler allows it? if not event.IsAllowed(): return False self.Freeze() # Remove the requested page pageRemoved = self._windows[page] # If the page is the current window, remove it from the sizer # as well if page == self.GetSelection(): self._mainSizer.Detach(pageRemoved) # Remove it from the array as well self._windows.pop(page) self._mainSizer.Layout() self.ResizeTabArea() self.Thaw() self._pages.DoDeletePage(page) # Fire a closed event closedEvent = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, self.GetId()) closedEvent.SetSelection(page) closedEvent.SetEventObject(self) self.GetEventHandler().ProcessEvent(closedEvent) return True def ResizeTabArea(self): """ Resizes the tab area if the control has the ``INB_FIT_LABELTEXT`` style set. """ agwStyle = self.GetAGWWindowStyleFlag() if agwStyle & INB_FIT_LABELTEXT == 0: return if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: dc = wx.MemoryDC() dc.SelectObject(wx.EmptyBitmap(1, 1)) font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetPointSize(font.GetPointSize()*self._fontSizeMultiple) if self.GetFontBold(): font.SetWeight(wx.FONTWEIGHT_BOLD) dc.SetFont(font) maxW = 0 for page in xrange(self.GetPageCount()): caption = self._pages.GetPageText(page) w, h = dc.GetTextExtent(caption) maxW = max(maxW, w) maxW += 24 #TODO this is 6*4 6 is nPadding from drawlabel if not agwStyle & INB_SHOW_ONLY_TEXT: maxW += self._pages._nImgSize * 2 maxW = max(maxW, 100) self._pages.SetSizeHints(maxW, -1) self._pages._nTabAreaWidth = maxW def DeleteAllPages(self): """ Deletes all the pages in the book. """ if not self._windows: return self.Freeze() for win in self._windows: win.Destroy() self._windows = [] self.Thaw() # remove old selection self._pages.ClearAll() self._pages.Refresh() def SetSelection(self, page): """ Changes the selection from currently visible/selected page to the page given by page. :param `page`: an integer specifying the page to be selected. :note: The call to this function generates the page changing events. """ if page >= len(self._windows): return if page == self.GetSelection() and not self._bForceSelection: return oldSelection = self.GetSelection() # Generate an event that indicates that an image is about to be selected event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CHANGING, self.GetId()) event.SetSelection(page) event.SetOldSelection(oldSelection) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) # The event handler allows it? if not event.IsAllowed() and not self._bForceSelection: return self.DoSetSelection(self._windows[page]) # Now we can update the new selection self._pages._nIndex = page # Refresh calls the OnPaint of this class self._pages.Refresh() # Generate an event that indicates that an image was selected eventChanged = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CHANGED, self.GetId()) eventChanged.SetEventObject(self) eventChanged.SetOldSelection(oldSelection) eventChanged.SetSelection(page) self.GetEventHandler().ProcessEvent(eventChanged) def AssignImageList(self, imglist): """ Assigns an image list to the control. :param `imglist`: an instance of `wx.ImageList`. """ self._pages.AssignImageList(imglist) # Force change self.SetAGWWindowStyleFlag(self.GetAGWWindowStyleFlag()) def GetSelection(self): """ Returns the current selection. """ if self._pages: return self._pages._nIndex else: return -1 def DoSetSelection(self, window): """ Select the window by the provided pointer. :param `window`: an instance of `wx.Window`. """ curSel = self.GetSelection() agwStyle = self.GetAGWWindowStyleFlag() # Replace the window in the sizer self.Freeze() # Check if a new selection was made bInsertFirst = (agwStyle & INB_BOTTOM or agwStyle & INB_RIGHT) if curSel >= 0: # Remove the window from the main sizer self._mainSizer.Detach(self._windows[curSel]) self._windows[curSel].Hide() if bInsertFirst: self._mainSizer.Insert(0, window, 1, wx.EXPAND) else: self._mainSizer.Add(window, 1, wx.EXPAND) window.Show() self._mainSizer.Layout() self.Thaw() def GetImageList(self): """ Returns the associated image list. """ return self._pages.GetImageList() def GetPageCount(self): """ Returns the number of pages in the book. """ return len(self._windows) def GetFontBold(self): """ Gets the font bold status. """ return self._fontBold def SetFontBold(self, bold): """ Sets whether the page captions are bold or not. :param `bold`: ``True`` or ``False``. """ self._fontBold = bold def GetFontSizeMultiple(self): """ Gets the font size multiple for the page captions. """ return self._fontSizeMultiple def SetFontSizeMultiple(self, multiple): """ Sets the font size multiple for the page captions. :param `multiple`: The multiple to be applied to the system font to get the our font size. """ self._fontSizeMultiple = multiple def SetPageImage(self, page, imageId): """ Sets the image index for the given page. :param `page`: an integer specifying the page index; :param `image`: an index into the image list. """ self._pages.SetPageImage(page, imageId) self._pages.Refresh() def SetPageText(self, page, text): """ Sets the text for the given page. :param `page`: an integer specifying the page index; :param `text`: the new tab label. """ self._pages.SetPageText(page, text) self._pages.Refresh() def GetPageText(self, page): """ Returns the text for the given page. :param `page`: an integer specifying the page index. """ return self._pages.GetPageText(page) def GetPageImage(self, page): """ Returns the image index for the given page. :param `page`: an integer specifying the page index. """ return self._pages.GetPageImage(page) def GetPage(self, page): """ Returns the window at the given page position. :param `page`: an integer specifying the page to be returned. """ if page >= len(self._windows): return return self._windows[page] def GetCurrentPage(self): """ Returns the currently selected notebook page or ``None``. """ if self.GetSelection() < 0: return return self.GetPage(self.GetSelection()) def AdvanceSelection(self, forward=True): """ Cycles through the tabs. :param `forward`: if ``True``, the selection is advanced in ascending order (to the right), otherwise the selection is advanced in descending order. :note: The call to this function generates the page changing events. """ nSel = self.GetSelection() if nSel < 0: return nMax = self.GetPageCount() - 1 if forward: newSelection = (nSel == nMax and [0] or [nSel + 1])[0] else: newSelection = (nSel == 0 and [nMax] or [nSel - 1])[0] self.SetSelection(newSelection) def ChangeSelection(self, page): """ Changes the selection for the given page, returning the previous selection. :param `page`: an integer specifying the page to be selected. :note: The call to this function does not generate the page changing events. """ if page < 0 or page >= self.GetPageCount(): return oldPage = self.GetSelection() self.DoSetSelection(page) return oldPage CurrentPage = property(GetCurrentPage, doc="See `GetCurrentPage`") Page = property(GetPage, doc="See `GetPage`") PageCount = property(GetPageCount, doc="See `GetPageCount`") PageImage = property(GetPageImage, SetPageImage, doc="See `GetPageImage, SetPageImage`") PageText = property(GetPageText, SetPageText, doc="See `GetPageText, SetPageText`") Selection = property(GetSelection, SetSelection, doc="See `GetSelection, SetSelection`") # ---------------------------------------------------------------------------- # # Class FlatImageBook # ---------------------------------------------------------------------------- # class FlatImageBook(FlatBookBase): """ Default implementation of the image book, it is like a `wx.Notebook`, except that images are used to control the different pages. This container is usually used for configuration dialogs etc. :note: Currently, this control works properly for images of size 32x32 and bigger. """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="FlatImageBook"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ FlatBookBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self._pages = self.CreateImageContainer() if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: self._mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self._mainSizer) # Add the tab container to the sizer self._mainSizer.Add(self._pages, 0, wx.EXPAND) if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._pages.SetSizeHints(self._pages.GetImageSize() * 2, -1) else: self._pages.SetSizeHints(-1, self._pages.GetImageSize() * 2) self._mainSizer.Layout() def CreateImageContainer(self): """ Creates the image container class for L{FlatImageBook}. """ return ImageContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag()) # ---------------------------------------------------------------------------- # # Class LabelBook # ---------------------------------------------------------------------------- # class LabelBook(FlatBookBase): """ An implementation of a notebook control - except that instead of having tabs to show labels, it labels to the right or left (arranged horizontally). """ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="LabelBook"): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.Panel` window style; :param `agwStyle`: the AGW-specific window style. This can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== :param `name`: the window name. """ FlatBookBase.__init__(self, parent, id, pos, size, style, agwStyle, name) self._pages = self.CreateImageContainer() # Label book specific initialization self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) self.SetSizer(self._mainSizer) # Add the tab container to the sizer self._mainSizer.Add(self._pages, 0, wx.EXPAND) self._pages.SetSizeHints(self._pages.GetTabAreaWidth(), -1) # Initialize the colours maps self._pages.InitializeColours() self.Bind(wx.EVT_SIZE, self.OnSize) def CreateImageContainer(self): """ Creates the image container (LabelContainer) class for L{FlatImageBook}. """ return LabelContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag()) def SetColour(self, which, colour): """ Sets the colour for the specified parameter. :param `which`: the colour key; :param `colour`: a valid `wx.Colour` instance. :see: L{LabelContainer.SetColour} for a list of valid colour keys. """ self._pages.SetColour(which, colour) def GetColour(self, which): """ Returns the colour for the specified parameter. :param `which`: the colour key. :see: L{LabelContainer.SetColour} for a list of valid colour keys. """ return self._pages.GetColour(which) def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` event for L{LabelBook}. :param `event`: a `wx.SizeEvent` event to be processed. """ self._pages.Refresh() event.Skip() DisplayCAL-3.5.0.0/DisplayCAL/lib/agw/pygauge.py0000644000076500000000000002624012665102036020767 0ustar devwheel00000000000000# --------------------------------------------------------------------------------- # # PYGAUGE wxPython IMPLEMENTATION # # Mark Reed, @ 28 Jul 2010 # Latest Revision: 02 Aug 2010, 09.00 GMT # # TODO List # # 1. Indeterminate mode (see wx.Gauge) # 2. Vertical bar # 3. Bitmap support (bar, background) # 4. UpdateFunction - Pass a function to PyGauge which will be called every X # milliseconds and the value will be updated to the returned value. # 5. Currently the full gradient is drawn from 0 to value. Perhaps the gradient # should be drawn from 0 to range and clipped at 0 to value. # 6. Add a label? # # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please # Write To The: # # wxPython Mailing List!!! # # End Of Comments # --------------------------------------------------------------------------------- # """ PyGauge is a generic `wx.Gauge` implementation. Description =========== PyGauge supports the determinate mode functions as `wx.Gauge` and adds an L{Update} function which takes a value and a time parameter. The `value` is added to the current value over a period of `time` milliseconds. Supported Platforms =================== PyGauge has been tested on the following platforms: * Windows (Windows XP); License And Version =================== PyGauge is distributed under the wxPython license. PyGauge has been kindly contributed to the AGW library by Mark Reed. Latest Revision: Andrea Gavana @ 02 Aug 2010, 09.00 GMT Version 0.1 """ import wx import copy class PyGauge(wx.PyWindow): """ This class provides a visual alternative for `wx.Gauge`. It currently only support determinate mode (see L{PyGauge.SetValue} and L{PyGauge.SetRange}) """ def __init__(self, parent, id=wx.ID_ANY, range=100, pos=wx.DefaultPosition, size=(-1,30), style=0): """ Default class constructor. :param `parent`: parent window. Must not be ``None``; :param `id`: window identifier. A value of -1 indicates a default value; :param `pos`: the control position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxPython, depending on platform; :param `size`: the control size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxPython, depending on platform; :param `style`: the underlying `wx.PyWindow` window style. """ wx.PyWindow.__init__(self, parent, id, pos, size, style) self._size = size self._border_colour = None self._barColour = self._barColourSorted = [wx.Colour(212,228,255)] self._barGradient = self._barGradientSorted = None self._border_padding = 0 self._range = range self._value = [0] self._valueSorted = [0] self._timerId = wx.NewId() self._timer = None self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.Bind(wx.EVT_TIMER, self.OnTimer) def DoGetBestSize(self): """ Overridden base class virtual. Determines the best size of the button based on the label and bezel size. """ return wx.Size(self._size[0], self._size[1]) def GetBorderColour(self): """ Returns the L{PyGauge} border colour. """ return self._border_colour def SetBorderColour(self, colour): """ Sets the L{PyGauge} border colour. :param `colour`: an instance of `wx.Colour`. """ self._border_colour = colour SetBorderColor = SetBorderColour GetBorderColor = GetBorderColour def GetBarColour(self): """ Returns the L{PyGauge} main bar colour. """ return self._barColour[0] def SetBarColour(self, colour): """ Sets the L{PyGauge} main bar colour. :param `colour`: an instance of `wx.Colour`. """ if type(colour) != type([]): self._barColour = [colour] else: self._barColour = list(colour) self.SortForDisplay() SetBarColor = SetBarColour GetBarColor = GetBarColour def GetBarGradient(self): """ Returns a tuple containing the gradient start and end colours. """ if self._barGradient is None: return None return self._barGradient[0] def SetBarGradient(self, gradient): """ Sets the bar gradient. :param `gradient`: a tuple containing the gradient start and end colours. :note: This overrides the bar colour previously set with L{SetBarColour}. """ if type(gradient) != type([]): self._barGradient = [gradient] else: self._barGradient = list(gradient) self.SortForDisplay() def GetBorderPadding(self): """ Gets the border padding. """ return self._border_padding def SetBorderPadding(self, padding): """ Sets the border padding. :param `padding`: pixels between the border and the progress bar. """ self._border_padding = padding def GetRange(self): """ Returns the maximum value of the gauge. """ return self._range def SetRange(self, range): """ Sets the range of the gauge. The gauge length is its value as a proportion of the range. :param `range`: The maximum value of the gauge. """ if range <= 0: raise Exception("ERROR:\n Gauge range must be greater than 0.") self._range = range def GetValue(self): """ Returns the current position of the gauge. """ return self._value[0] def SetValue(self, value): """ Sets the current position of the gauge. :param `value`: an integer specifying the current position of the gauge. """ if type(value) != type([]): self._value = [value] else: self._value = list(value) self.SortForDisplay() for v in self._value: if v < 0 or v > self._range: raise Exception("ERROR:\n Gauge value must be between 0 and its range.") def OnEraseBackground(self, event): """ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for L{PyGauge}. :param `event`: a `wx.EraseEvent` event to be processed. :note: This method is intentionally empty to reduce flicker. """ pass def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{PyGauge}. :param `event`: a `wx.PaintEvent` event to be processed. """ dc = wx.BufferedPaintDC(self) rect = self.GetClientRect() dc.SetBackground(wx.Brush(self.GetBackgroundColour())) dc.Clear() colour = self.GetBackgroundColour() dc.SetBrush(wx.Brush(colour)) dc.SetPen(wx.Pen(colour)) dc.DrawRectangleRect(rect) if self._border_colour: dc.SetPen(wx.Pen(self.GetBorderColour())) dc.DrawRectangleRect(rect) pad = 1 + self.GetBorderPadding() rect.Deflate(pad,pad) if self.GetBarGradient(): for i, gradient in enumerate(self._barGradientSorted): c1,c2 = gradient w = rect.width * (float(self._valueSorted[i]) / self._range) r = copy.copy(rect) r.width = w dc.GradientFillLinear(r, c1, c2, wx.EAST) else: for i, colour in enumerate(self._barColourSorted): dc.SetBrush(wx.Brush(colour)) dc.SetPen(wx.Pen(colour)) w = rect.width * (float(self._valueSorted[i]) / self._range) r = copy.copy(rect) r.width = w dc.DrawRectangleRect(r) def OnTimer(self,event): """ Handles the ``wx.EVT_TIMER`` event for L{PyGauge}. :param `event`: a `wx.TimerEvent` event to be processed. """ if self._timerId == event.GetId(): stop_timer = True for i, v in enumerate(self._value): self._value[i] += self._update_step[i] if self._update_step[i] > 0: if self._value[i] > self._update_value[i]: self._value[i] = self._update_value[i] else: stop_timer = False else: if self._value[i] < self._update_value[i]: self._value[i] = self._update_value[i] else: stop_timer = False if stop_timer: self._timer.Stop() self.SortForDisplay() self.Refresh() def Update(self, value, time=0): """ Update the gauge by adding `value` to it over `time` milliseconds. The `time` parameter **must** be a multiple of 50 milliseconds. :param `value`: The value to be added to the gauge; :param `time`: The length of time in milliseconds that it will take to move the gauge. """ if type(value) != type([]): value = [value] if len(value) != len(self._value): raise Exception("ERROR:\n len(value) != len(self.GetValue())") self._update_value = [] self._update_step = [] for i, v in enumerate(self._value): if value[i]+v <= 0 or value[i]+v > self._range: raise Exception("ERROR:\n Gauge value must be between 0 and its range. ") self._update_value.append(value[i] + v) self._update_step.append(float(value[i])/(time/50)) #print self._update_ if not self._timer: self._timer = wx.Timer(self, self._timerId) self._timer.Start(100) def SortForDisplay(self): """ Internal method which sorts things so we draw the longest bar first. """ if self.GetBarGradient(): tmp = sorted(zip(self._value,self._barGradient)); tmp.reverse() a,b = zip(*tmp) self._valueSorted = list(a) self._barGradientSorted = list(b) else: tmp = sorted(zip(self._value,self._barColour)); tmp.reverse() a,b = zip(*tmp) self._valueSorted = list(a) self._barColourSorted = list(b) DisplayCAL-3.5.0.0/DisplayCAL/lib32/0000755000076500000000000000000013242313606016336 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/lib32/__init__.py0000644000076500000000000000000112665102037020440 0ustar devwheel00000000000000#DisplayCAL-3.5.0.0/DisplayCAL/lib32/python26/0000755000076500000000000000000013242313606020027 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/lib32/python26/__init__.py0000644000076500000000000000000112665102036022130 0ustar devwheel00000000000000#DisplayCAL-3.5.0.0/DisplayCAL/lib32/python26/RealDisplaySizeMM.so0000755000076500000000000013223313221473245023702 0ustar devwheel00000000000000ELF 4L4 ($!88>NNh>NNQtdRtd>NN((cD1: 56 A.7'- 0&? )%/!"(@3>+#8*4 2;=B<9$,C 7@9`$789:<=>?@ABCCE爢wx;wqX|ۧI%|j6cۏ)^5h + # J 7yI'*^] B$Yw"@Q? 5 P2   @Qp+ lH \QoHQP\ RLQ__gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesnull_error_handlerg_error_handler_triggeredinitRealDisplaySizeMMPy_InitModule4free_a_disppathfreefree_disppaths__strdupstrrchrstrchr__sprintf_chkXOpenDisplayXCloseDisplayget_displaysgetenvstrncpyXSetErrorHandlercalloc__strcat_chkXRRQueryExtensionXRRQueryVersionXRRGetCrtcInfoXRRGetOutputInfoXRRGetCrtcGammaXRRFreeGammareallocXInternAtomXRRGetOutputPropertymallocmemmoveXFreeXRRFreeOutputInfoXRRFreeCrtcInfoXRRFreeScreenResourcesXineramaQueryExtensionXineramaIsActiveXineramaQueryScreensXGetWindowPropertyXF86VidModeQueryExtensionXF86VidModeGetMonitorerrorstrcpyXRRGetScreenResourcesstderrfwritedlopendlsymPyList_NewPyDict_NewPyString_FromStringPyDict_SetItemStringPy_BuildValuePyInt_FromLongPyString_FromStringAndSizePyList_Appendget_a_displayPyArg_ParseTuplecallback_ddebuglibX11.so.6libXinerama.so.1libXrandr.so.2libXxf86vm.so.1libpthread.so.0libc.so.6__stack_chk_fail_edata__bss_start_endGLIBC_2.1.3GLIBC_2.4GLIBC_2.3.4GLIBC_2.0si ii  ti ii  OPQQ QQQQ Q$Q,QOO OCOO3PPP PPPPP P $P (P ,P 0P4P8PufzdA 0D$x$4$V|D$$;|D|D$$<ppPppp ABpAB A BABdA 0B0plA 0B4||0BD$dL$t$ D$D$\$'p\BD$ BD$B D$B.X$t$D$,D$D$D$ ~StIA4$D$dD$D$=D$ t$XD$4$pX0$FTD$:$tBD$.$t,D$ D$D$L$$pT0$;f \_ICC@_PRO@FILE@ p\x0D$T$ $]F$" p(x0D$T$ $*F8 $Dž Džw$8E48#xD$D$ $tҋ4T$D$lD$D$0D$, D$(D$$D$ D$D$D$ B D$x$H =t =0p2$tF( pD$D$@($p B,$39t4$ k9Pt $4$Dž9P $P9( $x$`x D$$D$$x $,lx(D$4$t(Xx$DžvTD$dD$4$tMDžD]@<8TDžDžD$:$tLD$.$%t8DD$D$D$L$ $ T0$S@xx BFB FBFB2F\\Dž_ICCDž_PRODžFILEƅ\xD$L$$F$@1uPLHht&(XFreFe86_FDDC_F EDIDF1_RAFWDATfFAxD$t$$uieDžDž@vPD$D$2D$L$ 4$Bt!$tUD$<$T$B D$BD$EЉ$ Ủ<$T$D$BD$BD$EЉ$Uȉ<$T$D$EED$ED$EЉ$Uĉ<$T$D$@$7<$D$ED$d@$U<$T$D$D@ $<$D$ED$$@$$U<$T$D$H,~,P(t%L$$(tD$E<$D$@4$U<$T$D$@8$d<$D$E؉D$U܉|$$uEE$BE܃l[^_]Í&UWV1SJgEt>E8t(ut81&9Ut(DžuE1$[^_]Ë}v$<PVPVP V PVPVPVPVP V P$V$P(V(P,V,P0V0P4V4@8F8$xt~@$eFtPP(t2@,$ZF(t5@,F,D$@(D$F($sE$[^_]É4$1tE$F$Y4$Q&U(]ED$E }u$l|$1҅u]Ћu}]Ðt&E1$t p4$t$<$\t&UH]E6SD$u}lD$E $~1҅tCE$ljE]E؋u܉<$E\Eԉt$D$$‹]Ћu}]Ë $ÐUSûUVS}Út&Ћu[^]US[`Y[RealDisplaySizeMM.%dDISPLAY.0ARGYLL_IGNORE_XRANDR1_2libXrandr.soXRRGetScreenResourcesCurrentXRRGetOutputPrimaryMonitor %d, Output %s[ Clone of %s ]_ICC_PROFILE_%dUnable to intern atom '%s'_ICC_PROFILEEDID_DATAEDIDARGYLL_IGNORE_XINERAMAXFree86_DDC_EDID1_RAWDATA_%dXFree86_DDC_EDID2_RAWDATA_%dMonitor %dnamedescription(i,i)possizesize_mmx11_screenramdac_screenicc_profile_atom_idedidoutputicc_profile_output_atom_idienumerate_displaysGetXRandROutputXIDXRRGetCrtcGamma failed - falling back to older extensions %s at %d, %d, width %d, height %dEnumerate and return a list of displays.RealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display.  5oxp0 * O t o$ oo o N *:JZjz *:JZjz *:JZjz Pb7/7548u74d8GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3$"5x>!$)5x;)null_error_handler!initRealDisplaySizeMM7free_a_disppathbfree_disppaths3 get_displays-'get_a_display)callback_ddebug()g_error_handler_triggeredt/build/buildd/glibc-2.9/build-tree/i386-libc/csu/crti.S/build/buildd/glibc-2.9/csuGNU AS 2.19.17) v 50E intl8a oZ 1 - Z# \# e # #  # u# # # # e#$ L#(  #, / "#0 $#4 >&Z#8 *Z#< ,z#@ 0>#D 1L#F 2#G 6#H ?#L H#T I#X J#\  K#` L%#d  NZ#h /P#l ?  G# # 8 Z#    'n  q 2 7 1 jN k #  kK# kK C #  CK# Z C #  D#  E # > E #  I #  J# o KC#  Lv#$  M#(  N#, J R#0 S#4  T#8 X#< G Y#@ ] Z#D [j#H \#L  _#P  b#T d#X o h #\  k#` q o#d l r #h [ v#l % w #p  z#t _ { #x  |g#|  }K# b ~}# I ,#  8# e  # D D# g |#  P#   # # n }# 4 }#  }# }# }#   # 0#NM l% gm}}}Q }}} }}}} Z}F  } !'Z<<<} MS}h}  sy}}  X Z} }S Z}  }L Z}}}0 06 P} i 0G fl }   }  , Y buf #obj }#len # A # Z# Z#  # #  # p #$ p #(  o u Z } ZY    } a  Z }}  Z }   Z. }  j #  # #  #  # E #  # ] \# 9 \# @ \#$ * #(  \#, #0  #4 6 #8 V #< #@  #D  \#H  \#L \#P O \#T \#X V #\  #`  #d U #h  #l #p  #t  #x 6 #| #  #  # #  # > # h \# . (  1 # ) #  B# z B#  h# # b #   # # B#$ v  Y #  !#  "# #"  % % &%#  'P# ] ([#  )#  *d #  + # ,e  /   g 0 } 1#Z=}=ZY 2OU}j} 3 4Z}} 5 6  7gE 8} 9}}}Z :g ;gB <5 =J > ?\b}|K}} @}K j  Y   z $ &# 'm#  (Z# *#  b |g  #get #set #doc #  #r  ,& }}= Z}}7XID GE OE; QE REO e6 m~lsl Z# Hl# # # 'Zlrt'GCj  + +# 2# _ Z# x E#  E# b  E#  Z#  Z# t Z# Z# t#1 =P! "+# Z## $# V%Z# %Z# O&Z# &Z# 'Z# (# )Z#$ s*t#( +#, ,#0 -E#4 .E#8 /Z#< /Z#@ 0Z#D 1Z#H 2#Lz38  9+# :Z# ;Z# <Z# = +# #fdZ# Z# 3Z# Z# i# # # #$ Z#( { #, j Z#0 !Z#4 "Z#8 #Z#< $Z#@ %#D &Z#H { 'Z#L (#P (#T Z )Z#X ' *E#\ y+E#` ,#d -#h U.#l /#p  00#tdb1#x (2*#| 5# X 6Z#  7Z#  8,# 9E# 2:E# ;Z# <Z# <=# F># P?Z# =@#  LZ*2 Z# Z0# # 7E# 37# 7# h7#&6hi#lo# r [ i# #  # 7# [# 97# :[# " #Z# $S# , %S# V&S# 'S# (l >;">V#>'(T )E8id# V0# 0# E# J0# (0# 0# 0# Z0# 0#$ 0#( #, ~0#0 ^#4 k # d# NZ# k# Z# q# Z# w#}8m # O# # Z# SE# E# # # NZ# k# EZ#$ uq#( Z#, sZ#0 m#4~ 0D= E#xFZ#yFZ# VG0# G0# H# -I# JZ# Kq# L#$ % MZ#( & Nq#, Oee ]fZ#redg# \h# i# >fjI<@| A# GB#sxCZ#syCZ# swDZ#shDZ# ` MZ# NZ# OZ# P#$ sQ#( RZ#, OV#0 - W#4 X#8[ ~ Z# Z#!Z__s ? y[ ww w% B[ :v[ 88 8%D Z ixZ!xidZ"| ixZ"]"#wZ!$0%ev&H,'PXb('>8(>)0!i@Z*@b3 (>"]!pp+]+l 0"Z,--.) p/(&/0iZ0jZ0kZ"(Z+>Z+'1W (&~2evbZu|2erbZu|+Z+VZ>+l 0m+Z0xai8&1> (&}1D >&|3( u 3; !3{!4 !!pp5h!-6-+6,p""-6-+4@($"(Z7h+t7N&;+8Z0pix9Z0pop:ZW0jj;Z0xj<Z0xk=Z24"+R{)l,-+ YT&7!ppv+ wT&+8xZ&+ 7+Z&t 5) *6"--8`#--8,#--4#+C 1.C{1N DZ|+E 1yE|+FE !iiGZ1 H`&{4#+ p& 5 #--5  $-6-+,g --4%1|a{0evbZ 0erbZ !pp5((`($--8@$--8`$--4m%1v&+P 1.|+N Zy + 1y{+ 8U%--9--5Q#{#%--5&&%--,&L'--:*+%"()Z+V*- 1xXQ1(TQ1c(PQ 8& c N& }=s p&  & 1*}/y2K -'; }; }2l}u\0dp w )C0c2+-} 1]PP!iZ)C0c20d}O <TY24b '=ixYZ +Z 0rvZ0i[ZG*n}44e(; m}( m}0ixoZ0xidpZ,v`4|4t-7>?*a}45 (; `}( `}92ixbZul"]c,44g-7@uTV?YN&(0((0( x( 1y(QA AABfZHQB-ZLQLW(/tmp/ccxq91nO.s/build/buildd/glibc-2.9/csuGNU AS 2.19.1U%% : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I&' II : ; I8 '  : ; : ;I : ; : ;< : ; I : ;I8 .? : ; ' I : ; I: ; I.: ;' I  : ;I!4: ;I"4: ;I#.? : ; ' I@$: ; I %: ; I &.? : ;' @'.? : ;' @(: ;I) *.: ;' I@+4: ;I,1X Y-1..? : ; I@/4: ; I04: ;I14: ;I 24: ;I 3 : ;4 U51X Y61X Y7 U81UX Y91UX Y: ;: ;I <.? : ;' I@=: ;I>41?41@41 A4: ; I? < B4: ; I?  U%o /build/buildd/glibc-2.9/build-tree/i386-libc/csu../sysdeps/genericcrti.Sinitfini.c!/!=Z!gg//5!/!=Z! DisplayCAL/usr/include/bits/usr/lib/gcc/i486-linux-gnu/4.3.3/include/usr/include/usr/include/sys/usr/include/python2.6/usr/include/X11/usr/include/X11/extensionsRealDisplaySizeMM.cstdio2.hstring3.hstddef.htypes.hstdio.hlibio.htypes.hpyport.hobject.hmethodobject.hdescrobject.hX.hXlib.hxf86vmode.hXinerama.hrandr.hXrandr.h׼ f!0~Kguu֑;MMguu <o.fffi=vX ,-/3u>qfstxf <}XeK=wKQ& X-d0x(( " n` fr.f{ff}f{(f}f% $4& E yf >KK 8  -? 9Y׃gzfzt?zffz.Nz</zX,33yfxfnxy' ׃~<u}%}~.@v,hy%xfxffxf1OfxfxfbhzBK=x*YY= /1x+f.xfs. /mbx.x'(*x,2xN @tx8oYYx#+#fgX~~{<"# va0<Uf+<LZ,0"M0M00Y.0000P02 ֯} ^z.꾔H>T-YJUn]Z'C&wtt=-YpJ8pjy<>,L=k<8Fj:>XP& /tmpccxq91nO.s!!!5-!!!| LB HAB AP\AB FFAB F@"AB FSp+AB C/AB C2AB BC4|AB F[4AB FX_XRRGetScreenResourcesCurrentedid_atomdefsix_unused2outi0_filenolenfuncncrtcget_a_displaysq_ass_slicetp_getattrsq_itemgreen_masknb_addob_refcntsq_ass_itemoutisq_inplace_repeatVisualnext_screennb_lshiftsq_inplace_concattp_is_gcvSyncEnd_shortbufnb_powerrotationssq_repeatsq_concaterror_codetp_itemsizeinitprocmm_widthgreenPyGetSetDeftp_basesnull_error_handler__off_tmodesatomvbits_per_pixel_locksetattrofuncprivate_datatp_deallocnb_long_typeobjectnb_floor_dividebf_getwritebuffernb_inplace_lshiftroot_input_maskreadbufferproc__fmtnclone_XrmHashBucketRecmodeFlagsnb_indextp_richcomparemap_entries_IO_write_endnb_remaindervisitprocmax_keycodeRotationnb_inplace_multiplynameLenblack_pixeltp_comparecmaphas_primaryPyMemberDefob_typetp_freegetterrotationnb_andxdefaultstp_callWindowtdispptp_strconfigTimestampscrnresmonitorternaryfuncsprintfret_lenbitmap_bit_ordersq_contains_chaintp_setattrRealDisplaySizeMM_methodsrichcmpfuncunsigned charmin_mapsmp_ass_subscriptrscreenbf_getreadbufferColormap_IO_lock_thSyncStartprivate13classtp_dictoffsetroot_visualrootPyNumberMethodsPyMethodDefinitRealDisplaySizeMMstderrndepthsmax_mapsmp_subscripttp_clearicc_out_atommm_heightscanline_padsubpixel_ordernvisualsnmodeXErrorEventvisualidVisualIDtp_initobjobjargprocob_sizetp_dictbyte_order_IO_write_ptrtp_as_mappingsetattrfuncstrncpybinaryfuncRRCrtcmyscreenssizessizeargfuncext_datax_orgwhite_pixelbf_getbufferGetXRandROutputXIDheight_mmvTotalgetiterfuncnb_nonzerodescrsetfuncdescrgetfuncnb_octnb_inplace_add_IO_save_baseedidred_maskbname_XDisplayreprfuncproto_minor_versionedid_name__pad2_XRRModeInfobf_getcharbufferdisplay_namepixmap_formatndispsresourceidtimestampnb_divideRROutputdnamevalueproto_major_version_nextPyObjectnb_xornb_negativewritebufferprocrequestget_real_screen_size_mm_dispconnectionfree_disppaths__ssize_t__srcprintfuncedid_lenfree_a_disppathcallback_ddebugnhsyncPyBufferProcsml_flagstp_new/home/fhoech/dispcalgui/trunknb_inplace_true_dividenb_inplace_dividedestructorPyCFunctionnameLengthroot_depthhSkewsave_unders_sbuf_IO_save_endtp_delget_real_screen_size_mmprivate5stdouttp_nameclosureScreenFormatcrtcgamtp_as_sequencetp_as_bufferget_displaysnb_inplace_andshort unsigned intdefault_screentp_allocsuboffsetsresource_allocmotion_bufferdotClockmin_keycode__off64_tuscreen__len_XPrivatecoercion_IO_read_base_IO_buf_endtp_getattroallocfunc_modetp_methods_IO_write_basenext_outputtp_mrodone_xrandrsegcountprocRRMode__destblue_maskmydisplayDisplayCAL/RealDisplaySizeMM.crequest_codenb_orunaryfunc_IO_markerbitmap_padnoutputnb_floatnformatsDepthtraverseprocinquirykeysnb_invertml_docmax_request_sizeml_namey_orglong doubledesc1desc2tp_as_numberdnbufbf_getsegcounttp_weaklistoffsetwidth_mmml_methreadonlytp_docGNU C 4.3.3Atomgetattrofuncscreen_numbernewfuncPySequenceMethodsstdintp_weaklist_IO_buf_basebufferinfonscreenscharbufferproclast_request_readnb_positivehashfuncret_formatgetattrfunc_IO_read_endXF86VidModeSyncRangebitmap_unit_IO_FILE_XRRCrtcInfoshapeselfcrtcitp_hashcrtcsnb_hexndimbits_per_rgbtp_version_tagTime__pad1__pad3__pad4__pad5getbufferprocEMPTYnpossible_markers_possetterget_xrandr_output_xidqlentp_members_XGCtp_traversereleasemp_lengthbacking_storenb_inplace_xorstrcattp_subclassesargsnb_inplace_powertp_setattrofreefuncnb_multiplynb_true_dividetp_getsethTotalmheightScreentp_iternextsq_lengthSubpixelOrdertp_descr_getminvtp_iter_XRRGetOutputPrimaryxrr_foundnb_inplace_floor_dividestridestp_basenb_rshiftbf_releasebuffertp_printlong long unsigned intmemmove_cur_columnreleasebufferprocnb_inplace_remainderoutputshSyncEnd_objectnvsyncnb_absolute_IO_backup_base_IO_read_ptrvendorinternalret_togonb_inplace_oricc_atomtp_reprtp_cachedefault_gcenumerate_displaysPy_ssize_tmodel_old_offsetsq_sliceprivate10private11private12nb_inplace_rshiftprivate14private15private16private17private18private19vSyncStart_XRRCrtcGamma_XExtData_XRROutputInfolong long int_flags2bluePyMappingMethodsprivate1private2private3private4tp_flagsprivate6private8private9free_privatenb_subtract_XRRScreenResourcesg_error_handler_triggereddescriptionssizessizeobjargprocminor_codenpreferredXPointerXineramaScreenInfoiternextfuncXF86VidModeMonitorXRRModeFlagsnb_inttp_descr_setmajvPy_buffernb_coerceshort int_vtable_offsettp_basicsizenb_inplace_subtractret_typeserialdcountnb_divmodmwidthConnectionobjobjproc__quad_tclones t tu !t!#t#hupqtqstsupVuttXuuPVPXu`atactcu`RuhP9BVIVPIjWttu\u{u{u{u{ZVZu{ u{ Vu{V.P.WPVpWu{Wu{V(u{9,u{u{u{au{asuzsu{u{tWu{Wpu{pWu{Wxu{xyuzyu{9,u{u{u{.uz. u{ uz u{,u{,HuzH(u{(uz]u{]uzu{9u{,uzu{u|yPu|u|9,u|u|PDRPPu|-u|u|u|:u|u|duzuzuzuzuzuz9,uzuzu{ u{`u{u{(u{u{u{u{u{9,u{u{Zu{Ou{ u{u{u{,Hu{u{]u{,u{u{u{u{u{9,u{u{u{u{u{9,u{u{u{u{u{9,u{u{u{u{u{9,u{u{u{u{u{9,u{u{u{u{u{9,u{u{2P2BPu{u{u{9,u{u{u{u{u{9,u{u{u{u{u{9,u{u{ R P  R . RRu|u|u|9,u|u|u|u|u|9,u|u|PyVV(VV9MVZu| u|u|(u|Zu| u|u|(u|PmRtRZu| u|u|(u|Zu| u|u|(u|Zu{ u{u{(u{ Q(Qttuu`Vu`PPPP P5:PkpPPPPPP#%P>CPWZPWtt( uu  ( uupW up Wup( WVV P( VR R0 1 t1 3 t3 u0 l l u l { up upl t V V P P t t >!u  >!u :!W55D@ (9,](L R]9,L(D 9LT,O > } 1 7  e *LK.H(EpHx BpH  ! !!!55.symtab.strtab.shstrtab.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc.debug_rangesoxx% 00@-pp*5o Bo$ $ PQ t t Z   c0^Pi  h"o55u255}88N>N>N>N>O?O?P@` @Q@A@ABpBGC*Jmp xH0y|"Xl-țH;0#@ x0p $ t     5 5 8NNNNOOP@Q  N%N3N@  V@QeDQs N8NP5 Q@@" XQTQ;PQV/ i4| |4 OPN5 05  N !6KQhP\ x   LQ 5 &HQ6H[nH (9IWq2  @Q'p+ 4P^o ~\Q@Q!,"H\n tinitfini.ccrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6635dtor_idx.6637frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxRealDisplaySizeMM.cRealDisplaySizeMM_methodsget_real_screen_size_mm_dispxrr_found.14975_XRRGetScreenResourcesCurrent.14978_XRRGetOutputPrimary.14981enumerate_displaysGetXRandROutputXIDRealDisplaySizeMM_GLOBAL_OFFSET_TABLE___dso_handle__DTOR_END____i686.get_pc_thunk.cx__stack_chk_fail_local__i686.get_pc_thunk.bx_DYNAMICPyDict_SetItemStringXineramaQueryScreensXRRGetOutputPropertyXFreeXRRFreeScreenResourcesfree_a_disppathXRRFreeCrtcInfoXRRGetOutputInfonull_error_handler__gmon_start___Jv_RegisterClassesrealloc@@GLIBC_2.0g_error_handler_triggeredstrchr@@GLIBC_2.0getenv@@GLIBC_2.0_finicallback_ddebugcalloc@@GLIBC_2.0strncpy@@GLIBC_2.0XGetWindowPropertyXineramaQueryExtensioninitRealDisplaySizeMMXRRQueryExtensionXRRGetCrtcGammaXRRQueryVersionstrrchr@@GLIBC_2.0dlsymPyString_FromStringAndSizeXOpenDisplay__strcat_chk@@GLIBC_2.3.4PyArg_ParseTuplefree@@GLIBC_2.0XCloseDisplayXF86VidModeQueryExtensionget_a_displayPyString_FromStringstderr@@GLIBC_2.0PyInt_FromLongXRRGetScreenResourcesstrcpy@@GLIBC_2.0XRRFreeGammafwrite@@GLIBC_2.0Py_BuildValue__bss_startmalloc@@GLIBC_2.0get_displays__stack_chk_fail@@GLIBC_2.4PyList_Appenderror@@GLIBC_2.0free_disppathsmemmove@@GLIBC_2.0XineramaIsActivePy_InitModule4_endXInternAtomXRRGetCrtcInfo__sprintf_chk@@GLIBC_2.3.4XSetErrorHandlerXF86VidModeGetMonitor_edatadlopenPyList_New__cxa_finalize@@GLIBC_2.1.3__strdup@@GLIBC_2.0XRRFreeOutputInfo_initPyDict_NewDisplayCAL-3.5.0.0/DisplayCAL/lib32/python27/0000755000076500000000000000000013242313606020030 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/lib32/python27/__init__.py0000644000076500000000000000000112665102037022132 0ustar devwheel00000000000000#DisplayCAL-3.5.0.0/DisplayCAL/lib32/python27/RealDisplaySizeMM.pyd0000644000076500000000000002300013221473245024042 0ustar devwheel00000000000000MZ@ !L!This program cannot be run in DOS mode. $aPV>>>O>R>R>R>R>x> >?>d>d>d>Rich>PELhFZ!  0`@1^02xP1@0.text `.rdata0@@.data@@.relocP"@BVt$t'W=X0tP׃FtP׃V׃_^S\$tNU3W=X09+t8VtP׃@tP׃6E<4u^S׃_][̃HUl$\D$VWPt$\}3D$H0j D$8hBPP0 ujjT0u8_^3]H397tF<uPW`0tDjhT0tD$4Pl0 tL$0T$` A BA J+ HJ +JH@}_^]H̡Bu;h@h@B80P0 B3҅BDʉ B́t=B$u`h@h@B80P0Bu4$B3tÃ=Bu4$3tÍ$Phjj0tՋ$SUVWH03-D0< 3D$VD$PV0B=BtvD$PVh@Ճ@PӃD$8PVh0@Ճ@PӃ$VhH@Ճ@PӃ$PVh\@Ճ@PӃ$<PVhp@Ճ@PӃuD$$ R@ujD$FPD$V0B>uD$ BAD$B @DPqqq qP$h@PL0$Pl0L$4$ AtD$_^][tt$3_^][tQS؅u[YV393tD$I;tF<uS3^[YUh\0uS3]^[YÍ'D$ W05l0փE_uu5X0USC 3]^[YËD$ pփEuUX0S3]^[YS]^[Y̋L$VW33u׋_^Sjjj10؅u[׋_^Ë50jSjSS0[Nj_^̃Wt$33L$ D$tgSUVQQQS0t50jUjUD$UD$05X0tSփGtPփW֋D$T$^][_Ë_3̃j0D$ D$r8iS0U-0VWD$0tPՃt Ph@VӃ @tPՃt Ph@VӃ p ph@0Ph@VӋpph@0Ph@VӋ30D$3ɅtHQQQ20t+jU0jUD$0UD$0D$L$D$ȋ-0QPh@0Ph@VӋtPՃt PhAVӃ 0Ph AVVt$00L$0D$ A<L$<_^][PUD$Q$PhAt$0 uY4$RPhA0YQ$Ph$At$0 uYjh(A0Yhjjh@Ah$B0Vh@0YV40EEu3@^Ã&{hY$Y3^UQQ} SVW)BHEB3d}P;t3 uE=Et jY5E00u5E00؉u ];r\9;tW409t300W405E5005EE֋M9M uu9EtM u؉E띃tVX0YW40EEE=E9}33} d3EP;t3 u3F9=Ej_t j5h0h0E YYuh0h0Y=EYu3=FthFYt uWuFB3@_^[] U} uuu u ] jhh13@u3ۉ]} =BEu 9=B;tu80tuWuЋuuWu}uuWuuu.u*uSuuSu>0t uSuЅtuKuWu#ut40t+uWuЋMEQP2YYËe3ۋu]E ËuB%d0%h0UE3SVWH<AYt} p ;r H;r B(;r3_^[]Ujh1hdPSVWB1E3PEdeEh|tTE-PhRt:@$ЃEMd Y_^[]ËE3Ɂ8ËeE3Md Y_^[]UEMZf9t3]ËH<39PEu f9Q]Ã=Et3Vjj 0YYV40EEujX^Ã&3^jh1e5E500։Eu u0Yej&Ye5E։E5E։EEPEPu540P }u֣Eu֣EE Ë}jYUuLYH]UeeBVWN@;t t УBfEP 0E3EE$01E(01EEP,0ME3M3M3;uO@u G ȉ Bщ B_^]U} u=0u u03@] VWX1X1 tЃ;r_^VW`1`1 tЃ;r_^%p0%t0hBYhd5D$l$l$+SVWB1E3PeuEEEEdËMd Y__^[]QUuuu uh4 hB-]%x0%|0%0%0; BuD%0U0jE#u!=EYYuj Yh  Y]U$jtjY)C CCC5C=CfCf CfCfCf%Cf-CCECECEC CCBB BBjXkǀBjXk BLjX BLh0]%0%0%0%033366656n6X6>6.666544444444456$505>5F5P5^5l5v5555533R4:4,4f4433v44B CHBP1,ZhFZ2112p2RealDisplaySizeMM.pydinitRealDisplaySizeMML330230X34024@026033366656n6X6>6.666544444444456$505>5F5P5^5l5v5555533R4:4,4f4433v44tGetMonitorInfoAEnumDisplayMonitorsUSER32.dll2CreateDCA DeleteDCGetDeviceCapsGDI32.dllPyBool_FromLongPyString_FromStringePyList_New_PyList_AppendPyDict_NewPyDict_SetItemStringPyArg_ParseTuple5Py_BuildValueVPy_InitModule4python27.dll__iob_func{fprintf'sprintf;strncmpcallocfreemalloc reallocMSVCR120.dllo__CppXcptFilter_amsg_exit_malloc_crt _initterm _initterm_e_lock_unlock._calloc_crt__dllonexit:_onexit__clean_type_info_names_internalz_except_handler4_commonP_crt_debugger_hook__crtUnhandledException__crtTerminateProcessGetProcAddressLoadLibraryA!EncodePointerDecodePointer-QueryPerformanceCounter GetCurrentProcessIdGetCurrentThreadIdGetSystemTimeAsFileTimeDisableThreadLibraryCallsgIsDebuggerPresentmIsProcessorFeaturePresentKERNEL32.dll_strdupEnumDisplayDevicesAUSER32Mon %d, name '%s' Mon %d, string '%s' Mon %d, flags 0x%x Mon %d, id '%s' Mon %d, key '%s' (Primary Display)%s, at %d, %d, width %d, height %d%snamedescription(i,i)pos(i,i)size(i,i)size_mmDeviceIDis_primaryi(i,i)iienumerate_displays,APAAAB@8BEnumerate and return a list of displays.RealDisplaySizeMMRealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXIDRealDisplaySizeMMGetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display.\\.\DISPLAYVN@Dl0O00000%1C1X11111111112'2,222<2C2H2T2k222222233.3G3`333333444445p5555566W66666666677 7+7:7G7R7h7o7u7{7777788(8.8F8P8`8f8z888888888888.9D9J9]9c9}999999999999):I:\:a:g:{::::::::;;2;;;<(<.<<<<<<<==========>>8>B>>>>>>>? ?"?.?NNh>NNQtdRtd>NN((CD+8)#!:.("$*='9  36 4C<-0%&5/A> @? 7,1B;27@9`$7;>|ۧ;w|CEwxqXb戢ˎ)^j6I%h + # =]7yI'*^ V BPtY'" 0 \Q@QP2 @Q \ ?` RLQ5 oHQlH __gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesnull_error_handlerg_error_handler_triggeredinitRealDisplaySizeMMPy_InitModule4free_a_disppathfreefree_disppaths__strdupstrrchrstrchr__sprintf_chkXOpenDisplayXCloseDisplayget_displaysgetenvstrncpyXSetErrorHandlercalloc__strcat_chkXRRQueryExtensionXRRQueryVersionXRRGetCrtcInfoXRRGetOutputInfoXRRGetCrtcGammaXRRFreeGammareallocXInternAtomXRRGetOutputPropertymallocmemmoveXFreeXRRFreeOutputInfoXRRFreeCrtcInfoXRRFreeScreenResourcesXF86VidModeQueryExtensionXF86VidModeGetMonitorXGetWindowPropertyerrorstrcpyXineramaQueryExtensionXineramaIsActiveXineramaQueryScreensXRRGetScreenResourcesstderrfwritedlopendlsymPyList_NewPyDict_NewPyString_FromStringPyDict_SetItemStringPy_BuildValuePyInt_FromLongPyString_FromStringAndSizePyList_Appendget_a_displayPyArg_ParseTuplecallback_ddebuglibX11.so.6libXinerama.so.1libXrandr.so.2libXxf86vm.so.1libpthread.so.0libc.so.6__stack_chk_fail_edata__bss_start_endGLIBC_2.1.3GLIBC_2.4GLIBC_2.3.4GLIBC_2.0si ii  ti ii  PQQ QQQQ Q$Q,QO?OO O@OO3PPP PPP>PP P$P (P ,P 0P 4P8Px $xDž(($D$l(1f(9? D$$<_luΉ$x $DžUe3  [^_]Í&D$PD$d$vZPDžZ:0.0ƅ^rx D$$D$4$~D$D$x$TG:<$xa~dx(GDžDžDž|Dž840,`xD4$D$҉-BDžDžDžƅ/DžDžDžtx\B T$4$D$-px89Džtc cDžDžt&cttdB t$D$x$|@tufz \A 0D$x$)4$|D$$>|D|D$$<hhUPhpp ABhAB A BAB\A 0B0hdA 0B4||8BD$dL$t$ D$D$X$@hXBD$ BD$B D$B.T$t$D$4D$D$D$ t~StIA4$D$dD$D$]D$ t$TD$4$hT0$F PD$:$tBD$.$t,D$ D$D$L$$ hP0$T4 5 X_ICC@_PRO@FILE@ hXx0D$T$ $vF$ h0x0D$T$ $CF8 ,Dž Dž,8M<8*xD$D$ $tҋDžDžP D$$‰d0$D$`3D$d$\fUWVS| l$\EtE8u'E䍃!EЍ+U̍UEȍ0Uԍ8Eč50E intw8a oZ 1 - Z# \# e # #  # u# # # # e#$ L#(  #, / "#0 $#4 >&Z#8 *Z#< ,z#@ 0>#D 1L#F 2#G 6#H ?#L H#T I#X J#\  K#` L%#d  NZ#h /P#l ?  G# # 8 Z#    'n   2 7 1 jN k #  kK# kK E #  EK# Z E #  F#  G # > G #  K#  L1# o Mc#  N#$  O#(  P#, J T#0 U#4  V#8 Z#< G [#@ ] \#D ]#H ^#L  a#P  d#T f#X o j! #\  m#` q q#d l t #h [ x4#l % y@#p  |!#t _ }-#x  ~#|  K# b }# I L#  X# e  # D d# g #  p#   # # n }# 4 }#  }# }# }#  # 0#NM l% gm}}}Q }}} }}}} Z}F  } !'Z<<<} MS}h}  sy}}  c Z} }^ Z}  }L Z}}}0 06 P} i 0G fl }   }  4 g buf #obj }#len # A # Z# Z#  # #  # p #$  g #( p #0 w    Z } Zw    } l  Z }}   Z! } , 2 ZL }  ۊ #  # #  #  # P #  # ] \# 9 \# @ \#$ * #(  \#, #0  #4 6 #8 V #< #@  #D  \#H  \#L \#P O \#T \#X V #\ % #`  #d U #h  #l #p  #t  #x 6 #| #  #  # #  # > # h \# L ( 6 1 # ) #  B# z B#  h# # b #   # # B#$   !y "#  ##  $# %B  ' % (%#  )P# ] *[#  +#  , #  - # .  1g 2%1} 3=CZ]}]ZY 4ou}} 5 6Z}} 7 8  9gE :} ;}4}}Z <g =gB >5 ?J @ A|}K}} B}K  6 y   |! $ &# '#  (Z# *#  'b ~  #get #set #doc #  #3r  ,& }}= Z}}7XID GE OE; QE REO e6 mls Z# H# # <# GZtGGCj  K K# 2# _ Z# x E#  E# b  E#  Z#  Z#  Z# Z# #Q ]P! "K# Z## $&# V%Z# %Z# Z&Z# &Z# 'Z# (# )Z#$ s*#( +#, ,1#0 -E#4 .E#8 /Z#< /Z#@ 0Z#D 1Z#H 2#L38@ 9K# :Z# ;Z# <Z# = K#  #fdZ# Z# 3Z# Z# i# # # #$ Z#( { "#, j Z#0 !Z#4 "Z#8 #Z#< $Z#@ %(#D &Z#H { 'Z#L ( #P ( #T Z )Z#X ' *E#\ y+E#` ,<#d -<#h U.<#l /<#p  00#tdb14#x (2J#| 5# X 6Z#  7Z#  8L# 9E# 2:E# ;Z# <Z# <=<# F><# P?Z# =@# "@L.ZJ:R Z# ZP# # BE# 37# 7# s7#&Vhi#lo# r { i# #  # 7# {# 97# :{# " #Z# $S# , %S# V&S# 'S# ( >;">a#>'(T )E8id# V0# 0# E# J0# (0# 0# 0# Z0# 0#$ 0#( #, ~0#0 ^(#43$  # d# NZ# # Z# # Z# #%}8 # O# # Z# SE# E# # # NZ# # EZ#$ #( Z#, ~Z#0 #4~ 0D] E#xFZ#yFZ# VG0# G0# H# -I# JZ# K# L#$ % MZ#( & N#, Oee ]fZ#redg# \h# i# >fji<@ A# RB#sxCZ#syCZ# swDZ#shDZ# ` MZ# NZ# OZ# P#$ sQ#( RZ#, OV#0 - W#4 X#8[ ~ Z# Z#!Z__s ? y9[ ww w% b[ :[ 88 8%D Z ixZ!xidZ" ixZ"]"#wZ`~A$P%ev&,',X('>0(>)K!i@Z*S (>"]!pp+]+l P"Z,&R--.) /L&/0iZ0jZ0kZ`"(Z+IZ+'1W L&~2evbZu|2erbZu|+Z$+VZS+l P+Z0xai\&1> L&}1D b&|3( uH 3; #!3{ 4 !!pp59!-V-K6,L,9!!-V-K4@H$"(Z7x+t7r&P+8Z0pix9Z0pop:Z0jj;Z@0xj<Z|0xk=Z4"+R)-.+ Yx&07!ppv+ wx&N+8x~&7H+~&5e))6#--5 5#--59k T#-V-K5<k s#--4#+ &4$+CL19C{1N DZ|+E1yE|+F!iiGZ1 H&{8-$--9--4@%1|{0evbZ 0erbZL !pp5%%$--5$$$--5#.$$--5##%--4%1&+ 19|+N Z + 1y{+f 8%--,'(--8%--9--:4+V+&"()Z+V* 1xXQ1(TQ1c(PQ \& c r& ] &  & 1*}/2 Q'; }; }2l}u\0dp  )s02+-}$ 1]PP!iZ)s020d} <TY204 '=ixYZ +ZH 0rvZ 0i[Z *n}044 2(; m}( m} 0ixoZ3 0xidpZS ,44t-7>?q *a}4>5 (; `}( `} 2ixbZul"]c,45g-7(@uTV? r&(P&((P&( ) 1y(QA AABfZHQB8ZLQL8@/tmp/ccxq91nO.s/build/buildd/glibc-2.9/csuGNU AS 2.19.1U%% : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I&' II : ; I8 '  : ; : ;I : ; : ;< : ; I : ;I8 .? : ; ' I : ; I: ; I.: ;' I  : ;I!4: ;I"4: ;I#.? : ; ' I@$: ; I %: ; I &.? : ;' @'.? : ;' @(: ;I) *.: ;' I@+4: ;I,1X Y-1..? : ; I@/4: ; I04: ;I14: ;I 24: ;I 3 : ;4 U51X Y61X Y7 U81UX Y91UX Y: ;: ;I <.? : ;' I@=: ;I>41?41@41 A4: ; I? < B4: ; I?  U%o /build/buildd/glibc-2.9/build-tree/i386-libc/csu../sysdeps/genericcrti.Sinitfini.c!/!=Z!gg//5!/!=Z! DisplayCAL/usr/include/bits/usr/lib/gcc/i486-linux-gnu/4.3.3/include/usr/include/usr/include/sys/usr/local/include/python2.7/usr/include/X11/usr/include/X11/extensionsRealDisplaySizeMM.cstdio2.hstring3.hstddef.htypes.hstdio.hlibio.htypes.hpyport.hobject.hmethodobject.hdescrobject.hX.hXlib.hxf86vmode.hXinerama.hrandr.hXrandr.h`׼ f!0~Kguu֑;Miguuu <o.fff?=vX ,-/3u>q stxtf <}XeK=wKQ& X-d0x(( ( n` fr.f{ff}f{(f}f% $;& E iKK 8  - 9Y׃gzfzt?zffz.Nz</zX,33yfxfnxy' J׃~<u}}.y"(x1fOfx. xf1%x)p$/$*x,2x.Nf&b:==x*ؑYב x~xJ\tx80YYx#8#f~X n.|{<@v,h} ~~"#X!-Y/}t#~+il9-*#~o.#.}./,O+?%of73*ʃ..~.~.H&u%=Z,> va0<Uf+<LZ,0"M0M00Y.0000P02 ֯} ^z.j>T-YJUn]Z'C&wtt=-YpȔ8pjy<>,L=k<8Fj:>XP& /tmpccxq91nO.s!!!5-!!!| `LB HAB A\AB FF0AB FAB FSAB C/AB C2AB BC04|AB F[4AB FX_XRRGetScreenResourcesCurrentedid_atomdefsix_unused2outi0_filenolenfuncncrtcget_a_displaysq_ass_slicetp_getattrsq_itemgreen_masknb_addob_refcntsq_ass_itemoutisq_inplace_repeatVisualnext_screennb_lshiftsq_inplace_concattp_is_gcvSyncEnd_shortbufnb_powerrotationssq_repeatsq_concaterror_codetp_itemsizeinitprocmm_widthgreenPyGetSetDeftp_basesnull_error_handler__off_tmodesatomvbits_per_pixel_locksetattrofuncprivate_datatp_deallocnb_long_typeobjectnb_floor_dividebf_getwritebuffernb_inplace_lshiftroot_input_maskreadbufferproc__fmtnclone_XrmHashBucketRecmodeFlagsnb_indextp_richcomparemap_entries_IO_write_endnb_remaindervisitprocmax_keycodeRotationnb_inplace_multiplynameLenblack_pixeltp_comparecmaphas_primaryPyMemberDefob_typetp_freegetterrotationnb_andxdefaultstp_callWindowtdispptp_strconfigTimestampscrnresmonitorternaryfuncsprintfret_lenbitmap_bit_ordersq_contains_chaintp_setattrRealDisplaySizeMM_methodsrichcmpfuncunsigned charmin_mapsmp_ass_subscriptrscreenbf_getreadbufferColormap_IO_lock_thSyncStartprivate13classtp_dictoffsetroot_visualrootPyNumberMethodsPyMethodDefinitRealDisplaySizeMMstderrndepthsmax_mapsmp_subscripttp_clearicc_out_atommm_heightscanline_padsubpixel_ordernvisualsnmodeXErrorEventvisualidVisualIDtp_initobjobjargprocob_sizetp_dictbyte_order_IO_write_ptrtp_as_mappingsetattrfuncstrncpybinaryfuncRRCrtcmyscreenssizessizeargfuncext_datax_orgwhite_pixelbf_getbufferGetXRandROutputXIDheight_mmvTotalgetiterfuncnb_nonzerodescrsetfuncdescrgetfuncnb_octnb_inplace_add_IO_save_baseedidred_maskbname_XDisplayreprfuncproto_minor_versionedid_name__pad2_XRRModeInfobf_getcharbufferdisplay_namepixmap_formatndispsresourceidtimestampnb_divideRROutputdnamevalueproto_major_version_nextPyObjectnb_xornb_negativewritebufferprocrequestget_real_screen_size_mm_dispconnectionfree_disppaths__ssize_t__srcprintfuncedid_lenfree_a_disppathcallback_ddebugnhsyncPyBufferProcsml_flagstp_new/home/fhoech/dispcalgui/trunknb_inplace_true_dividenb_inplace_dividedestructorPyCFunctionnameLengthroot_depthhSkewsave_unders_sbuf_IO_save_endtp_delget_real_screen_size_mmprivate5stdouttp_nameclosureScreenFormatcrtcgamtp_as_sequencetp_as_bufferget_displaysnb_inplace_andshort unsigned intdefault_screentp_allocsuboffsetsresource_allocmotion_bufferdotClockmin_keycode__off64_tuscreen__len_XPrivatecoercion_IO_read_base_IO_buf_endtp_getattroallocfunc_modetp_methods_IO_write_basenext_outputtp_mrodone_xrandrsegcountprocRRMode__destblue_maskmydisplayDisplayCAL/RealDisplaySizeMM.crequest_codenb_orunaryfunc_IO_markerbitmap_padnoutputnb_floatnformatsDepthtraverseprocinquirykeysnb_invertml_docmax_request_sizeml_namey_orglong doubledesc1desc2tp_as_numberdnbufbf_getsegcounttp_weaklistoffsetwidth_mmml_methreadonlytp_docGNU C 4.3.3Atomgetattrofuncscreen_numbernewfuncPySequenceMethodsstdintp_weaklist_IO_buf_basebufferinfonscreenscharbufferproclast_request_readnb_positivehashfuncret_formatgetattrfunc_IO_read_endXF86VidModeSyncRangebitmap_unit_IO_FILE_XRRCrtcInfoshapeselfcrtcitp_hashcrtcsnb_hexndimbits_per_rgbtp_version_tagTime__pad1__pad3__pad4__pad5getbufferprocEMPTYnpossible_markers_possetterget_xrandr_output_xidqlentp_members_XGCtp_traversereleasemp_lengthbacking_storenb_inplace_xorstrcattp_subclassesargsnb_inplace_powertp_setattrofreefuncnb_multiplynb_true_dividetp_getsethTotalmheightScreentp_iternextsq_lengthSubpixelOrdertp_descr_getminvtp_iter_XRRGetOutputPrimaryxrr_foundnb_inplace_floor_dividestridestp_basenb_rshiftbf_releasebuffertp_printlong long unsigned intmemmove_cur_columnreleasebufferprocnb_inplace_remainderoutputshSyncEnd_objectnvsyncnb_absolute_IO_backup_base_IO_read_ptrvendorinternalret_togonb_inplace_oricc_atomtp_reprtp_cachedefault_gcenumerate_displaysPy_ssize_tmodel_old_offsetsq_sliceprivate10private11private12nb_inplace_rshiftprivate14private15private16private17private18private19vSyncStart_XRRCrtcGamma_XExtData_XRROutputInfolong long int_flags2bluePyMappingMethodsprivate1private2private3private4tp_flagsprivate6private8private9smalltablefree_privatenb_subtract_XRRScreenResourcesg_error_handler_triggereddescriptionssizessizeobjargprocminor_codenpreferredXPointerXineramaScreenInfoiternextfuncXF86VidModeMonitorXRRModeFlagsnb_inttp_descr_setmajvPy_buffernb_coerceshort int_vtable_offsettp_basicsizenb_inplace_subtractret_typeserialdcountnb_divmodmwidthConnectionobjobjproc__quad_tclones t tu !t!#t#hupqtqstsupVuttZuuRWRZu`atactczu`RzuhP6?VFzVPFbWttnuLqu{u{Enu{vu{nVnqu{ u{ V u{ u{EVVu{P;ou{otVtu{Vu{u{Vu{ u{vqu{^u{^puzpu{Eu{ uz u{ u{vquzuzEquzqRuz uzvqu|o}P}u|Eu| u|P4BPPpqu|#u|Enu|pqu|0u|Enu|TquzuzEnuzvquzuzEuz uzqu{ u{Etu{u{u{u{u{vqu{u{Eu{ u{vqu{u{Eu{ u{vqu{u{Eu{ u{vqu{u{Eu{ u{vqu{u{Eu{ u{vqu{u{Eu{ u{vqu{u{Eu{ u{vqu{u{Eu{ u{SPPvqu{u{Eu{ u{vqu{u{Eu{ u{vqu{u{Eu{ u{PhVDzV VHV@V R P R % RtRvqu|u|Eu| u|vqu|u|Eu| u|Jqu| u|tu|u|u|Jqu| u|tu|u|u|dfPPRRRJqu| u|tu|u|u|Jqu| u|tu|u|u|Jqu{ u{tu{u{u{ QQpqtqstsIu1u`13V3Iu`QZPfkPyPPPP P47P[`PtwPPPPP P1GWPQtQStS uPu upupWup W up WW{VVP VRR t t L!u ! !L!u !!up#!L!up !!V%!L!V/!N>N>N>O?O?P@` @Q@A@ABpBGC'*nm q xH0y"g -X`;0#@ ĬX L      5 5 8NNNNOOP@Q  N%N3N@ V@QeDQs  N8Np5 Q@ XQTQ;PQV/ i04| |4 OPN>5 P5 W N !6KQh\ x`   LQ 5 &HQ6H[nH (9IWq2  @Q' 4P^o0 ~\Q@Q!,"H\n tinitfini.ccrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6635dtor_idx.6637frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxRealDisplaySizeMM.cRealDisplaySizeMM_methodsget_real_screen_size_mm_dispxrr_found.15237_XRRGetScreenResourcesCurrent.15240_XRRGetOutputPrimary.15243enumerate_displaysGetXRandROutputXIDRealDisplaySizeMM_GLOBAL_OFFSET_TABLE___dso_handle__DTOR_END____i686.get_pc_thunk.cx__stack_chk_fail_local__i686.get_pc_thunk.bx_DYNAMICPyDict_SetItemStringXineramaQueryScreensXRRGetOutputPropertyXFreeXRRFreeScreenResourcesfree_a_disppathXRRFreeCrtcInfoXRRGetOutputInfonull_error_handler__gmon_start___Jv_RegisterClassesrealloc@@GLIBC_2.0g_error_handler_triggeredstrchr@@GLIBC_2.0getenv@@GLIBC_2.0_finicallback_ddebugcalloc@@GLIBC_2.0strncpy@@GLIBC_2.0XGetWindowPropertyXineramaQueryExtensioninitRealDisplaySizeMMXRRQueryExtensionXRRGetCrtcGammaXRRQueryVersionstrrchr@@GLIBC_2.0dlsymPyString_FromStringAndSizeXOpenDisplay__strcat_chk@@GLIBC_2.3.4PyArg_ParseTuplefree@@GLIBC_2.0XCloseDisplayXF86VidModeQueryExtensionget_a_displayPyString_FromStringstderr@@GLIBC_2.0PyInt_FromLongXRRGetScreenResourcesstrcpy@@GLIBC_2.0XRRFreeGammafwrite@@GLIBC_2.0Py_BuildValue__bss_startmalloc@@GLIBC_2.0get_displays__stack_chk_fail@@GLIBC_2.4PyList_Appenderror@@GLIBC_2.0free_disppathsmemmove@@GLIBC_2.0XineramaIsActivePy_InitModule4_endXInternAtomXRRGetCrtcInfo__sprintf_chk@@GLIBC_2.3.4XSetErrorHandlerXF86VidModeGetMonitor_edatadlopenPyList_New__cxa_finalize@@GLIBC_2.1.3__strdup@@GLIBC_2.0XRRFreeOutputInfo_initPyDict_NewDisplayCAL-3.5.0.0/DisplayCAL/lib32/RealDisplaySizeMM.so0000755000076500000000000011431013221474112022177 0ustar devwheel00000000000000;8 PH __TEXT __text__TEXT H__picsymbolstub1__TEXTHH __cstring__TEXT((__DATA  __dyld__DATA  __la_symbol_ptr__DATA | __cfstring__DATA  __data__DATA H __bss__DATA 8__LINKEDIT00 83?Z{Ad1PW6d P117 5l>5d0* 0//usr/lib/libmx.A.dylib 4X /usr/lib/libSystem.B.dylib|B}|}cx=}| x=N |B}h|=kk}iN |||y!@lH`c/AH̀~/A|xH~xH;~/@8!Px|H`|/A;xK8!P|N `|8`B8!88H e/@a8/ATc:H)|uyAȀa8~x88H 1/A~x;H H88`8H |~y@H8`8H W:/|~.AA8;|.x@A/A8:@;98~=9L8W:}{x|.~~~H AĐ.١ЀԐ @|^.١``ܐ D}>.١`` H|^.١``|u.H y/A8H |tyAp<8tH |}yATH i: |vy@@~ijx8`H 1~ijx|wx8`H !/|xxA/@$~xH %H/AH H`x~xx;@: ;`H |w.8H |yy&@,|w.828H E/A!,&|x.8H E||y@$|x.828H /A A8/A0#x8>>;8 >>Hـ^|}xb/A x|_xlptx|>^~h<_8bHM|lx<_8Bܑ~h^>|xtpl!|}N ||dxB8_!p8a98H8a8|}xH<_}]|~x9"(B( i|].<_x j;4xH,@|}xxHH8!|N |B}h=k|}N |B}h=k|}N |B}h=k|}N |B}h=k|}N |B}h=k|}N |B}h=k|h}N |B}h=k|`}N |B}h=k|<}N |B}h=k|}N |B}h=k|}N |B}h=k|}N |B}h=k|}N |B}h=k|8}N |B}h=k| }N |B}h=k|}N |B}h=k| }N |B}h=k|}N |B}h=k|}N |B}h=k|}N |B}h=k|}N |B}h=k|X}N |B}h=k|H}N |B}h=k|$}N |B}h=k|D}N |B}h=k|0}N |B}h=k|}N |B}h=k|}N |B}h=k|h}N |B}h=k|p}N |B}h=k|$}N |B}h=k|<}N enumerate_displaysEnumerate and return a list of displays.RealDisplaySizeMMRealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXIDGetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display.DisplayProductNameen_US(unknown) (Primary Display)%s, at %d, %d, width %d, height %d%sinamedescription(i,i)possizesize_mmsprintf$LDBL128libSystem.8(<h|p @ @ @ @ @ @ @ $@ (@ ,@ 0@ 4@ 8@ <@ @@ D@ H@ L@ P@ T@ X@ \@ `@ d@ h@ l@ p@ t@ x@ |@ @ @ @ @ @ @ @ @ @ @ @ @yddfZFt`.P$P$N.%$$N.3$$pNp.B$$pNp.pS$p$pNp.g$$0N0.~$$N.$$N&  d.0ApUi|    P '>Tr %DWv:BHPX`hp NP789:;<=>?@ABCDEFGHIJKLMOPQRSTUVCEDUSI@HKGJMLFT?:VR;<879B>=OQAP __mh_bundle_headerdyld_stub_binding_helper__dyld_func_lookup_GetXRandROutputXID_enumerate_displays_RealDisplaySizeMM_sprintf$LDBLStub___stub_getrealaddrdyld__mach_header_RealDisplaySizeMM_methods_funcptr_callback_ddebug_free_a_disppath_free_disppaths_get_a_display_get_displays_initRealDisplaySizeMM_CFDictionaryGetCount_CFDictionaryGetKeysAndValues_CFDictionaryGetValue_CFRelease_CFStringGetCString_CFStringGetCStringPtr_CGDisplayBounds_CGDisplayIOServicePort_CGDisplayIsMain_CGDisplayScreenSize_CGGetActiveDisplayList_IODisplayCreateInfoDictionary_NSAddressOfSymbol_NSIsSymbolNameDefinedWithHint_NSLookupAndBindSymbolWithHint_PyArg_ParseTuple_PyDict_New_PyDict_SetItemString_PyList_Append_PyList_New_PyString_FromString_Py_BuildValue_Py_InitModule4___CFConstantStringClassReference_calloc_free_malloc_strcmp_strcpy_strdup_strlen_strncpy/Users/Shared/dispcalGUI/trunk/DisplayCAL/RealDisplaySizeMM.c/Users/Shared/dispcalGUI/trunk/build/temp.macosx-10.3-fat-2.6/DisplayCAL/RealDisplaySizeMM.o_free_disppaths_get_displays_get_a_display_free_a_disppath_GetXRandROutputXID_initRealDisplaySizeMM_enumerate_displays_RealDisplaySizeMM_RealDisplaySizeMM_methods_callback_ddebugp__TEXT __text__TEXT0 0__cstring__TEXT((__unwind_info__TEXTH__DATA  __dyld__DATA  __cfstring__DATA  __data__DATA |__IMPORT00__jump_table__IMPORT008__LINKEDIT@@u3~J#/ĒX@ODD P..4D D@ 4 X/usr/lib/libSystem.B.dylibX X UWV EEtc‹tM׉փt$Pt $$űUU ^_ ^_@U][uu}t$D$$tDž88]u}ËEt$/(tɉD$Et$$E$@D$8E11u( $xD$$8…ҍ(GB;}rMtX1U Uvp>DžT 4( 0 $D$X8Eԋ\,E؋`E܋dE,EԉB,,E؋B ,E܉B,EB0$FD$$B<3 D$ $$DžD@D$$$$@D$$…44$4$D$T$^DžHDžDH@9HH$D$$!L4D$$PLP…qLt FO)ȅDPD$1D$$ED$$4 $<$7D0$2[ DЋ,T$DAD$AD$A D$AT$D$ o $D$',D0$.,1$F TT;ED$ D$2L$$DDLL D$ D$2T$$ DPP<$8 $($Dž8$t$$4t4 $<$p8$( $WUE(unkEnownfE)D8$p($pDž8($SUWV }E1t T@9u$Et[<BABAB A BABABA$UtJ@$UBt4$yE ^_É$u4$_EE ^_ËB$QM $F4$0EUVut2t$Ft$u^^f.U(]E[D$E u$t$1҅tD$4$‹]ЋuUS[$D$D$ D$WD$|$G$[fDUWVS[L$ E‰E0EEЍ]UȍgUE䍃cEčlEs@@$E؉U,u,}܋Eȉ|$t$$UT$D$Eԉ$gUԋẺT$$ZUUEU2EԋEt.$0UԉD$LD$$EBt.$UԉD$QD$$EB D$BUȉD$$Uԉ$D$EĉD$EBD$BUȉD$$Uԉ$D$ED$cU11fEFfDEkfDUЉ$5ẼL[^_f.UH]E[u}D$4D$E $1҅u]Ћu}fDfDE$Et~@$ŰUԉE,},uȋt $UԋBt8$Eԉ$G|$t$$^]u}ɉ‰ÉfDfD11enumerate_displaysEnumerate and return a list of displays.RealDisplaySizeMMRealDisplaySizeMM(int displayNum) Return the size (in mm) of a given display.GetXRandROutputXIDGetXRandROutputXID(int displayNum) Return the XRandR output X11 ID of a given display.DisplayProductNameen_US (Primary Display)%s, at %d, %d, width %d, height %d%sinamedescription(i,i)possizesize_mm444 3(0<e@x  @ D L P T \ ` d l d d)f`tFZ.`$`$N.$$@N@. $ $ N .@$@$PNP.$$PNP.$$PNP.0$0$N.@$@$N&@ 1 d0.DAU0i@| @  @` %CYdx'3IXdy H 456789:;<=>?@@ABCDEFGIJKL@MN __mh_bundle_headerdyld_stub_binding_helper__dyld_func_lookup_GetXRandROutputXID_enumerate_displays_RealDisplaySizeMMdyld__mach_header_RealDisplaySizeMM_methods_callback_ddebug_free_a_disppath_free_disppaths_get_a_display_get_displays_initRealDisplaySizeMM_CFDictionaryGetCount_CFDictionaryGetKeysAndValues_CFDictionaryGetValue_CFRelease_CFStringGetCString_CFStringGetCStringPtr_CGDisplayBounds_CGDisplayIOServicePort_CGDisplayIsMain_CGDisplayScreenSize_CGGetActiveDisplayList_IODisplayCreateInfoDictionary_PyArg_ParseTuple_PyDict_New_PyDict_SetItemString_PyList_Append_PyList_New_PyString_FromString_Py_BuildValue_Py_InitModule4___CFConstantStringClassReference_calloc_free_malloc_sprintf_strdup_strncpy/Users/Shared/dispcalGUI/trunk/DisplayCAL/RealDisplaySizeMM.c/Users/Shared/dispcalGUI/trunk/build/temp.macosx-10.3-fat-2.6/DisplayCAL/RealDisplaySizeMM.o_free_disppaths_get_displays_get_a_display_free_a_disppath_GetXRandROutputXID_initRealDisplaySizeMM_enumerate_displays_RealDisplaySizeMM_RealDisplaySizeMM_methods_callback_ddebugDisplayCAL-3.5.0.0/DisplayCAL/lib64/0000755000076500000000000000000013242313606016343 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/lib64/__init__.py0000644000076500000000000000000112665102036020444 0ustar devwheel00000000000000#DisplayCAL-3.5.0.0/DisplayCAL/lib64/python26/0000755000076500000000000000000013242313606020034 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/lib64/python26/__init__.py0000644000076500000000000000000112665102035022134 0ustar devwheel00000000000000#DisplayCAL-3.5.0.0/DisplayCAL/lib64/python26/RealDisplaySizeMM.so0000755000076500000000000015451113221473253023711 0ustar devwheel00000000000000ELF>@p@8@%"== == =  == = PtdP;P;P;\\QtdRtd== = PPcE4;"67 2 #-8&,0%@ ! /' 3A?19(.)5<>C=+B: $*D8@ @9 b$89:;=>?@ABCDCE爢wx;wqX|ۧI%|j6cۏ)^  k{ + q:L;-r"#,`VY& \=S@B ?  8d P5 ` @B  @l pB PB  IRTB __gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesnull_error_handlerg_error_handler_triggeredinitRealDisplaySizeMMPy_InitModule4_64free_a_disppathfreefree_disppaths__strdupstrrchrstrchr__sprintf_chkXOpenDisplayXCloseDisplayget_displaysgetenvstrncpyXSetErrorHandlercalloc__strcat_chkXRRQueryExtensionXRRQueryVersionXRRGetCrtcInfoXRRFreeCrtcInfoXRRGetOutputInfoXRRGetCrtcGammaXRRFreeGammareallocXInternAtomXRRGetOutputPropertymallocmemmoveXFreeXRRFreeOutputInfoXRRFreeScreenResourcesXGetWindowPropertyXF86VidModeQueryExtensionXF86VidModeGetMonitorerrorstrcpy__stack_chk_failXineramaQueryExtensionXineramaIsActiveXineramaQueryScreensXRRGetScreenResourcesstderrfwritedlopendlsymPyList_NewPyDict_NewPyString_FromStringPyDict_SetItemStringPy_BuildValuePyInt_FromLongPyString_FromStringAndSizePyList_Appendget_a_displayPyArg_ParseTuplecallback_ddebuglibX11.so.6libXinerama.so.1libXrandr.so.2libXxf86vm.so.1libpthread.so.0libc.so.6_edata__bss_start_endGLIBC_2.4GLIBC_2.3.4GLIBC_2.2.5ii ti  ui ? A A A 9A  3A x:A (8A `7A :B 9B 6B :?  ?  ? D? ? .@ @ @ @  @ (@ 0@ 8@  @@  H@  P@ X@ `@ h@ p@ x@ @ @ @ @ @ @ @ @ @ @ @ @ @  @ !@ "@ #A $A %A &A ' A ((A )0A *8A +@A ,HA -PA /XA 0`A 1hA 2pA 3xA 4A 5A 6A 7HW-!H52) %4) @%2) h%*) h%") h%) h%) h% ) h%) h%( hp%( h`%( h P%( h @%( h 0%( h %( h %( h%( h%( h%( h%( h%( h%( h%( h%( h%z( hp%r( h`%j( hP%b( h@%Z( h0%R( h %J( h%B( h%:( h%2( h %*( h!%"( h"%( h#%( h$% ( h%%( h&%' h'p%' h(`%' h)P%' h*@%' h+0%' h, %' h-%' h.%' h/%' h0%' h1%' h2HH% HtHÐU=( HATSubH=% t H=_' H{# L%l# H' L)HHXH9s DHBH' AH' H9r' [A\fUH='# Ht"H% HtH=# IAÐH$ 1H5& H=*A11HSHt7H?HtH{HtH{8HtH[D[ATHIUSttHHt[H1H8Ht{H;HGHt HgH;HG8Ht HSH;HHcIHHu[]LA\-D[]A\ff.Ld$H\$IHl$HHH?HH:HHt4.HfHt"ED$ H HH1HWHHtOHIcD$ HHHD`$X xLH H H$Hl$Ld$H1@H81fDfDAWH=UAVAUATUSHdH%(H$1DŽ$DŽ$H L$cHLƄ$C:LHt(.H:H x_@0@L7HIHDŽ$H=H;H-! HH H=/HmAHDŽ$$$HcHH$H$~ D$1E:$9 `H$HcHHuHLHDŽ$H$dH34%(H$HĘ[]A\A]A^A_H5`dLH$H$LgH$H$Lg$w$iH-\ HHc$~H=" kA$H$(H$pH$hHDŽ$DŽ$DŽ$HT$PHL$HH\$@$H g" HHc$ILHHHtH$H$U$H " HIHLHtHIH$DŽ$$1DFEH$HcLHQHHHHtTHxtHH$t@D~9HP(1L;"$D$L;"$DH9$H$B9؉n$DŽ$H$xDŽ$DŽ$DŽ$HL$X$t$~$$Hc$H$LHHH$HQHeHH$H H$H{( {$ $$H$9$DŽ$DŽ$HDŽ$H\$`$$$"$$t$O $$Lc$H$LJH$HF(H$J`HI$H$IDH$fA|$0H$H$LHBH4ZHH HLkHHtH$H$E1ALHF(H4HL$@HD$HLl$HD$$HL$(HL$`HD$0HD$XHL$1HD$ kH$xHt HMH$HHHC8 H$H$xH$pHHx8H$H$xHB@H$pAL9$tL$$H$$$9F$lH$t H$H$$$$DŽ$H$$$9JH$$$9$G1H$L]L$DŽ$:0.0Ƅ$H$sL#HDŽ$H59dLj\H$XH$`H$hH$H$pDŽ$H$H$HL$xH\$pHt$hD$DŽ$:DŽ$xLAHt@.HHt.H$EtE1H \HH1dH$McLJ,H]HHH$ HEKd@ HEDh$HEDh(H$HHMBABHMABHMAB HMAHE@$`I_ICC_PROL$pDŽ$xFILEL$pƄ$|H]1LLZHHC0E1L$PifIXFree86_HDDC_EDIDH1_RAWDATM$I|$It$fAD$ALLHHud@DŽ$HDŽ$XHE@$zAH t H A2L1@HEIE1HL$xAHc@$HHtH$H$HL$1H$HT$ HT$hHD$(HD$pHT$HLHD$2&H$hHt HH]HHC8HEH$hH$XHx8)HUH$hB@H$XmDH$xH$Lt=HDŽ$(HEH$ Lp$tH$(Ht >D$H e dL1LHUL$H 1 MLBDJD$BD$B$1 H]LHHCy$$9$1H$[H$RDHXFree86_HDDC_EDIDH2_RAWDATI $IT$ID$fAD$ACL$pH Ad1LBDH= LyHEDh HEDh$HEDh(HE@HE@HMIHcA HDAHMIHcA HDALUd+$D$DŽ$ED$$1$9$$H$dLHH D@$1.H$$$H$H$LsLfD]H$L:HH$>D$EE(H5! H=\H=LIcH$H$HHHHH 1$9$$qH$FDŽ$DŽ$$HH$Hc$Hc$ILHHHtH$\H  H=4 :HHL9$H$H$H$H$(1)VDŽ$H$L9$H$WH$zLH$HDŽ$LH$F4L@1HDŽ$H=jHHHZ qH5SH=A H5]H+ nH ?H$L9$uCH$nH$L$LLH$L0H$u$$NH H=9:HH$ADŽ$DŽ$$2AV1AUATUSI1HIH8HE1HHH8HtHtH5HHAHHxHtHtH5HHHPpH=1H5HHHH=Pp1H5HHH;H=iH‰H 1H5aHHHHcx *H5KHHxHHcx$ H51HHZHHcx(H5HHN^n~.>N^n~.>N^n~A 9 3x:(8`7:96:GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3L 8,y<*!8yT*null_error_handler]initRealDisplaySizeMMzfree_a_disppathfree_disppaths get_displays%(get_a_display'*callback_ddebug=*g_error_handler_triggeredu/build/buildd/glibc-2.9/build-tree/amd64-libc/csu/crti.S/build/buildd/glibc-2.9/csuGNU AS 2.19.1P* v 78E inti ii 1 -z b# \# e # #  # u#( #0 #8 #@ e#H L#P  #X / "#` $#h >&b#p *b#t ,p#x 0F# 1T# 2# 6# ?{# H# I# J#  K# L-#  Nb# /P# ?  G# # 8 b#  z  n q 7 1 jW k#  ke# ke C#  Ce# Z C#  D#  E# > E#(  I#0  J<#8 o Kn#@  L#H  M#P  N#X J R#` S#h  T#p X#x G Y# ] Z# [# \#  _#  bi# d# o h #  k# q o# l r# [ v?# % wK#  z,# _ {8#  |#  }e# b ~# I W#  c# e # D o# g #  {#  # # n # 4 #  # # #  # M#WM l. k   bF  0 ;AbVVV gm X bS bL b30 JPj3i JG  9 P s buf #obj #len # A # b# b#$  #( #0  #8 p #@ p #H   b  bs     a  b    b  ( . bH  8 ٕ #  # #  #  # E #(  #0 ] v#8 9 v#@ @ v#H * #P  v#X #`  #h 6 #p V #x #  0#  v#  v# v# O v# v# V #  #  # U #  # #  #  # 6 # #  #  # #  # > # h v# H P A 1 # ) #  \# z \#  # #( b #0   #8 #@ \#H    #  !#  "# #M 0 % % &?#  'j# ] (u#  )#  *~ #  + #( ,  / g 0*0< 1HNbhhbY 2z 3 4b 5 6  7E 8i 9%?b : ;B <5 =J > ?e @e A    z, $ &# '#  (b# *# 2b( |  #get #set #doc #  # >2 r  ,& = b?XID G8 O8; Q8 R8O e 6 m ~ls  b# H# # N#YbtYGCj 8] ]# 2"# _ b# x 8#  8# b  8#(  b#0  b#4 b# b# #c o! "]# Z## $8# V%b# %b# O&b# &b#$ 'b#( (#0 )b#8 s*#@ +#H ,C#P -8#X .8#` /b#h /b#l 0b#p 1b#t 2i#x38R 9]# :b# ;b# <b#= ($ ]# *#fdb# b# 3b# b# i#  #(  #0  #8 b#@ { @#H j b#P !b#T "b#X #b#\ $b#` %F#h &b#p { 'b#t (*#x (*# Z )b# ' *8# y+8# ,N# -N# U.N# /N#  0M#db1R# (2h# 5# X 6b#  7b#  8^# 98# 2:8# ;b# <b# <=N# F>N# P?b# =@# $ @0RLLbhXd( b# Zn#  # 78# 3?# ?#! h?#"&thi #lo #r 0 i# #   # ?# # 9?# :#(' " #b# $[# , %[# V&[# '[# ( F;"FV#F' ( T ) 8Pid4# VM# M# 8# JM# (M# M# M#$ ZM#( M#, M#0 #8 ~M#@ ^?#HJ@ -# d-# Nb# # b# #( b#0 #8)%}` -# O)# # b# S8# 8#( #0 #2 Nb#4 #8 Eb#@ l#H b#P sb#T #X4~ @Dt E-#xFb#yFb# VGM# GM# H4# -I# Jb#$ K#( L#0 % Mb#4 & N#8 Oe e ]fb#redg# \h# i#Ffj`@ A# GB#sxCb#syCb#swDb#shDb# ` Mb# Nb#$ Ob#( P#0 sQ#8 Rb#@ OV)#H - W#P X#X[ ~ b# b#!b__s ? !yP [ w w w- y [  : [ 8 8 8-"D b#ixb$xidb%"#ixb%]%&wbw]'nU(evT) w*Y+8*>`+>,P-i@b. + %]$pp/y/l n%b0Gi112)  3'3-ib]-jb-kb7 %(b/>b /'! 4W '~5evbb{5erbb{/bj /Vb /l n2 /b -xai ' 4> '}4D &'{6( u'6; (6{'7f"$pp8P*"1m1b9/G0P))1m1b7$%(b, /t76'/8b-pix9b-pop:b-jj;b-xj<b-xk=ba7)#/R l: !/ Y<',$ppv/ w<'/8xB',/B'8%% #118P'%7% #1m1b8%'% #11;#11;$117 3$/ H'7p$/C4.C{4N Db{/Ei04yEi{/F$iiGb4 HN'z0///6117&4|z-evbb"-erbb$pp8-N-J%118, -q%118))%11;`%117w&4^'/4.{/N b/i4yi{/8++S&110x++110- .11ixYb"/Z"-rvZ#-i[b#.n6W7%$)+ mq$+ m$5ixobl-xidpb$0 7;7t1, ?@$.a`77#%)+ `[%+ `~%5ixbbd%]cAPg1,?@%6')n8))n8) ) 4y) A B BBCfb PB C-b TB u/build/buildd/glibc-2.9/build-tree/amd64-libc/csu/crtn.S/build/buildd/glibc-2.9/csuGNU AS 2.19.1U%% : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I& : ; ' II : ; I8 '  : ; : ;I : ; : ;< : ; I : ; : ;I8  : ; .? : ; ' I : ; I : ; I!".: ;' I #: ;I$4: ;I%4: ;I&.? : ; ' I@ ': ; I (: ; I ).? : ;' @ *.? : ;' @+: ;I, U-4: ;I..: ;' I@/4: ;I01X Y112.? : ; I@34: ; I44: ;I 54: ;I 6 : ;7 U81X Y91X Y: ;1UX Y< =.? : ;' I@>: ;I?41@41A1UX YB4: ; I? < C4: ; I?  U%O /build/buildd/glibc-2.9/build-tree/amd64-libc/csucrti.S  Ku=/0K K 8$v DisplayCAL/usr/include/bits/usr/lib/gcc/x86_64-linux-gnu/4.3.3/include/usr/include/usr/include/sys/usr/include/python2.6/usr/include/X11/usr/include/X11/extensionsRealDisplaySizeMM.cstdio2.hstring3.hstddef.htypes.hstdio.hlibio.htypes.hpyport.hobject.hmethodobject.hdescrobject.hX.hXlib.hxf86vmode.hXinerama.hrandr.hXrandr.h  <~; =/YZZ>/;Y1?Yv <uX,>,X?!v  ";=3[9I?[Wrxt.}t. X}t![KQ J00##x8 \| ttr.tf}"`}( M9?g.&A+js4oXt ~~X D yf~)~X uD 6  / 7KgzfzJXKztzJLzzz<3zX'%Kz "%)qyJ9xPy$Y ȟ~XɃ}(}x{x(&TzPY!x<x.'MGug - J 4mtx.x.$xX(x1#xJ>w @fx@0o<=#~X~4{/6:ztLM0M="g"g """"PBJ>JY"$ }4z.4zX>rL,>{O /build/buildd/glibc-2.9/build-tree/amd64-libc/csucrtn.S K !8Kx ID$`BGA $JL <@BIB B(A0A8G4 3-BDB A(A0,P5BDD C(D06gAP `7xN0_XRRGetScreenResourcesCurrentedid_atomdefsix_unused2outi0_filenolenfuncncrtcget_a_displaysq_ass_slicetp_getattrsq_itemgreen_masknb_addob_refcntsq_ass_itemoutisq_inplace_repeatVisualnext_screennb_lshiftsq_inplace_concattp_is_gcvSyncEnd_shortbufnb_powerrotationssq_repeatsq_concaterror_codetp_itemsizeinitprocmm_widthgreenPyGetSetDeftp_basesnull_error_handler__off_tmodesatomvbits_per_pixel_locksetattrofuncprivate_datatp_deallocnb_long_typeobjectnb_floor_dividebf_getwritebuffernb_inplace_lshiftroot_input_maskreadbufferproc__fmtnclone_XrmHashBucketRecmodeFlagsnb_indextp_richcomparemap_entries_IO_write_endnb_remaindervisitprocmax_keycodeRotationnb_inplace_multiplynameLenblack_pixeltp_comparecmaphas_primaryPyMemberDefob_typetp_freegetterrotationnb_andxdefaultstp_callWindowtdispptp_strconfigTimestampscrnresmonitorternaryfuncsprintfret_lenbitmap_bit_ordersq_contains_chaintp_setattrRealDisplaySizeMM_methodsrichcmpfuncunsigned charmin_mapsmp_ass_subscriptrscreenbf_getreadbufferColormap_IO_lock_thSyncStartprivate13classtp_dictoffsetroot_visualrootPyNumberMethodsPyMethodDefinitRealDisplaySizeMMstderrndepthsmax_mapsmp_subscripttp_clearicc_out_atommm_heightscanline_padsubpixel_ordernvisualsnmodeXErrorEventvisualidVisualIDtp_initobjobjargprocob_sizetp_dictbyte_order_IO_write_ptrtp_as_mappingsetattrfuncstrncpybinaryfuncRRCrtcmyscreenssizessizeargfuncext_datax_orgwhite_pixelbf_getbufferGetXRandROutputXIDheight_mmvTotalgetiterfuncnb_nonzerodescrsetfuncdescrgetfuncnb_octnb_inplace_add_IO_save_baseedidred_maskbname_XDisplayreprfuncproto_minor_versionedid_name__pad2_XRRModeInfobf_getcharbufferdisplay_namepixmap_formatndispsresourceidtimestampnb_divideRROutputdnamevalueproto_major_version_nextPyObjectnb_xornb_negativewritebufferprocrequestget_real_screen_size_mm_dispconnectionfree_disppaths__ssize_t__srcprintfuncedid_lenfree_a_disppathcallback_ddebugnhsyncPyBufferProcsml_flagstp_new/home/fhoech/dispcalgui/trunknb_inplace_true_dividenb_inplace_dividedestructorPyCFunctionnameLengthroot_depthhSkewsave_unders_sbuf_IO_save_endtp_delget_real_screen_size_mmprivate5stdouttp_nameclosureScreenFormatcrtcgamtp_as_sequencetp_as_bufferget_displaysnb_inplace_andshort unsigned intdefault_screentp_allocsuboffsetsresource_allocmotion_bufferdotClockmin_keycode__off64_tuscreen__len_XPrivatecoercion_IO_read_base_IO_buf_endtp_getattroallocfunc_modetp_methods_IO_write_basenext_outputtp_mrodone_xrandrsegcountprocRRMode__destblue_maskmydisplayDisplayCAL/RealDisplaySizeMM.crequest_codenb_orunaryfunc_IO_markerbitmap_padnoutputnb_floatnformatsDepthtraverseprocinquirykeysnb_invertml_docmax_request_sizeml_namey_orglong doubledesc1desc2tp_as_numberdnbufbf_getsegcounttp_weaklistoffsetwidth_mmml_methreadonlytp_docGNU C 4.3.3Atomgetattrofuncscreen_numbernewfuncPySequenceMethodsstdintp_weaklist_IO_buf_basebufferinfonscreenscharbufferproclast_request_readnb_positivehashfuncret_formatgetattrfunc_IO_read_endXF86VidModeSyncRangebitmap_unit_IO_FILE_XRRCrtcInfoshapeselfcrtcitp_hashcrtcsnb_hexndimbits_per_rgbtp_version_tagTime__pad1__pad3__pad4__pad5getbufferprocEMPTYnpossible_markers_possetterget_xrandr_output_xidqlentp_members_XGCtp_traversereleasemp_lengthbacking_storenb_inplace_xorstrcattp_subclassesargsnb_inplace_powertp_setattrofreefuncnb_multiplynb_true_dividetp_getsethTotalmheightScreentp_iternextsq_lengthSubpixelOrdertp_descr_getminvtp_iter_XRRGetOutputPrimaryxrr_foundnb_inplace_floor_dividestridestp_basenb_rshiftbf_releasebuffertp_printlong long unsigned intmemmove_cur_columnreleasebufferprocnb_inplace_remainderoutputshSyncEnd_objectnvsyncnb_absolute_IO_backup_base_IO_read_ptrvendorinternalret_togonb_inplace_oricc_atomtp_reprtp_cachedefault_gcenumerate_displaysPy_ssize_tmodel_old_offsetsq_sliceprivate10private11private12nb_inplace_rshiftprivate14private15private16private17private18private19vSyncStart_XRRCrtcGamma_XExtData_XRROutputInfolong long int_flags2bluePyMappingMethodsprivate1private2private3private4tp_flagsprivate6private8private9free_privatenb_subtract_XRRScreenResourcesg_error_handler_triggereddescriptionssizessizeobjargprocminor_codenpreferredXPointerXineramaScreenInfoiternextfuncXF86VidModeMonitorXRRModeFlagsnb_inttp_descr_setmajvPy_buffernb_coerceshort int_vtable_offsettp_basicsizenb_inplace_subtractret_typeserialdcountnb_divmodmwidthConnectionobjobjprocclones04w4yw09U9fSkqSqyUwwww U\USU\\UVP&w&w 2U2\\U\:=PSSPVw w  w w w(w0w8@wGzGwwzzw z w!w!&z?wz@w@zwfzfwzw@z_z_iSizQzSQz*z*SrS z S z ] &z?gSP]PS ]T]z+S@SzSdzyzfzSzzSPrSr z&z?z`SrSz S zSdzdySyzf@zzz;P; z&z?zf@z{UwU{wP w {&{?{w{w@{@wf@wIgPP P{a {&{?@{{o {&{?@{P ^&^?@^y y&y?yf@y%y%wy y y &w?wyJwJyw@yzJzJYwY z&z?zwzf@zzz z&z?zOkzxzzzdyzz@zzz@w@ z&z?zf@zw w&w?wf@wz z&z?zf@zzzzPF z&z?Ozkzfz@zz]zzz ] ] z&z?z]zw zOzz]zd]dyzy]f]z]@z\\7 \ &\?\\\ \O\\\dy\\\@\UPP@U@_Uzz'w' z&z?\z\kwkzf@zz!z! w W zW w z&z? z OwOzwzwz$w$yzywzf}w}zw@z\\r \ &\?\\\d\y\f@\_SSQTP S S &SSxSSdSySfSSQQ Q P Q 7 Q7 D Q Q{ {&{?{f@{{ {&{?{f@{{ {&{{@{{ {&{{@{,ULOU_bP,UU U{ {&{{@{{ {&{{@{{ {&{{@{ R5@R@BwBFwFHwHIw IJw(Jmw0@DU@OTRl^\_PouPuYSYg]PPPPP!PJRPhpPPPPPPP4<P3;PuJ\JaPucVprwrvwvzwz}w }w(w0pUVVPPS]PSy\\QPQPQw!w!ww UT+UFvSN[P[fPww0UTU\88O&?u @@xf@g@Xx wrgy_fyX@_xt zfyXO w|FNzn s b j .lX\ w|FNz&zGoGopdzxYDFK[!8&8.symtab.strtab.shstrtab.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc.debug_rangeso88% x-h h #5oBo@QXX[ e`@kq88w2(8(8(P;P;\;;l= == == == =? ?0? ?A A @B @B0@BCCDF+oss{'0|s2%=  K0 $? i8h X    8 (8P;;= = = = ? ? A @B  !  '= 5= C= P f@B uHB  = ==  7A  hB '`B KXB f 3-y 6g `7x? A = = 3 ICSev   TB  8PB  0BRbh" ' P55J^m@B  @2 `ARfpB kw@B !4;FX ^initfini.ccall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6997dtor_idx.6999frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxRealDisplaySizeMM.cRealDisplaySizeMM_methodsget_real_screen_size_mm_dispxrr_found.15330_XRRGetScreenResourcesCurrent.15333_XRRGetOutputPrimary.15336enumerate_displaysGetXRandROutputXIDRealDisplaySizeMM_GLOBAL_OFFSET_TABLE___dso_handle__DTOR_END___DYNAMICPyDict_SetItemStringXineramaQueryScreensXRRGetOutputPropertyXFreeXRRFreeScreenResourcesfree_a_disppathXRRFreeCrtcInfoPy_InitModule4_64XRRGetOutputInfonull_error_handler__gmon_start___Jv_RegisterClassesg_error_handler_triggered_finicallback_ddebugXGetWindowPropertymalloc@@GLIBC_2.2.5XineramaQueryExtensioninitRealDisplaySizeMMXRRQueryExtensionXRRGetCrtcGammaXRRQueryVersiondlsymPyString_FromStringAndSizeXOpenDisplay__strcat_chk@@GLIBC_2.3.4PyArg_ParseTuple__strdup@@GLIBC_2.2.5free@@GLIBC_2.2.5XCloseDisplay__cxa_finalize@@GLIBC_2.2.5XF86VidModeQueryExtensionget_a_displaystrrchr@@GLIBC_2.2.5PyString_FromStringPyInt_FromLongXRRGetScreenResourcesXRRFreeGammamemmove@@GLIBC_2.2.5strchr@@GLIBC_2.2.5getenv@@GLIBC_2.2.5Py_BuildValue__bss_startget_displays__stack_chk_fail@@GLIBC_2.4PyList_Appendstrcpy@@GLIBC_2.2.5free_disppathsXineramaIsActivecalloc@@GLIBC_2.2.5_endXInternAtomstrncpy@@GLIBC_2.2.5XRRGetCrtcInfo__sprintf_chk@@GLIBC_2.3.4stderr@@GLIBC_2.2.5XSetErrorHandlerXF86VidModeGetMonitorfwrite@@GLIBC_2.2.5realloc@@GLIBC_2.2.5_edataerror@@GLIBC_2.2.5dlopenPyList_NewXRRFreeOutputInfo_initPyDict_NewDisplayCAL-3.5.0.0/DisplayCAL/lib64/python27/0000755000076500000000000000000013242313606020035 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/lib64/python27/__init__.py0000644000076500000000000000000112665102035022135 0ustar devwheel00000000000000#DisplayCAL-3.5.0.0/DisplayCAL/lib64/python27/RealDisplaySizeMM.so0000755000076500000000000016467113221473253023722 0ustar devwheel00000000000000ELF>@@8@%"|?|? MM M  MM M Ptd===\\QtdRtdMM M PPCE 9)1';-3 .$(>&:247#+D=,0%6/B ?A!8*" @  C<58@ @9 b$8<?|ۧ;w|CEwxqXb戢ˎ)^j6I% ( k{ + @q:L;-r",`VY& \*S  R `R d 7`R  ( I? RtR  x:pR l __gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesnull_error_handlerg_error_handler_triggeredinitRealDisplaySizeMMPy_InitModule4_64free_a_disppathfreefree_disppaths__strdupstrrchrstrchr__sprintf_chkXOpenDisplayXCloseDisplayget_displaysgetenvstrncpyXSetErrorHandlercalloc__strcat_chkXRRQueryExtensionXRRQueryVersionXRRGetCrtcInfoXRRFreeCrtcInfoXRRGetOutputInfoXRRGetCrtcGammaXRRFreeGammareallocXInternAtomXRRGetOutputPropertymallocmemmoveXFreeXRRFreeOutputInfoXRRFreeScreenResourcesXF86VidModeQueryExtensionXF86VidModeGetMonitorXGetWindowPropertyerrorstrcpy__stack_chk_failXineramaQueryExtensionXineramaIsActiveXineramaQueryScreensXRRGetScreenResourcesstderrfwritedlopendlsymPyList_NewPyDict_NewPyString_FromStringPyDict_SetItemStringPy_BuildValuePyInt_FromLongPyString_FromStringAndSizePyList_Appendget_a_displayPyArg_ParseTuplecallback_ddebuglibX11.so.6libXinerama.so.1libXrandr.so.2libXxf86vm.so.1libpthread.so.0libc.so.6_edata__bss_start_endGLIBC_2.4GLIBC_2.3.4GLIBC_2.2.5ii ti  ui Q Q Q F<Q 5Q <R :R 9R = R Y<(R P98R X=O @O  O  O AO O .P P P P  P (P ?0P 8P @P  HP  PP  XP `P hP pP xP P P P P P P P P P P <P P P P P  P !Q "Q #Q $Q 8 Q %(Q &0Q '8Q 9@Q (HQ )PQ *XQ +`Q ,hQ -pQ /xQ 0Q 1Q 2Q 3Q 4Q 5Q 6Q 7H*$H59 %9 @%9 h%9 h%9 h%9 h%9 h%9 h%z9 h%r9 hp%j9 h`%b9 h P%Z9 h @%R9 h 0%J9 h %B9 h %:9 h%29 h%*9 h%"9 h%9 h%9 h% 9 h%9 h%8 h%8 hp%8 h`%8 hP%8 h@%8 h0%8 h %8 h%8 h%8 h%8 h %8 h!%8 h"%8 h#%8 h$%8 h%%z8 h&%r8 h'p%j8 h(`%b8 h)P%Z8 h*@%R8 h+0%J8 h, %B8 h-%:8 h.%28 h/%*8 h0%"8 h1%8 h2%8 h3% 8 h4%8 h5%7 h6HH5 HtHÐU=x8 HATSubH=5 t H=7 H3 L%3 HM8 L)HHXH9s DHBH-8 AH"8 H9r8 [A\fUH=g3 Ht"HS5 HtH=O3 IAÐH)5 1H5)7 H=A11HSHt7H?HtH{HtH{8HtH[D[ATHIUSt|HHtaH1HfHHHt HMH;HGHt H9H;HG8Ht H%H;HcIHHu[]LA\[]A\Ld$H\$IHl$HHH?HH:HHt4.HNHt"ED$ H HH1H/HHtOH_IcD$ HHHD`$X PLH H H$Hl$Ld$H1@H1fDfDAWH=AVAUATUSHdH%(H$1DŽ$DŽ$zH L$cHLƄ$s:LHt(.H"H x_@0@LHIHDŽ$@H=9HBH-32 HH H=HAHDŽ$$$HcHH$@H$o D$1E$9 `H$HcHHuHsL[HDŽ$@L$dL3%(H$@+H[]A\A]A^A_H5dLH$H$L8H$H$L8~$p$bH-0 HHt$~H=B3 |A$~H$XH$H$HDŽ$@DŽ$LDŽ$HT$PHL$HH\$@$H2 HHc$LILHHtH$H$+$Hf2 HILHtHH}L$DŽ$$E1A@H$IcLHQHHHHtXHxtLp$tDD~=HH(D$1HH9Ë$DDD$ADăH9։$H$ABD9hD$DŽ$Ƅ$;EH$DŽ$HDŽ$DŽ$ HL$XD$Et$H$$ Hc$ H$LHHH$HQH[HISHxx$f$ 9$H$$;DŽ$DŽ$$HDŽ$(HT$`$ $fD$tD$E $$$Lc$$H$LL$IH$L$IE(H3HH$0D$HEHE$(H$(f{0L$H$LI@H4(HHwDE[HH$@$H$@HcHHH$@HHc$HDH$@`L$[HI$^D$LD@ I$$P$I$P(I$AEBI$AE BI$AEBI$AEBH$H$I$HAH HHBHIE(L$I$JHBPH$0H$$H$D$HLJ1dI$H$L$DJH$H &BH$D$BD$B$1n$~QH$(tFH$(H$H 6d1LC,H$H$bH$I$qHHC:LHt7.HHt%D$LH ;HH1I$LHH $ H$H_ICC_PROH BFILEB H$I$1LHHC0 I$H5f1LHHCX =UH NHQL2HDŽ$HDŽ$H$PH$XHL$`H$H\$PHD$hfDH3H>LcHHtIE(H$E1LD$HLH4HD$@HL$XLD$0LD$`HD$HD$(HD$hHL$ 1$LD$AHD$vnH$Ht HPI$HHC8 I$H$H$Hx8I$H$B@H$H$0H9$(tH$$$$$A9]$H$(t H$(L$$;tD$HE7 $ L$$H$HA9@3H$^$L$L9$]1H$@!LDL$DŽ$:0.0Ƅ$H$LHDŽ$@fH5dLpH$L$H$H$H$DŽ$<H$L$H$H$H$L$H$H$H$H$PH$L$H$HT$xHL$p(fDH$I_ICC_PROL@FILE@ H$H]1L"HHC0DŽ$HDŽ$HE@$H$H sA21H$LHHDŽ$HDŽ$HE@$H$HXFree86_HDDC_EDIDH2_RAWDATH1HQHAfAAH$L9HHMH$Ht$xLt:HDŽ$XHELHT$pp$DtH$XHt >D$<H$H d1HUL$L$H WLBDJD$BD$B$1H]LHHC$<$<9$/D$<DŽ$:DŽ$L AHt@.HUHt.H$EtE1H HH1H$McLJ,H]GHHCH$HEKd@ HEDh$HEDh(L$HMIBABHMABHMAB HMAHE@$H$H LAd13fDHEIE1H$L$H$Hc@$HHtH$H$HL$(1LD$AH\$ HT$HLHD$H$qH$Ht HH]RHHC8HEH$H$Hx8xHUH$B@H$H$H=6 lHEIE1L$H$H$Hc@$HHtH$H$LD$ AHL$1H\$(HT$HLHD$H$Y4H$HHf.H$IXFree86_IDDC_EDIDH1_RAWDATL LBHzfBA(@H$H A21zHEDh HEDh$HEDh(HE@HE@HMIHcA HDAHMIHcA HDA$fH$$$$DŽ$$D$$$$1@H$H$tS1$9$$$$1I$H$H dD@$1_H$H$L.LKH$LHH$$DL$;H5f H=D zH$H=+ aD$HE$;DŽ$ HH$@ Hc$1D$D9$ $ IcH$HHHHH L$A@DŽ$DŽ$$Ƅ$;2LH$0H9$( H$(H$hLH$@HDŽ$@Hc$LILHHtH$sH^ H= :HH$0H9$(H$(LH$H$@1IH$ADŽ$DŽ$$Ƅ$;LL$0L9$(H$(OH$2LJHn H=:HHLH$0H9$(XHH$(N&b#p *b#t ,p#x 0F# 1T# 2# 6# ?{# H# I# J#  K# L-#  Nb# /P# ?  G# # 8 b#  z  n  7 1 jW k#  ke# ke E#  Ee# Z E#  F#  G# > G#(  K>#0  L\#8 o M#@  N#H  O#P  P#X J T#` U#h  V#p Z#x G [# ] \# ]# ^#  a#  di# f# o j; #  m# q q3# l t# [ x_# % yk#  |L# _ }X#  ~#  e# b # I w#  # e # D # g #  #   # # n # 4 #  # # #  ># M#WM l. k   bF  0 ;AbVVV gm c b^ bL b30 JPj3i JG  9 ` buf #obj #len # A # b# b#$  #( #0  #8 p #@  #H p #X     b  b     l  b  & b;  F L bf  8 ۵ #  # #  #  # P #(  #0 ] v#8 9 v#@ @ v#H * #P  v#X #`  #h 6 #p V #x #  0#  v#  v# v# O v# v# V # % #  # U #  # #  #  # 6 # #  #  # #  # > # h v# f P a 1 # ) #  \# z \#  # #( b #0   #8 #@ \#H   ! "#  ##  $# %m 0 ' % (?#  )j# ] *u#  +#  , #  - #( .  1,2>g 2JP\ 3hnbbY 4 5 6b 7 8  9E :#i3 ;?E_b < =B >5 ?J @ Ae Be a   |L $ &# '#  (b# *# Rb( ~  #get #set #doc #  # ^2 r  ,& =  b&?XID G8 O8; Q8 R8O e,6 m,ls  b# H# # n#ybtyGCj 8} }# 2B# _ b# x 8#  8# b  8#(  b#0  b#4 b# b# # ! "}# Z## $X# V%b# %b# Z&b# &b#$ 'b#( (#0 )b#8 s*#@ +#H ,c#P -8#X .8#` /b#h /b#l 0b#p 1b#t 2i#x38r 9}# :b# ;b# <b#=, (D }# J#fdb# b# 3b# b# i# ,#( ,#0 ,#8 b#@ { `#H j b#P !b#T "b#X #b#\ $b#` %f#h &b#p { 'b#t (J#x (J# Z )b# ' *8# y+8# ,n# -n# U.n# /n#  0M#db1r# (2# 5# X 6b#  7b#  8~# 98# 2:8# ;b# <b# <=n# F>n# P?b# =@# D,`PrLlbx( b# Z# ,# B8# 3?# ?#! s?#"&<hi #lo #r 0 i# #   # ?# # 9?# :#(<G " #b# $[# , %[# V&[# '[# ( F;"Fa#F',(,T ),8P:idT# VM# M# 8# JM# (M# M# M#$ ZM#( M#, M#0 #8 ~M#@ ^_#Hj$@ M# dM# Nb# # b# #( b#0 #8I>:%E}` M# OI# # b# S8# 8#( 3#0 (#2 Nb#4 #8 Eb#@ w#H b#P ~b#T #XT~ @D EM#xFb#yFb# VGM# GM# HT# -I# Jb#$ K#( L#0 % Mb#4 & N#8 Oe e ]fb#redg# \h# i#Ffj`@ A# RB#sxCb#syCb#swDb#shDb# ` Mb# Nb#$ Ob#( P7#0 sQ&#8 Rb#@ OVI#H - W>#P X7#X[ ~ b# b#!b<__s ? !yp [ w w w-  [  : [ 8 8 8-"D b#ixb$xidb%"?#ixb%]%&wbw}'U(evT)w*+8*>  +> ,P-i@b. +%]$pp//l %b0)1/1$2)  t5 0'3 -ib-jb#-kb%(b/Ib/'& 4W 0'~5evbb{5erbb{/bo /Vb /l 7 /b -xai@' 4> 0'}4D F'{6( up'6; N(6{'7"$pp8pJ"119<0p((117 %%(b,0/t7V' /8b -pix9bI-pop:b-jj;be-xj<b-xk=b7$$ppv/ w\'v/8xb'j,/b'800]06}#1/1$8P%u% #1/1$8p$% #118$$ #1/1$8b$$$1/1$:4$1/1$7N$/ h', /C7!49C7{4N Db{/Ei4yEi{/F&B$iiGb4 Hn'z,/R,;f / Y\'7&4|z-evbb}-erbb $pp7P&4~'/7497{/N b/i4yi{/&$8*$*%1/1$0/0/1/1$:.&1/1$8+>+U&1/1$8B++|&1/1$:&1/1$0,,1/1$<11&%()b/V*4x R 4) R 4c) xR @' c V'  ~'  ' 1.57E(+ p+ -l-dp  ;57/-5 /]b!-ib!,0-d!=TY7A9!(>ixYbf"/Z "-rvZ1#-i[bg#.nP99#>)+ m"$+ mE$5ixobl-xidpb{$099t1,`?@$.a98:$)+ ` %+ `/%5ixbbd%]cA g1,?&@2e%V')X)>)X)  * 4y) Q B BBCfb pR C8b tR uN /build/buildd/glibc-2.9/build-tree/amd64-libc/csu/crtn.S/build/buildd/glibc-2.9/csuGNU AS 2.19.1U%% : ; I$ > $ > $ >   I : ;  : ;I8 : ; : ; I8 I !I/ &I& : ; ' II : ; I8 '  : ; : ;I : ; : ;< : ; I : ; : ;I8  : ; .? : ; ' I : ; I : ; I!".: ;' I #: ;I$4: ;I%4: ;I&.? : ; ' I@ ': ; I (: ; I ).? : ;' @ *.? : ;' @+: ;I, U-4: ;I..: ;' I@/4: ;I01X Y112.? : ; I@34: ; I44: ;I 54: ;I 6 : ;7 U81X Y91X Y:1UX Y; < =.? : ;' I@>: ;I?41@41A1UX YB4: ; I? < C4: ; I?  U%O /build/buildd/glibc-2.9/build-tree/amd64-libc/csucrti.S  Ku=/0K (K x:$ DisplayCAL/usr/include/bits/usr/lib/gcc/x86_64-linux-gnu/4.3.3/include/usr/include/usr/include/sys/usr/local/include/python2.7/usr/include/X11/usr/include/X11/extensionsRealDisplaySizeMM.cstdio2.hstring3.hstddef.htypes.hstdio.hlibio.htypes.hpyport.hobject.hmethodobject.hdescrobject.hX.hXlib.hxf86vmode.hXinerama.hrandr.hXrandr.h  <~; =/YZZ>/;Y1=>v <uX,>,X?!v  ";=3[9I?[Wrxt.}t. X}t![KQ J00##x8 \| ttr.tf}"`}% 9?g.&A+s4oX $~~X ? fi~*~XM 8  2 (zXKuzttztz#zJPzX,!z %t#"qyJ9nx`xPyX !~XɃ}#}x{<xx tx (hK#x#p7x.(xJCLTzPY!x<x.'MGug x.xX\tx@0=(# ~X2w | {-1:}փ.zt~~-;u=|;[Ƀ~-[Ƀ}:[IȃYjY^~t<Y~<z$uY</-gv:>LM0M="g"g """"PBJ>JY"$ }4z.4zX>rL,>{O /build/buildd/glibc-2.9/build-tree/amd64-libc/csucrtn.S ;K :Kx ID$ BGA $JL <BIB B(A0A8G45-BDB A(A0,7BDD C(D0P9gAP 9xN0_XRRGetScreenResourcesCurrentedid_atomdefsix_unused2outi0_filenolenfuncncrtcget_a_displaysq_ass_slicetp_getattrsq_itemgreen_masknb_addob_refcntsq_ass_itemoutisq_inplace_repeatVisualnext_screennb_lshiftsq_inplace_concattp_is_gcvSyncEnd_shortbufnb_powerrotationssq_repeatsq_concaterror_codetp_itemsizeinitprocmm_widthgreenPyGetSetDeftp_basesnull_error_handler__off_tmodesatomvbits_per_pixel_locksetattrofuncprivate_datatp_deallocnb_long_typeobjectnb_floor_dividebf_getwritebuffernb_inplace_lshiftroot_input_maskreadbufferproc__fmtnclone_XrmHashBucketRecmodeFlagsnb_indextp_richcomparemap_entries_IO_write_endnb_remaindervisitprocmax_keycodeRotationnb_inplace_multiplynameLenblack_pixeltp_comparecmaphas_primaryPyMemberDefob_typetp_freegetterrotationnb_andxdefaultstp_callWindowtdispptp_strconfigTimestampscrnresmonitorternaryfuncsprintfret_lenbitmap_bit_ordersq_contains_chaintp_setattrRealDisplaySizeMM_methodsrichcmpfuncunsigned charmin_mapsmp_ass_subscriptrscreenbf_getreadbufferColormap_IO_lock_thSyncStartprivate13classtp_dictoffsetroot_visualrootPyNumberMethodsPyMethodDefinitRealDisplaySizeMMstderrndepthsmax_mapsmp_subscripttp_clearicc_out_atommm_heightscanline_padsubpixel_ordernvisualsnmodeXErrorEventvisualidVisualIDtp_initobjobjargprocob_sizetp_dictbyte_order_IO_write_ptrtp_as_mappingsetattrfuncstrncpybinaryfuncRRCrtcmyscreenssizessizeargfuncext_datax_orgwhite_pixelbf_getbufferGetXRandROutputXIDheight_mmvTotalgetiterfuncnb_nonzerodescrsetfuncdescrgetfuncnb_octnb_inplace_add_IO_save_baseedidred_maskbname_XDisplayreprfuncproto_minor_versionedid_name__pad2_XRRModeInfobf_getcharbufferdisplay_namepixmap_formatndispsresourceidtimestampnb_divideRROutputdnamevalueproto_major_version_nextPyObjectnb_xornb_negativewritebufferprocrequestget_real_screen_size_mm_dispconnectionfree_disppaths__ssize_t__srcprintfuncedid_lenfree_a_disppathcallback_ddebugnhsyncPyBufferProcsml_flagstp_new/home/fhoech/dispcalgui/trunknb_inplace_true_dividenb_inplace_dividedestructorPyCFunctionnameLengthroot_depthhSkewsave_unders_sbuf_IO_save_endtp_delget_real_screen_size_mmprivate5stdouttp_nameclosureScreenFormatcrtcgamtp_as_sequencetp_as_bufferget_displaysnb_inplace_andshort unsigned intdefault_screentp_allocsuboffsetsresource_allocmotion_bufferdotClockmin_keycode__off64_tuscreen__len_XPrivatecoercion_IO_read_base_IO_buf_endtp_getattroallocfunc_modetp_methods_IO_write_basenext_outputtp_mrodone_xrandrsegcountprocRRMode__destblue_maskmydisplayDisplayCAL/RealDisplaySizeMM.crequest_codenb_orunaryfunc_IO_markerbitmap_padnoutputnb_floatnformatsDepthtraverseprocinquirykeysnb_invertml_docmax_request_sizeml_namey_orglong doubledesc1desc2tp_as_numberdnbufbf_getsegcounttp_weaklistoffsetwidth_mmml_methreadonlytp_docGNU C 4.3.3Atomgetattrofuncscreen_numbernewfuncPySequenceMethodsstdintp_weaklist_IO_buf_basebufferinfonscreenscharbufferproclast_request_readnb_positivehashfuncret_formatgetattrfunc_IO_read_endXF86VidModeSyncRangebitmap_unit_IO_FILE_XRRCrtcInfoshapeselfcrtcitp_hashcrtcsnb_hexndimbits_per_rgbtp_version_tagTime__pad1__pad3__pad4__pad5getbufferprocEMPTYnpossible_markers_possetterget_xrandr_output_xidqlentp_members_XGCtp_traversereleasemp_lengthbacking_storenb_inplace_xorstrcattp_subclassesargsnb_inplace_powertp_setattrofreefuncnb_multiplynb_true_dividetp_getsethTotalmheightScreentp_iternextsq_lengthSubpixelOrdertp_descr_getminvtp_iter_XRRGetOutputPrimaryxrr_foundnb_inplace_floor_dividestridestp_basenb_rshiftbf_releasebuffertp_printlong long unsigned intmemmove_cur_columnreleasebufferprocnb_inplace_remainderoutputshSyncEnd_objectnvsyncnb_absolute_IO_backup_base_IO_read_ptrvendorinternalret_togonb_inplace_oricc_atomtp_reprtp_cachedefault_gcenumerate_displaysPy_ssize_tmodel_old_offsetsq_sliceprivate10private11private12nb_inplace_rshiftprivate14private15private16private17private18private19vSyncStart_XRRCrtcGamma_XExtData_XRROutputInfolong long int_flags2bluePyMappingMethodsprivate1private2private3private4tp_flagsprivate6private8private9smalltablefree_privatenb_subtract_XRRScreenResourcesg_error_handler_triggereddescriptionssizessizeobjargprocminor_codenpreferredXPointerXineramaScreenInfoiternextfuncXF86VidModeMonitorXRRModeFlagsnb_inttp_descr_setmajvPy_buffernb_coerceshort int_vtable_offsettp_basicsizenb_inplace_subtractret_typeserialdcountnb_divmodmwidthConnectionobjobjprocclones04w4yw09U9fSkqSqyUwww w U\USU\ \  UVVP&w&w 2U2\\U\:=PSSPVw w  w w w(w0w8wGzGwzzw z w wz9wIzIqwqzwzwzwzwzw_z_iSizQzSQz z ]z9PS]"P"]IzIqSqzSz~zz z\P\ z z9z\z~zy y?Q? y y9y~y{UwU{wP w { {9{IwIq{qw#{#w{w~wIgPP P{h { {9{{v { {9{P ^ ^9^y y y9y~y%z%wz z zw9wzIqz #wzz NzN]w] z z9zwz~zz  z z9z~zz zDwD z z9z~zw  w w9w~wz  z z9z~zz zzPE z z9#zCtzz~zz z z z9DzDIwIz~z] f],],\P\ ]]9]"]#]#0P0]~]z -z-( w( n zn w z z9zwCzCtwtzwPzPnwnzwzwzw2z2VwVzwz~wzw  w z w z w w9wzCwCtztnwnzwLzLwzwzwzwz~z_SS[^PpxPxT S SSSSSP`SLSSPSSSQ Q P Q 1 Q1 9 Q%QqQ{  { {9{~{{  { {9{~{_SS 1SPES1 SSSS#CStSPSSSUPPDUDU UUU{ { {{Iq{{{ { {{Iq{{PPRUiU\hU{ { {{Iq{{{ { {{Iq{{{ { {{Iq{{ R Rwwww w( w0UT ^PPS]3GPGJP[oPorPPPPP&.PDLPbjPPPPPP\PVwwww !w(!w0&U&wV|V),P4BPBnSn{]|PSy\|\6BQBRPRXQXnP|Qwww UTUSPP .w.w0 1U =T=DUV\(1x:|:O @ | (qI~L@(qI ~@P(qId  ~@PCtqI>   \ c 8x@~a ~LT {P I"E{ HpPppXP;#HP*X{ilqJly|sw^ay|swdl;@::.symtab.strtab.shstrtab.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc.debug_ranges(o`% x- #5oBo@@@Q[( e((`@@k qx:x:w2::(==\>>lM MM MM MM MO O0O OQ Q `R `R0`R SSTf+'0 ~2%=0`K 0 $? Pi @ ( @  x: :=>M M M M O O Q `R  !  'M 5M CM P f`R uhR  `M x?M  @:Q  R 'R KxR f 5-y P9g 9xO Q M M 3 ICSev   tR  x:pR  0BRbh" ' 75J^m`R  2 ARfR kw`R !4;FX (^initfini.ccall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6997dtor_idx.6999frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxRealDisplaySizeMM.cRealDisplaySizeMM_methodsget_real_screen_size_mm_dispxrr_found.15590_XRRGetScreenResourcesCurrent.15593_XRRGetOutputPrimary.15596enumerate_displaysGetXRandROutputXIDRealDisplaySizeMM_GLOBAL_OFFSET_TABLE___dso_handle__DTOR_END___DYNAMICPyDict_SetItemStringXineramaQueryScreensXRRGetOutputPropertyXFreeXRRFreeScreenResourcesfree_a_disppathXRRFreeCrtcInfoPy_InitModule4_64XRRGetOutputInfonull_error_handler__gmon_start___Jv_RegisterClassesg_error_handler_triggered_finicallback_ddebugXGetWindowPropertymalloc@@GLIBC_2.2.5XineramaQueryExtensioninitRealDisplaySizeMMXRRQueryExtensionXRRGetCrtcGammaXRRQueryVersiondlsymPyString_FromStringAndSizeXOpenDisplay__strcat_chk@@GLIBC_2.3.4PyArg_ParseTuple__strdup@@GLIBC_2.2.5free@@GLIBC_2.2.5XCloseDisplay__cxa_finalize@@GLIBC_2.2.5XF86VidModeQueryExtensionget_a_displaystrrchr@@GLIBC_2.2.5PyString_FromStringPyInt_FromLongXRRGetScreenResourcesXRRFreeGammamemmove@@GLIBC_2.2.5strchr@@GLIBC_2.2.5getenv@@GLIBC_2.2.5Py_BuildValue__bss_startget_displays__stack_chk_fail@@GLIBC_2.4PyList_Appendstrcpy@@GLIBC_2.2.5free_disppathsXineramaIsActivecalloc@@GLIBC_2.2.5_endXInternAtomstrncpy@@GLIBC_2.2.5XRRGetCrtcInfo__sprintf_chk@@GLIBC_2.3.4stderr@@GLIBC_2.2.5XSetErrorHandlerXF86VidModeGetMonitorfwrite@@GLIBC_2.2.5realloc@@GLIBC_2.2.5_edataerror@@GLIBC_2.2.5dlopenPyList_NewXRRFreeOutputInfo_initPyDict_NewDisplayCAL-3.5.0.0/DisplayCAL/lib64/RealDisplaySizeMM.so0000755000076500000000000010676013221474112022216 0ustar devwheel00000000000000_Dt$ Pt $ $ ދủ}[^_ [^_DU8]u}[ U1ҍt$D$$ t,DžDD M3 ]u}Ët$ 8tt$D$$ [@D$$ 4tcD11u$fD8BF9vCD$$S ‹4uĉ $\8$4  Dž\1p,a$U Mp v   48dD$, $- 4`,pB`,tB `,xB,|Bd$ 8D$$ H‹$D$$| ƅ$^ L.D$$ @___CFConstantStringClassReferenceQqx@___stack_chk_guardq@dyld_stub_binderqq >@_CFDictionaryGetCountq>@_CFDictionaryGetKeysAndValuesq>@_CFDictionaryGetValueq>@_CFReleaseq>@_CFStringGetCStringq >@_CFStringGetCStringPtrq$>@_CGDisplayBoundsq(>@_CGDisplayIOServicePortq,>@_CGDisplayIsMainq0>@_CGDisplayScreenSizeq4>@_CGGetActiveDisplayListq8>@_IODisplayCreateInfoDictionaryq<>@_PyArg_ParseTupleq@>@_PyDict_NewqD>@_PyDict_SetItemStringqH>@_PyList_AppendqL>@_PyList_NewqP>@_PyString_FromStringqT>@_Py_BuildValueqX>@_Py_InitModule4q\@___sprintf_chkq`@___stack_chk_failqd@_callocqh@_freeql@_mallocqp@_strdupqt@_strncpy_initRealDisplaySizeMM=free_Bget_ecallback_ddebug!a_disppath[disppaths`"#displays}a_display$4Add5fsFZ.$$PNP.$$PNP.@$@$PNP.$$pNp.$$N.$$N.`$`$ N .$$N$& ? d)=P^ y @`)4H_p(4IXh23456789:;<=>?@ABCDEGHJKLMN@@I23456789:;<=>?@ABCDEGHJKLMN __mh_bundle_header_GetXRandROutputXID_enumerate_displays_RealDisplaySizeMM stub helpers_RealDisplaySizeMM_methods_callback_ddebug_free_a_disppath_free_disppaths_get_a_display_get_displays_initRealDisplaySizeMM_CFDictionaryGetCount_CFDictionaryGetKeysAndValues_CFDictionaryGetValue_CFRelease_CFStringGetCString_CFStringGetCStringPtr_CGDisplayBounds_CGDisplayIOServicePort_CGDisplayIsMain_CGDisplayScreenSize_CGGetActiveDisplayList_IODisplayCreateInfoDictionary_PyArg_ParseTuple_PyDict_New_PyDict_SetItemString_PyList_Append_PyList_New_PyString_FromString_Py_BuildValue_Py_InitModule4___CFConstantStringClassReference___sprintf_chk___stack_chk_fail___stack_chk_guard_calloc_free_malloc_strdup_strncpydyld_stub_binder/Users/Shared/dispcalGUI/trunk/DisplayCAL/RealDisplaySizeMM.c/Users/Shared/dispcalGUI/trunk/build/temp.macosx-10.6-intel-2.7/DisplayCAL/RealDisplaySizeMM.o_initRealDisplaySizeMM_GetXRandROutputXID_free_a_disppath_free_disppaths_get_displays_enumerate_displays_get_a_display_RealDisplaySizeMM_RealDisplaySizeMM_methods_callback_ddebug(__TEXT __text__TEXTE __symbol_stub1__TEXTVV__cstring__TEXT__stub_helper__TEXT(__unwind_info__TEXT|__eh_frame__TEXT@@ `__DATA  __nl_symbol_ptr__DATA  __la_symbol_ptr__DATA  __cfstring__DATA __data__DATA ! !H__LINKEDIT00 ؔo웋<]S"000Xh033Q9` P,,28; 8}/usr/lib/libSystem.B.dylibUHA11H5H= UHHHHUH5 1A 1҅t1H= 1O HHDUHSHHHt/H?HtB H{Ht4 HH[& fDH[fUHAUATSHIHtiHHtOHE1fDH8Ht H;HGHt H H; AIcI\HHuLH[A\A] H[A\A]UHH]LeLmLuL}HL=zIHE1H@___CFConstantStringClassReferenceQq@___stack_chk_guardq@dyld_stub_binderq>@_CFDictionaryGetCountq >@_CFDictionaryGetKeysAndValuesq(>@_CFDictionaryGetValueq0>@_CFReleaseq8>@_CFStringGetCStringq@>@_CFStringGetCStringPtrqH>@_CGDisplayBoundsqP>@_CGDisplayIOServicePortqX>@_CGDisplayIsMainq`>@_CGDisplayScreenSizeqh>@_CGGetActiveDisplayListqp>@_IODisplayCreateInfoDictionaryqx>@_PyArg_ParseTupleq>@_PyDict_Newq>@_PyDict_SetItemStringq>@_PyList_Appendq>@_PyList_Newq>@_PyString_FromStringq>@_Py_BuildValueq>@_Py_InitModule4_64q@___sprintf_chkq@___stack_chk_failq@_callocq@_freeq@_mallocq@_strcmpq@_strdupq@_strncpy_initRealDisplaySizeMM=free_Bget_ecallback_ddebug a_disppath[disppaths`!!displays}a_display"0Cd!d@fsFZ.$$0N0.@$@$@N@.$$PNP.$$N.`$`$`N`.$$N.p $p$N.$$N/& !J d@)=P^ !y !p`)4H_p(4IXk23456789:;<=>?@ABCDEGHJKLMNOI@@23456789:;<=>?@ABCDEGHJKLMNO __mh_bundle_header_GetXRandROutputXID_enumerate_displays_RealDisplaySizeMM stub helpers_RealDisplaySizeMM_methods_callback_ddebug_free_a_disppath_free_disppaths_get_a_display_get_displays_initRealDisplaySizeMM_CFDictionaryGetCount_CFDictionaryGetKeysAndValues_CFDictionaryGetValue_CFRelease_CFStringGetCString_CFStringGetCStringPtr_CGDisplayBounds_CGDisplayIOServicePort_CGDisplayIsMain_CGDisplayScreenSize_CGGetActiveDisplayList_IODisplayCreateInfoDictionary_PyArg_ParseTuple_PyDict_New_PyDict_SetItemString_PyList_Append_PyList_New_PyString_FromString_Py_BuildValue_Py_InitModule4_64___CFConstantStringClassReference___sprintf_chk___stack_chk_fail___stack_chk_guard_calloc_free_malloc_strcmp_strdup_strncpydyld_stub_binder/Users/Shared/dispcalGUI/trunk/DisplayCAL/RealDisplaySizeMM.c/Users/Shared/dispcalGUI/trunk/build/temp.macosx-10.6-intel-2.7/DisplayCAL/RealDisplaySizeMM.o_initRealDisplaySizeMM_GetXRandROutputXID_free_a_disppath_free_disppaths_get_displays_enumerate_displays_get_a_display_RealDisplaySizeMM_RealDisplaySizeMM_methods_callback_ddebugDisplayCAL-3.5.0.0/DisplayCAL/linear.cal0000644000076500000000000002330412665102054017361 0ustar devwheel00000000000000CAL DESCRIPTOR "Argyll Device Calibration Curves" ORIGINATOR "Argyll synthcal" CREATED "Sun Oct 06 00:13:42 2013" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 3.92157e-003 3.92157e-003 3.92157e-003 3.92157e-003 7.84314e-003 7.84314e-003 7.84314e-003 7.84314e-003 0.0117647 0.0117647 0.0117647 0.0117647 0.0156863 0.0156863 0.0156863 0.0156863 0.0196078 0.0196078 0.0196078 0.0196078 0.0235294 0.0235294 0.0235294 0.0235294 0.0274510 0.0274510 0.0274510 0.0274510 0.0313725 0.0313725 0.0313725 0.0313725 0.0352941 0.0352941 0.0352941 0.0352941 0.0392157 0.0392157 0.0392157 0.0392157 0.0431373 0.0431373 0.0431373 0.0431373 0.0470588 0.0470588 0.0470588 0.0470588 0.0509804 0.0509804 0.0509804 0.0509804 0.0549020 0.0549020 0.0549020 0.0549020 0.0588235 0.0588235 0.0588235 0.0588235 0.0627451 0.0627451 0.0627451 0.0627451 0.0666667 0.0666667 0.0666667 0.0666667 0.0705882 0.0705882 0.0705882 0.0705882 0.0745098 0.0745098 0.0745098 0.0745098 0.0784314 0.0784314 0.0784314 0.0784314 0.0823529 0.0823529 0.0823529 0.0823529 0.0862745 0.0862745 0.0862745 0.0862745 0.0901961 0.0901961 0.0901961 0.0901961 0.0941176 0.0941176 0.0941176 0.0941176 0.0980392 0.0980392 0.0980392 0.0980392 0.101961 0.101961 0.101961 0.101961 0.105882 0.105882 0.105882 0.105882 0.109804 0.109804 0.109804 0.109804 0.113725 0.113725 0.113725 0.113725 0.117647 0.117647 0.117647 0.117647 0.121569 0.121569 0.121569 0.121569 0.125490 0.125490 0.125490 0.125490 0.129412 0.129412 0.129412 0.129412 0.133333 0.133333 0.133333 0.133333 0.137255 0.137255 0.137255 0.137255 0.141176 0.141176 0.141176 0.141176 0.145098 0.145098 0.145098 0.145098 0.149020 0.149020 0.149020 0.149020 0.152941 0.152941 0.152941 0.152941 0.156863 0.156863 0.156863 0.156863 0.160784 0.160784 0.160784 0.160784 0.164706 0.164706 0.164706 0.164706 0.168627 0.168627 0.168627 0.168627 0.172549 0.172549 0.172549 0.172549 0.176471 0.176471 0.176471 0.176471 0.180392 0.180392 0.180392 0.180392 0.184314 0.184314 0.184314 0.184314 0.188235 0.188235 0.188235 0.188235 0.192157 0.192157 0.192157 0.192157 0.196078 0.196078 0.196078 0.196078 0.200000 0.200000 0.200000 0.200000 0.203922 0.203922 0.203922 0.203922 0.207843 0.207843 0.207843 0.207843 0.211765 0.211765 0.211765 0.211765 0.215686 0.215686 0.215686 0.215686 0.219608 0.219608 0.219608 0.219608 0.223529 0.223529 0.223529 0.223529 0.227451 0.227451 0.227451 0.227451 0.231373 0.231373 0.231373 0.231373 0.235294 0.235294 0.235294 0.235294 0.239216 0.239216 0.239216 0.239216 0.243137 0.243137 0.243137 0.243137 0.247059 0.247059 0.247059 0.247059 0.250980 0.250980 0.250980 0.250980 0.254902 0.254902 0.254902 0.254902 0.258824 0.258824 0.258824 0.258824 0.262745 0.262745 0.262745 0.262745 0.266667 0.266667 0.266667 0.266667 0.270588 0.270588 0.270588 0.270588 0.274510 0.274510 0.274510 0.274510 0.278431 0.278431 0.278431 0.278431 0.282353 0.282353 0.282353 0.282353 0.286275 0.286275 0.286275 0.286275 0.290196 0.290196 0.290196 0.290196 0.294118 0.294118 0.294118 0.294118 0.298039 0.298039 0.298039 0.298039 0.301961 0.301961 0.301961 0.301961 0.305882 0.305882 0.305882 0.305882 0.309804 0.309804 0.309804 0.309804 0.313725 0.313725 0.313725 0.313725 0.317647 0.317647 0.317647 0.317647 0.321569 0.321569 0.321569 0.321569 0.325490 0.325490 0.325490 0.325490 0.329412 0.329412 0.329412 0.329412 0.333333 0.333333 0.333333 0.333333 0.337255 0.337255 0.337255 0.337255 0.341176 0.341176 0.341176 0.341176 0.345098 0.345098 0.345098 0.345098 0.349020 0.349020 0.349020 0.349020 0.352941 0.352941 0.352941 0.352941 0.356863 0.356863 0.356863 0.356863 0.360784 0.360784 0.360784 0.360784 0.364706 0.364706 0.364706 0.364706 0.368627 0.368627 0.368627 0.368627 0.372549 0.372549 0.372549 0.372549 0.376471 0.376471 0.376471 0.376471 0.380392 0.380392 0.380392 0.380392 0.384314 0.384314 0.384314 0.384314 0.388235 0.388235 0.388235 0.388235 0.392157 0.392157 0.392157 0.392157 0.396078 0.396078 0.396078 0.396078 0.400000 0.400000 0.400000 0.400000 0.403922 0.403922 0.403922 0.403922 0.407843 0.407843 0.407843 0.407843 0.411765 0.411765 0.411765 0.411765 0.415686 0.415686 0.415686 0.415686 0.419608 0.419608 0.419608 0.419608 0.423529 0.423529 0.423529 0.423529 0.427451 0.427451 0.427451 0.427451 0.431373 0.431373 0.431373 0.431373 0.435294 0.435294 0.435294 0.435294 0.439216 0.439216 0.439216 0.439216 0.443137 0.443137 0.443137 0.443137 0.447059 0.447059 0.447059 0.447059 0.450980 0.450980 0.450980 0.450980 0.454902 0.454902 0.454902 0.454902 0.458824 0.458824 0.458824 0.458824 0.462745 0.462745 0.462745 0.462745 0.466667 0.466667 0.466667 0.466667 0.470588 0.470588 0.470588 0.470588 0.474510 0.474510 0.474510 0.474510 0.478431 0.478431 0.478431 0.478431 0.482353 0.482353 0.482353 0.482353 0.486275 0.486275 0.486275 0.486275 0.490196 0.490196 0.490196 0.490196 0.494118 0.494118 0.494118 0.494118 0.498039 0.498039 0.498039 0.498039 0.501961 0.501961 0.501961 0.501961 0.505882 0.505882 0.505882 0.505882 0.509804 0.509804 0.509804 0.509804 0.513725 0.513725 0.513725 0.513725 0.517647 0.517647 0.517647 0.517647 0.521569 0.521569 0.521569 0.521569 0.525490 0.525490 0.525490 0.525490 0.529412 0.529412 0.529412 0.529412 0.533333 0.533333 0.533333 0.533333 0.537255 0.537255 0.537255 0.537255 0.541176 0.541176 0.541176 0.541176 0.545098 0.545098 0.545098 0.545098 0.549020 0.549020 0.549020 0.549020 0.552941 0.552941 0.552941 0.552941 0.556863 0.556863 0.556863 0.556863 0.560784 0.560784 0.560784 0.560784 0.564706 0.564706 0.564706 0.564706 0.568627 0.568627 0.568627 0.568627 0.572549 0.572549 0.572549 0.572549 0.576471 0.576471 0.576471 0.576471 0.580392 0.580392 0.580392 0.580392 0.584314 0.584314 0.584314 0.584314 0.588235 0.588235 0.588235 0.588235 0.592157 0.592157 0.592157 0.592157 0.596078 0.596078 0.596078 0.596078 0.600000 0.600000 0.600000 0.600000 0.603922 0.603922 0.603922 0.603922 0.607843 0.607843 0.607843 0.607843 0.611765 0.611765 0.611765 0.611765 0.615686 0.615686 0.615686 0.615686 0.619608 0.619608 0.619608 0.619608 0.623529 0.623529 0.623529 0.623529 0.627451 0.627451 0.627451 0.627451 0.631373 0.631373 0.631373 0.631373 0.635294 0.635294 0.635294 0.635294 0.639216 0.639216 0.639216 0.639216 0.643137 0.643137 0.643137 0.643137 0.647059 0.647059 0.647059 0.647059 0.650980 0.650980 0.650980 0.650980 0.654902 0.654902 0.654902 0.654902 0.658824 0.658824 0.658824 0.658824 0.662745 0.662745 0.662745 0.662745 0.666667 0.666667 0.666667 0.666667 0.670588 0.670588 0.670588 0.670588 0.674510 0.674510 0.674510 0.674510 0.678431 0.678431 0.678431 0.678431 0.682353 0.682353 0.682353 0.682353 0.686275 0.686275 0.686275 0.686275 0.690196 0.690196 0.690196 0.690196 0.694118 0.694118 0.694118 0.694118 0.698039 0.698039 0.698039 0.698039 0.701961 0.701961 0.701961 0.701961 0.705882 0.705882 0.705882 0.705882 0.709804 0.709804 0.709804 0.709804 0.713725 0.713725 0.713725 0.713725 0.717647 0.717647 0.717647 0.717647 0.721569 0.721569 0.721569 0.721569 0.725490 0.725490 0.725490 0.725490 0.729412 0.729412 0.729412 0.729412 0.733333 0.733333 0.733333 0.733333 0.737255 0.737255 0.737255 0.737255 0.741176 0.741176 0.741176 0.741176 0.745098 0.745098 0.745098 0.745098 0.749020 0.749020 0.749020 0.749020 0.752941 0.752941 0.752941 0.752941 0.756863 0.756863 0.756863 0.756863 0.760784 0.760784 0.760784 0.760784 0.764706 0.764706 0.764706 0.764706 0.768627 0.768627 0.768627 0.768627 0.772549 0.772549 0.772549 0.772549 0.776471 0.776471 0.776471 0.776471 0.780392 0.780392 0.780392 0.780392 0.784314 0.784314 0.784314 0.784314 0.788235 0.788235 0.788235 0.788235 0.792157 0.792157 0.792157 0.792157 0.796078 0.796078 0.796078 0.796078 0.800000 0.800000 0.800000 0.800000 0.803922 0.803922 0.803922 0.803922 0.807843 0.807843 0.807843 0.807843 0.811765 0.811765 0.811765 0.811765 0.815686 0.815686 0.815686 0.815686 0.819608 0.819608 0.819608 0.819608 0.823529 0.823529 0.823529 0.823529 0.827451 0.827451 0.827451 0.827451 0.831373 0.831373 0.831373 0.831373 0.835294 0.835294 0.835294 0.835294 0.839216 0.839216 0.839216 0.839216 0.843137 0.843137 0.843137 0.843137 0.847059 0.847059 0.847059 0.847059 0.850980 0.850980 0.850980 0.850980 0.854902 0.854902 0.854902 0.854902 0.858824 0.858824 0.858824 0.858824 0.862745 0.862745 0.862745 0.862745 0.866667 0.866667 0.866667 0.866667 0.870588 0.870588 0.870588 0.870588 0.874510 0.874510 0.874510 0.874510 0.878431 0.878431 0.878431 0.878431 0.882353 0.882353 0.882353 0.882353 0.886275 0.886275 0.886275 0.886275 0.890196 0.890196 0.890196 0.890196 0.894118 0.894118 0.894118 0.894118 0.898039 0.898039 0.898039 0.898039 0.901961 0.901961 0.901961 0.901961 0.905882 0.905882 0.905882 0.905882 0.909804 0.909804 0.909804 0.909804 0.913725 0.913725 0.913725 0.913725 0.917647 0.917647 0.917647 0.917647 0.921569 0.921569 0.921569 0.921569 0.925490 0.925490 0.925490 0.925490 0.929412 0.929412 0.929412 0.929412 0.933333 0.933333 0.933333 0.933333 0.937255 0.937255 0.937255 0.937255 0.941176 0.941176 0.941176 0.941176 0.945098 0.945098 0.945098 0.945098 0.949020 0.949020 0.949020 0.949020 0.952941 0.952941 0.952941 0.952941 0.956863 0.956863 0.956863 0.956863 0.960784 0.960784 0.960784 0.960784 0.964706 0.964706 0.964706 0.964706 0.968627 0.968627 0.968627 0.968627 0.972549 0.972549 0.972549 0.972549 0.976471 0.976471 0.976471 0.976471 0.980392 0.980392 0.980392 0.980392 0.984314 0.984314 0.984314 0.984314 0.988235 0.988235 0.988235 0.988235 0.992157 0.992157 0.992157 0.992157 0.996078 0.996078 0.996078 0.996078 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/localization.py0000644000076500000000000001115713242301247020470 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import __builtin__ import locale import os import re import sys import demjson from config import data_dirs, defaults, getcfg, storage from debughelpers import handle_error from jsondict import JSONDict from log import safe_print from options import debug_localization as debug from util_os import expanduseru from util_str import safe_unicode def init(set_wx_locale=False): """ Populate translation dict with found language strings and set locale. If set_wx_locale is True, set locale also for wxPython. """ langdirs = [] for dir_ in data_dirs: langdirs.append(os.path.join(dir_, "lang")) for langdir in langdirs: if os.path.exists(langdir) and os.path.isdir(langdir): try: langfiles = os.listdir(langdir) except Exception, exception: safe_print(u"Warning - directory '%s' listing failed: %s" % tuple(safe_unicode(s) for s in (langdir, exception))) else: for filename in langfiles: name, ext = os.path.splitext(filename) if ext.lower() == ".json" and name.lower() not in ldict: path = os.path.join(langdir, filename) ldict[name.lower()] = JSONDict(path) if len(ldict) == 0: handle_error(UserWarning("Warning: No language files found. The " "following places have been searched:\n%s" % "\n".join(langdirs))) def update_defaults(): defaults.update({ "last_3dlut_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_archive_save_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_cal_path": os.path.join(storage, getstr("unnamed")), "last_cal_or_icc_path": os.path.join(storage, getstr("unnamed")), "last_colorimeter_ti3_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_testchart_export_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_filedialog_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_icc_path": os.path.join(storage, getstr("unnamed")), "last_reference_ti3_path": os.path.join(expanduseru("~"), getstr("unnamed")), "last_ti1_path": os.path.join(storage, getstr("unnamed")), "last_ti3_path": os.path.join(storage, getstr("unnamed")), "last_vrml_path": os.path.join(storage, getstr("unnamed")) }) def getcode(): """ Get language code from config """ lcode = getcfg("lang") if not lcode in ldict: # fall back to default lcode = defaults["lang"] if not lcode in ldict: # fall back to english lcode = "en" return lcode def getstr(id_str, strvars=None, lcode=None): """ Get a translated string from the dictionary """ if not lcode: lcode = getcode() if not lcode in ldict or not id_str in ldict[lcode]: # fall back to english lcode = "en" if lcode in ldict and id_str in ldict[lcode]: lstr = ldict[lcode][id_str] if debug: if not id_str in usage or not isinstance(usage[id_str], int): usage[id_str] = 1 else: usage[id_str] += 1 if strvars is not None: if not isinstance(strvars, (list, tuple)): strvars = [strvars] fmt = re.findall(r"%\d?(?:\.\d+)?[deEfFgGiorsxX]", lstr) if len(fmt) == len(strvars): if not isinstance(strvars, list): strvars = list(strvars) for i, s in enumerate(strvars): if fmt[i].endswith("s"): s = safe_unicode(s) elif not fmt[i].endswith("r"): try: if fmt[i][-1] in "dioxX": s = int(s) else: s = float(s) except ValueError: s = 0 strvars[i] = s lstr %= tuple(strvars) return lstr else: if (debug and id_str and not isinstance(id_str, unicode) and not " " in id_str): usage[id_str] = 0 return id_str def gettext(text): if not catalog and defaults["lang"] in ldict: for id_str in ldict[defaults["lang"]]: lstr = ldict[defaults["lang"]][id_str] catalog[lstr] = {} catalog[lstr].id_str = id_str lcode = getcode() if catalog and text in catalog and not lcode in catalog[text]: catalog[text][lcode] = ldict[lcode].get(catalog[text].id_str, text) return catalog.get(text, {}).get(lcode, text) ldict = {} catalog = {} if debug: import atexit from config import confighome usage = JSONDict() usage_path = os.path.join(confighome, "localization_usage.json") if os.path.isfile(usage_path): usage.path = usage_path def write_usage(): global usage if not usage: return if os.path.isfile(usage_path): temp = JSONDict(usage_path) temp.load() temp.update(usage) usage = temp with open(usage_path, "wb") as usagefile: usagefile.write("{\n") for key, count in sorted(usage.items()): usagefile.write('\t"%s": %i,\n' % (key.encode("UTF-8"), count)) usagefile.write("}") atexit.register(write_usage) DisplayCAL-3.5.0.0/DisplayCAL/log.py0000644000076500000000000002672213242301247016565 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement from codecs import EncodedFile from hashlib import md5 import atexit import glob import logging import logging.handlers import os import re import sys import warnings from time import localtime, strftime, time from meta import name as appname, script2pywname from multiprocess import mp from options import debug from safe_print import SafePrinter, safe_print as _safe_print from util_io import StringIOu as StringIO from util_str import safe_str, safe_unicode logging.raiseExceptions = 0 logging._warnings_showwarning = warnings.showwarning if debug: loglevel = logging.DEBUG else: loglevel = logging.INFO logger = None def showwarning(message, category, filename, lineno, file=None, line=""): """ Implementation of showwarnings which redirects to logging, which will first check to see if the file parameter is None. If a file is specified, it will delegate to the original warnings implementation of showwarning. Otherwise, it will call warnings.formatwarning and will log the resulting string to a warnings logger named "py.warnings" with level logging.WARNING. UNlike the default implementation, the line is omitted from the warning, and the warning does not end with a newline. """ if file is not None: if logging._warnings_showwarning is not None: logging._warnings_showwarning(message, category, filename, lineno, file, line) else: s = warnings.formatwarning(message, category, filename, lineno, line) logger = logging.getLogger("py.warnings") if not logger.handlers: if hasattr(sys.stderr, "isatty") and sys.stderr.isatty(): handler = logging.StreamHandler() else: handler = logging.NullHandler() logger.addHandler(handler) logger.warning("%s", s.strip()) warnings.showwarning = showwarning logbuffer = EncodedFile(StringIO(), "UTF-8", errors="replace") def wx_log(logwindow, msg): if logwindow.IsShownOnScreen(): # Check if log buffer has been emptied or not. # If it has, our log message is already included. if logbuffer.tell(): logwindow.Log(msg) class DummyLogger(): def critical(self, msg, *args, **kwargs): pass def debug(self, msg, *args, **kwargs): pass def error(self, msg, *args, **kwargs): pass def exception(self, msg, *args, **kwargs): pass def info(self, msg, *args, **kwargs): pass def log(self, level, msg, *args, **kwargs): pass def warning(self, msg, *args, **kwargs): pass class Log(): def __call__(self, msg, fn=None): """ Log a message. Optionally use function 'fn' instead of logging.info. """ global logger msg = msg.replace("\r\n", "\n").replace("\r", "") if fn is None and logger and logger.handlers: fn = logger.info if fn: for line in msg.split("\n"): fn(line) if "wx" in sys.modules and mp.current_process().name == "MainProcess": from wxaddons import wx if wx.GetApp() is not None and \ hasattr(wx.GetApp(), "frame") and \ hasattr(wx.GetApp().frame, "infoframe"): wx.CallAfter(wx_log, wx.GetApp().frame.infoframe, msg) def flush(self): pass def write(self, msg): self(msg.rstrip()) log = Log() class LogFile(): """ Logfile class. Default is to not rotate. """ def __init__(self, filename, logdir, when="never", backupCount=0): self.filename = filename self._logger = get_file_logger(md5(safe_str(filename, "UTF-8")).hexdigest(), when=when, backupCount=backupCount, logdir=logdir, filename=filename) def close(self): for handler in reversed(self._logger.handlers): handler.close() self._logger.removeHandler(handler) def flush(self): for handler in self._logger.handlers: handler.flush() def write(self, msg): for line in msg.rstrip().replace("\r\n", "\n").replace("\r", "").split("\n"): self._logger.info(line) class SafeLogger(SafePrinter): """ Print and log safely, avoiding any UnicodeDe-/EncodingErrors on strings and converting all other objects to safe string representations. """ def __init__(self, log=True, print_=hasattr(sys.stdout, "isatty") and sys.stdout.isatty()): SafePrinter.__init__(self) self.log = log self.print_ = print_ def write(self, *args, **kwargs): if kwargs.get("print_", self.print_): _safe_print(*args, **kwargs) if kwargs.get("log", self.log): kwargs.update(fn=log, encoding=None) _safe_print(*args, **kwargs) safe_log = SafeLogger(print_=False) safe_print = SafeLogger() def get_file_logger(name, level=loglevel, when="midnight", backupCount=5, logdir=None, filename=None, confighome=None): """ Return logger object. A TimedRotatingFileHandler or FileHandler (if when == "never") will be used. """ global _logdir if logdir is None: logdir = _logdir logger = logging.getLogger(name) if not filename: filename = name mode = "a" if confighome: # Use different logfile name (append number) for each additional # instance is_main_process = mp.current_process().name == "MainProcess" if os.path.basename(confighome).lower() == "dispcalgui": lockbasename = filename.replace(appname, "dispcalGUI") else: lockbasename = filename lockfilepath = os.path.join(confighome, lockbasename + ".lock") if os.path.isfile(lockfilepath): try: with open(lockfilepath, "r") as lockfile: instances = len(filter(lambda s: s.strip(), lockfile.readlines())) except: pass else: if not is_main_process: # Running as child from multiprocessing under Windows instances -= 1 if instances: filenames = [filename] filename += ".%i" % instances filenames.append(filename) if filenames[0].endswith("-apply-profiles"): # Running the profile loader always sends a close # request to an already running instance, so there # will be at most two logfiles, and we want to use # the one not currently in use. mtimes = {} for filename in filenames: logfile = os.path.join(logdir, filename + ".log") if not os.path.isfile(logfile): continue try: logstat = os.stat(logfile) except Exception, exception: safe_print(u"Warning - os.stat('%s') failed: %s" % tuple(safe_unicode(s) for s in (logfile, exception))) else: mtimes[logstat.st_mtime] = filename if mtimes: filename = mtimes[sorted(mtimes.keys())[0]] if is_main_process: for lockfilepath in glob.glob(os.path.join(confighome, lockbasename + ".mp-worker-*.lock")): try: os.remove(lockfilepath) except: pass else: # Running as child from multiprocessing under Windows lockbasename += ".mp-worker-" process_num = 1 while os.path.isfile(os.path.join(confighome, lockbasename + "%i.lock" % process_num)): process_num += 1 lockfilepath = os.path.join(confighome, lockbasename + "%i.lock" % process_num) try: with open(lockfilepath, "w") as lockfile: pass except: pass else: atexit.register(os.remove, lockfilepath) when = "never" filename += ".mp-worker-%i" % process_num mode = "w" logfile = os.path.join(logdir, filename + ".log") for handler in logger.handlers: if (isinstance(handler, logging.FileHandler) and handler.baseFilename == os.path.abspath(logfile)): return logger logger.propagate = 0 logger.setLevel(level) if not os.path.exists(logdir): try: os.makedirs(logdir) except Exception, exception: safe_print(u"Warning - log directory '%s' could not be created: %s" % tuple(safe_unicode(s) for s in (logdir, exception))) elif when != "never" and os.path.exists(logfile): try: logstat = os.stat(logfile) except Exception, exception: safe_print(u"Warning - os.stat('%s') failed: %s" % tuple(safe_unicode(s) for s in (logfile, exception))) else: # rollover needed? t = logstat.st_mtime try: mtime = localtime(t) except ValueError, exception: # This can happen on Windows because localtime() is buggy on # that platform. See: # http://stackoverflow.com/questions/4434629/zipfile-module-in-python-runtime-problems # http://bugs.python.org/issue1760357 # To overcome this problem, we ignore the real modification # date and force a rollover t = time() - 60 * 60 * 24 mtime = localtime(t) # Deal with DST now = localtime() dstNow = now[-1] dstThen = mtime[-1] if dstNow != dstThen: if dstNow: addend = 3600 else: addend = -3600 mtime = localtime(t + addend) if now[:3] > mtime[:3]: # do rollover logbackup = logfile + strftime(".%Y-%m-%d", mtime) if os.path.exists(logbackup): try: os.remove(logbackup) except Exception, exception: safe_print(u"Warning - logfile backup '%s' could not " u"be removed during rollover: %s" % tuple(safe_unicode(s) for s in (logbackup, exception))) try: os.rename(logfile, logbackup) except Exception, exception: safe_print(u"Warning - logfile '%s' could not be renamed " u"to '%s' during rollover: %s" % tuple(safe_unicode(s) for s in (logfile, os.path.basename(logbackup), exception))) # Adapted from Python 2.6's # logging.handlers.TimedRotatingFileHandler.getFilesToDelete extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}$") baseName = os.path.basename(logfile) try: fileNames = os.listdir(logdir) except Exception, exception: safe_print(u"Warning - log directory '%s' listing failed " u"during rollover: %s" % tuple(safe_unicode(s) for s in (logdir, exception))) else: result = [] prefix = baseName + "." plen = len(prefix) for fileName in fileNames: if fileName[:plen] == prefix: suffix = fileName[plen:] if extMatch.match(suffix): result.append(os.path.join(logdir, fileName)) result.sort() if len(result) > backupCount: for logbackup in result[:len(result) - backupCount]: try: os.remove(logbackup) except Exception, exception: safe_print(u"Warning - logfile backup '%s' " u"could not be removed during " u"rollover: %s" % tuple(safe_unicode(s) for s in (logbackup, exception))) if os.path.exists(logdir): try: if when != "never": filehandler = logging.handlers.TimedRotatingFileHandler(logfile, when=when, backupCount=backupCount) else: filehandler = logging.FileHandler(logfile, mode) fileformatter = logging.Formatter("%(asctime)s %(message)s") filehandler.setFormatter(fileformatter) logger.addHandler(filehandler) except Exception, exception: safe_print(u"Warning - logging to file '%s' not possible: %s" % tuple(safe_unicode(s) for s in (logfile, exception))) return logger def setup_logging(logdir, name=appname, ext=".py", backupCount=5, confighome=None): """ Setup the logging facility. """ global _logdir, logger _logdir = logdir name = script2pywname(name) if (name.startswith(appname) or name.startswith("dispcalGUI") or ext in (".app", ".exe", ".pyw")): logger = get_file_logger(None, loglevel, "midnight", backupCount, filename=name, confighome=confighome) if name == appname or name == "dispcalGUI": streamhandler = logging.StreamHandler(logbuffer) streamformatter = logging.Formatter("%(asctime)s %(message)s") streamhandler.setFormatter(streamformatter) logger.addHandler(streamhandler) DisplayCAL-3.5.0.0/DisplayCAL/madvr.py0000644000076500000000000012256413242301247017116 0ustar devwheel00000000000000# -*- coding: utf-8 -*- # See developers/interfaces/madTPG.h in the madVR package from __future__ import with_statement from ConfigParser import RawConfigParser from StringIO import StringIO from binascii import unhexlify from time import sleep, time from zlib import crc32 import ctypes import errno import getpass import os import platform import socket import struct import sys import threading if sys.platform == "win32": import _winreg if sys.platform == "win32": import win32api import localization as lang from log import safe_print as log_safe_print from meta import name as appname, version from network import get_network_addr, get_valid_host from ordereddict import OrderedDict from util_str import safe_str, safe_unicode CALLBACK = ctypes.CFUNCTYPE(None, ctypes.c_void_p, ctypes.POINTER(None), ctypes.c_char_p, ctypes.c_ulong, ctypes.c_ulonglong, ctypes.c_char_p, ctypes.c_ulonglong, ctypes.c_bool) min_version = (0, 88, 14, 0) # Search for madTPG on the local PC, connect to the first found instance CM_ConnectToLocalInstance = 0 # Search for madTPG on the LAN, connect to the first found instance CM_ConnectToLanInstance = 1 # Start madTPG on the local PC and connect to it CM_StartLocalInstance = 2 # Search local PC and LAN, and let the user choose which instance to connect to CM_ShowListDialog = 3 # Let the user enter the IP address of a PC which runs madTPG, then connect CM_ShowIpAddrDialog = 4 # fail immediately CM_Fail = 5 _methodnames = ("ConnectEx", "Disable3dlut", "Enable3dlut", "EnterFullscreen", "GetBlackAndWhiteLevel", "GetDeviceGammaRamp", "GetSelected3dlut", "GetVersion", "IsDisableOsdButtonPressed", "IsFullscreen", "IsStayOnTopButtonPressed", "IsUseFullscreenButtonPressed", "LeaveFullscreen", "SetDisableOsdButton", "SetDeviceGammaRamp", "SetOsdText", "GetPatternConfig", "SetPatternConfig", "ShowProgressBar", "SetProgressBarPos", "SetSelected3dlut", "SetStayOnTopButton", "SetUseFullscreenButton", "ShowRGB", "ShowRGBEx", "Load3dlutFile", "LoadHdr3dlutFile", "Disconnect", "Quit", "Load3dlutFromArray256", "LoadHdr3dlutFromArray256") _autonet_methodnames = ("AddConnectionCallback", "Listen", "Announce") _lock = threading.RLock() def safe_print(*args): with _lock: log_safe_print(*args) def inet_pton(ip_string): """ inet_pton(string) -> packed IP representation Convert an IP address in string format to the packed binary format used in low-level network functions. """ if ":" in ip_string: # IPv6 return "".join([unhexlify(block.rjust(4, "0")) for block in ip_string.split(":")]) else: # IPv4 return "".join([chr(int(block)) for block in ip_string.split(".")]) def trunc(value, length): """ For string types, return value truncated to length """ if isinstance(value, basestring): value = safe_str(value) if len(repr(value)) > length: value = value[:length - 3 - len(str(length)) - len(repr(value)) + len(value)] return "%r[:%i]" % (value, length) return repr(value) class H3DLUT(object): """ 3D LUT file format used by madVR """ # https://sourceforge.net/projects/thr3dlut def __init__(self, filename): self.fileName = filename with open(filename, "rb") as lut: data = lut.read() self.signature = data[:4] self.fileVersion = struct.unpack("B", c)[0] for c in struct.pack(">I", version.value)) return result and version def show_rgb(self, r, g, b, bgr=None, bgg=None, bgb=None): """ Shows a specific RGB color test pattern """ if not None in (bgr, bgg, bgb): return self.mad.madVR_ShowRGBEx(r, g, b, bgr, bgg, bgb) else: return self.mad.madVR_ShowRGB(r, g, b) @property def uri(self): return self.dllpath class MadTPG_Net(MadTPGBase): """ Implementation of madVR network protocol in pure python """ # Wireshark filter to help ananlyze traffic: # (tcp.dstport != 1900 and tcp.dstport != 443) or (udp.dstport != 1900 and udp.dstport != 137 and udp.dstport != 138 and udp.dstport != 5355 and udp.dstport != 547 and udp.dstport != 10111) def __init__(self): MadTPGBase.__init__(self) self._cast_sockets = {} self._casts = [] self._client_sockets = OrderedDict() self._commandno = 0 self._commands = {} self._host = get_network_addr() try: hostname = get_valid_host()[0] except socket.error: hostname = self._host self._incoming = {} self._ips = [i[4][0] for i in socket.getaddrinfo(hostname, None)] self._pid = 0 self._reset() self._server_sockets = {} self._threads = [] #self.broadcast_ports = (39568, 41513, 45817, 48591, 48912) self.broadcast_ports = (37018, 10658, 63922, 53181, 4287) self.clients = OrderedDict() self.debug = 0 self.listening = True #self.multicast_ports = (34761, ) self.multicast_ports = (51591, ) self._event_handlers = {"on_client_added": [], "on_client_confirmed": [], "on_client_removed": [], "on_client_updated": []} #self.server_ports = (37612, 43219, 47815, 48291, 48717) self.server_ports = (60562, 51130, 54184, 41916, 19902) ip = self._host.split(".") ip.pop() ip.append("255") self.broadcast_ip = ".".join(ip) self.multicast_ip = "235.117.220.191" def listen(self): self.listening = True # Connection listen sockets for port in self.server_ports: if ("", port) in self._server_sockets: continue sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.settimeout(0) try: sock.bind(("", port)) sock.listen(1) thread = threading.Thread(target=self._conn_accept_handler, args=(sock, "", port)) self._threads.append(thread) thread.start() except socket.error, exception: safe_print("MadTPG_Net: TCP Port %i: %s" % (port, exception)) # Broadcast listen sockets for port in self.broadcast_ports: if (self.broadcast_ip, port) in self._cast_sockets: continue sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) sock.settimeout(0) try: sock.bind(("", port)) thread = threading.Thread(target=self._cast_receive_handler, args=(sock, self.broadcast_ip, port)) self._threads.append(thread) thread.start() except socket.error, exception: safe_print("MadTPG_Net: UDP Port %i: %s" % (port, exception)) # Multicast listen socket for port in self.multicast_ports: if (self.multicast_ip, port) in self._cast_sockets: continue sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, struct.pack("4sl", socket.inet_aton(self.multicast_ip), socket.INADDR_ANY)) sock.settimeout(0) try: sock.bind(("", port)) thread = threading.Thread(target=self._cast_receive_handler, args=(sock, self.multicast_ip, port)) self._threads.append(thread) thread.start() except socket.error, exception: safe_print("MadTPG_Net: UDP Port %i: %s" % (port, exception)) def bind(self, event_name, handler): """ Bind a handler to an event """ if not event_name in self._event_handlers: self._event_handlers[event_name] = [] self._event_handlers[event_name].append(handler) def unbind(self, event_name, handler=None): """ Unbind (remove) a handler from an event If handler is None, remove all handlers for the event. """ if event_name in self._event_handlers: if handler in self._event_handlers[event_name]: self._event_handlers[event_name].remove(handler) return handler else: return self._event_handlers.pop(event_name) def _dispatch_event(self, event_name, event_data=None): """ Dispatch events """ if self.debug: safe_print("MadTPG_Net: Dispatching", event_name) for handler in self._event_handlers.get(event_name, []): handler(event_data) def _reset(self): self._client_socket = None def _conn_accept_handler(self, sock, host, port): if self.debug: safe_print("MadTPG_Net: Entering incoming connection thread for port", port) self._server_sockets[(host, port)] = sock while getattr(self, "listening", False): try: # Wait for connection conn, addr = sock.accept() except socket.timeout, exception: # Should never happen for non-blocking socket safe_print("MadTPG_Net: In incoming connection thread for port %i:" % port, exception) continue except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.05) continue safe_print("MadTPG_Net: Exception in incoming connection " "thread for %s:%i:" % addr[:2], exception) break conn.settimeout(0) with _lock: if self.debug: safe_print("MadTPG_Net: Incoming connection from %s:%s to %s:%s" % (addr[:2] + conn.getsockname()[:2])) if addr in self._client_sockets: if self.debug: safe_print("MadTPG_Net: Already connected from %s:%s to %s:%s" % (addr[:2] + conn.getsockname()[:2])) self._shutdown(conn, addr) else: self._client_sockets[addr] = conn thread = threading.Thread(target=self._receive_handler, args=(addr, conn, )) self._threads.append(thread) thread.start() self._server_sockets.pop((host, port)) self._shutdown(sock, (host, port)) if self.debug: safe_print("MadTPG_Net: Exiting incoming connection thread for port", port) def _receive_handler(self, addr, conn): if self.debug: safe_print("MadTPG_Net: Entering receiver thread for %s:%s" % addr[:2]) self._incoming[addr] = [] hello = self._hello(conn) blob = "" send_bye = True while (hello and addr in self._client_sockets and getattr(self, "listening", False)): # Wait for incoming message try: incoming = conn.recv(4096) except socket.timeout, exception: # Should never happen for non-blocking socket safe_print("MadTPG_Net: In receiver thread for %s:%i:" % addr[:2], exception) continue except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.001) continue if exception.errno not in (errno.EBADF, errno.ECONNRESET) or self.debug: safe_print("MadTPG_Net: In receiver thread for %s:%i:" % addr[:2], exception) send_bye = False break else: with _lock: if not incoming: # Connection broken if self.debug: safe_print("MadTPG_Net: Client %s:%i stopped sending" % addr[:2]) break blob += incoming if self.debug: safe_print("MadTPG_Net: Received from %s:%s:" % addr[:2]) while blob and addr in self._client_sockets: try: record, blob = self._parse(blob) except ValueError, exception: safe_print("MadTPG_Net:", exception) # Invalid, discard blob = "" else: if record is None: # Need more data break self._process(record, conn) with _lock: self._remove_client(addr, send_bye=addr in self._client_sockets and send_bye) self._incoming.pop(addr) if self.debug: safe_print("MadTPG_Net: Exiting receiver thread for %s:%s" % addr[:2]) def _remove_client(self, addr, send_bye=True): """ Remove client from list of connected clients """ if addr in self._client_sockets: conn = self._client_sockets.pop(addr) if send_bye: self._send(conn, "bye", component=self.clients.get(addr, {}).get("component", "")) if addr in self.clients: client = self.clients.pop(addr) if self.debug: safe_print("MadTPG_Net: Removed client %s:%i" % addr[:2]) self._dispatch_event("on_client_removed", (addr, client)) if (self._client_socket and self._client_socket == conn): self._reset() self._shutdown(conn, addr) def _cast_receive_handler(self, sock, host, port): if host == self.broadcast_ip: cast = "broadcast" elif host == self.multicast_ip: cast = "multicast" else: cast = "unknown" if self.debug: safe_print("MadTPG_Net: Entering receiver thread for %s port %i" % (cast, port)) self._cast_sockets[(host, port)] = sock while getattr(self, "listening", False): try: data, addr = sock.recvfrom(4096) except socket.timeout, exception: safe_print("MadTPG_Net: In receiver thread for %s port %i:" % (cast, port), exception) continue except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.05) continue if exception.errno != errno.ECONNRESET or self.debug: safe_print("MadTPG_Net: In receiver thread for %s port %i:" % (cast, port), exception) break else: with _lock: if self.debug: safe_print("MadTPG_Net: Received %s from %s:%s: %r" % (cast, addr[0], addr[1], data)) if not addr in self._casts: for c_port in self.server_ports: if (addr[0], c_port) in self._client_sockets: if self.debug: safe_print("MadTPG_Net: Already connected to %s:%s" % (addr[0], c_port)) elif (("", c_port) in self._server_sockets and addr[0] in self._ips): if self.debug: safe_print("MadTPG_Net: Don't connect to self %s:%s" % (addr[0], c_port)) else: conn = self._get_client_socket(addr[0], c_port) threading.Thread(target=self._connect, args=(conn, addr[0], c_port)).start() else: self._casts.remove(addr) if self.debug: safe_print("MadTPG_Net: Ignoring own %s from %s:%s" % (cast, addr[0], addr[1])) self._cast_sockets.pop((host, port)) self._shutdown(sock, (host, port)) if self.debug: safe_print("MadTPG_Net: Exiting %s receiver thread for port %i" % (cast, port)) def __del__(self): self.shutdown() def _shutdown(self, sock, addr): try: # Will fail if the socket isn't connected, i.e. if there # was an error during the call to connect() sock.shutdown(socket.SHUT_RDWR) except socket.error, exception: if exception.errno != errno.ENOTCONN: safe_print("MadTPG_Net: SHUT_RDWR for %s:%i failed:" % addr[:2], exception) sock.close() def shutdown(self): self.disconnect() self.listening = False while self._threads: thread = self._threads.pop() if thread.isAlive(): thread.join() def __getattr__(self, name): # Instead of writing individual method wrappers, we use Python's magic # to handle this for us. Note that we're sticking to pythonic method # names, so 'disable_3dlut' instead of 'Disable3dlut' etc. # Convert from pythonic method name to CamelCase methodname = "".join(part.capitalize() for part in name.split("_")) if methodname == "ShowRgb": methodname = "ShowRGB" # Check if this is a madVR method we support if methodname not in _methodnames: raise AttributeError("%r object has no attribute %r" % (self.__class__.__name__, name)) # Call the method and return the result return MadTPG_Net_Sender(self, self._client_socket, methodname) def announce(self): """ Anounce ourselves """ for port in self.multicast_ports: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 0) sock.settimeout(1) sock.connect((self.multicast_ip, port)) addr = sock.getsockname() self._casts.append(addr) if self.debug: safe_print("MadTPG_Net: Sending multicast from %s:%s to port %i" % (addr[0], addr[1], port)) sock.sendall(struct.pack(" inet_pton(remote[0]) or (inet_pton(local[0]) == inet_pton(remote[0]) and self.clients[remote]["processId"] < os.getpid())) def _expect(self, conn, commandno=-1, command=None, params=(), component="", timeout=3): """ Wait until expected reply or timeout. Return reply params or False. """ if not isinstance(params, (list, tuple)): params = (params, ) addr = conn.getpeername() start = end = time() while end - start < timeout: for reply in self._incoming.get(addr, []): r_commandno, r_command, r_params, r_component = reply if (commandno in (r_commandno, -1) and command in (r_command, None) and not params or (r_params in params) and component in (r_component, None)): self._incoming[addr].remove(reply) return r_params sleep(0.001) end = time() if self.debug: safe_print("MadTPG_Net: Timeout exceeded while waiting for reply") return False def _wait_for_client(self, addr=None, timeout=1): """ Wait for (first) madTPG client connection and handshake """ start = end = time() while end - start < timeout: clients = self.clients.copy() if clients: if addr: c_addrs = [addr] else: c_addrs = clients.keys() for c_addr in c_addrs: client = clients.get(c_addr) conn = self._client_sockets.get(c_addr) if (client and client["component"] == "madTPG" and client.get("confirmed") and conn and self._send(conn, "StartTestPattern")): self._client_socket = conn return True sleep(0.001) end = time() return False def _parse(self, blob=""): """ Consume blob, return record + remaining blob """ if len(blob) < 12: return None, blob crc = struct.unpack(" len(blob): raise ValueError("Corrupt madVR packet: Expected component " "len %i, got %i" % (b - a, len(blob[a:b]))) record["component"] = blob[a:b] a = b + 8 if a > len(blob): raise ValueError("Corrupt madVR packet: Expected instance " "len %i, got %i" % (a - b, len(blob[b:a]))) record["instance"] = struct.unpack(" len(blob): raise ValueError("Corrupt madVR packet: Expected sizeOfCommand " "len %i, got %i" % (b - a, len(blob[a:b]))) record["sizeOfCommand"] = struct.unpack(" len(blob): raise ValueError("Corrupt madVR packet: Expected command " "len %i, got %i" % (a - b, len(blob[b:a]))) record["command"] = command = blob[b:a] b = a + 4 if b > len(blob): raise ValueError("Corrupt madVR packet: Expected sizeOfParams " "len %i, got %i" % (b - a, len(blob[a:b]))) record["sizeOfParams"] = struct.unpack(" record["len"] + 12: raise ValueError("Corrupt madVR packet: Expected params " "len %i, got %i" % (a - b, len(blob[b:a]))) params = blob[b:a] if self.debug > 1: record["rawParams"] = params if command == "hello": io = StringIO("[Default]\n" + "\n".join(params.decode("UTF-16-LE", "replace").strip().split("\t"))) cfg = RawConfigParser() cfg.optionxform = str cfg.readfp(io) params = OrderedDict(cfg.items("Default")) # Convert version strings to tuples with integers for param in ("mvr", "exe"): param += "Version" if param in params: values = params[param].split(".") for i, value in enumerate(values): try: values[i] = int(value) except ValueError: pass params[param] = tuple(values) elif command == "reply": commandno = record["commandNo"] repliedcomamnd = self._commands.get(commandno) if repliedcomamnd: self._commands.pop(commandno) if repliedcomamnd == "GetBlackAndWhiteLevel": if len(params) == 8: params = struct.unpack(" 2: if isinstance(value, dict): safe_print(" %s:" % key) for subkey, subvalue in value.iteritems(): if self.debug < 2 and subkey != "exeFile": continue safe_print(" %s = %s" % (subkey.ljust(16), trunc(subvalue, 56))) elif self.debug > 1: safe_print(" %s = %s" % (key.ljust(16), trunc(value, 58))) blob = blob[a:] return record, blob def _assemble(self, conn, commandno=1, command="", params="", component="madTPG"): """ Assemble packet """ magic = "mad." data = struct.pack(" 1: with _lock: safe_print("MadTPG_Net: Assembled madVR packet:") self._parse(packet) return packet def _send(self, conn, command="", params="", component="madTPG"): """ Send madTPG command and return reply """ if not conn: return False self._commandno += 1 commandno = self._commandno try: packet = self._assemble(conn, commandno, command, params, component) if self.debug: safe_print("MadTPG_Net: Sending command %i %r to %s:%s" % ((commandno, command) + conn.getpeername()[:2])) while packet: try: bytes_sent = conn.send(packet) except socket.error, exception: if exception.errno == errno.EAGAIN: # Mac OS X: Resource temporarily unavailable sleep(0.001) if bytes_sent == -1: continue else: raise if bytes_sent == 0: raise socket.error(errno.ENOLINK, "Link has been severed") packet = packet[bytes_sent:] except socket.error, exception: safe_print("MadTPG_Net: Sending command %i %r failed" % (commandno, command), exception) return False if command not in ("confirm", "hello", "reply", "bye") and not command.startswith("store:"): self._commands[commandno] = command # Get reply if self.debug: safe_print("MadTPG_Net: Expecting reply for command %i %r" % (commandno, command)) return self._expect(conn, commandno, "reply") return True @property def uri(self): return "%s:%s" % (self._client_socket and self._client_socket.getpeername()[:2] or ("0.0.0.0", 0)) class MadTPG_Net_Sender(object): def __init__(self, madtpg, conn, command): self.madtpg = madtpg self._conn = conn if command == "Quit": command = "Exit" self.command = command def __call__(self, *args, **kwargs): if self.command in ("Load3dlutFile", "LoadHdr3dlutFile"): lut = H3DLUT(args[0]) lutdata = lut.LUTDATA self.command = self.command[:-4] # Strip 'File' from command name elif self.command in ("Load3dlutFromArray256", "LoadHdr3dlutFromArray256"): lutdata = args[0] self.command = self.command[:-12] # Strip 'File' from command name if self.command in ("Load3dlut", "LoadHdr3dlut"): params = struct.pack("= 3: r, g, b = args[:3] if len(args) > 3: bgr = args[3] if len(args) > 4: bgg = args[4] if len(args) > 5: bgb = args[5] rgb = r, g, b if not None in (bgr, bgg, bgb): self.command += "Ex" rgb += (bgr, bgg, bgb) if None in (r, g, b): raise TypeError("show_rgb() takes at least 4 arguments (%i given)" % len(filter(lambda v: v, rgb))) params = "|".join(str(v) for v in rgb) else: params = str(*args) return self.madtpg._send(self._conn, self.command, params) if __name__ == "__main__": import config config.initcfg() lang.init() if sys.platform == "win32": madtpg = MadTPG() else: madtpg = MadTPG_Net() if madtpg.connect(method3=CM_StartLocalInstance, timeout3=5000): madtpg.show_rgb(1, 0, 0) DisplayCAL-3.5.0.0/DisplayCAL/main.py0000644000076500000000000003253113221317445016727 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement from time import sleep import atexit import errno import logging import os import platform import socket import sys import subprocess as sp import threading import traceback if sys.platform == "darwin": from platform import mac_ver import posix # Python version check from meta import py_minversion, py_maxversion pyver = sys.version_info[:2] if pyver < py_minversion or pyver > py_maxversion: raise RuntimeError("Need Python version >= %s <= %s, got %s" % (".".join(str(n) for n in py_minversion), ".".join(str(n) for n in py_maxversion), sys.version.split()[0])) from config import (autostart_home, confighome, datahome, enc, exe, exe_ext, exedir, exename, get_data_path, getcfg, fs_enc, initcfg, isapp, isexe, logdir, pydir, pyname, pypath, resfiles, runtype, appbasename) from debughelpers import ResourceError, handle_error from log import log, safe_print from meta import VERSION, VERSION_BASE, VERSION_STRING, build, name as appname from multiprocess import mp from options import debug, verbose from util_str import safe_str, safe_unicode if sys.platform == "win32": from util_win import win_ver import ctypes def _excepthook(etype, value, tb): handle_error((etype, value, tb)) sys.excepthook = _excepthook def main(module=None): mp.freeze_support() if mp.current_process().name != "MainProcess": return if module: name = "%s-%s" % (appbasename, module) else: name = appbasename log("=" * 80) if verbose >= 1: version = VERSION_STRING if VERSION > VERSION_BASE: version += " Beta" safe_print(pyname + runtype, version, build) if sys.platform == "darwin": # Python's platform.platform output is useless under Mac OS X # (e.g. 'Darwin-15.0.0-x86_64-i386-64bit' for Mac OS X 10.11 El Capitan) safe_print("Mac OS X %s %s" % (mac_ver()[0], mac_ver()[-1])) elif sys.platform == "win32": machine = platform.machine() safe_print(*filter(lambda v: v, win_ver()) + ({"AMD64": "x86_64"}.get(machine, machine), )) else: # Linux safe_print(' '.join(platform.dist()), platform.machine()) safe_print("Python " + sys.version) cafile = os.getenv("SSL_CERT_FILE") if cafile: safe_print("CA file", cafile) # Enable faulthandler try: import faulthandler except Exception, exception: safe_print(exception) else: try: faulthandler.enable(open(os.path.join(logdir, pyname + "-fault.log"), "w")) except Exception, exception: safe_print(exception) else: safe_print("Faulthandler", getattr(faulthandler, "__version__", "")) from wxaddons import wx if u"phoenix" in wx.PlatformInfo: # py2exe helper so wx.xml gets picked up from wx import xml from wxwindows import BaseApp safe_print("wxPython " + wx.version()) safe_print("Encoding: " + enc) safe_print("File system encoding: " + fs_enc) if sys.platform == "win32" and sys.getwindowsversion() >= (6, 2): # HighDPI support try: shcore = ctypes.windll.shcore except Exception, exception: safe_print("Warning - could not load shcore:", exception) else: if hasattr(shcore, "SetProcessDpiAwareness"): try: # 1 = System DPI aware (wxWpython currently does not # support per-monitor DPI) shcore.SetProcessDpiAwareness(1) except Exception, exception: safe_print("Warning - SetProcessDpiAwareness() failed:", exception) else: safe_print("Warning - SetProcessDpiAwareness not found in shcore") lockfilename = None port = 0 # Allow multiple instances only for curve viewer, profile info, # scripting client, synthetic profile creator and testchart editor multi_instance = ("curve-viewer", "profile-info", "scripting-client", "synthprofile", "testchart-editor") try: initcfg() host = "127.0.0.1" if module not in multi_instance: # Check lockfile(s) and probe port(s) incoming = None lockfilebasenames = [] if module: lockfilebasenames.append(name) if module not in ("3DLUT-maker", "VRML-to-X3D-converter", "apply-profiles"): lockfilebasenames.append(appbasename) for lockfilebasename in lockfilebasenames: lockfilename = os.path.join(confighome, "%s.lock" % lockfilebasename) if os.path.isfile(lockfilename): try: with open(lockfilename) as lockfile: port = lockfile.read().strip() except EnvironmentError, exception: # This shouldn't happen safe_print("Warning - could not read lockfile %s:" % lockfilename, exception) port = getcfg("app.port") else: try: port = int(port) except ValueError: # This shouldn't happen safe_print("Warning - invalid port number:", port) port = getcfg("app.port") appsocket = AppSocket() if not appsocket: break else: incoming = None if appsocket.connect(host, port): # Other instance already running? # Get appname to check if expected app is actually # running under that port if appsocket.send("getappname"): incoming = appsocket.read() if incoming.rstrip("\4") != pyname: incoming = None if incoming: # Send args as UTF-8 if module == "apply-profiles": # Always try to close currently running instance data = ["close"] else: # Send module/appname to notify running app data = [module or appname] if module != "3DLUT-maker": for arg in sys.argv[1:]: data.append(safe_str(safe_unicode(arg), "UTF-8")) data = sp.list2cmdline(data) if appsocket.send(data): incoming = appsocket.read() appsocket.close() if incoming and incoming.rstrip("\4") == "ok": # Successfully sent our request break elif incoming == "" and module == "apply-profiles": # Successfully sent our close request. # Wait for lockfile to be removed, in which case # we know the running instance has successfully # closed. while os.path.isfile(lockfilename): sleep(.05) incoming = None break if incoming is not None: # Other instance running? import localization as lang lang.init() if incoming.rstrip("\4") == "ok": # Successfully sent our request safe_print(lang.getstr("app.otherinstance.notified")) else: # Other instance busy? handle_error(lang.getstr("app.otherinstance", name)) # Exit return lockfilename = os.path.join(confighome, "%s.lock" % name) # Create listening socket appsocket = AppSocket() if appsocket: sys._appsocket = appsocket.socket if getcfg("app.allow_network_clients"): host = "" for port in (getcfg("app.port"), 0): try: sys._appsocket.bind((host, port)) except socket.error, exception: if port == 0: safe_print("Warning - could not bind to %s:%s:" % (host, port), exception) del sys._appsocket break else: try: sys._appsocket.settimeout(.2) except socket.error, exception: safe_print("Warning - could not set socket " "timeout:", exception) del sys._appsocket break try: sys._appsocket.listen(1) except socket.error, exception: safe_print("Warning - could not listen on " "socket:", exception) del sys._appsocket break try: port = sys._appsocket.getsockname()[1] except socket.error, exception: safe_print("Warning - could not get socket " "address:", exception) del sys._appsocket break if module in multi_instance: mode = "a" else: mode = "w" write_lockfile(lockfilename, mode, str(port)) break atexit.register(lambda: safe_print("Ran application exit handlers")) BaseApp.register_exitfunc(_exit, lockfilename, port) # Check for required resource files mod2res = {"3DLUT-maker": ["xrc/3dlut.xrc"], "curve-viewer": [], "profile-info": [], "scripting-client": [], "synthprofile": ["xrc/synthicc.xrc"], "testchart-editor": [], "VRML-to-X3D-converter": []} for filename in mod2res.get(module, resfiles): path = get_data_path(os.path.sep.join(filename.split("/"))) if not path or not os.path.isfile(path): import localization as lang lang.init() raise ResourceError(lang.getstr("resources.notfound.error") + "\n" + filename) # Create main data dir if it does not exist if not os.path.exists(datahome): try: os.makedirs(datahome) except Exception, exception: handle_error(UserWarning("Warning - could not create " "directory '%s'" % datahome)) elif sys.platform == "darwin": # Check & fix permissions if necessary import getpass user = getpass.getuser().decode(fs_enc) script = [] for directory in (confighome, datahome, logdir): if (os.path.isdir(directory) and not os.access(directory, os.W_OK)): script.append("chown -R '%s' '%s'" % (user, directory)) if script: sp.call(['osascript', '-e', 'do shell script "%s" with administrator privileges' % ";".join(script).encode(fs_enc)]) # Initialize & run if module == "3DLUT-maker": from wxLUT3DFrame import main elif module == "curve-viewer": from wxLUTViewer import main elif module == "profile-info": from wxProfileInfo import main elif module == "scripting-client": from wxScriptingClient import main elif module == "synthprofile": from wxSynthICCFrame import main elif module == "testchart-editor": from wxTestchartEditor import main elif module == "VRML-to-X3D-converter": from wxVRML2X3D import main elif module == "apply-profiles": from profile_loader import main else: from DisplayCAL import main main() except Exception, exception: if isinstance(exception, ResourceError): error = exception else: error = Error(u"Fatal error: " + safe_unicode(traceback.format_exc())) handle_error(error) _exit(lockfilename, port) def _exit(lockfilename, port): for process in mp.active_children(): if not "Manager" in process.name: safe_print("Terminating zombie process", process.name) process.terminate() safe_print(process.name, "terminated") for thread in threading.enumerate(): if (thread.isAlive() and thread is not threading.currentThread() and not thread.isDaemon()): safe_print("Waiting for thread %s to exit" % thread.getName()) thread.join() safe_print(thread.getName(), "exited") if lockfilename and os.path.isfile(lockfilename): # Each lockfile may contain multiple ports of running instances try: with open(lockfilename) as lockfile: ports = lockfile.read().splitlines() except EnvironmentError, exception: safe_print("Warning - could not read lockfile %s: %r" % (lockfilename, exception)) ports = [] else: # Remove ourself if port and str(port) in ports: ports.remove(str(port)) # Determine if instances still running. If not still running, # remove from list of ports for i in reversed(xrange(len(ports))): try: port = int(ports[i]) except ValueError: # This shouldn't happen continue appsocket = AppSocket() if not appsocket: break if not appsocket.connect("127.0.0.1", port): # Other instance probably died del ports[i] appsocket.close() if ports: # Write updated lockfile write_lockfile(lockfilename, "w", "\n".join(ports)) # If no ports of running instances, ok to remove lockfile if not ports: try: os.remove(lockfilename) except EnvironmentError, exception: safe_print("Warning - could not remove lockfile %s: %r" % (lockfilename, exception)) safe_print("Exiting", pyname) def main_3dlut_maker(): main("3DLUT-maker") def main_curve_viewer(): main("curve-viewer") def main_profile_info(): main("profile-info") def main_synthprofile(): main("synthprofile") def main_testchart_editor(): main("testchart-editor") def write_lockfile(lockfilename, mode, contents): try: # Create lockfile with open(lockfilename, mode) as lockfile: lockfile.write("%s\n" % contents) except EnvironmentError, exception: # This shouldn't happen safe_print("Warning - could not write lockfile %s:" % lockfilename, exception) class AppSocket(object): def __init__(self): try: self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error, exception: # This shouldn't happen safe_print("Warning - could not create TCP socket:", exception) def __getattr__(self, name): return getattr(self.socket, name) def __nonzero__(self): return hasattr(self, "socket") def connect(self, host, port): try: self.socket.connect((host, port)) except socket.error, exception: # Other instance probably died safe_print("Connection to %s:%s failed:" % (host, port), exception) return False return True def read(self): incoming = "" while not "\4" in incoming: try: data = self.socket.recv(1024) except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.05) continue safe_print("Warning - could not receive data:", exception) break if not data: break incoming += data return incoming def send(self, data): try: self.socket.sendall(data + "\n") except socket.error, exception: # Connection lost? safe_print("Warning - could not send data %r:" % data, exception) return False return True class Error(Exception): pass if __name__ == "__main__": main() DisplayCAL-3.5.0.0/DisplayCAL/meta.py0000644000076500000000000000376213242301247016731 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Meta information """ import re import sys try: from __version__ import (BUILD_DATE as build, LASTMOD as lastmod, VERSION, VERSION_BASE, VERSION_STRING) except ImportError: build = lastmod = "0000-00-00T00:00:00.0Z" VERSION = None from options import test_update if not VERSION or test_update: VERSION = VERSION_BASE = (0, 0, 0, 0) VERSION_STRING = ".".join(str(n) for n in VERSION) if sys.version_info[:2] < (3, ): author = "Florian Höch".decode("utf8") else: author = "Florian Höch" author_ascii = "Florian Hoech" description = ("Display calibration and profiling with a focus on accuracy and " "versatility") longdesc = ("Calibrate and characterize your display devices using " "one of many supported measurement instruments, with " "support for multi-display setups and a variety of " "available options for advanced users, such as " "verification and reporting functionality to evaluate " "ICC profiles and display devices, creating video 3D " "LUTs, as well as optional CIECAM02 gamut mapping to " "take into account varying viewing conditions.") domain = "displaycal.net" author_email = "florian" + chr(0100) + domain name = "DisplayCAL" name_html = 'DisplayCAL' py_maxversion = (2, 7) py_minversion = (2, 6) version = VERSION_STRING version_lin = VERSION_STRING # Linux version_mac = VERSION_STRING # Mac OS X version_win = VERSION_STRING # Windows version_src = VERSION_STRING version_short = re.sub("(?:\.0){1,2}$", "", version) version_tuple = VERSION # only ints allowed and must be exactly 4 values wx_minversion = (2, 8, 8) def script2pywname(script): """ Convert all-lowercase script name to mixed-case pyw name """ a2b = {name + "-3dlut-maker": name + "-3DLUT-maker", name + "-vrml-to-x3d-converter": name + "-VRML-to-X3D-converter"} if script.lower().startswith(name.lower()): pyw = name + script[len(name):] return a2b.get(pyw, pyw) return script DisplayCAL-3.5.0.0/DisplayCAL/multiprocess.py0000644000076500000000000001512313154615407020536 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from Queue import Empty import atexit import logging import math import multiprocessing as mp import multiprocessing.managers import multiprocessing.pool import sys import threading def cpu_count(): """ Returns the number of CPUs in the system Return fallback value of 1 if CPU count cannot be determined. """ try: return mp.cpu_count() except: return 1 def pool_slice(func, data_in, args=(), kwds={}, num_workers=None, thread_abort=None, logfile=None, num_batches=1): """ Process data in slices using a pool of workers and return the results. The individual worker results are returned in the same order as the original input data, irrespective of the order in which the workers finished (FIFO). Progress percentage is written to optional logfile using a background thread that monitors a queue. Note that 'func' is supposed to periodically check thread_abort.event which is passed as the first argument to 'func', and put its progress percentage into the queue which is passed as the second argument to 'func'. """ from config import getcfg if num_workers is None: num_workers = cpu_count() num_workers = max(min(num_workers, len(data_in)), 1) max_workers = getcfg("multiprocessing.max_cpus") if max_workers: num_workers = min(num_workers, max_workers) if num_workers == 1 or not num_batches: # Splitting the workload into batches only makes sense if there are # multiple workers num_batches = 1 chunksize = float(len(data_in)) / (num_workers * num_batches) if chunksize < 1: num_batches = 1 chunksize = float(len(data_in)) / num_workers if num_workers > 1: Pool = NonDaemonicPool manager = mp.Manager() if thread_abort is not None and not isinstance(thread_abort.event, mp.managers.EventProxy): # Replace the event with a managed instance that is compatible # with pool event = thread_abort.event thread_abort.event = manager.Event() if event.is_set(): thread_abort.event.set() else: event = None Queue = manager.Queue else: # Do it all in in the main thread of the current instance Pool = FakePool manager = None Queue = FakeQueue if thread_abort is not None: thread_abort_event = thread_abort.event else: thread_abort_event = None progress_queue = Queue() if logfile: def progress_logger(num_workers): eof_count = 0 progress = 0 while progress < 100 * num_workers: try: inc = progress_queue.get(True, 0.1) if isinstance(inc, Exception): raise inc progress += inc except Empty: continue except IOError: break except EOFError: eof_count += 1 if eof_count == num_workers: break logfile.write("\r%i%%" % (progress / num_workers)) threading.Thread(target=progress_logger, args=(num_workers * num_batches, ), name="ProcessProgressLogger").start() pool = Pool(num_workers) results = [] start = 0 for batch in xrange(num_batches): for i in xrange(batch * num_workers, (batch + 1) * num_workers): end = int(math.ceil(chunksize * (i + 1))) results.append(pool.apply_async(WorkerFunc(func, batch == num_batches - 1), (data_in[start:end], thread_abort_event, progress_queue) + args, kwds)) start = end # Get results exception = None data_out = [] for result in results: result = result.get() if isinstance(result, Exception): exception = result continue data_out.append(result) pool.terminate() if manager: # Need to shutdown manager so it doesn't hold files in use if event: # Restore original event if thread_abort.event.is_set(): event.set() thread_abort.event = event manager.shutdown() if exception: raise exception return data_out class WorkerFunc(object): def __init__(self, func, exit=False): self.func = func self.exit = exit def __call__(self, data, thread_abort_event, progress_queue, *args, **kwds): from log import safe_print try: return self.func(data, thread_abort_event, progress_queue, *args, **kwds) except Exception, exception: import traceback safe_print(traceback.format_exc()) return exception finally: progress_queue.put(EOFError()) if mp.current_process().name != "MainProcess": safe_print("Exiting worker process", mp.current_process().name) if sys.platform == "win32" and self.exit: # Exit handlers registered with atexit will not normally # run when a multiprocessing subprocess exits. We are only # interested in our own exit handler though. # Note all of this only applies to Windows, as it doesn't # have fork(). for func, targs, kargs in atexit._exithandlers: # Find our lockfile removal exit handler if (targs and isinstance(targs[0], basestring) and targs[0].endswith(".lock")): safe_print("Removing lockfile", targs[0]) try: func(*targs, **kargs) except Exception, exception: safe_print("Could not remove lockfile:", exception) # Logging is normally shutdown by atexit, as well. Do # it explicitly instead. logging.shutdown() class Mapper(object): """ Wrap 'func' with optional arguments. To be used as function argument for Pool.map """ def __init__(self, func, *args, **kwds): self.func = WorkerFunc(func) self.args = args self.kwds = kwds def __call__(self, iterable): return self.func(iterable, *self.args, **self.kwds) class NonDaemonicProcess(mp.Process): daemon = property(lambda self: False, lambda self, daemonic: None) class NonDaemonicPool(mp.pool.Pool): """ Pool that has non-daemonic workers """ Process = NonDaemonicProcess class FakeManager(object): """ Fake manager """ def Queue(self): return FakeQueue() def Value(self, typecode, *args, **kwds): return mp.managers.Value(typecode, *args, **kwds) def shutdown(self): pass class FakePool(object): """ Fake pool """ def __init__(self, processes=None, initializer=None, initargs=(), maxtasksperchild=None): pass def apply_async(self, func, args, kwds): return Result(func(*args, **kwds)) def close(self): pass def map(self, func, iterable, chunksize=None): return func(iterable) def terminate(self): pass class FakeQueue(object): """ Fake queue """ def __init__(self): self.queue = [] def get(self, block=True, timeout=None): try: return self.queue.pop() except: raise Empty def join(self): pass def put(self, item, block=True, timeout=None): self.queue.append(item) class Result(object): """ Result proxy """ def __init__(self, result): self.result = result def get(self): return self.result DisplayCAL-3.5.0.0/DisplayCAL/network.py0000644000076500000000000001044113242301247017464 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import errno import os import socket import urllib2 import localization as lang from log import safe_print from util_str import safe_str, safe_unicode def get_network_addr(): """ Tries to get the local machine's network address. """ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Opening a connection on an UDP socket does nothing except give the socket # the network address of the (local) machine. We use Google's DNS server # as remote address, but could use any valid non-local address (doesn't # matter if it is actually reachable) try: s.connect(('8.8.8.8', 53)) return s.getsockname()[0] # Return network address finally: s.close() def get_valid_host(hostname=None): """ Tries to verify the hostname by resolving to an IPv4 address. Both hostname with and without .local suffix will be tried if necessary. Returns a tuple hostname, addr """ if hostname is None: hostname = socket.gethostname() hostnames = [hostname] if hostname.endswith(".local"): hostnames.insert(0, os.path.splitext(hostname)[0]) elif not "." in hostname: hostnames.insert(0, hostname + ".local") while hostnames: hostname = hostnames.pop() try: addr = socket.gethostbyname(hostname) except socket.error: if not hostnames: raise else: return hostname, addr class LoggingHTTPRedirectHandler(urllib2.HTTPRedirectHandler): """ Like urllib2.HTTPRedirectHandler, but logs redirections """ # maximum number of redirections to any single URL # this is needed because of the state that cookies introduce max_repeats = 4 # maximum total number of redirections (regardless of URL) before # assuming we're in a loop max_redirections = 10 def http_error_302(self, req, fp, code, msg, headers): # Some servers (incorrectly) return multiple Location headers # (so probably same goes for URI). Use first header. if 'location' in headers: newurl = headers.getheaders('location')[0] elif 'uri' in headers: newurl = headers.getheaders('uri')[0] else: return # Keep reference to new URL LoggingHTTPRedirectHandler.newurl = newurl if not hasattr(req, "redirect_dict"): # First redirect in this chain. Log original URL safe_print(req.get_full_url(), end=" ") safe_print(u"\u2192", newurl) return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers) http_error_301 = http_error_303 = http_error_307 = http_error_302 inf_msg = urllib2.HTTPRedirectHandler.inf_msg class NoHTTPRedirectHandler(urllib2.HTTPRedirectHandler): """ Like urllib2.HTTPRedirectHandler, but does not allow redirections """ def http_error_302(self, req, fp, code, msg, headers): # Some servers (incorrectly) return multiple Location headers # (so probably same goes for URI). Use first header. if 'location' in headers: newurl = headers.getheaders('location')[0] elif 'uri' in headers: newurl = headers.getheaders('uri')[0] else: return raise urllib2.HTTPError(newurl, code, msg + " - Redirection to url '%s' is not allowed" % newurl, headers, fp) http_error_301 = http_error_303 = http_error_307 = http_error_302 class ScriptingClientSocket(socket.socket): def __del__(self): self.disconnect() def __enter__(self): return self def __exit__(self, etype, value, tb): self.disconnect() def __init__(self): socket.socket.__init__(self) self.recv_buffer = "" def disconnect(self): try: # Will fail if the socket isn't connected, i.e. if there was an # error during the call to connect() self.shutdown(socket.SHUT_RDWR) except socket.error, exception: if exception.errno != errno.ENOTCONN: safe_print(exception) self.close() def get_single_response(self): # Buffer received data until EOT (response end marker) and return # single response (additional data will still be in the buffer) while not "\4" in self.recv_buffer: incoming = self.recv(4096) if incoming == "": raise socket.error(lang.getstr("connection.broken")) self.recv_buffer += incoming end = self.recv_buffer.find("\4") single_response = self.recv_buffer[:end] self.recv_buffer = self.recv_buffer[end + 1:] return safe_unicode(single_response, "UTF-8") def send_command(self, command): # Automatically append newline (command end marker) self.sendall(safe_str(command, "UTF-8") + "\n") DisplayCAL-3.5.0.0/DisplayCAL/options.py0000644000076500000000000000403513242301247017470 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Parse commandline options. Note that none of these are advertised as they solely exist for testing and development purposes. """ import sys # Use only ascii? (DON'T) ascii = "--ascii" in sys.argv[1:] # Debug level (default: 0 = off). >= 1 prints debug messages if "-d2" in sys.argv[1:] or "--debug=2" in sys.argv[1:]: debug = 2 elif ("-d1" in sys.argv[1:] or "--debug=1" in sys.argv[1:] or "-d" in sys.argv[1:] or "--debug" in sys.argv[1:]): debug = 1 else: debug = 0 # Debug localization debug_localization = ("-dl" in sys.argv[1:] or "--debug-localization" in sys.argv[1:]) # Use alternate patch preview in the testchart editor? tc_use_alternate_preview = ("-ap" in sys.argv[1:] or "--alternate-preview" in sys.argv[1:]) # Test some features even if they are not available normally test = "-t" in sys.argv[1:] or "--test" in sys.argv[1:] # Test sensor calibration test_require_sensor_cal = ("-s" in sys.argv[1:] or "--test_require_sensor_cal" in sys.argv[1:]) # Test update functionality test_update = "-tu" in sys.argv[1:] or "--test-update" in sys.argv[1:] # Test SSL connection using badssl.com test_badssl = False for arg in sys.argv[1:]: if arg.startswith("--test-badssl="): test_badssl = arg.split("=", 1)[-1] # Always fail download always_fail_download = "--always-fail-download" in sys.argv[1:] # HDR input profile generation: Test input curve clipping test_input_curve_clipping = "--test-input-curve-clipping" in sys.argv[1:] # Enable experimental features experimental = "-x" in sys.argv[1:] or "--experimental" in sys.argv[1:] # Verbosity level (default: 1). >= 1 prints some status information if "-v4" in sys.argv[1:] or "--verbose=4" in sys.argv[1:]: verbose = 4 elif "-v3" in sys.argv[1:] or "--verbose=3" in sys.argv[1:]: verbose = 3 elif "-v2" in sys.argv[1:] or "--verbose=2" in sys.argv[1:]: verbose = 2 elif "-v0" in sys.argv[1:] or "--verbose=0" in sys.argv[1:]: verbose = 0 # Off else: verbose = 1 # Colord: Use GOBject introspection use_gi = "--use-gi" in sys.argv[1:] DisplayCAL-3.5.0.0/DisplayCAL/ordereddict.py0000644000076500000000000001557112665102054020277 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from itertools import izip, imap def is_nan(obj): """ Return boolean indicating if obj is considered not a number. """ try: obj + 1 except TypeError: return True return False class OrderedDict(dict): """ Simple ordered dictionary. Compatible with Python 3's OrderedDict, though performance is inferior as the approach is different (but should be more memory efficient), and implements several sequence methods (__delslice__, __getslice__, __setslice__, index, insert, reverse, sort). """ missing = object() def __init__(self, *args, **kwargs): self._keys = [] if args or kwargs: self.update(*args, **kwargs) def __delitem__(self, key): dict.__delitem__(self, key) self._keys.remove(key) def __delslice__(self, i, j): """ Delete a range of keys. """ for key in iter(self._keys[i:j]): del self[key] def __eq__(self, other): """ od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive while comparison to a regular mapping is order-insensitive. """ if isinstance(other, OrderedDict): return len(self) == len(other) and \ all(p == q for p, q in zip(self.items(), other.items())) return dict.__eq__(self, other) def __getslice__(self, i, j): """ Get a range of keys. Return a new OrderedDict. """ keys = self._keys[i:j] return self.__class__(zip(keys, map(self.get, keys))) def __iter__(self): return iter(self._keys) def __ne__(self, other): return not self == other def __reduce__(self): 'Return state information for pickling' items = [[k, self[k]] for k in self] tmp = self._keys del self._keys inst_dict = vars(self).copy() self._keys = tmp if inst_dict: return (self.__class__, (items,), inst_dict) return self.__class__, (items,) def __repr__(self): """ od.__repr__() <==> repr(od) """ if not self: return "%s.%s()" % (self.__class__.__module__, self.__class__.__name__) return "%s.%s(%r)" % (self.__class__.__module__, self.__class__.__name__, self.items()) def __reversed__(self): """ od.__reversed__() -- return a reverse iterator over the keys """ return reversed(self._keys) def __setitem__(self, key, value): if not key in self._keys: self._keys.append(key) dict.__setitem__(self, key, value) def __setslice__(self, i, j, iterable): """ Set a range of keys. """ for key in iter(self._keys[i:j]): dict.__delitem__(self, key) self._keys[i:j] = self.__class__(iterable).keys() self.update(iterable) def clear(self): dict.clear(self) del self._keys[:] def copy(self): return self.__class__(self) def delslice(self, key1, key2): """ Like __delslice__, but takes keys instead of numerical key positions. """ if key1: if key2: del self[self.index(key1):self.index(key2)] else: del self[self.index(key1):] elif key2: del self[:self.index(key2)] else: self.clear() @classmethod def fromkeys(cls, iterable, value=None): """ Return new dict with keys from S and values equal to v. v defaults to None. """ d = cls() for key in iterable: d[key] = value return d def getslice(self, key1, key2): """ Like __getslice__, but takes keys instead of numerical key positions. """ if key1: if key2: return self[self.index(key1):self.index(key2)] else: return self[self.index(key1):] elif key2: return self[:self.index(key2)] else: return self.copy() def index(self, key, start=0, stop=missing): """ Return numerical position of key. Raise KeyError if the key is not present. """ if start != 0 or stop is not OrderedDict.missing: if stop is not OrderedDict.missing: iterable = self._keys[start:stop] else: iterable = self._keys[start:] else: iterable = self._keys if not key in iterable: raise KeyError(key) return self._keys.index(key) def insert(self, i, key, value): """ Insert key before index and assign value to self[key]. If the key is already present, it is overwritten. """ if key in self: del self[key] self._keys.insert(i, key) dict.__setitem__(self, key, value) def items(self): return zip(self._keys, self.values()) def iteritems(self): return izip(self._keys, self.itervalues()) iterkeys = __iter__ def itervalues(self): return imap(self.get, self._keys) def key(self, value, start=0, stop=missing): """ Return key of first value. Raise ValueError if the value is not present. """ if start != 0 or stop is not OrderedDict.missing: if stop is not OrderedDict.missing: iterable = self[start:stop] else: iterable = self[start:] else: iterable = self for item in iterable.iteritems(): if item[1] == value: return item[0] raise ValueError(value) def keys(self): return self._keys[:] def pop(self, key, *args): if key in self: self._keys.remove(key) return dict.pop(self, key, *args) def popitem(self, last=True): """ od.popitem() -> (k, v), return and remove a (key, value) pair. Pairs are returned in LIFO order if last is true or FIFO order if false. """ if last: key = self._keys[-1] else: key = self._keys[0] return key, self.pop(key) def rename(self, key, name): """ Rename a key in-place. """ i = self.index(key) value = self.pop(key) self.insert(i, name, value) def reverse(self): """ Reverse keys in-place. """ self._keys.reverse() def setdefault(self, key, value=None): if not key in self: self[key] = value return self[key] def setslice(self, key1, key2, iterable): """ Like __setslice__, but takes keys instead of numerical key positions. """ if key1: if key2: self[self.index(key1):self.index(key2)] = iterable else: self[self.index(key1):] = iterable elif key2: self[:self.index(key2)] = iterable else: self[:] = iterable def sort(self, *args, **kwargs): """ Sort keys in-place. """ self._keys.sort(*args, **kwargs) def update(self, *args, **kwargs): if len(args) > 1: raise TypeError("update expected at most 1 arguments, got %i" % len(args)) for iterable in args + tuple(kwargs.items()): if hasattr(iterable, "iteritems"): self.update(iterable.iteritems()) elif hasattr(iterable, "keys"): for key in iterable.keys(): self[key] = iterable[key] else: for key, val in iterable: self[key] = val def values(self): return map(self.get, self._keys) __init__.__doc__ = dict.__init__.__doc__ __delitem__.__doc__ = dict.__delitem__.__doc__ __iter__.__doc__ = dict.__iter__.__doc__ __setitem__.__doc__ = dict.__setitem__.__doc__ clear.__doc__ = dict.clear.__doc__ copy.__doc__ = dict.copy.__doc__ items.__doc__ = dict.items.__doc__ iteritems.__doc__ = dict.iteritems.__doc__ itervalues.__doc__ = dict.itervalues.__doc__ keys.__doc__ = dict.keys.__doc__ pop.__doc__ = dict.pop.__doc__ setdefault.__doc__ = dict.setdefault.__doc__ update.__doc__ = dict.update.__doc__ values.__doc__ = dict.values.__doc__ DisplayCAL-3.5.0.0/DisplayCAL/patterngenerators.py0000644000076500000000000004276613142403032021553 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from SocketServer import TCPServer from socket import (AF_INET, SHUT_RDWR, SO_BROADCAST, SO_REUSEADDR, SOCK_DGRAM, SOCK_STREAM, SOL_SOCKET, error, gethostname, gethostbyname, socket, timeout) from time import sleep import errno import httplib import select import struct import sys import threading import urllib import urlparse import demjson import localization as lang from log import safe_print from network import get_network_addr from util_http import encode_multipart_formdata from util_str import safe_unicode import webwin _lock = threading.RLock() def Property(func): return property(**func()) def _eintr_retry(func, *args): """restart a system call interrupted by EINTR""" while True: try: return func(*args) except (OSError, select.error) as e: if e.args[0] != errno.EINTR: raise def _shutdown(sock, addr): try: # Will fail if the socket isn't connected, i.e. if there # was an error during the call to connect() sock.shutdown(SHUT_RDWR) except error, exception: if exception.errno != errno.ENOTCONN: safe_print("PatternGenerator: SHUT_RDWR for %s:%i failed:" % addr[:2], exception) sock.close() class GenHTTPPatternGeneratorClient(object): """ Generic pattern generator client using HTTP REST interface """ def __init__(self, host, port, bits, use_video_levels=False, logfile=None): self.host = host self.port = port self.bits = bits self.use_video_levels = use_video_levels self.logfile = logfile def wait(self): self.connect() def __del__(self): self.disconnect_client() def _request(self, method, url, params=None, headers=None, validate=None): try: self.conn.request(method, url, params, headers or {}) resp = self.conn.getresponse() except (error, httplib.HTTPException), exception: raise else: if resp.status == httplib.OK: return self._validate(resp, url, validate) else: raise httplib.HTTPException("%s %s" % (resp.status, resp.reason)) def _shutdown(self): # Override this method in subclass! pass def _validate(self, resp, url, validate): # Override this method in subclass! pass def connect(self): self.ip = gethostbyname(self.host) self.conn = httplib.HTTPConnection(self.ip, self.port) try: self.conn.connect() except (error, httplib.HTTPException): del self.conn raise def disconnect_client(self): self.listening = False if hasattr(self, "conn"): self._shutdown() self.conn.close() del self.conn def send(self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), bits=None, use_video_levels=None, x=0, y=0, w=1, h=1): rgb, bgrgb, bits = self._get_rgb(rgb, bgrgb, bits, use_video_levels) # Override this method in subclass! class GenTCPSockPatternGeneratorServer(object): """ Generic pattern generator server using TCP sockets """ def __init__(self, port, bits, use_video_levels=False, logfile=None): self.port = port self.bits = bits self.use_video_levels = use_video_levels self.socket = socket(AF_INET, SOCK_STREAM) self.socket.settimeout(1) self.socket.bind(('', port)) self.socket.listen(1) self.listening = False self.logfile = logfile def wait(self): self.listening = True if self.logfile: try: host = get_network_addr() except error: host = gethostname() self.logfile.write(lang.getstr("connection.waiting") + (" %s:%s\n" % (host, self.port))) while self.listening: try: self.conn, addr = self.socket.accept() except timeout: continue self.conn.settimeout(1) break if self.listening: safe_print(lang.getstr("connection.established")) def __del__(self): self.disconnect_client() self.socket.close() def _get_rgb(self, rgb, bgrgb, bits=None, use_video_levels=None): """ The RGB range should be 0..1 """ if not bits: bits = self.bits if use_video_levels is None: use_video_levels = self.use_video_levels bitv = 2 ** bits - 1 if use_video_levels: minv = 16.0 / 255.0 maxv = 235.0 / 255.0 - minv if bits > 8: # For video encoding the extra bits of precision are created by # bit shifting rather than scaling, so we need to scale the fp # value to account for this. minv = (minv * 255.0 * (1 << (bits - 8))) / bitv maxv = (maxv * 255.0 * (1 << (bits - 8))) / bitv else: minv = 0.0 maxv = 1.0 rgb = [round(minv * bitv + v * bitv * maxv) for v in rgb] bgrgb = [round(minv * bitv + v * bitv * maxv) for v in bgrgb] return rgb, bgrgb, bits def disconnect_client(self): self.listening = False if hasattr(self, "conn"): try: self.conn.shutdown(SHUT_RDWR) except error, exception: if exception.errno != errno.ENOTCONN: safe_print("Warning - could not shutdown pattern generator " "connection:", exception) self.conn.close() del self.conn def send(self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), use_video_levels=None, x=0, y=0, w=1, h=1): for server, bits in ((ResolveLSPatternGeneratorServer, 8), (ResolveCMPatternGeneratorServer, 10)): server.__dict__["send"](self, rgb, bgrgb, bits, use_video_levels, x, y, w, h) class PrismaPatternGeneratorClient(GenHTTPPatternGeneratorClient): """ Prisma HTTP REST interface """ def __init__(self, host, port=80, use_video_levels=False, logfile=None): GenHTTPPatternGeneratorClient.__init__(self, host, port, 8, use_video_levels=use_video_levels, logfile=logfile) self.prod_prisma = 2 self.oem_qinc = 1024 self.prod_oem = (struct.pack("' '' '' '' % tuple(rgb + [x, y, w, h])) self.conn.sendall("%s%s" % (struct.pack(">I", len(xml)), xml)) class ResolveCMPatternGeneratorServer(GenTCPSockPatternGeneratorServer): def __init__(self, port=20002, bits=10, use_video_levels=False, logfile=None): GenTCPSockPatternGeneratorServer.__init__(self, port, bits, use_video_levels, logfile) def send(self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), bits=None, use_video_levels=None, x=0, y=0, w=1, h=1): """ Send an RGB color to the pattern generator. The RGB range should be 0..1 """ rgb, bgrgb, bits = self._get_rgb(rgb, bgrgb, bits, use_video_levels) xml = ('' '' '' '' '' % tuple(rgb + [bits] + bgrgb + [bits, x, y, w, h])) self.conn.sendall("%s%s" % (struct.pack(">I", len(xml)), xml)) class WebWinHTTPPatternGeneratorServer(TCPServer, object): def __init__(self, port, logfile=None): self.port = port Handler = webwin.WebWinHTTPRequestHandler TCPServer.__init__(self, ("", port), Handler) self.timeout = 1 self.patterngenerator = self self._listening = threading.Event() self.logfile = logfile self.pattern = "#808080|#808080|0|0|1|1" def disconnect_client(self): self.listening = False def handle_error(self, request, client_address): safe_print("Exception happened during processing of " "request from %s:%s:" % client_address, sys.exc_info()[1]) @Property def listening(): def fget(self): return self._listening.is_set() def fset(self, value): if value: self._listening.set() else: self._listening.clear() if hasattr(self, "conn"): self.shutdown_request(self.conn) del self.conn if hasattr(self, "_thread") and self._thread.isAlive(): self.shutdown() return locals() def send(self, rgb=(0, 0, 0), bgrgb=(0, 0, 0), bits=None, use_video_levels=None, x=0, y=0, w=1, h=1): pattern = ["#%02X%02X%02X" % tuple(round(v * 255) for v in rgb), "#%02X%02X%02X" % tuple(round(v * 255) for v in bgrgb), "%.4f|%.4f|%.4f|%.4f" % (x, y, w, h)] self.pattern = "|".join(pattern) def serve_forever(self, poll_interval=0.5): """Handle one request at a time until shutdown. Polls for shutdown every poll_interval seconds. Ignores self.timeout. If you need to do periodic tasks, do them in another thread. """ try: while self._listening.is_set(): # XXX: Consider using another file descriptor or # connecting to the socket to wake this up instead of # polling. Polling reduces our responsiveness to a # shutdown request and wastes cpu at all other times. r, w, e = _eintr_retry(select.select, [self], [], [], poll_interval) if self in r: self._handle_request_noblock() except Exception, exception: safe_print("Exception in WebWinHTTPPatternGeneratorServer.serve_forever:", exception) self._listening.clear() def shutdown(self): """Stops the serve_forever loop. Blocks until the loop has finished. This must be called while serve_forever() is running in another thread. """ self._listening.clear() while self._thread.isAlive(): sleep(0.05) def wait(self): self.listening = True if self.logfile: try: host = get_network_addr() except error: host = gethostname() self.logfile.write(lang.getstr("webserver.waiting") + (" %s:%s\n" % (host, self.port))) self.socket.settimeout(1) while self.listening: try: self.conn, addr = self.get_request() except timeout: continue self.conn.settimeout(1) break self.socket.settimeout(None) if self.listening: try: self.process_request(self.conn, addr) except: self.handle_error(self.conn, addr) self.disconnect_client() else: self._thread = threading.Thread(target=self.serve_forever, name="WebWinHTTPPatternGeneratorServerThread") self._thread.start() safe_print(lang.getstr("connection.established")) if __name__ == "__main__": patterngenerator = GenTCPSockPatternGeneratorServer() DisplayCAL-3.5.0.0/DisplayCAL/pnp.ids0000644000076500000000000015341712665102055016736 0ustar devwheel00000000000000AAA Avolites Ltd AAE Anatek Electronics Inc. AAT Ann Arbor Technologies ABA ABBAHOME INC. ABC AboCom System Inc ABD Allen Bradley Company ABE Alcatel Bell ABO D-Link Systems Inc ABT Anchor Bay Technologies, Inc. ABV Advanced Research Technology ACA Ariel Corporation ACB Aculab Ltd ACC Accton Technology Corporation ACD AWETA BV ACE Actek Engineering Pty Ltd ACG A&R Cambridge Ltd ACH Archtek Telecom Corporation ACI Ancor Communications Inc ACK Acksys ACL Apricot Computers ACM Acroloop Motion Control Systems Inc ACO Allion Computer Inc. ACP Aspen Tech Inc ACR Acer Technologies ACS Altos Computer Systems ACT Applied Creative Technology ACU Acculogic ACV ActivCard S.A ADA Addi-Data GmbH ADB Aldebbaron ADC Acnhor Datacomm ADD Advanced Peripheral Devices Inc ADE Arithmos, Inc. ADH Aerodata Holdings Ltd ADI ADI Systems Inc ADK Adtek System Science Company Ltd ADL ASTRA Security Products Ltd ADM Ad Lib MultiMedia Inc ADN Analog & Digital Devices Tel. Inc ADP Adaptec Inc ADR Nasa Ames Research Center ADS Analog Devices Inc ADT Adtek ADT Aved Display Technologies ADV Advanced Micro Devices Inc ADX Adax Inc AEC Antex Electronics Corporation AED Advanced Electronic Designs, Inc. AEI Actiontec Electric Inc AEJ Alpha Electronics Company AEM ASEM S.p.A. AEN Avencall AEP Aetas Peripheral International AET Aethra Telecomunicazioni S.r.l. AFA Alfa Inc AGC Beijing Aerospace Golden Card Electronic Engineering Co.,Ltd. AGI Artish Graphics Inc AGL Argolis AGM Advan Int'l Corporation AGT Agilent Technologies AHC Advantech Co., Ltd. AIC Arnos Insturments & Computer Systems AIE Altmann Industrieelektronik AII Amptron International Inc. AIL Altos India Ltd AIM AIMS Lab Inc AIR Advanced Integ. Research Inc AIS Alien Internet Services AIW Aiwa Company Ltd AIX ALTINEX, INC. AJA AJA Video Systems, Inc. AKB Akebia Ltd AKE AKAMI Electric Co.,Ltd AKI AKIA Corporation AKL AMiT Ltd AKM Asahi Kasei Microsystems Company Ltd AKP Atom Komplex Prylad AKY Askey Computer Corporation ALA Alacron Inc ALC Altec Corporation ALD In4S Inc ALG Realtek Semiconductor Corp. ALH AL Systems ALI Acer Labs ALJ Altec Lansing ALK Acrolink Inc ALL Alliance Semiconductor Corporation ALM Acutec Ltd. ALN Alana Technologies ALO Algolith Inc. ALP Alps Electric Company Ltd ALR Advanced Logic ALS Avance Logic Inc ALS Texas Advanced optoelectronics Solutions, Inc ALT Altra ALV AlphaView LCD ALX ALEXON Co.,Ltd. AMA Asia Microelectronic Development Inc AMB Ambient Technologies, Inc. AMC Attachmate Corporation AMD Amdek Corporation AMI American Megatrends Inc AML Anderson Multimedia Communications (HK) Limited AMN Amimon LTD. AMO Amino Technologies PLC and Amino Communications Limited AMP AMP Inc AMS ARMSTEL, Inc. AMT AMT International Industry AMX AMX LLC ANA Anakron ANC Ancot AND Adtran Inc ANI Anigma Inc ANK Anko Electronic Company Ltd ANL Analogix Semiconductor, Inc ANO Anorad Corporation ANP Andrew Network Production ANR ANR Ltd ANS Ansel Communication Company ANT Ace CAD Enterprise Company Ltd ANX Acer Netxus Inc AOA AOpen Inc. AOE Advanced Optics Electronics, Inc. AOL America OnLine AOT Alcatel APC American Power Conversion APD AppliAdata APE Alpine Electronics, Inc. APG Horner Electric Inc API A Plus Info Corporation APL Aplicom Oy APM Applied Memory Tech APN Appian Tech Inc APP Apple Computer Inc APR Aprilia s.p.a. APS Autologic Inc APT Audio Processing Technology Ltd APV A+V Link APX AP Designs Ltd ARC Alta Research Corporation ARE ICET S.p.A. ARG Argus Electronics Co., LTD ARI Argosy Research Inc ARK Ark Logic Inc ARL Arlotto Comnet Inc ARM Arima ARO Poso International B.V. ARS Arescom Inc ART Corion Industrial Corporation ASC Ascom Strategic Technology Unit ASD USC Information Sciences Institute ASE AseV Display Labs ASI Ahead Systems ASK Ask A/S ASL AccuScene Corporation Ltd ASM ASEM S.p.A. ASN Asante Tech Inc ASP ASP Microelectronics Ltd AST AST Research Inc ASU Asuscom Network Inc ASX AudioScience ASY Rockwell Collins / Airshow Systems ATA Allied Telesyn International (Asia) Pte Ltd ATC Ably-Tech Corporation ATD Alpha Telecom Inc ATE Innovate Ltd ATH Athena Informatica S.R.L. ATI Allied Telesis KK ATK Allied Telesyn Int'l ATL Arcus Technology Ltd ATM ATM Ltd ATN Athena Smartcard Solutions Ltd. ATO ASTRO DESIGN, INC. ATP Alpha-Top Corporation ATT AT&T ATV Office Depot, Inc. ATX Athenix Corporation AUI Alps Electric Inc AUO AU Optronics AUR Aureal Semiconductor AUT Autotime Corporation AVA Avaya Communication AVC Auravision Corporation AVD Avid Electronics Corporation AVE Add Value Enterpises (Asia) Pte Ltd AVI Nippon Avionics Co.,Ltd AVL Avalue Technology Inc. AVM AVM GmbH AVN Advance Computer Corporation AVO Avocent Corporation AVR AVer Information Inc. AVT Avtek (Electronics) Pty Ltd AVV SBS Technologies (Canada), Inc. (was Avvida Systems, Inc.) AVX A/Vaux Electronics AVX AVerMedia Technologies, Inc. AWC Access Works Comm Inc AWL Aironet Wireless Communications, Inc AWS Wave Systems AXB Adrienne Electronics Corporation AXC AXIOMTEK CO., LTD. AXE D-Link Systems Inc AXI American Magnetics AXL Axel AXO Axonic Labs LLC AXP American Express AXT Axtend Technologies Inc AXX Axxon Computer Corporation AXY AXYZ Automation Services, Inc AYD Aydin Displays AYR Airlib, Inc AZM AZ Middelheim - Radiotherapy AZT Aztech Systems Ltd BAC Biometric Access Corporation BAN Banyan BBB an-najah university BBH B&Bh BBL Brain Boxes Limited BCC Beaver Computer Corporaton BCD Barco GmbH BCM Broadcom BCQ Deutsche Telekom Berkom GmbH BCS Booria CAD/CAM systems BDO Brahler ICS BDR Blonder Tongue Labs, Inc. BDS Barco Display Systems BEC Elektro Beckhoff GmbH BEI Beckworth Enterprises Inc BEK Beko Elektronik A.S. BEL Beltronic Industrieelektronik GmbH BEO Baug & Olufsen BFE B.F. Engineering Corporation BGB Barco Graphics N.V BGT Budzetron Inc BHZ BitHeadz, Inc. BIC Big Island Communications BII Boeckeler Instruments Inc BIL Billion Electric Company Ltd BIO BioLink Technologies International, Inc. BIT Bit 3 Computer BLI Busicom BLN BioLink Technologies BLP Bloomberg L.P. BMD Blackmagic Design BMI Benson Medical Instruments Company BML BIOMED Lab BMS BIOMEDISYS BNE Bull AB BNK Banksia Tech Pty Ltd BNO Bang & Olufsen BNS Boulder Nonlinear Systems BOB Rainy Orchard BOE BOE BOI NINGBO BOIGLE DIGITAL TECHNOLOGY CO.,LTD BOS BOS BPD Micro Solutions, Inc. BPU Best Power BRA Braemac Pty Ltd BRC BARC BRG Bridge Information Co., Ltd BRI Boca Research Inc BRM Braemar Inc BRO BROTHER INDUSTRIES,LTD. BSE Bose Corporation BSL Biomedical Systems Laboratory BSN BRIGHTSIGN, LLC BST BodySound Technologies, Inc. BTC Bit 3 Computer BTE Brilliant Technology BTF Bitfield Oy BTI BusTech Inc BTO BioTao Ltd BUF Yasuhiko Shirai Melco Inc BUG B.U.G., Inc. BUJ ATI Tech Inc BUL Bull BUR Bernecker & Rainer Ind-Eletronik GmbH BUS BusTek BUT 21ST CENTURY ENTERTAINMENT BWK Bitworks Inc. BXE Buxco Electronics BYD byd:sign corporation CAA Castles Automation Co., Ltd CAC CA & F Elettronica CAG CalComp CAI Canon Inc. CAL Acon CAM Cambridge Audio CAN Canopus Company Ltd CAN Carrera Computer Inc CAN CORNEA CAR Cardinal Company Ltd CAS CASIO COMPUTER CO.,LTD CAT Consultancy in Advanced Technology CAV Cavium Networks, Inc CBI ComputerBoards Inc CBR Cebra Tech A/S CBT Cabletime Ltd CBX Cybex Computer Products Corporation CCC C-Cube Microsystems CCI Cache CCJ CONTEC CO.,LTD. CCL CCL/ITRI CCP Capetronic USA Inc CDC Core Dynamics Corporation CDD Convergent Data Devices CDE Colin.de CDG Christie Digital Systems Inc CDI Concept Development Inc CDK Cray Communications CDN Codenoll Technical Corporation CDP CalComp CDS Computer Diagnostic Systems CDT IBM Corporation CDV Convergent Design Inc. CEA Consumer Electronics Association CEC Chicony Electronics Company Ltd CED Cambridge Electronic Design Ltd CEF Cefar Digital Vision CEI Crestron Electronics, Inc. CEM MEC Electronics GmbH CEN Centurion Technologies P/L CEP C-DAC CER Ceronix CET TEC CORPORATION CFG Atlantis CGA Chunghwa Picture Tubes, LTD CGS Chyron Corp CGT congatec AG CHA Chase Research PLC CHC Chic Technology Corp. CHD ChangHong Electric Co.,Ltd CHE Acer Inc CHG Sichuan Changhong Electric CO, LTD. CHI Chrontel Inc CHL Chloride-R&D CHM CHIC TECHNOLOGY CORP. CHO Sichuang Changhong Corporation CHP CH Products CHS Agentur Chairos CHT Chunghwa Picture Tubes,LTD. CHY Cherry GmbH CIC Comm. Intelligence Corporation CII Cromack Industries Inc CIL Citicom Infotech Private Limited CIN Citron GmbH CIP Ciprico Inc CIR Cirrus Logic Inc CIS Cisco Systems Inc CIT Citifax Limited CKC The Concept Keyboard Company Ltd CKJ Carina System Co., Ltd. CLA Clarion Company Ltd CLD COMMAT L.t.d. CLE Classe Audio CLG CoreLogic CLI Cirrus Logic Inc CLM CrystaLake Multimedia CLO Clone Computers CLT automated computer control systems CLV Clevo Company CLX CardLogix CMC CMC Ltd CMD Colorado MicroDisplay, Inc. CMG Chenming Mold Ind. Corp. CMI C-Media Electronics CMM Comtime GmbH CMN Chimei Innolux Corporation CMO Chi Mei Optoelectronics corp. CMR Cambridge Research Systems Ltd CMS CompuMaster Srl CMX Comex Electronics AB CNB American Power Conversion CNC Alvedon Computers Ltd CNE Cine-tal CNI Connect Int'l A/S CNN Canon Inc CNT COINT Multimedia Systems COB COBY Electronics Co., Ltd COD CODAN Pty. Ltd. COI Codec Inc. COL Rockwell Collins, Inc. COM Comtrol Corporation CON Contec Company Ltd COO coolux GmbH COR Corollary Inc COS CoStar Corporation COT Core Technology Inc COW Polycow Productions COX Comrex CPC Ciprico Inc CPD CompuAdd CPI Computer Peripherals Inc CPL Compal Electronics Inc CPM Capella Microsystems Inc. CPQ Compaq Computer Company CPT cPATH CPX Powermatic Data Systems CRC CONRAC GmbH CRD Cardinal Technical Inc CRE Creative Labs Inc CRI Crio Inc. CRL Creative Logic CRN Cornerstone Imaging CRO Extraordinary Technologies PTY Limited CRQ Cirque Corporation CRS Crescendo Communication Inc CRV Cerevo Inc. CRX Cyrix Corporation CSB Transtex SA CSC Crystal Semiconductor CSD Cresta Systems Inc CSE Concept Solutions & Engineering CSI Cabletron System Inc CSM Cosmic Engineering Inc. CSO California Institute of Technology CSS CSS Laboratories CST CSTI Inc CTA CoSystems Inc CTC CTC Communication Development Company Ltd CTE Chunghwa Telecom Co., Ltd. CTL Creative Technology Ltd CTM Computerm Corporation CTN Computone Products CTP Computer Technology Corporation CTS Comtec Systems Co., Ltd. CTX Creatix Polymedia GmbH CUB Cubix Corporation CUK Calibre UK Ltd CVA Covia Inc. CVI Colorado Video, Inc. CVS Clarity Visual Systems CWR Connectware Inc CXT Conexant Systems CYB CyberVision CYC Cylink Corporation CYD Cyclades Corporation CYL Cyberlabs CYT Cytechinfo Inc CYV Cyviz AS CYW Cyberware CYX Cyrix Corporation CZE Carl Zeiss AG DAC Digital Acoustics Corporation DAE Digatron Industrie Elektronik GmbH DAI DAIS SET Ltd. DAK Daktronics DAL Digital Audio Labs Inc DAN Danelec Marine A/S DAS DAVIS AS DAT Datel Inc DAU Daou Tech Inc DAV Davicom Semiconductor Inc DAW DA2 Technologies Inc DAX Data Apex Ltd DBD Diebold Inc. DBI DigiBoard Inc DBK Databook Inc DBL Doble Engineering Company DBN DB Networks Inc DCA Digital Communications Association DCC Dale Computer Corporation DCD Datacast LLC DCE dSPACE GmbH DCI Concepts Inc DCL Dynamic Controls Ltd DCM DCM Data Products DCO Dialogue Technology Corporation DCR Decros Ltd DCS Diamond Computer Systems Inc DCT Dancall Telecom A/S DCV Datatronics Technology Inc DDA DA2 Technologies Corporation DDD Danka Data Devices DDE Datasat Digital Entertainment DDI Data Display AG DDS Barco, n.v. DDT Datadesk Technologies Inc DDV Delta Information Systems, Inc DEC Digital Equipment Corporation DEI Deico Electronics DEL Dell Inc. DEN Densitron Computers Ltd DEX idex displays DFI DFI DFK SharkTec A/S DFT DEI Holdings dba Definitive Technology DGA Digiital Arts Inc DGC Data General Corporation DGI DIGI International DGK DugoTech Co., LTD DGP Digicorp European sales S.A. DGS Diagsoft Inc DGT Dearborn Group Technology DGT The Dearborn Group DHP DH Print DHQ Quadram DHT Projectavision Inc DIA Diadem DIG Digicom S.p.A. DII Dataq Instruments Inc DIM dPict Imaging, Inc. DIN Daintelecom Co., Ltd DIS Diseda S.A. DIT Dragon Information Technology DJE Capstone Visual Product Development DJP Maygay Machines, Ltd DKY Datakey Inc DLB Dolby Laboratories Inc. DLC Diamond Lane Comm. Corporation DLG Digital-Logic GmbH DLK D-Link Systems Inc DLL Dell Inc DLT Digitelec Informatique Park Cadera DMB Digicom Systems Inc DMC Dune Microsystems Corporation DMM Dimond Multimedia Systems Inc DMP D&M Holdings Inc, Professional Business Company DMS DOME imaging systems DMT Distributed Management Task Force, Inc. (DMTF) DMV NDS Ltd DNA DNA Enterprises, Inc. DNG Apache Micro Peripherals Inc DNI Deterministic Networks Inc. DNT Dr. Neuhous Telekommunikation GmbH DNV DiCon DOL Dolman Technologies Group Inc DOM Dome Imaging Systems DON DENON, Ltd. DOT Dotronic Mikroelektronik GmbH DPA DigiTalk Pro AV DPC Delta Electronics Inc DPI DocuPoint DPL Digital Projection Limited DPM ADPM Synthesis sas DPS Digital Processing Systems DPT DPT DPX DpiX, Inc. DQB Datacube Inc DRB Dr. Bott KG DRC Data Ray Corp. DRD DIGITAL REFLECTION INC. DRI Data Race Inc DRS DRS Defense Solutions, LLC DSD DS Multimedia Pte Ltd DSI Digitan Systems Inc DSM DSM Digital Services GmbH DSP Domain Technology Inc DTA DELTATEC DTC DTC Tech Corporation DTE Dimension Technologies, Inc. DTI Diversified Technology, Inc. DTK Dynax Electronics (HK) Ltd DTL e-Net Inc DTN Datang Telephone Co DTO Deutsche Thomson OHG DTT Design & Test Technology, Inc. DTX Data Translation DUA Dosch & Amand GmbH & Company KG DUN NCR Corporation DVD Dictaphone Corporation DVL Devolo AG DVS Digital Video System DVT Data Video DWE Daewoo Electronics Company Ltd DXC Digipronix Control Systems DXD DECIMATOR DESIGN PTY LTD DXL Dextera Labs Inc DXP Data Expert Corporation DXS Signet DYC Dycam Inc DYM Dymo-CoStar Corporation DYN Askey Computer Corporation DYX Dynax Electronics (HK) Ltd EAS Evans and Sutherland Computer EBH Data Price Informatica EBT HUALONG TECHNOLOGY CO., LTD ECA Electro Cam Corp. ECC ESSential Comm. Corporation ECI Enciris Technologies ECK Eugene Chukhlomin Sole Proprietorship, d.b.a. ECL Excel Company Ltd ECM E-Cmos Tech Corporation ECO Echo Speech Corporation ECP Elecom Company Ltd ECS Elitegroup Computer Systems Company Ltd ECT Enciris Technologies EDC e.Digital Corporation EDG Electronic-Design GmbH EDI Edimax Tech. Company Ltd EDM EDMI EDT Emerging Display Technologies Corp EEE ET&T Technology Company Ltd EEH EEH Datalink GmbH EEP E.E.P.D. GmbH EES EE Solutions, Inc. EGA Elgato Systems LLC EGD EIZO GmbH Display Technologies EGL Eagle Technology EGN Egenera, Inc. EGO Ergo Electronics EHJ Epson Research EHN Enhansoft EIC Eicon Technology Corporation EKA MagTek Inc. EKC Eastman Kodak Company EKS EKSEN YAZILIM ELA ELAD srl ELC Electro Scientific Ind ELE Elecom Company Ltd ELG Elmeg GmbH Kommunikationstechnik ELI Edsun Laboratories ELL Electrosonic Ltd ELM Elmic Systems Inc ELO Elo TouchSystems Inc ELO Tyco Electronics ELS ELSA GmbH ELT Element Labs, Inc. ELX Elonex PLC EMB Embedded computing inc ltd EMC eMicro Corporation EME EMiNE TECHNOLOGY COMPANY, LTD. EMG EMG Consultants Inc EMI Ex Machina Inc EMK Emcore Corporation EMO ELMO COMPANY, LIMITED EMU Emulex Corporation ENC Eizo Nanao Corporation END ENIDAN Technologies Ltd ENE ENE Technology Inc. ENI Efficient Networks ENS Ensoniq Corporation ENT Enterprise Comm. & Computing Inc EPC Empac EPH Epiphan Systems Inc. EPI Envision Peripherals, Inc EPN EPiCON Inc. EPS KEPS EQP Equipe Electronics Ltd. EQX Equinox Systems Inc ERG Ergo System ERI Ericsson Mobile Communications AB ERN Ericsson, Inc. ERP Euraplan GmbH ERT Escort Insturments Corporation ESA Elbit Systems of America ESC Eden Sistemas de Computacao S/A ESD Ensemble Designs, Inc ESG ELCON Systemtechnik GmbH ESI Extended Systems, Inc. ESK ES&S ESL Esterline Technologies ESN eSATURNUS ESS ESS Technology Inc EST Embedded Solution Technology ESY E-Systems Inc ETC Everton Technology Company Ltd ETD ELAN MICROELECTRONICS CORPORATION ETH Etherboot Project ETI Eclipse Tech Inc ETK eTEK Labs Inc. ETL Evertz Microsystems Ltd. ETS Electronic Trade Solutions Ltd ETT E-Tech Inc EUT Ericsson Mobile Networks B.V. EVE Advanced Micro Peripherals Ltd EVI eviateg GmbH EVX Everex EXA Exabyte EXC Excession Audio EXI Exide Electronics EXN RGB Systems, Inc. dba Extron Electronics EXP Data Export Corporation EXT Exatech Computadores & Servicos Ltda EXX Exxact GmbH EXY Exterity Ltd EYE eyevis GmbH EZE EzE Technologies EZP Storm Technology FAR Farallon Computing FBI Interface Corporation FCB Furukawa Electric Company Ltd FCG First International Computer Ltd FCS Focus Enhancements, Inc. FDC Future Domain FDT Fujitsu Display Technologies Corp. FEC FURUNO ELECTRIC CO., LTD. FEL Fellowes & Questec FEN Fen Systems Ltd. FER Ferranti Int'L FFC FUJIFILM Corporation FFI Fairfield Industries FGD Lisa Draexlmaier GmbH FGL Fujitsu General Limited. FHL FHLP FIC Formosa Industrial Computing Inc FIL Forefront Int'l Ltd FIN Finecom Co., Ltd. FIR Chaplet Systems Inc FIS FLY-IT Simulators FIT Feature Integration Technology Inc. FJC Fujitsu Takamisawa Component Limited FJS Fujitsu Spain FJT F.J. Tieman BV FLE ADTI Media, Inc FLI Faroudja Laboratories FLY Butterfly Communications FMA Fast Multimedia AG FMC Ford Microelectronics Inc FMI Fellowes, Inc. FMI Fujitsu Microelect Inc FML Fujitsu Microelect Ltd FMZ Formoza-Altair FNC Fanuc LTD FNI Funai Electric Co., Ltd. FOA FOR-A Company Limited FOS Foss Tecator FOX HON HAI PRECISON IND.CO.,LTD. FPE Fujitsu Peripherals Ltd FPS Deltec Corporation FPX Cirel Systemes FRC Force Computers FRD Freedom Scientific BLV FRE Forvus Research Inc FRI Fibernet Research Inc FRO FARO Technologies FRS South Mountain Technologies, LTD FSC Future Systems Consulting KK FSI Fore Systems Inc FST Modesto PC Inc FTC Futuretouch Corporation FTE Frontline Test Equipment Inc. FTG FTG Data Systems FTI FastPoint Technologies, Inc. FTL FUJITSU TEN LIMITED FTN Fountain Technologies Inc FTR Mediasonic FTW MindTribe Product Engineering, Inc. FUJ Fujitsu Ltd FUN sisel muhendislik FUS Fujitsu Siemens Computers GmbH FVC First Virtual Corporation FVX C-C-C Group Plc FWA Attero Tech, LLC FWR Flat Connections Inc FXX Fuji Xerox FZC Founder Group Shenzhen Co. FZI FZI Forschungszentrum Informatik GAG Gage Applied Sciences Inc GAL Galil Motion Control GAU Gaudi Co., Ltd. GCC GCC Technologies Inc GCI Gateway Comm. Inc GCS Grey Cell Systems Ltd GDC General Datacom GDI G. Diehl ISDN GmbH GDS GDS GDT Vortex Computersysteme GmbH GED General Dynamics C4 Systems GEF GE Fanuc Embedded Systems GEH GE Intelligent Platforms - Huntsville GEM Gem Plus GEN Genesys ATE Inc GEO GEO Sense GER GERMANEERS GmbH GES GES Singapore Pte Ltd GET Getac Technology Corporation GFM GFMesstechnik GmbH GFN Gefen Inc. GGL Google Inc. GIC General Inst. Corporation GIM Guillemont International GIP GI Provision Ltd GIS AT&T Global Info Solutions GJN Grand Junction Networks GLD Goldmund - Digital Audio SA GLE AD electronics GLM Genesys Logic GLS Gadget Labs LLC GMK GMK Electronic Design GmbH GML General Information Systems GMM GMM Research Inc GMN GEMINI 2000 Ltd GMX GMX Inc GND Gennum Corporation GNN GN Nettest Inc GNZ Gunze Ltd GRA Graphica Computer GRE GOLD RAIN ENTERPRISES CORP. GRH Granch Ltd GRM Garmin International GRV Advanced Gravis GRY Robert Gray Company GSB NIPPONDENCHI CO,.LTD GSC General Standards Corporation GSM Goldstar Company Ltd GST Graphic SystemTechnology GSY Grossenbacher Systeme AG GTC Graphtec Corporation GTI Goldtouch GTK G-Tech Corporation GTM Garnet System Company Ltd GTS Geotest Marvin Test Systems Inc GTT General Touch Technology Co., Ltd. GUD Guntermann & Drunck GmbH GUZ Guzik Technical Enterprises GVC GVC Corporation GVL Global Village Communication GWI GW Instruments GWY Gateway 2000 GZE GUNZE Limited HAE Haider electronics HAI Haivision Systems Inc. HAL Halberthal HAN Hanchang System Corporation HAR Harris Corporation HAY Hayes Microcomputer Products Inc HCA DAT HCE Hitachi Consumer Electronics Co., Ltd HCL HCL America Inc HCM HCL Peripherals HCP Hitachi Computer Products Inc HCW Hauppauge Computer Works Inc HDC HardCom Elektronik & Datateknik HDI HD-INFO d.o.o. HDV Holografika kft. HEC Hisense Electric Co., Ltd. HEC Hitachi Engineering Company Ltd HEL Hitachi Micro Systems Europe Ltd HER Ascom Business Systems HET HETEC Datensysteme GmbH HHC HIRAKAWA HEWTECH CORP. HHI Fraunhofer Heinrich-Hertz-Institute HIB Hibino Corporation HIC Hitachi Information Technology Co., Ltd. HIK Hikom Co., Ltd. HIL Hilevel Technology HIQ Kaohsiung Opto Electronics Americas, Inc. HIT Hitachi America Ltd HJI Harris & Jeffries Inc HKA HONKO MFG. CO., LTD. HKG Josef Heim KG HMC Hualon Microelectric Corporation HMK hmk Daten-System-Technik BmbH HMX HUMAX Co., Ltd. HNS Hughes Network Systems HOB HOB Electronic GmbH HOE Hosiden Corporation HOL Holoeye Photonics AG HON Sonitronix HPA Zytor Communications HPC Hewlett Packard Co. HPD Hewlett Packard HPI Headplay, Inc. HPK HAMAMATSU PHOTONICS K.K. HPQ HP HPR H.P.R. Electronics GmbH HRC Hercules HRE Qingdao Haier Electronics Co., Ltd. HRI Hall Research HRL Herolab GmbH HRS Harris Semiconductor HRT HERCULES HSC Hagiwara Sys-Com Company Ltd HSD HannStar Display Corp HSM AT&T Microelectronics HSP HannStar Display Corp HTC Hitachi Ltd HTI Hampshire Company, Inc. HTK Holtek Microelectronics Inc HTX Hitex Systementwicklung GmbH HUB GAI-Tronics, A Hubbell Company HUM IMP Electronics Ltd. HWA Harris Canada Inc HWC DBA Hans Wedemeyer HWD Highwater Designs Ltd HWP Hewlett Packard HXM Hexium Ltd. HYC Hypercope Gmbh Aachen HYD Hydis Technologies.Co.,LTD HYO HYC CO., LTD. HYP Hyphen Ltd HYR Hypertec Pty Ltd HYT Heng Yu Technology (HK) Limited HYV Hynix Semiconductor IAF Institut f r angewandte Funksystemtechnik GmbH IAI Integration Associates, Inc. IAT IAT Germany GmbH IBC Integrated Business Systems IBI INBINE.CO.LTD IBM IBM Brasil IBM IBM France IBP IBP Instruments GmbH IBR IBR GmbH ICA ICA Inc ICC BICC Data Networks Ltd ICD ICD Inc ICE IC Ensemble ICI Infotek Communication Inc ICM Intracom SA ICN Sanyo Icon ICO Intel Corp ICP ICP Electronics, Inc./iEi Technology Corp. ICS Integrated Circuit Systems ICV Inside Contactless ICX ICCC A/S IDC International Datacasting Corporation IDE IDE Associates IDK IDK Corporation IDN Idneo Technologies IDO IDEO Product Development IDP Integrated Device Technology, Inc. IDS Interdigital Sistemas de Informacao IDT International Display Technology IDX IDEXX Labs IEC Interlace Engineering Corporation IEE IEE IEI Interlink Electronics IFS In Focus Systems Inc IFT Informtech IFX Infineon Technologies AG IFZ Infinite Z IGC Intergate Pty Ltd IGM IGM Communi IHE InHand Electronics IIC ISIC Innoscan Industrial Computers A/S III Intelligent Instrumentation IIN IINFRA Co., Ltd IKS Ikos Systems Inc ILC Image Logic Corporation ILS Innotech Corporation IMA Imagraph IMB ART s.r.l. IMC IMC Networks IMD ImasDe Canarias S.A. IME Imagraph IMG IMAGENICS Co., Ltd. IMI International Microsystems Inc IMM Immersion Corporation IMN Impossible Production IMP Impinj IMP Impression Products Incorporated IMT Inmax Technology Corporation INC Home Row Inc IND ILC INE Inventec Electronics (M) Sdn. Bhd. INF Inframetrics Inc ING Integraph Corporation INI Initio Corporation INK Indtek Co., Ltd. INL InnoLux Display Corporation INM InnoMedia Inc INN Innovent Systems, Inc. INO Innolab Pte Ltd INP Interphase Corporation INS Ines GmbH INT Interphase Corporation inu Inovatec S.p.A. INV Inviso, Inc. INX Communications Supply Corporation (A division of WESCO) INZ Best Buy IOA CRE Technology Corporation IOD I-O Data Device Inc IOM Iomega ION Inside Out Networks IOS i-O Display System IOT I/OTech Inc IPC IPC Corporation IPD Industrial Products Design, Inc. IPI Intelligent Platform Management Interface (IPMI) forum (Intel, HP, NEC, Dell) IPM IPM Industria Politecnica Meridionale SpA IPN Performance Technologies IPP IP Power Technologies GmbH IPR Ithaca Peripherals IPS IPS, Inc. (Intellectual Property Solutions, Inc.) IPT International Power Technologies IPW IPWireless, Inc IQI IneoQuest Technologies, Inc IQT IMAGEQUEST Co., Ltd IRD IRdata ISA Symbol Technologies ISC Id3 Semiconductors ISG Insignia Solutions Inc ISI Interface Solutions ISL Isolation Systems ISM Image Stream Medical ISP IntreSource Systems Pte Ltd ISR INSIS Co., LTD. ISS ISS Inc IST Intersolve Technologies ISY International Integrated Systems,Inc.(IISI) ITA Itausa Export North America ITC Intercom Inc ITD Internet Technology Corporation ITE Integrated Tech Express Inc ITK ITK Telekommunikation AG ITL Inter-Tel ITM ITM inc. ITN The NTI Group ITP IT-PRO Consulting und Systemhaus GmbH ITR Infotronic America, Inc. ITS IDTECH ITT I&T Telecom. ITX integrated Technology Express Inc IUC ICSL IVI Intervoice Inc IVM Iiyama North America IVS Intevac Photonics Inc. IWR Icuiti Corporation IWX Intelliworxx, Inc. IXD Intertex Data AB JAC Astec Inc JAE Japan Aviation Electronics Industry, Limited JAS Janz Automationssysteme AG JAT Jaton Corporation JAZ Carrera Computer Inc JCE Jace Tech Inc JDL Japan Digital Laboratory Co.,Ltd. JEN N-Vision JET JET POWER TECHNOLOGY CO., LTD. JFX Jones Futurex Inc JGD University College JIC Jaeik Information & Communication Co., Ltd. JKC JVC KENWOOD Corporation JMT Micro Technical Company Ltd JPC JPC Technology Limited JPW Wallis Hamilton Industries JQE CNet Technical Inc JSD JS DigiTech, Inc JSI Jupiter Systems, Inc. JSK SANKEN ELECTRIC CO., LTD JTS JS Motorsports JTY jetway security micro,inc JUK Janich & Klass Computertechnik GmbH JUP Jupiter Systems JVC JVC JWD Video International Inc. JWL Jewell Instruments, LLC JWS JWSpencer & Co. JWY Jetway Information Co., Ltd KAR Karna KBI Kidboard Inc KBL Kobil Systems GmbH KCD Chunichi Denshi Co.,LTD. KCL Keycorp Ltd KDE KDE KDK Kodiak Tech KDM Korea Data Systems Co., Ltd. KDS KDS USA KDT KDDI Technology Corporation KEC Kyushu Electronics Systems Inc KEM Kontron Embedded Modules GmbH KES Kesa Corporation KEY Key Tech Inc KFC SCD Tech KFE Komatsu Forest KFX Kofax Image Products KGL KEISOKU GIKEN Co.,Ltd. KIS KiSS Technology A/S KMC Mitsumi Company Ltd KME KIMIN Electronics Co., Ltd. KML Kensington Microware Ltd KNC Konica corporation KNX Nutech Marketing PTL KOB Kobil Systems GmbH KOD Eastman Kodak Company KOE KOLTER ELECTRONIC KOL Kollmorgen Motion Technologies Group KOU KOUZIRO Co.,Ltd. KOW KOWA Company,LTD. KPC King Phoenix Company KRL Krell Industries Inc. KRM Kroma Telecom KRY Kroy LLC KSC Kinetic Systems Corporation KSL Karn Solutions Ltd. KSX King Tester Corporation KTC Kingston Tech Corporation KTD Takahata Electronics Co.,Ltd. KTE K-Tech KTG Kayser-Threde GmbH KTI Konica Technical Inc KTK Key Tronic Corporation KTN Katron Tech Inc KUR Kurta Corporation KVA Kvaser AB KVX KeyView KWD Kenwood Corporation KYC Kyocera Corporation KYE KYE Syst Corporation KYK Samsung Electronics America Inc KZI K-Zone International co. Ltd. KZN K-Zone International LAB ACT Labs Ltd LAC LaCie LAF Microline LAG Laguna Systems LAN Sodeman Lancom Inc LAS LASAT Comm. A/S LAV Lava Computer MFG Inc LBO Lubosoft LCC LCI LCD Toshiba Matsushita Display Technology Co., Ltd LCE La Commande Electronique LCI Lite-On Communication Inc LCM Latitude Comm. LCN LEXICON LCS Longshine Electronics Company LCT Labcal Technologies LDT LogiDataTech Electronic GmbH LEC Lectron Company Ltd LED Long Engineering Design Inc LEG Legerity, Inc LEN Lenovo Group Limited LEO First International Computer Inc LEX Lexical Ltd LGC Logic Ltd LGI Logitech Inc LGS LG Semicom Company Ltd LGX Lasergraphics, Inc. LHA Lars Haagh ApS LHE Lung Hwa Electronics Company Ltd LHT Lighthouse Technologies Limited LIN Lenovo Beijing Co. Ltd. LIP Linked IP GmbH LIT Lithics Silicon Technology LJX Datalogic Corporation LKM Likom Technology Sdn. Bhd. LLL L-3 Communications LMG Lucent Technologies LMI Lexmark Int'l Inc LMP Leda Media Products LMT Laser Master LND Land Computer Company Ltd LNK Link Tech Inc LNR Linear Systems Ltd. LNT LANETCO International LNV Lenovo LOC Locamation B.V. LOE Loewe Opta GmbH LOG Logicode Technology Inc LOL Litelogic Operations Ltd LPE El-PUSK Co., Ltd. LPI Design Technology LPL LG Philips LSC LifeSize Communications LSD Intersil Corporation LSI Loughborough Sound Images LSJ LSI Japan Company Ltd LSL Logical Solutions LSY LSI Systems Inc LTC Labtec Inc LTI Jongshine Tech Inc LTK Lucidity Technology Company Ltd LTN Litronic Inc LTS LTS Scale LLC LTV Leitch Technology International Inc. LTW Lightware, Inc LUC Lucent Technologies LUM Lumagen, Inc. LUX Luxxell Research Inc LVI LVI Low Vision International AB LWC Labway Corporation LWR Lightware Visual Engineering LWW Lanier Worldwide LXC LXCO Technologies AG LXN Luxeon LXS ELEA CardWare LZX Lightwell Company Ltd MAC MAC System Company Ltd MAD Xedia Corporation MAE Maestro Pty Ltd MAG MAG InnoVision MAI Mutoh America Inc MAL Meridian Audio Ltd MAN LGIC MAS Mass Inc. MAT Matsushita Electric Ind. Company Ltd MAX Rogen Tech Distribution Inc MAY Maynard Electronics MAZ MAZeT GmbH MBC MBC MBD Microbus PLC MBM Marshall Electronics MBV Moreton Bay MCA American Nuclear Systems Inc MCC Micro Industries MCD McDATA Corporation MCE Metz-Werke GmbH & Co KG MCG Motorola Computer Group MCI Micronics Computers MCL Motorola Communications Israel MCM Metricom Inc MCN Micron Electronics Inc MCO Motion Computing Inc. MCP Magni Systems Inc MCQ Mat's Computers MCR Marina Communicaitons MCS Micro Computer Systems MCT Microtec MDA Media4 Inc MDC Midori Electronics MDD MODIS MDG Madge Networks MDI Micro Design Inc MDK Mediatek Corporation MDO Panasonic MDR Medar Inc MDS Micro Display Systems Inc MDT Magus Data Tech MDV MET Development Inc MDX MicroDatec GmbH MDY Microdyne Inc MEC Mega System Technologies Inc MED Messeltronik Dresden GmbH MEE Mitsubishi Electric Engineering Co., Ltd. MEG Abeam Tech Ltd MEI Panasonic Industry Company MEJ Mac-Eight Co., LTD. MEL Mitsubishi Electric Corporation MEN MEN Mikroelectronik Nueruberg GmbH MEP Meld Technology MEQ Matelect Ltd. MET Metheus Corporation MEX MSC Vertriebs GmbH MFG MicroField Graphics Inc MFI Micro Firmware MFR MediaFire Corp. MGA Mega System Technologies, Inc. MGC Mentor Graphics Corporation MGE Schneider Electric S.A. MGL M-G Technology Ltd MGT Megatech R & D Company MIC Micom Communications Inc MID miro Displays MII Mitec Inc MIL Marconi Instruments Ltd MIM Mimio – A Newell Rubbermaid Company MIN Minicom Digital Signage MIP micronpc.com MIR Miro Computer Prod. MIS Modular Industrial Solutions Inc MIT MCM Industrial Technology GmbH MJI MARANTZ JAPAN, INC. MJS MJS Designs MKC Media Tek Inc. MKT MICROTEK Inc. MKV Trtheim Technology MLD Deep Video Imaging Ltd MLG Micrologica AG MLI McIntosh Laboratory Inc. MLM Millennium Engineering Inc MLN Mark Levinson MLS Milestone EPE MLX Mylex Corporation MMA Micromedia AG MMD Micromed Biotecnologia Ltd MMF Minnesota Mining and Manufacturing MMI Multimax MMM Electronic Measurements MMN MiniMan Inc MMS MMS Electronics MNC Mini Micro Methods Ltd MNL Monorail Inc MNP Microcom MOD Modular Technology MOM Momentum Data Systems MOS Moses Corporation MOT Motorola UDS MPC M-Pact Inc MPI Mediatrix Peripherals Inc MPJ Microlab MPL Maple Research Inst. Company Ltd MPN Mainpine Limited MPS mps Software GmbH MPX Micropix Technologies, Ltd. MQP MultiQ Products AB MRA Miranda Technologies Inc MRC Marconi Simulation & Ty-Coch Way Training MRD MicroDisplay Corporation MRK Maruko & Company Ltd MRL Miratel MRO Medikro Oy MRT Merging Technologies MSA Micro Systemation AB MSC Mouse Systems Corporation MSD Datenerfassungs- und Informationssysteme MSF M-Systems Flash Disk Pioneers MSG MSI GmbH MSH Microsoft MSI Microstep MSK Megasoft Inc MSL MicroSlate Inc. MSM Advanced Digital Systems MSP Mistral Solutions [P] Ltd. MSR MASPRO DENKOH Corp. MST MS Telematica MSU motorola MSV Mosgi Corporation MSX Micomsoft Co., Ltd. MSY MicroTouch Systems Inc MTB Media Technologies Ltd. MTC Mars-Tech Corporation MTD MindTech Display Co. Ltd MTE MediaTec GmbH MTH Micro-Tech Hearing Instruments MTI MaxCom Technical Inc MTI Motorola Inc. MTK Microtek International Inc. MTL Mitel Corporation MTM Motium MTN Mtron Storage Technology Co., Ltd. MTR Mitron computer Inc MTS Multi-Tech Systems MTU Mark of the Unicorn Inc MTX Matrox MUD Multi-Dimension Institute MUK mainpine limited MVD Microvitec PLC MVI Media Vision Inc MVM SOBO VISION MVS Microvision MVX COM 1 MWI Multiwave Innovation Pte Ltd MWR mware MWY Microway Inc MXD MaxData Computer GmbH & Co.KG MXI Macronix Inc MXL Hitachi Maxell, Ltd. MXP Maxpeed Corporation MXT Maxtech Corporation MXV MaxVision Corporation MYA Monydata MYR Myriad Solutions Ltd MYX Micronyx Inc NAC Ncast Corporation NAD NAD Electronics NAK Nakano Engineering Co.,Ltd. NAL Network Alchemy NAT NaturalPoint Inc. NAV Navigation Corporation NAX Naxos Tecnologia NBL N*Able Technologies Inc NBS National Key Lab. on ISN NBT NingBo Bestwinning Technology CO., Ltd NCA Nixdorf Company NCC NCR Corporation NCE Norcent Technology, Inc. NCI NewCom Inc NCL NetComm Ltd NCR NCR Electronics NCS Northgate Computer Systems NCT NEC CustomTechnica, Ltd. NDC National DataComm Corporaiton NDI National Display Systems NDK Naitoh Densei CO., LTD. NDL Network Designers NDS Nokia Data NEC NEC Corporation NEO NEO TELECOM CO.,LTD. NET Mettler Toledo NEU NEUROTEC - EMPRESA DE PESQUISA E DESENVOLVIMENTO EM BIOMEDICINA NEX Nexgen Mediatech Inc., NFC BTC Korea Co., Ltd NFS Number Five Software NGC Network General NGS A D S Exports NHT Vinci Labs NIC National Instruments Corporation NIS Nissei Electric Company NIT Network Info Technology NIX Seanix Technology Inc NLC Next Level Communications NME Navico, Inc. NMP Nokia Mobile Phones NMS Natural Micro System NMV NEC-Mitsubishi Electric Visual Systems Corporation NMX Neomagic NNC NNC NOE NordicEye AB NOI North Invent A/S NOK Nokia Display Products NOR Norand Corporation NOT Not Limited Inc NPI Network Peripherals Inc NRL U.S. Naval Research Lab NRT Beijing Northern Radiantelecom Co. NRV Taugagreining hf NSC National Semiconductor Corporation NSI NISSEI ELECTRIC CO.,LTD NSP Nspire System Inc. NSS Newport Systems Solutions NST Network Security Technology Co NTC NeoTech S.R.L NTI New Tech Int'l Company NTL National Transcomm. Ltd NTN Nuvoton Technology Corporation NTR N-trig Innovative Technologies, Inc. NTS Nits Technology Inc. NTT NTT Advanced Technology Corporation NTW Networth Inc NTX Netaccess Inc NUG NU Technology, Inc. NUI NU Inc. NVC NetVision Corporation NVD Nvidia NVI NuVision US, Inc. NVL Novell Inc NVT Navatek Engineering Corporation NWC NW Computer Engineering NWP NovaWeb Technologies Inc NWS Newisys, Inc. NXC NextCom K.K. NXG Nexgen NXP NXP Semiconductors bv. NXQ Nexiq Technologies, Inc. NXS Technology Nexus Secure Open Systems AB NYC nakayo telecommunications,inc. OAK Oak Tech Inc OAS Oasys Technology Company OBS Optibase Technologies OCD Macraigor Systems Inc OCN Olfan OCS Open Connect Solutions ODM ODME Inc. ODR Odrac OEC ORION ELECTRIC CO.,LTD OEI Optum Engineering Inc. OIC Option Industrial Computers OIM Option International OIN Option International OKI OKI Electric Industrial Company Ltd OLC Olicom A/S OLD Olidata S.p.A. OLI Olivetti OLT Olitec S.A. OLV Olitec S.A. OLY OLYMPUS CORPORATION OMC OBJIX Multimedia Corporation OMN Omnitel OMR Omron Corporation ONE Oneac Corporation ONK ONKYO Corporation ONL OnLive, Inc ONS On Systems Inc ONW OPEN Networks Ltd ONX SOMELEC Z.I. Du Vert Galanta OOS OSRAM OPC Opcode Inc OPI D.N.S. Corporation OPP OPPO Digital, Inc. OPT OPTi Inc OPV Optivision Inc OQI Oksori Company Ltd ORG ORGA Kartensysteme GmbH ORI OSR Open Systems Resources, Inc. ORN ORION ELECTRIC CO., LTD. OSA OSAKA Micro Computer, Inc. OSP OPTI-UPS Corporation OSR Oksori Company Ltd OTB outsidetheboxstuff.com OTI Orchid Technology OTM Optoma Corporation OTT OPTO22, Inc. OUK OUK Company Ltd OVR Oculus VR, Inc. OWL Mediacom Technologies Pte Ltd OXU Oxus Research S.A. OYO Shadow Systems OZC OZ Corporation OZO Tribe Computer Works Inc PAC Pacific Avionics Corporation PAD Promotion and Display Technology Ltd. PAK Many CNC System Co., Ltd. PAM Peter Antesberger Messtechnik PAN The Panda Project PAR Parallan Comp Inc PBI Pitney Bowes PBL Packard Bell Electronics PBN Packard Bell NEC PBV Pitney Bowes PCA Philips BU Add On Card PCB OCTAL S.A. PCC PowerCom Technology Company Ltd PCG First Industrial Computer Inc PCI Pioneer Computer Inc PCK PCBANK21 PCL pentel.co.,ltd PCM PCM Systems Corporation PCO Performance Concepts Inc., PCP Procomp USA Inc PCS TOSHIBA PERSONAL COMPUTER SYSTEM CORPRATION PCT PC-Tel Inc PCW Pacific CommWare Inc PCX PC Xperten PDM Psion Dacom Plc. PDN AT&T Paradyne PDR Pure Data Inc PDS PD Systems International Ltd PDT PDTS - Prozessdatentechnik und Systeme PDV Prodrive B.V. PEC POTRANS Electrical Corp. PEI PEI Electronics Inc PEL Primax Electric Ltd PEN Interactive Computer Products Inc PEP Peppercon AG PER Perceptive Signal Technologies PET Practical Electronic Tools PFT Telia ProSoft AB PGI PACSGEAR, Inc. PGM Paradigm Advanced Research Centre PGP propagamma kommunikation PGS Princeton Graphic Systems PHC Pijnenburg Beheer N.V. PHE Philips Medical Systems Boeblingen GmbH PHI DO NOT USE - PHI PHL Philips Consumer Electronics Company PHO Photonics Systems Inc. PHS Philips Communication Systems PHY Phylon Communications PIE Pacific Image Electronics Company Ltd PIM Prism, LLC PIO Pioneer Electronic Corporation PIX Pixie Tech Inc PJA Projecta PJD Projectiondesign AS PJT Pan Jit International Inc. PKA Acco UK ltd. PLC Pro-Log Corporation PLF Panasonic Avionics Corporation PLM PROLINK Microsystems Corp. PLT PT Hartono Istana Teknologi PLV PLUS Vision Corp. PLX Parallax Graphics PLY Polycom Inc. PMC PMC Consumer Electronics Ltd PMD TDK USA Corporation PMM Point Multimedia System PMT Promate Electronic Co., Ltd. PMX Photomatrix PNG Microsoft PNG P.I. Engineering Inc PNL Panelview, Inc. PNP Microsoft PNR Planar Systems, Inc. PNS PanaScope PNX Phoenix Technologies, Ltd. POL PolyComp (PTY) Ltd. PON Perpetual Technologies, LLC POR Portalis LC PPC Phoenixtec Power Company Ltd PPD MEPhI PPI Practical Peripherals PPM Clinton Electronics Corp. PPP Purup Prepress AS PPR PicPro PPX Perceptive Pixel Inc. PQI Pixel Qi PRA PRO/AUTOMATION PRC PerComm PRD Praim S.R.L. PRF Digital Electronics Corporation PRG The Phoenix Research Group Inc PRI Priva Hortimation BV PRM Prometheus PRO Proteon PRS Leutron Vision PRT Parade Technologies, Ltd. PRX Proxima Corporation PSA Advanced Signal Processing Technologies PSC Philips Semiconductors PSD Peus-Systems GmbH PSE Practical Solutions Pte., Ltd. PSI PSI-Perceptive Solutions Inc PSL Perle Systems Limited PSM Prosum PST Global Data SA PSY Prodea Systems Inc. PTA PAR Tech Inc. PTC PS Technology Corporation PTG Cipher Systems Inc PTH Pathlight Technology Inc PTI Promise Technology Inc PTL Pantel Inc PTS Plain Tree Systems Inc PTW DO NOT USE - PTW PUL Pulse-Eight Ltd PVC DO NOT USE - PVC PVG Proview Global Co., Ltd PVI Prime view international Co., Ltd PVM Penta Studiotechnik GmbH PVN Pixel Vision PVP Klos Technologies, Inc. PXC Phoenix Contact PXE PIXELA CORPORATION PXL The Moving Pixel Company PXM Proxim Inc QCC QuakeCom Company Ltd QCH Metronics Inc QCI Quanta Computer Inc QCK Quick Corporation QCL Quadrant Components Inc QCP Qualcomm Inc QDI Quantum Data Incorporated QDM Quadram QDS Quanta Display Inc. QFF Padix Co., Inc. QFI Quickflex, Inc QLC Q-Logic QQQ Chuomusen Co., Ltd. QSI Quantum Solutions, Inc. QTD Quantum 3D Inc QTH Questech Ltd QTI Quicknet Technologies Inc QTM Quantum QTR Qtronix Corporation QUA Quatographic AG QUE Questra Consulting QVU Quartics RAC Racore Computer Products Inc RAD Radisys Corporation RAI Rockwell Automation/Intecolor RAN Rancho Tech Inc RAR Raritan, Inc. RAS RAScom Inc RAT Rent-A-Tech RAY Raylar Design, Inc. RCE Parc d'Activite des Bellevues RCH Reach Technology Inc RCI RC International RCN Radio Consult SRL RCO Rockwell Collins RDI Rainbow Displays, Inc. RDM Tremon Enterprises Company Ltd RDN RADIODATA GmbH RDS Radius Inc REA Real D REC ReCom RED Research Electronics Development Inc REF Reflectivity, Inc. REH Rehan Electronics Ltd. REL Reliance Electric Ind Corporation REM SCI Systems Inc. REN Renesas Technology Corp. RES ResMed Pty Ltd RET Resonance Technology, Inc. REX RATOC Systems, Inc. RGB RGB Spectrum RGL Robertson Geologging Ltd RHD RightHand Technologies RHM Rohm Company Ltd RHT Red Hat, Inc. RIC RICOH COMPANY, LTD. RII Racal Interlan Inc RIO Rios Systems Company Ltd RIT Ritech Inc RIV Rivulet Communications RJA Roland Corporation RJS Advanced Engineering RKC Reakin Technolohy Corporation RLD MEPCO RLN RadioLAN Inc RMC Raritan Computer, Inc RMP Research Machines RMT Roper Mobile RNB Rainbow Technologies ROB Robust Electronics GmbH ROH Rohm Co., Ltd. ROK Rockwell International ROP Roper International Ltd ROS Rohde & Schwarz RPI RoomPro Technologies RPT R.P.T.Intergroups RRI Radicom Research Inc RSC PhotoTelesis RSH ADC-Centre RSI Rampage Systems Inc RSN Radiospire Networks, Inc. RSQ R Squared RSS Rockwell Semiconductor Systems RSV Ross Video Ltd RSX Rapid Tech Corporation RTC Relia Technologies RTI Rancho Tech Inc RTK DO NOT USE - RTK RTL Realtek Semiconductor Company Ltd RTS Raintree Systems RUN RUNCO International RUP Ups Manufactoring s.r.l. RVC RSI Systems Inc RVI Realvision Inc RVL Reveal Computer Prod RWC Red Wing Corporation RXT Tectona SoftSolutions (P) Ltd., SAA Sanritz Automation Co.,Ltd. SAE Saab Aerotech SAG Sedlbauer SAI Sage Inc SAK Saitek Ltd SAM Samsung Electric Company SAN Sanyo Electric Co.,Ltd. SAS Stores Automated Systems Inc SAT Shuttle Tech SBC Shanghai Bell Telephone Equip Mfg Co SBD Softbed - Consulting & Development Ltd SBI SMART Technologies Inc. SBS SBS-or Industrial Computers GmbH SBT Senseboard Technologies AB SCB SeeCubic B.V. SCC SORD Computer Corporation SCD Sanyo Electric Company Ltd SCE Sun Corporation SCH Schlumberger Cards SCI System Craft SCL Sigmacom Co., Ltd. SCM SCM Microsystems Inc SCN Scanport, Inc. SCO SORCUS Computer GmbH SCP Scriptel Corporation SCR Systran Corporation SCS Nanomach Anstalt SCT Smart Card Technology SDA SAT (Societe Anonyme) SDD Intrada-SDD Ltd SDE Sherwood Digital Electronics Corporation SDF SODIFF E&T CO., Ltd. SDH Communications Specialies, Inc. SDI Samtron Displays Inc SDK SAIT-Devlonics SDR SDR Systems SDS SunRiver Data System SDT Siemens AG SDX SDX Business Systems Ltd SEA Seanix Technology Inc. SEB system elektronik GmbH SEC Seiko Epson Corporation SEE SeeColor Corporation SEG DO NOT USE - SEG SEI Seitz & Associates Inc SEL Way2Call Communications SEM Samsung Electronics Company Ltd SEN Sencore SEO SEOS Ltd SEP SEP Eletronica Ltda. SER Sony Ericsson Mobile Communications Inc. SES Session Control LLC SET SendTek Corporation SFM TORNADO Company SFT Mikroforum Ring 3 SGC Spectragraphics Corporation SGD Sigma Designs, Inc. SGE Kansai Electric Company Ltd SGI Scan Group Ltd SGL Super Gate Technology Company Ltd SGM SAGEM SGO Logos Design A/S SGT Stargate Technology SGW Shanghai Guowei Science and Technology Co., Ltd. SGX Silicon Graphics Inc SGZ Systec Computer GmbH SHC ShibaSoku Co., Ltd. SHG Soft & Hardware development Goldammer GmbH SHI Jiangsu Shinco Electronic Group Co., Ltd SHP Sharp Corporation SHR Digital Discovery SHT Shin Ho Tech SIA SIEMENS AG SIB Sanyo Electric Company Ltd SIC Sysmate Corporation SID Seiko Instruments Information Devices Inc SIE Siemens SIG Sigma Designs Inc SII Silicon Image, Inc. SIL Silicon Laboratories, Inc SIM S3 Inc SIN Singular Technology Co., Ltd. SIR Sirius Technologies Pty Ltd SIS Silicon Integrated Systems Corporation SIT Sitintel SIU Seiko Instruments USA Inc SIX Zuniq Data Corporation SJE Sejin Electron Inc SKD Schneider & Koch SKT Samsung Electro-Mechanics Company Ltd SKY SKYDATA S.P.A. SLA Systeme Lauer GmbH&Co KG SLB Shlumberger Ltd SLC Syslogic Datentechnik AG SLF StarLeaf SLH Silicon Library Inc. SLI Symbios Logic Inc SLK Silitek Corporation SLM Solomon Technology Corporation SLR Schlumberger Technology Corporate SLS Schnick-Schnack-Systems GmbH SLT Salt Internatioinal Corp. SLX Specialix SMA SMART Modular Technologies SMB Schlumberger SMC Standard Microsystems Corporation SME Sysmate Company SMI SpaceLabs Medical Inc SMK SMK CORPORATION SML Sumitomo Metal Industries, Ltd. SMM Shark Multimedia Inc SMO STMicroelectronics SMP Simple Computing SMR B.& V. s.r.l. SMS Silicom Multimedia Systems Inc SMT Silcom Manufacturing Tech Inc SNC Sentronic International Corp. SNI Siemens Microdesign GmbH SNK S&K Electronics SNO SINOSUN TECHNOLOGY CO., LTD SNP Siemens Nixdorf Info Systems SNS Cirtech (UK) Ltd SNT SuperNet Inc SNW Snell & Wilcox SNX Sonix Comm. Ltd SNY Sony SOI Silicon Optix Corporation SOL Solitron Technologies Inc SON Sony SOR Sorcus Computer GmbH SOT Sotec Company Ltd SOY SOYO Group, Inc SPC SpinCore Technologies, Inc SPE SPEA Software AG SPH G&W Instruments GmbH SPI SPACE-I Co., Ltd. SPK SpeakerCraft SPL Smart Silicon Systems Pty Ltd SPN Sapience Corporation SPR pmns GmbH SPS Synopsys Inc SPT Sceptre Tech Inc SPU SIM2 Multimedia S.P.A. SPX Simplex Time Recorder Co. SQT Sequent Computer Systems Inc SRC Integrated Tech Express Inc SRD Setred SRF Surf Communication Solutions Ltd SRG Intuitive Surgical, Inc. SRS SR-Systems e.K. SRT SeeReal Technologies GmbH SSC Sierra Semiconductor Inc SSD FlightSafety International SSE Samsung Electronic Co. SSI S-S Technology Inc SSJ Sankyo Seiki Mfg.co., Ltd SSP Spectrum Signal Proecessing Inc SSS S3 Inc SST SystemSoft Corporation STA ST Electronics Systems Assembly Pte Ltd STB STB Systems Inc STC STAC Electronics STD STD Computer Inc STE SII Ido-Tsushin Inc STF Starflight Electronics STG StereoGraphics Corp. STH Semtech Corporation STI Smart Tech Inc STK SANTAK CORP. STL SigmaTel Inc STM SGS Thomson Microelectronics STN Samsung Electronics America STO Stollmann E+V GmbH STP StreamPlay Ltd STR Starlight Networks Inc STS SITECSYSTEM CO., LTD. STT Star Paging Telecom Tech (Shenzhen) Co. Ltd. STU Sentelic Corporation STW Starwin Inc. STX ST-Ericsson STY SDS Technologies SUB Subspace Comm. Inc SUM Summagraphics Corporation SUN Sun Electronics Corporation SUP Supra Corporation SUR Surenam Computer Corporation SVA SGEG SVC Intellix Corp. SVD SVD Computer SVI Sun Microsystems SVS SVSI SVT SEVIT Co., Ltd. SWC Software Café SWI Sierra Wireless Inc. SWL Sharedware Ltd SWS Static SWT Software Technologies Group,Inc. SXB Syntax-Brillian SXD Silex technology, Inc. SXG SELEX GALILEO SXL SolutionInside SXT SHARP TAKAYA ELECTRONIC INDUSTRY CO.,LTD. SYC Sysmic SYE SY Electronics Ltd SYK Stryker Communications SYL Sylvania Computer Products SYM Symicron Computer Communications Ltd. SYN Synaptics Inc SYP SYPRO Co Ltd SYS Sysgration Ltd SYT Seyeon Tech Company Ltd SYV SYVAX Inc SYX Prime Systems, Inc. TAA Tandberg TAB Todos Data System AB TAG Teles AG TAI Toshiba America Info Systems Inc TAM Tamura Seisakusyo Ltd TAS Taskit Rechnertechnik GmbH TAT Teleliaison Inc TAX Taxan (Europe) Ltd TBB Triple S Engineering Inc TBC Turbo Communication, Inc TBS Turtle Beach System TCC Tandon Corporation TCD Taicom Data Systems Co., Ltd. TCE Century Corporation TCH Interaction Systems, Inc TCI Tulip Computers Int'l B.V. TCJ TEAC America Inc TCL Technical Concepts Ltd TCM 3Com Corporation TCN Tecnetics (PTY) Ltd TCO Thomas-Conrad Corporation TCR Thomson Consumer Electronics TCS Tatung Company of America Inc TCT Telecom Technology Centre Co. Ltd. TCX FREEMARS Heavy Industries TDC Teradici TDD Tandberg Data Display AS TDK TDK USA Corporation TDM Tandem Computer Europe Inc TDP 3D Perception TDS Tri-Data Systems Inc TDT TDT TDV TDVision Systems, Inc. TDY Tandy Electronics TEA TEAC System Corporation TEC Tecmar Inc TEK Tektronix Inc TEL Promotion and Display Technology Ltd. TER TerraTec Electronic GmbH TGC Toshiba Global Commerce Solutions, Inc. TGI TriGem Computer Inc TGM TriGem Computer,Inc. TGS Torus Systems Ltd TGV Grass Valley Germany GmbH THN Thundercom Holdings Sdn. Bhd. TIC Trigem KinfoComm TIP TIPTEL AG TIV OOO Technoinvest TIX Tixi.Com GmbH TKC Taiko Electric Works.LTD TKN Teknor Microsystem Inc TKO TouchKo, Inc. TKS TimeKeeping Systems, Inc. TLA Ferrari Electronic GmbH TLD Telindus TLF Teleforce.,co,ltd TLI TOSHIBA TELI CORPORATION TLK Telelink AG TLS Teleste Educational OY TLT Dai Telecom S.p.A. TLV S3 Inc TLX Telxon Corporation TMC Techmedia Computer Systems Corporation TME AT&T Microelectronics TMI Texas Microsystem TMM Time Management, Inc. TMR Taicom International Inc TMS Trident Microsystems Ltd TMT T-Metrics Inc. TMX Thermotrex Corporation TNC TNC Industrial Company Ltd TNJ DO NOT USE - TNJ TNM TECNIMAGEN SA TNY Tennyson Tech Pty Ltd TOE TOEI Electronics Co., Ltd. TOG The OPEN Group TON TONNA TOP Orion Communications Co., Ltd. TOS Toshiba Corporation TOU Touchstone Technology TPC Touch Panel Systems Corporation TPE Technology Power Enterprises Inc TPJ Junnila TPK TOPRE CORPORATION TPR Topro Technology Inc TPS Teleprocessing Systeme GmbH TPT Thruput Ltd TPV Top Victory Electronics ( Fujian ) Company Ltd TPZ Ypoaz Systems Inc TRA TriTech Microelectronics International TRC Trioc AB TRD Trident Microsystem Inc TRE Tremetrics TRI Tricord Systems TRL Royal Information TRM Tekram Technology Company Ltd TRN Datacommunicatie Tron B.V. TRS Torus Systems Ltd TRT Tritec Electronic AG TRU Aashima Technology B.V. TRV Trivisio Prototyping GmbH TRX Trex Enterprises TSB Toshiba America Info Systems Inc TSC Sanyo Electric Company Ltd TSD TechniSat Digital GmbH TSE Tottori Sanyo Electric TSF Racal-Airtech Software Forge Ltd TSG The Software Group Ltd TSI TeleVideo Systems TSL Tottori SANYO Electric Co., Ltd. TSP U.S. Navy TST Transtream Inc TSV TRANSVIDEO TSY TouchSystems TTA Topson Technology Co., Ltd. TTB National Semiconductor Japan Ltd TTC Telecommunications Techniques Corporation TTE TTE, Inc. TTI Trenton Terminals Inc TTK Totoku Electric Company Ltd TTL 2-Tel B.V. TTS TechnoTrend Systemtechnik GmbH TTY TRIDELITY Display Solutions GmbH TUA T+A elektroakustik GmbH TUT Tut Systems TVD Tecnovision TVI Truevision TVM Taiwan Video & Monitor Corporation TVO TV One Ltd TVR TV Interactive Corporation TVS TVS Electronics Limited TVV TV1 GmbH TWA Tidewater Association TWE Kontron Electronik TWH Twinhead International Corporation TWI Easytel oy TWK TOWITOKO electronics GmbH TWX TEKWorx Limited TXL Trixel Ltd TXN Texas Insturments TXT Textron Defense System TYN Tyan Computer Corporation UAS Ultima Associates Pte Ltd UBI Ungermann-Bass Inc UBL Ubinetics Ltd. UDN Uniden Corporation UEC Ultima Electronics Corporation UEG Elitegroup Computer Systems Company Ltd UEI Universal Electronics Inc UET Universal Empowering Technologies UFG UNIGRAF-USA UFO UFO Systems Inc UHB XOCECO UIC Uniform Industrial Corporation UJR Ueda Japan Radio Co., Ltd. ULT Ultra Network Tech UMC United Microelectr Corporation UMG Umezawa Giken Co.,Ltd UMM Universal Multimedia UNA Unisys DSD UNB Unisys Corporation UNC Unisys Corporation UND Unisys Corporation UNE Unisys Corporation UNF Unisys Corporation UNI Uniform Industry Corp. UNI Unisys Corporation UNM Unisys Corporation UNO Unisys Corporation UNP Unitop UNS Unisys Corporation UNT Unisys Corporation UNY Unicate UPP UPPI UPS Systems Enhancement URD Video Computer S.p.A. USA Utimaco Safeware AG USD U.S. Digital Corporation USI Universal Scientific Industrial Co., Ltd. USR U.S. Robotics Inc UTD Up to Date Tech UWC Uniwill Computer Corp. VAD Vaddio, LLC VAL Valence Computing Corporation VAR Varian Australia Pty Ltd VBR VBrick Systems Inc. VBT Valley Board Ltda VCC Virtual Computer Corporation VCI VistaCom Inc VCJ Victor Company of Japan, Limited VCM Vector Magnetics, LLC VCX VCONEX VDA Victor Data Systems VDC VDC Display Systems VDM Vadem VDO Video & Display Oriented Corporation VDS Vidisys GmbH & Company VDT Viditec, Inc. VEC Vector Informatik GmbH VEK Vektrex VES Vestel Elektronik Sanayi ve Ticaret A. S. VFI VeriFone Inc VHI Macrocad Development Inc. VIA VIA Tech Inc VIB Tatung UK Ltd VIC Victron B.V. VID Ingram Macrotron Germany VIK Viking Connectors VIM Via Mons Ltd. VIN Vine Micros Ltd VIR Visual Interface, Inc VIS Visioneer VIT Visitech AS VIZ VIZIO, Inc VLB ValleyBoard Ltda. VLK Vislink International Ltd VLT VideoLan Technologies VMI Vermont Microsystems VML Vine Micros Limited VMW VMware Inc., VNC Vinca Corporation VOB MaxData Computer AG VPI Video Products Inc VPR Best Buy VQ@ Vision Quest VRC Virtual Resources Corporation VSC ViewSonic Corporation VSD 3M VSI VideoServer VSN Ingram Macrotron VSP Vision Systems GmbH VSR V-Star Electronics Inc. VTC VTel Corporation VTG Voice Technologies Group Inc VTI VLSI Tech Inc VTK Viewteck Co., Ltd. VTL Vivid Technology Pte Ltd VTM Miltope Corporation VTN VIDEOTRON CORP. VTS VTech Computers Ltd VTV VATIV Technologies VTX Vestax Corporation VUT Vutrix (UK) Ltd VWB Vweb Corp. WAC Wacom Tech WAL Wave Access WAN DO NOT USE - WAN WAV Wavephore WBN MicroSoftWare WBS WB Systemtechnik GmbH WCI Wisecom Inc WCS Woodwind Communications Systems Inc WDC Western Digital WDE Westinghouse Digital Electronics WEB WebGear Inc WEC Winbond Electronics Corporation WEL W-DEV WEY WEY Design AG WHI Whistle Communications WII Innoware Inc WIL WIPRO Information Technology Ltd WIN Wintop Technology Inc WIP Wipro Infotech WKH Uni-Take Int'l Inc. WLD Wildfire Communications Inc WML Wolfson Microelectronics Ltd WMO Westermo Teleindustri AB WMT Winmate Communication Inc WNI WillNet Inc. WNV Winnov L.P. WNX Wincor Nixdorf International GmbH WPA Matsushita Communication Industrial Co., Ltd. WPI Wearnes Peripherals International (Pte) Ltd WRC WiNRADiO Communications WSC CIS Technology Inc WSP Wireless And Smart Products Inc. WST Wistron Corporation WTC ACC Microelectronics WTI WorkStation Tech WTK Wearnes Thakral Pte WTS Restek Electric Company Ltd WVM Wave Systems Corporation WVV WolfVision GmbH WWV World Wide Video, Inc. WXT Woxter Technology Co. Ltd WYS Wyse Technology WYT Wooyoung Image & Information Co.,Ltd. XAC XAC Automation Corp XAD Alpha Data XDM XDM Ltd. XER DO NOT USE - XER XFG Jan Strapko - FOTO XFO EXFO Electro Optical Engineering XIN Xinex Networks Inc XIO Xiotech Corporation XIR Xirocm Inc XIT Xitel Pty ltd XLX Xilinx, Inc. XMM C3PO S.L. XNT XN Technologies, Inc. XOC DO NOT USE - XOC XQU SHANGHAI SVA-DAV ELECTRONICS CO., LTD XRC Xircom Inc XRO XORO ELECTRONICS (CHENGDU) LIMITED XSN Xscreen AS XST XS Technologies Inc XSY XSYS XTD Icuiti Corporation XTE X2E GmbH XTL Crystal Computer XTN X-10 (USA) Inc XYC Xycotec Computer GmbH YED Y-E Data Inc YHQ Yokogawa Electric Corporation YHW Exacom SA YMH Yamaha Corporation YOW American Biometric Company ZAN Zandar Technologies plc ZAX Zefiro Acoustics ZAZ Zazzle Technologies ZBR Zebra Technologies International, LLC ZCT ZeitControl cardsystems GmbH ZDS Zenith Data Systems ZGT Zenith Data Systems ZIC Nationz Technologies Inc. ZMT Zalman Tech Co., Ltd. ZMZ Z Microsystems ZNI Zetinet Inc ZNX Znyx Adv. Systems ZOW Zowie Intertainment, Inc ZRN Zoran Corporation ZSE Zenith Data Systems ZTC ZyDAS Technology Corporation ZTE ZTE Corporation ZTI Zoom Telephonics Inc ZTM ZT Group Int'l Inc. ZTT Z3 Technology ZYD Zydacron Inc ZYP Zypcom Inc ZYT Zytex Computers ZYX Zyxel ZZZ Boca Research Inc DisplayCAL-3.5.0.0/DisplayCAL/postinstall.py0000644000076500000000000002607312665102055020363 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from StringIO import StringIO from subprocess import call from os.path import basename, splitext from glob import glob import os import shutil import sys import traceback from meta import name from util_os import relpath, which recordfile_name = "INSTALLED_FILES" if not sys.stdout.isatty(): sys.stdout = StringIO() if sys.platform == "win32": try: create_shortcut # this function is only available within bdist_wininst installers except NameError: try: from pythoncom import (CoCreateInstance, CLSCTX_INPROC_SERVER, IID_IPersistFile) from win32com.shell import shell import win32con except ImportError: def create_shortcut(*args): pass else: def create_shortcut(*args): shortcut = CoCreateInstance( shell.CLSID_ShellLink, None, CLSCTX_INPROC_SERVER, shell.IID_IShellLink ) shortcut.SetPath(args[0]) shortcut.SetDescription(args[1]) if len(args) > 3: shortcut.SetArguments(args[3]) if len(args) > 4: shortcut.SetWorkingDirectory(args[4]) if len(args) > 5: shortcut.SetIconLocation(args[5], args[6] if len(args) > 6 else 0) shortcut.SetShowCmd(win32con.SW_SHOWNORMAL) shortcut.QueryInterface(IID_IPersistFile).Save(args[2], 0) try: directory_created # this function is only available within bdist_wininst installers except NameError: def directory_created(path): pass try: file_created # this function is only available within bdist_wininst installers except NameError: try: import win32api except ImportError: def file_created(path): pass else: def file_created(path): if os.path.exists(recordfile_name): installed_files = [] if os.path.exists(recordfile_name): recordfile = open(recordfile_name, "r") installed_files.extend(line.rstrip("\n") for line in recordfile) recordfile.close() try: path.decode("ASCII") except (UnicodeDecodeError, UnicodeEncodeError): # the contents of the record file used by distutils # must be ASCII GetShortPathName allows us to avoid # any issues with encoding because it returns the # short path as 7-bit string (while still being a # valid path) path = win32api.GetShortPathName(path) installed_files.append(path) recordfile = open(recordfile_name, "w") recordfile.write("\n".join(installed_files)) recordfile.close() try: get_special_folder_path # this function is only available within bdist_wininst installers except NameError: try: from win32com.shell import shell, shellcon except ImportError: def get_special_folder_path(csidl_string): pass else: def get_special_folder_path(csidl_string): return shell.SHGetSpecialFolderPath(0, getattr(shellcon, csidl_string), 1) def postinstall(prefix=None): if sys.platform == "darwin": # TODO: implement pass elif sys.platform == "win32": if prefix is None: # assume we are running from bdist_wininst installer modpath = os.path.dirname(os.path.abspath(__file__)) else: # assume we are running from source dir, # or from install dir modpath = prefix if os.path.exists(modpath): mainicon = os.path.join(modpath, "theme", "icons", name + ".ico") if os.path.exists(mainicon): try: startmenu_programs_common = get_special_folder_path( "CSIDL_COMMON_PROGRAMS") startmenu_programs = get_special_folder_path( "CSIDL_PROGRAMS") startmenu_common = get_special_folder_path( "CSIDL_COMMON_STARTMENU") startmenu = get_special_folder_path("CSIDL_STARTMENU") except OSError, exception: traceback.print_exc() return else: filenames = (filter(lambda filename: not filename.endswith("-script.py") and not filename.endswith("-script.pyw") and not filename.endswith(".manifest") and not filename.endswith(".pyc") and not filename.endswith(".pyo") and not filename.endswith("_postinstall.py"), glob(os.path.join(sys.prefix, "Scripts", name + "*"))) + ["LICENSE.txt", "README.html", "Uninstall"]) installed_shortcuts = [] for path in (startmenu_programs_common, startmenu_programs): if path: grppath = os.path.join(path, name) if path == startmenu_programs: group = relpath(grppath, startmenu) else: group = relpath(grppath, startmenu_common) if not os.path.exists(grppath): try: os.makedirs(grppath) except Exception, exception: # maybe insufficient privileges? pass if os.path.exists(grppath): print ("Created start menu group '%s' in " "%s") % (name, (unicode(path, "MBCS", "replace") if type(path) != unicode else path).encode("MBCS", "replace")) else: print ("Failed to create start menu group '%s' in " "%s") % (name, (unicode(path, "MBCS", "replace") if type(path) != unicode else path).encode("MBCS", "replace")) continue directory_created(grppath) for filename in filenames: lnkname = splitext(basename(filename))[0] lnkpath = os.path.join( grppath, lnkname + ".lnk") if os.path.exists(lnkpath): try: os.remove(lnkpath) except Exception, exception: # maybe insufficient privileges? print ("Failed to create start menu entry '%s' in " "%s") % (lnkname, (unicode(grppath, "MBCS", "replace") if type(grppath) != unicode else grppath).encode("MBCS", "replace")) continue if not os.path.exists(lnkpath): if lnkname != "Uninstall": tgtpath = os.path.join(modpath, filename) try: if lnkname == "Uninstall": uninstaller = os.path.join( sys.prefix, "Remove%s.exe" % name) if os.path.exists(uninstaller): create_shortcut( uninstaller, lnkname, lnkpath, '-u "%s-wininst.log"' % os.path.join(sys.prefix, name), sys.prefix, os.path.join( modpath, "theme", "icons", name + "-uninstall.ico")) else: # When running from a # bdist_wininst or bdist_msi # installer, sys.executable # points to the installer # executable, not python.exe create_shortcut( os.path.join(sys.prefix, "python.exe"), lnkname, lnkpath, '"%s" uninstall ' '--record="%s"' % ( os.path.join( modpath, "setup.py"), os.path.join( modpath, "INSTALLED_FILES") ), sys.prefix, os.path.join( modpath, "theme", "icons", name + "-uninstall.ico")) elif lnkname.startswith(name): # When running from a # bdist_wininst or bdist_msi # installer, sys.executable # points to the installer # executable, not python.exe icon = os.path.join(modpath, "theme", "icons", lnkname + ".ico") if not os.path.isfile(icon): icon = mainicon if filename.endswith(".exe"): exe = filename args = "" else: exe = os.path.join(sys.prefix, "pythonw.exe") args = '"%s"' % tgtpath create_shortcut(exe, lnkname, lnkpath, args, modpath, icon) else: create_shortcut( tgtpath, lnkname, lnkpath, "", modpath) except Exception, exception: # maybe insufficient privileges? print ("Failed to create start menu entry '%s' in " "%s") % (lnkname, (unicode(grppath, "MBCS", "replace") if type(grppath) != unicode else grppath).encode("MBCS", "replace")) continue print ("Installed start menu entry '%s' to " "%s") % (lnkname, (unicode(group, "MBCS", "replace") if type(group) != unicode else group).encode("MBCS", "replace")) file_created(lnkpath) installed_shortcuts.append(filename) if installed_shortcuts == filenames: break else: print "warning - '%s' not found" % icon.encode("MBCS", "replace") if os.path.exists(recordfile_name): irecordfile_name = os.path.join(modpath, "INSTALLED_FILES") irecordfile = open(irecordfile_name, "w") irecordfile.close() file_created(irecordfile_name) shutil.copy2(recordfile_name, irecordfile_name) else: print "warning - '%s' not found" % modpath.encode("MBCS", "replace") else: # Linux/Unix if prefix is None: prefix = sys.prefix if which("touch"): call(["touch", "--no-create", prefix + "/share/icons/hicolor"]) if which("xdg-icon-resource"): ##print "installing icon resources..." ##for size in [16, 22, 24, 32, 48, 256]: ##call(["xdg-icon-resource", "install", "--noupdate", "--novendor", ##"--size", str(size), prefix + ##("/share/%s/theme/icons/%sx%s/%s.png" % (name, size, size, ##name))]) call(["xdg-icon-resource", "forceupdate"]) if which("xdg-desktop-menu"): ##print "installing desktop menu entry..." ##call(["xdg-desktop-menu", "install", "--novendor", (prefix + ##"/share/%s/%s.desktop" % (name, name))]) call(["xdg-desktop-menu", "forceupdate"]) def postuninstall(prefix=None): if sys.platform == "darwin": # TODO: implement pass elif sys.platform == "win32": # nothing to do pass else: # Linux/Unix if prefix is None: prefix = sys.prefix if which("xdg-desktop-menu"): ##print "uninstalling desktop menu entry..." ##call(["xdg-desktop-menu", "uninstall", prefix + ##("/share/applications/%s.desktop" % name)]) call(["xdg-desktop-menu", "forceupdate"]) if which("xdg-icon-resource"): ##print "uninstalling icon resources..." ##for size in [16, 22, 24, 32, 48, 256]: ##call(["xdg-icon-resource", "uninstall", "--noupdate", "--size", ##str(size), name]) call(["xdg-icon-resource", "forceupdate"]) def main(): prefix = None for arg in sys.argv[1:]: arg = arg.split("=") if len(arg) == 2: if arg[0] == "--prefix": prefix = arg[1] try: if "-remove" in sys.argv[1:]: postuninstall(prefix) else: postinstall(prefix) except Exception, exception: traceback.print_exc() if __name__ == "__main__": main() DisplayCAL-3.5.0.0/DisplayCAL/presets/0000755000076500000000000000000013242313606017110 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/presets/default.icc0000644000076500000000000004742013154615407021231 0ustar devwheel00000000000000Oargl mntrRGB XYZ ; acspMSFT-argl'orl desc cprt/wtptbkptvcgtrXYZgXYZ$bXYZ8rTRCL gTRCL bTRCL targ XDartsN,desc'DisplayCAL calibration preset: DefaulttextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloq>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloqpXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloq>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloq>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv9Ur9Ur9Vs9]$O{8j?x*h*m A ! o  b d  t 2\+pQ:*""*:Rs4iJ !@!"#I#$%h&"&'(]) )*+x,E--./0l1I2(3 3456789~:u;ol?q@yABCDEFGIJ?KdLMNPQIRSTV7WzXZ [W\]_P`bcgdf1gijykmdnp]qsdtvxxy{1|~h VdՍU㔰U- ̡xsqt{ؽ@kƛAπ YةWߵ|U@>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv(<Pcw 9To2W}%SM2o/sG*z  r y 2 U ^<!%Af,fLD !P""#p$*$%&d'&'(){*F++,-.a/:0012345i6U7B839%:;< =>?@ ABC#D0E?FQGeH|IJKLNO9PaQRSUVPWXY[=\~]_ `Rabd>efh@ijl[mo$pqsftvJwy9z|2}7Fх_P5ܕ2⚔Iy9¨V%ʱ{W7±ĥƜȕʒ̑ΔЙҡԭֻ.NqM3ttextCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" AUTO_OPTIMIZE "4" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -ql -w0.3127,0.3290 -gs -f1 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wDisplayCAL-3.5.0.0/DisplayCAL/presets/video.icc0000644000076500000000000004743013242300756020710 0ustar devwheel00000000000000Oargl mntrRGB XYZ ;:acspMSFT-arglm@]F`d O desc cprt/wtptbkptvcgtrXYZ gXYZ bXYZ4rTRCH gTRCH bTRCH targ TDartsN,desc%DisplayCAL calibration preset: VideotextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv #+4>IUcq+Gc.U}0`3l!a,sSD G [  N % u`TPTbx*V*ndp# !K""#$M%%&'v(G))*+,-^.@/%0 0123456789:;<=>?@B C$D@E^FGHIK!LPMNOQ(ReSTV,WuXZ[^\^_b`bcdfLgi$jlm~nptqsutvx y{,|~W񁏃/҆x!͋}/䐝Yٗf1Р|W5̯ò 'Imԕ UߍJ%tw4textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" AUTO_OPTIMIZE "4" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -G2.4 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wDisplayCAL-3.5.0.0/DisplayCAL/presets/video_eeColor.icc0000644000076500000000000024702013221317445022355 0ustar devwheel00000000000000Nargl mntrRGB XYZ ;acspMSFT-arglvcuh+desc,cprt/wtptbkptvcgtrXYZgXYZ0bXYZDrTRCXgTRCXbTRCXtarghEartsM|,dmddMgdesc'DisplayCAL calibration preset: eeColortextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "eeColor" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX -M "SII REPEATER" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdesc SII REPEATERDisplayCAL-3.5.0.0/DisplayCAL/presets/video_madVR.icc0000644000076500000000000024661413221317445022006 0ustar devwheel00000000000000Margl mntrRGB XYZ ;acspMSFT-arglO9]߉4-"R desc cprt/wtptbkptvcgtrXYZ gXYZ bXYZ4rTRCHgTRCHbTRCHtargXEartsM`,desc%DisplayCAL calibration preset: madVRtextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "madVR" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -dmadvr -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wDisplayCAL-3.5.0.0/DisplayCAL/presets/video_madVR_ST2084.icc0000644000076500000000000005065013242300756022723 0ustar devwheel00000000000000Qargl mntrRGB XYZ 4 acspMSFT-arglt;%GV΢=#"s desc cprt/wtptbkptvcgtrXYZgXYZ(bXYZ<rTRCP gTRCP bTRCP targ \G artsQ|,desc-DisplayCAL calibration preset: madVR ST.2084textCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv #+4>IUcq+Gc.U}0`3l!a,sSD G [  N % u`TPTbx*V*ndp# !K""#$M%%&'v(G))*+,-^.@/%0 0123456789:;<=>?@B C$D@E^FGHIK!LPMNOQ(ReSTV,WuXZ[^\^_b`bcdfLgi$jlm~nptqsutvx y{,|~W񁏃/҆x!͋}/䐝Yٗf1Р|W5̯ò 'Imԕ UߍJ%tw4textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "49" SINGLE_DIM_STEPS "17" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" AUTO_OPTIMIZE "4" 3DLUT_SOURCE_PROFILE "ref/Rec2020.icm" 3DLUT_TRC "smpte2084.rolloffclip" 3DLUT_HDR_PEAK_LUMINANCE "400" 3DLUT_HDR_MAXCLL "10000" 3DLUT_CONTENT_COLORSPACE_WHITE_X "0.314" 3DLUT_CONTENT_COLORSPACE_WHITE_Y "0.351" 3DLUT_CONTENT_COLORSPACE_RED_X "0.68" 3DLUT_CONTENT_COLORSPACE_RED_Y "0.32" 3DLUT_CONTENT_COLORSPACE_GREEN_X "0.265" 3DLUT_CONTENT_COLORSPACE_GREEN_Y "0.69" 3DLUT_CONTENT_COLORSPACE_BLUE_X "0.15" 3DLUT_CONTENT_COLORSPACE_BLUE_Y "0.06" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "madVR" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -dmadvr -qm -w0.3127,0.3290 -f0 -k0 -Iw END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wDisplayCAL-3.5.0.0/DisplayCAL/presets/video_Prisma.icc0000644000076500000000000024706413221317445022230 0ustar devwheel00000000000000N4argl mntrRGB XYZ ;&acspMSFT-argl`ʚJ߳I6!desc,cprt/wtptbkptvcgtrXYZgXYZ,bXYZ@rTRCTgTRCTbTRCTtargdE@artsM,dmddMadesc&DisplayCAL calibration preset: PrismatextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "3dl" 3DLUT_SIZE "17" 3DLUT_INPUT_BITDEPTH "10" 3DLUT_OUTPUT_BITDEPTH "12" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX -M "Prisma" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdescPrismaDisplayCAL-3.5.0.0/DisplayCAL/presets/video_ReShade.icc0000644000076500000000000004713413221317445022304 0ustar devwheel00000000000000N\argl mntrRGB XYZ ;-acspMSFT-arglT%?M?ɀm desc cprt/wtptbkptvcgtrXYZgXYZ$bXYZ8rTRCLgTRCLbTRCLtarg\EartsN0,desc'DisplayCAL calibration preset: ReShadetextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curvtextCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" AUTO_OPTIMIZE "4" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "n" 3DLUT_OUTPUT_ENCODING "n" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "ReShade" 3DLUT_SIZE "64" 3DLUT_OUTPUT_BITDEPTH "8" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wDisplayCAL-3.5.0.0/DisplayCAL/presets/video_resolve.icc0000644000076500000000000024705013221317445022447 0ustar devwheel00000000000000N(argl mntrRGB XYZ ;/acspMSFT-arglgOLvA2 Cdesc,cprt/wtptbkptvcgtrXYZgXYZ0bXYZDrTRCXgTRCXbTRCXtarghE.artsM,dmddMbdesc'DisplayCAL calibration preset: ResolvetextCreated with DisplayCAL and Argyll CMSXYZ QXYZ vcgt  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ o8XYZ bXYZ $curv3textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" MIN_DISPLAY_UPDATE_DELAY_MS "600" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "n" 3DLUT_OUTPUT_ENCODING "n" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "cube" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX -M "Resolve" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA sf32%D3֮? e wdescResolveDisplayCAL-3.5.0.0/DisplayCAL/profile_loader.py0000644000076500000000000035272613242301247021000 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Set ICC profiles and load calibration curves for all configured display devices """ import os import sys import threading import time from meta import VERSION, VERSION_BASE, name as appname, version, version_short import config from config import appbasename, confighome, getcfg, setcfg from log import safe_print from options import debug, test, verbose if sys.platform == "win32": import errno import ctypes import glob import math import re import struct import subprocess as sp import traceback import winerror import _winreg import pywintypes import win32api import win32event import win32gui import win32process from colord import device_id_from_edid from config import (autostart, autostart_home, exe, exedir, get_data_path, get_default_dpi, get_icon_bundle, geticon, iccprofiles, pydir) from debughelpers import Error, UnloggedError, handle_error from edid import get_edid from meta import domain from ordereddict import OrderedDict from systrayicon import Menu, MenuItem, SysTrayIcon from util_list import natsort_key_factory from util_os import (getenvu, is_superuser, islink, quote_args, readlink, which) from util_str import safe_asciize, safe_str, safe_unicode from util_win import (DISPLAY_DEVICE_ACTIVE, MONITORINFOF_PRIMARY, calibration_management_isenabled, enable_per_user_profiles, get_active_display_device, get_display_devices, get_file_info, get_first_display_device, get_pids, get_process_filename, get_real_display_devices_info, get_windows_error, per_user_profiles_isenabled, run_as_admin) from wxaddons import CustomGridCellEvent from wxfixes import ThemedGenButton, set_bitmap_labels from wxwindows import (BaseApp, BaseFrame, ConfirmDialog, CustomCellBoolRenderer, CustomGrid, InfoDialog, TaskBarNotification, wx, show_result_dialog, get_dialogs) import ICCProfile as ICCP import madvr if islink(exe): try: exe = readlink(exe) except: pass else: exedir = os.path.dirname(exe) class DisplayIdentificationFrame(wx.Frame): def __init__(self, display, pos, size): wx.Frame.__init__(self, None, pos=pos, size=size, style=wx.CLIP_CHILDREN | wx.STAY_ON_TOP | wx.FRAME_NO_TASKBAR | wx.NO_BORDER, name="DisplayIdentification") self.SetTransparent(240) self.Sizer = wx.BoxSizer() panel_outer = wx.Panel(self) panel_outer.BackgroundColour = "#303030" panel_outer.Sizer = wx.BoxSizer() self.Sizer.Add(panel_outer, 1, flag=wx.EXPAND) panel_inner = wx.Panel(panel_outer) panel_inner.BackgroundColour = "#0078d7" panel_inner.Sizer = wx.BoxSizer() panel_outer.Sizer.Add(panel_inner, 1, flag=wx.ALL | wx.EXPAND, border=int(math.ceil(size[0] / 12. / 40))) display_parts = display.split("@", 1) if len(display_parts) > 1: info = display_parts[1].split(" - ", 1) display_parts[1] = "@" + " ".join(info[:1]) if info[1:]: display_parts.append(" ".join(info[1:])) label = "\n".join(display_parts) text = wx.StaticText(panel_inner, -1, label, style=wx.ALIGN_CENTER) text.ForegroundColour = "#FFFFFF" font = wx.Font(text.Font.PointSize * size[0] / 12. / 16, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_LIGHT) if not font.SetFaceName("Segoe UI Light"): font = text.Font font.PointSize *= size[0] / 12. / 16 font.weight = wx.FONTWEIGHT_LIGHT text.Font = font panel_inner.Sizer.Add(text, 1, flag=wx.ALIGN_CENTER_VERTICAL) for element in (self, panel_outer, panel_inner, text): element.Bind(wx.EVT_LEFT_UP, lambda e: self.Close()) element.Bind(wx.EVT_MIDDLE_UP, lambda e: self.Close()) element.Bind(wx.EVT_RIGHT_UP, lambda e: self.Close()) self.Bind(wx.EVT_CHAR_HOOK, lambda e: e.KeyCode == wx.WXK_ESCAPE and self.Close()) self.Layout() self.Show() self.close_timer = wx.CallLater(3000, lambda: self and self.Close()) class FixProfileAssociationsDialog(ConfirmDialog): def __init__(self, pl, parent=None): self.pl = pl ConfirmDialog.__init__(self, parent, msg=lang.getstr("profile_loader.fix_profile_associations_warning"), title=pl.get_title(), ok=lang.getstr("profile_loader.fix_profile_associations"), bitmap=geticon(32, "dialog-warning"), wrap=128) dlg = self dlg.SetIcons(get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles")) scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 list_panel = wx.Panel(dlg, -1) list_panel.BackgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT) list_panel.Sizer = wx.BoxSizer(wx.HORIZONTAL) list_ctrl = wx.ListCtrl(list_panel, -1, style=wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.BORDER_THEME, name="displays2profiles") list_panel.Sizer.Add(list_ctrl, 1, flag=wx.ALL, border=1) list_ctrl.InsertColumn(0, lang.getstr("display")) list_ctrl.InsertColumn(1, lang.getstr("profile")) list_ctrl.SetColumnWidth(0, int(200 * scale)) list_ctrl.SetColumnWidth(1, int(420 * scale)) # Ignore item focus/selection list_ctrl.Bind(wx.EVT_LIST_ITEM_FOCUSED, lambda e: list_ctrl.SetItemState(e.GetIndex(), 0, wx.LIST_STATE_FOCUSED)) list_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, lambda e: list_ctrl.SetItemState(e.GetIndex(), 0, wx.LIST_STATE_SELECTED)) self.devices2profiles_ctrl = list_ctrl dlg.sizer3.Insert(0, list_panel, 1, flag=wx.BOTTOM | wx.ALIGN_LEFT, border=12) self.update() def update(self, event=None): self.pl._set_display_profiles(dry_run=True) numdisp = min(len(self.pl.devices2profiles), 5) scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 hscroll = wx.SystemSettings_GetMetric(wx.SYS_HSCROLL_Y) size=(640 * scale, (20 * numdisp + 25 + hscroll) * scale) list_ctrl = self.devices2profiles_ctrl list_ctrl.MinSize = size list_ctrl.DeleteAllItems() for i, (display_edid, profile, desc) in enumerate(self.pl.devices2profiles.itervalues()): index = list_ctrl.InsertStringItem(i, "") display = display_edid[0].replace("[PRIMARY]", lang.getstr("display.primary")) list_ctrl.SetStringItem(index, 0, display) list_ctrl.SetStringItem(index, 1, desc) if not profile: continue try: profile = ICCP.ICCProfile(profile) except (IOError, ICCP.ICCProfileInvalidError), exception: pass else: if isinstance(profile.tags.get("meta"), ICCP.DictType): # Check if profile mapping makes sense id = device_id_from_edid(display_edid[1]) if profile.tags.meta.getvalue("MAPPING_device_id") != id: list_ctrl.SetItemTextColour(index, "#FF8000") self.sizer0.SetSizeHints(self) self.sizer0.Layout() if event and not self.IsActive(): self.RequestUserAttention() class ProfileLoaderExceptionsDialog(ConfirmDialog): def __init__(self, exceptions, known_apps=set()): self._exceptions = {} self.known_apps = known_apps scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 ConfirmDialog.__init__(self, None, title=lang.getstr("exceptions"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), wrap=120) dlg = self dlg.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles")) dlg.delete_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("delete")) dlg.sizer2.Insert(0, (12, 12)) dlg.sizer2.Insert(0, dlg.delete_btn) dlg.delete_btn.Bind(wx.EVT_BUTTON, dlg.delete_handler) dlg.browse_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("browse")) dlg.sizer2.Insert(0, (12, 12)) dlg.sizer2.Insert(0, dlg.browse_btn) dlg.browse_btn.Bind(wx.EVT_BUTTON, dlg.browse_handler) dlg.add_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("add")) dlg.sizer2.Insert(0, (12, 12)) dlg.sizer2.Insert(0, dlg.add_btn) dlg.add_btn.Bind(wx.EVT_BUTTON, dlg.browse_handler) if "gtk3" in wx.PlatformInfo: style = wx.BORDER_SIMPLE else: style = wx.BORDER_THEME dlg.grid = CustomGrid(dlg, -1, size=(648 * scale, 200 * scale), style=style) grid = dlg.grid grid.DisableDragRowSize() grid.SetCellHighlightPenWidth(0) grid.SetCellHighlightROPenWidth(0) grid.SetDefaultCellAlignment(wx.ALIGN_LEFT, wx.ALIGN_CENTER) grid.SetMargins(0, 0) grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) grid.SetScrollRate(5, 5) grid.draw_horizontal_grid_lines = False grid.draw_vertical_grid_lines = False grid.CreateGrid(0, 4) grid.SetSelectionMode(wx.grid.Grid.wxGridSelectRows) font = grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 grid.SetDefaultCellFont(font) grid.SetColLabelSize(int(round(self.grid.GetDefaultRowSize() * 1.4))) dc = wx.MemoryDC(wx.EmptyBitmap(1, 1)) dc.SetFont(grid.GetLabelFont()) grid.SetRowLabelSize(max(dc.GetTextExtent("99")[0], grid.GetDefaultRowSize())) for i in xrange(grid.GetNumberCols()): if i > 1: attr = wx.grid.GridCellAttr() attr.SetReadOnly(True) grid.SetColAttr(i, attr) if i == 0: # On/off checkbox size = 22 * scale elif i == 1: # Profile loader state icon size = 22 * scale elif i == 2: # Executable basename size = dc.GetTextExtent("W" * 12)[0] else: # Directory component size = dc.GetTextExtent("W" * 34)[0] grid.SetColSize(i, size) for i, label in enumerate(["", "", "executable", "directory"]): grid.SetColLabelValue(i, lang.getstr(label)) # On/off checkbox attr = wx.grid.GridCellAttr() renderer = CustomCellBoolRenderer() renderer._bitmap_unchecked = config.geticon(16, "empty") attr.SetRenderer(renderer) grid.SetColAttr(0, attr) # Profile loader state icon attr = wx.grid.GridCellAttr() renderer = CustomCellBoolRenderer() renderer._bitmap = config.geticon(16, "apply-profiles-reset") bitmap = renderer._bitmap image = bitmap.ConvertToImage().ConvertToGreyscale(.75, .125, .125) renderer._bitmap_unchecked = image.ConvertToBitmap() attr.SetRenderer(renderer) grid.SetColAttr(1, attr) attr = wx.grid.GridCellAttr() attr.SetRenderer(wx.grid.GridCellStringRenderer()) grid.SetColAttr(2, attr) attr = wx.grid.GridCellAttr() attr.SetRenderer(wx.grid.GridCellStringRenderer()) grid.SetColAttr(3, attr) grid.EnableGridLines(False) grid.BeginBatch() for i, (key, (enabled, reset, path)) in enumerate(sorted(exceptions.items())): grid.AppendRows(1) grid.SetRowLabelValue(i, "%d" % (i + 1)) grid.SetCellValue(i, 0, "1" if enabled else "") grid.SetCellValue(i, 1, "1" if reset else "") grid.SetCellValue(i, 2, os.path.basename(path)) grid.SetCellValue(i, 3, os.path.dirname(path)) self._exceptions[key] = enabled, reset, path grid.EndBatch() grid.Bind(wx.EVT_KEY_DOWN, dlg.key_handler) grid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, dlg.cell_click_handler) grid.Bind(wx.grid.EVT_GRID_CELL_LEFT_DCLICK, dlg.cell_dclick_handler) grid.Bind(wx.grid.EVT_GRID_SELECT_CELL, dlg.cell_select_handler) dlg.sizer3.Add(grid, 1, flag=wx.LEFT | wx.ALIGN_LEFT, border=12) # Legend sizer = wx.FlexGridSizer(2, 2, 3, 1) sizer.Add(wx.StaticBitmap(dlg, -1, renderer._bitmap_unchecked)) sizer.Add(wx.StaticText(dlg, -1, " = " + lang.getstr("profile_loader.disable"))) sizer.Add(wx.StaticBitmap(dlg, -1, renderer._bitmap)) sizer.Add(wx.StaticText(dlg, -1, " = " + lang.getstr("calibration.reset"))) dlg.sizer3.Add(sizer, 1, flag=wx.LEFT | wx.TOP | wx.ALIGN_LEFT, border=12) dlg.buttonpanel.Layout() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() # This workaround is needed to update cell colours grid.SelectAll() grid.ClearSelection() self.check_select_status() dlg.ok.Disable() dlg.Center() def _get_path(self, row): return os.path.join(self.grid.GetCellValue(row, 3), self.grid.GetCellValue(row, 2)) def _update_exception(self, row): path = self._get_path(row) enabled = int(self.grid.GetCellValue(row, 0) or 0) reset = int(self.grid.GetCellValue(row, 1) or 0) self._exceptions[path.lower()] = enabled, reset, path def cell_click_handler(self, event): if event.Col < 2: if self.grid.GetCellValue(event.Row, event.Col): value = "" else: value = "1" self.grid.SetCellValue(event.Row, event.Col, value) self._update_exception(event.Row) self.ok.Enable() event.Skip() def cell_dclick_handler(self, event): if event.Col > 1: self.browse_handler(event) else: self.cell_click_handler(event) def cell_select_handler(self, event): event.Skip() wx.CallAfter(self.check_select_status) def check_select_status(self): rows = self.grid.GetSelectedRows() self.browse_btn.Enable(len(rows) == 1) self.delete_btn.Enable(bool(rows)) def key_handler(self, event): dlg = self if event.KeyCode == wx.WXK_SPACE: dlg.cell_click_handler(CustomGridCellEvent(wx.grid.EVT_GRID_CELL_CHANGE.evtType[0], dlg.grid, dlg.grid.GridCursorRow, dlg.grid.GridCursorCol)) elif event.KeyCode in (wx.WXK_BACK, wx.WXK_DELETE): self.delete_handler(None) else: event.Skip() def browse_handler(self, event): if event.GetId() == self.add_btn.Id: lstr = "add" defaultDir = getenvu("ProgramW6432") or getenvu("ProgramFiles") defaultFile = "" else: lstr = "browse" row = self.grid.GetSelectedRows()[0] defaultDir = self.grid.GetCellValue(row, 3) defaultFile = self.grid.GetCellValue(row, 2) dlg = wx.FileDialog(self, lang.getstr(lstr), defaultDir=defaultDir, defaultFile=defaultFile, wildcard="*.exe", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result == wx.ID_OK: if os.path.basename(path).lower() in self.known_apps: show_result_dialog(UnloggedError(lang.getstr("profile_loader.exceptions.known_app.error", os.path.basename(path)))) return if event.GetId() == self.add_btn.Id: # If it already exists, select the respective row if path.lower() in self._exceptions: for row in xrange(self.grid.GetNumberRows()): exception = os.path.join(self.grid.GetCellValue(row, 3), self.grid.GetCellValue(row, 2)) if exception.lower() == path.lower(): break else: # Add new row self.grid.AppendRows(1) row = self.grid.GetNumberRows() - 1 self.grid.SetCellValue(row, 0, "1") self.grid.SetCellValue(row, 1, "") self._exceptions[path.lower()] = 1, 0, path self.grid.SetCellValue(row, 2, os.path.basename(path)) self.grid.SetCellValue(row, 3, os.path.dirname(path)) self._update_exception(row) self.grid.SelectRow(row) self.check_select_status() self.grid.MakeCellVisible(row, 0) self.ok.Enable() def delete_handler(self, event): for row in sorted(self.grid.GetSelectedRows(), reverse=True): del self._exceptions[self._get_path(row).lower()] self.grid.DeleteRows(row) self.check_select_status() self.ok.Enable() class ProfileAssociationsDialog(InfoDialog): def __init__(self, pl): self.monitors = [] self.pl = pl self.profile_info = {} self.profiles = [] self.current_user = False self.display_identification_frames = {} InfoDialog.__init__(self, None, msg="", title=lang.getstr("profile_associations"), ok=lang.getstr("close"), bitmap=geticon(32, "display"), show=False, log=False, wrap=128) dlg = self dlg.SetIcons(get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles")) dlg.message.Hide() dlg.set_as_default_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("set_as_default")) dlg.sizer2.Insert(1, dlg.set_as_default_btn, flag=wx.RIGHT, border=12) dlg.set_as_default_btn.Bind(wx.EVT_BUTTON, dlg.set_as_default) dlg.set_as_default_btn.Disable() dlg.profile_info_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("profile.info")) dlg.sizer2.Insert(0, dlg.profile_info_btn, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=12) dlg.profile_info_btn.Bind(wx.EVT_BUTTON, dlg.show_profile_info) dlg.profile_info_btn.Disable() dlg.remove_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("remove")) dlg.sizer2.Insert(0, dlg.remove_btn, flag=wx.RIGHT | wx.LEFT, border=12) dlg.remove_btn.Bind(wx.EVT_BUTTON, dlg.remove_profile) dlg.remove_btn.Disable() dlg.add_btn = wx.Button(dlg.buttonpanel, -1, lang.getstr("add")) dlg.sizer2.Insert(0, dlg.add_btn, flag=wx.LEFT, border=32 + 12) dlg.add_btn.Bind(wx.EVT_BUTTON, dlg.add_profile) scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 dlg.display_ctrl = wx.Choice(dlg, -1) dlg.display_ctrl.Bind(wx.EVT_CHOICE, dlg.update_profiles) hsizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(hsizer, 1, flag=wx.ALIGN_LEFT | wx.EXPAND | wx.TOP, border=5) hsizer.Add(dlg.display_ctrl, 1, wx.ALIGN_CENTER_VERTICAL) identify_btn = ThemedGenButton(dlg, -1, lang.getstr("displays.identify")) identify_btn.MinSize = -1, dlg.display_ctrl.Size[1] + 2 identify_btn.Bind(wx.EVT_BUTTON, dlg.identify_displays) hsizer.Add(identify_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=8) if sys.getwindowsversion() >= (6, ): hsizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(hsizer, flag=wx.ALIGN_LEFT | wx.EXPAND) dlg.use_my_settings_cb = wx.CheckBox(dlg, -1, lang.getstr("profile_associations.use_my_settings")) dlg.use_my_settings_cb.Bind(wx.EVT_CHECKBOX, self.use_my_settings) hsizer.Add(dlg.use_my_settings_cb, flag=wx.TOP | wx.BOTTOM | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, border=12) dlg.warn_bmp = wx.StaticBitmap(dlg, -1, geticon(16, "dialog-warning")) dlg.warning = wx.StaticText(dlg, -1, lang.getstr("profile_associations.changing_system_defaults.warning")) warnsizer = wx.BoxSizer(wx.HORIZONTAL) hsizer.Add(warnsizer, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=12) warnsizer.Add(dlg.warn_bmp, 0, wx.ALIGN_CENTER_VERTICAL) warnsizer.Add(dlg.warning, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=4) else: dlg.sizer3.Add((1, 12)) list_panel = wx.Panel(dlg, -1) list_panel.BackgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT) list_panel.Sizer = wx.BoxSizer(wx.HORIZONTAL) hscroll = wx.SystemSettings_GetMetric(wx.SYS_HSCROLL_Y) numrows = 10 list_ctrl = wx.ListCtrl(list_panel, -1, size=(640 * scale, (20 * numrows + 25 + hscroll) * scale), style=wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.BORDER_THEME, name="displays2profiles") list_panel.Sizer.Add(list_ctrl, 1, flag=wx.ALL, border=1) list_ctrl.InsertColumn(0, lang.getstr("description")) list_ctrl.InsertColumn(1, lang.getstr("filename")) list_ctrl.SetColumnWidth(0, int(430 * scale)) list_ctrl.SetColumnWidth(1, int(210 * scale)) list_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, lambda e: (dlg.remove_btn.Enable(), dlg.set_as_default_btn.Enable(e.GetIndex() > 0), dlg.profile_info_btn.Enable())) list_ctrl.Bind(wx.EVT_LIST_ITEM_DESELECTED, lambda e: (dlg.remove_btn.Disable(), dlg.set_as_default_btn.Disable(), dlg.profile_info_btn.Disable())) list_ctrl.Bind(wx.EVT_LIST_ITEM_ACTIVATED, dlg.set_as_default) dlg.sizer3.Add(list_panel, flag=wx.BOTTOM | wx.ALIGN_LEFT, border=12) dlg.profiles_ctrl = list_ctrl dlg.fix_profile_associations_cb = wx.CheckBox(dlg, -1, lang.getstr("profile_loader.fix_profile_associations")) dlg.fix_profile_associations_cb.Bind(wx.EVT_CHECKBOX, self.toggle_fix_profile_associations) dlg.sizer3.Add(dlg.fix_profile_associations_cb, flag=wx.ALIGN_LEFT) dlg.disable_btns() dlg.update() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg.update_profiles_timer = wx.Timer(dlg) dlg.Bind(wx.EVT_TIMER, dlg.update_profiles, dlg.update_profiles_timer) dlg.update_profiles_timer.Start(1000) def OnClose(self, event): self.update_profiles_timer.Stop() InfoDialog.OnClose(self, event) def add_profile(self, event): if self.add_btn.GetAuthNeeded(): if self.pl.elevate(): self.EndModal(wx.ID_CANCEL) return dlg = ConfirmDialog(self, msg=lang.getstr("profile.choose"), title=lang.getstr("add"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, appname + "-profile-info"), wrap=128) dlg.SetIcons(get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles")) scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 list_panel = wx.Panel(dlg, -1) list_panel.BackgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT) list_panel.Sizer = wx.BoxSizer(wx.HORIZONTAL) hscroll = wx.SystemSettings_GetMetric(wx.SYS_HSCROLL_Y) numrows = 15 list_ctrl = wx.ListCtrl(list_panel, -1, size=(640 * scale, (20 * numrows + 25 + hscroll) * scale), style=wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.BORDER_THEME, name="displays2profiles") list_panel.Sizer.Add(list_ctrl, 1, flag=wx.ALL, border=1) list_ctrl.InsertColumn(0, lang.getstr("description")) list_ctrl.InsertColumn(1, lang.getstr("filename")) list_ctrl.SetColumnWidth(0, int(430 * scale)) list_ctrl.SetColumnWidth(1, int(210 * scale)) list_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, lambda e: dlg.ok.Enable()) list_ctrl.Bind(wx.EVT_LIST_ITEM_DESELECTED, lambda e: dlg.ok.Disable()) list_ctrl.Bind(wx.EVT_LIST_ITEM_ACTIVATED, lambda e: dlg.EndModal(wx.ID_OK)) profiles = [] for pth in glob.glob(os.path.join(iccprofiles[0], "*.ic[cm]")): try: profile = ICCP.ICCProfile(pth) except ICCP.ICCProfileInvalidError, exception: safe_print("%s:" % pth, exception) continue except IOError, exception: safe_print(exception) continue if profile.profileClass == "mntr": profiles.append((profile.getDescription(), os.path.basename(pth))) natsort_key = natsort_key_factory() profiles.sort(key=lambda item: natsort_key(item[0])) for i, (desc, profile) in enumerate(profiles): pindex = list_ctrl.InsertStringItem(i, "") list_ctrl.SetStringItem(pindex, 0, desc) list_ctrl.SetStringItem(pindex, 1, profile) dlg.profiles_ctrl = list_ctrl dlg.sizer3.Add(list_panel, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.ok.SetDefault() dlg.ok.Disable() dlg.Center() result = dlg.ShowModal() if result == wx.ID_OK: pindex = list_ctrl.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) if pindex > -1: self.set_profile(profiles[pindex][1]) else: wx.Bell() dlg.Destroy() def identify_displays(self, event): for display, frame in self.display_identification_frames.items(): if not frame: self.display_identification_frames.pop(display) for display, edid, moninfo, device in self.monitors: frame = self.display_identification_frames.get(display) if frame: frame.close_timer.Stop() frame.close_timer.Start(3000) else: m_left, m_top, m_right, m_bottom = moninfo["Monitor"] m_width = abs(m_right - m_left) m_height = abs(m_bottom - m_top) pos = m_left + m_width / 4, m_top + m_height / 4 size = (m_width / 2, m_height / 2) display_desc = display.replace("[PRIMARY]", lang.getstr("display.primary")) frame = DisplayIdentificationFrame(display_desc, pos, size) self.display_identification_frames[display] = frame def show_profile_info(self, event): pindex = self.profiles_ctrl.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) if pindex < 0: wx.Bell() return try: profile = ICCP.ICCProfile(self.profiles[pindex]) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + profile), self) return if profile.ID == "\0" * 16: id = profile.calculateID(False) else: id = profile.ID if not id in self.profile_info: # Create profile info window and store in hash table from wxProfileInfo import ProfileInfoFrame self.profile_info[id] = ProfileInfoFrame(None, -1) self.profile_info[id].Unbind(wx.EVT_CLOSE) self.profile_info[id].Bind(wx.EVT_CLOSE, self.close_profile_info) if (not self.profile_info[id].profile or self.profile_info[id].profile.calculateID(False) != id): # Load profile if info window has no profile or ID is different self.profile_info[id].profileID = id self.profile_info[id].LoadProfile(profile) if self.profile_info[id].IsIconized(): self.profile_info[id].Restore() else: self.profile_info[id].Show() self.profile_info[id].Raise() argyll_dir = getcfg("argyll.dir") if getcfg("argyll.dir") != argyll_dir: if self.pl.frame: result = self.pl.frame.send_command(None, 'set-argyll-dir "%s"' % getcfg("argyll.dir")) else: result = "ok" if result == "ok": self.pl.writecfg() def close_profile_info(self, event): # Remove the frame from the hash table if self: self.profile_info.pop(event.GetEventObject().profileID) # Closes the window event.Skip() def disable_btns(self): self.remove_btn.Disable() self.profile_info_btn.Disable() self.set_as_default_btn.Disable() def remove_profile(self, event): if self.remove_btn.GetAuthNeeded(): if self.pl.elevate(): self.EndModal(wx.ID_CANCEL) return pindex = self.profiles_ctrl.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) if pindex > -1: self.set_profile(self.profiles[pindex], True) else: wx.Bell() def set_as_default(self, event): if self.set_as_default_btn.GetAuthNeeded(): if self.pl.elevate(): self.EndModal(wx.ID_CANCEL) return pindex = self.profiles_ctrl.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) if pindex > -1: self.set_profile(self.profiles[pindex]) else: wx.Bell() def set_profile(self, profile, unset=False): if unset: fn = ICCP.unset_display_profile else: fn = ICCP.set_display_profile self._update_configuration(fn, profile) def _update_configuration(self, fn, arg0): dindex = self.display_ctrl.GetSelection() display, edid, moninfo, device = self.monitors[dindex] device0 = get_first_display_device(moninfo["Device"]) if device0 and device: self._update_device(fn, arg0, device.DeviceKey) if (getcfg("profile_loader.fix_profile_associations") and device.DeviceKey != device0.DeviceKey and self.pl._can_fix_profile_associations()): self._update_device(fn, arg0, device0.DeviceKey) self.update_profiles(True, monitor=self.monitors[dindex], next=True) else: wx.Bell() def _update_device(self, fn, arg0, devicekey, show_error=True): if (fn is enable_per_user_profiles and not per_user_profiles_isenabled(devicekey=devicekey)): # We need to re-associate per-user profiles to the # display, otherwise the associations will be lost # after enabling per-user if a system default profile # was set monkey = devicekey.split("\\")[-2:] profiles = ICCP._winreg_get_display_profiles(monkey, True) else: profiles = [] try: fn(arg0, devicekey=devicekey) except Exception, exception: safe_print("%s(%r, devicekey=%r):" % (fn.__name__, arg0, devicekey), exception) if show_error: wx.CallAfter(show_result_dialog, UnloggedError(safe_str(exception)), self) for profile_name in profiles: ICCP.set_display_profile(profile_name, devicekey=devicekey) def toggle_fix_profile_associations(self, event): self.fix_profile_associations_cb.Value = self.pl._toggle_fix_profile_associations(event, self) if self.fix_profile_associations_cb.Value == event.IsChecked(): self.update_profiles(True) def update(self, event=None): self.monitors = list(self.pl.monitors) self.display_ctrl.SetItems([entry[0].replace("[PRIMARY]", lang.getstr("display.primary")) for entry in self.monitors]) if self.monitors: self.display_ctrl.SetSelection(0) fix = self.pl._can_fix_profile_associations() self.fix_profile_associations_cb.Enable(fix) if fix: self.fix_profile_associations_cb.SetValue(bool(getcfg("profile_loader.fix_profile_associations"))) self.update_profiles(event) if event and not self.IsActive(): self.RequestUserAttention() def update_profiles(self, event=None, monitor=None, next=False): if not monitor: dindex = self.display_ctrl.GetSelection() if dindex > -1 and dindex < len(self.monitors): monitor = self.monitors[dindex] else: if event and not isinstance(event, wx.TimerEvent): wx.Bell() return display, edid, moninfo, device = monitor if not device: if event and not isinstance(event, wx.TimerEvent): wx.Bell() return monkey = device.DeviceKey.split("\\")[-2:] current_user = per_user_profiles_isenabled(devicekey=device.DeviceKey) scope_changed = (sys.getwindowsversion() >= (6, ) and current_user != self.current_user) if scope_changed: self.current_user = current_user self.use_my_settings_cb.SetValue(current_user) superuser = is_superuser() warn = not current_user and superuser update_layout = warn is not self.warning.IsShown() if update_layout: self.warn_bmp.Show(warn) self.warning.Show(warn) self.sizer3.Layout() if sys.getwindowsversion() >= (6, ): auth_needed = not (current_user or superuser) update_layout = self.add_btn.GetAuthNeeded() is not auth_needed if update_layout: self.buttonpanel.Freeze() self.add_btn.SetAuthNeeded(auth_needed) self.remove_btn.SetAuthNeeded(auth_needed) self.set_as_default_btn.SetAuthNeeded(auth_needed) self.buttonpanel.Layout() self.buttonpanel.Thaw() profiles = ICCP._winreg_get_display_profiles(monkey, current_user) profiles.reverse() profiles_changed = profiles != self.profiles if profiles_changed: self.profiles_ctrl.Freeze() self.profiles = profiles self.disable_btns() self.profiles_ctrl.DeleteAllItems() for i, profile in enumerate(self.profiles): pindex = self.profiles_ctrl.InsertStringItem(i, "") description = get_profile_desc(profile, False) if not i: # First profile is always default description += " (%s)" % lang.getstr("default") self.profiles_ctrl.SetStringItem(pindex, 0, description) self.profiles_ctrl.SetStringItem(pindex, 1, profile) self.profiles_ctrl.Thaw() if scope_changed or profiles_changed: if next or isinstance(event, wx.TimerEvent): wx.CallAfter(self._next) def _next(self): locked = self.pl.lock.locked() if locked: safe_print("ProfileAssociationsDialog: Waiting to acquire lock...") with self.pl.lock: if locked: safe_print("ProfileAssociationsDialog: Acquired lock") self.pl._next = True if locked: safe_print("ProfileAssociationsDialog: Releasing lock") def use_my_settings(self, event): self._update_configuration(enable_per_user_profiles, event.IsChecked()) class ProfileLoader(object): def __init__(self): from wxwindows import BaseApp, wx if not wx.GetApp(): app = BaseApp(0, clearSigInt=sys.platform != "win32") BaseApp.register_exitfunc(self.shutdown) else: app = None self.reload_count = 0 self.lock = threading.Lock() self._is_other_running_lock = threading.Lock() self.monitoring = True self.monitors = [] # Display devices that can be represented as ON self.display_devices = {} # All display devices self.child_devices_count = {} self._current_display_key = -1 self.numwindows = 0 self.profile_associations = {} self.profiles = {} self.devices2profiles = {} self.ramps = {} self.linear_vcgt_values = ([], [], []) for j in xrange(3): for k in xrange(256): self.linear_vcgt_values[j].append([float(k), k * 257]) self.setgammaramp_success = {} self.use_madhcnet = bool(config.getcfg("profile_loader.use_madhcnet")) self._has_display_changed = False self._last_exception_args = () self._shutdown = False self._skip = "--skip" in sys.argv[1:] apply_profiles = bool("--force" in sys.argv[1:] or config.getcfg("profile.load_on_login")) self._manual_restore = apply_profiles self._reset_gamma_ramps = bool(config.getcfg("profile_loader.reset_gamma_ramps")) self._known_apps = set([known_app.lower() for known_app in config.defaults["profile_loader.known_apps"].split(";") + config.getcfg("profile_loader.known_apps").split(";")]) self._known_window_classes = set(config.defaults["profile_loader.known_window_classes"].split(";") + config.getcfg("profile_loader.known_window_classes").split(";")) self._buggy_video_drivers = set(buggy_video_driver.lower() for buggy_video_driver in config.getcfg("profile_loader.buggy_video_drivers").split(";")) self._set_exceptions() self._madvr_instances = [] self._madvr_reset_cal = {} self._quantize = 2 ** getcfg("profile_loader.quantize_bits") - 1.0 self._timestamp = time.time() self._component_name = None self._app_detection_msg = None self._hwnds_pids = set() self.__other_component = None, None, 0 self.__apply_profiles = None if (sys.platform == "win32" and not "--force" in sys.argv[1:] and sys.getwindowsversion() >= (6, 1)): if calibration_management_isenabled(): # Incase calibration loading is handled by Windows 7 and # isn't forced self._manual_restore = False if (sys.platform != "win32" and apply_profiles and not self._skip and not self._is_displaycal_running() and not self._is_other_running(True)): self.apply_profiles_and_warn_on_error() if sys.platform == "win32": # We create a TSR tray program only under Windows. # Linux has colord/Oyranos and respective session daemons should # take care of calibration loading self._pid = os.getpid() self._tid = threading.currentThread().ident class PLFrame(BaseFrame): def __init__(self, pl): BaseFrame.__init__(self, None) self.pl = pl self.Bind(wx.EVT_CLOSE, pl.exit) self.Bind(wx.EVT_DISPLAY_CHANGED, self.pl._display_changed) def get_commands(self): return self.get_common_commands() + ["apply-profiles [force | display-changed]", "notify [silent] [sticky]", "reset-vcgt [force]", "setlanguage "] def process_data(self, data): if data[0] in ("apply-profiles", "reset-vcgt") and (len(data) == 1 or (len(data) == 2 and data[1] in ("force", "display-changed"))): if (not ("--force" in sys.argv[1:] or len(data) == 2) and calibration_management_isenabled()): return lang.getstr("calibration.load.handled_by_os") if ((len(data) == 1 and self.pl._is_displaycal_running()) or self.pl._is_other_running(False)): return "forbidden" elif data[-1] == "display-changed": if self.pl.lock.locked(): safe_print("PLFrame.process_data: Waiting to acquire lock...") with self.pl.lock: safe_print("PLFrame.process_data: Acquired lock") if self.pl._has_display_changed: # Normally calibration loading is disabled while # DisplayCAL is running. Override this when the # display has changed self.pl._manual_restore = getcfg("profile.load_on_login") and 2 safe_print("PLFrame.process_data: Releasing lock") else: if data[0] == "reset-vcgt": self.pl._set_reset_gamma_ramps(None, len(data)) else: self.pl._set_manual_restore(None, len(data)) return "ok" elif data[0] == "notify" and (len(data) == 2 or (len(data) == 3 and data[2] in ("silent", "sticky")) or (len(data) == 4 and "silent" in data[2:] and "sticky" in data[2:])): self.pl.notify([data[1]], [], sticky="sticky" in data[2:], show_notification=not "silent" in data[2:]) return "ok" elif data[0] == "setlanguage" and len(data) == 2: config.setcfg("lang", data[1]) wx.CallAfter(self.pl.taskbar_icon.set_visual_state) self.pl.writecfg() return "ok" return "invalid" class TaskBarIcon(SysTrayIcon): def __init__(self, pl): super(TaskBarIcon, self).__init__() self.pl = pl self.balloon_text = None self.flags = 0 bitmap = config.geticon(16, "apply-profiles-tray") image = bitmap.ConvertToImage() # Use Rec. 709 luma coefficients to convert to grayscale bitmap = image.ConvertToGreyscale(.2126, .7152, .0722).ConvertToBitmap() icon = wx.IconFromBitmap(bitmap) self._active_icons = [] self._icon_index = 0 anim_quality = getcfg("profile_loader.tray_icon_animation_quality") if anim_quality == 2: numframes = 8 elif anim_quality == 1: numframes = 4 else: numframes = 1 for i in xrange(numframes): if i: rad = i / float(numframes) bitmap = config.geticon(16, "apply-profiles-tray-%i" % (360 * rad)) image = bitmap.ConvertToImage() image.RotateHue(-rad) self._active_icon = wx.IconFromBitmap(image.ConvertToBitmap()) self._idle_icon = self._active_icon self._inactive_icon = icon self._active_icon_reset = config.get_bitmap_as_icon(16, "apply-profiles-reset") self._error_icon = config.get_bitmap_as_icon(16, "apply-profiles-error") self._animate = False self.set_visual_state(True) self.Bind(wx.EVT_TASKBAR_LEFT_UP, self.on_left_up) self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.on_left_dclick) self._dclick = False self._show_notification_later = None @Property def _active_icon(): def fget(self): if debug > 1: safe_print("[DEBUG] _active_icon[%i]" % self._icon_index) icon = self._active_icons[self._icon_index] return icon def fset(self, icon): self._active_icons.append(icon) return locals() def CreatePopupMenu(self): # Popup menu appears on right-click menu = Menu() if (self.pl._is_displaycal_running() or self.pl._is_other_running(False)): restore_auto = restore_manual = reset = None else: restore_manual = self.pl._set_manual_restore if ("--force" in sys.argv[1:] or calibration_management_isenabled()): restore_auto = None else: restore_auto = self.set_auto_restore reset = self.pl._set_reset_gamma_ramps if (not "--force" in sys.argv[1:] and calibration_management_isenabled()): restore_auto_kind = apply_kind = wx.ITEM_NORMAL else: if config.getcfg("profile.load_on_login"): apply_kind = wx.ITEM_RADIO else: apply_kind = wx.ITEM_NORMAL restore_auto_kind = wx.ITEM_CHECK fix = self.pl._can_fix_profile_associations() if fix: fix = self.pl._toggle_fix_profile_associations menu_items = [("calibration.load_from_display_profiles", restore_manual, apply_kind, "reset_gamma_ramps", lambda v: not v), ("calibration.reset", reset, apply_kind, "reset_gamma_ramps", None), ("-", None, False, None, None), ("calibration.preserve", restore_auto, restore_auto_kind, "profile.load_on_login", None), ("profile_loader.fix_profile_associations", fix, wx.ITEM_CHECK, "profile_loader.fix_profile_associations", None), ("show_notifications", lambda event: setcfg("profile_loader.show_notifications", int(event.IsChecked())), wx.ITEM_CHECK, "profile_loader.show_notifications", None), ("-", None, False, None, None), ("bitdepth", (("8", lambda event: self.set_bitdepth(event, 8)), ("10", lambda event: self.set_bitdepth(event, 10)), ("12", lambda event: self.set_bitdepth(event, 12)), ("14", lambda event: self.set_bitdepth(event, 14)), ("16", lambda event: self.set_bitdepth(event, 16))), wx.ITEM_CHECK, "profile_loader.quantize_bits", None), ("-", None, False, None, None), ("exceptions", self.set_exceptions, wx.ITEM_NORMAL, None, None), ("-", None, False, None, None)] menu_items.append(("profile_associations", self.pl._set_profile_associations, wx.ITEM_NORMAL, None, None)) if sys.getwindowsversion() >= (6, ): menu_items.append(("mswin.open_display_settings", self.open_display_settings, wx.ITEM_NORMAL, None, None)) menu_items.append(("-", None, False, None, None)) menu_items.append(("menuitem.quit", self.pl.exit, wx.ITEM_NORMAL, None, None)) for (label, method, kind, option, oxform) in menu_items: if label == "-": menu.AppendSeparator() else: label = lang.getstr(label) if option == "profile.load_on_login": lstr = lang.getstr("profile.load_on_login") if lang.getcode() != "de": label = label[0].lower() + label[1:] label = lstr + u" && " + label item = MenuItem(menu, -1, label, kind=kind) if not method: item.Enable(False) elif isinstance(method, tuple): submenu = Menu() for sublabel, submethod in method: subitem = MenuItem(submenu, -1, sublabel, kind=kind) if str(getcfg(option)) == sublabel: subitem.Check(True) submenu.AppendItem(subitem) submenu.Bind(wx.EVT_MENU, submethod, id=subitem.Id) menu.AppendSubMenu(submenu, label) continue else: menu.Bind(wx.EVT_MENU, method, id=item.Id) menu.AppendItem(item) if kind != wx.ITEM_NORMAL: if (option == "profile.load_on_login" and "--force" in sys.argv[1:]): item.Check(True) else: if not oxform: oxform = bool if option == "reset_gamma_ramps": value = self.pl._reset_gamma_ramps else: value = config.getcfg(option) item.Check(method and oxform(value)) return menu def PopupMenu(self, menu): if not self.check_user_attention(): SysTrayIcon.PopupMenu(self, menu) win32gui.DestroyMenu(menu.hmenu) def animate(self, enumerate_windows_and_processes=False, idle=False): if debug > 1: safe_print("[DEBUG] animate(enumerate_windows_and_processes=%s, idle=%s)" % (enumerate_windows_and_processes, idle)) if self._icon_index < len(self._active_icons) - 1: self._animate = True self._icon_index += 1 else: self._animate = False self._icon_index = 0 self.set_visual_state(enumerate_windows_and_processes, idle) if self._icon_index > 0: wx.CallLater(int(200 / len(self._active_icons)), lambda enumerate_windows_and_processes, idle: self and self.animate(enumerate_windows_and_processes, idle), enumerate_windows_and_processes, idle) if debug > 1: safe_print("[DEBUG] /animate") def get_icon(self, enumerate_windows_and_processes=False, idle=False): if debug > 1: safe_print("[DEBUG] get_icon(enumerate_windows_and_processes=%s, idle=%s)" % (enumerate_windows_and_processes, idle)) if (self.pl._should_apply_profiles(enumerate_windows_and_processes, manual_override=None) or self._animate): count = len(self.pl.monitors) if len(filter(lambda (i, success): success, sorted(self.pl.setgammaramp_success.items())[:count])) != count: icon = self._error_icon elif self.pl._reset_gamma_ramps: icon = self._active_icon_reset else: if idle: icon = self._idle_icon else: icon = self._active_icon else: icon = self._inactive_icon if debug > 1: safe_print("[DEBUG] /get_icon") return icon def on_left_up(self, event): if self._dclick: self._dclick = False return if not getattr(self, "_notification", None): # Make sure the displayed info is up-to-date locked = self.pl.lock.locked() if locked: safe_print("TaskBarIcon.on_left_down: Waiting to acquire lock...") with self.pl.lock: if locked: safe_print("TaskBarIcon.on_left_down: Acquired lock") self.pl._next = True if locked: safe_print("TaskBarIcon.on_left_down: Releasing lock") time.sleep(.11) locked = self.pl.lock.locked() if locked: safe_print("TaskBarIcon.on_left_down: Waiting to acquire lock...") with self.pl.lock: if locked: safe_print("TaskBarIcon.on_left_down: Acquired lock") pass if locked: safe_print("TaskBarIcon.on_left_down: Releasing lock") self._show_notification_later = wx.CallLater(40, self.show_notification) else: self.show_notification(toggle=True) def on_left_dclick(self, event): self._dclick = True if not self.pl._is_other_running(False): if self._show_notification_later and self._show_notification_later.IsRunning(): self._show_notification_later.Stop() locked = self.pl.lock.locked() if locked: safe_print("TaskBarIcon.on_left_dclick: Waiting to acquire lock...") with self.pl.lock: if locked: safe_print("TaskBarIcon.on_left_dclick: Acquired lock") self.pl._manual_restore = True self.pl._next = True if locked: safe_print("TaskBarIcon.on_left_dclick: Releasing lock") def check_user_attention(self): dlgs = get_dialogs() if dlgs: wx.Bell() for dlg in dlgs: # Need to request user attention for all open # dialogs because calling it only on the topmost # one does not guarantee taskbar flash dlg.RequestUserAttention() dlg.Raise() return dlg def open_display_settings(self, event): safe_print("Menu command: Open display settings") try: sp.call(["control", "/name", "Microsoft.Display", "/page", "Settings"], close_fds=True) except Exception, exception: wx.Bell() safe_print(exception) def set_auto_restore(self, event): safe_print("Menu command: Preserve calibration state", event.IsChecked()) config.setcfg("profile.load_on_login", int(event.IsChecked())) self.pl.writecfg() if event.IsChecked(): if self.pl.lock.locked(): safe_print("TaskBarIcon: Waiting to acquire lock...") with self.pl.lock: safe_print("TaskBarIcon: Acquired lock") self.pl._manual_restore = True self.pl._next = True safe_print("TaskBarIcon: Releasing lock") else: self.set_visual_state() def set_bitdepth(self, event=None, bits=16): safe_print("Menu command: Set quantization bitdepth", bits) setcfg("profile_loader.quantize_bits", bits) with self.pl.lock: self.pl._quantize = 2 ** bits - 1.0 self.pl.ramps = {} self.pl._manual_restore = True def set_exceptions(self, event): safe_print("Menu command: Set exceptions") dlg = ProfileLoaderExceptionsDialog(self.pl._exceptions, self.pl._known_apps) result = dlg.ShowModal() if result == wx.ID_OK: exceptions = [] for key, (enabled, reset, path) in dlg._exceptions.iteritems(): exceptions.append("%i:%i:%s" % (enabled, reset, path)) safe_print("Enabled=%s" % bool(enabled), "Action=%s" % (reset and "Reset" or "Disable"), path) if not exceptions: safe_print("Clearing exceptions") config.setcfg("profile_loader.exceptions", ";".join(exceptions)) self.pl._exceptions = dlg._exceptions self.pl.writecfg() else: safe_print("Cancelled setting exceptions") dlg.Destroy() def set_visual_state(self, enumerate_windows_and_processes=False, idle=False): if debug > 1: safe_print("[DEBUG] set_visual_state(enumerate_windows_and_processes=%s, idle=%s)" % (enumerate_windows_and_processes, idle)) self.SetIcon(self.get_icon(enumerate_windows_and_processes, idle), self.pl.get_title()) if debug > 1: safe_print("[DEBUG] /set_visual_state") def show_notification(self, text=None, sticky=False, show_notification=True, flags=wx.ICON_INFORMATION, toggle=False): if wx.VERSION < (3, ) or not self.pl._check_keep_running(): wx.Bell() return if debug > 1: safe_print("[DEBUG] show_notification(text=%r, sticky=%s, show_notification=%s, flags=%r, toggle=%s)" % (text, sticky, show_notification, flags, toggle)) if (sticky or text) and show_notification: # Do not show notification unless enabled show_notification = getcfg("profile_loader.show_notifications") if sticky: self.balloon_text = text self.flags = flags elif text: self.balloon_text = None self.flags = 0 else: text = self.balloon_text flags = self.flags or flags if not text: if (not "--force" in sys.argv[1:] and calibration_management_isenabled()): text = lang.getstr("calibration.load.handled_by_os") + "\n" else: text = "" if self.pl._component_name: text += lang.getstr("app.detected", self.pl._component_name) + "\n" text += lang.getstr("profile_loader.info", self.pl.reload_count) for i, (display, edid, moninfo, device) in enumerate(self.pl.monitors): if device: devicekey = device.DeviceKey else: devicekey = None key = devicekey or str(i) (profile_key, mtime, desc) = self.pl.profile_associations.get(key, (False, 0, "")) if profile_key is False: desc = lang.getstr("unknown") elif not profile_key: desc = lang.getstr("unassigned").lower() if (self.pl.setgammaramp_success.get(i) and self.pl._reset_gamma_ramps): desc = (lang.getstr("linear").capitalize() + u" / %s" % desc) elif (not self.pl.setgammaramp_success.get(i) or not profile_key): desc = (lang.getstr("unknown") + u" / %s" % desc) display = display.replace("[PRIMARY]", lang.getstr("display.primary")) text += u"\n%s: %s" % (display, desc) if not show_notification: if debug > 1: safe_print("[DEBUG] /show_notification") return if getattr(self, "_notification", None): self._notification.fade("out") if toggle: if debug > 1: safe_print("[DEBUG] /show_notification") return bitmap = wx.BitmapFromIcon(self.get_icon()) self._notification = TaskBarNotification(bitmap, self.pl.get_title(), text) if debug > 1: safe_print("[DEBUG] /show_notification") self.taskbar_icon = TaskBarIcon(self) try: self.gdi32 = ctypes.windll.gdi32 self.gdi32.GetDeviceGammaRamp.restype = ctypes.c_bool self.gdi32.SetDeviceGammaRamp.restype = ctypes.c_bool except Exception, exception: self.gdi32 = None safe_print(exception) self.taskbar_icon.show_notification(safe_unicode(exception)) if self.use_madhcnet: try: self.madvr = madvr.MadTPG() except Exception, exception: safe_print(exception) if safe_unicode(exception) != lang.getstr("madvr.not_found"): self.taskbar_icon.show_notification(safe_unicode(exception)) else: self.madvr.add_connection_callback(self._madvr_connection_callback, None, "madVR") self.madvr.add_connection_callback(self._madvr_connection_callback, None, "madTPG") self.madvr.listen() self.madvr.announce() self.frame = PLFrame(self) self.frame.listen() self._check_keep_running() self._check_display_conf_thread = threading.Thread(target=self._check_display_conf_wrapper, name="DisplayConfigurationMonitoring") self._check_display_conf_thread.start() if app: app.TopWindow = self.frame app.MainLoop() def apply_profiles(self, event=None, index=None): from util_os import dlopen, which from worker import Worker, get_argyll_util if sys.platform == "win32": self.lock.acquire() worker = Worker() errors = [] if sys.platform == "win32": separator = "-" else: separator = "=" safe_print(separator * 80) safe_print(lang.getstr("calibration.loading_from_display_profile")) # dispwin sets the _ICC_PROFILE(_n) root window atom, per-output xrandr # _ICC_PROFILE property (if xrandr is working) and loads the vcgt for the # requested screen (ucmm backend using color.jcnf), and has to be called # multiple times to setup multiple screens. # # If there is no profile configured in ucmm for the requested screen (or # ucmm support has been removed, like in the Argyll CMS versions shipped by # recent Fedora releases), it falls back to a possibly existing per-output # xrandr _ICC_PROFILE property (if xrandr is working) or _ICC_PROFILE(_n) # root window atom. dispwin = get_argyll_util("dispwin") if index is None: if dispwin: worker.enumerate_displays_and_ports(silent=True, check_lut_access=False, enumerate_ports=False, include_network_devices=False) self.monitors = [] if sys.platform == "win32" and worker.displays: self._enumerate_monitors() else: errors.append(lang.getstr("argyll.util.not_found", "dispwin")) if sys.platform != "win32": # gcm-apply sets the _ICC_PROFILE root window atom for the first screen, # per-output xrandr _ICC_PROFILE properties (if xrandr is working) and # loads the vcgt for all configured screens (device-profiles.conf) # NOTE: gcm-apply is no longer part of GNOME Color Manager since the # introduction of colord as it's no longer needed gcm_apply = which("gcm-apply") if gcm_apply: worker.exec_cmd(gcm_apply, capture_output=True, skip_scripts=True, silent=False) # oyranos-monitor sets _ICC_PROFILE(_n) root window atoms (oyranos # db backend) and loads the vcgt for all configured screens when # xcalib is installed oyranos_monitor = which("oyranos-monitor") xcalib = which("xcalib") argyll_use_colord = (os.getenv("ARGYLL_USE_COLORD") and dlopen("libcolordcompat.so")) results = [] for i, display in enumerate([display.replace("[PRIMARY]", lang.getstr("display.primary")) for display in worker.displays]): if config.is_virtual_display(i) or (index is not None and i != index): continue # Load profile and set vcgt if sys.platform != "win32" and oyranos_monitor: display_conf_oy_compat = worker.check_display_conf_oy_compat(i + 1) if display_conf_oy_compat: worker.exec_cmd(oyranos_monitor, ["-x", str(worker.display_rects[i][0]), "-y", str(worker.display_rects[i][1])], capture_output=True, skip_scripts=True, silent=False) if dispwin: if not argyll_use_colord: # Deal with colord ourself profile_arg = worker.get_dispwin_display_profile_argument(i) else: # Argyll deals with colord directly profile_arg = "-L" if (sys.platform == "win32" or not oyranos_monitor or not display_conf_oy_compat or not xcalib or profile_arg == "-L"): # Only need to run dispwin if under Windows, or if nothing else # has already taken care of display profile and vcgt loading # (e.g. oyranos-monitor with xcalib, or colord) if worker.exec_cmd(dispwin, ["-v", "-d%i" % (i + 1), profile_arg], capture_output=True, skip_scripts=True, silent=False): errortxt = "" else: errortxt = "\n".join(worker.errors).strip() if errortxt and ((not "using linear" in errortxt and not "assuming linear" in errortxt) or len(errortxt.split("\n")) > 1): if "Failed to get the displays current ICC profile" in errortxt: # Maybe just not configured continue elif sys.platform == "win32" or \ "Failed to set VideoLUT" in errortxt or \ "We don't have access to the VideoLUT" in errortxt: errstr = lang.getstr("calibration.load_error") else: errstr = lang.getstr("profile.load_error") errors.append(": ".join([display, errstr])) continue else: results.append(display) if (config.getcfg("profile_loader.verify_calibration") or "--verify" in sys.argv[1:]): # Verify the calibration was actually loaded worker.exec_cmd(dispwin, ["-v", "-d%i" % (i + 1), "-V", profile_arg], capture_output=True, skip_scripts=True, silent=False) # The 'NOT loaded' message goes to stdout! # Other errors go to stderr errortxt = "\n".join(worker.errors + worker.output).strip() if "NOT loaded" in errortxt or \ "We don't have access to the VideoLUT" in errortxt: errors.append(": ".join([display, lang.getstr("calibration.load_error")])) if sys.platform == "win32": self.lock.release() if event: self.notify(results, errors) return errors def notify(self, results, errors, sticky=False, show_notification=False): wx.CallAfter(lambda: self and self._notify(results, errors, sticky, show_notification)) def _notify(self, results, errors, sticky=False, show_notification=False): if debug > 1: safe_print("[DEBUG] notify(results=%r, errors=%r, sticky=%s, show_notification=%s)" % (results, errors, sticky, show_notification)) self.taskbar_icon.set_visual_state() results.extend(errors) if errors: flags = wx.ICON_ERROR else: flags = wx.ICON_INFORMATION self.taskbar_icon.show_notification("\n".join(results), sticky, show_notification, flags) if debug > 1: safe_print("[DEBUG] /notify") def apply_profiles_and_warn_on_error(self, event=None, index=None): # wx.App must already be initialized at this point! errors = self.apply_profiles(event, index) if (errors and (config.getcfg("profile_loader.error.show_msg") or "--error-dialog" in sys.argv[1:]) and not "--silent" in sys.argv[1:]): from wxwindows import InfoDialog, wx dlg = InfoDialog(None, msg="\n".join(errors), title=self.get_title(), ok=lang.getstr("ok"), bitmap=config.geticon(32, "dialog-error"), show=False) dlg.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles")) dlg.do_not_show_again_cb = wx.CheckBox(dlg, -1, lang.getstr("dialog.do_not_show_again")) dlg.do_not_show_again_cb.SetValue(not bool(config.getcfg("profile_loader.error.show_msg"))) def do_not_show_again_handler(event=None): config.setcfg("profile_loader.error.show_msg", int(not dlg.do_not_show_again_cb.GetValue())) config.writecfg(module="apply-profiles", options=("argyll.dir", "profile.load_on_login", "profile_loader")) dlg.do_not_show_again_cb.Bind(wx.EVT_CHECKBOX, do_not_show_again_handler) dlg.sizer3.Add(dlg.do_not_show_again_cb, flag=wx.TOP, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Center(wx.BOTH) dlg.ok.SetDefault() dlg.ShowModalThenDestroy() def elevate(self): if sys.getwindowsversion() >= (6, ): from win32com.shell import shell as win32com_shell from win32con import SW_SHOW loader_args = [] if os.path.basename(exe).lower() in ("python.exe", "pythonw.exe"): #cmd = os.path.join(exedir, "pythonw.exe") cmd = exe pyw = os.path.normpath(os.path.join(pydir, "..", appname + "-apply-profiles.pyw")) if os.path.exists(pyw): # Running from source or 0install # Check if this is a 0install implementation, in which # case we want to call 0launch with the appropriate # command if re.match("sha\d+(?:new)?", os.path.basename(os.path.dirname(pydir))): cmd = which("0install-win.exe") or "0install-win.exe" loader_args.extend(["run", "--batch", "--no-wait", "--offline", "--command=run-apply-profiles", "http://%s/0install/%s.xml" % (domain.lower(), appname)]) else: # Running from source loader_args.append(pyw) else: # Regular install loader_args.append(get_data_path("/".join(["scripts", appname + "-apply-profiles"]))) else: cmd = os.path.join(pydir, appname + "-apply-profiles.exe") loader_args.append("--profile-associations") try: run_as_admin(cmd, loader_args) except pywintypes.error, exception: if exception.args[0] != winerror.ERROR_CANCELLED: show_result_dialog(exception) else: self.shutdown() wx.CallLater(50, self.exit) return True def exit(self, event=None): safe_print("Executing ProfileLoader.exit(%s)" % event) dlg = None for dlg in get_dialogs(): if (not isinstance(dlg, ProfileLoaderExceptionsDialog) or (event and hasattr(event, "CanVeto") and not event.CanVeto())): try: dlg.EndModal(wx.ID_CANCEL) except: pass else: dlg = None if dlg and event and hasattr(event, "CanVeto") and event.CanVeto(): # Need to request user attention for all open # dialogs because calling it only on the topmost # one does not guarantee taskbar flash dlg.RequestUserAttention() else: if dlg and event and hasattr(event, "CanVeto") and event.CanVeto(): event.Veto() safe_print("Vetoed", event) return if (event and self.frame and event.GetEventType() == wx.EVT_MENU.typeId and (not calibration_management_isenabled() or config.getcfg("profile_loader.fix_profile_associations"))): dlg = ConfirmDialog(None, msg=lang.getstr("profile_loader.exit_warning"), title=self.get_title(), ok=lang.getstr("menuitem.quit"), bitmap=config.geticon(32, "dialog-warning")) dlg.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-apply-profiles")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: safe_print("Cancelled ProfileLoader.exit(%s)" % event) return self.taskbar_icon and self.taskbar_icon.RemoveIcon() self.monitoring = False if self.frame: self.frame.listening = False wx.GetApp().ExitMainLoop() def get_title(self): title = "%s %s %s" % (appname, lang.getstr("profile_loader").title(), version_short) if VERSION > VERSION_BASE: title += " Beta" if "--force" in sys.argv[1:]: title += " (%s)" % lang.getstr("forced") return title def _can_fix_profile_associations(self): """ Check whether we can 'fix' profile associations or not. 'Fixing' means we assign the profile of the actual active child device to the 1st child device so that applications using GetICMProfile get the correct profile (GetICMProfile always returns the profile of the 1st child device irrespective if this device is active or not. This is a Windows bug). This only works if a child device is not attached to several adapters (which is something that can happen due to the inexplicable mess that is the Windows display enumeration API). """ if not self.child_devices_count: for i, (display, edid, moninfo, device) in enumerate(self.monitors): child_devices = get_display_devices(moninfo["Device"]) for child_device in child_devices: if not child_device.DeviceKey in self.child_devices_count: self.child_devices_count[child_device.DeviceKey] = 0 self.child_devices_count[child_device.DeviceKey] += 1 return (bool(self.child_devices_count) and max(self.child_devices_count.values()) == 1) def _check_keep_running(self): windows = [] #print '-' * 79 try: win32gui.EnumThreadWindows(self._tid, self._enumerate_own_windows_callback, windows) except pywintypes.error, exception: pass windows.extend(filter(lambda window: not isinstance(window, wx.Dialog) and window.Name != "TaskBarNotification" and window.Name != "DisplayIdentification" and window.Name != "profile_info", wx.GetTopLevelWindows())) numwindows = len(windows) if numwindows < self.numwindows: # One of our windows has been closed by an external event # (i.e. WM_CLOSE). This is a hint that something external is trying # to get us to exit. Comply by closing our main top-level window to # initiate clean shutdown. safe_print("Window count", self.numwindows, "->", numwindows) return False self.numwindows = numwindows return True def _enumerate_own_windows_callback(self, hwnd, windowlist): cls = win32gui.GetClassName(hwnd) #print cls if (cls in ("madHcNetQueueWindow", "wxTLWHiddenParent", "wxTimerHiddenWindow", "wxDisplayHiddenWindow", "SysTrayIcon") or cls.startswith("madToolsMsgHandlerWindow")): windowlist.append(cls) def _display_changed(self, event): safe_print(event) threading.Thread(target=self._process_display_changed, name="ProcessDisplayChangedEvent").start() def _process_display_changed(self): if self.lock.locked(): safe_print("ProcessDisplayChangedEvent: Waiting to acquire lock...") with self.lock: safe_print("ProcessDisplayChangedEvent: Acquired lock") self._next = True self._enumerate_monitors() if sys.getwindowsversion() < (6, ): # Under XP, we can't use the registry to figure out if the # display change was a display configuration change (e.g. # display added/removed) or just a resolution change self._has_display_changed = True if getattr(self, "profile_associations_dlg", None): wx.CallAfter(wx.CallLater, 1000, lambda: self.profile_associations_dlg and self.profile_associations_dlg.update(True)) if getattr(self, "fix_profile_associations_dlg", None): wx.CallAfter(wx.CallLater, 1000, lambda: self.fix_profile_associations_dlg and self.fix_profile_associations_dlg.update(True)) safe_print("ProcessDisplayChangedEvent: Releasing lock") def _check_display_changed(self, first_run=False, dry_run=False): # Check registry if display configuration changed (e.g. if a display # was added/removed, and not just the resolution changed) try: key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration") except WindowsError, exception: if (exception.errno != errno.ENOENT or sys.getwindowsversion() >= (6, )): safe_print("Registry access failed:", exception) key = None numsubkeys = 0 if not (self.monitors or dry_run): self._enumerate_monitors() else: numsubkeys, numvalues, mtime = _winreg.QueryInfoKey(key) has_display_changed = False for i in xrange(numsubkeys): subkey = _winreg.OpenKey(key, _winreg.EnumKey(key, i)) display = _winreg.QueryValueEx(subkey, "SetId")[0] timestamp = struct.unpack(" self._current_timestamp: if display != self._current_display: if not (first_run or dry_run): safe_print(lang.getstr("display_detected")) if debug: safe_print(display.replace("\0", "")) if not (first_run or dry_run) or not self.monitors: self._enumerate_monitors() if getcfg("profile_loader.fix_profile_associations"): # Work-around long-standing bug in applications # querying the monitor profile not making sure # to use the active display (this affects Windows # itself as well) when only one display is # active in a multi-monitor setup. if not first_run: self._reset_display_profile_associations() self._set_display_profiles() has_display_changed = True if not (first_run or dry_run) and self._is_displaycal_running(): # Normally calibration loading is disabled while # DisplayCAL is running. Override this when the # display has changed self._manual_restore = getcfg("profile.load_on_login") and 2 if not dry_run: self._current_display = display self._current_timestamp = timestamp _winreg.CloseKey(subkey) if key: _winreg.CloseKey(key) if not dry_run: self._has_display_changed = has_display_changed return has_display_changed def _check_display_conf_wrapper(self): try: self._check_display_conf() except Exception, exception: if self.lock.locked(): self.lock.release() wx.CallAfter(self._handle_fatal_error, traceback.format_exc()) def _handle_fatal_error(self, exception): handle_error(exception) wx.CallAfter(self.exit) def _check_display_conf(self): display = None self._current_display = None self._current_timestamp = 0 self._next = False first_run = True apply_profiles = self._should_apply_profiles() displaycal_running = False previous_hwnds_pids = self._hwnds_pids while self and self.monitoring: result = None results = [] errors = [] idle = True locked = self.lock.locked() if locked: safe_print("DisplayConfigurationMonitoringThread: Waiting to acquire lock...") self.lock.acquire() if locked: safe_print("DisplayConfigurationMonitoringThread: Acquired lock") # Check if display configuration changed self._check_display_changed(first_run) # Check profile associations profile_associations_changed = 0 for i, (display, edid, moninfo, device) in enumerate(self.monitors): display_desc = display.replace("[PRIMARY]", lang.getstr("display.primary")) if device: devicekey = device.DeviceKey else: devicekey = None key = devicekey or str(i) self._current_display_key = key exception = None profile_path = profile_name = None try: profile_path = ICCP.get_display_profile(i, path_only=True, devicekey=devicekey) except IndexError: if debug: safe_print("Display %s (%s) no longer present?" % (key, display)) self._next = False break except Exception, exception: if (exception.args[0] != errno.ENOENT and exception.args != self._last_exception_args) or debug: self._last_exception_args = exception.args safe_print("Could not get display profile for display " "%s (%s):" % (key, display), exception) if exception.args[0] == errno.ENOENT: # Unassigned - don't show error icon self.setgammaramp_success[i] = True exception = None else: self.setgammaramp_success[i] = None else: if profile_path: profile_name = os.path.basename(profile_path) profile_key = safe_unicode(profile_name or exception or "") association = self.profile_associations.get(key, (False, 0, "")) if (getcfg("profile_loader.fix_profile_associations") and not first_run and not self._has_display_changed and not self._next and association[0] != profile_key): # At this point we do not yet know if only the profile # association has changed or the display configuration. # One second delay to allow display configuration # to settle if not self._check_display_changed(dry_run=True): if debug: safe_print("Delay 1s") timeout = 0 while (self and self.monitoring and timeout < 1 and self._manual_restore != 2 and not self._next): time.sleep(.1) timeout += .1 self._next = True break if profile_path and os.path.isfile(profile_path): mtime = os.stat(profile_path).st_mtime else: mtime = 0 profile_association_changed = False if association[:2] != (profile_key, mtime): if profile_name is None: desc = safe_unicode(exception or "?") else: desc = get_profile_desc(profile_name) if not first_run: safe_print("A profile change has been detected") safe_print(display, "->", desc) device = get_active_display_device(moninfo["Device"]) if device: display_edid = get_display_name_edid(device, moninfo, i) if self.monitoring: self.devices2profiles[device.DeviceKey] = (display_edid, profile_name, desc) if (debug or verbose > 1) and device: safe_print("Monitor %s active display device name:" % moninfo["Device"], device.DeviceName) safe_print("Monitor %s active display device string:" % moninfo["Device"], device.DeviceString) safe_print("Monitor %s active display device state flags: 0x%x" % (moninfo["Device"], device.StateFlags)) safe_print("Monitor %s active display device ID:" % moninfo["Device"], device.DeviceID) safe_print("Monitor %s active display device key:" % moninfo["Device"], device.DeviceKey) elif debug or verbose > 1: safe_print("WARNING: Monitor %s has no active display device" % moninfo["Device"]) self.profile_associations[key] = (profile_key, mtime, desc) self.profiles[key] = None self.ramps[key] = (None, None, None) profile_association_changed = True profile_associations_changed += 1 if not first_run and self._is_displaycal_running(): # Normally calibration loading is disabled while # DisplayCAL is running. Override this when the # display has changed self._manual_restore = getcfg("profile.load_on_login") and 2 else: desc = association[2] # Check video card gamma table and (re)load calibration if # necessary if not self.gdi32 or not (profile_name or self._reset_gamma_ramps): continue apply_profiles = self._should_apply_profiles() recheck = False (vcgt_ramp, vcgt_ramp_hack, vcgt_values) = self.ramps.get(self._reset_gamma_ramps or key, (None, None, None)) if not vcgt_ramp: vcgt_values = ([], [], []) if not self._reset_gamma_ramps: # Get display profile if not self.profiles.get(key): try: self.profiles[key] = ICCP.ICCProfile(profile_name) if (isinstance(self.profiles[key].tags.get("MS00"), ICCP.WcsProfilesTagType) and not "vcgt" in self.profiles[key].tags): self.profiles[key].tags["vcgt"] = self.profiles[key].tags["MS00"].get_vcgt() self.profiles[key].tags.get("vcgt") except Exception, exception: safe_print(exception) continue profile = self.profiles[key] if isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType): # Get display profile vcgt vcgt_values = profile.tags.vcgt.get_values()[:3] # Quantize to n bits # 8 bits can be encoded accurately in a 256-entry # 16 bit vcgt, but all other bitdepths need to be # quantized in such a way that the encoded 16-bit # values lie as close as possible to the ideal ones. # We assume the graphics subsystem quantizes using # integer truncating from the 16 bit encoded value if self._quantize < 65535.0: for points in vcgt_values: for point in points: point[1] = int(math.ceil(round(point[1] / 65535.0 * self._quantize) / self._quantize * 65535)) if len(vcgt_values[0]) != 256: # Hmm. Do we need to deal with this? # I've never seen table-based vcgt with != 256 entries if (not self._reset_gamma_ramps and (self._manual_restore or profile_association_changed) and profile.tags.get("vcgt")): safe_print(lang.getstr("calibration.loading_from_display_profile")) safe_print(display_desc) safe_print(lang.getstr("vcgt.unknown_format", os.path.basename(profile.fileName))) safe_print(lang.getstr("failure")) results.append(display_desc) errors.append(lang.getstr("vcgt.unknown_format", os.path.basename(profile.fileName))) # Fall back to linear calibration tagData = "vcgt" tagData += "\0" * 4 # Reserved tagData += "\0\0\0\x01" # Formula type for channel in xrange(3): tagData += "\0\x01\0\0" # Gamma 1.0 tagData += "\0" * 4 # Min 0.0 tagData += "\0\x01\0\0" # Max 1.0 vcgt = ICCP.VideoCardGammaFormulaType(tagData, "vcgt") vcgt_values = vcgt.get_values()[:3] if self._reset_gamma_ramps: safe_print("Caching linear gamma ramps") else: safe_print("Caching implicit linear gamma ramps for profile", desc) else: safe_print("Caching gamma ramps for profile", desc) # Convert vcgt to ushort_Array_256_Array_3 vcgt_ramp = ((ctypes.c_ushort * 256) * 3)() vcgt_ramp_hack = ((ctypes.c_ushort * 256) * 3)() for j in xrange(len(vcgt_values[0])): for k in xrange(3): vcgt_value = vcgt_values[k][j][1] vcgt_ramp[k][j] = vcgt_value # Some video drivers won't reload gamma ramps if # the previously loaded calibration was the same. # Work-around by first loading a slightly changed # gamma ramp. if j == 0: vcgt_value += 1 vcgt_ramp_hack[k][j] = vcgt_value self.ramps[self._reset_gamma_ramps or key] = (vcgt_ramp, vcgt_ramp_hack, vcgt_values) recheck = True if self._skip: self.setgammaramp_success[i] = True if (not apply_profiles and self.__other_component[1] != "madHcNetQueueWindow"): # Important: Do not break here because we still want to # detect changed profile associations continue if getcfg("profile_loader.track_other_processes"): hwnds_pids_changed = self._hwnds_pids != previous_hwnds_pids if ((debug or verbose > 1) and hwnds_pids_changed and previous_hwnds_pids): safe_print("List of running processes changed") hwnds_pids_diff = previous_hwnds_pids.difference(self._hwnds_pids) if hwnds_pids_diff: safe_print("Gone processes:") for hwnd_pid in hwnds_pids_diff: safe_print(*hwnd_pid) hwnds_pids_diff = self._hwnds_pids.difference(previous_hwnds_pids) if hwnds_pids_diff: safe_print("New processes:") for hwnd_pid in hwnds_pids_diff: safe_print(*hwnd_pid) else: hwnds_pids_changed = getcfg("profile_loader.ignore_unchanged_gamma_ramps") if idle: idle = (not hwnds_pids_changed and not self._manual_restore and not profile_association_changed) if (not self._manual_restore and not profile_association_changed and (idle or self.__other_component[1] == "madHcNetQueueWindow") and getcfg("profile_loader.check_gamma_ramps")): # Get video card gamma ramp try: hdc = win32gui.CreateDC(moninfo["Device"], None, None) except Exception, exception: if exception.args != self._last_exception_args or debug: self._last_exception_args = exception.args safe_print("Couldn't create DC for", moninfo["Device"], "(%s)" % display) continue ramp = ((ctypes.c_ushort * 256) * 3)() try: result = self.gdi32.GetDeviceGammaRamp(hdc, ramp) except: continue finally: win32gui.DeleteDC(hdc) if not result: continue # Get ramp values values = ([], [], []) for j, channel in enumerate(ramp): for k, v in enumerate(channel): values[j].append([float(k), v]) if self.__other_component[1] == "madHcNetQueueWindow": madvr_reset_cal = self._madvr_reset_cal.get(key, True) if (not madvr_reset_cal and values == self.linear_vcgt_values): # madVR has reset vcgt self._madvr_reset_cal[key] = True safe_print("madVR did reset gamma ramps for %s, " "do not preserve calibration state" % display) elif (madvr_reset_cal and values == vcgt_values and values != self.linear_vcgt_values): # madVR did not reset vcgt self._madvr_reset_cal[key] = False safe_print("madVR did not reset gamma ramps for %s, " "preserve calibration state" % display) self.setgammaramp_success[i] = True if self._madvr_reset_cal.get(key, True) != madvr_reset_cal: if self._madvr_reset_cal.get(key, True): msg = lang.getstr("app.detected.calibration_loading_disabled", self._component_name) self.notify([msg], [], True, False) continue else: self.notify([], [], True, False) # Check if video card matches profile vcgt if (not hwnds_pids_changed and values == vcgt_values and i in self.setgammaramp_success): idle = True continue idle = False if apply_profiles and not hwnds_pids_changed: safe_print(lang.getstr("vcgt.mismatch", display_desc)) is_buggy_video_driver = self._is_buggy_video_driver(moninfo) if recheck: # Try and prevent race condition with madVR # launching and resetting video card gamma table apply_profiles = self._should_apply_profiles() if not apply_profiles or idle: # Important: Do not break here because we still want to # detect changed profile associations continue if debug or verbose > 1: if self._manual_restore: safe_print("Manual restore flag:", self._manual_restore) if profile_association_changed: safe_print("Number of profile associations changed:", profile_associations_changed) if apply_profiles: safe_print("Apply profiles:", apply_profiles) # Now actually reload or reset calibration if (self._manual_restore or profile_association_changed or (not hwnds_pids_changed and getcfg("profile_loader.check_gamma_ramps"))): if self._reset_gamma_ramps: safe_print(lang.getstr("calibration.resetting")) safe_print(display_desc) else: safe_print(lang.getstr("calibration.loading_from_display_profile")) safe_print(display_desc, "->", desc) elif verbose > 1 and getcfg("profile_loader.track_other_processes"): safe_print("Preserving calibration state for display", display) try: hdc = win32gui.CreateDC(moninfo["Device"], None, None) except Exception, exception: if exception.args != self._last_exception_args or debug: self._last_exception_args = exception.args safe_print("Couldn't create DC for", moninfo["Device"], "(%s)" % display) continue try: if is_buggy_video_driver: result = self.gdi32.SetDeviceGammaRamp(hdc, vcgt_ramp_hack) result = self.gdi32.SetDeviceGammaRamp(hdc, vcgt_ramp) except Exception, exception: result = exception finally: win32gui.DeleteDC(hdc) self.setgammaramp_success[i] = (result and not isinstance(result, Exception)) if (self._manual_restore or profile_association_changed or (not hwnds_pids_changed and getcfg("profile_loader.check_gamma_ramps"))): if isinstance(result, Exception) or not result: if result: safe_print(result) safe_print(lang.getstr("failure")) else: safe_print(lang.getstr("success")) if (self._manual_restore or (profile_association_changed and (isinstance(result, Exception) or not result))): if isinstance(result, Exception) or not result: errstr = lang.getstr("calibration.load_error") errors.append(": ".join([display_desc, errstr])) else: text = display_desc + u": " if self._reset_gamma_ramps: text += lang.getstr("linear").capitalize() else: text += desc results.append(text) else: # We only arrive here if the loop was completed self._next = False if self._next: # We only arrive here if a change in profile associations was # detected and we exited the loop early if locked: safe_print("DisplayConfigurationMonitoringThread: Releasing lock") self.lock.release() if locked: safe_print("DisplayConfigurationMonitoringThread: Released lock") continue previous_hwnds_pids = self._hwnds_pids timestamp = time.time() localtime = list(time.localtime(self._timestamp)) localtime[3:6] = 23, 59, 59 midnight = time.mktime(localtime) + 1 if timestamp >= midnight: self.reload_count = 0 self._timestamp = timestamp if results or errors: if results: self.reload_count += 1 if self._reset_gamma_ramps: lstr = "calibration.reset_success" else: lstr = "calibration.load_success" results.insert(0, lang.getstr(lstr)) if self._app_detection_msg: results.insert(0, self._app_detection_msg) self._app_detection_msg = None self.notify(results, errors, show_notification=bool(not first_run or errors) and self.__other_component[1] != "madHcNetQueueWindow") else: ##if (apply_profiles != self.__apply_profiles or ##profile_associations_changed): if not idle: if apply_profiles and (not profile_associations_changed or not self._reset_gamma_ramps): self.reload_count += 1 if displaycal_running != self._is_displaycal_running(): if displaycal_running: msg = lang.getstr("app.detection_lost.calibration_loading_enabled", appname) else: msg = lang.getstr("app.detected.calibration_loading_disabled", appname) displaycal_running = self._is_displaycal_running() safe_print(msg) self.notify([msg], [], displaycal_running, show_notification=False) elif (apply_profiles != self.__apply_profiles or profile_associations_changed): wx.CallAfter(lambda: self and self.taskbar_icon.set_visual_state()) if apply_profiles and not idle: wx.CallAfter(lambda: self and self.taskbar_icon.animate()) self.__apply_profiles = apply_profiles first_run = False if profile_associations_changed and not self._has_display_changed: if getattr(self, "profile_associations_dlg", None): wx.CallAfter(lambda: self.profile_associations_dlg and self.profile_associations_dlg.update_profiles()) if getattr(self, "fix_profile_associations_dlg", None): wx.CallAfter(lambda: self.fix_profile_associations_dlg and self.fix_profile_associations_dlg.update()) if result: self._has_display_changed = False self._manual_restore = False self._skip = False if locked: safe_print("DisplayConfigurationMonitoringThread: Releasing lock") self.lock.release() if locked: safe_print("DisplayConfigurationMonitoringThread: Released lock") if "--oneshot" in sys.argv[1:]: wx.CallAfter(self.exit) break elif "--profile-associations" in sys.argv[1:]: sys.argv.remove("--profile-associations") wx.CallAfter(self._set_profile_associations, None) # Wait three seconds timeout = 0 while (self and self.monitoring and timeout < 3 and not self._manual_restore and not self._next): if (round(timeout * 100) % 25 == 0 and not self._check_keep_running()): self.monitoring = False wx.CallAfter(lambda: self.frame and self.frame.Close(force=True)) break time.sleep(.1) timeout += .1 safe_print("Display configuration monitoring thread finished") self.shutdown() def shutdown(self): if self._shutdown: return self._shutdown = True safe_print("Shutting down profile loader") if self.monitoring: safe_print("Shutting down display configuration monitoring thread") self.monitoring = False if getcfg("profile_loader.fix_profile_associations"): self._reset_display_profile_associations() self.writecfg() if getattr(self, "frame", None): self.frame.listening = False def _enumerate_monitors(self): safe_print("-" * 80) safe_print("Enumerating display adapters and devices:") safe_print("") self.adapters = dict([(device.DeviceName, device) for device in get_display_devices(None)]) self.monitors = [] self.display_devices = OrderedDict() self.child_devices_count = {} # Enumerate per-adapter devices for adapter in self.adapters: for i, device in enumerate(get_display_devices(adapter)): if not i: device0 = device if device.DeviceKey in self.display_devices: continue display, edid = get_display_name_edid(device) self.display_devices[device.DeviceKey] = [display, edid, device, device0] # Enumerate monitors for i, moninfo in enumerate(get_real_display_devices_info()): if moninfo["Device"] == "WinDisc": # If e.g. we physically disconnect the display device, we will # get a 'WinDisc' temporary monitor we cannot do anything with # (MS, why is this not documented?) safe_print("Skipping 'WinDisc' temporary monitor %i" % i) continue moninfo["_adapter"] = self.adapters.get(moninfo["Device"], ICCP.ADict({"DeviceString": moninfo["Device"][4:]})) if self._is_buggy_video_driver(moninfo): safe_print("Buggy video driver detected: %s." % moninfo["_adapter"].DeviceString, "Gamma ramp hack activated.") # Get monitor descriptive string device = get_active_display_device(moninfo["Device"]) if debug or verbose > 1: safe_print("Found monitor %i %s flags 0x%x" % (i, moninfo["Device"], moninfo["Flags"])) if device: safe_print("Monitor %i active display device name:" % i, device.DeviceName) safe_print("Monitor %i active display device string:" % i, device.DeviceString) safe_print("Monitor %i active display device state flags: " "0x%x" % (i, device.StateFlags)) safe_print("Monitor %i active display device ID:" % i, device.DeviceID) safe_print("Monitor %i active display device key:" % i, device.DeviceKey) else: safe_print("WARNING: Monitor %i has no active display device" % i) display, edid = get_display_name_edid(device, moninfo, i) if debug or verbose > 1: safe_print("Monitor %i active display description" % i, display) safe_print("Enumerating 1st display device for monitor %i %s" % (i, moninfo["Device"])) try: device0 = win32api.EnumDisplayDevices(moninfo["Device"], 0) except pywintypes.error, exception: safe_print("EnumDisplayDevices(%r, 0) failed:" % moninfo["Device"], exception) device0 = None if (debug or verbose > 1) and device0: safe_print("Monitor %i 1st display device name:" % i, device0.DeviceName) safe_print("Monitor %i 1st display device string:" % i, device0.DeviceString) safe_print("Monitor %i 1st display device state flags: 0x%x" % (i, device0.StateFlags)) safe_print("Monitor %i 1st display device ID:" % i, device0.DeviceID) safe_print("Monitor %i 1st display device key:" % i, device0.DeviceKey) if device0: display0, edid0 = get_display_name_edid(device0) if debug or verbose > 1: safe_print("Monitor %i 1st display description" % i, display0) if (device0 and (not device or device0.DeviceKey != device.DeviceKey) and not device0.DeviceKey in self.display_devices): # Key may not exist if device was added after enumerating # per-adapters devices self.display_devices[device0.DeviceKey] = [display0, edid0, device0, device0] if device: if device.DeviceKey in self.display_devices: self.display_devices[device.DeviceKey][0] = display else: # Key may not exist if device was added after enumerating # per-adapters devices self.display_devices[device.DeviceKey] = [display, edid, device, device0] self.monitors.append((display, edid, moninfo, device)) for display, edid, device, device0 in self.display_devices.itervalues(): if device.DeviceKey == device0.DeviceKey: device_name = "\\".join(device.DeviceName.split("\\")[:-1]) safe_print(self.adapters.get(device_name, ICCP.ADict({"DeviceString": device_name[4:]})).DeviceString) display_parts = display.split("@", 1) if len(display_parts) > 1: info = display_parts[1].split(" - ", 1) display_parts[1] = "@" + " ".join(info[:1]) if not device.StateFlags & DISPLAY_DEVICE_ACTIVE: display_parts.append(u" (%s)" % lang.getstr("deactivated")) safe_print(" |-", "".join(display_parts)) def _enumerate_windows_callback(self, hwnd, extra): cls = win32gui.GetClassName(hwnd) if cls == "madHcNetQueueWindow" or self._is_known_window_class(cls): try: thread_id, pid = win32process.GetWindowThreadProcessId(hwnd) filename = get_process_filename(pid) except pywintypes.error: return self._hwnds_pids.add((filename, pid, thread_id, hwnd)) basename = os.path.basename(filename) if (basename.lower() != "madhcctrl.exe" and pid != self._pid): self.__other_component = filename, cls, 0 def _is_known_window_class(self, cls): for partial in self._known_window_classes: if partial in cls: return True def _is_buggy_video_driver(self, moninfo): # Intel video drivers won't reload gamma ramps if the # previously loaded calibration was the same. # Work-around by first loading a slightly changed # gamma ramp. adapter = moninfo["_adapter"].DeviceString.lower() for buggy_video_driver in self._buggy_video_drivers: if buggy_video_driver == "*" or buggy_video_driver in adapter: return True return False def _is_displaycal_running(self): displaycal_lockfile = os.path.join(confighome, appbasename + ".lock") return os.path.isfile(displaycal_lockfile) def _is_other_running(self, enumerate_windows_and_processes=True): """ Determine if other software that may be using the videoLUT is in use (e.g. madVR video playback, madTPG, other calibration software) """ if sys.platform != "win32": return self._is_other_running_lock.acquire() if enumerate_windows_and_processes: # At launch, we won't be able to determine if madVR is running via # the callback API, and we can only determine if another # calibration solution is running by enumerating windows and # processes anyway. other_component = self.__other_component self.__other_component = None, None, 0 # Look for known window classes # Performance on C2D 3.16 GHz (Win7 x64, ~ 90 processes): ~ 1ms self._hwnds_pids = set() try: win32gui.EnumWindows(self._enumerate_windows_callback, None) except pywintypes.error, exception: safe_print("Enumerating windows failed:", exception) if (not self.__other_component[1] or self.__other_component[1] == "madHcNetQueueWindow"): # Look for known processes # Performance on C2D 3.16 GHz (Win7 x64, ~ 90 processes): # ~ 6-9ms (1ms to get PIDs) try: pids = get_pids() except WindowsError, exception: safe_print("Enumerating processes failed:", exception) else: skip = False for pid in pids: try: filename = get_process_filename(pid) except (WindowsError, pywintypes.error), exception: if exception.args[0] not in (winerror.ERROR_ACCESS_DENIED, winerror.ERROR_PARTIAL_COPY, winerror.ERROR_INVALID_PARAMETER, winerror.ERROR_GEN_FAILURE): safe_print("Couldn't get filename of " "process %s:" % pid, exception) continue basename = os.path.basename(filename) if basename.lower() != "madHcCtrl.exe".lower(): # Skip madVR Home Cinema Control self._hwnds_pids.add((filename, pid)) if skip: continue known_app = basename.lower() in self._known_apps enabled, reset, path = self._exceptions.get(filename.lower(), (0, 0, "")) if known_app or enabled: if known_app or not reset: self.__other_component = filename, None, 0 skip = True elif other_component != (filename, None, reset): self._reset_gamma_ramps = True self.__other_component = filename, None, reset if other_component != self.__other_component: if other_component[2] and not self.__other_component[2]: self._reset_gamma_ramps = bool(config.getcfg("profile_loader.reset_gamma_ramps")) check = ((not other_component[2] and not self.__other_component[2]) or (other_component[2] and self.__other_component[0:2] != (None, None) and not self.__other_component[2])) if check: if self.__other_component[0:2] == (None, None): lstr = "app.detection_lost.calibration_loading_enabled" component = other_component sticky = False else: lstr = "app.detected.calibration_loading_disabled" component = self.__other_component sticky = True else: if self.__other_component[0:2] != (None, None): lstr = "app.detected" component = self.__other_component else: lstr = "app.detection_lost" component = other_component if component[1] == "madHcNetQueueWindow": component_name = "madVR" self._madvr_reset_cal = {} elif component[0]: component_name = os.path.basename(component[0]) try: info = get_file_info(component[0])["StringFileInfo"].values() except: info = None if info: # Use FileDescription over ProductName (the former may # be more specific, e.g. Windows Display Color # Calibration, the latter more generic, e.g. Microsoft # Windows) component_name = info[0].get("FileDescription", info[0].get("ProductName", component_name)) else: component_name = lang.getstr("unknown") if self.__other_component[0:2] != (None, None): self._component_name = component_name else: self._component_name = None msg = lang.getstr(lstr, component_name) safe_print(msg) if check: self.notify([msg], [], sticky, show_notification=component_name != "madVR") else: self._app_detection_msg = msg self._manual_restore = getcfg("profile.load_on_login") and 2 result = (self.__other_component[0:2] != (None, None) and not self.__other_component[2]) self._is_other_running_lock.release() if self.__other_component[1] == "madHcNetQueueWindow": if enumerate_windows_and_processes: # Check if gamma ramps were reset for current display return self._madvr_reset_cal.get(self._current_display_key, True) else: # Check if gamma ramps were reset for any display return (len(self._madvr_reset_cal) < len(self.monitors) or True in self._madvr_reset_cal.values()) return result def _madvr_connection_callback(self, param, connection, ip, pid, module, component, instance, is_new_instance): if self.lock.locked(): safe_print("Waiting to acquire lock...") with self.lock: safe_print("Acquired lock") if ip in ("127.0.0.1", "localhost", "::1", "0:0:0:0:0:0:0:1"): args = (param, connection, ip, pid, module, component, instance) try: filename = get_process_filename(pid) except: filename = lang.getstr("unknown") if is_new_instance: apply_profiles = self._should_apply_profiles(manual_override=None) self._madvr_instances.append(args) self.__other_component = filename, "madHcNetQueueWindow", 0 safe_print("madVR instance connected:", "PID", pid, filename) if apply_profiles: msg = lang.getstr("app.detected.calibration_loading_disabled", component) safe_print(msg) self.notify([msg], [], True, show_notification=False) wx.CallAfter(wx.CallLater, 1500, self._check_madvr_reset_cal, args) elif args in self._madvr_instances: self._madvr_instances.remove(args) safe_print("madVR instance disconnected:", "PID", pid, filename) if (not self._madvr_instances and self._should_apply_profiles(manual_override=None)): msg = lang.getstr("app.detection_lost.calibration_loading_enabled", component) safe_print(msg) self.notify([msg], [], show_notification=False) safe_print("Releasing lock") def _check_madvr_reset_cal(self, madvr_instance): if not madvr_instance in self._madvr_instances: return # Check if madVR did reset the video card gamma tables. # If it didn't, assume we can keep preserving calibration state with self.lock: self._next = True def _reset_display_profile_associations(self): if not self._can_fix_profile_associations(): return for devicekey, (display_edid, profile, desc) in self.devices2profiles.iteritems(): if profile: try: current_profile = ICCP.get_display_profile(path_only=True, devicekey=devicekey) except Exception, exception: safe_print("Could not get display profile for display " "device %s (%s):" % (devicekey, display_edid[0]), exception) continue if not current_profile: continue current_profile = os.path.basename(current_profile) if current_profile and current_profile != profile: safe_print("Resetting profile association for %s:" % display_edid[0], current_profile, "->", profile) try: if (not is_superuser() and not per_user_profiles_isenabled(devicekey=devicekey)): # Can only associate profiles to the display if # per-user-profiles are enabled or if running as admin enable_per_user_profiles(devicekey=devicekey) ICCP.set_display_profile(profile, devicekey=devicekey) ICCP.unset_display_profile(current_profile, devicekey=devicekey) except WindowsError, exception: safe_print(exception) def _set_display_profiles(self, dry_run=False): if not self._can_fix_profile_associations(): return if debug or verbose > 1: safe_print("-" * 80) safe_print("Checking profile associations") safe_print("") self.devices2profiles = {} for i, (display, edid, moninfo, device) in enumerate(self.monitors): if debug or verbose > 1: safe_print("Enumerating display devices for monitor %i %s" % (i, moninfo["Device"])) devices = get_display_devices(moninfo["Device"]) if not devices: if debug or verbose > 1: safe_print("WARNING: Monitor %i has no display devices" % i) continue active_device = get_active_display_device(None, devices=devices) if debug or verbose > 1: if active_device: safe_print("Monitor %i active display device name:" % i, active_device.DeviceName) safe_print("Monitor %i active display device string:" % i, active_device.DeviceString) safe_print("Monitor %i active display device state flags: " "0x%x" % (i, active_device.StateFlags)) safe_print("Monitor %i active display device ID:" % i, active_device.DeviceID) safe_print("Monitor %i active display device key:" % i, active_device.DeviceKey) else: safe_print("WARNING: Monitor %i has no active display device" % i) for device in devices: if active_device and device.DeviceID == active_device.DeviceID: active_moninfo = moninfo else: active_moninfo = None display_edid = get_display_name_edid(device, active_moninfo) try: profile = ICCP.get_display_profile(path_only=True, devicekey=device.DeviceKey) except Exception, exception: safe_print("Could not get display profile for display " "device %s (%s):" % (device.DeviceKey, display_edid[0]), exception) profile = None if profile: profile = os.path.basename(profile) self.devices2profiles[device.DeviceKey] = (display_edid, profile, get_profile_desc(profile)) if debug or verbose > 1: safe_print("%s (%s) -> %s" % (display_edid[0], device.DeviceKey, profile)) # Set the active profile device = active_device if not device: continue try: correct_profile = ICCP.get_display_profile(path_only=True, devicekey=device.DeviceKey) except Exception, exception: safe_print("Could not get display profile for active display " "device %s (%s):" % (device.DeviceKey, display), exception) continue if correct_profile: correct_profile = os.path.basename(correct_profile) device = devices[0] current_profile = self.devices2profiles[device.DeviceKey][1] if (correct_profile and current_profile != correct_profile and not dry_run): safe_print("Fixing profile association for %s:" % display, current_profile, "->", correct_profile) try: if (not is_superuser() and not per_user_profiles_isenabled(devicekey=device.DeviceKey)): # Can only associate profiles to the display if # per-user-profiles are enabled or if running as admin enable_per_user_profiles(devicekey=device.DeviceKey) ICCP.set_display_profile(os.path.basename(correct_profile), devicekey=device.DeviceKey) except WindowsError, exception: safe_print(exception) def _set_manual_restore(self, event, manual_restore=True): if event: safe_print("Menu command:", end=" ") safe_print("Set calibration state to load profile vcgt") if self.lock.locked(): safe_print("Waiting to acquire lock...") with self.lock: safe_print("Acquired lock") setcfg("profile_loader.reset_gamma_ramps", 0) self._manual_restore = manual_restore self._reset_gamma_ramps = False safe_print("Releasing lock") self.taskbar_icon.set_visual_state() self.writecfg() def _set_reset_gamma_ramps(self, event, manual_restore=True): if event: safe_print("Menu command:", end=" ") safe_print("Set calibration state to reset vcgt") if self.lock.locked(): safe_print("Waiting to acquire lock...") with self.lock: safe_print("Acquired lock") setcfg("profile_loader.reset_gamma_ramps", 1) self._manual_restore = manual_restore self._reset_gamma_ramps = True safe_print("Releasing lock") self.taskbar_icon.set_visual_state() self.writecfg() def _should_apply_profiles(self, enumerate_windows_and_processes=True, manual_override=2): displaycal_running = self._is_displaycal_running() if displaycal_running: enumerate_windows_and_processes = False return (not self._is_other_running(enumerate_windows_and_processes) and (not displaycal_running or self._manual_restore == manual_override) and not self._skip and ("--force" in sys.argv[1:] or self._manual_restore or (config.getcfg("profile.load_on_login") and (sys.platform != "win32" or not calibration_management_isenabled())))) def _toggle_fix_profile_associations(self, event, parent=None): if event: safe_print("Menu command:", end=" ") safe_print("Toggle fix profile associations", event.IsChecked()) if event.IsChecked(): dlg = FixProfileAssociationsDialog(self, parent) self.fix_profile_associations_dlg = dlg result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_CANCEL: safe_print("Cancelled toggling fix profile associations") return False if self.lock.locked(): safe_print("Waiting to acquire lock...") with self.lock: safe_print("Acquired lock") setcfg("profile_loader.fix_profile_associations", int(event.IsChecked())) if event.IsChecked(): self._set_display_profiles() else: self._reset_display_profile_associations() self._manual_restore = True self.writecfg() safe_print("Releasing lock") return event.IsChecked() def _set_exceptions(self): self._exceptions = {} exceptions = config.getcfg("profile_loader.exceptions").strip() if exceptions: safe_print("Exceptions:") for exception in exceptions.split(";"): exception = exception.split(":", 2) if len(exception) < 3: # Malformed, ignore continue for i in xrange(2): try: exception[i] = int(exception[i]) except: exception[i] = 0 enabled, reset, path = exception self._exceptions[path.lower()] = (enabled, reset, path) safe_print("Enabled=%s" % bool(enabled), "Action=%s" % (reset and "Reset" or "Disable"), path) def _set_profile_associations(self, event): if event: safe_print("Menu command:", end=" ") safe_print("Set profile associations") dlg = ProfileAssociationsDialog(self) self.profile_associations_dlg = dlg dlg.Center() dlg.ShowModalThenDestroy() def writecfg(self): config.writecfg(module="apply-profiles", options=("argyll.dir", "profile.load_on_login", "profile_loader")) def Property(func): return property(**func()) def get_display_name_edid(device, moninfo=None, index=None, include_adapter=False): edid = {} if device: display = safe_unicode(device.DeviceString) try: edid = get_edid(device=device) except Exception, exception: pass else: display = lang.getstr("unknown") display = edid.get("monitor_name", display) if moninfo: m_left, m_top, m_right, m_bottom = moninfo["Monitor"] m_width = m_right - m_left m_height = m_bottom - m_top display = " @ ".join([display, "%i, %i, %ix%i" % (m_left, m_top, m_width, m_height)]) if moninfo["Flags"] & MONITORINFOF_PRIMARY: display += " [PRIMARY]" if moninfo.get("_adapter") and include_adapter: display += u" - %s" % moninfo["_adapter"].DeviceString if index is not None: display = "%i. %s" % (index + 1, display) return display, edid def get_profile_desc(profile_path, include_basename_if_different=True): """ Return profile description or path if not available """ if not profile_path: return "" try: profile = ICCP.ICCProfile(profile_path) profile_desc = profile.getDescription() except Exception, exception: if not isinstance(exception, IOError): exception = traceback.format_exc() safe_print("Could not get description of profile %s:" % profile_path, exception) else: basename = os.path.basename(profile_path) name = os.path.splitext(basename)[0] if (basename != profile_desc and include_basename_if_different and name not in (profile_desc, safe_asciize(profile_desc))): return u"%s (%s)" % (profile_desc, basename) return profile_desc return profile_path def main(): unknown_option = None for arg in sys.argv[1:]: if (arg not in ("--debug", "-d", "--help", "--force", "-V", "--version", "--skip", "--test", "-t", "--verbose", "--verbose=1", "--verbose=2", "--verbose=3", "-v") and (arg not in ("--oneshot", "--task", "--profile-associations") or sys.platform != "win32") and (arg not in ("--verify", "--silent", "--error-dialog") or sys.platform == "win32")): unknown_option = arg break if "--help" in sys.argv[1:] or unknown_option: if unknown_option: safe_print("%s: unrecognized option `%s'" % (os.path.basename(sys.argv[0]), unknown_option)) if sys.platform == "win32": BaseApp._run_exitfuncs() safe_print("Usage: %s [OPTION]..." % os.path.basename(sys.argv[0])) safe_print("Apply profiles to configured display devices and load calibration") safe_print("Version %s" % version) safe_print("") safe_print("Options:") safe_print(" --help Output this help text and exit") safe_print(" --force Force loading of calibration/profile (if it has been") safe_print(" disabled in %s.ini)" % appname) safe_print(" --skip Skip initial loading of calibration") if sys.platform == "win32": safe_print(" --oneshot Exit after loading calibration") else: safe_print(" --verify Verify if calibration was loaded correctly") safe_print(" --silent Do not show dialog box on error") safe_print(" --error-dialog Force dialog box on error") safe_print(" -V, --version Output version information and exit") if sys.platform == "win32": safe_print("") import textwrap safe_print("Configuration options (%s):" % os.path.join(confighome, appbasename + "-apply-profiles.ini")) safe_print("") for cfgname, cfgdefault in sorted(config.defaults.items()): if (cfgname.startswith("profile_loader.") or cfgname == "profile.load_on_login"): # Documentation key = cfgname.split(".", 1)[1] if key == "load_on_login": cfgdoc = "Apply calibration state on login and preserve" elif key == "buggy_video_drivers": cfgdoc = ("List of buggy video driver names (case " "insensitive, delimiter: ';')") elif key == "check_gamma_ramps": cfgdoc = ("Check if video card gamma table has " "changed and reapply calibration state if so") elif key == "exceptions": cfgdoc = ("List of exceptions (case " "insensitive, delimiter: ';', format: " ":)") elif key == "fix_profile_associations": cfgdoc = "Automatically fix profile asociations" elif key == "ignore_unchanged_gamma_ramps": cfgdoc = ("Ignore unchanged gamma table, i.e. reapply " "calibration state even if no change (only " "effective if profile_loader." "track_other_processes = 0)") elif key == "quantize_bits": cfgdoc = ("Quantize video card gamma table to " "bits") elif key == "reset_gamma_ramps": cfgdoc = "Reset video card gamma table to linear" elif key == "track_other_processes": cfgdoc = ("Reapply calibration state when other " "processes launch or exit") elif key == "tray_icon_animation_quality": cfgdoc = "Tray icon animation quality, 0 = off" else: continue # Name and valid values valid = config.valid_values.get(cfgname) if valid: valid = u"[%s]" % u"|".join(u"%s" % v for v in valid) else: valid = config.valid_ranges.get(cfgname) if valid: valid = "[%s..%s]" % tuple(valid) elif isinstance(cfgdefault, int): # Boolean valid = "[0|1]" elif isinstance(cfgdefault, basestring): # String valid = "" cfgdefault = "'%s'" % cfgdefault else: valid = "" safe_print(cfgname.ljust(45, " "), valid) cfgdoc += " [Default: %s]." % cfgdefault for line in textwrap.fill(cfgdoc, 75).splitlines(): safe_print(" " * 4 + line.rstrip()) elif "-V" in sys.argv[1:] or "--version" in sys.argv[1:]: safe_print("%s %s" % (os.path.basename(sys.argv[0]), version)) else: if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and not "--task" in sys.argv[1:]): import taskscheduler taskname = appname + " Profile Loader Launcher" try: ts = taskscheduler.TaskScheduler() except Exception, exception: safe_print("Warning - could not access task scheduler:", exception) else: if is_superuser() and not ts.query_task(taskname): # Check if our task exists, and if it does not, create it. # (requires admin privileges) safe_print("Trying to create task %r..." % taskname) # Note that we use a stub so the task cannot be accidentally # stopped (the stub launches the actual profile loader and # then immediately exits) loader_args = [] if os.path.basename(exe).lower() in ("python.exe", "pythonw.exe"): cmd = os.path.join(exedir, "pythonw.exe") pyw = os.path.normpath(os.path.join(pydir, "..", appname + "-apply-profiles.pyw")) script = get_data_path("/".join(["scripts", appname + "-apply-profiles-launcher"])) if os.path.exists(pyw): # Running from source or 0install # Check if this is a 0install implementation, in which # case we want to call 0launch with the appropriate # command if re.match("sha\d+(?:new)?", os.path.basename(os.path.dirname(pydir))): # No stub needed as 0install-win acts as stub cmd = which("0install-win.exe") or "0install-win.exe" loader_args.extend(["run", "--batch", "--no-wait", "--offline", "--command=run-apply-profiles", "--", "http://%s/0install/%s.xml" % (domain.lower(), appname), "--task"]) else: # Running from source loader_args.append(script) else: # Regular (site-packages) install loader_args.append(script) else: # Standalone executable cmd = os.path.join(pydir, appname + "-apply-profiles-launcher.exe") try: # Create the task created = ts.create_logon_task(taskname, cmd, loader_args, u"Open Source Developer, " u"Florian Höch", "This task launches the profile " "loader with the applicable " "privileges for logged in users", multiple_instances=taskscheduler.MULTIPLEINSTANCES_STOPEXISTING, replace_existing=True) except Exception, exception: if debug: exception = traceback.format_exc() safe_print("Warning - Could not create task %r:" % taskname, exception) if ts.stdout: safe_print(ts.stdout) else: safe_print(ts.stdout) if created: # Remove autostart entries, if any name = appname + " Profile Loader" entries = [] if autostart: entries.append(os.path.join(autostart, name + ".lnk")) if autostart_home: entries.append(os.path.join(autostart_home, name + ".lnk")) for entry in entries: if os.path.isfile(entry): safe_print("Removing", entry) try: os.remove(entry) except EnvironmentError, exception: safe_print(exception) config.initcfg("apply-profiles") if (not "--force" in sys.argv[1:] and not config.getcfg("profile.load_on_login") and sys.platform != "win32"): # Early exit incase profile loading has been disabled and isn't forced sys.exit() if "--error-dialog" in sys.argv[1:]: config.setcfg("profile_loader.error.show_msg", 1) config.writecfg(module="apply-profiles", options=("argyll.dir", "profile.load_on_login", "profile_loader")) global lang import localization as lang lang.init() ProfileLoader() if __name__ == "__main__": main() DisplayCAL-3.5.0.0/DisplayCAL/pyi_md5pickuphelper.py0000644000076500000000000000045112665102054021760 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from sys import platform if platform not in ("darwin", "win32"): try: import _md5 except ImportError: _md5 = None try: from hashlib import md5 except ImportError, exception: if platform not in ("darwin", "win32") and _md5: md5 = _md5 else: raise exceptionDisplayCAL-3.5.0.0/DisplayCAL/quirk.json0000644000076500000000000000374112750222204017452 0ustar devwheel00000000000000// From colord/lib/colord/cd_quirk.c, cd_quirk_vendor_name { "suffixes": [ "Co.", "Co", "Inc.", "Inc", "Ltd.", "Ltd", "Corporation", "Incorporated", "Limited", "GmbH", "corp." ], "vendor_names": { "Acer, inc.": "Acer", "Acer Technologies": "Acer", "AOC Intl": "AOC", "Apple Computer Inc": "Apple", "Arnos Insturments & Computer Systems": "Arnos", "ASUSTeK Computer Inc.": "ASUSTeK", "ASUSTeK Computer INC": "ASUSTeK", "ASUSTeK COMPUTER INC.": "ASUSTeK", "BTC Korea Co., Ltd": "BTC", "CASIO COMPUTER CO.,LTD": "Casio", "CLEVO": "Clevo", "Delta Electronics": "Delta", "Eizo Nanao Corporation": "Eizo", "Envision Peripherals,": "Envision", "FUJITSU": "Fujitsu", "Fujitsu Siemens Computers GmbH": "Fujitsu Siemens", "Funai Electric Co., Ltd.": "Funai", "Gigabyte Technology Co., Ltd.": "Gigabyte", "Goldstar Company Ltd": "LG", "GOOGLE": "Google", "Hewlett-Packard": "Hewlett Packard", "Hitachi America Ltd": "Hitachi", "HP": "Hewlett Packard", "HWP": "Hewlett Packard", "IBM France": "IBM", "Lenovo Group Limited": "Lenovo", "LENOVO": "Lenovo", "Iiyama North America": "Iiyama", "MARANTZ JAPAN, INC.": "Marantz", "Mitsubishi Electric Corporation": "Mitsubishi", "Nexgen Mediatech Inc.,": "Nexgen Mediatech", "NIKON": "Nikon", "Panasonic Industry Company": "Panasonic", "Philips Consumer Electronics Company": "Philips", "RGB Systems, Inc. dba Extron Electronics": "Extron", "SAM": "Samsung", "Samsung Electric Company": "Samsung", "Samsung Electronics America": "Samsung", "samsung": "Samsung", "SAMSUNG": "Samsung", "Sanyo Electric Co.,Ltd.": "Sanyo", "Sonix Technology Co.": "Sonix", "System manufacturer": "Unknown", "To Be Filled By O.E.M.": "Unknown", "Toshiba America Info Systems Inc": "Toshiba", "Toshiba Matsushita Display Technology Co.,": "Toshiba", "TOSHIBA": "Toshiba", "Unknown vendor": "Unknown", "Westinghouse Digital Electronics": "Westinghouse Digital", "Zalman Tech Co., Ltd.": "Zalman" } }DisplayCAL-3.5.0.0/DisplayCAL/RealDisplaySizeMM.c0000644000076500000000000012122113221373200021055 0ustar devwheel00000000000000#include "Python.h" #include #include #include #include #include #include #include #ifdef NT # include # include #else # include # include # include #endif #ifdef __APPLE__ /* Assume OSX Carbon */ # include # include # include #endif /* __APPLE__ */ #if defined(UNIX) && !defined(__APPLE__) # include # include # include # include # include # include # include # include # include #endif /* UNIX */ #if defined(_MSC_VER) # define DLL extern "C" __declspec(dllexport) #else # define DLL #endif #define errout stderr #ifdef DEBUG # define debug(xx) fprintf(errout, xx ) # define debug2(xx) fprintf xx # define debugr(xx) fprintf(errout, xx ) # define debugr2(xx) fprintf xx # define debugrr(xx) fprintf(errout, xx ) # define debugrr2(xx) fprintf xx #else # define debug(xx) # define debug2(xx) # define debugr(xx) # define debugr2(xx) # define debugrr(xx) # define debugrr2(xx) #endif // START disppath /* Structure to store infomation about possible displays */ typedef struct { char *name; /* Display name */ char *description; /* Description of display or URL */ int sx,sy; /* Displays offset in pixels */ int sw,sh; /* Displays width and height in pixels*/ #ifdef NT char monid[128]; /* Monitor ID */ int prim; /* NZ if primary display monitor */ #endif /* NT */ #ifdef __APPLE__ CGDirectDisplayID ddid; #endif /* __APPLE__ */ #if defined(UNIX) && !defined(__APPLE__) int screen; /* X11 (possibly virtual) Screen */ int uscreen; /* Underlying Xinerma/XRandr screen */ int rscreen; /* Underlying RAMDAC screen (user override) */ Atom icc_atom; /* ICC profile root/output atom for this display */ unsigned char *edid; /* 128 or 256 bytes of monitor EDID, NULL if none */ int edid_len; /* 128 or 256 */ #if RANDR_MAJOR == 1 && RANDR_MINOR >= 2 /* Xrandr stuff - output is connected 1:1 to a display */ RRCrtc crtc; /* Associated crtc */ RROutput output; /* Associated output */ Atom icc_out_atom; /* ICC profile atom for this output */ #endif /* randr >= V 1.2 */ #endif /* UNIX */ } disppath; // END disppath void free_a_disppath(disppath *path); void free_disppaths(disppath **paths); /* ===================================================================== */ /* Display enumeration code */ /* ===================================================================== */ int callback_ddebug = 0; /* Diagnostic global for get_displays() and get_a_display() */ /* and events */ #ifdef NT #define sleep(secs) Sleep((secs) * 1000) static BOOL CALLBACK MonitorEnumProc( HMONITOR hMonitor, /* handle to display monitor */ HDC hdcMonitor, /* NULL, because EnumDisplayMonitors hdc is NULL */ LPRECT lprcMonitor, /* Virtual screen coordinates of this monitor */ LPARAM dwData /* Context data */ ) { disppath ***pdisps = (disppath ***)dwData; disppath **disps = *pdisps; MONITORINFOEX pmi; int ndisps = 0; debugrr2((errout, "MonitorEnumProc() called with hMonitor = 0x%x\n",hMonitor)); /* Get some more information */ pmi.cbSize = sizeof(MONITORINFOEX); if (GetMonitorInfo(hMonitor, (MONITORINFO *)&pmi) == 0) { debugrr("get_displays failed GetMonitorInfo - ignoring display\n"); return TRUE; } /* See if it seems to be a pseudo-display */ if (strncmp(pmi.szDevice, "\\\\.\\DISPLAYV", 12) == 0) { debugrr("Seems to be invisible pseudo-display - ignoring it\n"); return TRUE; } /* Add the display to the list */ if (disps == NULL) { if ((disps = (disppath **)calloc(sizeof(disppath *), 1 + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); return FALSE; } } else { /* Count current number on list */ for (ndisps = 0; disps[ndisps] != NULL; ndisps++) ; if ((disps = (disppath **)realloc(disps, sizeof(disppath *) * (ndisps + 2))) == NULL) { debugrr("get_displays failed on malloc\n"); return FALSE; } disps[ndisps+1] = NULL; /* End marker */ } if ((disps[ndisps] = calloc(sizeof(disppath),1)) == NULL) { debugrr("get_displays failed on malloc\n"); return FALSE; } if ((disps[ndisps]->name = strdup(pmi.szDevice)) == NULL) { debugrr("malloc failed\n"); return FALSE; } disps[ndisps]->prim = (pmi.dwFlags & MONITORINFOF_PRIMARY) ? 1 : 0; disps[ndisps]->sx = lprcMonitor->left; disps[ndisps]->sy = lprcMonitor->top; disps[ndisps]->sw = lprcMonitor->right - lprcMonitor->left; disps[ndisps]->sh = lprcMonitor->bottom - lprcMonitor->top; disps[ndisps]->description = NULL; debugrr2((errout, "MonitorEnumProc() set initial monitor info: %d,%d %d,%d name '%s'\n",disps[ndisps]->sx,disps[ndisps]->sy,disps[ndisps]->sw,disps[ndisps]->sh, disps[ndisps]->name)); *pdisps = disps; return TRUE; } /* Dynamically linked function support */ BOOL (WINAPI* pEnumDisplayDevices)(PVOID,DWORD,PVOID,DWORD) = NULL; /* See if we can get the wanted function calls */ /* return nz if OK */ static int setup_dyn_calls() { static int dyn_inited = 0; if (dyn_inited == 0) { dyn_inited = 1; /* EnumDisplayDevicesA was left out of lib32.lib on earlier SDK's ... */ pEnumDisplayDevices = (BOOL (WINAPI*)(PVOID,DWORD,PVOID,DWORD)) GetProcAddress(LoadLibrary("USER32"), "EnumDisplayDevicesA"); if (pEnumDisplayDevices == NULL) dyn_inited = 0; } return dyn_inited; } /* Simple up conversion from char string to wchar string */ /* Return NULL if malloc fails */ /* ~~~ Note, should probably replace this with mbstowcs() ???? */ static unsigned short *char2wchar(char *s) { unsigned char *cp; unsigned short *w, *wp; if ((w = malloc(sizeof(unsigned short) * (strlen(s) + 1))) == NULL) return w; for (cp = (unsigned char *)s, wp = w; ; cp++, wp++) { *wp = *cp; /* Zero extend */ if (*cp == 0) break; } return w; } #endif /* NT */ #if defined(UNIX) && !defined(__APPLE__) /* Hack to notice if the error handler has been triggered */ /* when a function doesn't return a value. */ int g_error_handler_triggered = 0; /* A noop X11 error handler */ int null_error_handler(Display *disp, XErrorEvent *ev) { g_error_handler_triggered = 1; return 0; } #endif /* X11 */ /* Return pointer to list of disppath. Last will be NULL. */ /* Return NULL on failure. Call free_disppaths() to free up allocation */ disppath **get_displays() { disppath **disps = NULL; #ifdef NT DISPLAY_DEVICE dd; char buf[200]; int i, j; if (setup_dyn_calls() == 0) { debugrr("Dynamic linking to EnumDisplayDevices or Vista AssociateColorProfile failed\n"); free_disppaths(disps); return NULL; } /* Create an initial list of monitors */ /* (It might be better to call pEnumDisplayDevices(NULL, i ..) instead ??, */ /* then we can use the StateFlags to distingish monitors not attached to the desktop etc.) */ if (EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)&disps) == 0) { debugrr("EnumDisplayMonitors failed\n"); free_disppaths(disps); return NULL; } /* Now locate detailed information about displays */ for (i = 0; ; i++) { if (disps == NULL || disps[i] == NULL) break; dd.cb = sizeof(dd); debugrr2((errout, "get_displays about to get monitor information for %d\n",i)); /* Get monitor information */ for (j = 0; ;j++) { if ((*pEnumDisplayDevices)(disps[i]->name, j, &dd, 0) == 0) { debugrr2((errout,"EnumDisplayDevices failed on '%s' Mon = %d\n",disps[i]->name,j)); if (j == 0) { strcpy(disps[i]->monid, ""); /* We won't be able to set a profile */ } break; } if (callback_ddebug) { fprintf(errout,"Mon %d, name '%s'\n",j,dd.DeviceName); fprintf(errout,"Mon %d, string '%s'\n",j,dd.DeviceString); fprintf(errout,"Mon %d, flags 0x%x\n",j,dd.StateFlags); fprintf(errout,"Mon %d, id '%s'\n",j,dd.DeviceID); fprintf(errout,"Mon %d, key '%s'\n",j,dd.DeviceKey); } if (j == 0) { strcpy(disps[i]->monid, dd.DeviceID); } } sprintf(buf,"%s, at %d, %d, width %d, height %d%s",disps[i]->name+4, disps[i]->sx, disps[i]->sy, disps[i]->sw, disps[i]->sh, disps[i]->prim ? " (Primary Display)" : ""); if ((disps[i]->description = strdup(buf)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); return NULL; } debugrr2((errout, "get_displays added description '%s' to display %d\n",disps[i]->description,i)); /* Note that calling EnumDisplayDevices(NULL, j, ..) for the adapter can return other */ /* information, such as the graphics card name, and additional state flags. */ /* EnumDisplaySettings() can also be called to get information such as display depth etc. */ } #ifdef NEVER /* Explore adapter information */ for (j = 0; ; j++) { /* Get adapater information */ if ((*pEnumDisplayDevices)(NULL, j, &dd, 0) == 0) break; printf("Adapt %d, name '%s'\n",j,dd.DeviceName); printf("Adapt %d, string '%s'\n",j,dd.DeviceString); printf("Adapt %d, flags 0x%x\n",j,dd.StateFlags); printf("Adapt %d, id '%s'\n",j,dd.DeviceID); printf("Adapt %d, key '%s'\n",j,dd.DeviceKey); } #endif /* NEVER */ #endif /* NT */ #ifdef __APPLE__ /* Note :- some recent releases of OS X have a feature which */ /* automatically adjusts the screen brigtness with ambient level. */ /* We may have to find a way of disabling this during calibration and profiling. */ /* See the "pset -g" command. */ /* We could possibly use NSScreen instead of CG here, If we're using libui, then we have an NSApp, so this would be possible. */ int i; CGDisplayErr dstat; CGDisplayCount dcount; /* Number of display IDs */ CGDirectDisplayID *dids; /* Array of display IDs */ if ((dstat = CGGetActiveDisplayList(0, NULL, &dcount)) != kCGErrorSuccess || dcount < 1) { debugrr("CGGetActiveDisplayList #1 returned error\n"); return NULL; } if ((dids = (CGDirectDisplayID *)malloc(dcount * sizeof(CGDirectDisplayID))) == NULL) { debugrr("malloc of CGDirectDisplayID's failed\n"); return NULL; } if ((dstat = CGGetActiveDisplayList(dcount, dids, &dcount)) != kCGErrorSuccess) { debugrr("CGGetActiveDisplayList #2 returned error\n"); free(dids); return NULL; } /* Found dcount displays */ debugrr2((errout,"Found %d screens\n",dcount)); /* Allocate our list */ if ((disps = (disppath **)calloc(sizeof(disppath *), dcount + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); free(dids); return NULL; } for (i = 0; i < dcount; i++) { if ((disps[i] = calloc(sizeof(disppath), 1)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); free(dids); return NULL; } disps[i]->ddid = dids[i]; } /* Got displays, now figure out a description for each one */ for (i = 0; i < dcount; i++) { CGRect dbound; /* Bounding rectangle of chosen display */ io_service_t dport; CFDictionaryRef ddr, pndr; CFIndex dcount; char *dp = NULL, desc[50]; char buf[200]; dbound = CGDisplayBounds(dids[i]); disps[i]->sx = dbound.origin.x; disps[i]->sy = dbound.origin.y; disps[i]->sw = dbound.size.width; disps[i]->sh = dbound.size.height; /* Try and get some information about the display */ if ((dport = CGDisplayIOServicePort(dids[i])) == MACH_PORT_NULL) { debugrr("CGDisplayIOServicePort returned error\n"); free_disppaths(disps); free(dids); return NULL; } #ifdef NEVER { io_name_t name; if (IORegistryEntryGetName(dport, name) != KERN_SUCCESS) { debugrr("IORegistryEntryGetName returned error\n"); free_disppaths(disps); free(dids); return NULL; } printf("Driver %d name = '%s'\n",i,name); } #endif if ((ddr = IODisplayCreateInfoDictionary(dport, 0)) == NULL) { debugrr("IODisplayCreateInfoDictionary returned NULL\n"); free_disppaths(disps); free(dids); return NULL; } if ((pndr = CFDictionaryGetValue(ddr, CFSTR(kDisplayProductName))) == NULL) { debugrr("CFDictionaryGetValue returned NULL\n"); CFRelease(ddr); free_disppaths(disps); free(dids); return NULL; } if ((dcount = CFDictionaryGetCount(pndr)) > 0) { const void **keys; const void **values; int j; keys = (const void **)calloc(sizeof(void *), dcount); values = (const void **)calloc(sizeof(void *), dcount); if (keys == NULL || values == NULL) { if (keys != NULL) free(keys); if (values != NULL) free(values); debugrr("malloc failed\n"); CFRelease(ddr); free_disppaths(disps); free(dids); return NULL; } CFDictionaryGetKeysAndValues(pndr, keys, values); for (j = 0; j < dcount; j++) { const char *k, *v; char kbuf[50], vbuf[50]; k = CFStringGetCStringPtr(keys[j], kCFStringEncodingMacRoman); if (k == NULL) { if (CFStringGetCString(keys[j], kbuf, 50, kCFStringEncodingMacRoman)) k = kbuf; } v = CFStringGetCStringPtr(values[j], kCFStringEncodingMacRoman); if (v == NULL) { if (CFStringGetCString(values[j], vbuf, 50, kCFStringEncodingMacRoman)) v = vbuf; } /* We're only grabing the english description... */ if (k != NULL && v != NULL && strcmp(k, "en_US") == 0) { strncpy(desc, v, 49); desc[49] = '\000'; dp = desc; } } free(keys); free(values); } CFRelease(ddr); if (dp == NULL) { strcpy(desc, "(unknown)"); dp = desc; } sprintf(buf,"%s, at %d, %d, width %d, height %d%s",dp, disps[i]->sx, disps[i]->sy, disps[i]->sw, disps[i]->sh, CGDisplayIsMain(dids[i]) ? " (Primary Display)" : ""); if ((disps[i]->name = strdup(dp)) == NULL || (disps[i]->description = strdup(buf)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); free(dids); return NULL; } } free(dids); #endif /* __APPLE__ */ #if defined(UNIX) && !defined(__APPLE__) int i, j, k; int defsix = 0; /* default screen index */ int dcount; /* Number of screens */ char *dname; char dnbuf[100]; int evb = 0, erb = 0; int majv, minv; /* Version */ Display *mydisplay; int ndisps = 0; XineramaScreenInfo *xai = NULL; char desc1[100], desc2[200]; /* There seems to be no way of getting the available displays */ /* on an X11 system. Attempting to open them in sequence */ /* takes too long. We just rely on the user supplying the */ /* right display. We can enumerate screens though. */ /* Open the base display, and then enumerate all the screens */ if ((dname = getenv("DISPLAY")) != NULL) { char *pp; strncpy(dnbuf,dname,99); dnbuf[99] = '\000'; if ((pp = strrchr(dnbuf, ':')) != NULL) { if ((pp = strchr(pp, '.')) == NULL) strcat(dnbuf,".0"); else { if (pp[1] == '\000') strcat(dnbuf,"0"); else { pp[1] = '0'; pp[2] = '\000'; } } } } else strcpy(dnbuf,":0.0"); if ((mydisplay = XOpenDisplay(dnbuf)) == NULL) { debugrr2((errout, "failed to open display '%s'\n",dnbuf)); return NULL; } #if RANDR_MAJOR == 1 && RANDR_MINOR >= 2 && !defined(DISABLE_RANDR) /* Use Xrandr 1.2 if it's available, and if it's not disabled. */ if (getenv("ARGYLL_IGNORE_XRANDR1_2") == NULL && XRRQueryExtension(mydisplay, &evb, &erb) != 0 && XRRQueryVersion(mydisplay, &majv, &minv) && majv == 1 && minv >= 2) { static void *xrr_found = NULL; /* .so handle */ static XRRScreenResources *(*_XRRGetScreenResourcesCurrent) (Display *dpy, Window window) = NULL; static RROutput (*_XRRGetOutputPrimary)(Display *dpy, Window window) = NULL; int defsix; /* Default Screen index */ if (XSetErrorHandler(null_error_handler) == 0) { debugrr("get_displays failed on XSetErrorHandler\n"); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } /* Get functions available in Xrandr V1.3 */ if (minv >= 3 && xrr_found == NULL) { if ((xrr_found = dlopen("libXrandr.so", RTLD_LAZY)) != NULL) { _XRRGetScreenResourcesCurrent = dlsym(xrr_found, "XRRGetScreenResourcesCurrent"); _XRRGetOutputPrimary = dlsym(xrr_found, "XRRGetOutputPrimary"); } } /* Hmm. Do Xrandr systems alway have only one Screen, */ /* just like Xinerama ? */ dcount = ScreenCount(mydisplay); debugrr2((errout,"get_displays using %d XRandR Screens\n",dcount)); /* Not sure what to do with this. */ /* Should we go through X11 screens with this first ? */ /* (How does Xrandr translate Screen 1..n to Xinerama ?????) */ defsix = DefaultScreen(mydisplay); /* In order to be in sync with an application using Xinerama, */ /* we need to generate our screen indexes in the same */ /* order as Xinerama. */ /* Go through all the X11 screens */ for (i = 0; i < dcount; i++) { XRRScreenResources *scrnres; int has_primary = 0; int pix = -1; /* CRTC index containing primary */ int pop = -1; /* Output index containing primary */ int jj; /* Xinerama screen ix */ int xj; /* working crtc index */ int xk; /* working output index */ if (minv >= 3 && _XRRGetScreenResourcesCurrent != NULL) { scrnres = _XRRGetScreenResourcesCurrent(mydisplay, RootWindow(mydisplay,i)); } else { scrnres = XRRGetScreenResources(mydisplay, RootWindow(mydisplay,i)); } if (scrnres == NULL) { debugrr("XRRGetScreenResources failed\n"); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } /* We have to scan through CRTC's & outputs in the same order */ /* as the XRANDR XInerama implementation in the X server. */ /* This is a little tricky, as we need to do the primary output, */ /* first, while keeping the rest in order. */ /* Locate the crtc index that contains the primary (if any) */ if (minv >= 3 && _XRRGetOutputPrimary != NULL) { XID primary; /* Primary output ID */ primary = _XRRGetOutputPrimary(mydisplay, RootWindow(mydisplay,i)); debugrr2((errout,"XRRGetOutputPrimary returned XID %x\n",primary)); if (primary != None) { for (j = 0; j < scrnres->ncrtc; j++) { XRRCrtcInfo *crtci = NULL; if ((crtci = XRRGetCrtcInfo(mydisplay, scrnres, scrnres->crtcs[j])) == NULL) continue; if (crtci->mode == None || crtci->noutput == 0) { XRRFreeCrtcInfo(crtci); continue; } for (k = 0; k < crtci->noutput; k++) { if (crtci->outputs[k] == primary) { pix = j; pop = k; } } XRRFreeCrtcInfo(crtci); } if (pix < 0) { /* Didn't locate primary */ debugrr2((errout,"Couldn't locate primary CRTC!\n")); } else { debugrr2((errout,"Primary is at CRTC %d Output %d\n",pix,pop)); has_primary = 1; } } } /* Look through all the Screens CRTC's */ for (jj = xj = j = 0; j < scrnres->ncrtc; j++, xj++) { char *pp; XRRCrtcInfo *crtci = NULL; XRROutputInfo *outi0 = NULL; if (has_primary) { if (j == 0) xj = pix; /* Start with crtc containing primary */ else if (xj == pix) /* We've up to primary that we've alread done */ xj++; /* Skip it */ } if ((crtci = XRRGetCrtcInfo(mydisplay, scrnres, scrnres->crtcs[xj])) == NULL) { debugrr2((errout,"XRRGetCrtcInfo of Screen %d CRTC %d failed\n",i,xj)); if (has_primary && j == 0) xj = -1; /* Start at beginning */ continue; } debugrr2((errout,"XRRGetCrtcInfo of Screen %d CRTC %d has %d Outputs %s Mode\n",i,xj,crtci->noutput,crtci->mode == None ? "No" : "Valid")); if (crtci->mode == None || crtci->noutput == 0) { debugrr2((errout,"CRTC skipped as it has no mode or no outputs\n",i,xj,crtci->noutput)); XRRFreeCrtcInfo(crtci); if (has_primary && j == 0) xj = -1; /* Start at beginning */ continue; } /* This CRTC will now be counted as an Xinerama screen */ /* For each output of Crtc */ for (xk = k = 0; k < crtci->noutput; k++, xk++) { XRROutputInfo *outi = NULL; if (has_primary && xj == pix) { if (k == 0) xk = pop; /* Start with primary output */ else if (xk == pop) /* We've up to primary that we've alread done */ xk++; /* Skip it */ } if ((outi = XRRGetOutputInfo(mydisplay, scrnres, crtci->outputs[xk])) == NULL) { debugrr2((errout,"XRRGetOutputInfo failed for Screen %d CRTC %d Output %d\n",i,xj,xk)); goto next_output; } if (k == 0) /* Save this so we can label any clones */ outi0 = outi; if (outi->connection == RR_Disconnected) { debugrr2((errout,"Screen %d CRTC %d Output %d is disconnected\n",i,xj,xk)); goto next_output; } /* Check that the VideoLUT's are accessible */ { XRRCrtcGamma *crtcgam = NULL; debugrr("Checking XRandR 1.2 VideoLUT access\n"); if ((crtcgam = XRRGetCrtcGamma(mydisplay, scrnres->crtcs[xj])) == NULL || crtcgam->size == 0) { fprintf(stderr,"XRRGetCrtcGamma failed - falling back to older extensions\n"); if (crtcgam != NULL) XRRFreeGamma(crtcgam); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeCrtcInfo(crtci); XRRFreeScreenResources(scrnres); free_disppaths(disps); disps = NULL; goto done_xrandr; } if (crtcgam != NULL) XRRFreeGamma(crtcgam); } #ifdef NEVER { Atom *oprops; int noprop; /* Get a list of the properties of the output */ oprops = XRRListOutputProperties(mydisplay, crtci->outputs[xk], &noprop); printf("num props = %d\n", noprop); for (k = 0; k < noprop; k++) { printf("%d: atom 0x%x, name = '%s'\n", k, oprops[k], XGetAtomName(mydisplay, oprops[k])); } } #endif /* NEVER */ /* Add the output to the list */ debugrr2((errout,"Adding Screen %d CRTC %d Output %d\n",i,xj,xk)); if (disps == NULL) { if ((disps = (disppath **)calloc(sizeof(disppath *), 1 + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); return NULL; } } else { if ((disps = (disppath **)realloc(disps, sizeof(disppath *) * (ndisps + 2))) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); return NULL; } disps[ndisps+1] = NULL; /* End marker */ } /* ndisps is current display we're filling in */ if ((disps[ndisps] = calloc(sizeof(disppath),1)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } disps[ndisps]->screen = i; /* X11 (virtual) Screen */ disps[ndisps]->uscreen = jj; /* Xinerama/Xrandr screen */ disps[ndisps]->rscreen = jj; disps[ndisps]->sx = crtci->x; disps[ndisps]->sy = crtci->y; disps[ndisps]->sw = crtci->width; disps[ndisps]->sh = crtci->height; disps[ndisps]->crtc = scrnres->crtcs[xj]; /* XID of CRTC */ disps[ndisps]->output = crtci->outputs[xk]; /* XID of output */ sprintf(desc1,"Monitor %d, Output %s",ndisps+1,outi->name); sprintf(desc2,"%s at %d, %d, width %d, height %d",desc1, disps[ndisps]->sx, disps[ndisps]->sy, disps[ndisps]->sw, disps[ndisps]->sh); /* If it is a clone */ if (k > 0 & outi0 != NULL) { sprintf(desc1, "[ Clone of %s ]",outi0->name); strcat(desc2, desc1); } if ((disps[ndisps]->description = strdup(desc2)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } /* Form the display name */ if ((pp = strrchr(dnbuf, ':')) != NULL) { if ((pp = strchr(pp, '.')) != NULL) { sprintf(pp,".%d",i); } } if ((disps[ndisps]->name = strdup(dnbuf)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } debugrr2((errout, "Display %d name = '%s'\n",ndisps,disps[ndisps]->name)); /* Create the X11 root atom of the default screen */ /* that may contain the associated ICC profile. */ if (jj == 0) strcpy(desc1, "_ICC_PROFILE"); else sprintf(desc1, "_ICC_PROFILE_%d",disps[ndisps]->uscreen); if ((disps[ndisps]->icc_atom = XInternAtom(mydisplay, desc1, False)) == None) error("Unable to intern atom '%s'",desc1); debugrr2((errout,"Root atom '%s'\n",desc1)); /* Create the atom of the output that may contain the associated ICC profile */ if ((disps[ndisps]->icc_out_atom = XInternAtom(mydisplay, "_ICC_PROFILE", False)) == None) error("Unable to intern atom '%s'","_ICC_PROFILE"); /* Grab the EDID from the output */ { Atom edid_atom, ret_type; int ret_format; long ret_len = 0, ret_togo; unsigned char *atomv = NULL; int ii; char *keys[] = { /* Possible keys that may be used */ "EDID_DATA", "EDID", "" }; /* Try each key in turn */ for (ii = 0; keys[ii][0] != '\000'; ii++) { /* Get the atom for the EDID data */ if ((edid_atom = XInternAtom(mydisplay, keys[ii], True)) == None) { // debugrr2((errout, "Unable to intern atom '%s'\n",keys[ii])); /* Try the next key */ /* Get the EDID_DATA */ } else { if (XRRGetOutputProperty(mydisplay, crtci->outputs[xk], edid_atom, 0, 0x7ffffff, False, False, XA_INTEGER, &ret_type, &ret_format, &ret_len, &ret_togo, &atomv) == Success && (ret_len == 128 || ret_len == 256)) { if ((disps[ndisps]->edid = malloc(sizeof(unsigned char) * ret_len)) == NULL) { debugrr("get_displays failed on malloc\n"); XRRFreeCrtcInfo(crtci); if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeScreenResources(scrnres); XCloseDisplay(mydisplay); free_disppaths(disps); return NULL; } memmove(disps[ndisps]->edid, atomv, ret_len); disps[ndisps]->edid_len = ret_len; XFree(atomv); debugrr2((errout, "Got EDID for display\n")); break; } /* Try the next key */ } } if (keys[ii][0] == '\000') debugrr2((errout, "Failed to get EDID for display\n")); } ndisps++; /* Now it's number of displays */ next_output:; if (outi != NULL && outi != outi0) XRRFreeOutputInfo(outi); if (has_primary && xj == pix && k == 0) xk = -1; /* Go to first output */ } next_screen:; if (outi0 != NULL) XRRFreeOutputInfo(outi0); XRRFreeCrtcInfo(crtci); jj++; /* Next Xinerama screen index */ if (has_primary && j == 0) xj = -1; /* Go to first screen */ } XRRFreeScreenResources(scrnres); } done_xrandr:; XSetErrorHandler(NULL); } #endif /* randr >= V 1.2 */ if (disps == NULL) { /* Use Older style identification */ if (XSetErrorHandler(null_error_handler) == 0) { debugrr("get_displays failed on XSetErrorHandler\n"); XCloseDisplay(mydisplay); return NULL; } if (getenv("ARGYLL_IGNORE_XINERAMA") == NULL && XineramaQueryExtension(mydisplay, &evb, &erb) != 0 && XineramaIsActive(mydisplay)) { xai = XineramaQueryScreens(mydisplay, &dcount); if (xai == NULL || dcount == 0) { debugrr("XineramaQueryScreens failed\n"); XCloseDisplay(mydisplay); return NULL; } debugrr2((errout,"get_displays using %d Xinerama Screens\n",dcount)); } else { dcount = ScreenCount(mydisplay); debugrr2((errout,"get_displays using %d X11 Screens\n",dcount)); } /* Allocate our list */ if ((disps = (disppath **)calloc(sizeof(disppath *), dcount + 1)) == NULL) { debugrr("get_displays failed on malloc\n"); XCloseDisplay(mydisplay); return NULL; } for (i = 0; i < dcount; i++) { if ((disps[i] = calloc(sizeof(disppath), 1)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); XCloseDisplay(mydisplay); return NULL; } } /* Create a description for each screen */ for (i = 0; i < dcount; i++) { XF86VidModeMonitor monitor; int evb = 0, erb = 0; char *pp; /* Form the display name */ if ((pp = strrchr(dnbuf, ':')) != NULL) { if ((pp = strchr(pp, '.')) != NULL) { if (xai != NULL) /* Xinerama */ sprintf(pp,".%d",0); else sprintf(pp,".%d",i); } } if ((disps[i]->name = strdup(dnbuf)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); XCloseDisplay(mydisplay); return NULL; } debugrr2((errout, "Display %d name = '%s'\n",i,disps[i]->name)); if (xai != NULL) { /* Xinerama */ /* xai[i].screen_number should be == i */ disps[i]->screen = 0; /* Assume Xinerame creates a single virtual X11 screen */ disps[i]->uscreen = i; /* Underlying Xinerma screen */ disps[i]->rscreen = i; disps[i]->sx = xai[i].x_org; disps[i]->sy = xai[i].y_org; disps[i]->sw = xai[i].width; disps[i]->sh = xai[i].height; } else { /* Plain X11 Screens */ disps[i]->screen = i; disps[i]->uscreen = i; disps[i]->rscreen = i; disps[i]->sx = 0; /* Must be 0 */ disps[i]->sy = 0; disps[i]->sw = DisplayWidth(mydisplay, disps[i]->screen); disps[i]->sh = DisplayHeight(mydisplay, disps[i]->screen); } /* Create the X11 root atom of the default screen */ /* that may contain the associated ICC profile */ if (disps[i]->uscreen == 0) strcpy(desc1, "_ICC_PROFILE"); else sprintf(desc1, "_ICC_PROFILE_%d",disps[i]->uscreen); if ((disps[i]->icc_atom = XInternAtom(mydisplay, desc1, False)) == None) error("Unable to intern atom '%s'",desc1); /* See if we can locate the EDID of the monitor for this screen */ for (j = 0; j < 2; j++) { char edid_name[50]; Atom edid_atom, ret_type; int ret_format = 8; long ret_len, ret_togo; unsigned char *atomv = NULL; if (disps[i]->uscreen == 0) { if (j == 0) strcpy(edid_name,"XFree86_DDC_EDID1_RAWDATA"); else strcpy(edid_name,"XFree86_DDC_EDID2_RAWDATA"); } else { if (j == 0) sprintf(edid_name,"XFree86_DDC_EDID1_RAWDATA_%d",disps[i]->uscreen); else sprintf(edid_name,"XFree86_DDC_EDID2_RAWDATA_%d",disps[i]->uscreen); } if ((edid_atom = XInternAtom(mydisplay, edid_name, True)) == None) continue; if (XGetWindowProperty(mydisplay, RootWindow(mydisplay, disps[i]->uscreen), edid_atom, 0, 0x7ffffff, False, XA_INTEGER, &ret_type, &ret_format, &ret_len, &ret_togo, &atomv) == Success && (ret_len == 128 || ret_len == 256)) { if ((disps[i]->edid = malloc(sizeof(unsigned char) * ret_len)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); XCloseDisplay(mydisplay); return NULL; } memmove(disps[i]->edid, atomv, ret_len); disps[i]->edid_len = ret_len; XFree(atomv); debugrr2((errout, "Got EDID for display\n")); break; } else { debugrr2((errout, "Failed to get EDID for display\n")); } } if (XF86VidModeQueryExtension(mydisplay, &evb, &erb) != 0) { /* Some propietary multi-screen drivers (ie. TwinView & MergeFB) */ /* don't implement the XVidMode extension properly. */ monitor.model = NULL; if (XF86VidModeGetMonitor(mydisplay, disps[i]->uscreen, &monitor) != 0 && monitor.model != NULL && monitor.model[0] != '\000') sprintf(desc1, "%s",monitor.model); else sprintf(desc1,"Monitor %d",i+1); } else sprintf(desc1,"Monitor %d",i+1); sprintf(desc2,"%s at %d, %d, width %d, height %d",desc1, disps[i]->sx, disps[i]->sy, disps[i]->sw, disps[i]->sh); if ((disps[i]->description = strdup(desc2)) == NULL) { debugrr("get_displays failed on malloc\n"); free_disppaths(disps); XCloseDisplay(mydisplay); return NULL; } } XSetErrorHandler(NULL); /* Put the default Screen the top of the list */ if (xai == NULL) { int defsix = DefaultScreen(mydisplay); disppath *tdispp; tdispp = disps[defsix]; disps[defsix] = disps[0]; disps[0] = tdispp; } } if (xai != NULL) XFree(xai); XCloseDisplay(mydisplay); #endif /* UNIX X11 */ return disps; } // END get_displays /* Free a whole list of display paths */ void free_disppaths(disppath **disps) { if (disps != NULL) { int i; for (i = 0; ; i++) { if (disps[i] == NULL) break; if (disps[i]->name != NULL) free(disps[i]->name); if (disps[i]->description != NULL) free(disps[i]->description); #if defined(UNIX) && !defined(__APPLE__) if (disps[i]->edid != NULL) free(disps[i]->edid); #endif free(disps[i]); } free(disps); } } // START get_a_display /* ----------------------------------------------- */ /* Deal with selecting a display */ /* Return the given display given its index 0..n-1 */ disppath *get_a_display(int ix) { disppath **paths, *rv = NULL; int i; debugrr2((errout, "get_a_display called with ix %d\n",ix)); if ((paths = get_displays()) == NULL) return NULL; for (i = 0; ;i++) { if (paths[i] == NULL) { free_disppaths(paths); return NULL; } if (i == ix) { break; } } if ((rv = malloc(sizeof(disppath))) == NULL) { debugrr("get_a_display failed malloc\n"); free_disppaths(paths); return NULL; } *rv = *paths[i]; /* Structure copy */ if ((rv->name = strdup(paths[i]->name)) == NULL) { debugrr("get_displays failed on malloc\n"); free(rv->description); free(rv); free_disppaths(paths); return NULL; } if ((rv->description = strdup(paths[i]->description)) == NULL) { debugrr("get_displays failed on malloc\n"); free(rv); free_disppaths(paths); return NULL; } #if defined(UNIX) && !defined(__APPLE__) if (paths[i]->edid != NULL) { if ((rv->edid = malloc(sizeof(unsigned char) * paths[i]->edid_len)) == NULL) { debugrr("get_displays failed on malloc\n"); free(rv); free_disppaths(paths); return NULL; } rv->edid_len = paths[i]->edid_len; memmove(rv->edid, paths[i]->edid, rv->edid_len ); } #endif debugrr2((errout, " Selected ix %d '%s' %s'\n",i,rv->name,rv->description)); free_disppaths(paths); return rv; } // END get_a_display void free_a_disppath(disppath *path) { if (path != NULL) { if (path->name != NULL) free(path->name); if (path->description != NULL) free(path->description); #if defined(UNIX) && !defined(__APPLE__) if (path->edid != NULL) free(path->edid); #endif free(path); } } // MAIN typedef struct { int width_mm, height_mm; } size_mm; static size_mm get_real_screen_size_mm_disp(disppath *disp) { size_mm size; #ifdef NT HDC hdc = NULL; #endif #ifdef __APPLE__ CGSize sz; /* Display size in mm */ #endif #if defined(UNIX) && !defined(__APPLE__) char *pp, *bname; /* base display name */ Display *mydisplay; int myscreen; /* Usual or virtual screen with Xinerama */ #endif size.width_mm = 0; size.height_mm = 0; if (disp == NULL) return size; #ifdef NT hdc = CreateDC(disp->name, NULL, NULL, NULL); if (hdc == NULL) { return size; } size.width_mm = GetDeviceCaps(hdc, HORZSIZE); size.height_mm = GetDeviceCaps(hdc, VERTSIZE); DeleteDC(hdc); #endif #ifdef __APPLE__ sz = CGDisplayScreenSize(disp->ddid); size.width_mm = sz.width; size.height_mm = sz.height; #endif #if defined(UNIX) && !defined(__APPLE__) /* Create the base display name (in case of Xinerama, XRandR) */ if ((bname = strdup(disp->name)) == NULL) { return size; } if ((pp = strrchr(bname, ':')) != NULL) { if ((pp = strchr(pp, '.')) != NULL) { sprintf(pp,".%d",disp->screen); } } /* open the display */ mydisplay = XOpenDisplay(bname); if(!mydisplay) { debugr2((errout,"Unable to open display '%s'\n",bname)); free(bname); return size; } free(bname); debugr("Opened display OK\n"); myscreen = disp->screen; size.width_mm = DisplayWidthMM(mydisplay, myscreen); size.height_mm = DisplayHeightMM(mydisplay, myscreen); XCloseDisplay(mydisplay); #endif return size; } static size_mm get_real_screen_size_mm(int ix) { size_mm size; disppath *disp = NULL; disp = get_a_display(ix); size = get_real_screen_size_mm_disp(disp); free_a_disppath(disp); return size; } static int get_xrandr_output_xid(int ix) { int xid = 0; #if defined(UNIX) && !defined(__APPLE__) #if RANDR_MAJOR == 1 && RANDR_MINOR >= 2 disppath *disp = NULL; disp = get_a_display(ix); if (disp == NULL) return 0; xid = disp->output; free_a_disppath(disp); #endif #endif return xid; } static PyObject * enumerate_displays(PyObject *self, PyObject *args) { PyObject *l = PyList_New(0); disppath **dp; dp = get_displays(); if (dp != NULL && dp[0] != NULL) { PyObject* value; size_mm size; int i; for (i = 0; ; i++) { if (dp[i] == NULL) break; PyObject *d = PyDict_New(); if (dp[i]->name != NULL && (value = PyString_FromString(dp[i]->name)) != NULL) { PyDict_SetItemString(d, "name", value); } if (dp[i]->description != NULL && (value = PyString_FromString(dp[i]->description)) != NULL) { PyDict_SetItemString(d, "description", value); } value = Py_BuildValue("(i,i)", dp[i]->sx, dp[i]->sy); PyDict_SetItemString(d, "pos", value); value = Py_BuildValue("(i,i)", dp[i]->sw, dp[i]->sh); PyDict_SetItemString(d, "size", value); size = get_real_screen_size_mm_disp(dp[i]); value = Py_BuildValue("(i,i)", size.width_mm, size.height_mm); PyDict_SetItemString(d, "size_mm", value); #ifdef NT if (dp[i]->monid != NULL && (value = PyString_FromString(dp[i]->monid)) != NULL) { PyDict_SetItemString(d, "DeviceID", value); } value = PyBool_FromLong(dp[i]->prim); PyDict_SetItemString(d, "is_primary", value); #endif /* NT */ #ifdef __APPLE__ //value = PyInt_FromLong(dp[i]->ddid); //PyDict_SetItemString(d, "CGDirectDisplayID", value); #endif /* __APPLE__ */ #if defined(UNIX) && !defined(__APPLE__) value = PyInt_FromLong(dp[i]->screen); PyDict_SetItemString(d, "x11_screen", value); value = PyInt_FromLong(dp[i]->uscreen); PyDict_SetItemString(d, "screen", value); value = PyInt_FromLong(dp[i]->rscreen); PyDict_SetItemString(d, "ramdac_screen", value); value = PyInt_FromLong(dp[i]->icc_atom); PyDict_SetItemString(d, "icc_profile_atom_id", value); if (dp[i]->edid_len > 0 && dp[i]->edid != NULL && (value = PyString_FromStringAndSize(dp[i]->edid, dp[i]->edid_len)) != NULL) { PyDict_SetItemString(d, "edid", value); } #if RANDR_MAJOR == 1 && RANDR_MINOR >= 2 //value = PyInt_FromLong(dp[i]->crtc); //PyDict_SetItemString(d, "crtc", value); value = PyInt_FromLong(dp[i]->output); PyDict_SetItemString(d, "output", value); value = PyInt_FromLong(dp[i]->icc_out_atom); PyDict_SetItemString(d, "icc_profile_output_atom_id", value); #endif /* randr >= V 1.2 */ #endif /* UNIX */ PyList_Append(l, d); } } free_disppaths(dp); return l; } static PyObject * RealDisplaySizeMM(PyObject *self, PyObject *args) { int ix; size_mm size; if (!PyArg_ParseTuple(args, "i", &ix)) return NULL; size = get_real_screen_size_mm(ix); return Py_BuildValue("(i,i)", size.width_mm, size.height_mm); } static PyObject * GetXRandROutputXID(PyObject *self, PyObject *args) { int ix; int xid; if (!PyArg_ParseTuple(args, "i", &ix)) return NULL; xid = get_xrandr_output_xid(ix); return Py_BuildValue("i", xid); } static PyMethodDef RealDisplaySizeMM_methods[] = { {"enumerate_displays", enumerate_displays, METH_NOARGS, "Enumerate and return a list of displays."}, {"RealDisplaySizeMM", RealDisplaySizeMM, METH_VARARGS, "RealDisplaySizeMM(int displayNum)\nReturn the size (in mm) of a given display."}, {"GetXRandROutputXID", GetXRandROutputXID, METH_VARARGS, "GetXRandROutputXID(int displayNum)\nReturn the XRandR output X11 ID of a given display."}, {NULL, NULL, 0, NULL} /* Sentinel - marks the end of this structure */ }; PyMODINIT_FUNC initRealDisplaySizeMM(void) { Py_InitModule("RealDisplaySizeMM", RealDisplaySizeMM_methods); } DisplayCAL-3.5.0.0/DisplayCAL/RealDisplaySizeMM.py0000644000076500000000000000553013221471550021276 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import platform import re import sys from util_x import get_display as _get_x_display if sys.platform == "darwin": # Mac OS X has universal binaries in two flavors: # - i386 & PPC # - i386 & x86_64 if platform.architecture()[0].startswith('64'): from lib64.RealDisplaySizeMM import * else: from lib32.RealDisplaySizeMM import * else: # Linux and Windows have separate files if platform.architecture()[0].startswith('64'): if sys.version_info[:2] == (2, 6): from lib64.python26.RealDisplaySizeMM import * elif sys.version_info[:2] == (2, 7): from lib64.python27.RealDisplaySizeMM import * else: if sys.version_info[:2] == (2, 6): from lib32.python26.RealDisplaySizeMM import * elif sys.version_info[:2] == (2, 7): from lib32.python27.RealDisplaySizeMM import * _displays = None _GetXRandROutputXID = GetXRandROutputXID _RealDisplaySizeMM = RealDisplaySizeMM _enumerate_displays = enumerate_displays def GetXRandROutputXID(display_no=0): display = get_display(display_no) if display: return display.get("output", 0) return 0 def RealDisplaySizeMM(display_no=0): display = get_display(display_no) if display: return display.get("size_mm", (0, 0)) return (0, 0) def enumerate_displays(): global _displays _displays = _enumerate_displays() for display in _displays: desc = display.get("description") if desc: match = re.findall("(.+?),? at (-?\d+), (-?\d+), " "width (\d+), height (\d+)", desc) if len(match): if sys.platform not in ("darwin", "win32"): xrandr_name = re.search(", Output (.+)", match[0][0]) if xrandr_name: display["xrandr_name"] = xrandr_name.group(1) desc = "%s @ %s, %s, %sx%s" % match[0] display["description"] = desc return _displays def get_display(display_no=0): if _displays is None: enumerate_displays() # Translate from Argyll display index to enumerated display index # using the coordinates and dimensions from config import getcfg, is_virtual_display if is_virtual_display(display_no): return try: argyll_display = getcfg("displays")[display_no] except IndexError: return else: if argyll_display.endswith(" [PRIMARY]"): argyll_display = " ".join(argyll_display.split(" ")[:-1]) for display in _displays: desc = display.get("description") if desc: geometry = "".join(desc.split("@ ")[-1:]) if argyll_display.endswith("@ " + geometry): return display def get_x_display(display_no=0): display = get_display(display_no) if display: name = display.get("name") if name: return _get_x_display(name) def get_x_icc_profile_atom_id(display_no=0): display = get_display(display_no) if display: return display.get("icc_profile_atom_id") def get_x_icc_profile_output_atom_id(display_no=0): display = get_display(display_no) if display: return display.get("icc_profile_output_atom_id") DisplayCAL-3.5.0.0/DisplayCAL/ref/0000755000076500000000000000000013242313606016177 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/ref/ACES.icm0000644000076500000000000000074412665102037017413 0ustar devwheel00000000000000@mntrRGB XYZ +acsp-^?coG desc_cprtP5wtptrXYZrTRC gXYZgTRC bXYZbTRC descACEStextPublic Domain. No Warranty, Use at own risk.XYZ BXYZ \OcurvXYZ "XYZ eDisplayCAL-3.5.0.0/DisplayCAL/ref/ACEScg.icm0000644000076500000000000000113013125210434017704 0ustar devwheel00000000000000X@mntrRGB XYZ  acsp-&"B descacprtx5wtptchrm$rXYZrTRC gXYZgTRC bXYZbTRC lumi0bkptDdescACEScgtextPublic Domain. No Warranty, Use at own risk.XYZ AchrmK*<y DXYZ HscurvXYZ &UXYZ  7(XYZ _EddHXYZ DisplayCAL-3.5.0.0/DisplayCAL/ref/ClayRGB1998.gam0000644000076500000000000017023112665102037020451 0ustar devwheel00000000000000GAMUT DESCRIPTOR "Argyll Gamut surface poligon data" ORIGINATOR "Argyll CMS gamut library" CREATED "Mon Feb 27 17:52:58 2012" KEYWORD "COLOR_REP" COLOR_REP "LAB" KEYWORD "GAMUT_CENTER" GAMUT_CENTER "50.000000 0.000000 0.000000" KEYWORD "CSPACE_WHITE" CSPACE_WHITE "100.000000 0.000000 0.000000" KEYWORD "GAMUT_WHITE" GAMUT_WHITE "100.000000 0.000000 0.000000" KEYWORD "CSPACE_BLACK" CSPACE_BLACK "0.000000 0.000000 0.000000" KEYWORD "GAMUT_BLACK" GAMUT_BLACK "0.000000 0.000000 0.000000" KEYWORD "CUSP_RED" CUSP_RED "62.601347 90.370785 78.149474" KEYWORD "CUSP_YELLOW" CUSP_YELLOW "97.502205 -16.478555 103.676451" KEYWORD "CUSP_GREEN" CUSP_GREEN "83.214105 -129.090229 87.172706" KEYWORD "CUSP_CYAN" CUSP_CYAN "86.448981 -83.408548 -21.777749" KEYWORD "CUSP_BLUE" CUSP_BLUE "30.210038 69.243471 -113.611880" KEYWORD "CUSP_MAGENTA" CUSP_MAGENTA "67.600524 101.303881 -50.815824" # First come the triangle verticy location KEYWORD "VERTEX_NO" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT VERTEX_NO LAB_L LAB_A LAB_B END_DATA_FORMAT NUMBER_OF_SETS 1135 BEGIN_DATA 0 83.214 -129.09 87.173 1 30.210 69.243 -113.61 2 62.601 90.371 78.149 3 67.601 101.30 -50.816 4 97.502 -16.479 103.68 5 84.715 -110.36 88.939 6 84.882 -108.47 89.136 7 86.549 -91.168 91.088 8 86.799 -88.802 91.379 9 87.324 -83.975 91.991 10 87.600 -81.522 92.312 11 94.693 -8.7150 101.43 12 88.177 -76.551 92.984 13 88.478 -74.041 93.334 14 83.490 -124.41 65.629 15 91.010 1.6774 98.504 16 90.102 4.2763 97.789 17 88.304 9.4672 96.382 18 89.767 -63.888 94.827 19 65.877 79.350 80.159 20 90.110 -61.335 95.222 21 91.183 -53.673 96.461 22 84.790 19.784 93.663 23 81.408 29.932 91.091 24 91.557 -51.124 96.891 25 65.873 99.535 -53.672 26 69.302 68.049 82.402 27 78.976 37.361 89.273 28 69.880 66.166 82.792 29 70.477 64.225 83.198 30 71.094 62.228 83.622 31 76.651 44.573 87.565 32 79.776 34.906 89.868 33 72.384 58.077 84.517 34 75.902 46.917 87.021 35 73.055 55.929 84.988 36 93.122 -40.991 98.688 37 93.531 -38.481 99.156 38 93.947 -35.981 99.632 39 96.577 -21.263 102.63 40 94.798 -31.019 100.60 41 95.234 -28.558 101.10 42 60.696 94.321 -62.265 43 83.809 -119.22 48.568 44 59.835 93.468 -63.698 45 62.761 90.733 61.729 46 62.792 90.802 59.321 47 54.702 88.486 -72.264 48 33.728 57.110 -107.68 49 53.854 87.682 -73.682 50 63.147 91.600 38.728 51 62.945 91.146 49.191 52 62.991 91.249 46.589 53 84.199 -113.20 32.843 54 63.205 91.731 36.106 55 38.508 41.226 -99.645 56 84.397 -110.24 26.076 57 50.499 84.563 -79.307 58 63.399 92.166 28.277 59 63.622 92.663 20.545 60 49.671 83.809 -80.697 61 63.470 92.325 25.686 62 43.461 25.511 -91.364 63 63.702 92.843 17.995 64 84.616 -107.08 19.339 65 46.697 15.649 -85.980 66 48.848 83.068 -82.079 67 66.759 99.514 -40.346 68 64.358 94.298 0.59833 69 86.220 -86.128 -17.603 70 65.300 96.364 -18.260 71 48.031 82.340 -83.453 72 65.992 97.864 -29.501 73 64.804 95.278 -8.9677 74 85.023 -101.41 8.2263 75 85.387 -96.543 -0.52662 76 81.804 -73.567 -29.068 77 80.637 -71.036 -30.910 78 50.060 5.7266 -80.405 79 42.531 77.655 -92.722 80 85.786 -91.437 -9.1395 81 75.946 -60.613 -38.350 82 74.768 -57.930 -40.227 83 41.785 77.054 -93.981 84 71.224 -49.689 -45.898 85 70.040 -46.876 -47.799 86 66.483 -38.238 -53.535 87 65.297 -35.292 -55.455 88 37.618 73.878 -101.03 89 64.110 -32.313 -57.379 90 62.924 -29.301 -59.305 91 61.739 -26.256 -61.233 92 52.352 -0.84803 -76.618 93 57.016 -13.767 -68.950 94 14.182 45.227 -74.206 95 7.1930 34.587 -56.902 96 13.509 44.218 -72.551 97 6.5231 33.160 -54.951 98 61.334 -100.62 67.948 99 18.754 52.077 -85.445 100 19.388 53.028 -87.006 101 48.802 -84.316 56.937 102 33.734 -64.711 43.698 103 39.938 -72.782 49.149 104 35.310 -66.761 45.083 105 25.554 -54.067 35.616 106 49.492 75.299 65.116 107 18.563 -44.970 27.146 108 16.735 -42.360 24.726 109 23.849 -51.849 33.673 110 40.933 65.458 56.606 111 3.2382 20.204 -41.088 112 3.7000 22.898 -43.667 113 35.339 59.026 50.687 114 34.194 57.710 49.382 115 25.885 48.157 39.067 116 24.650 46.737 37.416 117 12.962 -35.251 19.490 118 2.0511 12.797 -32.650 119 0.0000 0.0000 0.0000 120 100.00 0.0000 0.0000 121 18.252 39.381 28.427 122 0.035831 0.15948 0.057090 123 0.072059 -0.20491 0.10959 124 16.921 37.850 26.473 125 12.802 33.115 20.264 126 11.382 31.482 18.070 127 11.007 -30.725 16.660 128 8.4560 28.118 13.472 129 75.231 75.757 -38.584 130 75.811 73.859 -37.660 131 92.092 23.018 -12.123 132 93.808 17.930 -9.4750 133 91.244 25.550 -13.434 134 94.676 15.377 -8.1397 135 0.23660 0.52749 0.37176 136 0.36675 -0.78153 0.56035 137 96.430 10.259 -5.4487 138 6.9905 26.183 11.138 139 88.745 33.083 -17.309 140 97.315 7.6951 -4.0942 141 1.7200 10.731 -29.587 142 87.929 35.568 -18.579 143 99.100 2.5649 -1.3693 144 0.33820 -0.89558 0.33658 145 8.9999 -25.531 13.679 146 78.965 63.639 -32.655 147 79.642 61.467 -31.583 148 84.758 45.334 -23.532 149 2.4824 -7.0591 3.7753 150 83.991 47.723 -24.734 151 0.91361 5.7002 -19.542 152 6.9788 -19.845 10.613 153 98.076 -12.523 62.598 154 97.958 -13.329 68.967 155 3.7069 -10.541 5.6375 156 0.52569 3.2799 -12.035 157 98.464 -9.9086 45.189 158 98.892 -7.0785 29.885 159 99.910 -0.56423 2.0897 160 99.649 -2.2049 8.4038 161 99.566 -2.7341 10.523 162 0.37454 2.3368 -8.5744 163 99.249 -4.7595 19.068 164 96.207 -18.131 -6.0585 165 97.831 -10.044 -3.4609 166 98.253 -8.0266 -2.7871 167 5.2028 -14.795 7.9125 168 99.554 -1.9989 -0.71013 169 94.690 -26.201 -8.4902 170 0.47343 1.5816 0.74911 171 94.328 -28.207 -9.0707 172 89.586 -58.199 -16.703 173 4.4962 19.796 7.1639 174 1.8432 8.2043 2.9369 175 2.5871 11.515 4.1221 176 92.312 -40.040 -12.310 177 92.003 -41.964 -12.807 178 3.4701 15.446 5.5291 179 8.1299 -12.656 -11.875 180 8.3927 -10.955 -15.119 181 11.553 -25.639 0.92434 182 9.6336 -20.823 -2.0038 183 8.6794 -9.0301 -18.252 184 3.8011 14.505 6.0324 185 15.290 -33.498 6.4817 186 2.9180 10.574 4.6253 187 7.8924 -14.145 -8.5135 188 7.3801 -18.059 11.253 189 15.551 -29.973 -0.27641 190 3.7885 -10.032 3.7704 191 5.6042 -13.009 8.5520 192 2.5640 -6.5503 1.9082 193 4.1083 -8.7546 6.2770 194 1.6012 -3.8125 0.44400 195 2.8838 -5.2726 4.4148 196 8.9885 -6.8703 -21.281 197 1.9210 -2.5349 2.9506 198 7.2413 26.881 5.3961 199 7.3650 27.207 2.5638 200 15.094 -36.142 13.343 201 6.2798 28.421 -32.567 202 6.9103 28.946 -28.054 203 7.0890 28.037 -17.010 204 6.1943 25.357 -3.0027 205 11.416 -26.942 4.4734 206 6.5822 26.604 -10.298 207 7.2539 -1.9981 -24.122 208 1.7208 3.4048 -18.269 209 5.6480 24.971 -15.652 210 16.935 -39.271 15.851 211 7.5161 27.590 -0.89639 212 2.9401 4.5411 -23.933 213 97.746 3.1509 -3.4686 214 5.7580 2.2559 -26.575 215 4.8707 21.683 -1.4104 216 98.112 4.5683 -0.64120 217 6.8204 27.304 -13.724 218 5.0814 26.462 -37.985 219 96.848 5.7266 -4.8410 220 6.1210 4.5211 -29.477 221 5.1902 24.607 -23.818 222 7.6956 28.024 -4.5915 223 4.6497 20.597 3.6488 224 37.221 -62.978 24.314 225 6.6233 -5.9327 -17.980 226 5.1273 -1.6787 -20.398 227 95.956 8.3017 -6.2083 228 60.184 -95.393 50.707 229 49.186 -77.959 31.986 230 7.6839 -15.446 -5.0263 231 17.219 -35.025 5.7563 232 19.867 -27.019 -10.607 233 48.997 -81.024 41.988 234 13.133 -33.343 13.610 235 49.685 -70.411 13.607 236 4.8906 23.326 -20.647 237 7.9041 28.500 -8.1411 238 39.216 -58.218 9.5680 239 37.621 -56.992 10.162 240 7.6170 0.26714 -27.011 241 1.1065 6.1860 -15.226 242 20.058 -24.936 -13.567 243 11.204 -28.927 10.825 244 35.619 -61.640 25.070 245 8.4690 31.080 -28.890 246 36.009 -55.752 10.774 247 41.608 -72.049 38.043 248 6.3547 -7.6085 -14.718 249 37.014 -66.329 35.100 250 9.3191 -4.4789 -24.211 251 4.6529 24.684 -35.300 252 8.1415 29.013 -11.551 253 4.1753 19.742 -10.276 254 4.3838 20.871 -13.885 255 37.121 32.558 50.637 256 6.1165 -9.0949 -11.324 257 9.4753 -22.034 1.5799 258 59.102 -89.061 34.811 259 30.306 -13.567 41.724 260 37.252 37.239 51.064 261 57.938 -84.069 25.443 262 2.6715 2.8652 -20.613 263 18.814 -40.835 14.974 264 32.194 -3.6787 44.022 265 3.9958 18.705 -6.5055 266 57.692 -87.882 35.477 267 20.749 -40.985 10.877 268 35.116 49.396 49.779 269 27.586 -50.502 17.210 270 24.103 -47.646 18.824 271 3.3960 -1.3589 -15.624 272 18.614 -18.961 -19.109 273 29.828 24.276 42.669 274 31.539 -6.9018 43.233 275 66.454 -88.387 17.080 276 4.0075 20.285 -22.108 277 31.674 -17.114 43.016 278 31.159 -50.553 9.7690 279 31.660 2.9338 43.736 280 17.481 -31.471 -0.83379 281 28.911 27.178 41.755 282 4.6220 22.074 -17.339 283 3.6343 0.12746 -19.073 284 26.120 -45.151 8.7252 285 48.793 -61.026 -1.4178 286 27.514 -51.631 20.246 287 67.820 -89.439 16.559 288 4.8587 -3.3546 -17.113 289 32.397 5.9426 44.620 290 3.1875 -2.6597 -12.022 291 4.4120 -6.1417 -10.119 292 27.002 0.61230 38.519 293 22.672 -40.904 6.9462 294 94.577 14.822 -6.0414 295 39.652 -52.311 -1.3859 296 31.801 18.141 44.545 297 29.925 -43.029 -1.3654 298 33.153 8.8638 45.515 299 28.915 -37.596 39.603 300 29.571 -47.805 7.4356 301 20.583 -43.535 17.363 302 29.733 -16.993 41.011 303 8.8745 31.879 -31.600 304 38.056 -51.072 -0.92781 305 2.6504 5.9089 4.1645 306 19.373 -32.942 -1.3682 307 30.145 -27.431 41.144 308 4.6205 -4.8409 -13.689 309 20.851 -39.502 7.6336 310 28.519 6.8529 40.475 311 18.082 25.480 -62.044 312 36.339 19.714 49.145 313 31.616 -44.345 -1.8418 314 25.679 -51.957 26.925 315 20.138 25.194 -64.187 316 64.433 -76.169 -1.0978 317 3.5632 18.936 -26.523 318 33.818 -43.664 44.267 319 9.1407 -24.518 10.141 320 20.608 26.816 -66.159 321 7.5044 -16.565 -1.4137 322 28.186 13.202 40.334 323 23.723 -16.686 34.140 324 8.8115 28.916 4.8649 325 20.052 -1.5576 29.791 326 27.329 11.853 -60.387 327 28.048 29.939 40.870 328 30.955 15.460 43.517 329 26.950 39.025 39.962 330 37.972 29.856 51.248 331 35.325 13.071 -70.629 332 33.456 13.202 -68.623 333 31.022 34.903 -85.381 334 29.909 18.666 42.510 335 33.709 -40.471 -10.567 336 31.245 9.3348 43.564 337 28.680 -23.965 39.685 338 28.205 -27.471 39.079 339 5.7285 -11.515 -4.1211 340 24.973 10.156 -56.123 341 24.227 14.275 35.608 342 21.806 41.573 -80.297 343 26.053 25.298 38.270 344 3.8447 17.783 -3.0453 345 22.939 10.295 -53.937 346 29.040 15.983 41.419 347 4.2326 -7.2613 -6.3971 348 25.214 -20.375 35.849 349 19.522 5.6774 29.246 350 13.996 18.908 -51.508 351 25.417 -34.475 35.789 352 11.360 -6.6663 -24.276 353 1.0580 -0.73048 -4.5144 354 10.290 32.107 -18.907 355 30.883 -1.3427 -51.804 356 13.549 6.8952 -40.074 357 28.942 -1.3949 -49.554 358 35.357 -30.718 46.054 359 27.003 -37.691 37.526 360 13.148 4.7597 -37.608 361 25.837 37.144 38.497 362 27.365 -34.373 37.997 363 20.768 -9.0493 30.572 364 16.188 8.8053 -44.860 365 21.158 23.877 31.940 366 9.6696 -2.0619 -27.049 367 3.6237 16.404 2.0140 368 22.675 -24.034 32.699 369 24.099 20.285 35.650 370 49.157 -56.445 -8.9729 371 21.809 -31.247 31.493 372 2.0454 -1.0415 -9.7235 373 22.117 20.831 33.113 374 63.606 -67.983 -12.396 375 19.750 4.5341 -44.888 376 18.361 8.6518 -47.192 377 20.389 8.8708 30.487 378 19.767 -31.349 28.885 379 17.973 -12.624 26.786 380 20.637 31.409 31.481 381 13.355 -8.7566 -24.359 382 20.161 -27.784 29.448 383 41.620 -48.700 -9.7058 384 23.177 -20.353 33.392 385 36.539 -1.1992 -58.355 386 40.043 -47.434 -9.3442 387 48.902 -12.813 -60.696 388 7.3533 -17.508 2.0390 389 38.731 7.5264 50.699 390 62.330 -65.377 -14.381 391 21.104 -20.350 30.787 392 32.200 -37.293 -12.932 393 18.621 -8.8219 27.729 394 38.376 -1.1551 -60.479 395 3.0081 -3.7792 -8.2593 396 3.5007 17.215 -15.325 397 24.737 46.934 31.391 398 19.634 41.048 26.667 399 39.166 1.3716 50.804 400 15.598 -31.467 23.271 401 19.078 18.747 28.970 402 11.573 31.913 12.225 403 49.985 76.410 30.512 404 10.589 32.730 -21.905 405 49.924 76.273 33.315 406 49.646 75.648 49.780 407 12.975 33.506 14.388 408 39.072 -7.9956 50.305 409 35.712 59.868 24.517 410 14.639 -20.473 22.043 411 10.595 -16.256 16.187 412 16.839 -20.407 25.117 413 22.924 -1.5696 -42.561 414 14.432 35.248 13.579 415 16.360 -24.272 24.407 416 16.097 10.003 24.595 417 38.010 62.548 24.776 418 35.454 59.286 39.514 419 45.699 -11.366 -58.537 420 34.028 -36.847 -15.906 421 47.327 -40.643 -27.787 422 39.771 -31.898 -29.196 423 20.129 -12.760 29.662 424 61.454 -58.108 -23.221 425 37.238 62.045 11.166 426 37.445 62.506 5.3586 427 41.058 65.740 43.983 428 36.795 63.432 -25.040 429 49.287 -54.866 -11.450 430 12.600 -4.1523 19.298 431 35.648 59.722 27.581 432 27.223 49.823 31.703 433 9.7538 30.972 -12.608 434 35.563 61.935 -24.226 435 39.179 -17.657 50.017 436 49.338 76.099 15.078 437 36.901 61.291 23.128 438 37.144 61.835 14.118 439 13.060 33.696 11.489 440 26.008 48.434 30.081 441 38.224 64.217 -11.244 442 39.692 -4.9339 51.005 443 41.346 -33.338 -29.377 444 16.038 22.404 24.785 445 49.835 77.202 1.6866 446 35.938 61.583 -12.026 447 36.610 63.036 -22.505 448 18.508 39.958 16.034 449 13.786 -27.988 20.749 450 37.559 62.757 2.5051 451 95.357 -26.749 60.884 452 23.143 17.618 34.342 453 16.544 -1.7825 -35.120 454 49.596 77.776 -15.188 455 32.366 -35.442 -15.615 456 37.010 62.741 -10.289 457 29.013 52.515 7.8741 458 43.774 -43.187 -20.103 459 14.317 -1.8660 -32.513 460 19.802 41.426 17.939 461 37.162 63.071 -12.966 462 26.183 48.828 20.302 463 38.094 -2.9628 -58.376 464 20.477 -20.681 -19.312 465 27.733 50.968 9.1727 466 39.848 4.2711 51.568 467 11.780 32.375 5.8266 468 3.2922 15.915 -11.701 469 28.370 52.374 -6.0085 470 27.633 50.745 12.348 471 27.461 50.359 18.807 472 38.648 -20.877 49.410 473 27.961 51.473 2.9561 474 28.651 51.707 20.576 475 38.860 32.097 52.202 476 48.834 -41.975 -27.996 477 35.953 62.768 -29.244 478 15.175 25.205 23.602 479 49.707 -50.001 -18.757 480 21.156 43.047 16.347 481 28.125 53.080 -21.817 482 49.568 78.784 -31.169 483 28.224 52.055 -3.0690 484 95.747 -24.698 63.650 485 19.980 43.185 -16.453 486 26.063 49.873 -9.7391 487 27.220 51.124 -7.8657 488 20.843 -1.6354 -40.137 489 26.807 51.480 -20.957 490 49.966 80.652 -48.454 491 95.506 -24.794 36.134 492 3.2637 17.067 -23.338 493 97.109 -16.611 43.147 494 11.949 -23.969 18.122 495 19.976 41.815 10.980 496 18.559 41.458 -15.502 497 19.883 41.607 14.443 498 96.669 -18.866 42.483 499 13.163 33.925 7.9661 500 10.645 20.833 16.741 501 19.482 29.305 29.831 502 17.180 24.816 26.478 503 18.265 9.4253 27.619 504 95.092 -27.062 35.503 505 93.789 -35.535 54.126 506 25.292 50.682 -32.477 507 20.801 43.634 -8.5207 508 19.773 42.741 -13.512 509 25.907 50.782 -25.473 510 3.1128 14.795 -7.9125 511 94.933 -29.114 60.271 512 27.554 51.852 -13.589 513 61.595 -56.543 -25.471 514 20.945 -16.370 -24.831 515 34.572 62.081 -39.875 516 14.176 -24.384 21.342 517 9.3034 11.876 14.545 518 20.632 43.265 -5.4375 519 21.452 43.708 6.1811 520 7.1323 -18.887 7.0982 521 1.1302 5.7002 -7.3704 522 20.081 42.050 7.5678 523 95.876 -23.752 57.181 524 23.943 49.057 -31.739 525 12.289 20.998 -51.367 526 92.825 -41.773 61.659 527 2.9616 13.852 -4.4523 528 1.6089 7.8311 -6.6076 529 1.0065 4.9283 -4.5380 530 19.398 41.928 -7.4310 531 33.300 -10.685 -45.123 532 2.2178 10.541 -5.6375 533 1.4852 7.0591 -3.7753 534 49.856 -48.344 -21.151 535 40.329 -1.9333 51.724 536 1.3879 6.4522 -1.5484 537 18.784 31.604 28.931 538 2.0941 9.7692 -2.8051 539 2.8379 13.080 -1.6199 540 49.261 80.178 -52.137 541 1.9968 9.1623 -0.57822 542 95.866 -22.975 38.978 543 40.400 -11.847 -52.011 544 1.7601 8.7741 -10.068 545 9.6778 -21.832 14.748 546 20.331 42.604 0.93075 547 29.744 -9.1006 -42.707 548 62.040 -51.786 -32.124 549 93.837 -35.152 51.934 550 2.3689 11.484 -9.0977 551 94.914 -28.418 42.123 552 45.208 -29.004 -39.014 553 38.847 -10.174 -51.964 554 49.461 -21.341 -52.387 555 39.162 16.142 51.540 556 11.175 25.647 17.638 557 13.423 34.503 0.75378 558 40.185 -45.743 -11.943 559 97.547 -13.576 27.807 560 41.234 -18.977 -45.461 561 93.875 -35.688 71.727 562 11.856 33.998 -19.801 563 18.094 41.773 -26.016 564 97.110 -15.760 27.131 565 37.868 -17.627 -43.040 566 12.503 27.710 19.693 567 14.637 35.705 6.4258 568 9.5912 4.4102 14.891 569 94.749 -28.848 32.676 570 75.587 -21.275 83.332 571 92.748 -42.426 65.909 572 75.113 -23.907 82.792 573 18.780 41.932 -18.426 574 13.950 35.656 -9.3445 575 13.757 35.235 -6.0742 576 96.680 -17.952 26.465 577 18.062 15.986 27.494 578 1.9395 9.8936 -13.883 579 2.5484 12.604 -12.901 580 98.059 -10.936 26.315 581 1.4608 7.7628 -14.655 582 31.402 -10.876 -42.761 583 93.398 -36.243 23.674 584 65.304 -25.761 73.708 585 15.247 37.049 -7.2349 586 60.789 -48.938 -34.119 587 64.621 -11.705 73.642 588 97.991 -10.568 14.827 589 64.095 -14.411 73.046 590 73.790 7.7669 82.952 591 98.954 -5.8466 14.075 592 21.901 -26.524 -13.859 593 64.838 -28.551 73.175 594 66.638 -48.330 74.141 595 93.469 -38.126 71.164 596 93.891 -33.896 33.666 597 94.415 -30.603 29.859 598 65.068 12.324 75.154 599 38.594 -12.023 -49.771 600 97.286 -15.375 36.557 601 98.758 -6.3053 6.9940 602 97.990 -11.401 28.491 603 16.644 40.024 -25.212 604 12.644 34.267 -11.479 605 30.892 -14.807 -38.040 606 98.845 -5.7433 4.8813 607 65.074 -48.355 72.708 608 98.352 -8.9751 17.664 609 98.068 -9.2468 1.4009 610 95.983 -21.299 20.802 611 95.649 -22.928 17.991 612 65.874 27.091 76.670 613 13.660 -6.4284 -27.147 614 98.322 -8.3650 6.3023 615 99.287 -3.7018 5.5821 616 2.7568 13.905 -16.538 617 98.498 -7.2071 2.0839 618 93.440 -37.521 51.348 619 67.021 -45.533 74.583 620 14.908 36.307 -0.58313 621 34.814 62.584 -42.216 622 97.638 -12.134 12.004 623 96.327 -19.640 23.627 624 95.427 -24.564 24.522 625 63.454 30.154 74.620 626 98.674 -6.8581 9.1141 627 48.693 -36.891 58.071 628 95.324 -24.523 15.194 629 10.234 -3.8088 15.773 630 97.558 -12.683 14.146 631 14.161 36.112 -12.523 632 98.409 -7.7906 4.1893 633 64.667 -3.4852 74.039 634 98.236 -8.9301 8.4228 635 40.488 -42.286 -17.060 636 98.276 -9.4802 19.818 637 94.022 -32.861 29.254 638 95.091 -25.465 10.261 639 92.401 -44.541 63.247 640 97.212 -14.242 11.332 641 60.274 13.480 70.805 642 97.979 -9.8432 3.5065 643 61.449 -42.426 -42.755 644 61.279 -44.061 -40.620 645 97.131 -14.803 13.474 646 11.066 0.13153 17.073 647 2.6548 14.357 -24.345 648 1.6693 9.0636 -18.311 649 96.876 -15.771 8.5328 650 96.548 -17.268 5.7501 651 93.705 -34.571 26.458 652 24.209 49.608 -34.279 653 92.396 -43.762 45.226 654 16.215 -3.9840 -32.547 655 94.928 -26.687 14.573 656 95.009 -26.082 12.414 657 49.564 -30.776 59.076 658 49.981 -39.911 59.154 659 49.246 -23.094 -50.252 660 96.751 -17.453 24.286 661 49.288 -21.582 59.155 662 48.624 -28.370 -43.729 663 34.187 -18.166 -38.218 664 97.479 -13.221 16.295 665 97.891 -10.430 5.6198 666 9.4735 -7.9320 14.576 667 49.802 -18.581 59.741 668 19.362 -12.364 -27.400 669 99.023 -4.5922 0.67844 670 22.611 -3.6235 -40.165 671 38.151 19.216 50.781 672 98.588 -6.6144 -0.013868 673 40.962 -60.212 50.354 674 33.104 -27.840 -25.996 675 91.208 -51.030 34.191 676 96.792 -16.355 10.669 677 49.355 -36.791 -34.911 678 11.583 33.424 -16.766 679 49.943 -70.267 58.280 680 32.549 -16.504 -38.126 681 17.496 -10.455 -27.303 682 92.451 -43.295 43.010 683 49.345 5.1238 60.343 684 37.099 -46.540 47.182 685 49.722 -9.5417 60.033 686 49.790 -0.72009 60.480 687 96.413 -17.439 -1.2359 688 41.737 -52.183 51.262 689 26.085 -7.4447 -40.243 690 37.198 -30.691 47.742 691 69.549 -74.981 76.016 692 96.016 -19.491 -1.8703 693 92.084 -45.642 42.458 694 94.495 -28.416 4.7633 695 96.231 -18.730 2.9843 696 94.493 -27.682 -4.3025 697 97.645 -11.291 0.72718 698 48.969 10.840 60.278 699 49.915 -31.563 -41.641 700 49.189 24.188 61.192 701 39.020 -30.675 49.411 702 69.513 -61.943 76.351 703 47.501 24.655 59.669 704 95.923 -20.156 0.23596 705 22.015 -7.8039 -35.243 706 96.142 -19.361 5.1061 707 40.470 -20.983 51.078 708 49.566 -57.466 58.260 709 17.783 -8.2314 -29.976 710 94.704 -27.603 9.6490 711 16.928 40.614 -27.955 712 9.3907 18.272 14.772 713 35.632 -43.575 45.924 714 33.733 -22.036 -33.425 715 96.056 -19.982 7.2356 716 49.537 -35.051 -37.175 717 96.507 -16.778 -3.3341 718 11.245 7.0467 -37.593 719 1.8942 -1.9846 -6.2632 720 47.249 11.259 58.717 721 1.7705 -2.7565 -3.4309 722 22.308 -5.7024 -37.727 723 35.312 -46.617 45.550 724 21.196 -14.213 -27.509 725 94.408 -29.083 6.9015 726 36.766 -33.970 47.242 727 2.6360 -6.1011 0.26016 728 2.8570 -4.7223 -4.7991 729 94.130 -29.720 -4.8832 730 39.944 18.726 52.400 731 8.7953 -11.526 13.504 732 24.068 -7.6171 -37.773 733 5.3564 -13.837 4.3974 734 3.9577 -8.9762 -0.10455 735 4.0814 -8.2043 -2.9369 736 5.4537 -13.230 2.1705 737 5.5774 -12.458 -0.66183 738 92.870 -38.251 6.7505 739 92.956 -39.065 25.298 740 36.276 -54.949 46.219 741 49.874 40.877 62.833 742 12.146 34.604 -22.746 743 94.304 -29.122 -0.081520 744 92.439 -41.085 8.3597 745 7.7344 -16.482 11.817 746 25.806 -9.4814 -37.828 747 94.213 -29.827 2.0412 748 76.402 53.670 -36.880 749 33.306 -25.909 -28.506 750 25.535 -11.534 -35.373 751 25.274 -13.599 -32.877 752 86.571 -48.619 -21.387 753 8.4996 21.180 13.431 754 86.320 -50.322 -21.793 755 77.143 51.326 -35.703 756 87.654 -51.273 -19.696 757 74.895 40.638 -39.423 758 73.588 62.671 -41.366 759 21.458 -12.063 -30.136 760 74.089 -40.651 -41.237 761 75.046 -44.692 -39.717 762 74.314 38.950 -40.376 763 81.969 -39.517 -28.622 764 82.242 -37.797 -28.177 765 83.323 -40.533 -26.477 766 82.999 40.162 -26.390 767 62.313 48.945 -59.909 768 83.599 -38.784 -26.027 769 92.618 -40.332 13.237 770 81.619 40.898 -28.592 771 75.714 38.103 -38.119 772 82.423 38.417 -27.326 773 81.162 -35.040 -29.879 774 92.892 -38.820 15.969 775 89.925 -36.649 -16.027 776 90.246 -34.722 -15.508 777 92.278 -41.716 3.5233 778 92.189 -42.466 5.6707 779 49.691 60.400 64.056 780 73.152 -36.517 -42.725 781 96.450 2.4832 17.203 782 73.498 41.486 -41.680 783 93.177 -37.260 18.717 784 91.736 -48.683 57.873 785 72.964 -27.930 -42.984 786 91.079 10.056 39.538 787 78.785 32.143 -33.215 788 72.469 -30.888 -43.799 789 71.598 -26.536 -45.185 790 80.182 31.341 -30.978 791 97.431 0.38812 16.379 792 79.006 -29.467 -33.287 793 86.487 -30.470 -21.400 794 94.279 5.3862 25.498 795 80.378 -30.507 -31.101 796 90.571 -54.628 21.593 797 92.886 12.780 11.909 798 86.163 -32.364 -21.925 799 97.757 2.4067 7.8094 800 92.425 -39.781 -7.6138 801 95.473 4.5897 18.046 802 98.831 0.90116 4.9281 803 64.318 11.174 -56.835 804 79.637 29.550 -31.866 805 87.853 -31.271 -19.249 806 89.164 21.660 13.327 807 86.278 30.143 -21.251 808 86.820 -28.559 -20.861 809 94.209 4.9653 27.707 810 77.770 63.893 -25.244 811 67.850 74.029 -50.636 812 96.528 2.9637 15.040 813 97.673 1.8883 9.9410 814 8.1500 15.518 12.806 815 96.608 3.4535 12.884 816 93.314 7.5464 26.411 817 87.708 21.035 30.063 818 78.559 -23.116 -33.964 819 76.859 -23.820 -36.694 820 82.374 -27.861 -27.905 821 91.611 -26.877 -13.309 822 97.843 2.9339 5.6852 823 90.498 -55.306 23.804 824 6.4372 -9.3009 9.8793 825 65.584 52.415 -54.509 826 77.175 -22.066 -36.176 827 89.866 18.251 19.047 828 71.624 -17.371 -45.094 829 91.272 -50.455 31.968 830 8.2014 8.5881 12.798 831 71.031 -20.573 -46.070 832 72.402 27.724 -43.558 833 92.024 -46.979 62.709 834 89.986 25.946 -6.2692 835 72.934 29.467 -42.682 836 91.613 13.118 21.610 837 91.970 7.4728 40.780 838 87.121 27.600 -19.936 839 97.931 3.4700 3.5686 840 87.598 33.987 -12.239 841 90.810 -53.893 35.905 842 2.7540 1.1728 4.2779 843 92.538 -41.001 15.413 844 93.688 9.7417 15.405 845 78.888 -21.311 -33.426 846 5.5501 -2.3368 8.5744 847 89.376 15.556 34.801 848 77.501 -20.287 -35.642 849 3.3629 3.8829 5.2480 850 89.509 23.476 4.5271 851 90.974 -22.214 -14.273 852 95.397 4.1291 20.226 853 83.290 25.382 -26.053 854 75.053 -16.357 -39.554 855 85.206 26.477 -22.988 856 78.570 25.946 -33.610 857 4.1067 7.1938 6.4332 858 89.348 24.355 -16.437 859 91.540 12.701 23.833 860 94.578 7.1666 16.723 861 89.247 22.100 11.114 862 92.424 10.125 25.119 863 3.7168 -1.5649 5.7420 864 92.134 -42.221 -1.2700 865 89.694 24.438 0.18071 866 62.203 -5.4554 -60.383 867 78.938 21.465 -33.053 868 93.533 8.8348 19.788 869 90.206 21.799 -15.107 870 95.631 5.5392 13.706 871 90.024 19.107 14.605 872 90.317 13.339 33.781 873 86.468 34.967 -7.0624 874 92.804 12.314 14.092 875 80.614 -20.442 -30.662 876 89.083 21.228 15.548 877 89.944 18.674 16.822 878 85.789 -25.832 -22.472 879 96.373 2.0120 19.373 880 62.304 -13.559 -60.254 881 71.362 24.229 -45.269 882 78.440 61.741 -24.191 883 83.381 -22.244 -26.267 884 66.161 57.666 -53.528 885 70.235 -16.059 -47.338 886 94.848 -17.516 -8.1705 887 92.724 11.857 16.284 888 90.190 26.993 -10.522 889 77.531 22.317 -35.308 890 88.526 32.015 -13.093 891 62.775 -11.143 -59.471 892 90.662 15.271 22.553 893 92.095 15.820 8.4201 894 90.736 15.687 20.325 895 95.245 -15.499 -7.5349 896 4.9898 11.124 7.8402 897 89.420 23.009 6.7139 898 5.0695 4.4561 7.8974 899 61.925 -6.7872 -60.846 900 92.029 7.8215 38.534 901 91.348 -20.223 -13.669 902 91.926 14.882 12.786 903 70.985 28.686 -45.851 904 70.003 6.2669 -47.590 905 70.139 -8.1910 -47.450 906 84.680 24.631 -23.843 907 91.112 -52.689 52.458 908 76.790 -15.646 -36.755 909 92.819 14.087 -11.064 910 70.544 -14.444 -46.827 911 84.982 34.255 7.0738 912 62.490 10.947 -59.833 913 7.1770 4.8872 11.167 914 92.009 15.347 10.599 915 75.548 15.012 -38.555 916 71.293 17.940 -45.422 917 77.144 -13.828 -36.176 918 89.045 27.960 -5.4165 919 70.429 8.0257 -46.886 920 89.333 22.550 8.9096 921 77.444 15.943 -35.495 922 88.311 24.203 12.057 923 69.587 4.5201 -48.276 924 76.962 14.096 -36.284 925 70.349 14.408 -46.978 926 92.229 -41.419 -3.3931 927 76.109 -10.982 -37.823 928 86.301 27.613 18.521 929 84.760 -23.092 -24.083 930 64.142 39.767 -56.959 931 84.160 22.777 -24.687 932 88.638 18.841 29.028 933 76.481 -9.1540 -37.213 934 89.886 25.435 -4.1286 935 32.694 62.405 -61.860 936 70.816 16.172 -46.208 937 81.240 17.967 -29.389 938 83.633 46.196 -18.393 939 90.960 12.816 -14.001 940 92.516 -14.223 -11.789 941 97.325 -5.4268 -4.2044 942 5.9526 8.3867 9.3044 943 89.979 -19.528 -15.815 944 89.605 -21.509 -16.419 945 92.333 12.153 -11.846 946 87.285 32.479 -5.8077 947 62.399 3.3283 -60.019 948 90.677 -54.378 28.730 949 97.353 -0.093370 18.539 950 76.023 10.402 -37.821 951 88.229 23.774 14.281 952 91.398 11.895 28.298 953 91.550 -11.558 -13.283 954 92.920 -12.219 -11.140 955 6.9786 12.330 10.939 956 64.171 23.515 -57.007 957 96.691 3.9526 10.735 958 32.372 61.773 -59.758 959 76.488 12.249 -37.060 960 85.072 34.684 4.8466 961 88.571 25.545 5.4354 962 91.497 19.849 0.62123 963 91.314 18.860 4.9415 964 89.191 18.011 -16.744 965 86.366 34.484 -4.8973 966 83.888 28.945 41.440 967 62.769 18.658 -59.334 968 6.0158 15.249 9.4750 969 69.819 -1.8558 -47.935 970 95.110 2.3831 29.008 971 93.177 6.7363 30.854 972 85.890 32.195 6.0791 973 86.994 24.314 24.285 974 91.961 -9.5597 -12.621 975 92.744 19.383 -6.5934 976 81.692 -14.795 -28.905 977 93.330 -10.214 -10.481 978 82.872 48.572 -19.580 979 88.755 26.485 1.0664 980 75.458 -6.3055 -38.841 981 91.853 10.212 -12.618 982 92.182 16.303 6.2494 983 85.467 30.129 17.294 984 88.926 20.394 20.013 985 13.845 38.040 -36.293 986 86.785 36.466 -13.496 987 85.547 30.524 15.033 988 96.844 -0.82668 -4.9108 989 81.183 11.515 -29.529 990 64.989 37.122 -55.585 991 78.658 -6.4031 -33.700 992 81.661 13.404 -28.750 993 75.848 -4.4717 -38.201 994 81.532 42.834 9.0541 995 91.006 -6.8950 -14.099 996 82.147 15.290 -27.960 997 78.390 6.7135 -34.040 998 76.096 3.9034 -37.748 999 81.062 -10.105 -29.878 1000 82.311 46.201 -8.7890 1001 82.070 -12.887 -28.290 1002 75.668 2.0526 -38.450 1003 82.418 46.659 -10.970 1004 93.851 10.686 11.051 1005 63.237 26.351 -58.524 1006 93.055 13.740 7.5643 1007 80.461 -5.4134 -30.806 1008 91.431 -4.9054 -13.414 1009 86.149 26.848 23.058 1010 85.556 36.958 -6.1388 1011 90.912 6.3100 -14.133 1012 82.456 -10.969 -27.661 1013 90.451 4.3505 -14.876 1014 86.922 23.944 26.559 1015 84.894 33.836 9.3107 1016 90.055 -4.2256 -15.573 1017 81.456 -8.1947 -29.236 1018 82.584 10.706 -27.297 1019 85.259 35.568 0.42197 1020 85.389 29.744 19.563 1021 86.720 22.892 33.414 1022 80.319 1.1753 -30.988 1023 85.630 30.928 12.781 1024 84.782 26.710 40.268 1025 87.287 18.779 46.071 1026 96.084 0.22353 28.114 1027 80.761 45.230 7.8993 1028 80.756 3.0809 -30.275 1029 80.872 -3.5046 -30.136 1030 15.314 39.774 -36.972 1031 89.629 -6.2076 -16.260 1032 21.992 48.498 -46.784 1033 81.041 46.419 1.1194 1034 88.322 17.122 40.405 1035 89.071 5.0403 -17.046 1036 92.549 18.322 -2.3478 1037 89.549 0.41845 -16.331 1038 96.948 5.5040 4.3323 1039 92.361 17.295 1.9334 1040 81.445 48.123 -7.7652 1041 90.964 9.3916 44.050 1042 80.189 48.377 2.2246 1043 58.308 48.206 -66.523 1044 80.673 44.851 10.181 1045 83.243 32.336 33.304 1046 86.076 26.479 25.337 1047 81.834 38.244 24.012 1048 91.694 -49.059 60.035 1049 58.788 53.411 -65.699 1050 97.908 -4.9364 30.744 1051 93.771 2.2990 43.277 1052 60.021 -79.909 67.213 1053 50.133 32.594 -80.179 1054 89.747 -57.791 -9.6429 1055 90.113 -57.504 16.236 1056 94.735 0.062214 42.307 1057 81.197 41.361 18.226 1058 77.518 62.996 -20.940 1059 77.045 61.290 -12.181 1060 81.120 41.016 20.543 1061 81.278 41.716 15.919 1062 90.505 6.6884 66.277 1063 89.819 10.497 54.118 1064 89.645 -58.766 -7.5290 1065 91.375 -51.105 57.348 1066 58.715 57.087 -65.798 1067 76.266 63.024 -10.990 1068 75.736 61.127 0.31034 1069 89.702 -58.818 -2.8672 1070 76.037 57.582 10.592 1071 89.984 -58.056 11.397 1072 89.778 -58.716 1.8424 1073 86.320 20.786 49.492 1074 74.662 73.978 -30.144 1075 81.762 37.915 26.340 1076 76.046 62.242 -6.5084 1077 97.485 -7.6924 46.108 1078 91.065 -53.115 54.652 1079 80.971 40.354 25.200 1080 82.365 34.518 34.491 1081 88.888 12.816 55.205 1082 82.429 34.820 32.153 1083 75.269 59.436 11.925 1084 82.949 30.913 44.973 1085 75.871 52.025 40.293 1086 74.978 62.893 1.6090 1087 76.774 50.460 34.046 1088 93.421 0.13630 58.814 1089 20.992 47.603 -48.464 1090 22.344 49.188 -49.076 1091 90.972 -53.181 43.091 1092 76.053 52.738 33.038 1093 90.766 -55.085 51.950 1094 92.427 2.2061 62.026 1095 15.682 40.501 -39.460 1096 50.266 51.696 -79.871 1097 75.184 59.123 14.284 1098 12.752 37.061 -38.130 1099 77.279 47.198 44.672 1100 85.367 22.829 52.940 1101 75.283 54.734 34.472 1102 75.629 56.047 22.420 1103 88.800 12.320 59.674 1104 50.105 37.838 -80.203 1105 80.225 36.983 55.771 1106 78.031 44.845 45.674 1107 87.008 -82.628 16.032 1108 75.554 55.766 24.815 1109 81.662 31.166 68.903 1110 89.485 -63.607 36.212 1111 89.252 -65.227 33.528 1112 88.759 12.087 61.887 1113 79.391 39.234 57.091 1114 80.039 36.124 67.043 1115 89.096 -66.102 28.625 1116 82.489 28.658 69.845 1117 8.9578 17.699 -44.592 1118 90.476 -57.011 49.245 1119 77.886 44.227 52.801 1120 7.9025 13.824 -39.939 1121 86.665 -86.159 20.180 1122 76.438 49.106 48.493 1123 90.042 -59.626 39.378 1124 89.730 -61.923 38.906 1125 73.016 60.354 41.468 1126 27.068 57.213 -68.691 1127 73.575 57.849 47.243 1128 73.526 57.672 49.676 1129 90.198 -58.890 46.539 1130 74.163 55.328 52.955 1131 89.985 -60.180 41.608 1132 87.913 -76.577 40.808 1133 88.674 -71.184 57.907 1134 87.966 -76.674 50.109 END_DATA # And then come the triangles KEYWORD "VERTEX_0" KEYWORD "VERTEX_1" KEYWORD "VERTEX_2" NUMBER_OF_FIELDS 3 BEGIN_DATA_FORMAT VERTEX_0 VERTEX_1 VERTEX_2 END_DATA_FORMAT NUMBER_OF_SETS 2266 BEGIN_DATA 83 1 88 48 1 100 99 48 100 45 2 106 67 3 130 3 129 130 123 136 144 39 4 154 41 39 154 159 120 168 135 122 170 76 69 172 175 178 184 174 175 186 152 167 188 149 155 190 167 155 191 155 149 193 144 136 194 136 149 194 123 144 194 149 192 194 149 136 197 195 149 197 138 173 198 185 189 205 189 181 205 151 156 208 117 108 210 200 117 210 199 204 211 141 151 212 143 140 213 141 212 214 212 207 214 204 199 215 140 143 216 206 209 217 209 203 217 112 97 218 97 201 218 213 140 219 118 141 220 141 214 220 201 202 221 202 203 221 204 206 222 211 204 222 198 173 223 199 198 223 173 178 223 215 199 223 183 196 225 207 212 226 196 207 226 225 196 226 140 137 227 219 140 227 0 14 228 98 0 228 182 187 230 185 200 231 182 181 232 181 189 232 101 98 233 98 228 233 127 117 234 117 200 234 200 185 234 224 229 235 203 209 236 221 203 236 222 206 237 224 235 238 224 238 239 214 207 240 220 214 240 156 151 241 179 187 242 187 182 242 182 232 242 145 127 243 205 145 243 185 205 243 127 234 243 234 185 243 105 102 244 202 201 245 224 239 246 244 224 246 103 101 247 101 233 247 229 224 247 233 229 247 180 183 248 183 225 248 102 104 249 244 102 249 104 103 249 103 247 249 224 244 249 247 224 249 207 196 250 111 112 251 112 218 251 218 201 251 201 221 251 206 217 252 237 206 252 209 206 254 206 253 254 179 180 256 180 248 256 187 179 256 181 182 257 205 181 257 43 53 261 258 43 261 235 229 261 212 151 262 226 212 262 210 108 263 206 204 265 253 206 265 204 215 265 229 233 266 233 228 266 14 43 266 43 258 266 228 14 266 258 261 266 261 229 266 200 210 267 210 263 267 113 110 268 110 260 268 114 113 268 244 246 269 107 109 270 208 156 271 180 179 272 179 242 272 183 180 272 56 64 275 53 56 275 261 53 275 235 261 275 221 236 276 269 246 278 189 185 280 185 231 280 232 189 280 260 255 281 255 273 281 236 209 282 209 254 282 276 236 282 151 208 283 262 151 283 226 262 283 208 271 283 267 270 284 270 269 284 269 278 284 238 235 285 105 244 286 244 269 286 269 270 286 275 64 287 225 226 288 226 283 288 283 271 288 271 156 290 264 274 292 279 264 292 267 284 293 134 137 294 238 285 295 293 284 297 284 278 300 297 284 300 108 107 301 107 270 301 263 108 301 267 263 301 270 267 301 259 277 302 201 97 303 245 201 303 239 238 304 238 295 304 246 239 304 278 246 304 300 278 304 170 174 305 280 231 306 232 280 306 293 297 306 248 225 308 225 288 308 288 271 308 271 290 308 256 248 308 291 256 308 290 291 308 231 200 309 200 267 309 267 293 309 293 306 309 306 231 309 289 279 310 279 292 310 96 95 311 296 273 312 297 300 313 300 304 313 109 105 314 105 286 314 270 109 314 286 270 314 96 311 315 75 80 316 74 75 316 235 275 316 285 235 316 64 74 316 287 64 316 275 287 316 251 221 317 221 276 317 118 111 317 111 251 317 102 105 318 105 299 318 152 145 319 145 205 319 205 257 319 257 152 319 94 96 320 96 315 320 99 94 320 182 230 321 259 302 323 128 138 324 138 198 324 198 199 324 199 211 324 320 315 326 260 281 327 296 312 328 312 298 328 115 114 329 114 268 329 268 260 329 260 327 329 116 115 329 273 255 330 312 273 330 65 62 331 62 55 332 331 62 332 55 48 333 48 99 333 320 326 333 326 332 333 332 55 333 273 296 334 296 328 334 297 313 335 298 289 336 289 310 336 310 322 336 322 328 336 328 298 336 302 277 337 277 307 337 337 307 338 230 187 339 326 315 340 322 310 341 99 320 342 320 333 342 333 99 342 327 281 343 281 273 343 265 215 344 315 311 345 340 315 345 328 322 346 334 328 346 322 341 346 187 256 347 339 187 347 256 291 347 323 302 348 302 337 348 337 338 348 292 325 349 311 95 350 345 311 350 109 107 351 250 196 352 162 119 353 332 326 355 326 340 355 340 345 357 355 340 357 307 277 358 299 307 358 105 109 359 299 105 359 109 351 359 116 329 361 329 327 361 327 343 361 307 299 362 338 307 362 351 338 362 299 359 362 359 351 362 274 259 363 292 274 363 259 323 363 325 292 363 240 207 366 207 250 366 178 175 367 223 178 367 215 223 367 344 215 367 348 338 368 338 351 368 273 334 369 343 273 369 346 341 369 334 346 369 295 285 370 285 316 370 351 107 371 368 351 371 156 162 372 290 156 372 365 343 373 343 369 373 80 69 374 316 80 374 370 316 374 357 345 375 364 356 375 345 350 376 350 364 376 364 375 376 375 345 376 310 292 377 292 349 377 341 310 377 107 108 378 371 107 378 121 116 380 116 361 380 361 343 380 343 365 380 196 183 381 352 196 381 183 272 381 368 371 382 371 378 382 295 370 383 323 348 384 348 368 384 331 332 385 332 355 385 313 304 386 335 313 386 304 295 386 295 383 386 257 182 388 182 321 388 289 298 389 69 76 390 374 69 390 370 374 390 368 382 391 384 368 391 323 384 391 232 306 392 306 297 392 297 335 392 325 363 393 78 65 394 65 331 394 331 385 394 92 78 394 372 162 395 291 290 395 290 372 395 347 291 395 276 282 396 282 254 396 116 121 397 264 279 399 279 289 399 108 117 400 378 108 400 365 373 401 126 128 402 54 50 403 58 54 403 203 202 404 354 203 404 202 245 404 52 51 405 50 52 405 403 50 405 46 45 406 45 106 406 106 110 406 51 46 406 259 274 408 274 264 408 152 188 411 379 410 411 379 391 412 410 379 412 391 382 412 357 375 413 125 126 414 126 407 414 382 378 415 378 400 415 412 382 415 410 412 415 403 405 417 113 114 418 114 115 418 93 92 419 387 93 419 392 335 420 363 323 423 323 391 423 391 379 423 379 393 423 393 363 423 76 77 424 390 76 424 405 51 427 51 406 427 110 113 427 113 418 427 406 110 427 383 370 429 370 390 429 393 379 430 379 411 430 349 325 430 325 393 430 409 417 431 417 405 431 405 427 431 427 418 431 115 116 432 418 115 432 431 418 432 217 203 433 252 217 433 237 252 433 203 354 433 277 259 435 259 408 435 61 58 436 58 403 436 59 61 436 403 417 436 63 59 436 425 426 436 417 409 437 425 436 438 436 417 438 417 437 438 126 402 439 407 126 439 414 407 439 397 121 440 121 398 440 116 397 440 432 116 440 408 264 442 422 420 443 68 63 445 63 436 445 436 426 445 73 68 445 434 428 447 124 125 448 125 414 448 117 127 449 400 117 449 415 400 449 441 445 450 445 426 450 369 341 452 373 369 452 401 373 452 341 377 452 72 70 454 70 73 454 73 445 454 445 441 454 392 420 455 441 450 456 426 425 457 425 438 457 421 443 458 220 240 459 240 366 459 360 220 459 453 360 459 121 124 460 398 121 460 124 448 460 446 447 461 447 454 461 454 441 461 441 456 461 456 446 461 440 398 462 398 460 462 385 355 463 394 385 463 92 394 463 419 92 463 272 242 464 289 389 466 399 289 466 128 324 467 402 128 467 254 253 468 396 254 468 446 456 469 457 438 470 465 457 470 358 277 472 277 435 472 450 426 473 426 457 473 457 465 473 431 432 474 432 440 474 440 462 474 409 431 474 462 471 474 437 409 474 438 437 474 470 438 474 471 470 474 255 260 475 330 255 475 421 458 476 428 434 477 125 124 478 390 424 479 429 390 479 383 429 479 462 460 480 470 471 480 471 462 480 434 447 481 477 434 481 3 67 482 67 72 482 447 428 482 72 454 482 454 447 482 25 3 482 428 477 482 456 450 483 469 456 483 450 473 483 37 38 484 451 37 484 38 40 484 154 153 484 40 41 484 41 154 484 469 483 487 356 360 488 375 356 488 360 453 488 413 375 488 44 42 490 42 25 490 25 482 490 482 477 490 317 276 492 276 396 492 153 157 493 411 410 494 127 145 494 448 414 495 470 480 495 460 448 497 480 460 497 448 495 497 495 480 497 439 402 499 402 467 499 444 416 500 478 444 500 380 365 501 365 401 502 401 444 502 501 365 502 478 124 502 444 478 502 377 349 503 349 416 503 486 507 508 496 485 508 477 481 509 481 489 509 489 485 509 253 265 510 468 253 510 36 37 511 37 451 511 447 446 512 481 447 512 446 469 512 469 487 512 487 486 512 489 481 512 485 489 512 486 508 512 508 485 512 77 81 513 424 77 513 381 272 514 272 464 514 490 477 515 477 509 515 509 506 515 410 415 516 415 449 516 494 410 516 449 127 516 127 494 516 500 416 517 486 487 518 507 486 518 487 483 518 465 470 519 470 495 519 473 465 519 167 152 520 388 167 520 152 257 520 257 388 520 162 156 521 519 495 522 451 484 523 484 153 523 153 493 523 493 498 523 511 451 523 506 509 524 95 97 525 350 95 525 97 112 525 265 344 527 510 265 527 122 119 529 119 162 529 162 521 529 521 528 529 508 507 530 507 518 530 510 527 532 529 528 533 528 532 533 476 458 534 458 479 534 479 424 534 424 513 534 264 399 535 442 264 535 399 466 535 170 122 536 122 529 536 529 533 536 174 170 536 124 121 537 121 380 537 380 501 537 501 502 537 502 124 537 532 527 538 533 532 538 536 533 538 367 175 539 344 367 539 527 344 539 538 527 539 47 44 540 44 490 540 490 515 540 174 536 541 536 538 541 175 174 541 539 175 541 538 539 541 521 156 544 528 521 544 145 152 545 152 411 545 411 494 545 494 145 545 483 473 546 518 483 546 473 519 546 519 522 546 355 357 547 531 355 547 81 82 548 513 81 548 476 534 548 534 513 548 505 511 549 468 510 550 510 532 550 532 528 550 528 544 550 491 504 551 542 491 551 523 498 551 498 542 551 511 523 551 549 511 551 422 443 552 463 355 553 355 531 553 419 463 553 543 419 553 91 93 554 93 387 554 387 419 554 419 543 554 298 312 555 389 298 555 128 126 556 500 128 556 478 500 556 211 222 557 324 211 557 467 324 557 335 386 558 386 383 558 383 479 558 554 543 560 24 36 561 36 511 561 354 404 562 524 509 563 552 560 565 126 125 566 125 478 566 478 556 566 556 126 566 414 439 567 439 499 567 495 414 567 522 495 567 499 467 567 467 557 567 546 522 567 517 416 568 504 491 569 41 40 570 39 41 570 20 21 571 526 20 571 21 24 571 505 526 571 40 38 572 570 40 572 509 485 573 563 509 573 485 496 573 222 237 575 557 222 575 416 444 577 444 401 577 401 452 577 452 377 577 377 503 577 503 416 577 468 550 579 550 544 579 544 578 579 564 559 580 241 151 581 151 578 581 156 241 581 544 156 581 578 544 581 531 547 582 37 36 584 38 37 584 572 38 584 508 530 585 575 574 585 82 84 586 548 82 586 476 548 586 11 4 587 4 39 589 39 570 589 570 572 589 572 584 589 587 4 589 163 161 591 588 163 591 242 232 592 232 392 592 392 455 592 464 242 592 24 21 593 36 24 593 584 36 593 511 505 595 561 511 595 24 561 595 571 24 595 505 571 595 551 504 596 504 569 596 596 569 597 22 17 598 17 590 598 543 553 599 553 531 599 531 565 599 560 543 599 565 560 599 157 158 600 493 157 600 498 493 600 542 498 600 559 564 600 491 542 600 576 491 600 564 576 600 158 580 602 580 559 602 559 600 602 600 158 602 563 573 603 573 562 603 237 433 604 575 237 604 574 575 604 582 547 605 601 160 606 13 12 607 18 13 607 594 18 607 163 588 608 27 32 612 32 23 612 250 352 613 366 250 613 459 366 613 352 381 613 601 606 614 160 159 615 159 606 615 606 160 615 492 396 616 396 468 616 468 579 616 579 578 616 606 159 617 166 609 617 526 505 618 505 549 618 549 551 618 551 596 618 21 20 619 593 21 619 20 18 619 18 594 619 594 607 619 546 567 620 567 557 620 530 518 620 585 530 620 518 546 620 557 575 620 575 585 620 57 49 621 49 47 621 515 506 621 60 57 621 47 540 621 540 515 621 569 491 624 491 576 624 610 611 624 576 623 624 597 569 624 623 610 624 31 27 625 34 31 625 27 612 625 591 161 626 161 160 626 160 601 626 588 591 626 588 622 630 562 573 631 573 496 631 496 508 631 508 585 631 585 574 631 574 604 631 614 606 632 606 617 632 15 11 633 11 587 633 16 15 633 17 16 633 590 17 633 598 590 633 601 614 634 626 601 634 622 588 634 588 626 634 443 420 635 458 443 635 420 335 635 335 558 635 479 458 635 558 479 635 158 163 636 580 158 636 163 608 636 596 597 637 20 526 639 622 634 640 23 22 641 22 598 641 612 23 641 617 609 642 632 617 642 85 86 643 84 85 644 85 643 644 586 84 644 611 610 645 630 622 645 622 640 645 416 349 646 349 430 646 568 416 646 430 629 646 141 118 647 118 317 647 317 492 647 151 141 647 492 616 647 578 151 648 616 578 648 151 647 648 647 616 648 596 637 651 597 624 651 637 597 651 506 524 652 621 506 652 453 459 654 459 613 654 624 611 655 611 628 655 583 651 655 651 624 655 628 638 656 655 628 656 593 619 657 619 607 657 627 657 658 657 607 658 90 91 659 91 554 659 554 560 659 576 564 660 623 576 660 564 580 660 580 636 660 610 623 660 593 657 661 89 90 662 90 659 662 560 552 662 659 560 662 608 588 664 636 608 664 588 630 664 660 636 664 645 610 664 610 660 664 630 645 664 614 632 665 632 642 665 634 614 665 640 634 665 649 640 665 650 649 665 430 411 666 629 430 666 435 408 667 661 435 667 589 584 667 584 593 667 593 661 667 159 168 669 617 159 669 413 488 670 312 330 671 555 312 671 168 166 672 669 168 672 166 617 672 617 669 672 103 104 673 101 103 673 420 422 674 455 420 674 464 592 674 592 455 674 628 611 676 611 645 676 645 640 676 640 649 676 443 421 677 421 476 677 644 643 677 476 586 677 586 644 677 433 354 678 604 433 678 354 562 678 562 631 678 631 604 678 98 101 679 101 673 679 565 531 680 531 582 680 582 605 680 663 565 680 381 514 681 514 668 681 613 381 681 618 596 682 653 618 682 535 466 683 598 633 683 641 598 683 442 535 685 587 589 685 589 667 685 408 442 685 667 408 685 633 587 685 683 633 686 633 685 686 535 683 686 685 535 686 679 673 688 357 413 689 547 357 689 413 670 689 358 472 690 164 169 692 687 164 692 682 596 693 653 682 693 169 171 696 692 169 696 166 165 697 609 166 697 650 665 697 665 642 697 642 609 697 165 687 697 695 650 697 687 695 697 641 683 698 87 89 699 89 662 699 86 87 699 662 552 699 625 612 700 612 641 700 35 34 700 34 625 700 641 698 700 690 472 701 657 627 701 10 9 702 12 10 702 607 12 702 8 7 702 7 691 702 9 8 702 658 607 702 330 475 703 687 692 704 695 687 704 692 696 704 453 654 705 650 695 706 695 704 706 704 694 706 472 435 707 435 661 707 661 657 707 657 701 707 701 472 707 679 688 708 688 658 708 7 6 708 691 7 708 658 702 708 702 691 708 654 613 709 613 681 709 705 654 709 681 668 709 656 638 710 655 656 710 563 603 711 524 563 711 652 524 711 500 517 712 422 552 714 552 565 714 565 663 714 680 605 714 663 680 714 638 628 715 628 676 715 649 650 715 676 649 715 650 706 715 694 638 715 706 694 715 552 443 716 443 677 716 699 552 716 643 86 716 86 699 716 677 643 716 165 164 717 164 687 717 687 165 717 111 118 718 360 356 718 118 220 718 220 360 718 162 353 719 353 119 719 395 162 719 466 389 720 683 466 720 698 683 720 389 555 720 700 698 720 703 700 720 119 123 721 719 119 721 488 453 722 453 705 722 670 488 722 102 318 723 318 713 723 713 684 723 668 514 724 638 694 725 710 638 725 318 299 726 299 358 726 627 658 726 701 627 726 658 688 726 688 684 726 713 318 726 358 690 726 690 701 726 684 713 726 194 192 727 347 395 728 395 719 728 123 194 728 721 123 728 719 721 728 696 171 729 671 330 730 330 703 730 555 671 730 703 720 730 720 555 730 167 191 731 666 411 731 689 670 732 670 722 732 722 705 732 155 167 733 167 388 733 149 190 734 192 149 734 727 192 734 194 727 735 728 194 735 339 347 735 734 339 735 347 728 735 727 734 735 190 155 736 155 733 736 388 321 736 733 388 736 321 230 737 230 339 737 734 190 737 190 736 737 736 321 737 339 734 737 596 651 739 651 583 739 675 693 739 693 596 739 673 104 740 684 688 740 688 673 740 104 102 740 102 723 740 723 684 740 26 28 741 29 30 741 30 33 741 28 29 741 33 35 741 35 700 741 700 703 741 703 475 741 19 26 741 475 260 741 245 303 742 404 245 742 562 404 742 603 562 742 711 603 742 694 704 743 704 696 743 696 729 743 188 167 745 167 731 745 411 188 745 731 411 745 605 547 746 547 689 746 689 732 746 725 694 747 738 725 747 694 743 747 147 146 748 514 464 749 464 674 749 674 422 749 422 714 749 605 746 750 732 705 750 746 732 750 724 514 751 514 749 751 749 714 751 714 605 751 605 750 751 138 128 753 128 500 753 173 138 753 500 712 753 77 76 754 76 172 754 150 147 755 147 748 755 172 177 756 177 752 756 752 754 756 754 172 756 755 748 757 3 25 758 129 3 758 25 42 758 130 129 758 146 130 758 748 146 758 705 709 759 709 668 759 668 724 759 724 751 759 750 705 759 751 750 759 85 84 760 84 82 761 760 84 761 82 81 763 81 77 765 763 81 765 77 754 765 754 752 765 764 763 765 142 148 766 765 752 768 764 765 768 710 725 769 725 738 769 738 744 769 148 150 770 766 148 770 150 755 770 755 757 771 770 755 771 757 762 771 142 766 772 766 770 772 761 82 773 82 763 773 763 764 773 655 710 774 710 769 774 177 176 775 752 177 775 176 171 776 775 176 776 738 747 777 744 738 778 738 777 778 2 19 779 106 2 779 19 741 779 110 106 779 260 110 779 741 260 779 85 760 780 757 748 782 748 758 782 762 757 782 583 655 783 655 774 783 739 583 783 618 653 784 770 771 787 86 85 788 85 780 788 785 86 788 87 86 789 86 785 789 89 87 789 772 770 790 770 787 790 161 163 791 760 761 792 761 773 792 780 760 792 792 773 795 768 752 798 752 775 798 764 768 798 176 177 800 171 176 800 729 171 800 159 160 802 790 787 804 775 776 805 798 775 805 793 798 805 139 142 807 142 772 807 793 805 808 130 146 810 758 42 811 791 781 812 161 791 812 781 801 812 160 161 813 799 160 813 712 517 814 173 753 814 753 712 814 161 812 815 813 161 815 794 809 816 785 788 819 788 780 819 780 792 819 792 818 819 773 764 820 764 798 820 798 793 820 795 773 820 792 795 820 776 171 821 805 776 821 171 169 821 808 805 821 159 802 822 160 799 822 802 160 822 191 155 824 155 193 824 666 731 824 731 191 824 49 57 825 57 767 825 819 818 826 675 739 829 517 568 830 90 89 831 89 789 831 18 20 833 20 639 833 526 618 833 618 784 833 639 526 833 133 131 834 762 782 835 771 762 835 787 771 835 133 139 838 139 807 838 143 120 839 120 159 839 159 822 839 675 829 841 119 122 842 123 119 842 122 135 842 135 170 842 774 769 843 739 783 843 783 774 843 796 823 843 823 739 843 826 818 845 193 149 846 149 195 846 568 646 846 646 629 846 824 193 846 629 666 846 666 824 846 826 845 848 170 305 849 842 170 849 821 169 851 772 790 853 790 804 853 789 785 854 785 819 854 819 826 854 831 789 854 828 831 854 826 848 854 807 772 855 772 853 855 838 807 855 804 787 856 787 835 856 853 804 856 174 186 857 305 174 857 849 305 857 133 838 858 859 836 862 136 123 863 123 842 863 197 136 863 195 197 863 846 195 863 777 747 864 92 93 866 853 856 867 844 860 868 801 852 868 860 801 868 794 816 868 816 862 868 852 794 868 862 836 868 131 133 869 133 858 869 812 801 870 801 860 870 815 812 870 860 844 870 806 861 871 786 847 872 818 792 875 792 820 875 845 818 875 806 871 876 876 871 877 793 808 878 820 793 878 801 781 879 852 801 879 93 91 880 146 147 882 810 146 882 875 820 883 42 44 884 811 42 884 47 49 884 49 825 884 44 47 884 782 758 884 825 782 884 758 811 884 91 90 885 90 831 885 831 828 885 880 91 885 844 868 887 868 836 887 874 844 887 133 834 888 835 832 889 856 835 889 867 856 889 832 881 889 139 133 890 840 139 890 133 888 890 93 880 891 836 859 892 887 836 894 827 877 894 877 887 894 836 892 894 892 827 894 164 165 895 175 184 896 849 857 898 842 849 898 863 842 898 846 863 898 866 93 899 93 891 899 891 866 899 837 786 900 786 872 900 169 164 901 164 886 901 851 169 901 797 874 902 877 871 902 874 887 902 887 877 902 835 782 903 832 835 903 881 832 903 866 891 905 838 855 906 858 838 906 855 853 906 653 693 907 848 845 908 854 848 908 134 132 909 828 854 910 885 828 910 880 885 910 891 880 910 905 891 910 65 78 912 568 846 913 846 898 913 830 568 913 871 861 914 861 893 914 902 871 914 797 902 914 889 881 915 915 881 916 854 908 917 888 834 918 890 888 918 803 904 919 893 861 920 867 889 921 889 915 921 861 806 922 920 861 922 904 803 923 921 915 924 803 919 925 747 743 926 864 747 926 800 177 926 743 729 926 729 800 926 905 910 927 910 854 927 854 917 927 820 878 929 883 820 929 825 767 930 906 853 931 847 817 932 872 847 932 927 917 933 918 834 934 1 83 935 83 79 935 79 71 935 915 916 936 925 915 936 853 867 937 931 853 937 867 921 937 148 142 938 909 132 939 886 164 940 164 895 940 901 886 940 166 168 941 186 175 942 175 896 942 857 186 942 830 913 942 898 857 942 913 898 942 851 901 943 901 940 943 808 821 944 821 851 944 851 943 944 878 808 944 929 878 944 943 929 944 134 909 945 909 939 945 873 840 946 840 890 946 890 918 946 78 92 947 912 78 947 92 866 947 803 912 947 923 803 947 739 823 948 829 739 948 841 829 948 781 791 949 879 781 949 791 163 949 163 879 949 915 925 950 925 919 950 806 876 951 922 806 951 876 928 951 862 816 952 859 862 952 872 932 952 892 859 952 932 892 952 943 940 953 940 895 954 953 940 954 814 517 955 517 830 955 896 184 955 830 942 955 942 896 955 925 936 956 916 881 956 936 916 956 799 813 957 813 815 957 815 870 957 60 621 958 71 66 958 935 71 958 66 60 958 621 652 958 924 915 959 915 950 959 850 897 961 897 920 961 920 922 961 850 865 962 865 934 962 893 920 963 920 897 963 897 850 963 850 962 963 869 858 964 858 906 964 906 931 964 132 131 964 939 132 964 131 869 964 873 946 965 62 65 967 65 912 967 912 803 967 803 925 967 925 956 967 178 173 968 173 814 968 184 178 968 955 184 968 814 955 968 866 905 969 923 947 969 947 866 969 809 794 970 816 809 971 952 816 971 900 872 971 872 952 971 809 970 971 911 960 972 953 954 974 131 132 975 834 131 975 934 834 975 845 875 976 908 845 976 917 908 976 875 883 976 165 166 977 166 941 977 895 165 977 954 895 977 974 954 977 147 150 978 882 147 978 150 148 978 148 938 978 918 934 979 934 865 979 946 918 979 865 850 979 850 961 979 961 972 979 905 927 980 927 933 980 969 905 980 137 134 981 134 945 981 945 939 981 893 963 982 876 877 984 877 827 984 827 892 984 892 932 984 928 876 984 711 742 985 742 303 985 142 139 986 139 840 986 938 142 986 840 873 986 922 951 987 951 928 987 928 983 987 120 143 988 168 120 988 143 213 988 941 168 988 213 219 988 921 924 989 924 959 989 782 825 990 825 930 990 903 782 990 933 917 991 980 933 991 937 921 992 921 989 992 969 980 993 980 991 993 960 911 994 953 974 995 931 937 996 937 992 996 964 931 996 959 950 997 989 959 997 950 919 998 997 950 998 917 976 999 991 917 999 883 929 1001 976 883 1001 999 976 1001 919 904 1002 998 919 1002 904 923 1002 923 969 1002 969 993 1002 938 986 1003 978 938 1003 870 844 1004 844 874 1004 874 797 1004 957 870 1004 881 903 1005 956 881 1005 967 956 1005 903 990 1005 797 914 1006 914 893 1006 1004 797 1006 893 982 1006 974 977 1008 995 974 1008 977 941 1008 941 988 1008 928 984 1009 984 973 1009 873 965 1010 986 873 1010 1003 986 1010 1000 1003 1010 227 137 1011 137 981 1011 219 227 1011 981 939 1011 929 943 1012 1001 929 1012 999 1001 1012 988 219 1013 219 1011 1013 1008 988 1013 932 817 1014 973 984 1014 984 932 1014 911 972 1015 994 911 1015 995 1008 1016 991 999 1017 1007 991 1017 999 1012 1017 964 996 1018 996 992 1018 992 989 1018 972 960 1019 979 972 1019 965 946 1019 946 979 1019 1010 965 1019 983 928 1020 928 1009 1020 817 847 1021 1014 817 1021 993 991 1022 1002 993 1022 997 998 1022 998 1002 1022 961 922 1023 972 961 1023 1015 972 1023 922 987 1023 163 158 1026 879 163 1026 794 852 1026 970 794 1026 852 879 1026 989 997 1028 1018 989 1028 997 1022 1028 991 1007 1029 1022 991 1029 1007 1017 1029 1028 1022 1029 652 711 1030 711 985 1030 943 953 1031 1012 943 1031 953 995 1031 995 1016 1031 1017 1012 1031 1029 1017 1031 958 652 1032 960 994 1033 1019 960 1033 1000 1010 1033 1010 1019 1033 994 1027 1033 847 786 1034 1021 847 1034 1024 1021 1034 1025 1024 1034 939 964 1035 964 1018 1035 1011 939 1035 1013 1011 1035 1018 1028 1035 962 934 1036 934 975 1036 134 294 1036 294 137 1036 132 134 1036 975 132 1036 1008 1013 1037 1016 1008 1037 1029 1031 1037 1031 1016 1037 1013 1035 1037 1028 1029 1037 1035 1028 1037 140 216 1038 216 143 1038 143 839 1038 822 799 1038 799 957 1038 839 822 1038 957 1004 1038 1006 140 1038 1004 1006 1038 963 962 1039 982 963 1039 137 140 1039 140 1006 1039 1006 982 1039 1036 137 1039 962 1036 1039 1003 1000 1040 1000 1033 1040 786 837 1041 1025 1034 1041 1034 786 1041 1033 1027 1042 1040 1033 1042 79 83 1043 930 767 1043 990 930 1043 1005 990 1043 1027 994 1044 1014 1021 1045 1021 1024 1045 1024 966 1045 1009 973 1046 973 1014 1046 1014 1045 1046 983 1020 1047 13 18 1048 18 833 1048 833 784 1048 71 79 1049 79 1043 1049 1043 767 1049 158 157 1050 970 1026 1050 1026 158 1050 837 900 1051 1041 837 1051 5 0 1052 0 98 1052 6 5 1052 708 6 1052 98 679 1052 679 708 1052 55 62 1053 62 967 1053 967 1005 1053 172 69 1054 177 172 1054 926 177 1054 769 744 1055 796 843 1055 843 769 1055 970 1050 1056 1050 157 1056 900 971 1056 1051 900 1056 971 970 1056 987 983 1057 810 882 1058 882 978 1058 978 1003 1058 72 1058 1059 1003 1040 1059 1058 1003 1059 983 1047 1060 1057 983 1060 1015 1023 1061 1023 987 1061 987 1057 1061 994 1015 1061 1044 994 1061 16 17 1062 15 16 1062 69 80 1064 1054 69 1064 926 1054 1064 12 13 1065 784 653 1065 653 907 1065 13 1048 1065 1048 784 1065 60 66 1066 57 60 1066 767 57 1066 66 71 1066 71 1049 1066 1049 767 1066 70 72 1067 72 1059 1067 73 70 1067 80 75 1069 1064 80 1069 864 926 1069 926 1064 1069 1042 1027 1070 1068 1042 1070 1027 1044 1070 744 778 1071 1055 744 1071 778 777 1072 777 864 1072 864 1069 1072 75 74 1072 74 1071 1072 1069 75 1072 1071 778 1072 1024 1025 1073 72 67 1074 67 130 1074 130 810 1074 810 1058 1074 1058 72 1074 1020 1009 1075 1047 1020 1075 1009 1046 1075 1059 1040 1076 1067 1059 1076 73 1067 1076 1040 1042 1076 1042 1068 1076 157 153 1077 153 1056 1077 1056 157 1077 9 10 1078 10 12 1078 12 1065 1078 1065 907 1078 1060 1047 1079 1047 1075 1079 1045 966 1080 1025 1041 1081 1041 1063 1081 1073 1025 1081 1046 1045 1082 1075 1046 1082 1045 1080 1082 59 63 1083 966 1024 1084 1080 966 1084 68 73 1086 73 1076 1086 1076 1068 1086 63 68 1086 1083 63 1086 1068 1070 1086 1070 1083 1086 1079 1075 1087 1075 1082 1087 4 11 1088 154 4 1088 1051 1056 1088 1056 153 1088 153 154 1088 1041 1051 1088 1063 1041 1088 96 94 1089 94 99 1090 1089 94 1090 958 1032 1090 1032 1089 1090 693 675 1091 675 841 1091 1079 1087 1092 7 8 1093 8 9 1093 9 1078 1093 1078 907 1093 907 693 1093 693 1091 1093 11 15 1094 1088 11 1094 15 1062 1094 1062 1063 1094 1063 1088 1094 1030 985 1095 652 1030 1095 1032 652 1095 95 96 1095 96 1089 1095 1089 1032 1095 88 1 1096 83 88 1096 1043 83 1096 1070 1044 1097 58 61 1097 61 59 1097 59 1083 1097 1083 1070 1097 97 95 1098 303 97 1098 985 303 1098 95 1095 1098 1095 985 1098 1082 1080 1099 1085 1087 1099 1087 1082 1099 22 23 1100 1073 1081 1100 1024 1073 1100 1084 1024 1100 51 52 1101 1087 1085 1101 1092 1087 1101 1044 1061 1102 1097 1044 1102 54 58 1102 58 1097 1102 1061 1057 1102 1063 1062 1103 1081 1063 1103 22 1100 1103 1100 1081 1103 1 48 1104 1096 1 1104 48 55 1104 55 1053 1104 1005 1043 1104 1043 1096 1104 1053 1005 1104 31 34 1105 1084 1100 1105 1080 1084 1106 1099 1080 1106 64 56 1107 74 64 1107 1071 74 1107 1055 1071 1107 1060 1079 1108 1079 1092 1108 1057 1060 1108 1102 1057 1108 50 54 1108 54 1102 1108 52 50 1108 1101 52 1108 1092 1101 1108 32 27 1109 1105 1100 1109 841 948 1110 1110 948 1111 17 22 1112 22 1103 1112 1062 17 1112 1103 1062 1112 34 35 1113 1105 34 1113 27 31 1114 31 1105 1114 1105 1109 1114 1109 27 1114 56 53 1115 823 796 1115 796 1055 1115 53 43 1115 43 1111 1115 948 823 1115 1111 948 1115 23 32 1116 1100 23 1116 32 1109 1116 1109 1100 1116 112 111 1117 364 350 1117 356 364 1117 350 525 1117 525 112 1117 7 1093 1118 1093 1091 1118 33 30 1119 29 28 1119 30 29 1119 1084 1105 1119 1106 1084 1119 35 33 1119 1113 35 1119 1105 1113 1119 111 718 1120 718 356 1120 356 1117 1120 1117 111 1120 1055 1107 1121 1115 1055 1121 1107 56 1121 56 1115 1121 1099 1106 1122 28 26 1122 1119 28 1122 1106 1119 1122 1091 841 1123 1110 0 1124 841 1110 1124 1123 841 1124 2 45 1125 45 46 1125 1101 1085 1125 46 51 1125 51 1101 1125 100 1 1126 1 935 1126 99 100 1126 1090 99 1126 935 958 1126 958 1090 1126 2 1125 1127 1125 1085 1127 19 2 1128 2 1127 1128 1085 1099 1128 1127 1085 1128 1099 1122 1128 1118 1091 1129 1091 1123 1129 26 19 1130 1122 26 1130 19 1128 1130 1128 1122 1130 0 5 1131 5 6 1131 6 1129 1131 1123 1124 1131 1129 1123 1131 14 0 1132 0 1110 1132 43 14 1132 1111 43 1132 1110 1111 1132 6 7 1133 7 1118 1133 1118 1129 1133 1129 6 1133 1124 0 1134 0 1131 1134 1131 1124 1134 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ref/CMYK_IDEAlliance_ControlStrip_2009.ti10000644000076500000000000000401013154615407024670 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll target" CREATED "Mon Jan 24 02:20:54 2011" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "OUTPUT" KEYWORD "COLOR_REP" COLOR_REP "CMYK" KEYWORD "TOTAL_INK_LIMIT" TOTAL_INK_LIMIT "320" NUMBER_OF_FIELDS 5 BEGIN_DATA_FORMAT SAMPLE_ID CMYK_C CMYK_M CMYK_Y CMYK_K END_DATA_FORMAT NUMBER_OF_SETS 54 BEGIN_DATA 1 100.00 0.0000 0.0000 60.000 2 100.00 100.00 0.0000 60.000 3 100.00 0.0000 0.0000 0.0000 4 100.00 100.00 0.0000 0.0000 5 70.000 0.0000 0.0000 0.0000 6 70.000 70.000 0.0000 0.0000 7 30.000 0.0000 0.0000 0.0000 8 30.000 30.000 0.0000 0.0000 9 0.0000 100.00 0.0000 60.000 10 0.0000 100.00 100.00 60.000 11 0.0000 100.00 0.0000 0.0000 12 0.0000 100.00 100.00 0.0000 13 0.0000 70.000 0.0000 0.0000 14 0.0000 70.000 70.000 0.0000 15 0.0000 30.000 0.0000 0.0000 16 0.0000 30.000 30.000 0.0000 17 0.0000 0.0000 100.00 60.000 18 100.00 0.0000 100.00 60.000 19 0.0000 0.0000 100.00 0.0000 20 100.00 0.0000 100.00 0.0000 21 0.0000 0.0000 70.000 0.0000 22 70.000 0.0000 70.000 0.0000 23 0.0000 0.0000 30.000 0.0000 24 30.000 0.0000 30.000 0.0000 25 100.00 0.0000 40.000 0.0000 26 100.00 40.000 0.0000 0.0000 27 40.000 100.00 0.0000 0.0000 28 0.0000 100.00 40.000 0.0000 29 0.0000 40.000 100.00 0.0000 30 40.000 0.0000 100.00 0.0000 31 0.0000 40.000 70.000 40.000 32 10.000 40.000 40.000 0.0000 33 0.0000 70.000 40.000 40.000 34 20.000 70.000 70.000 0.0000 35 40.000 70.000 0.0000 40.000 36 0.0000 70.000 70.000 40.000 37 40.000 0.0000 70.000 40.000 38 70.000 0.0000 40.000 40.000 39 70.000 40.000 0.0000 40.000 40 0.0000 0.0000 0.0000 0.0000 41 0.0000 0.0000 0.0000 3.0000 42 3.1000 2.2000 2.2000 0.0000 43 0.0000 0.0000 0.0000 10.000 44 10.200 7.4000 7.4000 0.0000 45 0.0000 0.0000 0.0000 25.000 46 25.000 19.000 19.000 0.0000 47 0.0000 0.0000 0.0000 50.000 48 50.000 40.000 40.000 0.0000 49 0.0000 0.0000 0.0000 75.000 50 75.000 66.000 66.000 0.0000 51 0.0000 0.0000 0.0000 90.000 52 100.00 100.00 100.00 0.0000 53 0.0000 0.0000 0.0000 100.00 54 80.000 70.000 70.000 100.00 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ref/CMYK_IDEAlliance_ISO_12647-7_Control_Wedge_2013.ti10000644000076500000000000000344513154615407026410 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll target" CREATED "Mon Jan 24 02:20:54 2011" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "OUTPUT" KEYWORD "COLOR_REP" COLOR_REP "CMYK" KEYWORD "TOTAL_INK_LIMIT" TOTAL_INK_LIMIT "400" NUMBER_OF_FIELDS 6 BEGIN_DATA_FORMAT SAMPLE_ID SAMPLE_NAME CMYK_C CMYK_M CMYK_Y CMYK_K END_DATA_FORMAT NUMBER_OF_SETS 84 BEGIN_DATA 1 A1 100 0 0 0 2 A2 100 100 0 80 3 A3 100 70 0 40 4 B1 75 0 0 0 5 B2 100 100 0 0 6 B3 100 100 0 40 7 C1 50 0 0 0 8 C2 75 75 0 0 9 C3 70 100 0 40 10 D1 25 0 0 0 11 D2 50 50 0 0 12 D3 0 100 70 40 13 E1 10 0 0 0 14 E2 25 25 0 0 15 E3 0 100 100 40 16 F1 0 100 0 0 17 F2 0 100 100 80 18 F3 0 70 100 40 19 G1 0 75 0 0 20 G2 0 100 100 0 21 G3 70 0 100 40 22 H1 0 50 0 0 23 H2 0 75 75 0 24 H3 100 0 100 40 25 I1 0 25 0 0 26 I2 0 50 50 0 27 I3 100 0 70 40 28 J1 0 10 0 0 29 J2 0 25 25 0 30 J3 70 40 0 40 31 K1 0 0 100 0 32 K2 100 0 100 80 33 K3 40 70 0 40 34 L1 0 0 75 0 35 L2 100 0 100 0 36 L3 0 70 40 40 37 M1 0 0 50 0 38 M2 75 0 75 0 39 M3 0 40 70 40 40 N1 0 0 25 0 41 N2 50 0 50 0 42 N3 40 0 70 40 43 O1 0 0 10 0 44 O2 25 0 25 0 45 O3 70 0 40 40 46 P1 100 100 100 100 47 P2 0 0 0 0 48 P3 70 40 40 0 49 Q1 0 0 0 3 50 Q2 3 2.24 2.24 0 51 Q3 70 70 40 0 52 R1 0 0 0 10 53 R2 10 7.46 7.46 0 54 R3 40 70 40 0 55 S1 0 0 0 25 56 S2 25 18.88 18.88 0 57 S3 40 70 70 0 58 T1 0 0 0 50 59 T2 50 40 40 0 60 T3 40 40 70 0 61 U1 0 0 0 75 62 U2 75 66.12 66.12 0 63 U3 20 40 70 0 64 V1 0 0 0 90 65 V2 90 85.34 85.34 0 66 V3 20 70 70 0 67 W1 0 0 0 100 68 W2 100 100 100 0 69 W3 70 40 70 0 70 X1 40 10 10 0 71 X2 10 40 10 0 72 X3 10 10 40 0 73 Y1 40 40 10 0 74 Y2 10 40 40 0 75 Y3 40 10 40 0 76 Z1 100 40 0 0 77 Z2 0 100 40 0 78 Z3 40 0 100 0 79 2A1 40 100 0 0 80 2A2 0 40 100 0 81 2A3 100 0 40 0 82 2B1 100 0 0 80 83 2B2 0 100 0 80 84 2B3 0 0 100 80 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ref/CMYK_ISO_12647-7_outer_gamut.ti10000644000076500000000000000733013154615407023426 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll target" CREATED "Mon Jan 24 02:20:54 2011" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "OUTPUT" KEYWORD "COLOR_REP" COLOR_REP "CMYK" KEYWORD "TOTAL_INK_LIMIT" TOTAL_INK_LIMIT "300" NUMBER_OF_FIELDS 5 BEGIN_DATA_FORMAT SAMPLE_ID CMYK_C CMYK_M CMYK_Y CMYK_K END_DATA_FORMAT NUMBER_OF_SETS 226 BEGIN_DATA 1 0 0 0 0 2 0 10 0 0 3 0 20 0 0 4 0 30 0 0 5 0 40 0 0 7 0 70 0 0 9 0 100 0 0 10 10 0 0 0 11 10 10 0 0 12 10 20 0 0 14 10 40 0 0 16 10 70 0 0 18 10 100 0 0 19 20 0 0 0 20 20 10 0 0 21 20 20 0 0 23 20 40 0 0 25 20 70 0 0 27 20 100 0 0 28 30 0 0 0 37 40 0 0 0 38 40 10 0 0 39 40 20 0 0 41 40 40 0 0 43 40 70 0 0 45 40 100 0 0 55 70 0 0 0 56 70 10 0 0 57 70 20 0 0 59 70 40 0 0 61 70 70 0 0 63 70 100 0 0 73 100 0 0 0 74 100 10 0 0 75 100 20 0 0 77 100 40 0 0 79 100 70 0 0 81 100 100 0 0 82 0 0 10 0 83 0 10 10 0 84 0 20 10 0 86 0 40 10 0 88 0 70 10 0 90 0 100 10 0 91 10 0 10 0 100 20 0 10 0 118 40 0 10 0 136 70 0 10 0 154 100 0 10 0 163 0 0 20 0 164 0 10 20 0 165 0 20 20 0 167 0 40 20 0 169 0 70 20 0 171 0 100 20 0 172 10 0 20 0 181 20 0 20 0 199 40 0 20 0 217 70 0 20 0 235 100 0 20 0 244 0 0 30 0 325 0 0 40 0 326 0 10 40 0 327 0 20 40 0 329 0 40 40 0 331 0 70 40 0 333 0 100 40 0 334 10 0 40 0 343 20 0 40 0 361 40 0 40 0 379 70 0 40 0 397 100 0 40 0 487 0 0 70 0 488 0 10 70 0 489 0 20 70 0 491 0 40 70 0 493 0 70 70 0 495 0 100 70 0 496 10 0 70 0 505 20 0 70 0 523 40 0 70 0 541 70 0 70 0 559 100 0 70 0 649 0 0 100 0 650 0 10 100 0 651 0 20 100 0 653 0 40 100 0 655 0 70 100 0 657 0 100 100 0 658 10 0 100 0 667 20 0 100 0 685 40 0 100 0 703 70 0 100 0 721 100 0 100 0 735 0 100 0 20 741 10 100 0 20 747 20 100 0 20 753 40 100 0 20 759 70 100 0 20 760 100 0 0 20 761 100 10 0 20 762 100 20 0 20 763 100 40 0 20 764 100 70 0 20 765 100 100 0 20 771 0 100 10 20 796 100 0 10 20 807 0 100 20 20 832 100 0 20 20 843 0 100 40 20 868 100 0 40 20 879 0 100 70 20 904 100 0 70 20 910 0 0 100 20 911 0 10 100 20 912 0 20 100 20 913 0 40 100 20 914 0 70 100 20 915 0 100 100 20 916 10 0 100 20 922 20 0 100 20 928 40 0 100 20 934 70 0 100 20 940 100 0 100 20 950 0 100 0 40 955 20 100 0 40 960 40 100 0 40 965 70 100 0 40 966 100 0 0 40 967 100 20 0 40 968 100 40 0 40 969 100 70 0 40 970 100 100 0 40 975 0 100 20 40 991 100 0 20 40 1000 0 100 40 40 1016 100 0 40 40 1025 0 100 70 40 1041 100 0 70 40 1046 0 0 100 40 1047 0 20 100 40 1048 0 40 100 40 1049 0 70 100 40 1050 0 100 100 40 1051 20 0 100 40 1056 40 0 100 40 1061 70 0 100 40 1066 100 0 100 40 1075 0 100 0 60 1080 20 100 0 60 1085 40 100 0 60 1090 70 100 0 60 1091 100 0 0 60 1092 100 20 0 60 1093 100 40 0 60 1094 100 70 0 60 1095 100 100 0 60 1100 0 100 20 60 1116 100 0 20 60 1125 0 100 40 60 1141 100 0 40 60 1150 0 100 70 60 1166 100 0 70 60 1171 0 0 100 60 1172 0 20 100 60 1173 0 40 100 60 1174 0 70 100 60 1175 0 100 100 60 1176 20 0 100 60 1181 40 0 100 60 1186 70 0 100 60 1191 100 0 100 60 1199 0 100 0 80 1203 40 100 0 80 1207 70 100 0 80 1208 100 0 0 80 1209 100 40 0 80 1210 100 70 0 80 1211 100 100 0 80 1215 0 100 40 80 1224 100 0 40 80 1231 0 100 70 80 1240 100 0 70 80 1244 0 0 100 80 1245 0 40 100 80 1246 0 70 100 80 1247 0 100 100 80 1248 40 0 100 80 1252 70 0 100 80 1256 100 0 100 80 1262 0 100 0 100 1266 100 0 0 100 1268 100 100 0 100 1278 0 0 100 100 1280 0 100 100 100 1284 100 0 100 100 1290 90 0 0 0 1292 80 0 0 0 1295 60 0 0 0 1296 50 0 0 0 1299 25 0 0 0 1301 15 0 0 0 1303 7 0 0 0 1305 3 0 0 0 1310 0 90 0 0 1312 0 80 0 0 1315 0 60 0 0 1316 0 50 0 0 1319 0 25 0 0 1321 0 15 0 0 1323 0 7 0 0 1325 0 3 0 0 1330 0 0 90 0 1332 0 0 80 0 1335 0 0 60 0 1336 0 0 50 0 1339 0 0 25 0 1341 0 0 15 0 1343 0 0 7 0 1345 0 0 3 0 1405 100 0 0 70 1406 0 100 0 70 1407 0 0 100 70 1408 100 100 0 70 1409 100 0 100 70 1410 0 100 100 70 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ref/ColorCheckerDC.cie0000644000076500000000000001073212665102037021440 0ustar devwheel00000000000000CTI3 DESCRIPTOR "ColorChecker DC" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT SAMPLE_ID XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 176 BEGIN_DATA "B02" 10.26 6.986 3.709 "B03" 8.117 7.331 4.126 "B04" 21.80 21.78 12.61 "B05" 11.83 12.81 7.411 "B06" 6.141 6.924 4.000 "B07" 5.193 7.080 4.396 "B08" 4.936 6.906 6.348 "B09" 5.837 6.785 7.608 "B10" 4.628 4.874 8.564 "B11" 7.894 6.836 5.897 "C02" 24.61 13.76 6.707 "C03" 15.18 12.79 5.962 "C04" 13.65 13.08 5.052 "C05" 18.37 21.18 8.776 "C06" 9.747 12.71 6.479 "C07" 8.169 12.73 6.727 "C08" 8.828 12.27 10.85 "C09" 6.238 7.033 10.98 "C10" 6.119 6.894 14.03 "C11" 9.411 7.279 7.021 "D02" 26.07 13.73 3.872 "D03" 17.36 13.54 4.715 "D04" 21.92 21.86 4.864 "D05" 17.34 21.23 5.530 "D06" 24.38 33.36 9.102 "D07" 6.890 12.66 7.180 "D08" 12.83 21.37 18.87 "D09" 6.341 6.794 14.21 "D10" 6.253 6.521 16.70 "D11" 10.11 7.026 8.259 "E02" 39.11 22.37 7.320 "E03" 31.19 22.52 4.339 "E04" 22.89 21.65 5.058 "E05" 18.11 21.04 4.907 "E06" 38.49 47.57 20.10 "E07" 13.05 21.66 12.82 "E08" 7.659 13.01 16.31 "E09" 8.791 12.53 22.27 "E10" 10.31 12.30 30.72 "E11" 19.76 12.69 15.86 "F02" 53.36 33.43 12.94 "F03" 17.83 12.08 4.423 "F04" 34.61 33.06 9.646 "F05" 15.60 20.69 7.243 "F06" 42.14 48.63 10.75 "F07" 11.64 21.38 9.212 "F08" 8.861 12.73 18.29 "F09" 9.610 12.52 20.25 "F10" 11.63 12.47 31.36 "F11" 23.77 13.43 10.80 "G02" 49.20 32.94 17.60 "G03" 26.90 21.38 9.193 "G04" 27.90 21.97 4.960 "G05" 15.08 21.58 5.221 "G06" 40.28 47.73 6.461 "G07" 21.49 32.72 16.43 "G08" 22.09 32.00 42.71 "G09" 15.74 20.76 28.50 "G10" 11.91 12.88 26.24 "G11" 34.93 21.85 20.32 "H02" 37.02 22.47 11.24 "H03" 38.32 31.67 14.93 "H04" 18.62 13.39 3.116 "H05" 23.37 33.23 7.524 "H06" 57.55 64.84 21.95 "H07" 25.02 32.24 12.26 "H08" 24.15 32.27 38.64 "H09" 15.16 20.67 37.65 "H10" 19.31 20.90 44.42 "H11" 32.43 21.92 20.28 "I02" 24.39 21.13 17.11 "I03" 35.36 31.84 18.02 "I04" 47.14 32.50 7.072 "I05" 91.05 94.49 79.20 "I06" 34.29 35.57 30.14 "I07" 18.27 19.01 16.26 "I08" 7.787 8.054 6.973 "I09" 27.67 32.49 43.64 "I10" 32.27 32.46 51.27 "I11" 45.48 32.98 29.70 "J02" 29.77 21.40 16.95 "J03" 38.17 32.79 12.65 "J04" 64.16 47.44 9.866 "J05" 71.04 73.85 62.34 "J08" 4.741 4.946 4.354 "J09" 27.67 31.67 51.23 "J10" 46.05 46.72 65.44 "J11" 59.09 47.07 41.39 "K02" 40.60 32.83 22.06 "K03" 40.69 33.40 10.00 "K04" 59.00 47.58 11.47 "K05" 57.35 59.59 50.86 "K08" 3.822 3.972 3.481 "K09" 23.94 31.83 52.69 "K10" 24.29 21.52 41.28 "K11" 35.96 32.14 27.46 "L02" 59.57 46.56 33.19 "L03" 64.34 47.46 23.98 "L04" 45.22 34.02 4.378 "L05" 45.18 46.96 39.73 "L06" 26.04 27.07 23.03 "L07" 12.30 12.86 11.11 "L08" 3.346 3.463 3.073 "L09" 35.41 46.33 60.75 "L10" 8.770 6.822 11.54 "L11" 69.03 63.81 54.35 "M02" 75.50 64.99 51.37 "M03" 60.08 47.32 30.52 "M04" 75.29 64.82 15.18 "M05" 84.48 89.40 15.91 "M06" 16.71 21.43 21.34 "M07" 17.73 32.42 13.34 "M08" 57.69 63.19 58.65 "M09" 36.13 47.07 52.53 "M10" 7.988 6.853 9.721 "M11" 86.41 86.83 76.05 "N02" 73.00 66.51 47.63 "N03" 55.87 46.81 32.41 "N04" 70.45 65.29 18.06 "N05" 69.08 64.89 8.128 "N06" 23.68 32.73 33.70 "N07" 18.90 33.08 19.40 "N08" 59.94 64.89 69.83 "N09" 54.80 63.99 66.01 "N10" 18.75 13.31 21.89 "N11" 46.25 32.99 36.89 "O02" 52.13 47.02 35.24 "O03" 57.32 46.99 17.92 "O04" 85.43 86.17 57.30 "O05" 50.77 47.08 5.065 "O06" 26.22 32.65 32.95 "O07" 29.84 47.26 21.83 "O08" 31.00 32.48 32.12 "O09" 55.76 63.57 54.85 "O10" 25.56 21.67 26.33 "O11" 35.68 32.37 39.64 "P02" 49.15 47.54 37.87 "P03" 79.00 65.68 26.18 "P04" 88.31 86.54 43.56 "P05" 34.88 32.71 6.072 "P06" 22.26 31.83 27.11 "P07" 34.57 46.54 30.95 "P08" 19.04 21.02 26.30 "P09" 42.08 47.53 43.25 "P10" 22.06 21.29 20.40 "P11" 49.17 48.04 51.58 "Q02" 66.40 65.12 47.44 "Q03" 75.17 65.07 35.10 "Q04" 90.88 87.40 54.80 "Q05" 36.64 32.58 6.494 "Q06" 21.01 32.53 31.70 "Q07" 48.84 64.88 44.35 "Q08" 41.52 45.77 30.25 "Q09" 44.52 46.48 19.69 "Q10" 27.54 31.51 25.28 "Q11" 10.45 12.48 10.77 "R02" 34.49 33.28 23.65 "R03" 62.99 63.02 41.41 "R04" 87.86 86.91 64.56 "R05" 47.13 47.02 9.339 "R06" 31.21 46.37 35.73 "R07" 53.79 64.17 37.91 "R08" 29.66 31.97 19.21 "R09" 44.00 47.63 14.11 "R10" 13.05 12.96 6.652 "R11" 18.95 21.81 18.60 "S02" 45.00 46.92 29.57 "S03" 72.02 75.95 47.27 "S04" 3.399 3.716 17.47 "S05" 3.604 12.41 3.262 "S06" 19.54 8.953 0.481 "S07" 98.58 102.1 84.61 "S08" 0.310 0.321 0.272 "S09" 80.47 82.68 5.113 "S10" 18.81 8.361 3.465 "S11" 7.357 12.52 27.55 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/ColorCheckerSG.cie0000644000076500000000000000465112665102037021466 0ustar devwheel00000000000000CTI3 DESCRIPTOR "ColorChecker SG" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT SAMPLE_ID XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 96 BEGIN_DATA "B2" 15.25 7.988 10.03 "B3" 38.96 31.43 39.81 "B4" 11.86 5.893 18.49 "B5" 16.19 18.20 47.74 "B6" 22.73 30.12 44.69 "B7" 1.581 2.706 3.100 "B8" 19.65 29.53 32.75 "B9" 3.648 3.700 1.914 "C2" 5.044 3.714 6.813 "C3" 16.19 12.85 29.44 "C4" 3.120 2.875 10.80 "C5" 25.26 29.54 48.77 "C6" 2.058 2.770 6.094 "C7" 29.15 30.48 51.32 "C8" 11.15 19.48 20.92 "C9" 20.41 31.10 14.85 "D2" 67.39 69.80 67.61 "D3" 76.91 71.85 59.79 "D4" 60.68 71.41 60.46 "D5" 77.16 72.99 54.02 "D6" 62.96 70.59 34.96 "D7" 41.61 33.77 10.58 "D8" 42.10 36.36 18.96 "D9" 10.37 19.81 10.51 "E2" 9.624 7.790 2.439 "E3" 42.68 32.85 2.514 "E4" 4.495 2.583 19.77 "E5" 96.06 99.63 82.28 "E6" 0.869 0.897 0.775 "E7" 62.63 56.47 29.26 "E8" 60.17 50.68 24.82 "E9" 1.930 3.290 1.876 "F2" 40.60 35.06 18.02 "F3" 10.56 8.563 30.72 "F4" 12.91 22.07 4.987 "F5" 59.21 60.94 51.06 "F6" 6.958 7.195 6.143 "F7" 38.78 35.62 15.20 "F8" 40.13 36.87 20.35 "F9" 18.97 30.02 20.00 "G2" 15.56 16.47 26.39 "G3" 29.34 17.89 7.934 "G4" 20.99 10.17 1.510 "G5" 36.28 37.41 31.43 "G6" 12.00 12.43 10.49 "G7" 17.41 15.20 4.790 "G8" 40.73 36.58 20.43 "G9" 22.84 32.64 8.391 "H2" 8.481 11.41 2.672 "H3" 5.910 3.517 9.226 "H4" 62.39 64.77 4.647 "H5" 19.60 20.23 16.88 "H6" 30.25 31.18 26.25 "H7" 44.31 40.76 22.85 "H8" 41.22 36.93 19.50 "H9" 11.53 21.65 3.931 "I2" 23.05 21.04 33.97 "I3" 35.82 46.48 6.389 "I4" 31.44 18.44 23.56 "I5" 9.051 9.361 7.840 "I6" 51.58 53.10 44.52 "I7" 20.00 15.98 3.085 "I8" 11.77 10.01 2.754 "I9" 18.48 32.69 6.698 "J2" 30.59 42.07 35.10 "J3" 49.88 45.89 3.702 "J4" 11.90 16.91 30.83 "J5" 2.118 2.203 1.975 "J6" 78.61 81.25 68.58 "J7" 42.12 35.78 15.35 "J8" 44.57 38.94 16.20 "J9" 36.83 33.97 6.548 "K2" 75.49 73.23 44.37 "K3" 71.11 81.84 61.22 "K4" 71.48 70.71 65.90 "K5" 61.59 69.33 67.58 "K6" 44.37 45.75 38.50 "K7" 15.99 16.52 13.67 "K8" 3.180 3.279 2.775 "K9" 28.06 34.30 5.489 "L2" 6.687 3.870 2.198 "L3" 28.50 14.72 1.722 "L4" 41.88 31.49 24.17 "L5" 43.07 32.73 17.78 "L6" 50.17 34.55 2.064 "L7" 43.03 50.84 2.747 "L8" 33.10 34.49 5.219 "L9" 36.57 49.48 5.064 "M2" 26.03 13.72 8.384 "M3" 5.377 3.204 3.942 "M4" 24.74 12.37 2.737 "M5" 40.95 23.05 3.947 "M6" 73.66 67.15 5.790 "M7" 66.53 68.33 4.188 "M8" 38.83 47.72 3.714 "M9" 4.153 3.339 0.995 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/DCDM X'Y'Z'.icm0000644000076500000000000000117013125210434020232 0ustar devwheel00000000000000x@mntrRGB XYZ 3acsp-K/:ގ+4+ desc fcprt5wtptchrm$rXYZrTRC gXYZgTRC bXYZ0bTRC lumiDbkptXtechl desc DCDM X'Y'Z'textPublic Domain. No Warranty, Use at own risk.XYZ chrmXYZ ocurvXYZ rXYZ wѡXYZ 4^4^4^XYZ sig dcpjDisplayCAL-3.5.0.0/DisplayCAL/ref/ISO_12646-2008_color_accuracy_and_gray_balance.ti10000644000076500000000000002076712665102037027000 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Mon May 18 22:11:12 2015" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "21" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "5" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 141 BEGIN_DATA 1 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 2 5.0000 5.0000 5.0000 1.3704 1.3897 1.4245 3 10.000 10.000 10.000 1.9432 1.9923 2.0809 4 15.000 15.000 15.000 2.8451 2.9411 3.1145 5 20.000 20.000 20.000 4.1154 4.2774 4.5701 6 25.000 25.000 25.000 5.7878 6.0367 6.4867 7 30.000 30.000 30.000 7.8923 8.2507 8.8984 8 35.000 35.000 35.000 10.456 10.948 11.836 9 40.000 40.000 40.000 13.504 14.154 15.329 10 45.000 45.000 45.000 17.059 17.894 19.403 11 50.000 50.000 50.000 21.143 22.190 24.083 12 55.000 55.000 55.000 25.776 27.064 29.392 13 60.000 60.000 60.000 30.977 32.536 35.353 14 65.000 65.000 65.000 36.766 38.626 41.987 15 70.000 70.000 70.000 43.159 45.351 49.313 16 75.000 75.000 75.000 50.173 52.730 57.351 17 80.000 80.000 80.000 57.824 60.779 66.119 18 85.000 85.000 85.000 66.128 69.515 75.636 19 90.000 90.000 90.000 75.101 78.954 85.918 20 95.000 95.000 95.000 84.755 89.111 96.982 21 100.00 100.00 100.00 95.106 100.00 108.84 22 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 23 0.0000 0.0000 50.000 4.8251 2.5298 21.148 24 0.0000 0.0000 75.000 10.338 4.7346 50.184 25 0.0000 0.0000 100.00 18.871 8.1473 95.129 26 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 27 0.0000 25.000 25.000 3.7105 4.9657 6.3893 28 0.0000 25.000 50.000 6.6264 6.1319 21.748 29 0.0000 25.000 75.000 12.139 8.3367 50.785 30 0.0000 25.000 100.00 20.672 11.749 95.729 31 0.0000 50.000 0.0000 8.5782 16.154 3.5261 32 0.0000 50.000 25.000 9.4874 16.518 8.3150 33 0.0000 50.000 50.000 12.403 17.684 23.674 34 0.0000 50.000 75.000 17.916 19.889 52.711 35 0.0000 50.000 100.00 26.449 23.302 97.655 36 0.0000 75.000 0.0000 19.500 37.995 7.1667 37 0.0000 75.000 25.000 20.409 38.358 11.956 38 0.0000 75.000 50.000 23.325 39.525 27.314 39 0.0000 75.000 75.000 28.838 41.729 56.351 40 0.0000 75.000 100.00 37.371 45.142 101.30 41 0.0000 100.00 0.0000 36.405 71.800 12.802 42 0.0000 100.00 25.000 37.314 72.164 17.591 43 0.0000 100.00 50.000 40.230 73.330 32.949 44 0.0000 100.00 75.000 45.743 75.535 61.986 45 0.0000 100.00 100.00 54.276 78.948 106.93 46 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 47 25.000 0.0000 25.000 3.9865 2.4347 5.8863 48 25.000 0.0000 50.000 6.9024 3.6009 21.245 49 25.000 0.0000 75.000 12.415 5.8057 50.282 50 25.000 0.0000 100.00 20.948 9.2184 95.226 51 25.000 25.000 0.0000 4.8786 5.6731 1.6978 52 25.000 25.000 50.000 8.7037 7.2029 21.845 53 25.000 25.000 75.000 14.217 9.4077 50.882 54 25.000 25.000 100.00 22.750 12.820 95.827 55 25.000 50.000 0.0000 10.655 17.225 3.6234 56 25.000 50.000 25.000 11.565 17.589 8.4123 57 25.000 50.000 50.000 14.481 18.755 23.771 58 25.000 50.000 75.000 19.994 20.960 52.808 59 25.000 50.000 100.00 28.527 24.373 97.752 60 25.000 75.000 0.0000 21.577 39.066 7.2641 61 25.000 75.000 25.000 22.486 39.429 12.053 62 25.000 75.000 50.000 25.402 40.596 27.412 63 25.000 75.000 75.000 30.915 42.800 56.449 64 25.000 75.000 100.00 39.448 46.213 101.39 65 25.000 100.00 0.0000 38.483 72.872 12.899 66 25.000 100.00 25.000 39.392 73.235 17.688 67 25.000 100.00 50.000 42.308 74.401 33.047 68 25.000 100.00 75.000 47.821 76.606 62.084 69 25.000 100.00 100.00 56.354 80.019 107.03 70 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 71 50.000 0.0000 25.000 10.649 5.8697 6.1984 72 50.000 0.0000 50.000 13.565 7.0358 21.557 73 50.000 0.0000 75.000 19.077 9.2407 50.594 74 50.000 0.0000 100.00 27.610 12.653 95.538 75 50.000 25.000 0.0000 11.541 9.1081 2.0099 76 50.000 25.000 25.000 12.450 9.4717 6.7988 77 50.000 25.000 50.000 15.366 10.638 22.157 78 50.000 25.000 75.000 20.879 12.843 51.194 79 50.000 25.000 100.00 29.412 16.255 96.139 80 50.000 50.000 0.0000 17.317 20.660 3.9356 81 50.000 50.000 25.000 18.227 21.024 8.7245 82 50.000 50.000 75.000 26.655 24.395 53.120 83 50.000 50.000 100.00 35.189 27.808 98.064 84 50.000 75.000 0.0000 28.239 42.501 7.5762 85 50.000 75.000 25.000 29.148 42.864 12.365 86 50.000 75.000 50.000 32.065 44.031 27.724 87 50.000 75.000 75.000 37.577 46.236 56.761 88 50.000 75.000 100.00 46.110 49.648 101.70 89 50.000 100.00 0.0000 45.145 76.306 13.211 90 50.000 100.00 25.000 46.054 76.670 18.000 91 50.000 100.00 50.000 48.970 77.836 33.359 92 50.000 100.00 75.000 54.483 80.041 62.396 93 50.000 100.00 100.00 63.016 83.454 107.34 94 75.000 0.0000 0.0000 22.335 12.000 1.9997 95 75.000 0.0000 25.000 23.244 12.364 6.7886 96 75.000 0.0000 50.000 26.160 13.530 22.147 97 75.000 0.0000 75.000 31.673 15.735 51.184 98 75.000 0.0000 100.00 40.206 19.148 96.129 99 75.000 25.000 0.0000 24.136 15.602 2.6001 100 75.000 25.000 25.000 25.045 15.966 7.3891 101 75.000 25.000 50.000 27.961 17.132 22.748 102 75.000 25.000 75.000 33.474 19.337 51.785 103 75.000 25.000 100.00 42.007 22.750 96.729 104 75.000 50.000 0.0000 29.913 27.154 4.5258 105 75.000 50.000 25.000 30.822 27.518 9.3147 106 75.000 50.000 50.000 33.738 28.684 24.673 107 75.000 50.000 75.000 39.251 30.889 53.710 108 75.000 50.000 100.00 47.784 34.302 98.655 109 75.000 75.000 0.0000 40.835 48.995 8.1664 110 75.000 75.000 25.000 41.744 49.359 12.955 111 75.000 75.000 50.000 44.660 50.525 28.314 112 75.000 75.000 100.00 58.706 56.142 102.30 113 75.000 100.00 0.0000 57.740 82.801 13.802 114 75.000 100.00 25.000 58.649 83.164 18.590 115 75.000 100.00 50.000 61.565 84.331 33.949 116 75.000 100.00 75.000 67.078 86.535 62.986 117 75.000 100.00 100.00 75.611 89.948 107.93 118 100.00 0.0000 0.0000 41.830 22.052 2.9132 119 100.00 0.0000 25.000 42.739 22.416 7.7021 120 100.00 0.0000 50.000 45.655 23.582 23.061 121 100.00 0.0000 75.000 51.168 25.787 52.098 122 100.00 0.0000 100.00 59.701 29.200 97.042 123 100.00 25.000 0.0000 43.631 25.654 3.5137 124 100.00 25.000 25.000 44.541 26.018 8.3026 125 100.00 25.000 50.000 47.457 27.184 23.661 126 100.00 25.000 75.000 52.969 29.389 52.698 127 100.00 25.000 100.00 61.503 32.801 97.643 128 100.00 50.000 0.0000 49.408 37.206 5.4393 129 100.00 50.000 25.000 50.318 37.570 10.228 130 100.00 50.000 50.000 53.233 38.736 25.587 131 100.00 50.000 75.000 58.746 40.941 54.624 132 100.00 50.000 100.00 67.279 44.354 99.568 133 100.00 75.000 0.0000 60.330 59.047 9.0799 134 100.00 75.000 25.000 61.239 59.411 13.869 135 100.00 75.000 50.000 64.155 60.577 29.227 136 100.00 75.000 75.000 69.668 62.782 58.264 137 100.00 75.000 100.00 78.201 66.194 103.21 138 100.00 100.00 0.0000 77.235 92.853 14.715 139 100.00 100.00 25.000 78.145 93.216 19.504 140 100.00 100.00 50.000 81.061 94.382 34.862 141 100.00 100.00 75.000 86.573 96.587 63.900 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "May 18, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 47.3607 100.000 25.6130 21.6292 97.3763 2 100.000 0.00000 79.3514 52.4258 26.2898 58.7215 3 0.00000 0.00000 58.9971 6.48583 3.19399 29.8944 4 100.000 66.6593 0.00000 56.0588 50.5054 7.65614 5 0.00000 35.6011 0.00000 4.68562 8.37021 2.22855 6 84.4444 0.00000 0.00000 28.8428 15.3558 2.30466 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "May 18, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 100.000 100.000 54.2763 78.9478 106.931 2 100.000 0.00000 100.000 59.7013 29.1995 97.0422 3 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 4 100.000 100.000 0.00000 77.2354 92.8527 14.7151 5 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 6 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/ISO_14861_color_accuracy_RGB318.ti10000644000076500000000000003456113154615407024030 0ustar devwheel00000000000000CTI1 KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 318 BEGIN_DATA 1 100.00 0.0000 0.0000 41.830 22.052 2.9132 2 0.0000 100.00 0.0000 36.405 71.801 12.802 3 0.0000 0.0000 100.00 18.871 8.1473 95.129 4 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 100.00 100.00 100.00 95.106 100.00 108.84 7 100.00 100.00 100.00 95.106 100.00 108.84 8 6.6667 6.6667 6.6667 1.5275 1.5549 1.6045 9 20.000 20.000 20.000 4.1154 4.2774 4.5702 10 49.804 49.804 49.804 20.972 22.011 23.888 11 80.000 80.000 80.000 57.824 60.779 66.119 12 89.412 89.412 89.412 74.010 77.806 84.668 13 100.00 100.00 100.00 95.106 100.00 108.84 14 100.00 0.0000 0.0000 41.830 22.052 2.9132 15 0.0000 100.00 0.0000 36.405 71.801 12.802 16 0.0000 0.0000 100.00 18.871 8.1473 95.129 17 0.0000 100.00 100.00 54.276 78.948 106.93 18 100.00 0.0000 100.00 59.701 29.199 97.042 19 100.00 100.00 0.0000 77.235 92.853 14.715 20 49.804 0.0000 0.0000 9.6654 5.4679 1.4060 21 0.0000 49.804 0.0000 8.5141 16.026 3.5047 22 0.0000 0.0000 49.804 4.7928 2.5169 20.977 23 86.667 0.0000 0.0000 30.522 16.222 2.3834 24 0.0000 0.0000 73.333 9.8807 4.5517 47.776 25 0.0000 86.667 0.0000 26.600 52.193 9.5334 26 0.0000 0.0000 86.667 13.922 6.1679 69.060 27 0.0000 49.804 49.804 12.307 17.543 23.482 28 0.0000 49.804 100.00 26.385 23.173 97.634 29 13.333 0.0000 0.0000 1.6531 1.3368 1.0306 30 0.0000 100.00 49.804 40.198 73.317 32.779 31 0.0000 73.333 0.0000 18.594 36.183 6.8647 32 0.0000 13.333 0.0000 1.5664 2.1325 1.1888 33 49.804 0.0000 49.804 13.458 6.9848 21.383 34 49.804 0.0000 100.00 27.537 12.615 95.535 35 49.804 49.804 0.0000 17.179 20.494 3.9108 36 73.333 0.0000 0.0000 21.290 11.462 1.9507 37 49.804 49.804 100.00 35.051 27.641 98.040 38 49.804 100.00 0.0000 45.071 76.268 13.208 39 49.804 100.00 49.804 48.863 77.785 33.185 40 49.804 100.00 100.00 62.942 83.416 107.34 41 26.667 0.0000 0.0000 3.3602 2.2169 1.1106 42 100.00 0.0000 49.804 45.623 23.569 22.890 43 0.0000 60.000 0.0000 12.278 23.553 4.7594 44 100.00 49.804 0.0000 49.344 37.078 5.4179 45 100.00 49.804 49.804 53.137 38.595 25.395 46 100.00 49.804 100.00 67.215 44.226 99.547 47 0.0000 26.667 0.0000 3.0466 5.0927 1.6822 48 100.00 100.00 49.804 81.028 94.370 34.692 49 60.000 0.0000 0.0000 14.006 7.7061 1.6095 50 0.0000 0.0000 13.333 1.2859 1.1143 2.5057 51 0.0000 0.0000 26.667 2.0330 1.4132 6.4412 52 0.0000 0.0000 60.000 6.6928 3.2768 30.984 53 13.333 6.6667 13.333 2.1375 1.8480 2.6025 54 20.000 13.333 20.000 3.5096 3.0661 4.3682 55 26.667 20.000 26.667 5.5653 4.9739 6.9425 56 0.0000 0.0000 33.333 2.6234 1.6493 9.5508 57 0.0000 0.0000 66.667 8.1838 3.8731 38.838 58 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 59 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 60 100.00 100.00 100.00 95.106 100.00 108.84 61 100.00 100.00 100.00 95.106 100.00 108.84 62 73.333 66.667 73.333 44.403 43.473 53.471 63 0.0000 33.333 0.0000 4.2163 7.4316 2.0721 64 0.0000 33.333 33.333 5.8397 8.0809 10.623 65 0.0000 33.333 66.667 11.400 10.305 39.910 66 0.0000 33.333 100.00 22.087 14.579 96.201 67 0.0000 66.667 0.0000 15.232 29.460 5.7441 68 0.0000 66.667 33.333 16.856 30.110 14.295 69 0.0000 66.667 66.667 22.416 32.333 43.582 70 0.0000 66.667 100.00 33.103 36.608 99.873 71 80.000 73.333 80.000 54.039 53.211 64.858 72 0.0000 100.00 33.333 38.029 72.450 21.353 73 0.0000 100.00 66.667 43.589 74.674 50.640 74 66.667 60.000 66.667 35.875 34.889 43.366 75 33.333 0.0000 0.0000 4.7091 2.9124 1.1738 76 33.333 0.0000 33.333 6.3325 3.5617 9.7246 77 33.333 0.0000 66.667 11.893 5.7855 39.012 78 33.333 0.0000 100.00 22.580 10.060 95.303 79 33.333 33.333 0.0000 7.9254 9.3441 2.2459 80 33.333 33.333 33.333 9.5488 9.9933 10.797 81 33.333 33.333 66.667 15.109 12.217 40.084 82 33.333 33.333 100.00 25.796 16.491 96.375 83 33.333 66.667 0.0000 18.941 31.373 5.9179 84 33.333 66.667 33.333 20.565 32.022 14.469 85 33.333 66.667 66.667 26.125 34.246 43.756 86 33.333 66.667 100.00 36.812 38.520 100.05 87 33.333 100.00 0.0000 40.114 73.713 12.976 88 33.333 100.00 33.333 41.738 74.362 21.526 89 33.333 100.00 66.667 47.298 76.586 50.813 90 33.333 100.00 100.00 57.985 80.860 107.10 91 66.667 0.0000 0.0000 17.413 9.4625 1.7691 92 66.667 0.0000 33.333 19.036 10.112 10.320 93 66.667 0.0000 66.667 24.597 12.336 39.607 94 66.667 0.0000 100.00 35.284 16.610 95.898 95 66.667 33.333 0.0000 20.629 15.894 2.8412 96 66.667 33.333 33.333 22.253 16.543 11.392 97 66.667 33.333 66.667 27.813 18.767 40.679 98 66.667 33.333 100.00 38.500 23.041 96.970 99 66.667 66.667 0.0000 31.645 37.923 6.5132 100 66.667 66.667 33.333 33.268 38.572 15.064 101 66.667 66.667 66.667 38.829 40.796 44.351 102 66.667 66.667 100.00 49.516 45.070 100.64 103 66.667 100.00 0.0000 52.818 80.263 13.571 104 66.667 100.00 33.333 54.441 80.912 22.122 105 66.667 100.00 66.667 60.002 83.136 51.409 106 66.667 100.00 100.00 70.689 87.410 107.70 107 86.667 80.000 86.667 64.823 64.141 77.570 108 100.00 0.0000 33.333 43.454 22.701 11.464 109 100.00 0.0000 66.667 49.014 24.925 40.751 110 60.000 53.333 60.000 28.416 27.414 34.500 111 100.00 33.333 0.0000 45.046 28.484 3.9853 112 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 113 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 114 100.00 100.00 100.00 95.106 100.00 108.84 115 100.00 100.00 100.00 95.106 100.00 108.84 116 100.00 33.333 33.333 46.670 29.133 12.536 117 100.00 33.333 66.667 52.230 31.357 41.823 118 100.00 33.333 100.00 62.918 35.631 98.114 119 100.00 66.667 0.0000 56.062 50.512 7.6573 120 100.00 66.667 33.333 57.686 51.162 16.208 121 100.00 66.667 66.667 63.246 53.385 45.495 122 100.00 66.667 100.00 73.933 57.660 101.79 123 53.333 46.667 53.333 21.984 21.004 26.823 124 100.00 100.00 33.333 78.859 93.502 23.266 125 100.00 100.00 66.667 84.419 95.726 52.553 126 6.6667 6.6667 0.0000 1.4273 1.5149 1.0769 127 3.1373 3.1373 3.1373 1.2285 1.2404 1.2619 128 86.667 100.00 100.00 83.799 94.170 108.31 129 13.333 13.333 13.333 2.5054 2.5836 2.7251 130 100.00 100.00 86.667 90.157 98.021 82.775 131 24.706 24.706 24.706 5.6777 5.9210 6.3606 132 26.667 26.667 26.667 6.4399 6.7227 7.2340 133 69.804 100.00 100.00 72.454 88.320 107.78 134 40.000 40.000 40.000 13.504 14.154 15.329 135 46.667 46.667 46.667 18.360 19.263 20.895 136 100.00 86.667 100.00 85.301 80.392 105.58 137 53.333 53.333 53.333 24.169 25.374 27.551 138 60.000 60.000 60.000 30.977 32.536 35.353 139 100.00 69.804 100.00 75.464 60.720 102.30 140 73.333 73.333 73.333 47.765 50.196 54.591 141 100.00 93.333 100.00 89.972 89.733 107.13 142 86.667 86.667 86.667 69.044 72.582 78.977 143 93.333 93.333 93.333 81.460 85.644 93.206 144 93.333 86.667 93.333 76.789 76.303 91.649 145 98.039 62.745 27.451 53.573 46.452 12.743 146 4.7059 9.8039 82.353 13.012 6.3720 61.786 147 69.412 31.765 94.902 37.733 22.428 86.392 148 3.5294 43.922 38.039 8.9845 13.384 14.169 149 76.471 79.608 18.823 44.954 54.982 11.874 150 49.020 44.706 64.706 22.055 19.920 38.795 151 70.980 75.294 27.451 39.624 48.485 13.870 152 67.843 65.490 16.078 32.140 37.315 8.4473 153 11.765 49.804 96.078 25.362 22.826 89.479 154 34.118 58.431 22.353 16.263 24.578 8.5806 155 75.294 25.490 50.588 28.317 17.409 23.296 156 69.804 89.020 96.078 62.692 71.284 96.866 157 54.902 13.726 14.902 12.649 7.8494 3.5245 158 25.882 83.922 25.490 27.977 50.134 14.016 159 81.569 24.314 92.941 43.594 23.742 82.491 160 34.902 19.608 25.098 7.1244 5.7278 6.3935 161 61.569 47.451 35.294 23.363 22.366 13.526 162 83.137 58.431 54.902 43.209 38.013 30.492 163 91.765 28.628 75.686 46.484 26.850 53.557 164 75.294 38.039 56.863 31.815 22.584 30.072 165 7.4510 5.4902 52.941 5.7512 3.1797 23.870 166 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 167 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 168 100.00 100.00 100.00 95.106 100.00 108.84 169 100.00 100.00 100.00 95.106 100.00 108.84 170 78.039 93.333 12.941 54.862 73.666 13.615 171 56.863 47.059 1.1765 19.227 20.265 3.8441 172 33.725 16.078 79.608 16.257 8.7974 57.654 173 30.980 52.941 16.471 13.184 19.965 6.1884 174 60.392 26.274 65.490 23.087 14.539 38.655 175 69.020 74.902 45.098 40.236 48.252 24.117 176 8.2353 22.745 91.373 17.366 9.9775 78.214 177 15.294 82.745 53.725 29.362 49.335 32.274 178 99.608 7.8431 44.314 44.666 23.540 18.522 179 10.588 96.078 0.3922 33.781 65.881 11.826 180 77.647 81.569 87.059 59.443 62.767 78.282 181 8.6275 40.000 25.882 7.0054 10.965 7.7116 182 80.000 43.137 90.980 45.596 30.519 79.953 183 18.039 26.274 14.510 4.4334 5.6813 3.4561 184 13.726 87.059 58.039 32.841 55.187 37.528 185 54.902 14.510 85.490 24.892 12.842 67.714 186 62.353 34.902 51.373 22.749 16.994 24.206 187 40.000 7.4510 23.922 7.4896 4.5918 5.7236 188 12.157 18.431 23.922 3.3998 3.6346 5.7542 189 41.569 5.0980 90.196 21.169 9.9748 75.807 190 94.510 49.020 49.020 47.841 35.503 24.407 191 33.725 90.196 36.863 34.816 59.783 21.053 192 10.980 78.039 38.824 23.925 42.572 19.507 193 24.314 40.392 9.8039 7.9427 11.687 3.6079 194 13.333 94.118 95.686 48.671 69.496 96.469 195 57.647 5.8824 23.529 13.890 7.8036 5.8679 196 35.294 81.961 1.5686 27.770 48.303 8.8347 197 4.3137 16.863 65.098 8.8067 5.5063 37.185 198 73.333 64.706 45.098 37.675 39.326 22.529 199 54.510 29.804 74.510 23.303 15.232 50.816 200 18.823 68.627 18.431 17.893 32.177 8.7916 201 36.863 62.745 78.039 28.223 32.327 59.122 202 8.2353 92.941 77.647 41.382 65.153 64.165 203 48.627 43.529 44.706 17.865 17.700 19.101 204 30.588 50.980 50.980 16.003 20.004 24.792 205 81.569 79.608 64.314 54.532 59.214 44.199 206 38.039 81.177 53.333 32.372 49.453 31.767 207 34.902 93.725 87.451 48.826 69.489 80.837 208 54.902 62.353 58.824 29.433 33.248 34.302 209 20.784 30.196 47.059 8.4377 8.3463 19.623 210 23.137 84.314 19.608 27.415 50.261 12.106 211 22.745 17.255 22.745 4.3755 3.9764 5.3609 212 43.529 30.980 92.157 25.105 15.820 80.426 213 43.137 18.431 90.588 22.654 12.007 76.853 214 98.039 43.922 10.980 45.977 32.680 5.8343 215 25.882 40.784 59.608 13.737 14.192 32.293 216 26.274 60.392 70.980 22.991 28.363 48.416 217 22.353 11.765 29.804 4.4218 3.2971 8.0344 218 31.765 42.353 50.980 13.658 14.945 23.939 219 8.6275 26.274 80.000 14.106 9.4586 58.515 220 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 221 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 222 100.00 100.00 100.00 95.106 100.00 108.84 223 100.00 100.00 100.00 95.106 100.00 108.84 224 2.7451 92.941 72.941 39.846 64.513 57.218 225 49.020 58.039 23.922 20.692 26.618 9.2799 226 45.882 96.471 54.510 45.506 71.839 36.519 227 52.157 23.137 49.020 15.790 10.500 21.269 228 62.353 67.843 39.608 32.277 38.815 18.845 229 36.863 98.823 3.9216 40.089 72.299 12.988 230 88.627 91.373 79.608 71.575 78.971 68.286 231 9.8039 26.274 33.725 5.0472 5.8437 10.441 232 67.843 13.726 72.157 27.223 14.413 47.116 233 10.588 65.490 49.412 18.858 30.081 25.220 234 78.039 71.373 90.196 55.022 51.798 82.097 235 89.020 33.333 69.804 43.536 26.785 45.448 236 19.608 3.1373 74.510 11.590 5.5237 49.558 237 49.804 47.843 90.588 30.837 24.958 78.922 238 61.176 61.961 85.882 39.339 37.270 72.350 239 80.392 57.647 18.431 36.765 34.713 8.2872 240 23.922 88.627 2.7451 29.870 55.843 10.265 241 49.020 16.863 98.039 27.313 13.860 91.662 242 71.373 49.804 47.059 30.970 27.216 22.079 243 5.8824 68.235 4.3137 16.241 31.092 6.3195 244 7.0588 52.157 9.8039 9.7250 17.803 4.6947 245 81.961 81.569 72.157 57.931 62.507 54.782 246 14.902 65.882 51.765 19.779 30.781 27.378 247 97.255 64.706 80.000 63.439 51.717 64.074 248 45.490 43.137 82.353 25.169 20.323 63.839 249 8.2353 13.333 17.255 2.3227 2.4704 3.5739 250 39.216 83.137 80.392 40.423 54.660 66.479 251 5.8824 40.000 52.549 10.160 12.212 25.017 252 41.569 65.490 62.745 26.849 33.906 38.926 253 29.020 43.137 1.5686 9.3383 13.490 3.0855 254 98.431 16.863 10.588 41.439 23.097 4.1624 255 37.255 20.000 49.020 10.509 7.2187 20.913 256 34.118 95.294 92.157 51.471 72.401 89.959 257 5.0980 73.725 27.059 20.033 37.115 12.544 258 42.353 54.902 94.118 31.980 28.952 86.403 259 41.961 98.431 30.196 42.484 72.926 19.652 260 70.196 66.667 53.725 38.108 40.738 30.154 261 69.804 66.667 17.647 33.879 39.020 9.0659 262 12.941 100.00 17.255 37.476 72.301 15.202 263 3.1373 56.078 88.235 24.280 25.880 75.120 264 67.059 19.216 36.863 20.715 12.548 12.678 265 45.882 98.039 15.686 42.489 72.580 14.620 266 85.490 64.314 37.647 44.860 42.880 17.733 267 19.216 42.745 48.235 11.208 13.889 21.508 268 46.667 40.000 46.667 16.533 15.609 20.285 269 40.000 33.333 40.000 12.016 11.178 14.833 270 33.333 26.667 33.333 8.3791 7.6543 10.407 271 93.333 93.333 86.667 79.102 84.701 80.787 272 86.667 86.667 80.000 66.913 71.730 67.754 273 80.000 80.000 73.333 55.914 60.015 56.057 274 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 275 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 276 100.00 100.00 100.00 95.106 100.00 108.84 277 100.00 100.00 100.00 95.106 100.00 108.84 278 73.333 73.333 66.667 46.068 49.518 45.653 279 100.00 100.00 69.804 85.192 96.035 56.621 280 66.667 66.667 60.000 37.338 40.199 36.498 281 60.000 60.000 53.333 29.684 32.019 28.544 282 53.333 53.333 46.667 23.066 24.933 21.741 283 46.667 46.667 40.000 17.438 18.894 16.037 284 100.00 100.00 93.333 92.515 98.964 95.195 285 40.000 40.000 33.333 12.753 13.854 11.373 286 33.333 33.333 26.667 8.9584 9.7572 7.6871 287 26.667 26.667 20.000 5.9984 6.5462 4.9089 288 20.000 20.000 13.333 3.8096 4.1551 2.9597 289 13.333 13.333 6.6667 2.3197 2.5094 1.7470 290 100.00 93.333 93.333 87.381 88.697 93.483 291 93.333 100.00 93.333 86.594 95.911 94.917 292 93.333 93.333 100.00 84.052 86.681 106.86 293 0.0000 6.6667 6.6667 1.2986 1.4369 1.5938 294 6.6667 13.333 13.333 2.0811 2.3649 2.7052 295 13.333 20.000 20.000 3.4168 3.9172 4.5374 296 20.000 26.667 26.667 5.4313 6.2027 7.1867 297 26.667 33.333 33.333 8.1999 9.2978 10.734 298 33.333 40.000 40.000 11.788 13.269 15.249 299 40.000 46.667 46.667 16.253 18.177 20.796 300 46.667 53.333 53.333 21.649 24.074 27.433 301 53.333 60.000 60.000 28.023 31.013 35.215 302 60.000 66.667 66.667 35.422 39.039 44.191 303 66.667 73.333 73.333 43.888 48.197 54.410 304 73.333 80.000 80.000 53.460 58.529 65.915 305 80.000 86.667 86.667 64.176 70.072 78.749 306 86.667 93.333 93.333 76.073 82.867 92.953 307 93.333 100.00 100.00 89.186 96.947 108.57 308 100.00 86.667 86.667 80.352 78.413 79.507 309 86.667 100.00 86.667 78.849 92.190 82.246 310 86.667 86.667 100.00 73.993 74.562 105.05 311 6.6667 0.0000 6.6667 1.3290 1.1581 1.5384 312 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 313 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 314 100.00 100.00 100.00 95.106 100.00 108.84 315 100.00 100.00 100.00 95.106 100.00 108.84 316 100.00 0.0000 0.0000 41.830 22.052 2.9132 317 0.0000 100.00 0.0000 36.405 71.801 12.802 318 0.0000 0.0000 100.00 18.871 8.1473 95.129 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ref/Rec2020_2084.icm0000644000076500000000000000563413220336703020372 0ustar devwheel00000000000000 argl mntrRGB XYZ 1/acspMSFTITUR2020-argldesc,jcprtgdmndzdmdd|xtech wtptbkptrXYZ(gXYZ<bXYZPrTRCd gTRCd bTRCd arts p,descBT.2020 ST 2084textCreated by Graeme W. Gill. Released into the public domain. No Warranty, Use at your own risk.desc ITU-R http://www.itu.int/ITU-R/ ITU-R http://www.itu.int/ITU-R/descITU-R BT.2020 UHDTV - Rev2020ITU-R BT.2020 UHDTV - Rev2020sig CRT XYZ QXYZ XYZ jGoXYZ *iXYZ  curv  !!!""##$$%%&&''(()**++,,-..//011233455677899:;<<=>??@ABCDDEFGHIJJKLMNOPQRSTUVWXYZ[\^_`abcdfghijlmnoqrsuvwyz|}~   #&),0369<@CFJMQTW[_bfimquy| !',27=BHNTZ_elrx~%-4<DLU]emv~%/9DNXcnx %2>KXdq~%3BQ`o 0BSdv-ATh| ! 6 L b x  / G _ x  ( B \ w  7 T q  # A `  @a .Qu+Qw9a.X0\@o._'Z+a<sX E;y9zA R%m H !)!v!""_""#O##$E$$%B%%&F&&'Q'((c())})*=*++d+,-,,-a-.3./ /v/0Q01112223s34b45U56L67H78H89N9:X:;g;">?B?@h@AB,BC_CDE8EFzGGHhIIJdKKLoM MNO>OPQkR(RSTjU.UVWXQYYZ[\g]?^^_`abtcZdAe+fgghijklmnopqrsuvw'x>yWzt{|}*W'b&mV[~Q2 )D׭nJ𵛷Jo/ÈY.βОҐԆց؀څ܏ޞ 6dTCsf32%D3֯? e xDisplayCAL-3.5.0.0/DisplayCAL/ref/Rec2020_HLG1000_cLUT.icm0000644000076500000000000026763413220336703021611 0ustar devwheel00000000000000o@mntrRGB XYZ  +4acsp-ə4qn~jdescDcprtDwtpt,chrm@$rXYZdrTRCx gXYZ gTRCx bXYZ bTRCx A2B0 lA2B1 lB2A1ZB2A0ZlumiotbkptodescBT.2020 HLG 1000 cd/m2BT.2020 HLG 1000 cd/mtextNo copyright. Created with DisplayCAL 3.4.0.0 and ArgyllCMSXYZ Tchrm@J+! XYZ kGocurv  !"#$&'()*,-./1235689:<=?ABDEGIJLNPQSUWY[\^`bdfhkmoqsuxz|~ !%)-148<@DHLPUY]aejnrw{ "'-28=CINTZ`ekqw}#)07>ELSZahpw~&.6>FNW_gox &/9BKT^gpz )3>HR\fq{&1=HS^it ".:FR^jv  $ 1 > J W d q ~    * 8 E S a n |   $ 3 A O ^ l {   , ; J Y h w   " 2 B R b r  ,>Oas,?Sfz/DYn2H_u1Iay(B\u0Kg,If7Vt1Rr9[}+Nr(Mr 0W~Em<f=iHu . ] !!L!}!!""D"v""##C#w##$$K$$$%$%[%%&&;&t&&'!'\''( (I((()=){))*7*v**+8+y++,?,,- -M--..b../7//00Y00181122g233P334=445/556&6y67"7w78"8y89(99:2::;B;;2>>?V?@@@AIABB}BCMCD DDEbEFTkٱ@fAsNŠJǎh̵UШV԰ k/ەgC( 8Z ]XYZ *gXYZ  mft2 %0<JYk~<_3eDL.)>n G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉn G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉn G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉ]+A  ?F!4jF#!J2wF_1=~ 2-{,n , 3@.A {0$bL1n@Rg [ ,*= I&- yBz]?`Sjz:&.[n/ "Lh S.!A/r 9 &DaYn ?qe^w. L_iv    j 2" .1\ ' F * , 1 9K D S@ ep z 5 S c   y ' $ 3q8I@A GO:[;]k~ \@ 8CD;T, & 6~>M^*w! Ft2Jf8 x ;K+ 1j z Q)I9Q#### #M (#E X#t # $z )$7 $m } N$ C%& % #&,I['=])V 56] 58{ 5> 75If X5X4 5k= 5 5;5 5 6 6r6F7"W8v/K9B?;\OOP PP P4TPMPj P oBP P'QMQ1Rz&ReSt4 TG#Vc M 0Fa$,0@XS|$ f<& ,Y:  &X$5 L%g/B<L+e[B &*N& 7l:5*+ -/$1j27D?1[HxTwbOtn q QDBkH'B X:#h&i,l97q|FwZXt-~ /< oy' ;= ?FCRcy(%!WCo b uM Ab( <`WcXj[OwaisY3 3?_ K <* 0E=(\#+.<LpC_~{w@ zPp+K )?R!4jF3(Z:Mg3@ 5> >v, <@.A{+"A,b]9HZol 5.'F ]/- Bn?qS{;'@]7 $^q V+7!G/y M /DjYn 3Rqx ^ x7U`|    ~ ;" 71b < F 4 5 : BK N, \T n  5 g e (   * $ 3BIJK Q4YOe<ru!] U 9YN2<i7 )& 6UMc*w 7\(<UpN x <a, Hu  h)L 9Q#### #M ?#E p#t # $z A$B $x ~ f$ [%2 % $&,Kt'=u)V &5B] +5D{ 95K Q5Uf r5d4 5w= 55U5 5 16,6~6`7"q8/e9BA;\PP P P P-7PAoPZPw P o^P Q'QZQMR&SS4 TG#Vc ! &&/Y=Og'2E?O.h}F OUR& ep:;$& +*5`C#U*m3>XK+\Fvc 'X(_d& p:g1839 9<1D@nSFfN;Xdra525 qXu~'n :FxHyO|:Z~j_W "]P F/:(( ;c fmDy/#98.W  ~"\ y) <kloOu}^ :7;ll+ +a3&,TF'*3 k^> %&(*\09-D!RFburuq *'+i B?v"4k'%GB1c?Qe~:HH @r"t* , SVAA..D/AM3{]:sDcQ`r H N:`` !I. B?S<D)v `)Q * ]RcQ!W 5/ KD3Y6nARjr&`:zRUpd ?  ,  W"  T1t | F P Q V, _LF jg y   8>   h3 E  + !2 $ C3`IOhSi_orw<"^I( <lrBU j& 06Mt7<*H!w]*z7H]uA z >//  ' )SS9$Q # # *# @# _#M #E $u $! 4$>{ $e $  $ %T% )&,Q(=)V r5g] w5i{ 5o 5zf 54 5=5Z55 6 }6Q56977"8/9BH;\ P0P2P9 8PD[PTPhPP NP pP 9Q*(QQR&VS4UG#rW cQ"S" Z%+d)dt/6&?KgX=jZ[|_ 4G8Iw' :X-Z. `0.k4i{:B1LXveOwndh RPHm'D :iRkRrU4}Zt`iJs}3{X! lyM' ;7<i "U  3 Gr Tu (k 'F< E$9$2 MCYBx=  F8AN)V q= P3fWDG{A D"RLz+O*j >JI J)N] T4]/Nhnv}L pPmO)++ ;m?G6"J74S;kbBwKJWfw FDU QJIT2y7, A8V.WB\|cley0`w) /wM: Au.0 EB?T/M>q!!.7fTl| 3 i}R&!s / zDYn!)4Bt Sb;g}pi   e Z  " x 1 Gm q |  L   " Z ;  5 o u h  RA @ $ 37I=E#x` +j[ AJ  L& `d6 MOQ*Wx`m~<s }s B e4  G] -)`T9Q # # $ $  $N $*F .$@v h$Z $x} $ y$ &%! %y&) 0m',[9(@==*V 5] 5{55f=55g5>56  6, {6U 667U.7"@8/5:3BRr<\PqPsPz PPPHPP Q q7Q. Ql*QR@(R&Z\S4UPG#WKcCD G0KnQZ>dpB~it<+ f$.' M:PQ S2Xr^gFq#~Jx}P4 wC%9' X;)wx{7{Z9aM O C.+X( y;>u:\6va w X sR( r|u})~^31k 8= Iaae+ @l"m4qlxL(PRg7 hELc s- FA .B|(>h["s+c g$E l .g Cv?zT",9AJ%]4Nsm @s z3EIe! ( Y/ DZY[n `2hKsjvf9r  & C *   # 1~ 4GD    M3 T }   +@. K x w&  # U P$ DZ4J,JNZn>  & 6cGQr GtGV  r& 6?MCG*SxhN6 h G ;   y)ql:CIQ 5$I :$K G$Q ]$[ |$iN ${G $w $ R$ $ !%% %q %#&z :'W,h(=*RV5]5{66 g656/?N6F6b6 .6 6h76m78P#9Q Q tR vR>0;RRSS&hT4(!9 c- b ) <#=+.7JEZtdDJ$x5e ObaF Kw* >riJlK uOTU^&iwr-i; Q rP ,+ n?)`&<2#ALR|f,9 /H${R, , ^X@ "  5n$:TW+{:La|wq 'I8 !- sBQg3.j4Bt8~@JnW#g y =;a "\7Fv f.w C?T7J]1 D!>bg c [n% j " 0h0 xE Y o   ( 6} Hp? \v t   Q{ S3 : H #f 21/ G    O   A z N , 9  z  : Y }% "4fJ1AU,l>>n Z H 'x e% .d',7yN# r t+ zy * G m    d A V |O f U)D:G#)RM %/ %1 %%7 ;%A [%OP %aJ %w{ % 2% % & &X& 'b W(@,){>+>W?6^6{67h777$AL7<7W7w .7 7%i8-q89G#:30 ;B<=a]pQuQQ QQR (R%jRC Re wR R4hS&STT&rFUP45"nVG&Xcnp y: ~)+8-Ih_2~7  Mqg' )9 <wz<#-91 H7Yro<A  _rB )Y =@BE?KS]j@&yTZ6_ 3 # ) *=|E  +XS58nG 2B>H6 V*N B>+  L(C(e6uF[YgqQ  s G+ !?<? HVXn-D9l * \g{ , @.uv*zaB*\F [x@ [3C T ~- jApq!r5vo}Y: _ [ D D F ; .,BO.RB]nr) +JmA T{ A2A~ !, /\ :DJ1?3T7? J)WOPh9|N,Z y jW q "B 0G F Y o     v= u  ! 6  t i S Ke V # 2{LwH:    P  ( :K P iW 8  3 UT  %K4)K0 27,@HLCl\!p0r  W  f c9, D &BQ'S7HNi * .+ ;y P n . B [ :w   ` \  %)x:r]R L% P% ^% t% %R %L & ~(&'l&E&k >& &']I' iD(,*>4,+Wm7^7{77h:78e7C77  8 |8A 8{+89B 99#%Q:0N<%B >]5R~RR R%RSRRR S z|S; Sy8STNuU&} U4E#WbG(]Y_dXc[d eg=tmuE"_gF6 Y~K ) V=bsftox>~~J$,$ipRA& k^ 2*j=AW6J: +r`[ 8G#B! m*`9>AG &lJ7PzI[a wKXc !*t>uvzN "<`rT6 ! *3 n^+?7:!DWT%k/3;I[ oI"/( %-p 5 ,*b@*cG 2.eC^b I^wY  @-RB !5p(^Gl1G bo z m* .. rCaa.e Co$,6vC0T g!B}Z ,r e9O X p!~ T d/ D?T &FUnAY6>}`    l " 1 F| Y o  ! ) 86 J}f _ w M  Zv  # 2 H    R $ N   a ' qJ J r n ,%_<4K] K O [ o E $  5 !x P< ^  t > 6 c'?7>N  + z     R  ? Zs kj$A@&): cR&r&t&z&&S'&NY&&&/' 'P ['V( ( ~),*>\,Wo8H^s8J|8P8[i8j98}D8Z88 8 942=9F9:#6;04]`nSCsSFSL SXShS|'SiS S }T T?=jT U U&"NV4W%{X)H*Z'd$ ?  `6"Ch5KMo ^FwYM m 4*>A  #d@4HrFQ^ jQe_  @* >+,0D6?J5Xp`iW|d/ r1 / d +*K?/I%ChncF " P5 o+?36@ PQh*%3E YLr/ V   ,^TI@!Y;+_HE`{ dJ c6 q P-3 A*dN9_d X ;  m 3 .$8BO!S5]qoc17u,ce ( + L+] !N/- #D.C{!7Ix 1#n@Wj M B q ~ ! 0Fh {Er]`?abUlg~ny\KfJT J X   1 " 1/  p ( H$+O34BI* QJ UL aQ tZT f u   Nm 7  Ie } - }% 5DK     .G S( :   C$ U UT:WS'r7 O 7s <u+ Izz ^ |   L E x|5a_*:!;S'P'R'X'b'pU'Q+'g''' (/ 1(}-() *h,s+>-mW]94^b97|p9=9Hj9W:9jF 9J99 9 s:!;/:t9:(;#K<~0Q=B$%?]|T@TBTITTTdTy5TxT T (T U<D{U V"(V&$dW4m'Y(H$, ['dOnq |BmM:{n A _"3 LY+?y}C#qX)M M k5D af+@F#E4~zHa p: pu - ,06@kPRVK\f('rN|V/ ( gy  hqU,?@'R8Q5p.?IHob , i  a+ -L;Aq u [D Ux# Z T, w  !. Bce*ifpzV3 [$  j =  5  . COq Sr5^wsp~k%  9U   , vQ i D n! / !E-C  /B X- E  1( o[ z    gp "i' 0 ~FP v V? y XU ] e p ~e X / x i  r   D > " -o #\ 2-EG W Y [ o f z &      P , L  y J y  sQ$[3I W X ^ fV r   T ~ L M X ?N&p51Lq D H U j K - BP@q st(s85M2O+{K&< p </$Wx*R< ;58"oS (%(3(J(j(W(T((G))5 )l )**:* ?+-#,>!H.XD:^":|1:I:kk:<:I: :U; ;8 8;sF;<<><#h=0y"?%C$&A]iUnU~UUUU #U gV V9 !Ve !VM"lV#Wz%X,&'[Y*4*ZHO/!\d 6 : ED W q'    ") iD5 jN ` S 0 [\ b|-% 6A B F QE c }(   ( .= uW; }U l [ < gqu-<LA f i  t$H + 5- A Q c Rx K i  v a> H<P:-AB   M  6  $ U  e : U  z -B    T  )$A J1 sA S i $   5[O uD>.~ C> O R ^\ p O     >#& ? h   TiW8! /0J dD  ) g  `  H z  N ( dQ (  h X !2 / aE B F5 Rt e t 4   6 7$z B l k  W xaF ("Y $0k F? - B    $ 4 2O ^ C@ X_ p  T   O(  #n 1 Gx > T   p  i G  # B: o   }  A#>H3H | 4X 6o ; C) O ^ qA ~ 0 9 v0 -%$\4}bJY7d.&I(ji : ? i@&6c7ML>@EN[Ol4@Lw   &P'fDJ(k58P`7H<J,IP|_Ygx1U $ h' i!@*"r; $'T,*P*R*X*c$*qZN*Y***^* +2 ++:, -r-b .?2%,0X [!{>##?0&A Cq+B^K#W#W#W#W#W$W$QW$X $X9 %GXe %XZ&X/'Y{ )SZ.&+[,4.\H3i^d h l wF  6  'b0i z0 . (C t x G  8 4o&E~ E! %. ?C   J  = 'Z)?[M E/ M #/ D H J NN V`D;nf~& &( ,{=!< /~D D.2=UQlN &*=?vZ } \Y [ 8! 1/ E$ ^\&Y]NG I V S/ "] 0 iE(%i8Tlx.8a & ; ~j x I  KR " 1W mF  4 v  ~ E4 9h Z  4Va `  %   v +#P .2&GGD +H BT h   -_ ?X TG m   w Su  #63H = T .  K p  ~  - _ M { Ip UCqY$g4JYLWNo*S?[-\hw$Ru NYr5%E 5x L"~ \" 2'F_]<xf 7 sgL#0'>7@ ~Nq U>,Ze0 "tR sny^c(&9#&3Q_T Y ,f }}    3! Ax!)!N L! !";_"%_#+"<$+[}l,[H-\U./Z] &1^ 44_tH9ayeT.04G<GG'UUf{ Q E/   nab F> "D 0 F9DFJHR]H4k b|T( J< . % ip PL "Q 0 FO J8L]^Q  4 Xf q N  Dnu "w" 1 fF8<IO^ { S  . B$D Zm x p  9  j"h k1j!E F   V  ] #* a 5  .c B   = W #  1!G ] ^ c_- kJ vip 2 ( K e N  | O )f  (4 #yB 2d"#_H4 Y Z& _i h sx D( >_ f  sc   O d dB +" #3"lI. 2 2? vT r  Y W >   A   a$}+3#fI ( @  #Irx(t?XCy T^ KGz% <4$)%J:R&U)9!Jz ?F. lg%!*}5{% L/YU[mai2-vT |SV tcfQ&"r46&nM.|05>`K\#p ]Xo w@Vp4!e($4%8c(>O!\*I\l+GP3l K _ [R!#)&:}*!R$$+$$~$. $< 5$N i$d $~U $!F$ !$ "{%E%#~%$&M&'*+)(e=". *%V)#0u#0w$0} $0$?0d$k0h$0$0%)0%1" & 1[&1v'2)P2!+o3.F.w4@i26Zo)B_)B})B)Bq* CG*NCZ*C4*CQ7+Cr +uC L+C,D-+-D/hEQ$1FE1i4GDn9DI_2^2"^22^2L^2r^2^2^3"^ 3r_! 3_N4i_57_i6\`g[7a'<:Lb5K=cIVBJeeX (] *j /E 7 CW R$ d 2 zKu  ^D  ! Z }d"G$=$' 37+IIOg @k Ay FF O ZX i& |"A M  bS 9 _ k"V$L$'3E+)bIa   I  \ +3 (l T  k ? , n!" ~"`$y$>'I*3o+VI   N " cJ &2{ 81 N_ hM { t !kT"$$s'3+)I> B P Uf  l = > n[/ +]   !#0#%(A$'Q4, Jiz{^w+K\O / 7 5!Wy "O#^i%%(|14,KQ V!ciy\c - p !AC ]!">$In&D0%)F5-,K . v ' F op z !3!!uT! ">#)$&w%)5-"L 7$ 9< > G! S!2c!dw!!E":" #e@~$_%.'&*6c.Mj!6!O!!!*!7"&G"X["r"r#/R# $\'%W;&('(+7;/N#Q#k##,6#L#u##.0$(J$m$ T%6&L(*(-8\1&tO$y$$$d%%A%t&%'{%C&Pg& '(Lq)+)*.93 Q'? 'D 'R !'j ' e' X' (' (n!x(!6 )K!k d*!+"#Z,|".#*1$;5&Tt*)*)**)~*)( *)6+)H+F)_+)yo+),,) 3,) 3-l*Ew.w*/+S 12,4,5-u>@9o/?W/05/55/D5 /]5/5j/5s/50%650p6306\ $1X6F263-7\48"68.9:;AZ>r<[5Hb^5Hd}5Hk5Hvt5HM6 Hc6EH6HI6H 7:I k7IX8Ic9J( ;DJ$=K1@M,E5EUO`>mdZ>rd\>dc>do>d>d?0d'?vd ?d @0e-@e^AeBf:Dgf'Fg5JigINkuf+0+2+7A,@,2Le,]\A,pN,--r- r.9./1(''3<& 66 5:{L+I+K, PB, Y,Bef,luB,O,-&-. u.S2/17@-3L&)6F$6:L,$,),7E,O,pj,G,T- -U-).2Y .>/1gB3|T&D6vq6%: M,,r,w,J,",/q,?N-R]-[j--. /8S0?1 c3&o66^; Mv,,,Q--)y-TX-i-.6!.iY. /o032!47&736;yEM-e-i-xZ---e.x.N.5.?/tp 0-1424t&77<3N].. .e.3.T.u../:7N/Z30 01893Q5h'Q8f7<YN. .&.s.#/0/=A/rU/m/j0TT0 1&2x4a6*'9*8 =vO//5///00I001,6z1i ;2i&3r47{(-:8>VLPo0/0I0001!1V1,12:32g s3yk45)8(;9`?p XQc2oK2 qe2.w2G92i223 ^3R343D 457x9 d)%;C'Tk6'6'6' 6'7"'n7N'i7'7'8(8o(5 8(l 9(:))x*+A+=oE-V:0P :0R':0X~:0c:0q; 0;@0;0;0A1@2 BS3-Ex4?I6Y?=4?=7?== ?=H?=Wq@!=k@Z=@=P@= AN= TA>$B>xC>EV?"G@/JABOdC]mFPI]FPK|FPRFP]wFPmSGPnGWPGPaGP 9HTQ HQDIQJRnL{R% NS2RU(F?VW$b'P:lP?lPPlPllPlPlQm6QJm# QmG RmuORmSvnTnVXoN(XpV6]\,qJashAVBXB^8B*hBMupB{[BzBCAWCND.) DrF GpIC(kLq9Q}!!QB qBsB!y9B:B^qB\B|CCRYCPD>C EFGI_(rM 9Q!DWDtE@E ^FgG'I8 \Kp )N"#9S"#RLDI$DO& D^,]Dw6DCDUEjECEEF} |GC FH[ UI!IL$"!)gOO#U:]S% RE E E- kEF Ej E E F %F_!F!,GM!a H!I,"J"L#)P"$:T&{SbF"(F"**F"0{F1":FU"HF"YF"oF"@GK"G"H9# H#NJ#K$U&M%0*!Q&h;OU(&T G*$?#G/$A>G>$GGX$PG|$^G$pG$H%$aHs$H$ Ia% J(%h#KB%L&qO'N*RA(;V*JTH'=?H'?[H'FH'P9I'^ID'pI}''I'J '2Jp' IJ( @K(jwL(xNs)wP*W+DS+<"`Vb<X=A!ZN>0.]?AbHAg\/WH*WH,WH3WH>X%HNxXVHbXHzXHrY)H AYH Z$I ZIv\I$]J#`K1ctLD2h8N__[X_[x_[_[y_[Z`[{`N\ `\*}`\M `aS\y a\2b] c]e^F%h_F3ks`GpSbd jxj xj2xjNxjvxjxjyGk3y% kyI kyxzlymoz"nzYpg{Y(r|e7/vf}K{kimft2KN6-K5߿ \But!7"$_%'/(~)*,-4.H/R0V1T2M3=4)55678s9A: :;~?0?@A8ABC(CDiEEF:FGhGHIIJ]^ ^m^_5__`\`aaab=bbcXcddode&eef6ffgCgghKhhiOiijPjjkNkklHllm@mmn4nno%ouoppbpqqNqqr6rrsshsttLttu+uvuv vSvvw.wwwxxOxxy%ylyyz@zz{{V{{|%|i||}6}y}~~C~~ NҀUׁWՂS΃ H8r![Ά?wU‡.c͉6jҊ8kЋ4eȋ)YHwԎ1_BnǏKw͐#Nx͑!Jtƒ@h 0X͔Bhۖ&Lq*Os(Ko٘Be̙2Uwۚ?`Û$DdĜ#Cbޝ;ZxӞ-KiŸߟ8TqȠ:Vsȡ7Soܢ-Hc~Σ8Smդ #=Wpե!:SlϦ1Ibzçۧ #;RjȨߨ&=Tkǩީ "8Oe|ժ.DZpǫݫ3H^sȬެ1F[píح*>Sg{̮/CWkͯ /CVi}ɰܰ(;M`sб,>Qcuв*GQ[dnxˁˋ˔˞˧˱˺#,5?HR[dnẁ̸̜̦̯̊̓ '0:CLU^gpz͕̓͌ͧ͞Ͱ͹ %.7@IRZclu~·ΐΘΡΪγλ %-6?HPYbjs|τύϕϞϧϯϸ'/8@IQZbks|ЄЌЕНХЮжо "*3;CKT\dlu}хэіўѦѮѶѾ'/7?GOW_gow҇ҏҗҟҧүҷҿ'/6>FNU]emt|ӄӌӔӛӣӫӳӻ&.5=ELT[ckrzԁԉԐԘԠԧԯԶԾ &.5=DLS[bjqxՀՇՏՖ՝ելճջ !)07?FMT[cjqxրև֎ֱָֿ֣֪֕֜$+29@GNU\cjqx׆׍הכעשװ׷׾ &-4;AHOV]dkry؆؍ؚؔءبدضؼ")/6=DJQX^elryـنٍٔٚ١٨ٮٵټ %+28?ELRY_flsyڀچڍړښڠڧڭڳں!'.4:AGNTZagmtzہۇۍۓۚ۠ۦۭ۳۹ۿ $*06CIOU[agmrx~ބފސޖޜޡާޭ޳޹޿ !&,28=CINTZ`ekqv|߂߈ߍߓߙߞߤߪ߰ߵ߻  &+17BGLPUZ^chmqv{ $)-26;@DIMRV[_dhmrv{  $)-26;?DHLQUZ^bgkotx} "'+/48AEIMQUY\`dhlptx{  $(+/37:>BFJMQUY\`dhkosw{~ "&*-158<@DGKORVZ]aehlpsw{~ "&)-048;?BFIMQTX[_bfimptx{ "%),037:>AEHLOSVZ]adhkorvy} "%(,/36:=@DGKNQUX\_cfimptwz~ "&),036:=@DGJNQTX[^aehkorux| "%),/269BEHKNQTWZ]`cfilorux{~ "%(+.147:=@CEHKNQTWZ]`cfilorux{~  #&),/258;>@CFILORUX[]`cfiloruxz} !$'*,/258;>@CFILNQTWZ]_behkmpsvy{~ !$&),/247:=?BEHJMPSVX[^acfiloqtwz| "%(*-0358;>@CFHKNPSUX[]`cehkmpsux{}  "%(*-/257:=?BDGJLORTWY\_adgilnqtvy{~ !$&)+.0368;=@BEHJMORTWY\_adfiknpsux{} !#&(+-0257:R??@aA ABZBCD@DEyFFGAGHhHIJJK/KLALMNMNVNOYOPWPQRQRIRSrي ?r׋;l΋/`N}ێ 7eHt͏%P|Ґ)S~ґ&Oy˒Em5\Ҕ Fmߖ+Pu /Sw,Psݙ#FiЙ6Xzߛ!Ccƛ'Ghǜ&FeÝ>]{֞0Nlğ:Wtˠ Xq֥ ";TmЦ2Jb{çۧ #;SjȨߨ%=Tkǩݩ !8Oe{Ԫ-CYoƫܫ2G]rǬݬ0EZo­֭(=Qezˮޮ.BVi}̯߯-ATh{ǰڰ&9L^qα+=Obtϲ);M_qʳܳ"4EWhzϴ%7GXizϵߵ"2CTduǶ׶)9IYiyɷٷ (8HWgwĸԸ!1@P_n}ʹٹ$3BQ`o~Ⱥ׺ .=KZiwλܻ#2@N\jyͼۼ!/JWcp|)5AMYeq}‰–¢®º %1=IUalxÄÐÜçóÿ'3>JUalwăĎĚĥıļ #.:EP[fq|ňœŞŪŵ #.9DOZep{ƆƑƜƧƲƼ(3=HS]hr}LJǒǝǧDzǼ&0:EOZdnyȃȎȘȢȭȷ (2HQ[enx˂ˋ˕˞˨˱˻#,6?HR[enẃ̸̜̦̯̊̓ '1:CLU^gqz͕̓͌ͧ͞Ͱ͹ %.7@IR[clu~·ΐΘΡΪγλ %-6?HPYbjs|τύϖϞϧϯϸ'/8@IQZbks|ЄЌЕНХЭжо "*2;CKS\dlu}хэѕўѦѮѶѾ'/7?GOW_gow҇ҏҗҟҧүҷҿ'.6>FNU]elt|ӄӋӓӛӣӫӳӻ&-5=DLT[cjryԁԉԐԘԟԧԯԶԾ&.5=DKSZbiqxՀՇՎՖ՝դլճպ !(07>EMT[bjqxֆ֍ֱָֿ֣֪֔֜#+29@GNU\cjqx׆׍הכעשװ׶׽ &,3:AHOV]cjqx؆؍ؚؓءبخصؼ !(/6EKRX_elryچڌړڙڠڦڬڳڹ  '-4:@GMSZ`gmszۀۆۍۓۙ۟ۦ۬۲۹ۿ #)/6CHMRW\afkoty~ "',05:?CHMRW[`ejnsx} !&+049>BGLPUZ^chlqvz $)-26;@DIMRV[_dhmrv{  $)-26;?DHLQUY^bgkotx} "'+/48BFIMQUY]adhlptx|  $(,/37;?BFJNQUY]adhlpsw{ #&*.259=@DHKOSVZ^aeilptw{ "&*-148BEILPSWZ^adhkorvy} "%),036:=ADGKNRUY\_cfjmptw{~ #&)-037:=ADGKNQTX[^behloruy| "&),/369<@CFIMPSVZ]`cgjmptwz}  #&)-0369=@CFILOSVY\_behlorux{~  #&),/259ACFILORUX[^`cfilorux{} !$'*-/258;>@CFILOQTWZ]_behknpsvy|~ !$'),/247:=?BEHKMPSVX[^adfiloqtwz|  "%(*-0358;>@CFHKNPSVX[]`cehkmpsux{}  "%(*-0257:=?BDGJLORTWY\_adgilnqtvy{~ !$&)+.0368;=@BEHJMORTWY\_adfiknpsvx{} !#&(+-0257:\? ?@iAABbCCDGDEFFGGGHnHIJJK5KLFLMSMN[NO^OP]PQWQRNRSAST/TUUVVuVWXWX7XYYYZYZ[/[\\i\]8]^^j^_2__`[`aa~ab}}~ ~L~~Wۀ^ _ނ[փODŽ?y(bՆ E~$[LJ3h҉;o֊ Wp֥";TmϦ1Jb{çۧ #;RjȨߨ%=Tkǩݩ "8Oe{ժ-CYoƫܫ2H]rȬݬ1FZo­׭)>Rfzˮ߮/BVj~̯.BUh|Ȱ۰':M_rϱ,>Pcuв*KXerοۿ(5AN[hu %1>KWdp})5AMYer~Š–¢®º%1=IUamyÄÐÜèóÿ'3>JUalxăďĚĦıĽ $/:EP\gr}ňœşŪŵ #.:EPZep{ƆƑƜƧƲƽ(3>HS^hs}LjǒǝǨDzǽ&0;EOZdoyȄȎȘȣȭȸ (2HR[eox˂ˋ˕˞˨˱˻#-6?IR[enx̸̝̦̯́̊̓ (1:CLU_hqz͕̓͌ͧ͞Ͱ͹ %.7@IR[dmu~·ΐΙΡΪγμ %.6?HPYbjs|τύϖϞϧϰϸ'08AIQZbks|ЄЌЕНХЮжо "+3;CKT\dmu}хюіўѦѮѶѾ (08@HPX`hpxҀ҈ҐҘҠҨҰҸ'/7>FNV]emt|ӄӌӔӛӣӫӳӻ&.5=ELT[ckrzԁԉԑԘԠԧԯԶԾ '.5=DLS[bjqxՀՇՏՖ՝ելճջ !)07?FMT[cjqxրև֎ֱָֿ֣֪֕֜$+29@GNU\cjqx׆׍הכעשװ׷׾ &-4;AHOV]dkrx؆؍ؚؔءبدصؼ ")/6=DJQX^elryـنٍٔٚ١٨ٮٵټ %+28?ELRY_flsyڀچڍړڙڠڦڭڳں!'.4:AGMTZagmtzۀۇۍۓۚ۠ۦ۬۳۹ۿ #*06CHMRW\afkpuy~ "',15:?DHMRW[`ejnsx} "&+049>BGLPUZ^chlqvz $)-26;@DIMRV[_dhmrv{  $)-26;?CHLQUZ^bgkotx} "'+/48AEIMQUY]`dhlptx{  $(+/37;>BFJMQUY\`dhkosw{~ #&*.159<@DGKORVZ]aehlpsw{~ "&)-148;?BFJMQTX[_bfimqtx{ "%),037:>AEHLOSVZ]adhkorvy} "%),/36:=@DGKNRUX\_cfimptw{~ "&),036:=ADGJNQTX[^behkoruy| "&),/369<@CFILPSVY]`cfjmpswz}  #&),0369<@CFILORVY\_behkorux{~  #&),/258ACFILORUX[^`cfilorux{} !$'*-/258;>ACFILOQTWZ]_behkmpsvy|~ !$'),/247:=@BEHKMPSVX[^adfiloqtwz}  "%(*-0358;>@CFHKNPSVX[^`cehkmpsux{}  "%(*-0257:=?BEGJLORTWY\_adgilnqtvy|~ !$&)+.1368;=@CEHJMORTWZ\_adfiknqsvx{} !#&(+-0257:j=<;d@94&[SRR NR1R,R_?RRFQeQxzQ)PaOޯNSMLkJE6c2c* )cc+Jb<bOgbzbub2v>a݉ajQ`Ѭ_u^]X[sVFVss ss* s};-sUM)s_rrrC_r:kqopY'on߼l*hV } ^(9K8=]bmp /9‚wԺ?΀HR%~__e 8'8:IU˓m[Mmoғ"42^tkTO6  &q6bGPOXd8j|¢u{{_btzDzOϛa` ]NY%S5%FE8,9V)gpӳyIܟZx.>q6[N (D)= AB?$v;3XN0C;'SY!dKu朌0ŽCo- &zMiS1R/ .(1$@Pa!q2լ}ҳ~}1jHѷ K}S%  ()!0>N- ^nVgKXͼuχsrOUF 9e pR m . <K [j4|\\ꥍ7ڹ)-pjk9G#2AP`(qK: a3?j&;9OdP#x$, ; |  + O [W$9-Nc w ɋ@ J Y B e  3Ǖ 3  K!!; 3 4B %I]c^3s?    < JƩ m^ 3& B1xp 1} 1_^ 1#1 0E }0|Y /n9 !/$ / .h - , +< I*\ )r" ?B QB ,A @A. 9AA A^Um @i @~C @ ? >ƲT 7= 6<ӱ 4;_8 93% R R O R Rp, XRU? RR Qe Qjy Q PwR yOٯ N ;M Lj JE&6, Rc!U ) T : o E' L89 XIO Xl[ Hmi + r } W, O Jk QhR O W _ 4~ .z& :n6 D_GL PNX e5j~ C| . P %r| + .]` y ٟCwO ] Z WL ųS% ճM5 DE0 7V 'gk yJ ן 負 Rk ޱ N/ ' ^ nV J DW , ʼs ω on TF9   V . < K [ j | ꥌ ڹ( p ߀ ff9h#o2AP`q?4|3Z#\#v":""8!5M( Vavv&*Je01us?"m"&/",j"!k6 K `: uz t I   :% ~ n `/ I n \? R 3HNI]0rBLpWӶ%Zj&4f 1*L1! M1 '000D0X$/m}/Kr.Δ]E./o-y?,+ *9J)lY>A|A zAA.twA\AR6AU&@iB@T}?䐃?OBF>=l<Ӊ;J)91#qR`R\ TiRY~R<,ER>EQQ4QeQ@yPЌPMO^`NMLRJ C4b]b bb+#zb<sbO?\bHbCKbuOaS.aE`_Ծ_m^#]l=[]-VIDss sysg)sK;s"M r_rrrujrBWqLMp׼7onߥdlhT+ 1b1(9K#]DNpۂW'3o~ d ?z'80tIGo[Zt8mXgYےOB){@_Տ\G|Pr=֣xԣv p j&ģb6УSGG̣AX̣,jtң|ޢʢgq|hTV=q N1^nV  VȼqχlkQH:P M D XS , .3 <BKS[EjD|%)襌5ع&n~dd Z0)0%/0///C/q/W//#lH..3.).VU--ϣ- --,],OS+b+jԪ*P*f)3)X%ff.%A;.1A6 .A1-A --@@-@Tm-~@Hht-1?|,?,?,+><+=so*,AQhQm,Q-d+Py+PtG+lP+O]*NM*M|т)dL$(J_ D>1d+b+b *b*by+*bX<*b0N*aa*au*a^*k`*)`dz)_)P^ϫ(]=([:#pVtBM)s4)s7 f)s.)s))s:)rL)r_\)rprx)r+)\qח)-qS(p(o(%nZ߀'l%Fh>R(σ/(ƃ L(ʃH(Ń((9{(kK(E](o(؂(zk(S()'؀'l'}&T ~'Г|'ؓ{ %'{'̓m''b8'NI.'3Z'm6'''|fb'G' \%&АxF&sE2%T&[&W &V&P&&E6&:G2&(Xw&jY&|&Ϗ&|&APY&!%=C%\p%R)aUU%>%> %>E%9%%04%)E%xU% gY%my*%a~%X%_%=8T% $˱([$GT$n0$h* I$d)$\%$N$g"3<$GB$ESH$< d+$\u$I$0՜w$<¯$,zx$+P##lS_#9#5 '##!#4#1#@#* P#a#q#,## ɬp"ҥ"mn"O"ѭQ"" " -!!!0! >!N0" ^ "nN!!N!۩!ül!ρ!hf!MMB  [  . < K [ j | | 奆 չ! j { aaA F!1d@O_p@D0$):3*GtG[ G) Fj2HF=FkE}[-DoCuB;A@뵿?Gű=խ<:^3!{F F F FM 1E FE/ 'ZDf oC HUB A `@ ?9 Jņ= Տ< :R e2 rEsrEq WD\D<0DTDCXCAmByriA+L@b?6>=`/;4:3X.vB/ZB/T B/OB\/?/B.BYA.VFAk.rj@.0I@J-ڑ?-JW>,в=,É<+=;Y*A9)5/e% C@3@_@&@c @(@Y2@@=-?@@??S?P?ge??D{>>䎯>*>v==۰<=;< Ҹ::{9_91*2y>$QL>QN >Q?U> Q#,=Q>=PP=PdB=WPQx:=O|; _:_A9^IV9*\8.[j4)V@R:r:r q:r:r):r::rrL:`rF_:Sr r:1q̅c9qx9p9mpH8o\͒8]nF7~l5h#S9IUc9GT V9-V,97A(9--9M9!J9\8o8킄8ǂ>8̧8G87^7s16}5t}Z:?7>7ړ> *7ߓ;7.'7Ɠ$77“I7Z7l77w7_0.7&6ݑ'6vL55LZnj6U46U1 6c+6J)&6L66VG6CXT68j56$|x66 tv5֢'355Q%4>U4` J[4γ"c4γ" 4ȳG4%4˳44 E 4U4g>4y 4nj^44ylm4I ;43G3]1|Zx533 O33&$R33A3B3#S.3d!2ut2ڈ2œc22ig2?2m2^Yr1w1x )11 #1 11@1sP1a 1jq1v1x՘1\Ҽc1LҘ~1:ba1 D0ѢX)// / 2/"/0 />/N%/^/nG//E/ө /⺼c/y/`_/zESj>.p .n .k^.l .f..g<.tK.iZ.kj.r|.ry.^ी.XϹ.Ed.6v.!\\H+D*$* 0!?1 w@.O~_fp"'%*i0.3<34Y\YR Y,X0>X]CWWW!lVW큀UrqTS;QoOEԼNK3D3<X X X X 0X CW WV lLV ց-U> ԓFTL S VVBVK"VvUjUTeS@RtQäOr2%MmKA .UH.YUC.M U$.UU .".T-ATc-TS-hS-`},R-RH,QQ,LP'+„N*IM* KP(iB~ (R?pR?t 1R?rR?[,RZ?B?R)?RNQ>f Q>~z;Q>-QP=O=AND%kDղ4DͲDDͲUDògDxD4D|iDrHHDDC׸C)CbaABqB ]BB$QB3&BBBSBdBuSBB~©HBe…mBVNOB(AAiKa ~@T@ .@@#@1@@@P@`@q@Ԅ@Ø@ҫP@r҇m@FRQ@5?ѓ_|0>> >7>">0 >>>N>]>n7>>ؕ6>Ǩ>⯼W>rm>QUT>;[B<k< <e< <.<<0@_kH"kL mk+jW.jAjfU^i|ih~1h g!eEdZbsӤ`]0]V6C"k k Fj j .jO Axi |U)iM /iFh \}g f `e #!d; bY Ӌ`J ] yUBii uiJi{-i.@h[TWhFweb>y HeT>hWe=>R,)e >>>,d>Qd|=dd&=xc=bc*=,bm[ni̾ZmJޒYk4Xumhr{\I8\H8 a\F7\E$(W\68\!J\ \ [⁳n[ρzx[74[PצZMZY*Y~k-X|V~wj|ZLysZGx %ZKquZIj'lZ7]7Z&LHZ4ZZlCYߑ~Y‘YzY=XmX#ۣW\V=skXX XX &qW62WFWxWW֢diWK{W) WuW:VDVVnUҟTힵkZ UU U;U%fU4UDUUUrfUlxUOoU7K3UTϱTva׏SSPAk${SS SS S $2S3(S BRSR¹cR­u,RR…!RbHR.-RL QtQ`1jûPP /PP#P1P@PPP`PwqPrҼPbҬPIҔ7P-qVP<;O OiiFN N NN "N/N>NNN]Nn!MӀMȕ$M⸨M⠼GM|^MGFMJ-eHKK lKjK K.K&R>S!>17>@T>O?_?p@ ACF9ILb4ME}:}9 }|-4|?|<S{jf{|{zr7yQxulvzuqqr>CpG)h4R} 2| e | 6| -|h Q?| \R{ Afz (zzI yg !,xK Ov bt ]r 2p; `gR{{ {{,{p?1{RPzezzyvKxNwvKtdrgoUgvxPz4,bz1,e -z*,C5y,C,1y,>My,Q@y"+dx+xx+wt+a\v+uR*s* Pq)s^o{(@g$VMw=dw=g w=bw=C+_w=9=&wm=Ow]M]]]n ]⿀]ⵕ ]⥨]⍼2]oiJ]D43\pQZZ UZjZ Z.|ZxQ d5xr !%J1/+F+zb  AV ),* > P da xL  | ݇-  8 8 zI)bav gm+̌vH=,dPx;cӋyw\̜x YQ~τO:zQta5+g+u x+tc+e+A7+X= +6O+*bފN+v*҉T**j6x*dž )8)){(Iz|%_J9m׹~(m"˙l(ݎ}zjV{ mu W '耒{8:yjIB\IZ1&mLwd~~~O~=8}T}HR||Czdz]~0\$~4Y &~4Q_~*K'!~B7~/G}Y?}ېkB}}}}Ds|3|Qȥ{zyyj逆R{h{i {i{a&3{V5{EFD{4WF{%h{zzޡg;z7:zfyƸyV/xxAywW-wxK9xK9 xJ8 xH4%4x@.4wx6%Dwx'UxfVxwwZwȱǞww6QqvvXu2ëtxtx Vtvmtt$tq2tlB}tdRtYctNtt@t)tot/sԶsa"ir߻q{Ҫq~ң q~ҢqwҢ#qyҞ1eqoҚ@qnҕPKqbҐ`q_҇qSqR}jqnMm]mmm⧀m❔m⍨mvmS3mXl}[jj ijtj j.|j;@ ;Kߙ;9)ᙥ;(;;M+N;_Й:s:Xo:g:8o)9`#9b.8̒70;4Z;HLJMCLQ >LJ0L5)PL0:PLLK^Kq[KŗKK-3J@ J+3Ia)HqJ`]h']e Ux]e,l]^(V]P9{?]7J]] \oޕ\ςr\r\Cʔ[ȹ[%ZT+Y;ﰎ\knn ?n蔏n{(0np8jnYIДKnA['nnmmlmdHl󸟒FlOՑRkjjAÍlv '7iHrOZET*lk0~ґ~{O~ 8}lɐ|۾{X>yށ; 搘&鐇6wpGba]XFBj&&|ď¢oiB8pJ:쓋9!S#P #NK&@5 5E%Vhq̡zg፨9xϠK?ˋjV9ED BA% :4?0D4$TƋew届Ʊi@:9?Ͱ͉ Q=?ɬ5;5 ^4i0$ .2̇(BV Rvc= thmƮCOyg/Uļdz`u btÄ^s"`o1MZl@uOgP+I``s;Zq3N2?D(ƒ胘ԃ8ы佂 w_| ΀!Ҁ/ـ>~MЀv]pm̀j∀`\~̀En#W5O닲g|| r|]| |.q|<|Kk|}Z|}je|t|n|n&|`4|F|+t{Q3{5u>trpMp"/p1p@qOq3_[qqrGrsuTw y/9y-Zw):`Ly'_FrǪ/.-B'V\ߤf\O y  )ͫ :쫓 iLh b_2 Hr  [t M J @ߙ >O9 v)b:«?L_6rdM̗ʩԩ1|ܨJ_ͻ k~㢇$Qx)) )))[)}:\)uL5{)H^G)Iq )*)3P(M(d(]T'*'xi.jZV :9 9Q9) 99ة9K9]b9pթ/99jQ9/8𺭧(8}̲7ވ7L$.:](JJ JJ-J(J9BJJrJ\ިHJoJgJ7*I~III)ݥLHѣGLct[r[ *j[ۧe[( T[8;[Iӧ"[[[n9[w$[GצO[NZ>ZZY\%XbС[Qn*mm mm 'm7ϥlHեlZllvluFli_l'kyk+ΣGje2i`h *wq~6jp~8 n~53h~)'\~7 K~G֤9}YG}kI}}}ϣ}FD|9|Uȫ{)zmy  â㢫&v6HhFƢWWr@iW({բ7СšP ZdŸyA %58wtEoiiVHXWgFCy('ɟòqmŰ>B?ꝝJBś۝!K5 K JE$۞A3:Cܞ0TR#eovͱL坮>xäڰ^JwA#TTT dS`M#J2EBskMf]lam[&PAgg*ʔ<ԓš{ }Y .a<KVZ jB |G}mV3U%N"-2C@_P&u_qCiv] 7;Ywػ|r8a(P89Y: J\ٺo??ù ޸%ض]Rf :k ,޻^ l(S ~(D 89K- 3J R\Һ So G +*   (ո Ͷ mSl){-mл%Ts( K9]JM\'o]+`K1 H~˫ݧ>jv&U(( H(m(h(O(o8庇(QJ4j(V\8G(Gn(-(~''׹!}'Y'<_l&-Q00Yx88 8κ8(888I8w[8gn1~8LK8$Ӹ7H7Ǹ7oڷ#76t̴,<|_1IB2IC /I?(I-'I'8 I$IIZImQH߀HĒ;HyHMַIG.GbXyFIEDe3Z:.Z2 ޸+Z7P"Z3'cZ!7|ZHnZYYl?Y~޷Y׷RYqY(yX\X۞WFV8sokR kU ͷ kOkL&kB6k+GkYjk j}}jHjij7iuiȴh5gӪy<|t|r |q|m&t|a6D|QFε|?X|'iԵ|| ^{D.{8{W紁zyz*߳&y8w!+r)r' o$j#%e5X ELVݴ;hs%znߍг>IP̌@Ѳm#OG N}%fw4nDòcUqSfmCxrV)̲6ϲԱNukߜ$*2 `˰${3szCWkpSbedTUvACs&(ïkoZ=@xFF NDOD#@2T ;A4Q,bZ!sYg㭲?xӪmNּ^[ YY"U1 Q@KOEѽ_ʫ=Ѷp`3Ѭ[$ў щ iA:9l*ВT7P0 N0M/!K-/H+>KE'MtB#]);mH5̨(A軂ΤᖧPO!ݛrGq q[p o.Jm<|kK1hZnej`| ZƤPۤA)ФJէ =#"2e%AY4PpD_kqw:t 8l@ACd'7)H#Z lVʣ~ʆMwt۴ƌT  _ 'm 7 H Zʻ lDʜ ~s 8 c aȵ ۦ Ƈ }U,a'P7H[ʮYʕlw~Mxcqɽ_BO?ȗۉǪnhW4ʚ'Sʝ'Q:ʗ'DTʏ'T'<ʄ'Z7Lw'BH#d'5YK'5k.'~c' l&$|&ζ&\&fPv& hA%=\)$7!%7 2 7#-7"'7 77G6Y36kNɽ6}ɘ6ѐc669ȡ6QȠ5$5m4_ɏGyɈG{ ɅGsGu&vGm6iGbGcXGPXBGMj(G;}G$>FȉFƵF}LjF ځƶErŚDgcX-X4 X3X$&ȹX6XȬXFȝX XȈWiqW|/RWďl#WTW_{WyV,U.!U/oi5i4 wi1i.&&i%5iF?i WKǵhhǟh{ ǃhjYhshS/ƿgƾ@gl>ŋfĒe zzNzK zKZzB%z=5Kz0EzVyz hƼyyơyՍNzyvAyfKx|xf{wv i`^ Z!U%fیN4ҌGDnj:Uź(fŨxŒoПF>7>Čד( K&x(w' wv#r"$l4fC^ TSRetDv0׊U靈êDèQcМO~G|­­ J­ª{$<¥y3 qB™iR^cƒSttCA]*;Oo~ (~#p}|1zvAAspQljacaryUVDB)(ſomξmDB ϾA}?">0;?6O*1_C*o"z㽴жжGw㰼yWMfe db!b/{`>\M&X\ɻSlԻLGBᬓλ1៧ኻjC;;.n5k. Rk-/6==:L 6\E2l5-~#%ͶͶ͌Hxki eiAh if-e< cJ`Y\iOY{+SI9#!iE;;~ƧƖL"&$*3,Bq2Qj9`Dr9W"mƦXƲeDǬNǏ  f$U4"VD T~ew>^MBܱ"q֌i{O \  P  ]T W$ z4" uD jTz rem Gw-Z S{? S I U 1ֈ =T lO%  .dF$4}9CtCT|ie[BwI&d.!rwF_Qi$ k$ k$g$$c$3\$CS$TVG$eq;$v($؊< $ݝ$$ïU$Y$h,$FU63834313$-33&3C3T,3e93v3ʼn33y3z&3M)32[CCCC$C3CCCSCsdCqvRC[CV.lC9Q5C1BoBoBcSSvSS$xS3SC@vSSmSd`SuPSz*8SdSASRՏ Ro Qo`!d*d* 3d'd'$Rd'3GdBdS3d dcuRcc֜Bcywcyg-c/'b)b!FwKtt *tgt$t3tBtR|tcqttctMt-tdt&s԰Rs[Rrڂmi hBf#b2\BSR8ڇGbЇ;sÇ(-篇 瑆HeK$ZŅ?9`65 &32#12) )A#Qrarٙ澙ͭV料n[ZO匘`ii ff#c1^@XPx߬Q`׬Hqͬ=彬,妬儫CO9b䗪9}!}! | z{"x0u?pO7k_Xeo\N;ܪ㱽NV| Iww v,u!t/q>nMh]dm[ZRwB`)=΅$|}`|} {|z|! yz.wx=;tuLqr[mnkahh}``;TUABC'(:\?? u?&> 5=-<;:J58YE 5h1zv+K":ʗݹݹݎݘ &-4C7R a$rnk<ƾx`ڪZڅih#2tAqQ}bpssqgS]&f?ӿicJB| 8} - g} #y 2cu An #Qg bd^ seR 写? L# ,  Ӯg a ICqr}uhqq#nk2_iyAcyQ[pb\RzsVFi4r=UHMӢ] V IFZ#[#^#Z##W#2VS#AM#QE#bF<#s<0#n#"###~ӋH#jA#6GJ62H72F92C62A#32N26/24A(28Q!2=b2-s 2+>2-2 i2 ~1i)1"1v:OAxAvA{A#A~2 A{AuAsQaAlaAhrA_ARAC2A&RPA:@@;YQ3Q2Q2Q;#tQ71Q5ABQ*Q$Q'aQrQQurPLPPPSOON1d.aZxabvactaa#Sra]1na\AhaNPaaMaOZa;r%Na8@>a+&a`忿`Ү`^t _ +oqq qq#$q1q@ qPq`qqqqqu1qI_yq T-p p=|VX VX#W1]N@MP*B`w:q%/,q$\;; ă,\\o "1@O헃_~pfݗn_ϗb`G$EqI/Ζ*ؚ#(J G FfC"hC0=?x9N4^ -o_%6\ȩXldrQ  ᆰji i g!f/c>_MZ]Tm߼MԼAļ0BV;jS ~}!`|/,z=wLt\Hol?j~a3S@ݺ#;ͽ͒Qqv@v uu s.]r L {{{z /{zzyyx-cww;EuuItsXqpgmmy~hgZ`_TTmBB('/)/-)+w+'+5+D>,R,a-s+028aEƠWFojP"2]AP`;r k5"P2$A^P` qc 5RNA!1@lO_nq#h!<5 $Z$X$M/S>N^$o8f/6f0(0&/,<LP\m7/Aq٪ 6*s=A=@=9-)94IXjK urpي);9K<K:I<((()o9")I *vX+k,܁-\/5O7ٱNh^qEk Qږd,*$;i3CSRPc tCrIJ !(JP7gNjFVvf>'x!lxۢs9mɍɅ(ɪڪ ګ+:H#XOEh nz ۚ3܅ʖܹܹܢp//+59WGVf_x MwN> Y -:HsVe v #  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ AXYZ DisplayCAL-3.5.0.0/DisplayCAL/ref/SMPTE240M.icm0000644000076500000000000000507412665102037020134 0ustar devwheel00000000000000 R g |  & < R h ~   2 I ` w   4 L d }  ) B \ u )C]w3Ni+Gc+He4Rp'Fe!@`!Bb(Jk7Y{)Lo DhAfDj'Ms 3ZFm 5^ ) R { ! !J!t!!!""F"q"""##G#r###$$K$w$$$%'%T%%%&&3&`&&&''C'q'''()(W((())@)o)))*,*\***++K+|++, ,>,o,,--3-e---.+.].../&/Y///0$0X0001%1Y1112)2]222303e3344:4o4455F5|5566V666717h7788F8~889&9^99::@:y::;$;];;< >P>>??=?x??@+@g@@AAXAABBKBBCC?C}CCD6DtDDE.EmEEF)FhFFG%GdGGH#HcHHI$IdIIJ&JgJJK*KkKKL0LrLLM8MzMMNBNNO ONOOPP\PPQ(QlQQR9R~RSSLSSTTaTTU3UyUVVKVVWWfWWX;XXYYZYYZ2ZzZ[ [S[[\.\w\] ]S]]^0^z^__Y__`8``aadaabGbbc*cvcdd[ddeBeef)fvfgg_gghIhhi4iij jojk k]kklKllm;mmn-n}noopoppdpqqXqqrNrrsFsst>ttu7uuv2vvw.wwx+xxy)y~yz(z}z{({~{|*||}-}}~0~~5;CKU_kņx҇-??@ABCDDEFGHIJJKLMNOPQRSTUVWXYZ[\^_`abcdfghijlmnoqrsuvwyz|}~   #&),0369<@CFJMQTW[_bfimquy| !',27=BHNTZ_elrx~%-4<DLU]emv~%/9DNXcnx %2>KXdq~%3BQ`o 0BSdv-ATh| ! 6 L b x  / G _ x  ( B \ w  7 T q  # A `  @a .Qu+Qw9a.X0\@o._'Z+a<sX E;y9zA R%m H !)!v!""_""#O##$E$$%B%%&F&&'Q'((c())})*=*++d+,-,,-a-.3./ /v/0Q01112223s34b45U56L67H78H89N9:X:;g;">?B?@h@AB,BC_CDE8EFzGGHhIIJdKKLoM MNO>OPQkR(RSTjU.UVWXQYYZ[\g]?^^_`abtcZdAe+fgghijklmnopqrsuvw'x>yWzt{|}*W'b&mV[~Q2 )D׭nJ𵛷Jo/ÈY.βОҐԆց؀څ܏ޞ 6dTCsf32%D3֯? e xDisplayCAL-3.5.0.0/DisplayCAL/ref/SMPTE431_P3_D65_HLG1000_cLUT.icm0000644000076500000000000026774013220336703022672 0ustar devwheel00000000000000o@mntrRGB XYZ  0+acsp-[ s|@descPcprt Dwtptdchrmx$rXYZrTRC gXYZ gTRC bXYZ bTRC A2B0 lA2B1 lB2A1PZB2A0PZlumiobkptotecho desc&DCI-P3/SMPTE-431-2 D65 HLG 1000 cd/m2'DCI-P3/SMPTE-431-2 D65 HLG 1000 cd/mtextNo copyright. Created with DisplayCAL 3.4.0.0 and ArgyllCMSXYZ TchrmQC&h\XYZ |w:curv  !"#$&'()*,-./1235689:<=?ABDEGIJLNPQSUWY[\^`bdfhkmoqsuxz|~ !%)-148<@DHLPUY]aejnrw{ "'-28=CINTZ`ekqw}#)07>ELSZahpw~&.6>FNW_gox &/9BKT^gpz )3>HR\fq{&1=HS^it ".:FR^jv  $ 1 > J W d q ~    * 8 E S a n |   $ 3 A O ^ l {   , ; J Y h w   " 2 B R b r  ,>Oas,?Sfz/DYn2H_u1Iay(B\u0Kg,If7Vt1Rr9[}+Nr(Mr 0W~Em<f=iHu . ] !!L!}!!""D"v""##C#w##$$K$$$%$%[%%&&;&t&&'!'\''( (I((()=){))*7*v**+8+y++,?,,- -M--..b../7//00Y00181122g233P334=445/556&6y67"7w78"8y89(99:2::;B;;2>>?V?@@@AIABB}BCMCD DDEbEFTkٱ@fAsNŠJǎh̵UШV԰ k/ەgC( 8Z ]XYZ R XYZ 'zMmft2 %0<JYk~<_3eDL.)>n G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉn G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉn G -   * Bh$Io9cFv =qK2n(h-pAdH5,+3D / ^ !!!S!!!" "U"""#-#d##$ $G$$$%2%n%%&&&d&&'"'c''(((k(()7)|)**O**+'+p+,,O,,-3--..l./ /\/0030h0011;1q1122M2223/3h3344Q4455A5~55676v66737t77868x889?99: :O::;;e;;<:<<==\==>9>>??g?@@6@m@@AAJAAAB-BfBBCCNCCDDW}WWX>XXYYCYYZ ZLZZ[[Y[[\&\k\\]:]]^ ^S^^_(_p_``9`r``a aZaab bFbbbc5cqccd'ddddeeZeeffTffggRgghhRhhiiViijj^jjk&kikkl4lxlmmEmmnnZnno,oropp:ptppq$q_qqrrMrrss?s{sst3tpttu*uhuuv$vbvvw w`wwx xaxxy#ydyyz)zkzz{2{u{{|>||} }M}}~~_~~.t4hҁ>tP2k߄TʅB7u2r4u<ŠKՋ`5}ōW6̏e4hґ=sO0iݔRȕ@}5s0p2s:}Iӛ^4{ĝ V5̟e3hѡz2p-m/p7zFл\1y½ T4˿d3g;qL„¼-fàNĉ=yŶ1oƮ,lǬ-oȱ6yɼEʊ[ˢ1y T͞3dϱ3gМ;qѧL҃һ,fӟNԉP*",3 1f95E4UT|f|v("* 4 + ?n"1q$C})y2?TOb&z_<H0 <) n5,A4QCSVYb7ovZ#C"Rl 8:ooL $ >.f bB\p UG05}J>hs  8' gp  g !\ G Q/ 4DMOU_An6f7 4 ^ (W   " 1G l p ~   #  3O P qh  o & / ,  YO T$3MINP&Wnc2s^gq   R 3 /| g&n6xM }   t ( " \) x  UN  }.xB,[)*:#!+RE%OJ%j[%w%E& &$&B)X&e& +& :' ('qS(C}( ),+>7". W:8t88 8{58Hk8P997 U9b 9 l9U:V: w;##=0&>C,5AY]p&U.0&U1P&U:'UIJ';U_%'tUz?'U (U 0(oU (V,a)V*Vu+W3-X'0Y5t4[H:`^pd  M#8S"u0/AX*z8d o1 *' : %W+@" \.=ENf35Vq ?2D>'8 :+-#00/5j@=WH1uUexxRsU"= jijz' ;X8m;oCs;Qy}d~Y/ >  ND(\ .<i luG +24rQ%{X " M\ Ro)D = km&qUy%^Q87*d\ #,A% ,-*V (>Y0" 237f'?@K4`Zlw4.0 A + ?y)1}*C0y8ETUi2l> J6 ?/ }=, A<XCZV_'iCvvg#P)_s E<v~S ( M.v iB\p&"UT75Q?ot 95 i$~' u !a V Y/ 9".W=8t888{H8H~8P99A h9l 9 9h:`: ;##*=0&>C,IAc]r&U90&U<P'UE'"UTJ'OUj&'U@'U (#U 0(U (V7a)V*Wv,W4-X'0Y5u4[H:u^{d   $)V9O" l.<BNe/HQ W1?='2 : %(0^A$X.u:IU[)sFSm ,eCbQ'X ;07289<1FAmXJqT9br_t4M 2|#' (;yR{U|]<k^N.N & !hn(y Z<< H / -RDa.z E! rp3e3)_ ,=>|}&V Ebr<=M-mn /:S6 VA*n T>u)B",C37HfHQa\5l~{WSB +h2< 0+ ?;1=CBzKXUh${VBFPJ GD% R, AT)lD-mW9sM|hw%(!v = nEi 6 y.. B\p  (%N6V|L7fAwC =^. nN = #!m o/ SDjlr'}AEmo  Q  .    " 1UG      &$ :M R o k* # b N i  yW u$3J!o&q&5xnNphr  ^ 3 Fs 7 Q  '6M    t 5( d * y 2A q ( 2f2)p:.J!OR&O& j&&E&2&JU&g*&& ,_& <'/*'V (*F( ?*&,+>?"./WE 8t&888V8{9H9P9:G9_ 9 9 ::~; ;##c=80'$>C,A]y'%UY1'+U\P'>Ue'_UtJ'U&'U@( U (_U 1(V );VWb)V*W!w,DW5.:X'1Z 5x5[H:^d8; B)N#``+x5AQ\c1${O{x$ 8Nq+\'h ;@&C' J*,W/ei7B)N^lqD/d 5 Ua;p' # ;:XKZMbP3pVr_jDxtNP,g [h' SJ;~=fC.ei B. X>(  b* >`_"da3ofgnz8Jb kS "8 :R+I?Z1\CazjwW6aJ#Z j TJe+<? v, AA{gDkWwx'+h&*'^ S N .K C'(]+)q8/L9jGYXo9E4{  DR xa H! / zDDIVlB`  =0 v  6 = D  O #I /1%G< ) , 2 =9 M%c a y  mu '   u & .b O$d4J+ot&oi !t b  / \  W< l{ 5 3>' i6M 3 8 H cu )   &, 6G{ m  { ICn79i)>:;!}R&6O&8k&@&NF=&ap&y&+&L& .' >R'^-,'Yd(YJ )+ *U,&+>J#@.`WS9t999|93I9MQW9l9 9 s9 :A:K;M!#<-##=k0'?0C$,A]'U1'UP'U'UK'U&(*UA(qU (V$ 2)%VR )Vc*PV+HWWy,W8.X'1lZA5|5i\#H;^dp4s5 {9.>iGQ2_oz,Tjw&II p6w' y#;ayA|B F0KmT_;m}7du;VZ D=' 9;ikn6ux~Q'Xtz: B m +5(@ y;? p/Z++T f Igq% ?( <# $)J0/;MHrYAm Qw( h   |) z=KN'YXjo N-&SsFtk ZBp|xMil *I>"4h; 4ePI AQa +E@:+1/D:{MhY$pUPgz e^mc X-+z uADWz#*P4-Y& Efd T m , .s^ C?X]Zq`jx[=RIZ5 N %T Q |! 9 / ECE  ) H q D @@ r  # g1]GdU `Z bh i t &  ;  r ,^ V  ' (2 q $@4VLJM'o  + X k 'v E i {  3C jp,z'6M       v 2* +H fd- } `   ?C)B}:L!!R7_&wPe&zkv&&G&&*&,s&'# 05'W A'0(](P)m *,,B>X#.Wf9Ku 9N9W99e}c9yJ9R9*9 : :: :!:;! F( ?<_#A3Jh{$'=.Z  } T] z); $=XR \TfXLw`k yM$6 {hFpA D}$K *> 'Y #.,x^BZ[c{D yL +?4#4&i9S>u .TP Y 9+5k] !,0<@2D|\%Y5XbPx {<$7  -c A1D5XAUr}&.;T 8q6   E. C~]r  >e^AO _>u [ u5: ! 0 EJ# ' 5 K Dj % 8 P kB    @ N # 2 _ C Q#6D 1G    % (P    5wd `2 2 p@ '!L%g4<Jy i n' }%p 1 B Wm qx ^ #  " V~L m<;'1vE7%jN =Y B[ Rc mow +  /A* o W~\H#"P~<):c"RU&P&l&2&GY&''-.'Pi'x 3' Dp'5K(]c(XA) *,N,>j$l.W9u999}9KD9S: :2 0:] : H:%1;Q ~;"W<#$> 0(?C>."BZ](V:2(V=Q(VF)VUL)5Vk()nVC)V * V 5*jV *W9g+W,X-X@/Y'2Z56\IG (  Z( <C$/<M50aex? tZ |g -)5p=N&NZ}56aAg )5 i21 X*l >s)0-2(87[J?dK(Zlit`b0 @_ +d6?#5jB-#AVXsI' r\ ,z@ 2$E/ }C_#`4 H`!|or jb  8- BH@EBXHQ_%p2SA4c #~m. vO X . tC^rb)-GaGVe&o i S v ' z !l c0R ME U W ] hF w. `   7  @ g ^ g 8 7 #[2#[G}     ) 4( Lf i" } : HK? SR yx%!4eJ w y( *q C f o {  W( = B~ W^O%'K07(N3   $xJ-z25J[  B 3:T_=) 3:"uRz'3Q'6l'>'KH'^ P'w'0'-' 6( H5(]:(jK)Ya *+ +W- ->%;/fW~:v:: :.~:BL:\UX:|: : u; ;Q) ;!Q<^#+=>#%>}0)@CCP.B])V3)VR)V)VM*V)*NVD*W *WF 7+IWt +Wj,uX-nXy.Y"F0Z'3[e57]HI!=O_e 8j(V%A5k g L@ Z\(c<9p4 b5R B| y a4T jq)t< > 2-~Y>*Qh.i I {B )q\=U[]!bE3iKtkFAa >=K  V/- * >_cmOh'HL@N` Wt0oyo S*ki>|~(\-Hzx k< 1s D8 u+6@6R#:T5FYlYbtnG~34Ba 9v\ 3 l, 7AEZ2\Eakxd(U *.u  rx eU  A-z lBhElYx86vM;>q  0, 8Y 5  /*e D!>@^BBsOHeR`sfM_W3%" zr p 4 ; = s"5 0 Ev {   H   V  > hr & p ( mQ X #l2Z0iH@ bD dS kk v ,   * ' s  C S[ O 0f %EQ4~aJ  ) r  4  ar 9 X '|.    Hde'h 7P&0/Wu:w{::::M :VO:;$ ;O m; ;. _`e+OR];o!+9|J(]8u-~ YW sF 1)xFl=\[$_&j*<{2<J[. oE8  hi a A)W=WX]@do}?3lW2F  ) q)=G AXr465_cl 0@@V+ ~*5> ,.3Q.;IGkViw\fMU, 7 d .+CQ?osw)^33,oGi* E-c  ,*@#6m0LT %BIK|_V ^@, d `-/ A3FhO6[S GK F ? J$ .Lf C/F3Z@Us0=F_&B}Z  ( L 6  !< h/yT LD _t4S{kTh)/VB  S  f "T ;0*F7N &R (` .w 9J H \ s0 v    O    h l | #2'Hi " & 5  M  o .  ) G. Wi N : +` }\]%n4|K0 ` c) js v # Pu   5 y( i rK~~' 7}Nz!0Q 9.$T  -q'*!3: #xR(;R(>n(F(TK(g E((6($( >) S.)fG )|G*cx+7!,d-8"".>'K0vW;.x;1;9;H;\O+;vXn;;  ; < !2[$'?1+AbC}1'C]+W5+WT+W, WP,MX,,X*H,XL -#Xt <-X .Xr.Y1/Y1ZPU3 [@'5\59^yIE?a+eE)y-{8=KeAha+?ok QQ } G>*j>6:E?XrF +vj=K~~ `e - WT*6{>7]alCU2S(5H vl 2CE k2 *L>!J)5D'VkZlNWP rz   +?;S1%Tr >.^N 5# si? H+y_@_LcN)oT`\i:y%c"#.\ #o W - f, 1A+$-72o<%IRJYxn>fXD H F[ "b- 6BH~<3>GDM[mlO+Y_ ~ Yi ZK H . pC1F6ZCXwD&3Jk*b 8 o ! ) 3 !+ / D5_7t*=AH`Viq\s9T   m  1 E w"L 11Fd i w  L    I ! A k l / $ , u "#~2dH Ep Jr Yy q 1   56 ~ .Z cl #v5D%!m5 K  *  t 2 V( =y XwM= = i#'S>7jN\_%f@s|f3=j0 fv 9ee-x K*>!:!$*S(S(o&(B) Mj))4)R:()u~) D) Z*Pg*+h+!--T#.>(11X ;y ; ; 8<  c<Q <7[ <&?$()f@^1-3B&C2D^%-lX6-rXU-X-XQ-X..XJ.UY .YB ?/ Yq /Yv09Z14Zw2[ _4\(7f]e5;l_JI]A,aefptA , ;M_3c@p}H/ \px   *?~$&+B3? N `cBvFO># h    +  ?.\]bFkw 7plVbj ^  MP ?O+YT?L+O|n*?L}U B' ) In+@#FCJE WJVkS`/pO R X M #\,# &@*b C#&R;SoKb8 f *x % q)-V AG$K7XqmZ  ";ZX }% i? * . A ).Ds C 4H1tY&*<VsDZ   0 } ,f ! ^/IJ ADMBGD[KUcuMJ3D  % \ Nu MN  v! 0a? E`u  !   0z A Gg } c   m R 8  V  V H" 1vGB O B  l    ' ( =  y J IO y$DZ3R+aIY I L S ^ 7n6 d  A &  lH "s1%Q5jkL,v =#~v>]Il ( Q'(,8\OUOQYf6x6g"C=$$ ;j >[ $Y!C*o";4#%&Sl)U)q)-* OV**7 *U?*xk* L* dw+]X+,],!5!."-|%/?*2;Xc" =z"="#= "B="m=0T"=J_"=j#7= &#= $= $>BF%>&?Q'(@3$?+zAt19/LC=C4E^_/Y8/YW/Y/YT/Z10:ZM0Z@ 0Zh D18Z 1Z}2f[%3b[4\Fm6]7(9^5=`sIChc'e[_lD"6*Mmjh3 g 1A 1i,o@Vj n zE&6J9ary|B | AQ B}1,@sEGLIUb"r.fp  T A qO t%d^,d (@O",HwDB!t1 g , ]%  , AXA8E: R?YgIV;g{VK #f R m  /T771.q-y EB+eN+$[9Ro -~  U P4  7 C.9% CT%Y8ft|d( /B r`/  E   x bAt x I/ +D 4 I  - M"} u47 J e* 'd   9 2 u & F> 1!J 0  nEB WG Y] ` j y AY tD [  Q < ?  & "~: 1F a w " -&  < E O y gv   Z   \ V 8" CJ u#uj2OH ; @ N g S    *  t ?> jX n *z+=)$3JDIYr<<ODt :U_z-&Hq5,L4/91.I8xcEVl6Y <{= Hn$5h(A8q!Ow};)>K(O1C .  + ! "*!$A;&&S+bW+es+m+{R+H++F+,, W,F r;,o, ^-"(.g!]$/-(^1J?^-3X$>}$>% >%*>%U>X%>d%>& ? .&}?C &?{ )'?T(@:)@?+A$`.qC1e2IDD7GZ^2[q:2[uZ2[~2[W3[53Q[R3[ 3\ K4Q\8 '4\s5\6~]?7]9^(2<`15@bIFde @P DR QWG ha n)    ` 9 3!R k Z Un"jKr-b aA Oe Tg alH xv +   , p ? D6Z  c f1|b-x yB ~  L  1   [  BP tvo ' } '-[-* Bh    S  ,; <= nR k  Fk  w/ y 8 ! _.# ;B 6 :! H\ _ I    [! G 2}  8h_z  . C i k, qh { Z 0 b  0 > G t &yi ! % /a Dq __% ca9 qgw r o *  D \   fB 6 v& $  ! 0,f Em 5 !J / G h H 3 I L  8,* r |  9p v "u +1J!F H ^    A  l i 8Z Tw) t k  , -  [ O D#72MG b x 3 +U    %A F q' %   ~-($3+I0^`grY?[-Z |32R'i%IZ4cpKBDL"WhC2}k(c`H >(Bv&m6!M0|-JC_n W xsZ( h9%|P2 8 I e  A 1 WE!!AD!s E! y"."k#{;!$+%p&?< *(T-oZ-rv-z-W - 8- x-P -!. g!.U "0.#/ $Z/&)0z!(1-,p3b?15YR)@) @)2@)Q@)}@^)@k)A *JAF 9*Ar +A 9+Ai,Bj.C a/C$2E316GDU<I_!7]>7]]70]7Q]\7]:7^X8^3 8Y^[ T8^ 29:^9_:_Za/(WA7b60EKdqIKg*f0 Z \ bJ l z;K .8n |/,  S / D p r xK  ='\?N  ;> e /' D/   O /BZ4r[ SE_t ! //`5 Dv5#:%H+V`5DLVl!j/K  U : j U!c / D !_Y V ' FJ;n ( k k H !v T0;EE9>,Lkei(()q k @ V z X ' Ai I "C 40*FI % : { 6 }c @ / J#  F7   Kk  "H1EG/ 5 K   0 \g O 5p VS l   = %E 78/#t2\ rH2 9I ;_ B M \ p|S t  A  /  >$%3($+Z v"~)F% $9+"gQ#b#d#l#y#J%#=d#f# $ \ s$> d!$ G!$c#+%~=$&M's't++)<0>+tUq%K0_]%Q0az%b0j%0x]%0$%0$&"0]&p0&1 |'=1F '1(1*2 +3q!.4.g2H6`@R78Z/C/C/'C/FC/rDe/Dt/D<0BDc H0D 1D O1E2E4F+6G$8HX1 a_a>Ra >a a? a A?b@AbjACbBcDd(Ge6uKgJOQjf? qD s S yMm  N  9  [ "t ] S< Y 'x f: "t$1 $NFQ V e N  O  K  _ : u XN k ? qM "=10$b9F   R  U >  9! Yi0  g   ; 3 ("1a$G G I OY Z1 i^_ }"  0( z " 6     " 31$Ge[ ` !o b  j &0 >#W ZD { > ^ 6 }  ]fV#< 2%G  , o& J zx C 9 7]B X a4   @ 5@W ;#!b2&5H $ : ~  6 Yp +S H| jf  * ~XV$%"/3H'Ih 5"L)5EYtNrrG 6u j($# 3'.JPIaL3)G_ vx:r/ 5%P$24)KQd|;"R$&bT1 pr,8""6&%5*~L`bivhP>Q)k .NN! $' 'v7,sN,{}+4[Z>UfJ  h !@"sx $*<&S(\*"8/2 PR!{!7!!!" "H"%"&#UW # |$ }& 3'!Z\*M"{* -$:3&dS&i'd&o'f&'n &'|&'U&'L'<'z'''(}(R(D (( |)(+),*\ /+,631-4=8}/V-t4b-z4-4-4e-4/. 42.P4o.5 .5J /q5 0516;52W6n477"L68.::A@,=*[7HF7HI7HR7H`8Hup8>H8H8H \98I %9I> m:aI;YJEK%$AxL2mEqNEhK QK`FkeIFreiFeFejFeLGfmG^f: Gfc sHf WHfISg%/JWg KhKMiA(Pj6TlJZoPg^JO! _(Oz4DaX/ q,TX o  !yt r"$W&$L*:3/<.I]8b; rBPM]cq1!.hZ #s 5 ! w" $k&$V*O43/PIITh7Z5b ]C}  ! "Y$'$w*3/J  ['M)p~=AW@ to S !R "'\ #W%'u$* 4/"Jjze| O ? P ) L!Bx! ," #%IM'O$+|4c0J # (+ 9q T { ` d!0!5!b" P#Z $"&?7(?%O,/41:Kv " :!!!!G!yv!}!3"QV"#S |$* '%]d'])h%-5c2 L(!4!L! ", "7<"iR"l"#BB#$E %|d&R( J*&7.K63tL"I"a##"%#I#{#$$VBl$qF%Z &4'j)%V+f&/)64DM$Id$O}$`$|D$$%%]'*%L&|& /'(p*h:-|'j075( n( )s*,c/|(N287!NPg(((0) )3i)gT);t)\*IR* J+W ,8^-y/B 1!)~5t#p:7:%R],$ ,$;,$,$+,$>-&$V-g$s-$K. $.$ /!%9 0%1M&23'5(*+9n)<5>,,T1-11-41-<2-J28-]c2o-v`2-3-3\-3. 4w.a 5b.6/c80; ;71m-?3">Dv5X>9P:h9V:9i:9:p9:=9:D:2;:;5:;` ;[; <;<T<@@="B?/F@BLCc\rDNDNDN D:NDhN}DNDOE@O> wEOk FF O FOGPlI6Q)K6Q%NSL3 RU(F?WWaSklQSrlqSlSlvSlYTl~Tal Tm& U!mV tUmV_mZWhneEXoBZp )2]ql7Wb)saKh1v*hO-:-<-DN-P-at.wQ.X_../k0 G 0M2/,3X6&c:56U?yMy-U-X-_P-k-|v.,R.ma.// 0c 1Q2DH4_6&l:J6`?M-- -T. .6{.jX.g./NC/r0] 1@_24NZt6m&:6?(M.?..E1.V8[.sD.V.lb/r/]/(0%0= 1u2$47G&:6@<M...f//+/_+o/F/f0D;01T 27^3{5H7&;H7 @Nb//(/s// 0#0V>0_0S1k62  2X43168'=0T13p11p2IX2* 35j6K9y'=,7B| Oz1b11hJ1z1112722"3NS~3 :467K:f(>;8lC"?D?@AKABC;CD{EEFLFGyH HI0IJLJKcKLuLMNNO OP PQQQRsRScSTOTU8UVVVWoWXLXY'YYZiZ[=[\\u\]B]^ ^p^_7__`^`a aab?bbcZcddpde'eef7ffgCgghKhhiOiijOjjkMkklGllm?mmn3nno#osoppappqLqqr4rrssfsstIttu)usuvvPvvw+wtwxxLxxy"yiyyzfߔ.V}̔@fٕ$Joߗ)Mrޘ&Jnט@c˙1Suښ>^#Ccœ"Aaݝ:XwҞ,Jgޟ6SpǠ9Vrǡ6Rnۢ-Gc~Σ8Rmդ #=Voե!:SlϦ1Ibzçۧ #:RjȨߨ%=Tkǩީ "9Oe|ժ.DZpǫݫ3I^sɬެ2G[pĭح*?Sg|ͮ 0DXlί 0CWj}ɰܰ(;Nasб-?QdvѲ+=Oas˳ݳ#5GXi{д&7HYj{ϵ"3DTeuǶض)9IYiyɷٷ (8GWgwĸԸ!1@O_n}ɹع#2AP_n}Ǻֺ-LYgtľҾ߾!.GQ[dnxˁˋ˔˞˧˱˺#,5?HQ[dnẁ̸̜̥̯̊̓ '0:CLU^gpz͕̓͌ͧ͞Ͱ͹ %.7@IRZclu~·ΐΘΡΪγλ %-6?HPYbjs|τύϖϞϧϯϸ'08@IQZbks|ЄЌЕНХЮжо "*3;CKT\dlu}хэіўѦѮѶѾ(07?GPW_gow҇ҐҗҟҨүҷҿ'/6>FNV]emt|ӄӌӔӜӣӫӳӻ&.5=ELT\ckrzԁԉԑԘԠԧԯԷԾ '.5=DLS[bjqyՀՇՏՖ՝ելճջ !)07?FMT\cjqxրև֎ֱָ֣֪֕֜$+29@GNU\cjqx׆׍הכעשװ׷׾ &-4;BIOV]dkry؀؆؍ؔ؛ءبدضؼ")06=DJQX^elryـنٍٔٚ١٨ٮٵټ %,29?FLSY`flsyڀچڍړښڠڧڭڴں!(.4;AGNT[agntzہۇۍ۔ۭۚ۠ۧ۳۹ $*06DJOU[agmsy~ބފސޖޜޢާޭ޳޹޿ !',28=CIOTZ`ekqw|߂߈ߍߓߙߟߤߪ߰ߵ߻  &,17BGLPUZ_chmqv{ $)-27;@DIMRV[_dimrv{  $)-26;?DHLQUZ^bgkotx} "'+/48BFJNRVZ^bfjnrvz~ "&*.26:=AEIMQUX\`dhlptw{  $'+/37:>BFIMQUX\`dhkoswz~ "&*-158<@CGKNRVY]aehlpsw{~ "%)-048;?BFIMPTX[_bfimptw{ !%),037:>AEHLOSVZ]adhknruy| "%(,/369=@DGJNQUX\_bfimpswz~ "&),036:=@DGJNQTW[^aehkorux| "%),/269AEHKNQTWZ]`cfilorux{~ "%(+.147:=@CEHKNQTWZ]`cfilorux{~  #&),/258;>@CFILORUX[]`cfiloruxz} !$'*,/258;>@CFILNQTWZ]_behkmpsvy{~ !$&),/247:=?BEHJMPSVX[^acfiloqtwz| "%(*-0358;=@CFHKMPSUX[]`cehkmpsux{}  "%(*-0257:=?BDGJLORTWY\_adgilnqtvy{~ !$&)+.0368;=@CEHJMORTWY\_adfiknpsvx{} !#&(+-0257:O??@^A ABWBCD=DEvFFG>GHeHIJJK,KL>LMLMNSNOWOPUPQPQRGRS:ST)TUUUVoVWRWX1XYY{YZTZ[)[[\d\]3]]^d^_-__`V`aazab9bbcTcddlde$eef4ffgAgghJhhiOiijQjjkOkklJllmBmmn7nno(oyoppgpqqSqqrrي @s׋ ;lό0`O~ێ 7eHuΏ%Q}Ӑ)T~ґ&Py˒En5]Ҕ Gm+Pv /Sx,Psݙ#FiЙ6Y{ߛ"Cdƛ(Hhǜ'FeÝ>]{֞0Nlş:Wtˠ Xq֥ ";TmЦ2Jb{çۧ #;SjȨߨ%=Tkǩݩ !8Oe{Ԫ-CYoƫܫ2G]rǬܬ0EZo­֭(=Qezʮޮ.AUi}˯߯-ATg{ǰڰ&9L^qα+=Obtϲ);M_qʳ۳"4EWhyϴ%6GXizϵߵ"2CTduǶ׶)9IYiyɷٷ (8HWgwĸԸ!1@P_n}ʹٹ$3BQ`o~Ⱥ׺ .=KZiwλܻ#2@N\jyͼۼ!/=JXftƽԽ %3@M[hvƾԾ #0>KXerͿڿ'4AN[ht %1>JWcp})5AMYeq}‰–¢®º %1=IUalxÄÐÜçóÿ'3>JUalxăďĚĥıļ #/:EP[fq}ňœŞŪŵ #.9DOZep{ƆƑƜƧƲƼ(3=HS]hr}LjǒǝǧDzǼ&0:EOZdnyȃȎȘȢȭȷ (2HQ[enx˂ˋ˕˞˨˱˻#,6?HR[enẃ̸̜̦̯̊̓ '1:CLU^hqz͕̓͌ͧ͞Ͱ͹ %.7@IR[clu~·ΐΘΡΪγλ %-6?HPYbjs|τύϖϞϧϯϸ'/8@IQZbks|ЄЌЕНХЭжо "*2;CKS\dlu}хэѕўѦѮѶѾ'/7?GOW_gow҇ҏҗҟҧүҷҿ'.6>FNU]elt|ӄӋӓӛӣӫӳӻ&-5=DLT[cjryԁԉԐԘԟԧԯԶԾ&.5=DKSZbiqxՀՇՎՖ՝դլճպ !(07>EMT[bjqxֆ֍ֱָֿ֣֪֔֜#*29@GNU\cjqx׆׍הכעשׯ׶׽ &,3:AHOV]cjqx؆،ؚؓءبخصؼ !(/6EKRX_elryچڌړڙڠڦڬڳڹ  '-4:@GMSZ`gmszۀۆۍۓۙ۟ۦ۬۲۹ۿ #)/5CHMRW\afkoty~ "',05:?CHMRV[`ejnsx} !&+049>BGLPUZ^chlqvz $)-26;@DIMRV[_dhmrv{  $)-26;?DHLQUY^bgkotx} "'+/48BFIMQUY]adhlptx|  $(,037;?BFJNQUY]adhlpsw{ #'*.259=@DHKOSVZ^aeilptw{ "&*-148BEILPSWZ^adhkorvy} "%),036:=ADGKNRUY\_cfjmptw{~ #&)-037:=ADGKNQTX[^behloruy| "&),/369<@CFIMPSVZ]`cgjmptwz}  #&)-0369<@CFILOSVY\_behlorux{~  #&),/259ACFILORUX[^`cfilorux{} !$'*-/258;>@CFILOQTWZ]_behknpsvy|~ !$'),/247:=?BEHKMPSVX[^adfiloqtwz|  "%(*-0358;>@CFHKNPSVX[]`cehkmpsux{}  "%(*-0257:=?BDGJLORTWY\_adgilnqtvy{~ !$&)+.0368;=@BEHJMORTWY\_adfiknpsvx{} !#&(+-0257:\??@jAABbCCDHDEFFGHGHoIIJJK5KLGLMTMN\NO_OP]PQWQRORSAST0TUUVVvVWXWX7XYYYZYZ[/[\\i\]8]^^j^_2__`[`aa~abWp֥";TmϦ1Jb{çۧ #;RjȨߨ%=Tkǩީ "8Oe{ժ-CYoƫܫ2H]rȬݬ1FZo­׭)>Rfzˮ߮/BVj~̯.BUh|Ȱ۰':M_rϱ,>Pcuв*KXerοۿ(5AN[hu %1>KWdp})5AMYer~Š–¢®º%1=IUamyÅÐÜèóÿ'3>JUalxăďĚĦıĽ $/:EP\gr}ňœşŪŵ #/:EPZep{ƆƑƜƧƲƽ(3>HS^hs}LjǒǝǨDzǽ&0;EOZdoyȄȎȘȣȭȸ (2HR[eox˂ˋ˕˞˨˱˻#-6?IR[enx̸̝̦̯́̊̓ (1:CLU_hqz͕̓͌ͧ͞Ͱ͹ %.7@IR[dmu~·ΐΙΡΪγμ %.6?HPYbjs|τύϖϞϧϰϸ'08AIQZbks|ЄЌЕНХЮжо "+3;CKT\dmu}хюіўѦѮѶѾ (08@HPX`hpxҀ҈ҐҘҠҨҰҸ'/7>FNV]emt|ӄӌӔӛӣӫӳӻ&.5=ELT[ckrzԁԉԑԘԠԧԯԶԾ '.5=DLS[bjqxՀՇՏՖ՝ելճջ !)07?FMT[cjqxրև֎ֱָֿ֣֪֕֜$+29@GNU\cjqx׆׍הכעשװ׷׾ &-4;AHOV]dkrx؆؍ؚؔءبدصؼ ")/6=DJQX^elryـنٍٔٚ١٨ٮٵټ %+28?ELRY_flsyڀچڍړڙڠڦڭڳں!'.4:AGNTZagmtzۀۇۍۓۚ۠ۦ۬۳۹ۿ #*06CHMRW\afkpuy~ "',15:?DHMRW[`ejnsx} "&+049>BGLPUZ^chlqvz $)-26;@DIMRV[_dhmrv{  $)-26;?CHLQUZ^bgkotx} "'+/48AEIMQUY]`dhlptx{  $(+/37;>BFJMQUY\`dhkosw{~ #&*.159<@DGKORVZ]aehlpsw{~ "&)-048;?BFJMQTX[_bfimqtx{ "%),037:>AEHLOSVZ]adhkorvy} "%),/36:=@DGKNRUX\_cfimptw{~ "&),036:=ADGJNQTX[^behkoruy| "&),/369<@CFILPSVY]`cfjmpswz}  #&),0369<@CFILORVY\_behkorux{~  #&),/258ACFILORUX[^`cfilorux{} !$'*-/258;>ACFILOQTWZ]_behkmpsvy|~ !$'),/247:=@BEHKMPSVX[^adfiloqtwz}  "%(*-0358;>@CFHKNPSVX[^`cehkmpsux{}  "%(*-0257:=?BEGJLORTWY\_adgilnqtvy|~ !$&)+.1368;=@CEHJMORTWZ\_adfiknqsvx{} !#&(+-0257:K 1aa1\ 1;Y100D0;Y/m/,R~. l--<,Y+=9*0R)a&kQhSAlA cAA.pAZAFA T@i @#}x? ?>D}=U*< :A9P6BRyZR@R@ !JR53R ,Q>HQQqQQe/oPy:PvXOOCNPM ^KwJ JQ9ab#b bb+b]<b)Naaaua:7`Ě``5_Bk^3\zZ[SKls@s sr)r:ErLr|_-r2r<qㅇqpp#o]mPlNkRSdwMoo e8U(>9aJ\ouw#m˙~e@}}Rkh!" 0#'7HZfl3}wBFqdɯ9T 5&6\֢FMXi|&`I!&дPeٺaS 62y%\4DUfxlF+ 9vTr½P¸ >¸x¸$5³3­BžR˜c‡tvWbX3#lsUҦҦ 0Ҩeң"ң1oқ@ҘPJґ`҅qR/xiguL&:ѓX !T/6>M']m;}Ss_DY*ݿ RF3 .U<KDZj2|3uZiX=4Qb"2AP `^ r1+M'/c]6f6iJ&1:glOF.&cin"w} ÚO m Iz ƛ { Q /3+x 7$&8'M6b vO q" B F t. -e ] " i f! , 7! 4:HGj]|\rJ \ Ǘd B 2 Ň KM: m DK 1\r 1?  1+ z00 0D 0PX L/m_ Z/ - . )- -: R,] *+N. #*3F )X%QT CA OA UA @A.X AWA7 AT @h H@}\ ? ? >7s >=Q j<Һ :7 9Q a6$R[ R9 R3 & R- R , Q> QQ QIe! Py( PE O UO? NQ M K nJ wJQa &b Mb |b Nb~+ RbV< b%N &aa aux a4 `` J`. @_> <^. \v Z [Sl 2s s hs r) 8r: "rL ~rp_. %r.r5 >q݅ q $p쩶 p$ oX m kKkaSwT k i c8 ʃN( փ79] J \ o| rr  c ˑ p~b w} }S2p   2 | ۓ' 7 H Z l zs @C W wob qɤ W۸  U7T ( & D& 6[ F 2X hi |" ^G $ $̴ _Mc Sٸ T O_Te  3 %\ &4 ²D DU f x k D+ % 8f T鬥 ½ ¸ ? ¶z ´$4 ¯3 ¨B *R ”c †t QtS X 1 ~ #k ZuVh ҥ ҥ - TҤ Ң" Qҟ1q қ@ |ҕPK Ҏ` ҄qP wf Rfr SK W$  vђ 0mX 2 ! 0/ B> M S] #m .}T q T^ D " jYݿ U M  .Z < KC Z j1 }|5 u i W =  Q/"2hArP `[r1'a(1b7[f6##|"&#!8l M&a(vUCə)-ܷ\d[$U""A!"!ig6 o Km ` u    ޶ ( ը N> M S  / , 3H\!\qsNG"IRxHqG01 E000M0QDT/X/el.݁M.j-㣔Y-&,0I+? *!.(H&ST;=AWA ZAvAb.7(A!A@T@vh?}?tW>ࠀ>#D_=7<ҝc:"9LJ69T[<PRVR 2.Qr Q,} Q>Q{QqQ(dPxPhDOߝ\DON<vM2KI'KSab2b @brQbT*Fb6<bN"aaa~uTa`a` _*G^\gKZy%[Ulrr rr)r:rLrX_irr&q̅g$qhVpթpo I[m*kBJkUwnOP uGB?(9VJ\΂ol҂`_QZ㹀M˅~Y| '}T삄( :9Y'G7+Hr{0H["ٱȞZV ۲9%Y4첱D۲UϲfղxҲd=$۲1aZ,V1¹´ G³}®$6"«3£B6šRKŽc ‚t:nLU,!grXҩ}Ң mҢiҠ#qҝ1svҘ@ҒPLҋ`gҁqIgv_qdnHZ!@[ѐDjZ/ !/>M]m{Ro]Bx[7ݿ ^R .\<KDZj.||2thV;Sc1N R+"Z2YAzCP+`<r($+3b9f9466BH5'!95]$5<4cJ%3^2+s00 B%/.q],+u*u')8%25A5 5(u5H 4;43 I]2 ^1 mr0 L/ 6/ . , Ũ+ Q*g r)! !$TR 22 2924q2k1F1m[$07o/߄/0n.oL-v,i+Z7*')$WO0<0K0"0X */0S/0///C/L/iW./k.N.-.1-T-,,9+, Ä*+*)((#%`&EWT-A!-A -AV-@--@@-w@qT'-H@h,?|d,?(.,[> +=+4<*j;a):(k91g&A6hX[,nQ,WQ Q,=QS,$Q,:,/Q^>Y,QQ"+Pd+Px+eP"+0O*NޮV*JN)Lл)K~(Iv2|LWb.*b4a*b0 *b-*b**a<^*aN*aa*ka?u*Z`܈W*!`r")_ϫ)e_u)]({\{F'Z_/[YGm#)r)r )r)r))r:)rUL)lr)^)_qq)Bq/)q8f(pt(ob(Jn('m'Gk,(lYbw( ( &((((e9>(J(`\(kroI(p27(C(h/'〿a'j'1~A&|v}X'' 1''''7'H'XZp'a}l'NA';''Ť&M?&Ʌ&۝&c{%$YǏ&& &s&e&|&n6T&F&lX&ai&Zf|&L>(&&&3L%٢%P$OY%O%W %i<%o%_%{4%LD%?Uy%4f%8rx%FW%#/%$ױĿ$ܱ$W$w$AZ2$C©$@ª O$1©}$ ¦$7$¡2$%šB$‘R$‡c$yt$ gB#L$ ###Ծ#_#[j[#ң# Ҝ "қ"Қ#"Җ1u"Ғ@"ҌPN"҅`"|qI"oY"]j"C"""ъ"df\!! !"!!!/!>!M!]!m!wM!k!Y!>!!!j]ݺ v ] .` < KG Z j, z|/ q e S 9  qW)('"Fu"eg2;:AkPo`B Kr#.%,*39c=[b>HH HMG2FGEF[D?pCT3BGA@^W>=K;94^QOH G G ZOG1 2F FE [fD EpC ̄B A d@G > =3 ;p 9 4c^OEE wEEE1DEDD YDComBcA7@Ĥ?$">U2< H;3KZ9wf4\PB/B/ B/0B/^/;B8/'BA.ViAI.j@.:@A-?i-3>,z=p+<)*X:)97(5j&]UJ@F@h@@z @@bA?@T-?@@??Sq?E?gD>?{>b>]=>:X=e=T:Lq9yKSv82II>3L]Mb;a< a < ao<a*;a<;adNR;a+a;}`t;S`;`:_:0^-9n]ε8\T7Z8<[j^m:mrg:hrg :fr]:OrO):]r-::?rLJ:q^9qq9qH9p9fph49 o(8n7mXޙ6k 5l^w88 I88(8ケ9 8ԂJ~8i\w8/o88Y8,2747A6~X66|2#|]ӂ77 7x7o'777vH7nrZL7UNl7Y!776ؑ6ze6ۀ5pFc4͌^֐66 56 &~56<5F6{W5ci5ʢJ{5͢ 55s5534oٌ43;_ 4j4j 4I4x%`4[44}D4nUk4Grf4B^xs44D4H4 3ڱĮ3űF3hg2w_Y2œ2œ o2›2˜$2’32‹B2ƒR2wc2lt2X42>2v2p2IԱ2 T1_`e1AҘ1@ғ 1AҒ1BҐ"1*Ҍ1e1F҈@1-҂PE1%|`1rq:1+eL1T]1 9000с0s^br/F/ //!///>/M/]/ym/qA/e/Sz/u8/]/D/)c. .# .%D.( .&.S."<.,K?.+~Z.&zj'.u|+.#m.a.P.5- -\3>2Q-(N)""z)2J)A~+$P+`M,Dr.+15E:AgFgE[cZ $Z :Z<L0YPDXYWmVF]UTS# QVOq:MhOKE_EdOZ EZ} ! Z4 LY .0Y9 DXh XW mHV U iTh `S QG !Ok MX ;K1 XRE{ dtOXX| Xb|W/WCMVnW+VVkU{MTrSGRTղPgROӡMTJEcePtU.U. U.U.y.lUD.LA]T.'TTE-iS-y}S-*-R6,àQ,:O+,NQ*L)?J(F'$cUoS?R? R?R?-R?S?YRN?!RxQ>f)Qx>zIQ >,QPo=dO=N<_MC;gшK:0PJ8K;d\FPkP}PUP PFPP3Pn+PPA=uOPPOOcZORO}wNO-SNyNʛMN#OMMaLLW JK$I^I LLd bNaJN aG Na=QMa'*sMa;M`MM``MO`atM`NL_@LO_K^ZJ]U`I\ HZuJ[.exmLqLq KqKq)hKq:VKqKKqh^HK{q-q0KRphKpJp JFoXIn^̰Hm_GkxDmjdwJ<|!J:{ AJ6wJ5h(oJ)M8J 2JEI \7InIIRGIGۦH8HzL G~F|D{dHHz H|{tHtq'{Hjc7H^MHHI1ZH.lDH#~G񑰑G̑_kG}G D8FWXEΎADٌueFF FF}&fF~u6#FxfFFjQWFb9iFP{F+EEѡkEENmD~aCϞ~eDD D!D%KDx4DyqDDwdUPDnRfDd>xIDK%Dn`@]dq,@:Y@@0GM@ -@ ??u?YTi>^>d >Z >T!>W/>c>{>U{M>Uv]>]om>Sh6>B\>1Jr>0>==wjJ<,/<;c>>=;6u7N"72L8 A8P9"`Q:@r*;7=qAEJbMdNmRHmJ m%4l/DlEBk=Vjf> 0e>{e>,_e>>|eI>gQvd>'ddj=xc=cR=Sb^m]Hc3Oc.O cOcO+:bO^q(: ]qK]p]]pp]]pi]%p 6\ok\!nt[hmWZclYk1UMmmxx\&\& T\\(H\ 8[J[݁[[anW[*)[D[p[ZѸY~ʾY$}ܮX|4mVzFmorZ+Z) Z&ZZ 'WZ 7|YHTY͑YYkY~xYu\cY-"XӐXQW#VȍUAmѐWNWK WȢHWD&IW76W+FyWWWiNWq{hWJWVۡ8OVUCUC6oT`^n UVbUP_ kUC^)UDY%7UIR4U:JDU!>U5U-foUxTxT߱؞TTqNqSSs3yRƯFoRmRm ZRlyRj$Re2R\BRTRRJcrR=tR*RvRLR#Q]ԉQv/P:oP/xP9s P:rP5p"Pn1KP"i@sP3bP+P]`sPSqP G&O6:OOOѺѺO`eNEqMzMy MxMw!Mv/Ms>tMoMMj]vMdmM\&MPM>cMi$MZM"LmrK1{"K3{ tK6{GK4z K1y.PK7v<|K7tK3K"qZvK(mjKh|K%`KTKBJ'JJlKK(HEqE"E2ZFVAFPG1`\Gr(H8J]MQV8hYgYQv co<n'.~w@~0TX}vhQ||{pz3y'ewYutrwoulUvYOJ D W i~ )-~y r@} /T*}B h|^ M|f{| ?Se|#g/{`{[zYy|Nx@>Cv(tyroa`,nR*nvjR{,{, ={,{y,,{),?z,Rz6,Zey,/yx+x'+w +/(u*Bs*>ql)Gn(kn 3vWmy=x= x=x=+x==xC=P\w=Rcwi=wfv<ъv9w]vNvN vNuN*uNJa9m8IVlvKwHdsT_sR_ sH_s4_)s_:r_Lr_P_Erq_rpr$^҅q^zq)^pU]`oE\{qm[LlYakp`?2 `>`_྾_ѦѦ_sR^3|%]uq]zk ]zj]vi!]og/]id>p]n`M]g[]i]`Um]_M]NB]>0S]]\\y`|Zxq7Zvq ZxqRZyp Zlo.NZkm<{ZsjK)ZggZmZgcj Z`^| Z\VZHJZ@8xZ!YYw?YY VTNT"T2}TAUDPU`kVUr3W1BXZ^:bykeie" #]폝,XR?8Rcsf }z'IFF! gzm.<2|"PX ( p  4Ǐp W,ʏ, 2? CR@O e܍ /y ; ! Kv c |Y V+& bs$/Q[ώ R,}O>Que'UyAN8fɮʈ':I)iS0, .+ #+++Ԍ+=݌n+P+c+YwNJ+F?+eQ*ׇ*:+E)]) c`(7:~1X?<< <<+<<ŠbamNMmI]RmDmqm|<me0mmV@m9mλllnP􈇐jlj"e nj!e\jd jb.Njai-ki˸iiP{gghecr6c"c2cAd,Qd`xer?eLfi%ko)hr,iq n +Оb=APiGcSwߊ.ל"IYHm;L-g& :SN D w  t +@ = PJ c2 wZ 劏 / í ~ C, >" 7!CS2R ŝT؝++{=DYO c v)׉ǛS!< 퐝'lV!++* ++ *v+|񇭮0W Ho#2B*R=bvtj^GtM<[6M1]<+m[$O&qΤ~;s|[| U `| US|T {S.;{Q4*5 *G u*A*X*#;J3)MX)` )sBg))~e)]f) @((&nI'f.U/[fh:f: Z:P:)6:::L:|_:LrX:3P:ow9u9Il8:q8*Ԥ7V3;_KK QK]K)K9ϩKKwK^]GKBp K¨JIJCJUI|JH GMs%gZ\T\ PQ\H\(o7\8\Jb\d\Z\8o \O[є[^[Zb2Y!XaɠY#omNm mm'Ԧm8+rmIDTmmZ-mEmMmlqlmlΤOkkej| iLygzaz~~ ޤ~c~'C~7Q~H-~oY~Jk`~!~2}+}棆}n|qɢ#{zGxT[ &6_׏FŏX}i墑Y|h31%&ӎޡ\ _QٰD̞iV %Ѡ5DE|wVTkcgƠRNy7+]TśΞds<; q8 4$03'C̝TA eXͰvӝ,ŝ]Hw&H裛s睆 0"P#؛2A RbwsgM+c ۙ=拘ֿ!#3 "—1@O_痽pzƒxѱї"ZsN<;!*{ԞUWW ݔZP!V/R>9IMfE]; m12($ʻe΃mm SBC= q=V< ;.:9<]7K4Z~H縳Hkܷ GѵFEh@[1=[, 9['/['˹"[8 ZIZZָZm>ZlZrոZ0ZYY80XvW}۳}V:ppl5l5 l6[l0'Kl 7WlH1kYkkշek~d2k}dk1jŶj>>i`-hVfǫg{}E}@ }<y}-&l}%6\}GFJ|X0|jp|||൫|=U{յW{@ʹ-zq?yL0w e-쎮+쎭 ̴莫&3׎5ǴɎF6~W@dh㴌Czi!4-퍑쳃ƈgq#&&t 2%r4ٲٟD̟Uf{x]f28%(͞TyWկP_ Ⱄ$3CdSȰrtdİcbv.MM-/RYժŮ3Y64 3/1#®+2X&AQbB sAIíZH|4E`%џ%џ $ў#ќ"љ0ѕ?ѐOvъ_тp wfDOϪ+rЩਫ਼;{} ާ!/>M;\lm“Ყ§ᙻ.}tO>>=%^ ? .mބml N#3B(Qf`ş=rvvd{}o+(F8̻I̥[xpn/LKHDʟ@ʚɷyܝȃ`"߻2W    (/ 8̱ I̕ [l Mn%B  ˷ Φ6? wʖ ʒɯ ܖ| Z ڻ4X>̴̵ ̭̤ (̒#8~I`[u< m ˉզImjɉ\s]=û:͵43 3޻1!~1/^+='L'\l wgoQݺ,2㽥'! P; r.< JYin {S͐¤77sQg==AD$13B{ Q1aHrt'˴ڂsFܬܯܨ+ܡ&ܗ6܈GlfXSj4}9^8 &ge|?HUXܝ ܠ ܚ $ܒ &܈ 6z Ge XL j- }. W *y ʵ V Un Up: ^DVYx{yuypN&di6V`G|D:X*Gj T}G1ۭ0Z(;:VX&T0[Z;&6& 2&,&&#&6&GD&X&j`&|ۨ&n& &ZYڬ&1%(%+%) ~_66r 6x6~&۹6x6f۬6dFۛ6RX'ۃ6Uih6G|,E6*m6 T5T5lٵ5Wٶ4׾47YcEF@F >F8F&\/F6"FFFWFi[Fk{FLڐF)HErEIEAH}DhCzmjڛW7ڕW1 ڒW4ڍW1&ڄW.5xW"FjWWVVh>VzVώVٰVfOV[UT Tjrhh {h bh %g5EٶgE٦gV`ٕgg~gycg9goAg%آfŮ!fC ne{zd̘}yx x,x%hx4xDxUؿxfثxxؑxkx[U3x=wlwlvVuA̐83 h1-%&4?ڋD-ϋTe׮wtיɊw5Fc8֑֑ .Q̜֝*֝* ?֛*֘%$֓3֌C@ւ SwdhuU׉69̜@op@=cYĠ >F#쮝2箖B ߮R*ԮbʮvsԹf4ԢLԀ%"K,ӏ'|$c "￿#.뿻1迴@࿰P~ؿ`ѿqĿұ~Ҕa!l56--վT0ДДГГ ГГВБ"^ЎЏ0_ЌЋ?;ІІNЀЁ^{znrpbbLM,.ϻϺXǗ/7/ /-!X+/*)=&L"\4l~p ͺn͖͗eHQ66 \6#6 e6-4;0J-Y+i$z񁏸vgO,ʍƴgƻ$3BQa:rSǼ OڍxȑmpkPTq%j5.`EcRV1Bg-y_sSk;;T`W=h k g m[b %[ U5Q TEOC V!3 g yO \ O tg u+ %+B TWQSO_K%C5:E>,V gly3|n~:iQV/2EY$%%%!%F%%%4 %E%U%g=%x%G%pe%Kw%<%%ץ$${&0_{44 D4$4%m444D4U4f4x~4Z4A#4s/4Gb4i339aD{D SyDuD%DoD4fDDZDUEMDf:Dx+"DxxD`D3CćCuC=uBijT]T oTT%T4NTDBTTTfTwTTQ[TgSTS֭SEIR_qyese Xqene$he3ae}CVevTXHekem:eVv$e>5eddÏ2dSv2dvv!vokuߜAuu]t՟"tK!kst = Vr$F33B툪S"㈘cֈu5Ĉny詈P胈!NI:h}}Ӆ|B]A 3>?;#620B &R7ޛbқsš,竚牚3U5 &杙 2槭(榭) 椭)棭&#c栭 1暭A/攭Q 挭 a悭rZtwaݙ\EجEyzL=~ "1 @꾏O侉_ݾpWѾuRdr䩾J䇾$%O,㔽(DϽϽ Ͻ(ϻ"Ϲ/ϵ>ϱMϫ]ϥnϝϐ}`'n65./ΞW P !+.=CL.[kwy{}pqRbcPMM-.߻ߺ{{., >,+ 8*-);&J-#Y7 hz\/ gݼzݘݙgJKE-"$%&4(CO*RM-a{3s;Fbڒڐ5S6TlGN$J3iDC;S]/dCuPt4s.fMOF GG 5D UA -$t< 3Z6 C - SS" d5 Du  F " 0q2 ,*  OQf5 741$f,3X%BSJd&uk戲؜5ۯrxb$mOS}$$$q$z$[$y3@${B$kS*$bd$`uG$X$c$@P]$1C $##NWW343;3:o36$O3A3$3"B3-R3c3#u 3S3i2022j2ef2M]BB DBnB$B3BBBRBcxBtgBvNBl*BGB%Aԗ4A-A-Ed|QRQR EPRTMR$IR2CRBPN^dp/Ɯlڕ,XBC7+7)/d+<L[myE~,ƀ*ڣ8I@@:+$A)0 :TJYqZ!kmU%( ,d5:ں=S8NVLF;1&2n*(3:5"KQ6[8Qn:3rNqAOVrF_sru&qvx+y{lK}!VF1T AQbGtb*堑AFV8$&4FYaV~fy1qj#|"Jp*v:jIRZj8I| X7.Nȷ! .7.=:pLɾ\lm1.u{t^̤ݡa #=.=H L[-[Yl܆~b֓(ݔ ]k,1[>}? >t5F-I;zOIUX\h'fyom)g ^ J-:H7Voev82-  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~XYZ ~ffXYZ sig dcpjDisplayCAL-3.5.0.0/DisplayCAL/ref/sRGB.gam0000644000076500000000000014054212665102037017472 0ustar devwheel00000000000000GAMUT DESCRIPTOR "Argyll Gamut surface poligon data" ORIGINATOR "Argyll CMS gamut library" CREATED "Mon Feb 27 17:52:18 2012" KEYWORD "COLOR_REP" COLOR_REP "LAB" KEYWORD "GAMUT_CENTER" GAMUT_CENTER "50.000000 0.000000 0.000000" KEYWORD "CSPACE_WHITE" CSPACE_WHITE "100.000000 0.000000 0.000000" KEYWORD "GAMUT_WHITE" GAMUT_WHITE "100.000000 0.000000 0.000000" KEYWORD "CSPACE_BLACK" CSPACE_BLACK "0.000000 0.000000 0.000000" KEYWORD "GAMUT_BLACK" GAMUT_BLACK "0.000000 0.000000 0.000000" KEYWORD "CUSP_RED" CUSP_RED "54.285218 80.831212 69.906123" KEYWORD "CUSP_YELLOW" CUSP_YELLOW "97.606872 -15.749582 93.393749" KEYWORD "CUSP_GREEN" CUSP_GREEN "87.820812 -79.285064 80.992273" KEYWORD "CUSP_CYAN" CUSP_CYAN "90.668324 -50.669405 -14.959304" KEYWORD "CUSP_BLUE" CUSP_BLUE "29.569144 68.284819 -112.028372" KEYWORD "CUSP_MAGENTA" CUSP_MAGENTA "60.164709 93.561017 -60.506472" # First come the triangle verticy location KEYWORD "VERTEX_NO" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT VERTEX_NO LAB_L LAB_A LAB_B END_DATA_FORMAT NUMBER_OF_SETS 926 BEGIN_DATA 0 87.821 -79.285 80.992 1 29.569 68.285 -112.03 2 54.285 80.831 69.906 3 97.607 -15.750 93.394 4 60.165 93.561 -60.506 5 89.278 -67.352 82.866 6 34.281 54.699 -104.16 7 40.402 38.487 -94.003 8 93.178 -7.8376 90.364 9 90.861 -55.660 84.889 10 90.674 -56.982 84.651 11 91.255 -52.924 85.391 12 91.462 -51.515 85.654 13 88.817 0.31307 87.444 14 92.120 -47.130 86.491 15 92.353 -45.620 86.786 16 62.053 59.891 72.192 17 62.733 58.143 72.474 18 93.611 -37.765 88.379 19 84.548 8.6680 84.657 20 66.486 48.735 74.186 21 59.596 66.318 71.264 22 67.302 46.745 74.588 23 93.882 -36.140 88.721 24 59.052 67.765 71.079 25 45.751 25.572 -85.210 26 95.329 -27.812 90.543 27 95.637 -26.111 90.929 28 65.692 50.694 73.804 29 80.395 17.176 82.031 30 68.137 44.725 75.010 31 54.414 81.122 56.400 32 73.508 32.181 77.921 33 54.441 81.182 54.239 34 54.766 81.915 34.966 35 54.619 81.585 42.446 36 54.577 81.491 44.895 37 54.821 82.040 32.447 38 54.082 87.618 -70.650 39 55.231 82.955 17.314 40 53.334 86.907 -71.901 41 55.312 83.136 14.810 42 57.914 88.813 -34.872 43 58.972 91.063 -47.932 44 50.382 84.143 -76.847 45 55.879 84.393 9.2585e-003 46 56.719 86.233 -16.668 47 49.655 83.475 -78.067 48 48.216 82.169 -80.484 49 47.505 81.532 -81.679 50 88.124 -75.909 61.076 51 63.969 -11.048 -55.883 52 88.258 -74.449 54.168 53 88.378 -73.162 48.621 54 65.234 -13.240 -53.886 55 50.387 15.245 -77.651 56 90.459 -52.571 -10.820 57 90.358 -53.502 -8.7450 58 41.434 76.356 -91.909 59 40.805 75.851 -92.972 60 13.566 44.304 -72.685 61 14.216 45.278 -74.284 62 88.963 -67.033 26.684 63 58.941 -1.9366 -63.873 64 89.974 -57.087 -0.41457 65 88.137 -47.397 -18.723 66 6.8920 33.981 -56.046 67 37.838 73.565 -97.991 68 67.270 -63.591 64.960 69 89.463 -62.018 12.127 70 69.043 -19.611 -47.905 71 86.870 -45.728 -20.618 72 49.869 -50.302 51.385 73 6.2785 32.566 -54.181 74 70.317 -21.669 -45.918 75 83.059 -40.579 -26.350 76 15.910 -24.369 22.110 77 39.177 -42.137 43.045 78 71.590 -23.694 -43.935 79 81.787 -38.814 -28.277 80 37.608 -40.939 41.821 81 18.680 51.968 -85.258 82 3.2733 20.423 -41.292 83 27.934 -33.551 34.274 84 79.240 -35.204 -32.151 85 74.140 -27.650 -39.983 86 22.896 -29.704 29.838 87 29.581 -34.809 35.559 88 17.690 -25.728 24.237 89 21.180 -28.393 28.100 90 77.965 -33.358 -34.100 91 2.1792 13.597 -33.728 92 89.768 -59.191 5.9481 93 3.6966 22.881 -43.645 94 41.325 65.926 57.016 95 35.547 59.281 50.935 96 1.8712 11.675 -31.036 97 34.568 58.156 49.826 98 8.5118 -16.223 12.263 99 0.0000 0.0000 0.0000 100 100.00 0.0000 0.0000 101 25.528 47.760 38.601 102 1.5900 9.9207 -28.253 103 24.495 46.571 37.214 104 1.1061 6.9016 -22.414 105 18.145 39.268 28.275 106 89.579 20.945 -15.238 107 88.573 23.083 -16.732 108 86.587 27.372 -19.694 109 0.90158 5.6253 -19.346 110 85.607 29.520 -21.161 111 92.641 14.565 -10.715 112 12.618 32.912 19.984 113 11.481 31.605 18.226 114 97.942 -13.436 69.845 115 95.762 8.2581 -6.1434 116 7.9960 27.597 12.742 117 98.459 -9.9469 45.407 118 96.814 6.1764 -4.6117 119 81.788 38.098 -26.913 120 0.071606 0.44678 -1.6391 121 98.854 -7.3296 31.131 122 68.151 71.639 -47.905 123 0.31376 1.9577 -7.1819 124 99.911 -0.55908 2.0701 125 99.654 -2.1775 8.2937 126 98.933 2.0468 -1.5395 127 99.263 -4.6743 18.690 128 99.572 -2.6971 10.372 129 0.42804 2.6707 -9.7977 130 0.26274 1.1699 0.41869 131 75.581 52.782 -36.382 132 80.861 40.231 -28.317 133 6.6637 -12.722 9.6032 134 0.84682 -1.6167 1.2204 135 31.231 -35.847 35.393 136 76.424 50.730 -35.086 137 6.8659 25.979 10.941 138 5.0620 -9.6638 7.2950 139 99.671 -1.4727 -0.52413 140 3.7105 -7.0837 5.3474 141 61.763 -5.0539 -59.355 142 96.435 -16.970 -5.6944 143 96.176 -18.296 -6.1083 144 97.818 -10.111 -3.4825 145 98.112 -8.6984 -3.0120 146 92.174 -40.913 -12.534 147 94.330 -28.208 -9.0691 148 92.303 -40.112 -12.326 149 1.5706 6.9931 2.5028 150 10.869 -15.302 2.0589 151 2.0675 9.2058 3.2947 152 4.0587 18.060 6.4676 153 3.3081 14.730 5.2716 154 10.994 -14.182 -0.87725 155 9.1841 -11.518 -3.5319 156 9.5294 -8.9401 -9.3805 157 10.760 -16.263 4.9993 158 6.7353 -12.275 7.9642 159 2.6715 -4.5167 2.1078 160 3.9733 -5.9139 5.7660 161 1.9663 -2.0823 2.8737 162 6.9264 -11.552 10.022 163 3.7821 -6.6369 3.7083 164 5.1336 -9.2170 5.6559 165 1.5675 2.8800 -14.912 166 7.9987 -4.3921 -14.925 167 7.7698 -5.8199 -12.096 168 97.530 2.6266 -3.6221 169 8.2511 -2.7895 -17.695 170 17.095 38.103 24.982 171 97.779 3.5416 -0.99896 172 6.3970 -1.3344 -17.441 173 3.7060 1.9381 -18.394 174 5.5817 4.5914 -25.105 175 7.4134 29.726 -28.122 176 8.5234 -1.0118 -20.400 177 84.517 31.090 -20.507 178 6.2333 26.487 -17.288 179 6.0540 24.656 4.2646 180 8.8090 -14.194 5.0530 181 14.284 32.693 22.400 182 9.9501 -5.7189 -15.019 183 7.2939 27.175 1.1433 184 6.7357 26.864 -9.8362 185 7.0858 26.611 5.9087 186 91.509 16.109 -10.133 187 6.3976 25.823 -3.5846 188 4.8167 -0.18212 -16.675 189 6.1681 -2.7622 -14.581 190 18.052 -21.841 8.9391 191 7.4294 27.523 -1.9349 192 15.571 21.836 -52.920 193 5.7452 19.282 9.0260 194 7.1797 26.870 3.7591 195 11.471 -9.9993 -9.5434 196 6.5737 28.558 -29.530 197 5.7999 24.994 -11.362 198 7.2272 -9.2058 -3.2083 199 20.455 25.322 -61.219 200 7.5866 27.912 -5.0785 201 89.471 20.368 -13.137 202 21.999 24.019 -61.342 203 48.717 -45.333 30.029 204 88.463 22.505 -14.628 205 6.0045 25.722 -14.372 206 5.1648 23.661 -15.751 207 15.131 20.257 -50.860 208 7.9720 28.792 -11.140 209 33.074 30.946 -79.144 210 20.866 -5.1108 28.816 211 39.476 -38.847 25.692 212 20.453 2.2192 28.737 213 22.413 25.533 -63.317 214 4.9055 16.365 7.6880 215 7.7675 28.337 -8.1531 216 14.699 18.651 -48.766 217 5.6255 -6.1480 -5.5510 218 0.87828 4.0385 -0.35361 219 13.050 -13.799 -4.0740 220 4.8438 25.898 -38.647 221 4.4312 -2.5871 -10.644 222 60.552 -53.638 35.578 223 4.6222 21.157 -6.4216 224 4.8981 23.604 -22.765 225 4.9472 25.613 -35.381 226 3.3206 -0.46685 -12.302 227 41.067 -39.673 25.317 228 30.291 16.451 40.196 229 4.6431 22.431 -19.914 230 1.9981 3.5094 3.0549 231 20.423 -7.4077 28.187 232 62.021 -54.402 35.232 233 35.765 11.105 -59.626 234 4.3724 19.855 -0.71431 235 8.3059 28.293 5.5532 236 31.621 32.176 -79.037 237 20.012 -9.6659 27.601 238 30.131 10.050 -53.318 239 47.529 -40.821 16.899 240 25.001 -14.538 32.706 241 24.237 15.698 33.998 242 4.2027 18.907 3.1704 243 13.205 -12.425 -6.9125 244 37.608 11.452 -61.692 245 32.679 4.5477 41.019 246 7.0917 -10.051 -0.19452 247 19.635 -11.857 27.061 248 28.214 9.6933 -51.174 249 15.896 5.7448 -35.433 250 11.664 -8.4359 -12.353 251 4.0288 19.185 -10.829 252 36.634 -33.251 12.312 253 75.226 -58.414 23.651 254 33.096 -34.369 22.694 255 8.6936 31.362 -29.086 256 22.335 8.5994 -44.600 257 29.830 -32.076 21.161 258 18.853 -0.16512 -30.672 259 37.323 9.9354 -59.632 260 25.965 -20.494 33.282 261 11.874 -6.8137 -15.112 262 49.077 -41.558 16.537 263 3.9793 20.032 -21.010 264 22.024 6.9501 -42.362 265 20.326 8.2287 -42.356 266 59.536 -48.047 18.632 267 30.954 18.509 41.011 268 35.000 -32.478 12.691 269 20.615 -1.3310 -30.697 270 32.008 -0.093117 -42.424 271 30.363 27.214 41.445 272 58.044 -47.340 18.980 273 23.878 -21.973 31.186 274 10.822 -3.7184 15.902 275 32.973 -2.3199 40.637 276 3.6575 19.125 -24.823 277 18.444 10.025 26.717 278 10.352 -6.1913 15.167 279 16.222 7.4696 -37.771 280 9.2620 -12.388 13.451 281 24.117 -20.283 31.511 282 3.7505 18.674 -18.073 283 18.722 17.100 27.491 284 27.902 25.747 38.845 285 10.003 31.943 -20.657 286 20.618 -18.065 27.910 287 11.135 6.7168 16.672 288 3.1634 -1.4477 -9.1356 289 33.636 -1.1785 -42.443 290 15.583 4.0144 -33.056 291 33.151 -33.786 20.371 292 33.351 -31.693 13.074 293 24.634 22.308 34.995 294 29.613 25.322 40.511 295 49.349 -0.21368 -57.635 296 55.428 -42.015 8.2414 297 19.710 7.2861 28.135 298 22.089 20.755 31.914 299 14.791 -15.961 -1.5162 300 3.8716 18.243 -7.6202 301 23.876 20.308 33.967 302 10.461 4.2413 15.621 303 27.291 38.911 39.622 304 34.173 47.666 47.747 305 21.478 -25.155 13.399 306 14.899 22.439 22.687 307 16.696 22.054 25.129 308 19.535 31.245 29.518 309 9.0599 32.084 -31.549 310 3.7362 17.400 -4.5262 311 19.131 12.280 27.714 312 32.054 16.013 41.689 313 40.728 -0.89753 -49.099 314 28.598 31.619 40.195 315 33.968 -11.128 -28.744 316 11.247 18.916 17.297 317 26.504 -29.743 19.604 318 9.3083 31.580 -24.949 319 20.251 29.361 30.300 320 11.009 1.3244 -25.639 321 11.648 31.980 13.102 322 23.398 -24.363 7.7157 323 40.496 -2.3761 -46.936 324 32.340 -15.287 39.075 325 37.330 -0.28073 -46.895 326 70.022 -50.521 9.7240 327 3.6219 16.687 -1.9103 328 33.220 6.7140 41.680 329 23.417 -8.2673 -23.443 330 34.665 58.374 40.277 331 26.561 -29.129 17.178 332 13.946 34.663 14.333 333 26.386 37.363 38.438 334 13.061 20.032 -48.643 335 19.420 40.954 19.645 336 36.908 61.275 24.815 337 12.837 33.406 12.638 338 35.949 60.188 23.395 339 37.281 62.109 11.263 340 26.655 49.166 32.409 341 41.451 66.211 44.287 342 37.471 62.530 5.9160 343 48.193 76.137 -14.970 344 25.633 47.996 31.058 345 35.606 -12.061 -28.826 346 36.972 61.417 22.102 347 35.669 59.557 39.161 348 14.061 24.603 21.625 349 37.195 61.917 13.960 350 3.5280 16.101 0.23932 351 71.463 -51.187 9.4302 352 37.271 63.110 -11.148 353 49.932 78.018 -12.153 354 37.170 63.880 -24.971 355 49.955 79.008 -27.701 356 35.889 60.053 26.116 357 14.319 35.495 2.3794 358 36.101 62.563 -24.015 359 32.008 -17.282 38.656 360 37.574 62.759 3.2687 361 28.327 51.796 5.9445 362 36.663 62.787 -17.638 363 28.228 51.577 8.7475 364 49.278 78.479 -31.381 365 27.910 50.866 20.096 366 37.132 62.807 -8.6054 367 35.292 60.814 -11.584 368 3.4522 15.628 1.9743 369 95.478 -26.086 60.911 370 25.827 48.433 19.970 371 28.434 52.032 3.1618 372 21.163 31.062 31.592 373 13.009 33.790 6.8652 374 11.221 32.256 -5.8373 375 26.905 49.727 18.601 376 28.137 51.374 11.568 377 26.841 49.583 21.458 378 27.713 52.563 -21.153 379 14.446 35.776 -0.64767 380 20.351 9.5757 29.052 381 19.482 41.093 16.662 382 26.590 51.180 -20.153 383 95.743 -24.711 63.143 384 27.350 51.784 -16.041 385 35.209 61.628 -25.483 386 58.437 -43.409 7.6321 387 19.881 43.090 -16.587 388 21.093 43.527 0.52727 389 94.898 -29.312 60.073 390 29.086 53.465 -10.342 391 97.142 -16.457 43.424 392 20.974 43.265 3.4181 393 28.671 52.556 -2.3258 394 20.604 42.441 15.244 395 19.636 41.438 10.660 396 95.851 -23.908 57.655 397 20.867 43.026 6.3430 398 21.221 43.810 -2.3264 399 19.729 41.644 7.6752 400 27.981 52.107 -9.2498 401 38.727 -29.412 -0.37026 402 93.889 -34.977 54.785 403 25.903 49.696 -9.7083 404 36.283 62.952 -26.430 405 25.621 51.128 -33.065 406 14.205 35.242 5.4557 407 1.9986 9.6638 -7.2950 408 3.0724 14.445 -5.5839 409 96.827 -18.064 42.949 410 1.4650 7.0837 -5.3474 411 22.870 22.740 32.999 412 0.95072 4.4905 -2.0118 413 33.068 -11.161 39.991 414 1.3711 6.4978 -3.1977 415 1.8843 8.9507 -4.6792 416 15.288 36.453 7.1406 417 24.479 49.724 -32.157 418 2.3813 11.163 -3.8873 419 1.2347 6.2625 -8.5123 420 1.7904 8.3648 -2.5295 421 1.7146 7.8919 -0.79449 422 21.510 44.442 -7.9271 423 2.2116 10.105 -2.5816e-003 424 26.068 51.080 -26.698 425 95.453 -25.121 36.644 426 3.2078 15.290 -8.6798 427 2.9055 15.322 -22.784 428 3.3650 16.271 -11.901 429 95.175 -26.644 36.220 430 18.700 41.634 -15.527 431 20.354 43.022 -6.7699 432 24.742 -29.348 22.274 433 2.1341 10.509 -10.393 434 13.528 34.934 -5.3306 435 2.2913 11.490 -13.635 436 5.4900 -6.9931 -2.5028 437 19.691 42.680 -13.902 438 14.744 36.429 -6.5500 439 96.993 -16.307 26.087 440 13.769 29.723 21.486 441 1.8719 9.6227 -14.312 442 13.695 35.299 -8.2532 443 37.102 -28.659 -0.085560 444 98.041 -10.308 14.575 445 3.1606 16.914 -25.648 446 97.427 -13.310 13.610 447 98.450 -7.5927 4.1750 448 95.234 -25.139 16.776 449 2.7882 13.702 -12.833 450 1.5274 8.0884 -14.869 451 95.968 -21.345 20.121 452 13.878 35.694 -11.118 453 96.917 -15.710 10.598 454 18.169 40.485 -7.2459 455 97.865 -12.086 29.606 456 93.674 -36.164 52.512 457 96.693 -17.839 25.621 458 97.362 -14.924 35.292 459 98.538 -7.0181 2.0995 460 95.211 -24.795 10.118 461 97.929 -11.648 27.537 462 97.506 -12.771 11.527 463 97.654 -12.333 16.169 464 94.881 -26.763 11.809 465 18.901 42.065 -18.199 466 98.678 -6.6753 6.7494 467 98.529 -8.2475 19.736 468 98.763 -6.1199 4.6724 469 96.179 -20.372 22.641 470 97.129 -14.794 13.141 471 98.850 -5.5542 2.5970 472 97.964 -10.819 16.656 473 98.281 -8.7106 8.3314 474 98.595 -7.2205 8.8283 475 12.840 34.597 -12.819 476 98.364 -8.1568 6.2522 477 2.4722 12.618 -16.787 478 98.513 -7.7551 10.908 479 95.496 -23.715 17.188 480 96.761 -17.360 23.546 481 94.245 -31.639 30.510 482 97.289 -13.688 8.9757 483 95.692 -22.809 19.691 484 14.075 36.119 -13.926 485 1.2492 6.8500 -15.317 486 96.518 -17.416 5.5403 487 96.713 -16.584 8.0641 488 49.793 -34.551 -2.2575 489 97.051 -15.329 15.223 490 98.231 -8.4719 1.6110 491 95.064 -27.479 40.284 492 96.246 -18.299 -1.5507 493 95.737 -23.582 37.078 494 96.631 -17.160 10.147 495 34.504 62.039 -40.121 496 94.719 -27.503 9.3402 497 8.2320 -5.7188 12.102 498 98.142 -9.0555 3.6866 499 94.498 -30.195 30.899 500 94.977 -26.546 16.373 501 98.056 -9.6285 5.7640 502 97.929 -9.9148 1.1315 503 30.901 -24.546 37.250 504 48.057 -8.7188 -44.950 505 93.654 -34.813 25.264 506 96.245 -18.820 5.1077 507 96.797 -15.997 5.9825 508 96.155 -18.947 0.52551 509 17.439 41.077 -26.565 510 96.066 -19.583 2.6038 511 96.332 -18.204 3.0272 512 11.803 33.512 -14.524 513 37.234 -12.980 -28.910 514 94.638 -28.116 11.426 515 96.161 -19.425 7.1897 516 98.939 -4.9785 0.52427 517 24.729 50.243 -34.550 518 95.621 -23.331 21.772 519 96.605 -16.289 -3.2004 520 94.886 -26.240 5.1703 521 33.854 62.499 -51.781 522 16.510 39.118 -16.093 523 93.495 -35.614 22.837 524 97.725 -10.734 -1.4120 525 94.565 -28.193 6.8800 526 30.680 -26.125 36.968 527 93.425 -37.658 52.145 528 46.314 -9.1813 -42.733 529 91.837 -48.168 61.163 530 93.937 -33.548 32.189 531 10.357 21.202 16.077 532 95.987 -19.643 -1.9647 533 16.231 39.593 -25.605 534 21.454 -8.8001 -20.850 535 9.0721 7.2120 13.679 536 94.284 -29.420 1.9916 537 21.413 -25.838 15.949 538 92.203 -44.977 44.284 539 93.275 -36.930 22.494 540 37.563 31.508 48.155 541 94.196 -30.097 4.0749 542 8.5564 21.453 13.374 543 9.3844 19.290 14.547 544 8.5941 12.493 13.127 545 92.372 -41.486 7.8479 546 93.206 -37.485 24.570 547 92.871 -38.917 15.273 548 92.413 -43.634 44.599 549 94.157 -29.955 -0.43526 550 91.665 -49.227 59.107 551 74.148 -35.824 72.351 552 93.071 -37.698 15.588 553 92.184 -41.706 -3.5852 554 94.344 -28.523 -4.5904 555 73.895 -37.439 72.030 556 23.110 -27.359 18.003 557 16.497 40.144 -28.132 558 23.313 -25.227 10.356 559 63.043 -26.089 63.814 560 48.835 -15.110 -36.280 561 92.137 -41.789 -5.8912 562 49.590 -9.6508 -44.998 563 63.345 -24.306 64.195 564 91.290 -50.507 34.545 565 36.177 46.097 49.231 566 92.676 -40.110 14.969 567 92.288 -41.828 5.4941 568 67.573 -44.824 -0.77167 569 91.349 -49.983 32.503 570 94.249 -29.245 -2.5140 571 63.060 -16.781 64.527 572 92.236 -40.965 -7.9672 573 91.023 -53.324 52.520 574 92.996 -38.309 17.674 575 62.551 -10.890 64.575 576 3.0280 -2.2928 -6.0509 577 48.779 -33.161 51.496 578 11.276 33.506 -21.668 579 89.851 -36.545 -15.956 580 92.465 -41.085 10.213 581 13.377 -10.969 -9.7234 582 8.3646 4.7017 12.557 583 89.992 -35.693 -15.727 584 49.455 -9.0742 53.809 585 49.771 -26.555 52.758 586 49.858 -7.0686 54.311 587 92.566 -40.626 12.586 588 65.280 -42.686 64.545 589 48.993 -20.949 52.507 590 90.456 -57.095 47.752 591 92.204 -42.541 7.5817 592 50.000 -15.216 53.774 593 62.974 -1.0024 65.773 594 33.471 63.410 -62.829 595 49.997 -36.338 52.304 596 87.547 -32.015 -19.369 597 79.533 30.967 -30.586 598 32.393 62.106 -62.055 599 73.847 39.085 -39.399 600 85.889 -32.689 -21.903 601 49.719 7.6693 55.525 602 91.026 -52.168 32.008 603 86.325 -30.141 -21.197 604 86.483 -29.228 -20.940 605 71.761 27.361 -42.919 606 72.170 28.708 -42.245 607 90.850 -54.519 52.266 608 77.941 -24.230 -34.010 609 93.362 -25.137 -10.460 610 79.102 29.547 -31.290 611 49.683 20.275 56.803 612 39.165 -28.832 43.816 613 78.121 31.737 -32.788 614 90.465 -55.463 22.494 615 40.871 -29.039 45.214 616 91.757 -25.554 -12.882 617 38.950 -30.362 43.542 618 82.195 -27.005 -27.472 619 49.477 -0.73838 54.540 620 39.915 -23.773 44.770 621 91.467 -50.557 58.820 622 78.356 -21.928 -33.331 623 74.318 40.452 -38.626 624 88.575 -26.144 -17.706 625 38.482 29.274 48.613 626 46.903 10.389 53.447 627 85.435 -26.366 -22.493 628 70.753 29.615 -44.485 629 40.933 -7.8928 46.803 630 76.977 -20.723 -35.459 631 89.394 -21.674 -16.383 632 82.511 24.421 -26.068 633 90.792 -22.454 -14.282 634 89.616 -20.494 -16.025 635 78.083 20.292 -33.061 636 63.052 13.106 67.173 637 72.446 39.904 -41.611 638 69.622 -8.0885 -46.843 639 40.820 -18.174 45.915 640 77.126 -19.912 -35.214 641 94.777 -17.641 -8.1890 642 40.530 -9.9593 46.300 643 90.518 -55.246 24.755 644 78.259 26.717 -32.666 645 91.244 -20.045 -13.552 646 47.290 -14.232 -36.202 647 74.673 -15.798 -38.988 648 77.049 22.512 -34.645 649 40.758 7.3703 48.027 650 40.237 5.2805 47.390 651 39.588 16.370 47.986 652 80.408 -19.442 -30.111 653 84.403 -23.430 -24.023 654 76.407 -15.207 -36.267 655 39.086 -17.997 44.486 656 80.929 18.696 -28.642 657 69.798 -7.2363 -46.552 658 71.192 -8.5370 -44.364 659 64.124 35.768 -55.021 660 63.613 43.953 -55.723 661 63.607 39.266 -55.803 662 83.927 23.692 -23.884 663 76.257 13.427 -36.047 664 76.593 -14.255 -35.963 665 83.196 -21.454 -25.843 666 92.491 -13.659 -11.546 667 32.675 -24.758 38.704 668 74.830 14.326 -38.278 669 76.607 14.779 -35.475 670 40.507 -1.3510 47.005 671 34.132 -15.472 40.552 672 90.484 12.250 -14.047 673 91.897 11.601 -11.912 674 90.983 -53.687 54.381 675 97.945 -2.3573 -3.1168 676 91.352 -11.641 -13.226 677 75.584 -11.162 -37.494 678 25.454 -22.141 -0.59291 679 70.902 18.485 -44.428 680 75.791 -10.140 -37.155 681 75.582 10.764 -37.154 682 65.267 52.248 -52.914 683 38.499 18.797 47.353 684 69.767 7.5444 -46.397 685 7.4983 15.148 11.552 686 88.442 -18.513 -17.771 687 75.915 12.088 -36.607 688 90.497 -8.2572 -14.455 689 70.055 8.7233 -45.921 690 48.645 22.596 56.203 691 40.195 18.379 48.713 692 88.790 17.991 -16.511 693 76.461 -6.8982 -36.058 694 7.7692 10.153 11.815 695 69.876 14.670 -46.117 696 70.551 17.198 -45.005 697 80.537 10.887 -29.400 698 75.285 -4.7388 -37.866 699 69.486 6.3876 -46.859 700 80.700 -9.8161 -29.505 701 91.626 -10.301 -12.785 702 75.531 -3.5983 -37.464 703 92.759 -12.327 -11.114 704 70.209 15.926 -45.568 705 97.628 -3.8077 -3.6246 706 61.843 3.1334 -59.133 707 81.604 15.085 -27.661 708 77.791 6.3269 -33.764 709 81.241 13.676 -28.252 710 15.082 -13.339 -7.1407 711 90.826 7.2025 -13.636 712 69.633 -0.24131 -46.718 713 81.641 -13.062 -28.102 714 75.458 3.4035 -37.467 715 81.417 -14.194 -28.468 716 75.173 2.1670 -37.935 717 35.542 8.4779 43.790 718 22.178 48.762 -47.159 719 91.077 -5.5194 -13.521 720 80.945 -8.6263 -29.106 721 62.461 19.214 -57.937 722 90.481 5.7512 -14.192 723 63.449 22.638 -56.298 724 65.541 56.718 -52.395 725 81.961 10.090 -27.200 726 89.663 -4.8279 -15.653 727 89.371 -6.1953 -16.125 728 6.6586 12.643 10.214 729 82.112 -10.721 -27.335 730 80.040 -5.2907 -30.453 731 89.065 6.4257 -16.336 732 26.319 -14.566 -16.138 733 80.026 1.9525 -30.353 734 80.330 3.2721 -29.857 735 62.422 12.590 -58.084 736 80.307 -4.0500 -30.018 737 62.745 26.162 -57.384 738 27.181 -22.942 -0.88959 739 62.163 11.591 -58.514 740 26.872 -10.240 -23.611 741 61.915 10.622 -58.926 742 89.485 1.4535 -15.798 743 58.567 56.558 -63.742 744 89.166 0.041899 -16.313 745 56.785 -16.776 -41.013 746 13.788 5.3320 -33.051 747 14.403 38.828 -37.518 748 49.932 36.240 58.936 749 21.024 47.365 -46.328 750 39.191 31.104 49.436 751 49.062 38.359 58.504 752 51.410 30.700 -75.814 753 91.192 6.1855 25.260 754 92.322 4.5097 24.572 755 88.043 12.499 20.999 756 89.086 10.384 22.417 757 97.427 1.3837 7.3392 758 26.679 -11.711 -21.146 759 87.007 14.621 19.587 760 92.536 5.7965 18.222 761 93.672 4.1663 17.570 762 90.206 8.6906 21.707 763 13.180 37.346 -36.638 764 97.263 0.36470 11.520 765 94.813 2.5544 16.933 766 91.479 7.8867 16.764 767 92.391 4.9279 22.457 768 24.955 -10.761 -21.041 769 85.569 14.487 31.110 770 95.882 0.49607 18.410 771 92.611 6.2468 16.103 772 88.116 12.912 18.853 773 83.584 19.109 26.254 774 79.086 38.537 -14.753 775 85.508 14.148 33.250 776 86.605 12.362 32.460 777 85.833 15.953 22.500 778 77.725 38.695 -7.4084 779 84.604 16.970 27.606 780 87.903 11.704 25.287 781 95.809 0.041194 20.508 782 27.872 -16.810 -13.766 783 93.322 2.0306 28.111 784 82.714 21.989 20.542 785 88.643 7.8035 37.275 786 82.643 21.615 22.725 787 94.460 0.37535 27.444 788 91.125 5.7872 27.377 789 89.816 6.3890 34.429 790 80.643 32.763 -5.4767 791 76.705 40.351 -6.5518 792 91.556 8.3387 14.638 793 90.507 10.441 13.177 794 94.889 3.0218 14.828 795 79.201 39.054 -16.912 796 76.575 33.438 21.464 797 76.403 39.015 0.078379 798 77.941 39.659 -11.778 799 80.348 31.354 1.0727 800 80.882 27.067 13.430 801 78.168 40.662 -16.119 802 82.442 20.559 29.259 803 81.643 23.763 21.375 804 76.501 39.450 -2.1377 805 83.172 16.879 41.274 806 82.023 32.637 -12.721 807 90.588 10.905 11.045 808 72.123 49.859 -8.5275 809 66.759 -38.221 -13.789 810 75.952 36.996 11.229 811 66.200 -29.753 -28.847 812 65.415 -36.461 -15.795 813 78.353 28.502 28.446 814 80.197 23.598 35.351 815 87.081 15.035 17.432 816 68.396 -24.559 -39.585 817 85.978 16.751 18.178 818 77.525 31.297 22.739 819 49.547 -22.442 -25.197 820 76.882 34.865 12.526 821 96.194 2.4197 10.017 822 73.076 48.253 -9.5115 823 27.432 -20.631 -6.0910 824 77.389 30.648 27.181 825 29.573 -17.666 -13.937 826 76.037 37.379 8.9916 827 84.287 29.961 -16.269 828 80.803 26.671 15.631 829 76.802 34.492 14.759 830 96.617 -3.7076 30.319 831 48.708 -29.573 -11.396 832 35.951 -23.443 -9.7355 833 58.300 52.299 -64.242 834 39.783 -20.092 -19.746 835 81.715 24.137 19.183 836 82.052 18.479 44.233 837 96.277 2.9264 7.9198 838 75.398 40.707 0.99414 839 37.586 -24.230 -9.9451 840 91.837 1.5524 41.316 841 85.097 11.829 49.957 842 76.124 37.772 6.7564 843 87.428 8.9640 42.218 844 91.308 14.989 -5.9261 845 86.186 9.9633 49.163 846 59.513 61.779 -62.115 847 80.077 30.040 7.6629 848 49.395 -23.683 -22.926 849 81.408 29.666 0.27517 850 68.242 -25.771 -37.482 851 89.465 12.552 11.720 852 21.366 48.035 -48.523 853 81.603 30.616 -4.0779 854 73.664 50.591 -20.509 855 75.566 35.242 22.443 856 93.020 0.16385 38.547 857 48.836 -28.442 -13.723 858 89.897 14.983 1.0520 859 58.081 43.470 -64.723 860 38.168 -19.263 -19.602 861 90.182 16.564 -5.3124 862 96.448 3.9701 3.7321 863 79.208 25.747 34.094 864 71.338 46.733 9.5315 865 77.325 30.339 29.397 866 66.343 -28.582 -30.994 867 82.986 30.489 -11.298 868 78.290 28.194 30.649 869 13.546 38.061 -38.959 870 80.964 27.474 11.231 871 70.873 50.244 -0.75116 872 79.151 25.460 36.269 873 89.547 13.017 9.5817 874 38.013 -20.548 -17.211 875 75.870 36.624 13.469 876 72.585 51.662 -17.383 877 27.570 -19.402 -8.6673 878 89.718 13.979 5.3115 879 71.296 51.880 -9.7445 880 89.631 13.493 7.4461 881 39.343 -23.824 -12.575 882 86.143 9.7123 51.176 883 90.085 16.027 -3.1948 884 29.276 -20.225 -8.8842 885 70.775 49.861 1.5157 886 31.593 62.121 -68.568 887 88.777 16.602 1.7055 888 70.497 48.771 8.3498 889 80.945 20.126 47.191 890 70.410 48.428 10.638 891 69.956 51.868 0.33895 892 72.833 52.621 -21.760 893 91.596 0.056292 51.442 894 50.007 37.261 -78.055 895 71.015 45.418 18.674 896 74.896 32.132 48.732 897 77.649 24.999 59.749 898 74.939 32.333 46.632 899 73.279 37.490 35.713 900 71.671 42.472 26.678 901 70.941 45.116 20.964 902 73.225 37.249 37.929 903 84.975 11.138 55.903 904 90.320 0.88677 59.864 905 74.001 34.464 45.550 906 64.011 62.383 11.509 907 64.390 67.336 -12.686 908 63.268 63.821 12.967 909 26.961 57.092 -68.605 910 63.728 65.275 1.1754 911 73.916 34.073 49.763 912 71.606 42.200 28.949 913 63.106 63.307 17.726 914 72.374 39.598 34.584 915 65.315 70.158 -28.377 916 63.623 61.111 23.369 917 50.546 51.357 -77.004 918 64.312 59.340 24.272 919 9.4535 4.4784 -28.149 920 72.266 39.126 39.033 921 70.735 44.272 27.822 922 50.079 50.421 -77.788 923 63.554 60.886 25.744 924 63.954 58.124 38.361 925 64.674 56.295 39.209 END_DATA # And then come the triangles KEYWORD "VERTEX_0" KEYWORD "VERTEX_1" KEYWORD "VERTEX_2" NUMBER_OF_FIELDS 3 BEGIN_DATA_FORMAT VERTEX_0 VERTEX_1 VERTEX_2 END_DATA_FORMAT NUMBER_OF_SETS 1848 BEGIN_DATA 59 1 67 31 2 94 27 3 114 43 4 122 99 120 130 87 80 135 124 100 139 63 51 141 65 56 146 133 98 157 138 133 158 134 140 159 134 99 161 140 134 161 160 140 161 133 138 162 159 140 163 140 138 164 138 150 164 109 129 165 126 118 168 105 112 170 118 126 171 166 169 172 109 172 173 102 104 174 172 169 176 104 109 176 109 173 176 173 172 176 174 104 176 119 110 177 137 152 179 150 138 180 138 158 180 133 157 180 158 133 180 157 150 180 112 105 181 166 167 182 169 166 182 137 179 185 106 111 186 109 165 188 172 109 188 167 166 189 188 165 189 166 172 189 172 188 189 98 76 190 157 98 190 183 187 191 60 66 192 152 137 193 179 183 194 185 179 194 155 156 198 60 192 199 187 184 200 191 187 200 106 186 201 60 199 202 199 192 202 77 72 203 107 106 204 106 201 204 184 197 205 178 205 206 205 197 206 192 66 207 184 205 208 205 178 208 135 80 211 80 77 211 81 61 213 61 60 213 60 202 213 153 152 214 200 184 215 184 208 215 66 73 216 207 66 216 156 167 217 120 99 217 198 156 217 149 130 218 155 154 219 93 73 220 167 189 221 217 167 221 68 0 222 72 68 222 203 72 222 184 187 223 197 184 223 175 178 224 196 175 224 82 93 225 93 220 225 165 129 226 189 165 226 129 221 226 221 189 226 77 203 227 211 77 227 178 206 229 224 178 229 99 130 230 161 99 230 130 149 230 0 50 232 222 0 232 50 52 232 52 53 232 25 7 233 7 209 233 183 179 234 187 183 234 223 187 234 116 137 235 137 185 235 194 183 235 185 194 235 6 1 236 1 81 236 7 6 236 209 7 236 81 213 236 213 202 238 236 213 238 233 209 238 209 236 238 227 203 239 231 210 240 237 231 240 152 153 242 179 152 242 234 179 242 156 155 243 195 156 243 155 219 243 55 25 244 25 233 244 163 140 246 150 154 246 164 150 246 154 155 246 140 164 246 155 198 246 76 98 247 237 240 247 238 202 248 167 156 250 182 167 250 156 195 250 206 197 251 197 223 251 211 227 252 227 239 252 53 62 253 83 87 254 87 135 254 135 211 254 202 192 256 248 202 256 192 207 256 207 216 256 86 83 257 83 254 257 55 244 259 244 233 259 83 86 260 176 169 261 169 182 261 182 250 261 239 203 262 224 229 263 256 216 265 264 256 265 232 53 266 53 253 266 249 258 269 248 256 270 256 264 270 238 248 270 264 269 270 203 222 272 262 203 272 222 232 272 232 266 272 86 89 273 260 86 273 212 210 274 210 231 274 231 237 274 210 212 275 212 245 275 240 210 275 91 82 276 82 225 276 196 224 276 225 196 276 224 263 276 133 162 278 237 247 278 274 237 278 93 82 279 216 93 279 265 216 279 82 249 279 264 265 279 249 269 279 269 264 279 98 133 280 133 278 280 247 98 280 278 247 280 240 260 281 260 273 281 229 206 282 263 229 282 206 251 282 88 76 286 76 247 286 89 88 286 273 89 286 281 273 286 247 240 286 240 281 286 129 123 288 221 129 288 217 221 288 258 249 290 211 252 291 254 211 291 252 268 291 257 254 291 257 291 292 291 268 292 228 241 293 267 228 293 284 267 293 271 267 294 267 284 294 284 271 294 63 55 295 262 272 296 272 266 296 212 287 297 287 277 297 241 283 298 150 157 299 157 190 299 154 150 299 219 154 299 251 223 300 293 241 301 241 298 301 212 274 302 287 212 302 101 97 303 303 97 304 190 76 305 298 283 307 283 306 307 181 105 308 307 181 308 175 196 309 255 175 309 220 73 309 196 225 309 225 220 309 223 234 310 300 223 310 277 283 311 283 241 311 228 267 312 55 259 313 295 55 313 271 284 314 303 304 314 270 269 315 289 270 315 283 277 316 306 283 316 277 287 316 86 257 317 178 175 318 285 178 318 175 255 318 298 307 319 307 308 319 96 102 320 102 174 320 174 176 320 258 290 320 113 116 321 295 313 323 233 238 325 259 233 325 238 270 325 270 289 325 313 259 325 289 323 325 323 313 325 253 62 326 266 253 326 310 234 327 241 228 328 245 241 328 228 312 328 269 258 329 258 320 329 97 101 330 257 292 331 317 257 331 112 113 332 103 101 333 101 303 333 303 314 333 73 93 334 93 216 334 216 73 334 105 170 335 170 112 335 34 35 336 37 34 336 113 321 337 332 113 337 41 39 339 101 103 340 330 101 340 33 31 341 31 94 341 36 33 341 94 95 341 45 41 342 41 339 342 103 105 344 340 103 344 289 315 345 39 37 346 37 336 346 336 338 346 95 97 347 97 330 347 330 340 347 341 95 347 113 112 348 307 306 348 306 316 348 339 39 349 39 346 349 234 242 350 327 234 350 62 69 351 326 62 351 46 45 353 343 46 353 42 46 355 46 343 355 354 42 355 35 36 356 336 35 356 338 336 356 347 340 356 36 341 356 341 347 356 235 183 357 260 240 359 240 324 359 45 342 360 342 339 361 343 352 362 354 355 362 355 343 362 358 354 362 361 339 363 43 42 364 42 354 364 338 356 365 353 45 366 352 343 366 343 353 366 45 360 366 362 352 367 352 366 367 153 151 368 151 350 368 242 153 368 350 242 368 105 335 370 344 105 370 360 342 371 342 361 371 284 293 372 314 284 372 105 103 372 308 105 372 319 308 372 103 333 372 333 314 372 116 235 373 321 116 373 337 321 373 235 357 373 200 215 374 191 200 374 215 208 374 339 349 376 363 339 376 346 338 376 338 365 376 349 346 376 365 375 376 340 344 377 356 340 377 365 356 377 344 370 377 370 375 377 375 365 377 358 362 378 183 191 379 357 183 379 191 374 379 241 245 380 245 212 380 212 297 380 311 241 380 297 277 380 277 311 380 112 332 381 335 112 381 26 27 383 27 114 383 23 26 383 369 23 383 378 362 384 382 378 384 358 378 385 296 266 386 266 326 386 382 384 387 357 379 388 15 18 389 18 23 389 23 369 389 362 367 390 384 362 390 371 361 392 388 371 392 357 388 392 366 360 393 360 371 393 367 366 393 390 367 393 371 388 393 370 335 394 335 381 394 375 370 394 376 375 394 381 332 395 394 381 395 376 394 395 114 117 396 383 114 396 369 383 396 117 391 396 389 369 396 361 363 397 392 361 397 363 376 397 376 395 397 388 379 398 393 388 398 357 392 399 392 397 399 397 395 399 390 393 400 252 239 401 14 15 402 15 389 402 12 14 402 384 390 403 390 400 403 393 398 403 400 393 403 43 364 404 364 354 404 354 358 404 358 385 404 373 357 406 310 327 408 300 310 408 396 391 409 123 129 410 293 301 411 301 298 411 298 319 411 319 372 411 372 293 411 130 120 412 218 130 412 149 218 412 240 275 413 324 240 413 120 123 414 412 120 414 149 412 414 123 410 414 410 407 415 414 410 415 332 337 416 337 373 416 373 406 416 395 332 416 357 399 416 406 357 416 399 395 416 327 350 418 408 327 418 407 408 418 415 407 418 407 410 419 410 129 419 414 415 420 415 418 420 149 414 421 414 420 421 403 398 422 350 151 423 418 350 423 420 418 423 151 149 423 149 421 423 421 420 423 385 378 424 378 382 424 417 405 424 382 387 424 251 300 426 300 408 426 408 407 426 102 96 427 104 102 427 276 263 427 263 282 427 282 251 428 251 426 428 422 398 431 89 86 432 86 317 432 419 129 433 407 419 433 426 407 433 379 374 434 99 134 436 134 159 436 217 99 436 198 217 436 159 163 436 163 246 436 246 198 436 387 384 437 384 403 437 403 422 437 430 387 437 422 431 437 379 434 438 112 181 440 348 112 440 181 307 440 307 348 440 433 129 441 435 433 441 434 374 442 438 434 442 268 252 443 252 401 443 292 268 443 322 292 443 96 91 445 91 276 445 276 427 445 427 96 445 428 426 449 426 433 449 282 428 449 433 435 449 109 441 450 441 129 450 438 442 452 398 379 454 379 438 454 431 398 454 437 431 454 438 452 454 429 425 457 117 121 458 121 455 458 391 117 458 409 391 458 455 439 458 439 457 458 439 455 461 455 121 461 446 444 462 444 446 463 448 460 464 424 387 465 387 430 465 121 127 467 461 121 467 125 124 468 466 125 468 429 457 469 446 462 470 462 453 470 124 139 471 468 124 471 459 447 471 447 468 471 127 444 472 444 463 472 467 127 472 128 125 474 125 466 474 466 473 474 374 208 475 442 374 475 452 442 475 466 468 476 468 447 476 473 466 476 109 104 477 104 427 477 427 282 477 435 441 477 441 109 477 282 449 477 449 435 477 127 128 478 444 127 478 462 444 478 473 462 478 128 474 478 474 473 478 460 448 479 457 439 480 439 461 480 461 467 480 469 457 480 451 469 480 472 463 480 467 472 480 453 462 482 462 473 482 451 479 483 479 448 483 452 475 484 129 109 485 109 450 485 450 129 485 453 482 487 239 262 488 262 296 488 401 239 488 296 386 488 463 446 489 446 470 489 479 451 489 451 480 489 480 463 489 459 145 490 389 396 491 402 389 491 396 409 491 456 402 491 425 429 491 142 143 492 409 458 493 457 425 493 458 457 493 425 491 493 491 409 493 460 479 494 453 487 494 470 453 494 489 470 494 479 489 494 4 43 495 43 404 495 404 385 495 385 424 495 424 405 495 38 4 495 40 38 495 464 460 496 138 140 497 140 160 497 162 138 497 278 162 497 274 278 497 447 459 498 459 490 498 429 469 499 448 464 500 473 476 501 482 473 501 476 447 501 447 498 501 145 144 502 490 145 502 498 490 502 260 359 503 63 295 504 295 323 504 486 487 507 487 482 507 482 501 507 501 498 507 498 502 507 417 424 509 424 465 509 492 508 511 486 507 511 507 502 511 506 486 511 510 506 511 508 510 511 208 178 512 178 285 512 475 208 512 484 475 512 323 289 513 289 345 513 464 496 514 500 464 514 460 494 515 487 486 515 486 506 515 494 487 515 139 145 516 145 459 516 459 471 516 471 139 516 405 417 517 495 405 517 469 451 518 451 483 518 499 469 518 481 499 518 483 448 518 448 500 518 505 481 518 500 505 518 144 142 519 142 492 519 492 511 519 496 460 520 506 510 520 515 506 520 460 515 520 49 48 521 47 44 521 44 40 521 40 495 521 48 47 521 495 517 521 430 437 522 437 454 522 454 452 522 452 484 522 465 430 522 505 500 523 502 144 524 511 502 524 144 519 524 519 511 524 514 496 525 496 520 525 87 83 526 83 260 526 260 503 526 10 9 527 9 11 527 11 12 527 12 402 527 402 456 527 456 491 527 504 323 528 323 513 528 10 527 529 499 481 530 491 429 530 429 499 530 481 505 530 116 113 531 113 348 531 348 316 531 492 143 532 508 492 532 510 508 532 520 510 532 255 309 533 318 255 533 509 465 533 465 522 533 176 261 534 320 176 534 329 320 534 287 302 535 520 532 536 76 88 537 305 76 537 271 314 540 525 520 541 520 536 541 137 116 542 116 531 542 193 137 542 193 542 543 531 316 543 542 531 543 316 287 544 543 316 544 287 535 544 530 505 546 505 523 546 523 539 546 527 491 548 491 530 548 530 538 548 541 536 549 5 10 550 10 529 550 529 527 550 527 548 550 15 14 551 500 514 552 57 64 553 143 147 554 532 143 554 12 11 555 14 12 555 551 14 555 88 89 556 89 432 556 317 331 556 432 317 556 537 88 556 305 537 556 417 509 557 517 417 557 509 533 557 533 309 557 190 305 558 322 190 558 292 322 558 331 292 558 305 556 558 556 331 558 18 15 559 15 551 559 551 555 559 56 57 561 57 553 561 51 63 562 63 504 562 504 528 562 23 18 563 18 559 563 538 530 564 530 546 564 97 95 565 304 97 565 95 94 565 314 304 565 540 314 565 64 92 567 553 64 567 545 541 567 541 549 567 549 553 567 64 57 568 69 92 568 351 69 568 92 64 568 326 351 568 386 326 568 488 386 568 564 546 569 536 532 570 549 536 570 532 554 570 553 549 570 561 553 570 554 147 570 3 27 571 27 26 571 26 23 571 23 563 571 147 148 572 146 56 572 56 561 572 148 146 572 561 570 572 570 147 572 548 538 573 523 500 574 500 552 574 539 523 574 552 547 574 547 566 574 13 8 575 8 3 575 3 571 575 123 120 576 120 217 576 217 288 576 288 123 576 72 77 577 484 512 578 512 285 578 522 484 578 285 318 578 318 533 578 533 522 578 65 146 579 71 65 579 525 541 580 541 545 580 195 243 581 250 195 581 160 161 582 497 160 582 161 230 582 302 274 582 274 497 582 149 151 582 230 149 582 535 302 582 146 148 583 579 146 583 148 147 583 575 584 586 514 525 587 525 580 587 552 514 587 547 552 587 69 566 587 580 69 587 566 547 587 5 0 588 0 68 588 9 10 588 11 9 588 555 11 588 10 5 588 559 555 588 585 559 588 563 559 589 559 585 589 53 52 590 538 564 590 564 53 590 52 50 590 92 69 591 545 567 591 567 92 591 69 580 591 580 545 591 575 571 592 584 575 592 571 563 592 563 589 592 19 13 593 13 575 593 29 19 593 575 586 593 58 49 594 49 521 594 68 72 595 588 68 595 72 577 595 577 585 595 585 588 595 71 579 596 579 583 596 119 132 597 58 594 598 594 521 598 79 75 600 75 71 600 71 596 600 62 53 602 53 564 602 564 569 602 600 596 603 603 596 604 50 0 607 0 573 607 590 50 607 573 538 607 538 590 607 85 90 608 147 143 609 30 32 611 597 132 613 610 597 613 599 606 613 69 62 614 566 69 614 574 566 614 577 77 615 585 577 615 583 147 616 147 609 616 77 80 617 612 615 617 615 77 617 90 84 618 84 79 618 593 586 619 601 593 619 615 612 620 585 615 620 0 5 621 5 550 621 550 548 621 548 573 621 85 608 622 608 90 622 132 136 623 136 131 623 599 613 623 613 132 623 596 583 624 583 616 624 604 596 624 267 271 625 271 540 625 611 601 626 79 600 627 600 603 627 618 79 627 603 604 627 604 624 627 605 606 628 413 275 629 586 584 629 85 622 630 110 119 632 119 597 632 597 610 632 616 609 633 624 616 633 631 624 633 631 633 634 32 29 636 29 593 636 593 601 636 601 611 636 611 32 636 623 131 637 599 623 637 606 599 637 628 606 637 589 585 639 585 620 639 592 589 639 78 85 640 85 630 640 630 622 640 584 592 642 629 584 642 413 629 642 592 639 642 546 539 643 539 574 643 569 546 643 602 569 643 62 602 643 614 62 643 574 614 643 610 613 644 613 606 644 632 610 644 609 143 645 143 641 645 633 609 645 634 633 645 528 513 646 560 562 646 562 528 646 70 74 647 74 78 647 606 605 648 635 644 648 644 606 648 601 619 650 626 601 650 649 626 650 611 626 651 626 649 651 90 618 652 622 90 652 640 622 652 618 627 653 78 640 654 647 78 654 640 652 654 639 620 655 642 639 655 632 644 656 644 635 656 51 54 657 54 638 657 54 70 658 638 54 658 657 638 658 628 637 660 659 628 661 628 660 661 107 108 662 108 110 662 110 632 662 632 656 662 647 654 664 654 652 664 652 618 665 618 653 665 143 142 666 641 143 666 645 641 666 80 87 667 617 80 667 87 526 667 526 503 667 612 617 667 503 359 667 359 620 667 620 612 667 635 648 669 648 668 669 668 663 669 619 586 670 586 629 670 275 245 670 245 650 670 629 275 670 650 619 670 324 413 671 359 324 671 620 359 671 655 620 671 413 642 671 642 655 671 111 106 672 111 672 673 573 0 674 0 621 674 621 573 674 100 126 675 126 168 675 645 666 676 70 647 677 658 70 677 647 664 677 299 190 678 190 322 678 605 628 679 648 605 679 668 648 679 658 677 680 677 664 680 660 637 682 40 44 682 312 267 683 651 312 683 267 625 683 152 193 685 214 152 685 193 543 685 543 544 685 627 624 686 653 627 686 624 631 686 631 634 686 665 653 686 634 645 686 645 676 686 663 668 687 668 681 687 686 676 688 30 611 690 683 625 691 625 690 691 611 651 691 690 611 691 651 683 691 106 107 692 107 662 692 672 106 692 544 535 694 535 582 694 582 151 694 681 668 695 689 681 695 668 679 696 669 663 697 663 687 697 658 680 698 680 693 698 680 664 700 693 680 700 688 676 701 698 693 702 142 144 703 666 142 703 144 701 703 676 666 703 701 676 703 695 668 704 668 696 704 139 100 705 100 675 705 145 139 705 675 168 705 662 656 707 692 662 707 687 681 708 697 687 708 656 635 709 707 656 709 635 669 709 669 697 709 243 219 710 219 299 710 581 243 710 115 111 711 111 673 711 673 672 711 657 658 712 658 698 712 141 51 712 51 657 712 63 141 712 698 702 712 699 706 712 706 63 712 665 686 713 681 689 714 689 684 714 708 681 714 684 699 714 652 665 715 665 713 715 664 652 715 700 664 715 713 700 715 699 712 716 714 699 716 712 702 716 245 328 717 650 245 717 649 650 717 328 312 717 312 651 717 651 649 717 521 517 718 598 521 718 144 145 719 701 144 719 705 168 719 688 701 719 145 705 719 25 55 721 118 115 722 115 711 722 696 679 723 695 704 723 721 695 723 704 696 723 4 38 724 122 4 724 131 122 724 637 131 724 682 637 724 38 40 724 40 682 724 692 707 725 707 709 725 709 697 725 686 688 727 688 719 727 719 726 727 153 214 728 214 685 728 151 153 728 694 151 728 685 544 728 544 694 728 700 713 729 720 700 729 713 686 729 686 727 729 693 700 730 700 720 730 702 693 730 711 672 731 722 711 731 672 692 731 692 725 731 261 250 732 534 261 732 250 581 732 581 710 732 708 714 733 714 716 733 716 702 733 697 708 734 708 733 734 725 697 734 731 725 734 721 55 735 684 689 735 689 695 735 695 721 735 699 684 735 720 729 736 729 727 736 730 720 736 702 730 736 733 702 736 734 733 736 628 659 737 679 628 737 723 679 737 25 721 737 721 723 737 322 443 738 678 322 738 735 55 739 699 735 739 315 269 740 269 329 740 55 63 741 739 55 741 63 706 741 706 699 741 699 739 741 168 118 742 719 168 742 118 722 742 722 731 742 48 49 743 47 48 743 44 47 743 660 682 743 727 726 744 736 727 744 726 719 744 719 742 744 731 734 744 742 731 744 734 736 744 54 51 745 74 70 745 70 54 745 51 562 745 562 560 745 82 91 746 249 82 746 290 249 746 320 290 746 517 557 747 28 20 748 20 22 748 22 30 748 30 690 748 17 28 748 66 60 749 718 517 749 517 747 749 540 565 750 625 540 750 690 625 750 748 690 750 2 24 751 94 2 751 565 94 751 21 16 751 16 17 751 17 748 751 24 21 751 750 565 751 748 750 751 7 25 752 25 737 752 124 125 757 315 740 758 753 756 762 73 66 763 309 73 763 557 309 763 747 557 763 760 762 766 760 761 767 754 753 767 753 762 767 762 760 767 329 534 768 740 329 768 758 740 768 534 732 768 732 758 768 761 765 770 765 127 770 761 760 771 760 766 771 756 755 772 762 756 772 755 759 772 766 762 772 775 769 776 759 755 777 773 777 779 756 753 780 776 769 780 755 756 780 777 755 780 769 779 780 779 777 780 127 121 781 770 127 781 767 761 781 761 770 781 732 710 782 777 773 786 784 777 786 754 767 787 767 781 787 783 754 787 781 121 787 780 753 788 753 754 788 754 783 788 776 780 789 780 788 789 785 776 789 788 783 789 771 766 792 766 772 793 792 766 793 128 127 794 764 128 794 127 765 794 765 761 794 761 771 794 771 792 794 119 177 795 132 119 795 790 778 798 778 791 798 132 795 801 795 774 801 774 798 801 769 775 802 779 769 802 773 779 802 786 773 802 784 786 803 778 790 804 791 778 804 790 799 804 799 797 804 802 775 805 177 110 806 774 795 806 795 177 806 790 798 806 798 774 806 792 793 807 791 804 808 65 71 809 488 568 809 57 56 809 568 57 809 56 65 809 79 84 811 84 90 811 71 75 812 809 71 812 75 79 812 79 811 812 786 802 813 803 786 813 802 805 814 772 759 815 78 74 816 74 745 816 759 777 817 815 759 817 777 784 817 803 813 818 560 646 819 646 513 819 745 560 819 125 128 821 128 764 821 764 794 821 794 792 821 792 807 821 798 791 822 791 808 822 299 678 823 710 299 823 678 738 823 818 813 824 758 732 825 732 782 825 820 810 826 110 108 827 806 110 827 818 796 828 828 796 829 800 828 829 783 787 830 787 121 830 488 809 831 809 812 831 401 488 831 738 443 832 823 738 832 49 58 833 743 49 833 660 743 833 819 513 834 784 803 835 800 817 835 828 800 835 817 784 835 803 818 835 818 828 835 814 805 836 124 757 837 757 125 837 125 821 837 821 807 837 804 797 838 443 401 839 832 443 839 401 831 839 785 789 840 836 805 841 797 799 842 838 797 842 775 776 843 776 785 843 805 775 843 841 805 843 785 840 843 111 115 844 841 843 845 682 44 846 44 743 846 743 682 846 820 826 847 826 842 847 842 799 847 819 834 848 847 799 849 85 78 850 78 816 850 816 745 850 745 819 850 793 772 851 772 815 851 807 793 851 60 61 852 749 60 852 718 749 852 799 790 853 849 799 853 136 132 854 132 801 854 796 818 855 818 824 855 829 796 855 121 117 856 830 121 856 789 783 856 840 789 856 783 830 856 117 840 856 812 811 857 811 848 857 831 812 857 848 834 857 115 118 858 659 661 859 737 659 859 58 59 859 833 58 859 661 660 859 660 833 859 345 315 860 315 758 860 513 345 860 834 513 860 758 825 860 186 111 861 111 844 861 201 186 861 853 201 861 849 853 861 126 100 862 171 126 862 100 124 862 124 837 862 118 171 862 837 807 862 802 814 863 826 810 864 842 826 864 838 842 864 824 813 865 90 85 866 811 90 866 819 848 866 848 811 866 85 850 866 850 819 866 108 107 867 827 108 867 806 827 867 107 204 867 790 806 867 853 790 867 204 201 867 201 853 867 813 802 868 802 863 868 865 813 868 66 749 869 749 747 869 747 763 869 763 66 869 800 829 870 829 820 870 820 847 870 817 800 870 847 849 870 808 804 871 804 838 871 863 814 872 868 863 872 815 817 873 851 815 873 807 851 873 817 870 873 825 832 874 860 825 874 834 860 874 810 820 875 820 829 875 829 855 875 801 798 876 798 822 876 854 801 876 782 710 877 710 823 877 825 782 877 858 118 878 118 862 878 808 871 879 822 808 879 876 822 879 862 807 880 878 862 880 807 873 880 873 870 880 839 831 881 831 857 881 857 834 881 834 874 881 832 839 881 874 832 881 841 845 882 844 115 883 115 858 883 861 844 883 823 832 884 877 823 884 832 825 884 825 877 884 871 838 885 1 59 886 59 58 886 58 598 886 870 849 887 858 878 887 878 880 887 880 870 887 883 858 887 849 861 887 861 883 887 838 864 888 885 838 888 836 841 889 814 836 889 872 814 889 888 864 890 879 871 891 871 885 891 885 888 891 122 131 892 131 136 892 136 854 892 854 876 892 117 114 893 840 117 893 843 840 893 845 843 893 882 845 893 1 6 894 6 7 894 7 752 894 752 737 894 737 859 894 864 810 895 810 875 895 890 864 895 32 30 896 872 889 896 29 32 897 889 29 897 32 896 897 896 889 897 872 896 898 824 865 899 875 855 901 895 875 901 855 900 901 865 868 902 899 865 902 19 29 903 13 19 903 882 13 903 841 882 903 29 889 903 889 841 903 3 8 904 114 3 904 893 114 904 8 13 904 13 882 904 882 893 904 20 28 905 22 20 905 868 872 905 872 898 905 902 868 905 39 41 906 888 890 906 891 888 906 46 42 907 876 879 907 45 46 907 879 891 907 39 906 908 61 81 909 852 61 909 81 1 909 1 886 909 598 718 909 886 598 909 718 852 909 41 45 910 906 41 910 891 906 910 45 907 910 907 891 910 30 22 911 22 905 911 896 30 911 898 896 911 905 898 911 900 855 912 37 39 913 39 908 913 906 890 913 908 906 913 21 24 914 855 824 914 824 899 914 24 2 914 912 855 914 42 43 915 43 122 915 122 892 915 892 876 915 876 907 915 907 42 915 890 895 916 913 890 916 37 913 916 67 1 917 59 67 917 859 59 917 35 34 918 34 37 918 37 916 918 895 901 918 916 895 918 91 96 919 746 91 919 96 320 919 320 746 919 17 16 920 28 17 920 902 905 920 905 28 920 16 21 920 21 914 920 899 902 920 914 899 920 900 912 921 901 900 921 918 901 921 1 894 922 894 859 922 859 917 922 917 1 922 36 35 923 35 918 923 918 921 923 921 36 923 33 36 924 36 921 924 912 914 925 914 2 925 921 912 925 2 31 925 924 921 925 31 33 925 33 924 925 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ref/verify.ti10000644000076500000000000000636212665102037020133 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Thu Mar 11 19:23:29 2010" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "11" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "3" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 26 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 10.000 10.000 10.000 1.9432 1.9923 2.0809 4 20.000 20.000 20.000 4.1154 4.2774 4.5702 5 30.000 30.000 30.000 7.8923 8.2507 8.8984 6 40.000 40.000 40.000 13.504 14.154 15.329 7 50.000 50.000 50.000 21.143 22.190 24.083 8 60.000 60.000 60.000 30.977 32.536 35.353 9 70.000 70.000 70.000 43.159 45.351 49.313 10 80.000 80.000 80.000 57.824 60.779 66.119 11 90.000 90.000 90.000 75.101 78.954 85.918 12 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 13 100.00 0.0000 0.0000 41.830 22.052 2.9132 14 100.00 50.000 50.000 53.233 38.736 25.587 15 0.0000 50.000 0.0000 8.5782 16.154 3.5261 16 0.0000 100.00 0.0000 36.405 71.801 12.802 17 50.000 100.00 50.000 48.970 77.836 33.359 18 0.0000 0.0000 50.000 4.8252 2.5298 21.147 19 0.0000 0.0000 100.00 18.871 8.1473 95.129 20 50.000 50.000 100.00 35.189 27.808 98.065 21 0.0000 50.000 50.000 12.403 17.684 23.674 22 0.0000 100.00 100.00 54.276 78.948 106.93 23 50.000 0.0000 50.000 13.564 7.0358 21.557 24 100.00 0.0000 100.00 59.701 29.199 97.042 25 50.000 50.000 0.0000 17.318 20.660 3.9356 26 100.00 100.00 0.0000 77.235 92.853 14.715 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "March 11, 2010" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 47.361 100.00 25.613 21.629 97.376 2 100.00 0.0000 79.351 52.426 26.290 58.722 3 0.0000 0.0000 58.997 6.4858 3.1940 29.894 4 100.00 66.659 0.0000 56.059 50.505 7.6561 5 0.0000 35.601 0.0000 4.6856 8.3702 2.2286 6 84.444 0.0000 0.0000 28.843 15.356 2.3047 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "March 11, 2010" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 100.00 100.00 54.276 78.948 106.93 2 100.00 0.0000 100.00 59.701 29.199 97.042 3 0.0000 0.0000 100.00 18.871 8.1473 95.129 4 100.00 100.00 0.0000 77.235 92.853 14.715 5 0.0000 100.00 0.0000 36.405 71.801 12.802 6 100.00 0.0000 0.0000 41.830 22.052 2.9132 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 50.000 50.000 50.000 21.143 22.190 24.083 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_extended.ti10000644000076500000000000001172412665102037022011 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Mon Mar 15 20:46:57 2010" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "21" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "3" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 51 BEGIN_DATA 1 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 2 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 3 5.000000 5.000000 5.000000 1.370397 1.389658 1.424468 4 10.00000 10.00000 10.00000 1.943213 1.992260 2.080902 5 15.00000 15.00000 15.00000 2.845113 2.941058 3.114460 6 20.00000 20.00000 20.00000 4.115373 4.277372 4.570151 7 25.00000 25.00000 25.00000 5.787770 6.036733 6.486682 8 30.00000 30.00000 30.00000 7.892261 8.250657 8.898384 9 35.00000 35.00000 35.00000 10.45596 10.94767 11.83633 10 40.00000 40.00000 40.00000 13.50377 14.15396 15.32905 11 45.00000 45.00000 45.00000 17.05880 17.89385 19.40304 12 50.00000 50.00000 50.00000 21.14266 22.19007 24.08306 13 55.00000 55.00000 55.00000 25.77574 27.06407 29.39246 14 60.00000 60.00000 60.00000 30.97732 32.53613 35.35337 15 65.00000 65.00000 65.00000 36.76577 38.62558 41.98681 16 70.00000 70.00000 70.00000 43.15862 45.35085 49.31287 17 75.00000 75.00000 75.00000 50.17267 52.72963 57.35083 18 80.00000 80.00000 80.00000 57.82407 60.77891 66.11917 19 85.00000 85.00000 85.00000 66.12838 69.51503 75.63573 20 90.00000 90.00000 90.00000 75.10060 78.95382 85.91771 21 95.00000 95.00000 95.00000 84.75528 89.11054 96.98177 22 50.00000 0.000000 0.000000 9.739336 5.506030 1.409510 23 100.0000 0.000000 0.000000 41.83017 22.05217 2.913230 24 100.0000 50.00000 50.00000 53.23349 38.73621 25.58678 25 0.000000 50.00000 0.000000 8.578171 16.15422 3.526078 26 0.000000 100.0000 0.000000 36.40521 71.80052 12.80184 27 50.00000 100.0000 50.00000 48.96970 77.83637 33.35882 28 0.000000 0.000000 50.00000 4.825152 2.529819 21.14747 29 0.000000 0.000000 100.0000 18.87111 8.147314 95.12896 30 50.00000 50.00000 100.0000 35.18861 27.80757 98.06455 31 0.000000 50.00000 50.00000 12.40332 17.68404 23.67355 32 0.000000 100.0000 100.0000 54.27632 78.94783 106.9308 33 66.66667 100.0000 100.0000 70.68914 87.41034 107.6999 34 50.00000 0.000000 50.00000 13.56449 7.035849 21.55698 35 100.0000 0.000000 100.0000 59.70128 29.19948 97.04219 36 100.0000 66.66667 100.0000 73.93339 57.65972 101.7863 37 50.00000 50.00000 0.000000 17.31751 20.66025 3.935588 38 100.0000 100.0000 0.000000 77.23538 92.85269 14.71507 39 100.0000 100.0000 66.66667 84.41917 95.72575 52.55282 40 66.66667 33.33333 33.33333 22.25253 16.54342 11.39201 41 33.33333 66.66667 33.33333 20.56463 32.02193 14.46871 42 33.33333 33.33333 66.66667 15.10914 12.21712 40.08365 43 33.33333 66.66667 66.66667 26.12498 34.24571 43.75563 44 66.66667 33.33333 66.66667 27.81288 18.76721 40.67893 45 66.66667 66.66667 33.33333 33.26837 38.57202 15.06399 46 100.0000 0.000000 66.66667 49.01396 24.92523 40.75098 47 66.66667 100.0000 0.000000 52.81803 80.26302 13.57091 48 0.000000 66.66667 100.0000 33.10322 36.60755 99.87304 49 0.000000 100.0000 66.66667 43.58900 74.67358 50.63959 50 66.66667 0.000000 100.0000 35.28393 16.60982 95.89804 51 100.0000 66.66667 0.000000 56.06228 50.51241 7.657307 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "March 15, 2010" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 47.361 100.00 25.613 21.629 97.376 2 100.00 0.0000 79.351 52.426 26.290 58.722 3 0.0000 0.0000 58.997 6.4858 3.1940 29.894 4 100.00 66.659 0.0000 56.059 50.505 7.6561 5 0.0000 35.601 0.0000 4.6856 8.3702 2.2286 6 84.444 0.0000 0.0000 28.843 15.356 2.3047 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "March 15, 2010" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 100.00 100.00 54.276 78.948 106.93 2 100.00 0.0000 100.00 59.701 29.199 97.042 3 0.0000 0.0000 100.00 18.871 8.1473 95.129 4 100.00 100.00 0.0000 77.235 92.853 14.715 5 0.0000 100.00 0.0000 36.405 71.801 12.802 6 100.00 0.0000 0.0000 41.830 22.052 2.9132 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 50.000 50.000 50.000 21.143 22.190 24.083 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_grayscale.ti10000644000076500000000000001024212665102037022155 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Mon Jan 13 18:48:08 2014" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 41 BEGIN_DATA 1 100.000 100.000 100.000 95.1065 100.000 108.844 2 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 3 2.50000 2.50000 2.50000 1.18209 1.19156 1.20868 4 5.00000 5.00000 5.00000 1.37040 1.38966 1.42447 5 7.50000 7.50000 7.50000 1.61841 1.65057 1.70869 6 10.0000 10.0000 10.0000 1.94321 1.99226 2.08090 7 12.5000 12.5000 12.5000 2.35042 2.42064 2.54755 8 15.0000 15.0000 15.0000 2.84511 2.94106 3.11446 9 17.5000 17.5000 17.5000 3.43198 3.55845 3.78700 10 20.0000 20.0000 20.0000 4.11537 4.27737 4.57015 11 22.5000 22.5000 22.5000 4.89936 5.10212 5.46858 12 25.0000 25.0000 25.0000 5.78777 6.03673 6.48668 13 27.5000 27.5000 27.5000 6.78425 7.08503 7.62863 14 30.0000 30.0000 30.0000 7.89226 8.25066 8.89838 15 32.5000 32.5000 32.5000 9.11511 9.53709 10.2997 16 35.0000 35.0000 35.0000 10.4560 10.9477 11.8363 17 37.5000 37.5000 37.5000 11.9179 12.4856 13.5116 18 40.0000 40.0000 40.0000 13.5038 14.1540 15.3291 19 42.5000 42.5000 42.5000 15.2165 15.9558 17.2918 20 45.0000 45.0000 45.0000 17.0588 17.8938 19.4030 21 47.5000 47.5000 47.5000 19.0333 19.9711 21.6658 22 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 23 52.5000 52.5000 52.5000 23.3893 24.5536 26.6577 24 55.0000 55.0000 55.0000 25.7757 27.0641 29.3925 25 57.5000 57.5000 57.5000 28.3043 29.7241 32.2901 26 60.0000 60.0000 60.0000 30.9773 32.5361 35.3534 27 62.5000 62.5000 62.5000 33.7971 35.5025 38.5847 28 65.0000 65.0000 65.0000 36.7658 38.6256 41.9868 29 67.5000 67.5000 67.5000 39.8856 41.9076 45.5620 30 70.0000 70.0000 70.0000 43.1586 45.3509 49.3129 31 72.5000 72.5000 72.5000 46.5870 48.9575 53.2417 32 75.0000 75.0000 75.0000 50.1727 52.7296 57.3508 33 77.5000 77.5000 77.5000 53.9177 56.6694 61.6426 34 80.0000 80.0000 80.0000 57.8241 60.7789 66.1192 35 82.5000 82.5000 82.5000 61.8937 65.0601 70.7828 36 85.0000 85.0000 85.0000 66.1284 69.5150 75.6357 37 87.5000 87.5000 87.5000 70.5301 74.1456 80.6800 38 90.0000 90.0000 90.0000 75.1006 78.9538 85.9177 39 92.5000 92.5000 92.5000 79.8417 83.9415 91.3510 40 95.0000 95.0000 95.0000 84.7553 89.1105 96.9818 41 97.5000 97.5000 97.5000 89.8430 94.4628 102.812 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 47.3607 100.000 25.6130 21.6292 97.3763 2 100.000 0.00000 79.3514 52.4258 26.2898 58.7215 3 0.00000 0.00000 58.9971 6.48583 3.19399 29.8944 4 100.000 66.6593 0.00000 56.0588 50.5054 7.65614 5 0.00000 35.6011 0.00000 4.68562 8.37021 2.22855 6 84.4444 0.00000 0.00000 28.8428 15.3558 2.30466 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 100.000 100.000 54.2763 78.9478 106.931 2 100.000 0.00000 100.000 59.7013 29.1995 97.0422 3 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 4 100.000 100.000 0.00000 77.2354 92.8527 14.7151 5 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 6 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_large.ti10000644000076500000000000004170012665102037021300 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "200" CREATED "Sun Oct 20 16:10:47 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "21" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 325 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.3704 1.3897 1.4245 5 7.5000 7.5000 7.5000 1.6184 1.6506 1.7087 6 10.000 10.000 10.000 1.9432 1.9923 2.0809 7 12.500 12.500 12.500 2.3504 2.4206 2.5475 8 15.000 15.000 15.000 2.8451 2.9411 3.1145 9 17.500 17.500 17.500 3.4320 3.5584 3.7870 10 20.000 20.000 20.000 4.1154 4.2774 4.5702 11 22.500 22.500 22.500 4.8994 5.1021 5.4686 12 25.000 25.000 25.000 5.7878 6.0367 6.4867 13 27.500 27.500 27.500 6.7843 7.0850 7.6286 14 30.000 30.000 30.000 7.8923 8.2507 8.8984 15 32.500 32.500 32.500 9.1151 9.5371 10.300 16 35.000 35.000 35.000 10.456 10.948 11.836 17 37.500 37.500 37.500 11.918 12.486 13.512 18 40.000 40.000 40.000 13.504 14.154 15.329 19 42.500 42.500 42.500 15.216 15.956 17.292 20 45.000 45.000 45.000 17.059 17.894 19.403 21 47.500 47.500 47.500 19.033 19.971 21.666 22 50.000 50.000 50.000 21.143 22.190 24.083 23 52.500 52.500 52.500 23.389 24.554 26.658 24 55.000 55.000 55.000 25.776 27.064 29.392 25 57.500 57.500 57.500 28.304 29.724 32.290 26 60.000 60.000 60.000 30.977 32.536 35.353 27 62.500 62.500 62.500 33.797 35.503 38.585 28 65.000 65.000 65.000 36.766 38.626 41.987 29 67.500 67.500 67.500 39.886 41.908 45.562 30 70.000 70.000 70.000 43.159 45.351 49.313 31 72.500 72.500 72.500 46.587 48.957 53.242 32 75.000 75.000 75.000 50.173 52.730 57.351 33 77.500 77.500 77.500 53.918 56.669 61.643 34 80.000 80.000 80.000 57.824 60.779 66.119 35 82.500 82.500 82.500 61.894 65.060 70.783 36 85.000 85.000 85.000 66.128 69.515 75.636 37 87.500 87.500 87.500 70.530 74.146 80.680 38 90.000 90.000 90.000 75.101 78.954 85.918 39 92.500 92.500 92.500 79.842 83.941 91.351 40 95.000 95.000 95.000 84.755 89.111 96.982 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 1.1607 1.0829 1.0075 43 10.000 0.0000 0.0000 1.4092 1.2110 1.0192 44 15.000 0.0000 0.0000 1.8005 1.4128 1.0375 45 20.000 0.0000 0.0000 2.3517 1.6969 1.0633 46 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 47 30.000 0.0000 0.0000 3.9904 2.5418 1.1401 48 35.000 0.0000 0.0000 5.1027 3.1154 1.1922 49 40.000 0.0000 0.0000 6.4250 3.7972 1.2542 50 45.000 0.0000 0.0000 7.9675 4.5924 1.3265 51 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 52 55.000 0.0000 0.0000 11.749 6.5425 1.5037 53 60.000 0.0000 0.0000 14.006 7.7061 1.6095 54 65.000 0.0000 0.0000 16.518 9.0010 1.7271 55 70.000 0.0000 0.0000 19.291 10.431 1.8571 56 75.000 0.0000 0.0000 22.335 12.000 1.9997 57 80.000 0.0000 0.0000 25.654 13.712 2.1553 58 85.000 0.0000 0.0000 29.257 15.570 2.3241 59 90.000 0.0000 0.0000 33.150 17.577 2.5065 60 95.000 0.0000 0.0000 37.339 19.737 2.7028 61 100.00 0.0000 0.0000 41.830 22.052 2.9132 62 0.0000 5.0000 0.0000 1.1394 1.2787 1.0465 63 0.0000 10.000 0.0000 1.3549 1.7096 1.1183 64 0.0000 15.000 0.0000 1.6942 2.3882 1.2314 65 0.0000 20.000 0.0000 2.1721 3.3438 1.3907 66 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 67 0.0000 30.000 0.0000 3.5930 6.1854 1.8644 68 0.0000 35.000 0.0000 4.5576 8.1141 2.1859 69 0.0000 40.000 0.0000 5.7042 10.407 2.5681 70 0.0000 45.000 0.0000 7.0417 13.082 3.0139 71 0.0000 50.000 0.0000 8.5782 16.154 3.5261 72 0.0000 55.000 0.0000 10.321 19.640 4.1071 73 0.0000 60.000 0.0000 12.278 23.553 4.7594 74 0.0000 65.000 0.0000 14.456 27.908 5.4854 75 0.0000 70.000 0.0000 16.861 32.718 6.2871 76 0.0000 75.000 0.0000 19.500 37.995 7.1667 77 0.0000 80.000 0.0000 22.379 43.751 8.1263 78 0.0000 85.000 0.0000 25.503 49.999 9.1677 79 0.0000 90.000 0.0000 28.878 56.749 10.293 80 0.0000 95.000 0.0000 32.511 64.013 11.504 81 0.0000 100.00 0.0000 36.405 71.801 12.802 82 0.0000 0.0000 5.0000 1.0703 1.0281 1.3705 83 0.0000 0.0000 10.000 1.1791 1.0716 1.9434 84 0.0000 0.0000 15.000 1.3504 1.1401 2.8456 85 0.0000 0.0000 20.000 1.5916 1.2366 4.1161 86 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 87 0.0000 0.0000 30.000 2.3089 1.5235 7.8939 88 0.0000 0.0000 35.000 2.7957 1.7182 10.458 89 0.0000 0.0000 40.000 3.3745 1.9497 13.507 90 0.0000 0.0000 45.000 4.0496 2.2197 17.063 91 0.0000 0.0000 50.000 4.8252 2.5298 21.147 92 0.0000 0.0000 55.000 5.7050 2.8817 25.782 93 0.0000 0.0000 60.000 6.6928 3.2768 30.984 94 0.0000 0.0000 65.000 7.7920 3.7164 36.774 95 0.0000 0.0000 70.000 9.0060 4.2019 43.169 96 0.0000 0.0000 75.000 10.338 4.7346 50.184 97 0.0000 0.0000 80.000 11.791 5.3157 57.838 98 0.0000 0.0000 85.000 13.368 5.9464 66.144 99 0.0000 0.0000 90.000 15.072 6.6279 75.118 100 0.0000 0.0000 95.000 16.905 7.3611 84.775 101 0.0000 0.0000 100.00 18.871 8.1473 95.129 102 100.00 50.000 50.000 53.233 38.736 25.587 103 50.000 100.00 50.000 48.970 77.836 33.359 104 50.000 50.000 100.00 35.189 27.808 98.065 105 0.0000 50.000 50.000 12.403 17.684 23.674 106 0.0000 100.00 100.00 54.276 78.948 106.93 107 66.667 100.00 100.00 70.689 87.410 107.70 108 50.000 0.0000 50.000 13.564 7.0358 21.557 109 100.00 0.0000 100.00 59.701 29.199 97.042 110 100.00 66.667 100.00 73.933 57.660 101.79 111 50.000 50.000 0.0000 17.318 20.660 3.9356 112 100.00 100.00 0.0000 77.235 92.853 14.715 113 100.00 100.00 66.667 84.419 95.726 52.553 114 66.667 33.333 33.333 22.253 16.543 11.392 115 33.333 66.667 33.333 20.565 32.022 14.469 116 33.333 33.333 66.667 15.109 12.217 40.084 117 33.333 66.667 66.667 26.125 34.246 43.756 118 66.667 33.333 66.667 27.813 18.767 40.679 119 66.667 66.667 33.333 33.268 38.572 15.064 120 100.00 0.0000 66.667 49.014 24.925 40.751 121 66.667 100.00 0.0000 52.818 80.263 13.571 122 0.0000 66.667 100.00 33.103 36.608 99.873 123 0.0000 100.00 66.667 43.589 74.674 50.640 124 66.667 0.0000 100.00 35.284 16.610 95.898 125 100.00 66.667 0.0000 56.062 50.512 7.6573 126 25.665 0.0000 0.0000 3.1876 2.1279 1.1025 127 68.161 35.358 27.002 22.933 17.579 8.5973 128 80.462 47.698 33.859 34.498 28.237 13.283 129 41.319 53.173 11.065 15.680 21.397 5.2654 130 50.198 74.689 16.807 28.573 42.370 9.7830 131 52.842 84.771 67.979 42.708 57.782 49.090 132 84.523 84.137 100.00 70.718 70.418 104.42 133 19.278 18.627 29.511 4.5538 4.2090 8.0694 134 70.801 19.825 34.011 22.606 13.655 11.177 135 87.995 21.393 71.227 41.208 22.745 46.707 136 91.008 25.897 90.262 50.066 27.526 77.796 137 32.778 0.0000 100.00 22.454 9.9947 95.297 138 44.224 20.024 100.00 26.759 13.958 95.835 139 68.736 29.691 100.00 38.975 22.281 96.798 140 81.754 9.1441 34.621 28.951 15.668 11.563 141 83.704 0.0000 51.876 32.439 16.731 24.100 142 84.009 0.0000 83.686 40.462 19.965 65.186 143 43.285 15.428 57.571 13.342 7.8447 28.929 144 53.174 15.742 71.304 20.085 10.998 45.657 145 52.241 49.504 73.873 27.054 24.397 51.470 146 33.359 35.738 43.288 11.238 11.468 17.199 147 46.183 53.166 46.252 20.257 23.404 21.266 148 67.814 66.608 53.864 36.746 39.992 30.213 149 74.316 68.051 71.535 45.201 44.926 51.200 150 89.766 10.631 10.933 33.558 18.343 3.7134 151 100.00 0.0000 30.873 43.218 22.607 10.221 152 100.00 0.0000 65.701 48.785 24.834 39.547 153 93.216 7.5584 44.579 39.034 20.614 18.453 154 100.00 19.075 48.837 46.538 25.651 22.420 155 100.00 48.125 48.715 52.425 37.453 24.286 156 19.753 10.620 65.990 9.7334 5.2692 38.184 157 17.255 0.0000 81.005 13.126 5.9687 59.502 158 31.609 15.844 79.502 15.732 8.4999 57.458 159 47.548 28.283 84.435 23.327 14.519 66.307 160 56.585 14.312 26.843 14.124 8.5949 7.2622 161 60.210 52.894 26.148 23.662 25.275 9.7008 162 73.037 71.483 32.251 39.243 45.208 15.472 163 100.00 100.00 49.139 80.920 94.326 34.121 164 0.0000 73.081 0.0000 18.459 35.913 6.8198 165 20.686 100.00 17.749 38.320 72.733 15.366 166 24.754 100.00 43.829 41.325 74.004 28.080 167 17.589 60.844 30.957 15.090 25.364 12.275 168 18.959 85.401 41.509 29.555 52.179 22.838 169 84.390 86.194 42.826 56.832 66.998 25.185 170 22.174 82.074 0.0000 25.289 47.130 8.6252 171 36.119 100.00 0.0000 40.785 74.059 13.007 172 34.989 89.006 15.829 32.673 57.635 12.284 173 40.193 89.300 35.374 35.707 59.334 20.056 174 48.153 100.00 52.416 48.700 77.650 35.496 175 12.410 32.334 82.818 16.265 12.005 63.473 176 10.305 54.979 90.294 24.918 25.515 78.791 177 0.0000 66.665 100.00 33.102 36.606 99.873 178 20.708 78.158 100.00 40.605 49.466 101.96 179 45.768 84.613 100.00 50.348 60.370 103.55 180 65.184 100.00 100.00 69.891 86.999 107.66 181 76.518 22.590 13.294 25.076 15.575 4.0364 182 100.00 23.824 24.308 44.330 25.674 7.9919 183 62.018 11.822 10.151 15.636 9.2127 2.7756 184 75.947 0.0000 0.0000 22.942 12.313 2.0281 185 81.424 18.801 56.042 32.597 18.274 28.369 186 85.026 15.380 100.00 47.873 24.178 96.696 187 31.430 9.0865 41.360 7.1428 4.3277 14.679 188 33.372 70.135 43.720 23.515 35.918 21.587 189 38.070 88.681 60.754 38.704 59.780 41.036 190 49.510 100.00 82.002 56.368 80.774 73.287 191 0.0000 34.231 20.121 4.9959 8.0335 5.2842 192 26.068 34.704 18.166 7.2463 9.3512 4.8761 193 31.962 50.192 26.608 13.072 18.446 9.1237 194 100.00 24.248 0.0000 43.527 25.445 3.4787 195 100.00 50.715 0.0000 49.645 37.679 5.5181 196 87.973 37.148 16.310 35.970 24.961 5.9146 197 100.00 49.362 24.672 50.087 37.146 10.036 198 100.00 74.328 25.467 60.905 58.687 13.924 199 34.821 11.176 13.313 5.7674 4.0528 2.8330 200 76.016 0.0000 23.807 23.813 12.667 6.3817 201 87.758 30.282 37.859 36.126 22.789 14.444 202 87.506 42.180 61.073 42.354 29.449 35.345 203 90.432 44.028 91.678 53.939 35.156 81.727 204 45.223 64.036 30.740 22.435 31.214 12.913 205 49.270 65.115 63.748 29.481 34.981 40.168 206 60.085 66.390 83.402 39.999 40.666 68.729 207 33.139 35.732 71.321 16.725 13.654 46.370 208 35.879 40.262 89.483 23.979 18.320 75.951 209 50.537 41.721 100.00 32.958 23.043 97.262 210 65.384 50.566 44.380 27.447 25.818 19.918 211 87.494 61.484 43.792 45.941 41.502 21.536 212 87.915 82.347 57.717 59.534 64.435 37.571 213 0.0000 0.0000 29.574 2.2714 1.5085 7.6968 214 0.0000 73.930 51.188 22.940 38.435 28.170 215 7.2442 82.171 94.800 39.790 52.866 91.956 216 30.173 100.00 100.00 57.302 80.508 107.07 217 23.675 0.0000 24.768 3.7598 2.3197 5.7893 218 63.989 0.0000 70.434 24.106 11.975 44.456 219 65.720 31.557 75.677 29.303 18.757 52.886 220 66.530 72.242 100.00 52.224 50.597 101.57 221 22.405 48.936 49.710 13.690 17.842 23.386 222 24.886 51.283 79.271 21.636 22.298 59.447 223 24.603 68.521 87.180 31.234 37.523 75.110 224 26.209 25.670 57.508 10.365 8.0449 29.059 225 49.837 37.247 59.721 19.362 15.826 32.436 226 69.050 49.229 62.485 32.297 27.292 37.061 227 78.315 43.615 78.708 40.560 28.581 58.783 228 84.706 64.396 86.583 55.112 46.971 74.619 229 0.0000 100.00 28.303 37.569 72.266 18.931 230 0.0000 100.00 51.968 40.564 73.464 34.707 231 0.0000 100.00 75.598 45.910 75.602 62.867 232 0.0000 56.952 26.775 12.101 21.533 9.8386 233 60.823 88.348 30.980 42.534 61.931 17.899 234 71.789 100.00 40.171 58.150 82.735 26.328 235 74.445 51.465 6.9792 30.157 27.993 5.2330 236 75.471 70.107 0.0000 38.551 43.981 7.3189 237 100.00 77.017 0.0000 61.462 61.310 9.4572 238 54.635 50.673 0.0000 19.395 22.061 4.0966 239 65.223 66.337 13.747 31.013 37.331 8.0112 240 75.566 85.925 8.0285 47.934 62.448 11.067 241 78.966 100.00 19.178 60.897 84.365 16.804 242 68.326 86.571 68.778 51.568 64.081 50.873 243 68.692 86.649 85.438 56.640 66.217 76.255 244 78.771 100.00 84.664 72.476 88.981 78.482 245 0.0000 22.319 0.0000 2.4443 3.8883 1.4814 246 13.836 24.386 8.5050 3.5517 4.8454 2.3440 247 27.787 27.246 0.0000 5.6986 6.5930 1.8321 248 43.668 32.957 24.126 11.524 10.991 6.8198 249 52.709 36.677 40.178 17.116 14.852 15.390 250 51.769 73.294 45.181 31.072 42.230 23.500 251 100.00 74.277 49.815 63.729 59.773 28.934 252 73.801 34.459 51.978 29.185 20.163 25.026 253 43.142 19.737 35.625 10.374 7.3146 11.492 254 62.365 17.069 53.517 20.469 11.823 25.303 255 100.00 32.410 69.847 52.833 31.309 45.890 256 100.00 55.042 77.177 61.123 44.705 58.463 257 100.00 78.496 77.802 72.454 67.075 63.136 258 0.0000 0.0000 63.452 7.4397 3.5755 34.918 259 9.9374 9.2115 91.257 16.239 7.6423 77.605 260 23.768 47.410 100.00 27.510 22.629 97.469 261 47.120 62.678 100.00 38.978 36.942 99.628 262 15.970 65.970 48.240 19.339 30.682 24.325 263 12.404 81.802 67.123 31.348 49.161 46.933 264 49.292 82.441 84.000 44.390 55.925 72.451 265 89.750 61.096 62.806 50.980 43.460 39.570 266 92.200 81.373 88.820 70.827 68.389 81.935 267 50.307 0.0000 0.0000 9.8558 5.5661 1.4150 268 54.266 24.058 0.0000 13.110 9.7231 2.0460 269 77.132 34.645 0.0000 27.199 19.678 3.2255 270 87.526 61.437 15.609 43.444 40.474 8.3549 271 90.186 79.768 12.663 54.803 60.233 10.974 272 89.549 87.811 27.673 60.268 70.565 17.138 273 50.678 79.736 0.0000 31.218 48.074 8.4951 274 58.210 90.852 9.6697 41.819 64.293 11.959 275 71.465 100.00 0.0000 55.560 81.677 13.699 276 100.00 100.00 25.916 78.211 93.243 19.856 277 40.594 28.813 7.4171 9.1020 8.7107 2.6680 278 57.906 37.398 12.942 17.387 15.479 4.3569 279 65.494 84.947 48.555 44.839 59.502 28.807 280 72.328 100.00 62.625 62.336 84.447 46.674 281 0.0000 19.227 32.772 3.6563 3.8038 9.6203 282 11.666 38.090 64.169 12.368 12.397 37.210 283 30.213 74.026 65.876 28.997 41.292 43.981 284 32.716 86.718 84.485 42.403 58.981 73.970 285 33.216 54.802 63.220 20.318 23.947 37.901 286 39.443 61.890 85.823 30.982 32.918 71.847 287 19.642 21.158 100.00 21.482 11.428 95.625 288 15.493 0.0000 50.734 5.7952 3.0158 21.832 289 37.599 0.0000 53.997 10.283 5.2637 25.031 290 42.710 0.0000 79.959 18.012 8.5246 58.064 291 55.524 8.2388 89.135 26.008 12.696 74.119 292 65.986 0.0000 100.00 34.915 16.419 95.881 293 76.260 10.437 72.763 32.251 16.667 48.131 294 100.00 14.664 84.036 54.552 28.207 66.626 295 100.00 34.498 100.00 63.154 36.104 98.193 296 100.00 67.141 100.00 74.159 58.111 101.86 297 8.1638 8.9303 13.425 1.8905 1.8693 2.6371 298 14.259 47.478 11.643 8.7389 15.023 4.4952 299 13.322 67.035 11.928 16.297 30.241 7.0830 300 22.720 77.737 24.406 23.637 42.322 12.331 301 11.235 37.195 37.311 7.5815 10.149 13.174 302 0.0000 48.356 49.976 11.872 16.627 23.476 303 0.0000 48.964 75.712 17.781 19.298 53.650 304 63.842 49.183 88.773 36.868 28.769 75.989 305 48.265 0.0000 23.841 9.9265 5.5067 5.7431 306 58.576 0.0000 45.432 16.450 8.6063 17.973 307 69.384 18.308 86.994 32.961 17.447 70.814 308 11.656 16.463 47.761 5.8064 4.2930 19.549 309 0.0000 22.840 58.298 7.8544 6.1571 29.652 310 11.112 62.451 67.528 21.192 28.837 44.059 311 0.0000 75.828 77.317 29.956 42.913 59.971 312 16.533 92.162 86.956 44.389 65.525 79.425 313 0.0000 16.923 81.952 13.253 7.2775 61.289 314 0.0000 34.163 100.00 22.255 14.914 96.257 315 78.866 52.536 100.00 51.184 37.328 99.060 316 27.845 54.060 0.0000 12.551 20.279 4.1131 317 34.436 69.750 8.1956 20.836 34.565 7.1321 318 50.594 100.00 20.910 46.014 76.681 16.612 319 0.0000 47.356 0.0000 7.7405 14.479 3.2468 320 0.0000 79.426 21.027 22.686 43.326 11.438 321 3.9228 82.924 36.338 26.241 48.184 18.956 322 15.935 95.844 58.324 39.390 67.889 39.934 323 24.404 100.00 75.468 47.855 76.609 62.769 324 86.788 90.925 71.122 67.441 76.641 55.586 325 100.00 100.00 72.982 86.021 96.367 60.992 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 20, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 47.361 100.00 25.613 21.629 97.376 2 100.00 0.0000 79.351 52.426 26.290 58.722 3 0.0000 0.0000 58.997 6.4858 3.1940 29.894 4 100.00 66.659 0.0000 56.059 50.505 7.6561 5 0.0000 35.601 0.0000 4.6856 8.3702 2.2286 6 84.444 0.0000 0.0000 28.843 15.356 2.3047 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "October 20, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 100.00 100.00 54.276 78.948 106.93 2 100.00 0.0000 100.00 59.701 29.199 97.042 3 0.0000 0.0000 100.00 18.871 8.1473 95.129 4 100.00 100.00 0.0000 77.235 92.853 14.715 5 0.0000 100.00 0.0000 36.405 71.801 12.802 6 100.00 0.0000 0.0000 41.830 22.052 2.9132 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 50.000 50.000 50.000 21.143 22.190 24.083 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_video.ti10000644000076500000000000001054412665102037021316 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Fri Oct 11 21:11:25 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "11" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045684 99.999971 108.903720" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 47 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.90 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 10.000 10.000 10.000 2.1317 2.2428 2.4425 4 20.000 20.000 20.000 5.2684 5.5430 6.0365 5 30.000 30.000 30.000 10.002 10.523 11.460 6 40.000 40.000 40.000 16.442 17.299 18.839 7 50.000 50.000 50.000 24.673 25.959 28.270 8 60.000 60.000 60.000 34.771 36.584 39.841 9 70.000 70.000 70.000 46.802 49.242 53.626 10 80.000 80.000 80.000 60.823 63.994 69.692 11 90.000 90.000 90.000 76.889 80.896 88.099 12 75.000 0.0000 0.0000 23.239 11.983 1.0890 13 0.0000 75.000 0.0000 20.151 40.301 6.7164 14 0.0000 0.0000 75.000 10.171 4.0680 53.564 15 75.000 75.000 0.0000 43.390 52.284 7.8054 16 0.0000 75.000 75.000 30.322 44.369 60.281 17 75.000 0.0000 75.000 33.410 16.051 54.653 18 44.857 44.857 44.857 20.211 21.264 23.158 19 63.673 38.191 38.191 25.480 21.264 17.839 20 77.882 30.157 30.157 30.740 21.264 12.529 21 89.702 19.413 19.413 35.993 21.264 7.2266 22 100.00 0.0000 0.0000 41.238 21.264 1.9325 23 84.611 84.611 84.611 67.974 71.517 77.885 24 66.425 90.768 66.425 55.794 71.517 52.945 25 49.339 94.865 49.339 47.167 71.517 35.280 26 30.889 97.796 30.889 40.737 71.517 22.113 27 0.0000 100.00 0.0000 35.759 71.517 11.919 28 23.776 23.776 23.776 6.8614 7.2191 7.8619 29 22.893 22.893 33.269 7.5025 7.2191 12.858 30 21.329 21.329 45.163 8.5869 7.2191 21.310 31 17.770 17.770 62.889 10.818 7.2191 38.695 32 0.0000 0.0000 100.00 18.049 7.2191 95.054 33 96.356 96.356 96.356 88.184 92.781 101.04 34 97.606 97.606 78.320 84.396 92.781 71.521 35 98.581 98.581 60.005 81.409 92.781 48.236 36 99.361 99.361 39.013 78.992 92.781 29.401 37 100.00 100.00 0.0000 76.997 92.781 13.851 38 88.791 88.791 88.791 74.835 78.736 85.747 39 76.814 91.734 91.734 69.581 78.736 91.050 40 62.359 94.577 94.577 64.325 78.736 96.356 41 43.001 97.330 97.330 59.068 78.736 101.66 42 0.0000 100.00 100.00 53.807 78.736 106.97 43 52.554 52.554 52.554 27.072 28.483 31.020 44 61.327 48.605 61.327 31.424 28.483 39.931 45 71.488 42.636 71.488 37.351 28.483 52.068 46 83.868 32.173 83.868 45.896 28.483 69.566 47 100.00 0.0000 100.00 59.287 28.483 96.986 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 11, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04570 100.0000 108.9040 1 0.000000 41.07990 100.0000 24.53540 20.19270 97.21470 2 100.0000 0.000000 73.78220 51.08780 25.20380 53.80440 3 0.000000 0.000000 50.83590 4.831720 1.932570 25.44630 4 100.0000 60.58940 0.000000 54.56690 47.92100 6.374960 5 0.000000 28.22230 0.000000 3.400840 6.801620 1.133520 6 76.48680 0.000000 0.000000 24.15290 12.45430 1.131840 7 1.784250 1.568810 1.248170 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0457 100.000 108.904 1 0.00000 100.000 100.000 53.8072 78.7357 106.971 2 100.000 0.00000 100.000 59.2869 28.4832 96.9851 3 0.00000 0.00000 100.000 18.0485 7.21893 95.0526 4 100.000 100.000 0.00000 76.9972 92.7810 13.8511 5 0.00000 100.000 0.00000 35.7587 71.5167 11.9186 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93250 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6726 25.9586 28.2699 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_video_extended.ti10000644000076500000000000001360012775013140023170 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" CREATED "Fri Oct 11 21:11:25 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "21" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045684 99.999971 108.903720" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.90 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 5.0000 5.0000 5.0000 1.0560 1.1110 1.2099 4 10.000 10.000 10.000 2.1317 2.2428 2.4425 5 15.000 15.000 15.000 3.5075 3.6903 4.0189 6 20.000 20.000 20.000 5.2684 5.5430 6.0365 7 25.000 25.000 25.000 7.4285 7.8157 8.5116 8 30.000 30.000 30.000 10.002 10.523 11.460 9 35.000 35.000 35.000 13.002 13.680 14.898 10 40.000 40.000 40.000 16.442 17.299 18.839 11 45.000 45.000 45.000 20.328 21.388 23.292 12 50.000 50.000 50.000 24.673 25.959 28.270 13 55.000 55.000 55.000 29.485 31.022 33.784 14 60.000 60.000 60.000 34.771 36.584 39.841 15 65.000 65.000 65.000 40.542 42.655 46.453 16 70.000 70.000 70.000 46.802 49.242 53.626 17 75.000 75.000 75.000 53.560 56.352 61.370 18 80.000 80.000 80.000 60.823 63.994 69.692 19 85.000 85.000 85.000 68.597 72.173 78.599 20 90.000 90.000 90.000 76.889 80.896 88.099 21 95.000 95.000 95.000 85.702 90.170 98.198 22 75.000 0.0000 0.0000 23.239 11.983 1.0890 23 0.0000 75.000 0.0000 20.151 40.301 6.7164 24 0.0000 0.0000 75.000 10.171 4.0680 53.564 25 75.000 75.000 0.0000 43.390 52.284 7.8054 26 0.0000 75.000 75.000 30.322 44.369 60.281 27 75.000 0.0000 75.000 33.410 16.051 54.653 28 44.857 44.857 44.857 20.211 21.264 23.158 29 63.673 38.191 38.191 25.480 21.264 17.839 30 77.882 30.157 30.157 30.740 21.264 12.529 31 89.702 19.413 19.413 35.993 21.264 7.2266 32 100.00 0.0000 0.0000 41.238 21.264 1.9325 33 84.611 84.611 84.611 67.974 71.517 77.885 34 66.425 90.768 66.425 55.794 71.517 52.945 35 49.339 94.865 49.339 47.167 71.517 35.280 36 30.889 97.796 30.889 40.737 71.517 22.113 37 0.0000 100.00 0.0000 35.759 71.517 11.919 38 23.776 23.776 23.776 6.8614 7.2191 7.8619 39 22.893 22.893 33.269 7.5025 7.2191 12.858 40 21.329 21.329 45.163 8.5869 7.2191 21.310 41 17.770 17.770 62.889 10.818 7.2191 38.695 42 0.0000 0.0000 100.00 18.049 7.2191 95.054 43 96.356 96.356 96.356 88.184 92.781 101.04 44 97.606 97.606 78.320 84.396 92.781 71.521 45 98.581 98.581 60.005 81.409 92.781 48.236 46 99.361 99.361 39.013 78.992 92.781 29.401 47 100.00 100.00 0.0000 76.997 92.781 13.851 48 88.791 88.791 88.791 74.835 78.736 85.747 49 76.814 91.734 91.734 69.581 78.736 91.050 50 62.359 94.577 94.577 64.325 78.736 96.356 51 43.001 97.330 97.330 59.068 78.736 101.66 52 0.0000 100.00 100.00 53.807 78.736 106.97 53 52.554 52.554 52.554 27.072 28.483 31.020 54 61.327 48.605 61.327 31.424 28.483 39.931 55 71.488 42.636 71.488 37.351 28.483 52.068 56 83.868 32.173 83.868 45.896 28.483 69.566 57 100.00 0.0000 100.00 59.287 28.483 96.986 58 40.014 25.786 20.317 11.099 9.9635 6.7068 59 75.324 53.324 45.514 37.843 34.593 25.342 60 29.729 42.874 56.966 17.263 18.608 34.043 61 29.370 36.749 19.123 10.451 13.186 6.9022 62 45.878 45.225 65.633 24.698 23.284 44.310 63 30.467 71.586 63.893 30.296 42.064 45.565 64 86.504 43.440 12.117 38.502 30.443 6.5044 65 20.525 29.989 63.105 13.408 11.655 39.664 66 75.217 26.193 32.376 28.543 18.938 13.474 67 30.976 16.581 35.901 8.6732 6.4200 14.309 68 58.214 71.178 18.499 33.326 44.081 11.428 69 89.196 59.446 9.2210 45.989 42.749 7.7700 70 7.7021 18.704 53.282 7.7766 6.0657 28.411 71 20.128 54.049 23.036 14.282 23.155 10.217 72 67.276 12.896 16.166 20.622 12.158 5.1263 73 92.643 75.270 3.0853 55.771 58.867 9.0726 74 72.946 27.032 54.748 30.727 19.906 31.320 75 0.0000 48.676 62.903 14.518 19.761 40.936 76 95.568 95.693 94.577 86.481 91.294 97.612 77 76.096 76.909 76.998 55.793 58.956 64.583 78 59.061 59.970 60.149 34.343 36.341 39.981 79 42.165 42.383 42.534 18.187 19.160 21.010 80 26.405 27.083 27.768 8.3684 8.8404 10.026 81 12.892 13.165 13.693 2.9545 3.1078 3.5418 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 11, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04570 100.0000 108.9040 1 0.000000 41.07990 100.0000 24.53540 20.19270 97.21470 2 100.0000 0.000000 73.78220 51.08780 25.20380 53.80440 3 0.000000 0.000000 50.83590 4.831720 1.932570 25.44630 4 100.0000 60.58940 0.000000 54.56690 47.92100 6.374960 5 0.000000 28.22230 0.000000 3.400840 6.801620 1.133520 6 76.48680 0.000000 0.000000 24.15290 12.45430 1.131840 7 1.784250 1.568810 1.248170 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0457 100.000 108.904 1 0.00000 100.000 100.000 53.8072 78.7357 106.971 2 100.000 0.00000 100.000 59.2869 28.4832 96.9851 3 0.00000 0.00000 100.000 18.0485 7.21893 95.0526 4 100.000 100.000 0.00000 76.9972 92.7810 13.8511 5 0.00000 100.000 0.00000 35.7587 71.5167 11.9186 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93250 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6726 25.9586 28.2699 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_video_extended_hlg_p3_2020.ti10000644000076500000000000001137413220336703025074 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll fakeread" CREATED "Tue Dec 26 03:06:17 2017" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" COLOR_REP "RGB" ACCURATE_EXPECTED_VALUES "true" WHITE_COLOR_PATCHES "1" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "21" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.90 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 5.0000 5.0000 5.0000 1.0560 1.1110 1.2099 4 10.000 10.000 10.000 2.1317 2.2428 2.4425 5 15.000 15.000 15.000 3.5075 3.6903 4.0189 6 20.000 20.000 20.000 5.2684 5.5430 6.0365 7 25.000 25.000 25.000 7.4285 7.8157 8.5116 8 30.000 30.000 30.000 10.002 10.523 11.460 9 35.000 35.000 35.000 13.002 13.680 14.898 10 40.000 40.000 40.000 16.442 17.299 18.839 11 45.000 45.000 45.000 20.328 21.388 23.292 12 50.000 50.000 50.000 24.673 25.959 28.270 13 55.000 55.000 55.000 29.485 31.022 33.784 14 60.000 60.000 60.000 34.771 36.584 39.841 15 65.000 65.000 65.000 40.542 42.655 46.453 16 70.000 70.000 70.000 46.802 49.242 53.626 17 75.000 75.000 75.000 53.560 56.352 61.370 18 80.000 80.000 80.000 60.823 63.994 69.692 19 85.000 85.000 85.000 68.597 72.173 78.599 20 90.000 90.000 90.000 76.889 80.896 88.099 21 95.000 95.000 95.000 85.702 90.170 98.198 22 68.10344 18.13956 0.347659 6.827409 3.197971 0.0198968 23 44.06267 74.04603 12.37307 5.627853 13.49608 0.894779 24 18.65244 8.331777 74.31737 2.324516 0.902235 12.39342 25 74.12669 74.85020 12.11503 15.12269 18.50980 0.947631 26 47.94437 74.18262 75.03881 9.520637 15.21027 21.10260 27 69.27912 19.90312 74.47854 10.29913 4.575160 16.39262 28 44.85769 44.85618 44.85673 3.714482 3.907611 4.256424 29 58.91066 39.81693 38.14036 5.501205 4.162955 3.115252 30 71.91090 35.37149 29.99956 9.597362 5.530739 2.035504 31 83.39769 32.74119 19.00594 17.89326 8.845482 0.917995 32 93.65630 35.27255 0.163435 33.60143 15.74121 0.0978782 33 84.61118 84.61148 84.61037 35.16468 36.99460 40.29056 34 76.02191 90.12211 67.42931 25.32647 41.57007 18.07256 35 73.55377 94.06182 53.00604 24.72091 50.00685 10.72081 36 73.11155 96.93503 38.05901 25.96177 58.51931 6.857894 37 72.93569 98.72163 22.83907 27.70782 66.43356 4.400376 38 23.77673 23.77482 23.77630 0.808262 0.851474 0.927522 39 23.44451 22.96627 33.10623 0.921639 0.854851 1.772956 40 22.85556 21.64598 44.75573 1.116073 0.865695 3.229040 41 22.22485 18.62486 62.36534 1.667388 0.948501 6.977826 42 35.64991 15.35459 98.91533 11.44502 4.432404 61.01776 43 96.35659 96.35610 96.35617 74.91186 78.81218 85.83241 44 97.06087 97.47946 78.92293 69.90745 80.61831 35.59450 45 97.79504 98.36568 62.27969 70.40491 84.15043 17.22069 46 98.45489 99.08413 44.97370 72.41321 87.83165 9.646820 47 99.00641 99.67195 23.58495 74.43393 91.11826 4.659070 48 88.79061 88.79062 88.79096 45.91673 48.30787 52.61201 49 82.52992 91.31859 91.75254 39.90547 50.30970 62.06111 50 78.46185 93.96017 94.60604 39.17815 55.87568 73.65456 51 76.99177 96.62262 97.36510 42.13824 64.35328 87.57076 52 76.64247 98.73231 99.43493 46.86422 74.87916 103.8813 53 52.55388 52.55444 52.55354 5.461378 5.744634 6.256880 54 58.91994 49.46251 61.11685 7.010876 5.955340 9.076155 55 67.47282 45.31602 71.15002 10.41000 6.857064 14.93285 56 78.91838 40.06712 83.42631 19.28578 9.916008 29.70747 57 94.44792 39.15413 99.07527 50.69805 22.52391 80.69534 58 36.32536 26.47507 20.40535 1.651956 1.382143 0.752286 59 71.11551 54.95868 45.59421 11.00454 8.706663 5.085028 60 35.03264 42.53777 56.77702 3.027034 3.295222 6.748991 61 30.97977 36.38712 19.63900 1.512160 2.043382 0.776565 62 47.06970 45.48995 65.37271 5.063287 4.533864 10.53818 63 49.99836 70.82567 64.11567 7.797745 12.49233 12.05065 64 80.84777 48.93690 12.98201 16.43804 10.13991 0.557872 65 26.70961 30.11974 62.71194 2.255759 1.811169 7.928767 66 69.09970 31.49411 32.13248 8.139119 4.556122 2.236705 67 28.36296 17.61199 35.57783 1.131347 0.728714 1.982358 68 61.64525 70.65876 21.41634 8.623239 12.90846 1.577800 69 84.16936 62.18537 11.86772 21.41070 15.22274 0.652939 70 15.91257 18.89842 52.73050 0.997062 0.690028 4.333865 71 32.14080 53.06391 24.06692 2.310088 4.413804 1.374254 72 60.28033 19.57174 15.95320 4.579637 2.304572 0.498144 73 88.69819 76.28667 12.12303 31.12389 26.89027 1.054181 74 67.20694 31.82735 54.28045 8.133519 4.540379 6.359961 75 27.80962 47.83324 62.73157 3.026868 3.907669 9.096795 76 95.55413 95.67921 94.59024 70.55829 74.95125 77.46798 77 76.33382 76.87469 76.99472 21.26370 22.60862 24.94036 78 59.33213 59.93048 60.14232 7.894405 8.387710 9.282781 79 42.23255 42.37422 42.53007 3.228634 3.402727 3.738801 80 26.64022 27.04584 27.75130 1.090206 1.154610 1.325668 81 12.99910 13.13460 13.69049 0.193792 0.205986 0.240813 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ref/verify_video_extended_smpte2084_1000_p3_2020.ti10000644000076500000000000001210013220336703026414 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll fakeread" CREATED "Tue Dec 26 01:26:10 2017" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" COLOR_REP "RGB" ACCURATE_EXPECTED_VALUES "true" WHITE_COLOR_PATCHES "1" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "21" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.0000 100.0000 100.0000 95.04547 100.0000 108.9050 2 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 3 5.000000 5.000000 5.000000 0.00000 0.00000 0.00000 4 10.00000 10.00000 10.00000 0.00290060 0.00305180 0.00332357 5 15.00000 15.00000 15.00000 0.0101521 0.0106813 0.0116325 6 20.00000 20.00000 20.00000 0.0232048 0.0244144 0.0265885 7 25.00000 25.00000 25.00000 0.0489477 0.0514992 0.0560852 8 30.00000 30.00000 30.00000 0.0955748 0.100557 0.109512 9 35.00000 35.00000 35.00000 0.175559 0.184710 0.201159 10 40.00000 40.00000 40.00000 0.308044 0.324102 0.352963 11 45.00000 45.00000 45.00000 0.525589 0.552987 0.602231 12 50.00000 50.00000 50.00000 0.876707 0.922408 1.004549 13 55.00000 55.00000 55.00000 1.435580 1.510414 1.644917 14 60.00000 60.00000 60.00000 2.319031 2.439918 2.657193 15 65.00000 65.00000 65.00000 3.711103 3.904555 4.252257 16 70.00000 70.00000 70.00000 5.900839 6.208438 6.761301 17 75.00000 75.00000 75.00000 9.346464 9.833677 10.70937 18 80.00000 80.00000 80.00000 14.78118 15.55169 16.93657 19 85.00000 85.00000 85.00000 23.39154 24.61089 26.80250 20 90.00000 90.00000 90.00000 37.12147 39.05653 42.53453 21 95.00000 95.00000 95.00000 59.19410 62.27977 67.82581 22 52.89448 27.48111 0.00000 0.793435 0.371711 0.000454488 23 42.41914 55.85932 21.95775 0.511033 1.225140 0.0810859 24 27.90315 16.97831 56.20297 0.337605 0.130819 1.799980 25 55.92091 56.30090 21.66814 1.304468 1.596851 0.0815404 26 43.99669 55.95039 56.39556 0.848638 1.355960 1.881066 27 53.51092 28.81925 56.19356 1.131040 0.502531 1.800435 28 33.72499 33.72499 33.72501 0.150841 0.158704 0.172837 29 45.01768 30.86136 28.67710 0.383472 0.226827 0.0927912 30 55.09372 31.67086 22.27135 0.994232 0.486097 0.0404324 31 63.80019 36.23826 12.05029 2.254975 1.061498 0.0112574 32 71.48207 42.28840 0.00000 4.592919 2.151707 0.00263087 33 63.61300 63.61300 63.61300 3.260249 3.430199 3.735659 34 57.80865 67.78528 50.81551 2.161775 4.009413 1.203894 35 57.30475 70.78356 41.04940 2.228457 5.042111 0.573985 36 58.54005 72.96776 35.82712 2.566503 6.102155 0.444452 37 59.98738 74.62218 35.30748 2.958193 7.091912 0.469378 38 17.59531 17.59531 17.59531 0.0159533 0.0167849 0.0182796 39 17.99259 17.51753 24.97039 0.0216244 0.0180185 0.0545862 40 18.51405 16.40711 33.81403 0.0410383 0.0236134 0.170235 41 22.99606 16.41145 47.11983 0.142765 0.0601401 0.730817 42 42.94663 28.74717 74.98308 1.954278 0.757268 10.41946 43 72.44300 72.44300 72.44300 7.389612 7.774818 8.467168 44 73.01641 73.31412 59.41909 6.829247 8.001256 2.685933 45 73.65064 74.02839 47.48346 6.955542 8.422997 1.011422 46 74.20941 74.60826 38.14304 7.242280 8.850582 0.547060 47 74.68754 75.08988 34.92780 7.551112 9.243619 0.472009 48 66.75500 66.75500 66.75500 4.370335 4.598151 5.007618 49 62.28682 68.67103 68.97407 3.676792 4.853494 6.145819 50 60.08648 70.69141 71.11424 3.686024 5.540982 7.486350 51 60.22437 72.71936 73.18410 4.146730 6.556248 9.055290 52 61.76238 74.72047 75.19239 4.912471 7.849180 10.88884 53 39.51200 39.51198 39.51200 0.292113 0.307340 0.334709 54 44.47209 37.33233 45.98469 0.471568 0.337051 0.657080 55 51.22152 35.24982 53.56244 0.913065 0.480544 1.398520 56 60.13970 35.99856 62.85270 2.144149 0.979109 3.393736 57 72.14297 44.05949 74.97365 6.547197 2.908975 10.42209 58 28.08608 20.18073 15.64899 0.0553377 0.0382308 0.0121814 59 53.81617 41.58255 34.31872 0.941546 0.625066 0.190787 60 27.89459 32.14322 42.71083 0.141275 0.134748 0.464746 61 23.63438 27.48490 14.93656 0.0391619 0.0605523 0.0130312 62 35.80109 34.35191 49.19561 0.297145 0.219269 0.907559 63 41.67051 53.36290 48.18804 0.563613 1.020123 0.851780 64 61.53933 39.12176 8.750788 1.841046 0.941765 0.0107346 65 24.49115 23.33862 47.26661 0.154760 0.0818253 0.743737 66 53.11907 29.55678 24.11958 0.821602 0.397217 0.0508185 67 21.95718 14.10257 26.81982 0.0333532 0.0180424 0.0704342 68 46.77337 53.16371 21.70088 0.611620 1.032165 0.0694222 69 63.82195 47.36124 14.08240 2.331167 1.398220 0.0280163 70 18.03009 14.91873 39.87308 0.0666503 0.0304191 0.339944 71 29.42471 40.17829 19.37136 0.110849 0.250292 0.0322375 72 47.22629 23.81239 12.06457 0.451011 0.212936 0.00675944 73 67.01193 57.50397 20.98676 3.282243 2.542424 0.0842320 74 51.59148 29.10798 40.96854 0.762463 0.366176 0.385110 75 28.73119 36.41337 47.18215 0.202773 0.210454 0.741681 76 71.84215 71.93421 71.12183 6.922337 7.372209 7.514028 77 57.39589 57.79748 57.88829 1.834863 1.959150 2.172084 78 44.60578 45.06252 45.22006 0.514739 0.550784 0.616919 79 31.75325 31.85921 31.97606 0.119513 0.126201 0.139730 80 20.16938 20.23137 20.62391 0.0242525 0.0257276 0.0298397 81 8.797654 8.797654 10.55718 0.00290060 0.00305180 0.00332357 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ref/verify_video_extended_smpte2084_100_p3_2020.ti10000644000076500000000000001220413220336703026341 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll fakeread" CREATED "Tue Dec 26 00:37:39 2017" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" COLOR_REP "RGB" ACCURATE_EXPECTED_VALUES "true" WHITE_COLOR_PATCHES "1" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "21" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.0000 100.0000 100.00000 95.04547 100.0000 108.9050 2 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 3 5.000000 5.000000 5.000000 0.00000 0.00000 0.00000 4 10.00000 10.00000 10.00000 0.00290060 0.00305180 0.00332357 5 15.00000 15.00000 15.00000 0.0101521 0.0106813 0.0116325 6 20.00000 20.00000 20.00000 0.0232048 0.0244144 0.0265885 7 25.00000 25.00000 25.00000 0.0489477 0.0514992 0.0560852 8 30.00000 30.00000 30.00000 0.0955748 0.100557 0.109512 9 35.00000 35.00000 35.00000 0.175559 0.184710 0.201159 10 40.00000 40.00000 40.00000 0.308044 0.324102 0.352963 11 45.00000 45.00000 45.00000 0.525589 0.552987 0.602231 12 50.00000 50.00000 50.00000 0.876707 0.922408 1.004549 13 55.00000 55.00000 55.00000 1.435580 1.510414 1.644917 14 60.00000 60.00000 60.00000 2.319031 2.439918 2.657193 15 65.00000 65.00000 65.00000 3.711103 3.904555 4.252257 16 70.00000 70.00000 70.00000 5.900839 6.208438 6.761301 17 75.00000 75.00000 75.00000 9.346464 9.833677 10.70937 18 80.00000 80.00000 80.00000 14.78118 15.55169 16.93657 19 85.00000 85.00000 85.00000 23.39154 24.61089 26.80250 20 90.00000 90.00000 90.00000 37.12147 39.05653 42.53453 21 95.00000 95.00000 95.00000 59.19410 62.27977 67.82581 22 35.13613 15.65858 0.00000 0.120987 0.0566807 0.0000693029 23 26.59533 37.68250 12.05258 0.0779252 0.186816 0.0123644 24 15.70799 8.746568 37.95198 0.0514799 0.0199481 0.274471 25 37.73003 38.03378 12.03823 0.198913 0.243497 0.0124337 26 27.83605 37.75471 38.11319 0.129405 0.206764 0.286836 27 35.65875 16.38949 37.94482 0.172467 0.0766287 0.274541 28 22.79100 22.79100 22.79100 0.0350276 0.0368535 0.0401353 29 30.08609 20.58264 19.39789 0.0725038 0.0462430 0.0241302 30 36.66782 19.75976 14.93975 0.147225 0.0748976 0.0117110 31 42.35510 20.61997 8.765823 0.271275 0.128781 0.00347730 32 47.43822 23.58561 0.00000 0.459259 0.215155 0.000263068 33 42.98899 42.98902 42.98900 0.425420 0.447597 0.487455 34 38.41887 45.74559 34.21675 0.287891 0.486787 0.194934 35 36.78490 47.73750 26.68477 0.261616 0.560859 0.0901874 36 36.77748 49.18259 20.97715 0.271966 0.637275 0.0539614 37 37.42400 50.28465 18.52577 0.295798 0.709140 0.0469344 38 12.08000 12.08000 12.08000 0.00518976 0.00546029 0.00594653 39 12.04959 12.02848 16.41159 0.00613997 0.00527096 0.0145240 40 12.11928 12.04186 22.83465 0.0109108 0.00711962 0.0399602 41 14.13963 10.62567 31.80689 0.0273151 0.0125122 0.133492 42 24.06661 14.13566 50.62560 0.195414 0.0757213 1.041871 43 48.95600 48.95599 48.95600 0.789108 0.830242 0.904176 44 49.29405 49.53618 40.10919 0.730252 0.842000 0.372701 45 49.67909 50.00439 31.54720 0.722872 0.867464 0.154979 46 50.05003 50.39673 23.56543 0.735896 0.896904 0.0707907 47 50.34474 50.72911 18.08030 0.755057 0.924295 0.0471975 48 45.11299 45.11301 45.11301 0.532295 0.560043 0.609915 49 41.82906 46.36721 46.61292 0.455155 0.575686 0.711480 50 39.48987 47.71460 48.05991 0.429294 0.621732 0.825592 51 38.50942 49.04453 49.45864 0.443673 0.692285 0.950822 52 38.93439 50.37600 50.81578 0.491212 0.784861 1.088805 53 26.68621 26.78397 26.68622 0.0623629 0.0656138 0.0714567 54 29.93622 25.19982 31.07850 0.0904045 0.0689314 0.122803 55 34.32745 23.32582 36.18194 0.149725 0.0846855 0.225012 56 40.11426 21.98899 42.44174 0.285176 0.133952 0.448638 57 48.02867 24.72037 50.61652 0.654673 0.290877 1.042134 58 18.98041 13.15211 10.55972 0.0143254 0.0101656 0.00347449 59 36.11311 27.90269 23.28822 0.151475 0.109654 0.0446389 60 18.53795 21.67410 28.78203 0.0314058 0.0316173 0.0922616 61 15.73721 18.53779 10.57734 0.0111255 0.0164817 0.00411321 62 24.08205 23.04564 33.21473 0.0594177 0.0472638 0.159415 63 26.81790 35.97854 32.56701 0.0951805 0.165326 0.151754 64 40.97841 25.16396 8.712197 0.237878 0.130571 0.00329572 65 14.94784 15.68517 31.92325 0.0299044 0.0180514 0.135623 66 35.39136 18.48551 16.40103 0.127505 0.0638697 0.0147362 67 14.90443 8.737587 18.06386 0.00963548 0.00509488 0.0191520 68 31.40208 35.85806 13.15206 0.106713 0.170052 0.0130847 69 42.67841 31.59277 5.569820 0.293789 0.196816 0.00501894 70 10.60504 10.58496 26.99456 0.0143017 0.00735613 0.0715815 71 18.96480 27.05281 12.10570 0.0235096 0.0518601 0.00813606 72 31.41242 14.12744 5.562816 0.0776044 0.0372028 0.00170541 73 45.00026 38.77530 10.65197 0.393910 0.337291 0.0127455 74 34.38574 18.04049 27.62643 0.124454 0.0614609 0.0792048 75 18.06271 24.63935 31.87181 0.0399260 0.0454058 0.135825 76 48.54918 48.61248 48.06340 0.751790 0.798066 0.827846 77 38.79814 39.05713 39.12057 0.272828 0.290732 0.321345 78 30.11676 30.45469 30.55863 0.0987564 0.105240 0.117301 79 21.60348 21.60319 21.61086 0.0290300 0.0305273 0.0333637 80 14.07766 14.07652 14.10742 0.00734836 0.00766704 0.00882534 81 8.699902 5.571847 5.571847 0.00145030 0.00152590 0.00166178 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ref/verify_video_extended_smpte2084_200_p3_2020.ti10000644000076500000000000001214413220336703026345 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll fakeread" CREATED "Tue Dec 26 00:55:07 2017" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" COLOR_REP "RGB" ACCURATE_EXPECTED_VALUES "true" WHITE_COLOR_PATCHES "1" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "21" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.0000 100.0000 100.0000 95.04547 100.0000 108.9050 2 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 3 5.000000 5.000000 5.000000 0.00000 0.00000 0.00000 4 10.00000 10.00000 10.00000 0.00290060 0.00305180 0.00332357 5 15.00000 15.00000 15.00000 0.0101521 0.0106813 0.0116325 6 20.00000 20.00000 20.00000 0.0232048 0.0244144 0.0265885 7 25.00000 25.00000 25.00000 0.0489477 0.0514992 0.0560852 8 30.00000 30.00000 30.00000 0.0955748 0.100557 0.109512 9 35.00000 35.00000 35.00000 0.175559 0.184710 0.201159 10 40.00000 40.00000 40.00000 0.308044 0.324102 0.352963 11 45.00000 45.00000 45.00000 0.525589 0.552987 0.602231 12 50.00000 50.00000 50.00000 0.876707 0.922408 1.004549 13 55.00000 55.00000 55.00000 1.435580 1.510414 1.644917 14 60.00000 60.00000 60.00000 2.319031 2.439918 2.657193 15 65.00000 65.00000 65.00000 3.711103 3.904555 4.252257 16 70.00000 70.00000 70.00000 5.900839 6.208438 6.761301 17 75.00000 75.00000 75.00000 9.346464 9.833677 10.70937 18 80.00000 80.00000 80.00000 14.78118 15.55169 16.93657 19 85.00000 85.00000 85.00000 23.39154 24.61089 26.80250 20 90.00000 90.00000 90.00000 37.12147 39.05653 42.53453 21 95.00000 95.00000 95.00000 59.19410 62.27977 67.82581 22 40.28538 18.55543 0.00000 0.215852 0.101123 0.000123642 23 31.09057 42.96390 14.16264 0.139025 0.333296 0.0220592 24 19.03466 10.61933 43.26486 0.0918446 0.0355891 0.489680 25 43.02037 43.34914 14.13704 0.354877 0.434420 0.0221829 26 32.43222 43.04977 43.44353 0.230870 0.368885 0.511739 27 40.82645 19.79057 43.25847 0.307697 0.136712 0.489804 28 25.97800 25.97800 25.97800 0.0562063 0.0591362 0.0644023 29 34.43513 23.59118 21.98348 0.121768 0.0756682 0.0366107 30 41.99595 22.85892 16.97915 0.264437 0.132349 0.0167610 31 48.56990 24.96903 10.59417 0.516663 0.244588 0.00527881 32 54.39014 28.49943 0.00000 0.918292 0.430205 0.000526008 33 49.00101 49.00099 49.00100 0.792853 0.834182 0.908466 34 43.97282 52.17040 38.98847 0.530979 0.923579 0.340627 35 42.60118 54.44337 30.76735 0.499177 1.089412 0.157946 36 42.90736 56.10686 24.72493 0.534268 1.259382 0.100521 37 43.77595 57.37704 22.97470 0.591451 1.417932 0.0938458 38 13.19648 14.07625 13.19648 0.00725150 0.00762951 0.00830892 39 14.11545 14.08377 19.04553 0.00993510 0.00866938 0.0226168 40 14.13341 13.12848 25.99379 0.0164061 0.0102129 0.0631882 41 16.34856 12.04296 36.24708 0.0446972 0.0192477 0.226167 42 29.07011 18.00722 57.71817 0.390731 0.151406 2.083230 43 55.80300 55.80300 55.80300 1.551310 1.632177 1.777522 44 56.21324 56.46525 45.72556 1.433890 1.661224 0.682004 45 56.66769 57.01532 36.11645 1.430907 1.722317 0.274056 46 57.07628 57.45650 27.33625 1.464568 1.786849 0.129255 47 57.43738 57.82166 22.57253 1.509743 1.848137 0.0943718 48 51.42200 51.42201 51.42200 1.009887 1.062531 1.157149 49 47.75861 52.86939 53.13099 0.858108 1.099350 1.368838 50 45.35250 54.39750 54.78067 0.821825 1.204342 1.608191 51 44.62817 55.94342 56.37529 0.870077 1.364098 1.877340 52 45.37957 57.46864 57.92208 0.982182 1.569337 2.177076 53 30.43597 30.43601 30.43601 0.100593 0.105837 0.115262 54 34.18651 28.71922 35.42913 0.151658 0.113191 0.207802 55 39.20855 26.82198 41.23460 0.262050 0.145168 0.396055 56 45.91967 25.96435 48.38039 0.528724 0.246377 0.833236 57 55.01346 29.98647 57.70910 1.309024 0.581610 2.083756 58 21.63152 15.69334 12.02860 0.0221724 0.0162132 0.00526492 59 41.22418 31.92795 26.39842 0.265382 0.187703 0.0700481 60 21.25259 24.68987 32.88142 0.0503776 0.0500250 0.154187 61 18.48073 21.22944 12.05411 0.0168052 0.0249734 0.00618595 62 27.49075 26.40653 37.89326 0.0983509 0.0767207 0.274225 63 31.12070 41.04241 37.09969 0.165598 0.290990 0.259636 64 46.93185 29.03629 8.711591 0.443248 0.237550 0.00429579 65 17.98836 17.58177 36.42610 0.0497714 0.0285280 0.230806 66 40.48273 21.28473 18.53678 0.225598 0.111469 0.0212935 67 16.92266 10.60719 20.59631 0.0139784 0.00785517 0.0287634 68 35.84168 40.92146 15.68921 0.183426 0.297507 0.0222211 69 48.78071 36.08915 8.754232 0.550799 0.356583 0.00839234 70 13.10005 12.07037 30.73115 0.0233199 0.0117578 0.117328 71 21.91344 30.84182 14.89553 0.0384463 0.0851187 0.0134802 72 35.99152 16.40914 8.780182 0.134015 0.0636061 0.00332731 73 51.38499 44.18966 14.09944 0.749430 0.623429 0.0227505 74 39.37497 20.99604 31.55162 0.217744 0.106270 0.129952 75 21.22255 27.95433 36.33825 0.0660852 0.0731282 0.230035 76 55.33752 55.41019 54.78545 1.471155 1.562936 1.613021 77 44.21134 44.52487 44.59140 0.490468 0.522277 0.577653 78 34.36383 34.70185 34.83271 0.165252 0.176681 0.196596 79 24.46611 24.53161 24.63351 0.0457089 0.0485006 0.0531767 80 15.65553 15.68360 15.73709 0.0106568 0.0112920 0.0132550 81 8.699902 5.571847 5.571847 0.00145030 0.00152590 0.00166178 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ref/verify_video_extended_smpte2084_500_p3_2020.ti10000644000076500000000000001211613220336703026347 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll fakeread" CREATED "Tue Dec 26 01:25:59 2017" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" COLOR_REP "RGB" ACCURATE_EXPECTED_VALUES "true" WHITE_COLOR_PATCHES "1" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "21" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 81 BEGIN_DATA 1 100.0000 100.0000 100.0000 95.04547 100.0000 108.9050 2 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 3 5.000000 5.000000 5.000000 0.00000 0.00000 0.00000 4 10.00000 10.00000 10.00000 0.00290060 0.00305180 0.00332357 5 15.00000 15.00000 15.00000 0.0101521 0.0106813 0.0116325 6 20.00000 20.00000 20.00000 0.0232048 0.0244144 0.0265885 7 25.00000 25.00000 25.00000 0.0489477 0.0514992 0.0560852 8 30.00000 30.00000 30.00000 0.0955748 0.100557 0.109512 9 35.00000 35.00000 35.00000 0.175559 0.184710 0.201159 10 40.00000 40.00000 40.00000 0.308044 0.324102 0.352963 11 45.00000 45.00000 45.00000 0.525589 0.552987 0.602231 12 50.00000 50.00000 50.00000 0.876707 0.922408 1.004549 13 55.00000 55.00000 55.00000 1.435580 1.510414 1.644917 14 60.00000 60.00000 60.00000 2.319031 2.439918 2.657193 15 65.00000 65.00000 65.00000 3.711103 3.904555 4.252257 16 70.00000 70.00000 70.00000 5.900839 6.208438 6.761301 17 75.00000 75.00000 75.00000 9.346464 9.833677 10.70937 18 80.00000 80.00000 80.00000 14.78118 15.55169 16.93657 19 85.00000 85.00000 85.00000 23.39154 24.61089 26.80250 20 90.00000 90.00000 90.00000 37.12147 39.05653 42.53453 21 95.00000 95.00000 95.00000 59.19410 62.27977 67.82581 22 47.36565 23.56704 0.00000 0.456047 0.213651 0.000261229 23 37.36939 50.21811 18.51721 0.293729 0.704181 0.0466062 24 23.85110 14.13185 50.55230 0.194047 0.0751918 1.034585 25 50.27340 50.65509 18.07212 0.749777 0.917832 0.0468674 26 38.88443 50.30446 50.75173 0.487777 0.779373 1.081191 27 47.96089 24.69783 50.54328 0.650094 0.288842 1.034846 28 30.34998 30.35005 30.35001 0.0993173 0.104495 0.113800 29 40.39507 27.63885 25.78500 0.235998 0.142727 0.0632514 30 49.36119 27.77678 20.17040 0.565986 0.279545 0.0285604 31 57.13385 31.10939 10.64744 1.199519 0.565655 0.00794721 32 64.00374 36.04019 0.00000 2.295899 1.075591 0.00131512 33 57.24700 57.24700 57.24700 1.783351 1.876313 2.043399 34 51.72320 60.98035 45.65750 1.184924 2.137819 0.703798 35 50.77596 63.65612 36.45614 1.169660 2.609998 0.328038 36 51.59674 65.61806 30.70927 1.305731 3.095214 0.232951 37 52.80226 67.10244 29.57797 1.478735 3.545090 0.234632 38 15.73802 15.73802 16.32454 0.0116024 0.0122072 0.0132943 39 15.71113 15.65388 22.28447 0.0150026 0.0125608 0.0374933 40 16.41039 14.91230 30.44177 0.0279635 0.0166192 0.112667 41 19.77870 14.11233 42.36589 0.0869041 0.0365665 0.445127 42 36.65493 23.75714 67.45692 0.976900 0.378542 5.208457 43 65.19300 65.19300 65.19300 3.778412 3.975373 4.329382 44 65.69187 65.97416 53.43996 3.490499 4.069888 1.496478 45 66.24633 66.61216 42.47384 3.521341 4.253997 0.576685 46 66.74089 67.13570 33.20992 3.639048 4.444468 0.291937 47 67.16641 67.56398 29.20791 3.774634 4.620681 0.235947 48 60.07500 60.07500 60.07500 2.335722 2.457479 2.676318 49 55.93959 61.78744 62.07158 1.972477 2.569450 3.229746 50 53.59588 63.59005 63.99715 1.934567 2.877513 3.869065 51 53.32749 65.40666 65.86102 2.117768 3.337383 4.603132 52 54.51631 67.19877 67.66708 2.455635 3.923631 5.443089 53 35.55705 35.55698 35.55703 0.186724 0.196457 0.213952 54 40.00027 33.55254 41.39591 0.292771 0.213308 0.404972 55 45.98977 31.56266 48.19770 0.538211 0.289379 0.819875 56 53.92324 31.44997 56.54872 1.179650 0.542641 1.864231 57 64.65344 37.70366 67.44753 3.272799 1.454132 5.209773 58 25.18655 18.02662 14.08226 0.0375089 0.0261576 0.00868304 59 48.31494 37.36684 30.86436 0.549980 0.375235 0.126173 60 24.97622 28.94083 38.43416 0.0911204 0.0886070 0.291205 61 21.27154 24.63775 13.15188 0.0272997 0.0414230 0.00872882 62 32.11614 30.83893 44.25447 0.185918 0.140706 0.546941 63 36.99755 47.99223 43.34595 0.335339 0.599415 0.515399 64 55.14989 34.62734 5.567860 1.001409 0.521939 0.00649247 65 21.63937 20.99591 42.53734 0.0959606 0.0528896 0.453254 66 47.58314 25.91706 21.63750 0.474246 0.231244 0.0345782 67 19.76404 12.10912 24.14193 0.0233389 0.0128095 0.0486890 68 42.00430 47.82770 18.99829 0.367252 0.609246 0.0424104 69 57.24699 42.41355 12.09566 1.256972 0.778553 0.0178585 70 15.64617 13.19335 35.89118 0.0425313 0.0201092 0.217422 71 26.12202 36.17238 16.97358 0.0710826 0.159458 0.0215219 72 42.28611 20.54228 10.62014 0.269576 0.127315 0.00501303 73 60.18429 51.68770 17.58667 1.742305 1.393368 0.0483009 74 46.25459 25.54120 36.84440 0.447959 0.216617 0.244129 75 25.37707 32.77319 42.45147 0.126365 0.135060 0.452147 76 64.65101 64.73442 64.00351 3.559617 3.786702 3.882117 77 51.64624 52.01262 52.09535 1.047253 1.117087 1.237025 78 40.14207 40.55060 40.69358 0.318861 0.340808 0.381362 79 28.64478 28.67479 28.77618 0.0802330 0.0844189 0.0936475 80 18.01884 18.08084 18.57113 0.0170010 0.0180981 0.0215308 81 8.744162 8.794526 10.55725 0.00236183 0.00279940 0.00332326 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ref/verify_video_large.ti10000644000076500000000000004317112775013140022470 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "200" CREATED "Mon Jan 13 22:06:17 2014" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "21" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045684 99.999971 108.903720" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 335 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.90 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 5.0000 5.0000 5.0000 1.0560 1.1110 1.2099 4 10.000 10.000 10.000 2.1317 2.2428 2.4425 5 15.000 15.000 15.000 3.5075 3.6903 4.0189 6 20.000 20.000 20.000 5.2684 5.5430 6.0365 7 25.000 25.000 25.000 7.4285 7.8157 8.5116 8 30.000 30.000 30.000 10.002 10.523 11.460 9 35.000 35.000 35.000 13.002 13.680 14.898 10 40.000 40.000 40.000 16.442 17.299 18.839 11 45.000 45.000 45.000 20.328 21.388 23.292 12 50.000 50.000 50.000 24.673 25.959 28.270 13 55.000 55.000 55.000 29.485 31.022 33.784 14 60.000 60.000 60.000 34.771 36.584 39.841 15 65.000 65.000 65.000 40.542 42.655 46.453 16 70.000 70.000 70.000 46.802 49.242 53.626 17 75.000 75.000 75.000 53.560 56.352 61.370 18 80.000 80.000 80.000 60.823 63.994 69.692 19 85.000 85.000 85.000 68.597 72.173 78.599 20 90.000 90.000 90.000 76.889 80.896 88.099 21 95.000 95.000 95.000 85.702 90.170 98.198 22 5.0000 0.0000 0.0000 0.4582 0.2362 0.0215 23 10.000 0.0000 0.0000 0.9249 0.4769 0.0433 24 15.000 0.0000 0.0000 1.5218 0.7847 0.0713 25 20.000 0.0000 0.0000 2.2858 1.1787 0.1071 26 25.000 0.0000 0.0000 3.2231 1.6620 0.1510 27 30.000 0.0000 0.0000 4.3396 2.2377 0.2034 28 35.000 0.0000 0.0000 5.6414 2.9090 0.2644 29 40.000 0.0000 0.0000 7.1338 3.6785 0.3343 30 45.000 0.0000 0.0000 8.8201 4.5480 0.4133 31 50.000 0.0000 0.0000 10.705 5.5199 0.5017 32 55.000 0.0000 0.0000 12.793 6.5966 0.5995 33 60.000 0.0000 0.0000 15.087 7.7793 0.7070 34 65.000 0.0000 0.0000 17.590 9.0703 0.8243 35 70.000 0.0000 0.0000 20.307 10.471 0.9516 36 75.000 0.0000 0.0000 23.239 11.983 1.0890 37 80.000 0.0000 0.0000 26.390 13.608 1.2367 38 85.000 0.0000 0.0000 29.763 15.347 1.3947 39 90.000 0.0000 0.0000 33.361 17.202 1.5633 40 95.000 0.0000 0.0000 37.185 19.174 1.7425 41 0.0000 5.0000 0.0000 0.3973 0.7946 0.1324 42 0.0000 10.000 0.0000 0.8020 1.6040 0.2673 43 0.0000 15.000 0.0000 1.3196 2.6392 0.4398 44 0.0000 20.000 0.0000 1.9821 3.9642 0.6606 45 0.0000 25.000 0.0000 2.7948 5.5895 0.9315 46 0.0000 30.000 0.0000 3.7629 7.5258 1.2542 47 0.0000 35.000 0.0000 4.8918 9.7835 1.6305 48 0.0000 40.000 0.0000 6.1859 12.372 2.0618 49 0.0000 45.000 0.0000 7.6481 15.296 2.5492 50 0.0000 50.000 0.0000 9.2825 18.565 3.0939 51 0.0000 55.000 0.0000 11.093 22.186 3.6974 52 0.0000 60.000 0.0000 13.082 26.163 4.3603 53 0.0000 65.000 0.0000 15.253 30.506 5.0839 54 0.0000 70.000 0.0000 17.608 35.216 5.8690 55 0.0000 75.000 0.0000 20.151 40.301 6.7164 56 0.0000 80.000 0.0000 22.883 45.766 7.6272 57 0.0000 85.000 0.0000 25.808 51.616 8.6020 58 0.0000 90.000 0.0000 28.928 57.855 9.6417 59 0.0000 95.000 0.0000 32.243 64.486 10.747 60 0.0000 0.0000 5.0000 0.2005 0.0802 1.0560 61 0.0000 0.0000 10.000 0.4048 0.1619 2.1318 62 0.0000 0.0000 15.000 0.6660 0.2664 3.5077 63 0.0000 0.0000 20.000 1.0004 0.4001 5.2688 64 0.0000 0.0000 25.000 1.4106 0.5642 7.4290 65 0.0000 0.0000 30.000 1.8993 0.7597 10.002 66 0.0000 0.0000 35.000 2.4690 0.9876 13.003 67 0.0000 0.0000 40.000 3.1222 1.2488 16.443 68 0.0000 0.0000 45.000 3.8602 1.5440 20.330 69 0.0000 0.0000 50.000 4.6851 1.8739 24.674 70 0.0000 0.0000 55.000 5.5990 2.2395 29.487 71 0.0000 0.0000 60.000 6.6028 2.6410 34.774 72 0.0000 0.0000 65.000 7.6986 3.0792 40.545 73 0.0000 0.0000 70.000 8.8874 3.5547 46.806 74 0.0000 0.0000 75.000 10.171 4.0680 53.564 75 0.0000 0.0000 80.000 11.550 4.6197 60.828 76 0.0000 0.0000 85.000 13.026 5.2101 68.602 77 0.0000 0.0000 90.000 14.601 5.8399 76.894 78 0.0000 0.0000 95.000 16.274 6.5093 85.709 79 75.000 75.000 0.0000 43.390 52.284 7.8054 80 0.0000 75.000 75.000 30.322 44.369 60.281 81 75.000 0.0000 75.000 33.410 16.051 54.653 82 44.857 44.857 44.857 20.211 21.264 23.158 83 63.673 38.191 38.191 25.480 21.264 17.839 84 77.882 30.157 30.157 30.740 21.264 12.529 85 89.702 19.413 19.413 35.993 21.264 7.2266 86 100.00 0.0000 0.0000 41.238 21.264 1.9325 87 84.611 84.611 84.611 67.974 71.517 77.885 88 66.425 90.768 66.425 55.794 71.517 52.945 89 49.339 94.865 49.339 47.167 71.517 35.280 90 30.889 97.796 30.889 40.737 71.517 22.113 91 0.0000 100.00 0.0000 35.759 71.517 11.919 92 23.776 23.776 23.776 6.8614 7.2191 7.8619 93 22.893 22.893 33.269 7.5025 7.2191 12.858 94 21.329 21.329 45.163 8.5869 7.2191 21.310 95 17.770 17.770 62.889 10.818 7.2191 38.695 96 0.0000 0.0000 100.00 18.049 7.2191 95.054 97 96.356 96.356 96.356 88.184 92.781 101.04 98 97.606 97.606 78.320 84.396 92.781 71.521 99 98.581 98.581 60.005 81.409 92.781 48.236 100 99.361 99.361 39.013 78.992 92.781 29.401 101 100.00 100.00 0.0000 76.997 92.781 13.851 102 88.791 88.791 88.791 74.835 78.736 85.747 103 76.814 91.734 91.734 69.581 78.736 91.050 104 62.359 94.577 94.577 64.325 78.736 96.356 105 43.001 97.330 97.330 59.068 78.736 101.66 106 0.0000 100.00 100.00 53.807 78.736 106.97 107 52.554 52.554 52.554 27.072 28.483 31.020 108 61.327 48.605 61.327 31.424 28.483 39.931 109 71.488 42.636 71.488 37.351 28.483 52.068 110 83.868 32.173 83.868 45.896 28.483 69.566 111 100.00 0.0000 100.00 59.287 28.483 96.986 112 40.014 25.786 20.317 11.099 9.9635 6.7068 113 75.324 53.324 45.514 37.843 34.593 25.342 114 29.729 42.874 56.966 17.263 18.608 34.043 115 29.370 36.749 19.123 10.451 13.186 6.9022 116 45.878 45.225 65.633 24.698 23.284 44.310 117 30.467 71.586 63.893 30.296 42.064 45.565 118 86.504 43.440 12.117 38.502 30.443 6.5044 119 20.525 29.989 63.105 13.408 11.655 39.664 120 75.217 26.193 32.376 28.543 18.938 13.474 121 30.976 16.581 35.901 8.6732 6.4200 14.309 122 58.214 71.178 18.499 33.326 44.081 11.428 123 89.196 59.446 9.2210 45.989 42.749 7.7700 124 7.7021 18.704 53.282 7.7766 6.0657 28.411 125 20.128 54.049 23.036 14.282 23.155 10.217 126 67.276 12.896 16.166 20.622 12.158 5.1263 127 92.643 75.270 3.0853 55.771 58.867 9.0726 128 72.946 27.032 54.748 30.727 19.906 31.320 129 0.0000 48.676 62.903 14.518 19.761 40.936 130 95.568 95.693 94.577 86.481 91.294 97.612 131 76.096 76.909 76.998 55.793 58.956 64.583 132 59.061 59.970 60.149 34.343 36.341 39.981 133 42.165 42.383 42.534 18.187 19.160 21.010 134 26.405 27.083 27.768 8.3684 8.8404 10.026 135 12.892 13.165 13.693 2.9545 3.1078 3.5418 136 76.553 26.113 0.0000 27.190 18.468 2.1325 137 79.787 34.093 45.206 34.819 24.444 23.288 138 100.00 41.707 48.805 52.384 36.388 27.748 139 100.00 62.158 100.00 73.284 56.476 101.65 140 0.0000 9.0970 16.146 1.4596 1.7414 4.1180 141 9.5810 8.2809 19.304 2.4880 2.1472 5.2603 142 6.5916 5.6661 27.338 2.6838 1.8640 8.7589 143 59.629 49.098 63.092 31.154 28.545 41.975 144 61.087 63.708 66.605 38.357 40.627 48.122 145 76.113 68.043 66.156 48.550 48.848 48.623 146 69.726 26.339 24.899 24.592 17.029 9.3383 147 84.526 45.775 41.486 40.656 32.290 21.560 148 94.191 64.568 60.538 58.325 51.648 42.102 149 100.00 63.984 71.908 65.401 54.604 56.190 150 12.140 0.0000 14.551 1.8004 0.8544 3.4237 151 0.0000 0.0000 15.604 0.7025 0.2810 3.6998 152 15.530 32.053 41.667 9.1604 10.580 19.165 153 18.071 45.124 46.659 13.782 18.039 24.375 154 19.249 83.130 54.230 32.304 52.677 37.046 155 26.082 62.331 33.125 19.766 30.819 16.679 156 46.240 80.225 49.609 36.897 52.647 32.422 157 55.316 89.238 69.232 50.069 67.025 55.896 158 0.0000 39.306 20.509 7.0344 12.407 7.4678 159 0.0000 70.516 35.262 20.363 36.724 19.126 160 0.0000 100.00 41.886 39.149 72.873 29.774 161 59.018 51.977 12.583 25.128 27.706 6.8068 162 85.632 73.980 11.249 50.286 54.994 10.394 163 69.827 53.168 0.0000 30.617 31.238 4.4163 164 69.274 78.644 0.0000 42.022 54.507 8.3064 165 72.908 100.00 56.690 63.672 85.224 44.169 166 0.0000 13.139 41.303 4.4167 3.5435 17.782 167 51.734 16.273 71.687 22.191 12.554 50.056 168 74.463 36.065 81.927 40.175 26.965 66.554 169 78.550 67.811 83.442 54.563 51.254 72.833 170 63.950 40.446 50.693 28.163 23.331 28.215 171 63.963 76.284 67.735 46.225 53.796 51.652 172 76.994 100.00 82.377 72.468 89.030 77.525 173 24.798 0.0000 14.050 3.7926 1.8850 3.3670 174 47.101 11.773 13.930 11.162 7.1247 3.9548 175 85.439 15.130 19.977 32.404 18.576 7.1140 176 72.815 0.0000 0.0000 21.931 11.309 1.0277 177 100.00 33.693 19.911 46.813 30.824 8.6936 178 15.159 35.213 17.388 7.3038 11.009 6.0193 179 19.355 57.124 14.647 14.739 25.212 7.4729 180 17.293 80.452 28.582 26.744 47.935 17.030 181 55.094 85.255 38.731 41.745 59.721 24.782 182 73.560 86.039 61.601 55.755 67.193 46.430 183 43.616 41.742 31.787 17.103 18.486 13.642 184 58.923 51.513 31.035 26.397 27.942 14.542 185 84.019 77.770 33.058 52.963 59.174 20.363 186 100.00 100.00 59.980 83.596 95.420 48.602 187 12.070 0.0000 0.0000 1.1525 0.5943 0.0540 188 8.1071 7.3630 8.1585 1.6522 1.6829 1.9477 189 11.508 25.400 52.390 9.0651 8.3376 27.923 190 18.080 39.254 58.254 14.196 15.478 34.960 191 69.340 49.749 77.658 40.024 33.029 61.362 192 0.0000 10.211 0.0000 0.8208 1.6417 0.2736 193 0.0000 20.042 0.0000 1.9882 3.9762 0.6627 194 0.0000 72.040 0.0000 18.623 37.245 6.2072 195 56.655 100.00 0.0000 49.288 78.493 12.553 196 76.305 100.00 25.614 61.265 84.499 20.767 197 100.00 100.00 32.307 79.149 93.642 25.184 198 39.777 57.160 14.563 19.633 27.758 7.6802 199 39.406 100.00 27.735 44.373 75.766 21.029 200 41.242 100.00 59.600 49.812 78.009 46.605 201 0.0000 16.891 13.464 2.1313 3.3374 3.5630 202 13.209 17.134 8.1096 3.1983 3.9633 2.2965 203 28.219 15.583 7.9632 5.6298 4.9281 2.3285 204 36.759 13.632 0.0000 7.3086 5.4963 0.6759 205 13.628 9.5487 0.0000 2.1040 2.2163 0.3169 206 10.066 17.614 20.152 3.5909 4.1802 5.9205 207 0.0000 30.449 31.622 5.9333 8.5462 12.215 208 21.979 63.421 61.189 24.038 33.196 41.075 209 20.625 84.221 80.404 39.398 56.578 69.995 210 30.520 85.433 100.00 48.586 61.663 103.95 211 0.0000 76.917 63.668 28.574 45.311 46.017 212 0.0000 100.00 73.577 45.554 75.435 63.507 213 48.000 100.00 100.00 63.734 83.854 107.44 214 13.502 26.798 7.4012 4.7478 7.0522 2.6672 215 35.727 74.454 0.0000 25.711 42.742 6.8948 216 42.167 79.986 20.599 31.761 50.211 13.497 217 62.144 78.823 20.099 39.364 53.167 13.470 218 13.991 11.163 43.937 5.9943 4.0137 19.834 219 32.078 8.5696 89.019 19.822 9.5772 75.680 220 52.991 0.0000 100.00 29.978 13.370 95.612 221 73.613 22.480 100.00 42.818 23.503 96.891 222 29.549 21.239 61.492 13.321 9.2882 37.366 223 50.171 33.346 62.965 22.515 17.453 40.142 224 51.623 53.836 77.743 32.931 31.535 61.571 225 60.661 64.779 100.00 48.607 45.469 100.83 226 82.388 68.294 100.00 62.805 55.210 101.96 227 100.00 83.779 100.00 84.363 78.635 105.34 228 0.0000 0.0000 37.970 2.8469 1.1387 14.993 229 0.0000 0.0000 67.043 8.1729 3.2689 43.043 230 0.0000 38.676 69.725 14.646 15.181 48.390 231 18.119 57.437 67.184 22.224 28.382 47.324 232 29.795 57.993 81.990 28.678 31.586 68.148 233 30.694 43.411 74.565 21.730 20.677 55.556 234 34.529 54.270 100.00 34.377 31.695 98.916 235 38.225 27.423 100.00 27.875 17.101 96.442 236 37.300 13.996 46.723 11.643 7.3137 22.471 237 42.745 31.810 46.925 16.355 14.116 23.709 238 54.687 47.286 47.179 25.238 24.957 25.551 239 62.000 62.235 48.313 34.489 38.100 28.585 240 47.548 26.031 14.495 13.373 11.248 4.8027 241 82.208 40.425 22.354 35.339 27.442 9.6409 242 89.221 51.259 78.626 53.668 40.813 63.557 243 90.706 80.845 85.777 70.515 69.507 79.233 244 22.964 7.3780 8.8810 3.7625 2.7693 2.2027 245 44.884 51.505 0.0000 18.587 24.144 3.6806 246 44.546 56.337 49.996 24.950 29.552 28.945 247 51.507 68.817 72.499 37.864 43.707 56.329 248 54.987 85.375 80.099 50.401 63.294 70.254 249 32.396 18.473 30.308 8.6362 6.8476 10.995 250 47.991 29.547 33.126 15.838 13.353 13.516 251 58.784 39.326 31.959 22.624 20.330 13.807 252 79.880 58.713 31.879 40.968 39.514 16.496 253 100.00 59.770 39.676 57.302 48.468 22.467 254 59.760 17.766 7.8907 16.956 11.182 2.9242 255 89.492 17.389 6.7501 34.873 20.352 3.5103 256 100.00 45.174 0.0000 48.940 36.668 4.4996 257 100.00 68.999 0.0000 58.360 55.508 7.6393 258 48.006 31.193 0.0000 13.947 13.155 1.8044 259 63.587 37.705 12.876 22.979 20.055 5.5243 260 87.019 51.004 12.661 41.356 35.560 7.4901 261 97.949 80.452 55.537 68.390 68.953 39.598 262 100.00 81.007 70.394 73.680 71.771 57.072 263 31.409 24.947 20.076 8.4789 8.3900 6.4460 264 36.020 46.722 24.195 15.461 19.976 10.062 265 38.938 71.042 58.308 31.176 42.252 39.290 266 41.087 100.00 81.951 55.356 80.221 76.068 267 0.0000 69.739 78.983 28.742 39.465 65.136 268 0.0000 73.337 100.00 37.333 45.787 101.48 269 42.057 74.043 100.00 45.502 50.542 101.97 270 35.461 14.293 19.209 7.9515 5.8284 5.6466 271 44.958 10.067 31.914 11.721 6.9992 11.782 272 56.936 26.050 49.843 21.299 14.874 26.166 273 78.422 34.880 59.028 36.635 25.369 36.518 274 76.079 56.860 47.423 39.961 37.647 27.434 275 80.577 58.786 67.575 47.650 42.287 49.156 276 84.981 86.723 79.496 68.017 73.625 70.419 277 100.00 100.00 82.374 89.236 97.676 78.306 278 27.152 26.757 30.322 8.7320 8.9057 11.395 279 30.069 32.281 51.934 13.642 12.773 28.104 280 18.136 17.305 33.532 5.8811 5.1521 12.706 281 16.992 15.690 79.796 14.700 8.3325 61.074 282 17.580 33.812 84.917 19.505 15.395 70.094 283 0.0000 46.892 61.673 15.206 19.276 39.400 284 3.4863 54.830 86.160 24.730 27.574 74.171 285 44.072 77.245 85.819 43.124 52.398 77.440 286 0.0000 20.043 33.872 4.3217 4.9098 12.951 287 0.0000 20.060 67.493 10.270 7.2933 44.268 288 0.0000 29.300 100.00 21.666 14.455 96.258 289 0.0000 52.264 100.00 28.129 27.379 98.412 290 45.312 0.0000 18.916 9.8535 4.9743 5.2720 291 68.501 0.0000 20.224 20.487 10.446 6.2689 292 100.00 0.0000 27.275 42.862 21.913 10.481 293 100.00 76.695 35.235 64.792 64.375 22.106 294 21.070 19.161 0.0000 4.3319 4.9951 0.7359 295 21.663 37.614 0.0000 8.1255 12.424 1.9699 296 19.541 91.230 11.258 32.397 60.773 12.454 297 0.0000 44.727 0.0000 7.5634 15.127 2.5209 298 0.0000 52.035 45.558 13.946 21.575 24.125 299 37.491 53.229 63.168 24.078 27.056 42.148 300 62.637 67.106 80.707 44.355 45.591 68.070 301 72.376 84.847 88.385 61.470 68.239 83.746 302 72.046 85.597 100.00 65.699 70.636 104.78 303 75.176 100.00 100.00 77.153 90.774 108.06 304 27.901 38.752 34.862 12.148 14.659 15.045 305 39.142 41.663 48.916 18.016 18.645 26.233 306 65.105 45.216 100.00 43.408 31.747 98.451 307 72.245 0.0000 46.821 25.747 12.796 22.871 308 100.00 0.0000 48.555 45.676 23.039 25.305 309 60.842 15.178 30.659 18.804 11.459 11.547 310 85.977 14.203 34.789 34.119 19.133 14.704 311 85.041 19.056 49.815 36.290 20.914 26.517 312 100.00 37.480 70.256 55.702 35.870 50.908 313 24.910 8.4713 26.206 5.3975 3.6041 8.3862 314 26.898 50.520 37.383 15.858 21.902 17.912 315 12.589 28.387 20.550 5.6887 7.9090 6.6870 316 6.6565 57.545 38.199 15.570 25.630 19.209 317 49.940 64.711 41.532 29.142 37.087 23.126 318 74.755 84.325 44.043 52.204 64.194 29.099 319 28.856 30.946 15.539 8.7311 10.306 5.1905 320 61.205 64.526 26.587 32.267 38.781 13.947 321 80.445 76.169 55.545 53.157 57.584 38.214 322 26.077 0.0000 0.0000 3.4478 1.7779 0.1616 323 46.835 0.0000 0.0000 9.4885 4.8927 0.4446 324 45.975 0.0000 42.271 12.618 6.1080 18.582 325 63.629 12.008 59.385 24.350 13.281 35.219 326 100.00 0.0000 72.636 50.791 25.085 52.239 327 16.974 10.388 15.069 3.3106 2.8721 3.8929 328 42.645 36.094 12.916 13.711 14.667 4.9836 329 43.966 36.212 81.956 25.761 19.586 65.934 330 21.817 0.0000 35.294 5.1111 2.3457 13.316 331 20.219 4.5843 53.326 7.9701 4.0393 28.053 332 35.068 0.0000 69.435 14.409 6.4181 46.339 333 67.706 0.0000 76.542 29.619 14.049 56.642 334 86.835 21.082 75.494 43.505 24.425 56.430 335 100.00 35.869 100.00 64.392 38.693 98.686 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04570 100.0000 108.9040 1 0.000000 41.07990 100.0000 24.53540 20.19270 97.21470 2 100.0000 0.000000 73.78220 51.08780 25.20380 53.80440 3 0.000000 0.000000 50.83590 4.831720 1.932570 25.44630 4 100.0000 60.58940 0.000000 54.56690 47.92100 6.374960 5 0.000000 28.22230 0.000000 3.400840 6.801620 1.133520 6 76.48680 0.000000 0.000000 24.15290 12.45430 1.131840 7 1.784250 1.568810 1.248170 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0457 100.000 108.904 1 0.00000 100.000 100.000 53.8072 78.7357 106.971 2 100.000 0.00000 100.000 59.2869 28.4832 96.9851 3 0.00000 0.00000 100.000 18.0485 7.21893 95.0526 4 100.000 100.000 0.00000 76.9972 92.7810 13.8511 5 0.00000 100.000 0.00000 35.7587 71.5167 11.9186 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93250 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6726 25.9586 28.2699 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_video_xl.ti10000644000076500000000000006100312775013140022013 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "200" CREATED "Mon Jan 13 22:06:17 2014" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "21" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045684 99.999971 108.903720" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "DARK_REGION_EMPHASIS" DARK_REGION_EMPHASIS "1.6" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 485 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.90 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 5.0000 5.0000 5.0000 1.0560 1.1110 1.2099 4 10.000 10.000 10.000 2.1317 2.2428 2.4425 5 15.000 15.000 15.000 3.5075 3.6903 4.0189 6 20.000 20.000 20.000 5.2684 5.5430 6.0365 7 25.000 25.000 25.000 7.4285 7.8157 8.5116 8 30.000 30.000 30.000 10.002 10.523 11.460 9 35.000 35.000 35.000 13.002 13.680 14.898 10 40.000 40.000 40.000 16.442 17.299 18.839 11 45.000 45.000 45.000 20.328 21.388 23.292 12 50.000 50.000 50.000 24.673 25.959 28.270 13 55.000 55.000 55.000 29.485 31.022 33.784 14 60.000 60.000 60.000 34.771 36.584 39.841 15 65.000 65.000 65.000 40.542 42.655 46.453 16 70.000 70.000 70.000 46.802 49.242 53.626 17 75.000 75.000 75.000 53.560 56.352 61.370 18 80.000 80.000 80.000 60.823 63.994 69.692 19 85.000 85.000 85.000 68.597 72.173 78.599 20 90.000 90.000 90.000 76.889 80.896 88.099 21 95.000 95.000 95.000 85.702 90.170 98.198 22 5.0000 0.0000 0.0000 0.4582 0.2362 0.0215 23 10.000 0.0000 0.0000 0.9249 0.4769 0.0433 24 15.000 0.0000 0.0000 1.5218 0.7847 0.0713 25 20.000 0.0000 0.0000 2.2858 1.1787 0.1071 26 25.000 0.0000 0.0000 3.2231 1.6620 0.1510 27 30.000 0.0000 0.0000 4.3396 2.2377 0.2034 28 35.000 0.0000 0.0000 5.6414 2.9090 0.2644 29 40.000 0.0000 0.0000 7.1338 3.6785 0.3343 30 45.000 0.0000 0.0000 8.8201 4.5480 0.4133 31 50.000 0.0000 0.0000 10.705 5.5199 0.5017 32 55.000 0.0000 0.0000 12.793 6.5966 0.5995 33 60.000 0.0000 0.0000 15.087 7.7793 0.7070 34 65.000 0.0000 0.0000 17.590 9.0703 0.8243 35 70.000 0.0000 0.0000 20.307 10.471 0.9516 36 75.000 0.0000 0.0000 23.239 11.983 1.0890 37 80.000 0.0000 0.0000 26.390 13.608 1.2367 38 85.000 0.0000 0.0000 29.763 15.347 1.3947 39 90.000 0.0000 0.0000 33.361 17.202 1.5633 40 95.000 0.0000 0.0000 37.185 19.174 1.7425 41 0.0000 5.0000 0.0000 0.3973 0.7946 0.1324 42 0.0000 10.000 0.0000 0.8020 1.6040 0.2673 43 0.0000 15.000 0.0000 1.3196 2.6392 0.4398 44 0.0000 20.000 0.0000 1.9821 3.9642 0.6606 45 0.0000 25.000 0.0000 2.7948 5.5895 0.9315 46 0.0000 30.000 0.0000 3.7629 7.5258 1.2542 47 0.0000 35.000 0.0000 4.8918 9.7835 1.6305 48 0.0000 40.000 0.0000 6.1859 12.372 2.0618 49 0.0000 45.000 0.0000 7.6481 15.296 2.5492 50 0.0000 50.000 0.0000 9.2825 18.565 3.0939 51 0.0000 55.000 0.0000 11.093 22.186 3.6974 52 0.0000 60.000 0.0000 13.082 26.163 4.3603 53 0.0000 65.000 0.0000 15.253 30.506 5.0839 54 0.0000 70.000 0.0000 17.608 35.216 5.8690 55 0.0000 75.000 0.0000 20.151 40.301 6.7164 56 0.0000 80.000 0.0000 22.883 45.766 7.6272 57 0.0000 85.000 0.0000 25.808 51.616 8.6020 58 0.0000 90.000 0.0000 28.928 57.855 9.6417 59 0.0000 95.000 0.0000 32.243 64.486 10.747 60 0.0000 0.0000 5.0000 0.2005 0.0802 1.0560 61 0.0000 0.0000 10.000 0.4048 0.1619 2.1318 62 0.0000 0.0000 15.000 0.6660 0.2664 3.5077 63 0.0000 0.0000 20.000 1.0004 0.4001 5.2688 64 0.0000 0.0000 25.000 1.4106 0.5642 7.4290 65 0.0000 0.0000 30.000 1.8993 0.7597 10.002 66 0.0000 0.0000 35.000 2.4690 0.9876 13.003 67 0.0000 0.0000 40.000 3.1222 1.2488 16.443 68 0.0000 0.0000 45.000 3.8602 1.5440 20.330 69 0.0000 0.0000 50.000 4.6851 1.8739 24.674 70 0.0000 0.0000 55.000 5.5990 2.2395 29.487 71 0.0000 0.0000 60.000 6.6028 2.6410 34.774 72 0.0000 0.0000 65.000 7.6986 3.0792 40.545 73 0.0000 0.0000 70.000 8.8874 3.5547 46.806 74 0.0000 0.0000 75.000 10.171 4.0680 53.564 75 0.0000 0.0000 80.000 11.550 4.6197 60.828 76 0.0000 0.0000 85.000 13.026 5.2101 68.602 77 0.0000 0.0000 90.000 14.601 5.8399 76.894 78 0.0000 0.0000 95.000 16.274 6.5093 85.709 79 5.0000 5.0000 0.0000 0.8554 1.0308 0.1539 80 10.000 10.000 0.0000 1.7269 2.0809 0.3106 81 15.000 15.000 0.0000 2.8414 3.4239 0.5111 82 20.000 20.000 0.0000 4.2679 5.1429 0.7678 83 25.000 25.000 0.0000 6.0179 7.2515 1.0826 84 30.000 30.000 0.0000 8.1025 9.7634 1.4576 85 35.000 35.000 0.0000 10.533 12.693 1.8948 86 40.000 40.000 0.0000 13.320 16.050 2.3961 87 45.000 45.000 0.0000 16.468 19.844 2.9625 88 50.000 50.000 0.0000 19.987 24.085 3.5956 89 55.000 55.000 0.0000 23.886 28.782 4.2969 90 60.000 60.000 0.0000 28.169 33.943 5.0673 91 65.000 65.000 0.0000 32.843 39.576 5.9082 92 70.000 70.000 0.0000 37.915 45.687 6.8206 93 75.000 75.000 0.0000 43.390 52.284 7.8054 94 80.000 80.000 0.0000 49.273 59.374 8.8639 95 85.000 85.000 0.0000 55.571 66.963 9.9967 96 90.000 90.000 0.0000 62.288 75.057 11.205 97 95.000 95.000 0.0000 69.428 83.660 12.489 98 0.0000 5.0000 5.0000 0.5978 0.8748 1.1885 99 0.0000 10.000 10.000 1.2068 1.7659 2.3991 100 0.0000 15.000 15.000 1.9857 2.9056 3.9476 101 0.0000 20.000 20.000 2.9825 4.3643 5.9294 102 0.0000 25.000 25.000 4.2054 6.1537 8.3605 103 0.0000 30.000 30.000 5.6622 8.2854 11.257 104 0.0000 35.000 35.000 7.3608 10.771 14.634 105 0.0000 40.000 40.000 9.3080 13.620 18.505 106 0.0000 45.000 45.000 11.508 16.840 22.879 107 0.0000 50.000 50.000 13.968 20.439 27.768 108 0.0000 55.000 55.000 16.692 24.425 33.184 109 0.0000 60.000 60.000 19.685 28.805 39.134 110 0.0000 65.000 65.000 22.951 33.585 45.629 111 0.0000 70.000 70.000 26.496 38.771 52.675 112 0.0000 75.000 75.000 30.322 44.369 60.281 113 0.0000 80.000 80.000 34.433 50.386 68.455 114 0.0000 85.000 85.000 38.834 56.826 77.204 115 0.0000 90.000 90.000 43.528 63.694 86.536 116 0.0000 95.000 95.000 48.518 70.996 96.456 117 5.0000 0.0000 5.0000 0.6587 0.3165 1.0775 118 10.000 0.0000 10.000 1.3297 0.6388 2.1751 119 15.000 0.0000 15.000 2.1879 1.0511 3.5791 120 20.000 0.0000 20.000 3.2863 1.5788 5.3759 121 25.000 0.0000 25.000 4.6337 2.2262 7.5800 122 30.000 0.0000 30.000 6.2388 2.9973 10.206 123 35.000 0.0000 35.000 8.1105 3.8965 13.268 124 40.000 0.0000 40.000 10.256 4.9273 16.777 125 45.000 0.0000 45.000 12.680 6.0920 20.743 126 50.000 0.0000 50.000 15.390 7.3939 25.176 127 55.000 0.0000 55.000 18.392 8.8360 30.087 128 60.000 0.0000 60.000 21.689 10.420 35.481 129 65.000 0.0000 65.000 25.289 12.149 41.369 130 70.000 0.0000 70.000 29.194 14.026 47.757 131 75.000 0.0000 75.000 33.410 16.051 54.653 132 80.000 0.0000 80.000 37.940 18.227 62.065 133 85.000 0.0000 85.000 42.789 20.557 69.997 134 90.000 0.0000 90.000 47.961 23.042 78.457 135 95.000 0.0000 95.000 53.459 25.683 87.451 136 44.857 44.857 44.857 20.211 21.264 23.158 137 49.219 43.604 43.604 21.265 21.264 22.093 138 53.218 42.313 42.313 22.319 21.264 21.029 139 56.927 40.985 40.985 23.373 21.264 19.966 140 60.400 39.612 39.612 24.426 21.264 18.902 141 63.673 38.191 38.191 25.480 21.264 17.839 142 66.777 36.718 36.718 26.532 21.264 16.776 143 69.733 35.187 35.187 27.585 21.264 15.714 144 72.560 33.587 33.587 28.637 21.264 14.652 145 75.272 31.916 31.916 29.689 21.264 13.590 146 77.882 30.157 30.157 30.740 21.264 12.529 147 80.400 28.299 28.299 31.792 21.264 11.468 148 82.834 26.325 26.325 32.843 21.264 10.407 149 85.192 24.210 24.210 33.893 21.264 9.3465 150 87.479 21.922 21.922 34.943 21.264 8.2864 151 89.702 19.413 19.413 35.993 21.264 7.2266 152 91.865 16.610 16.610 37.043 21.264 6.1671 153 93.974 13.391 13.391 38.092 21.264 5.1080 154 96.029 9.5046 9.5046 39.141 21.264 4.0491 155 98.038 4.7686 4.7686 40.190 21.264 2.9906 156 100.00 0.0000 0.0000 41.238 21.264 1.9325 157 84.611 84.611 84.611 67.974 71.517 77.885 158 80.792 86.081 80.792 65.152 71.517 72.108 159 77.080 87.414 77.080 62.546 71.517 66.771 160 73.459 88.630 73.459 60.130 71.517 61.824 161 69.912 89.744 69.912 57.885 71.517 57.228 162 66.425 90.768 66.425 55.794 71.517 52.945 163 62.982 91.714 62.982 53.841 71.517 48.945 164 59.568 92.589 59.568 52.012 71.517 45.202 165 56.168 93.402 56.168 50.297 71.517 41.690 166 52.765 94.159 52.765 48.685 71.517 38.389 167 49.339 94.865 49.339 47.167 71.517 35.280 168 45.870 95.526 45.870 45.735 71.517 32.348 169 42.329 96.147 42.329 44.382 71.517 29.578 170 38.686 96.730 38.686 43.102 71.517 26.956 171 34.894 97.278 34.894 41.889 71.517 24.471 172 30.889 97.796 30.889 40.737 71.517 22.113 173 26.578 98.286 26.578 39.642 71.517 19.871 174 21.795 98.748 21.795 38.601 71.517 17.739 175 16.225 99.188 16.225 37.609 71.517 15.707 176 9.0236 99.604 9.0236 36.662 71.517 13.769 177 0.0000 100.00 0.0000 35.759 71.517 11.919 178 23.776 23.776 23.776 6.8614 7.2191 7.8619 179 23.631 23.631 25.568 6.9677 7.2191 8.6908 180 23.474 23.474 27.403 7.0836 7.2191 9.5936 181 23.299 23.299 29.290 7.2102 7.2191 10.580 182 23.108 23.108 31.241 7.3492 7.2191 11.664 183 22.893 22.893 33.269 7.5025 7.2191 12.858 184 22.655 22.655 35.388 7.6724 7.2191 14.183 185 22.385 22.385 37.615 7.8617 7.2191 15.658 186 22.082 22.082 39.971 8.0741 7.2191 17.313 187 21.732 21.732 42.478 8.3139 7.2191 19.182 188 21.329 21.329 45.163 8.5869 7.2191 21.310 189 20.860 20.860 48.063 8.9004 7.2191 23.754 190 20.303 20.303 51.219 9.2643 7.2191 26.590 191 19.633 19.633 54.689 9.6917 7.2191 29.921 192 18.811 18.811 58.546 10.201 7.2191 33.889 193 17.770 17.770 62.889 10.818 7.2191 38.695 194 16.416 16.416 67.856 11.580 7.2191 44.638 195 14.568 14.568 73.644 12.547 7.2191 52.174 196 11.851 11.851 80.553 13.813 7.2191 62.043 197 7.2766 7.2766 89.063 15.543 7.2191 75.526 198 0.0000 0.0000 100.00 18.049 7.2191 95.054 199 96.356 96.356 96.356 88.184 92.781 101.04 200 96.634 96.634 92.704 87.347 92.781 94.523 201 96.897 96.897 89.083 86.553 92.781 88.333 202 97.146 97.146 85.486 85.799 92.781 82.451 203 97.382 97.382 81.902 85.080 92.781 76.854 204 97.606 97.606 78.320 84.396 92.781 71.521 205 97.821 97.821 74.729 83.743 92.781 66.434 206 98.024 98.024 71.117 83.120 92.781 61.577 207 98.218 98.218 67.471 82.525 92.781 56.934 208 98.404 98.404 63.772 81.955 92.781 52.491 209 98.581 98.581 60.005 81.409 92.781 48.236 210 98.750 98.750 56.143 80.885 92.781 44.157 211 98.912 98.912 52.159 80.383 92.781 40.244 212 99.068 99.068 48.015 79.901 92.781 36.486 213 99.218 99.218 43.657 79.438 92.781 32.874 214 99.361 99.361 39.013 78.992 92.781 29.401 215 99.499 99.499 33.964 78.563 92.781 26.058 216 99.631 99.631 28.317 78.150 92.781 22.838 217 99.759 99.759 21.682 77.752 92.781 19.734 218 99.881 99.881 13.036 77.367 92.781 16.740 219 100.00 100.00 0.0000 76.997 92.781 13.851 220 88.791 88.791 88.791 74.835 78.736 85.747 221 86.540 89.387 89.387 73.784 78.736 86.808 222 84.224 89.980 89.980 72.734 78.736 87.868 223 81.835 90.569 90.569 71.683 78.736 88.929 224 79.368 91.153 91.153 70.632 78.736 89.990 225 76.814 91.734 91.734 69.581 78.736 91.050 226 74.166 92.310 92.310 68.530 78.736 92.111 227 71.410 92.882 92.882 67.479 78.736 93.172 228 68.534 93.451 93.451 66.428 78.736 94.233 229 65.524 94.016 94.016 65.377 78.736 95.294 230 62.359 94.577 94.577 64.325 78.736 96.356 231 59.014 95.134 95.134 63.274 78.736 97.417 232 55.458 95.689 95.689 62.223 78.736 98.478 233 51.647 96.239 96.239 61.171 78.736 99.540 234 47.524 96.786 96.786 60.119 78.736 100.60 235 43.001 97.330 97.330 59.068 78.736 101.66 236 37.948 97.870 97.870 58.016 78.736 102.72 237 32.139 98.408 98.408 56.964 78.736 103.79 238 25.128 98.941 98.941 55.912 78.736 104.85 239 15.742 99.472 99.472 54.860 78.736 105.91 240 0.0000 100.00 100.00 53.807 78.736 106.97 241 52.554 52.554 52.554 27.072 28.483 31.020 242 54.225 51.873 54.225 27.847 28.483 32.607 243 55.934 51.144 55.934 28.666 28.483 34.284 244 57.685 50.361 57.685 29.532 28.483 36.058 245 59.481 49.517 59.481 30.450 28.483 37.937 246 61.327 48.605 61.327 31.424 28.483 39.931 247 63.228 47.616 63.228 32.460 28.483 42.052 248 65.188 46.541 65.188 33.563 28.483 44.311 249 67.213 45.362 67.213 34.740 28.483 46.722 250 69.311 44.068 69.311 36.000 28.483 49.302 251 71.488 42.636 71.488 37.351 28.483 52.068 252 73.751 41.042 73.751 38.803 28.483 55.042 253 76.110 39.251 76.110 40.369 28.483 58.248 254 78.574 37.220 78.574 42.062 28.483 61.715 255 81.156 34.890 81.156 43.898 28.483 65.474 256 83.868 32.173 83.868 45.896 28.483 69.566 257 86.724 28.935 86.724 48.079 28.483 74.036 258 89.743 24.953 89.743 50.474 28.483 78.940 259 92.945 19.798 92.945 53.112 28.483 84.343 260 96.355 12.357 96.355 56.034 28.483 90.325 261 100.00 0.0000 100.00 59.287 28.483 96.986 262 40.014 25.786 20.317 11.099 9.9635 6.7068 263 75.324 53.324 45.514 37.843 34.593 25.342 264 29.729 42.874 56.966 17.263 18.608 34.043 265 29.370 36.749 19.123 10.451 13.186 6.9022 266 45.878 45.225 65.633 24.698 23.284 44.310 267 30.467 71.586 63.893 30.296 42.064 45.565 268 86.504 43.440 12.117 38.502 30.443 6.5044 269 20.525 29.989 63.105 13.408 11.655 39.664 270 75.217 26.193 32.376 28.543 18.938 13.474 271 30.976 16.581 35.901 8.6732 6.4200 14.309 272 58.214 71.178 18.499 33.326 44.081 11.428 273 89.196 59.446 9.2210 45.989 42.749 7.7700 274 7.7021 18.704 53.282 7.7766 6.0657 28.411 275 20.128 54.049 23.036 14.282 23.155 10.217 276 67.276 12.896 16.166 20.622 12.158 5.1263 277 92.643 75.270 3.0853 55.771 58.867 9.0726 278 72.946 27.032 54.748 30.727 19.906 31.320 279 0.0000 48.676 62.903 14.518 19.761 40.936 280 95.568 95.693 94.577 86.481 91.294 97.612 281 76.096 76.909 76.998 55.793 58.956 64.583 282 59.061 59.970 60.149 34.343 36.341 39.981 283 42.165 42.383 42.534 18.187 19.160 21.010 284 26.405 27.083 27.768 8.3684 8.8404 10.026 285 12.892 13.165 13.693 2.9545 3.1078 3.5418 286 76.553 26.113 0.0000 27.190 18.468 2.1325 287 79.787 34.093 45.206 34.819 24.444 23.288 288 100.00 41.707 48.805 52.384 36.388 27.748 289 100.00 62.158 100.00 73.284 56.476 101.65 290 0.0000 9.0970 16.146 1.4596 1.7414 4.1180 291 9.5810 8.2809 19.304 2.4880 2.1472 5.2603 292 6.5916 5.6661 27.338 2.6838 1.8640 8.7589 293 59.629 49.098 63.092 31.154 28.545 41.975 294 61.087 63.708 66.605 38.357 40.627 48.122 295 76.113 68.043 66.156 48.550 48.848 48.623 296 69.726 26.339 24.899 24.592 17.029 9.3383 297 84.526 45.775 41.486 40.656 32.290 21.560 298 94.191 64.568 60.538 58.325 51.648 42.102 299 100.00 63.984 71.908 65.401 54.604 56.190 300 12.140 0.0000 14.551 1.8004 0.8544 3.4237 301 0.0000 0.0000 15.604 0.7025 0.2810 3.6998 302 15.530 32.053 41.667 9.1604 10.580 19.165 303 18.071 45.124 46.659 13.782 18.039 24.375 304 19.249 83.130 54.230 32.304 52.677 37.046 305 26.082 62.331 33.125 19.766 30.819 16.679 306 46.240 80.225 49.609 36.897 52.647 32.422 307 55.316 89.238 69.232 50.069 67.025 55.896 308 0.0000 39.306 20.509 7.0344 12.407 7.4678 309 0.0000 70.516 35.262 20.363 36.724 19.126 310 0.0000 100.00 41.886 39.149 72.873 29.774 311 59.018 51.977 12.583 25.128 27.706 6.8068 312 85.632 73.980 11.249 50.286 54.994 10.394 313 69.827 53.168 0.0000 30.617 31.238 4.4163 314 69.274 78.644 0.0000 42.022 54.507 8.3064 315 72.908 100.00 56.690 63.672 85.224 44.169 316 0.0000 13.139 41.303 4.4167 3.5435 17.782 317 51.734 16.273 71.687 22.191 12.554 50.056 318 74.463 36.065 81.927 40.175 26.965 66.554 319 78.550 67.811 83.442 54.563 51.254 72.833 320 63.950 40.446 50.693 28.163 23.331 28.215 321 63.963 76.284 67.735 46.225 53.796 51.652 322 76.994 100.00 82.377 72.468 89.030 77.525 323 24.798 0.0000 14.050 3.7926 1.8850 3.3670 324 47.101 11.773 13.930 11.162 7.1247 3.9548 325 85.439 15.130 19.977 32.404 18.576 7.1140 326 72.815 0.0000 0.0000 21.931 11.309 1.0277 327 100.00 33.693 19.911 46.813 30.824 8.6936 328 15.159 35.213 17.388 7.3038 11.009 6.0193 329 19.355 57.124 14.647 14.739 25.212 7.4729 330 17.293 80.452 28.582 26.744 47.935 17.030 331 55.094 85.255 38.731 41.745 59.721 24.782 332 73.560 86.039 61.601 55.755 67.193 46.430 333 43.616 41.742 31.787 17.103 18.486 13.642 334 58.923 51.513 31.035 26.397 27.942 14.542 335 84.019 77.770 33.058 52.963 59.174 20.363 336 100.00 100.00 59.980 83.596 95.420 48.602 337 12.070 0.0000 0.0000 1.1525 0.5943 0.0540 338 8.1071 7.3630 8.1585 1.6522 1.6829 1.9477 339 11.508 25.400 52.390 9.0651 8.3376 27.923 340 18.080 39.254 58.254 14.196 15.478 34.960 341 69.340 49.749 77.658 40.024 33.029 61.362 342 0.0000 10.211 0.0000 0.8208 1.6417 0.2736 343 0.0000 20.042 0.0000 1.9882 3.9762 0.6627 344 0.0000 72.040 0.0000 18.623 37.245 6.2072 345 56.655 100.00 0.0000 49.288 78.493 12.553 346 76.305 100.00 25.614 61.265 84.499 20.767 347 100.00 100.00 32.307 79.149 93.642 25.184 348 39.777 57.160 14.563 19.633 27.758 7.6802 349 39.406 100.00 27.735 44.373 75.766 21.029 350 41.242 100.00 59.600 49.812 78.009 46.605 351 0.0000 16.891 13.464 2.1313 3.3374 3.5630 352 13.209 17.134 8.1096 3.1983 3.9633 2.2965 353 28.219 15.583 7.9632 5.6298 4.9281 2.3285 354 36.759 13.632 0.0000 7.3086 5.4963 0.6759 355 13.628 9.5487 0.0000 2.1040 2.2163 0.3169 356 10.066 17.614 20.152 3.5909 4.1802 5.9205 357 0.0000 30.449 31.622 5.9333 8.5462 12.215 358 21.979 63.421 61.189 24.038 33.196 41.075 359 20.625 84.221 80.404 39.398 56.578 69.995 360 30.520 85.433 100.00 48.586 61.663 103.95 361 0.0000 76.917 63.668 28.574 45.311 46.017 362 0.0000 100.00 73.577 45.554 75.435 63.507 363 48.000 100.00 100.00 63.734 83.854 107.44 364 13.502 26.798 7.4012 4.7478 7.0522 2.6672 365 35.727 74.454 0.0000 25.711 42.742 6.8948 366 42.167 79.986 20.599 31.761 50.211 13.497 367 62.144 78.823 20.099 39.364 53.167 13.470 368 13.991 11.163 43.937 5.9943 4.0137 19.834 369 32.078 8.5696 89.019 19.822 9.5772 75.680 370 52.991 0.0000 100.00 29.978 13.370 95.612 371 73.613 22.480 100.00 42.818 23.503 96.891 372 29.549 21.239 61.492 13.321 9.2882 37.366 373 50.171 33.346 62.965 22.515 17.453 40.142 374 51.623 53.836 77.743 32.931 31.535 61.571 375 60.661 64.779 100.00 48.607 45.469 100.83 376 82.388 68.294 100.00 62.805 55.210 101.96 377 100.00 83.779 100.00 84.363 78.635 105.34 378 0.0000 0.0000 37.970 2.8469 1.1387 14.993 379 0.0000 0.0000 67.043 8.1729 3.2689 43.043 380 0.0000 38.676 69.725 14.646 15.181 48.390 381 18.119 57.437 67.184 22.224 28.382 47.324 382 29.795 57.993 81.990 28.678 31.586 68.148 383 30.694 43.411 74.565 21.730 20.677 55.556 384 34.529 54.270 100.00 34.377 31.695 98.916 385 38.225 27.423 100.00 27.875 17.101 96.442 386 37.300 13.996 46.723 11.643 7.3137 22.471 387 42.745 31.810 46.925 16.355 14.116 23.709 388 54.687 47.286 47.179 25.238 24.957 25.551 389 62.000 62.235 48.313 34.489 38.100 28.585 390 47.548 26.031 14.495 13.373 11.248 4.8027 391 82.208 40.425 22.354 35.339 27.442 9.6409 392 89.221 51.259 78.626 53.668 40.813 63.557 393 90.706 80.845 85.777 70.515 69.507 79.233 394 22.964 7.3780 8.8810 3.7625 2.7693 2.2027 395 44.884 51.505 0.0000 18.587 24.144 3.6806 396 44.546 56.337 49.996 24.950 29.552 28.945 397 51.507 68.817 72.499 37.864 43.707 56.329 398 54.987 85.375 80.099 50.401 63.294 70.254 399 32.396 18.473 30.308 8.6362 6.8476 10.995 400 47.991 29.547 33.126 15.838 13.353 13.516 401 58.784 39.326 31.959 22.624 20.330 13.807 402 79.880 58.713 31.879 40.968 39.514 16.496 403 100.00 59.770 39.676 57.302 48.468 22.467 404 59.760 17.766 7.8907 16.956 11.182 2.9242 405 89.492 17.389 6.7501 34.873 20.352 3.5103 406 100.00 45.174 0.0000 48.940 36.668 4.4996 407 100.00 68.999 0.0000 58.360 55.508 7.6393 408 48.006 31.193 0.0000 13.947 13.155 1.8044 409 63.587 37.705 12.876 22.979 20.055 5.5243 410 87.019 51.004 12.661 41.356 35.560 7.4901 411 97.949 80.452 55.537 68.390 68.953 39.598 412 100.00 81.007 70.394 73.680 71.771 57.072 413 31.409 24.947 20.076 8.4789 8.3900 6.4460 414 36.020 46.722 24.195 15.461 19.976 10.062 415 38.938 71.042 58.308 31.176 42.252 39.290 416 41.087 100.00 81.951 55.356 80.221 76.068 417 0.0000 69.739 78.983 28.742 39.465 65.136 418 0.0000 73.337 100.00 37.333 45.787 101.48 419 42.057 74.043 100.00 45.502 50.542 101.97 420 35.461 14.293 19.209 7.9515 5.8284 5.6466 421 44.958 10.067 31.914 11.721 6.9992 11.782 422 56.936 26.050 49.843 21.299 14.874 26.166 423 78.422 34.880 59.028 36.635 25.369 36.518 424 76.079 56.860 47.423 39.961 37.647 27.434 425 80.577 58.786 67.575 47.650 42.287 49.156 426 84.981 86.723 79.496 68.017 73.625 70.419 427 100.00 100.00 82.374 89.236 97.676 78.306 428 27.152 26.757 30.322 8.7320 8.9057 11.395 429 30.069 32.281 51.934 13.642 12.773 28.104 430 18.136 17.305 33.532 5.8811 5.1521 12.706 431 16.992 15.690 79.796 14.700 8.3325 61.074 432 17.580 33.812 84.917 19.505 15.395 70.094 433 0.0000 46.892 61.673 15.206 19.276 39.400 434 3.4863 54.830 86.160 24.730 27.574 74.171 435 44.072 77.245 85.819 43.124 52.398 77.440 436 0.0000 20.043 33.872 4.3217 4.9098 12.951 437 0.0000 20.060 67.493 10.270 7.2933 44.268 438 0.0000 29.300 100.00 21.666 14.455 96.258 439 0.0000 52.264 100.00 28.129 27.379 98.412 440 45.312 0.0000 18.916 9.8535 4.9743 5.2720 441 68.501 0.0000 20.224 20.487 10.446 6.2689 442 100.00 0.0000 27.275 42.862 21.913 10.481 443 100.00 76.695 35.235 64.792 64.375 22.106 444 21.070 19.161 0.0000 4.3319 4.9951 0.7359 445 21.663 37.614 0.0000 8.1255 12.424 1.9699 446 19.541 91.230 11.258 32.397 60.773 12.454 447 0.0000 44.727 0.0000 7.5634 15.127 2.5209 448 0.0000 52.035 45.558 13.946 21.575 24.125 449 37.491 53.229 63.168 24.078 27.056 42.148 450 62.637 67.106 80.707 44.355 45.591 68.070 451 72.376 84.847 88.385 61.470 68.239 83.746 452 72.046 85.597 100.00 65.699 70.636 104.78 453 75.176 100.00 100.00 77.153 90.774 108.06 454 27.901 38.752 34.862 12.148 14.659 15.045 455 39.142 41.663 48.916 18.016 18.645 26.233 456 65.105 45.216 100.00 43.408 31.747 98.451 457 72.245 0.0000 46.821 25.747 12.796 22.871 458 100.00 0.0000 48.555 45.676 23.039 25.305 459 60.842 15.178 30.659 18.804 11.459 11.547 460 85.977 14.203 34.789 34.119 19.133 14.704 461 85.041 19.056 49.815 36.290 20.914 26.517 462 100.00 37.480 70.256 55.702 35.870 50.908 463 24.910 8.4713 26.206 5.3975 3.6041 8.3862 464 26.898 50.520 37.383 15.858 21.902 17.912 465 12.589 28.387 20.550 5.6887 7.9090 6.6870 466 6.6565 57.545 38.199 15.570 25.630 19.209 467 49.940 64.711 41.532 29.142 37.087 23.126 468 74.755 84.325 44.043 52.204 64.194 29.099 469 28.856 30.946 15.539 8.7311 10.306 5.1905 470 61.205 64.526 26.587 32.267 38.781 13.947 471 80.445 76.169 55.545 53.157 57.584 38.214 472 26.077 0.0000 0.0000 3.4478 1.7779 0.1616 473 46.835 0.0000 0.0000 9.4885 4.8927 0.4446 474 45.975 0.0000 42.271 12.618 6.1080 18.582 475 63.629 12.008 59.385 24.350 13.281 35.219 476 100.00 0.0000 72.636 50.791 25.085 52.239 477 16.974 10.388 15.069 3.3106 2.8721 3.8929 478 42.645 36.094 12.916 13.711 14.667 4.9836 479 43.966 36.212 81.956 25.761 19.586 65.934 480 21.817 0.0000 35.294 5.1111 2.3457 13.316 481 20.219 4.5843 53.326 7.9701 4.0393 28.053 482 35.068 0.0000 69.435 14.409 6.4181 46.339 483 67.706 0.0000 76.542 29.619 14.049 56.642 484 86.835 21.082 75.494 43.505 24.425 56.430 485 100.00 35.869 100.00 64.392 38.693 98.686 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04570 100.0000 108.9040 1 0.000000 41.07990 100.0000 24.53540 20.19270 97.21470 2 100.0000 0.000000 73.78220 51.08780 25.20380 53.80440 3 0.000000 0.000000 50.83590 4.831720 1.932570 25.44630 4 100.0000 60.58940 0.000000 54.56690 47.92100 6.374960 5 0.000000 28.22230 0.000000 3.400840 6.801620 1.133520 6 76.48680 0.000000 0.000000 24.15290 12.45430 1.131840 7 1.784250 1.568810 1.248170 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "January 13, 2014" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0457 100.000 108.904 1 0.00000 100.000 100.000 53.8072 78.7357 106.971 2 100.000 0.00000 100.000 59.2869 28.4832 96.9851 3 0.00000 0.00000 100.000 18.0485 7.21893 95.0526 4 100.000 100.000 0.00000 76.9972 92.7810 13.8511 5 0.00000 100.000 0.00000 35.7587 71.5167 11.9186 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93250 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6726 25.9586 28.2699 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_video_xxl.ti10000644000076500000000000011160512775013140022207 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "450" CREATED "Thu May 21 22:26:56 2015" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "24" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 755 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.91 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.0560 1.1110 1.2099 5 7.5000 7.5000 7.5000 1.5839 1.6665 1.8149 6 10.000 10.000 10.000 2.1317 2.2428 2.4425 7 12.500 12.500 12.500 2.7726 2.9171 3.1769 8 15.000 15.000 15.000 3.5075 3.6903 4.0189 9 17.500 17.500 17.500 4.3387 4.5649 4.9714 10 20.000 20.000 20.000 5.2684 5.5430 6.0366 11 22.500 22.500 22.500 6.2973 6.6256 7.2156 12 25.000 25.000 25.000 7.4284 7.8157 8.5117 13 27.500 27.500 27.500 8.6627 9.1143 9.9259 14 30.000 30.000 30.000 10.002 10.523 11.460 15 32.500 32.500 32.500 11.449 12.046 13.118 16 35.000 35.000 35.000 13.002 13.680 14.898 17 37.500 37.500 37.500 14.666 15.431 16.805 18 40.000 40.000 40.000 16.442 17.299 18.839 19 42.500 42.500 42.500 18.328 19.283 21.000 20 45.000 45.000 45.000 20.328 21.388 23.293 21 47.500 47.500 47.500 22.443 23.613 25.715 22 50.000 50.000 50.000 24.672 25.959 28.270 23 52.500 52.500 52.500 27.020 28.429 30.960 24 55.000 55.000 55.000 29.485 31.022 33.784 25 57.500 57.500 57.500 32.068 33.739 36.744 26 60.000 60.000 60.000 34.771 36.584 39.842 27 62.500 62.500 62.500 37.595 39.555 43.077 28 65.000 65.000 65.000 40.542 42.655 46.453 29 67.500 67.500 67.500 43.610 45.883 49.969 30 70.000 70.000 70.000 46.802 49.242 53.627 31 72.500 72.500 72.500 50.119 52.731 57.427 32 75.000 75.000 75.000 53.560 56.352 61.370 33 77.500 77.500 77.500 57.129 60.107 65.459 34 80.000 80.000 80.000 60.823 63.994 69.693 35 82.500 82.500 82.500 64.646 68.016 74.073 36 85.000 85.000 85.000 68.597 72.173 78.600 37 87.500 87.500 87.500 72.677 76.466 83.275 38 90.000 90.000 90.000 76.888 80.897 88.100 39 92.500 92.500 92.500 81.230 85.464 93.074 40 95.000 95.000 95.000 85.702 90.170 98.199 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 0.4582 0.2362 0.0215 43 10.000 0.0000 0.0000 0.9249 0.4769 0.0433 44 15.000 0.0000 0.0000 1.5218 0.7847 0.0713 45 20.000 0.0000 0.0000 2.2858 1.1787 0.1071 46 25.000 0.0000 0.0000 3.2231 1.6620 0.1510 47 30.000 0.0000 0.0000 4.3396 2.2377 0.2034 48 35.000 0.0000 0.0000 5.6414 2.9090 0.2644 49 40.000 0.0000 0.0000 7.1338 3.6785 0.3343 50 45.000 0.0000 0.0000 8.8201 4.5480 0.4133 51 50.000 0.0000 0.0000 10.705 5.5199 0.5017 52 55.000 0.0000 0.0000 12.793 6.5966 0.5995 53 60.000 0.0000 0.0000 15.087 7.7793 0.7070 54 65.000 0.0000 0.0000 17.590 9.0703 0.8243 55 70.000 0.0000 0.0000 20.307 10.471 0.9516 56 75.000 0.0000 0.0000 23.239 11.983 1.0890 57 80.000 0.0000 0.0000 26.390 13.608 1.2367 58 85.000 0.0000 0.0000 29.763 15.347 1.3947 59 90.000 0.0000 0.0000 33.361 17.202 1.5633 60 95.000 0.0000 0.0000 37.185 19.174 1.7425 61 0.0000 5.0000 0.0000 0.3973 0.7946 0.1324 62 0.0000 10.000 0.0000 0.8020 1.6040 0.2673 63 0.0000 15.000 0.0000 1.3196 2.6392 0.4398 64 0.0000 20.000 0.0000 1.9821 3.9642 0.6606 65 0.0000 25.000 0.0000 2.7948 5.5895 0.9315 66 0.0000 30.000 0.0000 3.7629 7.5258 1.2542 67 0.0000 35.000 0.0000 4.8918 9.7835 1.6305 68 0.0000 40.000 0.0000 6.1859 12.372 2.0618 69 0.0000 45.000 0.0000 7.6481 15.296 2.5492 70 0.0000 50.000 0.0000 9.2825 18.565 3.0939 71 0.0000 55.000 0.0000 11.093 22.186 3.6974 72 0.0000 60.000 0.0000 13.082 26.163 4.3603 73 0.0000 65.000 0.0000 15.253 30.506 5.0839 74 0.0000 70.000 0.0000 17.608 35.216 5.8690 75 0.0000 75.000 0.0000 20.151 40.301 6.7164 76 0.0000 80.000 0.0000 22.883 45.766 7.6272 77 0.0000 85.000 0.0000 25.808 51.616 8.6020 78 0.0000 90.000 0.0000 28.928 57.855 9.6417 79 0.0000 95.000 0.0000 32.243 64.486 10.747 80 0.0000 0.0000 5.0000 0.2005 0.0802 1.0560 81 0.0000 0.0000 10.000 0.4048 0.1619 2.1318 82 0.0000 0.0000 15.000 0.6660 0.2664 3.5077 83 0.0000 0.0000 20.000 1.0004 0.4001 5.2688 84 0.0000 0.0000 25.000 1.4106 0.5642 7.4290 85 0.0000 0.0000 30.000 1.8993 0.7597 10.002 86 0.0000 0.0000 35.000 2.4690 0.9876 13.003 87 0.0000 0.0000 40.000 3.1222 1.2488 16.443 88 0.0000 0.0000 45.000 3.8602 1.5440 20.330 89 0.0000 0.0000 50.000 4.6851 1.8739 24.674 90 0.0000 0.0000 55.000 5.5990 2.2395 29.487 91 0.0000 0.0000 60.000 6.6028 2.6410 34.774 92 0.0000 0.0000 65.000 7.6986 3.0792 40.545 93 0.0000 0.0000 70.000 8.8874 3.5547 46.806 94 0.0000 0.0000 75.000 10.171 4.0680 53.564 95 0.0000 0.0000 80.000 11.550 4.6197 60.828 96 0.0000 0.0000 85.000 13.026 5.2101 68.602 97 0.0000 0.0000 90.000 14.601 5.8399 76.894 98 0.0000 0.0000 95.000 16.274 6.5093 85.709 99 5.0000 5.0000 0.0000 0.8554 1.0308 0.1539 100 10.000 10.000 0.0000 1.7269 2.0809 0.3106 101 15.000 15.000 0.0000 2.8414 3.4239 0.5111 102 20.000 20.000 0.0000 4.2679 5.1429 0.7678 103 25.000 25.000 0.0000 6.0179 7.2515 1.0826 104 30.000 30.000 0.0000 8.1025 9.7634 1.4576 105 35.000 35.000 0.0000 10.533 12.693 1.8948 106 40.000 40.000 0.0000 13.320 16.050 2.3961 107 45.000 45.000 0.0000 16.468 19.844 2.9625 108 50.000 50.000 0.0000 19.987 24.085 3.5956 109 55.000 55.000 0.0000 23.886 28.782 4.2969 110 60.000 60.000 0.0000 28.169 33.943 5.0673 111 65.000 65.000 0.0000 32.843 39.576 5.9082 112 70.000 70.000 0.0000 37.915 45.687 6.8206 113 75.000 75.000 0.0000 43.390 52.284 7.8054 114 80.000 80.000 0.0000 49.273 59.374 8.8639 115 85.000 85.000 0.0000 55.571 66.963 9.9967 116 90.000 90.000 0.0000 62.288 75.057 11.205 117 95.000 95.000 0.0000 69.428 83.660 12.489 118 0.0000 5.0000 5.0000 0.5978 0.8748 1.1885 119 0.0000 10.000 10.000 1.2068 1.7659 2.3991 120 0.0000 15.000 15.000 1.9857 2.9056 3.9476 121 0.0000 20.000 20.000 2.9825 4.3643 5.9294 122 0.0000 25.000 25.000 4.2054 6.1537 8.3605 123 0.0000 30.000 30.000 5.6622 8.2854 11.257 124 0.0000 35.000 35.000 7.3608 10.771 14.634 125 0.0000 40.000 40.000 9.3080 13.620 18.505 126 0.0000 45.000 45.000 11.508 16.840 22.879 127 0.0000 50.000 50.000 13.968 20.439 27.768 128 0.0000 55.000 55.000 16.692 24.425 33.184 129 0.0000 60.000 60.000 19.685 28.805 39.134 130 0.0000 65.000 65.000 22.951 33.585 45.629 131 0.0000 70.000 70.000 26.496 38.771 52.675 132 0.0000 75.000 75.000 30.322 44.369 60.281 133 0.0000 80.000 80.000 34.433 50.386 68.455 134 0.0000 85.000 85.000 38.834 56.826 77.204 135 0.0000 90.000 90.000 43.528 63.694 86.536 136 0.0000 95.000 95.000 48.518 70.996 96.456 137 5.0000 0.0000 5.0000 0.6587 0.3165 1.0775 138 10.000 0.0000 10.000 1.3297 0.6388 2.1751 139 15.000 0.0000 15.000 2.1879 1.0511 3.5791 140 20.000 0.0000 20.000 3.2863 1.5788 5.3759 141 25.000 0.0000 25.000 4.6337 2.2262 7.5800 142 30.000 0.0000 30.000 6.2388 2.9973 10.206 143 35.000 0.0000 35.000 8.1105 3.8965 13.268 144 40.000 0.0000 40.000 10.256 4.9273 16.777 145 45.000 0.0000 45.000 12.680 6.0920 20.743 146 50.000 0.0000 50.000 15.390 7.3939 25.176 147 55.000 0.0000 55.000 18.392 8.8360 30.087 148 60.000 0.0000 60.000 21.689 10.420 35.481 149 65.000 0.0000 65.000 25.289 12.149 41.369 150 70.000 0.0000 70.000 29.194 14.026 47.757 151 75.000 0.0000 75.000 33.410 16.051 54.653 152 80.000 0.0000 80.000 37.940 18.227 62.065 153 85.000 0.0000 85.000 42.789 20.557 69.997 154 90.000 0.0000 90.000 47.961 23.042 78.457 155 95.000 0.0000 95.000 53.459 25.683 87.451 156 44.857 44.857 44.857 20.211 21.264 23.158 157 49.219 43.604 43.604 21.265 21.264 22.093 158 53.218 42.313 42.313 22.319 21.264 21.029 159 56.927 40.985 40.985 23.373 21.264 19.966 160 60.400 39.612 39.612 24.426 21.264 18.902 161 63.673 38.191 38.191 25.480 21.264 17.839 162 66.777 36.718 36.718 26.532 21.264 16.776 163 69.733 35.187 35.187 27.585 21.264 15.714 164 72.560 33.587 33.587 28.637 21.264 14.652 165 75.272 31.916 31.916 29.689 21.264 13.590 166 77.882 30.157 30.157 30.740 21.264 12.529 167 80.400 28.299 28.299 31.792 21.264 11.468 168 82.834 26.325 26.325 32.843 21.264 10.407 169 85.192 24.210 24.210 33.893 21.264 9.3465 170 87.479 21.922 21.922 34.943 21.264 8.2864 171 89.702 19.413 19.413 35.993 21.264 7.2266 172 91.865 16.610 16.610 37.043 21.264 6.1671 173 93.974 13.391 13.391 38.092 21.264 5.1080 174 96.029 9.5046 9.5046 39.141 21.264 4.0491 175 98.038 4.7686 4.7686 40.190 21.264 2.9906 176 100.00 0.0000 0.0000 41.238 21.264 1.9325 177 84.611 84.611 84.611 67.974 71.517 77.885 178 80.792 86.081 80.792 65.152 71.517 72.108 179 77.080 87.414 77.080 62.546 71.517 66.771 180 73.459 88.630 73.459 60.130 71.517 61.824 181 69.912 89.744 69.912 57.885 71.517 57.228 182 66.425 90.768 66.425 55.794 71.517 52.945 183 62.982 91.714 62.982 53.841 71.517 48.945 184 59.568 92.589 59.568 52.012 71.517 45.202 185 56.168 93.402 56.168 50.297 71.517 41.690 186 52.765 94.159 52.765 48.685 71.517 38.389 187 49.339 94.865 49.339 47.167 71.517 35.280 188 45.870 95.526 45.870 45.735 71.517 32.348 189 42.329 96.147 42.329 44.382 71.517 29.578 190 38.686 96.730 38.686 43.102 71.517 26.956 191 34.894 97.278 34.894 41.889 71.517 24.471 192 30.889 97.796 30.889 40.737 71.517 22.113 193 26.578 98.286 26.578 39.642 71.517 19.871 194 21.795 98.748 21.795 38.601 71.517 17.739 195 16.225 99.188 16.225 37.609 71.517 15.707 196 9.0236 99.604 9.0236 36.662 71.517 13.769 197 0.0000 100.00 0.0000 35.759 71.517 11.919 198 23.776 23.776 23.776 6.8614 7.2191 7.8619 199 23.631 23.631 25.568 6.9677 7.2191 8.6908 200 23.474 23.474 27.403 7.0836 7.2191 9.5936 201 23.299 23.299 29.290 7.2102 7.2191 10.580 202 23.108 23.108 31.241 7.3492 7.2191 11.664 203 22.893 22.893 33.269 7.5025 7.2191 12.858 204 22.655 22.655 35.388 7.6724 7.2191 14.183 205 22.385 22.385 37.615 7.8617 7.2191 15.658 206 22.082 22.082 39.971 8.0741 7.2191 17.313 207 21.732 21.732 42.478 8.3139 7.2191 19.182 208 21.329 21.329 45.163 8.5869 7.2191 21.310 209 20.860 20.860 48.063 8.9004 7.2191 23.754 210 20.303 20.303 51.219 9.2643 7.2191 26.590 211 19.633 19.633 54.689 9.6917 7.2191 29.921 212 18.811 18.811 58.546 10.201 7.2191 33.889 213 17.770 17.770 62.889 10.818 7.2191 38.695 214 16.416 16.416 67.856 11.580 7.2191 44.638 215 14.568 14.568 73.644 12.547 7.2191 52.174 216 11.851 11.851 80.553 13.813 7.2191 62.043 217 7.2766 7.2766 89.063 15.543 7.2191 75.526 218 0.0000 0.0000 100.00 18.049 7.2191 95.054 219 96.356 96.356 96.356 88.184 92.781 101.04 220 96.634 96.634 92.704 87.347 92.781 94.523 221 96.897 96.897 89.083 86.553 92.781 88.333 222 97.146 97.146 85.486 85.799 92.781 82.451 223 97.382 97.382 81.902 85.080 92.781 76.854 224 97.606 97.606 78.320 84.396 92.781 71.521 225 97.821 97.821 74.729 83.743 92.781 66.434 226 98.024 98.024 71.117 83.120 92.781 61.577 227 98.218 98.218 67.471 82.525 92.781 56.934 228 98.404 98.404 63.772 81.955 92.781 52.491 229 98.581 98.581 60.005 81.409 92.781 48.236 230 98.750 98.750 56.143 80.885 92.781 44.157 231 98.912 98.912 52.159 80.383 92.781 40.244 232 99.068 99.068 48.015 79.901 92.781 36.486 233 99.218 99.218 43.657 79.438 92.781 32.874 234 99.361 99.361 39.013 78.992 92.781 29.401 235 99.499 99.499 33.964 78.563 92.781 26.058 236 99.631 99.631 28.317 78.150 92.781 22.838 237 99.759 99.759 21.682 77.752 92.781 19.734 238 99.881 99.881 13.036 77.367 92.781 16.740 239 100.00 100.00 0.0000 76.997 92.781 13.851 240 88.791 88.791 88.791 74.835 78.736 85.747 241 86.540 89.387 89.387 73.784 78.736 86.808 242 84.224 89.980 89.980 72.734 78.736 87.868 243 81.835 90.569 90.569 71.683 78.736 88.929 244 79.368 91.153 91.153 70.632 78.736 89.990 245 76.814 91.734 91.734 69.581 78.736 91.050 246 74.166 92.310 92.310 68.530 78.736 92.111 247 71.410 92.882 92.882 67.479 78.736 93.172 248 68.534 93.451 93.451 66.428 78.736 94.233 249 65.524 94.016 94.016 65.377 78.736 95.294 250 62.359 94.577 94.577 64.325 78.736 96.356 251 59.014 95.134 95.134 63.274 78.736 97.417 252 55.458 95.689 95.689 62.223 78.736 98.478 253 51.647 96.239 96.239 61.171 78.736 99.540 254 47.524 96.786 96.786 60.119 78.736 100.60 255 43.001 97.330 97.330 59.068 78.736 101.66 256 37.948 97.870 97.870 58.016 78.736 102.72 257 32.139 98.408 98.408 56.964 78.736 103.79 258 25.128 98.941 98.941 55.912 78.736 104.85 259 15.742 99.472 99.472 54.860 78.736 105.91 260 0.0000 100.00 100.00 53.807 78.736 106.97 261 52.554 52.554 52.554 27.072 28.483 31.020 262 54.225 51.873 54.225 27.847 28.483 32.607 263 55.934 51.144 55.934 28.666 28.483 34.284 264 57.685 50.361 57.685 29.532 28.483 36.058 265 59.481 49.517 59.481 30.450 28.483 37.937 266 61.327 48.605 61.327 31.424 28.483 39.931 267 63.228 47.616 63.228 32.460 28.483 42.052 268 65.188 46.541 65.188 33.563 28.483 44.311 269 67.213 45.362 67.213 34.740 28.483 46.722 270 69.311 44.068 69.311 36.000 28.483 49.302 271 71.488 42.636 71.488 37.351 28.483 52.068 272 73.751 41.042 73.751 38.803 28.483 55.042 273 76.110 39.251 76.110 40.369 28.483 58.248 274 78.574 37.220 78.574 42.062 28.483 61.715 275 81.156 34.890 81.156 43.898 28.483 65.474 276 83.868 32.173 83.868 45.896 28.483 69.566 277 86.724 28.935 86.724 48.079 28.483 74.036 278 89.743 24.953 89.743 50.474 28.483 78.940 279 92.945 19.798 92.945 53.112 28.483 84.343 280 96.355 12.357 96.355 56.034 28.483 90.325 281 100.00 0.0000 100.00 59.287 28.483 96.986 282 40.014 25.786 20.317 11.099 9.9635 6.7068 283 75.324 53.324 45.514 37.843 34.593 25.342 284 29.729 42.874 56.966 17.263 18.608 34.043 285 29.370 36.749 19.123 10.451 13.186 6.9022 286 45.878 45.225 65.633 24.698 23.284 44.310 287 30.467 71.586 63.893 30.296 42.064 45.565 288 86.504 43.440 12.117 38.502 30.443 6.5044 289 20.525 29.989 63.105 13.408 11.655 39.664 290 75.217 26.193 32.376 28.543 18.938 13.474 291 30.976 16.581 35.901 8.6732 6.4200 14.309 292 58.214 71.178 18.499 33.326 44.081 11.428 293 89.196 59.446 9.2210 45.989 42.749 7.7700 294 7.7021 18.704 53.282 7.7766 6.0657 28.411 295 20.128 54.049 23.036 14.282 23.155 10.217 296 67.276 12.896 16.166 20.622 12.158 5.1263 297 92.643 75.270 3.0853 55.771 58.867 9.0726 298 72.946 27.032 54.748 30.727 19.906 31.320 299 0.0000 48.676 62.903 14.518 19.761 40.936 300 95.568 95.693 94.577 86.481 91.294 97.612 301 76.096 76.909 76.998 55.793 58.956 64.583 302 59.061 59.970 60.149 34.343 36.341 39.981 303 42.165 42.383 42.534 18.187 19.160 21.010 304 26.405 27.083 27.768 8.3684 8.8404 10.026 305 12.892 13.165 13.693 2.9545 3.1078 3.5418 306 0.0000 28.442 13.021 3.9984 7.1102 4.0663 307 21.288 32.757 18.901 7.7964 10.393 6.4204 308 37.020 60.041 29.668 21.184 30.151 14.476 309 37.439 70.906 44.459 28.176 40.892 26.203 310 42.397 74.204 62.342 34.755 46.391 44.365 311 44.276 85.730 75.825 45.207 61.074 63.880 312 100.00 26.691 0.0000 44.343 27.473 2.9673 313 100.00 46.682 0.0000 49.417 37.621 4.6586 314 39.635 100.00 100.00 60.825 82.355 107.30 315 0.0000 49.754 41.255 12.497 19.715 20.442 316 48.250 55.179 45.792 25.168 29.083 25.177 317 69.704 78.906 56.446 48.289 57.275 39.333 318 76.448 65.557 0.0000 39.635 43.453 6.2991 319 79.827 100.00 0.0000 62.036 85.067 13.150 320 0.0000 15.814 100.00 19.466 10.054 95.526 321 0.0000 59.258 100.00 30.824 32.769 99.312 322 0.0000 71.948 100.00 36.624 44.371 101.25 323 31.739 76.815 100.00 43.941 51.921 102.32 324 60.341 0.0000 38.193 18.127 9.0143 15.864 325 61.500 0.0000 53.692 21.166 10.295 28.924 326 69.228 20.526 55.686 27.664 16.660 31.801 327 0.0000 78.628 43.034 25.674 45.653 26.119 328 0.0000 100.00 48.069 40.115 73.259 34.861 329 100.00 100.00 71.914 86.364 96.528 63.185 330 35.559 24.093 0.0000 8.4351 8.2620 1.1503 331 40.155 38.281 22.044 14.064 15.611 8.3465 332 31.009 34.628 73.687 19.214 15.900 53.556 333 32.524 64.230 100.00 37.928 39.596 100.25 334 0.0000 85.208 100.00 43.982 59.086 103.70 335 30.901 89.425 100.00 51.168 66.688 104.79 336 0.0000 24.956 27.272 4.4097 6.2227 9.4758 337 0.0000 33.997 26.830 6.2330 9.9375 9.8735 338 34.145 8.4317 9.2401 6.4453 4.2726 2.4311 339 0.0000 9.4810 12.874 1.3024 1.7308 3.1286 340 0.0000 17.043 77.317 12.370 7.4638 57.391 341 31.453 20.989 100.00 24.878 13.903 95.984 342 33.398 39.044 100.00 29.178 21.753 97.272 343 37.430 53.139 100.00 34.789 31.286 98.817 344 78.361 70.574 100.00 61.271 56.062 102.20 345 25.657 15.531 16.076 5.4740 4.7908 4.4722 346 28.646 15.404 37.333 8.1506 5.9134 15.198 347 71.233 36.795 51.970 31.381 23.521 29.278 348 73.350 61.782 57.119 42.094 41.545 37.322 349 82.209 75.274 56.716 54.081 57.326 39.317 350 50.102 0.0000 10.812 11.188 5.7180 2.8335 351 74.076 0.0000 15.403 23.371 11.971 4.6987 352 100.00 0.0000 47.535 45.506 22.971 24.407 353 100.00 25.380 67.303 52.336 30.283 46.254 354 39.378 0.0000 40.904 10.187 4.8768 17.437 355 38.608 0.0000 100.00 24.747 10.673 95.368 356 56.572 18.552 100.00 33.314 17.725 96.277 357 59.151 39.839 100.00 38.872 27.072 97.789 358 59.869 58.177 100.00 45.408 39.637 99.869 359 20.250 0.0000 31.488 4.3888 2.0247 10.961 360 78.431 0.0000 34.198 27.750 14.035 13.683 361 100.00 29.816 36.725 47.648 29.788 17.315 362 100.00 53.172 41.724 55.016 43.431 23.135 363 100.00 50.548 54.355 56.187 42.399 33.929 364 100.00 64.567 71.331 65.516 55.067 55.508 365 100.00 72.759 86.947 73.853 64.690 80.031 366 37.882 8.0964 20.418 8.1518 5.0366 5.9515 367 48.711 34.224 34.638 17.331 15.642 14.819 368 66.446 33.046 29.610 24.643 19.070 12.124 369 86.610 33.037 35.148 37.813 25.785 16.023 370 30.875 32.225 0.0000 8.7996 10.839 1.6285 371 28.915 44.547 0.0000 11.591 17.122 2.6940 372 29.869 78.671 0.0000 26.447 46.498 7.5810 373 0.0000 66.859 59.038 22.509 34.775 39.088 374 0.0000 75.001 81.901 32.251 45.142 70.440 375 0.0000 100.00 83.355 48.288 76.528 77.907 376 52.190 100.00 83.549 59.941 82.530 78.756 377 100.00 0.0000 18.269 42.115 21.615 6.5471 378 100.00 0.0000 32.608 43.425 22.139 13.447 379 0.0000 45.934 22.133 9.1060 16.346 8.7866 380 0.0000 61.962 40.005 17.034 29.072 21.083 381 29.060 63.263 48.824 23.077 32.871 28.630 382 32.097 100.00 0.0000 40.622 74.024 12.147 383 57.943 100.00 0.0000 49.877 78.796 12.581 384 78.597 100.00 28.943 63.032 85.373 22.537 385 0.0000 62.103 21.556 15.092 28.393 10.554 386 76.838 67.857 74.814 51.068 49.766 59.971 387 23.947 25.832 33.889 8.2908 8.3763 13.422 388 46.910 25.744 36.536 15.107 11.829 15.435 389 46.708 40.162 48.761 20.145 19.119 26.075 390 55.445 86.906 100.00 58.011 67.864 104.65 391 64.769 100.00 100.00 71.277 87.744 107.79 392 0.0000 34.129 100.00 22.732 16.586 96.615 393 0.0000 48.139 100.00 26.702 24.526 97.938 394 0.0000 9.2141 23.557 2.0174 1.9802 7.0073 395 0.0000 18.654 29.490 3.6349 4.3164 10.317 396 0.0000 20.186 45.165 5.8954 5.5731 21.136 397 34.108 35.469 45.955 14.413 14.399 23.045 398 0.0000 80.089 24.911 24.336 46.428 15.031 399 0.0000 100.00 28.192 37.472 72.202 20.943 400 0.0000 100.00 66.275 43.752 74.714 54.014 401 33.786 100.00 66.805 49.184 77.500 54.916 402 86.693 100.00 81.975 78.835 92.327 77.207 403 100.00 100.00 88.320 91.057 98.405 87.901 404 0.0000 15.658 58.804 7.7529 5.3386 33.933 405 0.0000 45.538 63.880 15.261 18.609 41.814 406 0.0000 49.510 80.111 20.696 22.861 64.034 407 40.918 73.870 85.690 40.226 48.244 76.584 408 58.854 73.711 100.00 52.068 53.672 102.23 409 0.0000 31.239 46.446 8.1172 9.6908 22.881 410 0.0000 56.680 61.785 18.724 26.274 40.691 411 0.0000 81.749 61.010 30.701 50.495 43.862 412 0.0000 84.779 78.785 36.881 55.831 67.574 413 77.608 90.415 100.00 72.099 78.425 105.95 414 86.376 100.00 100.00 84.537 94.581 108.41 415 40.341 13.322 0.0000 8.3726 5.9949 0.7161 416 75.564 34.028 13.406 28.818 21.710 5.6867 417 60.428 20.728 0.0000 17.384 12.068 1.4137 418 78.357 37.529 0.0000 30.856 24.112 3.0287 419 82.851 83.503 0.0000 53.198 64.409 9.6291 420 100.00 85.650 25.005 68.853 74.234 18.098 421 100.00 100.00 29.266 78.820 93.510 23.450 422 100.00 100.00 51.373 81.924 94.752 39.800 423 11.793 0.0000 7.7835 1.4326 0.7026 1.6969 424 29.510 0.0000 76.765 14.869 6.4355 56.269 425 73.619 0.0000 100.00 40.455 18.773 96.104 426 78.469 27.970 100.00 46.801 27.018 97.361 427 100.00 49.349 100.00 68.347 46.603 100.01 428 100.00 64.397 0.0000 56.220 51.226 6.9260 429 100.00 81.362 0.0000 64.899 68.586 9.8190 430 20.749 91.132 20.999 33.152 60.997 15.668 431 38.645 100.00 48.763 46.942 76.766 35.791 432 62.914 100.00 66.364 60.292 83.240 54.896 433 72.878 100.00 87.208 71.435 88.328 85.149 434 34.813 26.810 81.530 20.708 13.933 64.458 435 69.983 49.634 85.250 42.556 34.021 73.009 436 100.00 71.120 100.00 77.448 64.806 103.04 437 12.240 7.4538 0.0000 1.7646 1.7891 0.2524 438 20.669 17.623 0.0000 4.0496 4.5355 0.6621 439 89.047 51.903 29.077 44.411 37.462 14.343 440 100.00 71.548 63.174 66.901 60.929 46.437 441 100.00 83.945 86.363 79.859 76.991 81.136 442 100.00 87.456 100.00 86.602 83.114 106.09 443 0.0000 14.814 10.551 1.7279 2.7676 2.6981 444 0.0000 34.574 81.361 16.731 14.355 64.490 445 50.533 0.0000 63.983 18.386 8.6167 39.843 446 77.518 0.0000 75.881 35.205 16.950 55.969 447 100.00 0.0000 79.652 52.689 25.844 62.240 448 100.00 31.832 83.794 58.057 34.644 70.000 449 100.00 43.925 67.583 56.859 39.223 48.090 450 100.00 54.733 83.710 64.866 48.301 72.145 451 9.5598 0.0000 13.972 1.4868 0.6965 3.2360 452 22.554 0.0000 18.849 3.6591 1.7808 4.9564 453 39.938 0.0000 26.379 8.6514 4.2832 8.4302 454 48.233 22.482 58.009 18.574 12.374 33.870 455 78.166 35.910 77.157 41.078 27.530 59.523 456 79.483 0.0000 54.089 31.479 15.604 29.796 457 100.00 0.0000 63.049 48.498 24.168 40.167 458 100.00 28.329 100.00 62.709 35.327 98.127 459 21.972 38.963 30.056 10.443 13.927 12.125 460 32.304 41.282 57.879 17.627 18.090 34.885 461 37.802 55.154 69.863 26.459 29.172 50.647 462 53.505 68.383 77.752 39.891 44.282 63.677 463 33.239 20.544 12.941 7.7740 7.0068 3.8251 464 50.702 25.054 22.007 14.946 11.736 7.5365 465 100.00 23.591 20.408 44.820 26.777 8.2128 466 100.00 55.748 21.974 53.770 44.483 11.798 467 43.834 62.508 0.0000 22.557 32.631 5.1097 468 62.565 79.255 39.160 41.815 54.559 24.087 469 61.365 100.00 38.650 54.446 80.813 28.128 470 81.172 100.00 58.256 69.162 88.019 46.067 471 36.301 54.212 15.166 17.483 24.962 7.4410 472 65.122 57.594 32.997 31.987 34.199 16.611 473 100.00 69.013 43.832 62.047 56.993 27.023 474 100.00 83.039 61.748 72.852 73.329 46.881 475 46.129 42.433 0.0000 16.104 18.510 2.7243 476 65.016 47.714 24.116 27.444 26.634 10.680 477 71.632 74.460 43.013 44.663 52.108 26.348 478 12.591 52.863 21.120 12.597 21.655 9.2062 479 24.730 79.118 72.413 35.051 50.206 57.617 480 41.401 82.308 83.726 44.437 57.386 74.999 481 51.448 92.813 89.472 56.487 73.129 86.781 482 22.561 19.617 10.870 5.1147 5.4447 3.1151 483 49.479 26.665 10.121 14.009 11.777 3.6857 484 51.047 38.500 12.224 17.418 17.502 5.1457 485 60.924 65.284 84.165 43.687 43.881 73.124 486 72.760 75.203 88.713 56.342 57.481 82.489 487 5.5798 14.511 14.423 2.4063 3.0421 3.7749 488 10.667 21.724 25.991 4.7411 5.6036 8.7001 489 17.010 52.246 39.738 14.968 22.314 19.694 490 39.081 83.259 43.929 35.307 54.542 28.035 491 22.854 76.675 16.992 24.634 43.849 11.309 492 39.980 100.00 26.282 44.415 75.803 20.302 493 13.508 26.004 78.723 15.492 11.112 59.980 494 20.835 39.633 90.220 23.187 19.291 79.413 495 17.576 50.508 91.567 26.467 25.938 82.843 496 14.524 39.327 76.592 18.059 16.994 57.891 497 25.727 54.786 83.534 26.969 28.796 70.098 498 0.0000 40.426 44.800 10.133 14.139 22.266 499 16.551 51.024 59.272 17.831 22.756 37.269 500 34.038 60.656 67.339 26.976 32.782 48.116 501 12.944 26.360 65.050 12.009 9.8166 41.679 502 17.391 26.041 93.844 20.727 13.279 84.707 503 27.662 8.2140 92.181 19.763 9.3849 81.070 504 19.698 13.336 80.521 15.065 8.0950 62.096 505 46.333 23.733 90.086 26.506 15.796 78.336 506 18.487 72.469 55.976 26.665 41.045 36.857 507 24.500 88.267 69.039 39.597 60.719 54.985 508 28.782 100.00 84.497 52.683 78.755 79.907 509 18.545 68.803 42.945 22.619 36.527 24.449 510 18.087 89.038 52.742 35.461 59.711 36.785 511 55.373 91.525 70.070 51.778 70.077 57.475 512 77.483 99.870 71.393 69.677 87.799 61.687 513 51.045 58.342 19.488 24.490 30.926 9.7252 514 64.281 68.640 24.378 35.521 43.318 13.594 515 87.336 68.184 26.590 49.705 50.285 15.250 516 100.00 70.997 25.591 60.803 58.050 15.677 517 58.311 45.546 47.032 26.291 24.678 25.316 518 60.469 58.218 49.124 32.199 34.414 28.715 519 88.687 68.799 54.401 54.904 52.947 36.078 520 92.053 70.750 70.673 61.935 57.574 55.315 521 27.609 11.520 50.458 9.4925 5.7458 25.588 522 30.777 23.139 51.677 11.986 9.2766 27.274 523 39.616 47.653 82.301 27.723 25.489 67.502 524 12.536 6.5552 49.870 6.3910 3.5295 24.787 525 13.880 20.139 49.763 8.0203 6.5705 25.189 526 23.942 31.030 54.778 12.548 11.739 30.732 527 69.234 46.970 55.438 33.831 29.065 33.619 528 35.607 44.780 26.971 14.986 18.794 11.192 529 46.137 70.100 27.191 28.503 40.720 14.823 530 44.753 83.545 30.601 35.633 55.162 19.063 531 54.011 94.830 51.309 49.407 72.596 37.176 532 20.915 64.535 19.570 18.456 31.734 10.230 533 80.799 69.221 37.142 46.882 49.431 21.428 534 87.926 79.802 47.931 58.946 63.695 31.903 535 61.493 49.483 40.572 28.120 27.645 20.641 536 62.007 52.349 59.977 32.775 31.145 38.872 537 63.215 56.910 83.165 40.976 37.248 70.416 538 26.324 24.790 41.486 9.5910 8.6531 18.634 539 44.821 32.126 67.531 21.268 16.277 45.470 540 46.641 41.541 90.427 30.774 23.987 80.273 541 80.400 52.469 100.00 54.855 41.271 99.687 542 23.689 56.865 0.0000 14.774 25.154 4.0764 543 51.832 83.797 0.0000 36.534 56.076 8.8983 544 65.834 89.001 15.945 47.040 66.162 14.085 545 35.740 69.271 11.312 23.570 37.709 8.4819 546 55.669 75.911 18.045 34.583 48.362 12.024 547 72.112 81.474 27.571 46.896 59.207 17.616 548 86.985 14.309 9.4443 32.784 18.701 3.8756 549 90.219 34.928 9.0276 38.760 27.180 5.1035 550 100.00 40.827 23.212 48.909 34.597 10.680 551 14.759 44.660 43.375 12.643 17.298 21.601 552 14.152 57.174 52.282 18.436 26.634 30.857 553 15.135 62.150 87.531 29.344 34.304 77.472 554 44.446 68.704 89.846 40.153 44.225 82.695 555 62.846 78.958 91.834 53.986 59.177 88.271 556 26.746 0.0000 53.147 8.8420 3.9521 27.816 557 75.536 11.590 67.103 32.705 17.329 44.539 558 75.651 40.292 66.539 37.957 27.942 45.614 559 76.294 52.181 72.659 43.642 36.316 54.814 560 10.579 21.580 11.469 3.6820 5.1420 3.2844 561 18.130 49.852 10.575 11.643 19.657 5.4412 562 84.790 51.193 14.678 39.963 34.928 8.0292 563 91.092 69.773 9.8976 52.073 52.776 9.5410 564 94.912 90.924 12.149 67.149 78.391 14.258 565 8.6834 37.921 47.580 10.697 13.374 24.428 566 26.616 42.758 51.195 15.431 17.738 28.273 567 15.864 31.671 39.100 8.7621 10.290 17.241 568 67.111 43.160 41.487 29.133 25.161 20.792 569 55.217 11.075 11.882 14.284 8.6464 3.5107 570 68.368 10.393 11.880 20.728 11.874 3.7940 571 79.521 27.250 19.811 30.276 20.264 7.4869 572 24.640 9.7431 0.0000 3.9285 3.1821 0.4073 573 41.604 46.356 8.7806 16.079 20.235 4.9026 574 59.381 51.453 10.351 25.002 27.376 6.1728 575 67.121 68.209 8.6977 35.807 43.276 8.2921 576 82.611 76.535 24.727 50.480 56.995 15.608 577 100.00 85.811 47.529 71.806 75.572 33.169 578 14.790 10.605 7.1463 2.6371 2.5990 1.8648 579 22.505 10.166 6.1283 3.7959 3.1414 1.6951 580 30.084 18.206 5.7124 6.3169 5.7950 1.9871 581 40.274 18.012 21.709 10.054 7.5779 6.8668 582 66.266 19.524 23.522 21.452 13.752 8.2404 583 80.321 20.268 34.473 31.026 18.721 14.588 584 33.124 50.716 41.530 18.001 23.043 21.002 585 33.500 66.817 63.398 28.656 37.807 44.250 586 53.639 73.271 73.605 41.258 48.714 58.616 587 66.119 75.969 79.627 50.289 55.282 68.010 588 24.319 44.867 22.796 11.912 17.293 9.1069 589 47.271 48.327 22.417 19.557 22.884 9.6197 590 53.157 48.661 32.419 22.992 24.709 14.906 591 8.7905 8.5453 23.887 2.7949 2.2951 7.1760 592 10.627 16.590 32.948 4.7304 4.4297 12.271 593 36.261 25.478 38.952 11.859 10.046 16.926 594 46.944 25.105 47.766 16.648 12.263 24.061 595 61.151 31.548 55.452 25.426 18.532 32.043 596 9.7195 4.2423 12.559 1.7626 1.3478 2.9435 597 21.961 13.583 24.777 5.1813 4.2305 7.8335 598 38.383 15.445 31.779 10.096 7.0016 11.790 599 70.942 30.942 39.170 27.814 19.877 18.139 600 21.275 6.2663 9.3988 3.3843 2.4404 2.2753 601 42.122 16.549 9.4126 9.7136 7.2050 2.8646 602 61.223 16.566 7.3650 17.486 11.226 2.7946 603 93.912 15.559 36.293 40.349 22.559 16.015 604 100.00 26.510 50.290 49.045 29.300 27.898 605 14.634 7.2772 10.435 2.4759 2.0858 2.4982 606 15.718 13.359 37.152 5.4954 4.2003 14.884 607 43.743 56.479 37.713 22.853 28.770 19.094 608 51.331 73.904 43.059 34.382 46.376 25.819 609 56.367 80.873 57.606 42.890 56.113 40.603 610 62.303 84.804 75.713 52.265 63.884 63.893 611 38.531 85.311 58.309 38.925 57.935 41.910 612 72.130 87.462 69.703 57.662 69.265 56.535 613 72.447 89.118 88.455 64.180 73.563 84.747 614 82.911 94.984 87.670 74.413 84.613 85.037 615 55.115 56.673 0.0000 24.581 30.099 4.5144 616 64.906 77.898 0.0000 39.253 52.468 8.0588 617 84.341 88.710 22.002 58.565 71.780 16.826 618 84.948 89.328 42.508 61.705 73.714 29.227 619 16.219 29.742 0.0000 5.4021 8.2914 1.3157 620 19.990 39.470 7.7883 8.6370 13.383 3.7658 621 24.478 43.438 70.540 19.311 19.561 50.049 622 49.528 9.7321 29.517 13.145 7.7194 10.488 623 57.147 21.567 42.300 19.423 12.912 19.560 624 63.150 27.577 69.049 28.567 18.589 47.448 625 58.769 11.541 61.994 22.478 12.183 38.012 626 86.531 14.338 64.136 39.586 21.390 41.372 627 88.751 34.592 71.453 46.484 30.015 51.837 628 89.418 50.291 87.185 56.015 41.227 76.834 629 45.985 48.393 59.737 24.461 24.827 37.827 630 47.053 57.956 64.342 29.366 32.447 44.287 631 59.661 61.875 71.430 38.043 39.142 54.011 632 86.820 62.909 78.191 56.408 49.069 64.371 633 22.179 73.491 34.183 24.407 41.053 19.064 634 20.525 88.668 37.395 33.224 58.488 24.066 635 70.558 91.417 39.464 53.518 71.547 26.967 636 49.420 89.988 17.059 40.191 63.559 14.316 637 83.643 89.565 59.770 64.028 74.782 45.420 638 62.139 44.085 0.0000 23.499 23.053 3.2117 639 72.350 52.952 10.463 32.413 31.997 6.7014 640 75.883 54.208 40.831 37.812 35.145 21.769 641 80.923 56.032 54.081 43.908 39.066 33.661 642 73.418 6.6456 24.963 24.223 13.111 8.6320 643 73.195 8.5649 43.743 26.501 14.249 20.575 644 88.092 13.754 49.307 37.704 20.662 25.936 645 89.862 14.900 77.997 45.552 24.159 59.853 646 5.6196 8.5842 16.342 1.9441 1.9262 4.1934 647 14.564 16.034 23.628 4.1985 4.1600 7.3455 648 36.635 26.666 23.726 10.507 9.8686 8.1590 649 46.562 41.693 34.231 18.425 19.114 15.174 650 70.737 60.862 76.688 44.794 41.822 61.413 651 85.043 61.662 90.299 58.274 48.807 83.398 652 85.514 72.821 90.902 64.037 59.529 86.197 653 85.450 84.593 100.00 73.689 73.853 104.98 654 13.966 6.9334 64.035 9.4160 4.8082 39.641 655 16.939 16.247 62.489 10.406 6.7242 38.160 656 32.320 21.127 65.114 14.797 9.9304 41.629 657 49.985 20.823 72.068 22.211 13.490 50.744 658 55.140 45.275 81.408 32.543 26.877 66.146 659 9.4306 12.919 0.0000 1.9542 2.6212 0.4030 660 11.833 22.285 5.2546 3.6702 5.3331 1.9412 661 23.478 26.515 8.9630 6.3498 7.7918 3.0539 662 36.594 31.416 9.7315 10.555 11.433 3.7091 663 31.532 30.193 21.361 9.6273 10.483 7.3052 664 45.466 32.419 20.527 14.316 13.628 7.3272 665 60.218 39.705 28.301 23.020 20.732 11.828 666 73.746 43.706 24.957 31.143 26.662 10.880 667 80.335 44.298 38.024 36.895 29.727 18.755 668 80.712 43.594 49.447 38.666 30.123 27.837 669 92.660 58.396 50.519 52.566 44.994 30.951 670 80.111 22.343 0.0000 28.807 18.333 2.0214 671 81.756 53.620 0.0000 38.125 35.356 4.8160 672 86.062 76.117 69.700 60.066 60.746 54.760 673 89.442 78.151 85.238 67.897 65.930 77.813 674 39.267 39.281 64.181 20.404 18.542 41.886 675 45.991 55.881 78.886 31.842 32.086 63.406 676 53.300 62.130 94.288 42.073 40.598 89.649 677 0.0000 9.0938 39.486 3.7742 2.6667 16.309 678 14.991 26.864 42.284 8.1066 8.4382 19.280 679 43.869 34.181 53.549 18.442 15.864 30.002 680 61.859 45.654 63.809 31.273 26.922 42.493 681 75.684 59.460 64.198 44.032 40.921 44.980 682 51.873 29.304 0.0000 15.082 13.149 1.7434 683 65.104 37.654 10.633 23.636 20.388 4.9646 684 72.266 59.319 23.707 35.706 37.261 12.110 685 86.012 63.105 38.314 47.774 45.687 21.464 686 25.436 5.3487 16.376 4.4889 2.8588 4.2508 687 30.784 16.193 23.703 7.2930 5.7845 7.5300 688 35.682 26.475 31.774 10.990 9.9731 12.313 689 56.698 28.849 35.083 19.554 15.030 14.868 690 55.955 37.504 48.810 23.215 19.644 26.058 691 57.817 66.897 49.830 34.839 41.360 30.553 692 66.774 89.648 52.839 52.424 69.035 37.784 693 0.0000 32.188 64.218 11.758 11.482 41.022 694 0.0000 61.597 80.081 25.328 32.140 65.536 695 20.105 89.479 89.049 45.190 64.091 84.916 696 62.310 27.663 16.270 20.252 15.241 5.7755 697 85.375 33.767 58.313 40.877 27.180 35.876 698 87.034 53.952 62.349 49.004 40.327 42.453 699 37.181 10.409 63.536 14.476 7.8577 39.378 700 43.313 9.4838 78.863 20.213 10.247 59.770 701 62.676 13.107 81.747 29.562 15.492 64.624 702 9.4203 41.919 27.856 9.2730 14.572 11.130 703 24.464 55.525 33.109 16.651 25.090 15.728 704 44.820 63.902 51.352 28.440 36.005 31.259 705 11.694 34.944 12.105 6.4934 10.531 4.3439 706 30.601 37.332 13.251 10.528 13.489 5.0195 707 35.368 42.020 34.059 14.857 17.416 14.928 708 55.701 60.755 35.953 29.087 34.586 18.705 709 69.718 64.223 46.467 39.144 41.832 27.468 710 71.920 70.242 59.917 45.719 49.126 41.594 711 94.012 88.334 65.062 71.990 77.592 51.614 712 100.00 88.446 79.175 80.491 81.663 70.840 713 8.6554 5.6055 28.668 2.9985 2.0034 9.4623 714 16.741 5.8586 38.975 5.2156 3.0355 15.939 715 38.354 10.886 47.092 11.700 6.8591 22.697 716 60.034 38.772 70.394 29.940 23.086 49.980 717 89.166 51.326 70.878 51.596 40.017 52.739 718 86.759 28.764 46.246 38.569 24.628 23.993 719 93.471 42.209 55.593 48.515 34.465 34.045 720 8.2820 12.565 6.8012 2.0797 2.5993 1.8223 721 87.912 12.129 21.166 33.925 18.860 7.5629 722 92.210 40.946 32.421 43.637 31.824 15.193 723 31.255 0.0000 11.227 5.1110 2.5820 2.6523 724 56.964 0.0000 23.649 14.961 7.5653 7.4457 725 48.201 10.871 18.689 11.791 7.2846 5.5314 726 61.442 15.146 29.892 19.012 11.570 11.129 727 72.698 23.241 46.057 28.380 17.866 23.065 728 73.844 24.734 83.475 37.855 22.145 68.150 729 81.555 10.591 91.614 43.401 21.900 81.252 730 88.087 34.927 91.001 51.759 32.198 81.739 731 52.933 48.146 68.443 29.068 26.853 48.247 732 57.834 85.866 89.254 54.761 65.666 85.062 733 7.5579 25.562 19.332 4.5397 6.5290 6.0087 734 19.346 27.327 21.493 6.5167 8.0194 7.0476 735 26.303 36.415 37.873 11.572 13.419 16.837 736 37.002 47.658 49.114 19.244 22.009 26.994 737 14.183 31.974 30.906 7.5991 9.9058 11.978 738 12.289 35.830 57.395 12.341 13.224 33.713 739 20.487 48.611 67.505 19.463 22.157 46.668 740 22.796 58.971 74.019 25.357 30.718 56.549 741 29.973 72.134 76.998 33.714 43.858 62.834 742 12.887 66.492 69.101 25.852 35.982 51.013 743 18.052 73.859 87.781 35.411 45.678 79.761 744 19.151 6.6443 24.314 4.0213 2.7011 7.3844 745 31.728 7.5264 31.009 7.3744 4.4579 10.997 746 52.215 10.711 44.852 16.309 9.2524 21.042 747 54.593 0.0000 84.478 25.482 11.652 68.358 748 59.023 31.374 85.099 31.735 20.876 70.799 749 70.284 41.624 92.416 42.505 29.996 84.261 750 30.136 53.792 52.309 20.108 25.572 30.590 751 49.769 62.513 60.758 31.526 36.477 40.832 752 58.279 71.021 62.469 39.518 46.437 44.269 753 71.848 79.408 71.058 53.066 59.777 56.712 754 86.272 87.177 74.212 67.761 74.076 62.950 755 84.328 86.982 94.193 72.315 75.547 94.631 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04550 100.0000 108.9050 1 0.000000 41.07760 100.0000 24.53450 20.19130 97.21560 2 100.0000 0.000000 73.78150 51.08760 25.20370 53.80410 3 0.000000 0.000000 50.83730 4.831900 1.932640 25.44790 4 100.0000 60.58910 0.000000 54.56680 47.92080 6.375060 5 0.000000 28.22220 0.000000 3.400830 6.801590 1.133540 6 76.48600 0.000000 0.000000 24.15250 12.45410 1.131850 7 1.784270 1.568810 1.248150 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0455 100.000 108.905 1 0.00000 100.000 100.000 53.8070 78.7357 106.972 2 100.000 0.00000 100.000 59.2867 28.4832 96.9861 3 0.00000 0.00000 100.000 18.0482 7.21883 95.0536 4 100.000 100.000 0.00000 76.9973 92.7812 13.8514 5 0.00000 100.000 0.00000 35.7588 71.5168 11.9189 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93254 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6725 25.9586 28.2703 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_video_xxxl.ti10000644000076500000000000014056212775013140022403 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "700" CREATED "Thu May 21 22:20:00 2015" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045471 100.000000 108.905029" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "ACCURATE_EXPECTED_VALUES" ACCURATE_EXPECTED_VALUES "true" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "24" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1005 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.91 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.0560 1.1110 1.2099 5 7.5000 7.5000 7.5000 1.5839 1.6665 1.8149 6 10.000 10.000 10.000 2.1317 2.2428 2.4425 7 12.500 12.500 12.500 2.7726 2.9171 3.1769 8 15.000 15.000 15.000 3.5075 3.6903 4.0189 9 17.500 17.500 17.500 4.3387 4.5649 4.9714 10 20.000 20.000 20.000 5.2684 5.5430 6.0366 11 22.500 22.500 22.500 6.2973 6.6256 7.2156 12 25.000 25.000 25.000 7.4284 7.8157 8.5117 13 27.500 27.500 27.500 8.6627 9.1143 9.9259 14 30.000 30.000 30.000 10.002 10.523 11.460 15 32.500 32.500 32.500 11.449 12.046 13.118 16 35.000 35.000 35.000 13.002 13.680 14.898 17 37.500 37.500 37.500 14.666 15.431 16.805 18 40.000 40.000 40.000 16.442 17.299 18.839 19 42.500 42.500 42.500 18.328 19.283 21.000 20 45.000 45.000 45.000 20.328 21.388 23.293 21 47.500 47.500 47.500 22.443 23.613 25.715 22 50.000 50.000 50.000 24.672 25.959 28.270 23 52.500 52.500 52.500 27.020 28.429 30.960 24 55.000 55.000 55.000 29.485 31.022 33.784 25 57.500 57.500 57.500 32.068 33.739 36.744 26 60.000 60.000 60.000 34.771 36.584 39.842 27 62.500 62.500 62.500 37.595 39.555 43.077 28 65.000 65.000 65.000 40.542 42.655 46.453 29 67.500 67.500 67.500 43.610 45.883 49.969 30 70.000 70.000 70.000 46.802 49.242 53.627 31 72.500 72.500 72.500 50.119 52.731 57.427 32 75.000 75.000 75.000 53.560 56.352 61.370 33 77.500 77.500 77.500 57.129 60.107 65.459 34 80.000 80.000 80.000 60.823 63.994 69.693 35 82.500 82.500 82.500 64.646 68.016 74.073 36 85.000 85.000 85.000 68.597 72.173 78.600 37 87.500 87.500 87.500 72.677 76.466 83.275 38 90.000 90.000 90.000 76.888 80.897 88.100 39 92.500 92.500 92.500 81.230 85.464 93.074 40 95.000 95.000 95.000 85.702 90.170 98.199 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 0.4582 0.2362 0.0215 43 10.000 0.0000 0.0000 0.9249 0.4769 0.0433 44 15.000 0.0000 0.0000 1.5218 0.7847 0.0713 45 20.000 0.0000 0.0000 2.2858 1.1787 0.1071 46 25.000 0.0000 0.0000 3.2231 1.6620 0.1510 47 30.000 0.0000 0.0000 4.3396 2.2377 0.2034 48 35.000 0.0000 0.0000 5.6414 2.9090 0.2644 49 40.000 0.0000 0.0000 7.1338 3.6785 0.3343 50 45.000 0.0000 0.0000 8.8201 4.5480 0.4133 51 50.000 0.0000 0.0000 10.705 5.5199 0.5017 52 55.000 0.0000 0.0000 12.793 6.5966 0.5995 53 60.000 0.0000 0.0000 15.087 7.7793 0.7070 54 65.000 0.0000 0.0000 17.590 9.0703 0.8243 55 70.000 0.0000 0.0000 20.307 10.471 0.9516 56 75.000 0.0000 0.0000 23.239 11.983 1.0890 57 80.000 0.0000 0.0000 26.390 13.608 1.2367 58 85.000 0.0000 0.0000 29.763 15.347 1.3947 59 90.000 0.0000 0.0000 33.361 17.202 1.5633 60 95.000 0.0000 0.0000 37.185 19.174 1.7425 61 0.0000 5.0000 0.0000 0.3973 0.7946 0.1324 62 0.0000 10.000 0.0000 0.8020 1.6040 0.2673 63 0.0000 15.000 0.0000 1.3196 2.6392 0.4398 64 0.0000 20.000 0.0000 1.9821 3.9642 0.6606 65 0.0000 25.000 0.0000 2.7948 5.5895 0.9315 66 0.0000 30.000 0.0000 3.7629 7.5258 1.2542 67 0.0000 35.000 0.0000 4.8918 9.7835 1.6305 68 0.0000 40.000 0.0000 6.1859 12.372 2.0618 69 0.0000 45.000 0.0000 7.6481 15.296 2.5492 70 0.0000 50.000 0.0000 9.2825 18.565 3.0939 71 0.0000 55.000 0.0000 11.093 22.186 3.6974 72 0.0000 60.000 0.0000 13.082 26.163 4.3603 73 0.0000 65.000 0.0000 15.253 30.506 5.0839 74 0.0000 70.000 0.0000 17.608 35.216 5.8690 75 0.0000 75.000 0.0000 20.151 40.301 6.7164 76 0.0000 80.000 0.0000 22.883 45.766 7.6272 77 0.0000 85.000 0.0000 25.808 51.616 8.6020 78 0.0000 90.000 0.0000 28.928 57.855 9.6417 79 0.0000 95.000 0.0000 32.243 64.486 10.747 80 0.0000 0.0000 5.0000 0.2005 0.0802 1.0560 81 0.0000 0.0000 10.000 0.4048 0.1619 2.1318 82 0.0000 0.0000 15.000 0.6660 0.2664 3.5077 83 0.0000 0.0000 20.000 1.0004 0.4001 5.2688 84 0.0000 0.0000 25.000 1.4106 0.5642 7.4290 85 0.0000 0.0000 30.000 1.8993 0.7597 10.002 86 0.0000 0.0000 35.000 2.4690 0.9876 13.003 87 0.0000 0.0000 40.000 3.1222 1.2488 16.443 88 0.0000 0.0000 45.000 3.8602 1.5440 20.330 89 0.0000 0.0000 50.000 4.6851 1.8739 24.674 90 0.0000 0.0000 55.000 5.5990 2.2395 29.487 91 0.0000 0.0000 60.000 6.6028 2.6410 34.774 92 0.0000 0.0000 65.000 7.6986 3.0792 40.545 93 0.0000 0.0000 70.000 8.8874 3.5547 46.806 94 0.0000 0.0000 75.000 10.171 4.0680 53.564 95 0.0000 0.0000 80.000 11.550 4.6197 60.828 96 0.0000 0.0000 85.000 13.026 5.2101 68.602 97 0.0000 0.0000 90.000 14.601 5.8399 76.894 98 0.0000 0.0000 95.000 16.274 6.5093 85.709 99 5.0000 5.0000 0.0000 0.8554 1.0308 0.1539 100 10.000 10.000 0.0000 1.7269 2.0809 0.3106 101 15.000 15.000 0.0000 2.8414 3.4239 0.5111 102 20.000 20.000 0.0000 4.2679 5.1429 0.7678 103 25.000 25.000 0.0000 6.0179 7.2515 1.0826 104 30.000 30.000 0.0000 8.1025 9.7634 1.4576 105 35.000 35.000 0.0000 10.533 12.693 1.8948 106 40.000 40.000 0.0000 13.320 16.050 2.3961 107 45.000 45.000 0.0000 16.468 19.844 2.9625 108 50.000 50.000 0.0000 19.987 24.085 3.5956 109 55.000 55.000 0.0000 23.886 28.782 4.2969 110 60.000 60.000 0.0000 28.169 33.943 5.0673 111 65.000 65.000 0.0000 32.843 39.576 5.9082 112 70.000 70.000 0.0000 37.915 45.687 6.8206 113 75.000 75.000 0.0000 43.390 52.284 7.8054 114 80.000 80.000 0.0000 49.273 59.374 8.8639 115 85.000 85.000 0.0000 55.571 66.963 9.9967 116 90.000 90.000 0.0000 62.288 75.057 11.205 117 95.000 95.000 0.0000 69.428 83.660 12.489 118 0.0000 5.0000 5.0000 0.5978 0.8748 1.1885 119 0.0000 10.000 10.000 1.2068 1.7659 2.3991 120 0.0000 15.000 15.000 1.9857 2.9056 3.9476 121 0.0000 20.000 20.000 2.9825 4.3643 5.9294 122 0.0000 25.000 25.000 4.2054 6.1537 8.3605 123 0.0000 30.000 30.000 5.6622 8.2854 11.257 124 0.0000 35.000 35.000 7.3608 10.771 14.634 125 0.0000 40.000 40.000 9.3080 13.620 18.505 126 0.0000 45.000 45.000 11.508 16.840 22.879 127 0.0000 50.000 50.000 13.968 20.439 27.768 128 0.0000 55.000 55.000 16.692 24.425 33.184 129 0.0000 60.000 60.000 19.685 28.805 39.134 130 0.0000 65.000 65.000 22.951 33.585 45.629 131 0.0000 70.000 70.000 26.496 38.771 52.675 132 0.0000 75.000 75.000 30.322 44.369 60.281 133 0.0000 80.000 80.000 34.433 50.386 68.455 134 0.0000 85.000 85.000 38.834 56.826 77.204 135 0.0000 90.000 90.000 43.528 63.694 86.536 136 0.0000 95.000 95.000 48.518 70.996 96.456 137 5.0000 0.0000 5.0000 0.6587 0.3165 1.0775 138 10.000 0.0000 10.000 1.3297 0.6388 2.1751 139 15.000 0.0000 15.000 2.1879 1.0511 3.5791 140 20.000 0.0000 20.000 3.2863 1.5788 5.3759 141 25.000 0.0000 25.000 4.6337 2.2262 7.5800 142 30.000 0.0000 30.000 6.2388 2.9973 10.206 143 35.000 0.0000 35.000 8.1105 3.8965 13.268 144 40.000 0.0000 40.000 10.256 4.9273 16.777 145 45.000 0.0000 45.000 12.680 6.0920 20.743 146 50.000 0.0000 50.000 15.390 7.3939 25.176 147 55.000 0.0000 55.000 18.392 8.8360 30.087 148 60.000 0.0000 60.000 21.689 10.420 35.481 149 65.000 0.0000 65.000 25.289 12.149 41.369 150 70.000 0.0000 70.000 29.194 14.026 47.757 151 75.000 0.0000 75.000 33.410 16.051 54.653 152 80.000 0.0000 80.000 37.940 18.227 62.065 153 85.000 0.0000 85.000 42.789 20.557 69.997 154 90.000 0.0000 90.000 47.961 23.042 78.457 155 95.000 0.0000 95.000 53.459 25.683 87.451 156 44.857 44.857 44.857 20.211 21.264 23.158 157 49.219 43.604 43.604 21.265 21.264 22.093 158 53.218 42.313 42.313 22.319 21.264 21.029 159 56.927 40.985 40.985 23.373 21.264 19.966 160 60.400 39.612 39.612 24.426 21.264 18.902 161 63.673 38.191 38.191 25.480 21.264 17.839 162 66.777 36.718 36.718 26.532 21.264 16.776 163 69.733 35.187 35.187 27.585 21.264 15.714 164 72.560 33.587 33.587 28.637 21.264 14.652 165 75.272 31.916 31.916 29.689 21.264 13.590 166 77.882 30.157 30.157 30.740 21.264 12.529 167 80.400 28.299 28.299 31.792 21.264 11.468 168 82.834 26.325 26.325 32.843 21.264 10.407 169 85.192 24.210 24.210 33.893 21.264 9.3465 170 87.479 21.922 21.922 34.943 21.264 8.2864 171 89.702 19.413 19.413 35.993 21.264 7.2266 172 91.865 16.610 16.610 37.043 21.264 6.1671 173 93.974 13.391 13.391 38.092 21.264 5.1080 174 96.029 9.5046 9.5046 39.141 21.264 4.0491 175 98.038 4.7686 4.7686 40.190 21.264 2.9906 176 100.00 0.0000 0.0000 41.238 21.264 1.9325 177 84.611 84.611 84.611 67.974 71.517 77.885 178 80.792 86.081 80.792 65.152 71.517 72.108 179 77.080 87.414 77.080 62.546 71.517 66.771 180 73.459 88.630 73.459 60.130 71.517 61.824 181 69.912 89.744 69.912 57.885 71.517 57.228 182 66.425 90.768 66.425 55.794 71.517 52.945 183 62.982 91.714 62.982 53.841 71.517 48.945 184 59.568 92.589 59.568 52.012 71.517 45.202 185 56.168 93.402 56.168 50.297 71.517 41.690 186 52.765 94.159 52.765 48.685 71.517 38.389 187 49.339 94.865 49.339 47.167 71.517 35.280 188 45.870 95.526 45.870 45.735 71.517 32.348 189 42.329 96.147 42.329 44.382 71.517 29.578 190 38.686 96.730 38.686 43.102 71.517 26.956 191 34.894 97.278 34.894 41.889 71.517 24.471 192 30.889 97.796 30.889 40.737 71.517 22.113 193 26.578 98.286 26.578 39.642 71.517 19.871 194 21.795 98.748 21.795 38.601 71.517 17.739 195 16.225 99.188 16.225 37.609 71.517 15.707 196 9.0236 99.604 9.0236 36.662 71.517 13.769 197 0.0000 100.00 0.0000 35.759 71.517 11.919 198 23.776 23.776 23.776 6.8614 7.2191 7.8619 199 23.631 23.631 25.568 6.9677 7.2191 8.6908 200 23.474 23.474 27.403 7.0836 7.2191 9.5936 201 23.299 23.299 29.290 7.2102 7.2191 10.580 202 23.108 23.108 31.241 7.3492 7.2191 11.664 203 22.893 22.893 33.269 7.5025 7.2191 12.858 204 22.655 22.655 35.388 7.6724 7.2191 14.183 205 22.385 22.385 37.615 7.8617 7.2191 15.658 206 22.082 22.082 39.971 8.0741 7.2191 17.313 207 21.732 21.732 42.478 8.3139 7.2191 19.182 208 21.329 21.329 45.163 8.5869 7.2191 21.310 209 20.860 20.860 48.063 8.9004 7.2191 23.754 210 20.303 20.303 51.219 9.2643 7.2191 26.590 211 19.633 19.633 54.689 9.6917 7.2191 29.921 212 18.811 18.811 58.546 10.201 7.2191 33.889 213 17.770 17.770 62.889 10.818 7.2191 38.695 214 16.416 16.416 67.856 11.580 7.2191 44.638 215 14.568 14.568 73.644 12.547 7.2191 52.174 216 11.851 11.851 80.553 13.813 7.2191 62.043 217 7.2766 7.2766 89.063 15.543 7.2191 75.526 218 0.0000 0.0000 100.00 18.049 7.2191 95.054 219 96.356 96.356 96.356 88.184 92.781 101.04 220 96.634 96.634 92.704 87.347 92.781 94.523 221 96.897 96.897 89.083 86.553 92.781 88.333 222 97.146 97.146 85.486 85.799 92.781 82.451 223 97.382 97.382 81.902 85.080 92.781 76.854 224 97.606 97.606 78.320 84.396 92.781 71.521 225 97.821 97.821 74.729 83.743 92.781 66.434 226 98.024 98.024 71.117 83.120 92.781 61.577 227 98.218 98.218 67.471 82.525 92.781 56.934 228 98.404 98.404 63.772 81.955 92.781 52.491 229 98.581 98.581 60.005 81.409 92.781 48.236 230 98.750 98.750 56.143 80.885 92.781 44.157 231 98.912 98.912 52.159 80.383 92.781 40.244 232 99.068 99.068 48.015 79.901 92.781 36.486 233 99.218 99.218 43.657 79.438 92.781 32.874 234 99.361 99.361 39.013 78.992 92.781 29.401 235 99.499 99.499 33.964 78.563 92.781 26.058 236 99.631 99.631 28.317 78.150 92.781 22.838 237 99.759 99.759 21.682 77.752 92.781 19.734 238 99.881 99.881 13.036 77.367 92.781 16.740 239 100.00 100.00 0.0000 76.997 92.781 13.851 240 88.791 88.791 88.791 74.835 78.736 85.747 241 86.540 89.387 89.387 73.784 78.736 86.808 242 84.224 89.980 89.980 72.734 78.736 87.868 243 81.835 90.569 90.569 71.683 78.736 88.929 244 79.368 91.153 91.153 70.632 78.736 89.990 245 76.814 91.734 91.734 69.581 78.736 91.050 246 74.166 92.310 92.310 68.530 78.736 92.111 247 71.410 92.882 92.882 67.479 78.736 93.172 248 68.534 93.451 93.451 66.428 78.736 94.233 249 65.524 94.016 94.016 65.377 78.736 95.294 250 62.359 94.577 94.577 64.325 78.736 96.356 251 59.014 95.134 95.134 63.274 78.736 97.417 252 55.458 95.689 95.689 62.223 78.736 98.478 253 51.647 96.239 96.239 61.171 78.736 99.540 254 47.524 96.786 96.786 60.119 78.736 100.60 255 43.001 97.330 97.330 59.068 78.736 101.66 256 37.948 97.870 97.870 58.016 78.736 102.72 257 32.139 98.408 98.408 56.964 78.736 103.79 258 25.128 98.941 98.941 55.912 78.736 104.85 259 15.742 99.472 99.472 54.860 78.736 105.91 260 0.0000 100.00 100.00 53.807 78.736 106.97 261 52.554 52.554 52.554 27.072 28.483 31.020 262 54.225 51.873 54.225 27.847 28.483 32.607 263 55.934 51.144 55.934 28.666 28.483 34.284 264 57.685 50.361 57.685 29.532 28.483 36.058 265 59.481 49.517 59.481 30.450 28.483 37.937 266 61.327 48.605 61.327 31.424 28.483 39.931 267 63.228 47.616 63.228 32.460 28.483 42.052 268 65.188 46.541 65.188 33.563 28.483 44.311 269 67.213 45.362 67.213 34.740 28.483 46.722 270 69.311 44.068 69.311 36.000 28.483 49.302 271 71.488 42.636 71.488 37.351 28.483 52.068 272 73.751 41.042 73.751 38.803 28.483 55.042 273 76.110 39.251 76.110 40.369 28.483 58.248 274 78.574 37.220 78.574 42.062 28.483 61.715 275 81.156 34.890 81.156 43.898 28.483 65.474 276 83.868 32.173 83.868 45.896 28.483 69.566 277 86.724 28.935 86.724 48.079 28.483 74.036 278 89.743 24.953 89.743 50.474 28.483 78.940 279 92.945 19.798 92.945 53.112 28.483 84.343 280 96.355 12.357 96.355 56.034 28.483 90.325 281 100.00 0.0000 100.00 59.287 28.483 96.986 282 40.014 25.786 20.317 11.099 9.9635 6.7068 283 75.324 53.324 45.514 37.843 34.593 25.342 284 29.729 42.874 56.966 17.263 18.608 34.043 285 29.370 36.749 19.123 10.451 13.186 6.9022 286 45.878 45.225 65.633 24.698 23.284 44.310 287 30.467 71.586 63.893 30.296 42.064 45.565 288 86.504 43.440 12.117 38.502 30.443 6.5044 289 20.525 29.989 63.105 13.408 11.655 39.664 290 75.217 26.193 32.376 28.543 18.938 13.474 291 30.976 16.581 35.901 8.6732 6.4200 14.309 292 58.214 71.178 18.499 33.326 44.081 11.428 293 89.196 59.446 9.2210 45.989 42.749 7.7700 294 7.7021 18.704 53.282 7.7766 6.0657 28.411 295 20.128 54.049 23.036 14.282 23.155 10.217 296 67.276 12.896 16.166 20.622 12.158 5.1263 297 92.643 75.270 3.0853 55.771 58.867 9.0726 298 72.946 27.032 54.748 30.727 19.906 31.320 299 0.0000 48.676 62.903 14.518 19.761 40.936 300 95.568 95.693 94.577 86.481 91.294 97.612 301 76.096 76.909 76.998 55.793 58.956 64.583 302 59.061 59.970 60.149 34.343 36.341 39.981 303 42.165 42.383 42.534 18.187 19.160 21.010 304 26.405 27.083 27.768 8.3684 8.8404 10.026 305 12.892 13.165 13.693 2.9545 3.1078 3.5418 306 25.495 0.0000 85.412 16.477 6.9752 69.422 307 25.214 11.866 100.00 22.294 10.861 95.533 308 52.164 13.094 100.00 30.737 15.403 95.965 309 86.126 60.387 100.00 61.845 49.460 100.90 310 100.00 80.689 100.00 82.562 75.033 104.74 311 100.00 0.0000 15.758 41.951 21.549 5.6828 312 100.00 22.089 100.00 61.589 33.089 97.754 313 100.00 39.132 100.00 65.236 40.381 98.969 314 26.240 100.00 41.492 42.575 74.646 29.638 315 48.083 100.00 43.983 49.420 78.133 31.888 316 0.0000 27.014 100.00 21.214 13.550 96.109 317 0.0000 38.061 100.00 23.713 18.547 96.942 318 0.0000 48.636 100.00 26.868 24.858 97.993 319 64.138 79.542 100.00 57.817 61.309 103.40 320 80.971 80.069 100.00 67.998 67.000 103.96 321 0.0000 15.248 100.00 19.397 9.9172 95.503 322 25.932 29.055 100.00 25.033 16.116 96.403 323 31.655 100.00 100.00 58.557 81.185 107.19 324 57.313 100.00 84.264 62.389 83.768 79.994 325 71.613 100.00 90.698 71.816 88.394 91.008 326 47.936 100.00 0.0000 45.661 76.623 12.383 327 66.404 100.00 0.0000 54.090 80.969 12.778 328 77.189 100.00 22.039 61.508 84.660 19.171 329 0.0000 100.00 65.643 43.605 74.655 53.240 330 31.946 100.00 73.873 50.456 77.953 64.143 331 35.347 9.6076 0.0000 6.5065 4.4940 0.5247 332 51.565 14.934 0.0000 12.648 8.4693 0.9685 333 62.083 39.947 0.0000 22.275 20.646 2.8116 334 69.241 56.235 0.0000 31.448 33.386 4.7872 335 77.692 59.883 19.299 38.890 39.289 10.510 336 78.179 75.142 45.096 49.318 55.004 28.333 337 100.00 87.920 59.275 75.296 79.057 45.112 338 0.0000 68.962 45.617 21.061 35.790 26.542 339 20.491 76.792 52.092 28.535 45.461 33.778 340 43.247 81.317 65.363 39.623 54.614 49.245 341 68.831 84.975 74.367 55.447 65.719 62.199 342 47.502 34.269 28.893 16.239 15.169 11.426 343 56.750 37.992 40.478 22.407 19.566 19.313 344 72.642 43.640 58.480 35.350 28.237 36.550 345 10.022 45.398 25.442 10.149 16.602 10.273 346 30.336 82.278 0.0000 28.613 50.663 8.2707 347 68.414 86.139 0.0000 45.923 63.017 9.7435 348 84.185 100.00 0.0000 64.957 86.573 13.287 349 84.515 100.00 40.408 68.364 87.962 30.041 350 24.103 0.0000 60.746 9.8019 4.2724 35.747 351 30.810 32.385 71.198 18.006 14.577 50.020 352 29.444 55.930 76.553 26.245 29.303 59.781 353 0.0000 61.947 66.233 21.888 31.003 46.678 354 0.0000 100.00 81.079 47.619 76.261 74.382 355 17.735 100.00 88.588 51.823 78.164 86.509 356 79.426 62.760 48.657 44.730 43.712 29.434 357 100.00 63.258 56.724 61.649 52.589 38.014 358 100.00 63.570 67.644 64.167 53.816 50.598 359 45.412 69.169 23.110 27.418 39.530 12.718 360 62.311 72.160 46.768 39.043 47.385 28.801 361 68.987 100.00 46.349 59.572 83.325 34.301 362 26.525 66.646 0.0000 19.552 33.843 5.5017 363 26.254 100.00 0.0000 39.245 73.314 12.082 364 31.750 100.00 23.763 41.835 74.499 18.999 365 0.0000 100.00 25.294 37.196 72.092 19.488 366 57.953 100.00 26.638 51.443 79.424 20.806 367 100.00 100.00 50.396 81.751 94.683 38.890 368 100.00 100.00 70.493 86.007 96.385 61.301 369 100.00 100.00 87.322 90.742 98.279 86.241 370 100.00 0.0000 64.341 48.787 24.284 41.689 371 100.00 23.051 80.167 55.296 30.822 63.833 372 100.00 23.114 0.0000 43.708 26.204 2.7558 373 100.00 42.252 0.0000 48.062 34.911 4.2069 374 0.0000 9.2207 9.5690 1.1195 1.6219 2.2756 375 0.0000 31.092 31.892 6.1010 8.8334 12.419 376 0.0000 45.029 50.725 12.469 17.239 27.895 377 29.840 57.538 60.688 23.129 29.077 39.768 378 38.215 67.844 72.747 32.729 40.363 56.288 379 78.223 0.0000 85.858 38.534 18.333 71.172 380 87.681 28.453 88.480 49.222 28.865 76.952 381 0.0000 100.00 45.044 39.626 73.064 32.286 382 26.602 100.00 58.460 45.603 75.866 45.181 383 57.614 100.00 72.326 59.197 82.507 62.462 384 0.0000 73.254 64.202 26.759 41.490 46.005 385 21.405 76.196 69.020 31.965 46.337 52.587 386 0.0000 82.086 21.835 25.222 48.617 14.040 387 37.410 84.556 26.754 33.450 54.977 17.094 388 53.923 86.320 34.636 41.363 60.550 22.219 389 0.0000 51.708 66.378 17.898 22.969 45.514 390 13.407 54.418 91.493 27.277 28.459 83.158 391 24.244 57.886 100.00 33.337 33.239 99.270 392 0.0000 42.166 82.336 19.026 18.488 66.662 393 0.0000 73.323 100.00 37.325 45.772 101.48 394 41.934 89.166 100.00 54.205 68.009 104.88 395 55.020 100.00 100.00 66.609 85.337 107.57 396 24.763 52.063 0.0000 13.182 21.652 3.4845 397 56.617 58.923 0.0000 26.150 32.243 4.8457 398 80.415 69.326 0.0000 43.941 48.308 7.0091 399 100.00 71.279 0.0000 59.479 57.745 8.0124 400 100.00 20.684 14.545 43.962 25.689 5.9948 401 100.00 20.149 28.476 44.984 25.969 11.775 402 100.00 33.022 41.304 48.971 31.439 20.821 403 100.00 57.358 41.082 56.521 46.591 23.180 404 100.00 78.434 71.247 72.444 68.958 57.712 405 100.00 82.446 89.696 80.031 75.645 86.404 406 54.480 0.0000 20.272 13.586 6.8877 5.9645 407 56.895 19.744 37.111 18.317 12.015 15.690 408 38.301 20.561 21.125 9.7563 7.9709 6.7169 409 40.761 20.635 30.157 11.370 8.7236 11.129 410 41.709 19.781 44.763 13.461 9.3929 21.145 411 53.835 32.247 52.811 21.726 16.912 29.316 412 60.161 48.147 56.326 29.676 27.474 34.437 413 0.0000 71.681 27.098 20.048 37.526 14.605 414 0.0000 84.175 43.956 29.011 52.103 27.918 415 0.0000 84.806 62.622 32.857 54.248 46.303 416 100.00 88.524 73.196 78.921 81.114 62.328 417 100.00 90.341 86.541 83.887 84.959 82.752 418 100.00 90.890 100.00 88.790 87.489 106.82 419 61.154 0.0000 10.239 16.062 8.2340 2.9219 420 64.835 0.0000 53.277 22.778 11.135 28.595 421 81.350 0.0000 68.437 35.784 17.468 46.074 422 100.00 0.0000 81.937 53.348 26.108 65.711 423 64.486 28.107 0.0000 20.701 15.688 1.9377 424 100.00 38.632 27.157 48.665 33.539 12.358 425 100.00 47.131 42.133 52.989 39.282 22.753 426 16.384 10.596 19.238 3.5175 2.9756 5.3407 427 70.340 44.354 42.099 31.370 26.837 21.464 428 71.268 54.916 53.787 37.460 35.113 32.948 429 75.374 66.862 75.323 49.832 48.420 60.488 430 40.265 60.314 57.452 26.510 32.579 36.761 431 56.901 78.291 74.461 45.596 54.900 60.759 432 60.512 80.898 87.316 52.470 60.191 80.895 433 61.513 88.863 100.00 62.071 71.778 105.19 434 88.389 88.881 100.00 78.437 80.235 105.97 435 24.975 0.0000 43.083 6.7850 3.0860 18.937 436 43.849 0.0000 50.060 13.110 6.2169 25.124 437 50.953 12.405 77.773 23.044 12.153 58.394 438 68.804 20.918 81.588 33.765 19.168 64.870 439 47.988 21.020 62.090 19.107 12.207 38.303 440 48.905 34.258 86.608 28.511 20.135 73.266 441 70.477 58.480 100.00 51.083 42.745 100.17 442 63.779 0.0000 35.040 19.433 9.7346 13.824 443 82.826 0.0000 36.987 30.988 15.664 15.642 444 100.00 0.0000 48.491 45.666 23.035 25.248 445 21.838 0.0000 7.0052 2.8906 1.4580 1.6021 446 34.547 0.0000 13.564 6.0995 3.0777 3.3325 447 44.833 8.0929 15.909 10.123 6.0888 4.4238 448 69.186 22.314 24.523 23.557 15.461 8.9156 449 70.137 16.157 0.0000 21.843 13.431 1.4418 450 81.576 19.586 14.962 30.015 18.252 5.4217 451 100.00 50.105 21.553 51.677 40.349 10.934 452 100.00 100.00 26.549 78.551 93.403 22.033 453 13.039 26.756 37.671 7.1925 8.0103 15.884 454 12.141 37.085 48.940 11.075 13.222 25.573 455 32.176 45.234 74.748 22.708 22.000 56.015 456 0.0000 7.8280 19.567 1.5905 1.6316 5.3078 457 0.0000 16.193 31.418 3.5171 3.7501 11.298 458 0.0000 18.302 49.129 6.2755 5.2949 24.465 459 0.0000 30.541 63.900 11.327 10.735 40.526 460 0.0000 46.299 74.555 18.108 20.133 55.627 461 0.0000 59.735 100.00 31.020 33.162 99.377 462 22.448 68.448 100.00 37.628 42.337 100.80 463 43.522 77.592 100.00 47.893 54.586 102.62 464 0.0000 12.788 74.901 11.217 6.2037 53.784 465 0.0000 29.004 82.018 15.691 11.968 65.090 466 81.462 46.554 100.00 53.538 37.597 99.048 467 100.00 53.764 100.00 69.916 49.741 100.53 468 31.084 0.0000 30.460 6.5543 3.1543 10.478 469 50.403 0.0000 38.920 13.840 6.7923 16.172 470 0.0000 12.916 7.1543 1.3736 2.2881 1.8730 471 0.0000 56.521 28.547 13.428 24.057 13.105 472 52.988 64.993 34.298 29.562 37.603 18.199 473 21.011 31.819 8.8353 6.9703 9.7206 3.3652 474 22.534 33.281 18.881 8.1430 10.750 6.4636 475 43.956 34.773 22.220 14.462 14.502 8.1859 476 47.236 89.806 20.383 39.471 62.987 15.472 477 50.725 100.00 59.674 53.288 79.800 46.849 478 71.591 100.00 64.868 64.643 85.524 53.300 479 77.897 100.00 82.025 72.933 89.281 77.007 480 67.895 65.139 58.022 40.647 42.977 38.627 481 87.769 70.031 71.052 58.500 55.266 55.548 482 100.00 75.174 77.991 72.465 66.142 66.529 483 79.647 0.0000 50.105 30.864 15.371 25.997 484 86.752 10.404 49.769 36.482 19.519 26.196 485 88.990 60.082 82.272 57.940 47.933 70.198 486 0.0000 58.755 52.275 17.660 27.175 30.996 487 0.0000 69.365 83.751 29.947 39.656 72.379 488 0.0000 79.016 83.261 34.832 49.661 73.283 489 0.0000 86.934 100.00 45.040 61.201 104.05 490 74.004 46.734 27.303 32.458 28.713 12.355 491 73.724 67.521 29.122 40.695 45.143 16.046 492 100.00 86.116 22.094 68.889 74.704 16.884 493 100.00 87.814 41.167 72.065 77.657 28.421 494 27.980 31.854 0.0000 8.0290 10.319 1.5687 495 29.547 39.108 51.762 15.171 16.065 28.496 496 31.097 48.711 58.481 19.742 22.581 36.282 497 46.384 20.045 8.3335 11.644 8.9175 2.8555 498 68.491 28.280 34.850 25.328 17.841 14.957 499 69.165 40.556 74.352 36.177 26.909 55.703 500 73.240 54.067 84.702 45.859 38.095 72.745 501 0.0000 8.7452 32.446 2.8619 2.2551 11.649 502 16.056 19.659 43.239 7.1916 6.1608 19.631 503 45.665 27.352 100.00 30.338 18.351 96.555 504 45.982 42.527 100.00 34.126 25.756 97.785 505 53.709 56.117 100.00 41.804 36.570 99.467 506 0.0000 26.863 10.646 3.5715 6.4479 3.3337 507 10.884 31.550 18.576 6.0120 9.0759 6.1394 508 19.435 40.441 36.267 11.125 14.796 16.039 509 0.0000 37.791 24.964 7.0010 11.750 9.2765 510 0.0000 43.145 39.064 10.079 15.369 18.127 511 26.502 81.389 44.495 30.998 50.690 27.975 512 58.202 90.934 50.428 48.529 68.308 35.578 513 83.243 54.982 0.0000 39.638 36.895 5.0332 514 100.00 56.572 0.0000 52.937 44.661 5.8318 515 100.00 73.651 24.525 62.053 60.704 15.621 516 100.00 76.769 45.113 66.212 65.007 29.387 517 32.841 53.198 26.422 17.017 24.063 11.828 518 53.621 55.216 34.487 25.778 29.601 16.972 519 81.006 54.639 39.973 41.125 37.108 21.343 520 15.634 9.1875 0.0000 2.3405 2.2920 0.3191 521 29.209 15.290 0.0000 5.5054 4.8488 0.6459 522 33.169 23.047 11.948 8.0999 7.7687 3.6846 523 8.3714 0.0000 13.076 1.3222 0.6173 2.9695 524 20.976 0.0000 15.729 3.1652 1.5499 3.8556 525 41.702 0.0000 25.488 9.1405 4.5450 8.0218 526 81.722 27.059 39.834 33.800 21.782 18.669 527 40.122 0.0000 8.3203 7.5055 3.8317 2.0892 528 64.162 71.801 0.0000 35.658 45.850 6.9710 529 82.942 83.150 0.0000 53.051 64.024 9.5625 530 92.617 90.650 35.308 67.189 77.917 24.641 531 80.754 0.0000 14.791 27.538 14.124 4.7025 532 100.00 0.0000 31.433 43.293 22.086 12.752 533 100.00 19.610 44.860 47.002 26.649 22.789 534 100.00 36.577 56.687 52.448 34.199 34.910 535 100.00 50.335 55.843 56.399 42.366 35.410 536 0.0000 5.7261 10.617 0.8883 1.0835 2.4330 537 0.0000 29.868 40.658 6.9501 8.7571 18.174 538 0.0000 38.413 57.453 11.837 13.946 33.939 539 24.371 41.001 100.00 27.608 21.744 97.353 540 0.0000 8.9951 50.141 5.4247 3.3137 25.043 541 25.838 15.573 52.712 9.9551 6.5957 27.848 542 70.189 26.073 71.218 32.593 20.180 50.359 543 79.237 45.311 72.429 43.138 32.641 53.822 544 42.470 0.0000 67.063 16.120 7.3661 43.440 545 61.209 0.0000 69.061 24.330 11.544 46.326 546 100.00 38.329 71.373 56.203 36.425 52.456 547 100.00 53.599 70.941 60.928 46.048 53.494 548 17.187 3.2512 8.9705 2.4531 1.6069 2.0671 549 22.150 4.5713 26.288 4.5591 2.7132 8.2984 550 45.954 10.709 40.776 13.262 7.7511 17.735 551 53.552 56.068 62.387 30.784 32.124 41.873 552 53.223 72.229 83.953 43.454 48.721 73.735 553 40.490 0.0000 100.00 25.338 10.978 95.395 554 71.316 0.0000 100.00 39.105 18.077 96.040 555 80.794 32.138 100.00 49.185 29.547 97.723 556 8.6973 0.0000 6.3394 1.0499 0.5120 1.3759 557 11.893 21.447 6.0935 3.5778 5.0841 2.0743 558 35.564 38.785 9.5844 12.043 14.857 4.2582 559 51.294 41.775 11.493 18.386 19.349 5.2582 560 63.155 43.639 32.145 26.008 23.900 14.428 561 18.854 17.836 0.0000 3.7727 4.4352 0.6573 562 33.480 25.015 0.0000 8.0235 8.2898 1.1774 563 46.172 24.584 0.0000 11.965 10.209 1.3403 564 44.044 35.628 0.0000 13.528 14.465 2.0792 565 43.281 64.592 0.0000 23.286 34.374 5.4076 566 49.581 81.212 0.0000 34.114 52.584 8.3517 567 61.340 81.516 21.955 40.639 56.075 14.718 568 31.061 61.430 22.807 19.505 30.228 11.208 569 65.621 63.231 80.727 44.138 42.868 67.587 570 67.320 69.641 100.00 54.305 51.791 101.75 571 0.0000 17.813 23.175 2.9260 3.8491 7.1508 572 0.0000 23.880 45.455 6.5310 6.7713 21.573 573 16.680 23.702 73.888 14.206 9.9958 52.957 574 34.768 51.350 100.00 33.379 29.602 98.566 575 46.592 66.637 100.00 43.450 44.071 100.83 576 14.436 0.0000 26.690 3.0132 1.3725 8.3198 577 20.256 31.849 26.744 8.0630 10.153 9.7752 578 24.100 53.735 33.400 15.937 23.715 15.678 579 34.211 71.068 55.054 29.169 41.312 35.842 580 81.525 88.988 62.232 62.756 73.519 48.000 581 26.335 29.216 35.859 9.6797 10.039 14.927 582 34.764 29.695 37.651 12.080 11.396 16.267 583 100.00 65.178 36.196 59.190 52.978 20.829 584 100.00 73.806 56.657 66.687 62.686 39.627 585 80.382 40.694 0.0000 33.019 26.494 3.3745 586 100.00 86.564 0.0000 68.001 74.789 10.853 587 18.985 37.937 0.0000 7.7488 12.355 1.9764 588 38.337 46.839 0.0000 14.845 19.869 3.0529 589 38.385 48.082 11.829 15.758 20.886 5.7812 590 38.793 55.839 37.519 20.957 27.426 18.802 591 51.694 61.540 42.709 28.632 34.739 23.603 592 31.163 28.801 57.512 14.234 11.855 33.472 593 47.998 33.989 60.265 21.235 17.083 37.083 594 58.112 43.301 74.980 31.494 25.650 56.580 595 55.582 50.656 72.192 31.997 29.523 53.488 596 100.00 56.881 85.013 66.088 50.116 74.496 597 100.00 68.213 100.00 76.032 61.973 102.57 598 28.369 11.287 27.783 6.5498 4.5522 9.3020 599 33.276 26.703 46.323 12.348 10.508 22.713 600 35.013 68.639 88.783 36.801 42.490 80.741 601 73.319 100.00 100.00 76.035 90.198 108.01 602 54.897 15.563 7.5956 14.439 9.4689 2.6636 603 85.843 17.235 6.2244 32.200 18.946 3.2696 604 89.821 29.547 18.334 37.777 24.824 7.4183 605 88.425 50.847 26.716 43.348 36.386 12.966 606 91.790 63.931 44.422 53.248 48.949 26.408 607 92.136 67.390 60.104 57.946 53.391 41.980 608 100.00 69.341 84.493 71.398 60.987 75.486 609 55.072 22.800 30.147 17.158 12.215 11.492 610 58.808 35.046 31.630 21.500 18.124 13.249 611 58.611 36.882 49.023 24.305 19.965 26.252 612 9.0175 31.680 26.676 6.5165 9.3010 9.6582 613 14.614 47.792 38.381 12.911 18.997 18.196 614 13.496 63.336 52.789 21.019 31.776 32.200 615 11.386 72.699 55.981 25.820 40.783 36.856 616 73.545 76.779 56.912 49.436 56.123 39.534 617 85.618 80.692 58.160 59.695 64.612 41.946 618 14.196 38.902 8.1007 7.6261 12.633 3.7351 619 29.642 42.033 16.587 11.778 16.019 6.4772 620 47.477 44.992 21.443 18.485 20.752 8.8539 621 70.392 55.926 33.654 34.285 34.404 16.932 622 76.609 64.106 58.028 45.276 44.673 38.717 623 9.5640 19.985 38.147 5.7308 5.5619 15.818 624 14.203 27.219 53.763 9.9852 9.2857 29.387 625 14.252 46.393 56.547 15.408 19.265 33.833 626 20.226 48.725 77.714 22.081 23.260 60.503 627 44.400 43.312 72.047 25.144 22.469 52.294 628 90.731 45.136 71.416 50.837 36.559 52.821 629 41.881 10.819 30.524 10.578 6.5301 10.953 630 62.590 13.556 57.300 23.562 13.165 33.011 631 76.237 12.349 59.260 31.474 17.009 35.429 632 5.7056 15.249 5.9270 2.1100 3.0635 1.7258 633 7.6663 15.052 10.845 2.4722 3.1913 2.8130 634 14.404 22.331 18.826 4.6992 5.7934 5.6674 635 43.593 32.634 48.383 17.072 14.732 25.055 636 48.313 39.993 48.696 20.692 19.333 26.029 637 52.469 43.131 60.537 25.508 22.888 38.280 638 62.764 42.543 61.064 30.181 25.027 39.035 639 12.141 48.617 13.689 10.565 18.462 6.1028 640 11.192 61.584 38.058 17.661 29.186 19.687 641 36.179 60.743 47.027 23.553 31.541 26.780 642 48.643 66.705 56.038 32.008 39.635 36.367 643 61.469 72.494 65.357 42.433 48.965 47.999 644 72.359 75.839 66.367 50.273 55.567 50.087 645 9.5955 5.0563 41.069 4.5579 2.5680 17.410 646 11.133 7.9264 58.030 7.8720 4.2773 32.893 647 13.034 49.117 68.479 18.765 22.022 47.902 648 13.916 60.704 75.141 24.964 31.547 58.286 649 23.015 78.225 86.896 38.333 50.686 79.115 650 48.484 80.024 93.418 48.744 57.301 90.971 651 47.722 21.436 39.450 15.067 10.682 17.236 652 47.233 30.327 38.917 16.443 13.823 17.389 653 54.355 45.396 47.560 24.555 23.703 25.674 654 66.527 57.539 60.034 37.087 36.290 39.701 655 26.128 30.389 23.208 8.5589 9.9761 8.0511 656 36.676 35.159 27.858 12.731 13.689 10.778 657 44.397 42.827 30.462 17.546 19.200 12.996 658 49.197 50.931 41.222 23.290 25.887 21.040 659 27.724 37.586 36.321 11.982 14.098 15.895 660 35.705 43.184 48.444 17.357 18.973 25.913 661 50.367 5.1104 9.6054 11.645 6.5625 2.6831 662 57.977 16.094 15.598 16.288 10.473 4.8441 663 80.259 27.229 23.834 31.074 20.632 9.2022 664 91.055 35.358 30.973 41.131 28.368 13.814 665 100.00 41.893 85.636 61.179 39.991 73.802 666 75.033 13.332 72.514 33.911 18.064 51.610 667 89.911 12.207 80.460 45.989 23.867 63.420 668 10.749 4.4795 22.106 2.5236 1.6952 6.2939 669 34.242 8.8847 38.070 8.9980 5.3564 15.553 670 33.701 28.430 87.297 22.464 15.104 73.742 671 34.757 37.465 86.258 24.496 19.257 72.738 672 51.747 48.228 86.574 33.606 28.655 74.586 673 89.999 71.021 87.626 65.312 58.961 80.494 674 15.129 16.100 60.377 9.6745 6.3721 35.748 675 49.708 24.114 76.536 23.813 14.973 57.117 676 65.100 25.535 100.00 38.581 22.098 96.844 677 36.928 6.6856 80.974 18.555 8.9879 62.770 678 42.239 18.529 86.000 22.969 12.931 71.178 679 59.771 43.748 88.496 36.359 27.901 77.469 680 72.288 47.877 90.654 45.002 34.208 81.886 681 12.398 9.0728 87.987 15.867 7.6386 73.791 682 13.811 40.398 90.533 22.435 19.205 79.972 683 91.050 77.764 10.151 56.194 61.046 10.980 684 91.868 90.106 13.418 64.334 76.147 14.326 685 52.203 60.265 13.281 25.361 32.593 7.9336 686 64.327 67.761 35.252 36.271 42.951 19.484 687 14.760 16.493 7.2661 3.2828 3.8887 2.1050 688 21.131 19.581 13.600 4.9887 5.3556 3.8410 689 21.516 25.247 13.238 5.9560 7.2196 4.0465 690 27.698 48.300 10.277 12.927 19.542 5.2783 691 49.338 49.097 10.564 19.849 23.506 5.7493 692 54.961 73.241 8.0826 32.334 45.187 8.7135 693 63.354 90.504 13.465 46.574 67.370 13.581 694 83.020 94.155 14.649 60.715 78.240 15.287 695 11.981 22.297 0.0000 3.4786 5.2615 0.8322 696 11.653 22.649 13.412 4.0728 5.5860 3.8794 697 21.010 44.258 21.091 10.964 16.542 8.2938 698 19.708 77.041 28.944 25.269 44.355 16.610 699 84.671 89.419 45.139 61.971 73.891 31.346 700 39.493 56.927 8.1397 19.137 27.402 5.9867 701 44.055 77.384 13.351 30.488 47.464 10.553 702 69.280 92.058 30.185 52.089 71.566 21.128 703 19.403 55.097 8.7873 13.668 23.527 5.6664 704 34.620 91.529 10.924 35.905 62.875 12.591 705 37.413 90.539 60.372 42.294 64.490 45.242 706 44.223 92.643 72.908 48.823 69.566 61.294 707 64.907 91.823 72.253 57.109 73.053 60.649 708 20.738 61.744 45.241 20.129 30.440 25.247 709 23.585 83.344 67.301 35.991 54.445 51.775 710 38.627 84.633 75.665 42.640 58.770 63.343 711 49.361 92.155 86.983 54.424 71.510 82.430 712 21.592 12.771 6.2290 3.8860 3.5652 1.7930 713 25.540 20.293 6.1291 5.6062 5.8689 2.1264 714 33.011 28.978 18.482 9.5443 10.091 6.1147 715 76.924 60.199 79.804 49.084 43.522 66.067 716 82.807 63.155 92.144 57.992 49.552 86.744 717 85.810 72.298 100.00 67.132 60.365 102.73 718 72.700 22.326 53.555 29.529 18.086 29.852 719 87.394 26.777 60.824 41.355 25.173 38.205 720 61.228 10.003 44.810 20.315 11.223 21.176 721 61.299 26.288 49.104 23.277 15.975 25.608 722 69.339 33.773 62.313 31.633 22.318 39.850 723 17.841 60.074 26.957 16.640 27.860 12.848 724 40.660 65.041 36.379 25.257 35.386 19.342 725 5.9391 13.241 17.175 2.4679 2.8446 4.6245 726 24.667 17.312 23.434 6.0365 5.3516 7.3918 727 35.185 22.027 36.702 10.668 8.5943 15.156 728 68.072 10.024 8.7994 20.390 11.667 3.0263 729 88.356 8.3101 12.144 33.320 18.100 4.4027 730 91.005 10.824 27.731 36.656 20.011 10.673 731 57.565 15.096 23.150 16.524 10.352 7.6787 732 59.034 45.063 40.386 25.471 24.148 19.968 733 58.383 53.098 46.507 28.805 29.791 25.723 734 64.654 55.631 67.332 36.985 34.941 47.997 735 18.102 6.1872 72.782 12.057 5.8376 50.761 736 26.912 15.909 72.691 14.624 8.5558 51.027 737 26.064 17.801 90.104 19.752 10.975 77.792 738 34.902 62.514 90.974 34.683 37.163 83.550 739 51.193 68.746 90.583 42.975 45.682 84.085 740 52.188 7.1578 28.843 13.941 7.8271 10.103 741 65.155 11.154 32.181 20.718 11.785 12.390 742 19.405 5.5318 0.0000 2.6253 2.0059 0.2489 743 21.449 4.9469 51.910 7.9558 4.1048 26.708 744 37.328 10.628 63.284 14.484 7.8980 39.092 745 49.678 68.706 69.000 36.200 42.872 51.670 746 62.001 71.705 74.462 44.545 49.201 59.716 747 78.352 48.756 11.091 34.643 30.962 6.5402 748 90.286 60.946 14.610 47.695 44.526 9.4538 749 89.266 68.785 12.656 50.371 51.173 10.027 750 88.194 68.386 32.439 51.029 51.040 18.523 751 71.937 37.228 8.8009 27.217 22.080 4.6768 752 79.804 39.621 21.360 33.449 26.147 9.0737 753 67.690 49.181 9.3035 28.402 27.965 5.8617 754 69.788 64.777 9.6628 35.728 40.868 8.0483 755 84.245 76.230 24.257 51.389 57.225 15.387 756 37.182 12.425 12.374 7.8250 5.5119 3.3775 757 43.673 12.415 23.793 10.692 6.8984 7.6061 758 87.295 48.788 49.451 44.847 35.761 28.603 759 88.516 51.169 86.943 55.585 41.469 76.506 760 50.254 10.713 54.238 17.127 9.4877 29.518 761 55.917 24.178 56.429 21.725 14.457 32.451 762 57.125 32.092 68.798 26.550 18.954 47.304 763 76.993 53.226 69.805 43.737 37.012 51.174 764 63.853 5.7816 18.969 18.382 10.053 5.8235 765 78.724 15.310 21.982 28.075 16.357 7.7266 766 8.5354 5.1640 0.0000 1.1911 1.2236 0.1734 767 8.5261 9.4726 4.1393 1.7012 1.9794 1.1627 768 10.441 20.720 86.951 16.689 10.131 72.518 769 17.277 30.773 87.985 19.730 14.389 74.887 770 61.697 31.314 91.018 34.889 22.266 80.740 771 64.046 42.389 100.00 42.008 29.761 98.142 772 87.986 24.986 32.104 36.806 22.877 13.638 773 88.376 77.900 38.714 56.826 61.190 24.260 774 63.633 70.751 19.922 35.858 45.061 12.022 775 72.018 80.772 46.349 48.861 59.342 30.237 776 80.675 86.209 74.091 63.307 70.896 62.404 777 90.507 90.901 82.460 75.512 81.322 76.006 778 22.767 29.126 45.716 10.338 10.189 22.248 779 25.515 35.638 62.824 15.588 14.697 39.812 780 39.066 47.229 66.273 23.188 23.434 45.198 781 11.592 38.293 42.309 10.275 13.397 20.142 782 35.674 47.657 45.221 18.221 21.554 23.616 783 66.389 50.283 72.636 37.255 32.029 54.291 784 7.1685 3.0754 11.133 1.3589 1.0105 2.5231 785 8.2875 9.0303 15.115 2.1483 2.0955 3.8192 786 7.9685 17.744 26.538 3.9475 4.3274 8.7651 787 18.150 19.178 27.335 5.4751 5.3998 9.2927 788 10.646 5.2873 8.7974 1.7655 1.4934 2.0431 789 20.094 9.1726 14.785 3.6846 2.9077 3.7919 790 23.670 42.869 62.537 17.108 18.391 40.114 791 44.139 53.629 64.684 26.721 28.599 44.090 792 43.661 61.805 76.578 32.789 36.232 60.807 793 75.141 74.459 81.722 55.239 56.579 71.164 794 84.627 79.666 91.279 67.218 66.610 88.047 795 71.399 13.597 43.110 25.836 14.631 20.183 796 72.172 28.595 46.760 29.169 19.720 23.975 797 87.253 33.319 51.118 40.732 27.110 28.677 798 86.609 65.684 75.261 56.700 51.154 60.568 799 61.556 69.464 55.619 38.908 45.150 36.639 800 65.230 81.086 59.703 47.753 58.752 43.111 801 72.228 81.747 79.157 56.780 63.421 68.540 802 76.875 29.202 8.4132 28.330 19.910 4.1150 803 88.938 39.517 12.758 39.171 29.121 6.3889 804 90.619 49.049 11.716 43.266 35.551 7.1328 805 1.7670 7.9615 5.6687 1.0217 1.4394 1.4163 806 0.0000 59.605 16.080 13.650 26.129 8.1609 807 14.071 67.413 16.023 18.493 33.744 9.3572 808 21.560 78.863 12.313 25.321 46.016 10.256 809 73.665 78.776 13.991 45.239 56.205 11.650 810 74.033 81.501 32.422 48.561 60.030 20.378 811 66.874 23.716 11.875 21.649 14.923 4.3323 812 67.399 45.937 51.215 31.706 27.570 29.331 813 35.864 74.049 33.623 27.843 43.262 18.962 814 41.853 79.209 52.007 35.215 50.882 34.392 815 55.778 80.051 63.746 43.463 55.563 47.304 816 15.036 91.347 50.535 36.107 62.301 35.172 817 16.512 93.525 73.345 42.715 67.277 61.767 818 40.504 100.00 87.756 56.935 80.831 85.370 819 89.084 5.5708 64.453 40.701 20.768 41.569 820 89.303 20.763 69.297 43.656 24.615 48.133 821 10.877 31.037 9.9723 5.4055 8.6542 3.5009 822 34.271 36.910 19.479 11.769 13.923 7.1101 823 44.176 54.974 24.812 21.006 27.121 11.434 824 58.310 56.936 26.080 27.639 31.655 12.565 825 60.248 59.633 45.443 32.065 35.272 25.719 826 13.824 63.397 61.543 22.835 32.550 41.413 827 18.945 66.026 72.171 27.264 36.303 55.018 828 87.907 79.814 74.508 64.646 65.984 61.961 829 40.743 24.081 7.2046 10.294 9.1843 2.7446 830 53.060 34.290 7.5532 16.983 15.731 3.7294 831 54.938 36.891 20.036 19.130 17.707 7.6682 832 55.652 46.720 30.326 23.205 23.899 13.530 833 40.000 47.457 28.569 17.315 21.238 12.368 834 42.013 53.391 44.483 22.060 26.510 23.769 835 43.438 53.055 54.726 24.186 27.219 33.054 836 52.963 57.392 73.861 33.809 34.136 56.546 837 66.871 59.842 89.410 46.008 41.377 81.098 838 5.6310 20.213 20.045 3.5332 4.6944 5.9815 839 16.343 23.955 26.605 5.8812 6.7294 9.1597 840 28.866 68.576 40.626 24.199 37.219 22.735 841 49.921 71.098 49.585 33.438 43.650 30.847 842 73.759 68.227 52.602 44.392 47.160 33.758 843 91.991 76.036 54.186 61.001 61.553 37.205 844 91.188 89.598 56.421 68.793 77.349 42.102 845 0.0000 18.666 65.968 9.7119 6.7497 42.315 846 9.5971 28.395 69.322 13.040 10.814 47.114 847 19.224 37.454 76.994 18.371 16.407 58.337 848 38.121 46.208 85.700 27.818 24.728 72.716 849 38.008 55.914 91.299 32.985 32.256 83.254 850 64.143 70.273 90.814 49.754 50.271 85.012 851 69.976 79.511 91.203 57.895 61.677 87.455 852 8.7694 8.6141 20.599 2.5311 2.1981 5.7706 853 15.652 8.5711 35.450 4.8162 3.2002 13.598 854 30.314 88.603 37.300 35.212 59.453 24.083 855 41.906 90.277 47.703 41.155 63.928 32.685 856 76.577 91.134 71.324 63.089 75.494 59.569 857 92.268 91.383 72.380 74.378 81.526 61.546 858 26.387 27.262 7.4449 7.0263 8.3583 2.8084 859 40.092 32.708 10.209 11.931 12.568 3.9686 860 67.990 43.915 16.186 27.243 24.822 7.2284 861 83.176 57.625 28.114 42.328 39.611 14.357 862 24.517 7.5331 40.034 6.8501 4.0589 16.814 863 35.684 7.6027 49.955 11.116 6.0871 25.108 864 57.157 14.111 67.888 23.348 12.878 45.150 865 67.026 33.082 81.306 35.030 23.274 65.164 866 81.377 40.546 87.438 47.415 32.262 75.971 867 18.984 13.833 29.154 5.1143 4.1887 10.033 868 25.246 16.519 40.368 7.9525 5.9679 17.369 869 80.924 16.078 40.737 31.672 18.111 18.736 870 91.258 23.222 51.863 41.805 24.669 28.851 871 22.590 7.2375 6.9398 3.6024 2.6787 1.7867 872 30.041 7.3989 13.779 5.5332 3.6571 3.5373 873 29.911 13.052 21.807 6.5591 4.8846 6.5719 874 9.6705 59.548 89.760 28.308 32.057 80.825 875 12.160 74.705 90.926 36.061 46.551 85.206 876 22.268 80.489 100.00 43.898 54.927 102.90 877 16.106 47.171 88.697 24.193 23.209 77.540 878 77.038 70.549 88.822 56.596 54.076 82.001 879 73.926 0.0000 23.884 23.903 12.174 7.9700 880 74.745 15.190 30.481 26.377 15.368 11.803 881 77.748 35.652 35.346 32.506 23.969 16.080 882 77.604 68.856 68.205 50.355 50.300 51.350 883 79.138 92.482 100.00 74.428 81.635 106.45 884 88.469 100.00 100.00 86.042 95.357 108.48 885 37.453 21.836 53.729 13.970 9.9423 29.270 886 90.439 45.349 59.000 47.838 35.441 37.843 887 91.003 76.129 64.023 62.338 62.081 47.893 888 93.361 82.158 83.427 72.580 71.779 75.824 889 29.184 48.042 38.587 15.696 20.552 18.494 890 29.844 57.892 69.255 25.228 30.142 50.116 891 32.886 71.555 83.157 35.917 44.358 72.041 892 40.562 86.278 88.820 48.120 62.631 84.096 893 74.489 85.950 89.294 63.687 70.343 85.561 894 86.032 89.419 94.636 75.192 79.290 95.998 895 31.139 4.2972 6.7463 5.2314 3.1728 1.7549 896 42.039 10.426 6.2100 8.8877 5.8018 1.9574 897 53.450 47.209 0.0000 20.473 22.949 3.3509 898 58.694 73.425 31.154 35.821 46.928 17.778 899 0.0000 59.327 84.023 25.533 30.698 71.312 900 17.623 65.070 87.210 30.896 37.033 77.388 901 18.956 91.951 100.00 50.358 68.703 105.22 902 19.353 87.290 88.845 43.618 61.239 84.105 903 89.596 100.00 90.912 83.718 94.523 91.932 904 9.8292 72.379 38.796 22.659 39.239 21.881 905 13.128 86.444 57.223 34.002 56.451 40.734 906 56.427 87.800 59.905 47.540 64.617 44.475 907 65.231 56.991 17.432 30.393 33.187 9.0993 908 66.902 62.243 39.773 35.722 38.893 21.826 909 80.223 66.992 41.493 46.038 47.353 24.189 910 32.580 24.258 20.354 8.6797 8.3117 6.5306 911 33.739 24.885 29.320 9.8978 9.0102 10.801 912 48.244 27.853 31.090 15.364 12.629 12.199 913 80.025 29.068 68.828 38.576 24.197 47.720 914 88.210 35.357 80.801 48.805 31.194 65.201 915 90.590 8.6791 37.046 37.214 19.896 16.171 916 100.00 20.977 62.051 50.408 28.338 39.724 917 32.170 69.469 15.899 22.952 37.504 9.8077 918 43.925 74.394 67.284 36.503 47.308 50.350 919 58.705 88.635 77.908 53.490 67.960 67.758 920 65.768 88.737 85.170 59.192 70.750 79.093 921 0.0000 23.086 18.057 3.3268 5.2751 5.3591 922 10.396 28.828 32.930 6.7116 8.4315 12.928 923 10.649 32.026 51.457 10.136 10.891 27.475 924 10.916 38.428 66.254 14.771 15.245 44.037 925 47.533 27.632 18.931 13.957 11.966 6.4112 926 60.290 27.339 22.569 19.656 14.788 8.1171 927 61.017 31.106 40.758 22.806 17.322 19.066 928 90.243 39.465 43.481 43.207 30.824 22.686 929 57.559 28.167 10.038 17.737 14.130 3.9240 930 66.678 34.619 21.384 24.385 19.571 8.2917 931 82.296 88.448 25.804 57.333 70.861 18.435 932 17.991 22.358 56.734 10.241 8.0767 32.140 933 35.185 23.807 68.339 16.762 11.502 45.800 934 46.436 34.759 72.912 23.797 18.333 52.729 935 13.280 5.6627 4.0383 1.9104 1.6345 1.0642 936 16.494 10.998 8.9721 2.9863 2.8254 2.2746 937 25.575 15.277 14.935 5.3569 4.6934 4.0950 938 26.424 23.931 36.245 8.7541 8.0814 14.853 939 6.1714 6.0100 27.754 2.7130 1.9146 8.9799 940 6.8534 12.401 30.799 3.6464 3.1841 10.828 941 8.4300 12.275 43.072 5.3559 3.8634 19.153 942 25.377 46.739 49.212 16.047 19.915 26.846 943 29.912 66.203 60.114 26.748 36.483 40.371 944 82.512 78.174 66.895 58.059 61.449 51.462 945 61.845 48.500 21.624 25.885 26.241 9.5989 946 65.316 53.516 41.580 31.637 31.567 21.966 947 79.069 55.397 49.332 41.601 37.613 29.024 948 8.3084 10.691 0.0000 1.6244 2.1216 0.3239 949 30.059 11.765 4.5537 5.5054 4.2557 1.4888 950 34.613 17.921 12.016 7.7248 6.4319 3.4643 951 48.695 20.008 19.120 13.113 9.5973 6.0688 952 47.670 61.785 68.030 32.045 36.089 49.350 953 62.073 62.099 71.668 39.374 39.965 54.417 954 61.916 69.527 80.471 45.083 47.689 68.082 955 88.380 77.195 84.961 66.510 64.447 77.156 956 74.932 41.654 32.964 32.075 26.153 15.033 957 89.410 45.558 32.802 42.955 33.504 15.781 958 89.480 53.206 44.770 47.223 39.379 25.160 959 84.676 25.274 0.0000 32.381 20.918 2.3321 960 100.00 36.192 11.631 46.906 31.828 6.2002 961 100.00 60.343 18.922 55.386 48.083 11.197 962 51.877 0.0000 85.642 24.688 11.201 70.177 963 63.608 11.313 87.898 31.723 16.119 74.444 964 81.738 15.156 87.657 42.726 22.416 74.681 965 82.989 15.077 100.00 47.756 24.510 96.826 966 75.026 55.892 63.003 41.939 37.760 43.083 967 88.558 61.967 62.758 53.410 47.361 44.048 968 88.582 100.00 76.637 78.688 92.425 69.321 969 0.0000 41.954 15.469 7.4313 13.752 5.9023 970 0.0000 51.679 37.188 12.615 20.839 17.744 971 27.598 55.382 49.099 19.549 26.238 27.781 972 53.545 60.083 51.472 30.225 34.483 30.985 973 22.744 35.883 42.327 11.341 13.031 20.029 974 37.739 37.617 47.414 16.231 16.114 24.521 975 38.202 37.985 57.660 18.341 17.128 34.430 976 82.217 38.307 59.006 39.983 28.381 36.900 977 73.167 38.987 45.647 32.011 24.820 23.873 978 82.685 51.652 57.513 44.127 36.687 36.692 979 89.409 57.099 68.908 53.449 44.236 50.908 980 12.326 51.216 48.589 15.332 21.800 26.693 981 11.972 53.369 57.789 17.771 24.012 35.924 982 13.133 73.298 74.335 30.538 43.185 59.117 983 34.132 75.951 75.848 36.456 48.256 61.899 984 49.106 78.593 81.069 44.306 54.271 70.297 985 51.576 77.808 41.897 36.395 50.529 25.616 986 69.950 88.978 43.357 52.161 68.448 29.377 987 70.428 88.983 55.740 54.568 69.446 40.627 988 79.205 92.095 86.515 69.659 79.323 82.371 989 18.216 40.309 29.142 10.075 14.294 11.715 990 31.024 42.189 29.655 13.259 16.723 12.295 991 37.272 43.688 36.919 16.253 18.826 16.982 992 42.957 55.304 79.814 30.813 31.195 64.665 993 53.785 58.425 88.678 38.877 36.866 79.372 994 17.149 5.7795 17.201 3.0924 2.1833 4.4730 995 30.647 5.2203 20.047 5.9166 3.5508 5.6359 996 42.046 33.450 33.929 14.665 14.007 14.198 997 48.401 42.598 36.902 19.712 20.129 17.040 998 47.812 47.050 57.152 24.172 24.084 34.931 999 52.065 61.505 59.260 31.707 35.963 39.074 1000 86.328 100.00 59.851 73.027 89.974 47.967 1001 15.462 90.614 18.186 31.780 59.813 14.433 1002 8.9867 88.585 35.159 31.337 57.469 22.486 1003 0.0000 87.825 80.237 39.164 59.739 70.367 1004 22.972 89.546 82.345 43.688 63.618 74.087 1005 62.075 90.979 93.859 61.544 73.776 94.260 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.04550 100.0000 108.9050 1 0.000000 41.07760 100.0000 24.53450 20.19130 97.21560 2 100.0000 0.000000 73.78150 51.08760 25.20370 53.80410 3 0.000000 0.000000 50.83730 4.831900 1.932640 25.44790 4 100.0000 60.58910 0.000000 54.56680 47.92080 6.375060 5 0.000000 28.22220 0.000000 3.400830 6.801590 1.133540 6 76.48600 0.000000 0.000000 24.15250 12.45410 1.131850 7 1.784270 1.568810 1.248150 0.338157 0.353794 0.312873 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.0455 100.000 108.905 1 0.00000 100.000 100.000 53.8070 78.7357 106.972 2 100.000 0.00000 100.000 59.2867 28.4832 96.9861 3 0.00000 0.00000 100.000 18.0482 7.21883 95.0536 4 100.000 100.000 0.00000 76.9973 92.7812 13.8514 5 0.00000 100.000 0.00000 35.7588 71.5168 11.9189 6 100.000 0.00000 0.00000 41.2385 21.2643 1.93254 7 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 8 50.0000 50.0000 50.0000 24.6725 25.9586 28.2703 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_xl.ti10000644000076500000000000006101312665102037020630 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "200" CREATED "Sun Oct 20 16:10:47 2013" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "21" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 490 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.3704 1.3897 1.4245 5 7.5000 7.5000 7.5000 1.6184 1.6506 1.7087 6 10.000 10.000 10.000 1.9432 1.9923 2.0809 7 12.500 12.500 12.500 2.3504 2.4206 2.5475 8 15.000 15.000 15.000 2.8451 2.9411 3.1145 9 17.500 17.500 17.500 3.4320 3.5584 3.7870 10 20.000 20.000 20.000 4.1154 4.2774 4.5702 11 22.500 22.500 22.500 4.8994 5.1021 5.4686 12 25.000 25.000 25.000 5.7878 6.0367 6.4867 13 27.500 27.500 27.500 6.7843 7.0850 7.6286 14 30.000 30.000 30.000 7.8923 8.2507 8.8984 15 32.500 32.500 32.500 9.1151 9.5371 10.300 16 35.000 35.000 35.000 10.456 10.948 11.836 17 37.500 37.500 37.500 11.918 12.486 13.512 18 40.000 40.000 40.000 13.504 14.154 15.329 19 42.500 42.500 42.500 15.216 15.956 17.292 20 45.000 45.000 45.000 17.059 17.894 19.403 21 47.500 47.500 47.500 19.033 19.971 21.666 22 50.000 50.000 50.000 21.143 22.190 24.083 23 52.500 52.500 52.500 23.389 24.554 26.658 24 55.000 55.000 55.000 25.776 27.064 29.392 25 57.500 57.500 57.500 28.304 29.724 32.290 26 60.000 60.000 60.000 30.977 32.536 35.353 27 62.500 62.500 62.500 33.797 35.503 38.585 28 65.000 65.000 65.000 36.766 38.626 41.987 29 67.500 67.500 67.500 39.886 41.908 45.562 30 70.000 70.000 70.000 43.159 45.351 49.313 31 72.500 72.500 72.500 46.587 48.957 53.242 32 75.000 75.000 75.000 50.173 52.730 57.351 33 77.500 77.500 77.500 53.918 56.669 61.643 34 80.000 80.000 80.000 57.824 60.779 66.119 35 82.500 82.500 82.500 61.894 65.060 70.783 36 85.000 85.000 85.000 66.128 69.515 75.636 37 87.500 87.500 87.500 70.530 74.146 80.680 38 90.000 90.000 90.000 75.101 78.954 85.918 39 92.500 92.500 92.500 79.842 83.941 91.351 40 95.000 95.000 95.000 84.755 89.111 96.982 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 1.1607 1.0829 1.0075 43 10.000 0.0000 0.0000 1.4092 1.2110 1.0192 44 15.000 0.0000 0.0000 1.8005 1.4128 1.0375 45 20.000 0.0000 0.0000 2.3517 1.6969 1.0633 46 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 47 30.000 0.0000 0.0000 3.9904 2.5418 1.1401 48 35.000 0.0000 0.0000 5.1027 3.1154 1.1922 49 40.000 0.0000 0.0000 6.4250 3.7972 1.2542 50 45.000 0.0000 0.0000 7.9675 4.5924 1.3265 51 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 52 55.000 0.0000 0.0000 11.749 6.5425 1.5037 53 60.000 0.0000 0.0000 14.006 7.7061 1.6095 54 65.000 0.0000 0.0000 16.518 9.0010 1.7271 55 70.000 0.0000 0.0000 19.291 10.431 1.8571 56 75.000 0.0000 0.0000 22.335 12.000 1.9997 57 80.000 0.0000 0.0000 25.654 13.712 2.1553 58 85.000 0.0000 0.0000 29.257 15.570 2.3241 59 90.000 0.0000 0.0000 33.150 17.577 2.5065 60 95.000 0.0000 0.0000 37.339 19.737 2.7028 61 100.00 0.0000 0.0000 41.830 22.052 2.9132 62 0.0000 5.0000 0.0000 1.1394 1.2787 1.0465 63 0.0000 10.000 0.0000 1.3549 1.7096 1.1183 64 0.0000 15.000 0.0000 1.6942 2.3882 1.2314 65 0.0000 20.000 0.0000 2.1721 3.3438 1.3907 66 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 67 0.0000 30.000 0.0000 3.5930 6.1854 1.8644 68 0.0000 35.000 0.0000 4.5576 8.1141 2.1859 69 0.0000 40.000 0.0000 5.7042 10.407 2.5681 70 0.0000 45.000 0.0000 7.0417 13.082 3.0139 71 0.0000 50.000 0.0000 8.5782 16.154 3.5261 72 0.0000 55.000 0.0000 10.321 19.640 4.1071 73 0.0000 60.000 0.0000 12.278 23.553 4.7594 74 0.0000 65.000 0.0000 14.456 27.908 5.4854 75 0.0000 70.000 0.0000 16.861 32.718 6.2871 76 0.0000 75.000 0.0000 19.500 37.995 7.1667 77 0.0000 80.000 0.0000 22.379 43.751 8.1263 78 0.0000 85.000 0.0000 25.503 49.999 9.1677 79 0.0000 90.000 0.0000 28.878 56.749 10.293 80 0.0000 95.000 0.0000 32.511 64.013 11.504 81 0.0000 100.00 0.0000 36.405 71.801 12.802 82 0.0000 0.0000 5.0000 1.0703 1.0281 1.3705 83 0.0000 0.0000 10.000 1.1791 1.0716 1.9434 84 0.0000 0.0000 15.000 1.3504 1.1401 2.8456 85 0.0000 0.0000 20.000 1.5916 1.2366 4.1161 86 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 87 0.0000 0.0000 30.000 2.3089 1.5235 7.8939 88 0.0000 0.0000 35.000 2.7957 1.7182 10.458 89 0.0000 0.0000 40.000 3.3745 1.9497 13.507 90 0.0000 0.0000 45.000 4.0496 2.2197 17.063 91 0.0000 0.0000 50.000 4.8252 2.5298 21.147 92 0.0000 0.0000 55.000 5.7050 2.8817 25.782 93 0.0000 0.0000 60.000 6.6928 3.2768 30.984 94 0.0000 0.0000 65.000 7.7920 3.7164 36.774 95 0.0000 0.0000 70.000 9.0060 4.2019 43.169 96 0.0000 0.0000 75.000 10.338 4.7346 50.184 97 0.0000 0.0000 80.000 11.791 5.3157 57.838 98 0.0000 0.0000 85.000 13.368 5.9464 66.144 99 0.0000 0.0000 90.000 15.072 6.6279 75.118 100 0.0000 0.0000 95.000 16.905 7.3611 84.775 101 0.0000 0.0000 100.00 18.871 8.1473 95.129 102 0.0000 5.0000 5.0000 1.2097 1.3068 1.4169 103 0.0000 10.000 10.000 1.5340 1.7813 2.0617 104 0.0000 15.000 15.000 2.0446 2.5283 3.0769 105 0.0000 20.000 20.000 2.7637 3.5804 4.5068 106 0.0000 25.000 25.000 3.7105 4.9657 6.3893 107 0.0000 30.000 30.000 4.9019 6.7088 8.7583 108 0.0000 35.000 35.000 6.3533 8.8323 11.644 109 0.0000 40.000 40.000 8.0787 11.357 15.075 110 0.0000 45.000 45.000 10.091 14.301 19.077 111 0.0000 50.000 50.000 12.403 17.684 23.674 112 0.0000 55.000 55.000 15.026 21.522 28.889 113 0.0000 60.000 60.000 17.971 25.830 34.744 114 0.0000 65.000 65.000 21.248 30.625 41.260 115 0.0000 70.000 70.000 24.867 35.920 48.456 116 0.0000 75.000 75.000 28.838 41.729 56.351 117 0.0000 80.000 80.000 33.170 48.067 64.964 118 0.0000 85.000 85.000 37.871 54.945 74.312 119 0.0000 90.000 90.000 42.950 62.377 84.411 120 0.0000 95.000 95.000 48.416 70.374 95.279 121 0.0000 100.00 100.00 54.276 78.948 106.93 122 5.0000 0.0000 5.0000 1.2310 1.1110 1.3780 123 10.000 0.0000 10.000 1.5884 1.2826 1.9626 124 15.000 0.0000 15.000 2.1509 1.5529 2.8831 125 20.000 0.0000 20.000 2.9433 1.9335 4.1795 126 25.000 0.0000 25.000 3.9865 2.4347 5.8863 127 30.000 0.0000 30.000 5.2992 3.0653 8.0340 128 35.000 0.0000 35.000 6.8984 3.8335 10.650 129 40.000 0.0000 40.000 8.7995 4.7468 13.761 130 45.000 0.0000 45.000 11.017 5.8121 17.389 131 50.000 0.0000 50.000 13.564 7.0358 21.557 132 55.000 0.0000 55.000 16.454 8.4242 26.285 133 60.000 0.0000 60.000 19.699 9.9829 31.594 134 65.000 0.0000 65.000 23.310 11.717 37.501 135 70.000 0.0000 70.000 27.297 13.633 44.026 136 75.000 0.0000 75.000 31.673 15.735 51.184 137 80.000 0.0000 80.000 36.445 18.028 58.993 138 85.000 0.0000 85.000 41.625 20.516 67.468 139 90.000 0.0000 90.000 47.222 23.205 76.625 140 95.000 0.0000 95.000 53.244 26.098 86.478 141 100.00 0.0000 100.00 59.701 29.199 97.042 142 5.0000 5.0000 0.0000 1.3001 1.3615 1.0540 143 10.000 10.000 0.0000 1.7641 1.9206 1.1375 144 15.000 15.000 0.0000 2.4947 2.8009 1.2689 145 20.000 20.000 0.0000 3.5238 4.0408 1.4540 146 25.000 25.000 0.0000 4.8786 5.6731 1.6978 147 30.000 30.000 0.0000 6.5834 7.7272 2.0045 148 35.000 35.000 0.0000 8.6602 10.229 2.3781 149 40.000 40.000 0.0000 11.129 13.204 2.8223 150 45.000 45.000 0.0000 14.009 16.674 3.3404 151 50.000 50.000 0.0000 17.318 20.660 3.9356 152 55.000 55.000 0.0000 21.071 25.182 4.6108 153 60.000 60.000 0.0000 25.285 30.259 5.3689 154 65.000 65.000 0.0000 29.974 35.909 6.2125 155 70.000 70.000 0.0000 35.153 42.149 7.1442 156 75.000 75.000 0.0000 40.835 48.995 8.1664 157 80.000 80.000 0.0000 47.033 56.463 9.2815 158 85.000 85.000 0.0000 53.760 64.569 10.492 159 90.000 90.000 0.0000 61.029 73.326 11.799 160 95.000 95.000 0.0000 68.850 82.749 13.206 161 100.00 100.00 0.0000 77.235 92.853 14.715 162 100.00 5.0000 5.0000 42.040 22.359 3.3302 163 100.00 10.000 10.000 42.364 22.833 3.9750 164 100.00 15.000 15.000 42.875 23.580 4.9902 165 100.00 20.000 20.000 43.594 24.633 6.4200 166 100.00 25.000 25.000 44.541 26.018 8.3026 167 100.00 30.000 30.000 45.732 27.761 10.671 168 100.00 35.000 35.000 47.183 29.884 13.557 169 100.00 40.000 40.000 48.909 32.409 16.988 170 100.00 45.000 45.000 50.922 35.354 20.990 171 100.00 50.000 50.000 53.233 38.736 25.587 172 100.00 55.000 55.000 55.856 42.574 30.802 173 100.00 60.000 60.000 58.801 46.882 36.657 174 100.00 65.000 65.000 62.078 51.677 43.173 175 100.00 70.000 70.000 65.697 56.972 50.369 176 100.00 75.000 75.000 69.668 62.782 58.264 177 100.00 80.000 80.000 74.000 69.119 66.877 178 100.00 85.000 85.000 78.701 75.998 76.225 179 100.00 90.000 90.000 83.781 83.429 86.324 180 100.00 95.000 95.000 89.246 91.426 97.192 181 5.0000 100.00 5.0000 36.636 71.912 13.180 182 10.000 100.00 10.000 36.994 72.083 13.764 183 15.000 100.00 15.000 37.556 72.353 14.685 184 20.000 100.00 20.000 38.349 72.734 15.981 185 25.000 100.00 25.000 39.392 73.235 17.688 186 30.000 100.00 30.000 40.704 73.866 19.836 187 35.000 100.00 35.000 42.304 74.634 22.452 188 40.000 100.00 40.000 44.205 75.547 25.563 189 45.000 100.00 45.000 46.422 76.613 29.191 190 50.000 100.00 50.000 48.970 77.836 33.359 191 55.000 100.00 55.000 51.860 79.225 38.087 192 60.000 100.00 60.000 55.104 80.783 43.396 193 65.000 100.00 65.000 58.715 82.518 49.303 194 70.000 100.00 70.000 62.703 84.434 55.828 195 75.000 100.00 75.000 67.078 86.535 62.986 196 80.000 100.00 80.000 71.851 88.828 70.795 197 85.000 100.00 85.000 77.031 91.317 79.270 198 90.000 100.00 90.000 82.627 94.005 88.427 199 95.000 100.00 95.000 88.650 96.898 98.280 200 5.0000 5.0000 100.00 19.171 8.5088 95.183 201 10.000 10.000 100.00 19.635 9.0679 95.266 202 15.000 15.000 100.00 20.366 9.9482 95.398 203 20.000 20.000 100.00 21.395 11.188 95.583 204 25.000 25.000 100.00 22.750 12.820 95.827 205 30.000 30.000 100.00 24.455 14.875 96.133 206 35.000 35.000 100.00 26.531 17.377 96.507 207 40.000 40.000 100.00 29.000 20.352 96.951 208 45.000 45.000 100.00 31.880 23.822 97.469 209 50.000 50.000 100.00 35.189 27.808 98.065 210 55.000 55.000 100.00 38.942 32.330 98.740 211 60.000 60.000 100.00 43.156 37.407 99.498 212 65.000 65.000 100.00 47.845 43.057 100.34 213 70.000 70.000 100.00 53.024 49.296 101.27 214 75.000 75.000 100.00 58.706 56.142 102.30 215 80.000 80.000 100.00 64.904 63.610 103.41 216 85.000 85.000 100.00 71.631 71.716 104.62 217 90.000 90.000 100.00 78.900 80.473 105.93 218 95.000 95.000 100.00 86.721 89.897 107.34 219 5.0000 100.00 100.00 54.437 79.031 106.94 220 10.000 100.00 100.00 54.686 79.159 106.95 221 15.000 100.00 100.00 55.077 79.361 106.97 222 20.000 100.00 100.00 55.628 79.645 106.99 223 25.000 100.00 100.00 56.354 80.019 107.03 224 30.000 100.00 100.00 57.267 80.490 107.07 225 35.000 100.00 100.00 58.379 81.063 107.12 226 40.000 100.00 100.00 59.701 81.745 107.19 227 45.000 100.00 100.00 61.244 82.540 107.26 228 50.000 100.00 100.00 63.016 83.454 107.34 229 55.000 100.00 100.00 65.026 84.490 107.43 230 60.000 100.00 100.00 67.283 85.654 107.54 231 65.000 100.00 100.00 69.794 86.949 107.66 232 70.000 100.00 100.00 72.568 88.379 107.79 233 75.000 100.00 100.00 75.611 89.948 107.93 234 80.000 100.00 100.00 78.931 91.660 108.09 235 85.000 100.00 100.00 82.534 93.517 108.25 236 90.000 100.00 100.00 86.426 95.525 108.44 237 95.000 100.00 100.00 90.615 97.684 108.63 238 100.00 5.0000 100.00 59.841 29.478 97.089 239 100.00 10.000 100.00 60.056 29.909 97.160 240 100.00 15.000 100.00 60.395 30.588 97.274 241 100.00 20.000 100.00 60.873 31.543 97.433 242 100.00 25.000 100.00 61.503 32.802 97.643 243 100.00 30.000 100.00 62.294 34.385 97.907 244 100.00 35.000 100.00 63.259 36.314 98.228 245 100.00 40.000 100.00 64.406 38.607 98.610 246 100.00 45.000 100.00 65.743 41.281 99.056 247 100.00 50.000 100.00 67.279 44.354 99.568 248 100.00 55.000 100.00 69.023 47.839 100.15 249 100.00 60.000 100.00 70.979 51.753 100.80 250 100.00 65.000 100.00 73.157 56.108 101.53 251 100.00 70.000 100.00 75.562 60.917 102.33 252 100.00 75.000 100.00 78.201 66.194 103.21 253 100.00 80.000 100.00 81.080 71.951 104.17 254 100.00 85.000 100.00 84.204 78.198 105.21 255 100.00 90.000 100.00 87.580 84.949 106.34 256 100.00 95.000 100.00 91.212 92.212 107.55 257 100.00 100.00 5.0000 77.306 92.881 15.086 258 100.00 100.00 10.000 77.414 92.924 15.659 259 100.00 100.00 15.000 77.586 92.993 16.561 260 100.00 100.00 20.000 77.827 93.089 17.831 261 100.00 100.00 25.000 78.145 93.216 19.504 262 100.00 100.00 30.000 78.544 93.376 21.609 263 100.00 100.00 35.000 79.031 93.571 24.173 264 100.00 100.00 40.000 79.610 93.802 27.222 265 100.00 100.00 45.000 80.285 94.072 30.778 266 100.00 100.00 50.000 81.061 94.383 34.863 267 100.00 100.00 55.000 81.940 94.734 39.497 268 100.00 100.00 60.000 82.928 95.129 44.700 269 100.00 100.00 65.000 84.027 95.569 50.489 270 100.00 100.00 70.000 85.241 96.055 56.884 271 100.00 100.00 75.000 86.573 96.587 63.899 272 100.00 100.00 80.000 88.026 97.168 71.553 273 100.00 100.00 85.000 89.603 97.799 79.859 274 100.00 100.00 90.000 91.307 98.481 88.833 275 100.00 100.00 95.000 93.141 99.214 98.490 276 66.667 100.00 100.00 70.689 87.410 107.70 277 100.00 66.667 100.00 73.933 57.660 101.79 278 100.00 100.00 66.667 84.419 95.726 52.553 279 66.667 33.333 33.333 22.253 16.543 11.392 280 33.333 66.667 33.333 20.565 32.022 14.469 281 33.333 33.333 66.667 15.109 12.217 40.084 282 33.333 66.667 66.667 26.125 34.246 43.756 283 66.667 33.333 66.667 27.813 18.767 40.679 284 66.667 66.667 33.333 33.268 38.572 15.064 285 100.00 0.0000 66.667 49.014 24.925 40.751 286 66.667 100.00 0.0000 52.818 80.263 13.571 287 0.0000 66.667 100.00 33.103 36.608 99.873 288 0.0000 100.00 66.667 43.589 74.674 50.640 289 66.667 0.0000 100.00 35.284 16.610 95.898 290 100.00 66.667 0.0000 56.062 50.512 7.6573 291 25.665 0.0000 0.0000 3.1876 2.1279 1.1025 292 68.161 35.358 27.002 22.933 17.579 8.5973 293 80.462 47.698 33.859 34.498 28.237 13.283 294 41.319 53.173 11.065 15.680 21.397 5.2654 295 50.198 74.689 16.807 28.573 42.370 9.7830 296 52.842 84.771 67.979 42.708 57.782 49.090 297 84.523 84.137 100.00 70.718 70.418 104.42 298 19.278 18.627 29.511 4.5538 4.2090 8.0694 299 70.801 19.825 34.011 22.606 13.655 11.177 300 87.995 21.393 71.227 41.208 22.745 46.707 301 91.008 25.897 90.262 50.066 27.526 77.796 302 32.778 0.0000 100.00 22.454 9.9947 95.297 303 44.224 20.024 100.00 26.759 13.958 95.835 304 68.736 29.691 100.00 38.975 22.281 96.798 305 81.754 9.1441 34.621 28.951 15.668 11.563 306 83.704 0.0000 51.876 32.439 16.731 24.100 307 84.009 0.0000 83.686 40.462 19.965 65.186 308 43.285 15.428 57.571 13.342 7.8447 28.929 309 53.174 15.742 71.304 20.085 10.998 45.657 310 52.241 49.504 73.873 27.054 24.397 51.470 311 33.359 35.738 43.288 11.238 11.468 17.199 312 46.183 53.166 46.252 20.257 23.404 21.266 313 67.814 66.608 53.864 36.746 39.992 30.213 314 74.316 68.051 71.535 45.201 44.926 51.200 315 89.766 10.631 10.933 33.558 18.343 3.7134 316 100.00 0.0000 30.873 43.218 22.607 10.221 317 100.00 0.0000 65.701 48.785 24.834 39.547 318 93.216 7.5584 44.579 39.034 20.614 18.453 319 100.00 19.075 48.837 46.538 25.651 22.420 320 100.00 48.125 48.715 52.425 37.453 24.286 321 19.753 10.620 65.990 9.7334 5.2692 38.184 322 17.255 0.0000 81.005 13.126 5.9687 59.502 323 31.609 15.844 79.502 15.732 8.4999 57.458 324 47.548 28.283 84.435 23.327 14.519 66.307 325 56.585 14.312 26.843 14.124 8.5949 7.2622 326 60.210 52.894 26.148 23.662 25.275 9.7008 327 73.037 71.483 32.251 39.243 45.208 15.472 328 100.00 100.00 49.139 80.920 94.326 34.121 329 0.0000 73.081 0.0000 18.459 35.913 6.8198 330 20.686 100.00 17.749 38.320 72.733 15.366 331 24.754 100.00 43.829 41.325 74.004 28.080 332 17.589 60.844 30.957 15.090 25.364 12.275 333 18.959 85.401 41.509 29.555 52.179 22.838 334 84.390 86.194 42.826 56.832 66.998 25.185 335 22.174 82.074 0.0000 25.289 47.130 8.6252 336 36.119 100.00 0.0000 40.785 74.059 13.007 337 34.989 89.006 15.829 32.673 57.635 12.284 338 40.193 89.300 35.374 35.707 59.334 20.056 339 48.153 100.00 52.416 48.700 77.650 35.496 340 12.410 32.334 82.818 16.265 12.005 63.473 341 10.305 54.979 90.294 24.918 25.515 78.791 342 0.0000 66.665 100.00 33.102 36.606 99.873 343 20.708 78.158 100.00 40.605 49.466 101.96 344 45.768 84.613 100.00 50.348 60.370 103.55 345 65.184 100.00 100.00 69.891 86.999 107.66 346 76.518 22.590 13.294 25.076 15.575 4.0364 347 100.00 23.824 24.308 44.330 25.674 7.9919 348 62.018 11.822 10.151 15.636 9.2127 2.7756 349 75.947 0.0000 0.0000 22.942 12.313 2.0281 350 81.424 18.801 56.042 32.597 18.274 28.369 351 85.026 15.380 100.00 47.873 24.178 96.696 352 31.430 9.0865 41.360 7.1428 4.3277 14.679 353 33.372 70.135 43.720 23.515 35.918 21.587 354 38.070 88.681 60.754 38.704 59.780 41.036 355 49.510 100.00 82.002 56.368 80.774 73.287 356 0.0000 34.231 20.121 4.9959 8.0335 5.2842 357 26.068 34.704 18.166 7.2463 9.3512 4.8761 358 31.962 50.192 26.608 13.072 18.446 9.1237 359 100.00 24.248 0.0000 43.527 25.445 3.4787 360 100.00 50.715 0.0000 49.645 37.679 5.5181 361 87.973 37.148 16.310 35.970 24.961 5.9146 362 100.00 49.362 24.672 50.087 37.146 10.036 363 100.00 74.328 25.467 60.905 58.687 13.924 364 34.821 11.176 13.313 5.7674 4.0528 2.8330 365 76.016 0.0000 23.807 23.813 12.667 6.3817 366 87.758 30.282 37.859 36.126 22.789 14.444 367 87.506 42.180 61.073 42.354 29.449 35.345 368 90.432 44.028 91.678 53.939 35.156 81.727 369 45.223 64.036 30.740 22.435 31.214 12.913 370 49.270 65.115 63.748 29.481 34.981 40.168 371 60.085 66.390 83.402 39.999 40.666 68.729 372 33.139 35.732 71.321 16.725 13.654 46.370 373 35.879 40.262 89.483 23.979 18.320 75.951 374 50.537 41.721 100.00 32.958 23.043 97.262 375 65.384 50.566 44.380 27.447 25.818 19.918 376 87.494 61.484 43.792 45.941 41.502 21.536 377 87.915 82.347 57.717 59.534 64.435 37.571 378 0.0000 0.0000 29.574 2.2714 1.5085 7.6968 379 0.0000 73.930 51.188 22.940 38.435 28.170 380 7.2442 82.171 94.800 39.790 52.866 91.956 381 30.173 100.00 100.00 57.302 80.508 107.07 382 23.675 0.0000 24.768 3.7598 2.3197 5.7893 383 63.989 0.0000 70.434 24.106 11.975 44.456 384 65.720 31.557 75.677 29.303 18.757 52.886 385 66.530 72.242 100.00 52.224 50.597 101.57 386 22.405 48.936 49.710 13.690 17.842 23.386 387 24.886 51.283 79.271 21.636 22.298 59.447 388 24.603 68.521 87.180 31.234 37.523 75.110 389 26.209 25.670 57.508 10.365 8.0449 29.059 390 49.837 37.247 59.721 19.362 15.826 32.436 391 69.050 49.229 62.485 32.297 27.292 37.061 392 78.315 43.615 78.708 40.560 28.581 58.783 393 84.706 64.396 86.583 55.112 46.971 74.619 394 0.0000 100.00 28.303 37.569 72.266 18.931 395 0.0000 100.00 51.968 40.564 73.464 34.707 396 0.0000 100.00 75.598 45.910 75.602 62.867 397 0.0000 56.952 26.775 12.101 21.533 9.8386 398 60.823 88.348 30.980 42.534 61.931 17.899 399 71.789 100.00 40.171 58.150 82.735 26.328 400 74.445 51.465 6.9792 30.157 27.993 5.2330 401 75.471 70.107 0.0000 38.551 43.981 7.3189 402 100.00 77.017 0.0000 61.462 61.310 9.4572 403 54.635 50.673 0.0000 19.395 22.061 4.0966 404 65.223 66.337 13.747 31.013 37.331 8.0112 405 75.566 85.925 8.0285 47.934 62.448 11.067 406 78.966 100.00 19.178 60.897 84.365 16.804 407 68.326 86.571 68.778 51.568 64.081 50.873 408 68.692 86.649 85.438 56.640 66.217 76.255 409 78.771 100.00 84.664 72.476 88.981 78.482 410 0.0000 22.319 0.0000 2.4443 3.8883 1.4814 411 13.836 24.386 8.5050 3.5517 4.8454 2.3440 412 27.787 27.246 0.0000 5.6986 6.5930 1.8321 413 43.668 32.957 24.126 11.524 10.991 6.8198 414 52.709 36.677 40.178 17.116 14.852 15.390 415 51.769 73.294 45.181 31.072 42.230 23.500 416 100.00 74.277 49.815 63.729 59.773 28.934 417 73.801 34.459 51.978 29.185 20.163 25.026 418 43.142 19.737 35.625 10.374 7.3146 11.492 419 62.365 17.069 53.517 20.469 11.823 25.303 420 100.00 32.410 69.847 52.833 31.309 45.890 421 100.00 55.042 77.177 61.123 44.705 58.463 422 100.00 78.496 77.802 72.454 67.075 63.136 423 0.0000 0.0000 63.452 7.4397 3.5755 34.918 424 9.9374 9.2115 91.257 16.239 7.6423 77.605 425 23.768 47.410 100.00 27.510 22.629 97.469 426 47.120 62.678 100.00 38.978 36.942 99.628 427 15.970 65.970 48.240 19.339 30.682 24.325 428 12.404 81.802 67.123 31.348 49.161 46.933 429 49.292 82.441 84.000 44.390 55.925 72.451 430 89.750 61.096 62.806 50.980 43.460 39.570 431 92.200 81.373 88.820 70.827 68.389 81.935 432 50.307 0.0000 0.0000 9.8558 5.5661 1.4150 433 54.266 24.058 0.0000 13.110 9.7231 2.0460 434 77.132 34.645 0.0000 27.199 19.678 3.2255 435 87.526 61.437 15.609 43.444 40.474 8.3549 436 90.186 79.768 12.663 54.803 60.233 10.974 437 89.549 87.811 27.673 60.268 70.565 17.138 438 50.678 79.736 0.0000 31.218 48.074 8.4951 439 58.210 90.852 9.6697 41.819 64.293 11.959 440 71.465 100.00 0.0000 55.560 81.677 13.699 441 100.00 100.00 25.916 78.211 93.243 19.856 442 40.594 28.813 7.4171 9.1020 8.7107 2.6680 443 57.906 37.398 12.942 17.387 15.479 4.3569 444 65.494 84.947 48.555 44.839 59.502 28.807 445 72.328 100.00 62.625 62.336 84.447 46.674 446 0.0000 19.227 32.772 3.6563 3.8038 9.6203 447 11.666 38.090 64.169 12.368 12.397 37.210 448 30.213 74.026 65.876 28.997 41.292 43.981 449 32.716 86.718 84.485 42.403 58.981 73.970 450 33.216 54.802 63.220 20.318 23.947 37.901 451 39.443 61.890 85.823 30.982 32.918 71.847 452 19.642 21.158 100.00 21.482 11.428 95.625 453 15.493 0.0000 50.734 5.7952 3.0158 21.832 454 37.599 0.0000 53.997 10.283 5.2637 25.031 455 42.710 0.0000 79.959 18.012 8.5246 58.064 456 55.524 8.2388 89.135 26.008 12.696 74.119 457 65.986 0.0000 100.00 34.915 16.419 95.881 458 76.260 10.437 72.763 32.251 16.667 48.131 459 100.00 14.664 84.036 54.552 28.207 66.626 460 100.00 34.498 100.00 63.154 36.104 98.193 461 100.00 67.141 100.00 74.159 58.111 101.86 462 8.1638 8.9303 13.425 1.8905 1.8693 2.6371 463 14.259 47.478 11.643 8.7389 15.023 4.4952 464 13.322 67.035 11.928 16.297 30.241 7.0830 465 22.720 77.737 24.406 23.637 42.322 12.331 466 11.235 37.195 37.311 7.5815 10.149 13.174 467 0.0000 48.356 49.976 11.872 16.627 23.476 468 0.0000 48.964 75.712 17.781 19.298 53.650 469 63.842 49.183 88.773 36.868 28.769 75.989 470 48.265 0.0000 23.841 9.9265 5.5067 5.7431 471 58.576 0.0000 45.432 16.450 8.6063 17.973 472 69.384 18.308 86.994 32.961 17.447 70.814 473 11.656 16.463 47.761 5.8064 4.2930 19.549 474 0.0000 22.840 58.298 7.8544 6.1571 29.652 475 11.112 62.451 67.528 21.192 28.837 44.059 476 0.0000 75.828 77.317 29.956 42.913 59.971 477 16.533 92.162 86.956 44.389 65.525 79.425 478 0.0000 16.923 81.952 13.253 7.2775 61.289 479 0.0000 34.163 100.00 22.255 14.914 96.257 480 78.866 52.536 100.00 51.184 37.328 99.060 481 27.845 54.060 0.0000 12.551 20.279 4.1131 482 34.436 69.750 8.1956 20.836 34.565 7.1321 483 50.594 100.00 20.910 46.014 76.681 16.612 484 0.0000 47.356 0.0000 7.7405 14.479 3.2468 485 0.0000 79.426 21.027 22.686 43.326 11.438 486 3.9228 82.924 36.338 26.241 48.184 18.956 487 15.935 95.844 58.324 39.390 67.889 39.934 488 24.404 100.00 75.468 47.855 76.609 62.769 489 86.788 90.925 71.122 67.441 76.641 55.586 490 100.00 100.00 72.982 86.021 96.367 60.992 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "October 20, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 47.361 100.00 25.613 21.629 97.376 2 100.00 0.0000 79.351 52.426 26.290 58.722 3 0.0000 0.0000 58.997 6.4858 3.1940 29.894 4 100.00 66.659 0.0000 56.059 50.505 7.6561 5 0.0000 35.601 0.0000 4.6856 8.3702 2.2286 6 84.444 0.0000 0.0000 28.843 15.356 2.3047 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "October 20, 2013" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.00 100.00 100.00 95.106 100.00 108.84 1 0.0000 100.00 100.00 54.276 78.948 106.93 2 100.00 0.0000 100.00 59.701 29.199 97.042 3 0.0000 0.0000 100.00 18.871 8.1473 95.129 4 100.00 100.00 0.0000 77.235 92.853 14.715 5 0.0000 100.00 0.0000 36.405 71.801 12.802 6 100.00 0.0000 0.0000 41.830 22.052 2.9132 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 50.000 50.000 50.000 21.143 22.190 24.083 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_xxl.ti10000644000076500000000000011004012665102037021013 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "450" CREATED "Thu May 21 22:44:38 2015" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "21" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 739 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.3704 1.3897 1.4245 5 7.5000 7.5000 7.5000 1.6184 1.6506 1.7087 6 10.000 10.000 10.000 1.9432 1.9923 2.0809 7 12.500 12.500 12.500 2.3504 2.4206 2.5476 8 15.000 15.000 15.000 2.8451 2.9411 3.1145 9 17.500 17.500 17.500 3.4320 3.5585 3.7870 10 20.000 20.000 20.000 4.1154 4.2774 4.5701 11 22.500 22.500 22.500 4.8994 5.1021 5.4686 12 25.000 25.000 25.000 5.7878 6.0367 6.4867 13 27.500 27.500 27.500 6.7843 7.0850 7.6286 14 30.000 30.000 30.000 7.8923 8.2507 8.8984 15 32.500 32.500 32.500 9.1151 9.5371 10.300 16 35.000 35.000 35.000 10.456 10.948 11.836 17 37.500 37.500 37.500 11.918 12.486 13.512 18 40.000 40.000 40.000 13.504 14.154 15.329 19 42.500 42.500 42.500 15.216 15.956 17.292 20 45.000 45.000 45.000 17.059 17.894 19.403 21 47.500 47.500 47.500 19.033 19.971 21.666 22 50.000 50.000 50.000 21.143 22.190 24.083 23 52.500 52.500 52.500 23.389 24.554 26.658 24 55.000 55.000 55.000 25.776 27.064 29.392 25 57.500 57.500 57.500 28.304 29.724 32.290 26 60.000 60.000 60.000 30.977 32.536 35.353 27 62.500 62.500 62.500 33.797 35.502 38.585 28 65.000 65.000 65.000 36.766 38.626 41.987 29 67.500 67.500 67.500 39.886 41.908 45.562 30 70.000 70.000 70.000 43.159 45.351 49.313 31 72.500 72.500 72.500 46.587 48.958 53.242 32 75.000 75.000 75.000 50.173 52.730 57.351 33 77.500 77.500 77.500 53.918 56.669 61.643 34 80.000 80.000 80.000 57.824 60.779 66.119 35 82.500 82.500 82.500 61.894 65.060 70.783 36 85.000 85.000 85.000 66.128 69.515 75.636 37 87.500 87.500 87.500 70.530 74.146 80.680 38 90.000 90.000 90.000 75.101 78.954 85.918 39 92.500 92.500 92.500 79.842 83.942 91.351 40 95.000 95.000 95.000 84.755 89.111 96.982 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 1.1607 1.0829 1.0075 43 10.000 0.0000 0.0000 1.4092 1.2110 1.0192 44 15.000 0.0000 0.0000 1.8005 1.4128 1.0375 45 20.000 0.0000 0.0000 2.3517 1.6969 1.0633 46 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 47 30.000 0.0000 0.0000 3.9904 2.5418 1.1401 48 35.000 0.0000 0.0000 5.1027 3.1154 1.1922 49 40.000 0.0000 0.0000 6.4250 3.7972 1.2542 50 45.000 0.0000 0.0000 7.9675 4.5924 1.3265 51 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 52 55.000 0.0000 0.0000 11.749 6.5425 1.5037 53 60.000 0.0000 0.0000 14.006 7.7061 1.6095 54 65.000 0.0000 0.0000 16.518 9.0010 1.7271 55 70.000 0.0000 0.0000 19.291 10.431 1.8571 56 75.000 0.0000 0.0000 22.335 12.000 1.9997 57 80.000 0.0000 0.0000 25.654 13.712 2.1553 58 85.000 0.0000 0.0000 29.257 15.570 2.3241 59 90.000 0.0000 0.0000 33.150 17.577 2.5065 60 95.000 0.0000 0.0000 37.339 19.737 2.7028 61 100.00 0.0000 0.0000 41.830 22.052 2.9132 62 0.0000 5.0000 0.0000 1.1394 1.2787 1.0465 63 0.0000 10.000 0.0000 1.3549 1.7096 1.1183 64 0.0000 15.000 0.0000 1.6942 2.3882 1.2314 65 0.0000 20.000 0.0000 2.1721 3.3438 1.3907 66 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 67 0.0000 30.000 0.0000 3.5930 6.1854 1.8644 68 0.0000 35.000 0.0000 4.5576 8.1141 2.1859 69 0.0000 40.000 0.0000 5.7042 10.407 2.5681 70 0.0000 45.000 0.0000 7.0417 13.082 3.0139 71 0.0000 50.000 0.0000 8.5782 16.154 3.5261 72 0.0000 55.000 0.0000 10.321 19.640 4.1071 73 0.0000 60.000 0.0000 12.278 23.553 4.7594 74 0.0000 65.000 0.0000 14.456 27.908 5.4854 75 0.0000 70.000 0.0000 16.861 32.718 6.2871 76 0.0000 75.000 0.0000 19.500 37.995 7.1667 77 0.0000 80.000 0.0000 22.379 43.751 8.1263 78 0.0000 85.000 0.0000 25.503 49.999 9.1677 79 0.0000 90.000 0.0000 28.878 56.749 10.293 80 0.0000 95.000 0.0000 32.511 64.013 11.504 81 0.0000 100.00 0.0000 36.405 71.801 12.802 82 0.0000 0.0000 5.0000 1.0703 1.0281 1.3705 83 0.0000 0.0000 10.000 1.1791 1.0716 1.9434 84 0.0000 0.0000 15.000 1.3504 1.1401 2.8456 85 0.0000 0.0000 20.000 1.5916 1.2366 4.1161 86 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 87 0.0000 0.0000 30.000 2.3089 1.5235 7.8939 88 0.0000 0.0000 35.000 2.7957 1.7182 10.458 89 0.0000 0.0000 40.000 3.3745 1.9497 13.507 90 0.0000 0.0000 45.000 4.0496 2.2197 17.063 91 0.0000 0.0000 50.000 4.8252 2.5298 21.147 92 0.0000 0.0000 55.000 5.7050 2.8817 25.782 93 0.0000 0.0000 60.000 6.6928 3.2768 30.984 94 0.0000 0.0000 65.000 7.7920 3.7164 36.774 95 0.0000 0.0000 70.000 9.0060 4.2019 43.169 96 0.0000 0.0000 75.000 10.338 4.7346 50.184 97 0.0000 0.0000 80.000 11.791 5.3157 57.838 98 0.0000 0.0000 85.000 13.368 5.9464 66.144 99 0.0000 0.0000 90.000 15.072 6.6279 75.118 100 0.0000 0.0000 95.000 16.905 7.3611 84.775 101 0.0000 0.0000 100.00 18.871 8.1473 95.129 102 0.0000 5.0000 5.0000 1.2097 1.3068 1.4169 103 0.0000 10.000 10.000 1.5340 1.7813 2.0617 104 0.0000 15.000 15.000 2.0446 2.5283 3.0769 105 0.0000 20.000 20.000 2.7637 3.5804 4.5068 106 0.0000 25.000 25.000 3.7105 4.9657 6.3893 107 0.0000 30.000 30.000 4.9019 6.7088 8.7583 108 0.0000 35.000 35.000 6.3533 8.8323 11.644 109 0.0000 40.000 40.000 8.0787 11.357 15.075 110 0.0000 45.000 45.000 10.091 14.301 19.077 111 0.0000 50.000 50.000 12.403 17.684 23.674 112 0.0000 55.000 55.000 15.026 21.522 28.889 113 0.0000 60.000 60.000 17.971 25.830 34.744 114 0.0000 65.000 65.000 21.248 30.625 41.260 115 0.0000 70.000 70.000 24.867 35.920 48.456 116 0.0000 75.000 75.000 28.838 41.729 56.351 117 0.0000 80.000 80.000 33.170 48.067 64.964 118 0.0000 85.000 85.000 37.871 54.945 74.312 119 0.0000 90.000 90.000 42.950 62.377 84.411 120 0.0000 95.000 95.000 48.416 70.374 95.279 121 0.0000 100.00 100.00 54.276 78.948 106.93 122 5.0000 0.0000 5.0000 1.2310 1.1110 1.3780 123 10.000 0.0000 10.000 1.5884 1.2826 1.9626 124 15.000 0.0000 15.000 2.1509 1.5529 2.8831 125 20.000 0.0000 20.000 2.9433 1.9335 4.1795 126 25.000 0.0000 25.000 3.9865 2.4347 5.8863 127 30.000 0.0000 30.000 5.2992 3.0653 8.0340 128 35.000 0.0000 35.000 6.8984 3.8335 10.650 129 40.000 0.0000 40.000 8.7995 4.7468 13.761 130 45.000 0.0000 45.000 11.017 5.8121 17.389 131 50.000 0.0000 50.000 13.564 7.0358 21.557 132 55.000 0.0000 55.000 16.454 8.4242 26.285 133 60.000 0.0000 60.000 19.699 9.9829 31.594 134 65.000 0.0000 65.000 23.310 11.717 37.501 135 70.000 0.0000 70.000 27.297 13.633 44.026 136 75.000 0.0000 75.000 31.673 15.735 51.184 137 80.000 0.0000 80.000 36.445 18.028 58.993 138 85.000 0.0000 85.000 41.625 20.516 67.468 139 90.000 0.0000 90.000 47.222 23.205 76.625 140 95.000 0.0000 95.000 53.244 26.098 86.478 141 100.00 0.0000 100.00 59.701 29.199 97.042 142 5.0000 5.0000 0.0000 1.3001 1.3615 1.0540 143 10.000 10.000 0.0000 1.7641 1.9206 1.1375 144 15.000 15.000 0.0000 2.4947 2.8009 1.2689 145 20.000 20.000 0.0000 3.5238 4.0408 1.4540 146 25.000 25.000 0.0000 4.8786 5.6731 1.6978 147 30.000 30.000 0.0000 6.5834 7.7272 2.0045 148 35.000 35.000 0.0000 8.6602 10.229 2.3781 149 40.000 40.000 0.0000 11.129 13.204 2.8223 150 45.000 45.000 0.0000 14.009 16.674 3.3404 151 50.000 50.000 0.0000 17.318 20.660 3.9356 152 55.000 55.000 0.0000 21.071 25.182 4.6108 153 60.000 60.000 0.0000 25.285 30.259 5.3689 154 65.000 65.000 0.0000 29.974 35.909 6.2125 155 70.000 70.000 0.0000 35.153 42.149 7.1442 156 75.000 75.000 0.0000 40.835 48.995 8.1664 157 80.000 80.000 0.0000 47.033 56.463 9.2815 158 85.000 85.000 0.0000 53.760 64.569 10.492 159 90.000 90.000 0.0000 61.029 73.326 11.799 160 95.000 95.000 0.0000 68.850 82.749 13.206 161 100.00 100.00 0.0000 77.235 92.853 14.715 162 100.00 5.0000 5.0000 42.040 22.359 3.3302 163 100.00 10.000 10.000 42.364 22.833 3.9750 164 100.00 15.000 15.000 42.875 23.580 4.9902 165 100.00 20.000 20.000 43.594 24.633 6.4200 166 100.00 25.000 25.000 44.541 26.018 8.3026 167 100.00 30.000 30.000 45.732 27.761 10.671 168 100.00 35.000 35.000 47.183 29.884 13.557 169 100.00 40.000 40.000 48.909 32.409 16.988 170 100.00 45.000 45.000 50.922 35.354 20.990 171 100.00 50.000 50.000 53.233 38.736 25.587 172 100.00 55.000 55.000 55.856 42.574 30.802 173 100.00 60.000 60.000 58.801 46.882 36.657 174 100.00 65.000 65.000 62.078 51.677 43.173 175 100.00 70.000 70.000 65.697 56.972 50.369 176 100.00 75.000 75.000 69.668 62.782 58.264 177 100.00 80.000 80.000 74.000 69.119 66.877 178 100.00 85.000 85.000 78.701 75.998 76.225 179 100.00 90.000 90.000 83.781 83.429 86.324 180 100.00 95.000 95.000 89.246 91.426 97.192 181 5.0000 100.00 5.0000 36.636 71.912 13.180 182 10.000 100.00 10.000 36.994 72.083 13.764 183 15.000 100.00 15.000 37.556 72.353 14.685 184 20.000 100.00 20.000 38.349 72.734 15.981 185 25.000 100.00 25.000 39.392 73.235 17.688 186 30.000 100.00 30.000 40.704 73.866 19.836 187 35.000 100.00 35.000 42.304 74.634 22.452 188 40.000 100.00 40.000 44.205 75.547 25.563 189 45.000 100.00 45.000 46.422 76.613 29.191 190 50.000 100.00 50.000 48.970 77.836 33.359 191 55.000 100.00 55.000 51.860 79.225 38.087 192 60.000 100.00 60.000 55.104 80.783 43.396 193 65.000 100.00 65.000 58.715 82.518 49.303 194 70.000 100.00 70.000 62.703 84.434 55.828 195 75.000 100.00 75.000 67.078 86.535 62.986 196 80.000 100.00 80.000 71.851 88.828 70.795 197 85.000 100.00 85.000 77.031 91.317 79.270 198 90.000 100.00 90.000 82.627 94.005 88.427 199 95.000 100.00 95.000 88.650 96.898 98.280 200 5.0000 5.0000 100.00 19.171 8.5088 95.183 201 10.000 10.000 100.00 19.635 9.0679 95.266 202 15.000 15.000 100.00 20.366 9.9482 95.398 203 20.000 20.000 100.00 21.395 11.188 95.583 204 25.000 25.000 100.00 22.750 12.820 95.827 205 30.000 30.000 100.00 24.455 14.875 96.133 206 35.000 35.000 100.00 26.531 17.377 96.507 207 40.000 40.000 100.00 29.000 20.352 96.951 208 45.000 45.000 100.00 31.880 23.822 97.469 209 50.000 50.000 100.00 35.189 27.808 98.065 210 55.000 55.000 100.00 38.942 32.330 98.740 211 60.000 60.000 100.00 43.156 37.407 99.498 212 65.000 65.000 100.00 47.845 43.057 100.34 213 70.000 70.000 100.00 53.024 49.296 101.27 214 75.000 75.000 100.00 58.706 56.142 102.30 215 80.000 80.000 100.00 64.904 63.610 103.41 216 85.000 85.000 100.00 71.631 71.716 104.62 217 90.000 90.000 100.00 78.900 80.473 105.93 218 95.000 95.000 100.00 86.721 89.897 107.34 219 5.0000 100.00 100.00 54.437 79.031 106.94 220 10.000 100.00 100.00 54.686 79.159 106.95 221 15.000 100.00 100.00 55.077 79.361 106.97 222 20.000 100.00 100.00 55.628 79.645 106.99 223 25.000 100.00 100.00 56.354 80.019 107.03 224 30.000 100.00 100.00 57.267 80.490 107.07 225 35.000 100.00 100.00 58.379 81.063 107.12 226 40.000 100.00 100.00 59.701 81.745 107.19 227 45.000 100.00 100.00 61.244 82.540 107.26 228 50.000 100.00 100.00 63.016 83.454 107.34 229 55.000 100.00 100.00 65.026 84.490 107.43 230 60.000 100.00 100.00 67.283 85.654 107.54 231 65.000 100.00 100.00 69.794 86.949 107.66 232 70.000 100.00 100.00 72.568 88.379 107.79 233 75.000 100.00 100.00 75.611 89.948 107.93 234 80.000 100.00 100.00 78.931 91.660 108.09 235 85.000 100.00 100.00 82.534 93.517 108.25 236 90.000 100.00 100.00 86.426 95.525 108.44 237 95.000 100.00 100.00 90.615 97.684 108.63 238 100.00 5.0000 100.00 59.841 29.478 97.089 239 100.00 10.000 100.00 60.056 29.909 97.160 240 100.00 15.000 100.00 60.395 30.588 97.274 241 100.00 20.000 100.00 60.873 31.543 97.433 242 100.00 25.000 100.00 61.503 32.802 97.643 243 100.00 30.000 100.00 62.294 34.385 97.907 244 100.00 35.000 100.00 63.259 36.314 98.228 245 100.00 40.000 100.00 64.406 38.607 98.610 246 100.00 45.000 100.00 65.743 41.281 99.056 247 100.00 50.000 100.00 67.279 44.354 99.568 248 100.00 55.000 100.00 69.023 47.839 100.15 249 100.00 60.000 100.00 70.979 51.753 100.80 250 100.00 65.000 100.00 73.157 56.108 101.53 251 100.00 70.000 100.00 75.562 60.917 102.33 252 100.00 75.000 100.00 78.201 66.194 103.21 253 100.00 80.000 100.00 81.080 71.951 104.17 254 100.00 85.000 100.00 84.204 78.198 105.21 255 100.00 90.000 100.00 87.580 84.949 106.34 256 100.00 95.000 100.00 91.212 92.212 107.55 257 100.00 100.00 5.0000 77.306 92.881 15.086 258 100.00 100.00 10.000 77.414 92.924 15.659 259 100.00 100.00 15.000 77.586 92.993 16.561 260 100.00 100.00 20.000 77.827 93.089 17.831 261 100.00 100.00 25.000 78.145 93.216 19.504 262 100.00 100.00 30.000 78.544 93.376 21.609 263 100.00 100.00 35.000 79.031 93.571 24.173 264 100.00 100.00 40.000 79.610 93.802 27.222 265 100.00 100.00 45.000 80.285 94.072 30.778 266 100.00 100.00 50.000 81.061 94.383 34.863 267 100.00 100.00 55.000 81.940 94.734 39.497 268 100.00 100.00 60.000 82.928 95.129 44.700 269 100.00 100.00 65.000 84.027 95.569 50.489 270 100.00 100.00 70.000 85.241 96.055 56.884 271 100.00 100.00 75.000 86.573 96.587 63.899 272 100.00 100.00 80.000 88.026 97.168 71.553 273 100.00 100.00 85.000 89.603 97.799 79.859 274 100.00 100.00 90.000 91.307 98.481 88.833 275 100.00 100.00 95.000 93.141 99.214 98.490 276 66.667 100.00 100.00 70.689 87.410 107.70 277 100.00 66.667 100.00 73.933 57.660 101.79 278 100.00 100.00 66.667 84.419 95.726 52.553 279 66.667 33.333 33.333 22.253 16.543 11.392 280 33.333 66.667 33.333 20.565 32.022 14.469 281 33.333 33.333 66.667 15.109 12.217 40.084 282 33.333 66.667 66.667 26.125 34.246 43.756 283 66.667 33.333 66.667 27.813 18.767 40.679 284 66.667 66.667 33.333 33.268 38.572 15.064 285 100.00 0.0000 66.667 49.014 24.925 40.751 286 66.667 100.00 0.0000 52.818 80.263 13.571 287 0.0000 66.667 100.00 33.103 36.608 99.873 288 0.0000 100.00 66.667 43.589 74.674 50.640 289 66.667 0.0000 100.00 35.284 16.610 95.898 290 100.00 66.667 0.0000 56.062 50.512 7.6573 291 71.927 27.545 62.631 28.872 17.887 35.596 292 81.256 29.242 77.744 39.115 23.136 56.322 293 65.537 0.0000 58.719 22.232 11.319 30.337 294 100.00 36.146 69.745 53.575 32.835 46.009 295 100.00 83.472 0.0000 65.352 69.090 10.754 296 100.00 100.00 26.420 78.249 93.258 20.057 297 44.429 52.005 10.173 16.216 21.071 5.0373 298 48.892 73.471 74.768 36.268 44.332 56.125 299 0.0000 82.897 62.543 30.397 49.806 41.575 300 0.0000 100.00 81.898 47.780 76.350 72.715 301 20.572 100.00 81.979 49.231 77.095 72.915 302 57.329 100.00 0.0000 48.175 77.869 13.353 303 88.378 100.00 13.132 67.539 87.821 15.715 304 36.215 20.711 100.00 24.527 12.922 95.753 305 12.372 60.785 89.151 26.955 30.013 77.442 306 20.764 67.568 100.00 34.984 38.216 100.08 307 0.0000 35.899 46.609 8.0379 9.8139 19.568 308 11.768 47.710 54.033 12.906 16.780 27.149 309 0.0000 39.279 31.752 6.9967 10.641 10.248 310 0.0000 68.739 32.801 17.803 32.090 14.350 311 0.0000 100.00 63.495 42.854 74.380 46.770 312 17.727 100.00 63.184 43.865 74.909 46.455 313 20.236 0.0000 32.943 3.9665 2.3462 9.4106 314 33.235 14.229 77.682 15.422 8.2071 54.593 315 58.657 30.280 100.00 33.889 19.812 96.590 316 69.123 69.605 100.00 52.319 48.639 101.18 317 0.0000 18.646 33.766 3.6955 3.7230 10.124 318 0.0000 18.614 51.743 6.1448 4.6974 23.041 319 18.000 0.0000 53.861 6.6062 3.3706 24.729 320 47.181 0.0000 61.455 14.713 7.3762 32.970 321 75.352 14.620 66.829 30.445 16.332 40.274 322 100.00 16.941 66.757 49.898 26.659 41.152 323 100.00 31.352 0.0000 44.666 27.724 3.8587 324 100.00 40.280 29.357 47.857 32.100 11.103 325 100.00 40.176 14.601 46.913 31.681 6.2564 326 100.00 50.006 48.059 52.922 38.615 23.938 327 100.00 71.781 67.791 66.060 58.577 47.773 328 20.380 0.0000 100.00 20.272 8.8694 95.195 329 38.603 0.0000 100.00 23.905 10.743 95.365 330 60.916 0.0000 100.00 32.318 15.081 95.759 331 76.837 14.619 100.00 42.056 21.087 96.406 332 81.302 29.527 100.00 46.947 26.350 97.164 333 0.0000 83.924 41.043 27.317 49.615 22.143 334 0.0000 100.00 44.831 39.430 73.010 28.735 335 18.291 100.00 100.00 55.421 79.538 106.98 336 33.455 52.752 32.406 14.780 20.560 12.081 337 33.794 81.765 100.00 45.140 55.015 102.79 338 66.122 85.684 100.00 59.938 66.350 104.20 339 0.0000 21.077 18.238 2.7927 3.7877 4.0557 340 0.0000 53.411 39.802 12.094 19.426 16.292 341 0.0000 68.092 51.663 20.022 32.470 27.599 342 0.0000 68.789 100.00 34.128 38.657 100.22 343 48.069 72.420 100.00 44.007 46.499 101.21 344 76.288 53.989 72.713 40.829 33.814 50.919 345 100.00 53.343 80.717 61.560 43.893 63.809 346 84.376 100.00 67.961 71.694 89.128 53.591 347 87.493 100.00 85.570 79.123 92.373 80.347 348 70.884 41.794 22.934 25.740 21.328 7.6488 349 78.052 51.937 40.910 35.047 30.479 17.951 350 58.520 64.092 29.412 27.613 33.935 12.548 351 61.175 100.00 38.802 52.206 79.690 25.169 352 68.101 100.00 60.478 59.405 82.989 44.120 353 16.411 55.292 0.0000 11.369 20.341 4.1872 354 17.348 78.049 0.0000 22.265 41.983 7.7909 355 37.822 100.00 67.650 48.648 77.255 52.114 356 61.053 100.00 73.564 58.862 82.345 60.541 357 0.0000 16.300 100.00 19.676 9.7562 95.397 358 100.00 33.075 100.00 62.867 35.529 98.097 359 100.00 50.547 100.00 67.460 44.715 99.628 360 100.00 67.590 100.00 74.374 58.541 101.93 361 100.00 48.663 0.0000 48.978 36.345 5.2957 362 100.00 65.469 0.0000 55.502 49.392 7.4706 363 65.887 81.272 0.0000 39.141 53.539 9.1327 364 86.288 88.807 0.0000 57.282 70.164 11.386 365 100.00 89.424 16.062 69.703 77.156 14.156 366 0.0000 100.00 23.003 37.178 72.110 16.872 367 16.766 100.00 39.801 39.731 73.243 25.224 368 82.067 100.00 100.00 80.386 92.410 108.15 369 100.00 0.0000 39.691 44.166 22.986 15.217 370 100.00 15.019 49.641 46.292 24.950 22.981 371 76.691 100.00 0.0000 58.831 83.364 13.853 372 77.483 100.00 29.160 60.589 84.127 20.386 373 18.050 20.660 100.00 21.234 11.215 95.597 374 25.646 36.356 100.00 24.906 16.973 96.515 375 45.015 41.797 100.00 31.006 22.066 97.177 376 26.799 0.0000 67.342 10.730 5.1670 39.805 377 48.480 9.6228 74.916 18.825 9.6098 50.556 378 65.766 31.351 75.228 29.163 18.643 52.211 379 67.220 65.742 0.0000 31.515 37.212 6.3828 380 67.158 65.606 19.237 31.967 37.288 9.2573 381 26.232 13.691 49.379 7.6000 4.8516 20.915 382 33.187 25.415 70.465 14.661 9.8655 44.587 383 61.992 47.188 75.928 31.264 25.421 54.440 384 76.558 18.887 0.0000 24.392 14.624 2.3978 385 83.175 34.691 0.0000 31.402 21.859 3.4252 386 50.418 10.702 26.695 11.328 6.7912 7.0011 387 53.933 52.447 37.260 21.751 23.936 15.059 388 65.715 87.175 37.583 44.921 61.903 21.363 389 89.798 100.00 37.658 70.484 89.130 25.318 390 100.00 100.00 52.231 81.440 94.534 36.861 391 0.0000 80.621 19.850 23.337 44.734 11.323 392 23.819 82.914 23.591 26.870 48.631 13.087 393 23.728 60.198 26.549 15.260 25.094 10.268 394 30.954 68.276 42.379 21.876 33.724 20.285 395 0.0000 24.373 85.798 15.345 9.4787 68.102 396 0.0000 34.965 100.00 22.421 15.246 96.312 397 0.0000 52.979 100.00 27.462 25.328 97.993 398 77.646 0.0000 37.419 26.121 13.714 12.951 399 82.785 0.0000 56.233 32.564 16.703 28.259 400 82.061 0.0000 78.615 37.482 18.610 56.877 401 100.00 16.465 100.00 60.520 30.838 97.315 402 81.865 0.0000 21.005 27.614 14.647 5.6356 403 100.00 0.0000 20.492 42.450 22.300 6.1755 404 100.00 34.431 54.084 49.805 30.743 27.951 405 57.936 0.0000 39.370 15.340 8.1284 13.659 406 74.351 12.408 40.865 24.910 13.786 15.233 407 70.873 9.7543 52.387 24.377 13.070 24.285 408 100.00 0.0000 61.950 47.938 24.495 35.084 409 100.00 0.0000 82.245 53.314 26.645 63.398 410 100.00 17.334 83.498 54.611 28.602 65.793 411 19.330 100.00 0.0000 37.673 72.454 12.861 412 32.011 100.00 21.012 40.468 73.820 16.383 413 39.235 100.00 35.996 43.517 75.248 23.072 414 100.00 16.770 0.0000 42.677 23.746 3.1955 415 100.00 19.902 15.963 43.383 24.531 5.3609 416 50.583 62.381 0.0000 22.248 30.192 5.5157 417 0.0000 41.117 17.439 6.4450 11.154 5.0792 418 32.981 74.850 18.578 23.562 39.906 10.024 419 45.773 75.255 44.723 29.877 43.206 23.404 420 65.919 75.099 52.518 39.817 48.059 30.346 421 23.265 74.137 33.794 22.503 38.649 15.890 422 36.725 89.253 77.294 42.882 62.041 62.947 423 43.692 100.00 84.002 54.991 79.990 76.541 424 8.2093 60.327 58.503 18.104 26.135 33.185 425 0.0000 66.316 68.863 22.787 32.217 46.350 426 0.0000 80.983 81.857 34.336 49.485 68.170 427 33.282 83.921 0.0000 28.505 50.514 9.1091 428 38.064 100.00 0.0000 41.293 74.320 13.031 429 49.168 100.00 20.093 45.430 76.385 16.340 430 63.860 0.0000 80.566 26.886 13.079 59.444 431 81.526 0.0000 100.00 44.595 21.410 96.334 432 83.465 62.057 100.00 58.139 46.421 100.45 433 19.815 0.0000 81.975 13.727 6.2438 61.102 434 42.564 0.0000 81.821 18.539 8.7302 61.077 435 17.193 29.067 0.0000 4.4542 6.3911 1.8587 436 25.928 43.368 0.0000 8.8158 13.316 2.9658 437 90.854 51.646 9.6674 42.144 34.258 6.1443 438 100.00 60.091 36.058 55.056 45.445 16.747 439 100.00 71.543 50.151 62.330 56.888 28.742 440 68.781 25.059 21.248 21.064 13.954 5.9224 441 74.981 36.847 50.875 30.253 21.500 24.238 442 78.603 50.746 87.267 45.648 34.116 73.848 443 0.0000 33.651 64.856 11.039 10.262 37.693 444 31.889 48.070 72.178 19.919 20.095 48.626 445 36.553 58.333 100.00 33.963 31.663 98.873 446 0.0000 43.268 79.785 17.282 16.401 59.347 447 0.0000 85.382 100.00 43.623 57.644 103.38 448 17.663 84.823 100.00 44.332 57.470 103.31 449 38.400 100.00 100.00 59.255 81.515 107.16 450 59.624 100.00 100.00 67.104 85.562 107.53 451 42.298 0.0000 23.879 7.9370 4.4806 5.6633 452 44.066 26.185 38.714 11.853 9.2686 13.646 453 57.369 57.849 100.00 41.068 35.041 99.151 454 100.00 84.326 100.00 83.769 77.328 105.06 455 90.126 8.5464 18.913 34.065 18.402 5.4114 456 100.00 28.625 37.587 46.272 27.602 14.673 457 24.830 15.732 0.0000 3.8048 3.5669 1.3478 458 38.973 24.723 0.0000 7.8981 7.1722 1.8281 459 60.231 30.532 0.0000 16.804 13.137 2.5104 460 65.547 47.113 0.0000 23.475 22.482 3.9629 461 90.818 66.934 32.163 49.682 47.236 15.269 462 100.00 78.216 31.122 63.564 63.258 17.116 463 100.00 88.877 42.432 71.619 77.317 26.118 464 83.193 72.320 0.0000 44.979 48.989 7.9470 465 84.145 75.522 24.804 48.306 53.173 13.273 466 51.449 75.728 27.220 30.277 44.026 13.405 467 59.037 75.407 40.486 34.713 45.891 20.660 468 58.558 75.600 83.071 43.907 49.714 69.717 469 45.891 20.792 67.044 16.802 10.178 40.075 470 51.435 33.136 70.366 21.568 15.383 45.155 471 19.253 12.555 71.775 11.236 6.0580 45.817 472 24.844 11.177 91.805 18.194 8.7903 78.763 473 11.453 6.4725 63.117 8.0630 4.1889 34.611 474 19.845 23.804 66.014 10.997 7.7701 38.630 475 44.260 10.316 54.323 12.677 7.0439 25.561 476 50.249 28.952 56.375 17.213 12.366 28.373 477 78.544 31.830 15.508 27.956 19.197 5.0410 478 91.347 31.694 25.619 38.103 24.324 8.5503 479 54.932 12.168 13.684 12.505 7.6186 3.2382 480 57.565 13.237 38.221 15.593 9.1050 13.108 481 68.741 24.506 48.861 23.940 14.977 21.570 482 80.818 37.771 88.031 43.780 27.698 74.075 483 85.716 44.757 100.00 53.640 34.938 98.469 484 60.695 10.928 71.878 23.240 12.090 46.491 485 37.227 0.0000 44.371 8.6242 4.5888 16.805 486 37.346 0.2415 65.405 12.589 6.1887 37.492 487 89.650 8.3102 65.652 40.081 20.746 39.156 488 92.524 25.951 73.356 46.053 26.079 50.058 489 56.503 7.5768 50.985 16.628 8.9464 22.629 490 59.286 18.838 60.496 20.514 11.946 32.476 491 67.862 39.939 88.113 36.176 24.544 74.015 492 80.314 70.551 89.096 55.767 51.602 79.991 493 91.733 75.076 94.012 68.643 61.598 90.566 494 98.780 8.1407 10.941 41.173 22.077 4.0343 495 91.001 31.438 6.8178 36.921 23.742 4.0390 496 100.00 58.721 19.714 53.163 43.793 9.5318 497 53.985 22.985 80.188 23.698 13.717 59.131 498 68.258 57.895 91.314 43.264 36.586 81.877 499 9.9031 87.915 11.511 28.067 54.169 11.011 500 25.036 90.502 10.725 31.515 58.609 11.561 501 52.730 91.117 28.838 40.682 63.866 17.380 502 70.650 90.783 76.114 57.753 71.340 62.185 503 85.245 91.995 76.324 68.449 78.133 63.246 504 26.452 23.666 86.271 17.730 10.548 69.010 505 42.916 26.322 88.858 22.963 13.703 73.969 506 53.223 35.986 89.767 28.766 19.291 76.410 507 11.164 7.5678 22.771 2.4803 2.0252 5.0927 508 9.2673 49.104 26.851 9.6996 16.181 8.9627 509 26.683 91.052 65.787 38.960 62.242 47.391 510 53.631 92.243 82.706 52.280 69.840 72.553 511 68.904 100.00 86.383 66.892 86.036 81.189 512 19.022 55.771 39.291 14.126 21.764 16.305 513 48.313 65.367 52.576 27.005 34.135 28.387 514 9.8933 26.716 36.415 5.4066 6.0951 11.974 515 16.710 33.330 45.716 8.3404 9.1921 18.732 516 25.912 36.829 78.496 17.526 14.195 56.891 517 39.575 36.187 76.344 19.834 15.246 53.698 518 39.871 60.936 81.291 29.243 31.586 64.061 519 53.849 65.209 89.124 38.581 38.898 78.496 520 14.248 15.685 32.356 4.0101 3.4902 9.3280 521 77.321 39.097 34.497 30.067 22.439 12.743 522 89.610 41.920 42.092 40.676 28.861 18.155 523 90.965 92.472 65.585 70.505 80.028 48.915 524 100.00 100.00 76.340 86.951 96.738 65.887 525 11.157 45.767 8.9433 7.9018 13.838 3.9073 526 21.276 52.194 16.030 11.231 18.573 5.9196 527 21.504 80.861 86.843 37.431 50.783 76.746 528 48.856 90.062 100.00 55.106 68.270 104.83 529 0.0000 50.217 60.540 14.455 18.619 34.131 530 6.9863 52.220 71.800 18.042 21.164 48.410 531 86.672 43.053 18.126 36.517 27.415 6.8107 532 88.869 51.323 30.464 41.613 33.685 12.249 533 100.00 55.385 63.575 57.761 43.564 40.131 534 42.464 5.5187 12.601 7.5733 4.5913 2.7096 535 87.064 20.285 53.739 36.506 20.576 26.359 536 86.578 30.606 62.799 39.449 24.105 36.432 537 89.652 59.288 87.591 57.092 44.695 75.867 538 57.104 24.392 27.837 15.510 10.899 8.0473 539 82.104 23.553 26.869 29.787 18.101 8.2828 540 86.102 26.112 40.797 34.529 20.914 16.056 541 91.347 46.334 66.851 47.909 33.896 42.773 542 92.046 76.785 76.720 64.151 61.365 60.829 543 12.528 73.721 66.118 26.444 39.724 44.113 544 23.829 80.761 72.869 33.485 49.147 54.485 545 82.613 53.754 0.0000 36.369 32.396 5.1976 546 86.966 60.906 19.050 42.950 39.866 9.1244 547 55.665 44.573 8.2704 18.090 18.581 4.2006 548 58.171 69.331 10.071 28.859 38.386 7.6986 549 73.814 79.447 10.814 42.839 53.787 10.048 550 82.143 89.246 26.705 55.553 69.603 16.800 551 88.756 91.859 51.704 65.466 77.097 33.857 552 46.715 63.653 36.967 23.409 31.388 16.234 553 47.698 90.957 41.680 40.039 63.206 24.532 554 50.217 100.00 54.550 49.848 78.197 37.557 555 9.6222 66.546 11.622 15.788 29.636 6.9410 556 32.294 75.133 53.702 27.515 41.720 30.879 557 79.463 74.605 54.267 48.137 51.909 32.299 558 86.821 78.540 65.595 58.084 60.075 45.730 559 72.718 60.417 52.704 36.651 35.881 28.334 560 80.956 65.230 62.633 46.141 43.678 39.666 561 40.450 19.319 15.468 8.0230 6.2084 3.5747 562 43.850 26.633 26.100 10.624 8.8775 7.2033 563 57.826 36.783 34.169 18.648 15.757 11.876 564 63.117 62.720 43.131 30.762 34.478 20.499 565 57.072 60.363 75.045 33.434 33.603 54.607 566 71.664 64.093 80.812 44.357 41.437 64.394 567 0.0000 58.472 18.795 12.184 22.521 7.3267 568 10.409 63.739 25.926 15.298 27.383 10.461 569 12.496 67.884 77.798 26.537 34.982 59.353 570 14.777 39.720 63.986 12.975 13.294 37.133 571 20.128 54.335 68.243 19.011 22.883 43.942 572 44.604 60.759 68.459 27.051 30.758 45.318 573 2.4631 89.913 30.212 30.224 57.199 17.270 574 31.051 90.225 34.019 33.937 59.395 19.413 575 7.9487 10.109 91.790 16.365 7.7561 78.630 576 53.728 14.923 100.00 29.774 14.790 95.837 577 69.059 46.650 100.00 43.147 30.350 98.136 578 43.564 11.016 38.344 10.087 6.0473 12.884 579 55.215 22.702 46.474 16.602 10.882 19.217 580 62.583 89.787 52.647 47.279 65.521 33.443 581 16.137 92.604 28.458 32.826 61.408 17.152 582 20.147 92.371 50.793 35.897 62.419 31.766 583 0.0000 60.069 82.994 24.027 28.298 66.501 584 25.996 62.557 86.245 28.388 31.992 72.541 585 37.364 70.795 91.286 36.497 41.761 83.178 586 65.535 9.8965 29.046 18.377 10.336 8.3146 587 89.600 8.5783 35.016 34.907 18.693 12.053 588 89.865 7.0396 47.783 36.723 19.334 20.843 589 91.112 1.7587 90.823 48.469 23.885 78.227 590 68.977 1.8641 70.031 26.767 13.434 44.057 591 72.553 18.591 81.053 32.947 17.704 60.801 592 100.00 37.281 85.257 58.340 35.146 69.854 593 15.799 100.00 17.653 37.752 72.441 15.315 594 30.448 100.00 50.766 43.440 74.971 33.767 595 7.1303 47.269 89.949 22.018 20.176 77.273 596 17.414 50.703 100.00 27.727 24.305 97.781 597 73.067 6.7838 88.937 35.028 17.262 74.164 598 88.436 27.423 90.150 48.190 26.909 77.567 599 14.441 81.279 41.473 26.467 46.714 21.921 600 33.745 86.856 48.061 34.043 55.812 28.253 601 16.260 45.906 77.954 18.410 18.157 56.773 602 22.872 50.627 89.012 24.256 22.958 75.968 603 34.629 48.435 87.347 25.241 22.478 72.820 604 46.179 53.173 92.155 31.870 28.052 82.427 605 14.171 19.270 54.242 7.3831 5.3855 25.442 606 28.324 31.901 59.551 12.201 10.489 31.598 607 27.702 63.944 73.471 25.442 31.831 52.418 608 32.764 74.627 79.776 33.599 43.720 63.748 609 43.742 82.239 87.415 43.480 55.138 78.284 610 52.604 16.386 0.0000 11.568 7.6543 1.7279 611 67.057 17.327 9.6023 18.693 11.437 2.9650 612 70.324 37.944 7.6094 23.810 18.995 3.9005 613 79.868 100.00 50.273 64.839 86.013 34.339 614 40.168 89.613 16.758 34.508 59.202 12.708 615 65.702 100.00 16.901 52.730 80.168 15.830 616 33.214 63.168 0.0000 17.314 28.159 5.3832 617 45.827 65.565 14.402 22.287 32.295 7.6305 618 100.00 69.379 83.675 69.318 57.922 70.975 619 56.109 37.361 47.890 19.790 16.334 21.243 620 62.005 37.553 60.385 24.875 18.756 33.438 621 77.630 40.451 70.490 36.994 25.767 46.513 622 89.528 44.854 80.971 49.858 33.813 62.887 623 29.564 7.2045 37.766 6.2275 3.7787 12.293 624 38.410 23.261 50.673 11.483 8.2717 22.494 625 47.558 47.967 78.254 26.043 23.008 57.768 626 57.757 47.834 89.962 33.909 26.564 77.904 627 29.827 44.641 58.006 15.180 16.514 30.959 628 37.178 55.613 57.891 20.465 24.600 32.121 629 41.242 72.804 64.121 30.690 41.239 41.755 630 81.492 10.563 8.5103 27.227 15.080 3.0734 631 85.993 21.546 11.303 31.575 18.743 3.9543 632 91.646 70.539 7.6695 50.752 50.584 8.5859 633 100.00 73.846 15.903 60.089 57.942 10.916 634 32.833 56.645 9.9796 14.715 22.804 5.4226 635 45.970 56.589 23.850 19.042 24.929 9.0152 636 76.775 66.660 41.822 40.320 42.089 20.539 637 89.645 73.048 43.493 53.142 53.442 23.243 638 69.705 75.170 29.369 38.968 48.026 14.650 639 78.977 79.819 38.903 48.462 56.780 21.008 640 92.121 80.662 54.105 61.209 63.840 33.758 641 45.053 43.700 0.0000 13.660 15.950 3.2190 642 66.509 55.531 9.6404 27.015 28.521 5.8298 643 75.721 60.790 27.714 35.519 35.896 11.767 644 55.781 26.389 12.345 14.341 10.825 3.5105 645 68.519 28.523 35.750 22.660 15.426 12.482 646 87.257 13.647 77.393 41.586 21.642 55.368 647 89.573 14.700 90.654 47.781 24.460 78.056 648 12.184 76.572 26.595 21.968 40.453 12.898 649 17.790 78.221 54.533 27.032 44.055 32.151 650 38.094 84.987 62.067 36.523 54.959 41.700 651 55.207 85.698 70.490 44.928 59.751 52.656 652 57.765 85.386 91.049 52.167 62.449 85.899 653 72.837 89.617 90.555 62.864 72.225 86.296 654 38.302 13.677 3.5419 6.5922 4.7555 1.6872 655 46.055 34.714 10.662 12.018 11.849 3.5520 656 76.924 50.252 14.588 31.573 28.095 6.3694 657 79.050 67.736 11.952 39.983 42.953 8.2933 658 87.758 85.459 15.903 56.559 66.411 12.737 659 90.999 87.466 34.654 61.859 70.965 20.522 660 100.00 87.945 63.713 74.788 77.564 45.960 661 13.018 19.399 4.0584 2.7901 3.5592 1.6940 662 27.982 27.515 6.5961 5.8759 6.7359 2.3683 663 34.017 31.135 17.721 8.1369 8.7756 4.6025 664 57.392 40.721 20.970 18.330 17.111 6.5894 665 88.059 40.821 55.067 41.232 28.486 28.918 666 24.554 0.0000 17.268 3.4559 2.2142 3.4682 667 33.321 11.213 27.189 6.2052 4.1907 6.9711 668 59.805 0.0000 18.826 14.442 7.8695 4.3878 669 70.196 5.8333 18.534 20.086 11.030 4.6217 670 77.537 12.280 25.903 25.452 14.227 7.3777 671 100.00 15.089 30.767 43.909 24.006 10.404 672 100.00 87.535 84.156 80.106 79.247 75.335 673 7.8362 63.751 42.273 16.845 27.993 19.369 674 18.219 64.918 50.299 19.429 29.969 25.935 675 28.064 64.923 60.748 22.885 31.525 36.410 676 9.5133 45.024 41.708 10.022 14.328 16.697 677 25.196 54.717 51.230 16.358 22.132 25.407 678 54.932 74.810 61.272 36.078 45.697 39.035 679 66.472 80.781 66.851 46.385 55.992 47.117 680 21.441 40.814 32.477 8.9898 12.227 10.814 681 26.393 43.524 45.104 12.004 14.669 19.126 682 66.561 46.270 46.281 27.006 23.552 20.962 683 81.329 51.673 58.289 40.064 32.602 33.050 684 89.203 62.343 73.601 53.734 45.366 53.725 685 28.136 12.163 16.116 4.5107 3.4847 3.3810 686 31.988 10.975 60.590 10.636 5.9051 31.933 687 35.018 39.412 93.605 25.047 18.387 83.724 688 31.560 1.4489 84.995 16.722 7.7348 66.304 689 42.190 12.242 89.985 21.630 10.738 75.539 690 53.600 2.0404 89.330 25.054 11.885 74.372 691 62.526 15.798 89.829 30.015 15.469 75.722 692 70.327 27.071 91.951 36.363 20.655 80.374 693 25.696 20.325 37.946 6.5264 5.3968 12.700 694 28.811 30.812 45.472 9.6117 9.1427 18.467 695 38.444 57.752 45.458 19.478 25.559 21.106 696 48.832 85.003 53.537 38.246 56.059 32.925 697 47.593 93.137 64.017 45.551 67.924 46.000 698 35.645 42.763 7.2765 10.793 14.079 3.5994 699 57.467 54.012 18.743 22.316 25.228 7.3012 700 57.593 81.448 16.469 35.560 51.805 11.155 701 49.583 80.882 0.0000 31.494 49.243 8.7062 702 65.030 89.845 24.714 45.192 64.897 15.666 703 74.655 89.647 46.243 52.980 68.436 28.228 704 36.112 64.847 25.766 19.729 30.411 10.750 705 39.416 79.586 32.209 28.903 46.573 16.259 706 22.698 71.371 10.602 19.478 35.084 7.6349 707 42.370 76.707 9.4873 26.749 43.132 8.6427 708 51.947 91.180 8.9755 39.358 63.372 11.816 709 70.489 90.872 5.1692 48.144 67.587 11.753 710 75.537 91.223 16.631 51.842 69.824 13.815 711 10.596 10.714 43.760 4.7163 3.1706 16.285 712 9.9108 9.6096 79.570 12.399 6.1394 57.284 713 10.844 22.084 90.585 17.160 9.7807 76.706 714 12.322 36.499 92.589 20.459 15.059 81.353 715 0.0000 17.273 71.300 10.234 6.1225 45.230 716 8.2599 27.477 70.989 11.740 8.8067 45.246 717 15.422 29.880 81.602 15.695 11.089 61.323 718 10.615 88.187 79.302 38.656 58.707 65.627 719 6.8328 88.350 91.349 42.526 60.407 86.579 720 15.207 96.333 90.167 48.474 72.111 86.310 721 9.6699 31.086 25.403 5.1145 7.1500 6.8896 722 7.5026 31.160 54.503 8.6823 8.5846 26.242 723 40.520 37.338 56.553 15.646 14.014 28.954 724 49.691 45.282 64.183 22.351 20.332 38.233 725 66.972 49.897 62.756 31.409 27.149 37.394 726 74.956 89.480 62.696 56.094 69.518 44.203 727 11.118 32.702 12.242 4.8236 7.5319 3.3581 728 22.500 39.689 18.711 7.8416 11.335 5.3731 729 35.787 44.985 21.238 11.997 15.553 6.7056 730 46.582 42.688 28.335 15.068 16.132 9.2946 731 68.297 51.084 31.546 27.705 26.383 12.094 732 88.448 57.214 47.569 45.506 38.630 23.930 733 93.451 64.161 57.703 54.309 47.287 34.521 734 7.3540 89.094 50.300 32.384 57.173 30.505 735 9.4742 91.063 67.312 37.345 61.380 49.216 736 30.901 91.105 89.928 46.881 65.566 84.686 737 8.8318 73.435 90.655 33.292 42.188 82.242 738 68.198 77.078 90.861 52.306 54.979 84.097 739 83.123 83.017 100.00 68.976 68.464 104.13 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 47.3607 100.000 25.6130 21.6292 97.3763 2 100.000 0.00000 79.3514 52.4258 26.2898 58.7215 3 0.00000 0.00000 58.9971 6.48583 3.19399 29.8944 4 100.000 66.6593 0.00000 56.0588 50.5054 7.65614 5 0.00000 35.6011 0.00000 4.68562 8.37021 2.22855 6 84.4444 0.00000 0.00000 28.8428 15.3558 2.30466 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 100.000 100.000 54.2763 78.9478 106.931 2 100.000 0.00000 100.000 59.7013 29.1995 97.0422 3 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 4 100.000 100.000 0.00000 77.2354 92.8527 14.7151 5 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 6 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/verify_xxxl.ti10000644000076500000000000013700612665102037021216 0ustar devwheel00000000000000CTI1 ORIGINATOR "Argyll targen" KEYWORD "OFPS_PATCHES" OFPS_PATCHES "700" CREATED "Thu May 21 22:45:49 2015" KEYWORD "COMP_GREY_STEPS" COMP_GREY_STEPS "41" KEYWORD "BLACK_COLOR_PATCHES" BLACK_COLOR_PATCHES "1" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "MULTI_DIM_STEPS" MULTI_DIM_STEPS "2" KEYWORD "WHITE_COLOR_PATCHES" WHITE_COLOR_PATCHES "1" KEYWORD "SINGLE_DIM_STEPS" SINGLE_DIM_STEPS "21" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 989 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 3 2.5000 2.5000 2.5000 1.1821 1.1916 1.2087 4 5.0000 5.0000 5.0000 1.3704 1.3897 1.4245 5 7.5000 7.5000 7.5000 1.6184 1.6506 1.7087 6 10.000 10.000 10.000 1.9432 1.9923 2.0809 7 12.500 12.500 12.500 2.3504 2.4206 2.5476 8 15.000 15.000 15.000 2.8451 2.9411 3.1145 9 17.500 17.500 17.500 3.4320 3.5585 3.7870 10 20.000 20.000 20.000 4.1154 4.2774 4.5701 11 22.500 22.500 22.500 4.8994 5.1021 5.4686 12 25.000 25.000 25.000 5.7878 6.0367 6.4867 13 27.500 27.500 27.500 6.7843 7.0850 7.6286 14 30.000 30.000 30.000 7.8923 8.2507 8.8984 15 32.500 32.500 32.500 9.1151 9.5371 10.300 16 35.000 35.000 35.000 10.456 10.948 11.836 17 37.500 37.500 37.500 11.918 12.486 13.512 18 40.000 40.000 40.000 13.504 14.154 15.329 19 42.500 42.500 42.500 15.216 15.956 17.292 20 45.000 45.000 45.000 17.059 17.894 19.403 21 47.500 47.500 47.500 19.033 19.971 21.666 22 50.000 50.000 50.000 21.143 22.190 24.083 23 52.500 52.500 52.500 23.389 24.554 26.658 24 55.000 55.000 55.000 25.776 27.064 29.392 25 57.500 57.500 57.500 28.304 29.724 32.290 26 60.000 60.000 60.000 30.977 32.536 35.353 27 62.500 62.500 62.500 33.797 35.502 38.585 28 65.000 65.000 65.000 36.766 38.626 41.987 29 67.500 67.500 67.500 39.886 41.908 45.562 30 70.000 70.000 70.000 43.159 45.351 49.313 31 72.500 72.500 72.500 46.587 48.958 53.242 32 75.000 75.000 75.000 50.173 52.730 57.351 33 77.500 77.500 77.500 53.918 56.669 61.643 34 80.000 80.000 80.000 57.824 60.779 66.119 35 82.500 82.500 82.500 61.894 65.060 70.783 36 85.000 85.000 85.000 66.128 69.515 75.636 37 87.500 87.500 87.500 70.530 74.146 80.680 38 90.000 90.000 90.000 75.101 78.954 85.918 39 92.500 92.500 92.500 79.842 83.942 91.351 40 95.000 95.000 95.000 84.755 89.111 96.982 41 97.500 97.500 97.500 89.843 94.463 102.81 42 5.0000 0.0000 0.0000 1.1607 1.0829 1.0075 43 10.000 0.0000 0.0000 1.4092 1.2110 1.0192 44 15.000 0.0000 0.0000 1.8005 1.4128 1.0375 45 20.000 0.0000 0.0000 2.3517 1.6969 1.0633 46 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 47 30.000 0.0000 0.0000 3.9904 2.5418 1.1401 48 35.000 0.0000 0.0000 5.1027 3.1154 1.1922 49 40.000 0.0000 0.0000 6.4250 3.7972 1.2542 50 45.000 0.0000 0.0000 7.9675 4.5924 1.3265 51 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 52 55.000 0.0000 0.0000 11.749 6.5425 1.5037 53 60.000 0.0000 0.0000 14.006 7.7061 1.6095 54 65.000 0.0000 0.0000 16.518 9.0010 1.7271 55 70.000 0.0000 0.0000 19.291 10.431 1.8571 56 75.000 0.0000 0.0000 22.335 12.000 1.9997 57 80.000 0.0000 0.0000 25.654 13.712 2.1553 58 85.000 0.0000 0.0000 29.257 15.570 2.3241 59 90.000 0.0000 0.0000 33.150 17.577 2.5065 60 95.000 0.0000 0.0000 37.339 19.737 2.7028 61 100.00 0.0000 0.0000 41.830 22.052 2.9132 62 0.0000 5.0000 0.0000 1.1394 1.2787 1.0465 63 0.0000 10.000 0.0000 1.3549 1.7096 1.1183 64 0.0000 15.000 0.0000 1.6942 2.3882 1.2314 65 0.0000 20.000 0.0000 2.1721 3.3438 1.3907 66 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 67 0.0000 30.000 0.0000 3.5930 6.1854 1.8644 68 0.0000 35.000 0.0000 4.5576 8.1141 2.1859 69 0.0000 40.000 0.0000 5.7042 10.407 2.5681 70 0.0000 45.000 0.0000 7.0417 13.082 3.0139 71 0.0000 50.000 0.0000 8.5782 16.154 3.5261 72 0.0000 55.000 0.0000 10.321 19.640 4.1071 73 0.0000 60.000 0.0000 12.278 23.553 4.7594 74 0.0000 65.000 0.0000 14.456 27.908 5.4854 75 0.0000 70.000 0.0000 16.861 32.718 6.2871 76 0.0000 75.000 0.0000 19.500 37.995 7.1667 77 0.0000 80.000 0.0000 22.379 43.751 8.1263 78 0.0000 85.000 0.0000 25.503 49.999 9.1677 79 0.0000 90.000 0.0000 28.878 56.749 10.293 80 0.0000 95.000 0.0000 32.511 64.013 11.504 81 0.0000 100.00 0.0000 36.405 71.801 12.802 82 0.0000 0.0000 5.0000 1.0703 1.0281 1.3705 83 0.0000 0.0000 10.000 1.1791 1.0716 1.9434 84 0.0000 0.0000 15.000 1.3504 1.1401 2.8456 85 0.0000 0.0000 20.000 1.5916 1.2366 4.1161 86 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 87 0.0000 0.0000 30.000 2.3089 1.5235 7.8939 88 0.0000 0.0000 35.000 2.7957 1.7182 10.458 89 0.0000 0.0000 40.000 3.3745 1.9497 13.507 90 0.0000 0.0000 45.000 4.0496 2.2197 17.063 91 0.0000 0.0000 50.000 4.8252 2.5298 21.147 92 0.0000 0.0000 55.000 5.7050 2.8817 25.782 93 0.0000 0.0000 60.000 6.6928 3.2768 30.984 94 0.0000 0.0000 65.000 7.7920 3.7164 36.774 95 0.0000 0.0000 70.000 9.0060 4.2019 43.169 96 0.0000 0.0000 75.000 10.338 4.7346 50.184 97 0.0000 0.0000 80.000 11.791 5.3157 57.838 98 0.0000 0.0000 85.000 13.368 5.9464 66.144 99 0.0000 0.0000 90.000 15.072 6.6279 75.118 100 0.0000 0.0000 95.000 16.905 7.3611 84.775 101 0.0000 0.0000 100.00 18.871 8.1473 95.129 102 0.0000 5.0000 5.0000 1.2097 1.3068 1.4169 103 0.0000 10.000 10.000 1.5340 1.7813 2.0617 104 0.0000 15.000 15.000 2.0446 2.5283 3.0769 105 0.0000 20.000 20.000 2.7637 3.5804 4.5068 106 0.0000 25.000 25.000 3.7105 4.9657 6.3893 107 0.0000 30.000 30.000 4.9019 6.7088 8.7583 108 0.0000 35.000 35.000 6.3533 8.8323 11.644 109 0.0000 40.000 40.000 8.0787 11.357 15.075 110 0.0000 45.000 45.000 10.091 14.301 19.077 111 0.0000 50.000 50.000 12.403 17.684 23.674 112 0.0000 55.000 55.000 15.026 21.522 28.889 113 0.0000 60.000 60.000 17.971 25.830 34.744 114 0.0000 65.000 65.000 21.248 30.625 41.260 115 0.0000 70.000 70.000 24.867 35.920 48.456 116 0.0000 75.000 75.000 28.838 41.729 56.351 117 0.0000 80.000 80.000 33.170 48.067 64.964 118 0.0000 85.000 85.000 37.871 54.945 74.312 119 0.0000 90.000 90.000 42.950 62.377 84.411 120 0.0000 95.000 95.000 48.416 70.374 95.279 121 0.0000 100.00 100.00 54.276 78.948 106.93 122 5.0000 0.0000 5.0000 1.2310 1.1110 1.3780 123 10.000 0.0000 10.000 1.5884 1.2826 1.9626 124 15.000 0.0000 15.000 2.1509 1.5529 2.8831 125 20.000 0.0000 20.000 2.9433 1.9335 4.1795 126 25.000 0.0000 25.000 3.9865 2.4347 5.8863 127 30.000 0.0000 30.000 5.2992 3.0653 8.0340 128 35.000 0.0000 35.000 6.8984 3.8335 10.650 129 40.000 0.0000 40.000 8.7995 4.7468 13.761 130 45.000 0.0000 45.000 11.017 5.8121 17.389 131 50.000 0.0000 50.000 13.564 7.0358 21.557 132 55.000 0.0000 55.000 16.454 8.4242 26.285 133 60.000 0.0000 60.000 19.699 9.9829 31.594 134 65.000 0.0000 65.000 23.310 11.717 37.501 135 70.000 0.0000 70.000 27.297 13.633 44.026 136 75.000 0.0000 75.000 31.673 15.735 51.184 137 80.000 0.0000 80.000 36.445 18.028 58.993 138 85.000 0.0000 85.000 41.625 20.516 67.468 139 90.000 0.0000 90.000 47.222 23.205 76.625 140 95.000 0.0000 95.000 53.244 26.098 86.478 141 100.00 0.0000 100.00 59.701 29.199 97.042 142 5.0000 5.0000 0.0000 1.3001 1.3615 1.0540 143 10.000 10.000 0.0000 1.7641 1.9206 1.1375 144 15.000 15.000 0.0000 2.4947 2.8009 1.2689 145 20.000 20.000 0.0000 3.5238 4.0408 1.4540 146 25.000 25.000 0.0000 4.8786 5.6731 1.6978 147 30.000 30.000 0.0000 6.5834 7.7272 2.0045 148 35.000 35.000 0.0000 8.6602 10.229 2.3781 149 40.000 40.000 0.0000 11.129 13.204 2.8223 150 45.000 45.000 0.0000 14.009 16.674 3.3404 151 50.000 50.000 0.0000 17.318 20.660 3.9356 152 55.000 55.000 0.0000 21.071 25.182 4.6108 153 60.000 60.000 0.0000 25.285 30.259 5.3689 154 65.000 65.000 0.0000 29.974 35.909 6.2125 155 70.000 70.000 0.0000 35.153 42.149 7.1442 156 75.000 75.000 0.0000 40.835 48.995 8.1664 157 80.000 80.000 0.0000 47.033 56.463 9.2815 158 85.000 85.000 0.0000 53.760 64.569 10.492 159 90.000 90.000 0.0000 61.029 73.326 11.799 160 95.000 95.000 0.0000 68.850 82.749 13.206 161 100.00 100.00 0.0000 77.235 92.853 14.715 162 100.00 5.0000 5.0000 42.040 22.359 3.3302 163 100.00 10.000 10.000 42.364 22.833 3.9750 164 100.00 15.000 15.000 42.875 23.580 4.9902 165 100.00 20.000 20.000 43.594 24.633 6.4200 166 100.00 25.000 25.000 44.541 26.018 8.3026 167 100.00 30.000 30.000 45.732 27.761 10.671 168 100.00 35.000 35.000 47.183 29.884 13.557 169 100.00 40.000 40.000 48.909 32.409 16.988 170 100.00 45.000 45.000 50.922 35.354 20.990 171 100.00 50.000 50.000 53.233 38.736 25.587 172 100.00 55.000 55.000 55.856 42.574 30.802 173 100.00 60.000 60.000 58.801 46.882 36.657 174 100.00 65.000 65.000 62.078 51.677 43.173 175 100.00 70.000 70.000 65.697 56.972 50.369 176 100.00 75.000 75.000 69.668 62.782 58.264 177 100.00 80.000 80.000 74.000 69.119 66.877 178 100.00 85.000 85.000 78.701 75.998 76.225 179 100.00 90.000 90.000 83.781 83.429 86.324 180 100.00 95.000 95.000 89.246 91.426 97.192 181 5.0000 100.00 5.0000 36.636 71.912 13.180 182 10.000 100.00 10.000 36.994 72.083 13.764 183 15.000 100.00 15.000 37.556 72.353 14.685 184 20.000 100.00 20.000 38.349 72.734 15.981 185 25.000 100.00 25.000 39.392 73.235 17.688 186 30.000 100.00 30.000 40.704 73.866 19.836 187 35.000 100.00 35.000 42.304 74.634 22.452 188 40.000 100.00 40.000 44.205 75.547 25.563 189 45.000 100.00 45.000 46.422 76.613 29.191 190 50.000 100.00 50.000 48.970 77.836 33.359 191 55.000 100.00 55.000 51.860 79.225 38.087 192 60.000 100.00 60.000 55.104 80.783 43.396 193 65.000 100.00 65.000 58.715 82.518 49.303 194 70.000 100.00 70.000 62.703 84.434 55.828 195 75.000 100.00 75.000 67.078 86.535 62.986 196 80.000 100.00 80.000 71.851 88.828 70.795 197 85.000 100.00 85.000 77.031 91.317 79.270 198 90.000 100.00 90.000 82.627 94.005 88.427 199 95.000 100.00 95.000 88.650 96.898 98.280 200 5.0000 5.0000 100.00 19.171 8.5088 95.183 201 10.000 10.000 100.00 19.635 9.0679 95.266 202 15.000 15.000 100.00 20.366 9.9482 95.398 203 20.000 20.000 100.00 21.395 11.188 95.583 204 25.000 25.000 100.00 22.750 12.820 95.827 205 30.000 30.000 100.00 24.455 14.875 96.133 206 35.000 35.000 100.00 26.531 17.377 96.507 207 40.000 40.000 100.00 29.000 20.352 96.951 208 45.000 45.000 100.00 31.880 23.822 97.469 209 50.000 50.000 100.00 35.189 27.808 98.065 210 55.000 55.000 100.00 38.942 32.330 98.740 211 60.000 60.000 100.00 43.156 37.407 99.498 212 65.000 65.000 100.00 47.845 43.057 100.34 213 70.000 70.000 100.00 53.024 49.296 101.27 214 75.000 75.000 100.00 58.706 56.142 102.30 215 80.000 80.000 100.00 64.904 63.610 103.41 216 85.000 85.000 100.00 71.631 71.716 104.62 217 90.000 90.000 100.00 78.900 80.473 105.93 218 95.000 95.000 100.00 86.721 89.897 107.34 219 5.0000 100.00 100.00 54.437 79.031 106.94 220 10.000 100.00 100.00 54.686 79.159 106.95 221 15.000 100.00 100.00 55.077 79.361 106.97 222 20.000 100.00 100.00 55.628 79.645 106.99 223 25.000 100.00 100.00 56.354 80.019 107.03 224 30.000 100.00 100.00 57.267 80.490 107.07 225 35.000 100.00 100.00 58.379 81.063 107.12 226 40.000 100.00 100.00 59.701 81.745 107.19 227 45.000 100.00 100.00 61.244 82.540 107.26 228 50.000 100.00 100.00 63.016 83.454 107.34 229 55.000 100.00 100.00 65.026 84.490 107.43 230 60.000 100.00 100.00 67.283 85.654 107.54 231 65.000 100.00 100.00 69.794 86.949 107.66 232 70.000 100.00 100.00 72.568 88.379 107.79 233 75.000 100.00 100.00 75.611 89.948 107.93 234 80.000 100.00 100.00 78.931 91.660 108.09 235 85.000 100.00 100.00 82.534 93.517 108.25 236 90.000 100.00 100.00 86.426 95.525 108.44 237 95.000 100.00 100.00 90.615 97.684 108.63 238 100.00 5.0000 100.00 59.841 29.478 97.089 239 100.00 10.000 100.00 60.056 29.909 97.160 240 100.00 15.000 100.00 60.395 30.588 97.274 241 100.00 20.000 100.00 60.873 31.543 97.433 242 100.00 25.000 100.00 61.503 32.802 97.643 243 100.00 30.000 100.00 62.294 34.385 97.907 244 100.00 35.000 100.00 63.259 36.314 98.228 245 100.00 40.000 100.00 64.406 38.607 98.610 246 100.00 45.000 100.00 65.743 41.281 99.056 247 100.00 50.000 100.00 67.279 44.354 99.568 248 100.00 55.000 100.00 69.023 47.839 100.15 249 100.00 60.000 100.00 70.979 51.753 100.80 250 100.00 65.000 100.00 73.157 56.108 101.53 251 100.00 70.000 100.00 75.562 60.917 102.33 252 100.00 75.000 100.00 78.201 66.194 103.21 253 100.00 80.000 100.00 81.080 71.951 104.17 254 100.00 85.000 100.00 84.204 78.198 105.21 255 100.00 90.000 100.00 87.580 84.949 106.34 256 100.00 95.000 100.00 91.212 92.212 107.55 257 100.00 100.00 5.0000 77.306 92.881 15.086 258 100.00 100.00 10.000 77.414 92.924 15.659 259 100.00 100.00 15.000 77.586 92.993 16.561 260 100.00 100.00 20.000 77.827 93.089 17.831 261 100.00 100.00 25.000 78.145 93.216 19.504 262 100.00 100.00 30.000 78.544 93.376 21.609 263 100.00 100.00 35.000 79.031 93.571 24.173 264 100.00 100.00 40.000 79.610 93.802 27.222 265 100.00 100.00 45.000 80.285 94.072 30.778 266 100.00 100.00 50.000 81.061 94.383 34.863 267 100.00 100.00 55.000 81.940 94.734 39.497 268 100.00 100.00 60.000 82.928 95.129 44.700 269 100.00 100.00 65.000 84.027 95.569 50.489 270 100.00 100.00 70.000 85.241 96.055 56.884 271 100.00 100.00 75.000 86.573 96.587 63.899 272 100.00 100.00 80.000 88.026 97.168 71.553 273 100.00 100.00 85.000 89.603 97.799 79.859 274 100.00 100.00 90.000 91.307 98.481 88.833 275 100.00 100.00 95.000 93.141 99.214 98.490 276 66.667 100.00 100.00 70.689 87.410 107.70 277 100.00 66.667 100.00 73.933 57.660 101.79 278 100.00 100.00 66.667 84.419 95.726 52.553 279 66.667 33.333 33.333 22.253 16.543 11.392 280 33.333 66.667 33.333 20.565 32.022 14.469 281 33.333 33.333 66.667 15.109 12.217 40.084 282 33.333 66.667 66.667 26.125 34.246 43.756 283 66.667 33.333 66.667 27.813 18.767 40.679 284 66.667 66.667 33.333 33.268 38.572 15.064 285 100.00 0.0000 66.667 49.014 24.925 40.751 286 66.667 100.00 0.0000 52.818 80.263 13.571 287 0.0000 66.667 100.00 33.103 36.608 99.873 288 0.0000 100.00 66.667 43.589 74.674 50.640 289 66.667 0.0000 100.00 35.284 16.610 95.898 290 100.00 66.667 0.0000 56.062 50.512 7.6573 291 100.00 48.141 0.0000 48.813 36.017 5.2410 292 100.00 53.916 14.414 51.082 40.031 7.6098 293 100.00 57.120 28.339 53.121 42.765 12.433 294 100.00 64.991 39.460 57.589 49.875 19.551 295 93.317 12.024 25.821 37.341 20.333 7.8982 296 77.435 20.167 49.900 28.916 16.720 22.531 297 90.117 31.388 77.899 46.254 27.377 57.002 298 100.00 33.719 85.968 57.812 33.713 70.841 299 18.306 85.274 0.0000 26.828 50.947 9.2809 300 75.666 87.585 51.008 52.971 66.243 31.795 301 33.810 42.787 0.0000 10.245 13.819 2.9875 302 64.834 43.097 0.0000 21.940 19.974 3.5596 303 83.629 52.359 0.0000 36.616 31.792 5.0680 304 100.00 65.150 0.0000 55.355 49.098 7.4216 305 100.00 71.088 14.364 58.570 55.008 10.096 306 81.291 36.997 0.0000 30.551 22.163 3.5287 307 82.963 50.086 12.947 35.633 30.114 6.2218 308 0.0000 14.825 85.349 14.163 7.3523 66.976 309 22.965 13.406 100.00 21.203 10.198 95.402 310 100.00 16.512 100.00 60.525 30.846 97.317 311 100.00 31.457 100.00 62.557 34.910 97.994 312 55.486 32.029 55.627 19.744 14.504 27.903 313 68.080 34.463 66.580 28.804 19.620 40.683 314 42.562 10.457 40.102 9.9550 5.9058 13.991 315 79.391 72.259 44.211 45.196 48.714 23.277 316 47.313 62.953 26.669 22.328 30.485 10.985 317 46.834 62.648 83.743 32.954 34.501 68.484 318 51.036 100.00 85.650 58.123 81.543 79.502 319 69.958 100.00 100.00 72.543 88.366 107.79 320 84.400 100.00 100.00 82.086 93.287 108.23 321 64.990 28.991 0.0000 18.932 13.837 2.5334 322 67.493 56.857 0.0000 27.890 29.740 5.1314 323 67.889 59.720 19.684 29.825 32.362 8.5459 324 74.029 65.035 56.134 40.114 40.592 32.373 325 21.534 77.660 21.652 23.244 42.074 11.363 326 21.585 91.283 57.179 36.470 61.418 37.647 327 68.974 100.00 85.597 66.671 85.952 79.811 328 85.750 100.00 85.343 77.709 91.653 79.890 329 0.0000 61.674 14.779 13.324 25.098 6.7924 330 44.797 94.761 13.308 39.517 67.326 13.268 331 72.644 100.00 13.509 56.564 82.161 15.272 332 100.00 100.00 14.731 77.575 92.989 16.503 333 100.00 100.00 30.676 78.605 93.400 21.928 334 25.657 45.379 31.042 10.741 14.989 10.542 335 27.564 79.318 55.558 29.303 46.161 33.443 336 39.443 82.324 67.794 36.523 52.291 48.118 337 0.0000 16.224 100.00 19.669 9.7428 95.395 338 13.772 25.610 100.00 21.450 12.280 95.791 339 46.343 41.132 100.00 31.282 21.952 97.140 340 0.0000 73.567 71.802 27.192 39.822 51.531 341 0.0000 85.080 83.587 37.465 54.866 71.914 342 0.0000 87.701 100.00 45.166 60.730 103.89 343 16.443 100.00 100.00 55.219 79.434 106.97 344 0.0000 86.883 47.027 30.096 53.823 27.235 345 0.0000 100.00 57.196 41.531 73.850 39.797 346 0.0000 100.00 71.747 44.863 75.183 57.350 347 18.581 100.00 72.659 46.283 75.887 58.679 348 37.392 100.00 75.322 50.542 77.999 62.681 349 68.878 0.0000 100.00 36.517 17.245 95.956 350 85.340 0.0000 100.00 47.384 22.849 96.465 351 32.921 100.00 61.321 45.993 76.053 44.428 352 49.325 100.00 66.385 52.008 79.022 50.683 353 13.697 100.00 27.275 38.169 72.585 18.525 354 27.254 100.00 30.579 40.231 73.616 20.084 355 42.062 100.00 30.694 43.810 75.460 20.307 356 56.296 100.00 36.753 49.703 78.427 23.802 357 15.901 51.591 0.0000 9.9975 17.675 3.7449 358 18.536 69.075 0.0000 17.572 32.398 6.1879 359 17.268 72.947 32.683 20.976 36.925 15.056 360 35.835 76.726 79.627 35.454 46.420 63.935 361 58.791 79.743 89.382 48.517 55.398 81.630 362 49.162 62.268 71.884 30.158 33.215 50.212 363 70.982 62.868 89.615 46.304 41.298 79.454 364 100.00 76.266 89.713 75.006 66.046 82.899 365 100.00 84.097 100.00 83.621 77.033 105.02 366 46.552 15.105 29.306 10.444 6.7677 8.1600 367 49.567 26.336 36.591 13.543 10.202 12.442 368 88.904 30.957 45.786 38.201 23.917 20.056 369 100.00 51.488 87.979 63.273 43.546 76.014 370 28.458 0.0000 26.625 4.7178 2.7978 6.5503 371 32.974 81.844 0.0000 27.129 47.867 8.6706 372 34.092 100.00 0.0000 40.291 73.804 12.984 373 51.441 100.00 0.0000 45.699 76.592 13.237 374 55.190 100.00 16.413 47.647 77.549 15.475 375 0.0000 28.580 85.818 15.989 10.756 68.350 376 0.0000 34.078 100.00 22.237 14.879 96.251 377 0.0000 48.529 100.00 25.976 22.355 97.497 378 0.0000 63.271 100.00 31.548 33.498 99.355 379 44.725 87.072 100.00 51.619 63.428 104.08 380 0.0000 100.00 14.386 36.731 71.931 14.518 381 0.0000 100.00 29.035 37.630 72.290 19.254 382 0.0000 43.280 14.736 6.8991 12.253 4.6421 383 0.0000 42.949 40.478 8.9042 12.911 15.647 384 0.0000 42.513 83.713 18.302 16.482 65.727 385 0.0000 56.739 83.835 22.967 25.747 67.476 386 0.0000 72.086 86.344 30.747 39.987 74.135 387 0.0000 100.00 86.077 49.129 76.889 79.822 388 31.962 100.00 87.553 53.030 78.843 82.603 389 14.538 100.00 85.795 49.793 77.243 79.362 390 42.197 18.855 0.0000 8.1248 6.2315 1.6346 391 56.008 33.657 11.590 15.692 13.418 3.8104 392 74.440 38.372 33.206 27.901 21.081 11.904 393 52.217 36.286 68.013 21.945 16.622 42.282 394 59.917 52.705 100.00 40.333 31.821 98.568 395 29.257 0.0000 57.761 9.0792 4.5599 28.716 396 37.305 0.0000 69.671 13.608 6.5844 42.949 397 47.983 20.157 75.676 19.713 11.312 51.953 398 49.028 47.495 78.784 26.586 23.053 58.571 399 74.005 51.616 79.638 40.508 32.184 60.938 400 49.505 52.259 0.0000 17.893 22.087 4.1807 401 55.323 53.071 17.634 20.980 24.046 6.8514 402 30.562 57.103 0.0000 14.223 22.834 4.5182 403 32.234 65.054 7.2295 18.054 29.787 6.2439 404 39.240 66.038 37.583 22.229 32.388 16.861 405 52.376 70.898 66.033 34.016 41.427 43.937 406 55.515 77.008 100.00 49.468 53.052 102.19 407 0.0000 27.967 35.406 5.0900 6.2365 11.438 408 0.0000 58.824 42.188 14.456 23.657 18.598 409 0.0000 73.755 41.700 21.414 37.674 20.598 410 0.0000 100.00 42.881 39.157 72.901 27.294 411 15.343 100.00 43.678 40.100 73.374 27.913 412 19.512 44.445 20.644 8.8022 13.682 6.3301 413 68.872 55.466 32.146 29.644 29.685 12.928 414 61.647 11.163 8.6398 15.371 9.0195 2.5444 415 63.461 17.192 54.052 21.133 12.171 25.845 416 68.351 31.786 54.400 25.858 17.615 26.981 417 13.675 0.0000 18.288 2.1827 1.5519 3.6693 418 0.0000 75.062 100.00 37.405 45.210 101.31 419 14.074 79.623 100.00 40.741 50.817 102.21 420 25.389 88.240 100.00 47.674 62.567 104.12 421 35.871 100.00 100.00 58.594 81.174 107.13 422 53.561 100.00 100.00 64.422 84.179 107.41 423 58.831 0.0000 13.857 13.761 7.5445 3.1918 424 74.999 0.0000 14.682 22.671 12.135 3.7772 425 87.705 0.0000 20.129 31.926 16.876 5.5751 426 100.00 0.0000 28.575 43.017 22.527 9.1616 427 100.00 14.660 35.570 44.354 24.128 12.916 428 100.00 22.229 48.449 46.837 26.347 22.213 429 48.534 85.472 0.0000 34.006 54.840 9.6543 430 68.861 100.00 0.0000 54.041 80.894 13.628 431 69.014 100.00 26.967 55.185 81.361 19.196 432 74.110 100.00 39.498 59.490 83.436 25.953 433 20.945 28.017 84.479 16.932 11.156 66.069 434 40.531 38.702 85.338 23.446 17.643 68.453 435 85.700 0.0000 71.197 38.099 19.167 46.140 436 100.00 0.0000 71.972 50.347 25.459 47.774 437 100.00 0.0000 57.812 47.077 24.151 30.550 438 100.00 19.298 67.818 50.388 27.228 42.581 439 100.00 32.071 71.895 53.298 31.392 48.657 440 100.00 45.870 72.745 56.847 38.128 50.953 441 100.00 77.208 75.289 70.990 65.296 59.103 442 30.299 100.00 46.708 42.759 74.695 30.342 443 63.592 100.00 71.665 59.626 82.797 57.929 444 86.871 0.0000 53.479 35.106 18.073 25.703 445 92.985 8.8506 83.192 47.693 24.150 64.784 446 70.111 0.0000 29.024 20.580 10.954 8.3079 447 72.398 0.0000 44.197 23.651 12.340 17.380 448 82.564 0.0000 85.407 39.968 19.646 68.090 449 100.00 49.218 100.00 67.026 43.846 99.484 450 0.0000 69.160 27.454 17.535 32.315 11.913 451 20.322 87.165 67.824 35.790 56.562 49.021 452 0.0000 26.887 16.703 3.5048 5.3299 3.9286 453 0.0000 36.671 26.886 5.9702 9.2591 7.8375 454 0.0000 53.130 27.743 10.762 18.734 9.7698 455 25.667 56.695 29.853 14.444 22.564 11.248 456 37.699 72.006 17.698 23.152 37.436 9.3380 457 48.494 80.480 17.439 31.308 48.731 11.023 458 77.930 85.901 38.332 51.509 64.032 21.888 459 86.661 100.00 42.824 68.667 88.118 28.637 460 39.598 68.647 0.0000 21.498 34.109 6.3114 461 60.299 76.465 12.395 33.720 46.512 9.3876 462 62.767 79.552 31.400 37.911 51.196 16.275 463 20.031 42.923 100.00 25.689 19.770 97.013 464 34.116 53.199 100.00 31.431 27.489 98.201 465 49.187 62.233 100.00 39.529 36.940 99.599 466 68.291 71.570 100.00 52.849 50.399 101.50 467 84.813 0.0000 35.127 30.927 16.221 11.847 468 100.00 0.0000 43.415 44.655 23.182 17.793 469 100.00 12.750 56.245 47.296 25.078 29.112 470 48.958 0.0000 58.721 14.780 7.4771 29.990 471 51.278 0.0000 100.00 28.101 12.906 95.561 472 63.354 16.079 100.00 34.319 17.277 96.078 473 82.178 14.279 100.00 45.697 22.924 96.569 474 31.161 43.959 46.287 13.217 15.454 20.130 475 34.727 43.845 59.544 16.350 16.750 32.580 476 100.00 51.898 60.136 55.766 40.768 35.786 477 86.438 69.512 0.0000 45.964 47.360 7.5807 478 100.00 74.851 29.494 61.513 59.388 15.713 479 100.00 100.00 46.213 80.464 94.144 31.719 480 100.00 100.00 59.157 82.754 95.060 43.782 481 27.352 13.512 0.0000 4.0620 3.4386 1.3094 482 37.821 19.962 11.433 7.2116 5.9104 2.7818 483 47.440 22.886 50.729 14.266 9.6332 22.659 484 69.509 24.434 85.978 33.420 18.804 69.264 485 85.853 40.885 100.00 52.699 32.901 98.126 486 78.929 45.066 91.299 45.517 31.267 80.703 487 83.566 61.522 91.884 54.859 44.751 83.923 488 85.462 72.099 100.00 64.416 56.771 102.12 489 9.7402 22.528 50.629 6.7935 5.7150 22.209 490 22.529 38.697 52.909 11.408 12.377 25.317 491 39.840 52.914 53.623 19.399 22.688 27.557 492 56.242 16.560 0.0000 13.115 8.4748 1.8048 493 100.00 33.982 0.0000 45.177 28.745 4.0288 494 100.00 38.707 13.049 46.496 30.941 5.8283 495 100.00 42.626 28.430 48.387 33.285 10.892 496 100.00 81.231 48.982 67.614 67.759 29.560 497 100.00 86.891 62.739 73.861 76.056 44.578 498 53.780 0.0000 26.071 12.225 6.6731 6.6822 499 56.264 0.0000 41.250 14.830 7.8378 14.876 500 62.123 0.0000 56.423 20.016 10.229 27.862 501 62.160 9.5840 63.434 21.827 11.488 35.666 502 81.418 9.8100 75.933 36.591 18.752 52.880 503 0.0000 16.557 27.702 2.9421 3.1006 7.1467 504 15.265 17.389 38.014 4.8634 4.0875 12.577 505 26.906 44.380 67.689 16.698 16.939 42.205 506 24.201 80.520 82.982 36.358 50.068 70.034 507 57.949 92.506 84.671 54.977 71.442 76.031 508 17.474 0.0000 70.134 10.092 4.7581 43.398 509 18.120 0.0000 86.156 14.875 6.6794 68.211 510 33.979 0.0000 100.00 22.730 10.137 95.310 511 44.113 18.918 100.00 26.605 13.703 95.794 512 56.135 69.519 0.0000 27.859 38.030 6.7332 513 72.862 69.303 0.0000 36.512 42.332 7.1079 514 80.491 71.167 16.748 42.878 46.966 9.9026 515 91.990 73.320 46.499 55.639 54.895 25.676 516 27.513 32.270 74.248 15.651 11.964 50.209 517 32.969 31.624 100.00 25.384 15.790 96.261 518 58.608 30.854 100.00 33.969 20.006 96.623 519 70.738 41.290 100.00 42.625 27.861 97.683 520 86.591 54.898 100.00 57.619 41.904 99.604 521 100.00 65.740 100.00 73.499 56.790 101.64 522 41.409 0.0000 32.418 8.3701 4.6227 9.3484 523 67.308 27.307 32.566 21.459 14.554 10.652 524 100.00 30.606 36.717 46.515 28.246 14.263 525 100.00 46.605 44.415 51.309 36.262 20.704 526 73.229 17.101 0.0000 22.103 13.183 2.2402 527 75.022 23.166 18.735 24.424 15.321 5.2758 528 78.473 34.647 19.332 28.650 20.362 6.1915 529 54.075 0.0000 72.772 20.089 9.8327 47.467 530 64.292 0.0000 86.289 28.941 13.927 69.102 531 100.00 0.0000 86.046 54.544 27.137 69.878 532 17.072 100.00 0.0000 37.414 72.321 12.849 533 37.343 100.00 15.521 41.473 74.370 14.982 534 74.976 100.00 55.899 62.599 84.742 39.475 535 87.395 100.00 62.784 72.782 89.829 47.347 536 100.00 100.00 73.748 86.229 96.449 62.084 537 100.00 100.00 88.047 90.627 98.208 85.248 538 100.00 17.642 0.0000 42.759 23.909 3.2228 539 100.00 84.397 0.0000 65.943 70.271 10.951 540 100.00 86.145 15.789 67.468 72.706 13.352 541 30.936 28.497 0.0000 6.5206 7.3154 1.9283 542 83.832 84.961 0.0000 52.868 64.071 10.443 543 84.597 100.00 0.0000 64.362 86.215 14.112 544 85.547 100.00 21.393 65.747 86.851 17.686 545 13.172 61.289 6.3800 13.553 25.001 5.4677 546 12.041 64.909 54.667 19.608 29.965 29.953 547 40.366 68.364 68.839 29.293 37.030 46.904 548 0.0000 47.218 54.532 12.316 16.242 27.556 549 9.0245 56.608 64.598 17.976 23.711 39.612 550 15.831 60.717 73.786 22.461 28.205 52.323 551 32.077 0.0000 82.928 16.127 7.4463 62.782 552 44.463 21.279 87.367 22.268 12.400 71.065 553 80.490 27.947 100.00 46.114 25.529 97.049 554 27.473 0.0000 41.760 6.1056 3.3316 14.817 555 36.448 22.410 56.524 11.914 8.2100 28.001 556 46.602 31.397 77.339 21.357 14.561 54.984 557 66.518 86.437 100.00 60.650 67.456 104.38 558 84.108 86.298 100.00 71.820 73.077 104.87 559 61.573 68.116 50.427 33.593 39.509 27.142 560 100.00 71.224 62.771 64.603 57.532 41.528 561 14.626 18.730 0.0000 2.8027 3.4682 1.3815 562 17.501 35.464 0.0000 5.7115 8.8555 2.2682 563 29.406 42.104 15.781 9.4982 13.119 4.9011 564 47.699 43.162 33.290 16.041 16.771 11.740 565 79.721 51.975 45.631 36.845 31.350 21.442 566 88.373 53.198 63.676 47.010 36.838 39.519 567 0.0000 16.193 70.656 9.9692 5.8590 44.319 568 0.0000 59.777 70.229 20.251 26.595 47.205 569 20.501 70.169 85.451 30.880 38.625 72.308 570 40.752 73.687 100.00 42.298 46.620 101.32 571 72.268 59.033 100.00 49.392 40.035 99.677 572 41.835 0.0000 15.424 7.3331 4.2228 3.2179 573 100.00 0.0000 13.524 42.123 22.169 4.4557 574 100.00 26.793 18.729 44.419 26.393 6.3580 575 100.00 87.663 35.742 69.975 75.334 21.549 576 0.0000 86.197 28.135 27.438 52.029 15.486 577 24.596 86.246 32.731 29.896 53.297 17.771 578 43.133 86.259 40.930 35.187 55.930 22.870 579 53.986 88.051 63.614 44.331 61.969 44.438 580 0.0000 16.138 42.145 4.4424 3.6410 15.232 581 0.0000 17.771 56.370 6.9057 4.8673 27.463 582 7.7183 9.0984 37.594 3.6708 2.5921 12.093 583 15.662 0.0000 100.00 19.735 8.5928 95.169 584 15.395 60.035 100.00 31.002 31.162 98.933 585 27.474 69.341 100.00 36.907 40.497 100.42 586 0.0000 32.441 52.081 8.2201 8.7536 24.022 587 0.0000 44.505 68.092 14.429 15.810 42.623 588 16.868 45.259 73.661 17.073 17.327 50.329 589 27.500 50.400 79.335 21.810 21.947 59.469 590 40.131 53.144 85.617 27.683 26.141 70.353 591 89.141 53.653 86.584 54.185 40.037 73.331 592 40.862 0.0000 47.807 10.147 5.3148 19.555 593 41.288 10.928 52.868 11.526 6.5334 24.145 594 51.841 13.775 59.458 16.631 9.3023 31.035 595 78.499 56.846 69.206 42.452 36.339 46.559 596 88.100 67.775 78.087 56.620 50.404 61.190 597 90.758 70.547 89.491 63.797 55.722 81.089 598 12.974 83.671 83.470 37.144 53.359 71.444 599 47.929 83.094 86.370 45.081 56.799 76.670 600 55.237 90.069 95.172 55.749 68.828 94.938 601 63.276 10.287 29.276 17.239 9.7792 8.3702 602 63.227 13.484 41.189 18.701 10.691 15.182 603 71.970 8.3267 37.268 22.774 12.390 12.781 604 85.550 8.4982 47.566 33.384 17.712 20.528 605 84.669 47.562 54.349 40.398 30.881 28.727 606 29.876 5.7350 91.872 18.872 8.7530 78.847 607 39.422 9.7966 95.540 22.716 10.844 86.221 608 6.9954 92.621 13.371 31.282 60.733 12.441 609 18.515 100.00 14.041 37.888 72.529 14.502 610 7.7847 69.526 77.902 27.073 36.454 59.769 611 8.6999 77.590 90.754 35.632 46.822 83.199 612 13.471 89.063 97.350 45.704 62.512 98.661 613 7.4883 21.642 78.562 12.990 8.0043 56.037 614 28.289 40.796 83.824 20.546 16.970 65.890 615 39.888 46.741 94.026 28.485 23.101 85.278 616 23.709 8.6372 65.513 10.068 5.2985 37.585 617 27.258 20.714 71.456 13.100 8.1279 45.680 618 55.386 24.778 90.999 28.113 15.937 78.094 619 69.772 29.067 96.691 38.147 21.848 89.861 620 56.397 7.7743 49.255 16.302 8.8247 21.118 621 81.358 33.301 56.372 34.779 22.606 29.421 622 100.00 35.393 56.492 50.460 31.328 30.401 623 79.435 6.6408 28.083 26.608 14.364 8.2370 624 94.280 9.0303 42.414 39.710 21.099 16.934 625 0.0000 87.191 66.568 34.111 55.758 47.364 626 8.8433 94.398 73.185 41.240 66.822 57.934 627 32.726 89.319 53.699 36.441 59.427 33.824 628 42.749 91.755 61.333 42.344 64.849 42.471 629 8.1351 69.317 13.344 17.106 32.303 7.6948 630 30.762 73.092 28.833 22.820 38.031 13.332 631 41.539 77.447 32.587 28.304 44.401 16.063 632 54.880 79.666 41.175 35.402 49.878 21.857 633 22.637 44.129 5.3950 8.5831 13.501 3.4165 634 56.694 43.716 43.185 20.959 19.397 18.143 635 56.069 44.094 58.935 23.469 20.537 32.281 636 68.767 44.623 60.604 30.336 24.259 34.454 637 66.858 53.745 50.793 30.339 28.825 25.574 638 76.115 54.713 57.858 37.523 32.900 32.790 639 9.4216 84.884 5.9280 25.887 50.075 9.6140 640 16.899 90.071 15.335 30.283 57.505 12.275 641 50.574 91.062 33.885 40.265 63.538 19.808 642 63.474 93.536 43.983 49.048 70.585 27.127 643 7.6076 23.855 7.9867 3.0452 4.4785 2.2362 644 8.7640 23.922 24.684 3.8743 4.8317 6.2373 645 18.549 33.701 24.203 6.3176 8.5256 6.6459 646 34.188 40.165 25.548 10.602 12.884 7.7630 647 15.608 76.052 8.2771 21.079 39.663 8.1133 648 38.209 84.878 12.785 30.617 52.487 10.775 649 40.336 88.612 28.572 34.624 58.146 16.478 650 79.080 60.148 24.981 37.270 36.425 10.687 651 88.857 65.376 38.679 48.076 45.243 18.660 652 86.408 21.093 0.0000 31.621 18.712 2.8062 653 88.070 21.618 15.449 33.340 19.648 4.8313 654 90.875 74.222 16.983 52.373 54.261 10.868 655 90.216 79.074 37.290 56.201 60.135 20.250 656 58.699 57.691 43.026 26.514 29.192 19.627 657 62.641 76.204 63.289 40.875 49.271 41.786 658 75.457 84.916 95.241 63.072 67.438 94.421 659 24.668 15.485 88.517 17.311 8.9320 72.725 660 30.368 23.375 93.804 21.099 11.920 83.072 661 90.930 26.094 93.142 51.075 27.969 83.302 662 75.504 0.0000 60.615 28.478 14.495 32.679 663 76.168 19.868 61.623 30.280 17.116 34.220 664 88.776 20.976 71.680 41.893 23.012 47.344 665 74.693 26.885 41.337 26.765 17.078 16.091 666 77.320 39.926 47.747 31.989 23.532 21.872 667 10.144 35.509 78.947 15.559 12.736 57.414 668 16.608 42.040 87.964 20.549 17.291 73.169 669 10.132 6.4718 92.433 16.556 7.5753 79.815 670 14.205 17.011 92.856 17.700 9.1534 80.874 671 44.169 31.311 93.868 26.003 16.300 83.785 672 54.005 45.697 93.936 33.078 25.012 85.227 673 60.007 64.585 96.997 43.951 40.906 93.857 674 10.190 52.950 20.822 10.641 18.633 7.2429 675 12.520 79.801 48.839 26.483 45.270 27.265 676 43.041 84.657 52.020 35.785 54.489 31.343 677 52.578 91.928 50.856 43.962 66.100 32.108 678 64.656 91.578 59.891 51.004 69.161 41.250 679 76.302 92.024 63.026 58.835 73.597 45.229 680 79.212 100.00 73.701 69.498 87.825 61.232 681 0.0000 76.324 56.193 25.170 41.444 33.384 682 13.986 80.178 60.609 29.015 46.658 38.853 683 7.4730 84.219 73.647 34.231 52.713 56.236 684 23.305 91.693 78.447 42.217 64.214 65.168 685 9.0321 9.5689 62.834 7.9840 4.3643 34.319 686 15.517 22.529 70.434 11.438 7.6254 44.282 687 36.490 40.941 73.373 19.307 16.744 49.689 688 67.371 35.886 12.739 21.812 17.261 4.4304 689 75.948 45.220 23.692 29.866 24.849 8.3739 690 59.089 48.619 7.8626 20.835 21.799 4.6279 691 60.210 60.420 8.6043 25.702 30.717 6.1840 692 60.019 66.661 23.819 29.072 36.497 10.709 693 66.203 66.169 34.592 32.911 38.025 15.654 694 44.924 58.454 13.729 18.892 25.996 6.4579 695 48.322 70.061 46.067 28.217 38.247 23.567 696 9.3091 26.678 90.650 17.718 11.005 77.034 697 9.4326 38.262 95.465 21.741 16.193 87.155 698 43.149 9.9412 80.627 18.704 9.3798 59.259 699 58.354 19.709 81.427 25.605 14.080 61.095 700 66.684 85.293 0.0000 42.116 58.847 10.001 701 76.695 92.949 7.6757 53.539 72.584 12.686 702 0.0000 30.480 68.516 11.312 9.4082 42.100 703 18.245 34.837 69.010 13.419 11.735 43.081 704 25.258 55.282 68.204 20.102 23.964 44.042 705 44.198 37.279 22.851 12.525 12.875 6.6852 706 64.867 48.167 22.504 24.180 23.242 7.9560 707 49.075 34.587 0.0000 12.865 12.269 2.5503 708 55.872 39.423 21.640 17.374 16.134 6.6608 709 59.533 60.253 76.181 34.838 34.222 56.328 710 60.460 65.501 86.161 40.665 40.289 73.350 711 9.9906 44.366 48.461 10.845 14.362 21.805 712 8.1382 54.957 48.941 14.259 21.224 23.353 713 24.487 59.661 50.735 18.081 25.881 25.601 714 0.0000 80.514 15.081 23.042 44.512 10.093 715 32.154 82.896 22.501 28.343 49.382 12.782 716 31.711 91.478 68.867 40.994 63.656 51.465 717 53.947 93.568 74.611 50.980 70.885 60.246 718 54.151 23.208 8.6451 13.092 9.5301 2.7636 719 71.644 25.180 7.8622 22.214 14.635 3.1723 720 92.281 88.553 3.1662 61.944 72.304 11.784 721 92.106 94.580 10.883 66.278 80.932 14.064 722 77.421 61.510 8.4557 35.958 36.688 6.7775 723 90.235 62.164 4.7448 45.600 42.085 6.9291 724 90.336 62.844 16.624 46.332 42.861 8.8985 725 91.042 68.352 27.431 50.134 48.533 13.317 726 71.412 51.510 12.683 28.469 27.128 5.9742 727 89.729 54.554 23.922 42.923 36.109 9.9413 728 88.883 40.623 13.793 37.419 26.956 5.6800 729 89.345 43.757 24.872 39.215 29.045 9.1196 730 89.040 19.557 46.821 36.824 20.755 20.333 731 91.199 24.987 59.683 41.553 23.929 32.789 732 92.243 42.432 88.963 54.031 34.668 76.571 733 16.740 59.201 38.127 15.071 24.259 16.002 734 55.401 77.738 53.956 36.480 48.523 31.962 735 55.067 80.918 72.894 42.474 53.923 54.969 736 66.759 84.886 82.789 53.547 63.001 71.304 737 100.00 88.023 83.368 80.183 79.807 74.111 738 30.039 7.9284 74.977 13.582 6.7809 50.375 739 55.614 11.341 74.156 21.551 11.186 49.617 740 64.001 25.468 73.791 26.869 16.069 49.756 741 80.716 32.135 86.899 42.137 25.134 71.647 742 30.254 11.566 56.593 9.4969 5.4653 27.668 743 38.400 19.482 67.749 14.539 8.7758 40.820 744 62.120 73.619 77.859 42.940 47.789 61.054 745 70.637 74.717 88.577 51.582 52.735 79.484 746 94.645 26.413 7.2004 39.151 23.638 3.9426 747 93.699 75.132 6.2065 54.884 56.337 9.3224 748 92.951 93.291 25.011 66.736 79.668 17.494 749 92.542 94.282 53.704 70.682 82.380 36.455 750 22.651 22.880 50.024 8.0583 6.4452 21.754 751 23.415 26.295 61.522 10.833 8.3281 33.433 752 40.437 30.518 64.861 15.995 11.934 37.760 753 59.377 34.971 77.705 27.372 18.699 56.025 754 65.157 37.978 88.835 34.482 22.943 75.104 755 68.829 51.151 91.494 41.185 31.845 81.410 756 7.8928 24.228 40.142 5.3743 5.4925 14.179 757 9.8542 34.135 44.617 7.7724 9.1588 17.916 758 35.337 64.961 79.825 29.361 34.325 62.234 759 34.907 72.014 89.869 36.002 42.500 80.698 760 8.9738 39.382 33.554 7.5453 10.941 11.202 761 11.226 50.023 33.748 10.742 17.089 12.323 762 19.879 50.539 44.274 13.038 18.377 19.162 763 48.828 64.360 55.850 27.333 33.552 31.403 764 48.457 73.140 78.462 36.989 44.319 61.628 765 57.878 79.529 1.9911 34.143 49.396 8.7407 766 65.854 81.643 21.024 40.001 54.245 12.633 767 31.473 33.375 57.784 12.763 11.244 29.837 768 44.385 44.290 65.096 20.420 18.892 39.155 769 62.368 44.559 72.025 29.611 23.545 48.569 770 22.490 70.627 48.560 22.461 35.662 25.388 771 28.487 77.960 69.716 31.802 45.905 49.639 772 44.658 87.822 76.849 44.092 61.224 62.053 773 64.876 93.989 92.301 62.107 76.428 90.453 774 0.0000 62.348 56.396 18.243 27.530 31.267 775 22.444 66.602 61.786 22.958 32.696 37.797 776 65.449 87.778 71.138 51.401 65.129 54.231 777 89.584 95.933 74.041 74.106 85.459 61.020 778 23.879 34.318 8.9276 6.4650 8.8691 3.0217 779 37.138 53.063 7.1235 14.372 20.676 4.6676 780 44.543 74.548 7.9472 26.196 41.064 8.0743 781 9.2144 47.328 8.8079 8.2409 14.707 4.0395 782 20.112 55.082 12.913 11.989 20.513 5.6077 783 23.588 65.683 18.622 17.143 29.701 8.4043 784 26.416 78.479 40.937 26.287 44.141 21.068 785 82.291 79.255 53.836 52.695 58.204 32.862 786 92.563 84.922 53.033 64.058 69.300 33.648 787 67.798 69.680 9.8392 33.912 41.250 7.9519 788 70.535 71.763 22.455 37.106 44.411 11.345 789 91.890 82.315 25.496 58.438 64.335 15.155 790 74.060 2.6616 90.920 36.214 17.599 77.840 791 74.588 14.873 90.840 37.128 18.981 77.908 792 91.062 9.4430 94.286 49.975 24.926 85.010 793 71.618 12.713 69.877 28.744 15.158 44.080 794 75.595 23.030 75.607 33.757 19.067 52.608 795 89.444 56.502 75.577 52.089 40.915 55.816 796 17.422 7.3693 6.4989 2.3706 2.0325 1.6351 797 23.849 22.156 6.3583 4.4125 4.8623 2.0596 798 34.044 91.344 4.2050 33.762 60.672 11.098 799 59.874 94.966 5.8415 45.516 70.670 12.547 800 8.9325 62.581 85.005 26.089 30.871 70.293 801 12.234 67.145 94.337 31.680 36.467 88.302 802 14.512 88.950 27.342 29.990 56.113 15.804 803 33.134 91.857 38.856 36.094 62.169 22.669 804 16.970 27.484 13.126 4.4498 5.9725 3.2375 805 32.960 30.328 17.530 7.7384 8.3551 4.4938 806 69.183 46.852 39.228 27.686 24.273 16.034 807 71.299 62.789 45.260 35.609 36.987 22.309 808 86.306 65.211 53.771 48.278 44.972 30.479 809 50.583 89.257 8.5000 37.462 60.391 11.279 810 51.740 90.115 23.018 39.144 62.073 14.837 811 34.900 90.233 82.533 44.695 63.809 71.502 812 41.291 93.277 91.573 51.666 70.295 88.430 813 23.782 30.596 42.833 8.3273 8.4656 16.446 814 37.789 32.068 47.959 12.280 10.820 20.631 815 90.816 38.290 63.602 44.577 29.088 38.064 816 54.965 6.7708 33.742 13.602 7.6057 10.339 817 72.698 9.2982 52.002 25.382 13.561 23.974 818 84.603 9.9951 59.925 34.992 18.396 32.330 819 92.775 9.2316 68.660 43.422 22.452 43.114 820 48.552 8.9961 19.782 10.084 6.0650 4.5378 821 52.447 19.816 19.168 12.391 8.5195 4.7157 822 62.317 26.220 18.642 17.636 12.454 5.0546 823 65.921 35.752 25.174 21.649 17.058 7.8442 824 81.176 47.794 34.865 35.133 28.597 13.868 825 92.811 52.554 36.819 45.906 36.452 15.939 826 82.552 29.085 8.3306 30.029 19.566 3.7693 827 90.972 32.309 24.017 37.798 24.353 7.9759 828 37.438 9.3048 7.3076 6.1517 4.1149 1.9240 829 38.594 25.102 35.581 9.7053 7.9683 11.628 830 44.944 38.072 55.303 16.950 14.966 27.819 831 53.367 52.259 68.714 27.088 25.939 44.717 832 61.204 51.950 82.851 34.495 29.138 65.874 833 15.904 29.323 33.933 6.0481 7.0825 10.738 834 17.076 52.349 58.354 15.736 20.402 32.046 835 26.444 66.028 72.852 26.004 33.557 51.847 836 47.999 72.383 90.421 40.313 44.988 81.976 837 83.064 77.456 91.454 62.304 60.431 85.741 838 66.138 9.4101 18.975 17.985 10.175 4.6873 839 71.943 17.554 29.372 22.616 13.366 8.8227 840 81.082 28.644 29.967 30.078 19.347 9.8564 841 74.857 85.375 15.824 47.376 61.596 12.273 842 83.437 92.508 15.228 58.129 74.445 14.055 843 26.471 66.135 37.197 19.346 30.974 16.506 844 36.866 76.320 46.033 28.009 43.105 24.489 845 64.527 82.789 48.030 42.867 56.451 27.886 846 8.3494 25.646 62.603 9.4575 7.4488 34.571 847 7.5366 37.394 65.988 12.376 12.114 39.364 848 6.7742 50.463 75.554 18.457 20.376 53.589 849 7.8426 51.181 92.335 24.168 23.051 82.212 850 23.751 52.366 93.823 26.718 24.904 85.321 851 42.198 8.6960 63.944 13.913 7.3270 35.883 852 50.518 24.495 65.426 18.558 11.824 38.290 853 80.985 30.975 68.352 36.702 22.637 43.103 854 63.794 86.535 11.290 41.618 59.780 11.345 855 66.306 90.102 32.844 46.741 65.883 19.371 856 26.443 73.490 9.7450 21.171 37.616 7.9080 857 25.303 88.825 9.1326 30.346 56.277 10.942 858 28.626 93.587 20.974 34.825 63.569 14.690 859 62.077 93.334 21.117 45.946 69.025 15.201 860 78.088 93.309 28.796 55.810 74.020 18.525 861 39.829 49.062 16.926 14.085 18.492 5.9662 862 47.363 49.765 24.797 17.172 20.368 8.5776 863 55.864 56.592 30.831 23.426 27.127 12.116 864 37.903 20.201 24.051 7.8815 6.2233 6.0642 865 46.198 27.589 25.187 11.484 9.5495 6.9352 866 53.168 34.459 31.452 15.870 13.613 10.206 867 77.772 71.522 32.038 42.276 46.804 15.513 868 90.227 75.978 62.114 58.521 58.211 41.222 869 79.079 59.586 37.675 38.223 36.436 16.856 870 100.00 62.871 52.210 58.532 48.731 29.207 871 44.416 28.504 8.7368 10.260 9.2282 2.8663 872 74.030 42.904 6.0035 27.268 22.633 4.2514 873 76.759 77.599 7.3442 43.551 52.558 9.3092 874 79.620 81.710 26.560 48.837 58.819 15.014 875 85.930 89.311 46.865 60.685 72.052 29.013 876 58.023 21.115 29.053 15.610 10.318 8.4599 877 62.377 34.340 40.438 21.018 16.116 15.602 878 13.127 64.058 24.672 15.550 27.736 10.039 879 6.6903 64.138 34.727 16.061 27.950 14.671 880 10.089 68.517 44.766 19.555 32.663 21.946 881 24.943 77.850 93.742 38.611 48.454 89.081 882 35.146 83.795 93.959 44.378 56.785 90.810 883 33.849 70.655 58.932 26.494 37.545 35.401 884 44.233 76.543 58.968 32.559 45.374 36.632 885 68.708 0.0000 72.807 27.288 13.543 47.852 886 68.622 9.0482 80.293 29.685 14.984 59.228 887 7.9797 90.242 56.025 34.240 59.199 36.164 888 7.1374 92.341 89.207 44.590 65.731 83.510 889 23.315 92.708 90.439 46.854 67.243 85.962 890 8.3760 70.939 63.902 24.194 36.451 40.913 891 16.747 75.651 72.007 29.361 42.629 52.242 892 48.743 61.785 3.4583 21.350 29.341 5.6496 893 51.450 68.403 15.670 25.744 36.076 8.4520 894 51.989 75.102 26.975 30.123 43.434 13.198 895 15.108 52.218 83.558 22.037 22.826 66.494 896 24.560 59.934 85.581 26.817 29.556 70.996 897 34.312 61.301 92.381 31.689 32.644 83.756 898 0.0000 13.257 14.566 1.8937 2.2546 2.9400 899 30.238 54.434 18.336 13.655 20.992 6.8304 900 35.880 62.904 24.481 18.708 28.604 9.9701 901 37.712 63.310 49.527 22.235 30.356 25.194 902 31.995 54.302 42.676 16.198 21.975 18.527 903 42.922 54.702 64.890 23.277 25.374 40.007 904 7.9353 8.2029 48.666 5.1625 3.1207 20.106 905 19.507 9.5350 48.715 6.2357 3.7708 20.216 906 52.209 37.120 86.063 27.338 19.076 69.786 907 14.645 0.0000 35.317 3.5974 2.1276 10.673 908 22.576 10.104 37.819 5.1738 3.4431 12.316 909 32.173 10.726 43.660 7.7038 4.7136 16.353 910 50.691 34.578 45.044 16.528 13.802 18.674 911 9.3777 77.858 21.971 22.194 41.699 11.448 912 8.2748 80.974 36.527 25.239 45.874 18.674 913 8.7989 93.304 36.603 33.558 62.453 21.481 914 14.928 100.00 58.796 42.644 74.387 41.518 915 18.324 88.561 42.871 31.779 56.446 24.499 916 45.292 100.00 48.405 47.036 76.869 31.918 917 60.218 100.00 53.409 53.929 80.326 36.663 918 48.654 43.011 7.8538 14.851 16.269 3.8745 919 65.894 42.674 49.672 26.161 21.544 23.410 920 67.038 53.996 67.711 34.006 30.447 43.928 921 76.429 89.406 76.716 60.542 71.324 62.937 922 77.213 93.699 89.347 68.153 79.350 85.155 923 28.464 51.501 57.443 16.942 20.612 31.070 924 34.709 60.342 61.439 22.450 28.315 36.585 925 91.401 39.752 2.3141 38.969 27.464 4.2764 926 94.333 54.819 7.1227 46.127 37.990 6.3370 927 25.621 9.1428 11.145 3.7023 2.8282 2.3248 928 29.295 16.970 17.737 5.1883 4.3887 3.9151 929 36.784 54.774 74.343 23.944 25.481 52.519 930 50.251 55.291 91.069 33.717 30.191 80.682 931 10.800 34.283 55.595 9.6868 9.9800 27.529 932 12.434 43.753 60.049 12.973 14.958 32.962 933 80.934 67.756 65.419 47.948 46.305 43.391 934 89.591 78.476 76.141 62.955 62.215 60.191 935 86.503 82.460 13.842 53.586 62.042 11.611 936 89.189 92.191 35.864 63.826 76.865 22.239 937 8.9372 34.897 12.194 5.1271 8.3471 3.4911 938 9.1803 40.132 22.633 6.8451 10.957 6.5406 939 21.395 39.967 39.352 9.5261 12.100 14.721 940 47.315 0.0000 85.611 21.328 10.027 67.568 941 51.239 9.2003 90.602 24.813 12.090 76.780 942 62.112 10.102 90.717 29.723 14.688 77.239 943 85.080 18.627 84.780 42.640 22.570 67.433 944 100.00 17.059 83.698 54.649 28.576 66.122 945 55.111 68.854 36.460 29.041 37.923 16.899 946 69.679 76.362 39.454 40.672 49.772 20.418 947 70.982 76.745 55.061 44.061 51.563 33.218 948 76.264 79.499 65.206 51.066 57.307 45.090 949 85.430 86.992 65.549 62.318 70.131 47.392 950 94.379 87.544 71.707 71.438 75.208 55.900 951 25.616 0.0000 13.214 3.4610 2.2363 2.5850 952 36.770 8.3538 21.135 6.4741 4.1488 4.7629 953 51.932 16.721 41.654 13.917 8.6108 15.351 954 62.105 24.124 45.354 19.813 12.834 18.551 955 61.755 24.457 62.818 22.882 14.114 35.399 956 73.286 38.796 78.345 35.968 24.385 57.652 957 75.943 64.103 79.812 46.722 42.699 62.915 958 100.00 63.563 86.511 67.507 52.809 74.967 959 48.881 9.2745 8.2023 9.7720 5.9769 2.1972 960 93.121 8.0765 8.3570 36.124 19.478 3.4344 961 100.00 13.538 16.482 42.826 23.380 5.2890 962 82.244 9.7404 8.3885 27.714 15.264 3.0679 963 82.047 13.687 20.289 28.295 15.882 5.6217 964 92.067 22.972 31.188 37.789 22.071 10.556 965 72.632 14.555 10.753 21.719 12.637 3.2073 966 83.029 16.316 36.153 30.530 17.200 12.642 967 87.947 38.565 36.643 37.848 26.235 14.288 968 91.921 41.132 47.987 43.215 29.767 22.682 969 91.319 55.331 48.361 47.229 38.440 24.453 970 100.00 60.779 72.329 62.044 48.698 52.139 971 78.873 42.803 66.300 37.408 27.010 41.307 972 88.113 44.044 76.435 47.160 32.238 55.675 973 21.073 8.5838 24.583 3.6538 2.6850 5.7971 974 33.101 10.890 31.831 6.5385 4.2870 9.0847 975 34.029 21.788 44.733 9.2608 6.9578 17.500 976 15.032 0.0000 53.525 6.2379 3.1878 24.394 977 17.923 16.272 58.808 8.3517 5.3509 30.011 978 26.313 36.798 93.873 22.728 16.273 83.963 979 9.0907 8.0829 74.532 10.821 5.3822 49.605 980 18.123 11.942 80.089 13.414 6.8487 58.189 981 33.962 17.497 81.006 16.868 9.2553 59.942 982 34.945 29.061 82.043 18.941 12.538 62.153 983 10.008 11.134 26.083 2.8188 2.4473 6.3667 984 23.670 18.989 32.133 5.4358 4.6916 9.3721 985 36.837 50.523 32.441 14.850 19.466 11.884 986 46.622 56.422 40.078 20.757 25.538 17.195 987 38.163 37.227 8.9502 10.111 11.684 3.3760 988 59.276 46.698 33.124 21.807 21.250 12.214 989 91.770 63.840 65.266 54.383 46.923 42.984 END_DATA CTI1 ORIGINATOR "Argyll targen" KEYWORD "DENSITY_EXTREME_VALUES" DENSITY_EXTREME_VALUES "8" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 47.3607 100.000 25.6130 21.6292 97.3763 2 100.000 0.00000 79.3514 52.4258 26.2898 58.7215 3 0.00000 0.00000 58.9971 6.48583 3.19399 29.8944 4 100.000 66.6593 0.00000 56.0588 50.5054 7.65614 5 0.00000 35.6011 0.00000 4.68562 8.37021 2.22855 6 84.4444 0.00000 0.00000 28.8428 15.3558 2.30466 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 END_DATA CTI1 ORIGINATOR "Argyll targen" CREATED "May 21, 2015" DESCRIPTOR "Argyll Calibration Target chart information 1" KEYWORD "DEVICE_COMBINATION_VALUES" DEVICE_COMBINATION_VALUES "9" KEYWORD "INDEX" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.000 100.000 100.000 95.1065 100.000 108.844 1 0.00000 100.000 100.000 54.2763 78.9478 106.931 2 100.000 0.00000 100.000 59.7013 29.1995 97.0422 3 0.00000 0.00000 100.000 18.8711 8.14731 95.1290 4 100.000 100.000 0.00000 77.2354 92.8527 14.7151 5 0.00000 100.000 0.00000 36.4052 71.8005 12.8018 6 100.000 0.00000 0.00000 41.8302 22.0522 2.91323 7 0.00000 0.00000 0.00000 1.00000 1.00000 1.00000 8 50.0000 50.0000 50.0000 21.1427 22.1901 24.0831 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ref/XYZ D50.icm0000644000076500000000000000107013221317445017674 0ustar devwheel000000000000008@mntrRGB XYZ 3acsp-ə҇NżFt descbcprtl5wtptchrm$rXYZrTRC gXYZgTRC bXYZbTRC bkpt$descXYZ D50textPublic Domain. No Warranty, Use at own risk.XYZ -chrmXYZ curvXYZ XYZ XYZ DisplayCAL-3.5.0.0/DisplayCAL/report/0000755000076500000000000000000013242313606016736 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/report/base.css0000644000076500000000000000470312665102036020367 0ustar devwheel00000000000000* { font-family: sans-serif; } h1 span { border-radius: 4.5px; -moz-border-radius: 4.5px; -webkit-border-radius: 4.5px; display: inline-block; height: 9px; font-size: 1px; margin: 3px 6px 0 0; width: 9px; } h1 span.r { background: #f00000; } h1 span.g { background: #00f000; } h1 span.b { background: #0000f0; margin-right: 11px; } h3 { font-size: 1.5em; font-weight: normal; margin-bottom: .5em; } table { border: none; border-spacing: 0; width: 100%; } td, th { border: none; border-bottom: 1px solid silver; padding: .125em .25em .125em 0; text-align: center; vertical-align: middle; white-space: nowrap; } .graph { page-break-inside: avoid; } .graph td div { margin: 0 auto; } .graph td, .graph th { border-bottom: 0; font-weight: normal; padding: 0; } .graph th { padding: 0 .5em 0 0; text-align: right; } .graph .last-col { text-align: left; } .graph .col, .graph .canvas { font-size: 1px; overflow: hidden; position: relative; } .canvas .inner { position: absolute; } .graph .wrap { height: 7px; position: absolute; z-index: 0; } .graph .wrap-act { height: 5px; z-index: 1; } .graph .ref, .graph .act { background: #fff; border: 2px solid silver; height: 6px; left: 50%; position: absolute; } .graph .ref { border-radius: 7px; -moz-border-radius: 7px; -webkit-border-radius: 7px; height: 10px; margin-bottom: -7px; margin-left: -7px; width: 10px; } .graph .act { border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; height: 6px; margin-bottom: -5px; margin-left: -5px; width: 6px; } .info td, .info th, td.first-column, th.first-column { text-align: left; } .info th { padding-right: 1em; } td.bar { padding: 0; text-align: left; } td.patch, td.sample_id { border-left: none; border-right: none; padding: 0; vertical-align: top; width: 1.75em; } td + td.patch > .patch { border-left: 1px solid silver; } td.patch + td.patch > .patch { border-left: none; border-right: 1px solid silver; } .overview td.patch { border-bottom: none; } .overview tr.last-row td.patch { border-bottom: 1px solid silver; } div.patch, div.sample_id { padding: .125em .25em .125em 0; width: 1.75em; } td.sample_id, div.sample_id { width: auto; } .ok { color: #339900; } .warn { color: #FF3300; font-weight: bold; } .ko { color: red; font-weight: bold; } .hidden { color: white; visibility: hidden; } td.ok, td.ko { line-height: 1em; } .statonly, tr.statonly td { color: gray; } tr.verbose { display: none; } DisplayCAL-3.5.0.0/DisplayCAL/report/compare.constants.js0000644000076500000000000000504513154615407022747 0ustar devwheel00000000000000var DELTA_A_MAX = 'DELTA_A_MAX', DELTA_A_AVG = 'DELTA_A_AVG', DELTA_A_MED = 'DELTA_A_MED', // Median DELTA_A_MAD = 'DELTA_A_MAD', // Median absolute deviation DELTA_A_PERCENTILE_95 = 'DELTA_A_PERCENTILE_95', DELTA_A_PERCENTILE_99 = 'DELTA_A_PERCENTILE_99', DELTA_A_RANGE = 'DELTA_A_RANGE', DELTA_A_STDDEV = 'DELTA_A_STDDEV', // Standard deviation DELTA_A_B_RANGE = 'DELTA_A_B_RANGE', DELTA_B_MAX = 'DELTA_B_MAX', DELTA_B_AVG = 'DELTA_B_AVG', DELTA_B_MED = 'DELTA_B_MED', // Median DELTA_B_MAD = 'DELTA_B_MAD', // Median absolute deviation DELTA_B_PERCENTILE_95 = 'DELTA_B_PERCENTILE_95', DELTA_B_PERCENTILE_99 = 'DELTA_B_PERCENTILE_99', DELTA_B_RANGE = 'DELTA_B_RANGE', DELTA_B_STDDEV = 'DELTA_B_STDDEV', // Standard deviation DELTA_E_MAX = 'DELTA_E_MAX', DELTA_E_AVG = 'DELTA_E_AVG', DELTA_E_MED = 'DELTA_E_MED', // Median DELTA_E_MAD = 'DELTA_E_MAD', // Median absolute deviation DELTA_E_PERCENTILE_95 = 'DELTA_E_PERCENTILE_95', DELTA_E_PERCENTILE_99 = 'DELTA_E_PERCENTILE_99', DELTA_E_RANGE = 'DELTA_E_RANGE', DELTA_E_STDDEV = 'DELTA_E_STDDEV', // Standard deviation DELTA_L_MAX = 'DELTA_L_MAX', DELTA_L_AVG = 'DELTA_L_AVG', DELTA_L_MED = 'DELTA_L_MED', // Median DELTA_L_MAD = 'DELTA_L_MAD', // Median absolute deviation DELTA_L_PERCENTILE_95 = 'DELTA_L_PERCENTILE_95', DELTA_L_PERCENTILE_99 = 'DELTA_L_PERCENTILE_99', DELTA_L_RANGE = 'DELTA_L_RANGE', DELTA_L_STDDEV = 'DELTA_L_STDDEV', // Standard deviation DELTA_C_MAX = 'DELTA_C_MAX', DELTA_C_AVG = 'DELTA_C_AVG', DELTA_C_MED = 'DELTA_C_MED', // Median DELTA_C_MAD = 'DELTA_C_MAD', // Median absolute deviation DELTA_C_PERCENTILE_95 = 'DELTA_C_PERCENTILE_95', DELTA_C_PERCENTILE_99 = 'DELTA_C_PERCENTILE_99', DELTA_C_RANGE = 'DELTA_C_RANGE', DELTA_C_STDDEV = 'DELTA_C_STDDEV', // Standard deviation DELTA_H_MAX = 'DELTA_H_MAX', DELTA_H_AVG = 'DELTA_H_AVG', DELTA_H_MED = 'DELTA_H_MED', // Median DELTA_H_MAD = 'DELTA_H_MAD', // Median absolute deviation DELTA_H_PERCENTILE_95 = 'DELTA_H_PERCENTILE_95', DELTA_H_PERCENTILE_99 = 'DELTA_H_PERCENTILE_99', DELTA_H_RANGE = 'DELTA_H_RANGE', DELTA_H_STDDEV = 'DELTA_H_STDDEV', // Standard deviation GAMMA_MAX = 'GAMMA_MAX', GAMMA_MIN = 'GAMMA_MIN', GAMMA_AVG = 'GAMMA_AVG', GAMMA_MED = 'GAMMA_MED', // Median GAMMA_MAD = 'GAMMA_MAD', // Median absolute deviation GAMMA_PERCENTILE_95 = 'GAMMA_PERCENTILE_95', GAMMA_PERCENTILE_99 = 'GAMMA_PERCENTILE_99', GAMMA_RANGE = 'GAMMA_RANGE', GAMMA_STDDEV = 'GAMMA_STDDEV', // Standard deviation CIE76 = 'CIE76', CIE94 = 'CIE94', CIE00 = 'CIE00', CMC11 = 'CMC11', CMC21 = 'CMC21';DisplayCAL-3.5.0.0/DisplayCAL/report/compare.css0000644000076500000000000001467312665102036021112 0ustar devwheel00000000000000a { text-decoration: none; } a:link, a:active { color: #006699; } a:visited { color: #666666; } a:hover, a:visited:hover { border-bottom: 1px dotted #0099CC; color: #0099CC; text-decoration: none; } :focus { box-shadow: none; outline: none; } html { background: #fff; border-top: 4px solid #202020; } body { font-size: 12px; margin: 17px auto; padding: 15px 20px; width: 900px; } button { background: rgb(249,249,249); /* Old browsers */ /* IE9 SVG, needs conditional override of 'filter' to 'none' */ background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNjY2NjY2MiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); background: -moz-linear-gradient(top, rgba(249,249,249,1) 0%, rgba(204,204,204,1) 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(249,249,249,1)), color-stop(100%,rgba(204,204,204,1))); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* Opera11.10+ */ background: -ms-linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* IE10+ */ background: linear-gradient(top, rgba(249,249,249,1) 0%,rgba(204,204,204,1) 100%); /* W3C */ border: 1px solid #999; border-radius: 15px; -moz-border-radius: 15px; -webkit-border-radius: 15px; color: #333; height: 30px; opacity: .9; padding: 0 10px; text-shadow: 1px 1px 1px #fff; } button:hover, button:focus, button:active { border-color: #09c; opacity: 1; } h2 { color: #333333; font-size: 20px; font-weight: normal; margin-bottom: 9px; } h3 { cursor: pointer; } p { line-height: 18px; } form, div.process { clear: both; } #F_out { margin-bottom: 20px; } form { margin: 0; } h1 { background: #202020; color: #fff; border: none; border-radius: 20px; -moz-border-radius: 20px; -webkit-border-radius: 20px; font-size: 12px; font-weight: lighter; padding: 12px 15px; z-index: 1; } p.error { color: #c00; font-weight: bold; } #report { /* display: none; oddly cuts off part of the summary in IE6 */ visibility: hidden; } .disabled { color: #999; } .options { line-height: 2em; margin: 6px 0 10px; width: 430px; } .functions { margin: 6px 0 10px; text-align: right; } .functions button { margin-left: 1em; } * > .functions { float: right; width: 430px; } input[type=checkbox] { vertical-align: middle; } label[for=FF_gray_balance_cal_only] { display: none; } table { width: 900px; } td, th { font-size: 12px; } .graph { position: relative; } .graph table, .graph th, .graph tr.x td, .graph .canvas, .canvas .overlay { background-color: #eee; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; color: #333; } .canvas .overlay { height: 900em; opacity: 0; pointer-events: none; position: absolute; width: 900em; z-index: 9999; } .graph th { padding: 0 .5em 0; } .graph .ref, .graph .act, .canvas .overlay { background: #eee; -moz-transition: all .125s linear; -webkit-transition: all .125s linear; -o-transition: all .125s linear; transition: all .125s linear; } .graph .col:hover .ref, .graph .col:hover .act, .hover .wrap.hover .ref, .hover .wrap.hover .act { -moz-transform: scale(1.6); -webkit-transform: scale(1.6); -o-transform: scale(1.6); -ms-transform: scale(1.6); transform: scale(1.6); } .hover .overlay { opacity: .9375; } .graph .act:hover, .hover .wrap.hover { z-index: 10000; } .toggle:before { content: '▼ '; font-size: 12px; position: relative; top: -2px; } .collapsed .toggle:before { content: '► '; } .collapsed .collapsed { display: none; } .dragging, .dragging * { cursor: move; } /* Pure CSS3 Tooltips */ [data-title] { cursor: default; } a[data-title] { cursor: pointer; } [data-title]:before { /* Tooltip body */ background: #333; border-radius: 0; -moz-border-radius: 0; -webkit-border-radius: 0; bottom: 0; box-shadow: 0 1px 3px rgba(0, 0, 0, .25); color: #fff; content: attr(data-title); font-size: 12px; font-weight: normal; height: 14px; left: 0; margin-left: 0; margin-top: 7px; overflow: hidden; padding: 4px 7px; text-align: center; text-overflow: ellipsis; white-space: nowrap; width: 100%; } [data-title]:after { /* Tooltip arrow */ border-bottom: 7px solid #333; border-left: 7px solid transparent; border-right: 7px solid transparent; bottom: 22px; content: ""; margin-left: -6px; margin-top: 0; } [data-title]:before, [data-title]:after { opacity: 0; pointer-events: none; position: fixed; top: auto; -moz-transform: translate3d(0, 0, 0) translateY(20px); -webkit-transform: translate3d(0, 0, 0) translateY(20px); -o-transform: translate3d(0, 0, 0) translateY(20px); -ms-transform: translate3d(0, 0, 0) translateY(20px); transform: translate3d(0, 0, 0) translateY(20px); -moz-transition: -moz-transform .25s ease, opacity .25s ease, visibility .25s ease; -webkit-transition: -webkit-transform .25s ease, opacity .25s ease, visibility .25s ease; -o-transition: -o-transform .25s ease, opacity .25s ease, visibility .25s ease; transition: transform .25s ease, opacity .25s ease, visibility .25s ease; visibility: hidden; z-index: 99999; } .canvas.dragging [data-title]:before, .canvas.dragging [data-title]:after { opacity: 0; visibility: hidden; } [data-title]:hover:after, [data-title]:hover:before { opacity: 1; -moz-transform: translate3d(0, 0, 0) translateX(0); -webkit-transform: translate3d(0, 0, 0) translateX(0); -o-transform: translate3d(0, 0, 0) translateX(0); -ms-transform: translate3d(0, 0, 0) translateX(0); transform: translate3d(0, 0, 0) translateX(0); visibility: visible; } [data-title]:hover:before, [data-title]:hover:after { -moz-transform: translate3d(0, 0, 0) translateY(0); -webkit-transform: translate3d(0, 0, 0) translateY(0); -o-transform: translate3d(0, 0, 0) translateY(0); -ms-transform: translate3d(0, 0, 0) translateY(0); transform: translate3d(0, 0, 0) translateY(0); }DisplayCAL-3.5.0.0/DisplayCAL/report/compare.functions.js0000644000076500000000000023577413242301034022743 0ustar devwheel00000000000000var p; var debug = window.location.href.indexOf("?debug") > -1, get_gammaRGB = window.location.hash.indexOf("get_gammaRGB") > -1; // Array methods p=Array.prototype; p.indexof = function(v, ignore_case) { for (var i=0; i -1) ipart+=v.substr(i).length; while (v.length-1 && (data_end = src.search(_data_regexp2))>data_begin) { if (!this.data.length) { // 1st var header = lf2cr(src).substr(0, data_begin).replace(_data_format_regexp, ""); if (v = header.match(_header_regexp1)) for (i=0; i -1 && this.data_format.indexOf('CMYK_M') > -1 && this.data_format.indexOf('CMYK_Y') > -1 && this.data_format.indexOf('CMYK_K') > -1) this.device = 'CMYK'; else this.device = 'RGB'; if (comparison_criteria[this.id]) this.id = comparison_criteria[this.id].id; else this.id = this.device; return src ? true : false }; p=dataset.prototype; p.header_get = function() { var header=[], i, j, v; for (i=0; i-1) { header.push(["BEGIN_"+this.header[i][0]]); v=this.header[i][1].split("\n"); for (j=0; j 3 ? 3 : 0, // start offset for device values in fields_match (CMYK if length > 3, else RGB) devend = criteria.fields_match.length > 3 ? 6 : 2, // end offset for device values in fields_match (CMYK if length > 3, else RGB) missing_data, delta_calc_method = f['F_out'].elements['FF_delta_calc_method'].value, patch_number_html, verbosestats = f['F_out'].elements['FF_verbosestats'].checked, warn_deviation = criteria.warn_deviation, no_Lab = (this.data_format.indexof("LAB_L", true) < 0 || this.data_format.indexof("LAB_A", true) < 0 || this.data_format.indexof("LAB_B", true) < 0), no_XYZ = (this.data_format.indexof("XYZ_X", true) < 0 || this.data_format.indexof("XYZ_Y", true) < 0 || this.data_format.indexof("XYZ_Z", true) < 0), gray_balance_cal_only = f['F_out'].elements['FF_gray_balance_cal_only'].checked; if (profile_wp.length == 3) { for (var i=0; i= 1667 && colortemp < 4000) { f['F_out'].elements['FF_planckian'].checked = planckian = true; f['F_out'].elements['FF_planckian'].disabled = true; } colortemp_assumed = Math.round(colortemp / 100) * 100; if (planckian) wp_assumed = jsapi.math.color.planckianCT2XYZ(colortemp_assumed); else wp_assumed = jsapi.math.color.CIEDCorColorTemp2XYZ(colortemp_assumed); for (var i=0; i

Basic Information

', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', (e['FF_correction_matrix'].value ? '' : ''), ' ', ' ', ' ', ' ' ]; if (profile_wp[1] != 100) this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ' ]); if (profile_wp.length == 3) this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ' ]); if (wp.length == 3) this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ]); if (bp.length == 3 && bp[0] > -1 && bp[1] > -1 && bp[2] > -1) this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ]); this.report_html = this.report_html.concat([ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '
Device:' + e['FF_display'].value + '
Instrument:' + e['FF_instrument'].value + '
Correction:' + e['FF_correction_matrix'].value + '
Display profile:' + e['FF_profile'].value + '
Display profile luminance:' + profile_wp[1].accuracy(1) + ' cd/m²
Display profile whitepoint:' + 'xy ' + profile_wp_xy_round.join(' ') + ' (XYZ ' + profile_wp_norm_round.join(' ') + '), CCT ' + profile_colortemp + 'K
Measured luminance:' + wp[1].accuracy(1) + ' cd/m²
Measured whitepoint:' + 'xy ' + wp_xy_round.join(' ') + ' (XYZ ' + wp_norm_round.join(' ') + '), CCT ' + colortemp + 'K
Assumed target whitepoint:' + colortemp_assumed + 'K ' + (planckian ? 'blackbody' : 'daylight') + ', xy ' + wp_assumed_xy_round.join(' ') + ' (XYZ ' + wp_assumed_round.join(' ') + ')
Measured black luminance:' + bp[1].accuracy(4) + ' cd/m²
Contrast:' + (wp[1] / bp[1]).accuracy(1) + ':1
Testchart:' + this.testchart + '
Simulation profile:' + (SIMULATION_PROFILE || 'None') + '
Gamma mapping:' + (TRC_GAMMA ? (TRC ? TRC : TRC + ' ' + TRC_GAMMA.toFixed(2) + ' ' + {"b": "relative", "B": "absolute"}[TRC_GAMMA_TYPE] + ', black output offset ' + (TRC_OUTPUT_OFFSET * 100).toFixed(0) + '%') : (SIMULATION_PROFILE ? 'No' : 'N/A')) + '
Whitepoint simulation:' + (WHITEPOINT_SIMULATION ? 'Yes' + (WHITEPOINT_SIMULATION_RELATIVE ? ', relative to display profile whitepoint' : '') : (!DEVICELINK_PROFILE && SIMULATION_PROFILE ? 'No' : 'N/A')) + '
Chromatic adaption:' + e['FF_adaption'].value + '
Devicelink profile:' + (DEVICELINK_PROFILE || 'None') + '
Evaluation criteria:' + criteria.name + '
Date:' + e['FF_datetime'].value + '
' ]); var result_start = this.report_html.length; this.report_html = this.report_html.concat([ '
', '

Summary

', '
', ' ', ' ', ' ', ' ' ]); var seen = []; for (var j=0; j(' + window.CAL_RGBLEVELS[0] + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'CAL_GREENLEVELS': if (window.CAL_RGBLEVELS) { result[j].sum = (window.CAL_RGBLEVELS[1] / CAL_ENTRYCOUNT * 100).accuracy(1); result[j].htmlsum = result[j].sum + '%
(' + window.CAL_RGBLEVELS[1] + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'CAL_BLUELEVELS': if (window.CAL_RGBLEVELS) { result[j].sum = (window.CAL_RGBLEVELS[2] / CAL_ENTRYCOUNT * 100).accuracy(1); result[j].htmlsum = result[j].sum + '%
(' + window.CAL_RGBLEVELS[2] + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'CAL_GRAYLEVELS': if (window.CAL_RGBLEVELS) { var cal_graylevels = Math.min(CAL_RGBLEVELS[0], CAL_RGBLEVELS[1], CAL_RGBLEVELS[2]); result[j].sum = (cal_graylevels / CAL_ENTRYCOUNT * 100).accuracy(1); result[j].htmlsum = result[j].sum + '%
(' + cal_graylevels + '/' + CAL_ENTRYCOUNT + ')'; } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'WHITEPOINT_MvsA': // Measured vs. assumed if (wp.length == 3) { target_Lab = [100, 0, 0]; actual_Lab = jsapi.math.color.XYZ2Lab(wp_norm[0], wp_norm[1], wp_norm[2], [wp_assumed[0], wp_assumed[1], wp_assumed[2]]); // alert(rules[j] + '\ntarget_Lab: ' + target_Lab + '\nactual_Lab: ' + actual_Lab); delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], rules[j][5]); result[j].E.push(delta.E); result[j].L.push(delta.L); result[j].C.push(delta.C); result[j].H.push(delta.H); result[j].a.push(delta.a); result[j].b.push(delta.b); } else { rules[j][3] = null; rules[j][4] = null; continue; } break; case 'WHITEPOINT_MvsP': // Profile vs. measured if (wp.length == 3 && profile_wp.length == 3) { target_Lab = [100, 0, 0]; actual_Lab = jsapi.math.color.XYZ2Lab(wp_norm[0], wp_norm[1], wp_norm[2], [profile_wp_norm[0], profile_wp_norm[1], profile_wp_norm[2]]); // alert(rules[j] + '\ntarget_Lab: ' + target_Lab + '\nactual_Lab: ' + actual_Lab); delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], rules[j][5]); result[j].E.push(delta.E); result[j].L.push(delta.L); result[j].C.push(delta.C); result[j].H.push(delta.H); result[j].a.push(delta.a); result[j].b.push(delta.b); } else { rules[j][3] = null; rules[j][4] = null; continue; } break; } }; this.report_html.push(' '); this.report_html.push('
'); this.report_html.push(' '); this.report_html.push(' '); var bar_html = []; if (result[j].sum != null && rules[j][2] && rules[j][2].indexOf("GAMMA") < 0) { if (!rules[j][3] || (rules[j][5] && rules[j][5].substr(3) != delta_calc_method.substr(3))) rgb = [204, 204, 204]; else { var rgb = [0, 255, 0], step = 255 / (rules[j][3] + rules[j][3] / 2); if (Math.abs(result[j].sum) <= rules[j][3]) { rgb[0] += Math.min(step * Math.abs(result[j].sum), 255); rgb[1] -= Math.min(step * Math.abs(result[j].sum), 255); var maxrg = Math.max(rgb[0], rgb[1]); rgb[0] *= (255 / maxrg); rgb[1] *= (255 / maxrg); rgb[0] = Math.round(rgb[0]); rgb[1] = Math.round(rgb[1]); } else rgb = [255, 0, 0]; }; for (var l = 0; l < actual_rgb_html.length; l ++) { bar_html.push(Math.abs(result[j].sum).accuracy(2) > 0 ? ' ' : ' '); }; }; this.report_html.push(' '); this.report_html.push(' '); if (rules[j][1] && rules[j][1].length > 1 && rules[j][5].substr(3) == delta_calc_method.substr(3)) seen.push(rules[j][1].join(',')); }; this.report_html.push('
CriteriaNominalRecommended# Actual Result
' + rules[j][0] + '' + (rules[j][3] ? (rules[j][2] ? '<= ' + rules[j][3] : '>= ' + rules[j][3] + '%') : ' ') + '' + (rules[j][4] ? (rules[j][2] ? '<= ' + rules[j][4] : '>= ' + rules[j][4] + '%'): ' ') + ''); patch_number_html = []; actual_rgb_html = []; target_rgb_html = []; var haspatchid = false; if (rules[j][2].indexOf("_MAX") < 0 && rules[j][2].indexOf("_MIN") < 0) { for (var k=0; k 1 && seen.indexOf(rules[j][1].join(',')) < 0 && rules[j][5].substr(3) == delta_calc_method.substr(3)) { patch_number_html.push('
 
'); haspatchid = true; if (rules[j][1][k].length == 4) // Assume CMYK target_rgb = jsapi.math.color.CMYK2RGB(rules[j][1][k][0] / 100, rules[j][1][k][1] / 100, rules[j][1][k][2] / 100, rules[j][1][k][3] / 100, 255); else // XXX Note that round(50 * 2.55) = 127, but // round(50 / 100 * 255) = 128 (the latter is what we want)! target_rgb = [rules[j][1][k][0] / 100.0 * 255, rules[j][1][k][1] / 100.0 * 255, rules[j][1][k][2] / 100.0 * 255]; target_rgb_html.push('
 
'); actual_rgb_html.push('
\u2716 
'); } }; if (rules[j][1].length) { for (var k=0; k' + n.fill(String(number_of_sets).length) + ''); haspatchid = true; } target_rgb = jsapi.math.color.Lab2RGB(target_Lab[0], target_Lab[1], target_Lab[2], target_Lab2RGB_wp_1, target_Lab2RGB_src_wp_1, 255, true); actual_rgb = jsapi.math.color.Lab2RGB(actual_Lab[0], actual_Lab[1], actual_Lab[2], actual_Lab2RGB_wp_1, actual_Lab2RGB_src_wp_1, 255, true); target_rgb_html[k] = ('
 
'); actual_rgb_html[k] = ('
 
'); }; matched = true } } } else matched = true; if (matched) { delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], rules[j][5]); result[j].E.push(delta.E); result[j].L.push(delta.L); result[j].C.push(delta.C); result[j].H.push(delta.H); result[j].a.push(delta.a); result[j].b.push(delta.b); if (actual.gamma) result[j].g.push(actual.gamma); if ((rules[j][1].length || rules[j][2].indexOf('_MAX') > -1 || rules[j][2].indexOf('_MIN') > -1) && (rules[j][2].indexOf('GAMMA') < 0 || actual.gamma)) result[j].matches.push([i, i, n]) } }; this.report_html = this.report_html.concat(patch_number_html); var number_of_sets = n; if (!rules[j][1].length || ((rules[j][1][0] == 'WHITEPOINT_MvsA' || (rules[j][1][0] == 'WHITEPOINT_MvsP' && profile_wp.length == 3)) && wp.length == 3) || result[j].matches.length >= rules[j][1].length) switch (rules[j][2]) { case DELTA_A_MAX: result[j].sum = jsapi.math.absmax(result[j].a); break; case DELTA_A_AVG: result[j].sum = jsapi.math.avgabs(result[j].a); break; case DELTA_A_MED: result[j].sum = jsapi.math.median(result[j].a); break; case DELTA_A_MAD: result[j].sum = jsapi.math.mad(result[j].a); break; case DELTA_A_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].a, 0.95); break; case DELTA_A_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].a, 0.99); break; case DELTA_A_RANGE: result[j].sum = jsapi.math.max(result[j].a) - jsapi.math.min(result[j].a); break; case DELTA_A_STDDEV: result[j].sum = jsapi.math.stddev(result[j].a); break; case DELTA_A_B_RANGE: var ab = result[j].a.concat(result[j].b); result[j].sum = jsapi.math.max(ab) - jsapi.math.min(ab); break; case DELTA_B_MAX: result[j].sum = jsapi.math.absmax(result[j].b); break; case DELTA_B_AVG: result[j].sum = jsapi.math.avgabs(result[j].b); break; case DELTA_B_MED: result[j].sum = jsapi.math.median(result[j].b); break; case DELTA_B_MAD: result[j].sum = jsapi.math.mad(result[j].b); break; case DELTA_B_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].B, 0.95); break; case DELTA_B_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].B, 0.99); break; case DELTA_B_RANGE: result[j].sum = jsapi.math.max(result[j].b) - jsapi.math.min(result[j].b); break; case DELTA_B_STDDEV: result[j].sum = jsapi.math.stddev(result[j].b); break; case DELTA_E_MAX: result[j].sum = jsapi.math.absmax(result[j].E); break; case DELTA_E_AVG: result[j].sum = jsapi.math.avg(result[j].E); break; case DELTA_E_MED: result[j].sum = jsapi.math.median(result[j].E); break; case DELTA_E_MAD: result[j].sum = jsapi.math.mad(result[j].E); break; case DELTA_E_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].E, 0.95); break; case DELTA_E_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].E, 0.99); break; case DELTA_E_RANGE: result[j].sum = jsapi.math.max(result[j].E) - jsapi.math.min(result[j].E); break; case DELTA_E_STDDEV: result[j].sum = jsapi.math.stddev(result[j].E); break; case DELTA_L_MAX: result[j].sum = jsapi.math.absmax(result[j].L); break; case DELTA_L_AVG: result[j].sum = jsapi.math.avgabs(result[j].L); break; case DELTA_L_MED: result[j].sum = jsapi.math.median(result[j].L); break; case DELTA_L_MAD: result[j].sum = jsapi.math.mad(result[j].L); break; case DELTA_L_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].L, 0.95); break; case DELTA_L_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].L, 0.99); break; case DELTA_L_RANGE: result[j].sum = jsapi.math.max(result[j].L) - jsapi.math.min(result[j].L); break; case DELTA_L_STDDEV: result[j].sum = jsapi.math.stddev(result[j].L); break; case DELTA_C_MAX: result[j].sum = jsapi.math.absmax(result[j].C); break; case DELTA_C_AVG: result[j].sum = jsapi.math.avgabs(result[j].C); break; case DELTA_C_MED: result[j].sum = jsapi.math.median(result[j].C); break; case DELTA_C_MAD: result[j].sum = jsapi.math.mad(result[j].C); break; case DELTA_C_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].C, 0.95); break; case DELTA_C_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].C, 0.99); break; case DELTA_C_RANGE: result[j].sum = jsapi.math.max(result[j].C) - jsapi.math.min(result[j].C); break; case DELTA_C_STDDEV: result[j].sum = jsapi.math.stddev(result[j].C); break; case DELTA_H_MAX: result[j].sum = jsapi.math.absmax(result[j].H); break; case DELTA_H_AVG: result[j].sum = jsapi.math.avgabs(result[j].H); break; case DELTA_H_MED: result[j].sum = jsapi.math.median(result[j].H); break; case DELTA_H_MAD: result[j].sum = jsapi.math.mad(result[j].H); break; case DELTA_H_PERCENTILE_95: result[j].sum = jsapi.math.percentile(result[j].H, 0.95); break; case DELTA_H_PERCENTILE_99: result[j].sum = jsapi.math.percentile(result[j].H, 0.99); break; case DELTA_H_RANGE: result[j].sum = jsapi.math.max(result[j].H) - jsapi.math.min(result[j].H); break; case DELTA_H_STDDEV: result[j].sum = jsapi.math.stddev(result[j].H); break; case GAMMA_MAX: if (result[j].g.length) result[j].sum = jsapi.math.max(result[j].g); break; case GAMMA_MIN: if (result[j].g.length) result[j].sum = jsapi.math.min(result[j].g); break; case GAMMA_AVG: if (result[j].g.length) result[j].sum = jsapi.math.avg(result[j].g); break; case GAMMA_MED: if (result[j].g.length) result[j].sum = jsapi.math.median(result[j].g); break; case GAMMA_MAD: if (result[j].g.length) result[j].sum = jsapi.math.mad(result[j].g); break; case GAMMA_PERCENTILE_95: if (result[j].g.length) result[j].sum = jsapi.math.percentile(result[j].g, 0.95); break; case GAMMA_PERCENTILE_99: if (result[j].g.length) result[j].sum = jsapi.math.percentile(result[j].g, 0.99); break; case GAMMA_RANGE: if (result[j].g.length) result[j].sum = jsapi.math.max(result[j].g) - jsapi.math.min(result[j].g); break; case GAMMA_STDDEV: if (result[j].g.length) result[j].sum = jsapi.math.stddev(result[j].g); break; } else if (!rules[j][1].length || (rules[j][1][0] + '').indexOf('LEVELS') < 0) missing_data = true; if (result[j].matches.length) { matched = false; for (var k=0; k' + result[j].finalmatch[2].fill(String(number_of_sets).length) + ''); haspatchid = true; var colors = get_colors(target, actual, o, no_Lab, no_XYZ, gray_balance_cal_only, true, profile_wp_norm, wp_norm, absolute, cat, use_profile_wp_as_ref); target_Lab = colors.target_Lab; actual_Lab = colors.actual_Lab; target_rgb = jsapi.math.color.Lab2RGB(target_Lab[0], target_Lab[1], target_Lab[2], target_Lab2RGB_wp_1, target_Lab2RGB_src_wp_1, 255, true); actual_rgb = jsapi.math.color.Lab2RGB(actual_Lab[0], actual_Lab[1], actual_Lab[2], actual_Lab2RGB_wp_1, actual_Lab2RGB_src_wp_1, 255, true); target_rgb_html.push('
 
'); actual_rgb_html.push('
 
'); }; } if (!target_rgb_html.length) { target_rgb_html.push(' '); actual_rgb_html.push(' '); }; if (!haspatchid) this.report_html.push('
 
'); this.report_html.push('
' + target_rgb_html.join('') + '' + actual_rgb_html.join('') + '' + (result[j].sum != null ? result[j].htmlsum || result[j].sum.accuracy(2) : ' ') + '' + (bar_html.join('') || ' ') + 'OK ' : (result[j].sum != null && rules[j][3] ? 'warn">OK \u26a0' : 'statonly">')) + '✔' : '"> ')) : 'ko">' + (result[j].sum != null ? 'NOT OK' : '') + ' \u2716') + '
'); var pass, overachieve; for (var j=0; j rules[j][3] : Math.abs(result[j].sum) < rules[j][3])) pass = false; if (!rules[j][4]) continue; if (missing_data || isNaN(result[j].sum) || (rules[j][2] ? Math.abs(result[j].sum) > rules[j][4] : Math.abs(result[j].sum) < rules[j][4])) overachieve = false; } if (rules[j][5] && rules[j][5].substr(3) == delta_calc_method.substr(3)) for (var k=0; k -1) { this.data[result[j].matches[k][1]].actual_DE = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].E[k]); this.data[result[j].matches[k][1]].tolerance_DE = rules[j][3]; } else if (rules[j][2].indexOf('_L_') > -1) { this.data[result[j].matches[k][1]].actual_DL = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].L[k]); this.data[result[j].matches[k][1]].tolerance_DL = rules[j][3]; } else if (rules[j][2].indexOf('_A_') > -1) { this.data[result[j].matches[k][1]].actual_Da = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].a[k]); this.data[result[j].matches[k][1]].tolerance_Da = rules[j][3]; } else if (rules[j][2].indexOf('_B_') > -1) { this.data[result[j].matches[k][1]].actual_Db = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].b[k]); this.data[result[j].matches[k][1]].tolerance_Db = rules[j][3]; } else if (rules[j][2].indexOf('_C_') > -1) { this.data[result[j].matches[k][1]].actual_DC = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].C[k]); this.data[result[j].matches[k][1]].tolerance_DC = rules[j][3]; } else if (rules[j][2].indexOf('_H_') > -1) { this.data[result[j].matches[k][1]].actual_DH = Math.abs(rules[j][2].indexOf('_MAX') < 0 ? result[j].sum : result[j].H[k]); this.data[result[j].matches[k][1]].tolerance_DH = rules[j][3]; } }; }; this.report_html.push(''); this.result_html = this.report_html.slice(result_start); this.report_html.push('
'); this.report_html.push('
'); this.report_html.push('

Overview

'); this.report_html.push(' '); this.report_html.push(' '); var device_labels = fields_match.slice(devstart, devend + 1), device_channels = device_labels.join('').replace(/(?:CMYK|RGB)_/g, ''); this.report_html.push(' '); this.report_html.push(' '); this.report_html.push(' '); if (mode == 'Lab') labels = 'L*,a*,b*'; else if (mode == 'XYZ') labels = 'X,Y,Z'; else if (mode == 'xyY') labels = 'x,y,Y'; else if (mode == "Lu'v'") labels = "L*,u',v'"; this.report_html.push(' ' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + /* '' + */ ''); this.report_html.push(' '); var grayscale_values = [], gamut_values = []; for (var i=0, n=0; i'); var bar_html = [], rgb = [0, 255, 0]; if (actual.tolerance_DE == null) actual.tolerance_DE = 5; if (actual.actual_DE == null) actual.actual_DE = delta.E; if (actual.delta == null) actual.delta = delta; var step = 255 / (actual.tolerance_DE + actual.tolerance_DE / 2); if (actual.actual_DE <= actual.tolerance_DE) { rgb[0] += Math.min(step * actual.actual_DE, 255); rgb[1] -= Math.min(step * actual.actual_DE, 255); var maxrg = Math.max(rgb[0], rgb[1]); rgb[0] *= (255 / maxrg); rgb[1] *= (255 / maxrg); rgb[0] = Math.round(rgb[0]); rgb[1] = Math.round(rgb[1]); } else rgb = [255, 0, 0]; bar_html.push(actual.actual_DE.accuracy(2) > 0 ? ' ' : ' '); if (criteria.fields_match.join(',').indexOf('CMYK') > -1) var device = current_cmyk; else { var device = current_rgb; // XXX Note that round(50 * 2.55) = 127, but // round(50 / 100 * 255) = 128 (the latter is what we want)! for (var j=0; j' + n.fill(String(number_of_sets).length) + '' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + (criteria.fields_match.join(',').indexOf('CMYK') < 0 ? '' : '') + '' + /* '' + */ ''); this.report_html.push(' '); }; this.report_html.push('
#Device ValuesNominal Values Measured ValuesΔE*' + delta_calc_method.substr(3) + ' 
 ' + device_labels.join('').replace(/\w+_/g, '') + '' + labels.split(',').join('') + 'γ  ' + labels.split(',').join('') + 'γΔL*Δa*Δb*ΔC*ΔH*ΔE* 
' + device.join('') + '' + target_color[0].accuracy(accuracy) + '' + target_color[1].accuracy(accuracy) + '' + target_color[2].accuracy(accuracy) + '' + (target.gamma ? target.gamma.accuracy(2) : ' ') + '
 
 
' + actual_color[0].accuracy(accuracy) + '' + actual_color[1].accuracy(accuracy) + '' + actual_color[2].accuracy(accuracy) + '' + (actual.gamma ? actual.gamma.accuracy(2) : ' ') + '' + delta.L.accuracy(2) + '' + delta.a.accuracy(2) + '' + delta.b.accuracy(2) + '' + delta.C.accuracy(2) + '' + delta.H.accuracy(2) + '' + delta.E.accuracy(2) + '' + bar_html.join('') + '
'); this.report_html.push('
'); if (grayscale_values.length) { grayscale_values.sort(function(a, b) { // Compare signal level if (a[0][0] < b[0][0]) return -1; if (a[0][0] > b[0][0]) return 1; // If same signal level, compare target L* if (a[3][0] < b[3][0]) return -1; if (a[3][0] > b[3][0]) return 1; return 0; }); // CCT var CCT = [], hwidth = 100 / 18, width = (100 - hwidth) / grayscale_values.length, rows = 17, start = 10500, end = 2500, rstep = (start - end) / (rows - 1), rowh = 30; CCT.push('
'); CCT.push('

Correlated Color Temperature

'); CCT.push(' '); CCT.push(''); debug && window.console && console.log('CCT'); for (var i = 0; i < grayscale_values.length; i ++) { var target_XYZ = jsapi.math.color.Lab2XYZ(grayscale_values[i][3][0], grayscale_values[i][3][1], grayscale_values[i][3][2], absolute && use_profile_wp_as_ref && profile_wp_norm, 100.0), actual_XYZ = jsapi.math.color.Lab2XYZ(grayscale_values[i][4][0], grayscale_values[i][4][1], grayscale_values[i][4][2], absolute && use_profile_wp_as_ref && profile_wp_norm, 100.0); if (!absolute) { target_XYZ = jsapi.math.color.adapt(target_XYZ[0], target_XYZ[1], target_XYZ[2], [96.42, 100, 82.49], profile_wp_norm, cat); actual_XYZ = jsapi.math.color.adapt(actual_XYZ[0], actual_XYZ[1], actual_XYZ[2], [96.42, 100, 82.49], wp_norm, cat); } debug && window.console && console.log('Target XYZ', target_XYZ.join(', '), 'Actual XYZ', actual_XYZ.join(', ')); var target_CCT = jsapi.math.color.XYZ2CorColorTemp(target_XYZ[0], target_XYZ[1], target_XYZ[2]), actual_CCT = jsapi.math.color.XYZ2CorColorTemp(actual_XYZ[0], actual_XYZ[1], actual_XYZ[2]), target_Lab = jsapi.math.color.XYZ2Lab(target_XYZ[0], target_XYZ[1], target_XYZ[2], absolute && use_profile_wp_as_ref && profile_wp_norm), actual_Lab = jsapi.math.color.XYZ2Lab(actual_XYZ[0], actual_XYZ[1], actual_XYZ[2], absolute && use_profile_wp_as_ref && profile_wp_norm), delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], delta_calc_method), delta_CH = Math.sqrt(Math.pow(delta.C, 2) + Math.pow(delta.H, 2)); var rgb = jsapi.math.color.XYZ2RGB(actual_XYZ[0] / actual_XYZ[1] * 0.75, actual_XYZ[1] / actual_XYZ[1] * 0.75, actual_XYZ[2] / actual_XYZ[1] * 0.75, null, 255), brgb = []; for (var j = 0; j < 3; j ++) brgb[j] = Math.round(rgb[j] * .8); CCT.push(''); } CCT.push(''); for (var i = start - rstep; i >= end; i -= rstep) { CCT.push(''); } CCT.push(''); for (var i = 0; i < grayscale_values.length; i ++) { CCT.push(''); } CCT.push('
' + start + 'K
' + i + 'K
%' + (grayscale_values[i][0][0] / 255 * 100).accuracy(0) + '
'); //var idx = this.report_html.indexOf('
'); //this.report_html.splice(idx, 0, CCT.join('\n')); this.report_html = this.report_html.concat(CCT); // Gamma tracking var numgamma = 0, gamma_max = 3, gamma_min = 1.4; for (var i = 0; i < grayscale_values.length; i ++) { if (grayscale_values[i][1].gamma && grayscale_values[i][2].gamma) { numgamma ++; gamma_max = Math.max(gamma_max, grayscale_values[i][1].gammaR, grayscale_values[i][2].gammaR, grayscale_values[i][1].gammaG, grayscale_values[i][2].gammaG, grayscale_values[i][1].gammaB, grayscale_values[i][2].gammaB); gamma_min = Math.min(gamma_min, grayscale_values[i][1].gammaR, grayscale_values[i][2].gammaR, grayscale_values[i][1].gammaG, grayscale_values[i][2].gammaG, grayscale_values[i][1].gammaB, grayscale_values[i][2].gammaB); } } if (numgamma > 0) { var gamma_tracking = [], hwidth = 100 / 31, width = (100 - hwidth) / numgamma, start = Math.ceil(gamma_max * 10), end = Math.floor(gamma_min * 10), rows = start - end + 1, rstep = (start - end) / (rows - 1), rowh = 30; gamma_tracking.push('
'); gamma_tracking.push('

Gamma

'); gamma_tracking.push(' '); gamma_tracking.push(''); for (var i = 0; i < grayscale_values.length; i ++) { if (!grayscale_values[i][1].gamma || !grayscale_values[i][2].gamma) continue; var target_Lab = grayscale_values[i][3], actual_Lab = grayscale_values[i][4], target_gamma = grayscale_values[i][1].gamma, actual_gamma = grayscale_values[i][2].gamma, gamma = 2.2 + target_gamma - actual_gamma, Eprime = (0.75 ** 2.2) ** (1 / gamma), rgb = [], brgb = [], delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], delta_calc_method); for (var j = 0; j < 3; j ++) { rgb.push(Math.round(Eprime * 255)); brgb.push(Math.round(Eprime * 204)); } gamma_tracking.push(''); } gamma_tracking.push(''); for (var i = start - rstep; i >= end; i -= rstep) { gamma_tracking.push(''); } gamma_tracking.push(''); for (var i = 0; i < grayscale_values.length; i ++) { if (!grayscale_values[i][1].gamma || !grayscale_values[i][2].gamma) continue; gamma_tracking.push(''); } gamma_tracking.push('
' + (start / 10).toFixed(1) + '
' + (get_gammaRGB ? '
' : '') + '
' + (i / 10).toFixed(1) + '
%' + (grayscale_values[i][0][0] / 255 * 100).accuracy(0) + '
'); //var idx = this.report_html.indexOf('
'); //this.report_html.splice(idx, 0, gamma_tracking.join('\n')); this.report_html = this.report_html.concat(gamma_tracking); } // numgamma > 0 // RGB Balance var rgb_balance = [], hwidth = 100 / 21, width = (100 - hwidth) / grayscale_values.length, rows = 17, start = 40, end = -40, rstep = (start - end) / (rows - 1), rowh = 30, actual_white_Y = jsapi.math.color.Lab2XYZ(grayscale_values[grayscale_values.length - 1][4][0], 0, 0)[1]; rgb_balance.push('
'); rgb_balance.push('

RGB Gray Balance

'); rgb_balance.push(' '); rgb_balance.push(''); debug && window.console && console.log('RGB Gray Balance'); for (var i = 0; i < grayscale_values.length; i ++) { var target_Lab = grayscale_values[i][3], actual_Lab = grayscale_values[i][4], target_XYZ = jsapi.math.color.Lab2XYZ(target_Lab[0], target_Lab[1], target_Lab[2], absolute && use_profile_wp_as_ref && profile_wp_norm, 100.0), actual_XYZ = jsapi.math.color.Lab2XYZ(actual_Lab[0], actual_Lab[1], actual_Lab[2], absolute && use_profile_wp_as_ref && profile_wp_norm, 100.0), target_rgb = [target_XYZ[0] / target_XYZ[1], target_XYZ[1] / target_XYZ[1], target_XYZ[2] / target_XYZ[1]], //target_rgb = jsapi.math.color.XYZ2RGB(target_rgb[0], target_rgb[1], target_rgb[2], absolute && wp_norm_1, 1, false, false), target_rgb = jsapi.math.color.xyz_to_rgb_matrix(0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, (absolute && wp_norm_1) || "D65", 1.0).multiply(target_rgb), fact = 1, actual_xyY = jsapi.math.color.XYZ2xyY(actual_XYZ[0], actual_XYZ[1], actual_XYZ[2]), actual_rgb = [actual_xyY[0] / actual_xyY[1] * fact, fact, (1 - (actual_xyY[0] + actual_xyY[1])) / actual_xyY[1] * fact], //actual_rgb = jsapi.math.color.XYZ2RGB(actual_rgb[0], actual_rgb[1], actual_rgb[2], absolute && wp_norm_1, 1, false, false), actual_rgb = jsapi.math.color.xyz_to_rgb_matrix(0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, (absolute && wp_norm_1) || "D65", 1.0).multiply(actual_rgb), delta = jsapi.math.color.delta(target_Lab[0], target_Lab[1], target_Lab[2], actual_Lab[0], actual_Lab[1], actual_Lab[2], delta_calc_method); debug && window.console && console.log('Target XYZ', target_XYZ.join(', '), 'Actual XYZ', actual_XYZ.join(', ')); debug && window.console && console.log('Target RGB', target_rgb.join(', '), 'Actual RGB', actual_rgb.join(', ')); if (isNaN(jsapi.math.min(target_rgb)) || isNaN(jsapi.math.min(actual_rgb))) { rgb_balance.push(''); continue; } rgb_balance.push(''); } rgb_balance.push(''); for (var i = start - rstep; i >= end; i -= rstep) { rgb_balance.push(''); } rgb_balance.push(''); for (var i = 0; i < grayscale_values.length; i ++) { rgb_balance.push(''); } rgb_balance.push('
+' + start + '%
' + (i > 0 ? '+' : '') + i + '%
%' + (grayscale_values[i][0][0] / 255 * 100).accuracy(0) + '
'); //var idx = this.report_html.indexOf('
'); //this.report_html.splice(idx, 0, rgb_balance.join('\n')); this.report_html = this.report_html.concat(rgb_balance); } if (gamut_values.length) { var accuracy, offset, multiplier; switch (mode) { case "Lu'v'": xy = "u'v'"; accuracy = 4; offset = [10, 95]; multiplier = 1200; break; case 'XYZ': xy = 'XZ'; accuracy = 2; offset = [5, 95]; multiplier = 8; break; case 'xyY': xy = 'xy'; accuracy = 4; offset = [10, 95]; multiplier = 1000; break; default: xy = 'a*b*'; accuracy = 2; offset = [50, 50]; multiplier = 3; } this.report_html.push('
'); this.report_html.push('

Gamut CIE ' + xy + '

'); this.report_html.push('
'); // Sort by L* gamut_values.sort(function (a, b) { if (a[4][0] < b[4][0]) return -1; if (a[4][0] > b[4][0]) return 1; return 0; }); for (var i = 0; i < gamut_values.length; i ++) { var n = gamut_values[i][0], device_channels = gamut_values[i][1], device = gamut_values[i][2], target_color = gamut_values[i][3], target_xy, actual_color = gamut_values[i][5], actual_xy, target_rgb = gamut_values[i][6], actual_rgb = gamut_values[i][7], delta_calc_method = gamut_values[i][8], deltaE = gamut_values[i][9]; switch (mode) { case 'XYZ': target_xy = [target_color[2], target_color[0]]; actual_xy = [actual_color[2], actual_color[0]]; break; case 'xyY': target_xy = target_color; actual_xy = actual_color; break; default: target_xy = target_color.slice(1); actual_xy = actual_color.slice(1); } this.report_html.push('
'); } this.report_html.push('
'); } return this.report_html.join('\n') }; function bggridlines(rowh) { return window.btoa ? 'background-image: url(data:image/svg+xml;base64,' + btoa('') + ');' : ''; }; function trim(txt) { return txt.replace(/^\s+|\s+$/g, "") }; function lf2cr(txt) { return txt.replace(/\r\n/g, "\r").replace(/\n/g, "\r") }; function cr2lf(txt) { // CR LF = Windows // CR = Mac OS 9 // LF = Unix/Linux/Mac OS X return txt.replace(/\r\n/g, "\n").replace(/\r/g, "\n") }; function compact(txt, collapse_whitespace) { txt = trim(txt).replace(/\n\s+|\s+\n/g, "\n"); return collapse_whitespace?txt.replace(/\s+/g, " "):txt }; function comma2point(txt) { return decimal(txt) }; function decimal(txt, sr, re) { if (!sr) sr = "\\,"; if (!re) re = "."; return txt.replace(new RegExp("((^|\\s)\\-?\\d+)"+sr+"(\\d+(\\s|$))", "g"), "$1"+re+"$3") }; function toarray(txt, level) { txt=comma2point(compact(cr2lf(txt))); if (!txt) return []; if (level) { txt=txt.split(/\s/) } else { txt=txt.split("\n"); for (var i=0; i -1) current_cmyk = [actual[fields_extract_indexes_i[3]], actual[fields_extract_indexes_i[4]], actual[fields_extract_indexes_i[5]], actual[fields_extract_indexes_i[6]]]; } else { current_rgb = [actual[fields_extract_indexes_i[4]], actual[fields_extract_indexes_i[5]], actual[fields_extract_indexes_i[6]]]; if (fields_match.join(',').indexOf('CMYK') > -1) current_cmyk = [actual[fields_extract_indexes_i[0]], actual[fields_extract_indexes_i[1]], actual[fields_extract_indexes_i[2]], actual[fields_extract_indexes_i[3]]]; } for (var l=0; l 0 && current_rgb[0] < 100 && target_Lab[0] > 0 && actual_Lab[0] > 0) { if (!absolute) { target_XYZ = jsapi.math.color.Lab2XYZ(target_Lab[0], target_Lab[1], target_Lab[2], null, 100.0); actual_XYZ = jsapi.math.color.Lab2XYZ(actual_Lab[0], actual_Lab[1], actual_Lab[2], null, 100.0); } target.gamma = Math.log(target_XYZ[1] / 100) / Math.log(current_rgb[0] / 100); actual.gamma = Math.log(actual_XYZ[1] / 100) / Math.log(current_rgb[0] / 100); if (get_gammaRGB) { var profile_wp_norm_1 = [profile_wp_norm[0] / 100.0, profile_wp_norm[1] / 100.0, profile_wp_norm[2] / 100.0], wp_norm_1 = [wp_norm[0] / 100.0, wp_norm[1] / 100.0, wp_norm[2] / 100.0], target_RGB = jsapi.math.color.xyz_to_rgb_matrix(0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, (absolute && profile_wp_norm_1) || "D50", 1.0).multiply(target_XYZ), actual_RGB = jsapi.math.color.xyz_to_rgb_matrix(0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, (absolute && wp_norm_1) || "D50", 1.0).multiply(actual_XYZ); target.gammaR = Math.log(target_RGB[0] / 100) / Math.log(current_rgb[0] / 100); target.gammaG = Math.log(target_RGB[1] / 100) / Math.log(current_rgb[0] / 100); target.gammaB = Math.log(target_RGB[2] / 100) / Math.log(current_rgb[0] / 100); actual.gammaR = Math.log(actual_RGB[0] / 100) / Math.log(current_rgb[0] / 100); actual.gammaG = Math.log(actual_RGB[1] / 100) / Math.log(current_rgb[0] / 100); actual.gammaB = Math.log(actual_RGB[2] / 100) / Math.log(current_rgb[0] / 100); } else { target.gammaR = target.gamma; target.gammaG = target.gamma; target.gammaB = target.gamma; actual.gammaR = actual.gamma; actual.gammaG = actual.gamma; actual.gammaB = actual.gamma; } } } return {target_Lab: target_Lab, actual_Lab: actual_Lab, current_rgb: current_rgb, current_cmyk: current_cmyk, target_XYZ: target_XYZ, actual_XYZ: actual_XYZ}; }; function get_data(which) { var f=document.forms; if (which == "r" || !which) { data_ref=new dataset(f["F_data"].elements["FF_data_ref"].value) }; if (which == "i" || !which) { data_in=new dataset(f["F_data"].elements["FF_data_in"].value) }; if (which == "r" || !which) { if (!data_ref.data_format.length) return false; if (!data_ref.data.length) return false }; if (which == "i" || !which) { if (!data_in.data_format.length) return false; if (!data_in.data.length) return false }; return true }; function compare(set_delta_calc_method) { form_elements_set_disabled(null, true); var fe = document.forms["F_out"].elements, fe2 = document.forms["F_data"].elements; if (fe2["FF_variables"]) try { eval(fe2["FF_variables"].value); window.comparison_criteria = comparison_criteria; if (debug) alert("Comparsion criteria: " + (comparison_criteria.toSource ? comparison_criteria.toSource() : comparison_criteria)) } catch (e) { alert("Error parsing variable:\n" + e + "\nUsing default values.") }; var report = data_in.generate_report(set_delta_calc_method), criteria = comparison_criteria[fe['FF_criteria'].value]; document.getElementById('result').innerHTML = report; layout(); document.getElementById('reporttitle').style.visibility = "visible"; document.getElementById('report').style.visibility = "visible"; form_elements_set_disabled(null, false); form_element_set_disabled(fe['FF_absolute'], !!criteria.lock_use_absolute_values); form_element_set_disabled(fe['FF_use_profile_wp_as_ref'], !fe['FF_absolute'].checked); if (document.getElementsByClassName) { var canvas = document.getElementsByClassName('canvas'), inner_coords, mouse_is_down, mouse_down_coords; document.addEventListener('mouseup', function (e) { for (var i = 0; i < canvas.length; i ++) { jsapi.dom.attributeRemoveWord(canvas[i], 'class', 'dragging'); } mouse_is_down = false; }); for (var i = 0; i < canvas.length; i ++) { var act = Array.prototype.slice.apply(canvas[i].getElementsByClassName('act')), ref = Array.prototype.slice.apply(canvas[i].getElementsByClassName('ref')), pts = act.concat(ref); for (var j = 0; j < pts.length; j ++) { pts[j].addEventListener('mouseenter', function (e) { var linked = this.parentNode.parentNode.getElementsByClassName('patch-' + jsapi.dom.attr(this, 'data-index')); jsapi.dom.attributeAddWord(this.parentNode.parentNode, 'class', 'hover'); for (var k = 0; k < linked.length; k ++) { jsapi.dom.attributeAddWord(linked[k].parentNode, 'class', 'hover'); if (jsapi.dom.attributeHasWord(linked[k], 'class', 'ref')) { linked[k].style.backgroundColor = jsapi.dom.attr(linked[k], 'data-bgcolor'); linked[k].style.borderColor = jsapi.dom.attr(linked[k], 'data-bordercolor'); } } }); pts[j].addEventListener('mouseleave', function (e) { var linked = this.parentNode.parentNode.getElementsByClassName('patch-' + jsapi.dom.attr(this, 'data-index')); jsapi.dom.attributeRemoveWord(this.parentNode.parentNode, 'class', 'hover'); for (var k = 0; k < linked.length; k ++) { jsapi.dom.attributeRemoveWord(linked[k].parentNode, 'class', 'hover'); if (jsapi.dom.attributeHasWord(linked[k], 'class', 'ref')) { linked[k].style.backgroundColor = ''; linked[k].style.borderColor = ''; } } }); } // Reset viewport canvas[i].addEventListener('dblclick', function () { var inner = this.getElementsByClassName('inner')[0]; this.style.fontSize = '1px'; inner.style.marginLeft = ''; inner.style.marginTop = ''; }); // Click drag viewport canvas[i].addEventListener('mousedown', function (e) { var inner = this.getElementsByClassName('inner')[0]; inner_coords = [parseFloat(inner.style.marginLeft) || 0, parseFloat(inner.style.marginTop) || 0]; jsapi.dom.attributeAddWord(this, 'class', 'dragging'); mouse_is_down = true; mouse_down_coords = [e.pageX, e.pageY]; e.preventDefault(); }); canvas[i].addEventListener('mousemove', function (e) { if (mouse_is_down) { var fontSize = parseFloat(this.style.fontSize) || 1, inner = this.getElementsByClassName('inner')[0]; inner.style.marginLeft = inner_coords[0] + (e.pageX - mouse_down_coords[0]) / fontSize + 'em'; inner.style.marginTop = inner_coords[1] + (e.pageY - mouse_down_coords[1]) / fontSize + 'em'; } }); // Mousewheel zoom canvas[i].addEventListener('wheel', function (e) { var fontSize = parseFloat(this.style.fontSize) || 1; if ((e.deltaY < 0 && fontSize < 1000) || (e.deltaY > 0 && fontSize > 1)) { if (e.deltaY < 0) fontSize += fontSize / 4; else fontSize = Math.max(fontSize - fontSize / 4, 1); this.style.fontSize = fontSize + 'px'; e.preventDefault(); } }); } } return true }; function layout() { var padding = 0, borderwidth = 0, margin = 20, maxwidth = (document.getElementById("report").offsetWidth || 900) - padding * 2 - borderwidth * 2, tables = document.getElementsByTagName("table"); for (var i = 0; i < tables.length; i ++) { if (tables[i].offsetWidth > maxwidth) { maxwidth = tables[i].offsetWidth; document.body.style.width = (maxwidth + padding * 2 + borderwidth * 2) + 'px'; } } for (var i = 0; i < tables.length; i ++) tables[i].style.width = maxwidth + 'px'; } function form_element_set_disabled(form_element, disabled) { if (!form_element || form_element.readOnly || form_element.type == "hidden" || form_element.type == "file" || jsapi.dom.attributeHasWord(form_element, "class", "fakefile") || jsapi.dom.attributeHasWord(form_element, "class", "save") || jsapi.dom.attributeHasWord(form_element, "class", "delete")) return; if (form_element.name == "FF_delta_calc_method") disabled = form_element.disabled; disabled = disabled ? "disabled" : ""; form_element.disabled = disabled; if (disabled && !jsapi.dom.attributeHasWord(form_element, "class", "disabled")) jsapi.dom.attributeAddWord(form_element, "class", "disabled"); else if (!disabled && jsapi.dom.attributeHasWord(form_element, "class", "disabled")) jsapi.dom.attributeRemoveWord(form_element, "class", "disabled"); var labels = document.getElementsByTagName("label"); for (var i=0; i= 1% luminance) average absolute ΔC*76", window.CRITERIA_GRAYSCALE, DELTA_C_AVG, 1.0, 0.5, CIE76], ["RGB gray balance (>= 1% luminance) combined Δa*76 and Δb*76 range", window.CRITERIA_GRAYSCALE, DELTA_A_B_RANGE, 2.0, 1.5, CIE76], ["RGB gray balance (>= 1% luminance) maximum ΔC*76", window.CRITERIA_GRAYSCALE, DELTA_C_MAX, null, null, CIE76], ["RGB gray balance (>= 1% luminance) average absolute ΔC*94", window.CRITERIA_GRAYSCALE, DELTA_C_AVG, 1.0, 0.5, CIE94], ["RGB gray balance (>= 1% luminance) combined Δa*94 and Δb*94 range", window.CRITERIA_GRAYSCALE, DELTA_A_B_RANGE, 2.0, 1.5, CIE94], ["RGB gray balance (>= 1% luminance) maximum ΔC*94", window.CRITERIA_GRAYSCALE, DELTA_C_MAX, null, null, CIE94], ["RGB gray balance (>= 1% luminance) average absolute ΔC*00", window.CRITERIA_GRAYSCALE, DELTA_C_AVG, 1.0, 0.5, CIE00], ["RGB gray balance (>= 1% luminance) combined Δa*00 and Δb*00 range", window.CRITERIA_GRAYSCALE, DELTA_A_B_RANGE, 2.0, 1.5, CIE00], ["RGB gray balance (>= 1% luminance) maximum ΔC*00", window.CRITERIA_GRAYSCALE, DELTA_C_MAX, null, null, CIE00] ] ), CRITERIA_RULES_CMYK = CRITERIA_RULES_DEFAULT.clone(), CRITERIA_DEFAULT = { fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'], name: "Default", passtext: "Nominal tolerance passed", failtext: "Nominal tolerance exceeded", passrecommendedtext: "Recommended tolerance passed", failrecommendedtext: null, delta_calc_method: CIE00, // delta calculation method for overview lock_delta_calc_method: false, warn_deviation: 5, // values with greater Delta E will be marked in the overview (informational, not a pass criteria) rules: CRITERIA_RULES_DEFAULT }, CRITERIA_RGB = CRITERIA_DEFAULT.clone(), CRITERIA_CMYK = { fields_match: ['CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K'], fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'], id: "CMYK", name: "CMYK", strip_name: "CMYK", passtext: "Nominal tolerance passed", failtext: "Nominal tolerance exceeded", passrecommendedtext: "Recommended tolerance passed", failrecommendedtext: null, delta_calc_method: CIE00, // delta calculation method for overview lock_delta_calc_method: false, warn_deviation: 5, // values with greater Delta E will be marked in the overview (informational, not a pass criteria) rules: CRITERIA_RULES_CMYK }, CMYK_SOLID_PRIMARIES = [ [100, 0, 0, 0], [0, 100, 0, 0], [0, 0, 100, 0], [0, 0, 0, 100] ], CMY_SOLID_SECONDARIES = [ [100, 100, 0, 0], // C+M = Blue [0, 100, 100, 0], // M+Y = Red [100, 0, 100, 0] // C+Y = Green ], CMYK_SOLIDS = CMYK_SOLID_PRIMARIES.concat(CMY_SOLID_SECONDARIES), IDEALLIANCE_2009_CMY_GRAY = [ [3.1, 2.2, 2.2, 0], [10.2, 7.4, 7.4, 0], [25, 19, 19, 0], [50, 40, 40, 0], [75, 66, 66, 0] ], CRITERIA_IDEALLIANCE_2009 = { fields_match: ['CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K'], fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'], id: "IDEALLIANCE_2009", name: "IDEAlliance Control Strip 2009", passtext: "Nominal tolerance passed", failtext: "Nominal tolerance exceeded", passrecommendedtext: "Recommended tolerance passed", failrecommendedtext: null, delta_calc_method: CIE00, // delta calculation method for overview lock_delta_calc_method: true, warn_deviation: 3, // values with greater Delta E will be marked in the overview (informational, not a pass criteria) rules: CRITERIA_RULES_CMYK.clone().concat([ // description, [[C, M, Y, K],...], DELTA_[E|L|C|H]_[MAX|AVG], max, recommended, [CIE[76|94|00]|CMC11|CMC21] ["Paper white ΔL*00", [[0, 0, 0, 0]], DELTA_L_MAX, 2, 1, CIE00], ["Paper white Δa*00", [[0, 0, 0, 0]], DELTA_A_MAX, 1, .5, CIE00], ["Paper white Δb*00", [[0, 0, 0, 0]], DELTA_B_MAX, 2, 1, CIE00], /* ["Average ΔE*00", [], DELTA_E_AVG, 2, 1, CIE00], ["Maximum ΔE*00", [], DELTA_E_MAX, 6, 3, CIE00], */ ["CMYK solids maximum ΔE*00", CMYK_SOLIDS, DELTA_E_MAX, 7, 3, CIE00], ["CMY 50% grey ΔE*00", [[50, 40, 40, 0]], DELTA_E_MAX, 1.5, 0.75, CIE00], ["CMY grey maximum ΔL*00", IDEALLIANCE_2009_CMY_GRAY, DELTA_L_MAX, 2, 1, CIE00], ["CMY grey maximum Δa*00", IDEALLIANCE_2009_CMY_GRAY, DELTA_A_MAX, 1, .5, CIE00], ["CMY grey maximum Δb*00", IDEALLIANCE_2009_CMY_GRAY, DELTA_B_MAX, 1, .5, CIE00], ["CMY grey maximum ΔE*00", IDEALLIANCE_2009_CMY_GRAY, DELTA_E_MAX, 2, 1, CIE00] ]) }, CRITERIA_ISO12647_7 = { fields_match: ['CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K'], fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'], passtext: "Nominal tolerance passed", failtext: "Nominal tolerance exceeded", passrecommendedtext: "Recommended tolerance passed", failrecommendedtext: null, delta_calc_method: CIE76, // delta calculation method for overview lock_delta_calc_method: true, warn_deviation: 5, // values with greater Delta E will be marked in the overview (informational, not a pass criteria) rules: CRITERIA_RULES_CMYK.clone().concat([ // description, [[C, M, Y, K],...], DELTA_[E|L|C|H]_[MAX|AVG], max, recommended, [CIE[76|94|00]|CMC11|CMC21] ["Paper white ΔE*76", [[0, 0, 0, 0]], DELTA_E_MAX, 3, 1, CIE76], /* ["Average ΔE*", [], DELTA_E_AVG, 3, 2, CIE76], ["Maximum ΔE*", [], DELTA_E_MAX, 6, 5, CIE76], */ ["CMYK solids maximum ΔE*76", CMYK_SOLIDS, DELTA_E_MAX, 5, 3, CIE76], ["CMYK solids maximum ΔH*76", CMYK_SOLIDS, DELTA_H_MAX, 2.5, 1.5, CIE76], ["CMY grey average absolute ΔH*76", [ [100, 85, 85, 0], [80, 65, 65, 0], [60, 45, 45, 0], [40, 27, 27, 0], [20, 12, 12, 0], [10, 6, 6, 0] ], DELTA_H_AVG, 1.5, 0.5, CIE76] ]) }, CRITERIA_FOGRA_MEDIAWEDGE_3 = CRITERIA_ISO12647_7.clone(), CRITERIA_IDEALLIANCE_2013 = { fields_match: ['CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K'], fields_compare: ['LAB_L', 'LAB_A', 'LAB_B'], id: "IDEALLIANCE_2013", name: "IDEAlliance ISO 12647-7 Control Wedge 2013", passtext: "Nominal tolerance passed", failtext: "Nominal tolerance exceeded", passrecommendedtext: null, failrecommendedtext: null, delta_calc_method: CIE00, // delta calculation method for overview lock_delta_calc_method: true, warn_deviation: 5, // values with greater Delta E will be marked in the overview (informational, not a pass criteria) rules: CRITERIA_RULES_NEUTRAL.clone().concat([ // description, [[C, M, Y, K],...], DELTA_[E|L|C|H]_[MAX|AVG], max, recommended, [CIE[76|94|00]|CMC11|CMC21] /* ["Average ΔE*00", [], DELTA_E_AVG, 2, 1, CIE00], ["Maximum ΔE*00", [], DELTA_E_MAX, 6, 3, CIE00], */ ["CMYK primaries maximum ΔE*00", CMYK_SOLID_PRIMARIES.concat([ [75, 0, 0, 0], [50, 0, 0, 0], [25, 0, 0, 0], [10, 0, 0, 0], [0, 75, 0, 0], [0, 50, 0, 0], [0, 25, 0, 0], [0, 10, 0, 0], [0, 0, 75, 0], [0, 0, 50, 0], [0, 0, 25, 0], [0, 0, 10, 0], [0, 0, 0, 90], [0, 0, 0, 75], [0, 0, 0, 50], [0, 0, 0, 25], [0, 0, 0, 10], [0, 0, 0, 3] ]), DELTA_E_MAX, 5, null, CIE00], ["CMY grey maximum ΔE*00", [ [3, 2.24, 2.24, 0], [10, 7.46, 7.46, 0], [25, 18.88, 18.88, 0], [50, 40, 40, 0], [75, 66.12, 66.12, 0], [90, 85.34, 85.34, 0] ], DELTA_E_MAX, 3, null, CIE00] ]) }, CRITERIA_ISO14861_OUTER_GAMUT = CRITERIA_CMYK.clone(), comparison_criteria = { // values MUST pass these criteria RGB: CRITERIA_RGB }; CRITERIA_RGB.id = 'RGB'; CRITERIA_RGB.fields_match = ['RGB_R', 'RGB_G', 'RGB_B']; CRITERIA_RGB.name = "RGB"; CRITERIA_RGB.strip_name = "RGB"; CRITERIA_RGB.rules = CRITERIA_RULES_RGB; if (window.CRITERIA_GRAYSCALE) { comparison_criteria.RGB_GRAY = CRITERIA_RGB.clone(); comparison_criteria.RGB_GRAY.delta_calc_method = CIE00; comparison_criteria.RGB_GRAY.id = 'RGB_GRAY'; comparison_criteria.RGB_GRAY.name = "RGB + gray balance"; comparison_criteria.RGB_GRAY.rules = CRITERIA_RULES_VERIFY; }; var CRITERIA_ISO14861_COLOR_ACCURACY = CRITERIA_RGB.clone(); CRITERIA_ISO14861_COLOR_ACCURACY.id = 'ISO_14861_COLOR_ACCURACY_RGB318'; CRITERIA_ISO14861_COLOR_ACCURACY.name = "ISO 14861:2015 color accuracy"; CRITERIA_ISO14861_COLOR_ACCURACY.passrecommendedtext = null; CRITERIA_ISO14861_COLOR_ACCURACY.lock_delta_calc_method = true; for (var i = 0; i < CRITERIA_RULES_RGB.length; i ++) { // Reset tolerances CRITERIA_ISO14861_COLOR_ACCURACY.rules[i][3] = null; // nominal CRITERIA_ISO14861_COLOR_ACCURACY.rules[i][4] = null; // recommended } CRITERIA_ISO14861_COLOR_ACCURACY.rules[8][3] = 2.5; // Average ΔE*00 nominal CRITERIA_ISO14861_COLOR_ACCURACY.rules.push(["99% percentile ΔE*00", [], DELTA_E_PERCENTILE_99, 4.5, null, CIE00]); comparison_criteria['ISO_14861_COLOR_ACCURACY_RGB318'] = CRITERIA_ISO14861_COLOR_ACCURACY; comparison_criteria['CMYK'] = CRITERIA_CMYK; comparison_criteria['FOGRA_MW3'] = CRITERIA_FOGRA_MEDIAWEDGE_3; comparison_criteria['IDEALLIANCE_2009'] = CRITERIA_IDEALLIANCE_2009; comparison_criteria['IDEALLIANCE_2013'] = CRITERIA_IDEALLIANCE_2013; comparison_criteria['ISO14861_OUTER_GAMUT'] = CRITERIA_ISO14861_OUTER_GAMUT; comparison_criteria['CMYK_FOGRA_MEDIAWEDGE_V3'] = CRITERIA_FOGRA_MEDIAWEDGE_3; for (var i=27; i<=47; i++) { comparison_criteria['1x_MW2_FOGRA' + i + 'L_SB'] = CRITERIA_FOGRA_MEDIAWEDGE_3; comparison_criteria['2x_MW2_FOGRA' + i + 'L_SB'] = CRITERIA_FOGRA_MEDIAWEDGE_3; comparison_criteria['FOGRA' + i + '_MW2_SUBSET'] = CRITERIA_FOGRA_MEDIAWEDGE_3; comparison_criteria['FOGRA' + i + '_MW3_SUBSET'] = CRITERIA_FOGRA_MEDIAWEDGE_3; }; comparison_criteria['FOGRASTRIP3'] = CRITERIA_FOGRA_MEDIAWEDGE_3; comparison_criteria['CMYK_IDEALLIANCE_CONTROLSTRIP_2009'] = CRITERIA_IDEALLIANCE_2009; comparison_criteria['GRACOLCOATED1_ISO12647-7_CONTROLSTRIP2009_REF'] = CRITERIA_IDEALLIANCE_2009; comparison_criteria['SWOPCOATED3_ISO12647-7_CONTROLSTRIP2009_REF'] = CRITERIA_IDEALLIANCE_2009; comparison_criteria['SWOPCOATED5_ISO12647-7_CONTROLSTRIP2009_REF'] = CRITERIA_IDEALLIANCE_2009; comparison_criteria['CMYK_IDEALLIANCE_ISO_12647-7_CONTROL_WEDGE_2013'] = CRITERIA_IDEALLIANCE_2013; comparison_criteria['CMYK_ISO_12647-7_OUTER_GAMUT'] = CRITERIA_ISO14861_OUTER_GAMUT; CRITERIA_ISO14861_OUTER_GAMUT.id = 'ISO14861_OUTER_GAMUT'; CRITERIA_ISO14861_OUTER_GAMUT.name = "ISO 14861:2015 outer gamut"; CRITERIA_ISO14861_OUTER_GAMUT.passrecommendedtext = null; CRITERIA_ISO14861_OUTER_GAMUT.lock_delta_calc_method = true; CRITERIA_ISO14861_OUTER_GAMUT.warn_deviation = 2.5; for (var i = 0; i < CRITERIA_RULES_CMYK.length; i ++) { // Reset tolerances CRITERIA_ISO14861_OUTER_GAMUT.rules[i][3] = null; // nominal CRITERIA_ISO14861_OUTER_GAMUT.rules[i][4] = null; // recommended } CRITERIA_ISO14861_OUTER_GAMUT.rules[11][3] = 2.5; // Maximum ΔE*00 nominal CRITERIA_FOGRA_MEDIAWEDGE_3.id = 'FOGRA_MW3'; CRITERIA_FOGRA_MEDIAWEDGE_3.name = "Fogra Media Wedge V3"; CRITERIA_FOGRA_MEDIAWEDGE_3.strip_name = "Ugra/Fogra Media Wedge CMYK V3.0"; CRITERIA_IDEALLIANCE_2009.rules[8][3] = 2; // Average ΔE*00 nominal CRITERIA_IDEALLIANCE_2009.rules[11][3] = 6; // Maximum ΔE*00 nominal CRITERIA_IDEALLIANCE_2013.rules[8][3] = 4; // Average ΔE*00 nominal CRITERIA_IDEALLIANCE_2013.rules[11][3] = 6.5; // Maximum ΔE*00 nominal DisplayCAL-3.5.0.0/DisplayCAL/report/jsapi-packages.js0000644000076500000000000010322013142403032022144 0ustar devwheel00000000000000/* ############################## */ /* ##### jsapi Distribution ##### */ /* ############################## */ /* 2006 Florian Hoech Function.prototype.apply.js adds apply method for functions in browsers without native implementation */ if (!Function.prototype.apply) { Function.prototype.apply = function(o, args) { o = o ? Object(o) : window; o.__apply__ = this; for (var i = 0, sargs = []; i < args.length; i ++) sargs[i] = "args[" + i + "]"; var result = eval("o.__apply__(" + sargs.join(",") + ");"); o.__apply__ = null; return result } }; /* ##### Array.prototype.pop.js ##### */ /* 2006 Ash Searle http://hexmen.com/blog/2006/12/push-and-pop/ */ if (!Array.prototype.pop) Array.prototype.pop = function() { // Removes the last element from an array and returns that element. This method changes the length of the array. var n = this.length >>> 0, value; if (n) { value = this[--n]; delete this[n] }; this.length = n; return value }; if (!Array.pop) Array.pop = function(object) { return Array.prototype.pop.apply(object) }; /* ##### Array.prototype.shift.js ##### */ /* 2006 Florian Hoech Array.prototype.shift.js adds shift method for arrays in browsers without native or incorrect implementation */ if (!Array.prototype.shift) Array.prototype.shift = function() { // Removes the first element from an array and returns that element. This method changes the length of the array. var n = this.length >>> 0, value = this[0]; for (var i = 1; i < n; i ++) this[i - 1] = this[i]; delete this[n]; this.length = n - 1 >>> 0; return value }; if (!Array.shift) Array.shift = function(object) { return Array.prototype.shift.apply(object) }; /* ##### Array.prototype.unshift.js ##### */ /* 2006 Florian Hoech Array.prototype.unshift.js adds unshift method for arrays in browsers without native or incorrect implementation */ if (!Array.prototype.unshift) Array.prototype.unshift = function() { // Adds one or more elements to the beginning of an array and returns the new length of the array. var n = this.length >>> 0; for (var i = (n - 1) >>> 0; i >= 0; i --) this[i + arguments.length] = this[i]; for (var i = arguments.length - 1; i >= 0; i --) { this[i] = arguments[i]; n = n + 1 >>> 0 }; this.length = n; return n }; /* ##### Array.prototype.push.js ##### */ /* 2006 Ash Searle http://hexmen.com/blog/2006/12/push-and-pop/ */ if (!Array.prototype.push || [].push(0) == 0) Array.prototype.push = function() { var n = this.length >>> 0; for (var i = 0; i < arguments.length; i++) { this[n] = arguments[i]; n = n + 1 >>> 0 }; this.length = n; return n }; /* ##### Array.prototype.splice.js ##### */ /* 2006 Florian Hoech Array.prototype.splice.js adds splice method for arrays in browsers without native or incorrect implementation */ if (!Array.prototype.splice || [0].splice(0, 1) === 0) Array.prototype.splice = function(index, howMany) { /* Changes the content of an array, adding new elements while removing old elements. Returns an array containing the removed elements. If only one element is removed, an array of one element is returned. Returns undefined if no arguments are passed. */ if (arguments.length == 0) return index; if (typeof index != "number") index = 0; if (index < 0) index = Math.max(0, this.length + index); if (index > this.length) { if (arguments.length > 2) index = this.length; else return [] }; if (arguments.length < 2) howMany = this.length - index; howMany = (typeof howMany == "number") ? Math.max(0, howMany) : 0; var removedElements = this.slice(index, index + howMany); var elementsToMove = this.slice(index + howMany); this.length = index; for (var i = 2; i < arguments.length; i ++) this[this.length] = arguments[i]; for (var i = 0; i < elementsToMove.length; i ++) this[this.length] = elementsToMove[i]; return removedElements }; /* ##### Number.prototype.toFixed.js ##### */ /* 2006 Florian Hoech Number.prototype.toFixed.js */ if (!Number.prototype.toFixed) { Number.prototype.toFixed = function(ln) { if (!ln) ln = 0; var i, n = Math.pow(10, ln), n = (Math.round(this * n) / n) + ""; if (ln && (i = n.indexOf(".")) < 0) { i = n.length; n += "." }; while (n.substr(i).length < ln + 1) n += "0"; return n } }; /* ##### Array.prototype.indexOf.js ##### */ /* http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf Summary Returns the first index at which a given element can be found in the array, or -1 if it is not present. Method of Array Implemented in: JavaScript 1.6 (Gecko 1.8b2 and later) ECMAScript Edition: none Syntax var index = array.indexOf(searchElement[, fromIndex]); Parameters searchElement Element to locate in the array. fromIndex The index at which to begin the search. Defaults to 0, i.e. the whole array will be searched. If the index is greater than or equal to the length of the array, -1 is returned, i.e. the array will not be searched. If negative, it is taken as the offset from the end of the array. Note that even when the index is negative, the array is still searched from front to back. If the calculated index is less than 0, the whole array will be searched. Description indexOf compares searchElement to elements of the Array using strict equality (the same method used by the ===, or triple-equals, operator). Compatibility indexOf is a JavaScript extension to the ECMA-262 standard; as such it may not be present in other implementations of the standard. You can work around this by inserting the following code at the beginning of your scripts, allowing use of indexOf in ECMA-262 implementations which do not natively support it. This algorithm is exactly the one used in Firefox and SpiderMonkey. Again, note that this implementation aims for absolute compatibility with indexOf in Firefox and the SpiderMonkey JavaScript engine, including in cases where the index passed to indexOf is not an integer value. If you intend to use this in real-world applications, you may not need all of the code to calculate from. Example: Using indexOf The following example uses indexOf to locate values in an array. var array = [2, 5, 9]; var index = array.indexOf(2); // index is 0 index = array.indexOf(7); // index is -1 Example: Finding all the occurrences of an element The following example uses indexOf to find all the indices of an element in a given array, using push to add them to another array as they are found. var indices = []; var idx = array.indexOf(element) while (idx != -1) { indices.push(idx); idx = array.indexOf(element, idx + 1); } */ // NOTE: semicolons added where necessary to make compatible with JavaScript compressors if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(elt /*, from*/) { var len = this.length; var from = Number(arguments[1]) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; for (; from < len; from++) { if (/* from in this && */ /* Not compatible with IE/Mac */ this[from] === elt) return from }; return -1 } }; /* ##### jsapi.js ##### */ /* 2006 Florian Hoech jsapi.js */ jsapi = function() { return new jsapi.jsapi(arguments); }; jsapi.constants = { OBJECTTYPES: { OBJECT: 0, ARRAY: 1, BOOLEAN: 2, DATE: 3, FUNCTION: 4, NUMBER: 5, REGEXP: 6, STRING: 7 } }; jsapi.extend = function(object, _this) { jsapi.jsapi.prototype.extend(object, _this) }; jsapi.jsapi = function() { var objectType; if (!jsapi.initialized) { for (var propertyName in jsapi.dom) if (typeof jsapi.dom[propertyName] == "function" && !jsapi.dom[propertyName]._args) jsapi.dom[propertyName]._args = [jsapi.dom.isNode]; for (var propertyName in jsapi.regexp) if (typeof jsapi.regexp[propertyName] == "function") jsapi.regexp[propertyName]._args = [function(argument) { return argument.constructor == RegExp; }]; for (var propertyName in jsapi.string) if (typeof jsapi.string[propertyName] == "function") jsapi.string[propertyName]._args = [function(argument) { return typeof argument == "string" || argument.constructor == String; }]; for (var propertyName in jsapi) jsapi.extend(jsapi[propertyName], jsapi[propertyName]); var arrayMethodNames = [ "every", "filter", "forEach", "indexOf", "join", "lastIndexOf", "map", "slice", "some", /* Mutator methods */ "pop", "push", "reverse", "shift", "sort", "splice", "unshift" ]; for (var i = 0; i < arrayMethodNames.length; i ++) { (function (arrayMethodName) { jsapi.jsapi.prototype[arrayMethodName] = function () { var result = Array.prototype[arrayMethodName].apply(this, arguments); return typeof result == "object" ? jsapi(result) : (result != null || arrayMethodName == "pop" || arrayMethodName == "shift" ? result : this); } })(arrayMethodNames[i]); }; jsapi.initialized = true; }; if (this.length == null) this.length = 0; for (var i = 0; i < arguments[0].length; i ++) { var object = arguments[0][i]; switch (typeof object) { case "function": objectType = jsapi.constants.OBJECTTYPES.FUNCTION; break; case "number": objectType = jsapi.constants.OBJECTTYPES.NUMBER; break; case "string": objectType = jsapi.constants.OBJECTTYPES.STRING; break; default: if (!object) continue; // null or undefined switch (object.constructor) { case Boolean: objectType = jsapi.constants.OBJECTTYPES.BOOLEAN; break; case Date: objectType = jsapi.constants.OBJECTTYPES.DATE; break; case Number: objectType = jsapi.constants.OBJECTTYPES.NUMBER; break; case RegExp: objectType = jsapi.constants.OBJECTTYPES.REGEXP; break; case String: objectType = jsapi.constants.OBJECTTYPES.STRING; break; default: objectType = jsapi.constants.OBJECTTYPES.OBJECT; } }; switch (objectType) { case jsapi.constants.OBJECTTYPES.STRING: var expression = object.split(":"); if (expression.length > 1) switch (expression[0]) { case "html": case "xhtml": case "xml": object = jsapi.dom.parseString(expression.slice(1).join(":")); break; case "xpath": object = jsapi.dom.getByXpath(expression.slice(1).join(":")); break; } else if (/<[^<]*>/.test(object)) object = jsapi.dom.parseString(object); default: if (object.constructor == Array) Array.prototype.push.apply(this, object); else if (typeof object == "object" && typeof object.length == "number" && object.constructor != String && object.constructor != Function) Array.prototype.push.apply(this, Array.prototype.slice.apply(object)); else this[this.length ++] = object; } }; }; jsapi.jsapi.prototype = { concat: function(object) { var result = jsapi(this); jsapi.jsapi.apply(result, [object]); return result }, extend: function(object, _this) { /* if _this evaluates to false, use the current result as "this"-object. otherwise, use _this as "this"-object and pass the current result as first argument. */ for (var propertyName in object) if (typeof object[propertyName] == "function" && propertyName != "$" && propertyName != "extend" && propertyName != "toString" && propertyName != "valueOf") { if (!this[propertyName]) { this[propertyName] = function() { if (this.length) { var _callbacks = arguments.callee._callbacks; for (var i = 0; i < this.length; i ++) { for (var n = 0; n < _callbacks.length; n ++) { var _this = _callbacks[n]._this || this[i], _arguments = _callbacks[n]._this ? [this[i]].concat(Array.prototype.slice.apply(arguments)) : arguments; if (_callbacks[n].hasValidArguments.apply(_callbacks[n], _arguments)) { this[i] = _callbacks[n].apply(_this, _arguments); } } } }; return this; }; this[propertyName]._callbacks = []; }; if (!object[propertyName].hasValidArguments) { if (object[propertyName]._args) object[propertyName].hasValidArguments = function() { for (var i = 0; i < this._args.length; i ++) { if (!(typeof this._args[i] == "string" ? typeof arguments[i] == this._args[i] : (typeof this._args[i] == "function" ? this._args[i](arguments[i]) : arguments[i] == this._args[i]))) { return false; } }; return true }; else object[propertyName].hasValidArguments = function() { return true }; }; object[propertyName]._this = _this; if (this[propertyName]._callbacks.indexOf(object[propertyName]) < 0) this[propertyName]._callbacks.push(object[propertyName]); } }, toString: function() { return Array.prototype.slice.apply(this).toString(); } }; /* ##### jsapi.array.js ##### */ /* 2006 Florian Hoech jsapi.array.js jsapi.js */ jsapi.array = { $: function(object) { // make array from object with only the numerical indices var array = [], n; if (object.length != null) for (var i = 0; i < object.length; i ++) array[i] = object[i]; else for (var i in object) if (!isNaN(n = parseInt(i)) && n == i) array[n] = object[i]; return array } }; jsapi.array.$._args = [null]; /* ##### jsapi.array.flat.js ##### */ /* 2006 Florian Hoech jsapi.array.search.js jsapi.array.js */ jsapi.array.flat = function(a) { var r = []; for (var i = 0; i < a.length; i ++) { if (a[i].constructor == Array) r = r.concat(jsapi.array.flat(a[i])); else r.push(a[i]) }; return r }; jsapi.array.flat._args = [Array]; /* ##### jsapi.dom.js ##### */ /* 2006 Florian Hoech jsapi.dom.js jsapi.js */ jsapi.dom = {}; /* ##### jsapi.dom.NODETYPES.js ##### */ /* 2006 Florian Hoech jsapi.dom.NODETYPES.js jsapi.dom.js */ jsapi.dom.NODETYPES = { "1": "ELEMENT", "2": "ATTRIBUTE", "3": "TEXT", "4": "CDATA_SECTION", "5": "ENTITY_REFERENCE", "6": "ENTITY", "7": "PROCESSING_INSTRUCTION", "8": "COMMENT", "9": "DOCUMENT", "10": "DOCUMENT_TYPE", "11": "DOCUMENT_FRAGMENT", "12": "NOTATION" }; /* ##### jsapi.dom.isNode.js ##### */ /* Florian Hoech jsapi.dom.isNode.js jsapi.dom.NODETYPES.js */ jsapi.dom.isNode = function(object) { return !!(object && jsapi.dom.NODETYPES[object.nodeType] && object.cloneNode); }; /* ##### jsapi.string.js ##### */ /* 2006 Florian Hoech jsapi.string.js jsapi.js */ jsapi.string = {}; /* ##### jsapi.string.trim.js ##### */ /* 2006 Florian Hoech jsapi.string.trim.js jsapi.string.js */ jsapi.string.trim = function(str) { return str.replace(/(^\s+|\s+$)/g, "") }; jsapi.string.trim._args = [String]; /* ##### jsapi.useragent.js ##### */ /* 2006 Florian Hoech jsapi.useragent.js jsapi.string.trim.js TO-DO: add KHTML */ jsapi.useragent = { $: function (ua) { ua = (ua || navigator.userAgent).toLowerCase(); var i, j, match, _match, replace = [ [/(\d+\.)(\d+)\.(\d+)(\.(\d+))?/g, "$1$2$3$5"], [/linux/g, ";linux;linux"], [/mac/, ";mac;mac"], [/microsoft ((p)ocket )?internet explorer/g, "ms$2ie"], [/win32/g, "windows"], [/windows (\w+)/g, "windows;windows $1"] ]; for (i = 0; i < replace.length; i ++) ua = ua.replace(replace[i][0], replace[i][1]); ua = ua.split(/[\(\)\[\]\{\}\,;]/); for (i in this) { if (typeof this[i] != "object" && typeof this[i] != "function") delete this[i] }; for (i = 0; i < ua.length; i ++) { match = ua[i].match(/[a-z\.\-_]+(\s+[a-z\.\-_]+)*\Wv?\d+(\.\d+)*/g); if (match) { for (j = 0; j < match.length; j ++) { _match = match[j].match(/([a-z\.\-_]+(\s[a-z\.\-_]+)*)\Wv?(\d+(\.\d+)*)/); if (!this[_match[1]] || (parseFloat(_match[3]) == _match[3] && this[_match[1]] < parseFloat(_match[3]))) this[_match[1]] = parseFloat(_match[3]) == _match[3] ? parseFloat(_match[3]) : _match[3] } } else { ua[i] = jsapi.string.trim(ua[i]); if (ua[i]) this[ua[i]] = true } }; if (this.konqueror && !this.khtml) this.khtml = true; if (this.safari === true) delete this.safari; // safari would have a version number here if (!this.gecko && this.mozilla) { this.compatible = this.mozilla; delete this.mozilla }; if (this.opera || this.safari || this.konqueror) { if (this.mozilla) delete this.mozilla; if (this.msie) delete this.msie }; return this } }; jsapi.useragent.toString = function() { var props = []; for (i in this) { if (typeof this[i] != "object" && typeof this[i] != "function") props.push((/\s/.test(i) ? "'" : "") + i + (/\s/.test(i) ? "'" : "") + ":" + (typeof this[i] == "string" ? '"' : "") + this[i] + (typeof this[i] == "string" ? '"' : "")) }; return props.join(", "); }; jsapi.useragent.$._args = [String]; jsapi.useragent.$(); /* ##### jsapi.util.js ##### */ /* 2006 Florian Hoech jsapi.util.js jsapi.js */ jsapi.util = {}; /* ##### jsapi.generic_accessor_mutator.js ##### */ /* Florian Hoech jsapi.generic_accessor_mutator.js jsapi.js jsapi.dom.js jsapi.dom.isNode.js jsapi.useragent.js jsapi.util.js */ jsapi.constants.ATTRIBUTE_ALIASES = { "class": "className", "for": "htmlFor", readonly: "readOnly", maxlength: "maxLength" }; jsapi._attribute = function(object, attributeName, value) { // if arguments.length == 2, get attribute. otherwise, if value == null, remove attribute, else set attribute switch (attributeName) { case "style": case "value": return arguments.length == 2 ? jsapi._property(object, attributeName) : jsapi._property(object, attributeName, value); default: if (jsapi.constants.ATTRIBUTE_ALIASES[attributeName]) return jsapi._property.apply(jsapi, arguments); else { if (arguments.length == 2) return object.getAttribute(attributeName); // get attribute if (value == null) object.removeAttribute(attributeName); // remove attribute else object.setAttribute(attributeName, value); // set attribute } }; return object }; jsapi._property = function(object, propertyName, value) { // if arguments.length == 2, get property. otherwise, if value == null, delete property, else set property switch (propertyName) { case "style": if (arguments.length == 2) return object.style.cssText; // get attribute object.style.cssText = value || ""; // set attribute break; }; if (jsapi.dom.isNode(object)) propertyName = jsapi.constants.ATTRIBUTE_ALIASES[propertyName] || propertyName; if (arguments.length == 2) return object[propertyName]; object[propertyName] = value; // set property if (value == null) try { delete object[propertyName] } catch (e) { }; // delete property return object }; jsapi.dom.attr = jsapi.dom.attribute = function (object, attribute, value) { return arguments.length == 2 && (typeof attribute != "object" || attribute.constructor == Array) ? jsapi._get(object, jsapi._attribute, attribute) : jsapi._set(object, jsapi._attribute, attribute, value); }; jsapi.util.prop = jsapi.util.property = function (object, property, value) { return arguments.length == 2 && (typeof property != "object" || property.constructor == Array) ? jsapi._get(object, jsapi._property, property) : jsapi._set(object, jsapi._property, property, value); }; jsapi._get = function (object, callback, property) { if (typeof property != "object") return callback(object, property); else { var result = []; for (var i = 0; i < property.length; i ++) result.push(callback(object, property[i])); return result; } }; jsapi._set = function (object, callback, property, value) { if (typeof property != "object") callback(object, property, value); else { if (property.constructor == Array) for (var i = 0; i < property.length; i ++) callback(object, property[i], value); else for (var propertyName in property) callback(object, propertyName, property[propertyName] != null ? property[propertyName] : value); }; return object; };; /* ##### jsapi.dom.attribute.js ##### */ /* 2006 Florian Hoech jsapi.dom.attribute.js jsapi.generic_accessor_mutator.js */ /* ##### jsapi.dom.attributeAddWord.js ##### */ /* 2006 Florian Hoech jsapi.dom.attributeAddWord.js jsapi.dom.attribute.js */ jsapi.dom.attributeAddWord = function(element, attr, word) { var value = jsapi.dom.attribute(element, attr); return jsapi.dom.attribute(element, attr, (value != null ? value + " " : "") + word) }; /* ##### jsapi.dom.attributeHasWord.js ##### */ /* 2006 Florian Hoech jsapi.dom.attributeHasWord.js jsapi.dom.attribute.js */ jsapi.dom.attributeHasWord = function(element, attr, word) { return (new RegExp("(^|\\s)" + word + "(\\s|$)")).test(jsapi.dom.attribute(element, attr)) }; /* ##### jsapi.dom.attributeRemoveWord.js ##### */ /* 2006 Florian Hoech jsapi.dom.attributeRemoveWord.js jsapi.dom.attribute.js */ jsapi.dom.attributeRemoveWord = function(element, attr, word) { var value = jsapi.dom.attribute(element, attr); if (value) jsapi.dom.attribute(element, attr, value.replace(new RegExp("(^|\\s+)" + word + "(\\s|$)"), "$2")); return element }; /* ##### jsapi.math.js ##### */ /* 2006 Florian Hoech jsapi.math.js jsapi.array.flat.js */ jsapi.math = { absmax: function(v) { var a = jsapi.array.flat(arguments), r = a[0]; for (var i = 0; i < a.length; i ++) if (Math.abs(r) < Math.abs(a[i])) r = a[i]; return r }, avg: function() { var a = jsapi.array.flat(arguments), r = 0; for (var i = 0; i < a.length; i ++) r += a[i]; return r / a.length }, avgabs: function() { var a = jsapi.array.flat(arguments), r = 0; for (var i = 0; i < a.length; i ++) r += Math.abs(a[i]); return r / a.length }, cbrt: function(x) { return x >= 0 ? Math.pow (x, 1 / 3) : -Math.pow (-x, 1 / 3) }, deg: function(v) { return v * 180 / Math.PI }, longToUnsigned: function(num) { while (num < 0) num += 4294967296; return num }, max: function(v) { var a = jsapi.array.flat(arguments), r = a[0]; for (var i = 0; i < a.length; i ++) r = Math.max(r, a[i]); return r }, min: function(v) { var a = jsapi.array.flat(arguments), r = a[0]; for (var i = 0; i < a.length; i ++) r = Math.min(r, a[i]); return r }, rad: function(v) { return v / 180 * Math.PI } }; jsapi.math.absmax._args = [Number]; jsapi.math.avg._args = [Number]; jsapi.math.cbrt._args = [Number]; jsapi.math.deg._args = [Number]; jsapi.math.longToUnsigned._args = [Number]; jsapi.math.max._args = [Array]; jsapi.math.min._args = [Array]; jsapi.math.rad._args = [Number]; /* ##### jsapi.math.color.js ##### */ /* 2006 Florian Hoech jsapi.math.color.js jsapi.math.js */ jsapi.math.color = {}; /* ##### jsapi.math.color.XYZ2CorColorTemp.js ##### */ /* 2007 Florian Hoech jsapi.math.color.XYZ2CorColorTemp.js jsapi.math.color.js */ jsapi.math.color.XYZ2CorColorTemp = function(x, y, z) { // derived from ANSI C implementation by Bruce Lindbloom www.brucelindbloom.com // LERP(a,b,c) = linear interpolation macro, is 'a' when c == 0.0 and 'b' when c == 1.0 function LERP(a,b,c) { return (b - a) * c + a }; var rt = [ // reciprocal temperature (K) Number.MIN_VALUE, 10.0e-6, 20.0e-6, 30.0e-6, 40.0e-6, 50.0e-6, 60.0e-6, 70.0e-6, 80.0e-6, 90.0e-6, 100.0e-6, 125.0e-6, 150.0e-6, 175.0e-6, 200.0e-6, 225.0e-6, 250.0e-6, 275.0e-6, 300.0e-6, 325.0e-6, 350.0e-6, 375.0e-6, 400.0e-6, 425.0e-6, 450.0e-6, 475.0e-6, 500.0e-6, 525.0e-6, 550.0e-6, 575.0e-6, 600.0e-6 ]; var uvt = [ [0.18006, 0.26352, -0.24341], [0.18066, 0.26589, -0.25479], [0.18133, 0.26846, -0.26876], [0.18208, 0.27119, -0.28539], [0.18293, 0.27407, -0.30470], [0.18388, 0.27709, -0.32675], [0.18494, 0.28021, -0.35156], [0.18611, 0.28342, -0.37915], [0.18740, 0.28668, -0.40955], [0.18880, 0.28997, -0.44278], [0.19032, 0.29326, -0.47888], [0.19462, 0.30141, -0.58204], [0.19962, 0.30921, -0.70471], [0.20525, 0.31647, -0.84901], [0.21142, 0.32312, -1.0182], [0.21807, 0.32909, -1.2168], [0.22511, 0.33439, -1.4512], [0.23247, 0.33904, -1.7298], [0.24010, 0.34308, -2.0637], [0.24792, 0.34655, -2.4681], // Note: 0.24792 is a corrected value for the error found in W&S as 0.24702 [0.25591, 0.34951, -2.9641], [0.26400, 0.35200, -3.5814], [0.27218, 0.35407, -4.3633], [0.28039, 0.35577, -5.3762], [0.28863, 0.35714, -6.7262], [0.29685, 0.35823, -8.5955], [0.30505, 0.35907, -11.324], [0.31320, 0.35968, -15.628], [0.32129, 0.36011, -23.325], [0.32931, 0.36038, -40.770], [0.33724, 0.36051, -116.45] ]; var us, vs, p, di, dm, i; if ((x < 1e-20) && (y < 1e-20) && (z < 1e-20)) return -1; // protect against possible divide-by-zero failure us = (4 * x) / (x + 15 * y + 3 * z); vs = (6 * y) / (x + 15 * y + 3 * z); dm = 0; for (i = 0; i < 31; i++) { di = (vs - uvt[i][1]) - uvt[i][2] * (us - uvt[i][0]); if ((i > 0) && (((di < 0) && (dm >= 0)) || ((di >= 0) && (dm < 0)))) break; // found lines bounding (us, vs) : i-1 and i dm = di }; if (i == 31) return -1; // bad XYZ input, color temp would be less than minimum of 1666.7 degrees, or too far towards blue di = di / Math.sqrt(1 + uvt[i ][2] * uvt[i ][2]); dm = dm / Math.sqrt(1 + uvt[i - 1][2] * uvt[i - 1][2]); p = dm / (dm - di); // p = interpolation parameter, 0.0 : i-1, 1.0 : i return 1 / (LERP(rt[i - 1], rt[i], p)); }; /* ##### jsapi.math.color.delta.js ##### */ /* 2007 Florian Hoech jsapi.math.color.delta.js jsapi.math.color.js */ jsapi.math.color.delta = function (L1, a1, b1, L2, a2, b2, method, p1, p2, p3, debug) { /* CIE 1994 & CMC calculation code derived from formulas on www.brucelindbloom.com CIE 1994 code uses some alterations seen on www.farbmetrik-gall.de/cielab/korrcielab/cie94.html (see notes in code below) CIE 2000 calculation code derived from Excel spreadsheet available at www.ece.rochester.edu/~gsharma/ciede2000 method: either "CIE94", "CMC", "CIE2K" or "CIE76" (default if method is not set) p1, p2, p3 arguments have different meaning for each calculation method: CIE 1994: if p1 is not null, calculation will be adjusted for textiles, otherwise graphics arts (default if p1 is not set) CMC(l:c): p1 equals l (lightness) weighting factor and p2 equals c (chroma) weighting factor. commonly used values are CMC(1:1) for perceptability (default if p1 and p2 are not set) and CMC(2:1) for acceptability CIE 2000: p1 becomes kL (lightness) weighting factor, p2 becomes kC (chroma) weighting factor and p3 becomes kH (hue) weighting factor (all three default to 1 if not set) */ for (var i = 0; i < 6; i ++) if (typeof arguments[i] != "number" || isNaN(arguments[i])) return NaN; if (typeof method == "string") method = method.toLowerCase(); switch (method) { case "94": case "1994": case "cie94": case "cie1994": var textiles = p1, dL = L1 - L2, C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)), C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2)), dC = C1 - C2, dH2 = Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2), dH = dH2 > 0 ? Math.sqrt(dH2) : 0, SL = 1, K1 = textiles ? 0.048 : 0.045, K2 = textiles ? 0.014 : 0.015, C_ = Math.sqrt(C1 * C2), // symmetric chrominance SC = 1 + K1 * C_, SH = 1 + K2 * C_, KL = textiles ? 2 : 1, KC = 1, KH = 1, dE = Math.sqrt(Math.pow(dL / (KL * SL), 2) + Math.pow(dC / (KC * SC), 2) + Math.pow(dH / (KH * SH), 2)); break; case "cmc(2:1)": case "cmc21": p1 = 2; case "cmc(1:1)": case "cmc11": case "cmc": var l = typeof p1 == "number" ? p1 : 1, c = typeof p2 == "number" ? p2 : 1; dL = L1 - L2, C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)), C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2)), dC = C1 - C2, dH2 = Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2), dH = dH2 > 0 ? Math.sqrt(dH2) : 0, SL = L1 < 16 ? 0.511 : (0.040975 * L1) / (1 + 0.01765 * L1), SC = (0.0638 * C1) / (1 + 0.0131 * C1) + 0.638, F = Math.sqrt(Math.pow(C1, 4) / (Math.pow(C1, 4) + 1900)), H1 = jsapi.math.deg(Math.atan2(b1, a1)) + (b1 >= 0 ? 0 : 360), T = 164 <= H1 && H1 <= 345 ? 0.56 + Math.abs(0.2 * Math.cos(jsapi.math.rad(H1 + 168))) : 0.36 + Math.abs(0.4 * Math.cos(jsapi.math.rad(H1 + 35))), SH = SC * (F * T + 1 - F), dE = Math.sqrt(Math.pow(dL / (l * SL), 2) + Math.pow(dC / (c * SC), 2) + Math.pow(dH / SH, 2)); break; case "00": case "2k": case "2000": case "cie00": case "cie2k": case "cie2000": var pow25_7 = Math.pow(25, 7), k_L = typeof p1 == "number" ? p1 : 1, k_C = typeof p2 == "number" ? p2 : 1, k_H = typeof p3 == "number" ? p3 : 1, C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)), C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2)) , C_avg = jsapi.math.avg(C1, C2), G = .5 * (1 - Math.sqrt(Math.pow(C_avg, 7) / (Math.pow(C_avg, 7) + pow25_7))), L1_ = L1, a1_ = (1 + G) * a1, b1_ = b1, L2_ = L2, a2_ = (1 + G) * a2, b2_ = b2, C1_ = Math.sqrt(Math.pow(a1_, 2) + Math.pow(b1_, 2)), C2_ = Math.sqrt(Math.pow(a2_, 2) + Math.pow(b2_, 2)), h1_ = a1_ == 0 && b1_ == 0 ? 0 : jsapi.math.deg(Math.atan2(b1_, a1_)) + (b1_ >= 0 ? 0 : 360), h2_ = a2_ == 0 && b2_ == 0 ? 0 : jsapi.math.deg(Math.atan2(b2_, a2_)) + (b2_ >= 0 ? 0 : 360), dh_cond = h2_ - h1_ > 180 ? 1 : (h2_ - h1_ < -180 ? 2 : 0), dh_ = dh_cond == 0 ? h2_ - h1_ : (dh_cond == 1 ? h2_ - h1_ - 360 : h2_ + 360 - h1_), dL_ = L2_ - L1_, dL = dL_, dC_ = C2_ - C1_, dC = dC_, dH_ = 2 * Math.sqrt(C1_ * C2_) * Math.sin(jsapi.math.rad(dh_ / 2)), dH = dH_, L__avg = jsapi.math.avg(L1_, L2_), C__avg = jsapi.math.avg(C1_, C2_), h__avg_cond = C1_ * C2_ == 0 ? 3 : (Math.abs(h2_ - h1_) <= 180 ? 0 : (h2_ + h1_ < 360 ? 1 : 2)), h__avg = h__avg_cond == 3 ? h1_ + h2_ : (h__avg_cond == 0 ? jsapi.math.avg(h1_, h2_) : (h__avg_cond == 1 ? jsapi.math.avg(h1_, h2_) + 180 : jsapi.math.avg(h1_, h2_) - 180)), AB = Math.pow(L__avg - 50, 2), // (L'_ave-50)^2 S_L = 1 + .015 * AB / Math.sqrt(20 + AB), S_C = 1 + .045 * C__avg, T = 1 - .17 * Math.cos(jsapi.math.rad(h__avg - 30)) + .24 * Math.cos(jsapi.math.rad(2 * h__avg)) + .32 * Math.cos(jsapi.math.rad(3 * h__avg + 6)) - .2 * Math.cos(jsapi.math.rad(4 * h__avg - 63)), S_H = 1 + .015 * C__avg * T, dTheta = 30 * Math.exp(-1 * Math.pow((h__avg - 275) / 25, 2)), R_C = 2 * Math.sqrt(Math.pow(C__avg, 7) / (Math.pow(C__avg, 7) + pow25_7)), R_T = -Math.sin(jsapi.math.rad(2 * dTheta)) * R_C, AJ = dL_ / S_L / k_L, // dL' / k_L / S_L AK = dC_ / S_C / k_C, // dC' / k_C / S_C AL = dH_ / S_H / k_H, // dH' / k_H / S_H dE = Math.sqrt(Math.pow(AJ, 2) + Math.pow(AK, 2) + Math.pow(AL, 2) + R_T * AK * AL); if (debug) { r = (C1 + "|" + C2 + "|" + C_avg + "|" + G + "|" + L1_ + "|" + a1_ + "|" + b1_ + "|" + L2_ + "|" + a2_ + "|" + b2_ + "|" + C1_ + "|" + C2_ + "|" + h1_ + "|" + h2_ + "|" + dh_ + "|" + dL_ + "|" + dC_ + "|" + dH_ + "|" + L__avg + "|" + C__avg + "|" + h__avg + "|" + AB + "|" + S_L + "|" + S_C + "|" + T + "|" + S_H + "|" + dTheta + "|" + R_C + "|" + R_T + "|" + AJ + "|" + AK + "|" + AL + "|" + dE + "|" + dh_cond + "|" + h__avg_cond).split("|"); alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; t = []; n = alpha.indexOf("G"); for (i = 0; i < r.length; i ++) { a = i + n < alpha.length ? alpha[i + n] : "A" + alpha[i + n - alpha.length]; t.push(a + ": " + r[i]); } return t.join("\n"); }; break; default: var dL = L1 - L2, C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2)), C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2)), dC = C1 - C2, dH2 = Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2), dH = dH2 > 0 ? Math.sqrt(dH2) : 0, dE = Math.sqrt(Math.pow(dL, 2) + Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2)); if (isNaN(dH)) { if (window.location.href.indexOf("?debug")>-1) alert('a1: ' + a1 + '\na2: ' + a2 + '\nMath.pow(a1 - a2, 2): ' + Math.pow(a1 - a2, 2) + '\nb1: ' + b1 + '\nb2: ' + b2 + '\nMath.pow(b1 - b2, 2): ' + Math.pow(b1 - b2, 2) + '\ndC: ' + dC + '\nMath.pow(dC, 2): ' + Math.pow(dC, 2) + '\nMath.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2): ' + (Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2) - Math.pow(dC, 2))); } }; return { E: dE, L: dL, C: dC, H: dH, a: a1 - a2, b: b1 - b2 }; }; DisplayCAL-3.5.0.0/DisplayCAL/report/jsapi-patches.js0000644000076500000000000004430413242301034022024 0ustar devwheel00000000000000function sortNumber(a, b) { return a - b; }; jsapi.array.flat = function(a) { var r = []; for (var i = 0; i < a.length; i ++) { if (a[i] != null && a[i].constructor == Array) r = r.concat(jsapi.array.flat(a[i])); else r.push(a[i]) }; return r }; jsapi.array.flat._args = [Array]; jsapi.math.median = function () { // http://en.wikipedia.org/wiki/Median var a = jsapi.array.flat(arguments), median, sorted = a.sort(sortNumber), half = sorted.length / 2; if (sorted.length % 2 == 0) median = (sorted[half - 1] + sorted[half]) / 2; else median = sorted[Math.floor(half)]; return median }; jsapi.math.mad = function () { // http://en.wikipedia.org/wiki/Median_absolute_deviation var a = jsapi.array.flat(arguments), median = jsapi.math.median(a), sorted = a.sort(sortNumber); for (var i = 0; i < sorted.length; i++) sorted[i] = Math.abs(sorted[i] - median); return jsapi.math.median(sorted); }; jsapi.math.percentile = function (a, n) { // n is assumed to be scaled to 0..1 range without bounds if (a.length === 0) return 0; a = jsapi.array.flat(a); // Sort numbers ascending a.sort(function (a, b) { return a - b; }); if (n <= 0) return a[0]; if (n >= 1) return a[a.length - 1]; var index = (a.length - 1) * n, lower = Math.floor(index), upper = lower + 1, weight = index % 1; if (upper >= a.length) return a[lower]; return a[lower] * (1 - weight) + a[upper] * weight; }; jsapi.math.stddev = function () { // http://en.wikipedia.org/wiki/Standard_deviation // http://jsfromhell.com/array/average return Math.sqrt(jsapi.math.variance(jsapi.array.flat(arguments))); }; jsapi.math.variance = function () { // http://jsfromhell.com/array/average var a = jsapi.array.flat(arguments); for (var m, s = 0, l = a.length; l--; s += a[l]); for (m = s / a.length, l = a.length, s = 0; l--; s += Math.pow(a[l] - m, 2)); return s / a.length; }; jsapi.math.color.adapt = function (XS, YS, ZS, whitepoint_source, whitepoint_destination, MA) { // chromatic adaption // based on formula http://brucelindbloom.com/Eqn_ChromAdapt.html // MA = adaption matrix or predefined choice ('CAT02', 'Bradford', 'HPE D65', 'XYZ scaling'), // defaults to 'Bradford' if (!MA) MA = 'Bradford'; if (typeof MA == 'string') { switch (MA) { case 'XYZ scaling': MA = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; break; case 'HPE D65': MA = [[ 0.40024, 0.70760, -0.08081], [-0.22630, 1.16532, 0.04570], [ 0.00000, 0.00000, 0.91822]]; break; case 'CAT02': MA = [[ 0.7328, 0.4296, -0.1624], [-0.7036, 1.6975, 0.0061], [ 0.0030, 0.0136, 0.9834]]; break; case 'Bradford': default: MA = [[ 0.8951, 0.2664, -0.1614], [-0.7502, 1.7135, 0.0367], [ 0.0389, -0.0685, 1.0296]]; } }; if (MA.constructor != jsapi.math.Matrix3x3) MA = new jsapi.math.Matrix3x3(MA); var XYZWS = jsapi.math.color.get_whitepoint(whitepoint_source), pybs = MA.multiply(XYZWS), XYZWD = jsapi.math.color.get_whitepoint(whitepoint_destination), pybd = MA.multiply(XYZWD); return MA.invert().multiply([[pybd[0]/pybs[0], 0, 0], [0, pybd[1]/pybs[1], 0], [0, 0, pybd[2]/pybs[2]]]).multiply(MA).multiply([XS, YS, ZS]); }; jsapi.math.color.Lab2RGB = function (L, a, b, whitepoint, whitepoint_source, scale, round_, cat, clamp) { var XYZ = jsapi.math.color.Lab2XYZ(L, a, b, whitepoint || "D50"); if (!whitepoint_source) XYZ = jsapi.math.color.adapt(XYZ[0], XYZ[1], XYZ[2], whitepoint_source || "D50", "D65", cat); return jsapi.math.color.XYZ2RGB(XYZ[0], XYZ[1], XYZ[2], "D65", scale, round_, clamp) }; jsapi.math.color.Lab2XYZ = function(L, a, b, whitepoint, scale) { // based on http://www.easyrgb.com/math.php?MATH=M8 // whitepoint can be a color temperature in Kelvin or an array containing XYZ values if (!scale) scale = 1.0; var Y = ( L + 16 ) / 116, X = a / 500 + Y, Z = Y - b / 200; // Bruce Lindbloom's fix for the discontinuity of the CIE L* function // (http://brucelindbloom.com/LContinuity.html) var E = 216 / 24389, // Intent of CIE standard, actual CIE standard = 0.008856 K = 24389 / 27; // Intent of CIE standard, actual CIE standard = 903.3 // K / 116 is used instead of 7.787 if ( Math.pow(Y, 3) > E ) Y = Math.pow(Y, 3); else Y = ( Y - 16 / 116 ) / (K / 116); if ( Math.pow(X, 3) > E ) X = Math.pow(X, 3); else X = ( X - 16 / 116 ) / (K / 116); if ( Math.pow(Z, 3) > E ) Z = Math.pow(Z, 3); else Z = ( Z - 16 / 116 ) / (K / 116); var ref_XYZ = jsapi.math.color.get_whitepoint(whitepoint, scale); X *= ref_XYZ[0]; Y *= ref_XYZ[1]; Z *= ref_XYZ[2]; return [X, Y, Z] }; jsapi.math.color.XYZ2RGB = function (X, Y, Z, whitepoint, scale, round_, clamp) { if (!scale) scale = 1.0; var RGB = jsapi.math.color.xyz_to_rgb_matrix(0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, whitepoint || "D65", 1.0).multiply([X, Y, Z]); // sRGB for (var i = 0; i < 3; i ++) { if (RGB[i] > 0.0031308) { RGB[i] = 1.055 * Math.pow(RGB[i], 1 / 2.4) - 0.055; } else { RGB[i] *= 12.92; } if (clamp == undefined || !!clamp) RGB[i] = Math.min(1.0, Math.max(0, RGB[i])); RGB[i] *= scale; if (round_) RGB[i] = Math.round(RGB[i]); } return RGB; }; jsapi.math.color.CIEDCorColorTemp2XYZ = function(T, scale) { var xyY = jsapi.math.color.CIEDCorColorTemp2xyY(T, scale); return jsapi.math.color.xyY2XYZ(xyY[0], xyY[1], xyY[2]); }; jsapi.math.color.CIEDCorColorTemp2xyY = function(T, scale) { // Based on formula from http://brucelindbloom.com/Eqn_T_to_xy.html if (!scale) scale = 1.0; if (typeof T == "string") { // Assume standard illuminant, e.g. "D50" var illuminant = jsapi.math.color.get_standard_illuminant(T, null, scale); return jsapi.math.color.XYZ2xyY(illuminant[0], illuminant[1], illuminant[2]); } var xD = 4000 <= T && T <= 7000 ? ((-4.607 * Math.pow(10, 9)) / Math.pow(T, 3)) + ((2.9678 * Math.pow(10, 6)) / Math.pow(T, 2)) + ((0.09911 * Math.pow(10, 3)) / T) + 0.244063 : (7000 < T && T <= 25000 ? ((-2.0064 * Math.pow(10, 9)) / Math.pow(T, 3)) + ((1.9018 * Math.pow(10, 6)) / Math.pow(T, 2)) + ((0.24748 * Math.pow(10, 3)) / T) + 0.237040 : null), yD = xD != null ? -3 * Math.pow(xD, 2) + 2.87 * xD - 0.275 : null; return xD == null ? null : [xD, yD, scale]; }; jsapi.math.color.CMYK2RGB = function(C, M, Y, K, scale, round_) { // http://www.easyrgb.com/math.php?MATH=M14 if (!scale) scale = 1.0; C = ( C * ( 1 - K ) + K ); M = ( M * ( 1 - K ) + K ); Y = ( Y * ( 1 - K ) + K ); // http://www.easyrgb.com/math.php?MATH=M12 var R, G, B; R = ( 1 - C ) * scale; G = ( 1 - M ) * scale; B = ( 1 - Y ) * scale; if (round_) { R = Math.round(R); G = Math.round(G); B = Math.round(B); } return [R, G, B]; }; jsapi.math.color.XYZ2Lab = function(X, Y, Z, whitepoint) { /* Convert from XYZ to Lab. The input Y value needs to be in the nominal range [0.0, 100.0] and other input values scaled accordingly. The output L value is in the nominal range [0.0, 100.0]. whitepoint can be string (e.g. "D50"), list/tuple of XYZ coordinates or color temperature as float or int. Defaults to D50 if not set. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_Lab.html */ whitepoint = jsapi.math.color.get_whitepoint(whitepoint, 100); var E = 216 / 24389, // Intent of CIE standard, actual CIE standard = 0.008856 K = 24389 / 27, // Intent of CIE standard, actual CIE standard = 903.3 xr = X / whitepoint[0], yr = Y / whitepoint[1], zr = Z / whitepoint[2], fx = xr > E ? jsapi.math.cbrt(xr) : (K * xr + 16) / 116, fy = yr > E ? jsapi.math.cbrt(yr) : (K * yr + 16) / 116, fz = zr > E ? jsapi.math.cbrt(zr) : (K * zr + 16) / 116, L = 116 * fy - 16, a = 500 * (fx - fy), b = 200 * (fy - fz); return [L, a, b]; }; jsapi.math.color.XYZ2Lu_v_ = function(X, Y, Z, whitepoint) { /* Convert from XYZ to CIE Lu'v' */ if (X + Y + Z == 0) { // We can't check for X == Y == Z == 0 because they may actually add up // to 0, thus resulting in ZeroDivisionError later var XYZ = jsapi.math.color.get_whitepoint(whitepoint), Lu_v_ = jsapi.math.color.XYZ2Lu_v_(XYZ[0], XYZ[1], XYZ[2]); return [0, Lu_v_[1], Lu_v_[2]]; } var XYZr = jsapi.math.color.get_whitepoint(whitepoint, 100), yr = Y / XYZr[1], L = yr > 216 / 24389 ? 116 * jsapi.math.cbrt(yr) - 16 : 24389 / 27 * yr, u_ = (4 * X) / (X + 15 * Y + 3 * Z), v_ = (9 * Y) / (X + 15 * Y + 3 * Z); return [L, u_, v_]; }; jsapi.math.color.xyY2XYZ = function(x, y, Y) { /* Convert from xyY to XYZ. Based on formula from http://brucelindbloom.com/Eqn_xyY_to_XYZ.html Implementation Notes: 1. Watch out for the case where y = 0. In that case, X = Y = Z = 0 is returned. 2. The output XYZ values are in the nominal range [0.0, Y[xyY]]. */ if (y == 0) return [0, 0, 0]; if (Y == null) Y = 1.0; var X = (x * Y) / y, Z = (1 - x - y) * Y / y; return [X, Y, Z]; }; jsapi.math.color.XYZ2xyY = function (X, Y, Z, whitepoint) { /* Convert from XYZ to xyY. Based on formula from http://brucelindbloom.com/Eqn_XYZ_to_xyY.html Implementation Notes: 1. Watch out for black, where X = Y = Z = 0. In that case, x and y are set to the chromaticity coordinates of the reference whitepoint. 2. The output Y value is in the nominal range [0.0, Y[XYZ]]. */ if (X == Y && Y == Z && Z == 0) { whitepoint = jsapi.math.color.get_whitepoint(whitepoint); var xyY = jsapi.math.color.XYZ2xyY(whitepoint[0], whitepoint[1], whitepoint[2]); return [xyY[0], xyY[1], 0.0]; } var x = X / (X + Y + Z), y = Y / (X + Y + Z); return [x, y, Y]; }; jsapi.math.color.planckianCT2XYZ = function(T) { var xyY = jsapi.math.color.planckianCT2xyY(T); return jsapi.math.color.xyY2XYZ(xyY[0], xyY[1], xyY[2]); }; jsapi.math.color.planckianCT2xyY = function (T) { /* Convert from planckian temperature to xyY. T = temperature in Kelvin. Formula from http://en.wikipedia.org/wiki/Planckian_locus */ var x, y; if (1667 <= T && T <= 4000) x = ( -0.2661239 * (Math.pow(10, 9) / Math.pow(T, 3)) - 0.2343580 * (Math.pow(10, 6) / Math.pow(T, 2)) + 0.8776956 * (Math.pow(10, 3) / T) + 0.179910); else if (4000 <= T && T <= 25000) x = ( -3.0258469 * (Math.pow(10, 9) / Math.pow(T, 3)) + 2.1070379 * (Math.pow(10, 6) / Math.pow(T, 2)) + 0.2226347 * (Math.pow(10, 3) / T) + 0.24039); else return null; if (1667 <= T && T <= 2222) y = ( -1.1063814 * Math.pow(x, 3) - 1.34811020 * Math.pow(x, 2) + 2.18555832 * x - 0.20219683); else if (2222 <= T && T <= 4000) y = ( -0.9549476 * Math.pow(x, 3) - 1.37418593 * Math.pow(x, 2) + 2.09137015 * x - 0.16748867); else if (4000 <= T && T <= 25000) y = ( 3.0817580 * Math.pow(x, 3) - 5.87338670 * Math.pow(x, 2) + 3.75112997 * x - 0.37001483); return [x, y, 1.0] }; jsapi.math.color.xyz_to_rgb_matrix = function (xr, yr, xg, yg, xb, yb, whitepoint, scale) { // Create and return an XYZ to RGB matrix if (!scale) scale = 1.0; var cachehash = [xr, yr, xg, yg, xb, yb, whitepoint, scale].join(","), cache = jsapi.math.color.xyz_to_rgb_matrix.cache[cachehash]; if (cache) return cache; whitepoint = jsapi.math.color.get_whitepoint(whitepoint, scale); var XYZr = jsapi.math.color.xyY2XYZ(xr, yr, scale), XYZg = jsapi.math.color.xyY2XYZ(xg, yg, scale), XYZb = jsapi.math.color.xyY2XYZ(xb, yb, scale), SrSgSb = new jsapi.math.Matrix3x3([[XYZr[0], XYZg[0], XYZb[0]], [XYZr[1], XYZg[1], XYZb[1]], [XYZr[2], XYZg[2], XYZb[2]]]).invert().multiply(whitepoint); return jsapi.math.color.xyz_to_rgb_matrix.cache[cachehash] = new jsapi.math.Matrix3x3([[SrSgSb[0] * XYZr[0], SrSgSb[1] * XYZg[0], SrSgSb[2] * XYZb[0]], [SrSgSb[0] * XYZr[1], SrSgSb[1] * XYZg[1], SrSgSb[2] * XYZb[1]], [SrSgSb[0] * XYZr[2], SrSgSb[1] * XYZg[2], SrSgSb[2] * XYZb[2]]]).invert(); }; jsapi.math.color.xyz_to_rgb_matrix.cache = {}; jsapi.math.color.standard_illuminants = { // 1st level is the standard name => illuminant definitions // 2nd level is the illuminant name => CIE XYZ coordinates // (Y should always assumed to be 1.0 and is not explicitly defined) "None": {"E": {"X": 1.00000, "Z": 1.00000}}, "ASTM E308-01": {"A": {"X": 1.09850, "Z": 0.35585}, "C": {"X": 0.98074, "Z": 1.18232}, "D50": {"X": 0.96422, "Z": 0.82521}, "D55": {"X": 0.95682, "Z": 0.92149}, "D65": {"X": 0.95047, "Z": 1.08883}, "D75": {"X": 0.94972, "Z": 1.22638}, "F2": {"X": 0.99186, "Z": 0.67393}, "F7": {"X": 0.95041, "Z": 1.08747}, "F11": {"X": 1.00962, "Z": 0.64350}}, "ICC": {"D50": {"X": 0.9642, "Z": 0.8249}, "D65": {"X": 0.9505, "Z": 1.0890}}, "Wyszecki & Stiles": {"A": {"X": 1.09828, "Z": 0.35547}, "B": {"X": 0.99072, "Z": 0.85223}, "C": {"X": 0.98041, "Z": 1.18103}, "D55": {"X": 0.95642, "Z": 0.92085}, "D65": {"X": 0.95017, "Z": 1.08813}, "D75": {"X": 0.94939, "Z": 1.22558}} }; jsapi.math.color.get_standard_illuminant = function (illuminant_name, priority, scale) { if (!priority) priority = ["ICC", "ASTM E308-01", "Wyszecki & Stiles", "None"]; if (!scale) scale = 1.0; var cachehash = [illuminant_name, priority, scale].join(","), cache = jsapi.math.color.get_standard_illuminant.cache[cachehash]; if (cache) return cache; var illuminant = null; for (var i = 0; i < priority.length; i ++) { if (!jsapi.math.color.standard_illuminants[priority[i]]) throw 'Unrecognized standard "' + priority[i] + '"'; illuminant = jsapi.math.color.standard_illuminants[priority[i]][illuminant_name.toUpperCase()]; if (illuminant) return jsapi.math.color.get_standard_illuminant.cache[cachehash] = [illuminant["X"] * scale, 1.0 * scale, illuminant["Z"] * scale]; } throw 'Unrecognized illuminant "' + illuminant_name + '"'; }; jsapi.math.color.get_standard_illuminant.cache = {}; jsapi.math.color.get_whitepoint = function (whitepoint, scale) { // Return a whitepoint as XYZ coordinates if (whitepoint && whitepoint.constructor == Array) return whitepoint; if (!scale) scale = 1.0; if (!whitepoint) whitepoint = "D50"; var cachehash = [whitepoint, scale].join(","), cache = jsapi.math.color.get_whitepoint.cache[cachehash]; if (cache) return cache; if (typeof whitepoint == "string") whitepoint = jsapi.math.color.get_standard_illuminant(whitepoint); else if (typeof whitepoint == "number") whitepoint = jsapi.math.color.CIEDCorColorTemp2XYZ(whitepoint); if (scale > 1.0 && whitepoint[1] == 100) scale = 1.0; return jsapi.math.color.get_whitepoint.cache[cachehash] = [whitepoint[0] * scale, whitepoint[1] * scale, whitepoint[2] * scale]; }; jsapi.math.color.get_whitepoint.cache = {}; jsapi.math.Matrix3x3 = function (matrix) { if (matrix.length != 3) throw 'Invalid number of rows for 3x3 matrix: ' + matrix.length; for (var i=0; i 0) str += ', '; str += '[' + this[i].join(', ') + ']'; }; return str + ']'; } }; DisplayCAL-3.5.0.0/DisplayCAL/report/print.css0000644000076500000000000000077212665102036020613 0ustar devwheel00000000000000#F_data, .options, .functions { display: none; } body { background: white; font-size: .75em; padding: 1em; } h1 { background: #333333; border-radius: 1.1em; -moz-border-radius: 1.1em; -webkit-border-radius: 1.1em; color: white; display: block; font-size: 1em; font-weight: normal; margin: 0 auto .5em; padding: .5em .9em; width: 19em; } h2 { font-weight: lighter; font-size: 2em; } p { line-height: 1.5em; } .graph th, .graph tr.x td { background: #fff; } .collapsed { display: none; } DisplayCAL-3.5.0.0/DisplayCAL/report/report.html0000644000076500000000000001227413154615407021153 0ustar devwheel00000000000000 Measurement Report ${REPORT_VERSION} — ${DISPLAY} — ${DATETIME}

Measurement Report ${REPORT_VERSION}

${DISPLAY} — ${DATETIME}






DisplayCAL-3.5.0.0/DisplayCAL/report/uniformity.functions.js0000644000076500000000000004272613154615407023531 0ustar devwheel00000000000000// Number methods p=Number.prototype; p.accuracy = function(ln) { var n = Math.pow(10, ln || 0); return Math.round(this * n) / n }; p.fill=function(ipart, fpart) { var i, v=(fpart!=null?this.toFixed(fpart):this+""); if ((i = v.indexOf(".")) > -1) ipart+=v.substr(i).length; while (v.length Ymax) Ymax = results[i][j]['XYZ'][1]; } } var scale = 100 / Ymax; for (var i = 0; i < rows * cols; i ++) { for (var j = 0; j < results[i].length; j ++) { var XYZ = results[i][j]['XYZ']; results[i][j]['XYZ_scaled'] = [scale * XYZ[0], scale * XYZ[1], scale * XYZ[2]]; results[i][j]['CCT'] = jsapi.math.color.XYZ2CorColorTemp(XYZ[0], XYZ[1], XYZ[2]); if (i == reference_index) { // Reference white results[i][j]['XYZ_100'] = [XYZ[0] / reference[0]['XYZ'][1] * 100, XYZ[1] / reference[0]['XYZ'][1] * 100, XYZ[2] / reference[0]['XYZ'][1] * 100]; if (location.search.indexOf('debug') > -1) console.log(i, j, 'XYZ', XYZ, '-> XYZ_100', results[i][j]['XYZ_100']); } } // ISO 14861: Calculate 50% gray to white ratio R based on abs. luminance (cd/m2) results[i]['R'] = results[i][results[i].length / 2]['XYZ'][1] / results[i][0]['XYZ'][1]; } for (var i = 0; i < rows * cols; i ++) { for (var j = 0; j < results[i].length; j ++) { var XYZ = results[i][j]['XYZ'], XYZ_scaled = results[i][j]['XYZ_scaled']; if (i == reference_index) { // Reference white XYZ_100 = results[i][j]['XYZ_100']; } else { // Scale luminance relative to reference luminance results[i][j]['XYZ_100'] = XYZ_100 = [XYZ[0] / reference[0]['XYZ'][1] * 100, XYZ[1] / reference[0]['XYZ'][1] * 100, XYZ[2] / reference[0]['XYZ'][1] * 100]; if (location.search.indexOf('debug') > -1) console.log(i, j, 'XYZ', XYZ, '-> XYZ_100', results[i][j]['XYZ_100']); } results[i][j]['Lab'] = jsapi.math.color.XYZ2Lab(XYZ_100[0], XYZ_100[1], XYZ_100[2], reference[0]['XYZ_100']); if (location.search.indexOf('debug') > -1) console.log(i, j, 'XYZ_100', XYZ, '-> L*a*b*', results[i][j]['Lab'], 'ref white', reference[0]['XYZ_100']); results[i][j]['Lab_scaled'] = jsapi.math.color.XYZ2Lab(XYZ_scaled[0], XYZ_scaled[1], XYZ_scaled[2], reference[0]['XYZ_100']); if (location.search.indexOf('debug') > -1) console.log(i, j, 'XYZ_100', XYZ, '-> L*a*b* (scaled)', results[i][j]['Lab_scaled'], 'ref white', reference[0]['XYZ_100']); } // ISO 14861: Calculate new ratio T by dividing gray/white ratio by reference gray/white ratio, subtracting one and calculating the absolute value T.push(Math.abs(results[i]['R'] / reference['R'] - 1)); } for (var i = 0; i < rows * cols; i ++) { deltas.push([]); curdeltas.push([]); result_delta_E.push([]); for (var j = 0; j < results[i].length; j ++) { var rLab = reference[j]['Lab'], Lab = results[i][j]['Lab'], curdelta = jsapi.math.color.delta(rLab[0], rLab[1], rLab[2], Lab[0], Lab[1], Lab[2], "2k"), delta_ab = [curdelta['a'], curdelta['b']]; curdelta['ab'] = jsapi.math.max(delta_ab) - jsapi.math.min(delta_ab); deltas[i].push(curdelta); curdeltas[i].push(curdelta[delta]); result_delta_E[i].push(curdelta['E']); delta_E.push(curdelta['E']); } } // ISO 14861:2015 tone uniformity var delta_E_max = jsapi.math.max(delta_E), delta_E_max_color = '', delta_E_max_mark = ' \u25cf'; if (delta_E_max <= delta_E_tolerance_recommended) delta_E_max_color = 'green'; else if (delta_E_max <= delta_E_tolerance_nominal) delta_E_max_color = 'yellow'; else delta_E_max_color = 'red'; // ISO 14861:2015 deviation from uniform tonality (contrast deviation) // Technically, ISO 12646:2015 has caught up with ISO 14861 var T_max = jsapi.math.max(T), T_max_color = '', T_max_mark = ' \u25cf', T_tolerance_nominal = 0.1; if (delta != 'E') T_max_mark = ''; else if (T_max < T_tolerance_nominal) T_max_color = 'green'; else T_max_color = 'red'; // Generate HTML report for (var i = 0; i < rows * cols; i ++) { var cellcontent = [], Y_diff = [], Y_diff_percent = [], rgb, CCT = [], CCT_diff = [], CCT_diff_percent = [], CT = [], CT_diff = [], CT_diff_percent = []; for (var j = 0; j < results[i].length; j ++) { var Lab = results[i][j]['Lab'], Lab_scaled = results[i][j]['Lab_scaled'], line = '' + (100 - j * 25) + '%: ' + results[i][j]['XYZ'][1].accuracy(2) + ' cd/m²'; CCT.push(results[i][j]['CCT']); CT.push(results[i][j]['C' + locus.substr(0, 1) + 'T']); if (results[i] == reference) { line = '' + line; line += ' (' + (reference[j]['XYZ'][1] / reference[0]['XYZ'][1] * 100).accuracy(2) + '%)' + '' + (j == 0 ? '' : ''); //line += '\nCCT ' + Math.round(CCT[j]) + 'K, C' + locus.substr(0, 1) + 'T ' + Math.round(CT[j]) + 'K>'; } else { var color = '', mark = ' \u25cf', Y_color = color, Y_mark = mark; CCT_diff.push(-(reference[j]['CCT'] - results[i][j]['CCT'])); CCT_diff_percent.push(100.0 / reference[j]['CCT'] * CCT_diff[j]); CT_diff.push(-(reference[j]['C' + locus.substr(0, 1) + 'T'] - CT[j])); CT_diff_percent.push(100.0 / reference[j]['C' + locus.substr(0, 1) + 'T'] * CT_diff[j]); Y_diff.push(-(reference[j]['XYZ'][1] - results[i][j]['XYZ'][1])); Y_diff_percent.push(100.0 / reference[0]['XYZ'][1] * Y_diff[j]); if (delta == 'E' || delta == 'C') Y_mark = ''; else if (Math.abs(Y_diff_percent[j]) <= 5) Y_color = 'green'; else if (Math.abs(Y_diff_percent[j]) <= 10) Y_color = 'yellow'; else Y_color = 'red'; if (Math.abs(deltas[i][j][delta]) <= tolerance_recommended_max) color = 'green'; else if (Math.abs(deltas[i][j][delta]) <= tolerance_nominal_max) color = 'yellow'; else color = 'red'; line = (Y_mark ? '' + Y_mark + '' : '') + (mark ? '' + mark + '' : '') + '' + line; line += ' (' + (Y_diff_percent[j] > 0 ? '+' : '') + Y_diff_percent[j].accuracy(2) + '%), ' + deltas[i][j][delta].accuracy(2) + ' Δ' + delta + '*00'; //line += '\nCCT ' + Math.round(CCT[j]) + 'K (' + (CCT_diff_percent[j] > 0 ? '+' : '') + CCT_diff_percent[j].accuracy(2) + '%), C' + locus.substr(0, 1) + 'T ' + Math.round(CT[j]) + 'K (' + (CT_diff_percent[j] > 0 ? '+' : '') + CT_diff_percent[j].accuracy(2) + '%)>'; } if (j == selected_index) { //rgb = jsapi.math.color.Lab2RGB(Lab_scaled[0], Lab_scaled[1], Lab_scaled[2], reference[0]['XYZ_100'], null, 255, true); rgb = [Math.round(255 * (1 - j / results[i].length)), Math.round(255 * (1 - j / results[i].length)), Math.round(255 * (1 - j / results[i].length))]; if (results[i] == reference) { if (j == 3) cls = 'dark'; else if (j == 2) cls = 'dim'; else if (j) cls = 'avg'; else cls = ''; } } cellcontent.push(line); } if (results[i] == reference) { //line = 'strong>Average:\nCCT ' + Math.round(jsapi.math.avg(CCT)) + 'K, C' + locus.substr(0, 1) + 'T ' + Math.round(jsapi.math.avg(CT)) + 'K' + delta_E_max_mark + 'Maximum ΔE*00: ' + delta_E_max.accuracy(2) + ''; // ISO 14861:2015 deviation from uniform tonality (contrast deviation) // Technically, ISO 12646:2015 has caught up with ISO 14861 line += '\n' + T_max_mark + 'Maximum contrast deviation: ' + (T_max * 100).accuracy(2) + '%'; if (T_max < T_tolerance_nominal && delta_E_max <= delta_E_tolerance_nominal) { var msg_mark = '\u2713'; if (delta_E_max <= delta_E_tolerance_recommended) var msg_color = 'green', msg = 'Recommended tolerance passed'; else var msg_color = 'yellow', msg = 'Nominal tolerance passed'; } else var msg_color = 'red', msg_mark = '\u2716', msg = 'Nominal tolerance exceeded'; line += '\n' + msg_mark + '' + msg + '';*/ line = '\n \nEvaluation criteria:
' + (delta == 'E' && (rows < 5 || cols < 5) ? '\n\u26A0ISO 14861:2015 mandates at least a 5 × 5 grid' : ''); } else { var delta_avg = jsapi.math.avg(curdeltas[i]), delta_max = jsapi.math.absmax(curdeltas[i]), Y_diff_percent_avg = jsapi.math.avg(Y_diff_percent), Y_diff_percent_max = jsapi.math.absmax(Y_diff_percent), color = '', mark = ' \u25cf', Y_color = color, Y_mark = mark; if (delta == 'E') Y_mark = ''; else if (Math.abs(Y_diff_percent_avg) <= 5) Y_color = 'green'; else if (Math.abs(Y_diff_percent_avg) <= 10) Y_color = 'yellow'; else Y_color = 'red'; if (Math.abs(delta_avg) <= tolerance_recommended) color = 'green'; else if (Math.abs(delta_avg) <= tolerance_nominal) color = 'yellow'; else color = 'red'; line = ' \n' + (Y_mark ? '' + Y_mark + '' : '') + (mark ? '' + mark + '' : '') + 'Average: ' + (Y_diff_percent_avg > 0 ? '+' : '') + jsapi.math.avg(Y_diff).accuracy(2) + ' cd/m² (' + (Y_diff_percent_avg > 0 ? '+' : '') + Y_diff_percent_avg.accuracy(2) + '%), ' + delta_avg.accuracy(2) + ' Δ' + delta + '*00'; //line += '\nCCT ' + Math.round(jsapi.math.avg(CCT)) + 'K (' + (jsapi.math.avg(CCT_diff_percent) > 0 ? '+' : '') + jsapi.math.avg(CCT_diff_percent).accuracy(2) + '%), C' + locus.substr(0, 1) + 'T ' + Math.round(jsapi.math.avg(CT)) + 'K (' + (jsapi.math.avg(CT_diff_percent) > 0 ? '+' : '') + jsapi.math.avg(CT_diff_percent).accuracy(2) + '%)>'; Y_mark = mark; if (delta == 'E' || delta == 'C') Y_mark = ''; else if (Math.abs(Y_diff_percent_avg) <= 5) Y_color = 'green'; else if (Math.abs(Y_diff_percent_avg) <= 10) Y_color = 'yellow'; else Y_color = 'red'; // ISO 14861:2015 tone uniformity var result_delta_max_color = '', result_delta_max_mark = ' \u25cf'; if (delta_max <= tolerance_recommended_max) result_delta_max_color = 'green'; else if (delta_max <= tolerance_nominal_max) result_delta_max_color = 'yellow'; else result_delta_max_color = 'red'; line += '\n' + (Y_mark ? '' + Y_mark + '' : '') + '' + result_delta_max_mark + 'Maximum: ' + (Y_diff_percent_max > 0 ? '+' : '') + jsapi.math.absmax(Y_diff).accuracy(2) + ' cd/m² (' + (Y_diff_percent_max > 0 ? '+' : '') + Y_diff_percent_max.accuracy(2) + '%), ' + delta_max.accuracy(2) + ' Δ' + delta + '*00'; // ISO 14861:2015 deviation from uniform tonality (contrast deviation) // Technically, ISO 12646:2015 has caught up with ISO 14861:2015 var T_color = '', T_mark = ' \u25cf'; if (delta != 'E') T_mark = ''; else if (T[i] < T_tolerance_nominal) T_color = 'green'; else T_color = 'red'; line += '\n' + (T_mark ? '' + T_mark + '' : '') + 'Contrast deviation: ' + (T[i] * 100).accuracy(2) + '%'; if ((delta == 'E' ? T[i] < T_tolerance_nominal : Y_diff_percent_avg < 10) && delta_max <= tolerance_nominal_max && delta_avg <= tolerance_nominal) { var msg_mark = '\u2713'; if (delta_max <= tolerance_recommended_max && delta_avg <= tolerance_recommended) var msg_color = 'green', msg = 'Recommended tolerance passed'; else var msg_color = 'yellow', msg = 'Nominal tolerance passed'; } else var msg_color = 'red', msg_mark = '\u2716', msg = 'Nominal tolerance exceeded'; line += '\n' + msg_mark + '' + msg + ''; } cellcontent.push(line); cells.push('\n
' + cellcontent.join('
') + '
'); if ((i + 1) % self.cols == 0 && i + 1 < self.rows * self.cols) { cells[cells.length - 1] += '\n'; } } document.getElementsByTagName('body')[0].innerHTML = '' + cells.join('') + '
'; }; window.onload = generate_report; DisplayCAL-3.5.0.0/DisplayCAL/report/uniformity.html0000644000076500000000000000721713154615407022046 0ustar devwheel00000000000000 Uniformity Check ${REPORT_VERSION} — ${DISPLAY} — ${DATETIME}
DisplayCAL-3.5.0.0/DisplayCAL/report.py0000644000076500000000000001466213242301247017317 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from time import strftime import codecs import os import re import shutil import sys from config import get_data_path, initcfg from meta import version_short from safe_print import safe_print from util_str import safe_unicode import jspacker import localization as lang def create(report_path, placeholders2data, pack=True, templatename="report"): """ Create a report with all placeholders substituted by data. """ # read report template templatefilename = "%s.html" % templatename report_html_template_path = get_data_path(os.path.join("report", templatefilename)) if not report_html_template_path: raise IOError(lang.getstr("file.missing", templatefilename)) try: report_html_template = codecs.open(report_html_template_path, "r", "UTF-8") except (IOError, OSError), exception: raise exception.__class__(lang.getstr("error.file.open", report_html_template_path)) report_html = report_html_template.read() report_html_template.close() # create report for placeholder, data in placeholders2data.iteritems(): report_html = report_html.replace(placeholder, data) for include in ("base.css", "compare.css", "print.css", "jsapi-packages.js", "jsapi-patches.js", "compare.constants.js", "compare.variables.js", "compare.functions.js", "compare.init.js", "uniformity.functions.js"): path = get_data_path(os.path.join("report", include)) if not path: raise IOError(lang.getstr("file.missing", include)) try: f = codecs.open(path, "r", "UTF-8") except (IOError, OSError), exception: raise exception.__class__(lang.getstr("error.file.open", path)) if include.endswith(".js"): js = f.read() if pack: packer = jspacker.JavaScriptPacker() js = packer.pack(js, 62, True).strip() report_html = report_html.replace('src="%s">' % include, ">/**/") else: report_html = report_html.replace('@import "%s";' % include, f.read().strip()) f.close() # write report try: report_html_file = codecs.open(report_path, "w", "UTF-8") except (IOError, OSError), exception: raise exception.__class__(lang.getstr("error.file.create", report_path) + "\n\n" + safe_unicode(exception)) report_html_file.write(report_html) report_html_file.close() def update(report_path, pack=True): """ Update existing report with current template files. Also creates a backup copy of the old report. """ # read original report try: orig_report = codecs.open(report_path, "r", "UTF-8") except (IOError, OSError), exception: raise exception.__class__(lang.getstr("error.file.open", report_path)) orig_report_html = orig_report.read() orig_report.close() data = (("${PLANCKIAN}", 'id="FF_planckian"\s*(.*?)\s*disabled="disabled"', 0), ("${DISPLAY}", '"FF_display"\s*value="(.+?)"\s*/?>', 0), ("${INSTRUMENT}", '"FF_instrument"\s*value="(.+?)"\s*/?>', 0), ("${CORRECTION_MATRIX}", '"FF_correction_matrix"\s*value="(.+?)"\s*/?>', 0), ("${BLACKPOINT}", '"FF_blackpoint"\s*value="(.+?)"\s*/?>', 0), ("${WHITEPOINT}", '"FF_whitepoint"\s*value="(.+?)"\s*/?>', 0), ("${WHITEPOINT_NORMALIZED}", '"FF_whitepoint_normalized"\s*value="(.+?)"\s*/?>', 0), ("${PROFILE}", '"FF_profile"\s*value="(.+?)"\s*/?>', 0), ("${PROFILE_WHITEPOINT}", '"FF_profile_whitepoint"\s*value="(.+?)"\s*/?>', 0), ("${PROFILE_WHITEPOINT_NORMALIZED}", '"FF_profile_whitepoint_normalized"\s*value="(.+?)"\s*/?>', 0), ("${SIMULATION_PROFILE}", 'SIMULATION_PROFILE\s*=\s*"(.+?)"[;,]', 0), ("${TRC_GAMMA}", 'BT_1886_GAMMA\s*=\s*(.+?)[;,]', 0), ("${TRC_GAMMA}", 'TRC_GAMMA\s*=\s*(.+?)[;,]', 0), ("${TRC_GAMMA_TYPE}", 'BT_1886_GAMMA_TYPE\s*=\s*"(.+?)"[;,]', 0), ("${TRC_GAMMA_TYPE}", 'TRC_GAMMA_TYPE\s*=\s*"(.+?)"[;,]', 0), ("${TRC_OUTPUT_OFFSET}", 'TRC_OUTPUT_OFFSET\s*=\s*(.+?)[;,]', 0), ("${TRC}", 'TRC\s*=\s*"(.+?)"[;,]', 0), ("${WHITEPOINT_SIMULATION}", 'WHITEPOINT_SIMULATION\s*=\s*(.+?)[;,]', 0), ("${WHITEPOINT_SIMULATION_RELATIVE}", 'WHITEPOINT_SIMULATION_RELATIVE\s*=\s*(.+?)[;,]', 0), ("${DEVICELINK_PROFILE}", 'DEVICELINK_PROFILE\s*=\s*"(.+?)"[;,]', 0), ("${TESTCHART}", '"FF_testchart"\s*value="(.+?)"\s*/?>', 0), ("${ADAPTION}", '"FF_adaption"\s*value="(.+?)"\s*/?>', 0), ("${DATETIME}", '"FF_datetime"\s*value="(.+?)"\s*/?>', 0), ("${REF}", '"FF_data_ref"\s*value="(.+?)"\s*/?>', re.DOTALL), ("${MEASURED}", '"FF_data_in"\s*value="(.+?)"\s*/?>', re.DOTALL), ("${CAL_ENTRYCOUNT}", "CAL_ENTRYCOUNT\s*=\s*(.+?)[;,]$", re.M), ("${CAL_RGBLEVELS}", "CAL_RGBLEVELS\s*=\s*(.+?)[;,]$", re.M), ("${GRAYSCALE}", "CRITERIA_GRAYSCALE\s*=\s*(.+?)[;,]$", re.M), # Uniformity report ("${DISPLAY}", u"\u2014 (.+?) \u2014", 0), ("${DATETIME}", u"\u2014 .+? \u2014 (.+?)", 0), ("${ROWS}", 'rows\s*=\s*(.+?)[;,]', 0), ("${COLS}", 'cols\s*=\s*(.+?)[;,]', 0), ("${RESULTS}", 'results\s*=\s*(.+?), locus = ', 0), ("${LOCUS}", "locus\s*=\s*'([^']+)'", 0)) placeholders2data = {"${REPORT_VERSION}": version_short, "${CORRECTION_MATRIX}": "Unknown", "${ADAPTION}": "None", "${CAL_ENTRYCOUNT}": "null", "${CAL_RGBLEVELS}": "null", "${GRAYSCALE}": "null", "${BLACKPOINT}": "-1 -1 -1", "${TRC_GAMMA}": "null", "${TRC_OUTPUT_OFFSET}": "0", "${WHITEPOINT_SIMULATION}": "false", "${WHITEPOINT_SIMULATION_RELATIVE}": "false"} templatename = "report" for placeholder, pattern, flags in data: result = re.search(pattern, orig_report_html, flags) if result or not placeholders2data.get(placeholder): if (placeholder == "${TRC}" and not result and "${TRC_GAMMA}" in placeholders2data): default = "BT.1886" else: default = "" placeholders2data[placeholder] = result.groups()[0] if result else default if result and placeholder == "${COLS}": templatename = "uniformity" # backup original report shutil.copy2(report_path, "%s.%s" % (report_path, strftime("%Y-%m-%d_%H-%M-%S"))) create(report_path, placeholders2data, pack, templatename) if __name__ == "__main__": initcfg() lang.init() if not sys.argv[1:]: safe_print("Update existing report(s) with current template files.") safe_print("Usage: %s report1.html [report2.html...]" % os.path.basename(sys.argv[0])) else: for arg in sys.argv[1:]: try: update(arg) except (IOError, OSError), exception: safe_print(exception) DisplayCAL-3.5.0.0/DisplayCAL/safe_print.py0000644000076500000000000000604413065034773020143 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import locale import os import sys from encoding import get_encoding, get_encodings from util_str import safe_unicode original_codepage = None enc, fs_enc = get_encodings() _conwidth = None def _get_console_width(): global _conwidth if _conwidth is None: _conwidth = 80 try: if sys.platform == "win32": from ctypes import windll, create_string_buffer import struct # Use stderr handle so that pipes don't affect the reported size stderr_handle = windll.kernel32.GetStdHandle(-12) buf = create_string_buffer(22) consinfo = windll.kernel32.GetConsoleScreenBufferInfo(stderr_handle, buf) if consinfo: _conwidth = struct.unpack("hhhhHhhhhhh", buf.raw)[0] else: _conwidth = int(os.getenv("COLUMNS")) except: pass return _conwidth class SafePrinter(): def __init__(self, pad=False, padchar=" ", sep=" ", end="\n", file_=sys.stdout, fn=None, encoding=None): """ Write safely, avoiding any UnicodeDe-/EncodingErrors on strings and converting all other objects to safe string representations. sprint = SafePrinter(pad=False, padchar=' ', sep=' ', end='\\n', file=sys.stdout, fn=None) sprint(value, ..., pad=False, padchar=' ', sep=' ', end='\\n', file=sys.stdout, fn=None) Writes the values to a stream (default sys.stdout), honoring its encoding and replacing characters not present in the encoding with question marks silently. Optional keyword arguments: pad: pad the lines to n chars, or os.getenv('COLUMNS') if True. padchar: character to use for padding, default a space. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. file: a file-like object (stream); defaults to the sys.stdout. fn: a function to execute instead of printing. """ self.pad = pad self.padchar = padchar self.sep = sep self.end = end self.file = file_ self.fn = fn self.encoding = encoding or (get_encoding(file_) if file_ else None) def __call__(self, *args, **kwargs): self.write(*args, **kwargs) def flush(self): self.file and self.file.flush() def write(self, *args, **kwargs): pad = kwargs.get("pad", self.pad) padchar = kwargs.get("padchar", self.padchar) sep = kwargs.get("sep", self.sep) end = kwargs.get("end", self.end) file_ = kwargs.get("file_", self.file) fn = kwargs.get("fn", self.fn) encoding = kwargs.get("encoding", self.encoding) strargs = [] for arg in args: if not isinstance(arg, basestring): arg = safe_unicode(arg) if isinstance(arg, unicode) and encoding: arg = arg.encode(encoding, "asciize") strargs.append(arg) line = sep.join(strargs).rstrip(end) if pad is not False: if pad is True: width = _get_console_width() else: width = int(pad) line = line.ljust(width, padchar) if fn: fn(line) else: file_.write(line) if end: file_.write(end) safe_print = SafePrinter() if __name__ == '__main__': for arg in sys.argv[1:]: safe_print(arg.decode(fs_enc)) DisplayCAL-3.5.0.0/DisplayCAL/setup.py0000644000076500000000000013044513230230667017146 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ DisplayCAL setup.py script Can be used with setuptools or pure distutils (the latter can be forced with the --use-distutils option, otherwise it will try to use setuptools by default). Also supported in addition to standard distutils/setuptools commands, are the bdist_bbfreeze, py2app and py2exe commands (if the appropriate packages are installed), which makes this file your all-around building/ bundling powerhouse for DisplayCAL. In the case of py2exe, special care is taken of Python 2.6+ and the Microsoft.VC90.CRT assembly dependency, so if building an executable on Windows with Python 2.6+ you should preferably use py2exe. Please note that bdist_bbfreeze and py2app *require* setuptools. IMPORTANT NOTE: If called from within the installed package, should only be used to uninstall (setup.py uninstall --record=INSTALLED_FILES), otherwise use the wrapper script in the root directory of the source tar.gz/zip """ from __future__ import with_statement from ConfigParser import ConfigParser from distutils.command.install import install from distutils.util import change_root, get_platform from fnmatch import fnmatch import codecs import ctypes.util import distutils.core import glob import os import platform import re import shutil import subprocess as sp import sys from time import strftime from types import StringType # Borrowed from setuptools def findall(dir=os.curdir): """Find all files under 'dir' and return the list of full filenames (relative to 'dir'). """ all_files = [] for base, dirs, files in os.walk(dir, followlinks=True): if base == os.curdir or base.startswith(os.curdir + os.sep): base = base[2:] if base: files = [os.path.join(base, f) for f in files] all_files.extend(filter(os.path.isfile, files)) return all_files import distutils.filelist distutils.filelist.findall = findall # Fix findall bug in distutils from defaultpaths import autostart, autostart_home from meta import (author, author_ascii, description, longdesc, domain, name, py_maxversion, py_minversion, version, version_tuple, wx_minversion, author_email, script2pywname) from util_os import relpath appname = name bits = platform.architecture()[0][:2] pypath = os.path.abspath(__file__) pydir = os.path.dirname(pypath) basedir = os.path.dirname(pydir) config = {"data": ["tests/*.icc"], "doc": ["LICENSE.txt", "README.html", "README-fr.html", "screenshots/*.png", "theme/*.png", "theme/*.css", "theme/*.js", "theme/*.svg", "theme/icons/favicon.ico", "theme/slimbox2/*.css", "theme/slimbox2/*.js"], # Excludes for .app/.exe builds # numpy.lib.utils imports pydoc, which imports Tkinter, but # numpy.lib.utils is not even used by DisplayCAL, so omit all # Tk stuff # Use pyglet with OpenAL as audio backend. We only need # pyglet, pyglet.app and pyglet.media "excludes": {"all": ["Tkconstants", "Tkinter", "pygame", "pyglet.canvas", "pyglet.extlibs", "pyglet.font", "pyglet.gl", "pyglet.graphics", "pyglet.image", "pyglet.input", "pyglet.text", "pyglet.window", "pyo", "setuptools", "tcl", "test"], "darwin": [], "win32": ["win32com.client.genpy"]}, "package_data": {name: ["argyll_instruments.json", "beep.wav", "camera_shutter.wav", "ColorLookupTable.fx", "lang/*.json", "linear.cal", "pnp.ids", "presets/*.icc", "quirk.json", "ref/*.cie", "ref/*.gam", "ref/*.icm", "ref/*.ti1", "report/*.css", "report/*.html", "report/*.js", "technology_strings-1.7.0.json", "technology_strings-1.7.1.json", "test.cal", "theme/*.png", "theme/*.wav", "theme/icons/10x10/*.png", "theme/icons/16x16/*.png", "theme/icons/32x32/*.png", "theme/icons/48x48/*.png", "theme/icons/72x72/*.png", "theme/icons/128x128/*.png", "theme/icons/256x256/*.png", "theme/icons/512x512/*.png", "theme/jet_anim/*.png", "theme/patch_anim/*.png", "theme/splash_anim/*.png", "theme/shutter_anim/*.png", "ti1/*.ti1", "x3d-viewer/*.css", "x3d-viewer/*.html", "x3d-viewer/*.js", "xrc/*.xrc"]}, "xtra_package_data": {name: {"win32": ["theme/icons/%s-uninstall.ico" % name]}}} def add_lib_excludes(key, excludebits): for exclude in excludebits: config["excludes"][key].extend([name + ".lib" + exclude, "lib" + exclude]) for exclude in ("32", "64"): for pycompat in ("26", "27"): if (key == "win32" and (pycompat == sys.version[0] + sys.version[2] or exclude == excludebits[0])): continue config["excludes"][key].extend([name + ".lib%s.python%s" % (exclude, pycompat), name + ".lib%s.python%s.RealDisplaySizeMM" % (exclude, pycompat)]) add_lib_excludes("darwin", ["64" if bits == "32" else "32"]) add_lib_excludes("win32", ["64" if bits == "32" else "32"]) msiversion = ".".join((str(version_tuple[0]), str(version_tuple[1]), str(version_tuple[2]) + str(version_tuple[3]))) plist_dict = {"CFBundleDevelopmentRegion": "English", "CFBundleExecutable": name, "CFBundleGetInfoString": version, "CFBundleIdentifier": ".".join(reversed(domain.split("."))), "CFBundleInfoDictionaryVersion": "6.0", "CFBundleLongVersionString": version, "CFBundleName": name, "CFBundlePackageType": "APPL", "CFBundleShortVersionString": version, "CFBundleSignature": "????", "CFBundleVersion": ".".join(map(str, version_tuple)), "NSHumanReadableCopyright": u"© %s %s" % (strftime("%Y"), author), "LSMinimumSystemVersion": "10.6.0"} class Target: def __init__(self, **kwargs): self.__dict__.update(kwargs) def create_app_symlinks(dist_dir, scripts): maincontents_rel = os.path.join(name + ".app", "Contents") # Create ref, tests, ReadMe and license symlinks in directory # containing the app bundle for src, tgt in [("ref", "Reference"), ("tests", "Tests"), ("README.html", "README.html"), ("README-fr.html", "README-fr.html"), ("LICENSE.txt", "LICENSE.txt")]: tgt = os.path.join(dist_dir, tgt) if os.path.islink(tgt): os.unlink(tgt) os.symlink(os.path.join(maincontents_rel, "Resources", src), tgt) # Create standalone tools app bundles by symlinking to the main bundle scripts = [(script2pywname(script), desc) for script, desc in scripts] toolscripts = filter(lambda script: script != name, [script for script, desc in scripts]) for script, desc in scripts: if script in (name, name + "-apply-profiles"): continue toolname = desc.replace(name, "").strip() toolapp = os.path.join(dist_dir, toolname + ".app") if os.path.isdir(toolapp): if raw_input('WARNING: The output directory "%s" and ALL ITS ' 'CONTENTS will be REMOVED! Continue? (y/n)' % toolapp).lower() == 'y': print "Removing dir", toolapp shutil.rmtree(toolapp) else: raise SystemExit('User aborted') toolscript = os.path.join(dist_dir, maincontents_rel, 'MacOS', script) has_tool_script = os.path.exists(toolscript) if not has_tool_script: # Don't symlink, apps won't be able to run in parallel! shutil.copy(os.path.join(dist_dir, maincontents_rel, 'MacOS', appname), toolscript) toolcontents = os.path.join(toolapp, "Contents") os.makedirs(toolcontents) subdirs = ["Frameworks", "Resources"] if has_tool_script: # PyInstaller subdirs.append("MacOS") for entry in os.listdir(os.path.join(dist_dir, maincontents_rel)): if entry in subdirs: os.makedirs(os.path.join(toolcontents, entry)) for subentry in os.listdir(os.path.join(dist_dir, maincontents_rel, entry)): src = os.path.join(dist_dir, maincontents_rel, entry, subentry) tgt = os.path.join(toolcontents, entry, subentry) if subentry == "main.py": # py2app with open(src, "rb") as main_in: py = main_in.read() py = py.replace("main()", "main(%r)" % script[len(name) + 1:]) with open(tgt, "wb") as main_out: main_out.write(py) continue if subentry == name + ".icns": shutil.copy(os.path.join(pydir, "theme", "icons", "%s.icns" % script), os.path.join(toolcontents, entry, "%s.icns" % script)) continue if subentry == script: # PyInstaller os.rename(src, tgt) elif subentry not in toolscripts: os.symlink(os.path.join("..", "..", "..", maincontents_rel, entry, subentry), tgt) elif entry == "Info.plist": with codecs.open(os.path.join(dist_dir, maincontents_rel, entry), "r", "UTF-8") as info_in: infoxml = info_in.read() # CFBundleName / CFBundleDisplayName infoxml = re.sub("(Name\s*)%s" % name, lambda match: match.group(1) + toolname, infoxml) # CFBundleIdentifier infoxml = infoxml.replace(".%s" % name, ".%s" % script) # CFBundleIconFile infoxml = infoxml.replace("%s.icns" % name, "%s.icns" % script) # CFBundleExecutable infoxml = re.sub("(Executable\s*)%s" % name, lambda match: match.group(1) + script, infoxml) with codecs.open(os.path.join(toolcontents, entry), "w", "UTF-8") as info_out: info_out.write(infoxml) else: os.symlink(os.path.join("..", "..", maincontents_rel, entry), os.path.join(toolcontents, entry)) def get_data(tgt_dir, key, pkgname=None, subkey=None, excludes=None): """ Return configured data files """ files = config[key] src_dir = basedir if pkgname: files = files[pkgname] src_dir = os.path.join(src_dir, pkgname) if subkey: if subkey in files: files = files[subkey] else: files = [] data = [] for pth in files: if not filter(lambda exclude: fnmatch(pth, exclude), excludes or []): data.append((os.path.normpath(os.path.join(tgt_dir, os.path.dirname(pth))), glob.glob(os.path.join(src_dir, pth)))) return data def get_scripts(excludes=None): # It is required that each script has an accompanying .desktop file scripts = [] desktopfiles = glob.glob(os.path.join(pydir, "..", "misc", appname.lower() + "*.desktop")) def sortbyname(a, b): a, b = [os.path.splitext(v)[0] for v in (a, b)] if a > b: return 1 elif a < b: return -1 else: return 0 desktopfiles.sort(sortbyname) for desktopfile in desktopfiles: if desktopfile.startswith("z-"): continue cfg = ConfigParser() cfg.read(desktopfile) script = cfg.get("Desktop Entry", "Exec").split()[0] if not filter(lambda exclude: fnmatch(script, exclude), excludes or []): scripts.append((script, cfg.get("Desktop Entry", "Name").decode("UTF-8"))) return scripts def setup(): print "***", os.path.abspath(sys.argv[0]), " ".join(sys.argv[1:]) bdist_bbfreeze = "bdist_bbfreeze" in sys.argv[1:] bdist_dumb = "bdist_dumb" in sys.argv[1:] bdist_win = "bdist_msi" in sys.argv[1:] or "bdist_wininst" in sys.argv[1:] debug = 0 do_full_install = False do_install = False do_py2app = "py2app" in sys.argv[1:] do_py2exe = "py2exe" in sys.argv[1:] do_uninstall = "uninstall" in sys.argv[1:] doc_layout = "deb" if os.path.exists("/etc/debian_version") else "" dry_run = "-n" in sys.argv[1:] or "--dry-run" in sys.argv[1:] help = False install_data = None # data files install path (only if given) is_rpm_build = "bdist_rpm" in sys.argv[1:] or os.path.abspath(sys.argv[0]).endswith( os.path.join(os.path.sep, "rpm", "BUILD", name + "-" + version, os.path.basename(os.path.abspath(sys.argv[0])))) prefix = "" recordfile_name = None # record installed files to this file sdist = "sdist" in sys.argv[1:] setuptools = None skip_instrument_conf_files = "--skip-instrument-configuration-files" in \ sys.argv[1:] skip_postinstall = "--skip-postinstall" in sys.argv[1:] use_distutils = not bdist_bbfreeze and not do_py2app use_setuptools = not use_distutils or "--use-setuptools" in \ sys.argv[1:] or (os.path.exists("use-setuptools") and not "--use-distutils" in sys.argv[1:]) sys.path.insert(1, os.path.join(os.path.dirname(pydir), "util")) current_findall = distutils.filelist.findall if use_setuptools: if "--use-setuptools" in sys.argv[1:] and not \ os.path.exists("use-setuptools"): open("use-setuptools", "w").close() try: from ez_setup import use_setuptools as ez_use_setuptools ez_use_setuptools() except ImportError: pass try: from setuptools import setup, Extension setuptools = True print "using setuptools" current_findall = distutils.filelist.findall except ImportError: pass else: if os.path.exists("use-setuptools"): os.remove("use-setuptools") if distutils.filelist.findall is current_findall: # Fix traversing unneeded dirs which can take a long time (minutes) def findall(dir=os.curdir, original=distutils.filelist.findall, listdir=os.listdir, basename=os.path.basename): os.listdir = lambda path: filter(lambda entry: entry not in ("build", "dist") and not entry.startswith("."), listdir(path)) try: return original(dir) finally: os.listdir = listdir distutils.filelist.findall = findall if not setuptools: from distutils.core import setup, Extension print "using distutils" if do_py2exe: import py2exe # ModuleFinder can't handle runtime changes to __path__, but win32com # uses them try: # if this doesn't work, try import modulefinder import py2exe.mf as modulefinder import win32com for p in win32com.__path__[1:]: modulefinder.AddPackagePath("win32com", p) for extra in ["win32com.shell"]: __import__(extra) m = sys.modules[extra] for p in m.__path__[1:]: modulefinder.AddPackagePath(extra, p) except ImportError: # no build path setup, no worries. pass if do_py2exe: origIsSystemDLL = py2exe.build_exe.isSystemDLL systemroot = os.getenv("SystemRoot").lower() def isSystemDLL(pathname): if (os.path.basename(pathname).lower() in ("gdiplus.dll", "mfc90.dll") or os.path.basename(pathname).lower().startswith("python") or os.path.basename(pathname).lower().startswith("pywintypes")): return 0 return pathname.lower().startswith(systemroot + "\\") py2exe.build_exe.isSystemDLL = isSystemDLL # Numpy DLL paths fix def numpy_dll_paths_fix(): import numpy paths = set() numpy_path = numpy.__path__[0] for dirpath, dirnames, filenames in os.walk(numpy_path): for item in filenames: if item.lower().endswith(".dll"): paths.add(dirpath) sys.path.extend(paths) numpy_dll_paths_fix() if do_uninstall: i = sys.argv.index("uninstall") sys.argv = sys.argv[:i] + ["install"] + sys.argv[i + 1:] install.create_home_path = lambda self: None if skip_instrument_conf_files: i = sys.argv.index("--skip-instrument-configuration-files") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if skip_postinstall: i = sys.argv.index("--skip-postinstall") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if "--use-distutils" in sys.argv[1:]: i = sys.argv.index("--use-distutils") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if "--use-setuptools" in sys.argv[1:]: i = sys.argv.index("--use-setuptools") sys.argv = sys.argv[:i] + sys.argv[i + 1:] argv = list(sys.argv[1:]) for i, arg in enumerate(reversed(argv)): n = len(sys.argv) - i - 1 if arg in ("install", "install_lib", "install_headers", "install_scripts", "install_data"): if arg == "install": do_full_install = True do_install = True elif arg == "-d" and len(sys.argv[1:]) > i: dist_dir = sys.argv[i + 2] else: arg = arg.split("=") if arg[0] == "--debug": debug = 1 if len(arg) == 1 else int(arg[1]) sys.argv = sys.argv[:n] + sys.argv[n + 1:] elif len(arg) == 2: if arg[0] == "--dist-dir": dist_dir = arg[1] elif arg[0] == "--doc-layout": doc_layout = arg[1] sys.argv = sys.argv[:n] + sys.argv[n + 1:] elif arg[0] == "--install-data": install_data = arg[1] elif arg[0] == "--prefix": prefix = arg[1] elif arg[0] == "--record": recordfile_name = arg[1] elif arg[0] == "-h" or arg[0].startswith("--help"): help = True if not recordfile_name and (do_full_install or do_uninstall): recordfile_name = "INSTALLED_FILES" # if not do_uninstall: # sys.argv.append("--record=" + "INSTALLED_FILES") if sys.platform in ("darwin", "win32") or "bdist_egg" in sys.argv[1:]: doc = data = "." if do_py2app or do_py2exe or bdist_bbfreeze else name else: # Linux/Unix data = name if doc_layout.startswith("deb"): doc = os.path.join("doc", name.lower()) elif "suse" in doc_layout: doc = os.path.join("doc", "packages", name) else: doc = os.path.join("doc", name + "-" + version) if not install_data: data = os.path.join("share", data) doc = os.path.join("share", doc) if is_rpm_build: doc = os.path.join(os.path.sep, "usr", doc) # Use bundled CA file if sdist or do_py2app: config["package_data"][name].append("cacert.pem") # on Mac OS X and Windows, we want data files in the package dir # (package_data will be ignored when using py2exe) package_data = { name: config["package_data"][name] if sys.platform in ("darwin", "win32") and not do_py2app and not do_py2exe else [] } if sdist and sys.platform in ("darwin", "win32"): package_data[name].extend(["theme/icons/22x22/*.png", "theme/icons/24x24/*.png"]) if sys.platform == "win32" and not do_py2exe: package_data[name].append("theme/icons/*.ico") # Scripts if sys.platform == 'darwin': scripts = get_scripts(excludes=[appname.lower() + '-apply-profiles']) else: scripts = get_scripts() # Doc files data_files = [] if not is_rpm_build or doc_layout.startswith("deb"): data_files += get_data(doc, "doc", excludes=["LICENSE.txt"]) if data_files: if doc_layout.startswith("deb"): data_files.append((doc, [os.path.join(pydir, "..", "dist", "copyright")])) data_files.append((os.path.join(os.path.dirname(data), "doc-base"), [os.path.join(pydir, "..", "misc", appname.lower() + "-readme")])) else: data_files.append((doc, [os.path.join(pydir, "..", "LICENSE.txt")])) if sys.platform not in ("darwin", "win32") or do_py2app or do_py2exe: # Linux/Unix or py2app/py2exe data_files += get_data(data, "package_data", name, excludes=["theme/icons/*"]) data_files += get_data(data, "data") data_files += get_data(data, "xtra_package_data", name, sys.platform) if sys.platform == "win32": # Add python and pythonw data_files.extend([(os.path.join(data, "lib"), [sys.executable, os.path.join(os.path.dirname(sys.executable), "pythonw.exe")])]) # OpenAL DLLs for pyglet openal32 = ctypes.util.find_library("OpenAL32.dll") wrap_oal = ctypes.util.find_library("wrap_oal.dll") if openal32: oal = [openal32] if wrap_oal: oal.append(wrap_oal) else: print "WARNING: wrap_oal.dll not found!" data_files.append((data, oal)) else: print "WARNING: OpenAL32.dll not found!" elif sys.platform != "darwin": # Linux data_files.append((os.path.join(os.path.dirname(data), "appdata"), [os.path.join(pydir, "..", "dist", name + ".appdata.xml")])) data_files.append((os.path.join(os.path.dirname(data), "applications"), [os.path.join(pydir, "..", "misc", name.lower() + ".desktop")] + glob.glob(os.path.join(pydir, "..", "misc", name.lower() + "-*.desktop")))) data_files.append((autostart if os.geteuid() == 0 or prefix.startswith("/") else autostart_home, [os.path.join(pydir, "..", "misc", "z-%s-apply-profiles.desktop" % name.lower())])) data_files.append((os.path.join(os.path.dirname(data), "man", "man1"), glob.glob(os.path.join(pydir, "..", "man", "*.1")))) if not skip_instrument_conf_files: # device configuration / permission stuff if is_rpm_build: # RPM postinstall script will install these to the correct # locations. This allows us compatibility with Argyll # packages which may also contain same udev rules / hotplug # scripts, thus avoiding file conflicts data_files.append((os.path.join(data, "usb"), [os.path.join( pydir, "..", "misc", "45-Argyll.rules")])) data_files.append((os.path.join(data, "usb"), [os.path.join( pydir, "..", "misc", "55-Argyll.rules")])) data_files.append((os.path.join(data, "usb"), [os.path.join( pydir, "..", "misc", "Argyll")])) data_files.append((os.path.join(data, "usb"), [os.path.join( pydir, "..", "misc", "Argyll.usermap")])) else: devconf_files = [] if os.path.isdir("/etc/udev/rules.d"): if glob.glob("/dev/bus/usb/*/*"): # USB and serial instruments using udev, where udev # already creates /dev/bus/usb/00X/00X devices devconf_files.append( ("/etc/udev/rules.d", [os.path.join( pydir, "..", "misc", "55-Argyll.rules")])) else: # USB using udev, where there are NOT /dev/bus/usb/00X/00X # devices devconf_files.append( ("/etc/udev/rules.d", [os.path.join( pydir, "..", "misc", "45-Argyll.rules")])) else: if os.path.isdir("/etc/hotplug"): # USB using hotplug and Serial using udev # (older versions of Linux) devconf_files.append( ("/etc/hotplug/usb", [os.path.join(pydir, "..", "misc", fname) for fname in ["Argyll", "Argyll.usermap"]])) for entry in devconf_files: for fname in entry[1]: if os.path.isfile(fname): data_files.extend([(entry[0], [fname])]) for dname in ("10x10", "16x16", "22x22", "24x24", "32x32", "48x48", "72x72", "128x128", "256x256", "512x512"): # Get all the icons needed, depending on platform # Only the icon sizes 10, 16, 32, 72, 256 and 512 include icons # that are used exclusively for UI elements. # These should be installed in an app-specific location, e.g. # under Linux $XDG_DATA_DIRS/DisplayCAL/theme/icons/ # The app icon sizes 16, 32, 48 and 256 (128 under Mac OS X), # which are used for taskbar icons and the like, as well as the # other sizes can be installed in a generic location, e.g. # under Linux $XDG_DATA_DIRS/icons/hicolor//apps/ # Generally, icon filenames starting with the lowercase app name # should be installed in the generic location. icons = [] desktopicons = [] if sys.platform == "darwin": largest_iconbundle_icon_size = "128x128" else: largest_iconbundle_icon_size = "256x256" for iconpath in glob.glob(os.path.join(pydir, "theme", "icons", dname, "*.png")): if not os.path.basename(iconpath).startswith(name.lower()) or ( sys.platform in ("darwin", "win32") and dname in ("16x16", "32x32", "48x48", largest_iconbundle_icon_size)): # In addition to UI element icons, we also need all the app # icons we use in get_icon_bundle under macOS/Windows, # otherwise they wouldn't be included (under Linux, these # are included for installation to the system-wide icon # theme location instead) icons.append(iconpath) elif sys.platform not in ("darwin", "win32"): desktopicons.append(iconpath) if icons: data_files.append((os.path.join(data, "theme", "icons", dname), icons)) if desktopicons: data_files.append((os.path.join(os.path.dirname(data), "icons", "hicolor", dname, "apps"), desktopicons)) sources = [os.path.join(name, "RealDisplaySizeMM.c")] if sys.platform == "win32": macros = [("NT", None)] libraries = ["user32", "gdi32"] link_args = None elif sys.platform == "darwin": macros = [("__APPLE__", None), ("UNIX", None)] libraries = None link_args = ["-framework Carbon", "-framework CoreFoundation", "-framework Python", "-framework IOKit"] if not help and ("build" in sys.argv[1:] or "build_ext" in sys.argv[1:] or (("install" in sys.argv[1:] or "install_lib" in sys.argv[1:]) and not "--skip-build" in sys.argv[1:])): p = sp.Popen([sys.executable, '-c', '''import os from distutils.core import setup, Extension setup(ext_modules=[Extension("%s.lib%s.RealDisplaySizeMM", sources=%r, define_macros=%r, extra_link_args=%r)])''' % (name, bits, sources, macros, link_args)] + sys.argv[1:], stdout = sp.PIPE, stderr = sp.STDOUT) lines = [] while True: o = p.stdout.readline() if o == '' and p.poll() != None: break if o[0:4] == 'gcc ': lines.append(o) print o.rstrip() if len(lines): os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.5' sp.call(lines[-1], shell = True) # fix the library else: macros = [("UNIX", None)] libraries = ["X11", "Xinerama", "Xrandr", "Xxf86vm"] link_args = None if sys.platform == "darwin": extname = "%s.lib%s.RealDisplaySizeMM" % (name, bits) else: extname = "%s.lib%s.python%s%s.RealDisplaySizeMM" % ((name, bits) + sys.version_info[:2]) RealDisplaySizeMM = Extension(extname, sources=sources, define_macros=macros, libraries=libraries, extra_link_args=link_args) ext_modules = [RealDisplaySizeMM] requires = [] if not setuptools or sys.platform != "win32": # wxPython windows installer doesn't add egg-info entry, so # a dependency check from pkg_resources would always fail requires.append( "wxPython (>= %s)" % ".".join(str(n) for n in wx_minversion)) if sys.platform == "win32": requires.append("pywin32 (>= 213.0)") packages = [name, "%s.lib" % name, "%s.lib.agw" % name] if sdist: # For source desributions we want all libraries for tmpbits in ("32", "64"): for pycompat in ("26", "27"): packages.extend(["%s.lib%s" % (name, tmpbits), "%s.lib%s.python%s" % (name, tmpbits, pycompat)]) elif sys.platform == "darwin": # On Mac OS X we only want the universal binaries packages.append("%s.lib%s" % (name, bits)) else: # On Linux/Windows we want separate libraries packages.extend(["%s.lib%s" % (name, bits), "%s.lib%s.python%s%s" % ((name, bits) + sys.version_info[:2])]) attrs = { "author": author_ascii, "author_email": author_email.replace("@", "_at_"), "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: MacOS X", "Environment :: Win32 (MS Windows)", "Environment :: X11 Applications", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Topic :: Multimedia :: Graphics", ], "data_files": data_files, "description": description, "download_url": "https://%(domain)s/download/" "%(name)s-%(version)s.tar.gz" % {"domain": domain, "name": name, "version": version}, "ext_modules": ext_modules, "license": "GPL v3", "long_description": longdesc, "name": name, "packages": packages, "package_data": package_data, "package_dir": { name: name }, "platforms": [ "Python >= %s <= %s" % (".".join(str(n) for n in py_minversion), ".".join(str(n) for n in py_maxversion)), "Linux/Unix with X11", "Mac OS X >= 10.4", "Windows 2000 and newer" ], "requires": requires, "provides": [name], "scripts": [], "url": "https://%s/" % domain, "version": msiversion if "bdist_msi" in sys.argv[1:] else version } if setuptools: attrs["entry_points"] = { "gui_scripts": [ "%s = %s.main:main%s" % (script, name, "" if script == name.lower() else script[len(name):].lower().replace("-", "_")) for script, desc in scripts ] } attrs["exclude_package_data"] = { name: ["RealDisplaySizeMM.c"] } attrs["include_package_data"] = sys.platform in ("darwin", "win32") install_requires = [req.replace("(", "").replace(")", "") for req in requires] attrs["install_requires"] = install_requires attrs["zip_safe"] = False else: attrs["scripts"].extend(os.path.join("scripts", script) for script, desc in filter(lambda (script, desc): script != name.lower() + "-apply-profiles" or sys.platform != "darwin", scripts)) if bdist_bbfreeze: attrs["setup_requires"] = ["bbfreeze"] if "bdist_wininst" in sys.argv[1:]: attrs["scripts"].append(os.path.join("util", name + "_postinstall.py")) if do_py2app: mainpy = os.path.join(basedir, "main.py") if not os.path.exists(mainpy): shutil.copy(os.path.join(basedir, "scripts", name.lower()), mainpy) attrs["app"] = [mainpy] dist_dir = os.path.join(pydir, "..", "dist", "py2app.%s-py%s" % (get_platform(), sys.version[:3]), name + "-" + version) from py2app.build_app import py2app as py2app_cls py2app_cls._copy_package_data = py2app_cls.copy_package_data def copy_package_data(self, package, target_dir): # Skip package data which is already included as data files if package.identifier.split('.')[0] != name: self._copy_package_data(package, target_dir) py2app_cls.copy_package_data = copy_package_data attrs["options"] = { "py2app": { "argv_emulation": True, "dist_dir": dist_dir, "excludes": config["excludes"]["all"] + config["excludes"]["darwin"], "iconfile": os.path.join(pydir, "theme", "icons", name + ".icns"), "optimize": 0, "plist": plist_dict } } attrs["setup_requires"] = ["py2app"] if do_py2exe: import wx from winmanifest_util import getmanifestxml manifest_xml = getmanifestxml(os.path.join(pydir, "..", "misc", name + (".exe.VC90.manifest" if hasattr(sys, "version_info") and sys.version_info[:2] >= (2,6) else ".exe.manifest"))) tmp_scripts_dir = os.path.join(basedir, "build", "temp.scripts") if not os.path.isdir(tmp_scripts_dir): os.makedirs(tmp_scripts_dir) apply_profiles_launcher = (appname.lower() + "-apply-profiles-launcher", appname + " Profile Loader Launcher") for script, desc in scripts + [apply_profiles_launcher]: shutil.copy(os.path.join(basedir, "scripts", script), os.path.join(tmp_scripts_dir, script2pywname(script))) attrs["windows"] = [Target(**{ "script": os.path.join(tmp_scripts_dir, script2pywname(script)), "icon_resources": [(1, os.path.join(pydir, "theme", "icons", os.path.splitext(os.path.basename(script))[0] + ".ico"))], "other_resources": [(24, 1, manifest_xml)], "copyright": u"© %s %s" % (strftime("%Y"), author), "description": desc }) for script, desc in scripts] # Add profile loader launcher attrs["windows"].append(Target(**{ "script": os.path.join(tmp_scripts_dir, script2pywname(apply_profiles_launcher[0])), "icon_resources": [(1, os.path.join(pydir, "theme", "icons", appname.lower() + "-apply-profiles" + ".ico"))], "other_resources": [(24, 1, manifest_xml)], "copyright": u"© %s %s" % (strftime("%Y"), author), "description": apply_profiles_launcher[1] })) console_scripts = [name + "-VRML-to-X3D-converter"] for console_script in console_scripts: console_script_path = os.path.join(tmp_scripts_dir, console_script + "-console") if not os.path.isfile(console_script_path): shutil.copy(os.path.join(basedir, "scripts", console_script.lower()), console_script_path) attrs["console"] = [Target(**{ "script": os.path.join(tmp_scripts_dir, script2pywname(script) + "-console"), "icon_resources": [(1, os.path.join(pydir, "theme", "icons", os.path.splitext(os.path.basename(script))[0] + ".ico"))], "other_resources": [(24, 1, manifest_xml)], "copyright": u"© %s %s" % (strftime("%Y"), author), "description": desc }) for script, desc in filter(lambda (script, desc): script2pywname(script) in console_scripts, scripts)] dist_dir = os.path.join(pydir, "..", "dist", "py2exe.%s-py%s" % (get_platform(), sys.version[:3]), name + "-" + version) attrs["options"] = { "py2exe": { "dist_dir": dist_dir, "dll_excludes": [ "iertutil.dll", "MPR.dll", "msvcm90.dll", "msvcp90.dll", "msvcr90.dll", "mswsock.dll", "urlmon.dll", "w9xpopen.exe" ], "excludes": config["excludes"]["all"] + config["excludes"]["win32"], "bundle_files": 3 if wx.VERSION >= (2, 8, 10, 1) else 1, "compressed": 1, "optimize": 0 # 0 = don’t optimize (generate .pyc) # 1 = normal optimization (like python -O) # 2 = extra optimization (like python -OO) } } if debug: attrs["options"]["py2exe"].update({ "bundle_files": 3, "compressed": 0, "optimize": 0, "skip_archive": 1 }) if setuptools: attrs["setup_requires"] = ["py2exe"] attrs["zipfile"] = os.path.join("lib", "library.zip") if (do_uninstall or do_install or bdist_win or bdist_dumb) and not help: distutils.core._setup_stop_after = "commandline" dist = setup(**attrs) distutils.core._setup_stop_after = None cmd = install(dist).get_finalized_command("install") if debug > 0: for attrname in [ "base", "data", "headers", "lib", "libbase", "platbase", "platlib", "prefix", "purelib", "root", "scripts", "userbase" ]: if attrname not in ["prefix", "root"]: attrname = "install_" + attrname if hasattr(cmd, attrname): print attrname, getattr(cmd, attrname) if debug > 1: try: from ppdir import ppdir except ImportError: pass else: ppdir(cmd, types=[dict, list, str, tuple, type, unicode]) if not install_data and sys.platform in ("darwin", "win32"): # on Mac OS X and Windows, we want data files in the package dir data_basedir = cmd.install_lib else: data_basedir = cmd.install_data data = change_root(data_basedir, data) doc = change_root(data_basedir, doc) # determine in which cases we want to make data file paths relative to # site-packages (on Mac and Windows) and when we want to make them # absolute (Linux) linux = sys.platform not in ("darwin", "win32") and (not cmd.root and setuptools) dar_win = (sys.platform in ("darwin", "win32") and (cmd.root or not setuptools)) or bdist_win if not do_uninstall and not install_data and (linux or dar_win) and \ attrs["data_files"]: if data_basedir.startswith(cmd.install_data + os.path.sep): data_basedir = relpath(data_basedir, cmd.install_data) print "*** changing basedir for data_files:", data_basedir for i, f in enumerate(attrs["data_files"]): if type(f) is StringType: attrs["data_files"][i] = change_root(data_basedir, f) else: attrs["data_files"][i] = (change_root(data_basedir, f[0]), f[1]) if do_uninstall and not help: # Quick and dirty uninstall if dry_run: print "dry run - nothing will be removed" else: from postinstall import postuninstall # Yeah, yeah - its actually pre-uninstall if cmd.root: postuninstall(prefix=change_root(cmd.root, cmd.prefix)) else: postuninstall(prefix=cmd.prefix) removed = [] visited = [] if os.path.exists(recordfile_name): paths = [(change_root(cmd.root, line.rstrip("\n")) if cmd.root else line.rstrip("\n")) for line in open(recordfile_name, "r")] else: paths = [] if not paths: # If the installed files have not been recorded, use some fallback # logic to find them paths = glob.glob(os.path.join(cmd.install_scripts, name)) if sys.platform == "win32": if setuptools: paths += glob.glob(os.path.join(cmd.install_scripts, name + ".exe")) paths += glob.glob(os.path.join(cmd.install_scripts, name + "-script.py")) else: paths += glob.glob(os.path.join(cmd.install_scripts, name + ".cmd")) paths += glob.glob(os.path.join(cmd.install_scripts, name + "_postinstall.py")) for attrname in [ "data", "headers", "lib", "libbase", "platlib", "purelib" ]: path = os.path.join(getattr(cmd, "install_" + attrname), name) if not path in paths: # Using sys.version in this way is consistent with # setuptools paths += glob.glob(path) + glob.glob(path + ("-%(version)s-py%(pyversion)s*.egg" % { "version": version, "pyversion": sys.version[:3] }) ) + glob.glob(path + ("-%(version)s-py%(pyversion)s*.egg-info" % { "version": version, "pyversion": sys.version[:3] }) ) if os.path.isabs(data) and not data in paths: for fname in [ "lang", "presets", "ref", "report", "screenshots", "tests", "theme", "ti1", "x3d-viewer", "LICENSE.txt", "README.html", "README-fr.html", "argyll_instruments.json", "beep.wav", "cacert.pem", "camera_shutter.wav", "ColorLookupTable.fx", name.lower() + ".desktop", name.lower() + "-3dlut-maker.desktop", name.lower() + "-curve-viewer.desktop", name.lower() + "-profile-info.desktop", name.lower() + "-scripting-client.desktop", name.lower() + "-synthprofile.desktop", name.lower() + "-testchart-editor.desktop", "pnp.ids", "quirk.json", "linear.cal", "technology_strings-1.7.0.json", "technology_strings-1.7.1.json", "test.cal" ]: path = os.path.join(data, fname) if not path in paths: paths += glob.glob(path) if os.path.isabs(doc) and not doc in paths: for fname in [ "screenshots", "theme", "LICENSE.txt", "README.html", "README-fr.html" ]: path = os.path.join(doc, fname) if not path in paths: paths += glob.glob(path) if sys.platform == "win32": from postinstall import get_special_folder_path startmenu_programs_common = get_special_folder_path( "CSIDL_COMMON_PROGRAMS") startmenu_programs = get_special_folder_path("CSIDL_PROGRAMS") for path in (startmenu_programs_common, startmenu_programs): if path: for filename in (name, "LICENSE", "README", "Uninstall"): paths += glob.glob(os.path.join(path, name, filename + ".lnk")) for path in paths: if os.path.exists(path): if path in visited: continue else: visited.append(path) if dry_run: print path continue try: if os.path.isfile(path): os.remove(path) elif os.path.isdir(path): os.rmdir(path) except Exception, exception: print "could'nt remove", path print " ", exception else: print "removed", path removed.append(path) while path != os.path.dirname(path): # remove parent directories if empty # could also use os.removedirs(path) but we want some status # info path = os.path.dirname(path) if os.path.isdir(path): if len(os.listdir(path)) == 0: if path in visited: continue else: visited.append(path) if dry_run: print path continue try: os.rmdir(path) except Exception, exception: print "could'nt remove", path print " ", exception else: print "removed", path removed.append(path) else: break if not removed: print len(visited), "entries found" else: print len(removed), "entries removed" else: # To have a working sdist and bdist_rpm when using distutils, # we go to the length of generating MANIFEST.in from scratch everytime, # using the information available from setup. manifest_in = ["# This file will be re-generated by setup.py - do not" "edit"] manifest_in.extend(["include LICENSE.txt", "include MANIFEST", "include MANIFEST.in", "include README.html", "include README-fr.html", "include *.pyw", "include use-distutils"]) manifest_in.append("include " + os.path.basename(sys.argv[0])) manifest_in.append("include " + os.path.splitext(os.path.basename(sys.argv[0]))[0] + ".cfg") for datadir, datafiles in attrs.get("data_files", []): for datafile in datafiles: manifest_in.append("include " + ( relpath(os.path.sep.join(datafile.split("/")), basedir) or datafile)) for extmod in attrs.get("ext_modules", []): manifest_in.extend("include " + os.path.sep.join(src.split("/")) for src in extmod.sources) for pkg in attrs.get("packages", []): pkg = os.path.join(*pkg.split(".")) pkgdir = os.path.sep.join(attrs.get("package_dir", {}).get(pkg, pkg).split("/")) manifest_in.append("include " + os.path.join(pkgdir, "*.py")) manifest_in.append("include " + os.path.join(pkgdir, "*.pyd")) manifest_in.append("include " + os.path.join(pkgdir, "*.so")) for obj in attrs.get("package_data", {}).get(pkg, []): manifest_in.append("include " + os.path.sep.join([pkgdir] + obj.split("/"))) for pymod in attrs.get("py_modules", []): manifest_in.append("include " + os.path.join(*pymod.split("."))) manifest_in.append("include " + os.path.join(name, "theme", "theme-info.txt")) manifest_in.append("recursive-include %s %s %s" % (os.path.join(name, "theme", "icons"), "*.icns", "*.ico")) manifest_in.append("include " + os.path.join("man", "*.1")) manifest_in.append("recursive-include %s %s" % ("misc", "*")) if skip_instrument_conf_files: manifest_in.extend([ "exclude misc/Argyll", "exclude misc/*.rules", "exclude misc/*.usermap", ]) manifest_in.append("include " + os.path.join("screenshots", "*.png")) manifest_in.append("include " + os.path.join("scripts", "*")) manifest_in.append("include " + os.path.join("tests", "*")) manifest_in.append("recursive-include %s %s" % ("theme", "*")) manifest_in.append("recursive-include %s %s" % ("util", "*.cmd *.py *.sh")) if sys.platform == "win32" and not setuptools: # Only needed under Windows manifest_in.append("global-exclude .svn/*") manifest_in.append("global-exclude *~") manifest_in.append("global-exclude *.backup") manifest_in.append("global-exclude *.bak") if not dry_run: manifest = open("MANIFEST.in", "w") manifest.write("\n".join(manifest_in)) manifest.close() if os.path.exists("MANIFEST"): os.remove("MANIFEST") if bdist_bbfreeze: i = sys.argv.index("bdist_bbfreeze") if not "-d" in sys.argv[i + 1:] and \ not "--dist-dir" in sys.argv[i + 1:]: dist_dir = os.path.join(pydir, "..", "dist", "bbfreeze.%s-py%s" % (get_platform(), sys.version[:3])) sys.argv.insert(i + 1, "--dist-dir=" + dist_dir) if not "egg_info" in sys.argv[1:i]: sys.argv.insert(i, "egg_info") if do_py2app or do_py2exe: sys.path.insert(1, pydir) i = sys.argv.index("py2app" if do_py2app else "py2exe") if not "build_ext" in sys.argv[1:i]: sys.argv.insert(i, "build_ext") setup(**attrs) if dry_run or help: return if do_py2app: create_app_symlinks(dist_dir, scripts) if do_py2exe: shutil.copy(os.path.join(dist_dir, "python%s.dll" % (sys.version[0] + sys.version[2])), os.path.join(dist_dir, "lib", "python%s.dll" % (sys.version[0] + sys.version[2]))) if ((bdist_bbfreeze and sys.platform == "win32") or do_py2exe) and \ sys.version_info[:2] >= (2,6): from vc90crt import name as vc90crt_name, vc90crt_copy_files if do_py2exe: vc90crt_copy_files(dist_dir) vc90crt_copy_files(os.path.join(dist_dir, "lib")) else: vc90crt_copy_files(os.path.join(dist_dir, name + "-" + version)) if do_full_install and not is_rpm_build and not skip_postinstall: from postinstall import postinstall if sys.platform == "win32": path = os.path.join(cmd.install_lib, name) # Using sys.version in this way is consistent with setuptools for path in glob.glob(path) + glob.glob( os.path.join(path + ( "-%(version)s-py%(pyversion)s*.egg" % { "version": version, "pyversion": sys.version[:3] } ), name) ): if cmd.root: postinstall(prefix=change_root(cmd.root, path)) else: postinstall(prefix=path) elif cmd.root: postinstall(prefix=change_root(cmd.root, cmd.prefix)) else: postinstall(prefix=cmd.prefix) if __name__ == "__main__": setup() DisplayCAL-3.5.0.0/DisplayCAL/subprocess.py0000644000076500000000000000127713074665645020214 0ustar devwheel00000000000000import os import sys import subprocess26 from subprocess26 import Popen as _Popen, list2cmdline from subprocess26 import _args_from_interpreter_flags class Popen(_Popen): """ In case of an EnvironmentError when executing the child, set its filename to the first item of args """ def __init__(self, *args, **kwargs): try: _Popen.__init__(self, *args, **kwargs) except EnvironmentError, exception: if not exception.filename: if isinstance(args[0], basestring): cmd = args[0].split()[0] else: cmd = args[0][0] if not os.path.isfile(cmd) or not os.access(cmd, os.X_OK): exception.filename = cmd raise subprocess26.Popen = Popen from subprocess26 import * DisplayCAL-3.5.0.0/DisplayCAL/subprocess26.py0000644000076500000000000016510712754640355020362 0ustar devwheel00000000000000# NOTE this is actually the Python 2.7.12 subprocess module made compatible # with Python 2.6 # subprocess - Subprocesses with accessible I/O streams # # For more information about this module, see PEP 324. # # Copyright (c) 2003-2005 by Peter Astrand # # Licensed to PSF under a Contributor Agreement. # See http://www.python.org/2.4/license for licensing details. r"""subprocess - Subprocesses with accessible I/O streams This module allows you to spawn processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several older modules and functions: os.system os.spawn* os.popen* popen2.* commands.* Information about how the subprocess module can be used to replace these modules and functions can be found below. Using the subprocess module =========================== This module defines one class called Popen: class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0): Arguments are: args should be a string, or a sequence of program arguments. The program to execute is normally the first item in the args sequence or string, but can be explicitly set by using the executable argument. On UNIX, with shell=False (default): In this case, the Popen class uses os.execvp() to execute the child program. args should normally be a sequence. A string will be treated as a sequence with the string as the only item (the program to execute). On UNIX, with shell=True: If args is a string, it specifies the command string to execute through the shell. If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional shell arguments. On Windows: the Popen class uses CreateProcess() to execute the child program, which operates on strings. If args is a sequence, it will be converted to a string using the list2cmdline method. Please note that not all MS Windows applications interpret the command line the same way: The list2cmdline is designed for applications using the same rules as the MS C runtime. bufsize, if given, has the same meaning as the corresponding argument to the built-in open() function: 0 means unbuffered, 1 means line buffered, any other positive value means use a buffer of (approximately) that size. A negative bufsize means to use the system default, which usually means fully buffered. The default value for bufsize is 0 (unbuffered). stdin, stdout and stderr specify the executed programs' standard input, standard output and standard error file handles, respectively. Valid values are PIPE, an existing file descriptor (a positive integer), an existing file object, and None. PIPE indicates that a new pipe to the child should be created. With None, no redirection will occur; the child's file handles will be inherited from the parent. Additionally, stderr can be STDOUT, which indicates that the stderr data from the applications should be captured into the same file handle as for stdout. If preexec_fn is set to a callable object, this object will be called in the child process just before the child is executed. If close_fds is true, all file descriptors except 0, 1 and 2 will be closed before the child process is executed. if shell is true, the specified command will be executed through the shell. If cwd is not None, the current directory will be changed to cwd before the child is executed. If env is not None, it defines the environment variables for the new process. If universal_newlines is true, the file objects stdout and stderr are opened as a text files, but lines may be terminated by any of '\n', the Unix end-of-line convention, '\r', the Macintosh convention or '\r\n', the Windows convention. All of these external representations are seen as '\n' by the Python program. Note: This feature is only available if Python is built with universal newline support (the default). Also, the newlines attribute of the file objects stdout, stdin and stderr are not updated by the communicate() method. The startupinfo and creationflags, if given, will be passed to the underlying CreateProcess() function. They can specify things such as appearance of the main window and priority for the new process. (Windows only) This module also defines some shortcut functions: call(*popenargs, **kwargs): Run command with arguments. Wait for command to complete, then return the returncode attribute. The arguments are the same as for the Popen constructor. Example: retcode = call(["ls", "-l"]) check_call(*popenargs, **kwargs): Run command with arguments. Wait for command to complete. If the exit code was zero then return, otherwise raise CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute. The arguments are the same as for the Popen constructor. Example: check_call(["ls", "-l"]) check_output(*popenargs, **kwargs): Run command with arguments and return its output as a byte string. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. The arguments are the same as for the Popen constructor. Example: output = check_output(["ls", "-l", "/dev/null"]) Exceptions ---------- Exceptions raised in the child process, before the new program has started to execute, will be re-raised in the parent. Additionally, the exception object will have one extra attribute called 'child_traceback', which is a string containing traceback information from the child's point of view. The most common exception raised is OSError. This occurs, for example, when trying to execute a non-existent file. Applications should prepare for OSErrors. A ValueError will be raised if Popen is called with invalid arguments. check_call() and check_output() will raise CalledProcessError, if the called process returns a non-zero return code. Security -------- Unlike some other popen functions, this implementation will never call /bin/sh implicitly. This means that all characters, including shell metacharacters, can safely be passed to child processes. Popen objects ============= Instances of the Popen class have the following methods: poll() Check if child process has terminated. Returns returncode attribute. wait() Wait for child process to terminate. Returns returncode attribute. communicate(input=None) Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child. communicate() returns a tuple (stdout, stderr). Note: The data read is buffered in memory, so do not use this method if the data size is large or unlimited. The following attributes are also available: stdin If the stdin argument is PIPE, this attribute is a file object that provides input to the child process. Otherwise, it is None. stdout If the stdout argument is PIPE, this attribute is a file object that provides output from the child process. Otherwise, it is None. stderr If the stderr argument is PIPE, this attribute is file object that provides error output from the child process. Otherwise, it is None. pid The process ID of the child process. returncode The child return code. A None value indicates that the process hasn't terminated yet. A negative value -N indicates that the child was terminated by signal N (UNIX only). Replacing older functions with the subprocess module ==================================================== In this section, "a ==> b" means that b can be used as a replacement for a. Note: All functions in this section fail (more or less) silently if the executed program cannot be found; this module raises an OSError exception. In the following examples, we assume that the subprocess module is imported with "from subprocess import *". Replacing /bin/sh shell backquote --------------------------------- output=`mycmd myarg` ==> output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] Replacing shell pipe line ------------------------- output=`dmesg | grep hda` ==> p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) output = p2.communicate()[0] Replacing os.system() --------------------- sts = os.system("mycmd" + " myarg") ==> p = Popen("mycmd" + " myarg", shell=True) pid, sts = os.waitpid(p.pid, 0) Note: * Calling the program through the shell is usually not required. * It's easier to look at the returncode attribute than the exitstatus. A more real-world example would look like this: try: retcode = call("mycmd" + " myarg", shell=True) if retcode < 0: print >>sys.stderr, "Child was terminated by signal", -retcode else: print >>sys.stderr, "Child returned", retcode except OSError, e: print >>sys.stderr, "Execution failed:", e Replacing os.spawn* ------------------- P_NOWAIT example: pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg") ==> pid = Popen(["/bin/mycmd", "myarg"]).pid P_WAIT example: retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg") ==> retcode = call(["/bin/mycmd", "myarg"]) Vector example: os.spawnvp(os.P_NOWAIT, path, args) ==> Popen([path] + args[1:]) Environment example: os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) ==> Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"}) Replacing os.popen* ------------------- pipe = os.popen("cmd", mode='r', bufsize) ==> pipe = Popen("cmd", shell=True, bufsize=bufsize, stdout=PIPE).stdout pipe = os.popen("cmd", mode='w', bufsize) ==> pipe = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE).stdin (child_stdin, child_stdout) = os.popen2("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdin, child_stdout) = (p.stdin, p.stdout) (child_stdin, child_stdout, child_stderr) = os.popen3("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) (child_stdin, child_stdout, child_stderr) = (p.stdin, p.stdout, p.stderr) (child_stdin, child_stdout_and_stderr) = os.popen4("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout) On Unix, os.popen2, os.popen3 and os.popen4 also accept a sequence as the command to execute, in which case arguments will be passed directly to the program without shell intervention. This usage can be replaced as follows: (child_stdin, child_stdout) = os.popen2(["/bin/ls", "-l"], mode, bufsize) ==> p = Popen(["/bin/ls", "-l"], bufsize=bufsize, stdin=PIPE, stdout=PIPE) (child_stdin, child_stdout) = (p.stdin, p.stdout) Return code handling translates as follows: pipe = os.popen("cmd", 'w') ... rc = pipe.close() if rc is not None and rc % 256: print "There were some errors" ==> process = Popen("cmd", 'w', shell=True, stdin=PIPE) ... process.stdin.close() if process.wait() != 0: print "There were some errors" Replacing popen2.* ------------------ (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode) ==> p = Popen(["somestring"], shell=True, bufsize=bufsize stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) On Unix, popen2 also accepts a sequence as the command to execute, in which case arguments will be passed directly to the program without shell intervention. This usage can be replaced as follows: (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode) ==> p = Popen(["mycmd", "myarg"], bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen, except that: * subprocess.Popen raises an exception if the execution fails * the capturestderr argument is replaced with the stderr argument. * stdin=PIPE and stdout=PIPE must be specified. * popen2 closes all filedescriptors by default, but you have to specify close_fds=True with subprocess.Popen. """ import sys mswindows = (sys.platform == "win32") import os import types import traceback import gc import signal import errno # Exception classes used by this module. class CalledProcessError(Exception): """This exception is raised when a process run by check_call() or check_output() returns a non-zero exit status. The exit status will be stored in the returncode attribute; check_output() will also store the output in the output attribute. """ def __init__(self, returncode, cmd, output=None): self.returncode = returncode self.cmd = cmd self.output = output def __str__(self): return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode) if mswindows: import threading import msvcrt import _subprocess class STARTUPINFO: dwFlags = 0 hStdInput = None hStdOutput = None hStdError = None wShowWindow = 0 class pywintypes: error = IOError else: import select _has_poll = hasattr(select, 'poll') import fcntl import pickle # When select or poll has indicated that the file is writable, # we can write up to _PIPE_BUF bytes without risk of blocking. # POSIX defines PIPE_BUF as >= 512. _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "check_output", "CalledProcessError"] CTRL_C_EVENT = 0 CTRL_BREAK_EVENT = 1 STILL_ACTIVE = 259 if mswindows: from _subprocess import (CREATE_NEW_CONSOLE, STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE, SW_HIDE, STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW) __all__.extend(["CREATE_NEW_CONSOLE", "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE", "STD_ERROR_HANDLE", "SW_HIDE", "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW", "STARTUPINFO"]) try: MAXFD = os.sysconf("SC_OPEN_MAX") except: MAXFD = 256 _active = [] def _cleanup(): for inst in _active[:]: res = inst._internal_poll(_deadstate=sys.maxint) if res is not None: try: _active.remove(inst) except ValueError: # This can happen if two threads create a new Popen instance. # It's harmless that it was already removed, so ignore. pass PIPE = -1 STDOUT = -2 def _eintr_retry_call(func, *args): while True: try: return func(*args) except (OSError, IOError) as e: if e.errno == errno.EINTR: continue raise # XXX This function is only used by multiprocessing and the test suite, # but it's here so that it can be imported when Python is compiled without # threads. def _args_from_interpreter_flags(): """Return a list of command-line arguments reproducing the current settings in sys.flags and sys.warnoptions.""" flag_opt_map = { 'debug': 'd', # 'inspect': 'i', # 'interactive': 'i', 'optimize': 'O', 'dont_write_bytecode': 'B', 'no_user_site': 's', 'no_site': 'S', 'ignore_environment': 'E', 'verbose': 'v', 'bytes_warning': 'b', 'py3k_warning': '3', } args = [] for flag, opt in flag_opt_map.items(): v = getattr(sys.flags, flag) if v > 0: args.append('-' + opt * v) if getattr(sys.flags, 'hash_randomization', 0) != 0: args.append('-R') for opt in sys.warnoptions: args.append('-W' + opt) return args def call(*popenargs, **kwargs): """Run command with arguments. Wait for command to complete, then return the returncode attribute. The arguments are the same as for the Popen constructor. Example: retcode = call(["ls", "-l"]) """ return Popen(*popenargs, **kwargs).wait() def check_call(*popenargs, **kwargs): """Run command with arguments. Wait for command to complete. If the exit code was zero then return, otherwise raise CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute. The arguments are the same as for the Popen constructor. Example: check_call(["ls", "-l"]) """ retcode = call(*popenargs, **kwargs) if retcode: cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] raise CalledProcessError(retcode, cmd) return 0 def check_output(*popenargs, **kwargs): r"""Run command with arguments and return its output as a byte string. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. The arguments are the same as for the Popen constructor. Example: >>> check_output(["ls", "-l", "/dev/null"]) 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' The stdout argument is not allowed as it is used internally. To capture standard error in the result, use stderr=STDOUT. >>> check_output(["/bin/sh", "-c", ... "ls -l non_existent_file ; exit 0"], ... stderr=STDOUT) 'ls: non_existent_file: No such file or directory\n' """ if 'stdout' in kwargs: raise ValueError('stdout argument not allowed, it will be overridden.') process = Popen(stdout=PIPE, *popenargs, **kwargs) output, unused_err = process.communicate() retcode = process.poll() if retcode: cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] raise CalledProcessError(retcode, cmd, output=output) return output def list2cmdline(seq): """ Translate a sequence of arguments into a command line string, using the same rules as the MS C runtime: 1) Arguments are delimited by white space, which is either a space or a tab. 2) A string surrounded by double quotation marks is interpreted as a single argument, regardless of white space contained within. A quoted string can be embedded in an argument. 3) A double quotation mark preceded by a backslash is interpreted as a literal double quotation mark. 4) Backslashes are interpreted literally, unless they immediately precede a double quotation mark. 5) If backslashes immediately precede a double quotation mark, every pair of backslashes is interpreted as a literal backslash. If the number of backslashes is odd, the last backslash escapes the next double quotation mark as described in rule 3. """ # See # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx # or search http://msdn.microsoft.com for # "Parsing C++ Command-Line Arguments" result = [] needquote = False for arg in seq: bs_buf = [] # Add a space to separate this argument from the others if result: result.append(' ') needquote = (" " in arg) or ("\t" in arg) or not arg if needquote: result.append('"') for c in arg: if c == '\\': # Don't know if we need to double yet. bs_buf.append(c) elif c == '"': # Double backslashes. result.append('\\' * len(bs_buf)*2) bs_buf = [] result.append('\\"') else: # Normal char if bs_buf: result.extend(bs_buf) bs_buf = [] result.append(c) # Add remaining backslashes, if any. if bs_buf: result.extend(bs_buf) if needquote: result.extend(bs_buf) result.append('"') return ''.join(result) class Popen(object): _child_created = False # Set here since __del__ checks it def __init__(self, args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0): """Create new Popen instance.""" _cleanup() if not isinstance(bufsize, (int, long)): raise TypeError("bufsize must be an integer") if mswindows: if preexec_fn is not None: raise ValueError("preexec_fn is not supported on Windows " "platforms") if close_fds and (stdin is not None or stdout is not None or stderr is not None): raise ValueError("close_fds is not supported on Windows " "platforms if you redirect stdin/stdout/stderr") else: # POSIX if startupinfo is not None: raise ValueError("startupinfo is only supported on Windows " "platforms") if creationflags != 0: raise ValueError("creationflags is only supported on Windows " "platforms") self.stdin = None self.stdout = None self.stderr = None self.pid = None self.returncode = None self.universal_newlines = universal_newlines # Input and output objects. The general principle is like # this: # # Parent Child # ------ ----- # p2cwrite ---stdin---> p2cread # c2pread <--stdout--- c2pwrite # errread <--stderr--- errwrite # # On POSIX, the child objects are file descriptors. On # Windows, these are Windows file handles. The parent objects # are file descriptors on both platforms. The parent objects # are None when not using PIPEs. The child objects are None # when not redirecting. (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr) try: self._execute_child(args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) except Exception: # Preserve original exception in case os.close raises. exc_type, exc_value, exc_trace = sys.exc_info() for fd in to_close: try: if mswindows: fd.Close() else: os.close(fd) except EnvironmentError: pass raise exc_type, exc_value, exc_trace if mswindows: if p2cwrite is not None: p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0) if c2pread is not None: c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0) if errread is not None: errread = msvcrt.open_osfhandle(errread.Detach(), 0) if p2cwrite is not None: self.stdin = os.fdopen(p2cwrite, 'wb', bufsize) if c2pread is not None: if universal_newlines: self.stdout = os.fdopen(c2pread, 'rU', bufsize) else: self.stdout = os.fdopen(c2pread, 'rb', bufsize) if errread is not None: if universal_newlines: self.stderr = os.fdopen(errread, 'rU', bufsize) else: self.stderr = os.fdopen(errread, 'rb', bufsize) def _translate_newlines(self, data): data = data.replace("\r\n", "\n") data = data.replace("\r", "\n") return data def __del__(self, _maxint=sys.maxint): # If __init__ hasn't had a chance to execute (e.g. if it # was passed an undeclared keyword argument), we don't # have a _child_created attribute at all. if not self._child_created: # We didn't get to successfully create a child process. return # In case the child hasn't been waited on, check if it's done. self._internal_poll(_deadstate=_maxint) if self.returncode is None and _active is not None: # Child is still running, keep us alive until we can wait on it. _active.append(self) def communicate(self, input=None): """Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child. communicate() returns a tuple (stdout, stderr).""" # Optimization: If we are only using one pipe, or no pipe at # all, using select() or threads is unnecessary. if [self.stdin, self.stdout, self.stderr].count(None) >= 2: stdout = None stderr = None if self.stdin: if input: try: self.stdin.write(input) except IOError as e: if e.errno != errno.EPIPE and e.errno != errno.EINVAL: raise self.stdin.close() elif self.stdout: stdout = _eintr_retry_call(self.stdout.read) self.stdout.close() elif self.stderr: stderr = _eintr_retry_call(self.stderr.read) self.stderr.close() self.wait() return (stdout, stderr) return self._communicate(input) def poll(self): return self._internal_poll() if mswindows: # # Windows methods # def _get_handles(self, stdin, stdout, stderr): """Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite """ to_close = set() if stdin is None and stdout is None and stderr is None: return (None, None, None, None, None, None), to_close p2cread, p2cwrite = None, None c2pread, c2pwrite = None, None errread, errwrite = None, None if stdin is None: p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE) if p2cread is None: p2cread, _ = _subprocess.CreatePipe(None, 0) elif stdin == PIPE: p2cread, p2cwrite = _subprocess.CreatePipe(None, 0) elif isinstance(stdin, int): p2cread = msvcrt.get_osfhandle(stdin) else: # Assuming file-like object p2cread = msvcrt.get_osfhandle(stdin.fileno()) p2cread = self._make_inheritable(p2cread) # We just duplicated the handle, it has to be closed at the end to_close.add(p2cread) if stdin == PIPE: to_close.add(p2cwrite) if stdout is None: c2pwrite = _subprocess.GetStdHandle(_subprocess.STD_OUTPUT_HANDLE) if c2pwrite is None: _, c2pwrite = _subprocess.CreatePipe(None, 0) elif stdout == PIPE: c2pread, c2pwrite = _subprocess.CreatePipe(None, 0) elif isinstance(stdout, int): c2pwrite = msvcrt.get_osfhandle(stdout) else: # Assuming file-like object c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) c2pwrite = self._make_inheritable(c2pwrite) # We just duplicated the handle, it has to be closed at the end to_close.add(c2pwrite) if stdout == PIPE: to_close.add(c2pread) if stderr is None: errwrite = _subprocess.GetStdHandle(_subprocess.STD_ERROR_HANDLE) if errwrite is None: _, errwrite = _subprocess.CreatePipe(None, 0) elif stderr == PIPE: errread, errwrite = _subprocess.CreatePipe(None, 0) elif stderr == STDOUT: errwrite = c2pwrite elif isinstance(stderr, int): errwrite = msvcrt.get_osfhandle(stderr) else: # Assuming file-like object errwrite = msvcrt.get_osfhandle(stderr.fileno()) errwrite = self._make_inheritable(errwrite) # We just duplicated the handle, it has to be closed at the end to_close.add(errwrite) if stderr == PIPE: to_close.add(errread) return (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite), to_close def _make_inheritable(self, handle): """Return a duplicate of handle, which is inheritable""" return _subprocess.DuplicateHandle(_subprocess.GetCurrentProcess(), handle, _subprocess.GetCurrentProcess(), 0, 1, _subprocess.DUPLICATE_SAME_ACCESS) def _find_w9xpopen(self): """Find and return absolut path to w9xpopen.exe""" w9xpopen = os.path.join( os.path.dirname(_subprocess.GetModuleFileName(0)), "w9xpopen.exe") if not os.path.exists(w9xpopen): # Eeek - file-not-found - possibly an embedding # situation - see if we can locate it in sys.exec_prefix w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix), "w9xpopen.exe") if not os.path.exists(w9xpopen): raise RuntimeError("Cannot locate w9xpopen.exe, which is " "needed for Popen to work with your " "shell or platform.") return w9xpopen def _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite): """Execute program (MS Windows version)""" if not isinstance(args, types.StringTypes): args = list2cmdline(args) # Process startup details if startupinfo is None: startupinfo = STARTUPINFO() if None not in (p2cread, c2pwrite, errwrite): startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES startupinfo.hStdInput = p2cread startupinfo.hStdOutput = c2pwrite startupinfo.hStdError = errwrite if shell: startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = _subprocess.SW_HIDE comspec = os.environ.get("COMSPEC", "cmd.exe") args = '%s /c "%s"' % (comspec, args) if (_subprocess.GetVersion() >= 0x80000000 or os.path.basename(comspec).lower() == "command.com"): # Win9x, or using command.com on NT. We need to # use the w9xpopen intermediate program. For more # information, see KB Q150956 # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp) w9xpopen = self._find_w9xpopen() args = '"%s" %s' % (w9xpopen, args) # Not passing CREATE_NEW_CONSOLE has been known to # cause random failures on win9x. Specifically a # dialog: "Your program accessed mem currently in # use at xxx" and a hopeful warning about the # stability of your system. Cost is Ctrl+C wont # kill children. creationflags |= _subprocess.CREATE_NEW_CONSOLE def _close_in_parent(fd): fd.Close() to_close.remove(fd) # Start the process try: hp, ht, pid, tid = _subprocess.CreateProcess(executable, args, # no special security None, None, int(not close_fds), creationflags, env, cwd, startupinfo) except pywintypes.error, e: # Translate pywintypes.error to WindowsError, which is # a subclass of OSError. FIXME: We should really # translate errno using _sys_errlist (or similar), but # how can this be done from Python? raise WindowsError(*e.args) finally: # Child is launched. Close the parent's copy of those pipe # handles that only the child should have open. You need # to make sure that no handles to the write end of the # output pipe are maintained in this process or else the # pipe will not close when the child process exits and the # ReadFile will hang. if p2cread is not None: _close_in_parent(p2cread) if c2pwrite is not None: _close_in_parent(c2pwrite) if errwrite is not None: _close_in_parent(errwrite) # Retain the process handle, but close the thread handle self._child_created = True self._handle = hp self.pid = pid ht.Close() def _internal_poll(self, _deadstate=None, _WaitForSingleObject=_subprocess.WaitForSingleObject, _WAIT_OBJECT_0=_subprocess.WAIT_OBJECT_0, _GetExitCodeProcess=_subprocess.GetExitCodeProcess): """Check if child process has terminated. Returns returncode attribute. This method is called by __del__, so it can only refer to objects in its local scope. """ if self.returncode is None: if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0: self.returncode = _GetExitCodeProcess(self._handle) return self.returncode def wait(self): """Wait for child process to terminate. Returns returncode attribute.""" if self.returncode is None: _subprocess.WaitForSingleObject(self._handle, _subprocess.INFINITE) self.returncode = _subprocess.GetExitCodeProcess(self._handle) return self.returncode def _readerthread(self, fh, buffer): buffer.append(fh.read()) def _communicate(self, input): stdout = None # Return stderr = None # Return if self.stdout: stdout = [] stdout_thread = threading.Thread(target=self._readerthread, args=(self.stdout, stdout)) stdout_thread.setDaemon(True) stdout_thread.start() if self.stderr: stderr = [] stderr_thread = threading.Thread(target=self._readerthread, args=(self.stderr, stderr)) stderr_thread.setDaemon(True) stderr_thread.start() if self.stdin: if input is not None: try: self.stdin.write(input) except IOError as e: if e.errno == errno.EPIPE: # communicate() should ignore broken pipe error pass elif (e.errno == errno.EINVAL and self.poll() is not None): # Issue #19612: stdin.write() fails with EINVAL # if the process already exited before the write pass else: raise self.stdin.close() if self.stdout: stdout_thread.join() if self.stderr: stderr_thread.join() # All data exchanged. Translate lists into strings. if stdout is not None: stdout = stdout[0] if stderr is not None: stderr = stderr[0] # Translate newlines, if requested. We cannot let the file # object do the translation: It is based on stdio, which is # impossible to combine with select (unless forcing no # buffering). if self.universal_newlines and hasattr(file, 'newlines'): if stdout: stdout = self._translate_newlines(stdout) if stderr: stderr = self._translate_newlines(stderr) self.wait() return (stdout, stderr) def send_signal(self, sig): """Send a signal to the process """ if sig == signal.SIGTERM: self.terminate() elif sig == CTRL_C_EVENT: os.kill(self.pid, CTRL_C_EVENT) elif sig == CTRL_BREAK_EVENT: os.kill(self.pid, CTRL_BREAK_EVENT) else: raise ValueError("Unsupported signal: %s" % sig) def terminate(self): """Terminates the process """ try: _subprocess.TerminateProcess(self._handle, 1) except OSError as e: # ERROR_ACCESS_DENIED (winerror 5) is received when the # process already died. if e.winerror != 5: raise rc = _subprocess.GetExitCodeProcess(self._handle) if rc == STILL_ACTIVE: raise self.returncode = rc kill = terminate else: # # POSIX methods # def _get_handles(self, stdin, stdout, stderr): """Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite """ to_close = set() p2cread, p2cwrite = None, None c2pread, c2pwrite = None, None errread, errwrite = None, None if stdin is None: pass elif stdin == PIPE: p2cread, p2cwrite = self.pipe_cloexec() to_close.update((p2cread, p2cwrite)) elif isinstance(stdin, int): p2cread = stdin else: # Assuming file-like object p2cread = stdin.fileno() if stdout is None: pass elif stdout == PIPE: c2pread, c2pwrite = self.pipe_cloexec() to_close.update((c2pread, c2pwrite)) elif isinstance(stdout, int): c2pwrite = stdout else: # Assuming file-like object c2pwrite = stdout.fileno() if stderr is None: pass elif stderr == PIPE: errread, errwrite = self.pipe_cloexec() to_close.update((errread, errwrite)) elif stderr == STDOUT: if c2pwrite is not None: errwrite = c2pwrite else: # child's stdout is not set, use parent's stdout errwrite = sys.__stdout__.fileno() elif isinstance(stderr, int): errwrite = stderr else: # Assuming file-like object errwrite = stderr.fileno() return (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite), to_close def _set_cloexec_flag(self, fd, cloexec=True): try: cloexec_flag = fcntl.FD_CLOEXEC except AttributeError: cloexec_flag = 1 old = fcntl.fcntl(fd, fcntl.F_GETFD) if cloexec: fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) else: fcntl.fcntl(fd, fcntl.F_SETFD, old & ~cloexec_flag) def pipe_cloexec(self): """Create a pipe with FDs set CLOEXEC.""" # Pipes' FDs are set CLOEXEC by default because we don't want them # to be inherited by other subprocesses: the CLOEXEC flag is removed # from the child's FDs by _dup2(), between fork() and exec(). # This is not atomic: we would need the pipe2() syscall for that. r, w = os.pipe() self._set_cloexec_flag(r) self._set_cloexec_flag(w) return r, w def _close_fds(self, but): if hasattr(os, 'closerange'): os.closerange(3, but) os.closerange(but + 1, MAXFD) else: for i in xrange(3, MAXFD): if i == but: continue try: os.close(i) except: pass def _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite): """Execute program (POSIX version)""" if isinstance(args, types.StringTypes): args = [args] else: args = list(args) if shell: args = ["/bin/sh", "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] def _close_in_parent(fd): os.close(fd) to_close.remove(fd) # For transferring possible exec failure from child to parent # The first char specifies the exception type: 0 means # OSError, 1 means some other error. errpipe_read, errpipe_write = self.pipe_cloexec() try: try: gc_was_enabled = gc.isenabled() # Disable gc to avoid bug where gc -> file_dealloc -> # write to stderr -> hang. http://bugs.python.org/issue1336 gc.disable() try: self.pid = os.fork() except: if gc_was_enabled: gc.enable() raise self._child_created = True if self.pid == 0: # Child try: # Close parent's pipe ends if p2cwrite is not None: os.close(p2cwrite) if c2pread is not None: os.close(c2pread) if errread is not None: os.close(errread) os.close(errpipe_read) # When duping fds, if there arises a situation # where one of the fds is either 0, 1 or 2, it # is possible that it is overwritten (#12607). if c2pwrite == 0: c2pwrite = os.dup(c2pwrite) if errwrite == 0 or errwrite == 1: errwrite = os.dup(errwrite) # Dup fds for child def _dup2(a, b): # dup2() removes the CLOEXEC flag but # we must do it ourselves if dup2() # would be a no-op (issue #10806). if a == b: self._set_cloexec_flag(a, False) elif a is not None: os.dup2(a, b) _dup2(p2cread, 0) _dup2(c2pwrite, 1) _dup2(errwrite, 2) # Close pipe fds. Make sure we don't close the # same fd more than once, or standard fds. closed = set([None]) for fd in [p2cread, c2pwrite, errwrite]: if fd not in closed and fd > 2: os.close(fd) closed.add(fd) if cwd is not None: os.chdir(cwd) if preexec_fn: preexec_fn() # Close all other fds, if asked for - after # preexec_fn(), which may open FDs. if close_fds: self._close_fds(but=errpipe_write) if env is None: os.execvp(executable, args) else: os.execvpe(executable, args, env) except: exc_type, exc_value, tb = sys.exc_info() # Save the traceback and attach it to the exception object exc_lines = traceback.format_exception(exc_type, exc_value, tb) exc_value.child_traceback = ''.join(exc_lines) os.write(errpipe_write, pickle.dumps(exc_value)) # This exitcode won't be reported to applications, so it # really doesn't matter what we return. os._exit(255) # Parent if gc_was_enabled: gc.enable() finally: # be sure the FD is closed no matter what os.close(errpipe_write) # Wait for exec to fail or succeed; possibly raising exception data = _eintr_retry_call(os.read, errpipe_read, 1048576) pickle_bits = [] while data: pickle_bits.append(data) data = _eintr_retry_call(os.read, errpipe_read, 1048576) data = "".join(pickle_bits) finally: if p2cread is not None and p2cwrite is not None: _close_in_parent(p2cread) if c2pwrite is not None and c2pread is not None: _close_in_parent(c2pwrite) if errwrite is not None and errread is not None: _close_in_parent(errwrite) # be sure the FD is closed no matter what os.close(errpipe_read) if data != "": try: _eintr_retry_call(os.waitpid, self.pid, 0) except OSError as e: if e.errno != errno.ECHILD: raise child_exception = pickle.loads(data) raise child_exception def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED, _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED, _WEXITSTATUS=os.WEXITSTATUS): # This method is called (indirectly) by __del__, so it cannot # refer to anything outside of its local scope. if _WIFSIGNALED(sts): self.returncode = -_WTERMSIG(sts) elif _WIFEXITED(sts): self.returncode = _WEXITSTATUS(sts) else: # Should never happen raise RuntimeError("Unknown child exit status!") def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, _WNOHANG=os.WNOHANG, _os_error=os.error, _ECHILD=errno.ECHILD): """Check if child process has terminated. Returns returncode attribute. This method is called by __del__, so it cannot reference anything outside of the local scope (nor can any methods it calls). """ if self.returncode is None: try: pid, sts = _waitpid(self.pid, _WNOHANG) if pid == self.pid: self._handle_exitstatus(sts) except _os_error as e: if _deadstate is not None: self.returncode = _deadstate if e.errno == _ECHILD: # This happens if SIGCLD is set to be ignored or # waiting for child processes has otherwise been # disabled for our process. This child is dead, we # can't get the status. # http://bugs.python.org/issue15756 self.returncode = 0 return self.returncode def wait(self): """Wait for child process to terminate. Returns returncode attribute.""" while self.returncode is None: try: pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0) except OSError as e: if e.errno != errno.ECHILD: raise # This happens if SIGCLD is set to be ignored or waiting # for child processes has otherwise been disabled for our # process. This child is dead, we can't get the status. pid = self.pid sts = 0 # Check the pid and loop as waitpid has been known to return # 0 even without WNOHANG in odd situations. issue14396. if pid == self.pid: self._handle_exitstatus(sts) return self.returncode def _communicate(self, input): if self.stdin: # Flush stdio buffer. This might block, if the user has # been writing to .stdin in an uncontrolled fashion. self.stdin.flush() if not input: self.stdin.close() if _has_poll: stdout, stderr = self._communicate_with_poll(input) else: stdout, stderr = self._communicate_with_select(input) # All data exchanged. Translate lists into strings. if stdout is not None: stdout = ''.join(stdout) if stderr is not None: stderr = ''.join(stderr) # Translate newlines, if requested. We cannot let the file # object do the translation: It is based on stdio, which is # impossible to combine with select (unless forcing no # buffering). if self.universal_newlines and hasattr(file, 'newlines'): if stdout: stdout = self._translate_newlines(stdout) if stderr: stderr = self._translate_newlines(stderr) self.wait() return (stdout, stderr) def _communicate_with_poll(self, input): stdout = None # Return stderr = None # Return fd2file = {} fd2output = {} poller = select.poll() def register_and_append(file_obj, eventmask): poller.register(file_obj.fileno(), eventmask) fd2file[file_obj.fileno()] = file_obj def close_unregister_and_remove(fd): poller.unregister(fd) fd2file[fd].close() fd2file.pop(fd) if self.stdin and input: register_and_append(self.stdin, select.POLLOUT) select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI if self.stdout: register_and_append(self.stdout, select_POLLIN_POLLPRI) fd2output[self.stdout.fileno()] = stdout = [] if self.stderr: register_and_append(self.stderr, select_POLLIN_POLLPRI) fd2output[self.stderr.fileno()] = stderr = [] input_offset = 0 while fd2file: try: ready = poller.poll() except select.error, e: if e.args[0] == errno.EINTR: continue raise for fd, mode in ready: if mode & select.POLLOUT: chunk = input[input_offset : input_offset + _PIPE_BUF] try: input_offset += os.write(fd, chunk) except OSError as e: if e.errno == errno.EPIPE: close_unregister_and_remove(fd) else: raise else: if input_offset >= len(input): close_unregister_and_remove(fd) elif mode & select_POLLIN_POLLPRI: data = os.read(fd, 4096) if not data: close_unregister_and_remove(fd) fd2output[fd].append(data) else: # Ignore hang up or errors. close_unregister_and_remove(fd) return (stdout, stderr) def _communicate_with_select(self, input): read_set = [] write_set = [] stdout = None # Return stderr = None # Return if self.stdin and input: write_set.append(self.stdin) if self.stdout: read_set.append(self.stdout) stdout = [] if self.stderr: read_set.append(self.stderr) stderr = [] input_offset = 0 while read_set or write_set: try: rlist, wlist, xlist = select.select(read_set, write_set, []) except select.error, e: if e.args[0] == errno.EINTR: continue raise if self.stdin in wlist: chunk = input[input_offset : input_offset + _PIPE_BUF] try: bytes_written = os.write(self.stdin.fileno(), chunk) except OSError as e: if e.errno == errno.EPIPE: self.stdin.close() write_set.remove(self.stdin) else: raise else: input_offset += bytes_written if input_offset >= len(input): self.stdin.close() write_set.remove(self.stdin) if self.stdout in rlist: data = os.read(self.stdout.fileno(), 1024) if data == "": self.stdout.close() read_set.remove(self.stdout) stdout.append(data) if self.stderr in rlist: data = os.read(self.stderr.fileno(), 1024) if data == "": self.stderr.close() read_set.remove(self.stderr) stderr.append(data) return (stdout, stderr) def send_signal(self, sig): """Send a signal to the process """ os.kill(self.pid, sig) def terminate(self): """Terminate the process with SIGTERM """ self.send_signal(signal.SIGTERM) def kill(self): """Kill the process with SIGKILL """ self.send_signal(signal.SIGKILL) def _demo_posix(): # # Example 1: Simple redirection: Get process list # plist = Popen(["ps"], stdout=PIPE).communicate()[0] print "Process list:" print plist # # Example 2: Change uid before executing child # if os.getuid() == 0: p = Popen(["id"], preexec_fn=lambda: os.setuid(100)) p.wait() # # Example 3: Connecting several subprocesses # print "Looking for 'hda'..." p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) print repr(p2.communicate()[0]) # # Example 4: Catch execution error # print print "Trying a weird file..." try: print Popen(["/this/path/does/not/exist"]).communicate() except OSError, e: if e.errno == errno.ENOENT: print "The file didn't exist. I thought so..." print "Child traceback:" print e.child_traceback else: print "Error", e.errno else: print >>sys.stderr, "Gosh. No error." def _demo_windows(): # # Example 1: Connecting several subprocesses # print "Looking for 'PROMPT' in set output..." p1 = Popen("set", stdout=PIPE, shell=True) p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE) print repr(p2.communicate()[0]) # # Example 2: Simple execution of program # print "Executing calc..." p = Popen("calc") p.wait() if __name__ == "__main__": if mswindows: _demo_windows() else: _demo_posix() DisplayCAL-3.5.0.0/DisplayCAL/systrayicon.py0000644000076500000000000002212213242301247020361 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Drop-In replacement for wx.TaskBarIcon This one won't stop showing updates to the icon like wx.TaskBarIcon """ import os import sys import win32api import win32con import win32gui import winerror import wx class Menu(wx.EvtHandler): def __init__(self): wx.EvtHandler.__init__(self) self.hmenu = win32gui.CreatePopupMenu() self.MenuItems = [] self._menuitems = {} def _Append(self, flags, id, text): win32gui.AppendMenu(self.hmenu, flags, id, text) def Append(self, id, text, help=u"", kind=wx.ITEM_NORMAL): return self.AppendItem(MenuItem(self, id, text, help, kind)) def AppendCheckItem(self, id, text, help=u""): return self.Append(id, text, help, wx.ITEM_CHECK) def AppendItem(self, item): if item.Kind == wx.ITEM_SEPARATOR: flags = win32con.MF_SEPARATOR else: if item.subMenu: flags = win32con.MF_POPUP | win32con.MF_STRING else: flags = 0 if not item.Enabled: flags |= win32con.MF_DISABLED self._Append(flags, item.Id, item.ItemLabel) self.MenuItems.append(item) self._menuitems[item.Id] = item if item.Checked: self.Check(item.Id) return item def AppendSubMenu(self, submenu, text, help=u""): item = MenuItem(self, submenu.hmenu, text, help, wx.ITEM_NORMAL, submenu) return self.AppendItem(item) def AppendRadioItem(self, id, text, help=u""): return self.Append(id, text, help, wx.ITEM_RADIO) def AppendSeparator(self): return self.Append(-1, u"", kind=wx.ITEM_SEPARATOR) def Check(self, id, check=True): flags = win32con.MF_BYCOMMAND if self._menuitems[id].Kind == wx.ITEM_RADIO: if not check: return id1 = id id2 = id index = self.MenuItems.index(self._menuitems[id]) menuitems = self.MenuItems[:index] while menuitems: first_item = menuitems.pop() if first_item.Kind == wx.ITEM_RADIO: id1 = first_item.Id first_item.Checked = False else: break menuitems = self.MenuItems[index:] menuitems.reverse() while menuitems: last_item = menuitems.pop() if last_item.Kind == wx.ITEM_RADIO: id2 = last_item.Id last_item.Checked = False else: break win32gui.CheckMenuRadioItem(self.hmenu, id1, id2, id, flags) else: if check: flags |= win32con.MF_CHECKED win32gui.CheckMenuItem(self.hmenu, id, flags) self._menuitems[id].Checked = check def Enable(self, id, enable=True): flags = win32con.MF_BYCOMMAND if not enable: flags |= win32con.MF_DISABLED win32gui.EnableMenuItem(self.hmenu, id, flags) self._menuitems[id].Enabled = enable class MenuItem(object): def __init__(self, menu, id=-1, text=u"", help=u"", kind=wx.ITEM_NORMAL, subMenu=None): if id == -1: id = wx.NewId() self.Menu = menu self.Id = id self.ItemLabel = text self.Help = help self.Kind = kind self.Enabled = True self.Checked = False self.subMenu = subMenu def Check(self, check=True): self.Checked = check if self.Id in self.Menu._menuitems: self.Menu.Check(self.Id, check) def Enable(self, enable=True): self.Enabled = enable if self.Id in self.Menu._menuitems: self.Menu.Enable(self.Id, enable) class SysTrayIcon(wx.EvtHandler): def __init__(self): wx.EvtHandler.__init__(self) msg_TaskbarCreated = win32gui.RegisterWindowMessage("TaskbarCreated") message_map = {msg_TaskbarCreated: self.OnTaskbarCreated, win32con.WM_DESTROY: self.OnDestroy, win32con.WM_COMMAND: self.OnCommand, win32con.WM_USER + 20: self.OnTaskbarNotify} wc = win32gui.WNDCLASS() hinst = wc.hInstance = win32api.GetModuleHandle(None) wc.lpszClassName = "SysTrayIcon" wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW wc.hCursor = win32api.LoadCursor(0, win32con.IDC_ARROW) wc.hbrBackground = win32con.COLOR_WINDOW wc.lpfnWndProc = message_map classAtom = win32gui.RegisterClass(wc) style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU self.hwnd = win32gui.CreateWindow(wc.lpszClassName, "SysTrayIcon", style, 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, 0, 0, hinst, None) win32gui.UpdateWindow(self.hwnd) self._nid = None self.in_popup = False self.menu = None self.Bind(wx.EVT_TASKBAR_RIGHT_UP, self.OnRightUp) def CreatePopupMenu(self): """ Override this method in derived classes """ if self.menu: return self.menu menu = Menu() item = menu.AppendRadioItem(-1, "Radio 1") item.Check() menu.Bind(wx.EVT_MENU, lambda event: menu.Check(event.Id, event.IsChecked()), id=item.Id) item = menu.AppendRadioItem(-1, "Radio 2") menu.Bind(wx.EVT_MENU, lambda event: menu.Check(event.Id, event.IsChecked()), id=item.Id) menu.AppendSeparator() item = menu.AppendCheckItem(-1, "Checkable") item.Check() menu.Bind(wx.EVT_MENU, lambda event: menu.Check(event.Id, event.IsChecked()), id=item.Id) menu.AppendSeparator() item = menu.AppendCheckItem(-1, "Disabled") item.Enable(False) menu.AppendSeparator() submenu = Menu() item = submenu.AppendCheckItem(-1, "Sub menu item") submenu.Bind(wx.EVT_MENU, lambda event: submenu.Check(event.Id, event.IsChecked()), id=item.Id) subsubmenu = Menu() item = subsubmenu.AppendCheckItem(-1, "Sub sub menu item") subsubmenu.Bind(wx.EVT_MENU, lambda event: subsubmenu.Check(event.Id, event.IsChecked()), id=item.Id) submenu.AppendSubMenu(subsubmenu, "Sub sub menu") menu.AppendSubMenu(submenu, "Sub menu") menu.AppendSeparator() item = menu.Append(-1, "Exit") menu.Bind(wx.EVT_MENU, lambda event: win32gui.DestroyWindow(self.hwnd), id=item.Id) return menu def OnCommand(self, hwnd, msg, wparam, lparam): event = wx.CommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED) event.Id = win32api.LOWORD(wparam) item = _get_selected_menu_item(event.Id, self.menu) if not item: return if item.Kind == wx.ITEM_RADIO: event.SetInt(1) elif item.Kind == wx.ITEM_CHECK: event.SetInt(int(not item.Checked)) item.Menu.ProcessEvent(event) def OnDestroy(self, hwnd, msg, wparam, lparam): if self.menu: win32gui.DestroyMenu(self.menu.hmenu) self.RemoveIcon() if not wx.GetApp() or not wx.GetApp().IsMainLoopRunning(): win32gui.PostQuitMessage(0) def OnRightUp(self, event): self.PopupMenu(self.CreatePopupMenu()) def OnTaskbarCreated(self, hwnd, msg, wparam, lparam): if self._nid: hicon, tooltip = self._nid[4:6] self._nid = None self.SetIcon(hicon, tooltip) def OnTaskbarNotify(self, hwnd, msg, wparam, lparam): if lparam == win32con.WM_LBUTTONDOWN: self.ProcessEvent(wx.CommandEvent(wx.wxEVT_TASKBAR_LEFT_DOWN)) elif lparam == win32con.WM_LBUTTONUP: self.ProcessEvent(wx.CommandEvent(wx.wxEVT_TASKBAR_LEFT_UP)) elif lparam == win32con.WM_LBUTTONDBLCLK: self.ProcessEvent(wx.CommandEvent(wx.wxEVT_TASKBAR_LEFT_DCLICK)) elif lparam == win32con.WM_RBUTTONDOWN: self.ProcessEvent(wx.CommandEvent(wx.wxEVT_TASKBAR_RIGHT_DOWN)) elif lparam == win32con.WM_RBUTTONUP: self.ProcessEvent(wx.CommandEvent(wx.wxEVT_TASKBAR_RIGHT_UP)) return 1 def PopupMenu(self, menu): if self.in_popup: return self.in_popup = True self.menu = menu try: pos = win32gui.GetCursorPos() # See remarks section under # https://msdn.microsoft.com/en-us/library/windows/desktop/ms648002(v=vs.85).aspx try: win32gui.SetForegroundWindow(self.hwnd) except win32gui.error: # Calls to SetForegroundWindow will fail if (e.g.) the Win10 # start menu is currently shown pass win32gui.TrackPopupMenu(menu.hmenu, win32con.TPM_RIGHTBUTTON, pos[0], pos[1], 0, self.hwnd, None) win32gui.PostMessage(self.hwnd, win32con.WM_NULL, 0, 0) finally: self.in_popup = False def RemoveIcon(self): if self._nid: self._nid = None try: win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, (self.hwnd, 0)) except win32gui.error: return False return True return False def SetIcon(self, hicon, tooltip=u""): if isinstance(hicon, wx.Icon): hicon = hicon.GetHandle() flags = win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP if self._nid: msg = win32gui.NIM_MODIFY else: msg = win32gui.NIM_ADD self._nid = (self.hwnd, 0, flags, win32con.WM_USER + 20, hicon, tooltip) try: win32gui.Shell_NotifyIcon(msg, self._nid) except win32gui.error: return False return True def _get_selected_menu_item(id, menu): if id in menu._menuitems: return menu._menuitems[id] else: for item in menu.MenuItems: if item.subMenu: item = _get_selected_menu_item(id, item.subMenu) if item: return item def main(): app = wx.App(0) hinst = win32gui.GetModuleHandle(None) try: hicon = win32gui.LoadImage(hinst, 1, win32con.IMAGE_ICON, 0, 0, win32con.LR_DEFAULTSIZE) except win32gui.error: hicon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION) tooltip = os.path.basename(sys.executable) icon = SysTrayIcon() icon.Bind(wx.EVT_TASKBAR_LEFT_UP, lambda event: wx.MessageDialog(None, u"Native system tray icon demo (Windows only)", u"SysTrayIcon class", wx.OK | wx.ICON_INFORMATION).ShowModal()) icon.SetIcon(hicon, tooltip) win32gui.PumpMessages() if __name__=='__main__': main() DisplayCAL-3.5.0.0/DisplayCAL/taskbar.py0000644000076500000000000000123013104456141017417 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import comtypes.gen.TaskbarLib as tbl import comtypes.client as cc TBPF_NOPROGRESS = 0 TBPF_INDETERMINATE = 0x1 TBPF_NORMAL = 0x2 TBPF_ERROR = 0x4 TBPF_PAUSED = 0x8 taskbar = cc.CreateObject("{56FDF344-FD6D-11d0-958A-006097C9A090}", interface=tbl.ITaskbarList3) taskbar.HrInit() class Taskbar(object): def __init__(self, frame, maxv=100): self.frame = frame self.maxv = maxv def set_progress_value(self, value): if self.frame: taskbar.SetProgressValue(self.frame.GetHandle(), value, self.maxv) def set_progress_state(self, state): if self.frame: taskbar.SetProgressState(self.frame.GetHandle(), state) DisplayCAL-3.5.0.0/DisplayCAL/taskscheduler.py0000644000076500000000000002507413230230667020650 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Task Scheduler interface. Currently only implemented for Windows (Vista and up). The implementation is currently minimal and incomplete when it comes to creating tasks (all tasks are created for the 'INTERACTIVE' group and with only logon triggers and exec actions available). Note that most of the functionality requires administrative privileges. Has a dict-like interface to query existing tasks. >>> ts = TaskScheduler() Check if task "name" exists: >>> "name" in ts or >>> ts.has_task("name") Get existing task "name": >>> task = ts["name"] or >>> ts.get("name") Run task: >>> task.Run() or >>> ts.run("name") Get task exit and startup error codes: >>> exitcode, startup_error_code = task.GetExitCode() or >>> exitcode, startup_error_code = ts.get_exit_code(task) Create a new task to be run under the current user account at logon: >>> task = ts.create("name", "program.exe", ["arg1", "arg2", "argn"]) """ from __future__ import with_statement from itertools import izip, imap import codecs import os import subprocess as sp import sys import tempfile import pywintypes import winerror from log import safe_print from meta import name as appname from safe_print import enc from util_os import getenvu from util_str import safe_str, safe_unicode, universal_newlines from util_win import run_as_admin RUNLEVEL_HIGHESTAVAILABLE = "HighestAvailable" RUNLEVEL_LEASTPRIVILEGE = "LeastPrivilege" MULTIPLEINSTANCES_IGNORENEW = "IgnoreNew" MULTIPLEINSTANCES_STOPEXISTING = "StopExisting" class LogonTrigger(object): def __init__(self, enabled=True): self.enabled = enabled def __unicode__(self): return """ %s """ % str(self.enabled).lower() class ExecAction(object): def __init__(self, cmd, args=None): self.cmd = cmd self.args = args or [] def __unicode__(self): return """ %s %s """ % (self.cmd, sp.list2cmdline(self.args)) class Task(object): def __init__(self, name="", author="", description="", group_id="S-1-5-4", runlevel=RUNLEVEL_HIGHESTAVAILABLE, multiple_instances=MULTIPLEINSTANCES_IGNORENEW, disallow_start_if_on_batteries=False, stop_if_going_on_batteries=False, allow_hard_terminate=True, start_when_available=False, run_only_if_network_available=False, stop_on_idle_end=False, restart_on_idle=False, allow_start_on_demand=True, enabled=True, hidden=False, run_only_if_idle=False, wake_to_run=False, execution_time_limit="PT72H", priority=5, triggers=None, actions=None): self.kwargs = locals() self.triggers = triggers or [] self.actions = actions or [] def add_exec_action(self, cmd, args=None): self.actions.append(ExecAction(cmd, args)) def add_logon_trigger(self, enabled=True): self.triggers.append(LogonTrigger(enabled)) def write_xml(self, xmlfilename): with open(xmlfilename, "wb") as xmlfile: xmlfile.write(codecs.BOM_UTF16_LE + str(self)) def __str__(self): kwargs = dict(self.kwargs) for name, value in kwargs.iteritems(): if isinstance(value, bool): kwargs[name] = str(value).lower() triggers = "\n".join(unicode(trigger) for trigger in self.triggers) actions = "\n".join(unicode(action) for action in self.actions) kwargs.update({"triggers": triggers, "actions": actions}) return universal_newlines((""" %(author)s %(description)s \%(name)s %(triggers)s %(group_id)s %(runlevel)s %(multiple_instances)s %(disallow_start_if_on_batteries)s %(stop_if_going_on_batteries)s %(allow_hard_terminate)s %(start_when_available)s %(run_only_if_network_available)s %(stop_on_idle_end)s %(restart_on_idle)s %(allow_start_on_demand)s %(enabled)s %(hidden)s %(run_only_if_idle)s %(wake_to_run)s %(execution_time_limit)s %(priority)i %(actions)s """ % kwargs)).replace("\n", "\r\n").encode("UTF-16-LE") class TaskScheduler(object): def __init__(self): self.__ts = None self.stdout = "" self.lastreturncode = None @property def _ts(self): if not self.__ts: import pythoncom from win32com.taskscheduler.taskscheduler import (CLSID_CTaskScheduler, IID_ITaskScheduler) self.__ts = pythoncom.CoCreateInstance(CLSID_CTaskScheduler, None, pythoncom.CLSCTX_INPROC_SERVER, IID_ITaskScheduler) return self.__ts def __contains__(self, name): return name + ".job" in self._ts.Enum() def __getitem__(self, name): return self._ts.Activate(name) def __iter__(self): return iter(job[:-4] for job in self._ts.Enum()) def create_task(self, name, author="", description="", group_id="S-1-5-4", runlevel=RUNLEVEL_HIGHESTAVAILABLE, multiple_instances=MULTIPLEINSTANCES_IGNORENEW, disallow_start_if_on_batteries=False, stop_if_going_on_batteries=False, allow_hard_terminate=True, start_when_available=False, run_only_if_network_available=False, stop_on_idle_end=False, restart_on_idle=False, allow_start_on_demand=True, enabled=True, hidden=False, run_only_if_idle=False, wake_to_run=False, execution_time_limit="PT72H", priority=5, triggers=None, actions=None, replace_existing=False, elevated=False, echo=False): """ Create a new task. If replace_existing evaluates to True, delete any existing task with same name first, otherwise raise KeyError. """ kwargs = locals() del kwargs["self"] del kwargs["replace_existing"] del kwargs["elevated"] del kwargs["echo"] if not replace_existing and name in self: raise KeyError("The task %s already exists" % name) tempdir = tempfile.mkdtemp(prefix=appname + u"-") task = Task(**kwargs) xmlfilename = os.path.join(tempdir, name + ".xml") task.write_xml(xmlfilename) try: return self._schtasks(["/Create", "/TN", name, "/XML", xmlfilename], elevated, echo) finally: os.remove(xmlfilename) os.rmdir(tempdir) def create_logon_task(self, name, cmd, args=None, author="", description="", group_id="S-1-5-4", runlevel=RUNLEVEL_HIGHESTAVAILABLE, multiple_instances=MULTIPLEINSTANCES_IGNORENEW, disallow_start_if_on_batteries=False, stop_if_going_on_batteries=False, allow_hard_terminate=True, start_when_available=False, run_only_if_network_available=False, stop_on_idle_end=False, restart_on_idle=False, allow_start_on_demand=True, enabled=True, hidden=False, run_only_if_idle=False, wake_to_run=False, execution_time_limit="PT72H", priority=5, replace_existing=False, elevated=False, echo=False): kwargs = locals() del kwargs["self"] del kwargs["cmd"] del kwargs["args"] kwargs.update({"triggers": [LogonTrigger()], "actions": [ExecAction(cmd, args)]}) return self.create_task(**kwargs) def delete(self, name): """ Delete existing task """ self._ts.Delete(name) def get(self, name, default=None): """ Get existing task """ if name in self: return self[name] return default def get_exit_code(self, task): """ Shorthand for task.GetExitCode(). Return a 2-tuple exitcode, startup_error_code. Call win32api.FormatMessage() on either value to get a readable message """ return task.GetExitCode() def items(self): return zip(self, self.tasks()) def iteritems(self): return izip(self, self.itertasks()) def itertasks(self): return imap(self.get, self) def run(self, name, elevated=False, echo=False): """ Run existing task """ return self._schtasks(["/Run", "/TN", name], elevated, echo) def has_task(self, name): """ Same as name in self """ return name in self def query_task(self, name, echo=False): """ Query task. """ return self._schtasks(["/Query", "/TN", name], False, echo) def _schtasks(self, args, elevated=False, echo=False): if elevated: try: p = run_as_admin("schtasks.exe", args, close_process=False, show=False) except pywintypes.error, exception: if exception.args[0] == winerror.ERROR_CANCELLED: self.lastreturncode = winerror.ERROR_CANCELLED else: raise else: self.lastreturncode = int(p["hProcess"].handle == 0) p["hProcess"].Close() finally: self.stdout = "" else: args.insert(0, "schtasks.exe") startupinfo = sp.STARTUPINFO() startupinfo.dwFlags |= sp.STARTF_USESHOWWINDOW startupinfo.wShowWindow = sp.SW_HIDE p = sp.Popen([safe_str(arg) for arg in args], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.STDOUT, startupinfo=startupinfo) self.stdout, stderr = p.communicate() if echo: safe_print(safe_unicode(self.stdout, enc)) self.lastreturncode = p.returncode return self.lastreturncode == 0 def tasks(self): return map(self.get, self) if __name__ == "__main__": def print_task_attr(name, attr, *args): print "%18s:" % name, if callable(attr): try: print attr(*args) except pywintypes.com_error, exception: print WindowsError(*exception.args) except TypeError, exception: print exception else: print attr ts = TaskScheduler() for taskname, task in ts.iteritems(): print "=" * 79 print "%18s:" % "Task", taskname for name in dir(task): if name == "GetRunTimes": continue attr = getattr(task, name) if name.startswith("Get"): if name in ("GetTrigger", "GetTriggerString"): for i in xrange(task.GetTriggerCount()): print_task_attr(name[3:] +"(%i)" % i, attr, i) else: print_task_attr(name[3:], attr) DisplayCAL-3.5.0.0/DisplayCAL/technology_strings-1.7.0.json0000644000076500000000000000140312665102054022702 0ustar devwheel00000000000000{ "c": "CRT", "m": "Plasma", "l": "LCD", "1": "LCD CCFL", "2": "LCD CCFL IPS", "3": "LCD CCFL VPA", "4": "LCD CCFL TFT", "L": "LCD CCFL Wide Gamut", "5": "LCD CCFL Wide Gamut IPS", "6": "LCD CCFL Wide Gamut VPA", "7": "LCD CCFL Wide Gamut TFT", "e": "LCD White LED", "8": "LCD White LED IPS", "9": "LCD White LED VPA", "a": "LCD White LED TFT", "b": "LCD RGB LED", "b": "LCD RGB LED IPS", "c": "LCD RGB LED VPA", "d": "LCD RGB LED TFT", "h": "LCD RG Phosphor", "e": "LCD RG Phosphor IPS", "f": "LCD RG Phosphor VPA", "g": "LCD RG Phosphor TFT", "o": "LED OLED", "a": "LED AMOLED", "p": "DLP Projector", "h": "DLP Projector RGB Filter Wheel", "i": "DPL Projector RGBW Filter Wheel", "j": "DLP Projector RGBCMY Filter Wheel", "u": "Unknown" } DisplayCAL-3.5.0.0/DisplayCAL/technology_strings-1.7.1.json0000644000076500000000000000140312665102055022704 0ustar devwheel00000000000000{ "c": "CRT", "m": "Plasma", "l": "LCD", "1": "LCD CCFL", "2": "LCD CCFL IPS", "3": "LCD CCFL VPA", "4": "LCD CCFL TFT", "L": "LCD CCFL Wide Gamut", "5": "LCD CCFL Wide Gamut IPS", "6": "LCD CCFL Wide Gamut VPA", "7": "LCD CCFL Wide Gamut TFT", "e": "LCD White LED", "8": "LCD White LED IPS", "9": "LCD White LED VPA", "d": "LCD White LED TFT", "b": "LCD RGB LED", "f": "LCD RGB LED IPS", "g": "LCD RGB LED VPA", "i": "LCD RGB LED TFT", "h": "LCD RG Phosphor", "j": "LCD RG Phosphor IPS", "k": "LCD RG Phosphor VPA", "n": "LCD RG Phosphor TFT", "o": "LED OLED", "a": "LED AMOLED", "p": "DLP Projector", "q": "DLP Projector RGB Filter Wheel", "r": "DPL Projector RGBW Filter Wheel", "s": "DLP Projector RGBCMY Filter Wheel", "u": "Unknown" } DisplayCAL-3.5.0.0/DisplayCAL/tempfile.py0000644000076500000000000000042313242301247017577 0ustar devwheel00000000000000# WRAPPER FOR PYTHON 2.5 # This module exists only to make sure that other module's imports of tempfile # end up with a version that has the SpooledTemporaryFile class (introduced in # Python 2.6) from tempfile26 import * from tempfile26 import _bin_openflags, _set_cloexec DisplayCAL-3.5.0.0/DisplayCAL/tempfile26.py0000644000076500000000000004411612665102055017762 0ustar devwheel00000000000000"""Temporary files. This module provides generic, low- and high-level interfaces for creating temporary files and directories. The interfaces listed as "safe" just below can be used without fear of race conditions. Those listed as "unsafe" cannot, and are provided for backward compatibility only. This module also provides some data items to the user: TMP_MAX - maximum number of names that will be tried before giving up. template - the default prefix for all temporary names. You may change this to control the default prefix. tempdir - If this is set to a string before the first use of any routine from this module, it will be considered as another candidate location to store temporary files. """ __all__ = [ "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces "SpooledTemporaryFile", "mkstemp", "mkdtemp", # low level safe interfaces "mktemp", # deprecated unsafe interface "TMP_MAX", "gettempprefix", # constants "tempdir", "gettempdir" ] # Imports. import os as _os import errno as _errno from random import Random as _Random try: from cStringIO import StringIO as _StringIO except ImportError: from StringIO import StringIO as _StringIO try: import fcntl as _fcntl except ImportError: def _set_cloexec(fd): pass else: def _set_cloexec(fd): try: flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0) except IOError: pass else: # flags read successfully, modify flags |= _fcntl.FD_CLOEXEC _fcntl.fcntl(fd, _fcntl.F_SETFD, flags) try: import thread as _thread except ImportError: import dummy_thread as _thread _allocate_lock = _thread.allocate_lock _text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL if hasattr(_os, 'O_NOINHERIT'): _text_openflags |= _os.O_NOINHERIT if hasattr(_os, 'O_NOFOLLOW'): _text_openflags |= _os.O_NOFOLLOW _bin_openflags = _text_openflags if hasattr(_os, 'O_BINARY'): _bin_openflags |= _os.O_BINARY if hasattr(_os, 'TMP_MAX'): TMP_MAX = _os.TMP_MAX else: TMP_MAX = 10000 template = "tmp" # Internal routines. _once_lock = _allocate_lock() if hasattr(_os, "lstat"): _stat = _os.lstat elif hasattr(_os, "stat"): _stat = _os.stat else: # Fallback. All we need is something that raises os.error if the # file doesn't exist. def _stat(fn): try: f = open(fn) except IOError: raise _os.error f.close() def _exists(fn): try: _stat(fn) except _os.error: return False else: return True class _RandomNameSequence: """An instance of _RandomNameSequence generates an endless sequence of unpredictable strings which can safely be incorporated into file names. Each string is six characters long. Multiple threads can safely use the same instance at the same time. _RandomNameSequence is an iterator.""" characters = ("abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789_") def __init__(self): self.mutex = _allocate_lock() self.rng = _Random() self.normcase = _os.path.normcase def __iter__(self): return self def next(self): m = self.mutex c = self.characters choose = self.rng.choice m.acquire() try: letters = [choose(c) for dummy in "123456"] finally: m.release() return self.normcase(''.join(letters)) def _candidate_tempdir_list(): """Generate a list of candidate temporary directories which _get_default_tempdir will try. Unlike the _candidate_tempdir_list of tempfile.py from the stdlib, this one supports Unicode.""" from util_os import getenvu dirlist = [] # First, try the environment. for envname in 'TMPDIR', 'TEMP', 'TMP': dirname = getenvu(envname) if dirname: dirlist.append(dirname) # Failing that, try OS-specific locations. if _os.name == 'riscos': dirname = getenvu('Wimp$ScrapDir') if dirname: dirlist.append(dirname) elif _os.name == 'nt': dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ]) else: dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ]) # As a last resort, the current directory. try: dirlist.append(_os.getcwd()) except (AttributeError, _os.error): dirlist.append(_os.curdir) return dirlist def _get_default_tempdir(): """Calculate the default directory to use for temporary files. This routine should be called exactly once. We determine whether or not a candidate temp dir is usable by trying to create and write to a file in that directory. If this is successful, the test file is deleted. To prevent denial of service, the name of the test file must be randomized.""" namer = _RandomNameSequence() dirlist = _candidate_tempdir_list() flags = _text_openflags for dir in dirlist: if dir != _os.curdir: dir = _os.path.normcase(_os.path.abspath(dir)) # Try only a few names per directory. for seq in xrange(100): name = namer.next() filename = _os.path.join(dir, name) try: fd = _os.open(filename, flags, 0600) fp = _os.fdopen(fd, 'w') fp.write('blat') fp.close() _os.unlink(filename) del fp, fd return dir except (OSError, IOError), e: if e[0] != _errno.EEXIST: break # no point trying more names in this directory pass raise IOError, (_errno.ENOENT, ("No usable temporary directory found in %s" % dirlist)) _name_sequence = None def _get_candidate_names(): """Common setup sequence for all user-callable interfaces.""" global _name_sequence if _name_sequence is None: _once_lock.acquire() try: if _name_sequence is None: _name_sequence = _RandomNameSequence() finally: _once_lock.release() return _name_sequence def _mkstemp_inner(dir, pre, suf, flags): """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile.""" names = _get_candidate_names() for seq in xrange(TMP_MAX): name = names.next() file = _os.path.join(dir, pre + name + suf) try: fd = _os.open(file, flags, 0600) _set_cloexec(fd) return (fd, _os.path.abspath(file)) except OSError, e: if e.errno == _errno.EEXIST: continue # try again raise raise IOError, (_errno.EEXIST, "No usable temporary file name found") # User visible interfaces. def gettempprefix(): """Accessor for tempdir.template.""" return template tempdir = None def gettempdir(): """Accessor for tempfile.tempdir.""" global tempdir if tempdir is None: _once_lock.acquire() try: if tempdir is None: tempdir = _get_default_tempdir() finally: _once_lock.release() return tempdir def mkstemp(suffix="", prefix=template, dir=None, text=False): """User-callable function to create and return a unique temporary file. The return value is a pair (fd, name) where fd is the file descriptor returned by os.open, and name is the filename. If 'suffix' is specified, the file name will end with that suffix, otherwise there will be no suffix. If 'prefix' is specified, the file name will begin with that prefix, otherwise a default prefix is used. If 'dir' is specified, the file will be created in that directory, otherwise a default directory is used. If 'text' is specified and true, the file is opened in text mode. Else (the default) the file is opened in binary mode. On some operating systems, this makes no difference. The file is readable and writable only by the creating user ID. If the operating system uses permission bits to indicate whether a file is executable, the file is executable by no one. The file descriptor is not inherited by children of this process. Caller is responsible for deleting the file when done with it. """ if dir is None: dir = gettempdir() if text: flags = _text_openflags else: flags = _bin_openflags return _mkstemp_inner(dir, prefix, suffix, flags) def mkdtemp(suffix="", prefix=template, dir=None): """User-callable function to create and return a unique temporary directory. The return value is the pathname of the directory. Arguments are as for mkstemp, except that the 'text' argument is not accepted. The directory is readable, writable, and searchable only by the creating user. Caller is responsible for deleting the directory when done with it. """ if dir is None: dir = gettempdir() names = _get_candidate_names() for seq in xrange(TMP_MAX): name = names.next() file = _os.path.join(dir, prefix + name + suffix) try: _os.mkdir(file, 0700) return file except OSError, e: if e.errno == _errno.EEXIST: continue # try again raise raise IOError, (_errno.EEXIST, "No usable temporary directory name found") def mktemp(suffix="", prefix=template, dir=None): """User-callable function to return a unique temporary file name. The file is not created. Arguments are as for mkstemp, except that the 'text' argument is not accepted. This function is unsafe and should not be used. The file name refers to a file that did not exist at some point, but by the time you get around to creating it, someone else may have beaten you to the punch. """ ## from warnings import warn as _warn ## _warn("mktemp is a potential security risk to your program", ## RuntimeWarning, stacklevel=2) if dir is None: dir = gettempdir() names = _get_candidate_names() for seq in xrange(TMP_MAX): name = names.next() file = _os.path.join(dir, prefix + name + suffix) if not _exists(file): return file raise IOError, (_errno.EEXIST, "No usable temporary filename found") class _TemporaryFileWrapper: """Temporary file wrapper This class provides a wrapper around files opened for temporary use. In particular, it seeks to automatically remove the file when it is no longer needed. """ def __init__(self, file, name, delete=True): self.file = file self.name = name self.close_called = False self.delete = delete def __getattr__(self, name): # Attribute lookups are delegated to the underlying file # and cached for non-numeric results # (i.e. methods are cached, closed and friends are not) file = self.__dict__['file'] a = getattr(file, name) if not issubclass(type(a), type(0)): setattr(self, name, a) return a # The underlying __enter__ method returns the wrong object # (self.file) so override it to return the wrapper def __enter__(self): self.file.__enter__() return self # NT provides delete-on-close as a primitive, so we don't need # the wrapper to do anything special. We still use it so that # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile. if _os.name != 'nt': # Cache the unlinker so we don't get spurious errors at # shutdown when the module-level "os" is None'd out. Note # that this must be referenced as self.unlink, because the # name TemporaryFileWrapper may also get None'd out before # __del__ is called. unlink = _os.unlink def close(self): if not self.close_called: self.close_called = True self.file.close() if self.delete: self.unlink(self.name) def __del__(self): self.close() # Need to trap __exit__ as well to ensure the file gets # deleted when used in a with statement def __exit__(self, exc, value, tb): result = self.file.__exit__(exc, value, tb) self.close() return result def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="", prefix=template, dir=None, delete=True): """Create and return a temporary file. Arguments: 'prefix', 'suffix', 'dir' -- as for mkstemp. 'mode' -- the mode argument to os.fdopen (default "w+b"). 'bufsize' -- the buffer size argument to os.fdopen (default -1). 'delete' -- whether the file is deleted on close (default True). The file is created as mkstemp() would do it. Returns an object with a file-like interface; the name of the file is accessible as file.name. The file will be automatically deleted when it is closed unless the 'delete' argument is set to False. """ if dir is None: dir = gettempdir() if 'b' in mode: flags = _bin_openflags else: flags = _text_openflags # Setting O_TEMPORARY in the flags causes the OS to delete # the file when it is closed. This is only supported by Windows. if _os.name == 'nt' and delete: flags |= _os.O_TEMPORARY (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags) file = _os.fdopen(fd, mode, bufsize) return _TemporaryFileWrapper(file, name, delete) if _os.name != 'posix' or _os.sys.platform == 'cygwin': # On non-POSIX and Cygwin systems, assume that we cannot unlink a file # while it is open. TemporaryFile = NamedTemporaryFile else: def TemporaryFile(mode='w+b', bufsize=-1, suffix="", prefix=template, dir=None): """Create and return a temporary file. Arguments: 'prefix', 'suffix', 'dir' -- as for mkstemp. 'mode' -- the mode argument to os.fdopen (default "w+b"). 'bufsize' -- the buffer size argument to os.fdopen (default -1). The file is created as mkstemp() would do it. Returns an object with a file-like interface. The file has no name, and will cease to exist when it is closed. """ if dir is None: dir = gettempdir() if 'b' in mode: flags = _bin_openflags else: flags = _text_openflags (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags) try: _os.unlink(name) return _os.fdopen(fd, mode, bufsize) except: _os.close(fd) raise class SpooledTemporaryFile: """Temporary file wrapper, specialized to switch from StringIO to a real file when it exceeds a certain size or when a fileno is needed. """ _rolled = False def __init__(self, max_size=0, mode='w+b', bufsize=-1, suffix="", prefix=template, dir=None): self._file = _StringIO() self._max_size = max_size self._rolled = False self._TemporaryFileArgs = (mode, bufsize, suffix, prefix, dir) def _check(self, file): if self._rolled: return max_size = self._max_size if max_size and file.tell() > max_size: self.rollover() def rollover(self): if self._rolled: return file = self._file newfile = self._file = TemporaryFile(*self._TemporaryFileArgs) del self._TemporaryFileArgs newfile.write(file.getvalue()) newfile.seek(file.tell(), 0) self._rolled = True # The method caching trick from NamedTemporaryFile # won't work here, because _file may change from a # _StringIO instance to a real file. So we list # all the methods directly. # Context management protocol def __enter__(self): if self._file.closed: raise ValueError("Cannot enter context with closed file") return self def __exit__(self, exc, value, tb): self._file.close() # file protocol def __iter__(self): return self._file.__iter__() def close(self): self._file.close() @property def closed(self): return self._file.closed @property def encoding(self): return self._file.encoding def fileno(self): self.rollover() return self._file.fileno() def flush(self): self._file.flush() def isatty(self): return self._file.isatty() @property def mode(self): return self._file.mode @property def name(self): return self._file.name @property def newlines(self): return self._file.newlines def next(self): return self._file.next def read(self, *args): return self._file.read(*args) def readline(self, *args): return self._file.readline(*args) def readlines(self, *args): return self._file.readlines(*args) def seek(self, *args): self._file.seek(*args) @property def softspace(self): return self._file.softspace def tell(self): return self._file.tell() def truncate(self): self._file.truncate() def write(self, s): file = self._file rv = file.write(s) self._check(file) return rv def writelines(self, iterable): file = self._file rv = file.writelines(iterable) self._check(file) return rv def xreadlines(self, *args): return self._file.xreadlines(*args) DisplayCAL-3.5.0.0/DisplayCAL/test.cal0000644000076500000000000002051112665102055017064 0ustar devwheel00000000000000CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Wed Dec 24 20:08:15 2008" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" KEYWORD "RGB_I" NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.20000 0.20000 0.20000 0.00392 0.20235 0.20235 0.20235 0.00784 0.20471 0.20471 0.20471 0.01176 0.20706 0.20706 0.20706 0.01569 0.20941 0.20941 0.20941 0.01961 0.21176 0.21176 0.21176 0.02353 0.21412 0.21412 0.21412 0.02745 0.21647 0.21647 0.21647 0.03137 0.21882 0.21882 0.21882 0.03529 0.22118 0.22118 0.22118 0.03922 0.22353 0.22353 0.22353 0.04314 0.22588 0.22588 0.22588 0.04706 0.22824 0.22824 0.22824 0.05098 0.23059 0.23059 0.23059 0.05490 0.23294 0.23294 0.23294 0.05882 0.23529 0.23529 0.23529 0.06275 0.23765 0.23765 0.23765 0.06667 0.24000 0.24000 0.24000 0.07059 0.24235 0.24235 0.24235 0.07451 0.24471 0.24471 0.24471 0.07843 0.24706 0.24706 0.24706 0.08235 0.24941 0.24941 0.24941 0.08627 0.25176 0.25176 0.25176 0.09020 0.25412 0.25412 0.25412 0.09412 0.25647 0.25647 0.25647 0.09804 0.25882 0.25882 0.25882 0.10196 0.26118 0.26118 0.26118 0.10588 0.26353 0.26353 0.26353 0.10980 0.26588 0.26588 0.26588 0.11373 0.26824 0.26824 0.26824 0.11765 0.27059 0.27059 0.27059 0.12157 0.27294 0.27294 0.27294 0.12549 0.27529 0.27529 0.27529 0.12941 0.27765 0.27765 0.27765 0.13333 0.28000 0.28000 0.28000 0.13725 0.28235 0.28235 0.28235 0.14118 0.28471 0.28471 0.28471 0.14510 0.28706 0.28706 0.28706 0.14902 0.28941 0.28941 0.28941 0.15294 0.29176 0.29176 0.29176 0.15686 0.29412 0.29412 0.29412 0.16078 0.29647 0.29647 0.29647 0.16471 0.29882 0.29882 0.29882 0.16863 0.30118 0.30118 0.30118 0.17255 0.30353 0.30353 0.30353 0.17647 0.30588 0.30588 0.30588 0.18039 0.30824 0.30824 0.30824 0.18431 0.31059 0.31059 0.31059 0.18824 0.31294 0.31294 0.31294 0.19216 0.31529 0.31529 0.31529 0.19608 0.31765 0.31765 0.31765 0.20000 0.32000 0.32000 0.32000 0.20392 0.32235 0.32235 0.32235 0.20784 0.32471 0.32471 0.32471 0.21176 0.32706 0.32706 0.32706 0.21569 0.32941 0.32941 0.32941 0.21961 0.33176 0.33176 0.33176 0.22353 0.33412 0.33412 0.33412 0.22745 0.33647 0.33647 0.33647 0.23137 0.33882 0.33882 0.33882 0.23529 0.34118 0.34118 0.34118 0.23922 0.34353 0.34353 0.34353 0.24314 0.34588 0.34588 0.34588 0.24706 0.34824 0.34824 0.34824 0.25098 0.35059 0.35059 0.35059 0.25490 0.35294 0.35294 0.35294 0.25882 0.35529 0.35529 0.35529 0.26275 0.35765 0.35765 0.35765 0.26667 0.36000 0.36000 0.36000 0.27059 0.36235 0.36235 0.36235 0.27451 0.36471 0.36471 0.36471 0.27843 0.36706 0.36706 0.36706 0.28235 0.36941 0.36941 0.36941 0.28627 0.37176 0.37176 0.37176 0.29020 0.37412 0.37412 0.37412 0.29412 0.37647 0.37647 0.37647 0.29804 0.37882 0.37882 0.37882 0.30196 0.38118 0.38118 0.38118 0.30588 0.38353 0.38353 0.38353 0.30980 0.38588 0.38588 0.38588 0.31373 0.38824 0.38824 0.38824 0.31765 0.39059 0.39059 0.39059 0.32157 0.39294 0.39294 0.39294 0.32549 0.39529 0.39529 0.39529 0.32941 0.39765 0.39765 0.39765 0.33333 0.40000 0.40000 0.40000 0.33725 0.40235 0.40235 0.40235 0.34118 0.40471 0.40471 0.40471 0.34510 0.40706 0.40706 0.40706 0.34902 0.40941 0.40941 0.40941 0.35294 0.41176 0.41176 0.41176 0.35686 0.41412 0.41412 0.41412 0.36078 0.41647 0.41647 0.41647 0.36471 0.41882 0.41882 0.41882 0.36863 0.42118 0.42118 0.42118 0.37255 0.42353 0.42353 0.42353 0.37647 0.42588 0.42588 0.42588 0.38039 0.42824 0.42824 0.42824 0.38431 0.43059 0.43059 0.43059 0.38824 0.43294 0.43294 0.43294 0.39216 0.43529 0.43529 0.43529 0.39608 0.43765 0.43765 0.43765 0.40000 0.44000 0.44000 0.44000 0.40392 0.44235 0.44235 0.44235 0.40784 0.44471 0.44471 0.44471 0.41176 0.44706 0.44706 0.44706 0.41569 0.44941 0.44941 0.44941 0.41961 0.45176 0.45176 0.45176 0.42353 0.45412 0.45412 0.45412 0.42745 0.45647 0.45647 0.45647 0.43137 0.45882 0.45882 0.45882 0.43529 0.46118 0.46118 0.46118 0.43922 0.46353 0.46353 0.46353 0.44314 0.46588 0.46588 0.46588 0.44706 0.46824 0.46824 0.46824 0.45098 0.47059 0.47059 0.47059 0.45490 0.47294 0.47294 0.47294 0.45882 0.47529 0.47529 0.47529 0.46275 0.47765 0.47765 0.47765 0.46667 0.48000 0.48000 0.48000 0.47059 0.48235 0.48235 0.48235 0.47451 0.48471 0.48471 0.48471 0.47843 0.48706 0.48706 0.48706 0.48235 0.48941 0.48941 0.48941 0.48627 0.49176 0.49176 0.49176 0.49020 0.49412 0.49412 0.49412 0.49412 0.49647 0.49647 0.49647 0.49804 0.49882 0.49882 0.49882 0.50196 0.50118 0.50118 0.50118 0.50588 0.50353 0.50353 0.50353 0.50980 0.50588 0.50588 0.50588 0.51373 0.50824 0.50824 0.50824 0.51765 0.51059 0.51059 0.51059 0.52157 0.51294 0.51294 0.51294 0.52549 0.51529 0.51529 0.51529 0.52941 0.51765 0.51765 0.51765 0.53333 0.52000 0.52000 0.52000 0.53725 0.52235 0.52235 0.52235 0.54118 0.52471 0.52471 0.52471 0.54510 0.52706 0.52706 0.52706 0.54902 0.52941 0.52941 0.52941 0.55294 0.53176 0.53176 0.53176 0.55686 0.53412 0.53412 0.53412 0.56078 0.53647 0.53647 0.53647 0.56471 0.53882 0.53882 0.53882 0.56863 0.54118 0.54118 0.54118 0.57255 0.54353 0.54353 0.54353 0.57647 0.54588 0.54588 0.54588 0.58039 0.54824 0.54824 0.54824 0.58431 0.55059 0.55059 0.55059 0.58824 0.55294 0.55294 0.55294 0.59216 0.55529 0.55529 0.55529 0.59608 0.55765 0.55765 0.55765 0.60000 0.56000 0.56000 0.56000 0.60392 0.56235 0.56235 0.56235 0.60784 0.56471 0.56471 0.56471 0.61176 0.56706 0.56706 0.56706 0.61569 0.56941 0.56941 0.56941 0.61961 0.57176 0.57176 0.57176 0.62353 0.57412 0.57412 0.57412 0.62745 0.57647 0.57647 0.57647 0.63137 0.57882 0.57882 0.57882 0.63529 0.58118 0.58118 0.58118 0.63922 0.58353 0.58353 0.58353 0.64314 0.58588 0.58588 0.58588 0.64706 0.58824 0.58824 0.58824 0.65098 0.59059 0.59059 0.59059 0.65490 0.59294 0.59294 0.59294 0.65882 0.59529 0.59529 0.59529 0.66275 0.59765 0.59765 0.59765 0.66667 0.60000 0.60000 0.60000 0.67059 0.60235 0.60235 0.60235 0.67451 0.60471 0.60471 0.60471 0.67843 0.60706 0.60706 0.60706 0.68235 0.60941 0.60941 0.60941 0.68627 0.61176 0.61176 0.61176 0.69020 0.61412 0.61412 0.61412 0.69412 0.61647 0.61647 0.61647 0.69804 0.61882 0.61882 0.61882 0.70196 0.62118 0.62118 0.62118 0.70588 0.62353 0.62353 0.62353 0.70980 0.62588 0.62588 0.62588 0.71373 0.62824 0.62824 0.62824 0.71765 0.63059 0.63059 0.63059 0.72157 0.63294 0.63294 0.63294 0.72549 0.63529 0.63529 0.63529 0.72941 0.63765 0.63765 0.63765 0.73333 0.64000 0.64000 0.64000 0.73725 0.64235 0.64235 0.64235 0.74118 0.64471 0.64471 0.64471 0.74510 0.64706 0.64706 0.64706 0.74902 0.64941 0.64941 0.64941 0.75294 0.65176 0.65176 0.65176 0.75686 0.65412 0.65412 0.65412 0.76078 0.65647 0.65647 0.65647 0.76471 0.65882 0.65882 0.65882 0.76863 0.66118 0.66118 0.66118 0.77255 0.66353 0.66353 0.66353 0.77647 0.66588 0.66588 0.66588 0.78039 0.66824 0.66824 0.66824 0.78431 0.67059 0.67059 0.67059 0.78824 0.67294 0.67294 0.67294 0.79216 0.67529 0.67529 0.67529 0.79608 0.67765 0.67765 0.67765 0.80000 0.68000 0.68000 0.68000 0.80392 0.68235 0.68235 0.68235 0.80784 0.68471 0.68471 0.68471 0.81176 0.68706 0.68706 0.68706 0.81569 0.68941 0.68941 0.68941 0.81961 0.69176 0.69176 0.69176 0.82353 0.69412 0.69412 0.69412 0.82745 0.69647 0.69647 0.69647 0.83137 0.69882 0.69882 0.69882 0.83529 0.70118 0.70118 0.70118 0.83922 0.70353 0.70353 0.70353 0.84314 0.70588 0.70588 0.70588 0.84706 0.70824 0.70824 0.70824 0.85098 0.71059 0.71059 0.71059 0.85490 0.71294 0.71294 0.71294 0.85882 0.71529 0.71529 0.71529 0.86275 0.71765 0.71765 0.71765 0.86667 0.72000 0.72000 0.72000 0.87059 0.72235 0.72235 0.72235 0.87451 0.72471 0.72471 0.72471 0.87843 0.72706 0.72706 0.72706 0.88235 0.72941 0.72941 0.72941 0.88627 0.73176 0.73176 0.73176 0.89020 0.73412 0.73412 0.73412 0.89412 0.73647 0.73647 0.73647 0.89804 0.73882 0.73882 0.73882 0.90196 0.74118 0.74118 0.74118 0.90588 0.74353 0.74353 0.74353 0.90980 0.74588 0.74588 0.74588 0.91373 0.74824 0.74824 0.74824 0.91765 0.75059 0.75059 0.75059 0.92157 0.75294 0.75294 0.75294 0.92549 0.75529 0.75529 0.75529 0.92941 0.75765 0.75765 0.75765 0.93333 0.76000 0.76000 0.76000 0.93725 0.76235 0.76235 0.76235 0.94118 0.76471 0.76471 0.76471 0.94510 0.76706 0.76706 0.76706 0.94902 0.76941 0.76941 0.76941 0.95294 0.77176 0.77176 0.77176 0.95686 0.77412 0.77412 0.77412 0.96078 0.77647 0.77647 0.77647 0.96471 0.77882 0.77882 0.77882 0.96863 0.78118 0.78118 0.78118 0.97255 0.78353 0.78353 0.78353 0.97647 0.78588 0.78588 0.78588 0.98039 0.78824 0.78824 0.78824 0.98431 0.79059 0.79059 0.79059 0.98824 0.79294 0.79294 0.79294 0.99216 0.79529 0.79529 0.79529 0.99608 0.79765 0.79765 0.79765 1.00000 0.80000 0.80000 0.80000 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/theme/0000755000076500000000000000000013242313606016525 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/beep_boop.wav0000644000076500000000000015424412665102054021211 0ustar devwheel00000000000000RIFFWAVEfmt "VXdatax mm##))|z,,^^JJZZ#$$#33OOih  zw 8900 EF~$$  9; !wvW W . . wv 44kjww  Y Y Z\ ef BDvw VVgg ji99ll ##SSJJ k j ut pp@@* *  88]^  00ZZk k HH551 0 ZYR Q KM33\\L M LL&&9 8 46]]c e EDFF  IH69 { y    ?>  Z \ HFgh67 UU(+uq./ QQSQ igKL `b ''utc d   rr~}GH ``9 9 G J a`25 )*   nn\^ NN cc st\] r s     GFHI; ; D C ./ IJ \\nn  n m 01 ^] VUYX ,)TK?< DBq"@G BLiQ5A a z K!+  wh 7>& C$ ( vBg~LT l ;R23nI . A!,c< F =3Kk"V` + 6v_NV  f99ar - &3V  JJx=| 7 | @ S~Bn H 9&G ~  =`4" Z -bObD X OmP h D] ^ S A(_.* D & VPF A:+. ' k % OW #Q  X /3 iU  ^ "UL  %"< Nj@  $ ?w;6 D J : [I |Y`  V  *w4Aw F%vz s V Ggal f|k'M gh&_m Q9`]9$ | I'8 ?=\s5 zq n *8R(| d y"YL \ %UHAk) 0 L*VM) G `fP5!7; V m$ eh ! 61O:-a s    CIj j A c ';fRe }h}u v w 2O7 ~ m!Qcn  U,0 } tIC9 1 ', w &tmj W n #H+* } |B h 2z HA *| 8 2CH  * xXcNM  <5SX.M ~ A^1 Y > lVc!P k z mlE -1kQw } |20ISC w r^$' @ % dD< F m& _ ~ ?*!  >lq  v FDE3 `H 0 p i ?4*rB CX/ } h& vZ  (Ge @%kgw  f0m  L\m-'` ^ mw C D<  f U Ea 1DXtw< F  vu ujK" ! * {k bZ m C+:t_ V  |-?Ya 2  qeW '9{_ r"d pf,I   MG 3z& { V H F ~ 1C`j E p u@ +@p  $ u(V? 5~Cg$ BwJ  +w n `  )3nBcad & Z  &LEi`  W"  ` uK\2 *9  .s g n q:  LON5 [ x kE   ^ 1 Vra (8gW,Mz e" @ de>;  k F%i   [*u8} \  0- 2  ]Q , GR9~S* @ 6 >`6 P]M e Q? 85 ne=^N 7b.  SG, = k +  JVa$ ]?zM 0 Rd $ !WK , " f 0` i)= iH$ ( 9_`t Z  IT # gd^  Y av'Q[ %  |{ <5 8 ( IXn  &Yp 8 Q}Om ` C M ?:b R V!j 0 g ?m: r bSpi   36|P 8EAs  Y is+L (H\ !I LNS7 y :y  I4=] h@A G  qQj$ &wn q , Em2 nL}~l6 . C|  B 7 :nY E M  |4I o a|ldze e 0Xsv p = Z\-kZ c p o  /'AqD 9 ) ]sZ+  p "  [  V,j3 + ) U W> @ .dAg}!> x lO X Xi ! X+g6] m 'BTv r @j ]@g@ F 4m=q j j r ~ $*\"?wk %X . ! r+o |5P Y _zu b KHc Hd<>.Dl V 5nt N  U N Fvz c ,J$<c" T *z}Q vo% X Z4z\ & 6D&#=~ C ^hT5 Q a ) DaKGrq / ]  F 6 a>x( T Of@$-n  z Xl;&x l qZ 2^7I, + !z  ]Og Kp55V C B ;ozFZ    E w x yN Tq_\c  E pO9 3@_ x y ; ) h 6eGU2C } x k U.{ WO - '(r  AA{K ;I?t *; /1BP7g T@  : Pg' 1q|=e b @ o r fI)  [ (rYWvW u %"_~ e 4# _ b)sq`1 w r N fUaQc .o99o_e D E / & j\yJ 8 2  dP9) H 1n@' s U 5cu b KDEK  1<T n 7  PSG  o 3.{13 SnA\K-M!  # 1Z=P2 ]A. R  FI ?k j ) p JV77N] x E N:> y ;%" ; h M1LJ j g Y  ` :E 3  L&yl\ X ?9 q > =8  7 zwp & ^  `h  01%* v  <<$9ka Fq!> . K u_ G w| 7Q.`| D 6A1 r xNP Ty I"[/ t *K9 gL; `   a;% 2| C E \ l' NtOJ  w &8XU# s)(r v?=  (z% " j ! g,yYw l  n ^:2} 9 _ F Q$ : $ IvAm k q "+g ? j@c" ] U] &  } &  rg 4 90e e>Si & 5Ht {0m W Edziu I O4, x <xL7kQ G[ >/ e $ |P   T3D \7CF f #  0 6{sxZ N ` Z +7Q  Ok / rDBv c">6  )`&  SZs, $ 5vOE & 0ZWi A l 6r + =] x \) - fD$Z W b>q/ 4 M9 \6# '  U*Ke 8 D> K &zpx 2 k,- 7 u 8  & Bv"/o V 0jqg " X 7* T p <=Oi ! C#(   )v- $ 0v  y&xULtB=oO yDn.8bKa8\16OBbP+QP=I@8E!Qt mHD@C;N MP=c@/I"KKO#"z2%g0$ );khSi@< n ]>6>kt[C[@I4~Vpo"(i5( Xu2 s%9k |}G#*>tT 3.[^0/{f;D5j8dVt5~X|!6eztsZ]:F3(%;ug2b=|cBfh"]ZJ Qr!=npEEYAJFP  6EN !,<8k\2"mX{F(_I>J)EKLKA9c^< A$ { / 737E$% fCTg8/,NV,"<PW  FF|NOgWM-@ N}#r5z8gni$3[GcEx6^i A{m!{cQm2=MF-yiyzyiM3zA7mWkN8^"(|)L)-2F/`*?hSc3sc wZ^RSeo$)[`{ KR\$y|`Ctf0ww%~qZL=%y49Y]s7G H&_D]UX}2G&-*4~/@ sMID}id#~& wjWb$-w;\W?VSY?lT2no|`l9id~y#ye8e\DlIX@K[o>\u:dJ>GT_s{}S2DJ&U6{`.7d]DsD2)*IX#yS,{gx  +\?eWX=~dIM7J[}>,x$,qB3G4t Q^EX +'/u)@>.wC/:aSE^K:M}I:#QtbJV2D*j!CI0GDN6>E< P0]xLUzc[]YjeD2(wll)'4.-R22H3 ZWcU.W;0g;1uo~0?Q}W9xH M@JqQ[X0Rh(|UgM s4m .I^p. x0`6>_Km9 .lYR,XEls_HEO`:IAF)25ee a/0 6}<KoXvs&}`)f]'r(fe!&ccN+Pr:Q1 qaC12pVwuxse1MS% F+Uf_'Z/VgqagFGQ0G\0;b\wY7 Hr&5$Yql$ip~qed)oThhA=a<{j8E$>j/'wx= p5W>?Dq~ptpyKBq\G%FFv?r]Z ]CoyK?d7MS0a$c bvzBYLW1 xd;u%b'RF}mi#_wu(F]ShvRTQ|p((ezyI3R/@iY>kf)"N~pCB,%iURMsU@K9\Lj;.o'/&S]D:%UW>|":7q#AW,l/UJWd r(A|eJ1h_? Zx4lSU2' T9e/>0WU6NA8x>YU.jFYBV%4ig;_h1@;zrwiG3f`;m9R*d=P ^N t ]"7% <"R'Q#sjlIi0~;- Y{ H#%KW=?ACD)!~Ut|=$uC)TG]WY=W/M!H8_~okzO b.4$%h OgLt4$6\cyrJ`h>;g*? U/V>kW1t=U~ @&dE Wbvd.vS7 4cM{ envh\0fj 98,G42(>Yytc4d7,+G a]Yl1rg/E45M\SW]?E}O6a>a- h!:7 =E(TV4xV=r"|"D6JK?- [Aido*D0-W%Rs ^x+)?3ftvp(wEMqC,&AeP*07S,vH4a/_o\9a*F su:M4OGMztzp6# }T.qQ 5u"V^i R3.cLp ?_9]=XOhkc<DBa8S/}@j1k\FyYX c+kbJtoYsK}lwk-3PUHODz#D0Yp@!CkC8j{UO,'lbLaX5"4mROPoD-FX?ju8)\E.:R"x].-PPDJDG L=O[D;nKDj|FG y2p^2FitcT895L_Y_~sa rkG K`P<xD+CYEnLng8 }1}f,x 't:sKQR(Iq53|9zHM@K+*e GALrdwiuCV' o?#FJ]lv $4v458u**@H3;sj|_gg=ug[a4&- m dU5})-]8Q  1'pH}n>)Yd;~ '| F(.gB_@Em 2?a "]9dedelc61Uc*9 S&D :c[f"!dt^\H@_@i:'rn10/ yLVc[&FRE]*X MB=$k?M|g5IWX l}PtbF"cg DP\b KR[(?vLkHLG i2mmSX$ f'FZT Cq /JJK b 96_in^;hY<\2( 2H "t'c"Jn{B8MQ-?\*N>Px9vMDK4OGMVl&'.v6<0BUa:;/G,zAz:NFm[6t},7/ _'"1_#"hr}2d5=+&Z . gsK Q+!-)Ta'MJ(j`d 0|hP59wh|@ 1tepd%#xh;,H|i|3],+[&q}{thq/-4n_nphx\H R.HXH'+PrY]#?H[o wI r_X>Ox `O"Si)O20Q,0G@w[llyE;Fq@\|yY g1wNEkjGiNnJ8vwjlubl2|[@Xrb69_Kj*G1 -?j~k>R7QH?uHhdL U1PQYjRo{cZdEN58LooqgGJI8cpHYW9]|Zk_o?DJ-hF*_K7o.dT_TyX`0n,lM]&X)v %0{#s_ .epNn)zw^*{!SpAUsYEvhJn>UI3qp>fFS>7,{[oVz:.QAj^NM0oMj r2xFFT } GHc%c?t:  veB t0^m jd<QS`qxD(a5Xr, 'p[u}NzTy_S!Ra)Nr$RPpu^F <Qvv&e^d4-b+pvor/72G!v7:RQlI0fM+Tm\;Q#[y4lr}6br+)cNP@*qr2/sge|e?Y0rRqBhen>M,,j=T'Sxabtmu@;7Qc&N3{sxl*ZB7U[d%bR$ W@%\,B o ?9+~ qOd9.f"t\drWUVr|h) zy.4dtVOy^z|W.fLnv1V-N^tNP/ B_y?\u89[0='*l1V2)Tccj1)BBq zL<OTW?%#~Pv9BB*8LZ3` :N0E:aX\C!Oq aL}Ra-lvv#GtuYMp-ocAjka iW`sR`ecm"  [9Oq4e;Hb59BxmV`z*"IMtO}"+HLi<7er*MA~O-OGko5gTp]3 I\T G\Z5 V0iWyz1Kw;[V jVJM@cRHrQ`2iTsIkV_c=Y `uv!sP< F)kBYP6(Woyimcsm /\0 pHwKpIH:eLI_a(_RWURqH`LO[? :uBf>_2Ek;8Esl}{mnf+m1aCfGr OGz=LBGIc'ZQAQSwr1\EiV7.LW)[CG]13Gwtzvxl^8jFhC{P~%TW{0eZD"pNLfkEhkxv5FI_tDw>Uo3 M7U/ v:-3rs^^v)u]Rzt % TaTLu(SPXvAX/hVy5!WGkj(lRoQ;;S\*5S B-#b3QF uXyuwl\d-n>uOy%VUx>dY6'nN_IZME]m?Q5kR,*CS.a;M`8/Esz||`dw7p']^el @_lRT{!u[H kgO^Xos:_Qf]6EN`2'U 88%l;G<r]f`ks]Du "JhIK:cPCwT`QTHCUq5Y3hJ7$N_0)V>>% i7;=smf`r1r'\[izGjeOD1wSF ]kE S`t1ZCeU?;Wf+'N B8,i/E9y_{Yh|k f[xq! ^h [Yp,YYD"o@]PQ:#=Hj/k;l=5*K[09]:-e:JHpbwzohj .e. jS{fLm*cR1;wRMMfI Jct8O;dW99N_-U?J$e34Cyt|uK o0hkkn muVey&ZRC$uJWWUG$JAlv=tVbJ2,L@Y83c50c<MM$n\ryZ ix#ggXu ]H_F\C-Ys 0AQ/*A@m5Z:7-H\1(\?B`02D~z~qSr Bo"`sj Iz ZH4:}UN RbLNQvo=hOjS*"LBM|(&cD<T0CK(yewoJr&i ferf}Acy&eF.8~aU FZV AIzmEn LnI 'FBG.` L5Q'GB*akIs&&s Zjv p:j8mI&x1|ej 7D[/+:mHz Ao6 *;CJ D!~Y,}2a>MiB L_{W6fyG!*"B_ZH7,]z/kzk{yz8$iA[K!x=uzfFVx}kxr5c)W_(L Q *Fk3&f;3Kl 2{Ncj<)kg(dE]v#WZC ~EBg"-wc*kKgte`L{7Uh-vV>h4gm!^JQ|2OY5|R6d4skfN]u!^bA w@Mk&o\6h;]o^OEy>IY(xZ2`:nn`UVw+Ve7uICl/ka+gEXr% XV;yGC^$sa)`Ber [XMx5Mg-!sR7j9fg cMOt-U[2wM<a,ng!\I\s#TY@vACe*o[-gA]m_VEw=M^&v[3a7kq [NS}3J`1{T7i 8ro !eM\1zX[> UzA_&p&\<i$ {SOLK|D[$ i2_8ox^IUFsQU0 fz=Z#|&yW9b6 qNK?Zz=Yw.~Z5f-vWFDQwNPp>Tm &zT2MA|LB)_?Nmt/V)Q}5V@2yTPOog?XZu#+Y6@xBRM"s[C[em0`9Ow/`P5vLR]lb>`.[o \FAs;OX#oW;b1bf #eKKl*\_3 kBJm(`S.mGQ] ``9b0Kr /_H-vSUX llGa$Ty11c:3{O[LlhLXUw80_03|S^H qoTZ^~C.e+=,MjFwid^a~R$p&@9KwKyjshe}a$}&~|IGGL{z&fmnzl(qSL9Rq0}!Zw|mqt *jUzM1Yh5~ Owrsgy/__uR `_Fz"=s'lvU~+`kgWZ`Up&%}v8yp@x%igRSRiZa)twE{c*},j_>\HfWI8kqIT  7rX*h9!hX=BblTLJnVt29_['T^'^X7)nQuFDdOfI/^R(<sdP~;wIgIy7?YSV_.[W/*lVrAL_O iL=ZW!?q+cU~3xShCz1I`O SW:fU#*t'xT5}LvDb6>sNAS,{P+oM@o~B}JW80yP&8XJ8{p@D h%-tJ'QLmH;-pp=F-mJ'n:bH8Kaf?E v-qK"(^I8`TZDJ5 yg5wT&}bU?s@ZOTJ k_?a*t"kcMz2_ZeR]cFr$9~w'wvX} ihq[IjM}4:jv(y[sht`?kO9>izq- f{ j~m@r_dD=lgf>jk ~dr ?iZpG>l^^Fn`td}u4dZ|V9aUYS'h\jiu(jS|e1\\NP6`b\"hqozPr(Q^IbFPZQ9lth ~i P ClFjW;tgJCz#cn_\,w}Inp/WoEGGUtOro^Vd{!0EBun@_@gARHcPZ cH6Y+A=Pc:o=yA/?PX,>$n@3}!Y9$L#DjZK:~;ln:}8 JUe=T6U>eXG>9 jo9 z 6KW mC }U>MFi^K?=!dr@x-%QT')r? &v\:!D$Id +eN )$EG#U+ nQ#/ge +%*["`*T]4(tm}$#il'<dC%ek !~vu )mP Pp' m r|!Q: .%zS *jf0Vr%09%tE.0k](7Zo<?'u@ <4n]4=\ p)D>uCB.p[<;ak/EJu5!J,/tTE Cji6OY x)"O@5~K GExg6Kj {HM4@}@(A_1GpuIT07 ?/BzV2Djk HO1r.@.AmJ3 K`]!LH1f% I/Ce<=OZO,TJ/XR4I]/G YY>3 bP6MbEPUZ7dZ*K(r\193yYPJrRmX cJc* vG<jR7r"%msO{~ {jdk^\xI!f6GrBo)~_mfov@e<Yh3m|9Ttowk3hIb{[$mGvE}%t|b#oSkvLn,Ql<{}/{\s bst? m;]c1wz<|T~yf|p2r@jY%vvLtKs(in%|{J}Fq&`{]Bj:gmgq Oq/s0knH4iHd]]mTh{~z<vl7%iWgNMg0X\t q|C_&g*d^>H_;VLofGV {d4uZ-9XQW?fZ#MN li;W#*W&aX9WV 3PI~dq@T~[*oR2GWELCn]@Jqe0M$3VZI5]Z*?Ajo2H_!hH-IZ@D9rc7Axh)wE$6^OG4ab">Cwt1}L$i"WK1Lk .HApx<|Iu)`N,<p:J=aw<Jy~*cM,1w?I?S}<|Gk*dK|'#DH~:G#?vEb0cIs"IKz4<(Bt?Z8fGk'MIv'.2Ds6L<h>_.TBl#;Bo+;?h2U5Z;b)E<g,(<d%F 7Z0W/I9a !!08c<6Z(M.M4X$84\+4Y%?+O-O!>.U).V1'N*BA,K.+M$%H%5>*?2*E!$D&)>)64(<&%>#<'+5'5'";"9&%2'/#$6"5%%1(/&"5!6'# 0*. $'3 "2&#.*-#,0)/&"!)-) 2. 0-&+)/&#!5*5+#3&-"+3% :%5 ) ,.! "0. '   # !                                                                                        ! !# ""% $ ! $  "  "     $ !  ! !   #  # "% &  $ # && ## &'# !  % % " ! #!                                                                                                                                                                                                                                                                     DisplayCAL-3.5.0.0/DisplayCAL/theme/checkerboard-10x10x2-333-444.png0000644000076500000000000000021012665102054023501 0ustar devwheel00000000000000PNG  IHDRW?tEXtSoftwareAdobe ImageReadyqe<PLTE333@@@թڀIDATxb`҂AlnH0T>.Cynk? y7 \/o`.T4HiJ,ȱ bfJbxLmy+Ud؟:]WC@G7 >=\Q`>~~ЅK*a( vJX ŠAAt&. 2R@v鸿G'oޟqt{~x'm(-*ݍ H*KN?~0m]̤qM+`Rl3zhnDi>lq plbi6X@RyfLL%a`|mztW=GMQwq%sB̛Tέ o΋k蝞XW'd*>7SL3V#M'kTZ]TԈP^!zC+򙛰㮅8jzt ISj2\dN̴HSOQ'ց x|~`{@-f>܉Ӎ6#Lf+CQ9dۍHZZP>q'vhk;qǃ1 bJK3B 堉v‘WvH@ ms82;x?Yr0OnCDiI`s9cS^}. iԦGG'D^]M/gؽ XAs$<Tob恴.7B9X鈛9Z@A@' xdQx3c!CKG_Q3j}jߊJtu!,݂xGc2 YKctS}+ɸ.AϟVt64Kh;j>fn`Mmf7[i^-b;{;%1b^Sa 2y^t<X!;Ť33b#xo;4)KtR?;(""/P6EtXZD.Wф XilH;wnW>3\m'nii<!uP1EWz 5%LZI.#MvB:TnrV5V=|G'OfAqm7:::ޖNd"lfqm5Jl" 6\^5OIDz,bb͓L04}ƯX9%+Vb;^<.8pD3`Igr]_?¿\2𴋍.v*uĺWNOcn dTdnF dA@ak?; P(_lg3Ʈ.i#FL5BqOvšm1%a-!$ѐ@j~ fzp2{~ ó_ڌ( "eXMd_d7pxcSN4`FG0hQ7kJmX}G0xzڎ,$,lꊝ=ՃBi,z$ZhA;Ɩ˰i'k\GU~Vt\` t:&BpW88k |~KMJv*iB ;.Rt+k)&uW; >~fzI13KXdIX&R-e!4Q|":nuͶ{v_~ꫠ40k~ X)vy%LYKv葾2w:'Z3Jj8 {J|Cgק1 'hHq3GR8+cg&M7`R <&ZlڀW.īg`ѩ3ve@ . Vxر)e2GiQ SS0iCtŢ9012sJ`X͚bWAOlTD4{%9̏prBr;D‰P\텳^6mp^BG9$#7tZ:GưBI{[ 7~ǥ/*C)4Jk3q?sጭ9{ry B }vm+_hzm 3<s:l8=z?Y Ol3Vc6j?,yIChLt(.\ń mey H4*HBIs\M6ɱ0U8|c]vږ׌>pZ'+#J 3phf% ^}'5\wE@ pN_ky*z,ڗA v}wޅ1(6gYn,ᢕr.!kz$"fkMM~nvig CqV>6nGck:]??,6_"hf-.牛WnϬ}\{Zaj-r_<WkLQS٨\8H6cHfѤ(iLbj3)mnK^c3XroЄˏi. $h^و0b04 x)+khvR4_'Wծ ݐR ߪ/nb0]NhGrkډ &jVl茵 @pI祐jmp`V5nh.[ FXkDs0h" @> s) Nu] 2?)#>@m(N{j#a\~Kj5*b8J:-p6NJ2a+ga`+^ߠb`[Γ!I;׻<`H\Aiji9;[ &(i\nii.5P >B7jh}l?ed\&E̷j^ R6Oٳ֭/BlΔ]~6jTok YS;Tε@ G3$mJ)LVrS v')>z€4/b)نf-}vWztvll ̷z(TEYF\(حMK"e'טfj(Jg)7p/هOaz9o ̭U AL*3PNw֢ Myn @$}- i"fE1Vff u+^Hp{UH<'/uc*pd9$@M!mʭ&H|"Rl٨36? D`vG p_|Wm< ` ItH˰ ̘jhuoғ'a{_jh9޳ pHSZ}e?)lp **CYt J_J 2Z?z\n̘GSwY,< ,<cJ٨sF*``jP6CZqe)h5UN7P"Oo8{p"Lc^|2Z/J^~ c3Mb:IYY%-5׍*(;b,i\&X:0i"]C8VYתskIIk5<u[븎z1},+LkϠuhz<p&<)u~5]f>ⳛ0x,dLkA4Y /wy5m;L"yoa?e%~mG̗B5c"kM2J3Ssʹ/cmrشb=ya#ݍ6\Z>n6 $ "ޢvK-3U`3Վ[K Lf#Kߍ+ھ9)̌ >q+?RczXϯ)$2ecpr;!`+nB,X,S Ck锥pk|><2տ8LJon+%( &q0 6"9@pJHTZ`jǯ&&|R^Y5HLRd|afZZ1\u@g :LM dcgjyR!*NO٩%6ݏS+, 'ԋGʒ11ҒW-ΔIYiɭ0*)#e23TK.̓ǧzv1i}_$/矄ZؑݶzV>Z)C`:AΤkRP H*'U+8"ӦJT"*? ݿEcʓ.)\]iF|eFOW535^*k &5zepSEzRKv~,}/ޯ`FX~ֽ 4aV v(f0ƾ#MbBԷCgh.`zY~s+<0a(3bv"݀6CR9*D"x/>w?0e{J4vj{eP_Ι*Vx|F|lsHn;~׬7JNtLV \x6L ݨ.|/,ƎٷtY /۳Bo[9a'4L'#=̀G@>38*,/>~0>x7 ӧɭ%.w/)hْ}c' וw69c?*;n?ܑ̜\HGlL . R8 %u])= 0e Aģdv|0uvScWt(L}F ('Yr*n8wOA ;L2Opuu uvZJ>fR`=N6(`( EtK>t]<%,nӟ{.5QČ(vV*𖋝>@)SbE1qmimY[zVo50f[ zzYoVj`[[ zVoVmn+Xz'܃I=9Q 4FpȯL~|Y3sWvj{ 0d?Lȯ׏w;֗f>sOY/mur\/V5m̄4M~vx! .)֌.C'ZQo䗫N,$!J \4U)y~,2͌<@MG*˲?Exa;um'-vΛ^:䭁m-y6!#yax!/fϘU!5 L2kr@,#@:59^F'Y .ƹbFuyȺ.dFcL|䜜($!Ka_>OK?Ϣ]^:嗗4h+o̜e9|xs$:'öƿϪKk}٭x4I <4 Ȇ\D|4Jl Jh|]wng܎YC,.ě.]uqXg0drIZ#&C`&~G>3贈̷ pYp+ѿЩ @|$4hS_R0I\ g}X$>/w?l[ F eɒG`u{M;lXL~aβ%tk*|ʆ$uKtޟ=ѯ=~1̑a;"~@B4P^MI\.T>/5|̯mp:knyXzm:Ē(0 sMMXKZQHq\:EvY`_%پn;}mvۅYyx siSXdO9פ 2 ,zi@kS}@˗G[ sMxw>Wo~Ke9x6ℿc`f5:f<~fgTT_IF{ f3gB/j_[3SQwMite8ъ@@N,r̔أ _CB-p @kSk`.|zY$d`PtߧrnG76Wƥ.,)}؅m _sE'ލ8^ 9T9[xD,y0rMxƹ!ZXF^\IѩM5sIw~>x3}5c.v >'OQU11e(J-_v@ɘiwk~+cj0dX˄K:r䃟/f7?4N6aWšs`sЃb* A\~OF3F v2 ?>֕҂C<0#`bT 6☿9d5QIM~IFtF'hi2S2Tdܒe~`K<>8x+q7\07zJ`M AiA&tQf(ԕM4fvSJhQ \@*HQÜSrJo n`J(H΂09exΆ1;#+DosfkBC%g#k;P+BkVG:P/`Ǜa8kjƜ7P~ g5ϙNɘtn) m^M)'cjrL.dJ& A2Μ9_c>s.rQ(VBAH_d/#Ķ=eA#(t,yWBa9_l~iQONoRs2k6 $Q/W _# fddxBi\Θl\;0Zd:zc,: @DX$Cs>1BW1uYq e-F~ K%w -])<( sKD0Do;TMK:70տBZ|KGaEx8l;k/%uv͘%> kΒ:"x>&+tqmHwPEbuzH .h:sˈL!B~i9> g$k!0q|pϥşۛˏǺY,̆͜U[$l&¦#dySm,ֹ^X*Y: U>K{N+j`& g_id 2e$:BD mx-.T)5"K)aP`AYPkm|L k Kkג&|⤧1EcFdMiŞͰ|qINbFGyNjVRm$ϵ8[kuNXt@b7]"y2~9.nA\0DI""3Ah*Z&Pa)o;Ba5ŜSrnFuZ׍h/vI0qc, 9 AM.J=0(<3trvaLY=i)*5ǐ̸/`VK&YjX_{: w\:Dkg_x"} K7tv;Lz}\ U9]r,h$H^KҜelx|ocvr~Rҍ?8b  ;4I'+ƅ4A 6A-jF!Ǣb$YрZ=Y8-vQsQ }qOs2f\YBYWӐ J@y~~?.}<3v?7Ry$<6}w&sșrGqgh 5LsǑcnǪM&9T*mӯc<{̟m#g)%4#5s3#3uCl|J摙<ׇ/벴 ViGrnU1v 4G6T;ܦC]nځ4^)̱ I'o~: )D3J̆Eg䆩A~?{c'_hQB5zzF&2KWi.[B1y@ 'EfP55" C!,ASAK6r5Q.k?W^C͸<=.}k,a2J(BƼVjܥ.5lˇP6|g|` E0)J' `ߊug[y;a70+4}ވ]!c$^(#œ;rkf bmD5EkkB.v $RNH|~aFq6W,+3m(JmCXz .* ~YD- bo,"N<Hwۀ ដo.MkZ2Z7O+'<{Wg knc(e'7m<w"KSœ=N}˘dlGr%mf^.!ꡑXP]60jdۗ->Ծ=5q8{c+\I/թ&J-"O SˤXbN xt ~Bolq"A l%B`%۠X`CPfY"=ֺCXoU&Ǽ_yVGb Td1'M3SOqWfB)\In5^'|ǎV~J;B5TR='Seݝ߿Z60d97ӉT ]96ٸ9IBb(4sR9f̖ai$`ðT-KFq6`Cr]֙b`[:Me*xѬ<OyCLrE!1#[3/ A-mX2fCKtTc {,1jg[.83g+i)܁VrΔR;qfMð) kSry qI) K&s;C9C:"t 5x۝p[|y6RWCo,\> aLhHH}V#xVc̔^YY(֤?,) :kP.UuK$ضŚg[.9lsV~bKI tS$rB,hs\z> A[5A̅њ# s"[YzY&(]lTV0Sj+VDFlX;:s eh2T)[ 9ѮYyYrm&2kJOFR AUK~s)8~4b"[ڀ  0k#_ m5 ocQxO̖< б99]ToTG PQA:(F-RNJkDϦ# k 52nJU%rGj+ۆI \1_]jQ%넓SHW:D̠[Ï@MO|cA]l*ks,2M=\h ;P"%.O`[( 7 /A3&eYE e8AƌD)[_*8;cBں\tNr28/ iv`%ǘ蹨FT8[l)qal‡4V>MLM3$3QifXD:A =dh ˎ9V="D`IrI<7;[" DY _}&?[O,)`l Q^NIig\4K8~Ax0a*| `3RGL8`Pǀsԙï/`K( 6)JO_r3!29Bߴ%{5c%7w =>ִ2 o0<TX) C~NH< CZ ^ıoZd3c/i kBd$7ڿ :K:' vB]]ߔ}b,²5KG],ZՃgEiɔKL8_0sF%:B}"{1,X 8Fx+b((E aCT?6NgJ ru AH .%B[>ZpWn=oCR)g 6?Uy<lJ(ҐtS4Ƈ:˝Q[V.jJ,R@< 땫OŻNo.:c3zHu}u"s'd2Is4B!jN0L`9m͒}bI9 ow@hvIuJ-cfZR᫋ 4_tPc-QP [^z-Prs bO1$sV) *6_Pa9*{^BϋgAgq}dHo|l{<QQ0t, *3`\24]J9K0Ěa1,gLa5B9V9k5+<ΈZBCet܊YRIEEĸYFh FN&< ,o>;Jpy$k ~ae}]h9+HeUGY) Q$y2H QrP"l CX$1N D>\,4[rΟ; a;!D9ؑ9s#X;5"IlݯL8[5t@R75{VaC$cVri\;PKYeD߳e̕hJ;D˂y^K1!LPѐc"#3 #N˜wI.,Cb|6f5)&hrZp\hl_n !b#BK-HF!+Κ9 ҥ#dOM͇^. G!# S. UNWTi;g]C'.s8Yl";⥕0%, L<AcbgΊF*Y:)mlD0H?eLD9b K%@N!X@X)IB+ ul";f8L qr8&F!p(EP6Y:XŃ) #Q>P"n H.len'kʒGkȚ/O]fQBc".wfQޓzf6X1)D-S.D2R9%" +UԆZT:L^I׉wj_fI]".Әõ7RH#SUBhV= k&ؑfa }l%G"g#@fsL }c*Pƀ4eJ(@̱T6)ÚgXJE˕Æ DŽB pmM1ȁU*8qAG̱:kNW\eA$X΅˦P΂k 4kb$CrFeRbϲyf;P6U>bLnY:4͒a \1 eCLEK,5Vw1W`/I fk&=^7dIE2ΜZ@X5*|Fsu zYA:+^;E˨\njN2 !cP:I8Vȅ|*eaP{pG@lHZD cq #apY8CTu gp_2al.Fᶁ03d}32K*SzWJ*ƈ!|\0}S\yGU֜  e^([2UDjO43LRG 4s6mF{Ǻ3{43ivuĕ7kԹ}j]eiMDI q@,`I=&D#.bD.5< YCKSvyޓߠ)3gqf|W^Pe+v[m 037I0y2%I*RB s5-3K+15J3xai~.kvf~uO(IZ ž,V y<ـi.[W|jŒ1!*-rpNxFhUmNt"0su1ֲ Л/Ptxu-9;l)Y߄мs]8G:Lu Ƣ20<:ͥ+׀PR=sh$-a[ɂ<1szL\Ӂ?3䠑;x*}Fj"nr(@3j|'=Ϲrd2ty w;MƜ m(+95?TD%k 4cƍwz$E;aRaӆ!WMdZC$0vɮ3- jp8UNv ;`Gz]ΫrXRZĥMa  1ʵg8YtSŮL0ٞ U6pU+KJbv3% @ @K9 e#ʿjo}?Ѿo@ݞM!!=ʏ\SR6t T!ks): ]orMDžFF׹Dؚ̈́m{@f6fvLylr{r>o<(ټ29(Y]?ǥY cbEE~%˜@,Kgc"}) SX';p2ѽn1xvFT PeBP}Ώ rOu$CXU% @ڌdRgBz sr}`X$g0t W]1$sСkO႐ץ昮dbN#QVMbjv P4>P}#A>G!x凵;"6"gj_&}*s&CP,Kr*-%Z^4-9lj[H_^#LH _{}'?BTG)]]>:9dVv2P֕gʔ`V\ Ha.uvY+j.#]v/9,gډ|}F}?r8Z:/5#0ϥA|M궍_Y]lpa^?&|/o C{GJ(IG'/&?MQ)y;Z1ܱe.ioܽ]cֶA`CC d{J$AHZ-q:/.`KZG*=Ͽ̯”N \S[:0-~6aCt(CԪ]PTX$(T߮ #nb1ѡ~:Z&V{\3%˰V'4An7Al:N;sÿᗍ+׆fULdNI,a%Hd\)%܁0D>|!T(M,+*D%#9@\K#%b}u`NX#/*TY(P&Epz=+Nv8!%#_9a$|T %T5j6 ҪamM,"q-;R{`w@TB )iS?M2M^(sM'?/|lIey’ITdMWClX1#jm穅pUN*V&Nv4hN~**/r0؟TfmDUvE%RTvRjn;i:+"K=#"׌R +q):) BU% RկO,0q_: ^/^"ݏ?]gֶgk<\%? (&rPi?YET_r J4 SK盎o:G,pkBPV u4!ʦB[^^=s֜g wn٪<[QqzkR0c6!{'|Ģ3:5^T\HǨ Ř'bQi(7"|U_joXB{800*0 SVMs-(Xa_6doF`48)x9NvpR%4#plÒr%'J1^zAO\km:A*r (\%zjj2S| غcwK.QJ鄧5: т{ed&$|Q*}Di-3x-|VijDz! = o 8~FiFEȰ6ߟ޹GK1[ `J$i #I 'K8Đ..eK(l LdzcD Y狍?SOd(saSR.t%T6 \3A aJkugCZe3 SXcph]F0MO2>d=9?E F[dkYp&K.hV919]M2~HB%19Bqd눼S aPGO6ioe7=VGBҌH kFMڥO$ ֻ61ȥ`۔CZ-/o"acK ?P-xGbT~ϊLqӥ71[=xi29"WȈAlRɜq 05@/ټR$&;5P y⬾lmd`ɴc l!^Ϣ&rC?Gz S%LaL[#݇ ᯷n|1 qVR#'o[ump?'^q!q9Úµb^)vB%VZ$c]1;ߖt;`0tF7˟PC&7RrIQw5a3C .:&upӟ)dh'Qk{d7 Θ=]Ջg&PbHaĞ![z'q<F Q}4lIdȖ`IQ-) YRfM3< wO_uY g=MqW4rR]5}ߦhfl}T@dJ ?ΩKRȖ&oX+"dЬr x}fn _n݋vNp$6`=v.k9/"Q]W:}[jB8m`/kQ\9FòmBVpY}$bJ\+fؾo3O70Ĵs ஞ }TICrB`G,: I0c42UWN- "b 1)tZ"-6S9rFB91[xɺF7{م1Kr8-XÐÆ`KkdGt9jN8R(ɢV~+,{1/ =j^Ƙm~g^ك aN-CM@XRc@/QY A(^sѰe3[rLO7!(`:ss|'Md|`O,ySK?6dJ6Դ>s -+m0=$){S~O(4fطlڮ{ nyt.dЎYexC = 8dRK?Ta> iDMuVeC[ ) .дN׽n㤉E؞؃V&FP!&:b.h pL?YP .ƤKX2؃ 8++S$k BNǜ_ 5,+(\xȿm] ?%Y#2N(.@aH a^qA"]:;S y~Pdx|bbb#[7߂}mǹ(:yl1 /K9,', k O1&ɠgf3_Ʊ)L54 TbMZiT S}Ǎ'x`!߁ߊŠTǙЧ:#agJK8~5s(5pKrP̐(@NMb@>TDrM z~-灉(0[o7؊w}-"՟=!8u1.LvPjm Pif.Zj ;c8z6IDM/$l{6aIµpBYSrJ`kU1DXk"LZ&BTSCfvLpQ#~ l8DH6n%~~sS/_R9|cR9TIEŕS`9pjHeV"$+ip<e?|dVɆ깟a o:~l;n#eCBRMLIdU_BV,_fa,z\}"aB,zr 69g)KVë߉MY-7ۇ8pY<- t)tv! _BD%EG" A.I:J(A qK_ҡlQoX.tUoJ"LI:!IhJUd~40ß!ma~R,8 oɶᡉ_}K?,9 a)c ~Q) >vP9B$:zFY&Թ81oG<6y{p8`N!:v;iyT@L@Qe(0z ^F $, Y0Poih8ؓ\;m{xpEw0[F߉OVliJ:}%ܺ?֤YiBZW2$WNa@H%[n.*|q@3bO"̐ȊMW"t')A( A&l?M]+.;\}odh!c~)}l>YBהGxU*d@.4DSnW|p>{`ߋWJYHk_kkxm]Q&K$F{2T15ɜ3T)A?3᫇9,9w:N:h: `sL=qﳤ6LG2e򇩐RmˀSSJ&I.S<č=?^fk; Qc-؊v$G 0;y19z=\  !zd K1i*e\+ŖwكC:r$G0|Ƨ6z5e&xy!)T#UJ51%NGPfA\sݿj7}G9zDsqub^Ō^K@ØdNYcF Saݲl8+1{:Y$`cC6Զiz33ǍD@O#kq]}dߌ]qI3A hrI#.xDp'Acr,ɉDnGYWS[xv#Wm{19Rlْ-U,JZ}nOS'g[ J%<ݜE_=ɩwFnJ%Ů"dGT9oE!t ~k %Y=Tl˨[&k%s̈bk/=SnO볨mk0U|t/l4Г`̪%s)hCZEhILk[볠.8 ଁvhNXcsf> 0`kY'%} k]=gů4p볮D]ZspzN‰&V0uKmI=@ns ޓv?c&pnf e{é=8-)}xF?˯ǚC#Q`L 2 i1 w{;Aܾ9pSm8OyrΨ'{z0^ί0'=͸-U=W7d h89&rە~2dG~{[~h~/ܝW2F zzKoY[zVo50f[ zzYoVj`[[ zVoVmn_quyzIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/cross-2px-12x12-fff.png0000644000076500000000000000026412665102054022410 0ustar devwheel00000000000000PNG  IHDR atEXtSoftwareAdobe ImageReadyqe<PLTEfffƆ{tRNSS*IDATxb`f&00adBFf`FF0`>.>IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/dashed-16x2-666.png0000644000076500000000000000022312665102054021476 0ustar devwheel00000000000000PNG  IHDRf3tEXtSoftwareAdobe ImageReadyqe<PLTEfffstRNS0JIDATxb`F0`@$ IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/dropdown-arrow.png0000644000076500000000000000040612665102054022220 0ustar devwheel00000000000000PNG  IHDR ڛg`tEXtSoftwareAdobe ImageReadyqe<IDATxb[`S1{3i~U ɏWn3:x)_ O>ϫ W3<#}/߿{ AL?g0 v=k[}1AV$8j&Yaa;k DVIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/dropdown-arrow@2x.png0000644000076500000000000000076612665102054022603 0ustar devwheel00000000000000PNG  IHDR"LtEXtSoftwareAdobe ImageReadyqe<IDATxڬSKKQf""ئEm"\$DڃТhղ ;{(jDR>M;s'2,+qΜ}ߝaΑ=p IQdþJ9C$ ˄_p| ɏZ:̀G)weX4E+ hjk4.2$Bd-.rMNOF.T[!-y(Wз22  $^ #HCZ[YJEn(ބj#NړPxR(;5_|QN52*Fm3l!wu|rQS8uq߮&^*ú4ŗ5Lܧ8LHs]w55]l˳aP[3yIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/engine_hum_loop.wav0000644000076500000000000222405412665102054022425 0ustar devwheel00000000000000RIFF$( WAVEfmt "VXdata( lgJ@%rwLS$0 RtP(Oz-VYRk{4w`2J3x'T?=Ru -7&KVUkddd!]]8dUV4F'%+@x8<$AbIE7Ei\i~wfx/2zVTu3+sIj b0fQ{ A"Mx%w:J1ubOYED,:<_O~f&heI =Uu zx1GJMp83V~2hfJI{s^W?X)lNR8>{/{7McxoUd"8AA-ULx @]>I)ot,`]"f+-Y`GiuAUl,8Oa TAW^AT*T/jY'f ~^|W`:;n [M#sA !:JgSgl V   +  R w|Axc|AEXqB`}A/A;]fBopta5Ep7 y3iW5k+r+t%_)_ozq_$<.[rt=tDd6e&n 2/oSRV%qCt+d=[$TPP1nI Q;p rIZE(-:IzV:uf ##xi5$CT >wJ_sSP:"tRTvii(|\8;A% Bf/Kl(><t'S7wxY mw'n2p;+_oc2m1 , L  j  % 7 D5 ~K d   % H  8 N ~TLmG#3u"|PNCO<0QCFGRK-*MHm*w0[U^;gz6a[;Q:8 ( ! ?{ A  4 Q  c k L /     !Z  +  Q       Q 0h wX'}RYwly s,U6[ f 3 ; b =     ,  M ' HX   9K  E   S 2 n  7 * >   : q  # E[ q    O ' .d yj P tI .R h w  _ u  + V z  p WY W R1 r M W=  {tVY\70n$Q6 Xw`@#|JC%'h,^ 8g,oCY;/'Fo?8T}O=(@ CxtN&- O]AJ*PGfstG 5L "CLN6Ol""Jd4e;YDn{^%a:S#6La?'C`s(\*=*9grgKK|e f{1rR9ALza5;R+>E.QMUUF_FZ7hi[mfwY6f_iju#`/V:Gq C OU8u|pMy&_q>R'%9`  |buN Vf /%m[-hs|u^G^y=\2y}1*m4/|u1MV%' 1Jq3WS1z^=kb&BDOJ/B c??p[Bb. &G7lShy~qbYV5-'^m Hr /iFUet|=s quYagHbh x0+$ g!c%@j\CT GT x'auygW/ =SF  1 Q  [5 o  V y C # \ Q < 9 * G N E o] S oV h qP G . O   kf K 84MJvJ`9;z m U ^ D + }HC L*D)rQmy 4  4  (  `r U& ^ |+g5 ~\ao@N. jCUHYSz !" #L $X!_%;"%"b&a#&#&#&o#&#l&"&!%9!$l A$l#"!Lg ,'jS'RJ09Me.5[oxoo(O8}E'r v}2; ?} P N >V   :LGrpY  "  d t( H  ^  p q (   @ FSb[_,zb0%S o@kCT r`k5Q@*. /kq!M7J'1 I| j7   4} -My!~7 |U x       q7 Co   Z e 8.    - c\"":_q%K<TCuS QK %k=3aO d%Kr;b?p%_t&]b ` 6 W ,   + Vq  $    J * 8  &   . G \ N f s  k r    A _    `X  1 1 # F y  % Q<b^`[XgUJa@sHJOW :  G } J    Kg , . m S "  uk% ~2).cfaIgO?OfktsT#THEFX~B!{ ^ 6 : X n0y-7$  ( " e v R $ % g :  b ' K m _ [    4 *^ ]f _WQ*^x =%c.m'E]3)JA;:SX( +cIGz2hq o?\noQ+n?=mN>s\STo$g E   lu    Q   7 iEEBGLacm<n Buq;[3QS!v!.<`?5/:e"0sj-_5 $z  J   q  ; svkM$r$+CUa%(}B>sHV/,w8D 6 9Ac'f\fJ$ z k_.GQM+-:?s7-,` v  X    !I  p  ] i Wv%:dOGvKk|_YY|#-Q UG2{Sq<J un  p =  i O L@ "  |   a   t Z D [ 0 H BdaW4qd*8~'9eG%d}F !H"m"X# #G#w#Y#"mS"7}! Rp)V [^Kxy  x !   RC A 3  vO7@$N@{~uAN5OHd}R;gN $)-&CKGS7btrB<e ? !M!."!";")#"Z#"h#"0#r""!"R!!~ pHh?A#Sbd z i  yf\:]~p&e^{>vzN),TF7'o@rx#+`\1t4K+ |r*CZXp(|PvEoA+/D<$|`l.,6@b`>o [>i,pW,"]B]u }] B !  b K.TCwH2^  x -r     YSY\c4yw  \@c-NmQgI=f2ut xgKUUoFrDT F P O  ! t ' L k  g | " u  _ T! bB~l,Y-a[~   x 5p Y z   *m  V <+ >rp,22sT& UY l `G J-Q'hk[ wYi}tVZ)5J{>% }~ P9fb@#b :]\Us.fslR<62sGfO%4`{ 3#R0LU{`Jav7^FKo2 1@;U#r6_afjw&.Ya{xZNlh0Em1*?S=+ i\5Z\%bhPZFdP"!o(|-;<,h DZk93Wa_8pk:A'7V[8ttE&BUR:8Y  ^   B [ l 3  ~ X  s  * , ~ D 6 / 4 K O 8a + 4 o ' d # R  Y & { P  . Q  O #  C `c u x :j K ! } `  ]l M7m=D*v>Zjk#iInyfvK#P~jL.>V6y\.P6Nun>{X45s ])}XF7:1_L\RHXSRsrCE '9Uz$m++i%dF 2QRv*   $8 k x i ! 6  W X 6 " l */Lw)c 8 ?2[eC[YkZkC   q   c J NI \   d    7 E T M a  z [^N(epix  d "dh.5u[NA=wMU5* s6)pBQ w`ZQxJAR\bq c|r]@1 )nQ@ Z,JxSJM+^{]!7(qiH3=r}k|V\jRDkCr6Ll%[F  1`g"B |c8NMWVkS6u; 64Y ai[޵ ފM"݆܌ܣە.h9 1ٟԖP~љӭ| UʺȦfDZ/UŎʅL?ʭhʉæʙ˵c 0RṫĴ̶̵̒Ŀ̎Ĵ̑Ĺ̎,ŅTŀE0ϛǟOc ,|ʹ*` Չ2R֍ΩJ^S߮ EoK]:1 O3MF^K'&z`71eRS+\05alg<& DjB pu2 a) -6#5R$XhUPy"tW]<P#L!R5>)/ |*3sMS\Zh#'>Njn|bM\8v\QPvAl '3?VH0 7~1Dk J YYD 1vT%    \5i[JZ?aYTsN 88 `o D   BAoUM. f =   L =AD[<\$\"N:x<W$ ^*%V*F T q K | A3QONK' BY~ p   /  $G   q @ 7 2 $ 2    V f  . k  B ~ -W)76 ATmutb@Ul[4RB_Bj`xH]k< ?;C;[BtWZ.߸>Ha~I67u$0ds}\o0U/51\I)7}n_}>T"pk1M12ߐfߑ!ߩ~;Zl5އݞݦe~b ی&TߴZ9~)BثS 7ئtLܰ d٩{Tcڀg۪ۘ Qݞ ާݟMނ`>%=j!ShW "4%cN)^b9IM^U[2C.`BE=w)NyJSirV&s;qe(I\C Y rl J] G  U D y   S    _  ,Z WPxL',p[*jIzJC}gWE^{<BVjb"B+-@ S / + BS S n ! m x  &g  K &* 1G "  S  hD .  ! K t f 6 # { Q < o ` C 1 $    5   _ / o - .L?V:#Z.  j <dKG} ?gh^<F}z^8&2`_n t|geC(XoZ;@jx?"<YMb, p A!,"" # D# |# ]# I# # "k L" !ze! Z CL B_<~8`2VMpB42w{.=*P N 7  h  ^ .7Sd}kRCzvHp+cUA2Ik9>%Xd:o"6OxTF=f .?}{O!,,&2'%lI.cq( =d#5Rc1oi@]5| |V'c+T| >8{*YV/,0Z$t:har_ tO7wN*8]23 Og*X=9UO_1tD$uOKuH# ".gJsAcgm%D p2]Y @,|[B|aH^w\t\@P.o ,fD:&PtSv} %Zk7Rk@ e`j  q 8     7 $ ]V  Y  j  HmpV/%mb=ff6 ; ~ o : T  + N.  I   q |5  <G;R2-HK6 %fA^zWCp>Z":eM!f[zi  0" @ z K ? z k  V  H     G  +m$DQsoxz*`KM 8K#-TZ: \1`{&T]Ti9bl[k\aju9LyxI$q 3 Qt,*LPOD2@C0FtuH,@E^tA :V=C7Fp ''D} psN:3IzBYC;@NlfTFKixswfs95&{C < WVQKNtNyp`s 1x1Op&p"G } .    6I QV/4 Y"_ TJrVT&u}P*  J 2 a  |F q ? GX0.muAdpy?gjz"2Oeu,yj!]]]ji86I}I3/R^X%rG IbjFw5]7-b) TBl<~osh5`9<`$ivIzcH_ W1V2{R[d01W?=T K 1  &  J ui } ]1  \x{p8AmjiAb}Q"Cl;@!n/#9!djw\?9mO -f#< [`/6}YpHݾ:ݏ܆ ~[ۿښ-7ژّshAu2 <ٷFsօB5*?֪ۿ֬)ܓ׳ fWݾ؊u>ܭ78|ۇגւՂՒ'ԕdӴհ 4ҎCԲ8KҤd)fӄNPؖصp٫oY ԋډӪҙHpڼ0=ГI)ٰkҡ_ӕ؅ԮUO~ٰ~Ds7]b[C&ܹ+ݎۧ1ږޝnړH =ڧQ'iڟڇa:l$ܙܧ݉np/Vޅ-v߈ߊ\ߝ4^ޖ|;ٴ٫[إݾ׳G׿Gށזޛ\s/ڿ#mܸ&YޡW_ޛzMB64} ޾3ZLޔAFߝV!&yoK'.0Lc 1RO^G-*347`"vxeiWkU9?S)[sUT9QUU\e[|x@OFa /JIhI0!(X*vJimbv%\(Or -V2V,afZ7hY x-zs( vV.b-Kc/d^tj H  c  y[  ' p      W 9   hZ   B%Oz]&`M5k@% :E_:b:):[RT]$>7)=tvR7;CaG4Qt;V$ep(JKldDT[jNB!<"g.Eg96`m41k l<]gM+*j=PB#[ A?D<F] &&;\ jMh` E M y_  h 9 :  Y   \ q m 5  x   0  J R ZDQ$pZTs=beR/=&>M)ZEr}--8R3ygxZePAFFz8`.f%fLlp;dh.PNO(zI( qR55b 7 c 0 N  )  O { a^ -   = >G 93    f9  v .   m }x1 K m   my F >\SLtp>H<-G~; _}\n9\5ln'Wx L@Hkߨak:vG*T Zww7\FU-A,^TeuGlPc|u(my8k<>l)UF=GGQ y3w&p4lSEiVv_kd`W!_1? ZBcXf|y1x^]dsvo(`K''z`xt|2.~@ lK{V ia:"g B-XE&fsHfiR=X i47r  ~ C u y e Ab"Ve1K]mm0B<3kS#ab<(%:FYmKwjv{`r1IW[  p  > g d  . &  1 R:Y!9{=Q+`l[P ?; Jj >p Dh 6Q 2 T{OE 9iipqy2tp>|K<&XpOM t0:wT6t"uBOQ6fy(g BqXPscib c J *   *   )p p< 9YA6Iw[4>;*"`YrK)F6ICVi 6 1  = ?  X' 9') / 3> J a" + S| g  a1<)t? hK+"=}'[TO1$`~7~o/m&`y)^}7)T| ;|"Ol&%mAޥfMވSJfXj@ޔ@4ߛw4s$=u-1v>uW8"l 1^W^]VB$1  x  w !      ' X  uW o a  +f a  m S> , c+ < N h |  t j On +8   l< J~;H.*WO#wN^Fu #  / _ )  C :b p L  & x B)m >g6g qJbRi5i9\ Ngq%wVmxbX`h#[9 !"#$ %!&"'$($)%u*&+P'+'#,o(n,(,),[),|),),),w)x,m)T,h)E,?)O,()J,)s,(,(,(-(p-(-(1. ).*)$/3)/@)>0o)0m)m1l) 2l)2Y)20)73(`3(N3Z( 3'2i'1&1>&0%.$-;$,|#+"*$")i!2) ( w(ql(}(M( )o~))d**6+t+++j+.+*))g'&f%#/d"e ~'-K<hS ^ > \ 8 R %  p Q   F 7 o J Ic)_Cn : ~ [ R A *j   [M uqKg\5j]bfoIq t+[x^_6 -FJg;8T9 ucV8R+4Hx1UIe   B  ER4:K" /@ a j  ` ;T1&MhH5yn$J'ZjnX)KWx5n*O a`* }{L*"f#?w_0-aR-KZ- !=es3K+L48xE+~S .SFSremBYAuE R- B9EEzCmhI -jpA9;P5Rm2z,I<)w[U0sB{bZEG6P3v_tBCI9Fbxf,I8~JM 6tx2!:Stb qul?V6Qi.u_=.IQ-;XPHCCx], ` t ? C < X p .  0b  o + 4 \ A=GA+ C  8 P (   WsRi H f :e   P   :  e F"bD1A'xO$|n"wL^RNN i)m0:sdmH!TkeEVRFOSrNH8";:{[?Fu A  ^` ( h  z 1  TMq~vg`k_8qosLeECM:@5A6 G _  p b  ^  (   \ 7 %  #  R    T   R EkWSKV*nd_4(+67zk_t8G91p=iK;4?`N |mJb 3.'J)xA^Ez>Xg{r vX%^nSIߟsF$ޓJݕ 5qޣb7}xKO YHw^BK6+!+ =bApab'C@"P>-Fpcd,bltl\MG670? i      N " c5WkwggG6ujcP )*VH|HkN ^!qg"p#h$%O&}'V(F)*' *y h+ ,!,s!-!-#"-"0. #.{#.#.x$&/$8/p%M/%O/R&=/&!/"'.z'.'5.1(-(Y-(,*),)2,*,y*+*+{+++6,y,,,,U-m----Y.-.-.-/e-%/, /e,.+t. +-H*s-),(8,?(+'&+K'* 'M*& *&)&)&)'')Z')y'n)'\)z'5)F')&(&X(%' %B'9$&##%"$ #"X!  LmHskb&B!Nn[H02qk  3P[_w;G\&jt\gB} {PIg C G  v f 9 3 HE X   @ 1 sc      e W  b    ^  %   s / t K G  ? $ M/tw-@$<y]U_B{Ki wMO9Q^C}_\|y"uYQjj/8dW i?n~pbhs+B5?$oML/fQ{"jT;f[:f ]05T6bY9%pl-EDxf9w`9IsH1Ker= vym`puM0AMKiBa!I'r$D=[$  = s $ a      ~5 X 2 ? T l  G  f  ^M  X6sQtuvaSFOOhW Mr]Y1A#*Zo  !"k#$|$$;%`N%xk%%~%{%m%u%&?&s&&H & '0!;'!T'V"' #'#'$'\%''&N(&(' )^(u))))* *+l*+*G,*,*.-*s-/*-)x-9)3-t(,'+&+%)$(#O'"%a!B$4 ")!w5?X{t{+  n  K  d | R   T O  O wf3W dHsU*/`R0Y?: '1UA,)X(߉mTAݟVMۭݤZۥ*:ڣڂځڂڛ-Z۟Xܗ9ܗݲQ}A4YmR+G}B="Fi"9Y@dASC2y#'(6We=8M,uIb2&|u>A7Boqv0@+bdIlUwC,{97wkO4q*XWr}JDgߒrh l?TU(ckXR>([߬NEovL$Q^FNQaJ,^ l(Pz%R^64>e4luC&oklX_QNavr}Jzy)yxi=9{ cprMy4@3HF95,sf4  T  ]  E   a   7:A=t7-*XK.R   k ?:{1B~xw=~J qh P!) "!#!A$"$G#$#$c$$$$%^$O% $|%#%#%Y#%A#x%%#Z%#P%-#,%=#%S#$a#$p#$s#$^#r$C#Q$#$"#p"P#!"{!-" V! Rxi*9#*[An*;6^3Qv18oGRrOKKvF&t) 2sM>'| K %:j521+#W{`^u)~Wa;  H , m ! k ]  M } I+ S }  F )i #>   f N   |  9 . T X   %2 L+AT5cO8d `. 8\F!Jh 4p!^S|kT<$xN!\ #;@BSKLDXfP\ ^[J:{qn2Wt:K$wyf3!mAB:|&n g(^ߚޙޛ9ݚvܮ+ݷgW~#Rڜ3۷ڃیڠ>qؑ)Ve ە֛1ԾO$]rؗФYDQςքΘ$jԇ3?Җ*̹V| σʪʁΠɁKɝϖmf/Ȗ/L0SȵҎsaQչՑ˗}4ׇ׳ΏM2$ځMܺ'ߛ@fjxݑ1߫~`R?guz$3fp>+H^RB/*  Z  c # 6> j{ !"e#Y#W$$ %J%%Q%d&e &!' "b( #d)7$*%+$'_-(.X*0,<2-3E/50"72853914:4;5<6H=m6=6=6>6>7=7=(7g= 7=07I=@Zq"2  @T 'x Q S 5gk+ie{4&}$+ZgAV19=*A0tR;t/9AbD s;}A5:`GL A,]3h!Xi&A?X/}Kj j S6bzJ)YJt!Jތ[ݼݗX5״%ր?m؃M>ւa:.E_ӂJAӖը8֘Ԡ.2ر")tr٭֜tك,/ؘ֦hԏQМAОS̻˲!ǝ_Y*nņ4(|W"ǃgVǫs.dƩȃɵs!Ǿɋ=ZO_OE.ʏʮSɡRʠKm_ȼDZu4ȯƍȶȺh#zpǎ4̯ȕ ͘|͠?8˂μSϑ=,0~3<Ϯ=G[ϸw=ҠϤXeлy"'ґ әK6tط# Q_ܣܬ>+yRyujBa?g|}|Wo&q"FM5_CLR-A2a\6=qABD6^K; k G /  @q#mrP ?k=* !1!2"r""?##< #!$!\$"$\#)%$%$$&H%&%+'&'F&-(_&(O&(#&')%Q)%_)-%E)$:)$ )R$(4$(%$C(J$($'$'f%[' &?'&H''`'Z('B)'.*>(+(+f),-*-+@.+.-//.!0\/0011c12131415262L717181(81+8t17_1u7L1681A6#1o514131~20p10S00@/0=.02-n0@,70c+/~*/)-/(.( .k'f-&,%+A%*}$v)#,( #&J"%!,$ " T!fD6sH*KVukn %4 E l&~=? 3M k { V " "Cel7\00\>G[ ,0tRY`|0 bV/,J/?pCD}[YF( ,jxXB'7dx 4|   2  S  .h(0`CqkOa !"#$%&'X()* +!,"-t#^.$/$/7%f0%0%B1H&1&1&1&1M'1'1'1K(1(12)1)1O*1*1+1Z,D2 -2-3}.3+/4/4n0o516617;28293&:44X;4<5=6@?7@8B :XC6;D?<> ;z=e9<7;c6: 5Y:392t9N2918t1q8F18$17"1)7"16.155151.40)30&2_000/}/..-`.,-+-*F,8*|+)*))()O(G((h''&v'%@'$' $&G#u&"(&!%3!w% %$u$##s"n!"!1q 8 !?+7Mo|81pc/)   BW O }W *d  u 6 (ipe/c/{  . #G ^ e oZP ;; D S }7s}QC6QFdh w O  s _5 Do   a 9 ? E  d 9  O \ TfJ713 N3[n GGU 3>B1d43-9oqDY\/c\5wD;!zh+QfEw925_%NhmZT]Nw!sT9T +o@,fJ=OSaGx6nK04k'c&Gh(N G6n*@KSI/vi]qNN2"L05Vi~w|ppmuw{jur]P4;I*nbAky&OzwE-ds-=r D%9\t=VR)2|O e%_OXv8WR%Y2pZkbjyEu $~e=$B\up^#\hoT NAzs{w Oi9L)"$5I=@(0)V0Qna:F''?=v|1gVe r x  u  b  O x b m 1 K   p{ hE [. ~ $  = X Ix u     7 N _ x s q j & @ ^  y  Z $(  ( 6 `x6~X;q\L&KYs)%} 8EFtomaBIV}[S7D1sxQ-NnbNG%tvl _! p$ix&hV+zhWT/Bk[lfusaH:M8 CJ6OuC!@ A Fv 5zNCl[WYa#o%@D,&`& ]^l.CߪG"ޡlka/ݭہXݔ-;4ioڱ 4}C`FOav0 q+i&f2>g9H"x6#;j$S.faWBfh+#0<t i(euJ e!CVu?lTi:h3T l<$,}Gy/u\-tOE;;9CZs0ngL (vSj'98]KE?lKi:OylE6DgP>1.3{?'X=[bh t=;G{=@n5pk`}Es2zqS/&\e3!V"#KGU:T pM,9!u6C:W+`]zTZ df;t C)&@ n1+$ w!bGU<zcf$b1*'{Xp|Cn5B(UP<Q]my}Bu0noOV6}x3`)$h^&Ltg1Q;P bT ]X3KnR;G\%.]BMBA/Ph_oE"y Ndx%'7ND?1MOq?Q;A=6}Q@ ' 7   # o v X r 9 < j Q / J a } 1  | ~ S x  ~  b  4 8& g    T  k D + g e v a e u P +78X!= DEE W  b  ! Ul    }   i  v -= wK p ZR@+W-',g-l1ZV% X 3f7yeGHDj.u{nW(hPK(]}" 4sjV+Tk~H*1@gs;9vhvxX\"YA LHBuFk((]BA)PF JUHA<]L]+fdVo+Q{57H|/hWCObGAyIz\:&/3XdT;Vl vh:do49M`e\urhPiL']p06SRL#  9 < t  e 0 M 0 k - { j V 8 ;! K S A   ' h   81  _ZVM)@a[@0C^nPm`KU Z Oa U) 8 &   d >   \  > z^ p. . E @  >  '  [  N % UK q z  3 {  7  8'b4hwNd_QbYH*6Ll UQj*J@fJBkNQF+JALZ32~-?yyuCiLaKbhB#?$h9|U &YVZ[GAF/Cco ID yCFl v_cvL ;     Hd N  3  6 nU 9Dm=*tRHz9=]|=,{V  k M` 1{ax?^02K ,'&7 LJu[O39d@dDY:^Rs\ a r S     q8 h Pd VW ,%  a , -{  s   Rz'7W6  U K   Z K + 'n    9 e @  C 4 + 7 T }!fX{o=fL>G-!5~XR"fHE}J0QamP2oUr{,*g;D3<U0F$;oj0J`N+  \|  G!!"b""".#T#z#}#6##pg#P#g:##$"{"""ak"%"!f!! :ND ,`a[#  E O  $  g ?>   _  d  q &A =.sI6@OpG"j>2Pw-< qA 8:x{<FZC QK'Kp]][ 0+:AmIURzP2\nGtJ!.?QFNM=7$Skg^%Bso\AM.\N# &Y_YnA)A|d >KQZuIu* IrR?*KbfSm @w4`-oHF݃݃@ !Tݰ=܅ ד_SܶսۏO ڷluSӆZ1ٟӪ؀Ԕ)ՋաبٖUrٳZ{s`\7ܾ݇*`G݅Yݣin\ PT4݇-9S\ݼ G]#K%"$!u$1!=$h #### #O$0$I$lj$c$I$1%$###H"!!* #$O;yn5B\  / ;   c Yn   {  X /     0 9 `6NjanrF%by Ie!m?9TT~MYE&KO3C-m~J,s] [j04dr^3rN#O{Xa# Tg41w?Sf>p1QT[`VEJ!^\(9|$,wmdPt([:%$TLo\3h8p " A5IHeVjuss=qVACfy~9vhu@nt -(|E9w$_]9|X|ULmDG@; 4 OA 9 / *  Q  r ;  h@ q'"}`&o_1\  >p \    Uu  w u+_T,[VYD?^4fo_K`Y;s !B"# $!$b%Y&&)' Q'@ )'H &Y i&b %= $ #"K!7 6uDB$H 6i $5]H 3d n%n9m&Z&|+Bz Y  }  m U | J 2 v  Y  - D rO  L L{God,h7;4Gz^[ Q.WD!ASc'erGHl4p3W=$\v m t*a;91\4GS@%+c&5`e@b N~d*}C9߫5vޚg&ߺ{?,v+,C&ڕ :ߺ֕ޤޕiݸҊHOܳ&[ܜҸQCԭI8ރֵ޲4ذ) S^]ܑbݨI޸ ߾p10y\-EPbF&_kZ^d@GJ4f9%dY.5^V/</z.3 jSdW2#3MrwLJ Zh4PmI(BWz$H-fAd(x/EI>EK85%t%E=i h||\omFllx3{MN-~=g)tq?{4Z+fbg { #b;wQf7e\gJ_Q6z#*_+O uaj1.s f`*au*,\hOJu]54 j `f B    za  , C1 )z6Y0y1w  %   1  b {@<q2jWs';80:m9WCqwAaVce3iNV*B~S1EUI Eoc /eL 3qZ"!Q߼P߷ ow߳}wH߁ߦߟ߇(?VeEljF]ܫ#ߚإsֶԇBWڲByzmш$.%ˬ3˻t ˀm/˳/P\pC,ЀW4tbЫHj),ѿϦ҃IP+r"KWYA1ՊϳOfԋW6* 5e]ԙף؁ڊY۹؋ڱQ'޸ߍR@T5SM|8Pb*\1JyEF$AL ''O7e=z@ uQRPD>LtY3R? SILQl8/o]:IE@om"    5 p &@u%oMM7s 6BSxNX B7(  !"   W 5  )B  NeEN%  b b  s  9n  "&Nl`}<9X`ASHodT ZNxx eWy&I Wm5D j i! s   )w  V qRdD15p8aeRO'   rv J.  T $ n  P/ b~yr^}Wq3k~{4p?B \q2|}" dY#j0f1!PUPU #$Pt&v0vAD4m'6b&=h6[4DO*@W+)>zub?bpoW+ _C5^nU kcl3)Am`/!uNhp>Co(-Mzj2WzLdusUS<(2?;\j}Y'Ag'eQD''WPhzCoB KZ&T` 1,9`*E*&Wl;&bDvnDQ5hJ x   ? e  dA !  c   BI  1%1 |uUCarFCUJ~*RcvlpPQ  6! !"!!!!!!"!3"!6"! "b!!-!! )! m l 3 S  S9   a!#!!!B""""""M#"l#"y#"k#b"#!"1!\"a !)! (>EB=E{ r _ !!}!!" ""!E!M! 3 Vx_g?i{ ^B#2V]#C6E~k)&R_b."IVmGeRcp])o$rmN6WL75]v76C :  cG   ^ 9 R Tg z W ] ' 2  s } h9%*cF~$6I*wPcMfjA(PHqArE*dA)peTQaj3+a%*$)#(y"'c!& V%$"g!6 Y1}z-&$DQuA.m1loD/}cS<MLByF 6YV{'7"(O44 s(f:H r V G i  9E[4>5J|@4TVcTEW'z):g}[A[roE9) S~d\ Xd2ft3Ec}U=UZEuj=w[0 XEiN5$f*$g=޶c3ܫ?عקcժؓg؎gاա ٦֦xog]wYܭ~ۏ ݞ0ޢBߓ)f -bbg%>+a@0r(lx(4k $/_Q+3s"++9;\Si=!Y[' kl4:~:6+JLf3"e5'WuR8h5sJg<d}d n*\}A@X>2_Nb R   19C Dy-en&Lw6 ?  { ~   8    Y  M ^ , r 4yDt7XZF] 74zDu2ViC{>G+K ";q!@i7vI@W#>h R! "c " # N$ $!!r%?!%h!T&!&!&!4'!]' "'-"'^"("8("w(=#(#(-$T)$)%)A&M*'*' +(f+)+*,O+u, ,,, -,G-E-x-m--Y--(-x-,L-J,-+,*A, *+)+'Y*&)%(>$'"&!% b$4#S" ,@ '{rM F :ev_N/c><,    u   n _r!%h,Y'w $Y/`Fj7;/{O"R<7 r-cR&BX#WnynIt8h2U8]H46"FKGvl2@Dh*&|fMIyb89B.pw @al6Qk/0cvy? P6,C^zPVSac7LlS,lW le(1r!`zO*$>SLMvZ"2T&ci3 *LaAk CH ~ut@ wC.=lB1uPr|palTT@5"?gH=r:  D S   z 5 0 4pm +?1Tpp/w9vM=+U lnYio'VF=.-D|8jRk zg~sigf ' r" w  hS  0U  [}  O1   xiX6@3;Qa*:KcP(,93 6r4#!8F~D t 5 [ f 0  = + I | ^ ~ - KGj%}u>l  2 2 o P  . i g  ` - yX  Y ! G  H :AT0}FlfRV? #mn'kCu8 4ItNH6_q =s>y4o!kSW0Z.(000\ ]6L#RS\\jnyLu&3PlWPj-^qdG[?$3u5vb@R";1c-q/ C3Vxcv.NNTBP!=8gE ? ) v ^ /   y C  ; B o [  YM L=jYJ;!pHP$2`j|K"GM qt>qG"RQPZ]js -W52SIOfet4\NHmZ] `e 1 0  ^ 3m '    $ U "  4 V U w  $%xx7@ Ev'#3)a!h@ j=LIC s5  '>$]4mSirL-3D879Qr?Z0**L'zAIkuyk^C -!>{A9~!tMmcAlIt {b.&iG5P3 GAf]~ofv?ywx0 ) r  H  N  1   Mb , ~ ' w  O <  ] 9Xw /cq|T#i2QO< ~Btu 8_?dKu7JW TY pGS$!D'QJJhj }g+w[Lrk}}M!-Va@Cjs-sTa$K9(c-%VvmVSaP,4*r$iR@LSFrQLqhvQ >kT1M# =TEd(WefT3 u\IT9e[K9*|.r&-|BSE>Q=Mj!]JW{ywtmOxCGD]p%  fx  R  T p B ] 1 _, < = .  8 h  K 3   3 A  u 3 a   ? * k Q i T ' ; ; s G ~ (  m  +   @  #7 ~^  & T r w j <9  u !}FZ n  e! q   @ / ; f ; ,  " O Y ?  T:U3   i f x  E`Q>AjSAM}(T4[b `p}|m O!?" #)#]S$$8%h%m%@% c%!%$\t$2$##"1"!h!! J @; 2>r&}# '::1]hU+'J y 0.  g  486e~r`-g.&UIOwhZCE(*Avk"l^@i#hKVoRmpGX Hc)TDD).J18U=.NC9  a'a4_ QwxQSxL\wxLQ $ZmXw V5-JkTUO [5*Q?_ NT=tmJrj'|3u.`GD0G. ; p 1x W] d7 UC(9#Q>5,)7Hf   C  S / :x w z Se   P   2 k`$*!_G`*TPm D *0   H f' >g;1A' _ -  [6 M q 9xjfyTt&. W i i P *U  iWGa]   X C   ] df   X *  3  P K   lm  P v *   54o+)~  # C Z2vYk 5 I j     E-  ~ > Rn*  q ( p   b K N 3f u   l}  ( 1 s y 2 r  R 9 + Q Z a r? )  r      [ VC s   (     vJ syZ||C^?k-90%m9? 6_>p2gS5/%9)=__] =_ "D,,7UV DM=.%|8Xgo8j,\i[3hG!bmc<x=M[ZP/5>9m/+"bzeJ'f=ZXY7?x("eE .lKQ/&'<6N,7U;rJj,qGaqT-b""L;:u pw? dDJ x-    6 oa.o]R8v.s20 h u  Z J    1 U1 o fv\2]#^wXp>3b?$r&Bh7px 'Z\ephTaP]C |@#2X[)_!9ZpsqG  GO lp     7  e  S LK89ae:+G"C+0R{GTu^> MY'c[nbXn'O.yB &R" 2    @  s0 b vs@('`Z1(7t_xZRwzfR nb:nHpE27 h cI"a7?s8!_hnR 'R Sn=;809RKJX`oh`Y0 {FluEXBJM4hn-LXZL,f(Lrdr K| # O 9 I f A |B   aD  a    ?9 {e?g?W3 I\ G  e%   T  $   I  d  y z   Z  F  I m b x f  /  ` K 2 * iI  G7`{ ZNL @ & 8 Z c +   ^d I n4 2 " \ +tWDHHy[7 \t   }E u  b} wz %  pa :7nP(USqgPbd)9.JB k~g=ws%?s<^lNL>N|#y3(jBG4]~t}eI%NjG7qb%;+mIcmfL{nj(Aq~3F/CO#JTj]$JIzO7Z 4N2޻ݽFޕߟc' 3C0T Tb8 y#lf'!s[4niOG4X@M`"~jdQ_K(b,A 0SL@K& Ds:oB{22 )Y=p$AAavC~ Yyg4$=,[>[v$`: k:u|e[foS}>@.%,(ALYoDI;eM "o8YoBlEL*le[ y)HY\U z  $  x  ' !rM(fUmgOf^RMyCS:azH;:9 H wJ ' ?X DqmoEXfM4r85N2BeC6Y}%myl>HGhDo&. W  $ p d 4 >g6;ejagq5] Pl.Al+?A.l'+!:[hkwZ|bbF&D*96FVbXX)Lnc4=F#[j2jJ(;TbeV %~~%jJ;;4|O=d' R h(!mtbM?Mj]cc H?{+tV[F;S ;+z~CA)(*<[[.MEsxFuPL{-*U gOZ:3"\ ~ o , i  5  g W $  R } 7j   C0Iri2cE#-tbP)%sU [nrG?`,JJIeDzbN18/bM '[  $ j r " h } W  ' GG m 4t p M % / b  BE  9  [ 2qi98`)t f 4Of*%[iR#3 K{:,'uZ9rBxA y P{ l7 q'jIVcoC<n#G(X@X Hg W^e}FOFA?),W eS 4Il+!tv6UZOY>f(@! f$ZJ@!{\, .X~x8qNl[^OMc-mtw8no XP-JFHTK*?sxD/"~gGe,!uYQ xi$!%L!ruFt[Ib5%t=fH2w/Xlzj IP6+Kzvi2;OC]OzV,)E.O&bH/T[@7}M)Z7qZp+ L H!a#{{fhysaBD dDt[4wGA#LK O w  }  /Zej`iAl*a1hF `)EBCzUcZC[e;;  :!@!b!N!%! ii qP+f$%s_4z`n2N+:}O-r=A#jq^gfI"6or:o)Fk_6wBL J *    k  %  m a h nx r a Q H s' LY(p%DH'Oi{y0tR?N1G3g!28AeZ!zvl2*djN-3P\ :U$`%{z .z$_l>3Jg2ߒ߾8߮qg-ߜS'߽48.}Qfoqyywjv>}"3F W$uQ !)6b/aq4w)mN(0&IC"jR7'[KS ;|D~K)T|!}3R^mB6Z4EJd>L;'M_w'~#SYi{V} rAht`P|F`IEcixT*,B K4 JokkTBt RbSW !`tGW~qwoA]}-7u[UPF_wjv@t\5R(V:AA_7"sHt#O/V%~5 o FHtT-YbTW6(c1(< C=h3-]ME`n1X&55=@ 'o(tXV5YyBy)^PY@<Trfkp*W KgI>m{/+UHx8acw;UAw;4>zH Q"8jE7 y^O{_gFhO>WNED},NGJ<Gua>] gi4})G}~~1Gq5Fz~ $I ] q KI    \  5 g=GdCcSJ RG++OPW|6    C u G }&  dN  ) T B Z  o x   o '!m Vkrn~[h {9K/Qzlq2LC|<`Y"P DlN5mAq   e uh   E { jV?Z;qqp=ab/y /  +i   X^ 9 * ;- v4 8 7  "  7 K H N] nd`<i7g7T={f%?w0 :_pfl!} ZTag>(o!g\`d$3, g J#y=N=P!r'zp < cwq^3 j%n1<`* "mYT r* z@j C$'kXF%Nq'irR&me-"ssUFfk( L  M 1 VP } Gt  u h N      @   y   ; x @ Q 2   y d ^?Grv3la1Hx|P"#L)9V  f    " g{   G l R{\i_n990D13(Nu:GG"p\2dzFP !!(!" ^#n # J$!z$h!g$!Y$!$N"#"-##"m#+"#!]$c!$!]% % ]& &7!&}!9'!N'#"^'y"2'" ' #&>#d&O#%T#%@#%$#$"J$"#"#q"#e"i#G"b#A"k#;"s#L"#a"#i"#v"#"#{"#h"#O"#"l#!*#!"F!\" !u U! > Vs Nc, i)QjeBD@: U[v CA#91@Mb =[6 W` [ a V k k s  X  &uMZP##@PhH"!rYct W Q L } L  d y #  } " %oQ;[m(o @ZG@koDugAd|XKJETX \T; tk0na\|sO;,_\vEGZeyGj#x.AYz0`;oZ!#';[bt;$XeJ\tIWAV5^Ng:hberQL af(zlHso5LIJd"t?02o   l v m  {L t V  i   LD  W 3 L m  5 U  ^ g  E e  * ~ ] G /H XG p   {B b 5 1 p z  ^ E I C  e 4\s.Z<N z~|FeLK| 4|<+>0 pZ$Azp<cz^K?8  #  u i  {6  L 8 N w #q   k iTK g$PFjn;wQ0 Nh .8QZ f d u" s q6 h m M LX F 9- 3 +N 7 *v 6 =E0;;1-O {  f d 5  | # kn!=qdC_Sezwo<  C   04;7*lNR!bg`q]BePp)g  @sx! - ug  B # 18 0AqFaIm]juqc\-0{V *Kohg|C0mQHHq^ i!-C -zXu$`_~Se(QkHCtV5}@z g W;:!! ^7>iDmOY[b+>-Ce_r3#hS3 S _ lG    m qT `Y [4 Y< :-   t } l   ^    VX+> #{yp_\T$yDa(sT'ELO@ya4l0w0oZ>1KrKxacJ,/qxiNkERPfykiU3$n0ux,,xS#RR8XU+cNK$<~4xWm68{Fb$5wA7"$GXi`N70 .QJ6tp&F?]v{c.gC'ylb,T?; ~>0FP<`_s8mRj]S2gWac$E+-!f;/4/>RRz /sGvb:Bl{f]1Aab~ @#)7L"NAg{fqEr~LzOwh <K];P}"|%S|&;iN,`)en<]4{k|}@~}b>@?  F 9 .f x x j @    = }q3rlMd&<Pc[lDu4m;{0( ^ d  G 8 r  0+  D+   N x  n| ? h K   ? g  0 kj!|KK} P  x M  &   ; }      ; 4,K4|%qnO P m D + w    b  D / W 9 A J p ;  [  A  [ _|W:!lm # Q    0 Vw??^e } x Bn M  v>@nV5   *. G M _P9r)9GWu93*t@s#H=n}})a1Y~ 1F`%1rzDx"trfC6+'##.01VMs\m}lb50t>lV*Tz8aF/>lrL$:Bd -$LpPW- KbGha*OSZu^6yW.dI AtMDaSNWk0ge;DQ+B X{Ntr8NOtWpWqP]vP$T] 7eN Xsa25js,IN}?]G aB\ Q77 l  Z   c  ` h  Fs R JV x w  L < E  j      /       v)! m;[ ?Iep;H&JG\bd.J]W `1 w`5>O  ( j m   _.   li3^ZR77'=jTq4X)e>i61L@"?n~%5*_ex^ R#=)1@E6ID"r\ @4mGx;v&G  )  \   @_ ;3`dn}|hcU3[Z#l~#vQ_7.*w yeQ'+O^U#Iq<2K6$(E#%KuAgQ_fp)wmy JE/lC(oh}AHv#hmB;)aG'(2Cu\f+t|2UYA?\?GD)Y"wi#&R*25hfrr\g~/G>pnU R)Uz  M}   8A  1 w O 5  4  " s   B 1 A  ' > \ k    O.MT  *  Xm]f _n8Ow7:0y.bwN:2~,Q~e|c>b9 , *KGZ~igc~@oI9xwIh7 4PB\Ck AXkh=JNr!B}8? %(. x7QPWd8sjLN#?AB[H*/:V}_A#9A6d_|9879YRogZCLzX. Ks~tOMH(H$ /1.)m) !hm ^{9 <9eYC{^qj: Teh>Q]"S9 H;gK95#KRA0 92a?fk$Nri9T\m]eC\>piFS)ms4mVn0uH#hmz4fMe$1fg>k"EK,p2}4N"0])zot0CN?h&c# O/pT7 Q6,rxߠ5g#ne[yaL_b_j'5(C.5'V:h5C\ 4[R`l0vq~m(RGU5s= R$E'l%).a+m:sWD5f?:M iw4g xV)l;^'1ZUQr'*]b3l" @4vpfxvzwW|I%COL_/`_o_YO e%id`% df49,^aA" gh>4\d(?w-f-h&I\`I g:@f0^ p&8qk.nk.cwC)IVpQDvgUX30P|'6 !     r!%  & Ns x p g A   u i q> Y 7 5  3 #t  a  ) Wz@~8TpfvS_ G  z  3U bzJS m0ccMr#_i1~l:kk>%/:sTb/hw  o X@ 6  ; V  tq K f  S  8  D A j D I 9 1 3 8  I d y O    4 k   ."rg^gTF-9   hy *=   } U S Q  ? l m  H7L2Z+alb1ZR"e\i!M:7@r+PceY2@6zB8TIrvqT'z5Ig(  Tp  s   d "    y @  e g   ^  b # Z ),L oJ : W O M  H8 C 5B . +   y k NM 1    z / [ O jOB%}>5?3P+;O?h<{Fa,xOg7';>;XXaeUt;;qf{ nad~=OgOQY'm"CzE&uM9z z$Nb> 8QC2+H 4t}J')\@gd xp8L(t *$ e]qed.NzN'v, # J  t x 6  q N " u7 X &&Su0PVrSJD+Ro|(: t>}L ~  h , 4 : z 2 "  ? ^ m , x d 7 ]  ) 0qj=ncF/P9? f,veO1\=p9A: _`W2ggRdC )VV+/cT/.v? a  F = N   ` y t l~ Y Pr %" ) B]/v B1Hi|?}WZTZW$2 r{CH@vQ*D:-%G#8VcY1Uwy` 7My%t BL.IJ tf$dd9z8H`w cUp'8{.h bUr(O2uqM5WA2;Wrh%3i " g69g[ OR"&2=3:A1/,8N3RoR`/ln,,4}ed5H@5XbKe y<` J>ZJw97+6akiN VP_\+2\%k<l,Yv#Sh=[%K<~#Zv4QE:@TNU7Aj#CR=&<W x<>Yo5-r O{|pMKs38MnjZE$ 2?F46( T N == N Z}H %0J zg +  m %/Wf$N%sT;?\2|y +pi)kHnt:uR<k?yEf+2PL[   \ i Q y  h O W > 1 z  >   _ g  KH6Jr,O@avzjF zUkpKlm '?DZsk y&+f"T+>}>zGR F,1)1zU08RwwmZz9>R87ud4(]LaVGB.gfj'd\U59PA2}^>8;/~?g_oL) ;: E 5 g #X 8O y  @  9 w E   ] 1  z!   g  1 X Q N c q  _  m   X v G ~dB9%SH v J   57 t :- ?/ Y *|hV{&LA4}n7 .5fc{I,3|%o,%z} jHyV3b=f4wg3=2=X'dlYA"; S t;ww& |^SrV 7bZyJ!KM eV.'9'PN@*~ r.8n",69A/ g@F _#\RW -M@XpT =)D_@08d Spy |_/h(w ?=W1>%{|?thgReA@SUJi~uAv).V06!)ovP"~j g6O~Ug~c B /g c { i * jY]X5wdq$2KI  gQ.g> 2 >81cJ23=V45ifSgrAS I$&{o1f-B~ :ZkkP2.J UNlY 'O 9MN#LH2, #<  4<o*jjn )593/?8F<LDcBJbv2rq)#Eub>\G h d/,.D7pkt@5%CFuc3H;KLtkiSk78Bb['a| C00V[&pk8@1]d9,%_:@Lfp-Q-{)oT  ;R  #=   NS  "  & q{ S 3 JT  4*L.qYO} KL!b"kX#$$%?%;%'$$` $J#"! = h2MrI/ C'9]/ _ e L  zm\U<  e R #q i/X]'BC\ E#  $ !F s&; @}Q}gD1C-ZYbaCXH)X*ZdST+qf3.V'@%[vRkhk_;BcY1wOk0"E Paw$ "XdW_^+lZ48V8Waxi{eS/ai%rU>a[5u I/B"L?@M<T H *  p 6  X)B4W ^`m3Db8lD ~hnU!7j0- j{cRQgb2RS$%wg2[les Rs'm_6e8>ZJ  5E1<V*"( * 8 f   c 6QjVyulM;+lp\$ U(7$|~#S_zuIt,JEK~Cwk!LpS"w>OJCW,rinl9GpW| }K M(8_HT7_( |s5wh @ u  A 2 Y 8 } {  } K ~ k ] o  |  h y  Z    f 5A  5 G } _ Q 2  U     ) * _  G   z  ^ p?)_Op]c^of}yiMXsz`gI# <{k9PbgW> : *\>De;| mN9@    C  s O -   n,s0B 4)LP @iwukj#heW[OzAAo(Vq32y0bHAc$j(+x4-RrqY1"5qP|2A/m6*,edHE7MvXww c'3z4c_`V+2JZA:7Syo: s%BxF@#p}"f6 zswz6oFNc;6KXq^5wOh DH9*#9F 8] {n44' ?xDc`kBCkw!.jWbyx?*_?l.tS N`c1q' Oxx"O\-aV'F\F6([d\[e~$cjAy hVC"7>^  E   _ 0 / i   H] #TP2OL'9#]&7u A r@K)PeznV?2P)`^tGdWD.!/c;L4%?sFRfJ/!z{.g|6'  )FNC izJ(qo;ns *} lh J ' 9 ` M &  WxTnf82NE;8xl{ 3=<*0Jj-y1xOF-ދ@ )R5ژ٘APٽj0{٣6}֦ kykw9ܣ}ܩYE׳ݗIDؕޢ #vdً߽#ڸu߹ Bߎۿ߼ۨۈ+ckaߠB$ (ݷݛX"އH܆,ݺ܄p:p3.ۺcۯڸۯwpLމۙ7A|ܷ:"ݴD|jݹ2r4W|ߺ(]p0eG&w=F~j!t~zf5?~('i,320O1GQ x]1YJH 7f| (zZ-4@$l@Yhk:wU!w f / ? X d ' [ =  ^-(&4s,5   H        o+ *e>y-Za . K i     q Cp Es J   9 8 W   b f 8#5  p3SWstBlJREs;h?5Hh#0\=>|f &?U   M *    p! q "  Ux "La+Q t%7 _ ^ fT Z zi  x  g#*1l ` ! G H 7 & )g|JU#3GctRg?%sg _NVH3i^(tYx(= [5iQT/`:smfzXV )qd9 AOl~n)4O1T%G&b1N1[MDU0XCWC$_G)|h)\9sn Fy#a!0c0"l^V6XZ9cB`QMv11N P$$ g    | $  MhNNS& g % E1  X /  [  ] M q *  i   ~ , 4 5 8 J= 3  0 } ) $ O Y y  t  .V   W    h? R  1 S  ^   b  *RD mrr:ScS3TBpNc+p}5+u`}ArL}H(KDq $4<]u~ s2:9$/r&<lwSxPL: E % I #] X 5  V A E L|Ty:\Q@aM&WW9|cL B\R1*N,6ed5~ V]UDD:x^h+"yL}1;F]*X . Ivߪ(OU}#';1_z[O6|"+09 {XߠY+VwUQh~BؘRٔ7QՈiԢ+ԍ*}tnQ.ap'ک٬ً? ڕ6XX/تJr^ۺ(hܫ 2ھځx]9$/ $r޵ޏb]!t?m7g7BnW3%f;M*\8ni$,W<cYM'6\iar1qztoTc@(m+6@eIpc3- E | q <m e = _ n  H  h f  O 3 8K  - t H v (  e   ?Q(j 2prF`A@R)A![[-aGAR77yW&^"> &  1 p Z u Z . n a    q p ( e E / @ . h  8 w I b ve+ ;V  36   f  ~e Z5)8n5j)^-jT|hzzxm}@~xZe.vhW1MQIr ?JZ<: i)ww WpSf^kt!6 ,EEjQ1c+-E0yBXTy'Yr/FyF^+\;]\RY w(R8qR*bIc#"|7P2+Hh:w!78n-t78tvs?9XJ[7W:qPLC z[eMt31w3XE(b${Wl3LBALhޏs~guE܊|Uqntܿ}ܲGܚOq.MDذwުԖM Ҝخ֛Σչͨm̥~˸/gֆ2@bϩ۞ e'ңU(ӖbԻh.ԁհ=Uށ޳ծTc,ݱ5׫܈׃ ^܍U@ܢ;*M_dہݓݜb*5(#Q"^dUT "*1Y2=aDt Fm[ ,i[z2N>OQfhH6&s~i4q/s NR(m a-L&*qv!1$=E2{[J0PNDZIU]cX`agw9p7X>&*M y )r   &@  y 6    b MFY5@M[lqt`J:n S!"#ZQ$ (% %!&F"E'#'#($))A%)%*r&*&*V'*'*'*'M*')e'<)('~(&'&&[&&&Q%%$%$%u#%/#%"& #;&3#&#&$'$b'G%'%'r&(&(V'(''''''8'V'&&*&&v%=&$%#\%"$"$'!$q #E#"gQ"!=R`MP )2j[ :  @ Q  s F78[m.\clT<}^.$l_%}4Lz^ 6=Mqg8[E7~w?O x51NrbhbK>8}^6T,^!#YsސޚޑݦݐݳI Fjڰr5&f؅حפ֒x3_y.ZӨRת|Ҍz2v՛k%XԫXD+Օ՞ ֕֓׵׌E؋؃څٵ1Gڹۙ[ۥ(ܠg>ܩi-,ݵLݕ{݈ئszlwal]xWؼ8 4H ؅׸ 1>afxS~؍؞١_ٱLH 0[P܈}ptp8 q_G!hZ }gn"NWZa}'1zV|T@PW_t:S" VRpn  6  m r@$FS{2J6g}Jt$BCRT161M^w^G3l%~A%gc12|yRH4(<PI9U^*{IX >M)50.kV>!:xaX''fAqNrgk)_Iwn1SC`F-l61tazVC1'  D  Z  52 k  K~ S  PUv=VF;Ol!m+m*H c?fZ!!2xFRZCp +JY )gElC'A6Fc =Ve )x@di1tP"F8k)Kac=k^EFptJcX]'sb:|FnQ,K E*Lއ܋uq$ܥܨY` ە7Qm {݆g9ގJ Tdse@dݦڜ څboحأ֋[աՑ֧y ׃ז/ذدRو%E(ܥܮwqK(aOnZ'kD$_)Bf %>/6 ޗB)߹v)LB[vdIV*C d]:O>\adVX~oyh ;}5L)Lv 8I `+1k ?znrv{]t~X g[K  pKG,~<yf]igcgd z > j  { 9hi}Dmkh@wt`iT#SMOnp?)% Ri&{{ > 2 p  w c _ H H I  vt7PUCLtXcPE] #9S1)fAh%BergmY=OmV\bM}"  3lEe-DAdi4p~ \v6! \   Z \W  sw:\,I%p< J]Z4EETYxhMe>  >x e!#k $!$V#%$H&%&&&i'&'&' &'f%'$&#&" %}!#@ " i!# vdf} #w}{'zzr,Ss isiR Ct  1  } 0       C F , i ve f 9 o +Z  jbu to6f,UyR16}o!6r!M+{KZWz 7HA@0R?y3=L $16Woy(|2Q}%5)QHgK XK   ? ! N rl%P BWZb!|z9 wt!V"5#$ j%P!2&!&u"'"(b#(#)H$)$,*C%*%7+{&+D'S,(,)p-).*.+Q/ -0A.0a/102132446@5^7G68f79P8:D9;9<:=C;9>;>;>;>;>;B>i;=:j=:<:P8?8@9AN:#C/;,D<+EF>FA?Ff?F|?^EC?hD>3Ch>A=@=P?V< >;=:Be:Q?:&@;@l;\A;A;Ar;A+;~A:@C:D@9?9>V8>7O=?7<6-kbink>~ b-g+][*UWZPUdN7Wx};=B%{C!|y:Z P5(-g.]Kkg^] lG:$g$9Woc7)]|=ir"I7v7a~~.I- %2:PRg~v{h=nVv +9V[n#PC|c0FYt>A1z6JO ~        z4  3T %6GQZ(,OFDu:=gO[=nbl?Zn oR: 5n 6Y k  Che^q1[  E@ @bK}}  t `  GR , 54 =\wSEI>p+ Lt   `$ : 4 h  h gQ/ ZN-*>+zT\L|T2   _  Q  b  &  [8 5 01 g  v~ 6  N  5 H J G =[ 5CKDnIeRTcYwh_d?Y;a6m8kZppsmN6 ,aoJfI/:N n]G/H6x$f6X=wA.j޿vTߛ3ޘ0[+ؕۄגzOګ54q] ٨ڹ}]*%܎܉"ܚ܏ݖܒl.] Hf)@hٽ/qkF6޽ڊR@U܆My)4t#Fg2f\v{&:sGr]`,iU*OYXi(tckJ}%h}uK0J 3t|//4[|'lTy5q8r0>>iV]FnzJ )oO  U#>rW3B*93n:Z;~B%a`Hf[e3;qE=x]FsNw|2^k7&:^tDo> zvwaAUAd(3{-`FHyDmhV:4,<OaZ]fwH  *c9nirG$'jC,QZxiX    2[s64&qc -Rngng ; \ \ G * u Y ~ [  ^  y % [  H  m h e | G #1 xW#3?I92yq6&'#CT~"]U4q9bo/T.#{ ^o~<pgX1i.Z5M!3jy s*:c&<x:*9p~ K!]X7Ek$T][9PBe3N0 1$w!O  z t   lU ~ czd!x3]W)B9FjGxx$iP$Fe; ~K S a O ?B :u B   D]  Q   S   H> g   5 b    " K u. V   ` ^  L |  : v   P  9P ~  ] W  Ma^M'w +-Ej T"!Inf2.6;8NoZE4pi7yQ1]#J|9{6>UtB6.`f FFEkpk>se5w  JAgOMw93_ch}Hc)In?m f>[_kd%J*?^[M?(LuR! KMKk!-zpt#Q?Fp9"^b%n}N+z|~V|N] j~2p HEF8[mc1 ]7!uHe 7#,yV:z|(r1orFP|bB!j?v  4 U v dy 3[ 4q <Ps2 q%!Nb0 5 +!9!P ! ! l!;!M!>/"/G"<"%"%!GU!|  J1TZw>v`a W     ! y  Y *     V   Eg  w uH2#ZP1S r 'qDgTj_166VH dv\T:?.3 z2 g1 ~   U   :  u -^ J U V [d   / Z u  O G " l h  ;^ z G  EK    & V ~ + |  O   yl I   D  M ? ?  l 2Si5y;A ~iV;OH6:|+!,*+)+a)O+)+(*(*(*)D*')*<))S))M)?)3)((\(('(!'`'b&&%%$$'$#{#""f!T"O !S!g!!!K"W""]#?~#T#o$3$;$#&$e###"!q!&C D"6r}b)^>kT   ^ : *F);xAtt#{Z-XZkqmhS(Bn x6S_J*G\ N)pKnb/yq.D0[:MW@<}L04mhZaW dxGFi~96:i3-W +-Tq(2t ?CHVH5}t?&WM>@jYX0aK \yql7B;#_"1y{OJI+e"/OJON7Vީ;2ޭ߾ޒޏ)S(ݪݛ`<1tA7:HSZVI56ޥ1g7"0,Y 90*lA( :eY*HjC[?=- ]m#7yq e & P p<pp"@_}|&]7J\{ OR9&DH$9 !"!"- 5# #M!O$!$"5%P#%"$/&$&%1'&''M((()k)k*))+]*+*,D+-+{-+-(,.n,..,H.,Z.,X.,d.-Q.-:.-0.:-.5-.!----- --(--*--)--<--G-.T-<.[-K.[-_.g-x.J-.?-.-.,.,. ,.+x.8+O.**.)*-)-))l-(0-M(,','z,'E,'),'",',( ,R(>,(M,(c,")},_),)x,)c,)0,)+`)+6)++(*([*y()@()(;)'('(((((X(((((()F)f)))*)*=* +{*|+*,+,f+-+-,C.|,.,[/t-/-g0c.0.1$/G1f/\1z/C1o/0B/0.0W.X/-.,-(, -Q+Q,*+)+n)*)B*( *()))e)*)L*?****E+*+!+,8+A,1+\,,+P,*,*+]*2+)*~))((g('('h'5'&&%&&^%%%*%$$$g$$$,%#%#&#&_#W'4#'(#("("J)"x)W"t)!A)!(!!]( ' &u& %$T#"!A #5fO{^UJ >da=Y@VVs? kt (6  _ NK@eN? M ^ y$\3qZzI-#6UdrhQghOH`Q0v4Ev.'5md?ޅ,%ݳ!ۄ8UwڶB?3:`Z.c9$NdqX`m'\cX\ouwCvfVGM;.5Vq&m6Ukb;PHVPg7"< (e.Gzp}9S3~   * r  4 + ~ z Q "   # e & s [ 1   }D -D:1}Oidez!C<  0 Y D,  m O.tFp7\QJB5VAUK~EX>:/)c -HSx J"f]S${N#:na@Ta  [#*8kE,HFXqu&?z^}ja>i;cp6fvU2 p E | 3  2 Y k j   ( Q! Tz>m<L $/QpAbK :U}GYp&-/{!hM [{L*R-z`V lV9Z(Dp9 i7&{k3 PN5)MNMj>7<p 7QnHso!qu9tW/ Dh4#X^N':~~U \(vv Xvo06uK}ox;My(]>|yI,@kO jqZwI 8$6%fE~~E$Zl]Spvl{~FrD]=0uZ_G1 b#r^G[@k?wYCpa %   v _ 3xc(( P v 'cq^m: _!q"!t#O t$i!g%"R&#H'r$6(Q% )"&)&*'+B(,(O-{).*.*/=+G0+0Y,1,E2}-2 .3.3/u4w/4/5/O50\50V5/>5/ 5/4./4.X4.4=.3-3-3T-]3-=3,3d,2,2+c2-+1*1M*0)W0B)/(/O(R.'-',W'F,'+& +&*&)&c)&(I&.(&'%&%&c$F%#_$"v#y!"A ! @C^H+OsFuM>8"4VN^_^C.{&=M$Uho0C6,fva{G^wW1~(* \| r x t E C wVD|{'?`. `   w43[ cdqy>,c3Jcb =9PMN"?mp--d3%@ y{"T&6%yOy)cn pJj1si+%o4=u&Dx10wc*}O'~m=S\Gs?o4TA#3t"q^G&&GGR 2,^mz_3|! 1can^3OzNZ%SmKKAC$X3z^CJX hW-] 3=k_NcE;Z[w + z  H % = S^ }   y Q &  Y  ^ j}v]BL.{JnxNs! .Op6b}%/.^b# #>gF/ur2Pq!Q7M ~:}Vp>QTy3 QwACE4/Oo5V ha I d  i g ^TcQATQd^Y\OHH/0n%>e a*zv9#D`#n1YIxYS\f41<_$,Hm9{|>rw/#kf]*tn(|d9hzOJ'o PRh{[yrsJY8,001"5 WF[(P=~)X=7# 0SHrW%c 0mYweQ]', /V@Y=/`?B;u)=9w-4uG e>O9yy7iUE\UCYHTM|a{"GmGS#8h56,gNT(+C&; XuST()zAze%lCK,(i+t #(_Q D:7&i=h*+jKeJ'Q^[ xEoYC"EbqmbK6VzlE)7"crF6}Ak` E s^ 5    Aeh|_& B o  h  '   t  " O rv0KF`1qI1ZeNF"xsM&>tWB) s I 8 0 0* + 63 ; ("   ~ = i U m ; D -  .z g`  0  C  c v  g 'H   q! E Z K 2 t  `  M u & I kzgYt9c5i)fNU=*Z1 kZ1 ,dC9 0H`N@PE4Z?)bVuGjx5j vl@.*L/j=Ey]u@5AYDg!kf@bJ1kbw|;?AKhsE~!c$X~b_kR ?<{NCrwdg=7CG!" +S_ -$rs"u#k2WP,a(36]-hV7g ;_}i\,Czf22cx\"E2 HkiL3d67!g\CJI[4t `RwPNLIg !Ms! XFo]G>6QPSxc[4k),#gS8yWjv7e&;l7`]64vDL 9]T+'5aX[X3s0G L"-t gE] j.O|&EsNuV"kqmd,_l2^3W \B^iHcf K.@i D[r!ed oKr.@m!K@$Sh)\Lz2muZ0,r,8t@DT5]8|ByqC y p|Q<jQ6V v   )o Td >  E y b7 \ H    ; }^  P   ! ] Z [   C m  >  ) e <Z,EvutmgXVS)=c`_8v)nDE0w <l.pi{df*"uh%)@J)`D'ydj])m|_T < i   V .  X   +U}5s/G lj   B Z D _ F   K++09J:`PVg8A-%,aU{Yad\ionH3D%KX7X +](>1"nJ[}":O"AX?18;J.DMw_/$ s/%2`mOu%S1Hxmg4 7&X9e)HkOuE^.O:.X)ICs no5qySS? u+>K-br/{*U4c<\ P,>>G;5U$ Ju|1 T /f|i[_dSDC)T,"6G<-d-}d6" %-?d_e=qsMn'/# "\l$uxMu}W F-H0zt|LgCVH@X5nGh6c,{cbdcAhxv{gX7Db~5eU:j>BnXB4IkmtYtFnth]U>(^ k}@HXO`~j1^N2;~)3V fi pq(bH=Q(q j;|Cu)d> YiUHo)].t}flSZ~7u56v A T7O 8U8oTr*5'6N7c n?F#N},{dCc>> k^&W% tbG 2]&Zp|([9]L!.8:+2%R[j30 12HIFKvM9?C2VjTtvz=vH`sVI7/qMAc}8\SW:Xex,F7X92O5 +}g }K[bEeVE_iyD$/i%CQ"kaPIEq`9#i{I-0cR{-IUaDj$U$0opT`6]9xU}\mp, u   4 M B [  T !V)1Z>2Vb 2sM+C.{\ jI44T }8>vj4L!/YuF6]$fLtX, $ $Q|dL?;"Xf> Au`z\.EqD|8seaG1&~Fl~^My@wLwjTwrn(i\pQ[l\IESX.5YG]Z}9"NnVx+zJgnIy(SmUZGy6\s(Az_rjl`$ $[.o'>Q`osa%_RnFB&h,+#24a;0it m0VU^"w 0  g u ,o $ Mr  o & U u rtHy=V8SA0 Clh: jOk6/y#0Yl +^r~TvY3VSwIZQ`:.ms-OR!O[q:G:a'[@ ^vufPk R{Vl[?z]"P\ ,);N1H%'v yRE58:J4>? O|_#pD &0.9Fyb u7:Tsexkw^5*FUQ"7mn6Yi~XijQ sijjo.[v v@ w ? `  \ q ?  ? D q   O  J   6& Kss  (  % n 5  H @ O < z [  U K  }  f  o ) Y K S 4 1bJ]!Y1 BHD@vMhaq^mhJBJNC k,-}5wff%ecf{|)[ masi}>& XY(`DayF,1FX7ۍݐMV!ڦoUܶQܲEܹٺk6wڤ?|XPܝ[*-؏(-M9ސ72ݛٔNeܼڔ;.GwEnڌٌٞuهWEٱk/ח;oMܘԾ|Ըܚ!݈՚I PנUIߌ&܌hePGS9kEJ7>;du(m2fh9 7Di6( ;(t7lKTw*Zg>R>t`iF:AH9e4d7`7h&5*/x8P"i/>&PiP  |WC}2eZN! 9^  $ 1! = T 7   R n e  5 C . F 'E /(.h/1` C>m "EIj~tY{)Q9q%IYse;ANlq!=8x1Dmy==!` 7f Da 7 7  :  $ x 4 R U Z g h x  Q   gd  m1   V2 s {r O F    !m #r%!nZy)gKcpb@]jmqvePY-2s8)Te,"bSKdO3r|Uz<] 2 L[F~NWo'zpߚ 2ަJs/.'Kޏnގ69ݬ?gCݑ>#ޣ YbpB [2\ D>h3 :=;e?-T)ig%7" %[ {2=g gV6lY >f^U B:H?WnTBSX 1Y>N~&+z  - k6{N<} }UxCu+f.EOT l@| B mAm6! g  : & I I M 1   ' L -  b*  H `G   C cH$=J&-ZQ*j <1gFU4Z6gP`es]Hg?["b%nv~Y @#c#YL@QI!b0uoZaLX{Y@KOVl?|<)%+pLp~L|R%RshhaSL&F^9lg4 `(65    U y  2   o   Pa - V" 1' 4]  "  8  r   X y  x GQo  .EjZ}zN3{ w D t 9 \ 1 Mp"^Z~oVS,g9  'z   J  =  7  O  Y @ ? M   O  -    2 K^Yhl`NG3,5_3$R1})khC?b`!^d1G|FK7[pI^;5?j@bl:K <klb[[Ol X]Gq' )tY)0n?yj'8W@{z)p.`B&E#8-{382 skxmz Z  u I d  J v  I o ' D n c   Yy K $  # B} [R h6 t |0 zI   _   J^odAA(Y)K0+C0VY0N Wb6; o  U     | <z 2H]d38=V?e8QTE4  e xFE 2'L^{Z223;3MS<+AQ1 H*I~fG g{ `ve;Lg "MmuUuP!@28yi'- E8E({8\2z*&EgX?'j!?znEI-O50cG,Xz(8x&WE2#:]p,jPW,nr}S* z-%Cr%D^[~'}b;@P:mb$~/z`NTm7D=]\ d,*Md1?-eb : Y { B W  96h"}'9n%Gwp-76-2tO;n 8q 4  T  L6waf6r   T 6@@X{Z3OQQ=*G&<!10x/k/kN U K!!E " ,# !#y!$!K%6"%"&# 't#'#'X$U($(R%)%l)&)A'Q*'*(Y+@)+),S*)-*- +B.J+.W+/D+h/"+/*/*/`*x/*Z/)./)/).).).'*.*w.*e.t+W.,F.,0.-.--".-.}-..-L/,/,/q, 0L,:0',^0,0,08,0S,0v,0,0,0,h0-0-/,.,.,-+, +*T*))U((&'%&e$&C#+%"H$ _#f"Z!L  >[skI@  2 y  O[-{3|i\vaB{U^`sh,B]M:6i$8/&GJ{x8`XP[kVoj=/SO{VOByB63$.GY>{w'~4x7oHtalkd f+:PVQZleEJ~  _x4^v#R1D00pP3Y!c7.Gsb^2NE%JC$EJ;2BXeeu<)R|)sex,#Z+r?vB9rh ! [ d <  "q!g5dszRLKIXpc   uo 1  e " 80|%&e$oJ -[p:1!Eup0GPF2+Co=G,/u51ugPb8$RCi#Eu%{A '`-17_..e]t9rZY9ohXSqK]zl܃۰ܕZ4fۯڒS+ڣ0\v;?߉lXܝ[{g}+kGME](}49pe'W}~uZnYP#= tI,N{9i_7dk]r&7.^\enN DOr;5ta1TXLK)6]l_j\ht *GlTXr0 yާ&މa2iޗ.Xr ߢ0ߴ+Lߑ:jo($d)܉H( (FI*^YCnqa5T~SO0^?,k1GkU@)K2nc!;H]2INVvx RZ AH/>a57 c  I    Z ,   j  a . Y  J  V  n  t @!>) l C c] S * = z W 4 H!  . \M~@FK-m*mJDf,:cOK3+ mCrwUH<[|Uc$T ZtS?s2$de@.߲X!:߮$2sߕq*I&T5PE{c߬;߃*j _~=JOZ<e we#}fLT2s߀@߹I"%1jq.rN6h}]`TG.)21zFck`XLVp yo)އze,.|fm߯@# \Kv#$l9GmH;  r3rXܚLZpF߱K%lؓeج4ط ش׋ߩClGH ףݹu&8pڎ`G6+@^=٤֣k֍׻ܢEm(HzڭN܏PA;ݜLlu.`݌3mN$_h3&e)',oD0 ?yJtdMAKSs( g kFcaZ <,OX/ BgX^'iHuh `{Z-P@8RQJ4>jN U7*'5,sE0O| jgb(X811xs ZD6)r;E(Z# k r  -l   e p @ O   8l%W+BPj ,  u  Y '  N1   S  r  S* AIzc_^~gbiQ3ps 1v>fLmDN\[f @1Y'!LlZge>\VLcx79&r [\%+r}`SIO!~N8P C8N:P B-o@QK- =\61\%Rq_x @t^i+jIn,vcJ|rGh<$/5)00\zCiunRQ5Uv{&dyY}=yYd^r h(^U7 =C-'hBi2n;H=S(Q )#@~GfBJ%'WR}bGG4 Yq@s.8Fib)mqjr,35 x*8}aukc~_u4%\ &"SM   Y H W a  a ( X 0 | O z B \ k : ~ + =Qh P :\piW-Xvk %Iso 6I8 w  ?  | F > S A X  + *   w  q $ KM1X# j+:N <Zy+?|w$0P9 pO-5BBPAXx!nsS2'rn I q   " r 3  4   /W J ? $% V  b  ?kysE1o#>u)s9ceb   p , 4 w  W" 7?*;z-  | E1 _ U o)  ^ V%wv=  b8*6Q7kK`3e JKp#GIa[Z(W$4.\ t Pbn'447N*_\5ZjE -8_"5Qe0n7 (  g z 2 ` ;  J  \ Q L 2  M 3 ' V d X [ t w _    , = Z n g Y ?  1 a W | <  K ] p ' b   `'X%4{*2_#@2Mqb$$+?R7UfdA;W5.I]680iuPLߘ߹[ߔ޾pER}Vܮn5ޗ=4kl252S$[rc@Dvuzv" H=Er~2Z#\J#"^3-Y&gxJuSld?9lMUZKo p`B |GTK~\QU*D R"[01$+br-B /,)]?)oiw&y?j vB"kx_   4 W p  u      4 # - F  -& p2 VReu.z+05c(}P5f?NhG8,pY)guXL;;ls)AsHojo ;8]Y]e.)U (Lcl;o#>duv)8.];{~r/5j$,]Wwb6As6x2|}_7 ~ Y 7  m S {  i  . b b B  h w  S  C T ? P g'`X(v! !UA _ x+rx9'/>Yy`$U5Z<<2[yA1?ID*6YMXn6,s?HZj&tFE!U`A|>;ߍ޳ީݏމݘސݸީ2PޞߴzRߨz޺ljZ7ܡ{?Cݽَf7 ٓ2٤KQ` uyٰXt%M<װב8M֦Ն/dӪջӁթ]^4zԸ՟՘j֫؇60DܱDvX$Oݹ"Ih?rUdnLV{byob=zwJP7:*[\DD8 PcL-=K2spC p?T\j)|o T?G!S6#_e#^w[T<Owl'  @ S t Z   j "2 L    2 \ X X J e C T  q E i }n q ._ kD u q 7 >  b 9  | f ER    l"x3y~PBPOl*'RvcIW[o_ijif}2{5J5&5x(jc+g,PirpidJ^\aDu"s 'F9E Le^uu9\HUN&&M 6vh$Htm6LaS?n5x}n_c /W{K&vFCE 0 9 C (  a@ 8c e a 7E t  # <  ov  1 K cH&`fB20C3\~xpAn( y 0\   DH  R  < >a t  $   NX4v!D<vxd,5a `r .  r Z ?B ;:K>qI8  A L s  s ? ^  X i U6 G am o.     ? : l $ / 5  r x  [ jEPVq185DN)W)= &  ` d6s?tlo)37L l  S \+vCQ0!Ui,;B/NpA\(^ 3cHS*bAU6)fS0AO\P#NxEm 7!k ! g"!#"#"#Z#$$$$l%,%%%<&%&J&&_&'c&Q',&c'%Y'Q%7'$'#&"O&!%!;%$$#"RJ"!0!  j@RE#$&s TB{ q*=2=& m  M$ p[ {jPr>'9 sL R 2< 9 7 UO q  x $g0muLxhIA(DFc6r4M XOH 7 vX D  T( {&.bb  Z H      v;fMdZYB V  D > vu   Y G   t 0 @ - 7  " * * { 5 & M a N i z   T   ^   j K {# + @ hrE ]~0FC 3r1ofPZ9hskH-!}RX5)+ >1 ` /  Yx J =1 K m & N  0 ;`+)YM*]D\5i4E<dG  N    h 5   w =N   } 8- l ' I    m u   - W G r P # `|  + b W @   mW 5  } } s g _ { f  Y  G  a Q lhXG"vw#2twWZk2P%FlRt. H!?m"8#W#xY# #"r"O!M OZT?_a1%D9*7?#MV00{DL.jq?< `?  {  = ^  2>:L;9>A;[<4ez)xz e!wNbuIn~,8!q8/sV#/Gve`DS^vH#-AhH$[_ji)z9h:UnY>eV J\wcf+3gy6eq[ GP?z;x7XGhEO~F8%cHE%AJto{ZB2`| j[)(Rw?"!D(VXv1=C=~%4fM^a7xH"^QR sq_>a6%y9P?2C0-FF {   )  O  b S T  ~ | ^ I C T 2 = ` B  }`DQ91CYq3O# Z  [e ;      r      WpV}X$W  (  Z y 6 !P ( ? { | )` a K :  8 rl vkf.DlFJ  o&wtqz/AENYKF =arUP'^e VJ>-wrLGm  ~ ( 6  b kqbVHT n`   2 4Lf ?{C.6?+ll :Y:R8oo,\9 y#5Bg@%1mN|.tt"/vi]dQ9$WM 4 P   /  a =A 1$P {qfrlazaN#l(O}ws oj|TMrO s_%'TTd<SiJ%NZ5-P&C`z>S  B F n  Z B K 1 6 r  ;   "U  Dba79ABSk}u?o6D;U-Xp7I\ VV5x%<%s{R:o(G Ntnt,{H|1T   2  z'0YEC;A;j8 A/ Gh%]gRb[m GK:Q o!z"'#$% &_!n'N"(@#($ ) %P)%)&)g')()()*)))))).**=*r*K***:+)+)#,),(,(,-'k-&-&-(&-%_-y%-1%,$l,$,$+\$+$*#0*J#)"Q)H"(!}(!-( ' 'F';'&&&V&B&'&&!&&&Q(&=&Yb&&6&':'''kF(}()'z))'*@* N*^*B**)oT)(2,(f'l&j &eG%au$l#&#"Q" !(! & wH  ^swYZ9*4^n#t5sY^II 0  6 XE<()4<+j  k {  K  : TZ oh c 1 m Lb   M*  ( i  *o 9 Q+ AM S  X t : y  ( K 5 { q  + p $l5--}uTqu02+^9#]5ho s[D_Ep7AjWi| 5e*Qh;WV9U9{ y\B'"l8"p|-Nw5O2i(|tHY#NN^MJ($;+ |RB%S: cr#_ 64T nGcrzFj^T<4mG[NVi2?<'Q3CRQ r ZuU"K {pbAws/H I a  3 4A >K?;9'XN !!""l#m#$"$$$$h% %%%N&%&$'$S'$'$'$[($(%])%*&*}'+(`,)`-+`.k,d/-a0.W10M2!1313p2425252525Y2615?150x5/$5Z/4.64>.3-3x-2.-1-$1,\0,/,.b,-%,-+,g+/+*9*B*9))5((;'(H&U'@%&D$%g#$v".$!{# ""%|!t * m!PiXBw UY:YE ~W246Dm274o%w_j5ffoT5X+\1# Wp*'q  GZ  &    u  $ l#90  !D!""!?m!l 1 ss^;K8*f!+0q::C(n*2- $ O     Z  I {*=CI]cLXa&DU:f}M 1D[bp92߯^PߞWޕHgݣ/ݟܥܔBw7ڧWٽ؊׫ P֓7ՍԫjdJ]ԦҔoJA;ҡC/FҚxז҆׻GJ|؛ӵe>mrָtD3؟ۮكd}ܡW݌R yܒ܌ޙn8%~{ݎڳ#8ܺXf ۫عs؇5S@46N^ ؐ;شچ8RzcڈܙHi|݇ yޭ- ߴ Psai@|ߗH'ܢ ޒzxݏ<fݔ^Zfv%9LzFR" p;3mu}pj TV2'3Gk~WtrR%6:K.wpbi|<al=irR > # *: a   NI nUO)l v~ g B - f   ` eg 0sg2y ufQ*@!F-&   |o$5I|c<aEW "p1.aq]e#Kds <n .tyZ^)uPEu.)Di/F~" 3   x $ 4g S CQ :3VL )  k S W  I ]   3 ^]7 aX &  u y  ' U  !?SA ' ? 41 3  W    I O]59xP7!F_jN9|]W^PU BDbs nZSKV;' 4B~I$)tR2$f&P3CApv,#T?2K ,xYJ vV/ J(+\)@W./qquFt^hM$t55]Fieg8fF@OV+N5TFqKSerOZ;f" B!d y~}qQߕm _߈ܮ~ަ܅aݬݚ gߙ@X@G9Ss} q?~Fakw?H c"v't q>alA#<~vj,I kk ]   VN <4,  l 9 & U v  %  ` , ; )V W M  ) : @ P 2 u ^ 4 x {  }  S w 0>  m ?  n  I X 1   Z " ,  - W B O g c p k v 8 r  o [ ` C /   - ! u +  I  amjz+@RXz5Eng-Ez(dEdN6( x{*C&C. - Z  S  = @  I0 E ke | > d { [ (  g  r  z  z R x  2    .  " L  QZ   qA  , # 8Qx,c#?lH ;aeeT<(^)\+&e>/xOR84;]:_v2xj/wT4*'|TP(gFk'$,$Cn8XyIv=Z%[t\y~"Oz"[vG yO egoH/ ~';$]xgv;UBK'mBy9~k;+ 0tw[ OTae,RZ )y$;94p}{`NEc>/zY4&s"Uec5w /tX[=ZzY^C % H M t  5 i + ( 1I   `   6"4C^'10>D{ur&& ;!!"{"#Z$_ $k!5%N"t%#%#%0$%$W%$ %$$$$u$Q$@$$###T#%#"""Y"-"!!!T! ! a O  ~E5E ;  w!8""5#[c$~$>%d%HH%$gf$#"f!I z/qY,CY3tr[|~;u5_% vSFO~gHlclxcK]"T4TBu"QC0sm~ E6.`0mg&|9 ]n4) dNL/%S$FvAddickH<Hi>2LI | 8  *  - T9 II1 6 -|    |!>y&q5N6au]y9P-s`j_j2}V } k3yU $7y%:m)VOzofz/n0(KLoJP:f3+' /z|kd]  6 k[5h2t<S*FW{R:z?H ;aj"/+ 6'Gj|vxUpBF*\8} SMVUuKz;F`b \pl">VYX,* -iem4 ."7Hvkxf7S 3 ;Z 1   r0n)k5qH}3z (o m p ` 4U=-2kd)I]})^j$JBlWCWO-!DM lxOK=eze e)!!/"X#$$5%%B"&& &P!&"'""'#'w$ 'R%&&&&&u'j& (>&~((&(&)%(%(&(&'(;&'j&&&8&&\%&$'#&"&!& e&% E%+$H#"!y _J!r_F uXPJFXy2& u (  5 _ h  Lx^s0+HR}B}\zl@26\F*6N8Ni} &3+P^=WT e^nE$y04G}&=jK6m>8Yo!&p '43x'wZT^1QtnA ^) l |>j;+.|S0:h,Yi9wsIG/M:0v  <  > 0 8 R / Cd "O}bi,DL@r?/  O}?epDgu1K(uL-mCB __"\ ^ L~6zDNUN%@'8{83 | Ec    ,3MLidTR= ;wFw+v=0\[  ! l#!$7"%"&#|'$($(+%(%^)N&)&!*'*0('+(+)|,l*S-C+.,.,/-]0G.0.*1J/U1/C1/ 1/0/#0D/r/..G.--!--W,C,++**E**)f)1)(('D(D''&P'%&$%s&f$%#o%#$q"~$!$z!#%!#!# {##!#! $!$"*%#%v$z&p%5'l&'v'(R()))))!*)I*)+*z))( )@(-(O''A&%$##!!"  h q6|jiV=a)$(C7#!  I   ,B 8 M 3& N   a&   Z Pxiw`df}0 1{zAJJ I.`UqFj,*%q-@KlRyi_1 nr B3oM F &{ [  j #    8  -q)N4|j HMW3h;X&8Qkj!b IAKFJlmM8 Kq^Zr7m8 n>l4qR2JDn6!_$NLn@Pt}+gl`:#%!6[u T X t 9  + P U  KF  > .g} BX E ;o C :    T   l +   ) q  (  k P 4Rl E I d^x}L1]M7_6[T ~2d~9 ywW+y|y"`p{]._^Y;Bst=Fk`7[<69(3!$H:{#ymjDt!;Ny $ +p -I  ^ n    4   ) q + _T e  e !ML*eqC T T$,EU4y'CO-j  x  U!&o c-lT( 0 PR o  \ m T   t Q P 7  c , rXy"CiwSkKr$hFzQ}pc  $/ReK-v`#F3KO,Igr1.1l))thwz"8+sT>83+s~\Kx|/>@k?+KR<fs;PSsq6JXD~  ~ w    { f 3 7 l n k  4  #   W 0d =   ! .h I) x  z 6 b e  t  & 7 ' l t ;  oHy1Hd;n V ~ o Z z  b ? sH\+p> bG/E 9el1"G>ac S-&^FbvYNw^"dYM[gO>*8Q2md_f6B uaB5S^[1Vw~l6|w,|1(\J4-nzGYA:&GC)h"_ 7B%fE 0f~XyNqt8-+0#5:bXVkRJa#ywHz^}+n7}N(k=_skJG,p{D:a+n/ ]#fF9^X*X V+tI@R`i5IKt:v [8W%0|H!RxD J 83"w*W* Az0e8dv$( < m \  h *  # p u R i, '  q  W 9 ^lO.T9KdT 8 2 ~  V 8  t E > b e  ` "kJ)L"A!rHw{%5\Ly:I(e;nRo/a=W:b|301hrfQY/b+fh(3t 8&/p>do o`svg=c\MB=.#$%[+)8)I>_nz0L 58^ W > } E 1``1/WWE}ue8K Mc.ST | p ax =t s d P  < n  &d  N 8 otg )DHU'G e_+ f&[p((u?1't-Ez-OzD/`X7):ahn5l]uPSE5.79WPq Oho wa 5Lj Z=)wEPn.|C|q~S}[B:z~?"S < Y*6;@x8.fQyN!wLT1!b?aE*g5K=jx?OJAq/=[QVB:$U%ETN"29P'7F-ka'z|iqv, 9LvBCkZ2l,%\y+WcyUx.[Je);zI4Q*"MCn]n5pDk^k@x!@@ot`iq8Ss 7:b|DcTtHaivfZAchUnfj5}](y|9W-ߵ߱Oߣ޿Z޸߾ݜ'w߁0G@ޢڝ(ܶU(Kc١؏؍ؼ׋փ^֒ծe%8i;յ}cm;ۛפ`ٔnS#cnތ )cߒ޳!N K ph&^9Dzr?m!0@fb1({kPI|52 QP+w*8kq8r\5DFGO\k~\@B}\>8/("4eHHDO]Sg^^gV<~cS   P: B   = \i %o_lH*Wb@J2"-w2/3=*`-l$Q-X0q7%hcQx_D`6 # +%cf|m D&0Y$,u!7js,B5`EEq:mz})?(mM7.q_W{Hd?E7c[Mm CYIh4a mTMg=kWb<0x9_}:6k/bzk9jAoBL,/m7r#_N9}/S}*`,SE1H%k߲K,cި Je߮J߻w+>Z ߈ުW+s݂B6}N<" GYިw +Fc+ijdISbqmY_I1 vsdL?u\N8OFvF|& s.*-L5E2+|M"yV 1Or%z8' |O 1qV" d   c ^ I  c g =  N "aX  8 U  + z ]+g^ ) q! 1#G"$#%$E'&(')(*(+K),)5-*-*Z./*.*//*/*/ *Z0>*0{*T1*2j+22,3 -4.5/6*07B19Q25:K3[;?4<5=5>L6?6@(7A7B7C=8D8E 9F9}Gm:SHQ;$II/K?K@L'B^LHCLZDLD=D<D;C;BX:lB9A8 A 8R@a7?6>5=45<4;3:L3p92O8X2C71,615T131201>00///.F.|-g-_,`,K+J+;*4*;)(9('M'&&%%$%#{$##h"f#!" j" !3'!+t }kA6OgP 0@ X v  |d6(g &HJQE\B)!<3WX^*-&'gO~as \x"@,OOov(a~C qC? Oyo@esv9%GIRkPEL[g^wHmD| H{OO nK-"eEbg4t, Jp @ ]nrVeJ 3UI F0_kHTjNl[$?Sr$3rtvR0,6.(220 >'R$yh4"EHv)6y_\C?*/oj[o?l2*3ZS9AaUQ(1 GeK'3a}6b/|V 4_ Os{b>Ak }thP ; N n S ]  L SV(g=7w%~? ; W Se b _ _ y  Lm      1 j(   _  1 i i! -   8+  V !w  $Dxv vQ*.IzQ   !! " e g);#%JPea//ro# ]~sj  N 0x %(MBH<=#Rb/   I $ Z ,+ (O #z    j 1       0 %T-Hq 9[^e Z/ :WLqN} L  $ Q( d f Hz  </ol]r i6t~3|S7bH"8(H Zvtd:c7 mH#a]5 $;N\R7UX5:<d-!\p}?U1(,gWs8)[6&wg6NFr qWO+*2c:hdj_TpI0>hF^8 d m%(cTx xF {^&A;81'2qr-uaZ`/zPx%0+)+%<WoupAJ9T% *y_tw UIS[5 8 c`ryd,LS.b r r N 5    :>o_{h|w0N PMtn}`:'wOVn=5L/`s:q6OgcYf#2{_Fps5NDg; iK0!3*I|Oq!{ h      4 }`T*D _NhzK[2yUZ2(( <^Kj !L 'HRcqVf};)erS;5g%>l5#7!+i 6Pki 42)" g,}J%C+CBJg q o  m( {i^?ySdp%e\,yV W~[D.)]O~8 $skNm{v_qm0()u|H0ELh(LUT8 cmu bU#p7!cASz$GJkV7yf>Lkrkk9ICRpaB dL%yQ[*^}O%[?;5Vxbj`F0jZf#DMEpWpM 9> ,@?p~5I">h&&Bi/ &~T{96[y +o(1[ '/vq1K4J\&[w?hUYy-yuPOVr@_En ^sMu==Sh i n ] O 1  x .0 3d [  ( d j  l,)^|J*|M@S:hq+q  D k g  0H r  *    2 C ~ _ > i > 1 ) . w K T H & > 8 . $ . k  " <  W &y0B }T>' / T|#0Q1hl (Mc* q      ~ L    a| Gw :| Q   dx  _  ) B G O 9q"3}0*  mk  } b O} 2    @g v Uhh]K==/Q'|"tR %]NR&}hVC0Z-71;.JFFK9cX&iS4$'Ev|;*o)IEN06H^X\MEKQD<!VO|pKD w[$WXq?8Fgt|\.(\hV#$;dV`ߢ8hجY!eְهpSOP~Տ[|*7!6wүԬxIcҐ70(*_7Ҕ։`-Kr՗֤$BaSd܇K ٢t/ًv<[ވXy7[Ey@K(nVfc34dz CVd/th}LI2doAG  <K b * b`kP3OyiU(X9rF@Eo OBh#/ U e! E"1! #\!#!#!'$!$!#!#! #!p"\!!!!! W Q  QWRl0>NsSrE *r(YX4CnJ-+5?KkN1MG9/J&$9,9A=PWcfnsucb`AGo'8   P h #  j F  0  } R Y M 0 z { %  l " @ E 6f ^] 9 + LTMnpn+X).(37ipuX`8Qi2I_PY7s We'!ds Vt9M SkeHa>xOet V1fn6ymk F#|4[;o#}p:FCLwJ4,4\ET8L~k>2Mhnl*Ii|`1EzMMIut_36`VPqhpFk#IuU,   Lp  , A a ] |a h _ e  t 7  ] !?5{[ %YChcW>d.  !/"d" 2# # #,!$A!,$N!*$G!$,!#!# o# 3#{ "Z |"% "!P! [ iP<6h~& |0%rx~V0ic<l+U>jqjXNB=_ w     7dw{`E1 [f  < # )    / : @>G83M E0gSVql;S1Gh<ziuM%dk 1Hdo7*)zG).9EfW-+ yAw&8%wb,u-RyU)wDC f `7;AF>CGqTg39IPV& V`j3p a* eC-.On>];%; u`~i1k= c* m 5E z7Q!O;!s8\lb|<{"gU1]>(V.:purh3  ; w4R t  , xMb4c    e[ *R Z ;   ] n ( rU ;C0"U\R}aK00,6G/ Q!}"#s$}& T'!(#)5$*z%,&E-'M.(&z$&$%#%# %q"$!$ f# "!8!XA dZoK/2V1.  8 M K F0[5jG>f%SC~e0:'3/i`sdt[F+kM2oes5!k~Y~^x,+%>5mws_0w8M]F}=-a~S@2cek]5Ud7e` v$FtKM :g7QG@&-6 rmAYS2f[M/b@\`DOQgy@w u6~Y%|^.6kz0hRwt-@x]'Q1S`.>L<  1 u  [a Lr 7 8 P.^'AM,Zy p!{" ,#N#3$|$$W$$,$$1$$Q$$X $ $F!^$!P$!4$X"$"$$")$'#-$#Z$#$n$$ %0%%%p&%9'{&(&(T')'s*'+d(+(>,(,-)-)_-)-\*-*.+c.y,.R-.C.U/A//0/ 1P010c2020303020200_1/d0&/E/..-,[-+,:*^,),(+@'+&.,>&y,%-%-&#.K&.&J/ '/n'!0'B0 (<0S(/{(/(/(I.n(t-2(,'+'*a')"'(&'&!'e&o&A&%3&G%&$&$&.$,&#Z&#&s#&W#&3#'#7'"i'"'"'"'"'"'a"'<"'!'!}':!6' & d&R%l&%H$Y#`"@! l}z+c!XmFTL>2 /hLlN|%5J!t 2  /  I  ] f   /<2;CS]A@+_~uu)|]!y[=5 p3on*"88hawh`/?[n^oHX/ M~K'p]vLH;-05ODk5:{8C> bvg<%2{V>wI!w78Uj,%{D,HJ 3p~.JI6>G$UUYBC-?u IyJi6'"") ] 1`zqRaS<Z;;>Sb(X\ n4!ktQtRjq:tpA%;D1"cy j6[q9*k"Gg??kj7Y9w*o~)Y{Z&N7%/q:q<6<,& [ ~ s p/fH  U 3F/a#zo"Dz4]s]&7 P!+"*#X*$A C%Q!}&"'#)>%S*&+(,o)".*@/+00,0?-z1-1-1-1#-u1,0+J0*/).(-f'+-V&,m%+$+#B+#:+A#F+7#+K#+#_,#,g${-$.%.&.&1/'Q/y'Q/'8/(.(x.+(-(H-','+7'*&)?& )%($'$/&5#D%:"B$>!T#, a" s!w ~xW3"V4z<h Rj(_Thq  & =O B%c  1 \K::=8f|2CDq!Qx]v6-W__IA 7=V@3M/E>cmY8s8 clSSO@ [rivuL&3ga-b_ym,b:\j|^~"`@6"x#U)VAeUw.XDtIGH)f$O|=5~V//\)i1@M,(#t,(R>Le9I{?=_ ~%/Ov ";[#L5xR+;'!z?}4B lYxPz'.C {D(K~*^Y58RH{!>hcgg e3X4Ufv*d`0#l9xaPC#X <7me o;OK> AtSQWa%T9E?~7k?1,jI , x = q .}l!cx.^pX, $9K<E "g#$ % &!'"(q#)?$u*%6+%+b&,'P-'-t(d.).)B/z*/9+/+0,@0f-K0.U0.S0/S0a0I01*01502.0390s4^0V5|0?60"7 18v1819m2:2{;3<4<4=5O=l5b=5\=5=5<5K<5;5;U5::4948F483K736K36"352o52&525 35<3P535454)65656n6X7&7778J8*88889 8497'9787W8[67m56}4i5J342200S/A/--Z,+**p)<)#( (&1'%w&$& $%t#%#%"%p" &C"L&*"l& "l&!S&!%M!% $& $g #o"E b;`| [AB,})311yei { W +2   u   @&   [ F O IAN|Qj 9Y  O k q !  N *     P     } JM    < 8.) f t  >& x  l J,~ ]NI#jp M~ k- C C c  a    9  `  ,HkJp M [' T < L/Jm(e p`!Za_;%vagZ2hS*gl+:V:# [>BEy'QSL(ox>}z vyiO%zauhKZ|i|1F])[OIvQpWIbodELh= 7 ~ f - j 3  X } yp9S2lx`zkR\OW`sD]I1Gg{1"K$C ~{_/Cl(xAz)@ 0(FJh`'6Gw    k eO :: . } "  /  2 P m 6  |  }f  <NV9LN%<BC[:?zkW:![ |I}9KFDI!8i6{I&` Y1mCh1Y2>wP'(72^L"n?o@? PF~!-u~ ==\Gc>LZ-Ug~i>&u86 _ 4 O R  P   A4 zS R d ^ Z lu [ A , 6f S _U>9;O4%xXE5aK><}iS, a !"1s""H""":,"H!%!w %Nxd@j@x\8E?:[9<~ I 5Sl_P"(Q N 3o{O+6a<|xKhU*7s Dcngs-  -Mm.ZoxbJ guvSC+y V6wz>p}v>b ?5W9_bX#cv J`8T7UCm$zOeJ!*PN_ZXj{ RoD%b-Prw>P1*p6W=B; !Y&0EiN.%'O}bc*@d '|AI! U4 sT@,$ExU8"JcIwL&9Zp-xmphP;#q:*_ )tv @7zIw?P@QUGFH,M=|F`'EmtY 4[ >  ,  f T X e_&v pe9-xq#k^ !g2L2j -!!8"#* $ %!&B"'#($)$*%+z&F,,','-.(!-t(,(,(+W(=+ (i*'i)I'R(&Q'A&D&%U%8%$$#U$n#$*####K### $&$S$$$%Q%9&%&n&'& (V'b('('x('8(t''&D'O&&%%$-%#y$"#!|# +#* ##(#ge#7#LD$$[%J % Z&b!&!'g"L'"['D#_'#8'#'#&#y&#)&#%#%#%#\%#S%#A%#@%#<%#0%T#0%#%"$ "q$W!$ #"O"cx!5 @kDr-pp^Wd]@f2q-vD}^m|w q4fHL)6 %gq<sq(a r  0   ^fFu2ykVB@' D},%8XLb<~vPn6O- d> 2v|aFi4"/^lKY#y  +2; gtwyu!p {fr*./*)+"d%AfXE;2)BZCkHw#ZDBu!DlSR},Y]gDySo7x`^Qs@AkMBPUxl~|;ff5Vcx6gY KdTH1@]ݹ:Z8Y6=ݷS C_ZW&, 3/a&J_mK:b ~bvj'U?O=Q\RPT_]VP`t3z  kZ  " g ; y  ! a  HPN   ~G a ]  WQ<e:NN3Av  ) _    nN ?Eoh>l  .  X( '   H K] t f Y^ &   f   + c 6 d\w  h 8  ? * + e L n~   =6  0\<&L~83\)I:#l)zGi`E$p P S 2 _ CUC{P910  "CS}%&zK[]oYi]SCR/1p+' x!)S)$U?^QYeg;] eq=n2M%f0aip,ZZ VrEf%|@9m<7wpOP'R[fS85<^r#ego<VomaZ%i$W _rRYdaV&8IJ`"GcLpNxxo^9NSUNeXxF|$]0LE_RmLBN1=QuA~7H ]3D!Z U= u .feMII(u kK  9 x    t  bq2q@X"K~[8Pe RF+lMP;x,H1_opO' j=    s U ]W g {   E  ) 8> Y ~      T   G   2 cw v }   Ji/r"aat5Rv !   T sE^* hk : 0f0QOzI 'GZ6g0-O;D=TT<;go.Z(Q=rc~u&Z'g&)Cy^2pvW'*[VBI .9,x>\@^A*lAo^F@NYEWwp_/"Ua,gU1q>dH7qT86cuj%r;Z;MiH&!2_=My,@mBVdfiL2?^B'lJw y  5"tcQigv[Hf O+-LZ.UQC03p0A&+'8X?| Z 7f]![tLJB7^XuU2K!1T\6WYUTib##71hHq"@U# #1G~%l 'iK&HK}UBD{?=Y8Uk&4#)4*>Wu ~j`0GZiRmmAq1l?5/*Iqu 'MnB6 |<ߍ`}޴ުݗݻ;ޯbޞސߠ܏`8p.y> wLvޓޢߥ*߸EߚjߞߋsP3&.@s,=ߖ]Q66&*, Y"ߍC*߂u4SV"Re`{)\ _u5@ ?#!j\k:Ek (VkeA@X)s 'RJqf2L2 ymT( w^ee:asvH`,^(~!Csi)y]8 3Ry_W2KmrY@TEQWkߏ4B>D_{L/,7:r= "2CKcPQ QY]is5w4P"O# J uCt9wh Y~D<shDb8A}U@  c   , [ u N   /G~U  Z   TG   7  )   V - @R  q  N   H R i  U w J L0h=IyM~U 0z ( 3 < " ! @ ( )  & 7  s  Y v  + Y oB g P3 sXB Lc MBv. e"^E]#jpCc"m$PA2/.vH%!=!T>C=E}g *GnUgi:EF^I(@e>5H_nqfVC)|P's&k8jDiPO=vD epz/0Md&x:gO=;K_.+krP_ ^V '?P'grTC\/vaV6#1(%7:JZMr' ?`r|dB8dGVQ,p[CeMlg3g?V}J[=|r `%1: YL9nw !kchH3\#C B   59 9C F . |    7Je! xku'xI~yHeYN[rTk^%BC] Mol+ @ g#   }  n {  $ K M| SoI`>;|.x  !>{"s@## {$!%"%A#^&#&$' %/(%(%f)`&)&G*'*t'*'* ( +>(*(*(*(a*( *()()J(`)(P)'D)'S)V')(')'*'_*J'*x'<+'+L(+,(,#),)2-)e-@*}-H*-?*X-)2-~),({,'+&]+%*v$*$#{)!( (T'3&4_&Y%%;%$C${$K$9$$###N@# "v"2![! =x;`G;-04N `x k+     /   V < { g l ^ J E $ 1   q  o :   2   T     nN U T jY z  , Nfs e>y[Dav%MpAOlUd`^Qa12e5}kc@/yrhmPk[mWbP[NS$, forQrn:24nrFI=Q?c+LbI7Y0NE:Y8u\j9'i @Oc> 8BK=P U w^j]r!@UdQ0$f=+ 5;S m^)`a0l  ?2  !   U C ! r ) |Z ) gOKrx[BWAEld9DaMCgLTB8JNUHs7rLB+2G K?v,Ivw{/ero p VK H I Rx ] t w.  >  p~wpZoE<\~<fo@x%'3+sc=BC)PaYA"pvaD maq%[ v)=o{Z$ aE     `3 \ j `6`zTS9 9< YC  7 m  '" hx d  w   @kN ;4}2/)9#_PpLL8c8L(c: =b$GqjL-VbKk/լܗdۅ/ڔNՂЩ/ЉGmKu{1tPˎ\ɚP(fǿŶu7=WƎG6Acv™ʑ˫ V.ϟ!&˭;:<͌ ӄ85S{ӋS r-իTw֓eh4tّۉܶ ~y<[lLI4|etNm?=nIAuER\KFowlg:R8E}>ny\c J _74&Pv;"M#3U|.*C>G4xD"m^jPYyT(ya3I&8X^F\Wy>'|$2L  O      V}TAa`;q@!P$Qm#Z5Abl((~;|]`_q  ^! 1" "u!#"@$"$)#b%#%$q&|$&$g'Y%'%r(=&)&})'*}'*'+(+/(+"(,'-,',*'+t&P+%*$)#(A"' }&9%V#"p!S @Y2r GnKd,I>X W12   O.y\ T sxgO1+8?RZ;zHN=lW@Fa:,+-Vji@5LU3JL,UVj@MvVqFK;S{r:.j!@>u`!8xU X>FBD w@ EEJ`mk>)Aa!&o^+T &]m.$00,3$td 1 "Clz7< }Xe<~i .eQgO!P7#D1^`*L1j|r!+6<2+j)VguBA*a  =]  j   1 P  | kOvDpG p&O604 bxG0 \3!!J " _#r!?$8"% #!&$*'%;(&r)'*(+(,)-"*.}*f/*0*_0:*0)0(0(=0,'/B&w/_%/$.$R.#.b#-{#-#.O$?.%.%/&/'20(0y)31S*1* 2W+B2+Z2+Q2+22y+1-+1*D1S*0)0x)Q0)"0( 0i(0;(,09(k0:(0Y(K1(1(q2A)3)3*<4*4*K5F+5+5+5+5+5Q+35*4f*3)*3(62(/11'#0=&/V%-a$,#+"*!)Q!( 'R &%$d##" " !5 QbS9r ,2{( ia32o, 3'dN&4/tp9=?41aor/6hEqs#furVUb KT5d~i>mB}Fy3 C'ZU/CBC6H@_%^/ Q,   8   V w l S hk u      ` '   a * \/wTk1@GnOJq(HWB=aV@h!P$/>bI(c ]t}@9vV7 Ko (o(HFvt3(qxSh8p0U(^$g l 6 j:3H S0/#S}{d4 mj6/nh~]{EcsMQUpxVx<[RI-A_x}W&, 1uxF B3?}qwR$>z1LMs}&S3A-GBN |Z,EX"v  Cpf8Ho~ A-r@velM"!khH-R-5#'5zb3 > z ON Q h t   N l   g   D 9 C P  r Y 7 , kC W     P1 N BH 6  # ] n x E  o X   D w a g    . s + M n O < #  M  @ o] |vyK; Q&A Q   b 1 , " ,  7 i ( 1 [ k  b 79Ix9sv%9 )\G&BNQ *la=4Ye}*k/TyL  r e  6 D8|7`d^MJ-U(YFGSDHWqi,pW:P!)@>KS2%{]QT]k&2J1NnQ{P _ (e *q9|.zdIEdv,`5lficY`;mjHq9"?5?]ZuW7zyD:e4R9G?8TYhq#bV9&H `S1 r[ Zt9#3,Vf6 D = h { : y r _ [ E e ^ L { M  | u ~  a + C I A 3 1 H J  A  _ )   5  "  ?>  t | q  5 `U -\ : !K6t%*}|JT6wmX_[bxlPbM ,*iMU[mZ`"FK,y!Wg&VHHir7nztSkK7H(*5j(%n[(Mn)P@6/oS]YPu|([NV yT pS;U%   4 9 K  pP _U*TW=3?V P }uzDlkf\i:  Op  W O   " J   _   # t Y < 8 4 J D h 0 Q R  >i   > U h t Y 0    0  } U # L  { B ! o   R)  / u  j CA/q`j*YigUGK/ *y4zzQFNO/ Jl~ { E   h * ! A s N ]  e{_U`D;Xxkol}Qqh'3mx6+0++IHUkP}c!J_Alt aa~ g1,8 eMT i9NA 5? .0J8,5wW/R Z>~\gj! T.Zd05) v? -$o8Z^!8an,_}dM("@(m4YX7\60e E  u W   S  5 ~  ^ 2 ly@] V*Fm1wM9E2R!YKSc2 H e&!)"##n$L %M%Y%u/%$R$#X"'"=!(\ <t,TJv@MC>rZ   {! ! t"V! #"#"$#$/$'%$%%%D&A&&w&'& (&(&)&m)&)o&-*I&y*'&*&+%1+%d+%+&+B&+q&+&,&3,*'a,k'y,',',','-'%-'B-E'N-&:-p&&-%->%,$n,$,h#+"+I"h*!)e!(!?( a' &q %F $" #"!id ={ #Rkp;w7Ibp`@:\#$p(gd&@[ iBH`ixX`{k059PYa}_SP3#?0_71sd8l :  n Z  $ o ZU ?R >P v  ~ < 6 x 9 (   t N9W-hAQ B`ZdbwA 1J{CF# R:@Dg*t1kq     B&H: 'bAcAXoO[#Z[2 {):RbRd-k_w?|#z2!O+5V/Pac,# m(0B iO7pmzQ ==2{=`jr_a!n7Gy= "FEQ uK aj)?y)%a\v- ,Y_#YHy44No  ( ! : * b  >^     #,*m ( #   `d x #   E m  # u]   6   ~ #4|^ m     $ G9 N l o '6wR{5-Q %`/7Bs6:-Opw ިae޺ߨ{j68Vs[ k tA5Q^J8i#(*R"v9`<_'5&%)|"BRS?!:Du qlI|Ivg/Zk? Ek-d R p o  }  e    Wdhj jV w o d !'  / CY G\    t  )  4.    _d 1 ! U   7p2]k&*Xo0,^H  _YZ+'r{? zbDrM_C6=R{gWg-jN])@qt  dl - % t Hf4Q<! {pp s^IsH^sf2K,VjqQsE9C85YWvFK|]=YbwPSCs#% }J" h?=DR4OCKdloY-ZG5pMSJR"p]LxB$Z-;{Do%8J90%YbxW<ELZ'f d8S YB+'TTx:T<aD-_n&{+d?e?AAZP@.8~_ngp22Lc_76T G"@2Z/QUKW6cAHl{  ) ,  %  !  w  ^ F P% q HoGC  Z!"#A$& 'e!"("")#-*<%!+[&,d',I(- ){.)6/k*/+0+,1,1,2;-)3-3N.4.P5z/6 060S707`1X8181 91C91V91K91*9`18%180"8h0706/T6}/5K/49/4/3/G25/1o/0/00/0 / 1.1.W2.3.3/4n/w5/3606v17.272m838v4858585H8,67@6?7.66655`5U5443N4333x2#312)110F1/0/0//..d.h..--W--,-,-8,-+-+v-z+c-F+$-1+,+,*,*+*+*`**)*(a*3("*')&)3&)%(%'$',$D&#S%T#U$"F#]"1"!! !3 C+qmn~wS&IbW0.5y$;6_Y:N~QaLYf,@c_Wu^4;+ f|F(eMwveN|eWz?SiE 'jdF Z   > q  n  , g W S   P  |  F   ?  0 ,R bS \ L v C ~    z" ~ q2 P A v  H 5 i  ,|!^" y+PSmg( J op i$ `24F d > ,2;\UR RbhWEe~L,OKwa_" l 5 X -e `K <    D JnqcEFn"p \["7<U*,j R ~ Z  6 A   K ^  G   : S?L#dHm{<uDx44;!?+~p'Fm&(p+9>Ei! M w x s X &  S b~  f  r  nz B  5  _ !  p ? c-=lV zjtA8#pZM   Z u  0   7   -1 K  Y  c{  k h &   w %.FkG 5 } 1]<+b{7G_Kp2yQE>(%DTr+f}yK{XUC1?"-;~g~@D|V45pQL^ ="A! "8\F9p&mawN/0tXlAs^%j+~Fa)eWWE ]1.U+G2Tp1}? '  ! z U A ! 3 @ p@   OT  K  y  r  ; } & $ u ( 3 dV3)my-]gi]>TStMz&l:8mT+[c7wF) W l  F + & ~ > -  s  i(  d u }ep p      e  {?PBE  ( IBQjgap=we`Z k-xz[MQjus;`%;_) 4Q`LG36#)&,$73m64 0m* [    , E M ^ a @t  7  :   x s + h / d fz1Xa$+  y  C  ' S  BK"/4@Mj6 \n=fr2kf.r&hv@$ E:o?=g-?2" n..y }&"E*j7h/ywzzucZaw~M l_ Y0I%p|mk S vtH UZk0"u ]/S[8'>)P??qo]=p tU[<-MC!a' Xuu]* 4`Ivv _ EkoeM&u6d wqqursaR F4l7AbG1     g 1  { %  H M >  4[ fB 6 > Y `  m /   ! q0 47 @ }o 0  U5  c3  Nj)M91W@)0 eoT["l  l  =- ` t ww G ,A\ N | >)      uA AxSb2>5 E4#OoW"Eyu\`nL1y:H 0-\r`a$VMAbOVaK\t\6U:]@/OY3MQf&A\(WL$7=}SfgE ] IHeJQgEZFx:'"5%R_z7KXtL~LMoQ`G:ATPhL45&DS8o;{)A)ou+UgzI Vi^'>PrmA  7   ]  "  1 ^ q%   RW 4 n 1 D R j  N i f J    -  / ~   . f- d  0 4   =!o-`14C..B4? Kv[#e]   g :  . biu3r;s :# (d1>fY CC35<P    ! K5 ]D `G /-G|#{x(R(eP% >Fl/I*r5{0K! ^`  V   6 {Q 69Y X \()\qhO   x # 1 = T e eCo[wB'xJ Z\! a^@_E|d*_A{=JM#eiE vj;)kkvApyi\45x &zX0_+9*3A98tlG`Lh>KqFB *).NrpcO5 er(:)ߞv߂XJ<<@cލ,߇+z`U$Tp%C)tkE+DIUhvl)t~Q:q'rz:D_)wS2Z"l)E@.IPE c p t( ?|   3  \J   w 5d OM sJ Y   -/  2 ; I  >.3h1tBBb_a=j72P7mO V R L{ g@qv' \ ~Y  v v - p   l   qN  r ] 3  G 6 $ h f c )V5n#%bf!f1F(L5s^qlv1  S! !!!!>!!j!3 !  rO Q Tb99w8M$o  *!!!!!~!R ee^ uhyAI-dTBe?~O?q90AQ$>@fHE8]"M  3s a tm R70P<P r/g xv  B  g P* T>\ofMUdx&eCc%NkG3HD _:d  8 ^ ( ( d YeWi u } F@   D  ? cn. |  kc  |% j  z Y  $q 9  M iO -  ? ];Q,4S"/&m3` n,<ikmG vnK0y4>+8SjMquT8`+Zgi{KccP!mN-m%RH:7Z}khB`;he< +-3\7+1&X( --+#"fc5%JK1#-_5}\wZ}BV'f$.\{ b"xf*F|I}}??bhO{9r5[!1?4vFTHk! X:rmsq Mr W   5v q vI80x, |  L  9  W_ G(',*{84;Q9;` ^,hri`Ri & V! "y!""#"$7#}%#e&O$O'$0(%(c%)%e*%+%+%+ &d,&,&,B&L-\&-&-&E.<'.'-/8(/(Y0m)0*|1*2`+2, 3w,R3,30-3N-w3N-@38-2,i2,1Y,1+r0|+/+ /*.F*.*-)x-)H-)K-)a-)-)-)-*4. *Q.)Q.)6.)-L)-(-[(c,'+2'*&)%#)%b(+%'$S'$'%&v%&&''&''(((w))o*)N+), *,),)-$),P(N,@'+%_*d$)"' %#"O Z4X+sSvl `  O  !D O L  ~ R 3/ P k5 kp l S, N 9?  t   | _b4~W\2*" ` u i + s  _ X C R 2  d  f p < !    Zs J "  b # o G .  yC A]  \Z='% > %2^gTlX[T&:Ui>ogv4 q^KYbT,c:@QkR`J4s[dk{80uf ViNU/t8'IF}/E|H+,@yKvJ=xS~&D!t{Fu>o`~"}CJ<+<@N35+?|>,[ *Q RG > M-\S&>:A .Qj<S.hS jAYx@F4-3 `3D7!=A&xjxHpsqq1KTpd^ Gi]zvpZa8R\Pm._Ld Fa,""|B4Y`&~kP${4[5Yti92li+WrMxH.?Z|T7\wP n ^    fy   H&D~%YH  | 4.0MJ/zUP/  QX!!!8 "": " "!"!"!!("!V"!"!"!"`!"!" p" ?"J ! !+! m3 VWV9 R) 3  n Wbkw*!9c e#.k|_)#36I<I 3o  ) U @ )  ~  "  Z   3)3Oi;[CQ)76m'<!HGh<xp_'B8\D{B{WoDn8)qX)`~ N  [ F  n \ *    Fd   j>  ; e R +) F g @ q    / 2  / jN:YYNM_<4MH]p(x! .qd`bJC?0`6 Je}ha3lx3\n,d-0WMIsCR!LpA}~E+`dߨ݅ rLG@C*\uמ\d}1ez>إشٶwپEڻڸ ۪Zۡېەۊu{cceP~VZjۈۛO82pV޹B6`?rAT~"Oaz8S?/6;P(?Jip|qft<& hKZo`?R:e/zoAE v A [ Z ( X~\hl    8   g _  l @ CW)k2ZX/$}HW Z!N!A"v""!"2"+x"#A"$"!$C!& Ej e"pf-</J{c5!J]eV2|Vy4  x;ouG/:%tMQdv7,6?ic7Sz)Z=&#o-n9p DvL;txVQEF>Qf { T !L  C u   @   Y < c {  6   X +o SAsiUejaNTC aiJN V x`  o 7b  jg 3` 5$sNBsc%A@Uoe; d&p-~1IB}NY PFedd?,enwu|Vy$;l%hT#\I1Te\|\GI-=c~85pcw-X%B:4V`KOjE _kYh0JtNCFDx\|mGfJm?`2$zz"]55 $pt~({ptMsxi;QNAq8{]93XMA$)8Z. E 6 _    Uu6E+L LsDY7h;M_Gs%}c_- C T!!oQ"""#.(#3#(""h"!! !s u#q>?  #!!!J""""" C"!V! p0]r/< 7[2 } |?vG-|J7TDz7 G  O }  9 Z 8 * , 9    c   P  v  r} C " g { w ]K  @{iMa&t/} BX1 * Pu L  g d  ' h     OJ   _ x @W.JtZrT)E h6%:xN9YebR!SYj :-Qf]!l&yrmgx'gF4* q*8ib/YAFYs}VjBj~ L)*N&_u$w7H.- <bYbwX_\a$2Kwtr6&F xc~?3XSO]? E&xAh$ *3G{ ;`   d 4  '  Z  3B[Q C2|T`sXTi D8Fx? ~6 0 D= _ H $ * : R   | J  g  r |N : J g  & u 4J    q+zdSon(b*L&Peg^.8   m.!!~!!3"u"""###d"""H"C!En!I 9  KWNQs64F~'` M'`h$,V25x8^ysU0{%R `  NO HoqZ_oGnw/"6fy~.,nzgVLgv\K  1Gcw"+$ D,5XqD5*wNfU+!$:LAsK$~r|5.UN'x65ZS !f}%'o fn`cks$k50g|0/e ;X|Y< 0  a Pr'U0Y`^)Cl;gy-{.fO+8`/@ 7W^c0\i:X ?{KBMAhD:aJ^% {Pe' D}@U |Tc`+wxpXx;2`g56FOg[n {ssb]H>0Oq_f#[ V3 AKb1j  { R Aj ]u   w :vbT79^ IFQ|#Y4 WT 8 =  %  P   mcrUPk2GbJ {Po ;  0 jP l  G   J   K " [   > z  : z  y  1% X { G~;C P   Q"   . s   # F E "v   ?  7 h5^O>OF-YG=_q#~5ELAJQcpqY6 vrq[?bpW\.Nn:A K4G HI0`zGgT9^% POr1:HFIC!W]jr+#to4Nff.AX>j_x ,"  7   n K  J    ! ) I Y  E W4gj\V>:y4)w`7:wxtCp 4  A!c~!{!!!!Y!5!2!|2!]!!!(""":%#SQ#db#fC#G#"!#!< D$FH Dw[TRW}|7 Om#P&!5gKOH[W(E}hI,CJ~i:!mmd3+~Nb0j9aj>{t#^ t :  < G ~! 5  x Im 3G 'U *h < A `7  q%41NRp ?   7, ct  = wVW+t/Rq' =a    J ~eQ/2Ccs&DUTsJ"Jaty)amt{;.YoP n }rXe(~eN B n.Y'>AF#g~nCJ1@e"J2k*XyyVT6 t\|f-Ye$hP: D{mL 'B%W/iKm7nGe{[H`^ltY "S%rYo{ '9y~*_i)A;Vk N0ET*2`= *)1eK<<` z lyA[4i!^'m0g3j'I81% Ee9`PW>q{    < 3 >b K D) /o   ]Q#;CTA=]fZ9m62{kS"B3ni)F-qc$c"]^ih(G`jNiU8gX+;<m \=Y-}bdk+KJ"1 rPu)!Mb('Ll2<) 2   Z'poPrYe9(? 7HS%  k J4NiU( A (=$UZR%~0& T1   % W ' j B \   AmQ}|Nx8y >5Grh~qi{yr]hhsNaOww0^D ?v~IU(|Q TiVkRfM@pc8BDujxdB< $<[J8D8Vz8~X L5y'DRDZ#$`,8d#a1PsBZ#L*;f.;6?`GRBtscrQ[^*pr $K!!["O#$'%&>O''c(M (O!( "("T("'"j'a"&!5&P!% $>$##Q" !X D }xH9Rw !>{VvE{~snNu plM " 3 s  ` ^ \  1 S 5V7:c,4E}trmCTVR>GQ%<.*e-_r zB2I32rDUURESFD:\$Lxc3 )=D:+d I[@e}q^0uR;Y ~H\ ~P/O;iRnYQ: S]I> l>R0-Gbf6 @Cdf= ^5Oy\A.iT^tH`R}=-h -FONHHD=DIYlh\pB  ^ 3 o  i  <  [ B g J d @ S 9 ] " a 2 Z 3 `  p +jQ0`%- GsXIx7LCP6Dsu 2~T #Z"#U%*&f'm(P) W* *!*p!*!{*!*!k)!("("E' "&"%!,%!$!.$!#!#=!Y# <# *#(#~>#R#Wc#p#0##C###~$y($H$p$,$$$$%cL%~%y%%7 %h %f %/ %~%w?%$.t$n#q#"?V"! 4! & bm5vR:1$[~_MJ) rG@ov`g34P^0geK)%U g   9 & u  N[r[.. 5Avp}e{ zdm^ED4V DZf[G bE?o8V( h08V\tX@@p!7>@ +DM ,7,v _H}=Y>F5w|l%U Ae   c*  {d I"h:[=F3 3  m#!!|!!q!!e!k!! $ %j2, +q8`  d  /! ! "> >"c" q"j["'"!P! B DX65iOS=#~%0GqcI8 (6g-}b?!|[ u NC d  p Q r F ) 9a*R    n By  # s  t { 3 W w g  W  ~ #2Lp c   ? g {  } "a %5 5 ? S iT 0 3OPC  r O  3 0 Z> i H.\&5ionYw2yoT'/-~Iq'+ew~[~-Mk&e 8hE z&H$)x! RhygA)!'K/Uufotp}DZH6Dތ߈$DvxC$Jەۗ=ݜޘ'(k>87oZ:n~W;[)\xug NC jX*<'(M +7&TNJ_%_D>o{ST&rY \`}{SQhIzL( 8V]h06vwj   9 c z  * s1 ]U 0v     * 1     4 z][vD4 .c   '! }9 6   & = R 0 ` `  Q Y X5t^ 54r9%|G MO|eWvlv/? Ci Bhj*PUd(LF9|`t,pX$Xzv'  !D!_!zb!u:!!  ` U V H !A != X"X #~ # ^$ $ b%!%"!%(!%#!%!% R% $1 :$q#?"! n 7=jvzqE~ e<E% / F  C U ~ I<   K    z V ; #    " 0 2 4 (  j 9  y7DwQ^FS-s`d K 0 < ! S h f c t 7  $ ? =  _    h A : + ! G nJKW4>6z'4Jy?XVwuwB|SJd0;:y};t-7M$Hm{t-Mz{Lx `t`]dQo dBZ8>`.zR |dkT?0MB'2kc\bm{J;[Ij8a-%M7r0;^h7H1p~.i4 u \  &, G /p a 6  W qs,^d+reX?ShA)GRD|/RK@KIx!:SGhNdAO`{}E21HscH3*nI!o2l[H3SOcenyvM gPK80R`1Ya @@tIFj2F#>&GS{Eg;G eT& '4f &5h&)f#BoO.$PV+J{?a `-onD\<U(S  p2 6  3 e } /  > #i   c h v96xqxa "zt5j:1FAlepy**Q\f:3T|Z482Bg6- / 3 : F h }   SP  Rt" bL M ^ c i0 tT ih a` 5=   h[ D%.5g5g[D#1v,W{$2sd  ;  P   Hb |  ` >c$o$1#3l6*jh    . @ ZA [ ] 5   ^  I -  {,X`|^,>*q # 1  ^ p ? L Yn   I:  i? E}c2~cK "# 5 8> ) #   )   pH pf>dl0$|B:LCw7d,(M *G  dw N_ Z  > m Y%^e` tPG!# %S! 3! !!""\"O#"#"$"$"a%l"%/"%!%!%K!r% "%{ $ }$*$'##.%#"J"<"!<!r!#! yo Y! 2%}S*G$nMuf}5^];/ -Zcn[bD 0E Y ' [ P J I0LJ[?c<5eo3}9yiaUDDP?"M_kkDp &}*X H J 000373QK87? I!HWrhxFR0Gx&r Hy"'w)~3/LGyFt  t d Z w  `  < e k  h  q  Z X L ' G < " , s  # c  P h  hc    m pC sA R l  & f E d v 3u WD w v|  a (@CB4g$-'Ugf.cfR@({v]G<O7SGE>gC  R8f2&lUC/,&4UpEy!%S\bj0 Z JO  m* (t  C  n \ W O t# z(0vezGv]Uw .F n  R!+!"w"#"<#W##h$P$'o$k$$$$$p$|/$+##O"#" "Ko!k rb7Ri n&y  S PL [ n )zt20|!nX<^;V5e,( ^3m+K5y\m"0޷-ސf#8~$ڲٞY٪8ٓp[:ܑ;k~;s6oxSMay{z6:wa1xhrAFy:qH5;f5aRo[>[(:Ll|H])7xGhoݲn6xڸڅDٛ9ٮOكٞdّ-لq߈K0. ܚ X 51G׌bװz;ם#K'M׷ڗmm؜ ݍR2}ݾc^1]g0~^ڛfڹݡٯݦ٩٤.ڡݺڡyB;(Fފx &i&|-A;;r*qH-y|I64r <?]CC7$'.2pu/SXMH?P}~]_H k%h}pX0PUkua,WbS?} i*n%jl 6Zd8Og 7-av3Fd dFh !D7=6;z-rSQv I  DC!h>;Ox)@Fv<K    !w     N#   * M   J  " ! " m 0 V " J :  VV  m eF:bc-.@[80T?t&X,s} [Z  y8X$t  7p m E   ~ :Md\B, `:+j ,'hUb!.;PF:/Tn?C',JF .xv}y% TC 2U<&#c/3y3(w\6i^>MUu`|NA51HUYvow^=]6~,Nc|RyDjzt  F P p d V %  \h%BG4U#JQ%IRG{*G_  ))[1)4q]15 m} :   " F e  P &/0&+T&   E X I2f9v,$eJ;rN(>{PtwZZFu;5 /D,V& ?qWiL$D)LxR`u{&gV ,y O I "^tT}i[c~6q wYOYh)Q=J2p I e'ru~c~buIb   t R ^WBI`vBE705KR^Jfdmv=gCrPsFSKKaT] uRiJ4*1&/Y:RwCE`)j\H`'x3t-^V#T=$s|U>if3D*C ;w7Yq,dP\y~`LC<xD_krovwxd1G])rUBp)+Xy {jaT; ,Y1un(V"af=#S>@'%K>;Pz,tK04D]vy4d:mwG7)yhdE\|`4:0L5<# lq igBqXPPG9]BS[CglshsWoCok2,iFnpbd ]%)u0~xO2 u.I[ht7 -6jeROEOUxA~rVd(tkx?Wt%U>6\9Uwj_=d{~T$%&P+-Wq YvRjp4UTIRPo 9P   z& ]    | 7 \h95Z$ah8I-z2{ :%KS~; u/RES>)1lr @;L,W{xKx%-/ E  -I  -  }K  ?# H PIEEaoXAOkdT=h?j#S$CL8 R7+4eh c L ^  ;6q(&cg5"Mc0 Y}<znnx4U4(y6><* % e D  I  TK"^7 1zR. @]*/pL%yS<;3 lE0: :!T&a?~Y1k r1L%kaCQ>FAt O{Tv/bqK[ )nVB$9gT 1bf7# F ,S5-)(sBA12M'sKZ {i?e& }$)=Y[@y}U?pNF! Po2@:%Anj+ [zdR2"<}GE_**fo=1hR]'s~L v  z 5 8 / & O 9 <    PnF &O f h&Ert\O n}j,bppD;q2U_0\&IN-Q;8hb D `u}+~rBHHH~=c1x6RH;Y)2|L^DH  "  ' U     5  } H ,j9U ci}5 >"#%sS&h' L(!(?"m)")")")"C)V"(! (:!#' B&;%5$;#A"U!F }4<GZm"k@ r$Z|1XCk    w Q w  * ,}>"u;\YCq ;\}}hxz&>CeIh0A7Jz ~  X N   j ] A { VJ*.% w*v{hbaq#.uq%gV7[t2wkCz`agRR!(ek [HWaQOn"1PU{0%y(fCLxJzdrL$CU|-k11#;+>kTFNOH)^xTV#@ HDJJ![G19gZyv_IhFek J C Y _b M f!  O Y 0Pog{4K  *  A  0;  " > ] ` ;   w +  ) ( q$}   3 j :t3|#P1,GZoJ8w?eM* /+.j?@QSZYPOq4' l ,d1\8 e   v 5}   l F2N1TV]Z<N 8 { !:   V  r \ ,H 24 +    Y   oq #  _u D > 5  r : $ & ! @ C w r  Z  + C" k y k 4s % Q  q , X `t A|\$8]lJ3xL.Ri;}/2]a3gtte< c{/pj?;]Ub 6FCxy2$t4)roi8.hI]1/bVkPpR,_ehK(\a@E{O_P}_fz%heS.#a\m8:x'0KkmUg;1WoKF^ ~YZbN#l)s&bt1+ ~yx"R?nH{g)Wd'@KASF)6LZ]DJ"9j.b-yN(7 oI I^R    %   _ knFui  RdtHkqZ.,~hlN>)~2v#,: 4Yzn#?7&L|DIdtMu wnk> 2m,8~8%#_b} iXRbqw3ywfRD+z1J*5V[:`6d!fc%Xj  " _ 2  ? 0Thg=6<cuqtCYNV0(m# 1f_*&+cd~;^GUA?HMV-s  r  8 %s U < = =7 A I 4Y J] S] CS  G  3   J V (   r* M1:tWxJ(+m \=n%z0;|Gvih6J2 -@>94    E ) / U 4 IEAM,x|[ ZRd'a<2j ]!W""(.#jQ#&#" i"2!G !f: _wX4h k)!""t#.g$% %9!&!P&!7&!%!{% $5 #0"_!@uKa5rCig^:0  j[  + e  j1W[sN>F"2*S[&T((*)~Wbl@Wy\NzK4 H!uV6vbB*8=lyY&x A6jjn* !G /Z=z+w'(dmo8Dn}AZW4Mg<1FjA|7O#Z b^z5w[N%vfie>d/|~ d , ZfiFs U2  o  %   z f_Ag~aktK1_[k2rc.!Ccb9-T8 KOVM H '!!!" 2#n#$' i$k $ $ $+!$H!$_!y$e! $;!#!" "8 !# 9eZ12m BKt\%jVISQ[Ko'$~DYM\As-xub2] [ T- D/O!62m=n0<zUemo9nF00c0q|Dai  { _ d6 s   { >   |K G[NM  N$  w e7 V c    _a   " ?Z (  '2@s*O|aeEr % +  O h G C<%Lw`FOXq\) 8>qY  Dr ]8 6 + \?   B 8  J &kkc(s{LD 1Pc;zrRA:i>b+vgDoL ,%Qy]E/2"ur]9 |>1:{3D!BuZeBYT^n9S[V.j=YetyBUD43=DGvb tH$ *  !y!f!"[O"o"w""""Wl"^"g"R"k"""A#Q#C$$a%6&&+f''E'' 'M'M&@%$"!h5Y ?F I r  - 4 b   r  f] RKB L D a  ~ B} B 5 A0  b  ' qr & / R xvop ECpr 3 ;  )" i   !  TF [ 6 r!A/D"1t/+NY F %!l!y"##~#9O$$I%b % %!.&N"O&"&{#&$&$'R%]'&'&J('(())H** +++,,-K-.-f/`.-0.0.'1.m1.1[.1-}1/-:1g,0s+x0v*/f)O/:(./'.&- %,,$m,A#+"+!+k!* q* *i )9 %) (''%&8%#?"?!5 ? agvZ}Q-+ &V;I8C E6 Y~AOU OgZ BQ24g9jv;dyG0Z|pW|^<k {`k(u|dLHK"zJ .GJg  =   X B @  ? \    Di     F ,bJA]^=gbBM:fi&?>6$V=)>i9O1V#BMF\%I v 4  ?b _ V@ I  qDDoy;Mb2L=KdJ\$tm/ 2hFZXYNF@1 Eg !!%"";##IB$&$$S%X%%%%\%4Z%  %$W$#(#"!!^ nM=H@n@H| vG  T!X!$!o!6""#"I%#xU### $!$)$? $n#y#F#""%%"S!!G!x@!7! e!c!!I"!(#V"$"%$#%#&#'4$E(p$($7)$K)$J)$))]$(=$s(($'$['$&$%&'$%S$%$$$$(%#{%F#%" &"j&l"&S"& "&"&!&!N&!%!%! %!j$!#K!+#!" !t ! k A-y4GG'  CargR (=ZHm`hM;:{)i:Ty6LKd(sGf%65A&=ahmg{:i@PE@7h4;VT ~   ' g H  +cp hYF _VYaBXW \E<-gVGh`t:-~`5q5Ko\&]Uf`RU/.c8C_jHz(/Oy03B\Y /DrNr(K ATRJ}Gq9HZQj]ZTI,]"y!qt?p`jpnAhD,5(&U$J -`A9qi\^#?&^IPz]H-tP5)S@u[0 . $_ (   ( /O ly  +S >l <Vw x!<\"<)#E#6 $!!%!%"%#E&#}&#&E$&$&$v&%R&;%(&u%%%%&%i&%&%o'&(s&(&m)'/*-(+)+ *, +|-),;.K-/T./X/o0S0$1$111Z2m222l333F3V4134353!52652&5f2 5H24@2W4E23i243222130o3 03%/3G.3\-3,3+3+33*2*=2)1o)0d)[0[)/)_/).@*.*.S+.+.w,.-!/v-U/-/./1./*./-~/o-/,.,-#+,*+(*';)&&'$e&f#$ "# 8"!9H|<m4@iGJY 6 t 8 " i # v >   Y  3 [  F   !k  C  ^ Q  I KWAyQ}jD^VdO0#Av<.aJ~-sT8+~+]cxA1Yv %, xvkw)?y =BM71re$[`Rq/ 8i{U($1|K03):XM`vR 4<7|euf58^|61|hz| -'7 |i#{lT{As`,F$Kr n E|e_M=2"Jv2#ekZ}F{:V-J^ W*4~ m>9P-\/qC(   # < oH   ^-UpUzgV3:*ymESN)w rD]wWw" + ! x!J!!!k"""-#p##$$$$$%$%D%I&y%&%e'%'%C(%(%(&A)&p) &)&)% *%>*%P*%*%*%*n%*W%*C%*L%s*6%T*\%-*y%*%)&)U&B)&(''('^(((b('([' )'W)&)&)t&)Z&)g&)u&`)&7)&( '(L'('''''x&_'%'%_&6$%O#$U"`#@!"0 -# @qnlRr}N\PG  hLF    !L&!6!3!f'!' !  w 8 Sp<5Fp'QdV,Q Ko% A x  @ 1 M  [ {   e 5M   L  Y B u # - i a   G Jxw dU$Wlg5E/ (\*AP Pvq4>Fg?߯eފݞ/!ڭۉc$A_ؘKُ5W۳ېߴHlުJ< M'1kh .ߪQ ߤݻR݌!|݂ݡ7g7s&޵aއ8|VO9ޖݷHN ݮsܺ2 5ۮ@۫5ܗw܍~!m![+[;QxXh/X6!B;`N>4vD)AMOsb$Nlu6bY  ' 2 P3+  sg ?   E^v{veXv4X;JA6  !!""##j$#c%%I&"&1':'(S((u))*i*++z,}+V-+. ,.#,"/ ,z/+/+/O+/*/*/D*/*}/)x/)/*/\*/*/7+ 0+P0,05-0- 1.M1_/10101 1"2_1;21Q21<21(211111<110q1=0R1/ 1$/0}.0-0g-\0, 0G,/+(/C+.*-H*,)+-)+()'(O''&&&%%$$$$#;$D####+##P####$#$)$:%W$%$_&$&$''$j'$'$'$h'v$+'8$&#B&A#%"%#"X$!#!" <"' ! y/ 0DCEI$ 6D:)HK TC +OrEw >R-` N )A23Epk l|ZKP uM5~7vd+_+ :=v4!"4qI Lz%] D:O&r!/ X  V]   }W  } V    a 3 6 FE Q} ;KMBh`   "    YIxB);Nr>u UN5et- gtGb3?@.s4rN -`0?C C0lA96ZTt#y? L-k7/D{7ouUE5wA4vmwJ~rGE'cM17 2*  A 4 i 2o] { PJOM{.L)E6E(tTRtX 7U!iyIs!VRYdz;KESr'E j m.OB12m5 -#   Ab G a    "h Z m> :}c *  c1 : s       B [ !  +  F  1 z N|'MH`,"c y=  g D   5  (},a n0k[C|.k ,  Xn 4  6O P O  D 6 % Q C"yZOOZe(q}c+,1Y B_dbF8v)M9QKNUN+eOBEl6- j%p "M/7)0!'I7x1eY<DZalOh?fuF{>64 f 0 8hbnqV,0ozC*3KtrO%GhA167,Q+ND{rG~VHsQ,75)B8=Bm FQ *]R'xN;[OFu,ZtC<&'@d[~xu Pa /#P|O^`T1k>.s 9muwc}pusp t= O "U {Qp$:0W 2~o!npak.~ q Y9CUH @_2y 7pnqoEIW,} 0* W  k# =dQ 7   O{  4\ f#t#]'"P4] 6zR\h^!du.2[F.0B1Wlzk}^]*(V)Bo,JK  O6|Z/T0Q o|  r / W Ehk8^wfRvC:S>rgG MdE,meNmG]kZ/h9LyjP1u[~)QIN2%YI]BBU:<96[ ~16@1-"I @ Q W ~: w$ _}~=X`e,'@(c-6 5u1gb1nhAXU1N5^2OmfU'S \:ry[I -  [ 0 ' q U H L N v W " c q u Uy x u ^ %H 2 =  5   P  E )H.p<#eb"F q @ e   ;ZWmaxEQH~vqI`sgI*Iv?>OH6r-nY%z=W|8uHsq [ o  ' ` 2  8N   $ kHPzdK.LJ6V^Hel.{kcZ,Zi2p\ 8 5   r ;   A  6  N6iqtX]Zb5Wp[ u.Bh$ 7l b p   *2  re  @/ZGsj fGp|QbN &9Q-I 7,&v%Aw5=C%y$fsM46x6wr5a*- |H f&pB4c6{pC<R)'\q&27C>w* X3XG9L P u @ h G e G  yM U/ $   2 S |    E  H Mr` z!sj3 ">twk8 1((p]8;n9{^LiXJmN=m,J{8;^MlmFw k.GiI  7 u ) B 4 B J  I6 o H  2H  H y qDVF.C6Hx< l   X   )\zA {  HdfbCd>+?c*,@jzxFfI.{&'#6- \'! ~N@sN3Ap5[cnY=T #f4qeMYT05!Ik@1(e 29q1!\;%r%%.6v&p+]3nuHvg]:*dA&shNLa:1LFY_n{kAP #_?~fN, VBJ;|zoM#8RPjLFl~D   ] 0 Ho e z$ ~Z        Y L I B P R ^ . d   M jZR&_`[Z   gI  > 3 + V ( d  -  : d )  b 8 d .  X z g 5r 1c   |  E B  S W H h  & I C  " ? ;A@Qs|ZWM f)0:<&S3&DUa 8/iYa/u/%sVu t.s;$eG}yIV<qvCsUHdz +ybzOJh y   E)  /N 4 5{UKQ0BrYh ;yD ZC!(?B R!!Z"_",#P#v### #!#"##$v$;$I%$%$&[%'%i'I&'&'M'('(&((('(')'4)'=)h'B)7')&(&(&g(5&'%'%'`%l&%%$!%=$h$##c#""!;" ! 3 u\F' #Iyhb){ 4HD #cC j g % \ ^ z  a8 M ^ O_ H ( }  ! R  ;p  + $wgl="#4u}z$lvK544 '/WDXfs2]eK|Zir@[o3>.mNQu (4ov+S Zl'urPZbJ# x!TxR~#F6hnHI1\sJr(gSm/fS-tFtefabD6~3N4rE.C)^0yVCp(YCn`w15)G29*$CU#@1] SxRu-om"uHc:L5Qa+llUKTI9:cO=pu~N"G98m2 oaqj-{LE n%X$}OrX+c !-a-ddn7D( WR~m*M6kg9bbZ88:sHx|l|LR_e q:s08*t.AP/<Qx=f,wG__P'>%(SaVvB|O0Ba~Z)z0:T}6c==++Hi )Ytk  EE:MS;aEl 'PN5 R,o9Td!qySpU @Np=j?&rr'/%o|  { rc }s0])Yr) KY8;-ax?igHo JUg%NZfP721#R%G >x/)u[Y)i&2_ltme:K uv; BnBoV8~8lm XwA ZxNcAXI 1oUQdX`k"bxFBxcl)P1;|/;""i\*Js `? ? \:  N 3f&  K 3 W E 3}w  3{ 1 z - v  % h T  n ~ } >   <X $ 2G u  l T F? ': " 1v#'Y)c+I V q]?WLd+9eqG`$@oF`n~tzjnqimyxX .gY  4!r}!!! !) "X !\ !k !] /!1 ! \ PGH:Jz?Xm{%Yl#= k ` F 2L `F J c }E t  [0q+y\5G2fA\A,NsI/ iQ69m=h&9 y_?pV8$"`? O,fGnvl^C.qWP4+D@vJ Uy#j^Ez  d N 4 H VS  , X _ ? w Y "F  \  > p'  | /J h q:MW+L  |: " y K   P q u+LOJ3 ~K6K+ex3S49_< ^m"xx<)^AKm9SV?2ehV.2bgPSOAGwCCBZfzkRx~EC3PtLTraKYiHZY'Qa'v\9`^} qA)  i H   f7gT*jh<o&d%??f7 *!^?"rB#+$$:%N& &("'Y#*'Y$+'#% '%&&k&%&%%y%%$q$$$-##6"*#*!"0 "v"S"?"$"N!i!t!!  ]!IYK, ~(  \   dO  N  %  n  e Z | $   pI k b jX ~ `$s7NrA 6  x 8  , `  .    k W< #  4 `l bA \ Y *    99   TE      M [ 6O (  z  y - f R _ d I Z U ;   1 D R   8=  # k     % ^  ==l.Sm/ k u h~ W  !=8a7~;1`MQX65  {  g  ]  n H %   c v 'K  4 M2:XB  Sc^u&%Q6?+1:jW m%= | s Y N P> K9[90k)t"xf5*`pfA]TIX1v`Q4)wpAd\~1$xy=b ;  . F O <  m J U   l A: 7c ?[cbi/w+oNm@V Bi |k[*f8V0.I;ytBO ZE ?^}BPZ  G  G( Y e :`L~\vVd);!^, "_D !R"5# 1$!@%"q&#' %(4&*g'F+(y,)w-*n.f+A/,/,o0-0P- 1~-61-F1-W1-b1-1-1-2-Z2R.2.d3:/4/405F161C728N3839b4T94~94f9 5,9$58585_74645Y444333362'3120_2f010s1/0/#0]//[/.B/.A/P-J/,B/+R/[+G/*S/*R/[*e/'*/%*/.*/7*/L*0A*206*a0)j0)P0),0`(/l';/t&v.5%-#g,o"+ )d'-&`R$f"vz (h(lyUM"/ g   g K  0 ZKu]:I4a8 y? &4lB>L\~N7,%>S\icmKkb  [ 7 `{ o Yv * > { f       BP   g 44  { > ' m h @\  !NASpeBO   Q J  y U ~ s -  U L IhEpDHZ];r&#xHVd3Xp^%4r \W7O}3o)&D5p7x^pDge6,g 1z(.w^-$UbXha_d n!l""Y"9"#5#.G#<#<####"""""""/"a_"W".9"7";+"1"P"@l"""C 2# #t!#!B$."$u"$"-%"b%"%"#%[#%#%#&]$$&$1&%q&L&&('&(8'(')'*_(+(K,9),)d-*-m* .*@.+P.O+j.+s.+p.+.+.+.+.+ /+G/+n/+/,/.,D0[,0,0,0y-1.^1.1/101j1 2o2M2g3{2R42=526%36T373{737 47747i4?7464a6454B5q44H444333b32322t2B22121251>303l040v4/4`//5/Y5.^5M.O5-4t-4-3,*3/,^2+m1@+v0*/Q*.)-)1-3),(=,(+(+^(+:(+(+'+'+'+7'+&V+x&*%X*^%)$')=$(#'#]'"&"&!)&.!& % %< %x%N%}%C$d$#b#\""! ; fiLpL&7-ORNq) 440f p   z1 z h 2 b +  < d 9  y  r D    % AQFIF)2YIw{\2qJ^`q8> t  o   > _ 4   A   !   -  + 0 ) n F [ B  G }  S} 42Ma k. f >   Z/ A   O  )j ! 5 }   q= Re!LP}"wy \%|+WRGq>:[CeY(cNP544x(<a82 @Va c +&  t ! e&S %  +  Y  t2jymAKbq<d+|q_WSZ@LB ~l(e^*[m<svwpZYV;!g'(VZigp k] L B [ ~L  (:  Z     4 d  ( U Mm     R. n   B  T {  Rj   <  K] c+^M]:dyv_;OI(\   %D E ` {    R < ' P9/s6^|3 <@% g!' "v # $ % % % |% #% ~$ # "{ !a B P [ z  1 *! h!4!!#"&E"pO"-""!I!V F ^zws`b~K So|_t dR47} S%9n}9IkJ8')Sor:=)7<%C =xm d x -    N . R | 6 r ' " b  aJ u 9 >+m)h2"O}Hp70 A{LX 3d0*G`[|fC9Hg1OB }(V3kqa=T#(_4 6dfD@ P s  _ . qo Affwegj+u W   n P & 5mutCH=4YU&cy$(`)^$lRW+yHLmmO+aE߹;o! (8Ҩe4Hλ۱͜lxBrLt׀͚0ձd ӓGwqЍ)!ѭ=`ϋTАCΞ͇udvIΎϟθy*XSz2ёОѶ`C=xzSEֹלإ9kؐ[ٿ:ޢ dlB orf[#SxTD,C>:A,Z C# ^A2a*64)/jsB>P*kV 9) {X  Q+ c ( l% O N U ; O u8 ,>7C`8D^i[  5{t3,uZ`Z{&3~+N_ >bPK~w.:5NCd.R O0 P/]"L?D';vL : 7      O  G r g _ e l j h  ^ h9Q*uNS MW0k:VgLF9Iq9-U;j.' t    8 k@{)7 9 , o -   (v O E; zUXAeswirv Meqq;M {VsE-7r|fH_h'3f3F:;^@N@AiU1{z9Ugt{yx,hvV8xs'fs4?|>Oa' ="hrr/D" L4dSp3N_aTv8f-^;0v E.wa"!i,4eNQ 1|BRGgs\|{d;o:M)\]O[vr;(QD}2-0X |jM*,XLgX[HTHr8))/O>~ F    ^OiD  '& R c a" @I   I 5 Pb & 3 a i ^  d H W I # l   0 9 y u e 4  5`MEP*  D n -Y   X  #b8  \ < Y 2  bE   /p 7 tNm+Sk& B>y6.J qKp4BBm.8)8tw"+yIo]3bd&Q#R|TE8kZJ;#8f, b?^)Q-+{88"~/naqMD48uTj/9;P(Cp(FK4]x Q8-LI) w{R]4\=0b0?5Ox~JoHD~d6 <jD\Ge|Yyz|b56+. tH n(l9i\&#[`8K$b#"U`,Y[vKV2n3w_ei8ge{ 3Gr^q\I2FwR}EQ+e\ 56q}Euyzfi|f+iu]-&     < @ nCL;r0$O&8[k,gFWM U <   )9 d x )s A )&*7qnOU$oJL&K#a1bzf|C_:UBvi5^9_HZ3:lt3$i 2  k H( E L : 6 z H   1 S  <  u@ O g l qL ]& = w  tL\j> ]fbU9}!?h5Z|qTS;.lF5+iE`7Bcl3Y[dY5 guq4}7c 7-|\R4Ns33'.s)#9IVj^M(4O.9. D0 kGKM K%_2NG d_X~s=+l/Z?]6o_'Pttd4>D>fCg0KphߩMwJwOp^߀tߢ~LFUM߷f߳)Slc0#MhyMF00ߌp ݅<ܰ,wACaۮ_,+ݾ+ޅ`xiq :yb3}DY-y('kt*yTI06GbP%hm)Y LrG087vj'b _K{=hal"b%i=9|?Kh>0yGuXpjG`< ? R9`\>C'gN|Exp K|4Uyncq1y{l8S*hgKv}4Pn]K+<;>*{"D&JU(s(J_) Nr1 .g|k9kHY\wY}|<=P Tjk\X+ e1X7Rk'(Fkgi(MlEw >G8Oduz*xKOIl8j+SksO7 KZ}Xt6R [Hi g5 +=OJ^~tZ^-:Z TdOl)mnD49"%*JDy:mI?'.BkGQ}}pWu%n_K+ k k  + Pb Q b [ T3 <I 1:    .Z  l  9?e& Ei5x t C 5  oX  i % k ~ P u  X 8j'4Ew/pW:   m C   R   >8b  D@ r  / v h! B~    ~ TP A )U   5  Z9 8  . =sF@KW&j5 %|:O>'IB#c`85U0S.gpZ4#4@293+$@Vg](I<5e1NP}87jT {ds1e r{j!{#L@ppL|3kZHO^j-a;Wr >z|*W'ZBA c 4p h ?e ?  %   W&.!#9m: WMs J +h $8 1 N! a+ R   R K!LRnn;}d+7J0Qxn e g P  G$ t T Y X } v f ^  _ 8 | l  F n #  R H  >   r: O o 8   )o { N/  j D itgvJ{=Rx48iqC kLzDoV`=0"=3Y#s;]}PNb( 4 pG      a 8  . K [` ~   A  v ! 9 u  !> 8 B [S Q * -  ; z K   E. w~!|M_XxZY,Y^ }8  | : Z    7    / * 0<7AK!c|fnVD" sDY;&V 923k< +~y]9 UFx@uuy-UA{F W   {z  & k  @ d 0 s Z "  3 ) G Iq iMW}[,ky+ +^  f u j j K      y mi j p x0 * E@]zT^$N7$VT, Q-\0X%CN`OS42+T($9j*rS{DH!yEIyQCCG+VTs{u}eXD{FMr^PH@+9' p$fgeC'5&&$.)>wMP-@(Mq( \ A"a!V.cM3|K6*;ACWdpGq eAOw WwaH1Xe>~ _n s7+r}PC=N`z.$I"[)YG mZrRzE2{m:T  x::?$0E2vrWP\l # ""i! .Fv%:$f.8Y McCnxi?4k"YOSh-iJ7e  V^2eh4lS7mumD rHvj3  u  { 5d b^}L/:2R5;%@o Z ;  # , o L  4 r  { x 1 = eCL~$+f%~zY<TaFS r C . e  kM | m i   * M  V 0 U^  6  gY $ 1  R e  \   Q \ & c9  j UJ[!#o ;c Tv8L5i$Nc3P]^ E6D[> c KnlOEyU=2 "xc:,Noc O)Fdsn{}d7B)weQ](xt4gQkP bfdv.u?g,/V2G`:g)L C1 o+Xl8%u_9X -@x z,8W)Zr|rS6* j aF9#gd oKHv5s8 o'r$"P &/zzqJ   D 4  gQ  W   ` P ? 1 4 ] $ u = 5    5  cd3}_l2u D   n |.7qT<; t s ^(  sd  u  1 ~ A u ` k h j E i t ` @ T i(f@7an+s21'1kwE[0( aN6)#V7{v>nnZ.Px.yac.$!SoGb}6`AxBBM1y^9e`޻"{4Ou  ~ ~l  m  w 8  ]   Z!Bq-~cY,0v5MNf|,p`vQ]9Z`b`hT@ !!+"{i"2j"L" !bo! $ &|{v y fHr k {!}"t"s""" x"" d!  wmj3e[q X !p"""##"FU"! ;jodqPuJq6x#@ne 4 %    U L r; -: F @D Q [ ^B 7   E [  M o s     J    ; oW 0l y j $   8 U  1bk;?1%ti'=}W>kb{1r>3@ X2RXRF9oh*^O޼r9~!9ވN{ޏLވߐ'ߓ8d6/;%ߐ$C$(DߥSߟxߛ߿/5{rMN n 7_j (EVz"dV"0v0)YruguC9{;9%tbJy.9'RoF`PAgD7C">:Qmk(h3#UIk\(Jhv\~M @]M , .+sH$9*_l @   -  [ +@)jV>00&h!bo+a -9qZ $mIY2B5/a}FCMuI"HkRZHYxjn'Ieq} GiX  Z ^  mvFdv*|J$45q*P> WsM.<  DFp" w % K  y ] T v\%o-H` f!    I  x 7c  rj  % ?X J J .  e ;  e Ci   u   _b = sU4  ]      N   # T s   1+  f ;nod C5[_RDN A)x" hg 9~bGQ`8W@dpmn   \ s t ]vRYH}aKR`|ZV: +#R}QueA'.MAg\B+u,+ha#!uI3!lsUR3O-0 X q" dP'nE :[  0 0 Q MBf>   3 8  %> ) ) Az1<s  8  .      -   h  W  '6(>RLhF{l}3F  D R  B u  b  % x } _ 2   L N '/gBjfYoO!T/6CN~>  `!a "+!"!f#"$#$q$u%1%&%~&n&&&&2'&E'&;'7&&%j&$%#$"#b!" ! x8 %,fO"3G ^%J"Nh0fTR"~o 3q:dI \1~2~I^r z x>    X !c o     #-Y)gy`% ^ cH-yhz=Ku2."n w&I^ ]+%!+1kNS+  ` o E K L   4   G   o R 8 1 g ( 7 . ~ [ 7    iv T  E \  }  if  ><!AVJFX`~]ctMdu*{y@B,1?0387sR79(]svtjOF#]n\lSNJ AXBo[qtr|gBV?^*Bxp7ZVmp&V W-kڣ?dT*[iwS&ڹ[Cܕ5޾iJC[dmFSF]y\XQBm j1lK!Od6*yn`R,{3 ,V8@B{ )Xe6|D%I;A":/O;RefbvCb U4\O S N <  f  ->=Nn#MP~{G'`>~1 |o@' k;S%qe (JL:Y4V U y a  3   _  Z H jA  j +N7h/b- W  AI  e I d | J  0/ z  o sIHJ@xV(t 6'Aazg(_GARAP6,#T fmDz;cC WPWU,cYP<-jNq_}kZbNR_tC_eA |$7]HZmswx',ߞh H SmO~sA|P5bT)phVSvK _UE %S(O{j{b98Zmis58ZD5F~5X J+Tx^LG6Y|g{[=  v @+  U}  Qzj-sY.tIe=,X[`20 -i.W@1*!%j*8A.=Ua x8!i!j"f#dn#X#C#1####g##"]Y"4!W!  7?B{W9{PSKks?yCw5vr|+E\b>'^ im^Z2Z8  l ^ = X F?j!~Kw6Dy*^v8iG;!%jHVk +ot|_]WLIUzqptw^"Gm/6W4La+EKL]w,DgVFq!{LY?H^ߎM[Tw&[R3^MLI6 hpHKHWq <\RU"AM4_)$q:" \MLH_$^k`$FQ14Pj$< o.n2gn[`{//XB<Z'UJ'9k D   _ %   / 9 Y ~ b 4 : _ p  6  [   w y    I0jFSEIr9Bm^  *!Hj!|!!" >"\ " " M#J!#!P$6"$"%a#=&#&$'%%B(%(.&n)&)&'J*'*(*](*(+&)*)*)*a***e*Q+H*+*E,),)&-)-)-a).@)C.)=.(".R(-'~-?',&=,%|+$*$).#|(="V'e!-& %#"!  z;,dWKh<_P!c~c '3c)a'jQ'  u  H  ,P] +Ua.*S!|CK ~bwR? 4m/R @Z A 8up.  p1!!7!!!!!n!~!1 4 H8/OZwQ5nnoh}* m 8 i v fiWxJrc'^m:@[Ez7tkf84y3P}E,0I!w=-9,Cve SNb :we.b@6(:-eFmMvvf?N}`43ދe{7b))j{ܰR )fYPې۝ڳڠxږY};U8C9%l . 07Qg ݛZ$-' ݳޗIސ~އ{|]߅ߍ߈(j,^btTV'k!F'kI37]rq|}q<yQ=-E%Xmb+)N~* sjEt#&H^7 k  ( 8/  9|b4v)q=i;o8GCWVL:|i5^,NiqF] H}M_}!`2@\#(F;zD#m* P !"?(##O$H$$%n%$2$'$# "N <"P o!@  +wzd-.uhVd-2( zo@tv,&1iTQ_ %  :   Y' %  kF t 5 M H  aR v$W Ec7<z^4@(    2 2 '   _ zW'&c6F`it}T9+q-jh!g>CcD^"QuJl6X.}}~'Y+HEg"U4!?=k}7nORKHD + A L/r7bq Hvm\sbEEr&JE,UhrHH? n ' h_  C $BsXu#L)X6cg}}dJ(`{hyfY/u::$ .  #W O    ei N  W l F - d   i F 0 ` . 1 T  ( Y  A Y C E  >r  T n*`p -5-(IrBpv w$SB|tHw/$9b jdGYVvVkt`A _~%5_gIKVj.`D Qdr9Qwwm2GF `/~?OBPRm=rWMI|vB  /CJ En8}"f~ B`B_L(vV&fxP ޠsݓHܵ? {ڕj3LݬޢܰߪݐoP2x":o;2v޹ߔ6ܰ ܘۋ6ک^Ԝ*ת@:R֌V(Ңѐ՛шuі.ѧղ~HкϨհρՄ=U;ϼb!ӠίӉΛ|ΒKΘCξ(GΕ/LGtΒ՝"@Qhϧ^Y_WnϒzρԴπ С~0j"Ԫ`լֺ-ع}پڶ۝u2|wZ ߧJ߻ߞOfL>-lj}1\xir/0L8i@'- Q7yO!,bq FFd  < V #  = 5 @ &   $  ! F f  M m z T,9aMyaTM/'8"W=_0 [ M!!:!!!+!1I!&   [9Il8ZI|FwA1z;:;On?[E1nz9/\npNzz>g.A i nA ]  nVdP^LdQgdTkn$ g  # ) Z t ` G +8 c   $x s g Z  a 5 '  ^ I4 ;M @] gs i x b GD    m G \ \ U T  9mbCm,~} \>T9(\ejd'g/@|L~ i^bVe~MJlnI5#p7!57S2Qr}cs j%To. R &2[Yb{fl VEo@@9W}db $6  Q   4  ^   K) m87gHPD()}_C3AS ' z a  v \ K  T G |  nd  |5N{:Q,9ujld&{!CDLs ?Iz!@"O#$ b&i!'/"b)"*#2,$m-%.&/'N0v(1\)p1B*1)+)2 ,\2,2-2.Z3/3042T5[3[64l7 68j7:8I;6:<{;=<?=?>@B?uA?A?B?B?A?A~>A=V@:=9<9    . M ZX ?  % .  lv H 9 ;J `I" Oss|#XU~wM~Y} %uGcf{ueZ5SxNJ~|VCHO6oi'.VA?' zz 8I "st/GfJ6nld ; O Ic ~l i  T   ~  3  ' (R wb    ! 4d c 4  E9  = u v  5  =Z 8+!nsK $!$B D=B wGc>9a,Mo  T $  5 n & 9eGap7uR[gM2P}G%U   k  X0sKb7!BqF[K,4 ug!e 3&Gl\%a 'N8yk)RnUB6E7CtHe8jRAPDV=D%Q(/U&\pt6E*4zriG0vM  n JTv`NgGLr<(PwuN gr!A/sRf'~)X%#ha O+ G,DlXF8jD. u c ! !!" !X" "k ["!>f!b p~h_;' ^)^d7"cQmoYv{`m`r"]g Y  7  Ne6\d-  M7  j  % D crp^iv(P! ,]ou@{t ky5uq &-o[=Z*l>;!moD X!Ho) yRk wo7d]+"e9Tv], bP'8 A@5 d1^*F D zr V  ! y   _ , Ff ^ d#3^pg~|i<j0& J b  [ - r  ] RM0[w' b/tV+,A~=!mE DRiu|}T%g8"gq_"^/=I?.R$ z p Y =Z , X       xuVy  ?   f $C ;Z   { 92 ) ` \ @ 5 j H D ~ N a '/`a'dyIwcPR<}9:|aSMrG#3% " V s  @a(EQ2?f  cNt[ ^ i  } " } T O  >  F f  " i  '  g F  `mvlsh{g 2 h^ D O Y+   RI  S >  1  1 s/   lK K {.d%p6diX|xXHn x.?9#p,n6zj;]d3k]I?K:"OV$<}{ lnjs' Tn;L b-$)WM ~]B$V,o>*}v4-[?:' M,KXxNPq3b] KdC<>FHFp4uq@ W*_Z cEf[DrZ]> r.6C,on%~w6k:o O}p/G b$=e3|6"_:\w.  < V O C C   \ A S  N=  H m hT#=2{"nC |%6 ;MZlqA$jIw9sKJw60\ke3+`D101h3L>XG_S:i  *[ F 3 c  H f  m ' Y m  I ~ % T  g;an"~O?   ' ,l G T O ;1 "G O D 3     o : C   # 1 a  G hx n Z` 1 R  ?Hs%vKmXN:b3 9 % q 9.CU, T } g_ =b )s # * W F c y d Q   % WL`f#m$r~ Gn-ZIg_8o l0} ;V<M_nzu, QC"usIMx7.p-F4^p$_vL9] Gjrt2o#G = t #T >s`7ViO*(7KQhw\K= -'IOxo%5a'"Jz0bc4T e}&OC(i2y7.+S,=7K5{{cJpߧcR?:@)oG+7;rkj^g :$h 1?- ese1x*p,c2JCKdst+x}X!m>Y7lx}8AqwTk|k)2r~p6@kR6}BqLV Vu4<EZ%gV'R v x '     . JL  F . T}Y}yjYPXuRbK`V ;S/'qV ,rcC,CxJdx< W`8E{8%@*;Um~Qp>0Us1 <>P4?6DbQBzT4 2gbsQae;!z+T  @ M -  p S M y Q   R  K / `    2*KnG85rxWZ ~  a vFD11lIdKs5i*xFxVLK{UF'b.Y}tn:P e IuZL5,Ki|$[2!#%#ݯ߀.܋*܉iPct5n7%O`NN HEu;NkA'H#W=qgqPizNP~\ ` 9o 3d -6 + {C?w2)L~j%`^blbK}R,( .UMZ G m> k w  Z1M Gz]B41 -lPh ^fPP;E f A.6W{(?:PXlY@iRd\CXA74 ?   l $ q C b b  h 8 } M ` h  5dSsoPJ{- !!"m##$ %N&c&''(M)**.+,+U-,b.,G/-/ -)0,<0?,0+v/*.)-(,'=+&)%y($('#%6#$"#""!!:!&!  kj J e @~@y>=5OpQ }K> 1k {  TV   ,`h@pqzYV'm_VA|3oFs (3D/ptC 1RR*W]L- Imb1n.C{L| o2 s5LgAj B,sPbsBh5Z 'Bg$Y ]+e-Z+dz{8Bt|`tH,:`734`5 w  N  y E , T+ /MRYH-FqUs:bR Y&MBG[BNW>M;CBDY  .# (B v+=PymN3+s07*E       bR  m!ywPCE*NctJ . , RO @ cJ T Z 6Y a o W \Z ZN @4 =,Y `u1EFD,tu*k$aRqqDTuu-VDoOfjTZbdgwHlk]d1?vL`  f!!V>"x""""u"X")"!Z!!S!T! Y` wZ1hi)E  m F .'a8MiB\ Kq U!   <  "   ]  7 E l= 9      L O f Aub7-Rx28@R!7C(h7(w?C?4q/ *BNv vjFXs$yGh~I q  i=  , 2 n O t  Z E  < A ! > z T  >  Zi   Ne # St`2 {nGW#xuH?xq;N_:8w\ Srm$.q'5':x>#fCei%w|~:)n1t 4`(|H*:7CPzy 76dw{hol` Q Z Y p V V Mi RFG0%Gi5C p_ UUtvR=bM5F q7\l;zNVyQxc AUq+} n  ':  c % & ; C HK [6 r h QK      t  L#I 'c$ly;t2@A&r)7I6YpWHt'09R uk 1mLk$D3M 0RQesb jI.zLEZD*3;sQZ{~1Eh2da% "I7OWg:> /z?uMAq%_9VD:cQ,d{9=b^ؑٗ8ښ~ۤ܀Rݢ 7]ޮoy,h[ޅ& އMݗ '#:K9ARL?PN\yZu.p p{&Uoe#`?]p/ `$u(P WWL[{&}~C/wwV'}x? ;R;? izo5*1/FM;h'usHL8Pnhe { 9wSU1[j8[ s'&m$#Dg6|ge2_{=J`LWFL Ua^0u 7:;[ MjY] RXVh4f[;8/.>) F8D4!hryL=AFL q>+3(v'ycQlV_cy,k@Ji%VMcAToq-lx.8VVtJ 7O?(BaIT$sjPOb4.=X "/nA|*{/9ws=+9Ff1C2 3ai @\AW6Gb;KE~ux>/|$%CN}GK]\k#J| [~ph& M!c;k=~q?s@:7,7Q4zcij[bCe-^[1e[dWHS1 Ut5Z M1y9mW:2[FNoqdB} H) l{N[+!o9 Qfls~g_@XW 42"Kv1z;9_h ~ B=tRIupHO]R(F9u7T5EI'XH&e'  &S,fYktrw8#hO Xd4&( 1htB=^x2Tkl[U_h"Ct _!IFM#Q^)xXPHzkikQ7xoz0K]@GTp'{t_U8Kv> 2x!txDCzns2j<MOO~F%|lvL;CsB/k\n*~Q*](kQ5?L#@S\mdLBs^D?:9D618Jls'5%ku0F -ET2QUsA1 OwQBV7 }yq x {la1FbM  ~    j P6O`\[yjrU{vm&9,r %YS.5\R&  B!!,"{"W""""F"eD"^!;R! (9;YI~`xpjy.t a J  5>  @ % e 9  a  Q   V .5A>doS?:$K2VJv"'_Y}!g+[Y:vF9\K{, uVrZf==v2~z!D(Vk:yhGK.G2#Z;yTXAA4#1F3PjU~5l4n)0'nE3x/>o;? O*2>-+ QCRvIlnc hJݜ[f7 ݺ܃kX :M!:ߊޯߜWxkv\TDF:ߛ8*GߤR |ߍܭߺ9ۗ[9nݝnsNDZ-NyhL CkQ ,j{yGv6u'f]G"YSr^]5S (&y@.p    8 ^    {ac.ca3GfiV2Dal9]{J(^p|vcVBM! [ _ -  d   c t gH    K }] 8    sd AJ .   Z   FD  . O x3yf^!sPV^   >   'v Y<  [j  W   Y n u ~ gd "  aE 9-B   U1 9 i + j F0 a  7  w&O G;j=  @  GA  a J =     . Z@ : = # f jM #)  Q  Q!0,Pb U n> ) [R Ali{YC[c, [-@JZKE/q=~q97cz8'%m?( tpC!( rX{H#11;])z)Gpt!Lj":`$"`.(d !;4hO.+Rd8-[Fs[$0S  H"o u  )$($(J$*(9$'$H'$&#�&#%#% $%.$ &^$?&$&$#' %'T%*(%(%4)&)O&)&*&*&)~&Y)X&('&(%'%&"%$$#<$"#x!C#U "=0"2!3!On m 4fs y g 8 D|P   b K  d 33&d 1Om%{D!{2,8-n.|d#4)M;Iu^~ݴ-Bߑٳw2xݲx9h!"#G{#-ՠb֛e%عPvD|ܜ GޛyM0f$,Jk_ZQ.ltvPa"\_/[]0B%Qn[/dTT,vrao2p`dhECTEV(0Zk\tG/Fn>qmZv{rQ*lD"[vlor0߫ ߠ^ބV.csۤD߹Y.hؿeV8_\ێۅ=޾j#!69[2-]_R/\2SwMh>zdQ$cX6yH$n yncd4X!+4qPj,dz^ , B Z H  FqIZ 0B3X& &4$1y!G 7o!uQEYBZt\\QC)67` !"[#e#`$$I$$C$l#?\#""&"4p!_ x a-2p)KEiLB<jXNua XDc:n h d Q N Qf l & S      24 U   U   . p  " K o ] l < . L }d; MfxSZ -  E V ` qF h$ V M B= 4-h*,0l+p:rSH _  v  fx Q> M L $ agx86oTJ  ) o n)   mo   fB *s } ? ox f  V ( Gn  % U  8  m {< . . ]& $  /,4 ".Mjk5.M}zBc{w?[w&(.>5N%/  % B 7@^Q$f 2~PL[k UgE(s _!o 6  . )` ~  4   g  9 K ? ?  ~ {   vr 7 TU-|iuNVb>i:sXxY&!vr"# ]$!+%R"%"%1#%u#%s#%w#G%Z#$.#x$"$"#f"p#" #!"[!"!>" !Z k! A jZ)~S"A\5^D*VC> 3  = k ?xA) p B = k o "  m Q S N e    7   * q  + &5 IA Y, b! ] I 0 *  {   1 | 3 7  /C  , K Z j ~  0  rq   (>NBU`E/.em>*y@Q==3 be-9y*<ak@}3k]cF@ X~:ro9$0qj*]wE0s]  8 4\ZGg߫{.Xgi=hN/,c.o~$ x&^~K4{OR!w|(FY^W6&'w.8g}"|UoX[tSgw[1*S+K@^1Lp4=.M_UL.;< +2 &l!|4ta>C ,vZ7L 7$v'k!c6}[7B~'Wzb9fut4L -)smf Yq^fDy+Q"7)UE&]b7Iappai>~8xw !/ U ? R 1) e6_T pu0|(A>dr H y8zF+]jZn4#G=.\rtKT d  T *  E  Y b QJ & q#    d V mr o p /   v0  ) \\ q \$ p   [ Z  ~ ^ q9,d_:Hyg 3XZAm(&b+cfo;V[90}}97bpS1m[Fz/r<$9%sh3xy#4{xR+w(EpHh4/wY6Ufyl@n6f =M^]"?$l'Y>xA!X<;qrCMKS3e" dEa=3:h]NDgjk[`Z^Q= WL+=."7}I*QYTV>],&kw.Teohjb7V _~`1h1PU2h&xs ]2  r   I   d Q * t   jM 5C&]:"0(1KH.5'6JbhAUiiQ<l(  !!"""_##0$$%+%%%&&N'H&'n&(&+)&)&*&|*&*&&+&s+-'+u'+'7,\(s,(,~),*,*-E+5-+>-j,b-,p-e----.-Z.-...`.....././.9/K.M/ .+/-/m-.,c.,-,c-+, +,*i+)*())([)'(&(.&'m% '$&$b&w#&#%"%Z"%B"%M"%d"&" &"&# &@#%g#%|#D%c#$K#/$"z#"""!{!  z.H+}TGOnnC  u!"u"""=#"a""r2"!!!y j t+7<(#(de0fI^{%+ r1@xO] wu=5OMl)|3 ` ^  B  nH  4 h B<s_C|T43BE[iz3xjdk Oh5tvV@r  T+ zK }8RgyNf6 )iRIVދޞ@MܸVa,-d.ېY*ݪf$R*tX YX6V޸޵Xޞ\ޥ޺Mf &(*I8+~bWdw;'YM q2K7oC{  DpNuA|B"=ygraHlS9 i7sn].F7jM c$6 %{HPx?Z}^D; Y&&&Y`1a !JE1'9xF6TAw#-TG^6WAAw2l(lj#a#\j+ vSUs_|4`UOLH FhX [n>"WMFit | i)C]x w6({=(M߂/V۲ ڮخ7Lֻ۴\= ۫ڇiS1Խuڷdӊ`%H WyYS6NӹWU\Ό vwKs̗Ό̷C( ̦(̖V̀Ύ̦̕Ϳ·́dβЂ,xtӣћtҿBٻ~טۓh0ؗH؎dWQ +؜0׷ڻlڼMٟ9!١Pm۝^܁RQݦ+q݋݌4CtOܖg)`ں ܸڏۯ2۷ڻڴڞy2ۂډa׳'0֙ا*Ոוq֮Qӓ5ՄҰvbQ5ԭ,D-0ԛ?WU*~϶=CϊՒ>uС֫Y]ҷh؛W*hٷ%{؉-5ۊڅA'yx ܚg|޴"Hߎދ߯#WJ=|pwlhE7#<)5D 8iE_\6];X ^0_{]/ZT1s D d ; Kl`+NL I1Kz t(.S )gus'AIs4   duUs #o ? H j  - V   4 / E x  R h  B w t E  0_eshF'Y"! E Ki  |   : R   @  A   > g ]  8  1 Hd a C /5=v,>;$Pd[}m;Lo4g@#54=5D0$qbBN'h-"[y6By$8uQG)*N 3Qw)6P*ptuo2n\sh~QIL0^r)#R{J6Om]C@WXk]'6:cg|Fvu/^K|T$ވfer׭u׎Hw eK؝AfY3t֩-Um٫<ןtZP:tܜc"xQ~Cy?a`B7 14] {se.a#9S  k k  ; /  F J 3 o ! / 6" 1 % = [   U- ' 4$O8MR]HH&k!w$4um / b  ?Y'MUK)Z-P_a  N X yN / d o ,Q   EL(]S<y zHY]G8fd}X (I7lVtk \r!#\7zP!{C{qC0 v@bUa]Y I  > S  ?  @   e -  C  k@GkI{+-nmca `$gKhwpmJc0y<+RJgX:1ݚ܂ۂ@ۺ ݃ڕpb܎A^-ەܾ^s qދWo -tbt,De/u?@%1B\B[i`M0N!E2 ;veTjeoX?IXOs/sMb  K&Do<~~Yto0XehXUeKp N%ZAf15.k&y(TTxa4\bSCXPumhIvKCܭ߽:ފ܂۔ye B"׭n.lأ'd-޶۩ߪM_7MyH ]@tGt:y @]KCAa1 3g_mFVc * D `b ! !""#"$$ #u$V#$<#h$"$$"#"#!(# "t " y"e"z""" O#u #!U$!$m"%>#*&$&$R'%'.&Y(&()')v'N)'k)')')'o)T'W)'")&(3&(%N($%'}$z'#'0#&j" &!m% $, E$U#"1"g!k d9/Qo7`25dBNq4T|qN L 7 [ + G O }  `h *V c  , a  Z > * h K C q   W  x 5 O ` g g L=   x %M k=BT4AToZG"?O^5e   pq O 1 !    :   GwA?}U. +p Dia* c"[C SAv*S(d#*`)0,+"\h+U`eBb5+pk  0FHe\,+<^^h^/xQ^G9J߭!%ޚމ/[pBW(DڍA^nܨBq9 _VDsD{zd7s3 y axaXުZlX{n#ޖq8y۴ߒD+-Cus޿d0 ]0lg@' V(߀n|.%a4o>>>^X(M '^Kx# 13}$;f0P!Gu' |'V~J|5G`;pm: N 9&[^1zFLxM}GHPB!kebomK(Ep~uN k6 ~  `v*5 {% V )  n1  r#Ks[qy,.op/fu*VaI<;gDBDJfxh8kypYC&u2~o<w!2Pe|s9O8+rm(:{L-> |K. v " w p O  D3g5E GMol.p\L I3C"`6;R;+q9(P$+Tf5K E>&Ue\9^ޗX ݷn&A)*];EiAFuFq! CX+H2W_J a,=dc;D ~3;'R'"uC2HLek8ov)5'vXiY Ie } m Bb  [wi\=.F%@tcC 0J~JX7:@H\>O5D2 LHQ#u56)W" OY-RwkeJyCOeH~4KgJ  I  7   G Xo  v  d  _ ygs*qq )# !I"]w#H$! {$ $!$"$"$K#$#$$$O%$&&$"'%7(n%o)&*&,'-(.)N0*1+2,3-4.~59/6/N6S0u60f60H606050_50504c0E4)03/3/03T/2.2..2A.1-1Z-;1,1y,0,0+E0_+0)+/*/*/*F/*/*.*.*G.f*-I*- *-),,)+(Z+'*&)%)z$('# '!%] $#N"!)mH4/8P_s TO,BlyRstm:.vUKGA < !?,"W j#8!$"%"&#c'f#'y#P(V#i( #%("'"'K!& %#D"! 'N=$z,)=|6!t:|x{Qq4&z_ >^ 0|FM%Lq   - X " -  Q ^%4n\8=eL=fB =y=H4$Q:` B&3"jMCs& d7_|S")XzfVY4uob;swg5j{pSQ >V | C+   2   s  b uy 9  k2&bY[OV1s $=  =  : a 3  O    7  qiVQz!  C2   u F   u  ptQlpQ q0 $ I @ "  5juM3 l(b?~ pk cdh{8dsv|`;K2&A#-AL`.+aB m!y?:SI3=q>3zp=0g<X"K#Wa~Ift~Zt+8?]:U.8(xksSZyaDJa%*y$l]LPyBs!Of+  U1 m  x & {   = k  '.JYMj/^il!nZy@GKorRTD@+h#ON=QuFMrBdy d]Wn-  Ko  &N   t   w  .s$:H'lUO\a@OQ0vG*gC /r %FuG/g8'TrQph5M&k tl#&sk_d-C L.m}&r?e;| N  / e,Xs3aGfn^.GnPzgjEKX acyJ27$b ! ~4~6Z$8nr~Y  F  v0 !~ vX 8 b3 >_X}N&y*aL '^L#=%}VotD K /uU+xs1jUX.#t4Otm e    > O F6 9T c l h kz O 5 9 V o  8og  d : 7  k\  XX0T?CgY+ &6YzpzcuTSqM%|"P@QCcah,; |  u (   mW y 0     n  O  > X  ' -I     F  r   + A 9 a & E G V q <aJqH(Jxny6T8vH!n:s2_=sc#j`*D$$L6 6t  l!:!{!!v$""J " #*!$!$"[%k" &"&W#'#8($(j$)$&*$*0%;+^%+z%+%,%3,%',% ,g%+3%f+$*$D*=$)#(*#'"&!%!Q$- #g!O tLa A  [E"4I \ q o lL o d m S v ~ v^41WmO2b(j9\JcyTmb>&}g[ZF12Z& }H};b$Y^e5boqbC= CgS`pTyctE3;B hV(lDSx1*|%:PMym lC$Rm8X$qY8x T~twZ$FzfH's>Y4$Q.4~; +go.)cEv!RonQniL !j  ^  f=N(sMC   Y t n  M   I  b] CiS')3\g9%"k EXT(3[vx 5q " - 5 , i, +   Re' ys)ssT9 A _ . 7 4 X 7 { L f [ A !   < o z ^ [ $ c F  w Sv-LmhIiPF"LodK+u%  ? q /J  v t / i V EzO9R|eXu&BwdfU[&KUyeW2&4z/O~ CN\Y(-FO?z*4R}It3$Fg|dg"phk p1<5hJGd)Khj U b ~VB~\|v96RQ,)?F{BLfDHQWiR!JXpc'~wR11y"MRvzb W1.Pqe {S@;%6JhRL-4Y* G;f * |P me P<;({W4  > [s 20HLtw#a6|_wf6=R*q 5! "G$%f& ( ) !)U!*x!*x!+]!+!* w*r * z)(Ld('<'&dF&P%=p%;%N$bX$m##1#""F"!"!!!""T"""#(#>F#=#'#w"&""!A "[8Q\l lp9l5o m#Lww6#nt h ! a   * a e {l Ph $f?tH   :  u .aN sLpa-4u     |nkC^x2(m,#JQc5GL|XDea9K~Mm\9"-_' \CN*^jCW))4T%o F?`[/ |,q/yߣ?V.{ܡgk%ܢOڨڮ٨Uپ -A|j߬#}p0ۗC;݌7"ދaZ /{GdnvRUmes,T2]g^:V|U9mV7r@5RZA; GzJ@(Hc$.T[mjUom_z )`+HnWޮdWߢ &>?82Q DAGu0n7[lj m4+7_7 So4Y`;Q)D]{YMMhs`~"P2PMl+Bwq|'zRo^>}(]HlBetY]oqVED(9)= R\}c&? <6X # 9 @ $ U  : J Z i _a F    "  4 y f4 SLKNsztBLBE s 0 c R  c B U  % - 0 ', ER-z"SU%8hGGYvSK*K~7+Vuhb4]a$EK=itUvmWuQE)+C%zyg Dm}Xx^7OIF>/3A>Y;Y&:vG: 1ZBFEtCL; DWRz Dht7 BM) }G6{V,#l@;2;qHUiql;.\bu`QnATw;%>Po_9T|we=Ne&&bppMߪߓe+J jm}P߆2ܮ܎r#H'ٿ؞נQԋzӊӻ5ӏ҅ҤҘҔ}v҅iswipңo?ifT]lIo؃M٥Ҽ@)ڌaܙQՠ |Y;ڍ3ܵf]ߔQKiXSA59*>+PFsXki 9LtJJ)_)>wE"6 'h=awM5kG<~<}Bl#Db&aC^ T   i   A P t=   v N  & c  X  `{'c(flq>"tIPWEVu0T f  } v' *p6yb1'dEP+h{xcV;wq,'PbU3Zc3m1nHgPjW79MP6_)R}B 1''>=sC9bbJ]?HtufUNgQ!=k_/BuD!!;$5Hu! 22Q2 fC|09Ki^7;Zi\Pb?-Rub _+`w~lX4m=59bBd4 )  aSDC4++3`vHN ^ CtW Um~tQoH2kj <  4    2 T  | = &w ` b ,  "[ B !E  C  ( | @wb&$'X4g N`R* ,[Q;r8z.882kgk;4a5/+#AF C0,x[/^-8H6fkF:3 R}%P8t^ @,*b%A I96,E+e):yM '(5$y_g.Yz/?\p8eD:Vz+h-{Jp}I~k:*2!IO7(Q}9^cZjl{6|RhXK0DM9-%'}L! ISR,jX.ZVYrsofu&b=[otF *^7%C A 9 6v?>F1X_^j  #cx,c(x ?#8B+-QOoT_)n/}[>`gVr*Cru;7v u p t " _(RdGfL  C _X j iI E   P f l!   K    $ _T  ,;  "5`B L {    % | 0 W  tT )$@ i;E=6HjKX-Ie:IHpWi6=^[~sw q  J!Y ! "6!L#! $u"$#%#|&b$$'$'W%(%*(%"(%'=%u'$& $&K#K%x"`$!n# "! a3 SnRao`=S\,& 5 1 k l hF04 ]3#D8Q<+3uOTYr J60 >+-5Xh2FsH~a@7DWޛP:#%_Mai%CPlz,Vi`42!+t^^ +H)Wix,/] :e- 3)vEkzKFR]V8H*ޓtZr8wݚܴ@ ٗ H׊oա[Rռ4ԽGʄϙGΞFȃ?=^ǡ'dV{UςϕАYtxYw.U ǡ_3CϢ8/Aɞ ˯?m҃ϚW+tm؃՗ַb*ظذݘٙSځۅېܴW(ix!0c'[-o}j>LEJ]g:s#{~ifd5Hq   q  Q  Z   ((u Lc2S QgWbU!|H yXOX4N}F# .Ma`eY(M>>\*7AdY%^a2NX    > C  u : A. 8q  uS 7  X 2 /    L 4wz.NH*1mE}x15tKVMK#:Smrub:B/xcA$.}N  r j K } I { [H 1 0@ >` gU W AB5 N)vD"|_5q99Y3nn[cM_[OhFDtl P 7A/@zpr`oGuIvE3x@mp5ujH:R^ValHzzPkyYp_Qmus݀ݞ޾v4rܺVoۛ!Eڸy%Oح߂߬cճ/1܆Ӌadٿѯٮьٹnч2ұ٧.XӺH۴֋N; ޔl(7@NcTJ+Nd.p,[ 9 1 U?w6%:fyaPPGdf {}A)v'iUR/YZ=(=l(x)< -%# 1.@^'S, g 5 /  1 ~M g Z f(  ?  , ag  h !  eh [ v B ' E u,~|q [ N` O V Y^>4oPaX9>- r  E!!!!  $ / ] p    6 ^    d 0* ^- l ] !U!{I""#N t$ #%E!%!&p" '#'#($R($(!%(%)%))5&G)y&_)&j)&{)&)&r)&|)&W)c&D) &')%(}%('%($[($C($=($<(%e(I%(% )X&z) ')'z*t(+/)+)+A*B,*U,*G,*+\*e+)*$))4(('t'&'&$$I#q#!" ]4,Br(om6C k>> M 7  "K r<&1%@u44;+hSf;[dGM qyxz*X|_^pq^Cf@kn;4|Zߞd޼pzmc I8TdU׾tڡէBuؗӰpӳSB/p~ْt+#ۆ ՛ܓ~9E2߲s٢aI8Kܛݺ/ޤ5_F<w'/ފ7AܣuzR?%߲߁۹Vۑۅڌr߽ڀߔډߐڗߋڲߕ߶%>a۝=>ݍrQp|"x`!x>LIdV%I9v޳FwrpRQ,ڨWܢzڻWڊN6֡:JZ٫ӭb؝LҾ,~+79|ҳn):֗՗+վպFDz׺H׮,ٹصى4rڔ^?0Swۇޤ!ߤۗ߸߿Fvۜ#a5\ݺq߮qYB(1I(`wAOYAf=2\D'(w ` = z=. G.)_OF <!!! ! *! {(P7-9_  !!! "!<#u"#6#$##%7$%$ &$<&^$_&#v&n#T&"E&!& %T%$c$#O#"2"bo! , 72,~y{W*0Jm=v|$CyN?HAIL(Re`Zjs~}xU4,3 P}~}LC @h#;q>\8O8AT-P  B g 2  B C o t V 1 L 0 5  D a 3 .  KDI9bN,:=008O]{pfz~gxW% tpp )vL hW`~a<tE~#=~/QRv|>- xvCdyQ'Kvy'tAcC-PUn=߃)pݠi3UE\2݂hݲ(|XjnScG(lL$i25dN{]f mpRijuJ`rJR}o`Eu0dD_fpN[/fbyJ*UgaDMz` &c B'6RdVgG]zY$+nrm90c n&j:W]6\;\*aYqr0^d  B M~ a< n  `ZB-W L M lu %  BU=djP7#XPT>7qk (c .;tw%z x ZI  !QI)x! dd>Hu6TF3 J lX}y_!g6kycWrG ix3>UW/߶ހ4&ߓݠܫ܌Yܸ;7ܤc܉ٰCگT,ލdDf|W]m8 N߽`߻ޞޓrޏdyceW3yޅAޤ{_MaސH "ݠ݃{ehV]XOmsݒݢޝOޖޣ(ߤ߯WM9jB T[ #Y5)j$>bk&/%8 " ^ pf  c b'q}^MdyK !!q""S####bu#3#"F""!~]!! _ V 0 E$ ! %%  ^' ' '  &\V xV-#"EY q L!!O"P"Rj"T"7"!  & %g*J)l+y>g=(RL+BXs4cee8 q-.fu+?]L < O y %  @  3 l   E t & y M   S w 8r g|,u?`Tlf[#e'B>zf'o)+R{E Tl5yf(U/Kjfh *?NS^ez=o$(L:o2\ \lNY\/1Rߚ\޶ݸݎue!ߓM!ۮ* Yۄ٩) قEܝٔگ޿3߼ܭދ@B.= Tw3v~}wS AvBZv daNi/r?xCCP^kOi(Bv20;MkN~tge(t.ZU-=nW&+63 ] N    Y  f A Tc  v3   OE r   ^~ 5C ' + & , H cz[$ %2IjzzpO z 7 =  O * b'  cO(Kqq4<pxS2r]TzX`xH+\ "jCq  d!!"$##^$'%%&/'&(A'*'+','!.'B/'/0e'0&Z1&1%a1Q%0$0#."-!+ *"(%#!E.w>dPas({]`hF?%E\ r d   Qy u   l crE 4XjrE31TgtyPDh[nyT pS+&P1 4No.Q%f z'I^&'^`MHFdGoN 10"E"PA%iM2$@q0iXh]#G{\G2pTiL zx.|lbn~x"Z|7Ah} r2 S   4 P/ -   Q   z B " b l;1SkyWqab>,3y']D2 i@- U  \  M  t    G l Kp ]A 8FL!m`E \, uX0*MdXnuuu Q3IaExbsXAD4+(uw#&j^,Hf@:$v H 57 7  B 2  X c gTp]0q;  B  + %  - 2  o2 5 hcef0y D c 8  > ^ }Tqy&?'  R  Y D  B   G  x  <a @     ' AT Q t 5  G Z ,\1`}t\3  CjD . Oa^]YO[US@EYv^1ZH`.d YJz|xdr)[>\t JT`oU(@%5%k~wZF+0,g'U]sj@UdB_ECH*_M"+g>4=iag>~,D`aIM2`-/t'4pg,jK^8<8n2=zVf= CD.N fN HKj3h[9\bM>9d@ten|m3}k#u_&a*=x94m+&_,0eG[\4 2 xErIkFp%*{[m"Jt\KTC{^#Tz|\0LYS]j/\bgJ+ks^Xg+F6."MS0i)4f%({jZ%rON}JSVF?wQ#5Ia  Eo <    xvm ls Cs  r xcQ0c3G]y].|AbBR^w")Y6PxX7\! 7mO#x(-R   G m A    |D  QU  x d b ) 4D_Z0g@3 *uE*@`2%[UK2z&1"c :3%'G Fi;_{ofW`rs U0 Rl,kJ~UL0!y"Ll=}nPa<`)[#tQ;Qh   o $    g  D {  R9neK|* |@ h G , d r % m ] = )   < m | * m S Z 4 E |!:&]%?1:D#JEMmlG,lj"A%zG"3[ zAU:&) 09d :8 [+xI%uRz9}L ]uK 8s   / g .;"mf42t'kT.vh]:qM'Thba'A6yA=:h_35!=?yUFXl^8jY{9p p+5y\r8|MFA#s|6nF S6Q }J7szzA]E.Gq z@o>=P G_zrsfvknwu"XG]Sn!!},pC`Ch[~!+'"` }Q~\ /mg^5+wߞL($}E߃1?'owa}jlI(tM>:kg1j7B#C9U kMJm| /X{U0)"o50GwNP8>m}'@\)0gk=c?bp~_c/bU9T@kPM"$4#Zky$FUgz:Q4TV"djl''/b?!Hr*KFO[e'G(@zk@Y#U5Wupn3X$ZT?$mf6#K=mXoT0F_dpUAyJdN^QwquDk# Z)$  M9|q{C#~ev]](2J>|!acZt6M&_ rd JafEM #6&gZA* &Q#uv=PQ Fy5nM| =9i$O%rJINY@$[G$ * H _ 4  Z n  . xU -  ;e]&J0eh3k#RpR:/+ ^N+$`tQkD:);Rv`tq5)*+0Z!DjD/; s,0Suu@oI$r8A'gU2ab!Qd:^MgZG 8L:, 3aNyir  P 9 g 3 D k ; o ~  hfsT5g V, { d  & Q Q    T l$ Me0;+/4j/ 8?a)cSW:Na \/bFq ;S>A.epi [  u    j <i&pWr9r ~ h -   E5|@u9^"&  6]JTS 9  pp 3  u 4>-HHXqON . |d , Z x 7  }k k%1]B3\okBT&v-uGo-Hb_.,[&/{y1(V{W>Y(fDf\ g   c  & ] !    ;=0+wWv`x8t!iw` u > W gv  N  7  U    J  # vh  0 xy   0 [ t v{ k <  `.Uk23}KY'}:m,0e\KmGfO2e,U)rCSjn"%`5,,K|{1o; B5\J]ZOt/\J d,W/GXgfEw /(l*)r#etBDG7] )#w1^8eYb)|/\T+    P ! JQa0 < + f 4 ] $ ~ 3   @ y StY;$x'l"@3o#Ar&I&l9VpM:S8:'O`'  9[VKY#ex!_nMKMvlrPA_R Ji2H\8|.v24 M @ :  ( g  J ' = 9  J H  2 3% % 4Cu\=:cE*3zJ^v$)42{  ke6r@[cI@d3)W}Qe  s-P#,w?1YPPur0NS$UgJ "KM|u"ptRJf}  - b / V# wa lt S| Q E L} q  , <t W 3 <   (1~. Rs5c  Z & e F 9 * sJa@5Eg.b3 | }  ' c  ^  ( bX    6 L W 8Y Vn 1 - U9  : Bb gc4Keo&3v!x  (H  @ / ` p 8 _  `   y?C zp.e-}RYI< I ) 0 e _  meG}[, t 2 +Zt9 Ds~8n,<bX~}!;@ qq 3  U k k V 3 $  [  <  O ~ {q V ?   o ]5 R{c|{=wkU=c-' %8 R eHue2McC:iM\Dl^-VJ5$)4OWW8TDaO h VLeh\[3.IHPIcMlnuP?<^-|qUyHyj 1XIZ\Q 8T'q^7U.Pyd+7b"VK fqB޺ޛޗSެuV`kMx"Wkj%.2`b o]az7ߨ {ExV$99`deu-nhf GF1;4eADP+c zh% qU\ ~ )  $ p Q =  T ~ O G | * I      H (    . x' ( # 4   2u k6 xHx/6{RPUXD1m(;>3%"AnDpR;( GCx(yx~e>#O$1j*X^usY8Hf-fFc>'t7z e 3F6Y NyxL 4B`3 !c)UzQ}ot%uW}|l=mC%lmM1DO?߿ ߙ-ߥgߖy/rJ*nx 1v1k߱%Ccޗ46 ݦc @.0ީ2ދ c0ݖ#ݖ܎;۷D'ڛ'/[ՏלԧoiZtӗ?i=|Кͮz ;voʤFʛ+zMIrDze5ưCǺn° Onȡ XJĠIĵ9ɰÿKó‡gLɋ+4ǪǺcE^ǬD:[„zá5Ȏh7Ƴ_aV0Ȏye@@̙ʵ(o˛ AΝ[3ͩv ЫJ͊$ K;~lΡ/Ѿ#O}sӍ8'ח&@ّؗ!6۠لd ܭ( &)"* &/-d?ۣmܥ3ۊMݹ<ޭ6B4޻ <޸݁=tݧdkd+ Zwx$/dE547BYPTw5  L b F    p E  X=&   8 Y   _ 6 w { @ H y  8 S  J ) D D  Z 0 , &  l  Sd,<c"b^k& '> 3  h    c^ 1fq]jm?c  .9  \ c )+ c }f D ]  n  ' |  !N ^CT.^q- ]>Jc.T7EgLS8Bm-Nr#^&,]{hA8(jtl0l( Rst!52ov  F!H"##Gk$x%%&R&&b& m&2&?%V%)$A$#u #}" "'!r!J!E!^!~!!-&"""D2#####2#b#"Z"! JjR/! }v6{U{hjIR*F t*^DP[\qD:x  _ ! . . I m   / V , dF L4,3mPHrF F5 k\EV?fEg|"?Uleo>9 i8# h'r C]PL-V'9hQ+u 4C=-Pr1{{`AD?ekom mn&J2)  p q h S "  K N  :N-jF m ~  ~ V w YCh|6f{ !7PTQ2 [ ? : a 1b I  o . f;e|F}MfT>} K+aGfTcuO-)]PWISf^HvZCfe=^C.8pM, ,5`"LC?od?*c)Fsiugu}V^#I8e1+(>`rxmiTgV(#WyfK^f-NEw7dudD,_a=16kaK2b`Y_e-;{DE !XE [;N5$G%9JC'1hA$f{%uD ,g'-=BS5LYG#o8+2f$iUjD?ZE  TO-Rrek9D-z+-xPF7[4P@PE<Wqu5a7D Fh3#-f7 Q m t   c   2 s [ ! D   x @  c5d3-&.\O(1]X5o+=p8!yl b"IPOZcPtQ aacy<'5 S/oxav%_^qW'ca G^}>1) #*Ea5A|(AT]\_$"kNVB'DZp7l:(\MhY|cW{kv.v"P{i6nKH` p0ggm8&m [.~nzh!Fp jlu}      r @ P $    &A q  + B    M  u + .  i ,   `  w2$zLfNMrtXDbh <ljc\\kG e4 !"\"###x$v$'%$%$%"$%#\%"$!"$v =#:O"C!% !!f(5l[,|B\sB>b3?0vxU_>VBj4v    A B O  us 5  P   4 M z     .- II gQ vp zt y t y~ ti ]b bX q( m   x %> m  ,  r 8 = ' z ) %  dM w  Tv +D  1 w a M ` _ c &kd+PewU) )tg=S: Hz[> "hlD_$brz ?nu\E  p p/i ;  ' }  f LQ5 _\tyMe;p,-.*t8sXBRznWn7S:\Rt  M:'SAiF(X_kN{WI:r~Q^BHR[a 0:!JB0FbccQb`nRwF<83YowfK,m*0mZ@s9['r)cSGf1Vf[aG!T><]G:8v9.jFjW)c^'GH6Op@s4A.3-nait#658L)m$u^7[xQW8'k%%-Jk,*byOH gbMr|H((@$p7 79NjR@ 1  ,]N  N.  y&   J8 |c ;Q~ !X""#z$De$$$c%=%O%hJ% N% D%W!R%!M%"L%#p%#%#$%$%$&G%=&}%{&%&%&p%&%~&$/&$%^#7%"$!# #Z"!% sb &Va_N_.8j6%K  9` #  q  @ A   F   JM/  `WY % Ao#X:{smeV\ g8d+ vj7j/S &JLg~7Mf^"klKD[wZnic5Upmr7k4> "3 `v?KKUk>(j)hTcxN?>BUvm45(m:Hv@3!IeOQ&;$_8kmY0MBlwoH2-';]l /4IZry|v1o,S&BXyg}MaCp 'Am^Tei@(X u+| /   V  k 0 H uk+&FG+eA~2Bi?Qr1/SzzDT_ZFnzJy YZ * U   yC   #} %? #  J # . c %FE! z'(Xf7  D } G S 7 M h u 3 ~vSygx[JHaPAHUkB37yy, " z u 5 ) c  : ,d Ns y yr [t !k e m K t  Z  R a @ X 1 c % w Z r  ME  a  + .T 4 0 Q  f l  u  ) m  \ h =sI> .VpH ]   := z Y a6fa  ` iRsCu{pcl~;q%0>xZLc$]??53FFw z p@!"tU=H$c';*)0٠(L?}t%wΏYikYԏ94Ҥ/B022)ͦ5́;oIOy?ɵ&+ɠo R a,ɩ>uɥȬ3&ʩNtvF ̖r̺ͽ͋ *U@Άs+0УϡMЄfӤU{TIJ 'nٍ~>ۃTe7Qٜ݅TI۸0 ݫ 3u Ai3GWNݘ ~= ڴ,n[߭]ߵzڱ߁#tq ޏS22Yxq^6;SvY)z޳;އg_o'ފW޳ s@u-`rh.X-N,`/)YOS d/\{s ,k<=Ks3y^D o  o K +8 q- ;6ig~:*v .!-#d$h%I&P ' 'E!9(!(!W)")J"*"E+(#,,#-{$.z%7/s&_0'1(2)3$+4;,h5:- 6-6.6)/6/6/6/<6/5/I5[/4/3.P3.2.1..1.w0./...D..-.,a.3,*.+-*-k* -),Z)(,(+l(+'w*}')&&)V&z(%'$&$ &*#%"# "R!d /zm.TE34)B{  f  Z  '   m g G?2;Y)Ch0!7x$iF +YlHu$ ACyebi?, 41I4}t__]1>(#!v 1~;7qlW\Q+*<BtuO>!RHcpJ#V9JQuu =s 8Oj&~"^C>{F")KhdP%OgsL7AS}Gk_/zZHWU5(K]  D *  &  9-$0tu dpl6 44B .  $O!8!E"[ T"+!n"!u"w"`""#""!"!"!! N! D<&sw< TM}? K!'<JC_8eB]Zhf : & 3/ P | 4 2 \ b Z r p   S   k  h  #  n   n X!_yplvmU`qEMUs]59]y'R^`8|6Fd3kw<Es-?<~f0aq?C $|/,495X1r}sN/%d]RdC )PBt"Dlx;tS~bBy.A#[ceW|tI0}f?& =0'tU($eO~_2gby[Ax<t=! ~ /  7  b?m7*  B  } \ dK 8*_{z"Sn$s"^,/r 3hZ9 - Si~'L_Sd8b11$@E{BHUDj}{lBJ#8B39'%(I<bN9" ! %| Qu w   b *[(m:d0H MF  ,  v k H "      G A W 2 x   & / j %\u);{{!~"&_jf`K ty"_4Axnmoa^LGJ6@~@6<2m+<hmSMvr4bT a )  h  , 3W}R'tpOEcJi"s peqgMHi$N M13 C0%le4?GhUkV'Ii2R'-{)fX)$YGtdP#|@&w tJKVwcI)_ ls0L ;^xR  B[CG|,l<; JE^ckH'73yMN}]C Qj*dGZJ. E; O1F{$L 8]st]4Xk+6K)i2SYm[C32Eh}rz)}vjgS/QTAhX  #w   p 8 r w    owf/w[=>fBMbsoUQmhZkekl{5pb (! j=iv.{/ER1/l@Xh$= ELKwIZ<_Cqh\d,lcxJT4 <HfagO )5$xf8 P*ds~nmZD1wY6 ~M0$@0~mB [ m a  Bi 6EkZ LP{pSA E<a_  ! S _  y M l S ' _  ! 9 ? 0  O b ]M 3_ T 8"*L75O,AG|hdC_ (ol8 pXND0q/XQ dr M  x  ^I]`]Ke ; 9K    k Yy M 7O    Y [ K 5 ^ u p`Nq\^VezD w_D]8%)s^* +iJr.E4A$/WB^"Q0/gcX@kspHM/d%VpV<s\^u%o k2`8 c< ~ "*Cy3  > T U`zCv~kV7/\:SoI@ ' 5 w6 7-   sM AKz(}P'~[  T3$a''7sM!+  !`b"7#%$$ % &;!'!R(j")")S#*#o*#*#*#v*-#-*")! )$!Z(7 '-&/%5$<#a#L".!1!   } 3!!j1""w#:!$$B%% *&&&(&&&&&-&&{&J&I&Y&&&&^&^&&%%@%%Ny$-#""]A!b g|jrVN Z4c|jw?U}M0j _ [1I0` u  i (  Y  c +  * yZcR3w@  RBy}?iktB`w[YBa0!PBhe=< c'=,p 7t+@%yS]1r YzY1H$*RPupc5w(F+oQ<;i~O(Zx]ar<%&SnCm\-4jFV<K!KdmY  2|y*hTP]mn$4EOTizeeIvje;Nj( z LiL LF faU2! <~G!n(@7<600Q6apl]#fA'&Pq` Kc-B1#Oxtg\9@(;=_?/ N} P  X w  g/ @ @ ,9 .2 4/ 1 A l   o   I /  k2=>Y9ju\5%oIe {Q{gY+W~,czzMd{j_ ET$I7w,q-FYhMg8\\^ n+1DyUb n*IWNi31)  WK } q Z L C   # v U  M  X  c 7c,eY:3 v*9K*gc@s?\CoIku+{,:%_aa zE gaaP?4dJl- *Zb lm;7 NAU'lWQ0,&S޶oWw1ދ-f݆ڌڱڊuـلجٔ\f\ڔzuq ޔ۝f ݏߺgGޓaLK~i*': ;u<=Q [h4;t߭G^p*(d]NJ|eZ}1Eh-_eV`$/X P&{ pu!}}E'.zu'&dz0kj 9<QHV,A}T 7y}nOJ lE{ zsj F N)y>;Wx}Nv6w'8Wc TGHq*7w3? UBUFjV~(4(iUl"4:^^~=s X>ZNa 2Wn|S   'J o   -YF\ P[ /  G l |_]2@ e ! 7!xi!!!} "+0"{"" #w\#b#S$;h$8$+%*q%# %!&!o&"&# 'F$i'$'a%(%8(%v(&(%(%(E%)$(#(#(!"(!F( '' '&}&Y%"%N$l#Mx"]!: Ux0(< mM J  N Q26Umt03 z*M6, z|O~]n X^utID* @8zh-XS0]619DNBT=bC36X)|Y6eLC)#y.$KA) H <{X+~q<B{WWB6iw9\#+RCgc4aANHf0:-q+ {-   Qo u       ' 2 { u +  O 8  P P Dv          |T  p 93 -IhEA[u l|#Gy-1*Ez| o9 K M ?, \  m l f  w_O5WDI]e$Pt @f G b  ] & C  $ + $ C   l  v xu dJXPKIUB>#9L0e?-3{#tZ#zL#fEW)|J^K9M^"$bh@;9MC$y&G \  U  V 8jA6> "WmCEx<4_\K%(Nnp"8Vd0$(S {Kf"K-iWYcWބ<ݐ܀ܧܥ f99#Q(c*+h*|viWMBE\6#u*0nX1ST0Khm{ Z!iPDWxQDF JGre HQM5VJ-!kWnwhnzrt  L A ( 0 Y Z ,>sUoX#>VJp  @  : X{ <pk` 1 F   Q N d  f#  R:lDu r}tu. R`6#!N@xeg= 4JfDu;^<9Y$O{!V^)Qn"Fw1Xg`2SH9 Gd F| &   * l B z    ,M  6v2}36H eYr-}_@=6WnTR03n9 *9nefF<PsFx!x^'Lw-t?U!ic 8 n\ ,fy}i,:yjma5cS< } j 3 u  mcQH^oxm`) .}2R6:s%'bL;UJK>FdScrJt&gPhV8nޢqE@#ۺK{`ڏq^I8DnܟbG,{iM&bXc7ݳV2߹^  01ۖcݟuIYܕټ5/ؖڭڏؿٔpٚLI%q|ٻ,0ڞڊD۽ڕbތڽAm٦I-(١ Dh"Bۈ"lOp  !H \p9}nPI!YErdZ*\r=tpXr+maoCj[stC?2\"c5%E,'d_2wPe6J2(vmNC@u7L|*av|gd0EdV$/:Pjpf+#&wk 5 T - G n1  Hw"Jfi%aP#e|M| :9Ph   l B   ] - 5V[0  (]jo@ ~6|\P^N{{Prh^$?@V+n7TALc܊ܵ܎J+dYޥLVԍBݹ0:$vݶ݌8޲Јߴ,ҍ=Ֆr܋6ߡ~c1/4RiuG1SBM]7Nw?jAg]VA(pZ?g}F75:;;/SBhmn^"0-m>MW7>q! :p"kq0U56%RELEx8ajzJdn1{bKOFU`ޠ{W85"Xںڮڭڐtڨ7ڣٴ|j8+P[V="Dҟ67RZ`Ѣ_N\ԛN׳Yه}ܒWB E\pj;0dmL5lfa7 Rp>&-QsoKKVzNZh!i{SODOnhF.{Ws*d$$|'VR(])?h5Qr  }f  Q     t ui RU 2[ 1c  & :5 W I  & gQ#V  m   q ; R'SH 3@C&w-;Wx!|oynUCfOXw\Xry:&'sS3q[* :Y1[Knj_H"Z+~CsT!\4R}=ht&N^fmwz~g '    r    1 y  ; s   f >  3+ W n<WlJsrW3xXEw>7=<'0R" |TM6* @v3_ D /IygF=nr !d` )d4* )"G,WBh;2R$ ILp$;vVl3_]gH m58`aVZO-8-wEw#;VHQA08X W1u,4xoC0aA5zJ7zH# ` | E ; N vaEJn[zT-' RV0?-s`V;FtVN!Osu}^"0M@s#*>SX1h[zB 0iAm4 r*T*B}Ii1UjXe2B27uTBN  ! #  {B#]/alDl ! R"[!#"#"$#%m$&_%'`&!)z'|*(+)X- +.X,0r-J1s.]2Z/;3030]40414?1y4!1+4130:3020 201j01f00e010m0/~0/0/0/0/0/0/g00@0+0020/80/$0+/0./>.^/-.,8.9,o-Z+|,t*y+l)T*Z()(''%Z&$$d#p#"! } [5D) +HR(tl7-R3m&}   y ! %{ ) @ k    o 4 6 'Fo\H)o+Hh+N0Niw5U\Y>-5@R^Tn  d r ]   9 F  0 M D )  S r 1 e 7 ?  3  G  <l  W&-Y< n  .   } o H L n t  T ^ y z QN$?d1L ~F=HrWuF4( 9k`PdvffP7-EB 1R_Vke7 ^Mh|K,(Gq B M#`!]~=8q  * f w  . t h `    #A  J&pnW9iVc+}:62 0] ?   )B/I   2 g  z M ; G ;&   C 5y 4EP7 y#r*e m D ['h2{p)Vj">oNGMx )!<" .#*#< $!U%!%m"%"&#&/#%#%"y%"2%"$u!$ a$ /$j###f#,#"u"'"<k!g  ;]dgEv3eFY4FQD2G9&\ 7L  2p ] X / 3 ?l>"F/Bjuy3; *.iO-[0D@+ArFB{<'C}}MON- dYI:ki 244:H4rF-!)9]Y6T Dyk_N_K9O54R5>=$+Mhr*    Y ~ . & D ' k A,q l>S} 1K  X   E  3   C   mY y  Z =   8 ? O \C`X$N 6b_jr]?xI     )  U  : ]2  b z!wbU;bGe z(|5|$f}. F,>euF  0Oetu}<~nb{bXa]#hLq];tY2CwgPRjmc~A:Tf8/$Ia#ttkgradQwS#Wt> y>oae)P}]K0] MJrdK:9M+T7U[ /*DG5l9Rb{n@ $C &%'BzHIjd(k0x!j_A5~B/ 4R"{3]L.DXzI1    !   ~ZD'>_7LI]a&z,PV;Wjd;npnJ9>nK("&.I!bR91lt_c!  Aj W /  <8 h( gA   / ,kb'3pRrN-H.gi:n`srV_8O;q*w FA{&g-Wl+zh[b,nK~&O{'.*"5M[`WzRmVcBU;eAjMbM,4alaA   E t5  ! Y   ~ W  u z l rw c q    # N  t U  V  Ax  y   Mjp}T=X2TB{t>\ x&6MM`T4y"Sr}6vO0 QahCkO#un$8wn+i(} j{vTJJtp`(g) D)>9i;qkkpYNYbuiik`Q3' Hy~HZ Qx\JE//WfbVK9X,rHxM%sBb>j b(u k02VE.>eFZ[b;'v4].߫L2|kaރc (iV^z`&cMG?`9,-k"%AEgU/;0\SI1a8?&M{NJhfcqZe''KL * b r a ; Q  @ k P E !m Y ) )    5 ~ ) ^X ?3S !"#$ f%}! &4"&"'s#\'$'$' %'%'&'J&'&a'&9'&& '&&z&&@&&&&%&%f&%E&%6&e%&O%%7%%$%$%c$K%#$k#$"$!q# !" "Z! iN9(cJ5.8  xm ' z*}M  B 0v\`H>6QC<7]!HbpQ*:N&PZie5kr(C[{wY2l Sk\^ zl6L& ":X^#\[CWj  > [t J z 3 3 = * XB"#jdQg}m q y  k  @!s4'7@w,wP_  M yN & ) + 9 M t _ " | X  s . d  } >r<eBUG![$EEL; R8KR,V0:Ibb! aExo|"F` 9>qC`1=i\>4 f=APhu=6'xkhwPF9u+@ fQP! _7*<\VA48TI+}!!+ 41YYJEsg!sP\Z!}OhX Xa'hp6&H~Gcfn3I](74@/60=`"\y~cB2Q #:o\ k&YZ"E\zvlP_g   ~5 \ 55 D 8  y ,x ](3 3mpl@@=0fV^1ZcStw;9`@sL M - v # <  nD r0 A q5)KRkhg]rfgwQ++hw)4J})79\o q0wIliju~gJ$, R.HqEKF*&.^H9`vN|V,Aog a32[hI 3][M2h 5  |  hFK ROE Xm  R"  =B  : } C C    ! F O    X2[4CN3_gQUP$     R%  R  9y  D {  ^C~?gS[p2wL2gm7XBeue M!MkszLu}O908A+0,\": 0./&/.$n~"8Ombm0Ee%jQpUEkv2D*E{Gf \$ X:}:Zd[6#?hYEr>7TdvPwN!c1L\y5U"--$YE~Cv2f4 &HPxN  v.n~WFQzfC  =  >      c )     t  & d &   >  d {  Oj iB/C5BUmqiHpb'hK/ =)T7i7o+l3r^?}=vgQ~o1q184417V>Y|*6ۗ ܾ+7aLm6FD\ z1_+ g*wxDM/5(!`1,dfk |KDzNq&x;e eQ%v"by hiEU,7.:bo VP;=vV$l$bRMZ7c( !  H  = g % + k?JJH4/%. Z cv c m   &!!p!"!""3#K"i#"##w#o#I###`$"$"%#]&L#'#'d$("%1)&)&$*'n*(*)n*!***)*(*+(*7'c*"&)%V)#(" (!' '&&N\&b&\&1R&{B&&%7%7$&~#I" _3Ie>'C  3 a  W NG fb87 z&}GPgou=#"JXBM= 'm?,*?neP-#>1qo_QWjG .q{lxEphmbj'='1h=y]6-FzA8<!PsWz 6 N  q  * w  ! = 0 Z H v s ~ z q T 9  Y % U 1 )  :    h '  : M P QjI g/~5 QmW{XZ  P$-uDi#Fgu 9n.j;8H|G O^ Q~+*\xgW<7LM,phQxcq3 Wo\ e  )   } / S & u a : E o[r"}liN%n"??q++uLo $  "  Q   q J  I F p U z  U ` Z cy   u /  n   z   h Z% %  ' Tms`mbkYaVLJ2|/\##xItlU1 5/+%"djt>r|Z)ZnZCQ iw"L]Xe]LuW*5`-n9HnnzcCGVAi):4wa߫1X1mNۜrާoU}ܕfO׻[׫vעۮשױAجۚت؆Idۙ+$ڥy9t@ن۲ؿb $>׀װܲܬ2!*aܕv!*ٯ}'َ2ڇtTۢDV0*}`)>ٝQ۬g87ݝ8AZ1)mQޫު,}|w܌u%Fۿۨ(ܞvܙ܉DqS}#8o.]w'e4eM'2O;Ew^h`|E@9\j:tO+SW~e_V!2'V]0G{mg% ON  r  h < 8.  e 7 [P k O ( D G . O  o ; E   E  v > !  Y     9 \  l y Q y ^UH:^P;6yl~Q 3i^(G}E/h^,U{M"rDc{BW-[ECy6uqG.T2~+-JRr7XEQYEktj L   < 6 A G ! \  .  3  b N Qj[ Pb(uMtqW!  vz!U!*v"" # B#s P# Q# D#} #"aQ"g!S9! ?V8OO7*E i   e t 9  | )eJege+5vUM$l[ivbQCDgSNx_+WU-߱]Eڭ@3l;9>\ڸvT٨q\Eva2")3ݾ\ QZL1%Xzgt`5XvtAX I,2Vur>ygc !wCy[g)3/dxB-Jx .m\Q$,Zy?x(s7_7q.M#$(T2f}6rWHP0ZK2 < 0 i  6M  E e9, EHA - m , >  tB6~f'1g@bR  Q!!b "7"8" !O !_ !h r Q  7G w9R~Jf  Z!!n"& S" s"G!v"!E"! "!!v!!!v ] Q^4a},=7*=AP7 ;%GR[U9JvDIZ x  3 % w | > c  jr &  R Uh :Zd,2{*F&}nK>dH}6D?szMb!PWWLr*5}g( NtIB:3]PZ5 Q3/ cC/EX8 C.6:%i5Xq\ܜCp ڷ[ysӬӚќBЭзsЎЋϠC`ȜQ9lюƀ?o@Ѥ`c ŷΉ)SHwú˹˥×ʪEʶ!6NʋĕpŘ ́Lʹ?X\(qzЕh-&Y͖҅λLӆPwկзP#<ї.ٜcvЂ8К аϥٔϙzςss,OBU];9U?Xr seK2%+k-Z %O!aPn  ~ 1    2  C T l  ,G   Mwq;A ^mqg>  #% 'F !  G v8)s!h S N S  `Vh"!~9   M  3uL`k^^7xS\EP') :y 7 . : f t  = k /s 3;~h<d);B>$9`8#mkXxQh+m,Re0UyH2+yUWޠJ޿i߈Yނܰݎ)ݨoF" ,MMݰ>ݕD}mo#WsZه֓؎սנ֣G֫ҧ)ѷԓvMQσ#'~М $ֱѤc"ӝ؊T)՛ز#y ٹ+'٪#ف$I !7֖֫ؑ)׊טؘٹ.zRݳ=Fڕ$s kyߝ)t$v:.NDR"<nz YYXIuj=ߤߜߔ߀]Eۼڑo'~.ԵݛL&ҥyrKӗܢDݦ آtٶtd߰m 3n!^dT31hCZPcY&X,w5~xHWoTH06rE BF*Vy0  vO g7  nA + x  ]  "L]FX:u#r*4BS~V.T 3Xz;(CD=:Rw!Qyv@%O.z*dx0@oIz'; l %'lqgozXuOfeS ">-5^Bp+]   1 I 6 5 &    % zs M *1 * .  R  Y S{#VH\6 Fb@$cz#}Jobu5 . Y? E B C 9  ! !  O d * ,/WmR z;c0 "  p=+R#qXQs\1x&KI.K\<6&TzNe J9B+#oR}*tWnOwjY90(xlUl2EC"b'{IE[Fl8D>ln1v;PWu<ESP~&Y!lwhNXB`vfx+2~z9IxK(d+]%0,~g4e^OAUvxy`l _  v <  * a  =  , -  9]nz,!AJn{ & ;! ! !i"Y!"!#!X#!s#"#>"#v"#"#"r#'#p#j#c##n##W##_##V##j##e#A#w#"#"#B"#!#! $c!E$O!$?!%j!z%!&"&"`'#(#(j${)%)*%*?&6+&+'+>'+K'+>']+'*&j**&)%)%Y(l$'#& #%"'%"l$!#G!# y" ! :!^ )  Ut8>DSK}zs-XJC  !!+ Y"i! #"y###$\$%$& %K'_%'%9(%~(%(&(!&Q(#& (!&'&#'%&%&%%{%I%f%$;%$:%$F%$]%%%%%&-&&&' 't('U)(.*v( +(+S)v,)-)-O*-{*Y.*.+.J+X/+/+0W,0,11F-1-i2r.,3.3/4E0+50516 2r62636x36364W6?4 6S45W4N54443j433*3v3221n2#11V0C1n/0. 0-f/,.+=.A+-*,2*,) ,)+)Y+)+)*)*4*v*s*A****)*o)*)*(*D(+'+h'%+&X+&+f&+3&N,&, &k-&..&.+&>/;&/D&0(&A0%T0%10E%/$L/A$.#-#,s",!+!*9!1)!Z(0!'c!&!}&B"#&"%w#% $%$%6%%%%%t%%Y%V%%$$$N$## "# M"y!` ,&-c Ip,y!39?F3S{='Q0F'\%xij8]5`}oZ h 3a h s  2 '} *_""X7tY~?/83#_-dn +,{P0{[5vK%DdW^ MK`Dms+m8N'K(jm|>vzV85sUV'[i`db78 |R\C = r!  # J9DpR+     POy+$xYiWfwv#~^):]cI Z V!!;"k""#G"#$# #l " "H!J"!!a"!"T!i#6!$'!$/! %a!%!%"&~"I&"?&n# &#%&$#%Q$$Z$#4$"#!M#[ ")! SW2")f(k'"  V  4h   :   Z 6K  X 4 ]s=x$4r< l3o$; kB  ' { _)1  8 !!5"7"5#4# $tZ$>$$%<%sA%C%B%4%%$$$$$Z$ $$$"$gp$;$&$}#C#"X"!H! mL "|K;."{c[%+%R"V4{'% Yj   v 1 g m N v3 - \> 1 \* )  7 V N ,   Wf .6    +N   o   , 78 $cC+ @ R<ntRg 3juMz0"awqM<%nDCn2! -E>%^Lg J'OK^VZw+3>U%j*&@OZBvߚpZ\,chx߉|]8//Mߴ-2 ݍBڡ[K6Ӗ ([RՀaA΁Կ%TͷK̅{Ku9d'qg 4F{V7 {S|~q_/U: _f? y7 1u:<4TD*U:c  , , .  ! f 0 4 : ( % " .  9 ] k X Z R m R   a)  f & J[t !  N'  9   cM +  ? D x ] 4 a |  P %  V ' e  &  9 l e V  ]- Q  u   6  is  bz_CF/>aU"R)%n2[o /"#%v'D)*d, -!N/"a0r#H1$2g$2$2$2$2$2$q2$+2$1$g1#%1%0%0&H0='60(.0(F0)k0*0+0[,1,Y1-1-1$.1.1-1T-K1,0+0*f/)n.'V-%,#*!V)'i&$#RA" LI_ yO1Z<&=#:@fvx[BT:{  & w H  u $5  Y {r+7 :}sއfݝYcz'W1uם%ހSi֮am|ێ֘)BچpجؤaٛA٠4 q8۱C0AۖۨIoھيݦ{St٪{ޢ=0NߠQ%T3߁E+  C~߭z 5wR2Af+Te,nWyQ(A&i)'TyjnT/[ws,U}}^"(]y_jupO  l  e D  / h " R z"3   2 j #Vlj:dXqj]juzaJl%R"(7-I -7m_|~[ !"#%$$$$$n$#$#l"-W" ! %Z n'D](u"=n <; !a!""#"$C#&&#]'$(*%)%*v&+','-A(B.(.F)/)!/* /a*.*.*-+>-=+l,R++g+*x+)p+(n+s'R+&.+%*$*$a*|#)#q)"("p("'"F'"&E#:&#%m$%%W%%6%`&6% 'L%'m%2(%(%(&(R&(t&(x&/(j&'-&&%%a%$$J##"# "%!o:1W98EMbaPq#$rIKa /6 q  W)  2 ]    E q { J A  | . r    .   Q 7 F {  ^  d  ' Q x )~~}37 HfruG{ZD iF ; M (O a( b_BBzv;Lh9z#WDEfJoQ*0G}`=$V.xZ-ML!"i 6yx>~ %  ! N R I t X  [xTshOY03(\q>; Q@-GY`~n6aqM5yO7Tx_1 4?%L}%fPIzb1J^d/NV/.b],O z=~ p  9& r o 4 B z  g  c }FsO0)!X`C'* &BDo7L j!2""s##$@%%&&'a')'*h(*(+(9,](,'},'X,&+4&X+d%*$)#("'!&!f%C E$i#v! uM,:s:pUp,95u |YcT    l :  [ j _m  )0(V   ; U  0 2 S   ~ P k   \  ?2`mS;7T d a F   3  s m   +   Z m =:    BM   y o } I  bi??\QW9!f_oW>1IpHUgWr<^gDcv[:/ox$}2=xybF!t~;iYBI<6|2,v0%$eYv0LYfT  '  v9#\=-:Mpq.E;_U'|"-zn(/H iwSN*R`l_rZ\PZBa@U%K-ZZOo/ s]jNo@86U| 6b}A~0N4 .1i 2 th}zDfF/FN-"5jAPwJZ(l.jpV+ {L9;TC9'+B"sg806sF!P\=0:$0/BdhAY5 -jm-"I1Wh}fuR4 TClnRAQ.),If ;6>ixg NM $ 8 u =EX|@9Z H[sK&Ed3  < R!K!J |  z},NaP `.-W1J_'srOiyN9oOehZ}7&o`0&-N-v|.  (  L  < m  ? ( M < c  C ne  *i /i`-H   v     a  { dMzk1' =  = [  > P, c zJ N G(  Q=ku+Z ^=*"|9 ~liHLf uZ & K  q 0 q  ' A ( I  j s  A1 ?.  (   ^=  2 VC H   2 @ tc 6s   I   5 [ X # ~ ? d 9  J + / BL7c/lV8$3` O XsLV-q m }B.M!5 [(1hS!y,GHZLx!D E IQ S8}&4n:3Z :p!{)kH^g?q{QLL`v a} v  X e  7M\mot}\sVaQ@f~:T,K9jiGNZ  -0 G @XQ +/{o@ll|r ,!!"#j##1#_#r#K#"q"!V!u . 5p \qYBYea%4FIZ8sIB.0['c:JJ/Gu0 \z(a 1>~(ze(E%t"0-<y f0Sj~a)BwQ  !?!V"t"Z"l" "\ ! 5!   DJ gI1 D/D5t/7eN!Fh{}lX|Np["'! U  @ s o y $        1 T    w < [  @ r } %n U 9#[]uH+8k:(#*rList&x8 z{CU=FnkT`.1QYH'9sE] G { o   y L D3f^fp\[_co:Iv]f^ >teY\,Ejz;37A%$FJi-\] YD+Eh_*2I{1eZ {4ui(m,8M!Y&_||c]7dKkSJxo  opFkacM] -4]KHM(mGM y8XO?gey|_f*fM7 U ;   JvdX N N!!!"{#% $$%f&t'q'~5(v()x)j )T!*&" *"3*<#<*#/*#*#)#)C#W)")s"(!<(;!' e' &}&&v%B%$ $Z$G$##o#.#j" ""!g TM W}Kj4jN6|]W|,92AWHT/:'EYa=nX270"-;;Yf&{s+E@hGL[ibm*y%4yR 2^i3VAmpCoY5|GFh'i3KKyQqY FNS9~u%N* f u  x B D =  H 6 7 ?my K- yp|8}0\^y"g{O,Je a  L Y:(c'F~(Fj$}b{{i\;PoTk:Kz1O$ y@oMSf#<3M J%h`@54qq>M[>1 hFb(WYmJiߓ{"ߡݭ޴4۶'*ڇYۚXײn {٪؟^؊ָ&׀ם}NؘD*܈OR[8m8lJVi/yiLp,9H{ 1O,GCt4 UFK%oG,zn:/dzv+[JI/IjYpZU'At+=9PGZ.(%AcWEl/oZ`BJV?wz .[_Sp|  b K C ] % (   9bMW.$/')@qPhompdP0pmv+n)TLMCH<& HyuUBy_EW  i #n  sewPb* f\rYW&{?>:  om  o z  5  W i : i c 8 ,  m a  G  Y"D5b6%:ESw4g^Uuc^A|['{jlQiTgI (_; 1 ( `A@J*$ )#X]R^5}1QM$hx)m_h.@ (z R  Q Pm3gW~R 06` A  N  )x U* i          sY W* 4 w  y* ?X?jWca5qx ,*Pk\rIF kXSo/ev> DWtݠy<߰ݻ| ь ;~rչʠ(?Җ /α.Θn͌a1˖%UGʸ (Ɏzf۹WƸ7VYطv1Qڶƶ4Զ 8࿛£ 93av[s=7,?NuưT^H`a ϭNb΢#o ա֒K`_ؑخOپٮݚڞWۈMdPK670Cs>4 (;0 e><&W/;?~G o$H -52/ -Sw?cn`@\y5L   ,~ V rp } J 7 q +lZ;uyB:oSj5} Z&z)<ihN6#"?JhG~vC O      2 s V = v<wqOK fpQ/)!z-@Zu~e v0,Ja"x|Onywk%hh(Dmb/H<{sgn~|TX9 l=%#9KDE6<s2`Gngus>i7es"l  < @  [ n i l n  e V E9  , .  )eO >xg#7D&a92 H(>CKP ZazvqdGu yW 4 E W   = v  -Q tR  S [-C   !x#q %C"~&#'%(['(* )#+*',(,*--.//001"173:2i4L35b46|576f87!9899k:y::9;G;;;<;= <=]<=u<=<=<=<=9>K9R?9?8?8?t8&?)8>7=m7<6;U6=:58463422G10/.Q.l,,I**N(;)N&l'x$%"#R!1" &CaKVeQ"'q<X Z` E   3 c G }  L    l  d 4 Z   5 q   S ! 8 =) 4 !$  + AJ|'<ESBq<>F}FZ`^i{0^jv)E c_ K#}zutui"(>sA\nK[;3^>M,T&j%9DN$E:1L ME6E*[u1t jXD?py@=78 d]r8G2~PTqE?tkvU] u#x%\k&]Zp_>.]!u@z{hEb>#$#$#%.$'%$P%$`%#%N%`%_%v%G%q%%%n%%;%$$$$v$%$E$#/$3#$"#"$!!$!9$ g$x $= $ $ % E%$ g%: s%a g% R% E% %!$!$/!H$!$!# d# # "M l" "!~a!A! & I!z]#f6A w[Xd-,p9j  {i p  g #< 6j?as9 k  { K t $ sT)&Hw)q] P!D8sW, ]SK'O`ReAd%^uPEIacX/߁siLSfߙ߆ߐ:)-NAqa{|>k.` ( 5S^8` ulXnh2px)qSz)t=0vC7Uz3 G,jA1z m3}~cG$'b438ߚ}\Rܷ5t:1>aߍ uD`{ߝSebCK(zl R]# zQy(v?rb?#pVIPR{x? bF]M]-9:>s  ; h A @C2 [wde!*.:^HUjz "!#"%$W&$y'%(&])m'*(*(*).+W)A+) +)*)*)*))j)()'(&(%]'$&#%o"$!|#@"!>V3;X" &_h8 VCl` %5 3  u + u W > < / X X 3 \ u + J r5  ? o< |m Uy z U  ? n "  :UP$4H=BT&'ZzT  * 9    ?R48z,o7,B_j{W/Tabop7+ O|t:B2ix|Ig s/*,%qy)K;:LHhCC8[DO%[gN'Mqu^J4+)yO06|:o)zmK J<]ߞ܇ݺj݇'b-ef~ݭ{Zd~ܯQމ+~+BCknP g`%}hd fsT9Z&GJ.z:w}vi! `j6$wEAo;Y%V|xq~QEX;b-oLM4$  ",s*eIt[i@8ib>h5j>Jh@j6d}UF_PWzt)fU?'9Epl GVo'OHG|/c8y   U  8<H X [j { V| ~eR(mLQS$je$.q{RT~Vg?@ 1HXvyR56ZG2[JU[^o! #Q$ &,"(#*%,~&].'0)s1=*21+3+4w,55,5-5 -5,d5,=5,4O,4,H4,4,3_,3,3}-4K.K4K/4_041>52w53545_555k56#554j544y33221a15100./[-T/,,.%+w.W*;.).H) . )- ).))-R)-)-)W-),*,*/+)*})()0'U(%'#&!o%R$#!K LpjhJLCG, !  V   |MCV^)d3'b .VVq|f?V\5)%Iyeq`aqnzFu];w>-OYr#OkDOBe^~77?*u& 5W\Wvk1jy'Dw|=Fkz9QL 8^/p+ | #RH/Juk` _i}AS{6fIpV v6valUF93JWl<+{z=.A*e=TU No:K& i/5NA--1fT ly9!$=cm)T]?8 ^Bj=mli{G5$t+NFxM?|b3bb2tA  & / [ o  ;% ^  % nk  O } 1 & p Bgt`X@AA8>TG\AS:>!  ! e     h m"42HH8M"qV E]cvxX;;p^`(#{ys:,8fvm/'48a< xd4pod5}z    U f " * W t> q [h5`  U    W  %  x  L  +  V  ? 0 R A s M i W L a " M = p 3  m I  5 p  IU+}.2YN"$. kc  s X I3Fj't#x/3|f?^Q>;>m ,Mp "`@P,L":Lx, * y  m ] U R _ 9 q ~  @  | B    {9+mF"w$C T1K7R|-:?9G[Z-j?~xlb\3BQ,`1jFQ(-x &?X`~i4Qz[$rbkE: H5oi eD++U5'DL+F^YF?&T}V x4:&Wa0sSWP k3ULU<}<Sr!`*h` S=>+  V  E% 0 > Z> D O J ^ U  [ ( X ' | I ! B77^4/rvgS ]uQ|,z5Gpd vY[ '5 iH/d j.PZ%t\b(X &X ",  `*8Y  ,a<G"b4eZZ4+*8hc*lWHv{:j1\ TG<`i ms8t\D.z;Mf<eFt4Tx\P"s\%i K  u  0t 8   r-,Ci ?  ' k j  I f !  K   % @  @ G  S Z  0 '  j   tV {oCm +23TjM/I3vW`YM)<F' Sw=3F1Eza>,WLhk 1 5y   ; 7 S A x  o    3s J 5 w }hNy Q g=   l C^\mCqW)7XN A[    G " 7 L |     %J : 9 4 &> e    \ 5 S + " Q  &  u b VJ [ fOw g J G  x 1 7/ o | >V  '  * ^ L   &C k   * $/?TAMn6r"SHgpBWU_A eV-Wm K 2  v w 6  Q ( & U k e?X'@kP`' af^icL a7`* !! "#%$%# % &!b'Z!(!(")|")"*#[*S#*#*#%+#l+/$+Z$+$,$O,$,$,%!-(%W- %-&%-%-$.$-]$-$-m#3-",+"7,y!+ *)(2)sb('9&%1$$q5#Ij"! K.t:4.((pr_%e?  y3  :  o$7^*0w X;OU ix 0 n    Q U   d   W c9:I+eP*uz.0DFxl4  gX$}v|4.lGzJy|f(<QA2 qkkg7\!9cmA !)""""W"1"hx! 'aj<x2&/ _ | &  p i * Q qmp&~"w5Y 0}T1d#h}Ues]9['6FlR+U| U-HnR+?@A7( v;%KviN|f"cy5 C U g ` ? 0 Tb%2D!zHaH.6 e      } T + ;dO[0 s & s  (m i 4 n O U5How!7+R(EGc_`f? adJ-u*|<Fi =VUSy?S SdF`ic~u3pOWs+e$bN\)!w<O!"#: $ %!=%I!4%p!$j!I$M!#!" !  5\|&Gz,,6v|H[ 8_"L 3;We !I!"M"""5";~"-<"!]! Y a?#],/9{,L'&.&R#ZQX&)piu&BO?<(&r`_FZ* aF   d{  ]   ejt5F`M +<;@5?s.ELg!w }p k \ =   J  A(UcQvkLvJ#w=$*= rM,g*ai~aA~~`!-tU_\e)d!o~(ARFK?3^jnSnQ7> / 4[   3 # ulIu_<4w Z F |0UfUP: xZbP_\LA1^hvISF_F~A8>(?<:ll|M! ':8tE<Zp|53oW(es:Hl#C8kT m7 S#v)TE8j%"qdw b r  `  r 8#[_sq]g.L>  f 3   J biG   U ODoL%~=r}> i E rf b* #7(Zb6+ [C  N'gf&}X A2.d>fpv1^J.: 9 v tfPSkUZt96S :!Mw\6W/trh47#i&;] z{   X ?  .  &.4cyP HLv+,hPT9,K{8PUZDI3*taE5%!4</L.^=~6*|xx3)  F   u <   * E d    ( 9 H} 9C    0 ` GF Q OT m } 4 G f  k  9  J b  ]   )] 0= 8    [s F  `   v O < 9 y3 ,  6 + $ | L   + U )  r D s[~jrQ0?$m|x(c;k*}v!Vc.s`} l;H\jL4 +| JCB"H{j4 _y1ew"2qF>_X`O F11=3q#oLp'8Y%~{+4kYIUXufJsV# >  u]B"kZ.wzlD>& B'E;hI. 8_" E H <  \ $e!\VO0 W T I z  }    s v   9 C q  < a  r ` y d ' = h J  ~  : = & %!B>Mq782%v4XmARt(|#i{Q=OoLYM#NC9<E s ( N N u T [ D 8 "      / k  <  # 8 r Z S s 3 Y  Z0ZgTjkUS1"5;.T.   Z `( O 7 :e 0 1 +L % *a  ] RPv5,B|  _   'd8DFf*$)&:040hK><?P6tGfiS D wFiO1MZoPVUpvMjCYm`fi Xh/g}0jfU@K %\ N )  \z \6r ?ZZP1u*8t%F Z!"# $!%"&#'$(%)'W*( +2)+R*5,X+,I,#-:--&.-.E./.0.T1G/ 2/2/b3?030404 1T5W15n15151G514K1.41_30x2E0a1/;0$/.}.--r,-2+X,)+(*'>*&)&)(%(p$((#'#7'"&!T&o!% s%` $f$u#B#"!>!   mKNWKbW% Di \ *BG_ZFH*@(s1b W:  ! !"J"!#"l$#%O$& % (%)^&*&*'+-(',(,/),),,*-* -5+!-+*-V,A-,b---<.-../F.0q.0.0y.1M. 1-0X-{0,/+/* .O),'+&a*Z%($'"(&!$ x# +"A QrNH3xQ vOi$ b  ` 2 F  xhL:;iwsdL9!e70{7A\V]B#_\WD t12ߙ}ll߆ۣ eݬܣܶڛڞ۪Gvܗ+bێ۸ݮݒcނ*١݋Z' ءu9'ػL`Xڕ/֍=wؼu+LٟxٞټA2Ԋڨ7(Պەܙ׊ܳA 2 ߚ,+emNJ5$H!-:lh0Sp,S2->t |#Y3t]+*uPpT^@ ARV}umqi`D*Q6B@=.Ra : QM 8U M  \Y:Mh+lmX7cLBGEf63 .Ma{pry+@-aZtgt;=e #&adC67At/[ Z g zZ$IUK.HA%|"[-  D D 0 [!!"G"?""",#~## $($ %3 % &!j'"](#m)$* &+'H-C(._)/c*A1c+g2;,3,4-b5.6s.6.6.6.6.6.5].^5.4-3d-2,1,0?,/+/+_.y+-U+a-E+%-L+-x+-+\-,-,N.?-.-/.v0f/91001021 382k323233~3 3322|2120100 //0./,.+-*7-){,(+'+&Q*%)$)$S(B#'n"&!!& 7% Y$W#EI"c'!zm+O{56[J-nz `ebU< 7x A  8    6 7   v &   V 3  a  >K k~c>M8Lz~vUK)H:|m84dz Z1y5@&P@k_:Sj=%hKG9"u,%C?CFL5ehY 9b'{9O2Yow &F>ln|XG~`S8 bh@CdAQl.f}gd~rw<V/2 OP~zgmNUgAW OK8i|K ]O`&h%.f CtA*s* V~"L, QT*OK  - !!L=Hh~X;MO  Tb-C<E+qN_E/Y@v+^ ?!p"K "!#!$""%#%#%#'&>$G&}$%&$&$%$%$>%$$$$$_$$,$$#$#$#$#$#$#p$#P$#*$#####4##"?#4""!w" !!z R! U ^Yc#4w_ $?!h!"$#'$!%%&'c'! ( b)!)["z*#*#+]$)+$+o%*%o*%)%)%7(%'$%#$"<#g!! FT z^h l*Ml6mb  W!!1Z"x"""""Y<"!^! 9* X]4=0|TLY >T 3k;|SIL(*i, b/Yc\y    /i C $; iV;fw}<.=Z>C ZI3t8xTd6;we)xE=T,?5߱(Fޥ!*ݒ#Rܣ%ۧ߉,Zۣ:'ۥ ڍ܍Xc1qٞ.ڜُڻڿۅڟ7۝ܿEBߔD fS=Z2bul_Dk2K70PHr~h<$%2GLU@#<1HU?'~6IPz*2+WP9.DC]`4mC;(3s  1_qjYD3QpKSl  5 r  O} g ? I  ` + O n  s X ^ g 3 L - ` p ) S }  ~ m UZ w4   ~ q P 2   5 ` . wk  Uf  L 'R{ar_Wk/nzhz[E-o ,#&l[=6+ +Y2  %k!-"{"_#* $%!$!+%"%#%3$%$%3%%q%%%%%%%%%%%% &%&%B&*&[&v&&&&!'&r'&''(&P(&n(&~(&p(;&D(%(r%'$)'y$&#%w#R%"$h"#!"T!+" X!T r]fG&[c%jm/ 4Td"l 8^6FfkPa ' k~;bvV6iE  G    e 8   s  K C_  ) r k / K   <X'}-2US|M\+ڑݧ.g~ؐ\ZQ9i.ۨI |ۇٽ,ڄܟh] iVކI߁sWވ Qߠ݁\݊#ݤ`ٖ,Dڑׇ٪k|هDڮ׭GrI:z&ۭIEܽ_-~DݝYݫeݹutjO.޵;YM.L/\&V#1$]v1!3R OY ,(,X U h  R  ]  g ` ( k ( 6 F f : t = A U } I W &   #  .   & 5 v+ *    o o ) O K  LT  I  n " O s V = &    N  rl + + Ky`+C{o1;|~0ZH\zs~=xwQF7HA>[MBA$Q[BY>iX{8gqp@V?߰ވ ]:oݥ۸:ڪD*غ<"ڐٯ>ڱ --݆hSG z=gbSJyCf12~I1V :xn[[[i N)F1antd{Y/L*R{uFu3}92Ns-uSQ\G 0)f.p/,1|vY}:6@ hs \Q6}7Q$`3cz4 2  E J # v  2 ?97  @t : & _ & ! 6o 5=8*b j-;pm%AqT0wF9 k/!^Z"ie#$% '@( S)!`*!D+",i#,#,B$*-w$)-$,h$,0$,#+p#*")^"))!`(A!' &I J&%6%V$8o$($&#7#D#hm#[#5#)##h"B"""'Z"#"'!!#! S 5kA5l=Z'K$3k1 BG>OXck  v 2X   Y>  (_ u   rB R o  C    m7 f ; +  p g M *C /  {  {   L Wj^3+?nM  !n  "  C yc 1    Tq  D wYZ E h         8 S i u R 6   C e 6~   ^ @j:[<WPV+-78+b2G bnEe(-PcZq{6`OJ+HTf7\z s 6Vf-a3'I ݖvܦutEܚڙUېۮy*tcީ޸i߳ߞ#7DWP>+߷ߎpb qbxaR[0)R?( Q+~yLa\gtUvfjF SBJ n_'uc)|uO@Ytqqv`r/%p86&Ke^d n V  X  ; ,  ~  0 o  zwWi`T5%1  6 \ d - * Z Ba X A>   f   f    l R D L jS  M T  PW^)CfqWm4 [ Iq|x'o{kVn 1 t      K   X'M`@Vq%x9`) !uf]``i1{"Uf1 *[XU.zl4$  f C >KZ+ 0 c  u O O V G  9 / %  ^ r   : P Z W yf E u`Q*Z \2!# YVvs `s &~Z.7#3`kEA47=IYUQ89:\7>KE"+Q7> G?DTMZ@RQ~N3l~}fvtW)  y ! P " U ,  J Gn v.EX"n*Xws&m6E,Suw<  8!!! !~ ! !R!!!!"b!R"!" " " "t "o "h "\ "Y "Q "4 =" !!>!m j m# cdi 3e/P$'DS@cdbd)w#\; 8  1 46 ~  ;  t 2o  \ @\gED [H;549)D=Ao@s%keGs? 4 Ut?Fh8l XqXk{B%:   e   y & %  f ~XxIvF? =w]\AZ oh/vx YlyN>pPZ<5 k !  + /U\tBP(-'JD6Na25>O9qQLtD [IapT&gzsRi %$4Nxn e?n^sQ2eY* -nK^ }vHC%}1[v`0ZhUE 7ywl>kp 3 63V(zrb_eqL> [ (KLtog} g      A : `  0 X # k 1 I   +n\#J#TV12GXc_Y:A>7* !'74V|c}!*>k Ez0uL(lA>tZwj o@\_[9g4bBvLXvzRA%\ i !"""#J#"""CA"!!L!! [v 0  um_ % &!Hi!!F!!!!]!"!=  5 -D7i<"H_QCo 9!C]!_'Z'`;$[ o w U  1  U6-V6gM[sW&Q-'l#pI!Mdz? {Zuj3p_?w~M56%VDet UB |pR \] %< +]ju}a3y^ T,"7}sz  [  X'6tnY -T(bL ]-s,'R4x~W)+lU?D}Jn NH+Lab-y]W E\)s  { K   % 5i=4Rd {;nU$E}lo\Ov E+9FrT l< bJr0 xa)XuZD5O;2mD- [I )NW=OqE;T-#P9<:$U{M@'; ;V[-vdmM_)s-`i3/|tt 5|DDPq*#w~1T+I1vKB/OZ}F.ycm[KU6i>[8i& _ &< r,Z`;0;SQp=*wgc\qRsatx PZwi@XCb?{L9]*3 c B  v U l ) W   d %  =   @ :  cD  R S Q   a 4 *] < b'  = ' | L R}d"(=O~Ndp5/P.Z-sp?b}'NLWC    i ? y 0    ]L w : X , -  K (   0J)" }mm%JXF?z,^|T,a24UT5[`h&&z4M^b[`cYWQF@1f0(+28Mr\Fp6c\$v(8W>"^=-2a>3`g Ik 'xFKWsF&. H56,XFH{ jMJ"T1vaC"$#<Vdus Xm%"er߸!jT۵ݥܱSZ٥& 3ىY'ٱ"ڊس`U9בzאݒWժݍ\Z3cRTЇ`Kjдq ѤMܡ ݛݻ6{۷/ݓek#c 'cBKKw0'ROP@s}s7Dp.^f 0H'jH!cVlaFl!|?W Sf<-b\$JO$Yiv*A`|$h?4C|3xJ8vpQ!Pu ;Fe1'`hl& ?TwK0v&VPt0jU?1AV}{es| 5MpnbE /^    i = z0'qA\bE) mA W O  V    P  _LK RWN?sw%{'d    ,U q 1A,aNq^'8 q C ' P FsMo#Nsb,GltWk R sd ? 3 H''4Z5Y ;vz,i _ 5   ` / >   0 8 k "    e +1  o)_%eUZRNOhUWgB%:K13FJk#Co.-m$8GxYDu yk>I $7q?z!f| ߣޝR5&Wޏ | nmnV% Na]HDEy^iph|>t/Yi'=&5N'BvF0!`##j+:cjo.N9AJ=GPXWy^*kdE?GRm5$gU(+ B+oqPuy+ >;"3[{:pfCQt2'U#z_S!A.Iddn6yH ?=Dk>U`- f |   x G   $G  8 P ~|/z#by]Lt[m>"}2!M=f6CJPE[iiU@ mro GF d    Ob 1=  x a9keKKD<Lnah@ cF;Ln[B;m~=ZIdo TI/f"N(He^i a;V t4 o   !kL!x!!=!w!!!!!Q}!m!U!d>!G!O!J!Nj!"s!!!!!;!]^!6! ! / OD t t+tDD h^%>8IxLa4Q|8  !7P!h!u!Fa!%! W L>l(X((bt LJ}dz   % @ G     n [XTH0(i<1! y`?4^!%%iRlj,"ozip[W).VkޮDݛ٘m1XؓO* ׯ֏XC"04iۗ߳"w.//Sv&JsO_ rz%9C|3= $Rq[?o<h7F\"[XC({,\Ut;~#m8eD]`}Z'#$&y\2[@@$"< ,quymF)FeWc;cwoJ m#f45naN%>3Np9H,t?Z^89%}r.(m OYjs%I{)#AwK"( 8q ?  ^   h ( ` N 9    R   Z D  G U21ZSbrS \  ST ' v  .   SQ d m #B t    G% 7&T*T  c5  did8MEDsJ<G$R>5Q n  5O l z ;l -BAiSFOo_lDILFX$ ^.XlNC] mEOt}V,JE#1 `<~ GL>R]w vFuHuBv'uI&sS+WJ*St!Z !jm<:F,>J9Y]I)y`@/t*)o!5qm7zr+ l[kHQciGsvTAD[;1PTmGP581C;n1/L3:w{D%at. &/c` vvDQ0,# n ] ; G "  P  / |  gFs1awwbOufzV: tW   M   S  R  Z _3 /    6 &  A  p + [ . [ R   q  a "  P o c k]     r   c"  \^  p a 8 y|*<E}(0 v$&\OuAM@ "gBU2cTj CY`>l;tR&$@j/m} \C9id,CI?eV:  J j :G 1  : U WB   %   L  ?<r@ }lgyh|($l ^A$dwR*^,.x1x_>,}T[$pp7D$+u4[cS(F=#WjxvOG $%%A Y.tPےtګޭI<ܰצ>֘ڑL`=AC_َIAvڒך7ە$]_ٚ2ۤ>yl۟#u ݵ$.DEI/ݾݻܼܳܚ4s܀~euމߨܴt  /k]tSpyHu*;bICu>D=/~%s^P-1h)V%'X,wk%}E%VBy7r{ t r c w _ Z _ O V5SN H;v#wrkbgacaaOtJ+  s !?"";#x$$${M%I%)%&&M&}&&&&&k.'c'c ' 'x!Z("("6)0#)#.*#*6$4+Z$+U$,4$Y,#,#,#M,o"+!p+ * )'(1';e&Q%X#_?"v vkpb8~8(x  K gan R A : V&;)Kf8+p[M.$OzcG)k R_ߋf$;D#gU~C NhQ%$H] d)7e1KYw%^e> z3aR"%A}=vZr**VC4) nAܐe_TJٷ aFBx0h(#';.;ـR٪cٯzٸٯٶ1T#u{M(4!N܈ۺ޵k'PflhGMW؋(ש$}ؚܘْEڛڑA٘y4܉i/Ckm֐k֩ճYֵ MՈ`Ԅ'Խ"lQBfS/Պ׮99>ٹM5_ۖK/Cݐۜ.ܥ$ SSܵz{v3E V.:f;YBc.>+mf 'iJZr!kSG933Ak}n-s *3! Ww|7y\PBF=6),~ e@ `N~9 }{F 2:/U1]|C5iN>.Kc9>$K1 1qh_ Lo!MH6PP#Y7IRBgmu^h{> Y(I} "2 4pwu4/??0m#> Z?:FxiW^8CGI*=p|/pS/d"pCGRem G U S K * lGv._# ek   1 0 g : 2  X  YT N|UE{X~1U>l2Lx1RLu%lCn,@?$=c[vcqV `zFQ!Qib]Ou HD]#GGrt%DL0!MtZ(TLp||R:8%\O;|^zE   |  : , G   G  { H '< _ G ;] <" = <~ MMPF) T Y [   O  r' &>s!yt>>:5Hqni0Q#m9W$ |>xlW^VH!|u5 b,+ MK56dJWcU| "PQaz#x7m9R"F<(/d(C\Js`-:JU(0.0CEjE\"te\xDZ0Ae(lr]> 8 x ) x w  \ -G = L/  ZJB5$8 wQi `,6Ocxm/OULZ&Rtgv*RtV$|9h>m6PmE3` %)lp== S  ~ f c j q p L (>   Wf30}dCw | g 2c 8 d t   7  l  .<@24Ae[#-60a(Ri_eTe+|YJ '47Fo,Q9 -&(%~d ZGNmT; xr9 ^l p8%Lk"}`P:.vjf)> !`sNF-$RF3D Ex Y H T : X x 8   S t 4+rC8@'fTYEXc%&1)4#`?l'sR\[Fm=O5OT*/.m a dy  _ D  ;  Q  Q GDQ8@*}`S-bQn],'> xPf,+bJdJ(&2dFD H<.0 V ~   R  N Q   PE ih s o d ^ I. 1V (i   x i 2U M; ^? 8 > m   K6We jziWA)4.g1d  9 y <8}|flK : I t 2  # PX w _   @ v  t z rO :ql?& >  S FA v _t 4   >(   |   O!S7%>rx\(bD]DR|1%[?);dUWTp6w\8;"tk5cci__cp'wRv2(Y<1V)pj/JEM- Ko#63h-F)gT#MwlcE QmR_Uj]>~U2 d QNBbM~]]1m-bZwF߈9߷ݔSyܻ݃>ix ߣ-h44KVjsuރYބݬXݻ4g<ݢ}kt{jkECT6Zn >13MgP]D"Wy&<0d?^{U ' o(r"l# Fs%qe\7#DCQj^L`ow?'@b$yyqek[;%!Ldt(l*pC! a<@UTEMKPI#@PM&=s\rq$iCO(Vj_#-7'D3z0}jRY)%s1fbO;;%1SzX pp a?TXFm.xDGtht/--hwD^oc  k u $ S - ;5aFtG k/'  / P U + 4  y  t  0s4'"uFny   U m a w 2 b  |  | " E )C[*x ;dl8V ":FJKio;dt@a/ sYE:~ B&i!!6kV:{~q}x?U4!MQ 18(TH*!8Vc PT qsi[9RiR)InhbX   $  ` -r Y)\ "HV)~>FrX@%+f+OX]=PG4- '?7eIn[wcap8`%h8@#&&SWG%4oq mT;--gE1oR5Scm0l$q] Aw+Q__Q=`aT^aciL(c&~CN;N{j SfZt?}U LqU-\KahG&kh !rW"l>q?  ! O ?  O < ZI_4d*F`vQ 4*U5%=a{ 3-cl6JK=#u<~9{}xWZYr;CO)Cd)y'Utz|ljLWUY`?*Qhe@^jaTe  >  0  _ lBT[6$t*lrN&UljX&k}Ex`| fc` g   | b  ] ] H < 2 2 $ [  )   p` |   F [lcGY~3q]:%cC*mhBC!4iq!)Oa|%:d%u>H@GBSc=yg6{8@et=;K`$bp1>Z!9shP~8~S~v]M\N K C W;  = g= 3  [ &  = K l ~ d S ]  ^ J  o  4 n M d  vX    x  w  R A  k  OD MCO{@:jsNBTGb 7 0z0>vpQpUKmV1y%a\I!&ZrM<}(VSm`F=iIs2&ZH     2   ?}/9j5=9&k V\22lbL q?oB/01"u/"   ]RRC%GW`%.$x;W H}n+,rCw&<4`&P#rGy]'cs3?2V~OR3d.Ms,SuBo a x}W+%0h ).+-J):K\ P-GiUl%Jd,W 0h2;\W}Wp %N<<1r&>3|T>}eH]:qr~Y8h| 2 B-G:U^&ivxQLeqmWGVzU| 6QI*3q1\mq9,Q9&-W5'f5 N>N2l4 GwyOF Q U n e c4wzmQT )o     { 'rPAoz3;c   k j  q a  rR  ` @  6 T Q W 2    Q u a d m j F  Y2   Y*IF,S;V5L^n J:TApH _--4IGz`Ki P:but^G**=8b/'0"=Ws   - I TM N ?2   d X  t E*k:.uL)dU"i& mn^D=RT fZsi/b$l$/m~ ( O[ x|   5  K f s | L  < >@MM3K]YET)nHFMgJh(?"v0*Jlpqa,M_oL ] p *7 q  N+ K Jg  2`M8&n5&8W[ \/L l@ M / c %Du&6oBV?~lq)b:z  Z \ )    O   S 8   a" F HaZehWt]j0J+2J a_KJ='% Ji)JhA_){kkk#hj#;,H-sX3Qjj$ pJ x  ) E G ' : n 7 '  @  x Z   M   hZ  9 % +   [  y Ek  H   - <V,gzp!d]Z;pnkd3Q)a u#Lfz}h%`M%vO~ y!7):ner R)$Wx;X9q3D !*?yr25JwBCN5"!)0Cg v5.DB'eE"V+OW$H`1PIqSt5`Z2'-MBZ|f F \|E{Zk/vlB!/(BO\lis};?3)e7^>y@iv;r W2*_:u)_`(% X|8^,k9CUW"`G?33,*D/\$:#}KjJ Il A & z  0,[Ojo][4qqJ>\1n: P y n   3  VeF4u  < !   5 yYxgD ~ e  lT  -Ty { h bY.C!"x+D(Y03$1  _K  `8   +  9;S+!( M l ,  & 6  B.^a<. FH @ A 4 K  8~EF,  `      _ L yLADZ()Cw;$< I -   y-Bm" f f o 1 ]  mr%<D$i0VG6wE3-s6eC%03\g(R[(W{):*g( Gl.A +#dw4|`L9߇ލݨQZq&ٷM'zp0P~ճF=ӅKیMXҸ(&џS<^؀M9nӟ٨(-8C<ڨ?۶%88PY]bgރ%:e5!?2=] aU3Em &;V};n>@4!AJ:wvr#^(w/}JM'ux_bvKEBG7oe k^ Rz b  y o:o'a.w_+ow@) F 1 5 ] g  8   ? N / p $ { ,  U s]hMZ^G)X 7 D Jf t    Y H F * * G f 2_dyv9uRq d?m!CP=s5Y\wg- ! ""$$$\%&O&b(')'*+'$,',x' -&,&,1%+($+#*"(!'X &%?$T$##8~#p##4 # # $!$/!3$_!&$y!$!$!#!#7"#"#"Z#B#;##'#$#$"$"%%"]%"v%"`%"%%"$a"j$"#!+#_!v" !@ 5 t3w5!8P7qH9y|7#Dgk$x=4x A/ o|   T!J!}!z!!h!! }!Yj!H!  yl  Y)0ENW1 `?tIAz  a ' O  " > H   g 7 A t  { R b G@{9w1co p )  X  K  &Ari _\c~0b;lO x;Ppgmh[dnVAH/p| L6T_#g~bS{o#EX?bq+}ES#%A^h`k[89ZIo9-S.e#Nu[CDw1e0( v!gGia$ xt)jYI*jJ{} tA'Dh h4w,<0}MmJ X$?{./@3fV:v5BzeCu)5nRP BB\L|Mhjl1uA$%FU"]+YU b[rT2*_.jSSOvL& A=H-V {AS IpUi|~]P!tS%,!W%}pY$_Wbqv?PV'@xMQ_WVIc7FyE3 p F W   jn H p Ds G&f7Ji3Fk 9- p <  ;   S:G   o P 5 )I%{Ol pO  BY~gVX0-R Mh7. ߒq85݃IۭuF #)\@H,TMwbv؇zTr1٪G4elߏ޾v5ۨݍQqܬܬ܍܏ ݍݔ&ݴܖ S1 dۇݙ۹݈݁#ގTۙ0Sp޼߿uCD9`c~B&y5"_ߊ!n VG0"$Z>r~cRbe\ KDߜRM^ߚ@`NIa}z~7:c/T6J`"v)!d"4"yV###df#+,#"ve"!s!<! * W(;hIgx61 IZOg0U3hJ A \ i   ?WkKBa\F(f~%R,QhKB*xqNT5HX2RsMenw@ }=  > k b V $  *Ftl[P@ X 6.   e   H > E U5  t  S   -K fs~tmL*VAA{r}{`hH& j2kDK0uI'Mg4m| YGAr5 $4uP4( ;koK -6@6> @v#B0"22IߵNޣݳ ݲ|zdWM3 cOFs D=oO5*zAzduH#`g>[Mw޵lPLT߃b%ei0k/ h4;]L(۪Uܺۼׯ֤#֦MՔ W$p]uаU|1J΍ /`ZԱk.֏ЏmX`.O MGվ%փ6ݷ?1޺nٛBٚ[tW6P8٧ I ZܛKmک1ޕ>܈DRޭ~ZBW&-[fy."m`6t;@,X8nt%\wJ#7et)Pc&3|G%27~pEla?3qr hSpA>E?v A^^(kl&`3;A"Uo]Ntpk(D1 9MCm9T&z^M=\d3eFU7;gNI an \$a Vh_n>Ki2xt^GxOzf{|nwkQkE$'x@V5,D)O9d!si0uUi:1};-aoQp(rAJjcnOVYAfUz0;ަ%ݴc3 waJ߲r-p4?llR"Y]sAD?IATI^GZ\K ep9u 'p' <&BSKnv"/ImO"n^uCm(5;x߱v/t߷޷/ޱ2OܴߚiܓL5b/*A5R@9}_ݨ$ޜdߨޒ ߸_,>H߽1ߔ0ߢߎޕ޷ܽܺܪ)ݴ_ޢ a\[nuc?^ WX_TW="#K#1[*| (yaDdfr}&4a|A*P x3kkyn0lZBQ/#eGb7P+E*<F:`tnCL6B7rQ=Y߸ߺyߨ^ߗ\߫߰B4 *DYq(DBg ,8 H >TM*L ?4#%S|ZlR6f~M, x.IdS=da6GF r]#i~BSC.X,%^cQ]  @  B  ,   x 4 { U O n  )g? Uc 9  Z " D m0 V     ^ z vC % o  B } + i I % `} Yh?-EMeK   ]S D( . % 0     y  C C   3      R 7 3  4   S @ V@ = 4!Y; B  g m 8 8  Bv W j 0 q ( % x^qDn#<(Ph~U~I! s{)/NZ*v`&ߠj=Rޜ@";ܹ[wwcյg؆pF҃Aם[MѼ9ќ={/N дCՀаԢE~|ΩAЮ[1Qs 546#O}rΤv ˖ 7̦[y|,˕ʋ[S 'ҾыɫѓɎwjѤʑkh҃͜6вәKԘj qOءֈ ޲րޢޢ(߾e֡Ya_vuk\m`pTD cX!o"v#J $ %!n&"?'"'#i(d#(# )$0)J$D)$@)$!)3%(%(%(N&a(&1(&'H''k''p'v'_'I'"'%'&&+&&%&$&#&#&Q"&!&!p& &z d&k F&k "& % %-!%!j$!#""D"!;" #"!!3! ) +3/,f|pR&ddN}6y=Ar \H;0wq<tzl] j48={o4<S l J e  e   a 8     sT>[yV/pmM-UIVB*N4u:"xq &5wv1Lz%nzM" zQ!uae^|_$0OpYT[1ޫݬݪdܜv>i' U;ӧN"ҡw|ӘӺ6CJ(2:D<ҍ+3ѫnўlц{юц9ҷҚdҒғ=ӒӏDe!Ֆh٢ٮ٤ixUY3זhxUUS^iԦ֧դha&َ$׋j'ؽ܆ rqڙڕ۞Uۂݏ{ݫrzܞ 4 , %   r @1~a  Owb\. gH   ,!3[!R!!!"e8"M"^"j" c" V"P"4"s"& ""[#"@"X"Q{""""#"""-"!| h2 &7MfQFG0BK)sT -cFOUD8 Yuv(B,}H7 zIAH'bj F~N A  h R M bi    e[ ?  # F GX 4  M 1 ?  I & ^ 7GsSz JFJ{4PQ wR=x'rG'3l!X<`r~|<۾c&{8)Ӱҽ#IؙH8YVlӑ̉8̩˻|΍Fʬ*,iP¼ĺ55hâEÍ0×J~ W(ıC‘[oaI±Ʊ*ƃͿu%nJĂͻ",I·vkO_kDԽceV8WmŀǯĝFn :ʡǧ˧H̜̾ʜ.^ϵ.p҂L?Ҕfڳ@ֶ۾@0נ܍*bؠܡq:Nܦ.5ڄ܁Lܣ:t7a7}d(4&&z 1D":|Z<lj"D4@NV:{ 3r.GLXQ],5]9w gA+n5{P 8" O z       mI"%Vl#+a~9Tx(|%"*B |z5#3P L!]"u c$Y!%-"&"'4#(#L)#)~#)W#)#j)"(<"a(!'_!& & <%J u$##lm"'!p!!^    F  A!!%"q"o_#T$W$]G%g%kL&&&&&d&^&C%^%6$#B # E" p!.! C!-! 3  $y-p  yES-6\ . !-!%f!!!!P!| !9 x 5  nqK o  e!LA"E #%# $ %|!|&"r'y"@(" )")#q*" +"+"+"?,"y,",#,H#,#i,#,$+H$+h$^*x${)b$j(#$<'#%#P$5""! 1h0=]vA=R!}<)_ m&  #  #f 3yyZb7ge't='Reeo7e"{ݵ(l&ؤtWja xܪrTՌL;M+2ՕsZـ" ؑӅN҆אbԪm̕\̄p͏x?ˣR#˼PˠɹB*̔ʣ2˄_ϒSU1)ҭ^_ Ԓu#կ">OӄzԚ@ջ'&hRה=7oَ+ݝ"cu%~dn4R[?-YqqDܨQ޼1fی2 ^!@ۖ~B* ۀ,LQۙ~KܙhBd߼ݦ*ߧ4-߉/4Y{ gm$YBIKrܷ[*܂ -ܜF`ݚX gxݱ!޼޻ߒCx Oa6(''$ *^,|A_JuPgXQR 9$)ep=^+[&i@8[* [  ; h x 9 f   I    t8 O2   _6  k rJjD/xGK+PW#3W U ,Ik`7ImB6 nUOLprh Pc:E#}=0 P ~Szf@" 5Bkf?xO7[Bo_*;o|Jcwk6 ) .   % j xE JI ] r    ^ y  p D   4 B %   $  6 ._X79emOzFXx=uYMaCC465*]# 7Ut|FxN!3Do7p&RCS!<=25*x/Chz 0~Wr{ߧo I *G8T h߰|AyCl,,ބݳw, AaT݇eܪa^XX=OWFJ՟IԶ`x УAjPШ͵89px,/ͬ? Fǥ/$Ϭȹ=yU@.VomԷ|Хoѥ׶ҴӔQڬFN׃ۣz۴Uۗqڑ־غؒf%$OԼΆәҭs dGE˾gm.jv@֯i ѹTګhկ?Uj<ٰ9ڟ"ۭۢYPܹ P7ܾF܋%ܰynKPj 0)&VqgBE}!j?.;$v$-OLd34WT=kU7fR(<"993*1_ZB/+T1Qy:.Tg`;Ssu &2  y  > ( s  D 9  .Qp> v     p R  ( o b g 8  ?*`*4Jdg$FOUvwkWQub#g])oF}xvT5tI9T=2bW17J?W/pSM:Wd}M Z`+pFq gQ _ q 6w?j]bY&wq*BR=L-Xa7{.>?:-BsJo;~Hc&r1!DHCI${_kT3@&% *I]c%(^:A VN/K 4eUwny9gwXA'@Gdvztf:v_'}*7k V9}n@;n8:6sW) 2wR b/ 2`:cE` 3,# [o[/E`|eF5*}+#Up4li]}']t2}taswH;X=QA66.y9}m`4M:XJ,;*OY  w  -`':9 W! <  , /l pS  6m A H  S u  ahbZyn =B(}#)W(dxLW}}"e4>` ]W BI}1xi  U A Ks Q L N: 6 U  T z  9 P^ X T &] 5   VA   O h 1^   * _ 8A+z xln/ x ?  C    V {      ` "^  vf   ( ()0' .6 e Y  u   eZ I4DsS~+ <1d}!Xsr7qc {6Wa+e=)/_oP9AZw%w5X@#a`QV+AY`+^Mpg>8 ay#Ja3= Q*7NG1$bS~R0=$L)9MoF a3Ztiqu zqE WcZjj<H Yz 84n d[_p@OywaISpmG7zr(Tyb8|7=>Rlm8'QG@VD<>Z|zL4 aX7wK~^?%.TwA_e!|)%a e(      /  <  ^C[l|OT/2?P j   N  Q u & '  M  W " U Q  / t  _S  W   ; *U^    j  @ f" [ -  S D W!  { =    4 b 9T/v !+x 4} '>h&-3d3/\#YM(J?5kRRB;X2_n5@b;?rs7pb,x&]   !!s !  v 7 ;  t3F528t / t  N 1\&~6 <5 W'sR)vhX%q.K}$'Fc ;w_^,jdm?z"Zg (G}|1Fo~ =gV])yZ X.)$9hEYT"c^="tG8u$u' Q9r0 @R6-p0IaRoEq[+7XJER:9R:dFTH\xeOoX nVmSqhkNA f0cK*+U@`@ 5=\c*WEEbcq'|JR?YK%?=1DK^cqL ,!Z!"`##^$;$($#z#" F"%!@ N JvRSz[+IKD,)i?|h [ 5dG-Bsr.wt/h0o!N[(M\]DFr"u>C81 R34t7e N'  Z M 6 WGr>9Cq_QHgb2   g+  ! p  5 k m 8VrQJ;D_gf#VQnBNmDblpR8$NoQvO@5rGDfu=f*KPH:A~_hR=k3JBUi]!?nLzL\\V;@{}xOc'9_{_r6~sa+s_YI dc> 6opKM.e{>guj567|~({OJ`8/gHYQ%ur=W `-j&!yuo&j_Ob[.qwaWvI0;5 " T:`/4S?/CS +/uiZ4 o xTP3RD\~qWZ>c| 8yK|\nHht yl f t c j8 e6 U 3 %>   O :}]!p(ND $OI.u6M['  @ 5 #  C  w  { X 9   O  & 2 F \ e L . k  e 5   K > q[/fk\/B6T/qa$tW,F#Y 9@mJvP +z.H wq 0Ao%^;.J KSO?;+$jZ"1Z qj=Hz+JdA\5`Pn4OV>C%fVN5Y{4w;ZwM\ypymEZK5r?[C19?,30Rnhz_}I *t4:w.Gj29otMCU,lJ)lty_֓I:9߳R߄]ڹچߌG .T}J;}ݱ8ާڗۘߖ;<~ފJQsY7#a2C'iAUlC"qQit iFAr9s>'O"L)l los>aZIGxi++2U_^R{Ve! i8 (l     !X ) (wn:W r5* Q  { R (  k W6R`G<xzK!K|\D0 L.6/F  o ' fd 5    e_NE@& \vQQX`-.-N[zXMj RY Ur_H=RBR:[O :`%g/Ju9%}f7uCk@n/K_&v)=XV?0L MP-jS]8$,IG(j?VKnD]@;ZZ>B~61z#RvQ?jSG! r  C  fB :  @  &+;hJQ+0aed U  F gM@6%H ku$"yS %U{x]x1]PtIWmQ[==tL9XA?\,HmKze# X%x(tFK48:1Ezo2`ah\H#-#Kz"*;@KGZp`jP}ra)FS:'zn>71~+_>}F 4u$P Gv# s s 1 : eL  J R F t 5  -  Q  9 <ObBG/'hW}zIg*r|?lmz^v1vRn&4:">SdEs,tt9Dt[}(Z M Q + t . h    > R  ' $ 3 T 0 >OSv\q6%&aK@l(htTDr$uFR /FTzM>>Q^G !"' #!7$"$# %$4%8%8%w%%l%$%n$$##j##""(" !y! 2 T*%iC@%:"=<SV;cppM^d7}6C S$[ o      f2 s 1'A |= # 2 4 el-v!" CitDl* w^Ef%saC, HxEap4`fU&FgoR)Xe6ed2boP[S^KAY4#)8]:F2RTyc6L<>^:R D#'&r1EslQ f5H &C>8"X1PW}Dicu3sJIQl]߯.ݜ&IdS5e٭Hٙ|&w$]C,٠;goSh4~؟XK^ؕ}|ߢs؀؞?߄=BUV':WH:~s0:yr+q,^,?!JJ(w   Y s9   @xKS=G{% !" b#F!#!d$S"~$"$#n$,#%$b##m#f##"#"m##"K#! #_!",!Z" ! n! + y   + d  h b1 N gl&'K7MHE9 Z/ < ,W  h A  w J6 )@ $+B'j ) 3i }  `  5 J'b^qjU`Y3rSBkh\jW0d3( D DZE6>zHidVWfhS*]" 6Q e z   + \   <  A6 R yJ  ipcq.K|Y(2c* &   g <7i.$O4uvym_yl=."gnfTza 6y0%Liߒߘ)%݇vF.۴ی(ٶVCػ.p٦ױn$ؖ)׹.h ԓ>ӷӗӃ:ԊՙԴ~Վ#%׽^ڵ?Lx٬R޸/_/ۚ0/iS:Jx!>1lpOt6pd^JJ4 M*2z,X]t#{ Oz0|{* =%AXE/8{V-$TF9]n)w3=l?<ttE CjfsKMgr7) H  N Q '  o O &M H & T41nN%<L+u49nu0YfQ8*FXg]33x(I.y4? |(   !y"p"# 0$!$u"b%d#%$$4&$Z&c%l&%C&%%&%%%%r$K%#$#$B"a#!" ! 6j#r?%\,G` k8!":"#@$M $} &% R% l%!p%!<%$!%(!$!+$ # C# "k U". "!!k!r!{!! !] ! ."`!L"!]"~"M" #6"#!#!$!$ ##0#N"~!!J ;v IeLd`'k A 59M;  (ZWXhN]+^38cXjXv>}{ Xp   O8 & q h 6 # 6  YAQH9i{YAda61 a.tNJ:Rnn/.p}~y7o/;Y(\vEM(t~mBޚ)ܔE^ى#ؾ4} &@Zڳe#ګH5sϿK3}MаPQCоKИ5m2(&FoдڳЮڨ=fҷrju&֔Ah#uWwigS@i݆(k]<ߤ./+ :"CG~s^a@lsYpcMAQD*  / = {  T0on}* 4b ",!$9"&2#e(#)l$a+$,$y-$C.$.$./$/$/$/$0$X0<%0% 1&w1h'2s(2).3*3+Q4,4-H5.5`/5/6 06)05/5/U5.4 .o4F-3A,13!+y2*1(1'O0&/%.%%.$-$,#,#,#+~#+#:+# +#*#|*#%*}#)5#b)"("M(Y"'"'!y&!%z!K%g!$z!m$!$!#E"#"#####!$#$3$%h$%$%$<&%&%&'%& %&$&$&$&^$&*$&$&$&.$&h$&$'_%;'&'&''$((r(*(+(+(,(M-r(-(-'-&-E&O,|%M+$*#(#U'Q"%!$>!F# C" z! 1! ! " !"!.#,"#"H$J#$#0%D$%$%$>&$a&$&E$&#&#&$#&"&t"&-"&!&!&!&!d&!5&!&!%!%!2%!$!K$h!# !$# y"!E ~! =iH]8iMLUI]|DV 7HO7*.}|;Wd^H#U,    N y (   /q')]\} ?y(Ql''2hneWWh% .e>UCR[i|+T17b u>5ۜߤZޑ,ݫ?V֦م(C3ր$W/<;"Q w׏ױ֟f"$jֺת yֆJ/A$֝"Jwٸ{Nىnؾ׶&;!xײ Ӕצ\@%2=֌אdQ*կ֟ׯ"Y8ۢ'3E7/XMn8~DܬjۿbrX9Op~۲ۼuXDUbmAeqXE!0g%VmNPw;.K.Z%bswyzhM`.! :Mb-#XrBcr:}B}}>n 7sO J  ZW ~ s  f  P ! - h % D  V>-Wnm8*"3/On(t{ix&%u f|;pFkpeJUo" hc`P|hZ9;z gm'P.G]*> ;?6STzD; v Usz `(-&'(?){Y #w9N"oC+.AaN)f-CD=)2l%c|A`!O=1C/V\^$p)F3D>%<E  E  a L (7 v  j   2  b N r6/jZ]_ sMq%)F9\:sjy6d&J.cZ DedTT/apxI0 \߳-< 51f=ݹWړ`ڥ_n56VfcӬ`҃FI)όָ6~J`DQ]~dž7(ͻm8)-!ŭ>RaɁ ɓɭ*ɡ<ɋFY])M5Y ûIy"(¸Ǣp&Ǔ%̿ǝOljǹp"R˩}1k@x?ϑ2й ɐBAqӢj"Ϩ[V֫ &ԝYՃف_ڞUۨVܨIݒGwBFV_{ޕn߲V"<+~*Dbc| U 9Gfk0:ji1Oglw6|^ +W G `    + * I  L n @   W   6| QS DF 9: X   QE^^qH[Ah$BbcKxKnGZXP*d !|I!O!!" D};l >uW6< Tc%0GayE8B07+y\%80e| R 5  . 'l q P/M s V  P E s r : 0 3 / m  ! J   c b 3 O \ ' W = =   s { K _    Uy %S 5 '  @ u3 B z a  Y V "  $PW~>cZ 6 ` [  ^q;AO ;{VS-MuF1 U 7C Em ]  %H!iG ^$~v\<GK"^y|?NY(w{Hs#]}#u?INrKB&19GF~.y~EulqVO;+ `+ .P *cKhcV1DP7JvF*u0_\JD!DD I8?aozPmC~1 y.4u(l)@NDSQ2a mSS:-*NUM~1`/9[B2{gBP2ISFc[  ] - = Z    W   OK0 Rn$!iU.]  )Z!I!d"Y""""z"bN"""!!~!$ ! !!"H"""1##$$$S%%&'&=(L'i)'*6(+(~,(H-(-(0.(M.(7.B(-'-',?'>,&+&*(&*%|)%(^%|(%)($'$'w$'F$'#'#(]# (#'"'+"'!('B!& 5&O %$>$W#5(#" S"" "C"R%"{a"x"#cQ#=###D$#]#%#"!'!E `vHAJOcw|>4=|b[Y|:N%KJj[UR=UXc]c +mAY/>c y'Zkt9YTV|9.uW>5))-5C,FM L[4yy<[9O;I7   P T   HDQY7?<tPL7s -6@n'h=cI CQbq&lh%E-:QWxmcZ.mD1R:ނ޾\Kߌ@AyQMW;?E7N9*C]r [>t_}AVpPf!v0upldjAp*_m[^3)`U_F[Q3Gf{wc\P*Mh% l) G  n  M d . ] f d * V } NL *   H |. W   " a   FQ>!G9_E1U 9  a    !P~7cnqS$mHy  a$  Xl & l 9   7  ^  bu-#6hy+|F\*bt1zZ|P,zR1D.|.'$w 0Jl"b>R$Sl 6$n13 [ j   ^T C7 :U u  W 9  T +/CJ[;..` o9{- yn   7 K p ~ | ZM~lWx_yG2F2+t$   W$=6Qc* y+]X{"g}91DO]BT9~*f#A|FFb4&SZ I&(a9Y 2MoCZS e^FM'>YntoCZ)q*<Q?F3=_`<I]M A<Fx G!/\ Ux7KBt=Uo8*k] ]8bV]Cl!{-P,>vq]RqIt(CSL$sJJ}gL:n5:09kE)nxbMeT@1I(|,-*   q A  B^zgOU=fopb:SJJ5v@sIcl# d+b"Oj 2_(eX j I T 06  |& H,L!.QgrP$F!K(lW+wy{X W?SH&Sji`Uli.`MBi%otNhZ[?GMMXk$8PRA ^   {  T $ V qf h c D .   K   c ( & _ - ~ U~( [ @  c   b  q & 1 P i 1x FtL!v*sA5 a7q|uxSE%L ;B1z/9R5YTtR-X6ffW*oVv8uW}VRV 9[ 5a 9L 2 8 # a  : %aDnX|3(r13Po64w9R + !0!DH!jF!)! !  N  Je::?Fha !z!"1"#"$#7%^$%%%%&H&%&%'H%O'$f')$L'q#&"&!% :% a$$a#NQ"l0!&cFz3#m@<M$|t   r e $G67@ _   *   TT!) <El   ,  6     R2 w \   &g[NVt^A9sR)Smno*M3KF3IUe,\/"oW i/l>) @Zxjy2l}kngmDkj{@9w#} Q  t72VeXAbZM B k 0  C 1 p g :  }     ! '  t0wK[&a7 3"a O`.}>Hp@Q*!o7MMFISrN$-N;_{G[!t&rKYlWJZ(BtI8nYoqM'1M)v26~3g90n<.V"m   " Xdhq'H.@)} K(sI\>Hd:^}1A! _j M k   - Y XnXx\uL&y|-YJN60 1e9rUYWC?6I}Nasax\0s/1$^kt#vq|F>'"]|^;t& ~ . ; G7 80 1R   ifV {o){/  !.!c"'# #!$##%a$&%''(I())**b++6,,,--`.&.../. 0//r0Z/0e/1I/Z1/1.1e.1-1O-1,i1+1 +0(*/_):/(J.'T-&/,G& +%)1%w($:'l$%,$$$7##"# #~#`##"W"D"L!c! W 6'Vo 7Bnv  G7gj g9$ G) T e R i f  o . v5@^|o00]7]r#W0l l 8 H ! n [  y U   } !   ja MI !     E! w> P 9 l B i \ $ Q A  m w \ ` I M?lLU{SPnbHMX!p"RQj tweB(+~Jk'POZnsSLKAMc`em\g\IBe\wVL;c^ Q{aqlJ@Nqd#.tt6vQE|](c/TwkCr<WD"'M  F} %p>%+%vB, &#+X 4M Z\6/C{\{MdlMJ'   \  ` 3  # Oa h fE :0fRfGmoF\;o<o  5 9c'$rLttzJ" rT f U 9  SO`c8^4k0k7Q%f>#)Bm W`Ws8dP;_rs[D1lX3   N!z!q!w!e!1! 8 Do ) ?f7YBQ&O$@  Hh!! "H!"!X#_"#"#"#"t#{"#""~! " m! d,j#QZ("O/}Kje'  k!k! !I!Z!`!e1!H  Ue,K!esgK-*Dn*6G*Xa n3HDh$z [ T s  , } 6 b  >F  h v  La  | X7  ; . m  f   .BLs(  + gp o 2E @ 3 4 D >C{18f#?#Hb 5};{4O%QWQ: "tFCE0A^V(-Kg-@SV:|G ~]1j$c][yQgrEp\~?Ff1X#fm/ 4CE=,/@mx#Su*j)3lnVt4JbI-h 1aZt48ZfWujaqM?<IPjA, ^y  I 4  9  ,! )  re5>N+Z%P/B_, 'CT^g\L~<^w&Z4x#9TEm39gQZ"Q 9 I G :  ~3]W;6r@e|9V/Rxj v] \ (n [ "  2 fc * V & \ C  / `t 8  ~  F & es  -w!5ZSH g>a@%kV3TYx\@;i 0%G kwoUqTVx6SrB8<a~yzv9A,~n@2Az9km%,  #*5/^).J5kwX_ Ww80*|{iOI&vUFa{pR% 1_@& uNVo&`L#;>_*T/%'%?bMftvrc[0r=IWXC%},meFlm~^? 6)>>e|~9qB$.@nSA#56jPY  [R9e9TJD="lq"G3Ko[w@ZV'd o q + l x A  o qO 3 ) 7 ]`   J 8 VV ^ yrKn@z ^S |+g5 1j;tF p a J (q \ > 7 7 C< p , ! !]!"O""C#E#($#%$%.%&%$'"&'~&'&'&''''''& ';&'%&*%&$&N$&#&#+'#V'#'# ($({$) %)%@*O&*'+',(,n)--*z-*-k+-+-H,-,-,6-,,[,_,++v+]+**"*=*n))( )'(& ( &':%"'q$&#F&#%]"%!v%?!+% $F $Y$J$~#f">"rm! Al>[&[F,j(/4jg`.p_@ Cn    _   R   f   Pq >[<2ft RBbk!}%)>BB U , ( x P , A. g e G%VgH 9PVje2H J!o "". # S$! %v!%!e&"' #'#'$T($(,%(%(&)&2)'N)'y)()(*t)f*D**/++&,h,4-R-W.O.y/}/0011233I44{5f56 67686Q97:7:6;6u;D6;5;-5<4$<3/< 35<=2"<1$<0"!k$w o 7   ; 6 (  "< B<@<+IsuaN [ t^ ; )    L  m T  6 Mz o ~ 6 ; ~ ,FFr*\2LK!!B\e Cs5ugZ"NuRNKW7$LZ:)ޅ"K܁ڥ6ڜ6tliګ]_5Mf4ڌڤ۾َo^uؒ 6\ً֣\֣/@ӄoЕ:ЦJ(ϲ[PηͶΏͬn͓c͛rͨ΂͞Μ͘͠Ο@Θ΀ΘΩTϟSϿ+3rЭБ =U=ҞԶpY6 ԫװSرٸw3Dܪ?eT5߸;ߓ ]8~S"?ޛ{W2!ߪߠ߮? 3O[߂q7<5dmeP\p6Dg>WߤeE)ߥܾ_ܢ۟.۱ٵ>MאيXaCQA\Wّז\څU<۷r%ݑڙ U}ެC2r3߫.ߴܣ޿\ްޯݕܼ݀ܔ݄܌ݓ܎ݳܫ'QyޖV`U'n*J$Qqq#YmnE6`h'r,'c[[aRGhz(YV5~r 7Of]  ?  }a | n y  }~ x, ?GGZA 'n!+""H" #."e""_"""K"*"" #E # !$!%"&#'$(%z)&:*$'*'+'-+'*j'*&)*& )P% (F$&$#%!m$ &#u!6 "|[ Q T:@cWivqN<VvB9  C  9 u 1  5V  Y  G buw$s`\*>[m -E^|v4eK6.*cvos/u sXtg"tnRdFknhMn0M 5'&\!J?w9wK\^T&#X(28HOVHwA:gh\-"LziWVP:m ng=;gr:yvC&h@sI@<;3B8!CrooD#bvr^i * 9 (l  ( 31 6 ( -P7U.  z. ' 7 @ u T    >   ~ W ),  '   `  B  [ kEP.<q h>6#}TXQuDA-x-),4g9MlLH   DI!!n^""&#Ui#|######[###f##e#$K$M $!$!m%g"%#F&w#&#'?$s'$'$'x$'W$'#'#h' #'"&!6&;!% +%$@#\#""<t! 2 g?!NuInZ6, G'- h  A L a 3 ]8g~ L rD>|2vlcj XF!W^E;&2" N|F 0ieXh#G&0<BJ>8XdAp1PC E#8;lmCO"|o'h88`6)^^v%gqU@ 6kiLaE>W=yO#'e5IkPQ9a Ya[~3mizaP&{ExQo$V6%p= iR Y . RR"I{0zGaG>29 V q [ U ` 4 y +   g b fw G "`  *14/Di7qt&CY? s5?9m{Lq8vV  B&HwPS4iFYG 3 '9 1W Z}  V8 s /  <  1 ^    8 K W N) Q + g    ]D-JJ 3r>3 3L+9zC7IN"|;we h*KF%jߒ[uNiq,+&_ Bdc QpO* <71[4)Vu9Y~&U2} g޲ޞ(߻'OV3^ws;U8\=kD~k0-oH#St?T(ߥk:ݽRD)ݨ3twQMj`#}t I276.Vl.qt%RJ|)5\y.Cr=RQ/2?!{|j:$V?mXquZkgc^L6 (Z&n)~R{8.b~]fm)H]}$usBB0rh"k,Sw[ nvBk%piiF~k#2KlT .!JgknA)UgD#`/Jy{.BLy 0 +< J3 ^ s% } w   ' v c . U R 7  -w4@B!6{D*I} / Y  PL   D ; s , ~    D Q8iECbZgS|r $  S  s )|f" &>DGiB#aI1 [  D u o 5 @ RP%Q6U_/}T& :_1@E<%pHv4q:B`3X8o/:~}/0ej KA݁ܭ߸ߕHޙ׍ݣ(_~Hڮفӱwӕ|Ӓٶӥ e0wI 23ێJF;Z׃X)S׽YET{׮ؕזט?ج>ِy ۀۢ5o܃ݞޞx{&޳ Gޒ޼آw30ޓݽՀ݇Z݃2ݹ ܟM+ 3uݭݴ\V\M߻l4 ^Om\v2yJ.UWe.f Bf5#CW*8~+td='\ <Hb4q jz!YXf\h`6/m~#gACzxb0|X3ABC\y'aMwTW9B ?i!,qpip V  " V 'J`bDYWdx)OP  q 4  M     i    ` H  u [ R t  V   "  a"    & + \ y|c(9e%] i I2Ah +d.%0?_r%\m(cb\/NU \& )Yb?  {u^0V C|x"CY'BZt7NOyq Wxul0OJr =!E G UL hs,rh}bO=&8w^E|{sLG c_'Pt=H\5Z`f^mg\ &"%uE s"#|eS1] P86 "q޽f'XމY_INuFާ-ޢ{@\M)%܃l܏Y HRkݚ2ހ[ x9W/ {1Aey\ .k/s BT,-JRCuQFLIb$y~9 k@r-7 X |a6KMkMo. R  { I h  `>Ma2< ^-h2Qm8mb<,wR3Ut}mzEy*j8TLGB##"/y'Nu l7SDK:R  B  y 0RwuHP+Py   N F  j \  ' 9 c 5 G y 2 + j  ~ l  & X4x|5XNtA:V4cx_@ mISG4Jwp5G26AwP]V5q73j\6cU_H[)7A~@DhwA.{ߛ&ߡ 2I~}N_*)I9!MHDH"(~*2s)v#4-_y|*`pe1H7< n<6VdnFvz]? ,47UaP\(.]/7zeA 7i"w,'?w-wE_ XyvSuX$pP4boByNtJtfme1z p]'3[inu\wa`lC+ ?E'}}&g&-2&r#CQ767p?E_y{x}N=/GCIK8.  Y 7 : g O   B   | e A     >  > ' +   h  "  L% } <8n    #z I" {jor~t6t"K/}Np9ninMEn`trz7 62X[;W]o~n_H#Gw9V3WR= mm| n\  NS z ! L( 1 (  C  >  ^ ^2}8iDfax9Y oc^Sgc {@s x[x\P<Yo9;w2R&R^]N#Q<7{! Q@qc  "_C%TgrS@,&s2URSd`t3 iu6X 9+!16+F*,,;<_CY>L$r">BtARB\T|N@K^e8rt4WQy?FeEx#f&`>vuyR~=w] 7pwe4z 4-T6)W&55-bN 8 V X gQ WC Q - gx ;q    (    j C    { \ F@  Wk#w^B(/)C8V 6au= P4Z!=MFH|FL@;^pM2$mweP'-v`]rO6.yeI??8`6ujqX9f*M7 0jt _r;z >SzRI s8 Z l ^(Bpc     g V bV{:~<a  3 E  ><  R +C).wU cq v d S < T   G M &*xw#@auYojoI?TuNl5EU"CzUU==y < B!Ms;DU"sWpa%?<acjp3=@Xk4>#f ]aj>'6R9s]Em7-4I`ES`} J;O;G- R mIDU)<j)M55 1 r 6   "BL  @U  E T 0 2LPIJ7pc /McOx}N   Y m b  k  B  ly * q  Q SDb*k`iXQAK @  @hq4:vm>6>nYc/>^/n@+c,rC+2 `oV<_ .nz  '  `6 =u*KfUA9  [  ~  * : H g >*7qp+xSFV+-=h`L\DwF>O{]WWU,DxVb^-,5agh~-}GcCBdBB~kM;Nf/~[>T rlf7[TrIR5wMRg&)Y@gt(/lK aMvH#.Q@Pp:&QeZ>\@H*QCOV89A`Bj=$-Z"shJD@u@e } %YP<1=^klQ DcgA bY-KVn]y4*q07MIpo'eJ# 4=tJ$h&Qm7"*MPi lA{{;]%UvVi|o,%q#UQoY' ^l^MIa3\o[$ed[I 0v@]z?l%wpJxPkX%>n^@8A c)|TJ1&qJ%VhOA_XK$+K./kwF)9>=+0`]H ;N6M Qs&>lq JRma*BJkrmYF )a@^hm1j]r5)L" 7k u)   - ]       N9   >1 {  P 3S s_   % ]] `Ljb<#G#>[._/Hf!%?%/yI0)>]fDM[9#-zWQsp~ex wg 9 G  -  [   K[A    xj vI&1A4Rl "\\dQ2Ai{(:^] H>FB^nnZ4c zV[ y?`aAvlOv pX``fC^dt ]9n_U7'j'CA=yP]S~qgvZ 8 u u w.h#?i z  Y h6  xc!eoD < L &( % ) Qx r   'i ^f     H Xx R I > w   1AIS.7   u    2  Jr[<Gmpj?  Io  i = j  m_ q|< 4  &v h&  7 { L T S R ~ r ;  :  A  } jv=8Pvd=<2$@ /wp^_>_$/r5   @1  n k V H 7 h `GL|dM y$mcs 8 j   !\  y @   kz V 4   p x REsl[o >$ v ,(J(KTP^L-F,tZ$r= DKV~MG'8&\2B}2/u@x Kh6kO:IMfU`%VQ^ ~wp 3}6xqcw8vt` 9C8`JMb8*5IW" 0\N_0z9r ^rNXK+?ZKCEej=Wo<3\i #:9n\TL(64aM,(#0"p4%;13i30:: 0N#]m(53[)of%wM(qPR%qn: 4` '; 64zYC<AP*gZtn]E \ %s j  c Q?  ~ v Y  ZG  > ; ' fs  $ N L   np ? c  ] / Z z ^ m $Q4(UF qo y X * + k     ?}    N  Z  b  .s  E    aZ    ;0   m t4j,Wn)jIl_#>:;WP5L8k 'zw+xb#n]&uQu'{g x?k tOD&SJ yF#u q(4XcpC:qRF& q*k![pI(A(kr4u%vR:.nnt9 o!vvxWr+Q>s#wC9EhqobSߟޭܥق۵-ڿ֑^T!շ%ӫ=KӍдiБfҰXbK.C@EEC=L(Җ! xѧvtDT 3ѿx.W7n"ؿh/ҕ؝Ҩ(ӿظKԻhLسN/׋tِVڢצ{C?ؑnܲKVمݴٳ3ݮ1b~"0ݛ<ߗgyDu,5hBh7R d+ e_6Xdv+It? oP_Z~j7D(YPL*.<N.gy* y:)7|uBfmqxd%[{{[:z?FkpI4t; i' n6NrKYyLy^m :8w2Q`X  ?Q}    l  [  i 9 : } 1 F W mvz_Q<3sK2kggR U:&a  f@  -   Co hGd^ i 9  ;J  Q P b Vc!K&9Ek5lo-T_Y!Ve:)_@k9UdHJ1T`1p$[b'0m`fhjX<%Xi&J$%g"4 v?x_cgU(h_"zA-TI$C\~PA UvJAQ\|yrSF99 D(i[, tM'^y:d _2&#GXQdfN\E;8&Ea.; 2T;=*GQm}#lv#$++''/@dk267I4-Z u K  n 6  @  bl~@uO 5XNl4ry`[/n,xJ- aa% H] u*< ?lI"91^dWRcJuD>fNx!zRJLUUy(|sDAO7e * *i   U  V` )x (    U  f> \ S 7 R + 2 g  } z _ ;  U  D t^q)q { Q  K P ] _ f w( _ K 5MjPUb?" <{-N*q]-Kp@}<Cd nz(0Ux("ZcCFJ\Nsir IFpKC+u5YziZ+s(to/!"$z+# $+`?|8JOVA+=F< ^D 9 A  M q / 7 PeMZ =gQl+ 7_A<hdOrr2=N U=Py;}ljR K0YSopj2hRKT8)k61~#iH CEF{FCf9g]B޿ d[.ފ܂(ܯ%$~ܬsݤ,GQ[1yJC%*gb,TnC,c51^'.`a,oZv8H _VG&xu(xhnDO -/ ,Su-eb(( / J:  o <7}p&<G?^{X    M8AP< _ C  d f \  )t  @ Y E  TQgFF(FTK#W..~=Z[ D! "# $A!%!&L":'"'"(#()#(#'"d'"&j"e&"%!V%w!$1!$ [$ Y$v n$G $? $* K%% %" & {&$ & ,' N' J'3'&&.&%% c$D # )# "A!%"!!!!E"E!"6!"#!}"!B" ! N! % u (`i\4n3]KHp}ALYtEzcb p n = HA  w Y I p `  U  mH [ 5Q  `  s|8H`sb,xbm2+MB-8(@`/+=Q]p:o~ W{v<{)C%ly 5;k7x  u h T {K3BMv)S#=H u:1hQM[z0ef#{])kw6;jvRF^ Pe f(.lgdpoE o^  L X  v EX + g+Hq;\*n,y=GQ@^zTKoF@dQW=\Gi lwiIw"xlxW#W#b2NB3W`V`:Lq3id'U@\-& Inn22A{Q 8w!q2tCn0bgRy&Utk2!GW ' 4=2u%zpTz < T,zIIi}4fln+z4_30ESlxv*m'xhZn `|'z';FJ!eV~ZB>0,qjDvODC2BLy6q<u4X*~:"GIFO-7W+C2<) B M  " :   c)  3n$W6:de;W`l? H ! }+FTiklFy6QN@d^gP m  t   < T  ,cb|f^[G$  `+js/2  f )   qJ G}j:  W O$ " P  Qd>%OhcX rG_U,W9: yj   ! O W~  [   x K     u\ P"  ;   <@ tU"lK<zx'@o APw ]]$8}eYwp,ktszv6Y7~fL" 89 /* F ^v"|V^/^ B3Z85 E  , M q  $ ~  Z 0 & j  n:-6pXNDUxk"[kmJ##dQ~L*BFjoqW`O.2\@  o g   z O  `x iWp:gAG><mV h 4  @ v   c  M 4 . Y G ` 9  5 ]   (B  RQ  l}MUpOh eM#  5"d#$%& I'O!'!("(5"' "'!&!V&C!% $v $# a#"H"!!!= ! ! "F!]"!"!#5"i#c"#"$"e$"$ #$A#*%#[%#%F$%$%O%&%&n&&&%]'%'9%'$'#'" '!y& %$#"! #*Oo 5 A `uEm8J6?o\h-(HIt d 7o>   9v / k  e / s 9  <  _   )2twRk\?6$,%-';R,?f  9NB\P,L1&!gvxp/jW!|IMG6 =wVOY\RO6FBIE)y#)7@2|vE@ qJ7AX~?Gt;'j| W|;# b ]4QCq>JMrzKj-^}`dq+=NaV*8s * YWa0Rmkr a(mRnzqj-(wuF^.?  G{   Xm   ib  Z : |k}%5.@kaf #*iF1^3I`xQIfIE8x 0 A  4|=6Gnnu|DW/c`<cmh.eW{;(=[9WriO &a88eZ hU ,M !  p  4  OI  T 3} > u   7o   j R a  o  H ?OJEVc #l  q J h  1A   }!UkvFwx~H > FAm^}g!5? *7L~V op #vbux`9(sEx}9c 7   iu % :O<#yWEg`  s\)w|$@~?,(tuT)jVH' e/\|/g^8&~+Z C3OM@}FZOd7VB8 |YMp=aV5)>nmc"Wt9XN:>pHs*O $q?t# "%zfxJHA I XW W ?  # / @ o '   2  F O ) 1  i 6*<w> & E  % s    h --qFcNigU=64w5.27e1k%^-p]Hr + } T F  Z[   5 \ |!  Zv >  Z -  @ w P% @ - 4S"+f) @ ;  i #  }  2qGcN* <6_xJweJ*_2yDO-`_"Z{ a1qC]N,;9g{AHt|Z ['R nn[}Qjygc|d<0r>ve*j] `cR!MzW;TH2H!=3oIB$Xvt1tLuT8WT8]6K2z X?ig2j]j(z8ea`\Z_v5Npw?bZC9%@UBi=hmR>a;u;FWD='4N.;F jZ608F` :Jwk2$6kQsU&jh$A{PdWC].6B|i@g kax|by']]iN9;'~4%VRq0NYdmt'X54,8NpO-y8sQ\}/(w_7 ow]H:9;P|0qEoG\UR=,2T i )E/g!_.R{Wx3=`8?>?/! J~e7a[L|d}F4OVE`U[ :ZYv9N. 2UI}4s*H&Gc(B!O T>WG(;WN[iOj3$,**-AY`1VgCdWNYoVvA:c.f'D|)oR9 *_z-,@0Y,h?_ nEWi  2 7 . V'RFt6y8t"cd 6 ; ;  ^w!h-:J#Gs3F6&ZZV88 }YaB6+%)-0w@= :7$I=It?5HFIr,x Hp)?[b'Ub/CjW' "yd<PXnWb4"j z ]c 6_$3!$,@!! 1]VKD(Uy)fS]UcpTB'vW.?uK7Q.!5>`1)+1YTm3p5=SA-BwnZ_ ]?.;U3aJbH@R-a DisplayCAL-3.5.0.0/DisplayCAL/theme/gradient.png0000644000076500000000000000052112665102054021027 0ustar devwheel00000000000000PNG  IHDR`vÎtEXtSoftwareAdobe ImageReadyqe<PLTEײު͚ڢԶŬϟܣpfIDATx[@K$H"cf"Kq/QE%BшBD'Zq]LD/"2؈HJ|D*()b*b??Qʫa IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/header.png0000644000076500000000000003117513231531251020466 0ustar devwheel00000000000000PNG  IHDRŧtEXtSoftwareAdobe ImageReadyqe<2IDATx} ՝9{컲ȦQ@j`!1yΐ13d%:1|8.((; 44@^U缳r.&B;uֽWzɷ{,^H0PG(`4tV]|=B`۴|սN+I1ζl1޸?c-mZD( BML6_bOC->NiɂLȃ L Xm`OӨ^tOPZ j-]G kQ UkR~=bמ wo:qW7a C:;{ukO_G#DmW߀8dki?K|,Er(]pVCYRD=5Pgׇ۷橕AAL %Ǝ'OPd'9eX'gkg ~dz$3C1u\̯׾m̊QW\Av [|Һ~uOŠ@$kDhby>ٯK's <肒%E$KYXS,H(Aȱ6T kxH(ks'uh0æk{5ӊjy3C:ԎKD w`c*aWP\HM+ϙdKʋ5(5SvíۭdoJ-`ڀ1-'[!ɷ Pښ9% bC-/ٰ7apT҂]rig{li3o3*8.1?sF0k?8c{ߊHEƌ8{HkGj?3}{ۮζvBYiswkpϨ7@kX*%^wyD+]nbXػeڶKX;izmvO}ί|w_>Ij06OsDlm۶,L3(edfp"74R&eGfe4B u<n=k!>ܶq8pFq=NV͇h M~ڴXFPKOj]>SAsITS’vQ@XD6iyA y\_5q :a Cx<8C ;$Q\4aCO˴WtxGP>݀esr"FOMp]쎂n`IMN b8ozmU8%KFDZLst&BI;DQ3T$x; W;ڼ+ݓǥXnɉ*H~N(ھO%9(*={K |К14ASNqup[{3$SIm16$Z˷0IąnJ \ >XtA,E,HA%Gs#ܑa]s[[(x^SaǷvʎ嫎[ hΝ6(1gGAuPʃu޼L]2ĆDN ]$QfišHB,V'01ai"?fr F 3akݶ Np"ab ]nk˫kzC2eB".r<ޟ=Gڎ9f%EPEMT)> r|ѐ1~Iȭ_G+ӠRdʽkOp=GnQ"a'nZdomݍ3ܦ̺L5GPy@SAm@C A+Ȝ<,҄HlrlksPS|uSC(X?y< |i VYRE8~ϮSwwPL_8CRT Sq@q\Qh{aq͂P`-F(CEGh~pux`/`mdmńϊQaTjEQbdiK$ #@R,M>vv'`?$H>E0H!f *9H~a D5ԸkC}ٌ 6[pit}|)) 4dVBo 'W! r"ߙe2ȸ9Mhܳm3R$:ɣ* dsȏH;~蛕c ) K(3~G 2%Us/`Ut0Da˿kz7iϬ +l8ؕաFjFQlmE åzX3MoZ@lv•P ATin9d@"t8:hHZl7CW>W_CG\ d"l:TW {wKO>C$@SF io,:tte쥛Zhu2Y)淞ʓ%֢ΒxGYs{QʧFgt9w/dž&&+b9lG~Kƍ<+^\K״p5CAK'_}?oǀX| o^g3F@BSo wUW=-~ԇۮ+vP`J@a@q&J$@)E] Gy[?xjl$ӁaȚOη?ǵQMp8dO]6}߻cт̻uyF>eZG<\RcGp%?HHgeo:g+6%onT[zv=7ZkUЪY<1߾?o^zuq?}W&ʸ|+vCsE15|TKF6@6/m۾k 8ⱍЫQ*c"c"drLm"v(c5 r_2!kphpgB\5=]]w~ 5j]?n{bǒeοx;3\@2sߝ7Av|jf Mӿtu/rhSd}zY) |h\3R՘00 wDHWW<,D5 U}D01PׁR`Ƭ40tgfʾ{ z5ë4U w'iZ Xm.J% AOCTaGS,`j.(O|+_\w0~w/~a[/7^AD]&޹~͚w&(Fl\rl~;g]?gC o.eh(+ףl5|$z{8sϬyN__y{z%8xg͓'Y;w=˟˳:0B0XGaJ>s/$X~ =ST@;(h#Pp>)5qԿ8kn| LjłkXT1%0":7% At:4VsqFQv .WHPeO u@#SUcs6MYM80v`>夐;t@xYJ>J<8^S%*mF?iԿ[T틿~蟏D,5)S~!=\_9(/ Rz6Jto[E1".]Fy0Crm:@33G񕻛ӱumZ|<ɘ rVQ9MSKW:4P^zKCEaK0e+3(. P= cot1l$Idmȉʮh$4SYdgS?@5n۹nWQ=[m\5䒞{nN( zs8m{%d&bިU+lw+f\_SrxUBzp =<ܗם7|`{3GQ)-bEd6p  MHIᖭ0*:"Fe8W z9 G퇷qDft@WLfkQ (0JM6 Pw tK d4",p)iʿ<-fV;'~~w9,3w=.}o>NLs~5']?z/6w~8 kv *Fl՗Ϡ۟\ ۻ/:9q\OqŚ,ҮEJM]2RP_k^^huA@G+C|?,e_BΗb<* ƣ)0[5*I5Aܞ}QvE4ŏeOdia0,鞚5g1:JHsS}^OmU8B5:i0K3qa>doSQ65(V+&%};FZv@Uџ/]&3O«Q,mcGՕ9VܢKR xP1\CC$S{Ǽm;cG3&ݩϞ Ur%!"u[р3DchV4u.MAP(?&:lXy4m_a$J2|~r :ҋLAyΑ b " nt nT`F)3(AG ,=C%c։}"M7)vӼ+?~o?JS;OV2>攆 N͊!Vgzp;kNPV24]aA9,YMUwTUDةdLZmlj#0Nw=b>c*L f1 )-#7v˞lɽ+pwLz~͞GƒLҖ>|k ^@ v֨*'x[C04K#hQWd$sZP,*)|q‟ݐ5zT2E_N'!n1Fn=Q= &뎒Ȣ^9ڎth9skz GQ'U<"C_|cVe̸ie%2HF|KXjwQ#P{𥽨jo*}oHIMl3'(_H7b&MCv݉sMSWKǣup^%T(&R1~CK6֜tŨM5N+5*VJ%5:ՄqE3QGq>llīv^d8&`J,W` G_\4Dzq:Aq{rS&8 {k}ql {#++tT7kX|3ype+Apu YR/v+1&ďY??w5]j3Oگ2p?nM[ h1׌yhu'SlE Ρ睊sEcP;^ uي?oWDxQ]8OPy4b`SYЕ8L}_Ac^c- /Av"@)5Y`t|%1#̾fIGhao+ʁKjjHSos"}dynoC*F&eǷL֣ϬBKӠV#}[]7~ǨY͙)HΎCY ; E(/GzխǓ_P}: Ŗ,B͚1%nzgrh(K3{7yza҉RP擣_~  wy'~R3 QcO.=r'C&*yH"PiwA2jM6ҥo.+P]g%aEXȴ]t &fh>#v(aCrDϡ !QJbrv*" b L; dITXYʗ._t;-}ؗlODY/9ޟO}|r` 4憭3~3bTфjSCȊ֜|󽹗.+ܰ?e?o/*a>}?e7<7.ꗿH_?i_hqCR?Avd@a\w)s.zP>cNWH(baplW+/%}"Zϐz0> ױKz*O3-jse 63$1Sw(km'# χwZ. z8ku.:#M4;(7q:pW)nBKm[{x-EK}N޼H|c+}{׍WU rM?՟b”c+jNvmӯ*2hvPh66Y;T-CjE9^Sc`Ck/vÙPUn|puluSڟFRV}z]6ɿ "cNeR_:n@1~-| MOL/偞S6ge؝X7,+q"U$zb'TЧ#·Oc 4+aF dl]4L0o=ŷ˻xL:z5^:}ȡ[TG+;k網(5(Mܶ>ʲ̊bG,rXu-ajk[fIK:=<6b@dBPPU O^FnDbY˷0öc^homk9f8qH `Y:@ y X !H!$6#\\P`=+w|\ˊ=uCion(z9_ōHRL'VW.k>f+E:+1K7>a)j BQ,[ F݂(ǪPϞho^-//sŷ]f5| 4%KEk~|k7\?"tBp@BU/jty&ި]DZ(.+2 h.yHX̿Jaa^:}7.q8 48 pH(̚;IBgFI(Nu(LOT%y P%i}nŌ+@:5\5 s*ALI݇|SwOӯ'L[QRy==Rję)afo+1F4>mA,p[U =铢6@E|"5<5AOMVK}m.Bi_@JeȨ͵%4yVb>N `LeB_ )+yDSrlPr`=Y,fz#'7QzWQ6a9y 4)|NJ 9 KV$'Nʦ-@pligeNMM%A}zv7$Bn=8SR=Rnj}*GϮD~4qA*^ѬIZ~vagT $F-}+?y#ыp 'k\ k@9=tG|p$`GʘC(r^YYF^$L'S=FE~O* . "NH;uw>(研yaӒ5Q%Sߛ,`qO84bƱIGx9u98o^`;(nkkڔO]PJc8@.i>2"sDZ.02 9H)M\g8d$4f @=^ b"aiN %~Fv HX26@O'dK ! 0:Ok$g2 1>@1hf8.'3!䄊t:9*jqzCY3Út. %ddis:n8xKR@+(Bj!X d`)9CX]k9aP[^h<ǥ~@ERa6u46*TrZyp)s$isudqM5)yQ#x'@bwEM!dVHAH*L`ՠX TH'07cr4%D`Nd]Vbdw(5m ^ &AE/M Edf)L22S`wz@( 1S4?GbKihu΢ 0{ J:='x>Wlytf? Sߚlu`IUJ> ː`:UgՂ8(0iOC+*,r Jʔ"IK/T40Uf5XPR@Y~M*@E2}[=~L)z:Vpd$E!^lŴ$cTyfw %&stU"A\jEy@L7]f~'tqL?~ +\C3õ(t64ΚQK(e j|'?4)uJ@q%fӇ8I|X51x!=oԺcU3̢@3\%t;{8Cb> 裧Ix=HXw 5ghr1Ii M>PlZ Ф+ ۅaC.eCsWjx)h/( xaN9+tdYC7y°z?H@MÝ\DԶO~F%=K@P)ޞMNpy:CrEw:1iL/]RP=׵G R&)drSh54s>js<ݠi2D؟j E5>R0ӪI zTbM]؁@+(rOdFx.27O_h>qVX!6IH I/%-q)2';qI2)SBAF60q5e&{ոG~i"d>K^a2M,9CJNohArsj>W]^Uч̔@]ȹ.qm(O:y*t ME34Ӥ(9b}QPGsF5)rD_ιEd`2dOk2ڿ Mh[C@ź(Z4 hƝ{+A2~\)-h/1SVYW}!L;8Ry⇸ kR8>d#4onhm1⚍ LԬO[>be9=DH;.iE\RS$Zv\8fTV+bӷ|=ͩNgL$+k)\&EN\>7id-5HL%)a#j֑BӑS}mS~mӲy3fcN0"/rS#R"K?7}-V%>qiiF.)x,/!ObDzt{thmn '$ټ?{I :t11ќ'3:NBKQ[zv] gMHj[/dglp)=iYjngu}KRF#6 }S=גVa).Yv>)X!gnHlCLQSf`sat%J>9knCGPYaK.ͥpӄf^XCbl^OZ]OͤS mi]%Pd3f:Xً%E=~ @p䳂f6Ț.I)/GR.وHRgM35Rf M+| J0$(< R@% J4(QTD% J4(QTD% J4(QTDM%J4(QTDM%J4(QTDM%J4(h*QDM%J4(h*QDM%J4(h*QDASM%J4(h*QDASM%J4(h*QDASM%J4(h*QDASM% J(h*QDASM% J(h*QDASM% J(h*QTDASM% J(h*QTDASM% J(h*QTDAS% Jx|IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/header@2x.png0000644000076500000000000007750313231531251021045 0ustar devwheel00000000000000PNG  IHDRpLYGtEXtSoftwareAdobe ImageReadyqe<~IDATx U6~Ω^fz5,}B$ l i "^_{Wܽ($2 YXgLef2{RU9Z'}~멮zyyo=> lHC>!ҞU ?Snjnu6bIT%tHq2M:M5us&U1NXi"pd%q%֕3tm` aϻN.-i8X|Iz!:MiHAN Кy /4oxW|R5oH' dWNab jTLp((@ з/i$BHJ(L)h2Ĕ)xj \_GgֵA߄UI ~NG۳R&Vp&-dXi&ǴAKOH_5;. S̍֍D`VuqDyBv!N31_8Ӕpb&3\Dļ!f=J% RKH')9o&Wi-e߁=*2dL9&dS<+ꢙU 7n ͻ;jiUc`i .mVNp2$ ȹ-LR čx(mhmACZiIi#NLܓFw !whʦOqLJ˦6<msҲ`m Ȼf ݼi1dpLF7f^fptH7+1zضFJ ]Py `3Pe\@'g4+1EI׌}8M2Mb4@YW>eDA 7͓9;wPeyfNZ0z̈q؂ Sz+D'dö[)]Irpra%"//l[mGW{TEcܘܗhdS 'i!9@^ :9f t‰5%OwwNȠ4()nJO] e䖀s3q9uuF-!#g8nv~Ǝ8L#ns=&P#}׍xB A6e65Z"Sd'g 4 <23 @R= ?廄ӔLS=52\^h0I(zh~] &BsoP) w# Osr1&Fʵ]TWu+a6b1ޮxҭWQpi6st>'2? f\Ie 2AF(zV7Ǒ2nY#HýzB]B,.Qt'fEKH]D\z5Xu>Hh3/ @оClq>AW h.5w`;{lw)k}<̏dJ!+=RoF$fR`Sɭ{4%oۓJRĤpW2IdڲFLȫ5"J!_8b֕1}\L]ikp˛w%I`:!m|x~YM <"f n-k\ˌLR"!!i") W;n)u3T\R||.F(wK߳kOwa&"f H{ءlրbԍ3\מټof^3wiX9؝c^F!lhy܃6MVPq]f'Rt=u0 "IJJv76$*'&V?t[Ma3 =܆)p:bLHnT7uZSk[HJ^]H n'.@N^ 1W&)`%a8 ;AtKT LyG0HPaY@8ɓJ8Bzd%]O#؝Z4 SŔcH$ tn$JL.*3̻O5t쭵.-.D{wO!ϏplQڴDl42;Fvs:1 ܵpʻ`%p dj' 5ݙ?Bm"+߲1XqM8O*M>rmhP]y EPcZ4uL,02k.[NDSY] S7e">yVJdf |QYf  QLQT p}~8#l IuB7n-2%kV86:qXhī>'24@3GejD%)2Z}gWgw܍ b[ND!v*̏$!=1v [i~m9nRH\{Tφ "ݝ?3\p\jL㓓DPe,_hs[EP)ȍ-z<;NcY^uߋn{"&w! Nu3K C3:il?D?yi P @YK*x%|5(ȹ*[w[rIvir*] mR{ N͚~Gz<rb,/as@y(¹si"_ Y; @ H*|3A\2c rS6{ÊҖx^0Ft~ryQO"8cPX[}԰Sȥ(DhFD0ݷKG^p~nB掌وiK.6wk[Y}e6¥J7M- ^~q.| ,GnZsrJ3?6R‚ޒ0zZ:*dlfD&tn;Gɫ6CM*-7UT4\ɎM[Jf<- jAo@uSJ&tKHGHټ>F/'akߘP@q.I`҆D1#LjGCWF6,&G =im'_o#fZWUXP_tF[˗1ybc)o]~mvAJLw`Xx 9A{BGq;[J<O}uG9rHGF߈qsR(z]RqujPEցDq(^{uuPS P{^91.h"s\w<{Q1CLcR9Pd4(7f4wu T|![qL=.'@{e6n]s"<qޫ^};EL{^Է}0"3A3) \;u؛7!}y6/|Y1 qa9%tzMe*% ^.-9@F_IMKoD}e8<=P\ Z(.I5HA$,Ŷ1ncBJWDiq{ʻ{"hpЙ:RtRgTGBչ=2OR:av!bzuM}I`U~%= W_zUSǏtMTW?o|>v; Q#ş_~f hr%8>S;/\(|EB.v%SlrSnkgNot;pAc{T jrC󆜠Lj>YM?*1nZihpP:nMldMfmeE3)Hm!423LaW*WЅrYH|2H2>1T|'7MGDD g7{rH$g.!PQ fmhcK~r5#? wd^IxX#(y|;S 2!GV[ `;7NQ[r y/6N<3#Uu7?y}szWTTW ?.Dp0[IR!E;.P @Q).%[6 [xF4[dTA⼔&cZZoXz$1%Jq[ƞ ֡?v$eBXU;֭ZbfNgJak+vdpqs0tp7gW̲U߾nCo|!%;/zoKy6vAIa{q_;D5/[,F*ЎBs3zU%_5T7m߮A^p04r9#~z_Wn{Who_=߸0ҿB"_g_ldRzn|GҪFH<7M+(L?N,M~~NlBh'(Eb?RtF7^eҦm, 톳:^HtZnM$8@EQG):7-ѥ gbLJ(@Eՠ!fOp (´JB%5E! TC Aa_:TD \vZ%ޭ՟#u&%qTcؤHdTmUyq)K:ɚy{d= B©40f -ΥCmU^He+6Νbp!NOᾓqӨmѧD)/ǞzknNuQ-էZN]W-5t4!bG:~+超\%oݾww8NbDx@"'Kߧ{[70͟yR1`ɻGa$Ëޒ3񳡦Ygȳ7n4߾~"g˿rz:9F-߿kJei8@vTB!dwLJ ;@!(t'Y-ٚĿi/4I}ih@aw=II55UWM=!%Ոt3qS( dWS^so#"t~59O22_pYlM{^$/:v &9?o$ J( 7a,N˺ą۔EBSS?ߧO-z _’mϧp8i'ڭp%Oၠ#%NMD+QF9Wm>buibTSws< +N!wa12|g^b&$ .èEjvpeZ_?FYZZ'd>Ej>/?"9 f!&vPe}-ԅíOzv;gnAtYg!y{ Ui:*:.Pȱ%,IPfϽw 7_0d̑ntBm.TPkz%T֙~r>}nŎu@uKks+ *_5-~j!)zҫwӴ{0SyqRG$ZcZ3+.YjV 0>P% ʉ OrF~bZm2Ѩa~|&ULH *B1yt7_\LC*;k4 PD0ye I%餱\n+{'GB>(\J9e0Z3N E8x{Bߎ Aos˹:"4SҪd(K R4Rľۥ 蚣dʷ]NUq6,.mUp6q-xB@ .LՑb>l<ʾPWΝ)wB2C!Ƽ#cZhe֐'QctYǶ?tr<;ne}$44 D0ƖN `s^ھ!a%i(Opb<;7 d\ }u.< R(ʅn%!?0 td9 IdnxLBl`%/tL7ٴ)arx)xb(sM$Upk@!h T(S2=޲lPO ),_K#g2Fbtďp,K !l8UJ? iPnQsH$D4W9 p&&txφb<+QO 1W?ܾ;C]&(^C5m=B7Tfwr\J ,!OZNny3ٌ "H>̽CY`)(u_ Cuz#rیJ .loOnmH,*@b tݴlj-6Xiz.,U D WRWUwH! ^Qva)uq!:׻1ƧE fBM)7afE3SԮUUw;q]^BO^F҅}:[SUk0'@}<0%o ]1Wj_0jBʱ0 -[c>oƍ8xfMkd)>}|{k(i Xε'(mBTG}8C*-\ vcQdRvdZ2:R2;j+6}%K.>Zgф& U6hf|\veJ9V&*ZD M;! ,Km Tn~v:.EGO rW.o΃6$#.yaӬ]] czNo'Λ[Y5!m7֘c)NL{0{ L1}?tNXUy_{l0.v#:.jCcPEK_SL Lo<+.x 9I+|c9c9GRnBunHIL0t*HZщN*AnJ87F:ԭWR7jc4FfkxFx?rQ-{DεSЉg=6=xӾ#G۟O%6)}¹]VUj"ܑ]9 Z/]B ՅϮՊ'huλP$tM!uARKk'sGmÃ\RM~ =˚^ܰ V'_z$tp"Avsk#{2.Śʦi&}t^ɂ޷cI/1*'wEkMJ"g:M_c@ Kcؠ9&<]R$>ALR `Q60}- p+ ("$GNx}l#Ul'b2c顖.u6 yb*ZqXS @7!1x# JNd$;z` *<(G6|ۿ7>>jkWǫrmZ^cA/&/pI@)|wDa=\p3,e b/ BH9/|񤚆04xI0Nv^0zun腏{mpu2#`9ooS3溪b4OBT$Rl,A 3i%{^0JKp+$Х1qa2oG?AS$`]n{FZ QB:7Ko,Be#xonƫQɯ2v:Bhϛ"ӊ3#7j:'=g :OsDJ%﷢a2Mӂ+^'K)W\:oy />u"$?_^[dN-/ҋ 5˯Y]{Ŭo<Xtk*yt'¹S\ *5O1AO>Lէ9rʶkV8`tdoM]Z|$8?3G3 w"T %A\q :uЧPW":-I9B%`=8/&r^_INv,RpøSd$j1Ӹ BLS &V6[x|($nܴ祐\Q5ImG}Ѩ^LY a&_ 炙,&ܙ2v+kD\N<.Qm&u؇VSBͳZx&V G~&+.Нt ?bu7?'XrGB5'VKguHl1 w<ICXް#Ks&TC>f OMtW7bO(.+#;CyΪ39[36HǑ XT:|z1qۂ񹴖SoQ#6zc.RmCY:Ū)Plź>Q f/  DMܶ`X8hP1JݝS P;><73lGLiB&hi }=1('C%f@iGϡ6`NhDB%`Q,9M7HƉBvz]UyqӋaǖmN78KÂ73$A!:[PQ'R cN3ؓд C_ Rw'$싫Yc , (\,)7u6͙0O5Xp8Y8¹ҩ?Ւ(ߐ'^L O԰p@*+]z/ax߾kiRaN!d/m<ҵffHӧŭ|W}g4kx8X)tPnv$T).,4'A{Ģ`R5)d+jF) &%H(}[Dyuzԫ(ZI}F? FL::@<<ɦ;4x@O D̉!Pg>o|hm%ؚMQ!@Aa3)ngwNuލQS{*q[z>9L/lsJ1R@Y!@O㾶/,x??/֋?ÂܝuDf08oWMNXzO3_< [z~;9Pep21V}L*υkR]5jswl; T_~ӿjԈa?nRa"Ivչ#c mrP6Ѷ`DB5Q[0`bEH~0nPс`=_>lņ79{GyI}tϧ/?#Zy>'%!>oxw\sva%"O\Ze<7hCv1=qqS =KDa0G`ڦoPBD KX&94)Y AZ2F5-ُd$1Pi-*ד sUSSm[p=B9:oTmWN?zH`7{pdeܻ|~Ka!X΋T¥oS:#~z-M=̛d?p ¨m".;*u=a5I۝VwקsV8(\7Eo|')F2,>7q8VN)C6m$ewL2GW89RYBS'{sϏ;qxjcDkz ApH x43֎O ^f$OIkr[i3Mrg/Ɩn%0DI$3I?NVCee'M8V{rN~yiCJ}Lg`M^ξN XuoJQyq__WXP@NyC۸V !jWmǢ~?κ`}zi7,\07}+'KwOdJyޔ.^r iP{n8@:zJY %;)j{ƵM|l}`XGjϝi ć <7#>ˆhx ҌQfA7,2ŠΉ'D  &9R\ r^› RFrj5`r&0i̎?0岢tO1wZtq=Ӊ@P]lY2 0` gSGV6vTW5vs=1b7wo%~8}!oϙ5>~rz`YwK,76.&gaX<柼`n߿ *p T@QdۉsfM6Ni@|n$s LQP,(bF/12F ^R;B=`-qN3-? &MHĥK@\ff?4O?AYjM98rGzW~߼Kwq!Zoǖzڽ<7ڎ"eYhK|O2ˮK}j;P*,ORLD}ǯlo G]*KSȃD2*(hUOg~|B{Ι칕O%/Xt!Iɳk7nil:߭CAB\_ yG!ʘJyV斏5F^sX]sDESA%X#w?÷]1 `mo+{zwç*;ӫ8S91&)]{tedq$GiB;[r,+hЃ s)7/lC'`.ms27o(,$.+9}й(b&(txO%؅RM=u`7 YTMO8&WXzN%fVFֽn9tE 2i 8Q*GRㆹn^ٷUMD~-ql׮ #0!)"FG&l&-!W"&p oxvboFF%afAO z"V)cR!d5H{]X|.Ԑ\ hE3?@R 27 a1x%F:4vz+gW-^:S*Ǧ=n2-{L p%`RH''$u!3*-T׶W ?>tsHFD~|8@d Ҁ"Os/bѫQ-N$Y{`13Y喂]4;AUhXp5jd~( ǢBrZ e`qcir(|J,:ph ѽqYj $ypJo.Kl:-dx0m2~Ad@\-\Bw(a,NM2&Y&kqW3IZ'or B$+W(/"ܳoT) :q MP\:f 5`7sM'3IΗ)' ^T(XНh:w$jїܙl;gc7rgDW6[-5 F]bGJL\ M&؟!e|nkrX[YB &k7fi(O-\00T]T'PѐkCd|d/#{f{NSz03aK[?d&-ɵR~1 9?M83XKRXf#J̀-ƴC[Sِg4H GB$f@0Ir àRLnM&w+OnYXݿ[&x|psմ2B:ȠXՌ:x~heU)\& +ڧxΗ ԸN eY5b8hZv'{]e~S⮚w6iNwG;gX7s 7]_Pib<13V594@$kK6#ݼ763 fX%Hm<ōF[Qڕ](i %t+U DO]=zId& awȏ89E)A>B+.E2b^ vsPL3 dO2izb>jlXM#B2RoMxn,AQBPî|!? 9o13.M8(OD߶ 6gvƘG\ ;t.@0g7\i*2D2&9yIMdsJዬ #?3M?bJA-?.؄A-хQ5l nJ2S  zv$a.Muv%YaV>F.F ,է#? &`ggL!K 8\ZA XO8"v[od;{%H p 0{qL&9`C ؈ZPgev&_^kT W&M;ֱ -[; e1ó@CV1MAGhfR "9SVE kN|7kbЊp4Dhbab}PбSܡ¬f6a|B24 [iy ͏ȏA@tU~-v!GYp@45&'c1YC] ΞvEYi<υrCT%bALl$L8 y#=?dYYN6co8v Lsh溅v7`5F ;PetC H$ؽQ"2?b 6f^uV3Uۃ V2iAMi @J(:HmyQ[urzڙ2fb )3Y̼S w3qwkK@|R$ ~dfҤ A!D|Ƹ#ANZTx)2Z{qK {~G~Uɐgl8Üճ$Yϗß&َ Y~C;wy23ݕΪo|X DʬUpsU0ҭ81M%H{&!r1֒%f=4@q.~x4ӥI-VN3mzV7JWE+q[p oEvPaf-]=^-gVYWvUXgoL& u,T{7Sff KL#rgȏ\K:v -;-D!/Tv!N6E={`''>&.~7ܽ%W4ݖn$7RVQ=u+DtJ_3ϖ%;45ŘCM<>3ro!Mf! @ ;g?\~w~8 u7NBv5s7K]/ʷz /3@mw+u-J1@C ]bb>,Ǔe{;jq U#%fe$ş֙}M4 0͈b՗I+<ە?Fu>6Ɯo9 t)Yq[*ͱ>DmLhCW6yǒ]4O.`!.s*ۉPTKtqYrՏkno+IM],ci~/kI WL]w͔0u}e4W6u%#o%|of6Ҭo6,=EǕn1ApY-+u_%8T}w;4cR<4{/j, tXI}ms$UBpdK>;~v=~ry7VG ?~q>٘F&?\I9`-yzgЮ^ z\\/W~կοfsfȳĞ?4۱CCfVcuȻ>1ċ)j%ir@cN>3!_6) Z:S.>k&~HGyn67'xGyӋi7^041O/ []Ԫk;]~4\0"VK?bqKR 5;zbLǕsSK3O(*qAb_@3c+՜<vzM KmG˗˔E9xsvk^ :ۯ7Q~LUmtBo5նzVarG3vkP#rQz)WU.Gl|ΜoJ~oaJTk sK]jXyx+&;͔YsDHSv @etkA}{wGn ۛEclvnUvts wVSV?shFeg:V˚\|Nozos|sLwa9o:{pP6i/е\g6/lz"W{RF/0ӆ)K+.JH$F2W/b<~hJ^Uifa=kcPhYݚZ_ <3NTud%}~wȾ3?!)3i`vkk Ruq,Tqk3 fh͢gU o35!+7"Km߄ .2.wЀ}V|o,N|8^]~/?饖Stqum?~&7W޵45A;q,v4}xyf y~\mɛzޛr.Knq?=7J@xyiFB3JwK"91ZZ|xwVg͈ؓ<3"_Jc9W.ņov&^f3)o] LI}eڷ)?|eZUGk1|s.:ZUѼhf7FzbEeS-h?4m8Mr7cfJ%勳^ ;75c:x$5k4X3Uއq$GWTƛu&7Ыloј6&!L/MqLܥɐ)TCvr@Tӂ."R{P*J3Kem>{tsbGO=_*7ɕ| eH3^J85]|:fnf&RݓgAt76!:W1Kb|6'T[HGOHvj1k4$CYΞfΗ5ym*T7l_S[UQo-R̓bdKؒ7e_, TCT)cLof?UH TIoLe5ścl8cǵߕTkln)N0q+3 {J2=ӅnYgo&~C_\f>̜4bB4Ǧh4Z2}<3sl>ݚmޘYĒZ6L3̶ ×&b9n!< Ty0M) =|.եӚl[5^||Tfj&:t7Y (:l>7'Ϟ"[@3FB{&{;gfS](ؘzQ2Օgm:_/uK]^)ENz9vMpXO*V4 <>On'b/qe6&Uխi|a1 PrDcO];^u1ftK\yRUgFa&x鹹7v*Ru&C>^] )@yGgzSlU)/Ώ_g[orp#eQz焙45䜝`M[mn7監1RIyMGv[jK*1paY%V7̎\y}Jyɋ@=?~cvļH0KSsoj75۷ z75xS y%سCќ %E F{M_o{J2fwxq=ㆽ2oN4oջiQ3^H4533Co1$ѥfdXfp}!o=|.1Mn~`T;a& NjZ&AC!ȅJ8CrQ_~?ߓ/;nKCM,.b-g*%\nhs2/Y͵I[WVFjxOq?TϣB{txs0Y0<}g_oWh~oҔ$n,z.~U t\\"eo̧\KG9:{#Mo.4CYҨQɯތnM iO7<%|7ICڪ|lu.˱CAVvkEE dLirהL:0SneЕޔf8@7:W?7L&ބ_;jwL]5tƒ,,/':dF]: _Ta0{%A2.7u51sBM oprڟov\MMµVc:I%fO4ԉY[}^9{Tv) (=putbL[75}^c1޳ B&&[3f[ooM\~q|LnT/zz!?<*%=k<7߫7]EY j 9{i2hqT{3458|CRdtD|@~q[)3|)6UUf}9D=Uh=ݙByuGT]ϡ$g905sǛEM<7Ia[zs]S2t8MĜu>OR)7{0Ȉ;Rs?}:fvs,~cOP䱓4JhR5eX =cgϵg]0L[s1NKmOKy}tf>y)oMhMSØgzŽMFզmBXrc]ho>U.7wAy9isK ۨd}K9vᗅȏ,|2+HS_#t1OfԱOskom|h7ʶO[/v[>uE9iGgM] esÓ8۫u\|/L {xM}HiV)(&Wf蓳+^ M?|!;S `/_Oͯ_D{v뙈2=j瘶c|0fMo4%;BQc7mC6l̜8#fop>/gt89[6{g ߌ,Tv KĘ48}fZ}. av\Db:4'ozMfk|v;nJ&p45 6~]\"ڕ4/7X`L%=?śtor 7-uWm,yӅ" ?ICAW>/}ElE7l?R]o nk|2f`˄1>Hs<9۱ssћbp6J^og|9_퍹]Xѭzz>;βMZxsnwWLzFZĕZyc|@giБm9:77ùMRWp3̾^ܕ8i ntnoϽ:W{;_jܻ{'z&iF4|K} [oZv$lnt@s7sqTśAGc^YěYXěv_m/||]ӫ:n=_o{;wܾɝ۷njBrˡ,W~Fuumt}nWBYD.1&"iZdinrM'4yF*)7gfflu:o!5z[k;[yٞYVh+O'}?ηmjוئ;+e39xػ^x\3/V.{3rɛ÷Oכ4%1goUHsH1xfˇX?~g6eq4ۀa3tgW856syھ{$ĘZi 7Sb^{edx*v ӌ埾\c^:mȇO?Z2ƻ.|Vz$B̴h^P܊//{bLLS7,ֈz9xrLӊ48ײ^}\}Pن!G)f@f)t9Ȧʕ.g̥c|Ҕk@f/wޔоuLo[҅Oxts`s1Yr\Sz . 0>ܟJF. B}fz~Hqӷ3C v73s9~4(3|۰4g2YRfyS)3/q q14==Sl3t)FpqCV;a-~nG7}x闍f"U_ҥ%&G.LZtlKyS<ݩ7ѯ6+wqmt7u1 ítcJ11iVJux4% wwҝwmful:r1gu11w1e.=?1ҔlizVޔy. 0>Zij YE&I?׻s?2c1AL޸2+,Ř1=MYV!t K37]:iSԩln%fC2>In|0-4%t4u.T K{Ά'HzS)'xѶ|s}כnOksy9JSio713Yh9\lOY>ZK<=O.7O<͓}kc4i&]jyc15]3LWg2s\u1?ZK45iZ]LrLݡ̛:V7Oy}KK7Shʽ/ǿ_L8s hY0Gc)ĕ?|ɛRqƸ2.mtcvQEcjoy%y(Vq?s]{.Lme$Swk̓%_m,u9M/.w5>/KPkWU)ޔiEnmg,\i?]nZl(7>Fi$ɌxSwoǺ(ZIݜ.լi~L{7;S~{c6"JS1}fN7,/zi)K}zc" ʡ>+}v_Nw4O3mjms$t].ڌ(t1}>aو\\rcVˮdbbLxfn*uK9]r}1&Ffs RhJ1ན::,@M]"\jI7syl0%?/%|ao.%ZhKLyX2JGq 4e.ҔFs|]!vada:|>`isٺ.\ׅ]bL"%;~ieh+%M9Xa SSu\ ?Qitt, ?ii"G7 M4Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&@Hi M 4&o@Hi M[4&@Hi M 4&}6.IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/header_minimal.png0000644000076500000000000001403713231531251022172 0ustar devwheel00000000000000PNG  IHDRPd AtEXtSoftwareAdobe ImageReadyqe<IDATx\K$U>ff0A [266,l"ذ`EOXdŎ&2-, c=HK4GVf{Gެ̪n)쬪w00FS?y:ggbſ|cDW]_| ~%{Óo$G2Iy>/ntПoڿr]@!scp9`6w T@<%9՘zW_XA}EtnH&ڟkDUKj>PH|/B*Anx{%]sHGe7[]Xӗo/YƸ Ç/2D&[{zhWPG~%6hEU/CLOJsl9af̭ũ%b8Łb;ЉWj}+,n%sߘeg$nU"ћ ܺ'LC g%1%V,`*4j ؓ]UgZ 7wE Oh[olOYvWTְψ_Ͼ{GUϜ*V͎iLbI)N'#w[[EjkgEߕ>Y<z~0NY~j5P%ݙ.0?u;@CȰbգ-TT``<K;QZ*I}z~1鬷~+۽nq c!_>F߹3Ak}^{6[u5blԵ0PeE݋P"*\a38fNNڑ[1Γ3H"j%+g?2|$9ӛ`쓑DcNSN:uxym"fa72,T"IeO bR, lҝ^[4ϨI{y^:M`6w^GԍS&5Ë#D]*sjkó[:b"]Q 4u]VZai}o(G>:Em#֙4ť]{ ` .Nj.81MU{tsAޘ)?nG}M]Zi3 [|XȔYmB+%r+]+qN6LP t` m.; |ȒYot;CgN; \ېc;Nx⌃3 c]AzyNu 6x+mmV eiyv2˼]v^+>'RFw}IggVI}"2RW->,.p).ǡ-hå5G[w B =̮\iN WqOX|?F2nomsp8O:6DFn|pl,QWrX[z&vu^8BVd\>EH_FG6@)w ft{1<[pѪ/xy#cȈ]ggnX%OM;r-} rzO]=?̦&- = z'0<<@=&nh?i<^Ȉ {1/hE[0M[wS>-4TElQΌ]EqzvR.1s"8+α^dp8mg.wd[H}'Pn^s+B}Yč*}}~1,ҡUMpuҀ8Xegߍx\1bh 쬗΀W+$8f5)IGEuV0fl %EC&phJm^>FΜG M-b ]&'H8%lC`oB9Wճ2.]=q #|mvB  :P k0.%sx\SBȥ%Dgw31ث2p8YnlV`-*o2#G 6{Zoyʒ>0kP`w~r\bN +]%۫WwsGjfGRpi^n3_FفK5@ 'XחFX "!12 `ZؠX$ $ ŸS,70 Z$[Dr"=fڂOq8-8J*2N ZS3S6EvhzP%K,ѱ#gW<qP555>-!*إwةfrJ WoNiC e97.'׮VhtxM* b~`J83g%+<2/aUěpBP#G2+q\]8Vyˆa=sDT+:6qAxR s67іʍ-4q,̬H#Ekf>xhv럈,dHSڱfj00Ut-4جsˡaYz7A^UTJ/ތ+yΝ 7߀A+3sFz!8, zAG*vP!\V6*U3U[ޙ[aVz І&N+AP"AپDձh94jy%sqoꫫ-oCAKX*`)bцR/*$mg2yHjz$DoAM]Z)s uݣhrڭ <`VbVP#ֳOQw߂;0F X ,T.P\\P+J& 84X-5S/`c*NLCыM%tl2ŋT& \᫑vL']8ڧLsn\t sil'8ѵk[{c n -̹ی0_&R\rVakrCDUGV*ExÇ6WOXaL"vX'@aKh0oša ds"WxEф&6l#:#] Oވ% Ulkb3jd^кKـNW{PeJ=S!LZa,7sS2`0.EU@<B>&nKHE5W2fq `:04c&abJj <F6II)ȎM-&ǀ+Wa-*tY wbn6vX\ &E)Ѣ?a$4m`χq"3%S"%mEdZ7n-wPpAks>ʧ0rQ~-w]3f4d`5qhE<{KNԙN20A!!x\K\djaJޚa1z?&O [RtٖoaD`$J/̆X\lcgCMiGv͜a<#It|L^IQa0y"kC [*d{r:#yv!b?ʙ@%pDә%V O uR")ͿVѐH:2B[ 1RZIUl{U}%Uk$Zð?s($eh!PYwOO`_-,Odz4WZq/II܎szN](T(BY1KHy% _[\#|AVKq'~ '~ '(`Ž6IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/header_minimal@2x.png0000644000076500000000000004051413231531251022543 0ustar devwheel00000000000000PNG  IHDR }MtEXtSoftwareAdobe ImageReadyqe<@IDATx}W$u޹7L1=n  )(!*!>PBRH#dB"E$ @`!] vgvgǴw2=ʼ.5Uӳ쌚,_s?fcmyu>CƼ/˜ܑyΚ}+?Lo_?U—js:=,{PXp~^.QRFW"T/[ۢLfS f0\Z|垴X ޯX?^;{_[(55vG؛V GD-f0kǵ:3{ x1rvxkshK+9K] E)V3)_7~= Z`[{b~ٜ)ho;:9AY-XKm_<~h55daO>,>;vTPjZvG]V}JGbb@:,ǰmY3.[XZ<{-&0޼_=9VL\? L\\u;5_rSg./,տcsz*4~W?eb"d_:me͇_L"y-%ُZ % °'c~=‹F hr+(oD58WLH>?k;a/;Kͫ!ӗȸO=ֽ{PTBߥo|O%d ӵ g&/~Hjl)=B2U~(3|"6*'3ޘ1NW{e6ż[e+Uc×_녗S%rGO^>vW?ɖ/7[wZ\)!{Y 8OAi%/r Œ/u|{VMW|';ǯv]Vղx7g'_ϿrYwyOEt/ADr4&AңeTv}o~鵜IG >qroL5d^PRO*W}] }b 0F{_*ՐG˻;yu8[]<,dž쇘0h??-I%uW(;gO)l; [yͽÑIu{B/Mp a1sPجc'+BΜ&ƆRTD3\^ }3 <|Y lRK-\^|ß,#UH !owo߯+Х{/ZSOba,)ElLq fCrqɵ\uSËOܵeщa}~K97W݃w:]VqT?si~$AvHʃm AБB{J/hY{yZ! \P $ xƢH$`m9h~BM5WCu'Vd/w1~_HLYeR)2\77Āl$D/Sd[_xNQ/H6齠V;j,Y"" -XUy̅IP ~oTgL*`SW?w}(G:P@˻|ݝld ehx2SXIEa Dgkgg,־IEG{6:'Or?A6c5ٿ{GVsiIl彯zMSEjRI"g#)3DL6z>Ta ]aZVtHp%8;J8~AQ\52]ĵȚαڪjzЇr>#GE[+kaoRM٫ٯ}xș,{ښηob{ktavGi~m_궜O3B̗] (-;EpͬWAyDo1VTwzb|y'^!<*w Tt2#K.SNtg^M Օj5B-u].r^hl)zA\},xSH0' #rpkovWg|+sx]x:r;τŪ_&ޏ^_^n3IeSI zXᨖ]誛YK肹Kk\] u&T Yz K?)[[>2 LUuCag\7S'm_5pV{qIlqaN$^9U_VT .wWz~Y%k;i[G'?/D^s*@|u&OA;XeX6qU=W}O(Y~FJ.pg杞;CE |  7}Mr6Z| WW ߢRݐtQSY~ 3U[gpNuEX$x Llf]Y,r |9 CV w|Jnu39*ӧѲxHo>Ȥ7ͽh:3T\tekE;KT38o3I- D9wQ1'7\mV+5XɽHҫIN]vfOŃ ;4kV OGc^ܗۛdz+; tmFrA#^YzЍӾgqdEw KƄz֩UEr.rC01[d>ttQȐm z>VBwm(?\bCH+wۙ]Q:,!ڠrxwcO´6&D}Yccb1MMY -JnuRQѼwY+%m+waR 4F>Gy#zw_n/GEVgZpssxtP6QsVILzvn{Frpfv ĉbN7{'@A~Ai5Q.@ղ[fk}.̷ yRhҙ iPqS7L" Zp !KGKRh<OƍA" u0k 5ÖAk ʹsQm WI}*ryQe)Lņ,Jݴ ^k,*71Z{W>tl$-EtK Zc2|wmt4<@j"m2nKsXcg~0.KF߼-_Kj]NJ}*aU^K%))7g?V6{g90<-߁wL2J0t-dYv+;;{xYlqƌH/cS]H|G(`fV|qh1;uqcMb!b8ɗ6s'<r !;?oo=3-Xi2vǠ Dz/{ۈ݌,ss165af1ɨw`kːs`˾1cNٌ] kB2տQ>5WO%E+r7 %gw^ݓ_zmyi`9, lEļ+kO]ߺ) R;З50[nRAEN={*ysP) \B[1dFO s`=<*SБ ѠY"I!wnӉ9!^/_ebCMJT<22楉"z}yW.f7Ɲͮ~Cuj@$` 7}<^a.p P;?z(?(Xi5ki3񚥅 f@K +I޲_~;[dl~Ke9e|L8wy`nX:=ݫ[׭\v />-1C`;&N8^aˉ~MxsOhyل26Nʦ+KV1/>yeap*DO$& q4?$A !߄}-붋#3 $fZݪLB&+tY]!sӞ.{myA?T^ p E0x~u8=!yhV]&`@ +\r#fKq] sPސÇ([}EN""w[?Ǽ %R{Ѳ!gll#gPdpv+{w〤IOq5G$6 ?faЯ+z5Β_uؕ&ޏ*\H r%r3B҅5/>x_F#s%Rx&KӸ2߀|_ڍwp&t@P  q{^)pT‘}2]ZU|W.*yDܳ'9UNѕ:OݬC̆8[cra#Y˓ѐt%QlT 6q"V52%Y/[{a1 : I 3ze'ScyKp|c؝® S0kt+ҕzF\7~eX ꭎTC.i Booְ06T|3`Ӧ!Tvr bV"!FK9ƃ+GZ,m-Y-chcaO8)+6җឰ2־+uSJ7~u_EV@lmմ¡X9U6ym eU:V(KB'Avc~|y8X0߳JT?RY-HF*V\L4A_6k*.huv/ 0DM1h #(6\]g˗'`i`.$GifmrXaa1.̈́{~Jaoi VV,Ayp`GZ18ybwoHZA:HYz tH:2HhY)N4Ez6N@M a6 <u+֥j*/=9+\EJ)벎O eg{0SڷDYE+G/\깄Iz@F - 5)Ja`џ=5l'<* vt lMcsaTQZbw|:4@eV@,^ݶ=U !RZZ+iXa$W7g.{]D,Q73FFBH0H3<@t[R2 4d/#uMTW~LuMW_ JYtف[59k %&!4H:ewu+Ankif [9=!"_R0bsF&n_:xɾPt]ksZ-k+؜Mb!5KYu+Tnaw #ha0u%/< v7FԧI() ğ ŒbJG59_콭|U&*\/AQ[?7jPgJjgvtjfZ*aY閭 `('ҚZҚZTCf|]@ Kk߶Prup()d>VT|żq-mBw`_C_W`Ig$  e[>Y[mA.ºI4E5C.<(U* Jy-f;P_cXf=w$L -% TE)4YZ)%zc;= +ò?ĩTvIR3346P6u*a Awq*yB+߸S%B - LSlمM8Y"xqt0e) k.#+JucWA.[bk6f634dWt-CR;jECgZ&L6F5\Rn1&7d~;%xqs]RJX*N=xVmhn%q(;ЈZ|QC03AW#g4 aގ.[@` I8KG^!g'kd5(ѳv8/|zKЃaByQ~vǂ~5Fc25vȧ})\g=K؉HLb^rrЊ"i: @C ,8}z|`)`Ƽ[+d-SZ!. 96P,*De>GJ㢑` mMѬq|u~0i0J(WJނ,!p9/ m^؂\qdp2)祖$*jڰ44^oiAuXM]6TJD@23%*Xuiw.D ,ւ;|7iV[U3VEaFk!.Ԃ5a ]!XSxG+cMтgVV˓OZ[o+>AI-ɂI"Т5QBn9!ݒf3A!Fnd0HmWJ Ac)d7gLN댷W։]3o^WWrmݩ`뤂&z !S#Lfj˵ `EVo5;l3;&n>&߹Vߙ[CVv 5-7[}+N'dQɓeI6V-%1+}xr-kfK 4B@+F慚Oj<ēf.1ô]^clmB}rYBZi@!=U46X[FI=jc* bi[˞B *nU1g'e4 ?vxYHK*K{+&DmZFGm ;S>Y.%p:y z}>?-:5;AѾH/zG. 4KNl[{ʔ2 Ll۷֋(6'cJiP\8ҫ,kKк_gfvQX16-AmDgIcQi~ |^JSn) Aj!na1Hb7M,W+0kjᮣCZص]5@4 R֝Lu1 m09LK'<̓Z] v|ϰ5)8vGZ.UĒ{i PJP OTGF&y]: Z&SշytF.-:S#S+?;p+PŴq['|Foi7 TTSmZ{2YT#Zt,JZ⃦͋­ i1aI"VѶmIX-6ҳN(LAٞrl.O@ض@;Cj -o??i)uk3bы JM_׺G$i%$l" lX/[n,ՎƲ4߲డr]Ø}8V_7GfU%#.Ϗ,Oyǔoqlcys 9֢ͥ2 KOIXFZ t ҷx4Sf ^8Q ڦb#Kv=Ė v\ sSƳ,<-5`ַfNVE BuQ91zfǟ4TbgR+;>E/ ZFP%j7T\wdVUteJ $3 ~3FD̓M*н\|a/z@t2m 9wVwƕj O{1#K/& \h>u5~ȫ6h2 L/5_O.yi-#Y,l3N blnԓoae닯(B\1E4Cd`m@=d)i|_SX(:VA/LΈHQK:n)|?E`aXb`.5ϊHuSPehgpYKG6Y%r cgae~gK ֑D0bm;4+50rX&Sp;̋9b]v,FIKj`(a2$џhX)]K:xPG a(m:ѱɶ"liG#ӉOehgg*5_$!71k v6s's2P8^WCLvYm7]40HYS|#`؆ƬF= HKZ. z2D:3v8+])ϪyӡRÎ!5ĜtR(uQ^fQ-z ح&Q7;7PInX9xK.if:ƕ2 10pɢIdxFDd0o4ON) #gq<cO& 8还\՜bRT Q!-+Wa#3lW?Q7Y M>K$zCS.sn'SۜEƂ U}Z[E9O/Fњx͜\3jϭuR_ >2ߓt ђ:|OWF60Yb1oy97<(8z 6Q4Xo}9=Z::Y5ESoIqUl)HT>ؙ?9\\Oqa͂zMc{EB+E^8Q oA+p+6h(Zmw1†-3[w\+خ3 ׀QW֩ wf%qZԢQ~V!56vpҴ?!dr?m 5XJ7A#$N"]#ۛ`p1/ܭfz4% ^%:8]W2 _ۿ&CWIUn:/,BvL_A*fBG0Ocul8n1TIvV#SzE.jܫH䘏pWj8V#"gwGE I%0]17E(;>?CYE Ig;,2MJؔGCR+D< e0 WN+}9UWq^*W<?pАRjt.FjZɄ]b^z4sAÎ`o~de34. ngN;tsf' RcIr9Jdc0x);hHظ.ӚYS4/ѣ丨0^Ҧ(DTLH8ZLΈ񐣩uP~QMGd~Q<$K nѯ2`~A]?܏ar|Ol`+\8MFղ7lNRnmFQ`(QiebM ijIks< UZb{ 5! q ZiM}Ooj9 wZ|tNvnֶ Zم݅:"nõUOҹHBCljfS yI0H}TW_y$ U <}K̐\aSaʭ #niphގoofȕhe=W aV]ޕGWx+?1EŘanƶp,[H.1V"“hiIŗk?n1pHmW%s Аldsjq6SYʰ2:xFߵ!gia0FB`rƮʢةyKmW (\u!>re B]0}"x#$D Zr~T6 <]ѠMƏF΍4:zd.Jyx˙_乪XJHkLhAL1DLbXQsyt,w`A4ngXu1cf ƍd)]ipeب.nR-loR+0F5x M(zLtw EwMKyGz4J1#ycOd*j!`#4 YopZr5DS$0w-À~9\k:;X#~H]&,&l ryf6ŘxN'z#ʁڇ7*z .);awNjj/êm09p*"veh" XQC_XcN&UȰ:.f i/iZy;uõV^x +pcCik_{^! d1}QkWb&:>=fuƫk frߊΒ#m]RDiw1@U׳2+Jˢ. 2\ ߄؞ )dt!pɺS')y#Dƶ2Д8814-G5 @"V }[m؞hҭ[W!3Me-~Mcs2eyx )\e ] 1ʮgdD`_1V+ʑV6BBͣ++r,48b %PNF>2R)u1F[Y`J\1uTGޭ:OjiMZWh^)h}?\XZ[.yXI[.TPIyt4"H&  Ng, Jt. $ MS>֋z J1ݣM,/-Y1q() Y~ԪnE@T,wKy6s|Ilw4iM0@2x̎կ4Z`!+*!.5]ؗ4Z_ BV7nf6;`FDLs ùoޜHEX\[S]]5nk7a $&oKk9nm@ۯO|g֎zYEٕ$M 3ω5%Ftst1=4(6Kv,;5.W6$FM⏀qPc-Lr2}L hu nJf`JM/`SC1>C13gƌ/iB"8cyBgjŸT W훺gnuk@jmD"b{>4uM r`C`htZ[ a[>AUKzRV_B2J#~d9b]h·ݜޠIh(AAu#cѯdkj᫓wnjWY"ιuvr:4.&C?w\`h0bCX8hk @|g Z4Rkd׊FZEEL 62_'Nٞ o-{n 0[1fڬ5)V[Jڅg`$tdvi5"0bBcdF-ku d|rOZwkdFv"jǠKrTo/ 0mW@2O6cLnC1fT:ka3%=fv7f&hٕK"\Va'`&gEwC&~#gPjc;Hn~k2}[z:KF`8oRM.7,&hwc +EC"'(vޭb\ TR5 3:f.2t@6e׸I 9{͢}O_C"+,F4Y%j-.5iEcU@y$_N$pڵ"F3M 6+4'#o)vsϷsϷsϷsϷsϷsϷs>>>>>>>ߪ 0mF8IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/headericon.png0000644000076500000000000002305213231531251021332 0ustar devwheel00000000000000PNG  IHDRddpTtEXtSoftwareAdobe ImageReadyqe<%IDATx} $U㑏ʬzuUWW7 Mj@DQegqܝY8U!#28P8 :0hE UϪwfeef<7"n܈Gu5$܎Ȉ{' 쇼מѱznU!TI@U H d2mm $*rj|CtrJfmmύlڶQs'| zIҡũ]=_+U&yq6=xq_o&O<sǬ5^9RsGDW{>kѦf_H-Aܝ0l!!y'glG$;I Tz,Aq:㟑Ӊs-aC?ʰa}X'z.fo.rOB Ķ W囮Q:Oΐ挡ѓ2 }`s]:KZ_)Y nN{;Pjn =*mX!cRxC¹8A$ YN0 T{1rAxYtR>'} ?4޹g G zR ޞIH=.@c_d%9Q i۔4ūRo B]pɧ^ܻܽ?yid(P)ttt{w:lruis=O]L]6hՁ˷u#'8pH+NͽHW__4O[QAQV6&IWvB1߇ovKvik4< >( x磈9F?ԦҁkF/QI:m#mf@X=;lT3`C>E$&!qu8 sYڴvԶH 'qc.}D&_gq~fL=uxLWsM3NĈ x@0@0I9v gF'*d9VK\t=C4zy>|h p/*j2S?B&Zws)DmFs^M#:߬["K߅m//vwF%e( |@z?5(J"a ~t_UPBʫn/7tm@ѧ~o?%Åk>]N|熮޽LkgfrEMW;7u_1@:ueUhʕm $kT L:* ʉ'mKr/Pݴo]yLtm.7|^=0suimi==7O9KNħBWogӵ]\:͛%ׅ N3`5G ۊBG&!% $S">}HQTǤ:$^_mJ:~֗N6.kˇ't]K>J(hѷ~U9 "r[/QWv\@+x jE ؀@LHdJNSdI{n;Ң$^} t.t7I s+7D2Ka5kbN3^5z2 jX i7IYA~P[3, 1OEaÎ <@ϑP;C"c[j(_Ƣ,Պóu\tƞ6/ܸ8A+?%0s]K@h1I Hlټ "'4Z"檶iߞ+/b7^HxW5kECP\! B |,X(N)h6=7]cѶ9=c(s\'K63UԷ¿M)/Lks Z?ܸзU ϕe.stJ;Eح~D<2ĶUE g`OBR= &'|jXߖSQx3ʊ30ѵ=p3ʠ^ؘ-E6k{yԕ=5Z`p.z)p)9LE >@;$;O-P4Gڶtid8)ͬ=p-˅y;Gzҧyb4|xe@W]]+!`P>BQZ"jI oϧ^+Ab{DGoakVcw޺16z.Z^v{NtFUMf\ϧOpz9A V4vew=@ZӀִD Iq@&Υ V h5H-hIkt7cwzI?߼#@FlOUs+_ :A?)j;CP%2:Cc.:s:ֆ H$o^ |WQc S hj9k 3ͰB @@1QCq4%Jp5tGxR N<3R 0^Q+U ޚkr1 oOBW+Ӑjd3Y f[6GP0@1?$|AڃtI c2|"zN}.Aj$ٿa,FRFIF做gĭ2Kiۯ]D޸@Ԩ#aP\c$3mQL#Ӓ c% ]U"8*O:'_#gS0撠%8`8gJ ]`@穙bўo]mRNlڛ|nfqܥ'sqrMps)68+l7T"e%/Ig$sd׍cI*[z6li?dWL(a : )PW%XMS vK[\`?3&9 4CE.۞̝JR6J`VWY.Ofwf誦 iLRkB%^{4fq3C8C@ngfkMʈ̒!TE:fT@:bJB?/1XZZ a,L3tG+lO=v6ߜ:8sB\bJqpR{Z"y=\z) --o2޷a/{UrQ0uU%JS d1GMXR.S[^Q"5]DMBY bK6/gjH%i% Z"iԈԥ *DxnX=1X#A`KCԐ'0z,9M3j@4hHLtKDLo0g&!ok x|XQn%ku{jwBì̋ncMrd{ kem&pRQo8P_NqH|l!UX*è0TڛFA$-Cs p8Cy F' 5,V ѯ}r7ibj8&cN jPͦ$%oՎ.\x@!hi!&b 7\Bm4Sް8ep|s'`G3/?9DeMLt*vj2%e ~3d)TjF@%\wN f%T=F|JG}I *=m ޜI:DR-KthQfYj+ҷ+4QS+:)Pi̓ j<:8حC6 u,/\qA"`^K F%τ8Xv(Kg0h46MDν5a@%VZ72rHQZ"!!FH@zD{,u:4"stL@,ޟM t1GA-  )K& F$&U1钨ꅸh !u\RM~ZZ"zdْBvz 9+8_C>(+"q|hei.$` )W>e~1!XC9V7#m7VncEH84ehM Hծi6aVi(dig,Av y'(b"o8OMY=<.q?bڝ68eu:΀h2K`{C a`$@"2>wnkKG& F b >u@0E0)7_"-hU `{@!X/j"ucaYTnBWG,ap 6`fNMkcU"L[Y,2[Ӛ`s@`0޽59nU!2@1s,x\QYc77ɣu 4ڀm[+TvWez/qZ!E1>,\qCWMbBt:@0T-6 ƒ,41޵n,!5NWd%C+L` Kbr<Vڡ#+^0$@$(4EDW)6u{Ry3f$oo& ]{^x%Xi3kK^GDH{``A3P0˯]rU HMhG3U; 5DɒؾiOM! Hի! e) a= fp"7L¥=! 54a|W!F4OE@l\2P"="kk3} za!n%b\b":@j\@p,DpaBwW)@l\c)/G5fM2IP0e=7[P-q}\(> ^GC'09rn}ep0x<iJ |!=$h۫WMff:uW8b@+l yjq g|~ X,?ȱgT8ӅX/wL)K0A'dJ +Ƹ稜,ׂ V (#O ${C[~٨5 41\fA;@f-ҨǕRR(Il\e=n'1B>4׎/DDլ[\KlG5n8 (yo?n;h8X./oH DX۽MxDVQoE /4o(-5Y&{ݙC$Io9$ D, F{ gD1Ju.j!b1=w E D:G0KvS$`P5L1IB̙* hL27EVV_/wv W5뛫"4cVd-5"y86S gdn"gd'16KfR~tU zŐvdi)rԊㅙqy ]O}Yn 9ě=3T$EqZNLQ׿K6Iz^bؽpaP<(Lx*y ^ pӓ| ix9f=XhLk`0s$e(>o . s<: Ί `2_Q ƭ?uHѕ5.gN:f{I KlPLx3_8BK^?-'= ԙ9Kp0DGj7P0vC!r ~Es`,yWV?+p]pJS( /pȣԻZ]\⌨I!, Oڢ$+br F%bhܿ5}:r_#|]_cZq. J|)Li L_Uj^>BіU@< @96W{˩}a]4</vB<0gX5PGw k,m_Or%$:]r&vLf״im~U5u;+h`dvΨ !d8R',A ߡKG -;0џ2OKo|sfi[#eۻϕ#s͚6-kVCFZ.?n@ꍓ7ѭB$8Z9䒂ep@YeEnϙt:hQ'֯wPS{KjHjeزf2U^M,2#o 4&[jq@.ari(ĺTj.9kïB5e) -Ո?;Y "-~BP` C P4(8H\ ٯf^=OVe5)Քɪ :eqN4[]KR~`#hH(2<^gGF']/`ZC 䀸}R-1ZߟO$) CAKYp~Z=[4X%oɶ4>JZs]rY_y5# y?L-zpj]8PB@ʊFMIQ@&$hPBO( +ͨ !XZz]N3h!]j+_)ym ".S06Rs+ĦjQ*1i 4CAOɎ>=X_~A@] y? # Y\TM0C1 $, ^C00O$P`;ҐgG@S`|"5<(~H(Ճ?-]} ƔԻ"@bfb4"H|v2-ɘXMGB{J/kw 3m G&|';wÛțI7 77MJQh|TD: %@{{ 0I2FJIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/headericon@2x.png0000644000076500000000000006255613231531251021720 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<eIDATx $Gu.z"k޻{zvicd06ޮ5w 6;\M`f!K3#͢޻k8/"׈Ȉ̬櫩sN o"Cc3~/Jb/m! >B {Ɂe{}./?sakә}tRgqFjh'co{yB>BهPx1xyw_oܢ}ͫ쭸`O|w qhY5{jЪբ|uu3ΙJ~s5AҾ}nv\w@](ީQxTײ6Dg7GHCoi*%נ;!9cŮNfY=w8=w~y͹EVg#V=M(8UjP_=}yO;Q}F^hsWuoq>wXz{Ϸi5ߤ.-;Xۘ/\_庡2\uѼ 4G}`ea਱Mvo+$~n#FsaUYC}pT(qqrgOs^Ů(A$<(N:NξN5դC&PCK.Lځ+o~k ),Q~.~G+e?@Cxxh\"_7r0Lf=6AtƋGuS9Yƻ~8`/?gsG5"6!F!)_U☖P9YߊR[WY;CG(r`%}fW'_#{gp}Qc>f u: c9h9]24˦~hȏh\$?ھ_pOy䟱$B ,nVH 7H!={ܫk =nB0lr ]v3#0 ·VO~g=t"pDOYM0ZB'i ڃ惸>]WP< }OsE؝ .rgmVe)&w|p\+.L|Y,TF. ןo,o ;-8Zug6(9L3pԝah8CIdpy9OQTK{]r賩 XH:k}=lֹM:PAA 6$8y!p.A2L;Tђmعo~-E1k{KpFFcaE6~3Q{Z-^V^h5,yvbwo(5n#c9dgw #>[Zt}v/n KD"Q/uvӍ':3,) O &Rk B7thdcHd qCP/EH$Ho|wg<oD>x/ܧY*}R@CLO.߽r(̥\+ %]ʡW|^67n]Ve8֜qX'(spX'\ 1X5( ^:%ŗrC3t2@0)dBb0K "1D!^Q_ܿ窭BT+/1?{*cʿn2H}{vEܵp={~'B 1~w>wa+;21E8:KbY=<,&7Cjs$aVhG?@?n;3t|wi&H!ĐVI!5m]R7h(q}R* gM׈>嬽^z׶.VW w|NuQ_Ycw/:/Dn uc_F%>)ZB"nfNvԭ3 BRM2j r׵fc:qYYc5ƣ_-k $:)fAP$)Ofj_~+a{x[FH'B#$'kkt@рHtMJB\2xZǟ}O]*L6[o[dz٦ku|hfQ#0fFs?v_zA/rø  W̥dnaj޸ 1'%)HfA-97#7^zvtNrI)!H`̘i ,&8 1dHBrN'0l woOO3y#;_G/wLљ{|q9!PT,oYru UZB*E{չia98O.©=}o.'HUK|\cE&E#/R8u{d ԆFcf-Mt$usH<` f-q%VO/^v=ʧǫq✋c}O/ߵd˘cq^kW}=:2]87kO[6\5U#p}7&;W]t-evMP9"Turh+^-rf L/vF-Qҹ#p \3XT8>c p8>7}x~&܎)71 gS=ɔmuK|wZt/;g1p .+<[ǯ;F9jme: -_ CYܩM `Y:(J.4P3 Mڔ,Tr'JU,ŕ\[疧s!kX5 I…7o ܡ܎$?+jphv{i^ȴG5\p4A2jO~ޠ~*BO5 nKm:B4t5XkpUI[X:06Jt:#e8{,uQI>%?Ƕ݉O.8x֋ї-t޴e74ޠ\`}jGgg>g/rׄqD;~X߮m7>t'@Hr.7sFHS>ۗ$R h9:zTS5"tcD#Mj 45lA.PEbYa`K(*k.;6.O\{]ϡ6a$NH.g ܁So|CK+e]l s['~T/;ri Dz.rx?hWYܩu ~{(!)%Dh!7f|!mW !Ϩ\ɨ(Md`g>މT,T(|'|aD-{D3Oԏ޶z+C2^aRuQ8,1.} f&LyA7g_یBY5ƙ{nz_0d9d2f-$\iMAbF!nلP8"յ.ՖVu̵T-Bi2R{fhxT` u4gn;Тg9Kxø@=jqczÞEA,8TA=A ئ;rQYN,8,4@@5P ~&ǵtbĵ7 ?5 }9ʼ)yk|K)%dAEG> }U"Z{: <Xcz⼋~czF&,P(".6ŝƯ?◛և#5Oe5ѿg1ns*Hr$˔p3#!De IJAJ_[XQƒ:jP}2[;+.qJ<ϝܵ(l]mEuOgn[q.5g݀Ah:̭vey۽&0T1;$?TӃm^z rpl[>s1dWC^Il3tDd`1bc#-DerJ'~yEWN7\m`Kc 1O5~j38 l!RE0^!ẽO|*tXC}5EqRೣ8b7,K#Vxj}yP*n񩲵([t}c,@=0Jw]3_6i8<9~Usd%$Ю3OyRΏ>Լz~l$&$A!kv˖' ݐ UwK;$ ;^ڱ)XqK$]}ȹ }۞?G (N\o=;Q_zIǠ Й=k߳v\!*61JXWOG]J&{lXUg}s=dY$oN&1OpJ$-]b,S|!9&01CPeegsӗxs_9xM.3cw^xP!S:@JAPY7۞'OC!QLG[>C#Xv5>c $j$|ve-0?L AEtb=o\Rg%JzSU`5,;?h:ͫl5jաN5!/=[4Nib\cs-:=:=k`;A0 ݾޭwZxۛ \ɐم$xp F䋣,6X^9YW^/0P~m_]Mk/vb€MRÕ u[mFEh7/}e}Ze; Pϧt{xZy}ċ!k*y7OMB_071k,̵"nuxbk4|H W.c?Q7w?ՠY`6:a).O_.xH)?.7$فz0369G{C#[Y#QZn[ePh!jV=X6\𨾪mwZl>p'6sppt:Ցߘ>{GB\̄HTW˕@ etVܩ8sx!>0M<- , G%?b,H> uU1$bh̹hoxEӦܳ f:K5vPh&nq]Oi,;\o Sk9xscaS@!tg?s]mzn#zCG7g]+8{1ҳ{oB#0b 9]FjbHХfA߭ jL 2w,s& lc. v@6P\xc0YdS;?}AyMڵn:'F+~1"8N4µ?|GeP.twgRT8V`[ "_gpΰ~ϛ!-!BZL?] WB12HˍŢ&[ +uU;V/rBWΓv ܽ%MP#UoްB>.,p2ø\G%!s{2@ɱ=*0[uWPhڭ`/Yy4 B$3EM8U !iq Pn naFǟmD=W@-1(*L\e5?TޅE8q,<"d~%}9"&a>x =K\W ~v?ǵ_1Ӻ@ H&,ںyCy,AY$aGR1Z>>.o2,4ԃ|0GsD:;*́2_vm+nK(0+JkC" \i|N Nd"벅c#>ǷIT@#FR/1p*Z@cL U Yjn)gcؼuo5 gr])v~Yg|\f4vÂ|=,"l #ݢ|t  @m܁}[rDUC$E:Vw;:c;;׊#8jSw"p Pt ppke $Tw*$`\@a~8&H"ָ]$\[On)$7灐Za<{ 4gGy/4䗅ns`H]P/Bo?3lyO4o;H񕃹:*zNXq/ aUڙˬroEt%&jEU@\$/@ +M!:MiÕ62CHskE?.k>Mv~=mp/B5z_ Vr^ 7~i'\،-{da Vyp|Pqp T.V.ݲ"\B6Pޒ>ɹ Aa̮Z>@뻛RMuT$=9;R[&G!Aq |r4`IJk-Ci K5 VlA5 |{#\=^a/Y#rൗՈ^ p.B@0$d>UݬDɪ~R.eepG4a̝"WxcZ"?N*;Vm]vƒY9j2w>5 ϟBIʂFw:p N A۶=wC3xrznp<` F(DbP (zl$A 6!əpv:-j'U}P@L㹷Q'(qfCw1^'JFTc t\8'-o=Q!ch7D  /_(N6٥o=@׶B*T i$?!EgrHk'"kux: ZJMuvb܀E䕝Y7:DzZC]A/GTd= |wʁΰCXi /{"bLvD!=D,n%~{Qۇ'FrQ:g N^ [~Rr__g4S<dXX50<=7+2Ns0DK(@ Ҁ#<`# gy h)-3ق1F+f#p#ZviAзVl`d( Fy rPY>Y<|OE?3!|&`QJATڻg{w;F޽РXp=Iv}r:\\펩]P;"R:׌7mo9c>(G(6›ec㝧3КA oJ#չwe K7Q@v~3tu*K"k^ 4Fbm5[reE8YnTe1hGߵߐjY?6k#  9^dl/aAܭJae:1=m3@tY69~&ZdַcD]csI܎m۽*]:J3F 4fY9(UrFQq`/ZJMC̬JLoxc28\8mC T\˫)@Yuڭ0\7^~ ,}I gu)>dVzO9s[_ 7Ef=9%' \1Udhq?*٢x3kqD`nQN=+W[b1聃(RƥPQu.X$̩ (ahrJp+Mj"YCF*"$ifNa*idCPY'9)m>? L F&̥݉'ݽA˾gz3 ^WZ(N;х罋>(|Vp>l Vh7E@D>gEgooLL N*zE%ZgͲ^hX.x4^Ɉ.Վj2ĐI VOLRIB:DdPl04~4(֠"8Ru1%N?5xinUO`ZIWw)_qfKQ?{ nx|9'0K}4{KmS[z{[$ |* ,zn${[lz#Jg|PܺTR/@aNG9KWP^_T>#0l m"B@C5ֹUB(ĕ y < ]?)-.II/${\2F"+Wo9 HKS|Qc% g11?ܩ*Ɍu=[}#Rl#qqFĔHUBMcK@ĺE\7+ѮuθHދ+Ÿ!oY cҸՠ7|}s߬|ƣY/26_>1BDA)ICQ֞I.P yj􆟿05>H HcrX#EgC9gŘ7 }T|w+50oR.6 ?c;Z#Wފ+Њ",@Q*N ZFT.X 3fzcD:=۰r}rC0,EpHo]*V4iBp2х"HxCA""+W)Pbv޳uF\\G0=[ُLrܸiSUܭ9ЄxkܑݨrD=ACWpEb h1K`{nQԐo* f~ 'ETIͣCn?%_WShp4g*X~xyP!yRP4E̐"=;!A(Vzk3<H4ÕsTJ+W"ua!jeL~<{o]?U.įce1PVĸ\$GɆS%ڕX 1χ]+c+VOհFZb" u14P <Ԉp0 3 aDRGfeW)(sð17M []/^C0zsik ÿFS!^ts2Xڀ?A 1ePg-Cw|j?ֺ2M{R*,h O((ob5ʝQg ~ {`+"qh6p+\eE:AT}m}|seD(-}1%ET)1C9W͒2ei/ZcAA4$Pv9E DHor9 B;` \QR5뚻 0Mcj*H25F6 촶E!a+պw5G!uIw@RŴ?'aZ򮄃ղx4!g*g푦C6b}uϞjv`[] ?p@?Id\LIhc'υ,(16Q磧#'F VyI I,nuf/3)%C8:Opdc 1Dd$u4Y!qMq/ $͉ϕr-^B{i3<1v)9W цvȺdi-YLKšȣy؅a]QH`QB 8xf a*i%*ʣ c|@ςu}=9>e/BQ%ρ%s)*EeA!&"#Yڬ7j,; X4K5Ä&B r%AFOdJO(SsڹbA#$/c{%{B~4:\ޟs旃6 cO>S~O<鄴.jWȦK &Vs'|?`1Nm5"=Ctdk|6*)9O9 okt#C Z+$ewFX(tMt_h]S\JFtn .Ix$Ah!99$N7ςkg$m6ww,2ckx`܂{X`DCTEmƠ6dW{CuZ #&R?v bs= C9y8$m%J8wƿ;t7`ZS BDAQ%U .< $U~ֶ52^dskgAFL g 0`ENZ"Y{8VRx9nrqJȃHn%)alؑL%ͥ2"ubnKaʇu=AgG7-")WX1B;wJfXdGtǠbD` TJ!*l D<@\qbTDЃHzTqR"7n" $7~A0 Fp63$ru ]%#rg@CTT/7,ZÕ4 eY,<0/$DNo](J- H̟0kۘl*C]QtMb\P_%fhj 3sa(Gf~8@ՖIBE$Shµ`SSVM kLsWRcaܽ`Qt|W .k![J<{ dA5`qJ(VԐQ:8ȥB`7/kZ+$*_[3=}LvrQW*[@I9&2ej0 &6N1Ŷ_Dl]O{xe*@"TF]f ]D ^FCtE.'VZW4YQ?wC[˄rD> JjD2×}cJSA[DDy}M}iG.w;t~fH6AWӓ gSV%R KW^`XrM쒨$eg`7>7Ң4&|P:ۜμ bg0F9"se "2#(10V4Ӄh WhzSIUDpȓLI|J.&-'(muGFf yQ4O1^tE::$ȇ@r![@O![)[;l59XL @"mMhW7ŎK,JXi^4 ']RD[!Wu5dӸ_`&Qԉe-ߍ"TBv$9:,]$5R6Zuw<*#W"ȍBC'YY@2i6>ij^0\Mb^񺱆X̠v$n:C$uQ4 KlHh`Dx؃p%WES^:J Tx]: T'e.>~8Ld w3)&|gg !*R sAW*m!eep AjV& +j `.7zӕKuUA$!\&8TZ4]wLn l_weZV> +*n_%BDHD qY@/s<' ! ,ˆKѨ"O VJuߠDa$AJ &&RTFt{?Mk~ޣ+z lа䄺nVm]34(Q Jma66G$X ,33q/o),A2~RG;ff~0QhW^E&:Ʊky$$ cj١#x[lDIqKPˑ$uzk<Q'-s2`Q eAxǓ6bl)Gm t,![a$Ď+8w\-Q؋"5]7K;rKTS&Qs,aԋ|:Ȗ^ ,A^sxj{|v0L>a0_0&#!LC6!?#q'mAuA rGa 13?P_Q꜒b޼(`”Xw"IH5=K.z6)}A_]Vr.X(@D@ QpԢEt& 8LZ(F M4,ɗZ}\G6F\mäGtkF+0`n&}'Mܘ20AIJv8QeA"MhA5 ] <ƐuIAG +bXd'TRöH2JWʣ)wN0kIǣ6Z[&oJ!އsĢX)G1(GЏ,a-ԩ,&5.-P>BM$ (@}B~޶TrO3t]׳oV`5͒p<1q\,V\ % 9k8)W!dL1.eY~ bD"+:%ֱUhX 6,XKhw@H>>:|+pdɇ$fHl>SPJH$!Q~(!LtxXɉCV&BI,Q5l!4r(@B/aj-U.%@dtv~rPlCЫ&z &,5)I3r;1gu8^4 XZV:(b?`N+Rb L` UfhI8K| cx[:@_EĤI>YBˉt5Dw|^"ONӀW)dTc}p]ON%TGݥ7m$hJ1Ζ ic ¼b]\Ȝ``$pC58CLA_+2NҙeMVuV㕵hXfYTWHkgBjaS[ vYs!I\a$4LA*_KhPbU_g~K|FOhRNbFG;[:t,GtMXLCQ\cm|@[BY$ԠM3;+a uHc}u)-1KU4 FMO3DpEڭ`=*KBz 3xJ(5C=0s]h7̑y=AQP !Lp(IT2qѐL:}PFr.g=XZx[$* "Y$\rmId@3)5uC9g EAP W<{>su@_hu+Gs3qRhOF˹=Mn6M$<ب}>Xe *^R2+%۸Y`v/"@9;T .wR`Tķf$56^;k%mq7^j.\pd)/=](GD .y$T!wR* muWJ Oa~KIBgGϽkW-@ۭ LN=Zel 'E:̹rsJ2QdYuJ _eɹġ:GD9!\[Tk{jrʹܲvkVA1Ҟcf_ںgs=xgiĺaK&IkDAZ*0V4pk X—g::p +j_WGP8cza]{񙁐ˠiZ#m>NjZ~eˬY] ˅6k,M%7:ϔGD*tt@.h%Keh9cmp8\meFqp>U,QBVRb䊄e(;lX+ss;}C@ӒL„y!db^e'ڞ{_|GZHb,,]+{(",dPH@TNIV9%v@Qg\uw.%{/5%2n[ADZ5;W (-Crc ).&JCir 0-5[båhX5nE'M@륋a*|E׷ʅ,eX92Urv,S_9iT0!U;"3F}K~H,:4F}bږL0]_ѪL| Ki럣E1eQՏ&K!ɶI1gRoo-|1f!dq@Xt^a=A%@AU,)x&NЊ\xH:~lu/s{Z[;צZCW>2F۵[?8xltdyIխO-WFeH`6j/j B?d,^%HKvVh|Ð 0EHb/){([^WrD$ D%o9¤)qR(z$B;A^tga/\6mR; Ow8Cv VG;PU t4b52jn4*UkCidNHS)$inX>"DB0r,Ẹ*в](Q8V eV. *JS RHP[1ɝwa.w=H1ߥ;{@ģǜ-hWF1w8L?<\Y%;R)K` Hi#u6M.&qč^M QE a0O@c?xNs>{@*{dYXdYu8õڠXA}}*-M҃Dmd H^v"g-+;̵"[jy aLۋ+N>LBSf?g*:A WPd֭?8 ;86:],$bD,')fJ<] ?rC7k.3\`~e1`ncj Nk=Q=a(9&Ha =d#-pg A Gh#fڑwqɋ 9;e1M6Wpe *{.*/zc/-ۤ' =$Mfe´=fGʐ!e'"T8ƁR+[W.[80lSr`Z8s=;eu6&{^e>- b,|.ҝ a,V`d=kٕ:8Xj@AD Qʙ@aAPI ZPo\c^yN9({nE5U :;(s_+e{W;"Pd[fw vpc%!'ѫ_+86Y_,1K /"H"EL^8u7̜pq.kԛusfV-u Ůz*z+0WfBD (UC5TgH:eFplAtdHfTj kYc }ػ>\ /<:[8Hݫ|=PZUAI 5Gi8wHƠ`MMeöuF.Zmy O+$Qvv[ .*t*=r/^w=x ̍rO\/(5 tcPXef {dڄEy@VqK䓤*h)|=r U'e˵ҸXI Xo/ >c-<<I'#t讏/+-Яlw-χS3w tõGaɖf/TG_ PZԢu.װ> 0QXg<ܪ iӵ}^BisiE@sVG<:pb ld2  ㈾{g /aak[GO}Nؒ@\2oC3~L,0uoK8Cb/8byA`;3o7vt$ϧ6DZi3K|eL] ƕ`XK {8[e鲦H~Ȟ[[?LwmΞTgmpKgU/bixxH>6M &rc 7>رl]<@DgIL;+te>zG{:}ϭ:T "%՘m | Gbq]'8\+?J8-6m7Ѯϣ:G3u TٙN΄K tޙrw!xCn!S(`1TV-ܟ^kF./8\L p >Yudi<k 8qP@!#$WH ΓkPי!2I{6;/pPD~H|B !k[Sč11TQW<@\?HzC/jRh5A\ht {0MY+b{Z\pDg̯ڈ@@-k=ДHjz[Rяu?poV `}ݩW|hPKep}K4po߀ !EUs$Xo:̳~18GmSfd^@Eh?Gnk0%@]x=!=Gn;k-/V#_(x7GGnN#@Ø#k<GnGn~anSq~ΓIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/0000755000076500000000000000000013242313606017640 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/0000755000076500000000000000000013242313606020411 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/back.png0000644000076500000000000000025212665102054022017 0ustar devwheel00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<LIDATxb9s&`-,=BH R`bf(f j`¢&€0=b| a&,j`, 3QpAB `dx@!^IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/play@2x.png0000644000076500000000000000034112665102054022435 0ustar devwheel00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxڬ 0 ;b.m;)P(!I-Rk=6vxC̃)̎=!qw20Ԭ^}PP hByd)hNA_i(s0IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/record.png0000644000076500000000000000033412665102054022376 0ustar devwheel00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<~IDATxb9s&qCg8LP >~@, ~P BI- HΆ `ƣ$R@01A /,Ha ţ$W < ArG`nb /xT $`pIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/record@2x.png0000644000076500000000000000055112665102054022751 0ustar devwheel00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe< IDATxb9s& ~@@l7x oY2`a3( >qP MCa:0-e`1' p .e BR2 T0Pd@oo&h2(AE ~ |AE , V"VqA@)mʠ.EJ2)V|JV փH!T_|%6@h=Bت,1ʉ(IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/record_outline.png0000644000076500000000000000043712665102054024141 0ustar devwheel00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<IDATxڌP @JN:uQE<+^ޘ`D{V0 I-p7 Ujw^h:>;bXґnBU%!ʧpDS4ӆqX0E* ÙQk=ʂ#,mۢ>Dg1Yf0dӅI`IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/record_outline@2x.png0000644000076500000000000000102512665102054024505 0ustar devwheel00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxڤUKA)DL&AA!AvGO AxOBASA<,}ok7z}ߛ̷;f) ψ}S#n&jURT#0xFVX'6"8mPhBL&.D&qi-z ZDwL@`.pXg=dBz=0o0Ca/CYe~#wte\\,\JHHkCW"Hh4ʥwt%L4xJ6x|m<2t3]-J"NoyoŢ( ?v|ޭwCWWGM*b>Oک/;]4`1}TOf"5u>&Ү@5{2| 0{6IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/skip.png0000644000076500000000000000030212665102054022061 0ustar devwheel00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<dIDATxb9s >€?`b{ > hG`(uL :&*x:&€IRǂGh*8H@Xm 6b T5 v;&(IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/skip@2x.png0000644000076500000000000000037512665102054022445 0ustar devwheel00000000000000PNG  IHDR,tEXtSoftwareAdobe ImageReadyqe<IDATxԕK kX&^̋pKY@BA>)Mނt§LZ띈6CBp6-h=[5j"?4V,ⱀǔcAS Ҧ!kviSq_(5]DKM%)&,Z4B-"N"IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/spin_down.png0000644000076500000000000000032013013112273023103 0ustar devwheel00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<rIDATxb9s&1 7xHacH. QX ď)@|"dA/Bi$4)H|,A On,>#Ƨ6b:@ ǡTIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/spin_down@2x.png0000644000076500000000000000044613013112273023466 0ustar devwheel00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxڬ 0 E(2 B(4*+M/GH!8ro1*'+, 'l[x> ?t=gjC3ylifO9N{*{O]Rn.; 9 :sn~\SnSn+n8EO[J Rɪ|FGY9}sIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/spin_up.png0000644000076500000000000000032013013112273022560 0ustar devwheel00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<rIDATxb9s&1 ?4>ObF _p IJ@,-6\$~T a xf@ tcT=xBV&/y(Pϣ IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/10x10/spin_up@2x.png0000644000076500000000000000044213013112273023137 0ustar devwheel00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxڬ[0E7 QkDv ?kqW) ^iOrLd'5"'TdmxDYk6p^wwΎSrOs.Jj8NsTiտ Kw]FvQiPyˍP&nҌs(7i9qsPZ7 pu3_'7qugq DIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/128x128/0000755000076500000000000000000013242313606020575 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/128x128/displaycal-3dlut-maker.png0000644000076500000000000002326013230230666025562 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<&RIDATx #y߿ X {;񡥎_e+b$ZqUTrIΥREGTIJI&URv-9ĉd2%1XQDGX푧qZ`Xf:_ 0nfJ}73o~|Q˟w6 Wo: or+_ _>XC.@ XchO)?W=GCx}vZWz0g^aE #K.Gz-|e[?axy:{B:(C;>OLL_vuxI>ΉO=B{S_3?}&6) 83y='<!B8Q ߅mhV^/+V?E~)G_t3a[Mא_C~_^|?14O ?䑏/#bM.H wd2r%u4:=ZcZiVWX\'Xx:ea48VT 1 IO#+ķ_E~sdԪ*oR%C.Q0ܝI O#NZ_}g$/'ɟFd/0ɓć]1{LSr'J!79)(^ؼ7N_7zB7WD~#p|CCoB'GfQ ۽No!%B$C?4/O;c)~!$ l#?쁯 l 78xd 4q|S`_?0ˁg OݤXZn6W\/w;;_Yn(@JPa|s.ƇO/v!(;&G6 _d-ck9ehI RvDt(HMқ]aw6CQhEЦl7J&owT~8Ll'PӻPF7Y@zu??|&iͲ|Qoo v|+ռk\"qU@jmA |A  ͣ9|$С4k7>p"qW?z%A;οnH>GO!a%k!_A+y?Щ=gblz3\+])n‡pw=xHD_/5TE)s_ܘ7=@$/!)nXnо~FfFںqQtTnKw׍0aM> XFyħ x_Y?=s"(8zkIL,Al/W) sA6MU|lOу]4p#0(تv](*~.wߋO27_KK'_WZ49;XOnI4im6, @|[|uVhaCtl^(G? G_A3sXR8TգSa:԰m5*PBZSfd5a߾pբ,'DtaMc^!R+s6&"oiP-ʢz(h|lk}'}^M|vcU]4| +\T">e(p͡MOr@Jq7QD/.ûd*^A#V/nxbRp:>O:E&YToi+ӻ{_ şu+^A.DA="vQ>ϢzK'ON=X7Okܹ6n7o216&&rNup|z'?Ypi|ub6:TC=t=@f#v _ A/xȻӒl]*گNKK&}WcW<{;xo4UK6p(|-׌@kiL2n\X 66ƻT1mt X qk,no複d|uiG/Q="@q+abk".Q=>F7-acZgZ0tkqQQ c7 bDP*y`x𣅱QIn ^PhV4 $nܔ^fEM*Sa'@>0/ r73K"M)O#eϢzj-th#(}>|+CFfTO!;J(F m~JUSi@' >Sp'#( v1S ?)8"?Ο]K2-jdۇQ>̍WMF7q ̵Z\7 <@,"X!_FƷ xŐ|O!k[ks$_U/s?&ww0?]MĕJjM H^^1@`E~n5B’_F~•ȟG >#NYɬ~BH-:z!}`S %W (y7b9ǎ>'Nx2ʝ&(XA*~(;XWm䷚6 ^|*7Ϣz0Žj景zSY( s&{&32 dq% Ģj~a:ke*PMrQ-&LXL=M#?:ȯ"Tu-Q5cԁigCDb8TEzo*ڢzuxݻjTQ=|/yco__~=yޫV QQ^e^*,[#~wTofqл2j!z2ՓAz~\B!nARFu Ŋ}# lqKT z|<[T@. 冺+,'_eoD뫲uW*!MBV]݀J?{TI'\eX2D4zXʗgU:G"I4]d0pA;}߻de g+Ʊ oEMRk2!yFbB zoD0BH(#,ti&TU8YeA0hn5?@fħX3˯ /o#r<^Hnϟ}œAݍ%0/k/OND:=нf߽0:@Fe^}Ԅ$*~+v:lJ]Ϩ hQ-22P#luV$dLj+HZjjϢji< k`;O0^`d@.G6 P?vz^AHBg6z"0}675; * sT\t $;XJBQ{F6&: d!?ow;uQ=' 鴁4[@d?_1 wՊM`f_NP0 :2ga`\hʧ+sQ5_糨^RT@!D?(6V|:L_t W>Db :bϧ.a@xmįAވ!G8Of6V7`ev̶VW@"SF zqQ?k_HKZ ,tqbORVdRPſ* =u,L¾\VD %/~Uw<ra66}}(Z F@=ZfMebnB5yEpHOŽם_nt4H)ggzuf匯FPF~yg'Ϟ\qee=įnVl,H3O;)#>Ȟ7G1m!|7v~@ c4_hΏ-\."խ*X<SiK]֐/#?y2ԩS055d Rc)-jKؔ+7OK[g:-4˰zoM \G~̐*W ׵\"hg'L[^?={n9j~Z-<|pD]A>i[X{9l]9qu9ٖ2(>I|x,X4qTӓHiC~`hX3 $%R|Q3O/Is|b ,'@~*ej  I_N#?,;+?w~/gSWc!*g2%97 E.-d2],1?7 #na pQ=%ȏHM6@.!?V<+{&|þe 3تp0s~8A_B)䳨f? FhRo,?ǃ6bֻ T?x 7062o 0ȟͱI}5?'IqKv ͔43G| S`mro|9>` {|)o&7yB:sΡhAu,&ȭ:@o :Y &@'E|SB~>D~|{p ^u2NA5?@i Ȥ/lXCEC43"?1_f2+/|Ex}x*Ynb+uXO􉽮!SI%t ~}]<4B@zTBVwF`4-FPdt}o.? V ZZ+æFA&֨FTm|poCmHڀڵ3,?H<>iG®Z~<6QY|H5̦Yg{[zSuyaiĒoF6kܱ^_.F@|d*‡!( A";ނӉ d6Fg6gVV|56s}> a9i~'=8Rq@x?xN:aD];Du4qm(&{^P{L'.Q}JU"&'!JAk,ϧz`R Ow(؉/ ? c[F>r·kCL|S<^ԥaY{z{; (]'sm=?oOv |1?i6&GQ?߇9?,y>Ŗl}{g2`-epYzU l&cK-_F`Ub1DδL%ū,?@>p|_N"?TLGk>|dpF>V%ΟE{(ĥhϏ3O"gxT<pp<.mX Ӈ)]7\[B2?7@>˔$O7e 0$`F "?Ο  PZVT1~G=3wܱ df|*1&m 9/!YTO¿1GGi+ƻf__vmk~}( ^F&kћ Tno|6æk?3ʥ7N򠻆uϦaU)_h:qRs;x/]7<#_.F@v7 rpŐ!^N|uiTOVyp-M[nqT;mlE 5/>Og: 0AKkO_mYO񅶲oC~EkG1B@B@|unXmcmuLSQ/a?9= 5}fc~=n,?Of2$Lk{!h~Ѐ2 b,>K`tNdsM#?:Z,UOQ5c؇w!,!/*lIJE.-OlQ=g"||w{Cmp4f__^N^wJab'y&_<;dRxaXsz6;!(K _Gs+?d~QM$Jj+]Q=} [y[[N3R40,Me`sϫ'tYw90d0_ɫur;0WH[WZ1pKD:(̥Չޓ[~/ǔxz^:~=;fQ;1?@3Vߋ?/윹?ֈ>|Ls`ٹ1(il]{})j֑4+'ټztor5[@BzTs;^wnUA-cg~z"|օ\.ВŇP\|,DWGP ݏc$F8n[Qcjar<:W7?53N`~'-(b_u:%7^;(MPў1-";۪_Z7^6ܓ+FnrG@n+rsyW}O xCnKo]D1UBHo}~5gAjw}[ןFy}ڕr6ʥeޅj8Qmi`t:6mEj hwDEw 8_~ ?N-Njvv*/>ߨoGG>xa r܎+g=>HO7e4R>55(k7WW/znt ,?0P~lWruތ&W; GRᐐA~[ȿ;Z}_RlH>>,?se"Mf[ƻ~Rn<~u`iF&@\g5jy m60١0{ yd>oFM~ 'Q-(" ye`n5`\9d/%p׍V5atEXtSoftwareAdobe ImageReadyqe<ELIDATx $Wu&zύjzт4`[Ya-c$Ɔc̀`3<B@BBZ[ת=39ƽތ*̛8g?Q?~u~ߟv{6i/"+z]c(G&q,@9=:LUj6Jרڋㅞ׫ϝ򁞄% c{ǵkU_L'o3xvqQXo&"E@bD$eu@Y{ "C-D؞3ϥ§Q|[=HnU=)ͪhg>WNC<q"92$huLhOaa!cT0XKyfNu : ٯ6Z$-$Ԛ"ah>&#41VޣDF=7[g8=fHL 9&nH1@̰gF͉9 dbQIX㏗7z T*I{ ^tIo-CtBQHZI&cB`O~< @=2cj)}\ e"fU"JNO&ވ*ƁqI_]Vl&fhXHZbM8@0 zrUϏ X_r~+2fMCBl8Sr'/H%B/y}qS{NE#jD1 Ϟі}z"l_ugjJ+<\yt`z JpE<bʿ2(7Tp g<Ҍu$MDmDRO* Hr:я'?t6./Y-,y}Hʛ/P0ꎝ@itLa@0 ǂ1 %`A6Fr2 EU~H ok">~XQ\, G  &"OaI^HF#!urK.JĒH7H}#`jLs%|} p S =s #su\R$xfȏ+Y Bna89et{\\K?&'⋏&+kB%XC5S }vFiAR~gҷF`_dY>r) qft \t:0Qz%6B@Ux Ѕ}Pk"jE.MlFHP,LRejHG0tPe,T*XIϓΏ7r34V3zD:^CpM'p|TpDV9:#J繚 n7( 22z a iJ #K|Fꋌ. a0qEЄ$u2}7DD'GVg+{;kUy䑽xm|ל'ńJ`$) tnaw4!cS*C#  Dh@DBUپ`9YBdqfE?`? d@݃L1\u=RX:qS7(%CGK2EV"FǑv`vK~'J]NJtL ,!SlƜW~JA\H֦So E}m( G.#*+[ܣgbWZ1Qysᕵ&$"itxU*]"X\ `@i#O.5cDHELP#⫒ Qe6-awvaD|ԥj"Y_+L |AᖾO%.#B`/ ҅+M /n3Nx0`}<PI"Pf"?W0Rd졪H@ƹ9B>)&@@_5U_1Tl # bA4n!2,Z HT j8sD \N`2ODNL]R_R K,'A;ΙBka(xI!S;̡2c= f  |}Ť,1bj@ Q08%C{'/bWAr@jwF0BEHmAJX:MT)C((rXK6Qk(%K':+ҏQWTz2g4`7!kUy6M>xtKa.om* bPze,3U3E讖J8w`_z $HK iB+NEy <(¸嵜GK4a(!~6njd ʬ!B`z·Q33 ^3J 0.F:ole)Se] @PY̗V4 +z1'l.nfܐXG }BGLd.eQ ?fā3D dV@ n2׹n,]T@ɝ<$yeG1TR`"C<*(QKk)Vw&G S,* 7scm(F+%+@P^  ٍPY> 0P &2?XiҏXiYI IT ¸%qZᶀ!~@, W,\P8YZZX1w^y%*BA<bHR40(C@Vꥁ%uD _ʋfA9GsЩy0^:k:, HJJ}5t (}bcP8љol";y443[YDeLܗ.#g%+ "b;ǽ幩AF] Ēt=jz.w+ Ad/cEaQxiܐawTT].w*C,A@X>Ws7Zn # A tX A LlfJdMSz15C:C YL.,4*U\wo=dH\dەk,!$X#%@ڛh$ bvpVAA c q[20@bnrB'GEgj\t&Pm!F +UMzi£d-Z7E2~~{ |U-!eV0+CnH!#{¿KBԢ |*W5g5Mj4;*=߯r+]:v"V/썬D@ZgvŘ?#TDקzwbg~3#מ7Oz"K6A7KY"\V.~F~"̩ C=HZ8tc&JPJ}IПee[[A.tgorOXAjq1}b.-8[/f4λ޿vm9nڳoo ͕` FcQXN'D"eQJbFWԨWA 'um3f0D)8!J۫p5^1=SM4777ް@|Yehhg?fF/hֺAQ׌`ScDY$&^WzX S~o]W;Vx>_YnYJI{E$]ɪ4g,zw]| \؜n /i ;w??9{~}_0,:z=,< TMd12xQ&"IHZ&t]*K'pQ[s*qf&pMq>zHۅoܚNknX <ߟ"xH.&5NP`w ܒA˲+WHU Ujy}) ~+/ttan1R1)|y;$"UT>!(sr-_SW %pXR_pk*%K8V ۵ʒn`g0:&Kbji>O9! R]t  ň_^Bd"hrm]K 쁕z,M$\;ɅqtuˁCC#}BEGVua*b5`!\g~j1>ǿyEed%j"_H@_^Xw$Az/udy r}#/R-U,~3BQg7W\/,$.s2|[XAhͯOZ0;#7+;Z9-"cLUb Ǣu C|Bϼk@4ؕ[(@`ȍ? ((:hgGQfm|^2>'ㅎ]#a&n==~&~w0*e "+X_D'$cO֮lEfETHP p E@Ql!>`cRQ_H yGU&3E:9 D6}eT//,$G'nƤ '~W_(u.CWd|dsDr/|3ɂ:[.k?'7n.dNo, z.6-sP隸AȠEl>z?c~ ha*3ګzBiH \כjH]qV"j`c*:u@rJ^0Gޣy:{`t[mxpZa/;cNtU@Z+4 Cϐ_.ȨznaLa`R謂2+dRa;ϛ;+둇sK۸?sй~t#P]AzdPڗ6b`٪ #CdP@*84CLl;?8c9*TAA:[v£&>* V$\ZHEPmZ45Da(ouph=_j.Y+CAOtL_ż"Xy}rr˿}SH\72#p&Z!Ġ*Z\5\Z6LJQ2Cd߁ѥVē҈/j ^p+ZHX.cơ, ᖶ\H?4]͎]X]82 $xQiTI~hd?{:v-wGuVCeO%^W}V[7%!⪓28wA7ɆUIp{@_sfnBNKιISwٴ^sP4_$ U }U֦9!>MXBKdh?{+TzE86bC #k?NN"uپĉYN(鱅¼N,TfbIa-C"~`={T릮vG| nT |j ,NUxM/3_ ? 2J'y͸麧:`308<]A`nu>[Dl\e:@H.h=6Z%:@kSQy6mޖKs-_Z / ?~N-iW+HUbi}bffTntdmyW8f[2V"AdV@mq] ɦHՃ0|TJičrU1VD~c-\Nu'Tgg~OoF*U9j8k1@H|, B+B J+Bһ~m] I.yTw^mtY7hW0hkS "Dg4Pw,U焖X-=%-IC ijbeM&q^&@Õ;T~M-J^VS"64۞҉Y(^ެeX;JW7h&f Ϻ@#5zJ|/b? KA#a` "Ed[Ai \C~`fߜ'JZhA{Mr!;GDGi aUEr!Ah9;FMAvU1"vòƠ+Q=Ec;Hmyo~?mDT$za'gc!D0?*5E8%@PЕg {@T>%p~o6r-l0i1"" 89c>ը!r cLaWRGAg\X~=m$m*į\;9pn@,8v,䋆0+Fh G$j茋j rgQBw8?β8P"gfT?lu$G2g#%߉Bju S)>;ci0q%a'l[3]o3]*Uot wp[)mXL'Ţܯlҏ_sΗ^z!8m\u ߬,{7L嶁ۢE$#?E)HVՒDAL(֋c 13 XjT~_5D|<2!@'}|.*gOWHt ɥqGU!wuXV\; Y(/axJ#pU6؛M-*~:%F2I`d `XmcGqr|-B`BO{졕չ (L {z=juM2` ߇⨡Hk$c<aQ$!Y=4ziЌkLի[J3F|ķ-D]sWG^H;]z*G>֡4ો(xM7 q m(}o\H!Mpm:SlmO<^¦eXLgiK>l2UWMg\FeYҌxlrhl&7Jb%IEh5<)i#ZMD˥r'wrv|CuA$ôܣ@-8k~0+Z']'׽ț ûykQe=O6-LN9_s d"Î^eMht!f3ɴ70>6-t:Ě5"i`үs 7?at_רN:ẃFGᏽ°bXQʽc!˦bz_AP8*aGUco\^R >v [stQ"!ʲԔ@h zeLN ьՕf)ed_Ž3+aIM4f͌qsy5o:Vq;AcOp~=įahu51:9=aj@OGYBO̠;3%"6s3 J"qptFfJʏY7ۨc;[*&Ȃ׳y fs h% C#Q(&1zi Hm&(jjk4PQi:\Y:ʎBa2 pl9mw21n0{{3ZuӷΩ4qtzowxP}`"u.~%mCc8de2R+HBe>Ǹ񷼆`q$sq[5&j"%ހ 1ZV HuuR{5†NFC-TDB⟨J }'fҸMtNw@6VjI4W|@c, O.npOOy ̢wLQTץe^^9C'~=O_0(5ԚDf"&4Q4 :m5-5Ru=lD9 HL[-"g S01I#,VciЌv4?:s).r>sջn׽sbn`Hf"\ A =ѿjrf?--#\ =V#,׬Qk UL~_ !4Ith@k!0̠jN=434FnX3F}NǟE"r$k䶱yNgυ?  x?uiu01RE*]K>]b`aU@O*uoX>i>nj L d!$ktN&5h'cA7գ8&#_c,>s&Vw܏rYֈwwo֚b?2xRt}.t ip'Og7h S5PU_)%?ΉU/D͑hh^iQ$uҞHn"R2 3_#*V :=e@'v2}['qׁEG4_vOu8eFeƍ8/eJ >os-z*7zy"E]o4u65_z+M}5hԮ揵 @p^S'B'z*c uH5b(]C$!Rs Mk 2 T|p댼'ڋf ¦%iC=HSAXT0(GIv%[b\[%1\Y_ŭխۋ 1>+_j$׮nSĴh IzFk/_Sf"r-6~ds11JLk [hD|ԏ5C`L:riy}8 3vms>+"{] lϐs ο{?:qQ+3!YrUO3CUG|ljh(㕫7lJ~a[ ED S]Q u_F 핉 JJ:#>BirI&(2O=0}X pTS|~`z{%{Dt^daqBŃ`,B[Lj;DnO~{\*E_LʋV~cj IvUBHAB@?{h'D~9N{ZqkkT$@>37~; ~YsS>mB5Dt]Ml_0kt+Q(XkEfw:x 6ū]_=[x!{Q wiAr';-O|uo]q.L`wU?9X0A ̵#A:8iO6vL"PKZb+-N7>kUPZL^GdCB=/Z3\k2{IJ_x"Vfob33:F2L튧GVI9^.鑓z>{1$I"4[COO;x #b_]|WwQ/>j|yݥ`|uͼp-+Տ ,b;؛Շ=G?)\#cX>J_pπ[ Wc<<KBA9>zy!ciB6|.DAq'wtH7rLco 藉 @8??Bߺ oiqXdJTG&ӷl=gr>c^ +q%00OU5aب1UV`a .*@dws|ȥ,PderT0(YKy]Ѿfi1`t`-AR1'n"t;lT]e}iIJ)G'6A,3zy;G~M_X'LpbFX ]8.(b;*` 0lm5ۂSnMLO(1 J*"3l)_]wpaԝƚ?>?p`{7_kbB:w=uMYT5ŋk Up#ocϽ㙟l?_}cBy."1]9(7ξG`V t-!i#ѐ/Q1*M`:f6Q{vO'߶Kr߾k/}=vAڷ)Kdd  qEIbQ?PLO]el{z}یAw9LNJr,CaTu^aI?3 m1jYq; iU%nQ4F!C\;(r㎐LïAo)=pGp=O8Π!t=>~˅W>}|͖k jv廁dQŌ=$U +O r -- DQ8oU3 1FVm5H;Q`G*1wLtӍ;a؏V*Ke.p[0Go䷟8fm < [ !ЀŘiysBԳQn~H{ǥBh=7yDnɝ;'n>FL,_ |J`ſkξ鿹3W>v?ɶ=3 P`d 4q }U <P+8((  e# > F LJp.$:Q c ɧƣ~3}`K.-h3G4|@\h-9&ըku7>@zqƢ6׀_oq| +q/jBfA+|pO#c!Ն #<QD!<gnܱ+__Z ]`z%z7;y횷\wLyS4M^/wn3FDO~6b0 IcO1i WfFXb:G|a' "S_].sP漦Oxʍ۶"2U C^w,~Y!U_'w?q3eC7EC 5k`uo|N] Y07m~_B8(`TDfh{v;}ǧnğ.Y8o;*"蚷\@ d?veo><ܢw1#{ڪJ]B™_U*+3?n|nַ@Ui)݁. hA :5]EO?`B;rˁGNqձbEI: ^.dV- X'=]\k̏]Y!Г<l`Dqxpr.zx>ecW?~eNQ.[&+,pEaC5tK9NΟw4ZCxGZ+/͑eȺEm TU +vUVy*`<*7<,ӥZM9uh)k25]tߖ}=Nly5,e߹̳Ыm@#CHG5TYz{OVNλPoz{o8>~x^jxHw!($P8DU5 `UB-@܈ !Fӣ7AN0E9 5`wO9=l庾|E>L암W|;Kc A/*_;; v?߬:/O9+7W0]V\hX #?whPwh˨|3}{މ6B~Oɡo0Š *Zۙ(xr5 l!߼w'~{cT'f>qzÿ}i pwj˿P՟NcZ=Ni?vp;7}uf Vu]53x@6OA 3!Xa"ib~Ĥ2z{=3=}͕O߮j^ۊ㗮kFZ}b}_Xh$=e؆i*N͈gigrzz:Mf7=Onߵk+erTSJ⊥2eHG eTpJKx 5 U50tPvr=NlzC 1XK!h#QA4Hr\}(kG=3{%3%T*&;jwܜӝt7_OL'x̜ǔ 2"z&;-|0 "x"\1C15_a4Z4hS#6&WH R#Ya2g')2ı497;<{:Ö9R Ox!O'<_qVTabVK+@Ϻq*r Jo09b-'U I){0x{YQG9j_vg|tCÁU=/UD5M8MEXHOY_0OeX˿E_L57rIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/128x128/displaycal-curve-viewer.png0000644000076500000000000003330413230230666026055 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<6fIDATx}i\q^` @pA$Aq_$F"e,rRJ%])%ˑ$VJqW*IN"Ų-nXJN۹ws0.;2G߼y3sӧV3soocrDU[n/?tD?6ߝ7}[I p־TbzS0tm?ߛkNٞQGx(~i%{:v^W٘|`?~SwG _xXo^szb@Cz5ߘoEϛ机hwFͷ\BH=?Ѥq|t.26<Ka$@> ./S?Y[ve{knm*Q8H!M"pg}"Oߺ68@~ vX{:qn4}g҉+1xvh=.2\ W9jڥa-oN[^,lIt% @Vj^?]X>ЭɹDXgkK7ע`4FSM͍VX$<ݧ,}SN,/}}-\ҼV;!P^  ;^8BKfY{\;w=k6kԬX5F';;ԥT JؾZj fE&I(Uk:65]bU=Q*fV;:7jfYBj.>,n&(]f[~rn *!htUfOZ4O.7_|:-v\dB@@{Z"R|~g 7Xx>KoF!isݪ,پak&?g [:_\;ߪ4F riY[OK'wIZ(jb|?'bj2z]LV6W˜cY`wT7+WgϡZb-C|t?;JJ% +aKf\GvfD|YG@Mh̼߁7WF `~ o~5RtcfQ 17i$s" YM޾._h\%;o8K'`Cm8~Wy|^.$_Zހ]G| ’CgFsw l;Y@,3>\rz^w}}ApG{ѯGJ8;H!oh <m쿑.E/n1X)sWN;׈U[&N;(^u9GvBls>Vk_SB7t[;{7{-6vL*Bx-j%tDHk=t爥PU9 '{Zü "N9'әE ogVC;&W#y ?|;{FwD{a3 vߜ))8 e F5>#/7`" luI0^&;Ϳ^vHV޿}+/l{e`5wvAKI-z9E[Ea* xwyk4 }3CмnԋY#ʰQ}׿p(XdRɥ Of5:P[w}٦w$ f`k(DΔPԒMMg4-AŊFhev؆݁ӟ o@}^Z;ϚB@zISpWunZ( ш$Vpms B63 -T7BLi3uQ>Vs4nl'29Oryvir̙ttxƌbqԹ^O.$0}|v,[,1W@YL0 (, Lv!`J7Ta@dY"{1m(B 5@'-HRHv F\֛+u4ء6adci' dW%B*eו6XFe c{99Zrƙ3(Wkxq E/\)C2諪NF :E2HB/Š9iiG.*H.1hiS,tk|\u `ROͳfɭg)*:7z7\*^{-{>`Ҟqfp1YY@*7)b Ib ;C)4"C>C!ؽ%ɓ]s{sOްT+D?;yQҁJ9E|_{T/!YvC 7Q(R`{?A| \8}ZO`pɳWV;<6mžsE5 `:K0fĆ#{ZTiMP)qݎi,7uDԔnbūQ}\>t卵<'nPYsȑtY_(sE8l0bS0p$Ύh6 ,mĀA BB0OjfJ[IhAvx> T*^=Ӈ;rLVe Mqяv`R-l(.xQkbq5e?F(\ёPrsz@KN,]m1ֶ dw!)--fQrbSqbz?qrif,GޮdNQoBl嵪X4GE<6JC- /A&a%H1aSRM!&yS|reªis t.÷O-\(o3gZtɃ77]w WpU˩?'6ÛʘtLMG0i&4yn'P\TЭ.+.n5`4Uaߙ'Εw͛'MNKN1\"jipٸ;ANzAOBQMa"p9hE?(6 O0 ,NՐHIͶr42q)6^Y%^[U^Z|?R(Z9墏OJyJ_#vU2_sY2-axIљCN[Z|H*Y{d(SP*[ fڣŋerOޯe)~B57T^/?(w=xȜ2_"JF5sE LCFR0'K$;. ߚK"gw=f)3juw-o؞&+ޫe5\;sovr`ǽͱ,r']'2rh qeܧs. dɫ/sYB&,ߝBeJ#guvF+L_ ^t>9ޒ#LU:fbCdZ?VZqtKϣhSMȷahaQ<:tSUPz)CZ8ne{yjT9ؿML&]r\={VQ>Vk+ޥr| YE̛[w1D`0lY?B)T} u4`% ȖAq/~+ȳT 4uqQFN&<. ]p(/v3*['¯Z.rphyewe{s㴲:* 08 :Hor͛ؑ}u,YzNh1Wuk.%ٜh6HB1l!LeT0|9EɍgItVv{;8iٵk1D"= 2m$UJ$8(QL@.X4r#yOȩ `@CF(0rgϑb;ej .4~1dU)E6_>tZv|$$g5p`0K| PlNHC:nj@&mM9gʔbLP4lO\H~}8YqŻU~~le"O4iv_C%/3LI;kqFr&FRy.mkBdUy)/G9!u+g՞]T\P;2*,n}f"[rhj b*婐jk>vkF(]1,ಝ5 Shv)æU qf urP8j!N/^v@oM/n-vv41AT8e%G 'QG")OXzeB1j. J3u)@+)l}SK@)2!E戝"\0_>wRC3Ma/5X=Y5&6~O2~W6P&Æ k, ӱ9`U"@5̒7Y \k^/=v'Hz1C`d#+o aw/\34/J S(Sk=)TϾUQ.$l*rNw<7YP {;DZt "Έaٲ?+/_Bȕv^~sE<Hy3є{B XU69T> m5WeuTַѲp9'}i;W^)8NC*̹R; ڻ}l~e~Ht\RP幨6UKE*آ[!#[1:Tb Di=E'ǮuYΉ&X  x@=3W_# ~,o|\e繅+3_+BͮwI6y5ֆяfʅZ ZF Mš1ݭF~"XVNF5UgݙzQ I֙.r4n dh-_wEVT7?1YЗj0v #B5)8x JUK$ @+ XVb#=ŗ*⑽]r% >"7W q',z{DysR^="> y?N _ޖ 4>ɭ43zS]ΠkCk; \ 7nC-.b mf5p3Z-~Z~"O\_goY;*ٺR]3[kZuQb*Q:+lNZTͱk}'ct%+`ȾU|`rqܹ۵6Y_џyˑ[RWTd`\+s7YZZ#IUdو Yb!4"w!!v֛0 ۷Ē̑/]sHoM=i.U\ul_m &{`Y>FM0Q"VʤP>=CΣ: V|GX78G)$nV4!$Gm<%r۹iz|v@6<;Edÿ;X|m.ua9->6&'Ј;CbrΔ5+M\1q&oX2$0oja`a ccʃ7Ο/vvGH]4RpR/˶ ߃V|CX4jE[t>L|hD = :wz,$谛+Ш\5>{Ld {â@ OLq gMnkAsg̐߬=zc-X q78 хIu|Al4a[{s-n-^%|sn<@װ9^!6 jg9VΘ:12 =RρncBE[ׯٺ;rw[N(H-_e04}OǞdc-HVC00 ,B*P!W{GCx\m2MGJrU!nHw܌g:;\Ocׂͩ5o 0c{{~v)ܔW&";^gcq !#+?U5473ʀ̇d ӸԢK)V .D΃os3&=գ\xKc,J*ނS?=~<[r+Sj#U.wM;% ȟbKmcIՏ3/DuA͘2 uߗ][V9#ՙx裹d2ˊb@} ]s5.ZVi%&-M GI!*\;oB0܌os^t)"9/'jW~'"]Cmsɏܙ`|=Ih).p,=;0;ON*yι s5.\h@h!q2[wsq?aDd# }al]YPT'qi9T.}GV'IBhi&c`n:,&Z02WaRP/kǥ)пz9y%[~V6vHaڷ%`/U2`'̆2 FBq4#noԝ5dġR+8q^;wܴ;1gc\з{ZrChHҙu|01^*K1m9Eᵐ(e":1 kQ;pLƞR؅4qQ y7YxϹv{G?C9dx2\Ti߅,g 3TKŢV-9zp30YT=#HN" Bۆ UԊ'V$\nMC jd]0Y!PZx+rs??v% PfT!xxB PHݗ@3&O^^ofRm$hkv{ $dſ-n0p6^}bi<$>$V$Y!6$",{b4(8i2%! ߷hlj"O^ۃ_W87oR(8le QҬz)0fMѽ]D$ 34QF D}5.G3EcZ~BN4[pNk~Hl[C9vtWaln0w T5Xc;(.5%0pS '_DVu Hja.@Lb a@ٳ׫w՛G8'4&.i|Mx9  2*{` 3جD^OEb^fR/d7&0aB *6^m@ؔAsfx޶J~Nm-ya|N-j"Gn^ubRS3-SΝWkp (NO)UDM $R8et7}>`7/Ov+E %ue*di!v h1&7缙65S6@B/&*>9|tbCnM޲`,+:u~jZc_ɡu!Aع!LfTpal #UPYOS#Xt. }.Lje~W\!0 &=OSEpo;G}`RzRA/>A$X~| sڰ$J 4YO4P]K._95KKh+:l{rюH%qnRQFZ7PPOB=l$&zvV)+-Wb3aXC թpkI8d,Xl"WW9ZИ# SŸfV=S{;PE+Aԥ{q~4hKVܵ™ +{Jo:S?9t~:]2-f)|j1s |Z@`s${ɠJ T7PQYom )$ؔGlb:)@HȄa|*<\i(mr&XX܌U,HR 31cTY!la,Լ7>tQAݛBчYY^vN8,GRrN*ݜ+y0Է\a$XKӸ]ݙf aQa\Sbqɤ24:BկfHs,}pF~e8m*yR+eNRw(ʝ]Rl4K9BU?V%= WX`01fhDF9eg,zt/}-u'@7iݮf*e L.R겈")oUf2`IK3/袽yM3a'N‘j_^^{,_|&Fe(WWXv+}$Y׾?ܱ 5f ʪ=sɍKEx&O!v*4%IiVmÿˣ{54uð^OK1PZ9|BR%-n,Lb#*U)SGڱcǪϓo=M?pR2ҚDv JBna]bWL-7/0BٶܾюTcmy֬Cϛ*y$#A%}u?sд>yDH֏/w&(R3d5a 8$^mdlHe]&Zr)QV&4%QVLS=ڶk\%K4qb۶mP*1; N>Ox>~yagCSC~'hxӨmx|C̣4j͌=VtXK笐c *WY;\#=;4qᚄ!s#z1$u2?m&X>tFE߷oƣGR}OIȥ̮>͔l*@̐g#:)jEtw[6;ުݿ曡ݛ=܍~GIkAh6V'&'Cف?sA`j5vћ'n~Us{) )6h7I&(0yW~'"Z;v)=;N^SY ɫZi{0qձPIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/128x128/displaycal-profile-info.png0000644000076500000000000003364313230230666026031 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<7EIDATx} Gy_woZ$˖m#x'f ,3>a C2!$&LrBbBId@`0n#ﶰdYOzw=}]5U˭=)'\R./W?nFCxNBqZpsrz-Ꞩs ,I~7GTyM~.G5qM>w?cH4$5;9[LaaZ`kG/嶐{usT #%FR>gewkX;լ;OA:SoYakYۇJf9LҀU@A z1 c`‡BgI z)r&=og{)`&Y]5, {Lp;r( k >bLn>|,i_Kqe& Uj0h(͇kyۚI )+QMLDS4k)&܄M5'C73Eu4:*%Si#0~0޴;̰X owIwVmnFa/6ؠ*Ȝ `I&!A'3סE:erw&8j* UVZϱ+cW(~]8GPȑ<ӫ 4 :SHq[q;0200o|ʿxX_:N`;ku*Y}}0PiZI8.*a ꏵw,JlOL}BBaqeZE <ѲFZ 7 ",801@Uk̙N&s:Y-8d)ȤR>7{:cz ?uEP6O- VkhiF^8[F_U8k5t I>thXj4z[G8`8RsQ8@7PSo t3{^|A ] j*lFO~5dDhs!ߟy=;gh"+H]$ DKHPsua|n ]xcI< nb7w4:)ͦ Zy= `*%Z<";H). [eKvNɚ U`!fҐE?PwDTcv;n-=):N?)O`o{ IH]^Ns>r XY;$XAi $7 ,)զaxvc7T3S*{UpmGd2f0Lf_aLs 5,·^H%SL"C'd$=Cs{gH 5"kӑ.^4xxr8u3AVyG ,If 鷷Kg|"(2۶پ{SB)ЗRbTjrXLȦ2LL# cUaqɝ|-L9x{w8$*ؐShߚIeeaYMP-W0f Hg)\нߋN-?mkqɕRi~pԵ4M|:xSSمNE8?;a`}MpF,ΦR)[n}+>u4ӌdd__fYGAp/p`UGNv )گ + M PEf+y&`f?cc1]0X,K&ov)iJ=AWc3"FEW8zN:ۈE1{?!WI ºW1` :%O}}I_ wHk>WnG|86V4Gzt-1%:sXa> ; h8 Q57}0?[$I3s 44&|,B<:b!dI!ОCA5 t[)`>Q`3I:h;M F]A2-@pg1l W f\>FL y>J ޶| tt| @[8I}[^F\ITtu+υ.= KBg@l \yJ1 9>5sf)LNV^b1ۯkg2|5}2s1w=+sB \;4uHrV ػy7lק`vb[,ӂvn+z]v=\px>_nHnzJ5'>d4,~C暩27?yt#ڑ_J&AWk_נi֕k)DT0O>G^ZP\74 ЖßHgQ6VUa#Ra]x/76l$wdZ[v .6{0 9lgz珗yyPsHs] 9-f5d}8Vf7,!?O,_`D{~ޙw~U(1oeM&}(ve0olOw+G_dt)nK"OŠ{u~g@gGO=\qm'_IvwEA;~ݰ:I"%s{z ,np\r-JwvGL2E>2wһQFTN\Џ1iak f0i(Bku8׵@sX8GjTف+[. nDϒ!l~Zgcbpd2ExO7ف/\"vF;ʏA"@p jaJ;-_W^L"HT~e_h"` w"DAy΄5]`) 8~xTLM 60š :kc<$Ve3 rNLTW+z.iF?YAOKJs>Aq$@s`HCg<Ê)@9Ү{E@2aQ0-~'NfrWC:]5/dE6meENVKKh(XgRݐˮ}[-X K^ÿsR̹LB`LMeaLDBNB.?ߙz7x6GgWV=v((a,}.kw >֎"p{;B}(MfWfsЕJLCF0hCqlUBЄRg7 igv:`M/'_SLW h3/p}ͽ@~_tއ?GВShwAK=?=SN/njeϤ; hӅW/+le"Τg1ڗyifP爔ZO84u5ɵ^kP)WC0E?|]7T29(Z_!4Pu8#!H|ŒꚎ\+~܌Ut;n"v]o 0Q_qe!+i! H T,`U#kKXdWap68~t s1n [ .}[!I)a.PyVچJmѸwt8zz%m &c)y|5\:g]qlD2sm*[̮t3Ȩ/ͺ^]lU%Yn 8]>9p;WԊg1(@U Gî$GҵG5;#;ziV/kƓٚߟc$ײg)\ӚB;ߙ _ ?"]Ab@S\+vy&[uxtt 1(iwMb#@A:0c;lw6j.R9"~Q(%~Do +t5́}8NG J@^0xe2>{u)6$2 O\fnȓnv '=vs&5 R)![Pgw:xD>*׼{s:1L_'/%7 WW`6>"H ̀1EZ0Ri/@})t{m:v$팤}nPUb̓Ui | c%rbڕ'cQ DJ21 t%4c҈Qce|pFe1A X_ I3/' 2 07k)f*:'lʚ61|Q,9;^1~ `Pa{M8жC}Hv3-T9|Shv,HYwU_uA|T^rn]YY'x1 ()V:WBN ݼ:.& OZ(Oqc|G\K(DtaL &L#5Vu n*Z|e+dT :[r 9NR! X<]le;c*իȟٓc}Y`{z$p$9&&iP`"*RhZ2x}N*554*{E91C0= ?T 8 ݺ`$BFFh EK0k2CVJ/Bţ83BY@P I*cuMDDA`:7R(_*ha?@I!#Wv\ Et@vZ @H4N1=] dR*£ !l*ID84$S2=cٮq P#hڅ}tꯩ+9'br:d &Td@:@IT* *QvmG+瀂WLS^^DDzaB)|hM/cr#jhd':OA1EEndH`Ѿ9?ty\[둘ߗ:5r,_FX>Z M4wZZn)IgVӚ$ I4YT+MV+"hMSIIݯ H'I|wi~.J2x{ng  2ܬTlfH&2i4fӦy)h(P4?(&*>P-!dӰ,&IvEO,Ŷ;tP@;w4i1 aCX.mެiwb#G1}cA$ :JM{o>A2 @hTRș*U! c;>uv"Tf IKxGR?mҰHMTb22q0^@\g>'bwͽ8DK->~щ@f (&퐐8Z5V#!b`ED5 HjAaכdRIpqGnARۧ@:z|C$"1ZtK4!רפ{(U>4NJ.yqM(ug1;J~&qVGY@&mӠo`U\ Z lO"ƨ`y3Oib\M/|YX0Ū|  CAĭɢ#xg")qi; {|t@3BwG%3`^6egV>hV+ͼ`LUJe-aE1Ts#!sn@Z xV7_B Fha h9=irAJ&ۜ+HV~լW뉩Fi> jF \ Eb*3-tj<%-3 h'P(kJ5 Q6=eO SŏZf%g75ksY$P(4P]ܴ6?' 6F|-M 5P h?fB@:s A ׬z e-07a|.yzQTf#a_ tlOn#ic@r[`P@V85h`P}Zy|8? h4M(^zi)7F 4Ylzz1@ *RM T6 k7[xKESꓠQHCթ)H b2+V0_T#a{ze"MN8=6\gU 1=6 J!4F1" "K p`nrx#“`zmD-,nH{!t*k?m/$DKVQPr*N ܸAW,G0Y$y+55MpHH8-р ղןzmm zƣPJno 4>,Ȁ6;B 5ae.W~ePܽ*sU|$?0cS%ip$5zچb׏!*ߏfHL)nO Z3=SUt!,SjkZv'&*P.70SB4da{50vP;JO0# HPΧU(U?gTEόn*&_x {L _@aگ+}1t Y֊:AbxmhrWj#sg*U;9ͷm, </3lf +06ZRhF4B@f;6 G;FEZ4E()o*Uj[xٗ\z<-٩4g2ແ MCT_=$>@"H 4Զ\+HB*qjh`^4`M2Yqb㹧Zevo40?߀Em'JurMH}L@@0TӬ},ڦ,X59_}u}2]0篺7>Cd)f^/Tg|Z}T2)`]&ٴcT8\rD8d 3;7Vsz1"+<.ڵB,v. ԟ~O~T UJT:=*nH>ՋOOH\4~0OgXc~Pm=>>[1uiR6w+LU[|L ;. ֚x_ksP8:l;~ o#~nY83X{v/-~D`p4VxlQa| P^}y7abH/O[{c"wgzvB@DU{RqRVll1ke†pe@J섛5 gE(,jG'xV+>ퟯ5`Xw|a|M*jզ/]UAD#@En^εﯦQ3xuݺp9}[b.;}X~|Gsߤ"/1rʳc;eWtLXdwnZWjIɕ(Q Q$MN!,W`t k=Ke٪EL_~;¯92 dS0;wxn>Z(+0s7< a%Yc^P.EZЅ ϾSo992l߄q+VYo5\#scR ]:tU U`%lg J k}5 H;t@GQg!}ezF63V_+x榫/9<~" X+_=je `pd>豹^xѾ-j(Ri\P?$̧1톤>MAjrvMO4w}6x'o,'Tz/=>1ӻ &_" 1|ZHh[,,!jTb}NR2T@}ì'2(=JvN[{?{~p}Rdx7-*>MNV2`R0=ZǠ2_ӏ4^J8i!Jy _/;>: )#)ڴ?Q.Q.?}pHu8_c>39Y*6_V0#E;%|dG-T(qOu (P%q-1spLDŽ/p%:V*hsg왇po;}'h _Qnd)g3 T & ccP5^pDbdQ@3<"P:4ba"y}Zjpcʶc?~ȡ}!7'j1k h:iGsE~i1&cph(JxCy].TC:1D(r wY4 -T 947щz'?YC³[ڮ~xtj׎@i!&fQ c cplZGy\=0}P+@9x~gaYgzvN[n{-[! lǂFuZQuBps=o3w;]Cgk y2WbaзV醎D4[#u{sPh,^]3Ys0|J㳐2_YH쵙<.LCUH:?kz \:u pp0|恾tu+2$<ᇁB@3 wE$ {`C,puB Ĵ41 ű0U`DG6 L҄x_|_pj}aӦ|K;ͺS9b踽..4k|NJUoYo9z{ݥg@G[9g`a!T z塻?}ybU!(NEG^[)By[|C riZ3gntOnz艡7"grW>kX`uQT6\Z޵W30@HjMA oY :3e!י<;O$pnh]y~Ex`FMɄ>}߭6G?NE%;omwg+;OwkLL| b31&3 䓐&!-F C2^bXlxQgA(´l4/aЬ7,ws+B&wX]ͣrqr+M( &/=o1++OEIWb@)6 .p'1}u+.trH -T|_&,f.808KQgiY*?弐ZG"-喖ZG=mdy0'vN˯K8J}S~@83 T/i6\V{+Yu1 $FoH}Ά\XQ**T+K*vbfa<4~FJ򯏚v,\s_9j 8Du+q솟 d\6H%2 W|Vwz+֯\+ Lm ` %` H?*`@wa8婭GG]?X/!'Oy!w/;_ s 픣v; v9_s>UQ&Dm:ڿmqRuG p 8sܲt.__iȯldiF" c1\M'P70S'Be26x؞9G.סV=:|I?u# MbSmQG 3BC+׽sk7w}>+ӕ1fL7Y5Ҁb||Yf|2sѭ{6>S$tk߉>T$N M{~֍|W߸熆C18_uHyku\S R5Gm41l;!܅ 10  lf@!Yc5ӡP_$7@Î9lR8;jQtnQ#* ÉZr珟?N`3N= IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/128x128/displaycal-scripting-client.png0000644000076500000000000002571213230230666026714 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<+lIDATx}mlguZsTr 6D1UUbB!IU% CJP%A2JP15PGJLU "vpHpL:mr܏{^3}gs#s{]zGm?l`c#F6l<6yl`cq}'~'ߞ3J珇t+g/ǟY~/x_3>xek_?(ZRr,G~ox?k7q!n*"֛X;?5x` ENA]>#l)t2zOXP>q:\mxE w~j?x߾;k׾?;~Z.O7ύd.=At]јn5FHEhHRTYXY.m~~ۤ{*߸;zF5y?_qWUU켓juBv#!UbVJ&Z(4g Yb:z  B05~78wy?0W݁vyJ݇jqAӉ9l}vtpQ԰\gbns]g3ګzbb*MB/ks;F!^gWw,QL:(-z>~l9Fw{QWm9${ 4zp9~;műZ<MCU~-O3o{޹SUz#?xSKUlIM׫^p`#[k&"WDQW>O#&MA_w1iu竺ͼIosvwݟ6W]uÇ8'1ZBUaN(%Gl3{ΙEL>,(K)9~9 zDHVS"e9?lh W5;Pw09Ih /StEX[o Hדg輿;V&'Ƨk$0]h\+oD[DS-@`Fs|c,;GPDF)f%|:Wأ-g# ˞5rM;*qҵUd̼ebHp8|\A3;zA伅E؆ܝXixv"+E \42H"F{);W_}ўpz0)2#6;q99w;GR hZv.8A3zbeHAX8z(4M*n \#[3쨣Ɲ^ /!D/@J~s善P.W;TsQވ 7T$Gk6Ɖ$otDQ]C1M"2ꋘ:摶S[V\01lS30`{ v>!gD=Mɕ_콘 IQYy 0ؑYIvzhwx>!)3H\DC>!/5EIW?-X4DMDX;>f$)[CO49?ĸ.`b JFN`Uحj "Jsʸ$`©j%;H"07)_eslaIX:x _<.>h~k&(n)^ٝ02:NԁNpTj[8%d IhPcM&TBqtPy©omm7\o{lV@Z8vMMLQ5D'` k`|#Dk+}ݒ^AY=Gak -\WEU?q;v옭xӛd'ZE!a&]PkB轮2 Xą 1X` 5m{@Ձ=)<$YEv0| 졇Z[⊅Ix"JE(N`ؾ1oobO)ozKz~ BS#aI hՏ~#;1btrpBZr bRup~G;b^{s=k $ Ymm JρUNɎ2w 'l #8K[Т:rOhKç"lɎH5Cq $vKURI݊Y4KR Ac='ug$Fd 0|#"1\ `s)! vCx%%α XZG ( vr:I'=>aC!Yenz cy W="RT6DbHWWT&[E٫t8'E˕֯ҰSXSf7_Wmgg EP^`aJ-[ٙ;[жrs+U@La ˟3}&2) '9zburP5VyDф劗\n7t/]{~iO|!f-Bʭ"s0xy3 ݜ7dj vZEk,!A4396I[ô%<䀏LU&$(EĊp}3ϓH?wٓO>)NZ ekK . Ctu= ?A@A*&`jYBSSSF H raMkr}տ<ɣ}cb}$Rti`v|(XWj;pIS`D!("Ŭn(++(k`qSm; l ͮx-۲+<_1|/ˠʍ.ŋfm>oVqfn|%o$L';6ٺK àμҶFm*;fQʱi)T1鷼o{#f))>B7!/\ Mmi=rU*(|_Rݽ, 8rfωYkۚ8>wɈ1zkq gݴ}`׉W QFj9mV.Ԛ= ؅[N IP}nJ1FsnP*9) S8{%օKIdP¦}яQ}G+lν@2ɩqũ :j|&X<1Y2f)vN沱! ?q$Cxh^#a0,h0jyϳڅ^/7ۑkJM RGv!Aha X#n"# c"(ŏAׁw@. 2u rqw_/|>$mdaBx<`3`{aT_ }jf@zne!HqN'ft ayɡr@ rjx+V-_WosJ+Fـa¾L\x{qQeds )Ͱ|$V- e$ͼði#o|n_?s<;(ݼFŬ&NT'>;3Dt"Q*W6pBX0KLM ;^0"~y4A p}!b ԻNчk vsȤö53 B2@p@9H8`eƎSTQK^D 9s{p棷~0O|X@"h\^H:Q%L@@$E8ҍe+#{SCjfԄRPJ\09 ik=nν kT8E^A=O~'oY/^|;b hi6;<M{6ΌxN8KsԩS†d!`⽻I4`YILQ\v\m y <%Ke%Ej- G7d]pϙ߈<'T ?&0A@Ok9}uN"Pڵ|"CʖF}z!$٣sz\ uSXI&CS'8 eAskaЯ]f2D8BPQ!e5\!wgh4ӧq^',CPu]a4M,*1FqCw|fy慠ÂBC4VHj ezý1wP޸u f#mE|L83Pɸ0Xhg:Ar&ْ13bF14v` VF,J`.ʥvko^^CZfE F%תT:A13 ma`VѣG1!/܋UIБO= 5XGU7Z wKS3.IM;:dN:2@Is'*BCNC t{R(kSݸ * sTb@ @te=}jN 3z`‰%4ky&Ă ٴ598)]@ēI2ah})v\f `b@mDPGܧr(CW@ |ҥC8H;:wt!sCFkOf R L]mR3 = LH&VļGwFHsɳĪKtk!\,u/OڟO,S0<JT,QkC/hB!f u`*-qnfC(-qۅwԆFyx. >nv]ǂ MiGX*fFB:FStE'eJny`INK1/co4O2'hX0Pt8äeݢQ5u-tzVEcנ'Z !YR3H܁ @ȔUUexi1+-b3v`ۑ#JlHĔuHAкՉ 0p F7ȦºQTd=JiRrcucсzџ:% *Ra`$e$R {jo`y&PJ:H*zXw˛?N>{ `~PRM(& J[B$AU4,+xEĹh|y8Rdc@;bNBDыV0f(6 2'`.'/sϥE z,ҝG#cetգf^"ۘ`$Uz5> vm3k19rLAN!`ggw&`O"qึkd% f^0%"@J=6yVGӤ.7ZCD[hzӧ~{i/_~?o;6r +"BzSD Nc,C"-i11bTvB:?G~v0CXqSe ۰1#ڔ5wYGɓ'ܞ=h;!{1葲SGq$r*(aZ$Sb7 ֑mT(BLD%~fvH 0 :8ʹ3:=S{m3?1JΟɴ#8mTNfA(Cd4մN-2%fֆh5iٳϣטgɔX;׾?o A:0?3g<}_4io 9{oDG;ZGkfXx1 b25҃NP2 8C|pSQY|tSGĉ[;U1sUqzo-[(H%V;L;FKɏN L RwЩuށs/zT I Cv7~_`~Nٟg̍ԱKA{TcjU*f#DΩ r|J5\Q-ʔ }$Os5ؘ">F#.9/q|iWAݴq9+uxCD3~qkA#%0B@=7z0ηNقNß˰[-ÃO=+=zWQ {3:0~]0}Сb|Ŧ?:"EZq>:$BBxČ M.b$E:iR(V[I%tEeavɻǃ~hkM__r%W:|lom]3xu3.k#H" ^'ܠpäoӺ !m7Ѻp"&rbu]#rzwg>}=G`&_~WGcks[]tя>| ~lk[ُǺx(~k'80>uǣjv>; N/* _3~,Cʺo_l9оFι *H^@lvO-l?<l`c#F6l?L#Гl6QfIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/128x128/displaycal-synthprofile.png0000644000076500000000000004260413230230666026163 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<E&IDATx}]W}{_/gd5plcq6M0l*d7@ p|dKd [-V͌ь~s=fd ˻z{Ͽ Bߠ% rϹMz3vQP}u_ )/8D5bD n%η<|HR^tyW};mވ(QLo@H!J߉5Er4?CNjmFXF䬟i~>CR*ek0G?`izT(_鷱I)z>q ӌ0nP^sƠѳ D'"{( <%r@LB(O#WRb\yhM*O#@FogR> AE<$y^zWqaoңNҚ4+T#`gE~A*>LeC$JuNF_l`8dxK!7_JTAL*[}_PƠ7!4Țy[}]?]j:+3S6b1d,^oX^뢒PY.Alᄕ ,v$QQ2AcgtqqfٯPpϥWfg_6&?8e/`q6_oWRi B;}|2]~}G|@ @-ޏs!MbPzN%s!~46WLKuT'&?}(`Wp;aI7$ay7S7n_t{ 72U]7N bRCD08|Dx yb&A|KubN> X.m0S^}-{nwS3-yē=#rLa( Pp65ukԎZ *PW^ѻ= ijB#Kw,%$p ZXC|w&@#tSFNÉe[?v/u#磌r _ ?j+wPp?=wAЀ omdvktLBH^ߏ f@pYX5Fy2‡~xH} y_J ^L)`bcwtxB>;6p4E0qɎ-w͵}uɠӃzHqyM4ނ5rfUxjDϩ9~;&@ă!?L[D0Lo؂Vf:m@ѤQHLq~1`!NhY}s"[[Q6MZn(ˁvڤPo=פ4.3iiz Z=Xd0ET5H Ld1& H)W![ ¶˥>(fQ U)(c/NM}:2 x2 =n^֩ۀSfL+4atn˭}#5<>G\6j@l Ff'N [/:W֢ HA~kE. ߳ž9(RMZtF$@v_oMk}y\(|M(sͬgd?ZM,{(ešsٹR5X@0DF{ yhcntK_2C LіCZ8bq5Z \>:Zۆ_{33h~|5cs`}M__*VdL1)Z=G8uPiΈN!JQUFbVC⑶(Ʈaa ߻apM+X0jÚaFV@կݎ|iWRE^t"B% [y[HȗK@]-9Q%!豝vOi$3$]8Bң;ZKK#d)TD&p,Lf![# kGa֗L}fmW3Awу)|fxS& Rg%8Mu)Et~o>xWamEfEL"DH;!`HTn&/R垇1`dBդq'7 ٳAt\@pٌ p7!az#sp1#>ʁ߸t)?uTdZHm*Z]u(G_J#IK 75+,,c!Chz葦?CͷϕبR2T°A ; :Y |xɺrfiMrw.4DO +Vӳnq}O*t/OI#4N|(EaR\JDi`I1HX 9& >X1O)QV`̗f C>GB{=Ń'5<\Xw8wHT}܉ A&K1U ߁_sg߽2C7Kk{WWE< XL:ބh=".R\^|Dsb?DH" 85 Qs'&r(D )$nZ^{zjڢP,@T\>o\^0=]K.xrM@aeoZC wV,@xtT.覽P?TUA$&\H8gχ I&`Uk5)Prl ]U^6Pp`l|:ssCpfי"<"): SX3UѵTʇ󁏿<}<*{hiPFH [Z~mTw$9 Axږ HGNмa@ _,p`᧋в x!Qx!/]fNPDX4bXY#[r0dV*@!`t:)6_zꡦ|5mM]'jy[.1m?Q9 6((B-P¶EA_*O1T?`-Xj8>0ޫKI+^L{0=iZD=:A=V`9m?m@!erփu+Jey/ks{O<HܛX"Zl,]5gOg ȣdS[$D>5ܾcPM@cAEjFG`qqA4fMgd e VeatmѺ1'S]笤βoFRgǷib;#_:aYgAQ %䎈)zæ˳F:7m.hu@H-bó7F f`?6yfTfٙ8Q}{pٗ;gz2"+jt<>}t2p7 R)~k/JRIVșD/>RD+R;^X)Bȴ&9{@lP0Cr -Di%0`olQwbfFa섬oh86}H-3@x5y}>r3zp@fLx߲eb^$D@.T2B@/DӠA^1l4`z:$2 .`|!vbyH!?2>4]/+U-1 0<U:a9f "(WZJL0N1AU}~'C`f5 (ZUZF;6!,@(bG3pv~6Z@To]OE ,%YHp]P9nq2O(Èik4ٲe3(Q&*(7QJVU?q$X.t7mF006tLnniBֆ<`VZj{bJ@G2 gbD!`>2U+?"u !,RyޔdKu|`4id $|bS&LćdNEXPUDyX@;JEca@ L{zLK}SwG_z7U^~Ddd[G j302E\dt6ӳE|AŞJ2q5VFJp5p1h TQiW`fV1$߽a\ěBjRnKޑ=3+I)gHXdD Il7S`8rhDI?w޹*ShiQ=UfbFWdHEG ;16=QB]6pKԣbTIy&LN> , a\,S Ia"&(20轣hU~"U{Z폎-OAmlҒ*%W3Ah>b|v9pKJ#cGcZx بr@S`rf&εfșa͌\t`"JZZH'+_1IW& :ib)~OksVEL0|y J;/)#߯K`vvV,:˼,JŵC8)d 3a$F6`U~f= V*1$:vQ-zRt)ZU򹷞, ޘǵY?mO%!eb߱!zL9qbmjuA:wo!c|L( hl2@#<0ϊJ$ѵ0( ^\H~C;3X|ՇޗLw7O[[Nzzê8F錋ȤE֞88@d +c{rK=SX!zƻbYI,JE܀$μS2?!:dˆDk/ !݌hMT|]p#ݙ ȻC*ٟl.Kl+) Cw6S W.W }y,N`vK|S}zf]deur|y@N4M[tAT J9Ѵ'3!`u$g@52˻<$ 9MHjXHUX+R"b]RGWX)줇} rɓor&Y3& ;8%<`IT1 3* ̙Q)d߁$!$o@0ΡD9PD"ʄfdYTIJdS%@j~rYmxUXJ [JT\[׀HI6 "$!(y%6VQi}@o @kB:GYD,`%gYEb56Be A;TWx^ c;?ӫ<6?ɾ?3af>+j~vc $$.dHA.Ѳ>#YY#vʽe=qRa*OB|؀w-Z :B})Ӿ?|7/֭8](*4,,QI'8J Y,c4 "8BSF9ZdXАJaFcQ&UÌEZ^ ufHa& f'R 22TDI ="Wdߛw*M*\:RHe`Mt1}h'`y)r퇲SD.<ǞT::j0#*J{(mN0O rmX0 <#ʁR|4]5Ц@(dAL,B[Ӑnq1zG ׌qr5A) 2~̏wrT6]co [cFG0o_Rɚ9'󜰖`btY3h w1P^7C$ V,aJNAJx* !B]]I>|Vl0fG1EYKaNw >HWY憃.xT6!(\3%v0b>:Vy( YX5fF>Y屢%ûUxҝG ~7!~Ğ8];˥1$6' oE ڰPEto^)by>gюiW'Bmȕeq`=E:A\`3tWT"T jQB<XR #=qDp]e@sJ2mpr}CyWGQ,!ILU1=P"b5 2'xD:W>T+2 Tȼd*R|<p7aÇ{h7]Sl0` @YTK4U.R P/$4hD0HN"đ/oNj.&q<#!Xx%߈(uIcZ l敆8Y- $N)^ƆzfG& xC6j)5+=D z)"b֐&K_ȏA^=r1%"YD Hb^!c\z1!'ĉ9EpJ04ls;NIּP [ tXĥ8 Lcٖeu!>)-ⓑa`HV2E!&Gƨ"qe"YE&7q6_3,NOB8 <@pH5"zN^!eLkNj, IP[ lRO@ }_;xۖe5kX7ymx 9YXI۳dI$ kYCri$l #L) 7q&j\I"" 0#f0 6kՈ[X Um*#<w`kV&j9ˀZfؘ=7zhvm\,'jeBۑ̯^pIBɷndXlf9Y8-Zo*&<AgjcѶ8y V`"ltZQ3: hkDkfݏo!4L=Zl^<~cBr ( J*tawLl@5!jے! 5Kfn6vLFrAr6։lOzJ3@<|HkJ17n5(:5O,Wp7>; eRp0ŁUs%b4)أ؈5IvCm`5>F'K Y37`{V sha3pQ|O$2b"0Iל0&cpdۖ/=PT@*UWh>fD 웙13kTW-v;;3"G@Ke15͎̊L b>01]A>KPvh}%yС uG)ض01Hts6 0⒗CoP $od*%n iK<>,ڠVrRXuNKoBc P{BxG*$h9,XP?F "&88O1@sw=8d;2#o/= y,\dKp+'bz:$jr\ld[ΈpK@,>$ 2ǽiɡ8!H 1uqq)R7$?~:0Sʷ-O67pdVfҙf [Wҥ^7d:{L2m+vߣE]CAKc 2v#1d ,, :כ'\YT/T#_ @Nx?/hтL 3^Xʷ9`X?f\5P)˝4"&G[83` I{b #dE`H Zl݉D0ϗ;]ߖ z?xvd;_ј:?lq8 (5W,)rg粘 e1YSĆhVQh2Ȟsl 3^A~SfR`c0ݐeC)SEM4<3unFN ~?oxm&ߵ2S22DeuPߝ3>5Ǟج8JVOfTs^d4`9F6jv6gK0.<"!Y!% 3/搙6>@վCz~QG`ca6şM3'}Q|5F4ΣʱeXq޵]7=!ߦ|q9Xi",Q! 7&8atpyFj7Qu[C); * ܀U ) {3eCma!5# N^ΦQhm미-|w_%2e(jZ';4uU);ؾzl.fn.ς#N f_]NvCF搀6J[TTQ7EE YH-`eaEO*M c} @|5sٱC?ay@w {ï$n">ub* @|FSðS=LrQ$6UDvC{xdQW6hDKf /^~) Fe ~c~J>sγoͥǖo :C|Mt~0G>y4 ub?,NԈt>hdjѨV۰9" dl&G !t0 ;p}{Wjwv62bf30y`'4+sH4s>ΐ5mcNwKb&&X5!2Dm7T5&H1"XdeBdOۥU5O<;OK-19١Xk.N{H4>_> UHin*:x dsot=qSs/՗&O2qD9w~m s}clL7'k`Ma%{!d 36|7u{4s0#'d]r*CŮT*SJƈQ3@1L~ =gYZHeV)T:emm[M1rվ39B ^vJ<.( (߉)/2Rɯ*tJDde=TgǏ;\?Y?;w^ RK=+ +H( =^'}"VmYyo(1Eڳx(Uvj sQ"0{R$!*jfz f6Ron쌐ф,N@,T&`vIq(>rˆ RϊaMNm]6{%f#-QoOGO~ @V2G7p{ؗfY@-L#+6(b@N qLخ,`Jx Im19bL/l#ggfan~d =p\?{ -sD|wt8rn~ߎcKEN(&8v/?Je_W^Iu x\adpb|IqV/Ҵ -<-! <) B.-ddW؃w}Dupz>| Hj3[ 7y~vmey00t%ԫ5BچZԿfVnƘe,zFF0扰<9JtG"^{`gX1ppKͰ"7$߳ ׀qs𳉧~;Ɵ? 4Byjod˩ EHNg"]Eb43 L+] LO $ [h fw/7da =[M 1|2caE!#2ь(&D.3(oy; qwg)8h%_94;Ur{' <tF lϘ@ѣ13wL?x)*z3猲49֛7#2`=wJXFԅ5*>/ˢk54M1bàHj]lo>"~Mu&>Lrx[sϱs̟L02" LJTi ^ Z F(1U|v&T @Tpc~`I,2vpQ3q?~^g8>qRcG{'Ο?pwwO<Q(X*qxZsx:tfGlyB&f304 R\Mɂ0X/A*83b8+"*~Mo55 g}b @a7|6ǿ!wr8J%~󲏘|g/8jTnLK~^mno4@*TG k/ZpiD @)CV|Ꙟ`oe7y5%Ͱpd{w.AQȅ^ΌC[OO?$9⋸v{b3%~RY2Iy@ORBtݒm )> Laxū\XKm{2ä:GyX?2q("pp&x[`}a#Nt eԷ=ީg`O?q|x;'f(4,,b) 2ܖB!JWF|?OeTvyB ]l.XUMp<,MDx,b2kWozT՗3]З>E OAXk,ȃ[ݰc[?lk!o O *p"&M";΅c5땋W]N y$Ic2<Xl,@+]b~֭z}<'f^Yx` R?"#E?A=j)P<2_ g:K)ҽyE(Rp {~j{b=>`[o!gީ8#' +wLQ]u+#C+/m`B(VMvMA}5 ~`zM4l-|e287 +C,RCA^6/3+(.ьL)`.G{GȚNU ,? S>g ϶|o|̈́#F>|+xV>.j >tE ׽?ۻOW Rq`"DRk JX8`>h1oաŘ3B |.[$~#D2ˈhxK8e[FX6I9 !؆L&֭Axqp{ݵzG~ :#~o}+G+gۿ蝯~+gNkVcEnٰa??xe@!; n?_q\^{C/-Xq1]2frkAd)x, fH -C\lv>mPs xbűw]mV+Dy!@4 r5׿{z6|]>iK`N'Oնn%p^1S{'C~}o}ʯn'&Aj3W\\. twEWYo 0C;/`5ɟ0>w9މ=#w=$|Ր΀Dߦ;Im }տ}So^ eZ#xFo2 ž$8)g'F|殭B+ ZMPZڔ; pIn!{OY WJ.?{6DIj?IS=_:i fdѪȉ`3pl~ّw?ZmĠ1@NlXM3%s dĬ8f/;睅\7d{7BwiO2+tXT%} mbnFҾ6_ށ}_ѿ)z]&A^5AH[F@2g>C:K|۴ !d#`K?Mo.ߘ͔/^u. lj% Cd0y|CNALO,!9.vNW&~gџKu_v~ vb0@E?di` uڰ7g•|_8=Е|8N+bm?F\Z}f*G`jU*ʉyx˿l=cI ?Mld 8w$'p2dypz ֋/˥/ AvE!E3C!]\Civiae<FQ: Y-a& /נ\j}jyXB6VhUSm<>7{ĉ  Mo~|Z? = pK<5X#%j| !q(|K6_fRU}/ atEXtSoftwareAdobe ImageReadyqe<)?IDATx}i]u~lXfB E A!@ʊbq~?ᘥe$*eYUVʩIMQ,9JّD27bX` f07oT{Se>rӧOC?~/V J)E ue+ kGC'4-ӧH_KOeϡ~3 ä0>z򭔤U4Tq".<9U|} Nf$?JU~Y*%so|ܔ}-3`)$0ˆ^^}*zѡQ߶_Wu狤sm %j-H;)l|I%]*_ŲϦSSj+*:Q'S_",7pϤPDF)J)ק2i/ixq` \~I{q6f?gĿ_-ZժOO 67)hW' Gvc=}:u#vXa$ $ V/*{6^{RH,K#N.L(^6x (:>V9}A7z>?F<IFϰq)#ʷMUDD~;zI(3<=ʨnEʟèxsdb"0!r R§M)~b У\6>NZՅhFe*I?&N+ŦG[0[ek-~qa4rV2eUbD 4 @#T\XEG<`57FHO+A04Uvd̦!:i0yAhm)* ot"mx"s9w2e `+^e`gNG{҂QT^@_!p(#_WRMl%aՏDO?fR:^xS;N)*IfnNV;)> L6ST?o, !ޱ@y't x;+Ĭl_jqw՟ .>l jd BQ>i)OAeU"1Cׁ\OVek9r1(RP:!icl(7k UGZ[q*y/ZM(T)hWRCbok{˭] Ӂ+ETHsh`^9.V&j\)6 hvMQIӵK?&㨑R 09\!QcYVH6 9 (ٽx]' ň[kM"}i O Le64WɈNhFӏؘFxTfeDR b#TzS-,Xeh# WUa7,ܺu N8=O5u~nY~WS-yع~~ vر .WUxg j˸Wn);ԁ7mB}VHyyvtCH~=Awyg4 Gazz:r=(iG"]gb0ի#!in<{/}i~tuu0;wnܸSl܉*ދ@ɓ'm_}YF(~:=$}\Ykw'0f>)Rs׻V#)$4E΀MknicziV0_D2;|QY-.L?z{{9sW7z`{mF};A5ѵU=rtvv{5&a| ɳ+2 -TBVJ`tvd6숮-xړ7c <޳iVfIao%k߰!y`Ctm[S [lCA͡/$kdf _J٬J.Ok| Ҡ=y#R){Io*dml5* !s@YO]؞%vJVu Tbs\VK'M;$B^6q= {*Hv1+T+ƚPPPoFB vc k ;?c *jiԘ2oK }AbA !+_^…T]M0҈WnD@^ @D|\Mߑv Y V2k_>,b qi0ۇ;lރFVS zjmD`arpW*HMhD^ix 566p;n7tƐ[:DKc@_S@ vj yn pev(9ssìd_`/%}?שQa|J\'O{7Y~ ,cd1#5< /^)ԕs`"_radt;>NR nY@ x']B uajyƍ fN"h0UU Ͽ㫲LeJoYq]q{WEܦӆ-wkERߞ>}˅Z_m?r&R 7iI:=R.CFjx#ɡwZO|ȺvR$+WRp&Y:z?۶nnhkoSh{Pp폁8{tdmOANc[v :x^\ݞFIE[z*>ut%9agSO%eDaL)CL[.٤\ /)>9_HB+5@ {(f'_<ꄅ }c/19He2P7 T~ofZI2=XHߔ#}r.L9$%? 3Q4. SJ1xGޥ(HͷѨ-L HԈk%'8;[Pԡ3T5 Lf bxu$!`PucL'1dѼn]lU8{$ O ɉ< -=h-]=ނW!Qtv8[nkwPwW3<&8sv ]!$A_gϞe~n gL: >KP.4Y3B =F*y]C-֔Qji}Ȧ2.=ϵTs@+p*O)z nv3m t?WK}Z dfILG?\/  ݾfgrT ޹}*Xe8A&lz۷3 W{B@Ɠw4wtAtM *O8HѠ4Rc "P&PQT6SwӥrRpDJApmfz kS|7}* ^SCZPy:6 kWYJ_j]Hv@7#f 8_}6zxFNwymN& 'ߺ"5p^R A"a񟙨矎;0MW^gaqQm{ԎpÚ@))h\yq5RXy_KH⊙ ;s'/$AWO^YY|py`*UHv<E@rf8Vgaڻ!M,O Yy͙7"yo,ݹMYa}494kݓ}u~}"b7=Va$I]Y} *L^'Kz=>Gݻ L1&#T+ޞ۾ TB{yu̲N ab?ӋR^izq&apx5xq'ps:٠"ѳtmreۡd8-Sp,LE0627s7X%6Nqt,E삇7mV(ka&fT"ô'T%^VV᭛7 #AYR@uB]mбMPiHU y"pqZ+30ra~> O{u!'3ڵk拵\/|/ƀ<} c?#y̑Ywwv;:]J5@-qztgFFS1X칻 7[gO;f(p,ՍIٟ\ޞbatLqUΝRֶԓzşCS s̓K%{}ٺo}}Pѣpo#^׆x{{5JRpo? ~Yzc~駟n` 2 ʭpWS0`Y,]F@* +`zЎꗡTQT/8eCD}6D`Ck7c++*> G,<Ioq,--?R*U$|3bB1?6'.|@Ҿ}A$ u--t^ -~iyG;osA{O>h7ir 2k162Ih _o߆ƌ7h ;|?U#^]FsxUD;Wqsy`68lǎVٔ'wGp~B0GZiNnodjnv77zis$Β?4guN5PAhL96kT*Uo 1oQ EeEmA +oyg</b8}@mLR'壦u2". Z"@ŀ:P_ D`=}X 7]?P(uj"BA -ap1%A`Ka`pd; d"XKA >b06M!P* c{3eub>ѓz 4 d&6BJ~H S8TR K"nh)T*] xzR"A P! g*QI rnR GTq   Aז@W٫@ }ll?A\M>iPvo]ɻ@@9N_Xrh&'@TpiEІb@hk!Dm$4]9y,LX-$Z ucDD\ hPB^(_4.FzޢBA`%]DnfpƋ+wO# *?=!lr 5J%J"f@/0 V鉬 2\ɐ1# ],Vb'B|iZ.w ՊIS IT@ e=]-,0! [ss( \3fkMN (b_ͅ춑Ġ:ca3'g NNva> ߍWi#P;+b.y(Q~AXVs4r"=AkS,d==q." g_ 9 Rzwzs1]+g_%SS0S{AC"np$E?̎9յWɠDGy§NNM \m۶$ ÕNظQ`ڭhA&pIC]׸ozz`[{;T`u_˷ض'Mk3cjq${!>7hiBnjl-uWũ8=<,2KDZ;oQ0U*_koLg`< }:~~$zq5I/WFR63@95J&L#BA8`~_S'Z]a~%S"%G'&WReaq B`J:SS}7=I]쮶oߦzJ)uJY@8A4%AI(>UӅP98aGk S}ڻl`0~54^4-wYDj\ ex'Ҳ=r䈪m&bt3㟏^{ te$rĨ-̌: 7lg0:z GsQcXzW73L A ijM/hD9 L)H`25L}?83:>إ˗o6е3<<|ߌ>EǭšY.$DȫRf|ly0Gs|ҎMIX{olZ)]do9MN20*@,hQSxkdd7Ϝ>󼖥}ޖ1^Xf*o|Ns r"E;y$]߃[)iP,wD3+V-SRv^$X- 7Ruq+^7{Oehu*S[Ώ;1l8Tpm&N#@ 3.Bk 3 Cn@C2$hAeeU@AU%)TWW"X8{q;=S3ggS>3}3pq@gQKnݻZ[QK!;SZt'Ft, F)Cjx fPpZٷ}81XZKJ0h0݊wqAU_ 5QׇTI&} mz%2|/TK7+5WcEVfϛFD)`;K!&owU? Z@rtIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/128x128/displaycal-vrml-to-x3d-converter.png0000644000076500000000000002020113230230666027523 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe< #IDATx] ~9q&\rDAA.1.hRY$P,U U)M*[n4k`Mv5(\*ᘳjy "ByW+;@;@;@;@;@ɎP,*)OܴsT))JN))L~{ŎcIo]l]`i#%l~̴J0fҎξs?O\}j4N4vz-k2ؒS{daZYR3=ӆ$9Ӳf=O>]׽[I~U8D2@Z|UG xtq0ǁ?oRR̘Y6}r'tV<|G&g"\0nwabNVBıi^0$KZ1NE ]4OF/OKiթ*Vilb 2 _0+"Uub&\:2-tzmJһf圦+D;㿶 "s/TRSɶ;>OybSϪnA#y_!E)/.[ N!wiGeU9to]s1-;"Gg5p9>:ak\xsѪ+} c s:lz9P^_} n!`Ac_ٙO}RŤҌ/J4  '_CELz,!HC6eٔ9dz+Vv^S:1|Do|9kXC B#3(sX_еn͍=kVm\ډ?_ەO}eߣdؐzyF;R)s^=u`Y4?=FyqœiC[&!¼2/N* a{M3A߆ĺW GD C9*CC.v}ol?spIz7$ׄg|}_ᒱ%i=rPBā >:o_onW qQP0݇M̡cw5nm5?ɛRDI}uc ̸5lԼ-OdW^xxfcԙCRnB}gfM|=)gl3 ͜Ԅwݲ}nOU>EotP`W.-;"iPDSPkHKK&,vMէ]^qK֘8lLvŔ8leE9m4t{/)pqcIA1G#)!4>PY??2[Qaa=q yzR<4{Eګp㐖J nGF^$P>ޗ?/l8 ɯ%B^VgJQ8.9 PL6% zK^g@KwMctaYpI@%Tcí%%Eu aB;5htd luӗ>&eҲ` ʡ4?]&\(}8 sa!@ D( BRFW1 *;] ;+;-Wz$@2vcAahX1W*_PA_ęxz8T3/ P06=Dy%9Duѻ ct9p@"k2 ~ jF9|xBv2S,tRo|w_E}#@-}C+$C*EN?/{2ak8f œSu!zj2/Yоᰡ|Aop[1X42{6&0EAXƂXWJnLQ PG@r@90ax ex"uhsD@DN$'!K>(I@uW)8:W#+ @W(7 &-&EV8 F".|qgr$Xx|ͩ)>s&3H>'?GȫC+UQh~'HՄ2 .C E,{4{aVg0R5|RXa$q# [DQ$4P} Y3`ݖ9{ #N< Y݊ PpLS$.!/h;*ծ@w*ڇ:u!HmxIB ̎ŒЃ)ѥ0eH,(Ft8ϡ44wRD& 6SmNb @ǁl $tFN!q4|8(wÑC06${2!zSzEĽ] tGRm11[3"' !1[Dȶ[zd;׬9D"s{\Q9Ã9xJ䬟MPd F!C) !ݼ!w𣋞xpF0̞p1j~D&L;Ak;'}84P4L ~OdUކq>|xzM:KC_} }_{Vʋ@@p CW}Li k+@1?`m8cϹAln50̟p r{};E×]MDDF4< Y1;gZl?HTf%BXE~ՍҴ9y@(Dᰇ_NoU02NAGhaJJQ?H*f m)vpA!d;'rI$*@{  &9[xCUO9;2F%A |]ʹ]>be AiLOM/ 'xm|c?1eqkF9CQhJcO=^> 9 @Uڧt5~NC[@sT/Q͜À&z1 " &ZQ+RA>J㄃?u[iJGvbJEp޸\sXBCʘek3ah`*4)Yc&ՋTK#|z?UcB?e8>{YAFyL. ʑAlX-6`"TL8@ a#2BBHC(*D}8b U3ɻZ/XVQJmB">-YB)e Xe*lAFV!6[ P1:Q0 ꘼52\ BB bPkІD, 烼m` ! $ މV(E.f;~_'8Xv/fM@XA!(₥ѢmN082 Bm"JCgBţ?Q6Њb HfP6vZ6Ϣq< UKH|즏&@iN?# Ty(,2]S0F]`RP@X%~:j:"HCO:1VEڥBmM%lW?Q&) B`>( u~ 𖓕:=]'mQH+Z}хLTBY\ ~e~?2.q>U0A:!ڱj M$¬)el2ERah#,`cHGdU#arA|*X%Rz $82ԗߙ@NອIא-k+pcAĚ@YG9D͌ " | CgI,zu" 69{3 %Q5 Lz=B !x"TR:;d]zDbdUrL!hVdM͸ !.ekYU/(c U5(~iøF֮n]IaFҪfB\ QM(*B, B u\a6t"RÏLMDPLgfI:frB(\S16#PM9JF$C2-BaO ol*>BBp@C/g~*XFfK*0D((g ByK!nmV~$Oet}7"͍ȗ(S6LIzĊ ':|UV?SUDmEz $Br YIgRᄐ}pـ?j+09L4A s#;. OP Ś?5.`HDNC!1}bUk^ÞB6u:ܶQy.E@(>_5t6!r1}hRĪn i Vs)RlB}̠in`Ux`dt܄W) 訙 e#dVʢGQ!1x@0X?(T Yw00:S@Swd nv%ҩ\E1y9 ;X 6@N WMUnf"A9]VlV6/3]8laRtyRR"?FcOhSBM9(XPhyCREeiɖn( E w&1 ܹs'i3 (CpDЪgJ)iiJ.`A>tR/vp掆iFؔC ٿL/cg.jf ƐDZ lN}mu'.R?%^l ~߳=~yxB9i5n݇]/oOq^Ð=t(l>.I }yCzфTªm(Q!JD<i5 sju`@)Pz;zp_ÕoԴ[~pO~ >;%ݽ!x9p8YG2E"B^J&*ƯDːU]UjG]h?FuӛV;0G"D@ȝޏ׺9BѿF^R2gL<$˥$֍ !;_OєG=u_xn3-ZD 0Ar͝W-р-g'2GgO1yijVa2= ZA&¦%'lhS|غ˝ϵoy ͗yux9@05h[Ko4iy)7)k)??krFLY7"]2F~N#՝16'lR(q&/ozuٶWjD=?`R6C_gW9rGܶ:x\>1D~FMס?EQT1匙ʡH{Us>0vַ䏾9'v%&hN֥4'nk} dEyia|_nz$p׷;ç_>l=rO.OLI%`7/0إez;)?rcOo`K^G5nͧz^ 1*F/MϦ!8 9ծ!;fVO]{Gږ-|XIRyUPVh$`¯C?cW[uӳ>0}늬|/sPZPo)N4]Lӫv|G_-N~>h 9" %cx7Kylws8cc-)t4QxwCZ?kP,0Vbdg"5D#=>P'$plǦQ0~ Maɣ1!Ay.bVq4v(?XvMv#e fE4B3{ǰJ96zy)s7*/OR!݋jqM#{TNr7B$<&|1bľs8P%c_NRBokGg=?9~&=_v *O[:7 i" !C#x9(^WK1 o<9BSdF/ݻhܭK3%[Mu_\]Ӱ*.#%inH@ ZJY[[q-Õ?5ť8m7>]DdlST>I+cD\VFo jhTΕ1~!~gOlYjD^v34 @]t0ymQ 8BjLP5&G8@"ܜ7qS#"ƿxq7 nA IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/128x128/displaycal.png0000644000076500000000000004675013230230666023445 0ustar devwheel00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<MIDATx Wy&]UgfkmA666ƀ>J%/u(ՆޤKn-ғeG_u= v{n0`Qs}L_?K3|}a=nGI+J7p[߮@O/=y" -5e  .tb oEJi`C4z㖡82%(ߌx.%H6)6\*iR@KxNhm3n-A4f5[<-i$ЏDw1!P8RZ#mKw\1uD?9gq^}h2+nSGP--S0VH"/pn%PGIW{EtTk2ߌy/DF/K-&x.b%1? 1σ}#~F6o!-J!oBހ8QOs7gQ{,9^`b kPHm >ZyAz{Ժlj?1L9J0%Jk)4є4(UǁKEi^ |+)-#( ZAqDo ,ƣFsZ_fB|9p 78o1hQ#g([Wiʪ}M7Ʈ? + pv.D)4PKhf)j>Fp6O;6^B«q--eբ `3KȌg@eJk&9QgJ3ӫ5Hߜ?!nY3 ٸX{}zY*1La8Pjo [^rg 值)3h\WIyA R,MJE!=-5HXD69o?Ι#)-AJ%SMg  4; E3+/MJ5o(kh ڥW ڠ5FiBXpKCX "{zɊƶrg(B%Wnˑ𽮀~n`.VNiNq˚RM#ʍM^Db ϬǭȤuq/aM0Qj_Uك12W!)Q]+6uFxs ӯSpKO՘/@R.* C؁j:#|U~Ư̲#xŋ7T@,cRQK<^[_R A3+2R9f)224^TϟǏ(HlnܢՈ` f1~FG[JxzN苐jU wT';z&9"w~\\Դ᭴ێ D$onj |RAz`ȭv^FpfpTP~8 #c!BeQ bQ#\ y?!.P!<z<ŗR}^dcY6nGK4bFN}.@ ,::fAMaޯx3c}F/ywӇVnfRX%Mp2Yb0|q9CO?GLw8ƴmđYGAjsqQ?);>dق3Gs3*f(`9{4{ߏa_/S7mZ gqt"֟E[އ8ȟ@ROz]HDP F ݧ[ ɗ{(0 >cĶ3O\˭KkkFb;[{Ul `4ń*[cn5m;0$tmU bE㇗.Y*nD!)X@a}u &R+|^dT# ҹVH=85%xw/Jn;6JbjRKʉt37'5'n2#IBi mWIҨ#Cy>nt%尽ռ|YH} Ej- aaƽDڙ/y~hhp 4k)4Stzxͯ+wPsDBJ:&}\3 !DVFq&)õj灚I*XpfxԄX׏IcLh mb#eE0;=:ޱ0jW☼O&b-fPh&"c X5!Pt".!; 3 eb@ #x]AL>2B2}Z 4̐iuo쾎Bv) 9X:_BHYR1o~Yηm:όf;ɄfaNщ'>Ӷ~$s~f 3Ωy'頞 OXHh~N8w 43R4];3  ,ܧ-Irl o?ڭjȕ&vhD hFr|{a?P#?z;>7Stsqd&cMF^'X݇% YCF-s%}RPJ-pn2 D .j,C}/j0bٜєsn нoA_j«HC||~θ uLԚ"4͛#G=\Z~_j$D鉚HcYq8%`:ӱ)8a8L_{.MᐅtIWQaH:~^B4@P8Po|H87C6ZO$6H'Kg[eǒSfͩfUxhk){CV{E6ޏpA!J9Bp509!tجt ~*!tZkk6pƸ04 T\ v%<ٷ&@1;0lJ=OоDY7d/vэ܁O Ю)//@ҩ}$aTiԿtdҚ=kVׅ:ԇ 5$ (Y@QFa;L b걅y '!K,`6N-s` `=7nLs!+$#BAs0%~SP7dC^Ab#aTgVgd^&\FQ5yHW%ؘ-pT mne!%;cdm\):cu֞v?|Wj!DT}/as.Ó{O9dVOWY)6MQG'#j2#3 ITP`Q1B<,NѪeI=%RȪm?2+E/ i0ͽYh,5UD~U+g?e/,iFc% ãu`Wq7{ě\ {eQ3 C!|q'r9{ɂMkf- ֔,LD\W*a;gjbΛXuUs_;[v2(7'FM= $?x?0~?h-.I֯\.$>[eU\7 32!B8O21,DYQ K[ LDI; Rt>&wuY+/`E]ulvC0[j?/ờU${=n16 ^OTZ/.P%<i7/n\?!RT~ӯ9 ~c#rB}^ҹEڜ?N B.| @z*-`U2X} }^IK P@PUm??ʵ-X9XWq( S0BI{WGV\p3&~SpccѲjᑒ3 o.f>rB2Ll/ r!H%v 0Pxw,q9(] CT] L]-裯tškx\lz&xrĀ>Qd#%>zr`x7&.Ls,._y?W&iP叫`+;X;X}%/WwT}@O0Pt5# L'R Fʋ<1<AZ&s^+2))j;%շH`OE3'%# n+kϿ,׶3n@괮wgm k6Oپ. )WHn? o0HLd6˘qyD"[le{6g7 dKbD!~j%t^ F BH=sHڵ8d̓S"N_-J8}u}ȍ x#}F6mΜ!*'up¡u3;'7IX Ėi t~jT\>֨E Ѓ4T=rˡ* ֡ `!*šy<R}#\Jt=`xhkaz?| $3N-p}Qv i/J}uzugBgDMlmmPJXܸIapOڝ;n;kLW(9{֫Wk/;%J=H54T${*Q6V9i-;M[WfҪuVL0a!3#7O HVD9 #E\Y!zݟٴ=tIe=^~o8;_t3 AGԐ:֣ W HЂMɵ;  3SQbjEbo%׎ BU?}.dW.e{+TWyXVJ=` ªp*{<"67`MaQQ+ x&oh|}̖5mUk^t~`'4 >s`zn۹U0fP5DQAYLGǗ_=Q /xr+ Ȑ.1 3_"D*2\N֒ R)/`dkڮ)z!79S5ͤdNM6lnTʽaW'R|]ՃU|ыBZ1j=L%`Up[!/ 7s]ܣʇ37C7n,NѶ:æӗ__벓fU\ &} J$*Ѣ}Ql Tţ.#@;D&J:r؆?Ȍ9([K&gmss=j__!ܽ-A@anIL;WOAEY =]IʂlsN9 25g7􏎧>ZVK3$9hNQ w$ԉ5EDЪ(½%<-VX|g0r.i:f8sZ LOtf=]xF'Kc^MVzt-<>Vb0T@/oY USl bkKO>V><ӹȀMzO6\.T\#V Q)~ {O* *rFAv *ic`K{2j~7Y7:^Ɛ>4{EzYrHQh'~i؄ ]7 ~ocFY 3@)UsQ;p{</X.Ɉ:4֬ ) a8v 2TI?RwQ@5Z2|U%;2_ ,i>{߮gVTe,_B%e2Az^)(Nj.ѲJh܄xJ 4L7?g&'1ೠofp[Otu[ڰikGrO!v0CNy88'km»jѲ-`uUP#=9dOWfN&ZztB=xgLzf)!?yh&'1d9fS")ohON! ۀ'Ƞ"3 Gзջg:u,? P?gq M"56#QOmYff(=meAC4GT,&LC 1mᒑeoWlMeNsEѠW7ࣳJTnMzՀ!qJb9J,.<™1 ]wP}{JI#YVpF.G 7ѡ#|+BϒĊL_+"O'?b ٴK]Pf 3J7 3CMoo4JWj_;.zg1*AYh$\h6j^);3]Rl ¸)K_yћ1.}˥v%>FLL}JdWRUE@{!̝{blഀ 3xh.E";{Ķ[lBupK;⧩ce}j~NI{ 6Ɨ4QuӐ)rcձt-R_\@qEm&O/y&]'1%MT]X ', r8f@V:J9u (!,T{] TďjE|+VV}iF/&xl?fKl,*6 bP۴z1CTg P7D2&# Lq@ *s=s|gLcI%a*T)]5 mMB2k7ʕNG`Ly]C05/OQuh:r `D[pY yR4S$pJ%>n9#HعkWu..`tC>>jþỳYM12:t~= ri%[ U-m9 a476rM-o F/?"oY-aDw3>1u"n5h4 Ŗ;pj˺fepM7F&2zz/=<eWpA]:e4{6^X``C(-цWWdÖm& (c@{;is^%]|Ƈi^C 6%~@y(dI,,.a ZtoLڬՖkpo"{Nˬ؄UkD{O4Ap`yI2ͣҺ}VKU7+ s=iҷ6CcViD.prϾlHxFclx- =φ*SN]]NLPnAcy㥶ۊGHX5#?{LԠS2V+-gMD "*ߜ9p^/C v-jXukDSdBdz;) ؖH~ڛW]YqH `|?W10DCaoU9)T38gʉ]hHSIS?MsyX†to{j8383W{X?U_\w@{Ѫz"xj\a;S2FE)I<^H)$gT`x$bNqlF:ކ˘ "I& N,aM+0' 9H̹M̂jξ6,s,"c+Nؿ_2?D~۰遢6aJ]ڎAR̰:[5 ΄bl %r4q4jX5hŇ:R.~nVNR_-"R5Vm ӽ94m3 -$pl>4Y}F &WNyW M;;'%!EJA{i.,J%3+1YvR_2~+Yqanj>ĚdyQ=s^`>12kAI/Cջ'on $OdKddi^Y }H_PWb, h!E3,9bS+i^"3SrQJ$NrdD_ZقzKi>bKG' hm^5V[Kyɧel~pI](f2~Kd Pe͇'NKV.2.|&`aF! 4i]kCmg'|y_.T}?a5~~ :_eP)&{B5g;sj̑5=`## }ۅ̵uT0|KzSt֠{Cp)&`dv+s>BCJB|} EYubHY!f4hΰ)jXءxbeE ^a!y&Q-S *m3%v-r!)`~snQ<`]/Cco3TZ_"u(V[:j6Eq{oѷEJE*]]!#-[]^),'ފu qbF9n~=;z-ϗgrJ,?4O-(3\V5`5??1G]p쌞 d0vtTщ%HO\ Lס]-Fm"$r蓙nGxkJ! 4җnΡK _Nݏ`2@ L$kI C<_.?-vi%N$FiM$Fx~6c ,}4MR.i(vIo ,+ɼ|r^=Xyln/>#UM Y>ikrNyB̜ӈYRKed,XKg_4s5/8dE w`0QsX 僋=ҽMDjJ$.eat`Y;1.9ciwO'Xu9 ?~geq'f`LOtZ,+& A:=tyL~03hHk >n) Zh7 BoVܦv7gV`~UX/كZ 0Ej!TXp>%Z3G4.$Z&Hƒ7[*׆m+6͌i[ѩrs" 罧V@|| 8gʯkUgWÁeHYdt!]{xoo_"U}%g:tNC>n%#`%_x]]@fCNᱽ q/˸N t[ 訩| h|xH)<7zǖt wb-NOv8'[I`p*TnnCa 5B{}DYH' $mGiJ%d[GjP O??[0z]eYT?|3'rA3JE=t]F'&@{ zy?zVjٽ "f }I׶E''d{7Ũ$m@W ^1Wsw`W%嫞Ѱ}fjpeiGv :ӖdKfq`GY~Ih̠6(`q,2 [uK0ʫzOd,qK &L7R29^o+ zh_{&zǸOJtmbDM:%qǝ(Z [wۡ'CV 鋏ɒ~f֡F[fKm3T!K0zcHidJj'(yk --#(RXXV@ska\Gs0C-mR㨽 9pPKe:Y` =i E,Čɱ'7D]VɊ *J 6ZߣjWe5Z=jJiIM@u˟BmF` pF!JF?Z@m ]H,ݝ':ˬ&p0F eh7C#2e 'En!_ l*q: S[?KyyOt?^X"T3џ-*!{A^Dt% NT;T7 NSw/̜}_;K-a|!3 H:ܶ6=L_2} q$q ʯVp1l$Ё?CB #"wDRn 2bl֏ hfnݪ@nխD!i!#dM@]ț [g>]I~)#_GASĿD1plV ,@WQvC RcU C*$]w\PgEJ|q-P%~^!0m!0+K,8PWB1eĢ>͠L@>R}(–N CVUcڢ d* Zwbf[8%iwob/%k$iI+mѨЙʲwx3fxnv[T})- ̂R8 2bN%oҁƜ]) ph,t=wF ɉD .iEkHږv%ڶ:/oD2.>4 I_C^T=bNܺH6Xy n`RC*̟ClW`R诈rPĮoizc>ϕ>2/|d!DYjC5%| Pt͝DptbGy| *@ U&8Qri#b5$hIxS\`uM/9|jh4tFkGJyuQ^&rcaƈB.j. \m=v,)owap!O.w*:@aP, U ;[h%:(&.wOBb0l!N`퀐msp> x茞y-HBjrPEEsǎ}io?1(c~`uG񮻠 \q9 KhJ"pfz)P85|+v6BҧcDYzBrC߀LP O3 ÜA d^k:ʟ1K ,(<b=ˇ^q8@,#g~m8k"[EP0vR]aI``~r_l6/I@J`rh-Lhh2yg׏o2k~slz4%19*k?goJNg76UQD =+¸zߒJs]NMAFX)+vs {,&&r-/,S; 3/}R=wZ晥 ;B_JMt50-pTfE$WO@nO!Ҫ}Nl5< ˕L]aȟh*]H=ףs`%)Lh >#\<?h3_-{{hW#(&=3_kg`x%_;y-0bm'H; >xAwN^2*J6STv<W*`5Pe$o_kP}({#?:g zjLzO<'rMw0P9eKa‰ '9o3x.Wwip^`` DX !$Jp$1vA]A@OO’<ޘqЦ@ gfᣰ`/- ܟvujK? ?=_%HQRV(e|8~F"OPo纇vOyUd@·~L%nMĽp d# 9%"H۲zؕばhJq'_T=}Z`/mk+Fnd?-eZ3O,,O쇮[5 Lгf[(|?#=vTMd7v $]_E,. }߁!oo~^s^Hb4HDuI4@E{8QC&6K#v~%1,0[Yvp#8" IB6ZڜiH[0Kn=nsa2N)2`Ҍrn7~?-ʟl4/7ol뻁dnK,U4- e6*H"`Vm0KwZ!<^⸶X`N.d-2d@Q)"|0y?r Đe"gwA`Q>J۝'#g%@?c73s0j< dQ /I MZ Bh1M,+W>aikm>{XʈeiIˊjۧӻ/v9}CP^>sJ[?w,v];߿gc=-zЊJ-6-%Rޓe]d ϯFYQ@O$ 1fC@ }_ԬR3|}kk@wե" ͟~{c/y"}NVLכ-шCb@QWƹB*hnxo)-i/Feali>$¼eo5rkS.l0?Z~)KM`o Jz>*(Ptaҿ3C1@DqH]76o )V5tvtfLs]gv_k]dXkM/o;v߇Q*lLJ.upL@Q1 6NpfOK)Cg35| X?(vݺNr)_@͙~ݞ~VKs^!Wl?E  rX>WN;4h{VsKxgq @NB JUSF '*i7j }si_D }U#vWqrP[P߽>m+]ƫe|hݯɯP&ֿ=w~kok͵jw{г  a/Cj KhnrPSe  , !uBY6a/NznYDС'o=j Y#sd1LP8&/ko;~BAQ/ P;D꾊 ʊY(+ rSoщXnA۰"1 -f,ȳVh{y?}羻xUߔEdυ p~-)mn}\(oNJ:}UGj%3p媮aj0`}+*M^R|#~ @2j*_tM?2C.߯F/P{b?}߻ƹʑyU*Pd8 X@x`W 7/^??>pOՂ.F8/M\hO#'a2n@h "/Y%\/}+Կ/Hr׮MHEW%sh#(l_Wc٫]in8/"q' #_!?%7f:Z4{mGFYZ6P9~e5Ij5tڿyvؾ1Jr|VgՂiAsvjOVL&n'x^#~etQ_&N8{F,#|7Di_$j/r~}~؂6t{H5Pl1x0RXVs$YD{i,-ն.%T_19Ǿy/gNCuU7 Y)RS.kzTahbT-F$^3Z)!@_\~?mW7Y QL;`@8,:"^~%Z JDTejGp @4C@_}iώIYM\{w>_8ZIW}4_E bz8o  >4w2B#e7~_Egh:րb@&آPSf؏& qKB|Zzv5Д0>φDwؐ|Nx(;*oү\'? foDRcR0&]xjo= p&0 ǎ-{ jc?]_EpbFY ?l4fo{Ǿe$[GhmIAz *d$oȅ#}xd|ngOG^1@n%JCN^"?a 6f(FsMp"%esӄ#4fH_߻x翫bi5kh&Aw` Π߿{P{^XB׎^ 3q$6Si;rѓG4UΞ#˅ot=pXxҳD+>pgM Z0c/%D?xeK5Vi'M@ Y tf@1jNMkTE&a,dd{Os ~A]1SHQ [AdsCUj= :wnuX4fߗMh{68#5#-S0Ol 9`&ps->jV'/x^5~kW4U3Gᣪ81LL5RMduK k ]\je i_ ]Fi~wga%{$Y%*MKUH0`n!>Sx ́#4'k2G٫hO nӷ]e}7vg\4>uZA?P !. nLk6~M ^MKiKU3oM'ows~{sz$ѯtp~(u?n.B!5mJ5LD'MD7BFbUSಗ\9oyk#׳AjSB&S`*X&ojE\Ȏ"AωEoA^9?穹s}X%S\ IUhfxUkT)PWv0a芠LN-X~jI @5MEx& a/c``Zن5%r)չ)* P?ߩ[v1Vz7BxꞹoanI 5ڀ-C-rǩKnW[ ;aӿ n>IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/0000755000076500000000000000000013242313606020425 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/3D.png0000644000076500000000000000145412665102050021402 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڼOQƿ;CK;С!(TƲӘX4ƝR?PuDq15.\[w,T$qCEjyHiK 3x[ʳ9=OƖX:b9T"IJI]ݣimcRzvqrGG F7*W!w*jޭgڣNUEDz`Xwk D )uڍÉh|פ@C2ioAB{ʳqiVwq*p@ ;lI9k$aYsMa0CKI-u<ռ`Ku=ofF9E(mo?'I2! Ej]kfsrXjI M(MS#ps1qBq_~Ajr !@-|h*J KQv\R-X]^l y %ZrMPKG0ڬ1f`ױZxzN3.J$*bP2zB A@k9;b~zֈPL m$fv +xns MXT?Ujf\BGg' L0n%sOStu?30Jr?Y+7ee?.ar(/IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/3D@2x.png0000644000076500000000000000521412665102050021752 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< .IDATxڬWkl>wξ]mNl'!IiJBZ OE*@JHZ*5RZJhQ[DHiy$M8$vvX{ܱ[TJ rѬwsu](Jc26$C D$* 8t K)7uVFO3] ol\ND阖.?=<,I"R A>䇷ԯTnXև1Q0-tGj{{s}w3g9 2v]__hkKDR&8خ&D +n~Ko/߆?|wPr4F=CH&@S0R Bb[:ϼ8.5T'A$@h^DRczJ\HcHiH;ė78KṶW:B };c30f02P6A' &+Bu\!?5U,1|5u6]V́>.D]!wo P.5=/cZ: u0-266ߤM#OVtnG`b]f;"PpNgMlV֋% r@XELm _o߶5V-3sy>hǃ*/w%z4S7;3ꥀ`Ztk>1UѨ!8PX_5|U#.VAh ~,KP>} %Pz-6QFʵ 4.OUgq8@%f P`@Cw%H Չ9ȼcld&2zֳyɗa"%G`d\49 u[H-M,Բ ("--`:*sOH U 874==F3=0 DvEX1P^YԀ/K@ScU!9UDZ9 B!_ޏR[ ?Zm+JB0-`HT01ق(ؖ]rr]2X[)EV%*%Aƛț-Q1g x1~_@DJ1l#'R16;l!EߏrowĀljh` J ~':Nu/ex`=n14L$g`JPXeE j14[;Cc$a`TXal:zNPP71-Wՠۺc"Vxܧ E|6'a;3I#-PBk%0-|;tDM3vOj5LrSi/Gi6T. آKȵsr{)@>nR]AC6V2Y,[5^az<ލ߻S 8E@(!*Tv[ti:p7H^w9T_;)d\.hH(FApx">E~F4[!s<(t'&fc?{qϋ'74`Zn疳kIlȸjvpyDt?hJgЎ>ӼX& VcےM+ui?@]GŠ@@j[ "'2 (AX"g,ЊUN_99𑓙w>FR^vo[W֦H%[{o?*V|T S|ARsv1(pqѡ ^J|~D*SϞϝؿB XG .Be:[PcKk0Ғ\# K; ԈvlvԤ.m|zJ}1)=;Q}E#&Kj:$!Ԫ\w%u ,'܅i I` Lyc"w&lw-&S29+^z5 v?A#V혢k٢``RB̍L7gMqqc[:Tp8LO?4.ϳLf_u%y M'mRSSrqs7Ԑyr/fɩ#G,堫 suۦk;{Ԇj2YW ҅GZzPr2.LA֭tBN4y*_,}Dfk (eULuCWAVm`PeCZ3IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/applications-system.png0000644000076500000000000000102613226307131025140 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemehIDAT81KAM )Q4Vl?A;Q ]8D۔bQTT,RBXxqWj{fᏐ7Jr pHgH*lM :ΞH]ދȁT Zւ*çsn9'`9`*|@D΁X\jƘ4@v=C1`7 t"8sV5UM7`:ZXF JqMDf kɀӪZv8L&] 0f E6NDvQ];J^e4-I^[ -C_z 5IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/applications-system@2x.png0000644000076500000000000000162613226307131025520 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATX?LQ{\B&# J dZI3h,LJr-PCB- x$Zx6:ݛ||ve]ӯ.Um ( ,k+eWqO4ktUWWtQD.7; Ddmۧ6`f-. Hp0ɀ[ꋹn۶ NdgޘdƋT*obb"WJl6{g+'088+ UCY0~'_ HҢ,@Uol}a4 ^WYP()-~1aoooa@Oy"?33L rS`gD-OϗxXh Tq!u&`m{Cϰp[H0 W+:LjE_ T; iq h"r#Ly^%QZ vyhiQdZL&m)q wvvNW&6H${"b 8TuNU Bmۧ\=WyŊ\v]8uuu: דCh8hj{ƚDly<Uu#(%̏qs4IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/apply-profiles-error.png0000644000076500000000000000130313230230667025227 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<eIDATxbf̀ gR@lb@_ TE=F /`,)/$"?ÿWӻ?k P`ZP͕Zd Y9(<'G׀zCYr l,A |ї_6<Ҽl̜@9&[ ɱm:d3K O>=9'6& 2 ȮgeN<=sdE x d,0&]yANKXaC6@\U93kAQ =& ė~-*i--xϿPQ#힪eD|Suŕ \[>6f<1\E=j62?, 9Ļo[h)032|> dU?' S )-!};SNGo޻i^o=K _{- b(-ǯ셿sx1{gfj4f&>apxϛO>>03m -bR|@i@e ދ zIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/apply-profiles-error@2x.png0000644000076500000000000000256513230230667025614 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxWmL[Um]Z aa681٢sD?ic,[6 58ej `DGەvpkK{0M{9{9f_ ;g̅`B0l6 6 `X?89|ADL\(%$ǻ\u}9innw7f$&b؉LꂎǔeY<\&pl]g, Q0[hYOB-=M% °E@߯RkOV 9_ЙO43r (K  ka鳶J2| )|* 1-hZ"1+4tBɅ:.%!D_W!:rNF΁J{.X;o/H,7r2l=+h ?Оh(e1 /8l0²FFQ[v66 L}6&9<7i{{Q1 ciLx䲟mT|l=Y@%,NDyW&~یsH5c[8*!LksXFJTe>@o N`0,{̺Qōȓd zg;*m4gGn `w;pJئa`qp;uYmLG"82",,#n'M)?G ΛfSQPB,6'RdTdFbE!"8 .L[0z'hl_~VVQLHyib 6GbIiw ZKYfqe* xߺx8=;4z}ApAnѠSUjU\bbvzXDo:e&oS.?w=S. pF۝iT[|IzW`x^jr;V,>Z,1 8Wf}3 H א-?֨D%:ӽqSA@9oܙ#=+ʨc@\}ߎ]zZ]狈C3^7pӄ_}.TA`A$/@D\~d9 iK1 D^Xw}L@2!,#^k7807it1E& X޾7G$F^lt7]NsHTP%ʤp|8J,x<']y^R]N1i%X1L_N#cjB e;`/ OIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/apply-profiles-reset.png0000644000076500000000000000127413230230667025227 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<^IDATxbf̀ gR@lb@_ TE=F /`,)/$"?ÿWӻ?k P`ZP͕Zd Y9(<'G׀zCYr l,A*~ Pl-g T2h,> /j>{HYkfH3@.pYE^?.Cçؼ2K_oy_2aWڡ@b ?_ Y(p& Ȁ~ (1k,(ο_\;~@\["6&FIVZ@f)PRI3DDt ,hC{7RHSM b-w}?]>-ޫ_i ]Ǧ;8l,i/ X/O;p p`lx /)I>o]Q`kNm"L% +!.K j8ڲ p D=fI=DLxK4ty#-QKIpȭd7ddF'l@i9ؙE_PI6:82xy~R|" D7 PY%ڎ8nFr% U9n?@apT5ۍUU3!1SNݙ ;ݰnQh5%kk:fلE'l}6s2CƦ =P%2 ? b?7] Bbnhxo~Uzr0Z`ɐF:7^wY?2qu!p*^$m4"-`fX SnNhqۓX6t&d$p8%E)[P]ᑾ.cUuk0{߰IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/apply-profiles-tray-135.png0000644000076500000000000000203413230230667025365 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxLRLeba0Md0*[ 9!p%Z:3tͲ$k lؐrt6 `:;ILڇ:" $ Tu4;Zw|6='31Yay/JI*\i>!6b,`^ܢi5@6F.Mׅ~ZseA"@r !^;MR!.C 8>ÂEr^"VX.nVU*A0 mMyE6c2fcz!WKV ;}O=~?am fZ"_suib ̛yei۞}a(}cuYs 9Q#lH[ܼ2qZ7Wxw}bêE%Ua>əfÁDʉ612 lzF{,䱻K(4cQ#X|g8fӂ` 0\rOڮDcZmMd咇$Y!*g ƯCߝo/+sE1WU(EEG[ 91r,IQc=-?vn@ #) fЇH/+Bt|l;ȒW Cz:sվiB U1!R 4.I1 86߬o>Yxa}/fz4jHx lxc!잝y믁Ó#4Y@iTؼ4gm rZ_RTsi;_<2zW[E?^foi3ҁ$X4;u Kl5LYT='*v<X5V6xWBJ\YG.%jw%$Cie BbGO5}t2âR rl*@2@k0e|:]KXMe;usC1cZz V95!J`%7]!pDI!@/gS8~Ob&Tt)5(P<`{ TH0Ӻ= { i(KJ@}s%V]2l>9e6X hȦ%և혥7pdXYZd-,,^FL;)I~ D;UtW"kEb69jtm0k(xn<4Ե^E\GvgYDS/\8 1(>oxvċ|U}D>38-s#ȼA "ó3α.6_iqr vIlLFŬ~yy?㣊]r},p*BΝ>1IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/apply-profiles-tray-270.png0000644000076500000000000000167713230230667025401 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<aIDATxڤSmlSU~z{{z7t-nn\11A6/ёJ$a|` A",΍!vsrnyy/&YO7d@NX0mHS8PJ(6v _p6)W`]n%BMLY S߯'N|-aPrƒ񌝱$w<+blf:ӂ^|l}w4ԯ}YuI"=KERҬ2V׮{Gj{ƥUT 틎BĜ V"hm_V d_jE}6ʆ~;5_`A偛35zXsiBHҔ"DW{+h+$P}{gbQR"oļOhfYY xΑ^/Mq6 jc5O޿8T0SG\8Ӱ9lajii3;?+{PjB(@gJe+qGًu!ٜIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/apply-profiles-tray-315.png0000644000076500000000000000203713230230667025370 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxLSkL\E=sݻ/ +GB,Uڨ%%`jҴMѴt P`<6-&HcZ$DkW*A .}?wM3Ls曓3D@ cѓG cV1,ܗg\Zu⍾5Kxn*"w00ށ;xyc'^p /r~Y׬FhQ)Le`^M[x^L'l1lK -Q萹u-B0do a,j𙳳B['LCMR9ǟ[{]hy$73nKcG#HG+_‹+|-7]ȉ>!KLIWu0]`݋:G߁}1ۯix2N,b3Hs2 DUxk15IF[PiW8ln#7<(Q! 83PKfHe3<; B >i<+_R~q.U$pI{/3{ 2#xF;ćD(f| wy[sxޖe2'nMϰ[_~5jϗ]4ttVs Mr*WYJJT{]{6bȓw ,dC]wZĵqg-P ~w]e.IΖ)^H |2,${9m!#|:PR~ 3Jba?RC5Feeyg#E)!u&BT[4^o>rN 2,S$`epo zhrBa7;-ey?%O|BfriN'gIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/apply-profiles-tray-45.png0000644000076500000000000000205113230230667025304 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATx,S Le~΍s<3aJ8@(5lX2H("s)1/+פ9-B37\<\@.1EGXd;GUjb`fa6A+[`];ps !&aH˽uWJ^M0DF<ʫZTb?0s?VŒ+:VHO.R_Q~S &<nݖcm;*+_F4̧SJwc2gh@ dE!! -xEV^Z\qęv ܞ|E/\XiSh,=.9{'n\|i-av06oH^+4{mr\p۲K y$I_]SZZOi:]뺕Zg4"j[+gk+k I1"T* _<~埃UVcjVkl>J0`M)S.䱂#LV=Tƨ#@Ϫ ʽ*hIdEh8f!$H"1V,BR0?cNtl4I%7YYWB| #"8r p>l|x +k1 zޅGjE@,v̴lpA@CdׄA3%ۮ- #F$Bݑįlɔ hkq0㞢?+).#GB:桟G(rX?Gjź/\9*+DQSO>)drư=%XnC}fnȩZRs] ?:-ܞU%Z~/qIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/apply-profiles-tray-90.png0000644000076500000000000000170613230230667025312 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<hIDATxڤoTEƟ9gvnk]֔hbB|TD(hb Ķ VU)F`ҵҴ,۞^ei?$$soy!1rRPtgARV%itr{z__;پ4Mv.0!6TUp/UY3̓p{5̣z'+i ~n{aE=b?ݥ (-^5(GdAy4X}[r|heVROW=WGe+yڦǷ߃u1_n']:&i?tX`M3}+牗BiYG9 :~с͢OMs$A˝3@\ bԑ _!-gv2(Uqp%r&pmL#S vzy$,sڋ"l,Db0\@Qm)Q2Lܒz*7LPS^ݹ/e9-7 ;P(LI2i a"Yn[m3WEUIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/apply-profiles-tray.png0000644000076500000000000000177213230230667025067 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATx$SmlSe~N{Kގ|UeS@Ncu,l&&*9ga!,1 E!`2%(Šs D~(؆u[罯7997}XcpjP%*SԕW)~dŖ{H ?(Y޵ysn=f ZOLD ]86q%҃3zolh dɸ.m'zT?hЈ,ek^IhC2ʄTb)9-[ÞV`>C 3XBpw>aH8N^ ]:=+KG*mϮ &乺:]Yv4Hъ@4|̑=Ŋ"vt;j`zfS1CrTV߫\(S_\?0tf̍C.LHg"ߔ8};QHT),*`Fjѩ-r*<::n11CIoH`^#k%fh[k5\) 1x@ [AvcI"[0 SB`z9䒖id-/ R485!pkoq;:G<_4zx\Iȅo:4J]8OY:ۚ+kWT&11|ԉ$nv'Άmjzf+"۱i6a-/Ւ(ױl} Ig讏r]};55fx~>YaAQ,VZA]|o97ڷo@Fe.L9f4:ɕNk%9<'#H̉CAMVD|:hQu8ͭzEbny"OA.Rݞ4){?uƶ܄H,,,V{5#+pYۀ?ILXSSSߤ UB?̓d뽨 d[%eee0336}lڨ[ۙ\̎k?~gMM(*`E]]DҢNrlߵV/$;3,K9u%u+>>}YXe"u=^ȧ FMo ~e:Nsѿ=QjfWj^Xp &i=)*hGw{%Z6Q® ǹ(k0/G}OJ8u);$ؕ{d=+ʛ0$e+*~||oGD.˒LB­V/+zn}}T%vtt،2e ۷!@deeC|32yۨh 0殕-f0;ö_A:nBpéXr U(~Rg9@̡^ NpkVvZ)]L*m ɉ*E`|}ɻZKN#U^fΜFȑ#Xv6ۧɏ7DqW\Zmͮ|yyy7Fb<[WLJUUsSf@óFIN׽'PQQ^A@A8B|F5b.WUf+7U!''[ڿe˟&a"*sD$v^bo<^tg<2J&8t }C1oKHBo†^B(~%95`CL¯HO6 d?LL%!^~ ؅R6g/$korMqMqI ~j`B~( 3dFfȖGh6]x-;ЀD"5RcTIs@zN"|a>6بKB*AMoϜȣ=Dn&q] #%8_ |‹2:D)eR"b21ςqO>; 6nܾMA3$<\_.÷4u}HGPn EB{i['Ovy_PTⲤ|U8xiS8I0WDlJ^]/^mXtaDo.'<(@_,v6̰u.MJhR׷RQ+DoZ G3+Jb W;mrQQ]#?MbJAH0n?i~hnv[Pv:JGͺL3h@4>%^׫ \-E+6|-;~lpMv'*l8q& ǯğqvUUTUU)ԋIJ;ܨz/E Dq8J|B|@k:+~b8;;[y<\Pu=^G tufEEE7jZ BёTѵgݙ%|)[;4&]kYpʜ)E64v$d&^EAPg9Zf^ :Ѻ2Ǽ,rPXU#;];_[ns*$IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/button-pin.png0000644000076500000000000000172113013112402023216 0ustar devwheel00000000000000PNG  IHDR(-S pHYs   cHRMz%u0`:o_FPLTE@@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~MNtRNS A+ɀIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/button-pin@2x.png0000644000076500000000000000174313013112402023574 0ustar devwheel00000000000000PNG  IHDR D pHYs   cHRMz%u0`:o_FPLTE@@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~MNtRNS ANIDATxb`"F( +ˣ@Qdz*`D(FLHD+`B ́S#`YX` U/IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/checkmark.png0000644000076500000000000000051613223332672023070 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8Ր=a@,-\@^e:(/Yu*:pbu^;y3/Ż>)`9Y*%H"&fǨX%4噗̎dBY">vfȏQY\nQ'KƪB(b h"P8ڿ 6]RGwIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/checkmark@2x.png0000644000076500000000000000073113223332672023441 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<VIDATX핡NP3K 73@Zg#m =DLKY zaւ$]$Vq3$= !UI'v9gB<c[dIM1}3doSJK]}/oζM:IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/color@2x.png0000644000076500000000000000217113226307131022622 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitleGnome Symbolic Icon Theme)IDATXAhUJsH6$K@S& )(l] PC'mIfƢJNSj&E-HIF3ycfwf?Xޛ}3uF>o"rq]׫'$ ʛ󁷚6l6! (0%"A; y\.Vrhmm}]U{"rhbb? @q>9<p<.wl^c̷@ZUt-8"fɍ_ oc' Hl8c`SP=A|T! QH"`K4J=UT5lY@oq88p,_\ 8 "\U6U=x\K@5@VUQÌl+^RG,_"c7T\v߭ 0R._#iϋ9gKܥlRBY^^Z p Xہ@> <庮zxX` \+OV wxwm%[U㊝/7^UM{lt;`J*JsZ4mƘ}T+8"; 8J2",{o@ϥYws Q|t=Y4HOv"rQ dfvcغmoQջk֫~C7݁:WU_&A+^\\|uCm>[tT:`FTܦ"rzhclshh(U1ª\7Oc2»IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/contrast.png0000644000076500000000000000102512665102050022763 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڔMKa fbXZNS(Q>D"(,{>Fd\.׿x @1&b1lb<JrGD  @*d<'o^1|=ZǧW*T*]MZ,T g+[aIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/contrast@2x.png0000644000076500000000000000177512665102050023351 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATx_HQǯ:tdQr)(LV"ZF z{q=lPd110#6צ AGi$)͵sf/~s>=1FwLt/%,..J$v=+ ]"|dt|p#lvhddD >(-- !˅666t|]ggR[TZYYAP>??Gݪ81zXಲ2GG듓v׵rjkkT1<88 pRRT*\TTiooG`uul'aJ:33a .BVX#Z@^) * ۋ[[[մdIpţ g"G vbb!V1t:,?Dxwi8 \QQV_L&P(":j#L&"Jl~ |>%. TV볈qff&:<<1^n "|&@ 1yppRRRÉ  xH$ f-hrƸY]]mꃑ)JsqhmZ5//8C""2::DSSS/bp:M?`bp]]$a6779p> 1<<\.-2srrV1=mHHۀ'~`[ Z-!k0[ZZ555*`Wh4z47֔9@Qbbb\ؘp:c&Kf]M Kfo$xLݘmfo IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/dialog-information.png0000644000076500000000000000102613223332672024717 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8=Ay5EDe ?~FԀv7KIH' " (fwhDb%D ėnn73sstX46$}ֻ 4 ]*!}u\~h4~.H[Rl6;KpKү$ŞGNs.f$V =1voCz׀Pϓ]n߯f[ ܑtBu I߳ >{$/f~v$I"i?&PM y{{lkbx<{m +RcA^q׻I޻L 7ac:>e&Χ>Jolg IiYZ yա?BZFDᖓ"c2O>z>KS4:tB@>q])(\+?C.V0,,sRf(ӥ-DO.;6A l "6hݦݡÈ e b`l`cՠ x1f:tBA 6lp1d؀.Њvi.Ә rͻۻS6[ jl@ݡŒD0 o7jxq,z0Q㑾 iw5coJ9L+}5 y<[݌B8wrkݝoaF>q`yG 7Z]ɡ1OKp$k "jvpsw>[uV\݁@rWQ{b(PTQhlul- .Gxo$\wy9+gOy[JłED_k# WB!N%+ ~tqV;gHְr}zGCFL=rASxՙT@v %fUu(R/<ʢ\*Av=(JuqGf h 2l/%y6 -Nb34/{/Y3}PH]Z7rm>3f-+m|nv:uᕩL+f$0puNčh/8՛cV-?FO\XҭI-MPۏ_ɭ/2pXogס5<.F#d\].^8"xǐ__ׯ U㝩B,epo|enuT==qup>al@HMwvۊw+ C ^xV]8w%aMиWx+-ɱc$-fI2MEnLJ/7%wqisIr~ !붾Dy"(>prȁAQ@ҋTrk|b3 4M6n ?:9|*!F-j X4tIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/displaycal-curve-viewer.png0000644000076500000000000000136213230230667025705 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڔSkSAv5 IMcIS_i%jA"=x""D<KAHUB%iiiuv_cη;ͬ9'L*)CRI!J(tBg}D쇁/<MC­˖O1Dq##NX|>6OC2H:#$2E0JAQyttJIf\DZj`@qXȦ6N7/ǞnT!`:]iN4?7íT /2 |9 gA^T+/,EbJn_TWr"ү%b~BA8'$̛s^,]"; 8[9 ~&\z ]q̾#[ s=; O'.?͍kv0wm$f"oO lͤ3]Ĵ͸>〚1vt+giB\esgٖDF4| n-_K^uB؊rWAH%64d3d*C"'l_{+#OAEEJY uiʺh}:Mϱ=W-8KIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/displaycal-profile-info.png0000644000076500000000000000161313230230667025652 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<-IDATxLoVƿ{{f2RCˁ0%Ě@H*URF*J)J@>Bd$8}9_}9sg}C@^oy"I^ḃ5C gޯ30ᓂdg3n ,~Ms}\.f@(RwS'7Msجn=`-:2\ll<@D݉{eeWsr :vdH9(iMRdrxGΉS[_lJ%+>>\. *6`j:B $HA¨%7?cqk@KIz0w@&!`|_^JEB>ypEAFEk?\Hޕq tiR,@ B Z"Sr:WXBi!xW~, Pvuu "@Ð"E/HA[ciIBڀN D .БZ+uDw-Ѱo.?@^8G]^9߇7kM-օ])dO>(ˆP6>ڃպ pp`bz+twYW}m+2ev'[+ yGוύ J> Z-+9g{j7!vj]Q(zOߞ^<HΞn÷ȋ o~IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/displaycal-scripting-client.png0000644000076500000000000000054013230230667026535 0ustar devwheel00000000000000PNG  IHDRa'IDAT8˥SAjQ }y8`qYܶPEO)<0nn  $NAu! HmB>ꃪ$EUA("$D)Y `$o*5IifP%<; b5ݚl6d2b4`f?Jp|>zr`0@Ӂ`^1˲Hk$I()).Xp#ٻ佪$?Z-5ۨ7$GW6hH Y@.mcIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/displaycal-synthprofile.png0000644000076500000000000000162713230230667026014 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<9IDATxDS]lU춳mg[[l+hL)I[c<⛏ OQ|3(E06$IBiݒ] β?vvwfwdNwn^`A[=D(!҂4>W7SX; _8'Dx$MTAJaq^( t[${LT &*x=/+Μ~4֮ޖgQ*]@G= :u!VDԋ2R 3XB _?=5 "!)w>; @U5C7h@Q&n3Ѿ$wE.?Vr\ cP`-8TBv챛+[$5P*2‚CQSv^;2Sԛkg1; G,,ijHP&OIHR1[n.~~x ~~Ӈ~"2e$D([g,볪Y:'_CIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/displaycal-testchart-editor.png0000644000076500000000000000141213230230667026543 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxLOAǿc@84p!H <7 7b 11LLͿND MIHD@l!eg̛{#f ޓ%< 5ͅK%$-1Ouh̝D& fkkx0?!W^VҲ6MR8d ٲ,,]lxPW:Z{Hd~wyc #Yh4;;ƶvjB#@&'Qdҥjqo=ZC0mg+jcWd-/>뷷16$EP6-xE P:"\ P`t%oj2ȏBiC8uelf{Z@kP9 Aܮq^-, )*ضprBr9+ >\BB< m)c^vVԼ/=o4;b_Tǫ1BY`vb):r㡘Nwԩkt'bWa0EH>RwCgVZc[G( "Ma0G,8 B):;s#0|q"ԍu5dM1LqL~ [9v(ٚIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/displaycal-vrml-to-x3d-converter.png0000644000076500000000000000127313230230667027364 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<]IDATxڌMhQϼLRXmTHˠ .#nTP0 Y1 ! ]jT`V."nJQomi0m͌M~L5 /\ssd=@nJ sSbt#%Qg=luMpH.+*W 7@ C!ͻgwͷQRze+8k28K`.@g) ,N4QEO]Pj dJ#Kpq"ͽ(ۊ Cds0a2)7wJ Ђ*j5 *`pn@u cX8sxt@ހ95`Ie]ad&Ph⼾]4;uYoB$Em6`L!XH$avJad* Zb&`IB S Y'ֶucĭ%+?wv]-2iJ&L s:U8UWҹ67HO0%oM:OH;s5#E`4ҡLt:}9؜}鳿R*"!L=5NOSBpŲEwϩ]%` ;1qwCaO`3ϴ'3໇9ׅy!)x=@Gϝƃ T(ޙw-0&`@[WwD[l N_kr i5LCqu$2QLׯ\YPU!E[/RP.c"2[_MA&Q-DPKD}rĈT>[#gRCPUvL}_?1oOɗDP"P΅r @@F%# 0^l7IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/document-open.png0000644000076500000000000000053113226307131023705 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8 0g)"ҁ MDHTH!>x,e-Yo#_'w¢;A" 0wέS,Gm `Ȯ+hUM-ѮP]Zv41ƞE;`""!MA^UG1̹IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/document-open@2x.png0000644000076500000000000000076113226307131024264 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeCIDATX=JQ 2?6s.۸;=t:h* ا,Gt2f0I$79{py</ϴ4v_U4Q=YT '3;`V=3;@f湠R,Iqs*E'LYvZ48; | f(60ȲlG4!Z$ \; :$ Fk>zk aYzO<4,$=k *V++ t $Iଥ0cNIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/document-open@4x.png0000644000076500000000000000156413226307131024270 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATx1hQ߻ZREZ.J!ry][ 8"u8]ӹHpХ-&V#ҊJsjՆJrw){}9 :ppFZ^ovs;Z)UvX\ bB)n(Z)gpR# uR-=urźս|dd䐣q%`( Y Nuh) ^& v=`PJL, X[Dn$ ʲI. ɺD :k f+gKAO; a86==F$-,yHJ $- |/)^:3@D>=&Zv[Id];qcLw,.1ƴpln;eV]'qjED=55U枕JPVA\?A2fNSDn-//}@D.9(rNx zݞR,^_ϱ̬RKZ ,{^9YNsn4,"v. 4'悞[QIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/edit-delete.png0000644000076500000000000000046313226307131023321 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8cdae˖ǥ߿oa``BRw 'qقXz% T@3u00z@ ~G 3 +5`X`HsZm$ IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/edit-delete@2x.png0000644000076500000000000000061313226307131023670 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATX햽 0-wq:";8Ry qRBPmEg &9_B|Y$I6?˲W!$5(m' R{(kRJ` ni-<ߙf`SkӪixsI1000rBK yOso-rIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/edit-delete@4x.png0000644000076500000000000000120313226307131023666 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATx=JAY6 b7PJ ++l`lIXT<At~!k6א)䙇d6@Q 8nzo\ }9 `OƘ~W8hZ;sNn$%hIa_<40Tr?akFj \v{+MSV\&| "IǼ([ v-"`8m "],a 7=Ȱ]KV5",r7cbU[\Q*ظ61u(86l4[` l6-Fh `l4[` l6-Fh `lf ݢ< "\`4x)dT-"rzLqܴ^8 U5\axZEY|~c]7xIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/image-x-generic.png0000644000076500000000000000064113226307131024073 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8ŏJ1B*_#rrpؤA}R|mXyQm'QF;Wn&3Fx﯀mqg(FN֛JӴ9DpB}ӒQUUƘs["2˞έIg^%ャ|}~hEƐGʊIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/image-x-generic@2x.png0000644000076500000000000000122513226307131024444 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATX1A/ɶAuX1`6" 6k-~m]I'WhvLqDngn6es̰%z^5Ƭgrky7H8hKJ%DRcZ&"()<Z?(ZO,3EIܞ40>hHh{8x|xpXr|`0.NɞOfl6*S*^fi3EѵN=2eYWOS 4Ԃ x3YhZ a ۶(Z>1}yZ])VD1{c8^q]w7B|D*yki+`Ӷj6weWj:RJc\Mos5ִRj+7?yH[8ξK% l/I }i,ϱ晨|IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/info.png0000644000076500000000000000074113226307131022066 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon Theme3IDAT8J1iKA{"=ŋO /P\“ EЫE6'[ݺ]lu.II&ϐtVRG"2΍1p+6LCcL c-"% Z!ګ1@k 􁅢9Mӭf)Z f$o yR29R "m5TE\^J,`c|&<!E1 p=;x F3*6n$9E# WSZksAιv})"^DG1S9]|Zd:DIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/info@2x.png0000644000076500000000000000142213226307131022435 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemedIDATX?kA EE!&Bbenw5 E^P$"{{9}ٙ}v1jzN)5ǁW߁uy{`yR "7p;`Z{ՂRr+|ߟrwsn:|߿{ex-~ 3ypM30fTY kl kHE3Q(F>sw|tyU`n40 WDwvatZ9g.p+iA0b]iaMVoPJ ptq\])jل-q\DB^Dj9ID.O11ƴ-y=KnF,խs: ( ek<Tz:7(tV  @;cNkPk}x/m'rf/J^N+ZTR; g*K["2];jMJ~ L Rjyp[cKxw_LJ]&SU`UDoZ.Ӳ;ZIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/info@4x.png0000644000076500000000000000304513226307131022442 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemewIDATx]lUgflVkIL && 6Q@|З!6bb4f #S[A4؂DXmk;LJXwgwgvgRsΝ931W2 _ˈh[o:lDtRˁo>tS+^̏&F>qTN7n\L&N "=99#wjPG uv[avyW:::VP(HDm/v,!]]]`4M{b8@f!H! oRUc wcD"g&6 /1 vs]wEQVwvv~g'ɖpxa%MCBYMPEa]<0І n`] È(L& SԾ+Wγlf (Y4ZӴj">ǿU+y? â%M-h5ocfK­MūhOL_'B|/>ph[^s39c[^s 2VŠ<ķN %dj(O:,<ϖl^FDV266$_LYYRDSSfaj0iD1ȕ 꺾=[/Xܛ3kx\`BH" "g\sjlGzxXGD3<)#333/Rmf%h)kDt .]fk3;d7erCzgfTHR*2~\%˄g 7t1`fi BJo fW'h2 rlm91[[ErPWW}zcB^)$BDk@KNYc'pU\>505@1ADoID={& 0.\9Bk1%B!"zMRySq1[gλAfnӊ$rrdd\9 BhqT<[zzzdP(FD>(u"յ-_= UV- K&+̆;wX,;oZ U&B ZMU>]41UU;;;d(Dz<|m7E"2555>o-/O`KLf3믭}<PVy[C74\1n"-rjPWnSSW3GqM}n|AV\;6:c+("|aIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/install.png0000644000076500000000000000057213226307131022603 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8퓱 03B''''Rg(>/!vM%k=&"t.rZ|$I3u/P{8Je92\17si"2nU8FQ40Jauw@DΕS 4M'"{j.qK 8 =>mNeiIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/install@2x.png0000644000076500000000000000105213226307131023147 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon Theme|IDATX헱K@WBGG7EQuv|'Xg'nPpAh5H9UjK 7}ޏ{$/.Z$ԝLz'2UC!`0p]^zi4VIZ{Rj6cscN834ֻTW`M&"ne}( \RDDxS?Qmw)|~+mnjZ[9RTA[ڧ0 ǀNuܾ1'E+7Jfs7@D>E q#-7kmYkasnWD.deAW1(kNO*ӥRij mE"| `'P.-oTŐIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/install@4x.png0000644000076500000000000000170513226307131023156 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATxAhP/"Eoz&EQŋ AD=Aj0ċڋLA! qnHu|S~Ci%^ h4,#ַm{>xIDta I cl.Hzj6j6j6j6j6y_`lll.Ps辨slu'C\A077Ӳ% !U}Fӟ-m?TI "jm _>t&''}x6 8b⪨IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/list-add.png0000644000076500000000000000026613226307131022636 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<3IDAT8c` 44hh|j(d `D/ ^b#$ NIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/list-add@2x.png0000644000076500000000000000031313226307131023201 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<HIDATXA ?+}d]#yPa5w(iufZ+p @S;| @W &IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/list-add@4x.png0000644000076500000000000000042513226307131023207 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<IDATxA@0EAܱ!铘ZǦlG9Ҧca_d:f:f:f:f:f:f:t7u@u@u@}ꀚꀚꀚꀚꀚꀚɯ N{uIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/luminance.png0000644000076500000000000000110512665102050023100 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb`xxx/ R>+2G]]࿉I >6dl# @Aa [SRRrCw [bbNiii|f wss[Ĥ R$_PPp ԝSLydo733tvv+,,< d phnn~00a„w@qO fDPh䱲m _¢ R2%==}iSS<(BCCxyy99 +j~عsg(333Coo+8(6qqq< \\\iԀԋ [#k;wW @?@uuuW @kAq -,,i5`Ƀh N` g!0V 6tt@6?6/ X^055mERÌq"7@/725`rIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/luminance@2x.png0000644000076500000000000000352312665102050023460 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxW LUGW"QY#$E j@Fh`B ER\j0J@pAI( )Ȣ Nx?hS4$ϛ3s'Mu6YGGs޶m[,X0sc䁙vڜׯ UUUիK߿/Yy`hh9x{{3TʴzJgjKÇYZZY:>>&&&ةS؅ oDBOI׿yFឞLv!HLLaƍ+n߾]ʬZjժ?޾}+PjE8蝇jjj,1g!*6 ݻ_xcffV'HϴuttuUFFFQrrҥKYkkk:l`JGFFFȅtc|˖-E ?͡W9sА67o7O!tV'N(tŋ /=04 wtuuqwww έf43WWWp#G-[f(/_ 6V8z9vvv{>xSL1wwwa[Y!{ AQ;v옰iӦD777)<{!^y;"& ܼnLF.Bnl6iqOz@L 3gD4uuu@DqM[)zݾ}FDD D3@5bbEZ6}޽{֯_ ~_ +" Av]) /))I@RbbK)0}}nKĤO\Ol̘0-"*xb8N Ke[Jwq'߼yR{_EEEeee 1fn_+++y@ziq$ܼyn`h $ qV* ]\\_l\\ͳʧ~5ab h{OOOmĶ066V'O-_5C?'֭[PX (~W^%LfJ.ƀ@mmHgg8YAACΠݻw5g,>|ICC]x!S17Gq^^B~;V́E RBCCSQ"4z- 5ҎbCpI:o]}}=74<<,+ibBjddMa|-<&[YT9F|FFFW\bT@dX1a, vܙ롒Z@$A(<+ /W>n= A0RMY' "1];=3/#R@U(P̴fcK:/#X܂%MwFgcK2c;^ЂQ7N\'pL_ kvIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/package-x-generic.png0000644000076500000000000000057213226307131024407 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT81 1E߄=6BP6llmw)v2FXîo|@GsoQ ة(bBط9/@DUUSE &Ay:m&Ϊsж pJ*4"@fe1̼y.ՙqiW眘S# BfpJu:֔zIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/package-x-generic@2x.png0000644000076500000000000000123213226307131024753 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATX햱Q¦qd@EDR6*7A})|,d-$L],@2`V-bd8UI&"_9seJ:1ƊhkҊ.+̜;Ή|Mc ۱ @)u?GrDضM?Zw!L&;"rN=)qC;+w8.v:h4Jg7}7u1dq h$r6 jdu琓v_*n[p*pEѦֺnֺ8e0[;#0݊0 (U >c$Y p-M,3p-[,> "OȇJ3c kZZϓ}0|v<9N ?$e#IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/package-x-generic@4x.png0000644000076500000000000000210113226307131024751 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATx͋Gg&:b$q7C&E0 uw{ػxR^C ^fY`{B@"İ]vqMoQU]]%%%[H̎ůSJ4Dz^qvvyVr CE/--e""jRGnv2 XIJHƘ/c% "_>"J'z1[eA".8D$y"r<)XM a8.F( ~>Ic&q;])v? &Tp!%)07 b@o$v0jun y^.p4n\aYvlivt:{i9IOP ؓ34`ؑEAyX iijad cNRSqk B\[-qETg^ )ex$" }iq {WU[Rr \SZkJ\ pM![ac9cϯS7 ""E)v Z7~f5j"}fjZH+BkvEUnzs؞uܘhЊSSS7zmJ0111 ӣ+++ uV_U5sk|CfYOJh6z>˵F}\VFEb'8nW6n[mZ߮VD - a[_" fKbqܴ D <<{vyAeʈN疈Pe dabOvn= MXRRRRR&D7IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/question.png0000644000076500000000000000106213226307131022777 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8kTA?6wp< Z2" ٧KoNvA$6*BqJVBCi?׏F`%0&vZUߤ1 #luTwOoWc $Ia""r4MGXkՒ3ι{JxCy/JsZ5q(9 `Nsnnnj9\BAUUUch+n>dF|4&Mӣ޲,O6Z8G쏚 ۜ391'd/IS 9|jJ"uIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/rgb_gain_blue.png0000644000076500000000000000053312665102050023710 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%Bc022˜R b O00pgP!HA$G d37>Zㆬ?Dn C TP {o ֙lR z30p2f  ą ^#΀pU0`).R,10F ` b` t?,|rz:`iFJz > B ?t~8b E>IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/rgb_gain_green.png0000644000076500000000000000054212665102050024061 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%Bc022˜2 9 @37 {3b RjI '(+2d`dpGևd,C P<P vz~2D6>@1f ` D v1%ʀ j6`T%€ 'QH Oxq&w:}\JV~ >CvHtӌuL,$^ p8C?PzJdDb=CIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/rgb_gain_red.png0000644000076500000000000000055612665102050023540 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%Bc022˜ Y. @Swc`{RjI3H F7@+ܑ ]?fdN h?@l0x 2080f e` '&%?5a`20B@y`T=1̠+ o4x2W6Pt׌H ~ 2 /na`8~(w =%2xfoh|IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/rgb_offset_blue.png0000644000076500000000000000110512665102050024254 0ustar devwheel00000000000000PNG  IHDR(-S5PLTE!ei&yz#1p{0? ?E|`qGxfVF)~j]M=+O6*eu n# *tRNSʉG$ږ%/NY,٣2hIDATc` 0221s02B8uty|zFA=S3s K+k!D@K " , HG%$&A!◪s&̥oݟIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/rgb_offset_red.png0000644000076500000000000000110212665102050024074 0ustar devwheel00000000000000PNG  IHDR(-S2PLTEbj$qx#8jr,C0:{_pFwfU(h\L<)S3'r4EC*tRNS͊6G)َ/CU!֝*T!IDATc` 0221s02B8uty|:zFAc]S3s K+!D@[ " $  HD'$A!`s&̥m?,csIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/rgbsquares.png0000644000076500000000000000031413226307131023305 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IIDAT8퐹 Å,cQTBj'3CEW׹<p'rZ:kSDIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/rgbsquares@2x.png0000644000076500000000000000041613226307131023662 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATX!@{cb |@N^?ÂBZI qɴںj-GJ ܀Pt{y"Bf[3룼2oQ^! ~|fvPK-j %ʽ[>GIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/sound_off.png0000644000076500000000000000041012665102050023105 0ustar devwheel00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb9s&>WBYfR rj:uA?7z ltI,4XE @5@5/ƻxV>h yFMSKeKltXה0>BT WU*jz!u:R s}_aT(R\ltJ,6h0P&˲~P;bl\.Z4 J%h4p"# brH4AM@Y[PV3="p F IHf|rvhֶR1Ƹ9*@qǾ@1b3w7'JYG¸ =u Hhw˚hV?gfmOzsssϹ^MuѨ,o}0dRB!kjjRHDy<|`x[[[U8V>׫@GP,,f (~(KFK2A '-tLaG,Cr\(v x?(Q2v ^bVlfB#4 v8?2PYk`hZ¯M3Pyfٮ28Y L+p`0I~kL{X^ 8VBi-lC0^o=.̇qA|B x M9jXt# }#AMA|Ѕb&Jv#C?ϯ;5Υh̚}$21%ewSlHEF妒 l7bNMc͚~]7>qU}:!Ϝv|G-]-j㋜DR>.0te }6S3,kbGoCGb)]P2ub;}lmlKL:A8wfNPMZaMo 0T%IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/start@2x.png0000644000076500000000000000040713226307131022641 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxA DQ1Ko7C0.X2ӒtbiVA R!h0(`!h@7hU@X 5Z^Ci6+(V1T,@s (`8½x@ 0 KoC>'vwPIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/stock_3d-color-picker.png0000644000076500000000000000116713226307131025236 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleGnome Symbolic Icon Theme)IDAT8?hQ%Q] "-?K|_8, A"8ѵAEpQ*.=Cڤgywy ˲ASOGw۾p#f[_w:6bX <4$Is!9g,EA8Bx$ۧC= m_~JZXR4 $ݒl?Ɓ=qI! pxsqNj0\WSJtjY}Fzw`jkvBqPT"cDY o:lIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/stock_3d-color-picker@2x.png0000644000076500000000000000240613226307131025605 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYsqtEXtSoftwarewww.inkscape.org<tEXtTitleGnome Symbolic Icon Theme)XIDATX_Te93MT 7*EBfvpqH5 +PQ"lݝͮV a)H.v+,5{ήgc=p1 7;~ & Л5 &vvvޖH$ҎܯKT:$"? ]O EX,<̑~ED>,˯ ^hĀ;d{X$V:\{{s ہxT+"6 :#TN̔S!,JȖ:"R,TK"Āc̋Hw嶶|>_W(;###D-ΈW=1l6{w#ڱ\.xAD:U~LUAfA|18Bp&j Eu֎cRBDX1&:T*7g@.Kux7`IюՁL& =ac;P.3aqdU|!^Sz7N/*G/CA6: k*Ty`AShb۪5z#hU/LjyOZH|y.K03(*L[vI2"e1' R$hB׮]#!.cSaSLJI懟wE?Xkk:܁0!"kT<M6 "'#Rx|/<ǁ]y"+ebsG"s} [T |SظqJ>V#"2`q\uJ"RPdBkkkprCU"b0n6$ x3A@He(n-(S%䜗 玶Z=#.Z.fM_Bs$t1 `?ZCj ` 0Y%{_s&AI/IS[4R~IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/stock_lock.png0000644000076500000000000000054713226307131023272 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT81 @Ek%`,eXrY:)mTn$YV4òy3zj24)Y%W@ekm^EskXkw@j-  E΁sy` "p0Ƌtқɏ}Y,; N#mC_ O- E#*IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/stock_lock@2x.png0000644000076500000000000000104213226307131023633 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemetIDATX햱K@ƿܹR?`;B(N .B2, .EN 9xBzM ޷w߽wѢZ63y|c`0x(u%f>'{F% >Ե<ϓDt09^P) 3h*JT*,8'>yG Ze;8Bo搈\$9U6e9h4^iNeeQLfe(Z iUl˹3Phm n<[>Du9Eѣ|~&"r|RIIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/stock_refresh@2x.png0000644000076500000000000000210413230230667024345 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXAh\Us_lmPBZ6iU*Ts!S4̻/S ]ƊE""T)R ͼf-" cH0Dn`Z2Ȍf^'$;ww9NU5+"Cv`Kf+bqz= poU}c}rc#m q{X,ر(S n a)ꆪD1f{{&y"dǟk}@&E]VJҵfwWշkFV7cÅBafU\._:$ɩViDQLi|YU7|P8Ow"^v 8Z> |&En~]\V9>5qTu@$nڴi.A0֭8v̵v <]cq~~~jZq'8w.]wk=/"GbDd jW$oV?KYeaZx x Z_W(Ig{W:÷Հss pYӜ+6POOOJR^Jr\.gϞ U5b#NZ q_\4L6<"Ƴlڌ(:%d"xKoz{{h__]KKKƘU=$0 DFs5#WVI|n \Yd{W6~LjsaE`gWU$I h ?rrwǸUuRU?6k5IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/web.png0000644000076500000000000000116413226307131021710 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8kAow=hD((\ge%1E@QNB@P!rxfC Q8,B *γpV&Ayߛog$jq|ADN<<HtLyh $/ykjD]`͉=cL{Sik+p8%VծvnϪj | >'87"9E#v$y ιyzȩ :;yeق s߀*DdV,Hhb{UsIY]k$I-/\lȩޅ`>y~ x8Y]f}:rzwةw1'`_P(r!cL*"l"CU;j<Wy2X8F7FcID ־B|{o zIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/web@2x.png0000644000076500000000000000213313226307131022257 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATXMh]Eg^DJJ P,% E%M[W躈.RՕH{'jlMEMڠj*Z7p}&Bj3ΜgYOpZ6[ZE=Uޟ'HVKDdضƼD,<Y@$BSk$14M^kRVM%"~Tls W%Esnȹ $Ir}#`sd^`|m\vzb@^PhvzzD{DUD4+s0Z[v<@'op ܂oe2@|.$0=]y:p=OsJȃԀ}-!mHUFקynOꐪXk߮T*7}"#Yw=G#SCD~{w5$p7X^nUs}z'A5@+H)d̷kvmrVRuRN ϸY*DDljjLm@D#s57X39tЅ(~s䕏 X@b R%"wQeee[Y#_`2|'66|gOOϰo Hy9@r14 nuP|)1~`5rN[[[M,MNvہbőHdA~[n {_W7 cy"AD?r MLL4{`fA]d'i 8Ϳ%S"߉wEY{ jkk;8}֚51`&f4jHD4+rɟcؕ[#3+H1\CAC(Z 6D1"i"0hvv:lؕH$L&$v#GXf^S񁈆,UCp+ݦtN{fc+-r:!ăBJ@ 8)T*ez֮| d gi3Z"; U<>н`lfp[\bBx4-NJDrӑ@ `Q !{w Q73ƚ-'&#* F2|Νg>u@`Ԧ?PYs=`o2<00009ED"[2fN$_30i pFJo(GfaG/OD71spQ!u]ookmm0Nm `U_ᆆ-OK)ê~f~5Nu`vY,DQJyӞ!x<>zEQ8iBW c3  @OOK.$z[ZZ> \ __0KI;hCgDb7bL1(R f MS|MPfn2j[l.EB`l3`||edJuȯ+2' 6iȽϕjz.Ȫ$%# b%Jbݳaonn E|c4Rif~gdMBGtFaYZ fd/$]BUnEStz Rq"z!?7+N$~->|uurWꇇou$ 'ɇl 䊟-щBbYՉD" h698iR8ܽךbŪPP =K}2"sz06A.G"ҧ& vttrH,󺪪n=%&hS`|?Dvf EQw+=WHs@9l%A:r=-"K[caY,|rk^@ai&$z2.wNыVp}z8jȥN ezjYƁfImm,6YIvڊd VB´eWc;,Q;f<%N rvU'V{d*M`|Wxb?=̉O%{S,aIJ$DNg9/%ax0N^X~Ԕft@2h] @ oͰQeӅy Ÿ,0|qdKj3$#Lt1NKVkF5amPS." *RNz?|݋I29k=? WjIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/white_point@2x.png0000644000076500000000000000373512665102050024043 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬWm\U~νs|uӖݲenH j n4X#R䇉XII -(jǖh5{g^;n? ss^ gh1ür 7R" R\ x yfLd-"8qnevGLeõ5|9"[2ƉIUdGKg0\=*ئO4Rh賫`=N=QբKsG<ܥŔVzU(0gMgHlDbқĤQsX%:@L͟HGGUڙG rIuhH15gD¯>L𨃣CvmOlSHwGbY:gĶ;['Z(i/V4&[[1y8FȕO0s˛Y!VI&v/ 1td 7 =܊87Ah K ౻OM$s((^(~NO۷z7nDʙZ]]ݜ%eJF/a_&\M՜5NpcM|y~__FqC^R8ix$be>g>w$h u\q].{feVNV%aT fĭL[Wu8_f^E|7^(8]1g{?4)6f/CeMK&< $$?IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/window-center-outline.png0000644000076500000000000000050513226307131025373 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs _tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8͒ 0 0@gA Sd5m$,bNzh+wg=֚Z.8HQ 4ι۷*h^0,{Rʪ @$"yOSD =Z@ef7\E0཯˶G: kvjp;Q2IKӞLj<ȿ%poL$,Mk@."4Mj1XDb ߑ8+"0́ g2 @mIy W#oX,wl>LIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/x.png0000644000076500000000000000040313223332672021402 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8ݒ 0D_aARS Z{XB5*6B7IHJ񖁏+(7Ҽ4 ƴ<~( {;!^YW{sA]ݽܺ=: h4'GzgM5AnܓzIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/x@2x.png0000644000076500000000000000055713223332672021766 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATXA1qDpp!,p `ͿhTŢ_2v^I!H;`B7 CsIpL覂i󪱝2fʧ6f LM` TW g2 8oh>!Wb,8>Y_fA+(Ӿ! o`#6]ێ;s_UCG ļmkX nu3sӄcƺD"s[tpIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/zoom-best-fit.png0000644000076500000000000000047513226307131023636 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs _tEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDAT8ݒ 0 EOvOmBy^!eH .}AK\ЊF7-sΫ}:f6i"Z#6M|"1U]>I{n;S6IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/zoom-best-fit@2x.png0000644000076500000000000000066113226307131024205 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYskWtEXtSoftwarewww.inkscape.org<tEXtTitlePaper Symbolic Icon ThemeIDATXAj@u#8U,D$Ja!d5ʏ0 GY`Zap`8 ؕC4MU_ -ZQ1;0fg`eQg DQjK-eSD$Il慄@x/ri,Ip%[ґ JAoٔ% g]XIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/zoom-original.png0000644000076500000000000000037313226307131023722 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs _tEXtSoftwarewww.inkscape.org<xIDAT8c`hcc``p$RߡիW30000! :` d|Zz5իl%E.z߆^i|W^J[ p}8R˩  { vIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/zoom-original@2x.png0000644000076500000000000000051413226307131024271 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYskWtEXtSoftwarewww.inkscape.org<IDATX= @F`ozλb:I,D<Bp5ʏ0 fX6qoι~W1e٠0 @F Dd(gS߀FDZ~j 4 rEwf-L'p8$ɵJ`HHDsü&lVIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/zoom-out.png0000644000076500000000000000034713226307131022726 0ustar devwheel00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<dIDAT8ŐK 0Czr ESu%HqҬ@^@m5!izw2Ã.s++徤 i ?bQ 2!IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/16x16/zoom-out@2x.png0000644000076500000000000000044613226307131023300 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYskWtEXtSoftwarewww.inkscape.org<IDATX1 @Do`%yROE˭w\BoP6 aa $ð,`$k'"r !4"S<+6t9snU)&`&ҍ1-lT0!Irt/`&`9{ߖJwH oL4;=IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/22x22/0000755000076500000000000000000013242313606020417 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/22x22/displaycal-3dlut-maker.png0000644000076500000000000000241113230230667025400 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATxtMlE;;ӭ6֩I έ6p$PpWqzTQs@ ҂&iI oN &]i{6R<&'gޤ@y'.]+}Y3&nZc00-H)ֲ$4j=]Ȱp3xv}w`L~Қ}Dnbr"TN3eO 9$i2Wv`-)( A/fZ2ٜM Xf_*8bahƈjX939/ @^irirl-'^þ4 /ӔCvW]}*bбm.MBF%+!w],Qwq[Eӭ ;|E2r;nXХ&VkP6ƟG*}; w鴑-,RjxY [\dot~4UK{((?[;kT(H/G[HHG%  s mbiIHg 6!m]*!qҙKҒx*! i*f" iNH7=1i;C:ɅrqV&ӽ-жv"3^ B!q폿 iBk#S4(вhLӑH]fgP$Z% #-bPBi6%ŒASNWtoǢ\74R?|wP.RkIn={ؙ#1s_IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/22x22/displaycal-apply-profiles.png0000644000076500000000000000305313230230667026221 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATxLUilTU>m3ٻL).E[-e( 1Q?&HD4!110D!$F.,j amT20v:^Cxyw9=d11;7w ?05Ki.ʈG1֯Yl'91gM@p^ VÝ%5pRtI'b"{lg/%@$ A`mp1w2ɭPMjPs. \. |eYhu`F-D6V4,gD`36SԜ49ր;h Ȩ;_V/^ C I޺| ۼ&@ ) h#=Cމ)"$vHVx#Ȫ1/]=(&qy+is[!7' 0)d]H>@,/6#o9+v8rJ*PKW5VlUbڒ A~mU3xϘLqnl Fy"ѣdpwe".Y--rҬ;z{ g{]5]^Q02JJ4}roϞl~6#\=zaY d\a_3كcT<@n-݅5w%0ůlx'/!i Bp.7T6nl"cC?~5rC$3 o{}CJM<Iy[PpB"iH4h!9]S(AICYlXtj`ki0drtEvљ- $cv_x1(B7gGesZ#υB[m)\ML^w_Z) #SX} =lrG6]5n)(#yr_ϹR+j^ Pl͎ޚmd& q˹5Ԉtpꥺ Hl@ϊ EofIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/22x22/displaycal-curve-viewer.png0000644000076500000000000000242213230230667025675 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATxڤU]L\EfR~Z5h(/@L4Jl47y'IjCE_4&5Ƥ5<`MUoeS.wsνk⳻~|gF577C+ҪG;ZV dd(iV%m/˗.1m5k@j2^5{e<Y 'eTחTTV~ Rtuu!7',8mC~b({JY?oO(J'06 'T>s͆l-es2/xG( @'QϥTh_) }}#G/@ERn]C%bDD91}fCןN,{^[y1 ]x"exMa*DEf )3'$*[ՍIgu>pA(AXWaed(^T&r]/}.~fVwwk*p*Qߟ^rE9DU744$)<PssX4jjj⵵vddmimmgR䵓7&M"ԾhQ [7<ڀ5+ʻB )Oj{J?/^zR|vNߋοky>uSPڞJޕRw KAzNZ?IzC5?u%IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/22x22/displaycal-profile-info.png0000644000076500000000000000245013230230667025644 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATxڄU[lEfog{n^&AA[D DLEMxA UԈ- HbZЖҞvwCy|;3av$V21G}<ǛmB?^͵zۘ?" 7`Hmp;7tt el&w5rf'KG kSJ"m4E`_p[a4wzQl,f!J`b Aǔu "Fk ⭟kJԦOes12hr@%":"Il}㘸R.^V=/k7+^H!)H$~{t{Q6<suɃa< Ӡ1?ZZ6-KmUi/0Ӈkp\Z! 0 peٞOOwu^Pzm9uhH=ۤ;LM'77''w0P]j d2Ľ+碊LU&Ҥ8&৯2߸U$#TT-4cgɓ5k᳻uZ *AX9BBIeRN*t0WT0b"6$@:2Ȱ (~؃}dN, |r#s,*"4as*7 `ZU aٖ18Qn"(C/l;a^B .RIB=v(/"C k6I8U&>EdG"'<ϓ[KƊDӰGۊ+J]6C)!!Җ@J!=`a<ϕaX!'KC%YǢwL @A& ܹȾҀ +9~haϙʘL9ȷX?ԯy&HxU(ye/_pi9֧;[iQYذU1%0Ie ߦ#O4+Gωc0"X޵-76lB>]fE 2$i,ٰǯ!?؏Gf=An\/?k}RѶt*ZКN )q ~ #gCo4M]4RB Lt:][V~_?X׸, \+04q\gl6ju\+ϧ_t:b0\.1ﳹV^W+΢a1^\[?(8,)8,ƿ+8,_(vv&GB\ q!.ąB\ q!okzg^eIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/22x22/displaycal-synthprofile.png0000644000076500000000000000254513230230667026006 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<IDATx|UkkW~{ME"H5_^bPǂCJ?J[l)xKj#ƽewf3u]CYޙ33;y<{Z3fEީ4 a5sUyA`jFÉٿ|~`kXjUUqK%.-LXmUL]߆{d>_a9h !í7"7]Pȉv]|zT0_rBS~ <A5W2?>_}RۺcxѾ蝮b24qiu]Nx ֯А+L=,h9MfWԫ1=oA2 a%$AQdHjcff"pj(U$:bqsCJH 'PL " h 0LL baAŵ4=soo{yÇd=8]DVձ1lܰ,lP niJ>tsDf}Hoׁ '@5].H陧PeEQ/V9G=@PɁ5_4^:x噎çEN7rQgYM[/i"l`BD"_y4,E B}hc-)&J<wm1\"XM#+%Z&5k< V!S`MHS5=1L4~mƄZi~޻x0jb޶r䰵hfY4ƎJFYGϖt2mXԯԱfߓu[~\e6I yݟ4$EHim#R,i8au׍E lv1ڏ- TMTȢAD`] '̒M" ( m̍%5:2sb}ܵK+AkM!M,\^fsη٥2|63fV ZG}zV Fke*s \̐- IOT#z)ޝu:::4oi{#NӷBJn`}|dRt Ln0<ֺ]]? Pm۶bf&'000PYk\x/:A RϜY3t# aMMM"c4Zr̴dH$aIC&sOΠi9ZCCwpd: w.LYܾQ9Ic*{NIiSM̄69MM4y80ā=ȈUꦽ\T0ehR(bLmARpn\łm(a@ t*'-_@xw)xHpcGoxnT 9^(շ˻T6\yXgt? ~p0PіLK@EPvGN@rK(X(aIKCwQABs ÅxqO”KQ~`Pk,}cjW\!*X)GNoP|Ma<xm2#itLD_2T;WAn&vrL7tVJ;BRT.#O䷘Lo@ NX k7#ԩPϮ#yW+ ډ4=|7+h yx)c*R=]OTe*-%3J?P.t^IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/22x22/displaycal-vrml-to-x3d-converter.png0000644000076500000000000000170013230230667027351 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<bIDATxڬkTWƿτI'cI1X)* >^Pć ЖPbZ aI2&'/=̭Ic"ݰŜ[^gC).L0ӱ99$4_Qξf~AF>Mxg׮ags]4V,[cn..7=Wo?4dat;=1BBCcp/l[7zP'YvV _6]hg1iMΗoYu4UU2|pXjkgM̝WEkTL=M>@%\gr#ElK+~U[$FKIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/22x22/displaycal.png0000644000076500000000000000272613230230667023263 0ustar devwheel00000000000000PNG  IHDRĴl;tEXtSoftwareAdobe ImageReadyqe<xIDATxt[lUs河ݶ,, (E⃉BO}> O61EAF )RP(.-meٙsff5D<33w ]%ETjJGdZ3Ӎ) [8`.CFЀ ٙTmw0lj)QuYƆ}2gۉqq`Z#MuQ˰'ׇ=4#l.]0+BG+O}5 q dE+BV[*X հY&"!ZS[qPjGQ@W%jy'f  6#87>.JPL70D- EF$~NL-ZvfF! 0?.MM*ڎH$Ek#(9JdKC1 {r8Npo 1o{h1 9hRf Sj{'(%q 토0z/7cjT/\-cZ /}-ozr,n%HnEvֳ^_5˽-h hZ~TnD%h)sQ}I ;jiѪ!4x˽tazHAHe9ܮ@Pc68+96Е|}}aI8v 2Mwq&8J E0Y3@F(_e62v&h/݄Rwȋǫwc-+L'7@~{Ŷ )Ib1MƓ1.%az l{@ZG"_ f"_n;/;O9pDJ)Xvʹ?($eѓ2cg* S+=zӫ#/ܾHb3vQzT.hhz@I]c~Yn2K5mB=4snth{gX"]#e%W _=Ss}xz UۅΝ rwd*wy>aиwD D 8#샙mI6mh֘7-4z/AE"J׍O݉e doab`sԘd2l)If~*c\x3vuށ0[ڝ>He[Q3a~Ga~1R$If.۩G&O{t_+Bn f RֵZNW2ddXM9+IOߏأIFhgL sbV):0I F&S5[[wIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/24x24/0000755000076500000000000000000013242313606020423 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/24x24/displaycal-3dlut-maker.png0000644000076500000000000000222713230230667025411 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<9IDATxڴotqRiZJ\FyRNզ^**hQ!ʡ7iG.m#BhہHF1,LS#yF&.Nq߀ pM#nۇCQ\nKw2X $DSoHƎ|>߆™BX*EtNF̈́<2G؉m l,w_I8vp<|HvݑwgwW/,ͅwﮑ7~H/Xx +™5rM3<~e|r*+=nO6pc[ڃ7pYonjԏ؃|WzG:^Oѫ3p#1 ~Q׏fN VqyXxaqADOOh y|%nF1fjQnHU3*l8]5"\U1.h^la:|˙D/ijHQ( cGWxzRD*j}T7*2Q8*2Q?o{\Wy%ĻBEYUZ(#*Qp*2DEpn < 5\}9*Q틊ع$ *#*Kf*sҶ~Ug~*3u+IW+;^j[*vUU9il1rax\?6ncɽ{-utNIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/24x24/displaycal-apply-profiles.png0000644000076500000000000000341213230230667026224 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATx\V{Tν;3w]!u R))!A-!MlM|PAib+i0FmCm(Evq+l-*ٙ}νs{8o9~\r@SH@p׺@YA<0)XIJ{8@!' Nb=3^PCxV9b-# !k+~*~ix+u㆖Ꞩ)1 ,&7`ۖ8WO w+v{Ɂ" < |ؾHGl@vC^Ogk:3\aˏbm,*sq|fP@{=W@rY[!lϑ io A::6wڌov`!7Adh*GKzwStfKRX`@3R@sAO(T7Y7GLrF2Ѹ*]8L *.GB =Z^[qIC^v[u*%I\I {{^ALjXa9Uqj5B nHhfݔ"n7B]l~?B˵:u"{a$Z; q@3x$#eDTIN>`ge2sG&!DpGa |s93ɝJ8}*.h2u&a9»>vU˿?KȋGIY'L/EC2VjUN͜[C LFuĚ6Rd%Io:J)+)e.e'BSaoA'&OgpOMk):IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/24x24/displaycal-curve-viewer.png0000644000076500000000000000252013230230667025700 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATxڬUoTEf[RjEjY51DQ4>i(w%$/ZCHH6)%)>Жk7O-+;9gf'3sf99;s͛~[).JthR:P(d&ʹcRti<38yjӦM;A(0^6VV.gl<ίF:DZ Y\!T>vJX۩ G!m߾RmhvWFޒFZc*SWjkёJ@&)TW($!.c2ʗfc#oyL5a/5x8LHO`Vڻ˘}5 YЊxВẻBgA׬kMx%dU ?Wu)n}BG9"rԣ,4'kpx4WUa1~ٕDH/>(\= { Za 9I n[]߀ϺP nObiID{jgܿ~+LBcq̅b=0) 0yxuDpoקRXOP-V tCK2/HOp]:puf~>& 0)R0qrxo܈ A5Al" >+ʱƕr)\_ڱƊGBoo/sjŽ%hL~{:w ɕZfE 5=܋)NmAЄɳa1F#f)ׁ[\f5%!'tw`nd^SI$B&˓4qѥ7VŖXӻ[c%4.>wEq{΃|{^W [J=_GX}l,4jkpq\ˏ5c C/^Zb앧|,)W*z~k:ÝkQ,,jell ?H3صs'FFFJoByL}¶6lنBO㖪Fz^i0qbp[1鴜_aJut/mJܿث${:;;^}[^}% rr}qhMgO?SQFu6TQzbޡk M*ڽ饸pQJPQ*W>՟I99:z\ G4IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/24x24/displaycal-profile-info.png0000644000076500000000000000266213230230667025655 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<TIDATxڌV[lU\vw{\\1! 1 B5L>/%D&)khiz̙9gBl9s3 }}ռ31> q"xӭe%2ֹ}^WZ>+eu_/)Uؽv(1Z$8*J(1t _s|9@XX~vivtV5gjY߾--RUԯ3DE37u+wғܠ KP3h/JX6Oڃp$:1ЊBqZ=t;AUXEFH*Q%hRx^Տ+4U(nGlk)q쑥թD͂JH2Fm62JPUUHPf(py0J_6աh|%DJl@R/.M2T"WF)hnAv x48p g>'rZUJ2٤&, `"$Kġzql"VzJ.AFq(9/'*5!TI@^RM"PCL.Nֺyrե x~EXO=L%TڽiR4<8YA|Z>d:75C+&&2_B[OCL u>+O 'A 7eR-֡|o,lo{?< gĠh G*wHA("-ӠEkk?:u`_GG:K"nl/CAh= t`x؆(4 Զ#.;eܨ# q'zpe2mmO:m'/y8|$w&O'#+W,y% =`<Fzzrt997ܧOĵX **x()@z>eI8ޞћWm}=t'_aukcQ,PWFץK庙Ӷ?ˈ7t_=Ss`,ǻUn$k_%R_M=IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/24x24/displaycal-scripting-client.png0000644000076500000000000000113613230230667026535 0ustar devwheel00000000000000PNG  IHDRw=%IDATHǵֽkQt꒥:(%D%D15%?҂$CJp^!tP)Hbw=?y.+#H$$Jd2o\.P(#u||Ţ*JDeuzz*VVzk4fr~~s"߈|'#D@ _$$D"s"ѲH+èeooO iZX,&rss-%k"DIMd<oh BDݮ Lm2Ѳ`f3ݶk VټnוL&N׍DDK DB)z]\.Y੓h6L)!10Lt.->Oߐhz,Bx<M!Zn,Br"d.NX<EW/y%6@v'EDQDEDQDEDQD+"| Kѷ9r([IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/24x24/displaycal-synthprofile.png0000644000076500000000000000305413230230667026006 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATx|VmlSe~ckml (ی!@6@"1Bh ? ?Ɵ?1$80IDAѱuknk{キ:9yy{sIyJM0.3$^^{Au5ˍU .l٩CD| LJ<.M pTQWD6_ڽ*xmt)ZSDcOԪJ:Lٱ;Y_ @B71N,52<Bp^X :4c䁠'gO;vleܲL;9\TlcK`xAGNsR Efм!2Gs+^s̮#;D⭍t@ㆮP5@HbiЃHbfZ0ݞrq8{*q-h'q`~4-o5hF4Cn,4<&''P*i ^p1/R!CᕫZX.OA100-["VPne fP,~?NajeC Ue+ |^BUU"MuthXFs&Ril~<|oַ&ܶux-WM% igt/͠g&??<°b7;=s.}Gx8,q)Kltж I2c$y~8f2Mآ(Ӟr1pTls(VahN +g pdآ\<̱p#P2,Ll'V% AP"ѝbPͰ!^یQXK|w:RqMW(U(r%vdHl QX@#jaXͥ7j7c5yH4͞(޶.tK3CQv'"VR4& fJH $"Bn R%t;F|\Gx0|Gl}$/A4, V,cbb -Cy$ao(_kJ?Jȿo~A9ef!%.څL* >h|ṳu}QtQ??6jsMqTВّM j5ֺz|#$M7.yqHyCAr7—FZQ!R~~DUh`0N8PVD__N~Z'''##?]ӴS4hooσ zH$r#8wn޸Y` BR>~"W|>l d]]U]n߮jB!264 %M;hЄ$>$.ٹ%Awu uDạ#_[[C,?2H2%'&&*rZyL(%hY _߻3PUub ~?FB&Ah5ҏ8eJ{9DV˩luP-xNQY)k@exe]r-8VWOT+z.VgmY1}O#)xmíOBvob&mr2Gz=TN +M7kK|D" 2I *+V`Zn"1|VdEA , !ij gKt :d4tS@uZ⣹oM C :2xpdIӶ`WلW]~rX]ZꥤpCuM"97 F;5TX h݌MH%eq>T{E[ӽ+6]WPrIr<`t}I npq~| zbֿl pT\ԁg>l_XpɣoAC^5r y)l<;S%@;Mjlf'2Ii*OG\j`؃dCAtn9p{ZO_ KYru) ϏFҳx>"%DdOV`6CV vX槾A|w Ӊ?B+pq{??cqRr>"i mwk4PVw(wI!u\ҏ1a(2LQ 0a3y>tIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/24x24/displaycal-vrml-to-x3d-converter.png0000644000076500000000000000175613230230667027370 0ustar devwheel00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATxڴVkHQ~77lsN"EP~'$AB P?"A`P].֖]lӵ}:\:۷M4 9y·c}" YS =J x;q4zs:LziMAOVRuZ. z@(qVy&OzfZA3Tg-nTVki5&k/&'n<%8P6zMA4Rc{qat KټAjfxظi.r bYD01Sm3 vGpnB!*W-|Mjs,""ϧwr8=PS18{4PhKr8ɁDƹ5 4:ߵ?AcMT;6@q$4 (SpCA($54x}ah"HHV3^ ӆO& & D"p4Q,!YtaQFU1 NKw@ZL. )Vq@% 4A !XZdI\f dTKq{h>otEقc>u+XyĽ@Y@*T28c q5K,DF'Ou[ I A nFԱYP\ 6+B<~OV!fc/XrߍErBoV׬H&>\vQ,}jsUn`M?{wY%jcU^q"Ζ$_1Q^'@P {>X՚:zfǮe#`J!Nಸd/i-gaq$B R.tҀ9+xFӇSo| Af(w*fueTupjfJ!wY8B>Ϝjątgv]P8_T S-OS!bHT!H>C #P! :Rq+5QSx=$ GR㐏7w цdY&)*qݍnh"[^{[^vv] [!i[,k9 WkAbJ{\Nfh[v'S@-~:5s[hO OqMXeŒ1ÇEE$I4T\L[ ‘x-R^ێI=QaIr%k}84$:>zI (Sprk藮^îUc̍kyf]TXg6mtUzaLS+P.Ԥc1ZGwK9Fb ‰-rTm; R juEܪV v \0WSR$B==ȊYCv>ZpZw;\Twעú㟿raﯣV3񢃮70uӿG@m͈mZoycp@z>SJoN%v;ǭw_ǹ#a LYYoj26&rc r8$>FXrVhFRv:%>z 7_5Qvqi(_?'[)%<\kU0i8VʳO(+:^NV;JW) 4YVzϝ≥G&'Ѡ+H3źw^&Id4@aW?u;05H*D5/3YQ;1s5ՁϜ*)s;d^U5Ev1)#T%࡯&S!fqZrrvvgPEƸgt~<";,/l}yמe_7tQRIo'lqd" k(*njIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/256x256/0000755000076500000000000000000013242313606020601 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/256x256/3d-primitives.png0000644000076500000000000005551313230230667024021 0ustar devwheel00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<ZIDATx} %eu9~Jw4M46EEi (n8%5&.1&Qhd2qqQ1(čQPFAE6Yޭ:ou֭{lHD%KSD d%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K YdȒ%K,YdȒ%K,YdȒ%K,YdȒ%K,YdȒ%>/ &A ǂ^A=«-HCvN#mwcPup@Gd}ɋsS܇B#VI9$u@>"fvdT!9^SPTnbc #ۚ@ =7{aJ>J>R*rL QÀu,ƥ?(O> Nym/U00)bO8%7 h{JE:*ϩ^[UxM;0gߝp?2g @)7Wtg N= xKêo7aVwX`'{nշxH^x?#-Ȭ>}2ORU/XL=V_(+@0 @? "9Q>?Na!Dxrly c6 Μ \>KY^Kc~*ryڮNjeyo'gٚΑVV *eTqrPVG>Cw`UR>N _Sly~/қ a^= XGvyV dޟ<:^~- t.*oR1?%k@0x;v%V%GQWH.+ ]e >נ| 0sM}XnxL"X5> nW@x_G:w@_cyN<@;}UG#Rcrtr+KTWJ-J>U`5Tm;@W7ld WHH7)vܿR?%;+*pf!EWy}0O% *x+} CdFeyr%X&_+b5^+e@FՇUPT0A!"wccX}~FA' 3^*18x8~#ൄtT;XYU~ UW}uNYX濲|м2f@9%.0! Qth1Thmܛk 27͓|3L3% j#@a.vGcuq}F^&k)mB6ﵩMzK Ai>  kE4i ""@޵!,fDB8?sVV|qpk_\+:3 ((Ed f 7`ެp@IО##YO+!AR}<9@T|׼F_k|V|eUmdSo- @3(r E`Aï*RxBgB†V0ύKC qڀZW5T`ZBJ7Bw)ސyv YocdRsܗQY0\*rbPքz@ \IiOclr^$_Cr?_ 3_3+{!Hѝ[`,"" @0C:?^ g) (o*q\/U+?ʕ_}>ox+I@0}  f0w. a ¯D`H^jy~ cw~N Э*uHAas!Cc*qg9. t.)TJC,hwe=Zժ_@|vԻW~ J6? s@=-@G[bؾhAXQF (<Wzg],%0o=7`ByVO,ݗlFJ5{gW_ה!>>Sg\0?ݲc<f Soۇ*( С#=kV|pkPp_h/5]J  vs@a=V:F(@ = C+>u[`oXȖn?_̂GxXL") bI@$s=.:Wt-B+ٺf[ջ2vU w &&)^=?(.%/+? Lm叭o~&J:]+}ܺK +,PPQvlVcfWkJ z[*pWս9c +s; ka8EH  ba濑 6plL~ӟgAng.^kPEИWpk% Srgҫ=k-q܈" =\wG: ˢ@>mf{`h:^t!dN? s$ xDC $_5?ۮ>"̿ c-XXN@x 8S<\*@u9'2{s_UpBDx_^eb`@n쓧 t ]\SCc c_fh'In&ϏEnͧXw7u ;Pb8bV@H)e`)dr@tQpX`~85 s.σS Yݕ``ܕVJ(" #xt=g`䟏5h*LH?d*!Z- J ET$Yvu|pw)31D%aygteC2c8^O<53 X/I w !Hx1/? 3!yWdD`5xܞ}mAZ;5XLo!(&wDǮ" =3T]_ZPta &,$!Bۻ8ϗkr6v:~,Mrv,? e֎[Ӄk @͊>!X4YI@D_D?"&Q&_b0J*7LN-&QB>޷^W1h_3;]a37շ!qtx;6g@u/W%OhA7XQ4 C-)¶~\1@,w_Q$`Y57zYM # ͧ_?.3}lOgK? ^,_t:t2<``x^ȓ1'eܟܸ) 6戨/LS3PD uiRMPY ΢"P:,\x } |u?䎶]8PD`XQ5!85r{~QgTC%}?"[H1.6($T C :.5حVi\cƿFg)#KQ.TD!Oޱ~}cp\/-[0[?/3do^ L iD!>uzGf ĵ1O]a=&h~ oEHj*\0%}rf& 󽐝B:n? ԗ'8I~y_)74_HYX}XcP!f3[bOرbgĞKRtB=p2#g>j 0m^>g$\vVot3P61y ;L{wMqcTv-mwpuV-$ҪbW2Bvhԋ4}д"7CSϫ{ƞea;UV+*"6JԴ B$nip*tlY4Kxw;Ġg ԁn"}LԊz'ՏL@nސ-E>F,B X@Vᆬs;!B6.c<~~8/q)ώCtIϔ/N`?*@:i t f0G}yj; Q=2`8>u !|-"6 w) Ʈp\p83E5ՆޚH4- n@x)4xU~E_€Vbh_:.e uiaRHVk10b"  Qn@\xT21w`X]1ONr(.F } YqWwpok. i7/P:m(K`Sk;Ӄ3#dE!0[0+xh8ɀK? KVLwlA6t/E`!H& P &R>w-%XrY5FGs?o=ײj3?ئW h.XI@hD{I߄~?PZ7!qѳ8)676:?.| YwYBg~2!Cu ѬA6f<4#&JAySTWp,ʐh)W|/`t9P2L _@әoHVg`%@eBlpLq]1$>*=$aD` />}iD. d$oj-R!\#DƙrU>o3%EwޟZ`Մ D@##S|~_)pdNbD:Vc$45 IQXW h x%疋#=9Q;|d0L~?iPd-I~1;:W@r@2L3'ֲ ~a+]*Vx~-_i7ʧ^)q`PBS*?Ykrގ` \[mG_% j`h6mc2vg+Z#yxxi)D&0ŪOޢg_1*[!ZIQXޙvsJ_ ܯR+6u3{u}iZK P1 v#Xh,&d!VKE 9Z KSflSj9f Dɛc3)6;_QXu+5lYͪ3ϔ]wzk7w%RKr֔ב 4|uP:CƢX-kNKxqy@@Esd:p>53nG+UX_2>~Iv7*Qt Z`tրg{r3lSPWZEh|O:%غ%DGg J 2p'8Rn ;mbL\%JcC@4r+20Fb>9'U|\YewS|gG=׫,TsW%rO)Y a@W3)5 hIBaM`ºӧs!ToAp zV\cNL“vBB {[ÑJjFQ*gy`/, p'|1o3&9(*pUPliC]~fԟS:H@ <=%^,ld Vo ;%"k@r!UigCԯoMw +2UU`#+w *ݳϺv۳}De\m)\Y,դ-_!j_]KPtQZ O~:[ay-Ȅu`aӄu[~4 ௛}hy~l! ѥV>C@E^Ck3/Wؼ2gC+L}C<ʎH\f 8&u!`<$_z iŎlPmVfj@Hoz~d`Mf:@ŇYIԥ*\1<+Z @ R.ֳgpWb ~~*VRe9i LVvu:߳OZGR(9!?adй, YkH!ERȻpR.5"0' ` 'ך7p^@%ZխzoZl.@yoݭۅkK@K]E< .[ycvܵ vtO3Їڕ&rQWaݒq d }Fss|8[oow LOk)ŒpdwqSi>n*5LpX? ?U&PcuΞ71k_G<)h,faJ|.: dIب-LFVm9cS P%G>ꯇkh_,_緬+)_U&Uhc(WRT)̅+ ˀ59B?3CvVpd HB8)h'6-{u:AOw_X嬒(M`+:3Uy_,@w!4Xb>#ZPFbaƢs{2?YeM{ҟ*~CRNwz|w5aS *ck |<^C( ]ZWC.*@h@0g b 2AÀB1>TsB`S[8ӆ\QO޺[$X4BLC{TG3#<(`l䳼৉~d-[Oۻ~nX6!quYϓQgd *E`ق MO*P:ŷ>1E].lB!twobN`U1.@;q4nY@A0"Y (j#mԠ@F CV#Tv^,/; 3 YoW[د1?X .ˎv^* :ϟB(1z4DVŭWtU0~nh@F&2 =r6'sƣw@[' )vwdc Kz^2j0߫\%ҫHo??KT|;IhI]xնH= ;٢m-0&*`ޭ.2>B,W&ey|sa k`2 0KCP~ D Aܟu*X=I>ƒZUR%,"!~+rY9 !hP]tZ l$r#Q?RGˎ ;lR-22;tG\]_I :grea] ?$VaFmn!لFV q*`ǯ:32?F?a){$LX]P_V{e.d* kBJGD`%rж^z4\W+kĠv^%_R|v[\&hz,m" ])@zf;VOMG%2y#J}-kcs5b{.G0賭y2ģǴQD6ڀ 0-G$7H;Q~/e`fq11g%^t޶\}$\vuL +maaҁ op>G85'~ha9[|nO8oY?@@ߟoz !Ad_4b‡:{݁lt@ж|BYKUR[?Ue7mgEp|Y@T潰`@m *- L2!Kkp>j0P m6cTڻ4ٯP'tMA |mDz2[&'t*K-51wd .<1g.=g7e~<WExvBZѥb?X !9 @V22.Aڧm:Dg"(lcJ@a%}AdATywA}V| Uyi~{M_z{ח_SU'r#m0*t,Vih\]RL,F-\X}E֬w#r_zs<̤J'3-0;Э*#dB05VZH{ʓ8{m{Xo鐑pߢQgZ/x)tefP = ̘Y_M63?B_CEAwK+Grf?Fl>$%D km7[hū6`1!AS8$/եc \Tk;lѱN֌,5ԃ[qMYv^+z'z6`IlY1(dA-TogVcP\@ A Krd{rwFD~ uBal`\ʆ?iUI&'Kkdy>.Gxd`C˝p}gA frU̟7A}ӑNM$77; w^ jL~`+5*0Z>/m?? 8BP'\}ԋ(&&&%ã9z.J?<:#0Sϧ@GOB۷ 8w^|n4 :s(*`8%]S;`;q߭`3 Lh<9ϖa|;6=C͚}~Jx0=0v#@gضĬg ?I %Pk(^S'4%Hڐٰ?TV&4ؑ?׽q)2yɼa rlc3ר$핟->ˢBpXN)E $ *-בYC)jJ_+s^)]yx%}2yȼJNں2*XHV\:q۴ t~v*t8&Jԓ= ' Lrsf$E?>J )B_8*G=s <-7k $Shɾ0bі5ޥA78!tla/ooĹ2{6{2$k;^2qo/L ׽^UՁEH]GCy+ȼtw% إ1t^}E =kapN0Q_ľ>S+= "@j`Xm2NwrH-mob+]#o-/w>WiǸupWys^a Ӣ_} =!C}>,Tw 5`) q/Rn`O ԄO"_@6!oij{P^@@pƟ&׽vQ&ꄡAH(NcofTvŏG% ĞGVg*<ݓ]/!yʂ `S(p Q0L3 xBUyj5UWLpϐy܉5$ ▴9GȵIPڶށTnr#ؘ{G ̷!tΙ$ OA݀F'Ri#\Axz{M F]^ڢO?mV[텱DҊY| ْFyo6 >eW1'ȼ9I(ІADӐZM~gN{oE~&-b?:$XNQ{Ʀ=Ah˘@"d2WF*[K@V'7 wm#%|eN9$XfT~g͂Ai݂ =~dz׽k#jU}=_!BCP"*`QU&ƄAyڂs! l(*T\Аb0ti'Bӿ쇺fh8bk !/SY/ooP7eXO\ѬeUW~|d ,|}sYK4㫷+wD~Iq(HlAGnbkA<9ʞ @VynsXs0D~i7r%I* TbADoʣ^%!U7 \6|y z#ew5 .K?" hٻ$50&7u*p2tc XĀᦢ`uC0@LOBaozO?(OI yҖRߐ'H&ղ/F~v6"Y\X*pD1mW'Š6qZ## (G+a '0E -\$؃&2d@۪߶bgt^WK }q/O~:HQkZ pRB~p" X-Q':݅W8z'/W\l;6!)0L-.%_P+ =y:Dh p| 4H]myQGߤd6X/]_dހi@M*OTfK_` QقZNSTc3d.@բ W+ihVyl 4':Y0i\LjC`9Y ׇLHjgS$|]Xxt`fE6ӹ:Wh M"$5 |IS'2Ou-X{D j kn ~u:{Z?OɧDy+b>+B"m|X#s #($hFVE ``oz:ҋ Iya*Z8uooP+X'֢^X~-z%;IÐ: i" @Ss@ܨL7 y d'"y>==3D?vK4IN ;jKu_).來e;bHy'bY] xO :DSB@u957 e׸y%QR}0Ubi u1ߺ{f8eɏIeк1.{W}2)>?Agp8aW(h(Qdv8 QdMD@b$RQhdB7" xT,ӏLp0b|43Pd/9oy:@&^-8:qp4ni -3io7G*yc{+r Z7:,W+/ sI8ȲߩO/&oDY2ʗ|;Oq>ж cLFs'DD]K 蒆#'$5>_Sa? 1N`  ݇ ld=AwXW+W}v=kInjR|g=xH݂{;7QGbh3|CEch;ӑH(@ƕRmCç"R'?Uަ`[Yp  o&MDa1{_X0^AÑx0VA@6W A0= ;b7h VFQbh¡C8 + @+-]bp^?ӿ~~-0i@MIMG-(:y41j-@knPqgۿU @,WN.y΋%w[8.ά N el Z_ H #f)o[pC׼V3b%@,vWC-\BKlֶz_LsYq J@W=j+Jơ"$l Mc}81ܓ,hs>3d mѢW.uvC[lʼo_7קfZbXLM1Q ?-!'[ & s`/0A蓏XP_:bɚ'^`-.se|ѡS {BP~p͡>l~eXPc(pm+[x ǎGt gbӎ|=2fkdȲmK噀El /yR?7?rB1#C447~~hN"4CQ_Jd 0xp O/e dTy.G>W{6)88MXׇ>E`C^rw0 n1wEW3P y!F?1u欵6Ԥ`sު 'f#uG)%Չz $@h} q0R(F?/^+w},tݣrc ւ_Έ$9&ЯM͓vl.&]#xakaN1ȟo 0" (Yy'jP!r$}E+n Cw=nag ϾcK| 6kR8X-E<99hзX XK36V9MfNaڊÞZ j8f/D /xī5%2?m3[fuw &WR ¤m+{ `` eqt #PX:>z#}:ab{Da:8۷nMOG㶭qu7=.} ac_T`:79P!5!DڸXt\ bk6<*z~ފO\] /HІ5 ?xd33u_[*{W?7j2wbfb??q/VPt4B)'8ǚZA{,gFSٌ!AsvO*(үdYzC\i? fLir»Ϗw;f@_ʻRj97rwy߻}A㓓Y9wmC~޻vu߿°2q;^C@{_C3΂>M`vf9neuOO#0D -O|K0Xc k -?'Eit?_ *ttytVG۲{[M?? 񐏊)=&ǺcbMo?[5+vz ,UXu"<SU̲P[سRw(#(sL~tb!HUܾ n+8 \ݏ c7=r3MߺʙHQn"Nyߎ (ciLtY} HMz"4:j&5 d/kbsz%۩ ?R{.zeܝՇ΅Kw LeJzllI7 C|P0?Tn{}Ÿ6T5>¿}FHAl@Cl;ϖ U]yЌż=(غk $Gp K*/,A ͇+WT F0`vǖQ? ,.Bᶙ[-xw\aǀk;/{zB/cq6s, mcרcA޺zl=+q JjTTbry,ee >oIqYLV~R{u}Vk$\r;~ s~mA[xZuc qg!ns@07݃= ̟ ÇË~ BtG"x~PlJQGJIC)h\` <Pt8ȸ>@X1e:%vzVU٣ {҂E $tR %=mC%'~h|~_/݈3y o=t;{̟R>a ovN ^:Z:шz 06=l˟,> U X%Hf59_~uWy]ҿ"&=o8YASdaASr}5hO2/Go[o\rQdg}K]/;Jr4t56'9jTgrT-) ^I2OZ*'ƿ|]?}oo 瓅=Ij^q{;\a׽7tr)_7X}从]zK_=0,iw 9MwПss_<3_|t P`s"\\>cHa@DΧ7~}݁><@I;vlwؠS RQ=|m0  $@2fz?T=^^PCG;ҺqYvĠQpJA9,v!X3M iV+ss7__7@xa )65 4TՎ-E_{.;洁O"%sgq` 4tA**9wW>ooQz7~d97!/ ]Q=o`c3tⱔNJL' 9 cl{G;nY[_nFz2Gv[y8}&WB3#wĎkmrͽwh|65g,M}H$$~G}/t\}l֬oh%d}}W4l߆F<8aN\Nwd];x4˅ùBtn% ٵ(,r hSb\O `_Jq۶-?ۿ\|^3Q+y?վJ}ĥuҷ|k4ߵ/mߚ`#}~xh _m xg- a4Yg}f8 KJr,Y,Y%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%K Yd%KHeYB[IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/256x256/displaycal-3dlut-maker.png0000644000076500000000000005137113230230667025573 0ustar devwheel00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<RIDATx $Wy&|geVfeZj[RPsXZfnvαw9Ƭa^a>13l#5jYV:QψDFfވʈ[瞬/>~B)II<wCz'\(~ĉ+=evzo~D =a1߉ys kW0oc\g0|H?|K!,4N{彘*4!d )/R79H} /~[9'~|?wǞP'EQn/xM(rSwCXR|F~A^SC_?q# v88I1oo=dHS?U <hHzD#i$ _DO#O*?'@~y؏<ӽk*1z ɏ?*?GƔߋ'0s^'% 6t"I~S?,8LB~(><䷅/?qj_pvt/z܊2;;:o;nEef.gG: $ :hA_hہE!=SHi!?O"{?kF]z `XYDG"0~]RE&4UՊ7ѨE~k cIğF)GB!WW+~?CX ,O"?.#a%W*~2EƝ҉TjɜLtJhs4H!tZJeM΃$ztN&;׏!)?%t󈿰6P"d_v ?ښEӹg[Cy9g2{`clIkĿCa*;/|^ $CGasf?^ & '?ydrD{~qT9T w1X_JW}!'Q K/-?GA{ _+R>ƛBsm'aaaEY`"f"gC+ u $g?eE_䗻&DShHߦdL,mja`3ND*;z ~þ+o8Qv{o.n h[["d{B7:ǁ#?V>2jFKDB0뷵aO!+vϖ??;q^̜x;{| B >W^]Д+F)C(M.~3:F^NWL4ı?%g uZ/<'X (쑐Z@Z!H\C\%!9ι#?1ߧ$gg!xI&>X'6E^A}V%;`X2vz'xTc^b[ B~T\ oY*YO9# cÁnku(d0 GL '?Jj.tO${K?9@}TY E@ǡKCKq6r"`TUPB"l6$N~# ~%?")ğDTgh"`tHQA/=¯d1un?f!⒟j~ Q+D8Bv>@"<VDB"-W]qh3P>{=9ǐ_/V"1{DX/k"튩X_pv}ٖ_T| 9'@_T*y}3 H?? ;>駟6gFҹZ /z_2_o<A_߿7 ?{g]8;2gV B6 (H__.t[vB)@ </>X_>հ1)h4/lNa}H~F?hx0>5rWF_׹(_`kGFFBա?KC:1D$DQfobI&4UԊ7jM+,IğF)G =/gB _AoMkyWX'ӈgGꓳ7A>W5%u_sRd?^:K-t2'ݮR.Ab0]z%VwWd+D;A.Ιc1?X}_3kV#XB?3%:׏%4WbI.c=X}^Cl(~R꓄';5/q^ lC{0dr^X@V-\ ߻Wnw? Cv~^ {U<{AxXxQD6m,I]`nzguxkȦ~ |v{F~= dS Cw{F~SɿHvg?xtr:E%ȉ0SVd1\.-443fV9/t-= tio?K;*O!Al~(iaY-:"3pevZ>5ܒ_5j=~ SPlwf[!F%*ܒ_J! •ᴍ?X}n?~ A>P& C>KAp)_Jح[ ;",.o:p`ȿO׆+09Ƃ B`DH( x5iTd &ƴgD T5eQ~X-~ !i.B -AJ>~k0 =./r9/P%87r]l=!. Tj<,4؅׉dfg۷UnkP&V_5I2CfnT`m͖Hd=՗x+ˠw-;" V_vbW~ʟ2`eW> Ɔ/Y V[q{k1+ǤY!`jU7ci̓X}!~X7XL?YKx_Y|\:y"1VxNOQ]/GGXUN(P k u J?Y*!^辽Y#~Zh7;/66{KĔX}şH Obi(413PT=!ʩp%V_.d"$ H=U') '}P<0r@:u%V_. #JďN˙JQy8^nzGHo^}7j??v'VxcK{O π ٓs];"R8k GE&P;V_CJ> vγEe!҆[[$?إ!4шG8yxF?sxK/'ݙ!'D0 䖱Lu٧[XŪ[7 KjaˈGK˲U!7J׷Ŀgco"e*v!Ц͛o~N<TZ]w i>h ]gNALzp_{l"~Zb]?4;+!͛긃6Ct rj>? ~3ha !'2y^.Պ;xh=zBCoɇѣm"~koX|/.mhKD< Аn)l%4@6/AhmQ4}6'5LK~_BD{!L&ttɓ'wJΞ8S U#ܰ9ht/F;-ĭ"1{m #?0 _#}r,"u@~vV~? H)g@zO'0l: xJp(,gWVPb5[M֫P*fe*} 0OgBVU'UX!/![{O "$WbI=k6&7fv;P* @q_>KfwA.sMrĊH"iX-v+tk59{I~݆ lA#`+9?H"Sn[ EĿ<%?oCKK\?#"F ~쯯cS[(hJ]NH6.앟;OhcM,WCZOV9pg3^GVfd_=/[^׿7 ӈȬ~Ο?/[n/k?Ѿ p}֠ ooܙ/pt;K~)It1=3_lc2~cGݞ:{3C1įNBH1Ku Qex샾inzgѨWLjƓ>?rs!8rƣmK+WϯŸCG(u&@w>=UkTOËTs^t-i܍#|.}Sh+a=*`O%Vz.ߎUH{3T#A8FS;~Y̖2T{-ʔa (TGt@)67]ULb?+ӈ?<"77F~/B@x${!ˌ@o[r)׎'(ZЬ5^܂ZJJ<47=Bߕ C`g%\(gggyjkX}H#j3Éa"EQN =Z(CV*k_x8(}mMͺ2fLgf,Җ4Kl>o(ˈV_V7$糰xA!6]Zyצm.{R;{a 2mvb)Z5Ќݷ4=뿸뾒_\lmU gv;)9v﹎IP1JxH~^ZXYO EİH @FpF=$@p-{1i೹!I(Ktɯ;O$0o\@Uc$'`֥$i˫p޲^묫S &{`o:'iSPt!8-KҮl4.ǻwcQ7 @viSh6THKP)n5*RN %*ܘ;`+05ߣ%hsYy#g`V;9fˡRC; f) 3n)Wug ]>D ?I.nU%&g;?<}?:J Iʘc+ǺFH.ʌk|x׍ԦPmise6~O^vf":7SH'AH%-?#ZknW#6r̎Cus2YYĢޏdu~"Ў)@ڪA<_C#3 lZkwѹSp"𶻮u!x.c='CPsfVA~'E`b3~lj@ucEJې}a.AYfTtfAuZİDbQf35h%c ̤U>îخ+Ëv4x8`H* O%'K"^G|h." @)Z. DxY`g%T!Vr7\z[a8nY ZCFbƥylɵWС%?f]I8Jc_fѫP_^; ~.#p؝H$ԃ eZ{j}~#?ӥ_>lB tJs>R[ /N'8!Mg|[sO[KnyEe=(_`M@ "H/ό9~c9!,r/.&J(\O^Κ "uǕ}{)BYgl <3 pM?s 5=sMݪ  `e6?0O3wfծHWD ;Tde ޶٤v%@Gw0@gLjB$ݻ?OR@U_շU܂JUX}ȯl=EX @{-;VLj~vk[GC*_Xm&|,zS@`#u ?Zd25$O?2"?>/FbمXH.cp%V9[o91d_[M}oaֵ߮w[}t^b`G@no[7ft>DъC\-'z CݯL>WҫHw=|&بo)x^#,b` QP߬瑿#lR@7!}z& +V`ng1Nv 5AO~1yQٰ$QE  W~ʲnR2qTXu o7UU kwͮSĈv \m6'}wYϫ߃^DL?_Ժ}4X&뷮RbQmDN#ӊInoWUJWP&0!(jmJ{JܖWVo\v.^g]243cdܸq#0aa"?O Ep(h>GTc//\o^v ؁.n!;.SF^߂W^7o}pOm7 3D#JJ~*p.~p1F3?>Z:bME^]^@/*~Hy}/g˟:/5=7=Ж]<0??0 =zįfxӸN% ޞ!m`}W֮@R= {`쮡È?cքvZ8eZy%+R2{7]{ks O=JXDiN[F`#t nXS)loypMƫkG{?a~3Y2j [ҟo_!\B dBwJr~ҋMg9T2%?R2z|CW'-[Z"$Rx"nN$y BӪW0T]ǿm %%˘,kt&7#Q+_-ꢾݪ?lJM< #FVm t5E7bYٔs^ϝoDW?0D/{y$7Jϻ4O3W@Ol2?nɮPgsj%[?@X}|(B|ć>!_:|QQc+=59) Ku>ǀcbsz[lja,{j{1)sh3uŮ%%~ /w|HRK{b[B$tTp2ۛPJBm()IDh30N(!e#܀dfHRGO"~TEX je0 "~$GGC fl4O#~)*UYIwb«kW'ջӱ¡HMLzY@r%ij<S Le&];"Rxq> {w' %L_*K@ָLXğͪ|FNf~/Pt4-4wcmʫ[s',Bʟ Co Ƕ*gj mFp;C X osD~=W-}_LYWӆ@ }1ޔʻϒTtkfٙ)?oH3yOtF|&;xxCg!=A;sSA%̯CwГ }z#&H;tzwQ2^w"^\Op4̥?r"(E*mk:2*⿁w6a__Fݪ9#:43)M 'rU3G&6XJW)@߉UG*՗dwWtL E'ݜNtB7j&(!l]> #C~Xik/ /w*?xG3'3g/<7rnB~SFY)har_# jW>G.)>Ld fbNDb! 'ŷ*V JY)Ae{7?Bď9Pa!\֕Gt ,OJ|{_Pʿ7e{sZp#z T+y̟/9<ܹKf Zܝ|KXRC\uOɯ-h$Ҟ0Z8lּS$fqnKBo uOo/!]?gm"O#E!u_g*Ƌ3^NNH- $=tF$ Y9_YJuז?pggĿ*[~?WnAWe-u zt~r}o7~ xTxT2 4IcG]_p ?ӱ.ȯÿW?3CwyG~ ;n@P(o} y\}a&gSn.GÝV ۖ_?r+PnR_i#|.vu 5晠\H=R?@{ Cz./?!W-?uOWg_iK8>,HeO/N@:$iT'0ixi,B KxB~)[A ee{|9 @$r  !LvU΄!%H<_i#;BW /b!G؋DFN%Bքzb ䷕!in: Im_?K.JkkX}Ȣ#Mf{&]EHb1H-(Kj [UF~y653@O"ۛe2MĠuU^Q{IXovn7Ħb! X `>um-`.G!N>:{U,Ny?`:/KR>K + I~_uFAk"B\6 B+ zՐ?1Wy7k-`I(+7}(s,s_BwLW/__g =R"=}!F&2,\-9X={Z;M\PNq:uJs)j UUk~ :FPΰyyfj~\WE( E7 oO,SCrU1j.FV/7P6>v]͘VR}Rk~t$cNWjzT}3wWG][o爂?d5d؎I|]HoFS~rɲ:fw"4#?o.ī&Z`,ɈqaS!BY˄j)=֞mb=1Zp鿠eƵU`r)eb1P{cT1)S_@UsVƍG> ui!%vݸoq<5( e`Qx 2o8(3+i]1AZg7Et C3f!_k径7]XV}E^P kiw|uYB?e`?\3 hSzo㎰+K "[ ]qhdPœ쑟#>D"vr_Xb;\Cm{F۪Xu~u`X}0 U9'n`k9TG~<s ` Z1cH``jwf?ڈ^uJWJ~uĐ0 ѧX}#V2LB0 8T-W`vנ6PW*Aj=;؍*f0NfD >];+gzrmWS>-$&KuquZLhA{tZJf"w*Je=ux䗙Wn@&Ψ[| #[6|"oרl5vr;N~6Ǭ P5xuJc_fѫ%/ lզ]DMZFDT]KXcJx,*#сF"|)Bq:su j G=$p+yݨG{֏~nyEe3P* )\ ͎@Ҭ0IƟssB~PƸXſVNm(V=3VkF{_ X~ u/l%_S⣋?c0! |NşǛ A*(%cs#-?3v+?G>wB@EtҼD ;T?tABCdao ]&fKA9È `clωGfg' ~)/*֡RA V+kXۥ?gHRyjviL̖{;]u[u5UW=%S'^,zS@l:O">z)##MuÈ_1 1.sDgnU bS?g?; @ @? gܮ5-KNᫎ)L$rY% FE?PM.;f00 {2pl&?ϴX>'k9e "]>2-m(#?1lyo @og ?ZH$`^=}yPZ#_Eb@({PebD~9%`WyA`\HPWk>UZ|~-.[ݒfT9ׄLߪb[~ 3Syw*%1ثw"L/j-K@0}IaR&c܄&6I Vz?~^u{=WPjEHvw74$7(>Id!d"Y /c;">s.nKz#' bq5TòE5 ډW\0%,.\㈀f|?߽څKz&~0k#0񁒟 n]UO k| #gԬP ZիW|^@u[MnjH+J":K?[y[\r-siF~,Qga~G1` z6\&/܎a>L8>G9vAR= kvv(*0!X9uuHЛuds*j /"=אo!mLwʟdfpfo޶K~" Ba%|ׇq~FzBY|E9W6"e(+>ֻôq_Dr"Pڒ.A6nT Rɤx4KB, 0_#90z/Җ_|gJF)'TAEDb!~bz$7Ậm80sJvX7L?l瓚 PY @~Ok0Mܹs~]񇉮&lj jҳ3'҈+7SaTK}eQ%`EܯG]d~UXBD,wᴁ ~,T^ *+u/zE~}P>ZJo rTx@BZ"IiRAB@b,&g(gÓր9 $r$3HH ])C (BIğ)UDNL?7y#ZO+FcrXh~g+1N D/*Z]NbB#ܬa1_"@ Uݚ' La #ɏaػ; (a UF#xTYD'HkXN! &[vDe! ĿՐ 9?^o 0)Wڼڱ|}_};yg.P"V] OA1`,!2ڵtڴ"``WKٙ08~E1` ']kG8h Dˈ?ZZ|=˛/~З 1~Fz =yke^[n)4|Ix草 6_E-MkNu627şC%c%⿹#@qdwI&WO|[-%[yS }p8Iʫ(|=c_1"uJU>5T_Pg{ : tFx0aǿ?"lR$I|F]A;^ɵ箝۟\_40_V䰓vL]XZG;;g'(pPcO?tzwѥ@BEԬ5_s?}f7#z'B~ ^_j`'2*⿁wokA#/!3*So8M_\=z%O0 k<#^(E`3gH r:sI~e#Px~ پoҼ~ߕqeov,oǪC 0 2+ Ct :MHLuM,"x+:|}*Cǘl J[Y+@[U>`_]Wj蹩Qk>iF 0p,֚o2rʹ"V/ @ },o; = c璎䯌`ΌA[1 {P k7Z  HsR9T|J1R[*#L~Xŝx~ve&&0>Nɯg/\9k#f^$vK,>9G~pR &澱H)pO'0l!`1|"&6ŭ-y ~e{7Un3OcN&a˸zR|;!/!mo{:#:d H&#3)&j)Bڄb5sE~^3r/_$`@\%V.5x&+"X `Q%ry9{I~݆ l%@/® ͘Wr~ir\KBo o’ /M]va5xtNBit S]BV3 ?|/.u=+_'_U r` #Q+WRn7gifĿT-N'U<^ B)ρν;fp%vC4qkEZcGnȯg=ckhAJt(5u ?7{:vl/sE~(O7tv+ o[ٷO *-?rsQ8rvG*#ɾBWljHx]&i(?ktvӝǑ8ٹs#  u ܒߗX}"-}=g^|x}v5 $߯sI~y +\_Hi`\8k"TDv[~b3 0No -47=,s$gg} R/ZR*L  Lp`n. 28.4J~+4sp.{>ZɁrid-uakD7Cu2]?X\;"M 0;| xZ+)N~ViNyDGTyb1cmU@}s ەDP_N(͋yGp]O` `7 '0&Br._|!9\^~NTq?Iƅ?A#D&IUj|goo<承{ħAyUwGȟ)xY=OvOzkwtRJ>G3G1_*MsQ Q}\ܗ/a`a~C907-w?VDEX}˕booU7GU @5bZTk)skE"0 ę1bd֚B!{w:ϵޛ=>1PYEgɖ *:?A ߫j ݁1^@aGcSբh7 1}]xD궨fTD:X}PHXDڍզZb+XԃkYtLL ~m$&#l~bp_ 1Lv>Аgk'D0]ToehU=|,Kx:E&7n<7_QѤ# 510=ԅ+&?@PS^n^?o'&&?1xo7`6av?V+@Roڪp]#V^:O@'jWOX}fLFD䠍hDPΌ7iHTsݵ8(f6e~]K/]Q.2bY&߳cgB/!P'/jxFOyӟc )"[wo& cKx!.ofQ BgJ19֐A;Fj/>B]~vw7]=l4rIj"jlxS\} n'ߩUvBxvltꌷ $Ŀ^}>^Fdph=g`\s  h'QDcE?6 v3g^:Oe6uX}" QP̙ @l_5{0bЈ6EIgGJ5|MҹCy =TJ:@;OE Iׁ9=OOr(BKw^Vz XA>zӯO7Neo90{ʯaWEK⿉?=~FE5/^,9uH+"L9NbU|;Ba8.KW-Fvysy ;L+']=_!L]'H8$Kfd/I⿁O!O_ֿ}:?K#HaڏJ)CxX…_VM3F;LoK|Q*ΆkV)!AʔD%+f+Ti4V ֱ +}O%DXՓ5 O9 Y/Ұ$':!0P2Y[)M~DW.Z,U ]矻z]]w\wwUpտտWտWOXw"%鷼O7/uRz.sn_Y_8P9z8ߨ5S. 'm5pYoS) d;lO d  w֫ZSkpVۇxit<?(69;PljͿzxnm/i~W;/ ;;15 f")uʎ5-0eVen/-Xŗ]@"|Z_ ̸ӹܥyS̄s3<}z*~/0޿ݷx+hXOJ= 3j?1܏A؀jccmQlq3p~}c@οRTZ8'P?TF/ ϝs"?\D4zCp4B,vC1#v۾L 2P'\Hc)Zgև|}Mp>7hm'}b'!LBt93C X)OE;é5 gcy[Ot.|bpgjwCӐ3\;! ! lNˍzVx1|+z4x>=z 0~+2̧e~z}0tPƻܟRu׹x>܃[ F_BφX{>CL쎸 `N GҰB"B`HGzEv '88Bh£{FU{jޮ#;'u{GjQξL> 0.CvK}Gw>f $~rxޗ|XXC@aԢqr*"D{Z!NӮ`HDlP1z k갟L`B$ӻ!ɸq xtp{\ 83.CT_DuO/g%O!j˂]_Bp`e{eyOB>Fw0g|O毵r&_ "D#n⽨}􇌟Im5Z< _BΟTL\`NSr՞r^@JAT K/c]Cs q5=Aڇ~2j!` HG75F_^Prʏbr_% "4A jeV VMos_ ~muޱ6`~=- w䢋/J u{Iop7HaU~Y{57~X?9Si6͑{4 IɔWhTQ,ن,|`/ OmA㍓i1yԕs|VӖH.'hWh/{{d:,4φQ>#@'Ycjg#@[J$ΝHBT(2g@"ʊ-R$K{ؤkG^|"<`!*xiH #FӕS' g)^+h Yjcmw$ilP}2hm4%ʑqt0[قu8a[8_-9WAH1a Z&BX+YAؚ!j [; cQ$h?-W8r@)AG@7|o6ݺ5Z'M.L ?-1ڇ_>'{02@q<hz »hȋufy̌HVʀl\5I0~pڦe#^BDFƴ+GXp,0n3L.2 $!c@R.w l%_7`̭h-87 i^P!F{iZlcV؜ qmdn&6#8C|` MffDt +k,sޮ*.ȓ!-듾毌c`8d=Q^`a/iq7g W\U6Jkԃ ,~~G05*kCAΡ:/~sMwLxfه?}T ~`,}YʈRV]&sVY`m2|LMz?Tuظ$;~M9=,o*;MDʼndЖY a.R ŷGBU 85%ET? P$CTud!W]1*T?V~rk'm VC40TRJRWQMp0okF&0;pXӴ!R90MCgG~5D'ՠPjWeJ"%Z `c2\ ?4 ^tKl=~:E&5bEE0J݀~!V+BkDvɄ!~1R22 o?~BW?> ]xbq3y\U?1LV`ڡap21VݘAO~lA'0<2Mnp8xp,#sjNOtү{Gh8jW0jOXu_dE-Vf}$K *) _CtQZc*BIDO;#0x$ksF;0%;UOΈS|UEE_w` bUKvC̎ gP$/ZG#ZDXoWXLFz#i-"27k |;yaIF&LiyX4{` <@|$5r^<ƍN9RsW'G*whr4XtNDs ԩI1nh\*;R4Qo+tDE.!aRG.f(=t jYakpd5.Usu*F]k`&#,cH^ >\Qg;:A}W R[r5W'0B`֍0,yJJRjw3(BXI_Tt>ĮVUN!4 dBյs2Bd_63̇gADqp E_}lث? FO8dj{-G1hZ?N.py1^K[JUϩk~'_>8z= R \`s|:^G$u%͞"IS*"DՑ0j@<^ DA\ 梌"#ɉ*0P~ Jf鉠LaPM?lin؋&'YQїCӹ|JgEl!+؃8+IHL?qOJVֱ6(X4`?eڄVB ?J9Q'['ϫ9DU·TXGQIiqkC ګ7+O FʿQV`qp,ۡ\"vTl?/w{k^iQڱ 6n]N7;]})MXsV#RnM%.V=ޡF7`<:}8[(1VTbUU*"`=.?J1v e\( 1GɀH2'H$ Q[C@^]Z}νԭh;.ԗP\Bɉk .Z𽘩eրJ`Q`[l`ح+F`\EhǿR|=Lϳ> Γ]}(ͣ'xZ0"bwH+ix)3_md2Gb#*4d #4z= U֚gNY<I#`alg4)ܕQ #/Jطc=a 0V7XhpFd]@[LDU#=՟}B8|&J 9oC)OKϻ d L&HC:*eɰbNUny2F&J$ H'#9A5fY)i/ {,? `Vw[`4tO7܈ƿ@.k)8B&A%'@z>V]U 21%X#HF^0J/y .I&nL(* HZ&Ux `DPeuu-OjfDe-o8p7cNy.gUnʅE~12f)hըBqgT Z\qP$ : dU /e+vyoXEƀA.brz?"'隭$R#(LVNbQ *ĆFdhj8yҰy@;XyUsA| ! @>gXE[ga;/fȮ\ # C;ea'U Wv(s/b|*+,rF) Y <q=Wd c52^Xb'$z"jVV:u6o$ 5 +M-j1K 5>Ԏ)!|2~Q @% 3LҢ``^-}<VAxh-`6mbD)Z7Nt-ރuE˭,j@ABQ&JOsr1; ?Ue7܎d"z9+ՃxDJE3)߇U)"]eiR+ʠa쓒>(`pY#/PwGU)yA3Utl4fJ90ܘcvX㿼 1m kVj5[7raV5`ǁ#)G`sy)̫~z-uD?aZFSУe.TW"/J]]^fU㠢Zi6 &ہJ~xOQEt'[k p^ ,%qmȎ# X5$$#3?xt08v?q0Sv |S'1u ,AN6?Q@T0F|weWѡwrA#asdBG(ƅYeƠh|5'T5YpYqRI%ϔ{!67yĉi Hyr.HJ Cpo ׬ڍs~nSa%U~+Pȥ ۞!*'ovb (ˠXd񨅌}zμ=T8Qz~}r(ӡ/"h )o!Вv&> ki|D8?]MI_},=bTC'~&60 <3 7a[fnBC$z%U?Xc % (nH'իcv.O^~? e.I)瑬Sc\d8roB!|J|LH8 + jx@7p W7{`|\é U #fN Ţ*VW5BJzhʝ w@'ڨ=m'rWqj|/C c*9SŘ4BiքCʑtd"F0;U:?xDբsF'c^\~I0ri! &kr$2$HwDgZ$]*PE714=VT"M2Y\\OU4\ FbN1}z'+cTJM$QZ4RE%?WE(.yT`_AI&+T33a NA/R-¨kوc!ojph~tvb ݤb;Κʎ edQYT7<;J9ԄIaL,5GY 8}+俢הQˑLEc#)X!&^D'~ FٗD`uoK`mJ$y"!HT*$h1pD CIȳRxdoIL((!>+T=>jjJ 8 U_@G(+xA@ Xg(Q9'Ǣk[g鏖2 >9b{+Q,=^R_6٥= +/*/(:s9ðOVy9+DRb DC)׈R}^k' [5S7,>gy;5/ʜF,/A* :?-N HhÁE=hB* ~! DHga$#DfQ@R}Zud42YQv $ :Б/(JggI9}*OKF%:ҬBSY3$^sԁTsP\+1n-RҠr8p4S>'=PHs h A=FOKe[[ʚ7N"T7/ʕ dS 5yl†K޿hM'\HhQ8.j!N{F.S%ͱs YJ6\&'HFsD >TTޮlgvΞ`zL/?}8 ahpr=ӳ{^8WV6``עsףcp7`m+0 9UҭÐް.dJ.Ϭ?6D$2Xp/0,E/r;Vh@=݇9~Hh9J]Xv?m0LĖs^Q@|N BjƇhѹeP 9:A48씲{_P} HMp'>'KJ{Ś v_*aibZ'B~]Gaj|rs>>~r`C&T qYe9>Ta @/5>={X#A)ϼsSy -?!Hh O 1]4a Ŝ+ \gon^aBZڻ`M? |; _лZ}#J?T"rQk '9$>VMۿ?yK~>EZv7O=+}/;*8']Wقje'pH`zT˺|_V@xpLAK#v!S"A"s}=Ѓ }* SP52=n|ᤞ;˧RBAJmBegD-}6^q6ԯ9!X{mJl۷?}߷a,N%:z{گ衳/;͛WOɡL`dn螇&[]3V+; JJ0F95}0!v^!+'52wĚ0G+,5y:e/ڼ67O+)RٚxYгI ]`W^=P]E,@,,ي_sG}_}ο%}/N)]Nwp_?Nɝ럹vn%Bz^7sw_Fx oGCp}Dy5KZLJquέe"6>9Ͽ癷cY+0' -n2Jg%gJ!LXƧ uyx:u`%;\6p`yHvs:Mmֿo% ?ͭU RzkSxT;ҧm'7q?pw~ V^'俕(C D?(NdF0D5'! tE_/"笮\FoqEyy8j3"k<(ؕEGvY / 'ߓ38{ٻsW~uKV%'w +p_[/x5cs7y棥k R M,%_;cRXi )% ۳  ^ `6!\3 xCh}M[du!IsZȀ;0h٨H3N+nu25IY]IKpng~W|[_Z#:@3Jp#+M(+G[qO^v3Ro?EPM*fz+)RW݇zJ Y+d$nw2rko]_?!$fاi/y)5q ȼ=}3Fp(!3v nլ=yl?/z$++nb .]j*7<;_j7v9S=>2~ڵ oK-#Q$)$y TOf.,>Y9* s z)G%8t drEDdr&)IR(> NtRo?~c qPkg @pBF-#.XT?J9n1YHSA$ Iy};8w/n"ؒ_>( 蛊RA,h<6-~I\D|W׬ wv(^LOdme[IH2+g!}9u~Ti(E%AJ`nDc&̂&%HO:NǞ|ajp?:tn[[׏wgsqٙRģ\GMO?9 w-4nK)?a2k0R BZR%be %kjy6Z~3p@{B̑xkr1wLO􏐒"^2Ą SJ,p l-݅߹Rlq8į\F1/3AE'@eOp('q\zH2";엽~/?p_9xKBsA2I5 ! ܉ }.4!7 I'BoOm{ %\Irge>+)Մc-"fgOZYxV.A(jɋK`{\M^4ZN c2b p{Be?y/0LEK*LE>}6z4Okh ?lGW]~ kgLZljW IM xE9j1a_"y\\@\[FGoZğN#VyvcAZq~a@5Dґ q༛kZSzaw¿yُ5 ß?x;["_6͆L ``47#++I8/XS1hȡWEFLm6ٸ#ܙqSlFWeJnߙT9U>*Y(L!Hbx v; bnAWN S>}= `}D,./(tN&rxh >$vz-1^I`0O ",]`!%&J$GgNկ~׼ʙPsۨAVeE=LVg1p!_yãK}ӑ:#HRYICF{yI@5H4@W`eF^y"JգB{0@`˝|5 "@>r|w#SQh>yJ%Y;%D*O}pٛn{3ϝ7n#.'f @.g=)Z&ߐOҍAmp'uQ[CƐ(& >B8g17IcP1 QNԤLCƌR uA;=+oW8,>'+1qB]4Kx)'Y#ӇlkC>#(6Q!TԆ+ qS6֎g{Q&^QEr.~`5%q#%Cz^ك.5;ޯW?C*Zh@%:M.REsd;- y=|:x#V%֡ꅑuQ"zDf WtVӵ=[vPF-xl|2|wFժ~ ,ο DX ' u\95w:o<~2zhgP2"\c,&HOs |Ev-@t[9ce&QIB&"mCRvsJ)JOـ/F?{u|Jhl#[R3+PVԃ\tX!9ȴ9^L}N:5}?k{F`P( 6{=%AЇ1-M8W;mǩ-4c5Y55`&*_?Yk)Of/c P\0l fjhr6𹔗3G=iuuk@44kıqWxNS,x${JDL$_3g>}go~l[b,0 ᆝ*Z#h}H0.Zːgo1ptM ǨM뉆!=782N mȒO}jHj7F!S åE)柏fG@n91UϰQ Xy0) r #-O@ܧS/7~:۟Q`3 /11vx>%bF4OYKͣSj:z1 N`Bha" *JPee.!}X9A#FHiAF{hVy0"*vϝ;8~ HҟtMҫ2z6[pq /?fae|b$*/BVII@'I496 ]`ԗ"JT  ߉CN-LĢ8VxN!C2Mye _j`~9>Z3ǁh*wVxVp^mJġAb* hJF\i6o_yo{[SVo6/ [[ztqph`X) /XoV6m.hOhe>C o3NdnA"{ "),$1ziDV,>[kYО|L 8|CwT<S.:3xb#zfo=l O}Ξ{~g h}j. `}k; {?q'u@ ė!|SpMVޣYznflR^*j@ZRF`?6 PO_ĺ<:< dN#L${A-GGKp]g|̼ۨ(@OEz_`SUSYp/};vΞ{鹏ܗP}`?>p_2bq] ӉCجuc:k#0t $!G3:D%@uޓ& T /RT(P}|>J?f3@TPNoo~ۊ3o^P2ș*'s|OqQIpa AQ֔Cp #T<^X:_u$G2xjlyxxp#@+wR5}.i t=O}n|5T iqBɯOТ,?534/_[ϼ;azBsg7j8Y{A6T<؀SotQ~[ՠ&Z!+"x;\=8u6v5czcig`p^󸵕2 yXm%ǁ\K^:cE$œcN왏|߭cg>cNM3`"ol1q|u^{dWlF&yϸY拯_}yo{8Ss&8K$!t#*:/D0'41"9!)zPP(E ) LLX,mIiY?1[IJ:H|jkyQœщ;E4=e:==H X%М::u\8Ϗ0;C_ ẽ(̇F78fxO_2\|QozL Y@;3=ZΫBܻJqJ52^ۅTBǬEcSSC[؃˫wng'cHgSpɷ_fw YXc1$ᅩyk'`в", ^p޽/.5k# P4vG{Pw!xU]q`2⹿gHpel )|+0fcpn3uqe.AE3Ohɧ'f!sDr&g2=Ϟl2 ݹ@ s{?6P#"g7scVs5&ݿ ¦΃*W=r<\ZYP)Nz j?OF_(@vB)h_W ajD|=Ξz;n~7|LW9GT8fAoصԗkh9ܧn8>.-`U(1G3"D:G^cv>XvZ~/b=.Xɶ=.Mn BRizN&ӾHt E|k#uzBm}!;v8ّyN1&cM5SeyB+E௃j.@gE <'|oj0N=: @ephn x_ >.ܡ@J 1p/3w9OՠRYA\DzFPDŽ$8'w# JXzFT2Eb)\.;rD.+ (>dz`b #/$j]*—}G7?p\Iz/΋18V4P;*D:ιy57wk{y zwJ0Z˹tA%{YG{MC=$Kc:դ˾}etX.ɮ= z˦4V<2g qg*qTY1ڋȋ@`#Ғk`ZQtOջUxog@&Zovw]8,l/*㷠ZQ0irQt{CF Kߥ.zKg=U7#BTedW_r#A!'%|H?<…0;og?q\z#X  [E?7|f~6%]D]q׸1l* ދÒQ@:Bwb&OHKi߭N ?HH/nn"7g;gBp/Uz~[ت]I@P(yyh9O6cA տør=>tGzu.Zi˦Yr὏ {CdƁOH; Ctנ#eXl&CDưC9ZEc87Q9 ƏNPh~9 g4؇mN]RNXY ؝d-ghntoޏK0zXƯ@nR&qvApB|=*mW sCࢊ{qv` ɪS6/IcaՌ 'f4&פhH"G>^1T/Rp%Grc,){ޖ3"A!KC-ʞ;CΌ'G%'L. z @rVTKu6u<rx >Wvמ4$o>lԴĝ9]KWCW6;nVEz" RY*DU@q cYUȌmu8V7Aʿ_*e]a6|'&m<)0A}Y;Q!ps, mz?p=Fq ±¶:;id̏r ,Gb݄?qs(9 prw2GF99;^դPPƮr:1T!IT}N0pxSD>oY:߉U?B7챖[M8ϴm%z؀vz';R7[YLFyQ"ˈԆ# HIK܉k, cZa4G0n^_G$1K_UYM?(x(R Rs?~ΪPiRQ_W4e]w9+0'=OnO}q1jSؙETFRJ]oOV1,J^MP#̣gmӪ11=@+EoǸsh+5JG g5: {dk:ۖـ8Rۡ S?G9SԮ*^5|(R~_}LVl?XƚO?3> 7?Fad][tZJy֖ߗ@w) ?Ftɷq{nƢhb yL> MpFIȅPͿ];B,U<?$Tf8JJhHJ{?l~A9 U{g]NkQr*uBc' f: ERi8X٣kPlzU7{X/<)~\ˏKkNYڳ K u!+#='hA>R?7e1[P PvDt69^s|@ 0U@J"ЌwOg;z/sA3Q΅6t|Jahc gk WZ? 4}Ω0rO3?buQMlM[!4gI'&r6q&\㯭R'k"YZ`#sPr>\=A̦1aajb}k4'iAmugm CbJIY!Eɺ5~C)F l)+Y5#7zt@Ӌ6 ]"Y컎n ܻYƦghpWu3:>όdOSt Qkؤ%eyRlKy4nG9HRuV 8OG PC5gPy8罭LY\}DVp&\ u|r>E w;PzmU=^촑rf2B@v.9 W2"(B Zۛ+u@~{cgY `yJfLJ /B7?*ע jl 4<=MI?ˆQ(0>s"Ȝ@ DP2(F^2-ٯ7u=?u t#Y>s\ !Xʀlnq(~N(9WNvl`*/-3^. ]O9߷wz  $Qzdž n;8j]7b]t~.V޷΁ zt_| [ Utb B~+1 #%7&djoS&AC p#idjG>^g/}ʯ, 3 DQs)et#Y*鈀G"r/$4< w̅ f(8zlFZ lcsa};y!@bcB 0K]Wy:to}ڠ*0ІPռ1 a\Vp^C%*oq<}j03p \ԏSN =s>?l`W/vDWU 6ʍVN{A{\8"j*t }TG }րuUM6"f ^ab8X3R_<†m/$PaFQXh_ߵ3J90W,$ 6M]!W6Ęj#vH召ngC-ѧ٦q@IB4|`x`9gp3> =dj|KHK;Pah7ZLQasI+y43\yb\ՙ𹷺79%@``{X !0aY/,f &D F8F5y4 r{=u{H'twuUuuux"lex[ق1HX;}GH_ve !T!L8Q ]GH^ }h!0&\S8v˝w%>RO H 0gk2"\558!>yI0 6 &(ir!@X1@XP r/A*ϳUVA%Gunװf>K/lIg FぷYO*JH{)m--] VԤϒF]T̒V'Ӥ* JxuL'c&Ä\mpTPMBJ߉w8Yk3М'Y<>h  \L̃ym^yß3SPqIY $lrG;QkkI*\  dz:M'IC.S\WD2!ĴG{JA L JH7O R!$:p-VBc : vnB ,0>X?!cc(xM"X.IbEhʽ\ս FO_M`Ӽlh1"'‚&."L,\h*+ '([j]piJVK\oaI.AC>vwmMEz6څ 4myX%rR Xh`k^Gbc\ӫ#nZԶH84;Q`6hb|*}0Eb e"B$#Fq J ,m]{+;7|{o7[w_ D'MɥebZv\1OW)*/m2UrP\04 ԧ&H:L tvԄ5 s5SNRu g@ m1( ɼR0;[  \@ =C{euɁ.@CZ /t׺V g3g4W&V6Ǟ`@_dږ/3%mHE"t+ ȭ֧uT@J"/W\7j`J>~5x=Q~'a`R-kOpAadž#='u]VAc en02H@75NsҴ~@Pv}p`1cnPi!k!!{<}EP 4EP O5oi˼%[+B ū"E%{UrJ% V9 A y 31Q T? B#iLKe0&FM*Qr;T N(cSA\R}ɱcR!Izz2@ =AwJ S خ3ر:k_Y]9UD1 #}m\fˣ;A W}bO*?k!ƄoC2@3xƂZK،DŽlstAB0GooK筸291UuŽz*׉2Rԣ cCPA20l $4¼965Zكjջȗ_F1i^[&zqcMHSG3 cj_ pw_WgW߁-jngR '4j$TUoyҕ׽4\ K5S*jDrT+f׵9QXp=CaZop4.U(0sRqzaɃVuK\k T<2>6m:)0P `ۧbPApi*4j<d81t*N꽟>:5|IGkwx J,Rq(@~`dX"HT!x($ NABY/o_Cミ_y4uQ3|ݙuHK3]_8>s68^j֛qV9D`yT]vjzH)UFBѩt) HL#=ݡNA(ۊW{ "Tz] g3Tf:0q"w 8 cI+om~cMN_ϴm3,V GV;՗T*/!iWt JI$"PQ@/CraCg:]r/Y(rސ(ePnhI;&:@M@dC1lBզ+Q)Q ԟl4|;;rgi!=m4_?HۈgI *!Bi]x&sִ+_/Wyt9xʥ"ūZXew[VK/-zcW`cX;iǪt"P^T)pEx}eV/B(%;Q΃T\Ӌs 2ԥʠPG[u ebg090u`@b9JG2 x]*TDexr覾 Y3"TgDxP"c𽚌):(ׇ;&vdT8vwSۈ¶~ ?GSaP͞ǂ|LHS(xqNKe HAWXp +F#P”T:}y&fȞa>46Ě| ~n9<.F5%GyS@*`'>+Y[2(/+"Zϔן}'Vu _%;Yy_~#" 6y=0 IA`@%XgSS ekjtHkJۮWܥ0'FV@Z9F |* G[."MbJEB%+v:LsW^#e|hLn*IgD2HbohvڟH|ܷ3鮽?Km'zԪrV,.c֘@:A3V,]z?[W+*0NU+*-iIj 񻘁K~3fjnm5Wk *vnK=<j\@ ?j^{[PQ:h<EphKZUx<x7E*&7 7$^ 3~sKN2D" G~~W3mp z 7AaPy ȱ4|$މ=,b˿eZٽk-h.h'*=f xOfOONAޤժ~kVi5UD:S:PzB̰R( !c%`3AHw1McQU`&ϙn Nw*=@sTɯ>wAԗ3r;G r1+"ځE/Ljgpw)ǀ!z,-LlN /X\HWxw]FzPYx1g{*mڤ_lUVmp_Z#5dC'OuK= %Pɞ[凊 Zm_h/b>#0am xrRBX20GC& 4덕W ̐J5,5M XOJp}Y |B=H^LAH#+Pc+i wqX1㐹Hc!u7t ?GU|]Jƛf fR0 %)_ ?VʶbuZIҪ*߀}Js6rС +FA&470iA-*P&\SZABj*IajC+Yq }5.l >46X=u%/P>->G\yEYY& ~?}R x| 4ˠ# KZPq MEb}LBD@A$sbـRxȏe^y裸J[Y*o\s^Ҕ++mz2Y^*Z̶Fyhz!A]h~_ b|QG@z7xT!,RHqȅ_¼xg ޝ{' H[|tGE5q/+#ݨsAas~2nDr.$~/M o>$/]eKI9%tzGl`o;D+> )ok[quc΋lKCI{[{dI5^&-kCWl?i=L%k%}Wޘvke57!,7gYlXT/t_mUEg(A*PxڧU{-; bθibmT+~O8:L4ppM4Sw~ԑDxdJ_>pb?@4^(R@eq7~Jla1xb~ݿ,ON}E~bm~^6x )A"mX$O"3|fe3!QZIo`%oRW70~O /~jmLOsѵjiEwMSW^[~&=+Y1Ҡh]yfδ~Ec]FMe ,TbF`%:Ⱦ ,ȧLq]d aי삊-gvUnPϮsrx8>Q ` HOt#2e ?(SP "Bv}b.}V*);\nU;Z 6_PD&E迈&fa|W;Vim}x /\UBЂn ֵ7VUJI&EgÁ&@7}5?fVdނl! (V@JXg@5{P* ǸJ!Trd``'MOQyxnok,pYW˼0 #yy;(1cȔ |ň0ҰEc(AX2WU:k`5.?l:5(f[}?[|܈Kڠ*IKޥ%kWOiSQ!'aBI YO37 *ҟ0JaS~ m{b23J)r0;X:~-j]xF].X V$E(q{>ztId*Ƥ?g ?O]su+P/y񑉡.4B׏6،?UPR/@Ce[K|9n@ٹ[+t*jKH *$JTץ+!W[XAZE C W5#mʹhiP>:FF [#8{B_ >:`f S Bp>Dhx>@[} ?f'1G R+< %gr^ذ|:6Y^ߜT[neBk Fbe F1R\Q7 U@ bZχZW*|%=ky%*vhC:;8L'9rYL4cz~ {n~ vVD &$8@bW?p.6P=by,>܌0`HuPnQB9=#Sr| =90Oԥ+_&,7^O? UA=s@և>M,]!{SӅV,4֟z}*RX4:^Gs~f>ԝ--j̩HeJ.C.iXdrY#\, :j-֮*{Lޘjp̤7C+u5.>N{#P8M3?\zde&˖k ԡHaC IS GnO :dL 54lo`2[Pz(UTB/ԡq̏-LQUbdzĿn0\>#8 ϖu;ć"DH5bkĐg|@ݱhA@J=SDk`~ 0*yVVE265gMϞKC ԅũke^YL[P @ڤlOd1v)^d>5o;s1387mEm=xUș9F74\*UT)f%`]|MCHLdR@f,;ڎs5EsCM5pߖG;wLџMgJxl^Ow~%+~M !DB!\I [uG:[a@$eHHA~10IJIDZQHs;Czsx K1y$*0NG^(aLO d5bN댚J}¯yhm$xA #9(;^ܻ.T}},蘁0 z?QzAq{`fE =y_A],SBӂ Uՠ;GO <`4 |igέB"ˎ Cޠm ł H;> ȷ½k2rfZ,D3$s\SL٩ /HD'uk̈́w*m+a@$f-½{m«;l^Lo,KI%0 EM2-ݾh+4'# !(AM"):QvL^4 Vd&i81s|2;KypFQ}]CcYߡ, }7ΖPPǎOmd妲7F\w  ,JcBP!C@} $! "HHo߈4 ,nJ~xO0FVyW3Hιf7Hٺ̆q gT5Ȃ>0yd /W44aa=$Cs)W@+[sdn=h`Lv%UdBTо8,Lizh MPb՗>ӳkhj6\&)9?$@?ydzˏZI\XGuq2N " ~"P.GH!`0 "3BrBT.gc!c$`D`&b@ :V5C34]uAs"cQ㶐GTFBW_6qՃ-qK ol+&yldG{1@S>GMڻyNLڦMCw`! Fo([3e|j=v1raJQqOd 3|/(9c})t:#I(Y H;Fm5Jf-k3DdӘ-ZUS |Bprly`t9.Sd 7s +М=/ < yl2Z#1 }L9qr?sv0KЀw x׭X$-a wQ}?XXt1uU}B#b:?^'0GII(2( 9S)-[(uq{&RYx}rGQ :QXP4UI\At4UxpBt!KJBbd)8&y:NTG;ۺopAoȟy֟'x&CXgAB'}rbKcPS ߃?A)!@XlR/)ΪXÐB9q$ 2d ,,hY4xSׂ.ʺ+x_Ƃۯ,/ˬkk=rP't_?%?ZL]s5E4bz$UZe||W6nYrܹa׽4#??H;5Q] W+Ss/g!@G,H@,EP}!r$J>1{4 "IbaKHf*geMU\QhHNcSheVI(,@7T~h4r{L x7F),fɴ]5f•c!w?_"acj=_\FYwlط'9x]O-XҶ8RK]x Bz5̏0A[.auh>&;ej)ܱyG7LO(u[Yn˽ +M_tZ-ԊP$%R‹>_B6*~c$ط ۇ Ʀ)F?beM‚Baty"FA#gE>iȯpdGށ^#9}w;H`X$\?@ZsGeMUC2~kxNfml KE ADA\ oBt'b6zTwүrRD$y#R;wCdJl YU?E %ԯ>}[l=5 0UHK=D) #E;F@&PhcX(cd0MP-q d>ĥó0l,xߏg^I1#Cs > c3>axx3碚v0s2O@3'or3$M_Nl,Uo ߵgՆӫ gESX5J@V {۷7AՎ7Lӂ~>V8F 0p,`! BP{@DI@a 7k ONA0=@5AvpV4 3 eapD3Y(`|fm9h(&di;nHBH!<}N[lT2 /~o oS= 8*0=X63XFA DO2JR(g<Ձɾlp^ǟ2Qp |g6^+ *S'A)vS);FHIPaL3bt}/%ɴl8KQBXH-ŀh&SXzeXmܽ׼tn#esѶMFc#-ސ|$k3n[rg :V"gyQj*TdOOa٠j%p?۸Į{ ptۮcYCn>g{82Oɥ 2N9{R+$n)A|lȔBd q?9g ѶI!@0 4CJC6!|g*bp 3$Fg8< C؉ái픈Z?!Цta; &xy_ZkrQ ,8]m3N;X1Yt?twjt[/ _g ]D~4KwjU7ǘ4*EC=-59:`sUCmK-F~,A`,cYBS=SJG1<@}= 9(Y"Gk 8נt`(bPiFho,VLhwq;耕$f۵I/yP y 1 } swi%h#桉_3ga:{yܦX( o)X,px\ߘQEқД^ l݂n!&;xp$y==7|g۶uW^B|Js, 8<A}@ՖcCzԣBXD3:(Gm <4@+91X.t^bt H93i63 YfH(aE \EVtˆlE%zVrsW'ϲyƽ<>[ݺ03'[xӬv^s[uסFv-/>"Xo ?RV iF%Gea^\hH䃇Bѝ" @"VI>׹`[[l \ 3 (rBϙJ8ه[aVVla BH;qfp j15ǟ;;~c6wnXԳQh?zYaw$|d"+L1H)(V^Nޟj݃fca0äi1! 1?nωB!ZAn+!ΐzfCV߶r- sPg d?z~au۷!V?*e;lMtPs[ΜS{=ޜbku1ܗ-C.i"`B )7XctaAE@ So@mB3vVf= Qى}v`'`nK7ώ=}- 6^p$ @+pGƳy#fs0s,sʰx`N,V ZO-v _27? *(1<{{э߾A eFX+(ɅbXu‫-Z Z!A!"f V!-DK &Jd `P8@yR+'f>,OiO/,]/aa{a?3@nPlΡ9^cculc=| ,O&? LJs%=G#u>#Y 8G,8u Rd(mV =&t)w At`EHeQ)'k,*^Ҡ!s8@7號#|~RzO0d"GQ_;z=} ̆8NYv)o_lgpS#!i'`tU{~A#1D&v9*$H%זf Ȉt'|c⤬a+ܵ\q) vyJB @~,/Ƭq,>{БMǎ]"UOF?s J.6yfoS%0M??o7߳q}=J@WR @|ҊPJ6Bƪh:2RaHca`XD RB pM=X3Ҭ0"bgP$yɯm&Xދf 1M7l=xv+6(KOgX\Hb$W\fB+h7xmk?O{7@p|wz b!QLN.Q$OP ^G?3Ȭ{ 8,@,;h>+0 :9-ĸ!; K1p27e| \:xn50<7e:~'8pB)_αiun[ N_ic[vcr~Aҗq%^>Y |H0{D.$1IA (2imnf]~|f`FRWp 1|7W$;150OgS?vo.ZIW9/g_+_\vݻ6|/\G~u1O#ӣ/~gC+<a'GȠOzB@i/HSYVAc(ޑ#cE>a]h6!4},kd`\̎BpYJ &)ۼm}cg6x ~=Fb:-Wx?,Q&|e] =RzkW_.nz3`WZü`m Y0d¯ABςXOWa<u>BqP̞Ch#z i(\g#A,8h@9jpwoo86=]' ??_.ň++ B鿾㳟zwU8G7ô15|OVҌwFUd,@U aX{ӅRG0!#l(!  \Wܐ5 ͞ڎA҅=Q`ne?|}{~ >gFYؖ:bDHHˮӜOn*Ժd}[Z之XB՛oA"~k/,yl0qLS(X 9 @Af%@0K9F;hER@־-EWАy3 (l]t*hMMB̷ѡK~ Hoc`b/nx}$|__ MqAi4tVF!_A,l_wݹf滋#fc_v!y]+.y/Xtt HqӢӌE$'Aďp;ՙ*2/ĠMgd8˄9W^ Kȹ!p̛I虰BXD cCSbcb}9wa+'޾g]=םe|=aDJoCyQ?e@x>eW\|kN]4)HHj|1h3TAB]`I .>)n@gdAg0yZis!ӀZy0!reBl ZАw{O:<5#G82f'O]v΀97\~[鄄7w=?k^܅aeB2'憧ǔ^+1@T%3̳-k % lY֜{y}vh&C(Þ1yhPPo}.7"KVdsH<^of Uy@%7׽^pZⶮOE\FHA$%4WHК1?C7hAVL a) z@, tA&2M̼oP?z`hk۰QXdsGdzlU!=A  @wK{}XK]Ek` !201H7@Toq-+y] Y"O.%PNly/3aϽ[dvێ K6649Y@Z?ן[%l[wLOJqڑ׊^| DBT\` 7zI7ݵMW.k.YfEmPlʐ|Fs "<M< H HOXjChB>ߜ Y\/+܅K Ǧp~@ѱkiӏ&&NY+ ]vYWߋx`>_o`n o my}yW?c޲.Yt,,ZbB˼z*GC);Ajub=dBg " '!+>8wӠp>w|Pݶ햞IK7?Ep&K;`7|b T{_|k^|΅/DzϜa12wJ"]" / zј &R =f?`Dr}lH<:F<:<iNӔXD$[C~ޯ)m_x< kGl> 7XXS[ػ/|WWkw5,\ն"Q,ua?6 J&9~BaF}(%@G<FY3P8B@F$ׂɚ˶/gE#ە mvs{ùf}>V%a f/^_xt-ZKy *ya1([ĢB' E=(#[3,VTcp:;):11qGz|Y}P&B>\?<(B>LQ +_/ewV[w-j קX_ /Rl*Ē4ϴEX"8@sl/L=E|0;1N[۶=0hyr?hTsP ? }.A7we @-+]uTsѼmv/+)S/bYX:V?LL5R884྾c/{FF}׮{LDr(7{+*)?h*sQo#AB˜2݋/%RjU缮 `uW7,ii%o'%ȏ6S [ o/f$f>oO/n w]Jṵ?٪emlT `~ݵ*tjP@2P N1kCCn725u895 S001&!đ4)-c؁{G\䘛?B*S) <74<"@ͺ`q+VK-p&ZuIU@[*JК$P U*Q 2 y](Fuy_LdC.iF)L40Rz}:G{pO=FJ1 i7IY۟)A|Ϥ HPN1^B`Dy"W^J$˪/06Oߝp%may ^#?}RQ{&p ġRo4&&=9xÇO3*Xpe'݌7>=nsx8cEYXZC <["r_#tr~lGo~_6M7o]fJQ.37zl&ngqƫ^.U'[7 HfJK!q3<7kObfJ(DϚi۞r0sXyrߩĻ샂<6Ge0-S͉O忧 A,\1?;= gkgf3iaZ\@8888<<<Z/Dg=OyM^.ڧhG7uoD`\?3{"ݻ*^~^o5R.wR^bsj>[;Zs_TD?im7C@W|FOu﷼G֋ҽoftG[4uH|ROK8\~x%H2_ ǽ]zdkm?mAabe pEKx|s󇳚;I4? ;U^lhu7_=n,n!]n譏Wn#u~5/nk}oeak|AJHǴ.F}6~UX5@YJ"a@vY|$C}₎%=iec_]/]&_?|p]]U7w#[u(]qF]N^Qy1*m ut @'n~zmͿۗ4Z,.Sai-$ K* ċ:vu=G6aArS7 R asO5\OfM~FCCm χ%h۬fo4_|w56_oIh}%}epes>p_WYBlr<&ʕG XMn-E'w"iZE(Q ^" Na>ߴ]`O9:MꂎLJ|d 5D5nf}jYW(>1P-=^8v#pbb q[KyQ'7Rl. V]l辖dB5 .h'v)1.l_~r.$VCpEYS*6 !Yo@vjJ RTqu!#nUFPՄ3)˲qƊ XZz +c4Xa1z^s"~5J=ڇʴ^:~ 'Q/ ?9r$Ti%Ձ;Q(f#\Цm5tzAM6wA(u^ @_،ȗvR9и|{V(cqI;:6ǣ`{< hR21R}AHt`)77[JktA?|ͯ#4[}yX­Eޘ[~i19RwSE c=2r -W~[|R@w.Z0Ed0`8~©'^Ǜ\Zdi/b NaK~%iRe#f/Dz$c,P$(R*_9=+Ŵ`f*] 6{M|w <! {t;fjE@ӴD<_^{ 6v*)3o|i;XYE4I{c+ŴPRxMPS%CPSL$΢2OJWlU$eV_! ^TR퇡O65x(1+wtata޽Zͷw+ K0z=}HV^]zjN8.R0' v5F6؅>PmX3Tl!T5WR>a-9պT[Vc*vHspwBցޱ" ғ("UĠtЫM1lJjی5':W{KT[H۷^f5yN8lLlFDHWVaU@eTkv/*~6j!Je0 d:L6veBKϞAEw5m*U;K'GBnWPPbI:P ^Y.U,*1Yn@-takA)CrbDdJCfkL[+BZka13Ps R`֔)4/vX\ԝgu.UFdS,)4 g>,CdA BZp Jtb6 J L^_xB'w3/ 2etlJ}W=s~3]@ ˯\\ؼ^(vQsh<(tO+UEbk<`ÞBš\3P9*#,(;dѳ߷1z*QteI"w]k梒HHWЉ{<(z 1kd!j+dl/Z뚔f9/ā85>c??]ZDW*=Ujku94a#r<:"΄6Zn~ @^+$*.4aR9G.\Rgb@i'6ٝB楫"0 "8E?{iN"!ҳ10#n2K grhM36h83Ӿs-^}׻޽J}\v@+M6|s_k6 l,CQ=Y@8(?M}H`yYf H7P#{#0h A_`È 8J.0QVy0jz=B2"wڕ1h-p B /4KGJб+_MF<ͨץ $j8 [ z_ï2hi8}Bu5 $R5+qAkO}5%a] 7ܽ<5Ô.H}EOQE?_P Yfj˒y ]#rL{pv0sf~K.YA`E `So[jfģlVP`wB@<:5Wr:ĭ%vkQV^1` +Cyp YB}5nHiI)H8 DjHe{:] 4POs:;U6S]{fZZ:_ѳn=CJ>* mpG"^QGRm-RbG-! c`L%U+6RCʱ:ٓ ,j?^ऱ]dzڌ%däetw 8)ʸVc'-ɚDިf1P&sܠsQ QTBcP(`J#G}!Y%y5~rj4&>UKk#2qtHP 4ؤTG la#J'l kBAx" 'H|y69uM @1EyՏ֌ F`CPBM@ϟ]UeP"k fXDO `wBӑT-AO_$ywpW.U~ڨlz!7BB& W;fǣ B&[GA ՜6KSѝr@ +5ia2~WD T$"îK$_fTu9&lAY%эkUG1;eFJ,Ŋ]6^Qffkf]իVX?󇓳!BS v߭t\mx|a@Xt,sT:=5'H4BxmHB9'<^iefq0pײu> &h\rxH5 hu&]ZXϻ+):\ۺ)YASVw׽c@]I9JI~saSf xTUh)Hx9e}p)4K3O'tQ?E K F=] j_:857KiQW:7-j4h hj?r:{XK0zCȰʄF`Ѻo= m±Δ)R)*kV_d1;TIGMl9\$Q-Ko. FlD`cSOa B۫rؓ#Bx)6ij 'Ug쒩<2W"2Q#lJt1I:Y[͗ݦ6Qqzj-I!p ΐs nE=TVXbƻa> )EE(釥$/AaiK58 $ R}`E9pe$"00Ib]T)@ vR!ܴemC?ߎέ,BA)j#@z 2+$IGDT1[ $fЅWOVOHy-0'*9r *(~&8֮K/TVx;^ q3xl-?&sMZ ,T' 0%y#;x$3U@c u(];tFK?~ ygɶ©vwxQ6IR񯩑E)Mbl1o2@C: kZ?z9v:9fjٺfի_<@Iݙo64>2yK(T5]` ~-qs65:S䇺o"t)-sܴE7]cG R>߇d@,2CS /и"+^(GY,奲b;wA*6v:u0./ 䤃֭W6^:~ZY3Ş.T-S2H.9 $ 3_lVF1z4T&zаžJ>o ,<ܠkxdѽB-r[/ k\ * zk4B -F~rơ>"i8"S7㫂xl}FvSԃSZ'tpsʯqUbqYKzUBo4 `ZhF+Oٖ9-Mԋ>MOMaOJIfK.ϲwPQP0VMc1cϔۄuܡN }.UqWpx ;<8{y^ju H?~rf[X|]SJ"DU?;wh`QL-g]uj*u7gPȆ*ef6ZY'N՝αW5J$4vfkߟVC.7M `q))yD(a*(hL)r$HlZ_$L5{2Ϛ@moow 9m,,ڗ*V?gG}8x%%@=T͆J9"*uQz,R d 8^D3G0?jbWy~+)4un§kaA\SmMdpӀYA"K׮dRIk|W0QmZJ^aq?dx eag.7+ Ml-s[`y|`CXO3=0 xv\5 yV7+b"Bh<2L8*B,Q.exh3(B+ʥY75,6mGGE~xӷw{[MKʁ\/ AfD\52Xly,H$^3-8ʨD{0&+) 񆫨VX^+W O'] -J>Cʣ#")sqWIFW>n8V ޲.6 ] KYiY`S.,RJMCW{ChߤJ~r:33 .6RЈ>P76vj7)<$-^"8@fB!S>^e:ݖ$ kRY.Ŵ!QI>P8V%る7+"5 5>O\k}ٰQl M˝ڻǞ"Ooi~1"ϵf޿̆ڋIJ[V*Sg(JF/qfWn_[ZnBdꏸUB(+pzOUMzkY4_bUG pٚSfN1OJ6tb)VT<2]u>z ΁P^o74S~FGy|G~߶Aqhϡ)Us=WT[>%WyE'Q4;Ȓ%vl?;߸Js @yjw3|%T[`CEGHqP|* 39ɣ Adg/"3JD5AgƎ[Nzarѡkּ})#ͯW 4v--7\x‰\ɪ1ڭ^+aiF|ٝJ-QѴTHS*)%շ\8УT҆M^Oort2ze9" s4|Ȧk䝇.o|l]v{~A͆o6ݧڱdIRƭ @r()"S2`R1yy,irz,0}C$f&T\)MVQ9 y5h3R6 v~aAg)rլ(h% 8k f1profp| $PmE~#Mm?Ӿ8u(% |7i44q6>+(^Z=,kv,‹ʤ/wNuʭxV*!J$DGuN^ހ l>5S)eF1*E֬ebZGw~Ɵwm̑")rkcDi;^ag: dI!V6N= 6}KQlI5,Xn3מ4C\h.F`АPϔD_ۣH QQlep^w1I2vjeˆˎ},xfO9 uZ:Wz򨿧M)9Zdw8w$!ꕜDCG)r֪DtF%\rVTs ڗ=dR`bTb)v|]K5ua <0ٙ5|4Pآ:H98g7M}pS l^&xfikAEA\FP{/Ap(K5HgֹlpL -g nC?Y (PK5y¢luUs׶U=mmA&7JŕG<Im}G%ߵйh[~D;OΦw`/Ҟ쏝 h~yieJ;o{@%e,8 5 ps!'&0ܒSTJ  >&Zޛ'<[Y0#2C-*$c,X*!P̦֓Tb`,]$%/Cuzƹ Dn<ɴ7|Dц"{ 3Ԅ``Oi·PF*YoMǭE)  Ptyj no+[u >u) 6 3Qњ y(u5j 4[*–ZK(iZP`6 `O ~1G) mws_H>^PII=p)) ?);@6:U :e9|XKތySW Fٴ @ꅇ:5\} AwiA0%vۈ)j7rHo#f pRk8U1,'5'O{L ҊuF^yvu#' >GMC{w=UjuJG"9TrIr3 Nus]#Ҹ@%t'&߻//pW  U&ArCӔ6D˞lyn^ M9TV)ٌ-mjh+qRt @B>zAcl޼yEtރ'\7_ɞ8~=[ ߁;({^|LvW^qq~>ٿ% y5aJs e(]O;0Wg~(FJ}Dmz+8p*roGlT|f7,S4T3ja-J:܅(Hkz6LpnR;+l+2 s}prȎ_yqͯ[eȮV4-=riqF=e4`u@?ɚB? C\U=E5@qfMOН>OWRgOaAfhbutr.E0ϴc޳?F6-S۾mg6{ mmRSu,kÿ ;ݴ_~[s?pJ{,]TjKX2Pn$4Ĭ瞀TKu+sv̖Mu{!F<0 Нs+4*juN1u =̩ XO`oaQydSƍ<3{sSR3pf+]:O闠rK%m4d|5EFXfd .*{)5PMN1#:F[=Jb4۠V$HR`}n."Ac͠KB+uˣZ/sd1GawE9{Tw6y+M y鹻Ʋg/q4k7i8L p^jRfד 80/H:-朔p)ة`Vi U}mOlΎ*T or5!6hR-u+[׮ܤo<|yy巏Rg$ oyĹm^l椿TfK  ]N42V/C\@GLٗC$PG6;(0 WkO +-YzRs9$ZmE KydMߝf" a (#1Zq345eQdq;z ͗r_f75D}As@:WpE2'j~hj^.;,bo`Fw8=Eg "e\˻VSµ!;ylR>FO/}]V:m>e!4SN"^lV[BU稑t//xV&3Ev]so@pF.:sxl{ ƿ9_zlL2LҪxץ ZNNգpw2 Ycryk_AtEMn5{N97ypfrOըIPM=!(2x B'p~!{Jf**9?|qc]3E֊$jj7̅[ܿG{*e=;[9!ja' s.S{IC ƀnxHzi偀6Eq\^; ^5 34ݝ49VЮ]h'Kǥ 1M%V\ƌ5-|g47~SNaTD?i 6k٧ 3~~oij=f>ہoX޵Mw]l|V+mۭ`szT2YRg'x(=9lWb.b=k(Қ$Aϋ::t'7e#g$ƢIZ\W|—ATwG{%{p~=ysꟶV[{D_Ii^(+vٷfA~o=}hD;ҎE8"M\u<6{Њ̕QwEl^A:AɃ|Ta&o!_oo(.AAY<<Ճg宿?z-{fy<{_]"r)+9׼5ou䚻Sl{2ݦ܁Y`ǩqŬ>O9} ,0ោJ63;ې+ Ek?A^*sfᗔ޶\p޳ uʏ$DGrV߫뾚F:U 6mGY+9f;[*&Fms7߹b:w<յF^M["jeD!X x63֍f_XψTIP,r3q\y>11%=R]|^̉J&vR="4Ԏňmيԑ=- Ӽl,|ȃoُ'\V뚍YyᙛݙmT0hWP`hgM$ȴN7^֣MdHPR)i4f|+xp҈fMxTfz]"d\K5"DYQbS{:pl,j*?.|[/t|Qܵ'|M+xH-re%RYB-C$<^vz晲epD9b{#W|tsgooK-!&kh}c)hRXz3XDffb#mܛܠ0<@Ӧ!!"q YM[eLIԁrf|J0.1)gb/)rӍ.5(0w}S ܂$ r)^p%b[v3s#=\9wXO[qd: Fulx?OlxK^@#Dt3:(k)ZVo6)3tJ_-בW;#_ QOFe Q7'.ޖ'*[![v E[3>Ax#+[Yd{o_pld2;I)pqq^542{{n"h`uPK5Gi ;|):g-'лߢmϞY~yx^Gnl#}K^/˙3G"ZNMk~9K+N[B|M^iՅ Q J\fu9zL@)Z%R_ ?z"!@l3ќ%fcY$-kS5B 7v57n,W v-߬jVw{Dn}?%O=Ip]5ة.j65]Pkࡂl4Ԣ&vMIޝiLޅHRֺ ڌp$R71G9muҊ*O̵NcZc(Cm}b6]pm!-Tq/|ϐG;gDd#*8IǶGo}ٷYna=Rֻ|5y6Gzɰ3=Z>"tV:1ػ9' >K pkɿw  V gRݙu6ܖnNabФQp['#NUGވ?eg+?7oߗgNibGWcQ|tZ`h%[D.:nx\O__PxJ8|Uu?֟&u :Cj9`ʡ>p/I9;`YlS&Β71L6޵-#҇}6>4 gIB6VtsK_*Q3j s ?qQ\CZ&L uNvhM%ZjLj3РвH`yn GVso?\?S{ 53F ȣw~V^S2{xp㵳9ǁFvP=d)X4€kVVqؓ@ܠ`itCBSsEC?``զ[QBMW2{mQZiEveθ6 OUK?8cp&4A׼F>hXg#ljQw2C_p1i뷽ww[NAe۰`uK8$8aXTeX˶5ڊOf3FL88gk ٳ{[ ɶӪ1$AJ!"XXYE](2E5`ӥ*GdtLOʍbӘ, <Png_/ 79d { M('2:hЇ_[qvf r(@| lG4Ib&r ;9O]3l7@?QgK}=3t-opJt4\AK˭6m0WSFz:oZՐIJi;3Zv#G_BߔF>w[̭jh<KvȤiSpSF, VBg=#)0RXDS}{yqi4v{0lx\qI2wsrOEg^-k=Fշ`x`|Zodmʣk_7*=`e7*RQ"Pu-\ }t7KP_Po UWpS*0c8m vZȫ9D>l C64_xh0_?}qo˞Պ4jY% ,&: xQܬE@rnjPѨu>5 (l0UϓUW,`O 9S2Yj?s 3)`͛}I#TLz˸>A~f:mCK@s375'km6oS8ֱ~tf~;?+ֱ=>]eQPFЇؚٰ""an/5x/e l c'дjuBfj*phg'{!J_al MszK\ B'l^)G 9K<[(qos=-7מہ/-w] yNMCՉ>l) ]"L]OcݍajPb|gk2уru3y+9<%&7 VFd Vr dZpw4ß4E[:9ť8bM4.-MZZ!uFL(xaO>6 ./=%][;w6pSͫ)㸙rM1u1Dy#ᰞ% ǥX; 3gK2jz j[U=!j(5kia[& `b*,-VD\M!DiKɇt?ye ?q8ݴ <'w|m"^; ~^EBIEO_Lk):#P5-ugPmj-fA<\9yt~[m-ܳg6_<osv? 8Gk4͉]<ڼScؙRYDvU294P"ufQ"r5%x: wՔGO)\?E}kc|v1.5!Jn9vT_?0TႿ";}|>_/>Y'89 .rl,lLBM?6mޱ|+ "㙌eq'x;ak3H%A,H- /u_!iZ;("kdAy}%GSGuo잌<}ٕ2q\e܊|C":p'o?R𹟚io:ዿ$w>i@6QAƃA pJBZ sAL0ѸAǥ jglA8S:E\ّBB'$nWhQ쌎y f8ude/SY =i`X.'p+1~rw?6W^j0'hi:0 Lzإ=i+1U rD"nly.Yg ^;H?n?偛?:L=^6PJ8)zR=Exa F^'9 ZefI?R̄xqgc\G `sw+kLօ"WeN~65+6_^jt]_Fi19$TиIMWuX+nyԗ@ 7z4N-D]TBл0%A)"5uU 4T0qE$T5Pž?EUVŠ>l֬}r7o;4?Ib?.v t󞸔`E&k n7E3,XA^~yv9V#f*v 93A/`_&dHG| CXIlaWH&\pxI:ldOzzTrXѭi)GA_[䶫y/x.D=J`{l{-LI[5mFzm20^nf#r*CT uNxan(Ijh>2'LPEe[f~3@)ܹͦE$hU =\U={ɞ7̱kY'S$-r@=@jdql/dRFلp,7m~S/jeS͉6tٯ3~wlUE #g"&:P `Zblm7:NR4/7Tp.H"ESg'mΑ& :UStv$W@ ;)%|V(0X<5TelJ&1Rw`:a+0l_w,\g-'tojѻm <ic/}S/m7;۴l6ǙS S)4eHݜ>@j'x24xaC)y>i +ܩ=(>AŶ9J$<$fAeeQў*8-O 㽙v 0ULBX^6icS Jy Zb%L34}shi$rӹCv󪑅 D-W|pe"a}8l gQA[ءfs*0%4E c/ʐޥ^HƓ![AŸ_F(f*YY4@.R+SBQ V0W܄ZrI EB'˛~w> З6i£' rDf%ꍳb>o:zC%30ܣbN~ʽiBZ/+lr/0p6, r#6|s)D oIz//'Cr[ZOga>y)e)F\*䶫'y/wkBvDEfg~9AEA~ ^ &9 q6cMO- cM,r |mrO6Q"l's*d7a%&.m2 `{!_BH^E;ZqkVO޶k^4C<::U;̦>dH0V Y64kŶ.(SS2 gZo\qZmp@vd*-a}JzkERMQlItILExh4e]9dHShBK@=cY0oA RwIGi%'N:I.ivLM04jw(rӆLnЉ7S9!0ω)l etI"7-'ه*?wS/ǃ;r_ߧM8㠣FKM{£8Z0:ZO-33-T: }%]5D1t&Z PIJv&b jz術he£R/{/ |s\T+0;q|t2d:4S3yWwR0r:G,<{V J[ Bl(W#! 'D},&ԤtcۆZbX"]xN="1OXWLRb-uoj*w_]{LI. <&7EO'P]`~i|\}v2ȓ,/xX/˾}%LG7њxڳ~5|Ox= { ZC??PA }ltS!J|[}V&X +X R@,lWل*L:`{ щmC0=-x*c=;5z@?v< WdKۣg/2Ђu3]yeh@؎*A;FYZ-8c`6XRӷ3nt5 & XnG&k̈q|N+xEK@/qfT5^SxUV; Y:<~9=ޯmH!(7\pUGyiKC(BMH'^ו +ux.O^:y6e$ O[PAbQSq.sI a CEM7K'dwcZ?4@#%)W=P4C0A@VwWz*g E\+&.Ԏ<;DtfVfd6(l,@H6\*J_[mWd<"(Ci@HKy&٬V^*ed EQd A!6' q["Fޓޥajmg⣏z )矝ַn/piǐǃ}Vϭrlg) ) Sv0 T-d`.bgp> q ϒν0c܁rj5tS}PeSlgH IM/ },kI*i`N9~ 0}vbacdt.04Q߽ˣ:HٙӉ[5.ӷ 'V' cݣ56Pv!CǁDX*z9 j>%vVFK,R򺒺fʐ~Vѣ MW]'Sy:iKfJ3U0[7%WW Q([TBXII(x~9rȔ;7%ͣ'\wѠ˸kMK.-x/䓬 ~R:zK̸;175GΞi)>(qȠB?}d @Rf v|PpkdFpQj;8՘#*JV$ȭ20Y栚zEv 4Mt@&!uadMI$`)\{l)BH8nX$Mf) I9,ټvď&һsE<}5։fZtÅD*F>H]ՆqHN :,N0cm T kn톪A#<3Ɯ wPRy{ 5v)u u͋xj < 2I0&m5  j`azq_wr+{v54a. ;GnY5 YHh‚lY;.bF,8PZkHy,)F%=T_Gຬ)mz p f}C=sN7֬@{} <9K觢I\k7FPjM⮫څsϝJt]M+W A|kي}Pndvwog۰R/1Wӿ$ s +Ò.m)ҶIF㐑<:sXP Kb-Cl E41趬"g%:%ZJZo 4LOX (:*f/N~O *\{r,J;&䩧+6L~9?? _:wgLH 19vqȷZn]0 nnt\u|>aP:A1uG3* 8/twbvO:SՊ]UN: Pv{P{&YqR 7)0J_9w :]w&><"?vFuyEQ6C'@3`)\zn Ϝ e]җ16 1{lʦ s[3Ng%/ΊP:iRV!;e ,0v` D+0MW/Pa5W v*2$xk5CƼ2b HFYX 5[B%լ½ay1-5.׼]#\E){}zKh!u!w KkOz@2 ,Gh-T q2n2jd\n{J!UJ#ڌTNRu?)/b &lBEfMW,U*s^=b|MO'r]n<čɅ8/鰛8\Nj"16)Hc7^j/HCj;?XUM6X$ޥIS1.Hpgo YP )}T&$hMFC' 'Nܡ"We RTyZQ ~AW`U'+oF݉B ӠmZȌ? )9y?'}kT1QfΚH}FF.@0 RŸH, n8޴M$Xj=}HN-KG;KK/%S_)#2@ =R1e\{@U A _\팺<"Y1vIT4nHR`!qpmt)H$ V3K(*3Eʦ A>E$BbDf:ޓEnҎUw])ya,zK>|}``,])81 ˯ &Ѥ@ f;Ƌh>k1H^=f)~`bng-F@ AA6a%><.Pd*;ypfe˜q8vzIo QE_8Y% y@j$h(<-)%u`rh2X !:0 RQ¬р#(K+[]Yj_7芋㺦߹i܃r絟1* ĥ*ٖv叆+{m$$}Ԥf2fo7I!aJޘMQ*t?8_z= vSl?ꦻakZ bd2VY d&$Lk,o<ɵa"ߘFo?r; MʏujVf* Te醗e\qTm*_I0@Ir#*AF֝o HW1+$5*}:HL[k6 JMSA42'BΦaV)x}#}Xs>/O?-K#Q0kjƢī`%_$m#TW' pӦA>dR\t "G,t|; %hrb":SDIJwb1E\z&3ż2XurޮƄSwaQV#(_9_;e[G-7cߞr7m8SlZ3EYG! PW]V*;imBb8;K`3,ÿ/Hj5PFkW@N"6c,6MQRҗ5.+EyGxnL 80L0k-U]6GN,Xg$١:f91aإ0=A%ȴԏFW.xf1c]HhiH`&+,jD̍B>Yqz "Osj,\uu̯'|x;Ϙ-kO ZY۰t=of?j}AR70'=@mU9gz̻ M5 f0Da,횴v3! +T^ɑ sVjsꁝdHM9;f  xtFS^Va$tq3Mvi[[pRRMyiNj˧MڵA7L};) xT9X3uvVA-gI@AƉPy IOt=6' ~{MQ5Ce#2o$cPjFA^YOcc^B Sd̑6էL̯ܰQ.:8{x5ܻn{ {w=BC$SfGG7¬ܯֲ;VX6MQM *%pBFbkXxa4>n.B{?RT%@S['k0Y4dAj3ۆcðu4tWۏיߧ>qb's0v2!"LAsH$(RobHs1@D$1H \0IIm}h鮪{xHA=*Mlڵ{xߣڙYaC#n9#)E Xxg2k+vbaqXo=y6'wlEZopij*V-%jZN'"D?KՊR5}{kG2mP -7 1!i:yx3Q tu= hjQҴF#H JhVݮ]}n+p8cR.=| |bf>EseX;W ~K /jc@$Р7l5aQ UbdI!YT,T.0i[)JmP6sn(ݸY߃kB]|Y{w5ÿ%7/XY^1;0lb39(:1DegPE wx0B|[& {4}P4BL`7YQD!qeyہ/t*  '+onԽk{;)c(!1Sc }dIoan"]HGͦgלeuddMLkC{E_d'-_g`oD@)Cz+? L~+ wY7]CܱmKYn86@9Z9צ؇, }/Cn}ݹa ?-2@G@WuvExX>KV52~q(侱u'|SWbэ3j Omup$2W[B%Y+ƒ^Qp(.`ʻ3!G7aZ_&xw[*XRuE^bWM j1 <7sXA9Ta/viGv-.`@=;D[Tڕl3-"t _V9Uvr: & `?8k|k'3΃~Ϛr?F9:e.ij|jp=A: ]Q5z1JVD!Hn,F4SփB`5)Hp8V0Sz3n?^HQP~2k8*pysX$ _1_Rdytu ta[v0}R཰DQ|SM[ ڄ>fbNcR9d.s<#hnNՐ++܊6 /J;? vhp qnz1#j|}Ay~t~mihm?!ЫG?m zaM5|l^ujSaqOѝ (}xaT;*7A-rqs _ʬJbpP&CEh%(i 24? _Z89RWomYx<~ )#&b.m TtYn^t Ko)w^) EeZ(!-&.y}LE52'SOw>=k;2T@WD؋ n<TDNyb\zfS*$Os^xC P >|P_Of"<"lx5ٰe4e ,C1d'q!j?guءc<0GK p.k]KVF$1cԄj ImܞorGS`~z=EϾv3O 5C2:Y<(Z-Y!=ٴ(w^'S}:H, 3)LlTTL 4af#D6{(81l]SPdlK Wy˔RboMy>a|hy'kx!c*y4 +sL9P@b6@w0-Bg#3CPVo;`U~V, nW6 A !Q2숄@DgN\ ˬQo 6{ݟ|f"GnJɄQ\Ȍmß3XW-"Y0u ӑ#+(Ȥ(V-?u^a]\qDcc.ԯ.xA^=}i7n)R ζfZǎBNi\+*lfq)۴`0w? ,$ S /SߟfY%scdQz~ oMw_}ϿtkShT៎= Y$ L=KF2 ),;/>͡ b,نT'-PxP24Ƣ1;V ?K&GV&[(qLgU\˕T4a,+{C\l=0$W4 6m(ɬE(2rzsX; XoX@Y'+f@٘RA9BV4%'S]:9εɨv&.V"P?)cؘ+C5m .^:hZ@l9GE;o7,O?lw[>5_o>0 iL YpJތmƍ?{ZMsE)w"5bC;V\{fX簴bJuz@J2#DPVF!]-VỎ:52g,EҦK%BKFgfjz N-~/~|۝tYYsi~̧!=tψ5aJ難zh3}1uze"3A$No5b$W|@Fs4HU?C" (ۓS.B{Svp_2 fM L]-x'N,-;S{TR#@D9(5?d]GT"|2`#ܕ>&!Fj+jh5-nLz ]1[K ?|OU:g99hn$-zOzͭo-/~p?>ֲG?1z҅(&=ᏼtrpp/‹abٺD=tSBSIx`d!Ο>q+AҠՔv0Hl%?#??P:]p;sPbfz{3iNJr5/N/AS"*eZ )>heK/4Nc}SD-Bi _r2F?Ao' d6cc|M5? !@CpaJnɹhz~ݴPpav?]۹|A|(׭ 6}ނd6raNҶ\Uwz+#2ޘaV)M:A, 'a%p'NjC q]IوIc7"Ϝy)-zJ3rJ`" ͼ|>{W_*'TM5b0<6q48xR _ѝ ,E`f/hݗIDgHxgvǸFZ\#@S^:0E{L샓i5| f^J!%EDt02ה._ ם/,3ww>e xD3.frAR3ǎ_.LhQ7Ox@e@s5%yxH b4Q0t>@3B#(,s ҡu;7v< 7p`6r7Ѵ^hYH& Cf?h^{WocUۙF/*t}ZlPsz}716sGF`#8+u#߀Q5Aژ>( T`i,p}uԂ +{3=#1@Őc!PD^ Q=1*ࡶFBsg[3{ᶅeS.{{-2ӉAg Evtdѿ/ȵjXnJ'M=,-]YL2VQ&JGmu fnrP&?Ν w o<&-!▾/&nL:d5k|5`|2 KԟŸɿ7/g~&r-`q&Pߞ伍3 `fXQ[i#gmŎOc!JŸ5$\lLx\ˆ ߀ַj΢()4'/6qUch> H#n;X]l:ȥ\DD%};wͷ=faOYTnx&<B .Icddj1B=r߃Ƥn\Ji燢#GaVڸp7ϣtqK+$9#эW)!  8<ׅ^e̟=Xyp,R"^W1#D?fJ 0ޖ:3 ..MQR[nYXߜk)Y{VN)B+U_=LIdsW9G2:Q:y<_%,ug鈴ȩGZ7^iB 8Q3N!FCBC1>!ԊIڧ 2h5(2Y6MziIdL @=|Vd^3@ P}8%`/.-waTS*d6-6^:Vl(M`Uf]"֓!ؖ_ʲybC@+nŶ)|5L+ΣHԉ9"_8gVUZ kBh\b2.TS~#Ҥ{+ˤodC`c0$4q>w?P3=N2!e'ryd$zI#23PpH1a#[s;݃Ԃ7fpz jڈQvI`)*/ѽl,t/`DfoI1L-D50Fʬ6sTi3G`e'2=B O޵EmK&uHE ?]И kBG>;^o' |@nйsb}TK-Z+l mJ?EL)/:{; :,a6g[ɑ8 8]!v?()&bZ}`opA7ý)ORs0Jk2 Π+ eq5)) 7.pRE`3` grCme"Hц w*;S.*{`Z9T{10ܮu~fw=s.gw>aD=?h:PZ:fzlVoe[qvhqGÂfI--Q~&,N8IƔ#NW#rz3F~1DcN:zPGU<*6o5{sՓ>4_xB1-(wcT~eQz?.͛ԩؚo[1MT'\0/K:wK6N#ZM-Z3Jio'eUf#V_ve!(~Ysw2%UO?}Eۯ=~ GG^Ց@x Zq1ro3.ܼP ,ʌՙH=\"P$&SljXU BKiFokIrG]mkn FTmIe׶-6gsO=AUMxsn&qUO;&lXHd<$bHƃJhʥC0am,_>hdU3=PbOd+{D&tGJbK \,[tã4_ 83㾘2ӶSl]TpbE9Fo Q.\zu=Uf&0UPm&.]?`J]#<:x$It(dh౦O{ Pqƃ$Adk1O$e6nlV'N|`K͞?7D u: nn?2#ShNὙ{۷̊p9+In`&BTO[},ߴw_n0Rp\"rd"QE*kLaq*C CtQa7/,xIKx6? ySh4n@aW"qaT :, _SI<"&$A_pb(Pm߼}O-)Ύ"~KE/tWadqr 0f6-ϗo"&wz`NW |sN}(ځukz5['3!n$%,|_0/柄&➏XpeӸ*Zʰ}1: "f 1u*egNmRjKȒx=ܻ p/w6K`WKW?J{i鬮0c;?[=cFE)ڮ^{DܿHRɼ¢B{u}aGO _EO?iR+aL0LeRh i_@͙&FpMYn|< $4Q "-:Tp0V]F^h3fޱP\ν/.q"ģD?pB|OzO-Ȋ+IH$ja@kuTטRNc!13Sq G|1:NV3 (;>D~h]0#%^䭚azHEpHnS0aJ-DnA8uScy3pMJ< Dcl#zxTso`x g_^zI͔/^ ]f27th1﬜t56|6#X%. YY`'m|¨c\2.[0"Y`&ůWF%‡y@j!x#z;9P.KWl&.< 2֤kQ&Iǀ {]h^Ő`hM6d9:hз ,t 9o& w$:.`pSbb]St|Nivƅ1ߌdT&՜yo JLȤf̤yh[\q(Sv TaM_d >H "\T QcGhqԅƣL;&#Tz$ax߼ 7/ƅ6Y486(4T"Cf miR8s&kwt{em\.f<$Ź[bn ,r2f[(n17~c{eoO`c[Mi|Gqx>nuo>DNh ~kW?Wѯm F ?~?F!_N\FlRLv8"aӛR):~?;ܜHU^dKls|{ƀCt!lqx{\"-n&'1^Zqr  TG D؏c>Oly81uur8bB;D oeÍ~gFFl{케@,Z9uQ߫7u&oݕVzQ2˦!֙#S70]Fkd}l5sDAlZ2 .w?t{*>:Jʵ]C`߻gap_p " Xp3 \2[HYLҫ񾇎M1K|,= 8~SQUcqiXBpsಣjC*Hl 2PVяbDaz}B" [lg#)eA`e =_& xp9|.C'w%K4j sY)D .^|^q(K/];nN3DW .T Lqgǩ([iܾ0˭Q7/NB!e$M 8ZjP*as߯)ޓ%\x*3,K@1: [˹5D;b-~Oq%`\G{)+vW?A\QMF("DxAPš4aL;%dSPb\$O 4_)Ta|4s ̋jo>_fǍjB2ShPnc2 3}1P-W`Q67A7$@QZg9=rrw._cA)4痿'B:JXp/+˟ts\d34p~dMMwCP4q;(2d߅n=QϴUuKo5Bν|aXyʍA ]Z9ԡ|N;G+k*ה[fNF5],a>]Oɏ7(Jw#XypYSM";ב,R 2N SAKnrlIt`tԩo{.B.]zsʕoykhpl8O<sif]O{!x+MG fo MR0#8*!hUiFufXV \3Mң:hITa2(krVqU3GPsJ_1P8[o}W^ysſu `&>7WH5UnmZqBL|5YD!Qvx.dz21 ]0F]ASRɩN`)̼9 \5ёߵ /[f+Z T)1dߚIXd+ X?OY;4`gV\nwC&(] aK-P !?f ЧX"U2cSxr~aXObRΤC!FX:}]Y(b*1u ,tQkQ %cWL]bTqt_~^^=:鴣K?ݹ,PLTLa%9pA6 0ru5$4Rv\5lyM/biO4CLNOZge.e'h54?Xll( L3:ay+ Jor4w|T]*6 q?*E?Ou6 ;yMmN, >ȨZV >AnDQTO멀tj3 -)iӀTθ@jI85d² a?@!JR&|B=i,mP!S@=Ds_w"@M6_~=;'Ñ+bPˎZrρ+D $dKd'@bt -s\v=tRod̂*"r3:XIp fm/ږOa3=Ф i_(z3%hd/ʘ2wwO:YW%މw7+/zOiZsJx6uZp[n! Z+LSp-݌~6&sENwsB8eK4bI!uEL7@1c6CkrĒN7fZ _n[̀c0`p ;LU*::}qre&[Jo GWY-'x≯={Ÿ K_@\~X/{WV_;,>P2y ?mfd[Po+qR`gHީ3o uбsl1Z2Px;" H2z*ibT6VCuFS4l?*6/ ڼ /{챯 9d( %4eM^Jek>ucA#1tqÁ0ij N ß"]E]04TNB>}{=W -AF69e+'cߚ)xYuv?ꉷР0tU@/8x]+"# v|Kqz ̱'Р/~#!z{UT{fy{}'L ]I^*tBuO\*ю}4~$& 1u^l[6b;3#QF\}7|xW\~??瞒mܹ"s \u7t;n}_9ya'>!ɾ NRnY,hXԥѢ }=|2 Azswb&e0X)$\o4Rt }M7̈˸ӕ #i &쥷/?.n]yVb='׺us";}sNn6ux7'N7[Kh2|=L>7v@ŷO75.ZF3`*E>:z] ؇k̫~BwS+L. 9s%p+[ )3Bj=*[;7.?n .v/p*|#&U;yN?6)mM7 }zz7s7 c\"@ sX& RBÈ,76!vZ]@b\$&7(E3!^:Bk{N@s{i]z u~ooW\y… ?]E֧Vk~Yj~a-N}$¡R'O?i.$nVٳgנMm\~IՂ?2,,G|h LďoǏѢ{/iZfgkv9yy?8o?yM/胩<愋?oů!,}Y6K.@Z'fҀM"_Eo*-h?Ц @xy/F >6_}8~?OzIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/256x256/displaycal-profile-info.png0000644000076500000000000011107013230230667026025 0ustar devwheel00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<IDATx %wU'~NU{Iw@$@EdQ4(~pPqadDP2 :C$&!!,!t% !{tW믪~[{_wss֭խs{n/ZZco-.oGy}gGL!T ]2WJ?>;R `{'Br_-|zUvfǘvް}lcؓ$}sf"M[p Zw8R ae*@ >>e{Lq2eaGyTb[e^Gv2 ~;P ۟7 Ǡ+#*P7Z-v߹y1ago 5&D$BN QO al]T^"Lѥ-r@_mv `#^ELz !Cezd{?|8P/#klwOz.5.^Yye"r[`|8Tgvʄ1 d2臄 YUyxLƟ-g .\ߨ4̄kw2hsly@q%a `* Xw,|(B_ } }G%Z6_`_cV 3x }_J?Q [Zt)ॸ-<\wk7: +\2Aȏw rTAt0}X~YV }YضΘ`F0 (uaRC7W3 +:Xv^G˰Xuk_2ee&z+7ֲÀ$Z hT ˢ2\ =n yEƈ$0}YA`X TK>;MM[(*GߏKJѸ9.Cf-㕽EVz^/V~X?r3%hD2f=w?9op ~pЁb0 =iAIݛ? {g>u?/>A@*Xo_' tU:mrR‡oMDV"aA=Ge5o}_tUkd-^:#/PE6A~eLq$=&/(kXq׳7ܭԬJm~p Z_)dVB-Py,;~z~eEk#R19p^sﴺ?t/!? %%Q"hIPnoJ=WC0g>>՜,0tX0 }6H j_Kz/'Z3^敊 \wM\4=Z ڃ,{vc;•o޿sw ;0LSJccCd-W 7XW y du0F0xGQpJ < )YQ_\hд%+xobgGaat?*WPh$Ѕ$B}k_s{vs;=T9U<{ 7""MD N5Rq#G<{/뒅rk+#%߼tmfSX!3e>:Q@σC)6%~"d9N f;2]ISsp4-:qe: /e{+1ܕ B e_b_;qGV  .*)E\4< Nn!9ѲB+m=ޣ:dBI/d S:QcH:D Te\8.?˫ PV”IuV_; 8]chKw[۶1YtؿZ#S")G@ vYgVñ75GcLZ a1g̜ HD;R nL^f B9*$>hnZ~{*C! E/p 0ʀߓ6Is-= 1EP P)` # >4&u2{ƶmVe>jB:D<0D yPvڵE4VęS`m\@wupƠly wg!~w RF4׌Ln%T,2 7N Z E'uS0VNlؿC3 AP0Vփ,7̻ݽkϜ3LG"ZEND ٧t?]\ND oauGAp0yl#ljO2~QE2ŒסVi4k"ɔewQ#SY8}8,>Ɣ cI%pᒥ#t{w Ͽ4 Ӥ qa@-H3ovܥњPSg!AL[36͍LD]?lQzIsF*j֣T(R've\?ߕ38|֢~260#p!R@$B~ { J5vʞ(@VQ|o.f 读#L]ՀSۡ:<{Ԣ6o2Y;o0\˛1f5?@'$JdbdP,"9qtط8(TsD`I+AF 6lGڽ٧o\킞*u(&=REy;ws?+0}YFگ,I#pƳxH막:X T!r1ȠTdE\*o~9Ep0u C=\ L<9]#:8Yh MB`bOŦ./l۶t_Uvቐ /د~L/<΢O?wSx3> E~Omq <=Vu2Da+S\gfu6(~k~Lӝo7?/XWub8kRpzq& &fpbCBak?C6/@@O?wܽ\VM09&̓/{ ?g$4<'nݗ39H!=JI>PliKQ>'2_^)OHS'N0Yi<dn`*%yO@!]x&?q!I$@^0h9 "ۯ"Ax=;V/9|~(*^3_)o߸5aH_Ħ%prugъ@|q :BsSd@zCiG5+\|?6 ]r$PA%" D9Liiu=;^܋{,;U7H``.@S q97{3ad s݁j?.Yw&#Y">h*{q Jݼ(1@~5 wr܈;w5g\'p3 \2YcncA{ ̂mvn± YoqES.I:óq2// ]5`^^7 o8N =zq#|XB@icAl akE^X ^A-GyF9$;A͌gph9ZTLL.~)b,5E%cǎ+qO7alD2탭/nt: g6å7*Ixc_ƾ Gu;fᕡ9A Ż"Q*hs[f/u#[ayyN)_?MW_w=W +);&@[.K&[74Q}V^Eς3V?ViᎣrjh\:v@˾A]THT,rX^jHWE5 QR坺o뛛u/zf~pJkac4H_'.!!@\ޗ8 :~!o`"%=TzPUo}ԅ HT'ՁA^}N.tj3u/; KO-AQ9RS utwP7?AHLns܊w73= QϯnK˰1Ϟa5z>@*wOMhT4ҹu @Jى=jH+)5PY|UX-pB=ӧ/-X^*w Rvql]6Hp'ErwT*_f&7lmhY^|3`k3dbbAP˃XP rPzI@K c5MҏN(C?̳t#4D {]s 1{)tZ 4^jw4PgbD\ZqկUZwjT , hځax~D3 2C )#Aʇ\qQ1~C\%f}0z^ Ÿr?q'r33 ؿf{)xs/`ubṲЫWJ po֫3:Tj !DD Z:{'@ߏ/m﫛~t <O瀩eO5ycV鳗;e_af]^usO)oFCq` ;f@ '69Vgf zD[[V yɵ1xiDN2$<D[tp-2|2lCPp`ԡ@32ҫaPD3/qL?ē%D} Z@cJɩ[uJ``z8{syU3O]Φ5>C|ХG$nԓBK`T@~y3HUr<퉯**`j-Y깨O>(iq=6L\Xl=6,P~0,ua|҅g_ekN|P6஻zznXvyOxm%<͍)&R\:ܿt4ddT4WLm6䷏C)7@^U14:x`nlnPl_6x^6Tw]w9HymW\ufj K}uc?st>*OQPNQIQ)206\c[|G0O*j&@1{0rg[a0 -h&=m~cl3+dԇjx.#W_4&T dSb h.0=4@7N"B  n3:լASRa4p8SH%\lL6e`@=t=4ȷ%+uuYxש/ˀcǏ+ӧO3$ԃǂcv #tmo*' `~/AlE+=6 gMK?&B(6$E>M u䡬}yV@IV-_JhAٴ_ ӓS6کIo6`f, +{Δ kCx ko;ؚkda_'j^}fGV87~?w*% >Q јcO(8e`Q.8-춋c)r@K9; 0utb"j 8n9yQɭa=pfc݅Qη, gPxI/)`_ROmnm @Mz ]mS18dԅXʗ O>:>`H@oxBo|KLMBKu ;夌6$9}%NH* GtU=:eWAh9o<(n/:.ˈ$13 B-7]P)0E/'>iRxsy^ ~:؃ +OEl3 Wo8:&LlO*\$hVy8tYA=PMK:2e`C2@cpmk~ݷ7|.zɅ׼FF@" 5qg DbtwU`Ew`t(Sp\cg[;mQ rݠvGi p,KH: J5/VF 0nPX*<=wXʓ 䮯 {}_ۇt/C~v(b.$J aj0ߍ,L + BO+fg<;Ol,.*\#e0r`%]Gy=鷪NƿR-SIV.ޫEůHr f!` pl]nu柇&k/>~S ~7V(*M 0S a^ c͉"S[K0 vfoaɏWKqQKnM}[(x7u=ñ~σp?ܐ;د 9>SB$Hzmg+g B ?+lclt?.@+[n+]};9K8h~LnH?GEHjCGd9g^j^+o~ݷ uwýSVjort畟-\ 1u fLQ՗wBx[Q ౛uvǭTrdL'NM%*EϮ J6Ce~]eЁt+k: XՎ4uY/SBCzV_EhV*߾}:ޚ<5q>җ KqtZoפOBR4+~ fL7}7Y9,ɷ[>w㚰e_+K+poM}YƤen#$Fñ?+yOt)H >=]qshRORi0v=d@ ~rt|,NQm~udjz_Z {qn̬=2zd:f2VIBB h`飐dFAmqTG46?0%TvQy ^=dOK(9 Ąl09?*tcjQp?_4<{W`VN<Ν/C/IXo0jZGA"`}H<$J Y GAem& SD5G%oUU]jlяቅ"|W=Y}hH#˖DqΠ8i]"ϐǽ?Ɔ~r)Q".hS L\Q ĨQaIItK?Z|xyb+k~t;^Uq]+cQw_A>ysfFUeT( "(Y} 5|@dI>S;` ԭ:G|U19̸uh+w5ۿ+<1@dz+_SW*QBpd3G+(*jYmݡ-VQr"o.Qv :mb.`H ]Q@0׀߫UozUg8Ƕ*:>K(>u{ub"#:Ҧrp!K"!05E .@hw Q'8/ޟQҨ0@U0N睷8 rY3x/YN=%.}4Lf^@o ?Z%= @:`(B j $_cw]1*,9B ccCy3raJH~"1};:&\8-Btt^&JE&Ow3iVAO2mN6@b 5шݏe?]mr.Y+O+ϫHX}֐W4F*o^mSȨeRChG?V QK&O@h{ʐv|x<X)Pan JA+c )~/iklzK5>=tS%'<ղ֟$B/q AMnڃTV'{}ESWDŽ_`3 B6'z.\ :joKů.YQʷA! f8{˗}5_MW+ ^mOe$HCMffjO%4܀-/v@d}j˶_8'?XldτX[r鋟SnLXIU+wid~Q7:v zCu׼^NQHoɣ)rJ/CZ4TbU!]zt!mӞ, ?_ڟh#H(Z L}DE\"5\j6dL1z@ԵVP/\@q;Fn'AKaH݀*{%cL+_D/ah?q_FXdBAs6ؑ6: Zs ?s >-!~gEF i5_JK 4Qu/X1uJhS{uU`֒P&ݬyv`qeǗbl\_q,@XSLm 3}gTo'zq@X '{Z˲&0_|\#W$yi0?q~j\d{Jebz^pQkS>ēϼ`tAZGU{<Rp1iٜcc5 (.xj!S_ J(1>=REFRQMBH\TL `%SLh<~\ )O~N &)KXλxT԰5m&ϼAժSX P<9c:Z}ݿZX%h#U ` j@Z1N.TBP$G 2]/`3$O'Dmҫ*\_s/ JD. j gz K:>mgPxu8ﯮgUwLnQ H+Tt H@oqr1QNhm?}k"qU1j~@a-%B_+yT4zBGi[VUp,{fFFF6x1s|JScw 0C D!EEM/_/R_fˈ2ӭm1M*O꫈<-W etÇʠ11-|XwUY7+RJ~YH?Tok@ TG3[;WƋ$$~>P rx R7Ά~3bL3!r{th?]vQ49+t*"$, ߡp>u靗~i;cU!{NIN7i>N<6As~42-bHn:BOֳr&$jbqA#5`l}{ 394 =sB 0@E~AAADMy7 p?t[~ `P܁\ qnUgg5-gyx`Ïcꁐ߰6m>  ܀upA)Ă1pfl#r%z#MV8@O)G)yYSLWthdfUbPԑrҪmbeݬǨWuI͞꼬nLfd;d Wڂ ZLk;.kCDAl *B`@y ȱ@eXeAQ@~yT@` P<H$݂m1!9"ݭ.ƦXPkiD{ɘ{eB(*,: !@ "d_TU7W(ܓ4GҟJ @#Z dU a<95鿶̾67Ȕw^s{ d _/^ZetjA+\ ( ۢ|24n6oP]!ATyLm0̮OyKDOyy^Rsr3S!B|Y,|q0j>G3[* ? 4Ƅq50@"L%cԟ_~g ܗT׭d A,d΍%ma?H"F&q4D!" jb)(q trd;,D5m|$ $x4X=ixY%bmH?Th 4>u=0y>9H؇azIsW]Sv:^ECk ` HIA' 5.Hv-*4 FAU'(R:?O?OD7 HU8X t.@тܛ2ksmHAvMFa[x^e"DT .ziQ3L PQ[*[zWl\ B)$˺}$vFQ?GBu.oH1fr5~%h~") }9-H?/^չ5P5Z իBhc)z=uPC6R8"x)*?*:]x @\pv`4!OPXEuv lx(SaAQ(Ag!dӆdZxRA +_ ʆ d=cn0L*F$A,$p-n | |z<(rlAmf$6`T`)92[P_P P&(#`,0KW*03)Y #J>>> C'"}_Ǖ$` "O G~P;b7 ~"& $!(l byX8IMWJ(fVtG#ϋB#ddMB ʁ6^%2(~79#f8|Gˍ Z@asIC5Ru {[n9@rL@X0-%%a_ĕ Yd;(z ׀@ 1}Ǣ{#< ~H#(0Jl>>"&7kL@YoA܀ @udP4k[jk $r0opL ~fI%dGa!2Ax!\/ʍILN؉R)7$$O *T,h? $b>XtH(ޠhVx0e6B>j(( 8u{C !|Q02bX@)-,xN9(Q0X,}H8лw`HAݏ耢Mgh@ȩƼ9c?/?y9vO #nGƟTX^Jv[܅>!mš \$vr{BBÊ+ Qe ><&b%3ӘL6oR 2O!?)W)"P+/O*>|#N%|_ ӎ@@0W/[uۯ nwwuF*aZKdsoO>IS\i(df%팥 NAr6UytȗGGk!Vq-} MTVv+),17ށفA 8XqXX{7TecAcKM%Ⱡ8F.* rK A}]w{7MŴѓL (XB^TbeK`!M АoAqFAB\&Dr+dה1oMѧ$30֋.r>*D"jڃjYQ+2tf O8ˣV:$Giɳ #ځun*-E 4Cv_!'@O7|G[s,P~zy:@Ĵ8%s9F :IhI]L_%BnHH~d& U"W7g `jA'-R֊,V ήA@I R@ed.@7 B# IGi7S2O7T(3exUjS )F@Ώx&@vԇ~ )(=2Xfʍk8Fm4Nw‰]L}5%2¡`"0)=*Qu2?%8xtn R5TL~) BI\{*ȯ e-ֵ6(+B{?%E@!d]-lbLz_\%6aB cd@ANP![nJC7}{auHTmᣫEk#k.-C't(@RtT"+PSw4GŽH@A!D/Dl2B82pTV]d2\[X}Xɾ\=r8+B@'n &D`+qtćL8!2!:j#'@2YqݠS" B~^>e†MS  hTB:b` iԄY*Ҝ4[H@$8V׭ nߝ *DԺ՝ s<: 9 K!=On$<>@щ2Vޘj8 d(P)'{cs Yylr_$7HR"fuH8˫^wZ+ZN~줅vJv@ ᇢ.%|>9ȒqpJ|:w@P6L )GL8,$f d) Q/jƒr:;зtJ2ʹ{Y\{a_G[@x/pdynxnR"OrЊ}WMw ;Š}<}Xxe~M9k 9ɠKgs7'PaH'9$@$O2 &MؘtC *PƜ'=wd w@P+U4<(xqM_;Юo}~ZFV<AUug=/*O+֥a?.+0cY1Kr ݞg눍AWY]LuC> ~Ъ!<_|lV( [a+c4: 8 f).ZvA?"l (x󮁉-d-(=ݦ~2t:r\D6)6I@n-}ZRk!MtzC:td5DyFt`+ӃeJ ,HRBdA'K}DH)L!S@zMAK*\w@E#D @<E=Cع1sxxB6!HDnf7Up d<05$ puK ьFk@O~$! I0*+t>qWiCRhB.2vϯښ!ľ^}_0ge8xXH`mQ }˸mOڴ `0hSW@B:`RRuK3uȦnBF>zkC+3i~s6/ڱϖ,EJ mE; g}%s0qIJe~ M*ߴM?@ %r}@Hsf@8EHPJIش\d Yj"57|VXim[/쳰҂V6(t\dѽ7uPj.T}ZgGP/~R9-E[LbQ ST asJ(~Ait`o hЁ%ҾR; e!s7 ޷oե.TqԁrBbC &a'R 8IBRWd` eP l? STB$ |P'?7JP/֍B$5J"sLe.[Z./|o@o.@8nk\_L%!xJb:dfOeL=Nᦎ^c1M)z_/PGe3_\y'hy_$BIBt ֹ}  > H!UY":ԂNGm}\,2v4n4 <ļ 'ܳBd~ւ'y7RZ E3 ryD @2"s,ih QDmҐd( "bX|"WI$*_/р?~#SIyM֒vO-E6T; d[?Gh5" X`R*8[Qnc@T ҌS#PhoS! zyj{qcY7KM9sy rܐ A*X4970W!%:e)AD'/m .l䷮ ud4)%fR TjKOux';?'kGW`վ.  mq7]QSa  Y}?(@ GÀhK Tjʄ2v A? ZVp Th bc4D% {ğn|AL_lvߵa (a?*pP.LwA3+I.\r" "XhT0Q[**;aSs>BN+/:Y2pxy;x$LD {wowݽ|~ y?8`WE7A~ ,1P@Th3$2@AaѨ`ޖD}1i޽-)hB1Rfsyv~pT>/iHUwtu|p_ѽ[Y>8KU -vcz0% |Ұ֥KX#TD0?EٻxHJ,:q'tqR %[DD׸hI5(>sG's+͛ZZ'N^?(_m-y:WVS8x)q~Oomj"REC$`@DO(eKHbQpe BW%55Z7 Y^ )znW[O~aA@F,-h-,元E`9b*wߡ\yOzN6= =DM2uI W!U(&+D E׆LPqtÂoP;.,-=#87?++KQj ߿O?b+8ЀMJ(;P5'PɶQRX2 ~ĶpP/2.H< a({HF 1~ @k_{A{n* ,AKK_\ 1OȻ _+K宀uh=xn80(H*!т'Ҕ ' gz (|#n]?蕑rXs?7/?Q C" wT ZÀԅ/t-AܘK%dLJp.ۄij3=LVFÈqIb@ Ѯ4 m(p_wZ.= 8* V5s+ugcM Q,S|e_>N-h@2FP c=߉繜{1/9`X>>?ejh | ɔ}}K AW<7OBXKT؏0W4O``#6­X!Sy/yȃm2ğBpXFQ@'S!!haezSݳ]?$ bCe zDdB-=,N@'\ԇ_&p_+Pjr.t;ꊬ?h>:x)KODr&?|7RP}-ѥďn?ԌF/6`XLyYoIC6 0KX˛llbFɲc0>$3}h>~cWuhZ.wMuwuuU}?0|>XD/?!DyGۣ0b[b #Fn :Bů ZYߍ0pfXZ3e,L87?~rwY+af*~;!WUwR -_)ϔ׌#,jtyp[bv D0JXw;!3."rQ羡')Z˙n l #6` 8x ]l~7[T4酅drog@i0X݃"!L&59ofh}B@pkb< hQ9LMaH36 e2" hrl(b4pUe(J6ݶW>d>#L;aHK0 @ei7 }S&TS|3D?ΡV٩:}'}{)`Çy, dAiOsYn!. @,ܸo?c, HW )x" r uEgsKaXlp It{k`9 X~6mbC97sX\~=JG?l꿃#[&@*2Lb$2 y=Bg=c]! ߸ <`b h63zɐ-Β)c~YΖ), 헚 c7ਛʋֆu8L;λ}tJDgXQ8Z3E]u~o"Lbڙ@υjEa臵Uf,t;IH$ȉ, )?)9lF4>2`u&C~>E8~,pb!I@Ul-YuվwX^4U1;pYG"J_DCnkTBkK䞝' I?;i1ך1d`Ox4^J$}Km$vj6bZPzD ^f)@ƸqjHO"Z4 BbG (6 PX}uҡA L'Fbѝ<9<2 .7lWjIEy2Ֆ@)5_@&)yoROg1)r= `|4\qtAuIܸ!vNq8~Ѹ7f炀lK.pN$e"߃LMB~1^\ Kҟc4&;#L&zE?Z% %ǧ.IXQ+ z^ݔ0@"Q޿VZ`RI?'v!cb8Zc#Ef4U c_ViNS*eM#^Ua:C&(BK8}NL7ܿ{b)3K zcШ|I y;H_E -8&d>o23e:,;$I3"j6iT?>= 42?m(̩=xmSۯ C8k?࡯=TTuYti ʎi|31MŒ[(5$1*Ģ0)$;Ò90Xpfi0Leef,YK#1qR} Wݗ~_;4 hV6,G|+_Ph*N^"0>!@+iWJIp%3}Tvh8;8.=3YdR9S˱~/Z^ a2Xe".c)ee )m\+)O',F sS Љu +,;vo޲·DޣP#I>eK#? hֈ̡!"k _4j6,g6S;Q YFs}{. ڄ_~aW dTDC_;P_O$f>ɱZt˴vD0ep€Xcn|[4>@ާ:MGlXU#cD6?b{%p_UC2em ?R;Ƨ&.: V׍>*|.]p]P3 Qx ba&`Qr⦪^Y8Cc)-D?VKp$+ ߸GBkw Ga2}n/=Y}_ N@'Dd_IoKo#:" W\~D{` B"AkN@$v* y-ÀGu辶Ύ@>nxu44d< Ӊ[+vr' 4wXvSD\^ܻL& ++GFPB4S>0 `3  h>Tv"fjAԾV-8Ei,; p||[ ,O_| ^"$:,¯0 'ߝO3L@4}XK u:tۧ].\?C6t P+M)6+ ݐKj0|zؼT.T,gMA$!F/Zz=yuQ'a&L?^Nnp3R(YQ7{@r,F0rE}6/@]?nBVEC&2 FgGqtwbG(z)Vtul`gj#ɑ%J'`8;mcF/- I81?_hCFiUg`@kM@|G>rE1 ,dNfv|[G)WL0 䰬smUC'yX2BIP.…cs LoNݽĄQQa]Zr|7L B);, nXY*a(-2Ǣ;*y^hx!y7#ZXޢ+Cܼࣶ :M{9xc㳇$Za3Xn_@؀wp& _h H,%5?9[ #d`̰&G4=5-@DgU}B㍖!F;D.џύGc%jAVIáhّ|āOT]oAY /Pab?QK#XE" NDbh^˙3 HT앃b` 0R˯=rT_|FZR]1jb!B &?^L펼UdMyAGt>4Xh&*l |E8K˫8d0ĀxV]a¦0%x-Q`^4a4sv}X9& +Ĝ2@ 2S2>+p )(BkjrJ/v- n/tAsK]>l>ȝ#ϥ)p]_ţV"2%' djoU"()Al:F!. -.7'>ҁ>{.8zb.az[+( zXsd}`.4lpHK*4$1 PSI96 GhE(*Dqlj#Aa@E>gL'<> 5D/}2@uOt`J;}׿@2+X?oVUzάiDV8 J] ";9V-9O}#;VxTlti658Bا–a>bt*L{> {%+dcErCH0`@js/:W;FCN5\PA i#L"`lpz磇_=DauԧעSz@`%X5bC>e` ~CF _Ar܉ǩ#@&0JL 1 R}@;j@" +Ғ\#i6( P?5zxNh~60t'?r,w vLEl!hMfNAx6†CWuSlS> %lIuqZU4N@MolaB: ?@ :"r`VcE1V LLF{9Wf,4֪ q亼I6\Ъ_*`~`4n[W*pb{|d(PPQ'ՔJJqȁ# *`2g7rx)`[~[:nFeu&58Li{h_cGFM/{׺5[\B #hn׺&2,)rA^_=޲( , @@ (Nm"?#^ Z` p<Ciȓx,*B}MJC3pC2gAJ!*b$48?&@KuO:û[obĵ[ n2)0Ө; VV 6f: љ8tt{w}76b Ԩ-\fBHe10-ML4i. zH%I7^cW L)a2nj䗾uإ߷ ?ǻOmHKZlɃA(ǫ>Yo 4gkǿub֛?j*g[npmXA@ZNzY :D2E؁ .r=]d4 ld  Fjb6Ybix #cJV%n`#ԟ=֟O.xԯ-O?q38h~B_HLUQ@"@SN@`8/?! Aݶ?>j?\7z;'_ 5#F*IL ;./N : sAA5PX0Q@TAh|* 95 8æ{LT@ D'_ysK kyަ @Nh0ffU A:p{\|?s{,▁뺷] ^w hAS 2dȹUuo^b>xMuP-qi3[J A/P$ɛK1MWPqZFdxEcE|S "1Ɵ|wGʿ_ާD4!h=(_ z-:Nb?}^}߻/Ӷ땪Y9ph0%t4ÊTm &Yo*drwKYu[|7YW<_P\e$YRMRW^/f,Œ^-K82fU:bMzSatߗ ӃKoL{䩐MGuYB|o1(?'*t?/ h6PsY~4p؛~w)TXV Yw?ɫ&2ᛶ_ ]\l׀EDj Ґٱv<9 kp*`"^MJ+,dmV;&Z{1W)P"݅=~2D^m;'_$x3?\wLHS73'2P@`9a֬?ZB=Kې|a!J@wƹpvgGw}>Mw5(Kx"rpnz*֜#eEWe4 .w,'`x'Sa9587_x*a嚗,BouAv~ދVu.B)2otwaW ,˺\qƾmuK5)5X;cP}yƒRLsDʖ:!3^/(ߩc $̨" DOxH&Q6s%/AcVey n2@o~ˮGު/}lO詚ڒ ~agӾ>?ZL߳iͶ[*@`M$O6V=m@<3N4,`ȯ.>ĉ~JG _}r }:Vq**Y(@౬l =[^{^*P_B.gVDeoP'u (̪ Rzut|!k3h¯YOeA`8~.,؀ag^w ;W߽g ػ:]LA"%O-M*cv@;`!2h>ӱs 3|sf|;,-{2ODe+wj(>eR5ow-kroY z;P q(] B@o{#_?OU)UY[heۿ!jKup8 ܲWZ?Dyce$,(#n?l$˝X׽M}`C&t;ߩ6@җМ_NGg+ O @8]LGl,B}~M_/;bdd_sVܻ ) 4۾Xf`. ++VFVʧgcX7l{6 #Xp<ۀ@AV^#INhzP%ÐhT$~ayلOxBܒM5/kr F5hVQ[b-Jr3V@_.n ,rl>gx۴f뭽޾[lԻumcp~? 2&(>{:74}8?HV-ڋ#sИѩQܫpY.U<Hm82`6eyNxo׭>Av]{#'`کHgML F6@$ IÄڇ!'BP*# NȣQ{?YK? oE/|4@6w؀nT"O;oڷc=ޏvyn\׵ZGzODƒd9Yu7n_ (Ꚏk<*˳rwB'a ]tfKL bRM? )RJkemnqV$Խ`yA,Rף_~=/&|O ؾ[ό=~s~qnw;{zO)?}7NN~O~Awz{O+__>}ϟk^]s>׋낮[Su;'s?p! r}ʓu!b~g0/7yէw wzOh% Cnш2~l(D?7X{کLy>ܭE.WP@Λ|A]~oϟ 'z7Sl7/t͝ -^> Z/{ݮںַx ӿ7/ӯ_e@u.,_{(NO=@$G}~Ͽt>t'p-nA*7b.[۾GYn{>z&o@` mƉ,2 X9[ yb֒{'=zZ`ƿr7z!o>p:yO|kzߟ~9ү{s#o[%ױӿ=}饧ʊEZdv}叜t-xm|Rn~O^A_Okh=\l^rX?~Hh5+hIХԲ\QL5VII5?B`bg8d{CI_aEv`ɺ'8ʞ!QY˶}t8b{6>8緝^;&NҬ۟ŗQ+/Һnts,QkHR40kJ kU󾚈;.Zh0b2+ l;ȫHxKD5:~nheXPr*%Y O/ lʾ6kemN鏟yϜ?][qylX*$WuNp?3 L7,t93@J!)=΁JW %8la E{&*IK:/n3f޲0[*?` |1 cٓ"G:xB-8t~i5I'x[{6@ -Ѓo:GN3QPB~mb; !,N_wXNZ>4u%n\w%SL 5 mvh(Q-C`S[!l8J?{( 3=\Rrj`A{H>^ܳ,A ɦcncϴ8>.,N_>K+꼹_tO*yx\鸢a.+ 3 ӊmHg$鑛"ČuB3P.L ^Xr:^gn:;͘'>glkp] ݐ{^4?{ Gocx@ ~-+9Qَ-[%)ru!-<9 ^!wJܨ>?v!W5\dEX6ğr~ʏy_][5G#:m9Qg[ Y=K٤w.;{D.%AV:*߭:TqZ?beJ-O:5%myϻKT#aM, V++F*Nqýfr3j0vV_҅}V86\"ķM#g׽HE=GެZ-'/׻ %ԘR+.7  ƹl y>*`i?EiUψx͛7_iiOi/?ost]p{0^T߂e/`2ǪZcn?qжVekPO+d덜 :ްO]!s' Zkmp*}r+!h h9+}ʾhh,$c[krD4gCoKísşSO$g~g~)zfD3K,y*r7 q VtJ=H'166 ig7{'Qx{Tg+i6U8. fWOM2dQ ` '1uaʖj(值C]a8Qcb]eZ7@6%N19g;N%7oʗdxO>EV<Ǝ%6oϼZ>/2tn޼+n>o;'!򽉲Nv*ԔFe}.hJv4H?Jak>=a }(I'}M`0sM2,m" xbfH6Mc!=b.̖ Iv)qVytmV|6!,jbmEI~2 _GnNd.'4PR[S@TY/N| igfbul6{;[Pe+3?IRK&#] łIoh[`C'{N^LFjց0}H2S٨;۔ tD0VhŐRU~\臟X5~޹jsDS{c Qo%ԩ2Kdֈ ] |D 3Lփ=)7PKY"H)u>vLFYˁNOPI@<[9!,۬T2}UtMevN'G#㐶T A/,.c9/hYZ[nIRl$|Ͷ~G?~' O||̥֧y*dnuThʵ:Ӳ!u7 .$ %T}lCBF"355m?JO뭨mt8vclvo{GNS~.|hK#m+gQY9-$ƛ!녈]'Ld$BP]{SڦVJ cwafBk޹˒(r-VlEd 4_j!ˑ\{(; wJ H 52^+iǘ\8 ]%g}^p͛7Xc XEy/o3 {wh['F;GG hb@z#)biS+@\шb=\4jDhD6jhEs'hiL1SQUАsHOq{YEγ8z|spz\&T>rfy뵃1B_-H{8 a}2P9KIljeQvP zk}c) Gsd_dF/ Kh'sT2چP}Kr 9X][5 (I7qc98=>f1~8L-Ш_,$l#ºG`@L֌3kYsZebZ(z{?wy\AAMf'BK6ޅfC@6'@k;u6j9i3\ן2.c,FII/h2ZJmƍuhB>9kK3tҶ.ểY0 ŨhAPLHRqxhP2XՁelDz)o$6@vzgneFI<,AL:N B &< Q;c@er~6xG22Jlmmmmsv^fH2B+­SaoeO)ص n~s[{É :)mNqf;Hue&}U7;EUN=*Qߞc v8h^JZ+p*fZzo9FZ] 4`TLz ɐM"e]F"2әy C002JN?אfٷESN7 S4TT1Rv: #'fX1$qm /?U~_[+$&KCJsgd릖huBebE|0lK6IvN%! 쳣!261j,pOh&XP6ܻ3sQ/Z gJ?\@6v WMsb~4|p YNnjB܀ZD8ps`GRS--t<ۜ``(͎%b+0"`5Hȱ[Qw4hD~ 8KQ<,{\>ٔ6w՗Y}ɉ@Q_YhɁB0 @b#>AY9YSHDL)=pj%LB9xpn{>LBC }!iDB08*X C *!^"EVIn &T@Mo3&&,ͅb軖a C+߮ :Qqgsa^ aU%| 삡n֨0.!PF[du[IHD9z+zg<7[<iL'BG Ttos} J43G Jسd3ʴC;}qjK];y蓋j Š=N3&ưhep>KObA8箺.9` fu8|bJhgK䐫uu˾i= ~>WI0;3=d.+=!'pGTZG u/dt'[Ĵa|.N &w{J#|gL8V6/co7w1ZnaOh(%zmG6LNIRL_ɟ\xo}k}ɗ|Ir#t$>U5r^ -h89icpmjҔaUo Dˢ=IGkiI* o:og dQѻa[SO.NK+|~BՄ&2VV'z@u^kzi>tpU>.KJ'ĆOVڰT0>bt”VlY]92qKrgu HSJ9 rлmvʚTyP$YM0a^z쟭U=oJ:KFw^F|=m.HQ pGDvrEgT(O~~q$Z/=CX8E\aCۘM,6? BF{D#KdFٖnBvIH4 !SѻK[ &VL ޓ5 ֊AߥpbX`;ȗ59'UСp qv/R,G,4#!k2qlt)gx\ן3|!s~M\$ma#ulrDg7;L'4BAGsHr&f BC| wbpRX# eՋ|}v!]xA`v54[ G/S%ώC]u/{?#P8)Y5͉D&ܪ[K,EPZ]cLVc3RWF Ս>t {F9iw) &0 ACu;6x`7NqPT>) 6H؍~N~;u?@mP&ɡu| ՘gs*萍oJRȩ$ge# 8FJAǔIe -`/ӗ҅B24~c!~W Di!5YeF(ʦLѾ.jeJ\@jo0(]9Q؂k!@k$}{}˷|K=#1:gyH퍦8 [dVh~Z ȴ;THxHeRPM:Gz0ZD=rꑶ)rG#F:WƮa̻'m|Zb"ΥΠpԓ w`UާyȪxO5s 09>$x\MtK.[ġq`Iuv`6~x+t yڸfL(t {$is@\{iGh:IK 9f gpf'Xz4mi=D6 awQ`;^fBjdESʺ(p@oN5kFmX N)Iѻk gF$xGèBHղ6=qKC7!˷@?8Z*X٘^NmH{ڷ8FGjύv)7!G!#"s Pt(71dZ, 40/B$xT ^eN%@E@s&CL]}ܤ48zY5Nb5^W PE9@u(o!^lR J|j@CT!Ϯ?d:8SwGFP,/d?Z&9eF#ݵ~SI˒T~|K$bsm9oN69EOnȀrrغJ$hev4ZAZ&Abg ] $~o)$F9- AB5Q{ Ĺ}pZm ]K<щN#8?Q_$EzHeh}\:tϨlu@}ٽCjni3[0ÝNi\,d?9 @m63+g$,pϿ#%ho ]JXU1nJ[,kgF %  4u͔~Ɖ-w~K֏>-%[/|Alh3C7 q #&K|]^l SЈi0BSzvS"]sA H+DHDm u kG>n%JAI@r p]~8 alC::M 69M֐V;ou>xoo槫K[C5ǀ*O7>Qw)҂f;ڔ'qj´:00b1V X0!6^W,tK8K"Sa`,dH[<@,p 3HT_9?|>-%?]q#NCrCCZv.+"2x `Wh. pIK/k`6 JPhD{6 lK P+ǜ9we;F!ݕ#u{4'4́}N{D;FOσLUi) e/xP>BLw{K9&}+Q1,8c!ݼ^V)P|"̛>d*{׈.ϥG*Сx&f%¯`i*;?*孫&D6pƪaJ~vyѭ'̦=c3qv?Pozӛ;;7~7kxK^R_5_Gnuw5ב0fU -c4ʬ<ԓĶM@IEHps.- ͓^{S Ih%(~4VF$[-4=m4-:(JE . 6Koe ˡCmSPX"аrAb#ޞ?W+{/E}~lC}\lt5s 'ի0}Tq'oqq޺p*5{`_P(?u5$׆m^B L=\I +2ahSv=ᤤ b_`Y>ey)ݬ2ՉV"KZ;#Kп_w_F. ^WD&s)qtEq[J*'M4+i:#4̛ީ۷9D㨖oݥ5d W';h 4T&o~ Rʍͪ:5\~=&^r5nz&`YzȘ =>J F: RR/}{߭9Kpi@eGS A$#ʴWaܻl8}HXb NJoݬ$?K!Li--?3H2(Uj)b$ͣQ,`㕕 g0L#o\ HSde\Wd\eNjWf]lG׆(8dlc㸜6ľƞnX<7sݷ߉ ~mL! LL>TEgo4@\wUNFWCLD}C@IͻysʋI$Bǥ_4"');ǯqV;fY~#V'*+s28]_LHѐ挬2x5S2 {'kQK%Mo@%z& <2S{/$8@h7nCG]q"-Q2eik+MmZ_|;O+i`$fx4pۘ^s篲 r C8,Z|Gr}3"Ln{@2ob,f]= zMY66{w+tgf3)4O`1D32`Wgv{c_?m_zwv\ Gx,@R,f̵JCLqp\x;_.Ùѡv0d0ytbWI:ynA5oCAI8A1WCb.qtQo$-Q pע@<ޏD F# ml^&b&<rzG[qap94: (Hm)NJ&ۈl&o}PbD ns c|/g6CyjvTZFj5( tcYm+"ЮAt~BτAcs t%kd!X+J$Sj?.Ov)ʩ~w}w/}W*i ɒ~6=E_$ :q]Mܝi#q@zumlia ?et/J;#1Vqk%q8.)jjtmTpd\h Z2$n+sCK׿ /hK 1?_Х}|\oc,)b M|kuc {$ _5/-̃8j\&&7~3%)zQ[1/Lف9 @(-R&3d\(-wB#ֽsw VƔ2 qI- _~룏>ZϞR/~OtϽ~s-ͤdj'TS4 +woJaYkҫT Fi"6p'a\^F2ds-̽KK" "R4A6J[:/QAx6d2 d\~E/z}wVlh6(-d[N \ CKNSmJ2&j4}ohg%|@g qNZЧf o"D+,2P-hkq54땯zk_sɟ,5E!B=FGnWW=E|)Yhȩ~Hf,T u^}8 BQ3Uϙ뀸3M{Ӥ22XWλ@t~[4w'XeqyԎ #r o8rR'?{w4Wj%q4`Ցz*9 ~ SM 1蝭8!nfyXo C\4@a57~M1*K# *0 $㹣':VA6ElD s{EROO)z;QtН]gԓF5 tC`iK9,`HM*@&0N˝#%OI+8v{>,Gؖk iLVelryM-^J'W Ԛ`@glO#ۖBmi.*(\I٬#2U׽I;-+$mECKϤʉUْŊ{yό1jE Ztj0RRsbq±, VFJ$l-W;(bS|u|؇JiIۿ~qCwʼn״_τ-f"x{}qteF@~v%ZP`@jLwY|~¬q2 BeQ3ʮ5d L} Fs1=X0>K(in_SWUCmc&A 駠?z]hY(v Ʒ0ozBIvZ8 -$N@o-<2{n=9__/(_Q??>(! }ɱl+/i>g1ugIlR5teӆ֖2't߸=U."/8C^Cl3PK;h=PKl ~.#*0D'wo2XT;{b ڻu'&!-ՙro|+oi߯-p;Gq#6vcpWi!uf6Qȑ'WY<|t(Vi?^+vDEDM@eg3/lZ>΅e (Q3p΢u0{ Z2RI.n3T 2g΋G4 ~?[桓 祿"%m P99Mf͠:ob4f $_LW:d&w,'M豠WA P Z0ՠdmϮkCզJ.\e$ÄG3)dY`+O ilu GvK(iD-! Wկ~uOĹy yE¯1eӒxBT%/r7۾-oyK=ǝ")segɻV$E%Pno5~l: ;UBlur!B|]߱P2pI/{غz -MKY"ə2}!{h!^tDUuܔc?cO T CmUE#:)%e11?0St0b|SFQUډO~%PcD- ,J<;kN$j&LV;9g:>dtmΉ)Ce51l>&`N՚&8@n(V^\8} Y<_T;ܟ__WĠR~)z&"l3p`jj!1rp]J[LQGH$m.'fp,R#3q{n*II* _H|z.Di VWNZx24ZhB&gY7+S6z23~ş|ƒ-'-bHNaAV[&yn+N^yKRkPh !m s$Se Gafۑ"]B3E!P'͋kpX)8&PNS*&=8D!(h*õٲ>Q̽='P5 ㏾aKPxdhNw=qM(s`趪7HZ֔Z.QPh!X7A2hc0fw@4vjGo ޼֊Oۨ!Z!8-Ƌt;DKO8Yk^eP?T5{9G0N A@1gT@v|}bEә)0T &> {iL ot6o1'L6z0t=b +:Hu]ʉPR2簃*ٜ>NWı(~g8жm0c fg1dgK2D>YkƩW6L<6Oa^ &[Ū]@gf NX-(,jj_E@ 0ElAXd˜6' (E9.݀Z`kacڈ{`@ČbMIц?QMⴶUݔّ՟ 0dd|{`DF[JqQ˕Nߡ4bLG5o3̃mC7>1XP%;H)>4$^k ] P9f^j&хF{v C*{}!rKMVGe*\%ᔑ!| r:fHS\j,JѲhr pg Fʣ# ^zPjU%pR9C<@`tm'{DڔRqS}S bdEwcEGZps?0A|fqT+dT4/^glrF ee!^e[Z3a]QQa{ N",H=e&稔e)8ݢ>0&qH+kZ?%ʊu:fԑ(VMi1+9=Bs&ð{)):1M fIpK10%`b`bq)=B(kQ D`h246>$6#ӽf{>Nr ) rNæ?{GߌKLD.t >}*F%vmTaDPSM; qggv?im3BtS3RSk[)2GԻE|ž CguB;0i0 ׀Ls爦8š:w& 0?>"^,KՕ&@\cCW?DߎZNB3F94j$$gs>K)p^:R4,6NLo "Yvⷱ=liu*iՔ6V}1 m $~}S_ \| ^fsϫ12vc[br{0==z:5'6w=L&)q Ʊ-8lM,ö`Ej #tSUBwH],A`-7*5T=+lGJ41I=EYa;b&\q-`- # sdG=[Zc%:~c7ҶJc5h&bC۰Dw!ls L@ 0A5 N؁ G5*Jb#{@%lDD7ѻoؐ-SBS  !Xҏ)lclK3%a6~2Q]-@uElPyx5px~0"Ei B̫[Wz#̀^PS5C62{_ S3q{da:=8a|-uv}Pb:5ʧbMiکG_)4kex·yܑ ]G2lGWFNZՙrn9ɇ%n~,0~#i "1஝WI5J]PPhZ-pJ 7\XΐcEY'QY72|aA2@uzQ-ki.)am^HA=E6}n5agMuG?ke嚡2~4 yj,b,M{C:,5_6Nf(s.{E7*t X3Gܼڢ]T1>cFdKׅ&%푆WЁc1VӬXFʴ'Uts:)J2껜Cu+z_!.I-mJ l|юZ; vfh.#YY%2;`t)*,+֯1|Jy0Ăz7?Fˎ KSSp#,h *ffRt ֪zܳ E< 8߻$8Y5tk6jSW&kTL{GR뤕 *i g&u23*J@[F~tߜuyn̚V|Re8\#lD+(:d z Ih fx!'<{* qdHw!ħV 4fֽ*:買tҍkFlT k>f^3 )990P [?\u1t1H0{ ۂMi1cv֜p :"Q4uڰK>E!K^Wz{SDRX~5lOΖ:?ׄ]P]ΩEu QVw cIa S "cr:kc-a{TFL}@0{j4qe>6R>!9q{Nᰣa)(A[h;BTcZ=@gA)8:v&E\¡Oz?‘vTJWgMlCciFfG:rWdIJh YZL7ON_ȕ.XtP,y8KHE#vI5t aYHRv S)$(l˜qr"HyTVIPA#or6~Is?\`|YVdtԡj5l^ fʦAi Flh2nR'@RbF-l,ixH'p fdshmڔSum: 6N\sƣî69ժ䁞rҚm 8F^;`FYDL@nPiVX7݋iϔ$mk1~̃h|f?BcP CY2̓k[ S|@ 1\K=>1Q2ɘkd) (S=0_(hl#ͱ0/0vz G/S(ΣGrb9  UݨtIn E:Z~ +Aj>]';᪋%W̙OsٓSt;"FSVTC\^Z`0Q'u'}:]e (-́ r+l'b@| XFO1vAI4B`D̄fCRu ?˪ra#AW012 T͌lefB18!r?GeeWތj-87#g+_ VwxRPZɣ5IiiY8).Yq4+DIwY}nƒfQ3(DuǢ ;0Im3'1|]#pLj1ZOR*!tS[tf S7j!_944vl9nI:mqqߠ?75dnvNjeco1:;KΔ;Rq.JD$F$M^RGK=wKdg}^RfRor ο~Qx|#v|2-Ģ:j#ܨ4EH)FN.`'DţF0ShmE6iʰ3BtUV2Ih5JgEn5AO&õ=BpJfkk73Zʡs 4zs`*00Ӌĥ1 XΠ`A~$'e0a[ʉ4gV 8hZXa$֣kCъ5AJ _b[kzC˙ڍ{3oK|w]|AL䆑 |O@K\țD;(8D_ Ƞ~->QDdK] pI5O|95fDFI\Z~ &)2&ՉΏ`2+|/SH|/{Kd|6?˚;D@Ɓ? x=Jk<9TmT\uc;🤳KL8;^GfޔVU|r >qN* <_D7G,} VOb+χNĝ*N)ppngZq ק*;Iv+`oo*6S)kXU TPmύ9p!N`!|`zshv'_:N9b0AL+[ 0Ȝ<_g @ {ݗqteNrqldft- =2+S6:LW`OΥ&}cCN ;(W LǢ 85Æq <]M=ZƨQObcv:v>)qЄJ\` = O:4$@13BK2WV$rr`a s4c+qGjκ0cЌgSEɸ kH1 BGm`ˎ:+v5@|0]zSXꃻ@cXi5`Z:x4x4xچ!)@ /[kr6 m])k}*[$v.hw-p̥!Wn&-$Ӷ-c ș};,imGT[pd;z,wޱwOP{ 3؏ jaQd]VU8#TPbssqZƼ6&#ڥ-VW*bc#`߁qxy%H-6f+# ?tp"T\8vg*;wmTD7ɆPg0m>WFjs۳sVuwK >m2 # > ^$&6+KjSYj^`0ڙi٬ nC [V R|X/2(\^8-qo7GyF[8dWHog2M5mK rT?Ӹ\7m=XK\DN\,Y"!Z*"e( wJlPOYxPtdА2qePQKLaW*9>$'/бصc{@V~(AT:%&;Ist3VhA dW؀dQ3fl4sh$6'S#ȉ>'nS h0q'p"j 5RڨF$1G0֞T1l-;I#CYuPu#W7Km珠Ao]+&Y3g44脫&kڏzφDŊ[)V ';D; k$MɻM%*dBHn>06LJ)9e֓>AS#FPj:mPI2 DSQM"g&AN e]|oa@G]Xј|ruR!dAkcpeQhuV8HűBR&2O z>;75X85 ʪ`4 $f=BjDf[W0~#Y B0)oeL7Z3 <ꕷ vvg/*Qu"?SW&IHTP{NHs%@ eٟ:6y-WzFAQl?oV\M@2jZf`@2=Zn[ͷ?h!gZ-!֯CrZsr c,DSOiP< 6mU6G\uIJS:4IDwq}@|-鷭ā׀$7y(c˜9X%:c0 T]\BhRee0A#qUTཅu)9G2g ]j _!pBލ.x)lJtz9☻15ǐ/$mG o,T;oN3>TLBh]8%\b"3nh!qHlP#Hv)Vjڦ%d&s u(kj{ HT:U,úetpJ`~!6(pLÓcOw- L]10H7rÞmK}L xԷ2A>1]U}2 E֤8xg-Y7Sm!z$`~0%JIښuMP>mJ"-*Uf⊡U(%jlgm4мu-!:0İO]ݝ-)"m ǴSxԃf%lXՅuC:0\Vf3ROhe/PdI&a ˘$bBNw*)؈Nj:7*^A?xQi2~?l/ F`7;7DWN>cj0AP](Z,X8X*ǡV5-lR=z16V6B+ qL8$kgw`aނڏR!P;.XXLjӑcNu4Wlpڌ e2ۘSFQdٝvD3Qfu]6IrfʋՎ<>QrʪݐG9`cl=szT36; !$㋍M ¦O "#s|t;-CM$'4D(|gJi49`T\:}ml` Mt#\i5V %ANjd0ɖb=ƛ cL31ZCcA$L͵@byؖ0ޚv$hQP[j?R(.eCAPt  J4Bgo`TѲ+`׮ L'[ⲔWjf&Jw9\"C$\=5}s=.b bCdQC;h5]Խ͂;pt,A*G*":dcx3CZE# M UΠd;[iAP1$S7`U!YD #(1|̃SCQӽQ4A*nIàL5Zd=6+`{(㬌5p"8-SslM qn䌵op`a*6jFMKrzOPNwYV"E'X CGbR ِd2/Qz Ǝd]6(k%0]#:w"&$GcN@2x'My2>6ᙎ*=N6G F~Cb$fI)ryEgK(#TOт؊XH)ƈ)>.͌7vZc8Ueӈ&&Y$>i7l)=ulÚ6`*_ql7e3Gy !%F}m4䀚v5/9ܟM5O }ƨ5dq^ Z^`+4Z^xƶtQ3 ׂ`_ T}3=z,mVXOK8HUeqBlӰd] :L.qC05DdkCS:AgJfKӲ7'OAbt17 Bcz)E$`cEj-7 C8!(ZmFo?CPݝt=:M~~!œną#Zc" #΀$*({{` FJt=Zyi8Q3Qa&i||%@)c2$aDs2Aiᖼ0&fbj( W,4Wz<8HHfaZfF 9#@ R .QYȟ`q  :$% =b;RlkFr}T nQv|tЁ2 LqýYo/F`ڟr9tf }7FC'ؓyc̔zQpFME$ث'0&E.*c̯NlQEҡFP"d-xE6R}0 xh ľN(%~Ѫfe֎P27ؔHJ*nul(z^u+>@wG\oqt*AY4yy`fͩQ <_A7,|\!)DLҹ~~ .T=J#Rvq=i2幬og!؂ (ĀI)j ^(s*م"A>;M+hGW13O`ceFvFƾ^)mfAI) XeWsa[:aCwX0hRi'bGeިg腜8ZkšݵL a\͏P fQK’` ΘG E Ģ\A$ZYj~4kR)_ݪ{ {W!8P1w %t BG!Y9N S4xaHqf)7bl$ArżN +޸!* I9tG8yeK8}[^`ցDx5kHCIJ5},O7Aڋ| tj6dhםKa4 7T[EhAkjۨ]xC˴wF V/6rDcԖ 㼲:yn͗wAtHU3s<17b-Y#z%טZ#t ڡ~n< 3B${; H,q]̼RzH bxK &`h4JBfeQ #ER]sYmX-˽m Màe*&-d QjfѲ'ڮƠ :1uyt5& GhQ(!x+@fB0'ESvD .?`M'X k2hv24G-eMr3srT23}v]GGG;=Ў2%M؁Omy4 4o i^Gw[mb `$|Vy!7ے& PXQjGBPu6h(##?y&IM~d(M΄O bI{1 tL6r`8[B&RH3}Y9x+,{yE3_~ՠss]Ai+c9OsssC 3 4R&v4BDf(tOhio )Ԍ; `Y1B{RI:jB\y"y&1~XQw;= fhHg b>SNWf^ Cw` s RQn&[2F0e 4tUœ^fk&Xa"e=}4$p( DP*d?@L[U3q2w!4AQ0!de$7gunCfG|`ju$ mJD2flYr" ]Ci_w[n_>Xߎw5\77uh/ hZDZW~i0% fVDoA؉J` dWaJ.6cBpg%{$Oo/̲_lyc|;]M=Y!<έOb6`߈F=$kFJBn\;t2S/@lk5tINA B0<;169j`#d 'ͱO9N _0)5ǀ6 Ȟ `3t23 ,g-XcRZ(IAZ'F*Yvo&wA˫R(Ջ.Qd3SB&yȂSt0I08ݓTY13DY V3dE5FgZ, .rʭ[>',|>boac&H)H>q1klD, &Ե'ij  |,ϥN(hfaHI*)]QNGnAXZgvx!ǽુޣl"3scߒ''VmY0sο,W'&b;&^nCPlXumU4>/QQ4+2Z_ /OxWpGJp"rrWD CsxD=:B1d3(@8c6&HC9A9 J䰏$K:}4ɽԒރi2lꫯzonnݓ|X0{_?uJAܛ-QZ r43VQcTZY u]iU*DȸCǢE͈hr/:9[:JN*C>lɓ??r,y(`x !)Ǐa?@|pAi8`X*fKdWS:5j_Z`E`"NlFi~9p>&M- u:2d$v24FuYuA*Mh7M=Aw`٦l s9Y?j*mMAdVa]F~7}zUIf{u)b_:3FP9n6'Fḍ`d=28tY {/o ovم 6 ƀ;b]"G5ܱsBf%k"T5#bE3Y%#uڤ(Mt'NAY^e1ӂeAh?BTַ݃ T^NvoWwwv'G!Q7!8]+HuHPO٨8s Njzk T hb-m|9aNQw\ȟL847'ُQ? /JP/% 8u!XN|ƿ I\C/0ڂ3{yww^y啿.P4G Smve}{翰se?[ CIQؒ )h!B6 B ey!7>jyw'B@H{6Di(b<>ƅ~mE6>M`GϿ8B4rgzW ҫ(&lQo:T4qG{{{o|o6~7_OΫ/a@O}ƵYfl>#` > gF(9WO q+&O5MaE (@b0yUghN|@ȠWW6! ?k>Š𓜕Z/!`N9k ^~dj?7ץ+ nrmc{kW` H"9]N{#:k2*]~Xe=oVG&EdWQX缡BLQP˽d"V 0M!~SXC4DI% b)cF = UfM)PHBZ>TD,5zU?x^{C /{R {ٟv/omZ/ Zq~k`.3iCfM\6'?yZ)eH{sO8 -Sہ˟1X<1~ ړrH( f-P$ XN gfnxw޽o|ߵtPA`}Y}VK;_l 2E#5VBʝ-v5c] p%j~U:5z-'*:Z|Ir7@;| b A2R #-!c䮏:O JzgcbhwlbYΖpO@ִ45k Ӛ5iM`ZӚ5iM`ZӚ5iM`ZӚ5iM`ZӚ5iM`ZӚ5iM`ZӚ5iM`ZӚGv.%2IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/256x256/displaycal-synthprofile.png0000644000076500000000000014270113230230667026167 0ustar devwheel00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<cIDATx eWU&:ZuJU%BUZ4FmAn׶_>"M*H}* "$PBT%~Su^{qz9sTR9vΩ\{9<3?<gN3?<y癟g3?<x癟g~Y4?33? ~X~=Qu+ސ7pcytY=qɠQ2[%W_0Vװyz]c.,U\dty5}}Shd]g~<|e;m+n F벂Fqk_CB?!R;*cgxݿπ@r{(on 6i),do}>m}o{kOΡ&s fus5:8JhuvO 5:(`{ rcORhY#o%!l뱸]})FFfhؿM;}̑P;3N,?z4i9E5ƚvw%0޿B]^z1=IaNAv#}NgVmF=qeƎdH qIiiؘbڛyt=mL&Ng56Bc5)庮c'v\x^q$TN8T/w]]%EU{[:gF,`ھu wBo:{W7J! q w{?Q%2xRkF9q:;3hYV{C7ghI9@: М̌>sq*T:bN&e=>(Eo<[9߽``qtm$iҼ՘|ʦ2g-޷.(0a^F~aSw!vFַm/*kVnȼ9gi<^F +v. vT~W}}R!ȢhNX`#؜=7fF/XBfuqE;37Bx/70ﵼf{y?=g~Rɫ.6֦svGl7`bPW-rc@; F:)mjs™=ioYH_7ys_Y13PYYu^{qP' #>_^5P)e߿mץlc76RW34c@_^$Ng4u'HCܰa${鳧9an?c@|ӋZwhfTN0h}=uY`T'cZ z 6֘JknAeFy>"~xNuH;>.jܠm9H{΀'{o>uؿ /꜀1@k1ƻ.`aّu&>oa( {qr4 MFEq}طke`rH%~&u!lւEđyH׾Zg[{Q{? j: uf"7(:4ϟK'lJ~X)sYڡP^9P%H LXǺv_6>y|֓Gͭ_}=6TxʌK?3XKNƿ (E~:ibRLߑ%451ɍBAGX8t3vPZxF`u[?en>v{k_y~ËGIE5x\` \qԀss&6ޚ@KɖdWk{ p ECaP2 EaDíP ռ~%ϩ`o-X<?_K~4^<&p=qS`"24㘏p,:~ls˙?nIs&vY9E> +3:Qq"5c8iCWTSk/5ڼ5}v;G`XQR]C[5?]`c谆F1<._4IO6|Ğ]\8I@%1ʰàq 4G1~*%?`^6Z{6mN55uX7Bpz;iY/޵fҼ#ݘI+`6/VT9Z'k4"5Ps55g5n2I]/\|BO_B8 _ss]ԽUmق**5ըY[,d`^+j=o&eK#kA/`'Pq1gKͷlx$=}רn?NZpk0|IWۆmSx7$;w6bS#;oG::8 [vn;[~f=WP%%: ΍0 3hhL#>E|va_?5uk wug㿸@@rkO>6ىգZ{:/hmMsmPjuӀah]"0@CV8A]¹ {|_z&F 5u$= `'^Qp?)&Z0tsJSg=~Ĩ8 zu`c@;v5mM!F795~z82kznuy z b;A9((ޅ6A@IуZt?m|γu GqO}6|ӒGͭotL4\E9=2'PCP 1p* ~p?; s? T\-7$I>ٿ3UL;I1wKykdB~;Ngwg+Cf!_?%QRq8\q5wT}m9h6{oOM|/O%9,Lʘwfn/{)z>>TϷC ]7ko-K)Jp%moV"#^ dD`Ҳ(1[=H[koИehM.6H$qJX>+\MIg~M ~[߷|ek$E]4(6^.=28w")}SHzہ+k蜁g[/D;8/ev^=lmN;H)*a:;4 q\c=SM {-0Zf2"",byRDz5$!gff~ea NdGvB`fq涞KpRMeSϥOm`tY(Fcj/0z+bޚ nLke/:V|6ֆ׌wE7_R#!N!q # N, ?T  JF/?#ca#0$1@-;b(;Mcvl:KHI؃x$'%s2[=ooU р)3ds{ҴL6uW~|ʰ2_P~s/+= :?I#Ğm͝eϾ=8aUv33gk~r(˘X,7A"CBɓoqWWyT$XKu}Ml곌9Ig0hup Sć\ƆV92+ڭcI{ +65wLp=TEn_xiha=ϾWY K\C P`PpeC"п·});9T +x@װI N=s69[ܦU;O :{pƟk(^|݀æDi ^ƫSoflʍ3m ɗ c3FHO + oj DTRc,eyg <'(ڨ]P pu;,~ j I}|9'@ Ξj#l܀+L$vSU<"a?) 617Mn~o+]=7XWWnllPYu#w0{ZVa=uZ+61a~l;o]L:7$g$ٺ*% Sx\҈lcJ@̀fOx.σ(TUbMlݔ;lC˭$%uIj0'Rg W3Ϊ,?{GmklexN!ܿ*s?,r' ES <.I<(xI0BX2iL DFrbd@3 t lf/y=<9[G8d6N`eSsi|{OU`/O j;A_\0SfaޔƟRv o⪴侍[;T?ԍ;:Gpw[R!n\\(_ TFHPUmEj @=[i@M2$æiEo#bD#S-,L_|6|+WAw1@Q/*:2}SiWn5F4@E@gwUӮ=3=Ɍ͐ot]DStx;mNlGsaz({/'[*2*~; TI5NJ6Q3FYRnh4<(FՊȊ* cD K=҄/jN{|בبtn׶vvw?ȩ%stoXP/e Tlѽ5&7Npr7u.)'V= 5ߋ_:gЂ);kfC`JFw=<{G 95Th\SPJyueJl]0ԙ(R8-zYJS0*c.Ãj2gjAӆVmwrT;2+sGLT\xKg?~|#|¿!ضT3>Vnvm\c#Zz]4뮿姻ns^~5;woNP'jtv*Ǝ,̇k9MbǡSL9~q] QRy!_ɴ[^YɁnw5O..AJ qG׸۷!:XΝ[ݶ`b&WFQb \_+)]+ȅTY>gػs2Z][?i97dPw%s?>o#tAHS V/'<Uf!?HEdS{GrA%'[W+%w^ :3V5tE/4P*:wyyV3}YT0==6@BؔE)9gt@CF٧yp,|ӳvxv-59gFpD㿸xRT6ki9Wv^7b~*{-Gp]j8WGȗ'w 9r~ ([p~fv\ևBq?3L=c_ ^, YN &{B7LgGN!st>:1 ȣ nUo!yHo.?]e.7|nfqkp 4Sc; X ޵Y'5IbZn=WЯ=xFKZ:@iCl';(1ROX?3 e5c0XȨ(/<} <(9r$h8"_1y &)V9r|o3j3aFNS06wl:0}+]'բOSh "BP~ s <P{.fIٱJ̣kgO 0b5`a鎑) n.4y߳`~vTU 1;6O2שK@4>ä֎R?`L?,;kvK__Czt\TSA^G˗EQ^ϓsڸ7>nHG-oCpBiF8F Es#Qx4dZ. j(c|1Q߲j) ~^6v6\aخF,ۂ[g幗6 %#;I)~ڀqH?pS~N%-뮽.۳u~[nn3#k4(iIտJJW&)P$EX >$e(?1]Qe#s#"IF5=7N3+܋LN/N=^v^0P-5nȮM*oe76xEt)95lfdX3e#“jdkDŽkUXW}` bl^̨7E]H AEi8)y1 sd e^wV\00Z@;eA{޽ixbs޾ֶ9bX [f;"J:ް^3U›oҬfs`'E&Ef;:r"JGIՑ}! WȜW UΤH8dǗT`˦2D7" ;;N>u R ⾋hVM _87+˃O?9Pkʹ`~M|ynn×K6*!Gc bnX| 3'an6 -#Vp6<p*r:1RI&3& Q =VRpЛ9 ˆ)(Bf uw!("@!TW%DruVl8u@T9(j>҆/8cQ2Ηl*p1Rw۹t L*P'Cww> ~ PT*DߪhY#o*0T ?. %@eO=3DA^%^@j'^y@IUn"FQʠO˓>o{ATh]G z}ܹyPdkٙ ufHi7Asܾ^G.R*0o|N%i'.ٜdH OP׻zR{Ϯʉӛbrke@1#/LwV:,Hg bڒ@$bxzÌQ.^ HF @ŷ"GeC8AzbpdHq5BE"DxϞ͐԰`.9ί{Ќ yR EYo)2 H5q;ҶZw:iY~D=_/BQOX@cPI1RE ndp 4"p0@R4p =r3\l*|jTF)m y[Fy(f ʿWz)|Ȯ<"L5vo=[tn×k~~rGyC `} NP%=:O<uCA, 馛rP/xTѥ ,@.& &STJt*رa2[[?ޟ|$~mx1g]]wd&񅬷>zGX=#c"T[.wN*(i}"n F] LNJΊ+U<5q`'[k$#D J`FjWGax@˖ENM,YG.Ī+’yXʪA3oJ'6x֥R _77FO~.zN@l0L@)Z[6svn6ns'?; oȨ\IァcK> R]*؎UzjG6"9G9]\;:(,)BDÐidmQЎQ.Fe?mo6~o"]q }$3fE,{l{ TØ_2 Q@O}ύM|mx1ɂկu7_Lu|/NF }/4 %V敨=.;ٙ^P"~۫#^ lޜ^fCTt}`M4Qj<$J)VȵY(1@*0FLdd@ bIF.L̝^X5Ta`TdwHrz6;}(vNHIT> phF?@dXS憫_U㲟pސ[gl%[s'C4|u ];SNVCxS캦؅ɓ'+} 7RHAJQ0)KE /!T(<%^ á#1=.j!PѼYQ07WA[H=6 8{v^VXԹ7: |v%8 فJ;8"0 $"{䆹5禙~'GX곙u 9h]Q t[aS0`U m2@$zU!F@V%+"AZ hUHhz)j',--i_A[qC kK;3mxMjH yk7`7d=lw T'gc FN You~ܬ އ6\<Hw%i33 ұt2P~MHhb/V m=$]Tڃ/c:G`-BsdH "9;}V*Iz%4)La&D4e~+,w1phTÇ8q4^5InoUqLv~z|!̋bcw7;3 o^r^^YH}7qI$E Ir)^ϕl+z#@$k"2=P⻢g" )L']J$u8BçN g@0Ħ?㟿K+g7nqac["w;^i/ƹ;&@@?~rb=C~JC`̍u0 Q>y{t 7<@K2T%P=5PՂZotR(ē&BxbX,IQR#f7re$0z/84f52+E\T98I:ݛZMrKm?<} DC8fiU. ȋYU@t2UefN`$6mB7 $0|.I::ơF;G"c Ui څdDh-%A3*|R"aJG)*g.Z`LO`7A)ъWXl0x~vJo^VxZӀ59妉 %Sé\kXs =8?=7"$CQZiSw`S >:vQ$e p 9w]cNV=4M"'1۰Iԣaхl a: #"gXB!_#BFFRA S?'VqD{,̯mz?`f?i/뛟[gsr;ɾ >߯ (,wQg-=D6@K$k;-$`@PBÁAe]TGQd7)LA]oXW C^ۯzP#x;eFi&#ЖƊJ{r?Ƶ{Q5ρ8 1 6=k†<cs 옝V-__ɴ~WgIW\="7j:!UhoŎ6=5% "~BTm&UL,@_LByȂ}t"QH1ythA"Kˀ'QcR YaTC@pxjp}P44q5I–E w ziq1S;Gf|.2M?PGR6Ouww2TGeUS[6Pq,$,H{"U#Xg[kVNMN ˊ9a(Og TE^^Ix,bYM k%uWws# ]Ǜ O.t b;씔%URe6di\ؓxр/Rw 74d2n! *\dX:c*dQ QYpn?|X^96쿷NreזqFmr~֏[\'.ς#г8Mjg7#TՌ\iX'O| v% _ hMi5@?W0b@)l5hz1(AHXTJSƳHS:ٿWWWʝa$g:e(8t{Q*B`п/k@yf&l~4`,p˿Fi#~|+B=zz^`gȦ¨ *v qqKKwe`Y,gÉ'f M377+J~^8Z&`(N՗+RIKjQ&Yȫ>Tat0 MsEYzxr1DknX*h  )dyj`C]Z,,``*A:dI5n~ox-& ?IMOן=aO~t$Pu,2AB[z{av&ڛqN* H.U5?yb}5}Xh"_ORvҊsDw"zi1o(>T^IJ$وq@bnV \caF4u  hkZ{uYcܭӓ7_O(:-曈F"$o+mREO?ՑTB +wV<pށxO*g՘rV ‘(K2Q`/yi2T /1GkU @xV $ V$bW5@5dj|M%b+ !N"%'L4b,`yTJli@#}8i9$IaRE!D=ϩ2ϥUYL!BɻԈ~ vm[]Y#CŘ+=,v6rˍB4(ɻ GCbFޫF`NP̹z}ݲ?dqVlT)0(Kq/3fD9)4U8a p Adigo~N;[_{ƍH|mQ@v/ñO+=iekst@jR<0>bE-VmO} ŻaeuEU͜ă>WEd`J!*9T5[ˋkB,TIV9 R5T!T_*ˆ28|MFγCj8y 5neGV'aˆÌ:C{j'eՀ97Ϋ&6o>tI =X <`ua=}VG!Q m9~Ov*%: @1%V.(?aϞ=#=T+\H͍wlqɬܸN`?w;{,'ʧ\S; _n eԂ Gj Qx8T eT7zG(N0 Jat#l$a-JξBJȫ XnõV;NM3lrly6OOSx{-c$i- snd 3ȾPp[Ȳ I/h=y7t(+@!DCGq#bD+lډkv!v ?,0йuHDAX{.?<{B{ (.BEF F+ۧ/ : 2Nr8wN2:#EFY*U>{ l eAg2S 6m&ɷ޹h()~Lg5'EOQD?'9' Xx)yE)Ͼmg#Pq9P$$6ZIrUf6P 8E +G\σFAtj E^Rq]矬1Db$!H'=bp^:]B" TIcpYE )?N=&mؔX!u{t`q$=.r,8_`, LGIQ;ې?q4 Xov3_B=ېL&T_jcQ$ҍ#O(}9 WU$!Ӓ)NEI Ęeaƫ2t3zj{0XmӸ{+FMs37@YO=vǗ7_M3*$111!9I ψ+LRe)ӧE((9VN%$ƨCDlڋ)FIUGtOBEi G18R&b2"Ap"M~#mGCX*$}, p A9^nhUG+Ղ(ݿvx(@c i4nliT: Zp̵ k2tJ,v&q\jz!Q |y$0?E < I!2e,^EĂ0D3^eL[V-B8|Z;Rv} AMki"G<RX_ ./F~!(50 8@q!NQirWmJDža]ڟv ė-x~q&5iI}?N`Y4nU X;(tr<7*ޓuj{_7E^E'K #=ylRcPjU3U$Ar$*{#bRX0l״`oSFㆺ@n6׷D.5g25q䟥܁'mp(3ursƢH^FrHM2wE]F,g9.;%j.r*/H)=\q|FzI&$=CO2Xñ9<+y|!_ ;2+| 'T 5P`661CB8SBP~< .:L$uq 49=%vzjS TyXEV H9SeQX~~g! P#YL.cpC@@ե@N^agӁĘfF@"H3.׉rDgJkm |-؅tmIR|TT^DŽ5ǐL$M$G XIi),D"1Q!^νIg8AHʟ6`.r@T5/$eV>j&uvf1I/K;Q9Nِ X|<(2F=砆 pH$TQv %`A uUIʓ*^ Qȹ&W.PiRйrg|Z@\C ʱuT3){BPlq Ev8s=os`h= .uڳjL)#h˥8c;4Ņ[y7Zr.`ԓFmnkx!*IA) Ӂb*[J+a#5L0 ]B=P¬"ASTY];Y+RL'EZr2Ӗ@Q3;9В,%|0jVUa_;nl:@- g&$ _ huȵhJ ,b&J$ΠÑ]XbRXP6 "܉YIaM4 L<H4O9aE2xW<~Ɲ ]\s[־x"E|;QR|Q~: A6'@!]%rVΛu\#8[AI`Jy- @8fg">zP?yNh$"F IW6'&Dj  zrF*Pxn "܃kLP9~fH0{OW NJI t{oxBI%T"ǴDTDɞjg zt_vij0T]#չt|C U,)+)<2B(:L8Hqw(6Qam3*|9٫xdXs돇<(y'$[lnGV*XM6w;ި"^~b!s0]R!E}_Zd/H Jv qJVvNT}/Ve QHbt拑1J ֯ҽ|韆%)'g&BPa|Asm )@$FMH/ٍ-ewcӏ 0Tˋ)) ah2R'wsuT"mQL݅RUVQU r"&+4d@aՄaw&3"kaע*/T)F,=oaS$<%ib^L4`""hx}!q-ŒRY0IA"2=pR|};~͕5׽;w7;6[A?,-e_ܣ*`Hʛ" u$+UjDV!Zhi,L`G%B(JuF1}/Q.4lb)$c_P<>ٍǧ  rK䕂r V()̉$_t zt8qdU051h]k)V:eD m1QUu/ʩS>lHO R!0aFM8#NQ薕hF@u(t*n9t@e@$aJ2b؍9 !QS/.7Lu9{tQlJJ2]r8 _ґQX!8a3MA`Whog, uRU @OMqa8P\hwx)R,Om*XWj7JieKb@9 sϣi$ ERI YuY,yD\cx2 :jϐBr 2Ԏ$3PqMk6CS$><2Zoc7H뜰R` gcP{E@+M4ez(i1m6"> ay xr*gI:E-b^+ˣ(oĚ2 z0T) Tį=leX)p(`CMI9Y@"g@5 4>V| 5@C%K@֠-<9VX޺F}Ad睪N"'>2Š=,e}~s#}~l7MXފ EG)YC TY&GD*hx ;wg"y[KU1 gJnwLMi7FQNFؘ ?`$`,e}u~A\Pޞ[\RvLiLȉD "A&Ɠ0ǢwF&ƛ{`,|yCD a)TS@w9ZE&AX$ߠf'$" =(Y@̂ 99TUM9$6BBDGb.JH R cJ1E^-`X@:a(d*@0rxqFlt%Eΐ̈́c޼F\GBʂ*gbfW*鰠LD >?2[M(eHkk= k!yLo_7^.[9Nd's*$l:5 Bkp94T%2t1)< fߤEY5˭L=2+Ɔb-QU+ddyI,KQi'Ί5t0zF\~&;@12ϯvfGxB18a9r)z j&U8imۗI!X}8"*04U˜}fY *+C21NԦ-Ln DfKx_ #wMx!e;p_p_SSg0#Y1e$ gB.A:]9`XZ[\{T$$N$ v&$3@qېȧ+A4 9WPhBTi+!r9/"Qw@cMM=~1&t}"B+f&Bـ1E" IF[kq7`\Q$-+Qp-pE1=FAn3Ћ*ri(qY(R 5|HңhʬBa|Ƽ^$s + Aq.7xeJ MPs^8'biuib*(kQh^ 2ZDm%ʏEĦrBAza"@\;@e$-^"P H|[#9\9JD؍[)ԞQ(nSi$/"U:o!nR/QZ3^~Xb;6.JP8R.ZR`SrE%[P N5~X*cEt z #lՊ$A@EٍiGzA-e,*F NeXRUH"YB'>6ZhU:3HHZp yݝDe D7FrhXӻ8N FETE\Q2 "Ҕ ҅"* *5Dkmkt?C |~NBW3$i2*QGkNInM:CFڌ3!.$EM5pE34x$"yT&x )'Z>HggjiFƘd` D=HF*Sh6Ud&kvͱ8;&Wk($6/fjB*I rpWMb!ɚ;q)]SrCZr0J[L )HfqgŲ͖k'r5if i wrhG4l<jEz6f Yw#S(>(b tnZz6ɍWD?Kkwl8/x#gqKr܀u17DmL0q]K{EU3 (v q iaALB+Sm`R+EAdQRwTZ PAWSM\F8G,q˺*H|dXρz&3-lRޗJm֞ ` nZ_쌼!R{f_"An@BD<9)d#>+ڒD]FsI:05㏽8֚vj^\N԰ U8 sʝթt֠zP 5HU) 3^9,ثN3eDUӑ+F ]ˀ;cN=Q!Ƶ3a;JfD@KOB. ++:j hH%$6z -0a3BIF8THWVʩP&5k@hC@"6nئ#"#Fʡ&'9PŢR:HzzBbj \RUZ+f aĩX->Z=N:eVVT͔}̌H5&>Ơ@酩F`# URmzr 92g;;F |19+}YNHPjU]{6bFckw J7b</Ds=?=a@(E9u4FdXęaEưrzY q +x\\)K-R40N¸4f'p6"S H#,Ps*& n7yj˼SgMk05YщS*SʪQHˬoߩqSGQ Ղً &M Y(AQw=PC"%E;I4x8 UT4&TB1L%+DŜP qx(2=hhx '{cc`.)0xp4`&GWW|#Ӭ*!3r5LƯ(Ӈ8V"e@Vi7+<&v  b%Q]r=zj];%r\1t 8-q<|cs4e 3sڒpJқ'SԺ3;k&= gTtd}ܡ*3ַ  r}Eb#k.e:D)6!ab(DԐyD`bjXF*l7՞9f&`wyxoioXa( 'P'ox:rl'ѱjrN`"'$&q Ja $y]x8[xa|8;vQ_xqfXڄ3}/OcK2F.d}) B?@5W*WB&(*$+@>iwAxKs}Ӕ\XԳSD0l-ekKaq2 [?Ե@q>Qf0YRX@# Ťh5/!Y}ЯFFMMCABj0?h 7=PC:xR ;P#@?VT>|MŨ&!0Ǹ%Z+q $HV0H^EoUn؃Ux.8F P j {έb1C..A;?oȉ@4"r4$rrKv%ꡂO$H4 r@=_l<=VȈj5C@ Нti J/ޛ[VVgksΝoUP`1#D@"Ah'yb҉oJbF" #j NA P5Q;Ngثǵ޺PgsNswhL% LDr0@5}S}0n%֑u<JEȕ )[NTbe8-hvrlcbU821~XڀT~lcݥ^ju|ٝSLUKwZ)7 9pBmɞ(SSfC5WrHSges Qo!MU@(e^X3N;"PO?OҴ`_ ,caΕD+A/frOpΑQ-49f`?^ [Jh #' Љ*OW f}[$:SN2 ˼;RүD4W4f=adcbO-#W)ͤf|GGB('z 4|} {$Ԉ`Ƒ%ȲE% `昘!^ Yeaq>ٻHZ); %-߅52l"M wcbF24~S^ 7푧)`D4bô8S׳H2OU rd^\*3*`yzȱ6MI__/S aRWƬVmL_F$]_4d}i(mh{PGf"򂬭-be'Ή}R{ Ie$_e7 wliVeVLJH8ٻ_NfygT4m@-Rt7M!hvvo8|vrs5G@1dV7)RzWR9i;KU]O[f5[I1D. &=NƠ =\%B2#t UF+ibx RM{Cܾ gE2)F+G}I8S2P!,2!g ЌP~, `HXPw'S '}z\^饨ljɉRيzH+N45$IJ,U!A,йط{CPBQ+򁖲R:sC=ARdz'F bHKqm &_x\p +-%u $(q\~,(w^H25ܝ$%@ O=]GR CJݘ:̹u1Ohף 2}{bsXHj:Sz2բlWp ;x:' rl%& d噠R5FO51{,T-RZ!c2733fe+UZ0IH @<*W4 `}p2%oOls:,AKeP;2WrbDJ+_5|Tz3G"[dzP-&^(6(YR!td M֔YyWP:gRC8nR|zRN:Z]b)h$RZ"z$ә ?S?)9ϋK3vgj|gf}w.D{Ʉ_-Np^d}3KGc93ymvAuTu[(z|Ղ[rGq(u ֟ B?9F~IŤy99jw+i!xȋ %e?'O*AA+Ů)Gt "4 ؗ(!p9,?^MH2p~Lx0de?=;'MgXnW@hkuL/8s7t{l l[qjȱX-VݪT5}_ݭbMI$>d(lZ*1X+3@*G Za19QJ?N5 fTd=fri@‘xe\ ȅs,j [{;k` 2'̙[ ph#ON w<CoÊ / UT07̤lN!r/p qj%h-P8HaOTN ]{h|=K}1t—:(Gy|^+5KWVVN%ZŽƁnEC>$9jT|9lK < y #/o񆦋Ёֈ_dho^` 3h= լӦEZl%pI~SDa?V8%Z" 8HE<!_uGm|=SHŻp, 8gOCa5~N ߌ~PG1d.OO?:=94% qFr YTJη$'3D C'Ucȓ@WC&{:I,EW@2(TKSˢKq·XX:2QlB#Dɸbjf J}4a%Rt.V}ѷne |Dd(kkMv3AQ M0 cv||76Ȁ *'PikrxnA~GlMYj:&Ľ\BZʴF[a3z8()2R̤ƈp.i/(ETIcY0}⢒u$PTu;u靋Ţ xrCP2Xt?iz5 xI)G Qe7?&*U M8sJ\$)<}"Ke@ AY .c}&h4HMDZE*@5t Ӷ=`Տ.}1+$߽:KuWToW3x ćl ޡl++dOo$!<&&.rxʾ{H]H3Z :?a zо `7[-Ms|9fҽwa A!J"঩gĚ u vL6NĀl<Afa7X42D֝5YKw ,YΩ>Ri:h>YHBd#j^}_6#82vg"V,NN"x HZkB^~ߩ ;`8j/myYpN `JN *Of?32q& 8Wc~Wwyjr3eFYYX Yf v!gJ"X/gU躕$֎,jV+2ׅ[7TҺ4]祙L2ŠnS:sc>_ ^EԘYT򉉉܍}T#/ l0G;yP#-IT&Kcv {{ʸЙϲ.1w꒗AI7 PjJ4zN( ʧVI*0>&"#q֤者FWyi>J#p )sEDNa"dshGjs:H!ן!*d!<0jBJUi6g{_9''Fk JؽsMia? ϢR 0C*u^X$K ƌh 1K;m)JL7H/5QMX jbz\H70dj+[+Rq1ߗ$ƒ~v_0yUf#d Fy׍hy7oE!K`fu6~vT`xzrSk:Յ.0zlezb=o MKd@Pjɏ+=x1XI|:QZ޶*c=m ZDB6p%m@#]%5P)&la-VeϠyפ 1@V ܿS YHWngPZyP%`GF$#5`%m#eP:Αc\ȇ?^Z6@2MML}q3? gM2XI`k_J(t,[nYA"H_z1Dq_`iāȆ`Kk۸GVM62c9 ahnR4v`}5a',`-!z1E"*)ERdmQe<:™i^iL_ .GFG"Մg9obŸriJTm疇BPmcAJ[`zaTwsϾ"ʀ޻ͧ@Z$(ȷvºZ.HWtAWhWC-ΩC5/"P4Fa>hҏCy/+UUo/B!ԋNz))X$!IAIVd h &})RӁ:#"KFƩ  #Ũl]| _aa?/i&86%y'NSG%5}#˷S^AIbIe>Wh=߳W(qQtjl9d4[]&m$.Սd-Vy2!I w,uZHDMh(J5F5Q.}QŰV7v JϘ訣DR8Eɾi\.ʯ\K& _;N ?9>')sR'пkT8㉾Ou:|f-ڽV_zOz]Xv&7-B*rz9B9%յsiЂ8|LzR%>1'2$lk9jM p#^nL? .yR/kt R42>h.1\o9,C7F5SP-߇LJa4Ypm|sFސ \ &eY@  CJ("s*A$nUO/ 3ؓNr,p -ElTQ8D]fOA-Jv+.p{ :89;P EyKA JmZaȯ5\DleT1+r'ѿaQ_#H!Gap{k?:MS#{G3I*QDvP 8d@`e~QO X*N.$[Gl;Al^Il(/DKB {2.-5#kZIRyGsI!߹S}}RjUwPW '{o-9!{ õ |\KsgưOR LTqc|:b:5<#/^/ 2~28ӯ B [FENJvj !(<:3pK3u29j=bن+^ g1/)rg:zĕ}C&4)^{y px1 gaƀLfKr^?%0^f5g17<86hy5=\}@,R/'оx%F/^d1;Z$;j%߾|XBBϠlqTh d5^M_9 rIK,v_qT֎zB9.k˳Z$cPN VY)3lq֮$kmmV\o5,w?q_lTʦ/ۮߙ/ Sʶp%APT` Ph:*LߒdpL9^0k֜kPJxҺdȵUZ o/%DՓ A%MMs?hBTkօم&eHȱ34Mghpp!8eo(WׇߚoM7?⪿  CCP>:p,dG_m@t 7NZ 2 paoVBv{0>>γ{G;KϪbZ%k3sݙsDr'b pk"Nېu@tD,1rHu9h*D{y%ontedd8Po+Y\YX]vh @-1haxfmAp аmÛF,&5"3f StXzQ$ &' L&a ]d|9A>-N*zp jeäuUM\-Y-A m\ٌkW@^Jlg,CBCcʼnX7 uèO;1('Wwt LM<a+  XӟюؠP/ϱ mp %L׹XMAP*-\6$Ī5Gohm$?A⺕*Tf[{ZAK_H w2(:2(J"#FQT%wHR ufK%e EIpfuR]?boe(N@7 u,*G.=2=2FT5x.b!B+0S<`aWo;ɗ5$7䏪ϥkm p!'m"V 3:BRU @>ɅjVryW75rYB# N^ʈ>3u@@<@<Ļ( mg{ª |GM?4|d NO?H5`rvb3ÇU}ˠC0sH;2g_Nȷw;x\RQ\j x\xId S(YXwbX04SAZI& {v=zijbكzJo8!ȷyg99O`Y* ˯?"=.Z$t yeW;\r~@@|Gob3 -t7nC}a:H5;\X@-,ںY׽Vaakl@9H C8֋ZUSh; ECb/bJ]iMv_d>9&%ZԒ1ض#[I*?-^BX-`"rJţLɢF&,wƐ_'_&n}1\ o`*+Iy+`C˩a^K7g4oL Go>p r ^/~+}zi8{g\כE`o|/ںϑQ֖l-] TIb(V$jM5YT5 8KRDhK?ĸd 5TⅢӝMf/HZ6Xb?˶ 2@ -Fߚo [=gPK8|o~1Be%8zO~*@(d Az@2920;~'Fju!P`Q)9^Nh_: :9 (h+N=J!-)S|D~D3R |ڀWwPcjX!"SSvp}RMD)Fzcshv,'`?YCR4k)3eRW]ʌtۯ Osoh@?Ɵ" ~wӣG^b38 ZZW:,`vB!ht`tl,H!vʯPʀTjΖ@OzrAA]DU^qSڢ D$B Z)3 ,@%ե-;6@Ƌ0e܈I9kH! D@MZwkڮ\{E}X>C+>Lpoџ:llgrҿwJY )9%M(Bk[ϐL=YNhn~ IDYF *'bBc@SHvG$ 2F-޾\sU ! 0^汈4߷({J∍X"EZ8Jlgiz9TXkD_LU/V`k^޿åjbGNO}*fw!t9hZdaZ58߶)DV}I###\GJuFBGbmdתbtNM(klɋ JB _}UvC@ZJr0CC011p[>*{Cvyy0Z{#fa㔟|OsgmJFq& $Cw}dОaIbfAwE]B=kA'm;m&=ЯO%7aԧ ^+1{*|\ ԀAx4ȷ?SS?0%o/X扶j7пokTv:t17 &hm_t*)*+ O5:DC`f?jF*EKv2SP>%kxTEZ8΀hwV*g)({w4<2~d= C|/[R3׵ Eߤq/tߜb5)_p}< [O}N8p ;@l"=$dҗʦ~0`J4~c>B`@>r\ur~iZvjkff:JL(UQ zfERa%O8oVᢕY { >l``^R*Rgv&Oh> OY{b"Ս@j-o XӲ65]Jė>/>m'\6n&9N 8R |#|4ܳH>d E p< ;L <.6ؽ^zهà1~ X:b$ד@vw ^Jt Y*A*r@gguF&ΓikZ!CsߖNW(7D[% @>u7Ʌ!Gp.KK|5d+(9{䦯}TE8܏{::9P:ػ穿۳:;9u|Hh:WKq ,]6u\sLZ1$r"l`6Qq@QbLԣh fdk31#  \j9@SlONM/6.r0O7SS3\"?A241rd;SS.P$@>,_{ \x͟zotdUw] ԧA60iho)ՀZViCrYϚZz1_)V;˙>7@K6ܱ/yi@_8-@Nk'7ׂ-YgƞDo{`~nv_{9? m'ql@*:NDxXPi;&ýfa^Ĩ B'fa2e^/wZ}|kj\)4Y9 f~&'5==r'¦I4؋NTK@e2QIgS)&FPc #bޯVɣ5$$5+NI/-ݯ0wƩE~Gtwbvg7 M6@}~;@oo Ҭe옩0upB`E/Y~6\|cIԞ 9PR Q لIIjmPcIӨj. =t6 (nUϟQ|NV"$B#t /_5D m)4Я @H=o7v-y3Һ.fu#zvkA*&@\V˰k/o׽۩1D}'CP8~:۽{.gn'f^r\z퇠kDh.SsN?d_G@lS3^/Ug "Jۄ,Jg.EbwJ|D?wC>Ke1O Y֦ G0Nʭw.}.~;kܢdlJ3dN=vN 9ۂ}y4T 8o $0nX_՗JS_RZaNi,3fJ)2AYJZNn_jY p /+B'/{cu.o/](˪eY%f ,\E:w[τ/]X_"iF1KfwnFDgT`K;呾}S>z1<ַ?aھiNZ/%'P(tN95L5݂Ÿˉ tZP"40kAk֖fK[SudvygBDMIOȣ/'11ʁ!/g JA76:f)KbKۑjӯ?W+ K^;s+Ə " 'wq'Hݻ~FMq[m#wQ=  ޿A ꎇshAֶ%erN@Hs pG{|PbQ|~[{C:#s%JV&",fy C+A{{;APE,NăIq|$O>LA`)6l䯝'd|0I.52SR&^S aiA^LK.Dp{{)Z6faG^5p^۹PCA7dH/JİAJh(lZ/lj@E"g)pGm`VxH^1!&L [`+ҫoε~@NDmi7m"*,zdX áAb|Lf͉]g_vH9?W9X ^Q5}8dۅ@?uM6qIFZû o?/1a9ߡkDSLwCx>ЧSwf5g;2<'w- ޾+". A). swa&`hc^fd7gG?JG KHPÀj- %J{ R)(6%pXl|PLAQMaZeAPL"32o W+!W*hz$y]S:OHQ&pc:e_<{|O5).n\t)0b/g2W3SsƃF쩖m}`n~&6R|ljOpb@R{<)^e]kYٜdsRRc9/y7,[~q;Tʓɨabji'oWZ@&h#S"mD%BKО !:!&3g=';30JEF9PL#,b@ dF`l#F=xqlc\xMwaxn7\. b'NY2PqiXd)7Bo#AFPJSoBY-ۄp9(gb5e"QzH2gb=f-՘ $,T 1.&-pA%pբk`IaIغ3Q%n﵆d[c:1|輣rj$nWL$~v =OL<˦[eYC[`iywy1ϊ58ŸM?G/ BT)/[zCط׃CZƎx:,mZiArرm+3 :83 #dI,z'Y?7=Ȗ`VJH́dMUg]y@K E+TM0!:r]p+Jw]dqZ"bbG{aU.K'>9_g6߾F[V2KLv ^'P@Mf5kROp:>|mW\'V׮= I fKHQRAË 䫭a6`) |?r/`qzXu*-00m%5H K3S]҆kpBAEjIۆi?>y,ѣ䈵XSBy.}!u>vD8Ow~q g 0˧)Ϲ0| ?͟ 57,7z <2ovROnG׿6Z}!tt.!l7b}F 3ec9 )@֬*8Je3y2pτehP>1uʼn΢5m:`@`hu@*AD#!$YD `\̘S;΂7]n .o"xt%6Vv S>4/kvQY'l7i_7NNoJ /+v ` g;hϟ;egDQڢ-.MdLRlʇIJ#e@9uF: +h)%ª}G'SGcW#:wY |&)rPS;t9zz?5^޶N:wkOZsч˥5~R'FoZy-BjQ0јNcw&H &FMG6U~2M MozS-Gw]yp'yppӥx{g_ʛvT+Of& k(omsC( =[3G99@+:Z%q>xˆ9{a|PZQ1X ?_#q2T kr}j[k:ևӠ#sIjg~k Z?i%$${M~#mPP$uf9ցmAj龧o#du Ds9;_A0Q=빈w&\6p==~f^ᑟ}s7+Of.XV۵3]4]d$Ad-#3jl-M57CoB{feQob' xpY遙LigEv">=ʎCv]"XֺA_޺&k&k.=zi_g=פ7[qȻ>l o]} o|qebp;Az jgR(8 npoϖJy-+Wdm' ._Ћs.g G3▅CWӖp 3p6YȲ3`Y3RA.0̖`2dE(U͔Zٟ{*~5佶ZZ]Ж79w|t,Xܺ"m0P }bёK :Br[4el+iS8"9WLxQ9&^#qr=IMv? ?ߥoe&OzYP_JTj$}#oi׿.JMriElW G H$_qs4KVt1.f#98MDu.'χQ>2pQ @a$xAr? D (3#Q&QKk' |\b\3 X^΁O߳wwxk&ڹ=]s_ve ʋ8W/=A.'!vaEy&Y@ 3G %OgfJ,r,O@<ϑOa蹳i&7p!8.`,_v8yzxg>?HY!My,??ϮfGǯx?X.MSNZ}v'.FѿXp}2\^]A\5am#v9q_Lwԙd٬jZY<*R x~-n RV y@3a#Wͳ~v}]k+j@.ԁ:C݇gwn~/`X6_o&\ʀ _gv_~ӻI']qҪ o qn8\Nt 0\82zHq;=OQQj 9]d}1[}ۂcTOjj¢g/] p1F%p 6p}7vƙ7==5gްve޲FeBB>4R"$=snznof)us-Z Ut.xq{_E}F:p/HZefH.:;3~KV| tw cX;1$ d 8\?cmHիJ7\effщ5#p{zoa{-ï3IpHjg?Lsca44h٬'kL0_A]{]}_fɒS߷|9GuRft2`<ͬlFQ~@54({DvEx< ZWB1;}k00]??TJ 3z]ՍD=FNaƂWϱ--/ |Q`^q@mI+͋V,?UCWʸo/  z$#O98oGg0u΍3wsmapj ;a=}ͷ9<5T"h`|`m\ 'O2U-/}{EkegrEt1;q]!9Q=l+Q?_(P/5{ʐ=(S'K,`SN t7́#ݯ8/7aX\Igp5vTswlͩ @NY>Kowk/]+΃%O %Qaxy@tX[`>%4;bqE{-+3~00g}/|s˗{pt{\_eR 㟛N8K%/__xߖ?qS~Qɗ\q.,_vdMS|tD;W;}>ʁsx=8db? >  Ro{STfu_e~g6f^.pN7.= {!I'Ye,G`x}W.?/rѾ<*B;=p#rw̰ȭrI'Hf`n=Le|zwOjVQ{,86pk}W7Zej9=c+WoXE֝rٰlzhi&SYAcTAϓ@~a

ɉџמ(פ2*,>*Ɔߌ3ϯog0W'oވ<`a^F`..9t5ڲNn_LXڽ. :-g tFPmԩ4A!rr?/xFRyЯCKKN'o c'KOw3`3:^xL4H;(8Դnps7^4k9 r6a˗~okowԽtɰd)ݱ<$.0AXLr,)\58*pQ05!86#p2:=!? Ó}χ?;?44Suۻ暈J>E>]kNpXA_~[x 4X(짫sUᒗ]uuK%pq0qy:1|]w /jrU>REg. PeFl,00X<\R ?ylh *WCH5! X>l|^'p_ܿB}3{Ϯgj^-g`׭Ի\6[/'xyLsS0+t ,Z}iKcC!rn>ߺm)v/st/E|f#mj2G힀uDYspabfʕ#jٙb>w};o:FOwB|"R`w~Fc-_wW5 Zuu,Z}n[k9\멞?+kɷ: Z \ʊf^>^{ZH2 j%\mV̄GC<fJrJRTʡrulqp٭{b$o}WXx<|u90Ko$Uf0v\=7sOfgd |몼_ =-BqC;)c< Pɟp:cW*##{o9@FDwP6zE7wj R`.%GzO-`wvͷ?8NM<9eU#_a x~4sfYy&"~DO8LWO |pj98f񓜯ѻ w_=VF 4fc9 ş֌:W= e󍌽#3R|g3*w:VFc4/ pfJfsF3h|E<\p:fћE\F\^t/`E#}񧩟+YSU-IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/256x256/displaycal-testchart-editor.png0000644000076500000000000007043413230230667026731 0ustar devwheel00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<pIDATx Wu'x}UڴKݒelYCa;,?;if:ӝӿd$CB3餓tL`6 C/ؒ,kvJRs^z_=z{{D £\c ,< Xx,< Xx,<:,<} b @)P_6_oQy쀅^bC o~.2?qx`ΙЪ-Q47BGVB 5@ozp&?8Ws>7Tp-槛#:΋ϘRlPD৏_?Cy 3ٹ tb9ܖ3j~IѲCɎSɯrUy)\W1ZWt#C|:׬vkWB\L;Oh4_fYloUi}%t͆n2&./BeGER?Sr:>벏lˎtev!eK9[!4-2ĂO%$|.ys$ra"xϿ|)=[tvuP+S3|= (z,@9`Ef,9fCZ U~UJ41eVV E- ɭ#{`JĊyP`uJre9psO_I3fRs4߄oFs$Վf,Q˛Vf!f\Sϲ?k!AĴ/TlX!sl: Yw@mswƣYu?s⾈bZ)w>(H-˿XXEI^lّN+`e!5-e/?"b +!"Vѽk+HkpIYpr#d!U1?˳wfwp,Ah4?Luêُr`(~40%βh#T)V[[e){'{~!{칶<^;r@? qYg$􄚦upSVX383$9wR#wI,[2|Jm9n bG-4Һ =2ɫ hq!!6瀛L 3 3AiLJ2dQ/e>`LOfA#aEB|i-]}+Sߛp_6?M tq_ >,qfh턂BH-W.9ܕ \;s48Z ̏Aտ?Zs"j&:aO:Ԛ>mo4ŵ?%f i?^PR`'0FD76?g") *QHh%y>ؚ v.;2o&]_9@7:(YvmUH-ez"߇A=~qF@. Ķvs.00-tDy \J=;N%F Ulzk Jlv-z,R*pzr6Y;>Pq6)5jaX^BG1R+]ČLr)%E; S"LQGx4Lee|2_Z5h` LX^SkΌ7zUy!0m]ACS01j,[S[rGPUJqΞb' j<ե)ThP qx:pI-];Thhl" lZ !%n,¤F3R{]ז7e۝TBʢ`l=!y& tPZ43 tRQ2"N2PJ;2Qj>5ep |0O@A-j-'v0Ofs٫M2ÐdO$xb[SNe=܋K2dv@qz"v‘v|I v;r:íYIxkQ~VzSXڴp sΈQ,kf목13Ù&f]5@ǴQ"ڍ6-(]d~0= e5 *4ilA[܋.?=̓v^ms*6*L287{qܳ:'}):wZ`YA:‚5m~kh% ƮCéE~]c{2}t@9^lB@G"]:4~}!̗f#|$?:td*lTihDPd{[v=<96a$'hHcya绺6{#A[u0l& |!B5s)0<€ iq\tetv D\͙N$TJm)I~tB]c"<6oMx 7 L`9J׿~m٥{r B2$=W(yAzW Fm&(Y"ܔ ALm.KL%TЫ K$IO#¾5ii \<>^g }f: !>IlA, lgaoG"#Ns6biC(W9J IHDKiI d+1͕ i~}w?|?:@sv#@f]wu.RdzPJP%knA$*sȯ2emO]H(hÐ3m.Z3qrL ˨1RQ; x׵sez hU&/gKZMmY vx)١-bAD<|&n+"o/LTManCRKIlVDdJMW%ŭģhw=& Wx_~}T[("!VF^LϿ Ĵt\ݦjn;H#k#s@%L~™*3H"lm@GE ;mq!g!SK]wd*FMl4"WCbbli7'|HZIi\Yd!<DZIZի?٣G ;vg =ƀV~sEDja-*2kNphj+-.1S]帉r +MQ8\̞ϟҵ^ho0/{ ̇;E*nnV+Wªl2EO+cӟfjj &'&al|ӧOSNc'b1c ŚD97AHĐsԓ+6nׯ \ 먯|}7011cccp![3'OGї^#暖9ȗ?{ RIK,yO6d{<#w70;`wgINxzp9IVc.k֬)nZm7xcs!ou/7< |;{K6PI}VcGF"5FЛ =O=YW<+L@Inɱ:EsGv.ʴ [o}cuk(p:F U׼ z{{M6Zw Lz=,5"H4r }ݐoKJ?z4t h%'AS0o}+84q?| E$Zc?96~̻ޥT0U~gk_sP eثŽ2t@5o>Mg"r& 9?y9 +ǁ ? X+&\K _=t;?}pܹ$/#/@N6g4u}eb ЧTآ,;SRA |_!z>usW,_?3?]*ԯdae4N7˭]~; dz E|kH%y4S.`(x }El.2!FܚkV]`;_QK=~pwytgg1eD.N'tιRcvN +~~V^  :JȪZdD.tTD ֿy, i>K|Rl{*%G\|r0qYݩ Pl>rz5"3![NkF6J#Iv7Q2 >k\d}w!A #/(oFN8 04sw"xb]^qŦyt+<|jOYhuMC7U-UJEtc\8p&dbmAS}X m}ƛd E{?ZjLYwPxDXmx[P>Ekz*yXWn +\HD RwwR;w{YR!}E ۠DžՂ&Qvdi%$e h۵l1H_g]$OYA@K\8ځ mu4js7 _sW*JA s>Pg[*`8]o H\3U/zB#/ Htݶ*؝ R-MJkBZӂ\_nO8I h)V ;*5'L.4e4zihڤIqu%hőfMk{%tY PS6m0."#tmS2.E; \7eCօ֑d!W&3DdcDw+AD ,@%xAl`])Mŏ$[9S}V%-N< t T Gi5'z~_qx:8xKm6 aۛ| d%oC8=!D,:NB 0+e¥3GW: \DA˙4|[ Fhi `}(E$`m 3$ۄ3|5o[}K-с x:' t6=p`Yƛ +Bޏ$]$V;(d|=NF,WtW'@yS7(W/gD~dN@~j\j:N.:hHQ&[_\ E /Z8N烀LV-]o'@N,ېCEЪCpv nS ۏ+^8qOH *%jehpIA6F~u S2oٶ@*V*al& 9u2 (BW֝F C/Iju[52[K:p5 0Z7&9EhA-l`;l] P&p)q $wK$ OrYl\.T)X{l@h#p%hj|J К&Ђ+6։f!A怹D UN `F:b8 ,|%*pTfˋ@`rj*@r dm5 3/|%glllN$^yJ0r^Μ343 X4@$ tsZhH7썩ɩ֣ S Fa)9#8 0tj)Z  q9A(ȉPeC*k|FΏ-A 0228,Ϝ9sI8}u{dA8E{܁W[FGG[; @7{X-hxxx͛nM#'O\8.w8u,\C/A@Q%;3#WZb .TA /K9_'c]w$1tI8.g8wsB^Ȇʒa=N@lDRJpuB0 ^.w8pcbΝ;=|#`wt2+r@E7(cCFbYK8yP'\j"/ThIu<:xoc#=Zݵw pځ@&ߵ +\tFa-uK&z !'J9t*?sYwN` igyf^A駿zڶVR$Y~_n8.'xGԗq?\GYm`P:`Çtm@ }۷YhIu\;7.VDk/|N|-|Ef_c~AгM ,lvѶ"VwޖNi}ʤuZ )ыc |K_L35U&Mṿ߶qA#;8yW:; 3CH9ז(2f/:|9 K{87z*o}Ǚs4 TK/= ׾'fR @%B4[} bٶb]9]vC;rm[C&" (O<ѱ :` 3nl ou*|)ӌ/_Dߔ9&m:;=9*| wgE7tdVm8,3Kow\܅04cBbS}Ϩ .=1׹Ͷk T]'W]us=tҖ?\Z9Nx"<# DjK22Ţ喛]~7^-h;U?}&BVG)ђxLj94~cKsB ђbVi&YGgٷ3֫F֮7e$^. ߸ٮ d,QT,@YޏF _{-ܰclڴea~%ѣGg39'6m-yV8vuuw wضmg }裏p>^W`f,5\pPrŹ|xs @YYM@ B4- l . ^+P@%!1J;z!60Jy6 )iu3G 37f@wvOjhlZ8}#I̋bsK;B xy %>ByojEenH3O*QA-wHO1? (kQhI*D:€I}mcRAxByba1Sʮ:JlPVP\@fAuOIC ;$7 P*1#ڵ$#͢qڗ\7VZ0{HAa@בӀ4#3W6[WZx =bkaMjZkHjj* YG$/S,ЩRpȡ/Yvg^hKF\HPZPVƩƶEyZ^P8×@e=-(w~iAheb`R5f -1y)q^[a!zTр.m (#viG9P:'W۹q}$v,`7KUpӮPjɷI}Q2_ap.;&b8.G[<1ڞciF&$j&T7-CO ZO3bNXЖ/8ôMUXFU$%`fI4$~qƉtzMΊA:p@MΎ'Blj$ƃN }ےZυ5qU-xKSA'  HMK(Da{%*=YbD4$P/=ioyAk H)&@L\Av#mmrϐK~FᴕĦC}I߰&HrŋK (#*p,"?V7 m&\10p" Dj1 s ڝ"溄EehPks"vtHDEw4ab"SBw ˢ B{:L•wØ1.%͎VHX }A !cD-- 'p@c>yQx@1]d8UQ d>kTzS ]-_*3"V8/z]%a)]nj6bV86. k➥]}gP L-cZO85/8~(9Cþ)>#CcBP` 4DROn7lW@\@W_?4B4= (HOOCsb cc0yqFO G瑃0Pby"Ǻ,u]-?W{wP:m3';|3Z%I 8R[Y7{:xU B}q=t4wTd!OAn$eck\&hlb+{W¯{ck*rO?pvJäYE]آ+_XyΚ x;H;bu*ݗi+V._Bܷo1Wk%L}F:eg7,wo儠=̯6Zp/OA"u5;CZo{gD q9_W+}Ck+Ow@p։ ^_~vP 7>w~3wH 9 bDs`S<}$Gxuu"lZr%Me-RQʶ~/ l @`Ͱ~/e0%ePp;މ i ]*cClؑiy 3Ɩj[1W۷`,dxʀ`H<5{?MoA5t6lE8#gS,&vxyp6 k < ZCӳ]e-Xګ"m' Ͽll?>e,5do' rUo1_Dw|)hQЏliX+Z(21xQEGax2K7do"]J}6%{; w1 >^f)5 w TO/!2 )Ձw>kѭ-3}0iBZ,cI1$@Wy-5y-([]"/F6UvJ1A}΍/w67;*jOǎ"|-ˆ`ؾb_V͊aev,v3}gu-swX<-hMߠۙm`"yeYosJl^zU\uU섃mkKsA6՛̄ݼy|s@hLUd{ 4AHEB4 3Z.jW7N :OsVhV. зrTۡEuUz(%W"ثD~~E=P:* s VQ,J}KJ!?@1`mҙիQ/;Ӄuꎃ\am"b QȌWqt7z!hGN {sGF2ݍ#. `-AN-hr!&hgQ/pl>UJhW_s ` IR%c,Y ;B;:/DK[&şTK5#RXr3r~j9A%RʐjG#LvqcȲ; %TݔbQ-6bk fIar NHρwf _=Tі48V/j &IY{`dkN&iD  Q?_ jl:g .F*T-΁A<mH$z-]Qa+H 2b Vm9~@o8-~$x\!9kµZ`CF;R>mJMrkj  m3E" 8:t0Oi!-l&❡>->gI"D#RyY4 hpUu v UkQm ༏r;3UqQZrSoy+:RDq pⓌ& R@@`J]A lu%[N ` *`&+ ;Y_Z @`Ϳ +(XT{:4|bFȬtٶN z@ \gRf=xxRAh G2Ü- wr:(:/,[k@` wRAvfvݏL*[@40 tGT҂_@ @0|c$=jr̴к)."͗XQȁ[DZ[!ԍ<1Xc`‰ C],;+kG5`}}hPb oJB=A /VuV$U @2WH3,&麂o ɮu`]8z7R׊^!;l_  $l\ v+,WbM)?_W2 :Z@)B' *-܌ $ńDW)ou2RN8t^a$/ i_$a+j "* 18pmAZGV|@@WT+Cpoa@On2)z?aB7hªرEP-uBCT~ދS9A֚t9 bR0匇 n@,Vc:;[3 |=@w.9$tSeN @ &da1 ,@lȖ-(sمd:^GBB閴3Ov]Ǡ큉DBk év&]o HTv1khY;^T/֯D R"PXTR)E>7j ŭ]^.`ut0ªZy-Y^QL(1!T!z[B0FUI zw `ɵm\~skN hs0>fkYtHg,f |ǁ5Su :v>v9Sk\d0BY챠  `Msu~qzA =)#SA`@A[( :+r PDkYwMtH NAD[i=`&qJ]SH MzѼc=A@ۑd9RibZ'ZtBc%*0A`7 [9b HJ}MA@k ֹn/PXvח|l}>(Y`}m&][ "Q$vu ؽGH33"Rw6iݒ&0ZХZBRL/cQN^4 򃮃[ͱ@FbhƦ# Nɿ8b EIoJPs9 SN\D~N6ǥF 0ݯk T=9S/hNK+Yމ m}@݇JEټM>yJsm@. =v(Owb@q3'N%ohb}:uj"S,3:U1{\v> T#'^ NsR9{e8N`ijqĉ '&x]CDX)mķ4pyBX 8{p/ Ozо@5?7R\+A`߾2' F'.] yQˆ ڸ(yӮq@SOJ7oX8|R|s=;8AeX1`)PZ£͚zi &NO3O'4*ݳc &ΝL]3눤bpd@)&#ݞζ>2btk AppkKG>˄ O^?=!ѯ<$}@56|x-`/;?N_ Ob.I0*~S0=v6 ^|sĜ}(N&&0ҵ/e9(k+0wNs{_iv);52JC:#ga!|ע3XIab&t8u<4RȌ}5%[GL;>wG=oNDN@ßX8g[ۅ_qX@͚`9g>scA ݝDa~ٓ.A-UZ=9bXhsѶmۆ3 Sc. !yS ~v֖TւPl [3w$S{-g ].~Sϳg}ilڰrUʎh",ny/@5\" ڿd#CfC}9wkކ:`8wv|^0*ႶS,V{޳ztbxbXACgܹIxpvZCKSOJUs>4w+䁗(1_ :-:8ꆄ4(Hꂻּ޸mP uY@>G? e1}+Q~]7 ˮlq9@6wf͑G? S21gH˃a[?] ^p=k`%cϞ/Ԥa2:)*o8pR\:#oS g0õn+^ սk`ɢ05}]P hj(N_ታE]='adL|>,s07_ 6B!Y,{14{&LAsL3'⑃p partdR"TP&Q`\Rغu6lի{an4{&x.\hdQp{ e! $F!O0Byǥ|g]Æ AdxU*Z(HrQ@9vC6Z óՏWYQ4S憈L+0C@s[2.rTd+52RW٪gV#it`"#n b¯5I9-Na:rJ5DV[t-iΝȒҐ!EL8|ҜǦR8UAAe`} yN2Y6-N@ мr!a@D[b_ 1 % Br$6buZpD&$nHYh'c#$׿pm1t i9`*8QV:]S (9vD|To |.I#[7RA(apLNSrU5ֲu^B;P+8z-0pA.V`0ĔvG@Thŧp F,"lVlk3,G؎㡝;HELȶ[XbkԪ.TCH?ddJ9)ݞfQ mCk6*5M8Dbt2ew~JBcFj1(m]ЌhFݼ\߽ AL mc66g .`'@Zv)%Aba[3֮fH.-:*r;CAv#TA"@y `'eR0]j^Pd 3l'@BGLm/b粠ʊC}Y)!6tL&_ (N r __klYM/TH nS bPLJWGadæ"j̞$ /-/2o!LE.o+*uȡpDӄ 8'HFs=?Ab~l(#ծCJQR93GJf_2D7X1ɵmSBAqTxp)R+dȝĢXtze*7j@TuZp0 { y!3" =hfbDkcWͼCVa :~ic"uSSlSߡ{KyA "!X( D#;<)0MXUpD2+Ds+yҍoh«o+;*45x'~I]=5TIPgV|lGf&ܢ{y_ ]K_oɞWӻzg4ݑB:4`z"LL Å#0rf? }FNgNݜt_:bMl6`*3|Xۖ-ÖA؜\?8K{AWeFbx{e T6il$_##asl~IDA޶UW\3}alK/,fz`ђnod(F¹6kLfl4X3{j&ܡq>4AOp\ ͵@If ۜ\[+`']}0 !Ag$[a|3lzӝuD1՗ Tt~= %hZ0P>6@֡Ą Le}ڵW eBH uJ`_fc8MoLoB-TT6޲~~۵5~}(矇O³ζ˂LY`=a`')txra"R:Γ‚;5o꫇EI"&Ɓgiڏ-X w|oK &n׬^=7!~@x*éґ[U+L+`\ o?,K/_{`Ԍ:r`%+ Z)Ob$=g/n$%< {uE'D,[;yF!Ф't+aA3n#Ɓo^jUnu\V#wd}I\70KQ%6Xw`C7rCmW@Ln^u-nZ?'7u:S'}jv/!H_n{G([)wBBp: 7oP_0t]҅27wwz8Qއ-.x] ܗ',^}۠g@E!gTբk%6W\Q2 ͇bL7aɊDA`ʫկ% rYD$&@%K_tSZd&X߽aٖEQY}po3UYbb?j5ynR9Q$s͗, [Lg57X.Gk sÛxsmZ9i |+5?OX7V%CRW0CitvJz0.uQƟ))8^@>_rCЁ;OeX4A On&Zl2ˇjftÏ Eؙ;IRH%~k7͝LȤ781)e.Z"ێۖ.6 NQ@ J1nDͮMFb\kĝAHRD)E#X v#&WQxGY1j(k"jډWIB{Rk XE EŶ:ebjkpbjߔaTkV#T7bl5B=-\}*# J[hRv]C`ISlY8O@@Pk48T)1/u $ũ Y;ФQs@+h dsO.RSW J%7L a?C)MH= wdY 3HF}C^qC:bV|J "NuR&nr^B2/  Xҡ@ 2WZ.iSk NJU!dBH_2TkF*j qHY%Vq Prj_:Iw{V@qDЩ1P,PyI^%눂(RA%%( )Ei٢zPᗋֆWkJ2/+(mYgyP{{'8Z™йdKuڂLFj@at v@Z&,7alJC( &PaAPAQ]qr(j t/}ʐ@N؟p3 R7L' l}[k:rYa g݁n@fz"S {=e g A (MD Kğ;઒E+c#} k!.& @l̹8MA|}Dϧ_ `w0,?Z?pg? K ΗH Az ( #pF`dvJZX:Z|aN/{jնr vv6[~ER8jt u,Sm ZPS`k?ތJvd ' &tScny &'.$1`%?hY[MAC摁8$VN]of(.Cm;a_=yɖ6ќY3&iZfSN P1Ƭ'H Q@`zB>;Ĥ]n7,\ AApAE@,OH?%YxP8>66~lN\<98VNLF͊£ڂ~J1t(ܮ]t؅ $kpߩ2!@kFGE+kr~ \8>Vp|lX לk&n#+vΝ]3<>ܹ}㐸/rt R+c,%B4:#cڈ0!™cOƋ& p~@2I3gO:>Tօ54#wˮ}Xtq@m.+J9 &N&džtF/E+j ON}YOӵi8 9{)8+¬q  j䑽N l';?Ҵ1,Wb*˫#N8uS4c>t&M O=MbMfYaGh|amY) pfz.ާ切FSӵ{8,3Z煚O|1pp:| ֌DW6~ ၃;ާ!Ǜ}5Ĉ={gu޸>?f@U*Wnì:vۿu ιPPBߋXC ~!8 kat+TԱwRg('K/ﵫW{m}}巔^# c>-+\qxç*͛ixB%_XCaQ~p.0}+>O]~.7|=~vG GLv( AUjΌrG~gy,?|n箩 ?Ww6oxs3gI_΄ݰv=UoeC7eS;ʄ|޿PA4O&U<|׭֬o;-h\V ?v;> 8x&TJ67LHm-o\z X}C6xy@<{ݙy'H>%2Qòt@`y}+ Lerظq;=QIAXfXjX9 @O==LQ<cgaq0" ]'`Q۹@,!~bonq2zR40k{`ꂁ`Bf6i=NL18p"o> &&vX%p7sуLM삡`ū`ɦE08 ˺gqkm &AsLą&L.Ù V+/"<ڌsO/"ĶY,86T:,U e e&r7?m@\}rRBqԡ(\ TsԽ:ܷ{ŘQS>>0nNMM}Ao/t Kcy3w`%N%R m#L;XB+ɝ:AS˜ulJ(C/eC,d-x jfړ+L<1ٝ]ŝ } orIWQr"\ş-B V6DwK%w~^MlԆ{.-@uӅ!3vLk%Zq=K1V{02ȕe#WYPՓ ќ|)yiVhVCCCh\&hBBP<ɖF^ 90GQ\/l0Qlx҂h;ညfe9-( W5BscyK[MFr!H3̸ *h6{ꩧ3Qu@OWM:wDA@h~RJ Kzۙ)_xx " gWg+?Ĝn\0pVMbۤ#gUD."(~2ڙ)PіmȑR0"7JΪL [sCc^P s| z/[Hn sK'$0\YC e'gž~1ة?kP5[Hl˖-sŋΜ9ٍyQ,$A*M:s\\DU&# @Cs)()& bv~K*Bm*K1%RW]gbrM3T6MD yY}Ӈϔٝ"O{]FCKCL_|?{sF|4 )]9sφAQhh6H1~w7ҋcP!RfrEK"`}MF߉ȇ!NLl>a%d;!UU sp"V/`SfXmʀS̒S´s~#`R&źIPCd*G83w mxB`ủ&I^v9 رcǹLjlr4>Ǐ;=-&Q*^Ȳx[\,<Q 0R⃐3z;wL+N))5k"dh_@̟|)6Rr@N^a'HX`OŜX]'zO{jE1LWvWw] n{߽S'@GX0`Ny˻vzw&w'Cy42Jw:j A+cS`ҢC!$WLV\Bk%XToϙDAhMƔ(*`@3FN_$ɞLկ~7+ȬbG `Ӆ3ۿjժ~nD$3($w?{W4DgցD(霖LI RE 9YPad3rH;Rt9%7ovIJj`Qadcn n/q}O!{Lx/$`\|c1EeW~Whc^'燬-6ƠА-݉ i CjHν?@k!'|}v79w~麿Ss\^H/^cRR$P1%0[b:Lq!7"% ;e +4cuHJ5v:ԅ[+@Suz#tja6*^F/& rN_A<ky6*Kډ & N6m%<]:njZz`+{yJy&#FU 8nlWC_OyW/vR_leqRHE<9BT A{|dBB@Jfo[40b.?ܵב]u{Ga=C6>h͕9FRB[&pwD[__f1f[PxjئJXo}[\ L2$ ""-Q?2~U?ꥺ y1cXjR$P1(dPbD[ᖁj@&^+(JX3o0@!c%5!PYZ`)Tw=e@c Md04I* 0}vW&K(D`?kxAk(Qblq[/x0IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/256x256/displaycal-vrml-to-x3d-converter.png0000644000076500000000000005172413230230667027546 0ustar devwheel00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<SvIDATx t\.$[$ 򀑍16b`3't\MCtӐ:ZN{o&ukӫv.e7 ]}s=Ƹ^|铓?o;C~racGU=AK&X]جqҠGZ|6Tس3(9W>s+>ALqc.}.0w>)j 0So8~_q#k*Ͳ !ځ#am굻[cs_Ӯ[ǡzg ]>ko믘T?/yһoR &d͘w z;ⳤ ߃BsϥLl栺:gkTaE\\G-1q5b~GXT70twxz(:[#k*^=':{2~O$ݧv={3_/^}! `٠79:֍kNwty[ZO}KvI|g@@>eһoj.YyȮN,]!Zf׮\;M>\׮bs| hb"D_e yihW=ϙGcB}_OjKg]X[ ~1Ycb"") %I b7rxukuDG˪!o<*~~c̝+wPXw|~WL+Yyk}g;s𸳙cּᰍ[Z}>*>(Htd͘7nM]kʣoa9>ꨪtօ-&eIٽ=sDzm#ߴ:ޅ;"YpvG&WF ׍X2qܐj{ WYc^n[%_<@{վ}N-|f>bϾ_(}Y['x znaH&떄n7%)&NJaX*}i{~LRy|- JӐ7k+'59s+I>[G1~un*^;>9vc,₎B]<^=i 5?8_T|~k`cYQoj>s@G f֓/6n\2qjHWt5N^y<ҺX>sp뙗 N?v+gM=[z:_qê3\a|m{w/h=/yI=1w$ ]mXNZh bʶb5ЎN[)8mgPlmv?Zp bYX>ϑaEaOx@VHLnc=BsOֽïĻ82a;w>?Tȝ&KPUɀ5mu[IƉ"mV3R;nSmJ<εǀB0m\L>{k Lw۫;@>'ڐ!U_сkoܲ7湲P~3.tƴF?]钄1;ಱ3]:v6n9G:tyV&Vh"tZ* `xIP{i挦Lp嬎 !m `2v |֣hÐUOyNx=0 _d?ȣЙalg c?.Yu' [Wwth5ĖAm[m,$} eۗO=uxeo;paۇ pygs K(am$_lZ FrNo[o0pKߙd> =HRmY"l,P>Om7w\68҅>[’]g؋=v?P\@{GPen]gPAw[>{Э2l&w^ =.>\ܰ/ ;sk>sxĂwj+JN%8's-!UoנF?VP~(vN(Q.!@{fB'ȓF=3v z&2bNoA/ﻷcR gw9D `t!rUs >"av/vGt_]~3}}W !Gz epy:B@ǧjpEM> &9銭e#p9 9? X_DY\Ҁg]lf@e"J-RhP3޸.Imr;M0+^?eɩ@Gi BT(U2< Y鬅\;X ]F2uIcd}|[d[\P~ 0`Tקp}*fBp,_ ) :{u'ĎDs ᭷ˆn[.&91XM]Cu(Uf<f˳#o9\fTZ}&!$ri  \T Wf`96_3u0\f*`<%H,Jşe_2%L8ip %.-!o##ϡ NMMMӡaX8qw~WZrQ[ `Wm';9{|!}7NQy9*|{*~q6/=rAm H)Z;4s[ 3w؊I]}ܾd(!$8Gy*`&Bn]iB@¿K G#{^ Z>xS(?X*)̓`1b svBl}>'d*g)%!s\ %ه~@=B%3Un  n{jڵpś`T2(ȻVU "4N z,@ضa,W ؝g4~)}X! O% 7C؛ nlœ!¢3>$'/boy,T͢1A/,ҀaW,`^Sj`+G)@ "*º7â IinV>ēeK+v蟮AApgT[*@SK58 TnRB0j#Cނw@Fhh:L7MZ W5C%IqV`XTۆ w qs' BU`y <܆^BgH0Y!HTa>}([X:#$Xu}/,_ _J9H2ʂkM2N+i8_nWc%a,0W$Zzok_M"G A=s$qN^ B1гcm ն#0T6sՙsp>"؅﯀9Pa=pՒۄJBچd"PZF}]i&C'H@бd!8S} $y j77ܚhf39(aF|# =5;њ~И(,QLPJ\l|p魀 5|?O x|xݹpɠ&X8#4xY ~[;B{v@扪/ 6ZKX'0۰B1Hߍ][ZYAO5T$n "42d BU!sõafX8C9YKS8z @Iql][ZN~eu}.1pR|c % Ȇi:V)[{ˀ2 |HL˸T실s ΉUn:X0 @o?2`GP'[/\is9^{LK50% (č1H $\>]!H[h'ܠ b78Qlwq,<{!0\5r-s޷]t#g AQS9@PP|Ⱦ((Y3K D+;_c(ӄ Ê+E* j?.ޜ[ gn3.D`<$@ 0>63{.Q@ap@3_:gs^{d P @0-?jx<ﮄYY eJ= EtzPh(eQpt8:R^ 9U{@u$ SS@8x><5φpM0s4[Z:,nG? O̶ ZMUp@9<pt9f!*g4A* A@ $8SVT Fa>! h/%z^rf:lm[0q3!wB\~+*WZ#ߨ/(Üoha8-xpQ8πA,B0WAxa d^]h=8# YQf؍/B@5#믥_s8 P0f-%A׀a>b6"O@ij?Iܫ_-= {[> K\Q;)+\t.*"m&P] }2p,,^X%!Adh(ha7'ج@9;/ae~c \ P@\GB8$m$4\~r$YIz#!_@!#((1{Jۘ*(MqKH(ZC 9dAMȂ!:HFd=u@BӅE*@m|Btֿt 1icB1 ^![fcFpQXCҳc`X?? Ln3>3TՇ@ S@;|2sCf<Š1B tAjg(;z%,Bf ̽*>>o A Ac"ρ H+6B7' ɸ}"rm2aebCAv0y~A @"BG_pD#qN~s 8Յ6vXM{ u_ʝJ54ghV]f6b4@I1C d2N#ƣkp![@d@a6ĕhɘCA/OҤo~n)a\x9Is A0VS!Zqj(@P @ޓ B# h+ ۡcBցFrBD}DZLm6m^va#O{K2 Z =*4h{0=XN  Pc,,zƀ4 W iw FX' (׀?B>wI.h~-MjaF? Ȫ?F:p&X׍ݛy/fPViDI?p񳮸a8u%/u$jVlځ)e**Ghod51z[#K(y ,x3(L!_A%+7T3oϳ@Zj0y'C2 a҂ h@BFʧ !UE-7` ";(-) 9/tA,Jw}uʫ11PīhnB_O|X~ m EZ0>֩0M).@E d؃8/\c`R4]k2"%<>(wi)PWӎD!d) "VY #\[uu[p#XcxPQ1!Iϵ skE@*'iv\6.dA3/_Z i6%41hќm5B]5T!< K0{AS˰'Juҿ4 u!;5.ЄA`F?0^đsy@ bRd=NGlT;-Lu%~m&' u&DOemA!21'$pMDYz-(#sRUH|'q|2AqA3q3skQ2dV_c߃yDZ!H17;1B1aڳڒeXm͊? /Rn0jH5nslt9:q6~X@싮Ep 2,m*tA>>Z2C{|}lSkgMj /A& ]A\ce(JxӤ@ dEp֓b*Di,?Rl$3rCPJÅ @ŭl b ͘h W{Os!4J-{5F f<dۇOrI֝ o t) %h㹐@fI*sCXZDDhU+ [ 7I5Ӛ`:pJ)*o=`iDPG{Ae;T@M7T+ zopPhoOJ 4ie-XG/8_PkDC}2A HwoƳLG fQ|Z %׼`T$ 8 I*QoRG<BQ'z PYJ \xW}|fұSu} ɻ|Av}Dܪfǐ8K~ T&f!C4cL@Y.9^O!ba ~R*2~i[?~8Bb\ȹ,6yr|f!KX/K,xp `BEE&Y/Y@~= =cDw؃![˃'pZkÌl$n*td&|ƃC#i@ɑC]  o8" |Aك(>,?V (6?-\0z%0xhj't cp8 r6`oq miNHd09`ye WV1Z+@%R+aVuĀ ;?0Q0ХF:qpUT.LF``%D 3lc %,ڏ`jA;% 0fPiW,4_dPK# K v ǟVLue$V_0\!Y~|Z}e4cEPJ,yfQr)fAxZ)|AdUB1/m'!I h:R7iՍ14L+"*`@CÎ2Le-J@EQ$ Hd Eh!,|c =,ȾŪ+V !%幖0ѨZ-B(x(@ܨR%%4҅sf5NFAND/dty҉CkQeRW o9N1a\HKT؀&EnGCЖ^&AT^Hz1/@KbvbOk!_hXĝ `)mPJ@$J`%AmL8bK uQQV_4co25 %uU^<[p-W/J`-|B0*H\'Ze$A$OГ]`kvs V[,̯PI.O\g % Kşu'bQt0@4RB1“< ȸ<(9_Аx鴲^O!f0L 7轵 F&C64P6 H)H48&a=~< A>A~ T= 7qkFժ[t4P!E4WXO7kP4ZLYJs* fAMq9 0y%bQ&@jOXAMH FbˆHOUGs|o*viRj?2G@ݩae2$:MGo \lJD{-a:p*_Q]` 6@m+Z}H)} !Ʒ{4CJ>ix, kN5HsFJ<`Rb}}轭U Ji,>)(=0H@ IwX`WCn8^x:}[U +_Hz%էY6CMSbcA=䛆2 $ C>ێt6TDbexܔP3?ɻ@eگ*pJyI4 +:$ & qdA& 3dM :- +YN~r!4VaL;!@W{l)"KLn"hE4I?lVTj"4 2K a[ӂj2j K-^Eh#7 F@noUFGj61APPjc "QAjŕBS_e@@@L2dT,KxNf`H.M#RG AeTrkcFp< 7NܤU5>Gٕ iS}*?IKlύ(Q0UUdiA2+D e D@ ЃJkDAo5*EÆs>aʮP$QIS+ 2%Fa"LآBW>LmB?{-3M

e3GgL̞MYi<d'_+GL;o߰)&.B b pJ\9t7&=(}I${9 @7f\?c9K¶,-R,(T?R3duAq:|E< 10\9zU\ذT +&t HE. (lӊ'UPb=~SIm%ae0 P2WOvtvt>ھ3/Y4\PeauSj&]3l¬ 6zP@z|u ļW9/}Q  pXuS(:O1_ZpFSRqHeezU;{-Y葼)G Bϕ| ]!]{C5.gC!s ' 뒇}cu"ƏXs ^ V X>$/@ূ`VW:KPJCQ8A='/~}q:ř>!oEPx޳fe3ut׍(Xkݥ88=^d4۽7~d5\1 ~Xk;w:Cw#^o^{-)Bp@eH䶟z՗opjO *FC8 zXUX;LƿBX&iw \aZZdwvRˡWCv)+fd(,AT:*d0Y/a3TЀ`r%PZ@QBZGwH 'D~ XA.I#_v{˛v6 ?$;_@ * |eٷ~f%  `JXK\`#= h-!Q?y#o{v9B)7?"PUPWT?z9Eol`fwU׌XA -a1f4d,/|kжًS !cDRApo(lg~;RzlVtE>odPL"GV~oD|/Y|VKJ0bGН93PY 0TA X0}t(8NT /+q:jXu!~9D_%/+]nQNǦAX伆Ow~'?h̽KFd3.am¯' le#f t[{?gCw.t->b^q(zo\m2gr#/zomL5q vkf ?CXnǛGv~S繕s\E=Ye'U4SO7|ŷj/ ٞ #0nvF^\%Caw A$P=VA8}uXnƟ".ln%L'kguxK>[#K +(0F)H`˻2ONY?hT‚N-sf|wz"d#^d\7!D68H3?{cr~ulj[#}Q* Р#hW3uS0N`ڊ.cc`DI '}& "&`<yCyV'4(O|ëے#}Y(\Q78`ۚ㾚Sj& 8+sJ\B H 6AؕQl#/D"mڏρWR=، &?^SW8{uG#Aes sW/A m?|u!4.Cf3tTP׏ |# CKr#V q#8XADG  @;h+g( pi.DUsQ>.ŏJ@(ӨY <(sѫ?e_%#.{fܴ=y8/Ѻ^ pȐ!8 ݊%D bk p&F$"BB`v_T5y7@'0/hgw`Ӫ\}ͣ&_fzbHF!:`nQ!Z\Dy)T61?l5pZyH_H!jm}i}DQ1&aE9eE9x{9xuf.S9]\I FrD?by@0Oz'-(WC& h# ƪ9~l={|}~XGJ S͜"Hھ_`K3uS7\zw7\`,[m]H :10`80)@#)k>>rYAfh7v\lGZKB?~zPw/3[ߖyW3zjy_.kp ,ᔚBnP|7p| 2 i@ 4Ө-|}? {CFU;;[Co.e𡀛rg`u/\` =4r{M8C Gk ?85M̰CzV hUԱ: Umw;Xh{,PUz, R0e?O9s7ܷd6˺P`8- 9H@#;9nn# ǀss5m_ݾGqEQ~V-w_f 3a%hELl|riȉ3{؊j>'7~wSU2. HWKY88G?؛}9vr5ucm} ?W#UAԱv}aG9myvn~'}Ն97GGN5zP@oÉb>= \N D2}xd{4 M45] >qz+[d9 ^qGr ޙc[]z#}O5e=5uF[<| Njz 0p~P"`KeT\w%ico_C@Oce^@=G(ef'KFM. A&  k:5Vɩqvm~o>*ѿs j@y'*~ qb39EХyO3\ <ߪk55ucB)@t8\/dqk1%}Aoٿ-{{Ƣ' (S_f @ X|$&:Οƒ=9抗3W']vǬoxan Bupb{PO)%e.Deg6}{-s3,H@VNW=} a]3!E`|ci\ywGMzHmE@ e8ځ؃aA[p5J:ؾo5y"ύEo:Y+UU?OrμxSY`|n[q_xguS5v@B0|ovrj0ڶC'Nڶol.84IKB^fE? *=Oc+9rz#3oFOѓ.]x@@ pn IJ;qY4CNںwV7gݞ?t̍lZE@zx=k/V4$1;R9?υmrwGwsYCc/1j ^ޛ:=?M?, r?H=A =7+@\qD+G.sQKM|怤.g <ؙEyϏ!_ohAk{? d{y@"3 XAeWgvzg~&okKBee 8aic)9xR8G@Cc8 y~[HpW؄e #?(&,~*|ޙMW~nVÜ;eՃHsGY̺o/_-9 "|>kT#I)H>pyL DNO@lJ0A']wx8h{c'Y>Xٳz;<|W&v{ּyk??CJ 4 ܑ;@U 9ڲ^9N['FO:?q^^yu@O^C=5Ki%YWC,Hao*=7<++rA?-o?gefC߳ w='Pc9?*`/kpc͍7ިn˥ɑ?GBw\3 B V7TRGx%Cn@(0@S6ϰ(t^@EHP ],>As_p`{QfYv :9+O??9!'TSt*t"t% ] {J@#exU ]J=3+t+ҕt ]JWҕt ]JWҕt ]J׹]^Գ#IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/256x256/displaycal.png0000644000076500000000000016402613230230667023447 0ustar devwheel00000000000000PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<IDATx dU%x}/?@"vɄ~ɐZ74wҴ7B^٫ꃮ@@?={yUdmot9=h=y.s.Z憂B}E(k=>3 #ݷ$9R% RT*2H?~>G'G Շ`c9~M{RE<3x}C~?G~ӿ:L^F`ߣzL֏ {a sy;\/X oH Ug!>"*2{n}.d;3S/8PjwIE@pUj. u_6U_@.M`M'կROQ/J=>Po~6c!@]s<ͫsZ}vtHtT}}Na)gDUd*uƤKZAםyo8'l![υ>?v.  X?7^Ì\0ќaN@Dk%WSmR{ g꿣Cy&5vqaoW?[f9 ȯ788 讖4{ΰ Kbs]F`N ']!X[C'D.˞'e3ְ{Aϑe@Em k(,Z DB! \ۣ~y7jGmM}_#mF CkPoAZǪѨ]Rﰺ=^Jʇ#xPGI S0΁qH5԰LF#svQ\/3" ex= [C!-9Fꃙ`3KujĶ7Վ@.-Pp "q p_x޺,@x  6ϥQ,B$>;`09Xtwg|kc⤘H~3\H1+\ ^Zʚ[[ uSs!ƕߢ۔R=cȄ36nmTaMt=d4DIkI'pjຜpM Ԥ]OwY hCԱ=P k/KȊ杓Ruv`l)Xؿ댿p4$cS:kuƴ}pwIvA3!W `DsC֛mYGcGl>oUuY(O$fZ9c)T.\k3l oYLȍ< OfkWZ18'%{6zؕ{ !֕CݿU=ܨRP@5u n= џfHFDyFi/7I$zIQYb^k=|EU%*csp[oR#_ 0|eo 7_7Y?R~U݇ZS/7eĆ ("e5& 5y$9JW /`dY ׉*BeC"x2ݬMh+#,k VI=GC#͗,QAտ_Yy'CZ0O`!rӛTGEPIܧʆJ|NA)꬀* $?g opP 03NԤL&qo#  #|8yزu \;HQuj'ctBE8"țBۋS_ 4@~aryז=ߧ ;Uz/+ }84ݤhtA5%Q2)c0De]֢b$tCm _U2PA)rʃϢ,9_V!L/À]s1 ` 4ջ֐Ѧ.-*AsƯ>uXa1h.B `8NX 5)`H6p`<Fou&? XQtӈ,\G:M=i6;:_*)U*lZiҀt`3 ,.? `Nb@s[bH E cuْSn uWuo Q?m(Z8?>Iyk˵C!hgPzkq+ g&an֨wO$ <#39'Gkut>)axyaoa#^(p#0B8fR#}OJ당%N? ~2%e}u(kbL˅x 412K1 |ga=w=|Kkƣυ~P9N!SPvA;S)WUQAJ/LVޑE=eUjI&`ĽgM # !u=iyLb+ymN;!oEZa3W F#VB+E0ʚX'NWKN#ʢX.CE)_=PG2z#}GrNhO9A(! `l![:3 '킭k/֑LAɰlP9ҀNt<w8U9Nk0F;8l:#Ԃ;:/|$'ѽvg] ؘƃwUoK*{mN;hDqva?;vsW?/ƦQFxB%*SIŔ yh!jcWż2~k7>JzTt_Z6B_.ҍjSp(/ƤDTPP`ytApN҈HNW@p;3;(ݱ:bT  lE0 4S& ,АT6UiG :^A/`K;F}P2Ov7}]66/N̖O#Lڏ t~~o"!ּz=NrhьyUo #XI`` \ d}*T %cJS| AY(m2W?OG7̻Ik.,4',m')N P9-osgJeIA$gԌX,$lskom1 ۔?2_V'?K>'dZ$WdSCM_ISpEw6)Dy?;ˠ.=l!o' 8xgeLb NEsCȼ=Oo4s̢*ҏo TWƷRi zCs3%Q4qR1ѣ=]T#@ј$aUXGhdi3g#wdS+ﻶߦ`ݤeCQ,g~S_OT,{yjC颾8GwiLiuA{t.x(LXk=J S9'Q8ES -W " 4 ~ׂU^^*~B/P]gPe3VC#6U~q ,5,q,  /M>8C8_D ~v8n?L x+lWEo$vU-ƘđNMʭ t{O@uV[u b_g6>\؝*\?]27m[wL{՞E Y9Ea%/a4/f?V'{N8ǚ22r7:_Oۂ6Lp[|P9GUMU]|uGUI2pS~@GJn E ъB7f/0}眈Gt1L"s;P"%h)sv5;7ua_t5Q^?~8tJ>n}R@=f# A9Zjrr~M{NZߢ6h6bDS˱79-)O`!̘ %kQ_SmMQcsD:cw/*,LA;^`r*bL &#ZO+G% [P^  kgvnπ w?l`?jVx%wĢ݇K(OqK0*̼]"Mt5yg[´rDTU;TğS4Tג4RRf@ 8I9=f>h@R!LDTh(Х]nguւM^b& ("!v_kHX(F`gE5ʏ ]Q``ڃoN^u2M@=Y [yf؂gǯ6Bwȿ 5ޕ!X̗`˵Bsr% (NCj߀aah"s 2@?1òOC)nt_V9mXxR=# }1⒊'dMTaDdv|92sb$cD\ A $vZDzg^rU3c3l<< k 03ӟF i'@PvTǡPl@u$Ж:-mיf*J Տq9~k{7AƆL)Q'pt; nf",=>2~[Qt[JtR2; XW*ݟW?WOXH9Yp%(}}5¤ 7ėCΣ=)?` g&BYOls)c/ }?z-{ynʶ07+'dt@rPz:𷃵 VWg]& i*s(a[U?0M ~s ,cs6JFS9 V:zYH/"4*2SF#^ 09:tUEoZX׆B!gOU{*\}mҋe+uɟ7bsp>vLѥ_jg_.&JZgs'0?bǧ߿F^X&ԆOaVC?8 ]&u`$9rN*MuY{{S[KdVg"jOxNA,*F]GP }(ba6x0t l )Bjt_ֱ^k9?<,gX:?6,r}|&=~ ^; 2b(0,3b%RpT@i>"6]#'n&Dz';g`6 4n~+6 *ګ%!S}s'(_A9ˮj8&?uWeWVt I@dtQDu.02M5#Cc&N@ztS֭=˱ns}ؗ{00u~ĥhl{ȇݐ!S10IYkcGM7R^fěd9/򢩆DBF'ꉬA駠Pyane~| P2lƏyvSt <[5koS.P(WPV& _] ]ઃL6:hjh1r9\\3G\H^EܘP9fa4WJOeKTrw]_Gj:̠F>^wT:rxw uQ4J0Xz 13@l) 9tL1ώ `0CNVMi 5ߣIwJK{2'7lR-KP?n㻇{=[ `KX]|fN0*(ˠ H==?BA`͕H3bGu L>Uw{_JyN0웁;OG]7џ|;N6qhh<X [y'c  %`'Š!Xh*vv>3@3"Oȕ4>{捲 o[̩wU3u3l1`|ha= CРnQUE+W u&@@ Lm<>˹H`bL 劎/EB>>vM僜j/! 96FָJ[0)coo 2:}"r*d(0v cey@PLtP #- %1BP`aKܳ Yo OusASg {档_ZN@:ӈx'6DvC_-Lno c(lv bM$M`o5ɧ0_zl<8Nxf0bvC4QK(cfڟFƍ#ώ x o: t&Php?\v[SK}F jf+g,:Vhۚdq g Nˡ `Sgv7Z.DQ-7}Vj"Dutֳ6LtスVq*|f"9-@p>V<#2Bq#7|wlaֳF'b@Iaah֔۔ԤHb=@w!'_ڿS$<1S˵W#ԌLSNr`^Fw[~jï=iɴ˂J}ӆp.Q^ff&7>Le/B8 FIUxw;գ˃ {ַ$n[HC(Ҭ/kbI=uvZ }XR)513|dDPcA_Uct?'$EBC"#VbBTh)jwf ddiQ %lI l߭w+,?d[)I"Stڥܷ qU1x Pgz-تX3?a E&ܤ3bO M_; I"zr`/Lp3BmnS >VNe2ݹ:{ KE*H\Pc|X l6H"QMt (ﰜT:"Ęs͎lWJ@&@ ZH-#:ܐA9au<X=t'{ #d/EcH9{h g;kjЯBi ͭk+Qǥtž!UQ#e%|AE,7c ڔ^o;f"A,-wQ @1ЦcA Y|E [9 ..-ϥ|PO=[t\_1`đZJ4DjӥW%Ƚd{HE$Q*nd*!U |Xɖ2Vp\vde܌y`0JRsCF2gHDߛWFHG N g{!8(bm-Yz ïBggX3T.jeXrs:Zl"!aeQThŭAN#0wj~ /F2y::­8LK|* nԞkxmlbцdg A7ȘQ" Q H# őR}sH6pbρTJqA&B*tM4. ec*a }@;^v3ÍZv1DN$ ̵Vi}S R@?W=_5'ƶ*|>ޞ}a09V1$[ WѣVc e. [oc`RSS1Xeݮv?;im 5( o z7eW,!*({'vͷ;.+ <)eDlɪgp&!o1kB@Y1B:(臵#uf$xAgN@ݞY@8Z3Co?鿮+|K;v3_mKwr~8͢w,0Z`"-3:Si. @xrH26r72@SFR+LXvov۟ tJ=O}ܘf#=67_5BmIX<"Wڌ r%`\Se2)r#Oi6S5x9>9"g) 倽{r(J=0k gB`pCظ!XEKdL 燳ߊ%~Is6w#,,<*ч]r)4`dD N՜+*z9zs |wBGkFlFKw1Ȍaa!,HKLD%bvcQl e9SpQXreѠ3cV`=<-atK\cnNiܷ4âk~jߓ#C>ҫ|}~nemlXن 8憳ߤW Qz',aN뼡G_$h^X+ vq F0ш=৊^QЛ:kf_,A<3(VS'/l"^'hGYH0%!# m:*R p e[mNR -4灼#!kQkQ`[QfAL5R &0 ݑ=׆d@w } Zk,)0,xؖ0XEN~fa0n{yAgSཷBE{l X̵)DԌM8'P?.Ǻ-(ap(Sz;_W `.N(,d4^G!z1ɺsT$f.DD7@HbS:z j^(зEup(h+ `u 2 pBYZޓI񍁣k:+%=g܀dױ{)UŃy^8 y1l ܋T݋߄,. M]ߐ|OIu:~X P[ci؅V%?Ԉ@{fdˉIMmFd#7.!x/0V{01uص){Y~aKJH|a71l0%'WEM)omÁ5낔ߗ[hffD$l0~iA`A wzoOZۏ ,^sXoO|anyeG<x὜}u<7b ?zD !–WsaA8~^M6jXm\:9m *_YwDf;b*Zb3fsu(dO86?Ğ3:ɽ l*AQR 6[ E{lAJq0蹸 i5{l ۙ u'5~}9Su_P++zeiNzd[h Zm\s=.zn,B&I>8љnm3~`5?Kұ-6x^,w,^O!Ex5ɧWBDOe%5گ<*e^ wdiSN{|e}c3 wH) /V QG6V)ҩXޛO Σ)XSF)I@?) `sw ڱbe[ׄt?H| _H"oDiiFu;gg-@GJj'[k'G;ƜԲ`-d=xs W֢~ `/d?j{[~W`y#?ړX%a۰i|C15ZsHkQ3JIЊG@w1O뼴.%ĘcGvSRV|cLKhxe hK㬱jOr> ϓ @ k5oA~g>95ߗ @kׯ݇;ixM\ܫ_b\Q%>HUomuX7 <*/ho{'K!mlH>/, 6<% ( `Gȫ s/sB&q%Cgm#(z\~y=9%\h*yl7~FKV`ۓ/&{4.° gHA vNꮀ oAf< C[?L?&'#"Ծ49ۍ@UM|[9> ^qjS&}"X9hs$]%@'Ʃ {&K?o4|6S)0uYv)pJDޕ'.?:U-@MϷKwvR L?>dsqo '^+FH|SfT0=Wh_ɲ;+FuakTs1;y 95_F.uӣn.)*PC럖 \wi2 =&_C"!2gX8דǎpX᥉E'> 7Ha׻`dOfuQ[߂:(/ZѤ ']<*L' *c:hW!OZM2pLc|!.Ӈ |x)Y̙mڡgo ߀eo ֟M3 '=)5~Q<Sp{~g03$ ֭~v_=xb~b,?sόQ wK6:d5Vk'=ZeG#hKyx~ y'<dN!N Dy&5Ti5O@uu_:בߖ\ L_xX!2ԮYmFNALӷ Ͳ t!&@krҐT_{ud4b l) V}.́uN~=6`>5;i {?b x[`?nکE1~zn~-E}vn _,<7O\ REH M?iPUeZ)NLe|tOWa/pl"1PGhLE]+Y,)ĬNÕ։Ig1\E"EFl^I2`\! 'HD߼\?.pQhᅔpp=LeZQ00]| J>}럌|.2*tJ#,"PPߟ=|F 6$Vwt[֬/qE>y1Y,=Hk !U]P`I* gjW7KW䆓pH~L$޷-2ZQE+B;Z ,m 0[ dD[AOM0Dtk} >D2]ѱz^yx}$*~cj *^}g<h%?vFsaUM"$C^?f Z$pfxXW< I֬k', ^Bj ehtE."5W7P[.W0\6[]pC~IG)(tMTU0NkvW-!w{@$H@ ms8 !SE./8]4b]mw '=׮G}׷ *J1^4y%* *WVŧb>YcMi2pax(i w ~f:$G}jxÿ3Vp Ƕ狴"> )~m~ݪ4_'؊.'LfsG5lDybE&A;Hd@K~Dž: ,~ Xھ?z֒Bi3Q߂kGt6bV/®NȬY5EhWNxjn2Šzi@ m07(O#9Izɨ9XA5&G~f'>vv0%^/hW2Ο| m)^Ñ{alG`2r͗,<75[j;uHg֝C94{fèoBЈd6/܌&aCO^6UC9F^>{[|M:[8M:܌d`f}duȥqF{#< c(w,qJE۝JSCSnFSػ-W}nOhghE>'cG"JPQ-M%<ʹgW1!5>>1W?֙m{R'^q 4ہ1t4Kԩ?#߀7o95~O Z@XUH=RQAljɧﺭU((% N9z|pg`zqEqx)* ҕ\g=E>t2}|by)\(CO}\4OPcQ..زUnk}e}KZs!^q̢L?eaz͝$ʖ7~lvV48zL+p(F=cĂ/E@ccƛyf%C&@:c4-)|GP.ulc]w`UO4ڛdYEVsgNY=fa,/I< k6h>h7 uE2nAu0[Z}7%vXW܎ďs٧y|(gthq৽(0~^SrXa *,%HAMEmHaJ?<81[Rc7ck| $vAkFey_n`jF}$47\.wHlOĩRػw>C_wի& Vp~ zD{u{JvI)/ݕct;`YG,i`K5$#RiIOer+g j/*PcSNBdL?zUXT9ٗ"ƙ<ןVi$67ls'NNp}F@)ҁjLxYON2{e1!2ؖܛ0Ey?{#ʐ+-.y  Aeˉ_WQToc0[|!rqPw_iuJ39ǟT>(u _w27=ɨ1hs,K߉begyGx9`pEE[ z"E<' ;"Fk  m o!˵Ncf&ppT^S:=ƺg຃O+'_G$}9?DaҿޱWC_~x0jT^-+gy|v (ޯ_{zhǧ3z?cT]p7떟Z2q+i&Dq B.=]~F}FGw.'>/ҍ@ܯ欔*SJ4M=>XV Rr[e!$D&=| azQT'S YL*,pzP UwNV03.H^Ȕ(ú:ZEw`@4Ň$ YC%"N[#W1Q%bl$iBUAzFc#oy%#.}#kO?l[?;TuWAa}DܴWX6ѣHa'9(i=IJ FnC+n ڐ-hA}`OOaHڒ''Ą><5v$l)D  F/ VF%xJD22k6X[0'@ejH&-'y ~HMяEgG %f&Bݩ ē๓HLK3 prjXn0嗬R+{&|I;L..B {Ж&*jrU>;!U*T}d.B2N733gRFχR 6r_}SSGcGzLQ9 ƢK`"Asb3 v܇е!v}mŠBBnSgp~8 b'ext'2 ?҉0gUC8u [|O5*)e;\{pi)֨R'V)>0\4dEx1Xg5Cp iq,fg@JmV2.qu{Y-/Tfsfa㏓ ^ Cg|¬3)YN9!l_]Q&a|O >WA-̂G)w³97\ :pû҆J$m 6/(,;6ۼ=Ɨs o UxSg~Me_y+FU\͇a=u7CtO@b5pm?7#¾Ԇ "ULI?qgSfTB䢋_5 hJ^PrFͪsc:'>[bfq [5 -S,ͽnP䖡2~=ĈBIN&bۄ!Y#NW#:;&:OoLUbH4K@_fkuink ʼF 'PCm6{+6#\'¬vKgikزtz3h%p? xm #`ӂ 6$,~$Տԥ( ,-~7;7;. uOvyVPt_CWXv]-p_Ci` ؎6QOhMf?7 0'Cxu8f|aS|' ߗfm*{-' KO>|B#N?"#8┕o&40uz/2qr+ ~O૛e̸zv[_}5LD6Ԏ`Rl?4ޏb&A>p!31f@ACcDzMO瞵'9 qbXQ]y nŴ ~[r V2NA 9 O.®N=>}S.l#&ldP"AckgvǺ4 F8S}h7L|2F!& kEd(AWE_odT`EdQ7iO8l&VO^ %e\"SQ{ʁLPcz1s&^T L$m##0^/4h yp~ 3uYMfbÑ 9]Ϋfh,\wU8&^bkTp _x^Ͽ~zwmFDH~#riEvm6~WҬXqpKQB,յq f%slxU76e':j]l.AE6hPiM#P})@磩$7fKqTbFMň [oa1\ 'jqNV2jeܑa,a E"=mX;d^ $]*Xu?%6E7uGU$: yY;f vLħƅoQAgW턪7t(=1U=UY9UaYn\u-.LOTn7"2g3ɽYpa3QHsƓ֜V4`i=qRp.Mͥ!uKSlKɘE9tZn2 2Q03Q69љu-Z{Ү"ᯝA7*oQ7vE2?O%vx6ue6]v@|Wu3%w6Z}RMr{.FwRt>~0v&D,&>\VwSew9?mdK9&QO(D56z󕘨PW&F`Fp-mn2OX"K_{ Q47V'jطuVb>sK=fz߮vzC(e82pyPH0cpף[uY%a<ٗnMZ`e5 &G J3_ngPYnSz2O3oV1=/m~j̦j g Tқt;/LgN'Zw,cDȿ}!, ѧ^Yg \ >ԋF9Gb ƨiG H=JvaBjZ k1dQ߱>lY]a{/zp;`@e0kӁqj9f> =p|ykÏFFS=Tێ`%CO'#%Sh'\>voXPԛK8<_yFA9H@;W= N= oD"=,62߫LmER2`*?*xTKE~$(_79{dc4Pđ! t0t4Fu>Zd]ʋ^)WTeŶm]l%ݾM>VCzEYۛa;hF3՟{]< dg7#ZS y7 waL-dD&3)xv#˜1Ɗ DoQK a&(Ax[_[K>fGXԕGk;޽ (4QllN?S<9󹓲) $ջYPP,O)|&> }7F {ȒcϧTJ:*j ,d@_Dltt!0G!wsOxw߽#(k1-Up+䗣D%:t'/^~g-uWɥd@HO^[mp! (]@&P.ChtD}.ǭ4Y!k~;yU5EkQBᑐSFRsDS$PZRd$4KFzqX31! (_F: 6+SwPk? SنBdO3s_['5fli+9ow*ۻږՇIb7rG˜y~ƞ8]|˪K{D --X (s˻ާRIAWAȜgMsasm4uކĤdN!4qsI&3H)Yd!+÷]t@FTظ^GXB,ù~򝇊 FW=6.Gl>~- يWGICan8t|m5$ elU Wlaܘ'N@gsF?^ֆ]3hGn}j,'w{zJ)I:{FmE`ϥd`bPN$Sy#Np&heaH:HIBd^qOw+#|D}3? ǰ05ߊ&%xq|~inuW `%܋ؓvcp3꽵g&#GUqn噄ju'.dX|XP.iG׮ ٵLTO:Ai0yvzʀ5'>(E)tkqĕfl! }瑢{y& wUkA0)yD]Ֆ9LǝQ$S=g2s,IZUj‹(dF]+Nog*xD6I:6m^T/gKOKOl?$@aMYcp-U6CW 8CCh~Zb#) RlwY .K-o9zqS:-pxRXqjHl%pjȼbIWKGCY<.סԱpaBrJ+Ǫ̃̄YƱ_aGgllcAC>0P0)>4v pՁ1sUp |מ{]; و:6-`jN(۽楂+.X ?ʉem:_I[['k~B) 3Xŗ N~cuf}[ -uMk-^k)xecU+ʞhju~ #E9M8Gg@9Ɉs"-,D(8O|$ ;/U7Y0$z.8 rF҅",aMPp1Lx a*xT`OK=`R\M7bUC_z(%"|%~]8 se˶D r $Ȫnif;5 xuT&1 R(&Ė:MC!Fe%)%HrC>K,s2<XG)K0:A+ӎRzb?c񎸝8;gOHK#S4k޴C2/y: 6¹ M$'L;6۾m .fܾW/ 3:Щ  =`@yd %/̹U%5L z-%@'ݩuyJ +6S޾)ȔJxʈ>7ft+dihpDu tG#c'6&.K?j d{Jb_//S~;}8en\q0!9 ;7_LÙw6Hn1|7jZbLoܔmYI~V(Fue珂gxOz>6''nbu/ÊyO\2Wi/_KZXs((7Ɗ8QsS4O37c?b>s:̑f$!@#g5^!Ym*aܼc"Vt4d_?q| >LldU2 <ۆyt߲cD$+_.akalj:nϲ/ J/C*, ,2cɸEl\/yZPju a9R}߰ :Hwat*ϠHRA ^$Ec8Jxs!LsbDL2 !cbh`4 F+qO0r>e,ZY_^aqMk<ЇUk6wiz\sm2 O/AF._|bt_z*Q)t\.#6eVd:~|''[!u{oh0C#zcDea0׽G>ᵔkw6plJUfR`&}ЌJ ]dܛG8]A ﱑCsOan;JJ<׉IJ,=; a(ej$WZOiOA?~ːM?w #-IozVe͖I _=U> T +0\h'ɐEYSفs>28M2gbϳү8v;#{ek*;>%殺馆)HCZ/&;L9Lۆ\ dJ9E= 3޴E)`_Z/\g2ΧfNbO<0@=7(˯ڇ{0;'@h/£ϵ'Xm3)pֶm 3WÌcR)g0GPU,p խ'?2&MYGPT_ک . 9*;{ln>F@n GJA:Of9hMOQ[ȁ"  {2 6ڒmak[ֆ*e}&A-Mk*&A!i++My'Mt!;BKݳzV/ GE _>q^8 Ag0 g #s$]>C4R?fAc":tGYn 7''W!\{:SN~/u l!ݧi hyR9"âKډ)rξNI! Ҥ9Y6I &e}@Chz OxGȱ8q~A;EfLD_R·[plkj<-*W$6׭!8*:ծW ^|_Y b4yv4g -bOJb)~@ L J $0*OZ6boQ~B .fݷ1QA& sEܛ@ے^a{9oVk2vPDYY˙𔐕؆;Vlxd1 eh&-7au}{{OӷB9913)䙛/NsUQGZ4ޭ(0_k7zjo&&(`ܚbPrn Lf{onpxWxF?&;)959,9sptH"DGf%K߻s߁lhQs;"2/bְtϋZ; %A8TF4h*|fK7NuOH)HJI'.B~k Gp"(;Ȼd-Q S;Ph"*Y@Bip_vH( <}lcO4_g Vce>mn9 Fj69qkhRqS*ʉOMl.w<6ibt\}b,0fά'f#j_Akӊçpu9_ņG9VgS[T} 5C3j}[u7lh&C4K=0cSDժTJjo6xg:z/%NB+`RMYgΏvWi E X͝77 'G&q^58йkua Zװq]ݷ@X unԮwa3=yvg܆ǐb=KDMىZ}s "Ƚ ОJ?Wt(Pi/GINۅ/Nrj0)d"WftHI`Ϯ8w2A_f0y*ØR~#uk˯<rl aoߡ^Om=07_B?2F k%= ǎO#"]yz:Ϳy~3k8f J0>p=G}D6BNQ]df d,^UԯƢ,P׼?cGRh~ScpER}s"z!:p̠ or=E1pS@?d`l&!y.rjfه9qǓŰ֝bAr82k# '_ Љ{pzW=.}|0Io_!Ȑ{ۧk\_pFN)K~!꼐LQf \ +1 cf0;UCk,M .=_j8#Hɮp1>,WFN;sKW݆K9:h[n1T5F,~C0h^'‘L $;kHչR`R}V]%Dwvnrk{%X &R{5I${L7 _Pu$yor|T"{N"7 іY͆͟T@J, KA,jhLwֶ??in׎UG^Q.Y`Č_|O\=b67':—(8}JrO"L`˦7oA9AgQxYo{@ pcK- =_VWWeo,Us7`wA5zܰrO{G腾cP1NȄzh_sO!E%d%!~&qEe0wbA@54t^p։ @[dTx UR$K>@oeM_Ȫ.{EJud$cq`1Zw `\F|* r~pW߼n d791 ȃh P߄Fȴp怬էmn{ ة_K~=1ݯ`Rي.9\1XWZhr l|&VI\=o+%Ns/\ɝyLՒy6[0teC}} 5e)E"xX*h2|&MaIED5$+&X{{osKJqf}3}l$~f:sQ  N70!H PJ]}% fE *S!+)1}g' Xy*֊Uq+ #x #-j>N.;6'F0)=ȧۮTX^2OuO jae'pͦ^z! DANÂ!KQxxG.ASDiA:CD Ka*=v?{)g~UzddskԞؠ (3 G) /6hcj'jzpBށ|{zn]i M FPAѵˏt)wg+jY:-gDp `i7"~-r *7G(;'^`4l\-O Mo_ W/Z Yu8C/M*:Ͽ)rۈ1s)p s(Y(;W`RJRֶY'ڣ嗗F|iWxK˭Ű 8 3#*=rlng`o 6`(tƧB3lPhWK =,؄;LN^ƎB\宙q;+bp.k ?Ч3pǸUe"=T1x!XC wj!(8eZ0j—^sDv#u3u8l?Fkg %2\cpWpۻG χƐ$Z=R8r(ؐ*FV-!/ T9N`!0 N),!<H1*սp_Z4ah>pIvr=}B0Cv, .G<;˩i37b9cOXx(JPS75w=]ÍkK""͉~ hY**qIe_-viSS0ԝ|J*/AS8}O`ד\OF!N&_ĤPWӥLDaY@l bYTSM%)=?Yr`Nac0#7W#Eދu?8CpW"d"+(0`3;1嗬+LvTVALyE  ͈_gY#冘.w+rg EZpMD֓C$GC #H&NS^!יƟ꒸߰u &?k`OG#`:#x [KNkVJ52)\~ܶ~m"5.STm<'P:``||dbᥕ '=qB=;HWȡZv>ZDZX<)0g5n2 07Bɗ*ڢN;Tc.($}x[QP1ǯё$i=[ 4;5ȃalۏtר >l!Ӣkxܺ<O/Xz(~~rSiDbN|7Ck3\h6r$ S@ʐw #a]+0^ɺٸU;G l0}:͉k㦣5"{ٳ̫Oh0H>8wcc.> {:0޷1x /̶1| "1O&Ɖ?ޠYF@lѮge[!>T+^x^312!Akݷ=~?,9ݲ8 4xI1gWǀtC 3 ]`e+Yv<+ 7Xa 9^^g)[1=U55F^jj遣`lP^lQn\0j>4u@b׭pl+p5vR4Wk(؎sssZNsd6 8q`IAWQFf@4vHw_{t2,X j"{}+SQբ+2^-A~EOYn#L)bG EQ^wB3K ͯ[sߠ*|}?6Rl~!lV5w`|8?i=YY8Sz;޲tD7 j~^=܁gۇ18Pq(8XV@JRM. (1 [{0|{C:OT}Q CW&6m`BFſ|\ʽ`S("N#AF 4_T-"7ܬϬ}n0A TxE뱐,; ֟il`lԪCN V6'dWma(6%8}_3 #X8>ӫ1 eyXp0snhgLJۄ Iq/V3yv"̪,. lUi{<IJJ}X5S۽Rr9,(<(|oi fhf PPki`_%'ށ_PB>UN-+ XTt`ck zye09-9D=l{q&;\#fdS~=:}}Wm…u#vmk GL|#{ "45\&UwKxV!y(bCȠ")(r,k{8TW/ԣ:^~vMwOu;@Z0OR >uiRy~M'[P؇PO+7&!*F^kvί@*jwoW ?4e5-uuCڅAS0ۥR؛:" ÷_L)8)tH#o'v1!=WtyLC[2#H(Ȕf-rL>5VPz\KXa.2N݊gT n+ DG|ÌT*a 8v eG?mJx˳1,#4Mwl?]c{r}d0< 8mq.}xlgTI!4M/]܆7Z6-[=Qswv]hHBo(ˋMAo1FDrG5?A?CE 8,óc2^=vBkp ;HT^ު3N~/$MPsb8uPzGh$f&8n!,=O'0V5**dPw3]9NVJpZQ>\1{'`*vH=(c{=kׅ.9ov=1Vu@I֚F$L?;?y)ätQORXN>^hAFM% duUuŌr]kUk[U'eej|j>$K3>庍#LG隚֣UfkS8xu uXLP=3 JQMa%M&YԳ q awv{2h` h'N.5X3(P~ HpW >z0kڍB<-Q7$Eeκa -)ݐJ : h)"s3LlAiT)'* ģ{S.LLGm4@ U"E5G;^SfԆ\I*sK&` +!=߷PA8R{.xM1[6_>lnѭp`5V-ȋwfpv wlNx ,YG0N" Lk E(@|ú a{ |{;Kڍ"'H, TLYVb.3(TTrOEއ &ŎuQ|u h)n s2d~,d!3X`ebsp6'f}p>[/ŬxP'P-[y_+N]?*n9W1855A\` c3Zfc#k+llu2ļ;67&.Vp5fYMo@%)aܾCpS{Y&̽f;ķX2҂ `Hc1f !;5!TO;m}pI ŵ2+15Ш=>uI 넻n* A$Q/d7pI sDؓ:z-rJӱG$y535ӜL7 8v{=J >EEEÝ.'K=ȎhǏ-@cz:2d5N aNGEqʺs5l豈V9K;Z, ʥb Pwj0-!Ca 7Tguبgتb#ƗZ9@ہD ܣ=#SnV"HXtQV҈p9cxFٺYW@X6'#;޲u0$$Oônxlq涽OZ^(B6 K:聧9\|_MW<!LR.i' ֽ;*ɿ =*l,f q_J '!~T)6_19>:,$:woXНp宁2>87iTUDumfG/,t$&øqj;6A.M7n!k]W{T}ܪBllk ½ vR4h#O:`P+# ;Sm0}j'R{]򳻇&t3#Ls.rʘ;qv߰_J#}J HPII:t Y{٭@de>b䀾W)rb@MU0*1@Xڏ%$f) 0,0LG%8c`EnvWC=-6leL!{&4*g QhƶMost~3T,(עpv%G3فN/gr1BI@BJ9i\i8 k&La3%W(vfZA:3 UQzpvZE^RH m i5Vѿl2F}IQrB׳L^Fn"G1p* B6N.a:Dum`ǦwWp W-xWAN`No3jH@~:IF vj:`F<cy+@9P",6#}B XvȣUwTA+0j+`YƠȳaAKh&V @w}HF`պMԔø=^\};(`d˄cWքZlwNNa{mEWd[76_mW_gTML+gbyO m5$f؝"]QrjpMv@֮OQӀHR9ES  <x(= .Kj^JG^NoG#h?M b: {5m(!9:ϥ4ϭ%[iE\=~rg> pnoT(*ڶу a Y2pں8T娲o`H5+af -ϑ}z~UC-D Qxu Ypk9Sr C 2>;&DP!ÃqoChuj*D"R%dY1vmj6B3pX7w/#NIqa`9A P&̧Plh g A Ysj 7ȟe1"fM?i0%kS8>X}=Im6{s#J|JkI|(AqN++-.@X'Pܾ9ɋzP| iaFc3!XPZd6ĤEI h_N/C)t _R@ }?A?AņPm<6 CIXq>mH̱=1=E~! oTHrP9ƿ+f` è^ʘv`l$d̦{70 F|A1J:bPfʡRD r4[t}}U3T:2-ePb{ fQ: C͏I /3!,YVadGlI{׮.d/NocRm{@Q{ju >}`$Y;P=Qg.k^kncm﷼x[} Ss)9LBN=Q~O[wE$dECCв+,@N4^/fn> OZ0rFȞKft!4SoCk3!LR\O9|0`7slOݯ\ojѴ3ɹ̎!X`˃+CٴM}N2iʅ u)lcI;Ϥ¡&mcB9X0Nԍ̐G!dxmr#3ru_Nr}E"1^#ڊ\1T:GL|]][S(_T/ֳŒ jE23[5QE6+k]D2yt7xN2A!2krB{Nr0˸pMv:5q77;YByr@DÉCuމ q 2+QptQL!E%I\;gOYv(e,3?jTpa6 H&eQ6.ayԔ$DјQ#e)%_{]f&Lh.:qdz:k-BkKZހf`) dF%b k Gֻ9avٮˬ^5(,98z C20}告Q|c:ܷF|}Ԋx~3 a6Zo#5xGl@+Gi86f%smŝilgvx22@E MC@Oj[ȺκŜƐSsY0 4f>LŔ4\-5ECQ~O=tVnV0rDžo=G ~LH2xp_*P&!,{\Ъh+ղxͩDV36qT): BF94Q]8;wF3L?2ᛝQr뙑MB Ѣ\(zQ!#ʒ+Hr#ЋyxΓڀ̓_?Ք"="o_OF3/)/^dhſf߻nNw@v(\Y|噿H9XrX'n__xu+cy[YΞ ,ve`es5&s>eQvl|R#@͘f,⛘s uodg.959- i}U@[Z Sr}6` < ^SQvKP!\AqR qO=kzvU}g~k^@@3 -:vو36=d#<4TDW^~tr {6mVpfkǻļ $Y`EHuI04&/qT0M.0[)a|l`SXVϿ[ #0f>Nܨ+'ehsAWr>iJB:yp<*h(4)u"P 8xݾ@73AןO/"gT/d9Kb嫏/ 4HVG7*uO Xyj^38)DsʀЪ ѿ!^L^ZA4$k1+79JzdjaݤmZIo~~ӓ#ΰmӂdQa4zp&͸ԉ/aM S5j둑U=G@L~);\=;I6@]Mzg_+2:ܶȘCwca5?̛hM2Ήݦպ5ESkloOra!F^߭N$9iԑ}QbR:0j`ׁK;)ԔX'AN}x$h(7|a!?z"76R4薣ψٸ)ʧ/G{6hґ_0!K_>m}!k^s  .ܗ\گrD5Xo@&'la$kW%Ķ~l_Cq_Mj~RF}2jQ KHfj:AJv7fT~1-kERV86G6B }z7MM~ )h'/fx:cf)rrpda9-͔yf2AuqÖ0=IPnZڦQ^]d"?/mu?ER7!hJKldQP< -~^47Lݧ޾~Hl^X?ڈviˎȜ|TtC~}Y.;;Sua e$/{og/ 'p%8F j~TΫ@5 %7QۗNCX960ڰM1tm{Хen p{&cW-.1͟-- xF933`3]ϰ,'x͎G&сx hA;OulID:o]5 @>G̛wc2+jW?c{n  !QaǺVLTm wPڔfS~r쿆3T4~2&pKT~<25ldș}^V("V9: ij>IMSf2b  :@qS8}M?{}ߍhlNE-nca y&! AI!⋐poZ@5 =9 \X>fLE?Y;L9N/>̣ ߣow|A;kbfK+ՍvkX."_6H)ZsqkV:Ԩ̧8ש!CQ ͠3aԺ^)G9˰ʍ',$Vbh+膐نT$0 iu7o| Ҥf?M?Xeh;.f9CtL"Kk-EOm9onԸU=԰DA+}?>k%}#Eh#ɴ _'T4aӢ z>w8B:3sSspYۄ!!> Oq̗E 01*x0u>e>O\?nrِn$E2,g谀05ޮ{ḱ7A#mo3 k#RGU .׬CaDWjFf?x@3} ;JW $d;0%#"[hVUiIB!IBz0Qiyn$׆ه'7DfPM>wnR|­Gj6M`W praIh ' }mk@7b7nI_^x!ݷ5;̠YZ^_͢p [32PY˩qqՔ$;t 2c27܃uv=WIW֚`o*hT"~eOmԭέG2h}s" +M``Y1=oc}t.\D}oRpVX7ްc wm?-d-(@/^ף8P30ըku!5^?z~ BM0Xage`z=q|7n{Ka O5Q8Ŏ:)ʕGtsmO{?zgx3{{ĈA \ȅ9GӓӜ\0g^`KduC[ ]m;2o^홛Z@GI>koxNc:lWm/&%?^Z8%NUAd3Jw/&(A%8qQWj'[}f#go>a` )1p EDEs:wgEѵZб^I >]˚߀5ɨC#p&a{(1Ƞ30CJSo ^"xqؙG:ŪA%/L%TڔJ5` J_p м؏|>Vk">O嶠AH@}=z%8?J-s5n[wJEX,/ dì<(1 s_|-<#%0vxqA>4_{ۿ[#s/scH 1 1C &,d3'.b!y-v &䟘6nSqU_FD*dIJ?P K_8 qpOOu قNȋ-!1Er^0W&uF$!F|UG`ӞmbK9l tN a2!PߎZ B  [ִ~C}??H]mghsN N}_C$U `+wl90>d:6&"p/ڿ{y#;ߌjp>VX@ s,'N*3ye@h@%:HHs!un318"#3`񑿍U+1|5BLtc~_Efڑc*uؽnaJ\Xˋ$g7!}]?`z!O'*CTzD_uH5/рDs`Z##@w4#v0 1 TݗR7ߦ]ԇB{u흭%ӿo/ .K=^wzoϲV4kH;JNPF= Pa/Jm /C~<q:();pxs yD\0$ֲ ًokKȋe]| ?C `s*8AR2 a0?ߋHoOo\IW随ܷ*]Pc^cx@)Zq) u<Lkh?($q ez,Gs,"C:ze6(Nh.a@Z#iѻQTc _%P6 B jc ;ܞ+w?_o4@`ռiZ e`-ik J16Ǫfٲ꬐BU"`//+ ȏ'$xA$%(mž%:&yh>@FyOSںXȧO "r/m.0fG=,6/P/g?{*0;b f{Xgt OO`Q J| $%ݣgOzW^.ftPϐo{/Pu=^/ 믭0޾{/O Z^ 8\W~WB (ɰ?:!0.ۈhl#f]"#\%OxN^(z<;x)@rT'Aha=|z: IobP6J=F^Te&1_(l&^ٛe+B0۷JLuXݾp{zɫ?V6 z^wvi[+ BGu`S"e3ꛞ7:spPL5.`t@f퀁}&n \R_(̔A tCU1Du&"P;o_U6o^{CyL}KWK\>[rc0 0GQ;Gg2\m6?m7 >Po d8%XSx9Gv<#P<ϨdD=]1P(i4fJ8AXd> h"6 `Zo<<;؞f4 kR`o^ygf]-[}.&s*! Q)N_Xl&þ}ss4T%񆷶!LwqAF%{U+,K,2jҏSe.۫Jv)z< RH6 ƈA.)m`O}=m_|` '6T,fi٧r7->M#mJjBz~^g`F 7Īٌl x @G G &[x>6ǻ`i>b :a@ M &`aU+䨹C@%aaZP@F 1ӥT?|[.QJ#y ڀC ?S䷗5uݕrC&`^Hߑ!; YFa-IdXx󲄾.Jf{/ϵ> =$cT LFPGmO{=i3hn]C6ceXR!{>:@gS0޺wx~?kog<@i^?;7akQW26 62*寔T)וs~ʔ9 P>DrUVg;BV{f)` q36Fe5sf ]ֻ* :"e9)MT (hJyM[!tO?~?q bNJH8U%޳_fZs $!307G,O3QJ a.[0g|tz0{ LJ#?0|Чd8uΉQ~14U +8!)Hkl y#:Ly&$6OωdK`h$f`g??vm'-__[(~ /)Ʒ.ߙ~[˲oyJ+F}H:8 oUY$;l5ؘgaO$P6ewvq<{푺KyHfa净&S^tp72D_'a(u< Tw:ݘfjo~43z34Z:|{5Ou'!V9]u)EXKgځȸɒu7w ,2,g פsBl-鶜Ǘz@b. h*Cfl[t1@OEuleñ5`(bM5j:ֵ\?V`2> @䴠Hq~~vowmgAa >8\ A#nrU7_Gzt œ+Pa9ŬԔr!D7Rj. m=޹iSLQ9!aXO&xgЁ@KJ/ƅ2+8Ƞ?pQ-!jk4{ۓ$IIЉ ozrm_)4r->s.Qi}휂Q:|(Ph盵S{n<,81hPqeQ"/PO@b 41P1d} faS@!'G`s7 Xn\쇿y&)5qnj/_:_UeMmh%( u~$lR)> J, JE0ӂy^頑l 桿 9N}R^p`H椄0鈲ɐ8`LQ`n0t @^שa!N$ l3%gzڗՋRDWp:NRbdm7{ ʺ $! 1.@DzbB'j 2EQ# m)k}. ZDpaB< Px@d–,~cZwQMHËy֤/sD)A =uG=N30@  &蚽p]%t(O߱{mݳNv`ݢE*H;'`Xw@31P:qĹ,mXPq+F*Ԃ }}]ay0* 4% d5 C\6޻? r3[W~2 @PyOm􋹮@ &[ӏr`L@:C(Z&S*x@R.=SB8Ey\zX3OW/si9|^!mV88oFtXE)Q ?clU9ا/sηD~H0fU;L3Lkw?ʒ;P4ad{ B؂@%]X6e6 4s @l;k%fG~AEh̗4j|~HG52->-ۤ9{{̷нK^ыՠXҏfʙ5FK~NO H,aV fn?jݧv?G~6)Ϝ#$@a*I,`7;>0w6SWUz?i_*z+ h՟0(0 r,A2R–4gU5r~ӿ??h6ߗf, ؾ kidOXϛ߿~)h.?dv{VVvjv:30 +'GR^'J Ad4Lmg NbQ C?Oھ_ =.jWyjz֓?}~#jmbIt:; QWn ?}`> o['YڃZ6) +]_o!(7#~J&-)97SfYHgv-5SU; Ȱr꾠|hugygnh6b^1Hlo/4\&bX;/N7qQ| 7w=JZ4D@苎}R_"v3J7{K7r@ c0ΘӍD~C0MH Le\tpCiC۴΀{$ؓ|/e 奻b#Gwsja:ؚn&]~٫Ӟ0)OnZ}>[?dom#? BCj(C( x6'PyPpۃݟ7Lx6xv7[Dq;e@DB2a Λ(AwRPf@sAsIMISGb9.4aa(Bv(ln\u}ˁGJBߞ]hﴉΕ|~g>;=_k bQP9}7y?UKhPL7>L`VhiLRN ŊE})R['ϋ޹H[R`>06QP^M2F/"%!as׳ <ӜA\;{{j =M#g7czwt!HIvrv{X&~}rJAL& FDZ%1ns|Ml")0ZԿ K1lϧtyʄ\/)Is;R:CjX`^{L:#N2ks8є?aomu}Pb]2C4_x4l)ݹ;$Hɦ(iD =8z; ;2寘AvO` >Ock6n:* ĔDQFD;?7dbup}L¾t25pNg`<2F뉕ȴ1hddcb7\k T:hQkIob7m#]M6?|7=540UIB@8 dR1>#F~o_ NCܓ?_7=]->[EJ͜Etvt D]n$HLjW3P:`D䣱 YUʰQ|'Ilq)9獮n3jru?37v@ !qa,!EXʂ-HjFZ~;cm7yr6_FejgCQg cCpe 4cev"<ߚɖܢR=~&)Ή2 \ԧ<_O@) 7OEi 6+nOt]SW?$NBMȑzB 8 0d4n&?Ϟ@ ~eßzڣm_7dFhԓ|؇ $.Y0Y@CJsQ:빂4C`$ P 7\C~⏠Oj.BDķi~A}& {{[[!a$Ӕk{@<~O?zm+:*Ǎsу5J9J|7w奏?oWʑ7gR#è_41& b!HYzW%W$6fgw'a>}?bK- l샙߰u9ɍUjB"7oGS lQE lb]PXQ\XboJ#;w}yK7h6өuF<g2@a,h vk'%2v@:-i]sb ?k=W3SF&zpD?npF6LeFncoCmH>u9Cr;t<3ߠn qQ|4A 8o-ځ)Ʀ6=O _GϿܟlN'h:F|t0lFB0fk]hN зi5Q5^fik9j/g\ml!T=@_=.46d/. Le=xoxM{?|g_ a;?Gr9__1]x n9TϰفZyD'P^#~onO'0I4 Q @Æ. 8@_Cg~7d$uF8|PfBO993Mτ`_$e\)ci8Ýq=\;Ȉ@U+i:F㉛z_P|ۚ_8i?%wԈB8bdFQ@:hskrd~#_Ovz}cJXU`4dү:da4q#4z#0ջ(p$zR"9罔~jՊiD135l˝~+7'$g 5>!C4PRĖO/"X}L8mS_r'Prȷ8?lR:'PEϷ lA*&C# 8+&kf c %hm?ʫetFʸ5N/ dǣ&eғtpHmFsq~kF:^ۀCOZL J 5Ni&U[n7UVU$iHTW'"Djk]{]{ff=}sϻof]yaw̼ssTV^K  q~l=8=6W[ymcͲ(ϼ<|C7]D%߄u Kr;@Hh >eA@ su[-8jA;U 2?2SxY/%$xvjB/6t#@H#׊>&OW!2~c5z#"+%UO]ܲŇ~:)4$_0e HO7H&dz0ȵe$K NQd?e? 0W~< Gx*_ ;MހUvJr|޲ck,LV{PT!Az0?jw{a)aYz= ?{:5s %||y~V$Y lgߘKtN$yI#&x8>9C~-hjWӍH3 <.1qbpo,DzD9G>yrn|;~aGȪV ̽]sAnj !1sLxgd筹s>95xk1 i 9C Q!`ҹ>oS93!Pg׸6>2ԡYGQ9ME(0^~L6]LiidCd EY?14|1O5w+Ml15FL /r13P3xB̡ba‘_D~MY!#aqw2h`ɇO;]{1\8@TD C{~){ `>xyw+/$2/`_=R6=Ȗ E Jxwn|-\F>,lU$}.;a4 M1#>%^?{7ޜΊ"7L?)pm_Y`HCɘJ@ר`mn s;SeňB`:}a c}Z_V!p-o6ޟݱ{?ab֩F3JtT䒁vڰr4/ ?g; Y-q5msp8#$yAt@~B?Cՠc{sGl>c2(fuLd<5|#P(Ox\GB G̈/'Y$ #1Xx=BO$o§N[JaF!0Ѽ 0>Y5Έv|v s=:IUdSz߉mAxC.T湾h1&KFV,%0X>:@#royT5I ݌&z?>8ܗ\>VQO " r`<Mn;:n{!5ŔV [wp-z=5&e@F#5=Bh`:}%2sinjȞb;!q ?)OOjm;t(#O"WFpIO<0)Z7vLk%ԴWC\6>$OKx48"I k# }b@xzU 9p</ 4 oEOZv?wÂ'i 'Uzz! ´b` h,TPPso%׸#}3@prz}En[~b/ bi[v &vL~(zh:6fjHݭz[5}m׿lH2@%1`YYer",PP:8_c,-x@NDH b96 3H4⡤\xL@ ŖPkowƲ+=RQ7A|v rЂ@''']x2@! 605ynE/ƻ$o>P\6Woy\NJ}M[s|j>l♈m7w߽ѿ{?ɭkĆQ[|^Jd*BÐ6_y{xWbR9S*evb@y ?G' < FNԞJ=~dvxσbۓpҵO >~gg8%Q%|-Z\UKD30z p}cG(>n@p HP&#@`_ R 8\qի[Z;=UAu1 }iJbgϼ+\f{#` BSR 9Hdw\˞qy)4ّ&>1@k[{b߇`(#FKo9kq"8sLTV KZKsr~ IN5nwgt:]!W%B@Q'A  _́]x֍c?*1TjY&CA45ikA ͵S#A)_Fnu$?`irY p>47c>QGC[}SӤ7t.x!֬YNa;[d?'@y::2qB[x,N\@k""Z=@aÙ@a H.z.͗-T-@M5%眀qzG7mSP5Mz{JA}P6(۝GeŸҫLYNzw7&6@4*|~٦0cGG(DBn!8!p@ZBo@A(JYog+Z`a qXC_xT*6,h <*\Hr*»wduT܃cwL$ }UǞ}-]zw;pޯ,/ Վ" PL{&Ri+4 }\(Nr,oGLsu^+&9s}۞}GEuۮ^P2)9\!BJ.X#G (,h'Fd- fE03ㆎ~K">&,##W~E+˚P$Lg~~W{©_zyKWj FNiE;biDr|gFC, 0̦P5uQqnϷ|>2,vAkU}i~[Bc𝼽U 8ᎲOiw^mAWdsd5,e$>d, >}`"I6pQp]SEK]ǧiV/,IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/3dlut@2x.png0000644000076500000000000000163513223332672022544 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<?IDATx1o@ǝ* #Q1Q+l !: I #L ,S+ t,}qscIYs|޽wfY`~lO)-)XٞW Yb5i9^EfM+ļՔt2TF*Mxe~@&#}d&o䌽&΀t\EAE]qf=Zl_xX#^QQP|0%|@jʏǨV!-K 拊Pa(r&0aI&^l,~C@ YD?,?@ Xޒ IDAb@2.0օaKj!!)$HH@ vZǩS7Ƶر* *! %-}ѱyssweĈHï8 a|: *C%Yg(AX8 ᾰ(ָ,M4u% ; =? ѵ;}hj!TK33-S |m>l7N] Aq)g}}8i.IBUTVMu׿/yYB "n5\ c\<9k,8wc2LŸ qa IG ,Kd⿿ms,1[h.R) #$+2yJ(Ҥ)FH_vtO)vأǝ gQi0$`H#);@25CoheTHc(05Ģ1 KX2vδb_`ny@ 7rVEc! %St7wcF-;eKgM\ Hqa;2aޞ.@yLRnӠS(pd%Sv:7_{c\]\x@棼l *OT/sWv_Qr}9( fSNМԤ&~ LK'h#FQ]@Aj$u;YZf&c g筤9J{溇OO Zp!2t=$rKz$rJ7h{^P h0  a+d:@ n!iIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/apply-profiles-tray-180.png0000644000076500000000000000462613230230667025372 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< 8IDATxW{PTιwX AQѦL1Il6T1F'G; 5iRJ(Q;UD B{wh&|{s}9|($@{B M j  I$#I  "X(7 k XN*mʋ{Xe2eegYC:ss RSҍ8kp2F?qvmkkn3{a-hU1-*b T(viƏ4b G)po&# *3ȲnCsaEP UtR䞊ٓR7S l[p??P5`X^U23'Txds?~ٴvS.,z:!iDr(JyD ."A̜>Yخ*CdO4 [Jgᥗ~(TTځFbJ}$=ϧfplY2 R#5}̉@_D=#1߼qΝN,8Xh3ǐI)Q=|tAAkj>yazg; @!k+K̒ Z$=Ęk׾CW^HCRBR2@h{pŸ9yOED!ia@znJvc+M'xH2?Ods{GG[{ !(ci"jŝh4aꡇ?8^|y/_qPjv(ʕR 1X8_~ &O4m;n_:?ku!Y.O@JqyQ;*}Wž0 o! J|Ù0J12y͙L(Ea bdEs[{3jVm^-U{&H'så/gHT<-ZmN0$@xrB)KW&3 F܌b/WsbRy妳MmsrF0l-0F`p!C"l@bG!5n,m@1q,g x60W{o_O/n5G2Ea¸!>9(3>bSLypjcy (:$DH bTqAh;{L"\-Npp w~ǜ|ϐ_Ia5HJA4"w!!<W6 nXFqHo^PH pڍ.@}SShXn U_Ȩ6]8%Qjb[v)w$"f?LC'14dڵ 99v(~Fl/W̥[wfӵ8>hnx>)ݘz| hԿȵ(ip7P͗0e]QT NIXgӲS~U8|n< S{Y !aS2I(3ǔJx)Yeۤ11{ދ "bR9ۮUYS /.u`O+jʨ{>pͲ@(0 X#c%4qO&ۧOJHԴƵ|oG :T[k,v ɏ$t+sL`3IhVڣZ^=XSG }cV[5W';4uM?PHɑ#=Gm|x{Os7z3\oX`@ Z\pU" Jͥl >7{ge1Ϯ\-L  jf0}ke0bb}Gk'Z@g|a@Jj><ֈ[h[OEWlr`yukQ ռ!mrmqK`_ÈRqODP8*RH<DqeiF0(kph gZ\J/\du]՜⩿|?#},Z=ƣ)6"ҝlsCf υ~]Z._[^N #g GOٛ22I{fc Mqw?PD Q8ϬǑ,Ĥ] <^ ϼ/ **^s-rյdG}H^iI0MdiFcWA˭7-K%X{Mȱ.G!zy5׏`qh[`Z`EN+lś!I60I,ɆhYt(.|k 6k%+TbHv?P:w^ߕ&{s9|Q \q!2%lPH?c2-YU;PYVSZZtaubUh=zWԐG[[;6 M/1X/X\[@/8X7& i zuКRDr-`hU]'"?$3bsJYu_3 _B%aS|Ý5)(_\Elq:q1yxsoprvɏ:Rx]ʵ3G` 0[f3AƑbԪ,oX,[RSN7V+,t2L 5>܋]ͧ:dLŌtB<G102g::6~ MITGq0 >!y!3nѓ S!4iZcwvMYr @tSR񹒲٪fMz-G5E'l ʺPd8itfX7X= h;{ÇrP!VR @պ6|m31n#k}lG$n/xS'#^GZǂkIO%v$ùoYE&/u(Ukd/ kg2u^A"Nl2^K RξCTzeo4KkkO4*TsJII[ Pqݻ;4z&,Ŧ€fkj(+4ݝlhOd`KeH_nAC `VOMG~pc̴;~OOcCIm=yLS災ߨ[VJ~Z(z6o]PɻV|+X|=Ը\Qw%zǤC -IHNpgf )ٞAN,[YdP0V>e˕7')'K—' >r33\Ff6LYリ$4QP T ҎMNJ[2eECmòWĘD{z;FGDS]Jw8ѡƻ T!ԃ8F==c<,svu r7ʘN}!>~0sZ4JyDul$JO ;SXjRwާu/.pD,"a׭/F(IfQ?p++0Q64wWTV63-Nf@]kCNUNcG"O &2zf4UeH$'rz`0insSp#I.$dj ˿[P};?-9&%9)uTtl$^]tUo( O0f̘\5NӚPW-g)@9q@ JK3.kp>nhd82L ӌߍ{DVO [QE y7X-xscMLT_"|=pV.h{"[&5j$mm %C-Zw(*(#EU 6[ E0 rRG"۵.=[>8ٝKbY|Bxoy`ME\ a @]у񃛑A-Cmв )"^UѪALWw VGx  v(rFȤrX.nLʩڊ{Ck㡑_8tsF:FgؔקcA;s``S@c#e҂hc= 1S5T'JS>32j"6ݏ5z";!6=jAOQ#- :25 yC*dآB( Mf8 9P2")E@#4MMzIŕ+%KZn1߮{9pT@ Ѐ h\iۉUf͜s(F +\U! #rvUhԧ,kvZR8?/o=3ic|aNjݞI==bzwn[yp',O4 HlJ/,LxlݶUs׬`ذ ٙNYR.hC]_ݻJO@7M;o.Xqfu:^;rl/m(ۡu2nȽ)6w!&vDO3ci)8u8ʰM?GzJHؙ[ҥME{>]m7 `)!=~zwatTC0"^L62qe}B gGoȪ= ȟUlվvjfPYW0"幄ma0`zme~1.\KU՗p UBQ0]=jR.'?PPKzJT (B$ZNs칊'bk>Y3c^䃲Sr%--MM5DqMMd"b@AR5{r۟>~jϪ -+>0!Iؙ!{}>]=R޵n_G#ĵࡆO"T:\<[U{måU*= * ~7*>_ƻ7 ~=2m5m83Bˁ^۝MմB7O{oʝw9<{= sdgЇAN7iiZk<"f<;F￲w:!>L^Ni^`|euIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/apply-profiles-tray-315.png0000644000076500000000000000545013230230667025366 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< IDATxtW pUr˾/@TaXl@₸uUѺu:ԭeIBZL]֎p(Lj+T!JTPPC" {Ns}H_ys_*pR  c8,2xSon݅k~'ߪ@ƭT|݅ۥ5 0UϬ+ln = a5"@Ÿ~,IWZLMu{ӹMfM >[xs+Z9> !/_J^0ZɅi.g3:k%3O`J;[~uOm(ȍ &!n3 r &1ze7yDT\7M\eu@̙yc轻5iyy~rw3Ѥ!7 U^_}|cw,cb^ ;@Ü0.g/F>IoZx#urA\b .QNků<wHՠ&_.ŧ zb>$Ϝ\J}9ń1kV+9iI0gpsVٸo=5kV 8%@MV?;.%3%mt^W,+xeOƺ>;V )nY,Ģjc[鈵 E= 1cVUg /Z0Ťt|Ih /ݛSB0FWRaD}@Y'adݎBj3EuUKpOqZ &˓M4vr`r#,=+G0. I֭\*6SIY0pa:ݛT3Y(VDEr\<[d9%R"~u9 #*4c-EHBi^ч`ݸGlĉM4qHr٣d&;CR 2HpsT"MIP]h`KMG,X6DilKy`l(4S08͌Ty|RZ9\53gG9EO~Dժdwɢ^=1{_Gpq-}n}d4^U|E &ŒLE5 ?T?isyƅn)Uՙ{vkw/_RFß ;&ڌ}] FR29 ek .M `St[@}+;qA'D)5 1^';vD ^f,T+P[׃hK;*;(r..YDPFHM̘<}Q$gC HZo=BoIU˽Cϰqrne\Yr.Y1jȣǤ<~r[C7/sd93`sz_\R{ۛ'՞[i* _ 12pwA679Ž_;ltٛ0E\Q|Y9xSN̜:cB 礽'OyǮמN ą{Ҽ}əS'Y*2scdL#Qdx}痾t|w s Y.0# ~dԔǐuM,`(GLlȪ|'*K@xQʲg8[H[A@_ "p)?$\9_h 5LV-.ܶk/*pUZa_h4qJ1p\zOc^}R@N2l[#3FȲ4Y90U -Zbd³6|3ZV%flY:\OScu }4*+/J"#:[tt,j=A :3$y1im[w̩xuqNPLmBqg6ƈwc?7\HCAESՏD@*2R֧~`ȄY`Ie*PVUohQj̜֘9xyliXKS]}{Wſa*( ,`gi*iT6Nj6_鰥Hp;-Qoٔ $~ rgx (Q(K-}TGO8ȟ#pD, Łcx8 YhMr)AY7gθ $QȞv=L2*5vn1=X^^wY4FEBWT2+TF<5ςXe/\5""41en{gd -Vd?"D׃Z\|h2 $$0I#p]ӂU, p H_ô{ Yx(]U Z6pөnu ³K÷4!F)eh؏NB1 Ri@&(yfT&*d=5g8x+|W7)]}+hZx.f. ˁa=U DMRf ܨ6P7wרRY_{d@飍i"pG??|*fKZ7 .0O+O#)mQWg ߝ uv @+L0r ;#W-6F  U|5g>lvAgB9 $l5A(+\d*Z[meɤ_;gF 4nZYJ^^ >}p6IuIod́e%X=auLk/p@h[.!K;Ş*RS D@oTzPMсfZlWKv 4%,+  >Ι klhl{ 7d]0eѳrHvy]aMK3វDy}dWUF a98/N |1#ͫ7ԯX:p^< ׳Od>3%T6sZc3L"՘a3`SbE g Ҿfn}T͊O=zZ\?Ā%R:lE:(;*vJax~t75l-Y×:xt-0 Ø-b`3Y!eә[֘SRdש`W1 ݼ~@ m+,^~yoǏWk$VoF0]E44u5+* E[$Id/5vYOa3gRO??$59))AIP.fG?A1-skoniC]Ϛϑ6l3u#o  >$ׯ&% +囌xROOmxKjbekMMכ` 1ʈHKe6ځ6 zb[#Z%]|-  ]0" {3IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/apply-profiles-tray-90.png0000644000076500000000000000460613230230667025310 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< (IDATxW{PT*.#B(("ZjMII:5PH hL6IFLL24Vљ>y/{Ns]Xęs;Kc$/=pJ ;şE|/mHr $08ǾF8\Nw>3'ۋj  ^%21C,~Bt!ד:b_\ṀC_U-i@Am5 0n1.)8vyyaSqFhMQc # }Z,~1pĩ⽵kU援^#@wc0e攉3PO!\WBK%0M)̂)r-k ~(޾bڿtYz-!hA( *fIy}qKZf R>DPyz}Y 5`4&qzzmuzM]XIMYk:u01ir4 aNUQn- ('zrf C+o1$`A-8Qs0Qlkx)%e@fw\6w :28z͕ضW i뱿^mᗮtia 01.51-gnurNt% b˯,KDž%׎: $5ud 0/bp 7_| hqٍ~vϼਂg{;W"AvD]~kA `]To-/dm\6j$ÀɎ!.kz8sK@JBhN"&:7ǁB  bjIU \,͛ X{I~^nNMT{4Uk$g o&, oz4߼]J$ȴzKnZ#3eMJY3!י(sYPo ?qЏTI56q^+3-6^^ZNHAM@(UM1c/,A˃[[ZˤI7"]ok ijmv+L` q:9et;Vgzv72F_ȓZ~:do9t`< ]ONJFlсf,̛?lkIeԂJѡqIj$?D|ұ/ȡ+ >w;DGL׀D:B}EQ$ɘ0CaT]XD˨:ss΀G1.PPZX]zαe]@ 4Ӏ֋y$dFÁr7oF!$ v&cáJ2Ҏd1Kl{+ןv?`s[H(ઃ!0PeoܹK,] +A˫9lYS~ԙMv+x)< u<C󣂷T.ҨKvVZ~J;OyKz:[  VVQaEbQ>#?ZcB$BEP NS%$/?VU{IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/apply-profiles-tray.png0000644000076500000000000000476013230230667025063 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< IDATxWs~=-P% spSE2U#d'qʎ+);vlS1`l aD8t! V{tuϬUԳ=%11,_Qf Vc;>14pI"p 86<64nX9`pp. a DD&]BIʞ]t=3'#ř`ϐ$u]uվ涻X}N V?a̘OAf2`3yԾ5%]<ڈ3&X9#،Gx!/^yҙ::a׾ÇSȎ[` D3૨Ѻc~n8%ř+(Bq&t\B K&dOϾu{iCo 篞9{ֻg5b](O3lݱ_;4㩉s?[VA XD@ BA&FӒǿrF/`20P a\Iqee@ä05lf0(~0"5DK^2{ BGD(/}(f(4ml.(e*:L/(F"@h7x^{gO2)"'%Ȓ7SIs+8TD#)OpB4/߲%uWGTgpeaNm/$+ H@_a^rgDk!Ri c1D8:} )[G*%Y2*l#u=/ZOp{k~w+gM.[qT8QvWZ4ԟtA꾮gWW<$taR!:,Al֏Ur璠=:=: X_Gh?OMVl yHH!BpA l_9o3I¡ *XG,86S l\f/; HR 1G;i=N}o5 @D(ؘ/w00jכD`:874ۻkwCc" /m..>R^1&a9;d3+R/mikp8qRdtvC+Z: Ae;P~M@; @<Ù-hWw4Xg}( 0/ur'׿^I7ۈ25q~Ŀ 0ZVIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/calibration.png0000644000076500000000000000312713223332672023424 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxWmlSU~mKX 6>dF+@ %#NLHPc Ap[1@&Dh0$PDtF3XiKv{v]G .Oݽ9Q?/qIb0o4n |H`hh.ykhBȘciD`C7'>H$t|p$1-QH"cb0o9vd^9pE~D BrC=w-$wP|^ N 6B:%qziz :BB=kYݙ) Jq2JMU-Lj: KA|k0],It9Юrb#$6'K T2\(`Tz̃)Z#.!EDV`*,T@cw@."$p J,fЀkơ&\|}w"^?.NP\Ҧ BkF1gL1ǭH9 GQ;NչqTsw18 H"3ʯSŨʷ6H*[ GMbȕgIppO}g8Zea4yUSwD| JH-LAca0줠3K#Z}*Q ߎzrZc}my#exAK%7jw`gsQ`x'KD,+kReȇmoxZi*VʢUH b1I|AXR$AnMWguD2MHIw&9)*$kdnf>/ +ڶq98xaWQsivqHXJzN|_0 c,wai>i5ǑXjA296ptׂ)ih#QGf]yxy&{'2LZy&bL.j x0Y%ry,Hjdb`me=%c٥;$lw'0ͨIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/calibration@2x.png0000644000076500000000000000761013223332672023777 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<*IDATx[yuO^r<Y KDE MU$I% ӳQ!hHHŨAIUj*&(ȡoaًݝc7=vۯ^Ke|z$Xөщ M!å$!g!Dg RإQbF@B:gn)%w?RKuAa*8K8E2LB33o_X(Rk" @\ nOμ%@술4)QP@u_IbLb_re0 Ƽ4< DX|63!a~.$@ELs zlDR0 tS2p~ƏD|ZGZ^g-D5ݷbHIJhh>M~_BTaPE"7EӮp?.p_ `aƃH"Zk2N>"F0,vp@V܅4[O&Xm;%( jR:z˩4]VnHj ޜGMQn5,@?CT/.z4Pۤ@zB#et'E]`]KݟG."O:z<"3T8JtjcL6 `'oA#xsS 7ߏږ W2(J]&7 C`8;tI"T4n+ ig_yc?MQh/y}δGUZ@f/] Yx^uI )1MۗלVÍgn"a,ͬ6=ZӢK5C ` n0_ mY>Iְ$E fۀ,8рNa,Y4Q߱ ppz7}K5.UTA)&ZgkMz%1 4`Ð lf#E O|԰!Q~(Y&E௵fүDx/ 3jۑ &Ն̐h7p41{$p8W1>Off F@2f;w_;'_FFs>hoғ.hJ !p:R(yNĥAcFA=²!QiZ]Qbifąo3x.N)bIٶX`11RnYI'j=h6X̩K(SZ|F*b2ґI_펞w3Xψn/,^wa/P$X&~48%luƳ퓴<eu-jWrtʼn'Ɠ:u֗80[Jݮus%64va<<})r!؀1#ݿNa +^;ɇጛqePUI Q΋qbX>tasaa3ۭK?pR-/wיiEotI6Dm 6mpY9a){σa@dJ¾qgg26,*Ђu8uU_-Myϣ&ԭpܴ!J0ҿa%. Gm"@)x$v!{)&-glpnk퇾Wa\ðh%lqD_13u\u{1/h!o,(gq_ʄmx_;Q1jd{ >/S.gљ!`#?wBl3?PZ0ŕ*}5T^vxjc Cb<'9"|"Bѥ#,TBL8 CG3 P4 S: _$PƎl B˩h{6F%AB DZTSօF<)1`uP)8Zyذ*AݐG U^Nr"fJ9ߓ>ZD~e˝`t;'d۳Ҽ<82F>Z>=Xgk3~{]ZH_1)uQosMJ{?1?0$"^2IH}<#sqy,KJ%]]O<^UGB^00P%H:U0~08,ySV礙{N2A`>_c{Op|mn/"E;0~{ַ":欭&G~sE@>v=0q #@&#|Y9u`AR{٦\;}z;S阹c2{6Ktpl^, 拙E@#yfұȧrN@wk,gMF2/%ϥ0{ ' xW`x>@(avUk%4iAv42e5NcQl yOx%2/:C(], N2QoZf(puRdʦ?cbU<]O\b5~SzC HM۶`O*b?M><$LD@0@]LOl?]m# }^(. RBa7x8v#gY.#[UA5U4\lLV+CPNH Bddϴ.yR`Z AnU\EReiPC<\4ּ7&q+JӒd"Dme8/[,vg_ *N3mozP'tpw$+Vx&]3EyF[0$ kj -^AE^#^f@ m pW8j#3F.% 1~Hjl\qQn|k֓媅_*#7H~"/܅ y(Jbb> 3Uΰ}%*= )X EGjJt61=r5`%I)-qY%mHgɂT1T"jy!6#ݒ Z+8TøP9rycRw?`9cHB].߫Vp\DS=VI&&, 9f> K,G\fe{qeފdfy;5L{ )ûSjm Q#>*r\#\0,?c,'kA}q&?$<% .Mfg˼ rd0H25o#7 Q!4F 0;;t1f^:p'[[[K|,篯T*>AYMax)I@x]$0f֞~vƘv Nak~͜yU3T*=˝Y T*wN$6VISH.}~mFbqMEm~UQp&?qIֵu7x 4 vA-$@:AigI6l8<4+ ry'r@| Vqx,\)rS=A`0)髕V%pX l-Ƙ+-^U-p0ҽpZWy@zb䷵};<(ub  Q (ib&pcE.odREռGrOxǓ;k1HllO2Onn|TEt}K$X,YN0 &ZE[e$`:v) QI*z(D.&ZU q;SqKu I^`sI>v9.&Al6[gH$7:⥱X/55}A`OtXaBDl4] tēDd oiH}"&Z[[~v  h=4t+C'1hBOO!Edcj@Uoa]4H$S|e555OT*vMO$\nSggKK1.//e> [Jy:U8ϷU)^YUB]]K@'l*hDd&MUVypgHLCC~7umֺweM!"oWƘXk]ߦ?1U=ܬ&"{RK28H$*.2 t:qB#NZ#l\_\V*6A"aFO#*!n;nR"ڧ3NsD } 1np!4x%HXk7DUFk:U&]#"jU%!pĨ oMMMM^>\KhU\e.S8#tzN9I>U}@𪿤[etT6B"]_ F1nT*u(;<{XHp$GU=Tj"elgKGcx%O%YYjnB:b 8&v+Yk+$$SM/"^"2 '`"pοȓ`󼍥-DhCC`#;km>Q/0CU^j$ɩl-`̀LDV{1n!7''tZ+lv>"]v͞=0pO˽L&úP1\.2AE0t!qg˲׭[wy(T ս00Ly8USeYd`7IGqA8{rM?;HP!!Hܘf>:Ne_o}vAss񮮮_d*xBF{.? QwͣSc/ч0x&nQ[*^nݺ4)r[U/QE>dnH?[`{ccr.MMڅ }5໪z> R\1LhoooJ)ܿEdE(;.1ov9mg8Vh!pԨX`@k]xu^__X><]] q}~YBgD.~vؾRIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/dialog-error.png0000644000076500000000000000146513223332672023526 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATXkQFVMfAQ1 FBDTFDA,s ʠYq?=ޝݹYv`9|w{9'c`;k"0<w_8a}AY Ϸ,jm ;EqAQhK '/`H*  +/x`ɀe_u@`\8.<lkWL ^8InXs;ܽq~-tN;GӸvZV#l`4~4Rp2{:cASZ ;|&1d%+AV0ЙNM7:<j䏳j#] yvPU%0l"J"\0#؆L W6iDِx\#jDŵb⓴⩨p+6ca4#J"#0=W;nHD9[G2 Lv}%!7Q >]U/`4`'.&I8 PmWAAނfe5Փ`@vrzW#{+zoy=#*byQIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/dialog-error@2x.png0000644000076500000000000000316713223332672024101 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<IDATxۋWU?3@yPRŒFE j:ޡ05 I+- xނ|5*4"/QGg=}朳Yp^Y{}kkBbng$pfzq`#u J1l(-(rU(?Gp$X-~O킷':n?'o Ƅo pXI6}rl' &7wW>oT]--Hɮ.P-3x;bXDj!`-7OUq|H2y 1?. f 8Mlpڬ1F0P iSQ@=mg` G!X zzB xa5G#u 8?*2h"%=^A{"D0N/uSY-햁nG킳ߨL+XBO%)8bVtF0H'n򧊢TVe7 +JRY+ Ɔ)e)* Z ~Bcjrk,ʵ@`)Q^0"֨5a,`)[QvYew)VW 8KcS/\̪`[K`tEv -vG+l>nIxQJ|ާw>^ _%̫`c~L^gXk26gםCǼpR ,#(X'hy^[>Eɲ5'ڔeϕUœHѺ4B#/e9+5yC`I 1?G4>LtTmy _O䕷י+%[JծS$EK&c8)jU𥮃EH ^vҠ[cn@+(a4ʒ|N=n . I\(G~`?"c LrL5PDAn{w &V5:&O0.`wk䯂#sT;]=$'" RQYcwXH>{Vͩ})a=.lUj96G1x Uݾ=]V^V{n<ǔ("3Y𕇈[]x 4`Tv㬲m) - |掑]l7j$կl-e5j^s|/ ^6m1ZήR![r_Co\>$k,5IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/dialog-information.png0000644000076500000000000000210213223332672024707 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATXk\U9 3-j*FU Q_S|3MdĄ|?6Ab, *JBZxˆpƙi'sr]/眵w־ EmƘڧN t0 \>kjj*$42AhJw8\.wiE$k31洵vۍ1kn`?Mo =Rq-p8$RS'A\6oH wOv2o׊v*Oź$N}\ xEo8#K/7 8 <|d/j{ˁa_#pImƘ^kKFzs@7r"6E-\#pũ0K|#P*GcFQIWI`sXxK-cMV:2➯JjgM`= \RAp,o3cN&psshk7<`rTHL,ǧJݳ+ls#`kj;= 9 %x@FFQTC 3vK}Rս:{6qR]=Hu>nKw%t{"Z 0>{|?B\@Jڵ^.oueIۈ mI,pEч?-]y:쯫Nb?a]] WNJⴤGVf=][Iq`7kӘLaﵶKf!pZz}jkkBY.;O5[0We7̄cccb8 Sԛ###K&Nu67|ܻbzfIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/dialog-information@2x.png0000644000076500000000000000430313223332672025266 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<@IDATx{\U?t-ХK @*%lbT#mmbTh-Mf;wgwgPڂXb4$Ь`jZZhe:1w{Ogggv>l9s=;!"SRsܿ@sRIpP)w"r$L~*NE`0~ݽ bYsx|߸,"r 0#~ \nݩ :wdC*zX\4~J%""ј "+N~N x8 8F#H@6d25UJiZgO"}OHn,~)"21yꮭڵk?8;LE";Fv`bRE?] 6lx```i۶VN%VP*Z"Wr!"JģRDI,p_*G)}+3W E"Q:CէZiRY |1T{F B}7 Cw"r<@Dn~\iŦ5J[8h"kmC5n#Zw91aCDׁY"Bm @Df{?ebۛA6,ttt\N>F"[Z[[jڟ1 ؉~˲=םX~,*0Of]|8C82y:Zk8`1p+>w*tC)|k9ypp=#~QD)]L%.0w,B,ddwgAc)t4]zSRvD~IE2hG)---+6?qpۣ"ln r@cqhJ__)ՕRCXؔtNDz/^:H$f=6AqV 6zX,H{DM 7nnn>NPJ=VA~ <4$~4 wN۶Os, Q_ m/& {RKm^Z8P]]k }2L6(q.ȭa9?={,W o7XZ ;bSi(L߮aYV[@D.vD$tm˲*YID" ѥ0+d2+GD"f"3\HRŝdR\D}}髶3*R^z{{BTHR ieɅ WZݨY9>ۻRWClWـ&gwvv+y9/!"S=,c;?ޤb$JQQvz-߬7 nD,2w'K+H& 署!-xJMcsTJ) vuuMX^&Ӿ%F@Z/"ģ3555O455to]W kIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/dialog-ok.png0000644000076500000000000000230613223332672023001 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<CIDATX[lEI/$F0b "x#&&F"F_HxA}- H775DD5^hw&\v[i̙撙9-pAH̉EJA oшn۞P ,ϙV`F QqіLzYoJ@zXȔ{DBbg *84hbn\S[٧/slVwEOb+D;z}_k6y/ꃻ6;8M/&>@#Ci/hi EocKpgzE.c^z?k~vaۻUХhfSRW㉇ 'o}fݖ8I_T2:i ݋,m (NWt#vz,mv0bႃ&"9>2ƪw#ES ;tzCp?5D0 {<ܙ`vasƾm}:,3g]HLO-9'r^=ϽIEr}RƂk H;hHfR[E!k˱һ:.1'9RX4_κQoā C_\ϵ=gD(wڀG_Vhpqx4u@sVXbd`uMi\ dAMx/YeR@d|V_tI~LD-K;Ll,PgVM^\qÉĎӵg ϛ!Y`=흞Qƻ$Pp_`X1e6'qbQ6FL͎`߭v} 4+3INyIrkUgAPmIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/dialog-ok@2x.png0000644000076500000000000000473413223332672023362 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org< YIDATxpT?f%R :vt( C kAKЈ ZT$:_- ڙMvI4%nvoM߻艹;w޽+)d"7(\Q.(N 8mYN ;n,_&Oha 32VC0h^}\BaẌ(C,)\b\eȜN>0S(>i't;\iA!! EL8辈b5~#lxd$D n`4#guJnBA0(+8P}zgz %q+N&+Tw2\d!uqDţ>i;@*4#XK@rE k RD/K@$ئTq@Ucڇ*G2Wwx,kC{#|&[mR5>v_5d~jGv] m&r5.PD)ȨvGdS7&u6X}6tWij( +jj~G觀a A;QDiw{|ܧ j|L`<05HeM Š&=FsFmC}l'1y"92"x.Dm!B2YdW3zD$bAzM_ AQop2UC0 8hvAvPU|BU0ESpIFڅLD,5&2-Ȕ< pa\ nJ"ڔV Ud~?yFIf[rJ/pm1ʜ!;(գ͌%gLb9i=enJuyJ'J]I ^嘇[ae˳,tB\1\& Jmu}}N(\w+\wg^"]+<-N7%L׳qfl'61.|'U$2:1ɅJ )ag&AvPr>a-3+H' F&i`6*Ťt c Tf.ɜ;ac;tŗ%q`IfY:sv챘< hPHH\PF7m Mq\srtC-|IK^R"['ԷQ"/2YhFseH*:3Q:a0gLhr/1YG~]|?LA?PL(]'tx-)yNƵ}F1i& +*.q+,U4Ty([ ߦB8jUn] X1Hk$$BO8:qxp_Yr2X4TzR$odhx 1u=<‡H,< 5^VHg?LnZr1Œ4 9~mabH(&OVmڸ[1 )#!'J!BБUr%!L[ZtcI.t]V[3j|,Ǵ ֘`H]U"ݚNW"DŽ/7蟾`iB1K!Px 0⭵-֟)g`f ʤ0 п 1L2-S4 ayQyoHR&0t]]N#&EA8$۸{-6*s3yKDRUzX)?GC5ܖ֣妮<ڤ0]<u}Xj>x`,HTe˧{hxB8-IێH~`quy|"R~pnrFPIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/dialog-question.png0000644000076500000000000000242113223332672024235 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATX]lTEsBI tD`5(cJ(vwsm7`}РMO(XX0FT 5V,)vv9ٹgi"rRj!`>0pt8 b]]]aZZ,@,$Q۶7uF l3<VJZJz Ì֮]ohlv; ZWDNT[MYGk 8FH&C5 xZ,?'"mrV`.pX*"OH@Dn3@Yxr\s><`H,_" "SCmDUVf?,"pX)G1""2 `1'`F'p7PGֻD r H,ynewwKR+"2SDfW<ϻcMooo2;CDWGDf|,[\Z?'"80%`lRD"p hZԮkAd2 ץH$^  @kUlv]@+^Tlpq𞞞Y#ָ-DX F K@DsR&nʔ)L"ĕ\zVcuI`m'&E"Փ3Mw"(hgNr$T*ux}鞲 œI0RJ]UCX X}AkdfXnpv=7ڝ"rs CBppGO,@(&ZkdZ|I=,"[mN 0Y x`NO^&Ǔ`n>?Z-eY T7hd2[ovHikBD;pP( ]@e-j/{OL&<}ܷ!PF3<mlSSbq~|*6&R5DP0H$IR9. <ϧ<&E IBIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/dialog-question@2x.png0000644000076500000000000000514613223332672024616 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org< IDATxyu?g#X P#D"R(j< B` I K7D. %R`D(.+e!Vr%;;3?٣gz[U{ݿ;~B{ ƘÁÿ݁f>H1V-ZUcë"8?w]٪Tu7";iɵt?+!jr|~0إzFmZjUX/AN, z]]]O&P, B#l99nٛMZĎS;,>YEW<YLaf2˗/9g7ʰ5ƘUIe+W;XYfv󼻒G*2n1kUuGBUV`Rj*`h_Q9@Uہ3˰.U7F#+-ttt[(Q8WU#_X;D[Gp!#9aX: /૪! <k{d_`7M/,/Z wO@6="oNPI3]]]Ed1(- ('ypʔ)O~$sj $0b}[U)wOYTĿdɒw(b8(| .q=U:;;8 Bd2,_A1F[8iI7HX| dL5ܣ7Qaҥo:-/BP,o ma|߿8"s]oUb"b_am"X]~ 3 Iu]9+}?oы+V209B_UD(EyqmY1Lc̕9qiac$>|9B~ 84K=}}}  3IAU9=[3~]Dy!إR$󊈩tG{ظVZ5@Kߦ.#t"m@KҨ/.5tDHv>===7]GIOE5$Nc%X^0iǎ\D_أ."kj M+{'Nc.}!1qݒt]6bpS7T? J=-Yd 1+C~Y(mW(SDdzV?OpTu/*&@\'DWacGrɎL#!zm{5UUm(JY1k!I>`y @o{Ǚm;1fR"dٵQzEkq~E۶$N-Uߋ "ryO51ƶq4 fnd9al2̿-01J) cf17DH%9WU\LƮU0QnV1&Bn||q':ԨD>TuBTxNUVsضRU \~G0utwwPwۉaV3iC8vq!udÀGH[[ZZ5+~[1Sjؑޣ}e ۶y5J c2(/ l^u=Q_k-y3z-"+M¶mr=;(?~ŋRcUMN`f~F&ϟ8 H<n <i9g;̲#USscX MNlv\ B_?o41%ċ,Ϲ<߉Xb8lHFj77JlBlllg)&â!O45%\jv&Xw>mmmE$VATUL[ۀ+ gT~1fy&"p}}cF>64.:'䥂9j`||;`[Dd%kwFK @D:D\׽Vt.J>1Iuu r@r&A'Kix&Da\̐-zoU:::/ ' 1xjMIƘSw+i,ԯfXcsfX%NcsIJEQu]pժU{{{[1"m OjRjs1Rãm7$UdpVf荌ݛb˪#IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/dialog-warning.png0000644000076500000000000000170613223332672024040 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs]stEXtSoftwarewww.inkscape.org<CIDATXoTeߙN% 5_?PF;e!T@ `  H$11nb0ѕ. *D-bQ:.NԦY}{sa HϺ,[JaMW+?YFuJXUTԻ!-so$Bhpw8^^^J)w'^_y%]e <1ΊTgv5LDHd(Eр=#nIuښMkq3[YyޓnZׁZtk@*he7D?g i3% Grh]2-bs9Jոѯ$iy/bp7=Fӄ 7`5h=YVqEW«e/eS3`F̕^Q|EtnL3|.efR-s8sUe4Xa,KKm@N4*}B]4eqR$.;r+,qa3.Rj6 roFщ*NUW脰9@j(ݚ4_`jȄ&9ikQ4XM7v88 ]iؚc;p"܃zQKOk҃qScpTw $ ׁn}*w.,+@JY4ۋq\H+q',^N b=mWZb\$kЍ[p |\*hV!iwN7)QNݔ:0[ݾY&)$~׺-H>5 (:Va.ɷ-$7ſ$?R7RAXJ7p*=^?RK IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/dialog-warning@2x.png0000644000076500000000000000366513223332672024420 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7[7[tEXtSoftwarewww.inkscape.org<2IDATxklgvqp-vQ۔C myI!AOm( AIHJn%BjHS@U@( Um6 T@* "DÇ{lBd{=玅4q:s"g:,G9.L,x6ʧ@i]e:Z1F @+K4yJڸ'y4$i@#FHц݁O4&X|PIq'9>7q4µ8#ÓceBXM3`5@|0O$|`(MLMֹ\p-&lՎ|f<N1O,ѐɆimkq ʃU٠h'yl* HV3NTY.Nub5p|Uh0; qfxxvz{揍tx&Dqnby"Mu\Mc{Er<&;=gvm_;99ns|o "YƧvi1e>c/w943Op| oPrNIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/display-instrument.png0000644000076500000000000000075513223332672025014 0ustar devwheel00000000000000PNG  IHDR szzIDATXW]K@"؅G5h)b%h^(f;ʎ:t=q404&J6!ޘ=N89baRd I;CcL-GBHH&@\Xs׋ MS$28f۞s^!It,mcFY'@2!KXW7+@@@ӜR&"G8$bg])tX03LqMǨ j(`l0>v$lZ-ft (DcꌬH5q86$7Ɔ$d.}K S,2.=R0aꌡayt[{a -W]>24:y- @7ߘhf_[?/IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/display-instrument@2x.png0000644000076500000000000000170113223332672025356 0ustar devwheel00000000000000PNG  IHDR@@iqIDATxk@j =x+=)&xU_]Ai vb%n얀̦UWm je}o$u7f_l'73BV,&Jz*n2%K8,-1eĸN 1 8~F [މ-u} |m3Q|OVI>aV@es.kR_DH7?yL:W(@RnRt5p[sE:iZJ9=7}z}gVMG$(v]-hAh> uo8N(0v`6u sqWPsU31+M[*:^($!ŃP#tj/ :sV aF6F7<>PT}wq<Hqeps9R0,-%B*Yt{qZ.ߍ"up5E~L$ /W gIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/display.png0000644000076500000000000000113313223332672022575 0ustar devwheel00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATX햿`?ϛwA]7.n"; "!"ADGNp5ЖåRijo|?_U5]&p.<"ؤ|OTu&Gep'"wRۼhELZt:`g@s"j=ol6&.YUc.8QNK8 PV\.Yjq^()= E"@c ^XRƆ1(N`8Y}|NW 0L l[^ް־ki߆a⛺_i{K, >\|7IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/display@2x.png0000644000076500000000000000207513223332672023155 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<IDATxAhUugꚤ[ (F"m/=)Ȣ^ Ԓ{HA z/ 9RU"AkeFKLevy/l{x}{| %%%3_PDBCNb4_"J/1@DFEu5 0#"7LOO0| D OCī"RaWRsR|MNhvh4N{ DA,to]>.?j8ol69aVJ=i}gm"v~+p;0`^ZޔknEu݁>\^&ntaaa^ Q" @PvEQ u$$6?P$vAmERJ.$mjݙa.bGy=o%˲Uŋw甊9D7 :q3ЙKzlv&IRei+=omMp.Ѹg`0$>Whcc~oP0'7_+#I99ztUMN8}mToMs*ΐku8<ɔJ1:(i59LpC3 # ĨqftOU\DftI==jS\< *䯀3Fͱ]<,b# )UU*76줍YS29B.W||\\o >;K7]]o5$f<` k2ML8r|σc)0a)4Mic&xm wjA`=6J,E~LѰN@z <^'h lY:Mmzt}n}bV<F#H3,z4dl\ʂ'p>;ZT2{ؿw5tYz0I$zV樎VKQJzx|:>p{VGYѨj#nh 5ddf23$TtЁǗ Y)5d)H_J>xIFpDV@(ڐ#BLzԦ >Y5sm6WӰL6s&Pǒ]th:t̼ӡHO)9R<řj:i걠TP0JV3:l(<vkC}z؇L/ LŤy +N| TW%Sq*JIu{^_vrg4~|`5)<` ,ݖ٬}V8yf<^oCI@RJ, !)HUDR DJJKYKRSu% %  ! $M Y;x<{{{oV۱7ow3Lϗ@h Z ExPN[{2]*dXdfۃ뛋ׯX lkuן>%p) 7Fxwp4:E&qV:54<|]fOE!x [ 0ΎPng9 K^ n9*):$MLg36F7z;kyhx~5KWdp|elߞUJ}4BL{d $N7=倬/@;6r>bk6}ab4)JfgZ*p^>EAң;rٕhpO$OO;:1qW(OYW"d^@AIk'鞯9Sx?XMbzr]2ޔ(FĨxhAIƇT߸oE?FzpF+M//C$N_L]Ѐ8YLn "RCl)c|k5ͩQ/t=c}9{|-O 7M&H0kJa&S jh.-=T,xV)X(Db,f{{}ͷ? I,@PE}zMxzІ' 괈*YPy>nzqmZSx1Gp S$+O2K.3*g7Z< 2GE~Ќ@&0 b*_Aw (. (y@yȂ1wIf墑TRex vqjޏ~VZ1/ MW_;]{`tq*8{a@#ҹ#D@!Az#kr]*-V9 fR.E2x]әXk£{UD]ي:ʺT?±zM<ϩkqo}r|2r6UQHпU[g(.|eբ枈:צYY( GFue;go8\:e&ɒD{%M2i#}O&A` r 6?iK EymzUu3+;= |xv_u*ێ A Q:"؂:zRK3z=_{p(EУ1@zqWښV2[h]hEɪȞ+欵PP0S]p]뚮n]qIg3gC#W&݋Pib ,4>|yOt&qUƧ"0g0U3c{&U5s6[XH _;-\l7NA1IM&J[sBN&Yb qEhIi8=4S #c{0Rrί~4.x@Ǻ-)+R4e/kk,ooO)Z++Q \S-932>従TK4Ɂ;8lo`]&eD% 834th֫@>8X~\\s[D M-t@*5zX-mONOlZ+J4&Q7d)]M=tQc]!⪕6 U؜?`AG?4R:22Q-W۴.BUClWP6<{&X I,b! cU΋H-ut|#J)'4ɍQ%1WtJ,4͖}446#^'hTf~i$pw1lv^gVnD$ebYz  CY:$%EYK'{t|R˓>;@ ݬ HQzog57,[~$1\7=`G)@hIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/displaycal-curve-viewer.png0000644000076500000000000000363113230230667025702 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<;IDATxڴW]lUU[)D, A,ZH$$fFw3>iLԨq'<ǘbLkETPRrvs=gvp9tTRwV?}C5C YׇLJ0ɐ ác= O?nƳD]M{ wܙo{?JI9^..BCTS?sS'%ٵk<Ξ')|ۤ}ҟ~i,Jx+O+ [!,;*fCCb-[@H+~I#@d 5&Rގ;::ZŲJ=)^ !f(ٴiM@US "hє*e[=ȽfO$[/|,]@we^]N\T;*hk߁fF0o63Q^IGÕh1]I*tZ_YwxgAP>07e'˔[,SzSp t zY੕+K?3&|wFhp|8wf9'q,b>Q ~/_b4{<9$Qđ=/`Ԑ('GO\ \m}Q__M6bOMġvo|dK,|! Vk,DTk2l.\ݸ˯IlN} gG?LOO,%gN'Һ̍@ v;V%&9. k7ΟķVȓ3j5`,瀋Xn,~6 SsFKf}VT,ymT{5 gTB{.M>j"ge@NEhԞh׾eT?%J2^ԍ <1ǶI]ڙQ BBoQ—_6v/$X fځQSta s?m.\=yNY eڸK;+ IlIK4`qr45G8*Xfqɵbۦ6H91ڜDMӺL* s׀jl2wwdN?g܄w4A>OBڈ#҅h۳E4EA3v~@ޑk+>vDwYq>w%|d G= \LFB"<Êk?sr= l{mzyc_:ZzZrkN0Rs+ LWXkw<39 8кR,u} EG>sMwZUlD6F#иBJHB!A}LK"uC4&glXU`kmI(QD8*ũ*[aԕe>R<̓8s5u@EXbi2a)STC2-A7ѧ[o$*ѐ(ЏDp(ÐX22! HI%8LsUĵ.W)C < eU:]xqV*/Tp9qGu\ -ΟVRnW=(wLk1LUf1YwGVt,SzT'_>D2y\z v Wk,D|y.P0Q(JzxB`XoX27O/ϮҡeX80o믔ZZx,Bdž,ˬ8,,{RR '!"I:JU86v4fI\L'~GYSCXP Aユ?z|b賋K `o ]qױ`Ql3BbkN]t(}hYx>4G7هSZ-'ݺw,yl^їo[adxz5/nb=gݞHZ+IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/displaycal-scripting-client.png0000644000076500000000000000267413230230667026543 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<^IDATxWn]Esr"@aa$RhQqP Hӄ&R,wpa7 ' $ cQ_f=gI Z=33;73{YD&D7ܸ\:޻7uk4ԤN01'mLO5omYZ}Я:Ww޹==5nw)pmjۤ\e3*c;;;ç"y^dh3Ysg5eaoio~2S7h!$Bpe+ԝE!Q20UQM(,ͥ'J\! *Ebs:n@:7m\̅ G~PUQu2[eFٔtx3WfR-ނ=#7@"TȀɓ/hyy u|G D% RDTE+|(q: Wjx-`ٳ/իT$B֌pq(4D=hxq/tvzc)< rlOQ ~~J%*^AwrXxDjh^'DE]\\ 8ـq!yeiᕌ5fX70""!M(7?NL'tk1LY%*\+ QT0#C9AY < ~Do*u"ߑ $;Q?XOY/!vY`ע Eےx|]ʱ]F/w5v_Z>B3WwŪT_^3ݍ_Ocݠ%8їg 'b߻^v[`񥚣hjutX/{6aY|3 n֍>=::뫟hMe8.=o(trCS)gTF@؊c(TIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/displaycal-synthprofile.png0000644000076500000000000000475113230230667026011 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< IDATxlW{T{;ݝ}AYVjYyYbFj16$д1RVc?O!MHVXA塩M5hȲ(Kwey;ޙ]79w~||{8ͧB$4M $쏍isN`$pgmo}֍?>M+о`r^|0*i[B [3$-"XhT1Zsw~ɛg05>}ֽkW0nJ4r Ɨ:`HC0ơGl$:D¨"(8v\}SOt-[-!ΰ/_ \[FgG7%\  @8P(@ EU ) s&xW5XNM 3^|/ Lr]ўe=Y!`jXF8 UaE )&AA1DhL;Xrs'kg;T^}!wh'AVP*t`f=ֽt!)!AW^( ;h *15,qj :c! EK+MM'Z3=J0ߛ.c*TTWK\M{`)&[_3htt%FWzH_|~ '/Hļ^|X{̸DŽ`FCVٌFƨm 횞Ad+[edD[R,* \81|BU̳FymN6-X[hA VЮHݴzSַ/Β.TT5]Lo$ת*.K\x,Lʟ,#Yi%s={0?-ߨUA%-hLLD 7ighA`-1 ",8:5 ^AR(HLB/$ӍTa[p _ CZ,r̀Z I5!>9)WạsϙT{XqUCt~XsNźdI5DO֡jwLPae#oY1woJEES]娗+q+q*TWY pjӪvb8~7jӨ Td54_**15 ;p[Ig?.](oGZV)d^AxⴔE,G%ZE(/ŪNfϓ[J ;:  nCؘBP8ϊ%YJAbcZi׹"UՏ.32~gWdm@\~72% S(r!]b|74ٰ<` EzGRERӟ:yb*>uTaddg0ܒ WH%_TWUI{&3!6nm[pWu!GS^fPKFքcGG] VS0r#|RRB}h~6L*~s$Q(^ KJFTq*= xgHOCPId+CОg' бct0*`>E6)hԠs'_sCTH!}Ƀ;5KEy"h힍/.k9Blz Fzc/RACS }m Cbjm gӧ0VZLo8֘>` D/l[H ,kO"G* #Kl}C. ̹o'Lb|B2!u]ý˖n3#ɶp6$LL xW3ׂb ʙ\:>t>w3L<'AEWokܱ$s 5Ч+,!P(cp4\(]Μ7%)ݽfuy4-hnۚM;{6H@izIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/displaycal-testchart-editor.png0000644000076500000000000000345313230230667026546 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬWoTEͽwwmݶH}PAѠ@b6 & & !D꓁&>IӪAvz^ܽsgΜ͙s~sFlqC'\ Hj,?Dd׃(`llL(%w)I)MIH =TC@ۨ.$uQiu?ݦnduj 1g ]*lk/ՊXF˚ƊY9hAϞAGhhGHӤӭ .Junl߱k֬Y/{hnnVY?wWƮ8G]d(l|a#ɤ!ƶCϦع&PijjNAV&7w҂C⹍c'OW"HRd@ltʀ؂k}%Ʉ'5+"j8l%<,q v3Wd5 Fi1}F3 Apw% X&4gIr0YyŢ82f XaCLL :MPxrJ,,,`ddD/oxx>oá!hA޼yӒVA踖t`^99DRLskJS:ʒx+{m 5F 2)$f1\{niT4n?{c?m-سg=}l"]`ffZoe B}RC?r-܆A$[ۡ нs}G.Ћ\.wv L$Mc--шPE/w5`a._Qի_Z5Ig~ :@˓!pRM6= OÐI+ L*u'2>>~ZJ=?!{_`? *_˅IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/displaycal-vrml-to-x3d-converter.png0000644000076500000000000000267713230230667027371 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<aIDATxė]L\Eܽnv)_`Z6T(XK/}06!1ZmL1!VchX|M44Th(P>P`Y؝gf½%For93w@R?/U vs=sdNPX_@`h<^i>?rؑp|z^z,;bKO7N9n__'V)M~+79fgv~<~еpvM aՄvm65?h{<“{ M΄;ڎ.=q:j*fU+fPk`so:RWY_x6oIf}e'J^>Nw>85] ̎yϹ?җ;_$l:1w&]uA`!иJڕn5M) +pk[{j \pجkCalIr) `R$ogTBNFDXj-L30qBPX p0}Z7(7hhfˆl)L)V&!!704X ?d, &AHTDEeTL(,`P40pLy-)rd;ݱDێJ >( s)8&n 1PRH}0!bD\&BKmШ8"C*iUc] R "n<QǐnJQ7˘UdQA$W3:B #2_M @ MHv'lw{&h +_=(Fh |1!bӭu:PnO-+wy!ꩮ ڰi JA BȎ#dd[дb8zdp7O)1Tq_7_2p_ /,#vp4vc72 K43رFlb QMeqt o=ްw"ajTWƿ`Ɏ@B COݙU E!T a]&.D0c)N $}qlR8G3 US> 3 H~*7n8h0'3e9{Z3i +^vu:X/wIKÚYX,JU?O3ƪs Ĥ\&S 'V7 덵o1FIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/displaycal.png0000644000076500000000000000515513230230667023264 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe< IDATxlW{pT{M6M4VaƶQX;Cut8G*-` V)SE#0Ģmb5 }wιGݜ͹{e64 .&w&wqԗcZAiYq3xu\Ir+FVR=q) &NId_y_) bRz:HuD:i{2:UwĦ[G@$lF# L$f#'5%9R[x.dl ?lR3kʦoe]iNb";1gƪV={ k;LTv Hp$%4N<)]gaYZ\tӴǪeHg,-Q\9;22.m\8Qxr*.T'BABæDg˿~B ܛH;dLK)0ij2丮="bo, Z SBCv@ڃ Cz0cQyqr/cHM'jo7OSY\0aQnj 蘒Ps[|o;U GLk6 C^˪^C`tƒ1wPo()hկ+"FK, P5mtl0IY #JV/ZfuLV[xGX-<*F/O=ġ~NΨ,91JKei[%D?gn) (eckXZ,@*}D WmZ+kj? @ƞNzJ%>`zɰϮ_`\Wg-[C00خiBMUø_5Y̑țERiW$O:C53,FbxFN]vZWCAHЭb,;'hzp=;$IV4_z<6ƘӪzYUo݃jz^Ȋ, M;>Wi#xlKnj 44leϬs_1<`wxD"rZ|r秷M}_HUv/ \OM>QR~_ ȿz+mjw]4L|7BP(ιQ(@䇧BDKvBfB9 h5Wp,q:ʪZڇG 0?O-ނ% /8 ,NCLTx~D| #!IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/lock@2x.png0000644000076500000000000000210013226307131022420 0ustar devwheel00000000000000PNG  IHDR@@iqsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org<IDATxOhU?I- J 'ͪx PTX,aaMЃ +jŃxP!-?Eh4 Lmfv_ps{}0}@Uc؛G|."DQF&WսM^^)sszxݞvkK@]UOm.Ac"0"r^R4vZEpZD>CCC?ADQTX[[EA>!`utNJJj3 @Uwl7[<4]vyddeWsO$6)"[xU%"nj1 `$]పh3`V2 j_VտsssDQPm~8F@xFF;Dow"r$̓93 wBjzUw#Tu)p[|P(Vhf0\_p:yx?&0|U)fx*^FVVQճ"ROn6oc;b󣣣.Z.LNN|+x:!hܘbJrUD^Jv&]VXrNl.fc>u"roN?:^ۦX`=qҏm52xoWY<-.(9hdŷv^DF&ŋҨKxCUCL2˴^}r~ۀo|MotILUM? Uݰ?|)>~6<|3?e91e(+l)y &6<|ۀo|L՚<|ۀo|˷?|?3d 9IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/profiling.png0000644000076500000000000000124113230230667023120 0ustar devwheel00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<CIDATxMn1 c\ T@VfM'5 Nl*'u<><#"< l/ YsiNXJ!S|ugfn6ME:㩘czOE;+USWM]w:/j@h7VVџXi4-,]tߠ<7t L cfClsTUA)-G=w`(<8 ,C X0)'JWUA; R@ˋN$ aRYV$"O{4T ͍[g4vW% :x}D6qF",kmʲh@I5vrAe6@NB]0 RF P9Mp}ўCӞvE% |rhI |eJL  %!_UOk$l@4Fgs 7jD;"l@B\6LKp,Ch$i.?7P ځ8V'U&pNDO S*U¿w!d {BHIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/32x32/profiling@2x.png0000644000076500000000000000232313230230667023474 0ustar devwheel00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<uIDATxk0|m ?;le֌MӔ1إ]vmz@[M/IzOhQ+_}"7DThl:gv^7u9+q뇺l!www-]TxZmoozzbi=]qvvV uF}nChlxAh+ǧR.=Ƹv׾Y(a̧! OY~pIؑLBHFz p]D+4r!$F$!m@Hyqù=DҘu@PwEr kaG߫Cp(bA=aT˝X-wM/B[]Hq}xxxE]sss1ٹrybyKO1|KAzi!<7jjs;;Elq ~O O P5Cu F}nC&+-oOLO[zxe:pȣ1zd¡܆['O W|ZYgҺ R HOm%>BF$ 뜞`$'*@=<3I';A*a.gr %C&RB>8=V !Qc)\ɯ) AVBV+u>C@K:rFO=<*A'aBA™`B xCscce#(=7P?8)[IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/48x48/0000755000076500000000000000000013242313606020437 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/48x48/displaycal-3dlut-maker.png0000644000076500000000000000647613230230667025437 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe< IDATxڬ[lWǿ^s݄&vh4AJCE(EH)qHZ"# -H T.6 UeC4v|ggwgvb9oN$q\_k=lj^gfT ofw޶NIV<ϝ{^7dWY.T;t7޶.7*}[ '>zi۶kZIF%,+-if0B5ejrm%/GAܿ[W/45v3p_j[)R&~F(َ,xrTx]# }mO>>~C 4N3C#_֒Tַ>>kLC{#jl bc$1 ẍM1$x-+ 3 yv/,? +Fyv =g~)կm.@tj)UX+M^ߢ]v`x\*NG״2%W伅׮g;>8=?zڧ\$D6e% 烃QN>&&ுπGw?>eox`_m;pIE/id)dIVH ==G+y $ޭoǂCWc cKv=M.mMhũm\Bwzgi3kzJjmsw˂?lF#~{.TզfҚOw`ppgi`Gͮe;S(^ӹr}EGˊL};BBl.t݅&<]yZyEQ"VFPCge ^*c؋"x PpWB|P:fJyC,TߩEp e p!i||< ^W:Y|m. >~ԃ>Q{XCp{B >|XJTb.=i*_Hp\J5BBpif B !9Bp<\\< 9[p!#QÃA|U\(rj-\̅p<\hZP.$xiBw?LM  Vf,ŖlV۸BQ#T BPa.T.XGڤ R=|6t ) P.dbO@p!6M^o\ޣ&/S7y˅rpE EB/ xBJ%u٘6K?. ip!T1̳! ].Ď-ݽ O.T pT2BQ.d4dꑗ-ڔ#d+V*nS;p iB \Be*Å];`|ڵD J…p!SjGUi6 p!.d{P. Yp!.p!&cYT(dzx5oZ UBD@n &>y :Å$ Bp!`c>G$3܌}X{4èO>烈} B 0LNêAT'z πHp"?Ցo<,Dh*NlRn/ [{IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/48x48/displaycal-apply-profiles.png0000644000076500000000000001043213230230667026240 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxZ{Uy>{g`$vM+m!hIP]QI)*QVC 5 Tq`x y=03eGg7sg?~B$H"`I2 }Z4TIB jW^#j}yK0Q[1 H1ՂWp  ܛ`!U 3(};I- w! w޿>k(e jY'(CASD& "Z!&ap #I HX(A*_ExȝKv*c; s2ҔBۀgRZ9J 2 d$s*eC [r@ #aX7¯VXTbhlD\4VJ%YބbkC?Q rML3\( KH hLZC}>%6Ysv0`^ Wg ںcp}.d3 %##\d"@٭dDhf fDiH˄H/ˢJ!HL >_R׎+P+/ B]H';(1b"G3 k1ҠdG'5CgoܪZ32*ɫ5Jܮ%ZDEB%5G~GBiˣsJ]714@AqϿ* CcdqNHCUAxQ>$L&z m!fҘhXD -a BQZ 4$͈HCqg>̀uIwrx?:HG]"|( vqֆV=})ܴ' ͅ-l6=9Zd6𱋹(zڨ\v7Rqg;qn Pxx%(@x]᱅'cpdKV]s{xg!JD8K?jAD& (9q>62l~_$m;QTa`_-BoX@~x֊(&DRf@$W-AH_ Y74vf0?07QU@"/BC?raNo`@Mx,_̲>.u}^t=xBSIE=ԘtNvΐL("2J4sЀJGt);)5TX ],W#' ؎=I'Ճ9ap /M97feaA@< .[|G21RKu r):`Z6{+w[wZU!a6z7/?k^Fd`|b#J(cP3V&%dnxOnܸ7\&kF}kf oG&Aljh!$m4mKܔ6LW+ײQmw,.XP>ThiUXehȲэ>2bQ㼄T%.#v^>s\FL^ HCHyjJRnv'ߕF1`jˎB%i4בD~zyd/?.m[,X("|HjU## yͷ }Z6lߛJ31BG3`5<&KjqFh=d|RjsCs@u} cUHQ):%̓ 5s!mB%cxO4Ny$ , >Ј"h2._cxpgN?5!՛թB<N9_~LQ` P 7ѬAň'Sb {kBhiG=f rNvj {яB SI l7w+um٭6RDw,00PPf$3,3&b/t-ya"*7Qf\T# ɬ1FQ;?O&SѢo9{bͭ͌?s4j1|U̟Kw*Cd <R1:+ C>3oKj Tl[ u>2~l3gvtҪ_ak2\8g5?`v/e!r_&~U((J]sl܆)}qLU_ x!@YSUid/<-JA+DDVY4+x)# %{5u{2X<qHBgdN3snr;.XAh: 84)e+W.N#qF@-4C(\ayA?,$_7%jh ;vKJJ4]&)e[/E )z( %u߲h,&'m ZKf,s @34TX%Uܟ?64QCB)F3aQq=[Ow2ˁ"ǁֆ0;Y+-צOrs.#Pt \H^ SPq!BW?LjϯNUkg3ԉsԧi55!.Te(Aao RrXn; Q`& g‹E1(L眈7M^ױYD mݿe t[LuLM&x |^CQO˪̗2,}?WYP -`jEGpPCR 8Zh+/uu;fCC±ʶ//ջWegkaP/4OkA3(th{!>`D{mj㹋IĞ8БS}ɷ~s߿s޽űTW,饿zI=NJ=o998\8ЯDLϣ%RT Z)MaC 0š$N+%vl;b.{C ]D/oxQz֥ wrʾ4XM0#y,mEZ6.^Kv졇ΎjYё#Vy`#~wx[3 moƹH\\×LGzT"g};-9jBXsd~kuaS[VO[Mm͡jg>%q/wY_\6=7Z'Bg)4NV9֔K3^֏BPR)W ?::}sw_vuXSͺO8^w/?wbssm?2'\^IњfB :ԙ* xvP9_Baţf-ژ/F2oS#'f_] j 閦3g]זH/NsV &О00 zꑨ!'58R(ZORyݻ?V(Oox@<csZpttW\<)7;e?6(lk9VLC*0ՠRe= ٝoz7hPm|.t \n'=2a)B [3O^1yj[f$g _k QV?~ѮwN>FcO3u^3L_yp??)$YI\ݿVIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/48x48/displaycal-curve-viewer.png0000644000076500000000000000675513230230667025732 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe< IDATxZYlό0[5!C%UBDjG[Դ$-mMj^R(Uӆ@Ya+ű011`c{fR 3s;9j*![;wyC?z%3YlKtgf6َvNNnC'rD~F|pg$i($RO@nA@CT~3v-Cw3gUXv^ԟ$ʒ8VkMm%zRwΝb++ ϫGAEVx8t2RfsǸnzVQԈ+%:U*޲e˫ׯ'}Єw%V1%?"#%oroi%6h¼a ϯjV&/777?yfst5s1nҤښ3=KD p?E)xEf4JBQ?uuuiOwv$m(8]&IPT2%7%:Pu-/9+-T/ ر#,xkԧҦ8sٮiov&]M yz@Z4TU3i,XʙukpI~mmm8x{9/QILLɸnR#9;Jqrn|O[@m\w+NL(s/iMFzd.ẊaɻBVCdz˔vUG]AE%=7 1v {~ Gi/í|!G弩e%C׮P` J۶-I>7_mh@YEsMRҁ&>^tCZwO8'`{F4`pv-*;Om\kɩcr65S6y oc#iLD1wI HBs DWpb·c֘3-A`Ac4*8|n"ԫE쿯:{niOZD/͆kH' TY&UnVx#q;/v%@58yuTGC5/782{U22 "=0k6-Xޚ^F* +Ebc\ض P C }8G2A[vG;' \T}jFB%!00* 3cB*; 9d&SX7{|kT9'n{ bp[_Dwl#"?6-DN~ȵY FKwbM'] 6n~To.U㣟챭Vc:']bD P-yj-] =ecLgݓKxkn6W$zL yL((\Д{ Y]Ɖ(rV8XٙVojWR?Οy.  Agi! AWJ$4)dx'[ xy %O.נus8wb5;?$7Ubfriǘk\PtDTJvtCK gkBcn~޾85S$/qgw~t "ydk !D909t:ސͭ+oU?&Ԝ ?y=db8 hD gbvpˆ)aqzp=x[S*QR#y"c)j?s/Ed=$9>(%@d\uQDZ ߫TEeP;V5_,qp(26oםFRs~\B>mŚHrio 5t8Yto@l|7 uSbm+:iS( ],E}wbތ$PTaD~(;f уCN@J.UqNL,?̱ᴛA!Proglrܞ1/(BRf Wnܔ!dENd7&) )FeYJT2SyJaϚJž85)FyRB)ˊ5Hf1rx(7E m70޵ȕ 8rŘ d"wt$"PWԳez']TD Tԫ:MRK(uC~^WrTOkYI :ivUQvubf52;VNNAP] yTSk >>zsʬÂɁFLn\f.V旎g\!'f)P#O_W琶bں_*Jlr,|N@kڸ ""!h@R>,`aj1XMF0 {qf3vza['3 5~ob0`%L"Ct-mY$#5W^ɷrVnc:9h'9Z^kb"a& &R^FscvziĠAQ?*w/#ֿ/KGpb5qPo b$i mK h3M ZNc|`N:%ŜhgY (_z)!kl0%" c4X#mCXzq ` AO?Kh-|ĚZIJ;Sjkр𬋀"$!B0(NJ9X܇M=_7lqgD O=`rgbhir仗ZGfN`.+t`}- B<i8vy%N8\Ѭ~ͽϝ1.ZcSJ ' n4,EqoFG$|`eŷ|>b|٧)rŔLК>A]0H(Wc}k:\¤G C'wM\Y"N`Ld)YHn7d'wؓc( *fۚmnĿ>[_َTC`STf[x#aZX8Y~GD曓S\Djl|҃ؼr2 i.Ժ־2#n_~E{?bL6sׯ!e,=@VD͚A0y9?׈k 859@:!02>g [$9qa'bd)xXOfK[6ub~uKlP_A >"=gwh)ϱRlr1uT˸ |;lG#p k s-7=V |\jM3ɑ H$x0TD*c2F^(ޕ(61RqWnÆ!"Hl{Q1rG%c,3 "J tnGibfIs|)5x#HoF;s:ӭ7_O0 lː0}Йp>(q,s<.mC0È)W0NEAUQɌ~$1"JRG.aP_P%l =_"&7_xe$L!0`P*ՠW-Z#s9(W\ޯ'eTR~fLAhV,".C Rt0=Nu8~"& T0*MKFjxGutpH&/\x|&&"qu"(:*!Juko齽XW/-[+-U!ǁ=}TGL1@ @1R\r`\2s|J?̷jVNVT)e4tGҥ{^?ژ֮%NVKKߨ=<sn:$!y~0~=}|G+Hr\ #rfo-q;M _ g]5>p& T%á|O loG-Z5o,Ґ^rMm<<IlX/%c9-.vHU0{=Ui/ g$g0D1_XZf8M1Cj3C Yl.决HbVXس\D i::ѓ-3ϕ [*e#_;Z>¼0xƃ VܞiBCKK[v?.}R /wݹP8k4M.P$1orr=y[W#}VmFUO*rHaw޹[a]}5;#w||Պ wOܔ vm֏ YQkp3hHީO~TlqS3Ksgx67|Kob:w✱ H:SDdr*C45N$$L!"QUJV>U1tdi;=$Rnum;5WZ[RFM#K*  f" I\g 4E\.f1S>՟=V|aI(kتwLNM^HUǢ1vJQQ+F&#uT0U. <g0[?1S~P-=*6|fͩTnğF6M1101 6LR}Ij9KoR{|ljJjoK w͐HRYSS5fKfbKN{@obU"K$|r[>]u+-잗|1v3qx|%Xl,sBB.p%ӣfb2E@^kFi?gnC^.(m?F : G>%[t|֟`r9>sIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/48x48/displaycal-scripting-client.png0000644000076500000000000000511613230230667026553 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe< IDATxZMUW^kW*hAkD @&BhL ˠCt: FO' ֩ j& 1B^{}}jHwZ{}{DO'.uc#K) _((mOA* W q? l|Ҏ͆(#-oܚ+mJ#}Ko;wI)@&,@Mp/d0 )a}mҮN|f ~]8pǎ?+[բEZ&'[*V•zSډ9wJS~/9np̚|P htYLM˷‹37nܸʘ5vw6 }9gyC7ױ)Su> ޽{TغuKEo&>@ӁU0H1AD7֞TUpѩ*L%|; ])-7Py6DIHeܘXC4&_ҖپOOh_z5ϨS_ a-h=Q-׼xr65 $Qsڗ R9d5X밴s||2=zt{ -r>~dW]$@Qk+4R5o ȑ#aؿ?9s6m+MJY ЄM5eYxV&/^e8{,ٳǬ-(S lI=W8CH!O9 6nJ=_K\߇w®]*ڵk:RSQ p;j h.y㣏N">\޻Ç֭[u}K=kEЧۈ! oPW[\uwRn޼ N>-gpԩ.G-\A**@ L` UaTLxxkIeF#;*MI0:p>,9d P+@Lc9aYǵɓ'a۶mU{'`nnL/+>dR*)Q+cu{2f+8 +7K(bM2A.VpaU+W~oqfffVm4uHJ cE]N$3tl.x՟tSo*i( ɓ`vz ( n<jBEhD(?~_^phw&]M.fTVi t_G\R. b(>6+dHI:.\i+e9c)TX7VbNƸwDKwAYR\\XXt LOOWBb >č*b-=H ;l-ăQU'{mc,Dԕ$2r.mɘr4/+IBSKvĭb b~€XM>_hF h╊l eێ'J?r'1.EIQ1n}ԃ*jHUG10՜aJ(+e5qȇ5A(gt,Q:vwz&>䩜y0R,Hh0zn#%[IXeJԠ)/Vɒjk2Q'w eDh$OQm6Z%;͐V!ECsK^Ern'wU0jRn*luO{GjW(3HTk[ @#h`'؟0&j&\0Prb'U? mM]6XxpkCOdSO(lkWE-; >c] ސܹ-հZ-2H-j\_()v+ҒK-^r}|v\e+c ݹ(k^"9ŬJŶOd]H}hwʎ<gz,[hLp]U{߅ă)씚$߼rYa*NNNX^߿ nCA cRbXx!}5{~~իWy^34W5k׼<ʬk ,J @^v K/G})P.JMV~Xn߾Oc_ᘘUyʔ 6~ݓYPVfkaERZyOG t^ڲIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/48x48/displaycal-synthprofile.png0000644000076500000000000001064213230230667026023 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<DIDATxڜZ ysw؝eaҢ[BEQBX1r%+䐕D媔TJ\R).bD±)J0%+đ`@Xج`Y5=fgGv6<FA| !#2A(aHu x.\[6|kQל" hU'B1/TK% D\H Ybk'A@@* 3 AB-$/d UEcY5Z{$U3{$ LP 8Sșc}FK*FX}Ϧ<$R"b, M6 d bҸ=-g^G(y{#fU}>!zm{[]PJ-s4IpcWPTygϻmV _?xnQQnj W#_uHl:: D 0 ]Jw&( I2!>Z ~{r)LBu1K4nZO.6c[_"Уo=}519$0~Le : o`l7s9ff CX]!  H%0::  Jvǟd T1R-i>U~-.Cbh^ brKʗ |Pi/@ A(fja^Tt088|F&燣uA.#8 Z|2,h ͝%\7-`W$&E7 VGx=GaO8뿊c=,˨añ8`L?aD"nރs*;s-rt^~MyB6=ʚZG*<8 [C?okk/]˹! 5MI5) ƒL&s5R98C3,:BheӺel>|cHR7>)j*SrsWi F-j ώ~ |2 $[g( S^E:5P{cѼw[ j,Yu.(5w>\^ V?ZX42)ĄMa ؖ0e1p~D+sFG^ޡLŲ,(ޡEԾ!ӐsA>Kd2{|!A,.G nI=l+Gr,"90(`Kd8aYoh;5DO0?Vվ.zU'(S Dqt@Z&V,# HI@@JHQY< RBTCP<#͞ $AFZxԡTQH@zRQI@6!Jݻ1QIlpAH"MϮIЅ)q۽mvyaɌ S险,dqL87uC#9RI5RD(3QVr ʥ" PyFVG9]r ?W|A+qu#|RoFvn˰+(!XzɢhfxtfvfAjY&)]lVR %(LMMdI&CL;BSkRw03Z0ĵ3lْ Ǧ:D$&Q8%EKhJes2E wfՌKnbJc eFe4'mgHvj{&&DžYp"Cz] uOZ?iNXFfTBuDEgBRzfNinƬŰLyB8Ϸ,Q9>};.: b;ز"jPcs'Ȕu&l4?+gvӅLJa2'.cVT]y9,7xL&2$CP؅%]>6,oYb Hߤ9J60;<CZpqCE+4Юli &rXZ}95e\"uqc*4Ϳ 69^9>,*I2}/=w0cjk,QW|'=:wS Tvo0fD JbW,DF#H&$a㜇˝WLO}R7ZT b!+'> G @S"XW 괜B& xK.JtnIg`b|-u拊 &.&wzpCO0\ ̅7j;Dl.M c BY >,Xe`"+ 2`UnF2&<8k,,=ľV:OOOsjzt/=kH#රmpwJƔ( R^ tsEЬAb;Lp-Rj_j^-Z5τ#Bj^:CD}ZT7{N?/Gk/Iŧ@炵Y#`ddd/`WhuwNb; s"sVh6CD _" $CC _$.K:n_)V~\&b[12@*> r3a:~R鳐/M@B,e^i*CjZ}1!|3tA'͞ TQTt89;[PxY--^weqr5m-7C0QB06:"X"H39rEJil[{QAY2Q(􎟂{?}/4?K,]DwyPzzHdq(fJddbvQpą` 4AB OىS0I^~zɵ_n.Ёw~*.iibMעQe_vI I8:Hf's[ضslf$cirEFC'dfftl+͗Ry_Vx%; KA)WV8Y1\`hZ-G2']k6A G?yfis\,V%57݆O3c+ROT_W~rvź_H w+Okvsc!]'7I ?3w?;i? JiVH}APJEO"Q!!^J<H6$U㔤]7w]wmaΙkܹssΜse###9` ?m ԽvU;u/qMW]KY{R@G ԟYH5J]RUfRAT$N/ d*&Y"XEjzdYbjScT?ՉGD`1ji1{ikATY)* CݮPUw>H$~w 7OJjXzrƉ W^҂,ǯFkq5ÙiHj,Ѡd\kGfRóΞi)_| T"МMH_RBqBS&a!1Cb斮A CVJ4$;u3gP\6imoZzX>wwuCsK3aHb& PU ,,,JF[ZZ`pp_LJ5aW?$I# W*`vzF]ӒggCsGԄG6U4LojO./~Qx`/#/#o t ^^z [n?ʢL(˧Ο?& qOoo/d2+.%+ }}}*OM/)O1CCC000qw*zX/ګ2 FjT*]Cd=MMM}R>FG1WoDVcFn"#_%8R)o jc$E5Uh塍R3!-2P(\ ݶ*ƌɔr3v.m97~yȜ v 4 U[n?UCT3&alB2'+ !NEꂐ+mSrLl# g; P܏Ėco.DTvVH*dC,5bqfd ,jFykssshB"ܦ^oVhᘅ- s"\t фń!NA"B a~~AO|SSSЯbtnab(RuQq,V|N> $Fߪ,--51{*JoovHRww0mUuf<7 yU!@!xunemk#;S~vDRၒX[p?oCx߇ޯt{jiX D#zԩ=0T{3s09Y_W`Bqc)2UP>WyXʪ.Pn8rSpIȮ-' X#, ճ=*S{4/0osH‘#p,gĕWn޸=>tkZ#D83L;{\qd-NwVHyWecP8+d ^RA=dFs* +#cd2mXGq!UȍxacC@ NfO=·lv1b2~-{OhT2\f%LX甁4i8<\̠c&ƍtvNb*r .f01 (vDC˂3K[ݩ4B{*5i{͖Jpen^Iy՝է8m! ]kL&0&"x&`7tuK5_Ek!H`lSYV/!h]Xpoh d6vf·A6ܱ|۷+ d9w&-m;ʄb*0R)N!W'6ؓ &kz#!ugRA+m."s H89BNC?HwSOz !qdiWj}6 $l!q$Aa~y!N> 088޸Ը 4wpJmfR!zy + iidi:4@*Gq@H#dE0:u1K⁨TJ!.)sہ"&֘QY1ֲ$j 9z:J4B@g!u}ɵeP4b~ƀN'cmb)AA&e,g+=V?#~}nVf4E*Xi+sk0WEɷ&Ą tuv~uaPhh#ʩ@"f^XcJ9ȑLnod&=HCT\g.M4k{̄y1Y ۗ*/N)TΝ5$0fcj6D^W!̥LÞ0h~3x'?̵JABqG}tVS|0FTjp.y']n&Ya䔙w2ʖRŕʏGGG_C=&Bqo566ts[m !V'|Pe6s9T'V.wU)"PѠHrT9}{bUi f L$*?M J#Owfxqc;&4A6IâBT}Q "K hԨ U%ZBC %jJؔдlb8Nmk{{{̝;D0ٙ9wΙ B|7 M<\tyxfk{VzW>b&qϣM,(]e{v⇼nC,[7&O>mlcuk}n~;%TL?:5Is[SMcmiXF][ _Cd`Z/:|C)xW{]CIO- 2lnj "#ó=8lzq[eyAOZΛLzqT{Ē(؎Rٶ[=yk78VU81=yXՌ% .: T;obC x=Nֹkrj#Qi_p{GFs_~A.].tmMj鶜vۑX;l:]z:&[in357 bjSyD^}n0#h lL&b,`zn[moWm/*d:^ '"Qw:{m[F/Ph>yk~)?hZ{״_V屫*U3Kco/!%O.)Ye(,mޱmftv^(|acB, ^j ׍.ɓ%8d³PIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/48x48/displaycal.png0000644000076500000000000001231113230230667023272 0ustar devwheel00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<kIDATxtZ Wy_wOJڕeҮ  vqc!p !T .۱PP$6! l)\F`bGp0 m^Kv{wf|{gv Y~zG BlgVٙl]W8a?ٛHr_q"I*sYYܘux,m)ja}"$!\Hp~?OF'NY!͂)?㹔]e\\f+[QuP$$VGy*"VACq6-̕F SCͬ]m{fho>IYmmek׶li!Yh(C|lѥ@&ø f,<P8JbL=^t3/9>FùE$ֲwΞW#ʔozy =-Z{?ҫ'oH 촑# ER8%|"PmU:c\sJ8ZSRYB{*ݼ\Xxf37mgԣo81ж5!Ɉ/%8EEC[LijOqULc]>k-RE9ww} Q6  =a3޶TiQRz cA^s2T x D1o=[isk^O yEwQ~!oCGGC{{vGXlV8T pYCqk̈́޲Ci`d᥵L )}pD.Gp3c$l-6Xe=%+/nhz@sD12R(zPn/Q״r#$sz_+)-,4@>0,pt ]W4ݽAϾ7ȧtΥ $ a&`0d20xhox__4R8+@@"^Ck,hj 7a8q> ,yc\ :YaZƼS_|}32G~z>48kY G!"-~}Ԉ(yC| qYx&<\>C(YIbʥ8*Cg" n}pRW׋gBI]"bp-\|剺Tg$i|ZuFlQcgm~ĉ@6ێ\D(βS>P*O1tN8R^ťNeKs#ʾJ%C\Kk==z CT4 FHgl[5o3Dr([ DVau.ai Z8Α([HE'MXNj.D^BiA" moqT6a) [߻]aH3%RFs;[Oq Q'0LCL(~Nx "3)s٤IR=HhÔ-)l9\/K"-{։.0ْ%׌_A%ϣxv (ޑkƴ>ٮ},kIi/@q|1mN^K[-4B ,}J%D'ƺik=>J` /JXw?u^ AeŇПum<AUr Jw}NX9<;s tQ1` ^/h|^ihöYh0Ore(Sm#*l ՅaG]Ub y *ZrbHXˎ;d+Na/Qp+E0oP5YӨkj4t"鬣s`NnElgYCbhaiQT;I R+q?t9$ Ck*iI洭moѹN"}M~eN2s;LxޢyYg--&;GGHTX.hVSy Ozn?Hߨ=?kAز2Fi(:JIX\σW[䂚[*Oe)?Цה!Hɨ@]O k/hͦA M~aG)wdZ3e?_ 8kݚ9:B[ǺNm`W:;k}OJ.8V%JDZMEkYmy6}4~Zu&'D qb]_EURzY _瀪5IOy>*2LEZ<2IMXtEB (fh9koAx_r&˺i)+kЭʖrT^Tգ3ބgL=yseSezԢ !<ܥqZ:L_G&?kbV' xkˬi #,+ Rl-R 8P,ل?Tz!J4L [\D hE5/es[hoWlCVhg٬ϩ4Y(/c94MHR#5GD>|eg'!LA j.vMEw4%ȎZH[奡(Ue$ՒZ;ޔvV`T&q2ulaKvo?x܊4퀵9t{,\o4è0u/Trt (m3ڹi˅Hv4#!d)9)BX: ցx֡ND EbG [2eJ6B 3o "&[P7cX#|(;HBrjTYã|2PGeէ=;cǩ]ۗ*+xDhpv0LP3V$:8cLPO2u{e`(q %DJ{*Y>edccT$uŗ_ ik#;Z0I:.)#xCuٲE`A9 ;6qơyXVi ~gV4 %m̲r!cA1vI J쁚ZKf6zI: LIGDOp+\/=!yoV+hud|FW1ikOb#%l1J0Ȳ ?AƂD"@R5wOŝWN '}dн1z(ʴG# nz* #tAHY6R&e/ }+$F n'ŭ5f'nLZ&[FuοZ -O#hTZkBZ1i-TX{,xuȺZ_xYƫoyZ™ja7|OsĊHLElȊ=+Po9,-x:+HCw!jY:ғM[ i @_O{aח{QkJpeZe%Y6iSv? ϵFUg&fЩɃ:Xw~~&eJ ٺ]_[LBJGje@ D,V4 +R e)*jҜ?yǾ,/B(.3VBҟT㻗nlM|Aq0cG]{M_с]>2UN͠S-4=->Vo\[w/vVeQ;LytCpVè>Kl<.H SQyKq\U7T-ʼLwzt: +;6 u7_zӆT̔hlޥ}'u#|X;I|N{h\1wbJLvRHvgV(n!vH~?V,'Wڇrs;(mۢ&L[-(y8F!*ce:=|8~cL+nV> ܼMw͛qV G͠t[2=]ٳl*ln2 Q-,[.ÿ\\Vަuzƛ@/l"` W5Q`  vϰJ*R[á{p=dYǗKqgUо-Ng ЉV@IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/512x512/0000755000076500000000000000000013242313606020567 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/512x512/3d-primitives.png0000644000076500000000000020015313230230667023777 0ustar devwheel00000000000000PNG  IHDRxtEXtSoftwareAdobe ImageReadyqe< IDATx mQֽ;;/42 $ !$1 QFqA !h ãL*U)llW!$ǎ HXJQllP*<"<5{^k1ݷ=_YD(,,,,,,e@XXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXX)E@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@XXXXXXaaaaaaaE@XXXXXXXaaaaaaaE@ا]W_3Z~I7D5] E/휃?ϤC;}=Ts܆>i^2q1.?n.,$'g~|q1 {XvA# 5^h8H~g`@@`ϑPP0:?'FO$&@@:`!1|5:LueezN|SoKn/\_[|>t+/;$Mku{0kV'b+JR-oy{}ﮫ'e} `sPeׯTj>1H[!Хg? ߺis`$ ,,aR37e$*[+;&x8nx, XxPnYW33ߒ~f~rKUe՛s1+&H&u&0a/?Ϋq^w=$?H>{_ F&V?'xmtY33@q8Lr @P׫OI->_ռW+if`@2hH8$́7\WLoA hŭ+ PPK YCe h0E(Evyb=~:$2y1'! с s yG/ɏ0?~a^ :\ɫ_9ھ:vrޕ| |msG(/0oy?i,{ec sU7j_KUX!Z_%uYgn~΀d({[:hAux"|A)Aa$kWwƩKq6>u&"n5kF{}|e~Ҽ+لκLNޮK[gٿɜɖ2qA[2:cIC<]|8 /?@k/TqĖ+i` uex_bOz9~ x|l$B {vW\&?ZJ`I5z\ȟ@r1_o/ Ώ<-?0? ^ Wf?,G[דPX$Armޟt~??70:17 ZF=ݯ̀$p;vSTP($҉Aّ! Юs`?@aa]*WnY ':vuANFݎǎ/>?/}mߘg͏]I!6ݩ:zTǀ*Z&2.چJs|_/@}0,}Hdaʒ+`ЉWy@"ZRpLl#p~mд~ f.o{@X a-dhV8$?6w?g}ɏ_oߜoʷ<|wdI} @Wf0qt0*%}rͱ)h%unv5{[ `CگK~$?^J ?~O^ f/4ƿ즼hHB=?\HXL@̑ض@KĔ4k@m~А7퐶.G2'aENӵo >ֵwm?3_ dƈ,~cko]') Ro3=ߞW=?wy;Cm:_it,`a}u{OY+c%-{̑,g"G>ϖkBVHxF-0"]% `,*1вD4,x] AB[@TGj$R;O4&__X:%>|w %/r^W_Dݑ`'4q'qUDBU<9aR|'aa]Ib/<;wO+wp: 9{b<~N;kQ~v-8Hc]L~u''2=`[pV| AA{Ib(B`w7Juƒx,A}ɔ?yk75A lH~,{7UAuŪ wiIk6}ʟ~z6=O@̫qK h_i`A J# C`Ͱ:MD[%u,6p$!a?)?_[o]S$EkO#쯭-@=V 5*hoAt#XfmHA"A @0ZBrر9D7``\̀ ҫm_ͷ1xD+ńY=1&Ol}P$6S?s} `RA0ö́R"`]{ LY3(:EO,7dgy;GD}U§?X5;_إbY9!R EaP\*^Rw4נcТkw$Ka.wXXa`,F~gVUIOP3@QsJgwH}N3VgJfW(YZNLy|SG?qnɏޖw=aȰP t om6L[0~&mR -a Z`[ !2#1 ~:2[1H;Q,y'_aY`@~mc:* >Dul: E]H2~7eƅ+„3 zІ0$?8tg_Mߞ׾#/WK6Zj)bkɂ:pU%.R\!TSGj9%Кh3=XY 0 ,8LLs b){(IAH L|C w#hH@ڔؓ]{]'Yd<"םp2*aKah@ 9;*c =ݒm{#ALXtϏ8?3ˏIs{9+ZE@sq0Vu=wm'!_FtEvLlpG4NuO^|:ߐ_`4o,fϰ,1k͓;{m~#ÿ4( ˓ ; @$QH:!foR_> t|SXD}'I<{9?^EKf,ӺμrfI }/5χI8(ETPD i[@eEG]Nҷ{A|Q{u"߀GVM,;@`SD$g$ }?gpm8xAly-RJjq$v}%u gmR &?&2y˚C[]2\6`(aCTUS=Y5y&8T-*Oi'$nQXXa~Q}\ / 0j[gW ?vr3B [vQFTHgɵ,@%7h@(EX~2P^|lW)”[$ݯ }E>Ư@{v? 4TW=W'm~dz0(!@ JM@MHa])1ɵqtBpAߑo/ _! `َ 8:/"ơW~T6H-HD~  oy@t4 (%֍+E_ͯ}uލo=+~cv=R0|ݯgO-e ^UM g$ ' 쒛8^ٶ =4{)||QY6s] `D@9ϡG矬'7/uQ M>iBD!` t y}: ҙ-}ďf-{^gW*K/Ϗu^[,>%&%K~5 .߇v;:`lD"<@B5G-;#{w2Ci^^oGߌgL >ޑfߍ?͙?۲GjG2C`^`̳_\K-,3WڲsHD Zyaa]2ǯ,qn ^윶mc >y4y}0}?3pAv[^q.:i2@+&x%{T(m# JL*5ݘU(! *Z+^pТ{r@H/Yv9\>:o%U_!YIU TUpĦwP M ,pK{8Zs{3?!񿀿Ăi~a7;⟙Wj[_hkЖDCpe-%(6JJAE @",0{.;@𰗵Fߟ8X-sA X8Gi 哇νһ7ҽ~re&cS+ $KKl /#C38@,Qc@AȵH6T^zͅ&R&&S/jieW~ ׿/gRXϫR )Za6¹6Zs: D?,ˌ@T!BY#U|!JaiY}m5x*v~ rٲxY^Ӗ>8yM?2uwNo3Igo\PţH.8WY2H q%jkJh`U$=+B_M{ZSJ5#{:hAE%)R 'Hh@؟(@/twCiQ?}߁:l)=nGCX aZGZ?}kn t\}Jl|=@Sc Oum7tҿPfX7( JRM5<ݯ( -tW%@!?|]Nk_ Kݶ5()Rϻ)Ux]?[B@a@d;we{ +l?;~Vu?r~8om?t'9>!!%Tw Mzb$8Ͱ:6A[eDKg3B#6=r9gG ߤ}S]OZ}yهgu{^7t/הt8a 3Rޕi(:'TKm2t tP FTxӷFOlG5fZ۟SԙIW\U~~- ޒ_^*oũWmPA'lJ**eV.jH!=+x 8kgKZ|k[`SU1d~0[ND?\7 ! z[ %z6!4G|~`xg2@k 77 H컮}ݯdnWY7^ `WMNSt ҧ^}َ{kv? ovI<7* /A)my/6j+ Bg '~H%0?ApsNmXxZ):i}R%Nv`O,KG~iTMe)}Lk)aZiYoc%=uXϳ =ϸC=?u^g7%:w-sW0=ẸEvM/G4˷7Q3GpN]M;O`-خS%"'F@ڔ &Ȇ;nd͡CLO %O5@:I9ruSs%` 0)O=2A`4QSRL8 u)X_靹ܹ/W_Iz@إ윫'9?(72Ї=!pAciɾ D~x("dQ+o" lOd9sиAS!kS-)Pw欙|l?`cjAC/B B *tS :&, s(WdWEl~wK'7c:s~"tW[>r@%3~.];V O[Fe3/0Hd6-o؇Ofm~<`6ASHwJ;jv:'t6ggά/^|,EWWXaP|39oǑ"Ok{v~EM(8I_C=~2Ao)!Ow# c%JӚ|!k0H7d'L,QI VVZа 2'ZO{_y\~EYOn~_X]B>|4J vq'XMa #j}Y0 '﫲Ez:{&t$u`XZ(AƔvhAڶ5A ͷ6B_uͥm`1A)(P[%v9~ٴJvdjZ|WY>1q駳(3vfI2/;;L8__.ix͟4lK.87YG.qlvjpR2=BR ^8 `Mw W 3۬ !%$N h=v`ɕ ,z;[mTJNBvMP17N*97+{/g%8C7%z*<8 , @%q G1c?_Vy8 ɕZw=?Flص}럎38؋XA;O"$y+CPGǾZl`E|fo35NC3b!H+0︒$Ds~w~G"}Tnk hmf8o̔HkkϞ[%K2yph׫ɯl { L;پ><@ mem? Ia+"CߡjJvd0y$x# ? 9k_>c{^B!ߗ>kh( ,~r>$CsqUlԹXhi \>LgK^ :ZogDߞTUJ ΞaLJWO"{̃0f@DKoY~N<* 8ϷdجIvwOϏ%b? 'a7VA*J6G[҇H ӕ~h&b65z 8zZŽrYFdTh dw-=?)e#~?{. ʑz٣ 1-9=rwND أ#— 8gyɶuA:f^0H.@s\ fA-o E* %S^p4o`}#8l'oA@l;W4m- m3y~B)F0wU߹]yD\P#鈾sJT,Kز̑"t#~g}c\"{Lk7"DP1yпkMw@~8jigj8(eɮl&fSPrC1%Nvx!m`| Wn3 zPp6ÏRn;:UyVHIVr pzfq $XOm <0sxqb{>i(! Ҡ)or4;iԈu0M0|$&Ã^|nzvH@,4,pslTk;bqh,^pdZ,$]v]ExEK?alZS@y3 1sIy`~:!((˾':r 03bm@`{^f$?I2# Ve@b)&  dk k䑄 yH\k`M?u? }o[T';FY ;P+5!O,=ťOk ` s9ɂ `8J``; @cɎ^Np/̷D@mK!1o#gItry0N dKY- X T[';8VOnOFkMS@Dy& 6pj{^2P'uQ"_`0Ak#=` lL8x  =H᝷}dkeޞuX!$TPIv >уlp2{+e2'$r㓓Wd~ @l{% ֤y;_}i^ /7ϓZUdǿS|%;bDPXaph B7COqQBe6B?^+u@fuQCX<`/&(Jص yRɉ`KaN+84m:&KC E! тi+@qdHd]'Y5^ARe2γH4'=Rϙܖi7Pd\ em \%~m^@"{ >]t_7;G 0tT^K 6wy5zdaskR7܎Ӡό3Q:LA%Q?|bNUɑL Q+|;_+ |Dq*@  _bq_dGO&Wua?8r_ q 70X}?4ַ A8v :hk$?2unWz*)Hd3vzvLv ,|6%6lON" '6E;;cɌIvDbM&rB>򭧿{jkfB:2X{?巰L/(@!7L"{$:l˷gf' C'by@v6sL/f1B 5}7%DH~r k*-@ *3ܧvCN irb?i@L#\Z _?@ '! 8F_A%lf0 AG5q!q Q-8'k #4(!Ad'6{Ǖ݄.% d &d!t P/V.ӛ ٷ#q=Lo%qKy OȁoP L@d$D:<z$oSb$bIMN^֙ux <5OlfSẄ́ݓs`3W%+,G=" s7OCr-TQ `#;2Թ -I'AR"e2?ldyz滷(T';~^?k}_VHk= 6UfkpjK$w.SbR`Xa^ @FЅ|+aJ*6+ԏ5I bmY~~iTx_ +Ak WVf0.M-xFՑ(@ SrN\Zi/i ['&6 QNIl 3uꭒ A[w2N+//iZG})0"dUv1/ߕpJkϏ_uͧE@أ߮v)#\d0A=z??n901Ir͹Q(Gx_2=Z 큄dl{:@m]u悪y6M͙"3vp lV2|WhsFeoAO''DqX%H4[: |ڙ-~J T_] ZhW:#bhQUTtaJeuA@Xaz9z'BI- O\AѣiO]{!ّ܅Zq~@ 4@Ki -Sr#l-ip409Vۍ -`t `N훚L<&p<;%}:_п;.'!1S#DrLr~lQ%w\ k'3#2\R-fLRA]ԎD&~_@XaII*P^(9vӉsvIv/Avy9l@0d Ȧ߾JH^CLhۭYٖ:DX !:JӖGf4FDj7>ip=pn~oQ2EmLWQt@YL~CTr ՑB 1]:SBJ0W6jqtr'r-V^OKs7%+P@w#a4 {Dҡx޷A\@!D9 v:l&fІk`lZKHwj M/uc2 jn` ./l^_y8IrÄxS'IйQ~[9Ѿz8?3Xל??[84za(BPS=Ԑ)soaawzr/?<9@Bܰ@-3LP_!;Pz)M;I;X*Q\ׂT| 꾖.Iϯ뻜*@X#e/ʷnIA@ezCU [H@i$lb(l?FB N 7A^tXO( [}ot R/惙ӐOMdb#LL&`_]>U3~ ]i!όի 뾦Zhd@;$o" {AIL8[sRqhe/@p݁" fŁ:z |0b؟𶼁bB4Oj08|VGMקTC.<$: \ MȆA+Zyg;+!z^o x"#|Gi0a@䈐+%11Uًiה1i͟ Iz[҆e* 77MDv r )=n̞" /D {G l H >$HG65d[C -WgOD:T1;\j@`r*{IuY7 )E/*'>INcq54&>Vw"?xV;_шDO+P]ڀ|Ra!A=w ו3daZxr s1U hp&@do3)v1c1n( n xBq$19Pדj' l' ץ>-h:=z N$+DBҙI~~ ?twk?jL#TE[c+1?)$6ڳ=j?取^<"%9,/`X_R( u :A+0{:N2Uq[O\WVͮ'Ql {V.DZh mW^94P_ l&QK?UhJ%O.?QmS*(}qWr-Po:\nAC `%PyOWr>hQBPZN  B)?x[W\ Qڈ.. N,TOF'倩YP߾%Dp*ی]a`]{G[ϣu<w@( ׀Mߐu6b=PH]!`"FQ(ɶ/&A!'hYF`~U $avϬ^s?uŅ,I^c:lP[j3L*DB_Ntm%VDi~*wlI:GBWx4<C.GeͩFҸS ^tT[:8 Hf}$6miﴅ5i٬!$I^l.#/sf5DwHVp Gvҡ}0%Kc8MU.{ϛOPI|a,Yu 0m@R/!ݠڰi&`Fv`OՏ|K[I" CO<-0묋:P`V.җތ5e]vzlk1{mwĭ=p%(:y/chCx;۷ ̣/F ௽Z8"e,+^3X8L2z[-DpbKջIhuȇ CXK f 8qz_;bqdϺ#aH4| w. [A]0ߒsplA[vPeDPeܸнMd{3v= 78OP~_N:^1bU7a.@I%0ɳkɅ 5dbߛN6#caT nh٧oL 2isX-d),;@%ۉ.;  M{bo7mޟB>JYQ4eeӔ@@6: /0d z跞SSC$00xY6gFDDp" T˺70\Caau6!^qr9E2`WA W|mցc\nmMf"H4<5bp %$W|;m'`:v/~C ]\)Α `yrp) 7sb.GF,u Qo@ŽA HZ n;5uB`c' >ONJBec7PUpf0*ʋ BTW:0 3 ~E1Z'u4p4g/rWBذp/4L;XD޸Sp&CfȣiǭՂyƳqއ-W6"z$<"V)rQ>7h%"K7CiNxl* ߖ;p~2;3M $ ~ba-ǝ;ÕHP8!X`zc^8xEvR//?h @\UGop 2eQ} f#@YҾNGZh(n$b[+!2 pXNx#g(9KqxH dMH^BGHU_5e@/P BowGj~~pB_}IϩBtԧ".Ֆ_˅dEye,s߿|!zL=)Ӝ3a?GWjv > Pݑ$ .`aa^qi)ɾ.Bۇj>A`k, /dApw>a_NZPsny\h$_L@˰C옅#5A@f+O ~aC *f/XM6H  >;Zř-Cyk@Ocn:Nl݀Af _09KGoaSWiZ˧D.>gL d\e&?r fX??P<¦%pR P 0%.AK "~>q8eL,{a% &c҂:[L9ּ/yζ69@oƬ:eFge܃9̩t%Ǹg("HwEY`nzQϣXZ 4:b/?w[OkaISnWk?A89Bʂj 4$Ӌ@XuB kd3Ꮌ{ ƌaCezWvt7AV@`t@Ķ D ZhZeuv>f6 =D fux}}”@ @k6$Cj؟%,J\frz!BC@<7/Rj4|]&΂ S- L's~ q ,l?;?a<@6NЂCZILD ;2mK <`+Ma$m 9U6!WgfXus6w@]u@`p 5 f7$ 4(XmJXtgn0JE-|zmvq ߴ;nn~ˉMu\૖))p HkH3$^=})/ F`aa[}9?)8`@(f/ҿZ38v1_Wadel)&@Փm r\]ݕ{ |(L7YT,g :tsyВv.hl8 %{lmIdU_# pCdi#F*P*U*' BS9JFLerΡSyuY窧ˈ ,l{=zɮރjrr=ЮOx#/h{l5vޢg `>;𺽗Mgk5 CŖGޏ~n%(̵/-Nv-̆prU?aQ"#$Sش!b@Vd4%0stm&ĝ /y}g+OsYll0WhH[8q2whL]W`&ږE6>7;ĀHp{_AX'.#=np?f'0HM)[nlE@ :4HZۡN$d X7 "/wBi$Yg ]ۜ BqRK/H_9,Ђ**6lW/*:*  _3g1`| ~su۹f?nB#ޜG~~,p^f$z. 0󟩳gPl<Z~9п{Zl$}͠ [PpL`U*k2ٴ&N)j|\~-D]PV? 8ߋ6O@xI{o7;D2 &0#j;? y"=˷: A-v:m^mԜ sGϭnnuqǍW2y>wdek=AK)m(L`FZB\ޖ8"_.쟝ojz:e@6GT5h8h@25h('e0ǻ}0o']|pp¨X:/@%np<~X3xvd!5!o0;@ fx9;aU x,;н1p7@a-:jEԑ"<}e] ::P2f P-HAtAޠd8)]U=WK/I$q))SeP^.$ǻݲ}':T@yžlZ`^zW]iI`k8|2f+xܰB_@:v`2~wd` A=;tciu 0"V{VX"͹[C ZM@8xQӫ)g`@JDNfiJGª Ha) 5h:ߡ^|]80"AۿY% d3r"3y4(YijCV?iAqԯ%Cw71 , |1|u*_?7u t.?C7y6 ;џH:toFR G:guL ,C-Ģ @`0'o.,F"{Yo9(s(flXLiH$6Zb&#y]2D;:v6#hĀ4"8x([eDލf ?n}5 8.P=ͦxͦTp W_cMvA2% )3M|֖%_dGJ uAFGI Hdλ0V@ ``5J"{<ړە?{PIێĩv*8&*x`chD}K[K$G>žwrV^CCسi>>1s7:"YpM<[,f- 7W@̀%gϑx 3x\ʂWL쩱хoc T -+ Y5f}m'$cLH: pQ ]kB@nԅ ٟf& upOw|[BLy8ۋF+5jjDFgrA6NP<ښ9 fӞ׳$z^j#QP4S;/q\nZi'?&æ'걁٥: -YWJE L0[W;TxRipJa ]m[ٷt!B'TY(x iM/ML :} .[[2֖6/5Z)^\ZZZOfqjIR[,[R]Q<)/`>ZԢS%:Ǵ~FY:T\_6caYsL{т 4ڳcgesW3D.$9]﹭HI*l^~]ǫ/9BP7Jv+kv7:cnsپ,ϏSR)??/~i~s @$%"ҜyânUzܰa 8p#`u3w^ 3i#눀^;ϝUdev`qcخ@Ty@ے+ AcِgBito=>;>wW㟩U4ʘ3ȌtVٸX7qؠMJ/@tP wICOO>8!ڲPF IK܊+FKo)is$۞}[%1=Nkw:s}ARA[g9`Uҟ_ 7RË?UsQ,OQwWHq$*mN$z Ô tn@楷.|/Vzw@w>>wvr]̃V=&"%9bN>7{p0olk߈>b{<߶r܁ڛ(2;~ Oq[ƶgc38vX(0`\ (x1!BÛV״6sf3oGFv:zv&n?"%H# ܱFb9 | gS^Qi{{uDe/ř,\t2,{\ 8n۱vrx-ʝnMk"Pc5D *?*`p,( )_OdqiZ?@@"+Cv=0e CYRE3Л9|g3/K\ sjϷȷo>s={zHY{e_tp@uЌM#2xP6 2~NǞ gչ6EF}g/S3jP У1f2C_??Y1wl +"q܄p΀EkaK_JƦ/\ $d+Dgo.&u mFؗ  w᲎\͉mU/]9)P|q!^Oх{gp½+W߿27:d|Bp/),]gm%(>C/Ús͞Ym ?X*0&y&j/WW75t rdOk/+~9TiE O!mC>\iS]g2kO:x&UťS'n4 &p+FXEe`&L63尗Hȍ aBs*.&-/ɀDVebAʪYX!~I܈> `|e|{7cqW>/Nuh`#?ncz_}=k劉P\Ƿ6O4uat q6xl/09C#ki&} V(ft[WAeTem+Ek sڗMZ8j倹:``{ߜׯknѬTE`9ٔ]~jhX|pjghcHI݋ ԟh2o*U(HqNndnjJ cEw MH̳1Ǘ}_L~'J}XNi5pw|?f}h]_>ze8zWgUe\_~jQWNx>ϾI E{?S `wCM kQWN>t;` q`1m|Eǯoq}{6gBUNeYU?dۢ8@B} uٝy?'$v[_o%,>zMn>OOܓ@\_^P4 FjaWG.2RWxF]*jF^xi,Rϟ`Q'^wȄyM3 EбdKs >JskPRhaW@ϓKـT|K^T[AW# qrXŸO嗏|W:W;* ~bX`cft_J1fjA|AbT&jI`- / PDczi~+tG@؟%fK=54qU큜Ibs=NxL; [+ J:~}\X9`t`t U9MI8؟1e3 se:|WȻ ԗr_[__i%cdZ!j 5n3 _~;wؠ~ɛ(4C@jΞLϿ :폚kΜ퐟I:D5 e?C[qdhسpE4c ܗ}w^%|K~'" rۓkevrr=Bp?;}½G{(z _#^ÅT0aJYD#eb$0rNy ޝ 4幔$]zwN\S+`b~@w/JLuk-M-s6dZ+] Ɇ*:*|/%Âfپmc3_ou@gxaQ` ȀWn]PI =li'C9XJ=8 >b_ݵ iq\z˩ܯ+9/ђ"$5x*+4  #kʈ<d+~g@GOS?vAh4Ҡ L= >tI,zlm8L+e-9EfE;d- x.[;!u9ԓ,ѿ9]l?S , zky@ O~% f ,ԏ}3mO? Ok}:]Zfn7W(_vN-pZ&Щ3rRŗ=h8c?IZ) $uecx[@@B~3 %PL֟v`PRNJ &%m=ߖ?\6җ&w @أ$ӎ0ϟw{gm}aޕ@O~iQe 8}A/Y{'z$hv M[f)DdV^\p!P?|NT׫EƝ& #N/?u \/a)킠f2{0[L0"kz6$bٱa4bF`,t|n3eMOcwL? < &{U79q[Uo:!Ww̛7ތ?")'I>{-)i!@:#ׄ!$'z18?0p& ̀@dj 767W/րG.\]Slu;,\5sO Τ lzɁS?``_CO uf** aqڸiuP&{WZ¸X+ u@Ϻoހ+r0) G~t| :7%2Cu8Ĥ| e=|2G#Y8xMrODsMSsBdkŻBmpqELH!zhK4Iڄ"O?Ѱ}3 >j~Рvovv|us>]AKG@Z۞׶6(̳gUẇ<AYNxWJ_ cO'sN׋>zR_70 x?| 8[gys2驟1.g!l"GVH<HrV7I P#嬆E|pgR>,vOw4UGGQw l5 Yr*! %GN2 ma]ZMRP,i lu{W|sgwk>Cs뛿H2K [BxɅieC!# "6?Q\#LIWA:2'p!ѕ# @$z@uNxrl D{-7  kbA|3U)2]?R큠n,0\P#5K yg<O,@ńς$̳mj?vxg< \wAwVWTBGF2A^/j~ d)<{V/]℩S;}ɍ NgqX a;Ʃk?L$C#bG\3 vsH777)p9`p 0pIZv4=xS휠$*_n?5{~iCJl\pTjBk`(, Y }_BaGk=9H >|b[@]/bt<[srwk};hn_UdTZ*z˅jwvA9G?ƃ C@G U#eyB`XվѶ"O9D/u=MI D5cBI(h#z'r. 䁽p^BŃ?T_̈D: 2 dA]zI5:XA_|NsT/mr'" ~v>"<[ ݺui3 wv ̓lѐyxR(Cz;0)B8E)okKۿe]k 77{2u˱>@6&DĜ_Ls?Z; >Hl ()`(0Ip[>'>~8ىU 8`}sCk[łHA۶Y5r]2?}1WANm[lK (`)/̳խ}/?;?7]Y#ή_9oB&No Drm~^Hpz2ַ~ W"$>J͕ݓ2&>އE9eL7@:T@D("PJCh30G <}FFѾ0L@jd$E IQ59$I5/`#h@yv彏FK5mK lu{79  tQ,~_ŏeK/r;]~9L>x;~τ"jpi 7 :SH1@.%Vkrւ^臑$Āv2kw#aXH7Dc\ϡe~.cA^2NImq@+ol P@[&m*̳{?vuCٳt)pE^%+ޱ4vwլB= 퐕p ΁o7y]7&BvT~I̻9$A)Ĉ N{8F^ݎPAd 0폏fINXSs_l{&9x<JɿO1ʗXf T&@M&RKZY SuB  7WA^>ؕ9pfsb{o. S]Egع՟n_Y.x{!CLBRa=A/X]]kkB@וt"^_ HK!@f*ЋvY^;䏑 bQOBdQ (H Bn}p|yl kGJAޚQ N1gsѿڔ*p J*<AK#] 浫ߵϝ 8fU_\nw/p݅/< =0%~եU DqDr/rB*TcSNYg!(`k0'UC;Ss# gų!"xmϟ`HTDe%3jQF8r. |*! +n"Tfr5Q*{@ N?V8SrB8rXc`+ʿnIv!vVyemKݭH8 _pXNeGwRT+0G!?j>;v+`'l]$_QdU0 Y,_isd{k,0Kk?ƎVmbm"'ǎ-SWp#?'_$ǁTR4EVjb 3h)F6< _  8 PyvA.u6ч=0\n:3꥜qߏ}f.KtN!0L ={R&)] ]gzr'm މR;Bbs$M^Zu/5T 3>S*Q|R^D/ j URjH;}v8?ph 脁0IÜ6E{zgD8t{XABuE1Ȳiaͺ8Fj6\d40.x63wԜ(A/ $>ItB` |yI7Xn>j y8h>@B QD ЁH#p OL&6RY!ϾK3ЫDZ3)Ŵzu`M::l ׼0'y˚ol,g<[Q@·"SxК35AϜsܲぽCq#lwvs fJ}u`sO RGĹB路|Ŏ,+ jCjASA+FQ-=`wN}9D:@ߺd2k!13V^o2c'K暼@e8*A [#ش\ \36`yucoE [;>74^G̋25@DŞwIa%Jd2C Gik  5s5@4 CخtC/f9p׏5q>MCX` 8,(9е)$ϋPA8 P(9\|f['!r]pl;iv_~ wQ_z$FF{W]3' @0 }}ZG׮(̻N]"wmT]V$>KMB8Ad$_|gK?+~% A6* &yg#T^ZD `##pyg8~hPZ68e`_&h?7;}ϥv6 r=(`,($xZ9>{S9YT6t^d1|'Yj42 R0k `'-ٟiW+8=0Ob벙bWpy5|{ȷr:$5_i~6>eߋ( uЃ?ԁZkP* ~3 [`O8GY|#EnJtqȌO+@&$qPt@rTbpMliGgeskEXch-[ߪK|k }]9$uJPÜ7<} D^0dxIo߇ "Ed @[}r!@fy16Ss}`o.:?,Rd JmQi-PF4;t_GɌ$s\RyEC}b5u$M٦DBڱ{=t\erȘt }3/J$@ z7<ﳫC/;A|%"475wۣݏ@ Cg삇VlZNbd83 {O΄Cs6r_ M{T>%G0̊bQ΃9&^,AnH+^)Y¹IFA9?"j7_[OlAv@=-X0y0\SU e`_kn, Io{;SUpxXs:\ibŦslf+v2V]دdkgo(> !9Ϯ# Őޛ3~Z {~p/"MY8I2Ӎ,w5c" dT]&cCn2TzjIx %xgXca\g Y?M>~ =Nb]GF `1` Zas:UH ~0&X}nD@RWt7dO=`mdZ`=*wG^(R/2H V"u!Ie?W t$y(5x@8@>Fh9{EoSXnb94=1onU(!,&IB(tZ@| - :#5ׂڵ> iX:ۡ-b[!(ʻ| v  ZcC{Nee6Hv j_<' wٛ.\;}!8ָ\.%B"s` 0}!# @"#JɱkρNpr~T}' /B.Ha^@coi}kN{<-*Y2VȃŶן̷nj.>a#󅉾\޵ :}xtbuS?w7+ } ?as1#$reΩ~m'C#xRTh `r1c/&󚧿>Z~+C#^2Sh$U>g#S}>+{bn(Ղl_@f-B)aLs)8P}, `3Јgג]҉ X#c :s~9bnp)`]jy|txJ WVȃNX||XS zyt{HB^K!{ܳݳh)tf!@*E s&`&RQ{ 4"pS~W }(Wsd2<;`Qp# pfL$=zA* p!ѯ6/wq>Kp@fN+b'd2zI=0(DןBߢWq4u֡\$Dkĥl<AtEp\ҏM7Ha4/nQu󏇞p~D!u&GL 1H쐮G] o,hy}s_ug | 4C>}-kh/1}\Ư\GD\G)bkY/-}X9˟?ch KI_O4pHy,},?=͒y` +GYkw@|;?G`IVȃŎ?.d|Ͼ-xzPgʷtB#MZ0__+W:P~C`/ ?bU &ahASDrh1Gr-IDzf}Ad>Xg1lr0QR\٨;ka#R}K@]R;>[+baǝ̷ @o(F/ 8G]{ XQ)*!dyjqHѐZbDA'q DXC.}>Krma|CkHur< NDZ  BV@ORtNpr6p0z&BWk$~}3 om|(|sKնci2?]Zz61j/B __9LImDGZ˿Rp CzxׯaQ=ks`'轙O}L:-q&?AeF$ 2 <9V\|Pg฀Їƚɸ zH6g\o>^*iw=J;0`(]!q8sx/k\8'H f_Q˪}9}(:$Lpv@Y4,(?K~FS77( {.- ypkکB[>8q~H>`  ?6'DK'"x$@~؋p9wWW+* ;ZXVHv`5ӭvsLy1ӢH#3Qk΢)"92,b b 4i }D&ȃ;B;OZ6oqx(#aeځmKA. ٘hW.r̵2R$@&# VEx;pr_c y[̷^Z#R 9w ^WaAoq?5MZӚi`?tX‹B$Έ}dDݬ{##P"2߉h_GޜU2) RZ =-C.!+PbtǞ@1Erwϕv{E (N+$ow HB.+`dpr@ds 󯃮@ҧ_5͚ǵ~@B}ydKNSm&_`ZCH8r\Cwhc%="AX: a,kg-O۠^e,Zܴ9i]/nb_C}TH0t+UF$;~@Y3Y80D\ ( oNjfʬFn6k! Dx&xY]`ϥs.BX6d>?_X6gk _-0;@"v TMAuh'ЈZ )M=u j*xE&~U8&t6y\% e8Pu2&xzE&;~msz)V;O-`˺@7gHdq `!OCq;Լ~Msn_w_X=_ZOmb[Cv]\7hж y3yq$7o-E]ypA\N l?)Б*0rD->gbP;Us3g=d0pWzB1_'&oB@m_jGz86 d (f&2h⊠ǝBjX3jrD#YX߿Ͻ.8RȰ M|L:[޹x L!&$fDChS&jWYh0$T_TQgT`AY"4_|/֮G {3AK)؀+`!Qn @,BG &\|9pNhB`%4H1&N^ xyTm.pSUr@!#B؏"8ZD($m^# {v^pKb &2ߩc5EkN53j!H.:_XɌE Z4j~Fvaas_I9w9cW DdR ëAPl]6yNYG{;wV@MmUwLAƒ- l[s?xBL[.Gr 0) @f틛h ,H4Ȁ8Iy}g *Y*׺12`` wɔxoP@u[srܸ1 =Yx_!8R'V!{vK${]||4J4oATh ׁe ܽ`w+V@bŴH8P_Y: d C `ӏCk&s.k8(k 8"td;{HXBd3dNc@VHkB-fhe8 0^ŵ\p]x^@bb9E;sbYTVk6 0]iO3|ƟqVMq#%}G;uiz &*!ĺVDގ,?+;mx;bv@YFAH3yS~c|?0, `u P8nS4B&3M¤FKp캰 (VrV9ed3|yR7N])W^7w|x- Gv]Fʢ Ē(&,a=d=]`t"dF $)C=e7A'P:D=~ڵP7@ɧ>g#Dz?9,2B&)'Tc )O ͽg7\IXW~+VL]^#E䣸Fﷁ_Npe 4tـmcCuL~ E{?LD,`*=QH쯙-@}C̖\VfXP 9r8̔,@ŊbF=% dettz*!oA:9GXm CsR#k㤯hhֿѓ5y@J_b 8^?·#.?+fu^XFKz`d4? 0{#st{1?d >É쀕rJȜ `(HygBqY 10@o (V@bk̀^w =X@XX]9\K_D?rRV? gi'}LFӎ!;5vU߿U. D~mGC /7,5%<)+_@b%0ιא9Զr$@!10Cf!2$yoғ]"IU#*%mH2(?XՓ>p8!p&cæGL1d>s3!酘* I $oo,?U+Vrh-\s\F%|wZO@vS;N>V8WfvH!\S$2ؖOewC׀_l^)h3EbŶ7㯍HN8{k3a/bI>2p©`4G,`P4Auz\*FGEә<ۣ͛#Ab,oC2!W ;-m ,Xb@>}$"-io}%vUv`;#rq)6$01\g?\n#Pf1Z$F4@[ԅ0yZ@Im@5W@bŶ PC~? A0Q]ǣ+>־Qѷ1Xf)( #A &H~*o-40C ˱b/ .Xb%(~ )4 =S E}ZA ̣{Q),_ VDGC1ynHѴFyCw!RQ)?A4!`qꪴ ПhɀLbŊm >6`- $2,? ud;R7ݘG&YO;0TEmd>冣uE4Y8q>B F>.hNEL d | 8YiJ9HuЗt(.5#)@W6x?Kga7(bŊm_Pgge rm|;wf\ BdOU2cDP3'iQzαZ\AFde3C͟72· @bŶ#\gX#՟7#.Tz*%?$ExIR807ļ~L3dD)1&xhUf.D .(e0o[y(v+lHg(ϵsY冹;sw=Q\蓢0u)ykqx`4@Pc©dD=ז,@Ŋی? |5I]HsNI3iT&Um1ο ,z?*60ke (Vt>G.?Rk/^i"ҸȞwdAI;WH2Ys\t\0 u{Ķ l8O?QTm `V8W ~$3f%AԟOȁ#6r7_~R(Xl9>η&V-Y2H}bLk@ąx]9.dhH B "_rB1xN-G@` 0cb[Le'57a\ (VvDi{`AH# Gv-?_q0RLDrV &8 h|ПwI(1ٙ{2{u2¾+"!?p*?z6߸F10t-#!QMKNMC"`fApcu#i0GDd `%$:ӡq&b$yqs@Kb @Ϛ7*gڼL[U;ڤ1GEJIOQAڸLjfhGooh$K! V ; ZN ,Xb[j?H0ξ0fb`7N^Aq`$"Iϡ3C~9^^8̩¡򴎿H*AA& 6>dZ~xmg504mԛFy0d>G_: P鞽y=|+}@P^D4 jjLHJ8Aw& |0!B4Au*%"}4N m!Gr|ԨNTꋚ D+AxiIniD-XPuyPb&DAz},JŊʦICj~}Y ]nW)fu: SQ?Xf riyk`Їvj<1<4C]Rh,#8@ ёG@k DD0$bŶ;ERL<  w]Tx"v4Q0Ǧ_EЃ~AA#_3ZoԗOL0a 4 {_?G f (VVz O ʍ) M$Cf3oy|#JRh̀fcvlGQvÀ~rYl`Jؗ|-:<\+yL@"P=x,L#7`?LO?LFfm~ N 083zF Xz~.`x3T5ώ|Ŋ`?6/ \w5b#Ewaƹ{]5H> >}r$ 1NyhH@.#?$D~ֳu)bl:`G=# `*C6@X>a圭(X Βqmn}᰹'9@c/[ücCSсH Cnc1pgb6١v-v~)/Hf afPv#Ì|l(T#rٱ:Qd};4hrC jW4\$DvLPXrԔ1 ,2KDy zPZV=!L h8mmDMq>d6?@3`3cs"D43:fjbŶ;H#AA+z^4 0{t49@csjHԜ``^7W/A28nhx3}^s>3+\ po|;*< `~"sZ ]I257Un #&SzP0 봣$.c1{;6[Ŋ @&;)dktnﭿYAX7N+9ؕsc:SGg|p}N5 pd&` h/ld$;L'R1#t6kN 3hy $ϫIxY'77{GPX؞F<*Ct;=@շwҭÿЃ.cϞ;BcK'[Nߛ)}.k#*Zo]5hHCSޘ$e /NbgP%@!@D?q ]u92:GπtaILkvytYA+V#7 2 `ix`Uey;OeǨC[ǽwe?¤Kqy!=Gbv3 b9u \Ʈm{=Ϭl@(Xm ;fs,,,T@/}YO^4#> 筁Ce^v7b$ADs`}g,$6̀ 5 ,p5s`3+Vlwם13{EqaQ&e{M9g 00f 6Aef 3Z?r~lVO15-}jg (Vl{[~5V~S8C$sAYWO\sҝ9_1'ADh o2 3,@5_@bN=\?pG`--yNHIyXȷc)(&QފqD2!o7j}Lg28/ !uy`r.dF>bT 4IyNs.'n,2+VTh~C}KBZpG;OF_xb1%!hf=XM>_ѐ-Y}%T1Hp#r@ "hzkufl@Ŋ;3cϥ C_$!NX&%CӉt5LP7f{V̉ !cE4a %5Rd@vj>~X~ȩX7@׏[bN;v3`5vDN2%A gh aquGT@f>0 UZQERBjXAcC+%0B=ESieںV]~ŷE>5.BҤHR[AQ/5ߨ?l9> @bNuLj4?r!wOܩC/ZCT1\''nuίzAʇ`I:ʤ5N%\?[Pb?$uDzo pwYj<*ӄ=;QNFu/{bb%}hKgZmŊ *,5gax!5hp9&&O 'UʗܠFkY~A:@V6r̍G~hLC[JvT9%PXSǬT;{k~Zp HDrx}oȑ'`! !0ң:p B#@0@VC!^1[eY{^AZigPXSt E\S<ƿØpDd@}5:8lԖ<8@@%3Yz70( #lC̀C .z9PX@@ 2_[T!˥e!V ~\=Tu~';V5Gp P2U03/ƲRk+|Z.i+VAo< v3ff0h MG82zfaȩ'AJt >`dyxpVFs p"6utH{",d@HUfz;}\t ܦ[߂+v*d̚~:4gG47qOXP~t^3Ӎ7@/Q _ۋ{"r}(! >, H,h[DfC\s2@[(XbB ٳzr=FOpӮHJkc lɶ&(QZiVB>V)8Qi0]r^;AȔ ^&Ah;8]36!ة7 PK8QX)RJ;^G-oՂB`Ŋ;N(񘻔jxYgVC">SRm&yjjr@[$(Dg1H{98P"4m;m꜀8aR1q/9(150g`N*{EVo{I (VI9{wFf.{w ouQN;($#R9LEf`_i b@S}TfH`h $۾9 ~  (V{p@bnCU8}5ƁH9NLqL8yg#RnIܤd°#Nd-L&&U2)BT6.'?_~+(Xm)8(?ڿK7`LH<:N;UJjz(beӉrCMIg|3Kɸ2V4s; )2 H= o0MoR@+Vt@ܮopvgO.|O!q 0@#Qhs(叛Jy:5y 0q9b2P&&ECgxOZP@b0`xwz+i1HT>qJH]K~pAv),Ȋٿcdc $NcS!y"vad1R< @;1%ctq: pR+on ma)Ah;\+`3`I馜 0awLxlƵr!"oZW {6 p{_׿#=vP[Cx1\0"U0S gja 6-. ɯBzҋ?:g (Xb'YJ^l.ꢽ* D8 4D` ٣0Ck#_чR||. AXdPX)?n 33,,<)1jv48Kh(qEOxQa Z&#N{6(!_&{?L)zB ,G48䥝zn48 b Ο.E9X-FlkR'L#UҎ٨Ȁu;Z0IIi ( A4wX( ̩@L*jׅzјR +MYҺ&bZE#& a'0٣lOX<0{  !`[ѽ*X9< /6|fw߯={h cgK & ӏf6ѹI.2C֧!T9eUH~57?" 03wߗ X/L-XbbV_Wvv6S6Z1G[n3H4n=FDcbr#|v5oilR`+Vg qs=VFX\P;AaÙ ԛن)p ZNY_2LE!81O)`+bR=:M Hk'Cov~rF"xW9OƷ2tSA͜'VFJ!DzB\ᱡD@<ihM%?|>Br"|1¼Hx%%ĒLC1` y]c86m>Ql@@.MAFM.6wPW"IPO/33_2 +V2me˟a4= l1TpD:%=;M ᠎eѲӂirI`c#*dDwXdxý]g=5JXb' ٹ>y@t4δ\F'iR|1*7y&/<קGYǏY#19d=eTHl`w &bŊHCff{+ !\$B&T!L#7$rQQxӨ6hO{97* fg#X&'IݗH=̺=# q" -Podz faxB8EPX}z }Im `4G I&kڎB_H+d+ !~G LK@=R%vX65:ARN>^dܢC@{:'_ԩ(?`R`Ja@;1`hfnO~{[ h,>%@f旿Db'x*rfǎ?ݕ(r\L+HO;Gf2\m_K3_VޚkEK͋$dm$FC!)>v00b)f/>qn0J4PJ hEILM4YzHbGR&Ύ3F8If U@b'|=r7_R;XIR\orK#K H6NڨApc:4L?-ӍNQeUwc0:0 U3 =48crR+v;V8PUE}`qG_sL:a}o{»`#?E35& f ba,O tS$p3VXgﲪv=46`)]cЙҰpC"*ɞ??U11:_c! Mgh\Pwpva׏>I q[l+v 痒KXYƆ#Yci xܹY_ rdꣷoE0+v3N1G&Qw7ˬg1G"8AVG1Jx7T.z!O43Qn㔃=df! DpffpJ P8Ŋ${C\5 / 5wlyhK~8T֑L3Mq"Z)u,#'>Z3eȀMflbXqX@b'Ԉ  :7 r_,2 AHhH.E9:ǐ)oY A]URlǝS4h:s='T hH1v*}K (%.4LP] 4 ?8V:c Xku{#|8YҾ9jUWkE8:xQ^McDCMmyr9~K(#{ON2D3J,&{wӑ; ws錏. ip1Yߩ LY5 P@)Ct@ᷧToNYŊX[>HNOTôb-ǴّԔ!ifx3j 6HҊ*m3K2x^Hd1PMj Ya70K beVZt@fp) | (V$rNiB(;ldW3e`8,`0E6 O<@hm_ ? ܢ @Jv3W)DbŊ Z}w'z[rq9 .ѮI[d( Ǥ-Eyl4ƤS朧2,2[D'|[|:5-e 6v=dy]*,ɀbŎOW{_[߂}jgKuȓ$a:f^ >H:ϏD~nSD})p|))sp2@pLGe RN owO<t min\;?#w7OĮ?/{?zz>MO)Ƈ| S`닸O*P4ua8ůSC/}S@GeGYE6 ǜ;TΟw7;В@?锇z1q4ȺXOlا L '+1 Y_ij? "*E6vUՃ;eA ǒ.7omtrݮ§ďCo`@b?#;oԇg-ٟTи*wer”5 U݊-SLNjb[U}v=cC[FnOl=3UL{?,;y ݲ|AV/\SҔq{P'9vםPEx,_xqK5}`>Sxl{Ivgy H0},K2#VgTAg>7xmps˷o_qUZ*v|ܵUYePR: mt0/; a @d4hD|93 ԷEד8Jƶ6!?jWJNDCZީ:ldoQ|G<%~!_Ad-BnuL@6Ҁ9je~  .~xڙo3=ZBWs|{}vr q[/Μv-Ci %e-ӗb\@^ZIxv1hH$T0@I"#)c&@1u 3ӛѾ#y CwN)th/~wD폊t W%1f/$S߫2t', @Iɔ5.BX&V!%c@UϿȡה?!*X_1@)+R|(+PŶf?Ic>ޥu_X5٭WwzZX2Ctv@G`0 Lp beL.7^!ӗ4ԾxET qRDq/J%DaRϔGdY$~Y7A?avaDF` pm]oSN%-N,1{y>jv%k{q#Ǥ ǏI:)o)3\pu.P@2~.+1jh^0 tkZg߫2)/4j>(b[ަL." mVo?gnMb_#O:\ǁ3+۔8mV:.nb %c9}Xd1 pkSl"}7>3ҟ2LHmpik9s=3~eV"X1&|l0OgSdeo(x]9twH<KE TeWW ¢ D)۾~scog{oV?L;_z?F ĺL;0diGyEJ{<~޿Hqґ?Bo$ET?s:Q? hDM @7Shj?{7nTU -0 m!X(?P!isĂw&@rTgf]H+ ^$e1I*v\!&rL0NaTVl%AX6F1 X:@BBйl{uUm=w/|v$ϩ€i 0<ܸӎ~zenH`,^ncRt5Wձt,cC;" , tA|ֲng6ugj?F\rJ\BD$9P Q `JnxsRwr?YTjwg͹]ҏ:`C銁!7i0?/'Ϻ냦y]Ti^j*[ KP#JI4ǩL T@\"֦LKH!< 揭IQɁ$Xx[a:|V O?ϔ8>'~e7`XpW YpZ y]q<#쳥!I.8I#$KI>C7N)t&Z)+ռK0>S?h"MuvsbN 9L̟6&ٌ&,@g[I&d$'k~KesKU]Uo$  F?`!f)% 5I5 *@tXi@ۯE}'^%1AFz#{7W&m3bmBuwf咏ޒ8 9C:|l *-L"#_! =2T4OqJ/1nP/W閳'y,C\K=D@xԸ""u)|@ZgKV.W}YJFc/m9^I0 r`_s㙛 >0W069&@/"d(LsW_Z]7"Ype/ŵЀE~ 0&z_u{RN\,l .{$> dOuq=]z). Ђ`,X䲝?{H'37_-RoU>@  F?.smh !^2Glk獛T)JwJX߭[RP@?j RA Fr|QvgB/y{lp*Jh4@{^E[9;4{ 0 =R/ܨpU͞*om ;Wɰ<9>ş-{߻,NUKJ!h;W*xmk.ER(eQ|B6)}!

ݯ_BH^~h5.ϲrkοS^ &(hC$!b@wBW蘄"s74rPfc;uz[BtvrӟvOQ]w̅S.J*@ 0H_nc!)XbJMXF  Qȭ/=t'aG|uY'6 ob21Bob~]}͗>·ФS.${DfCP_ Q Z0Thlۛo'qrr7˟{!P`z ``@+#_(\hqSg/9BnUM4@ M `h 37я&ʣ+%z?3eL)Ԉ+%n}h%q|lv_w]ykݿNA ǭ(a_!pabi|Lq k/5r؊pt.ϭu-w^״)举r jzn`h;&5JJ@}e/ tg)Miq* s9O“'r{-Ow4ҡ歝z3QÀW=g^u =Vm}hnIؑ{wp?;n_\iB1JCȰw\ƘD~!h P Y.8L yeAύ{<:eߢU "#|GKᄳBh>O採jd鿌<g};l%b# /dOEsb:y1!Kcd{ɷ|ۺƸC5gmW;s?mwNjܧ ל9Вf FD? 6+tmD 3қ_yZ-9gr8nl-~2㣆)໬}@`MPxg@-*7l`lWoZ^MwF,ׁo' 7ش <0,夕.yO_w q=a炥xɊ?rpÅLSf|>]U*' 7ቷ f6^uRON^`Eh%pH묺\OŎփm^'ʽ.}osŎ SF{`y毠`R# +ŵ9yCrrESf_6y?_S7W9Ͳ+\M+\W˔ zWͺv 3)Czh<?Мd!=Ϙ4`{#sݝ/t~^KwGc-.SؚUh|({{B`ĆZO }Ek c81l0ayw*?R&icPWz+jx @ !D P/jKj_@zw3i< mp6C>7=4l~OXtwBL`! 9_Ah8^ _p꟩a %_-5$qa9c783j&}2]UJ֨ YcF&YL<"niNXjGq[`^ɟL-z:;?w[ݿlwՓ`o\| gB]:OT(`2)hef{Rن(a\0z B夫O;̪g3u z UX}0S iH``2}皩 /JhUNhEYnVAKi>}{_|_w%t~/߻KMdOE0Q0 0pش5˾LqNBAWI3m%5:%]= 8ѲRr@ $Ԩ2UD"–֋45L"vV:6>=zO\~(o2"l68- ոGױ0" /B`؇*&T`ZvuՈhQB$ tb_Uۜ9;fI'TuBLfn(:2y@O9@2CQ(\e,^"VW٢3j6J{ͻwmt^\CuK/? وIwA9 0e ?$IPOPx}{k"9a;ͅ/mN9c&,8ynaN:]sl:]5ðȄvXPj`=v.^Olm_`mwxv+G%+ F' _O "r*L]U"Ӕ0ТA?@x@Ϳb+=xؤXj( h?;gQg3k9Ʊ--5uGdfe25-L4+nVKn_" q/{󽆾;VaUvg{۷_3cC}7w/d0Xe {?a^GxFW` ~~©ʮ:?ӸW~a\Io qbTzo?3Pms# 0H᮵=M&N=zMsԱj'LnLNt䔕tM)KxbXvC;g=ܾ]mGa;~=Օ1&Cݸ:+~n~ig_yQPm%n߶b Q=^rgo^7<7T$ q%C0<@;MVE׷>Wԗ&Nn\ٷ|9#uWn~0EX%5IWK[+ J~0WTN{\7P[@E%>nkZ$][H~ъ[=cCd 0@R^ 씦yfɇqb `t\xD0,B0͏ @`BVXBtEd\xC@@|<@  J0Dp8| @ @@ @ @ @ @ @ @w(7$IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/72x72/0000755000076500000000000000000013242313606020431 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/72x72/black_luminance.png0000644000076500000000000000377012665102050024252 0ustar devwheel00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe<IDATx[klUm/hiUB@RiKQ!J}FD&jh0hjЀ(hE&jBՂ]jZ }m[7=Sevws/ݽsw:ͽ٘ ذ %㵱X\ve? 9JG/A񢵵UCPv={IVӧÇ^!,#$ <>}S5jPBxg'..9' bحIcdx|R$Ӓji5 ʹ"_x<SG*v:g2}'4eDrr%i%a倜 6CϘ1C*%$$fg EEE"??_ICX  SEeW'}91*C2g3䠱jj}ȁ-h(4d1$^?I]eg܄HP28חv&1?AD$ pd b^~B9a#>S ՄTv=d7)>~n[o:;;Eff&^~ب6 =(8Ue$MjooO= ׳j+a?ESHE½tÜ e^& )r,%HۀN³ȭ @I7nM <% ޔI[rH!Kv9i[A[us[ɬAmRKWIN a+-z5mp$M$瀜I$(cnn())R m5P (czyKG ʵ*Je2hQ&9D(gbE#enii1-HGM2E+];VWW'97.LމW Vȧ D_G$hmBnسrJ{7^#d,$(Ͻ<9I&Z,Cŵ1A|&)MtK![M0\Yl'LMok)=t*#B.@ڱJqKz i PFWe̐[tSКL\JxUx(V [šCDuu'&O,=BT}+џ"d_Ϲ.gu' @x<^8q„ A~BN"%\$p_\/JIIAo !K ȋ穣MRT Bt:u(//ׇ~2_bv VϨ^Av!BbAAdYQYG#F' FIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/72x72/black_luminance@2x.png0000644000076500000000000000445212665102050024622 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<IDATxYlVEǧZ5j A@@X1QQyɈBb"1Ÿ5QJJAAVY"Ƅ"A=Moou~m;>g:::\, @@@@ @@ "QebUUU6[Nx9}NvGm-ʪ|@V]_G&F 6PXu>("d["l+J @~ƥ aDJa! -{$V>-GFd$pʳlg(ϊ`.l*5/巣$XP"0[PS8blYӢ@ (ȖM乏 y0ȳGfγd}˄3zs?٧d W2RDTR dGO'$/ MjnYVg5Qm}!%yPsl5quaK K<L",?J4-?k$/Ѝ7U{M,YAuZ%N-K{(qM!~PeEbA8#NvlT%5Zyk 0-3FiIXcS&S${X!L~.y_=b8>Zy{nT]~!;<Fkxz#n,ԭfddkE뜄mkKјe^٨nTM 76鶗6cRHSnA=EkzGC8Ak8{ZTS*I`H:A{A&v_ ھ@#a{ %1J, 5b+|a#{Ǎ^${+ / oCWZB#:YfXꔲ1c4:)q!ީVyTV# }ass纜.@< *FsFD|D d %0 %]%m[5X>g@v*DqܓsCagM4vwSTW{k+qϼ ߣjޒS4%ToF</88,gނ1n< !d- S^@t>($nuzE"_'P|}|R&ؕ; CHf:VxzҎnRݽXP` }|p7/K!1ϵА@"i8o,4F,BO ,ixwFhi$hR(, .It07yޙJ^@@! ^#QdژINDZ$d;NxR~uLdWu<ɳV$8x(L.*!Z?-KZ9#_V޴OBrz{k0m.(ʛRXo>#/a຃8ӡ7Z0w]* @@ @@ @@H`+i|'IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/72x72/black_point.png0000644000076500000000000000701712665102050023426 0ustar devwheel00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe< IDATx\ pT#dS P@4)(j*>:i)5؂8(BE cd@R"$IBWvfI \{.w>jˣ5O&rss)11QShiuEPA]uEPmPb!С7v՘"I|tA;} 0"BRmذv{Jٳ)&&>*֑h4FTMW`(0'=@pHUnذadZI(hn]3n@S |":"xsۺu릪0ѣG;޵ Lׯ3gj_|1aG&|K D';ƍ}gF ~rrrAxxŊy.WS9>>i!sK$f_Y;.[6runSOl?^](%{v6 Evכk;v,l6*.)IsAbӨ#ƥ"ޗ%@:ܻiFk}K/P[S*ƕZ䜜]UubԸhz;t._n8`67 G.B%5l @-:r\: #CV+^ ZN"diASLzW5+WJ έ#AO[37 A0&]%) []7]:U.* 0q&I<9@`0RΔHD1.'_ׂnKG\%6@Iav?Ԍ@ Rdy&96 \-9. :3&S_oW84Aϊ$@`ڷu܀'S5v[ 6FE(|7gŧrkyyss#bǑ$Օ­Y'v1պ(7’V$[#Zwi*]r-Y2E%j$%<[Uj%F+[sȡ=>%4+AcTlҖ :g8?㉾?>2.5vn ͞(MvvZ} uΝ5e"rQL7q;ݍfɀS fҦֹ}MȐ'I B=z]PRax'eeg_Ί'Lz]wը."5r6Yod{X rշ937);k9MT.N˜dCޗH'ClUM$Ի>#*h"@M6eہ#FMA?W,b$┷r`W};Žv 9sP\\\S_ttԌ%gl6Ft+nDfN՝YVZV=x]VbYzukqV +Q׋OIǩ^'B-[֮bGAZ?u r-vN ~5G=Qb= 3A|s]X:.ufī՝dL]8Hzغ&]uEPG 036fIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/72x72/black_point@2x.png0000644000076500000000000001525512665102050024003 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<OIDATx] u}=;J/ %  9$8$8 1 !:$cB1`A gwjzf73[ݩOoםW]^.#'NF+)w 89qrȉG '@N89qȉ#G 'N89qrĉ#G '@N89qڒy7QXX8) `+uFTjKOk41Ʃ#3+|xMOF93u43>.$R͘XƘ˘%꧛bd?3eN1GO0B6v*w1c-9ƻR 1^codHk@Ũ(l%>-+K]$q|i,uBf)wi2w3B$|D <@&2 {4yM3a0A4nN I0Ad dCF;k6c|o(/I(^~a?j1e$\&8ʾHǵNB~?`,&5;_x{{ *>k"٥ily ;hm\U_ʸ[5LXu/- ()*?fU3m}{5RWu(l03ڑD5=Fh*kqvCKOl"۱sahp|1ā zWeaf PyH^(!IDע+,9g0@A޺yüm`xCT2c"fH,6!T]ў_f_}w(2,3j,V2V1i!n᭟73 gȿ(HF!SdmTD:TOwi:(: i Vڥr-1:9ކx.򶄷5񖢑LRj OYȴԒ!~Hh@ے~l9є! JDRʔx]Y?gYde9F dj-e\pLApHx?!Z{@*앷S@3 3*ݗu@D7g'o䭏< =Qctu~*Lȍ_H!X&P4BoNȌ2 -:q,1'4k94[q~IZbQUӉ@ov k6"1}Q߅S.e8]Kyrg?GbJe6>6.8x{C=OMfҼi Xg$9r coQӅ@(1@mK<#Kˤ=3qaDh "SVrQIԥ l:>ԮO0@ t!xP#5SW1H;w y4qa;My8]!_i4$gt,Zv~qdQ'0ۨ7hOU.]B"\?Oi0醄u(g]-fҀ hP~f5Pk(OB+a̡ޥz|QJ h # ¾%-eq5]lӯ˜db"bߦd_РNQ?!"O03pVy6M +uG MeAPYwȂᆖLŗ]%fm"jn.h5sƼjd6&ǦY.F3555E tVrhĭf0{t0a$EURkX5{u-I@6o ظhknEȼ4#RmH6^&޻g(u-[XS]a{YQu 2e 1ܠ,*D({!M]=Equ)"id$`J񇵴JS.)JS(]Tk#2c:He\~ >+jkS$M%<;}75ߗ$:X<zzX/ Lگ 3uD;wgS?>w&wWQX%ZG( sySiH J8ԑ" Fϧ=Nt=J NaoDR=OF?'zլYB$߹`UD!}k@4ֈ@ CP)v|v ϭԧyVk]naս/5q"cS$D4{ sG}pmxk*qgMUDR`n&j]mNkqt YFN1^$YɄ9;o!!L)"F#Ok"/` ABͬi\PN;Vp* i\OڦS@D:gުwq>Y+31.ć8'ϡyf Zȋ* C4Ua*F0a6oq^ׅB7T3ϙ9'Ox8TbRnv~8Z4RQJ9|8OGr0|OSwʣL~/0 IAp/.dDb5ZH;bISy=u ?ev?61d"HCϏ7uyL(4+4K3 j>($sZ}Z}AH$&,F8QEcOe^ht(SmZL_ܩ2f } xL+5DK&f~ 8'T3M ^)?;/QMKI?X۬}M~0H4CO[P+@YMD_Lua ѽH y*4IĉK}J@Ɩ,ytn7̘IN!']k;j_:b~HISI0G`zzT'PH3&pKo%ſtUm'P\퓳8I$Ʒ8֥"7saeԘ`Ln¢F'h&Mu($Wl4VdGT6_ւ)CNI3ub7K𛊍4[~+W%]Hvz#HlƼRZelATB r@rF˓6"P5fGl&0'C.YFdYj|QN+m3mӉ'!SsdcAS@U[5嵲LBfHW7$}PIj}{-vWw Oѣiq&h^RkgKY2TRmmΊIk̄,dI1DhDg߰NG$ #zwx?$RÌ6#De>/J֊8ע"#dhJ>6 !-쓾Yx#G%ὤVlI$^tg ?B9|YxjIuiJWSXQ Iqfr^4(կ@&Rg2d7e~̹mM%ashw[psvU$D@=z&H5A#zD>CǮRQRި\;MyC_%zT]Bz,GmH[葎b ,W&s PCR+edU K RNB2 f,3d#';hAqnV FR)-HZ3Uza0qx69(f}县Uvky2_ nW<&9J._M2k %4QY}-\'hvMg:0-/^qH`)#TbJF43,N3Ig7RKf .އH߷Xk`uunnU㤊)+TOc(% &^?N~!rDbP"D$g%C;?$4UaTH"Já -ɞINFz0O~G m0R͛pרe:#=_2no0h*B߁+uWe ;"WΥj/*ZЋk$oX+`Fh/[>}hҟqiQM*Џ,m D#w3 4۽E>ARrr#Of-r:{qfqP^;FuI[oqv0neRDP΢ɚV֛]JVKWT(8UVIXxvQ:$|-J<* ht*LeEGw'hGH0lazK?]B9WWH*\!)$@#GZ.Yb*.mJʔ$')w 89qrȉG '@N89qȉ#G 'N89qrĉ#G '@N89q ,mIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/72x72/check_all.png0000644000076500000000000000320312665102050023037 0ustar devwheel00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe<%IDATx[HWOFmZ/{mZ h}Y}؃m>VUcΩպL`Mh3/ѳ I>NL?|sQJ 0@ 1@ 1a b>2qNOOIww71z? &^^^|oWCGM+!菶I$::_J۷o}3OOϠ{(OƮA hE ZX,>MOO/GGG4Nū}7ݕ( =G@T" PWWgxԑqqqK@NSSS8޺uq4HRR>2=q: =G8 ?"O(99yoXV;g2Z4*D=>>>t~~ޮ*--8ib IB f`` miic^\\j5`|XXkKo޼I!Y1B2-Z<׀Di䄴fgGò3)qJURR%ZXX *5Γ%ddZ'44TΝor,<Kizz:$!!>~ۺ_ ^bxo= rr ܴ/_@hGDDޞ+DiYYB/a*(, F#Zf H[[Œ+++Q0'___'-,@CCC8Z` o޼Ag>*Igg y^akL`ȠLɱQ"`611q #HewD=\$33uV@`_`}9'R~ufǁs@⾾QdR qXk\n8>> Z-A#_lQO0R 6ay 9 ) 277w[Nh2ĶFPۊVA6 bbb.*C@&0$mj(~QKk_fWțfKj8MRȠ4vu$4$$]ʕ+J vaX^j< tz:;;k9PVD_xNPwVkjjU<}{:! p|zA~eZQQAυТ"pNAֳ-;c,Zֽ{(HKIjj*8g gnGh5 {coȪ(V@{,d2΢:q1@ 1@ b cB"/ [IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/72x72/check_all@2x.png0000644000076500000000000000357712665102050023427 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<!IDATxAHW6[,*ւBu=xKTRC.=Xc +%B ZT `n*sV8kvgF}pwgv{{{oF:@@@@@@@@@@@@@@@p͹Q7022}S]1RRƸ%®Y)u))ӱJ-_[RV;)z~1m)Ihy ·kr/;;;Iҏ%eQՄAz\~}9,cccӉ#ufZv ʽ_ہ?ЕV BeITA #1Oΰl333@{dG=IA%@%HwcA~,@L$v$`FGG3UeT7LtD&j[OM4<==KOC jJ љj)a.p)ḀVX`ȯn8o#NV41TrBlʗY^^N]Wݗj9Ž"a'Jh4ʁrd@/\ 4&֨_~LB K9LbEbDm>.-L KzRG^2>DuR:=# ޿fLbF45;09_]E,XXj"fʵe#nDSm@wxfO<3?cCOtd44Aq0Kv?"P9z'Aa/]z3뚥eؕ}cڠDߑ;SO5iݩ PXqGSjH+M3 Ь+[,biiQ4YXX?N7(+Rh4Š? ; :wGVv;zMMM)s@3hKfq%,YuGbpD;>K墢 ೠ@VY/浍*eK*?*4jfB[ry`X@T/eOу'! t6fGS- /:#m:7% B (6 iR ztxOLLzu|̆臟V֧mt0bNzt,i" (=βukkg.1}# ]zh Źg'hT\vysۡTG,V)6p=/%v<'(gr5^ok.جt-{Ze3ֱ WRO4>%rAOrW,-)Ǟso^ހEo{po͕}1o|%PY?47a Ϡqxd"/,2w6ڵ{ #?:`J@~*1shws'#=|o߁4z?M0ojŽ=>mwn((2$S!_a@ @ @ @ @ @ @ @ @ @ @ @ @ D`]@WIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/72x72/contrast.png0000644000076500000000000000327112665102050022774 0ustar devwheel00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe<[IDATxmLWoE[qT"0:h_)a1~ؗaŌ^$ 0p E&:tHyk)("{ >In}_Ͻy*p@q@q8 8 I=IdZ۫ZJ.˭*! L=~XVSSX^^gm6___5kZ222jՅ<|4'Ȇ'ϟ?뽁#G[hQ?dffBAAFa, 88uرs0''Ƕ=ٚAn޼'Of#NZ OgϞ\mdd@рǐ^fll%Ց۷o/^m۶BT ǎ}QP\\ yyyo>}v@nK񏎎{ܸq>I\&pA5'd2[^s.jP(4 .f_bE}xx8_ѣGO&;DذaC ɼͅlиYD399T^x1#^%nЬˌDܬ=Ν;%Z5_ZZeRRcIJJJM۷o'|aSYPJJ 14؂El6/F իW~ss;""ax):@.F!9eL&&]):@}}}̭͛O>>=F.\H5z&Ht T,ۇ}||CMFPZ~je}D34Pl您 |r,22dZX[[ AP&K.m[|Ytfff5IӪJ"iii*..&:Í)QV5,K"CL@ 9 UG{\tI+tGvvO111ٳG@w^z%5jN2{61,,?D :'̌F#ټyrCݽ{wFÑh =6m\ 1{BB:'}( 1(A2e(۷n=dee9 Ç766ƹT]֭[WFv$%%F3ׯV& f޽{OgϦtd2bdkfLz=+[P*Bg%$:\rg<*3x8pTj۲e MMM rrr@FF/fY//tww|!UEj4::GeCs$S}˖-jf eN$vor@q@q8 8 /[OFIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/72x72/contrast@2x.png0000644000076500000000000000525312665102050023350 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe< MIDATx[LINjT2*̀]oy QQG}Pc8bbbh|I`,BaG0& 8EMn9Ч|>4}3_@ @  @@  @@ @ @ LO݇"1YD@u'"ވx+W"~wI1!)Oj"I*"H1%⾈DoU.dQDN3f >}: cF?^ZZZׯǏf%")_"!Y1bcc٢E؜9sXJJ 8q"`cǎK>|YSSeݽ{l6ӥ"~RŲ@I-\_rEӟERR?pPRbk.cΕR֫+ %JHn:^ZZҥK|Fs@&"ɕʸ)((+V0tN=GdB*+11_|١~/))NwrHOc.KT+2@;U޽{`<~>|]K֨o۶M>! *&**ZEEE<33//AR 'Nࡡr t\ѣ/V^aa>["n߾#""@##Z%,Xl6FߴiCC '$$Ws### |֬YqwB Xl٭q@ZGp9[ W zRuݎH2JM!t)͛7᪷*!衩4&rZ+tݎDᚥ" QIXoL۬T9ݿSweܳn8Bъ{NArK-%BIiLff֒И/_9=JlʕիڃV, _hӧO۷o<,//O{Z+^YA.DK4`9͙gM뫝>וڵk8%ٴRz)GwSt~~~ʚFD'J?yzCJٳg^˥kkkrZ$kI9zzNzcQ@z2 ޮ6^z\&wa5|\Xa.^^!>zC|8ƄT,%%EI)Gs良P j#:LJe#6`%IfW3]]y@rD]n֨ h, R544(Y3Ь?~ѣhѴ|%ʧlKnLsc'ԛa? #h9eRѝ-ҤpoU[[~wu,r$ @@ @@ @ @@  @@ @ We7kAFKVIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/72x72/luminance.png0000644000076500000000000000664612665102050023123 0ustar devwheel00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe< HIDATx[ TŮ#dJ*Z9"8$SW"fKz(KDDBD0pZL}45C}{zOyZ,=}}4 [w077ӧO5Lq3d #@F2dlF Q^^.̤R̟ ĉK/$N8Ν;:u믿pѬY3i"I!wvvv˖- IMM1W^yesDD 3b༙|M#DoAƜ9sċ/(S*$$D߿ȵkLMMt!/JJJ򆕕fgM:u~o---5E _G}_Dp0QTT$?wU0=/oߖpB?<Ɖ(+v2MM+'Bb7ڷo/,--+A!СC u 8_|y_LeoO/QV,??Gܷo?ptt>}~˖-nƍ F-u&RUV޽;aذaߵҦ2jxYWvݻ[~5a5>;wGvuuCj@$%%uڌffLτ7TDmر7l P.]Hp X}$׿Uڕ+WeM.H䛰0+VnڴvС!#,7l:t܁H|2 4Im۶%Xr:QtOݼy M Ryqq-jA'/]4`H"Uڵkxcu$'Me;,Y2|;s&L`(`͛g"???_Um50Xi~>Q %/xC-BNٳg9)ɴ$><@˒%S~-y>hq8| 7kӦMPAAyTTT4@#:vX Zse+L_`V[#]eee9rH[DR`РAy,ݜ@^S-[ Cڿj0}IѾ bRB҆| Y `QuV'88x 2f̘>>>.TQpG@;gN AuyyyVZRQj(ՆTꫯ^̃nvر,uAx-Zp@m5k@ 6! pDvvv3&*ewW((f R!/Ξ=+S@ 0 )QD}{ΝngΜI5k\h^ EDyG,A  S /qj $CݡU6/%8`58x`#F7n\ j_cǎިr [o%FqԬ{Fq 4BQk%hZ9p5eʔ`;;~a9yd"(+\P*(H r?rǥ+.y8S7bXs`ZUfZYYؾ}68gBffжiLIqoLO&Mr@ޔ 2xR$.4.8 !)Cx5=| :^~5NcI/|9^GUt֭k;--*NPP}4`ЖblѰan " 1իcV)7nqX%)?jc྽9QsiӦF G>LFyrr<666ka`o۶M.V0h3< rZ3@0HV*ϟ:upvv #,,Ԑf|4e^S6̓زf>QԚjTTT =#8B,Z[ sG~'=Vٳ}%3ׯ_ pS19s渣ꞃ~' r-"Xƥ<ʞ;wЯjjxx5թ`wy۵/h *ORw.5ЩSh6E珅Yh4|*_=io0uhy%C 45j&e RN\zA Wy=+\! G999ASv[juɕMٷMԷez(ަMAh>}!eggK ^UPP?sQ,\.e8DŽ[J!B>qڷr9}'sٲe;H0}dϥZFSDӇl7oVoO\R*'tZt)pus6.olYN[ yanj[Gِw*/// _?!կTi#G}ȊI%8Y+p^߾*[ P3@M|8ܷr*P$RA3KxDD9et: 'S3@WiRFMu{{0X@sεb8 2-t0c供;z5S3e#Է#:ipDhRRRS5az$m|Jw=g&M2pXnqJ*4ѷ)$$$;]{J^0\K8ٴikHT"Qqova0LrAތ~< z8kk<|@6PaZQ{\rU^v:inL=( Ϸd'MyITU)X¼J0tK4SI*V‹튏$F>hrCEŸ r… c!SkP"##DD¬V@`XGB+uC rww?TDN!H-?DNhyO"I~3 O5?mpTAjoF=&bq9ˬ⿉*2dl{}{& E`1@ & `0L b0@ & `1L b0 & `1@ &b0L ,,,Je3TJZ%ݮ%J*iD4ҽ7B@IX +-J*bQ[[j%[ n\ugP$s̑RqZ3CN@HE'''ˇJg466ʤ$DL (j{/=3fh.Σ.ó\\L g4OKK Ϛ@ & `DFӿv%fQ{%Jn()QKI Dy)R^0,*w+d/UEy@^P(V[(Q~%}EQQr劸p^J)jALWWyA7yE)!xI={tuS S2dQAX6mgqJ#~zq!׻!]!L+*<<\ԵkdD!-[ (L3C'32Ir Drrۗrss\vUrDw=444}NDg%]T멥ge@e]ŋuCw66l|K?{L4Hct{t[F ;ʀʂ0cκ B1qFӧOEݖ3@h~.Hmw6E8&J]ȑ#0+C$ާ2`XP6D;v4҇|Mݜ7HDjEV$zZJh@{d-J~I]7x,rՁ肙@TBgdd O`锓'OvM '}b޽ Xe^^^{mA%PH.pJx-Ű-/v ѱ'Ev]I90w~ۧϫDaڹsc;ۼyeo{EX#PR Yл;r۶m鶸 3ѝAIu3^*ׯWPcg(&M׆LaLv>┉ڵkmn+XT>iʔ)b֬YZQVV&v-jjj=7*ѱJSX=z>33S7N$%%={eT__/n޼)JJJę3gĩSDccck)WA qId1bQUU%>A- M <$rBwGDzy޽ 7nHowNF}QvB ?Ǜ]VEIբH@˩[[½!5BڼRh~o Lm 10XvLLN daŐF*]ɣHHTNi`Y@]e ]L k(]W.\( iPә@#d|| 8'&+캵yn^lݻw8/_nzeI۴zY2XiV};igG ^spﯥѣζ-J8;wwO_u}}T aW!KX#9eCCC[ i/K:JEmR>2DYR(0; /Z7P1qoԨQ;S:?1ׂL2!!A_6x('L MfO<O(PDEۍVQ#i WX! | e 5!F>Qkwܹs5š9L"%:_tI ><-˗Ejj|p,5Nq *EFFf|Dw;('N ܪՇaM4^&gkV3$=LYt$C~Ưq4tR7P1n`>B! ~\r(TvdTT}vZč4P+Ԯ9L>x@-i }j˒i -T[P muuu[Ia}7̖uji&/^p!NbwD6 6_T'>ֽ o0 }&[8w Ll]u) ݹFڹsapp-AN v`)E.Xƽ֭[}vߺpi;]l`jرb,LݻWܻwO7*TVVV)Lhr0ZVS;իXti#GӧabS!nʕ#Vw…;KMMCp{µB wHŝl%UҎW^N6uIpd38k}AA^A= {uwPxtyzvH&?43&7ݖ'9$N۷鴲qu4J)+A vt(>T,d0dp= "2{ܓ3Q˅=@>p=*'G-sssCpa؞՞zP/\fy@y_dF K{w|Ţv`]#yt@2d/>'Z{n ku;YF6C ϴ"$ ʋђ|Eq%xޖ*66 ?18 iwKee2C'KP]cfR0.axl"DkH \g;}?l-WI TXwYZZ*srr=mڴmgZՑ yC  X6i1( > C@^&o~K'@+dA Ehsj(NPy@K\PπUEAN8ae!}% "N:Z[gL-V̛]3@ & ԁp綰^=r$}iս{v{"]V1fr *֍*eK #_ ԅ cȜ !_A%dB俐-D-a7x: a}CDwB[ZvMs1㵪aC1|'{}(,jG٥ppei!:(isfwlo!.",:tCzwj`:Lc1z 24UD  bP*X8DddHJ "'BfdA}:_"igo%P:k"K2$`Iq^U1 ݰA y #>Odžun^hC׹[i..aD"ٳtf+Vl *jɇfp$@ibӄ́~fMKXNeӦMݾ Ķ"A3ANR0Z2QH1@%#QʉR(m.L#x4xqQy {LIBex! q% PCW]Tdu_F^x@4Hy/^epOZ_Z1.(G.4uIn@QF`.TrD 9R RnoUWHGQwb*$,۝Yddx1P] 5 'u(S0e& R`)R~[M֗;U5g%$٧b2c%/F*M;VÝuIA̮T [D9{S~X Ĺت3gZ#rD7X2T]s+ (!ĵQI$-/⨽EO}%6ƿmʯƕ1Yh(F53WNu#G|iȦD *GO!{1veh2\v\oqsMQ˲XKrgk_|r]L4nj)x55+/ROTɐC?2K6Al:EOywVE' fl0j4\a7/{( B&x)_)_h^\ GzGbh f īd>8U !<RK. xr.FBAOk֫Tp5H1C h Dt0q^' A\hP0bIĕdL%2 !Vm ͊R 0{/ `ej'=71@0#TzKi0H ʋ R 'Ǖ(\ ۚtކƨqf?@VbCٟ(T׌$|o {b,͑2(lCՐV/Aֻ*VSp'`BB r.1XoC(@& D% lpr\V-qIFm"-ز>@Ԍش:\xHf''wnga(LuԶ1@m:]'z{CP^ԀM(EXOMdqOcD[~ W '6i\wtŊjؓHe3Z(4yLSIP-CHQjB%GXBfbuUìjpUCљ("8Z1=*+}I=a:d`̖A1"Y-e )I?cjl(kv<2, !T+,5`M.M#2}J_!G釠ѤNeD9ђj,h'ϥ޽{,E|l3oП >(`ΦYJmEE(!+j+/XuY`1$7! t7=BUThk|BTOgƆh}qr"W4|.dmoiC&@'Q}UR?R Mtmgb{1\{Ð.۠#p M{&d6Rs=*nE*T|'V<IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/72x72/white_point@2x.png0000644000076500000000000001646612665102050024054 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<IDATx] \qhCHc &XYBXB '!$8;9>  $laIIhHޫ{￞g?nի~$ xxyȋ/@^Pch.Q? :u&$1@FbԬG7?,S>Zڋ/~@9I2lRSe>Li݉&OQu&Q/E-tU嚎QG-JrꝨ[˞nGP/B-@@#@WnU,gh*)SM& hdBu1J (@>i Pk=)HQ4Z 꿢N2H> y-b6ڏ4T4L:jܴ Od{]Q<ˁP#PAJ \)dXzzV8?FRv@ "OB뇨4! hB 82Yt[m2Y-Hv`_.n5ꅨUD!@ ;; <cY0ʂ=Wo* =@9:MM\"8CGw{"q=њwl7GT[]|U]G<(ۮ0Z-aƓ".zo\+]Wz@sP5'\rB.yn] 83(=ޫ8/"#7MpJP s˳h %4$Y67eHh(}4onAKrӨwU s7yU@pbjm5ɲa٠ 0ℑz @K!QT=HݮN{;_"z^gsH}F'* "V?ۨ_[PO`kTQZA,r} .nX1ei 둹Hݻ~Xǡ7~]E/Ĥ9 ̦8ʖS+u 'c^Ni xlLJ@8c:s&- &@8nA;$yH\RU6j\nHN@""p!֭ϥ& տY.{z6R|#!S Q}ޅ=E֧I(؛d6QVY@ &5'Rd 3π ܳwԨ6%DQ\k\wziJw;Š*$SNd폢dXc'M4s>a4x#\ u fT4ꟅGufsa_[VlK D !q&BHk㲀6g A]bըf->zDnbl|D_~d]zta`LK#d7B8S<ζxd*C"+-rq~ pXMf9NL_P:_4~e#m\?l-LrJ.meb+l+sH%*:b>DM[.dÓD RoAn. ;_4={7@ [(r:Cs \B;9C߇?\gq4993W#Pۊ}vY])S>݆& w ʉ|w9GBdQ$“vRnGᱹ5a+V`\G,+e 5OR Hhab> YB5z~Zec]A*._}=gomDl,: @j" [;rY'Cd26)hpvo$ $rqYӦ!0S@ND6D(eoȯ-u+JRVTGX6HyD3pyMnj@S},}&I?MS$w ޓB'r@6]EydPn \.!zd_Vt>[yYLtSKDyQ63i7 Dj! vى-kG.9/srdYi XK nߏRn2c\{(rG5 ^\iUJ ׉Mv\]!9YSqy:0H6ɤJ~DJˍ K{' ^*]wIK(@+:'s[tFAмdq2$):"ܬ$(.65KS(XPҾBqk܇ <mLEgp$KTfFQHnOIe[e! ElUxY;QL<['n77w c>WjRN4j! ݵD9c=Κ1M!Қ7g9ɺI˅h*HIŔ d[E @+(]hFh+xQ@eEh{ j$։Mr vy,&ic-[Gk"uUL釹+֮EI+]_+?ټ4mxA$:Kh"Ώ$8 } r *1o̺=y^y &}Zσ@}nYnLs;A]`Y4410&r";9<ë>cyDsm}ET H U]7){n$ʗ0 t5k2AYS`dJ׼r3tn̿>$=sB]ʥ\3,'RU em6YwJ5l}\I $~myMPo2o(l(uJOFG dɗ1р1L,Nd2;(Xǐ32oC|\t;G-!KTXC<ٷ0g:uSo/eFe3~x},TnԁgTB+<s"( 1Buَ{9L$ -QC$*u(~ԷǗd1rT4Aov* @:DIt於!ٌ$f8W-œ$|03le.sF*RGöpjVASM]Pűk *ü&Sp:>SnEy|hQN4Wi[%m̡̳HyIav$Gko8J-~W=yMpSS-Fj:u&+[+,hGdky {f9Qx^T-*>59+iN8资q{f|*Ե&LDYH=®t!Ɣ9BU~ª{W=HxhgO\,v"aI`%.9Sq~0j'n,|'S`)"ZڨdhS RBF!xgƈ5] >9[ؔ/qQ\Y#&NX׈@ #\e)cXy)xb c lYz)TEHzy\wi>q L8I2`a` yuQ⭱f pڀ[6 p:S 2'$AծJk;ЅUTLBH D)Xl ٖ,M0;p )xe}kmԲ=K?TVŬvS'8Mp`j2䖒Jɱϵ]___yp_u EbeTɐY|+x}CE_v%8xuJ R86:N 4jerq;P_)iiJ!l7 RyNY3)pZj0b]La:99ӒD պI;X}\;F@X[ Ůpgv4|3}gs87lmLd~Z٪ (7G T4RV,гz%:C < \ױÓ^,wM IM(I .+قrJE-R(]]-\^-3q4 I7N436cV ?+{ ש%W T$<@bVt4Uրevsr;AQZ%W1[4.ܾjBٹS~yZ!]+Uۅ#W2өeqJPD̫ߘ; N\3KeQNtGiBi?E-sն@Mɶ2gv^!HmQfWd.-(Q._Tɭe[>rR-oG*#wnT4SjQ#j4龢62 -WGk.7gEri=[ɐU>X5,le 6?r8T y%h}@(بf5N{JƢqU"زm1_qKQ}G¨`Ҋ?4I?Moْ{&45*[[߷2aeBtgfuL[j(kQ[Dy0eܺ\.^l|=(HAt׊# QJb5gV8Qȼ'L/gw#]| &" B66Ⱥ "ٟt@ǘǍs$"@?'e[VG.n+j[vNTaV2e\;Ž떏L"v(LA0 4ɻ1ӵEt&['+#9y )]Y|B= ]"O9ֳcµjqqZ9TVUGZ@G ZuB(RQdG1nl:l=kNK~*i%{Vw kI @$*1&aGiqJ.nDߺ#Lsɱv>[oQȝ՝m½&6 " %h ekH =6"yLއ|D E19Q@rٟk+{Bg+b OATQ3 $BjLkUSXWC,li N}!0\duzSi4`&pTw@Q (2Q8h;>`aވ'?AʶN*>hh)LN~)Do^W`BA4|H0819SֻuAMik1{hp7ΥQDrR+'FO9SSMqQI딞T:'pO(5UPPFUKBAot) LwG$$Uu %W1mxԅ#P<2vP7.wQO0Sf3 FT#$(G*eV*PC1 rdRbR{(|σґRο@>.4Ḑ412Rp9 \0x׫0 hhic4P' ]$pEy_E2HqlBv`@ŋ /@^洁Vz'Kz0[aH&M#NmIJrJp"n%!.C25 [M,+8CXpxwSW?2pYga? P 7=-\-06 BSk(Tӧ78(\3WH vP/ ]k}zLTIL}ζcc}=k9nsXj8hsCNӡC <ckCϽ>7tܼ^aҷvd8}"^hQz{`EV03H1j`y!X~}18?% )@W+ݷm vΞZ7S=,|87ѡ^S3-gfEH8>x1meDjDOHLwm |7X~v\Ml@ONW@**7 4GXmZT%#Q?o >0jH WhD Vuv'Qַ)r%ϼ}Q7t?E#ΓgQ+]^2&F$DzƁ?Qku)Hd;좼3)1VL|x㌴Z >+MW&2#K~虓hpƦC!iF %Y3a<{xOH1LdA#9U[HW{uLڝi֓kb'JuCY5&N=~("lpZ]Ёl V \ʢ XxDȿODap{][e!bv:}d|/=&Gt,)ǕOp_ f?=o#ﺢolvTT2p4*I;%F-N˝1%;5xgKjh߮= ΒNL {BG;Zz֑w4r'8֨zHx`yƒ-j(pbqӢJ*Rt8޹%`ac2IgCQroW,9%4j\)`<\S5>bP˩U&Q') bAR3njթ⹌^E`'$UEϾ}}]cznW7ӊDț$f%8/J"k(g{ZTbM#0?oh<4ɉs H7FJtc3OļK"}n IYl\L?*6`sFC 31>5w2`Ջ. A:=t3kPEs]X[HDԟ\MxEhиi@? 7_)!guJD+&MTT)]Ra1Cx>n,J 贩DG#Ox*W!; Abd7,,4S{]aڋ?AXP4U-AC˿[,FWdE/xrPv9;S/v!'))#kjBeԖk,NvG*H=Ͼ㟅}]vj'ez䲾7!Q?}n4Nj AF Av !ϑpM$!HA#)j Vt' b*@k%/-[0ir)dDN,0UW>GoxT. ׁj1뮡DAM HV+3[SsL?gBCqPS;1Ŀ^̃yNc{; nٛ hEn$̗p`ҵ+HgMtl1T}*%u?gXl$Q5/tL2]6T%ܧ_D [F1HUc?f>rK\@ ]5&+јlhb[k#j'+eJ.'^}3C0؊|mȱD[vWK啜y%~Ի3F!/nIJh?Rq;9SuY2RNO.+VkqeTasFp"p?Ͼ}1}&4H/W h@~XZHxR2>cmvD4OlkLxRbٹL\f\cJV Iuꗻ)dZ(C=oUT0^7[~E&8J_p25H^|kqf],}N]2;@㏳#~qPsK0`&h&0hJ ] (g>҄ľUneEFMyOKrS Ag\S`3`TU- }JᡀK |K:=^E( XoM*q%9cm8ZkL,7PUr-d/R $7R[޻j9QR/'nuUUڃlOa*&ۢjJMB,odZR!g&i>Ṽِj'-儰xy9}NWQ_gĞ͓=᎚?!2PSaͤ"-hq48zyx[  ~^YD im*l ;;hj1s)pR=QqM|͵[c_bjJ[ThL/,<٧ "wux ZZd0JJRy ib8WƥMYPQ? _9֑p9.)%KšmaFi;,IzZ$PNveВg*$oI]!8'F<55+Hkgo\DIt]D`unGڜY^/Pּh8TZK;{kL[XrhjVZ eL@ TJ6ҢDymyTucG(KVhVQT 2gk5OlYKr@Mn7l8&%yiM"p\ ެ9i%Wc³"~}/UAAڑd1 {L }LWy*1yvɿ1^5ݽ6m- ֦Q(&$m#;KlI S/+aj` f#N:tZh:\] {YSb5ajJ0{ڵe\7>74ZWȢqx jTLU>U&WQA\4@o)[n]8,Kbm/Ac28kd@B/gB~%ZSE6N IvoÄnt{BT"G âobI O`q-#N"$}ߚضSdН;#&ng/G37&jJTB:a_ JP6TFc3-v]/B­MeGsU@Ĵ"h&ꀸ*jan>_K[$CzC:;YA!wI30b<ѷPoV$P BQ=ưDt;OV;8K흱%m\|zE$(ձ؎ ~/8GI5fZ1 GW5 bW-6~M <0k{jϿkP -XX Wose+Z{n1?:sp<`*i}͔. $9n;3rA~{ i{ ˼BB~ak6#za^,<Lo % 7cgdk0w5_9+_ppX]/5rzHQNo;ZpRI]d8r`sO~EuHJxGJY1!!"\_ ܰ^{a֮?59 lsVѠWVCǶq27DACjuwϟJQ[leֿTX01q6"A(~Z(G l%rDrbлD;5l4t x9?G|e8wsJ_b>Hz/שieN<[YcSGcf |1pMYp5C֪K&R~;*Ϩ0CJO`-y\{ƪJ(Pb~VVQTrOJg4Q#;$G3Jh] ޣB( * `ZC1X. $rp*hIbzc1\1suCKR=}K {RYZ'.qjRf< ~d}'|&h|0.1loHsQ wQ17F1H 6M@BˢWi8i̵p_icU-,tYYX*03TNBTzMZf.H-'55 lu>seT2qONے(ʐonO#bYzqOĮ&k{ GZbR$Ig3N:+H(YBr{~yBӉ2ͫᾮFax>++gȎƊxĨhh XUTr`1`r쮩8.y존Իu2JDKō8XlLx;ԱdW'ۢr>oFq_Rt^#zis)Vr#ᇞd^\F%ŖEtgr< efc0<״ek- WVP v#u^Uzw'mFuZavuHbiZ}~ ]rSf={/ T3=828`/sJ9^~~c˺B‰4[@i}f_ }H ٛf0wq/P!L\A|Y@rxTaJmT#OV X,)/xMDFvGj?a78H LQeЬqAMtՀD6RnnycYIzF*P(R\;mm7My@# '>r`dst&k8YcbW%2܃`lm2Y}ETDdbn"dg=z!Z}-)4Jy:V{i>e1,m!@X*1H.9X$ʅ}mip=?fLYzdNeJI0QaZcސn  8Cy~b veIxA XwBG4O$E@A11᜜#}ޣK ѠeycfؠFYN!( BA, Yxg&q5SL҄m]&.mۯkQ@?~Zt Sh*Xagh!lnu ac>X8l#8ŝ\! 6MK/}‹9Eo:H"TkSہ:YaM3.nu9\{TvJ]q"DRů f@tcoUh"nFĨqqV%9ۋU9e!M%roՁ+9TK͔ۭK:Ůcqdsܨ.4-F/S߫܍k3 vxcÄ'k뺷  ٶT E0͵ak~jiOt6^Z!Me׶5TtmE+`AޭR$`ؘ"QnRTЛr /&d11u7{-EL 5gΔ8Y# |$zAgG=^'Zn>dܹrmAZE@?ΑhD O&d4_K%0u^%9KO˞G4}%<y5µz1&; J}c&ֿ+e<2,tdZh6qQ_Rߨ8t ._^L2hH=U I"}$ ]UV[$ܯ79=wosu3.oB e=_ٝ4\7gӢnX]"͵s6qmd{sheeάwɁYzMtJ6:rd7ɑnrZ ">0Bz)caA4jn'+R6K@meOY 8I#>7#+GoyW2^T#ʾf`]tdKD ᭾\-䊣 8LbW̵k GNPi >gEr9G@>88b뇁?lP ֪kʑ(+Ȍ~@H &+x3,q!e8$}:30`[!3XְynS0ھ\{b`iVX} 58!\07hxB')e0Գ Q ZS>}rgA_!EJ j ^l̃S Svm`yQ5;T|IdzmEN9ҹAGKtwM"69 1X4~~Qz=Џjx:d*mClLx6Z]2+Ǹ"rS/E>BG :[!0wdžfT,R3 @žF1Ju4ZIuvSQ#K W"H´4\ֈ4q/.d@[g^;8@lF1<+ɡtփLt۫iR" /VTu=n%B9/M=2^d4x&%3N1n͎.eR2){a}e]-M-@C62حE[_iKXu6xJ=c%?7d WSҵٳa|$fR5_xuVWh ,cꌷ^<@Fa NVT cXh6pwDw\oM v* EgT<1g`tZ4b08ʏ]W Ç?Z7<:mb% Imd9wZ>;JEh7ӃaŐ1]#(^`NG4Ac47` ?b=K}D߰r)a.x5 H 7Z.C3c{o8 QG)eBY3 so9l=} 2Pޣ;@^5z]kYum,a yUgF1&Dxl͊p5=z`LY_\.[Ro=`y9?n8lgJ-_q39/M^oX`5wlKB3[v?[.cdL{T cbQ hX3(f L9;h6~VVmΆ\Mx$ \.1 3eAUU_確b͈Z)RrIX3t յQ\/yc*@.ΨlR rzxǠنd%!}^:}5{@Y>\ CRzs h +5qDկǾtK/AA(NjHK=O&_S9|.5ߢ?UÞc3є>{vH!*Xն 8˜x߇I Z +VfLX,Q0?^-3CpƟ_߱Ꚇ*Rc)r؟~ȑzƀÃ,'euY_--0`YU ivZx C4(wͫ53OE_ m Wܠ(88(#<ռsVji,pVܭI!,Jio=@F g0/ A fTj PyD:q8k\/fZn Ąg.ŷ9z5s 0%Dzh׸@@oh6沙Y'T'%XcďMqB,E2zp :DSkg$^qq2ЬX~{ƹ` j3\DS˽ȅـ d{0-haTuٗk//z00 xp17bqID) N' hfɡmu}xE5G,K~%p-s+`eCfnnMQ.Z#ccO A'hzr̗b_Ğ  4B,1I \n7CR9HN$~U+>kLeUUtAOv4:rvGhvS.FAM4E9v6'Vhr04a9X7 T.ͮ6T3`*)>!ύ{ =:=RzD;=nC*+~ tiVt6ʒ![q R*B~s[97vtoHz)SUH9#y㮆V ?{aAFH=CZbm)!;,-7i:\m`[ e -ًſj,z, vԄwQ>7R h>Е5nyEC (7%#EW|wVw-"-Ù+H}Mnd ֘rsx !bdx < A.j~N9WC XeÇL%WSVƛW'M E 5GL_hVQksM|,h{$0'5Dwy8V88hҸ̦ .^m<%VsvCO~g!Y`SKxaЂi_Yđ=^5{I/od`ĩl З  )akȮ-IN%;gK yH7KީIK__8nFPZڪ@&, ~$Si*ڿt?Xg9I*&,=[ZQ#čS6bGS(WroCj:w#Rg{}TVZ TDtx0bw$)kq@'IQ$0Lןdߟۋ^\~gn$Ip0Lƃ.WV;21@\VKʫ/ڮ1/5?c{gP <JL).=&x ؠT1^bB2=M7f#VWJ( o1?`elBAAKoɲa/YO(˛|U Sz\?Qf[Ʈ5(hŭ;_)+cE$P3Ab| *Rao(~GK^Vdo(tj2R Xk)oIU g"7z옧CaVXʂ%۷e a&nk @<& *TvijϩwT`9$ZwzX| ig8P*& W|L1o ͝кD?SAWB9Ypܑ<#q]b2}&Q=_;d-*9[R ʙt("Ib!9QRbu5?2T-~@jZeA= GCwm xOW֝dedrT3[JFYZD>'[5Ţ3$:f.-gwܥ|}vn bO&hO:*k yCXyYhfJЩݧL~N H.FݪA;wPg_ab<$VT`goIo9erG~=8CBnki jAQǏW7,YXv_e;!G\ @)!._}($m`lT{,}/YxN+xIUs~q@|Ո貀7t$ GXE"4qzR1E<'s]jUx o :178eӋni=W0nEMQ0Ӧ~ntݍM"ߙP6ч\klPR4RP6g$=T6z*ؙ=.< LQyݩHN*$DSnt#PEL瓏fa,4HZji$bfvNulŔoNJde25A4 ;B”&Rd&/W5IyΤ=C~ SW,ZvА;gOK=K_-w-rw0zBw栁o4^ZOuu P3<~ '__ NZu/D rdW~īȹ8 PopJzܟOq6G2 KgP7S6ɒ+ dqmу꥔['`fV6 TL/UmN? u!mR_ rOV*NQtl&>Rf07>|q{<େMUTCӧwb2$12s]+_kF`J~mK1fF@PI's,A]CWS39u|OLh/VQe%iH>Rj}(h1CTMOSn8S^eV݆ހva:rC_zɴs+ѽeԆJgp[:S{ 6MAw1RkUk02}UIRK$d>~9pףbW;nµ.6jȻn|-x@*/eX852) X;G_=_D>?l>ε~6snoؒnX )o7n2v4~$Y!rУm!a 9*FWV.8?Bzhh>п4;?( !*̒!f_ihuNvT|6~f騺ZRQؚՉkd`ݟbsQpV 4sgH[La"'[guvXF jnz׭.7U?|2oNF!CPv$';=k#hd,\n&Zr]rT.zbmd \eԃ׾~z\ߗ@i *{=mf8yYCN:fdwCQ2*Gd$L ~+au0W_MEPasEKPgDȬ8=He7:-O G`M_o,ߤ V9Pk_Y‚^^,wM"56̹U6_oĩrQ~~(0|8\{]8Q3&Aq9ٔ<Yd,D>bwQCPcfS!{zqǰ">#EƪM!:s=? h6S<ʧm(AdۨUD;:Wl 6?I!c)L p=llc -gVf()@ib,Uk\c.ob!gr2g?Q2wNJKt+c.Q0SF)š0}A&I1@ aӔ3nV yszSJiCěVwq c˹8 0_,ss0IS9 r765dLk;iYCKK\M3y{~D[6J)I{v> KL  zYsBN⬔J )Li)~`k%ZWbBGfa X#`}~8 8 j ۜQeGrv,3v,#R'8VuDO؃&oW{ȵ r t̐+P D+ Tߚ0|]R-B7v)>X?tܺ~o4f^ 0|EİZZsЏe$zS.+9OGi0#䅁xz,>!Û)2e_]NX Ѱ4Հψ%yɭ'dNߊ$(OibS^^3s?HC |ds0q1n=bGAIMK9.欑8׵2)PA*Q? 6)ovѬ0xݟk)'ƚܩp#.d:.g+{ta6Xj<`{rCa"y41Ե02ZJ5(v?ޥ.KV֊= *qpWqA4$\!;F\{  1aw0u )rܜ) J 3K,-"3W]q'uh.]fWWq'lyU 78-3j~v"D&?HU+D9G? dBU8]Zg>HVyR̊@?03׸dd;u^wm(Jņ0. C*3/%Fw؄YkϨ-:08en.vTbk/m7s{dv.9+&zz߮FŤ$0lIk1ƴȈz8&w2<A A3YpsTyJgd4L245팋e;.'/'{8S [Lgo]OaeHF,)Xj:2~gqK-쇱8 t}uxߣ!|Q ^0@- %>Zn5kDy*ɩr DR63(uXFqN$}]E[DjGMo|pAD86zmߎѻ7jGOuBMM } 9SVDmݯh َU_#Dh"2wh_/Qw (1.PV]4x)I͏E}+m5^69'5ggN* isxy} ZRt2ձw~F9B@Scg⁴SuvL }'d|. k &}^cGƔgP9)#[Y“C٣6Ub>-@ˮ>6qPaaC&;$VΛQv- ン;AxQu<7k ]w>L !j7K{SCZ?ȵ͜d2ؙ_8CЬ m%r O>r-C-kiZ.pۛ6[ѩ|v\Nfp[wdy3&C?t@X<2}#\b`(i^m:eQ[=L1z0Ünspǫjwr}ޘޗw?Q!#7=S]IFp=kiԫIR!%ѣK짾<tjV> 0PUF(!qZAtC4ɋwBB b4Iߤ˕!)[`|$mgQJX^{ k^8>T a5k1YCűS ptݫz ?!G-g1ơW5+ԛɻ[8lA. q;(ݨK9 T0 W-#Wr3VіtQS1p/,*I`&t=Z"k eAc!LńϿIu=Jt}$\=w+ X9|~[1OIdId A{[c9xSm|8=h.@ 2d R0``W$H,  r) Ez+1.L%xoFQz>ud7@%kCTmje WlZie6>_1p-x{NO}N%tseGaSfr+O+hf5y)Fʹ'Xy1s2qw/`3jVp'l!Cr>d`7`^ᇹpCDp8_i%CrTv,ޣXWX&bc}Io;t:7ȱu>'` ]kzHTkoqk{wO eܟx kǗmq"mjE,h(7 ѩ;[h)ɲw9p*مb> ص3tMk(|8X4pЖd;qTReIo_ŴB`/Gg KhƆ x|nI8?bvwnB-W&}] 87n+r|m%=ji$߁!`M &6ir;0pÿwP6JL>&J;ރw,ZAքnkK;ON`ߕ7mi$@ÎjðO4ƧܚKVB˨oih&ƖAUBD9Îv_\w$T0MDwX?#Y_OƱ1$׾Xx2s!&{uіJ9D!eC^6L3&dD;Ye[62Il5xQ|BQLw"x9 2jIG-PDZ㺸y\-4;&$;S1@v-n&Kj*x BzL& +>c?_'<o6÷k Rؓ֐DP=1e$rDzM(n)R4ͪJ_[0SlJ#5eH|<⴪^opi;U}7ϒhǨ|3O%fp&7Or`| `l\,x|,Mgq&g{L)M8Sxc2؊Ju<1q3<'(O0]w.(6l \xc\}sT1S3 "[x)oPehF(Rp<@ ;A2$AbO\^vUW HzU6_9mdZl2~+VzCׇ Ara-"y+9!#B؄5l`XK2t/޾娥hi<~iGXRzL-J˾-d8 Sp*!%34M/$qgHeu PϢղw6= GўC=[{@ B -!T$3T㧘NZL̂De|hZfSuɽ ( A;`46^D&?D!̓Z>{ΧʼR噖a&KMv1[% dP[\4GiL.b:ΤֹON;D{6{h\_oT;#⿇XèO.oYVYFRxSYf:[ȥbIH~ښB&z@[_>p1eX XFNUʕ r=  ywפD\ LD[ V`},>/pY!$l=\M>~&s'Χ!S}0M3J笂Y|NAs?"6{h)HhpyoyjaO%#堈K܆bYϾN.LOy0v$Y˓Bn߬ǒEf p@4}"ӢmU1w2mP`}YNkmfwaS̡"zcӏ ةإ[kTI0'*6ku Fv,ہҜ/VW$iebpԙݼbd7gT`7+@0 ϴF MkP.H7Kk4t~+" ٰk&m=4(+yGmC>R֒ÛOZĵR 6>}BziVISpJT<mH\x[PQ,É_oXֲ<6Up]DcìUNPdLp&'|QKs_&;}sfW(Ύ1?zJۂ@,K^,[L4Z@ "p3("^喱?ÿHeu!?(PEee4G5oF6{5f A/1@,w[eme\%il#vX DɕgIb/^4^_jM:T`DJV(H{I# L1t֗Q6\cn[I0/ -Uڂ,g]N")* a uh2ӢSAV`bѳ^ *pBc3́ }#hxUK:MBm'?JoTlDHcOr䊜UV,T$\*3۲r|j*T,"^AՌܒvY=o 3?>]k6[e˘҆$Zn?Hɐz$_Mm~kJ]'šD@Vlzc?8e!f7}p3Ae4?1(kM`Wy;I[JY@Jn~:m:HPB?cԻ{Tw"7LgˮW/_v|38雭_OeqC[/%-Ty f(^زF 2BWF.'i8jhA1 %/-gZSQ*DUCY6SR{ SU3g z* qtGW?LfAףD_u݃Yƣ290K9< oeG2RKg?LjybT;PMek$Aq9#bn0v'-)27|'8Cc[w tH=' R'HÂ]Psy޽u_Mᮔej$W"%\-VhK]n{d}wyh!q\> j %i*h߃kM«i +k&:'MAOFhh xHh^ś<٧iɝ"9VKG.`n^mѽT'a|B"Wxs J[$X;٥Ԍ&gʳ^tTɌɩ5a`ͿQ`1\ݟ,Ѧ=1WP]o9 KO,uW3nhae7`^H߹]&;k P|icri 0{: Wյ_ %؆c_&-q;Ņy"wU1v4:X\`[?T CFj?׍1$:^Ny0wY߲nUTM[(}qB.|\^'-}૕@$~'Vr3᷒`šWp5(~?;4ΫR52R|Ov\oG$ "wV0,]ʇ Y*6<l"F)ܷ:и=<7TfiƷ+KŏibCXU)iMY4*.oPp,†Ù]ErҼU!H! ю]Ἓ5nnp.Ao8-_e3sљ"WQ ۃz1A3N&_D ʭ0TԂvvatrS}y1Fe OP'N XQLu9e ȫ(TnJQ<77l{=~{{Ac1{|kjkMc4P/`KdaG_-vHAŻ.-\(ǖ}iξ*O1N+s<"oƗXMsP\9(✑ׁ,h#ӵ;I/8R7K A1AMyr4!2n >_qH ]>P -GHưɏ!(o_yẔAx,ñsm~b:3@s.ZKnkRl$4 Mc  փ7;*b!Ӛ&9z4PpH(q%Gi_殞̌VHedKC#6 91LDcgG :5I2kL éF&]ՖC1JiJ*6 2V3, h(/t([?O_mdW<EKym"-'I@k {6ĺ tJ^GXwp k]]c4RI;@$F F&HeY}F#Ax v@j7m&Njcב\*x?<?(D'^"d_ /V>8Tp$3;ᅮQX'ՙw{^Dhԕdf]&zf1yM7-_SM4+nLB촷:UZPL}Ȳ .m]ӡQrɾF>@ᦀK3VzW"edԤnPvq ﶥ'ۜWGoKVw,bmEl3PI_h|fBBJ'lbI؞>!-\9 >y3Y_v]rK%W &n1c]&)Y-l_ws5Dhvu7p>\~ rЄ 9]<*e*"o*x^u-Me[ ڡRCfbjɩÃnlଠتSKqm+M5iQy*c%@-Ub5ٜv 81r‹%˥ E<;K]ny?2, v*rA%f|fDQUvL&2!E푨lݱ,wD,, {Um*ǾvW5ڊQ!!.Wtz25B~F FPNw4Xӗ 8/~c*m%/uW1EEth:U`1.-;D}VYxW#ɄFR.mU2FJ2}s 87,1yB`x#P'G?EGbH =*MjZ$$|6BI4ju(rLP';W` ,o -ۂ~fdLgs$jgpWJ(Z$09~U Km2ތqz"\lҟ 8oǓY*_sae9|Gc*EE)>dE9^xPe%u;4t\q4媳C';{b)_O洀^)ц* }[7=`[a2K2eNh>4[/[VA?;OU)5 =C^5ąSX0W]⍸ )<)lo鉘UPjiCQ2Q^ zv;+lָ@WR( Ʈ{FSw/ p$ClAM=^Ht/i5_)@]_ E#mKʐl36Mg@sQP_![×=7[<%7a Pt]_RYBG/D⸨Mxa9I?ɏR/Z+8 )"ͷ+'DmV9%~j-lbt`[ D7a4F~$ jx-(c5 y`y}F{VaҔ:oseEk0 (rijf%W>qkauO &oBۆ$ΕųS9v({O,U!&tAѬ ur eop" k=I)"k}KOVyZO/:ʎD8VQV<&< (m=fVqvc4mS%T9 xʟ-ͬ +)OA#@q6l4i)ڶwܿ_a~PaW0 FXS؅ 4Sd1?|F}*A[:`㳁\]]cZYt яQ'eq`q*޺#KRd|ߩ25t7.߃ 7LH9MU5G%RYr=|nR Y}N "p\vp kT}fao \mϑ253wx"iV@>b,'aTIg:3ŐI.q@Oq}[i,,Cz)}&QVE՜IQ:֠%: ђ)iR|FWй ɺS걌X*3 Ed=^lfC3MmAT[jcH$P$XFd=mh^\ns575t3c)opEqT k,d$U?:EY3BJexCRv>?ù+}2azRW  YDڇCqY;.u[*yOM9v{H5rA޺d) K" P6l\dNI8Ԧl+OCl˛0ҪE{\U5FmlunNLsj'O#R ,q/HZ +lp0 ]/1Ʌ} Vm*TJ fb+>^?)WC|pTdhd_(殅,SA$|eyY=q{߼1NE"Nx< 04'@!G:Tne5s$q7QJ\=6 %7`f1:b򭲘6GU?RFo?OIlhUyxb7Bjy\cΓy׏"T豴7ش>esxRv^T(iKߢ.dCL{'9z 4>9Ht+l M 5FŨQbze@i 3/Cpbh.SџY+IF#ӹ$qh)vA@[ MB` !l)YҎ'\9Vus~1_y'e g@s7al"Qw˄QhxOu%J\0^-І~vv$3`nepFHvIp36zR\_,q%Kep`9\9}z4'R5< 0 \\WpgB}O2]+:CbM*x!-} 81m^ ^sDy3=c17nAexP0 ) Dt(eN. oN3lռWH<{p˜_Տ=n*Z#pI"T9+f=2 d0:˻͊LvWavJk9(Sg"+쮷e'Qdh:#u^U LPr,P7)VKbs'M } jJwYs:d]P?B-SKPSͪINӤ{tɕGoGK h1M AӔYʌKĜҫ1~ {]áYD*o;Oj5Gj<625.П vƚ [GȎ9Z1uQ (Cj'x9l .uG (OgfBsY~(>`ȶ}rՏdj@+piPܪIBg g g+(z?zJ+f: ?hIAmSI;~E7B*e넇I#|cJfUؖ/:4j%枥`JMI4f[ׯum`u:yCb'Hڿ_R=P|J_Pm>"Ĩ\[>KW_ ɔĂwj\p#e kP @aZxĔB߸f>iϫ$"a\M~X38c~RYy~nweYN.1W휟ci=ދXЩ-ެb N{W'MwiANv+H?𒧜s7ػ(䡬]ƶL @悏 {q שOqOɍ*M= `C,O1w_x*̇LtSwͳ1@z hͩV]pZXc7(6 ˘IǙcp~u0='}#MuxatdB !`-Q~Ԟ\hQf/ep:LX2(U~WNg&BH8XOT6w"j,EUI"MY6"Մ~|g !*+0DliwJs_, Ye?Ñj5?oە_Gu̽G0uIӖqMN;u?uptlrk!7j݂Ofs0 >TI ? mGZGVLh6cqkVJB9(,1yAr% {C~[|Uc(mO)-שvĕRyp4rY>[_1qq Q\<Qq`xA'a6"b$7s#3EZ> ?b?reY =4]d.AFҿx>ϛoIXKz 뽀2caCyi{K ڗHiYHۈAWӭVy|"J8B6nFbp;$Pr'6[1O'2Q(frY&GrV͇$7\3ZP/rnf5l~4|8:YV$} MNkDMBB]u X6V5Ys&LLÊ2S!ۄ`k꒷^P;.qf)@( -`V?3ПSuju:Y"&2#F-\l31&Ҧ VBy5V3IyԐgty|ڣj>lBduB-X1.- cDE~\oL0pHu$6J!d3=^7E@÷g6pY{-Ts2FA"²" H)3+hv;<)"rM;IN¯W2ТTt6D_NIs\WtIk}ߊ K P_{W-ԼqҼ XA1 bOPrC-庻d =PzkTA&rdje=;b^JF.?% !Pl#HK Iu#l׉H]s`5,t Th™9BMp*j] 7YF<6wmf̌E nm}N|c'ncH0tP+\E(5l{ !>EX&S jNʬ4#Vrh3' an*svޗ10ȵSp:]׬d3b+m9dHؒF<K`\?~%ML9Lpkߥ`2ӓ5E>|< oغH|ϢTW?C/(8GzhN)poan$Clr.@v7Xpa,o-Wi&qげ9FGkc\ yF=U=W~#p+I,l'7XAC!a|B o*4,j7{L'#ob[8(O1LZCs_3: 㿼 \QmPZJQO)c[=w=xxYJ/ ڽh$RLFA[yZ[b?P/,6ݞxMмE9pi-.4z69UYiڒgk:Жp2q71v /4`| s*&mW;0i]"F.]&2 Q~5ώͺ 'T GմU D[QҤr^HeH/[ҩ(Kͩҹ5r&v~,#\%:ęNRU9#O,[QDfl@+,uXІ䎤Y`y^?8a  _Y],F'42 DvFMM=Iw+Je'p [4halqBbJ|DCBƋ<^Pv{ejPmd#1-GڹA2Eզ"zbxn}2.lI"2BѤf{#Tiͽ #M˟+2K/3bbMn~n 6mY# DH~?X&cEhVEgݽGsʞfF?ڹ0GQ[ mN9l~Spz2+ dGխ/x! ᦶî2 c5cY8ТŁ&5`+2GԦغK#s_}zU=~_Q_1j~DZtʇ+m.-T]=|;I?J x3,@{О;E}'XH(/Tm5 +LC^UV:{ gN'[wA"«7MU#nT4J4)Gw"V'_c\)*K:Qp?3W85lF5GH8/v6BX ŽsV3h`,?ӆ˵T7ZL_YcW$r͋6j'tRx]%  WQ [4i0h[M]Y޷}г <k;cy[1v~ L)%5m.|w4uArU^L +W'~5mjTe㉝Y5 28QY<9ЙE-Q\|WYreK!oZҳ&>>6T8g$_ ~ֱ43\R/e`Em}G/*]g cI3f*gH-ux|eR7#!Ԇ!% a4Od^nBm NoפXpz~ t2bc61R?"DDVh,D1ʂqrچQW_.p4-p__EE(.?RⅪT.B 'J4O^8XM(z<1LQa+rTeUd Wr͗X~0m3ˑI) Czk!c)i9)A{RX8ۧQɟb0V2`Qvwj*APbjZ? EӥmY4n6]1.cÇr?v>̓`OGM$ ڹ|?70kq^raɅ&& lhu`FyݩAZiDjN!Bx9d|B#ԉp1VPcCi+H$|@v!um'Τ3+EZ97^wUUZ2!#,CcnxT}`_6EN$4>E6b0'yLz4*2$;t>g'X8P$mFEe\ɖ$Ω;em%rmɖB;ăuVƷioGSꄈ?zD碎wYewZ]9vl*gpr nۿ[S}3&*(,ܽQ%I!zbռ翊xy4ΨkDhB~"|/&P]uAT +u7'R Ce0ŦC,+~ xO9:cls_ pHB/mn&^|שO=0x#:\1oLl#㦗hyG{UU]#l2㜟wAEaUeGԲtz s^ugf^doZ5A9u ꅁrd+ NBy'>́<$=D}J&p~?U:)%\(/(.K% ZNQAz !O,wwFO8`T*~($ןQތcN @rqFI67K\* $RPόVAyiO[xs2K!B%3ĭ'o"IF#W̳g%Iotw7>d!?>;5] BYHҁgx,E*t#qyɗ~UGkgWq2$z)Sy`G$pT=`YTx񜋫c5-Füp U>%a>Ѐ_Y(y {_W{Mad(WU܆d{O`&KKi#[1~Y=ܙA&:,cBOslj{Ѕԑ'6XSXHl:FR ,SWoucb]}=ꀱM0/A#ܐhl3cnKWaTiSX b kKu|'98DXuSߤ%Nާr65- < !Do矨`ki/D&҄mЀ JAє`IdS͉h.gm}Ms K/w%@'eʤE(lys":et͵q>QüKL*L&TLTm*>*_]1g`Ľ?{B>8O?miK荨?4OvݐQ;eV<Om@K{הw+Y#4_TT&Zla^H;M"!2I'FclU"lplhw(1'Ϭz #@#*]^GHN&?`pUg+%.S] Z<,|Z$fH=^@3;iඌ_mmuWǵ͈- z9 7gil~ [ _+4߿Filv2%$XMFק! 9;i/h'tdK{ }[^, 1d$ K`[A)kpftmrCqlc Y CB1b+x쎏8ڼp,{+1%g>w[cR7ۮm& NeQr+?f|bGLx &XXBy`TśP.<ڢ`6TY*I;E'2Fġw 8p8PiI~=ςCȶo^$1JT$ vRS"Z n~,4c~\Ѷnwy$%N۴Zݞ)nG*jџaŒBim.¥ܾۦ<L4Mh@#:XcO[~lȺ|varݲXY2ؗmU p754o9K >j _`DtsmF0)~t_ GPПu>*1 wkx0,|OzF-g؛pPV.{p5ƽlEt]=z?gk&@.K1]~*qvq(SV0_I(d}TݘMՖv/SwtxY|$PHKxmEs0!`|Rֺ!)sv7؇ | Ѣklk^apg)UsK5-Dc^_2}gDKD R$DŽʐ,+`5%hB>CKkAJ0 r`?5epA!TKfÅ"\琯B=DsEht # щf _#it&0>'cp򷖯Kg>)D.Bx1h"vy[&Y J8tV,:IF C'w[⑐Y or2--u/.K,Ha89;/ NtnR!SV-"y8dXD1sN=z ̩FEVȎ`:ZsrvdP.OLoh`_I7U/1/Mk=g'"H&uv3aOcmgz t,]6bZ*FNMs-d#@bbhCq\K*uor.M8 "ؽ&\FBx!dFt@uJ0x]n\w?9`xCӯl4;th88&b`īc+]|/k@&R{w :׾ޣ3v;_oQVhèpyLivx!bEI?chٙntHټ9Zw#a^.*frm$%roP+Y8t *j^tߎr,۾3g4@{"]mLr/[ͪ+߷XAVvɐޯu !d)pS6Z0odvq p00PuHlselUD&dab.) $X5"w5zo\]mɭ-Gu0.ƭDN)F>~>Bxjfcne >h`vWڊ+k$g|\Hn? ޙ$Sq\֭]⨶\ msdI6 qR\ZzT>)yfL_ӳqT oP0ou_]b!)j?|DZ ?&Ywn2 Iʘ׈lr1\'Tn虿[W=̠ƃ{}5d-hf09SO "o{c5]dcE\ei۴j0uӟA#B>RP[PQ,É_5bW@6`9MiKx$d2n~nd1'ޒ]8)KzJۂ@,K^,[L4ZTxvLa,ܣ?G_1_W{bDf D(3F "JsrO! 6ch{4A !vc "~ڂKtW9 r嚖XM4h+V6\)E쬊 % *oE)T}U=J!cX!ydwb\j0S&Fuõ 3HA W"meI5?r"ad 1VʨxͫOVW"lz昔 y;k!t@X#prF䗌Tz'dHuS'Irf^plmUg`9S9B{%3ל}r-dLW8UX%|PvDyj* iznŌ@q/kELy'yPdLujE@حMVvS V;:IkjHCv( 8>wWGH#9F:5'=719cmjm5w_U--[Ki1OrȍVD 0Ȫ/p^ȔJ\z*^p:U@8'Tnqy5g@zw_<}dl #gUM>:Lx߇Wg_֧k\+D)< ;bOPP.nOW$Z"$3GŽe' ]Acz8+f:jpBVᄨ?h`{i)jӆEn0d}̈́ߡōfb@u$qVsaW,a8#FsN4Dw\:*Rwx.hswGb\Q.D-9/QΗgw2O^]أY`9'j@IymQFog-קJ,Y&iaN@r:UoWTwa8ɫ[kМVvVXΐc>PzZ8v;7g^ݬ4R3~6枵 Uu.IY1YOEk оea/ v^5 ~ğJ^GS| ;<<nwO^B ~!ȟ0Kѣʩţg,B~}VT(ixpi7_J̎o\b:R- l吓kAAe(|Baɴly&/ra(۴E0 T<'*u PtanC5|_ ۠V{&=SbeïPt0"榲\q{$>/qG.1t|U:ro/RJu:TMUNs[5K^*ej$P=Gyk!}K.qsK YIWBqN7|KKABn TiWhcSG/< le̡Ͻd+!spQڽnvn )K$yHw:?Au1~|d+rImrp(+DI9M'ZY!/QşV94rGaxKzW2wz͸rޟO.Au&,zC`->FqAYŕl4KmBW9nX/ρ{3z*aUda %~k_ 5s'f$,ggߠH5jʛp5`@j)}ؓwOv8& CmR0f,DJY 9}k!` 'X=sД jVèQY/,ZVM wI6HElk\<+>b_!)<* U5b܇ġ&ts/,[k IB\lMp+䪲<5ᬓX%IQw /H 7:/|`]T! m*dCmâؘxk wvj6~=xlňVՆg;W` v^2ݪƈnߔo;<&?z^ӕ{g2k\j'yON7;>5Q𥲯:b1p߼5SNHq,_RuĹZI'ȖJ1Qqf#-J4~)"$ I҅BD f ol<̾6 27h>ߘL$g~O_IGS1qL [;5H'nG^/6*nx,fbTK^]H!  UqnA@:d6RK;:QQSmLGo6ugGZ1ԣt9[&)hGzh!?"&36XMN8.{*f'ʯԏ@D; Pb2n$*2 W1?*pG <%&?-8Suo-|N<f0S(#I@Y"n)]P"y}娛,Q$TT/ +WJ&SVx =0LSv"G\e +nysJ-JMA_} OȐ}MO1 ]`aa XX w^1$Gb60ꌱ̂D7cg{s>j~bYj|EsXւsvA&xIjx~8դOSF0\ȸes{yj[0`#GCs7J{`,u뻺X נ7[$Ԟ/q'غ},18zQ2#n `ݶll@{Ղdfl1 XoD:4ǝ_ÂQ~[|Ѥ&{IM-  KqD3ε̪RD_EE/I!]igJ/vt傻 (-~bw4:˃_G j:E*\1jg ]awDl 0hKfm|~34:P3e-Dn%U{i"uf54\b1Xs9:DդE> 3oGi<%T#nT-ES2)/oWB4tH':cl׀s鬵TB-45muov JIL;ڞ:i pZK8C/!Tn:WT֏2&]nLѽ>D0 G+5BA\_-p^W8黠c+ql;;,,=& &ceכ3KD㸥>jR4/Nɤ^'W +R%&;jW`M`YGNѢ+;} Nëk^ʚK'+XG`v8y&_h6JUץ*9lUo |ĭjA[ɧ AINja> R/;l*Wg,'q@A`~6 rw^螱WA@2/0l.F71^ {_ѷQjbo^4l > /BCJh Uj9h;zR?r8 _asV7E ϢaU?@ލ3` Qj:h8weR܅ `Ŭ+yG8L6ĄkbB>cE5#oY!:9=wdz!Vd4Bg2mbvp!(^ NQ_̋4ҫ틸WVN{.&xI/k ^Vghc1xfj%#W-LhRZi-.5z߇DTPArZeٖ\وWcWyb < @Z*{޷ķꘛ-4s33J0`i2VsORu8ӧTOM澢2 ?hd:Mt`NM6c.juhq*Ltt]NAqZԥ&jH]3JOv#ɫ˻uu`gIz\PJQ5:x$_ L;;y(gR9rsƐCK"˗z|霃h޹聁BVg(iڭX[mT(#85m(9׼}ͣOnJ ='nYqnr~ԽZY')iR|FWй ĮO:wZ-NO]{ļebsbMeWK)́֍6si/vw9V"oP w^ɪyoI1ۍv9R:>^ zKJ?>RӟqiW}h7--Q"64 BY86&01̪ 0y" v1x< 댠0I@5Y:ZCM>yFn\+8o?M$)=MI/uRz.$/f>u}I]=K/!m7+`%RR&<ט  EG4V{ "i(Dl{X+E_6 A*z RB7AoF7^a7̻~ X~bp1+GY,J_9fb +LvC|~[2-VVia.О,SK;0{/x/j5EI*? S0 R _Gx>wv ΒBKu(ݦ8}3o'BړRٗ,{r +P bo VܩPQdYzGLKoכqzA}~_%ɮ9 76Y7ڞ{PuJC;~\2T:xaW2z[(r*gشG,zVWnG7(^+1|eM͉Kް<7I$OĿ,tRkj eQ *T٭ୱgߨpg)UsK5-Dc^_2}gDKD ;7c \;lj@t,'.qqA/[zVAW+G+&]4U#^gZ\U#]s'=^y}sNoVLy0b%idVuR$[ʙ'o s"VjVF 򑏐Z"mR)=' ZK|f|R>W:[ y$5m-uRg6QMFN|yml݃v;ܷ{ iIAx=\Bsgk"\,~I jA|jx{O±MO?R׻f_K|J?PAA,9K_]iko᪟Di _eajIt-4&'wa=߹2|*}" ۃ(>tPҙlZ-€lm-˴+Z}hрy$_LSș$#7>6ڭ,[vеP(؂8In< *37J3'JJXzz<5b1Ϩo^vU=BvI4Ӄ9K#|ٰ tLKZ/xv7f@N[n7.hN ʍ_(WocWf KpisIr|< p7aZJ-C -/AW&+˜S2=AUs AHLq`@ R[vT=ux0R1} l +YԁB]LRncDxpŻ5?^ʯlWןPǣ1%a0K*DZ3۾7}|]A3-WK]-Z"6kx"\ ɠWRyTDc>rT/7G +V134D!}uT=;:ZM_w02:;hG NyuV ڻKw6gC/ȹ0$KWf{D_mC⫟`Ѳ5:pqaEw zC5 {$9ήܸHXF, >K#oT# c|ndj{"%{&}HxxQBѲ;.Գ(_RR, 8;pg/U!M% o QFdHr+x k*AsIE-+vSq(Tl C+l&r-RL+{/\5G5{x }*+x\ `mrN $@뚞s𨪕dͪ}L}R2S- 1j*$}]A]&짆y }6ao~n@s$ѥ *Q ׈r2> |`4y^ҿ .>Lt[eWsa!+Ka H2Miй<[\THHՖclK uuV4RL]@X ^WZE:0<7VADzl BI3 웵@;elc 2RAjQEȸ~rZ=1Q̈KOѹeX jp> v(}$|Gvet*Mz2ɶ9kdΡ ѐ\$Y%1~|Rr1Lʬ1QbHjAyE}k#krԁ$![IW޼; 6_n_XY/l9n᪜#w(ٓwDrxN}ŏ.޶ůw`  D #%~EdH'R_DTZ^*d+6㳚c'`ǜX?W,[?&C{t8^;>Y>5:"/u壁&5'm0P%'ds oxSGÌ*owD#\%dK ?8L AsiILLHP\,73ddƓηZ(6(WԬ\s)9x -d-U>#|m&A#n$ºw1WI'usY8nӸ(5`ݴmˀ߾ U6%jmGrWޙM3D18+Jq%T@?m?T9/Q#'˧ONīQCvw;{s˧߇O ,MF\d“HLKz`(>dEy?^r;sv=S7d֖.3Z #LOj_CNAf/t XIve8ŘL%vkw%\GlmQ9!;o[Hh [7Wq:CrunSJ\ȟu4[֢V)4=9Kͪ ^ljA-ZT!cɞP躮2@}H Y=3K>YӐ zūnd?V-x}b+<R(5Ԍ&}wq-b/0݇Ai9K `x4>ݢRD߆'C8;de%-"E\&яX`c0(G%J~wIW@lTg<ki{yMiλ+EI?.Q^;H;@VwGHT[ #:?V0M3U-YmUtâ/TEH%_)&N'+ LQDڽUep ;~NZK]F鋲VŒ(α(rYģwAzyڮ9OBޯ[ $wfѴ[-Dž7h͇& ~i=]d]:=m}l,}b(sUt ^ aqlᅅY0do2Q4jlr,"LcPBN?dőjEV%}H hjZvA«g1d'g~N4$@/2.qmd$,w e2,o#2Z0brT+faW)(تfL(BӾ>Kt(U+PJԈ3c+G/QVq)>𬋍0~VSv +tK],~DYMc639\o mFHb-it32T``````^_`__^^_`__^^_`__^^_`__^^]]^_`__^^]]^_`__^^]]^_`__^^]][[^_`__^^]][[^_`__^^]][[^_` __^^]][ZYY^_` __^^]][ZYY^_` __^^]][ZYY^_` __^^]][ZYXW^_` __^^]][ZYXW^_` __^^]][ZYXW^_` __^^]][ZYXVV^_` __^^]][ZYXVV^_` __^^]][ZYXVV^hpx} ~xph^^]][ZYXV^hpx} ~xph^^]][ZYXV^hpx} ~xph^^]][ZYXVhqr^][ZYXVhqr^][ZYXVhqr^][ZYXVt~s[ZYXVt~s[ZYXVt~s[ZYXVz}~iYXVz}~iYXVz}~iYXVv|}~~rWVv|}~~rWVv|}~~rWVy{z{||}~zVy{z{||}~zVy{z{||}~{V{~}{{|}}~~~VY~}{{|}}~~~VY ~}{{|}}~~V{{|}~~~~V[q{{|}~~~~V[q {{|}~V{|{}}~}VVW|{}}~}VVW |{}}~V{|}}~~}}V\{|}}~~}}V\ {|}~~V {|}|\ {|}|\{|}~Vz||}}|}z||}}|}z|}~V |{|} |{|}|{}~V{{||}{{||}{{|~~V{z{}{z{}{{|}~V{z|{z|{{|}~V{z{z{z|}~V{{{z|}~V{{{z|}~~Vzz {z|}~tVV||{z|}~jV {z|}~wV {z|}xs {yvyb` ` z`__^l`__^^]]ѽѽѽ`__^^]][[仸仸仸f` __^^]][ZYY嶳嶳䶳m` __^^]][ZYXWѱԓѱԓѱn` __^^]][ZYXVV⮃⮃⮃ ~|} wph^^]][ZYXV ~|}}~~r^][ZYXV~}~~s[ZYXV~|}~~iYXV {||}}~rWVzz{||}}~~{V ~}z{|}}~~V {{|}~V |{}}~V {|}~~V{|}~Vz|}~V|{}~V{{|~~V 󬬴{{|}~V 笵 笵ᬵ{{|}~VԵޓԵٓϵ{z|}~V﵀﵀浀{z|}~V ǹ ǹ Ź{z|}~~VՁ Ձ Ё {z|}~tVV||{z|}~jV {z|}~wV {z|}xs {yvyb` ` z`__^l`__^^]]ѽѽѽ`__^^]][[仸仸仸f` __^^]][ZYY嶳嶳嶳m` __^^]][ZYXWѱԓѱԓѱn` __^^]][ZYXVV⮃⮃⮃ ~|} wph^^]][ZYXV ~|}}~~r^][ZYXV~}~~s[ZYXV~|}~~iYXV {||}}~rWVzz{||}}~~{V ~}z{|}}~~V {{|}~V |{}}~V {|}~~VU{|}~VUz|}~VS|{}~VUO{{|~~VT {{|}~V: 笵 笵笵{{|}~VIԵޓԵޓԵ{z|}~VI﵀﵀﵀{z|}~VI ǹ ǹ ǹ {z|}~~VVIՁ Ձ Ձ {z|}~tVH||{z|}~jI {z|}~wF {z|}x] {xrk  |jѽѽѽ仸仸仸Y嶳嶳嶳kѱԓѱԓѱl⮃⮃⮃ llmjmmw󬬐笎笎ᬐԎԎϐ拦毩ًً ``^_`__^^_`__^^]]^_`__^^]][[^_` __^^]][ZYY ^_` __^^]][ZYXW ^_` __^^]][ZYXVV ^hpx} ~xph^^]][ZYXV  ѽhqr^][ZYXV仸t~s[ZYXV嶳z}~iYXVѱv|}~~rWV⮄y{z{||}~zVRsr ssw{{|}}~~~VY W^_`a`aabels{{|}~~~~V[qR^__`__^fx{}}~}VVW ^_`__^^]c{|}}~~}}V\ ^_` __^^]][o{|}|\^_`__^^]][Zcy||}}|} ^_` __^^]][ZY[s{|} ^_`__^^]][ZYWWo{||}^hpx}~xph^^]][ZYXVVpz{}ѽhq r^][ZYXVVWpz| 仸t~s[ZYWVWpz嶳z}~iYWVWpӆѱv|}~~rXVWp⮂y{z{||}~zVWo 欬Rsr ssw{{|}}~~~VWp ԬW^_`a`aabels{{|}~~~~V[qR^__`__^fx{}}~}VVW ^_`__^^]c{|}}~~}}V\ ^_` __^^]][o{|}|\^_`__^^]][Zcy||}}|} ^_` __^^]][ZY[s{|} ^_`__^^]][ZYXWo{||}^myym^^]][ZYXVVpz{}ȅƼѽp| |^][ZYXVVWpz| 仸 |[ZYXVWpz嶳 oYXVWpԓѱ zXVWp⮂ѽVWo仸VWpƃ嶳VWpŃѱVWpă⮄VWqÃVWqƒ V`VX` ~V\` |V``zyzyzyyzyyzV]``wV\`uV\`rsrVVm|} ѽqr jVm|}}~~ 仸pbm}~~ٓ嶳nojo|}~~ѱmlmjt{||}}~ ⮂lkklkkrzz{||}}~~, 欬Rsr sswz{|}}~~~VWp ԬW^_`a`aabels{{|}~~~~V[qR^__`__^fx{}}~}VVW ^_`__^^]c{|}}~~}}V\ ^_` __^^]][o{|}|\^_`__^^]][Zcy||}}|} ^_` __^^]][ZY[s{|} ^_`__^^]][ZYXWo{||}^myym^^]][ZYXVVpz{}ȅƼѽp| |^][ZYXVVWpz| 仸 |[ZYXVWpz嶳 oYXVWpԓѱ zXVWp⮂ѽVWo仸VWpƃ嶳VWpŃѱVWpă⮄VWqÃVWqƒ V`VX` ~V\` |V``yzyzyzzyzyyzzyzV]``wV\`uV\`rsrVVm|} ѽuqr jVm|}}~~ 仸pbm}~~ޓ嶳nojo|}~~ѱmlmjt{||}}~ ⮂ lkklkkrzz{||}}~~  欐Rsr sswz{|}}~~~VWp ԑW^_`a`aabels{{|}~~~~V[q팑R^__`__^fx{}}~}VVW ^_`__^^]c{|}}~~}}V\ ֒^_` __^^]][o{|}|\^_`__^^]][Zcy||}}|} ^_` __^^]][ZY[s{|} ^_`__^^]][ZYXWo{||}^myym^^]][ZYWVVpz{}ȅƼѽp| |^][ZYXVVWpz| 仸w|[ZYXVWpz䶳oYXVWpԓѱzXVWp⮂ VWo 欐VWpƃԑVWpŃ팗VWpăVWqÃؚVƒVUVS|~VEg|VyzyzyzyV6RwwVFiuVGjrsrVVGj󬬐qrjVGjᬐpbGjϐnojEg拦mlmiP毩lkklje^  ѽ ѽ ѽ仸仸仸嶳嶳嶳ѱѱѱᮄᮄ⮄         񀾊񀾊 񀾊 񀾊񀾊񀾊ѽѽѽ 仸 仸仸嶳嶳嶳ѱѱѱᮂᮂ⮂   欬   Ԭ    񀾊񀾊 񀾊 񀾊񀾊񀾊ѽѽѽ 仸 仸仸 嶳嶳嶳 ѱѱѱ ⮂⮂⮂欵ߕߕ ԵߕߕߕߕǹӁ     󬬴 笵 笵ᬵԵޓԵٓϵ﵀﵀浀 ǹ ǹ ŹՁ ՁЁ {  {    b` ` z`__^l`__^^]]ȅƼȅƼȅƼ`__^^]][[ f` __^^]][ZYYm` __^^]][ZYWXn` __^^]][ZYWVV ~|} wph^^]][ZYXV~|}}~~r^][ZYXVƃƃƃ~}~~s[ZYWVŃŃŃ~|}~~iYXVăăă {||}}~rXVÃÃÃzz{||}}~~{V„r„r„r sswz{|}}~~V``` aabels{{|}~Vz`z`z` __^fx{}}~Vl`l`l` __^^]c{|}~~VU`````__^^]][o{|}~VUf``f``f`__^^]][Zcy|}~VSm`m`m`__^^]][ZY[s{}~VUOn`n`n`__^^]][ZYWWo{|~~VT~|}~|}~|}wph^^]][ZYWVVp{|}~V: ~|}}~~ ~|}}~~~|}}~~r^][ZYWVVWp{|}~VI~}~~~}~~~}~~s[ZYXVWpz|}~VI~|}~~~|}~~~|}~~iYXVWpz|}~VI{||}}~{||}}~{||}}~rWV Wpz|}~~VVIzz{||}}~~zz{||}}~~zz{||}}~~{V Wpz|}~tVHRsr sswz{|}}~~~VWosr sswz{|}}~~~VWosr sswz{|}}~~VWpz|}~jIW^_`a`aabels{{|}~~~~VZ^aa`aabels{{|}~~~~VZ^aa` aabels{{|}~VWpz|}~wFR^__`__^fx{}}~}V]__`__^fx{}}~}V]__` __^fx{}}~VWpz|}x]^_`__^^]c{|}}~~}}VW_`__^^]c{|}}~~}}VW_` __^^]c{|}~~VWqxrk^_` __^^]][o{|}|W_` __^^]][o{|}|W_`__^^]][o{|}~V^_`__^^]][Zcy||}}|y_`__^^]][Zcy||}}|y_`__^^]][Zcy|}~VU^_` __^^]][ZYZs{|y_` __^^]][ZY[s{|y_`__^^]][ZY[s{}~VS^_`__^^]][ZYXWo{||y_`__^^]][ZYWWo{||y_`__^^]][ZYWWo{|~~VG^myym^^]][ZYWVVpz{ymyym^^]][ZYXVVpz{yhpx}~xph^^]][ZYXVVp{|}~Vp| |^][ZYWVVWpzz| |^][ZYXVVWpzzrr^][ZYXVVWp{|}~V;|[ZYXVWpz|[ZYWVWpzus[ZYWVWpz|}~VHoYWVWpoYXVWp{iYXVWpz|}~VHzXVWpzXVWpxqXV Wpz|}~~VVHVWoVWo|zV Wpz|}~tVHVWpVWpVWpz|}~jIVWpVWpVWpz|}~wFVWpVWpVWpz|}x]VWqVWq~VWqxslVV~VVUVU~VUVSVS~VS~VE~VE~VG|V|V}VyzyzyyzyzV6yzyzyzyzzyyzyyV6}V;wVFwVF}VHuVGuVG|VHrsrVVGrsrVVG{|zVVHqrjVGorjVGw{pVHpbGlpbGw{hHnojEnojExzsEmlmiPglmiPtxztXlkklje^fhklje^tuxzwphih32Nj```_`_]_`_]_`_]^`\[^`\[^`\[ku~}rd\[Xku~}rd\[Xku~}rd\[X[s}~~pZXWs}~~pZXWs}~~pZXV|~yW`||~yW`||~zWVV}~xs}~xs}~zV||}zV}yV(|yVV |nV m_z`؁п؁п؁ пu`_]︶︶︶}`\[߅ۅۅ}|rd\[X̬̬߅̬}~pZXV̬ޅ̬̬݅|~zWVV̬ޅ̬܅ˬ}~zV̬ޅ̬܅ˬ}zV­܅­م }yV󱺽̈́󱺽˄ 鰺|yVV+ijij³|nV m_z`؁п؁п؁ пu`_]︶︶︶}`\[߅ۅۅ}|rd\[X̬̬̬}~pZXV̬ޅ̬ޅ̬|~zWVV̬ޅ̬ޅ̬}~zV̬ޅ̬ޅ̬}zV­܅­܅­}yVVU󱺽̈́󱺽̈́ 󱺽|yVU+ijijij|nU m^}؁п؁п؁ п{︶︶ ︶߅ۅۅ̬̬߅̬̬ޅ̬̬݅{̬̬߅ˬ̬̬ޅˬ««ޅ魌؀êՁêԀ`_`_]^`\[ku~}rd\[Xȸ[s}~~pZX`൮_`fo|~yW`󭬬_`ez~xs򀬅^`_\c|򀬄gsxyyxth`\[[Ͽ񀬃fz}#~e[Xnʶ񬬃`ciku}~oX^ ޮ۬_`at|~nl ߬ؽ_`_\o|ެgotk`_\[g؁ пެi\[Xƃ︶ݬtaXVڅدȸugVV̬݅൮rgVV̬݅󭬬p}fVV܅ˬmweVW܅ˬlr`Wvم Ͽsnj[|~˄ ʶ񬬀+mfgffg`]ku}~Ļޮ۬_`at|~nl ߬ؽ_`_\o|ެgotk`_\[g؁ пެi\[Xƃ︶ݬtaXVڅدȸtgVV߅̬൮rgVVޅ̬󭬬p}fVVޅ̬mweVWޅ̬lr`Wv܅®Ͽ񬬩snj[|~̈́ ʶ񬪀+mfgffg`]ku}~ƻޮ۫_`at|~nl ߬ػ_`_\o|ެgotk`_\[g؁ пެi\[Xƃ ︶ݬ taXVڅثugVV̬݅涆rgVV̬݅p}fVV߅ˬmweVT~ޅˬlr`U ޅsnjV魌mfgf^UԀ#ȸȸȸ$൮൮൮񭯻񭯻󭬬ﶄﶄ򀬅˄˄򀬄ϿϿϿ񀬃(ʶʶʶ񬬃ǀܮŀܮŀ ޮ۬ܳܳ ߬ؽƄƄެ؁п؁п؁ пެ︶︶︶ݬ߅݅݅ح̬̬̬渻̬̬߅̬̬ޅ̬܅ˬ̬ޅ̬܅ˬ­܅­م 󱺽̈́󱺽˄ 鰺+ҿ z` u`_]ƃƃƃ}`\[}|rd\[X}~pZXVvfo|~zWVV`ez~zV}}}`_\c}zVvvvsh`\[[}yVVU|~|~ |~e[XZ|yVU+{ku}~{ku}~{ku}~pXVZ|nU_`at|~nZ_`at|~nZ_` at}pVVZm^_`_\o|d`_\o|d`_\o~pVVSgotk`_\[gnotk`_\[gllp h`_\[g}pVVRi\[Xh\[Xf x\[Xg|oVU taXVsaXVo`XVg|lUugVVsgVVpfVVgt[rgVVqgVVp~fVV\Rp}fVVo}fVVo}fVVmweVTmweVTp}fVUlr`Ukr`Uo{aU rnjVonjVuzuVmfgf^Ukef^Upij`Uil32 ```_`_Z_`_Z_`_Zht~r_Zgt~r_Zgt~r_ZV~`q~`q~`VV~~`VV~`VV~^VmV` ⽳⽳⽳u``_Z ~r_ZV ~`VV`VV(~`VV۰۰ְ~^VmV` ⽳⽳⽳u``_Z ~r_ZV ~`VV`VU(~`VQ۰۰۰~^TmT⽳⽳⽳||ۨۨ֩`_`_Z ht~r_Z ⽳`dffn~`q_`n~aoi`_[ѿ_}}~gZsγ_`aq}uꬭ٬_`_l鬬 l{_ZȰ⽳謳zaV Ǵ⽳z`V v`Vow^[(пjhppoe`~ֿγ_`aq}uꬭ٬_`_l鬬 l{_ZȰ⽳謳zaV Ǵ⽳z`V v`Vow^[(пjhppoe`~ۿγ_`aq}uꬭ٩_`_l鬫l{_ZȰ⽳謦zaVǫ{`Vv`Vow^T}jhppoeT֩⽳⽳⽳ѿѿѿγγγ躾躾ꬭ٬鬫 ⽳⽳⽳謢 ǭ (۰۰ְ` ȰȰȰu``_Z ~r_ZV wn~`VV`n`VU||(|h`_[~`VQ~~~gZW~^T_`aq}u]_aq}u]_aq}vVWmT_`_lb`_lb`_muVVl{_Zk{_Zhur_ZgtVSzaVyaVs`VgdU{`Vz`Vu`V^Sv`Vv`Vu~`Vow^Tow^Tr}^TjhppoeTfhppoeTkp{{zkTis32`ttnVpVmVƽƽƽ``mVpVַַַmVƽƽƽ``[mVpVַַַmUƽƽƽ ַַַ`y`^cmt٬`_h`gͿ଀`b٬bpd_ƽʬ{~[а٬|~\[k\Xַ٬bpd_ƽʬ{~[а٬|~\[k\8Xַ٫bpd_ƽʬ{~[ͪ|~\ Yk\UַӺӺ٬ͿͿͿିҾҾ٬ƽƽƽʬЪַַַ``[mV`_pV{{{sVmUbpd_bpd_bpd_eV{~[{~[{~[gU|~\|~\|~\ Yk\UYk\UYk\Ut8mk@9@DDDDDDDD@99@DDDDDDDD@99@DDDDDDDD@9JˈGJˈGJˈGYYY222HHHEEE D D DDDDtDtDtDDDDDDDHHDzDDDG? MdtddddzXP}JDDDDD@9ˈGY 2sHEDDDDDDDDDG?Mzdd7dlddzXP}JDDDDD@9ˈGY 2sHEDDDDDDDDEHAZ zs t7u lv u zj c ؍ +! "  z    M t sv v v u i c ׌ --*  &&! && ~&~&z (%(%T$#T$#M w" w" t y!y!v y y v x x v zx ~x ~v l l k 7e :e :d l֌ r֌ r֌             h8mk R#R#R#DDD1.S$d#D;Id#D; I d    ٠ ;== I K K l8mk^^^kkkxO^kOn^kTnn r r   s8mky++z  DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/DisplayCAL-3DLUT-maker.ico0000644000076500000000000036452113230230667024224 0ustar devwheel00000000000000 KZv (Z@@ (Bb00 %   a hPNG  IHDR\rfZIDATx |yV+ua|\ 5ڴ4$!`ڜS Q)$ms>MƐ G.67dl,l.&ؒlKddZ]VJ?3YxV3}g~yw.313 0;v:*M 'q/(qt pXC-8v(8849UhvHw:3׿| >ajRNxycM))??c6_Z͸iiGyQ5/97`}E1tPXy߈BK }y 3`1n_wO_F__]_(R~dw?5(M(EU◿;å+_(R~w?iΜLƒ1|?NRB9wO78eo:%Fs _Zŏe8-ɘ4b:_"}꧶|ʘT1mğ=?]į?h?)101/s-O+it$l?crLCc 7-O?cxfci+~%D4'ʦ31៞߬7V%%a(-¡|<D|x|',-9P8c 0|./ !ˑ?~_t?E(;X񗄑 +?߇>(X"ZG1D;?[_^>Bj*tzl,h/RIV5zAQcߏ^eb_)~ !䯮B/? z,tS3wy`Su`vrp3VIh?C:?tZ Ok W?δZ O@vC;CC'Dܿg9N:_eFTB'??cx衉Xߩsq]fww m8?,xE5Ush.nMO3oiMO@*6lD18XA@8O"mv!8\; ;P0HL@{^H/ g~մ,3B"-;xş  f&ǡ}v^g TOL$s6yD;ݮ]79Lna{Be~{O:Ip??cb` -vךn6O l plϱ4lJm@(?O '~? <vg F7fg.|{Rx`Gށ ˁ="~}xO]3@FzpTG>UZL1xxS<:tnff&j2;'0#|uׁ1mg [((Yg>X dtnE\7;B H*5G~_n-[?a$''~vc mm}wcŋKN:nfs/YahZ>kmvOy4?-CMM:~^^+N .|UI!ސ1=$E?$|AaD I%~}CLXWlDQR*+K`Ѣo(_O:e~Q 򇐿<jVM TrS O/I??8$˵oP3`p˖šEw/kM!&˜VxY-j onI@I 9s LkyGQL!W,+~ʿ?_[K]kSY1ڍ? U/݊g5i"xT/@9#zѰO@c e=9g0TUiE5:ZAZz0>U f1?F#yyFh@Јܟ|%[a#K V>/KL@ZTUPYE/7FꐿgjY۫ 0j俤H7/KV,ˌ۞(/ʝϼ̃T 3Y[ ϼ̃ Kw=MB_XIr䯪l<3_P:'D Vг 2X `{(UA@73rcK!"Oj!efȁ$ 'm]?B0#ȏRԀ?Q"N>Z@e~F0W!%? 󻔫?c?ȯϩ)ڵ7E852Ϡ&WIP_Xhn~<\Ǒ#~ʏ>eXt_ֿ#!?G?A* w1^|hb/if`@8B'6j|9 \?B*Aw6 xO00v.UcI r>EpG$XE(++qdqZfͲ틟3 269-c3`ssJpX0.eVRri\Aw;? xlk y,w>S~")\oo}< - [t΋?^xp<"9W9 9W]` k&4kqs?g U_2&dOgW]p$~le/3=un+1\u̚僕+s-zV0<B;ϙO1Y:NU~o Üx $=Tkxc` o 35Bm@+~z"|X/jyf^3ߝvG"?g>o|43WģQhyv1ǍĎ<:+<&@.rS K|0{{ůSq<&@.rS  &&@.csOւv&Wב*%LI[ebV2'c:g>ڇR9 @U* ^<*/I/E#bcPhz\x\}fgTG:vsS k#~>+tڀݜfU~Apld;_c;vȈq{VbIN:mg 9Fcd!͜2`779 !WZ&S)~\}"~A_+kc}}p9/B~^^DՇ"VK@$/ɒ0#Ъ X6UUvjB@7աqrQ~Q 򇐿<jM 2;5AW]_@qڻ R#H!i*1&lq(A/F"Gjŋ "U9LM0/wg?/)\}Iydfrձv{:ej@u.)\}IC~&W[ Lky"՗%SlR ȧ"ٳrsm<?ie9A(P5R} =\} aaK^\*UW?+eQ[4W_R2rRh857߿wJ \2nbKj'PPzli+ҤI7reliҎ֛|ʐ G 0"4hHp?+)i@OSX/L+!%@\"O)^bs'I䟃L>@JVG9/D~&Wf-k_X녣=Uӿ\}Zu'YS\}Zuw6ϊC~9WCJ3՞뾒W[|@էI(kJ?̾ɝ?}էIH{\}VjN )$+Gq!ynrZ\{l:W{>*$2# i> "ȽI(`W_HsY?w>/JQu>0ʳnSxؽ,^.'IJ9wf3@g3iAF~9WhlDEoCd O38: #ec /=kgt?=%Px,~SlZ }'?Wꊀ[U߭fS$ &\{o# PV&@MO̓Wɺ#P3 +?r> /G1DTէ{9P#ЮtUbo)~t=O|u]u5sڱyБҁ ~! BQj("̝Վrn~<#d~O&bi~z#EGS~ O Ax#IR7~4K󖮯R#(}LFzcQ']\CFJkNO`a俨)H a P=v}Su 9G{4 <\SQsPP!8? bG,CY<#OIN! a֔!?G?U}['}?5Z_NlL\]~@$? `oD!nM^S~Ԑ)Ã5"#J_GKJ%0<{).Ԥ~Ct斖4?_wxsUy7/:cI /OA͇S;I \ڇ_oi4gm3@W]%zwS~-P `hP5ݶX\jکo~\f衼I(PY釫 e':/BpŮ]@6s_?+=oz$k*a|pbQfpY$,821,8u{m$X4-w9OT! N~/.<O9 `,7\}Y3ed} CttwO¢<,=#b'a_>XqEorp?078nطooy ڔ\}D*Y g)@l gZhh?HŰǰX#r)5auoCq_6ի (,=Ǘ (u=Fߡ0tϩIX68.nHG=$M냃{w?_ l>H)~ q80c\3`Fo=ˇ俙͚_#ۻiIX4R 7f ߆t8 mg>6Ih߾W$,@֌p (Xy8Uvd~hrvw|b<'aJް|8P_Fn!^82]B#bS[na< `K/ x]^ `ݟ2%gy{Z[OgM8HwZKpOV_h6 zdP+EcD8r῞[[9 W[{z쾵Gq8! @<\$Ks@6`T{0&T;4 jK/Ymz߇b>b e0^[C~m@>pȾX ,x(x X0a4!S8F$ ҢW@ @q8l_=HR؍=nr#⮻*4xW rI#K 6oR`M P&W[7f N)Wļ̃ ˗@*U7#Pbj qh'/ ̵7ٗ ~σAsYԮD_@4yէ?eA^q(g?0w&=nG biMpCfG\}Z'A=/Ko 4ohzz >[ۡAu `(7l,K_R3'M&ͥY!І`4C sj"~In[sEа,C0!cQ@WD-7~ 'qwQlۖ/l֮e)0f3"'=.!%੓/ ժYfɐ&n:̌H"~H׸d%IqCD#*~'ٔ~odpQT$mˁZ4fWV]󍕧ݴp3ZsV ?jS ?5ʮV_yٕPVcǐ]_AUd kFFFW2Q ߐ)&2z82 ȹ?t o 7G_B9"\m`+Ud {TCÒ]Wh>3\GW\YV @mK.9s+N8n _NUW[t ]]VT$`;W@'ՙ3pGh#s3#~vB?sai]?g; ů%6fϞMMAikZDl?t\}<'gk]"={*OvMrL Cp奦}&E'ӂ mx1Hlb5M;r6 xO@ +fd8&9Ҭ+~قKR6P/;xS17gg%H3`9OBr o\W5pvEP ʡ1l{N9|B#B rlW_UU~l; 69 Dw{7? +jWC*/K׹Fx}LN@y 3^?vJwy0o<62q ^Ο?I'+~.#!=oǠ&eavv6"c#_ݧ Oh36 s1SE9Mk8#Z}U%jiyX0wԟW_hTmۨ)F A1Ʊ18U~ʜ$ m߬6`&b3WB W p8%sSUL gyYnOuwn.+W]1Iߎ hM˺'"%Uȯ!vxMl뫜x c012䩍]v It #hhfț < k6f_6kVM$`-W8gx_.op%>u aHO=, *Sy|H4jM@RFj(aYJ?́oCqJA_!䗫x&`@!?6oKw~QD0򇑿4jFMȧ7o}1/○ ?X. }'"R3 odU2HUԭ X2F$ 4-@@}u$D3HT |Vm (73?+0"mnm@eQ=󓥟r}ƯVm3}:|Avj$iы`r]d }5ų ePS`?u_Z&+}(k#M콋4-z/h^N @7_2suS `WPYTWpICi  P])<r 3Ե6iH_iMLEwxɿ% TMT>{doX8?X?#^5M@kWȰg!/,R~<ˑJoGt ]cW o%"Q;_%~~_wAML@\ XX4?.$e@ᗗe?HS+.#BZ0,BDy7.U_Iy'E㽄߄__;_K@!rU6˕I s'I䟃瞫i* "?O` 5/ !tp*~\>/HZZ&|Yd^ϊc5dv:Y񓏒\}A+^8V{֛W7])f<-~z@$?ĒZ@`t oML//=A|{ӻWJgrY81Ϣ8@''`rZ\{l:WssoRZBIy[?_s禷j' XOR_oͯGM~b /#{1kEdXV y Ĵ?j䯯llji!~2s_էh#e#'e}2m$~臲ŗgįM8{e838~m9)MӯKc]]$/"Gr-&~:"TE&0 ůSvYw?7l@fpWۢ4ƵWW9SWf @(~ʜ@.4|ܔ]iv03g\W_zݯM{8TU !,V!E>,8yH~;r&q @tv'e+P}2B!w(~ʯa?}g#W"<#K yǑ :O\}5:@W%V)AOu]skfCuEegs Bodv'YWj(>;++( A>S~ }7 !\.0{WwA_nH#Yt i鼅Jlo&HDDFkl?@xv?\tq-=SAkG8?g |ЇZz/ 5Z+p*~ʿ1@1Щơ W}3W@|o5MM+/u'N9? bG,hX^U%YOr$~ʏ>A^`|)Gy4.[\n_Y}w?5Z_.Nl{-Ȯ<3ףmDOBm5X'BYm4?WyJMk2n]+m_%~,k( J d?g `2;?b$kPD'JH<Ư#@ʢMN&!8c0H/elwȰǰX`W}P `Rhy(|m_6ŋ"DO9 `,:o_ b2-ˌAttwO¢H4cЦ#_:󫅮5-G=ol gZZ 'a~$Z71,ֈa|ؚJo#q_6} !6N~ '&_KVTtwN9? O{D'U̓t YL3] R [hcP `'/rnps;ހ1ğ-ݴi@$ @ڰKM OVC7M uO?:<+A͝T'aB758> 7C0h͛*iIX4R ͗~6OC/_O8m@nhז|HоW$,@֌pP9&p|qzuC$,@\S^w7oI/?n8-@G%?Aw= l pExޙ1.Э&{; `zgn,}<'a$kxsMD`4o< e((媮E瑘B)jONv2 ~f%A>A_y%oI[ 0.^_˜hIש;?ͫ7Uyy8פ%QQaX|7M‘mGE־ʼ:n/hɿrs1Kٮ}VϧZX?oX4 ]%nqoͪ/y̖=]\6u7@SPV)!;:a93t'\&(rj e4Bu^gzXY^An4nXc4_f`>95D}e7ISI?7_?PJMx}|WC/B"x&pHhߢ!6^x|8j;c4Y[MbpQ8[xf_ } iz߇a^;.1ƿmH1G~sSxm!}k w @qE!i 9k 8[Ap6yGj#a<(á>'1N%GaO K%kh\9)G~9YEc8+?O5,ؼ,[m &k{7{C}Io@kߜ Kx3q&<ꓘy@T W#H-G [:u\^~4;afr5v{} W%h3Wҟzُz׼_ @ԏ m]+Vȟ\}jq,+h-@=Y4j ~RL&]8b)Ꟙ5v[4(m@Oec5xO"`|a%/o 4R00ɤz)fNKoұy,ʐoٹ?y.hzToD~s'@t̙_H5x _(31x=DW{^jciU8jkV-hc_DYoC~s__>r>$gت847?ALʃ&8tS!\m\_q& ;r>'O_ *sey⯞XHMe"cc7c+t7_a? ?OM)wcDro]1qoupww~g?[hgW7zɄ%"^`!۟|h3y:iN"~L3௰q&"?W ># >ȋ_}r2tL*~Rhg-:O=ߤ_,u[kH@2#%cMz*>L2I_>')W ?I&\}#N>'A -©ͶogF}?NBJRP_V]4+ِ 'd97O"ȣ$≗>t3ğ`# };') 2%KJ-~ K@مF?e~ŕqEWCCy8QT߈_%~6ȼсt'+~ͦ@f2܆?kW2p68ئBL9g3gw2֘Ww9аtiQ!ٳsjA@g됿lFE~qP1xO"W %|vʳ8j/^tOF'B \y饅FOsL JoGqį[iӀW$z:gk@5X' &9+~skL R6{*' qDW9:@/E/T_9+~]~g%H3`s';Ihf_e1d6u_ G[f'-C`hi :SU˗-+4=.tq_{sA?5?n}<'a`d_kC*}os< tck(t|XX7Mw_Š \Iƚә^ Ϳ֙NmG=?s? 7 @%~vPk]=O&Pq,qkkaјk~}(r_ßgx{q쉟~pr+|ZpC;])AtḳĂs ͟@2~ #п;O),]ט'{Y8 ='chڟ_]׻gwo GwPo ^EuDnTP/Ϟ skj !"ïsQM@ 䟏s'?i_01= s1A92<`% V\*yƸ LNi©_1ÞCT"a: +4*p85)R|6v_Dva @(Tb0; )eX\_J2&?a:Ƿon@+&0x ԁS09`U4s|\}yrõ?,ɞڭB73alV.z:^uu97k=g˃e7')ZG~_W9s@ǎ.~. kat|07^=m 7T^_X]' Ϸã@JE:Hɒ:H8@6`m%۩[KK!4BTtyCD__!/-1ڀu`@Kc.˃G K VmaȞO`onAna6.˫OlᒒD^\I`vfu)d02ݮWdIz9@@e_!Ы X3)n sW -׆tkZƐ]1c/բw$~ٍ7VWoųẂN(tbZ[v/n(*3FC(EO@,5I_H^kOz}lYiV8KhH-XgKܭ9VLidhRyku*2*.i.5 1& 0L- _0ͯaI@r 3Ե4I- 9y[{7o[ɭm'gђ3>US-,\y3%K?\f@.w*~{B?_2rRh857O M<}{ӯ5yՃu~pep(ʝLH3.cPUݢW~G_Pq@<-CyEʯ&2_QGFf c6lٖ'cq}?erPPr3$}ʴ)^I9~>eu9@&~Ÿ@Ӭ4x nr$+b>s_Jq*~7n´L g^4eO{ij_է 5n7GaWOyxiӃB {T2+&yW//ɩ0,?Ss_1_+gIiizGVӲcAZTVjP~HqO JȽI(W__,R~'DR_oщOzV'k/iצ ;W(hq6O~f3@g p@~Hm siuj5@w{7ɻįbkM\eg϶F2/_ٷ GrWL3 It^rxK}rgM@ꟗQeYwj4j俢>@m~ȿ>h p~r׶ #GAo|=8]O{2%YglPb_UZ{5ѡ'7[ y ӽȊ? Ab ߏ&ҜzNvdHqh? -*Fr@~B2OwW䷣ ?C?#:O5 #pJB!?>*Op?j<8 `` Q\}NO\}5:p͇ͮoK"XKI~:#~! %~⯛`38"d~O&@3^?arr_Hd z{t.M|p$ oU2Lٟ}q7-7o=9g-,-_-/ZOؘc` .g|KfAAAk9?g ᢋB_LAjgh)s2x?|k M8=\SQqԴPWs$~'`iWUT#S+3g>,HB}Д$G?LH}߽e^~$rvqbk]k6IAk'6/B0-~ʯ2V_ը9J }'OZArW),f9wݴi+~ʿ&~kou*s?'Df@C4M'W]^ h?g W]E~kPh~l)ݾ)i\|uw>#~#QTnh?u ZO5e PAH;h7)?c~ mmgO ս ~6]wOY?7Fj7IKfzK$Xn] xKOX:f t#{~oٿcG;)`Cs;%)mx9*F8~TVkoA!N~*+E{ꯎ]mS~ IA5ryM+ q8i6I^? / E ߆'8eX >[-8x4tt69 `,7T(~xqBn o}~b;9_6/üyj(= ux sژ\}^?R>H?!)s A<aosV1`7GW9e `/&0;=lW^fY2TD^Wz{hf47\ڵO; H7z:_}ui$~ g<Mmm['lf*Qޕ:s߱[ܙ5ٞfQO 7{CCOl;سbSLNz5#gN)#ȢiMȿGO͙\}cu?6x2;:0g462M㎷tε:T YF6݃Rf=M[#ٱMw>?*K >[}~u}#oxlz! }ӞY7o M'w{ۈ{zm*~'I-~7VGs[YBpCj'sDzYblju^w.="cq"~n{֖yT0#~~Mgc-Fى l99rJ>[tzO j=oېsP}'fj G[ Qvb_$GU|F];<&~F(ߵō:fov/l 찬ɤ $Iy K$':1a¬klD`>+ cDdt=f5MH(xץIc4w21ßmz]Z Y*M|%5'͝u81e%| ΂Z;@jĝ~3<;KGHcU^3f-ީ:g͹go3o7Z!Lׁ_ 3S?-ɎlNw+z/ii2bc|'ׄ]-oIENDB`(             lllkkkklllllllllllllllllllllllljjee^^ٌ frhkllllllllllllje^ٌ truxzzzzzzzzzzzzwphό mm7llmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmiiPPe g:lmmmmmmmmmmmmmmmmmmiPe t:xzzzzzzzzzzzzzzzzzztXd nnoooooooooooooooooooooooooooooooooooooooojjEEl noooooooooooooooooooojEgl xzzzzzzzzzzzzzzzzzzzzsEk ppzppppppppppppppppppppppppppppppppppppppppppppbbGGx l~ppppppppppppppppppppppbGjx w~{{{{{{{{{{{{{{{{{{{{{{hHv qqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrjjVVGGx orrrrrrrrrrrrrrrrrrrrrrjVGjx w{{{{{{{{{{{{{{{{{{{{{{pVHv rrssssssssssssssssssssssssssssssssssssssssssssrrVVVVGGy rssssssssssssssssssssssrVVGjy {||||||||||||||||||||||zVVHv uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuVVVVVVGGy!uuuuuuuuuuuuuuuuuuuuuuuuVVVGjy!||||||||||||||||||||||||VVVHv wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwVVVVVVVVFFw" wwwwwwwwwwwwwwwwwwwwwwwwVVVVFiw" }}}}}}}}}}}}}}}}}}}}}}}}VVVVHt yyyyyyyyyzyyzyzyzyyzzyyyyyzyyyyyyyyyyyyyyyyyyzzyVVVVVVVVVV66mT$#yzyyyzyyyyyzyyyyyzzyyzyyVVVVV6RmT$#}}}}}}}}}}}}}}}}}}}}}}}}VVVVV;wwM ||||||||||||||||||||||||||||||||||||||||||||||||VVVVVVVVVVVV(%||||||||||||||||||||||||VVVVVV(%}}}}}}}}}}}}}}}}}}}}}}}}VVVVVV~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVVVVVVVEE~&~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVEg~&~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVGz VVVVVVVVVVVVSS&VVVVVVS|&~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVS VVVVVVVVVVVVUU&VVVVVVU&~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVU! VVVVVVVVVVVVVV-VVVVVVV-~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVV*  VVVVVVVVVVVVWWqqVVVVVVWq~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVWqxslآ VVVVVVVVVVVVWWppVVVVVVWpVVVVVVWp߳z|}x]c VVVVVVVVVVVVWWppVVVVVVWpVVVVVVWp߳z|}~wFji VVVVVVVVVVVVWWppVVVVVVWpVVVVVVWp߳z|}~jԟImu VVVVVVVVVVVVWWooVVVVVVWo|zVVVVVVWp߳z|}~tVHlv ̍zzXXVVVVVVVVVVWWppzXVVVVVWpxqXVVVVVWp߳z|}~~VVHlv sooYYWXVVVVVVVVWWppoYXVVVVWp{iYXVVVVWp߳z|}~VVVHlv 菏||[[ZZYYXXVVVVVVWWppzz|[ZYWVVVWpzus[ZYWVVVWp߳z|}~VVVVHkt pp ||||^^]][[ZZYYWXVVVVWWppzzz|||^][ZYXVVWpzzrr^][ZYXVVWp߳{|}~VVVVV;wYM ^^mmyyyymm^^^^]]]][[ZZYYWWVVVVppzz{{y}myym^^]][ZYXVVpz{yhpx}~xph^^]][ZYXVVp߳{|}~VVVVVV  ^^______``````````````````````````____^^^^]]]][[ZZYYXXWWoo{{||||y}___`````````````__^^]][ZYWWo{||y___`````````````__^^]][ZYWWo޳{|~~VVVVVVGjz ^^______``````````````````````````____^^^^]]]][[ZZYYZ[ss{{||||||y}___`````````````__^^]][ZY[s{|||y___`````````````__^^]][ZY[s{}~VVVVVVS| ^^______``````````````````````````____^^^^]]]][[ZZccyy||||}}}}||y}___`````````````__^^]][Zcy||}}|y___`````````````__^^]][ZcƳy|}~VVVVVVU" ^^______``````````````````````````____^^^^]]]][[oo{{||}}}}}}}}||W\___`````````````__^^]][o{|}}}}|W___`````````````__^^]][oݶ{|}~VVVVVVV+! ^^______``````````````````````````____^^^^]]cc{{||}}}}~~~~}}}}VVW\___`````````````__^^]c{|}}~~}}VW___`````````````__^^]cƸ{|}~~VVVVVVWq{xxrrkk RR^^____``````````````````````````____^^ffxx{{}}}}~~~~~~~~}}VVVVVW]__`````````````__^fx{}}~~~~}VVV]__`````````````__^f̻x{}}~VVVVVVWp{zz||}}xx]]c WW^^z__``aa``````````````aaaabbeellss{{{{||}}~~~~~~~~VVVVVVVVV[Zq^aa```````aabels{{|}~~~~VVVVVZ^aa```````aab¾eɽl׺s{{|}~VVVVVVWp{zz||}}~~wwFFj RRssrrrrrrrrrrrrrrrrsssswwzz{{||}}}}~~~~~~VVVVVVVVVVVVWWop|srrrrrrrrsswz{|}}~~~VVVVVVWo|srrrrrrrrsswz{|}}~~VVVVVVWp{zz||}}~~jjIIu llkkllllllllllllkkrzzzz{{{{{{||||}}}}~~~~zz{{{||}}~~zz{{{||}}~~{VVVVVVWp{zz||}}~~ttVVHHv m7lӲmmmmmmmmmmmmmmmmmmjt{{||||}}}}~~~~~~{||}}~~~{||}}~~~rWVVVVVWp{zz||}}~~~~VVVVIIu nԳooooooooooooooooooooj~o||}}}}}}~~~~~|}}}~~~޵|}}}~~iўYXVVVVWp{zz||}}~~VVVVVVIItpzppppppppppppppppppppppb~m}}}}}}~~~~~}}}~~~ڵ}}}~~s[ZYXVVVWp{zz||}}~~VVVVVVVVIIs qrrrrrrrrrrrrrrrrrrrrrrjV~m||}}}}~~~~~|}}~~~ڵ|}}~~r^][ZYWVVWp{{{||}}~~VVVVVVVVVVIIZ rssssssssssssssssssssssrVV~m||}}}}}}}}~|}}}}~ڴ|}}}}wpߨhѝ^^]][ZYWVVp{{{||}}~~VVVVVVVVVVVV:u:uuuuuuuuuuuuuuuuuuuuuuuuVVVn\````````n````n``````__^^]][ZYWWo{{{||~~~~VVVVVVVVVVVVTTwwwwwwwwwwwwwwwwwwwwwwwwVVVVm\``````m```m``````__^^]][ZY[s|{{}}~~VVVVVVVVVVVVUUOOyzyzyyyyzzyzyyzzyyyyyyyzVVVVVf]````f``f``````__^^]][ZcƁyz||}}~~VVVVVVVVVVVVVVSSA||||||||||||||||||||||||VVVVVV`````````````__^^]][o{{||}}~~VVVVVVVVVVVVVVUUH~~~~~~~~~~~~~~~~~~~~~~~~VVVVVVl\``l`l```````__^^]cƇ{{||}}~~~~VVVVVVVVVVVVVVUUEVVVVVVzX``z`z````````__^f̈x|{{}}}}~~VVVVVVVVVVVVVVVVDVVVVVVV````````aabŽeɋlׅs{{{{||}}~~VVVVVVVVVVVVVVVVD„ƒƒ„„„„„„„„„„„„„„„„„„„ƒ„VVVVVVWrqrrrrrrrss~w}zz{{||}}}}~~~~VVVVVVVVVVVVVVVVDÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅVVVVVVWqzzzz{{{{{{||||}}}}~~~~{{VVVVVVVVVVVVVVVVDććććććććććććććććććććććććVVVVVVWp߳{{||||}}}}~~~~~~rrXWVVVVVVVVVVVVVVDʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnʼnVVVVVVWp߳~~||}}}}}}~~~~iiYYXXVVVVVVVVVVVVDƊƋƊƊƊƊƊƊƊƋƊƊƊƊƋƊƊƊƊƊƊƊƊƊVVVVVVWp߳ԟ~~}}}}}}~~~~ss[[ZZYYWXVVVVVVVVVVDnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjVVVVVVWo߳~~||}}}}~~~~rr^^]][[ZZYYXXVVVVVVVVDǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍǍzXVVVVVWp߳~~||}}}}}}}}wwpphh^^^^]]]][[ZZYYXXVVVVVVEsȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎȎoYXVVVVWp߳nn````````````____^^^^]]]][[ZZYYWXVVVVHɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏɏ|[ZYXVVVWpz߳mm````````````____^^^^]]]][[ZZYYWXXW2p |ɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐɐ|^][ZYXVVWpz|߳ff````````````____^^^^]]]][[ZZYYYY^myōȏʑʑʑʑʑʑʑʑȏƍym^^]][ZYXVVpz{}߳``````````````____^^^^]]]][[[[Y^___`````````````__^^]][ZYXWo{||}޳ll``````````````____^^^^]]]]^___`````````````__^^]][ZY[s{|||}zz````````````````____^^^^^^^___`````````````__^^]][Zcy||}}|}Ƴ``````````````````````G^___`````````````__^^]][o{|}}}}|\ݶbbJ``D``D``D``D``D``@``9``^___`````````````__^^]c{|}}~~}}V\Ƹ{yvҵy}{R^ԏ__`````````````__^fx{}}~~~~}VVW̻{z|}xsPW^z_̐`a```````aabels{{|}~~~~VVVV[q¾ɽ׺{z|}~wVX{Rsrrrrrrrrsswz{|}}~~~VVVVVVWp||{z|}~jVdllkkllllllllllllkkrzz{{{||}}~~ڔձ{z|}~tVVdm7lmmmmmmmmmmmmmmmmmmjt{||}}~~~͊Dz{z|}~~VVVdnoooooooooooooooooooojo|}}}~~޵ў{z|}~VVVVdpzppppppppppppppppppppppbm}}}~~ޘԙڵ{z|}~VVVVVdqrrrrrrrrrrrrrrrrrrrrrrjVm|}}~~ڵ{{|}~VVVVVVMrssssssssssssssssssssssrVVm|}}}}ڴߨѝ{{|}~VVVVVVVuuuuuuuuuuuuuuuuuuuuuuuuVVV\````{{|~~VVVVVVVwwwwwwwwwwwwwwwwwwwwwwwwVVVV\```|{}~VVVVVVVVzyyyyzyyyyyyyyyyyzyyzyyzVVVVV]``Ɓz|}~VVVVVVVV?||||||||||||||||||||||||VVVVVV``{|}~VVVVVVVVG~~~~~~~~~~~~~~~~~~~~~~~~VVVVVV\`Ƈ{|}~~VVVVVVVVDVVVVVVX`̈|{}}~VVVVVVVVDVVVVVVV`Žɋׅ{{|}~VVVVVVVVDVVVVVVWq~}z{|}}~~VVVVVVVVDVVVVVVWqᨴzz{{{||}}~~{VVVVVVVVDVVVVVVWpߧ߳{||}}~~~rWVVVVVVVDVVVVVVWpߧ߳~|}}}~~iYXVVVVVVDVVVVVVWpߧ߳ԟ~}}}~~s[ZYXVVVVVDVVVVVVWoާ߳~|}}~~r^][ZYXVVVVDzXVVVVVWpߧ߳~|}}}}wph^^]][ZYXVVVEsoYXVVVVWpѡߧ߳n``````__^^]][ZYXVVH|[ZYXVVVWpzߧ߳m``````__^^]][ZYX郮W2p ||^][ZYXVVWpz|ߧ߳f``````__^^]][ZYY^myym^^]][ZYXVVpz{}ѠѠߨ߳```````__^^]][[Y^___`````````````__^^]][ZYXWo{||}ާ޳l```````__^^]]^___`````````````__^^]][ZY[s{|||}孵z````````__^^^^___`````````````__^^]][Zcy||}}|}ƔƳ`````````ː``G^___`````````````__^^]][o{|}}}}|\ݧݶbJ`D`D`D`D`D`@`9`^___`````````````__^^]c{|}}~~}}V\ƕƸ{yvy}R^Ծ__`````````````__^fx{}}~~~~}VVW̙̻{z|}xsPW^z_̿`a```````aabels{{|}~~~~VVVV[q’ɗע嬹¾ɽ׺{z|}~wVXRsrrrrrrrrssw{{|}}~~~VVVVVVWp|欸䫸䫸䫸䫸䫸䫸䫸䫸嬸箸ާ|{z|}~jVdy{zzzzzz{{{{||}~~~zVVVVVVWozﲲާz{z|}~tVVdv||||||||||}}}~~rXVVVVVWp{ꥥᩩߧ{{z|}~~VVVdzt}}}}}}}}}~~~~iYWVVVVWp{ўߧ{Ӗў{z|}~VVVVdt~~~~~~~~~s[ZYWVVVWp{zz訨嬬ߧ{z{z|}~VVVVVdh qr^][ZYXVVWp{zz||㪫䬫ߧ{z|{{|}~VVVVVVM^hpx}~xph^^]][ZYXVVp{zz{{}}ѝߨﴴ੩ѝߨ{z{}ѝߨѝ{{|}~VVVVVVV^___`````````````__^^]][ZYWWo{{{||||}}ާ{{||}{{|~~VVVVVVV^___`````````````__^^]][ZY[s|{{||||||}}|{|||}|{}~VVVVVVV⬬V^___`````````````__^^]][Zcyz||||}}}}||}}Ɣz||}}|}Ɓz|}~VVVVVVVV?^___`````````````__^^]][o{{||}}}}}}}}||\\ݧ{|}}}}|\{|}~VVVVVVVVG^___`````````````__^^]c{{||}}}}~~~~}}}}VV\\ƕ{|}}~~}}V\Ƈ{|}~~VVVVVVVVDR{^Ծ__`````````````__^fx|{{}}}}~~~~~~~~}}VVVVWW̙|{}}~~~~}VVẄ|{}}~VVVVVVVVDW^z_̿`a```````aabels{{{{||}}~~~~~~~~VVVVVVVV[[qq’ɗע嬀{{|}~~~~VVVV[qŽɋׅ{{|}~VVVVVVVVDR{srrrrrrrrss~w}{{{{||}}}}~~~~~~VVVVVVVVVVVVVVYYH~}{{|}}~~~VVVVVVVYH~}{{|}}~~VVVVVVVVDyy{{zzzzzzzzzzzz{{{{{{{{||||}}~~~~~~zzVVVVVVVVVVVVVVVVDy{zzzzzz{{{{||}~~~zVVVVVVVVDy{zzzzzz{{{{||}~~~{VVVVVVVVDvv||||||||||||||||||||}}}}}}~~~~rrWWVVVVVVVVVVVVVVDv||||||||||}}}~~rWVVVVVVVDv||||||||||}}}~~rWVVVVVVVDzzt}}}}}}}}}}}}}}}}}}~~~~~~~~iiYYXXVVVVVVVVVVVVDzt}}}}}}}}}~~~~ўiYXVVVVVVDzt}}}}}}}}}~~~~iYXVVVVVVDtt~~~~~~~~~~~~~~~~~~ss[[ZZYYXXVVVVVVVVVVDt~~~~~~~~~s[ZYXVVVVVDt~~~~~~~~~s[ZYXVVVVVDhh qqrr^^]][[ZZYYXXVVVVVVVVDМh qr^][ZYXVVVVDh qr^][ZYXVVVVD^^hhppxx}}~~xxpphh^^^^]]]][[ZZYYXXVVVVVVE^ѝhߨpx}~xpѝh^^]][ZYXVVVE^hpx}~xph^^]][ZYXVVVE^^______``````````````````````````____^^^^]]]][[ZZYYXXVVVVH^___`````````````__^^]][ZYXVVH^___`````````````__^^]][ZYXVVH^^______``````````````````````````____^^^^]]]][[ZZYYXXWW2^___`````````````__^^]][ZYX鮃W2^___`````````````__^^]][ZYX鮮W2^^______``````````````````````````____^^^^]]]][[ZZYYYY^___`````````````__^^]][ZYY^___`````````````__^^]][ZYY^^______``````````````````````````____^^^^]]]][[[[Y^___`````````````__^^]][[Y^___`````````````__^^]][[Y^^______``````````````````````````____^^^^]]]]^___`````````````__^^]]^___`````````````__^^]]^^______``````````````````````````____^^^^^^^_澏__`````````````__^^^^_澾__`````````````__^^^``J``````````````````````````````˿````G`J``ῐ`````````````˿``G`J``῿`````````````˿``G````9``@``D``D``D``D``D``D``D``D``@``9````9`@`D`D`D`D`D`D`D`D`@`9```9`@`D`D`D`D`D`D`D`D`@`9`?????????(@    mm#iillmmmmmmmmmmllggUU m#ilmmmmmlgU z#tyzzzzzyqXttnnppppppppppppppppppnnXX pnpppppppppnX uy{{{{{{{{{xYjjٞssssssssssssssssssssssbbTThՠsssssssssssbTjӠ|||||||||||cTllwwwwwwwwwwwwwwwwwwwwwwjjVVTTjwwwwwwwwwwwjVTk}}}}}}}}}}}kVTnn||||||||||||||||||||||kkVVVVMMj|||||||||||kVVMtk}}}}}}}}}}}lVVOooˀllVVVVUUkӀlVVUj~~~~~~~~~~~lVVUpp˄mmVVVVVVlԃmVVVj~~~~~~~~~~~lVVV * qqˇnnVVVVVVpnVVVnlVVVlزsZ qq͋ooVVVVVVpoVVVnlVVVlײ||ZjjϳeeVVVVVVkeVVVicVVVlײ|~dȖTbbA]]XXVVVVht]XVVh{{\XVVlײ|~lסVTdd¥dd]][[XXVVllmd][XVllu}}vb][XVlײ|~lסVVOv__``````````````````__]][[YYmm{{g`````````_][Ym{g`````````_][Ymٳ}lآVVU__``````````````````__]]``vv||||b`````````_]`v||b`````````_]`v}lآVVV * __``````````````````__tt||~~~~kk\w`````````_t|~~k\`````````_t|~lآVVVl{ssYY^^'__bbddddddddffllyy||~~kkVVX_[vbddddfly|~kVX[bdȽdȽdȽdȽfʽl׻y|~lآVVVl|||||ZZm#iܰlmmmmmlhj{{||}}~~{|}~ؾ{|}~cǕVVVl|||~~ddTTtnpppppppppn_}}~~}~}~{\XVVl|||~~llVVTTjٞsssssssssssbY}}~~}~}~|vbÓ][XVl|||~~llVVVVRRlͺwwwwwwwwwwwjV|X``|`|````_][Ym}}}llVVVVUUOO:n̽|||||||||||kVVsZss````_]`v}}}llVVVVVVTTcolVVW`````_t~||~~llVVVVVVUUbp„„„„„„„„„„„mVVVeǍdȌdȌfʋlׅy|||~~llVVVVVVVVaqćććććććććććnVVVز׆{{||}}~~ccVVVVVVVVaqƋƊƊƊƊƊƊƋƊƋƊoVVVײ}}~~{{\\XXVVVVVVajϳǍǍǍǍǍǍǍǍǍǍǍeVVVײȖ}}~~||vvbb]][[XXVVVVabAɏɏɏɏɏɏɏɏɏ]XVVtײס||````````__]][[XXWW^d¥Ōʑʑʑʑʑōd][XVlײסss````````__]][[ZZ'_Ð`````````_][Ym{ٳآ``````````__^^3_`````````_]`v||آaa``````````_`````````_t|~~kwآ{t`^'_bddddfly|~kV_vȽȽȽȽʽ׻آ|||[m#ilmmmmmlhj{|}~Ȇ׼Ǖ||~dVtnpppppppppn_}~Ņ||~lVVjٞsssssssssssbY}~ΓȕÓ||~lVVVlwwwwwwwwwwwjVX`Ηء}}lVVVV5n|||||||||||kVVZΗء}}lVVVVaolVVW͘آ~|~lVVVVapmVVVϙأǍȌȌʋׅ||~lVVVVaqnVVVܛأز׆{|}~cVVVVaqoVVVۜؤײ}~{\XVVVajϳeVVVҎǖײȖ}~|vb][XVVabA]XVVtЩײס|````_][XW^d¥d][XVlԋÓסԾײסs````_][؆Z'_ÿ`````````_][Ym{ɉ٣ɻٳآ`````_^3_`````````_]`v||Ç밷÷آaА`ΐ`ϐ`Ɛ``_`````````_t|~~kw诸֡آ{t`^'_bddddfly|~kV_vÑȗȗȗȗʘע֠ȽȽȽȽʽ׻آ|||[g{{{{||}~cVVVЌƕǕ||~dVaAy~~~~~{\XVVtЩ||~lVVbu}}vb][XVl|Ԋ误뱱Óס|ԾÓ||~lVVV_ÿ`````````_][Ym}{{ɉ٣}{ɻ}}lVVVV5_`````````_]`v}||||Ç}||÷}}lVVVVa_`````````_t~||~~~~kkww~|~~֡kw~|~lVVVVa^'_bddddfly|||~~kkVV__vvÒȗȗȗȗʘע||~֠kV_v‡ȌȌȌȌʋׅ||~lVVVVagg{{{{{{{{||||}}~~ccVVVVVVȐe{{{{||}~ƕcVVVe{{{{||}~cVVVVaaaAyy~~~~~~~~~~{{\\XXVVVVq[y~~~~~{\XVV[y~~~~~{\XVVVabbuu}}}}vvbb]][[XXVVVVa“bu}}vÓb][XVVabu}}vb][XVVa__ÿ``````````````````__]][[XXWW^_ÿ`````````_][XW^_ÿ`````````_][XW^__ɿ``````````````````__]][[زZZ'_ɿ`````````_][زZ'_ɿ`````````_][زZ'__``````````````````__^^3_`````````_^3_`````````_^3``3````ο``Ͽ``ο``ο``Ͽ``ƿ`````3``ο`Ͽ`ο`ο`Ͽ`ƿ```3``ο`Ͽ`ο`ο`Ͽ`ƿ``?????(0` mmIffggffffff^^UU kKeffff^U pKijjjj`U rs;nnnnnnnnnnnnnnjjVVo=nnnnnnnjVu=zzzzzzzuV llrrrrrrrrrrrrrrrr``UUkrrrrrrrr`U o{{{{{{{{aU mmwwwwwwwwwwwwwwwweeVVTTmwwwwwwwweVT~p}}}}}}}}fVU pp}}}}}}}}}}}}}}}}ffVVVVo}}}}}}}}fVVo}}}}}}}}fVVrrggVVVVqgVVp~~~~~~~~fVV\R{uuggVVVVsgVVpfVVgΰt[ ttaaXXVVsaXVo`XVgͰ|lآU ii\\[[XXh\[Xfx\[Xgΰ|oݧVU ggˬoottttttttkk``__\\[[ggnottttk`_\[gllpppph`_\[gβ}pާVVR{ __``````````````__\\oo||d```````_\o|d```````_\o޸~pާVVS}__d````````````aatt||~~nnZl_`````at|~nZ_`````at}pߨVVZmm^^ mIfgffg`{]kkuu}}~~{ku}~{kԻu}~pާXVZ||nnUU s;nnnnnnnj[||~~|~|~eʙ[XZ||yyVVUU l۶rrrrrrrr`WvvvvshϜ`\[[}}yyVVVVUUmwwwwwwwweV}W}}```_\cņ}}zzVVVVVVp}}}}}}}}fVV````eɌz}~~zzVVVVVVrgVVvf̊o߃||~~zzWWVVVVtććććććććgVVΰ}}~~ppZZXXVVtƌƋƋƋƋƋƌƋaXVͰآ}}||rrdd\\[[XXiƍȏȏȏȏȏȏ\[Xΰݧ}}````````\\[[gˬottttk`_\[gβާuu``````__]]D_```````_\o|޸ާzz````````#_d``````at|~nlߨm_mIfgffg`]ku}~ˋјӚӛԝ՞Իާ|nVs;nnnnnnnj[|~͋ʙ|yVVlrrrrrrrr`Wvܟ‘Ϝ}yVVVmwwwwwwwweVWޤ̘ņ}zVVVp}}}}}}}}fVVަ̙Ɍ}~zVVVrgVV̙̊߃|~zWVVugVV̚ΰ}~pZXVtaXVݥͰآ}|rd\[Xi\[X́ͳΰݧ}````\[gˬottttk`_\[gؐؤߪߪߪߪО͚βާu```_]D_```````_\o|Ƅާƶ޸ާz``퐿``#_d``````at|~nl讹ܥߨm_`$ciiiku}~oX^ŎҞҞҞա뱹ܦžһһһռާ|nVfSz}}}~e[Xnʙʙ|yVVgsxyyxth`\[[ې䫫ﴴﴴﴴ误ϜǐϜ}yVVV^```````_\c||ˈŕ|˺ņ}zVVV_```````ez}~~xxssɘ}~xsɌ}~zVVV_.`ffffo||~~yyWW``|˙˙˙̚ߩ|~yW`|ˋˊˊ̊߃|~zWVV[[1ss}}}}}}~~~~ppZZXX`Ws}}}~~pZXWs}}}~~pZXVkkuu~~}}rrdd\\[[XX֡ku~}rȖd\[Xku~}rd\[X^^````````````````\\[[^````````\[^````````\[__``````````````__]]D_```````_]D_```````_]D``R``````````````#`R`㿐``````#`R`㿿``````#<??<( @    jjnhhppppooeeTT frhppoeT krp{{zkToowwwwwwwwww^^TTowwwww^T}r}}}}}^Tvv``VVv`Vu~~~~~`V{{``VVz`Vu`V^S|zzaaVVyaVs`VgͰdǖUllր{{__ZZk{_Zhur_ZgΰtVS|__``````````__llb`````_lb`````_mٶuVV__``aaaaaaqq}}uu]_aaaq}u]_aaaq}vVWmmTTjnhppoe`~~~~gΛZW~~^^TTowwwww^|[||hН`_[~~``VVQQTv`V```n܅``VVUUzććććć`Vwnڅ~~``VVVVzǍǍǍǍǍaVͰǖ~~rr__ZZVVlֶʑʑȏ{_Zΰuu````__ZZk_`````_lٶ``````^``_`aaaq}umVjnhppoe`~Ώ۞Λ~^Vowwwww^[Н~`VVOv`V܅`VVz`Vڅ~`VVzaVͰǖ~r_ZVl{_ZЕΰu``_Zk_`````_lآٶ```^`_`aaaq}u੺误mV_}}~gZsΛΛ~^Vaoooi`_[Ȑܦݦݦўܦݦݦў~`VVO_`````n~~ܥ~܅`VV`xdffn~~``qqƖ˙̙ڥ~`qƇˊ̊څ~`VVhhtt~~rr__ZZ˕gt~r_Zgt~r_ZV__``````````__ZZk_`````_Zk_`````_Zk``ɿ``````````^```ɿ`````^``ɿ`````^`??(0 __PllmmiiVVBB\SlmiVBc\SlmiVHllVWlVlU~~X\~X~V~~X\~X~Vb¡XEgnnZ[nZnYeʯiҞT~^^nnoomm``\\bnom`\bnom`\gδoܥV'M'`Okmiv[mivmvmҹ{nۥV~~VVHHl[~_Y}}]]UU~\a``~~]]VV~\áz~\\VVn[ʯҞ~~jj\\YY^nom`\δܥba````Z`Okmi[iӠףΝҹۥ~W䁬Vl[آ}]V~\~]V~\á~\Vn[ۤʯҞ~j\Y^nom`\āܥݦ٣IJδܥa``Z```ak{ֻ̱֡ۥ~W䬬V[e~_l}]V`dda``ȌǖȖȾǖȖ~]V`Vbcez~~~mmĔŔȗ~~mĉōȌ~\Vddqqvvwwjj\\`qvwӟj\`qvwj\Y````````````Z``````Z``````ZAAAAAAAAAAAAAAAAAAAAAAAA(  YYkk\\UUYk\UYk\U||~~\\|~\|~\ {{~~[[{~[{~[gͦUbbppdd__bpd_bpd_eʮV [k\{X{{sVmmUUܹ|~\`_ppVV{~[ЧmmVVbpd_ʮ````[k\X֡mV|~\pV{~[ЧmVbpd_ēߨƕʮ```z``bҁÓҶþmV`+_h`g͚͚pV`+^cmttĔڤӨtĎچnV``y``````y`````````AAAAAAAAAAAAAAAADisplayCAL-3.5.0.0/DisplayCAL/theme/icons/DisplayCAL-apply-profiles.ico0000644000076500000000000042763113230230667025244 0ustar devwheel00000000000000 v ( @@ (B100 %Y   ! h1+PNG  IHDR\rfZIDATx]E>KKK/Ф UTA@DEzT齫(ED ?E@@H!:BH啻;Μ3sK $o^ٽs2 t¾d%+YJYJ.d%+]dt@V҅KYJ.d%+]d"~Q|63&x\o؞%>9l}W}Y%u\5fB c<,w0++ _^V B3b@6&s&<0 XTx_?P?U8]~_9[8~fYd^P-}[|S|!tB *//( Ll˄`3Ϲi$pܧ,يSĂ#'uڎ"3ࢍ"VAglkE7E788g. gd+_+`lXl(k VUj౰WT,ƥ3%6 vl+F ۍ˺b;fl#ca]hhy3#oqE*/3b%|%\\mW>BtF5uA,QE-DǕ/h_ֱl/-`H+GtbRwY7"WsyMxp4 1 ,_!aHۢg9OD_m&Wh{>R-bO1nXp)px vlWv8@7b֯\_Kk\T/wYM]AM=D,'/? ,@i@P8npM6$#:nd1C0D0&8uf14/ 7^- ڟHVd`5+SPA|XA 3Uv^|­KYY*KfE!ώ8ƪ6Џd93..Hs6@d}F tLut8MKnN@ ۍDf?(`)"Kvh1X"XrVL  peNÕ,D7˄?6gWTI n`L4=D=pL0`7)M(tx&+=8 P].~p| N _5ꛠz1O{v/F\hN} a>"hF$ [kk06@89N}[~eoѥಇR\(|4ڙ|Li]BR)3!L0$e4 .s[kB^gbM+VLJ/[aᇳ]+֤ꫠ60A:‘|EƛJ!BCҺ/dd03*kE/.:e-=\z?6A}ߺ TT0k~aR1|(Nﵯ3T`g2U;< ױB|`(1/KDluO]G mGcDXIBM_M8+M>mh%c?pcXfk~OTZˋ0comV8z a\E.Tu?U7/ZYmsST;`<@rk|^@Y'x_@S 94SBYG@dLrTKGn/!pb2#l)O=3!|A+-/Fin}B3tRPz ͟'aMFM ϵk܉3h\r^E?P 5w!ws{<%wv.P|8@:>q3% e"H3}B,h޴]1{_xrqr>hgB#8v zW'xc^>-54hܣ,6,fĭG0g´֛wtp.o@OCP+n;2 Pz,@7JY;(S@hO84'9M>uR) CCo]<6ǹddKPZK5K& &Aq$#O;RŸ\״۩,Ϝq@@\gC~UY!9G;vGZa9 =>\>aI:@:id ViKT& O%E!fc2G2MPIF`(@ ׎'+˟37"&C$Jˋ:fs/?jvP0n :+>.͹F `L-N@}%",>ҁKо@d@<,(`Qk۫OYK V,)Pv^gZ hz#>*IL 'I@=uV0h}X Q2Ȗ>O F6@_;9!lu.m\Mr5 jB;>H-.>kuR` z".pyEihmo "xJx,7s۰5&:AOqy $iA"9I 0H3 >gmP\ AMz%Sp쁬+(!0qfP :.6/c\u:KJ'?ko?|C:Ie}>3$ DvIB Apʐ'G(`jp J2bg`,InM0e%|}C 19{9="v֠-̎Mo^\p˸@&_g`/Y/>-Mu:}uI?!}$@̿X IAS$(MPTRPqI8w/T:72S[9ִ`URaz1Ng"zIҚɹ)Q@p 72窩Go_.yVB}ެQS}[w(|(!Wz<j*@ 8 mq2t"SO]%;^ȶ+P}İ۾b&o4Lie;RA$HQBEq-OjMȔ[˥-n9I?)_r:H-N ܱӻ.wB}Aenf+*KVwbE@RU]/Spӂ)xL_;d&ht:0$?c 'iZkPu_dz̾T L%v'/9:`}0r?4@>VJY!D"E})0G;W={AU_sT{3+IX'wh}Mm (;M!ߊps}6MTt LAnV ">>uP&Cp"}OPt86}3uBlVi@EuD)iDZ8Gb:@A/oAk狋c:LlQtSkqGO#.; &A9_)X LQ^ g+GߎY~KJ)S$xx e*|D R~РS A#hP`33fFssFyM_jCU?Aw_$(n>OV`%’m|@ ?_ t>l̙ˍ>u#U/!fEBÏ 14eܩx4m/5wN7ς:l9zvE_⾆ slp]/'kzo YУ 8㮆wΓ-K G}&5ՄK'04sώ_@N _O]ʓ@^l1}0a9cgt 81X7w^>!\oJy"9& iZ@x1L5 c'Sq Hگ>$G!tJ:|2 #άc){RC$ 0`@i$uV"p%cĝVU?`\\okQ>e&&7NySJ|JԢ3H4#ޯ2\l$7hK9XN9nj9ۙRCCuLB-OxO};!C !S g ڄE}CA>ߘ| hݕG=\[{gfF^{߲rLJE<?N:Z8h*fсܦ6Yo)|] 3pxmMD=m'w.ً 4Df jfBtN7^mdLYcf 8FD+ƷJ9t-ޙK]P`%(FwK9u@k0j0S Xch9n? V,>'G 0|;|:ؠ $%N-ArdO2D=W Sdt4!  S11q_]FBKiش0AN3.0Uuj^H't$dFu`. ?ai]@@|FA[@iSjJW‰v ,Mw#h)ALRJ'tf[S5pvSRT>30@1ߓ@4|怦 0>g}!eVGWTh+_l.+}Aw?c GdCǽKΟ#@A0pR``+84KrZOpQr\Q(kگRy=m'7Z(ed0؞M}0G`eH20L3ͭ}nZ^Y*??7sKD3{c^RraP*= RpՀS,@^:p o*{:',];6 0X9G[ y4oM%>mq4݊PoEt:mr1'\D ddMwy{\Q z}`Rjn \6x^in@Ay)0 |Mfd]'߶os@{Fx1jZ돂 E6ЯFhˡG7p.yT&Li[G'쏱M(&^݇1G+8aL ^Շ>|{=iӖCu]1x_xNۮV~ iF@4ds E4;5!֊3XB})H޼!PsѦXәL7noOc7]3Dv(geHOMO&@f/lS12$%~?3~>g Ϲ|.KD,۞'=0 @[#u:м9H 1x+aRg!oi¨<;n_.v8ꀓLAKeDn/YֺIAVN@\ڝʘ5aȴ(;1B YSU v+8[3{(ʧN#= @C}ݛKIMi\QL'O^#&'i 1k'N {^MmSpv$tAFt`6:@z!cPO2l0CVh^yn]̳FS|ߨ>ddh4mGpjUu8GL9 Iw qJS@ yKiꎄ%A3,,45u5 BCO} y;kZ>#3mLujtQ<DNaC&M0jhc&Hk*O䀚~ƫgv{mE`wO{DN`czj1NXa:*9}~5y%Ǻ9nQ5 @3w\xB-mh"DtAscy%b:S8DRLA{Io2ӾY;d;Aƿ ` }u8ct?q3lܲ|K1zS'u=c֢ ;fCj]@Pt; O .(ۖ.% |VLx7m-ow8WOEzmn̗l϶zun5PV[%v5|>t' َ=k:2(K87,0HJd+ 6ph@|2AiC9k: >Z=m/4WWŇ©'BP:~699i$|3KT}^$BP"XW, -4χZ6ο<ȣ_#/odښ<]En $!>mۣCs Th =lIDhoۓl?}TLIY#m;Hki?pqSRk&>]o_7S󣺺&x`)*‚N,c׌p#\X@|/S0|Lh;Gb#^}ܵop0 $ }.e}|y' v׋U\eLF a ۉSiɨ #N:f@*Y8(7@WkS3_t[Y8~ЫCr.-u#N@ 5 \ e.rDz (+#%Aȿv*V zւhd"Nyb XS}+%=݇32 ^LՎGoSq$zNVbg"%nf|L40XW`h{~zM뉑z s<]:g>nmOxRh}áҺɤ󲀀}Ljv0͜^@ :A~EB<%At:=Mں{N?RBFlJ)u6(T]T3GS͠xf(M!k=}5 헏Zׂϵb):qrf|;X{Oo&]Àv+?wsM=;X(էпc[W?tcHFJTzo}׼ߣG3_S@u͆W9vt 0!4{.2[>:u~]9TV̑T;`/c`\<`֘7&D5 $:GBϞ|Դ T gW',)pf2qiÊ8H)$aes?e>|ɜ@i_Y6 KTY_= izV! #09A}AqCVI-No3́ 6>cbQPTߵTf zm&ܶ'rX]M7Էd!Ї ?9>mNxq/3H-jyT`}Ųyh(7MxOV(-k_ٲ@8u_}7[X:eX= N>EՁ>D RTfSKSsis>e >p'?z St~ܵy~gLYÚLk $ %x z|b~08dI' N+ijBo\? rSqo/"I }?l>gw0WN",S+;湻[t7Q>/tAUS*ˀ<ހN @RؖqX;c;פǶ"F7Km\(x$3opʉ+}yV-Gyz?@30XAl֟6ض>ߩ+_l_ ?rK(%k̹[.UsarP?0L-`bq\"[I=is.OzQ tp̫6D, 2]03^!wk5~iݻm]`'lRPv@7X$\Ӏ~OhOK9 Q6P(-aܻF0tfwr]\U}Q,QN xeAC2.m{i@V'$OSwrA /eh:ٰfens-w cU5ttX NZmծ^p?)3( |n+7*ʘ{N];掋 =*/*!,"(>#-FXi”i?.C>06=Ttl@Й1p^_kv⿿Y]=7EN яJK>f{p|;p;,9_+N~K'%U+!*ȩ®?z20oBms(>]3OM 9`GswR3409#k1W8'eP'P\+D赀XlԬ-2ccBx#¯", ,7{f(zW,RCzRuKyEXp-;Ajm0teN:ꪞ ضGy-@r0U@OiNԿ'5']it4bMs,!,Y0w]@Ք!eBsUP,@Gh^Z[G]v1 L=B6679R7 VkHxK/ MZ _ o}=mBNMq|1X2#XpCu˗̦3Z2woWe W{WC Jӂ1l&`G҃h0GaG@(sk@ hUMMSlks-M}_77>\ua)V"c=u1"ױ(sOK}&qr˞NG+d_?z_&XXN_"ߞt90{q*:_@fv:Xc i1@E8zciÀ L?Ku ءWkL޻'3:B}.w,Յf S h^6̜8oΜwxM3'ѷm*zL^U&oҳ,S zAiS7ԟ=mwGÅx:Hi1o-O|j豱y\:ԑ'Q#qS@Sߥ&nx8 (j_{R΄S^饺A=v*,zð^׶<7˷:DjX$fI=,{ 0]y3 <<饇5nrHyoN9uZPxQsMӢ |&Bբog0E> >]ww1daKV٭ڍz /\7=Zr($@ڞfa'(UPVK0tjCB;{Nx8I28cq-/wP|(.Z0I44T6`)h4E,aSG-Y2p^l#+z m:P4wK@x?cz&CO|pPhlC'*adzMFZtI 1LsG={Mm4l4zTp}=nV#]hT0j_n]y 255n1h^'O\C{ 'oT`iGD@%S5dv؊_y pu >/h/[S_2ߴzU /k*KʁaTk*anV]fɾE}/]y'~S6ūZoQv?}wɟ!_Os|Kp`3HQo`%Jq.%ӆffpk$?~z\:%);_cZ n*pmBRpXe߃}u` -۾nS/%~r_ҸݐNW8S?ķJ A5 ̇ MFȾ10AE&}]FÛsq6 t[rukz}+  0 cSNo\'=N3 zyᛴb̜1,t>;bd㟿# *s` h' N@+~] >F`fC8SY^O=LȜ(-AnA2v3^Q>5hIҒ+)u-!4mI蜗Y>w,^<f~`St>{zl5`>LϷ'鼚ERۜ=7a?4E5kP @M@d1u0~sY^OFUIm(HeY'z4;Bd_I6 oMeŋmīRϨh8ogZۿۿzn.ƌf./5V7Ketv`KUg1wf\PmqG)BS I~NFR @|,\8}(? _&;_]3v  %:KYٍq5Un T[T+:of\j`tD5=l@>/NJXcmg}m9ۂ+S } rCBPg<-\VmG9Vh rmcyW|.uo;Skyr>nϋ<_i lr+5C065MπOh@Z; O@7Y=W]MܜӭJQϕ|i:-w?4s !Xd&̘~F[ .^?BeᬊU +PBEw8q8~6`!eDjZ9=H_;P:)$@?t=#? zHW=acЋz |ξ1Js)S+k?>F ">)Ơ?thOmt\4 lدP-ȱͅVI춽JZj7RZr*#t%-<LO绵@*"k9=}7?Zh.7tGzAaN-@BkT'yEb{ߝ!_XfxN]Pk¤a*dm֓rZ~bw$af}42P*WYރ9>]i/VYIT2t}u0ꐻYɐ]Ԣܸ &G#ruG`EN5"F!|s~C_y%ȴ_^@曬2?@pQCޯ 32;1Ҏ7g8ע Ruf ˕-\2fzo B&_P f |ѹ&=xi z džV]I:4+Ȉ:J|6/O<@Dه;u0w'߽/>Yug_pj/+=S^OQ_gtNE)[ZF< @¡)XG_f?/[}vVdk,<=ߖߪ,aEgzC+qϭpwq z@G灣 hhd%`ڬ |~GA[%w+ {083h~Px_Vnܷi߆ 's}}2_VxJt vi:)Y>'Y<_KZvϴI|sߞ>g6V1vZ~ kQSY` qMqާ3-IS^{{2.P:sĮM7RUdX%JV#GI l#폕:9T+.\< | Y3?#ݿ) =8xB%Ȯ?cIJ(EG?sZCs9RzԫJRX8kؾ'j`EHO} f͛͝9LPޖN£oðszwb%M 9c+Zhe:qȺ%gNN#x= i73 pǀޛP?=QK1ޙbJ{ӆ>=Ȩ+Z‡S_{{#H&n\|3 mNꥲ}Ov)2iӺ 7eѲo̬de-<FR]C;#*[I=>CѓPimu]LW߻d%+maOL7f5h_:iO\G7KEPyf,wm9EJp~o(+v=_ԶvQacNMHJ̃٬¬Y"#Hrgn:xޅ\ॄ޴vyәn{F/:q3ucL7d.R:rA^h`-A9@ e9YCgJܷ#>Up6?|!dNʣH@e.Yѓnt^K]5jՁ/a}O9lx?~6~e%+m8֑_S:P96?瞫-nE D)]N~{+0}ozlT Y0+]t+~e=Ƹ؃xx1a.޽>)>&~o4c|;:sd.R:\$NvI} bJ;KaױLo}|<~ +]t WCw OQ6i[Upƒ'؝ MuS^>~4$t989[ ݣ.d "5dn~J~٩V}I=yZ)t_ʬp؀_ d˔ yG==}zse33:-DHs9=K90 %35o\ntG>wPVvـjGK em,SsMUf>>f/9y +]t G[ e`E2HN-%ҕK8u>_xg;BY"S'OtЎUךN~^)a %^g_G̀RqZu{3;ȢY"S'5?yٍos}z)Ox22lc9nOJIkIBOOgpiL +]tG<~#Yd;dDlmWm K9L͂ᣙ{R%JܾA-];M+s垺ɨ oه{,CsRo잽3J('K4nzVnkxzKdB 7C뉇 IҶ~Fs>yևol6`V@S~^= vJ}WRz2ADD2^ًmy惇zY3]G}? kBaĂ*tz tfieemB>oYgO3N9g$S?֯۰T. 6M(zS՘]T(]ZeAoc]6 &zw߻!J(i߾a-j.Dk~J*nj0=>[ߧaGs>5%)oL<zT`\'csM/oGOa۞]Jޑs%؄ΧlHOk LG޳Q9כs/[ y|fڟ8f7R>vFM[m7a@Zʫ1;HfC}v x2Xcg+>BDëdS4)r`1+$DAֆ__ur,{xԐ^8fi i`!%;X< aj150X0Z/2 y`>Η:װc!_yφO^ C&~ H'$57uV .<;~Fmt'8חCR{ws\eě0i= X?UnXnc>X nY ~c4!$uClX{3Hw;3v?siEi@Ԟ\p?)A>wc.8PPB߁6X160:[<`Eް/[WVC$`!Fz FCϞU: p;Aֲʼm>PeYwƒL?UǛA Fx hO;лN8vȆC %UBKs%` QՉzHGpdPn:HVP?|o&>o>7OY@tݽ<;E=oYޚ>޹NxϞ`+ڊ 0QeE!$(,.=OK* TTq[1+JJbDC{a3a]TRs+>t2C ^ߍ'{{4dΕFfІoY-1gcs_3x /~ߊ|,"5UeJA# 1 i: C@Vד ,C_#f@޳О>Eҙz. 3#s BNo,eYw=ߊ ̀u<nsDFK{,)g@B "kv; jU8_\&I8׍P M`7K|9; 8|۟5>wpf̞t&,ywc%Mi?0L9 pxmKť+lrN3c;nkc͜pkוҎ4@},Q A/`>##bШ. L9ϐmRO9U0D0cǷKX5PX@G`-?zlw0Y Ա};^Y`rBwڍ@OMu7@ B3Z也;w;2XW {gݮ{Umc1/2( \*OHNA,+)L!n4RPHQ" 0TaI֛"X94m!Xyr.Vz n#lG6Ȧ6VUq,z-rL*tXOA'2L b~AϹ.o]!wd ֗wT]Ӏ 6ڹo^mbMYk}/0! QyyNO, Eڿ(~PB*֞+VI0MHO;PP^/Ot8ǒAQ n%$a$e5nk3B%q55er%~ aQz1dC"3䵅0ʊ+W?$~cw<}78>-DﺞD9RBHKM#(isɈ; &esz2Xk:߰ oYW%B6!qKNn>JC(_GJޣPs  6B dT P^ab0@\~.%yJ.@ u% XNcఫj_2wߴΟTH ~W5e0#X0F h\~wЎЕ_ؠS矶y%t+̴Z HP LnN;ovd,`+/۸_!(a,=Tc4\,bB_ q&AA$4~Ah$]!h\C<o"5dơ 'WVTh0{k֖+0Dg(3?ZۧBk.3[H.=6nwGӓR||PP=ۉ Yuy%fq=8n5(}Ct%UUeZ1C@:(ž|6uۃ+`8?mSxr/聴})^afF/F,yI'̥3.].]_^I.*)zdƠ/5?S`L0>@Zְ{޶58ƳRH7qeDP )Lb$;PVȫ?e3_'MfB!'c{YrcϵdzF@ kFpG{ ߿4a'vd;7܍.ܙ@:v$_we2З()|%;߼ūa|g'4b+vAƣPJs)hzq 3@1%@p-'L蜁H)csj)cg_J)k*x_׉gF ޚ:P3Cc_7w> 0V_Ts5/l˄j¯Z[c捋_|a_yh_퐍yBC&!LろPR~׎B YpK $"C b98T}zbY!%cjp4rb |hfK xvڼ'>j &=ػ/q{{D!}kyCI!c? }l]%PH:TdAX\'~P YĤ Eyοc?m?]װZ35nD{PtpM [ r/%y8IX%|)L\N(cwa{x )zꮍ}+;\!/ C}6|kv<ғr;`3*) j yx2M*w= !  y}.?|i^|jV)<ÒU* q̀[M7Gմ74.Fsg'~A 2/!`ymh,۳OBX(Kq $BD`Z%l IDLWA$"9G {$JmL#hrL9 uR r.iD| JH )&YyO\ o<`∦}7<6< PRB T< 7hpG뾀 Z?y<Ao-zyv x~dE)B*oh0`Pe(yОL2V oK>ci )ґ&z&N@T_| BY|' s`3#~@.ق:rw6P92"#rq˕ag2D\4Ճ#ӣﬗ>4NB|Q@PqNmppn:\'KٗDiPaB{+ZjyоZއ4w1 S[g90:~hty*wReZE[ҟ{(}LM$$13*^ H:b6'Œ\y<=d0DDZXbL~d4ZtD0S10wKB$X.-Wg7?t_|tWm?O}sn^{ݥ%9'BS~Ot E2l ;¯W0(߁(YN)0}?t뾓e DS } F+m/TN$.A!^S;WTrb (<>v\^j/Z vj!sIw__ٌ;^yd@g!=GjHMM7sq>׆1bJgrjpdUzDŽb`>A +t,! #@a#K B2Q(2@ʙǣ ̚u/b q2Puٞнח^ֶ|T͞#"εmQ]T=i~j-S[f7>j|?[TgY?t`EQ 폅^Jy"rO0DX8 ?bWN'P``% ؤ cAd L1i?50M?QLH|qNVc`t.J㠭9=='dъ:оFh ы 28^\@8Rԟ9k&9BppPA.w|!WZJ8/H ;+WTRUi_"!m xc=x{n<6Gww v۴,n!J&3߻w3AE?3瞻<2v(k00PwfaP6?8Aoi:x*<|h2֝mH,>$^j+W9Q hBy2 []h+QENCdjРvysW/tO{rCjF,$g7;W]g)lQ>VYSŗ(!({ 0x X|}M+=Τ;U=936;T>zh]2tpjMlK̄Zoe,WVϯZ@qbs`~D%`GT,4|@vb E&8KQ&7-mk'*&Ho|^|o>F@6)#~!})D@[p\z$C p DN5@|i|c#Uu&}vg>3A]3vh]uԐIб0^[mZ8`y%bPV9$ 嫘€\T# f,}*$+ض^ ovf [!hۏYnBgDgd$e&K}~vW?8ogx( 3o挛}˰%7 @DUd!Q*X}-.@þ˸OlK)A[vhzu^ٓT*~>cÆT]kz5LK%;!}s;Z_@ͶJ 2`O`;(>)s rvy,Ƕ/@mA Ä]~HAӖ%Vn֣?n?Kd/Gkx_|E8d㨀?}_QNAO) Ǡ}3 . j812S N{:}!?Iw~8ܯ>Rk?REͩ,~rxJ^k:s3cm|}kM F$QZ9E6QĨ!W h[zY(m[u#O 7Qن9W~(L:Ы_xK}8 (7u7~ɞ- [ ,nw❵4lCV?`Fl:r@aˏ(S"=A/m?MoӪY*S1}8P7.\osMR̶lΐsꃵslCv̪n?&69(2b*~A 8LtDT.*"a~*|^-Yr۟T hp]p›r~p6w'`_^ǵ:! !?ޡ`Q٪ $#E .:(R>mOZou{Ko9%..L7P4e@ZT+'+sF!#jb|_\$^.Z;DH )3w2If,Dml@ q [HD6J`.$VAl[1E=M5"0S?۞<}Z q|x+@gy>jS| k*'2 -L xsJ0W;D\ohCjX$*]nKGެmSz޵N[׶BH}RA7hXF51}MNsI^T_QE-nQt/ &kFly+iM޿~'T@bZu!2u:JB8Wl*<9(f M0@H^9s#Lrs#XXӑZg~hpY6 (/wMyS뛼/X8bPRᗿy+z D0O@K1Y% t)'.8U9zmW5ݷ1fyFSK/lʲZ9_D kL젊”-aB8EgiS˵ \~KzWP'04Yeѫ^1y ,pE!H!Cfk[,^` )(@lޏA\^Ld UjgV~[a@z>gTp}?$'?:]cY(RY6F܇\[$LRA@У`nQp s +S6u;|_5ew2vR/쏍\b8ﮫ"&X>1̸d_b Qdgxy@#8%t$6 yN⣹$Q˖B(wM$_6tzɭpwvG!;pэ߻~3SM=|d@XC  uT ?2+ 4D w. FV WP^n\ vV=W&u>n#&?y+#!J qH WJ*+ X)hХqCFpغBPdDSH<* $ax]c-i?zԣ`df?7 7eiTbek3 eѧ^9} WbB ~~\ÄΚH VlHT`ԃv?ܸ1#XzKtD Hloґ'Gi;BhYaWEH, @יYC W`K$L@lf='?cǒ{/?H'[|FR0{~yc:{b?֡u~>y! }}f3b26@앆dwB窥<{GLB@0 &mDDV X@*+2a8k)vLVDȣ&wZFK>C )_^8d# (QhE%+_ʗ{l5y?a A1zF5|C.p Hv?SR^wۤ05{AH%BW@PZ}}GE@AX|+o '8D N \1a̝}9ocʅUDiHj5hTw_wˆ_&>;Ҏ@>PBV(V@D%Q0jqxX`>57AixCnVY!HRd|;o.>G ѡėlor0jY2,Q^d|bT%{;넷3٘nܾ#Yl߁?; cU&|{O@mV˕Lvҵj <.I`J`b Zy/t Ъ Q*o~ۯ 9?|OY(&T^eL0xP؀ѬhX\ [9Bws}X_W@͗kJtMlQPV0 s%x0 P>D!Ch=6p/N𣘝{}^3,[z%^Ǒqof*>.RAľ ~?& % @Iaơˑ68-> +P{(Yq[M^`T‚Uj`\S nĢ$89;sMT.g A{~0g;<<'r O~&O.}FIPUEWAQXS-ߧ"~\ @6tG%^" 2M|NqO _ 廉'l!"m9B4D D+7ͷ״>Lx>3s)bG1|>ʡ "N xOy@bվ_~9pO Q)ç ꛾s̽|& /S wGeAPV@VZ,VšoPp x6d̄ s*|=fln_VV9raƌ9 ƒ0ZP CsL՗ip L$'ౝQ su&1`~#8dn5x{Lx[&x+1{$*@떟D|^rC8 LYvrQQHf_*%(}q_. Ϣ<`THWh@6il{Zz_$W@'ApX䄀;^h][_(?58Y.773m&s!.{ww%?-[:hO dF}M_v)dweKF%h l{ȡE% ɒJP[#D{ A AT-+gxvÁ ̽;y7yd @7r\0ˏ5d)_;8pvT`%ٜ 71Bd Ad]]l_ڻ,[M텬Iu8*1rW.|y\%)W!UL?9/E1HV/^|۟~zy 79cf} jzx /yNPhǐpCa;^}g ‡/[ )6» XPIhȔM& VD@>ˇ$!7 0>/JD 9.AdAr)0DvĢ[>}ȯoFz^z_?|~yTR>`Ȁw\w?3ycmbkv 9~0^X|$@tQ!L܎ <'2N ZhC$^aJBqMb>?p$s O  \}O 0ڈLM8ߐ9eef5E"b̯$( r%vU{6_UW)ЧFOp`DhpZ>{'1wiWa U = V a8T@,\2V@y/3(FDN!wAS ;#rש"dS_#Nu~orQd ѠTmȠЧ5mz~tCڲN(Bx*`WOwM}_5vθ#.UVѦzƵudAu-X q")0GN-݄" PPTO* tOh 2-V< 0N]^(bOsv]x@in sC'u16o/кu?ϭ[3_ )Q+?q䷟-?oaSC.$?D!wvgO಴lu - ˮkl 4)Q8B*+::P, RVTdsD)<6 xW8P>!BK`45`wD*0G$kW_{W7lѦMٌ>eRN!IAVu77. !Rz!A7"V-P h]Sq/.xˁ^Jy;pH~Z\#lL# W,YٿJE ˆm/?t,9nQ_DHt  q 0lWt$/,k+[u'ze+Jo|lW-<9k$X~> A/( IA,i9&TdW:[VJER^a;GJ]y߂qsO~ ڸ}}(h]SvlzI2DϊD?HÀHwBuN' S`( +|O˕ ayr%6$p q^d'IZL 0iƍ +t>c}?]z'V~J>e玾|ї~p^ "ϴH>-OB5u;$:^zʵ>e˽ްa/>;LW;'_;Sow]5 p09;LR-%ye A1dʤ,܈% *ˎB^Bz"! r,,uv?'C%HkheP-eb|l F@iyy-GMMׯX/;Z_޾'@s J಑SoWw=m ^YScTeI3$;2}Xq!>B2ᩖ+x6\|:Eh6>P 8:`'!bч*AVZ k ;܎ C6:~G>;?Ҟx}k~|O6UMVo<,[[wo/Vqn2$WtnĘ_n҂ʅu=$&}P0mBšK AR}Gw9BE a>v>cy5_,k$¹.A0H("V9$FոAMP;;SvWwtvw/g|&2%@Wç5oaWF/}= P #>|(i,) }eL!r 滻BŠ$,$GeP+ < 8D'NAIG7Ю{/AH1 Bkt.߻^| %L{.v{/|ۏu.A +'?QDax`9F/x;emx!LPrgI텷ˠ/D2U$ħzŠίw= EIHLҡBpb>Ize$/mj{ ~֭8mW/!ƙ{c 92nntE4z/f>T/#H&k@Z GAD,! Az{y1 2!!y%݀Æk'J=lÂqk?Kd{o3JΞDoNl|)@d0rų r( ECaP<6~{86o+S : '?/>'ifMcٷ BKsf m"Љ2Ea:q~QLT:xys[l%?E>Ë_Z~3Pm<ÇTX T?1骿b%挞FzQE=2/;X \ǂU DN!_@e=J:@1oBz"* AP$Yx" &`w Hxzbq`ҫ{qbd}mrϣ[Rmc٠w`q$s%0d@S|3#|gW.6Fu+NߠWe^Z6ce.z) ^$ܚxd]MOlW%Xӂ-0ߐi Ϯ4#eW;n4Jtu=%K~~1EϷl+Pd뢿yWz#'?w%ԐX* RBmd p٬=tA!: {(䫈]>2} IDnv3@ M .efԕU]ryBRC^`ӐDX$+MVl9|k=Z,-lR{\!^t~j]3e#&PRѪh@XU"e 0ķw =(XIK9YBm+A.G?Xr&;%`v:9yN-~ D;kvϾZm~G/P=Y56VW7Nz܌\1Z 30(rRqo u8!c~{j@% OePZ&F$'P-p9]Hy2: &(l>}4YʁozfλZv y_VsƓ}٨𷕹u2nW[Fc.4{(cA(x  . =ֿxg6 >s`u p8^PQ076/ !+iXEd:iNf7O^ܰkwW׃w-]ǎA~9+Y7fA?{̟L^𹦆ya BRaG^ GhtߗCAT_F WB'h@b:Gvf}+v #H׭ޞg>sMF4PTh䠖[gCc #&1<D!ɆB \@-&_yXӿ/C[8r#>: bWLQp&K! j@,Xn@'kvHVhۿȑqh%/eVksUoHD}&le=hG shaTHޑZ +!*0p J~ŖJ,t=$OT@ 9-Ag]P,ovD޹_o۱}WW׃Z]=p^M9\V< )^рʭn=i)"xha$U8ZrG7kȉuK-THԑZ9$|0W F mסvʁj(w s23IA~qX m_c{V|BB&{Wĉs{+p[ BTEp%y78覉#&M:.2TVWb]!B}{lB{ C~PRI*3@~Nn@:'zˁvaϡd[[}?u/ݹs?_#-9 F(@A:^q)CT_ [FVZrZ} >^TÎ~ʔAav[7 qp]uleMjJ hI (r_a˒ eF '[e@Zy-: S8Zi[a@޴Pבj]~nӻ;;EP?~]_ї"@2I-#tɜk6ܐ*kk #_]p"hp) =7$GPJ]F464mMT߰Me7x0Ԝ*FRd II? rC}j@Axd ݇hw֡{xާ>Ck.=`2 R˗ k g AXpE揿ઑ`V]%tAM4j 9p i " *iKaTŠ '{o<WxM _ݽ]8y|iK~Hx-_})Z|ECG~S7yv.kD"uޘAjx 76кji9 7ǨA< !j_ѣq=Fm=G$y,צ~#/<x{`F@BDS51hVo<&1BL=WpoL^M_:jJ?o=n۵kN6%%$Ty+3UAD删QxTE)`¤QS" *#*1Q4N!J56nySFѥJPhYάt&dݩpwU{-U{m=;6:;:H>@e奵.}zyqG8/ejת 8Dz.Z/'y+;TT e /ep~uEzM.BG8uՔBZ {y2^ _OW(S@R/* ȡZ_JyoLkvwwvwwvvwvvwvwwwvvwwwvvwvwvvvwvvwvwwv|vzvyvwwwwvxwzwzw{v|w}v~vwvvvvuvuuutssssrrqqpppppoonnmmcҙGG66oD  x<}hLmwvvvvwvwvwwvvwvvwwvvwvvvwvwvvwvwvvwvvv|vzvxwwvvwwxwyv{v{v}w~wwvwvvvvuuuutstssrrrrpppooonnmmmlbӒGG55l=  w;|_Mlwxxxwwxwwwwwwxwxwxxxwxwwxwwwwwxwxwwwxxw}x{xywwwxxxywzx{x}w}xxwxxwwwvwvvvutttssrrrqqpppooonmmmmbΌHH22h6e2gFMjxwwwxwxxxwxxxxwxwxxxwwwxxwxxxxwwxxwxwwww}x{xyxwwxxwyxzw|x}w~xxxwxwwwwvvuututtssrrrrpppooonnnmmmlb̓GG}**W'S)U4Lfxwxxwwxxxwwxwwwxxxxxxwwxxxwwxxxxxxwxwxxxx~w|xzxxxwyxyxzw{w}w~wwxxwwwwvvvuttttssrrrrqqppppooonmmmmk^z}GGn@ ##Ldyxyxyyxyxxyyxyyxyxyyyyyxyxxyxxxxyyyxyxxyxxy}x{yxxxzx{x{x|x~yxyxyxxxxxwwvvvuuttsssrqqpppononnnlmkl|lyZuuEE`   Iayxxyxxxyxyxyxyyxyyyyxyxxxxxyxyyyyyxxxyxxxyxy}y{xyyxzx{x|x|y~yyxxyxxxwwwvvuuuuttsssrqqqpononnmmlml|lxlukqWnoCCIBo^zyyzyzyzzyyzzyyzyzzyzzyyyzzzyzzyzyyzyyyyyyyyz~y{yzzz{y{y}z~yzzzyyyyxyxxwwvvvuttttsrrrqpqpoonnnn~m{mxmtlplnkkUih89t/ b0a7Ooyyzzyyzyzzzyyyzzyyyzyyzzzzzyzzyzyzzyzzyyyyzyy~y|zyzz{z|z|z~yzzzzzyyyyxwwvvvuuutssrrrqqpppoonnn~mzlvlslplmkjjfcdJJ\''N  Mgzzzz{{{{{zz{zz{{{z{{zz{zzzz{{zz{{{{{{zzzz{{{{zz}z{{z{z|z~{{z{zzzzyzyyxxxwwvvuutssssqrqqpoooo}nznvmrlomlmhkflal_\y^HHH H|b{{{zzz{z{z{{{{z{z{zz{{zz{z{z{zz{z{zzz{{z{z{zz{z{}{{{{{z|{~{zzz{zzzyzyxxwwwvvuuttssrrrqqppooo}nymumrmolkkgkdlak^k[kYXnV??* c1`1Qu|{||{{z|||||{||||{{|{{|||{{{{{{|{{{||{{|{|{}{zy}y{yxyyzy{z}||{{{|{{{zzzyxxxwwvuuttssrrrrqppo|oxotopnmmhmglcm`k\lZkWkUgQKKL&'KOg{{||||||||||{|{{|{||{|{||{|{|{{{{{{|{{{{}zywwv~w|wǫzwǠxwǕwwǖwwǡwwǬwwvvwwxyy}z~|{{zzyxxxwwvvuutsssrrqppqo|ownsnpnknhmdmam^l[mWkVlRkOkM[zJGG4 A~P\{{|{{{|||}|||{}|}|{{}{{|||||{}||{|{|||}|ysvŊwȄwBvvvxxFxxȈvwssz|||{yxyywvwuuttsrrrqqppozpwornoojmgmcm`m]mYkWlTlQkNjKjIkFTcC89mQn|}}}}}|}}}}||}}|}||}}|}|}}|||}}||}||zvvΔwqvvvwwqvvv|{~{yyxxwvvvuttsssrrp~qypvpqpmoioenbm_m\nWlUmRlOlMkJlFlEkB`@IL2 Gc`}}}}}|||}}}|}|}|||||}||}|}|}}||||||~xuvDzv:vv:uuǣu{z|zxwwvvutusssrrq~qxqtppplnhodnan]nZlWmSmPlMkKlHlEkBkAk?kp:o7m5m2n/m-l+n)n'm$n"n!mlkjjY{DN|  WvwmšmmFshxftcs^sZsUsQqMrGrDqAp>p:p8o5n2p/n-m+o(m%n$p"n mmlkimleSas:e&XxmnnnllNs\uZsWsRrNrIqEqBp?q:q7n5p1o/n-p)o'n&p#n nmkkinlkkonTd/8SQphki!lliiOwQtOrJrFqCp?qs:q7r4p1q-p*n'p$o"o!mkommlpommsr q q q n lkzbxNEcpe9aco3u3r1r-q)s&q$p"onponmpoons s s q q o }|||||hV~l|fek#t+t(r%q"p!nqonrqpovtr q r p |||||{{{{{nZumd>_f j#s"oqporqpuvs r r p }}||{{{{||{Z}ccnuosrouts r q }|||||{{|{}@f_rboft pwvtr r | |||{{{||{UGfcYfxgz } }}}}|||}Xlj}ae{|}|||||Zot`d}v|]ui]B]yaMy^|__|__w_`v_`s^`t^`v_~bx^{b{`ybaxb}cx|ANbzi~YiGb{vs^kc|gq|akcyAmblHO]qg|r{^fv dyag  ewkoZ\FWI'm_mbkcicgbgcfcecdccccccdcececfcgcgcgchchcicjcjckclclbmcncncococpcpcqcqcrcrdufwwwz}bckV1xcpy|}}~}}~~~~}dseuKBKCICHDGEEEDDCCCCAA>>66r^5( 6'R6U>YDZFeRmZrbuhultnspppoolnhlbfZ^RUFFDD=<&&P6P5oUdDfG}Yhprrrq}rxqtqrqqsrtrvrwryr|p}hrZaFFCC33lN Y6tVmFRcsrrsrsrs}rysusrsrsrurwrys{r}r~rqrbpQVDD44mK A&O0tDSesttsssssss~szsvsttsusvsxszt|t~ssrrqqbsQXBB!!F)lv Tp~~}}}}}}}~}}~}~|vtrAtt:qqtxxvutsr}qtqkpco[nUoNmJlDk?b:MQ*KL`~~~~wnrbT9b99bqqMkks٦xuts{rqqip`pXoRmLnEl@m;m5l2Wl-BI Urvon,kkllqӍwtysoser\qUoNpGnAn;n5l1m-k)d%OX{>o"X~wlicchhopttkraqYqPpInBm^Lgvvvwuwvvvvvu|wvwwxv{uuuvutsroo`yέHH99x=  BaMkwwxxxwxwxxxww}wwwxzx}xxwvvtsrqpocқHH;;z8 >GNlxyxxxyyyyyxyxyxxxx{x~xxwwvutrrqondшIIz77p&].]$Piyzyyzzyyzyyzyzzyyzz}yyyywwutsrppnn~_uJJ`''P Pe{z{z{zzz{{{zz|yw{wwvvyy|zyxwvtsqqpn|nqmi[vaJJ?I]_{{{||||{|{||}vss~tytttttssstw~|ywvusrppyoonem]mUXiMBC*'Tq}~}~~}}~~~vqtƒu%uu$tt}qqt|wutsrwploboXoPmHcBPT3#Pkd~~~~~~~wrooopp}tѭxvtstqiq]qSoKoCmp6o/p)q#noYqLZWmugdd8nHt>q6q-r&o!pmpmf Qc[yfZUWcg/v+u#rsrus o |vb|u=`\vaaknrtr ||{{U:dfZ'eyk~|[ak_]qny__|pv^`|qu^|`}opzawb|^o`q`w6kgrW^)Uefwu|ad'o_Yi_e_a____a_c_e_g_h_j_k_kanaoLfuddPPcblqq{qxquqrqstsvrysyr{s}s~cpgr}yshdhds~~~s|emgp3rzppbn|Zu|~~~~~~txeklpz{g}cosT n{uvginp`{|{ؘqewRZfxutgh_`qqުsh@f^*_/fhtxtihtrP؀{Ɓ~uɵlhᾸgffghluztihytÁˀӀ܀~zxxz~vnjzsɀw铁Ȃρׁށvqjƃx8ʇyŁ́ӁځwsjɊ{Oʎ{Âɂρց݁wvk̓~L˖}ꩃƂ̂҃ق߂|yyk͚8̝䭂ăʂЃՂۂ̀ІĆށy~m͠Φ۱΄Ӄك݃ۅ̓̀̂މڂvRϬOϯ߽·ۅ݆΄۪υT}φa΂YyͰϷ_ϹÇчކևφѳχc͂Ͼ6ˆŇdž҈وއ݈؈φЇ̿Јχ3ȇ ˈ3͈YψkЈwЈwЈnЈXЈ6χ ????( @     @0eaH9yHB???>?|16ha  (3'X8v^=gKs\xivprrqtpvir]hLX@K;E|1%]5njm?TnstsztstswszttspVl@R6Frbq<}Hnuvuuu}uvuuyu}vuuvvmJc=S  ~>Pvxxxxwxxwxw{wwwwwwvtSt?Yw ?Qwxyyyxxyxxxx|xyyyxwvusSy@\U y;veMyz{z{zzzrrdb_^`fmsz{zxxvurMsj;Xy+K%GEt}|}}}}n|PhI[HPHrIHkILJRTdq{zxwwvnrEhG!5D D~^~~^JyIIKXCK_cǮzyxw~wowd^CBg>7I{aK{CH_ LhfdȄzyrwdwWxLs?ItCrWXsK׆CFdLqGnYyTwHx=x5x/_IwlTJDLuW+x5z,z&w |xLvzzMR z||||| NsnNx|||}||OoiNmtQkhPepRgpQ^Rb~~TZ S_r\^PPGsWiXaX\YYYZ\Z]Z`ZcZeR[Nbjv[VrF>}Zӆl~\`KPVZ͂kjWwTAwQ#{[n~]^VXlk͓j{Z؛|UMWK\ݎm_^SSZX~€wⵘ`[ڥYYsYrY\טby߫b^]XXj`Ɂԁ|rnnr}f_fZzfŁρڂj`j[n[g‚ʂԂނirn`r\w]c~Ђ؂ㇸe}ayaߊqrb]X^ͩmׁoꊰaꆰaX|bybwb___꿬iuvڦhbꑰbb``L`aƭ`训aaaܦaġabKb???????G(0 N>@7u%<8x?78x?89w%?Bg>V8xPU<]HbS_XWXRTGN>D:C|OAOg8w8o@ԑZpts~ssssxu~o\mDT:Kz.t<{hNrvvvvvvuu{uvwsPj>SQ|<}^Uxxyyxxyxyx~xyywuVz=X8>}5Rzzz{{ypughhqwzzzxwuQvukq֔Ml[W|Le=ksՖNb[N`!f}|ݚRZS`]jY[WVtUqgW^XZXYZX]Y`WaU[}uڟ_UXl~Z^UYJsẗ́jrWY[[ڗx~\[XW\Ztگ^ॕZY\ZY[`vڳa]\W1ocȁց|uu{h_gZVƂjÂς܂vm`r\^fʃւk|brqa~]0aزrׂrَbʇa*b{bvam__D`gptsp䭻gab@aaa9`5cbA?AAAAAA<AAAAAAAAA<AAAAAAAA(  d>+Z>P?G????C@HAL,}@v@sC[nsrrms]kGVCWD]BAQvxxxwxwwvWtGdHiEV{{{yoooz{{zZKqPG,L}~dzJ_JJJMXj~~z{R`N} J}fgJʊJM]OmkՆ^~Dg4PLw{MLR~ T6y {tR NqyNqOi{PbQcXZ\WXkX_XY]WaWeU_ow|nlYʧ~YZ͌l~\^Y[+_^כo\[\]pa\b\xgł׀zzi]j]o]ŊiЃkpp^x^^a׷q~~rb`~_w``*__׫```ԛa`-AAAAAAAAAAAAAAAADisplayCAL-3.5.0.0/DisplayCAL/theme/icons/DisplayCAL-curve-viewer.icns0000644000076500000000000034162213230230667025076 0ustar devwheel00000000000000icnsÒic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefQjp2cOQ2R \@@HHPHHPHHPHHPHHP S ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPz iNQ,s;0qԌ&?F*h;+"vkxSwS '9Y<z iNQ?UVk1%kd,By6-Uv EzkjOO=LSz iNp4 0u ^-2=BMB ^ȸY=QIuHمzPicڽYVϱy$ִL*՛q0f(646뻡W?ma}kF$ަc Xo?ڥRb1̣/RxůS,Fe" # 15-J3thXv7L8̠ÀvPB:LNN:w@{9I@O5:7n_fOt\[ rJ䙈XRVڇWdϼ}q>0IT䰗U1\e?:,Al.z]RS R0Pvn]s{dvԞ:Wpu_0[y4&"盽mlxq.<<Г5nȼơk{&ZO-1%oOR#踑dJGO׫ϼ>ù? qIl5JdM;>-*{Yn~ίhM{P0-P9b:9o:D">4<2ƧL)Q\ 69 O\$)"޴(=$i\f! i/#I57JڑUBεyw٣r}"yid%0fsq!_$,丼)6̡U[u´cF WoSP4)kÈ SʗOՎ%YE԰gj6p Aۙ(a}c;)X5c Fl4%3{7<FoCC^çB:Xxx!#m~#˗O9ǀe%m/K\.1f)dHkI'Er~-FxH9nBT H-,PT5hqum䣊3w(f6H{nk::219[FQ׫0z, eqάI:l:cшĕ88.|GJ2:!Qh Kq{i*KPk oinRXpP$BUؖΰWIiՏ1]CF6PPgl4^+p泗MDvC"<ω`Iա?oohZ.TQ{F*8/fA7ݬka5ۇptR­]}D c?$Z5HDQca+F'of@o͔i l7_&V:E6]Se<4MjzSKW2]DvkH')W<Wse7P,ak8B9&Gfo5';u<,SM/KZ]y+f;,5[ׂhK @vA+拵WI,z|asٳ+Ati #"Y ??5qlr k 7ȒI>D?XOO,oߞ9ExP xMMnp5ŕկY۶n󲁩J̶`<'ZSSq {Vgew˸ݰ,I>}qUDɌ+SV*7V¯g?:./1ZA:Nyym 'T$612|s[K?Kwmiq1}!Gׄ\.VJ5䛩d/͐=C*'٥Vfb;O+o5|##V% ??Vy!i=(RqHԕCO?VceSWd(! 5oʻۑ]+NT5PY܃B7 Ub@Ej龃)Q?ӫqTuk"Ӧ)3BƷejҹq` ]6H9ꣵ''H@*?k? c/#kZ'Ӊ(^|ados-{9سI0bi҇%Hx :pewqyO9Ei%o߼ڍUakl2-/:Dƾ[5oj ql6y}G +ꋹG%XKvrР{n=x᳝"n,K78-s(Ͻ}q`Up#pu$F :]-j݌ߓGi'$=Ks~vߏyl!M?' :V rშӈHWzcx+$crCєO \ɮ$ښR+Z[AjɐQq:ZvV Z?hWjgnr&@ \Niuɬ^7R`D~˩<vF@J9s^$Z2L}: ʘ0w=B@)wEbȇLn5i3N06hVJ,P6Lj;1W'1aP5 8 G[,ň.`?YD?rco"M3]IDF(NUq8fM(\O?bO?8_Fɻ6\?4a_YܿƽsT)/v}#%Ye-)\Jx"ŖW HL}jd5vem&wJ3|2{{zޜotuH"`.@1Լ^ς'$PH+tdg}4Ӯv@vY*,gP$٫#mdXX/$]m^N;r]`h%wyަ8=|_Ra;sXb_JV5aF%D] j."98%X۰Ғdﬔb0 4jq%yNby !u^$pteias ޯYai{۶+*KzGm k\Fh,X ~0 38\ĕBfEe>h3L1Gh*1[kIM개.oplT¨NZ=ubNxIV)Gz`['@w?iğM{ƪ=8XU6+<Ht:~?Z;<9fP  ƳV̾opd&v6_|=߃b2˘s9 3u@W~{TM-g`fJ20 %.rS&bMMw0Di:J}:Eswo21-Q)u2W1śo-P-nmlsS$uK @D6d+,77굢p"J TD݈frpN-[QNec;7ȗsV 5հ*qڑO$4[^_Jm|ͭ<]1u<"u`-;wXi[1ěV&>2JyӠ-Zە SL }myq&y)$Z XM孶JlX+y{JJSV<" Nrq*t۳|gᾱn8ޕJ[P,9byH1bX--d8t 1Ol;.D#ߏTG|ȶ?[?M*̽w~' r2PN7 ..RO>3ش{8>t5>sOf\lîYӥ+*SKܖQG nS}!0zI{Dq Z=vuq[I܂zF_!몢4!w&$:nsޝC74 H(>>Y p\jI`%FWsHhw[pe`di H˹ˈ` '̟xx"bXqbWU2%e;eCkz7 >c!N\ gs{$DŽcP$\tU59ހ91Wu7=Ʃ_f{A в? 'n(m-t|o&1Qc,J{+Ԍ>76${s3y\_꺗aI8"RDtQ]IW\QTdM2%s|O ;sS(4ow4xUњ>#aZ/m:UA0Vz>U喉lRv2Bj tȝ{Ga/)sP_xed̮4Z]"=NM@%JLZފKm^uA͕}mNL0]> \NM'G<p8L:NzŐ+f t?a#I%ڱ( 1 е1YՈrON' n H2B'AJ \U>x{>0 4 ~CJw]mZEYh-۳JʹPkqg?yǸj- >nO*B DWn(Vk5y(;A"ڎ [xЫ]Xe1Ҳ(pd=+>?ԷکՇjːPϋ(Q0|;_y E܏5.Vl NuX/.5D tm"t :fgФxLҀW?9ކR-&XVhPr7aZٵ1|/Vk&эRN͵,Q’ Nlg&w؏J:de'"j: A2ρ֭z vh3W}"Ԕi@Gys@ NW Pdվ09+CQw+6Eh`H[9&Z[Gˤ`ퟸsޞYbGfOxʕۻ21KEϾ}%z`ԇCkc -wduwB"f-W$üS#A+RA61W ][KG|saTqe|*tH2b[;l6 X=:;-$}oh딼TIG Hty50K3IyfV7.{}E^%@ PG+ǔD du(w@\gMX@XJ 0{y4<fi&>T VKCGRO<7zh+7@@cDl0˽Gx+ʃRM@ %RRo 1k)Ʋm o^[|-Hع/Z~zf3u17F7!_QZ5pr:脌{Tk˄`T%t$MM 4>{Ž\aQgN 4R).T524i~ЂՎeWO؋>jݼ8d{@a߀ Sb@$j(T.e<oKI+Z|(Pa0-#i|ضOɃZ~{kU=)\,T6a DeR V$BfbPyNJxbu 99I-aLЩP]lZ<Ϩx×eiMYnQ?g_jy}\j~TBh/<_=#n ˘? DY41x#dRmN?VQ1TՕ⇊+ZߧZik*78owfbk(Z\vWհl@UsZ:~_-3$h4 ^5Yi]_7q0sȌ!z: JqW6\M& \< e[JqO ^$l cQ+$h1KxkRvУs=/޴&/bKŌA4kB3*v>?SZ[Ec~裛4eȍ]sk٫H,5cɥa){IUQ~,)sϣm:N1xRU"]@vF/ [)ǷZ#:5Xo[7^+6'\5]k?O&bT%ߙ?\p&%ZVwq+,-XuPVMAsф~pca8^WHU U/r )8q r*\.ef5txxeYwG;'u㩏۬,Y7t E:Cmq AzaνT(*gX!sn_Dyc"VE’(I[}k520av̷MM3uyxb)k 'a  hxi+&Wq'/T6O*bz6/-3DmXsjgx QTXw\$]I_ CȒOX84*vH&w!kcDxUw*$+HuN-E1H*m|N߄gu]t#@zp}]ʡ3> #6l2̕цq)2)`п鑟|[;wd!fLX]y!bm|5άPVÑxZbYzdO&&$؁VӦN\H`6]=z4db.R.Edu-܄!\Cl(g2t}`U!CAHEovpC.H @_"#] gSJTS僟Ⱥ|PpK\Qw(a; T#aZ<6HWD&yZ:;FYC{`P| jp\=z` >wҜS8ո4LR,o0w&IydZ >΁c4S1"s|?e%oVGɸ.73ߢb, 9f݆V)9B}iT_4F"fϝ%ɷY}=nEg,ZSIZqɝiPHWZHB԰tp|kLT(Wq}רrL>JS(Ftv+B$Q(; =$,^Is^k&^xS켍$kނT&]?xǢkib)JiB(oŠ#27Zc?%bml[ND0 XCli,f̓dUꑞlq(gS=r 6it~FvQ̌+µ0A[5ͅcb16>bcGJ_ l§ 睵DN(a[2<$"2p~H%s|p;;{ ~4irm[~3)O 76\C FDߦmIVGxCzڮ@x<@k-MXWA)tB%9, p'5On̩Ԏ"~ vyeT.ygҀ7'Ѿl9tWϏnfaO2ߜO[x\_}.S FeI&m53Qv=[?م(C]Wi?N A #{r R3g1Uŷr=գԜaf-}X!*[(6(t>W^CeG {-ӀPt>grb$sD 3)bxqӓ}~C8Gܦ2gŔQ%PL(S: ұۀ o ՝"BgoC5ATo8*:]Leo7ukCQ]A)|Q^nGI./L*Y(7k|S/=G3^lj5*;U`kDksGlh=YeB\*l /dFe]6rOvx0$N1{Ql֡dUQjm:_ouDOu_fЋKM6~L;.^ӽB] ~\jb ͚is|u#(o+D ~UE^&Q}/MNsM{Bm Qv*h_\2>Q+@а٠'?8&N ֔Y@~'1gG˄#O( Z{t3sL8xV~%Y:ϼ> F_h};Hɮ^pWGn p轡$V@qft2$RӚvpᩈ A8Rͮ&%bU 6g#_!JiQ!ңĂ".;4Lmpjrg <jZTGL!ZuE~3wU#PBBWgyU|4\n7hoI{hiߕx~M9GD"(IXYjl?7R.p[_c.P'qW8>5» Y3nq:\K,;˩O9r٤0''<UY@inz\'phϜVN`KvRGqvCF;ixLVXJ]z'> p,'ϡaWk^Q! sٵ%P~^R ^ӾTe5:B8%ƮI &rz${8@+*/bB6 qXA!lr{N`bvd+.YtoK |냞21RJ t ;*2.o)j'mv}lf[V:Fd}4a55j_lwHhaqe-+7 \tU˧J麪&] _&V10Ὺ :j26Q\\1`3 J":x {762EML̮P Wa_=r3aT=.=t_~:жټ8IޤFRx ࿊=mH#gmU;RpL6 Sm~ż׸kC0Yۓ7GP:w83._eϚעBK?J]Mp)tZ9$`U/{KkhWs7ȰkNZ_H9Ҽ>@-UÀlEC)*<mfnSg-S88Vv$(F^:@K*+ y:2Xz&ca`WP^.{Ǵ̨Ҝ³Vh(e-.E(y">}beTUAxUAۿTɇTd +ޘQ^G؍ww(8AߧTN_rkr#gTgpgdRJOfl遱_ +.Լ3M9`:7V >\V7 Kn9aԘ;~"|@w x`V>3N*t"a(Zn:#Z7ǀQI"cXP.{m_ ډEgJi|l`Ɗ"+C[u|юwX ȹ;T³+$)|St 4gRv8{,t`y`]^)Xc2mLd  <%TC6* f|}l<ד ȜQp*K-ƏVԢ~zevK6m%>|RYtk}:2ozcԑeNM:o~_ZJub[tY'Dt7A0ߞػv[W/YUD(vAbPmɯ' /7^3)LgBӈ_*kaSXZc;JC*8D;`en['*ǞEߗU?QeZ[Ml$$i[ov!!S"2y8ne쏹Gl# ?~=F#HtzgvYzL$͐ͣM+β0&FȤj#<𬜳=ԦÌl ʿaͺmK8zǍLY!7U~Ene~mudxC9R8WHtf]v쀨;S[@ Ivv׾aVQ;^H+1c$cey\:7 Oy̠L!}nDC,2FN5 v!3JCNQi\=@ۈt1g\JeLR^Pb]L!u yJr/[`V?> ,x"7說$;AU"iӷ8q&tgji>[VW = *oߐKyX:^:ѽ>phX|=zXq\*P0W-ehjg>;A?0pF}ҬLZJ嫭l)̃)dƯ(0f?戫L RePqJu 帞g&yh7e Ѧ/~mwʟ^iH/gVEHV']fJPqk*=DqA㤬hN+}Zl0fQ\܌X$Eݭ/](<-<îˤO )7JL"HKBey }ƵJ̃5ʻ6.r ?=;% "Z <{l"T(9R3{/ֳOZW(bJ$J9Ջ|/QQ&uD֬U1\P "~DZ@6d+u(`DۥƦ"$TlH-.YUwSdxÒMv oZ:ZNwdbLPEA'Stw'#IV ɞt13pRoA3O#[_ a%ld|=)Ґ?Ѹ e H$WְF88/3M14j*NՓQoYRӱ aBIvlG} ,[}" n4S8ϨH %̰G;J,}UJ4s{r(`wW|}kPqTpIdSm,۔ezFh+{DFILCwkн x^BB2XR)W}sTݍ(;Bz ŰM2XqR%gr.+D2 J)FSAWQkl~bZJj< po~ ^@ eo'oQ*.sPFI v;tJ ) T!6Newv`=FJ3U! <+>pplCdGߞYjx<޹Vض`g)}l]'!FN#?HA\`sJ.|D.W'TaVdq(vz XN'ѽ)Wc#N4Z/0} m#_J:V3Ii-Y#-w:?!ÖGN]BjIܐ|慗fc(J)8Uqӯs]8{AT#է"`]67ViIֹ?Gl* MQ92$` ~LБgi6UlߔGw<ŘT48$ɥO)Ҡ4~f5iI\`F}6%BvWlf !A{:[R402=!id@>|A|E{7jɛDg3؀[(F]{D$B >la[YqYW(-VL~)Jgת6| I5u5em^}^x3ԭz@ZX#k[:;_g,g3рZј.&n#FKzʜ7A$\ }Um%\HO{p7gKNgLkY)+60x0պ^+u%N5`͙t<* lF^B&fTHyUyRǯ'U r{R b'ngp&\Y>B;M?_]uopll);$4F&93JTRFY FnyMrx0,@=uH> r?>_ܖ`.4LU|< 42#N&wMϗop#s(_Msەw Z@Bw}Ù%Ͽ@ߣe_|2v('\1>s:Ek3,lIĶ mtD52C< rUŷ[q͆tzk.g󙘴Q%%E4lPeyDXU5{ygjx" xJS/ӊzcj H(̭aWo> 6'ө4fZ;l+UJʳ.+jBSO){/~ާ{O~7?or uݠP ˌda bTweШj*aW !DXcۀa [=1ElCԋkDuF޳7 !%@L/,Q 1T (6}4!"k. /$F^!g<2>/86)fLz mD8++؎Q ,cWM7mtߵuޤmd=C^vsڄ3#t >n` ol_h?`4fGSna _@g]B|ZTa65ؼ+KF»#ړ^-O<s9adW~r"cK ȘOk ߵδ ;U+33q ׆ɳOAQtN~ňXnj{CgWyEڪ]l%PCL?T"T͢>g!>Z|b2NG rP"!7wوQؐ3s*b҆Z;kb(G/bߘq}ixb՘੘bK +wW$jnV/UMe!f^Y}[XU{^w3> #UWƇArZ]a A0Pq?KԟD/34x9xL3̈n@p}o GLWޯ )f5\vaD,^og(p.îJF-< 3KWWGMaR#=Qxe!C)?1%[sG@k';%@ƿbtFcaؿ;X8<\- d('ƱFjS#_ؘƎ"D/(ٓ?XQtSn~-oekh@l*CBWa0kKWG.II|E짻zJpͻzqK|o2>ۘRP(,.24Q~[ۦR\K%Ӑb}o%-|$yX*[ڷnkd'oM3iL=(EV]cgH6 }€0ZYg8IcPiMNl Z2h Q_rfYR"b*RJYib/zn>Z Nr'TvSombei Wo&26Lץkv)k_-!5=SO;O>{JgԪ gi<^d]zxƧH:(AߣzA"6: }tY>M/򱅖[Muogg#?2y*)1ev1F.{F> K-Q\F9j=iQba_b[^u/Mʿ3SB#',-S"" )FF:'C% ݷ Urؐ1rtBI狽NoM͚('6IE;/R{98JC+L H i JQh )D )Q\Ȥ+}gP`2-^z XF۔;&40{ RţK,vrmc uHӭCr6Ow9_Th]""D?⅄Rkz}]y/ 2=s3BfA*Z?zRF8 rE3@5`]3Ԭ|~^km fŨUdK$)9i] fi\8ٍ>N hu3*#nAjRi֎-H)}a4p6UzTL&>;;x:n/ԻRpq%u"KW8 6Y#1]z]۝ђOL2GkrRK胁,Q#_hESҩ1]s`VX6ƭ6$U&u&& d0. "fcﴷRs܁:Uh uT hyW`5uXMv3AxEL$Hx"_>壐LlB c}'\$?R`F;&F*uL&ٝdO9XjF3PA".="8:tP0N4uiY_GCޙ~WM^(zQ2~a\G+ou+>M{=Lt]kbɸ֐vddGm>8#sdEi0جd!g K?dT/xr=[ ,;r8&cAуEWbw}@p' ۘ+¸rgX|^HBgs*h\j02c/u+Ƽn Y T8K IH]U蹫Eb?PzuExNcU/3_'j4#u'Ό&Uӫ)_mmJjntU2Uy~o3#0#qV~2@+g6$5jTl˜'F/A4r@Qu m<񤩲Ppf4KyCTً^JQ ɇj*\GNO &U'R"J6LG%5V v(ppeyj2%EobyCvm>A Hu3U0d;t7uLV*pzâ  9TF܏Í+OۤdClC'l=֒=54.x"5MΥq220ّ=4jGKn\"weXQzG92Nf  b趁A33oLtjҊM#-q SEg< G% k8F`m,z#D8; |@=`Ui"P}͙C8ݝPB:St\r=4Vyshp kVz6B{?+udNR8K|Wi{ AXl>BhcXAfnRǚ %F8lS/ۗ&¦.,gdXM; RiR跀9zW=?B@ʢdo&N;xs q* $1, Q1 j9; hhϓ>4ZKLP[F*aK6cZL`iʓbw -ϗ`Fh.O(7|mdx&BPNEJ\5޾7?[ ^1˝ \T(>3@i<<5k ED4kSnF[@p}@U7^p|{"HL'S f-, ([4梎4X(,iL(;}Dz̜0K'Z$ E=%yKP^7=^oG;@,;k*9$>UULOFws2>N H}IۀE6 UUI|u GL̓"zmE+^躚Z:~\D魹d(DWH@ 0BR4dADZO7ͽ0.A/ oG(C`JT Qٺ%A{Ǒ5Y6ΠEeսǖ'"` vv0&2JVAۛp$V #5!Q91Ę>b\PĶo2NRnݧqnw'WnM;|FiÆJ:f:%6A"SzXnY%,[6[5Ј&.FW/sC$(7ΚX|XDY r0Cy'88;Wjg~lܽ].2G R99?JF>ϟ&=Øgx!"Ȏ 3ŁPܮ qt|PTad![HS54:Yǔ`=ɤNCZUp ]8lL+$n>ݪyziՉrܲ͌ X841Мw|$DLX5T{,=>-5:ŢrCfMhvԖy?c!yNdTWB)JT;%ZN/m@ +N#*.e;~=TȤɄ5t?p{ Ys"R^H =m,<_Rkuz3VnJ?;0$^7 1kSlY.=yOWqEzh/ G5  aPdMiٍH2´X 6EMq CIq םml=iE8b!?t._abqbjlQkn8%QyLS>*|1HZ}<1F<՗M l["^2?sbx׎@RÅ86 ^%yJA+׈H펃S 2G-IrɿbC/ܕK$U 1v4X$:CC8%Ѫ=*27M=C dԕJ&MT379Z g?TE$9- ]ktF쟺)x7/lg\mWPe/{^U3A(?`R2G :~JA3MQb{ a%ї;Up9l 'NpJ| ޅD jC# ="_$ m?2p^)QP ?Rp3[,$nn;Mt#!J'Lt j#2QLs8YC @"9EB< `=AQ]ΒF_=-tʯ}M=\ xIcDP$/@~RIZ1Э;˪F6NQ |߱L|j?s.LN>D-F nYd(m"4P =3أ`9ܲ͐`SƉ;DP RҊy y;e&P Q'/ D!\擴m{;eYdZ䞺fJr71w`GʯH\NӜMW;|ZSJב;N̹rCߑ叡 C'}n2/La~P+Yp; z/|Ki {b,)彵 g ccagW:ə[).8mnԄ_Rd5P˒7=)<~YK9OMg_z6_`nP1IX,n y}/M8hZ5Pqz?,JQot$O+Q_\no$Z=f(5)+tf:>D-d֩nd:HSggnU?gc*laIX jrkҜaŐ0b\;Hu-Uv!v;ۑX'K]V~>o@5$)dyqjȅG Xؒ0Oo1uʈ3Mcu _IP}4 Ac~Fj$~jHhhi[ŏcMӻ @)x\35i}-P:}ޟ0 ^/ݲjPewU9 @㛚5V1Ԁ:!i{j{Uq{Y~ީ1{fop\/w}]ݠPN6[-X ?e2ew0 2rxFǎZ#4.^۴GU F h`Rej"ZzJ)8N|6wt\ϖ[t0*C"]>@k&V8~n3'J{Ct[7O԰2&AXB ǓlH}&1= .رVL;u l$ȇB3^tIi\ E%"HrSm<U7~JGGApRERn /:XP3ʯ/ylCIEztH [hq k7I: &l|W <_6 lk$#JE,滕sHPe2 aBK,}@k;`\NJ2C&GAq 7ᛐ+o /A݃^)74pQ ~tZd/?ۤWEo\) 75f*o5#cݿ\W6zgis΋I?Ȼ;a%NN3%cjCi^]viLYLIn"{ZiC)):+V *3J 0]ɇ#.62=)eh^ᔬ\/rݘ)y`g!yLvy$(3Fds!ΥMP#}Q ZzK jEdv"!,VH!''Q1M#y]182^AX;WR*_3.[XG$,b@(/a6T76]}j6EæC{ӓfDXP~с0H"^m[: "b~|TvC'ƋdѴS qκm%S1HSڌ;dM0P YMXMDڜyrg1Oh|CA r IP`tW~+yL3<"oG 2.I.JGXyFax~K>NdWs mzvdCڸ9އr22!;]tivIV7/sׅS"O5@I|s]c\**ŷqsxc akJ>We8ʆ*4 >F8.n'_oRL?Q I WBi"7*mzDd12bb̞!r.Ld,Vv)sPWtrC|=>gI XFR.*Y@U򥑻d- $o7;JUiHޙMz4¾5od: D]ǾNZ8pG_ŀ'6ݳɰ !6'K ~Al>q)4UkS^PI"~ 8X!WQvjThqP Yi RPlKv990nju5sl DVT1OSGUlS +;[^٩o}$>{5RƺwM"w|e~˄~ڕNQh7(П-ZcUZ;b(yXSj,b,('˄.}w_;1|9*fy3+=<'{,[&^jκG 00"UJ :95ֳ {I8 S}LifQ0p@^DW7\|)^؇F~[CF}zgwq0۹k!^81@S@6ۛ՗94l3-뺖[ ,~m#]5cԵ 2vv2{ %QI_S_~j,mƸ`'l5#'AXmgmbWDU# XGT] w{bp@hDGI+.Rj>? .HŒ@ق,Bmm*joqܐp^ &|FjX:W.ؐ4OZ!cMY/箹*]L}@OM|j{|";xz)KH֡gTSxTOÆP,sw:<*S\_Ik|0`/&|/cQas7pzsRO%}h)˦+!Y˴ju'BE-R}e=e/S,4+!J%+gFط ެn^WAih3=v+I,7_H9Da8-+uQ.cҲk߻fh< f9 O4oQq,=[mEyc5 Gb珇 keJM &}8<d x>)hr겇iCj pGs$cX6n1JK4E{c-kOj>v^D16C XMn @$׆X_YĠ$U>MGR t{.xe3u7?RU,]+ۓTY"x![^~X6`Oɸ_omМ~J^-.X2dW*-],ϖnMLp6Ayv [3 h@*,>t_#&Jo{s`FӖ5Gf.͍}A/S\-D|NjɎZ\ Լ Z6^usֆ^j=`Ϝ\Dt*H -kbA` ڃ v ѴU3RIj­%Vh!JᅩQOT*GN} [:g[ ttU^KÏ ": )\RkNذxU&)b(cMafFǶa";X{4Jë'@)'EmXH벵4,4 ȱ8?¸N|t8mSgr!nObD[\5$0A?fu[&$+3l1D!04tvX߰N{m:Q:#V}cv]VTfSMaxM'22.mg/\9Gjn׫&4QlX/?4]„v%npMji-QǹC&?P%ZWަ9!I&%2=DF.#-UJHrى#Dj=뒀 cm 2˅EVɎ 0 +\{DW"RdE~ӌv]UO추s/n p] 9!-*੒Pn[:*2 {ye݈Dvom a"&ij~`n{gll aŝN/VAҾ!$ىc+U)AVjU*שL@wous[3Sptful߳6u^rqK#|"}^]!;p~WQ:W?˜.)KVNaWY@q/zC}es܇~o+)](W%%`<+n48lH haL'N:D4 UFM<7'v{&FE^̼W68MMh/OLe'YvYЬ$HUT/JMb$qh%8:R `c Jc5c2ok@g+ -hO5뼎z-0jI`llbFIH/>w&F\7:oeCJ#viUr Vml г! TG@œ=j k@vsE#mRQm| s)R~:fgBDD% r2G-Qe͈+51΀M x"4p\k`.,fqԴ"kh X]|:L&0mņLQTٍo} ɺy3.2c̿P* N1~ )弨[up~D)gsgfb rsBlhg<;lҥT ~Ir# EOZ e)FztۨAgPty@a*RRA8$^sDaVϣZS9tVYkg)uu?juJTBl'a GQ62Q|Aa, '[^ á*H~'婥H_T2a$b%td P`q#䵭$0VA?#("L_h P|\`hVw{\F~N︫TK|+Dx HXXZ'I}8)J ]M[r!I{&=q6y0 ߔ|-Jg_-V#OΔoTVn +ZDsr#g60vu " *b($?&@R~[[zn2 6/㍵atàʉS,4ܭpk;E=痧O|cVb-\3??Z1j0)8bM[m@Ϻ_H =#*tr߸6  HD1mW|).n `>*pzâ  9TF܏Iߘ2D@wO>^N& %b> a xIgnÔ;H#n%>=\Զ'6,53T7aT{nwR[l^k)Ef߬4%e}# Dw_u+:9Y].Nk ~`")!ꭦ2%tung[t4[)WRO}PH#9l lV򋌰F;$٭C ô{(j1:H1Jv9O Qys<YHA+gxʱ _xfĆj nMƒU @-D>!:4=DxEX5+o2K/ bgI9V,O<A6dSѩmQCVdu7,I?uXl?+z{Y冾Q<؞" ŹD_U 5'=L6l@dZ. hCg@KWG6dKgo8%l37eđ_^,j.Pv35P|=`H0 CN{gs=px8eOIAyeL11В9l+bFhuRf#- Fսʤb5)'Ił x2IyuC3.tY@/Q8At)@]Os/[^[%=ߒ!V,Ciө5؁}>npwҵ۹IAegs/pSï\]*mФ[$ak[GG kֽ*ܮoS{^A=z{f.ԞrܚPP,4ߩGKP|Tkbij+-c( Nj }CKq/l(/a@OY s8:x[pU]@.'=>D`Y[+qkWxO6">^˃S*/eN $yJ+`s26!{lyԬ}(J4߹QR!QrmIBc9o+}`EJbaD6/2'$f?t8ke ʻ2:qx`6vȘE"z_ `8AtvֻA1!a~ r \~h̕/nYAWiҳQ/;#6&Š +yDGSr2&<491vy3&$(0n(a8ɤNCZUr !mO^c)_x`z<}3jSǫN{&U'+ >E`nek^! dq r@TE\LW \b,Zjԗ^ ?eJ;X;~E`QyL$ʄc3RMV,NJ{Dד)).K?ܠ!Q d;mo5_aTt.mEඪz&#GA+?M<7 bSWmS 8ԯ7t_[A'Qax!'i+oÆ&Y^]ŭ +A# c"a.ȩ FRsL/ZiX##cQsK?QZ31˫^uZ:']c:{aP:D2ūLɏ _IyÆ[QfydQ/0&_6BIHkq++ M2E.Q Sʋ!(Z A^˦E$Mـ͍!PK:5,Ɖ!ڦ\eZS><1(I, T>k_LQ|J C>BlǔȂ)Sz^{^@8J@;@b d ]%Z@#Eڶ\>-٪4dW8a)[[ Ue0e(Y.R>?𷆊zglюKO m 40hj 83< Zb:9 geRg'`7}l"-w5 ~sq1K_UrqJ.wmZP=CǸU42Ƕ> fD5?39:*&oydP@n*xR7roy=[TEez1&ҋ֦YCqԉ>m;sC0ymw@jp߬zrY IPvS}eHv!#)4Fͷ3ڑ.YM5 jQ6Mj%=T2=kj+R ]!ѷ<Rہ.eRGgx^@"RXr(LSs%Wll>޾a:̵̑N Ný66ߖNjb[45! WtNWy-&[oDPjҵj,=w %abMXvKXz+ G0F#hBh?_:]j&e$MGڥ,ٱ9TY(t#ձbS}wؾ􂏯 XJA [M.AtUd :Vz,Pl-t LqIen!+7t"hUF$QɆ`쎠fKFaB+eAq W1%ASbW?9Y_[ Zˉ`;٠X@@o"'hy 2XgdF1 gK`4WUV NIƧ65Q*d[y޾}n@K\\~P3w]v[ܯPpAߨ̟U<j*˥)(}x!JŲcg暑S<]>ؐM´#'ukf@BݤT ͛88t2xC2ӷF 7d:9%l`~ʱs{=ަ1{3~7?on߷?5uݠPN7gnDQ&9k}Ϊ\o*mI},˔CԹDV `D QN5m#(eW"3?74?:/22H)7i{EPugQ0KWJ^6># x*O(=s*Pwsa[͌'nR&(+4?{[򚚌'[qXwU$K!q^w5F>dd0 ]ao8È?`"9xj $FL.=Cll wiiIՓ K[Yr9D{o}TyDa(ZTx&F^*{\Sek8.Y1m$-& cߦdhqRmK5NbaU ]L#]+Z- 4E.o3|zn:kdqp ΠPR_0Kdm0x\Pw0;ՂT렷GrScDqZi6 Jԩ5묮CYNc[o@ q; dg0"bɓwLF<`6mqM:bI ۂlEx?SjU𥺽wʳ7nB70>9<>@-/;@!cKW2tAxxB-5fgInbN&q?sAίl(ahZG:הa&3?È'C BĐ?t6QF_ aR443ٕX'JQ-ko WMٞm ̀ 2u lb *dʇ5|F&.aUP6z.̥FFpv,w`hB(#UIw-z{TN#Qj(Vz|S^?Kv=:u{iʬ‡^?] vUi; \>H2phUc @_3Ia&ՄS%b4{I}d *SنvSDU+v6 L >dls:430d2=PWD{=P̰ V;6b6%K3V>K4,+<BBfDdMdz~Yu}mT>o]c:Si ]9fg5 ;DIe?b_ 0W=U] > aU`=zK^ 2: T˝GXAn~%t$WEsB*Aɂ}$f爏4HGKA17V`ſX%`gމ¹'ը䑶`#Cȡ]C֠ƺ<]GIZ2@G"-pXrqX tpt9e>F1݉%|4 PL2((q')-yH~O"(Iy(p1< Իk|;)ȌwL!c`.Ua ~5D(h&VHӎt;u8zQ"FuVHSrЕ-`>:zjTEЛĨゾ[8{:rnI \Z=g@WU+YjO3ďr20\ _R$yMtAJkL{3FGpDtD}ܓ|'i*'ŗtGr NPjr,쯞ȏ.9CdrGž*k2(հA;m9ݿC8 7kll`6VY = 9t˧bV"=TDpjGWGf.K }A/S#XWf!$Cuq @K՘P2K&ַFBF߻ tuG%UYf7BN[\0,~vneP#iİ̱wf> H éyB0|}dn"z$Ci=l VEfpMǻRϝQ^ ,7kO^Br-ʆvHuzOp^hK\pb cJRo+,HxKeW(.MLhmv]qr0m wY/ -\a }>m`BP6Hi!c$룐9|tGV$hϐsQi+zfUUD*@ BSsDaQ NrCpR1:4@s=ewy85!d.Z/+4t%ס5puxDþZho}fBT^]6 n18y#6sSONs(E߃=M@&Z6⫉y]mg1ߓMM8 1Rm.w}.,BoP,zZeHtm/ i(`4AOFK]a;\H%:v78;NYjvڭx!,urOojȬ~߉uZ۾>kW7/ +ymmJjn):~V9XMaan>lԀ sZGy 0 u\I?."g?ޗJ~!İxR\IxM*~uZ9ٵ2|nTQz ?+GLY- d]95ݵhWO.N0q$ T<ygpdrPeA7$+:铐RsKfg$TMͶ"s-pËŊ}"zci;+{^zȝnΚ뱸6 A 5Nۭ}W6 gWr\q➺$߼&jZvD>"y* oڸ@lzڶ Ra4|1-/N,~_pgH蔐@1G7{,|;<8bec .b®]P!s[ɐQٯKE&qʴ13;6Êc51jzNb Ij @H\EJ\vKTI8ZcK#OىOYŚ ,R>5uMW4d9oJpjY%7JRɃi3C x@i!ɀ~!6Mp H{#fP|mu,nXT77EIjTDWW=).n `>*pzâ  9TF܏Iߘ2D@3y;tl(5*V;)DhqǠ~DQx2Fdj.b$7 +-#?7f77ƹ0N,F+xAPѡiŒҌɴW鑜 *_jt<*&l 'QEU4T#A"Ac]m!D#]顗k|h5PMih‚rS/7%#cГ0#bjx޼oZ;0iz'׊"])D Oiz{Olݘ(=i3mgDrOzLMeQ+pKCg WmLIRJcG: ]9}%6}(j#Q=YӖ Gt5[A5tA;NFEriW,f3HMMv.bR}X^D~ @ezYݳ\k}A,A]n͚S;w IJ`taoI7iv jE!$_$ ~o#0nkX_C'89H7`՞cHWTxXlA?MB*T̶]qW$ya,'^"nZIzxVoPF~tCɤNC|]H^H$M%EdK`m},(YD.@Ez- $t;BvQ LHL1V)&_A86VO!£|5.`gcaDv`>gwK$TS_wmgyàyr@eI?EA .R$ O&A>R_d0/] pG$uN;O jP_Ω8[KDQn ˲@B)TU'\| ^xakUq׽QqiJ@PBt)~į]aDºo,bAcU8Q6Fίe G /wU91-z°6XWMucЧM}yGaNjaӆyw<#+Ԗl9v)b̊dpsfHH37D1i 5'Cƌ &Qn=gTфGX (١B. Յ]t:jfv6"iFm桄m#)X] (}fN#cbS!'vhd/7ALU ”,0  ;-QS~d@:8Vj~$:ilYך /9~rĪ~4rZiHiT0m_kL?a{~! 1YE''k@6zal?b!80󈄤|b9@܉͒ds!ig3Uq3 u|2/;ѹFB[pΠrAl1 (|0fb)׷ Jѭ̄PÙY8DJ SZ!s w3'pSRO/[5Fސ1Qn6U.Nݬ2qJԘ&s8 |R'my{g͎ƩQ/>_ch 'K Ә]ub;Ki1֚00&Fn=Ȕz@/ǂqSf0)q;/-<}EUF}Fl_~K׸B\L&?c= }v?Qлعz$ UfHٛ;䑅ay6/:@``P2Gi@`޼llu'6^zn+^2WkW敽Y_VT\_q͜0,k:x~㭼p5}4F M[d]wokj9sXWNTdgP~۠_];; !F?Eĩ2G%H~DOoL3J e뽣L!ҲhT@wRI &!x>R6!A.1!Fth=7nIק24S~0TUvQ-{͖/ьmGd*V~%PR^Wft$)96`c Jfrȕ5i|EVnlb!給ϲF<2L=="\+ةeXݥxfi"!+)j;p| ,7zB0A[geو7Xć59hϼ^(K!Vԡ5!VpO;7/67"]egHC-0&-KY3v)*Ύ\YoZF7THo Xg4Nұ)ZdFg`zn>tg9^J.Ҷ+x,.5~5ľn聄UȀ&NE '  ThVV]3$iM+%()d*Ew!_LC61 79[|$CȐsiQRzYĢMy.zkr;)h4mڀ_bl0R*Ib,`? ;tly2ʏpgtƦ뀉RJD#hD Fkv:tayk)oxr][A ;Ą?!nPn9 M<_d'q!̓ט0pI X ~DΎ^ej>/ ERb4.*EKO~*ͳ//1M)̇\-6OfS\mHF]9zEWS10x*TP'|uQI>W$q[vU=.']K񮉀L˾-gi4MR6w fCr-\GҶE'fִ99/ ²5~muN-2eVVs00S =q7UgP7)Hڶ>\V"Vy8i그x;r9D9d[s5GVܞy{ 6G W_DHL ?:(JZsj{uc@Vr.?HOm/ҭ@%,@*9X{>.]ψ26u)`& Guӏ; VY  8,gi>8%~6%t{t`Zny)̤*>=48*4Ej 1TH5כ434~N"< *C!_mdK㛪{c{(6W]qF-oit32>BBCDEFGFGHIJIJJKLMNMMNNOPQQR STSSTTUTUVUVWXYYZYZZ[Z[\@AABCCDEEFGFGHIHIJJKLKLMLMNOPOOPQQRSTUVWXYYXYZYZ[\[[\]@ABABCDDEFGHIHIIJIJKLMNNOONOOPPQR SSTSSTTUTUUVUVWWXWWXYXYZ[\[\\]\\]]?@ABCCBDEDEFGIHIJKLMNOOPQRSSTSSTTUVWVVWXWXYZZYZZ[Z[\[\]=?@ABCDEEFGHIJKJKLLMNOPOPQRSRSTUVWXYZ[\]\??@ABCDCDDEFGHIJKKLMNONOOPQPQRRS TSTTUTUUVVWVVWXXYXXYYZYZ[\]<=>>?>?@ABBCDCDEFGHIJKLMNOPQRRSTTUTUVWVVWXYZ[Z[[\[[\]\<==>>?@AABABCCDEFGHIJJKJKLKLMMNOPOOPPQRSSTUTUUVUVWXXWXXYZZYZ[\[[\]\9<=>?@@ABCDEFFGHIJKLKLMNONPOOPPQRQRSSTUTUVWXWXYZ[\X9<=>?@ABABBCDEFGFGGHIJJKKLMMNMNNOPQPQRRSTUTUUVWWXWWXYZYZ[Z[\]Y;<<=>?@ABCBCDCEDEFGHHIJKLMNPOPPQPQSRRSTUTUVWXYZ[[Z[\[\[\Z;;<=<<=>>?BBCDDEDEFFGFGHIIJIJKLLMNNOPQRRQR SSTSTTUTUUVWVWWXYfZZ[\[:;<=>>?AABCCDEFFGGHIJKLMNOPQPQRSRRSSTUVWVWXYuYZZ[Z[\[;<;=<<==>>??@@ABCDEFFGFGGHIIJKLKLMNNONOPQQRRQRSTUViYYZ[Z[\:;:;<==>?@@A BBCCDCDDEDEFGFGGHIJKLMNOPQRSTUwYYZ[\\:;<==>?@ AABBACBCDCDEDDEFGGHIJIJ KKLLMMLMNMNOPQRRSTUxϸYYZ[Z[9:;;<;<=>?@ABABCDCDDEFGHIJKKLKLMLMMNOPQRRQSeٹYZYZ[[: ;:;;<;<<=>>?@ABCCDEDEFGHIJJKLMMNO PPQPQQRQRRU༛YZ[99::;::;<<>=>?@?@@ABCDDEFEFGHHIHIJKLLMNONOPPOPPQQRR`׮YZYZ[899:;<<=>?@ABCCDEFGHIJKLLMLMMN OOPOPPQrخXYZ[9:;<<=>?@ABBCBCDEDEFGHIJJKJKKLMNNOxͅ踋XYZ[899:;<<<==>?@?ABCDEEFGHIJKLKKLLMNNONOz҄̚XYXYZ7889:;<<=>??@AABCDEFGHIJKJKLMLMMNzՄ춇XXYYXYZ77889:;;<=>>?@@A@ABBCDDEDDEEFGHHIJKLMMjȄᨁzrjWWXYZ7899:9:<;<=>?@ABCDDEFFGHHIIHJKLLM^ޠ ~ulbZWVWXWWXYZ78 99:9::;;<=>?@AABCDEFGGHIJJKPܞ{ncWVWXWXXYXY6789:;;<<=<=>??@@AA@ABCCDEFGHGGHHIJz❆yk]TUUVUVWVWXYY66789::;<<=>? @@AABABCCBCDEFGGHGGHIJZ쩆{l\STTUTTUVUVWXWXY6789;:;<=>?@ABCDCCDEDEFGGHIJr`SRSTUUVUVVWXWXYY567789:;<<==>?@AABCCDEEFEGFFGHa҂ˈ {iWQRRQRSRSSTUUVUVWXYYX567 8899::;:;<==>=>>?@AABABBCDEFGFGGHI眅wbQPQRQRSTTUVUVVWVWXWX56678999:;<=>>?@ABCDDEDEEFVǂs]OPQRSTUVWVWX4456789::;<=>=>?@ABCCDEEFwܐqYOPQRSTUVWX4567789::;<=>?ABCDEEGsZMNNONOOPQQRRSTUVWVWX4545567899:;<=>==>>?@@ABBCDQɂ敄wZMNOOPQRSTUVUVWWXX34 56556677889:;<=>?>?@AABCCDCfă{aMLLMNOOPQRSTTSTUVW345689:;;<<;<=>?>??@ABABBCC򟄀~hNKLLMNOPQRSTUVWW33456789:;<<=<>==>?@ABBDތrSJKLMLMNOOPQRRSSRSSTUTUVWW23344545567877889;:;<;;<<=>??@ABAKǁÁ{^IIJKKJKLMLMMNOPOPPQRRSTSTTUTUVWVV23 445655677879::9::;;<;=<==>=>?@AUہmMIIJKLMNNOPQPPQRQRSTTUV2345566789::;<=>?@_{[GHIJJKJKKLMNMNOOPQPQRSTUV2234556789:;<==>?i獂pMGHIIJKLMMNMNOPQPQRSTUTUVU1223434556789:;<==>??u݇~`FGHGHIJKKLMNOPOPPQRSTUTTUUV122345576789:;;<=>>|уxQEFGHHIJJKLMMNMMNOPQRQRSTUTUUV11234456788989:;;<==>=~ÂoIEFEFGHIJKLMLLMMNOOPQRRSRSTU1122123567789:;;<==~cEDEFGGHHGIHIIJKKLMNONOOPQPRQRSTTUT10121122345567789:;<<=>?@@ABBCBCCDDEFGHIKLLMNOOPQQRQRRS../00112234567PX= >>??@?@A@@AABCDEDEFFGHIIJKLMLMNOPQR./011233456<׀Z<=>??@AABABCCDEFFGHHIJKKLMLMNNOPQPQR-.-././002123455656~_<<=>=>>?@AABABBCDEFGHIJKLMMNOOPRRQ-. //0/001123345pف~g;<=>?@ABACBCCDDEDDEFEFFGHIKJKLMNOPQ,-./ 223433455F~m<;<<=<=>?@@ABCDDEFFGHIJKJKLMNOOPQQ,,--./0223455u>:;:;<=>?@@ABCDEFGHIJKKLMNNOPQQ,,--..--..//001234}{C:;<==>=>>?@@AABABBCDEFGHHIJKLMNOPOPPQ,-./..0 112122334E炀~ M99:9:;;<;<<=>=?>>??@@A@AABBCDEFGHHIHIIJKLMNMNOPQP+,--.//01233~[9:;<==>?@@ABCCDEFGHHIIJKLMNOP+,+,-,,.//0112ml9889:9:;<=<=>>?>??@AABCDEEFGGHGHIJJKLKLMNO+,+,--.-../011218邀~y>789:;<=>?@ABABBCDCDDEFFGHIIJIKJKLMNOP*+, -.--..//012}L789: ;;<;<<==>=?@AABACBCDEFGHIIHIJKLMNO**++,+,,-,.-././01H́c677899:9:;<=>?@@ABBCBCDEEFGHIIJKLKLLMN*+*+,--.//./0~w967789::;::;<=>?@@A@ABBCCDDEFGHGHIHIIJKKLMNO**+ ,-,--.././00Y~J56789::;<;<=>?>??@@A@ABCCDDEDEFGGHGHIHIJJKLMN)*++,-.//0ƀ킀b4556778989::9:;<=>?@@A@ABBCDCDEFFGHHIJIJKLMNN)*)*+,--.//0_}y9545567889:;<<=<=>?@ABCEFFGHGHIJKLLMLMNMM*+*++,--./ǀ぀Q334456677877989::;<<=>?@@ABCBCDEFEFFGHIJKKLM)*+-,.-._~ q434455455677889:9:;<==>?@A@AABCCDDEEFEFGHIJJKLMMN(())* ++,+,-,-.ƀ߀D34567889:;<<=>??@AB CBCCDCDDEEFGHHIJKKLLM()* ++,,,-,--]~d23456676789::9;::;;<=>>?>??@ABCDCDEEFGGHIJJKJKKLKL(()*+++,,- };2234566789::;:;<=>??@ABCDEEDEFGHIHIJKLKL()* +*+++,--K~^1234456788989:;<<=>?@AABCDDEFGHGGIJKLL()())*+,-큀|81232345455656787889:;;<;<=>=>>?@ABCDEFGHHIJKJKKL'())*++,,6~]00112345567789:9::;<;;<==>??@AABCDDEFGGHIHIJKK'(()*)*+,}801012334556767889::;:;=<=>?@?@ABABBCDEEFGHHIJJKK'()(()***++рɀ~b/0012343467789::;<=<>=>?@@ABCDCDDEFFEFGHGGHHIIJK''(('()*M>//0112122345678989:;;<<=<=>>?@@AABABCCDEEFGHIJ &''(('()())**䀀~k.//012345567889:;<==>?@A@ABCCDEDEFFGHIIJ'&''('(()()))*-G//./0/01123233456567889:;;<;<=<=>?@@ABCCDEFGHIJJ&&'())())dv././/001234456789:;;< =<=>=>>??@?@@ABCCDEFGHGHI& '(('()))*Ԁ~W./01234456789:;<==>?@A@ABABCDEFGHI%&'((,~7.//01234567 8899::9::;<==>?@ABCDDEFGHHII%&'('()^i-./012334344566789:;<=<==>?@AB CBCCDEEDFEFGGHI%&'&'((րL-../01012232334567789:9:;;<=>?@??@@AABCDEFEFGH%%&%&')}2,,-.//0//012 32343445455667889:;<=>?@@ABCEDEEFGGHGH$%&&%&&'&'Fg+,,-,-././/011211234556767789:;;<=>?@@ABCDEFG$%&'&' ~K+,--./001234556 78789889::;<<=<==>?@ABBCDEFFGFGH$%&''&3++,+,--./001012234567789:;<=>>?@@AABABCDDEEFG$$%&'n**++,-../01 21332343445667899:;<==>?@ AABBCCBCDCDEFGG$%$%&U*+,-,.//012 3323344556566789:;<<;<==>=>??@?A@ABABCDEF$%$%%&%&ހ?*+,-../0/001234456789:;:;<=>>?@@A@ABBCDEF#$%$%%&%&|,**+,-.--./012334567889:9;:;;<<=>??@ABCDEDEF$%%&&%j*)*+,--.-.//001234566766787899:;<=>?@AABCBCCDDEF##$%V(*))*+,-./011212234456 7788988:9:;:;;<=>?@ABCDEDE#$%%&񀀂D())*+,,-.-./012343445676789::;<=>??@@AABCDE#$%$%%ڀ2)*)**+,-.-./0/011234565667789:;<;<= >>?>??@@ABCDE#$#$%$$%Łz(()*+,,-,-./..//011122334556787889:;<==>=>>?@ABBCDDE""#$#$%l( )()**)*+**+,,-./0112334344565676789::;<=>?@@ABCCDD#"##$##$%%_('()**)**++,-../..//0011212323455656789:9:;<<=>?@ABBC##""##$##$@@ABBC"#$?@A@AAB "#"##"#$%&%&''('()*+,-,.-./0112332334456789:;<==>?@@AABBABA"#""##$%&''(('()*+,-././/011212334454456789:;;<=>?>?@@ABB<"#$%&%%&&'(()*+**++,--.-.//012344566789::;<=<<==>>?@AABB1!"!""#$%%$%%&%%&'()*)**+,-./0//0123445667787889:9:;<=>?@@AA?"!"#$#$%&'&'()*)**+*+,+,,-,-../0/012344556789::;<;<<=>>?>?@5"!""##""##$##$$%$%&'&'()*+,-,-..-../0123233456787899:;<==>??@?@=!"#$%&'())*+,--./0/001233434566767789899:;;<;<<=>>?>?@?"""!"#"#$$%$%$%%&'()()*+*++,-,-./0112234567889::;<;<=>>?>>?.!"#$%%&''&'()*)*+,-,-./ 001021223233456789899:;<=<==>+ "!"#"#$#$$%&&'&''()*)*+,+,,-.//0012324554556778789:;;<=; !"#$$#$%&%&'()*+,+-.-.//0/012345456788989 :;;<;<<=:0!##"#$%&'(''()*+,--.-../012234545567 8899::9::;:84&BCCDEFGFGHHIJJKJKKLMLNMNOPQQRSRSSTUV WWXWWXXYXXYZ[\[\]]ABBCDEEFGFGHHIJJKLMNONPOPQQRQRSTUUVUVWXWXYYZYZ[\[[\]\]]@ABCDEFGGHIIJKKLMMNOOPQRSSTUVWVWXXWXXYZ[\[\]@?@@ABCEDEFGGHHIHIJKKLMNNOPQPQRSTSSTTUVWXWXYZ[\\]>??@@ABCDEDEFGHIJKLMLMNNOPPQPPQQRSTUVWXWWYZYZZ[[Z[\]\>?@ABBCDEFFGHHIJKKLNMMNOPOPQRRSTUVVWWVWXYXYZ[\\]\<=>>?@AABCCBDCDEEFGGHIJKLM NNONOOPOPPQRSTUVUUVWXYZ[Z[[\[\]\[=>?@ABCDEFGHIJKJJKLKLMNMMNNOPPQPQQRST UTUUVVUVVWVW XXYXXYYZYZY[ZZ[\[[\]]9<=>??@?@@ABCCDEEFGGHIJIJKKLMLMNOPQRSSTUVWVWXYZ[\W:<=<=>>?@AABCDDCDEFGHIJKLMNMNNOPPQRSRSSTSSTUVWVWXYZ[\Y:<=>=>?@@ABCDDEEFEFFGHGHIJKKLKLMNOPQPQRSTUVUVWVVWXYYZYZ[\[\\Z;;<==>>?ABBCDEEDFGHHIJJKLMNOOPQRSRSTUVWVWWX YX\cipv{[Z[Z[\\[;;<;<=>ABCCDEDEFGGHIHIJJKLMMNMNOPQRSTUVW_iqzZ[\\[;< =<==>>??@BABBCDEFGHIJKKL MNNMNNONOOPQRSTST UUVUVV[fr|Z[Z[\[\;:;<==>=?@@ABBCDCDEFGHHIJKLMNONOOPOPPQRRQRRSTUUVV]lxZYZ[\\::;:;<=?@@ABCDEEFGFGHGHHIIJKJKKLMNOOPOPPQPQRSTSSTT^kzZYZ[[Z[9::;<==>?@?@@ABCDEEFGGHGHHIJKLLMMNMNONOPQRSSXhxYZYZZ[Z[99:;::;<>?@AABCDDEFGGHIJKKLKLMLMNNOPQRRTar~YZ[[99: ;<<=<==>>??@ABBCDEEFFGHIJKKLMMNMNOOPQRVhzYZYZ[899:;<==>??@AABCDDEDEEFGHIIJKLLMNNOPOPQQYn~̹YXYZ[Z[8899:;<=>>?>?@ABCBCDEFEFFGHIJKJKLMMNOP[rҺXYYZ889:;;<<=>>?@ABAABCDDEDEFGGHIIJKLMMNOO[sڽXYZ8 99:9::;:;<=>?@?ABCDDEDEFGGHIHIJJKJKLMNN[tұWXYXXYZ778899:;;<=>?@@ABABCCDEDEEFGHHIJKKLKMUpղ wWWXXYXXYZZ7789:;;;<=>?@@ABCCDCDDEEFGHIJIJKLQk~ޅṛyi\VVWWXWXYXXY678988:;<=>=>?@ABBCBCCDCDEEFFGHIJKKLMe}̥}jZUVWVVWWXWXY678789::;<<=<==>?>?@@ABCDEFFGFFGGHIJKJJXw鼛ycTUVVWXYXY6789;<<=<=>?@AABCDEFFGGHGHHIJOlݰ{bSTTUTUUVWWXWWXY6678779899: ;;<=<<==>>?@ABCDDEDEFEF GGHGHHIHI^{کhSRSTUTUVWXYX678899::;<=>?>?@@AABCBCDEFFGHHIPq٨vZQRRSTUUTUVWWXWWX556 77877999:;;<==>?@?@@ABCDEEFEFG^|ۧlRQRSRRSSTUVWWXWX55678:9:;<>?@ABBCDEFGLn评eOPQRRSTUTUVWWVWX567787899:;<<=>>?@AABCDEFFUz𹄙_NOPOPQRQRRSTUVVUVVWX45678899:;<;=>?>?@ABABBCDCDEcɛ_NONPQRSSRSTUVUUVWVWWXX4 556676778899:;<=>=>>?@@ABCDHn⧃bLMNOOPQPRSUTTUVVWVWX435456566767889::;<=>?@A@ABBCBCDDOwkLMNOPQPQRST UUVUVVWVWWX3456676899::9:;<<==>=>?@AABAABCY}߂֟uPKKLMNOPPOPPQRSTUVWW3456677889::;<<=>?>?@ABACCd󶃙WJJKKLKLMNOPOPPQRSTUTTUVVWVV3456678899:; =<==>=>?>?@?@@AEmܠgIIJKLMNOPQRSSRSSTSUTUV2334556789:;<<=>>?@A@AHsԂPHHIJKLMMNMNOPQPQRQRSTUTUV233455678989:;<==>>?@Kx쨂dHIJJKJKLKLLMNOOPQRQRSSTUTUV234567789:;<=>?@Nz۞OGHGHIJJKLLMMNONOOPQQPQQRSTTUTUVV234566789:99;<=>??Q|łlFFGHHIJKJKLMNOPQRSTU11234456767789:; <=<>==>>S}󱂙 VEFGFFGHGHJJIJKLLMLMNNOOPPOPPQRRSTSTTUTTUV11223322345667789:9:;<<=>T~飂JEFGGHGHIJKLMMNMNNOPOPQRRSTTUTU1234556789::;<=<==S~ɂqEDEEFEFFGFGGHHIJKLMNOPQQRSRSTUTU1011234567787889:;:;;<Q}΂՚_CDEFGGHIJKLMLMNNONOPQRQRSSTSTU00123345678789899:;;<??@A BBCBCDCDEEFEFGGHIJKJJKKLMNONOOPQQRSRS.//0 11223343456678L~`>?@A BBCBCDDEEDEFGFGHIJIKJJKKLMNOPPQRRS-../0112234567AzÂc=>?@ABDCDEEFEFGHIIJKLKLLMNOPRQQRR-.//01234568q܁͂e<=>?@@ABCDDEFFGHIKJKKLKL MNMNONOPPOPQRR-./01232343445456^؂m;=>>?@@ABCDDEDEEFGHIJKLMMLMNNOPQR--./0123445K杁w;<=>>?>??@ABCDDEFGHIHIJKLLMLLMNMNONOOPOPPQ-,-./32345;x󣁙 <;<<;<<==>=>??@@A@ACDDEFGFGGHIJIJKLLMNOPPQ,-./234g@::;;<=>?@ABCBCCDEFGHIJKJKLKKMNOPPQQ,,-.//00123234OŁG:;<=<==>>?@@ABCCDCEDEEFGHHIHIJKJJKKLLMNNOPOPPQ,-.//0122334:z݂U99:;<<=> ?>??@@A@AABDCDDEFGHGHIJKKLKLMMNOPOP+,-./011233d񡁙i89:;<>=>>?@@ABBCCBDEEFGHIJIJKLMNOP,,+,- .-.///00121232I9889:;:;<==>>?@@ABABCBCDEFGHIHIJJKLLMNMNNOPP++,--.//01124uсA789::;:;<;<<=>>?@ABCDEEFGHGHHIJKLMNMMNNO+,+,--.-/0101X흁S7789:9::;<=>?@@ABCDEFFGHIIJKLMNONOP+*+,-../0011:|s67898899:;<<=>??@?@@ABCDDEDEEFGHHIHIJJKJLKLMNMNNO*+*+-,-../0cՁ;678 99:9:;:;;<<=<=?@?@ABABBCBCDEFEEFFGHIIJJKLMNNO*+,-.././/0@~ǀR5567899:;;<=>??@ABCDCDDEFEFFGHIJKJKKLNMN)*+,++-,,./0ir5667889:;;<;=>?@?@@ABCDDEDEFGGHIHIIJKKLMMN*+*+,-.//Bր恙:44566788989::;<;<<=>>?@ABCDEFGHIJKJKKLMMNN)*)*+,,--.//i[3456789899: ;:;;<<=<>==>>?@ABBABCCDEFGFGHGHHIJKJKLMNN)*+ ,+-,--../A݀܁4345667889:9::;;<=>>?@ABCDDEFGGHIHIJKLM))*)*+-,-..iK34556 778789899::;:;<<=>>?@A@ABBCEEDEEFGHHIJJKLMM()()*+,--.@݀ցu223456566789::; <;<<==>=>>?@@AABABCCDDEFGGHIJKLLML()*++,--f?223233456767789:;<<=>>?>??@@ABCDEFFGGHIIJIIJKJKLM()*++,9~׀ׁm1234566789:;<=>?@ABABCCDDEDEFGHIHIJJKLL'(()()*))**+++,\;12323345565767789::;<==>??@A@ABBCBDEDEFGHHIKKJKKL'())**)*+,0zǀ݁k12323454455676789::;<=>?@@ABCCDDEDEFGGHIIJIJKK'('()()*++,+M:01101123345667 889899:9::;;<=>?@AABCDDEEFEFFGHIHIJKJK'()*+m遙r01123445667889:;<<=>?@ABBCDEFGGHIHIIJK'()*++9C//011232334556789:99::;<;;<=<==>?@ABCBCCDEFEFGFGGHIIJKJ'(()(())*X~/012334354567899:;;<=>>?@?@ABCDCDDEFGHHIJ'&&'( ))()**+vʀԁO/0//01012343445656789:;:;;<==>=>>??@A@ABCDEFGGFGGHIIJIJ&'('()()*A/../01121123434566567889::9::;<>=>>?@@AB CCDEDEEFEFGFGHIJ&'('())]끙d.-../012345677899:;<==>?@AABCDEFEEFFGHI&'&'('()+xՀǀ;-./00123456789:;<;;<=>?@@ABCDCDEFGFGHI&%&&'('()>|,--./0112345678789899:;;<=<=>??@ABABBCDEFGH%&'('()Z遙U-,-../0101233456778989:;<=>>?@A BCBCCDDEEDEFFGH%&&'&'((sҀɀ3,-,-../011245565667899:9::;<<=<=>?@A@ABABBCCDEFEFGGHH%%&%%&'4z++,,-./0 1121223343456789:;<<==>=>>?@ABCDEFGGHH$%&'&'LU+,,-.//0/00122344567899::;::;<=>=>?@ABBCDDEFGG%$%&'cՁ5++, -,-.--.././01122122334556789:;<==>?@ABDEFFGG$$%&%'&&y**+,-,-./0123445456789:;<==>?@ABBCBCDEEFFGG$%&c**+,-,-.-./00123344544556789:9:;<<=>==>?@@ABABBCCDEFFG$%&쁙E)**+,-./0011023456789:;:;;<=>?@AABCDEDEFF$$#$%&%&ր-**+*+,-../01012345456789: ;;<;<<==>=>?@ A@BAACBCCDCE$##$%&%ۀ})*+,-./01123324567899:9::;<<=>?@ABCDE#$#$%&c)*+,-.-./01212344567889:;<<==>??@?@@ABCDEDEE#$%$%M)*+,,-../01223445776789:;<;<=>? @?@AABABCDDEE#$%ꁙ5)*+,+,-../ 00111223343456767789:9:;:;<=<=>=>?@?@ABBCD"# $$%$$%ۀ()*+,,-.-./0123445567878899:;<<=>?@AABCCDCDD#"# $$#$$%$΀ˀ ('(()()*)**+,+,-,,--./012323456679899:9:;<==>?ABABCD#"#$߀p'()**)*+,-./00112334545567889:;<=>?@BC"##"#$$#%?@ABCC""#"##$#$#??@A@AABCB!"#$%&&'&'('()**+,,-,,--././012232233456789::;<<=<=>?@?@@AAB@"##"##$#$%&'(()*++,-./0132334434456789::;<<==<>==>?@@A@@AAB<"##"#$%&'('())*)*+,+,,-./00123233456789::;<=>>?>?@AB1!!"#$%%$%&'())*)*++,+,,-./012343456789:;;<>?>??@AA?"##"##$%&%&%&'(()()*))**++,,+,--,-.-././0/00123434556787899:;<=>==>??@@AA5! ""#"#"#$$#$%&''()*+*+,-./0/00123 4344556566789::;<<==>?@@="!!"#$#$%%&&%&''(''()())*+,-,./0/0122345565667889::;<<=>?>"!!"!""#$%&'&'(()()*+,-.--./0112344567789:9:;<;<<==>?."!"#$#$#$%%&%&'()*+**++,-.//0/001212323456566789:;;<=>>+ !!"#$%$%&'('()())*+,--././0010112123345567789:;<=>;!"#$$#$%&%&'('()(())*)**+*++,-,--. /0/00110112334345677899: ;;<;;<=:0 !"#$#$%$$%%&'()**+*+,-./..//011234566789:;:;85&BCBBDEFGHHIJKLMNONOPOPPQRQRSRSTUVUUVWWXYZ[Z[\[\\]]ABCDEFEFGGHIJKLMNOPPQPQQRSTSUTUVVWXYZ[ZZ[\[\]@ABCBCDEEFGHIHHIJKLMNOPQRSTUUVUUVVWXWXYZ[\]\]]??@ABCCDEFEFG HHIHHIJIJJKLMNOPQRSSTUUVWXXYXXYZ[\]]\\]>?@AABCCDEFGHIJIJKLMNMNNOOPPOPQRSTUVWXYZ[\[\\]\<>??@@?A@ABBCDDEFGHIHIJKLKLLMNOPQRSTUVWXXYZYZYZ[\[\]Y==>>??@?@ABCCDEEFEFGHIHIJKJKLLMNNOPQRQRRSTUVWWVWXYZ[ZZ[\]\\]]<>?@@ABBCDCDEFGHIJKJKKLKLMNMNOPQPQRSTU VUVVWVWWXWXYZYZZ[ZZ[\][<==>?@@A@AABCDEEDEFFGFGHGHIJKKLMNOPQQRSSRSSTU VVWWVWVWXWXXYZ[\[\]\9=>?@@A@AABCDEFGGHIJKLMNOPQRSTUVWXYXXYZ[\W:<=>?@ABCDCDDEEFGHIIJKLKLMNONOOPQRQRSSTSTUUVWXYZYZ[Z[\Y;;<<==>?>??@ABCDEFEFGHI JJKJKLLKLLMMNOPQPQRSTUTUVWWXWX YYZZYYZZ[Z[\Z;<<==>??BCCDEFGHHIJKLLMNONOOPOPPQRRSTUTUUVWX[cipv{Z[\[\[;;<<=<==>ABCCDCDEEFGHIIJKLLMLMNNOPOPQRRSTUVWX_iqzZ[\; <<=<==>>??@ABBCDEFGHHIIHIJKKLMNMNOPQRSRSTUV[fr|Z[\\;;:;;<==>=>??@ABCCDEDFGGHIIJIJJKLMLMNOPQRSTUTTU]lxYZ[[Z[\[9:;<=>>?@@AABCDEFGHHIJKLMNOPQQRQRSTSTT]lzYYZ[Z[\9::;;<;<==>?>??@ABC DEEDEEFFGFGHHIHJIJKLLMNNOPPQPQQRQRSWhxYZ[99:;<=<=>??@ABBCDDEFGHIJKLLMMLMNOPOPQRTar~XYZYYZ[9:;:;<=>?@AABABBCDEFEFFGGHIIJKLMMNOOPQPQRVhzXYZZYZZ[9:;::;<=>?>?@@ABCCDDEDDEFFGGHIJKKLMNNMNOPQZn~~XYZYZ[89:9:;;<<==>?@AABCDDEFGHIJKLLMNMNOONO[r~YXYZYZ89::;=<==>??@ABDCDEFEFGHHGHHIJKJKKLLMLMNO[s~XYXYZ7889:;<<=>>?@A@ABCDDEFGFGGHIIJKLLMNNZs~XYYXYZYZ8989:9::;;<<=<==>?@ABCDEFGFGHGHIIJKLMMUp~ȧWXYZ7789::;;<<=>>?@@A@ABCDEFFGHIHIIJIJJKLMRk~~دcVW XXWXXYXYYZZ7787899::;<=>>?@@A BBCBBCDDEDDEEFGGHIJKLe}~_VWVWXY667789:;<==>?@AABBCBCCDEFFGHIIJKXw~yUTUVWXY667889:;<;;<=<=>=>>??@?@A@ABCDEFGHGHHIIJOl~ xSSTSTUTUVWXY66789:;<<=>>?@A@ABABCDEFFGFGHI_{~ ͈USSRSSTSTTUVWXY567 8899::;;<;<=>?@ABBCDEFFGHHOrgQQRSSTUUVWXWWXXYY5678899::;<=>??@AABCBCCDDEFGH^|~UQRSTUVWX56556677899:;<=>>? @@A@ABABBCCDCDEEFGLn~ӃPPOPQRRSTSTTUVWX445566789:;;<=>??@ABCCDEFFVy~քwOPPQRSTUVWVWXX 4545656677889::;::<;<<=>?@?@@ABCDEFc~wMMNNOPQPQQRSRSTUTUVWX4656 77889899:;;<=>??@ABCDEEIn~MNOPQRRSTUVVWVWX345456 77889899:;<==>?@ACBCDOwԃOLLMNOOPOPPQRRSTTUVWWVWX343456899:;;<=>?>??@ABCX}~VKLLMNOPQRSTSTUVVWVVWW334454556789:9:;<==>=>>?@AABCe~ۃiJKLKMNOOPQRQRSSTUUVUVVWW23345567899:9::;;<=>>??@?@ABAEmKIJKKLMNNOPQR TSSTTUTTUVUV3455666789:;:;<=<=>?@@AHs~σYIJKJJKKLMLMMNOPOPQRSTUVW2234454557889:;:;<=>?@@AJx~GHIJIJKJKLMNNOPOPPQRSSRSTUV2343445667889:;<;;<<=>?@@NzZGHGHIJIJJKLMLMNONOPOPQRSSTUUVV123223456789:;<;<<=>=>?R|ǂGFGHJIIJKLMMNMMNO PPQQPQQRQRRSTUVV12345567878898:;<=>S}kFEFFGHIJKLMNNMNNOPQPQQRRSRSTUV1234565667889889:;;<=>>T~SEFGGHIJIJJKKLKLMMLNNMNOPOPPQPQQRSSTSTU12345567899:9:;=S~FDDEFFGFGGHIIJIJKLMLLMMNOPQRSTTU001233445456789::;<<=Q}DEFGGHIHIIJKLMNOPQRQRRSTSTUT0123456676789989:;N}Â`CBCCDEEFEFGHIJIJKJKKLMMNMNNOPQRST/00121234567899:;;J|ӂSBBCDEEFFGFGGHIJKLLMNOPQRSTSTT//00123334456789::;Eyۂ IAABBCCDCCDEFGFGHHGIJKLKLMNNONOPQPQQRSTST//01012345456789:Au߂DABCDEFFGHHIJKLLMNOOPQRS/01123343456 77887889:;p?@ABCDEDEGFGHIJKLMLMNOPOPQQRS.//012345678789f??@ABCDEFGHHIHIJKLMMNMNOPQQRQRSS../01345678Z݁?@@ABBCBDEEFGHIIJJIJKKLMMNOPQRRSRS../0 11232343345567788L~؁=>??@A BBCCDCDEDEFGGHIJIJJKLMMNONOPQRS./0011123443456677Azʁ=>?@?@@AB CCDCCDDEEFEFFGHHIJJKLKLMMNONOOPQR--./0123455665669q=<=>=>>?@AABCDEDEFEFGFGHHIJIJKLMMNOPQRR.-./00111223456^<=>=>?@@AABABCBCDEEFGGHIHIJIJKKLMMNOPPQ--.//0/01123454456K=<=>?@ABCDEFGHIJKLMMNMMNOOPQ,--./02345;x?;<<=<=>?@@ABBCBCDCEFFGHIJJKJKLMMNMNOOPQPQ-,--./2234gF:;<;<<=>>?>??@ABCDDEFGHHIHIJKLMNMNNONOPQQ,-,-.--.//012123344OŁU9:;<<=>?@AABCDEDDEEFGGHIIJKLMNPOOPPQ,,-././/01123:zr8:;<;;<<==>?@ABCDCDEFGGHGHJJIJKLMNONOOP+,-.01233d89:;<<=>>?@ABCDEEFGHIJJKLMNNOP+,--.-.//01223I݁ :88989:9:;<<=<==>>?@ABCCDDEFEFGHIJKLMNOPOP+,+,,-./00124uK7889:;;<==>?@AABCCDEEFFEGFFGHIIJIIJJKLMNO*+,- ../.00/0012Xq789:;<<=>?@ABCCDEFGHIIJKKLKLLMNMNO*++,-..//011:|߁676787889:;<<=>>?@?@@ABABCDEGFGHIJKLKMMLMNO*+,-./0cB566789:;<=>??@AABABCCDEEFGGHGHHIJKLMLLMMNO**+*+,-./0?~o5667898899:;<=>?@?@A@@AABCBCDCDEDEFFGFGHHGHIJKLLMLLMN)*+,---././00í5678:9:;<<=>??@ABCDEFGHIHHIJIJKLLMNN)*+,-.-../B A44556676789:;;<;<<=>?@ABBCDEFFGHHIJJKJLKKLMNN)*++,+,,,-.-..//i456789::;<=<=>?>??@ABBCDFGGFGHIHIJKLLMLLMM)+,-.B53344565676789:99::;<==<==>>?@ABBC DDEEFEFFGGHGHIJKJKLM))*))**+,+,,-..ic345566789::;:;;<==>>?>??@A@ABCDCDEFEFFGHIJKLMM)(()*+,,-@2343456789:;<<=>?@ABCCDCCEFFGFGGHIJKLKLLM())())**+,-fM122345467899:;;<=>?>?@AABBCBCDCDEEFGHGHHIJKL(()*)**++,-,8~112334567899:9::;<=>?@AABCCDEEFGGHIJJKJKKLK())*++++,\C123456789::;<==>=>?@ABCDEFGHHIHIIJKLL'(()(()*))**++,+0z00112 32344344556789::;<<=>=>>?@@A@ABCDEFGHIJKL'('()*+M߀E00121223456778789899:;;<==>?@ABBCBCDEFFG HGHIHIJIJJK'()()**+m/001234456789:;<;;<=>??@ABC DDEFEEGGFGGHIJJKJ&'(()()*+9ЁW//011212234567889:9: ;;<<=<=>>=>>?@@ABABCDEEFG HHIHIIJIJK&' ()()(**+*X..01212345 67677877889:9:;<==>=>?@?@@ABCDDEFFGHIJK&'()**+vo./012334567899:9::;<;<<=>==>??@AABCCDEFGHGHIJJ&'('(**A0./01234556788989::;<<=<=>>?@ABABDCDDEFGGHI&'&''()**]--././0112345456789::;<<=>?>??@ABBCDEEDEFEFHHGGHJ%&&'()*xŀG-./0123343456789:;<=>?@@ABBCDEFGHHI&&%'&''()>ȁ-./0112112234545567789::;<=>??@?@ABCBCCDDEFFGFGHHI%&&%&&'(((Z|-././011234567899::;<==>=>?>?@ABBCDEEFEFFGH%&%%&&'(s€:,--./01011234566767789:;<<==>?>?@@AABABCCDEEFGHH%&'4+,-.-././0234456789::9:;<=>=>>?@@ABCBCDCDDEEFGFGHH%&%&'K|++,-.-../01212323345456789 ::;;<<;<<=>??@ABCDEFFGFGH$%&%&'&c>++,+,-./001234566767889:;<=>=>?>??@ABBACDDCDEEFFGFH$%%&'yրՁ+,+,,-,--.//0/0122344567789:;<=>?@ABCCDCDEFG$$%$$%&+*++,-. //0/001121234566767899:;<=>?@AABCCDDEEDEF#$%%&%&' ^**+*+,+,-,-././01232233455656788989::;<=>>?@A BBCBCCDCEDEEF#$%&%1**+*++,-./0123233456789:9:;<<=>?>?@ABCDEEFF#$#$%&Ѐ)*)*+*+,--./012334566778789::;<=>?>?@AABCEF#$#$%&))*)*+, -,,-.-.././01234566789::;<<=<=>>?@@AABCDEE##$#$%m)()*)**+,-../0112346788989:;;<==>>?>??@@AABACDCDDE"##$#$%@()*)**++,+,--./00123456789::;;:;<=>>?@@ABABBCDDE#"#$%()**+,--.-./02345678 99:9:;:<;<<=>>?@ABBCDDE""##$#$т()*+,-./0121223445456789 ::;:;;<<=<=>??@@ABCDCD""#$%%Ѐ'(()()*+,+-,,-./01232334345567899:;<==>=>?@ABCCD""#$@AABABCC""#""#$$?@AB !""#"#$%&'(() *))*+*++,++,--./00/00123455678899:;<;<=> ??@?@@AABABC@"#"#$#$%&%&&'&'()*)*+,-.-././0012234556567789::;:;;<=>?@@ABB<!!"#$%$%&%&''('()*+,--./012345456778989:;;<=>?@AAB1 !"!"#$$#$%&'())*)**+*+,-./0012343445567789:;<=>>?@AA?!"#$%&%&&'('()*+,++,,-. /00/00101212345667889::;<;<==>=>??@5!""#"#$$#$%$$%%&'(()()**+,-.-.//./0122132234567899:;<<=>?@?@>"#"#$%&'( ))()*)*+**+,-../00101 2322334454567787889:;<=>?"!"#"#$%$%&&%%&'()**+*+,-,-.-./001012122345656789:;:; <<=<==>>?>?-!"#"##$%$$%&'())*+*++,-,--.-.//0/0122345455667889:;;<==>+"#$%&'()*+,-./../012234567889:;<;<=:!!"#$##$ %%&%%&&'&&'()*)*+,-.././/011212345567889::;<;<<;0 !"#$%%&%&&'&'()()*++,,-,-.//00101234566789::;::84&ih32a;@BCDDEFHIIJKKLMNOOPQRRSTTUUVWXYZ[Z[ZU>ABCCDEFGHHJJKLLMNOOPQRSSTTUVVWWYZ[[\Z?@AABDDEEGHHIJKLLMNOPPQRSSTUV)WXYYZZ[[\\]C7<>>?@ABBDDEEGHHIJKLMMNNPPQRSTUVWWX YZ[\[\V6<<=>ABCDEFFHIIJKLLNNOPQ SSTTVUVdZ[+V5:<<>զ@ABCDEFFHHIJKKLMNOOQQRRTTjʀZL[W59:<?@@BCDDEFGGHIJKLMN7Y}{~YYZZU389:;=>?@AACDDEFGHHIJKKMT֥|})|uWXYYT37899==>?@ABCCDEEGHHIJLٜ{\uh]VVWXXYS26789<==>?@ABBCDEFFHIcߠ|ygWSTUUVWWXYS16678:;<>>?@ABCCDEFH{s_QRSTUUVWWXS05577::<<=>?@AACCDQՌzu[NOOPQRRSTUUVWWR/45569:;;==>?@@ACd}}x]LMMNOPPQRRTTUUVWR.345689:;;=>>?@Aw@z~fKJKLMNNOOPQRRSTTUVR.2345789::<<>>?zxTHHIJKLLMNNOQSTUQ-22347889::<<=ֆ}}mIFGHHIJJLMMNOPPQRSSTUQ,122467789:;<҃{~aCEEFGHIJJKLMMNOPPQRSSTP+0012557789:wԃy~WBBCDE9FGHHIJKLLMNOOQQRRSO*/002456778d߅y|P@@BBDEEFFHHJJKLLN-OPQRRO*./0133566Hz|O>?@@ABDDEFGHHIJKLLNPQ7M).//023458|}~P<=>?@ABBCDEFGHHIJKLMNNOPPQL)-.//334zV;<<=>??@BCDDEFGGHIJKLLMNOPPL),-..ҟ23QӀvc9:;;<=>??ABBDEEFGHHIJKLLNNOOK(,,-.012xq:899;<<=>?@AACDDEFFGIIJKLMMNOK'+,,-/0q}}B6789:;<==??@AABCDEFGGHIJKKLMNJ&**,,/2vX4577899;;<>>??@ACCDEFGHHIKKLLMI&)++,.{{u54457789::<<=?@BBCEFGHIJKLLH%()*+.wK234566799:;;<=>?@@BCCDEFFHHJJKKG$()**g{p122345677899;<==??@ABCCDEFGGIIJKG$(()*uK0122345678899:;<>>?@ABCCDEFGHHIJE$''))w0/001334566789:;<<=>??AABCDEFGHIIE#&'((vW../012234567799:;;<=>?@ABBCDEFGGID"%&''[y7-../0112345667899;;<=>?@ABCCDEFGHD!%&&'Āp+,--//001334566889::;<=>?@AABCDEFGC!%B&xU+,--.//001334557789:;<<=>??ABBCDEFC!$$%&t?*+,,-.//012243677899;;==>?@@ABDDEA $$%%z~,)**,,--./023455779;<=>??BBDEA##$$󻻳 @BBC@##$$ @ABC>"##$%&%'()**++,-../0112345567899;;<>>?@AA9" ##$$%&&''()*,,-.//011234557789:;<==??@@!"#%$%%&&'(()**+,,-../001234556789:;<<=>?5)!"##$$%%&&''((**+,,-.//0112345568899:<==2  !"#$$%%&(())*+,,.0012344/?@ABBCEEFGGHIJKLLMNOOQRSTTUVVXYZZ[\\D8<=>?@@ABCEEFFGHIJKKLMNOPQ RSTTUUVWXXYZ [[\V7<<=>9ACCDEEGGHIJKLMMNNPQQRSSTTUVWZdnu{ZZ\[V5;;<=զ@ABCDEFGGIJKMMNOOQSSTZhuYZ[[W5::;=??ABCCDEFGHIIJKKMMNOOPQRbtYZZ[U49:;;>?@ABCCDEFGGHIJKKLNNOSg{ҾYYZZU389:;=>?@AACCDEEFHHJJ?KLLOf|ɫXYYZT3789:<>>??ABCCDEFGHIIJJ_zЯtcW.XXYT26889;=>>?@AACCDEFGHHQqʢs[TTUUVWYS16678:<<=>?@AABDDEFG^}ΣgRQRSSTUUVWWXS05668:;;<>>?@ABCCDIn٧bNOPPQRSTTUUVVXR/455699;;<=>?@@BBNw~񶙏fLLMNOPPQRRSSUUVVR.345689:;;<=>?@AS|֢uLJKLLMNOOPQRSSTUUVR-23457899;<=>>?X~[GHIJKLMMNOOPQRSSTUUQ-23347789:;;<=Z󯙀JFFGIJJKLMMNOOPQRRSTTP,023356789::x衕V>??ABBDDEFFHIJ@LMMNOOPRQN)..0033456kX<=>?@ABBDDEFGHHIJKKMMNOOPQM)--//234Va;<=>>?@ABCCDEFGHHIJKLLMNOOPL(,--.Ҟ13>|r9:;<=>>?@@ACDDEFGGHJJKKLMNOOL(+,-.011k:89:;;=>>?@AABDDEEGGHIJJ-LLMNNJ'+,,-00IG7799:;<<=>?@@ABCEEFFGIJLLMNI&+M,.0sÙe566889::;=>>?@ABBDDEFFHHIJKKLMI&)*++.L64457889:;<=>??@AACCEGGHIJKKMH%))*+-rS234556889::<==>?@@BBDDEFFHIIJJKG$())*C01244566889:;<<=??@ABBCDEFGGIIJJG$(())eT01133456X6889::<<=>?@AABCEEFGGIIJE#''()}10011334566889:;;==>?@ABBCDEFGHHIE#&''(ؙd-.01234467789:;;==>?@@BBCDEFGGID"%&'';-./0011334567799:;;<=>?@AABDDEFGGC"%&&'¦+,-./0012234566889:;<==>??ABBCDEFFC!%%&'b*,,-..0123456789A:;==>?@ABBCDEFB $$%%șD*+,,--//011234557889:;;<=>?@@BBCDEB $8%,)++,,-.//0334566889::;<=>?BBCDA ##$$վ ABBCA#"#$ @ABC>"##$$%)&&'())**,,-..0012334467789:;<==??@AB:""#$$%%&''(()*++,-./02334466799:;<<=>?@@"#$$%& '(())*+,,-.//001234557789::<==>?5!"$$%%&(())*++,--//012334556889:;;==3   !!""#$$%&''()**+,-. /0112343/;ABCDEFFGIIJJKLMNNOPPQSUUVWVWXXYZ[ZU>AABCDEFGHIIJKLLNNOOPQRSSTUUVWWXYZ[\\Z=?@ABBDEEFFHHIJJKMMNOPQQRRTVXYZZ[\Z+=>?@@BBCDEEGGHIJKKLNOQQRSSTUCWWXXYYZZ[[\\C8=>>?@AABCDEFGGIIJKLMMNOOQQRRSSTUVWWXYXYZZ[\\V7;==>BCDDEFFHHIJKLLMNNOPQQRSTTV[dnu{[X\V5;;<=զ@BBCEEFGGIIJKKMMNNOPQRRSTZhu~{{YZ[[V5::;?@ABBCDEFGHIIJJLLMNNRg{|zYYZZT389::=>?@ABCCDEFGGHIJKLLOf|y}XYXYT2789:==>?@@ACCDEFGHHIJK^zz~٢uWVWXXYT17789;<=>?@@BBCDEFFGHQqy~gSTUUVVX*S16688;;<=>?@ABCDDEFG^}|zӇRQRSSTTVXWS05577:;<<=>?@@ABDDIny}NOOPQRRSTUUVVWR/45669:;;==>?@@BCNw~zMLMNOOPQRRSTUUVVR.345589:;;=>>?@AS|{}QJKLMNOPQQRSTUVUR-2345789::;<=>?X~zrGIIJKLLNNOOQQRRSTUUQ-22346889::<==Zy~QFFGHIJKLMMNNPPQRRSTTQ,012366789:;?@ABBDDEFFHHIJKLMNNOOPQM)--./234V};<==>?@ABBDDEFGGHIJKKLMNOOQL),-./Ҟ13?|z9:;;<=>?@ABCCDEFGHIIJKLLMNOPK(,,--001k|=89:;;<=>?@@BBCEEFFHHIJJLLN(J'+,,-/0I|~Y77899;<<=>?@ABBDDEFGHHJLLMNJ'**,,/0sz556789:;;==??@ABBCDEFFGHIJKLMMI&**++-L~}:4466889:;<==>?@ABBDEEFGHHIJKKMI%))*+-ryv234557789:;;<>>?@AABDDEFFHHIJKLG$())*C}}12234467889:;<<=>?@ABCCDEFFGHIJJF$'())e{x012234566789:;<==??@ABBCDEFGGIIJF#''()}z~3/011234567789:;<<=>?@@BCCDEFFGIJE#&''(./00122344667899;<<=??@@BBCDEFGHHD"&&''{H-.//012234557789:;<<>>?@ABCDEJGGC!%&''y+,-../012234557799:;<==??@@BBCDEFGC!%&%&++,-.//01124^66789:;<==>?@AACCEEFC!$$%&]*+,--.//012234567789::<<=>?@ABCCDEA #$%%1)*+,,-..002467789::;=>>?ABDDA ##$$ݻ쌀ABBD@"##$ @ABB>""#$&'(()**+,-./0122345567899;;<=>?@@B:")##$$%%&'(())*++,--./012244556889:;<<>>?@@!"#"#$%%&&''))**++-/00123345667899;;<=??5)!""##$$%&&''())**+,-..0011334557789::;<<2 ! !!"#$$%%&&''(()++,,-../0012344/il32 ?BCEFGHIJLLNOPQRSUVWWXYZZ\][vBCDEGGIKKMNOPQRTUW~Z[\:;=?@BCDEFHJJLMNOPQl;ZZ[8:;>?@BCEEGHJKLMNoXYZ78:<=?@BCDEFHIJ_ɚ;WXZ688;=>?ABCDEGH~{~WXY567:;=>?@ACDNя|}VWX4569:;<=?ABX{~~rdZTUV23479:;<=?d⑀~|zdRPQRTTV233688:<<`ֆz|dNMNOPRSSU0125679:QуzqOIJLLNOQRSS.013567=؃zaEGHIKKMNOPQR./02456懀z}VCDFGHIKLLNOPQ-./24hx~S@BCDFGHIKKMNOP+,-014zT>?@ACDEFHJJKLNO*,-/0~~a;==?ABCEEGHJJKMN*+,.2ws;:;<>?AACDFFHIJKM))*,p|G88:;<>?@BCDEGHIJK'(),vi5778:<<>?@BCDEG HIJ''):G45688:;=>?@ACDEFHI&''uӀvt1244678:;=>?@ACEEFH$%&wZ02245679:;<>?@BCDFG$$&~D/02244678:;=>?@BCDE#$%4-/0335679:;==?ACD"#$B@BC!##$%%'()*+,,./012456799;<=?A?"##$%&''))*,--/01245689:;==?5!##$$&&(()++-..022456799;:2>BCDEGHIJKLNOPQSSTUWWXYZ[\\[vBCDEGHIJKMNOPRRSTValv|Z[[9<=?@BCDFGHIJKMNOPRYl{YZ[8:;>?@ACDEFHIKLMNXqXZZ78:<>?ABCDEFHIJQm?@BCDHm弝VVW3569:;=>?ABJt崙o\TUW24478:;<=?LypTPRSTTV124678:;=Izख़oOMNPPQRSU0124678:CxќRIJLMNPQQRS/013567;r™mFFHIJKMNOPRS./02357^^CDFGHIKLMNOPQ,-/33G~~˙[@BBDEGHIKLMNOP+--013s㛙^>?AACDEGHIJLMNO*,-/0Np<<>?@BCDFGHJKLMN*+,./uÙ<:;<>?@BCEEFHIKKM()*,GN789;=>?@BCDFFHIJL()),h™{4678:;=>?AACDEGHJK&')0~M35688:;=>?@BCDEGHJ&&'Gۙ1334679:;=>?@BCEEFH%%'\h01245679:;<=?ABCDEG$%&nK.01245679:;<>?@B'CDF#$%{6./0235689:;<>?BCD"#$'@AB!#$$%&&'()*,,-.01234679:;==?@?""$&'())+,-./01244679:;=>?6!"#$%%&')*++,./012456799;;2?ACDEGHIJLMNOQQRSUVWXXZ\][v;?@ACDFGHIJLMNOQQSSUUVXXYZ[[]Z;>?@BCDFFHIKLMNOQRRSTUVXYYZ[\[;<>BCDFFHIKLLNOPQRTUValv}Z[\:;?AACEEGHJJKLNXq|z~XZZ78:=>?@BCDFGHJJQm~y~WYY679;<>?@BCDFGH_|~yVWX578:;=>?@ACDHmxVWW4569:<==?ABJt|{˗jTUV34578:;<>?Lyy~ZPQRTTV124679:<=IzyQMNOPQRSU0234679:Bxy`JJLMNOQRSS/024567;ryGJKLMNOPQR-/02456^zBDEFHIJLMNOPR-./23G~}~z@BCDFFHIKLMNPP+,.014rz>?@ACDEFHIJLMNO*,,/0Nz~;<>?@ACDEGHIKKMN)+,-0u}?:;<=?@BBDFGHIKLM)**,Gy~f78:;<>?@BCDFFHJJL((*,g{5679:;<>?ABCDEGGIJ&((1~~~i35689:;=>O?@BCDEGHI&&(Gu2235678:<==?@BCDEFH$%'\x01244689:;<>?@BCDEF$%%ng/01244689:;<=?@BCDE#$%{=./0245679:;<>?BCD"#$B@BC!"#$%&''))*+-./01335688:;<=?@?!##$$&&'()++,..01344689:;=>?6 "#$%&&(()++,-.01245689:;:2is32?BDGIKMOQSVWYZ\]>#oo# $JǕS$ !#%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%#!  h8mk  RvyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyvR TUTTVV}\] cc ff"ee"  l8mkSSUU bbees8mk..88DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/DisplayCAL-curve-viewer.ico0000644000076500000000000043463313230230667024721 0ustar devwheel00000000000000 v ( @@ (B300 %[   + h35PNG  IHDR\rf\IDATxw]u'C IE`@`A8.IxN18_2M&'8IOD ئ"@ DGtz~{ʾw/{ګ|W:p8?Gq;(ǁ88p8~ q>(ǁ8VXʗN)(,._ͥg\k3zlwعwl @t:lӜPEۺk5UkBT$R^}SC}w7`}8oy%WS)?'pFn, P|w%ip0|sAM\#Fb`/sb|Ԃ(1F@PhB4sfH79:,IZH`, 4IU6H>$5s+ו_T>t .O*;o\9/ +&IBK%Q:mh\3ep*mQC6Y6sSLSDP1R|oO^0O)ۚ,==h)h:P\R, }Z (qD5@4@ nΘ{&ѐz3!Z)l1LHSQ/.8FRa*`j3iU&4FBY>ψ0uG ȠBa\eRI!Hdz(!pSZc.< .2׵*(/%TrAa!hHlkХ<7if! Nߕ`o'z]{޹sfӒ -SI j \( ڼWChTX~s@L X(qia=(%2.P jhB6(5ҙ|3%DvzofC+GFP 8=FVxϖh>7|Uk-T x;XIבA[Š.Ќ hDY;A_nbuD&ӵn!%mb80eQ절W8R2ι) vH꩜O|6H N ϙ*).`e_}Q]>@K~#5 ,(CjRZXl0!Ep,S`67_ҨA{ Cm`홖d +9"RnEgn{D~%p<# rVG8a(=1 ,Apmk Q\W lˏ.`׀s]?y<&'#|pr& Mk)h^t@w|2! q=77J׭;k"3vRV7 WR^#+HH'9iR#B)_½a^\JuI,Y؃:薲 b'׊K e ν Ņ4@ - (x!1@#Q٧wSmr,T]QV|,!f;&=yB#dP >'mJhh mYqmM4UmػwիWJ</Z4aȑNm<nmx`p&g'K%Ij[foXd:BEP R3҆'LApݷIk;@2i0WB m6"iB' kXS|!Bt_OD@^f ׁل(^X{e_r1,0mڴpm9?lZCCtYAI'BLBKNAo!%)،6t2FF= J*Ǩt :'„@Zh,xQ\Lɳ1d5M + ;s93S9@ce3 ,2-p2PJ"o?#y\84-[[hFBm`r MR4ruE\(dqpSPV ^G+VCm ʧl$!6Z@XGD;8(JVN+@+)S!?~`' @`E}9dTV \ EPj\wc ,Ydn8(h`D(žeȠ` :5e<+?>IJ^ i8#ՂBc<(N286GIY9W"04 2 lځU'\,'YhO ^䱂CbZ^a&S:Kʊ Q!kCMD4!Zn c|},}P,nE!יA5ڇD+(l?^vFT 걤 Dh$?)v籇pwEJ:~bzA+@[D%PM/GX1=ʫοK,@RT|&XD%)jEmIsŌ TX76>݉Ș>Ⱥg^|O(|!ጶ"16;I=6ʶ>KyFrmp<*\E˝/xj3ɰ^ |;֘$FUMr~Vf?nܓEQY1"/M02-rRqRM!b0D6ШP^Soޡ52 '}]ԒpQ`e@ 4+DC)[[d6/6Y;)FCf MkqLLкD:_#O7υqvPȔ[o~u.@ `ɒſ_d':fgw .kA`QEo8(fG{(ɚj*@4Ps 5!m;켤GסxF+08O 9+H2ѐJ@}-MijUiȨ8nS@>bF̣`[e_@CYvK@QQ;hiBWeU79: }Ҿ$;&뗫IjMr(L᧢BӖh·.0TQQ,90ŲB)+g.#=zueĜ=E,h^M?i@!oq򫯾:(n 9{1Gv)$&[['`=Yu* ak_BPcE rfGLsW3`(ruEU b"*d-wPbڵg׊K.dڀN >x+ϰPIfH6O֬D[jy'G1g!Ȟ6{-RQGeDs.k2wd!Y,$= 1t@l78%r`KGďh" %w+ā)@Ѵ\jT+, FXdse/ oEXOONE2$X_n@W5&F'4($Lk QB3U N022wHc$e s@BUnFoIPkE,4& FBzVj0c*!!m.r\x kH 4x h0wK}邕RzPs9g̘13 rv~s8/TCi%PM?r jDRܹwo&duA3: "3gf]5iQsDcbAtY4I<|%RFP V©2%9oO 8Brm۷O+Q7`:h_(|du"P Fi20; 7Dy p;ݞԹq$Ч-0C)P4 1W_ϭHdS؄j\\8K]\ޅz7C4Ά0E&,LjDuۻW_tVYd5bEv@EedɺжYǂ%b!+R Z^2Pĉru5o 7;dGU+ M*[ks)o7+Qx˛Qv5Pz1 D0P#1/~#gQ+ {!GK_zL>oYzWNRE_¯p UkHoz9iɁjRszc q >wA P8(F6VD# 9,$Eۤܭtd\K*A7(C`GBDIAv!X[oؑ#QQ#踑Fx91]lSRAwժU.C7 Z.x埓&#ͭ·6Xn0C@nXQ*#1zY+$"nTuXt,N?l`^'CilU8 uE'jRig4B_9x7<*<ʤ< I,R$H'0.\Rp3](Efi66=[5z뭷@>XkK# "B x䐅;=$*`34) ,&Sg\8=*]X#]$fqmqFDɘֳD$ɬ]-H?Ci!#FQ)Hd64TE W,dTIBo˜, rRMd@[|忾O*P3? ѳ{Ü =pB lN1"\c \cbĿ |\MdHժ#ʿOJ] !2QDo]dG N ((C7M {S @Hm gҠT<I5а?X_Ӎ"qeg+DEDAnpZP/PuEOe4jؑj^9c7pl WOېO=Rpa-~0p}lɽMU"GHi:6FRfOBa+( lۑk&l$a? ́)[M Q %{PbNJ|ɦGӹ&#Gw_ꔗ'z^X[nJq${)ȏS1}fmr'CB9~~H#e`紿  1 D~,?4X(Phg btd`MnD ړCkmG;fT">b0ֶ[EN8+ӻu+~S)ϝBAǰ` mүVE.[oHz_UquzxeWnBH6S?!`a^C)&f7v)'O'Xо">4фTIn_(Zտ!P+N:䎐 1_m)P*;0(WyHɖvA㦔hųVRVԮ-sNU(9:5$IhYvb)%fU)e(ӇN(1v,}#iaW~g~)IP+I'ipUR(kb_1i`ZH[ lٲdYlLhŒ$iE2ңn٬w(De20TO'ġiffI@|F'~xKۿycg=Z }mcçpӏICfERL7vsUمKcZB (jh"Vvn"$qm`tT A$?]{؈RB utܺs֗vLߚڱ)Jp˖.%#Y %ቀwfc]+cS âh¸_p\ߕzUcIj15sl2&Yf"J;#t#=ˇfr19 J_lGH{\_+Z_yO)fĆR$9CQ..2߳C [,+`, ў&F8p IIqFDEҴ_COw>wJpWYcfߋg$z)6Si~p1%g*yr\V p`m\I5,XO8`slIT!i+fj"pE^(%\Õӯw Hx$uR`i/O,~??zv-/[־ t*ϔBKT>]ȑU ?tlƊ9{POut~_+&Ɂ$ۮB*Ϯl!3^EnNnZ:PG9L)}>:s\oPyG7Kt 䱷d(R~| Ѣpc ƕx9W.8F+>Mzc(K,AJ(!h=ҭЂB!uEK!Q"~KDl 5āidN# 7DͅSKs'_Bè*ֹk!KUIT<9']ОSwEfL/([>q(wI.5h] `TmEp,]`$K52{On5&ar4-ᒷA[*H f"mJ4)w ?h##};z }hGdKtNԐWO)D۩~ii֧靭ЮҮmо} g<8&e@H yf%# u]KJwx'MImB8L͖͖ynAb@e%R2ޅ9}1>Y9Vp'KmIzl@3K2h}n\l[6?J;~vn{EnV^k[?KWZRު@.@,@0+8maBY,BAmx=k}ˮ 2׀rEEwPyGUZaVzZ_9~XMG{n2*i o6ھymKwlyFy{58u^b-۱ou`޼hZmg$<3V<C32$3M=ꀀ\ jFL͎q5e>!  c334JI'Icp(,s]G־ 3_~OҶ7жR)b_-RvA1)%oxQgue^y:Lbw3OWH((Y(DŸ.𼝕f<8>b}q-ԻGfD)*@l BxI$atP "ѾzѣKϟ0M?s=r+3gՂ)ga6w{K෾vO)imvPGWx˴@eL#rDS[*h(HA1= IOr R#Y`R.va# QbS󠖅ٯ. I Zky(OrWӗc)ĜPM;ܣLylYnF&5 ɢ _Qx[>e]xUбc1%UfuwG9>≭Pr]r]Kq+~4*.$zkHm-}-/J[_{鐐W?jRC> 'x_u]̝7(92b`\#wq8xbSYHz.MNYN 耂-YabR4XQC='<~SZeC=Z{Kd~2KQ>6Gջع9ڼRo/-6ccR~0,KlMVE?0CVmE=*- e˜zy)wjP*9h: 9zY_6ljc;B@rlb$Ҋ\; :F}!!B-qR^''O8aX65W֏1@(6E{ 8fҋre/"2MP0-Z tرF'cKT!z!?*JK/.f عzoUO6JQ 4 21HB; ƝP̎ʬ +sӦfsIwxJEdmCh4Jypkfo٭c7(a ?Z oj&V|ĉC/"{Qůޖ žR+kGArX! PA$/ ~9Nݛ\v ؑzvJwKZIv~UߥEbb0@|v-\h+XeK%PZƯ{A .jj ҽ2_Y_/{T)DA{q+ѹTwD9Ă'#DO6Q-}b:[ñk3Wnb.9tގ-էT h>,!)oLodHڙ@@.Qb掤=JEmZMiȨ.Z'`P$6QE:&P]`-hkHnpl_'B8Y|K:^́KQgbE5 kג#_4⪽j5ډT{hhkJN^ 1伧CsBv]v!JX"T1|mb6i*/ `"܅ E惒w+r"Rւrː/XnpbNPo S臏ڒ߼E=8"zʳ[W7^B۷l BWYLA~ ;2lx"ɉ1\cs4d&,SK6#gXhhFh Χ>gzBON ۭW#MH[A(ǏVB{D~gXG=.%uXGAGld 3seU&Y Wn"gymDQj>Ui`|06+H~d JpŒ$b;+Ct5%+b,(i<(ت^fW}X:jȃqїN>yH*w˹Dw,?==.Vd0[UϤnAQJ+dí)i Ί.nQ |d0Y's{sUSb/^T**˛ r^OuЕeo=3Q[!+O =h}W=4]Wxsl9;~pmi/{}9{sC0؄S+aMetJDžN5@,5^(GO)P`Dy.h5XP |{dT|P[:JIOyx1BbfqgܚH.Rl2v,}ud:iݶˆŃU!0mzh--ڴJ b(9Qq Ng0,m]F~=G=S}w_tq_$jPk:eqT _v-@XoZiU4J'7$6^i?N$<=Ws4!@tljO׏ȣJUVpR x;5#HͣW<.}r@oFFGc>L}ɠj\tŽ)ٳg_ia1~B*όKZ56j,K#Q]*̈́z_ ̞j/:>rжYN]3U{N/l5 xq%RRӻ\? #lYAmdBx/X.s8 (VYLlZO~Cisjw[1ͧ xϮ-oFr! 9oNjF_`P4R[q.uGmKQhNq D]# y}PwdzOZ5# f cE2h.Qcۂ ~_?;?9Bvtڴ]M:rjt)'RGkKývZ׏p*nW^xiߞJh0Z4 rSJa;L\od|oK8#?L=X*\%mɃֺ>?;;j.7pܣ\0 fd~\nL-A.$)rM&jĈ5[Z6*.Oz;~w1=_Ҷ608̐ %y\VR%Hw_) 瘇w#<[ h@>i-Nkpܿ-Zc]' N>. ƽh'-| y%a&D=>e :UZij{U?Fik~}^|_鵧+mO&% cPl82ιioT}qϋe'3`XzI *JpI `lZHLJsHBZX`c Ȝ `%QAAvMk?W)GvJxC>-?:y"*y R&$~-/2XϢ/efY*P*PQ=PUؗdUOMa>(Yfݾ"䎰v=,o3cSPXW8`2$X5 q>PW|5=Yx[guqOwfոU5$zt,ݳnp*gC%1^)տ)e[87BKd'黙 yWZu{HiKM%P { j̟o%B万#PDOtx<ؙЃsE(01/Saƙn'/MT2wnQ}gOm'plͽ}ilzTݡ[^zJY/4ɞwЉp&im!Sբ(k' (RoM ]T0J bAsI]˶p=/hڴ*4i4O٣FNvGs>+ӫUftu;'Z}C9̷U"WA FI; {y֗mH ec TׇH$*^˷HE v,`p^.2(TA[ X[wT55SI DqqjP9Y/!A3CFOuM΃0}Un o{ z?[_t+K DbDE\@wAno)7[p-,I4jw}os[!Msz`L /f *1vuIAI}̟7r/ҊVrL~ZAtA 1ɺv4[wԘQN:ǿpU&z}(=>j: @RX! V9sF8xYPUs3NP '^J_^&F˜űɊG5JXQS^ri@nQ媶"YxP=Q)0b6)1Ƕ`9dj3y`k-ι\LhT{tVֽ8hu)ۇmQq'Kq?y>e>"Y2{kx-LL8mb?_i㫛/ ZD?qa "P,_ePï8AIMip_Qx'(埻BHsx 584mFpI?6)}X ,Rd[VKS7К1>8Ϥ( [UV,ҦHH׎L>3h|sQlⶏah;~5HOhke .c@V}x_n#BZt|9];Kl!%8(^9 RQvV[J/3)̡e@}Qzg(VM- ;:)"_ǙI)>PcT!/}ߣЫOU`4Vc8s[bYxa"b.SFkqH;8 tDkBT*?Q̘1c05'873;F̝ǖ͢ GLFYrrb-Jl{Q$ Qٳ+-Rڱ>3O\N=e&+t/)*#`"hH*$ D-NK6@7I :{ض̲PKy4sAb3H_!'DK +FoH!ÁWXs%@574(bYAQZ?9+>Qᯂ~]U|]?ןiOc4>Px3=dSA ű*3`z>!IHQ̯$atB gWpJ<^lyq3'њfT ;_sΓm&Vb);m,ER{$j:t6qg͢ ]..v'fPqG_o=I)װ4()&+ME9qrFZSlC2}M{ 1hWUʸ &'%~)Fv d?cWȓ+3x-4h}F5$tބZSf[/>|҉cn GںO==}8#zpyPﯧg[BaJ-*^{ ڔ^UOd2Vͻ9o̮AiOo:o#{ 蔣t5Re]Xè81;z4T1w19hMPehOluԷb7_8o̙CuQS}?{ԎG1@m&z|v+OطWEiru\`aOhk ?,|RPbfR^5]8G)$=M IN ye"@sySkfOmߺ#_^K2DdY_UɄ?IY Zc?%&1ȘIIbL1}z h `9$E@T1/yԛm>J`qik?r4i|z] 'uy`* t-}{w҆{Nol]!r;(I6{:nV ې? 'X E=0(8r Ðlh-ɃA:>(D*Q.O}IHLWhS_m`pL}D{+ϖGUR[=wnwdmi& a:Iˈ3^ )E3w5|@ 5 ?BmԨҦ1* "@zLl j_dg=9b[/1'_ IkTGx㛪iZE=Oxp*<> Ѯn(JXJ6H7.]SK]6݂ c_="=\Ms߶%!dV5AAbOOY`RC0M3y15c,@Qk@qP3Lϯy&xxUE>UƫcQt)o˫k۾J{P>.Q}"jced^`8TGDT( d/P,ۤD{ /' ./V(_RMt<^Q}xqĢ.Tg *rlڬOI k4 )/9/ʱ\Dv>6[ ~D{>dRY喹n'_In & Yn1/(bY XJ\<`SR- PV 5IE.] HLEͩ/f<J̙&Do N0'L.B#@ AƑj7oNm㏧>iImw`AOMgϹ:a}}st3 $BBR@TZ*x :ZyD.`uV3?l֬Vݾm{!|G[wIC%V[-Kk,"&5 mh K+x;Sva*W|$ꊧR'hi@HnI#l؇VӐ0vf6=fA)=]A|Pf_0VsAxOnEB ̌l^E[Y t.cRRٸcf湜ozM?2.ʠy51*pE cX?IdKB0[o>Ny_is#ve=v?=wc1w>zުS}mzx ?;ID*Kȅ9g?mRd_u|@~.uf՘ fی2 SSn*><s_zL:u0!<"|W)C+YpQRœ&;e#jKTmžxitxOu+q' u^}jN=rJ`N4k[h@^+q=PbW[s-"TIZ۩ltA&ÖP;pWD 93I~f#ѴQAkT `,(OI jkaPLxB!23.\c_O%otLZ?ō?MpPeĐ"F[ 8 \#K8tƎ S$^! ݦ\yy82!@6(Xi!xX-夢#uwpӻ6u0-&"7%j fm4#Vi!D+̃|\{d=CΦ ]=n%=oBClө- {#LZM$_<#l f+QqsEN2.aBoRRgP@tdDum4|XDLKk1IA]mAbUd5d,dϟv*}{>Cob%/=y==v'cʡrA$ Pݮ0x_Z<$A3Y{ʘj RF %rb@5#@ȕd@<'^E*j\W^ye@ eD)a87Ug&8o}D 4e hD} ]|֮>p;=roCRx-B0 Q礢#Gj$Qu]~WB.MZ_;JA7!"Fp^ EGj:Py);)jD@ZAhU篼 hM%HHiq3Չ݀gd*W_p:C8PJU;U҃7|U)r,2TXZob:y1)zI}֮gx$cq3}"(3rBc؆=A9gb&8!XD=M# r@@6.iZ;!VC=@wc ;c}ڿugϯŞ.߱uiAi`Zu;IRHU٠DQ1dE57\Sr a \KpEZPZFxrSѢ"ݱ+1p9 (z Si.:\i5=DՃDC0,Uw?}_mI-?8F~|>,ɥpN*8oC/I]]A >%rxJeVw80\vL* 靍M-Hh?KDž?l#"#Rh(g$TL<#=Mo d9chҥS~b{ Ѿ|o #&˙;I.FԤYA$b /ƷĊR/O }:œ#ENI) 3ނRB[L M(éD,G(IFv\k…߇tm!"B={lwU9Nv_j9k i!Aڸ2q>!OtƪB?' y\~ ^2 3ڒ % dneNK#A`M+WI$ QH2=4(0̶T"cmMq$9i"}mtt\Dwj;'ul:rz?TN 7-¿ cYoIªutX3dY JȫA4xv< 2cKDH@l zFUDHԁ nx Гw4hN3`hR:ç=˿1n~Az߿R>B\1ŽX$ZYDH^CY}NK@\E`sOm4C_''9R@Beix,;'4.hf&L౾"18 Q+ȏ +P*1?7uX}<_}hGݹ_:G~;Fw]ڳsd3ر5dJH]gFnx&on{wsPv .7F([Js1[jco*h W?wU `ʠ˾*|]d:k0c V xBr5ِ# ֗?4q"nQ?W|v_,D€z]}:xH? d yCIL*ߓm9V SJdb[ay`\!G$*Yj!͚ݍ ʧcp|LGguʫzTSḼjkKjJI9&es\r;tsQQh?FcO6^hĂ|$sY%(+Ct=ZOt0Bw831'N pCӆ]o<|> <&DgRt-r]ճ\B[3hza3fPZ`4+o%mN57|mtIzP.# ͱkK{Iu(C lth)DCο%U4Wfy˚KnkNU|!`+=eXD^T(굪H k!Jub EezF[$@z23f9#.>>K> "+|ַYڿoʇrm@F kA*l-BKvddb EkkʖDqSÃ+P#E 00/)r+~1ʛ+~(tgf))_&JD%"(KgwVʤ"'-^SBorQ>5KcׂE-'ӈG -$)Nc\ wB@HrZmݶ꫅N{Wt1E=btJQyjkR AG: 2CkOBpwpك$~W+r< e4?yW҄tرtu-Ik'Rqt{᛿*:'b&\} *NevNSMZ WqZH /=ھ#ܑ?gEu tĞBrd6kD=>17A{bIp6#U!P_\$+UOgb&Ga|bZ]"DΡ~ gO%OLuI@4a&ў;$3@C ~OS VX*Cga%M4 `{ na rEAmZDƠE'"q ͫ0 &MXV$xGģӣ@Eb;飚I`Y,?zQ7.vus. څs֫k jғ.@oZ I#HD6XL*0͋j=ZMMAE<))h#iMJ`'y)JEԧt Ncb[JvRר 쳫:"A4qkLDbxނ"0rK.'O釿I+$IKJKpIyĨ&}C0kf9v9O9'bU F)4, 9 ezޅ1@rUO/IA\25v!#ZL[_P7ךY3&otauW|Pq_ct_lUQ!&ܮjTؖ?u><w:TG ?/.8vh,{=(@ Y"`l~͍z+`rUL)] #7R8<]^n'}vw4nd杇IW}tXu~)XVPxW`2R|='^V9e8xT>$9]ۆKET>&͓;$JEb S[JF@> 68=ΥF҅3}@g"~G&&%x"H"/PΙB;4jw<=肟G*EφAO?Mѡ\{4^BKn3>+֪ wWExz3@N6Վ2_W Ztx{[ pDedHѨΙGE&СJ7Jk]"\%M ]''GWXAzO{(j{VuƿZs5_b>PfӚPnŃʒu1lA|Ξwo"QNzAIU' lI SXV|UEVzgHR0Z="pȿ hXѿqM?Ġnƪ@>rZL6ݶCpJۣq|oOO;NG%w\y|sUHI^UY }c NaZBlfn3Jpmo < pMU"-Qg\IMpP/tTwُ۰N%r肳`R8A}^805n 2~Tt0?{rߟ:=* <:Ov=M!hq ڍ&Q"JnD\v Lj̛WD!jADJ%ٍ1ZBw+vf0K=2ug*4q I<}u.YU HP$YfmF-#.C3Ž'zh u:>O^*zI‰)Tgܶhxr-rkқDr  atf\{k St7zVSـf1:kг8 ^ʾ0 V>},;O|~>%k'/?٣ U|t2O}N"Hs8MZt0F[ (YSpq?vD6'7h]-" msۦy.>4I>5H(zJsdBsXj Cj/ @khAY֮ `ڴiIgӑ.Y>yljNk{Kכ|у7}U 3AIpI:~ DӁ8cw1GLSp\<8 4JŮ*eAH])@#H `DWv8X1P<%е}Q 2nF$јSV8Nc"jwrߞf:ػ{;tOoqb$ؠ LXk艷hHo6^IHз.x-;8>/'6x6wdKlZ]mڂ'^cg r 08/VO2USErUj.So՟&z݊J.ٵb?c.D²JkOb?!؝@>2b"rHL<:4H# FBe7zM݁HDG ռY(JMSMd;4js2QnW@F=h*`RVԜ4.=X˅l:]~k+>S r&G %MGD`5̷%wCsO 9-kVNUn\t$ˈujVICQM Υ,o "Ez E`.9]? '0RC!k j(0u4Qk$ӰkQ7-|v 3,cf D،QSӤGM}Sj\YSSDY\% Rn9Nգ'~!Y^vy"CSKvQ`LP0obB}>: ŭV` /f4)kw)dmZ0DG ;/?U?"s%",3+@y~ 0m#2&LUGK &A 1"AD <W8@N:`<"ފa7N´\w] 34`38 H1GuC?]ʟ"z67T_]L?g?WS~`wmFz4cӛtDF LTq)m9rP#y8F&Ud,!V {02xSktSGR%tg2Pt$9`1x&pHiX D e)xL vxo{l<~]@ 襉D(!GTc=查 UDqtO#CFqdRbzxܐ[l0Uv',E  jrrK /Bwψ)"୾_8nVi00 t? λ`H?C#UHns Ԥt/цv~Ӑ;ޠݻ։|;( Rk>4\&D< TPiS SJԱI0hHK g SPRsj 벁{Nt5? )ЧXxOFH .)w 5$ju8s˄Q}F/fGZ?uzvrv_ƥ!1&# rF=ܷ+Hm\&k0;AA [k/c!*+nN_kc)fdX6$5u`N3~: ] yKI0~(9;D0)NJ;qT %['%Nf騄<{;@1:5NPZYPn1Eg3E$fW3Z˛1*јH x_.?njܱ?-e{_|KEmz[b)}W㢽WL`/Yf.L+ Bz7`l?u߀m9p_PA,Ɏt1cTTonZ }Ov1T8fWlPT#0c `qz,u>tIͣvM+n]jU1_ni}5zXY7#J>k)t֪[+sQSDAćnM7O]:G0Yf Z N`:N@HpاHLüg\rHTLSXkV_^8"L"Ws2uT~#j{?Oŝ#ZsǯI0vqjr3+~}$. {7*|}dy0R8]k-iEd,IadJNQ$uuBIY+(>KM 9 (c_'セ NwQo_N+)b2Ys eo_@_67T{_+Do_9X]c&}lnC]ז/O!ik~9|}x"LFX)r jW&FA =b=}8ACr!Q4}a^'D̓fqLqA2f͢ts]e(&j&EN3Ya[Md(PZ'iD ,7 ,jt[l%a4)X*%јn$a"V)MCD*ٸW])ZjV`:A!RYerL9Gi/7b$}#{y={JE?U?o^0gj]M0}(WԡnӔwRk=q_Ǻr@Jn-H2|~iC1Hf鐑wԵhB|OTq(H[>l)I߿,$5Zx}QlJ3U=낾NwIA@8 'OBJþW~O{_iSj?'HXi%9EWdtMȐe<1\w|N?VdaI¡ez+F͍y 0 1_KD#] D4|yBZh&(Mk\bEkOzH۝M'~C= +?5Qdlswa}4ʲI} ^Uu\'OX$+ * mRzG}^UZnG1U, E$$"&!4$'>h@1HB8'k~99mكC^k>9s}T@֭r&VPFp9ƬTQ ;xMC>(*\=S8\CtteJUz&pdtEuZ8!Xޅ=]"ݿm6 =$ u T}v};?= @4Z2RRbDc~жgy #SA,iB9 ^W3'B_" ~pN& 3y)~ 'ڰCׇhèrJKk=!vKaWu-m! <[/{)mAO:S'Qt)U~gSqv&6IV'ċ *3]<`z*%?@%OP 4x5(FP]\u0Ϋgzm4,j,ȁ22@LzyWIk.#2.-S LW\A/Q.}l?T>zUtϪu${͖B=Ek&%dcks(:<ׂH?"BqwF+jQ @v['?U[wh gͷwr :ʨp[z۵IZp߶@l:Ac Zz.[l9\j>Z>D=)0gW]DW޶;0wouwuY^g]fl1e:“_KI`[%$RߡbrrZSk.|]3JMZU%lC-_?miljXzjwҿ)0npnt7G =8m:'G?]`D>}g𦐘jQ]j=^gϋ/Q 93@ dV+ Z7$śt>be_xGƅDž dq~_?"h} ~ 1Re%Oal1gI|uԽU׳'1ꭿ^N##j"%jV`&SwMd9{yJ>BetL 99|+E8h@ <^ДBý@EMxF4jkE#ϑ9gB?.'z"Fnn L@5KMtQQ.yC[D!*'P PԍsBg<+=2Z mϕ+S& R!0@ mצ)>Uzk󱃕lᮿNhשK_RJgm|V4\{˗O0*WxZ#DuDB;o{`DyN>64u\Sc^X7оC!YA8ŹǨEcФVL `Th$YQcq+Rx~!0"c}}'myqyךMGy"BaR DG Z6np9C{k&pvݶ}`ן~:˻ގ瓻7!Lf LJYaNNE\0rАND҆/# $u]j|,nFX DH,@ 36$QG> 4})]Sr㢜/-99X>19xaw@q̻>yůJ%{|ԏ~7]ǦD^BcU^0" E^``\n9*\鲘Yx%tVgA2h>P9(zҟ脓i6FC`ba=PڪHr%G:j!9JGjU2N,\ U?w@3;z}2u#,tԉ?1*QDz9XOvuש$Kn ʱ8a\(^6JŮyQ"i@H<.'w\ < 5F˗@(I 7j=t.׾z|(oUMQ:ŝc|wU#s)dYڞT`7PSRHfo )XV5JA$!gaO}@Al|b6`~SBΆa\4VTdJSDAIQH{E*7s[b0[\Hcvf,\0[zE}}T>zuqӻU$Bt&ѐ(M7#fh7 5\"Z/#FKsKBs(ljJ(@3_~)e9ؠ%w7Y{D9_4CE.zp`wІ+;~)ѭ]T}uM?}VZ 2Sh|@A!q<`'uX P& rK+Ocw,{J x-paD3]#sBۣx]Aϱي iC<C kl_l>8Ψ@}SOO]r uD[_9C]GsI(-bE 3 c@Cr+a݊+gxiYJT.6/!_A_\޺{v&>ի_#(Meb:i0j JMýzT 5$y%‡|YCG$GS6PC'رh(,EibW.Dq4 4pgfrTz``2L,;(vTbx{Y͗a H14PY+Cb@ C;6ȽT0 {!+QS(V #mWaA}Adxs%%,q<K"2gjN_Dw^ +})틩@Dm\H-P\"mUv*ࢽ#L؅=`%[KJĒRLsQH,nq19H<<xt mbPa0F .$_XRA&_6V+' H)Lڟl/x%/&:74w|=z3GHp^k#iW p8LbF=uٰ|Qm TmNTK ʆT|LwXK a"r]bWy^Z%{dW2>7  I H/LQ;/"rۮ.-u?Dt_b~Wߠ#e|Ok+Hl[Z:D=s73s&89OZBfR!!]{0l]'^<;CVrs(?o>786P-qGb~ ˷VQk~y4 HY^|!H \yr0UE'uAtQ6v&Z]jN\!|O8N]sNJo1O]'uA(qvG\X- 0Jg+n2lα.W<ٟ,'B9VF*@ QM$#(3aߙm-} (ZJycJTMayYfV (lh.yFBdɍYm~۶0BoH{vTI+tY%yP DTWZ=@{(ȭ)4__s`N !#noj62Q|UDR("bXiHNFXeK*<髽1nu&Nex5Hr y&T\6;f>ॣD(~W4RF<%W""%bb%{]8j!#xK"PARnFcꗮmzP:@A_bȄCרxT!GIxaA$X)"W9 :ZKV0t\e5\X!1Fe ;N?r@r'Ha?Y/M{v RprGK>C!dշuUG&U?bmD/Ɪ7@?xR` mS%n賕Bh%3j4 ( I=nTaDl2p<$5,$6/ɈwRpyQ95|)ը)a|ou8Vx"OjQEjR9ITNU߆l|D{gA7=?! -Mcd:#M9xrH'WPjB&lڴYMxA/v)jq2 @+'-=H>Ϭ2341ߣs8iT=N6Π)c)3le-5g u*SĶT# [o68ܛɟ}d7&O>v͚0, .PAr)I''$GE]5vb?Tطkl @`/ DUj9gٹ%X|N@a :抡9%Kd.4v^:Zh[i:TO&v @|}gcF}h=>LthF][o{VD/iL&۲8shm4|AzJBr#xC\ F"aK=klYa~k2z 1v CslAl9i&qYt3PshU#]{=kܺi{'bQ db& <>.l ٭Q<* wz[o83oY%>,Dh*N3mYO ?tAGd3g>1/\,)u`2\,>{LhV,+``T1ͣOrbs~^T mz2 H S'@s3ʖdOBP9  J#S/.D$<övkb Xec-@ss_ ܽ)>;U3g \~+qC47 NbET 3ЯP(vuUY0mTX!JOe*X4A!5FF+D\=6^jp䯓Omd@m68gySIם\X-m*'mnSCoܴiz0BGh88GN?R8]\(N@gyQ$bZo(o|Q`y?2w;{)7VNVSQ؊ȉm(svFeZp8"@,,b|z?/ i^n=ATBGß/*4&7$0:XcYt3.h t3LIoٲUy~P̟7z(P D ObgTaU$ē)(WH9(ᙔ=Y+FFLW qRV \mMEjy2\U7ȂMZlZ(MOb ՌIgxlg.Gm?p30L2/s<|]=_+N8$b-uYD\B`J"H JgՎܽB|Vy7` VN:=<;¢$\-SYIu$qz/h/W߸뮟?t3$޿ ta@Fs~t΅'W{zJX5U%+$zX숰W,oVjE{_D yW+yhqf|~Q@> Z#=BCß$,36؁ ([2g8_̇0/߳RybϞ7noER} 2u0R|AEVwo9eXzAF+vJޥrY&`C<*?i In)E!zPQV,*ԹRd12:pOR`.`F ̛7S.d+ 35DP\ m4D@P11}mxdᑯpIN@2j ZThxĆ jQ)):$|ɰl=|^.UztUFj!dk>@>OXx;+fؿc A9O>9 yHmOX"TE cWt 0W!Dus/ȅ d׮ $CVp(}Y"*J H%͟cq2k VIl1j D'J`tmg,'F|_k8~ٳQήp(0/xܓg偔ΔW%\{rGzԇY0@t`*(m)jS\on{lyrQ1Zy$ZM!KFKa9kXeAsF ȥG!ީq\ٍ| 2syBidCeS_޵k[}ǨI1X3y AFO<9_4ޤ~\ .KO^;fDeB1w){yr1Qfx\plYR:B\VZz ~W_0\ .f|O]=M@<^_0o [^SZr< ᗮ‘%-yVe+ $P_|w޽(?{~LMsS$F`qw9sxU -,ԓP*!6XWBI@6 _A Ȩ(\2D6.Tev '0,25䮓A2?{X3"14LDQ|=}XFV5ƑgI2O'%y;9H Dm÷m߾}O³S* c:N)N;Ӧw)r֑[us}XˏqX)}5etsS's䩊UXY^ILNdJZ*5mٰK,474k᝚QG~ft)ǒ:H}z'fUitpz-oSeCXy\DR4ӐgVĞ#ci\:>1lim` +Z &,( ÖRz(g8$E!R2E$.UNrƟ'yOnݺCqrVq+@# Okϧ̜9s֋NyћND}d?8J"s[w!v%$kQEX|:WH 3+D+XIx43?ΩiwkRU).sw/<Ѓ?PgQ)#o!owLsʜf̘~ԩ O.Q(Ɍ bdSanT[>"s\H`Ѕ'oƩ44+$# $ZTEaG=+MJ d[ $#jp7=ΛOᑑO?kw|.IѤ 4.}IENDB`(   !#%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%#! $J !!!""#""#"""##########$##$$#$$$#$$$$$%$$$$$$%$%%%%%%&%&&&%&&&&&&&&'&'&&'''''''''('''(''(((((()(((())))*))*)********+*****+*++++++,++,,,-,,,,,-,,--------.---..../.../..///////00000010000011111112122222222332333333343444444444555455555566666677677677777788788888899999999:99::99:::;;:::;:;:888454&&&S$ #o!! !"!"""""""""""""#"#########$$$#$$###$$$$$$$$$$$$$%%%%%%%%&%%%%&%&%&%&&&&''&&'&&'''''(''(('('(((())()())()))))))***))********++**++++++++,,,,+,,-,,-----,------...-.../.....////0/0/000/000010110101211111222222222332333344334444455454555565665665666667777777787788888889988999999::9::9;::;;;;;;;<<<;;;;<<<<<==;::000o#> "!""!!"""""""""#""##"#####"#####$####$##$#$$$$$$$$%%%%%$%%%%%%%%%%%%%&%&&&&&&'&&&&&''''(((('((((((((((()))())))))))****)*******+*+++++++++,,,,,+,,,,,,-,-------.........//....././//////00000111101111111122112222222323332334444444445445454555665666666666767777778787888888998999999999::::;::;:;;:<;;;;;<<<=<<=<<=<=====>=:;;> X!"!"!""""""""""""""""#"""########$$#$##$$#$##$$$$$$%$$$$$$%%%%%%&&%%&&&&&&&&&&&'''''''&'''''''''(((((((((()(())))))*)*****)****+*+****+++++++,,+,,,,,,--,,----,---...-.........//////0/0///0/000010011110112121112222233322333343444444444554455555565655666767777777777777888899998999999:::::::::;:;;;;<;;<<;<<;<<<<====<===>==>=>>>>>>>+++X Y!!"!!"!"!"!"""""""##"#####""###########$##$$$$$$$$%$$$%$%$%$%%%&%%&%&%&&%&&&&&''&'&''''''''''''(('((((((())))(())))))))))********++**++++*++++++++,,,,--,,----,..---..-.........//.///////0//0001000001012111122222233233233333334344444445555555556555666667667667778778878888888899999:9999:::;;::;;;;;;;;;<<<;;<<<=<<<=<====>>>>>>>???>>?>???-..Y9""!"!!"!!""""""""""""#"""#"##########$###$#$$$$$$$$$$$$$%%$%%%%%%&%&&%&&&%&&&&&&&&&''''''''((''(('((((((()(())((())))*)*)*****+****+*+++++,++,++,,,,,,,,,--,-,--.--..-....../////////0///000/000100001111111112222322232232333333444443544445555555565656666667776777877778888888999998999:99::::::;;:;;;;;;<;<<;;<<<<<<=========>>>>>>>>?>?>?????@?>?"""9!!"!!!!!""""""####"""##"#"#####$$$$#$###$$$$$%$%$%$$%%%%%%%%&%&&%&&&&&&&&&&&&'&&&&&''''''''(('(((((((()()()))))))*))*)********++++*+++++++,++,,,,,,,,,-----,---.-.-....-/..//../////00/0/0000100110111211221121322223232333333344434444445555555566656666667777777778887888888898999999:9:::::::;;:;;;;;;;;;<;<<<<=<<=======>>>>>>>>>>>>?????@?@?@?@@@>==j!""""!"""""""""""""#""###"######$#$##$##$#$$$$$$$$$%%$%%%%%%%&%&%%%&&&%&&&&'''''&''''''('''''(('(((())(()))))))))*)*)))**)***+****+++++,,++,,+++,,,,-,----,,---..-.--..../...////00/0/0/0/0000111110111112221222223223233334434334444444455455565566666667677677777877778888889889999999:9::::::;;;;;;;;;<;<;<;<<<=<<===>>====>=>>>>>>?>>>??????@@?@@@@A@@A@555j !!!!"""!!"""""#"#############$##$####$$$$$$$$$$$$%%%%%%$%$%%%%&%&&%%&&%&&&&&&&'&''&'''''''''('((((((((()())))))*)*)*)*)******+*+**++++++++,,,+,,,,,,,---------.--.-..-....//./////0////0/0000001101111112212212222333333333434333434444445555556556656666667777778788878888888999999999::::9:::::;;:;;;;;;<<<<<<<<<=<<==>==>>=>>>>>>?>?>???????@@?@@@@@@AAAAAA???G!""!"""""""""#""#""""###########$##$$$$$$$$$$%$$$$%%%%%%%%%%&%&%&%&&%&&&&'&&''''''''((''''(('(((((((())))))))*)*))*********+++++*++*,++,,+,+,,,,,,,,-,------.-...-......././///////0000000011111111121122222222232322333333443444444555455555665665666666667777787888888898999899999:99:::::::;;;;;;;;<;;<<<<<=<<<==<=======>>>>>>??>>????@??@?@@@@@A@@AAAAAAABBBB111H"""""""""#"""####"#""######$$$##$$$$$$$$$$$$$$%$%%%%%%%%%&&%%&&&&&&&&'&&&'&''''''''(''((''((((((()())())()))))**)*)*****+*++++++++,++,+,,,,,,,,,---------..--...../....///.///////00000000100111111112111232222332333343444434445444554555656566666667677777777877888899999999999:9::::;:::;:;;;;;;<<<<<<<=<====<==>=>=>>=>>>>>????>???????@?@@@@A@A@AA@AAAABABBBB<<< ! !""""#"""#"#"####"#########$$#$$$$$$$$$$$%$%%%%%%%%%%%%%%&&&&&%&'&&&&''&''&''''(''(('('('(((()(()(()))*)))))))****+***++++++++,+++,++,,,-,,,,,,---,--...-......./...////0//0/0/00000000110111111122222232223323332333443444444455555555665666666666766777787787888889999999:99:9::::;::;;:;;:<;;;<;<<;<=<<<<==<======>=>>>>>>>?>>???@@????@@@@@@AAAAAABBBABBBBACBB@@A """"""##""#""#"#"########$###$$$$$#$???@?@@@@@A@@@AAA@AAAABABBBBBBBCBBBB ""#"####"#""########$$##$$#$$$$#$$%$@?@@@@@AAAAAAAABAAABABBBBBBBBCCCCCCC "##""######"########$$##$$#$$$%$%%$%ߠоp_''((('((()((()()))))))*))***)***)***+**+*++++++,,+,+,,-,,,,,,,--,-----.-......../././/.///////00000111111122221322223332333443343444444454445555556665666667677777878878888888999999:99:::::9:::;:;;;;;;;;;;<<<<<<<<=======>=>=>>>>>?>??>????@@@A@AA@AA@AABABBABBABBBBCBCCCCCCDCC "#""""######$###$#$$$$##$$$$$$$%$$$%αсl(((('(((((()()()()))*)**)))*****+*+*++*+++++++,+,++,,,,-,-,--,-------..-......//./////////0000000001112211222222323233333443434444445554555556566656666777767777778778788989889999999:9:9::::;:;::;;;;;<<<<<<<<=<=<=====>>=>>>>>>>>>>????????@A@@A@AAABBBBABBBBBBBBBBCCCDCCCCDDDD #"#"###########$#$$$#$$$$%%$$$$$$%%%ۀz(((((((()))))))))))*)******+**+**+++++++++,++,++,,,,,,,----,---..----....//././/.//////000000000001211221222222233333334334434444444554555565666666676776777778887878888889999999::99:::::;;::;;<;;;;;<<<<<<==<========>>==>>>??>?????????@@@AAAAAAABAABABBBBBBCCCCCCCDCDCDDDDEDE "########$####$$$$$$$$$$$%%%%$%%%%%%@52())))))))))))****))*******+++++++,+++,+,++,,,,,,-,,---.-..--......./.././////0///0/000010011111121222222233333334343344444444454455556666566667666777777878888898899899999:::::9:;::;;;::;;;;<<<<<;<<<====<=====>=>=>>>>?>??>>????@?@?@@@@AAABABAABBBBBBBCCCCCCCCCCCDDDDDDDEDE ######$###$$$$$$$$$%$$$$$%$%%%%%%%%&mMD))(()))))***)*******++*+++++++++++++,++,,,,,,,----------.---......//.//////00/000000000001111121222223223333334333444444455455655655656677776767777777877888988888999999999::9::::::;;;;<;<;;<<<<<<<<<<===>==>=>>=>>>??>>?>????@?@?@@@@AAAAAABBAAAACBBCCCCCCCCCDCDCDDDDDDEDEEE ###$$###$$$$$$$$$$$$$$$%%%%%%%%%%&&%cV))())**)))*)*********+++++++++,+,,,,,,,-,-,--,-----...--....././//.//////////000000000111112211122233233333344344445455555555556556566666677677777778888889989899899:999::::;;;;:;;;;;;;;<<;<<<<=<<<====>=>>=>>>>>>>>???????@?@?@@@@A@@AAABBBBBBBBBBCCCCCCCCCCDDDDDEDDDEEEDEEE #$$$#$##$$$$%$$%$$%$$%%%%%%%%&%&&&%%ۣп}j))***))*****+*****+*+++++++,+,,,,,,,,,,,-,,-------...-.........//.//////0000000011011111112212222222322323233444444444454455555555565666676667767778787878889889989999:999:::::::;;:;;;;;<;;<;;<<<<=<<======>==>==>>>???>?????@??@@@@@@@@@@A@AAAAAABABBBBBBBCBCCCBCCCCCCCCDEDDEEEEEEEEEFEF #$#$$$$#$$$$$%$%%%%%$%%%%%%%&&&%%%&&ր|1-,******+++**+++++++,++,++,,,,,,,,,--,-----.---..-...././/.//////0//000000100111101111122122222322232333333444444444455545555556656666666767777787887888888899999:999::::9::;:;:;;;;<;;;<<<<<<========>=>==>>=>>>?>>>?>???@??@@@@@@@@@AAAA@AABABABBABBCBBBBCCCDCCDDCDCDDEEDEDEEEEEEFEEFEF #$$$$$$$$$$%$$$$%%%%%%%&&&%%&&&&&'&&^E?*)****+***+++++,+++,,,,,-,,,-,------------........//././//////0/0/0000100111011211222223222222323333334434444444555555556565566667667677777877888888889898999:9::9:::;;;;::;;;;;;;<;<<<<<<<<<=<<====>==>=>>>>>>?????????@@@@@@@@AA@@AAAAAABBABBBCBBBCCCCCCCCDCDCDDEEDDDEEEEEEEFEEFFEFFF $$$$$$%$$$$%$%$%%%%%%%&%&&&&&&&&&&&&cU+****+++++++,+,,,,,,,,,,-,,----,,--.-...-..........//////0/0/00000011111111211112222222223223332333343444454445545556555666666767677777878888888888999999:99::::9:::::::;:;;;<;;<<;;<<<<<=====>>===>=>>>>>?>??>??????@?@@@?@@A@A@AAAAABBBABABBBBBBBCCCCCDDDDDDDEDDEDEDEEEEEFEEFFFFFFFGF $$$$$$$%%%%%%%%&%%&%&&&&&%&&'&&&&'&'yyֹՃn+**+**++++,+,,,+,,,,,,---,-,--------.-....../..///////0///00000000011111111122221223333332333334343444454545555555555665666666777777877888888888898999:99:::::::::;:;;;;;;;;;<<<<<<<<<<=======>>=>>>>>??>???????????@@@@A@@A@@A@AAAABBBBBBBCCCBCCCBDCCCCDDDCDDDDDDEDDFEEFEFFFFFFFFGGGGG $%$%$%%%%%%%%%%&&&%&&&&&&&&&'''''&'&ccՀ>53++++++,,,+,+,,,--,-,,--,-.----.-.......////./////0//00000001110111121221211222322333333343443443444455555565565666666776677777788788888888999999999:::::::::;::;;;;<;;<;<<;<<<<<<<<<===>===>=>>>?>>>>???????@??@@@@@@@@AAAABABBAAABBCBBCBBCBCDDCDDCCDDDDDDEEDEEEEFEEFFEFFFFGFFFGFHGG %$$%%%%%%&%%%%%&&%&&&&&''&&''&'&&'''KL~|UK++++++,++,,,,,,,-,---.----......./.././//////00/0//0000001111111112121222223332333333334344444445544555556566666666666767777787878888898889989999::::::;;;:;;:;<;;<<<;<<<<=<<<=<=>==>>>>=>>>>>??>??????@?@@@@@@@@@AAAAAAAAAAAABBBBBBBCCCCCCCCCCDDDDDDDDEEEEEEEEEEEFFFFFFGFGFFFGGGHGH %%$%%%%&&%%&&%%&&&&&&&&'&'&'''''''''44Fzg+++,+,,,,,,-,-,,-----.----..../....///.0//0//0/0000000001011212221211222323333333344434444544544545555566666666677776777777778888998999999:99::99:9:::;;;;;;;;<<;<<;<<<<<<<<=====>>===>>>>>>>?????????@@@@@@A@AAAAAAAAAABBBBBBBBBCCBBCCCCDDCDCDDDDDDDEEEEEEEFEEFFFFFFGFFFGGGGGHHGHHG %%%&%%%%&%%%&&&&&&''&'&'''''''''''('(()ssҭ}:32,,,,-,,,-,--------.-.......////////0/0//0/000101001111111222222222223322323344443444444455454565655666766677777777877887888888889899999::::9::::;:;;;;;;;;;;;<<<<=<===<====>>>>>>>>>??>>?????????@?@@@@@@AAAA@ABAAABABABBBBBBBCCCCCCDDCDDCDDEDEDEEEEEEFFFFEFFFFFFFGFGGGGGGHHHGHHH %%%&&&&&&%&&&&&&&'''&'''''''('(''(((()(ZZ|UL----,----------.-......////./////00000000001100001111111122222222333233334344444444445555555555566666666677677778788888889888889999:999::::;:;;:;;;;;;;<<<<<<<<<<=======>=>=>>>>>???>?????@?@@@?@@?@@@A@@AAAAAABABBBBCCBCBBCCCDCCDDCDDDDEDDEDEDDEEEFEFEEEFFFFFFGGFGGGGGHHHHHHHHHH &&%&%&%&&'&&''&''&&''''''''((((''((()))>>^|i-,--------.-...........//////////000000000111111221121122222222333333334433444444545455555555665666666767777887878888898989999999::9:::;::;::;;:;;;<<<<<<<<<====<<====>=>>>>>>>>>??>???@@@?@@@@@A@AA@AAAAABBBABBBBBBBCCCBCBCCCCCCDDDDDEEDEEDDEEFEFEFFFFFFGFFFGFGGGGGGGHHHHHHHHIHI %&%&&&&&&''&'&&'''''''''(''(((('(((())(*+,xxթ~G;7--.............././///////0000000010011011111211222222222333333433344444444454555555565565666776776777777887888888899999:9::9:::9::::::;;;;<<;;<<;<<<<<=<==<====>=>>>>>>>>>?????????@??@@@A@@AA@AAAAAAABABBBBBBCCBCCCCCCCDCDCDDDDDEEEEEEEEEFFFFFFFFFGFGFGGGGGGGHGGHHHIIHIIIIII &&&&&&&&&'&&&&&''''((('((('((((())()*))*)*]]~dW-..--..../..././/./////00/00000100111111112222222223233333333333433444445454555655665666666676677778788888888888899999999::::::::;;:;;:;;;;;<<<<<<<=<<======>>>>>>>>>?>?>????????@?@@@@@@@A@AAA@AAAABBBBABBBCBCCCCCCCCCDDDDEDDEDEDEEEFEFEFEEFFFFFFGFGGHGGHGGGGHGHHHIHHIIHIIJII &&&&'&&'''''''''('''(((('(((()())(((*))**)AAdv0/..../../////.///////000000010111111211122122222323333333434344444454455555656666566666767777777778888889988999999:99:9:9::::;::;;;;;;<;<<;<=<<<<==<<=>===>=>=>>>>?>????????@@@?@@@@A@@AAAAABAAABBBBBBBBBBBBBCDCCCCDDDDDEDEDDEEEEEEEFEFEFFFFFGFGFFGGGHHHHHGHHHHHIIIIIIIIIIIJI &'''&&'&'''''(('('((((((())()((())))**)***++-vvʴoOG.///////./0///00//000010000111111112212222233332333433444434444444555566555666666666676777877887888888999999:999:9::::::;;:;:;;;;<;<;<;<<<<<===<>===>>==>>>>>>>>??????@?@@@@@@@AAA@AAAABBBBBBBBBBBBBBBCCCCCCDCDDDDDDDEDDEEEEEEEEEFFFGGFGGFGFGGGGGGGHHHGHHHHHIIHIIHIJIJIJJJJ &'&''''''''(''('('((()))((()()())*)****+*****XX~~k./..//0//0/0000000000000011111211122222322323333333344434454444555555556666766666777777877788788889889999:999:::::::::;;;;;;<;;<;<<<<<<<<<======>=>=>>>>>?????????@@???@@@@@@@A@AAA@AAABABBBBBBBCBCCCCCDDCCDDDDDDDEEEEEDEEEEFEFFEFFFGFFGFGGGGGGGHGHHHHHHHHIHIIIIIIIJJJJJKJJ &'''''''(''((('((()((()()))))))))*))+**++*++*99MпWC>//////000000000100111211122221222332323333433443443444545555555666666666666776777778888888989988999::9999:9:::::::;;;;<;<;<<;<=<=<=<=<=>==>===>>>>>>>???????????@?@@@@@@A@AAAAAABBAAABBBCBCBBCCCCCCDDDDDDDDDDEDEEEEEEFFFFEFFFFFGGGFGGGGGGHHHHHHHIHHHIHIIIIJJJJJIJJJKJKJJ '''('(('((((((()()((())())))))*))***++*++*++++++mm~rb/0/000000101101111111121222222222223333333334443444554554556556666666676776777777788888998999999999999:::;::;:;;;;<;;;;<;<<<<<=====<==>=>=>>>>>>>>>>????????@@?@@@@@@@AAAAAAAAAAABBBBBCBCCCCCCCCCDDCDCDDDDDDEEEFEFEEFEFEGFFGFFFGFGGGGHHHHGHHGHHHHIHIHIIIIIIJJJJJJJKJJJKK '''((''''(((()((()))))))))))**)*)***+++++++,+++,MM߳}E:8000011110101111211122222222322333333444444444444555555556666666677776777877787888998889999999::::9:::;:::;;;;;;<<;<<;<<=<=<<========>>>>>>>>>??>?????@@??@@@@@@A@@AAAAABBBABBBCBBBCCCCCCCCCCCDCDDDDDDDEEEEEEEFFFEFFFFGFFGGGGGGHGGGHHHHHIHIHIIIHIJIIIJIJJIJJJKKJKJKKKK '''(((((()(((((((()))*)))**)***)****++++++,+,+,,006zzǸ~k]01001011111121221222233222233343343334445444454555565666666666677776777888888888988999999999:::9:::;;:;;;;;<;<;<<;<<<=<<==<===>===>>>>>>>>?>??????@@?@@@@A@@@A@AAABAABABBBBBBBCBCCCCCCCCDDDDDEEEEDEEEEEEEEEEEFFFFFGFFGFGGGGGGHHHHHHHHHIIHHIIIIIIJJIJIJJJJKJJKJJKKKLKK ('(((((((()((()))()*)*))*)****+**++*+++++,,,,,,,,,-\\|C;8111121121121232323332333343443444445544555555566655676666776777788887888888999999999999::::::;;:;;;;;;<;<<<;<<<=<====>===>>>>=>>>>>>???????@??@@@@@@A@@@AAAABAABAABBBBBCCCCCBCCDCCDCCDDDDEEEEEDEEEEFFEFFFFFFFFFGGGGGGGGGGGHHHHHHIIIIHIIIIIIIJJIJJKJJKKJJJKKKLKKLLL (((((()(()()))))))*)*)*******++**+++,++,,+,,,-,-,,-89K~~ק~m^111121221222233233333333443444444545555555556566666776777777777888888889998999:99999::9:::;::;;:;<;<<<<<<<<==<============>>>>??>??????@??@@?@@@@@@@@@AAAABABABBBBBBBBBBBCCCCCCDCDDDDEDDDEEEEEFEFFFFFFFFFFGFFGFGGGGGHHGGHHGHIIIHIIIIIIIIIJJJJJJJKKJJKKKKKKKKLLLKLL ((()(()()())))))))******+**+**++++++,,+,,,,,,-,-------ff}M?;122222233323333334444444444545455655655656666777767777877887888888998999:99::9:::::::;;;;:;;;<;<<<<<<<<==========>=>>>>>??>>>>???????@@@@@@A@@AAAAAAAABBABBBCBBBCBCCCDCCCCCDDDDDEDDEDEDEEEEEFFEFFFFFFGFGGGGGHHGGHGHHHHHIIIHIIIIJIJIIJIJJJJKKJKJKKKKKLKLLLLLKLML )((())(()))))))))*)***+*++*++++++++,,,,,,,-,---,----.-@@]ݡ~ud22232333333333343334444454454555566565666666777677777778788888889899999:99:::9::;:;:;;:;;;;<;<;<<<<=<<======>>=>=>>>>>>???>????????@@@@A@@AAAAAAABABAABBBBBCCBCCBCDCCCCDCDCEDDEEDEEDEEEEEEFFFFFFGFFFFFGGGGGGHHHHHHHHHIIIIIIIIIIJJIJJJJKKKJKKKKKKLKLKLKLLLLMLMLL ))())(**)))))********++*++++++,+,+++,-,,,---,-----.......iicKD333333333334444444444455555565666666766776777887877888998989999999::9:::;;;::;;;;;;;<;;<<<<<<<========>==>>>?>>>?>??????@?@@?@@@@AA@@@@AAAAABAABABBBBCCCBCCCCCCDCDCCCDEDEEDEDEEEEFEFEFFFFFFFFGGGGGGGGGHGGHHHHHHIIIIIIIIIJIIJJJJJJJKJKKJKKKKLKLLLLLLLLMMMMMMM ))))))))))**)**+**+**++++++++++,+,++----,,--..--......./.BA_ݢ~؆q544333344444445555554555655566666776676777777778888989999999:999::999:::::;;;;;;;;<;<<<=<<=<<<=<======>>>>>>??>?????????@@?@@@@@AAA@AAAAAABABBBBCBBCBBCCBCCCCCCCDDDDDDEEEEEEEFFEEEEFFFFFFFGFGGGGHGGGHHHHHHHHHIHIHIIIIIJIJJJKJJJJKKKKKKKKKKLLLLLLLLLMLMMLMMMN ))*)**))*********++**+++,++++,,,,,,,,-----...-.......///////ii[Q433443444544545555665665666676777777778877887899988999999::9:::;::;;;;:;;;;;;;;<<<<<===<<==>=>==>==>>>?>>>?>??????@@?@@@@@@A@AAAAABAABABABBBCCCBCCCCDCDDCDDDDDDDEDDEDFEEFFFFFEGFFGGFFFGGGGHHGHGGHHHIHIHIIIIIIIIIIIJIJJJJJKJKJJKKKKKKLKLLLLMLLLLLLMMMNMMNM )*)*****)*+*+*+++++++++,,+,,,,,,,,,,---.----......././/////0BB_֩}yA:944544455555565666676667777777777788788889898999999999::::::::;;;;;;;;<<<;;<<<=<<<=========>>>>>>>?>>??????@??@@@@@@A@@AAAAAABAABBBBBBCBCCCCCCCCCDDCDDCDDEEDEEDEEEEEFEFFFFFFGFGGGGGGGGGHHHGHHHIHHIIHIIIIIJIJJJJJJJJKKJJJKLKKKKKKLLLLLLLMLLLLMMMMNNNMNNM )))***++*++*++*+++,,+,+,,+,,-,-,,-,,-.-........./././///00/0000iirb554555555556656666666777777778878888889898899:9:9::::9:::::;;;;;;;;<;<;<<=<==<==<=====>>>>>>>>>??>????@@?@?@@@@A@AAA@AAABAABAABBBBCBBCCCCCCCCCCDDDCDDDDEEEDEEEEEFEFFFFFFFFGFGGGGGHHGHHGHHHIHHHIIHHIIIIJIJIJIJJJJJKJJKKKKKKKKLLLLLLLLMLLMMMMMMMNMNNNNNN ******+*+*+++++++++++,+,,,-,,,,,----.......//...///0//00/000000?@Y~~Ƿ~oRJ5555565666666677777777787788889888898999999:9::::::::;;;;;;;;<<<<;<<<<=========>>>>>>>>>>?>>>???@???@@@@@A@A@@@@AAABAABABBBCBBBBBCCCDDCCCDDDDEDEDEDEEEEEEEFEFEFFFFGFFFGGGGGHGHHHGGHHHHIIIHIIIIIIIJIJJJJJJJKKKJKKKKKKKLLLLLLMLLLLMLLMMNMNMMNNNNNNNNN ****++***+++++++++,+,,-,,,,--,------..././/////.///0/0000000000000cc~wB;9566666666776777777878888888989999999::::9:::;:;:;::;;;;;;<<;<<<<===<=========>>?>>?>>??????@?@?@@@@@@AA@@AAABBAAAABBABBBBCBCBCCCCDDDDDDDDEDDEEEEEFEFEEFEFFFFFFFGGFGGGHGHGHGHHHHHIIHHIHIIIIJIJJJJJJJJKJKKKKKKKKLKLLLLLMLLLMLLMMMMMMMMNMNNNNNNNOOO *+*+**+++,++,+,,++,,,,,,-,---,--.---.....///.///0//0//000000110111::H||߳sc66677667677788778888889898998999::99:::::::::;;;;;;;;;<<<<<<==<==<====>=>>=>>>?>??>????@???@?@?@@@@A@AAAAAAABABAABBBCCCBCCCCCDDDDDDDDEDEDDEEDEEEEFEEFFGFFFGFGGGGGGGGGHHHHHHHIHHHHIIIIIIIIJJJJJJJJKKKJKKLKKKLLLKKLLMLLMLMLMMMNMNMMNNMNNNNONNONOON *+*+++++++,+,+,,,,,,,-,,-----...-.--//../.0//00//00000010101111111212XX}qSL777777787787888988988999::9:99::::::;;:;;;;;;;;<<<;<<<=<<======>=>>==>>????????????@?@@@@@AA@AA@AAABBABBBBBABCCBCBCCCCDCDDCDDDDDEDDEEDEEEFEFFFFFFGFFGGGGGGGGGGGGHGHHHHHIHIIIIHIJIJJJJJJJJJJJJKKKKKKLKKKLKLLLLLLMLLMMMMMMNMMMMNNNNOONONOOOOOPO +++,+,+,+,,,,,,-,,-------....-......///////0/000000100100101111112221448uu~yKA>777888888988999999999:99:::::::;:;::;;;<<;<;;<<<<<=<========>>=>>>>?????????@?@@@@@@@A@@A@AAAAABBBABBBBBBBBCCCCCCCDCDDDCDDDEDDEEEFEEFFEEFFGFFFGGFGGGGGHGGHHHHGHHHHIHHIIIJIIIIJIJIJJKJJJKKKKKKKKKLLLLLLLLLMLMMMMMNMNMNNMNNNNNNNOOOOOOOOOOOP +,+,,,,++,,,,----,--,.-.-...-....././/////000000010010111121112222232322IImݴˀl:99888888999899999:::9:9:::;;;;:;;;;;;;<;<<<==<<<<=======>>>>>>?????>????????@@@@A@@AA@AAAAAABBBBABBBBBCCCBCCCCDDDDDDEDDEEDEEDFEEEEEFFFFFFFFFFGGGGGGGHGGGHHHHIIHHIIIIIIIIIIJIJKJJKJKKKKKKKKKLLKKLLLLLMLMMMMMMMMMNNNMNNNNNNNNOOOOOPOOOPOPPO +++,,,,,,,,,,-,--------..-........./0//000000000100110111222222222222333333dd~i[889999999999::::::::::;;;;;;;;;;;;<<<<<<<<=<==>===>=>>>>>>?>??>??????@??@@@@@@AAAAAAAAABBABBBBCBBCBCBCCDCCDDDDDDDDDDDEEEEEEFFEFFFFFFGFFGGFGGGGGGHGGHHHHHHHHIIIIIJJIIJJJJJJJKJKKKKKKKKKKLLLLLLLLLMMLMMMMMMMNMMNNNNNNONOOOOOOOOOPPOPPOPPP ,,,,,,-,,-,-------------..././...//.//0000000000101111212211222222333333344::Ezz~rUM899:99:::::9;::;:;;;;<;<;;;;<<<<<<========>>>>>=>>?>?>?>>??????@@@@@@@AAA@@AAAAAABBBBBBBBCBBCBBCCDCDCDCDDDDDEEDEEEEEEEEEFFFFFFFFFGFGGGGHHGGGHHHHHHIHHHHIIJIIJIJIJJJJJKJJKKJKKKKLLLKLLLLLLLMLMMMMMMMNNNNNMNNNNNNONNNOOOPOOOOPPPPPQPPP ,,,-,,,-----.-.--.-.-..-......//////000000011111211122222222232222333343443444OO}{UGC9::::::::::;:;;;<;;<<;<<<<<<=<=<======>>>=>>>>?>?????????@??@@@@@@@AAAAAAABBBABBBBBBBBCCCCCCCCDDDCDEEDDDEDEEEEEEFEFFFFFFFFFGGGGGGHGGHHGHHHHIHIHIIIIJJIJJIJJJJKJKJJKJKKKKKKKLLLLLLLMLLMMMMMMMMMMNNMNNNNNNNNOONOOPOOOPPOOOPPPPPPQQQ -,,,-,------.-.........////////////0222232333333343343444445445gguF@>:::;:;;;:;;;<<<;<<<<<<=<=========>>>>>>?>>>>???????@??@@@@@@@@AAAAAAAAABBBBBCBBBCCCCCCCCDDDDDDDDEEEEEEEEEFEEFFEFFFFFGGGGGGGGGGHHGHHHIHHHHHIHIIIIIJIJJIJJJJKJJJJKKKKLKKKLLKLLMLLMLMMMNMMMNMNNNNNNONONNOOOOOOOOOPPOPPPPPPPQQQQQQ ,-,-,----..-.........////////////0//232322333344343443444445555;;Fxx~̀m?<<;;;;<;;<;<;<<<<=<=<=<===>>>>=>>>>>>>?>>???????@?@@@@A@A@AAAAAAAAAABABBCBCCBBCCCCCDCCCDDEDDEEEEEEEEEEFEFFFFFFGGGGFGGGGHGGHHHHHHHHHHHHIIIIJJIIJJJJJJKKJJJKKKKKLKKLKKLLLLLLLMLMMMMMMNMMMNNNNNNNNNNNOOOOOOPOPPPPPPPPQPQQPPQQQQQ ------..-......./..//////0000//00000111111212222222222222333433434444544455455555655KKp~wg=;;<;<<;<<<<<=<=========>>=>>>>??>>????@??@@@@@@@@@@AAAAABAABABBBABCCCCBCCCCCCDCDDDDDDEDEDEEDEEEEEFFFEFFFFFFGFGGGGGHGHHHHHHHIHIHHIIHIIIIIIJIIJJKJKJJKKKKKLKKLLLLLLLMLMLLMLLNMMMNNMMNNNNNONNNOOOOOOOPPPPOPPPPPPPQQQQQQQQQQQQ .---....-....////.///////0/00/000100112121222222332322333344434444444454545555556555666^^½~m_<;<<=<<==<=====>=>===>>>?>>??????????@@@@@@A@AAAAAABABABABBBCBBBCCCCCCCCCDDDDDDEDDDEDEEEEEEFFFFFFFFFGGFGGGGGGHGHHHHHHHHHIIIHIIIIIJIJIIJJJJJJJJJKKKKKKKLKLLLLLMLLMLLLMMMMMMNNMNNNNNNNOONOOOOOOOOPPPPPPPQPPQPPQQPQQRQQRQRQ --.-..........////////0000000000011022122122232233233333343444445455455465565656666666698===>>>>>>>>??>????????@@@@@@@@AAAAAAABBBABBBBBBCCBCCCCCCDDDDDDDEDEEDDEEEEEFEEEFFFFFGGGFGGGGGGHGGHGHHHHHHIIIIIIIIIJIIIIJJKJKJJKKKKKKLLLLKLLLLLLMLLLLLMMMMMNMNMNNNNNOONNOOOOOPOOPPPOPPPPPQPQQQQQPQQQQQRRRRRRR .-......///////////0//00000001111111121222232233333433434344444545555555555566666666766777AAPzzcX====>==>=>>>??>??????@@@?@?@@@@@AAA@AA@AAABAABBBBBBCBBCBCDDCCCCCDDDDEDDDEEEEEEFFEEEEFFFFGFGGGGGGGGGGHHHHHHHHIHHIIIIIIIJJJJJJJJKKJKKJKKKLLKKKKLLLLLMLMLMMMMMMNMMNNMNNNONNNNNOOOOOOPOOPOPPPPPPPQPPQPQQRQQQQRQRRRRRRR ....../..//////000000000000000111112222323233333443333344445445455555555656666666776777878887LLp~~ظ`W=>=>>>>>>>????????@?@@@@@AAAAAAAAAAAAABABBBBCBCBCBCCCCDDDCDDDEEEEEDDEEEEFFFFFFFFFFGFFFGGGGGHGHHGHHHHHHIIHIIIIIIJJIIIIJKKJJKKJKKKKKKKKLKLLLLLLLMMMMMMMMNMNNMNNNNOONNONOOOOOOOOPPOPPPPPPPQQPQQQQQQQQRRQQRRRRRRSSS ......////////000/000000111111112121322333333333443444444455554556555666666667766777777888888888ZZݴ~bX????>????????@@@@@@@AAA@AAAAAAAAABBBBBBCCCBBCDCCDDDDCDDDEDEEEEDEFEFEEFFFFFFGFFGFGGGGGGHHHHHHGHHHIIIIIIJIIJIJIJJJKJJJKJJKKKKKKKLLLLLLLLMLLMMMMMMMNMMNMNNNNNOONNOOOOOOOOPPPPPPPPPPQQPQQQQQQQQRQRRQRRRSSRRRRSSR ././/////00/00000000011011111111121233233333344444444444455455656556566677677677788778888889888999:ffeY??????@@?@@@@@@@AAAAABAABBBBBBBBBCCCCCCCCCCDCDDDDDDDDEEDEFEEFFEFFFFFFFFGGFFGGGGHGHGHHHHIHHHIIIHHIIIIJIJJJJJJJJKKJKKKKKKLLKLLLLLLMMLLMLMNMMMMMNNNNNNNONONOOOOOOOPPOPPOPPPPPQPQQQQQQQRRQQQRQRRRRRRRRRSRRSSS //////////0/000001000111111211212222333334444344444544544555555656666666767777877878788888889999:99;;Appl_??@@@@A@@AA@AA@ABABABBBBBBBBBBCCCDDDDCDDDDDDDEDDDDDEEEEEEEFFGFFFGFGGGGGGGGGHHGHHHHHHHHIIIIIJIIIJJJJJJJJKKKKKKKKKLLLKLLLLLLLMLMLMMMNMMNNMNMNNNNNONNONOOOOOPPPOPPPPPPPQPPPQQQQQQRRRRRRRRRRRRRSSSRRSSSSSS ////0/00/000011111011112221222222223333434444444554455565665666666666777777777788887988988999:9:::::9:A@JuuǷ߲vfDAAA@AAAAAABBAABBBBCCCCBCCCCCDCDCDDDEDEEDEEEEEEEEEEEEFFFFFFFGGGGGGGGHGHHGHHHHHHHIIIIIIIIIIJJJJJJJKKKKKKKKKKKKKLLLLLLLMMLMMLMMMMNNNNNNNNNNONNNOOOOOOPPPPPOPPPPPPQQQQQQQQQQQRQRQRRRRRRRSSSSSSSSSSSSST //0/0/000010111111111112222222232323334343444454554555565666666677777777787788888888889999999999::::::;;:EEWyyͲ۵mIEDAAAAAABBBBCBCBCCBBDCCCDDCDDDDDEEEEEEEEEEFEEEEFFFGFFFFGGGGHHGHHGGHHIHHIIIIIIIIIJJIJJJJJJJJKJJKKKKLKKKKLLLLLLLLLMMMMMMMMNNNNNNNNOONNOOOONOOOOOOPPPPPPPPQQPQPQPQQQQQRRRRRRRRRRSSSSSSSSSTSSSTSTTT /0000000011011111122112122232233233344444545555555555566566667677777777778888888889889999999::::::::;;;;;;;;JJe||ѮӼ؇rSJHBBBBBBCBCCCCCCCDCDDDCDDEDEDDEEEEEEEEFEFFFFGGFFGGGGGGGGHGGHHHHHHIHIIIIIIJJIJJJIJJJKKKKKKKKKKLKKLLLLLLLMMLLMMMMMMNMNNMMNNNNNNOOOOOOOOPOPPPPPPPPPQPQPQQQQQQQRQQRRRRRRRRRRRSRSSSSSTSSSTSTSTTTT 00010011011111121222122222232233333344555555555556666666677667677777778887898899988999::9:::::::;::;;;;;;;<;;<=>>>=TT~~~̂oSJIEEEEEFEEEFFFFFFFFFFGGGGGGHGHGGHHHHHIIHIIIIIIIJIJIIJJJJJKKKKKKKKLKKKKKLLLMLMMLLLMLNMMNNMMMNNNNONNOONOOOOOOPPPOOPPPPPPQQPQPPQQQQQQQRQRRRRRRSRSRSSSSSSTSSSSTTSTTTTTTUTUUTTUUUU 111211221222322333333333434444444554565665667676667777877788888888998899:99:99:::::::::;;;;;;;;<;;<<<<====<==>=>==>==>>>>>>SS|}}xkVQFEEEFFFGFFFFGFGGGGGHGHGGHHHHHHIHIIHIIJIIJIIIJJJJJKKJKKKKKKKKKLLLLLLMLLLMMMMNMNNMMMMMNNNNNOOOOOOOOPOOPPPOPPPPPPPQQQPQQQQQQQRRQQRRRSRRRSRSSSSSSSTSTSTTTTTTTTUUUTTUTUUUUVVV 1212223222232333334334344434444455456566666667767777787788888988999999:999999::;:;;:;;;;;;<;;;<<<<<<<<==<>=====>>>>>>>>>>?????RQu||~l`GFFFFFGGFGGGGGHHGGHHHHHHHIHHIIJIIIJIIJJJJJKKJKJJKKKLKKLKLLLLLLLMLMMMMNMMMMMMNNNNNNNNNOOOOOOOOOPPPPOPPPQQPQQQPQQQQQQQQRRQQRRRRRRSRSSSSSSSTSTTTTTTTTTTTUUTTUUTUUUVUUVUV 22222222333333333344334444445455565566666766777777778788888899899999::::::::::::;;:;<;;;<;;<<<<<<<<========>>=>>>>>?>>?????@??@@?NNizz̓pZOMGGGHHGGGGHHHHIHHIHHIIIIIJIJIJJJJJJKKKKKKKKKKKLKKLLLLLLMMLLMMMNMNNNNNMNNNNOOONONOOOOOPPOOPOPPPQQQQQPQPQQQQQQQRRQRRRRRSRSSSSSSSSTSTTSTTTTTTTTUUTTTTUUUUUUUUVVVVVU 2222223223333333434444445444455555567667777777777878888889989899999:9:::;:::;;;;;;;;;;<<<<<<<<<<=<=======>>=>>>>???????????@@@@@@A@@JK_xx~{d[GHGHHHHHHHHHIIIJIIIIIJJJKJJJKKKJJKKKKLKKKLLLLLLLLMLMMMMMNMMMNNNNNNONNOONOOOOPOPPPOPPPPPPPQQQPQQQQQQQRQQQRRRRSRRSRSRSSSSSTTTTTTTTTUUTUTUUUUUUUUUUUVUVVVVVVVVV 32233333334334344344444454555665566567677787788888788989999999:99:::9;:::::;;;;;;;;<;<;<<===<<=====>=>>>=>>>>?>??>????@?@@?@@@AAAA@AAAAHHUss~ԫϿmYPMIHIIHIIIJIJJJJJKJJJKJJKKKKKKLKLLKLLLLLLMMLLMMMNMMMMNNMNNNNNNOOOOOOOOOPPPOPPPPPQQQQPPQQPQRQQQRRRQRRRRRRSSRSSSSSSTSSTSSTSTTTTUUUUTUUUUUUUUUUUVUUVVVVVWVV 2323333334444444454545555556566666667778788778878888989999:9::99:9::;:::;;;;;<<;;<;;<=<=<<=======>===>>>>>?>?>????@@@??@@@@@@A@AAAAABABAAAEEKmm܀{g^KIIIIIJJJJKKJKKKKJKKKLKLLKLLLLLLLLLMMMLMMMMMMMNNNNNNNNOOOOOOOOOOPPPPOPPPPPPPQQQQQQQQQRQRRQRRRRSRRSSRRSTSSSSSSTTTSSTUTUTTTUUTUTUUUVVUUVUVVVVVWVVVVVV 333343444444544444545555655656666766877878888988999999:9999::::;::;;:;;;;;;<;;<<<<<<<====<==>>=====>>>>?>?>>????@?@@?@@@@@@AA@AAABAABBABABBCBCCDed~۶ӆriWSJJJKJKKKKKKKKLLLKLKLLMLMMLLMMMMMMMMMNNNNNNNNNNOOOOOOOPPPPPOPPPQPPQPQQQQQRQQQQQRQRRRRRRSRRSSRRSSSTSSTSTTTTTUTTTUUTTUUUVUUUUUUUUUVVVVVVWVWVWWVW 333444344444544554555556666666676666888888888999999::9::9:99::::;;;;;;;<<;<<<;<<<=======>=>=>>>>>>>?>?>?>??????@@@@@@@@@AAAAAAABABABBAABBBCBBCBCCCCXY}}~ߟր~uhVPNKKKKKKKLKLLLLLLMLMMMMMNMMNMNNNNNNNONOOOOOOOPOOPPPOPPPPPPPQQPQQQQQQQRQRRQRRRRRRRRRSSSSSSSSSTSTSTTTTTTTTTUUUUUUUUUVVVVVVVVWVVVVVVVVWWWWWW 34343455444455556655566566667676777788888899989999999::::;::;;:;;:;;;<;<<<<<<<<<<<<=====>=>>=>>>>>???>??????@??@@@@A@@@@AAAAAAAABABBCBBBCBCBCCCCCDDDDCOOfwwԻ{kaOLMLLLLLLMMMMMMMMMNNMNNNNNNNONNONOOOOOOPPPOPPPPPPQQQPQQQQQQQQQRQRRRRRRRRSRSSSSSSSSSTTSTTTSUTTUTTUTTUUUUUVUVVUUVUVVVVVWWWWVWVWWWWWXXW 4444454444456555566666666777677778778889888989999:9:::::;:;;;;;;;;<;<<;<<<<==<=====>=>=>==>>>>>>??????@??@@@@@@@AAAAAAAAABABBABBBBBBBCCCCCCCCCDDDDDEDDEDDIHQnn~wbZMLMMMMMMMNMMNNNNNNONNONNOOOOOOOPPPPPPPPPPPQQQQPQQRQQRRQRRRRRRRRSRRSSSSSTSSTTSTTSTTUTTTTTTTUUUUUUUUUUUVVVUVVVWWVVVVWWWWWWWWXXXX 444555455555665566666666776777877888989999999::9::9;:::;::;;<;<;<<<;<<=<==<==<=====>==>>>>>??>>????@@??@?@@?@@AA@AAAAABABABBBBBBBCCBCCCCCCDDCDCDDDDEEDEEEEEEFEGcc~Ƿӆsw_ZMNMMNNNNNNNOOONONOOPOPPPPPPPPPQPPPPPQPPQQQRRQRRRRRRRSSSSSRRSSSSTSTTSTTSTUTTTTTTTUTUUUVUUUVUUVVVVVVVVVVWWWWVVWWWWWWWXWXXX 4544545555566666667667767777877778889999999:9::::::::;;;;;;;<;;<<;<<<<==========>=>=>>>>??>??????@?@@@@@@@@@A@@AAAAAABBABBBBBBBCBCCCCCCDCDDDDDDDEDDEEEEEEEEFFFFFFFVUwyz~ֹ̈́qw_YONOOOOOOOOOOOPOPOPPPPQPPQPPQPQQQQRRQRQRRRRRRRSSSSSSSSSSSSTTSTTSTTTTUUTUUUUUUUUUVUUVVVUVVVVVVVWWWVWWWWWWWWWWXXWXXXX 5556555655666666677777778788888889899:9:99::::;:;;:;;:;<;<<;<<;<<<<<==<==>==>=>>=>>>?>>?????????@@@@@@A@@@AAAAABAAAABBBBBBBCCCCCCDCCCCCDDDDDDDDEEEDEEEFEEFFFFFFFFFGGFLLVnn~Ļӆse]POOPPOOPOPPPPPPPQPQQQQQQQQQQQQRRRRRSSSSSSSSSSTSSSTTTTTTTTUUTUTTUUUUUUUUUUUVUUVVVVVWWVWVWVWWWWWXWWXWWXXWXXXXX 555556566666766777777787777878898999999::::::;:;;::;;;;;<<<<<<<<<<=<======>>>=>>>>>>?>????@@?@?@@@@@@@@AAAAAAABBBABBBBBBCBCBCCCDCCDDDDDDDDEEEEEEEFEEEEFFFFFGFFFGGGGGGGGHHGI^^||~ۀwlbURQQQPQQQQQQQQQQRRRRQRRRRSRRRRSRSSSSSSSTTSTTTTTTTTUTTUUTUUUUUVUVVVVVUVVVVVVWVWWWVWWWWXXXWWXXXXXXXXXXXX 565666666666776777777778888888998999::::::;;:;;;<;;;<;<<;<<<<=<=======>>=>>>>>>??>>????@?@@?@@@@@@@AAAAAAABBABBBBBBBBCCCCBCCCDDDDDDDDDDDDDEEEEEEEEFEEEFFGFFFGGFGGGGGGGHGHHGHIHOParqـ{vigZWQQQQQRRQRRRQRRRRSSRSRSSSSSSTTTTTTTTTTUTTUTUTUUUUVUVVUUVVVVVVWVVWVWWWWWWWXXWWWXWWXXXXXXYYXYYXX 666666776777777887878878898989999999::;;::;:;;;<;;<<<<<=<=<==<========>>>>>>?>???????@??@@@@@AA@@AAAAABBAABABBBBBCBBCCBCCCDCDCDDCDEDDDEEEDEFEEEEFFEFFFGFFFGFGGGHHGHGHHHHHHHIIHIHIIIJ_^{{~ȷڀͅrh`USSSRRSSSRSSSSSSTTTTTSTTTTTTUTUTTUUUUUUUUVUVUVVVVVVVWWVWWWWWWWWWWWXWXXXWXXXXXXYXXYYYYXY 666676777777777778888888989999999999:;:;;:<;;;;;;<;<<<==<<<====>>==>>>>>>>>??>???@???@?@@@A@@@@AAAAAABABABBBBBCBCCCCBCCCCDDDDDDDDDEDDEEEEEFEEFEFFFFGFFGGGGGGHHHGGGHHGHHHIIIIIIJIIJIIJJJOOZll~֩݀{{lxb\SSSSSSTSSSTTTTTUUUTTTUUTUUUUVVVVUVVVVVVWVVWVVWWWWWWWXWWWXWWWXXXXXXXXXYYYYYYYYY 6666777777778888788889989999999:9:::;;;;;;;;<<<<<<=<=<=<====>==>>>>?>>>>??>??????@?@@@@@@A@AAAA@AAABABBBBCBBBBBCBCCCCDDDDDDDDDDEEEEEEEEEFEEFFFGFFFFGFFGGGGGHHHGHHGHHHHIHIIIIIIJIIJJJJKJJJJKJJXXzww~Ӽyykyc]UTTTTTUTTUTTUUUUUUVUVVVUVVVVWWWWVWWWWWWWXWXXWXXXXXXXXXXYXXXXYYXYYYYYY 7677778877888888988899899::::9:::;::<;;<<;<<<=<<==<==<====>>>=>>>>?>??>?????@@?@@@@@@A@AA@AAAAAABBBBBBCCBBBCBCCCCCDDCDCDEDDDDDDDEEEEEEEFFFFFFFGFFGGGGGGGHHHHHHHHHHIIIIIIIIIJIIJJJJJJKJKKKKKKKKLKLMPee}}~̀{}njc_ZWVUVVUVVUVVVVVWVWVVVVWWWWWWWWXXXWWXXXXXXXXYXXXYYYYYYYYYYYY 77777888888888888999999:999:9::::;;:;;<<;;<<<===============>>>>???????????@@@@@@AA@@AAAAABAABAABBBBBBCBBCCCCCCDDCDCDDDDEDEEEEEEEEFEFFFFFFGFGGFGGGGHHGHHHHHHIIIHIIIIHIJJJIJIJJJKJJKJKKKKKKKLKKLLLLLMLMRQ^kk~~~ޠ׹~؉uylibc\ZVVWWVVWWWWWXXXWXWWWXXXYYXXYYXYXYYYYYYYYZYYZYZ 877877888988899999::99::::::::;;;;;;<<<<=<==<<========>=>>>>>??>?????@??@?@@@@@@AAA@AAAAAABBABABBBBCBCCBCCCCDCDDDDDEEDDDDEDEEEFFEFFFFFFGFFFGGGGGHGGGHHHHHHIIHIIIIIIIIJIIJJJJJJJJJKJKKKKKKKLLKLKLLMLLMLMMMMMMUUjpp~֨Հ߲zȃrwjWWWXWWXXXXXYYYYYXYYXYYYYYYYZYZZZZZZZ 7878888889999999:999::::::::;:::;;;<<<<<=============>>>>>?>????????@?@@@?@AA@@A@AA@BAABBABBBBBBCCBCCCCCCCDCDDDDEDEDDEEEEEFFEFFFFFFFGFFFGGGGGGHGHHHHHHHIHHHHIIIIIIJIIJJIJJJKKKKJJKKKKLLKLLLLLLLMMLLMMMMMMMMNNNNNNNZ[zst~ȶҀXWXXXXXYYYXYYXXXYYYYYZYYZZYZZZYZZZZZ 88888889899999999:::::::;:;;;;;;;;<<=<<<=<======>>>>>>>?>>????????@@@@@?@@AA@AAAAABBBABBABBBBBCCBCCDCCCDCDDDDEDDDDEEEFEEEEFFFFFFFFFGFFGGGGHGGHHHGHHHHHHHHIHIIIIIIIIJJJJJKJJJKKKKLKKKLLKLLLMLLLLMMMMMMMMNMMNNNNNNNONONOOO[[zss~ڀѽXXXYXYXXXXYYXYYYYYYYYYZYZZZZZZZZZZZZ 889989999999:::9::::::;;:;;;;;;;<<<<<========>>=>>>>?>?>>????@@@@@@@@@A@@AAAAAAAABABBBBBCCCBBCCCCCCCCCDDCDDDEDEEEDEFEEEFFFFFFFFGFGGGGGGGGGGHHHHHIHHIIIIIIIIIIIIJJJJKJJJKKKJKKKKKKKKLLKLLLLMMLMMMMNMNNMMNMNNNONNOOONOOOOOOOOOPO[[xrr~ƸҀֺYXXYXXYXXXXYYYYYYYYZYZZZYZZZZZZZZZZ[ 9889999999:::::;:::;;:;;;;;;;;;<<<=<=====>==>>>>?>>>>????????@@@@@@@@A@AAAAAAABBBBBBBBBBCBCCCCCCDDDDDDEEDDDDDEDEEEEFFEFFFFFFFGGFGGGGHHGHHHHHHHHHIHIIIIIIIJJIJJJJJJJJJJKKKKKKKKLKLLKLLLMLLLMMMNMMNMNMMNNNNONNOONOOOOOOOPPPOOPPPPQPQQQZYrnn~~~Ю׹XYXYXYYYYYYYYYZZZZYZZZZZZZZZ[ZZZZ[[[ 999:99::::::;:;:::;::;;;;<;<<;<=<<<<==>>==>>>>>>??>????@@@@?@@@@@@AAAAAABAAAABBBBBBBCCCCCCCCCCCDDDDEDEEDEEDEEEFFEEEFFFFFFGFGGGGGGHHGHHGHHHHHHHIIIIHIIIJIJJJJJJJKJJKKJKKKKLKKLKLLLLLLLLMMMMMMMNNNNMNNNNNNOONNOOOPOPPPPPPOPPPPPPQQQPQQQQRRRRVV`hhzzЮXYYYYYYYYYYZZYZZZZYYYZZZZZ[[Z[[Z[[[[ 99:99:::::;;:::;:;<;;<;<<;;=<<<<<=<=>>>>>>>>???????@??@@?@@@@@AA@AAAAAAAABABBBBBBCBBCCCCCCCCDDDDDDDEEEEEDEEEFEFFFFFFFFFGGGGGGGGHGGHHHHHHHHHHHIIIIIIIIIJJJJJJJJKKKKKKKKLKLKKLLLMMLMLLLMMMMMNMNNNNNNNOONOOOOOOOOOPOOOPPPPPPPQPQPQQQQQQQQRRQQRRRRRRTTUaarr~~¼XYYYYYZYYYYYYZZZZZZZZZZZZZ[[Z[[[[[[[ 999::::::;;:;;;<;;;;<<<;<<<<<=======>>>?>>>>>????@@@?@@@@@@@AA@AAAAABBAABBBBCBBCBCCCCCDCCCDDDEDDEDEDDEEEEEEEFFEFFFGFGFGGGGGGHGGGHHHHHHHIIIHIIJIIIIIJJJJJJJJJJKJKKKKKKKKLLKKLLLMLMMMLMMMMNMNMNNNNOONONOOOOOOOOOPPPPPPPQPPPQPQQPQQQRRRQRRRRQRRSRRSSRSSSSSSSWXehhxxŹYYYYYYYYYZZZZYYZZZZZZ[[Z[ZZ[[Z[[[[[[ 9:::::;;:;:;;;;;<;<<<<<<<=<<=<===>==>?>??????????@@@@@@A@AAAAAABABBABBBABBCCBBCCCCDDDDCDDDDDEDDDDEDEEEFFEFFEFFFFGFGFFGGGGHGGGHHHHHHHIIIIIIIJIJJJJJIJJJJKJKJJKKKKKKLLLLLLLLMMMMMMLMMMNMNNNMNNNNNNOONOOOOPOPOOPPPPPPPQPQPQQQQRQQQQQRRRRRRRRSSRSSRSSSSSTSTSTSSTTTTTTU]^xlkzzƸۤYZYYYYZZZZZZZZZZZZ[[[Z[Z[Z[[[[[[[\[[ ;;:;:;:;:;;;;;<<<<<<<<<<==<===>>===>>????????@@?@@@@A@@AAAAAAAAAAABBBBBBBCCCCCCCDDDCDCDDDDEEEDEDFEEFEEFFEFFFFFGFFFGGGGGGHGHHHHHHHIIIIIIJIIIIJJIJJJJKKJKKKKKKLLKLLLLLLMLLLLMMMMMMMMMNNMNNNNNONONOOOOOOOPPOPOPPPPPPPPQQQQQRQQRRRRRRRQRRRRRRSRSSSSSSSSSSSTTSUTTTTTTUTUUUUVUUVU]]wllxxYZYZYYZZZZZZ[ZZ[[ZZ[[[[[[[[[[[\\\[\\ ;;;;;;;;;;<<<<;<<===<<<<======>>>>>>??????@@@@@@@@A@@AA@AABAAABBBBBBBCCCCCCCCCDCCDDDDDDEDDEDEEEEFFEFFFFFFFFGGFFGGGGGGHGHHHHIIHIIHHIIIIIJJJJJJJJJJJKKJKKKKLKKLLLLLKLLLMLMMMMMNMNNMMMNNNNONOOONONOOOOPOOPPPPPPPPPPQPQQQQQQQQRQQRRRQSRRRRSSSSSSSSSSSTTTSTTTTTTTUTTUTUUUVVUVVVVVUVVVVVVV[[iffrr||ZZYZZYZZZZZ[Z[Z[Z[[[[[[[[[[[\\\[\\\\;;:;;;<<<<;<=<<<========>>=>>>>>>>>?AAABBABBBBBBCBBCCCDCCCDDDDDDDDDEDEDEEEEFFEFFEFFFFFFGFGGGGGGHGHHHHHHHHHIIIHIIIIJIJJIJJJJJJKKKKKKKKKKLKLLLLMLLLLMMMMMMMMNNMMNNNNNNNONNOONOOOPOPOPPPPPPPPPPQQQPQQQQQQQQQRRRRRSSRRSSRSSSSSSSSTTTTTTTTTTUTUUUUUUUUUUVVUVVVVVVVVVVWWWWVWWWWWXXWY__uiiqqzzZZYZZZZZZ[Z[[[Z[[[[[[[[[\[\\\\\\\\[[;;;;;;;<<<<=<<<==<===>>=>>=>?>??>???BABBBBBBCBCCCCCCCCDCDDDDDEEEEDEDEEFEEFEFFFFFFFGGFGFGGGGGHGHHHHHHIHIIHIIIIIIIIJJJIJJJJKKKKKKKKKKKKKLLLLLLMMLMMMMMMMMMMMMNNNNONONNOOOOOOOPPOOPOPPPPQPQQPQQQQQRQQRQRQRRRRRRSSRSRSSSSSSTTSSTSTTTTTUUUUTTUUUUUUUVVUVVVVVVVVVVWWWWVVWWWWWWXXXXXXXXXXXXXYXXXY[\fcciippvv{{Z[ZZZZZ[[[Z[[[[[[[[[[[[[\[[[\[\\\[[[;:;;<<<<<<<==<====>>=>=>>>>??>>????????@@?@@@@AAAAAAAAABABBBBBBBBBCBCCCBCCCCCDDDCDDEDEDEEEFFEEEEFFFFFFFGFFGGGGGHHGHGGHHHHHHIHIIIIIJIIJJJJJJJJKJJJKJKKKLLLLKLKLLLLLLLMMMMMMMNMMNNNNNNNNNONNOONOOPOOOPOPQPPPQQQPPQQQQQQRQQRRQRRQRRSSSRSSRSSSTSSTSSTTTTTUUTTTTUUUUUVUUUUVVUVVVVVVVWVVVVVVWWWWWWWXWXWWXXXXXXXXXYXXYYYYYYYZZYZYYYZZYZZZZZZZ[[Z[Z[Z[[[[[[[\[[[\[[[\[\\\[\\\ZZZ::9<<<====<====>==>=>>>>>>>>?>?????????@@@A@AA@AAAAAABBBABBBBBBBBCBCCCDCDDDCCDDDDDEDEEEEEEFFEFFEFFFGGGGGFGGGGGGGGHHHHHHHHHIIIIIIIJIIJJIJJJKJJKJKKKKLKLKKLLLLLMLLMLMMMMMMMNNNMMNNNNNNOOONOOOOOOOPPPPPPPPQQQQPQQQQQQRQQQQQRRRRSRRRSSSSSSSTTSSSSTSTTTTTUTTUUTUTUUUUUUVVVVVVVVVVWVWVVWWVWWWWWWXXXXXWXXWXXXXXYXXYXYYYYYZYYYYYZZZZZYZZZZZ[[Z[Z[[[[Z[[[[[[[[[[[[\\\\\\\\\\\]YYY9998=<<======>==>>>>>>>>>??>????@?@??@@@A@@@AAAAAAAABABBBBBBBBBCCCCCCCCDDDDDDDDDDDDEEEEEFFEFFFFFFFFGFFGGGGGGGHHHHHHHHHIIHIIIIIJJJJJIJJJJJJKKJKKKKKKKLLLLLKLLLMMMMLMMMMMNMMNNNNNONNOOOOONOOPPOOPOOPPPQQPQQQQQQQQQQQRRRQRRRRRRSRRSSSSSSSTTTTTTTTTTTTTTUTUUUTUUUUUUUUUVUVVVVVWVVVWWWWWWWWWXXXWXXXXXXYXXXXYXYYYYYYYYYYYYZYZZZZZZZZZZZZZZZ[[[[[[[[[[[[\\[\\[\\\\\\\\\\\\\\\WWX8<=<======>>>>>>>>??????????@@@@@@A@@@AAAAAAABBBABBBBBBCCBCCCCCCCDDDDDEDDEEDDEEEEEFEEFFEGFFFFFGGFGGGGGHHHHGHHHHHIIHIIIIIIIIIIJJJKJJJKJJJKKKKLLLKKLLLLLLLLLLMMMNMNMNNMNNNNNNNNONOOOOOPOOOPPOPPPPQPPPQQQQQQQRRQRRRRRRSRRSSRRSRSSSSSSTTTTTTTTTTUUUTTUUUUUUUVVVVUVUVWVWWVWVWWWVWVWWWWWXWXWXXXXWXYXYXXYXYYYYYYYYZZYYZZZYZYZZ[ZZZZZZ[[[[[[[[[[[[[[\\\[[[[[\\\\\\\\\]]]\]\<<==>>>>>>>??>?>?????@?@@@@@@@@AAAAAAABABBBBBBCCCCCCCBCDDDCCCDDDDDDDDDEEDEEEEFEFFEFFFFFGGGGGGGGHHGHHHHHHHHHIHIIIJIIJIIJJIKJJJJKKKKKKKLKLKLLLLLMLLMLMMMMNMMMMMNNNNNNNONONOOOOOOOOPPPOPQPPPPPPQPPQQQQQRRQRRQRRRRRRSRSSSSSSSSSSSTSSTTTTTUUUUUTUUUUVUUUUVUUUVUVVVVVWWWVVWVWWWWWWXWWWXWXXXXXXXXXYYYYYYYYYYYYZZYYZZZZZZZZ[ZZZZ[Z[Z[Z[[[[[[\\\[\[[\\\\\\\\\\\]\]\]\\[[\W====>>>>>>?>??????@?@?@@@@@A@@A@AAAAAAABAABBBBBBBCBCCCCCDDCCDDDDDDDDEEEEEEEFEFEFFFFFFGFFGGGGGHGGHHGHHHIIIHIIIIIIIIIIJJJJKJJJJJKJKKKKKKLLLLLLLMLLMLMMLMMNMMMMMMMNNNNNOONNOOOOPOOOPPPPPPPPPQPPPQQQQQQQQQRQRQRRRRSRSSSSSSSSSTSTTTTTSTTTTUTTUUUUTUUUUUUVUVVVVVVWWWVWWVVVWWWWWWWWWWXXXXXXXXYXXXXYXYXYYYYYYZYYYZYZZZZZZZ[ZZZZZZZ[[[[[[[[[[[[[[[\\[\\\\\\\]]\\]\\]]]]]]\]<<<>????????@??@?@?@@AA@@A@AAAAAAAABBBBBBBCBBCCCCCCCCDDCDDDDEDEEEEEEEFEEFFEFGFFGFGGGGGGGGGGGHHHHIHHHIIIIIJIIJIJJJIKKJKJJKKJKKKLKKKLKLLLLLLMLMMMMMMMMNMNNMNNNNNNONOOOOOOOOOPPPPPPPPPPQPPQQQQQQQQRRRRRRRRRSRRSSSSSSSSSSSSTTSTTTTTTTTUUUUUUUUUUUUVUVUVVVVVWVVWVWWWWWWWWWWXWWXWXXXXXXYYYYYXYYXYYYZYYYZYZZYYZYZZZZ[ZZZZ[[[[[[[[[[[[\[[[\\\\\\\\\\\\\\\]\\]\]]\YZZ>>=??????@?@@@@@@A@@A@AAAAAABBABBBBBBBBBCCCCDDDDDDDDDEDDDDEEDEEEEEEEEFFFFGFFGFGGGGGGGHGHHHHHIHIIHIIIIIIJIIIJJJJKKJJKJKKKKKLKLLKLLLLMLMLMMMMMMMNMMMNNNNNNONOOOOOOPOOPOPOPOPPPPQPPPPQPQQQQQQQRRRRRRRRRRRSSSRSSSSSTSSTTTTTUTTUTUUUUUUUUUUUVVVVVVVVVVVVVVWVWWWWWWWWWXXWXWXXWXXYXYYXYYYYYYYYYYYYYZZYYZYZZZZZZ[[Z[[[Z[[[[[[[[[[\[[\[[\\\[\\\\\\\]]]]]]]]]]\\\@?@?9??@@@@@@@@AAAAABAABBABBBBBCCBCCBBDCDDCDDCDDEEDDDEEEFEEEEEFFFFFFFFFGFGGGGGGGHHGHHGIIIHHHHIIIIIJIIIJJJJJJJJKJJKKKKKLLLLLLLLLLMLMMMMMMMNMMNMNNNNNNNOOOOOOOOPPPPPPPPPPPPQQQQQPQQQQQRQRRRRRRRRRRRRRRSSSSSTTTSSTSSTTTTTTTUUUUUUUUVUUVUUVVVVVWVVVVWVWWWWWWWXWWWWXXXXXWYXXXXYXXYYYYYYYYYYYYZZZZZZYZZZZZZZ[[[[Z[[[[[[[[[[[\[[[\[\\[\\\\]\\]]]\]]\]]]]]9@@@AAAAAAAAABABBBABBBCBBBCBCCCCCCCDCDDDDDDDDEEEEEEEFEEFFEFFFFFFGFFGGGGGHGHHHHHIHIHHHHIIIIIJJJJJIJJJJJKJJKKKKLKLLLLLLLLLLLLLMMMMMMMNMNNNNNNNNONNOOONOOOOPOPPPPPPPQQQQQQQQQQQQRQQRRRRRSRRSRRSRSSSSSSTSTSTTSTTTTTTUUUUUTVUUUUUUVVVVUVVVWVVWWVWVWWWWXXXWXWWWWWXXXXXXYXXYYYYXYYYYYYYZYZZZZZZZZZZZ[ZZ[Z[[[[[[[[[[[[\[\[\\\[\\\\\\\\]]\\\]\]]]]]]AA@AAAVAAABABBBBBBBBCBCCCCCCCCDDDDDDDDDDDEEEEEFFFEFFFFFFGGFFFGGGGGGHGGHHHHHIIIHIIIIIIJIIJJJJJJKKKKKKKKKKKLLLKLLLLLMMMLMMMMMMNMMNNNNNNNNNOONONOOPPOOOPPOPPPQPPPPPQQPQQQRRQRQRRRRRRRSRRSRRSSSSTSTTSSTTUTTTTTUUUUUUUVUUUUUVUUVVVVVVVVWVVWWWWWWWWWWXXXWXXXXXXXXXYXXYYYXYYYYZYZYYZZZZZYZZZ[[Z[[Z[[[Z[[Z[[[[\\\[[[[\[\\\\\\\\\\]]\]\]]]]V]]]BBB(CBBxBBCBCCDCCDDDDDDDDDDDEEDEEEEEEEFEEFFFFGGGFFGGGGGHGGHHHHHHIIIIIIIIIIIIJJJIJJJJKJKJKKKKKKKLLLLLLLLLMMLMLMMNNMMMMNMNNNONNNOOOOOPOOOPOPPPPPPQPPQPPQQPRQQQRQRRRRRRRRRSSRRRRSSSSSTSTSTTSTTTTTTUTUUUTUUUVUVUUUUUVVVVVVVVVWWWWWWWXXXXWXXWXXXXXXXXYXXXXYXXYYYYYYYYZZZYZZZZZZ[Z[[ZZ[Z[Z[[[[[[[[[[[[\[\[\[\\\\\\\\]]\]]\5???(@    -!!!""""#"#######$#$$$$%%%%$%%%%&&&&&'''''''('((((())))*)*******+++,,,,,,-,,-.--..../////0/00000011122232223344344554566666676777888899999:::::;:;;;::9656.e"""!""""""""####$#$###$$$$$%%%%%%&&&&&''&&'''(('(((()))))*)***)**+++++,,,,,,--..---....////0/00000011121133233333454544566566666688788798999::::::;;;;<<;<<===>>>>322e c!""""""""####"###$$$$$$$$$$%%%%%%&%&&&&&&&'''(''(((((()))******++++++,++,,,----....-.../////00001001112123223334434455555656667777777888889:99::;:;;;;;<<=<=======>>>???343b #"""!"!"""""#########$$$$$$%%%$%%%%&%&&&'&&'''(''('(()()))******+**++++,,,,,,-,---.../..//////0000111111212323333344444556556666767788889989::9:9;;;;;;<;<<<====>>>>>>???@?@???!!!#"!"#""########$$$#$$$%$$%%%%&%&&&&&&''''''('(((()())))**)******+++,++,,,-,----.--//.//.00/000110121222332333344444555655666777777887898999::9;::;;;<<<=<<====>=>??????@?@@@AAA<<< !! """"#######$##$$$$$$$%%$%%%&&%&&&'&'''''''((()())))*)*****+*++++++,,,,-----.-..././////000110111122232333334544555656666667878888888999::::::<;;;<<=<<>===>>>?>????@?@@A@AAAAA@@A """#"""#####$#$$$$@@@@@@AA@BABBBBBBB ##########$$$$$$$%@@@AAABABBBBCCCCDC #"##$#$##$$$$$$$%$թϾbU))((()*))***++*+++,+,,,,,,---.--.../////00000112222333343444555565666777777888989999::::::;<;<;;<=====>=>>?????AAAAAACBBCCCDCDDDD #####$$$#$$$%%%%%%~zzg))(********++++++,,,,-,--.-...../////0/0001112333333434445546566667767878888899::9:::;;;;;<<<<<=====>>>>??????@BBABBBCCBCDCDEDEEE ###$$$%$$%%$&%%&&%zxz,+******+++++,,,,,---..-......////00000111111212323333434444555555666666777888988999:::;::;;;<;<==<===>=>>>>???@@?@@@AAAABABBBCCCCCDDDDEEEEEF $$$$$%%%$%%%%&&&&&}~U@;+*++++,+,,-,-,,..-.-.././//00/0000111112223223333345445546656666767788888999:9::9;:;;;;<<<<======>>?>????@??A@@AAABBBBBBCCCDDCDDEEDEEEFFFG %$$%%%&%%%%&&&&'''aT++++++-,,,-,.---..././//00/000110121221322333433444554566766667787888898999::9;;:;;;<<<<<<=====>>>????@@?@AAAAAAABBBCCCCDCDDDDEDEFEEFFFGFG %%%%%&&&&&&&'&&'''~úzքo,++,,,,,--.-.....///////000011112221333333444444555556666776778887989999::::;:;;;<<<<<<====>=>>??????@@@@@AABBABCBCBCCCDDDDDEEEEEFFFGGFGGG %%%%&%&&&&'''''(''{yF:6----.---..//.////0000111111212232333443444554655666776877888889999::::;;;;<;;;<=<====>>?>????@@@@@AAAABBABCBCCCDCDDDEEEEEEEFFFGGGHGHHHH &&&&&&&&''''''((((||_S---.-.././////0000010111222232333344444554656666777778888998:999:::;;;;;;<<<<<=====>>>>???@@@A@@AAAABBBBCCCBCCDDDDEEEEFEFFFGFGGHHHHHIIH &&&''&'''(''(((())ffɵys/..//./////000011111122232233344444454556566677787788898899::9:;:;;;;<<;=<<===>>>>?>???@?@@A@AAAABBBBBCCCDDCEEDDEEEEEFFFFGGGGGHHHHHHIII &''''''('((()())))IIw{zcJC////0/000110121222322333434454545655666776887888899:99:::;;;;;;<<<<<====>>>??>???@?@A@AAAABAABBCCCCCCCDDDEEEFFFFFFGFGGGHHHHHHIIIIIJJ ''''(((((())))))))..3zzӶ}{h000000110122222232333443444555566666677887888899999::::;:;;;<<<<<<======>>??????@A@@AA@ABBCBBCBCCCDDDDEDEEEEGFFGGFHGGHHHIHIIIJJJJJJK ('(((((())))*))*)*++,]^}wUC>000111122222333444444455655666777777888989999:::;;:;;;;<;<=<===>>>>>>????@?A@@AAAAAABCBCCCCDCDDDEEEFEEFFFGFGGGGHGHIHIJJIIJJKJJKKK ((()()))))))*****+,,,;:P~~wf11211222233334344455556566677677888899999::::;:;;;;;<<<<===>>>=??>????@@@@@AAABBABBBBCCDCDDDEEEEFFEFFFGGFGGHHHHIIIIIIJJJJJJKKKLLK (())))**)***+**+++-,---.hh~wZF@222333443444555666666777778888888999::::;:<;<;<<=<<=>==>>>>>????@?@A@AAABABBBBCCCDCCDEDDEDFEFFFFGGFGGGHHHIIIIIIJJJKJKKKKKKKLML ))))*)***+**+++,,,--....AA_}~΁m4334345445556557667777878889899999:::::;;;<<;<=<===>>>>>?????@@@@@A@ABBABBBCCCCCCDEDEEEEFEFFFFGGHHHHHHIIHIIIJJJKJKKKKLKKLLMMMM )))****++++++,+,,,...//.///jk~x|WN4545555666667777878889999999::::;;;;;<<<=<===>>>>>>????@?@@@AAABAABBBCBCCDDDDDEDEFFFFGFGGFGGHHHHIHIIIIJJJKJJKKKLKLLLMLLMMNM ******+++++,,,,-,-....///0/BB_~Ǹ{xB<:656666676777888898999::::::<;;<<<=<<===>=>>?>???@@?@@AA@AAAACBBCCCCCCDDEEDEFEEFFFGFGGGGHHHHHIIIJIJJJKJKKKKLLLMLLLLNNNNNN ++*+*+,,,,,,-,--.-/.///0000011dd|{ud766767787888889999:9:::;;;;;<;==<===>>=>>>???@@?@A@AA@BBBBBBCBCCDDDDEEEDEEEFFFGFGGGGHHHIHIIIIJIIKKKKKKKKKLLLMLMNMNNNNNOO +++++,,,,-,-..-..-//0000111111;;J||ܣxyWN877888989999::::;;<;;<;<<<====>>>?>?????@?A@@AAABBABBBCCCCDDDDDDDEEFEFFFGGGGGGHHHIHIIIIJJJJKKKKKKKLLLMLMMMNMNNNONOOOO ,,+-,,---.--..../.000101111222232WW|δ|{UFB988999:::;:;;;;<<;<<<===>>>>?>?????@@@@AAAABBBBCCCCDCCDDDEEEFFFFGFFGFGGGHHHHHIIIIJJJJJJKKKKLKLLLMMMMNNNNNONOOOPPPP ,,,--,----....//..222322333547pp}~|ڇrA==9::;;:;;<<<;=<====>>>>>>???@??@@@AAAABABBBCCCCCCDDDEEDEEEFFFGFGGHHHHHIHIIIIJJJKJKKKKLKLMLLMLLMMNNNNNOOOPOPPPPQP --,-.-.--...///0/0223333443444BBY}}թx|j=<;;;;;<<=<<======?>>???@@?A@AAAABABCBBCCCDCDDDDEEEEFFFFFGGGGHGHHHHHIIIIJJJJKJKKKLLLLMLMLMMMNNNNNNNOOOOPOQPPQPQ ---......////0/000221332333343444554555VW}yqb;<<=<<===>>>??>????@?@@AAAAABBBBCCCCDDCDDDDEEEEFFFFGGGGGGHHHHIHJIIJJJJJKKKKLLKLLMMMMNNMNNNOOOOOOPOOPPQQQQQQQ .......////0000001222333434544555556676667ii|yh[===>>>??>???@@@@@@AAABBBBBBCCCCDDEDDEEEEEFFFFFGGGGGHHHHIHJIIJJJJKJKKKLKLLLMMMLMMMNNNOOOOOOOPPPQQQQQRQQRRR /..//.//0000111111333434444455556766777787<?>???@?@@@@AAABAABBCCCCCCCDDDEDEEFFFFFGGFGGGHHHIIHJIJJIJJJJKKKKKLLLLMMMMNNNNNNONOOOPPPPQPQQQRQRRRQRSR /.//00000011121222344444454655666677877888899DDX{{|Ǹ|j^??@@@@AAABBABBBCCCDDDEDEEEDEFFFFFGGGGHHHHGHIHIIIIJJKJJKKKKLKMMLLMMMNMNNNNOOOOOPPPPPQQQQQQQRRRSRSSSS /00000101111222222454555555666766877888888:99:::LLn}}}ź|teCBBABABCBCBCCCCEDEDEEEEEFFFGGFGHGHHHHIIIIIJJJJJKKKKLLLLLLMMMNMNNNNNNOOOOOPPPPPQQQQQQRRRSSRSSSTTT 000101121222322333554555666766787888898:99::::::;;;ST~~}µ{~lIEDCCCCCDDDDEEEFEEFFFGGGGGHHHHIHIIIIJJJJJJKKKLLKLLLMMMNMMNNNOONOOOOPOPPPQPQQQQQRRSSSSSSSTTTTT 0111112112323334336656667667878889999999:::;:;<;<<<=<=XX}{܉t^PKDEDEEEEEEFFFGGGGHGHHHIHIJIIJIIJJKKKKKLLMLLMMMNMNNNNONOPPPPPPPPPQQPQQRRRRRSRSSSTTSTUUUTU 211112222333333444676776788888998:99:::;::;;;<<<<======>>XY|{{{]UFFEFFFFGGHGGHHHHHHIIIJJJKJKKKKKLLLLMMLMNMNNNNNOOOPOPPPPQPPQQQRQRRRSRSSSSSTSTTTTTUUUU 222222333443444544776878888898999:9:::;<;;<<<<====>>=>>>>???VV~~{|ufLJIGHGHHHHHHIIIJJJKKJKKKKKLLLLMLMNMMNNNNOOOOPOPPQPPQQQRRQRRRSRRSSSSTTTUTUTUVUUUVV 232333334444454665787788989999::::::;;;<<<=<=>==>==?>>????@@A@@QQr||{~ʼ}vmXSIIIIIIJJIJJJKKKLKLMLLLMMNNMNNNNOOPOOPPPPPPQQQRRQRRRRRRSSSTSTTTTUTUUUUVVVVVV 3333334445455666768889899:9:9:;::;;;<;;<=<===>==?>????@@@A@@AAABBBNMexx|~{~vhQMLJJJKKKKLLLLMMMMMNMNNNONOOPOOOOPPPPQQQQQRRRSRRSSSTTSTTUUUUUUUVUVVVVWWW 43344445555566677789999:::9;::;;;;<<<<======>>>>????@?AAAAA@ABBBBBCCCIISpp~|}Ӹyf]LLLLLLMMMNMMNNNONOOOPPPPPPPPQPQQQRRRRRSSSSTTTTTTTUUUUUVUVVVVVWVWWW 4445445556667777779:::::;;:;<;<<<<=====>==>>>???@@@@A@AAAABABCCCCCDDCEDDFFHeez|؈tzaZNNNNNNOOOOOOPPOQQPQQQQQQRRRRRSSSSSTSTTTUUTUVUVUVVVVVVWWWWXWX 545565666776878888::::;;;;;<;<=<====>>=??>????@@@@@AAABAACBBCCCDCDDDDDEDEEFFFFXX~zz}}į}ԇs~b\OOOPPOQPQQQQQQQRRRRSRSSSTSTUTTTTTUUUVVVVVVWVVWWWWXWXWX 555766677778888989;;;;;;<<<=<====>=>>?????@@?AAAAAAABABBBCBCCCDDDEEDEFFEFFFFGFGGGMMXnnz~~ދvlaVRRQQQRRRSSSSSSTSTTTUTTUUUUUVUVVWWWVWWWXXWXWXXYX 67667777888899999:;;;<<<<<<===>>>>?>???@?@A@@AAABAABCBCCCCCDDDDEEDFEEFFFGGGHGHHHHIHHIII]]zz~z~~|zku`[SSSSTSTTTTTUUUUUUVVVVVWVWWWWXWXXXXYXYYY 777878888989999:::;;<<=<====>=>??????@@@@@@AABABBBBCCCDDDDEDEEEEFEFFFGFFHHGHHHIHHIIIJJJJJKNNVjj~~}{~xyk~e^XVWVUVVVVVWWWWWWXXXXXXYXYYYZYY 7778889989999::;:;<<<===>=>>>>???@@@A@@AA@ABBBBBBCCCCCEDDDEDFFFFGFFGFHHGHHHIIHIJIJIJJJKKKKLKKLMMTTjqq}{}}φswkkcWWWXXXXYXYYYYYYZZY 8888999:9::::;;;;;====>>??>?????@A@AAAABBBBBBCCCCCDDDDEEEFEEFFFFFGHHGHHHIHIIIIIJJJJKKKKKKKMLLMMMMNNNNNZ[zss~z}XXXXXYXYYYZYZYYZZZ 9899:::::;::;;;<<<=>>?>>???@@@@@@AAABBABBBCCCDCCDDDEEEEEEFFFGGGGGGHHHHHHIIIJJIJKKKKKLLLLLLMMLMMNNNNOOOPOOOPP[[xqq{}~~YYXXYXYYYZZZZZZZ[Z ::9::::;;;;;<<<<<???@@@@A@AAAAABBCCCCCCDCDDDEEEEFFFFFGFGGGGHHHHIIIJIJJJJJKKKKLKKLLMMLLMNMNNNONOOOOPOOPPPQQPRQQXXjkk||{|XYYZZYZYYZZZ[Z[[[[ ::::::;;;;<<=<==>=???@@?A@@AAABBBBCBCCCCDDDDDEEDFEFFFFGGFGHGGHHIHIIIIJJIKJJKKKKLLLMLMMMMMNNNNNONOOOPPOPPQPQQQQQRRRSRRSSSUUYbbqq}}}{~ڥYYYYYZZZZ[ZZ[[[[[[ ;;:;;;<;<<<<===>>>AAABABBBCCCCCCCDDDEEEEEEFFFGGGGGGHHHIIIIIIJIJKKKKKKKLLLLMLMMMMNNNNNONOOOPPPPPPQQPRQRRRRSRRSSSTTTTTTUUUVUUVVZbboo{{ZZZZZZZZZ[Z[\\[\\\ ;;;<<;<<<=>==>>>>?BABBBBBCCDDCDDEEDEFFEFFFGGGGHGHHHIIIJIIJJJJKJKKKLKKLLLMMMMNNNNNNNNOPPOPPPPPQQPQQQRRRSSRSSSSSSUTTTTTUUUUVVVVVWVWWWWXWW]]nffoouu||ZZZZ[[[[[[\\\\[\\\;;;<======>=>?????@@@AA@@AABAABBBCCCCCDDDDEDEFEEFFFGFGGGGHGHIIHIIIJIJJJJKKKKLKLLMLLLNMNNNNNOOOOOOPPPPPQPPRRRRRRRSRSSSSSSTTTUUUUUUUVVVVVWWVWWWXWXXWXXXXXYYYYYYZYZZZ[ZZZ[Z[[[[[\\[\ZZZ9::===>>>>>????@@@@A@AAABABCBCCCCCCDDDDEDDFEFFFFFGGHGHHHHIIIIIIIJJJJKKKKKLKLMLMMMNMNNNNONOPOOPPPQPPQQPRRQRRRRSSSSSSTSTTTTUTUUUVVUVVVWWWWWWXXXXXXYXYYXYZYZYYYZZZ[[Z[[[[\[[\\\[\\\\XYX112>>=>>>???@@@@@AAAAABBBBBBCCDDDDDDEEEEEEFFFGGGGHGHHHHIIJIJJJJJKKKKKKLLLLLMLMMMNNNNOOOOOOPOPPQPQQQQQRRRRSRRSSSTSSTTTTTUUUUVVVVVVVVWWWWXWWXXXYXYYYYZYYYZZZZZ[ZZ[[Z\[[[\\\\\]\\]\\LLL<==R???@??A@@AAABBBCBBCCCDDDDEDEEEEEEFFFGGGGHHHHHHIIIIJJIJJJJKKKLKKLLLLMLMNMNNNNNOOOOPPOPPPQQPQQQQRRSRSSSSTSTTTTUUUUUUVVUVVWWWVWWWXXWXXXXXYYYYZYYZZZZZZZZZZ[[[[[\[\\\\]\\\]]ZZZQ=>>TA@AAAABBBBBBCCCDCDDEDEEEEEEFFFGFFHGHHHHIHIIIIJJJJJKKKKLLLLLMMMMMMMNNNNOOOOOOPPQPPQQQQRQRRRSRRSSSTTTTTTUUUUUUVVVWVVVVVWWWWWXXXXYXXYXYYYYZZYZZZ[[Z[[[[[[[[[\\\]]\]]]ZZZT===@@@BBCCCBCCDDDDEEDEFEGFFGFGGGGHHHHIIIIIIIJJJJKKKKLLLLLMLMMMMNNNNONOOPPPOPPPQQQQRQRRRRSRSSSSTTTTTUUTVUUUVVVVVWVWWWWWXWXXXXYXXYYYYYYZZZZZ[[[[[[[[\\\\\\\\\\\\\XXX(0`    "e   !!!!!!"!"""###$$$$$$%%%%&%&&&&&&''&''((((()))*)+**+++,,,,-,-........//.000010111222333444434///e"f!!!"""""##"##$$$$$$%%%%%&&&&&&'&''('((())())*****++++,,,,---.-..//0//000111121332333444555555766788888999::9:;:;;<<==<==232f c!"!"""#"#"###$#$$$%%%%&%&&&&&&''''(()(()))*)****++++,,-,,----..//.0//0001002113223334445556556767778889999::;:;;<<<=<===?>>???555c """""""#"######$$$$$$%%%%%&&&&'''(''((()()))****++*++,,,,----...///0/000101221232433444545565667877898999:::;;;<<<<<=>==>>????@@@@@@\""""#####$$$$$$$%$&%%&%&&&&'&&(''((()))*)****+*+,,+-,,----...../0/0001112212323334445455656767778889999:9;;;;<;<=<==>>?>???@@@@AABBA::9]"###"###$$$$@@@AAABBBBCC>>> ######$$$$$$ջ쾳AA@BBBBBBDCC@A@ #$$$$$%$%%%%z~1,,)))*+*++*,,,,,,---..-./.0//000232433444455665767787889999::9::;;;<=<=>=>>>????ABBBBBDCDDDEAAA! !$$$$$$%%%&%&t]D?***+++,,,-,,---.-.//////000111212222334444554656777787888999::9:;;<;;<<====>>>???@@@A@@BBACBBCCDDDDEEEABA!!!%%%&%%%&%&'&ڥxbU+*++,,,,----..././/0/000100111223433444455665677787898999:9:;:;<;<==<===>>>???@@?AAAABBCBBCCCEDDEEEFFFCBC!"!%%%&&&'&&'''yمp+++,,,---..-.///0/000110221223333444555566766788988999:::;;:<<;==<===?>>???@?@@AABBABBBCCCDDDEEEFFFGFGCCC"""&%%&&&''''''{yH;7---...//./0/000111211232333444555566776777898999::9;;;<;;<<<>==>>>???@@@AAABABCBCDDCEDDEEEEFFGGGGGHCCD###&&&'''''((((vdW.-./..00/0001012122223334444456666777778899999::;;;<;;<=<===?>>???@@@@@ABBBBBBCCCDDDEEEFFFGGGHGGHIIDDD##$''''''(())))}}zw310/0/000110111233333444555666766787888999:::;;;<;<<=<===>>>???@@?@AABBACBBCCCDDDEEEFFFFGGGHHIHIJIIEEE$$$'((((()))))*ee{uxTK000111212232333444555666667788888999::9;::<<;=<<==>?>>???@@@AAABABBBCCCCDEDEEEFFFGGGGGHIIHIIIJJJFEE$$$((()))))****CCg}˭}{ׅp101212222343444455666767887888999::9;;;<<<<<====>?????@@@AAABBBCBCCCCDDDEEEFFFFGGGGGHIIIIIJJJJJKFGG%%%))()))***+++--.rrywvSK222333444555556766787889999:::;:;;<;<=<>==>>>???@@@A@@ABBBBCDDCDDDEEEFFFFFFHHHHIHIIJJJJKJKLKKGGG&&&*))**++++++,-..LL{~ө}{u:65444444655677887888999:::;;:<<<==<=>=>?????@@?AA@BABBCBDCCEEEEEEFEEGGFHGGHHHIIIJJJKKKKKLMMLIHH'&&*+**+*,+,,,,/./002sszveX554565667787888999::9;:;;;;==<=>>?>>???@@?AA@BBABBCCDCDDDEEEFFFFFGGHHHHHIIIJJKKKKLKLMLLMMMIII'''+++,,,,,,---/0/000IIq|~}}YGB7767778989999::;;;<<<<<====>>????@@@A@ABAABBBDCCDEDEEEFFFGFGHGGHIHJJIJJJJJKLLKLLLMMMNNNJIJ(((,+,,,,----..000011112kk|xنq=::888999::9;;;;;<<=<=>=>>>???@@@@AABAABBCCDDEDDEEEFEFFGFHGGHHIIIIJJJJJKLLLLLMNMMNNNNNOJJK)(),,,---.-./..112333?>Q||zvrc999:::;;;;<;<=<=>=>>>???@@?A@ABABCCBCDDDDEEEEFFFGGGHGHIHHIJIJJJKKKLKLLLLMMNNNNOOOPOOKLK)))-----../////223333444VV}ŰίzaV;;;<<<==<=>=>>>???@@?AA@BBBBCCDCDDDDEEEFFFGGGGHGHHHIIIJJJKKKKLLLLLMMMNNNOOOOOPQPPLLL)))-.././/0/000232433444555768lk}}|}~xXP<<<===>>>???@@@AAABBBBBBDDCDDDEEEFFFFGGHHHHHHIIIJJJKKKLKLMMMNMNNNNOOOOOPPPPQQQMML))*/../0/000101333443555656766=>Hxxzz|qVO?>>???@?@AA@BBACBBCDDDDDEEEFFFFFGGHHIIHJJIJJJKJKKLLLMLMMNNNNOONPOPPPQQRQRQQMNM***///000010222444555656677877888HHd||zy|sWP@@@AA@BABCCBCDDDDEEFEFFFFFFHHHHHHIIJJJJKJKKLLLMLMMNNNNOONPPOPQPQQQRRRSRRNNO+++000110211232445655777877888999:::PPw~~yy~aWABBBBBCDCDDDEEEFEFGGGGGHIHHIIIJJJKKKKLLLMLMMMNNNONOOPOQPQQQQRRRRRRSSSOOO,,,001122232334656667777888999:::;:;<<>>>>???XX~~zzxr[TGGHIHHIIIJJJKKKLLLLMLNMMNNNOONOOOQPQQQQRRQRSSSSSTTSUUTUUUQQQ...333444555566888999:::;;;;;;=<=>=>>>>???@@@AAASSw||{}ݛz~ufQLKJJJKKKLLLMLMNMNNNNNOOOOOPPPQQQQRRRSRSSSTTTUUTVUUUVVRRR///444555655666999:9:;;;;;;=<====>>>???@@@@@@BBACBCNNdww~~z}ζ}xf]MLLLLMMMMNNNOOOOPPPPPQQQRRRRRRSSTTSTUUUUUUVVVVVWRRR000555565767787:::;;:<;<<<<=>=>>>???@@@@AAABABCCDCCDDDIIQnnyz܊u}b[NNNOOOOPOPPPQQQRRRRSRSTSTTTUUUUUUVVVVVWWXWRRR111666666877888;::;<;<<<==>>>>???@@@AAABABCBCDDCDDDEEEFFFGGH^^}}|z{ӆsg_RRQQQQRRQSSRSSSTTTTUUVUUVVVVWWXWWWXXSSS122766787888999;;<<===>=>>>???@@@@AABABBCBCCCDDDEEEFFFFGFGHHHHIQQcqqy~נ|ysgg[WSTSTTTUUUUUUVVVVWWXWWXWXXYYSSS233777888999::9=<==>=>>>???@?@@AAABBCCCCCCDDDEEEFFEGGGHHHHIHIIIJJJKJL^_zzz~ߜ{يuthuc]WWVVWVWWWXXXXXXYYYTTS333888999::::;;===>>>???@@@AAABAACCCCCDDDDEEEFEFGFGGHHHHHIJIJJJKKKLLKLLMOOTff||y}Х|}|ՈuXXWYYXXYYYZYTTT444999::::;;<;;>>>???@@@AA@BBBBCCCCDDDDEEEFFFGGGHGGIHHIIIJJJJKKLKLLLMMNNNNNNONRSYgg{{|z}{ʾ~YYYYYYZZZZZZTUU555::9:::;;<<=@@@BAABBBCCCEDDEEEFFFGGFGGHIIHIJIJJJKJKKKKMMLMMMNNNNOOOOOPQQQQQRQRRSRSSTTTTZZjhhuu~{{YYZZZZ[[Z[[[VWW776};<<=<<===>>>BAACCBDCCDDDEEEFEFFGFHGHHHIIIIJJJKKKLLLLMLMMNNNNNNOOPPPQQQQQQRQRSSSSSTTTTTTVUVVVUVWV[Zdddnnuu{{[ZZ[Z[[\[\[[VVV887V=<<>=>>>>???@@@A@AAABBBBCCDDEDEEEFFEGFGGGHIHHIIIJJJKKKLKLMLMMMMNNNOONOPPQQPQQQRQRRRSSSSSTSTTTUUUVUVWVWWWWXXXYXXXYXYZYZZZZZ[[[\\[[\\\VVVV++,===>>>???@@@@AABBABBBCCDDEDEEEEFEGGGGGHHHHIIIJJJKKKKLLLLLNMMNNNNOOOOPQQPQQQRQRSRSSSSTTTUTUUUVUVVWVVWXWXXXXXYYYYYZZZZZZ[[[[[[[\\\\\\]CDC=<=>TA@AAABBCCCCCDDDEEEFFFGGGHHHIHHIJJJJJKKKLKLLLLNMMNNNOOOOOOPPPQQQRQRSSSSSSTTTUUTUUUVVVWWVWWWXXWYXYYYYYZYZZZ[Z[[[[[\\\\\\\\ZZZU;<; AA@RBBBvCCCyDDDyEDDyFFEyFGFyGHHyIHIyIIIyJJJyJKKyKLKyLMLyMMMyNNNyNNOyOOOyPPPyPQQyQRRySSRySSSySTTyUTTyUUUyVUUyWWVyVWWyWWXyXXXyXXXyYYYyZZZyZZ[yZ[Zy[[[vZZZRUTU ( @ e !!""####$$$%%$&%&&&&('(()()*)++++++,,--.../.000112222444555666877999:99;;;:;:222eb!""#"##$#$$$$$%&&&&'''('()))))++*+,,,--..-.//000111322444445666878999:::;;;===>>=???665b !!!"###$#$$$%%%&&%'&'''()()))***++,,-,,.-././000111322334545666877899::9;;;<=<===???@@A??? """###$$$@@@BABCBC ###$$$%%%{{=64..-///000223433555666787999:::;;;<<=>>=???BBACCCDDD $$$%%$%&&nnޱ~gKD/./000112222444454666877998:::;;;<<==>>???@@@BBBCCCDDDEFE $%$%%%''&\\xwhZ000112222444455666877999:::;;;<<<>=>???@A@BBBCCCDDDEEFFGG &&&&&'(''GGuuvt211232334544666777898:::<;;====>>???@@@BBACCCDEEEEEFFFHHH &&'(''())10:~~~~iMG334555666888988:::;;;===>>>???@@@BBACCCDDDEEEGGFHHHIJI (('()(*)),,,gh{v{i545667777988:::;;<<=<>>>???AA@BABCCCDDDEEEGGGGHHIJIJKJ )()*))***,,,GGpy~|fNG778888:9:;;;<=<>>>???@@@BBBCCCDDDFFEFFGHHHJIIJJJLLK )**+++,,,-..0/2uu}̬w܈s?<;:::;;;<<<=>>???@@ABBABCCDEDFEFGFFHHHIIIKKJLKKMMM ***,,,,--///000NNz~~~pa;<;<<=>>=???@@AABBCCCDDEEFEGGGHHHIJJKKJKLKMMMNNN +++,-,.--000111434rszz^T>>>???@A@AAACCCDDDEEEFGFHHHIIJJJJLLKMMLNNNOOO -,-.-.///232334GGh~~}~~x~z[S@@@BBBCBCDDDFEFFGGHHHIIIKKKLLKMMMNNNPOOPPP -..///000222434555676^^zz}^VBCCDDDEFFFGGHHHIIIJKKLLLMMLNNNOOOPPPRQQ //.000211433555666777;;=rryzmaGFEGFGGHHJIIKJKLKKMMMNNNOOOPPPQRQRSR 000211322445666777989:::BCQxxyz҄q`ROJIIJJJLLLMMLNNNOPOQQQRQRSRSSSS 112223443666778988:::<;<====???LLdyyy~~|zpdZTRPPPQRQRSRTTTTTTVVV 434555666999:::<;;==<=>=???AAABBBJJXtt|{Ũ{״~~˄rodj\ZTTTUUUVWV 555776877:::;;;===>>>???@@@ABACCCDDDHHNmmx|ȼ}VVVWVWWWX 666778988;;;<==>=>???@AABBBCCCDDDFFEGGGHHH_^||~y~{˼~VWWWXXXXY 777888:::=<<>>=???@A@BBBCCCDDDFEEGFFHHHJIIJJJQQ_mm~y~WWWYXXYYZ 988:::;;;>>>???A@@AABCCCEDEEEEGFGHHHJIJJKKKLLLMMNNNXXoqq|z~ӥXXXZZYZZZ :9:;<;<==???@@@BBBCCCDDDEFEGGFHHHIIJKJJLKLMMMNNNPOOPPPQRQYYlll{{YYZZZZZ[[ ;;;<<<>>>BBBCCCDDDFEEFGGHHGIIIKJKLKKLMMNNNOOOPPPQRQRRRTSTUTUVVWaa~llvv}|ZZZ[[[\[\;;;>==???@A@BABCCCDEDFEFFGGHHHIIIKKKLLLMMMNNNOOOQPPRQRRSRSSSTTUUUVVVVXXXYXYYYYZZZ[[[\[\[\[;<?SABBCCCDDEEEFGGGHHHIIIJJJLKLMLLNNNOOOQPPQQQRSRSSSUTUVUVWWWXWWXXXZYYZZZZ[Z\\\]\][[[S(0 !"!s"""###$$$%%%&&&'(()))***+++,,-.../0/111322444556777999:::<<;=>>}"""b##"###$%$&%%&''(('(((***+++---...00/111233443665777999;;:;<;===???AAAs"""###$$$%%%&&&''()))***+++,-,...0/0111223444566777989:::<<<===???A@ABCB###$$$%%%@AABBBDDD$$$%%%&&&ɻBBBDDDFEE&%&&&&(((rqa111222444899:;:<<<>=>???DDDEEEGGG&&'((')()wwy854334566777898;:;<<;=>=???@A@CCBDDDFEEGGGHHI(''())***~u~YO556777988:::;;;>>=???AA@BBCDDDEEEGGGIHIJJJ()(***,++||u}t;98899:::;<<>>=???@@@BBBDDDFEFGGGHIHJJJLKL***+++,--``}~ug[:::<<<===???AA@BBBCDDEEFGGGIIIJJJKLKMMM+,+,,,...<>>???A@@BCBCDDFFFGGGHHIJJJLLLMMNOON-,-...00/444[[zɤ}|}zaOJAA@BBBDDDFFEGGGIIIJKJLKKMMNONOPPP.-.///01099=rr{~~~{~zmVPDDDEEEGGGHHIJJJKKLMMMOONPPPQRR/00111322899DDVyyy{~}i^HGGIHIJKJLLLMMMONNPPPQQRSSS111223444888:::<<=???A@ABBCMM^ww~~w~y{nTTTVUVWWW556777998=>>???AA@CBBDCDEEFJJQjizxz{UVVVVVXXX777989:::???A@ABBBDDDEEEGGGHIHJJJYZ|vvzy~WVVWXWXYY899:::<<>=DDDFEEGGGHHHJJJLLLMNMOONPPPRQRSRSZZkggss||YYYZZZ[[[;;<===???@A@CBBCDCFEFGGGIHIJJJLLLMMMONOPPPRQRRRRTTTUVUWVVWXXYYYZZZ[[Z\\\===K???AA@BCCDDCEEEGGGHHIJJJLLKMMMONNPPPRQRSRRTTTVVUWVWXXWXYXZYZ[[[[\\]\]ZAAAOBBBDDDEFEGGGIIHJJJLKKMNMNOOPPPRRRRRSTTUUUUVWWXXWYYYZZZ[[[\[\\]\XAAAAAAAAAAAAAAAAAAAAAAAA(  !!!8#""#$$&%%'''))(++*---///111333566787;;:=<Y~  տ;vQ]2fʘϼ}7sVbtZǏM  '6| )C@(kjkh ?H~Enּx;[E)yWoG+hRj>$tbvE||Olh)"%$5M?Z yYM2fXE*P͹Ϧi<Ρ>^u ϼ}Rf_|yj&%6?~-y'b"1\b4IA%͗ҹ4(##KUĽ(#VYwayFlDa"8ؖk\-Ձwqd# Af®-cT53rjZA?z_*rzNU#MJ>FKoϼ}4_ׅI,wr7W˥[: Z8w5J4õ6t8gH~DjָŅ](Oӗ&ΤK%k5x\A 8dIbZygqx}J(8Tf6-Q\$s:_9T9S-%_ߑO7sPNOoPq[ǖlidfMXa/cwj]تH?u!];#y|Ah_em*O+ڴ%ؠ` Gjb_;%[Y)T1Il5H0}ߕ{~U}p\9- &dr_pqB], RHXzHTD^&ūQ:|R@H3lbgt {4..NQ 3(]\;#?精Nԓ$CvJzu[5wXt`dO!Es9,E80lXZ[E,Ǩ>qf=jBW7,uz{1=#qCeA`D`R/~HW^ RS3?.so &ԉeKk(y.Lj'R\s\wۿ6uHT#gM$jNQR =+K5$ÃyMFZL|J0z L$#iX:PQpVY!Us? ifJFaRoHLƔLdH+fKC]〤XӘqQؔ#z|\/6 a'<0zޕe?ϳ٪]%W6M0zz Y5MiFߕw>>܋>n7 _ 8a]Rx q@|A~T6*=PN9ݻa0o!z9XQQlSg֍?uDvҖAy7 ̓2O栀䮙Mq Դ&?IjBbHLgh9kl\淨M?9]L+;­旹pc]B1 H_1F S(':-b.ѷ8aerWM< jXՉ:~NdocѲѻ @}`l@L˼^yկRZMj bF_|Tt(]̖Jc|=E1h @OTJ)XT q 2dpUL*Xe{{9 C6@@esvEZg\4e{.'(@>?c<h?v`ɀcTNv|j:CʥV|^*ixňnXDZ~cH߱D\֏FH]^"T'Ͼ*>emp`ʋZfuuW8#AǤX n6irHڝ \$7̤$*>s/uۦy牡<4|l{@=kݣ[j#U9X^غ~_8,fF%X*-!SѥwϭIJ;U'hxN??2sBŤ: ڼB駺2e\~Tws{ψ#59k%Ip'c(D'}):wq񍮱;`S7_'8?G܃vySـZwCk r8شz7 ۻ.=wx#}pp`4\uG^j`O+oBa:*_5[rEz'_7-fHCgģd4ؠ1(WڭܦNVp\lawetCA@e)@XMEd1ez7s3Oq2\0vD-\$r@6ϮN`hUfp;[jkh]2YX!j~Spc?R|ai G.eyX?A.27O%CmH#HtPhajp tS;o(`y)DɊZ2ٓl it"ZeRH1sM*L_=9Z- \8LB>U5xb?aH@3<*?Pe|EJ(c ߄3!=u%!@F MQwq{]a[iVBs\F3&su$T[*xݏ rf`1NuFw7[6xnp8뇮hv)pʯAVTa܋-lX;e}@拀.| g_h*I(n=FzϳqsaN? ˞0y@{ %1 t=zl\3zXoE%`t&IHcQG1 jf @]&MfcH 2 %W %φJas $&I谽ԏ@+=N,ï"b22 g0sζ=DWObW~H0>V- $pJI/^LѵGp}r.?jٽo3Rh-(XlabetR'I~r[^61PV]]H Hr |q*B A97Tk+E2]:Itx4Rr#= V:,%}uUY%/]jScPx|Xrn96,uho1lWsd=\fEqXkꝲ6U2~;/icB)/ cxgQntUS$c|@+QA%ZWfkgaow.Ulzt`w1º3jYwʣ:ƫ52M1I_5<\Ů0U_ b,I= o!D49$ϋ8~ϐu@{V|dsɂey`gp=bAxFv""ZEtㅈOGn;QXr Ʀ) i W oͻ}["#k/)^:A;j3gdP̂`b\ +I m.!Ux^;ϮHA5J^I/>ByaO.X ?S QX62.aaPX|G}jC;sjD,!JIpȠɧ"ϱq%D5a[@P"nC~3YΞ{ pY(M'FցpЯ=; 3vg 0>Լ wyv-Tƫڄe\<~7m*LoE@&MFZi$OVI}SOgY9ʗDowO(~aǗjs-NL7 ^~ztW Bc tg&X{A_MloR `|sDQH&2PdWǯiwW?HZB"q/\,'.#9 =`LG!oZ6.R3NuFzXz.FCۯt];ApUVcIyO/G jdIJ?@*K>ca[*2Gr]ĔpzG#v鸐z?b&]$=mzТƁkc^@%|Q?R}۳-cjƴGW}A}w{8QTpp_W> \̇l,-O&O0${38j?S7B)djiu5#^`+bO5}5*@ߺ<=x .B yBrcj?ңEs sc2YQϨk')rLX<V@6lכ_h}h(~~DT(EvϙFD#@V_yṱnCMk?80`^v}A-XHһlv6Okf0չ>TbYgG76Bu EU~\vu@ң8wmmVG:ex{4̾kNS-\i^DnnRܣ=9$UpD3/9@b鴱El%>%_'Zoa+3XXx lnQzMB\NQ4魣w`/+JU.cU<աY{+I4VPcegӔfɸ@ /elaJ?b.'x<&L_ok޴'Q+#rG8UdCKBLێrКnZՅFn!INI9_8 _TwZ#N"o>E>dB"&ƻe*]1>2NJ] S'#`G'Xy}5)|dWEb\Mtoz6DJx?*UrcJsLg)W %Ճ 3Cjs"vc0 8#w"j 1-˿+mRg5F[.ɕ^n`hFٶEQf"M i.~ݵC|k&dU&B^n_@0Th&k<9SJwR][SBU)KD":(g䎦z/3M~9C%tϜ?jjW/n+=xO~l;!s˜&jbRaW 2,j.<N^HR$'WY}z 1ZPsx?dDl1ĎDp l&`IQY[&8ss<6{Z2-FltzKp-i%5С~_b dg?-$ld?\]3lx87e{Wi."iKbФЁI|Us!ˑC1n8MstBx?ȫuR9;I~aY4nqXLٯb7kэ(ֶg;lc*,9-⣪)@}.mք;;q;`p(~jT0_$՛'˕ $|7҇ uE a1@h?ZC_!9<9s ^ j2̾/J/18b ~٭}uMƒO12L2Kmc LSC$,//pq-d @mqi S5F_ 0[2&EY$B2?gUP^Nu{ϊٸ'\R1gK&H]y0Abϵ 1jŋ"Ŏ!v'(P.M`|t0e6D8U +֌B iMRcﻱ"EUNd(՞%Q=P_a͙w}!W?]J[GlR!9^, 6TLOxsǁٹGѧv J:i^X$d~ :uWmaz\աU]Zw(Ry3JbHŴ7%uVb5_9lJTH)^5mq:aIJ(tifXlJDDp1!k`n3 ߚ,<-[Lݠd7,Z*"wwx=Rh<U|,H-ɑ=8PR#kIx GoӰI#N cUiqL *GK`5rœ9?0|\5I0 j?VqeN`;۽Ѱ(}+4lgV֝ y6 v_BP2X)9., +,ER\?%XsKB(AȊtmi$ EYgs`FQr}GUzߊj9Eٙe0N3ƜKսbGWcܩ]tE^OJ'Bk^@'F,9k&E;1w}\N8LG-ѲO#}Mn+EҠ̋]fz&Y4kw4@I=('vSN?[F>U<|oFix]ЊhCAXuS6- TZ&ˊD'8ryKx~Qz;jE@#M >Xw:i^E*: PH v o3Je2G oީGU*zw!HIb̂ V55:CrGa>,/1W"֖H䮖{j:ˍpoյ{uDETGiH,mz;ydKYZ9V7ej+ސ ՛S0X)[^'=`om4a5tvRx=KQf! Kװ5Cas-ǠblEopZgNv%&a~NNt<dW{iZ{ ON. 7&u.znhrU̧YyU0I9 YW CRHMrwKi<  g/eKYlz\'06G6k:cQ <425LXS$ CmF>S}A;=Cw,s!ܫecyLI[&[cuCb PQ"?χwi*5GtȺ+Iz3=gv`M =ݔ:'h14$GԚ~1do_"so_Zr rbO{]>BO'_l0~zJLcP\E6XAzEӱomhoYW}>wWHT%_^(_UfbcmΌ4?OYbԇ: O^2aNZe)Cݹ.kvGaj]c5] x蛏ʴ|`Dr[10sc-iqW!ך? wW3./oZ"U F0n2DڎygoxwբȬX>ю/O0{DwMiHG`Ca]jKQWk 6䋅8Z}OAcIETmoVߧ1Py(cw`P4(iD?w~h#PFirSK˲9,_ohU`G[-l=mẀ*G"] wWV찘J1C4~u'ˡnxbq6-Qvx)?^w@ ɵ$q/saϬQ٥4 JG~w|Dإ![Zrfٿn2U8'mgJt_1efL"??񏌣,"%ӣWݓDD(? l$f~"r\ڳQ:0ʱFeKfHEv1^Q~ㅝԨr]Bx)>zc\_`m`WsquO5A-esa]PBOt[]c~0I=p_;*Ȣ{E T fy|%|Z#UA.o)ؾ0[ Ax je%Etfmt|9Y%[X?|3yoҪ(n_ bV<\C31hdz})e)֍g@Ӿeå8CvjòiBBFw–' uGPCOi4Zsqu1@a-q8j9S]r1O8ȑعr-8|X*ޭ:C)קݑdq巯~S ac;lqւ_5~1a7= B, !i3tq9|*K ХUNlqѪAFSW50O0hGe<5[ҹ*8H9 mǦs4d XZwΨ!(T:B`VE;~t(a,!M(EƆ:~zT^ wϧ%hr{͟G̡W*_\* V(ƀ cxݑ*0^!މ‚j>@πևl}T >ٟ}-! Ǜ5m4qiOˋ?`<أlOFzyf8q #ú6XFsl-e(8J٫v܈IOuʗE:o?nאJ'3óՃO7]OLԏH^dxɤՐbϜ eq/]⵲DD˥zYGrKx0I9zlɆMꭌ}esW`;3FO0@F@v~JpvUGdZhU\kK"xů?iUf[yE#wdlh~4Z0;XȅAoM~N3d4CSM{mΙ萐5n!] .@tD;я/hEkmF38kwhC,UhmםlB)*>BNRƯ^֎åH,r~p vGnV̈́eig-7NS/5+9¢.ϖ?J}ܷEA2v hPmfck{}[.FW=Tpg(oWY%w7H&3 &uDk8qhXHN;AJz]76M՝ϛ3Gj"ܳtFjojfr ȏaƄͮ\mgj.qޢ ܦS*LvRH4ȪÉm^@vb.] I߷^7#@9(^̂za<&9=uoo$(Mz$atw 'UL$'"-cQw"vrR1T4kt!,roE3cqIߘRKbl]`^A'b7GktҬv6{Z<"U`Xw 9@o.yBΨ4G/y0KޝA*@܏Y$k?ݫRW Iu18ٹ:#wf2)m=&|G}?ь 8 "zdA$лm4tNX 8mJae!b`6"745 ˜Ok0ڳof `? XLE 1g*c,ԌfF|';N9|+۽y5}c NόxE,IP`s [\ YJ)6B3) XW6bż ^A= X޷r̚TVj6ylڌU_,B*hVtF`aRLIx-)K5*\c6-Vwj s\ qLʁAAS|B\4BcB35;<6b(vʍߜo^vy,R؍(h_N.X²òkBY"4b2YI]JJy :n# "A6CkÃ^k"G(lܿ hmKBgE|} _)eR& II< 7b( : .Ir=j;s;y^ Lx) T)!Xx1aScQvF"&/"6fMͧ(--|=@ `I&x7|kj*Z QI'Cힿ-ʦha|o8"cUB8ÛZQVj=blcxv) c]YH &$+q!Ps5 оɛSO?RY8L\u+t￲]~ؘZ-/&G"67U3N :"΋t*m,y֭|K,#UxY${͠F9ҁA+ w$AL=@)t[n}t2;LM=W_a\a$'W+ފJ<53PZ[Q6$N8l,6ݝbHFְqkVOV,d:h1TLMaHH̵pL-O![VUurz>Ry 9'yc͖4(->|U,W~*_CtY?=01Ͽ-~.޾|[}~-sq}nj 锺*T9S8UdU.dfN>b[b0@fYsij`ʾ }.e^IM# CKGwkjxMFDs1pOUP΅s7pYlN1n񾇊_LOD ][q;Ĝ:`3+TA} UoRa8jP"A_]%6(׎iB-Lꏿh}z t?2E+zn%zɭj+(iWɛTkk!!m^6KubG^?u[blH( 1fn&m|Gs7h5zH[d^ڜ^w0~WtŖixr|+Gmc%1 vP.HHC/1-y ґXח08eh Z#ucWI4 *DLoJ.,y8C\Ru̅7>tYk/2"ܾپ0OކN6Y4X!_tg$3-*t>lwkh)psZJ#i Ef*trZMbx[uj`%lf2GiNh r`UF,m?+Wp fF4+ cpp1+x6a#zXzY[u}>/bm1~?Ӑw%|uiߔ{){*QR'G6,2%aR`f|[W:w?19 3F懶ce%u@ ; ~ha 1T^x4U却Q5Vi/̛H+m'їSEcvY_TkHr6.1Z(m#s܃_&M2eYy%i)M3?V[xaN;yV A[b0I%rmgO`_TR$3~+F(sMHFM!0]1ol76z?`hWdv"|t|[%:=iʏBؘm4ej3_ER,;Gu?$Jiƫ8:f ZXѴyg#7aݹ ?~P΀v8sdVB_/Q=w EM2Rtzr 4x,gmOFt"B*9g x'4/ V՘K^kjp>|Qmrx@ga7jm׎`<0'?5.Mjd<^*-k&Rt4fNDuΰԍ;ǖݿJ @ ~m7# ~tR=TNPZ܎2%K% ("2O?Y[`#;t Xzyxi$V.%K|ʘʘtiOr6!M"RB~*7Q9*Ӗp]jV~$x^?@E Q,؇+w<ؼ3\C>UH||HrKB@pf+3M2p/= 2ȗnnQbUhg+d0\-$zI+P(.k,^Riy cDE\^%;#co> ´}<08TCF?vvcWyE 0K{4tXּ7oZb}KW%jX4,z=KW(;$1Ymov.}VҦc)7_O.z ACް+8w~{ dI"Yl=epf1mR$s}ZI޾/=sI|Oߙ{6-`:B73 ! 42 +~I2Xpn-;M> >zN|!eN `rwHz7BzT;w흙56q j=%}Z"qϗV.?@HE{RH/Ku~ RI& =e-3s@%B1٪_Цӱs1ˌro#:GV ]]qb{lZ7icP:~$&#uQ6Ѻ̾ӱ~֩'&2V__D0In+QJ*C7xQ@ OFj7|5EV"\rƴfO*ᰟe&u$IV rγ 8@li 'OƊU7cIF9Y,}CэT5 ҢNt.U .OŢF%+Щ<۪b=e-w.Z%R:t2),HVIaWc}ʜ;}ɐ^ f1`Dѫ{2·0^*7N^*OSCnıw,Ah|JCM8؍{'!Oeq4Rcokw:K cnZqʍ^e%($wvk:c<{2xo Q{A1W #xkNЇH[بIӷa5`(jQCLH;=I܏p=$hPھW-C?]p%vc4f ᢖ%W`p%ꉵcwh>ʹG%ޥ t _Ah9{xkSy`XdC>ō2>[=*qVFi߲/S.k.3d;$t"ӬF8KEodEҐR>\JTf enI7md":wio]enA8G@YD¯qѠ *c܉ _nf&omB3h-#&0,0o0c/+sU=DV6 5a69z%v_&oOF#F-k 3tlֿ=ɍ!X2alLz;piY36K. EQӋpBlʑ:4% pWrOg њzy(f&~mm)<+ͦ!6l% &4 wzFKLCo}FudQHeř=U4BK2 rU8Ϡ\FJ =)8Tved-oVŗsz L.mI+2g@Fru'$ez'1iFUo\׺TrO"T̠z-&wr; I x Ƒo֪<ؕDY_?pW< L4͞48ܐu-p(`Fe"-rG 2mvI%+9k/\ҘkuCYx0;gav^Y؏*a >\חoA*;C.9(-,bX=E߂~4mNb~ CE8R쟫k~9l0GLT3/c# }h7[VҊ;zGܪpI^fNw1ք/h,0b=ze!ƈj4fH r'=U3@w=ҡ 3.'qZxd? :_N\Vew/YOVRF]/x*RuQdI;z}J{Ȅ0Lq5"%/}qzm/@eIF-d)hc!;JZf2t Ӛ9И k %[,QEʐ%FГgVG!/,n_ 셊&[叹x[ Hցdaކ̡v GH=<3fi_}l@ !M&5n~?ӟn9i/do]sW tm?xP4mBBws&9yLOWX/{3EV=lR'=c6*f=-W+WH&Xy+l %rM Vy7R}LL~1UxNm2k]4X ݃.FBэ@b2-㵍 LdN&U<ٷ!.D10'}5~ޭoWy:>_oSW?KäiuI>%Q?..9܎ BOm''y[oTLŅao^D^g(~wTa~:4Zt>ol1m pP?#^쾦r,I$w$:[^pzh(6r>T`_ٹVI 8$yW>ҳ*)i' ͂tZAY]|=&h[ӻ ٵ|>Q|Ԣ>/%I()G͹>DR1|gWb2j}0^oIǛ1/iq"eT.v~yc@Xo%myMHKc4w*6} ;nUyk-tB1Жx.>S͕\.xBW acK) LCG g6M\qE^>x - :.e ӷ=)&hxKOTh!Zth, +l2]A%y21#lS #*Q^,$ơJ5U ĠHwi[Gjڻ)+Fٳ6#),rB5E**q_nT.S)+AWop3?o7ҩ 8=wSv 2-:C7w,%GD:d\n3A4!6,f (q@v9 e`bևP̵KVfUfKXLY].ر77P.1mfh|:XQ9 Q jN1դORILvCq (m}xWڸ(gG!xZ-}8`ɨZK#ʙB]돯NUm Ќ1sHZsr. eAQ.sqm/{s>y$hxA豕- W<4Cϱ&q-JPқ2+PKu΀wKl7*\ &ǔiH!sIB҃ @kpЃby:x Zi)}s̲EB|zLzlJORz_koV?N_apHրUyA$NX3lدaT7k%Ev8AL,p/6-+hT -!Z7;?&{k0rnג4V Yg\?3'L) lBk ='+,ec0@֎-U˃LnU\̗btbs܎ֳ&i$~8_g."Nc tut18y>UV0 v%@tx~&V ‚Ęo5bk{6H? I:elo Xl>s%C`XfYUѸ6aVQj.YU2I6Ba[OLi4ef\}BifyDu{LVD]9%驺ewNc+*u?BenE(7#p\Ys~4nnPH10WF2l[A8.|K>]/A_ eEi/CkX;sѦ{fiq:J 0eQٰ(:Ma˸Õyp -&U39Uރclb/8d.,^G*iD+Q!~Y) qJ-O">MوH/:RgP-?F$gITV)_xú)׃ңv u +y@`(/pqDV>\Yw% e][O|s= \9Zݾ3 G5Yy7&T֓oDUu;r\4-@TL$a8›Q&2>qb?]`a*)Vg->GD?)O(&GF[?t2ֻ%('ASCEN>EtG~|Z {A}CSaQZ)@g fʎf>} {hF PĤZ4#W?h- !(Ikewk Nj .U[5=\ڬMs)b=ńhxӾ.),N %q,נрOeQEy34η ]pzH:dǒͽ !evvtA"p&o[0:Z J@RB{` qBD>%W&CWx.|dPK 3*:AMNX\A'y^B ~JLSDHG(ÎG>YBҘCGнi vA`̭E&9gLx=a􃽼I :`.ůWAEU, WCKJk k^29VK ^1Jiu|fA}"a]tto+bZ' .&Z(k U/ r}0FAu[j 4Y g~P&r%,ZUz7b.< u~vL&{?Gvc g<uqn<ܙ?| 7 D0J"]"ه[1a7?=VyUo?j9@QE\8=z5g땓 +( 7,Ʀ2VEyWI!*^/)h608:uG {xF(/*zwY]-vl'O(Z 2@WzPGn#1?zb-QO&>e@$q.}Mx|@ N&*,hl)V?m{fQצ-i&m$$v J1 ,Y>AToH t x ^sn9Y_ M d 9v`/PqWs"-vqΆ;aVpUMuZ sU@R,?ƹD접Jiڸiqud^qB$Ԝ ea wmNF)33xA- ƆBv(k+Ч5Qw`(ӎFz@&E eb[0/;XAq`gۑ"6>vkE 341|`<ֲUd7PqYHxÎyc>$N)?Rv5>w=#HfpU|+%B͠*km kCyMg<3/|F4h^TAA/1O'aׂաܶZͷͯЗ2 {g9J/&mx;w-*y)LLP 2X Y آ_Wm$-i74/t"297OB!Y;-U ؃}'dRoֲ&|dI]pG ӏLI!Vц?/_ܩhm$+1YVLnX>ڝm>J-8!p wqJUM ;1wr5 ڱ@cbmbNW<\tϘBZbZ'utAgEjJitSa18A"aq$koˤlܜQ 8M>;,kL2/yGwU Tf\tzl#_+E8D|wM5Z`U8z =Ĉ8"y f#K.@fն'A)(V%3'w ;(U 1Դ 0उL,$BnBIeĭzJ>K{.\ݴ.g`CYAB^@i#M+Ɉ/=7p}B3/c#KO ph$ݑ& t}"tRLU3G=.O[CVk[;@uEԕ,%l^s4ǰY3SZ\-g;gq `\A~bti#b:Z `U|fmCLX*SV0.z8ՀriD`/ `c8\K8,sP@Z`!WZOIS|s%HO=jRF~hp`%f~QzƧh! _Awxц~nG!Tvw.lLS]9:uC$)ZOº̗ɫ#pݔ$QU:U*Ho뼤_;CIk RU ;ơSFQ8sqV Mj(0Sh; hcїXBr ˕6T>"&Zi67~5*A,9+ $є!$7K ?nW~Yr!%t\xZ-z`mfkv u;:0mP^,hXŀtG'v%OvѨ%*] 5D^E/v)eb\nV:==9ʉS٪946- 0ᣛ6};A\X:d.#/48C3 S:ǰuW5(*j$U-=Np`~̤#\ 8@U 2')bAHR9CbNC9~ꌮm2uKDW JiEcJ@&*dw-r3%"'J^z Z@Cߤ4 k3CU6[m 27k D}D(QyqQ 7C£?ϕ9QO8o\Q𹰉%J.!gGXg5rr!f hd1@}g`iK|Z쁽ywZ@fDZ&.tw1DjIM7ؒd |Ȗ!Y9>@[sqBw]B$"Qm |oIed&[h21ZW!M"/y˓JqNnr]qhr6kΆK`.Oߢ#7UZ%5ak4BiZMQ\Z-zEt\xQ{U(h10=cVQ4]+^||j}\&-8zz}vօe}>@3XZ?n;qߟ;p";sR۴˥AEA?H?*'3qs:䜙6 (}%CV :.qݐ~It:J/ L^i#(z~Si}uD0DHvJq?@&~[-|U>{('kxyY>弒dB2ߘwLُbBú?0n7?G,≾^ f^Id<l5Gv~?5cx.u˺d1l JSC]*mm &J͠Ե&Uc~?ȟs^&ZM׷m\JQ1P-5VrJdI9jrw((vȭKư2F kWJE^EY=SrxE9XMX0TT}{B=paqќP~ځ$u==dE+Ĉ$uVIȤ]T]:Ŀ ~)^kkotn8*wO6lG{ 1*'gzkj=*I(-1-*1[ڈ'p@6sYG?Oz!nd5!Y=_C o,C& O3jH d-w9ÍPK Wͽ`ZYYnx8do/Ӊ15S!iC " F|%Z72yeDg^R;+2s5$`>𶬍3;;.*CVt@w1D톓]-t1&G/M%ņB&Rgc__^q /[`y;A+u$MOu`*hNîAO-e([7 R{8fM 1 g{Af aH].^DY![JSg5E`+ *9٨ .ScNNX_ys)z 14VT Sj@!n. h/L|zKʴóm ř4dϊWUĭlOVft=1Kp{WҜ J[-;G,[3D#S [3 D[2PN.L۷Gf{+[kC+!Hn܉uŖÚ$= Eb̊?۫l0r$-Jhme6!z <۩ H> it@`QiRhtC#I6FM7s32csf%0&yi$Xu' pfpaxT,X}e<5!&=*%{\̈a7Dիa:C N"*ыyRg5͝aU_p: 0)0gf\&w$Uu* +^lKd,EL,mwD|l vXVW :$.o5V5zүAF"{n\TY<7V+u/ק٤˅/l` Y })܄+דA◟kc}6{Y!6U#0=_ﴎDQOk^}c,asQ󄭛 u醐y<ޫ/)5 vBSNAJMC|UzZ Hkq|2y\Qz"ɖl×T*2U06{p~)r]&g s|S"+u8OKOU\ah?6E;&q@puk*N3di[]8MVZ7Bұb8g<}v?w\))d=+a{'B &@4'U%3xILad.`&۾˛K7XבU+Jf&=A ;Y*39.'W ۰=f wkD_$…O&]%QY *9p,.qާep"`ҡ9L6jg=\ 澇 <{o(AP~[@?/H-.TmyGͷi5LPїnDzEJ`8ͮםh`ģunBx+YIBi1P=ΰ v&sੜ I_JG92/ZY5W.͂JtUq]%I5OPZt;Swirg0އ fMӣwn-Ynr,Y|t?>m:a5V14Sv|xy?e(|) p2x"3tcC"-dMa~}Q)ˉ~³ <4]|-NWFJe|7|9h&&d\ܿg4DϿ͠ZCCT-p~F+ 24rlE\*CfZD4%GcS|חXФzz8Ngy-M M_Y1 x]-Os?nL;+櫠8/l[Tu[FUb_mlX2 gb+AN $2 LZÚgq4n1R~\i @} S*AE(|,7нC6ڼBS))RurV)-Пrb4Ml!ɄIrH=ЉccEkU{hEq@;IZN]cpJjL6YvF|<Uݥ#?*, OrRJ8缽เ|#h\lQ:_Ch*?yRzKb|` T9@)?C8Q2~r0j Pa’!_`OlY-4(k'2|fz/ 2ҿ+)d>6Pu%rU<%$]_\Bwv"i7I%6K:Dc-DN65s (ץJvWJko2<29-zq D_告u2:2p3գOV[o^P=|W[H6BL$[`9J$b}?*T 2ΞGœ;9;F@P]hoZ wGQQC>zIhe'K0Z>tkWi mîJ&8^;m'kDzȧ'٧@ВxEkNuʦvBV D47J^8&r9\t,iKb&"E3!Y⛶`I{HޟvmnHͣ\Xa 7 >k/~p cMWp۠4oq=ЊC{#0;Aj͍88e( XQc[y:UiQ %; ;/1ϏY1Kle~RCFAD 8FS4ő6Pscs1R=R=zKT0 Pp$rr=ӶJC?|;:X,AD{qzvYS()?S [j8ʘ =l`aϪ39;Ij~ PM,tӓ13H%7\}HH W\={ s4m z7_pRQxJ9h-M*c"zn8k}19WXG+ݵҏnŇULG*%ʪV@{"w'j3ۜr@!c _REImay ƣ(3ѽ1>aJ*{f(ci>?#  ]Bp٫Z;mVӦ\89݉'$TDgyQ`V!KEX^ йh Lg*>`n`MtGǎB15F/?cktojeG%7V3-'(mbZL!IgneLZ 5ں]Nj&W@FZ";3WͫstY4Gu,1ztIh?AP/! JXN)Ҫʘ$*p|v T ƲG6ZQ^='A˺0FZh x[F'Z`tzޭ( P ~9,p'W9$` '9m(lnQ.ynu:Dknc}nюvlG|ϟ:벲ip!0T$%iɞ.Uc+M"G,5OLg3rF1|p=M%LbEM0G$]Qb6Zѻ0ELo7E`Z4nҐ=Y^ZG?h"B./Tj?|NÀ:(*Iܼ2N)>hf}a,^IRR# B1c$-Va['QC?Q Oʙ };zcCқf9Rl^Lp.Zm'.3 ҳs=쎏ݭNOG}CrDy6w:OX:?&1 k;A@mA;b B4ڠ!`js'$6I'pMKȤZ aVD(J?Ajo{PJjz:,=+>yh^ zPOXw!2 vΑi`*onjSlYUަC(ÝV]d5ǻG%v86|80B0UM9O["nߕL"'AbAt@L$9樯PNF'hL .߭BBu %ABǙtp zZӒjIZ,ˋL1)x$Mfa8 tv5@=g*YL\4-I}_LR~CQțԖmv @|ci4naq*o},E݋r:]pgkEIy?L9츈o\DeS߭m#Ϟ(qE,#p“~ׯU]<|]A͕4CDQx#W;q뜻xUe|Ó֥[0A ՈmmҞEY) ^(Hz1VKATK`4y*i1ق$>z_zhT:Yܿ!=8a\/v)f<ڿ!tP W ;s+*",gF $[UKf*q +Rje'̃iiCj! }(P*~ M JX(Z,@JzTL)Aġ]g8-;A$t^U (lN#C{k$QH7vv|P²zMx)wwq`SL7LY0hbY}("%koqwtR%@mGɿ[еN, ?Ir!Ũz۩Zs8d= -߶ E!1N3dXh@i9s:cQIu"a?>QI]FYWmm  HN7@V`6Y#6N<>r%ZMƐi1O\O(xhYAuR,ZHb9QSݢG̘%+ CDY"C-jr(09XYNT8\  |Cj!IZxKGh3M~&-)$2e%ź`b=0Ku܊ baXh{`vH ]llڋ2!n,Cl(+P&>3ryb_\a;NIsoxhѭ;dhzG]^ 7S{=Uŭ!9L䘤;@;Zc'ddᬘDRx[Z vւÛpGO)b849kqwA@Pr(d1O]OT^Ža}!oj@޹Qu_s7ژUjy6b zBАmHY?zM笵X̳¶y"#);THI 7?],%[V VTe;DWvO  a7r !nt6T.}\d%x Γ99kOU sӎk'*N~i 'igI/ZTc9HXJc8?Ï:A!ycMv%#⭧ةȖel@Jqf{`[0ԌMI/!l ¿Y=m_#d:vӸl&pIеCcx]}h6x_3RCxi2]n1Ql薲3jR|*+>B r4r5Ekƍ ruL|òՠ$"vKbTA)o(q?;'8IuMlP|98+/ Hϭ,GqzX}Rڱ Bx8SBT T7Mu^YQ^RH󇒥(;z8;:Pj=hrgiu a]P (ށ/5dJ>ϵE)xoe }#{Xk3c!yx4ިda` Az*S80 D-TRi~Ohx1^zܜh@ .Pu߮`DS(fGA XL 7bX>؁)-t >ߺ ?#1R l=?ACEGIJLNPQSTVWմ\nr?j;=?ACEFHJMNPQSUV߂ڵ[nr>i9;=?ACDGIJLNOQSUݷ\qr=h7:;=?ACEGHJLNOQSฅ]qr=g57:;=?ACEGHKLNPQ܀亅^r=f4679;=?ABEFHKLNPہ溅^r=f24679;=?ACEGIJLNۂ溅^sr=e01457:;=?ABDGIKLڃ]r=e.024579<=?ACEFHKڂ湅]qr=f,.024579;>?ACEGHۂ丅\qr=f+-.023589;=?ACEFۂ丅\or=g)+,/02467:;=?ACE܂අZnr=h(*+,.023679;=?AC݂ܴYkr=i'()+-.014579;=?AނٲWiqr=k%'(*+-.013679;=?߂կUgqqr=n$&&(*+-/014579;=ϩRdq?rrq|#$%&()+,.023679;ɢK`q>rsn!#$%'(*+,/0245890\pq=sg!""$&&()+,.02467ۂ`Zlq3589;=?ACEFHJMNP۪i2367:;=?ACDFIJLN٧i013589;=?ACEGIKMۤi.024679;=?ABEFHJڡi-.023689;=?@CEGI֟i+-.024579;=?ACEGӜk*+,.024579;=?ABE̛i(*+-.024589;=?ACƙi&()+,.02358:;=?AԾ|}k%&(*+-/023689;=?Ӵyqw$%'(*+-/024679;=Ѫsrq#$%'()+,.024589;Ξlof"#$%'()+,.023579̐bqB}!"#$&&()+-/02468ćx>xo !""$&'(*+,/0245̴suq !"#$%&(*+,.024ɡl2i ?!"#$%&(*+,.02Ǝ|c2Xy >!!"$%&()+-.0ǿsT2p =!""$%&()+,/ƨk1j 3!"#$%&()+-Ï{d1^v :!""$&'(*+ü{qZ9l* 1!"$%&() ~f70e{ 7!!#$%''v`0Yp{ 6!"#$&'w~}~~lU0*f}~ 5!!#$%|{{|}}za'/]q~~}w 3!!#$s{yzz{|mX/Gg|~}||{| 2!!#xwxxyyxcC.]p||{zy|t 0!"pyuvwxxmY.Kezzyxxwxތ /!uttuuvwbH.[nxxwvvyvݍ .tvssttujWJbuv'uuwwۍ %wvsr_F-Xivuutsttڍ %utsgT,A]rttsrrtqٍ $svsp[@Rcssrq#sx׍ $zutsbP-Vjrq#rt֍ #vtskU.H]oq#ttЀΆ%vvsq^HRbqusԀӋ!uwscR.ThqrtvӀԀՆրՀxvtsjT/D[nqruzрҀӈԀӀ{wtsp\DM^oqrt}πт҂ӂрvtsq_MQapqsu}΀πЈрЀwusrbQ)Scqsu|̀Ίπ~wusdS)4Tfqruý͆΁zvtsgT4=Tgqruuʀˊ̀vvsrshT=@TgquwȀɂʂ˂ʀyvrsiT@ATgquvƀǁȆɁȀwvrshT@?SfqsuwĀŀƊǀƀxvtrgS?P`oq uw{ |xvrpaP?)KZiqsvy}~zwtrj[K)AO_nq ruw{| }|xusro_OA%HUcoqsuy|}}|zvtrpdVH%5KWepqstwy{|}~~}|{ywtsrqfXK5:KVdoqrpeWK::ITalqrmaTI:2ENYfoqrpfYNE2=GNYdmqrneYNG= =GKS[dlpqrqld[SKG=  2@FJNSY]bgkmoprrpomkgc]YSNJF@2 3=BEGIJJKJJIGEB=3 ~}||{z}}yzxvvttuvvwxxz{{zx}|zyxwvusstuvxyzyzzy}|zyxwvustuwxyxzzx~|zyxwvustwwyxzy~|{yxwvustuwxxyyu~|{yxwvustvwxxys'|xuromkjhfgghijknprtvwwxx-}x}{ohknqtvvwxv vhlptwwuxr |ilqtuwwvu# ujotvusvʀ hntuwvuq& hntxutsҀā}jptvurs'ńārmstuuqs)ǀƂŀĀhotuupq*Ȅǀƀqmtuvpp+ʂɁȀlrtuoo+ý́˂ʀhptvoo-̈́̀kotuunl.ς΁ontutnn/Єπpntusmm/҃рЀpntvtk-ՀԀӂрootxsj1ՃԀӀkptulh7֯madpӀՀirtutjk ܳo^o׀ltvrg-ܘ^}mtwjg,ᙋ^$ootutg,㵍^$hstwoebk^$kmtg5.\]^$optvnd \\]^ ktufE΁jZ[\]^%m|ntvnb܃[YZ[\]^%ahtueɃ]WYZ[\]^&antvjajVWYZ[\]^&mhtsbUVWYZ[]]^'otweTЁSUVWYZ[]]^'jtun_ۂaSTVWYZ[\]^)kvqtuaRSTVXYZ[]^)ltwdUЃQSUVWYZ[]]^*itm^قQSTVWYZ\\^,~pts`kHgSTVXYZ[\pltvb7ȃ粃gY[j(htugYт+wqtm]ق -ntr^ /ktu_ƒ/htuaHȂ 0ortfU΂0}ptiYӂ>=?ACEGIJLNPQSUVXntm[ׂ?<=?ACEGHKLNPQSUVkto[ڂ>:;=?ACEGIJLNORSUjstp[݂?89;=?ACEGHJLNPRSisstr\=679;=?ACEFIKMNPRhstts]=3679;=?ACEGIKLNOgstt^=24679<=?ACDGIKLNgst^=024579;=?ACEFHJLfst^=.024589;=?ACDGIKfs]=-.014579;=?ABDGHgsr]=+-.024589;=?ACEGgsr\݂=*+-/013579;=?ACDhsp\ڂ=(*+,.014589;=?ACisnZׂ='(*+-.013679;=?AjslY=%&()+,.02458:;=?lsjW=$%&(*+-/024679;=oshUǀ=#$%&(*+-.024679;}rsdR=""$&&(*+-.024589otsaJ`=!"#$%&(*+-.02357htsr\0ڂ< !"#$%&()+,.0235lsnZЂ< !!#$&'()+-.024qsiWǂ 8!"#$&&()+,.02xtsdP 7!"#$%'(*+,/0jus_E'܂ 5!!"$%'(*+,.psoYς 4!"#$&&()+-ushU‚ 3!""$%&()+lvsbN_߂ 2!!#$%'(*qtsqZ0Ђ 0!"#$%'(yvsiV /!"#$%&ousaLG܂ -!"#$%usoY$Ȃ +"#$nvsfR~߂ *!"#usq]?͂ )!"owshU &usr^Eς &uvshU߂ 'zxttsq^Fʃ -ywuutssgT}ރ ,¿x{wvvutq[@ +º|zxxwvudQYӃ +~}{zyxwoW/߂1ã||{zyvbK (ű~}||{hV[у0ǹ~}|qY1݃/Ⱦ~zcI߃.~iT .ÖmYQ-—s].h,ѿx`<{τ+ӹ|bHЄ*ѰeK)˧fN}(پhMv'ϱgKe߅&׽gAN݅%Ų}e4 $Ƕ{a|߆"ƽoWR"i: ވ!s^Jߊ-j7j߀rQsߊuZsv]e߇¯sS/zijzh'?zɺ}k7d~Ⱦt[1fy~sa0ih32qvxyz{|zvyzzy{~bvyyxvuqonmnrw||txxwtnjgr}}x hvwvsli mtuvlk ǯ lqupf€Ѷ!lptnlγ#gnumpݾȳ%Zksmp˸%hrojΠ̹bpue}^~ʴ5ftkأ^ۿb`orkځ]^жbtk[^ྂXhshWZ]^ɫ"^omzVZ]^ָ _si窃ἀ:atf$vRepq"ǤWgn|>CHLPT!ͭWhm9>BFKP!ϬWhl38CHLQU9=BGKP÷38=BGK.37Thu}ÿwjT=CShu{˂ |viSC@Rettǀ uueR@ 9O^sw}‚ ~xt_O: &JWfty| }zugXJ&=LXhtw{}~|xtiYL= ?JS]hqtwxyyxwurh^SJ? 5CILQVZ[[ZVRLIC5 3=@BB@=3 |~~|zyyxvq ~{yyzzyv~ztqmnprvwyvb|}shkouxtjmtvwvi lmwvtmŀ gqvql!mouplſ΀qnung%qoukZ%գmqsh^}gwpbb橃^muf5]^þmsp`Z]^mvb WZ]^juiX!{VZ\^op^ףּþkt_shva<treR!>BHLQT¼phW!8=BFKPýnhW!38=AGJýmiW!.37 Oc|  )Yj άQG`t׷ Qhں Wo׷ YvͲUpԹ~.e{;@ cxt ħ؀ƻ‰Ôvvθr^^qœ^ϹfZ^ ڽfkZ^q æ¨⽣?GNT㷝7?GN᫔07?G۟)07?vΒz$*07Լup $)0ͣ|i^y $*ńrY%hx $Ūrb# Wlށ ǾfR +\mف kY)G`pës`GM`uxaM N`sˀ þtaN  J]op]J @QbtucQ@ DNZhry~~yshZND :DHJKKJHD: x}{{zzwc |slgimrxnrnrvr¿ynusTlmpoBookΠþnoen^^lĽmiT ꩁ^ ûzlb iZ^2mc8hZ^oĻuhZ議ǿi]¤h^?FNUIJh]8?GNŹg^07?Gƹf])07?ųc[$)07ädX $)0eT $*ǾvdL> $çjZ dOQ ǠoY)ж}fJ ֿoV ܿx^  ع~a ~Ƴw[@įl1 t|gis32VXZ[`g T[cyy~ U_ƪHR]ǽˬYMOӵQ`JMŬTuֲU?B ޵Uss  %&99 JL  cc kkrqkkccOO<=)) !uu!  AA %%  ==  "\\" $lm$ &ll&#VV# "2~2"  #::#   #*W罊W*#   !#%4\{Ȳ{\5%#!   !##$%%&&&&%%$##!     h8mk 5[myym[58͉8bbRR;;PPQQ;;TTef77;;cbttvvff@@ @@ oo aa (( KK dd``NO-- ee ss OҙO (Ko~~oK(  l8mkNȓN[[\\ SS \\ "" hi ll(( bϡb   s8mkZzz[//^^{{^]00[zz[DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/DisplayCAL-profile-info.ico0000644000076500000000000041644513230230667024670 0ustar devwheel00000000000000 v (@@ (B00 %   5 hPNG  IHDR\rfIDATx]Ĺݻ}>\qwlSlcj:! y #L@(po{ݢ7#ih n`HhdPJCKm}Ci( m`( /q"4iP!JCK`( /q"4ior$5eǡQP}Oݦns 'v+nA-}ovWUۍoJKC-ua('/=B48'>5-Ƞ20<.&.DZtS2& ΣO5Ohu2Rh;c(H{):ȇ?m}͆: v~wPwOʌ7a=}wmqPeo ûxg]N"bЏgYLV6E_,kɏk[_ۡLC.0dC:a`$s,H'Uc]9 x6rlo5"/# C ߰?VBxmڼ2/p!%ৢ 쌕ȏV{.y[s Y z} >Ddb_53޼f!J%7䛆yʞn!Vغ@Y1pAӋhFU=SWOC϶; i`n桛3uoـwrV6L?'!`w:Y>@d̕л/j"-~䦃Е& З e.0mYoiWW%:orڨ H1.tB=V;r,~mhi)]JdGV P"hm =`T`0C\2BR:~Xտpд/B".]2'CI<13=٦e~`P1(r1#܃TgGx߿~? @7f xc̰M!‰ :36>A@TL @ u;V~eTz7Ji"߸%/Lj] 3X益>N2PV`N&C!SƱr}SJ7 h!HW\d/X֏xm$2*@e48NGY>'*vF&8Dg# HvX RmC!_57ŷ2?X(΁t.ʢ` >ؠW6?<=aX3ߤ3;} z@i8i䘱@~m&X|@(}mI./v47!A >Ge?Mg_r 2`B7n߷@~ H}!3N ,tyc,p=YxmobvA]/"L=aY?) y#Ѝd&uYoBQGɈbEp@t:\ȏ%'wcr8|p?U1`bFB}R6a$3蓴?);>OB_}z6!&_l="%t&n܉'_~m}mKOW~{Q[dARgI@e# l1'N#aB(q>xi~UJ{A%A7y IAWѧ3ف;X!19È:? YHbz[2ju"e*KR5oܵ7(6Z)n$ caRI;e%P>6ؒ T{2.MmA! %;>Bu2f\`o+@V,Qd A4lBBMX:80 ;R="_w~)b_ 4Ӎ|ʢl=YI0@:>JÈJ-H6\+Ou 'P俨 :NKZ y2P.D;rz6"2،(X,0 Cws<o|vpks/@_Ͳ(c>/VdAq,FUm =}R:m TG o2uoY<.\нzͅDb^Q^V=mt5g: ˼ncwpk!7 b(N@&aP}Iq#&ɍ?{,6""`,2yd@TCr6w͈rlUeA6G NހL"vV&u *z}t= y*aP}ڏ+QqP#MW>|PCA0 `  M|B/F@C:ε VA,n;h aw+R"-FdG>?/Ծw"5i#ҘU+ 3o]W $\pW\3  - ۆc` ocID@ؑ"B )VC=R10D̶qd\ZiÊ范t=|Aڃ7cC "l[>a0x$p[x!`?\ rL]'+WI`2$,?o~t̀VoXѲz£,s%4tCD=$Q;S1[ tdnXKO?/;{ vxⵇǚ?m{zaD~L)cI tA*` ۨO[~+ *w z`C'ڳ  q @Q'hoHCwGq~M-6'/YQ^q a1إt4T |k5[AC6xzQ~g}D# |W!L`a !w6D^[ ߈>^/V 1ho@w[: .{]91PV$iT:UCt|,S}+@TeC?^3엹apT!kV ]kas- ~ -֦٧e.̸t6'v~y<v+wZ{K}L7 D[u"Wo':(#Űj+`w ^%}'[#M$ U|7 )]Ie=uM,ppˏlČr*KK<t>;VJ`粑P[XL:1Uq@ӓ "_V'V2 L ,hX$Eqg A1Jo7wmM-1jx^p0@;@[c-?eMv(@i'UeP춺Q>6y~7닖m@׫Dn_em$rBZ^Xeڼ@vҟm@o@KC3nz ve/?:YaPt> zaJI +X}=<[1q @oNo~x\ t^ 11Ѻ̳тƎUPױO=un+}Ҍ ;@!ಗ="-DC|~>\ݫb 2X}~/ݾ7Ծn b y `<,a+zAu$;`}{DbOʑpH-}̿y {/> ~W_! l֒GU@fBʯ+O6CKЗuMoa&W6-hiJ~}'Y1>j)-9( 輜0S9 sq2~("y!#"/M`=oy]F:.?oTlh~Х ĂLhi@{kk/}dZkp{#{/?DY2H[ْ@oo/ I#!'}3nB4 [`^'(ȯ"/eg#u"\^Y[ȽE/b쇊~m"ܐ[qw ,mO7SBÖdv-@3bKX,S(#1!k'S}pPڋ Է~ ]m%9 }843nn/>5یŞ=";sR:$1y033R j 2r_/ҼV+<`AԮed@q:8ض:yÄ8:E|;>UDE@ ۚJw߷6'W_^Z|O()K|:#e0}s-ՅkXg3'At.ODov)5 >\㗱sttxAf)hwi[KAgx6`|w䕗\`T;>TP;#wpn_l. D@h@0m0x-&Cq_wvA[[ J "|hmk[.0Co- JKV)~G8?&&VV,A[~}fS_6(9HB?hx(&|Z!UOZ:sbpL @s ]kGpPKk׿2;a6#K>kN~y#k 3߯ إplGs[C!_zɃb ,]x΂^m>ߓ$1fO 5aǰ 6!+QR;򍼪ʽ,MJo *F^ŠRzS HbA1uDoo@vz <2Ѝ5P*' 5t7Y(7b$o[-hlYqCϺr`|_QzQQsZ-aյw~g>E= K 6o0/"/XVd7, 7:[t6׍z nj| vB1ȿnzF<]̏&ۋό'rK oQ~b9f45פRQש SCSHwxkM5i&h -KMr V\^ 50bӈpȋE|ZɆ} wO B, _ېYV V}ޕK9[_H[θւϯh~7Ռ܄7Ϗ n]~^n 8m@#hnw J*aw1Jn-Fԣ;aSH  wg'@ƞ׷}s;"XH[oeך') 8?BwW'LE}E<7|z0/cJ^zX{N 5x 'vL/*q|@>o=ȧ'E w4fp6_-ԔF@_<+!xo%דb큉%0? dU'E f]}ëtْa=mT?aiz8t"ExV_$Jey3B+ Dv1to_Gu $Uఫ(*.j}}*97X)ɡNgryݑzeӖ&O=>*QRqE)7P _`n[^۩,B8c˖|?|-SӔ'Y;̘Iߨ"E"^j~!I$' 67wʾDR)֬lo lqVW}(-e K~cʨ>?CrʉA%s û/F~} ~6 y9.*Bğ6,<΀֖ uwa<vP0܂9 v2ͼtR?Wb0u8G Ȣ8ZK[܂?:vWawg\q @/:E7 $Yi2SMTa>gxOWtX}}C>_"-F?wi5.c/̞`_jy56I4hxTmu᪨.Fkih[mmmPUy^[/;*?/` N֮m_dɺ]~d"NaUb٪~=0sH(rdj`, .(pc+gէ^0haX[O3=f~d@f֝B{x@-S mBCC}:/=s0N{iɘ15i`=&N% W jd)lB^c"7]hois;&ئPR^{oeu#Q@p?Zd_/w??յ[?$Q`0ZX jU4A$e̋-~?Cm<'#G|ik݃m }\Q|}YD\2}_{@- |0@ x rQ{:,://jOY""I{X:r7[ؐ<Pa]c֤P#ȉ}C~2H@^4ew K ^BX|ܢmGN=8~FԱ |(D 5"HOm]L&cre+R']'M b^KoUTm8 U&1 EwoMwoYY(o.1?^}]Ĥ>r%׉{:`78wwt&?B l@]9E~`{I _qj Gt"k*/UE?* .GZA)ul g:y0*`0܇V:fT+Ya8v$0?0ԏ?JO$O.Tkf@G{uH/_Uԋm$ -?OfrdžS^^oXP~׀ի[<Ƀ{4У&K~ ЍHW P\.@{ϑ tkiw#pOܡ@m鿇z=韝MO7VRDaϡg%$r뺠c'*lc -1L(*rK ~KAޞ?ۋ?~??fzO->m1u<5m@&dƿm6?v_]rtu;6 !M4 `7]k vAu*ZxH*6.| ULwd9n?L~VMVpJݼ:\^=K?@ v9U>?A@@C{o~fǧ 8܃ڊ4|d5\x[ +Uuꫢ2!Im9*`j+Wi{7mHO-tx1xp/N_O71j|ߠJZ mxrbD S p׍~~M5 )B[vw;g. щOX @C? 0*`"((s6I æMm:?o,xaiر9|OԟZĄWUr?#C.lo4 /W 4dW"wxѧ-<&r sQpqFh]@Lֳ|K}3*vcHm `.4ߏ>9+6 iȝ`3Kjj О:;ѵP<Gvw47`5՛-H\|\/IrO%jejy~Oa@jQ)𭽼,۠_???W u捋Z$W[&[6qs^,U@ϼ,uA^i%-JB%V#?KBPQ-^ouU =JW~țl>? |/H('*&xohORV֫+Q$s$CnSyMA&d?#S4Y< fM3hc6P΢.8xpim(-Nn@/F/SMmnʝ}>?7XQaX$gG}f٧gπOfCYy :~-PZ}|I, f_ L ̂N؊;N-u{3v.bCFX\oH@neq`yB^?:Aׇ׭~{O7];vdX{ӻ^@wXWBEe8ppPzvqxҎ_&xpT@'l[ aT7uc7N08H)_EVԎ:{?G7~WZOձb"+O@O@JтY,61s/R޵?``Ѕa+}SqEAd~60 w}-t- `.iuMyxN@``69J&5{C Fs{eL${{ᨱ!gZ B^.&&#[6U?EnTbZ3hӑRpdET!PPXr())\8{xONׯe-fތ XV".Bn@"܀VƗ`#!y>ufy\~9 չqػ_?fAkI@ 0εJo_ۋdKிn1 3|# QoWU|W$7|0A+U +r.ɃL MC:5@lc sܙ"Q /WQ;((( n67d"\7#O,D%sS?ooib WzwG4:/ȯʲK%2d[|v/:'+YpY>@[a9QA@f_'=vsgs 77J;OW@4m*%{S,C`঵!k!2Oo"Q vG*1r~AMFn9^gdArdc}䗲~~d/" .eՏd_ݶ^@03lG53RA*L!  [_D^ ಁ?`^[{YXt.QAZ?uÙH_nހ;aƶ's B?gT^[{y߃ ^[ UHi*" E<!>6HDR}{_v?< `U _+>8m՛m_om=KYSy\ ~X* rvs[ ֭o+gD!MV{&훵/6mmj `t} w^ Ժsۯ =;;6lsu(+,.q;u3 ):B9_N|@D:n@^,O|#Ns?M7 N0y5AAGxUp/p4g[T Ч?O|K/A1m4 nA{[<˯%@G h`o8Psb0`ؓ$gO.'ۼ6j IA7x[y@v>BnFi>c}A %[3sKkFܑW5\܃D`a0_S&Ur~KL['(,S)kM2[o&xabxշyA|\Ro>0CY~17{ ߪ'۪_)t9Й% A0guvwAsX7^psM7 ϟ嵣.{lɖ}fMǸIu?궠/D2;:I&12azpaŲn:h >@^"yjܳ;O̤O*#ٶ:ǧ֜Y-P'a $ 0C֑[}Yw}7`/|+ǎي{SlqVxVmls`l }x^>~ w%Ϝ-+\n{`PlRJdY^pO^A؛FW@4lx vI|#θs/Ќ@aبo(y<Je L('춰,Y~ )>)/~Y"p,e"֜ܲJc_SrURY?K5? ~̚M+eyg ֛m A#CM]6rGe?#,?o信j< 5`'Fh .Ddxu !W&cbOU g?%V^K Z=Peg8PxNvcI|kS%9<~[Vnʔq޼;T*U7^^wo.{lޟx \NE2D YT.Xs @= y #nh%htϟcOsUK?mL _C nx#  @ey`*1ࣁ>NB YUZFxZ%E.AȥRn#!]Xy wԯ{LW :ҰrMSοЈ^ }R5nX+- {BR] F` n:ഋF>@^^<z tvjLrrEY(#o,8JB n@lmX=ˆsꐭy];$(*/b'n?ɰT{sH~ot5T.uhe"ෑBuzKqc6*ԉ|B3PHvw4@zON^>o_;^oE@8gF kF{:rHS5A-d* c:*[pQ #mD{$7@T X:|~Xl>]m٪#ϽAP}㗔az{Sd?1ksE% 6$Oy]V ]쀟՗ <춄0t}~վn=-xg! k7^v%q9gZ>r̷rKzp,DŽj r*Ab壂~0I8}1$ g$~͑ݽ m$qS-<ҟ7U3T oi,C>믳`x/d U!Բaξќ%_L n3B4>m t"Ql\+KBЉpڒ@`_O;}bxF /L^W~aH?7Mo;wղ2S 6H>2jnF< x 2m;y-/!Wr"KΩ=e$Aj'8mɄT~4C(iŠ5M_gVd$@_{^>f{0u>8jױ X-S^Sk]xm~xmK(scMo,m= 7 Cbpt_@j-9soĿR-B6_/t +-L<@e !cD'N<y9=$#*9+:72pZg)r` tP[ +C؎.@Ȓ~"bްɀٟЭ8`r pSzXVZyZWoUY=pHƆNX^Ƞi'~͏^Y6r ʇ[z0Taqm3US%YduGmt!clʨs 7 "وw0Ra,j:n2TA\&}x'lK`ױ_!XRаH4zoCuݰrCOGpGT[UqWV@Ԅ]rc:͖";OD-Xa͞y'+% .N=0=eik$˻.@[Et^N3m"Eye"LVwM?uw-hjo>{P~;p-Ob r K?Ixa0ix9:*OIm]ٺ܋A2"s&_$߃zz{`Q0$ hQJ ul/a2ʽ" 83R'+ w @Q_K /E(>[ߟ2?lg2{ѴZ7,tUJ' +4?~Țny1'-^xj)-F<( Lg?k/WVئ~mBGr磛TxoE&Q \#RQ|VfrdCQ|  g m34~!6YRw_ n|Y{-,;y73' Ak M JZ@$m$C@Ֆ)ydt0br"p 2M1sΈywyQP @gmNa }Ռ?gt6Bׂ3)Jq7%Ӱludz/g*8 $D 3ދIxaBiA pKϲʼ7Z"9 @ڊ>L?0m 2g<=~4_b؁(&@psN{86Lr_7G ) PX !> 1 N@h.οy;\F섯=ss tY@:*@F&CuL2/>MM~9e3Poc<ua ԉ,8ge,@@yo,j:pֿ,-@րWշx odIj]5'Ly(-<݇_&^r^^Ї-KOq4xԝkS2Y{{)by聹Q$I;бRIC>): ޝMax]wW`a񻄝Y  =+Åh?/q\>HD $zIwALoB uRYnP˺UP@:ky:8s}n?Lwӂawt$uttS'xs">T q@/h `>L 'C sSY& yQ:2XڪĠ ~q(.<HXy̺&j "qwfE,,A90x# 7e?-/S׻I\pZ(0;d&d$!} tzU @4>H~wzok *$rsK@͵*׀Gگ4:{P|a1?#"*LBԄ =GAIabp&)I4Ö_AY~yn陀 kM ~pyX'y!`PM!%g#Fa( H"X۰B*GM-? Raw%7VIzVyxdmbV_WL;`/ s xA5THO>pp&O \)DpTQT>]WK ?~U0=)a pov@%0up( > Vn;ߏU[I+Y}&O? D h z1yt迧}؍0Hz,^ \ -S B?OdH|y34~O"rRGo?|iɉw r[>ryk'mKAک /͞i5( S*ς.Sb9țdvo>Ӄ o?Jso5Bh H#6U̾*?_:aPr'򰡘0۶׭֕m}|}ӂy(2S# 8H&`bm1LU_ss-!,hXzY}T(`^>NО\pb%nj>%4ՙLJ} ẠA@|@J ۶[>D"WmXeɿ0g,9ኂj0gLI(hU>>~XQ!xoIZoE}bA\n#?eZTrv]>5uMދAd֟e`U|E;PG sDWi[5_EYqH^&+ "!p!!?A  z7W/ ISW 늨I<WŨ.2IBmnWmzz dMpN{ߊ = r8oo|5W"Ju Q>O,<WߺSTa3820!f?'c} L D![3" )ʤ"h$Nꗟ,)PA8q>^-]yy9dIYr\_5zD¾G<5` 7 ʊ D*9Uҟ9`N=w_Q^`z u$H\v^ nIד7U? 5 @~wn+mx9DqKHٵ6Tn^:O" 'B0Ɗo $˿ٲL:E18`¹Ӏz;=KVeJ*G[1d[~8r0cT̓_Ўk@~z2yۖ.g)|tjaϑc\Q'o&K  S`T~ NP#08mZ|1t /q mj<L.a=U>bR,J XqGC}KWCHZA>C|Z*)wA[kb_%[{\A"/= 7>`2E$& jBPfT?~iw-@f^X7} ^.x$&M+æ{Fj$&V P]tô=j#r3NFkҫ .:{BՀc޳` "oqp^~fFWfA-$ (*=@uM֟Kx.|A-x`:gLxvg $ꚮ }vީ姓E:pO@"2^#JBYzAmf.(g҆dq6&2J8!#W0B[*sNPP8&/[E2?pO\W!,'=]ݟ7޷/*Q7t ;㪇V4;}*햣 +  䄠[ H@jp^hH{v"À{?٫+ O".5\H%;hO%~Eh (,(@=cK QՆ7:}|Vmo囚= ; 89?~ v,f@oW73s|M/-ke2~ι cHU341@- JO"geB7ofgy`$C9IJՐ*$vPP g$܎c:-G"N>#s ~B*in8t((3@ l@4Y`微Dp@pArn K]k͋/30MN^ez7C x$ $hH/i*:i#B U 1l?Hq  ^[ '3x ucwz{^N"7[${LvɸiIl|u^^t/T95"T*p{;=/ыP׹͞^ٗK |7]K#.1Ȏ ND7~oFaYpx hy%oP?{PQ3yD~o~8 ]9s-{cՇE\b0]H. 8_w@[~<]&L~{˜eU_ǢRۑʀCqmU箲6yAD Hm=o\v/ xS57']R\6x:ϔqH,\7c1jnIϞYM&~_,*Hb"w &U ߅p ,D0Q-QD^<` Xڎ{#?nmθc{zRpwIʇ=wf eQ ?j O@} fM-59LT4W}x^Kqe[@,L@w@@~ qW7k7~# EɋU-9?kq<ޔJ,wV 贑Hy 9* {C *x?`991K _2kKi^"U@$sn, #/dE},PmMs+^Lu/J8ߺՓ+,,"SGn}G@UEr+wm('ہ;2.#-](ܛVE'zJ)G̳$ )!Q>ـX4jjO&g8. ڻ_G  Z7n>mxWMpI%Op0\g)0%ZdW)K藃upK4B\ŻϽcȍۡ2K,RnU+Rˆރ$"8(Ve]嶢 >X=C9: 7`;TZ=!= G>rs'}A̶SYtIY6 @@>qw<]q/ |sK :Z+U;I@0D*G\2?<7/^?a`yo ݿoy[" }Oxba`+'e !: <?)-22:7M H9ZK~}}N/zS0 fTE@ >?^8^ j5合Ŝzܗ?뮇A9I\@r=U1lb |@<a"?@NrU];8wBOw>F+ʴHW&"s\ eQa@,SqO+ ?Aٮuz [ّ'niUͮEx^oAZ_o4m${k f`OH~.U~  |]Cj"P7B `O PXt) \n!t 0y7_әϔS}׏ZG[Z$o8}N޿UTMmhz9_ N:)~ܯf7aS{6@z&G EB h> H N9S"D z LMW7g ; O MW6-I $uN&dO7}q1䃅\-ʧQon7֮?g#{>g^'OK0՚GTsO`|maa@nl$wkE2?'t-D-蹷Q%@!g;P@imkj6S׋S7_$;N p?[UO*ƻj)>d_y8{;@6 .V_:>0$硪E8.a[9cuxK8\~Xy(a}Ȋ<~fח<-Ewp~}_sb1`9y4I7&MU-1w[Th&   .HTy %  N< D+<7tD`M-%$! >2ԽJ?T#ygеvLm \և~6%oX|#d)ٮM ŸSΝskeդJF[܀ #910 ~, 7!e*/3 $/:_q, 8:.y)9ҫڀ <˗C4kϒ@탤?+zNRCn pc ^XDmEOg L`JgQ}} Cgw!蛞sa<>wx6`Ot{s [~reՔ! Se=}]0Z*p /O DDޏӖm &e\T5T(h7Pe/dނ\$ӂ8Z{{_U,Oz7p8Vl"GyMb-,Œ"MAqH9$`f0[@U!kvobG*=E!`Ua W =PMq<2`, /X#`+*+ q;]+9!I $S@^"qat19_t,A[x5с߃C2~} ۃ凈b,O{zi@`  ?U@B9u cl`0צ-vKZqT$ ZyЏ+wg}U'-Td?DWm(|ݮaUWw.)R?U6Vz9!n!bӧ3 J خH\: H{P4蟚C侏q{6'eTuZZ7?r*}nB@9Vm`J}+y _*!X Xv?u^$7HO!7~~j[NmG|NǶ@T@"_tt(x}sR,ZHɓ[n異TRW}tp"N&Ļ"`ٙclx~Pg_qn8b?OWIo'7|~$OB6@ :/c/4|!>M$?4\q Us˯X ]8@pCl!PTSP&/KZ)n"3 nkq[*f?wBXr柶&V˭~X㺯D"я],6 ϧ$q; s@~ $@ &ᜟ9/+ &M%0Ota~_ u*@q;A? 8w>0YPm jjjnOÑmhy|qSs4(W5X*h?/|h gv*j~@1@ZG}oAv,' O!A18y엁*bH(PVW\.'M.V'q>BwwWFM$/p*2"*OҏP(>\@Fi9_ >ޚ6*18 ߿䧷%}L^_%0CKo-IW_:7{ נ~k %2Owm~5[hdt"Q4lb N݃J̩؇+U@v9JM ߟ7~2DZ'l*e粖 Tz{a:9샀>/Fr\cph,~??2;]7 og:Z>o8]9ryzL^W6$l享Vy@QCD(ڬ bЗVeҹm%^*2x{W>K{Ja/n}kdLJ5ۆ3G Cش"}6/ pd #K>99 H`zpү>0͗|1 836߀ ^cL^قX`-<  u.CŋnA8U"lg^Oyb(P40&xmJ AY\9UBA~nMy~yHHľ{yr,[@0O-Mwko{2ް6.Fe%P š X8%U $wL_kS&>0t> d"y/zw2oa*eg6s3C}s$h;!Xni7buȓ{ $tyqc4dVfId*2`AOU6Z'w")xj&y^p! ߃?y(̜Gw|GV򿲍C}ELQ|GnoD"w«PLxE?dܠ:hr콉H$0O8Z@g;39`~&FP ~:2T~8v(1曇C'Fӓ}N7N{ѡNʺp#pőP'V~7ZH<_j,Liw4IMCL!= ~ιp?>pG-H}c({-h/T_; Ew\bkYIXB|VAmP:M2abWMd}<"P* H|ay/0o-pfA/\xi,^_`a 'wq!|zƆx_?#?%?-`#Uz oot!.%( a%Æm!H%kSP[a#+ dDPm8`E@L479O?{GT1۟MQ'$ZF^gw|6I:?=x@~Ǥ4HqCWqDkNHz[%,U$@oj@S&-@ 4-sP`°Ye_ٰh2PJYJ}}iZg0 ffߥ:OD}I? 9gb7Ek = u7GB: X.GIU˼@cgg`@/hSџzH?5ƆK{vZ>2;K0GWtmAcdM&𓵓\y] tAS[<8Um~{yj[J<FJ_q$d#S'!yD.>扽Փ@Гk/rϿ_,}!$@۞ Wt^PStM &'@M/Nv?A( L BiN@E ({~\@ldlM Bs^YOk3?ўcw4O3 q$gww?b_px=wn8 "Jŭ9p{ йb:# s|@Ϫ 0 Ԛ;F8`Ys/qzd =9}c~NL-S]>ןg|@Z׾SWw\xde4( <RW" ~X|>LBlvT$\#`E7I|s5(ITH 'ȵ Iopwkct/܀0/!"h_*9*a.]3*&p@ 'HrK ~|| s&F,1c; \.Z}KeSc{}<c <ߔ0 Իh[@+5^_eP4bBb{?7W ձOONCIM7;#<0Nq`':o @QHm ?GkۧD'LI?#% ~lKuHoz75_;aA;o*)& hUYb) PǨ&M1> |PL %o# c23 ǐI۟2i'%~lKȵ3 Jy_}!-5pmBAda~OC$ƶjsV ~%\U> .z1"B|)S'GA 7ni q|do(̾ؖIU[+#=9HE=Q )&:W ,T@\$8U5 xC_D :5 1<1lA/7T/[d'Ww E^ɁR#rxa6PknnSj𸼧$eʠ\6D Py Lګd_&Mwh3eeU3YC18 (Ãy4 K6?ptb=?'~κ~ \7MD p7:^?k3쀺t䠊A?:4p9mӉ P-+^?'-f1_57/TPJCH;ai8X~PMN&֫O|21E=?J  D vD^Ywij^)+o;c@'ԅiBV @oMVqp,11/Lb!;9JkeGV* Wq]zJO]Ƕ \?ڴ7u]邀N۫D#M'' MuCxS"Kۯm AˑFŠ͗ ,|,qx*r9cC~d|cPI?N`INkﻧ-ծh} ]_H  tR }uՂz?JpȯJ^"4*4)MA~.މ{#Y˲u1ON7^~irK~K.'sg!-yכ͡n{jv4 ȠuFkte߶U8`$ P87kd%gQ\䔾fQl"˃w ˴#j|z't߷o۵sw#?g\"yHrU吠)Uug>k%PߦX*_]hehwA6r@_Wy[Fk7l$ sC|-s3>٘zQ^`sTON@~p:Ѓv~,%?lOdDt ?ذju]wB/ Tz}j^%x@:R~pJE0Ŷlv 9;49H@uA_F>b%`_ *3<>C~ޅJ?[?g\$qqսok9U-eaρ]q""<H66o 6q.;Hgg32?;5藫OupoL1ZqG'f[<0Ӓg\&g6)~٪kH[d<_me@5o`8\U((s-mѱ}sXb`Q]" QIhmNMA^QP8gQ˲KB4 {?}P)yΛv>YI kRBncW}֦pM#E{hB+r$ padgxmr>6 _-QTޣB|'''+3W9O'5J~' h D=.{{c"t"P)q{ñ @&U()|NL?y|lv2[DOo@nR@9,ƽ3~:^\"WoY}p8  N 8(?NqON F|p$`, @vQX@OK+uXXmKgK"19+!x[pr/1AN M'vTO{}8|&b4H i(w}%ڦ͈ZqfEV%EA=51 `cNf2g<19ӹ jR£O^-@ذq'Biow7׷A2<_ ]TQ?Y@&XOeć\G;R'2 hE "[nhDhMöhMcG< 5q{.U{lbG`fh Kϧax6!H̎v=QY|rg7^~Ud& vO^?i5Ccm4/Ue$p:@~ LnIQ1D&ɁyՒ̧=>I/eQ:YȒAukm[y7jte@@:ȇ?ZBG<}bn PlKe?K}i  |-%πnoAdpuoiR:d%@_<kj*r3S)I i񹉩TvW#Ӊg?/c$3zU236|O,4`s[Zmz xk#"u ?$Bga:3|+{w箑y0M@OX6-@u:j^@D&en}pv~7q?H@ eL glx Xb`ɀB}{mj-"u^t{\6 G*!߅}zB n=r8K#" y4`1>G=ϣh4Zrsh=dQ\aD&=k'wzw4G <x=` bpzgxD Ww^۸2=8|t\WpN;+I iZo4m 􉿅4""TD O"I2x#'_{e<ೀgQa /#'Jݖff5`| 3hpfMgA/ T@d;Yt.ieX<Â%ɼP?'y "2=: i2`gv{."2f5jH@#;d,YfL4OԦ"y@mr[&s2ϚU5`ٖ--yl(hIENDB`(      !##$%%&&&&%%$##!   !#%1.4f3a\y=s{B~EGȐIؓJJKKKKJJI؊GȅE~Bs=y{a3f\045%#!   # *d2[W~@sFJNSY]bgkmoprrpomkgc]YSNJFt@~[2dW *#   #? 7:z=kG|KS[dlpqqqqrrrrrrrrrrrrrrrrqld[SK}Gk=z7 ?:#  "/'2z=g~GyȜNYdmqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrneYNzGh=z'/2" #e2RVEqNYfoqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrrpfYNsES2eV#&s:[lIuΧTalqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmaTvI]:sl& $s:XlKrڮVdoqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrpeWuKZ:sm$ "j5O\KoԮWepqqqqqqqqqqqqqqstwy{|}~~}|{ywtsrrrrrrrrrrrrrrqfXrKQ5j\"  J%6=HgU~coqqqqqqqqqqqqsuy|}ݐօ}|zvtrrrrrrrrrrrrpdVjH7%J=   %A[Op_nqqqqqqqqqqruw{|ݚҋ}|xusrrrrrrrrrro_sO^A % R)8AKfʹZ~iqqqqqqqqqqsvy}ߤѐ~zwtrrrrrrrrrrj[iK:)RA  !|>SuPk`oqqqqqqqqquw{ءƉ|xvrrrrrrrrrpaoPW?}u!  )G]Yvgqqqqqqqqquwzݭǒ{xvrrrrrrrrrh{ZaG )N'1 RRbcqtquqvqvqwqxu|s{˿ɾǼŻuws~s}s|s|s{shcVR  HH]^opqsqtqtquqvtytz헜ɿǽżûvv|s|s{szsysvqb^KHY--8VUjirqqrqsqsqtrvty䅉 ǿŽļ~v}t{szsysxswsokWU/.\8RPcasqsqrqqrqrqssvx{ žý¼z|uztxsxswsvsusdbQP}A?U][rntqtqsqrqrqtuqr ƿľ½xs{vwsvsvsustsqp[[@@~V XTievququqtqsqtrts莏 Ŀ¾yuwtusustsssssggTT JFhb^uovqvqvququqwtwu ¿zwxvtstsssssssqr^_FFh[Ungxqxqwqvqvqytvr utvvssssststsuhjUWKEde]zpzqyqxqxqwqxs⅁ !!uuststsususvrw^bEHd]Upf|q|q{qzqyq|utn !!!"""opwysusvswsxsxhmUY ~G?Ng]|o~q}q|q|q{q|s卆¿ !!!"!!##"uxswsxsxsysyqx]c?C~N ]Rqeqq~q~q}qtwl¿ !!"!"###$$$nsv{syszszs{s|fmRXG*$%fY}mqqqq~qs㍂¼þĿ !!!"!"###$$$%%%u|s{s{s|s}s}ozYa$'G% YLwpaqqqqqs{nûýľ !!!"""###$$$%&%&'&owu~s}s~s~ssalLUw eV{hqqqqqtކwûżžƿ !!!"!"###$$$%%%'''('(yvsssssivV`_90-lZ߅oqqqqr݂oĺŻƽǾ ! !!!"#"#$$$%%%'&'(('*))q~tssssqZf07_- ^NuvaqqqqqtjƺǼȽȿ !!!"""""#$$$%&&&'&((()*)+++l{vsssssbqNZw jUπgqqqqqs~ƸȻȼɾʿ !!!"""###$$$&%%&&&((())*+++---usssssh{Ud'pY܊mqqqqq܇nȺɻʽ˾ !!!!""""#$$$%%&'&&(((*))+++,,,./.psssssoYk-XELy_qqqqqs׃g°ʺ˼̽̿ !!!"!"#"#$$$%%%'&&(((*))+++,-,/..000jusssss_sETL iPǁdqqqqqsݑuɷ̻̼ξο !! """###$$$&%%&&'((()*)+++,,,...000221xtsssssd|Pc  qWЈhqqqqqޏo襋˸ͻνϾ !!!!""###$$$&%%'&'((()**+++-,-...000222443qsssssiWl xZڑlqqqqq܎kκϻнѿ !!!""!#"#$$$%&&&'&((()**+++,,-.//000222344556lsssssnZs`B0"}\pqqqqs؋gǯкѼҽҿ!!!"""##"$$$%&&&&&(((*))+++--,./.000222344566787htssssr\x0>`"fKM`qqqqrs۔nϷҺӼԾԿ""!"##$$$&%%&''(((*)*+++-,,../000222434555878999otsssssaJbLqRrNjdqqqrrq|ѷӻԼվ###$$$%%%&'&(((*))+++-,,...000222443656787999;;;}rsssssdRlqwU͑gqqrrrߛn歈Ӹջֽ׾$$$%%&&'&(((***+++---///000221444665777999;;;===ossssshUs}WҖiqrrrrܛk뷓ո׻ؽپ%%%&&'((()**+++,--./.000221433566887:99;;;===???lsssssjWyYלkrrrrrۜi׹ػٽڿ'&'(((*))+++-,-...0001213346557879:9;;;===???AAAjssssslY| Zڡnrrrrrڜhɤٺڻ۽ܿ(((***+++,-,...000122443556887999;;;===???AAACCCisssssnZ \ݥorrrrrٞgΩۺܼݽݿ**)+++-,,/./00012234455677799:;;;===???AAACBCDEEhsssssp\ \qrrrrrؠfְܺ޼޽߿+++---...000222443555878999;;;===???AAACCCEEEGGFgsssssr\ ]qrrrrrآfز޺߼--,...000122434565787999;;;==>???A@ABCCDEEGGGHIHgsssssr] ]rrrrrrפeܵ...000222444565877999;;<===???AAACBCDEEGFFIHHKJKfssssss] ^srrrrrקeݴ00021143455578799:;;;===???AAACCBEEDFGGHIIJKKLMLfssssst^ ^rrrrrrتfܰ2224346667779:9<;;===???AAACCCDDEGFGIIIKJJLLLNNNgssssst^^rrrrrrجfݯ334656787999;;;===???AAACCBEEEGFFIHHKJKLMLNNNOPPgsssstt^]qrrrrrٰgک6557879::;;;===???AAACCCEDEFGGIIHKKKMLLNNNPPPRRQhssstts]\ݷqrrrrrڴhأ8779::;;;===???AAACCCEEEGGGHHHJKJLLLNNNPOORRQSSSisstttr\[ڷnrrrrr۷i՜:99;<;===???AAACCCEDDGGGIIIJJJLLLNNNOPORQQSSSUTUjsttttp[\׶nrrrrrܺjБ<;;===???AAACCCEDEGGFHIHKKJLMMNNNPPPQQQSSSUTUVVVkttttto[Zӵkrrrrr޿l̇===???AAACCCEDEGFGIHIJJJLLLNNNPPPQQQSSSUUTVVVXWWntttttm[Ylγhrrrrrn{}ptttttiYmWEȯerrrrrpmortttttfUE}HªbsrrrrrfhtttttuaH{_srrrrriޛktttttu_^prrrrrlֈntttttr^]zѿlrrrrrouwqtttttm]zY?ȸfsrrrrrfgigYYY[ZZjljhtttttugY?kc7 btrrrrrjgieSSSTUUVVVXWWYYYZZZ[[\\\]pspûltttttvb7ak `qrrrrrn|QQQSSSTTUVVVWXWYYYZZZ\[[\\]^]^^^^^^^~pttttts`^ilrrrrrrgQQQSSSUUUVVVWWWYXYZZZ[\[]\\]]]^^^^^^^^^^^^ittttttm^jUdurrrrrjRRRSSSTUUVVVXWWYYXZZZ[[[]]\^]]^^^^^^^^^^^^^^^^^^últttttwdUasrrrrrotacaSSSTUUVVVWXWYYYZZZ[[[\\]]]]^^^^^^^^^^^^^^^^^^^^^knlvqtttttua_jmsrrrrrhSSSUUTVVVWXWYYYZZZ[\[]\]]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^jtttttun_jTeurrrrrm}UUUVVVWXXYYXZZZ[[[]\\]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^otttttweTbrrrrrrrfjliVVVWWXYYYZZZ[[\\\\]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^mpnhttttttsba:jtrrrrrl]^]WXXYXYZZZ[\[\]\]^]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^abantttttvja:etrrrrrrf[[\YYYZZZ[[[\\\]^]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^abahttttttuebRntrrrrrlzjkhZZZ[[[\\\]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^mqn|ntttttvnbREfsrrrrrri\\[\\\]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^kttttttufEdTntrrrrrnmì\\]]]]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^òoptttttvndTbb5gsrrrrrrkkoj^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^kolmtttttttg5bbe?nurrrrrqfɰ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ɵhstttttwoe@grsrrrrrmn^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ootttttutggjurrrrrrk{^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^}mttttttwjÿggnrtrrrrrrj˰oto^^^^^^^^^^^^^^^^^^^^^^^^oto˲lttttttvrgnkjssrrrrrpgȭmrmabadedpwpɯirtttttutj¼kĿh!ltrrrrrrnikpttttttulļh"j]rvrrrrrrmnoottttttxsj¹]kstrrrrrsmopnttttttvtk¹mmrsrrrsssmopnttttttusm÷mĹnnssrsssssmno޾nttttttutnŷnŸk.nttssssssnjkݹottttttuunŵl0nKousssssssogh۴ptttttttvoŴoóKoTousssssssqklrtttttttuoŲoIJTp\putssssssslpq߰mtttttttuvpŰpİ[qTpttsssssssnghۨotttttttuuݿpƮqĮTsHqttsssssssrlqrߨmstttttttuuںqƬsǯHs0ruussssssssoi|}jޡpttttttttvu׶rƫsǬ1st˲twsssssssssmghۙntttttttttxuղtǩsǪquvvtsssssssssmg~hۓntttttttttuwvӯuȨqƧv\suussssssssssnitujސottttttttttvuجsǤvȦ^u"vĩwvtsssssssssspkh||i܇lqttttttttttuwwթvȣuǤ"rxluvvssssssssssssokguvhlpttttttttttttwwاuǞxɢmrƟvxwvussssssssssssspm}jxg}n{{o|hwk|nqtttttttttttttvvܤwϡxɟvȞx@x̞wwusssssssssssssssq|oxmukrjoimhkgjghffggigjhlinjpksnxp{rtttttttttttttttvwߡwҞxɛxɜ@syRxқxwusssssssssssssss~s|s{sysxswsvsusstsusvswsxsyt|t}t~ttttttttttttttvwߝxҚxɘyɚRsǗuyRyŗxxvtssssssssssss~s|s{sysxswsvsusstsusvswsxtzt|t}t~tttttttttttuwxܘxϖyɕyɖRuǕy6zxywvssssssssss~s|szsysxswsvsusstsusvswtytzt|t}t~tttttttttwwyԒxɐzʓyɓ8xzezxxwvtssssss}s|szsysxswsvsusstsusvtwtxtzt{t}t~tttttuwx݌yԎxɋzʎzʐexɏyzdzyyywutss}s|szsysxswsvsusstsutvtwtxtzt{t}t~tuvx݇yֈzЈyɇzʊzʌdyɋxz:{s{zzzyx}w}vyuzuxtvsvttutuuwvyvyw|x}xzՂzЂz̃zʃ{ʆ{ʆszʈ:xɇz{?{d{{{~{}{|{|{{{{{{{{|{|{}{~{{ʀ{ʁd{ʂ?zʃ?????????????(@     72)r9h^BzFHёIJKKJIHхF{Bi9r^27) R)E8AnH~ΚMU\cgloqqolhd]UMHqAF)R8o8XVHsO[goqqqrrrrrrrrrrrph[OwHZ8oV s:UWIn̩Ucnqqsuwz|~~~~|zxvtrrodUrIX:sW Q(81HfU}coqsvy|ޖц|zwtrpdVjH;(Q1 }?TiOl_nqtvzڟLJ{wuro_qOX?}i  (I\Xsgqsvv捽۬ÎwwtrgyX`H(  =%%L\ǹ\tmrux↮ԭyvsnz]bM.%J(  T*0-O[ռ^qosux߾ܼyvtpy`aO2)R,  O',(PYؿ`ootuؾɯvuru`^P/(Q) 'PVʿ_ip~tv㆙Ծ̶xvro`ZP&NQ]doysu䇔пʺwuqj^VN FFh[]mrszt|၊̿Źvu{pc\LHn c220TTghrutyzɿ}v}tojXT32c0SQbarquvru ž{t|wxsdbSRIFU`\rnvsvt햗 ¾zvwuqp\\FFV[Tkfwqxs~{ }|uussghTVNFPe\zo}ttm opvxqu]aFJP `Tre~qs !""uzszgmT[ i=4'gY݀ns|nûľ !"!$$$oxup{Yc4:i'_P~ubqt݇uĹƽ ""!$$$'&'xvsboP[~ lWҁhq݇p룑Ǻɾ "!"$$$&'&**)rsj|We c@1s[ߎos؅i˼̿ """$$$&''))),,-juq[n0;`dLW~`qsܑrʷν !""$$$'''))),-,000rus`xL_WqTʈdqߕo壄Ϲҽ ""!$$$&'&))),,-000344rseTlyWґhqݖl촓Ӻվ"!"$$$&&'))*---000444777msjWtYךkrژi¡׻پ$$$&&'***---00/444778;;;jsmY| \ݣorٜgͪڻܿ'''*))-,,000444887<<;???hsp\ \ߩprؠfֱ޼߿)))---000433787;;;???CCCgsq\ ]rrפeܵ--,000334778;;;???CCCGFFfss] ^srשeߴ000444788;;AKT[htu}Կưw|j`TE=zK U++(SVejt|{Ͽ³}vrf[S.+U(QQ_aswv|ʿx~ugaUQ IGa^[trpp ſxqxt^\HGa ![Vmgxs勉 vuiiVW!TLoh^}sxr tuuw_cLOo cVwi~r限 !! sykrV] RD@m\s~lŽ !!!$$#nyu]hDL@gS{dߊr㖂ƹʿ !""$$#'''teuSa qXԇjۊlﱜ˻ "!"$$%(((,+,nkXk ^@/y[ߕq֋gDZѽ """$$%(((,,,000is[t/=^eH@_rܙqзվ""#%%&))(-,-011555tt`Ha@vRfƏcp|ָڿ&&&)))---121666;;:qdRrf~Uv˘fߧn崄ڸ޿***--.222777;;<@@@ofUzvVΠgޫl缈߹...332778<<BBBFGFKKKPPPnhWtWc̮gn|>>>BCCHHHLLLQQPTUTphWbR;ƮepqtreR;sg:atfhva%hZxiý $$$jrZb#>^L\ycۉtŸ $$$**)vdrLY\pTǂd祊̻ $$$)))000e|TizX̊bԽ$$$)**000778dXu [іcϬܿ))*000777???c[ ]բeڲ000777???GGFf] ^֭f877???GGGNNNg^^նg???FGGNNNUTUh]^һgh^]g܉i]ZSgrhkhZZZ^^^oqouhZSif8 ckZZZ^^^^^^^^^mc8fi blw^^^^^^^^^^^^zlbTilnrm^^^^^^lqmmi½Te\nknoe\komo޾oϺklvBoplmݰpϰoìBvkTsumxynآuШsåTr[vrmqrߌnۏrіvǚrœ[nxxxr|lshlgghinmvrԁxЊxȍxƓnxcwNzzȀ{}{{{{}zzȄwąNct??(0 MD(D?D?D(MQwHnUP|U]``\UPuHVQNd:Rnԭau֔vavRkN:R^kWjqϤrsWeRlTWaZcսjZ]TbTS8Z[z~|aZUS9_W^Zmj wnlZZWY_SVk^젘 {_dSYVn[zeǺ guZg{[wZѽ ###Zq[uwR&X칓ڿ%%%,,,Y}Sr'SAYʛ//.787YS|ATAZԝ::;DDCZTAU&Zؔ[U&a[׃[a\k[[[^^^n\[Tdswq^^^^^^ptpe[Tibl^^^^^^nbi`6evӰӱze`7e^hwy۶he^iflooҜlifi8rєqpqԈqɍri8smSst|svqqqswt}smSsǒxvn'ro>oo>nq'xɁA?AAAAAAAAAAAAAAAAAAAAA?AA(  RT[UzUzU[SPfWz`z؇؈zaYvRRY0\k؇}^gU0SP[\h^WT`Wֈ223666[]fPu_666999cqUdvS^Θuվ989<<<}Wt]U{ز<;~"SM`zy 8Ά\I&b#G J l[mGǨt 6YᇂVn.z 8Ά\IӹRsĂY1>,c7ānH}:[Gz HjB^eFj q/Oؿgge'9rӕGq{5=^&3Wܯ}|yT{ [8ٽ}K/ h.VL2s0)7%[ZRGJf*뵔mUs dҊ.gAXȼeZ-orԜZU˾dySwϼ~|yT{@Fk*gAih--䟙2vQE?7%[Oi~VgZ) QBNO(E|q9p֟p*e0 h[2O\}s6&TY9}R˺9ϼ}|yT{ [8_32ރtxW2j ZZ/N7%[ZRGJf?.RnDp u"[@e0 h[2O5۸Ιܠ( zA?ϼ~'2 MVr|ռyH8 H]_C?JXqV .x)1T!šԥacOߡ/AyFRz +o ~%@†€b ˍ> TIkeHBE[YwatB?DِcSo*N lƟ91,`O7c&e^40 a5"-WZXЙ,nF`3016 ^!⼿s{399(w_X)<7)EB!,!X$iބԪ'. m mu=gaY8 Ottz166}LZV p)*]AO2V8e@O‰b ˍݒ':T!3lٯ^E64%6NU3KWxnKOU =|WH 8ơ9HލA|lMZvdFaߠ21lB]X*s{399(wZsP}$7|y DXCEʇ_y]Bo9U`FD2rlLF 2f: .jSMܓZb,3@#[Z:Gq/rn=)fLS_ud9o p2.k!H7ݖ7ى@{T;mn\'4İb^_N!ƌ5qNV>bIJ(,6/ f5t-.Ar0pY? &? b } xK+6wG>=vhYQiuͪ - ƨmQz$rE_´u9r{z TCFUcȧ,ZQY.&6=Ct̞n@|L|_s{399(wZsY.܆mjE(8&^bkXd>9aLMz4cFE2A uq)Vp90"kJeg[`AoV=}"Wrn=)fLS_ud9o p2.k!HBdCVHvl+\؃e82&= NQ$~g9UU̒"BHdX_ eΌft~"MQK1H[m{ߚd#';O0΋[`Xool;q?Jimׯ{Hm%d=ÆZ=/5?ȻaN%uTgjXX~Cw[" 4|)`kj*o:B"xʽ0eM^Z=g©Z7Xlxcʀ(at%aLJ6sVyz#uz}[:YފVHw3jCh(Ra)I66Ƨ?O{WgpMr怩6}$Cץt垼O9!tԨuT/f{hVδ3Ivb=LntF_`"&OX'Ͼ|tadz-<QyndQd挬#h ,Oz޶9`}́A㣑XE!vjGԣ:yY6CԬ3be< AZ6`[ ;ĿQ@˦_s ϙ$Y+b{+=F"C!;z䊆q.<8!Ύ֕^vQ,#Q+rdo `qě,]RUzxTo}ޫCU$ HT7naeЎU0, xޒs@ίY Y-m`P<rlDjNM" v)_+u[H0b=x,̍D@.K lP %!KOvŲͰQAICpfU|bQc 1:@Jb⣝SnCzE8܍1FOܟ6fCX1+_hvc@CG8~@pzasU3LE>c󜸱!F3j5x0Ib4~j@C]ُtZEY3ph(ΐD UQ%sYBnG~i4!$,D/,9s\zn-_BnAF UN0)?\HNVLͺ]4?!{'NUACl}gp:~6De9HW,˩ QwJB:9H'SjPX~Cw[" 4|)`kjXT~ 6{=e{k k8ܢGn&Pnٻ}K$jR-qfdQ\gnPYҩ۔9jF{nwTr뗳0x"ԗ8ڄ<9ASNcRQBԭou'i9︝/gN.6:/(QZu/XE!vjGԣ:yY6CԬ3bU<}_(z SV 0-.*EUU"oU >#rE_Db#P'p\P?ghx-U$QpAyJmq紉O s1)R]E(yw] K\75v@ߔ~(ՅKOSzn,k>+q0^v.蕅`XԎ%AɀcNW "-mm[7|Usd1Nr25S᫑jX~Cw[" 4|)*ՑV랑9 SH`ddVdjOQk>8ol@[nf!:πpUf,[."=ٿ2]S)Rw&S؟DJ~ n`74Za5Q[:v,hAFgw9ccY"Agmj,g_r/mاι\ibBȜ$s4!߂eRƘCz=@XZ+@pf*" 0iT:. 2> F08:@Jb⣝SnCzE8܍1FOܟ6+-*W®C۱cYnPFfo|U -j>}Ax"`/`Myinɤ ^}`!e"UƛF9>zQIx ٞbL~c QPU֏tAPS0:`<<{NNE' (IFel(H.Pt OH*W  Xnm}Air=zpFZv|]hA\[mrLJKlcVqҾ}ҟqǬq;`QaR ј٭c|^ D h ?ERcޙlǿmmE`9T^ P +"BF>nQIQIl nEV|X)LUSdcP5ؿ4oXSG;6YgDq>C-3]C, st?"/z Y˔[<׿BD `-> fm(Gw_Cj,S룯`2k#BAE+h%uّ2i0C8avΞ<9K+/~Kx'_‡ 6=G\> ߢT_g#(i^H}QƑ0?X)H oy gV?ব&bn H$쳟AQ&v>]]{O $ȱ_Вa_*tЕ'8aHD/HAnP;Dè*$K=Q[p&!1 ˨Y3 /ҔvYNAO3ըK[燭h Ēϟ$'Q1qo,_܋0* U<u#4au2&is|ke ܻeVD ƍퟥ]?u$^dq\mOCTW NڋaX®?QoFhX5qӮePE'H@C.oڥ]@O\FB<\oEkY .)he-a_w;?팭F}fu qErkr`fi`)l6x߽5+.S4tAb|ԛp<|/ʓ/!+U >DF$ xq (PKRE:+if{8i?e:pf⼁ Zm.XtAܔR]%pо?ϐDAOy{meg;|DsfZ +9 p&lD^Ϗ$qqFn✜ LHx&_Д>i{Kj6R&zmFޅcXmDHuAeVm8˶6tJ V82"4TDcJ8 [$E6ҏhxէ FYrĩP z@;X/ l' ?g }p o|kv ܝ_ь)E1v:ݜ< O[s܅qzRYBf٭{pd }^.Hv,II(J%-Y`vQ(3| psG؎EH7UԞE%G{V#e[Ұb0M[?[CH0cw(\MfWWmnF9S<rhuOՠ?J>y)yRjvrLڐ,Z=Q7g%RWوtʕa2w3 ^E ՙ_'2i*>.ǒV*B FfFMJl Ŀ@ȏ FNv{)c3^!͚tZ$>rСQ$yJNKQa]=rK2VKzDLm&{)< v~?z=z`yf@$=AWBWl;Hg-eT`]MXDQo*?&xOj֑<={QHHj 2/E%*kJy|nn] ہ;ߎ4o[^zl! Ez$Xzf^>#uPF#"_FcNسZm|{kuu=Er_1.ٜH̖Nr +F 9bI*bCJ(rL/RhqcXtzz 1υ%bRu}AתGfqԱXu\J̒֞ɥ7OHR%<Ɯ2ié":W]rp_-:+l΢rJU^XѳlL, M'`,R/lb fWϓ.VX3hu$/aput0꼺?02j3gBqCጊ'#[ƮRlN,3OszŖRf&@vO $ȱ_Вa_*tЕ'8aHD/HAnP;Dè*$K= !q?3Rc!$Ҟ̀=wG4Jxdi \jHr۽ƀH燧)@[Vbhھz3ϴ;ra0iϜtA`dDv2>Ga ib2@bI[ABږ@dvG!+g+Ƒ$ow 2fL'u7g:[)Z@q,wQ_5p؍QvD%!,BI7M*NAጸ:,MTJaՂ܎5f6f~#$ROs{8.|}MY"bD"S)ޮi`2;%e'a?g }p o|kv ܝ_чئFi/Z;0Y ~')i齓Em,{P@L:,h1*H)9c=QnY|wNR# aO9VJy'} uPQw,75F 64ȯ`Ф-:I;/od\ۯs%o ic6 Ƈ"W?t(ER> =*}<𣤞tN*VK7 !_8ǩՈЄ6OX2BA Z(WK@;>V[*~Op|Zs81X5J Q0!i(X|Fmr=:9vtZy-1CcSmr XOa65CB.ud}{:1tRq,gRO٘f.w])EcVxGR59 ?g;Dģ"`ZM].-C6+L^.ѦTC!ׇ;}cJygBu%B؋p;G'W~I 꽉U4*[ hQEt_gZYSNlCj+MN+!BU l]DWVhS]n'>登H=hQ c*!rg+eQm zƗ9E!v2. ]%: 7)]4`#Tp`%K=oXkcH)ͬq<0{PTN[=.e׻HD+=#d2j* 捻<;wö ZFԸG]ltwiO"_K)6QT/c;.'sۼnkyEgsAܽ\bM ЊDN*uJc<~7Fy-xMKE GswC[:Uy <ꇔvhasڝCE <r3P*yB\I)޲aiut&25qhEՠeXYg4ןv9v91m>VUgekUgZMk}}Z(`8l|-~eTh9iQh?wK{Jiˮ8A"}d:i, N'mlЛ{^x!Ja[ҭ1o[s'V˚* l7$0Иi cUmL&-ȶ6ӋƂy,Za08bYrS\ F;h) bk>,8Λ}*|iaP$7.Q!vݐ_;I juY{WP0e8Y36=TY ʟP Za`E2bh&ZuFm]}jp![P rL|IKI^- U.{w| iweGڪ_PB'T+.2IO $ȱ_Вa_*tЕ'8aHD/HAnP;Dè*$K=L[p&!1 ˨&?i)cW7]uV,rsrĈ޿,Mh;5 0LdDjd3܋/5EXhz.eJT公SƗ)Zh# mYp!@h<`-e;~aūgTk:Y2 X |$c$*rt@@f/Ĕɵ+-v7É-ӊj 7X 0 ɔ_gws)c;SJ;^*=ͼ9UJ%I6[N rafrep|Bh e02S ASۑX,A~Aj&T0&BbKޖ>l|':ϥ sREh^̹d: к#P=ƱHHS'/ M)tz]s@2 v}FT| і ѹlm?g }p o|kv ܝ_ь)E1v:ݜ< O[s܅qzRYBf٭{pd }T$2^Aekh I"9 E|k$ձfP s'p@݄H">sH##I ])3z;{݁P'!lν@B]eeqk?_'Ym,l''!p?t=L:Vȧ4.Ao: B7B#X=ޱ,\Ba S9l|o)HH_p^W 9 ͅǴ|ae2]r:8Isf>ұ |`?JlqDJC\}aG?* ۴6IH5>?LUdA_J1CحM,}TR,d: /h9i=>40unuJTuW.ޟTL`yJZgT)1 :6G -=Uә"qt(L^Yyhl$߈yEKi=WΩ"\Nu~h1\T ԮTMs<#GӶJ:[S[sJL&&-atqIMѿ[[H)%,inoxT$Ned5Q婥V䡐 bp4c`Iu_ 3۷r`I%_m@نQMy+lRLywD1`7N7ZE"((}*|PHRUv^כ[u.+wj!fk3JE^d0]3K*u 6fEgY`C*7x28yFkĊoZ&64"[7HS|h[s;1Hr$,5T<ӏ̈H~1S[a?+!7ɇm:4 VJ@âؑS>Ma09봥UUUQS.IE yEܐN92kJ6! Y0͓d٥cOogWnX@׿11b˪«ruEW Kx?d@D*uqm1_9k%>t Ld1(@)/%3,4HFknj?bͣ *j?yhGDzzruNZ1،rLlgv_ơoH4MF+@ :${"U0晰E.[7u`oY Q<:-\+/W.F`@nev23 ލs/_ M:ȶT)ccF)˫-Tq4 uEƅGe㱃'ވ|5`]hN4׎L/Zy@:6Z(|@_` hAί$9vr(d@[_TyU?ZYe鿏+VDttqDgí8k}[ '*$nЭnReɑh F"4ZmY_K3x~K~7I%vo#X{SJ ɩ=\h\"=T,᱇2űHAq2Q:3zp]KSvwN@N4~10'rZ*o߳h 1)v-:D.k*ƃN<s|o:Ȩ}UGxW; =&pDr@JO}ɷ s &w<-t7[LaᛚLN|2!I/6GF"zO.nw'9bp H֊`)[8;<UUF~- 0! (w[J7' q 8d/|eeyߓ6jws#+aC:g|Z|QmL.o}c,JqVF,'0R7ysqPkguI'A0VݣjID%%u&OwxT`nM#g B.OQS18CL0!#jLJV oЍt(>A+2ӿ5NsqcU)x)5(5wh. aJA5[p5j<NLc\jyG@t Ǎh:j}!eWf!#e1M7_c{@4Dto(YY 6܉"@ eҧ9]Mq8{^Pyހs/WG:6k^Bc{!kgƼa$QƇF-)@n ¡)#׺Ɗ?=Kb` _Y]xi),~VSO,f@ n#= ZƥgPNK3,ll&y4ŞU#;<ȬZDS/ud!ya.zA ;ci*e`={H/E'J_@0]<.ܙ{o8Eq"MH98ć PߊƐXXQ"_qmcnE|+"AbDʺ.d o+#UzzU  Nؑ,[Vdь+Ս(3)y :@>i ,Ypt`"1OlȎ/M6kؖ|M?a,~A h?D'T3Pd㲥(?ыItU53{:}*IGOi,MaoQ\$R\A_i ˀS#8NP,p>& _fn}' >؄L pA#9)he*^)[SMiTn9P*29Hd! Q+unMք.kCXH?qd,19_uu~X8AdP^tCKa-qZ}#a5/LԬdY[|G$0}$UB/^M Mwx҂Vw9$Y@ |RMLe>Ǖ!6C;hzrMx5Hb x%idAK`Q RVQ<9x\62+Hlek?뺕fsg+o['$g+76{:d̹ ;A+ ܾ 7e|A"e$梨H{HP{٭@]Ƒ)#o%|čNSݛP$+"hm7A땻5N+2ØłQ1fёbeѶ-k1.\ )LR/xZ}KQXՈ4!BIye4vĻN8HN!9$"{s| ;HG}#fyMSziacMXD wM?>k>O9:\G[ uK,rڤqJvj({j;VeY7fJ^iO\ gCC|K i`:8zar]߆=l b`Zk5Ǐ4G&+ЎNR9_5EEvFRl0.dy dn>M>-\2ձϼ,n҆@ (PH`.Fi'}PcnhےFW9Oנ~]T qeXR+yfa~75f* Q;gHGy1Fm DPw315=MA{?!x|\ؓ>}?/^$LބNcz#9(\h,5} J8q ,,KyOQ9RThwo#FOKoUEey v V \& 'k8S/:,?=ilF`6R)]}~~]fGs-/" CɾpF%#?.GV *,.87id8qf*J1Gt+!wh)n jHNFVX p[I+_r;W((}.cH^ӣs$h[?|JeN*2g<8GRtF;]G&YȰv}w|(o\ O2GlrŭyUjjqRl&—7^C"+8qb+%u+yq\Uyn0zaoT?1rnqk\kpP'18qBF7-:L :NsE4Dp3(OU6n1,OYj,ć >Xvx63ݜݮ&Lc_Od#AA0`[j9WT:W $-}r@k2 űߥ׳T7n=(id|#IrneXy[rXs ڲ|4@IꊥKD.VlGVB/+鰄mwjuLwq0:25ͫNWxT;iyڤ882+8AS }] ~ސoGޙoFL?oi[յu }]J񜶬^I FN&dFcQ&`|WEJ}D0JKf]fO h/t2M< m%@ Eht\ ÒpH >4:f(% _&̆R$b%/7 nAFtL( )2dNgcߒw",ogw|M 3 wm#9S}v8?ev?Jwݓi`i6/H"ko&5Jօ~+>.uEzW&+E ~aY נ^L=n9t97 #p>o\PDԒ o;8zGVњW}r` P Jg8N8 A߷vp5!R;r{wRm H :2MRӻճUYb+ j3SvSE;|O9$O*K^oMV3bR9/yڱ|Y$;"%4fJ[<7(#pUr(cbJnVij]W#oO.YJ7j6uNe'""jZ0UB2<6#քdhİ#qge 538HZ;I_z{7E4Jс.OYRllD"-,-<-`)xex7$\T<_<.8O7MoKxQ\wP5#dOav2 *rT[3խBc谙y6\Te%4|E=1<,_mtN IKK*`:ցy (P)3XI/b@s7&1(/"z%T-%W@D4 P9 PNawe9}ɍɉ',#P8 ~'[:~ҋiX❔Vi GDp f.ƗK"@@wwxBGw/9?P,;ǟQyQaʱ4_ kE/ǯU` ڨzwIaY(;"".6Ui Ͱ']} #"&D \) bw~ṇeYˤ]ʩ~5饻^l?9 f;,Cy*}^}Àn^\&74yOJ r4SO, C巤Ú@#;x`cG! Kͺ?>/W.F`@newoPybKs)CIEsL&8<\5_rWi8ި5f|&?VOYN-#&(ꫯcK{DV7= ;,t{nZTs Ar}U@q0^^7U}j?-3x.A# _A>kvJ7)|i67wn174өQɹOq퉚ti b%plw-TqZMr="8?.uX",݂T= -,j #Q50Ny/@$d{/.aX^6GF"zO.nw'9"5mX g`n_ LnZ/da> \fK9j4!LQCrE#C1%C,L IٽcL ec( ^]NqM;|=d? ĖG{G zogA4֡m5h^H I U:yd zהS@dӌtkp|حA-HYT's@=^>e,s"2uӉd*.1;s+niaޙ_X`lcΈn[з՛ŕOt`.)1 Sݯ_= #zk3g/)NL >n e0TV# e=zF]V3"oY[gKpF&Rރ<{%(ng:lW4s;Wߛ;i"n[woۤw2Y x tϥ(˜~ھ@\{ |lx,i hJQl(gvc O 8@pV2',2ŧHvX2qBѧ f5.gOEMiu=l])˝X5&U`^s~$c<hJ ǿ%v7I=X-6&)B.~yڭF/sޢf|R#m `p+<2/ Yo8c$'\=rn09Eټn,ҝ5c`RAȦkHf!I}ʕl5ީD+iEή9}X[{N*-PYyP#=G1Hmv'n6=v|˚g*s۵i:[ʁAdA5WO*w@4;oc U%C >VRVЋW-緤<8p.HEK]"gX ! "!ܗ|u9߆^S1N!3M뙔Ÿϳw($_,<{?206Ho0 *KZJkg5Z.\k?DAG{^ MTk;$dHFh] FW?j\%1W^0j ub$AO`)AwىP.>HDvOz\7HK0Å+8d⬙!g}T=wfO,U~Oj AŒ$QNpЬRO8)D(T)˂b-Տ:.Fms hcfKblh{Y+xP%hEZ&d1e,셾&HB%8?L^ŕ`*nn.]\Ͻe͑yUx-N$9w  Q*acFIUCG'`U䆈y4_Ry,hNj88d%g"\wk|+:Bg;zJwOlؑH'[3v-ڜdA*W> QJ ᾩ VOONуǙH' la]OBÔmv9z<'cЭ$:TW9嵻H`c.쒭j'/zcտ华 ~[Ӏq.@㲆s{l"9\Nb.x\@|9Q̰ :YFvDS?곋WJ*pl(xj kyu,KLŠdt_ϴ]]Nͼ/x"Y9y1DbDz75anMOA AVk  ɿÛVBrZS5e@$??~a ,D#UUQ>)N|jF}Ja}>Ǥ-1lvitk5 )2ZJmޠ# doAQwm"vD?nW+{njjm}(lb:F$jc/a,~ z OR3WTؔB0|9OrQEهYm16 kY5TL͍НM @?܎LsI?3߱/I^Jg$j˷( bA5S]^0 ZBW<_f#h*iL=)a)4:\n>YT3g\a=yA`W4kQH,YU,?U6򮹧$QA۶M:+8e=@ 7FwD\ $-&_T4*& +`( ֩j;bP2<$Z_/$l U7rw& m)v2&2b~DC_Z$]TKZO3`Д&SqK=}Pw4OYz&7k j[dq4Q[VTv?i8 C f\Cm' :4$R;Pio}wվl5Kwl:,ζU;]o-1 sxm0țFizY{,bgq%dy!Uc7Q~r/(y6!z 9a$ϜhN1_Pd8p$U4k8,p.VO۽g+K}]`&Zr)dkfM/ gso{|K[/y1Gi3ZF@HZ.AtS_䐣Z0e (8RxXtlu"Kbfb)d^U`(l9b/-CmySHORc dqHZt2fLzZeI*.@Wu*oUyкS_E"+چFKw^ޚKEifW;d%F 1*nσQM3"!x@i=t1ֶ%nG/R+yfa~x8pb>( Ţc ۠B7Jy63߱3 4֙[#3bfڕ6If|(Vǿ,خ kw閄p!ec`^ɂi|r8ѠhtĞ;ESxc43ԌTTɂ>́EՇWޯ;t[_8]^gx3ck8g#4C!.qI&v;+o쑸)F* % WX2ixm694#ٙv&Q810z>!J9'({5@{YLӐhp8ڹym:6w]qC4˘}]*؉-|L2cp\C.ڮ!S!u2-Bo.ƩU=2e2(S)uj]XAalӶ7ek献[^P{vif\7ŐT |e X^`6A?-:et5DiJӻ ]lo4QF ?q`:U%1N8=b༗u:)1L osZ*nȺcmp6W}1W'1Mv yOb|~w[ZF٢6/0*Ewʨ4?2X>Eey yCxhl$3 v`J Toǔo~cEhT,͍a45hk~ԕʟVFϱB,em^G7P)hI 97x⾢Y{Ug2B;-i]A4+a e-q;e L{[ l=F 6 ۮdf"R[nsY;'˛ɼڳ5dnQ?5TLU~QApϺ4薯Xx<3b(7rδ3tQmHkђּUs>(l9 hJ^7ĩEAmWw9H3ܓIk*rU,4s^MΟ)\PGWDo`d¾@ugnom mݒ?B^ͽHDwnibva8{>|" `C+ rE'[rzQ7"lΘu<)alcQE! }x"ZNHUџK`ʓY  jc.]lSe# aVQ&!˱vg?-}r@k2 űߥZP~pzi2ln"nW/a&\Xm#%>\zL[@:9nB0in`ětXRI=Ǵ_@x42[}rEOp8+f>LD4꧸PGCH!UA\B0Up{%WOD6N@х;'UӅޙZCat0vĹ4cvp3jEY&+K\ZmťfgR&2刮Ύ_p%RRZ?-ChSrP7cY~P!p-4;kZ[6l*yyJP[LI r@```4E Sb/vbk F,ȋ#;Nȓ\~|.qh!37IsʕN4f-h1FG+ǣ䜠~75Pg^8(mLHzbXFHlP%99o+ >Xm`sW:#~`Y`"! 8$U(Ůbzΰl~J!g/W.F`@ flj woPyTZe?){)AGwjIdRϡ*IsM6f!I1ԗ1 I%wn\gaR9haQ׈ Wr=Wh EH9)]x71ܿ:|ImaYZx7eTa.-(n9_5SKd=QlׁUOdزEŎ4GNM9mN/CPN)Wqz4-9e4oȽƾ(5K? Ỗ$7@ܸ`F>Q)k k$1nԣ˻Z+qy#9ϠP[£F OT\e9O,4NC/߅r `CR l"+ǙsKw Q`1˒x[~VD-)GT&#+rdA4+-&F`12? 4&?ѳ_V& % Sٔ7 h6<Q'\SؗT7;ǔؘ."efuNJOnCA%[8^Ƅ]2zЀ2\/V NF&|* VR &U9C~hIބ+wҢ $6 dqU<++L{0պaB)gCaO. pnX9^aؘd叝bemz_z򫞭yjثbggۭO?^aeUlѰuƳ jdz2-[19VbŞVˆC^Ҙ5n_q2bEDhHwK؂B U\S<)5Xͮ'VIh 'c%vWiRdQC$Y@*<`VY u߹k;rʅ7dhTcdkj'xWV4kL$x&74J(0*9^gc%Ejz KbUu9ۉL!I{#BNݏZ/Y]xjOj&i$(8)HymԇDˮR?v÷}xίvoʙ8:4Yb;{2qƠ !%Xƴ!\lƱ-*DpT={𑤔3Rf:?;nҲ L͏2~s4tϸ` t>\,bA,!CWuZ;#/P=ܵ?Q$ɤ{/ֻQ]E4ӌ-SgS4&8#P^kķsl uٴkQJ݀F A` EIl]!@<y%d{F bo>0PDy,S` d[ EN\qΐMj*kMAA\wGZb"$', ()fwHRش6ANtl-6BmkʞZSanXHאM.~_'_G8vӇ ψ v؎gx/uvsY^CEs՛mXQ0HCݗ BßF4V:~ k_ ~De *Jp.7Bχ@*Cl=dbA`;үU B,d'?q'a&,wHͫ{QJj8RK9Uəbs. i܎ĹUoj*RiP*~OPWuw-4rC>̝J'paHaeBtgW~آ ]=ʋ aX[-tвE{b7c< K5l@9:TRM ;A"̂X{Uͳe×ti2c[.Ep~ni,-| n: rxI X2KMWh!L.kKپ@;;eV:P^ 5=䭪ʦl7nGBeLudjtaM E'عm4/AvҰN=mG "6cNʞ3EE(C0'=m9*4 b 0>;^XK`8rگ:5HH "xbx cq_u7#1P_mnk.̓ p n'F#trKf;`y'/xgtB&O5Эy//R?x@l{LXڹÆˠFcv@ pi;dj'mNH]}Fm%,s5մ.DZȅшEl0DkWzJwOlؑH'[3v-ڜdA*V{>J4;a;J}OT g" Ǫ%  _K>WB" $ZqS~(V7/x #,'ދ`\xirNGRwҊ,rGވC} hsdkNXS8wj;o3zRkR)Mz{]Ѓ Ոy!1',̡%vh_>=}Ml)1yPf6CƖKѦp<{R?ϼץjiN3$HN dtmӃ~I.?\iJQ| i TT&G 9"h\8E"pT3[@ ؋{:`qttypa\U"8T Ĵ^aW\fwL"E{)=зS1~Nyr,IQKF;l8b٫4s98d1F~Fnd }}M&NI5%PC ~wPM0jd LH7hn a,~A h?D'T2 8$L%V$9<_:" ȢN^I~w\FfY_=՝~v`يy0[מ[=rŅ'jbҰRRñ.-lͻ/5;LD_9YiȍE :ɆaU`bl{!6N|S]R{W R,)}Om]DH ЅrF~"Ξ~Һwgե%h\qaZ>K bF@)›"V7}F/rm `?t#6ٰĀS0&6g2"?M+xDAI>rsX Y"V1ʡMSU]p٭RaV4@G/!4 0cQ;;-TۡO&Ou>BV 76DئGo45PTlqRd|jl"SY>B4bVz*z{4Zc<8=&f4Xw]oBɻ6 Mx+7Vy.SMiTn9P*29Hd:(ڮP3>89>uªlIn~ qC)}qt[!'4q=V2>+O Jd5J%Q?3Dyҡ@i]V0',+a%JԾ-Y;LgW eӉՆ 8nXS77K{ P5Uki~7~W/@F 5 Jӳ~,J^xhhV.Zi`X"` 5%+dlx|un4sG"ͱSC*B1"쾹ԇbqyޔ ~aJH&!uTf/D:Q*  ;s..p_,؛gՒZ뿠𰀛ކ#!lme3Cv +TW3,R+yfa~x8pbFMݵW*OzyrgO(q2mn7UOW#1uaIׄct J})~oyi9}]$E{4lbkMC }N-Vf+C[`k6.UHma2zW^Tg\ԃVxUǦ04!njUi b(QjWhO&Gr UtYWH88ݶ[ӥv߸oIE0*G=-UN|Fi͇4j&uČb!Cor=e0S;c;16N@)OƳ(it3:#KCkk4tݺpJ>O覶"'7u2X>EevS}?᪲/NT(?jC$@@t$$IY7v$M.H\<-qf*7oآ d( ޶VWG…{3甧<]> nSƢG 4܎]Ӵ>ZR,ŋ<-4!AZcxA}?cZ?=mrp!4Wե'!е>O=Si<%TA=f/D$ePBO2D)t\Pդ;2՝W5C#9a|o]'1 awcpۤՠ;ȱF^o?)laDғ)4 r{R/~']Ǩ [pdzӘycsu(q7`6W#x./ Io䒅w9;rN:w*1jK, ֲV!P\[#¥*@IZs7?zσ\u.ʼn/x PD&5!=nOqMof\nmoSlC>ז[kf4>`"$ 6T@:~8Le-}r@k2 űC9.TP |L Tj(I-)ƪ)ypTaB߷j`aYxRo@6f-AD3,xXVxcۣt/_ vzgd˳7w~(Lkab)k(YP6Pu|!< wj%vmT vV:)/NB!^d _xaGᬳsJ|it+z_7'J|q>2+;CCT٣ 7U'gՁ֦ig [Sԍ*h!Hd*FAVNG̻D8d,c䯚e?߯J 51Oh|f]م$ <1C6fʽF[g@T{yycҵc#{b_R4'3!nDaC0~!;\P.;%w,CB8723%810k1Vm&0NA?! ZΡ$#{`9%!2:7]ʖpi7ç _ڰ/j7|mA ؋ɩ/1ϐ:~6xf {N^ZFqKqDl1.j㓶sjnxo6hGtnA{YJqOtx/#kXC%u2LD^b37oꍋfY",+32((P1s=0abndFx$22h1MSPGamHr \6T ;qMMVA1"0,$ڐ z̸n#9Y#;dX妢Cl/&hd,M?p Hwp2Ylnf9ˊV_ {?9cnʆn\W8.KQ{5x`l [^*tZ!z+4$!PT:߯)0%[Oc'!Hn`3`F8P|F4cX߫93iozT!d.Y?i㈦.S%+$? "&# 8SuoxB|V)FRZ_shA*pd۱)RAϦ&̈L3}>,A4j1JFwvJH h \%=G:"ޠdǒK@ "<vbU5=QOa@ghtZ6~=XЪ/LC!Ywit32w@BCDEFFGHIJKLMNNOPPQPQQRSTTUVWWXYXYZZ[Z[\]@ABBCDEEFGGHIIJJKLLMNNOOPQQRSTUUVWWXYZYZ[Z[[\]>>??@ABCCDEFFGHGIHIJKLLMNOPQQRSTUVWXXYXYZ[[Z[\\]\\]==>>??@A@BCCDCDDEFFGHHIIJKKLMNMNOQPPQRSSTSTUUVUVWXYZYZ[\]\]^=<==>?>?@A@ABCCDEEFGGHIJJKKLKLLMNOPPQPQRSTUUTUVWXWXYZ[\]^^;<<==>??@?@@ABBCDDCDDEFFGGHHIJKLKLMNOPQRRSSTUTUVUVWVWXYZ[\\]\\]^]:;<==>>?@@AABCCDEFGHGHHIIJKKLLMMNMMONOPOPPQRRSSRSTSTUVUVWXYXYXYZ[[Z[\\]\\]^\3;;<=>??@@ABBCDEEFFGGHIHIIJKLMNOPQRSTSTUUVWXYZ[Z[\[\]\]^]^] 9:;;<;<<==>>?@ABCCDEEFFGHHIJ KLKLLMMNNONOOPQRRSTUUTUUVWWXWXYZ[Z[Z[\[\]^]]39:;<=<=>?@A@AABCDCDDEFGFGHHIJKJKLLMNOOPQRSRSTUUVWVWXYZ[\]S79:;;<=>?@BABBCDEFGHIJKLMNOOPQRSTUVWXYZ[\]^Z889::;<;<=>>?@ABCEFFGGHGHHIJJKLMMNMNOPQRSTTUVWXYZ[\[[\]\-889:<=>>?@ABCDEEFGGHIHIJKLMMNOPQPRQRSTUVWWXWXXYZ[[\[\]I 2889899:;:;;<=>>??@@A@ABBCDDEEFGHIIJKLLMN ONOPPQQPQQRSSTUVUVWWXXWXXYZ[Z[\]\\]U4778899::;:;;<<=>?@@ABCDEFGHGHHIJKLKLMNNOPQRSTTUVWWXYZYZ[\]X4789:; <<==>>?>??@ABCDDEFGGHIJKLMNMNONPOPQRSSTUVWXWXXYZYZZ[Z[\]X47899:;<=>>?>??@ABBC DDEDEEFFGHGGHHIJKLMLNOPQQRSTUTUUVWXYZZYYZ[\\[\\Y56789:;<=>??@ABCDEFFGHIJJKLMLMMNOPQQRSTUUVWXYZYZ[\[\\Y567788989:;<=>??@?@A BBCCDCDEEFEFFGHHIJJKLMNOPQRSSTSTTUVWXYYZYZZ[Z[\[Z4677889:;;<=>?@ABBCDEFGHHIJKLLMNNOPQRSTUVVWWVWXYZYZ[\[[566789:;;< Z^>?@?@ABCDDEFGHIIJJKJKKLMMNOP QRQRSRSSTSUVUVVWXWXXYXYYZ[Z[\[44567899:;T >?@?@@AABBCDEFGGHIJIJKKLMNOOPQPQQRSSTSTTUVWXXYXYZ[\Z44556787889:;„A??@@ABCDEFGHHIIJIJKLMMNOOPPQRSTUVWXYZ[\Z345567899:c??@AABCCDEEFFGHHIHIIJKLMNOPPQRSRSSTUVWXYXYZ[Z33456789:;?@ABBCDDEEFFGHHIJKKLLMNOOPOPQQRRSTUVVWXYZZYZ33456678899::A@ A@ABBCBCDDEFEFGFGHIIJKLMNMNNOPPQRSTUTTUUVWVWXWWXXYZ34556789Qc@AABCCDCCDDEFGHIJKLLMMNNONOPQPRRQRRSTUVWXYZ[Z345456778789:WՈ?@ABBABCCDEEFFGHHIJKLMNOPPQRSTSSTTUVWXXYZYYZZ2234567889:B@AABCDDEEFGFGHGIJJKJKKLMNONOPQQRSTSUUTUUVWXXYXYZYY12332434456 7788989:9~d@@ABCDDEFFGHIJJKLMNMNNOPPQRSSTSTUUVVUVWXXYXYZYY112344567899:9XՈ ?A@ABABBCDEFGHIIJKLMMNOPQRSTTUVWWXWXY1123456789:C@A@ABCDDEFGGHIJJKLKLMNOPOPQRRSRSSTUVWXWXY0112343445667 889899::]@@ABABCDCEFFGHHIJKLMNNOPPQRSTTUVWXXYXYX012344556789:9:[׈W@ABCDEFFGGHGHIJKLMNOPQPQRSTUVVWVWXW0123434567889:;:?@ABCCDDEDEEFGHIJJKLLMMNNMOPPQRRSRSTTUTUVWXW/012 33445565667 889899::;hD@ABCDEFFGHIJKKLMMNOPQRSTTUTUUVWXWXW //001012123456566789::rC?@AABCCDEFFGHHIJKKLLMNOPQQRSTUTUUVWWXW//0112334345678899;?@ABBCDEDEEFGGHHIJKLMNOQPQQRQRSTUVWV./00123445677678^؈T>>?@ABCDEEFGGHIIJKKLKLLMNMNOOPQRSRSTUVVWV/./0012234556778 Y=>>??@?@ABBCDDEFGHHIIJKLMNOPQRRSTUUVUVVWV-../0121234567;=>?@ABCDDEEFFGHIJJKLMMNOOPQQRSRSTUVVWWV.-/./0/001 22334454556]܈<<=>?@ABCCDEDEFGGHIHIJKJKLMNOOPOPPQRSTTUTUV--./01223445X;;<==>?@ABCCDDEEFEFGHIIJKLMNOOPQRSRRSSTUVU--./001011233448::;<<=>>??@?@ABCCDEEFGHHIHIJKLMNNOPQRSTUTTUVW,-../01223S܈ 99:;;:;<<=>=>?@ABCCDEFFGHIIJKLMNMNOPQRRSTUVT-.-..//0/01223LV889::;<<=>>?@AABBCDDEFGFFGGHIIJJKKL MMNNONOOPOPQRSTUTU,,--./0012789::;<=>?@ABCDEEFGHIJIJKLMMNOOPQRSTU+,,-./00122{76878989:;<=>>?@@ABCDDEFGFGGHIJKLM NNOOPPOPPQQRSTUT,-./0121W6789::;<==>?@ABCDEEFGHIJJKL MLMMNONNOOPQPPQRRST+,-.//0/001156677899:9:;<<=>=>??@ABCCDEFGHIJJKLMMNONPOPQQRRSTTS*+,-../../01I|4455656789:;:;<==>?>?@ABABBCDEEFGHIIJJKJKLMMNOPPQQRQQRSTS**+,,--.//0011PR43445667898:CDDEFGHIHIIJKBBCDEFGHHIJKKLMNOPQRRS*+,+,-,,-.././0/00112;<3454567789ABBCCDDEFGHIJKLMMLMMNOP QQRQRRSSTR*++,,-./0112345678CABBCCDCDEFGGHIHIJJKLLMNOOPQRQRSS*+,-,././/0121223345678BAABBC DEDEEFFGFGGHIJJKKLKLLMNONOPPQRSR)*+,-./0121223445657667A@BABCDDEEFGHIJKLLMMNMNOOPPQRSR)*+,-./01233455677A@ABBCCDEFGHIIJKLLMMNMNOOPQRRQ)**++,++,--,--././/0/1233455667A@ABC DDEEFEFGFGHIJKKLMNNOPQRRQQ)*)**++,-./01123456B@AABCCDEFFGGHIJK LLMLMNMONOOPQRQ(()*+,,-.-./.0/0123 43445566??@AABCCDEEFGGHGHIJJKLLMNOPRQ()*+,-..//0122323345667899:;;<==>?@AABCDEFFGHIJKLMNOPQPQP'()*+,--./0123445456789899:;;<<=>??@?@@ABCDEEFFGHIJJKLLMNOP'())*+,--../01223445455667899::;<==>?@AABCCDCDFGGHIJKLMNMMNOPQP''())**+,-./00122344567789::;;<=>=>>?@AABCDEDEEFGGHHIJKKLMMNOOPPO'()()* ++,+,,--.-././01123455676789:;<= >>??@?@@AABBCBDEEFFGHIJKJKKLMNNONOPO'()*+,-,-.-.//012232345667899:;<<==>>?>?@?@AABABBCCDDEFGFGGHIJKLLMLMNOOPP''&'())*)**+,--./0/01232345465677899::;:;<=>?@AABCCDCDEFGGHIJJKLMN&'() *+*+,+,--,./.011233455677889::;;<=<=>>?@@ABBCCDEEFFGHHIJKLMNNON&'()() *+*++,+,,-,.-./0/012334456789:;:<==>?@A@ABBCCDEEFGHHIJKLMLMMN%&'('(()*+,,-.//01122345678899::;:;<= >>??@?@A@ABCDDEFGHIJKKLLMMNM%&'()**+,,-./ 0010212233434556767889:;<=>??@AA@BCCDDEDEFFGGHHIJKLLMNM%&'(()()*+,,-./0123234556789:;<<=>?@@ABBCDEEFGHIJKKLM$%%&'()**+*+,,-./0123445667787899::;;<=>>?@AAB CCDCDDEEFFGHGIHIJJKLLMML$%&'())**++*+,,-./0112345567668::9::;<=>?@A@BABCDEFFGGHIJKKLLMLL$$%&&'()())*+,-.--../0112334344566789::;<<=>>?@@ABCDDEFFGHIIJKLLK$%&%&'&'(()(()**+*+,-./0/001223456678 99::;:;<;<<=>=>?@ABCDEFFGHIJKKLLK$%& '&'('()(())*+*++,-../012233434566789::;<=>??@A@AABCDCDEEFGHHIJJK##$%%&'())*+,--.-./012334567899:;<=>?@@ABCDDEFGHIJKLJ##$%%&'()*+,+,-./0122345567788989:;<=>>?@@ABCCDEDEEFGHIIJIJJKJ#$%$%%&%&'&('('(()*)*+,-../0011234456787789:;;<<=>=>?@@ABDEFEFFGGHIIJ#$#$$%&'('())*)*+,--.//01212234655767899:;<=>>?@@A BBCCDCDDEEFGGHIIJI#$#$$%&'('(()*+*+,-./..01234556789:;<=>>?>??@AABBCDEEFFGHHIJJI#$#$$%$$%%&'&''()**+,,--./0/001122345566789 ::;:;<<==>=>?@@ABBCBCCDDEFGHIH#$$%&'())*+,--.-../012234556676789::;<==>?@@A@ABCDE FFGHGHIHIH"#""##$%$%&'()*+,- ./../0/010123456789::;<=>=>>?@AABABBCCDEFGFGHIH "##"#$%&''()*+*++,-.././/0122323445567787889::;:;<==>?@AABBCDDEFGHIG ""#"#$ %&%&%'&''('()**+,--.-.//0123234567789:;<<=>??@AABC DEEFEFFGGHHE!"#$$#$%&'()**+*+,-./1001123456677878899::;::<;<<=>==>>?@ABCDDEEFGHE"!"#$%&%&''()**+,,-.//01212234656678898:9::;<=>??@ABBCCDEEFFGB"!"!#$%$%&'()*+*+,,-,--../..//001121223445 66767889899:;;<=>??@AABCDDEFFG?!"!"##""#$%&'())*+,--./0/0123234344567899:;<=>?@ABBCDEEFFG6 !!"#$#$%$%&&'()*++,+,-,-././0012345677899:9:;<==>?@AABCDDEFEE!"#$%&'()*+,,-,.-./0122123 4455656767789:; <=<==>>??@?@AABCCDCDEEFC! !!"##"##$%&&%&'()*+,-.-.//012345567889;<;<=?>??@@ABBCBCCDE: !""!"#$$#$$%&'('()())*)*++,++,-../01121232334556 7789899::;;<==>??@@AABCDCDED!! !"#"#$%$%&'())**)**+,,-,--./0123455667767899:;<<==>?@@ABC; !"#$%&%&'()*+, -.-./../001232334456677899:;<>=>?@@ABABCB  !"!"!"#$%&'&('())*+,+,--./01101123455678899:;;<<=<> ?@?@@AABBCC. ! !"!"#$%&%&&'&''()*+,-../00123345677889:;<;<<=>??@AB6 !"#$#$%$%&'()()*)*+,+,-.//012344566789:;<=>?@AB4 !"#""#$#$%$%&'&&''()*++,--.//001011233455656789:;<=<>=>>?@@=* !"#$%$%&%&'()**+,-./00112334456776899::;:;;<==>>??=2 !"#"##$%&%&&'('())**+**+,--.-.//012345567789899::;<<=:8(  !!"!""#"#$%&'(()*+,-../ 001012132334567677678787641'AABBCDDEEFFGHIJKLLMNOOPQRQQRRSTTUVWWXYZ[\[\]?@AABCCDDEFFGHHIIJIJKLMNMNNOOPQRSTUUVUVWWXWWXXYZ[\[\]^]>??@AABCCDEFGHIIJJKJKKLMMNMNOPPQRQRSSTUVWXYZYZ[\[\]^=>>?@@AABCDEFFGFGHIJKLMNONOOPQPQRSTUVWVWXYZYYZ[\[[\]^=>?@@A@ABCCDDEEFEFGHIJKKLMLMNOOPOPQRSTUTUVWWXWXYZZ[\]^;<<==>?@ABCDEGFGHIIJKKLKLLMNNOPQRSTUVWXYYZ[\[\]^]:;;<=>>?@@ABBCDDEFGFGHIJKLMMNOOPOQQPQR SSTSTUUTUUVVWXYZYZ[\[\]^[3:;;<==>>?@AABCDEFFGHIIJKLMNONOPOPQRSSTUVVUVVWXYZ[[\[\]^^8:;<==>?@ABBCDEFFGHHIJKLLMNNOPQRRSTUV WVWWXWXXYXYZYZ[\[\]\]3:;;<=>??@ABBCEDEEFFGHIJKLLMLMMNNOPOPPQQR SSTTUUTUVUVWXYZ[\]^S699::;<<=<=>?@ABBCDDEFGGHIIJJKLLMNONOOPQRSSTSTUVWXYZ[\]Z889:9; <<=<>=>>??@AABCCDEFGHHIHIIJKLLMNNOONOOPQQRSTUVVWXYZ[[Z[\\]\\],889:99:;<=>>? @A@BABCBCCDDEFGHGHHIIJJKLLMOPPQRSTUVUVWWXYZ[\]I289::;<<=>==>?@AABCCDEEFGGHIIJKKLMNNOPQPQQRRSTUVUVWVWXYZ[[Z[\]\]U489::;<=>>?@AABABCBCDEFFGHHIJKKLMLNMMNOPPQRRSRSSTUVUUVVWXYYZYYZ[[Z[\]]X46899:;<<=<=>?@ABBCDCDDEFGGHIHJIJKLMONOPOOPQQRSTUVWXYZYYZZ[Z[\]\Y478899:;<<=>?@@A@ABBCDEEFGHHIJKLLMNOOPOPQQRSRSTSTTUUVWXYZ[\Z567889:;<=>>??@AABCDEEFGHIJKLMNNOPPQRQRSTTSTUVWXYYZ[Z[\\Z56789 :;::;;<<==>??@@ABBCCDEEFFGHGHIJJKLMNNOPPOPPQRRSRSTSTTUVWXXYZ[ZZ[\Z4567677889 ::;:;;<<=<=>=>?@A@BABCBCDEFGHGHHIJKJKKLMNNOPPQQRSSTUVWXYZ[\\Z56789:;??@@ABCDDEEFGGHHIHIJKJKLMNOOPQRSTUUVWWXYZ[Z4455656789::;„A?@?A@ABABCBCCDEEFFG HHIIJIJKJKLMNNOPQRSTUVWXXYYXYYZ[ZZ[[Z344567 879899:;;c?@ABCCDEEFGHHIIJKKLMNOOPOPQRTUVWXWXYZ[[Z 3345455667789::?@AABCDEDEF GGHGHHIIJIJKLLMNNOPQQRSRSTUVVWVVWXYXYZ3434545667677889A?@@ABCDDEEFGHIIJKLLMNNOPQPQRRQRSTUUTVUVWXXYZY323445677899Qc@A@BCDEFGHHIJKLMNOPPQRSRSTUUTUUVWWXWXYZY223456789:WՈ??@ABBCDEEFFGFHGHIJKLMMNOOPOPPQQRSRSSTUUVUVVWXYXYZY2234567789::B@AAB DCCDDEFEFFGHIJJKJKKLMLMMNNONOPPQRRSTSTUVVWVWXYZZX233456676778989~d@@ABCDEFFGHIJJK LLMLMMNONNOOPQRSTUVWWXWXYXXY122323456789XՈ@@A BBCBCDCDEEFGHGHIIJKLMMNONOPQQRSRSSTSTUVWXYX1233234565567677899:;C@@ABCDEDEEFGGHIJKLLMMNMNNOPPQRSSTSTUVWXXYXYYX1233445667 8898:99:]@ABCDCDDEFFGHIJJKLLMNONOPQRSRSTUUVWWXXYXXYX01122122343454567899:[׈WA@ABDEFGGHIJKLLMMNOOPOPPQQRSTSTUVWXYYW0123344556789:9;;?@@AABCDEFEFFGGHIJKLMNNOOPPQRSSTSTTUVWX/0123234567899:iC@ABBCDEFFGHIHJIJJKKLMNNONOPQPQQRSTUVWXXW/0123445667 889899::qC@AABBCDEFEFFGGHIJKLKLLMNMNOOPQRSSTUVWXW.//0123445678989<?A@AABCDCCDEEFGHIJKJKLLMNOPQRSTTUTUVVWXWV.//0122345566788^؈U>>??@ ABABCCDDEDEFGFGGHIJKLMLMNMNOOPQPQRSTSTTUVWV../0/011233456788Z>?@ABCDEFGGHIIJK LMLNMMNONOPQRQRSTSTUVUVWVW../0/01123234556676;=>?@AABBCDDEFFGFGHIJKKLKLMLMNOPPQQRQRSSTSTTUTUVVWWV-.//.0/012123345]܈<==>??@A@ABCCDEFFGHHIJ KKLKLLMMNMNNOOPQPQQRSSTUUV--../01223445X;;<==>>?@?@ABCDDEEFHGHHIJKKLMNOPQRSTUUVU-./011234499:<=>>?@@ABBCCDEFGHHIIJKLLMNONOPPQQRSSTSUV,-.-.//00123T܈9:;<==>>?@A@ABBCBCDDEDEEFGGHIJKKLMNOPQQRSTUVT,-,--../012232LV9::;<=>??@ABCDEEFEFFGHIJKLMLM NNOOPOOQPQQRQRSSTU,-./0122789::;<<=>??@@ABCCDEEFGGHIIJK LLMLMNNONOOPQRSSTUUVT,--.-../00101122{668879::;;<;<==>==>??@ A@ABBCBCCDEFFGHHIIJLKKLLMNOPPQRSSTSTUT++,--./001122X66767789::;<<=>?>??@@ABCDEEFGHHGHHIJKLLMMNO POQPQQRQRRST+,+,,-./0/01565667889:;<=>?@ABC DDEDEEFFGGHIIJLKLMNOPQQRSTSTUS+,-./0101J|44556578789:;<=>?A@ABCBCCDEEFFGHIJKKLLMNNOPQRSRSTSTT**+,+,--./01PR3456678:CDEDDFGGHHIJJKBCDCDDEFFGFGHIJKLMNOPQPQQRSTTR*+,+,--. /0/01011<<223345 66767889BBBCDDEEFGGHGHHIIJIJJKKLLMNOPQRRSRSTS*+,-./0112345566788CBCDDEFGHHIIJKLLMNOPQRS*)*++,-./01234556678BABBCBCCDEFGIHIJKKLMNNOPQQRQR)*+,-./01123445667AAABCDEFGHIIJKLLMNONOOPQR)*+,-.-./012343445567A@AABBCBDCDDEEFFGFFGHIIJKLMLLNMNOOPQR()*+,,-,--./ 00112123233456A@@ABCDEEFFGHI JJKLKKLLMNMMNOPPQRQ()**+,--./0012234455656B@@ABCCDEEFGGHHIHIJJKKLMNOPPQRQ(()()*)**+,,-.//0 11211233434456??@ABCCDEFFGHIJKLMMLMNOPQQP'()*++,--./0123234556789:;<<==>?@A@ABDEFGHIHIJKKLMNOPQQP'()**+,--.//0/00122345676789899::;<=>?@@ABBCDEEFGHGGHHIJJKLLMNOOPQO''()**+,+,--./012344556788989:;;<=>?@ABCDDEFGHIJJKJKMLMMNOPPO''()**+*+,-.-../012212234567899:;<<=>>??@ABCCDEFFGFGHIJJKJKL MLMNMNONOOPO&'()*+,-.././/01223455677889:;<=>?@AABABBCDEFEFGHHIJKLLMNO'(()*)**++,-.0123344566767889::;;<=>?@@ABCDEFGGHIJKLLMNOP&&''('())*++,-../0/0123445667789:;<==>?@?@@ABBCDEEFGHIJKLMNON&&'&''())**+,--./012123455667899::;<>=>?@AABCCDCDEEFGHIJKMLLMMNNON%&''()(*))**+,--..//./0112345678789899:;<=<=>??@ABCBCCDEFFGGHIJJKKLMNMNNM&'&'(''(()**+,-./01012345566567889899:;<=>?@@ABCDEEFGHIJKLMMNMM%&%&'(''()*)*+,-../01232334556567789::;<=>=?@AABCDCDDEFGGHGHIJKKLML%&'()*)+**+,-../0012345677899::;;<=>?@ABCCDEFGHHIJKLM%&''(''()()**+*+,--.-./0012 3344545667677899:9:;;<=?@ABAB CCDDEEFEFFGHHIJJKLKLMML$%%&%&'&''()()*+,-./../012334567899:<==>?@@ABCCDEEFFGHIJJKKLML$%$%&'('()*+ ,,-,--.-../0012345567889::;;<;<<=>>?ABCCDEDEEFFGHIIJJKJKLK$%&%&'(()()*+,--. /./0011011223345565667889:;:;<<==>?@ABCCDDEEFGGHIIJKLLK$%&'(')*+,-,..-./00123456567899:;<=>>?@@A@BABCDEFGHIIHIJKKLK#$%&''&'(()())*)+**++,+,,-../012234556677899:9::;<=>?@BABCDEEFFGFGGHIIJK#$%%&'(())*)**+,-../010123345667787889;<=>=?>??@AABCDCEDEFGHJKJ##$%&''()(()*)*+*++,,-,-.-./012345677899::;<==>?@ABBCBCDEFEFGGHHIJJI#$%$%&'('()*+,-../00123454567889::;<<=>>?@@A BBCBCDCDDEEFGHIJJI#$%%&'( ))**)+**++,-.././/0123456566789:;;<;<=>>??@AABCCDEEFGHHIJI#"#$%&'()*+*++,--.-./012334566567789:;<=>=>>?@ABCDCDDEFGHIH""#$##$$%&'&''())*+,,--./00121223344565789:9:;;<==>?@@AABCCDEEFHIHIH"#$#$%%$%%&'()*+,,--./0112122334566789:;< ==>>?>?@?@AABCBCDEEFFGH!#"#$%&%%&'()()**+,--.//0/01012334344567689:9:;<==>?>??@ABABBCCDEEFFGHHG "#$% &'&''(''(()*++,-.//01233456789::;;<;<=>?@ABBCDEFGHHF !"#$##$$%&'&''()())*+ ,,-,-.--../01232345667789::;;<==>??@AABCDCDDEEFGGHE "#$%&'())*)*+,-./001232345456778:;<<=>??@ABCDDEFGGC!"#"##$%&%&'&'( ))*)**+*++,--.//0123456788989:;<==>?@?@A BBCBCCDEDEEFG?!"#$%&%&'('()**+**+,-,-./010123434567789::;;<=>?@@ABBCDCDEFG7 !""##"##$#$%$%%&'(()*+**+,-.--/0//001123344567789:;<<=<=>??@A@AABBCBCDCDDEFFE!"!"#$#$%$%%&%&''()*+,,-./01123455677899:;<;<=<=>>??@@ABBCCDCDDEB  !!"!""#"#$%&'(')*+,--.-./0110123345567899::;<=>>?@ABABBCDEE: !"##$#$%&&'&'())*+,,-.//0/010012345566778989:;;<=>?ABABCEC!" ##"##$$#$$%&'('()**+,-.-.//0/01234456568789::;<;<==>?@@ABCDD; ! !""!"!"#$#$% &%&'&''(('())*++,-./0112344556676789::;<=>>??@?@@ABBCCA !"!""#"#$%$%&'()*+,-,./012344566767899:9:;<=>>?@ABBCB.! !"!!"#$%&'&'(()*++,,-,-.-.//0123445667789:;<==>=>?@@ABB7 !"#"#$#$%&'()*)*++,,-../0123445567889::;;<=>>??@A5 ! !!"!"#$%&&'(()**+,,-../012345667889:;<=>>?@>* !!"!"!"#$%&&%&&'(()*+*+,-.//01234567889:;<<=>?=3 "!!"##"#$#$%&'(''(()*+,,-,-./01234567789::;;<=>:7)  !!"!"$%&%&&'('()*++,+,,-./.0/010123445678978640'AABCCDEFGHIJKJKLMMNOPPQRSTTUTUVUUVWXYXYZ[Z[\[\]\]]?@@A@AABBCDEDEFGGHHIJJKLMMNOPQQRSSRTUVWXXYZ[\]\]^>>?@AABCDEEFGGHIJJKKLMNMNOPOPQRSTTUVWXXYXXYYZ[[Z\[\[\]^=>>?>?@ABCDDEFFGGHIIJKKLKLMMNOOPQRRSSRSTUVWXWXYYZYZ[\[\]\]]^^]^=>>??@?@A@ABBCBCDCDEEFEFGHHIJKKLMLMMNOPPQRRSTUUVWWXYZ[\]^^;<=>>??@ABABCCDDEFGHGHIJKLMLMNOPOPQRSTUVUVWWXYZ[\[\]^]:< ==>=>>??@?@@ABCCDEFGHIIHIIJKLMMNOPPQRSTTUVUVWXXYZ[\\]\]^^[3;;<=>?@ABBCDEF GGHHIHIIJJKLMNOPPQQRQRRSTUVWXYZ[Z[\]\]^]^9:;<=>?@ABCEFFGHHIJKKLMNMMONOOPQRRSTUVUVWWVWXYZ[ \\[\\]\]]^]\49:;<=<=>??@@AABCCDCEDEFGHHIJJKKLMNOPPQRQRSTUVWXYYZYZ[\[\]T79:;;<;<<==>??@ABABBCCDEFGHIJKKLKLMMNOOPQQRQQRRSTSTUVUVWVWWXYXYYZ[Z[\][89::;<=<>=>>?@ABCDCDEFGHGHHIJJKLLMNOOPQRSTUVWXYZ[\]\-89:;<<= >>?>?@?@@AABBCDEFGHIJKKLKMLMNOPQRSSTUVWXYYXYYZ[\[\\]\]I27889::;<==>?@?@ABCDCDEFFGHIJJKLLMLMNOPPQRRSTSTUVWXYXXYZ[\\[\]]U4778 99::;;<;<<=>??@AABCDDEDEEFGGHIIJKKLMNOOPQRSSTSTUVVWXYYZ[\X477889899:;;<=>? @@AABBCBCCDEFFGIJKKLMONOOPQRSTTUVWVVWXYXYZ[\\[\X467878:9:;<;<=>>?@ABCDEFGGHIJKLLMNOPQPQRSSTSTUUVVWVWXYYZZYZ[\Z56677899:<==>>??@@ABCDEFEFGGHIJKKLMLLMNOPQRSSTSTUVVWVWXYZ[\Z5677889:;<<=<=>?@AABCCD EEFEFFGHGHHIJKLMLMNOPPQRSTTUTTUVUVWXYZ [[Z[[\\[\[4667767899:;<<=>??@@AABCDDEEFFGHHIJJKKLKLMNNOOPOPQRSRSTUVWVWXXYZ[\\[45566789899: ;;<<[^?@@ABCDEEFGGHIJKKLLMMNONOPQRRSTSTVUUVWYZ[Z[5 6766778899:;;T>??@AABCDDEFFGHHIJKLKLMNMNOPPQRSTTUVVWXWXYYZYZ[456778899:;„A?@A@BABBCDEFGHIHIJJKLLMLMMNOOPQRRSTTUTUUVWXYZZ[Z[[Z34566789:;c?@@AABCCDDEFGHHIJKKLMMNOPQQRQRSTTSUVWWXXWXYZ[45567889:?@ABBCDDEDEEFFGHIJKKLMMNOOPQQRSTUVWVWXXYZYYZZ[[Z34344567889::A??@@ABBCCDEFGHHIJJKLMMNMNNOOPQRSTTUTUVWVWXXYZ233445677889:Qc@@A@AB CCDCDDEFEFGFGHIHIIJKLMNMNNOPQRSUVWXXYYXYZY3234556789899WՈ@?@ABCDEEFGHHIJJKJKKLMLMNNOOPQRSTTUVVWWVWXYZY22345567689:C@AABCCDEEFFGFGHI JKJKKLMLMMNOPQRSSTUUVVUVWXWWXXYZZY1234566789::~e@@ABBCCDEFFGHHIIJJKLLMNNONOOPQPQRRSTUVVWVWXYX122345567789899:XՈ?@@ABBCDEFGFFGGHIIJKKLMNOPQQRS TTUTUUVVWVVWXYZYX 121232334456789:C@A@ABCDEFGHIHHIIJKKLMNOPQRSTUVWXY112345677899::;]@@AABBCDEEFGHGHHIJJKLMLMMNNOPPQPQRSTUVVUVVWWXWXYYX0112345567789:Z׈W@ABCDEEFGGHGIHIJJKLMMNOPQRSTTUTTVUUVWXWX00112345667789:;@@A@AABCBCCDEDEEFFGHHIJKKLMNMOPPQRSTSTUUVUVWWVWXWXXYW0/01123233455667889:iC?@ABCCDCEFGGHHIJKKLMMNOPQPQQRQRRSTUVUVWXWWXW//0123345656678899:qC?@AABCDDEFGGHIJKKLLMMNMNOOPOPQRSTTUUTUVVUVWVWWXWW/012334456789:;?@@ABBCBCDEFGGHHIHIIJKKLMNMMNOPPQQRQRSTSTUVWXXW/ 00102122334 5656767789^؈U>>?@ABCDFGGHIHIIJKKLMNOPPQPQRRSTUVWVWXV/../01234545678Z>??@ABBCCDEFGFGGHIHIJKJKLMMNOPOPPQRSTUUVWV..//01223 45455667;=>?@A@BABC DDEDEEFFGGHGHIJKLMMNOPPQPQRQSRSTTUVVWVV-./011211234556]܈<<= >>?>?@?@@ABCDDEFFGIJKKLLMNOPPQRSSTSTUUVWU--.//001233445X:;<=>??@ AABBCBCCDDEEFGGHHIJKKLMNNOPQRSTUVU-../01223348:;<==>=?@@ABBCCDEFEFGFGHGIJJKL MMNNOONOOPPQRQRSTUUV,--.././/01223T܈9:;<<=>>?@@A@ABBCDEFGGHIJKJKKLLMNOPOPQRSSTSTUVUT,,-../0112LV989: ;:;<<=<>=>?@ABCDDEDEFGHIIJKLMONOPQQPQRSRSSTUT,--./011277889::;<==>=>?@AABCDEFGFGGHIJKJKKLLMNONOPQRQQRRSSTUUT+,-.-/.//00101212|67789:;<<=>?@ABCDEFGFGGHIHIJKLLMNNOOPQQRSSTUUTT+,--.-./01X578899:;;<;<=>?@@ABBCDDEFGIJKLLMMNOPQRSTST+,+,,-../0015567889:;<<=>>?@ABCDDEF GHHIIHIIJJKKLMMNOPQPQRRST*++,--.//011I|46567889::;<<=<==>>?@ABCCDDEFGGHHIHI JJKKLKLLMMNMNOPQRQRTS+,--././0/101OR34566766789:BCDEFFGHHIIJJKLKKBCDDE FFGFGHHIHIIJJKLMNNOPPQRSRSSTR*+,-,-.-../001<<22345 66778878BBBCDDEFFGGHIIJKLMMNOOPQRS*+,--./00112345566788CBCCDEFFGHHIJJKJKLMMNOPQPPQRSSR*+*+,--.01233445455667677BAABCDEFFGHHGHHIJIJJKKLMNNOPPQRRSSR*+**++,- .././/0/1012123 4456567677A@ABCCDEFFGHIIJKLMNMNNOPQQRQRSR))*++,-.-./00112123234456767A@AABBCDEDEFGHIJKJKKLMNOPQRRQ)**+,-./01234456A@@AABCCDCDDEEFGGHIJKLKLLMNNONOOPQPQRQ)*+,--.-./0112234567B?A@ABBCCDEFFGHIJKKLMNNONOOPRRQ( ))**+**++,,-,-./0/00123445566??@ ABABBCCDCDEFGGHGIJJKLLMLMNOOPQQP(()()*+,,-..//0121223344567899::;<<==>??@AABCDDEFFGHIJKKLKLMLMNOOPOP'()()*++,-.././/0/12334454567889:99;:;<;<<=>=>?@ AABABBCCDCDEFFGHIHIJKLKLLMNOP''()*++,,- .././/0/0012123445567899:;<<=>>??@ABCBCDCDEFFGGHGHHIJKJKKLLM NMNONOPOPO''('(()*+,-,--.//00123456677889:;;<;<=>?@ABCDDCDDEEFGHIJIJKLMMNMNOOPPO'()(*+,-.-.//0112344567889::;<=>?>?@ABC DDEEFFGFGGHIJJKJLMNMNNO'())**)*+,- .././/010011234344566767789:;;<;<=>??@ AABBCBCDCEDEEFGGHHIJKLLMNO&&'()*)+*+,-./0123455667899::;<<==>>=>?@@AABABCDEFGHIIJKKLMNNOON&&'(()*+,-.--././0122345566767889899:;:;;<>??@@AABCCDDEFG HHIIJIJKJKKLMMN%&'(()*+,+,,--./0010123455678789:;<<=>?@AABCCDDEDEEFGHIJJKLLMNOM&%&&'&'()*+,-../011234556899:;<==>?@ABCCDDEFGGHGHHIIJKKLMNNMM%&'())*++,,-,--./0121234456788989::;:;<<==>=>?@ABCCDDEFFGGHHIJKLMNM $%%&&'&''('()())*+*+,,-,--./01212234567789:;<<=>>?@AABBCDEFFGFGHIJKLKLM%&&%&'(()*++,+,-../ 0101121223345656678899:;;<=>??@@AABCCDCDDEFGGHI JKJKLLMLML$%&'&'('()**+,-./010112345667889899::;<<==>==?@ABBCDEFFGHIJKKL$%&'(()*))*+,+,./01 223233454567689:;:;<=>>??@ABBCDEEFGGHIJJKL$%&'(()(()*+,,-.//0121123445676789:9:;<=>>?@ABABCBCCDEFGGHIJJKL$%&'&'(()()*++,++-./01234665678899::;:;<=<=>??@@ABCDEFGGHHIJJKLJ$%&'('())(()**++*+,-,-.-../0101122344566789:;<=>=>>?@@AABCDDEFEFGHHIHIIJK#$%&&%&''('()*++,-../012434455678899::;<==>??@ABCDCDEEFGHHIJJKKJ#$#$%%&''('(()**++,--.//012345455677879::;;<=<==>?@@A@ABCDEFGFGIHIIJ#$#$%&&'(()*++,++,,-./0/0011211223344567889:;<==>>??@AABABCDDEFGIHIJI"#$%%$$%&''()()*)**+,,-,--././/00123456 7787889:99:;<<=>?@?@@ABABCDE FFGGHGGIHIJJI"#$%$%%&'()(())*+,+,-.-/.//012234556768789:9:;<==>?@ABCCDCEDEEFGGHI""#$%&%%&&'&''()*)*+,--.00/01234456677899:;;<=>?@A@AABBCDDEDEFGHHII"##"#$$#$%$%%&%&'&'())*++,-././/012234456789:;<=>>?@ABBCDEEFGHGIHH!"#$%&'()*)*+,--.-./0122345677889:;<=>?@ABCDDEFFGHHG!"#""#$#$%&'&&'())*+,--.-/0/0012343456789:;;<=>?@@AABCCDDEFFGHE "##"#$#$%&%&&'()*++,+,-,-.././/011233455678899:;<=>>??@ABCEFGHE"!""##"##$$#$$%&''('()*+,+,- ..//./001012334567889:;<=>??@A@@ABCDEDEEFGC"##"$#$%$%&''('(()*))+,--.//0/001223456789::;< =>>?>?@@A@AABCCDEEFG? !""!"##""##$%%&&%&''('(())*+,-./0121233456778789::;;<==>?@@A@ABBCDEEFEFG7 !!"!""#"#$%$%%&%&'()*)*+,-../001234567899:99;<=>??@@ABCDEEFFE!"#"##$$#$$%&%&&'&'()*+,--./01233445667899:;<= >=>??@?@@ABABCDEEC!"#"#$%$%%&'())*+,-./010122345678899:9::;<==>?@A@ABBCDDE: !"#$%$%%&%&'()*++,+,,-.-./011233455678899:9::;;<<=<==>>??@A@ABBCBCD!"#"#$#$$%$%&'(()*+,,-.//0121232345 667887899:9:;<>?@?@ABCD< !"##$#$%&'&'()*+,--./00121223445667899:;<==>??@@ABBCB  !"!"##$#$$%$$%&'())*+,-./../01123345656677889:;;<<=>?@@AABC. !"!"#""#$%&'()*++,+,--./00101233445677899:;;<=> ??@A@AABB6 ! !"!"#$##$%%&&%&&'()*+,-./01223445565677899:9:;:;<=>?A@AB4 !"#"#$%%&%%&''('(()*+*,,+,-.//012343455667889::;<<=>>?@@>* ! !"!"#$%%$%%&%&'(()*+,--./01232344566787899:;;<=>?=3  !"!""#"#$#$$%&'()*)**+,,--./012234566789:;;<<=:8)  !"$%&&'&'('()*++,+,,-./0122344556767789778787640'ih32 ?@BCDEFFHIJKKLMNOPQRSUUVWYYZ[[ZX<>@ABCDEFGHIIJKLNNOOQRS TUVWWXYYZ[[\[);=>?@AACDEFGHHIJKMNNOPPRRSTTVVWWXYYZ[[\]\\7;<=>?@ABCDEEGGHIJLLMNOPQQRSTUV XXYZZ[\[\]ZX8:;<=>?@ABCDEFFGIIKLLMNOPPRRSTTVVWXXYYZ[[\\]L189;;<=>?@ABCDEFGHIJJKLNNOPQRRSTUUVWWXYYZ[\X3799:<<=>?@ABCDEEGHHJJKLMNOPQRRSSUUVWWXYYZ[[\Y36789:;<=>?@ABCDEFGHHIKKLMNOPPQRSTTUVWXXYYZZ[V256789:;?@ABCDEFGHHIJLLMNOOPRRSTTUVWWXYYZ[X1567789:-_@ABCDEEGGHJJLLMNOPPRRSTTUVWXXYYZW13456899@ABCDEEFHHIJLMMNOOPQSSTUUVVX YV03446688:@AACDEEGHHJJKLMNOPPQRSTTVXV/23356679:^݀\AACDEFFGIIJKMMNOPPRRSTTVBXXU.1234557899:DABCCEFGHIJJKLMNOPPRRSTTUVWXT.01234466789*D@ABCDEEGHHJJLLMNOPPQRSTUUVWS-/01124467Ì+k>?@@BBDEFGHHIJKLMNOPQQRSTTUVS+./012344r*E<=>?@ABCDEFGHHJKKLMNNOQQRSTUUS+.//0123*9:;<=>?@ABCCEEGGIJJLMMNOPQQRSTUQ),-//012fh79:;;<=>??AACDEEFHHJJKLMNOOQQRSTP),--./01?5678;EEFGHIJKLCDEFFHHIJKMMNOPQRRSP(+,-../019235677A'BCDEFGGIIKKMNNOPPQRO'*++,-//01234566C'ABBCEEGHIJKLLMNNPQRN'**+,--./0123355?@ABBDEEGGIJJLMMNOPPM&(**+,,-./00224557789:;<=>?@@BCDDFGGIIJLLMNOPM%(()*++,-./01224556799:<<=>?@ABCDEEGHIJJLLMNOL$'()**+,-../01133557899;;<=>?@ABCDEEGHIIJKLMNK$''(()*+,--//0123445778::;=>>?@ABCDEFFHIJJLLMJ$&''()*++,--.001234456799:;<=>?@ABCDEFGHIIKKLI#%&&'())+--./01134457789:;<=>?@ABCDEEGHHIJKH"$%&''((**+,--//01224556789;;<>>?@ABCDEFFHHJKG"$%%&''(()*+,--./0122445688::<<=>?@@BCDEEGH8IIG!##%%&&'())*++-../01133456799:;<=>?@ABCDEEGGIG ##$%''()**+,,-//0023346788::<<=>?@ABCDEFGHE"#$$%%&&'()**++,../01133566789:<<=>?@ABCCEFGC""##$%%&''()**++,-.001234456789:;<=>?@ABBDDFA, ""##$$%&&'())++,--./01223556789:;<=>?@ABCCE1+"!"##$%%&''()**+,--./00134457889:;<=>?@ABC>)"!"##$%%&&'())++,-.//01124566789:;<=>??A@ ""#$ %&&'()**+,--//01234566789:;<=>>:  !"##$%&''((**++,-..0113453#?@BCDEFGHIIKKLMNOPPRRSSTUVWWXXYZZ[ZY<>@ABBDDEGGIIKKMMNNPQQSSTTUVWXYZ[[\\[[#;=>?@ABCDDFGGHJJLLNNOPQRRSTTUVWXXYYZ[\]\7;<=>?@ABCDEFGHHIJKLMNOPPRRSSTVWXXZ\Z8:;<=>?@ABCDDFGHIIKKMMNOPQQRSTTVVWXXYYZZ[\\]L199:<<=>?@AACDEFFGIJKKLMNOPPRSSTUUVVXYXZZ[[\]X3889:;<=>?@ABCDEFFHIJJKLMNNPPQRSTvTUWVWXYYZZ\[X36789:<<=>??ABCDEFGHHJJLLMNOOPQRSTTUVVXXYYZ[[W356789:;?@ABCCEFGHIJJKLMNOPQQRSTUVVWWXYYZ[W1566799:-_@ABCDDEGGHJJKLMNOPPQRSTTVVWWXYYZV14567889-@ABCDDFGHIIJKLMNOPPQRSTUUVWWXYZV034467889@@BCCEEGHHJJLLMNOOPQRSTUUVWXV/224566789^݀^\AACDEFFGIJJKMMNNOPQSSTUUVWWYU.1233466799:DABCDDFGHIIJKMMNOOQRRSTUUVWXT-01133556789D@ABCDEFFHIJKKLNOQQRSTTUVVS,/01224456Ì+k>?@ABCDEEFHHIJLLMNNOPRRSTTUVS+.0012235q*E<=>?@ABCDEFGHHIJKMMNNPPQRSTTVR+-//0023*::;<>>?@ABCDDFGHHIKKLMNNPQRRSSUR*--./012fh799:;<=>?@ABCDEFGHHIJKLNNOPPQRSSQ),,-./01?6689;DEFHHIJKLCCEFFHIIJKMMNOOQRRSP(+,,../018345567A'BCDEEFHHJJKLMNOPPQRO'*+,--./01233456C'ABCDDFFGIIJKLMNOOQQN&)*+,--./0122446?@ABCDEEGHHIKKLMNOPQM&()*+,--./00233456799:;<=>?@ABCDEFFHHJKLLMNNOL&())*+,-..001134567789;;<=>?@ABCDDFGHHJJKLMNOL%'(()*+,--.001233567789:;<>>?@ABCDDFGGHJJKLMNK$''())*+,--./0122456678::;<=>?@ABCDDEFGIJKLMMJ#&&'())*++--./01223456789:<<=>?@ABCDDFFHI IJLLI#&&'()++,--./01223467899;<<=>?@AACDEFFHHJJKH"$%&&(()**+,--./01123567789;;<=??@@BCDDFFHIIJG!$%&&''())*++--./01233556789:;<=>??ABCD:EFGHHJG!##%%&&(())*++--./01233566789:;<=>?@ABCDEFGHHF #$a%&'(())++,,-./01123456789:;<=>?@ABCDDFGHE"#$$%%&''())++,,-//0123456678::;<=>?@AACDEEFC""##$$&#'())++,,-./01224567789:;<=>?@ABBDEEA, ""##$$%&''())*++--//01224566789:;==>?@ABCCD1"'#$$%%&'(()**+,--./01224556889:<<=>?@ABC>"%##$%%&&'(()*+,--./01123566899:;<=>?@A@ !"#$ %&&'((*++,--./01134557889:;<=>>:  !!""##$%%&'())*++,-.//022453??BCDEEGHHJJKLMNOPQRTU WWXYYZZ[ZY<>@ABCCEFGHIJJLLMNOOQRSSTUVWVWXXZ[\[!;=>?@@BCDEFGHIIJLLNNOOQRRSTUVVWXXYZ[[\]\%7;<=>?@ABCDEFGHIJJLLMNNPQQSSTUUVWXXYZZ[\][8:;<=>?@AACDDFGHHIJLLMNOOQQS1UVVWWXXYZZ[\]]L189:;<=>?@ABCDEEFHIJJKLMNOPQQRSTUV0WXYYZZ[\\X478:;;<=>?@ABCDEEFGHIJLLMNOOPRRSTUUVWX*YZ[[\X36789:;<=>?@ABCDEFFHIIKKMNNOOPRSSTTV3WXYYZ[[V256899:;?@ABCDEFGHHJJLLMNOPQQRSTUVVWXYYZ X1556889:-_@ABCDEEGGHJKKMMNOOQRRSSTUVWWXYYZW14457889?@BCCEFGGIIJKLMNOOQRRSSTVWXYYV024467889-@AACDDFFGIJKKLMNOPPRRSTUUVWXYXU/224456799^݀^\ABCCDFGHIIKLLMNOOQRRSTUUVWWXU.1133456799;DABCCDEFHIIKLLNNOPQRRSTUUVWXT-0122355678:*D@ABCDEFGGIIJKMMNOOQRRSTUUVVT,/01133556Ìk>?@ABCDEFFHIIJKLMNOPPQSTUVS,./001335q*E<=>??ABCDDFGHIIKLLMNOOQQRSTTUR*-./0123*9:;<=>?@ABCDEFGHHJJKMMNOOQRRSSTQ*-../012fh78::;<=>?@ABCDEEGGHJKKMMNOOQQRSTP)+,.//01>6778;DEFGHIJKLCCEEFGIIKKLMNOPQRRSP)++--./009245577A'BCDDFGGHJKKMMNOOQQSO(*+,-.//01224467D'ABCDEFGGIJJLMMNOOPRN')**,,-.00122356@@@ACDEFFHIIJLLNNOPQN&))++,,-//0123355789::;<=>?@ABCDEFGHIIKLLMNOPM%(()*+,-../01233456889:;<=>?@ABCDEFGHHIKLLMNNK$'())++,-../01234566789:;<=>?@ABCDEFGHHJJKLMNK$''())++,,../01223466799;;<=>?@ABCDEEGGIJJKLNJ#&''())++,,-//01124467799:;<=>?@ABCDEFGHIJJKLI#%&&'())*+,--.//1233466799;;<=??@ABBDEEFHHIKKH"$%&&'((*++,--./01234566789:;<=>?@ABBDEFGHIIJH!$$%&&'()**+,-../01234556J889;;<>>?@ABCDEFFHIJG!#$%%&'(()**++--./01234456789:;<=>?@ABCDDEGHIF "#$%)'(()**+,,-.001234556789:<<=>?@ABCDDFGHD#$$%&&'()*+M-../01234456799:;<=>?@ABCDEFFD"##$$%%&''()*++,-.//01134467799:;<=>?@ABCCEFA, ""#$$%&&''()**+,-../01234556789:<<=>?@ABBDE1!!#$$%%&'((**+,,-./01233567789;;<=>?@@BC>"##$%%&'))*+,--.0224567789:;<=>?@A@ !"#$ %%''())*+,-.//0123346678::;<=>>:  !""#$$%%''()**++,,-./11334453il32 7>?BDEFHIKLMOQRSTUVWXYZ[\\]T2<=?@BDEFHIJLNOPRSSUVWXYZ[\\]Q7;<>?@BDEGGIKLMOPQSTUVWXYZ[\]Z79:<=?ABDEGHIJLNOPQSTUVWXYZ[\[689:<>?ABCEFGIKLNOPQSTUVWXYZ[[4679;`ABCEGHIKLMOQQSTUVWXYZ[44689@BDDFHJKLMOPRSTUVWXZZ23567:ABDEGHIKLNOPQRTUVWXX0235789jEBCEGHIKMMOPQSSUVWX/024468jC@BCEGHIKLNOPQRSUVW./1237=>?@BCEGGIKLMNPRRTUV-./029;<>?@BDEGHIJLNNPRRTU,,.00V68:EFGIKLCEGHJKLMNPQST *+-./12356ABCEGHIJLNNPQS)*,,./1234@@BDDFHJJLNOPQ()+,-./023567::<>?@BDEGHJKLMNQ'()*+-./1235779:<>?ABCEFHJJLMO&'()*+-./023567:;<>?@BCEFHJKLM%%'()+,,./1235689;<>?ABDEFHIJM$%&&()*,,./0234679:<>?@BDEFHIK#$%%'()*+,./1235679;<=?ABDEFHI""$%&'()*+-./1145779;<>?ABDEFG!"##$&'()++-./02M35689:<>?@BDDF!"##%%'()*,--/0244689:<=?ABC@ ""#$%%&()*+--01235689;<=?@@  !#$%%'()*+,./1245679:;:86>@BCEGHIKLMOPQSTUVWYZ[[\[\T3<>?@BCEGGJKLMOPRSTUVWYZZ[\]^Q7;<=?ABCEFHIJLNOPQRTUVXXZZ[[]Z69;<>?ABCEGHJKLNNPQSTUWWXZZ[\\789:<=?ABCEFHIKLNOQQRTUVWXYZ\[5689;`ABDDFHJJLMNPRSTUVWXYZ[34679ABDEFHJJLMOPQSSUVWXYZ23567:ABDEFHJKMNOPRSSUVXYY1234789iDBCEFHIJLNOPQSTUVWX/023568jCABCEFHIKLMOPQSTUVW./1237==?ABCEGHIKLNOPQSTUV-./129;<>?ABCEGHJKLMOPQSTU,,./0V77:DFHIJLCEFHIKLMNPRRT *+-./02357BBCEGHIKLMOPRS)*,,./0235@ABCEFGIJLMNPR()++,./0235689:<>?ABDEGGIKLNOP'()*+,./1245679;<=?@BDEGHIJLNO&'()*+,./0234679:<>?@BCEFGIJLN%%'((*+,./1234689;<=?ABCEGHJKL$%&&()*,-./1235689:<=?@BDEFHIK#$%&'()*+,./0235689:<=?@BCEFHJ"#$%%'()++-./0245789;<>?@BDEGF!"##%%&()*+-./11145679;<>?@BCEF""#$$&&()*+,./1244679;<>?@BD@ "$%%'()*+,.01234689:<>?A@  !"#%&'()*+--00134789:;:86>?BDEGHIJLMNPQSTUVWXYZ[\T2<=?ABCEGHIKLMOPRRTUVWXYZ[\\^Q7:<>?@BDEGHIJLMOQQSTUWWXYZ[\][79;<=?@BCEFHJJLNOPQSTUVWXY[[\[679:<=?ABCEFGIKLNNQQRTUVWXYZ[[5689;`@BDEFHIKLMOPRSTUVXYY[[35789ABDEFHJKLMOPQSTUVXXYZ24568:ABCEFGIKLMOPQSTUVWXY0245679jDBDDGHIKLNOPQRTUVXX/124467jCABCEFGIKLMOPQRTUVW./1247==?@BCEGHIKLMOPRRTUW-.0129;<=?ABCEFHIJLNOPQSTU+-.00V68:EFGIKLCEGHIKLMOQQRT *,-.002356BBCEFHIKLNNPQS)*,-./1235AABDEFHJKLMOPQ()*,-./1234689;<>?ABCEGGIKLMOP&()*,-./1235679:<>?@BCEGHJJLMO&'()*+-./1235789:<=?@BCEGHIKLM%&&()*+-./0244689:<>?@BCEFHIKL$$%'()*,,./1235679;<=?ABCEGGIJ#$%&&()*,-./0245689;<=?ABDEFHI"#$%&'()*+,.00245689:<>?ABDEFG "#$%&'()*,-./12M34679:<=?@BCEE!"#$$&'')*,-.01234679;<=?ABD@ !"#$%&'')*+--/0235789:<=?@@  !#$%%'()*+,./123567::;;8is32OcYHpeATH6Ř0-Q@.)((C I{O^}z{9zZl?;ǿܱq>`?n>Mc 7c&|܄}?q>`?n>Mc 7c&|܄}?q>`?n>Mc 7c&|Gl6mܚ{yMv+k׷|_mtډ?70~C[Os`wֿ7[R[XUm}zi6m>"DVMk4״iKG}}7krD}7NYemʹ&NhxuKןL.@Cn(J8];moM(ks嗡qW>z:e{?Gkٕky5Wawnϟ/|?mgG59|] q#o1$9 ]\Mnhɉ-f݌& ůVsl3,LɾixxL&ԪRt6 'zrMVeOG '( fZ8\W-̚23pj^X\?YB?S=fpggxfyͿ0(#gӹ,;ο>|#g>pnlPZ|6trU'y$i)oubaFi &XK݆Wﳨ7oeE´gN?O-\0}Oڨ6ݜ*[YHeLh<7hc.K)+3&ZX*\`o@k"a2|9 }ySO bm\/|_W@ #0?4,qZ+o@:k7ZQPp RL"k9IY4I@[K} tJ̦h^wO0fKl*2$):9g1mHvjlE-0r5[I)81|bm/W#v ?@_IgfŘbCin"ij2H/Ӆ0%OeI"%S0]^ e3'XH&Gʹ bt>ǧ+Ǟ7}9oO8-.;7z䲡NP%|~ʽ#вT1rn %JC0I'>HxFiR)Y|.W'HSbl sЋ@p3j6QCUNc1E"ytWpV˂_z_Ǟ9;[ssgfJ.HשuB`#'#whpE^fSVTA("q,)Ef ɞ*2^Vl<Dg)}B:P߱G4<*i5{yXFŽƂH:CǘP6hEfyk_w{tMMZ;`jYxنI ZZRQ`<ݓ5jW-r`̗#Fvnv~V1oo^|`&ajgP( lkp.|sfe L/#;ԉ>wJ n`g&^gu\fAb8v_1xLccQwJCJJu jjnpʱ$ֶ2(ˇXON,3-]@!فv"bDPK/nNb-_rgTSDGeJih޾W>~7 )K/ǟ=z9]z7|7M|[DR)+O,Î6VCmi%y{72@la}=.!؀*»{`z^Q:]IxXLe"S2t/=S'.C1Sk ̬ddZcQUٛo .z r׻nz;?mm=w|Iƅk-Uk':a ;C›7Ӣ)GޒJdj)fmN:6j2 \SEOv7w>w4J,f^s uu)pv4:2g_?ӣvmgm_x|!j8_1AjMɔaD"M o# 2D!YCLj XJTNzlv`Ю$MA|4nZinW6 #K[49 b̳URu gOUbE48F֧(>DziT)[BidBs:L2(|UWӕ-o]@ik[F'j pW!攻1`9Z4Y:}# Q ̯펭zVO%T-ωd9Q@T0 sM4l2ؼfSPU8͛Sjb·@L.#T3 `S%wmL*2L#{,lv# .xٵgp նgŠ &ѸZ5OJ)>~jQzަ%a"V@fN6 +8Or__>q` `]E;dQJYs8n;|lK 6Ү[<-"Md;13jN?]7yףr-__wߝE@P9ݠS*-EOCSlgy*>Υ]5U6D,QBo3 DN.sdHC*@\HQ J][xK3~ p;źyP&_v(00M0tRo}駝~)=im=pE@#4CrCi#Nw  9PgǵTA:1p72E8Q:f/nvnj`}{B:nr&xJD`93b#*#HOL1E=|嗿 pAguOrC^MO9Ȟ{D4oP W!>% OXGVv.6(U9 lQY(G`ڽ4X(O&0auK-,A7rFd%70 ԮۇAߧ.>ȉR4HX)qu d/}K-!lгywL;Ky ( #G^<)}yr;=L! d?4CĿ+$cK7`Ǫ"{+ Vضb2h[n kNQ`Z-cN΂W-ta%~; ǝҏCL8-b6h1 Aꫯ~EߎYpm)[[[?C[,&zU2*T.APE-)x>R#t.Gp=WO^g/Z#jcVh9_xR!EZZ PUfQG OA@q:Jz`7ȑ"DRыָQ:ܟX9r>O+ y\غ-oy˷vvPYILvn5a؎@ -n>ĸL;or np?WQW!obDxϮ\~IOAZx\ {xZ++@J9l /_ۃր 0.I?_`!s; vd<vCzFDo/;Oce rIur'fG`(<9^{ܮzjttx)m*J ](ZUpks802ʹ2 V28 ȲxX呒-hk0v_s饗^a cg};p["xӖ$փxrvī OS!Sת7ڴV``s Ob>yQ0q=/YRۿϓbLz,/U@ǧ*t ;þ$ G&&1=DMyA<"ovc L8 )iZFwkw~ _8|;'Svڌ^o$Ҷ+$>OXLц`9u OTGȔ[?{_gAIn۷(6Qi4fn%KU鞵hCz*m魬}b2 q >$*9'aso65Ul CPTUcFiU4;r?'>mu햷^u{6C5Ѝe: וԍ"60EbLyەGadFCeiì@ {Qܥza} j#Cp+X;eṋ)_4@Y;rc`:E=+)>wl8|?=5d8~5{ܷ /0 d$1]JiTb(gRmI/]ɳ# Ҫf F׮]'d d`]c-AEc}^ŠiO`Jv?%.O=n`;5A,Я:ĥ_я|c{vu۟|W/52nmECpe@jD+l-m Y&;"} 9>0u3\JLn}(0Vm~ژZF=DɁkS|˸24f~NkW]~^Xs; *K0~3\c;2Q7R.W9\ y_I')ɇ`UڊΓTQsF3 @AKtdzk4`5mtNdoutyRVj2sN Qjf5(6"gѐ [[f1ШgWLtכrv:ňƃ >:/=K/]m6 =A} .2,@n$h᝹M+^u;ZBڼ<RVcnu$U}ɚe 6-ɽ$hF ɒzhV [0V`\H;ֶ#3W1gs|tY (?_\Ƌ/ 8Ѓ>tb6q3lQ[ \fK+RՖ<(8%& d]zȒ&ze$@+5r\vzٚ91cBuqШomk$Ћؒ]khrDĝhxl!O]jEW_u 9mVkCyC}c'~aTaiJbcAKo?eU )2U v,Kֺ—s BwʮJѦ,ohYy¨nq*X sWqH{&&Gx0>)} ]H2A@_3*Q1nDƫ:׽?o ~遭bI1G0 ~R3Jz(@ܖ3#ZT$9 A=[Xz#0{6HqѴ4yacqL"}ӀbX`)p'k7]F*Ս< EK@{Cؗ.9[uچ\'X}7↨{n=,bp@-\ַc6BuA}}x PHHIz?D\"#5k)7ԑ0X2e4徤#d$b<1 36#֫fΑ#G/ g%x,8>N,V-}yh5Aqј=Ϻ)DZ}E /'WnN0#myaKs]nd͌L(h0-R½vl n70i!c@VU2W(mѣG{|js mg[ݿ*D]֛w|D0 0 <db-uЮl\Gm# v'*3 Fѯ6:)$Q`iwkbx}&v4 W(I$/6ݙL74X*]y&uQ><y@ hOf/:oN )լ1VvTa mZ=0Ud|zg 0,&eqnt e#wեEivx9yxkjhWE*gCc( ڠl?lWC{# 9!j[wEa=J9A)M CoܹHޝp'{ck~NwZ} sIZnNs \^zmlFHn,@= * Փ+>I^"jR{h < ЇGr#`cX] 1uk 5CЏy#af :$2̀zA;ڷ堮j{`zիkvj LyXUޥ[t7beAK+ 47 C:rE;FWA$3S{DE`2HG|40`Nr RPeviZOkw@aY B|Ly΅*,I4p}mmp0t揔.\R /(l{)?^ܞ;/ >O ٗ>'PGVXd"|^ dMȿK1uO)M aߘr۰ ` q{(-VP:'U 쭡&^+b6fk gp JO[ʴLSߗ/<c |_l2fiهcE|߷ Sq^lj Au{ Fra XB-NR:qA4N9x@\dnTxQDwif_1+ ]b麼3$y0i+מ)aV `0\Epdx| =7r{moO>X- ~/ܨa=%i隮8wV)L0%V5uucwg hR')Y"lk'CUjMrDUK6KW#. m>4 x>2/ڡ⛊GAaNYRd44گy;a_U_e{yϙi? D\]8ä1T; X;SZ(NCmV vbe>X-6J m@EV$r(F e{~z!aܧ+L ik`^J:iN̩:=I)ɑQkN+z~d4`bT Y,iMu"2d1_謐[Cn#w9Xv pzf>APS(p-Nb<.8u`˞gط~>Y_%Y Lgꙑ4(^bF3]NPUz\>Aqz@0ٞ0磍B=A8+} `kJ3+kwdJ^@P]y:=y{R!x/ 6XIk'hݓI؇~P .bqiI'**xlk,li  O7f1$W1DI3W)r,N=8q94/ q- .2)TUahuFN-ߔ `GJA &"~m sfNZu$vt \L:P@Og+4A/Rb],': >0IΑw4Vkܯyކz$x $_+xqz3+F5~(k\T @ЖtLe >T_Jæx{o h &r52aqm ZzcY=ܠNgJ*%8kվBh:x~?lo,$"y6xh3)} )b dbvq<}J}-(HKՄޭZZo+'K b24 +Quh%BW u93qf zYtO &3iYTDz޾].:kNH(D#FL÷;Qq^w˩w38ÎK.__h#>#WQ$f>/w@F# pTa6 =0 ۶oЈfcy9Ïw(^ن9k }Z{.&bcЌ&Y?wF1q!`)UOVT61sF)U`Յl>ଳZ 4dDn';\{eT7Kť}˷|=iOv8DLu1~,9zz90h?72 瘃#CsiTr\%336#+!hSKn_]3:^5Ė;ýB!! ,)R@NHG$U'ps;;xo|/}TN+kn7@ ף0̀ڻ,-!@VXӬ6GlB;Qj\~} kK5ey,l/rVmb*CwKz*Ueh~ &vRRlq:Kp| >ۏ>GaʒƍNk>δ5&leRĆݡv!<*L<{';GLlTm)ߥ,g"RUm.[2.bTnz?EvY{KДO YdP<ؒpy  / ?;w~-SO=.YwYb'b)M$l 4鉍 716xm7|aʮ2ܜV^-ȢsRK(0|~vx).hhe݆PSf^R.F\6">.'M/پ;֘YBz=~䫓aZ !0N'ʃك-Re&v8ͲKյc;l??s=IPQȪ`0^O3JP{^@du%ҜxLn a<,. 8ZAz .L̙߬. y!18+\h`x ?磻9=J)r˴@HN<=)?v܃/~K!C`/,K=e1m6?} *UA'O䀠4i;Fu0Ƭ߭Fen U1ar⊘H0zp噪Zih4crg5ҷziՒO?}Mv:V_ Rp+,ƃMxe8 bM&Cj5O^t`649G俳TG𤜟X]RS _=\bOuQ|慨DE-EI^~s]pFOB.Z GP)@J V$RRo8=i RKJK`$ q\ї0Džhx2aC^%u9ԍwku%3: 貊:R_qX!*7D줛dO}[}__<@{$6 {4ѡܯ5*k)`ud=;$C h؎a:;,)8/׃#0Nhd IÕ˗@<*29j@F5 GfqEQJJ9uL}.w?n7ۋ^";:MBn- In>GE8]:Ǟ XX,8LKh<:v[A Pל)r! 2$g z8./1@~w gT)Ҁ-MX/0*-?a2t!1}gIDX{yG#Cuڙ /| s9enKA4 k(9.ޫ8"$ئ>fsdF):QfqL1' B_{Cy `űZYI0T{ U/%*q5EXZ`9C-Ͱ Jݖ,dϢ 'R}D>ո`?=<@mp9KxnBULdX@X'͔g~o}Ȟ }ME/}9'qQGFnbXCfy RcbRiy촊W,)k06 P?P2zl[ z8t1:G$H8XTcO?mM~ړŠV$и,B~] _:+lʼn#R;+K/Y6@U ;*zi~4FTВYˍtBW<1{/єՒ /KXS{V`K\J KƣJjIP,Eǁ짞T;>1{泞e67*)܌DhzBc, 0T:YCZ9nQO )2yxĈF64@˜%I=/7\*C`<(*j#7cM] tn-EvW=㠖\7FkVcM_UaOD'QF DTRLfV QasܐOA}q-=D+xbr?p0M%Y] + hB;ZDP p"lPt~ᬡ?v<+;<{[LPJ}3xyT7@س!I~y&'K^S!5bZ%%t لڶ:.p,8 PgJ:/kk)^}wh;W%4(|ޥ"":=-ʅBFB/nSq^im`xwƋhuzgHY> rt +{AhM *Jocj G{E4-g ^"_kJ1IHUh)" .*ʂԲJ6  2SN O=qv/~Ef\s W=pԄ i.'G>%;rܕͦsKh7J<L&h6Eڇp͛'>fH_RWlr-mO׀!0ۂi ށ!ky {Ps=2GcN+`*x<8y+ymU~=(B7?u#7CMVcljTP?r<>y1Գx-eؐ/oρb Lm. }|DrFv>LJ) A*^4md~8'/߰k]ӅP2Op0@Vm9R/O>Xg=k'UyN3HtKѥH/X+/}$y4O0|}(Z[\F~m@SI|ǦA[%`P LlF.ɘs5s#{+.3h'u6_"5m=)Q^;#m\@Hz=_|گΔ\.Dņ(cը2h?!z*QҚ;=-ӽelX@'nuK-~B T5&902,PEi..o۩{kd [2ҏEBKE67{_nguXQ=ykʯg͓;H,$-SKc3q޿ #{#Ýok8P~; RqT bI(abLq<6iY/ Ź$#7 c7k#+EhjY8S ~?뀪ƾu@HTYEva^HOh/ Ge*Y iR+cz|R]׬2M͙ B{of.7DSL~~߸7L> J'=YQ~-y рvaNmK.O<Ѯ*Y1ۑGD5S}lä`i2bŧ(od߁Y7ɄJYe$G66bO%#h}(95z , Rl{PS Ba Y҇ $]ɟ'< v]Ua|Җ] 5MZ} x L^(K ,,@ u;S,u6'}_= ~;,[-Mj? [vJ[.=Y\(Hj4Gf#I=̊JE󭭭u>?ϰgJ> gMf%!tXdCQt/4+rbv1n"(uhWq +J,슌q'KM=,=2Y Ncw>?cU^Mվ~~=qy뭹W[uѦ;gE%~r~gsK+| cTTy~bnd6fSS˰2e_>[Tλ? =o5# rf[\{Ƨ v[C렣 q"#6jkz_چkD-,O(6'QoFY_y[֛E`nb}{||73HM]}̄j0j"uVsi7]Li5Ձ2pn ,pP{ +K/JM4' ,4g<@VDd`qӏ}vc>2ePw[^DZZ& L88Euvy3̖6x1y=bl`)8D- i4GǍ[9b(eUlIN(]fZ6>Kyd$Ta G]Deo:*/KNbEq]b<|6Rۓ18ğ}n}w7z/JxP)&;M012 .u'h4X:`M~'&e5?xety9L)X6f nO X-2UM.N !HJ5E hd泶/-}y Oe>!p C: +H֝X)coT !GynBTIM&ЯC@Ud/t00մ$4ŢE;|<)\GΥ[Vqvu%=ږJEu;-R%`Q4w5԰Ϻ"O!8 A@X#wgfOہ,&Fd3;&9@y0.G'Lp˶7 ^OUdC:(tL&_\Z&>7e)jJPsA t1(psT1$3ZݘA,@Y[J~7ۈV?3,(h/~@,GB`GJ]]e[Yrmj6f2])ע5EۍCV3 eP(0 m 5/hʶy|)gbljk~6aY68ޝBzK{fߋCkʜUtIí|Fon{«U~FRFќ#AO"" Sy ˆyn{y%zqzӓ)cqKi6V#woKŽu^ &Am8qBN N 5SiQx7%̊Bsnwg H,c|4z5sfkLPt|S_~^,B9y:y%U)i@W nZD3 XR^x 愍7%( eEfu|@K)oxӪ:Ijߟ`+q̢%5S2,M|~ZO"Re'N-hUnSPlzM'"Az7aޖB4i?moI&|Ea#h g4k\ah* +Tv?i>oy/'K+Ϙ ׊@ I4o0"e؉@t?E:'3XP@ 8zԾofi^tBY^QݒgvqR;ױǞ[G9=2,67bI8E㗕j}Y-+ցƐؗ|@S9M$kZS'WURtEkVU+g}•r^-ԭϑCric+4-kP:N8mTD")R?7لK?3G>v%ݱ2Чkƽ5h+2ОЂ:t+M 6T4>>o b 2U}@Sg[@"ŷO.Sܩ(·r\Xz*l$lٖr~hilY?T49a dy,ֲ6@:[?VF]D-Cm %%l:QS\" KPvjܷgtTl+1e `X`ZfjJ ZWo& Dd)-Q 4'ZAC$3bfUދwLp@~`J.~# 6xJ'AH0qTZe%~K ;tW=1~9Ag)* OzG#"I؊s@bh SU%crs+1C\"}'G{_*ȢDGWUle>ZؿG%SqȖ(-2fWYwY18 22y9) ʴ8(E$yP*PlExXC٥&g< c dyѹ='?utḌoEVZEpH ml?QJ14c˽Z4i8w=ЗtB; 6Z_ﮫiLRd@ fZqey͛ ؚMAu[F5=Xb=wȓ M[E;%XZYpWjv&ٞ&41-{3Pz+,He vw#Lr;Щ/-!}Ak% &x=8e;0׻g>ӧD*BlL:HD`ҪHzsK"`l (Y HmU-TulE_CFB RocDK ➄= MOlLժt!`[Vl%5!AtIQN%׋}vAVX:(B$V@Fтf:PE>CA)@x@:TkH?V*=0[.dhn~'2^)*ѱ G 0,q? zYx,V"S|f"Iq3A zPk^bm-~miVQt>3 &yYLn_r=ʉ=bi2%S@炲|K=o #6]fibAT*IKg#K8Kl22 y_jKrT0,`+(jt$Ԯ)F,j`~ˎ G6Y~3R"Sž^\d /{Į+ap*6)u\c^l_zɥ3fh!. X!^jr/5"]cR=oI TTJĊG]%)ɑޓ2>T,%ƘȺRf==KOKF&)mf—קdg@A0ZG|)BK \:j2x ]0WvT (m}v : 7Xr7\Zu"3ܪc20@ ]'p~+ d+pR} R\=* #dkvr-.N̝](?Z]nz8!͈֡:sɄ0D7v8 "۱3 !o_z AtQFRsRAF F6Ljb D1w抟ç<`9RDaJf.}AEm1$,`(zu^G;~q-X.L [y|OҰo^lMϋ3zPD?87W[C%A 88fHe)_h/#r1NƂajq (u ~K n>E<dz;Z׸tyY,z%Ò)6 $%(;lN/`A3V 6[wD~3 ӄ͎smADBiHDnpk:i'O`BiٯtX \˿\'޳ʢ۔I:"!uu@r-{ smwg-gJ@x!+A6`C>) %t65H's.i#I#xv-3pD RKFZXQL8q\FMe[{_g@ ly nP`M8su6TfTGrdgP0臊b:3ϥ/ xx= vYCHԼ)aɐI0f\;~20{?R2dX@w)FEjahBs߶/@t_L8hA$ŸR&U8-MQؙW4ފĜ1MO|!s)kC_GSdja6,n1mJTdW҄S[A|1>5s!!d֒24= -dQEb80QQLYċ7s:xyN34'gU$ς9@nًg(ۯ <xJ:5,f@õQ|5aVG-30Ǚ&u?zLxs!ÅN̟ƪ MތYX8ab"DW ubm.Tt> :!=h]ų*{/ȥ#,4>av'd5!y{kr1@F9\tDީZD-ʝ#m/yD DK!5 C̦O.K__Z2޼ ÙD, =>~. 1ГwG_T)!r))ځW @t87^K@?_]Ԭv:C:lwu/ӊR%L PbA{y1&@T[)S7բV;SFlB{mLY}bdϜdrP)l$_Q$?^f}\<:QdhCR})=*Up36&n_ַ zeI|~Nw_~MJg-}*H/%p{N]r,!)7h3fܿ@V_RyCziT5QaHFL!>zWED B zM2Is Zra M(/\A[L-3 K]Y$[1<0j9Ad?o58 Xe7"?jstKB9R0.&?dچ$G,3j؈C<l-{門 lĽnAHȠ]Bȝ KM1 Ⱪ\!dt,s{- Ow˅N.!_b'D?Z~2" Д :䪓@>},1am p/B:2L.,QCvh]~D@o,=.rn|@"N"edQW#~<G%! Mze? "{yN%N+*?CJ\J>,j8)S fmވyt2u`9/DUʃ}6pN lIe)/Ao qDQHl`ciӡLpK X(AKk~  ˀ`l Vm{mvRuH:C^6 N)4@\hm;Iy[c%Y~:|VHfl̞Dm+-߲趲+8.ʙDMZ5KƶdDB[˓y*ru$hc? aJ_ZېQX6o{n`fig9CY/}L{܋ LtaBW\T2zkk^R4cU6Ş+˹RYèUyNp)C\ -0ٖ>roc|hO>Q`\*`ON,}VqXd-+kY?= ۚ`1;HJayd녡4 $p*Q7nO>F~8\Xkq2 ɓ@ bYzI{MPu #_XkRYM-4^ %MHI.j@HĞQe4fr{f0Šb<9ڲU_ pzSSF)i+z"I}Uav$G~$7$~ R,~?0]4T8`tb"7=\4}T̕ZrisѽCq|b/ v?U[`Zp=>d4ց-/tXzWҸ'+TI[1b,>-gL$ ^Ln XY?"KId(]*^fI_n}pӠ7nZ M$4,F*g,]!8O4 4(L53T 9#K\g`BàYBnL!.2KGCh2WJL h=}O3frQhma^.l[ `Dz3&c;0ض6g>mLBQd%e;h߸B M߁Cb,jpKAYO5"G{?Eoi5@m:U!y*4~$0!qƄJoٜEI=%S\C,`ZY 귿]nQR[zz$&ms¨h- T# dE<]lWp{^1vcnꞮй}B㐷 !u:*kr;Iݣe|L 皘ؘPu}T& 0xlʘbF3Ȯ(6ىp%s9TR@Y'ED%bc0w+ag;{J;~ϥqW6%~7w&! ^ aэk`/c6w7n +5=k7.{X}:%T *X_Ț60.?LrLm+%m GOEGowv8C+00*Y K;0i`{:ԝߗfCD3E89shSdӯ,9bib5^:j/SJ),P,fzbk:B&>S@qPf21`oY<p :d&`%a^3rh{gEٴ~w~W}ybQZπ.إ;SQ= =Ѳh!eAޒlȐiTFQ9F SKܽgdꝘ z:9 >~\ d/w^y:S@ D <\;WRy-u[0oEeldש_83x~{kCo~DeH2qDc<[uʽ;TX3җe b"JU\Ƅ/}IT]@XpxhnzKcT%ސ38,n;w>%楎30Mpvd3x]O8afBll^=UZp:$87-"o{ 4:Wz2* W.`,kƤpce/͕ٟsFQV&FB?y~疌O+7/a%Qw9(uK~0vĻnv`eSN%sMmפu[%/{p $5Q{xQ1+1WPK(HKyxZJ#3K!^z߯"Q@rB!7vF`,[D6.{T\,@X2h?j9[;+]u FxD࣢1ǩ3|#Fd}2DiS +**LsӚnTX_Axd؈Ӡa>7>}ū70b)o˛vݮ(NE!7C1. j⓺<XNfb*2+1-jRV*5\s_~N]8Km t!nMRgeh*^Π3L(#=T:PUŠ1ϔ6 ,7'2[ ! @$=ƍv@i f[FcJAc,u[w|N\Fo'jpV@YSP I&<:k5U,i1ePIS $L׆QŒ3V34!ITR0`RXm8JN`ek21Ir$yt1W!N7RބzbdŮG?vO^ɿ ?'Vjvoʵ´H=ȑ2_ en\qLb]11eءr'JeQ O1Q,MV "XKWM\t_Yz+ "+I~0֗@S@ \_Gԝ-$N %l=@qFΦk٘5o>O6pĮ-nq)e[[;Еwc]h\wA-ϣ:6]hK(ߦ%o6d|^&.dy64F}gs,U&QNE?OF^-Z)B=4`(MV:%+}|Ix9p3 o|ɟgduձO8񖷿~%J vnꨪE֌-9\/)`y/i7T ]m=Q44o\B,"+A[eԭ 06 <S-E|o5>|Wlrխ޷Q}VFbX>\ $anaOkσ"%229b}_erj\2 Oce:'5 TZDe;I{`rƨLV,4и]Usc[Noo#mt'|n}[_8ll(=*=1<42.ဓjcVo} iѨƔ 4v0BqZnXLnL7˝ mtÔT\͕ܿPQ[=u}>J %n[&CXi@cyZ$٩Y&Օ3KK/9d,mɁsU~uFKɀ^Q ^A@.9s,Lv#``=:Pjb!tOv՞0a\B+S ?qe^5Fڽ\.};G.;t}֯i3Bt]F8Z8ѱ$.Jwi-@H 8M|/$_7qz> waaVxXݪt{hYxGЧtiBy ȪBXei])C׀ LLsz0XX[pׅ,*,k_ y2h?Z`=QkNPQP[%|*mkV76Z>T1p'33Ϥnt-I&@@OZi4BEUbdX7XKGq42f_8s,CjTQo/?JD̐"#e4/>:ҔFzߡN0 h_@w2DH KinNL_rʣgϞ-Pߡ{>scǟj50Lh~ql3Xh7(!-މy TkY23jO*46٧ێ+[]5RG<ȟ2mK)/O̻ :kgyz|%~WAȣu";nW_}ҥK }m(K n@(45ٖuhyc$:5M{kr0zN U]?;i ]MAV6Wp]T_Ԧ7]У:{`h;>eS[ s%؂`u]u 'F&'|Xa %` Nq~޾zKKKK OP- >J+ȑOGMT,\AC WE&v Z6Mp8WĤU֦2MIMփ04P8}@ʂ擅̷36Ab)88l\`)8 &U#-h[I߼|r^ur6 'O|hQԼRR:A>j\3i&e%LSy-yM!kD̛S>&2EPH44 i.yKV=R "ݬB%~n"`GA܂8І͘]+f2QUE{ee+˔+?r^%g#{_lO>oj2aNEf(T--Ɠ\ --W_}+nW^PRǷIFr!ĺZ?zpkptAdP:ǿ%5Е<3E9vm(/b$;p0 AFt *ͧ{r?j``::~/ZflA,0`YpZ!']J9@gMΒɁC`]cQK p$Qh^% -7f Vvn\A`e=4+1YDQ'0 Dr-Y5yg7x .\ C:t8q3ݙY0Llj:pz7̩jDeN0ɕuFB}x,>Dв:"4QhI4WYOD;AXX; 9c["\8Tm! p$H!]^ݮX^{_|k/_@ub,`8xSwW;(.*@ X(4}&p*C1_yQuEhhu4 כ:&@]gSBr>i.C@uyVpzk#Έj͂ vX)mN 8BP?-<@캭%թ3,wk酥߇1ơuˣ`}q#ԷU!7P!?*[8FOwl G@(Pfl CqΨ!GZա661BM l00뛻JQJ##ުkI%|^Yj\2,%!}vDR%$G1o\ D˕,--& 4> Rc" Sg&:H\Z:zֽfw& P~,`S-wpSvF=YThشb B܌ɝh̓:Զc.v.rM^8K],-B?e֞|~_$ F+'Nw a\;L$Mh"@"y?,7Pt-|Z!ׄdO<'eK|phM[HUw_9 jb} Lgmf. "0? \R*wkz1XiLS:%o Xvmm ,[Ang_~ Icb~~/O۟u%GbU=/hu0(EќW6u,UUJ C+k*ڔ3|0yi rwc J~` /v$ (3o]ҦfpQtOΟ?0ہY9vؙ/ZH7_yRc# dDy:-ڪ^ytmfB]ɓ%,a{d?3bWэ߆<^{d-6n:瀽`91>+FH1n,)oJp𽗴͛7vܹ%4?ۗ{k=(1ct?՞|4U~@ywc#w^O\q Q=Ay{iq-vfa Y~+C6.5NUPKb H(|P74H!QΛnȵX2U`Q+bV$܁ dzs8Lmmn=k0R?+V @@A<܂&gb"Utn@"O`dWqKnNiS]X4m\A46,!Omǡē PGiv:Wx[ vEf%3i[zu$@ άv"#@y͝tۙzݞx8XFd̓ٙGf^z D$w;YY}arRgH-"BOsXtB6J6A8І*w|b$0q DeN^ob֞U E[^߸jUPu~A Z9[n;tN$@X=cHsLVԗ̠|]ijFF8J KC2ȬA L MY!5W#a+.*Z׷4b-6t PօָH #z v+p~d&jҵ{W?tƍ^(z((ك:~ZhLo-8b;Iٙtߞ|Vv:p&edvthsO |Ջfg}ZAEbVh[P5 FWLkYh" kst,8eN)*JE/~;^IzHf۴po$~*ZI0"$t$ў:TݚKfө{{t,ӑV,JؒHj_ݫF'+"RSegkW51~e4 Ai{kҪ_Ow>$U.hNc8i4Fvxvڒ[oW&a+nE/s# ( D 6S3 j՝[;׮{c^WeggW ;1$$ܤ>](,zGxؔ(?4N <: ]0h)Q%#Ot <@8QS4hYb = (};pqx717@0^@5'e]; ]M9H9%Pg)wxB8܍cnSFQCQ_St5(xחF`Ҕ1. 4)c\hJSƸ4Дqi)M@S2ƥ4eKMiҔ1. 4)c\hJSƸ4Дqi)M@S2ƥ4eKMiҔ1.އb+IENDB`(     !"##$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$##"! !$ 8Vv !!!!!!""!!!""""""""#"""$$#$$$$$$$$$%%%%%%%%%%&%&%&&&&'&&&'&'''''''('('''((((()()))))))))))))*********++++++,,+++,,,,,,,--,------.--.-.....///./00/0//000010001110121122221223332333333344444454555555665666667776777777676777778888998777788888788888787666444001v'''U7$!#V !"!"!!!!!""""""#"""""#####"#"####$$$##$$$$$$$%$$%$%%%%%%%%%%&%&&%%&&&&&&&&''&'''''(((''('(((()(())()))*))))******++**++*+++++++,+,,,,-,-,,---..-.....-...////////00/00/0000001101111121222223333333334344444544555555556666666767777778788888989998999999:::::::;;;;;;<;<<;<<<==<=======>=:::878))(V##t !!! !!!"!!!!!"""!"!"""""""""############$##$##$#$$$%$%%%$$%%%%%%&%&&&%%%&&&&&&&'&''''''''''''('(((()(())))))))))*))*)***++*+*++++,++,+,,,,,-,,-,------..-....../..///////0/000000011111112122222322232333333344444445555555555666667767776778878788888999999:9:::::;;;;:;;;<;;<;<<<<<<<==<======>>>>>>>>????===332s#T ! ! !!!!!!!"!!!""""""""""##""####"##"#####$$$#$$$$$$$$$$$$$%%%%$%%%&%%%%%%&&&&'&'&&'&''''''('('(((((()()))))))))*)*******++**+*,++,++++,,,,,,,,-,--,------......././/////0/0000011110111111212222222222332433333444455455556565666676776777778878888988999999:99:::;::;::;;;;<;<<;<<<=<===<==>===>>>>>>?????????@?@@@@>>=***Sx ! ! !!!!!!!!!!!"!"!"""""""""#"#""##"###$######$$$##$$$$$$$$$%$%%$$&%%&&&%&&&&&&&&''''''''''''((((((((((()))()))))***)*)*******+*+++,+++,,,,,,,-,---------.--......//.//////000000000110111112112222233333333333344444455555565665566666777777877878888988998:9999::::;:::;;;;;;<;;<;<<<<==<=====>=>>>>>>>>?>????@@?@@A@@@A@AAABAB454v { ! ! !! !!!!""!!!"!!!"!"""""""""#"""##"##########$$$$$$$$$$%%%%%%%%%%%%%&&%&%&&&&'&&&'''&''''''''(((((((()()))))))))*)*********++*++++,+++,,,,,,-,,,-----.-.--.....././//////000000101001111211212222232232333333444444554555555655666666676777787888888899999999:9:::::;::;::;;;;<;<;<<<=<<=====>>>>>=>>>>>?>??????@@@A@@@A@AAAAABBBBBBB676x R ! !!!!!!!!!"""!!!"!""!!"!""""""""##""#######$#####$$$$$$%$$$%$$$%%%%%%%%%&&&&&&&&&&'&'''&''('''(((((((((()())))))*)**)*******+**+++++++++,,,,,+,,,,---,--..-...../.../..//////0//000010110101111212222222323333334334444444545556555666666767677778878889889999999:::9:::::;:;;;;;;<<<<<<=<===<==>>=>>>>>>>??>?????@?@?@@@@@@A@AAAABBBBBBBCCCBC...P   !! ! !!!!!"!!"!"!!""""!""""""""""##"###$###$#$##$$$$$$$$$%$%%%%%%%%%%&&&&%%&&&''&&&&'''''''('(((('(((()())())))))))***********+++++++,+,,,,,,,,,,-,-----..--....//././/./////0/00001001111212122222223332333333434444545555555665666776767777788888888898999999:9:::::::;;;;;;;;;<;<<<<<=<==<==>>==>>>>>>>?>????@?@??@@@A@@AAAAABBAABBBCBCCCCCCCBAB  !!!!!!!! !!!"!!"!!"""""""""###"#"#"########$#$$###$$$$$$$%%%$%$%%%%%%%%%&%&&&&&'&&'''''''''(''''(((((()(())))))))*))***)****+*+++++++++,,,,,,-,--,,----.---.........///////00/0/0001011111211121222323223333433434444444555565556566667667766887878788898999999:9:99::::;::;;;;<;<;;<<<<=<<==>>=>>>>>>>>>>?>???@???@?@@@@A@@AAAAABBABBBBBCCBCCCCCDCDDC<;;  !!!!!!!!!!!""""""!"""""""""""##"##"######$$$$$##$$$$$$%$%$%%%%%%%%&%&%%&&&&&&&&'''&'''''(('('((((()((()))))))**)*)*********+*++++,+,+++,,+,,,---------...-....////////0///0000010001101112221222223222333333434444444544555655666666676776787787888899988999::99:::::::;;;;;;<<<<<<<=<<<=======>>>>>?>??>???@??@?@@A@AAA@AAABBBABBBBCBBBBCCCDDCCDCDDEEDCD p! !! !!!!!!!"""!"""""""###""###"########$##$$$$$$$$$$%%%$%%%%%%%%&&&&&&&&%'&&'&'''''''''''('('(()(()())))))*))*)**********+++++++++,,,,,,,,,-,,-----.-.-.-....././///////0/00010111001111222222322323333333444444444455555666666666777777777887888988989:99999::9::;;;;;;;;;<<<;<<<<<=======>==>==>>?>>>???@@?@@@@@@A@A@AAABABABBBBCBCCCBCCCCCCCCDDDEDEEEEE:::l !!!!!!!!!!"""!""""""""""##""#"######$$#$#$#$$$$$$$$%%$%$%%%%%%%&&%%%&&&&&&&'&&&&''''''''((((((((((((())))**)**)*******+*+++++++++,++,,,,,,,----,--...-........./////////000000000111112122221222233333333443444544555555566565666677776887887888889999999:::::::::;:;;;;;<;;;;<<<====<<===>====>>>>?>????@?@?@?@@@@AAAAABABABBBBBCCBCCCCDCDCDDDCDDDDEEEEEEEFCBC  !!!!!!"!"!!"""""""##""#"""""#"####$####$$$$$#$$$$%%%$$$%%%%%%&%&&%%&%&&&&'&&''&'''''''''''((((((()())())))))*)))***+*+**+*+++++,,+,+,,,,,-,,,----.----.-..////.////0//////0000001111111122222322322333433443444454554555566666666666777877888888988989:999::9:9;::;;;;;;;;;;<<<<<<=<<<====>>>>>>>>>>>???????@@@@A@A@@AAAAAAABBBBBBCBBBBCCCDDDDCDDDEEDEEEEFFFFFEEEEH!!!"""""!!"""""#""#"#"##"#"##"###$##$##$$$$$$$$$$%$%%$%%%&%&&&&%%&&&&&&&&&'&&'''''('('('(((((((())()))*))*******+****+*+++++,+,,,,,,,-,,,,---.--.-..../../..////0000/00001000011121111122223323233334443344445455555556556666676677687778888888889999999:9::::::;:;;;;<<<<<<<<<=<======>>=>>>>>>>?>???@?@@?@A@@@@AAAAAAAAAABBBBBBCCCDDDDCDDDDDEDEEDEEEFFEEFFFFFGGG776Ft"!"""!"""""!""#""##"####""#$#####$$#$$#$$$$$%%%$$%%%%%%&%%%%&%%&%&&&'&'''&''''('(''((((((()()))))))**)))))**+*+++*+*+++++++,,,,,,,,-,-,----.-........//..//.0///0/000000111111112221222322323333333333444554555555555666676677776877888888999988999::9:::;::;::;;;;;;<;<<<<<<<<<===>>=>>>>??>>?>???@@?@?@A@@@A@AAAAAABBBBBBBCBCBCCCCDCCDDCDEDDDDEEEEEEFFEFFFFFFGGG???r """!"!""""""#""#"#""##"####$$$$$$#$$$$$$$$%$$%%%%%%%%%%%%&&&&&%&&&&&&''&'''(''''((((((((())))))))*)))))*******+**++++,,++,,,,,-,---------......./../..././//0//0001010111112122112222322233333334344444544445566656666667677777778888889899889::::9::::::;;;;;;;;;<<;<<<<=====>==>=>>>>>>>>>>??????@@@A@@@@@@AAABABBABBBBCBCCCCCCCCDDDDEDDDEDEEEEEEFFFFFFFFGFGGGGGCCB !"!""""""""""#"####"####$$$$###$#$$$$$$$$%$%%%%%%%%%&%%%&&&&&&&&''&'&'''''''(('(('(((()))())))))))*******+*+*+++++,,+,+,,,,,--,,,-----.----.-..../..././/////00/001000110121221222233223333343444444454555555655666666677777788787888888999999:9::::::;;;:;;:;<<;<;<<<=<<=====>=>=>>=>>>?>>???@??@@?@@@@@@@A@AAABBBBBBBBBCCCCDCCCCCDDEDDEEEEEEEFFFFFFFFFFGFGGGGGHHHEEE! """#""""#"""#########$$##$#$$$$$$$$$%%$%%$%%%%%&&%%&%&&&%'''&&&&''''''(('''('(((((((())))))))*))******+*++++++++,,,,,,,,,,,,-------..---../../..//.///00//00001011111111121222223222333433343444545555555656666676776777777878888898999999999:::::::;:;;;;<;<;;<<<<=<<=====>>=>>>>>>>>>????????@@@@@A@AAAAAABABBBBBBBCCCCDCDDCDDCEDDEEEEEEEEFFFEFGFGGFGGGGGGGHHHHHEFE!! "#"""#"####"#######$#$$$$$$$$$$$$%%%%%%%%%%&%&%%&%%&&&&&&&&&''''''''('((((((((()((())))*)))))*****+*+*++++++++,,,,,,,,,,-,----.---....././/..///////000/00000111011111222222233323333434334444445556656666666666777677888878889889899999:9:9:::::;;;;:<;;<;<<<<<<<<<====>=>>>>>?>?>>?????@@@@@@@@@@AAABBABABBBBBBCCCCCCCCDCDDDDDDEDEEEEEEEEFFFFFFGFGGGGGGGGGHHHHHIGGG """#"##"""""###$##$#$#$$$#$$$$$%%%%$$$%%%%%%%&&&%&&&&&'&&&&'''''''''''(((((((((((()())))))**)*******+**++++++++,++,,,,,--------.-..-.....//...../////00//0000111101211122222223333333434444445445545556566666667767767778788888889899999:9:::::::;;;;;;;;;<<<<<=<<=====>>>=>>>??>?>?????@?@?@@@@@A@AAAABAABBBBABCBCBBCCCCDCCDDDDEEDEEEEFEFFFFFFFGGGGGFGGGHGHGHHIHHHHIHHH ""#""##########$$#$##$##$$$%$$%%%%%%%%%&%%%%&%&&&&&&&&'''&&''''''(((((((((()(()())))))****)*****+**++*+++++,,+,,,,,,,,------....-.......././/0//0///00000110111111121212322323333333344444454555555566556677676777777887888889989999::9:99::::;:;;;;<;<<;<<<<<====>=>>>>>>>?>>??>?????@??@@@AA@@@AAAAAABABBBBBBCBBCCCCCDDDDDDDEDDDEEEEEFFEFFFFFFGFGGHHGHGGHHHIIHHHIIIIHH "###"#########$$##$$$$$$$$%%$$$%$%%%%%%&&&&&&&&&'&&'&'''&'''''''((((()(((((())))))))**)**)***++*+*++++,+++,+,,,-,,-------...-.-..///.////////00000/000000111121122222223323333333444444444554565665656666777677887788888998999999::99:::::;;;;;:;;;;<<<<<=<====>>>>==>>>?>???????@??@@@@@@A@AAAAABABBBBBBBBCCCBCDCDCCCDDEDDDEEEEEEEEFEFFFFFGFGGGGGHHHHHHHHHIIIIIIIIIIIHH "###########$$$$$#$$$%$$%$%$$%$%%%%%%&%%&&&&&&&&&&&&''''''''('((('((()((()))))**))*)*)**+++**+*+++++++,,,,,,-,,,-,------..-....///..././/0/00000000111111111112222332333333333344444444444555665656666766777877777888899999:999::9:::::;;;;;;;<;;;;<<<<=<==<=====>>>>?>???>???@@??@@@@@@@@AAABAAABBBBBCBCCBCCCCDCCDDDDDDEDDEEDEEEFFEFFFGFFGFGHGGGHGGHGIIHHIHIIIJIJJJJIII #########$$$#$#$$$%$$%%%%$%%%%%%%%%%&&%&&&'&&'&&''''''''''(('''(((()())())))))*****)***+*++++,++++++,+,,,,,,-,,------.-.......././/.0/////00000011011121212112222223333333343444455454455666566566777677777877888888899999999::::::::;;;;;<;;<<<<<<<=<<======>=>>>>?>??????@??@@?@@@AA@AAABAAABABBBCCBCBCCCCDDDDCCEDDEDDEEEEEEFFFFFFFFFGGGGGGGGHGHHIIHHIIIIIIIJIJJJJJIII ###$#$#$$$$$$$$$$%$$$%%%%%%&%&&%%&&&&&&&&&&&'&'&''('('((('('(((()()())()))))**)))****+++*++++,++,,,,,,,-,-,----..-.--.....././///0//0//0001001011111121122122222333334334444445454555555556666666667777788877879889999999:9::::;:;;:;;:<;;<<;<<<=<<<====>=>=>>>?>>?>>???@??@??A@@@A@AAAAAAABABBBCCBCBBCCDCDDDDDEDEEDEEEEEFFFEEGFFFFFGFGGGGGGHGHHIHHHIHIIIIIIJIJJJJJJJJIJ ###$$#$$$$$$$$$%$$%$%%%%&%&&&&%&&&&&&&&&&&&''''''''(''''(((((((()))))**)*)********++++++++,+,,++,,,-,,-,,------.--.../..//.//.///0/0000010001111111111122222223233433344444444554555655666666676777787778888889998999:9::9:;;:;;;;;;<<;<<<<<<<=<======>>=>=>>?>?>????@??@@@@@@A@AAAAAAAABBBBBBBBBBBCCCDDCCCDDEEEDDEEEFFEFFFFFFFGFFGFGGGHGHHHHIHHIHIIHIIJJJJIJJJKJJKKKJJJ $##$$#$$$$$$$%$$%$%%%&%%&%&&%&&&&&'&&'&&&''''(''''(((()(())((()())))*****)*++*+*+**++++,+,,,,,+,-,,,,----.-.---......//.//////00/00/000101011111111222222332333333334444444545555555666666776776787788888988999999::::9::::;::;;;;;<<;<<<<<<<=<=>===>=>>>>>??????????@?@@@@A@AA@ABBABABBBBBBBCBCCCCCDCCDCDDDDDDEEEFEFEFFFFFGGFGFGGGHHGHHHHIHHHHHIIHIIIJJJJJJJJJKKKKKLKKJ $$$$$$$$$%%%%%%%%%%%%%&%&&&&&&&'&'''&'&'''''('('('(())))(()()))))))**********+++*+++,+++,,+,,-,,--,-,--.--.-.--...././////0//0000000010011111221222222323333344443444455455655665556666767767777787888889999999::9:::;::::;;;;<<;<<<<<<==<<=====>==>>>>>>??>???@??@@@A@AAA@A@ABBABABBBBBBBCBBCCCCDDDDCDDDDEEEEEFEFFEFFFFFGFGGGGGGHGGHHHIIHIIIIHIIIIJJIJJJKJJKKKKKKLLKJKK $$$%%$%%$%%%%%%&%%&&&&%%&&&&''&'&'''''''''''(((((()))((((()))))*))******+*+++*+++++++++,,,,,--,--------.-......./././//000/000010011101211112122223333333344444444544555555565656766667777777778888888899999:9:9:::;;;::;;;;;<<;;<<<<<<=====>=>=>>>>>>?>>????@@@@@@@@@@AAAABAAAABBBBCBBBBCCCCCCCDDCEDDEEEEEEEFEFFFFFFFFGGGGGGGHHHHHHHHHIHIIIIIIIJJJJJJKJJKJKKKKKLLKLLLKK $$$$%$$$%%%%%%%%%%&&%&&&&&&'&'''''''''''((('(((()))))()))*)))**)*****+**++++++,+++,,,,,,-,,,,,--.-...-.--.../../////////000000010111111122222222333233334343444544455555665666666777677877878888888999999999:::;:::;;;;;<<;<;<<<<<<==========>>>>>>??????@??@??@A@@A@@AAABABBABBBCBCCBCCCCDCCDDDDEDDDEEEEEEEFFEFFFFGFGGGGGGHHGHHHHHHIHHIIIIIIIJJJJJJKJKJKKKKKLKLLLLLLLKK $$$%%%%%%%&%&%&&&&&&&'&&&'&'&'''''''((''(((((()(((())))*))*******++++++*++++++,++,,,,-,-------------...///.//./////0/00010001011111121222222232333333344444444455456556566667777677677888888898889899:9::::9:::;::;:;;<;<<;<<<=<====>===>==>>?>???????????@?@@@AAAAA@AABAAABBBBBCCBCCCCCCDCDDDDDEDEEEEEEEEFEFFFFGFGGGGGGGHHHHHHHHHIIHIIIIIJIJJJJJJJKKKKKKLLLLLLLLMLMLLLL %%$%%%%%%&%&&&&%&&&&&'&&'''''''(''''''((((()()())))))))))*******+++**+++,,++,+,,,-,,-,--------.-.-...////////////0000100011111111222122222223333333444444455445555665566676667777778787888888998999::9:9:::::;;;;;;<<<<<<<<<<<=<=======>=>>?>>????????@@@@@@A@@AAABBABABBBBCBBCBCDCCCCDDDCDDDEEDEEEEFEFEFFFFFFGGGGGGGHGHHHGHHIHIHIIIIIIIJIJJJKKJJKKKKKLLKLKLMLLLMMMMMLLL $%%%%%%%%&&&&&&'&&&''''''''('''''(((((((()))(())))))*)*)*++****+*+++++,+,,,,,,---,--------.--......//.//////0//000000010111212112222223322333344444444444555555556666666666677778788888889889999:9:::::::;;:;;;;<;<<;<<<==<=======>=>>>>>??>?????@?@@@@@@@@AAAAABABBBBBBCBCCCCCCCDDDDDDDDDEEEEEEEEFFFFFFFGFGFGGGGGHGHHHHHHHIIIIIIIIIIJJJJJJJJJKKKKKLKLKLLLLLMLLMMMMMMMMM %%%&&%&%%&&&&&&'&&'&'''''('''(('((((((()())))**)*))********+*++++++++,,+,,,-,,,--------......./..//////0//0/000000001110212111222332323333334443444544554555665656667766767777877888988889999:99:9:;:;::;;;;;;;;;<<<<<=<======>>===>>?>??>????@?@@@@@A@AA@A@ABBBBBBBBBBBBCCCDCCCDDDDDDEEEDEEEEEEEFEFFFFFFGGGGGGHHHHGHIHIIIIIIIJIIJJJJJJKJJKKKKKKKLKLLLLLLLMMLMMMMMNMNMLM &&%%&&&&&&&&''&&&&'''((((''('(((((()())))))))))********++*+++++,++,,+,,,-,,-,-------.-....//.//.////0/000000010100111221222222323333333334334444454455565565656666676677877887888898989999:9:::::;;;;:;;;;;;<;;<<<<========>>=>>>>>>????????@@@?@@@@AAAA@AAAAABBBBBCBBCCCCCCCCDDDDDDEDEEEEEEEFFFFFFFFFGGGGGGHGGGHHHHIHHIIIIIJIJJJJJJJKJJKJKKKKKKLLLLLLLLMMMMNMNNNNMMNMMM %%&&&&&&&&&&&''''''(''('((((())(())))())*)*))*)***++**++++++,+,+++,,,,,,-,---,.-...-...//.//./..///00000/10000111111112222222222223334344444444544555556666666666777788777888889888899999:9:::::;:;;;:;<<<<<<<<==<=<====>>>>>>>>>???????@?@@@@@A@A@AAAAAABAABBBBCBCBCCCCDCDDDDEDDDDDEEEEEEFEFFFFFFFFGGGGGHHGHHHHHHIIIIIIIIIJIIJJJKJKKKKKKKKLLKLLLLLLLMMMLMNMMMMNNNONNMMN &&&&&&''&'&&'''''''(''(((()(())())))))))*)**)*+**++++*+++++,+,+,,,-,--,---,.-.-..-.....///././/0//0/00010010011121212222322322333333434444444445555556666666776677777888888989889999999::9;:::;:;;;;;;<;<<<=<<<<<=>>=>==>>>>?>>????????@@@@@@A@AAAABAABBABBBBBBCCCCCCDDDDCDEDDEEDEEEEFEFFFFFFFGGGGGGGGGGGHHHHHHIHIIIIJIIIIIJJJKKJJKJKKKKKLLKLLMLLLLLLMMMMMMMNNNNNNNOONNN &&'&&'''&''''('(''((((((((())())))*)***)*)+*****+*+++++++,,+,,,,,,--,--------......../////0//0000//000011111111121222323332333334444444455554556655656766766777777888888888898999999::::;:;;;;;:;;;<<<<<<=<<===>==>>==>>>>??>?????@@@?@@@@A@AAAABABAABBBBCBBCCCCCCCCDDDCDDDDDEEEEFEEFFFFFFFFFGGGGGGGGHHGHHHHHIIIIIIIIJJIJJJJJJKJKKKKLLKLLLLLLLLLMMMMMMMMMNNNNNNONNOONNNN ''''''''''''('(((((((()())))))*))**)))****+**+++++++,+,,+,,,,--,-,-----.-.-....../....//0//00000100001011111111222222223332433344444454555555565666676767677777778888888899999:9:::::::;;;;;;<<;;<;<<<<=<<=====>>>>>>>>?>?>?????@@@?@@@@AAAAAAABBBABBBCBBBBCCCCDDDCDDEDEDDEEEEEFEFFEFFFFFGFGFGGGGHGHHHHHHIIHIIHIIIIIJJJJJKJJKKKKKKKKKKLLLLLLMMMLMMMMMNNMNNNNNOOOOOOOPOPP '&'''''''''((((((((()))(())*))**)******+**++++++++,+++,,,,,,,,----.-.---....././././///0//000000000111111212222222333333333444444544545555556666666667776777788888898999999999::::::;::;;:;<;<<<<<<<<<=========>>>?>>>>????@@@@@?@@@@A@AAABBABABBBBCBCCCBCCDCCDCDDDDDDDDEEEEFEFEFFFFGGGFGGGGGGGGHHHIHHIIHIIIIIJJJJJJJKJKJKJLKKLKKLKLLLLMLLMMMMMMNMMMMNNNNNOOOONOOOOOPOOO ''''''((('(((((((())())()))*))******++++*+++++,++,+,,,-,-,,-----...-........////////0//0001001011111212212122223233333434434444545555555655666666767777778888889889999999:99:::::;;;;;;<;<;;<<<<<<<<====>>==>>>>>>>?????@@?@@@@@@AA@AAAAAABBBBBBBBBCCCDCCDDCCDDDDEDEDEEEEEEFFFFFFFGFGFGGGGGHHHHHHHIHIIIIIJIIIJJJJJKKJKJKKKKKLLKLLLLLMMLMLMNMMMNNNMNNNNNONONOOOOPOPPPPOOO ''''''(('(((((()(())))))*)********++*++++++,+,+,,,,-,,-,,--,---..-.../....///////0/0/00000001111211111212322333333333334444445554555665666666777777777887888898988999::9::::::::;;;;;;;;<<<<<<<<========>>>>>?>??>???@?@@@@@A@@AAAAAAABABBBBBCBBBBCCCCDCDCCCDDDEDDEEDEFFFFFFFFGFFGFFHGGGHGHHHHHIIIIIIIIIIIJIJJJKKKJJKKKKKKKLKLLMLMLLMMMMMNNNMMNMNNNONONOOOOOPOOOPPPPQOOP '''((()((((()()))))))))********++*++++++++,,,,,,,,,--,----.-....../...//////0/0///00101111111111121222232232332343444444545454555555565676767777777777888899988:999999::;:::;:;;;<;;;;<<<<<=====>====>>>>>>>>>????@?@@??@@@A@@AAABAAAAABBBBBCCCCCCCDCCCDDDDDEDDEEEEEEFFFFFFGFGGGGGHGGGGHGHIHHHHHIIIJIIJIIJJJJJJKKKLKKKKKLLLLLLMMMMMMMMMMMMNNNNNNNNNNOOOOOOPOOPOPPPPQPPOP ('(((())(()))))))))***********+++++++,+,,+,,,-,--,--------.-..-...//.///0//0000001001011111112121222332223333434444445445545555656656666667778788788888888899999::::::::;;:;;;;;;<<<<<<==<===>>=>>>>>>>>>??????@??@@@@A@@@@AAAABABBBBBBBBBCBCCDCCDCDDDDDDEDDEEEEFFFFFFFGGGGGGGGGGHGHHHHHIHIHHIIIIJIJJIJJJJJJKKJKKKLLLKLLLLLMMMLMMMMMNMNNNNNNNONNOOOPPOOPOPPPPPQPQPPQQPPP ((((((()))())))****)*+******++++++++,+,,,,-,-,---------..-.-..././//.//000//00000010111121111212223233333344333444444555555656666??????@@@@@@@@@AAABBAABBBBBBBBCBCCCCDCDCDDDDDEDEEDEEEFFFFFFFFGFGGGGGGHHHGHGIHHIHIIIIIIIIIIJJJJKJKKKKKKKKKLLKLMLMMLLLMMMMNNMNNNNNNNONNONOOOOOPPPPPPPPPPQQPQQRPPQ )())))))))))*****)*+**+*++++++++,+,,,,,,,,,,-------...-....././//////0/0000000010011111112222222333333333434444444554555566656766BBB?@@A@@@A@AAAAAAABBBBBBBBCBCCCCDCDDDDDDDDDDEEEEEEEFEFFFFFFGGGGGGGHHHHHIIHIHIIIIIIIJIIJJJJJKJKKKKKKLKLLLLLLLLMMMLMMMMMNNNMNNOONNNOOOOOOOPPPPPPPPQQPQQRQQRRRQQQ )())))))))))******+*++++++,,++,,+,,,,--,,---,.--..-.....//..//////0/000/001011111121112222332322333333444444544554555555666666667AAA@@@@@AAAAABABBBBBBBCBCCCCCCDDCCDDDDDDDEEEEEEFFFEFFFFGGGGFGGGHGHHHHHHHHHHIIIJIIJIIJJJKJKKKKKLLLKLKKLLLLLLMMMMMNMMMMNMNNNNOOONOOOOOOOPPPPQPPPQPQQQQQRQQRRRQQQQ ))))*)**)******+**+++,++,++,,,,,,,,,,,----..---..../../../////////0/0000110111211111222322222333343334444444555555566666766667777AAA@@@AAAAAABBABBBCCBCBCCDCDCDDDDDDDEEDDEEEFEFFEFGFFFGGFGGGGGHHHHHHHHHHHIIIIIIIJJJJJKJJJKKKKKKKKLLLLMLLLMMLMMNNMMMNNNNNNNNNONOOOOOOPPPPPPPPPPQQQQQQQQQRRRRRRQRQ *))**)**)+****+*+++++++,,,,,,,,,,--,------.--.../...../////00/0/00100000111212121222222223333333334444445555655556665767676776777AAA@A@AABBBABBBBBCCCCCDCDDCDDDDDDEEEEEEEEFFFFFFFGFFGGFGGGGGHHHHHHHHHHIIIIIIJJIJJJJJJJKJKKKKKKKLKLLLMMLMMMMMMNNNMNMNNNNONONNOOOOOOPPPPPPPPQQQQQQQRQRQRRRRRSRSRRR ****)****+*+**++++++++,,,,,,,,,,---,--..-........././.0//0//000110110111112221222222233333334444444544444555556666666777677777788BBBAAAABABBBBCBBBCCCCDCCDDDDDEEDDEEEEFEEFFFFFFGGGGFHGGHGGGGHHIIHHIIIIJJIIJIJJJJJJKKKKKKLLLLLKLLLLLLMMMMMMMMMNNNNNOOONOOOOOOOPOPPPPPPQPQQQQQQQQRRRQRRRRSRRSRSRRR *********+**++++,++,,,,,,--,--------........./..//////////00000000111111222222222323333333433444445445555555666666776777778888888CCCBBABBBBBBCBCCCCDDDDDCDEDEEEEEEEFEEFFFFFFFFGGGGGGGGHHHHHHHIIIIIHIJIJJJJJJKJKJKKKKKLKKLLLLLLLMMMMMMMMNNNNNNNNNNNNOOOOOOOOPPPPQPPPPQPQQQQQRQRRRQRRRRRRSSRSSSRSS ***+++++++++,,,,++,,,-,-,,,-,,.----......//..////00///000010101111112<<;<<<223223333434444444445554555556666666777767878888788899BBABBBBBBCCCCCCCCDDDDDDEEEEEEEEFEFFEFFFGFGGGGHGGHHGHGHHHIHHIIIIIIJJJJJIJJJJJJKKKKKKKKLLLLMLMMLMLMMMMMMNNNNNNNNNONOOOOPPOPPPPPPPPPQQQQQQQQRRRQRRRRSRRRSSSSSTTSSR +**+**++++,+,++,,,,,,-,----.-..........//.././//0///00100001111OPPRRR334443444444455555655666766677677777877888889988:::BCCCDDDEDEDEEDEEFEFFFFFFGFFGGGGGGGHGHHHHIIIIHIIIJIIJIJKJJKJJKKKLKKKKKKKKBBBCCBCDCCCDDDDDDDEEDEEEEEEFFEFFFGGGFFGGGGHHHHHHIHIHIIIIIIIIJIJJJJKKJKKKKKKLKLLKLLLLLMMMMMMMMMMMNNNNNNONNONNOOOOPPPPPPPPQQQQPQQQQQQQQRRRRRSRSRRSSSSSTSTTSRRS *+*+++++,,,,,,,,,--,----.--.-....../...//.///0/0000010100111IJI|||444444455655566655676676776777788878888999999999:::::;;::;;;;<;<<;<<<=<<<=<=>==>=>>>>????>?????@@?@@A@@@@AAAAABAAABBBBCBBBCCCCCCCDDDDDDEDDEEEEEEFFFFFFFGFGGGGGGHGGHHHIHHHHHIIIIIIIIJJJJJJKKJJKKKLKLKLLLLLLMLMMMMMMNMNMNNNNNOOOOOOOOOOOOPPPQPPQPQQQQRQRQQQRQQRRRRSSRRSRSSTTSTSSTTTSTS +++,,,++,,,,,,---------......./../..////0///000/01011011111155556565566566677677777787888898899999999:9:9:::;:;;;;;;;<;;<<<==<=====>=>=>>>>>>?>>??????@?@@@A@AAAAABAABBBBBBBBBCCCCCCCCDCDDDDDDEEEDEEEEEEFFFFFFFFGGGGGHHGHHHIHIIIIHIIIJIIJJJJJJJKKJKKLKLKKLLLLLLLLLMMMMMMNMNNNNNNNNNONONOOPOOOOPPPPPQPPPQPQQQQRQQRRRRRRRSSRSSSSSTSTSSTTTTUTTSS ++,,+,,,,,,,-,----.---........../////////0000000010111122121XXW566766776766777778888888989999:99:9::::;:;;;;<;;;;<<<<=<<======>=>>>>>?>?>>??????@@?@@@AAAAAAAAABBBBBBCBBCBCCCCCCCDCDDDDEEDEEEEFEEFFFFFGFFGGGGHGGHGGGHIHIIHIIIIIIIJIJJJJJKKJKKKKKKKLKKLLLLLLMMMLMMMNNMNNNNNOOONOONOOOOPOOOPPQQQPPQQPQQQQRQRQQRRRRRRSSSSSSSSSTTSSTTTTTTTTTTT +,+,,,-,,-------.-.-.-../...////////00/000110001111211122222|{{6677667888878788998989999999:9:::;;;;;;;<;;;<<<<<=<===>>=>==>=>>>>>?????@@?@@@@@@@AAA@ABAABBBBBBBCBCBCCCCCCCDDDEEDEEEEEEFEEFFEFFFGGGFGFGGGGGGHGHIHHHHHIIIJIJJJJJJJJJJJJKKLKKKKKKLLLLLLLMMMMMMMMMNNNNNNONOOOOPOPPOPPOOPPPPPPQQQQQQRQRRRRRRRRRSSSSSSSTTSTSSTTTUTTUTTTUUTTT ,,,,-,,-------..-........./////0//0/000000001111111212222222777788888888989999999:99:::;::;;;;;;<;;<<<<<=======>=>=>>>>>?>????????@@@@@AA@AAABAABBABBBCBBCCBCCCDDDDDDDDDDEEEEEFFFFFFFFFGFGFGGGGGGHGHHHHHHHIHIIIJJJJJIJJJKKKJKKKKKKKKLLLLLLMMLMLMMMMNNNNNNNONONNNOOOOOPPPPPPPPPPQQQQQRQQQQQQQRRRRRRRSRSSSSTSSTTSTTSTTTTUUUUUUVUTTU ,,-,---,---.---......////////000/000000110111211221222232223LLLVVV998898999:::::::;;;;;:;;;;;<<<<<<=<=<<=>===>>>>>?>??>??????@@@@@@@@@@@@AAAABBBBBBBBCBBCCCCDDDDDDEDEDEEEEEEFEEEFFFGGFFGGFGHGHHGHHHHHHHIHIIIIIIJJJJJJJJKKKKKKLKKLLLLMMLMLLMMMMMMMMNMNNONONONOOOOPOOOPPOOQQPQPQPQQQQQRRQRQRRRRSRRRRSSSSSSSTTTTTTTTTUTUUUTUUUUUUTUU ,,,----.-.--.../....///////000000010011111121121222222333333333TTS999::9:::::;;:;;::;;;<<<<<<=<=======>>>>>=??>?????????@?@@@@AA@@@AAABBBBBBBCCBCBCCCCDDDDDDDEDEDEEEEEEEFFFFFFFFGGGGGGGHHHHHHHHHHHIIIIJJJJJJJJJKJJJKKKKKKLKLLLLLLMMLMMLMMMMNNMNMNNNONOOOOOOOPOPOOPPPPQPPQPQQQQQQQRRRRRRRRSRSSSSSSSSTTTSTTTTTTUTTUUUUUVUUUVVTTT --------......././//////0//000000001110111121222222332333433444444898:9:;::;:;;:;;<;<<<<<<<========>===>>?>>????????@@??@@@A@AAAAAAAAABBBBBBBCCBCCCDDCDDDDDDDDDEEEFEEEEFFFFGGFFGGGGGHGGGHHIHHIIIIIHIJIJJJJJJKJJKKKKKKKKKLLLLLLLMLMMMMMMNMMNNNOONONONOOOOOOOOPOOPPPQPQQQQQQQRRQQRRRRRSRRSRRSSSSSSTTSTSTTUUTUTTUTUUUUUVVVVVVVVVW ------....././///////000000100110111111111222222233333333444444555555555XXX:;;;;;<<<<<<<<<===>==>>>>>>>?>??????@@?@??@@@@AAAAAAAABABBBBCCBBCBCCCCCCDDDDDDEEEEEEFFFFFEFFFFFGGFGGHGHGHHHHIHHIIHIIIIIIJIJJJJJJJKJJKKKLKLLLLLLLLLLMMMMNMMNMNNNNNNONNONOOOOPPPPPPPPPPQQQQQQQQQRQQRQRRRSSSSSRSSRSSSSSSTTTTTUTTUUUUUUUUVVVVVVVVVVVUUU --...-/////././0000//000000101111221111121222322333333344444545554655655656]]]<<<<<<=<=======>>=>>>?>>>>>???@?@?@@@A@@@AAAABBABBABBBBBBCBBCCCCCCDDDDDEEDDEEEEEEFEEFFFGFGGGGGGHGGHGHHIHIIIHIIIIIIIJIJJJJJKJKJKKKKLLLKLLLLMLMMMMMMMNNNNMNNNNONOOOOOOPOPOPPPPPPQQQQPQQQQRQRRRRRRRRRRSRSSSSTSSSTSTTTTTTTTUUUTUUUVVVVVVVVVVVVWVVUVV ..-...//.///0//00/0/0000110111122121222232322333343343444545455555565665676767;;;=========>>>>>>>>>>?????????@?@@@A@A@AABAAABABBBCCBCCBCCCDCCDDCEDDDEDEEEEEEFFFFFFGGGGFGHGGGHHHHHHHHHIIIIIJIIJJIJJJJJJJKKKKKLLKLKLLLLLMLMLMMMMNNNNNNNNNNONOOOOOOOOPPPPPPPQQPPQQQRQRQRQRRSRRRRSSSRSSSSTTSSTTTTTTTUUTUTUUUUUUUUUUVVVVVVWWWVWWVVV /./....///0/0//000000101111111221222222323333333344444544445555566566666666677787888ZZY>>=>>>>>>?>????@@@@@?@@@A@AAAAABAABABBBBBBCBCCCCDDCDDDDDDEEEEEEEEEEFFFFFGFFFGGGGGGHGHHGIHHHHHIIIIIIIJJJJJKJJJJKKKKLKKLKLLLLLMLMLLMNMNMMNMMNNNOOOONOOOOPPPOPPPPPPQQQQQQQQQRQQQQRRRRSRRSSSSSSSSSTSTSTTTTTUTUUUUUUVVVVUUVVVVWVVVWVWWWWWVWV /..///////0/00/000110011212112222222333333433434444445445555655566667777676777778888988^^^UUT>>>>>>???@?@@@@@@@@@AA@AAAAABABABCBCCCCCCCDDDDDDDEDDDDDEEFFEFFFFFFFGFGFGGGGHGHHHHHHHIHHHIIIIIIIJJJJJKJJKKKKKKKLLLKLMLLLLLMMMNNNMMNNNNNNONNOONOOOOPOPPPPPPQQPPPPQQQQQQQQQRRRRRSSRRSSSSTTTSTTTTTTTUUUUUUUUUUVUVVUVVVVVVWVWVWWWWWXWWVVV /.//////0/00010110111111212222232233333334443444555555555556556666777777777877888898989:99;<;?????????@??@A@A@AAAAAAABBBBBBCBCBCCCDCDCCDCDDDEDEDEEEFFEFFFFFFFFFGGFGGGHGGHHHIHHHHIIIIIIIJIIJJJJKKKJKKKKLKLLKLLLLLLMMMMNMMMMMMNNNNNONNOOOOOOOOOPPOPPQQPPQPQRQQQRRRRQRRRRRSSSSSSSSSSTTTSTTTUTUTUUUUUUUUUUUVVVVVVWVVWVVWVWWWXXWXWWWVV ////0/000000001110111112221232233333333434444444455556655566666677777777788888898989999:99::::::qqrCCC?@?@@@@@@@@@AAAAAABBBBBBBCBCCCCCCCCDDDDDEDEEEEEEEFEFEFFFFFFGGGGGGGHHGHHHHHHIHIIIIIJIIJJJJJJKJJKJKKKKLKLKLLLLMLMMMMNNMMMMNNNNNNNNNOONOOOPPPOPPPPPQPPQQQQQQQQRQRRRRRSRRSRSSSSSSSTTTTTTUTTUTUTUTUUUVUUVVVUVVVVVWVVVWWWWWWWXXWXWXXWWW 0///000001001002112222223222323233334444444454555565556566667777777778888889899989999:9::::::::;iihCCD?@@@@@A@@A@@AAABBBBBBBCBCCCCCCDDCCDDEDEEEEEEEFEEFFEFFFFGFFGGGGGGHGHHHHHIIIIIHIIJIJIJJJJJJJJKKKKKKLLLLLLLLLLLMMMMMMNMNNNNNNNNONONOPOOPPOPPPQPPPQPQPPQQQRQRQRRRRRRRRSSSSSSSSSSTTTTTUTUUUTUUUUUUVVVUVVVVVVVVVVVVWWWWWXWWWWXWXWXXXWWW 0000101101112122222223223223233343334445445545555665666666677777778788888898899999:999::;;;;:@??@@@A@A@AAAAAABBBBBCBBBCBCCCCCCDDDEDDDDEEEDEFEFEEFFFGFGGGGGGGGHHHHHHHHIIIIIIIIIJJIJJJJJJKJKKKKLLKLLLLLLMLMMMMMMNNMNMMMONOONOOOOOOOOPOPPOPQPQQPQQQQQQRRQRRRRRRRRSRSRSSSTTSSSSTTTTTTTUUUUTUUUVUUUVUVVVWVVWWVVWWWWWXWWWXWXXXXXXYXXWXW 0001111112212222122223233333433334444544455555666666666777777778888888889989999::9:9:::Z[[WWW@A@A@AAAAAAAAABBBBCBBCBBCDCCDDDDDDDDDEEEEEEEEFFFFFFFFGGGGGGHHHGGHHIHHHIHIIIIIIIJIJJJJJJKJJKKKKKLLKLLLLLLLMMMMMMNNMNNNNNNNNNNOOOOOPPOPOPPPQPPPQQQQQQQRQRRRRRRRRRSSSSSSSSSTTTTSTUTTTUTTUUVUUUUUUUVVVVVWWVWVWWWWWWWWWXXXWXXXXXXYXXYXXWW 1101112112222222223223333343434444544555555655666767777778778888888999889:9:99:9:;::]]]@@@@A@AAAAABBBABBBCBCCBCCCCCDDCCCDDEEDEEEEFEEFEFFFFFFGGGGHGGGGGHGHHHHIIIIIIIIIJJJJJJKKJKKKKKKLKKLLKLLLMMMLMMMMMMNMNNMNNNOONONOOOOOPOPPPPPPQQQPQQQQQRQRRRRRSRRRRSSSSSSSSSTSSTTTTTTUTUUUUUUUVVUVVVUVVVVVVVVWVWWWWXWWWXWXXXXYXXXYYXXYYYXXX 11121111222233223332333344344454555556555655666677776777787788888988999999:9:::;:CCC@@@A@A@A@AAABABBBBBCBCCCCCCCCCDDDDEDDDEEEEEEEEFFFFFGFFGGFGGGGHGHHHIHHHIHHIIIIIIJIJJJJJJJKKKKLKKKLLLLLLLMLLMMMNMNMMNNNNNNOONOOOOOPPOOPPPPPPPQPQQQQQQQQQRRRRRRRRSRSRSSSTTSTSTTTTTTTUTTUUUUUUUUUVUVVVVVVVVVWWWWWWWWWXXWWXXXXXXXYXXXXYYYYYYYXY 11122122233332333344344444445555555565566566676777788788888898889999999::99XXX?@?@@A@A@AAAAABABABBBBCBCBCCCCCDCCCDDDDEEDEEEEFFFFFGFFFFFFGGGHGGGGHHHHHHHHHIIIIIIJJJJJJJJJKKKKKKLKKLKLLLLLMLMMMMNMMNNMNNNONONNOOOOOPPOPPPPPPPPPQQQQQQQRRQRRRRRRRSRSRSSSSSSSSTSTSTTTTUTUTTUUUUUVUVVVVVVWVVVWVVWWWWWWXXWXWWXXXXXXXXXYYYYYZYYYYYXXY 121222223233332344343444544555555555666666776767777878888899888999:9::99~~~edd@@@@@@AAAAAAAAAABABBBBBCCBCCCCDDCDDDDDDDDEDDEEEEFFFFFFGGGGGGGGGGHGGHGHHHHIIIIIIIIJIIJJJKJJKKKKKKKKKKLLLLLLMLMLLMMMMMNNNMNONONNNNOOOOOOOPPPQPPPPQQQQQQQQQRQRRRRRRRRSSSSSSSSTSTSTTTTTTTTTUUUUUUUUVVUVVVUWVVVVWWVWWWWWWWWXWXWWXXXXYXYXYYXXYYYYYZYYYXYY 2222223333333334434444445545556566666667676778778878888889899999:9:::CBB@@@@@@@@@AAAAAABBBBBBBBBBBCCDCCCCDCDDDDDDEEEEEFFFEFFFFGFGFGFGGGHGHHHGHIIHIIIIIIIIIJJJJJKKKJJJKKKKKKLLLMMLLLLMMLMMMNNNNNNNONONOOONOOOPOPPPPPPPPQPQQQQQQQQRRRRRRRRSRRSSSSSSTSTSTTTSTTUTTUUUTUUUVUUVVVUVVVWVWVWWWWWWWXWWWXWWXXXXXXXYYXXYYYYYYYYYZZZZZYYXY 3232233334444444444455545556556656666677678788878889888889999::WWW@????@@@@AA@AAAAABBABBBABBBBCCCCCDCDDDDDDDDDDEEEEEEFFFFFFFGGGFGGHGGGGHHHHHHIHIIIIIIIJIJJJJKKJJKKKKKKKKLLKMLLLLMMMMMMMMNNMNNNNNNNOOOOOOOPPOPOOPPPPPPQQQQQQQRQQRQRRRSSSSRSSSSSSTSTSTTSTTTUTTUUUUUUUVUVUUVVVWVVWWVVWVWWWWWWWXWXXXXXXXYYYXYYYYYYYYYZZZYZZYZZZYYZ 233323333444444554554555565666666676777787887888989989999:99QQQccc@@@@@@A@@@AAA@ABBBBBBBBBBBCCCCCDDDDCCDCDEDDEDEEEFFEEFEFFFGFGFGGGGGHGGHHHHHIIIIHIIIIIIJJJJJKJJKKKKKKLKKLKKLLLLMLMMMNMMMNNNNNNNOOONOOOOOPPOPPPPPPPQQQQQPQQRQRRRRQRRRRSRSRSSSSSSSSSTSTTUUTUUUUTUUUUVUUVVVVVVVVVWVWWWWWWWWXWWWWXXXXXXYXXYXYXYYYYYYYYYYZZZZZZZZZ[YYZ 333443334444454545555565566676767777777887888998999999:9::9:AAA??@?@@@@@@AAAA@AAAABBBBBBBCCCBCCCDCDDDDDDEDEEEEEFFFFFEFFFFFGGFFGGGGHHHHHHHHIHHIIIIIIIJJJJJJJJKKKLKKLKKLLLLLLLMLMMMMMNNMMMNNNNNNOOOOOOOOPOOPPPPQPPPQQQQQRQQRRRQRRRRRSRSSRSSSSTTTTTTTTUUUTUTUTTUVUUUUVUVVUVVVVWVWVVVWWWWWXWWWWWWXXXXXXYYYYYYYYYYYYZZYZZZZZZZZZZZZZYZ 4334334444555455556556666667767777877878888999999999999::::;???@@?@@?@@@@@A@AAAAABBABBBCBBCCCCDCDDCDDCEEDDDDEEEEFEFFFFFFGGGGGGGHGHGGHHHHHHHIIIIIJJIJIJJJJJJJJJJKKKKKKLKLLLLLLMMMMMMMNMNNNNNNNNOOOOOOOPPPOPPPPPPPPPPQPQQQQRQRRRRRRRSSSRSSSSSSSTSTTTTTTTTTTTUUUUUVUUVVUVVVVWVWVWVVWWWWWWXWWXWXXXXXXXXYYYYXYYYYZYZYYZYYYZZZZZZ[ZZ[ZZZZZ 3334445445545555556566667767777777878789989889999999:::;:;;:ccc????@??@@@@@@A@AAAAAABBBBBBBBBCCBCCCDDCDDDEDDEDDEEEFEEFFFFFFFFGGFGGGGGGGHGHHHHIHIIIHIIIJJIJJJJJJKJJKKKLKKLLKLLLLLMLMMMMMMMNNNNNNNNNNOOOOOOOPOPOPPPPPQQQQQQQQRQRQQRRRRSRSSRRSRSTTSTTTSTTUTTUTTUUUUUUUUUVUVVVVVVVVVVWWWWWWXWWXXXWWXXXXXYYXYXYYYYYYYYYYYYZZZZZZZZZ[ZZ[[Z[[[[ZZ 444544555555566656666676677778787888888989999:99:9:::::::;;;AAA????@???@@A@A@A@AABBAAAABBBBCCCBCCCCCCDDDDDDDDDEEEEFEEFFFFFFGGFGGGGGGGGGHHHIHHHIIIIIIJJIIIJJJJKKKJKKKKKLLLLLLLLMLLLMMMMMMMNNMNNNNNNNOONOOOPOOPPPPQPQQQQQQQQQQRQQRRRRRRRRSSSSSSSSSSTSTTTTTUUTUTUUUUUUUUVVVVVVVVVWVWWWWWWWWWWXWXXXXXXXXYXXYXYXYYYYYYYYZZYZZZZZZ[Z[ZZZZZ[[[[[\ZZZ544554555566656766677677777788888898999999:9::9::;::;;;;;;;;TTT>>>?????@@@?@@@@A@AAAAAABBBBBBBBCCCCCCCCCDDCDDDDEDEEEEEEEEFFFFFFFFGGFGGGGHGHHHHIHIHHIIIIJJIJIJJJKKJKJJKKKLLKKLLLLLMMLMMMMMMNMMMNNNNNONNOOOOOOOPPPPPPPPQPQQQPQQQQQQQRRRRRRRRRSSSSSSSTSTSSTTTTTTTUUTUUUUUUUUVVVVVVVVWVVWVWWWWXWWWXWXXXXXXXYYXYXYYYYYYZYYYYZZZZZZZZZZZZ[[[[[[[[[[[[\[ZZ4555555556666767777777777788889988989999:::::::::;;;;;;;<<;<<<<[ZZ^^^??>?????@@??@@@A@AAAAABABABBBBBBBCCCCCCCCCDDDDDDDDEEDEEEEFFFFFFFFFFGGGGGGHGHHHIHHIHHIIIIIIJJJJJJJJKJKJKKKKLKLLLLLLMMLMMLNMMNMMNNNNNNOONNOOOOOPOOPOPPPPPPPQPPQQQQQRQRQRRRRRSSRRSSSSSSTTTSTSTTUTTUTTUVUUUVVUUUVVVVVVVVWWWWWWWWWXWXWWWXYXXYXYYYXYYYYYYYZZZYZZYZZZZZZZ[[[ZZZ[[[[[\[\\[\\[[[444656666776766677777888888899999999::9::9:;:;:;;;;;;<;<<<<<<=<=<=====>=>=>>>?>???????@@?@@@@AA@A@ABBABAABBBBCBCBCCCCCDCCDDDDEDEEEEEEEFFEFFFFGFFGFGGGGGHGHGHHHHIHIIIIIIIIIIJJJJKKKJKKKKLKKKLLLLLMLMMMMMMMMMMMNNNNNNOOOOOOOOPOPOOPPPPQPPQQQQQQRRQRRQRRRSRRRRRSSSSSSSTSTTTTTTTTTUUUUUUUUUUUVVVVWVWVVWWVVWWWWWWWWWWXXXXXXXXYYXYYYYYZYYYYZZZZZZZZZZZZ[Z[[[[[[[[[[[[\\\\\[[Z[55566666666677778788888899999899999:9:::;:;::;:;;;<<;<<<<=<<<====>>>>>>>>>>>>????@?@@@?@@@@AAAAAAAABAABBBBBBCCCCCCDDDDDCDDDEDEEEEFEFEFEFFFFGFGGGHGGGHGHGHHHHIIIIIIIIIJJJJJJJKKKKKKKKKKKLLKMLLLLLMMLNMMNMNNMNONNONOOOOOPOOPOPOPPPPQPPQQQQQQQQQQRRRRRSSRSRSSSSSTTTSSTTTUTTTUUTUUUUUVUUUVUVVVVVWVVWVWWWWWXWXXWXXXXXXXXYXYYXYYYYYYYYZZZYZZZZZZ[[[[ZZZZ[[[[[[[\[[\[[[[\\\[[ZZ55566667777777787788888889899999:::::::::;:;;<;;<;;<<<<==<=======>>>>>>>??????@@@@@@A@@A@@AAAAAABBABBBBBCCCCCCCCCCDDDEDDEDDEEEFEEEFEFFFFFFFGGGGGGGGHGGHHHHIIIIIIIIIJJJJJJJKJKKKKKKKLLLLMLLLLMLMLMMMNMMNMNNNNNNNOOOOOOOOOOPPPPPQQPQQQQQQRRRRQRRRRRRRSRSSSSTTSSTTTSTTTTTUTUUUUUUUUVVUVVVVWVVVVWWWWWWWWWWXWXXXXXXXYXYYXYYYYYYZYZYYZZZZZZZZZZZZ[Z[Z[[[[[[[[[[\[\\[[\\\\\\ZZY444677777877778888888899:999:::::::::;:;;;<;<;<<<<<=========>=>>>>?>??>>????@??@@@A@A@@AAAAAAAAABBBCBBCCCCCCDCCDDDDDDDDEEEDFEEFFEFFFFFFGGGGGHHGGHHGHHHIIHIIIIIIJJIJJJJJJKKJKKKKKLKLLLLLLMMMMLMMNMNNNNNNNNNONOONOPOOOPPPPQPPPPPQQQQQQQRRRRRRRRRRRSSSSRSTSSSTTTSTTTTTTUTUTUUUUVUVVVVVVWVVVWWWWWWWWWWWXWXXXXXXXXXXXXXYYYYYZZYZZYYYZYZZZZZZZZZ[[[[[[[[[[[[[[\\\\\\[\\\\\\ZZY44476778788788898988999999:::::;::;;;;;;;;<<;<<<<=<<<====>>>>>>>>???>???????@@@@A@@AAAAAAABABBBBCBBBCBCDCCCDDDDDDEDEEEEEEEFEFFFFFFFFGGGGGGGHHGHHIHHIIHIHIIJJJIJJJJJKJJKJKKKKLLLLLLLLLLMMMMMMMMMNMMMOONNNOOONOPPPOOPOPPPPQQPQQQQRQRRQRRRRRRRSRSSRSSSSSSSTTTTTTTTUUUUUUUUUVUUVVUVVVWVWVWWVWWWWWWXXWXWWXXXXXYYYXYYYYYYYYYZYZYZZYYZZZZZZZ[[[ZZ[[[[\[\\[\\[[\[\\\\\\\]\\\]XYX444n78778788888889999999::::::;;;:;;;<;;;<<<<<<<==========>>>>>?>????????@?@@@@@AAAAAABABAABBBBCCBBCCCCDCDDCDEDDDEEEEEEEEFEEFFFFFGFGGGGGGGHHHGHHHHIHIIIIIIJJIJJJJJKJKKKKKKLLLLKLLLLMMMLMMNMMMMNMNNNNNOOOOOOOOPOOPPOPPPQQQQQQQQQQQQRRRRRRRSRSRRSSSTSSSTSTTSUTTUUTUUUUUUUVUUUVVUVVVVWVVWWVWWWWWWWXXXXXXXXXXXXXYXYYYYYYZZZYYZYZZZZZ[Z[[[[Z[[[[[[[[[[[\[\\\\\\\\\\\\\]\\]]XXXl222=788888889998999999:::::;;;:;;;;;;<;<<<<<<<<===>====>=>>>>>?????@?@?@@@@AA@@AAAAAABBABBBBBBCCCDCCCDCDDCDDDDEDDEEEFEFFFFFFGFFGGGGGGGHGHHHHHHHHHIIIIIIIJJJJJJJJKJJKKKKKKLLKLLLMLLLMMMMNNMNNNNNNNOOOOONOOOOOPPOPPPQQQQQPPQQQQQQQRRRRRRSRSSSSSSSSTTSTSTTTTTUTUUUUUVUVUVVVUVVVVVVWWVWVWWWWWWXWWXXXWYXXXXXXXYYYYYYYYYYYZYZZZZZZZ[ZZ[[[ZZ[[[[[[[[[\[\\\\[\\\\\\\]\]\]\\]]]UUU<-,-8889889999:9:99:9::::;;:;;:;;<<<<<<<=<=======>==>>>?>>>?????@????@@@A@AAA@AABBBABBBBCCBCBBCCCDCDDDDDDDDEDEEEEEEEFFFGFFGFFGGGGGHHHHGHHHHIHIIIHIIIJJJJJJJKJKKKKKKLKKKKLMLLLLLMMMMMMMMNMMNNONOONOOOOOOPOOPOOPPPQPQQQPQQRQQQRRRRRRRRRSSSSSSTSSTSSTTTTTUUTUUUUUVVUUVUVVUVVVVVWVVWVWWWWXWXXXWXXXXXXYXYYXYXXYYYYYZYZZZZZZZZZZZZ[ZZ[ZZ[[[[[[[[\\[\[\\\\[\\\]\\\]\]]]]]]]]]III8889889999::99::;;:;;;;;;;<;<;<<<===<<=>>===>>>>>>????????@??@?@@@A@AAAAAAABBBBBBBBBBCCCCCDDCCDCDDEEDEEEEEFEFFEFFFFGFGGGHGGGHHHHGHIHIHHIIIIIIJJIJJJKJJKKKKKKKKKKLLLLLLMLMMMNMMNNNNNMNONNOONNOOOOOOPPPPPPPPPPQQQRQQRRQRRRRRRSRRSSSSSSSSSSTSTTTTTTTUUUUUUUUUUUVVVVVVVWVVWWWWWWWWWWWWWWXXXXXXXXXYYYYYYYYYYYYYZYYZZZZZZ[ZZ[[[Z[[[[[[\\[[\[[\[\\\\\\\]]\]\\]\]]]]]]]\]\767`999:9:::::::;;:;;;<;;;<<<<<<=<=<===>>>>>>>>>>?>????@@?@@@@@@@A@AA@BABABABBBBCBCCCCCCDDCDDDDEDEEDEEEEEFEEFFFFGFGGFGGGGHGGHHHHHHIHHIIIIIIJJIJJJJKKKKKKKKLKKKLLLLLLMLLMMMMMMNMNNNNNNNONONOOOOPOPPPPPPPQPQQQQRRQQRRQRRRRRRRSSSSSSSSTSTSTSTTTTTUTTUUUUUUVUUUVUVVVWVVVWVWWVWWWXWWXXWXXXXXXXXXYXYXXYYYYYZYZZYZZZZZZZZZZZ[[[[Z[[[[[\[[\\[\\[\\\\\\\\\\\]\\]]]]]]]]]^[ZZ`433 9:9:::::::::;:;;;<;;<<<<===<=<===>>>>>>>>>>??????@?@@?@@@A@AAA@BAABAABBBBBBCCBCCCDCDCCCEEDDDDEEEEEEEFEFFFGGGGGFGGGGHGHHGHHHIIHIIIIIJIIJJJJJKKKKJKKKLKKLLKLLLMMLMLMMMMNMMNNNNNNOONOOOOOOOPPPOPPPPQPPQQQQQQRRQQRRRRRSRRSRSSSRTSSTTTTTTTUTTUTUTUUUUUVVVUVVVVVVWVVVWWWWWWWWWWWWXXXXXXXXXXXYYYYYYYZYZYYZZZZZZZZZZ[[Z[[Z[[[\[[[[[\[\\[\\\\\\\\\\]\\]]]]]]]]]]]]]^]TSS 989|:::;;;;;;;;<;<;<<<=<<=======>>>>>?>??>?????@??@@@@@AA@AAAAABAABBBBBBBBCBCDCCDCCDDEDDEEDEEEEEEFEFFFFGFGGGGGGGGGHHHHHHIIIIIIIIIIJJJJJJJJJJKJKKKKKLLLKLLLLMLMMMNMMMMNMNNONONONOOOOOOPPPPPPPPPPPQPQQQQQQQQQQRRRRRRSSSSSSSSSSTSSTTTTTUTTUUTTVUUUVUVVVVVVVVVWWVWVWVWWWWXXXWXWXXXXYXXYYYYXYYYYYZZZYZZZZZZZ[Z[[ZZ[Z[[[Z[\[[[\\[[\[\[\\\\\\\\]\]\]]]\]]]]^]^]]]\]]z333;:;;;;<;<<<<<<<<<=<=====>>=>>>>?>>?>???@??@@@@@@@@AAAAAAAABABBBBBBCCCCCCCCCCDDDDDEDDEEEEEEFEFFFFFFGGGGGGHHGHHHHIHIHHHIIIIIIJJJJJJKJJKKJKKKLKLLLLLMLMMMMMMMMMMNNNNNNNNNOOONOOOOOPOOOPPPPPQPQQPQQQRRRQRRRRRRRSSSSSSSSTSSTTSTSTUTUUTUUTUUUVVUVVVVUVWVVWVVWWWWWWWWWXWXXXXXXXXXXXXYYYYYYYYYZZYZZZZZZZZZZ[Z[ZZZ[[[[[[[\[\[[\\\\\[\\\]]]\]\]]]]]]]]]]]^^]]]^^^^]:::;<;;<;<<<<==<===>====>>>>>>???????@???@?@@@@A@AAABAABBBBBBBCBBCCCCCCCDDCDDDDDDDEEEEFEEFEFFFGGFGFFGGGGHHHHGIHHIIHHIIIIIIJJJJJJJJJKJKKKKKKKLLLLLMLMMMMNMNNNMNNMNNONNNOOOOOPOPOPOPPQPQQQQPQQQQQRQRRRRRRRRSSSSSSRSTSSSTTTSTUTUUUUTUUUUVUVUVUVVVVWWVWWWWWWWWWWWWWWXXXXXYYXXYXYYYXYYYYYYYZYZYZZZZZZZZZ[[[[[[Z[[[[\[[[[[\\\\\\\]]\\\\\]]]]]]]]]]]]^]]^^^[[\7;;;e<<<<<<<======>>=>>>>>>>?????@@@@?@@@@A@AAABAAAAABBBBBBBBCCCDCDDDDCDDDEDDEEEEEEFEEFGFFFFGGGHGGGGHHHHHHIHHIIIIIIJIJJJJJKJJKKJKKKKLLLKKMLLLLLMMLMMMMMNMNNNNNOONOONOOOPOPOOPPPPQQQQQQQQQQQQRRQRRRRRRSSSSSSSSTSSTTTTTTUTTTTUUUUVVUUUVVVVVVVVVVWVVVWWWWXWXXWXXXXXXYXXYXXYXYYYYYYYYZYZZZZZZZZZZZZ[Z[[[[[[[\[[[\[\[[\\[\\\\\\]\]]]\]]\]]]]]]]]]^^^]]]d===c==<====>=>>>>>??>>???@@@?@@@A@A@A@A@AAABABBBBCBBBBCCCCDCDCDDDDDEEDEEEFFEEEFFFFGGFGGGGGGHGHHGHIHHIIIIIIIIIJJIJJJJJJKKKKKKLLLLLKLLLMMLLLMMMMMNMNNNNNNNONOONOPOOOPPPPPPQQPPQQQQQQQQQQRRRRRRRRSSRSSSSSSSSSTTTTUUTTUTUTUUUUUVVUVVVVVVVVVVVWVWWWWXXXWWXXXXXXXXXXYYYYYYYYYYZZYZZYZZZZZZZZ[[Z[[[[[[[[[[\\[\\[\\\\\\\\\\]\]]\]]]]]]]]]]]^]^^^^^^a===7>==>=>?>>>>????@?@@?@@@@A@AAA@AABBBBBBBBBBCBCCCCCDDCDCDDDDEDEEEEEEEFEFFFFGFGFGGGGHHGHHHHHHHIIIIIIIJJJJJJJJJJKKKKKKLKLKLLLLLLLLLMMMMNMMMNMNNNNNONONOOOOPOOPPOPQQQPPQQPQQQQQRRRRRRRSRRSRSRSSSSTTSSTSTTTTTUTUUUUUUUUVVVUVVVVVWVWWVVWWWWXWWWWXXXXXXXXXXXYXXYYYYYYZYZYZYYYZZZZZZZZZ[[Z[[[[[[[\[\[\[[\\\\]\]]\\]\\\]\]]]]]]^]]^^]]^]^^^6>>>_>?>???@@?@@@@@A@@AA@AAABBABBBBBBBCBCCCCCCDCDDDDDEDDEEDFEEFEFFFFFGGFGGGGGGGHHHGHHIHHHIIIIIJIJJJJJJKJKJKKKKLKKLLLLLLMLMMMMMMMNNNMMNNNNOOOOOOOOOPPPOPPPQPQQPQQPQQQRRQRQRRRRRRRSRSSSSSSSSTTTTTTTTUTTUUTUUUUUVVVVVVVVVVVVWWWWWWWWWWWXWXXXXXXYYYXYXXYYYYYYZYZYZZZZZZZZZ[[[[[[ZZ[[\\[[[[\[[[[\\\\\\]\\\\]\]]]]]]]]]]]]]]]^^]]??@9@@@@@@A@A@AAAAAABBBBBBBCCBCCCCCCDDDDEDDDEEEEEFEFFEFFFFFFFGGFGGGHGGHHHIHHIIHIIIIJIIIJJJJJKKKKKKKKKLKLLKLLLLMLMMMMMMNNMNMNNNNNNOOOOOOPOPPPPPPPPPQPQQQQQQRRRRRRRRRSRRSSSRSSTSSTSTTTTTTTTTTUUTUUUUVUVUVVVVVVVVVVWWWWWWWXXWWXWWXXXXXXYYYYYYYYYYYYZZZYZZZZZZZZZZ[[Z[Z[[[[[[[\\[[\[[\\[\]\\\]]\]]\]]]]]]]]]^]^]]9AA@AAB8BBB]BBByBCCCCCCCCDCDDCDDDDEDEEEEEEEFFEFFFFGFGGGGGGGGGHHHHIIHIIIIIIJIIJJJJJKKJJKKKKKLKKLLLLLLMMLMMMNMMNMMNNNNNNNNOOOOOOOOPOPPPPPPQPQQQPQRQRQQRQRRRRSRRSSSSSSSSSSSSTTTTTTUUUTUUUUUVVVUVVUVVVVVWVVWWWWWWWXXXXXXXXXXXYXYXYXYYYYYYYZYZZYZZZZZZZZ[[[ZZ[[[[[[[[[\\\[\[\\\\\]\\\\\\\]y\\]]]\]7]]]????(@    H ! !!!""!"""###$$$$$$%$$&%%%&&&&&&''('(('(()))))******++++++,,,,-,---..././00/0001011112223334334445456656667777788778888999:9:99999888555**+HY !!!!""!""""""""####$$$$$$$$$%%%%%%&%'&''&''''''(()())))*****++++,+,,,,,--.-...///0//000110111222322334444455556666677888888999:::;;;;;;<<<<=<>>=?>>???===111X!! !!!"!"!""""#"""####$#$$$$%$$%%%%%&%&&'&&'''''(((())))())*****+*++,,,,,,,---.../..///00010111112233333344455555566677787888899::::;;;<;;<<<<==>>=>>>????@?@A@BAB:9:~T! !!!!!!!""""""######$#$$$#%$$$%%%&&&&&&'&'&''('('(((((()*))****+++++,,,----.-.../////00//001111222222333444545666776767788998999::::::<;<<<<====>>>?>????@@A@@AABBBBCBC444S!! !!!""!!!""""#""######$#$$$$%$%%%%&&%&&&'&'('((('))())))*)***+++,++,,,,,--.-..-/////000/000111212333433444455556666776777888999:9:::;;<<<<<===>==?>????@@@@@AAAABBBCCBDCDCCCR!!!"!!"!""""########$#$$%$$%%%&%%%%&&&&'''''''('((()))*)****++++,,,,,,-,---..-../////00010111222223334444544556666776778888:99::::;;;<;<<====>==>>>???@@@@AAAABBBBCBBCCDDDEEEE989Q"!""""""""#######$$$$$$$%$%%&%&%&&&&''''''(((((()))*))+**+++++,,,,,--.-...././/0//00001211122233333444544566666777778888999:::;::;;;<<<<=<>>=>>????@@@A@AAAABBBCCCCDCEDDEDEFEEAAA!! !!""####"######$$#$$$%%%%%%%&&&&&'&'(''(''))()))******+**,+,,,,,-,---.../////0000111122222323334444555656666777888988999:::;;:;;<<<<==<>>>?>?????@@@A@BAABBBBBBDCCDDDEEEFFEFFFDDD ! """"#"#####$$#$%$$$%$%%%%%&&&&&''(''('(()()))*)******++,,,,,-,,.--......///000011212222333333444545556766777788898999::::::<;;<<<<<=>==>>????@?@A@@BAABBBCCCDCDDEDEEDFFEFFFGGGGGF """#""#######$$%%$%%%&%%&%%&&&&'''''(((()(())))*+****+++,,,,,,--.-...//./0000/001121222333334444555656666777777898999:::;::;;<<<<==<===??>???@@?@AAABBBBBCCCDDCDDDEEEFFEGGGGGGHGHGGH "#"#######$$%$$$%%%&%&%%&&&'&'''''(((())))*)****++++,+,,,-,----.../..//0000100112222333333444545565666777888888999::::::;<;<<<====>=>>?????@@@A@ABABBBCBBDDCDEDEDEEEEGGFGGHGHHIIHIHH ##"####$$$$%%%%%%&&&%&&&'&'(((((((())))**)***++++,+,,,--,..--..././//000100111222322333444444566666777888888999:::::;<;;<<<<====>>>????@?@A@AABBBBBBBCDCCDEEEEEFFFFGGGGGHHHIIHIIIJJJ #$#$$$$$$%%%&%%&&&&&&&'''''((')(()))))****++++,+,,,--,----.-/..///000001121222333334444555555666776888888999:99;:;<<<<<<<===>=>>????@@@@@AABABBBCCBCCDDDDEEDFEFFFFGGHHGHHHIIJIJJJKKK $$$$$$%%$&%&%&&&&''&''('((()(())))*)***+*+++,+,,,--.-..../..///000111211222223333444554665666776888898999:99;::<<;=<<<==>>>?>>???@@@@@AAAABBBCBCCDCDEDEEEFFFFGFGGGHHHIHHIIJJJJKJKKLL $$%%%$%%%&&&&&&'&&(''(((((())))***+**+*+++,,,-,--.-...././//00010111122222343444455555666777677788899:999;;;;;;<<<=====>?>????@?@AA@AAABBBCCCCDDDDDEEEFFFGFFGGGHHGHIHIIIJJJJJKKLKLLL %$%%%%&%&&&&'''(''(((()())(*)**++++*++,,,,-,,--..../////0000101111222323433444555566667777788988999:9::;;;;;<<<===>==?>>???@?@@@@AAABBBCBBDCDEEDEEEFFEFFGGGGHHGIIIJIIJJJJJJKLKLLLMML %%%&&%&&'''&(''((()(())))**+**+*+++,,,,,-,..-..-//.///0/0101111122323433444545555776777777888999:::;::;;;<<<=<===>>?>???@@?@@@AAABBBBCCDDDDDEEEEEFFFFFGGGHHHHIHIIIJJJKKKKKKLLLMMMMMN &&%&&&'''''''(()(()())*)*+*+++,++,,,,-,--...-/.//0/0/0001121222223433444544565676777877888999:9:;;:;;;<<<=<====>>??????@@A@AAABBBCCBDCCDDDDDEEFEFFFGGGHHHHHIJIJJJJJKKKKLLLLLMLMNMNNN &'&'&'((((((((()()*)****++++++,,,-,,---.../..0//000100211222232333444545566666777878888999::9:::;<;<<<===>==??>????@?A@ABAABBBBBCCDDDDDEEEEEEGGGGGGGGGIHIJJIJJJJKJLLKLLLMMMNMMOONOON ''''''((((()))))*)****++++,,,,-,,---...//////000111111222232334444454556666676787888999:9:;;;;;;<<<======>>>???@@?@@ABAABBBCCCCCDEDDEEEEEEGFFGGGGGHIIIIIIJJJJKJKLKLLLLLLMMMNONOOOOPO '''''(()))))*******++,,+,,,,-,---...////////0000111222222333444554555666777888889999:::;::<;<<<<====>>>>????@@@A@AAAABBBCBCDCCDDDEEEEEEFFFGGGHGHIHHIIJJJJJKKLKKLMLMMMMNNNNOOOOPOPQPP (((()))))))****++++,+,,,,-,--...-////0//00110111222333333444555566767777888898:99:::::;<;<<<<====>=>>>???@@?A@ABABBBBBBBDDCDDEEEEFEEFGFGGGHGHIHHIIJJJJKJKKKKLLLMLMNNNNNNNNOOPPPQPQPP ))()))****+*++++++,,,,-----...../0/000/001211222233333444555565@????@A@@AABBBBCCCCCDDEDEEDFEEGGGGGGHGHIHHJIJJJJKJJKLKLLLMMLMMMONNOOOPOOPQQQQQQQR )))*)*****+++,,,,,--,---.....//0//00101121222323334444545556667ABB@@AAAABBBCBBDCDDDDEEEFFFGFFGGGHHHIHHJJIJJJKKKLKLLLLMLLMMNNNNOONOOOQPPQQPQQRRRR ))****++*+,,,,,--,---..../////000110211222323343444555556666777CBCAAABBBCBCCDDDDDEDEFEFGGFGGGGHHIHIIJIJJJJJKLKKLLLLMMMMMNNNOOOPPOPPPQPQQQQRRRSSS *****++,,,,,--,.-..../////0/0/000334444323343444455565666777878AAABBBCBCCCDDDDEEEFEFGGFGHGHHHIIIJJIJJJKKJLLKLLLMLMNMNNNNOOOPPPPPPQQQRRRRRRSSSSST ++++++,,,-,,---..-/..0//000011lll444555555677777778899:;:DDCEDDFEEGFFGFGGHHHHHIIIJIJKKJKKLLLLBCCCCCDDDEEEFEFGFFHHGHHHIHIIIIJJJKKKKLLMMLMMMNMNNNOOOOPPOPPPQQQQQQRRRRSSSTSTTT +++,,,,,-....../..///00/11111155566677687889899999:;::;;;<<<<=<=>>>>????@?@AA@BAABBBBCCDCCEDDEEEFFFGGFGGGHHHIIHIJIJJJJKKKLLLLMMLMNMNNNNOOOPPPQPPQQPQQQRRRRRRSTSTTTUTT ,,,,,----..-///00/000110121222XWX877888999::9:;;<;;<<<===>>>>>????@?@@A@BAABBBBCBDCCDEDEDEFFEFFFGGHGHGIHIIJJJJJKKJKKLMLLMLLMNMNNNOOOOOPPPQQQQQQQRRRSRSSTSTTTTUTUUU -,----.-../////000100112222322ppp999::9:;:<;<<<<===>==>?>???@@@AA@BABBBBCCCDCDDDDEEEFFFFFGGGGGHHIIHJJIJJJJKKLKKLLLMMMNNNNONOOOPPPPQPPQPRQQSRRSSRSSSTTSTTTUUUUUU ---..././///000110111222323334444XYY;;;;;;<<<<==>==>>>???@?@AAAAAABBBCCCCDDEEDEEEFFFFGFHGGHGHIIIIJIJJJKJKLKLLLLMMLMNNNNNNOOOOOPQPQQPQQRSRRSSRSSSTTTTUUUUUVUUVWV ......///00/001121222323333444454556666[[[====>=?>????@??A@AAABBBBCCBDDCDEEDDEFEFGGGGGGHHHIHHIIIJJJKKKLLLLLLMMMMMNNONOONOOPPPPQQPQQQRRRSSRSTSTTTUTTUUUUUUWVVWWV /..///000000111222223333444555666766777878vuu>>>???@@@@@AAAABBBCCCCDDDEDDEEFFEGFGGGGHHHIIHIIIJJJKKKKKKLLMLLLMNMNNNNOOOPPPPPQQPRQRRRRRRSSSTTTTTUTUUUUVVVVVWVWWWX 0//000110111222323334444545566676777787898999FFECCC@@@A@@AAABBBCCBDDDEDEEEEFFFGGGGGGHGHIIHIIJJJJJKKLKKLLLMMMMMMNNNOOOPOOPPPQQPQRQRRRSRRSSSTTTTUTUUUVUVVWVWWVWWXXXX /001111112222224344445445656767678788889999::EDEDDD@A@AAABBBCCCCCCDDDEEEEEEFFGGGGHHHHHIIIIJJJKKJLKKLLLMMMMNMNNOOONOOPQPPPQQRQQRRRRSSTSTTTTUTUUVUVVUVVVVWVWWWXXXXXY 010111222332343444555666666777888998999:::xxx@@AAAABBBCCBDDCDDDEEEFFEFGFGHGHHHIIHIIJJJJKKKLKLLLLMMMMMNONNONOOOPPPPQQQRRRRRRRRSSSSTTTTTTUUUVUVVVWWWVXWWWXXXXXYYY 111222222333444555656666777888888999:::bbaAA@BBABBBBCBDCCDDDEEEFEFGGFGHGGHHHIIIIJJJJJKKKLLLLMMMMMMMNONOOOPOOPPPPQQRQRRRRSSSSTTTTSTTUUUUVUUVVVWWVWXWXWXYYXXYYYYZ 221323343444545565766777778888999YYY@@@@AABAABBBCCCCCCDDDEEEFFFGGGGGGHHHIHIJJIJJJKJKKKKLLLMLLNMMNNNOOOOPOPPPQQQQRRRRRSRSSSSTTTUUTUUUUVUVVVVVWWWXXXXXYYYXYYYYZYY 332444444454655666776787889999sss@@?@AAAABBBBCBCDDCDDDEEEFFFGFFGGGHHHIIIJJIJJJKJKLKLLLLLMMNMMNNNOONPOOPPPPQPQQRRRRRSRSSSTTSUTUUUUUUUVVWWWWWWWXWXXXXYYYZYZZZY[ZZ 343444455665766777888899999:9:___@@@@@ABABBBBCCBCCCDDDEEEFFFFFFGGGHHHHHHJIIJJJKJKLLKLLLMMMNNNNNNOOOOPPPPPPPQQQRRSRRRRTSSTTTTTTUUUVUVVVVWWWWWWXWXXXYYYYZZZYZYZZZZ[[ 444545655667777787999999:9::;:???@?@A@AAAABBBCCBCDDDEDEEEEFFGFFGGGHHHIIHIIIJJJJJJKKKLLLLMMMMMNNNOOOOOPPPPQQQRRQRRRRSRSTSTTTTTUUUUUUVVVVWWVXWXWXXXXYYYYYYYYYY[ZZZZZ[\[ 554565666777778899:99:9:;;;;;>=>>?????@@A@@AAABBBBBCDDDDDDEEEFFFFGGGGHHHHHIIIJJJJJKKKKKLLLLMMLMMNNNNOOOOOOPPPQQQRQQRRRSRRSSSTTSUUUUUUVVVVVVWWVXWXXXWXXXYXYYYYYZZZZZZZZ\[[\\[[[[565776788899999::9;;:;;;<<<<==>==>>>???@@@AA@ABABBBBCCDCDEDEEEEFFEFFFGGGHHHHIIJIIJJJKKKLKLMLLLLMMMNNNNNOOOPOPPPQQQRRRRRRSSSTTTTTTTTTUUUVUUVVVVVWWWXXXWXXXXYYZZYZZZZZZZ[[[[\[\[\\[[[Z555888888999:::;;:;;;<<<==<=>=?>????@@@A@AAAABBBBCCCCCDDDEEEEEFGGGGGGGHHIHHJIIJJJKKJLLLLLLLMMNMNNNNOOOPPOPPPQQQQRRRRRSRSSSSTTTUTTUUUVUVVVVWWWWWWXWWXXXYYXZYYZYZ[Z[[ZZ[[[[\\\\\\]]ZZY655898999:::::;;<;<<<====>=?>????@@@A@AAAABBBCBCDDCDDDDEEEEEGGFGGGHHHIIHIIIJJJKKKKKLLLMMMMMMNONNOOOPOPPPPQQPRRQRRRRRRSSSTSTUTTUUUVVUVVWWWWXXWXWWXXXYXXZYYYZZ[[ZZZ[[[[\\[\\\\\\\]]YYY334J999:9::::;<;<=<==<>=>>?>????@@AA@AAABBBBCCDDDDDDEEEEEEGGGGGGHHHHHIIJIJJJKJKKKKLMMLLMMMMNNNOONPPOPPPQPQQRQRRRSSSSSSTSTTTTUUUVVUVVVVWWWXWXXXXXXXYXZYYZYZZZZ[[[[[[[[[\\\\]\]]]]]]UUVI:::;;;<<;<<<=<===>>?????@@?@AAABABBBCCBCDCDEDEEEEEEGGFHGGHHHHIHIIIJJJJKKKLKLLMMLMMMNNNONNOPPPPPPPQQQRRRRRSSRSSTTTSUTUUUUUUUVVVWWWWWWXXXYYXYYYYYYZZYZ[[[[[\[[[\\\[[\]\\]]]]]]\\788F<;;<<<=====>>>?????@?@@AAABBBBCCCCDCDDEEEEEFEFFFGGGHHHHIIIIIJJJKKKLKKLLLMMLMNMONOOOOPOOPPPQQQQRQRRRSSSTSSTTTTTUUUUVVVWVWWWVXWWXXXYXYYXYYYZZZZZZ[Z[[[[[[[[\\\\]\]]]]]]]]]XXXD::;r=<=>=>>>>???@@@@A@BAABBBCBBCCCDDDEEEFFFFFGGGGGGHHIHJIIJJJJJKLKKLLLMMMNMMONNONOPPPPPQQQPQQQRRRSSRSSTTTTTTUUUUVUVVVVWWWXWWXWXYYXYXYZZYZZZZZZ[[Z[[[[\[\\\\\\]]\]]]]^^[[Zr<<>>>>>::: """""!"""######$$$%%%%%%&&&'&&''''(()())))**++++,,,-----.../0//000011211222434555666766787898999:::;;;<<<===>>>???@@?AAA@@@m!""!"!#""####$##$$$%%%%%%&&&'''('(((())******+++,,,,-----...///000110221323344554655767788888999;::;<;<<<===>>>???@@@@AABBBCCC>>>  """"""###$##$$$%$$&%%&&&''&'''((()))*))**++++,+,---.--././//000111222322443555565666777888999:::<;;<=<===>>>???@@@AAABBBBCCDCCEDE1113K"""#""###$##$$$%$%%&%&&&'&''''((()))*)*++*+++,,+-,,.--/..//0000111122323444454665776777988999:::;;;<<<===>>>???@@@AAABBBCBBCDDEEDFEFAAA#""####$$$$$$%%%%%&&&&'&'''((()))*)*++*++++,+-,,.-.././//0001112213334434555666667779889:9:::;;<<<<===>>>???@@@AAABABCCCDDCEEEFEFFFGDCC "###$#$$$%$%%%%%&%'''(('((()))*)**+*+++,,,,,,---../0//00011021232343354455666777888899::::<;<<<<===>>>???@@@AAABBBCCCDDDDDEFFFGGGHHHDEE!!!###$##%%%%%%&&&'&&(('((()))*))***++++++-----....///000111221333433454565666777889999:::;;;<<<===>>>???@@@AAABBBCCCDDDDEEEFEGGGHHGIHIFFG!!"$$$$%%%&%&&&&'''''((())(*))***+++,+,---.--...///00011122233243455455566687888899:;::;;<<<<>==>>>???@?@AA@BBBCCCDDDEEEFFEFGGHHHIHIJJIGGG"""$$$%%%&&&&&''('(((()(***+**+++,,,------..////000111212322434555665676777888999:;;;;;<<<==>>?>???@@@A@ABBBBCCDDDEDEFFFGFFHHHIIHIIJJJKHGG###%&%&&&&'&'('((()())))*+++++,,+------...////00111221323334444665677787998999;;:;<;<<<===?>>???@@@AAABABBCCDDDEEEEFEFFGHHHHHHIJIKJJKKKHHH##$&&&'&''''((()))))*+*++++,+,,-----/..//0000111122223434444655766777989999:::;<;<<<===>>>???@@@AAABBBCCCDDDEDEFFFGFGHHHIIIJIIJJKKLKLLLIII$$$''''''((())()))+**+++,,,,--.--..////0001112222233444546656677779889::;::;;;<<===>>>>???@@@AAABBBCCCDDDEDEEEFGFFGGHIIIJJJJKJKLLLMLNMMJJJ$%$'''((()()))*+**+++,,,---.-..../0/000111221333433555665677778889999::;;;;<<<=>=>>>???@@@AAABBBCCCDDDEDEFFEGGGHGHHHIJJIJJJKKKLLLMMMNNNKKK%&%(((()()))***+++,,+--,..-.../0/000111212332344455565676877889999:;:;;<<<<===>>>???@@@AAABBBCCCDDDEDEFFEGGGHHHHHIIJJKJJLKLLLLMMMNNNNOOKLL&&&)(())*+**+++,,,,-,---/..///000100222332334545555767877998:99:::;;;<<<===>>>???@@@AA@BBBCCCDDDEEDFFFGFGHHGIHIIJIKKJLLLLLLMMMNNNONOPOPMLM'&'))*****++,,,,-----...0//000111222223343545665@??@@@@AAABBCCBDDDEEEFEEFGGHHGIHIIIJJKJLKLLLMNMMNNNOOOPPPQQPNMM(''***+++,,+--,.--/.////000111222233434445656766DCCAAABBBCCBDDCEDEFFEGFGGGHIIIJIJJJKLKLMLLMMMNNNOONOOPPQQRQRNNN)((++++,,-,--.....///000011989232443555556767777AAABBBCCCDDDDEEFEFGFGGHGHHIJJIKJKKKKMLMMMNNNNOOOOPPQPPQQQSRROOO)))+,,,,-.--/..///000111>??665766787898;;;DDEEEEFFFGHGHHHIIIJJJKKKLLLCCCCCDEEEEFFFFFGHHIIHIIIKJJKKKLMMMMMNNNOOOPOPQQQRRRRRRSSSPPP**)--,.--..////000111222hhh777899:9:::;;;;<<<===>>>???@@?AAABBACCCDDDEEEEFEGGFGHHHHHJIJKJJKKKMLLMNMNNNOOOOPOQPQQQQRRRSSSTSTPQP*++--../////0001012223339:9:::;;;<<<=>=>>>???@@@AAABBBCCCDDCEDEFFEGGGHHGHHIJIJJKJKKLMLMMMMNNNONOOPPQQQRRQRRRSSSSSTTUUQRQ,++.../0/000011122323334554qqrEEE<<<===>>>????@@AAABBBCCCDDDDEEFFFGGGHHHIHHIIJKJKLKKLMLMMMNNNONNOPOQPQQQQRRRSSSTTTTTUUVURRS,,-///000111121322344544556667IIIkkk>>>???@@@AA@BBBCCBDDDEEEFEFFFGHHHIHHIIIJJJKLKLLLMMMNNNONOPOPPPQQRQSRRSSSSTTTTTUUUVVVSSS--.000111212233334554556666777888:99DDD@@@AAABBBCCCDDDEEEFFEGFGGHHIIHIJJJKJKKLMLLMNMNNNONOOOPQQPRQQRRRSSSTTTUTUUUUVVVVVWTSS...111122333334445565667778999999;::DDDAAABBBCCCCDCDDEEFFFGGHHHIIIIIJKJJLKKLMLNMMNNNOOOPOPQQPRRRRRRSSSTTTUUTUUUVVVWWWXXXTTT///22222344345556666677798999:^^^\\\AAABAACCCCDDDEEFFFGFFHGGIIIIJIKJJLKKLMMMMMNNNONOOOPQPPRQRRSRSSSTTTUUTUUVVVVWWVWWXXYXUUU00023344444466677688888899:@@@A@AABACCCDCDDEEFEEFGGGHHIHHJJJKJJKLKLLLMMMNNNOOOPOPPPPRQQRRRSSSTTTUUTUUVVVVWWVXXXYXXXXXUVV111443454565776888889999?@@@AABBBCCCCDDEDEFFEGGFGHHIIHIIIJJJKKLLLMMMMNNNOOOOPOQPPRQQRRSSSSSTTTUUVUUVVVVWVWWXXXXYYXYZYVVV111555566667877898999:::___@@@AAABBBCCCDDDEDEEEEGGGGGGHHHJJJKJJKKLMLLMMMNNNOOOOPPQPPRQRRRRSSSSTTTTTUVUVVVWWWWWXXXXYYYYYYZZZWVW232555666877988999:::;;;???@@@AAABBBCCCDCDEEEFFFGGGHHHHIHJJIJJJLKLLLLMMMNNNOOOPPOQQPQQRRRRSSSTTTUUTVVUVVVWWWXWWYXXYYYZYYZZZZ[[XWX333666777888999:::;<;<<<===>>>???@?@AAABBBCCCDDDEEEFFFFGGHHHIHHIJIKJKKLKMLLNMMNNNOOOOOPPPPRQQSRRSSSTTTTTTVUUVVVVVWWXXXXXYYYYYYZZZ[[Z[[[VWV433w787889:99;::;;<<<<===>>>???@@@AAABBBCCCDDDEEEEFEFFGGHHHIHIJJJJJLKKLLLMMMNNNONOOPPPPQRQRRRRSSSTTSUTUUUUVWVWVWXWWXXXXYYYYYZZZ[Z[[\[\[\XXY1117898999::;;<;<<<===>>>???@@@AAABABCCCDDDEEEEFFFFGHGHIIIJJJJKJKKKLLLMMNNNNOOOPPPQPQQRRRSRSSSTTTUUUVUUVVVVVWWXWXYXYXYYZYZZZZ[[[[\\\\\]\XXXr888:::;;;<<<===>>>???@@@AAAABBCCCDDDDDEFFFGGFHHGHIIIIIJKKLKLLMLMMMNNNOOOOPPQQPQQRSRRSSSSTTUTTVVVVVVWWWWXXXXXXYYYYYZZZZZ[[[[\\\]\\]]]LLL777I;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFEGGGHHGIHHJIIJJJLKLLLLMMMNNNNOOPPPQPQQRQSRRSSSTSTUTUUVVVVVWVVXWXXXXYXYZZZZZZ[Z[[\\[\[\\\]\][ZZw;;;===>>>???@@@@AABBACCCDDDEDEFFFGGGHGHIHHIJIJJJLLKLLMNNNNNNOOOOPPQQPRRRRRRSSSTTTUTTVUVVVVWWWXXWXXXYYYZYYZZZZ[[[[[[[\\\]]]\\\\<<>>@@@AAABBBCBCCDDEDEFEFGGGHGHIIIJIIJKJLKKLMLMMNNNNONOOPOQQQRQRSSSSSSTTSUTTVUUWVVVWWWXWXYXXYYZYYZZZZ[[[[[\\\\\\\[\[[[b??? ?@@TBBBvCCCDDDEEEEFFGGFHHHHIIJIJJKKKKKLLLMMMNNNOOOPPPQPQRRRRRRRSRTSSUTUUUUUVVWWWWWWXXWYXYYYYZZZZZ[[[[zZZZ[YYX,?( @      !!!#"#$#$%%%%&%'''((()))***+++,-,.-./0/101212334545676787:99:::;;;;::888  !"""""#"#$$$%%%&%%''&'(()))***+++-,--.-/00011222333545766888999::;<<<=>=???@A@@@@!"!"""###$$#$$%&&%'&''(()))***,+,-,-..-0//110222344444666778999;;:<<<=>=???A@ABBBDDC@@@ !!"""###$##%%$&%&'&'((()))**+,++---...///110212343455666778999:;:<<<=>>???@@@BBBCCDEEDEFF """##"$$$%%%&%&'''((()))*+*+++,--...0//001221444555677887999:;;<<<>>>???A@ABBBDDDEEEFGFGFG ###$$$%%%&&%&''((()))***,++-,,...///001222433555666887999;:;<<<===???A@ABBBDCDEEEFFFHHHIJI $$$$%%%&&'&&((()))***,,,,-,...///110222333554666787999;::<<<==>???A@@BBBCDDEEEGFFGHHIIIJKK %%%&%%&''((()()**+++,-,,...///011222433445666888999:;;<<<>=>???@AABBBCCDEEEFGFHHHIJIKKJLLM &&&'''((()))***+++-,-...///10022233354576687799:::;<<<=>>???@@@BBBCCCEEEGFFHGHIIJKJKLLLMNM &''((()))***,++-,-...///111222343555667777999:;:<<<>=>???@@ABBBCDCEEEGGFHHHJIJJJJLLLMNMOOO ((()))*++,+,-,-...///10022233345566688799:;::<<<>>>???AA@BBBCDDEEEGGGGGHIIJKKKLLLMNMOONPPQ )))***,,,-,,...///101222333554A@@AA@BBBDCDEEDFFFHGHJIJKJJLLLMMNONOPPPQRQ ***,++---...0//001222333555676BBABBBCCCEEEFGGHHHIIIKKJLLLNMNNONPPPQRQSSS +,,-,,...0/0000VVV676878:::EDEFFFGHGIIIKJKLLLCCCEEEGFGHHHIIJKKKLLLMMMONNQPPQRQRRSTTT ---...0//110222999;;;<<<=>>???AA@BBBCCDEEEFGGHHHIJIJKJLLLNMNOONPPPQQRSSRTTTUUU ...///111222433777=====>???@A@BBBCCCEEEGGGHHGIIIKKKLLLMNMOONPPPRQRRSRTTTUUUWVV ///100222434454666788jjjCCCAA@BBBCCCEEEFFGGHHIIIKKKLLLMMNOOOPPPQQQRSRTTSUUUVVVWWW 010222433545677788999jijDDEBBBDCCDEEGFGHHHIIIKJKLLMNNMOOOPPPQQQRSSTTSUUUVVVXWWXXX 222433555666877:::AAABBBCDDEEEFFGGHHIJIKKKLMLMNNOOOPPPQRQSSRTSTUUUVVVWXWXYXYYX 334544766878999AA@BBBDDDEEDFFFHHHJJJKJKLLLMMMOOOPPPQQRSSSTSTUUUVVVXWWXXXYYZZZZ 554666887999;;;```@AABBBDDCEDEFFGHHHIJIKJKLLLMMMONOPPQRRQSSSTTTUUUVVVXWWYXXYYY[ZZ[[[ 676788999:::<<<==>???AAABBBCCCEEEFFFGHGIIIKKKLLLNNNNOOQQPQQQRRSTTTUUUVVVWWWXXXYYYZZZ[\[[[[767999;;:<<<=>=???@AABBBCCDEEEFGGHHHJJIJKJLLLNNNONOPPPQQQSSSTTTUUUVWVWWWXXXYZY[ZZ[[[\\\[\[777:;;<<<>=>???@A@BBBDCDEEEGFGHHGIIIJJKLLLMNMOOOQPPQQQSRSTTTUUUWVVWXWXXXYZYZZZ[[[\[\]]][ZZ232<<<=>=???A@@BBBCCDEEEGGFHGHIJIKKJLLLMMNOOOPPPRRRRSSTTSUUUVVVWWWXYXYZYZZZ[[[\\\\]\^^]QQQ667 >>>?@?BBBDCDEEEGGFHHHIIIJKKLLLMMMNOOPPQQQRSSSTTTUUUVVVWWWXYXYZYZ[Z[[[\\\\[\\\]TTT (0 !!!"""e###$$$%%%&&&'''(((***+++---...000111333555666888:::;;;===i???!!!"""###$$$%%%&&&'''(((***+++---...000111333555666888:::;;;===???AAACCC"""###$$$%%%&&&'''(((***+++---...000111333555666888:::;;;===???AAACCCDDD###$$$%%%&&&'''(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFF$$$%%%&&&'''(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFFHHH%%%&&&'''(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFFHHHIII&&&'''(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFFHHHIIIKKK'''(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFFHHHIIIKKKMMM(((***+++---...000111333555666888:::;;;===???AAACCCDDDFFFHHHIIIKKKMMMNNN***+++---...000111333555888AAACCCDDDFFFHHHIIIKKKMMMNNNPPP+++---...000333777555666:::CCCDDDFFFHHHIIIKKKMMMNNNPPPQQQ---...000111mmm888:::@@@BBBDDDFFFFFFDDDFFFHHHIIIKKKMMMNNNPPPQQQSSS...000111333YYY;;;===???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTT000111333555666888???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVV111333555666888:::AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWW333555666888eeeAAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXX555666888:::kkkAAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYY666888:::;;;===???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYYZZZ888:::;;;===???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYYZZZ[[[:::;;;===???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYYZZZ[[[\\\;;; ===???AAACCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYYZZZ[[[\\\]]]AAARCCCDDDFFFHHHIIIKKKMMMNNNPPPQQQSSSTTTVVVWWWXXXYYYZZZ[[[\\\V]]]AAAAAAAAAAAAAAAAAAAAAAAA(  .!!!###$$$&&&(((***---///222444777999<<"4Ci$8Hz(\LTX=_Y5`8ⷎ!ޡG!54<~vZwA3};oDz o&x] IZ rG >Y~  տ;vQ]2fʘߑG|7snEe CՋELe桋fOeAUMsIm].x@U+yHseO2+)G o={PV;S 7笢J.?"K˜j8 "۳s߭gΕ2&ٹdߑ#>; L )7iěÅxlɖ$ L6I]&pTހ f :4a{Dh ?-#ZMЖ]oʤb1r=XI&Də8І{2+ʝܙs^"ߑ|;д| N恳6|3K$A zQݗ `ߖH LH}:c"@x/;nHIm0mL~geѕsO!x-!g~GG2!1'%&4pǼLϠ6MB\}uw?ߑO7sPNOoPq[ǖlidfMXa/cwj]تH?u!];#y|Ah_em*O+ڴ%ؠ` Gjb_;%[Y)T1Il5H0}ߝ_~U~Ћ\9*|Y΂dmP7ȟx*T*Po":˒s}^Bp n0~ ]IQHam,h&'ybeI~UNԈD*ϗv-56_Ix{/# 5fOۭu|J+HnW7>qeJ`2U}ԋU2P)@6ub2Be'>f]q eTAmJ_SOuJ D\@W MtLP>q*ZdC$ȇĵRRQSzU+Bd6C k sm lGG ڝm;ʻؾo  IXwDL8a pz6pH3N-6etaR &B'MٷL!Uj1W|#='" Mkm{`LoR,NS)Z'?TJ?Y^9w'!䢯°}e?*eoZʒ nvH];I g`h-pU?Φla^B脅Ϊʬkx#;04M"e[<{_($ xΡQNb ?];hPU$eCmQe4Mg+;®Aݐ/XX&(y V~2s[hNV 2.]rp" 9^qnwΩWt|kk!-AݤrGota+f:#cCZF1>;J<NЮFjK:x+wt,4f{tdCrŲ.zp+gKx?>:9Zsf`JePe|MiX r# 1N;RUNyB;^q=4trs N*8pW:_ƞ_ϵ5Ia.6uc.uiDe.)9<,aôO QzqU{WZ{#@ F' p4,%ܰ+^g3U1Y^-]躙۸g+;!=FH QWe& }9Μ(T-N▣VQ[ҚKg"Q vOPf|n6 ʽ8,TN`hh4cg]=\idR;!jWZ%|3¿\#,. )Y<}PJipz`|H)_]@\uqQjhKE0o_uz\?*z4lnR]rK/64 @u9-3I|;ƜvyڰhqE7讦O]᫧k_U6*g1-;dIϺ`GPD*iMXt֌¾K%WOl0N+v,'wyWjD y((ߓ>\0vD-\$r@6ϮN`hUfp;[jkh]2YX!j~Spc?R|ai G.eyX?A.27O%CmH#HtPhajp tS;o(`y)DɊZ2ٓl it"ZeRH1sM*L_=9Z- \8LB>U5xb?aH@3<*?Pe|EJ(c ߄3!=u%!@F MQwq{]a[iVBs\F3&su$T[*xݏ rf`1NuFw7[6àt A8S'I+9ODWǶ SbЯ'YT]?&;L'Uӽ: { %Adc%Y=|#i>{-r{T7RvՇ"j퐋[f eI Д!ξ1e2췹+1enrAzNWifdv 55ޭ!o^͖k&+sktcBO&2D;6!Oj[w(t\ #Pa#ڒVFNd)vUWV9ԙayH sxK Ca̍8vIFwR 6=`|%Pis*4fL]@聗źE 玅)8b`Ppf͑rm+(p`>iT0W3ldz[ Ӑ\]2#8\ `m&Q{=.]O{o@$u5=V*C&reW5Z:׀/|uC}`wn<- =à tB`zvyAg3i{\8_r(ɵ^~m|hMqm֙9ʗhxv3{k fI5A[ 1S%MU9k;=w+҉f'X[P|2qc"J |g͓ET܏h .p6#):Lfչ֓q[WЯB1[Na(t2=: EZ#pbZ@3a~4f=pig:2jSGbAvi}aaI3ji3~Z WT[QC٢2vU_4*xÆ@>K9yiHe˶.Fv49_ujzK=5lyt3QSRiK2_C;5֋=Xn]Cg= ,L`ʤ- X7rXDm)Asr/ɑW7NJ{yw״BHS0uAfNM!!0Mt"Ʋdg~.7݊Mmvm 8JqSSG+'/FxCihU=L,BS7"K` -[zKY ;zC+u谩cٟзљן0QCGʈÔ%AP; +&߃흼Qfp 1񿗩v^MG#4@p=t!$l |ԱWZ{wpTU~)?v#e@\ xX9Eq? ^a@_efcDbP.oSe/QMCWFlm.'o@,0bL)\NŏGC%Dx³&_ WWR~6A0*@2li/fe\ O2eV"0e p (-ej,00mW'R]"Qo94"'iE]]%/Ț?GSNV.v)dHgp7FH7,JXo1 (1\ PY!.j2|f|9^Cr%x`Z Y;($a"YU2%^!/ @݇àtC ##ت.ʕ_ _>Q' bωh2;̳`ծIO͗S5tCF5d y-4Ţ? 7XuǁAXwƭf幞s:}uICC!Ѵ߹z& \I6*tpsElz2|tAgm2ɮG%F-V |,b܊7YD3O̧3]}>ky<ߩ4iG%]?@D6sXpXv"[{\Q03Րk_p5!>>0R;Wȁ ڳK'N{J+Kl\^6X;CnN-d<yٙ`I<0s^tu"_K%!۵t?<,} ԇbەF7|w)aZCUj'P0WvwGj#f~dKuh1,=w5DŢsYjDM1y+~ /ُT ک&흓˒4]n ^lbsB !{7i$-Rg BgzR@ chIsz&xgկ+QأɿII!Zf:#By*֔x{Xc͔> /;UMxg=#.էLc&]~Ddܘ[9h:o=Y!CdnLYjfsnx I3)=.=vTUˆ=lQfh{^D)4RlaU9sa畚$Dnf嚌ȃFbOnݐ_6+$R.@d>~`yY_{u+Hu̍B>a!R>H0'KԌVw!0Qꑫcɩ$dې`i+L+9QJG(o˞f P6^u3We4 gl?ç!xH7Re EaW1ʇg( mE:>U_ Z3FH>8L-w Q/K:eFwT.E%ew{YMߵ+]&wzꃟd,6z%RV "U ttȎwp/":a$wk@ 3S (4RNBS(NPU..t"j =xbtKu xJJ+$p..0%*\%&ΛZ@ }>xC>@sʝ;3GM P{ 0IA103,;+;<@zL-cT{QHشl0.qgGtN8-.YjYo⟌>Vk ~4';+y/v5Ѱs\L=%c`b]5~~A)j>EBĤ aGyejN%OF)GG ,BZazF9{乡@\wGd87ADϿ@ߠ򾀏7F6g!s~: ^.qbLL~\1fJ#ECkŏeM%1M0dbS. 0MɨLȩͽ)N;NnR&L{yƛO_[r}OϸjR1Q?ux<&L_ok޴'Q+#rG8UdCKBLێrКnZՅFn!INI9_8 _TwZ#N"o>E>dB"&ƻe*]1>2NJ] S'#`G'Xy}5)|dWEb\Mtoz6DJx?*UrcJsLg)W %Ճ 3Cjs"vc0 8#w"j 1-˿+mRg5F[.ɕ^n`hFٶEQf"M i.~ݵC|k&dU&B^n_@0Th&k<9SJwR][SBU)^l4VsR?쯐 Le@4UBZQ1 %CEz};u/7]f,{ɞ 8ŧ5_a D$/s `]u5hW'H*e`\(9=᩾] JcftSqKk+܏NdrHnD]y-$\=> 2zziD%ǖr\8p5zN\J4ݜ&v+evg cѿzʫ;xrUcMjuo+qN9H6PndO:u(`?`~ &2gی|uǜæ ,N9PhQ- i͔ "zw83*\:~eEb˳)v^o SCK0;)ͻ ECˎRk!6#lQoٰ) Ey n~lԶǧhPX| :3 P oT;M^'.TqBLX a dA5S鏪0C\^Gt+ X B0|ۤW.A9{sv!CO9ʅ^;J@ݞa7N"ڪue|Sdzf$hkqcrPCb-lXbݼnܐYa!(ISK5Ƌjulko=ܷ F֤/YV)A80Ӻt{GbMĐrmnbL 2~<u u!o1Ze%RT9JvruS@m uEǼ[?? MXL^ p^Q>N|3ɹj.֭~cZ K7{D{=Ji?x1\IZ(-U)T)҅ũݓISD_4׸oPꇒ, ~Qsֶ ", cSu7z)8/g*6N4kD(6qG%T>G(}ٵE易-` )<^ĸD'UqbP}.Mq<]a^x-xrXc oX "YcہI33)4^v@YWk30N\$;s߭[P5Gw.u{vϤR4X`,1\%@ էU[^^ֈk-7Ś&Vd{~PǸ oR>^h20ΒzR9SrNT,hnqr| c(P@Ҋj^mMV铢Gm7f#Thɷf AD$~zihSSBDI!4q?2>"R]bȜ 9;Fdw|¥‰og"0 ,2=˔片J;a4Hܴ+Vwq[r1\_Pq7H CVP5akє& 3\K ng4lS )8l80}MBR"?K~8f5]|'`D ix\{ W?[#ן r vű8w桂gbr%h܅ȿ+ xDK6O[1ŧBwRrD VL.nƋ\>1l,xԣ7ʹ1ï*8GC}`P@N5І,MI\\x}BkAV4ߤ8Qr,IDe>, I7С͘״=fI31\tgPZY8r[mN'6A9˦3:s4G &@nY9E<[* -\jHu pKm&i߭+=W%Q y|SLԶ_Q>wE 5xmZût.%`8#Ub>b<4-PEk9e36ya ~[0jRH"E(_eOe';!*q[}>fd"R'`!C]HIM#4N}XKTDx=V:x;ZyC"y> LqA9/{]فb]]I7zc#'= 4|S9LB,4ёPh#C~*')9z[X'e| [M]|K$8N H}9Cu]l ne4l@ Mgo]CXϗby>Ge:I8DZ -@tXPa,4,Eu(f-|<`u=`GHqvB|&7,Ȉ֖-Xew*Mx~d*J-K!(?diODfktErCRj6 M^Lb}^5Z(0V]g:W5*3zMGI\k2n%:Lփ<)l5DSlzd2ĻZnDkHr1qf9v_C8x_z |n wzʹHrlB>G1Djb50'M/B6Z ?\kϔiy{^yZE-5f; m\y+ =2ݨQX8Spu0AQ05urL][eGLFl|,Zk)1$qf-!2 ++.Mfb" U)vgt2 | vd(x$(7 ^%73+@!)H^^2lMNؗw̦G&g>M;k!ZE"9|0kgkE~.;;$L/Elt6Y|6SuUvDJ)4V:Q 9%V녬Kb+w3'yP(}esa]_dHByb@uԳcذ /=!=B"n(!Z^E`G&F Z<%H J!N7.~_Fh`)۔xR-@oXB4~m z) BW]IT$?,DMgseqMXU~yx&I5LB39J}=|0;`8spUD '6^!)bgӝ4+Et 2RB#| ҵL(3tznWe>fMf5Y~ zXڂNYJJWm,_6l6 ӸдAo=]fYW@R8qƮ ShI/]>_3{)e]SHyX/{m90a +F8% ,NG GMmR!:*`}xV 1+ДWLₕGxsHf`E9fЪ.a6J͒o035 w fx>CY.!1M0^ȧCƔ&(P_+c {_d}kqB@*nA@Y; tbij#]D8/Tu]7*م)5z~B0Iґ_:lTt4qK;Oa V 5$ >( ^Nc˔ Q(3f82M)qL:M3*_eX,kgcyaqN06i:<@Oq?c/lb zh JBH%f +1M -eF/Q,I,̸4$MUV;`̕axk 9DWikD\zgO G]]ԏ0 GRF AaKj!=U.@ rl`AIBFڒͳ 1n98 ` h΍0N:jb)_RPp Y=}?Q}@bf==yފN*AV1 Mô^oъڕ9Eɑ rQU(H UQ>c͎%3}k,]Z69aYa7)3;9?kǠ1?Y,nqt~^i2m4VmaT("Y2GA7|T|CF٩ C,HV3B@Ic!59]*,X3PNUx08jirONFcO_yLapE:oc5vXܥ.|?z HlTyVH<1BhG!Jfì\.)TMg )}ϳ )$ :/16Tc1Mf]yZy^IB4i ۓ@ܭ#fN\5TtJS4 @-gtfkE!kF Vh@~{va~PY;M-DdLyj%ͧQ],E׭9E-,I轥q/ӁЅu3ner3Dac!cfE:bC8PvT:v"2nm#NpMSd!7PTY\+ X1*81qܒ U '!2[2dyP3;꾐tLŲed^2&Z(Q0\ro+LW0BF,2R9\6Hp=qjR$QڒZҸ3ë2G=~) $Fz #0g82ځ>_0] Ʌ9%Zڻ2gę]̍.I!X y΁= uߌZhеuU?iZQYBt|S*S5ߣ_7 r0<"=f1;Ү-Yiw@rCDT+Vħ+:V\Re8I _1a64j(aǺW9jI, NÔD!7L0͝~h7T޽ck6wxK wu?VH[s=i$HP@|O̒=8~g[13.B&ml32QXF'C{]sRmCaV+XI܈?=KZ.nfv]ٝ;94.rb&U[6AK,Wa5Pd'z-o&n6ɧ|bG $@|OaZWͯ(N F^0(686~͊_5wFưܯJ h) &RP,ԥtwܿE-;A!쥐-ŴԓBTS{MIYn:CVj o>l H#F0?= k8*wD@l@~$տ!GVzI#L}2G1$uW-:1*m(F rEa)gu+÷ҌTg lr`U(:QGkN ?TϜjDj$yw2`=`wҕi+Q;2Q/b{ʡ[t֟!+GmHV9pMd*AѬ)b3i^a,i|Fh,/e0e\GWb(` >*[zq3.JyҊgԌ%}4ӫJe;rEUfmTb>nCpUqhOMb!J%_Jakrߔߊ䚭F@6Es_bqxw`('`/yx9,z"Kʵ,/ɔ._rIvT A(oS)Vc.+vRJ{œm!`=_ @Ri&E &[R!sFH"GRV#?mraE.ٹ34E @RXeًzX8A୷@iND| YiYW6ĎC18%98uXtx'Uh?YܳV lcؒWC`kL!Cï|dzm&IqBeш1{a?(|V=9ڮmⰙwH}{B(Lt}Z qA{׿Vl/O/ Tƭ+oyUOsIL6 ls` 8vl݅Zn76P<5+Ďb\&;zNygX̮"VaCl(6X~x 1j㡬,߀RbhY%! bWlR'a=/ W*]SH9;g*ؕv+&u h5'~/JZƨ2ޤ/7ƒ `֏[pFBfIYDm)S+{B%՘qj:plOdQu!oժ.ekTe){^ 6Wʻ XIT*zϿ-~.޾|[}~-sq}nj 锺*T9S8UdU.dfN>b[b0@fYsij`ʾ }.e^IM# CKGwkjxMFDs1pOUP΅s7pYlN1n񾇊_LOD ][q;Ĝ:`3+TA} UoRa8jP"A_]%6(׎iB-Lꏿh}z t?2E+zn%zɭj+(iWɛTkk!!m^6KubG^?u[blH( 1fn&m|Gs7h5zH[d^ڜ^w0~WtŖixr|+Gmc%1 vP.HHC/1-y ґXח08eh Z#ucWI4 *DLoJ.,y8C\Ru̅7>tYk/2"ܾپ0OކN6Y4X!_tg$3-*t>lwkh)psZJ#i Ef*trZMbx[uj`%lf2GiNh r`UF,m?+Wp fF4+ cpp1+x6a#LWc_{J;,Wf%Q?.-@ 0 Fͮv&ՀhR\7[J'jWQCMY1:[7غzX{eo=yh⍘S&ث$p\; Ad@LP8ڎРw1'44pz~sKl&3n6c+Nxڞ&9K' OKשnɆɩ޵#;{$Ujg`cF+avO%>Ǟ&xՙJ fEd-?)L6;mC:|#)4悩FZJPPl$KIQ,?ރ-_vZƆ`*U~f6*# HΞp#i_v8ګwv;f+z_LXC-(ҳ Jнq xSz(q/0s̎pL}' Mbmmzvh@*i8#}D4u&nG*1&#,Xq)V3%mvdCY"5b`*$* kO_dږ!w$z]P֓^}3=zN{FY2}a3h[on^{l8DWbs̘.o5ΡP@luE`Qg'L0Wn#s8 q8_J^ӟ LM90TRjmK1,zLmH2+Pvnbk<`G%ߞ& f>ցuM}6o6c2Wv/b3Q+3ϵ$Լl{ݹ_y`M ~<9AA.6ςgzʍ¤C0 iϔ&=ylP\l8f;oBxi9هbљ[KJ'ȁ )I񯴮u5@g*}WKd_LA 3 :VMn@PGݎ.OCF}ւLH ѣa:G#3~)crF_yzal^Ybe2PX%*cb*WK}Zs&`Q!mc!wY`*3 pD^LPc|}Ȇ ۞'/:,ۿe_EQq;fO7{өD=0u367<1NtzQ4>IV4bsIf7 EԿjw[~srW7 2M{ly +\7}rNM[l7~[\$W`%fT:OyhîJ!HuFoDðY6g$ NÔ۾Ei&ƈ_:fX wTԄujoٶYq .<EntM1MJox]rgv}КLkzs79qJbg=Gd8B+;'QZMYLtheiip OgԺ ;q:5_6[}qqY9~m84fCr-3ӣ{` {{-*kÅ`sX#wl@&p޻O撛E>}haXyuď^"I<|&WL6 VG4/6C-ķ+v$KH0q .hkabQ湶!C9#F͝ xC dJYSX_:BNJK7|^$|nBK4xYCxn36$SeyA6# `/|UϬ [%T2܄+fw7L6E8TłDZjVw`7߯Q T rE,9ć6Yba|%rMYp 7Y_`$oHγL#S%%/n`jʶc.WEh}#ZɤI/BҙEZؐz=, d!{>|<ÇŚ=PTȠGN0z[GV;I#eĴ.9^TÛnv zgk@1r p2G^;ݬҏ٩;7e#K'uQ3<+#:k0B/q\j6NX+EXȤ5a+"(9ڰ`"*/悒JbW wJ ;ȨS)YvD*U\j+DJZ;-ӄ9;)8dzPk%f ?ca!GnuH\{Hcs2ۋ2ɩV%[lKjVuhjp-su=`f 'c n8g,r,V͕eH)4!|EiV'RY#]`}X*Dn}PWg!:ݖs^)0qZ'*sV6J [lʋ7MBVK"Z+RT0Ag1[U#UlVEuO;{km35%].ɏ?T]Ԛb94OX%ţR$Ʋn`O77|~J$pEdiza9! dT$ O7IE> @]ecyE^6 L_(ti0?zCATR/I`X^D%20 M Kp`JxyXb2E`Y)bAZeFӘ ن̀ Rv&z&]D?R+wI:f + U8sKXiI4BUQ Ol帢 ZAS( eO+g5X~4*s2Lzqѯ (Euf,.YDd9`Cd9w䓙ܡi+ʔ\ݍXm" zf ^2r&F%8l_lcWgECqKhhi|39g詁O ]z˘tgRteDGZai6ՒPou*&{ aN"W4'8BrzFʀ^08l>o5? NkOg$K <&ɖic`u{mc2,,0Fs󁯬%+uM=PPHɏaKc.1kt{bG`jPtXn;j/ ҝ"Lu1ޟ-J8x::^\]ʤdz)v9z)qNk Y&-~6Rup Iڹ-J0W%m:k5My{Oi1A^^} o2E|E_|Ȳk ~d4& Q+z*Gf,ӥp?q٦u4zMSj O |=rmYêdvǂ0:@oy*|[4ECgmvm %7$2{Z.^Takͤ^u%/̈́fS[CDZwu9UH߆#&) ILy>q4{|čHŋz۷$]OLI$XDPϔynv͞WT$֗Ϧ >ٻ$]v찋 eM$=()ekØsl!u;P hHC#uYS4ꋢB!T5-vPV"c#(m+ o T9[n!?BaҴ"s [fLXțUIW-fc4*\W "1G[cP VX3-wso/ډPϕ?[‡T䠰'T"Fg[7V󙊼I9+\?С)H}sƧPJ3l&wX=GgļE CEHT7$8-^ _s؎wEġ"[~\쪨!6EրnA*9N+VbDC_9eg& ViA2wO c +:+Uכ.pZxL71 ff cuTP3 7@,Y0@Xp5PL 'V{4OSkx) }p+2X K@-Y###R/,Loc CQW )5!8%ua9R44`j`*bV·f֐WK<~7lCcJus͎!%ecvƳb{Jt?Wcܹjz|z2z>6s T'xnCYF9ʘ<ȯNh#>5߾qlfc q9Hj9j#-(ۀ=YLzD2ye߭5-wTa3ӶMw6&bX-@7^E 7xvXS*X5A1V-Bg!8i*?l ·#/P|5h%kJ xxGRBGt,YUbPɽp#iߔ˳<>MM[~)mWAG.Bu(K{âӕ]Dz 7ZYgr,hvShe,tT˃uJ V å @3=DF7o0UҼ?͵30=(PlqfbS'[ŠCst Bp觮b`7тk]nVUYD%rڄ`I(o7 uXR,XE+I%MDvi:ږkL&tccX mcQDZi/,wr,_p'^o V!PPV oN9~w3E#8R Y$0?<u4hmqq,x pQ{s_4AMhGѴ]SJq9L#JWVUQMvõ ؉1m.cE3cmh<{lh87Q=KS‘(. J< hl4ޥ6ș_۳!/Y@ߘnmy%@݅^Fsе;ӆ<Ȑu•UB0_g,ʫA&pA!I0٦&/Ora t^T›;fq,\=YV]-2r UQZw fжpLYHkBV2 jwPo',`(*[ F倣"O-1kRqcP|z-UOBEfKIZ!;:21A<[ / [gz x3 k,cK%?GI{Yd,@ zpy:ODR<_>2cB_<7;iJ;eU ݅ȌXF،W" x5#fugaVwy# ռ}0]B|OfkogozWXs۽7Mp2 GTV|qG\}Sq7m`j4}fm>k Pq;YE,ly1.i-gp1( AChQnAě8/gxO! "K7"AueN5m7;)01;Kg﫜.MalXdrI#y&~~mZ=ep)DHS;'&"(sqv`emzrc;`͠.]lc?(icZA `{*;Ɉ:A=:̈[XT@*77++hzyI{| `Wh*Rm(yl1o{|=ɡx^$Mvz\2im[!5rv܎JзFJѱ0'm+Cj)9=.v$e oXW%CDUSN{tnu<&#^:mёNUVCkTh2~׫er_|0,}M"v9.:FȴH1ZxY,y]8f$`SPl޵0,!Ir^p*0t8SELpo;aF4'qA'^lL&6P4jOHy!me©&&RҤ0D,h26c"hu%Na3][Km4_cs:~&]5ޏq)C XTYkK;-ҊMF)O*E.@# CKг^ă`|$GvB|_!Zt?=Q-=Yçɘ<4VgfVSRQ~ !OEV%>$-"4fa+ueo ESR!NwYyU6*Q_;zj=BXT;EB`6e *AVJsόP{Kk;E;=}ĶlxCPS8Bo.$duKxm\ޱj6ɜ n[̨{W3 zN17zuZ1 A{=$5&Y'"Xr)/kFٰ ie^P,n$l5K3RET" \Dw{DO~ dBT:ϸMӱBÒqsaB+jRza2<6=ʬ)φRV@&Olbq6Tv!a#m[O! 7:cZ͈\Zy=zoUXeYܞ7ӧd+L٠4/_T)3(il2g <̅fD<a(fV])r5Px|+(o˛4{:M;2pNjəXKa_efQT$ L[t 377KY ׁEN8x(&5LD['R? QחPNF8Q t?PKƢ7Ը5ZC e237P#ӉN4,tU">J:tŅ87W2ʟյ4]K TXW-m9fWƠ  |NP=c2D+T3 ;wʌDP3&t0+\Yw% e^^0BR[Y$z*١>>hs@ZW'c8nMifD.o85l/4!O)z5k-nj'2,K;Ħ 5cOi؁aQB\^}$0,id`<3۽"mOJr2փSd;ҏ-'mB:@sHb:ރ$&ac9} U#8}{CpҔԀB,!p0Ļ2{2ckiU=Աp_ .z$\)Е$f{",&Q B4DEwCaLGל1ci1;\R[u.qHmؕ JQuT;q35"%Dwb݀Q'V@l;GpU$4b O x!"6o ˳\^8zSy_Ԭ%IYG3pu58k^@_WhBҡ.eA8>ޞ)N.f-₉5i:E| fV}Pnع*Fk`3jIߌG>v m'6NI +V $K|-nU'Pt#_{FܝPSz'Pnyza->"I:{WJNmlǺP Y38l0KWpj9fT^\³do?jGLܓ8g]LMe!GƂ)zy4v}5;3YRo&9ς=Fb^A:˻rtP;d&s;>h2ʺ/V˟WD8miWYYOJ"`"eq53@ ؚZ}iF}r9Ƴ gޒq50Z% b ֵ_;ur4l Dp` :w_=H~w RJC艎xIۏiL4E' %/D#P-QۿPaz")C &2KIsn F3A2ÀEkоg}9EXqKiݡPu@f~u7KC+?=±(^fK 2!78ٞ#" Y]8$bܥJi'*rJO2jE@ab!>FaTEIUOdܰ{M$kč"Oz ]ksL:R Xnd#3NGӀԥ nJ'_#(?V=A`"UrK=kw`?Ta&{cS%IRlAkޭT3q$B 7s> Tnk^|,5h^IX籥)Z_{Xx1%}GWL i|%p!rU9`Hvf%*Z\AVds\1~I[=AO °$J.)1fe|~qՎV.uwuk2"/ry7l o9)DV?rq5n+ tB5E!唵'n-]Gytc;Ar%:d=86bChLL.$[ 'NŸ~A y_.QLP 2X YUîӜ|]=3QeL75704U%%VU5 X(#uGzɆ#Y* R,#b yL^]3ai!|:;2cegIk::%`wGna? &jiAZkwB 1^ j|0M`'q,vӥZn+a~!39MN @qb,z)n֩>( s O(Ӡ(ИkʽMdLf͝n};/r}OLi.YG9(*^;L-v(J_M@0;\^%uWמ dhdp4x *ո5MqO: 9̰e*d ggcUDJH6}~diM!n-'/b7 vY |~W<КNtf͹$*heaZ5_e$ΰP^Viv]DV^*W4 l% &ͰֈkY*ʙEŒox`5_=9B)5y@춬Rʯ֪bٞovV/,3 ǻgL)*( ֡maH4 z{^iÎmWhxlflhX]Qg W^YH ܴ0ez-WAp,R!M~+(Q%d:>r$Xsl%~:U] ІDl%g6n[YL?]B}t-)(P_o%rhۣ&䷟t6,XyyqjwʒdFֶ˟ɵP2$tVWFR/gX-u*q_ ռ}4fa巃cUug]2dp<_AdZdv2&dÁi9C "X(PDlz @8{Mua_[(?Ikpv;/(}b+=Gw^5nWDnWoҥP-=pюŀu7i=e(-7>*aB"Gw );tb@[0jۜZM7y #2ň+bTGrP~yMn^ ~TѴO%de  2T[&3iv\dŬLׁE)jU25CErrr81Ull1 fU)o*;ĩjh9nr^]?G SxY1b<[4ƹVIYz%$CwXV!IZ"9g5!<ˇz]iOH`gㅢÔYPSdK{K4Q`Mk3lhl9hT9ͩGȽ4|aH'3`4gkQ vT^C5! J_s`8bn.ٵҩ 8=wQ#=C:.fHCx#C&`XbM1_33j 4`7\ ǧ=v Ҕܦ;5A"@0$&}&ZK(% QSDñQU;wBh2bg1P`&s5 #5fE94A:55FhSWi, |m%*d;auBJ t>Yn7DH/$ϙ.4H韕/ӁAirL_n]dɄXF-;g {NbjHJ7|gԵ1=MՆLcU˹1OX[.3lu6Msd,H7N}N -9Jh96:t`˖U8 Y,ч)JC쏠[1<+x5vA5 mw1-Ύ_l Yb=DfkJu5#2 .3@ RM8dZٶc0ՂU˃OWJLZb%֙S{~`f'5Hg4Z5 #yqӊZbBHgFɪwF,\. l3Hq  ʂل⧗آ@ DRhIH,$.//a:JGWJP 8S ܐ8gPoczgqɊw(?!me©|FQHPyYLnL#D9tU&łIS׈qK斅[08Ae=83]㣟UC)9Jb(oXaP]dZ3_1G% &9,lƿ߳aSRƹN6(hSUP,nYL!hG<^y;RmK%kiKx8Nt+V= 5<ʺ_ =RLj,n;Lt p-k$K |&/T ͟IPK3wf{^'Zj? ,Er@]NƺU=;Q-ytb2<[) 4$d 2ݕi3:@dOB5$npsw-DQx}~+L8~, hl`,J 34Gv.`؇@M/e޻3Y-~ֺAW,fPTؒ $&\J$j=OB6 TPi?ߪ 䁠ǛчYwlp3qL,in>W]b{Sx&s!>*c,A RQ" m)e+äBK LVvzCMx dו5b#KК$W8q`tq('}Ί8im1r\CTݟ$W͜g *vvߪʯ#_ͬ]# 0^mOTiY<2nLO Jj&$b|GP#X>+flX!X3}6V#Dy3ti 0aY< yThEv+&ħx4? on 2vI|y6ym&5QdZ;;dvٗT͚ͬXfTFH}=nׯ~)>W Ÿ@TJOQL=`,z VrF͆Rm/4mܙקy}뷭=I/qy-nqnu<3Á_1௵z[EɇMo\)fI9QVg}>ZȱaL۴@ Q;gfwe$ `Bm ǖ!ĞÿNYX-O q-fl#uY9b%MF^0NS[Fh·(BqYqZEk:rCni;>HqZ\}%!?ǹzʟ`EYVdۉvXAV ƲBB W7lA]f[>11ͽo6#wfQ5SUf%>蕔/*,%Ihnj~gQ?,*ZBʴ ҧ$l||q6 tPB8*")<xabsp(ޔpDF_ !˟;:6쓆&tNΑ(.LR<7'bX[HM=uWZYPi5lI!T$~XkC`+T |)''`lkd ӕIgDVҨHbC*M]kȟ\-46O@eE' %I(@E2&n&RD72B|.͂JyT`o"'k URLFmu82^Fy'z'،m:w xbAg}}6vӯg_r۫v&!>у%+6MTvҒuC.1ߗإ(ٯ CiBO;?b/MSkXf +Hi?%([& AX-|\~Vk[`';5/Tҙx 9R[A"Bi[0tg[1xZDaqG 4d{r3doτD AcD-2T*9=OiڡYmK;KLzf'x } X%9Mw"I0_Y,HGWWJYG&:E(?82{凬PQ~Nf\Ǡ08L?q0$m3sJ'Dft_PdW*XE?Ƴ$zB1+@Qt I[|QNVÊKaQBt7VˉoIRArU㉩#(5":=Jf\bp!j}ǰRQiia|*ϝ!Lt& L{օU}<}- CuӳH<9x#M1p~3 \ J9Btҋoxƍ#BuoaŬ[U'P9(!5cgHqnK :nqlt+3!Jta-֎17 ך 12xV#wJ-uuqS昙ΥsyTg;78a q/55;F ;O2,*iB bgeV]pJL[9@GiȗԾR6k# @>B{6Bf2aJgSͤ^TJoӺ۬L/)8[69_`E-^Dva~ R$N@(TպNNZtgU}oNnIR!g3b7QrQjEr^pS(f)/ntsw\D8&+fXԄ̘u@t`C&MY-]G,,k8-(qzahhs2?XqL _ţ&[ZTOx*;طD%XQa h҅-֦E>0N͈ցOjZi ̔jzJ{K+ZJc ߧk}*V79"kKNާU\᳨a'ZԶ20K6VCDp̄7HZVϳ3_b"K4_DA 7ȑw3 )aǍRN- Hs%^ 9B!ץ!^FYO[LQl'b( Aa\1_%tWZ>jWuޙSX' y6Cz⯣J1*w)#nl$l+VPeދ U2^b4sA B%`EXQ]c+OK3^N`,:6MRIf 1 # n6x"(蘰 1bjP`&?'WI?嬶頨~L2? q&fQo*uxD]__B̕o1R:{3ReŪK؄I 3ޑ# ʙY 7MS7-¿(&r,ZvE/\a(dͻ:8tA>iY-罷r9Ɇlew}%ò 1L&~NE0qMkDO4LqPΒ#aAt (鮄 `&X*YH2vwF*XGr#11ФM[7E/x{[4)=dRXv&x@h&cK`D..6 cm^hAIE.'Ȏ]fmCgJZaNY%6< z&'p8;sX˃o7H%s(.!/i@caWQYvh92},ʰk;iX`Fy|$.;, =\@ bT!!^10n 0Da]+ET]{;sIK/Oq;>?;bQmIc[=Oj_$ ]ݰ,=o.׃fvPThmY1_fa~Dz::\ aSc6.m0n8c}pv2/r] >ݳH3M9јp>851Fy /9Ż0%,g6ו )i* 8J8w?_֚< 7O@MIk蚝nʉҔu,1DSg"3NiORcW1WGaqf>Gҟ$r+XS?,s ylIߊSYrO[g[ Јp|S r{9w q H#Iѽ\<1 AɎerc43PxwDE`~g+ :[֘۶dߟ`%᧲KLM9cUfxLsC11K̡?EsHucƪ)p2 ~d<xI%}Zwd0һNiRnK-:pbR: ΞQv3[ H fmU}z |"qFi, _nq~DE?KڷgCNHd6ƅQޅ&S7w ojs 2BOUMKsX3p(%;<+ V *!!n^}eXz --kBʗSvZWc~ MO*buM}IN4G *H( LP 2WqГ1bO *aiC (?]`NCaOHU,B{[ʝ[itTyN{zM`Jܖ\bbȶA܊( J_Dfi&{~$?%rr+(R/WK5c XpyBq|D\{ Qa>IwA9~6ZevxM+64 kui7)$"]" ڻa?>*)DQp> ~~j:x^˳8+\~$K*\uDлJ>+'̾#ף{te^,?0b$IX-ݎ )sZ0rB\MSJMn0N0l0_݂eFbbtcm8^ƟyՍl1$Q* [tAisR|_/3qPѳ-^;U)@|LsK&zwB\h~Qwfti_՗Gt}-9mSb"ZBqOF==S0D~3MҡٞF a Un)zɆ#YspHѪ"߲§ˆFlV Fj z*RTd Q~JJoIV ({uquw9+Tli Y$yx%LZ6xQmrAS#3Jsp;^BpDP o44»tZFx2꾍.xƶ@ p.x4GC&w:9؃C?5vQGX؀eH ?;W)0 >+uӠ"X|0BKtog{4P8 MJf+~&=̾ [=e{ =9퍘fuOFZ)"±!k,OͬPNS_H;BUNʹdDf t^C6VXv99 ܋q*Ot'UT3)̧5E,Xx8-?_5N yQ_?ߑ"'pU+r 6MVf-b=P݂|S;ߙhFX5;xS4K%338}>@:TK}Z sAnE##I&l6+3Z=KϬe976~} Y8:p_S4=\ a˄7H(BNȰ 91s tzqz+Ӏ_c dhȱqU1 kv: +6ok) ax@TaHҵם0MsN7ѴB.I'b6x}|0ycL$dYD)C{fϣ㼌]Ln'~Sͅ!{K& V/6._XE)גsEV>ps\ D(BbXT=&e]ĿTa(['xGX##w~:ESޠ#GK9e{r:2sta{mJ ^թ.K$Щ_gpr21{ &G_+Q)e1׀,r<#]~ߨ]2dt@naG_:=CZ6/q]F`Ɍ*c>59okȊk%[Seo ;5l.BahLoD=8ha&7%=M'f_͝y>.78!XѬOs?~rz %`S.+L|tRZ kENsl뛝i1߯|eEk5=o|h$"Lb#H="F ySHrԨ1]N{H07To&/?e@%Ԑ&&(gP2⋐kf¦R Rq+,eho|Q }oMrgMD K 4ӤKr c`)p-GOI.~`s/+Dž7CPNwQK0ͱlj: 9 &lQEE?/*My! #<(%DQAGm.n\vЏf:H,C 30c*~<7*`pBVF͊Vbr]s% y QLyC--Xd#32S)J37I}:#eo<3b $Dfb\(iA Wwum۱b'NjZvD;n~2Dʹ= R'u{-Y".90|%P)vvZ#UڽI_}B`U!:7:b(ua;ɕxEUOշW@-AY2Y59E;9J9aԉx tUHM0 wXj\ݟt ?}}۠~3[w~۰Fq<[ o*a8 OU #F%7oY\~pYqb /Zc{f}u"?FP5#M;>,Cl(+P&>3ryb_\a;NIsoxhѭ;dhzG]^ 7S{=Uŭ!9L䘤;@;Zc'ddᬘDRx[Z vւÛpGO)b849kqwA@Pr(d1O]OT^Ža}!oj@޹Qu_s7ژUjy6b zBАmHY?zM笵X̳¶y"#);THI 7?],%[V VTe;DWvO  a7r !nt6T.}\d%x Γ99kOU sӎk'*N~i 'igI/ZTc9HXJc8?Ï:A!ycMv%#⭧ةȖel@Jqf{`[0ԌMI/!l ¿Y=m_#d:vӸl&pIеCcx]}h6x_3RCxi2]n1Ql薲3jR|*+>B r4r5Ekƍ ruL|òՠ$"vKbTA)o(q?;'8IuMlP|98+/ Hϭ,GqzX}Rڱ Bx8SBT T7Mu^YQ^RH󇒥(;z8;:Pj=hrgiu a]P (ށ/5dJ>ϵE)xoe }#{Xk3c!yx4ިda` Az*S80 D-TRi~Ohx1^zܜh@ .Pu߮`DS(fGA XL 7bX>؁)-t >ߺ ?#1R ?@@BBCEZ]^_``bbddefgi)ijoopqrstuuvxxyz{|}~~ڸ`zw>=>@NBBM[\]^_`aabceffgh|nnoqqrstuvvxyzz{|}}컈7bC`<<>>?@@BWZ[\]^__aabceefghhjjlmmnpqqrstuvwxxyz{|}}kYiD~I:;<<>?@GYZZ[\]^_`aaccdefghiikklmoopqrstuuvwyyz{|}}~ϰ]qw:F;;<>?NWXY[[\]]_`aaccdefghijkllnooqqrstuvvxyyz{||~~ݸ^yd9M:;<<>UWXXZ[[\]^^_aabcdefghijklmnoopqrrtuuvxyyz{|}~Ї컇_RP899::;HIIJKKLMMNOPQQRSTUUVWXYZZ[\]^__aabcdefghhikllnnoqqrstuvvwyzz{|}~~ qrrstsu겅WsazJ+,,../0;GHIJJKKLLMNOPQRRSSTUVWXYZZ[\]^_`abbcdefghijjlmmnopqrstuvvwyzz{|}~|oopqrss㯅Un zU*+,--./5GH IJKKLMNNOPPQSDUUVVXYZZ[\]^__`bccdefghijjkmnnoprrstuuvwyy{{|}~~unopqqrs۩RiW|b**+,,..1FGGIHJJKKLMNNOPPRRSSTVVWXYYZ[\]^_``bbcdffghijkllmnopqrstuvwxyz{{|}~nopqѢKda}o)*++,--.AFGGHIJJKKLLNNOPQQRSTUVVWWYYZ[]]^^``abcdefghhjklmmnopqrstuvvxxzz{|}~kllmnoopǔ0]~a~u2**++,--;EFGGHIIJKKLMMNOPQQRSTTUVWWYY[[\]^__`abcdefghijjklmnopqrsttuwxxyz{|}~zjkklmno`ZywB()*++,-4EFFGHHIIJJKLMNO;PRRSTTVVWWYY[[\]]_`abbddefghhjkllmnopqrsttvwwxyz||}~qikllmWq yT())**,,.CEEGIJKL=MNOPQQRSTTUVWXYZZ[\]^_`aabcdefghijjkmnnoprrstuvwxyyz{|}~hijkkl㬇Pi{i)((* +,HHJJKLLMNNOPPQRRSUVVWXYYZ[\]^^`aabddefghijkllmoopqrstuvvxyyz{|{`bbcdd͚0Z}~vT'W(())*5CDDEEFFGGHIJJKLLMNNOPQQRSTTVVWXYYZ[\]^__abccdefghhjklmmooqqrstuuwwyy{{k^_`aabcc_Vqzl/' (())+@CCDEEFGGHIIJKLLMNNOPPQRSTTVVWWYYZ[]]^__abccdefghhikkmmnoqqrstuuwwyyv]\^^__`bp䫋Le}sM&&'()*2CDEEFFHHIIJKKLMMNOOQRRSTUUWWXXYZ[\]^_``accdefghijkklnoppqrstuvvxxe\\]]^_`a˘$Y|xi,&&'());CDEEFGDHHIJJKLMMNOOQQRSTUUVWWXY[[\]^_`abbcdefghijjkmnnppqrstuvwo[[\\]]^_kGRm|qK%&&''((),ACCD EFFGGHIJJKL:MOOPQQRSTTVVWXYYZ[\]^__abccdefghijkklnooqqrstus]ZZ[\\]]^٤?_~xi/%&''()1BCCD?EFFGGIIJJKLLMMNOOPQRSSTUVWXYZZ[\]^_`aaccdefghijjkmmnopqrstbXYZZ[\n~Up|qS%%&''(L)8BCCDDEEFFGHHIIJJLLMNNOOQQRSTTUVWXYY[[\]^__`bcceefghhjklmnnoqqrgVWWXZZ[[\੏Eb~xk9%%&'(K*=BBCCDEEFFGGHIIJJLLMMNOPQRRSSTUVWXYY[[\]^__`acddefghijklmmoopkUUVWWYYZ[ŠUq}s`(%&''((+?BCCDEF=GIIJJKKLMMNOOQRRSSTVVWXXY[\\]^^``abceefgghjjklnnlUTTUVWXXZbFa} znN$%&%''(H,?BCCDEDFEFGHHIIJKLLMNNOPQQRSSTUVWXYZZ\\]^_`abbcdefghhjklmjVSTTUUVWXXÊTn ~vi;$$&&''(-?BCDDEEFGH-JJKKLMNNOOPQRSTTVVWXXYZ[\]^^``bbcdefggiikiUQRSTUVWۨ?^}|rc/$$&'(,?BBCCDEEFFGGHIIJKL/MNOPQRRSTUUVWXYZZ[\]^_``bccdefggifSPQQRSTTUUi~Ph zn[)$%%&''(+>??AABBCDDEFFHI~֣Q4Tp |uldM(%%&''(**++,--.05;?BEHIJIHEC?<:;<==>??@ABBCDEEFNߥi=Tr }wnf[9%%&&'(*+-../001245657889:;<==>??AB CCDn{@Tr ~zricO/%&''(()**+,,-/.0124456779;;<==>?@@ABBVATp |vnfaH-&''()*+,,..//00112344567789;;<==>??AOᦁ?So ~zskeaI/&'())*++,--../0011224556679;<=>Pޥ}}ywuttqdXOE>941/046?FR_o仏 >Ph}<~~Ο})K_t%弓RCAOe}ǚ ?%HYm}ѪI;5K[pԮg9:L\rΪn5;L[ol/5HSfzǩ~]+BNVj}ѿ~m*%#EPWcrŵyk8 ;KT[alvxsjUAMTZ]acfhikllmlljf`R*Ɂ́ɿȻƸƶų°ޓ!Ыۿ'ۭ ݽ!̖ Ἱ"ʋ~ ๶&ߏx{~޷'qsvy|~۵$tlnruw{~ղdgjmptvy| Ͱ }acfhkorvx|ǫދj^`adfjmqtx|ً a]]_`bdimpswz}"~ں[$]^``chkosxz{|}~ʥ!YXZZ\\__bfjnvyyz||}~ ҽ܊=XWXXZ[[\^`dmuwxxy{{|}~д7ZTVVh{^`lttvwxyyz||}~Ş`RSTV nrstuvwwxyz| ~~ɵщ8oQRSSUħrrssuvwxyyz||}~ǥb6NOQQSSŨrrsttuvxyyz{|}~~ õK։ MNNOPRSxÁ(rrstuvvwxyz{||} VKLMNNQQTā)rrsttvwwxy{{|}~~aՉIJLMNNOQReā/rrstuvwxyyz{|}~HHIKLMNNO^gjā&rrssuvvxxyz||}}~ ψcGHHIKKMMVefgjā#rrstuvwxxyz{|}~EFGGHIILObdefgjā+rrsttvwwxy{||}~WDEFGGHII\bcdeffiĀ/qrssuvwwxy{{|}~~nڈACDDFFGHQ`abdeefghĀ/qrstuvwxxzz{|}~~}ZABBDDFFI\_aabcdefgiŴqrrstuuwwyzz{|}~~ ~K?@AABCDEQ^_`abbcdefghppqrstuvvxxz{{|}~~lهt??@ABBCEZ]]_``bbceefgi,ijopprsstuuvxxzz{|}~v@=?@2BBM[\]]__aabceefgh{mooprrstuuvxyyz{|}~vki<<=??@ABWZ[\]^_`abccdefghijkkmmoopqrssuuwwxyz||}~wBχCd:;<<>?@GXY[[\]^_``acddefghijkklmnppqrstuuwxxyz{|}~~ k݇H;9;;<=>?OXXZZ[\]^__abbcdefghhjkllmnopqrsttvvxyy{{||~ nL99::;;=>UWWYZZ[\]^^`aabdeefghijkllmnpprrstuvvxxyz{|}~~mR899:;;UUVWXYZZ[\]^__abcddffghiikkmmnoprrsttuwwxy{{|}~aYW2344567IOOPQRSTUUVWXYZZ\]]^^`aabcdefghijkklmoopqrstuuwxyyz||}~}~~a[J2233456JNOOPQRSTTUVWWYYZ[\]]_`aaccdefggijklmmnopqrsttuwxxyz{|}}||}~}`[<1123445KNNOPPQRSSTUVWWYYZ[\]^__abbddefggiikllmnopqrstuuwxxzz{||~z{|}~}~`K80012344KMMNOPPQRSTUUVWWYYZ[\]]^`abbceefghiikllmoopqrstuvvwxyz{|}~z{||}||_011234LMMOOPPQRSTTUVWXYZZ[\]^^`abbcdefghijkkmmnoqqrstuvvwyzz{|}~xyz{{|y^//0[123IKLMNOOPQQRSTUUVWXXZ[\\]^^`aabcdefghijkllnoopqrssuvvwxzz{|}}~xwwxyz{{x]6.0Z22HJKLMMNOPPQRSSUVVWXXZZ[\]^^`aacddefghijjllmoopqrssuuwxxyz{|}~~vwwxxyzyx~]I9.//0011GJJKLMNNOOQQRSTUUVWWXY[[\]^__`bbcdefghijkkmnoppqrstuvwxxyz||}} uvwwx~\E-..0S1EIJKKLLNOOPPQSSTTVVWXXZ[\\]]_`abbddefghijkllmooqqrsttvvxyyz{|}~~sstvwux|\P,-./0XBIJJKLMLNOOPQRRSTTUVWWYYZ[\]^_``bbcdefggijkllmoppqrstuvwxxyz{|}~srsttuvsxxZad,-..//0>HIIJKLLMNNOPQQRSTUUVWXYYZ\\]]_``bbcdefghhjjklnnopqrstuvwxxzz{|}~qqrstsuryuY~+,-..//:GHHIJKLNNNOPPRRSTTUWWXXY[[\]^^`abccdefghijjllnoopqrstuvvwyzz{|}}~{oopqrsspzsW*,,--./6GHHIJKOLLNNOPQQSSTUUVWXYY[[\]^^_`bccdffghijkllmnoprrsttvwxyyz{|}~voopqqrspzmU[*+,,-..1FGGHHIJKLLMNNOPQQRSTUUVWXYY[\\]^__aabcdeffhhjjkmnooqqrstuvvwyyz{|}~omnopqp{jR**++,--.BFGGHIJLKNNOPQRRSTTUVWXXYZ[\]^_``bbcdefghiikklmnpqrrstuvwxyyz{|}~kklmnooqq|dJ]B)*+,,--;FGFHPIJKLLMMNOPPQRRSTVVWWYZZ[\]^_`abccdefghiikklmnoqqrstuvwwxyz{|}~~zjklmmnont~]0Yg))*++,,4EEGGHHIIJJKLMNNOPQQRSTTVVWXYZ[[\]^^_`bbcdefghiikklmnopqrstuuvxyyz{||~~qikklmkwyZj())*+,,.CEEFGGHIIJJKLMMNOOPQRSTUUVWXXZZ[\\^^`abcceefghijjllmnopqrstuuwwyyz{|}~ghhjjkkllyrWZ*(()*+,,BCCDDE?GGHHIJJKKLMMNOOQRRSSUUVWWYYZ[\]^_`aabcdefghiikllmnkVTUUVVWYZZes}qUp¿m$$%&'(),>BCCDEFGFH9IJKKLLMOOPPQRRTUVVWXYZ[[\]^_`abccdffghhjklljVSTTUUVWXX`nz~aFJ$%&'(-?BBCDDEEFGGHHIJJKKLMNOOPQRTTVVWXYZZ[\]^_`aabcdefghiikhUQRSTUVW[iv~mTc7$%%&'((,>BBCCDDEFFGHI4JKKLLNNOPQRRSTUVVWXYZ[[\]^_``bcceefghifSPQRSRSTTUXer||^@}{+$$%&''(+%$%%''())*+,,.4;AFGHHIJKLMNNOPQQRNJC?>?@@AB CDEFGHHSbis|kS),EnwmQ)$%&&''(()**+,,--.16;>BEGIJIEB?<:;;==>?@@AB CDEFHYdlu|pT4Pkwma:%%&&''(())**,-./0"123445678899::;;==>>@AABBCDEN_fox}rT=QjxnfQ/%&&'( ))*++,--..0123455677889::;<=>>??@ABBGXcirz~rT@Rg{qhbH-&&'())**+,-..//00112244566789;;<==>??@ETafnv|pT@Me}tke_H/'( ))*+,,--./01123355677899::;;==>DS`eksz~oS?G`}~xqjebO8())*++,-.01233556678899;;2)*+,,--../0011233465=GR]bdhmsx||bL( Oh}'}zvqlheca]SJB=7400/0238?@ABBCEZ]^_`aabceefgiųoopqrsttvwxxyz{|}~q^?=>@6BBN[\]^_`abbcdefgh{mnppqrstuvvwyyz{|}~~z`Q^׏<<>>??AAVZ[]]^__`bccdegghhijllnoppqrstuuwxxyz||}~ b7R]:;<=>?@FYZZ[\]^_`abccdefghhjjkmmnoqqrssuvvxxyz{|}~~~iY;:;A==?OXYZ[[\]]_``acceefghijkllnooqqrstuuwxxzz{|}~ }r]L89::;<=>VWXXZZ[\]^__aacdeefghijkkmmnoprrsttvwxxzz{|}~z^Uu899::;HHJJKLLMNOOPPRRSTUVVWWXZZ[\]^_``accdeffgijjkmnooqqrsstvwxyz{{|}~qqsuu|^ ,,-..//;HHIJLLMNNOOPQSGTUVWXYY[[\]^_`aabcdffggijkklmnoqqrstuvvxxyz{|}~~{ooqrrsst{]ۆ++,-../5FHIHIJJLONNOPPQRSSUUVWXXYZ[\]^__aabcdefggiijllnnopqrsstvwxyyz{|}~~vnopqqrrww]ц*+,,--/1FGHHIIJJKLMNNOPPR>TUUVWXYZZ[\]^__abbcdffghiikklmnppqrstuvvwyzz{|}~omnnpq{sYdž**+,[..AFGHHIIJKLLMNOOPQQRSSTUVWWYZZ\\]^_`aaccdefggiijllmnopqrsttvvwyyz{|}~kllmmoppoS`RD)*++,--;FFGHHIIJKLLMMOOPQQRSSUVVWXXZZ[\]^_`aacddefghijklmmnopqrstuuwwxyz{|}}zjklmoqj7kk)**++,-4EFFGGHHIJKLLMNOOPQQRSTUUVWWXZZ[\]]__`bbcdefggijjklmnoprrstuvvwxyz{|}~qiijkklmsg!())*++,.DEEFGGHHIJKKLMNNOOQQRSSTVEXXZ[[\]^^_aacddefghijklmmnopqrsttvwxyyz{|}~hghiijkl{eӆ *()**+,,KLMNNOPPQRSSTUVWWYYZ[\]^__abccdefghifSPQRRSSTTUeÒb ܱ1$%%&&'(+>?@@ABCDEEGGH~Ih ȍ/%%&''()**++,,-.16:?BEGIKJIHEC?<:;<<>>?@ABCCDEFO̖_{ ̴Y%%&'(**+,,--./0 112244567889:;<==>?@@BCCDoҘp Ɣ>%&''()**,.0 12334456789 :;<=>>?@AABBW֝u 7&&'( ))*++,,-./0 122344567789:;<<=>>?AO מy} ʾ=&'(()*+,,-../0 122335566889 :;<==>R֞wv “U*( )**++,--.//02445678899: >dНreı}L*())*++,-../0112334567789;Y˜bNõd@**++--.0113457Lm–N '·n[LB74//6:EQ`r庎 |#ϟ}R鿔R ̞ JٰJj߶jsݵssҬse߼e/zۼz/?zz?d~Ǻ~d1fyyf4ih32 |bx}ýtx~¿hvz~Ƶmt{ƽlq}żlp~zxſgn~}mks|ĸZk|{cafpz¤hxz][]bpy{~"bt|ZUvtvy{}ַ)5f}~^NR~tvy|~b)`smJLOmŽ~twy{~ٶ)b~}LGITevŽtvy|~+XkdBDH^bevŴqtvy|~ͫ+^v}J@BP]`beuortvy{~㸁+_~q;=@W\]`begjlortvy|~:a~\9;CWX\]`cehjlortvy|~vRg}J79HTWY\^`cehjmoqtwy|~̤Wl{>58KRTWY[^`cegjlortvy{}֭Wmy546LPRTVY[]`behjmortwy{~~~٬Wox124KNPRUWY[^`behjloqtwy|~y{ܮVnx002ILMPRTWY[^`begjmortvy{~wy{ڬUlx1/0GJLNPRUVX[]`begjlortvy{~st|֨Rhx7-/BHJLNORUVY\]`cegjlortvy{~oqФ]Hby@+-Ts}vi>%'()+435LPSTVY\^`cehjlortwy{~}~~s[414KNPRUVY[^`behjloqtwy{~y{}|rY301ILNPRUVY[^`behjlortwy{~vxyxnV9.0FJLMPSUWY[^`behjlortwy|}suvxlUJ-/AHJLNPRTWY[^`cegjmoqtvy{~pqqxhR]c+-u|4%'(+7BEGHJLNORUVWOFGIKQhv~pS+#TqyB&'(*+4;BGKLLKHD@ABDFSkv}sT=!WjxX.'(*+-.014589;=?AG^ox~sSCNbwjO4(*+-/014589;EXksz~oR@CZpxrl_L=61015DFIKNRVYYPKNɡTfc+(*3=CIKLLGCEQү Wf~uE)*,.1479<@Ѵ Ubyz]G804C`ǮK[j}˶%R_m~H Nalu}~ €¿¹Ŀ̷̼r˶lqtì]as}ಜTtx|ɞ{SOŞtx|ʨfGSdŜtx|JADZaepty|uss  %&99 JL  cc kkrqkkccOO<=)) !uu!  AA %%  ==  "\\" $lm$ &ll&#VV# "2~2"  #::#   #*W罊W*#   !#%4\{Ȳ{\5%#!   !##$%%&&&&%%$##!     h8mk 5[myym[58͉8bbRR;;PPQQ;;TTef77;;cbttvvff@@ @@ oo aa (( KK dd``NO-- ee ss OҙO (Ko~~oK(  l8mkNȓN[[\\ SS \\ "" hi ll(( bϡb   s8mkZzz[//^^{{^]00[zz[DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/DisplayCAL-synthprofile.ico0000644000076500000000000044604313230230667025022 0ustar devwheel00000000000000 v (@@ (B00 %  - 3> hGPNG  IHDR\rfIDATx ]E>~zOwI: IH*Ⱦ`\GEq;08+EAd kdIw',޻KU}݁蛼~ݥnݪsSml޶ƶmmc0mom ƶm61ƶ6c6`l+柿9rw"?S G/? rY~23^~|+?"(1A~O?}K߫mM!)wgG?(͉l99A٬} 2DoA!% /B&:/ѢD<O!Rq(! ȫ^Q N9vm18Q*rC J51#2ROTZA: -Rxoߥ 4$ 䧟h/!)2k.??߳vllۅO|krFGC=D*˻ke2 DH#+VTb"WK][ (@" (Wސ#ѷH} y +I\fk}}of/UR/}LTt4dDT/ eH asH r;ð8߬,I l1Ӛk ?>p|^ uu])_NK܃jA*>.WBφ"n N2{I0A֮6'Y{Pf|5lKD.;)ϲWkիKQR*}?A!A7{]6mo"],;=[.ߪOwp sڟRӒmNV~BLD~ITj,|%K_J+)?Ujl#i{}6vI0ؘ`p#[njlO|sbFalc{nrjZ3f#+~R*'ꕹkHêֈ5K ڰ@P\ ݄$^w?uV`۷VZ1,\7fJD}tXV٫D~"JZ=.C%@P\@QWgv"{K8[[`Y=I~=kR H; _U 1bG8sZwWFo1ukh"Ƀ#Gxqqkƛmal>~N]N>Rkٖ̮,e'DDJ)s9UQ^~AP)UfLڴHkVi*R @0ւP6UlxȞ!}ssc])Z_ #X\"l 5yZ=T{a1͡]ڲnc~l r_vbv7EgB}M)6WWh-`A,K?* ʿ&};,Ѓ.18X۹⧙ R/Eq3 v.@uR- [ZrP6uc X8>Onmۖ1Ho<~4;~o89AnJk:E*~J?IԿ0TGXk՝Cdq_1rׄa?>7Nmg?u* j5N_YunSPa&hZ5qEF{P |uYZrV,DЏ>蒷u|m x[{IafI=&B_m)Y,|oegd('bKi(=:@ j˽MY=9,?C4( FSigKMD 5E_l]DM2ѧ6/?Cmi [q0p$,<ZV͂6m*RggY,tᗾ%g%zKُ qK͔i6PO2{=Y@I/H]/[~Ćk\ !O sR @n8x+X/)7jvA0R?2@UU}ԹfI t%˶n3[~c)#nQ?vF]:T}Qzn^0,)\~Z]5leVB0ޣQxUx&*=O^'l )W34lTYnʚ|[1>-hŊ賶Pz%l9i[ ȷQ7ܜFtM{!ԬA r /?eY^K$?b}6HhNX'XV[0+8''ɧ AD5 WBHK&oIQC"!hmW9.n+[\^V5QNYuS|Ǔ#‘l`P*bJ\~3>D5H 뒧FשkcA Fu*xnRjw Sq7Ru2y=e#AwUCzBK~7=|o7IἹ(/ OMb GGD^~^,-2Y"Њ6X O;V\ZתxYגmA xa&L@"`.߶2AqArJ^ 8YZ/;b#ϽMrysu?N߻nvQ W]OTEM X-,?)zVR:0R伦 W@:o?1s&`i%[6[V髩q\U+?/uZ::</_YnۛeѴ}/?U)H 嗸 I;3ZaA`(JAPHqal@FH&nZ~%i66o - >,a@W Њ}ˆ XA6sìqm9U?S.7! W͗w[ G˭?S ޒAAAP` RNv Xy}D冨mFm}դ- [1A:h 𓧪mg{YssZZj&|v^%a ^Gg3R YU^YkRʯ8HOM~fc_)x4iJ$똁>LbqٮqM4E3笠U~}(Z h񲞍BxaI򶱽@*"#noڱe\P y9/trvyqD12(7>T@P 'h7z i߀:]ϜWNNe8@.éu;ښVd'*1kڒ͛ y 'znoʼ |Wkc mʖ)@R</ `MrFyF#a$z 4Xrc)>6 Jfnv _%`++Ry ]B8$y)4kJe[W &b5.[?FߨM_yLpONZmY-]#bHCRQ/iE PASoS{vcCeZT3;v```idT"}|?e!Epb #D1;.3:eA#Tz tś7cem|\g&iSң&g~K(~2 q"S}*b T/` 4>I#Ms.CF5 bS@7/7(|ڒPA^.AMM=ibk7f_uV{k࠮Աf-Y;/=/:I:6 RwPNm~"7(=Ef?58T&L[~;ȤjrkEwSf@DSz= W }67"(0 +6-S%ln]Ð=w5\.oPJGVA tcThYo`#O|0^ ݶY.>4kF.Pdc~o}{k7g2hny5PA7h! ٍo߅yt:\0*-(VH)IR@ʪ 1D[ K+\Pb1%:V,,& PCdd3Y $ew.}r'Ͳ&d#uNaRvH?D?izzQmȭ|Uׄi`4`B@i٪ׯ=}gKǖܶ9833skv﫟Ӓ*0m>ߒLf꾱EGL&_+ry,@)W (?H}0TBA~~BqPz,Hs\ !nm-D`PSCuuTSS+bG)v|O"!&~كb5cWmщDc}Oc)_[5_+kBǏ~W97/ioPÛb5hjm5ceZ  ;+RRC~\`]|L$\1M+ir龐VA}=5 rh  5YK$s /?] (:6+CVҪΞv_o-@_orQÎ(v-{0?OkV 0k+>b>,LE2VҧT -(D}lBC4+hXASSSJBM*7Ȫ0 EuRp9@*iP0Tzkw%j8W~ ڲ^j_>xŴ64P3_~5nZ{ &xFOeJ0Ȱ "~-H)}XP=qucAT:DF]>2f#Z}4X$[q)DqTP|Cm |B0{]-F&.e_ ˜# ]Bx]#P-m{L.;eىQGwnH4Ve"m6ޱF~.A0[k e"!` ,"9? Pd,=(Vr]*^=$T-v> 0=^xq;x? ym}C=577`[Sf3AԹ5RÌIN5@kC^ZܽahQr7nu8X?9ޤ<4s|How_%T~ލ FAߙ@GG3q+A*zlzK(>_/nd"nv3Y1;*j,s.gMaS!r%(&=w}AXY\Թj$+W[w?˭2@C?ո?Dy/Z_jZ07 P_E=ZI7B-~ڻNE_?`V^+}2i_45EoGY}z@ᎥV⁤Uz' JU\M~BLX`q4aq ݆(u FR4`eXA,4m}vjW~߂B hq{t3mM㦶__x L5VOD8,9d:H%Τ>~ %PMwiP/-}rj2 %ݱRIsvIpA˭NP*>Vy¼rE2-gDX_(`"XW>j5G_\U6< ]&9Û $% X.UŐhҤII?i,)s0EԹ2̓baua`0?w?@xC#W{ä]?;a;&7䓠Q|T}\ݱe¡}fQЪM5miw_Ԥ]@meOl@WGiU"z{ΑO{_N1ڤEǏ, V޿oS?i?Z6WTŹ""k֬KK7,ZѱaMmo$/~d&,?oK9+?IaouѾ*)/@ ـ٧Zr,ƿbm!P97=Jj1Sҡٱȕ!,[q-vHi`9Hw#x_UuuT?sNG8&H2 BгeA $HzqG-#>+^/\w扶wʆYS-R]`Y7-nrC#QL/9fՊlMTFFC&`]if6^#-,jtUk.O~ztC(KvVjjl( "pbS$PD с 4ĵ=Bga``cpcG;֝֔>}8O]B-]Q7ТGCdÌJc=h]v 6В%i%";P(H55&T`cŰ{EHi9ZOp(1~A:i{lA_"T!h8TS%Lu+݃OѝBܺi &Iƚ:d6| *Ε9u=ԢgZF >L1 ;N!9^gR/ Qk,똒i,CfN`59ͧE-2ƙ-ITPNYG+x1@ӫt eV؄  ڱ2X$NWɢo>, RH-8b|>u%$YA6v-"3PHPHOjSU zJ7/ U3 =,ൎ^ZѱG~{- >{g6׿8eߝ>c٥XD,Qd@{ArʢEG #7Ɖq`Vc{&@ev9n^JI$֮Y+T,dG1 umYl@9v,sM*#/c(oV"pd)Xsd;2y_7hdb+`6Rĝ4i"ko?L-m쾶߰qqHNڣİ*5,#ꂖE/4z_/=,W{`{BܼW$ӱ|~%U'ӒJcYL4g?ٸ^_-M]E=HbQt<Ҷsv"V0DA(b}x? f<$.MD'&wR~EhkCDq<mE]_0d_h8W=LnQd3Mm~q"_^_(Jk~5Ne(֮]K~8c#<ďY}ie.g' H?'P抝!| sx\8Ғp_LU)"YPsFU1t^wPn]{ :l3Ov]Ө@X)P dz_]@7-)S/-fKA -JDaMX@a) 0Ѥu*/SZ \yEgʇb}AHu_0?/4!4 H/X@KDZ` 9`BaѸ\?1kaa$X@^'啛hEӏ7[l{=@pїjfKSqh#r"TRhl=Jk2Z@0b-\W3y  j*>(R?qm=9F[)4^炐^J-^ uO\U / Aip$ R91 -%P:;e-ն*ibo.S}!=j',Wy0.ℙmW44E=O(ӢK(:35BD}O=Ը/nPh -q%{-6'vov,g[oe5tx5kЖouM3"13Jii81qDb-`H}7J& `*G54%4iтf)G[1W;zhy/mrv㴽vZ8u]R;"]=[)=P= 8Ş{I|ΑV}@a#y*3,H*k-F=ѥann*纝L-*jދQ*@5K[IkA[q\`ʟN=5u 4w+Ԑ)бŵVǾ&>,g0^xϺ=A`K@pƽW|u.iܡ-8(۩l5lȒco/Wj\->P GeS-ǥ*:[S[ 6ml"&p&$W:0'TJJ+2`Z37(m 7 OU̍Ie 1n'\iYD݆BJ*TqJ@6nNZNx-U7ɭwɈj糮c[3zZgOIӎS ʖ4C덒s_E= 6u*3wn,$v)鮪 {zm[O} #bJF*x= ںa>VL5ޕx|eNUjlbzIij ); u<@FNL58nTM,? ɫ{9Wb[ !gZ󎓏|EZo]|W/`+J57֢Y|Z'NGE}} mm]]Qg;PVkPB Z3mm_' Eo\&#X#1+ 33c ,WBc hQ։:L; -4+QnOʀ6Q`ڗ?EZ0sM-mOfMMFQlxz |-V |$fAlzCˠm zE]*h a]]hCKz!|!V>qIP+ 2 bh\J)/Ěm؈K1 ~LLGMJ̔uv 7eqj wFЀ ܡ`cƍa,t" IջiD1' .3\ᰓ.[3ƩdzPw=sUǩ?5d 0Faf(@G~D@y஁1(_.M<[,4)eO\zXM,`+Nɗ7É!b7a҂ƷOX {p( aPH:q"\jM;ҹ)O vq% 5|M0{%3ݫ0~p|~H#䪿R@֡UD(^uO&j3 Ƣ<<44O Q.$ʬ[`nEVB+@"r580"1(&d~/ =Pl&,;cB ˨E b]q1~UR`uOZ T ((^bp>u:i+@~i+ʯ{Rgp PJ5ku;.Gã"v+99-Wu%@<س[$L@BK[y%b[JorͳL1we4'R _.[~E5xSܐI`~?[@Q4@4ʗ3nР#:ijz*+ 8vNվ.R4H/,4`sl彇yl?"TJꦿ}"*_oOh1貺^䉓 著oLmm728kޱ#6s P'ֿP%Cˮ(M-t`DtccV(Zk' h_^Z`[)88Xm/NmZ Գr Pj@k@1}`Ld%XwĢr5t~0i҅*:Ofe!hL hƍsj0RLO}=-?!;iF=O{M۽k&J)R?qm̲ı_D?qRA#Q$=[pS(A$]J9A$nz{(,.a3Z|sT}CY.na`;PTǙvUn&8vz+vM]ԀFwZ' rE򷵦i"57{D}  _w9^CP$ȿaY|~,n~OZa/ jinz>ED?,KSoʧUBMvܣey Ņ-6|-x"j V1yFJmμ7s#z;X"BX.LKdM xyy]Ͼ2=M 2㪏Ξq=vHZ U襾I>/WW:Vl*#b +-@ 9f8(LL[ ';w ䷴V Tb4,wvML͠Br{Z.9ge<^j/™ӊbz~ר_nV&d"6P V?/jD1H'6wP.eWKu0r;7ВήNhа܀@Jy=w;%7IuU9"]6qRz%׌cfQ_}}yUVcG#!#裎 BvfhrhX:VU6  @ųz,Jȭ0\\&Rn NAXPΦX3ƃe,!-d7DuΞTTIPMt"=/;fƍMvqDm 2/i3ƶC/{ЦzcI~:%a&H"n; j{`ֶE6;]wە޵q|vUVcT2+@%LALaԇe ^f^c>li,2 ,|}kalCUMbm|z2^E!AdFwg;]=Zi:Q$^\釻XMq 0n .EUՏ^˲6Υ H$wWϴEXl,l\Q8eȕO,auB1c+rQi7@⻀w6eI]d /_`KBi>VAM9Q>XEfЃ, _j_; qUT un'&8W͡OuoZYCXB!Դ֖ W4-FvcTY)+{:; RZZ)j*IR&. Ұ;e>ubXev b9ɻ,}Z4ef e⻘6&uZ;ቝ83"j'@uݔlYԾ_ bg݂F6Pmy' LYoG(b;m%eq ,-Pݍ9-ѵ,2 ҡ[j$ ^jsw#NCe7Њ̀'c[4&N{os%TpOlL@,3`e-*\ JD(eU @>EXe4 >?=ŧӄVdlT`6>n4DB8P1ᑦC}2;,o!XJ}mD㢴"&`ﬓU; MIb7N˃P{DBMدzKmݣ}yksNӣ ݐq@`>ZXmC?#/Gj6Pm67-+΁م>KU?7}wvfTʱ鑏|U ahU@&u AdRdAU3 #Pr5Q&H aw,BLz<`R,23 d@߇ *8#Hl@siJ:߶&x>Uf -)3hVB!~ryҋ dlM5U p~`I{m};uPqj j}߽4fZvaVGQ(OlmbS~:+,`Ip-]cR&gǾ㴰R@@i)ӀH322C_quNG4ߖ DY#YTCG ~z%w*!&ڭتR֖Bztђs/v7yPf|D3}󭻾9G,  +d@~`^Z+-51Hf2e*`X̒Eo[HÄ ˩X;\A G7Iۺ g`@ |:5)ם7CbbZf Q= YPfLX˄\&808!oX$"v?dGG H7 oo%y<*oawީ7&~y)i&0a<[[2)Ѵ w7o̙WXJSC,@!<" %Zr^=v:~W ryei>UFWzfǕi}X ȚgOO4jd}KQDxYlɌ@9k|;`)> [wԤj_:,+o#X[$'(XE(*O?Ա/뚷[Z H ׮Zݢ.=jJI[SM}\c^S{CϯhP1O}3R/0*G٘cR2eWPXJG VYB^ QBn \.иHzm fRh%֤6eQ:,#C]wi?X}ru$b>ŔYu"!@tw LX/]4@ss:]r헤EuQ=T*#i<;v9 O95Wo_OZ?JDT<"7XhIoM +ն-W)ʍ`}#d&׀nKpؕ G ̂ ^_fi:eB0Yχzv- VCXq'388@x)Y辴EVyPn0oUjԉŅxd]/-2bȾ'?e~040HESI*lZͶSW[^n)hic~$$L-ECB߳o;ǼB 3̵TPfމ@m T4c] `I p[ 0CP<^=CnrכÞ,-S\f 駺\\*0JȣKVГ+V|ʴ7^}=vk^b?@X?44S衷J?r ٴ߆`( i# pt Y?SzVda!pޑSk?" 2@K)ɮ{̡ܱQOcX:AD;Xvєnvz=(c!\B A5rn ߜ̪zsLK@%}>9y].L=dKO᥅f #) . mS8A%rbugS@,Cb`&- 8 LGɠ;嚽o ;:)~z. A$LAp+N {iFMj2#}(^K :W~{i (I~w֝8XHgڎC JʈnCR!h,6nHBь/1R N(j3_[o<s % P r5uwVW,/6 E7P>8m-V%GpT &!UhtO]qT)Dcv{`IT`\ӫhooHNŪ ]~Jp#eƇ61uN CtyKalA*aѴ̈́ҢVx9p_nJ Y9KٸmukS :ԥ֞tq 2 Qs:}wa*͛aPCث8HGgBB@GY*)S':dޞ^ *X jN>﫟<*7_~zP1[QDum4wS;V4Cb8:T8pG 0^I%O<q`0Kl:MsZsHPiܲ/:>+n=%#6:]u9C@1,z{zY}0fhaݤ|BH@+M&]/[q Ay`F _fu''n pHS}>6 J;)?.(*K9YI ue0x}d23 4ZqB#|wےBzn˽C1]Io+~6L Aw 2 dDf;~ ,=|yo{M`ӦM) `)>)) %p0Icd׏-[{!Dk>qmOl!55@VMC}WΡ/,4+U Zj Z =vʾp3бh@BQYzSsaSfgbH% [+'8Kca@Zd|~Hf.‚kmHlze@\ŷ  7rVz1JVG<5Dk J)GKxO xTO}K;dFz {^!H"xӟ+X:L`Uu&WNlWOmyp~wd%kmk'KoXf;=?ʌjk9)arU}(lL<g{A<yAQA@`8w^4bBc '88@H@+TX=(\y8룉A q' E8lrF)@* اh`Z&}C&5Fs &-DS!E("u&jM{qxC 4Wߥ'}kEePَEur)?*zy|vBeP/qyx;$fY<*8 JOFcYuuyX+]ҽ MsFٜ;(hDB\xh /@E8;V9fHyA6A@>aGrB4q&SFd*bψf J[#,H;-Ièب0 w1 Rxzs&: Xe`fc=Ǹ~X ww>`tOPbϥ0b1u#WV 5 $$t]{ 30"=?3hqΰʛ+mj`OB_.¦M%)67yZZ!\C,5qdi{(Rz!t6Bv[ ɧR NV~(~%y#=35belǜ6(+uN:pܘ /+M fx p:F84@55;왁1vA?fX̝,0җbʭ>]f!Dw߹qcaś+mI/ 䅬2#KG芃2GXRX 3 _^u~;BТYh`!*,̐b28STf.n}f> Fu"k@2.)ajȌc(Tj2dgg'<۸|+U6&$/$P7`=-㮿>Z%7x bBx12P0y3s܉`GKvJM:+avh=R5|SM.Ŗ藆~<.86`0'(`Zt<ҵ +O˪UA宯׊p.d埍JT]9:fE0M@?5E.H@D dFwcܹAG{#qR.@,ie+06ų&Z@Y(H1 2 >eLcK(<XT1wK"vw&ysУ okTRZ{(7eס/ڮ䃥DsGFի ʓvGt˗@݈D@Dܹ|QG5gr @yX  z`P:CmmĖG+E\˅ќww?bd=g켱|ݚ-KQHܠ&/FU~~<˽LJWyxXbQI&vJeYyc0*džEo㯿n&>qםudk 3p3' {rkq(>_槱&lXK--O}Kq(uzQJ4|t*׊ .zp$Fan`@yR5^S;$fi`?eUÕ\i "3`c0_,:(?8#g%QzCx㟠#UוB!N<H I#%\`mmaP i(3Y-\[̚1؊%@m!-}˥=gnݘky]3(W3XAy,SDVX{w˕B@k@'66% ^$ig ( 4>,\d{on%cƋna_y,XiUXVsMw]A>FLEtuAI=lYBNURh2x;3@Ϋ ?> z?i 55U\VS(z \H%jC)6I% uIP#UU@A'O?%DyNG@5-ɿ(@O=qWhË HGFg@jkk𠂱~0m )m٬ I $uʚ,#1 ,l)@_g*c2{ *DT"|B;郄5w33d]'23F  : Ø*kNca ; k7-etuhg|!K܆̀O>D y $F-Q۲1- :  pcxK?SD8@5<섳 O)aQ{L]CiZlLeic!og!Vv6#x0 :d,XU()Rfazź^zd'(ni~8m%ԭ&+aGg~p!^#q ,D%Zq9JH62zg+ pZ2tTɃ2u`u- Za==ݾg(C7kS&//{3Á{h3/K}hM,QI0x˨mCC‘Bk`+ξQu|D'(Ǭ ЗD4+0ϵov2ub)5=KMUf(gdFb=k(;o`j zWM}j !A֬g:ڿs-Fյw_ٶ绽>\ 2YlN$iOmw JR &N[ j(&JDEalqzhvRE5#TQ Ɏ=:28%'،DY%|rM;@y@0.ʀ>hvMC<#;!H9 vwgLˮ;=ݶGU$R*fJ^ZK~bF (D'QN d -A0I'R)񤠽4y4qJ&_-T.]x¨ZƱڳ |8eZ_'x @<*,R,HUҗ6yCٶ;fX]U0āzs4ficMfpO֯T(3+pe0A.?ӸIAU&"<.λe!ӂOyמ^;}LF."_W*mM4sh ;J2ΈFqug( j/ֆ,ǎM1ʓRxrAzT= Ӳ˘2:q]>`K h\MM9yv*=)va@Fj \/||@]p=wx=7mwH-;xR0u" weʶ^Wr=`tZ5甽ҸO,ObG#~ &u]1 68ځb4ѸZ`a*^4G.^v⍿[Q@cfpMmSR1&;fZ?Ђ_\Nr ʂT9u,,HTdz-9P݂$]׿^#sp0o߆+JTL+S6XV]d .t%0 xo@MkooGr֒Ԝ{|YrM$W]6c T%N9;{6+<6KϴGǥ* ;5pկe\<{@.F ig[G),0T9TΨPtU(|gƭ0iha4Õ²d \1 )yDe ~T^\Ä`!@qɤg?ۑ#f,1 zzzAmk Pe@B3֧^UvD~W{B?Jܷ{wI AeU@pwTqqQqWdQQAeْBvֽ9U@]^ߥnU:ΩSUQҒ*@gQCKA)T<^x 85qU݋ {v -֮(ophY5ZuдLy`_TEk@@e3DK!;fAmGAj8 y@e@@}?g;9hɲ' 4s+]m:ljDyt9$X^j(NXuKw2c R(I8HPRpm:0fIywytGݨ<1xp;:`mG&+** *7Q^J'qbL,E /F΄Ŗ0} xvh4طB~'s9^nB!GvrƌBDY H̓ Kc#39 VTi~6g&: (OȎPSێg=;aEKFߞHwz?iuh2YF1?"q$8juj zf{% P{X3ocQB 7cóyk j0/o<4YcjVZ\eeeBTr8Am@F/!q bH L&z:Y vH -) /f+ hG/z7Й#َ`a͢mWCƢAݐ2FVH"Nc @SQ 3M+p)!d ~Z@m4#z?'KSǢn.Ld:~_s|靐RhR {~Ǧ,;ty%)Q<3V]}%4oXm-юXqs3/*.L`k\"[Po>.Dh7ic0p6IDWp$7eAS%0 ]*X0uK6Q셴{6Z〬_'xY ߣ-Xk 0ťǎR?XcSɵܵy; Na(G7͚'~bƱ46G!_73p؏̀_`;ĨӢFF#0aBPPD;?,v(4*lnp/;Q5r?چLhVtY`l^e[k< *FzW}V}>h=o3(1` h(o56+ܴ^?=7/{I\".mn|/ =9$S5 /=Գ2dF/0>N`o=7uT[!4.-+϶)$O JZYE;H&$kL"⟈Z!J5\D+0y|mT%5nO_X3g ƆDf00p1 M[ۄ#H-,IV{@x?,@=C}{=Vo5wRKqS͂%o+zzJe>cz,`psښ8 uw^TuGۇyvV`QlB!S2J!{Y$১sfA&68t}v\(b!L I:pyY&yQeoJ Hp¯ zdQ,9A<l0:C74{aE{s5j[D(gR]&څt#Q XX 8(~/(НU5d<5i>R: 1Zudqge;ƖP͌t|zu7;p@7/rFD:$M$a1]J/{j90-LӒSO^o$fڏq ٺ-Ͽ@?yJB5t?Ku5 _Z>e*,+yYg(i ]|cPv >@II)V#{3b5# |Ivh6M  ACSeLR/nP}XNs" YUqHx/;fO--m=1~xJ8/9@a?A2on?zW|1$b鿾~ŧsԒS|H!@:w? Ú6 Ϊ&Èd/RՂie'oVn1&yAv(/>Q$ӞXg:zuc:bdBN df^|1[uTp EEbş\~'K `,Vڟ)`ߏbFxbdžb1Sr2O%Ȉs S'wݾ/`~ + "Zg Rk , cM qdv:%Wn;5;#8Gj@b33x?M tTsG3. 4dA>Gk}/Ì"r̬qo 5<jfv:`_>&lxxbm@;Dm5'р O=˓,Қ ?;63p!Aеo<}g5lV‚B(**2ˎM&h!l6(8N9#iUq#9!vn3}yGӍOq5;1~8ny -t֥uzdZ1 ^xw$Ywʇ%N*o$W5n?#qs"f3/YtGVN?x43eq |Yq!.9~~JNbD[;P,"o%v!}%`z?4d <4>Egj8Z~0euD)Sd?a0rh-EI_?2DzoY~qy= G]wLIܣ~c%o:/zV?m X@W63~؋/rFDѨo D]BrV!bJVm &@jvLy,a)ˆ ti@9h)qX,fpoy9*ƽ0mKǘ`vECeP 2_>yFܼVm1p8̀i^?N]|1L^B+xӄ}_@?`Sne7jHA:V+)^h\u?Qv)-\ȉ Z5ҞT1IA@f0A h!،m2{ Ap@cpCЎG%bj >=> $yvO_GECqhdȵ#/i1CjbO3d];c!~${O~xj\WU 9 Xy_]^3yI> (/&o0PӖA7E 9c-KcgI' Y ^!04˟98aQՆ|ARy6=ryj *tҋ Kv,u#,^L4a^ha" ms >$4oaÝV#6O O2a96UuxQ e3ڔߝ8h0 ´ ;ޭtLY |b/zjbZꎵfGkbfJ̖[(Fo?4/ l!g$ _~ai'vk޸M8&c8[͜_9~zKh, h0-\iigo.3ԝ8YBJŦbdS\Su~ ` {ٙ+ ),/I P;2گEynD;0t$C&tj2y`cM"r:1QZA8r/7„D.H{|e&+xڟt!yYI~R甾=1uѩ3U|6H~6 6 HuQu scDˇf s6Ւ|?@)]nA3 *hxn1;O՞ )Vs4O?J`7ryoBh2'q 5-iO 3C:7>e ?v{壿8u}N/ J/$ @|k%_N/Ҍ̆GoFĂ!2t;אNޕgfiE}+Waa! !×~pj*<*+Utp0Ǡ)[g{N=Pen b67 Z"V~}2ڎG#D%:;>13Oh\> -Ld<HǓ^ЏCOq+_f˕RS ԚŠ ȨrrG9S0LXq`Z|jX{EQbq曋P1S¥Lbߢ!*Lc"i4hm(`T5`ca3܀][8Ԯ@CPX䠍 hf9F۵ax$s$.Nޟ>ݥ%x-3a#7v?wn8mg^ie^5y![惵/NKIBX   {_| w:&Lk5r2&8/P@}N`oj 3zi>b9 ܡw!P_@ͰIN!ejN5Z3 7TF  WwwGb!yep\rG ~j?`'l̿_޳F`Uz6>kZxts3ʃ * <6eS*k:9@,mbk7L)ᛡaãek#eELN3|Pck-¼8OnBk0Y6Fqݱ & 污"T5X.' ̀ [1ۄ|W[ZY;…?@V;I/F/qF 4uv~tFSw[7A S~瞧sUsA4#~YG`vX/Ao[qB :Y*, "3. Eys$,K#P}r*qD <,]z3"Z; PT #ZQQc-g/̓wb$0Afcc|S@0MOƇ] :F!ͽсbY /Y D[{HrQ+E֌C42n`5Q1Hq0qztt{3Ypz> 楦{_SZNsun[]⻾۞Cq/8Xy}їqݤ6q ֡A L#|[5Zs?uu'u/V1KKJ 'A@֕ Ӹ,X[E_)Coȇy=@ImGoiP@_.wq0Է@__/}*6шҾʼn̉C~`ǟ9/{9㮑 /k6?~],%&dt`3.:<<7e2c^aAȢ$uaCWApJM`a(l'PVZ  D duYiH 2eG.pdatt"vցA/eD-e,m?bhܦK6 䛛àW˟eō@?cpQ K?Jy5ȍEcvxdNJ;>t ٞҧVF(?f-B%p]؇<#?@g vCo'~[e);mJ1++-u !΃ֽnm DC˅ hVrET{ 4emvCv6pԦCˎڐGQ9\#ɘc"MNwi_;M߽hAK$ľddB[>s͟g,S1e6ux 0 y']7`> 聾_uF)q{YzfµOGXҰO;F47ȇuXoQLm'ۀd!dh4?.3IZz]LoOou;u7^>pv*Kq_x>Ɗ=/_@ZKwuzsK\M~{'*b. Sύ&Es00p6\@Ú1"HszF%Jm 3xhm=>8Z&%9k&p{ ^Я(?_njX^"LA{[fBJI$}&zsf1' ,8jUD3>ϣkz\O<[]π~iSpҡy >wY'%`|D|@b)ضw3y.U uNCٳ=b뱒H&ARՕհeBl@╾tzR!<ae ʄllC^2#'x@#AAl){巁%]ǘb DtDHǨ'??DXA|?װ^h|ۿk_J_֌\PH <]ךYV$P \! Aa֯e XSJTC@ f0|"MD4[л^+pDX9paTa߱ %*cfZQs?A󻺺~O:;f 3N..<%&T? e`}ooi+7e-r;(~<Jq+N7O<'L~i HnuO\?Do_j j"-E=6H$}AZS=;lmb3Rh>7!]zSPu΂@hDL"|Zq9aJO{{ Xcmqq>"Wg$yNp~X9F~IXv?81 nyb}[Ř?z!MPAO]Ť >Q3s&51ʰŽKNA 9@'%l5_ԑBMvf 2pQиؐXM#!.x1ar`H>m#8~r1hvzz,ߑ3P{/q${N0T3zu, y}ֺO.*}췇6vdzy,\P5e֐A2r@}AKrRi#vŒbZq7$@h'ZK^a-H g+ 4W670Tl 9LHxBE<Ǧ1BZжt^ ?CIEôQ~>>%Y.k 7ٿ~6g A 7`7uieֶsrh3\4$5mqA]O,Q,tfAaa1SIj2^(@ʖ9 mC9 Q@J8FUӦB__;4S#S}lc;>pT&G~tDɝXkց́0aFÏ=X9o,Y6)4c2Gҷx'iEӞP |<\VˊX~xyxf+ csW $ 0o߫:C$Ӌ 9Yo h& 랹_"%5`|xkjRa. BˉH3BHSDq#<'G!PE't_ogL4$f@\M0"RnocNy-73pl$jxm<)>$V4NR~Oh({yO]ٰ+ ?sH?A>qS+7iyb ` 8 )S@Đal\Shi|^ٲ c=c0 2He^gݾ:)f'k`>HKNS՘>,6ZM^ ;d*:(CM U>t䭐fq}aK F!?Z)] q}/šƍ|޺[ib?hS}I$9K4yc!𔦀'rXÎM2boܚDy`\fA:D2 lǰ~$888'KCWBkT9=ℓc@ @ooX~& jbm,e=`^FHDKXK,>Lmoyz?LW2IUbs0wcTCP$= k*ymAz8G !̜Yj| )^_ {^D^h|/zOlp 2&<_1\p$:Ζ J·cS!{OcOy#omo?y L{-O C'~c}vRLh& ;`\@CwglXut׫c;^(toVKm1N&S'oeN0*,s״T-h;G5* К_$1C=w sbm 3RV^zLOKJ.Oȅ/5/)?_Mc9<~uaU _YWs.Y5ej/qa*${^ kw /$@M=MkHm~V_ uG' yC f|K=43.&" ǖ_|:4 f3ldq`>ypԕ/̜gpaڟ~ `[g4͟9ٷ7? v?C~jHrT 'Թ ';hXr9G  xs_@/~`[cvNjш\, mqOѽQnDbCӄ 1 [cEM`eR^ OrSha!CBcaDGFoD֒ lWL*T/:'΅i5׃W~KPWd_gK&/>=qʼYKE萪n@܁aI0"^sho^@m@4o[EZ>jC!jSWEQD u$y* mhh|ki_{qxSݏ]OQBWAҕ= PiĔȿ[·h]M*/?''`&kuy m0bcXo$X#Hmx ^r ]D;*RZT[2k%'N,P* QE=/˨jÂB(B 64iA (=yvY%gü|O /4o맽@=o ?1YoKXߴ \ok{.Oȫ`V`=fƂY3 ǚ1nX598XI0۷{yW«TR]K(6lwBo!3TZAP2يռ6PWpk8n6s3sᬲs(Z zO|cg,X{48B}GCixa>_{hU~< ˁNӎ=꣗M8jRG(x hgx y~MuSXE-0>-PF+DjV(1}2O5/f,Y@'Yv[l_| c {Y D%]8:y{ν?S~qwلwЎj [aEêv<[Vݾ|WgMABbKfcO4,24066'. x&% @P]uw>wڦE͚{;B# "Bh{}4\glF=@BAVocHN+=N(:ћ;|/',}20u@}&[ZʺU̇oXq*W<'W:;9?,=zɭ5Ӗ'_mղ0z؏x!; }  "vM.ؽ~ q r!ͫ*iZs8ϥAl<pUsBeУ]'\ h)\r*D3`=[?;2*# 6Ͽm׊nu[W?s㳐[_'asIg粚o$S^ErJ/+⁶@@0J|p`ǽcK8/C`5'P>A2!ÑX,ῄ>+fYV.#j= \vx=a"RD$\`T 8G>![Z]ڿ繞\/_u 7Hb`2ز3?fڒ] (9H'gcao   ?pca:7Þ=@㾧ݿ5?󗡅q8^X j̜Ӯ嘤8 Fa8a..:0!G0h!,+>J~Ğ^ ? yyX-Ju&mn+Wu<{r5=xo>pY.@}b'L?N(4YrZo(M^_>J ~b߀0pBǥ7> L8[b#r,hz>(4%V7VW1~X!PԵBash},О?/c 覀|H?8&}Fxv?󑟮mW}/,  O~'.^-Fh^C#~\ 0,11lX]ݻH %;jkLL`cs\0PgЅy c)'%k`~W9Nz~*~9GAD (1565<jo&f~)'̘s^'\s8y\-}3d6&_  @UPȠ F@`ή]а ״Fcvh 5ͯᕤ s< 9s} -4W4/IO/ /=|?&Sgv>߸][*fqo0M9AzNђ?q LRe(d!'k7䷜.|(`o ޵xSj׼Z7 tquIZY9 |(jo6@ۻw\}LlU4f4_ty3z/'| 190 ˯}=^5FY}+Vº}qʛ>@O0cTQMI [5id *b",@ ,o4$ H?䱀`cA

Ⱦ_&ybrKm/ul/K7/\}8Ro8oX3I5 *]6mG2_@2T#3oʱd |PL\AtmVe®m4"QWƱfo5`gVj:3ԤB&VtPIċ+[_ #yh)f(`/6MbϾmkUO_Bε'm$#g=3s. R-ύAo| Q.7@Pdž!a$ps>Bgo wW}^(.{t`!ZuePjjd!7' 4}4c1Eh _\Kw_ ֯?諄ao:@db%eSo8s_4睕UCaaOmB`c@s쵠!C fI0P| ?4 =w@@; u {bH_PaJxeu]+TLSiw&V E2(BIr%ͩ:J=kx9~~DsA%i~܏pG4t5 ~ߺ~UWj%!k#NqIW 1q,r_/W,(xWbe(Ͽs٣`@`&@0 }YDPfHpV=Cg#N6HQdcM,G\~1$֗P׮Do1~]\/( [Hᗂw="_ϑp#ͻxgr 'M\dz[*PHG XmBf` ` !8 %+y pފ}o1 Dc- Z:lz=G }…<0Pw+~Ú/Ʀ kog=;@;c{~d eSOE%?VS$Z^>7%b]h `C AaffNV f`Ғ;XF׶~TkzφSۏm{ cU]L[1sOikB.=xs Ⱥ5l~%']xRVVΙ:q|H$tKkZQ~n B~CaY:@LcGp|knDO#y:EJQNXӸƵ\oXqJ;fk%a g$(-Y?>YX\Eъ Ǻ"F| '"  p\pvՋq=j;5yhzm2cGPw08G x> ,|bxos&XհjᖛVxݎ=@)?G/,@ A(As.\kk~9*@&=X2k0ҡ\!l2hJ%ؤ|D@4jR ߒ A׆ x$GXMAMnXokoæ/b._3/0؀w<.~'L XJI?2  _?@>?qB]d~o ,1(X4s͸cI@]~w_~t[1Z5Cyz-[Rs&ుcU5}+,EٞY( c@z,’K@/K辡!ֲnd_?mۃ?zdX˿_Z::j%=UW ++Ϲ (aPNd4ƢYʣ@&`Bul#61i謇M\غzs?vE9YzIqF "X)YQ>k(o  f>/„eh"ԑVPC/{/l ~ݻv]uS?ecG_ N*U_~|Bq5UUAaқe[e` i-]0)p0XLю<΂vV'׳"-{\X} j%X_wZz~⚏UϜX9eގMX6 utc)>w0`@B>ZҁA&W$8'Y6ȳ {˖} 7޺; t kßOz{YـwMirqQJMp,LtAh0Ca11`6Hb]om;vj/]m;)X}^w/d}SaC  bTtO]VreEUN 3 KQ=ǤGP  s@X5lbTg/!CdB}e+l"4vyޥ޲'B-˿|@'npOU]ISYqlb&d g+ؔiH") F0scH Ti:IAa-yPGoC[6o]Hc44q30 1Ψ>K 2.).RY>KA"`Lڴ<Р FA & ?3zK>."op5Y'w<{Zk5ݷq'"NigTeS!Ki$i$80#>5d ʶA/ECKt^n9qP݁^ӲӵCCG]wgU<| 054Y0]V:55KN/)~K2Q ӡepArвd>!5~Z ;6m1bCl`0(D,׆s'eG9| < q8 pe B.Mw>Bot +Kև0ori0asqMK{_4O/7H\*c؞9^4oi\Q}`4@Q~OA#+ل9ױ|- c0OIhM083umqIENDB`(      !##$%%&&&&%%$##!   !#%14f3A\y=M{BTEZG]ȐIaؓJcJfKhKiKkKlJlJmIl؍GlȉEjBfy=`{f3R\4*5%#!   # *d2;W~@KFTJ[NaVl]vdjquy|~~{zupkd^VNJxFs~@jd2UW *#   #? #:z=EGPKWUcarnxxnbUKGyz=k? 8:#  "/2z=B~GNȜNV^jn}{{o^NG~z=m/*2" #e25VEHNS^fpz}}o^NE~e2]V#&s:;lILάV[jo{{iVIs:ll& $s::lKLڵ[\or~~o[Ks:nm$ "j65\KKԶ[[op~~p[Kj5g\"  J'%=HHYYmm}}}mYHJ%I=   %CAQOhe}~|{zzyxxxxxxyzz{|~|eOA  % R,)AOKͿe_{t}{ywtqomkjihhhhijkmoqtwy{}t_KR)RA  !|D>uVPph}~|zvrnkh~f~ecbba``````abbcefhknrvz|~}hP}?}u!  )OGh^}s}zvq}lyhweuctat]qSdJXnBO[=EL7>B49704401////00624:36E8?QE@25*))***++++,+-,,---.-....../0//000000110112322333333444565756L=HmGbR~]bdhmsx||bLN(O=e;3O]Pvg~|~wzqukpfkbiZc}GML58*))((())())****++++,+,,,---.--...///00/000000100111222323333445555666766777888999;9:YBTPy\bfkqw|~gPb3eOvG<=dG`Vbejqx}~kQr>>RDPS`eksz~oSw?}kRArgTp|{vqnhfbaHH7--&&&&&''''((((((((()))))****+**+++,,,,-,-.....///0//000000111211222323444444555666767777888999999999:;;;;;<<<<=====>>>>?????A@AOEOTafnv|pTy@qQ@kjTr~zxrnifcQO>//%%%&&&'&''''(((((((()()))))****+*,++,,,,-,.--../...0000000001012123223324444545556667778779899899999:9::;;;;<<<===>>=>>>???@?@A@@AAABBBBBBWGVXcirz~rTu@k {P=ckTr}wwnmfa[Y:9%%%%%%&&&'&&'''''(((((((()(*)****+**,,+,,--,----...//.00/0000001011122222324444455566657778888889999999:9:::;;;<;<======>>>?>?@@?@AABABBBBBBBCCCCDCDEDoNn_fox}rTp={c  hE4JnTߒp|uwlmdQM/)(%$%%%%&&&'&''''('((((((())(******++++,+,,,,-----...110665:;;?>?BBBEEEGGHIIIKJJJJJJJJJJJIJIHIHEEECBC???<<<:::;;;<;<<==>==>>>???@@?A@@BAABBBBBBCBCCCDDDEEEEFFFOHNYdlu|pT_4iL Q7)9nS֏k|swik``>;%%$%$%&%%&%&''''''((((((((())(*))****+++,+,,,...544;;;AABGFFGGFHHHHHHIIIIJIJJJJJKLKKLLLMMMNNMNNOOOOPPPPQPRQQRRRONOJJJCCC>?>>>>???@@?@@AAAABBBBBBBBCCCDDDDEEEEFFGGFGHHHHI~S~bis|kSI)Q9 %nQΌh{rxhfZA2.$$$$$%&&%&&%&'''''(((((((((((())****+*++,,333<< xRҙi|tІh\L%#$$$$$$%&%&&&&&''('((('((((((()(-,,;;;BCBCCCDCDDDDEEDEEEFFFFFGGGGGGHHHHIHHIJIJJJKJKKLKLLLMMMNMNNNNOOOPPOQQPQQQRRRSSRTSTTTUVVVVVVWWVXXXYXXZYZ[Z[[[[]\\]]]^^]__^_`_aaa[Z[KKKIIIJJJKKKKKKLKLMLLNMMNNNOOOOPOQQQ[hs|߀݀܀؀iR   mHŔc~}uҋihR(&%$$$$$%%%%&&&'&''''(((((((((())112AAACBCCCCCDCDDEDEDEEFEFFFFGGGGGGHHHHIHIIJJJJJKKKKKKLLLLMMMNNONNOOOPOPQPPRQQRRRSRRTTSTUTVUVVVVWVWXXWYXXZZZZZZ[[[\]\]]]^^^_^___`aa`baabbcbbbTSSKKKKKKKKLLLLMMMNNNNOOOPPQQQRQRTRS]iu}߀݀ۀـ؀ր~cvHYD-8Uv~wגloU*'&$$$%$$%%%&&&&'''(''('((()((**)778BBBCCCCCCDDDEDDEDDEEEFFFGGGFGGGHGHHHIIIJIJJJJKJKKKKLLMMMMNMMNNNOOOPPPQPQQQQRRRSSSTTTUUUUUUVVVVWWWXXYXXYYZZZZ\\\\\\]]]^^^^__``_`aabbbcbbddcdddefe\\\LLMMLLMMMNNNOOOPPPQPQQRQRRRSSSVTW`kw~ހ܀ۀـ׀ՀрuUJ.\8}PРh€zܙn{[1+)$$$%$%%%%&&&&'''''(((((((((+++<<?BBBCBBCCCDCCDDDDDEFEEFFFGFFFGGGHGHIHIIIJIIJJJJKKKKLLLLMLLNNMNNNOOOPPPPQQQRRRRRSSSSTTTUUUVUVVVWWWWXXYYYYZZZ[Z[[[\\\]]]^^^____``a``bbbccccccdedeeefffggghhgiiifffSSSPPPQQQRRQRSRSRSSSTTTTTTUUUUeXier|׀րԀҀЀπ̀ˀ|^b@~V TۮnȀƀŀĀ€~vҘi`J;$$$$%$&&&&&&&&'(''(((((()((---@??BBBCBCCCCCDCDDDEEDEEEFFEFGFGGGHHHHHHIIHIJJJJJKKKKKKLLLMMMNNNNONOOOPPOQQPRRQRRRSRSSTTTTTVVVVVVWWWXXXYYXZZY[ZZ[[[]\\]]]^^^__^```aa`aabbbbcccdddeeefffgggghgiiiiiijkkihiUUUQQQRRRSSSTTTTTTUTTVUUVVVWWWv[iv~Ӏрπ΀̀ˀmT pFhÞa}ʀɀȀǀŀÀ€zۢnmN$$$$$%%%&%&%&''(('((((((()(+,,?>?BBBCCCCCCCDDDDEEDDEEFFFEGGFGFGHHHHHHIHIIIIJJJKKKKKLLLLMLMMMNNONOOOPPPPPQQQQRRRSRSSTSUUTVVUVVVWWWXXXYYYYZZZ[Z\[\\\\]]]^^^___```aaaabbbcbcccdddefegffgggghhihhijjjkklllllmkjjVVVSSSTTTTTTTUUUUUVVVWWWXXXYXX`nz΀̀ˀʀȀƀÀ~ahFh UqЀ̀̀ʀɀȀƀĀ}s`/,(%%%%%&&&&&'&('''('((((((+*+?>?BBBBCCCCCCDDDDDEEDEEEFEFFGFGGFGHGHHIHIIJJJJJJKKKKKKLLLMMMNMMNNNOOOPOOQQQQRRRRRSSSTSSTUTUUVVVVWWWXWXYYXZYYZZ[[[\\\\]]]^^^^_^```aa`aaabbbcccddeeeefffggghhgiihjijjkjllklllmmnnnnkklVVUTTTUUTUUUWVVWVWXWXXYXZZZ_Zbes}̀ʀȀǀŀĀ€q|U sEd¡b~рπ΀̀̀ʀɀx֤kZJ9%%%%%%&&&'&'''((((((((((***===BBBCBBCCCCDCDDDDEEFEEFFFFGFGGGGHGIHHIIIIIIKJJKJJKLLLLLMMMNNMNONOOOOPPPPQQQRRRRSSSTTSTTTUUUVVVWWWXXXYYYYYYZ[[[[[]\\]]]^]^___``_aa`bbacccccddddeeefffggghhhhiijijkkkkllmlmmnmnnoooopqpkkkUVUUUUWVVWWWWWWYXYZYY[ZZ[[[s^kxǀŀĀ€~bdEdUpԀҀрπ΀̀ˀ|q}S$$%%&%&&&&&''''((((((((()()888BBBCBCCCCCCDDDDEEEFEEEFFGFFGGGGHHHHHHIIIIIJJJJKJKLLLLLMMMNNNNONOOOPOOQQQQRQRRRSSSSTTUUTVUUVVVWWWXXXXYYYYYZ[[\\[\\\]]]^^^___`__`a`bbbbbccdceeeeeefffggghhhhihijjjkkkklmlmmnnnonpooqqqqqqrrrhggWVVWWWXXWYXXYZZZZZ[[[[\[\\\cq|ĀÀpyU ~l?N_~؀րԀӀҀрπxѧi@9/%%%&&&&'''('''((((((((()221BBBCBCCCCDCDDDDDDDFFEFEFFFFGGGGGGHHIIIIIJJJJJJJKKLLMLLLMMMNMNNNOOOPOOQPPRQQRSRSSSTTSUTTUVUVVVWWWXXXYYYZZZZZZ[[[]\\]]]^^^_^_`````aaaabccdccdedeeefffggghhhiiijjjjkjlkkmmmmmmonnopopqpqqqrrrssstttabbXXXYYYYZZZZZ[[[\\\\\\\]\g^njx}_X?~N Rٺmۀ؀׀րՀӀҀ|qpK%%%&&&'&&(''(('(((((())),,,AAACCCCCCCCDDDDDEDEEEFEFFFFGGGGHGHHHHIIIIJJJJJJKLKLLMLMMLNMMNOOOOOPPPQQQQQQRRRSSSTTTTUTUUVWWVWWWXXXYXYZZYZZZ[[[\\\]]]^^^^___`_aaaaabbccdccdddeeeffffgggghiiijjjkkkkkkmllnmnnnoooopqqrqqrrrssssttuuutss]]]YYZZZZ[[[\[\\\\\]]]]]^^^cq|mqRG?$%Y|܀܀ۀــ׀րxЫi83,&&&'&&'''(((((((((())*));;;CCCCCCDDCDDDDEEEEEEFFFFGFGGHHGHHHIIHJJIJJJKKJLLKLLLMMMMMMONNOOOPOOPPQQQQRRRSSSTTTUTUUUUVVVWWWXXWYXXYZYZ[[[[[\\\]]]^^^_^__```aababbbbcdcdddeeefffggghghiiijjjkkjlkkmmmmmnnonooppppqqqrrrssstttuuuvuvwwwoooZZ[[[[\\\\\\]]]^^]^^^___e`kkx{xY0$G% Lw˳eހ݀܀ۀڀـ}svM&&&'&&'(''(((((((()())**222CCCCCDCCDDDDEDEEEEEFFFFFFGFHHHHHHIHIIIIJJJKKKKKKLLLLMMMMMNONOOOPPOPQQRRRRRRSSSSTTTUUVUUVWWWWWXXXYYXYZYZZZ[\[\\\]]]^]^___`_````baabbccccdddeeefffggghhhhiijijkkkllklmlnmnnnopoppppqqqrrrssstttuuuvvvvvvxxxyyxefe\\\\\\\\]]]]^^^_____`aaads}feLw Vq߀ހހ܀zظl=9/''''''(('(((((())))))+++?@@CCCCCCDDDDEEEEEFEFFGGGGGHHGHIHIHIJIIJJJKKKKKLLLLMMMMNNNNNOOOPPPQQPQQQRRRSSSTSTUUTVVVVVVWWWXXWXYYYYYZZZ[[[\]]]]]^^^___`__``ababbbccdcdddeeefffggggghiihjiijjkllklmmmmmonnpooppqqqqrrrssstttutuvvuvvwxwwyyyzyyvwv]]]]]\]^^^^^^___`_`a`abbhbpmzroV_V0-Z}߀~vT'&''''(('(((((())))))***555CCCDDDDDDEEEEEEFFFFFFFGGHGGHHHHIIJIJKJJKKKKKLLLLMMMMNNNNNOOOPOPPPQQQQRRRSSSSTTTUTUUVVVVWWWWWXYYYZZYZ[Z[[[\\\]]]^^^___``_aaaabbcbccdceddfeefffggghhhhihiijkjklklmmmmmmnnoopoppqqqqrrrssstttuuuuvuwwwxwwxyyyzyzz{{{{kkk_^^____``a`aaaaabbcccddcgv~}tZ=0_- Nu̺f|qXQ9'''''((((()()()*))***+,+AAADCCDDDEDEEEEFEEFGGGFGHGGHHHIIHJIJJJJKJKKKLLLLMLMMNNONNOOOPOPPQPQRQRRRRRRTTSTUUVUVVVVWWWWWXXXYYZYZZZ[[[\]\]]]^^^_^^```aaaaaacbbccdeddeeefffggghhhhiijjjkjkllllmlmnmnoooooqppqqqrrrssstttuuuvvvwvvxwxxxyzyyz{z|{{|||{z{``````aa`abbbbbcccddddddpeq|gbNw UpzƱe)*(('(((()((())))*****++655DCCDDDDEDEEEFFEFFFGGGGGGHHHIHIIIIKJJKKKKLLLLMMMMNMNNNNOOOPPPQQQQQRRSRSRRTSTUUUVUVVVVWWWXXXXYYZYZZZZ[[\\\\]]]^^^___````aabaabccdccdeeeeeffffgghhhhiijjjjjklkllmmmmnnnoopopppqqqrrsssssttuutuuvvwvxwwyxxyyyz{z{{{|||}}}}~}nnma`aabacbbcccddceddeeeffhlzpjU'$Y{v|M'((((((((((()*)***++++++@@ADDDDDDFEFFEFFFFGFGHGGIHHIHIIIJJJJJJKLKLLMLMLMMNMNNOOOOPPPQQPQRQRRSSRSTTTTTTUVVVWVWWWWXWXYXZYYZZZ[[\\\\]]]]^^__^___aaaaabbcbcccedeeeefffggghhhihijjijjjlklmmmmmnonoopppqqqrqrrrssstttutuvuvwwvxwwxyyzyyzz{{{{|||}}}~~~{||bccdccdddeeeeeefefghhhhh{hv{mY-ELöb}rOK7((((())()))****++*+,+222DDDEEEFEEFFEGFFGGGGHGHHHIHIJIIJJJKKKKKKLLLMMMMNMNNNOOOOOPQQQRQRRRRSSSSTTUTTVUVVVWWWWXXXYYXZZYZZ[[\[]]\]]]^^^___````aaabacbcdcdeddeeefffggghhhihijjjkjjlklmlmnmnoonoooqppqqrrrrssstttuuuuvvvvwwwxyyxyyyzz{{{{|||}}}}~~~~~lllddeeedeeegfgggghhhiiiphr}wbSEL Pi{Ͽi**)((()((*)****++*,,+,,,<<>>HHHHIIJIIJJJKKKLLKLLLMMMNNMONNOOOPPPPQQRQQRRRSSSTTTUUUVUUVVVWWWWXXXYYZYZZZZ[\[\\\]]]^]^___``_``aabacbbcccdddeeeffffggghhihhjjijjkkklmllnnnonnoooqpqqqqrrrsssstttuuvvvwwvxxwyxyzzz{zz{{{|||}}}~~~~qqqqqrsrrssssttsssuuuury|u^Y ZyxPP9,,----/..///00/000000BBBIIIIJIJJJKKKKLLLMLMLMMNNNONOOOOPPQQPRRQSRRSSSTTTTTTUUUVVVWWWXWXYYYZYZZZZ[[\\\\]]]^^^____``a`aabbbbcccdeddeeegffggghghhiiijikkklllmlmmmnnonoppppprqqrrrssstttuuuuvvwwvxxwxxyyyy{zz{{{||||}|}~~~~ssrrrsssrttttttuuuvvvtsx~x^Z \{xEE6.--..././/00000000011EEEIIIJJKJKKKKKLLMMLMMNNOONOOOPPPPPQQQRRSSSSRTTSUTTUVVVVVWWWXXWYXXZZYZ[[[\[\\\]]]^]^__^````aabbacbbcdddddeeefffggghhhiiijjjjkkllklllmmmoonooopqqqqqrrrssstttuttuvvwvwxxwxyxzyzzzz{{{|||}}}~~~~ssststutuuvuvvvvvvwwvvu}x~|_\ \}x891.../////0000000011111GGFJJJJJKLKLLLLMMLMNNNNNOOOPOPPQPQQQRRRSSSSTSTUUUUUWVVWWWWWXYXYZYY[[[[[[\\\]]]]^]___`__a``ababbccccdddeeefffggghhhiiijjjkkjkklmmlmnmnooopoppqqqqrrrssssttuuuvvuwwwxxxyxxyyzzzz{|{|||}}}~}~uuuuuuuuvvvvwwwxwxxxxxx{x~^\ ]x761../000000000100121222HHHKJKKKKMLLMMMMMMNNOOOOPPPPPQQQRRRRSSSSSTTUTVVUVVVWWWXXXYXXYZZZZ[[[[\\\]]]^^^_^_```aaaaabbcbcdcdddeeffffggghhhiihjjjkjkllkmllnmmnonpooppprqqrrrrsssstuuuuuvwwvwxwxxxzyyzzz|{{|||}}}}~~~~uvvvwwxwxxxxxxxyyxyzyyy~yx~^] ]x.////0000000100111222333JIJLKKLLLMMMNNNNONOOOPPOPQPQQQRRRSSSSTTUUUUUUVVVWWWWXXYXYYZZZ[[[\[\\\]]]^^^_^__`_aaaaaabbcdccdddeeefffggghhhhiijjjkkkllllllnnnoooooppppqqqrrrrsststuuuuvuwvvwwxxxxzzyzzz{{{|||}}}~}~~~~wxwwwwxwxxxyyyyzzz{{z|{{xx]] ^x000000000011112222333444KLLMMLMMMNMNNOOOOOPPPQPPQQQRRRSSSTTTTTUUUUVVVWWWXXXXYYZZY[ZZ[[[\\\]]]]^^^^_```aa`abacbcccddddfeeffgggghhhiihjjikkkkkklmmnmmnnoooopqpqqqrrrssstttuuuvvvwvwxwxyyxyzyzz{{{{|||}}}}~}~xxyyyxyzzzzzzzz{{{{{{|||xy^^ ^y883000101111322333344444KKKMMMMMMNNNOOOPPPPPQQQRRRSSSSTTSUUUVUUVVVWWVXWXXYYZYYZZZ\[[]\\]]]^]]^^_``_`a`bbbbbbccddedeeefffgggghgiiiiiikkkklkllmnmmnoopoopppqqqrrrssstttuutvvuwvwwwxxxyzyyzz{{{{|||}}}}~~~~zzyyzyzzz{{{{||||}}}}||y|^_^~z;<4011112223233443544555KKJNNNONNOOOPPPPPPRQQRRRSSSTSTUTUUUUVVVWWWXWXXYYZYZZZZ\[[\\\]]]^^^______aaabbacbbddcddeeeeffffgghghhiijiikkjkllmllmmmnnopoppppqqqrrrssstttuuuvuuwwwwxxyxxyzzzz{{{{|||}|}~~~~{z{{{{|||}}|}}|}}}~~~}}z~~^`]}zGJ9121222333334444556666JJJNNOOOOPOPPPPQQRRRRRSSTTTTTTUUUVVVWWWXWXYYYZYZZZ[[[[]\]]]]^]^__^````a`baabcccccedeeeefffggghghiiijjikkklllmmmnmmnnopoopppqqqrrrssstttttuvuuwwvwxwxxyzyy{zz{{{|||}}}~}}~{|{|||}}}~~}~~~~~~~|}z~]`\||TW?222333343545555666676HIHOOOPOPPPPQQRRRRRSSSTTUUUUUUVVVWWWXXXYYXZZZZZZ[\[\]\]]]^^^_^_``_aa`aaabbbdcdeddeeffffggghhhiihijjkkklkkllmnmmoonooopppqqrrrrsssttttuuuuvwwwwxwyyxyyyzz{||{|||}}}~~~}}}~~~~~~~~~|~{{\a[x}joH233333544555665667777FFFPPPQPPQQQSSRSSSTSTUUTUUUVVVWWWXXXYYYYZYZZ[[[[\\]]]]^^^^__`_`aaaabbbcccdcdddefefffggghhhiihjijkkklklmmmmmnnnnoooqppqrqrrrssssttttuvuvvwvwwwyxyyyy{{z{{{|||}}|~~~~~||y[a\v~T444554555666766787888DDDPQPQQQSRRSSSTTSTUTVUUVVVWWWXXXYYXYZYZ[[\[[\\\]]]^^^^_^``````aaacbcccddddeeefffggghhgihijjijkjllkmmlnmmonopoppppqqqrrrssstttuuuvvvwvwwxxyxyzzyzzz{{{|||}|}~}}|~v[aZs_455555666777777888998@@@QRRRRRRSSTTTUUUUUVVWVWWWXXXYYXYYYZ[Z[[[]]]]]]^^^__^_`_aa`ababbcdccdddefefffggghhhiiiijijkkkkkmmmnmmonooooppqqqqrrrssststuuuvvvvwvxwwyyxyzzzzz{{{|||}||}~~~~|s~[bYlnk656656666887998899999<;>>VUUWWWXWXXYXZZZZZ[[[[\\\]]]^^^_^^_`_aaaaaacbbddceedeeefffggghhhiiijjjkkkkllmlmmmnnnoopoppprrqrrrssrttttuuvvuwvvxxxxxyzyyzzz{{{|||}}}~~~~z^m]zqw;;::9:;;:;;;;<;==<=>>???OONXXWYXXZZY[Z[[[[\\\]]]]^]___`_``aaabacbcccceddeeefffggghhhihijjjkkkllllllnmnonooooqpqqqqrrrssstttutuuvvwvvxxxxyyzyyz{z{{{|||}||~~~~}r]nzY?i~]dI:::;;;<<<=<<>>>???@@@FGGYXYZYZZ[Z[[[\\\]]]^^^___```a`abaaccccdcdddeeefffggghhhhiijjijkkkkkmllmmmnnoopoqppqqqrrrssssttuuuvuuvwvxxwxxyyyyzzz{{{|||}}}~~}~~~~iYk?^k7 b`<<<<<<>=>>?>????@@AA@ABBVWWZZZ[[[]\\]]]^^^____`_`aabbaccbcccddeeeegffggghhhhihijjjkjlkllmmnmmoonpopppqqqqrrrssststuuuuuvwwwxwxxxxyyyzzz||{|||}}}~~}bw7Bk `zw?@>===>?>@@@@@@@@@BBBBBBNMM[[[\\\]]]^]^___`_`aaabaabbbcccdeeeeffffggghhh{{|mmnnonpooppqqrqrrrssstttuuuvuvvvvwxxyyyyyzzzz{{{|||}}}~~}~z`v^iqgtO>?>???@@@AA@BBBBBBCCCEEEZZZ]]]^]^___```a``abbbbbccdeedeeefffgggiiioooopopppqrqrsrsssttttuuvuuwvvxxxxxxyzyzzz{{{|||}}}~~~~q^vjUdj??@@@@AA@BAABBBCCCDDDDEDPQP^^^___```aaabbabbbdccdddeeefffggghhiopoqppqqqrrrssstttuutuvvvvvxxxxxxyzyz{z{{{|||}}}~~~~~d~Ula}~SZH@A@BBBCBBDDDDDDFFFGFGHIH\\\`_``aabaacbccccdddeeefffgggiiiqqprrqrrssssttsuuuvuvwwwxwwyyxyzyzzz{{{|||}}}~~~~~|a~_jsdAABCCCDDDDDDFFFGFFGGGHHHQQQa`aaabbbbcdddedeeefffgggihhqqrrrrssstttuutuvvwwvwxxxxyyzyzzz{{{|||}}}~~~~~r_}jTe}QWJDDDDEEFFEFGGGGHIHHIIIIIJ[\[bbbcccdddeeefffgfgiiiqqrrrrssststuuuvvvwwwwwxxxyyyyz{{{{{|||}}}~~~~~eTnb{fDEEEFFFGGGGGIHHIIIJIILLKOOObbbdddeeefffgggijjrrrrrrssstttuttvvvwwwwwxyxxyyyz{{{|{|||}}|}~~zba:m~YcNFGGGHGHHHIIHKKJLKLLMMMMMVVVeeefffgggjjjsrrrrrssstttuuuvvuvwwwxwyxxyyzzzz{{{||||}}~~}~ma:eƾ|oHHGIHHIIIKKKLLLMMLMNNNNNOOO^^^gggjjjrrrrrrssssstuuuvvvvvvxxxyxxyyyzzz{|{|||}}|~}~~~|ebRrmZIIIKJKKLKMMLMNMNNNOOOPQPRRReeerrrrrrssstttuutvvuvwwwxwyyxyyy{zz{{{|||}}|~~~~~rbRfEfӺ}zRVNLKKLLMNMNONNONOPQQRQRSTTrrrrrrssstttutuuvvwwwxwxxxyzyyz{{|{{|||}}}~~~~~}fEadTrnMMLMNMNNNOOOPPPRRRRSSxxxsrsrrrssstttuutvvuwvwwwxyxyyyy{z{{{{|||||}}}~~~rdTLb5gβ{r`NNNOOOQQQRQRRSRSSSrrrrrrssstttutuuuvwvwxxwyyyzyyzzz{{{|||}}}~~~~~{g5Kbe?q}_oXPQPRRRRSRSSSUUUsrrrrrssststuuuuvuwwvxxwxyxyyyzzz{|{|||}}}~~}~qe@gyyX`USRRSSSTTTUVVmnmrrrssstttuuuvvvwwvxwwyxyyyz{z{{|{|||}||}~}~xggjvVZUTTTVVVWVVghgz{{^^^```mlltttttuvvvvwwxxxxyyyyyzzz{|{|||}}}}~}~jggnwrWXVWWVWXXXXYZZZ[[[[[\]\]^^_a``dddmmmuutwwvwxxxxxzyy{{z{{{|||}}}~~~~wgnkjţypXYXYXYZZ[[Z[[\\]\\___`__bbbfffjjjonnvvvxyyzyy{zz{|{||||}}~~~~yjkh!lqZ[Z[[[[[\]]]^^]``````ccchhhkkloopsssxxxzzz{{{|||}}}~~}~~lh"j]xt]a]]]]^]^`__```bbbedehiilmmpppssswwwzzz}}~}}}}}~~wj]kxwaj`_^_```aaadddgffkjjmmnqqqsttwxx||{xkmm̙z|h}faaacccefehhikkkooorrqvvvxxy|||ymmnnzqmddegggkjjmmmpppsttvvvyyy|||znnk.n}}xktklllonnqrrtuuwwx{{{~~~}nl0nKo~~vtqqpsstvvvyyy|||~~~}ooKoTo~~}wxxxx{{z~~~~ooTp\p~~~|}~~~}pp[qTp}̂}pqTsH}q{ۈ{qsH~s0}rzЎzrs1|s}t˄zۖüztsyq}u{٢̤÷˺տ~zuȜq|v\ys{{sv^yu"{vĀ{{vu"vrzxlvu~{{uxmrxvyxzz~~~zxǫvxx@xx{{{xx@ssyzRxy|~|xyRsuvy{Ry|{~~{yyRuy}6zx~}܆}xɽzy8xzʂezʃxɁ}܊~~}xɸzʻzʼexɽyɃzʅdzʆyɆ|Ռ}~~}|սyɵzʷzʸdyɹxɆzʉ:{ʋs{ʌzʍ{̐}֕}ݚ}~~~~~~}}ݸ}ֶ{̱zʰ{ʲ{ʳszʴ:xɴzʎ{ʐ?{ʒd{ʓ{ʕ{ʖ{ʘ{ʚ{ʚ{ʜ{ʞ{ʟ{ʡ{ʣ{ʤ{ʥ{ʧ{ʩ{ʪ{ʬd{ʭ?zʮ?????????????(@     7 )r9C^BPFXH]ёI`JdKhKkJmImHoыFnBjr9^^7/) R),8AGHQΚMXXhcvlsx{~~|xslcXMH|΁ArR)J8o89VHKOT`ir~}}r`OHo8hV s::WII̯XYkp|}kXIs:oW Q+(1JHZYll~}{zyxxxxyz{}}lYHQ(P1 }E?iUOje|~|yvroljihhijlorvy|~|eO}?}i  (RIg\{q~{~v|qzkvboP[nBLU:AB48714201312;37G9A\AQuIdUdkqv{~p\H'(  =%%ZLrb|}{vvoqdgILG45)(()))**+,,,---.//000010223344555667888:99UCRRfov{{bMG%J(  T5*-`Oye}}~xspcbmAA-*)((((((*))+++,,,---///000111222344555766888999;::<<;>==D@DxOtepx}}eON)R,  O4'(fṔf}|uqjzHF+((&''(('((()))*++,,,---../000100232443555777899999:;:<<;===???@@@BBBGCGUku|~ePJ(Q) 'lP˅e~{ri_C20&&%&'''('(((**)*++,,,322:::@@@EDDHHGJJJKKKKLLJKKIIIEEEA@@===???A@ABBBCCCEDDFEF_L^dr{~eP!&lNƉc}zq^R-('%%%'&&(('((()**--.888BABEFFGGGHHIIIJKJKLLLNMMOOOQPPRRRTSSVUUTTTMMNEEECCCDDDFFFHHHIJIPLQ^qz}dN fFh_{{qZL&%%%%%&'&((((((+++999CCCDDDFEFGGGHHHJIIKKKLLLNNMOOOQPPRRRTTTUVVWWWYXY[[Z[[[SSTHHHGGGIIIKKKKKLNMN]q{|axHn cK20~Tq|r^K$$$%%%&'&(('(((212@@ACCDEDEFFFGGGHHHIJIJKJLLLMNMOOOQQQRRRTSTUUVWWWYXXZZZ\\\^^^````__RRRKJKLLLMMMOOOPQP^r|݀ـrTQ2c0~Qϟi}unT&%%%&%''''(((((778BBCDDDEEDFFFGGGHHHIJIKKKLMLMNNOOOPQPRRRSTTUUUWWWXYYZZZ\\\^^^```baaddceee\\\NNNOOOQQQRSSUTUcu}؀ԀhRpFU_|ŀ€xa-*(%%%'''((()));;;CBBDCDDDDEFEGGGHHHIIIKKJLLLMNMOOOPPPRRRSTTVUUWWWXYYZZZ\\\^^^_``baadcceeeggfiihbbbQRQRRRTTSTTTZX\ixπ̀|_jFVTܳǹʀ|ܧnD:0&&&'&&''((((::;CCCCCCDDEFFFGGGHHHIIJKKKLLLNNMOOOQQQRRRTSTVUUWWWYYYZZ[\\\^^^_`_baadcceeeggghiikjkmmleefUUUTUUVVVXXWh\op{ǀĀo|TvFP`}Ҁπ~viI&%%&'&((((((877CBCDCCDDEFFFGGGHHHIJIJKJLLLMMNOOOPPQRRRTTTUUVWWWXYXZZZ\\\]^^_``bbbddceeegggihikjjlllnnnpppfggVVVXXXYZZ[[[cv~~`dFP Tۼnـ׀Հ{ʥg-,(&&'(((()(222BCCCDDDEEFFFGGGHHIIJIKKJLLLMMNOOOQQQRRRTTTUUVWWWXYYZ[Z\]\^^^_``abaccceeeggghhijkkllmnnoppprsrttscbbYYY[[[\\\`]bm{nvT i]4'Y|ހ܀~vl^A'&&(('(((+++AAADCDEEDFFEGGGHHHIIJJKKLLLNMMOOOQQQRRSTTTUUUWWWYYYZZ[\]\^^^_`_baadcdeeegggiiikjjmmlonnppprrrtttvuvuvu]]]\\\^^]__^xdv~|xYE4i'P~κh|ҷk-,)((((((*))988DCCEEDFFFGGGHHHJIJKJJLLLMNNOOOQQPRRRTSTUVUWWWYYX[ZZ\\\^^]_`_aabcdceeeggghhikkkmmlnnnqqprsrtttvvvxwxyyynoo]]]___aaadbfp|hgP~ Wty|M('((((*))-..BBCEEEFFFGGGHHHIIIKKKLLLMNMOOOQQPRRRTTTVUUVWWYXYZZZ\\\^^^_``abacccefegggiiijjjlmloonppprrrttsvuvxxwyyy{{{|||cccabbccceee~iyslW c]1[~vIF4((()**+++899EEEFFFGGGIHHIIIJKKLLLNMNOOOPPPRRRTTTUUUWWWXYYZ[Z\\\^^^_``bbadcceeeggfiiijkjlmmnnoppqrrrttsvuvwxwyyy{{{}}|~rsrdddeefgggoi}v}n[:0`LWǾd}l))()))+++,,,BABFFEGGGHHHIIJJJKLLLNMMOOOQPQRRRTTTUUVWWWYYXZZZ\\]^^]``_abadcdeeeggghhikjkllmnonppprrrtstvvvwxwyyy|{{}}}~~ggghhhjijkkkq}vdYLWTl{W*))++*,,,222EEFFGGIHHIJIJKKLLLMMNOOOQQQRRRTTSVVUWWWYYYZZZ\\\]^^_``babccceeegggiiikkjmlmnonppprrrttsvuvwxxyyy{{{}}}~oooijjkkkmmm|o{{k^TWqzvsF++*,,,--.:::FGGHHHIIJKJKLLMMNMOOOPQPSRRSTTUVUWWWYYY[[Z\\\^^]__`abaccceeegggiiikkkmlmnnoppqrrrttsvuvxwwyyy{{{}}|~yxymnnmnmpoouoz}r_WYwy[Z=,,,-..../???HHHIJIKJKLLLNNNOOOQQPRSRTTSUVUWWWXYYZZ[\\\^^^```bbaccceeegfgiihkjklllonoppprrrtttuvuxxwzyz{{{|}}~oooqpqrrrspyv_Y \zxCC5---/./000DDDJJJKKKLLLNNNOOOPPQRRRTTSUVVWWWYXY[ZZ\\\^^^```babccceffgggiiikkjmllnooppprrrtttvvvxwxzzz{{{}}}qqrssstuuutx{_\ \|x650/./000111GGHJKKLLLMNNOOOQQPRRSTSTUUVWWWYYXZZ[\\\^^^```bbaccceeegggiiikkklllnonqqprrrtttvuuxxwyyy{{|}}}tttuvvwwwww{x}^\ ]~x///000001222IJILLLMMNOOOPQPRRRTTSVVVWWWYXYZZZ\\]^^^```bbacccfeegggiiikkkmmloooppprrsttsuvvxwwyyz{|||}}~vwwxwxzzz{z}xx]] ^x000110222443KKKMNMOOOPQQRRRTTTUUUWWWXYX[Z[\\\^^^```bbadddeeegggiiikkkllmnonppqrrrtttvuuwxwzyy{{{||}~xyy{z{|{||}}x{]^ ^y993222433555LKLOOOQPQRRRTTTUUVWWWYYXZZ[\\\^^^```abadcceeegggiihkkkmlmnonpqprrrtttvvvxwwzyz{{{}}}~~~{{|}|}~~~~}y^a]~zHJ:433555676KKKPPQRRRSTTUUUWWWXYYZZZ\\\^^^_``baaccdefegggiiikkkmllnnopqqrrrtttvuvwxxyzy{{{}}}~~~~z~]c]{{`eD555676888IHIRRRTTTVUVWWWXYYZZZ\\\]^^__`abacccefegggiiikjklllnnopqpsrsttsvuvxxxyzy{{{}}}~}{{]f\v}yP767988999FEESSTUVUWWWYYY[[[\\\^^^_``abbdcdeefgggiiijkjmlmnnnpqprrrtttvvvwxwyzy{{{}}}~~}v\fZsa888999::;A@@UUUWWWYYY[ZZ\\\^^^_`_babccceeegggihikkjllmnonqpqrrrsttvuvwwwzzy{{{}}}~~rZhWQks::9;::<<;===TTTYXXZZZ\\\^^]`__aabccceeegggiihjkklllnonppprrrtttvvvxxxyyz{{|}}}~{kWhQuDb|U\E<<?@@@NNNZZZ\\\^^^`_`aabccceeegggiihkjkmllnnnppprrrtttuuuxwxzyz{|{|}}~|bxCQ`}~]?>>?@@BABFFF\]\^^^_``aabccdeeegggnooppprrrttsvvvxxwyyy{|{}}}~~~}`y]wtvDFBABACCCEFETTT_``babdddeefgggppprrrtttvvvwwwzyy|{{}}}~~s\xwOd~sXDDDFEFHGGKKK``_ccdefegggrrstttvvvwwxyyz{{|}}}~~~dOhb{vKMHGGGIIILLKTTTefegggrrrtttvuvwwxyyz{{|}}|~{b]DobIIILKKMNNOON___rrrtttvvuwxxzyz{{{||}~~~o]Edǵ{|[iSMMMOOORRRrrrtttvvuwxxzzz{{{}}|~{d`IrtRVQRRRSTSrrrttsvvvxxwzyy{|{}}}~q`JgynTUSVVVkkktttvuvwxxyyz{{{|}|~yg}^ k}|kWWWZZZ\\\___cccoooxxwzzy{{{}}}~~~k^ e[wzn\^\^^^```fffnnnuuu|{{|}}~~vfaiy}rbhbcccjijpppvvw}}}xkeRlyyljmmmrssyyyylRn]oяzxvv|v|||yo]qbpщz~~}~zpbnc~r{ȉ{rflc{sy~ڗśƹ~ysėcwrXyu{{urXnlxwzz~~~zwŧlttBwxz|~~zwtþBuwAy}v|}}vȻyǽuûApw xǁuyȃxɆ}׏~~~~~~}׻xɴyȵxǷup qxćJynj~zȎzȑ{ɕ{ʚ{ʜ{ʟ{ʣ{ɤ{ɨzȪyǫ~xĬJq????(0`   1(e3?Ky=No@U~BZB^@^~y=]oe3PK1(( i59OCKISҘL[Tg[t^~bb_[TL}Iz҅Csi5^O  }??sJN٪V[fovvfVJ}?ts  y?=eLL^^tx~|{yxxxxy{|~u^Ly=ve K*&-NJ`[tr}yuqnkihhiknquy}s[JK&K-sC9NZOpf~}xyrvls_hLT_=DH6:813201312=58OKqTs}vyifB>&&%'''(((**)+++444;;+(uSޛp~v|eD41%%%'''(((+++777BBBEEEGGGHHIJJJLLLNNNPOPRRRTUTVVVWWWOOOFFGFGGIIIKKKcQdhv~pSH+U(zQΗh~xɆf=2-&&%&''(((112@@ADDCEEEFFFIHIJJKLLLNNNPPPRRRUUUWVWXXY[[[]^]^^^RRRJKKLLLNON`Scjx~ۀgQ pGa`~z֘lG:2%%%'''(((777BCBCDDEEEFGGHHIJJJLLLNNNPPPRRRTTUWVWYXY[[[^]^```cbbeee\\]NNOPQQSRSiWmnz`oGa !Vsɀ}sdP=&&%'''(((999BBBDDDEEEFGFHIIJJJLKLNNNPPPRRRTTTWWVYYY[[[^]]```bcceeegghjjjdcdRSSTTTVVVy^s}ʀsV!LoƦdxX&&&''&(((777CCBDDDFEFFFGHHHJJKLLLNNNPPPRRRTUTWWWXYY[[[^^^```ccbeeeghhjjjmlloooeeeVVVYYXZZ[gxdlLo Vvـ}q@:0'''(((211BCBCCDEEEGFGIIIJJJLLLNNNPPPRRRTTTWVVXYY[\[^^^```bcceeehghjjjmllooorqqtttcccZ[[\\\g^or}vwV zD@_yS'''(((+++@A@CCCEEEGFGHHIKJJLLLNNNPOPSRRUTTVVWYYY[[[]^]```bbceeeghhjjjllmooorqrtttvwvvwv^^^^^^```iy~_YD@Sl~uNH6(((*)*777CDDEEEGGFHHIJJJLLLNNMPPPRRRTUTVVVYXX[\[^]]```bbbeeehhhjjjlmmooorrrtttvvvyyy||{oooaaacccne}u~lhS Xx|ɹg))())*,,,BAAEEEFGGHHIJJJLLLNNNPPPRRRTTTWWWYYY\[[^]]```bbbeedghgjjjmllooprqqtttwwwyyy||{~~}~~efefffhhhp|xiX ^[/[{Q))*+++434EEEFFGHIHJJJLLLNNNPPPRRRUTTVVVYYY[[[^^^```bbceeegggjjjlmmoooqqrtttvwwyyy||{~~~qqqijilklzn{h[6/^H@byfc@+++---<<5434656LLLPPPRSRTTTWVVYYY[\[^^]```bcbeeeghhjjjmlmooorrrtttwwwyyy|{{~~~}}~~~~~~ymsW[tWcl{PS>665778KKKRRRUTTWWWYYY\[[^]^```cbceeehggjjjlmlooorrrtttwwvyyy||{~~}~{lvW_bR;g}ksJ887999HHHTTTVWWYYY[[\]^^```bbceeeghhjjjmlmoooqqqtttvvwyyy{{|}~~|guR\;gs:a~\999:;;DCCWVWXYX[\\]^]```bcceeegghjjjlmloooqqruttwwvyxy{||~~~~arCDDFFFHIIKLKNONRRRVUVYYYYZYPPPJKKNMNkdQi WF+"[y`&&%('(667BBADDDFFFIHILKLOOORRRUUUYYY]]]a`aeee^]]QQQTSUrրz_E-Z" SԱjπu/-)(((555BBBDDDFFFIIILKKNOORRRVVUYYY]\]`aaeedhihlmmcccVVV_[b|ĀlW @: [{ڀpbE'((111ABBDDDFFFIIILLLNOORRRUVUZYY\]]aaaeddiihmmlqpptutddd\\\j|_-"CN\ʺeu*((+**?@@DDDFFFHIIKLLOOORRRUVVYYY]]]aa`eddiiilllqpqutuxxyyyyaaaecd}hgR\WpW*))443DDCFFFIIHLLLOOORRRUVVYYY]]]aaadeehihlllqpqtttxxy|||oppgggvrk[YxdbA,,,===GGFIHILLLNONRRRUUVYYY]]]a``deehhhlllpppuuuxxy|||}}~llmytyh^ \}BB5///CCCIHIKLLOONRRRUVVYYY]]]aaaddeiiilmlqqptttyxy|||pqqvu}ea \450010HHHKLLNNNRSRVUVYYY]]]a``eediihmmlpqputuxyx|||wvwxy{ab ]673434KKKONORRRVVVYYY]]\```dediiimmlppquutxxx||||||}}bf\}GI<677KLKRRRUUUYYY]\]`aadedhhilmmppqtutxyx|||}ak[xgoK999KJKUVUYYY]]]```eddhihmlmppptutxxx|||y`oYp_;<>@@@>>>AAAnQlwjV_~R6ɔeȈi0++***888CBBFFFIIJNMNRRRWWWRRRKJJUOUtfU7\[|ܧq2.*,,,>>>CBBEFFIJINMMRRRWWW\\\baadddVUU\W^z|_ԏ`SUڼmՀUK:***>>>CBBEFEIJINMNRRRWWW\\]aaaggglllnnn[[[tdoxXUY|¯g(((888CBBFEFIIJNNMRRRVWW]\\abaggglmlrrrxwwpqqaaay|w\]ƾbvqH-..BCBEFFJJJMMMSRRWWW\\\babfggmlmrrrxwx}}}jjj}swfoaS&jKK8565EFFJJIMNMRRRWWW\\\aaaggglmmrrrwwx|}|wwwustm]W'RAm9:3:;;IJJMNNRRRWWW\]\bbagggmmlrrrxxx}|}xx{ppXXASAm674>>?NMNRRRVWW\\\aabgggmmlrrrxxw}}}}~pwW\AS&jNQ?@@@RRRWWW\]\bbbgfgllmrsrxww}}}n}Xc&]cxU???WWV]\\bbagggmmmrrrwwx}}}gbxY|nBBBUTTabbrrrwxw}}}|^TTn`pTONOxxx}}}pZT^]Ӯ|xW]Uxxx}}}}abtT6gv`e_mll}}~iW7mV^j|yxlY^dWfqg||jZf[V8a_oq||paľX8``W[S\efwmىoߗoޢlتfͬ^XSbżatWp'Wx>W>X'bĢA?AAAAAAAAAAAAAAAAAAAAA?AA(  RVUb[UmzVzzU[T\Pa\oqz~yo^SnR0πh|ZXU;=824<79aGXc}iU0}PϙhvN=6100<<{I^ux? Qujjoj` Qp&rf~$;L5G@UwÎպs^p 4)iy)'9h&p0K!yIB9N_)mVѺ9 fߙ2T~TOY_zrM# $\;ݞ1>I_>)2V7'a`hC?i?ܷ~_V8ثEt*'9& 6.X.i0Rv#2U?ݎO횹*t iᰯ`rojn@L_dK9d<$X 93K9eƜ=g1Mnݻ{fTM |y<v֚w5@fAUwƗ}wL(R0?Snp[DS~뇺nX__`쮀/=.^wޡfq.XnJé}2Ȍ<8N>|4;` 89\Qk|RGs_#\{Cۭ`+ )x~ 2tJ\HC;"V&:CA,0!)g,ũ,mwhnN'3KJUOȽM#N- 3YYV Ђ}l6(̊-20Nr{Mro5c*Z{ښ} ~~;GHlD}WRS16{\޿+'+0?l= {sa׵

    B%`VH#iCgsCQҟ 4$j/rx@uG1i,6CE=fꭅ맭6"m5Ͼć].=&YtVQNIwڼOG&$b(J@A+ѡR-3Ի Gcb,k,?=Q@Bv@Le* }dDxlj+6ԣ4{ |q-\X]a͹mJ_|zKwvh?Z)79p0(yڨW*:tهX=zL/+k~1xH#gIx|_z-*Zqz[tNE7BЈ ]d]Tlׁ$bYP&p[~(~"$\ah j 1 )t$7/5cs )LoEL[6>f(H{HIn<9+Ro!?xnC% 2~ E&qwEjEwC592E))bֶf38t3W!ߵ͟Úl)>Dx[M++:mYښAZtVʪm7oQX4y5m,>" !sўL@`ak O"o^:c%3?5Ͻ}q`Up#pu$F :]-j݌ߓGi'$=Ks~vߏyl!M?' :V rშӈHWzcx+$crCєO \ɮ$ښR+Z[AjɐQq:ZvV Z?hWj$}ᷠc[y5ú? iO!<`Y_\̭G2 fuKSm#"DsNp\ uMM'!Y\6fcsm7Y>}??&fdnw;Vhbm'AnOC2#|1{y(<؉)DW' :xpHZ&T EEyNaDC3mia5$0.K4-K{;\Ƅ(Lq!YW߷S A?53=_YhSVcN8"=͹LTYXگMfD~|+K=+({ \_NϮh0}>sz:\^X4fF>6~wv+g/j}!ˋn"uL,=G ~悘.G?RC(48Щ|(ʟ1{N_BX)9cUm9EkyeWot_v>Ůhlm8e"7u=#?nF#n%pyRWNuc1%dQ^26i?"VI6y0x5a\i|?8i'O"7PG"U' \1,3 ;Rv60췙~;[6" UL.ˬY7SAsc˞^Y?(Cx~;_zb( S |O+e/˴  .FjB,_k6iנb{+dMVnٿ澁W qiлn 7 uܷ^⋬}pZ5N%ko0NaM `(DM*WDk0hj_%Fj-y{x>BClq"ά LMw~|˛|swќX4:ĚӜk^^l{%nHa EΝȈq82}n c nxVԼ&dA`tɤܤn5bzv&{Hc=d˞ >4_:,X02\۔_&gfg]ԇu'wV.R^Bft<(vRXH%:}:~%&Z<81*.1qr [U_ˇa PY$S1NFΈE5ظDbR/-~휈w'7ѴHoKxCg(Ctg) %zI1ȇE_K#~j% L;J`WHS\u`@ȕ9s[؄(@~ɫGE* Q YxwQ)XQFrMAu{cfts&Zj6e / yiS xYJi?,}ۀc[R{^ѥL}4Sy{[8Ed#GqTbN= )Kgò֐7~+[eVTZ+go8[ý1gs ﶥ:8]`3j Lנ,f: ,* ʫnAX dAIJ)Y8\a4UIN>"t\h\qP;ᷔd7jauT"If>'D:?ޛhWP{<7c"Vd@צP"ćj%mJAKakQK|b*я`D;q2'E-@.c^(m IfR0_#1u%Y}j+]wGl7qy\5jxgVXnsK6FlsA輷z,"VO$`Pw8>pK-Psa^q9 +p7,\eeuV٣oFG+NS3J庆Z1 ^'wWN zŴ)>Lik,'c%{B}.;AzsQ J}k)7u %rOG˪!L4Jy:2uTUgYB㷥0 ۫ߊyJu. |D7~5 4ƻ -MxE ҈% v°msMYNnlc0h{!pOn K&.To5l Q΃rĞ֞@9 s+ =D_1 Ql!ެqBCԙ;<}nPPbCţg%(tCL*ױEsב?erim_v9zD#9C(lրd =o!|hUESDw .Jrll6}!j!Â" 6 z?"6d-l2c#cgLZtNu0.nhQ˭SM K[jhƨ }wL {$z Yy 8psiVec+j17n{}C9C4r+NoJdM703}d蛿6ƒ01c\**UΧKcQ񹁍ԜR^ x7jFv񪀞z2jH)d1à9o~N,*|laIEr$҇GupkD:^GLc FˍѭtRA;*sCt'цԊ yΊ3 ҂R`6@ihLuYa.8_" I݆PknsH*'Hc5'KC '3N->D k$K1!`ŗ/0Vh+(]p8twfU۠>p z oa%=m^L45!F Vcaxy\&ȔT_wK-M.! VD:$D_HI|fr&DKy,++n%wfM&߱"v,hVpR=Eݨ鬦lu`zc[n^t @5 `)[= U^mP|K1Fd)S?_*B_ WtHݨ/L(M=|\9lo`8 ;f&a⣤ff zWpS̩)dr\am]LJBs@] $ؖ~Ǵ(qWMm!b$( kl0(&vμ o v켔P:訾7zcbۨ7bƉ b;hf˨TŽ->A?bR lV 1D_{݌./#;GpN%y- ZƸ6N\ 9rKY_R&]拣=3llZڹFE듎zt>twS+.@` t kRHQ 1ܣc Z&aEZD.{>T%! ;}StiR}ATٶL?c% Ւ*t& Vxݭ외JX)w qMt(2ZaR2[dgpiGaɻ Dk,6miM%(LAVL[0ٕ?cY<"TY >N1 O-@~1Xo MaiNbz#MoEdFN~ eʰD+nYO0=]]U;58:G.U\XS::Z/WȞZ)pȎ)Dl *n$bzLOQ3o%LR.ųĬ d4uGx}m͛z#Ϲ/s~aZyΒ1=La_8,̮ll)r'\>$m*]@Nn?a?~>x< Ik.a?Ͼ}%z`ԇCkc -wduwB"f-W$üS#A+RA61W ][KG|saTqe|*tH2b[;l6 X=:;-$}oh딼TIG Hty50K3IyfV7.{}E^%@ PG+ǔD du(w@\gMX@XJ 0{y4<fi&>T VKCGRO<7zh+7@@cDl0˽Gx+ʃRM@ %RRo 1k)Ʋm o^[|-Hع/o>Idh}2+gy}p"n5؞͢Kq=D3Qt' d^6CT1Epb,w2YFcyeДD' vـ$EI}dn, @K\p 4/nlD84#"c !YE=E!8S g%a "k".pGb[T,R`zH^.8<}{][&Օb<%>UDo9-K5Ί!#o:ll"a1g7igA)G֢!)wM"jI^xt-hqwwby_DbE-]`RvQg @M^M@ԩ_ 5u^>b~F'[!_ƻWS GK 5S[ ϐIwL447T,&QHP gGJ< ^!F|nqwr1 §˜>Wj9="!|t~iQ*S,-#ON(ވh|K7ɯB+! uZe {&Kѓ}i`1le~cwN6m2~&:H8I8{$SYtչ#2?iz^tWZjLVPV[FJUQe!vc}BP<6QMNZ.7F^#p>@%D9ܕ`ݕl]BCW'ߡI5 }@ME=cEiS bK=SvD2f}[D-v" TpdRy <[+{S 5 ^'6w?0<&*liѨA=)e7cvT[bo,"+1=tߺ}fj"(D-PSN#ƗS$,ą ֜)4'LB}"oK#IrX_ZO0ah^EcJwi&ّܮ"匐~/Au'pfܣhW7&;F[t&V)֛CIA휯֟/tMzPc'h|1iYjm@IOv~GC0sl8]³HP׈l'th̘(gĕbhhvnU#J߆)|!% +4\X Jv|8+j%#8iTZ<!C(G#6ҟ3栻,P}tEܯgx] UfL5ʼwVo@\&OTayM?JO鋮j܃ۣڔ)Z#8ǛcQW JTN!.&B6t41/5xHeY A FP֯?FBty#}\)å?!Dè&tPѨ<& ;'?^ji&nﷃVOfɩc<ǝ.=pi^Mgz;{I6` kWdӃZ  tk'>UݹAŢl dH`?jE 8Х`$+pk]NؽrHd]Lq0 ^,[ᑈ?n-Ίuv^YkTW'(<=z^- /9R;).0okL48!}s) S_\X -~(zʱZ%?%m~D)F$Sy%TEAך˷L{uE }fB~DTBȉrs?yFh]Z0yw+N=x^$=u KáU7!Aݽz44LغnTB1 k\dk[s8ɺl=_dJwL 9}Z^j\Q۔ PO> MXU_1;sUR 8mfɟNGv8.za@M(l,ț@;. fֵP뒾c_͔ZD!PgsM(;]" gA/"H*RcEw+dL\1ւ|E+lZwsJ/dØ4،i *bհvmջӵY]VVt߹m9~SCX1#m)09D =*UՔQt’MOoK ح7,{M7$ 䮒}gLu-zLl5oA R,bXEq`ihٴJkdIU\L-gojj6%Ni^i!U:eGZGrhcE\J?٦1+|oz/mYc9'3<$*ݥ/$nB˷P)f61 ^DnqYTO,Jf P:%v$2>bLHJn"ep3gByf(o>Idh}2+g2fhԞPM?bpW^,Dv"v|+2kq.@n:6D/\|US<[^}/ zwyn-:ꍥ  R45Hם)0ylZFġa:WA_ZMrRxe}_,r䯳#& xw?L{ əgggl( ) FNLOW[o ҠF?ҥD (1+io97t`Hii*Ψ тy+Ayge̫s&I f}tHSa8@=%v|YfOwaos<*zǑ)~a9̼pJ[Cj)v|,t}G_@beKu(\Ԕ2M~h2L4HLRvz ]H?3pa}4.RKONW-`u IxrF5(`b[Jۮ:sE ZH{&ӭU"yA8]wVz^f9pW$mE ~RHʦo;dVp%0HܤE#ٸP$NcdBdY{m2VY _3twВ(=OrI=*Z2mr$HNU@0 9pD4yLuլxT,.#jgoae'=Y/yo* YV&7m%VzK8ErAUK*1gk`ڷY.VU2Nq<S8tfMux-ay!#Ö|}y- L]f<"e562+QbVR9*1J4U1̑}i)-wfF}a>JGIsTŘH8Kh=O&oXIrN}ˍ*%MC~d)OD{w2 n,"LI2@Q{F$jiOquL*D mPxc SWAΏz +>VM@DY3zTyU?",cH7§˜>W&/v(`/ rUwmv`g_e3+vpO X m;xueq"uP/ݜ[w # (T[!`وfrn?917 o8=[,XHbÊ#1hW7Vi4GGT}أ% rpupXi5K*iv*V[3K ˫')8U>ҩ5e-@K2$aA. ejOA j{A(k nm|E.;<ϻ`QL}ЍE گfpc@.!O^鮖|]-j5мW}(^$4V|G:VN[f$<*p4 ~wz(HDv{8FsBoȺr7es}/jh`6% ɧ-763HLZK5^" μid}׬ ^ N^ ߞF>$E?iK6H,u2ࡇv"8aG*z9p1, k4Ȋ2K_q v%g(Α9-:h3DI#+RPs&{P=Ԩ̙ݪ.8+ž⇣^{-;z]3;E2CΌYiao/*6˚۵C}7{NE'ae% mLZ9ѢJc`zS/ok/A@Mi qC\W,b,!cbI,AT!f}lZOl$g,[L"E;Asb׹:h:}!Q~-&J0L@-!rmȖA3kvéu3mUT-g1^(s?eۡ 9,֭_uMob"5d`G7.Ptȁk13!i*<7犨2\ĵ6L[ӥ{ Jopך}J#=r]PTB -{sc ި^[.<Na8G㐾?Jۘkt'C?1*QS zo~ċUtLk6yZxf 捝f}~7|dڏ,+!Ah䷦'m p+()m%ΰAJL\oE^M<{ƣQt#[@L2fO(͸v^e/LiJ) "_K9E:N [91jFwK*f>,q9i6KE"6Ț!orgecDI'0ĝ@'AINP ˈl,i?F#ġnRT2~&u|D`0򊞉i[]&؞)) lwId&U>8č1@_TZ5O hxB$I{E#8p)b=d^`: ֮m ˑ6K(=.$v0M5? <֪2po&PĬXɥˮV%`/.KڙT 5EQĎQ\ΠҸ>aw3DN!Qt=<kyH%Äcnb́e]"Q!t8-]SH tiМ7G^Hdr{17ah ?;s褌l[O) x6- ߼DD1NOQ.-!ʹCµQo]a`WҸ={ K6+gV++/.mMoWzΧjf&Eh dNZAtn6 hNؓ/i5TYﭤfˉt;bTzQڸ2Ct\ Jw#Og-_ztHF>/a~GAɠH 8750Y/6{H8]q ;V5~*vk^"\q%i14r$=dlWoQFkYH#VoA4zB\AO拓Y6v1v6]+V2xѠ9N)g00Co^WO.FoF&ue/>[kImi[3f$>#{AXƀlEZ:rhyMM09j8YH-9_e\rHτ+<&q/DK5Sd5$"wB).<+|{Mg>B05%/1Β@x6o7!ޠ* (nq/\+3oL~dh}2+gy24E!Ri0ܦ$n4Qz֕볣Q@_(-ǩd4%"د-|Q2)s/m6PDwJѯJaɉVEyOUH7P=\6Ł "j:R&=XSxN2Ŝ<#sSV>wn+a9}!dzfNt$Jo]/cWď9tζnt$E\jqjX)x*0̧L]LW So|pv +!#W.;6 !+}W_h62J6F1r+J5_bx(O9}AVsm* ᢊjf},] -nDȍNX4.HY3Lp^ I6LKѧPBxd7ÞPGD U'ɍPAs!vD;)C}/GF,g %S%Dh6QO$.[i-נ][n)HY% *K]vʭ;C#rP)C]z2 g%B_h%ݝ@ҀkpZڥ Y L]D-råM 9p@mu[uMicaqm!E)P(BtV1WgzX˴z|:^YLՏX[M,G63%lBUB, }3nbE_*Z*saݵG'ddԑ+-:,ꖞbH>V~.eAL.zZOCHj4qxU%"7ljb;o_uUo_])#+v Gt%S{Fp71n#ڹo ԰'%f\MsHV4`N'K=?@89~)>\ޙ JUdUh.%Ae D7vD5L%Y}|h:aKTx Gϛh 6ΘhNJ1dZȽQsu)NJsa5[ƍ_n470H(opn;1čv<}`UDݹܞ}kG0mj*slqsHd D&sH3~kNS=|eb§˜>WjI%K8+ze5@rsNXw2XxW{NTF(*) t)&$_Y~n^\2˅Yǹ$-kK!.DwM/ 6t9l + ~F G"s9) HVd4z/uZ4kyO]^ 87kQEyy{I4 o|~:4@UO>x@+Gw%E);>c?FUgEŀWi1=fA%4f]' 3U[FU:f^~`)DBJV4G IsE\LUH8 p=&vSC!s[5n.T rRoOm );l1A0wN?!Qx/3ܙψ#f5~XEPldδݿ!*w.ԧu؉`TYM`ۑD :[&Kb,(\o;F]#QNӅ\~Mq~m "Yr0^[r4hT_/x%C]#<9/hi~ޕޝ2iRvl'+ P'Nћrhoٽ#q'3LOK񡁶~-XjKn19[ouQ+\zO>|xv_| RI聍^w9WY 2mB{[#_@?j;$Q?!C81п9Kqv,X{8p2<3A8Fɍx86l$} b{4["-8B1EhC܍鳮-K'GMG7ܭ.5j.-uxQ9Ϻ/3!=^@d<ƐYR(Y(A ]Xfm]v$u/P1ptOZa4EF?Ү8m4)yZMi} 2T;:PΥJ._`->L>Z Ya~GD4G/z d> f׼y"=z9~|Os=5t1V*UHH {y1x`ʻVPR\k>eZSˬH~gF[n `3B)R Jkzc$tP?>T}p="W*+[F tZfCM7~\>VfiSӿ8ӽ<Vt^Qs d+}I+p~{l)ϓ}vX:֒c-A.XV\l:Jݎ?;bр7y6Jv.\zK_ܾyAF]5(%s^zX L;6Sz8WkK5J4eK-$'Ŋ6`j{Ls.{QNb @gw+[3Dž*܆ R#CgE/Z*d+jaye|zcإaibhI$bFpٰ7ȄSk-\M hymXqS7(}*c0v?EzAѦ^͢[.6R& [@d91KX=Y-=K 2s^<"v$r!gl#gAh@Zӛʥr1jP)PZep!{b|F~XKG͛0 Af2wY iIj5Dp,`7y2菦׾/Cg_Dڟq58sP҉zb7  QWOϿ@ߣe_|2v('\1>s:Ek3,lIĶ mtD52C< rUŷ[q͆tzk.g󙘴Q%%E4lPeyDXU5{ygjx" xJS/ӊzcj H(̭aWo> 6'ө4fZ;l+UJʳ.+jBSO)zr~޴qz~ob~޺o^8f\;W|s U C & 'T BV1$|Ǫ#!Y3- kfk۫L0aj>4\twk[`]2_xaՇCϴaA\T5+,gąMR[ݙAF{0<5X|2mLTP6CtRq}?ټYͅd.ۙgmv_qk|Pi,>adOE/4c*GhA=4h_%(kN[ƛفh-V? t2`6z:_ag+W[8iOZÀQx>Q晢PlK]lkݧq}+јIɰm`AWj]tZΣ daڧPwDkЯZ մXT= Fqy(X Bj4ۉP篯9"}=+a=Zԙ,3Vº#l_\q.zwb1@ :E:#.#B$CnFwhpA|+RSN㪦xU8ET1PGJHMځűbi=(ZXxΰp肏A4vjq !a_$Ilєk H>g]%R0ӡc#Mf N!GgIe 2(U)v"8][guޕ/y("z@ y2Ʒb$4ɰҭ( R20 inW(`%/@H8-X}>t_z;JUkhHksW%Y~䅬qjӥO6+g)}2՚(S,zЬCG 'A LB{%oUta_g ea0 !U5O9l# /J~Ț/rԱ/qBzLnnfNI0HCnjs࿝-Zhw'HOENH AIt)z xBlIum.]U6^6|*c8,% nds@N|[n3! 8 T^<P hn-sJKƱ Mя'09xHa f=4lOzzyE3i]ɩ[HVN;"\,H~=XklFp.Kŀzo ̰*0dl__Uի)䜎՝= 3ۼj[SSWvjtE;XthGx>RۃO4x(>&ϑZRnBKB n X2h ){b8.1A%q;̼RtB`?Е=vbꡨ>VH׌T7}םwr@O_z1#1gYP\?;t̵}ހ5;{X(٪S*)uݞ*/=OxFq~_+4gTg2 =SC|CYή47J%AiVD ''9vВ7fv u3)bfEi,35xӒ!gvk]% OT2|pȳQD,}R Mܝ ǽ46^^ g(/R1c J^xʷt $_=@"!lW`Xu:.\Km/݄ K%l mu*!S0Be7,]5@Ӝef[#6U{W"'0Zqg|;>IR\BeU/Egt74 jqOiyf)=H6_Rvu Y[^bDZuف]drJE͈HC(QM Dsj1ߦX8 ofٮr/;zcOj]`ar'MWӘù&/<~Ql0pb6BWPC#;6kUV8P[dTqf0P{詝KTP&# # wa,+GرP8,ZTwpVboGo7"W?(lS+{o@`9PV\IasO?Bz~$gN/3 ]j#оxU>A>t T2~: &$1l }ظXf)6O)4nv?)S lq"\$1,:F +r-Ȉ7:3$I*oLbdqs=#aAKzpܑ'X6ęcԽmBJXRTk)$kFxjb3teW3?li,.UM/|JҦ7{8CZXOBOjþ|KD36"j}̥22gd@Ho=(\x#RYƀN g0z?Ц U|s, Ҭ8G"pĨ8 c6x B:4xc$P#\WpDdt0؞7TTo¶FRFؐ[-trJzJI2nX 0{DzXn@bs;CL%MƖzdJT =I#B1}~A5\a=p*r/ j3Bu瀇Hv}R ,7h5vDp6]IB3 ! *_3uQ4PR'p47}ʆFQ(=;WnfVMbj; ~wkr]rWOR"TJ)k~rSSbA`?8-Hfzq1\lB:'CidibPfӲWid"*"ou~m1)׀ CHXbR(+*2dP'Jx5">bwG,x@I{'VqE/33 d"ˊHGODę<{ϳ-)JKO:R\͙= MdMMrS&o$止ڰ &r[?jirҙ 1@x@EseeI/@eñ]>gb.#$4Ne%kqL)yҚaMJ:{K b#+=8G?0 1vy3#ChGL-At@ &^0}k29kwdPcy`e(19vcnA&87cB a.IcҨZd3J$8Svw0qAa3|hU!2P rh}& g56@@5jNǿϸߖ-_[< "Hէxx 0dlVH6fr $I}C9ݔso#+ _O0i獂daIG>z}ܥvģnZ*r 1BKN0/m%"az_N}׎o41Wlx W!kxRethTHwC`·PbE|AY2'DnTt-I hhe$&.FW7E*$\ I;`rBh̟RtHV B^5C%EXuOm1.GY^bS' 09v53ɯա^ieP!⧘KnQwUZMj9|Z-Q~斿5ϛOJ *Pn>^Xd9L *Rc]ˮK'z?~vP%ϭwîbeⱓZv{0Rkjm$tFy+YQBb'&pf|v&$f[\g>Pq]R<;?k꜆ NF qT|]gq;AljŝxB];pe|&=@9ŵ P_hC.>d5@.J%Uldjp6*/IS8} "wĪq2.dT-$w9AAh#+~PT7 *$[]߻ (xAɤNAN48ʈyEzG ҵ&v$,2&}CbSGz S@X-kvBFKXQgT`nЃvX:D)/qRTW$$Y E@81ƗeY%,QcY3m7E:t(;r q$':žxd h [O[ZglYo"Q҆UITÝn`dG:PDhr!aQcZ\Jȶd1S~u;/(nm2Eь*[!.uؑC}')>cٻ¬@2LK(a:CTC?^HjvӴϡrVTE1lwßΆPz#GEVdseO/ 8ڞNxv +rC$ x4C8"K S_ &42<حz21BSmg1iO(]vQ\nՈaEO}2SgdU|K p }0r1#IKt](ms0JĮYv8sڰabؼ_El4k[R꘦ɨHǺ\Nj8`<'3QG|+bJU%6JzG'@SVz}Eg΃Q?+#{L#q<ꘆ DZT(7?GfGV7lXPnK8"lJ2>1FOin3G3*ڭ%^TzV3SsR".Ė3  /gmpVS m-&Rt 6y/5g\iYMZ|HUpHdyRB6$N,Y1.>x&$姹V4 DᰁLu±ሀ+9B_1dAo+%5h%k %Y4E?eJ7שdŤG.:*qTK0*gh['mbK0*@L`+' `e-~Jg(0薫Zaٺu7ݦ4[ڧZD855)ɓY6g_M&C;ɰOŠ>*GY˳$َTQw7׬Hc$՝ݖa5-u7wcF6K/KEΨ"I!(풏U v3Y2WzH *ѫmLz4t36NpCN %jNTŐel GtsKQX78}fF.kUiBƚܐg3ȋ3 M#vmUAK?Iux4h? 6EÑx ?3ݗ dOٚ˒ݧIen&>SNWﵺ i{viz٣$HP °!P%:,.D d)`fmo0!>eP‘g}nZԖ^"e9H[SMБXu<aCJp`YO^qlР '@RN-mm\c4 UWLv C%4נ}^iy[ZJ]KOhr(LPASQ6j-=#+WvV"!5r>JPU-s4.8YEMpp ,Bt5ml8yIE+295 <2RQc~tzϓƦ-f,Es6y镸u)qH[UƊKNa:q8P[L%ƱF:>`֓[Fh ʱqCQjk܈݂A!#h6ֳ7z 鶌є4>A[C, #~7-JSr<*}<y*'Z+b:2%" E\뽲U ^zǁP1D>/@q㴩e6BǕr\ XԒ&T덄]0ӵeykbZ2|9d\ѵFKLWlsJ9Y8?\c=wтI\l˪)H>􋚉ua!pZNi0)/&NX7\!Ir(db:Δa|kjPpSG~%WORLX̀RNNNxvd) BF\#0O֎|?Ao %$eۖ6w̠55Ȧ&qmmh=Q5`C_xStv¨K_-eKoC@hhkƐvFIx sM;Ӑv^Gh["4}4%d])M[r}3˺:5.x~] q3E0@}{[񦠶rBX>ז1ɓݗ[)ͫ0;^AO O0 za:;Dl%U*a9a`ګh[lt%|'_JDh7H=n>d/a,Je1Kv\FĶ;y瘜24Xxk½sń_Ye$/ATxBÕD>S"Czbe~vtďAΒ,Q%  4_ &z o k1%m` bA 21E c7;)]wC?Oc݋̵-yV<w&*S%~|}{d:c M_8zLiu/*~]t1n/w}*;4SVࠅ4`=uWŷ$RC)+EvK[ZZwi *(IwϋPXqF4-@!<V]pĎ%+PFu~rO$]Z$ILo,>(~B 4-X/^@sS<4aiTW9F&mfaFp/+ڹ.hP ADڋ#b](eT:K`񾭚F i%cA Ԗo[q1qN>oձw!OؔT޵u:uV [gU_C='`)hkHYC}#y8ޣ pA@FwF`|[MY,n:L^I9&6AWф8F|47Q|fR534]nstq#+mdA[Z;=*m.ʿE= ftV᤻>w!>Vy@;ч ܶ*Z[V!I<~7W-b[mu{TR-Nڼ}FRNQb^@A8&~ A|20KUu^_=㲵/۰ЫTR۷_DL(rB1FQ$WH$: Ort3gfs/IaZؒ<#8*\'Y eؒQ1ot0q5PP͏|>fj"0.רci[q56%;rx N.NޙgncQ1Q7M\%EiʼnMsAU+RA--"ləTxU_j0HA;k^{m>J,+OcmXӂuWEQ:+ gUS :խP؆z) ,ԓs ePf bHaֆ]+K+P^qڐŤr}!'ݤy_UW>!~#ȓo)G)B?;2 ݬvcqshs%^YU5Ɗp-}م,?+~898IwZW\:c A6ŏZٝ.!8xgM c"v*[(OemN 9|L 5zވ6Ԩ3䐟0qRINgKPsK9x5jlO=Y^'ueH/;zcOʡ0۲/$TOc1K s hWW&_xDzğzT41e84 DK0j2N婂jpvAh>!OpИpRckCNe Vvb,2aQ6܊/|;Xf1٧L(P(x_.C 0 ˻AKUܟL9.aV;L.H劯vlgY¯H#՝\U¿0 L3#7u}5R4_ynph$yYH4 1X'ZDEV($. ry{[@d]h||*xgpǰ 0G[) ;{mqegwb@ 502[ 9Gk"^3E 0I^ yDH˶'MW947 ~ vzPB=^-n9`0[aa.G+L MeL˚gGjSrI&=TuuMd8*۶~.Ub5QHO.=RYWQo+:pÎ{@}.%s@^[0x ~K]Mo1IjKZ=2DwIڲwF̑d|Ӿ)[ٍ@60Jk#/ .}"q_،j3#mf(@5dFK$5!ɋZ0S)0} %c'\ќ &|inb0I|kowlSdݴQx5rʨ语lɚq`{Q]#kr?R; X|Ms}\(1J(*>642.2N hs"`B) F,>-7FXnmvi&y]w>}?z#}+F^Fa&1Y8x]y,!Q?CMѓi >A3GFysf%}Umq1&?l/׶e엔LH́nWg~zD{еJ .~0^5 "AMC͇їmZ8 w#vnBܥka>0ZFuOBKj|x`נ/fTn Lh¬ *L*X9$#4AH#z?`{S&ԜD"&Q|(7M0Fq$ʅ:< rp3YT=Q.੻S 7a" Bu})PTI\դT̲ՋIKJVos-_鲸6c "n}ʫkcUnø<^촱v)_/U!D$HD_ (LV?.?oرY[D,o;3.I7Ÿn$FQlzׇ}OuI5kܲmL@m8Y̙vq 'p1Y(B|0-4גܫГr/[N#3 2f͒?&.\Y(\7jGAMYgy~M43[sJ\B_MuGmAԞ:YVt}ZubUċp[8l6^wKmc5Di ٤_ <2 CtDNVBXtۚlL`Dn~d~FT%y ,ޭ[: r`6Ɍ#xN%8vBK_?fncJB\d)}HxZ^@$ F&˙kǒ/}Lb g*ϝ?Mt(F2+-B<è!sQ?K}zY{箧( /j,/!fgţ6(EfG{`pD0܎?G"k:μ㫘+roÈ{/*U 0{n͝иCXƬ*lJmĄ K2s{9`6Wxe3F(LKǗO޼rňR79ߥv+ ;Q*plUE\L&2KCTϴ+ { b~B㹘I{H\`\Vڙ&ea1S[XLQdrb${leߓ ]qs>Ik'S拾cG AN8u򦣼6AKg;-~+̒#H.`{p>Mư y< k]>*^}jDNV(Zc6HW>pN wwxYGi(V'n |~~A~dI#0)C((.QI(M+PbVӌj̱ZWL.3x wK 957Lo.d, 8/ {בNuS'W?qbg#Ӹ1i8r3oً&^J|Y'gBI7E/"E' Bi/3,,%_(If}Ok| 7uT"y9Ķ-b!M׼.ea f0V/59i_ ŋ{Ȃbn8. ?w`l2ƻƪ3>_Ί֐M4)Ҏ߮y͚`G} aaM;O+ >3jSEڻlq `@sO>:) %ј>T!`%y{WRSqL&c$:7"|^Nc|@ɈXįyEqXCShq!ʖW?DKGT}Х WVsN"'0z}z;^8-Ҍ[c]#s{r eDf2v-^ky*(,6K3$v,@ٝz\`Ƹ?̷*/b(ߖ󏫼݌Ѓ '2=N`IT&JLoؑDc({^(mu͇ͯ,!Km# c3=ˀ:#\peԷ͈HOxl/4&5lNw |zW4IؤJ$/W;p,_6WxR-J!y~Df!pk_6ep>*]FőFFxDj4-Xx ڋ94WK)nQhF~1 5+ 1]$ meblz7f##8op-lXXPxDk4pd#K Jsxf;uM)Y328PLPXM ]Y _ySIJǒ/QcҶzUvժ ZXD#=%_5vI¾~{}]UR` 8]NJ`jI'2_  ˧Z ST,kݹUjz<7ZJگJgcdк᝻GgfI 3H9_Ɩ%鿜Wa/WCh05p9r0M*)v4<j0A7Ԇs%h~W6Tip&u# wƲ8_eMs1k y]<'U :x&Sz.xD+%V~L{AƚV:44F7d śQʏ2k1Czy~޵{ǿo]~޸o^+xoKNKev$DguqX9&Lf`(~n o;H^)MXXB8u_80oT[ K<<<"Y̢*E5z=>вF VI Wuvq%_vu5;Tj*`pK44A^cY{[Um6b_Q1*9@ N̢@(2vj^1Lwuur;|Ix3^XXr't &ΜrfCOmfΔV@|q\yxh$#ٔ,cCi|5D '~OB[s []lb?Nw1zzoGq.zCwm.]A:6qQ%P#ǡ0ct`v,K]@ yMBE]sFUNgӶķmc(^a\4${`#~v ی㤏E~Eo̧ # RJJ3|"y\7 R/V"CJzp&nܨcUwf< 3;k5ȔmiMfzYh-KSa MMzޞjvΙӾ4y^tCaRhg1+W-j8TiF~[5Hqe+A6dz5x GJcզvt TFÁAu\icbӾ+%t8$ \-TXEV41j,:g& iմ9󹄱^"9/F\7L݅6pfh,BJvS6,Fc~c~ g R Ԯ\_4C׾ѐP\%M.2&A*Kb,(5 lRp *\]mAh$קSbSRq6yx g&lQ wxwLQ5_u]p|\fo'om";=F𭺧(yĘJJ/ojDϛqc09ABMgbx (ߘ: ]yuvALԑ<^>ڀ"sktW7s694{5-G2^ۏ^؜E|> j/ׄWo7%*ad^򱴲.\1Me"[e=?r1&rڞ5HFJ,=Y!1eL>)BPZJiO yK/ڗ˥J`:٢:l^"_[QNPátk#oKx#aA.d);{/^H|†"i60Р!J؜-gG)˖Z&k B1t&ފq#H!}IuSqg툐t iRMNi 9PhT @屙=KsqqJqzbgFvCW hf#/lI+|POXEK`L怮UwK0-K+%y5Ki4Ghzǔ-g\.1P"{G,W˳%LE^4 Lje^laʤ& Uʉ!1˽{H7~n;nE_O1cǧlh΂V2*> 2j#T@ X+=c .ɈCOƚҮ!v~&kP`Sa"J[u?`%T$/wX](6R^XkivOčUnZZ;Ws._~ֵl(Y5=H'NaYv yU]`UbI}ɒ'AZAM `V@2Hv#:%PXX:Qr V8a5 :a&ө7vgI)d=hD7*x| !sCZȵ/YeU]k8~M[On]x6 xE~pv? (?&F-%m%B/;I / IP:1./;zcOʡkLn=Ў8F5A -$i3M1A$lcb I8r*0ZqPSL&!Ut"<.ٟEg!7Cq0IJ[^`3 2{S 2?0%wPvc'A =w݄! ߠ?O/SUqHihhF2f0CKcbJFMYϺ^ sT1s[z9oK5%4]WiaBv̕; %Sugjn냠~UW`029Vq:N ~̏CO#n֛5_bCWe|YyRƬq{fyUƧ;Dn7%X'(ߥpOrpWqyW9tn4 ;FjY6<şAQ; >.M<.:8Ckaܒ_ErUeb k{RJ疻`(Į\R־,pT?vPp eGbT'bo`)X]^ MLI+ (qi&7?6[IٴţR P@uZX(Qө踝^h C7:Y)7uL zTIԲn"xd5/'59~s$Ӓ|7~\1㜄PL7A/>Hv꒾!i-)J ɳ̭GAp"YAVm*Bo T t CJզmX'{>SHkn8 D|q\rj".3t|: _O_h/,R鞹rE^Zfiz XF֛"|^CZYXLQK$}SCQyQ7sY" @˿ۺlvsΌF齲7m[וfm(h%'"=~|bu_i^ްT7x[)FUv<\nv`eyݤ?@;Uhj ej*z.XHS)I$1CR5]%Z `LDZxGuAЦ(}.Jwq2!޷\_x~ydPޒ.t Ǻ-Rv$S]I!i>5;D'tě |v2nR~u`GA~8~z\bkx1 U8٦Jg ɐ/@ΐ5{Q(fgspZvi$?CnHDړ<-%\MZIsbl;#` E`BG׿cvfU} $o6r{g YY$_"=NU.l0<) `~~S͢%,F)^O3mgE#!ϴbY_pHf^ jI)&B e>Ƽzc#4NX/Y26AC{o7ޚMN\x!U ՟^X?Dy7 de|1ؤ00qC*uQ>2H-Pw,QY<ɽ.AWj+ eB^wn.ŔGpZs,sơ̼p+(vI4&.^Jjfs Gi"~A[=3H](βlab16&ooRDHZ.Ddw1b~aD:CGA83z Ÿm`ٚhVJC[fngE)7HM1c;fإ+&G-Zqժ:\ˌ @=[jb,ey10nyTٹ@I?$0E?j䥒i/yFPZf+P癋 S1/5N<ʄB,o\q76~v蟯̙htJrc= ij[7v e.k>|p 3yr}R 1j)] Ef sAP' x3R# kYJ!EcZΗ$}"``9sRO)ﻍãQٷ,b)d>@VDuM]P角k^t$(f R[?$.aS?4=MKI*u݆'{ET{Ԟ[51'7{J;9韜|rrtY̲Yohi?XM}+?,aނT+q>Y)UJl{˜waL2j(h|bQSgukzpE X[5b6#2:i|n/NYWEϾ j)~¸댌Fz)_ hQ_bc$SW!N?ɤNA*Ʒ[xM 8[0O(Mk·Y"}jӽpP*G2H4\ G5k42 N*ZrɩI܊N Gn͠L'OQ#5sucA;Ẍ́kٿmp\h|Lߕ F_LA:[?ڗT%&ޛ\2`e#s^Ƌ1kTMl"d~sgyY!{Xfeȸ ]B„6\4Q&z"%tS{"1_+$u _/ƥʯ|Q)w3o߬inٟ e+FİeX%5tgEP"jjc9GW^8[lhY lCbJnA#z/%M?*AO gx4;e4}! 1ۑIU!#@ 2))UEՑC9z|ОSl_,9dlO=#4eFo3pjlqN.))ݵM S9HRN jg3e gx%h댁tDQup S`Cv=@9əzvגm;&c!喇D2E56aZUƋK# t=\~EG Erb%".1%eY fҊ(m: x% a<6Dљ< -Κ[WCJ9긬@S*<+*p; f.C.{rS+L }_) j ؃uS.. 19C*Ɣa>v%nR>׸<yS~ WrP9?q}6}&Y}fwυ 7z9µBɗt >#:GF?VC`Tc$+}(K;`諒/ep]:d?0~Z,_b9k~~&\Dl<|3jDJ0x-L#[Z&rۉk?vmLI}T\8̧%ލ^h8L@D'Z1wBJ~wp a_PxoP[}DC3(9>#hD Fkv:tayk)oxr][A ;Ą?!nPn9 M<_d'q!̓ט0pI X ~DΎ^ej>/ ERb4.*EKO~*ͳ//1M)̇\-6OfS\mHF]9zEWS10x*TP'|uQI>W$q[vU=.']K񮉀L˾-gi4MR6w fCr-\GҶE'fִ99/ ²5~muN-2eVVs00S =q7UgP7)Hڶ>\V"Vy8i그x;r9D9d[s5GVܞy{ 6G W_DHL ?:(JZsj{uc@Vr.?HOm/ҭ@%,@*9X{>.]ψ26u)`& Guӏ; VY  8,gi>8%~6%t{t`Zny)̤*>=48*4Ej 1TH5כ434~N"< *C!_mdK㛪{c{(6W]qF-oit32*<=??=?@BCBBEECEFHIHIKMKMMNNMNPQSTSTSTVWVVWWYWWYZ<=?=?@?@BCECEEFEFHFHIKIKMNMNNPNPPQQPQSTSTTVTVTVWWVWWYWYZZYZ;;<<;<=?@BCBCEFHIKMNPNPQSQSTVTVWYWWYZYZYZ]9;<=<==?@?@BCCEECEFHFHIKMKKMNPPNPQSQSTVVWVWVWYYWYYZYZ]Z79;<==?@BCBCECEFEFHIHIKMNPQSTSSTVWVWYYWYZYZ]Y7889;;<;<=?=?@@?@@BCEFHIKMKMNPNNPQSTSVTVWVVWYYWWYYZYZ]Z89;<=??=?@?@@BCBCEFEFHIKMNPQSQQSTVTTVWWVWYYWYZ7898899;< =<=?=??@??@BCEEFEFHIKKIKIKMNMNPQSTVTVWYYWWYZY89;9HCEEFE%&''Gwxxyz{{||~~S--// 7878_jCBCECE%%&%&&\vwxxyz{{||~~m,/--7 8{CEE%%&%&&kuvwxxyz{{||~~~-7 BBCEEC$%&&quuvwxxyz{{||~~,-5578BBCBBC$%$$&%&%ttuuvwxxyz{{||~~,-5 7BC$%$%rttuuvwxxyz{{||~~,-,-5 7BC$%rrttuuvwxxyz{{||~~, 5 @B@BBCCB$%qrrttuuvwxxyz{{||~~, -57@BCC$%qqrrttuuvwxxyz{{||~~+ ,5?@BBCB$$#$%qrrttuuvwxxyz{{||~~,+,+5@B$%%oq-rrttuuvwxxyz{{||~~+,+,45?@B@B##$%ooqrrttuuvwxxyz{{||~~+,5?@B@B$#$#$nooq-rrttuuvwxxyz{{||~~+*++4455??@#$$#$nnooqrrttuuvwxxyz{{||~~*+45?@B#$#$mnnooq-rrttuuvwxxyz{{||~~**++4?@?@?@#"#$#mmnnooqrrttuuvwxxyz{{||~~*4454=?"#$lmmnnooq-rrttuuvwxxyz{{||~~*)**24=?@@""# $#$klmmnnooq-rrttuuvwxxyz{{||~~*))*2424 <=?=?=@?##"#kklmmnnooqrrttuuvwxxyz{{||~~)*2244=?=??""#""# jkklmmnnooqrrttuuvwxxyz{{||~~)*2244<=?=??"# ijkklmmnnooq-rrttuuvwxxyz{{||~~))*)12<<==<="# "cjjkklmmnnooq-rrttuuvwxxyz{{||w())*$1122<==?="#"##Yijjkklmmnnooq-rrttuuvwxxyz{{|j(())1212y<=<=="#Hhijjkklmmnnooq-rrttuuvwxxyz{{V(())12cr;<;<!"!"-ghijjkklmmnnooq1rrttuuvwxxyzz5()()DR1?K;<=;!"#Fhhijjkklmmnnooq rrttuuvwxxyR(!)(0012_l9;;<;<7!!"#Behijjkklmmnnooq rrttuuvwuM(''())~01Zh9;<<- !""!"(@S_eikklmmnnooqrrtoj]J/'())9yܽE/0012:Xq|dC9;:!"#"#$%&'('()*)*+*+,+,-/0/001211245789;1!!""!!"#""#$##$%&'('()*))*+,,+-/01001224575787889;8!"#"#$#$%%$%&&%&&'&&'()()*++,++,-/0101212457787789;:!"!"!"#"#$%$%&'()*+,-/--//0/012245457757899)!"#"#$##$#$%$$%&'()*+*++,--,-/-/0112424454457757898'!"#"#$%$%&''&'()*)**+,+,,-//0121124245757886 !!"#"#$%&'('()*)*++**+,-/-/0/00110124575+ "#$%&'&''&('()*))**+,-,,- /0/0011012124544/#<=?@BCECEFHIHHIKMNNMNNPNNPQSQQSTSTVWYWYZYZYZYZZ;;<=?=?@B@BCEFEFFHIKIKMNPQPQSTVWYWWYZYZ]ZZ;<=??@BCEFHHFHIIHIIKMNMNPNPQPPQSTTVTVWWVWWYWYYZYZ]99;;<;;<=?@BCEFEFFHFHIKMMKMNPQSTSTVWYWYZ]899;<;<<=?@BCECEFHHFHHIKMNMNPQSSQSTV WVWWVWWYWWYZYZY689;;<=?@?@@BCEFHIKIKMNNPNNPQQPSQSTVWVVWYWYZ898899;<=<<==?@?@BCEFHFHIKIKMKMMNNMNNPQSSTVTVWYWYZ 7899899;;9;;<=??@B@CBCCEFHHIKIKKMNPNNPQSQSTVTVVWVVWYZYZYZZ]Y87889;;:Lds{mUCE FGcƀǂjOPQSTzѳ}ZYZYZ487889HvSCECE_ŁƀǂȂʰgPQvܕ{YZU378898LWCEeÁŁƀǂȂpNPQ~YZYZZYW478;{ FCCEEKÁŁƀǂȂʽVNPY_YZX55788VbCvÁŁƀǂȂ ʁNNPPWYZZY!55757788jxCÁŁƀǂȂ ʣNPPNWYZ5788wBCÁŁƀǂȂNWYZ57}B CÁŁƀǂȁŁNYWYZ577@B ÁŁƀǂȁ MMNNYWWY5#775~@B ÁŁƀǂȀMNWY5/~~B@BBÁŁƀǂMN VWWYW50}~~@@B@ÁŁƀǂɁM VWYY51}}~~@@BBÁŁƀǂMMNNW545}~~@BÁŁƀǁȁM VWY44545|}/~~??@@ÁŁƀǀKKMMVWVVW45||}~~?@ÁŁƀKMKMVW45{||}/~~?@@?ÁŁƀKMKMTVW245{{||}~~=?ÁŁƀǀKMVWVVW242454z{{||}~~?ÁŁIKTVW24yz{{||}~~?ÁŁIIKITVW224224yyz{{||}~~=ÁŁƀIKTTVW124xyyz{{||}~~=?ÁŀƀIKTTVTV12212 4xxyyz{{||}~~<=ÁƀIKTV12 wxxyyz{{||}~~<=ÁIHIITV01 242vwxxyyz{{||}~~<ÁHHIITVV0012 qwwxxyyz{{||}/~~<<==ÁHTSTV11012gwxxyyz{{||}~~w<ÀHڀSTST0012Vvwxxyyz{{||}~~d;<zČHQST011121IW;<<;UfFFHI''('()(Knpqqrsstuuvvxxyy{{||}}Y0199;1 L[;<<;<;!!"&#Q^('(())Knpqqrsstuuvvxxyy{{||}}Y0101 ;9;;<7"!"%M{Y'('(()((Hkpqqrsstuuvvxxyy{{||}}|V01 3;;99;;<. !!"#""+Jcr{~oU1'(!)(/FZekpqrsstuuvvxxyy{{wqeQ70/00101 B ݿN9;<9!"#""#"##$#$%$%&'&'('()*+*+*,+,+,--/01121244545757 87899899;9;0 !"!"!!"#"#""#$%%$$%&%&'(()()*+,-,,-/012244244575787789;9!"##"#"#$%&%&'()*+,,-/-/012454457587898!"#$$%%$$%&'(''()()*+*+,,-,--/0100101224224545789*!!""!"##""#$##$%&''&'('()*+*+,-//0/0/01001122122457557897'!"#$%&''&'()()()*+*+,+,-/012442457885 !"#"#$##$%&'&'&''())())*)**+,+,-,-/-//01245755776+ !"#""#$##$%&'(''('()+**+,-,--/-/01121244245420#=??@?@BCBCEFHFHIIKMNMNPNPPQPQSTVWYZYYZ<;<=?@BCEEFEFFHIKKMNPPNQPPQSTSTVWYZ]ZZ;<;<=??@?@@B@BCEFHFHIKMNPQPQSTVVTVWYZYZYZ99;;<;<=?=??@?@BBCBCEFHIKMNMNPQPQSTVWVVWVWYWWYZYYZ]Z]89;<=?@?@BCBBCEFHIKIKMKMNMNPQSTSSTVTVTVWYWYWYZY79 ;9;;<;;<=<=?@@BCEFHFHIHHIIKKIKMMKMMNMMNPQPQPPQSTSTVWYZYZ899;99;<<= ?=?@?@@B@@BBCECEEFHIIKIKIKMNNPNPQSTTSTTVTVWYYWYZ7898989;<;<=?@BCCBCEEFEFHHIHIKMNMMNNPQSSQSTVWWVVWYZYZY789;'())/FZekpqrsstuuvvxxyy{{wqeQ7/015EQY\``abcdefgdaZM>89;<:!"!"#"#$%&%&''&''(('()()*)*+*+,++,-/0124578789889;0!"!"#"#$%%$%%&%&'&''(''()*)*+,-//01122124578998;99;8!"#$%&%&%&'&'()*+,-/0/00101245457898!"#$%&%& ''&'(''()()()*+*+,,+,--/01242457889899)!!"!"#$%$%%&%%&'&'()*)*+,-/0/012457898' !"!""!""#""#$##$%$%%&%&' (''(())())*))*+,+,-,-/-/010121122457875 !!"#"#"#$%&&'(''()*+,,--,-/-/0 110112112245445755776+ "#$%%$%&%&&'()*+,-/0/0012424542/#ih3266<>?AABDDEEGGHJJLLMMOOPRSUVXYYXR 9;<<=?@@BBCEFFIKMMNPQSSTVWYWYZ69;<<=?@BCEFHHIIKMNPQSTVWYZZ#(789 #$Fnortuxy{}Y*+4`r?@<##Emnortuxy{}X*4_r??;""Dkmnortuxy{}T)2]njkmnortuxy{I)1Vb<=8!"'`jkmnortuPxp.(z07B;<4"!"';DIKLLOKB,'((OyY0016R^efghie[?9;:!""#$%&'(())* +,,-//0011244579;1"!"##$&&''())*++,,-/-/01124457-  !""##$$%%&'((**+,--./.0/*6<<>>?A DDEEGGHHJLMOOPPRRSSUUVVXXYXXU9;<<=??@@BCCEFFHIKKNPQQSTVVWYZW69;;<==??@@BCEEFFHHIKKMMNPPQSSTVWYZZW#'88;׆&ICEB"%&JU-q8{&CEB!%%Ve-z|7'CB?!%$Uh,y{|5(BB?!$$Th+wy{|5)@@? #$Rg+uwy{|5*@@> ##Qf+tuwy{|4+??< ##Pd*rtuwy{|4,=?<##O`)prtuwy{|2t==;""GT)gprtuwy{|x1y<=8!"(t/(Goprtuwy{|U1=H;<4!!"(COVWXZ[UK-(6GNPRRTTN?/01=r}D;!"#$%&&'(()* +,,-/-/01122587991!""#$$%$%&'()**++-/001122457-  !!"##$%&'((**+,,-.//0/,6<<>??AABDDEGGHHJLMOPRSSUUVVXR 7;<<=?@B@BCCFHIKMNPQQSTTVWWYZW 69;<<==??@BCFFHIIKMNPQQSTVVWWYZW#(88; ##,*rtuwy{|4IbcdfghikmnpY??<"#~)prtuwy{|2GabcdfghikmnV==;"#n})gprtuwy{|x1D_abcdfghikmO<=8!"/6(Goprtuwy{|T14Z_abcdfghie><<4.!!"-g}q4'((6GNPRSTSO?/004AHLMNNPNI;99;!!""##$ %&%&&'(()**+,-/10114457789;1!#"##$$%&'(())*++,/0012245787-   !""#$%&'((*++,,--..0/*il32 ;<=?@BCEFFHIKMMNPQQSTVWWYYZX69;<=?@BCEEFHIKMMNPQSSTVWWYZ668S~`CrȺ|PYX57|CNYY57BMWY45}@MWW24{}=KVW22y{}=ITV12sy{}<þHTT/1Pry{}|X;oyHSS/0114557789;<>#oo# $JǕS$ !#%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%#!  h8mk  RvyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyvR TUTTVV}\] cc ff"ee"  l8mkSSUU bbees8mkddggDisplayCAL-3.5.0.0/DisplayCAL/theme/icons/DisplayCAL-testchart-editor.ico0000644000076500000000000040342613230230667025557 0ustar devwheel00000000000000 xv (x@@ (B00 %  ~ & hPNG  IHDR\rfwIDATxU?~]`YTҋ4HΊш51ߚkb1_7Z(J^A Q4 ly?s3s]xȾw߽S9gΜqT:N&绮t*J]:ҩt NS)JR)8NSp*J1NT:bp;,7񜮬6ຍ 纮H^]؛֎Ʉ|A> ?3D@RoWFrO{XG+"*iAx2g5. & .W:Sҧ'_" ~.^ G/S4ֿ.vw^hj_f9NA W>U7JQd_af?cc߾YᤉJT%m?9u.`]Z7mD 麡|$]%م De w qE<,c]1 * vli /.n(Ƶ d2\X>vj]bR/!X5܄ 4Ca{`djO`Ovq`Gz$;b.3(&MJU0O:7Y֘O2'WscTr]𤳠l"b$@3'br¬*A]J_dA _*ԬGj.HPBƉ( (#P`_ۜI&iM B;}~ 1a+ $UIT1]<=i#-ogo`w6JƵx8fNQI݉!H'8b Ie[H)5fZSdL" R@.$,?X3,P*nXT`y Lmk']%Eϟ &E߀IjogG e_7Y,xAY?v0`@_3M=18v fs.If`2D,-++RT]*S5Ȁ5E?"a{ڸ'Ȅz:&$Ak"DBF*-ڠg$]\$_Y3P@ץ?S"!(&9Y DxON75pIy &<* ލ$&_+*# A;PnPhSASdqP貵@0[aCD*복-ޥ3M]TR" $jҋG믏*%fxE1C8cEyVd?8qĴ =kd62ƆLЖDr4d b)B J2%D=ɤ)!%55pb:=MZIaKHnBHD +.T fi]ࣽy8m&40A2Jiex4398ZD`ٔe[4P?eYL)(YI'B)e`߈5rp߰ŝ +"j"&HjVYjKE@ptqS}p`!O8@.EpDB\%SnphOZg"$:D%pө62S]!4QTXmJFJVSM1-?چExI%4&*K?2@*.(m(#d!JqbK :N8qR7an%60 Љ4!<ӋꜴ D1>+d&`X-B1" \=cvfbSjK:*YHf|̐2mUC=stV'-A:6mu,% *[ t5!KB[yйXi^0g+Ȯ0E>%-IOʼ&O 'N[/;'5v]\ w{Eun%u.1r2VB 3HL**9.K4‘wɀ5Z4$9NE*OEx%04j K1C @bybR*"UMD+XI Z=$!hQGH V]4/H'0| G춀 LKM> @:!ucUeA,(aQU@cHȵN=%)bH<.v םIKפm-ZD[p=spp%!PH#e0BVFސ BvIV |c](雴iQ8"{Zm66j LaoGMw.ӿ=TY"yH_q(zb e@B¨j}  I.dTg3+%]XFFRR0U>!V2Ao*)2 k9}E% ؃a#x%5Ԥ*c)vT&$T.M\L'1И^H)B^R>6p\kS; X;n2ePI)޽fͼuӨKL8*)VSI D61Nм$jcVRWQIImy,vi*u'Y-LTI;=9NR(9VEE>=ݻvʽR1}<[[ d*K~#mڴ-Z@f͠yиqc4?رcPTTlٳv;vW_mf$@ɴm S5Jwt҄*3gue+unϳo%Qt#fФI">ʂ@{@߶mܵ nBA9X\Q]!D8=:u=z7gʶDUw+zW_}||>T'pE(^rC}`ЭGw*$n_[O/+/ZVHR hyҥv]@ezӧ`6a[.U#،2:lټ5jԨ 9oڴ n* NFs9lzuY0h `Yvex"JsW7Дe%Q>?1.Rh$3g΄˗P_;H&N2QdW3zַ)ֹ?7Վ&i\l; lƧ*O\"x{P\\L6% iZ`j?Zn}L}O[@Ι55Eˊt783+U>cL?G(OZOmU25FUPftR~B]祮\_=s|ݪVof[A]:W]yv9>_|E(8P@ #aؽMO?n t}{Gig_cҤIge=z[=}iJe@Jʆ;jשm7fYbmVtZj%|Vu/W%˜{>2'ڮt?~zXB%hcz7#GLW,Y2d$ )fJ=| l kݭ[&W_m{l;eogYʔyvw},oqĈZ^˖-zV-˓9$(_:e e)DQsDY9}z- zr:Cpa #. ׾_~ 襣d&?`+;SA?#1:Iqq><쳾83 ?KK+G@' TrFL3fK/$Iܩie&M(ƋA8l^ZeP%a5N?܇.f sNx뭷ML(p%@Ν+UvH.]3uILu?oNY aö3Dx]v226o .gDw7/L )&M}ɹqy 7b[)J< :Wa/ ]-|R13䣏>j%g $ |%_AZ) P5\l"b*.XWNȃ*3C|WͤU./\g~ʋ*;@CX^܅&_@?82l3t 1i^m2q @ޏ!̞=[EL`U!T&L_Wu`ʔ)I9ACVO0P`%D@-Ƭ;} M8Ggғ ̙һ,v흑EI H@NA )$T&Cӧ@ǑX.G )fw6`;S@{DLG)𝸁e .eRuC @T>ʌ9RC+ ;*L{G[&rɓBm\v0b?#'+aԔU&8h=iZ19Xr`pGd}'wm>$K{oxQ'-ö6.2-6=3iԩSSVL p#`@;u@q{]QmpyCMkpGS"`tV9' X :ƅ;o]{>n p/ԢH؝Ք قb2;ig] s|@A @ OUܽ~БI]9@:6XIy\b'F ?yFjG:q)3<{~Q,*! p)i4*XL>KÈn5A"QhdG8 ^:SA@L2. _ ]zY8 )Ѩ,=/T42GD0B*H ݫ 0g wa}/. pIKֆLKT@iicv"b1(?ٽ f #w0{8V# x&뺑ं ԩRHF%1+4bJ L9s1@nd:@Cf yv/A.ƃ{t+)Vz;4>--v#49bD$UY]n7<md2s=>ڥ /|ꛩ @Uez'6.TP42|nP  p"(3 =|28(ڨ68*@EDn`qաfduL:G{%[Z@AA#cmĎlWU@(r<wVu]A 10-L2 =4A<&4@5]ϧndA52.9{i;^U (i\!s0ߍ݀ H%ĉ#AUpK\< R.Ȣ}-]6V;A@aum/& CY|'_Xa=2p@9Gb%=84i)򍀞Wo4 YlĎlw2ys-ۀAqz{7wU# abꑩ \0MK:_7\*"iBxF@QJվ '@،\)$It3PED0ʛk$P04IUHjZ\Vc {mmgZ+\wBa)"0 Dp,0-/muRs}d't06SA{1m3PE$PE&CŁ^7Aer{ذaL_ VSێ+\U{OqK/!@ tfG@Tw B9jKcyQ°*쬊WAm FrBPQy ژ1xQQ} Q"1@^lo dh(瑡C+ @]܎"U~p~$|{量 !aAyW8VôCr%^\ٕꬊW@ ^Y|'WT^Re;v (N(b=PfjGe[@ѣpWnEHM@ÛQaT% H"戀 AlA^QgUDǎÒKB pMZkULBxG(/j@ԫWQ p%ϣ Do؜mMD•9#:пSNdD8x ^JeUW^~q) sNxgCt?B۶mOyd?<xjZ5 .3*D=L",ֽ{whڴ ]voPJnEq.Ν;wy| Rtg/n~p;* k׮zHFwz8<$- SR*P[`!B$$XĿmڴvE6_%;p2 q A (nΡL]٫@c%yVB̍.@C-sVDuLԽ>ٴ d}J#$rΕ>EW_oCxҀE# :暴2|W sÜ9!*89TV|r@O h Ǒck.мys+a:& ;wwY/ηni$b@3]Wo>#1}u!v 3{~µ?!Cy? kxzaV /hy֩ AB s,iłYu\رlJw;>dd.[#%J JDQA:ݻw*d 6cؾ}Gnd$wQPR  N:%1x2O_lVx -[ J7CkcJ*0}F@ςɤfnB%0:άWԮ]_QTVd6p&f(<%YoCGHtuPz 4iv"//O҉]@5ėεÇ޽{aϞݰu1kG㔨EYH?Vtf кlB94h(iĥ,6| W8mtH [lm!|iQU.C4JD'JHYY6oZK [R;n8$ trVDU6 "G ƥHpjC]rB#/\v:ݶ%#i\Ц3m?##iªXZZ}1M3r5m[F%刾rM z&koIp(~$"YHU@ #=.j.zl@\1h2FDS'l$lGV˳t }HT\"ښ=+'G` K{{\z}cϟ -mgk0$C`d,B ť!@05b㉱_є"4b ds{lv qi>OPB5T:X~ #Mb%b`aЬЂHkl3,]T2hx#%g*Qzb+O:a=#@LD4 YkJIO\ JjFiYu P$4tY`ƼRl5@cPf6.lj"6Pڠ25[EdVik3 tIZ; pL,YipAq= Qvc ggFGZ9Al+ "AT *W:aC FioRI" .2DY|Oz(J" FM]޽,&`k0^tX|/`~#A(,$&OtR|uÝD U;HAԀ"@T]mX!-mI7]v]B )R{Ķ\L:Z-ص".$JCJz-еq*&Q;m e#\&Li؄Bnhpp=QDǞ.g0"J[+^Cv˙Sg tǵ{{ O@Ʋ!a=<8g$YW!(1$7(tXG5 {bA>Vas"ڤ@6b-hON$OS$Yi4*sۃPAv!QXCWyJ,BDDS1%h`[ I\ Dglz8J - yCCC}+Dſ6ECbt+O/\}HI:A8sYTa1M A$Qt@6 бf7ՐmD5URD+,|?UGo͚ @?Cb+X|C,9)45J?X+d;%N5Ex+O VrRsv!g{âGe;1ةn;1ZhLZP=]5DDuT!5tiAҬ\I(dZF|zS$ @K8ƒeb3RL`΁m;B歡VV9@vnMȪ^s*mU%ʠXAɑCp]Pcd?۷BWǞQn_C`LFո umhժhQi4j΁P{&;VvؾWߕ%pv.ۏŽG`۶#yaHA}b^ f rĶ["9 7$ǩ -g~k ,"`zXBxkkPJ@B1>"#D)rrIа{oȪQdϕ+߅mwހDiYWTP\«t;qs°aC^g"dspذ,_~{K$^${zO1գY/d?2hsat;_ sT70h+wFǓ.ɔɆ/N  vTd_|:غeb Da_zEuNIQ.Ƿ yԩa큚R㳑{Ԕ. զKL5}zG֤Oyg@^PmMX6h[~8{A^l{%]O>>(:?4Xr#24pZpםgB#J>Unj 3zu|ǔ_|%S٘|sGfd-1@`ѢmO~,tXT<Χ(R6v֭@c/EW6Vl)NYblg6x^n^t%leҀ' < 8}o ?U?AmGlLV*Ħ'AI|Ѫ{s¨6?3^<_xCRIv۠q1-^~XJ0fL`7tXk?}.mNtTA(,Ő()OIG*wRVu63-^uT|IKi>>w}Æz%z5wl# (,6Y8?||,p=">A߁gKu=A *R' h1Lo7o |,LP<ᗗN~qM3'§-u+~hФI_r#[7!%v iݘ5kvjpf3 hFIiܡeݬ6&/pCX}$vgȺ u:). W'=P]}7o~{{tooرv\@-ySQ[U ؎r5;U 3 PMM4M ԫ~RpqlVjw@XxghU`'I^j?5׬Կ"۲^hc`@A7U"Oh;˔Q!Z-q/^ p~jV5ABU|NK̸ ]9 0vzrR} rG 5w2o-0t5C!S_PT`38@*io@`~P3y}fD<~ Hnypj yꍤ&WY:R1@«S |p'\΅9 @51~ 0v쫚o_B[zyiWC7BP. pz]4%ˇhђ}M?gΠS |:GݏmJ]B$X:qZ܏'\R?{"@ c\J8$`q;ZQ$yJ] B.,7AAY"cV?I2O#&.f@`>/\L6g>~_,?[O|> ХK  $0fAd'hF?H7HUIC[*Qk=g⊃x%'u#`"D=*/R C@ RdK(d>ѐ 7-9) 06iD?z8/ FH %a-9]Ox0=P*Al&^#_e7AI׷f3/ b%u=/]`P@2 d@`/(( xq A`>`Im/~lv/A ?)9k؎ K#ڃy#<ܞƼ- 0vF_KHß{ *{DeQUc:uŚ7KÞ[DHb/(GVP_}l͜93~ 0&QB] K @,} 0. OArdRSh Zq BPL9PF1c΢G*a9@s@$t\1)wk8b)/7 3X ЯK,A5A?uT( њěra@TJ4NC8=CC<9`GJ G駹zŅ!7 k"ʎW#ueisfSjf.9R\`PPe'X0m6-C@mǐPz9^ x/\HGPiљ Wo~ha~P~5R%0~jyWyjD CWh HJg@]wOl_/XAF>YݏA6p3~1~ X{Aի1O?=7-'WL@|ya@ w§ҥ{m:Fw,ߺUs\N P+s XulA+U۾3#3r,XawUx-y#xV?Ъ p &Bs…)@ Ȭ;lD6A1EEA̿cK ʅ#,QfDL   $J7'iUZ2./N7'R>E2vmǃb?|&9a[6LPy26ϝ&CP /5\rIKmӧoެ€EPS 2ftHBPAAE@A!6Tz=xxs?@@Xy1ܰh7aVS})#y0(?V +nJ|DeG^OU pX9'kacOFdy8Ͼ]03[rX"C[\u*6AٍŒϞ# <=OK4B|/26M|=r@# 7'Eg.| }T)Q{n::Ұ9 nFMTYU<^x|EaBYl*#Fa}Oq3|`7fY=R&8塞t h>fùMcSfU xk81,z>,2Jd :"\J2qN647 :t 6wT%`(ؾbl_JKƒ ZvaF0lXҥUu@>;3WvBiI 7yn$0w ;DZ/KS:mvfyQ&Pz}ˮyf}' ʡ(-+c`o7-gwP0pb_:W8AAN^-߱n򚷀5WrjCVn.D9AB(9t#۷_ރOJ5&:)V6ٵ.m[ 7 Հus //ĵ,>| P^Aqq9CAAo"e!l/'y%M.m|RTԀȊk,5,<=CG!5KdP?:lbD%k#MF2,#6GbTE ѕ EIl{8NKts t=Бڡhd q<3S$.zzڣe" FuS yi . R+)-a!x$ \ H |?)a$. Ce@_'`Xӄ1W䢄gAY14URa RTN2*z EЀc02P"y:}CTdTS1ꧩ$xnKBb7brVHb :9d(萦i5 t|1.9ukolaPMºy0mԬ!AfFզ "4M Twa0 TANQO[#z>-߷r#JMѧoN%B|,,˱ͺ:-*8qP`S_J LnodyXF#<O$F$ZfjCSaJv7 ʒ`>m0h6&JIN:i!Z/j*]('iPI;V-^U(-z_)&Lk# 5ÉVGUr=@ψ 8CȦ~@稭ю"`a L( @׶&I*% qp-P*pHHLgpyBLT;#E gkD૨(^,emJC uyGz8!tsH=M AX-=aqsLXtUJB‚Gn'Q0Exa"9hˆM8:G-Jۈ $yH讣R3I~QIjBč2d{eK>f`i ]N*>*#(,p%؁G4[{7ڢ/ MYi Xz]4WhgbfeC]NvP Ԫը O.de|Ms 1Z$%>}.("(+9ǎ@av8+(8%% $K%Hq0I)B𒤤>թ^=h[6QfʃժCle?9YYse0~*e# ác%h!l=\[/gg6KIb{@)$JTw S"_rh!Q굪uOӫA:9S3#Ǝ9YFda{ӁDE'%cpp[1l+[`G QYC48^R!U<0 $}̼R2VS| o1kgeUfmBQs ;'WLǾ65oöW@9ʑ@џ( {Jʡy3Դ)\غkؘ1ym [ϕgd1pXg,+X};8/ؚXlK.XAAЬwȮj#?o* fh*+`ǻ (-k``HƲqZjSՒKi3ZReY,8KKߟCnjL=fv2** y>`&?u|(kh w Mrs+'o~r3ՁвZm&HNFb&,B A^j1=% _æl/^K/OpY)@ t'*%`|Φ/ka ;bF2'T}wFFAUxzIf -.RQIxJQ jiΪ Ux!X~gpt)ؓXFЄP1h1u 'a[Am]r nKA:%*SA`,v#>6jdׂO8լI@ P D44c3wn+XxphGL(]$*'dH 9]sijN (2 N J I=]1Wb?,r߃@ڵr3  |q{L(LU|J$ K(: ]?f3Ht"F&g̀5(+'7XngOa6Z}2l [g(Bnk5 7kLaω N* %_e4ɪ׮jwZJ aCrA yIhfƛ p FϞ;#sżn< Pr^x=G> F47TtT\Vt]$(/;ѩw.o~yjhn~5XkNw*-ԆQSF˷})^)2mLK p"܄<&y{q{PRw7z\@ُ6l.޿YP]/z#4윧5. g}ӆTmOZ$UEAɾQW/ Hi_ɶ2z4Vz$g2/. hr yn[?[@сRxZ{=r7I`2i11^Wdcc%%0n&|UV^\@Ϙ5I9nP-/K'(=Rύ['chŹHXZ4e#`yp5#IEG) Ӧ(I.p] '6 S3ܸi H0fҥKS,z v'9.}:8o}{~/MUa4$kW #xj)BH;ɕGdTK$=͎+?e~t7%wqz Ι)>t&1g$Hp5!pj*@zc}b /<ܝ@: 1pW7u*#϶Nm0h3x5M)@U,D8N k.]1  H?ɲX;vlpS 8+pͲd`(T.6ړi޴QCٱDy`}]LAA8梱1Sv5aiOI8S*w_,{V7A"fiO/x GBIţIFҔ%sdEWxt7@#h~&eL~ӧC@?xjț 'Xsa9>hD^,U#`vHZ OGߒCSXz=?B&d^a0w@iӕ#Ҁlh׾}G/-*~i's |AG1Oa?_xz' P)m<=~&J H}:\GsjKqIGW]/ |H"N^Cz\- X1X"0@tV8zS>A2\ A`c] F8^1zLYc}n@ ż|qg``Є ލ ڶ->/Q4@3!bB(8W! ( |{#$4HmePPKz[A}vկ Zgh$ z*ߎ_]g AzI_?%ۯE$mtYnZчF]$\ANQSF@O\@X[[- H  tOT[iP/Tp Zݏ!(D2iNb(2@"ԝLU 3F Ͽ*yzN`mV5<)A܍LC\/=>S@7..ǿU<=p=ȥ={pi5GFZUN-HڣZm6O / h;  ; ̠Con!ixUG]Z#,6& 0؎#Gj7=}2׼z3g3ߖD(hp@NU`W X:2b{_=~9Хn]#xENR=аS.||^hNcr EhӦ\#?6dM[_`0 _4m,ݱn{Mu<{pfג1b /Wem0j"&4[Y uI80"aH=}!M}-|huPeVKhQ]'A?>D=B&1wk'Q%@T&O4= C6nh"`8 :BT1='R+֯\ܰjwe 9ШKMHpV17;=䭅7̏}zj~ډmΘ͆~wkDJ.d_ 13J `?χD pFV틹L400 JKa…PPcRM <w2*I6>B[攼iK"x׿@֭rhA^D"'ȯ ~5햌O'lxd6M ŵ m%)g9uA&2w h{i!UI lVPp6|qkej$,## [&HeBV4m=c^;B~1,$D[n2H-C@4icJн^=pu=9A_ snce嚥6!, qqT:;@^L2hjgkCvN-ow(gQ(-9 %Ep7| 6ٽd1;{Kdr0ꁺy,R;'zԯԅyyдF.ԯ^ jeg+Y) Pu ρc"r|vot`s""LFJQ/;rM,*w}*._ Sn<`A%Hbr/.ZνD 3j\6Mc9~ʚ(^Iv"&j`?5J@36(FQ; sKT0P{c!xSRW*̩,jdLW6S1&HꨪҏOڎ73A .# T91$XٓdDEK.t l3}R{eegb6ѕ!:r𥀬-[:N75bVb:M^W gg  +2~CfQ $!v "jF9(۵e;D>zo[CQxZ5N b(@[? 6Ov:r"%ǶN'2;u* ̩E3-D#=)Ձ@j*(ûК?(Ol\~ؒfJzgw[]ʒ}:鈐@"! HЅGBLN@ .D| $d G"He[+gv~Rt~W{H͐ @+ObKc01#䒣`*Lj"qADg*e0OMA >7ǐm= T}0Eܺ&Uԁ@{t AׇYں<><|R'Njjm(pҥT67FۂAp%Z)!A hH\u޶$8"M !P\‭{-14W`1*pZ]ʇ=lXiײܥ+7 {UۧFuJ 2sv3zycڹs.lmm}43Q74Mٹ[ϑ5sb#lгV(<^zOhv4%`JGgY3"#l0 '40M;EӃq3Id>YoݺuϞ>Wv ٳg7www?h:$?@e>QQMyh 8,7⫍=L{ U$bd ǘSD~3y9e̟g]Bo=RD?Fe+DUiRj8@gK4M?r{@㮿oCu1Ջ/c2}twʦn T8c+QdYd#k܃ue0 \9ldѩӪiQH^ZB^ԸM+S=&nd)YY)],u*3Oج99H4}?ikޟXpġmh{Meйym qfv4mT\27x;$հhRjù9pQQQS R]b^$L>ÿkgѲڃ.kfUlGoX\=gqTlb1W| $X͋730$X~ǏYkg%C«~r̙??M%bfmS\$Bu\Bš0g caKGrg(^Qxgr/'b<0O`(섂W-7<}aB= إ h~wxxo?~T)gςRƟ52!?f64xi}}/ ;xh * \})i af@s@C l@(K`m]{ۨ^+f!-5p=L 5SZ,  8umg1l%7}fTOӝ'';88?o|^OH=?R?Э ]HW 2X%]-lmm?~fIN &@1iJu:ܵK4 +g HqeӘ~kޣ'gG z}L'ml@0L431z|=LwxNepٽMFӕG{鴍 7|iLTSSIy/hczzSg~-E1Ku/FӘ>FUIENDB`(   !#%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%#! $J  "!""""""""""""""#"""##"###########$####$##$$$$$$$$$%$%%$%$%%%%%%%%%%%%%%%%%&&&%&&&&&&&''&&''''''''&'(('''('((((('(((()(()(())()))))))))))*)))*))*+******+*+++++++++++,+,,,,,,,,,-,-,,,,-------/-/--//-//-/////00///00000001101110111122211222222222442244424444444444555555555555555555555444224/0/###S$ #o !!!!"!""""""""""""#"""#"#"#"#""##"#########$#######$$$$$$$$$$$$%%$%%%%%%%%%%%%%%%%&&%&&%&&&&&&&&''&'&&''''&'(''''''(((('(((((()(()))))))())))))*)*)*)********++*++++*++*++++,++++,,,,,,-,,-,,,-,-,,-----/---///--////0/000/000000101101010111111211122122222242444444444544444445555555555555555555775557557777777665+++o#>!!!"!!!!!""!"""!""""""""#""""#"""##"##"###$######$#$$$$$$$$$$$$$$%$%$%%$$%$%%%%%%&%%%&%&&%&&&&&&&&&&'&''''&'''&'''(''''''('(((((())()()()))())))*)))))))***)*******+++*+++++++++++,,,+++,,,,,-,-,-----------/---/-///////00000000000101001111111112211121122222242444422444454454455555555555555555557575777777777777777888788556> X!!!!!!""!!"!!!"!"""""""""""""#"""#######"##"###$###$##$$$$##$#$%$$%$$%$%%%$$%$%%%%%%&%%%&%%&%&&&&&&&&&'''&'''&''''''''''(('('((((((((()())))))))))))))*)*)************+*+*+++*++++++++,,,,,,,,,-,,-,,,---------/-///-////0/0///0/0/0000010000100111111122222212222224242444444445454554555555555555555555577757755777787887887887888999878'''X Y!!!!!"!!!!""!""!"""""""!"""""""""#"###"##############$##$$$$$$$$%$$%$$$$$$%%%$%%%%%%%%%&&%%&&&&&&&&&&&&'&''''''&'''('(''''('((((()((()()()()))))))))))*))*********+***+*+*+++++++,++,++++,,,,,,,,--,,-------/////-//-////////00//000010000100111101111211211222222444224424444454545554555555555555555555577777775777778788788888888988898999999)*)Y9!!!!!!!!!!"!""!""""""""""#""##""#"##"""#########$#$$$#$$$$$$$$$$$$$$$$$%%%%%%$%%%%%%&%%%%&&&&%%%&&&'&&&&'&&&&&&''''''''''(('((((((((((()))))())))))))))**)*********+**+*++++++++,+++,++,+,,,,,,,,-,,--,------/---/-///////////0/0/0000000110001111111111122222122224224244444445454444455555555555555555555577575778777887787788888898899999999999;88:9!!!!"!!!"!"""!!!!!""""#""""###"""#""############$#$$$#$$#$$$$%$$%$%$$%$$$%%%%%%%%&%%%%&&&&&%&&&&'&&&&&&'&&''''''''(''''''(((('()(((())())()))))**)))))*************+**++++++++++++,,,,,,,+,,-----,--,-----------////////00/000000000001000000111111211212122224244244424444444455555555555555555555575557575777777787778877888888989989899;9999;99;;;;898j!!!"!!!!!"!!""""""""""#""""""###"""########$#######$#$$$$$$$$$$$$$%$$%%$%$%%%%%%%&%%%%&&%&&&&&&&&&&&'&'&&'''&'''''''((('('('((((()(())())(()))))))))****))*****++*+*+++***++,,,+++,,++,,,,,,,,,,-,--------/-//////////////0/0/000000001101111111122211221222222422422424444444554544555555555555555555575755775777778788878788898998889899999;;9;99;;;;;;;;;001j !!!!!"!""""!"""""""#"#"""""3+(uJ@cSr_{eikklmmnnooqqqrrto~jo]UJ>1/'''''''''((((((((((((((())))()//9FFyZZeekkppqqrrssssttuuuuvvvvxxxxyyyy{{{{wwqqeeQQ77E/0/0//00/0000101011111111111125B:EXQqY΁\ވ``abbbbcccdefffgda݊Z|Md>NC899999999999;;;;;;;;;;;;<<;:9:G!"!!"!""""""""""!"""""""#"#zMB{ehijjkklmmnnooqqqrrttuuvwuYM''('('(''((((((()((())()HH~kkppppppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}||VV/00000000111111111111131EZ]މ___``abbbbcccdefffgghhhihQh9;99;9999999;;;<;;;<;<<<<<<-.-H!!!!!!""!!"!"""#""""""##QFhhijjkklmmnnooqqqrrttuuvwxxy^R'((('(((((((())))(LKnnppppppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}YY100110101111111112H_____``abbbbcccdefffgghhhijkkSl;;9;9;;;;;;<;<;<<<<<<<<<777 !"!""!""!"""!"""""""#"?0-~ghijjkklmmnnooqqqrrttuuvwxxyzzK:5((((()()(())33Dmmppppppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}=>R1111111112118L?^___``abbbbcccdefffgghhhijkklkC[K;;;;<;;<;;;<<<<<<<<<=:;; !""""""""!""#"""""""""##THhijjkklmmnnooqqqrrttuuvwxxyz{{cV)((()())))()NNppppppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}]]111111121212Jc___``abbbbcccdefffgghhhijkkllmVr<;;<;<<<;<<<<<<<<<==<<<< !!"!!""""#"""##"""""#"##kYijjkklmmnnooqqqrrttuuvwxxyz{{|~j()())())))))aappppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}qp111112221112Uy__``abbbbcccdefffgghhhijkkllmmcՉ<;<<<<<<<<=<<<===<====== """"""""""#""########"#"xcjjkklmmnnooqqqrrttuuvwxxyz{{||w))())))))))*jjppqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}||111221222242[چ_``abbbbcccdefffgghhhijkkllmmnk<<<<<<==<=<<<<=====??=== """"""""""#""""#"#######ijkklmmnnooqqqrrttuuvwxxyz{{||~~))))))*)**))ooqqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}221222222422_``abbbbcccdefffgghhhijkkllmmnoo<<<<<<=<======<======??= "#""""####"""""###"#####jkklmmnnooqqqrrttuuvwxxyz{{||~~*)))))**)*)*qqqqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}222422444444``abbbbcccdefffgghhhijkkllmmnoop<<<===========?=====???? ""#""##"""###########$##kklmmnnooqqqrrttuuvwxxyz{{||~~)*)*)))))***qqrrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}222222224424`abbbbcccdefffgghhhijkkllmmnoopp<===<=======?=??==?????? #""##"##########$$#$##$$klmmnnooqqqrrttuuvwxxyz{{||~~*)***)*))***rrssssttuuuuvvvvxxxxyyyy{{{{||||}}}}422224422444abbbbcccdefffgghhhijkkllmmnooppr=<<===?=?=?=?=?=?=??@@@? ##"##"##"####$#####$###$lmmnnooqqqrrttuuvwxxyz{{||~~))***)***+**ssssttuuuuvvvvxxxxyyyy{{{{||||}}}}442444244444bbbbcccdefffgghhhijkkllmmnoopprs=======?===?=???????@@?@ ""###"######$#####$$$$##mmnnooqqqrrttuuvwxxyz{{||~~**********+*ssttuuuuvvvvxxxxyyyy{{{{||||}}}}244444455544bbbcccdefffgghhhijkkllmmnoopprss===?=?????????????@??@?? "##########$##$$#$###$$$mnnooqqqrrttuuvwxxyz{{||~~***++*+*++*+ttuuuuvvvvxxxxyyyy{{{{||||}}}}444444444454bbcccdefffgghhhijkkllmmnoopprsst==?????????@?@?@@@@??@@@ #####$$#$$$###$#$$$$$$%$nnooqqqrrttuuvwxxyz{{||~~+****++++*++uuuuvvvvxxxxyyyy{{{{||||}}}}444444544545bcccdefffgghhhijkkllmmnoopprsstt==???????@@??@@@@@@@@@@B ##$####$$$$#$#$$$$%$$$$$nooqqqrrttuuvwxxyz{{||~~++++**++++++uuvvvvxxxxyyyy{{{{||||}}}}454554545555cccdefffgghhhijkkllmmnoopprssttu????????@?@@?@@@@@BB@@@@ $##$##$$$#$$$$$$%$%$$$%%ooqqqrrttuuvwxxyz{{||~~+++*+++++,+,vvvvxxxxyyyy{{{{||||}}}}445555555555ccdefffgghhhijkkllmmnoopprssttuu???@?@@@@@@@@@@@@B@@@BBB #$$$#$$$$$$$$$$$$$$$%$%%oqqqrrttuuvwxxyz{{||~~+++++,+,++,,vvxxxxyyyy{{{{||||}}}}554555555555cdefffgghhhijkkllmmnoopprssttuuv????@@?@@@@@@@@@BBBB@BBB $#$$$$$$#$$$$$$%$$$%$%$%qqqrrttuuvwxxyz{{||~~++,+,+,+,,,+xxxxyyyy{{{{||||}}}}555555555555defffgghhhijkkllmmnoopprssttuuvv@@@@@@@@@@@@BB@B@B@BBBCB $$$$$$%$$$$%%$%$%%$%%%%%qqrrttuuvwxxyz{{||~~+,+,++,++,,,xxyyyy{{{{||||}}}}555555555555efffgghhhijkkllmmnoopprssttuuvvw@@?@@@@@@BB@@BBBBBBBCBBB $$$$$$$%$$%%$$%$%%%%%%%%qrrttuuvwxxyz{{||~~,+,,,,,,,,--yyyy{{{{||||}}}}555555555557fffgghhhijkkllmmnoopprssttuuvvww@@@B@BB@BBBBBBBCBBBCCCCC $$$$$$$%$%%%$%%%%%%%%%%%rrttuuvwxxyz{{||~~,,,,,,,,,--,yy{{{{||||}}}}555555755755ffgghhhijkkllmmnoopprssttuuvvwwx@@@@@BB@@BBBBBBCCCBCCCCB $$$%$%%%$%%%%$%%&%%&%&%%rttuuvwxxyz{{||~~+,,,,-,,,,--{{{{||||}}}}555755575777fgghhhijkkllmmnoopprssttuuvvwwxy@BB@@BB@BCBBBBBBBCCCCCCC $$$%$%%%$%%$%%&%%%%%&&%%ttuuvwxxyz{{||~~,,,,,-,-----{{||||}}}}555575775777gghhhijkkllmmnoopprssttuuvvwwxyy@BBBBBBBBBBCBCCCCCCCCECC $%$%$%%%%%%%%%%&&%&&&&&&quuvwxxyz{{||~~,,,---,,----yy||}}}}775775777778ehhhijkkllmmnoopprssttuuvvwwxyyxBBBBCBCBCCCBCCBCECCCCECC $%%%%%%%&%&%&&%%&%%&&&&&݀kuvwxxyz{{||~~~---------/--rr}}}}777777887877bhhijkkllmmnoopprssttuuvvwwxyyzsBBBBCBCBCCBCCCCCEEEEEEEC %%%&%%%%&&&&%&&&&%&&&&&&m\vwxxyz{{||~~}m-,,--///-/--de}}qr777777787878Y{hijkkllmmnoopprssttuuvvwwxyyzzićCCCBCCCCCCCCECCECCEEEEEE %%%%&%%&%&&%&&%&&&'&''&'{QGwxxyz{{||~~\S----/--/////NNZZ777778887888K_ijkkllmmnoopprssttuuvvwwxyyzz{YjCCCCBBCCCEEEEECEEEEEEEFE %%%%&%&&%&&&&&&&'&''&'&'0,+oxyz{{||~~閂933--/-/-///-//339ww<;@887787888898:B>ekkllmmnoopprssttuuvvwwxyyzz{uFLHCCCCCCECCEECECEEEEFFFFEE &%%&%%&&&&&&&&&&'&'&&''''''_BO010111121111LI;tvvvwwwxxzzz{{||}}~[WG;;;<<<<<;;;hjklmnoqrtuvxyUK((((((EEuppppqqssttuuvvxxyy{{||}}RR100111C{V__`bbccefghhjkOc;;;<;;<<<<<; !!!""""#"##"n\jklmnoqrtuvxy{قm((()()ccppqqssttuuvvxxyy{{||}}tt111212W}_`bbccefghhjkld܍<;<<<<<===== """""""#####~gklmnoqrtuvxy{|{)())))nnqqssttuuvvxxyy{{||}}112222]`bbccefghhjklmm<<<=<<====== ##""#"######klmnoqrtuvxy{|~)))***qqssttuuvvxxyy{{||}}222222`bbccefghhjklmop<=========?? #"""#####$##lmnoqrtuvxy{|~****+*ssttuuvvxxyy{{||}}424444bbccefghhjklmopr==x{|~gNG-/-///EEiOOo887888FoTjlmoprstuvwyzzRw_CCEEEEEEEEFE &&%&&&''&'''''']C=sbu~镁}maJD/--//-00/000DDcii{{rrLMi888988899999FkR^€jorstuvwxtiňQq\CCCCCECEEFEFEFF &&&&&'''''(''(((((((()()**)******+*+++++++,,,,,,,--------//-//0/00000111121122222422444545555555555555775777888988888;99;;;;;;<<;<<<<=<==HB<;;<<<444]"""#""nG>jkmnortuxy{}TI)))ggpprrttuuwwyy{{||xx111DyV_abcdfghikmOb<<<===888"#"##"~ODkmnortuxy{}`T)))pprrttuuwwyy{{||222G]abcdfghikmnVn==<==?;;; ######PEmnortuxy{}dX***rrttuuwwyy{{||444I_bcdfghikmnpYr?=????<<; #####$QFnortuxy{}fY*+*ttuuwwyy{{||444J`cdfghikmnprZr?????@><< !###$$$RGortuxy{}gZ+++uuwwyy{{||555Kadfghikmnprt\t@@@@@@<>>!! $$$%$$THrtuxy{}h\++,wwyy{{||555Kbfghikmnprtu]u@@@@@B???!!!$%%%$%UItuxy{}h]-,,yy{{||555Mdghikmnprtuw^vBBBCBC???"!!$%%&%&VKuxy{}eZ--,zz||777Ndhikmnprtuwx]tBCBCBCA??!""%%%%&%pJBxy{}vUM/--qq887I{ZikmnprtuwxzVeCCCEEEABA"#"&%&&'&.*)}h{}ԉx412///KKu~~UU|878;>@@<<v>>>y?>>y???yAAAyAAAyBAByDDDyDDDyEEEyGEEyGGGyHGGyHHHyJHJyJJJyJLLyLMLyMMMyOMMyOOOyOOOyPPPyRPRyRRRyRRRySSSySSSyUUSyUUUyVVVyVVVyXXVyXXXyXYYyXXYvXXXRRUR ( @ e !"""##"###$$$$$%&%%&&&'''''(((())))))*+*,,+,-,---///000111221442455555557555---eb!"!"""#""###$$$%$%%%%&&&'&&((')(()))))*+**,,,,,,---///000111122242455555575777888999111b "!"xLBzelnqtoSI(((HH|jkssuuxx{{wwQQ111EZ[܇bcegdNb;;;;;; """##"|flnqtvyx)))llssuuxx{{}}~~222]bceghkk<<<=== ######lnqtvy|***ssuuxx{{}}222bceghkmp===??? ####$$nqtvy|*++uuxx{{}}445ceghkmps??=@@@ $$$%$%qtvy|+,,xx{{}}555eghkmpsu?@@BBB $%$%&%tvy|-,,{{}}577ghkmpsuwB@BCCC %%%%&&py|//-ww878dkmpsuwvCCBCEC %&&''&rMDr~zXP//-LLxxxWW888J~]gosuvsXhCCCEEE '&''''((())))))***+++--,--/-/-/00101212244445555555777898999;;;<<<=<=?=?@?@B@BCCCEEEEEEHFH '''(((|Hqjsux{wQ{011wPqxz|{W<;;Wu|}`HHHHHH ((()))lsux{}~222rxz|ނ<<>]~~GGe^Єjkkllb҈BBB$$$UJxyz{|\P55D>>LOekkllmUlCCE%%%/*)WLvdwexf\P50/---FFkhhllllkkLLo888;A=Qg_˃`̅a̅VlGJIEEF&&%'''A2>`>Yb@[b@[E7B---/0/553`YDjcIkdJb^F<;8999;;E888;99=<Ϧ [~Xяއ5+ M6m̰aޜ-qwH7eK s.`$@X}}ʤKӡG|W_;L'>@iH BJ>:1خ H`lbpѶdpGDM刡QN | ǒA@0ܑiySݚ!j!0(1zqO31ѻC5"OLTqF ϙ8ӃE,+)HP}7Or!_iH %O>m9ޛM̱KbNJ/MIc"×Ʌwuuҽ^~@?Ս@?QbQszf})s*?Oμlnws<@֡ iUBQSܐҴad@C)1^}cȜ'-Oվ0y, ڡO:-I`Ibꓟ?8蠃=4$fΜ""q$Du$9;B@ݗntt9Ι4i?V57lӧCzi㧗`˗י?ʹgXB5kG0ϑDN=ra I?/?> iƌo>|˹_z1G^~&e·kw~)|k}nda,V@ _~sRߞ>Җ\MiHT;3H"f'mkJ?[Yd$(=WZ)D"Zubt92`B7}}s5{NJѐ(#^/m-[W~P#jsY@np!Hp!0vѣyvyOsϥ-ujDC @HtXb'&f>׃`ޗ0=ˀxYUIZ"kل<$?.^n3! f~"=oz/#Va%JGm30='}\v]$#){ H>jAxy xΏOdڵQF5;_ªX XPԙ(~z1F72L羿Dң(@j{/?w/kϑ~1m vj}MMZK.m2uD4r8mju \sSQLI_ }g=1 O~ h'`ƌ%Rc/Sv>(j(:rA /TB)t,-͏sM6qm!{7Y aM_HʑUA+`ڴi#95=̃)'=3! '=jhn@UM_~-Ok@_>"Lq ssV V(TIy|uUWIL-?#;B'ۻ* _i k%Yvv*p􁷴p_78,Hu^,YRxX FݕaZIhIȑ#&=Z?gG[ hPbX ~ 4O(揜Pa &ӟ_t.eҬI\$z6KG>rCQ9R\WW1!KR4[ Ў{D%$A\Ӷ!zVE֗b x5S|C:>Hh{✘^#HC=F^v2F/Eȝb*Y1|둰܇zas,ﭴxrz|PofוXoNY&}΂Z E3 =4]>e-Cr֪m$xDZxq/5W?rK& WIJZ'?`ر `P~V@o( a'bG-hRekm=Zx7'?y|M7FJ2w&oo{Vگ$sf'm ɮ{<-W:0DQK$rvߞoc ?0G(3|ӮhsOܒ1ckܗ^ziҮp ;_Y&?}u anQMch@\jkfc` 6@m{?~v<䓽 f~}|!/J 裻J7J'; sak76^:r/T>Mb Vx j|5?JGOν4?\guA~֟OB$X 4T`ڴi9rcfsYbٯi0e>"lޱ(F`աݿ8SA2l?0w_=YB=ED,]dH`1e˖;.4 i'qbQyo Mx}! 4(~5'LpUZ75s^joČ4_3#[d_Oe4懆sO-K\+:i0$y{RmѠGydN;tN긽#?Z wkq^[~kDs愃%4\1-/ڳB\\Hl* g~I8[n9"Ѡkp 3g4aP5h-PH .*y>~Mi\| @~ڽA&j̥9?^~֜P44@bvuu}e&9__ӒJA=! Pži;j'>0*ӏXk5~3Pw'{xk8ޝLĝU€ywOs>fG'5:L~*me?,'xu~ߘop7w.>@v46~ɖڥ4 ez;cd1u`hdal?~ixcȑ#:o͘GjNkD yꩧ>7NI]M~2,WG}E9a Z2_sk>4? |0y|fHho5/@{D>lmܹ2i<+):M6i5MHw^Fԧ2Ri(ԑ::#>m*rmxhk#7 DLp#Z>f$#THW9䐋k$LL2eJRp4M@ !f.eNT"),5-၍|MHJO`'yiרŃ :*"{"#V헒;O~2Ѐ~klW}{29{fgD=fVȱ*~ͅh\à -Ϻ//4 /P:9V~@߯#fgK:CGy˵~ӧOz>A?܀ a -_N  X,Zj}P6Y{a:/٫pz ] B@}=?>[tL:ub\w`_0:rL^PB]z,ike?SKwajo kC=Xs~ =׍ Rjf@"@<̿}S”b&U|#Ӄyzx[4&h-?"r޶ҫdhr!f4d-$yMoRYc(ȠSzHEa>I`~JDHyYQݍnd ;y#XZ'Okh~6ȧÑ~cڋN/BL*#OCGPLa мi/}9T~uD3X}箇6A0YaDKj} i|s;))~KtuYoN ԿoN|;/gDc=^րg!{jZQU h1<&Qh?XuY_ D  ٚ35&pK;C_'_<Ϻn #!?/>OFxp=Kf8C ?}S|lѿݍoHƇdLQ,fr PAn ׀ 2G0ܺNh,(.cmfcBյ=}q0=f&niBPnk])K I'~?3X?ndyLo /R"="ڻnT`=Y7yI'B}!NR/G!eiZոW *h d[@u/i5&=:&AAX@Ϻ9.h@ek'wc˅w8d|䧵6[Gt]jXدZƇ9j0}їlK@|Z^Hʲ̤@nC>W;@y΂q7M5g!Yח1fўL:uBPk!z'E+_ʒZ@9sx΂䝦u~NʗU ZO%h=@1Zp~BT`, y!Z{%"cvP%X|dmhnWT0YB`I8iҤiA*:կ.\#`*ESu#wd;\l8?W/J {4|^0Nֵ!'^rG8C 0怶B[W\1B kVz9L$!V|?b/9nW/z^Z?B4h4B&.%ژ܃ CJU`'!n!3Y!<#$`|/Ym%:wpYxI@+4aT28"NÓ=FKho$( X6m×>0=GlkxXXO0!y LkZ"f͚ .I - S5>Gy`*%M ȀqY|DSX:D xB{./x塅5ʬ>n2 >{#XJYx \;=I^[$utΜ9Զ@ou旳Ĕn zTxmFJ3`T!'nA&#Bq6r'"D8AXfvvApRJm= Qw|@[g9SO2;_1I9 m9\ F#9gJH4o^G<%{q\b黬;\eR3.q>[.|K_smӧ^O:Ƚno$}q] KBDQ`KuAvq^Qu>[Ȟ5>M<>6S5&?TR%~% 'J?OY{ LrXG6ls]N#3zq:U%Z4t??Cr*mʡ=nr_ϮkB~Gp&}an>0}0[״|KRb M)CO%'pMl*:NzQn'_ro L mγ@ȲN |,F KG?gb[1"$h?#ݳe* <)G" &7`F+͘1ԘhK}/0\WkZNs|ɽ!s4PhjQ`udkx,vXqHZO3Dty=ܣ'`8pyQΕC۹$__AW}_>V ,?Q{IA/}Z*lA@#%hԸUCރZ܃vr4Է$v<DȈE >YmvlAFQܡ!@>pzt/^\rIQUsʔ)Ó5Ѣ "UjF;(Nrs&PPh/pc `D~\}Zr`}KInXg)>R^ nZ HuWr~YTy#^za ?IP]PK`:UTmC>kpfpN{hC>ږ'b?Sj/'/X8їBڭЄk[R7k܀J3hLh$$ض-ՊU2<dO+ F!;p|!_jkG!e j6Azo?Ň\tuY{%-q\QFuT#F};B~r_zes:&@KyhI &8֚ExeٜڰYo%E4!dB=O3G}7 ݀ҷS'1Gf6+|*\%]|+9`_ο#'$X .}`1@F 析ϒP~5"s_ Gˬ׎Q?P4.]zQGZP,{rȵISIN$Uxo*"I2mׄ ߆d}/O i`yD8~rF3#,(&` !1>F0,D|hP'g>hb0߿ֆ G>|}~ ZmM`jzf`z&?X+pJg!Rԟ@h=[єvU9ݓ<.yU.8 N%EKV"v0B͚hr KSܥB}ait p#[@|A1usi7T ;'n[hL}يp)^KY|I# E/O(h_IC|$iݗKo}Y/pӮWk} :Mm$މY H #9CKLթa {1GVB~g yb D[-آdkIN`I,*a| B;3bQ/oijS;V<s9<Dߺ_(hʙѺJrM00ڽXu÷ʃǽutAy56b>h~I!a|-ak1>P!/χw%DV1wP"͚5kr2MF'?J%j]%e--ˢjU|/0iI,-fr-+(By ˿g-GMs;[?y/1YHH|;߯݀[7gؕW^9=]gK@,SRv@r9{)9+2SS45ȇ߯t|Ija Xvڹτ6E0=O"&\<>j&>pW YZ-ĵ)rfm(U1"x֗R}cv}oY.A &8bxuzvO[n,~LbW;V$|oK/-O6묳sK*0^%Z6*xd+ʶ`ZRmƴaZ"Z :}(O;?4D1@YҺ1ZF{sKYހ&KgR$kN>?8@T ={Ǔ12YO*V$ڔ&N/ -'0{no ʭ -B:p0?+?fi@\ ؅-4>_ $({"x.\x?Zu.;61,TZyAۖeAE)#knZ_V_:2#>ѕ;#FU!f>쁌ME9%@7{+nx#D?JǢon*~9mt2=xնv\3p)9Ry1^N[iаr n 2O@wbxX\J\h _G8cM@?L4ʤQPF>|<^joOVaVz(U{Dڷ@КHΉ1ȇOhzz!\nM֧tb^]B<_2=-m q6uJz~\s æNa?+g"ZMZ1e}9߻(Z|_C?hPɰVΈs  n&o~" pYK;=H7a X֞V=랁AI}NB .ѣKs <汘_F@ڜ޽X Z{JO_C;$m,?m,дyL@!dx[F^/>-W6{n@7ʮ@> /N:Z^r%O8Hz*q|J5g.W%JA%Brsq͍?mI) fsP|2؜&Զh1|iZl\v}K }INhSt-Ӆ_yqǝ^u/-wmW̖SY A.@CE"ڀ޺99FÀ$YZİd]pج0B n Of#:MvfYF៺lٲ[U19sLMMsZ4\ar45Y,cHR ?_T@X 2/_ :I?"KENfQ"s?òDx,2iL^[={w~';;j W:k +*$ 95Tsn-S=%닀fkz!_kηd-goN{"W_I{;> a{섷3l?rkEx7hv_e!Q,&6چ8<|bamp%^}`%imP|2:f{9>y(@$.?AC҃{LeR_ihtQ7rBzs~:L^dR/[۔8Ҩ! B#'ݷcͷiuM=w(7z~~I'Q{PCUzB^zQ|{R?Vj{&P|V kUy}HP 1{X,M 5^X0?}C4=7YCp3#pvx?[Bz'JRQO HO<@d_ݤ-vDXjO)ɬ2 +ŪB{Z}Gy\4z 1G i$C>ԡ d`1TN#RR35!Eyܼ{&LrjY?[+i0)%gԿJG$`#Ϗ}z:N~:?m衇Qht>F6;2鼢L{Iowܗ6R,iW^yY7p4?;_֓s--׮UZ?]C4mt ?_~? ^!AT?bY ȣGOFkZ1=8|? Y&, :s& "uMeU;I|z:pꪫM7^ ٯΊD`# c:.ڞ-J>8~G3-B`H{P--B0ChĜf/jgZ-zo(u|gD0g?ٌ0Fˉ@=TkvVo!TR_j(u|#S E@ÙN/ xrr!&cP~^>(6%h؂&$-OG;Wk?I*aB,wX55И K~$`H}sS娕υ'p`5 ,RϏk/$XVA;vQi,t06\Ǭ?L~h4l$ ͏:$C}Mxf[$,s":\8p*g?gnAaύXux Z% _Oe\u\Ӭ90FRO܃㹑-q״,m8 4LkKS5q-H gD Om: ` h7=D qn*@EDkngJQ^Sr"'Z+k9@F&`^x,Y;=y L%BHx`2ԼPBpfsa y&Nbt htr?,ͯiܧO4_y'dXj;{aReGy|EG"Q&dhMk[v<ھHpr>9ayD~g6z0? a{KFG{p}+,(풂,WS{Ghz'"V64PYcm$I'Z Q$On1Ϲ9/ FͨHcWU,/D<PgiǯG~?"r Vb\ȣq|ws_9 w,\d t<(h5A1Ly,tY~Nk9_ҘO&iaC8GnvLoo{KޑVI ]iɒ%xnue^7qEۨXjd/lg 0_N(WS{v=ga甔ՆV )+O?k0{$p`KM玕+!Dk1"Lq33 >PLR)Vs_@m!@;<Ϟks=gŤ/"3ϼ֊ Xwu?E.ddCr?=l@mdz^9Kk旟[A1J"4Kld1 \[? #}q,ڳ=gSX!`͂>ZQ[.s=:ZEP4Ivۣh|OGqf#<<(`}זt= {yނPV+oi\`s Fie>F X|)e/D?3gKY'OSgYIN:F$1²8>41ia\ >5e;aɴM>ə3D.%lCKg@:=HbRc$`}j~5.3R#ؚVs1m MX@-- )ƯOFS /2`f<i(0'˥Cѵd\k؁%'A@De K|1r >)an;av {v<KRZyeΏD"2<1 \A\zNes>1&┉<9Vc|Ԟ?B^wA`9V}^^ãj []wu_J`/ iIK^&>q%|^Gs3CڬĹ,>,yチe"w/ס94/MzRx ! T{fZV=轔unh2HN;i>Znjn i~kh70=1@2xp0s bm}$ s/<ӟ@}3??Wc~YpMÑiYfӬ3KCCh[J%HVzЏ֜k6d^tE`  ݀Ϗ:~xs@ɱh0~ ҭ)! ǧ^֜;u0-뉱q5 D:T7ޖ1K}Y+Os^Jr+FJ玕LH't8'x&\ wwpM0*KTm<r}HSs>-dgep:(;mE=Rh߲,B[BQc_Z@DIZ_I⚞3?=^t\ ά J:!i9h,ڏ:(L}Q(@*O 7 G`oih֟D({#ߏg&X,ʝlSe?Yf]DuޗZC|\볟iD%?/d%,:`?^P0GY)mGɗ L}M0HWC~Z9Һr`t!jdYxw_Gq> ֯ +p 7h:r%WDxXy"ʹ' Arb2$#9X?oi|O\~ ʶj~i&Z=Q3=R?gd.83zw 馛u 6=MB r~ G)DRzp B=@Lۇ͛~G53;dKGgnk e $Eh,@7O2Z#Pqwr-C!v McM?Oa2B@pΜohѢAK!',r2Ϝ<X> V1k[Ǡ'a7#ѭX/Ц p?:~)Z)Kx>Cw$ 1 EE}eu)b@_z*[02NͤԘh|[oL- _~ޯy# Nfoh7H J!-NIR,YD8Fav?_5,@/mS ;L~Kj뜢G4dҨ[K䋶 XF{޼yg]|՚?ֲozӛF^qG=W/a+{P21?>>o3:\B9vS"RYs=ʙZymҟI*6U ,l̟~K.<, AMf[y#ً ܁vi)8#r1¯2`{_m 4_&3!'ϣ"ë3"wsC9uԙ^W+gy뭷>{+]DBCpi4&4s15 hۦ}sPV>'PfIw/=: zYԕשG^kviL xU XJ'hUX/*䠢V1 ^sD>RדHו=L5g1ιR G^Xub kC=&﩯=krnK 5KkU)ӗ8?._B1[_iB|zgBWLOY@2ڜf5Au@|G2/ )8gΜlw7>F?kjhWU[A4H//4)5Y}iZO=i{a@ʨ\O4kT~f3O ^Fј>/ShrMnצ ړh_Q+n2)@xQ>-&3z=^k@!Oyϲ_rVb:=:7b!xgͬh|oܹg'wZ~hAV Ho Ç_#!.ECT!ez*1?(f:&4O i}h,KDkܼKXmڢ]1SSL9=|NO4(!?s=(vM*%YboFύ-1hq/ٜH=!G 9Yuɍ3nU@{PRӓp衇i {.}k@~Sh`A/QH9 \ddko1 gic| }2U;'$J2_Ϟ?>bŕ2$CĠ.lGctꀜE@$eHpɘ,XФA5.՘$+?9=ߞ ^W KB^B1': z߸O 5."mA-kd 45C=ZΥڻ m6>d\ٟI??gΜi-_Sr2 KwdMScx30P3 .T|ϴ1%ڟжwܺ_ϼ.%   L~m=1 O_mC+'zz6hٳ>|F^u2,'6M>j1y+VB szzB2h ޑ4/3=P[qhY=K>NXix}Bs[ܫía3gn뭷K9@k>ſ۪"/BHL ,~mM`ȶY}#:WeI|4Ih}+yƒ}_r%^ciz_ZkW: i ^@ You0-"XR}=+`1=> xkܿVF-@Q0 A/^= ]7犔%m$ڷλ֬ۢ}ЎJX]M;}(*} vx9⺭I/;1FiLcڶfߵg(,&ez 4RXukg㊟jMA'>>F`u]Zkk-E}~ض|+v}A0U ҁ5͝|QQ8 X&v7,-eٲd{&ٲe$WZR_R_&W#%SosaAǏirV=25e[&=/19otL"xէ>D,EkV1s8@},;sm݆$+={N믿ni 6]$#}|IvYӖqh7=#hLD˨QNx_/9@/Z3! goarE]tG۪}XMB`ܸq]_~tuu+xX@ 3GZ‚@U $*nD3z_ dx< $@$K0fk}|a@FVJrх^xҥKO?KÅBz{>l_0qDXHJ 9hiH0rJ-db8'>J篾%m;}Q܀O|vdvȝG@ F B{P ~ Y \(|Q+Ⱦ)&ϿY ͛wu]duO髊Yٳ2a„^YD&!CP5*?p}]{h4}n /jD@Yse"Mgm|ScV5  yĈt&B6߯+A׫Z?b1(} ,I2Y u5^wkBhr]-ӗ\r K,_=}ї4YgN4idv1/ 󵲴b0{.`oeWI q-!@D geFV6RO< _~1{/#Cg}vCX=s>* <XUh'Vy|As\7(rVβ 4* I TW}q]xo\~8'}}q-%X ;vsop$ 65H?je8qܹgk򬀒abxy@]=gsh>d<\a iqq&+`M7/1,,֛B|B҈&j* aA@-Y'SNcʾЬV} i_a|g…iڿ_h ;?1tIVH?x2| /J-1C?6xEm*$ XB`B!nNh\֧ӟDbz8'-oyG< D*c|[o0G B/|Pd0  sD9 Oku)?J.qd[sn~Ik]X /b229s̭'LfCus&LG ZA2 |s'>m4(y_dH#4Ӳ-y O8]K.Z]_P\S.Ǐi\{y9 bE$:(`B,md1zҤIoK#8˨K>Ij(zu&ܴ`+P2H2\<`'Hinm[ouqm2-1{D9f2=@uX־6=i^|I& (Yc\j@iRGf~QS^Α/?÷|~>Sw\jC &b;I@ h=Z 2'-z+Ԏae"90@\GKOGBh~J @up/Z$7t;c13hഋc=ˣ>zĉwH9Ls'- @x;{x6#!!%Q2=3)~1|&Rk/Xo_2̾dڦ /~ci FHȐs+hV, #= N9P\Uԟ·ZjG_ z4'A]|S͉AGH!`J aN6oFG K۲4 Ye}kVAߚ>6 {fkAS'N}+ ab{a}]#MLj0Sa$ԒU܄k'G€T9BsQ)Cs@,?c{}0]4_)w݀6_no|} RsJ0jo$ wL=ި?*[QKFj.{Z\hEN՞_s.\+ g.ߏ~o&i;9XiT (?'26a?,o% >yZϲ "UW]L7_ǁn@;찑6]3D m΀ZV9I?4%r!\2_a˺4KևxcƌY;'r 1Or4˥1<Ʒi].!~+'׉U޻{QyjDQB[0j=݂|\̝;>Mei_N8s/^P&O X{^pa2&t_Zg%B'tحj^4|ۖ Fy>~E"DZh|o ( H=1 :_q'^X&0>(}{ &t|_f'A)AYR[,X`F@L74B9~J+f^I4 IH涘~b~*w8uA0yr]5YHy%xxz+ou BW,3Wh2hh/?Oi+/7tk%('"GA@?59sߏHދ< Z_YAI"t^xo&+b|!57Go?nĈC% pY|@>17" hu>u߇~yLaE HKjMC7uu0xZhKs1#ęכjւODh9E>k>;Ҵ[ouO?m1?@COhF%a0 `'tӦ*Jsrik@:o# M,m/L/OV~թpiW50rܸq#ƌӃ@EFYY/ H,}#9>17/SruehH :g}Fkz7 l^LiC#Gt|ҥ˟__V>DhH:Ll:c뭷kp b^bG>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>~~~>|||>{{{>zzz>zzz>yyy>yyy>yyy>xxx>xxx>xxx>xxx>xxx>xxx>yyy>yyy>yyy>yyy>lll>aaa>aaa>aaa>```>___>___>]]]>[[[>ZZZ>YYY3///ooo;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~~~A~~~A}}}A|||AzzzAzzzAzzzAxxxAxxxAwwwAwwwAxxxAwwwAwwwAwwwAwwwAwwwAwwwAxxxAxxxAwwwAcccAbbbAaaaA```A```A^^^A^^^A\\\A[[[AZZZAXXX;;;;BEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE}}}E|||E|||E|||E{{{E{{{EzzzEyyyEyyyEyyyEzzzEyyyExxxEyyyEyyyEyyyEyyyEyyyEyyyEpppEcccEbbbEaaaEaaaE```E___E___E^^^E^^^E\\\EZZZBGGGFGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG~~~G~~~G}}}G}}}G}}}G|||G|||G|||G|||G|||G|||G|||G|||G|||G|||G|||G|||G|||GiiiGfffGdddGdddGcccGbbbGbbbGaaaG```G___G^^^GZZZFKKK!JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK}}}K}}}K|||K|||K|||K{{{K|||K|||K{{{K{{{K{{{K{{{K{{{K{{{K{{{K|||K{{{KrrrKeeeKeeeKdddKcccKcccKbbbKaaaKaaaKaaaK___K]]]K\\\JNNN!!MNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN}}}N}}}N}}}N}}}N}}}N}}}N|||N|||N|||N|||N|||N}}}N}}}N|||N}}}N|||NhhhNfffNeeeNdddNdddNcccNcccNbbbNbbbNaaaN```N]]]N\\\MKKK!OQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ~~~Q~~~Q~~~Q}}}Q|||Q|||Q}}}Q|||Q|||Q}}}Q|||Q|||Q{{{Q}}}Q}}}Q}}}Q}}}QpppQfffQeeeQeeeQdddQcccQcccQcccQbbbQ```QaaaQ^^^Q]]]Q[[[OIIIuuuQTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT~~~TTTTTTTTTTzzzTiiiThhhTgggTgggTfffTeeeTeeeTeeeTdddTdddTcccTbbbT```T[[[R>>>^^^OXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~~~X~~~X~~~X~~~X}}}X~~~X~~~X~~~X~~~XXXXXXjjjXgggXgggXfffXeeeXeeeXeeeXdddXeeeXdddXbbbXbbbX```X___X\\\O222 K[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[rrr[jjj[iii[hhh[ggg[ggg[fff[fff[eee[ddd[ddd[ccc[bbb[aaa[___[[[[K  ?______________________________________________________________________________xxx_kkk_jjj_iii_iii_hhh_ggg_ggg_fff_eee_eee_eee_ddd_ddd_bbb_```_YYY?  +bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~~~blllbkkkbjjjbjjjbjjjbiiibhhhbgggbhhhbgggbfffbfffbeeebdddbaaab```bPPP+ nnnafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflllfkkkfjjjfjjjfiiifiiifhhhfgggfgggfffffffffeeefeeefeeefcccfaaaf___a999 Uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiqqqinnnimmmilllilllikkkijjjijjjiiiiiiiiihhhigggihhhigggifffieeeiccci\\\U  6mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmtttmmmmmlllmlllmkkkmjjjmjjjmjjjmiiimiiimiiimhhhmhhhmgggmgggmfffmdddmaaamTTT6 kkkkppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuupooopnnnpmmmplllplllpkkkpjjjpjjjpjjjpjjjpiiipiiiphhhpiiiphhhpgggpcccpbbbk888 Rtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttxxxtppptoootnnntnnntmmmtllltkkktllltjjjtjjjtjjjtiiitiiitiiithhhtgggtffftdddt^^^R 'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwzzzwqqqwqqqwooowooownnnwmmmwmmmwlllwlllwkkkwkkkwkkkwjjjwjjjwjjjwjjjwhhhwgggwdddwKKK( ezzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzrrrzqqqzpppzoooznnnzmmmzmmmzmmmzmmmzlllzlllzkkkzkkkzjjjzjjjzjjjzjjjziiizeeezaaae 2~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{{{~rrr~qqq~qqq~qqq~ppp~ppp~ooo~ppp~ooo~nnn~nnn~nnn~mmm~mmm~lll~lll~kkk~jjj~hhh~eee~RRR2 n͂͂ςт҂ӂւނЂł‚yyyssssssrrrqqqpppppppppppppppooommmnnnmmmmmmmmmmmmlllllljjjgggcccn 3ͅ΅Ѕ҅ӅՅڅӅDžąwwwuuuuuutttsssrrrrrrqqqpppqqqpppoooooonnnnnnnnnmmmmmmmmmllljjjhhhSSS3 nΉω҉ԉՉމىlj‰vvvvvvuuutttssssssrrrqqqqqqqqqpppppppppooonnnnnnmmmnnnmmmmmmllliiidddn *ььӌՌ׌ߌȌvvvvvvuuuuuuuuutttsssssssssrrrrrrqqqqqqpppppppppppppppppppppnnnllliiiMMM* ^ҐӐՐؐǐwwwvvvvvvuuuuuutttssssssrrrqqqrrrqqqqqqppppppppppppppppppppppppnnnjjjccc^ VVVՍՓ֓ٓǓwwwwwwwwwwwwwwwvvvvvvuuuuuutttttttttssssssrrrrrrqqqrrrqqqqqqqqqpppmmmjjj+++DՔהٔޔĔ|||xxxwwwwwwwwwwwwwwwvvvuuuvvvuuuttttttsssssssssrrrrrrrrrrrrrrrrrrqqqpppkkk[[[D sٕؕܕ•yyyxxxxxxxxxxxxxxxxxxwwwwwwvvvvvvuuutttttttttttttttttttttssssssssssssrrrnnngggs wwwؔؗ֗zzzyyyxxxwwwwwwwwwwwwwwwwwwwwwvvvuuuuuuuuutttuuutttttttttsssttttttsssrrrqqqlll;;;Eؙޚߚߚߚߚߚߚߚߚߚߚ˚}}}zzzyyyxxxwwwwwwwwwwwwwwwwwwwwwvvvvvvuuuuuutttttttttttttttssstttttttttsssrrrnnn]]]DoܚߚޚÚ{{{{{{zzzxxxxxxxxxxxxxxxxxxwwwxxxwwwwwwvvvwwwvvvvvvuuuvvvuuuuuuvvvuuuuuuuuutttpppgggo222ٔߝޝޝޝޝݝݝޝ֝{{{zzzzzzyyyxxxyyyxxxwwwwwwwwwwwwwwwvvvvvvuuuuuuuuutttuuuuuutttuuuttttttuuusssqqqmmm,ߝߞݞݞݞݞݞܞݞȞ||||||{{{zzzyyyyyyxxxxxxxxxwwwwwwwwwwwwvvvwwwvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuurrroooXXX-QѠߠߠߠߠޠޠڠ}}}}}}||||||{{{zzzyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwxxxwwwvvvwwwwwwwwwuuuqqqcccQsǡʡ١ߡޡߡߡߡʡ~~~}}}|||||||||{{{{{{zzzzzzzzzyyyyyyyyyxxxxxxxxxxxxxxxxxxwwwxxxwwwwwwxxxxxxwwwvvvrrrkkks ƢŢƢʢ٢עޢݢߢݢݢܢע~~~}}}}}}}}}|||{{{{{{{{{zzzyyyyyyxxxyyyxxxxxxxxxxxxxxxxxxxxxwwwxxxxxxwwwxxxwwwxxxxxxvvvsssppp aaa¤å¥ĥƥƥɥեߥԥХϥХߥܥܥܥݥƥ~~~~~~|||||||||{{{zzzzzzzzzzzzyyyxxxyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuuurrr===0¥¦æĦƦƦǦʦԦۦܦӦϦΦΦΦͦͦЦߦަܦۦަߦۦѦ~~~}}}}}}|||{{{|||{{{zzzzzzyyyyyyxxxyyyxxxyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvvsss]]]0I¨èĨŨƨƨȨȨɨͨҨ֨ר٨بר֨Ҩ̨̨̨̨ͨ˨̨˨ʨʨʨʨѨߨߨިݨۨڨۨߨڨ~~~}}}|||||||||{{{{{{zzzyyyzzzyyyyyyxxxyyyxxxxxxyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxttteeeI]©éĩũƩƩǩǩȩɩɩʩʩʩʩʩʩʩʩʩʩʩɩɩɩȩǩǩǩѩߩߩީݩܩܩ٩۩٩ީߩީ٩Ʃ~~~}}}}}}|||||||||{{{{{{{{{zzzzzzzzzzzzzzzzzzyyyyyyxxxyyyzzzyyyxxxyyyyyyyyyyyyxxxyyyxxxtttjjj]r¬ììĬŬŬƬƬǬȬȬȬȬȬɬȬɬȬȬǬǬǬǬǬƬƬŬƬҬ߬߬߬ެݬܬ߬ڬܬڬܬ߬ެҬ~~~}}}}}}}}}||||||{{{{{{{{{{{{zzzzzzzzzzzzzzzyyyyyyzzzyyyyyyyyyyyyzzzzzzyyyzzzzzzyyywwwnnnr­ííĭĭŭŭƭƭƭƭƭǭƭƭƭƭƭƭŭƭŭĭĭĭĭĭέ߭߭߭ޭݭܭܭܭڭޭڭܭ߭ޭۭʭ~~~~~~}}}}}}}}}||||||{{{||||||{{{{{{{{{{{{{{{{{{{{{{{{zzz{{{{{{{{{{{{{{{{{{zzzwwwppp®®îîîîîîîîîîîîîîî®®®®î®Ǯڮݮݮܮۮڮۮخٮݮٮٮݮ߮ޮݮܮܮԮ~~~~~~}}}|||||||||{{{{{{|||{{{{{{zzz{{{zzzzzzzzzzzz{{{zzzzzzzzzzzzzzzzzz{{{zzzzzz{{{xxxrrr±ñԱܱ۱ڱڱٱ߱رٱޱٱٱڱݱݱܱ۱۱ٱ˱~~~~~~}}}|||||||||||||||{{{{{{zzzzzz{{{zzzzzz{{{{{{zzzzzzzzz{{{{{{{{{{{{zzz{{{{{{{{{yyyuuuȲزڲڲٲٲݲײڲ߲ײٲͲڲܲ۲۲ڲزֲ²~~~}}}}}}|||}}}|||||||||{{{|||{{{{{{{{{{{{{{{{{{{{{||||||||||||{{{{{{|||||||||yyyvvvʹشٴش۴ڴִܴ״̴Ǵմ۴ڴڴشش״δ~~~~~~~~~}}}}}}|||||||||||||||||||||||||||}}}|||{{{||||||}}}|||||||||||||||}}}zzzwwwεصٵصصߵϵɵǵеܵܵڵڵٵ׵׵ŵ}}}~~~}}}~~~}}}}}}}}}~~~|||}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~{{{yyyǷҷ߷շַ߷ʷŷķȷ׷ٷط׷ַַշз~~~~~~}}}}}}~~~||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|||yyyո̸ָָܸƸӸڸٸظ׸ָոոɸ~~~~~~~~~~~~}}}~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}zzzҺ˺ͺ㺿Ⱥٺغ׺ֺպպӺӺ~~~~~~~~~~~~~~~zzz˻˻ɻ˻»׻׻ֻֻջӻӻӻλzzzڽ޽ǽǽ˽ƽѽ׽ֽսӽӽӽҽҽĽ~~~yyyÿ׿ƿȿο˿ɿ׿տտԿӿӿӿҿѿyyy}wwwexxxiOªªª«««¬­­­­¯¯¯°¯¯°°°°±±±±±±±±±±±²²±²²²²²²²²²³³µµ¶·¸¹¾µ´®ª©¨ª·œ—–”“‘‘Ž‹‹‰ˆˆ††…„„„ƒƒƒƒƒƒƒƒ‚€vvvQ3¬ĩŨũũŪŪŪŪūūūŬŬŭŭŭŭŭŮŮŮŮůůůŰůůŰŰŰůůűŰŰŰűűűŰŲŲűŲųŴŴŴŵŸŸŹŴųųŰŨŦŦťżūŘŖŔŔŒőŎŎōŋʼnʼnňŇŇŅņŅńŅŅńńŅńńńĀsss3~~~íƩƪƪƪƪƫƫƫƬƬƬƭƭƭƮƮƮƮƮƮƯưưưưưưưưƱưƱƱƱƱƱƲƲƱƲƲƲƲƲƲƳƳƴƵƷƷƸƹƳƴƲƳƨƧƧƦƳƿƢƘƗƖƖƔƓƑƏƎƍƌƋƉƈƈƈƇƇƆƇƆƆƆƆƃƁ[[[ƫǪǪǪǪǪǪǫǬǫǬǬǬǭǭǮǮǮǮǮǯǯǯǯǯǯǯǯǰǯǰǯǰDZDZǰǰDzDZDZDZDZDzDzDzDzdzǵǵǴǶǷǸǹDzDzDzǷǧǧǦǥǫǴǝǙǘǗǖǕǓǑǐǏǍǍNjNjNJljljLjLJLJLJdžLJDžǫȪȩȪȪȪȪȪȪȬȬȬȬȬȭȬȭȮȭȮȯȭȮȯȮȮȮȮȮȯȯȯȯȰȰȰȰȱȰȱȱȱȱȱȲȲȲȲȳȴȵȶȷȷȺȸȱȱȲȼȧȦȥȤȦȾȪțșȘȗȖȕȓȑȐȎȎȌȌȋȊȉȉȉȉȈȇȄ~~~^ȫʨʨʨʨʨʩʩʪʪʪʪʫʫʫʬʬʬʬʭʭʭʬʭʬʭʭʭʭʮʮʮʮʮʯʯʯʯʯʯʯʰʰʰʱʱʱʱʲʲʳʴʵʶʷʱʯʰʱʿʥʤʤʣʣʲʺʡʚʙʗʖʔʓʒʐʏʎʍʌʋʉʉʉʈʈʇʆ{{{^0ɬ˩̴̵̵̷̨̨̨̨̢̢̛̪̩̩̪̪̪̪̪̪̪̫̫̬̬̬̬̬̬̬̬̭̭̭̭̭̭̭̮̮̯̮̯̯̯̯̰̰̯̱̱̱̲̲̲̲̳̮̮̯̳̤̤̣̩̰̜̙̗̖̔̓̒̑̐̎̍̌̋̋̊̊̉ˆwww1ZZZ̪ͨͨͨͨͨͩͩͪͩͪͩͪͪͪͪͪͫͫͫͫͫͫͬͬͬͬͭͭͮͭͭͭͮͮͮͮͯͯͮͰͰͰͰͰͰͱͲͲͲͳʹʹͶͳʹͮͭͭʹͤͣͤ͢͢͢ͼ;͚͖͕͓͓͎͎ͧ͛͗͑͐͌͋͌͊̆͘JJJͬΩΩΩΪΪΩΫΪΪΫΫΪΪΫΫΫΫάάάάάάάέέέέήήήήίήήίΰΰΰΰίίααααββγδεζηέΫθήήήλΦΣΣΣΣΣγηΡΞΝΛΘΗΗΕΔΒΑΐΎΎ΍ͅTέЪЩЩЪЪЪЪЪЪЪЫЫЫЫЫЫЫЫЬЬЬЬЬЬЭЭЭЭЭЮЮЮЯЯЯЯЮЮЯЯЯааббббвггеебЩЩЫаЭЬЬпЩУУУТУЫЮПОНЛКИЗЕДГГАЍ΂S̭ЫѪѪѪѪѫѬѬѫѬѬѬѬѭѬѭѭѭѭѭѭѭѮѮѮѮѮѯѯѯѯѯѰѯѰѰѱѱѰѱѱѱѱѱѲѲѲѳѴѴѴѵѨѨѨѩѽѮѮѭѭѭѤѤѣѤѣѧѿѽѨѠџўќњљјіѕёЎvvvѬӪӪӪӫӫӫӫӫӫӫӬӫӬӭӬӭӭӬӬӭӬӭӭӮӭӮӮӯӮӯӯӯӯӰӰӱӱӱӱӱӱӱӱӱӲӳӳӳӳӵӪӦӦӧӧөӭӭӬӫӱӥӤӣӤӥӥӵӿӵӢӠӟӞӜӛәӖӔэUѥӫԫԫԫԫԫԫԫԬԬԬԬԬԬԬԬԬԭԭԭԭԭԭԮԮԮԮԮԮԯԯԯԯ԰԰ԱԱԱԱԱԱԲԱԲԲԳԳԳԴԭԤԤԤԤԥԦ԰ԹԬԬԬԪԴԤԥԣԥԤԥԭԿԾԾԽԬԡԠԟԝԜԚӗыUȞԥիիիիիիիիիիլլլխխխխխխխխխխխծկկկկկհհհհհհհձձձղձղղղճճկգգգգգդեէղլլիլչդեեդդեըստվվսսռշզաՠ՞՜ԗ}}}՜֦׫׫׫׫׬׭׫׭׭׭׬׭׬׭׭׭׭׭׭׮׮׮׮׮׮ׯׯׯװװװװװװװװױױױױײײײײ׳װףסעסעעףףץר׬׫׫׫׬׿פפפפפצק׶׾׾׽׽׼׻׻׺ױנס֞Ֆ0ԟךקججججحححححححححخححححخخخخخخددذذذذذذذذذررررززززدء؟ؠؠءءءآأؤإعجثثتدئؤؤإإإئخؿؾؽؽؼػػغعظظרןԒ0؛ٙ٨ٮ٭ٮٮٮٮٮٮٮٮٮٯٯٯٯٯٯٰٰٰٰٱٰٱٱٰٱٱٲٲٱٲٳٳٳٳٳٳٳٳٳٮ١١٠ٟٟٟٟ٠٠٢٣٤٦ٻ٬٬٫٫ٳ٨٥٦٦٦٧٧٪ټٿپپپټٻٻٻٻٺٹٹٵخDמٙښڦڮڮڮڮڮڮڮگگگگگڰڰڰڰڰڰڱڱڱڱڱڱڱڱڱڱڱڲڳڳڳڳڳڳڳڳڳڬڢڠڠڟڞڞڞڞڞڟڠڢڣڤگڳڬڬګڬڵکڥڦڦڧڧڧکڶڿڿھھڽڼڻڻڻںڹڹڷٷ׭DiiiښܘܚܡܭܮܮܮܯܯܯܯܰܯܱܱܱܱܱܱܴܰܰܰܰܰܰܰܰܰܲܲܲܲܳܳܳܳܳܳܲܩܡܠܟܞܞܝܜܝܝܝܞܟܠܡܢܤܯܬܫܫܫܷܫܧܦܧܦܧܨܨܯܾܾܼܻܻܻܹܹܸܷܽܺڲvvvGڞܙݘݚݝݪݮݮݯݯݰݯݯݰݰݰݰݰݰݰݰݱݱݱݱݱݱݱݲݲݲݲݲݳݳݳݳݳݳݯݣݠݟݞݝݜݝݝݛݛݜݜݝݝݞݠݢݤݨݬݭݬݪݫݻݮݦݧݧݧݧݧݨݪݻݼݻݻݻݺݹݹݸݷܶڬGܛݗޘޙޛޢޭޯްްްްްްްްްޱޱޱޱޱޱޱ޲޲޲޲޲޳޳޳޳޳޳޳޲ިޠޟޞޝޝޜޛޛޛޚޚޚޚޚޜޝޞޟޡޣ޷޼ޭެޫުޫޱާާާާާިީީ޵޻޻޺޺޹޸޸ݷܲ6ܟޘतமరరరరరర౱రర౱౱౱౱౱ಲಲಲಲೳೳಲೳೳೳೳ౱੩ࡡࠠࡡࣣत൵ବବବ૫૫ഴ১১১ਨਨਨ੩પம໻຺຺๹๹ุ޵ݭ6ޜᘘᙙᚚᛛ᜜᝝ᣣ᫫ᰰᰰᰰᰰᱱᱱᱱᱱᱱᲲᲲᲲᲲᲲᳳᲲᳳᳳᳳᳳᳳᮮ᧧ᡡᠠᠠឞឞឞ᜜ᛛᛛᚚᚚᘘᘘᗗᘘᘘᘘᘘᙙᛛ᜜᝝៟ᡡᣣ᭭ᰰᬬᬬᬬ᫫ᬬṹᨨ᧧ᨨᨨᨨᩩᩩ᪪᪪Ḹṹṹ᷷๹޳ӡᘘᙙᚚᛛᛛ᝝᝝ឞᠠ᧧ᬬᯯᲲᲲᲲᲲᲲᲲᳳᳳᳳᳳᳳᳳᳳᲲᮮᩩᣣᡡᠠᠠᠠ៟៟ឞ᝝᜜᜜ᛛᚚᙙᙙᘘᘘᘘᘘᘘᘘᘘᚚ᜜᝝៟ᡡᣣᥥιᮮ᭭᭭ᬬ᭭ᮮώᩩᨨᩩᩩᩩ᪪᪪᫫ᩩᳳḸḸබӪ_♙㘘㙙㛛㛛㜜㝝㝝㞞㞞㟟㟟㡡㦦㩩㫫㭭㮮㮮㮮㭭㬬㫫㧧㤤㢢㡡㡡㠠㠠㟟㠠㟟㟟㞞㝝㝝㝝㜜㛛㚚㚚㙙㘘㘘㖖㘘㗗㘘㘘㚚㚚㜜㝝㟟㡡㣣㨨㿿㮮㭭㭭㭭㭭㮮㫫㪪㩩㩩㩩㩩㪪㫫㬬㯯⸸౱_✜㗗䘘䙙䚚䛛䜜䜜䝝䝝䝝䞞䞞䟟䟟䠠䠠䠠䡡䠠䡡䡡䡡䡡䠠䡡䠠䟟䟟䟟䞞䞞䞞䝝䝝䝝䜜䜜䛛䛛䚚䙙䘘䗗䘘䗗䗗䗗䗗䘘䘘䚚䛛䜜䞞䡡䢢䥥䵵䷷䮮䮮䭭䭭䬬䱱䬬䪪䪪䩩䩩䪪䫫䬬㬬⧧֡㛛䗗噙噙噙嚚四圜坝坝坝坝垞垞域域域堠域堠域域域域域域垞垞垞坝坝坝坝坝圜四四四噙噙嘘嘘嗗嗗喖喖喖喖喖嗗噙嚚圜坝垞塡壣妦峳宮宮孭孭孭岲孭嫫媪婩婩嫫䭭㪪֡S䠠嘘旗瘘癙皚皚皚盛眜睝睝睝睝睝睝瞞瞞瞞瞞瞞瞞瞞瞞瞞瞞睝睝睝睝睝眜眜盛盛盛皚癙癙癙瘘痗痗疖疖疖疖痗疖痗瘘癙皚盛睝矟碢礤箮籱箮箮箮箮筭絵筭窪窪竫欬嫫䤤S垞昘疖藗蘘虙虙蚚蚚蛛蜜蜜蜜蜜蝝蝝蝝蝝蝝蝝蝝蝝蝝蝝蝝蝝蝝蝝蜜蜜蛛蛛蛛蚚蚚虙虙蘘蘘藗薖藗薖薖蕕蕕蕕蕕薖藗蘘虙蛛蝝螞衡裣襥輼迿误误议议譭议蹹议諫筭欬娨曛藗藗藗阘阘陙陙隚隚雛雛雛霜霜霜靝靝霜霜靝靝霜霜霜霜雛隚雛隚隚陙陙陙阘阘闗闗閖閖閖镕镕镕镕锔镕镕镕闗陙隚霜靝頠顡餤騨鸸鯯鯯鮮魭魭鮮麺貲议檪Τ盛闗閖闗阘阘陙陙陙隚隚雛隚隚雛雛雛雛霜雛雛雛雛隚雛隚隚隚陙陙陙阘阘阘闗闗闗閖閖閖镕锔锔锔锔锔镕镕閖闗陙雛靝頠颢餤駧鵵鵵鰰鰰鯯鮮鮮鮮紴Χ*ݣ雛ꖖ떖뗗뗗똘똘뙙뙙뙙뙙뙙뚚뚚뚚뛛뚚뚚뛛뛛뚚뚚뚚뙙뙙뙙뙙뙙뙙똘뗗뗗뗗뗗떖떖땕땕땕땕디디디디듓디땕땕뗗뗗뙙뜜랞롡룣륥먨볳뱱배믯믯믯믯*D墢ꜜ떖얖엗엗엗엗옘옘왙왙왙왙욚욚욚왙왙왙왙옘옘옘왙왙옘옘엗엗얖엗얖얖압압압압씔씔씔씔씔쓓쓓쓓씔압압엗왙욚윜쟟좢쥥짧쮮챱챱챱찰쯯쯯찰DL碢뛛얖핕햖헗헗헗헗혘혘혘혘혘혘홙혘홙홙혘홙홙혘혘혘혘혘헗헗헗헗햖햖핕핕픔픔픔퓓퓓퓓퓓퓓풒풒픔픔핕헗헗홙휜힞MT衡욚햖TL棣훛襤裏響ﳳﴴﱱﱱﱱﰰﯯﰰﳳMB㣣𕕕𖖖𖖖𖖖𗗗𗗗𗗗𗗗𗗗𘘘𗗗𗗗𗗗𗗗𘘘𗗗𗗗𗗗𗗗𗗗𗗗𖖖𖖖𖖖𖖖𕕕𖖖𖖖𕕕𖖖𕕕𕕕𕕕𔔔𔔔𔔔𔔔𔔔𔔔𓓓𔔔𕕕𖖖𖖖𗗗𙙙𜜜𝝝𠠠𣣣𥥥𨨨𬬬𾾾𿿿𴴴𳳳𲲲𲲲𱱱𱱱𱱱𳳳B-פ𝝝𘘘񕕕񕕕񕕕񕕕񖖖񖖖񗗗񖖖񖖖񗗗񗗗񖖖񖖖񗗗񖖖񖖖񗗗񖖖񖖖񖖖񖖖񖖖񖖖񕕕񖖖񕕕񕕕񕕕񕕕񕕕񔔔񔔔񔔔񕕕񔔔񔔔񔔔񔔔񕕕񔔔񔔔񖖖񖖖񗗗񙙙񚚚񜜜񞞞񡡡񤤤񧧧񪪪񰰰񹹹񴴴񳳳񳳳񱱱񱱱񱱱񳳳𷷷-🟟񘘘򕕕򔔔򕕕򖖖򕕕򖖖򖖖򖖖򕕕򖖖򖖖򖖖򖖖򖖖򖖖򖖖򖖖򖖖򗗗򕕕򕕕򕕕򕕕򖖖򕕕򕕕򕕕򕕕򕕕򔔔򔔔򔔔򔔔򓓓򓓓򔔔򔔔򔔔򔔔򔔔򕕕򖖖򗗗򘘘򚚚򜜜򞞞򠠠򣣣򦦦򩩩򫫫򹹹򵵵򴴴򳳳򱱱򲲲򳳳񶶶𵵵񡡡򜜜򗗗󔔔󕕕󕕕󕕕󕕕󖖖󖖖󕕕󖖖󖖖󖖖󕕕󖖖󕕕󕕕󖖖󕕕󕕕󕕕󖖖󕕕󔔔󕕕󕕕󕕕󕕕󕕕󕕕󕕕󔔔󔔔󔔔󕕕󔔔󔔔󔔔󔔔󔔔󕕕󕕕󖖖󗗗󙙙󛛛󜜜󞞞󢢢󤤤󧧧󪪪󯯯󶶶󳳳󳳳򵵵򶶶񳳳W奥򞞞󘘘󔔔󸸸󸸸򸸸岲W󡡡󸸸g覦gȠ>Ũ>O˨OPP57bcbb9qީޥq9=aΨ੩멩響響먨দΦa=????????????(@ 222bbb xxx}}}zzzwwwsssppplllaaaNNN YYY ~~~ {{{ zzz www ttt sss rrr ooo ^^^SSS000 &&&&&&&&&&&&|||&yyy&www&uuu&sss&sss&sss&rrr&jjj&\\\&WWWDDD "+++++++++++++++}}}+{{{+xxx+vvv+vvv+uuu+ttt+ttt+qqq+___+ZZZ+YYY"IIIZZZ !11111111111111111~~~1|||1yyy1www1www1uuu1vvv1uuu1uuu1rrr1aaa1\\\1ZZZ1YYY!111 46666666666666666666~~~6|||6zzz6zzz6xxx6www6www6www6xxx6ttt6aaa6]]]6]]]6YYY4OOO"""&<<<<<<<<<<<<<<<<<<<<<<|||333 UUU BOOOOOOOOOOOOOOOOOOOOOOOOOOOO~~~O}}}O}}}O}}}O}}}O}}}O}}}O}}}OjjjOfffOdddObbbOaaaO^^^O]]]B... ... BUVVVVVVVVVVVVVVVVVVVVVVVVVVVV~~~V}}}V|||V}}}V}}}V}}}V}}}V~~~VrrrVgggVeeeVdddVcccVaaaVaaaU^^^B :]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]{{{]jjj]iii]ggg]eee]eee]bbb]aaa]\\\:(ddddddddddddddddddddddddddddddddddddddddllldjjjdjjjdiiidgggdgggdeeedbbbdVVV(uuudjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjpppjnnnjllljjjjjhhhjhhhjhhhjeeejcccd===PqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrtttrooormmmrlllrkkkrjjjrhhhrgggrfffqaaaP'xyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyuuuypppyoooynnnylllylllyjjjykkkyiiiygggxUUU(d΀рԀ݀πvvvrrrppppppoooooommmmmmllliiieeed)цч؇ׇćvvvtttsssrrrqqqpppooonnnmmmllljjjTTT)gӏڏۏwwwvvvtttsssrrrqqqpppppppppppplllhhhg{{{ؐ۔ڔwwwwwwwwwvvvttttttsssrrrrrrqqqpppooo???HܖؖzzzyyyxxxxxxwwwwwwuuutttuuuuuutttpppeeeHwߚߚߚߚʚ{{{xxxwwwwwwwwwvvvvvvuuutttttttttsssrrrnnnwlllߞޞݞܞ{{{zzzxxxxxxwwwwwwvvvvvvuuuuuuuuuuuutttqqq<<<4ԟߠߠѠ|||{{{{{{zzzyyyxxxxxxxxxxxxwwwwwwwwwxxxtttccc4UţƤդפݤޤܤ~~~}}}|||{{{zzzyyyyyyxxxxxxxxxxxxxxxxxxxxxvvvkkkVq§ŧƧ̧֧ݧާקϧΧͧͧߧߧϧ~~~||||||{{{{{{zzzyyyyyyyyyyyyyyyyyyyyywwwpppqªêŪƪȪɪʪʪɪʪɪȪȪǪɪܪߪުݪϪ~~~}}}||||||{{{zzzzzzzzzyyyzzzyyyyyyzzzyyyyyysssîîĮĮĮĮĮîîî®Į׮ܮۮݮܮݮ߮خî}}}}}}|||{{{{{{zzz{{{zzzzzzzzzzzzzzzzzzzzzwww̱ڱڱٱڱٱݱ۱α~~~|||||||||||||||{{{|||{{{{{{{{{{{{||||||xxxѴڴڴʹӴݴܴ״ô~~~}}}}}}~~~}}}}}}}}}}}}}}}}}}}}}}}}{{{׷߷ܷɷ˷۷۷ٷϷ~~~~~~~~~~~~|||ѺӺ޺Ӻغֺպ|||þʾԾྴȾ׾վӾϾ}}}}}}ëëìíííïïïðñññòòñòòòòóóôõøüöûéòûÝÖÓÐÌÊÈÆÆÄÅÄÅÃ}}}cŪƩƪƪƬƬƭƮƮƮƮƯƯưưƯƱưƱưƱƲƳƴƵƷƴƦƨưƚƖƓƏƍƋƈƇƇƆƆƆzzze>ǩɨɨɩɩɪɫɫɬɬɬɬɭɭɭɮɮɮɯɯɰɯɰɲɳɳɷɽɱɤɣɸɿɤɘɕɒɏɌɊɉɈɇɇuuu>gggǪ̈̄ͨͩͪͪͪͪͪͫͫͫͬͬͬͭͮͮͮͮͰͯͰͲͲͳ͵ͻͳͯͣͭ͢ͳ͕͓͍͐͊͌̈͘͞XXXϪϫϫϫϫϬϬϬϬϭϭϭϮϮϯϯϯϯϰϰϰϱϲϳϵϵϫϯϱϦϤϩϬϟϛϘϔϒϏχ`ѪҪҫҫҫҬҬҬҬҭҭҭҭҮүүүұұұұұҲҲҴҪҧҮҭҳҦҤҥҹҸҥҟқҘғф`tttЬԫիիիլլխխխխխխկկկհհհձղղղճիգդեսլմթդդկվկա՞Ԙmmm֫׬׬׭׭׭׭׭׭׮ׯ׮ׯׯװװװױױױױײ׭נןסףצ׳׫׷׫ףפש׾׾׽׼׸ר֙:؟ڬڮڮڮگڮگڰڰڰڰڱڱڱڱڲڳڳڳڳڬڠڞڞڞڠڢڳگګڻگڥڦکڶڿڽڼڻڻڸ؜:ۛܩܯܯܱܱܱܰܰܰܰܰܲܲܲܲܳܳܲܨܟܝܛܛܛܝܞܣܬܫܿܳܦܦܨܮܼܻܻܹܽ۱=ݛޚߣ߲߲߲߲߭߰߰߰߰߱߱߱߳߳߬ߢߟߝߛߚߘߙߚߜߠߨ߼߬߫߷ߧߦߨߪ߸߻߹޹ݤ>ᛛ᝝ᣣ᫫ᯯᲲᲲᲲᲲᳳᳳᲲᯯ᪪ᢢᠠ៟᝝᜜ᛛᘘᘘᗗᘘᚚ᝝ᢢỻᴴᬬᬬἼᨨᨨᨨ᫫Ჲỻరԝ⚚㛛㝝㝝㟟㡡㥥㧧㨨㧧㥥㢢㡡㠠㟟㟟㝝㝝㛛㚚㘘㗗㖖㗗㘘㜜㟟㥥㲲㭭㭭㪪㨨㩩㭭⪪ԛO䚚噙曛朜杝杝枞枞柟柟柟枞枞杝杝杝朜曛暚昘昘斖敕敕旗晙杝桡氰毯歭毯歭橩媪䞞P癙蘘虙蚚蛛蛛蜜蜜蝝螞蝝蝝蜜蛛蛛虙虙蘘藗薖蕕蕕蔔蕕藗蛛蠠襥达误议豱误磣lll阘ꘘꙙꚚꚚꛛꚚꛛꛛꛛꚚꚚꙙꘘꘘꗗꗗꕕꕕꔔꓓꓓꔔꕕꘘꜜꢢꫫ귷꯯ꮮ겲Ǯxxx똘얖엗옘옘왙욚왙왙옘왙옘옘엗엗얖압압쓓쓓쓓쒒씔얖욚쟟쥥췷촴쯯쮮쵵ҿ響ﲲﯯﮮﵵõ𖖖𖖖𖖖𗗗𖖖𖖖𗗗𖖖𖖖𖖖𖖖𖖖𕕕𕕕𕕕𔔔𔔔𔔔𔔔𔔔𕕕𘘘𚚚𠠠𦦦𲲲𻻻𳳳𰰰𱱱𸸸ն񚚚񕕕򕕕򕕕򕕕򖖖򖖖򖖖򖖖򕕕򕕕򔔔򔔔򔔔򕕕򔔔򔔔򔔔򔔔򔔔򔔔򖖖򙙙򝝝򣣣򪪪򼼼򵵵򲲲񳳳񯯯T坝󗗗󔔔󹹹嬬Tà@ǽ@>?sääsI|ǣत𧧧𣣣ࡡȠ|I????(0` &&&===<<<;;;:::888666 ~~~  }}} zzz uuu sss sss fffUUUCCC )))!'''''''''|||'xxx'vvv'ttt'ttt'qqq'ddd'XXX!NNN*///////////~~~/{{{/www/vvv/ttt/ttt/ttt/jjj/ZZZ/YYY*JJJQQQ '666666666666666{{{6yyy6xxx6www6www6www6mmm6___6]]]6YYY(,,, 8>>>>>>>>>>>>>>>>}}}>zzz>yyy>xxx>xxx>yyy>yyy>ggg>___>]]]>[[[8DDDEGGGGGGGGGGGGGGGGGG{{{GzzzGyyyGyyyGyyyGyyyGuuuGbbbG```G^^^G\\\EPPPNPPPPPPPPPPPPPPPPPPP~~~P{{{P{{{PzzzP{{{PzzzP{{{PkkkPcccPaaaP___P]]]NPPPUXXXXXXXXXXXXXXXXXXXXXX~~~X~~~X~~~XXXwwwXfffXeeeXcccXaaaX```UKKKbbbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiiiagggafffaeeeaccca___X444Mjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmkjjjkhhhkfffkeeekdddj___M+sttttttttttttttttttttttttttttttrrrtmmmtkkktiiithhhtgggteeesUUU+,,, o}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ttt}ppp}nnn}mmm}lll}kkk}hhh}eeeo :ЇՇŇvvvrrrpppooonnnmmmllliii]]]:wؐÐvvvuuusssrrrqqqppppppmmmjjjw%ەyyyxxxwwwvvvtttttttttrrrnnnUUU%W֚xxxwwwwwwvvvuuutttttttttqqqhhhWۀߟݟɟ{{{zzzxxxwwwwwwvvvuuuuuuuuusssoooTTTƟףܣף|||{{{yyyxxxxxxwwwwwwvvvvvvuuusss888'¦§Ƨҧܧݧԧͧϧߧܧȧ~~~}}}{{{zzzyyyyyyxxxxxxxxxxxxxxxuuu^^^'@ëīǫȫɫɫɫȫǫƫ˫ܫ߫ݫ߫ݫͫ~~~|||{{{zzzzzzyyyyyyyyyzzzyyyxxxiii@M°°°°ðְڰ߰ްݰݰְ||||||{{{{{{zzzzzzzzz{{{{{{xxxmmmMVʴشߴݴδ۴ٴɴ~~~}}}~~~}}}}}}}}}}}}}}}}}}qqqVX̸ָո¸ӸظӸ~~~~~~~~~~~~~~~}}}tttXQռʼҼƼּӼƼsssQGrrrG,©ĩŪūŬŭŭŮůůůŰŰŰŰŲŲŴŷŸũŭŪŔőōʼnŇņŅńńĂlll,___īȩȩȪȫȫȬȬȬȭȭȮȮȮȰȯȱȲȵȷȸȫȦȽȞȖȒȎȌȉȇȇȃPPP̩ͩͩͪͪͫͬͫͫͭͭͭͮͮͯͰͱͲͳͼ͸͹ͭͣͶ͚͖ͯ͒͐͌͌̃rϩЪЫЫЫЫЫЬЬЭЭЮЮЮЯабгдЫЯпвТЭнФМИЕБτr.ҫԪԪԫԫԫԫԬԬԭԮԮԯ԰԰԰԰ԲԫԤԫԫԵԢԨԿԿԱԝԝԖ|||.תثثجججججخحدددذذذجؠؠآؽتطأئضؽؼعئחU٨ۭۭۭۮۮۯۯ۰۰۱۰۱۲۲۪۟۝۞ۣ۟۵۪ۻۥۦۯ۽۽ۻۻ۹٣VMMMݡޭޮޯޯޯްޱޱޱ޲޲ްޥޝޛޚޚޛޞޯޯު޿ާަެ޹޺޹ݳZZZH᜜ᥥ᭭ᰰᰰᱱᱱᱱᱱᮮ᧧ᠠ᝝ᛛᙙᘘᘘᙙ᜜ᠠ᭭᭭᧧ᨨᬬᴴṹપH㚚䛛䝝䞞䢢䤤䥥䣣䠠䞞䞞䝝䛛䚚䘘䗗䕕䗗䙙䝝䩩侾䬬䰰䧧䪪䭭㩩͝瘘皚蛛蝝蜜蝝蝝蝝蜜蛛蚚虙蘘薖薖蔔蕕藗蚚蠠蹹贴譭贴窪秧Ύ5阘ꙙꚚꚚꚚꛛꛛꚚꙙꙙꙙꗗꖖꕕꔔꔔꕕꙙ꟟ꦦ겲꯯길5L眜엗혘혘홙홙홙헗헗헗햖핕픔픔퓓퓓픔햖훛LJ圜𗗗𖖖𖖖𖖖𕕕𕕕𔔔𔔔𓓓𓓓𓓓𓓓𕕕𘘘🟟𧧧𸸸𲲲ﲲスJ7ٞ񗗗򕕕򕕕򖖖򖖖򕕕򕕕򕕕򕕕򔔔򔔔򓓓򓓓򓓓򕕕򘘘򜜜򣣣򰰰򲲲򴴴񴴴ٵ7Oנ׽O_Т_7ɤɢ75ZlxxlZ5???( @ 000 333 111 444 333 222 444 222 BBBFFF&FFF)GGG)HHH)HHH)III)III)JJJ)JJJ)JJJ)KKK)KKK&FFFSSSKKK0III4JJJ4III4KKK4KKK4KKK4KKK4LLL4MMM4MMM4NNN4OOO4OOO4OOO4OOO0EEEyyy)@@@eee@OOO@MMM@MMM@NNN@OOO@OOO@PPP@PPP@PPP@QQQ@RRR@RRR@RRR@SSS@OOO)6oooMaaaMMMMMMjjjMUUUMQQQMSSSMSSSMTTTMTTTMUUUMVVVMVVVMVVVMWWWMVVVMWWW68nnn[[[SSS[vvv[[[[[[[nnn[YYY[WWW[VVV[WWW[XXX[YYY[ZZZ[[[[[[[[[ZZZ[XXX8^^^*gnnnhhhhYYYh^^^hhhhhhhhhsssh___h]]]h^^^h^^^h___h```h```h___gSSS*+++WWWluuZZZuuuueeeuZZZuooouuuuuuuuuuuuuueeeudddudddueeeuddducccl222TTTHZZZ___„uuu```bbbxxxjjjhhhhhh^^^H ^^^]]]|||jjjkkkŒ’ccceeelllyyyiii VVV1aaa```dddccczzzŚǚƚiiiiiiiiixxxyyy3```[dddcccdddhhhʟɟɟppplllnnnppp[fff|eeefffffflllkkkʦɦɦwwwppppppqqqxxx|lllggghhhiiinnnmmmooo˭ʭʭíssstttuuuuuupppiiiiiikkkkkkxxxoooxxx˳ʳʳdzvvvwwwxxxxxxyyyssslllmmmnnnooo¹ttttttǹ͹̹̹˹yyyzzzzzz{{{|||wwwrrrooopppqqqzzzwwwxxx}}}|||}}}~~~xxxwwwsssttttttvvvŰŲ{{{{{{{{{řżłŀŁłŃŃņŃŒxxxu{{{vvvvvvwwwwww˖˿˖{{{|||}}}˧ˊ˃˃˄˅ˆˆtttvtttAyyyyyyzzz{{{уѼфруѷјччшшшxxxAGGG Ā||||||||||||ײעׁׂׂ׍צ׈׊׍։JJJ p~~~}}}~~~ۜۿێۅۅۇ۔۴ۇێڃphhh̆က၁ጌ῿ιᰰ቉ᇇለለᛛ῿jjjQ㈈䃃億億嶶忿忿嗗劊勋匌卍妦㼼Q芊醆采顡鹹鏏鍍鎎鎎鐐鲲ʼnUUU쎎퉉ʢyyylll񓓓񎎎򺺺򿿿򾾾򾾾򾾾򏏏򒒒򓓓򔔔򓓓򟟟̐WߛW暚Mő彽ōM~~~??(0 OOORRRRRRPPPHHHMMM FFF GGGIIIHHHJJJIII QQQ NNNlll NNN'III2III2KKK2LLL2LLL2MMM2MMM2NNN2NNN2OOO2TTT'[[[ www>AAeeeAPPPAPPPAPPPAPPPARRRARRRATTTATTTATTTAVVV>ZZZyyyRjjjRtttRRRRRjjjRWWWRWWWRWWWRWWWRXXXRYYYRYYYRYYYRZZZiiiammmee~~~e^^^eeeeeeemmme^^^e]]]e^^^e___e___e^^^a^^^XXXawwwww\\\wooowwwwwwwwrrrwbbbweeewdddwcccaZZZ([[[iiiċhhhdddvvvhhhhhh(___d___{{{eeeǘttthhhpppdjjjeeeccceeeoooǠmmmmmmzzzxxx___iiiffffffmmmzzz©ȩƩppppppsssmmmccc,mmmjjjjjjoooɱʱɱwwwuuuwwwzzznnn,ggg.rrrmmmnnnsss{{{sss̺˺ʺ}}}zzz{{{|||ooo.hhhxxxqqqqqqrrr©¤xxxyyyª½‚‚‡•cccyyy{{{wwwuuuuuuʑʿʈ{{{ʀʶʋʂʄʅʅzzzzzz{{{zzz{{{ұҁҀҌҘ҈҈҉wwwE~~~|||}}}خؕ؄؄ؑا؊؋yyyE࿿໻൵|||0ފ愄挌濿栠拋挌捍楥ު0Uꎎ눈뱱뾾됐뎎돏됐배길U`ꕕ𢢢𾾾𾾾𮮮𔔔𑑑𒒒𙙙𾾾껻`6Ȥɮ6QQ'>>'AAAAAAAAAAAAAAAAAAAAAA?AA(  ^^^LLL OOOOOOOOO bbbxxxLLLHHHHHHJJJKKKLLLMMMQQQfff ND|l lySL eFs5z|Xmr,ӲFO֚9/m5( On(J"l3˃=RdՆ{z8|XW̷& 'H+oma"K{#@ȷ+BD}tɱ>A( yaTڴ|(GNa-kPcN-rKcb cRqU'F."MxBR[w <N juۊ\NGάĥT`Lf9:yEOŠD2P$tu8f!1츯Ҫ 2K2y/'Tlv*%˼I-IyvTUAA+ը%3'$5w֦R=]Almi^ztq,2q@:#^BD-`&lC;z"K{ϳ”̥xBX;AM-c :XYTUXf[{T:@̗ s6'GYDŽv9\-.&AWإ1Uw, /ZM\6=uң/O@%^n6smpU Bn"Z2FU`2TJ:'NLMC ն›JjOѤ!0=yVe"WrP+cBB?RHMչ`%p c=TM@OkN.pl;-9yC:ŸlKSPDң,i U:IeIT=pݲ__ބ&.~w)PJYRR\vmouNifjZ2tcP3q DWTWe.%H٨p3pezt5a!1!yNp3ZuVwmۈgZ2(+6{(>\ruV\'&.I^j,~U-M[>} -C Km/SpO*鋊"--lc&0+h}Ca:"UUL iߍN>RPͬ^GvcD Zrr.qKzo:#pR łPvd16(z=GeGEARtIc?cʊ.7Qw9V܅Į~(!OUoD#'{ӿmo*OϜ!kyG Lll-me-#dJ!q=J5Μ"HT K+:g2>=SPgᣱh`ol~ =Z@j PZ7DHH=vUOSa( ].b Vd *(lXO ݍ7+C+5(jOe˅+$qurd3rc-*|)I JK pDF}T>.kdNo]COEɄ} ]8$B"ܦ! $,7Q,^g:v>Is',cjc ȝ uPM;W;P?I Ey%%2;bҼ|p\oioY `*]w|~=ֿٞ%N6Y2?R>ߨӎ=59]nKZCu<͜2'mmnr+X_j]֡\`UYJiGJsxAq7j/Բ4٫z 5^%b6+Gx*|Sif7JsT)R܋$p}O^MT+b=[S`T,ÖS G60Co[qXx̻b\rXOԲLM' BCJ_-VC$[4~xH-,(Oaoko] (:ֵbf-!u.BQlxNFuxhܓbS̉~?' \1}gUcdp:;^0C5SwY``vVCXK͇9Ae1$kteH_JϖiiFU>a^(56.U3QayJx>}>=n+aC%kh 1 :|I&hm}g~?aVU$8naӨ춴x9H0=\2 J-+\2>lz7h}T' -;jttA/ __ DzԱRd1/(r,+XX1& @W*YfHyƃ/e T]j=1=K+t,ǖ\}̜P~GHGQ:`Tpmfslސ+Ӊ|g5iXfr!Gc%Vٔl\+rł℟1o8$GzۦSh}&w0EeU(lB\1ņu& J҈ߟjm/:Dc BɿʏCfnz6-L RoZ րU< yT(GΑ8(XQf}OF|'|Yn>窆'Fx7Yq߫zC~6ȅh?Ͳ ‹X9 ge-͔>ABZx<6m)`nq8.#PVd(R6DIwcr+:bWiT6)8A$=_hPCM#&@^V6)U$ ٥CH\I(:ȹT. 7!4-l<] j> +QW5%1o^h.}IG~徭6fAC9P4sǁބPC#34RЙ"zϠwQ942X󕤱eƝ ɾsG_쌺{iAذ`+ouJ`Z.8m{"M?zGOz;>"_' ܓK<#?AWO־r$ԷOXOOU9 [^BuzMnF;s\P]p!EdↆB!'OgD{ӇRfbwPUt58k>qC^429՗KϾڟ}w}l!{"d:5f L|r3 pE-zY21199~KX*<,[E#\ J-"XyZl` =)*gJBJtKStE=hL[+sr" o93Kl@&nq=!Cx|ctA4O"JKjw[<}n͏ODB][ IWR>ENd:%2_үx|a7%gb-AN.Iq1=eV6t'Bu%ۃu}OB?ҳ{`dԍ0pi˩Id+.3uUa21ln N ~&@r7jD8rI$لt$ť, B/: |bӂ ~+߅@ .q]<^ `Bn¶D{GJ|MaOm AhyGg}>T^ ov?,;bz;V0ۥ[ٯ^ťtHkm&SëitKL ŷ{ukˆ^= j4Cؙ;w9=4h#e_1!;3Gg?ȧ`ڂ{6edkx=WXSV],:'IXd?D1*"@{Y]p(`Gl*𸰸XSBZKJ`Zfcй>l| SV!gguб8xj јW_k1^X#4sK?^i1,n s Ud53 7󿌒hG"@[w&? LA$yd拌.IW\P2!vmS6%ȍ|,[p?N@rx*qIMz`×uٌ#$vӺξ[r!1&=yؠYh?d&xĎ8^˫C HS?xVGYqpk:y}7 hV| HwU7gz06E/nG&)C Z)o;D zLxQI 6JLXC2!|4"!9i3 юoPnەIklGk]- Ny#¹Q!Ih><^UB U >ZR(!.(#zќɸwvɧ 51QrO1, ӧkĘƠJ@Пd`Ll2v'Y.\w;X'Mj9 A k)"(<俹ۊ(;na eqAo4+IJz$+'K]* nW2 zy΍( ;y5E ^n)!<^dX ;s.|hF(ӳ2~7e/e40%nYjG5z>t[fqrlsّ9y] 0X,l߯YfRDKrG3wu~ 4HvP"m1xz'PsgJ-褹cU2p[ʐwc$S@oN^.~\ruϰڀ 㓢t{ oA6q&ނy#?Ffx-wӞ ) &ncӐZݗ⃌SFܠf /3lwv^yUh$鬦 s3} HC,/iܤ:_1&ۇ@,-S',+cBn n~f1e m[?swn5]qc3U]3X%V@@d}x/nODrK]{K3H0FLȜ7hjIjK ]L`?CYW6z 1"wlL~cy4-P'pfJ K)(hiާ)<,7LTR3s >Ct` #b[쯽 y_]t9<~Mml#*)ד,9g ,ʌqvSGr](_#E>WI>#ƞY4qao'#W͸nlRuU}SkSo4*qbxiD TO^dە-?{y4hik\?V9wE4"#} ;LbiphU qor65XbˢE?cte9DI*\O-v o?wW!8"Ph|e #ϟE#kjV3 ph0]Hg;t.I&.@bk$0,!n]y5tBOf~R(,d]b!Zn|kuc—qtoEvWɚ|yw~"gÜD(q@,yF#$Dba 6u?% CH9a2!`!8؏ס)0bvc HXnK]tVo1XCu[GLe"㹏W&  x@ #RZ*eEĝR9Pd$O$vDgF?T$g{mM)b)DϦҚH.MnoCi˚*آ }Ia6x\=:J3Xatmx_1Eʴt> -B+|9_[Y]?:Vm! ݰ\ְ`4WԽ%5W.FQIxZ5b2+\+}5f?IW0Jn~(q:cJvc,)-GFII9\(HHCۄE< 8JO[b1r`rAyizNN sQ~4)eb?~7%Vj5n$_X\U#ݥSopVOqN ؽuIm/) ?sZ_X<.kbsEzݸ|ແXmY<"D6.4>\-AiB)WYO΋@«,%݌jzf%_U2Mdu>6-_qfnꤙ n;6k4ڻiڅOyёѠ>LF,(: W :<#i8`+t,"76LY ."lY@ >"R'ߙ0ElJT5jK&L#>E doK]a9Yҥ4/W" ٽ=\ w˂ 4Vȳvn`OU@Ej.zXC zPN*ĩk]*ƾHvmRJj$ayjjL~ur4wB4G^mß%/kȈ<ҙcJКdj2rzUH"Af9T02^RC"mee h %{[_ mEdF^gˁW0yZJHF[/IcU:J |'.+˘GKmf)j ġ8T"ΞxE!ؠWt~>Pdk:݀+ej/Kၠsx#WSoeAISϙ]6Wb79 9 A)#9)鼫N0xc,Խn;xW',jJCA'сHG('} љo믴LbNsՙD0VWһ#gmGp3Zjǫ-eq}*(p;5d P U)ɑ t}K q_4³ In8Ay b4xF @P՝ ec1,S;yFXꟜd1 TL5s~p%$3S足pdn5ovrt%$U17S,e!2qaP7EȷT#RKIL897o~kMuǁ Brly]vt >T׋[Hs_?+WAyCQG>颪:^l5^$+rںZ&J5_Z'ˤg8V81߻]dF]V*UuBp?aSW™utͶR~8vo!Fg"/x^u$oNU1\D@hhC8tB9 {hݢ%,@mUc AzN@0#;Z`Ṇ8ԋڹ5" VYڀ: {T^^I9ȣK9b6גZ!<2k$Nc_!Wvc .:`?tOlJ!b6ŅG6fKE7+8&-b }Ej»s |$FA]}!IO$7/5p']< _*H *k YKu֯E}я{Tq܄>c8.BЍTq*F! }S2hE(GS9W>}UAXhpQb hȥ#(e( u)ľ%4wձe:IH7 *sH4)4G7]>r'Q+u]pЈ֒#$E0soߕɇ ^Ջm1iR&f|nTmII;a|ʟ/fu#ĚUě+Ck?[^Qs@۠>ͨ7a˒:p{jtxZ|>jV|"(}+wڦOPkLͯqٖ/שOF¥1^W$gda~2KgGtYN\LlSP<^DG9}PDž+Op\9t$hYZ*kK:RI+{&SV77^![#;.*~G3O)h46U8oj6(:mN(C3A<[a_¨I3RƂR0,e"6FdWTXwrnsSU> ,B`Pw]7hi&YQQGnyKߏT(ɴu\OL]ɼFZ,#dT5o8T 4];AR J/&/Ԣ~b(X1옮PɧH6F'<: 8_RGVͱ79R,j[hϋI4N "cq*)_FJKXۖ/1fsnjXϢnqBTc:e+ ̈́ͮإ+ 3CBwjx`5kx knund:K2U |oϿf'߮0K7,EI2*|#_%$jaZ|uJ*8QT)! O Lw("tj-DZs[?])vn@s!MwWtSZ KT%wf{ R__~F?򻙙!H %C7/^3 UΉ5To,KG{ ca>Jq}g^5=ݰ, /+ªĐ|/)yO1G-ow{Xɕ1T Ep5*fnl}L;곬$t# &%z^>R򗔽RBCJRÃfGiSUA ċm3vmG6|Q?_,]tJ޻{:|/){jަ p2Lzxoh57DˍH˰x"Kn= SR: #kЛ忀ƂU N+ h"'k)3aL!v踘"FbR&M$-GF=ד W+}E"xPTqQePP蝫"W,;ڼSM趡@&&)QHB1)÷j!& mLدQ 󌥛seTx2@&qpTXΪE%> Q#TzJ؏pW!굃Uz֙FVǐ#){Nݛ}@"A+5L +'K9 /PjlFեs $Vh?2f;\Ax& !4+zW^Pǣ/iT]`HWl}?uI.okhFs'$2R Ľg\ܠmmyqp›E>9U [|]?[zMx8<굏8)* K?λw ZsWi 9EPHqow7 )CD۫7MLdRGl։В55hu zcP; (i48gu WK.%(~-sP$-^;Js{K10*l̴.,,w7ˠ~ӧ,]&8@K/䒢ȑ.M )K%o&: o:FB{ޤ_.J)EN}CSEOy~":Qv_ʪҩ#XNed8* ²U=p ͷ bzϻ9]6+i_ YMҷ =PR%K$;Eٍw"bcH6:.ExbxJ3!®qc/*/&ΒVO@!Gr)ξ)Ǵc%+ c& HO6u~XϸpW$>>\WP/=nJ_aQ~-f}eX}\3a0y[>~ܓKͻG?h3d ( h4SU0@#|I)= ZfД{!H@Xo7sZ|f^eD&P;U$C5rX!w^zcy=r OĮHWdU| D18^]<%h͛ޠn$9;?x"|ESn5 @zІ3:/"fpVP^h{7Oݪm7oe ؚo!YME }#z臲'!YqGsž9,C;>e%BX>!1ϊo-z K.iC̥-bA6?FH`O}QS9ҍqLeO7\rn2%U,f1ap*M>: }v|h`p6Q;9teF:A؏t_us[ mZ@|E{B)v|߃Op; k+b hcf,š D ~?T7zCF8iA|m-YDO&]g#rNV!4`t|JJxHL (uϿmSOO6jۈL-S2vX2 QACL^@o!a>6yWqҤmU&{!D)UXQ@mmej@_Ye=Ox*hRh -躍cT=/}gK!B:6hZ pOJ|?[zȬ^Zb$kœfTf4Š}Y2TA[ :8R/OD1SK/o(>\nشNNce[#VZ|<߻sdvM[+}b_x+w B(N0sҦI B# xiʘo do`4BdhvU+fޱ3OmlNI? '˧ѠI>­vf/} TlZ#r{TR71}0^hf%U?S^h4Ik z|俜 {љ}<_IMUhwWu] wR0&5ƙ=laEЗJm> \x>m&kT,PyMYǻh]V(Sz^6B[ n!CR@F _x:\H=ٝxH}niҤsR5* t~E %մ33}+ /_)+f=@*0X'\z[ /Jz^0jjZLHлÂ;UTspc m8sx%HVlm/؝,^m}i8̡&{?DzE/ؐ0$\ZoEO1ԆD [VtklcK v)}:'>kxG=0 }a^MwĈuvG%BBN$ VrylcRHduiu]R{𷤻.Zܦ3uO@B MZ6#\|IEtT&_GT;G$CIdw{ 2{Wo 3ǝ;)$xKw^M Mo'\9ٯ~UoX<,q߈ +=ΐ_`84ix5#+* c`3X|2cJiad?H(k6j\?戀uw~6N?!Ek~w:|3U衍 trw |o5n\A1x\QtؓpΥ.d &T[7:^ʋ#ۿXB;.vNYJeSl¤7K6KfR׉8XLM]7ïlne9x#\5'RQ 5[: ,|I"\r^2VA]r]$KOhyӹ||mVbAо]nmzkt$kˢK*rJAzxTx[B?>?< I]+ %Yslδ Z~FKh.—xD )vDeя@ŤB,Ƿx I=3**0džn%ϤV4WUzJkj?jnӄ~crgײ@Xĕ^ A[ť 48bq]|;OpZ>`_7E6 PipfT` P) seQ3}ow- `r_`c ڻڌ~}[}[۹Wչպdg&x~2- "9Qf D^ OS|;m"[JвPFo1Q#${džXI%e4?m݃CptsQVz} J^&gG=Hn>x|`3; \*sogkؿ`Vxh)ʣC)6DMɟHHXn}-#}.&콧?!C|iI>#? D^uKa^\l> n'(Ӵt/-'vўW-c?S=`@2ovejv{Wu!75TDmyDI`j6>gJ+p)UɉfĆgAt\+WyNCl*#==I[∮^k'b#=ҮP|8%#}=zon"LiW &c%2W H.J3&X ! ̟-l3#y#wJvKk3DwI>;Dk{F~23Zt0#s^_'fE#-cQο[0_:Ĥ_d$DGY@p= - Jxa&WMSydSG&E&б*wuELս bDG=١m9LoWlG2PV>͖lÂj l8*O<}Mz^ъC5RAJ SOB:ypiL FGlvN [εn>C9 5㵲Rw/`Z7z73)Mq ?x4aEF֗FLnZٶ! G1vC>axR ߵzە5}-.&+yKM;!{?;b%;,E]БlY'z.EBXÉLp+e*n1Q%LiJ\<WR?o}۾0怮͎Vv9U1+db&pxGuߧ6ZWV33xVʾ˃Hi9koe%WB>] |W|#Ts`JG$g{-潲o#mjf5Sbܳ%Ԇ, ?utnbRi 3>H 3N$yiN {*LwVKd `%'*~cm}̴-i[Jp9dVݡĆt 2 hRҟ<HdR =[xA~0fZ ۴urӋ._! WƪGz t? ~t4I}mvdt| Ȫ؇8J >Od+j<UJ(Go)]cŐkQlsoT c3 4HW5\TT{^&a22$BHyvʦEYni$>@*|U.#U%Ef),((>3`QsIxF7CNq^?~~٨c.3&e=w{GjV$wN{ucy7jc \J Weݳ_WOO 27a&eXyr*W,.UJ-cIk%/*j})I-eImIhz92bp8$PqjqiDM5D)B*2r@bU~0Ȏ~G3?YBvȐ…DvU{ k{4,; EqzpׂuaUiZKNnLeEy*Xq^hIs(qVDuT¯ꥈ"P(ˀ٫ taF'/:C76Cߚ\9ͦuu˚-RO,~X`oo}[46CD?^!A ,p kOʐ3wOb Q[Mv,ѤJNɉ.0@<7oX(p晿4>-:L7C }>AI{VL`HZ|I=)d\NaŰ':aٕsj+@K"&)BJφ=-j%7WQOrބEgh-A(c'VιVU.('rEM{b|m@,Vڄ]|7m(/v]~#\dAZ{g d}Pl<3}Rwlw @NǼ<.Ex4S呺j&d +0ӭ{7RVl̿jq8m+=gH[ڠ|DL 䰿یi}@jlM<46Wc`xEj"{{}g~AFpuXȉηX~̪q YImQۏҨG`\֥n#mbY}sk@Ʊy@,Rm"aHvRK N^eA%6-3D 8ւ3lMo.\F5\%I X"PN5Hom,uCѽA$'I'Wq)fB):20X:#jBB>wa63/cAMZrt R)JlU=ڱM H0DRSV{srL󕽕qn^wR\"+..*ys4)g 3# '%;]F~CwKFEȦ}u!26 $k{/oM+B7=>Mc4ryZnw?s8"~'b'aL`f"G&7!8 hJ}u>nHolfaENq ;֥1.⣯+<G -% ZFwqoחm&2)N*Ahx9IWkH<0EypM\RM$@ɠ# *6^q;~_Gxs:Q ,:^4Sbe) AE. 73tn rA@A%tΦe׺5AA6Ժ>V>"'!%L NWL+*qG*πaKE?SMF-^qcJ@ëiwI/wY(^NG&59 jy7ZcE:>U<9XJE?"}ĕds)͋i9G4Gy6cOiz\#Bgy Qt_]J+9&5 А7NM c[w6Z֣Gm8YvL1~;i(1N>3@}ڿARw~f tKV APxd1V& l#P'z93oUi*Ef,+x~*&P,kk_V_V݄&{dW-$S=~R|\4㄰6[Ј6*k"4\m X*88OUD0Q^ 8H t;JM շ2 2o`TYK]27 ExD#&xk-'(VXU"dEk$I\r|-K#x.H"!vk^Z$Zr8me/j1H̼6)h\s(hdcKЉPt?86eG"BO&s3 Ni`Kbs*+u Xάq2o|eK]76ρTm~nAẃguSVğ0 q@ī DUuJ#6}})z pR[ a}}5}F .5mP S!^1TӢP /1+p -aΨ0:\ )djsՐfiqڻ\DKuFC&g[V7^.cqȚKc] -ilNn:Jg.LTUndedRIz>yk.15R-bLqr(M;2v;pey".gXA8jp CO:yJv+0Kaw3+Q`%XN%, JCUV |y 3u<* F=Q$KL#&nodGq\7Il),(>{A[=:ސ1}\ 8Y/s`WĮSPqC){Mّ{.!:? Z]WFAls[ju${ȟ9~UeHe vҞ>Nv[}QAf]G>˪ؗjҀԧFڠr8)4AODg;<;LR (:w"'j+| @Y[Vi4ΆO*Oѓn#| /CheE -s1U>%$g ŇzyVY藨aKd|k2H)EQ1CtQaI~;~IIFyc ^ל{ 'a/`obZlwMI=7j1":B䶝oܖ0+Y-51;ei+ִ~vv7 xhxRwkviM;k PEb<]g<$*U%GUE=IODj`a |6BG`ɿ^q^<( ]Fs<)E*W/ R v fag1sl5Mp4bЕ/-• 9 Wfߴ ,H a[ ̽cs:jkҶ7)u >4OfB(>J,lOvbRmਲB|k6?Q ?"Mou b#}ɿFIc&MO@z LxBqxEuTWK9|NK&Lwv |7ҿt!T9`@rjZKg#86ˆ'"ۜ>/rgoi_w!Eҝw  Kq=w(lGk=@0ktN IWsk`8&ŰGa|7WKo2u;[%ZMWHb62[FEhI0ft٫$+gojcWS3kOu vs$0F{z#NB剋0I^`Iͤ{኉BV[T9J'F"rmǼaa4/U$2d0"2}NÛT PPhp5aphMzJ[Kq4渳ߚpwH3W$@NО.\QZnhvw-ڤpf-d0jWGtkWPZ?":  !d̡OI;AcjT_- <+ĕOsu6v'+g^PAFKI8Ndhذ,LAc~D9PGJlDmpMRu K![Tl=C$Jx4HdזaHk ȴ\ÓVṁb*%׵!TZ;_qFS˛J`@RӇEeZn2ƃ=B: ;9f` C腛6F"T\l>% =< ӻ~.MNIo,^"ArC7 W.A*#̙$m8#^Qc )[ʹ.zvHzأ}`o^8}?_w#';P\fӦҎ!6,g*t L,{]:8lwEFIrӷTbCJV aTڌy*OvhX凐|ժViA,Ϭ.@Y4.͏QQP 4->/z&Na ~اl;y0&Ѵ}—HI72<WڕJF\aML:rI=5"9竡O~?ƈZ~!Xp&*I;UkW>_uFn MYN\R5Vs*j09]DvbL*TP[f¹'!Z"7F)̛5HF|B3v6Fi6! ԈYPߕJ(TCboG1V4 <ӉZlWG\a;D(N,\̬Kx-ƒcX8Df, O7&/ɂ2Lb{v|}Rzp晚苢 \k; | ^A;v3GqSu4̶M6c`ׂ)FU$S8&gB-pD<,VĐJ7Ƞ=4lu"sEx/Sd^ $Z(:E Kjw}BOقUG/#'DP5eREoVqE}|NJɅMvzpGAK_% 0-o3u$z-;[Te̱JH;zΌ/;~\4cۼG,q;Y5:^P\RZf>T v@A _Ht M$pb"Vx"kϷy:՚( V#k}#`$a3Ucvo'UwF>1߁&e ٝo>Q$h4$%p$iaס4Oj#ACHflqq!%hْ  Od; t8=Mp[ȷ1N`wrM>%_*@hVOn8wM-> x˄#uoyh3R(< 2)@hB Xe]B"s]< (|CiҎᦐO+XcCh7BP¹xѾnK/[S\EoсB d9 9ZN;lMQ"/lb`vS r Jm[X-a+&iIYK ܨ~0:!/J3IO]r-@;b ]si J%sjnӄ~crb 3 RqK1.=8[Uo}^Ct^ݾJ0ٷXzsm]EpҐ 83a @1NntvmwK.2 2 fA΍ܮ`V5s3ruj ?INHn½?`@գe L._U*K$H&@)7Y^*?%9Q2f;jWY%g'zCWUp坜4<Hk>Aj ~m, >0:+WLāD; c'>op9΋wInZZ4&PC \jQUFK[o?%E!K6-E;<똠Htgv!F<ȟU#-V_;f՜~ .?\NjSgHZC"L #D!8 A7V?(G_mq}?~ڣ`dWfj@ *U.^_SS ihZUT*q´xǺt*TҎ_ArdhXQz*sdt穡aWŷnRq_ .˙ W 붸CM)u9Қ@!3~p(xlr~jրWȓ |?T t$f gzS]z[ Cݦ,Ak&|N* KkZS2Ohu*F?592C7+:;cbTpQm>7)W.Y,9yzkoBS@a{RYӌ\(o A'ob^em+i)F5 O׫Yѫ48yq/C?"68g_sQmN3 B#jJJ):q' ` ??˔D$ky/[϶oasZ\Im%,^҅ X?C/AoAN[LYfic툰<]W1ϊeq7ķ+wd%L2e`Oh [c鬯elR[o8>@t[ĔR-ޒȮRQN8 ~Q"0ƥV(F݌,mKer f7#x,Pt ,$AhټݷO,mVpQod#"IBENĕfLh|jc شU@,!؈Q49<*Xi {6?n|jZ `Ouw:J*ezq0ьEx&YrhKxzn> A˼SkWrP2<7WIUdm ~(8_4ڐ_>=?A݈38\@OExGZ ` 0 e' 72c$Cx wa>gb%1t_} 8!mtR$)Oӣw8dtmh N՘]+"pᙎg$a;bCϒ}1cjp!ԋÈ[/+6g̔lޏ] \9tHW_9áժeġ`R>ڟit32L۱䶠¥ɨҬڗ۱䶠¥ɨҬ۱۱䶠¥ɨҬ۱䶠åɨҬzݕWXqVWYZiVWXYZ\d UVWXZ[\]a UVWXYZ[\]_aTUVWXZ[\]^_`a݊STVVWYZ[\]^`abcySTUVWXYZ\]^_`abcdrRSTUVWYZ[\]^_`abceemQSTUVWXYZ[\^_`abcdefgkQRSTUVWXZ[\]^_`abcdegghjױPQRTTVVWYZ[\]^`aacdefghijkݗPQRSTUVWXYZ[]^_`abcdefghijkl OPQRSTUVWYZ[\]^_`abcefghijjklmz"OPQRSTUVWXYZ[\^_`abcdefghijklmmnu$NOPQRSTUVWXZ[\]^_`abcdeghhjjklmnopr&MNOPQRSTVVXYZ[\]^`abcdefghijkklmnopqrח)MNOPQRSTUVWXYZ\]^_`abcdefghijklmnnopqrsݤ+LMNOPQRSTUVWYZ[\]^_aabddfghijjklmnopqqrss-LMNOPQRSTUVWXYZ[]^_`abcdefghijklmmnopqrrstt/KLMNOPQRSTUVWYZ[\]^_`abcdefghjjklmnopqqrssttu{1KLLMOOQQRTTVWXYZ[\]_`abcdefghijkllmnopqrrsttuuvx6JKLMNOPQRSTUVWXY[\]^_`abcdefghijklmnoppqrssttuvvwx0IJKLMNOPQRSTUVWYZ[\]^``accefghijjklmnopqqrsstuuvvw.IJKLMNOPQQSTUVWXYZ[]^_`abcdefghijklmmoopqrrsttuvww3HIJKLMNOPQRSTUVWXZ[\]^_`abcdfgghjjklmnoppqrssttuvvww3HIJKLLMOOQQRSUUVWYZ[\^_`abcdefghijklmnnopqrrsttuuvvw3GHIJKLMNOPQRSTUVWXY[\]^_`abcdefghijklmnoopqrssttuvvw3GGIJJKLMNOPQRSTUVWYZ[\]^_aabcefghijjklmnopqqrsstuuvv3FGHIJKLMNOPQRSTUVWXYZ[\^_`abcdefghijklmnoopqrssttuvv3FGGHIJKLMNOPQRSTUVWXZ[\]^_`abceeggijjklmnoppqrsstuuv3EFGHIJKLLMOOPQRTTVVWYZ[\]_`abcdefghijklmmnopqrrsttuu3EFFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghijklmnoppqrssttu3DEFGHIJJKLMNOPQRSTUVWYZ[\]^_aacdefghijjklmnopqqrsstu3DEEFGHIJKLMNOPQQSTUVWXYZ[]^_`abcdefghijklmnoopqrsstt3CDEFGGHIJKLMNOPQRSTUVWYZ[\]^_`abddefghjjklmnoppqrsst3CDEEFGHIJKLMMOOPQSTTVVXYZ[\]_`abcdefghijklmnnopqrrst3BCDEEFGHIJKLMNOPQRSTUVWXY[\]^_`abcdefghijklmnoopqrss3BBDDEFGHIJJKLMNOPQRSTUVWYZ[\]^``abdefghijjklmnopqqrs3BBCDEEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnoopqrs3ABBCDEFGGHJJKLMNOPQRSTUVWYZ[\]^_`abceffgijjklmnopqqr3AABCDEEFGHIJKLLMOOQQRTTVWXYZ[\]_`abcdefghijklmmnopqr3@ABBCDEEGGHIJKLMNOPQRSTUVWXY[\]^_`abcdefghijklmnoppq3@@ABCDDEFGHIJJKLMNOPQRSTUVWYZ[\]^`aacdefghijjklmnopq3?@AABCDEEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghijklmnoop3?@@ABBCDEFGGIIJKLMNOPQRSTUVWXZ[\]^_`abcdfghijjklmnop3>?@AABCDDEFGHIJKLLNOOQQRTTVWXYZ[\^_`abcdefghijklmnno3>?@@ABBCDEEGGHIJKLMNOPQRSTUVWXZZ\]^_`abcdefhhijklmno3>>?@@ABCCDEFGHIJJLLMNOPQRSTUVXYZ[\]^`aacdefghijjklmn3=>??@ABBCDEEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghijklmn3=>>?@@ABCCDEFGGHJJKLMNOPQRSTUVWYZ[\]^_`abdeeghijjklm3==>>?@AABCDDEFGHIJKLLNOOPQSTTVVXYZ[\^_`abcdefghijklm3<=>>?@@ABBCDEEFGHIJKLMNOPQRSTUVWXY[\]^_`abcdefghijkl3<==>>?@@ABCCDEFGHIJJKLMNOPQRSTVVXYZ[\]_`abcdefghijkl3<<==>??@AABCDEEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghijk3<<==>>?@@ABBCDEFGHHIJKLMNOPQRSTUVWYZ[\]^_aabdeeghijj3;<<==>??@AABCDEEFGHIJKLLNOOQQRTUVWXYZ[\^_`abcdefghij;;<=->?@@ABBCDEEGGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefgii3;;<<==>>?@@ABCCDEFGHIJJLLMNOPQRSTUVXYZ[\]^`abcdefghi;0<<==>??@ABBCDEEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefgh;0<<==>>?@@ABBCDEFGHHIJKLMNOPQRSTUVWYZ[\]^_`accdfgh;/<<==>>?@AABCDEEFGHIJKLLNOPQRSTUVWXYZ[\^_`abcdefg;.<<=>>?@@ABBCDEFFGHIJKLMNOPQRSTUVWXY[\]^_`abcdef*1;.<<==>??@@ABCCDEFGHIJJLLMNOPQRSTUVWYZ[\]_`aacdefҪ"/:;<=)>??@AABCDEEFGHIJKLMNOPQRSTUVWXY[\]^_`abcdeŇ/-8<==>>?@@ABBCDEFGHHJJKLMNOPQRSTUVWYZ[\]^_`abddg-+8==>??@AABCDEEFGHIJKLLNOPQRSTUVWXYZ[\^_`abcdJ+ )6>>??@ABBCDEFGGHIJKLMNOPQRSTUVWXZ[\]^_`abc.)'5>?@@ABCDDEFGHIJJKLMOOPQRTTUVXYZ[\]_`aacڜ&$4?@AABCDEFFGHIJKLMNOPQRSTUVWXY[\]^_`abϏ$!1@ABBCDEFGHHIJKLMNOPQRSTUVWYZ[\]^_`a~"0>BCDEEFGHIJKLMNOOQRSTUVWXYZ[]^_`ag .=CDEFGGHIJKLMNOPQRSTUVWXZ[\]^_`J ,PQQSTUVWXYZώ %;PRSTUVWYZ~9NTTVVXYg6MUVWXJ 3JVW./Hڜ||||ɼ‰Ƅ˂Ɵʑʦ~́ˀ́ˮ~~~ţśʧʡΫΪ¹ÙрҀ҃ҀҀрҁ҂рҁɟϤҭօև֐օֈ֑ǜͣөױش֮ӧ͢ ǝ ۷ذսիϹϥɵɢ±Ÿޫ޺ۧ۳ ~ף ׮"~ҟ"ҩ$}~˛$̥~&}}ė&Ģ})|}~)འ~}+{|}~ݍ+ݵ~}}-{|}~ىٰ(~}|/z{|}~Ӆӫ*~}|{1yz|}~́1ͧ}}|z5yz{|}~ť.~}|{z-xyz{|}~.~}}{zy0xyz{|}~/~}|{zy.wxyz{|}~-~}|{zyx1vwxz{|}~0}}|zzxx/vwxyz{|}~.~}|{zyxw2uvwxyz{|}~1}||zyxwvguvwxyz{|}~~}|{zyxwvgtuvwxyz{|}~~}|{zyxwvu2tuvvwyz{|}~1}}|{yxwwvu0stuvwxyz{|}~3~}|{zyxwvutgsstuvwxy{{|}~}}{zyxwvuts2rstuvwxyz{|}~1~}|{zyxwvuts2rrstuvwxyz{|}~1~}|{zyxwvutsrgqrstuuvxxy{|}~~}|{yyxwuutsrgqqrstuvwxyz{|}~~}|{zyxwvutsrq2pqrsstuvwxyz{|}~1~}}|zyxwvutssrqgopqrstuvwxyz{|}~~}|{zyxwvutsrqpgopqrrstuvwxyz{|}~~}|{zyxwvutsrrqp2nopqrstuvwxyz{|}~1~}|{yxwwvutsrqpognoppqrstuvwxyz{|}~~}|{zyxwvutsrqppo2nnopqrsstuvwxyz|}}~1~}||zyxwvuutrrqpongmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpoongmmnopqqrstuvwxyz{|}~~}|{zyxwvutsrqqponm2lmnoopqrstuuwwxz{|}~1~}|{yxxwvutsrqpoonmgllmnopqqrstuvwxyz{|}~~}|{zyxwvutsrqqponmmgllmnnopqrsttuvwxy{|}}~}}|{zxwvuusrrqponnml2klmmnoopqrstuvwxyz{|}~1~}|{zyxwvutsrqpponmmlgkklmnnopqqrstuvwxyz{|}~~}|{zyxwvutsrrqponmmlk2jkllmnoopqrstuvwxyz{|}~1~}|{zyxwuutsrqpoonmllkgjkklmmnopqqrstuvwxyz{|}~~}|{zyxwvutsrqqponmmlkkgjjkllmnnopqrstuvvwxzz|}}}}|{yxwvvtssrqponmmlkkjgijkklmmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpponmmlkkjgijjkklmmnopqrsstuvwxyz{|}~~}|{zyxwvutsrrqponmmlkkjjgiijjkllmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpoonmllkjjiidjkklmmnoppqrstuvwxyz{|}~~}|{zyxwvutsrqqponmmlkkjii2hiijjkklmnnopqrsstvvwxzz|}}1}}|zyywvvttsrqponnmllkjjiighhiijkkllmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpponmmlkkjiihh/ijjkklmnnopqrrstuvwxyz{}}~1~}|{zyxwvutsrqqponmmlkkjjiihhdiijjkllmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpoonmllkjjiihhh`ijjkklmmnopqqrstuvwxyz{|}~~}|{zyxwvutsrqpponmllkkjjihgEThhiijjkklmnnopqrsttvvwxy{|}}~~~}{{yxwvvttsrqponnmlkkjjiihTE07Pfiijjklmmnoopqrstuvwxyz{|}~/~}|{zyxwvutsrqpponmmlkjjifP7_*Mdjjkklmnnopqrrstuvwxyz{|}~~}|{zyxwvutsrrqponmmlkkjdM*,Ibjkllmnoopqrstuvwxyz{|}~+~}|{zyxwvutsrqpoonmllkbIWD_klmmnopqqrstuvwxyz{|}~~}|{zyxwvutsrqqponmml_ES@[lmnnopqrsttvwxxzz|}~}}|{yyxvuttsrqponnm\AM;Vmnoopqrstuvwxyz{|}~~}|{zyxwvutsrqpoonW<#5Slopqrsstuvwxyz{|}~"~}}{zyxwvutsrrqpmS6E+Qjpqrstuvwxyz{|}~~}|{zyxwvutsrqkQ+AMhqrstuvwxyz{|}~~}|{zyxwvutsriN=Hesttuvwxz{|}~}}|{zywvvutfI9Datuvwxyz{|}~~}|{zyxwvubD3?\uvwxyz{|}~~}|{zyxwv]?8Xtxyz{|}~~}|{zyvY9+.Vryz{|}~~}|{zsW.!Rp{|}}}}|qS!#Nm|}~~}nNIi}~~iJCdeC<_~`=1]|}]1 #Xz{Y$ SvwTNrrO)+33+))-6;6-)).8<8.)*0:=:0*+2<><2+,5?5,*-7@7-**/:A@A@:/*+1=B=1+,3@C@3,-5BDB5-.9E8.+0M>1-4BOB4-.6GPG6./9KRK9/1*ʀ̀4nnmlkjihgfedcba`_^]\ZYXWVUTSRQPONMLKJIHGFEEDCBBA@??>-ˀ6nmlkjjihgfedba`_^]\[ZYWVUTSRQPONMLKJIHGGFEDCBBA@@?>>)ɀ̀3nllkjihgfedcba`_^\[ZYXWVTTRQQOONMLKJIHGFEEDCBAA@??>=,ʀ7mlkjihgfedcba`_^]\[ZXWVUTSRQPONMLKJIHGGFEDCBBA@??>==$ƀȀ;mkkjihgfedcba`_]\[ZYWVUTTRQPOOMLKKJIHGFEDCCBA@@?>>==-ʀ6lkjihgfedcba`_^]\ZYXWVUTSRQPONMLKJIHGFEEDCBBA@??>==<)ˀ3kjjihgfdcba`_^]\[ZYWVUTSRQPONMLKJIHHGFEDCBBA@@?>>==<)ɀ7kjihgfedcba`_]\[ZYXVVTTSQQOONMLKJIHGFEDDCBAA@??>==<<ajjhgfedcba`_^]\[YXWVUTSRQPONMLKJIHGFEEDCBBA@@?>>=<<;%ǀɀ6jihgfedcba`^]\[ZYXVVTSRQPONMLLKJIHGFEDCCBA@@??>==<<;+ʀ3ihgfedcba`_^][ZYXWVUTSRQPONMLKJIHGFFEDCBBA@@?>==<<;;Zihgfdcba`_^]\[ZYWVUTSRQPONMLKJJHGGFEDCBBA@@?>>==<;^hgfedcba`_^][ZYXWVUTSQQOONMLKJIHGFEDDCBAA@??>==<<;\hfedcba`_^]\[ZXWVUTSRQPONMLKJIHGGFEDCBBA@@?>>==<;q%ǀ7gfedcba`_]\[ZYXVUTSRQPOOMLLJJIHGFEDCCBA@@??>==<<;;1*Z[fedcba`_^][[YXWVUTSRQPONMLKJIHGFEEDCBBA@??>==<<;/"E~Tfecca`_^]\[ZYWVUTSRQPONMLKJJHGGFEDCCBA@@?>>==9-[1xedcba`_^\[ZYXWVUTSRQPONMLKJIHGFEEDCBAA@??>=9+Wqdcba`_^]\[YXWVUTSRQPONMLKJIHGGFEDCBBA@@?>7* S idcba`^]\[ZYWVUTSSQPONMLLJJIHGFEDDCBA@@?6'M`cba`_^]\ZYXWVUTSRQPONMLKJIHGFFEDCBBA@4%VÀ*caa`^]\[ZYWVUTSRQPONMLKJIIGGFEDCCBA2!EFba`_^\[ZYXWVUTSQQOONLLKJIHGFEEDC?0A2{a`_^]\[ZYWVUTSRQPONMLKJIHGGFED>.= ta`^]\[ZYXVVTTSQPONNLKKJIHGFE<- 9 m`_^]\[YXWVUTSRQPONMLKJIHGF;*3c`^]\[ZYWVUTSRQPONMLKJJIG9&/X_^\[ZYXWVUTSQQOONMLKJH6#+H^]\[ZYWVUTSRQPONMLKG4'4^\[ZYWVUTTRQPONMLE3#x]\ZYXWVUTSRQPONC0  p\[ZYWVUTSRQPOA,g\ZYXWVUTSRQ>)\[ZYWVUTSQ;%KZYXVVTO9 6YXWVM7 }YWK4 uH0ih32 ~۱䶠¥ɨҬۗ۱䶠KϽ;X^…9VY\`֗… 9UWZ]`c݃… 8SVY\^adg|… 8QTWZ]_behjx…7PRUX[^acfikmu…6NQTVY\_bdgjlnpt…5MORUWZ]`cehjmoqsv…4KNPSVY[^adgilnprtuw…4JLOQTVZ]_behjloqstv…3HKMPRUX[^acfikmprsu…2GILNQTVY\_adgjlnprt…2FHJMORTWZ]`cehkmoqs…1DGIKNPSVX\^adfiknpr…0CEGJLOQTWZ]`behjloq…0BDFHKMPRUX[^acfikmp…0ACEGILNQTVY\_bdgjln…/@ADEHJMORUWZ]`cehjm….?@BDGIKNPSVY\^adfik….>?ACEGJLOQTWZ]`begj….=>@BDFHKMPRUX[^acfi…-<=?ACEGILNQSVY\_bdg…-;=>@BDFHJMORTWZ]`cf…$,8=?@BDGIKNPSVY[^ad)7?ACEGJLOQTWZ]`b>(7BDFHKMPRUX[^aڟ &5EGILNQSVY\_ϔ $5GJMORTWZ]Ņ5HNPSVY[q3HQTWZU 2HUX:0Gڟ||}}ĉěʍʢϑϪȅւևցȝh˟ˡk_ŀۆڀۄ Ɲd^c ]ܑ ܹa \ڍ ڲ` [׉ ׮_Y҅Ӫ]Y}́ͧ\'W|ť~[Wz}|Z'Uy{~}zY'Uwz|~{yX'Tvx{}|zwV'Stvy|}{xuV'Rsuxz}~{yvtT'Qqtvy{~}zwurT'Ppruwz|}{xvsqR'Poqsvx{}|yvtqoR'Omprtwy|}zwurpnQ'Nlnpsuxz}~{xvsqomP'Nkmoqtvy{~|ywtromkP'Mjlnpruwz}}zxuspnljO'Likmoqsvx{}~{yvsqomkiN'Lhjlmprtwy|~|zwtrpnljiN':Jaklnpsuxz}}{xusqnlkaJ:#E_moqtvy{~~|yvtqom_E B]pruwz|}zwurp]B >Zsvx{}~{xvsZ?:Yty|~|ytY:3Wt}}tW3 'TttT' QssQ NqqN )+33+))-7=7-)*0;?;/*,2?B?2,.6CEC6-0;H;0-2@L@2-.6FPF6.09MTM:0bXYYAj\]\]\]]\]\]\]]\]]^^[?Ƥtabb_\Y= ɮfefgec`]ZW= ˸ki jifda^[XU< pl mjheb_\YVT;ǚvpooqpmkhfc`]ZWTR:ͤ}srrtspnljgda^\XVSP9πstvusqomjheb`]ZVTQO8'wwusrpmkifca^[XUROM7'wvtsqnljgda_\YVSPNK7'vusqomjheb`]ZWTQOLJ5'utrpnlifda^[XURPMKH4'usqoljgeb_\YVTQNKIG4'sromkhfc`]ZWTROLJGE3'rpnligda^[XUSPMKHFD2'qomjheb_\ZVTQNLIGEB2'pmkifca^[WUROMJHECA1'nljgda_\YVSPNKIFDB@0'mjheb`]ZWTQOLJGECA?0'~kifca^[XURPMJHFCA?>0'~jgdb_\YVSQNKIGDB@>=/'~hfc`]ZWTROLJGECA?=<.'}gda^[XUSPMKHFDB@>=;.'_{eb_\YVTQNLIGDB@?=8,$#)rc`^[WTROLJHECA?7)la_\XUSPNKIFDB7(e_]ZVTQOLIGE5&\^[XUROMJG5$P\YVSPNH5 ADHLPTY^bgkn =@CFJNRV[`dhl <>ADHLPTY]bfj ;=?BFJNRV[`dh ;;>ADGLPTX]af )1=?BEIMQVZ_dѥ "1@DGKOSX]aŇ1BIMQUZ_q1DOSW\U 0GUZ:/Hڟ||}}ljǝ΍Ϥԃւօؑش׍ׯՉի|хҨ z~ˁ ̦~x|Ĥ|uz~~zsw||xquz~~yupsw{{wsnquy}}yuqlosw{{wsojmquy}}yuqmilosv{{vrolhjmqty}}ytqmjhikorvzzvrokiCUjmptx|}xtpmVC7Rlrvz~~zvpT80Rnx||rU1 %Pq~tS& PrvR NrvP )+33+)*.7>7-*+1lhd`[VRNJFB?=jfb]XTOKHDA>;nhd_[VQMIFB?3)Zfa]XTOKGC3"Mc_ZUQME3 ;~a\WSH3 %z_ZJ2uL1is32G٭ك٭ه٭y҇OVӃJQZbہ FMU^emۃCIQYaio@ELT\dl=BHPW`h;?DKS[c(3AGOV_أ)8JRZآ,@Uآ/̭Ѐ~syu}}qxxmt{{tkpwwphmszzsmBYov}}v]C C_yeFHgoLNS**-7@@6-0=I=03DSSRRSD3t^_[ª{hrf_VɯqqpnjbZRͲusmf]UMupiaYQIrld\TLEoh`WOHBkc[SKE?mg_VOG7) mbZR=+r]E.w3t8mk@ 11JKgg 11JKgg 11JKgg 11JKggjk``"OO" !<}ۍ-ow8)8@yLMuS{> $Owfwnx{sR\qPAb[L2sʀўbϠ mf7l;rW-{uRqPi׶L;wŘvh}c:δr8(SYvwQj5e*W+A2-AF.ѧ{R]~C2X|堥UH<} ?񳙷WY*e =$??oѯXγ~`K;ں_t|ʊϸu-3~yHrplm[rLZ)63̛27@x?}RH @4UM;w,_9X*=DQz?:kj.߷[2]%m{N\!W98}G\堛@7{>6'4Fo߁SqurMEg7i>:_w;~sǮݸUZ3i&UWٰĝ/X*]$@V,y딉ZfN+ی~WIrptZUJ,X"Yv ?P;rHrp:W9(8(d }5e eZmt}qmR5 kk0W98̞QI/1n>KLt޵kt@3+~aS޴pA(O?cv~OmO;N҉kEou^*¦gϺf~̞V/ꎓ.׊wlزuM(+u딉u-3 r"m+] ,ke{47P0Os6:lW%[lu w?XƢ^$Hs/yٴhG\t--r`Y2#џ:q5&m8zg;u--k],o1.3b,w:^صĭ7*X3g7C>: znQfOM?J=u?I1꘺P:o}q@dٯ_p̞6حѯp<rP o2i`)._eW6vްHu_~j+U_v^Cii>oм aF?" dJ2?+zVOPb` 9Q=Ry8ܣq9焨9['9wȏ__bu\OhB>*JxBl_ůz8UxtW= #/_+&7YZE:}b~U:>G?H'|_XWx4&&؎7ٶcdV|Ưݥ.g{GfOewKggVk߰egǝVTJ+[;ean'W6߽aKZ9(I.g>߸>ڸ#|IyKg3y%ђK^xY?w;|n[pYflu줳`̓m|( :W}  {;qɬ_ 38y2gW} SpUp50D۴MK0Ti%^=*< VЁa 䌾Ix%#|~˲5<՜Kk^knv`+bo$z +uJV|FIr DJ(2A-tECZᚦ0adGoV~7,?B@DOm g"(lk+8qɖ8co$e9[27Iu+ľ;IoōP I\$ >9&[}lB=$[TS] DF?{輥׏B| PZ̆ R!h@ mdm;\9mTVr66(:F$M]9˯`xt}|_ܖ*VA ) P0*|vFЯG2? 0alؠc=Ye1'mC.!HP_N֜YWMWx^}5N_Cgh){, A XuApuS+LyԷ e tz+F?1'n>^D& f6 tΝo\ݸ5.d{NnmuMKPs >`&l u=u<8)k'j>K~VLO]4YeiX@?IO6 |q{$Z&~hv>:wCy1Oy' ?{&&O%wU#jᲱo^ɁǦӧMrf >v<$[Ww>`$?Z=&#{iK.M(%A5ᒑͮrPag`^\b~&h0x-7DP@-{BH NCVU60r@ſ e3ɘ9o꫻OjTBF=ԃ50'-ґ{ MF剤uBPAq(X \GKQvh/MGkc4|@@ wO@o*8_!S{PClaƾ54@_dM&)1;f$~}/ dOԌ$΅'% a|pńUpQA.;1d,8T& Mטty̤ԥ/e;sFgJбw?UDqOR>OB jMެ iKǼ6tVM+&HOExSaR,R*# P`0<=$r}zcW[\堋$ 29 1ڈ PpGRP -ި m>PiNiaX)0ŏAY}|8 }l3\V?5/3P?m}v, ׌-+fB%@0z /EB^Bw Su"F#@Za~N򡭿 $6F ­mpO~_g]℠&TxUYJo 5O>BSAP45H7s޺Ȅ-mBF?1hku}`ᯕQ@b,fR?CB'+žVE{wLဉC[ 1@\J?t2Ywަgяe2R3U*LCHljC `2f/\2z5|6W9@g^pt <%Hq ޢFR~{^_\G OM m݊rT?g0PrFoa2Ferk *c{1^!B$I`&Ko$lDT*[5f`Z>mPcsײ5} uPƸ?yB/ SPAsc*S߅Jtj@{dUu3b|h_zчPs}?+Jl*P v+'yPI|1rI7ASC.&&GaE1sز#'~g-k@!F7Pp˅$Եe_1p0dl"oYH X#/0( A9 >5~5mlr" czq)q] M+!@~.M{d&dĒWׄbbv%5j_nҧ0o||iuF8(M[FuP`ga`dȂn14g3Y% t?cSF|F9To 9隔`%X(nQhjy[DAF_1d4~q2?tId__1 `G} κ~l(́!F_|'ኦ=rL=[/Eނ?NHKmE03 rr@<5>$PE+I @ 4k˧lA>;bs2A7<m/d#ـZ!Ⱦ,c?6x.!h._>wBw'nmS[v[[+1ژx-CuiK0`ԟK%/=PpW-q^#бn "4dB? VXHP` Y"HNx{c#Aau, [cscHR ocT xy GP8$S` j) YJ_,cR,F/Ot 0w*lڎĕ?,L8Xπ]`{\"3.&btqV!@_mW%d(A2XC]_5^}oC.Їi?LjY 'aVja=Gk>:ZP|]Wiuۄ&%8y1@, &֡]Ϋ3TM2X AkY3:c4i˦nT*2'k_w@ k2 0$JHG&k F0,h.iBPl6i@ ߔ6'pNl2dG0x( 6$"W`kHd&d <%70HQFv74w A^ك3YG~x\= E)[=Ֆs454ޞW!js+ƞ߷ %:3xa(ڐa |]BP1`X^DT^fu\m{E l `akC7I*eA'\ AKԈ%:D ؀MR& t-BDh`¶Bi~T19 )ωcIƭ<X PC|S=1@FPQGƢ 1ʣ(CPwCh^)o!!4`C5 hS6,3~|l2~Qq]o1[~kkH6A?+BW%#&؈Mu9HP EBC `,ؔO' XQ;O&Հ~R96q`{{G߂kKxiNۭ>z<1cbߴԟkJIp[B]u F~np^5\!W#(քNhՂUt6_G}@okCQSK,wdH@]6`/B "xޜl$f EG]CGXeƯ; t@1x A-4*:0@XflH 3r =Հ)*yk-b< (U(@F$3xxj2~Y@y^^s> '=[ufB@8B ` K't*~!_d_DE2hpKq:{~"; @#\j:&A*MЧA<-RcћUzDb?ՂwAp/Ht( uPb#K\9>Kn#b_@@f9rf/>g^?c\N/QO Yp]_X1gˁ`µ$8ր| (- + X@A'\:hCRK:\ ?P J( dC#PglHrGE(`CUQ:(~# SUyXHJAcT[J 爾:o͖gZ {*]= A+P\@ `wgX@dSBqfSHL?E15rS2PʱhJ_*Y@oB٘TXF[ !}3dh >[A}kS'_ܿKe/cCň]b" ,] 5%c 6:d`c%XQ ZkH@9i2|+7-OOsf'~SpaMIꏮX-t2mOfAձxjI,@ `~c D¸߄~FVA[EZK!7`IB2&Cz`!<= A@FX @_osc>&_(gtv꙰F+{?_R}v! B0HR w_z6lso)`>VY o_P@7&ub[_,1.!(} te\ @ѿaBa1cNiY -vߪ毹\g-E5ۀwf@í=c9P@L284x;&Y5OJL 0 oq9hc~ItZ6MbV`Я=Q3Vɴ8e(@ UX(\TY J sO|X&p^4TT?ы Η?g/I$eXiγ #NBϑf2ͷY ՚ YҗyĔ`rBnӇi>g@kL4ϋ0; $=6,@.|BlLkt'$,@.mi:Oo2%5~ܘs~D9|j^T5>oQ !_0 t[Tz)~D|A}6i AkU[@y8k,Xg (P  -u}_Gm|IT_j,-O4E qDʂ.lK" fJbyqzFE 1Nu,U㨽 u/8 _G Ab,@  JA3 #u4P(I(bkEuFhm,=^Dy8 ڄY؇koR NP>[H}!@})xS3P֗fmybO_1b2l tmmzH&5*2h_3υ 6e?ǵ*h`N,@Kg& bc.P@% @aD 0%(Pɿ /m_`}B0h M,'1 ' !̈ULzk0@„`ڲT O"P},yI}6@ݯ2'i `CX@P@[#ѣZUBx.8R `9y[o6zfcb[g00<y:`@ <$,'T, N HIur1 }1 OBE)YPm>6td7t̀{OZ^SGEI$h{"QRm]ƦF`CJ p!G=~4ϱ>5 @O <PmaЯ+yZgx69bi.'9=Ypmb6f`DOr]6LC(E0<ƫ^] )9͗5Qϒ ceˇV7nM1!A[! %dߗ5>OOh[%h+E]!HyWH!5* b\LZdP@ 5c>i02 $O'OE-tJ>m? w^0,@G ob!Q8$^qL ; <$SzYT_ȶ] }e!#Ԃ QlC&JŧXWWv$ v Fntɸ[lo@]8Ne8!h`]0Ո:Dxz I$k"HI/P҆H/u_m2m6Hc琢;@Ȱ/3EA84 3 H\e05 T_TKncQKo <іiy+s+ Dj.nhwV/ _1>\bE$dQ(`3%ybԱ''0p$p&Z@HCk4BM4e  /{bd ΃  QDz{i(, ' Ϧ:`[yBuϺst9a0f8 7'_!ȇ<tm6n¨& ~@M aI6~[c6&R~KϞ[彿U(=OPvr̎AF6L)$kE 1m1je(P@g/b#zX!Rc奓PI?K/ff3<ˏfaBPlWJPe6 <4oxDq-34Fu@, // HBSY=ԅ F 4`TBP5p(Wgi(/o\"  ܻOq, Y0t_:ǭ= $sP  4c"c)^ttaRc ORJKIsq, fš1 0 [(вq!wtm3זKcJ犵ߘI?Խ mJ4~*wh̝_;d'Ve`Ǔw@24i[ 8Ov R6d2:f@1bYR{Lƚ^NnW'w1@|v߱4` j{r>yx%;! R|.B6a6<_4ۃ8?h[*ot[KꯜC㤢}0[Rߨ=>vL=Vr//yglkg pYl)5h.{NKiWA5dD1bAHqp2Geg(f/qlb$P#>뻎w?@s*؆ P2m_3pA 6IB A6pLv!f c<  0*=hXMOՃO|i>aڰz>Ҏu9ӯ~poo;#!og@ g@yޠo?d\]ADlƵn1VǠB9@!%˂A_"O%cS( j >5z}'2T[`昄BxW>8Nuzq~n+RBl ^ Ao4FN"WrA+l4Ċ%TVad ؞O|7[I뛨͖_B'Gm2j?xKol~:8sV?482;@H@Lw;ھFR,@ zP|mH ˈ!E%O$n|lEM@tgp.+}l&-JwC0rp'nW?CI&h9qp)ׄRذs g؇\Gxjm.XL~ۡw<~x.QdF@|0$W98&: U2ԅ݁mB A!B&0JJ>X\[ hmL}4G~(= rpG!fϯ}$j~.׉畘\W uiX hY^M۾-5Ɩo89L~c.Y[zlF?TGr0ngG4~bQi3k l$2wa0(T[)!}Xꦲ觑r<'7w]mEoVVF?TDr0QS/Y4x촙wtxg/ #]S {OvT )I< ~rlӝ7Ya¥k+3F*{r0i>/P=|&P@Hs{JK&$\tN/@Ȓr0܋F7\xCϸπ.ImWR wW|m}cמzgǂ練~-+u +/ O$HYy$!6`?mO}srߚ._Lqz1oę7PW <>#@PXV?h)ۏ}ewޣN~)T9h0lۇ=okRԄ EmqX R%>~6emw]/8H.+Ν?||$yw˵Ac`7@&!g6b:&@:Ϝؿ-{,zcw8H/+ |yK ?cf}=%tޟ$I.R5c:3oؿf] 2], =qε 0Q A+,I.'J_o?y^{jϿ2%'+|3|kԏcU 7xCNms2=@_ n捘4 %_!hd_"~+ڗ.߃@餠+솑>t\q]r"P}eX -D\ğὁUhidz2=Pt4^r ͓jjyD9$$<9)R˸۷%^2=XtL}mO->a}zBPDR׬h`ҷ~ԕ]oԹ\?rB3x?ql~藷8YRP 73y5 g`6y_s =WRW\z/?j~~[_ܸ{ɢW6~/+s><~eFM1w#P N;u*=kVi[t6ѯPqP>r0ѓ?;|'׈  '٭kOo2.OWFLk-s,r-~u}k>tj+Uf\uۼэ(,W6]/u*/TDq*%I*!`g]FJ@em@ѯBqP٢a@h._e:P!W8. CQ\b @ NL8qR*NT8p⤊'U,8bqI'NX8qRpY"XWIENDB`(    ##   (uN/rHHr0O(   ! .}S3vJÆVÇWYWKw4T.0!  !6#PQQSTU†VÇWĈXʼnYŊZ\ZYXWVUTSRQ>e)C~#   (pI,i@}N~OPQRST…UÆVÇWʼnYŊZƋ[\[ZYWVUTSRQPO~Ai,J(   ! .xN/mB|M}N~OPQRST…U†VÇWĈXʼnYŊZƋ\]\ZYXWVUTSRQPO~N}Cn0N .0!  !4!<R2pD{L|L}M}NOQQRTT…VÆVÈXʼnYŊZƋ[ƌ\^\[ZYWVUTTRQPON}M}L|Eq3S!J<! "H.OV4ѱrFyJzK{L|M}N~OPQRST…UÆVÇWĈXʼnZŊ[Ƌ\ƌ]^]\[ZYWVUTSRQPO~N}M|L{KzGs4W.gO" #X8"gX6ߵtGxIyJzK{L|M}N~OPQRSTU…VÇWĈXʼnYŊZƋ[ƌ]Ǎ^_^\[ZYXWVUTSQQOO~N}M|L{KzJyHv6Y#9~g#  #c?&~\8uGvHwIxIyJzK{L|M}N~OPQRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^`^]\[ZYWVUTSRQPO~N}M|L{KzJyJxIwGv9]&?~#   (mD)a:tEuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwGvFu;b*D(   !  0tH,ei.NJ<! "F+OQ0ѫj>pBqCrDsEtEuFvGwHxIyJzK{L|M}N~OOQRSTU…VÇWĈXʼnYŊZƋ[ƌ]Ǎ^Ǎ_Ȏ`ȏaba`_^\[ZYXWVUTSQQOO~N}L|L{KzJyIxHwGvFuEtEsDrCq?k0Q+gO" #V5!gS1߮l@oApBqBrCsDsEtFuGvHwHxIyJzK{L|M}N~OPQRST…UÆVÇWʼnYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑacaa`^]\[ZYWVUTSRQPO~N}M}L{KzJyIxIwGvGuFtEsDrCrCqBpAm2S!6~g#  #`;$~V4m?n@oAoApBqCrDsEtFuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuFtEsDrCqBpBoAo@n4W%<#   (i@'[5l>m?n@n@oApBqCrDsDtEtFvGwHxIxJzJzK|L}M~OOPQRTT…UÆVÇXʼnYŊZƋ[ƌ\nj]Ǎ_Ȏ`ȏaɐaɑcdcba`^]\[ZYWVUTSSQPON}M}L|L{JyJyIxHvGuFtEtDsDrCqBpAo@n@n?m6\'A(   ! 0qD)_6k>l>m?m?n@oApBqBqCrDsEtFuGvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcdcba`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCqBqBpAo@n@m?m>l7_*E .0!  !1l?m?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|L}N~OPQRSTU…VÇWĈXʼnYŊZƋ[ƌ\Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdedcba`_^\[ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpAoAo@n?m?l>l=k9b+IJ<! "E*O~M-Ѧd8jl>m?n@n@oApBqBrCrDsEtFuGvHwHxJyJzK{L|M}N~OPQRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑdʒdfecca`_^]\[ZYWVUTSRQPO~N}M|L{KzJyJxHwGvGuFtEsDrCrCqBpAo@n@m?m>l>k=k=j9d-M*gO"Z7"`P/ުf:i;im?m?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓefedcba`_^][[YXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpBpAo@n?m?m>l=k=jl?m?n@n@oApBqCrCsDtEtFvGvHwIxJyJ{L|L}M}N~OPQRST…UÆVĈWʼnYŊZƋ[Ƌ\Ǎ]Ǎ_Ȏ`ȏaȐaɑcɑdʒeʓfgfedcba`_]\[ZYXVUTSRQPO~O~M}L{L{JyJxIwHvGvFtEtDsCrCqBpAo@n@n?m?l>k=k=jl>m?m@n@oApBqBqCrDsEtFuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔fhfedcba`_^]\[ZXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCqBpBpAo@n@m?l>l>k=k=jl>m?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|L}N~OPQRSTU…VÇWĈXʼnYŊZƋ[ƌ\Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʒe˓f˔ghgfedcba`_^][ZYXWVUTSQQOO~N}M|L{KzJyIxHwGvFuEtDsDrCqBpAoAo@n?m?l>l=k=jl>m?n@n@oApBqBrCrDsEtFuGvHwHxIyJzK{L}M}N~OPQRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐcɑcʒdʓf˔g˕hihgfdcba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyJxHwGvGuFtEsDrCqBqBpAo@n@m?m>l>k=k=jl?m?n@oAoBpBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRSTU†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˓f˔g˕hihgfedcba`_^][ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuFtEsDrCqBpBpAo@n@m?m>l=k=kl>m?n@n@oApBqCrCsDsEtFvGvHwIxJzJzL|L}M}NOPQRST…UÆVÇXʼnYŊZƋ[ƌ\nj]Ǎ^Ȏ`ȏaȐbɑcʑdʒeʓf˔g˕h̖ijihgfedcba`^]\[ZYXVVTSRQPON}M}L|LzKyJyIwHvGvFtEtDsCrCqBpAo@n@n?m?l>l=k=jm?m@n@oApBpBqCrDsEtEuGvGwHxIyJzK{L|M}N~OPQRST…UÆVÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔f˔g̕i̖ijjhgfedcba`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBqBpAo@n@m?m>l>k=kl?m?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|L}N~OOQQRTU†VÇWĈXʼnYŊZƋ[ƌ\Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʒeʓf˔g˕h̖i̖jkjihgfedcba`_]\[ZYXVVTTSQQOO~N}M|L{KzJyIxHwGvFuEtDsDrCqBpAoAo@n?m?l>l=k=jl>m?m@n@oApBqBrCsDsEtFuGvHwHxIyJzK{L|M}N~OPQRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏaȐaɐbɑdʒeʓe˔g˕h̕i̖j̗jkjjihgfdcba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyIxHwHvGuFtEsDrCrBqBpAo@n@m?m>l>k=k=jm?m?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRSTU†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͘klkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpBpAo@n?m?m>l=k=kl>m?n@n@oApBqCrCsDtEuFvGvHwIxJzJzK|L}M}NOPQRST…VÆVćXʼnYŊZƋ[Ƌ\nj]Ǎ_ǎ`ȏaɐbɑcɑdʒeʓf˔g˕h̖i̖j͗k͘lmkkjihgfedcba`_]\[ZYWVUTTRQPOO}M}L|K{KyJxIwHvGvFtEsDsCrCqBpAo@n@m?m>l>k=k=jjl>m?m@n@oApBqBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔f˔g˕h̖i̗j͘k͘lmlkjihgfedcba`_^]\[ZXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCqBqBpAo@n?m?m>l=k=kj=k=l>l>m?n@oAoApBqCrDsDtEuFvGwHxIyJzK{L|L}N~OOPQSTT…VÆVĈXʼnYŊZƋ[ƌ\Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʒeʓf˔g˕h̖i̗j͗k͘l͙mnllkjihgfedcba`_^\[ZYXWVTTRQQOO~N}M|L{KzJyIxHwGuFuEtEsDrCqBpAoAo@n?m?l>l=kk=k>l>m?n@n@oApBqCqCrDsEtFuGvGwHxJyJzK{L|M}N~OPQRST…UÆVÇWĉYʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑdʒeʓe˔g˕h̕i̖j̗j͘k͙lΙmnmlkjjihgfedba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCrBqBpAo@n@m?m>l>kk=l>m?m?n@oAoBpBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRST„U†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘l͙mΚnnnmlkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpBpAo@n?m?m>ll>l>m?n@n@oApBqCrCsDtEtFuGvHwIxJyJ{L|L}M}N~OPQRST…UÆVÈXĉYŊZƋ[ƌ\nj]Ǎ^Ȏ`ȏaɐaɑcɑdʒeʓf˔g˕h̕i̖j͗j͘k͙lΙmΚnonmlkkjihgfedcba`_]\[ZYWVUTSRQPON}M}L|K{JzJxIwHvGuFuEsDrCrCqBpAo@n@n?m>ll>l?m@n@oApBqBqCrDsEtEuGvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnZŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˔f˔h˕h̖i̗j͘k͘lΙmΚnΚoponmlkjihgfedcba`_^]\[ZXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCqBqBpAo@n@m?ml>m?n@oAoApBqCrDsDtEuFuGwHwIxJzK{L|L}N~OOQQRTT…VÇWĈXʼnYŊZƋ[ƌ\Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʒe˓f˔g˕h̖i̖j͗k͘l͙mΚnΚnϛoponnllkjihgfedcba`_^\[ZYXWVTTRRPOO~N}M|L{KyJxIxHwGvFuEtDsDrCqBpAo@o@n?mm?m@n@oApBqBqCrDsEtFuGvGwIxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓf˔g˕h̕i̖j̗j͘k͘lΙmΚnΚoϛpqponmlkjiihgfdcba`_^]\[ZXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCqBqBpAo@n@mm?n@oAoApBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRSTU†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘l͙mΚnΚoϛoϛpqponnmlkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpBoAo@nn@n@oApBqCrDsDsEtFuGvHwIxJyJzK|L}M}N~OPQRST…UÆVćWʼnYŊZƋ[Ƌ\nj]Ǎ^ǎ`ȏaȐaɑcɑdʒeʓf˔g˕h̖i̖j̗j͘k͙lΙmΚnϛoϛpϜqqqponmlkjjihgfedcaa_^]\[ZYWVUTSRQPO~N}M|L|KzJyJxIwHvGuFuEtDrCrCqBpAo@nn@oApBpBqCrDsEtEuGvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˔f˔g˕h̖i̗j͗k͘lΙmΚnΚoϛpϜpϜqrqpponmlkjihgfedcba`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBpBpAonAoApBqCrDsEtEuFvGwHxIyJzK{L|L}M~OOQQRTT…VÇWĈXʼnYŊZƋ[ƌ\Ǎ]Ǎ_Ȏ`ȏaɐbɑcɒdʒe˓f˔g˕h̖i̖j͗k͘l͙mΙmΚnϛoϛpϜqНrrrqponmmlkjihgfedcba`_]\[ZYXWVUTRQQON~N}L|L{KyJxIwHwGvFuEtEsCrCqBpAooApBqBrCrDsEtFuGvGwHxJyJzK{L|M}N~OPQRST…UÆVÇWĈYʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒeʓf˔f˔g̕i̖j̗j͘k͘lΙmΚnΚoϛpϜqϜqНrsrqqponmlkjjhhffecba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrCrBqBpoBpBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRST„U†VÇWĈXʼnYŊZƋ[ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘lΙmΚnΚoϛoϛpϜqНrНssrrqpoonmlkjihgfedcba`_^\[ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEsDrCqBppBqBrDsDsEtFuGvHwIxJyJzK{L|M}N~OPQRST…UÆVćWʼnYŊZƊ[Ƌ\nj]Ǎ^Ȏ`ȏ`ɐaɑbɑdʒeʓf˔g˕h̖i̖j̗j͘k͙lΙmΚnϛoϛpϜqМqНrОsssrqqponmlkjjihgfedbaa`^]\[ZYWVUTSRQPO~N}M}L|KzJyJxIwHvGuFtEsDsCrBqqBqCrDsEtEuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˓f˔g˕h̖i̗j͘k͘lΙmΚnΚoϛoϜpϜqНrНsОstssrqpoonmlkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvGuEtEsDrCqqCrDsEtEuFuGvHxIxJyK{L|M}M~OOPQSTT…VÇVĈXʼnYŊZƋ[ƌ\Ǎ]Ǎ_Ȏ`ȏaɐbɑcɑdʒeʓf˔g˕h̖i̖j͗k͘l͙mΙnΚnϛoϛpϜqНrНrОsўtttsrrqponmllkjihgfedcba`_]\[ZYXWVTTSQQOO~N}L|L{JyJyIxHwGuFuEtEsDrrCrDsEtFuGvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĉYʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑdʒdʓe˔f˕g˕h̖j̗j͘k͘lΙmΚnΚoϛpϜpМqНrОsОsџtttssrqpponmlkjjiggfdcba`_^]\[ZXWVUTSRQPO~N}M|L{KzJyIxHwGvGuFtEsDrrDsEtEuFvGwHxIyJzK{L|M}N~OPQQSTU…VÇWĈXʼnYŊZƋ[ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘l͙mΚnΚoϛoϛpϜqНrНsОsўtџtuttsrrqpoonmlkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvFuEtEssDsEtFuGvHwIxJyJ{K{L|M}NOPQRST…UÆVÇWĉYŊZƋ[Ƌ\ƌ]Ǎ^ǎ_ȏaȐaɑcɑdʒeʓf˔g˕h̖i̖j̗j͘k͙lΙmΚnΚoϛpϜqМqНrОsўsџtџuuutssrqqponmlkjjihgfedcaa_^]\[ZYWVUTSRQPO~N}M}L{KzJyJxIwHvGuFtEssEtFuFvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˔f˔g˕h̖i̗j͘k͘lΙmΚnΚoϛpϜpϜqНrНsОsџtџtџuuuttssrqpponmlkjihgfedcba`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwGvGuEttEuFvGvHwIyJzK{L|L}M~OOPQRTT…VÇVĈWʼnYŊZƋ[ƌ\nj]Ǎ_Ȏ`ȏaɐbɑcʒdʒeʓf˔g˕h̖i̖j͗k͘l͙mΚmΚnϛoϛpϜqМrНrОsўtџtџuѠuvuuttsrrqponmmlkjihgfedcba`_^\[ZYWVVTTRQPOO}M}M|L{JyJxIwHwGvFutFuGvGwHxIyJzK{L|M}N~OPQRST…UÆVÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒeʓe˔g˔g̕i̖j̗j͘k͘lΙmΚnΚoϛpϜpМqНrОsОsџtџuѠuҠvvvuttssrqqponmlkjjihgfdcba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyIxHwGvGuuFvGwHxIyJzK{L|M}N~OPQRST„U…VÇWĈXʼnYŊZƋ[ƌ\Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘l͙mΚnΚoϛoϛpϜqНrНsОsўtџtџuѠvҠvwvvuttssrqpoonmlkjihgfedcba`_^][ZYXWVUTSRQPO~N}M|L{KzJyIxHwGvuGvGwIxJyJzK{L|M}N~OPQRST…UÆVÇWʼnYŊZƊ[Ƌ\ƌ]Ǎ^Ȏ_ȏaɐaɑbɑcʒeʓf˔g˕h̖i̖j͗j͘k͙lΙmΚnΛoϛpϜqМqНrОsўsџtџuѠuҠvҡvwvvuutssrqqponmlkkjihgfedcba_^]\[ZYWVUTSRQPON}M|L|KzJyIxIwGvvGwHxIyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘lΙmΚnΚoϛoϜpϜqНrНsОsџtџtѠuѠvҠvҡwwwvvuttssrqpponmlkjihgfedcba`_^]\[YXWVUTSRQPO~N}M|L{KzJyIxHwvHwIxJzK{L|L}M~OOQQRSU…UÆVĈWʼnYŊZƋ[Ƌ\nj^Ǎ_Ȏ`ȏaɐbɑcɑdʒeʓf˔g˕h̖i̖j͗k͘l͙mΙnΚnϛoϛpϜqМrНrОsўtџtџuѠuҠvҡvҡwwwwvuutssrrqponmllkjihgfedcba`_^\[ZYXVVTSRQPON}N}L|LzKzJxIxwHxIyJzK{L|M}N~OPQRST…UÆVÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓf˔g˔g̕h̖j̗j͘k͘lΙmΚnΚoϛpϜpМqНrНsОsџtџtѠuҠvҠvҡwҡwwwwvvuttssrqpponmlkjiihgedcba`_^]\[ZYWVUTSRQPO~N}M|L{KzJyIxxIyJzK{L|M}N~OPQQSTU…VÇWĈXʼnYŊZƋ[ƌ]Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʒe˓f˔g˕h̖i̗j͗k͘l͙mΚmΚoϛoϛpϜqНrНrОsўtџtџuѠvҠvҡvҡwҡwwwwwvvuttssrqpoonmlkjihgfedcba`_^][ZYXWVUTSRQPO~N}M|L{KzJyxIyJzK{L|M}N~OPQRST…UÆVÇWĉYŊZƋ[Ƌ\ƌ]Ǎ^ǎ`ȏ`Ȑaɐcɑcʒeʓf˔g˕h̕i̖j̗j͘k͘lΙmΚnϛoϛpϜqМqНrОsўsџtџuѠuҠvҠvҡwҡwҡwwwwwvvuutssrqqponmlkkjihgfecca`_^]\[ZYWVUTSRQPO~N}M}L{KzJyyJzK{L|M}N~OPQRST…U†VÇWĈXʼnYŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˓f˔g˕h̖i̗j͘k͘lΙmΚnΚoϛpϜpϜqНrНsОsўtџtџuҠvҠvҡwѡxtuwwwvvuttssrqpponmlkjihgfedcba`_^]\ZYXWVUTSRQPO~N}M|L{KzyKzL|L}M~OOQQRTT…VÆWÈXʼnYŊZƋ[ƌ\nj]Ǎ_Ȏ`ȏaɐbɑcʒdʒeʓf˔g˕h̖i̖j͗k͘l͙lΙmΚnϛoϛpϜqМrНrОsўtџtџuѠuҠvϡxvvvvutvvvuuttsrrqponmmlkjihgfedcba`_]\[ZYWVUTTRQPOO}M}L|LzzK{L|M}N~OPQRST…U†VÇWĈYʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔f˕g˕h̖j̗j͘k͘lΙmΚnΚoϛpϜqϜqНrНsОsџtџtѠuʠ{{uuuuuuuutsvvuttssrqpponmlkjjihfedcba`_^]\[ZXWVUTSRQPO~N}M|L{{L|M}N~OPQRSTU†VÇWĈXʼnYŊZƋ[ƌ]Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘l͙mΙmΚnϛoϛpϜqНrНrОsўtџtğwttttttttttttsrtuttsrrqpoommlkjihgfedcba`_^\[ZYXWVUTSRQOO~N}M|{L|M}N~OPQRST…UÆVÇWĉYŊZŋ[Ƌ\ƌ]Ǎ^ǎ_ȏaȐaɐbɑdʒdʓf˔g˕h̖i̖j̗j͘k͘lΙmΚnϚoϛpϜqМqНrОsўsusssssssssssssssssqstssrqqponmlkjjihgfddcaa_^]\[ZYWVUTSRQPO~N}M}|M}N~OPQRST…U†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘lΙmΚnΚnϛoϛpϜqНrНssrrrrrrrrrrrrrrrrrrrrrqrssrqpoonmlkjihgfedcba`_^]\[YXWVUTSRQPO~N}}M}NOPQRST…VÆVćXʼnYŊZƋ[Ƌ\nj]Ǎ^Ȏ`ȏaɐbɑcɑdʒeʓf˔g˕h̖i̖j͗k͘k͙lΙmΚnϛoϛpϜqϜrqqqqqqqqqqqqqqqqqqqqqqqqqqporqqponmllkjihgfedcba`^]\[ZYWVVTTRQPOO}}N~OPQRST…U†VÇWĉXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔g˕h˕h̖j̗j͘k͘lΙmΚnΚoϛp̜rzppppppppppppppppppppppppppppppopqpponmlkjjhhfedcba`_^]\[ZXWVUTSRQPO~~OPQRSTU†VÇWĈXʼnYŊZƋ[ƌ\Ǎ^Ǎ_Ȏ`ȏaɐbɑcʒdʓeʓf˔g˕h̖i̗j͗k͘l͙mΙmΚnǛuunonnooonnnnonnnnnnonnonnonnnnooonnmlponnmlkjihgfedcba`_^\[ZYXVVUTSQQP~OPQRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒeʓf˔g˕h̕i̖j͗j͘k͘lΙmzqmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmlmnmlkjjihgfedba`_^]\[ZYWVUTSRQPPQRST„U†VÇWĈXʼnYŊZƋ[ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˓f˔g˕h̖i̗j͗k͘lnlllllllllllllllllllllllllllllllllllllllllllklmlkjihgfedcba`_^]\ZYXWVUTSRQPQRTT…VÆVĈWʼnYŊZƋ[ƌ\nj]Ǎ^ǎ`ȏaɐaɑcɒdʒeʓf˔g˕h̖i̖j͗kkkjkjjjjjjjjkjjjjjkkjjjjjjjjkjjkjkjjjjkjjjjkjjjjjklkjihgfedcba`^]\[ZYXVVTSRQQRST…U†VÇWĉXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑaɐbɑcʒdʓe˔g˕g˕h˖j{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijiigfedcba`_^]\[ZYWVUTSRQSTU…VÇWĈXʼnYŊZƋ[ƌ\Ǎ^ǎ_Ȏ`ȏaɐbɑcʒdʒeʓf˔gǕkthhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhihgfedcba`_^][ZYXWVUTSRST…UÆVÇWĉYŊZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`ȐaɐbɑcʒeʓeÕmnffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffggfedbaa_^]\[ZYWVUTSST…U†VÇWĈXʼnYŊZƋ\ƌ]Ǎ^ǎ_ȏ`ȏaɐbɑcʒdrieeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedcba`_^]\ZYXWVUTST…VÆVćWʼnYŊZƋ[Ƌ\nj]Ǎ^ǎ`ȏaȐbɑcyecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcba`^]\[ZYXVUTT…UÆVÇWĈXʼnZŊ[Ƌ\ƌ]Ǎ^ǎ_ȏ`Ȑa}cbbbbababbbbbbaabbaaabbbabbbabbbbbbbbbbbbbbbbbbbabbbabbbbbabbbbbbbbaaabbbbbbba`_^]\[ZXWVUU…VÆWĈXʼnYŊZƋ[ƌ\Ǎ]Ǎ_ǎat```````````````````````````````````````````````````````````````````````````````aa`_^\[ZYXWV…UÆVÇWĉXŊZŊ[Ƌ\ƌ]Íam_____^^____________^^__^______^^_^____^_______^___________________________^__^_____^_^]\[ZYWV†VÇWĈXʼnYŊZƋ\df]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]^]\ZYXWÆVÇWĉYŊZi`[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\[ZYWÇWĈXq\ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZYXzvYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX5gDVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVD5g2J?RUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUT?2K11MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM>1g0J:JLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLK:0K.17HKKJKKJJJKKJKJKKKJJKKKKKJKJJKKKKJJKKKJKJJKJJJJJJKKJJKKJJKJKKJKKJJH7/1-5DIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID4-, 2@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@2, +0>>>>>>>>>>>>>>><2+K*10:============:0*1).8<<<<<<<<8.))| -6;;;;6-)| )|+33+)|???????(@     vO0rHIs1P   &$}R2uI†VĈX[XKw3T:&  =(4U5vJS…UÇWŊZ\ZWULy6W(U4  Q4 HY7еwJPRTÆVĉYƋ[][YVTRKy8Z 4qH ^<%a[8޷xK|MOQT…UÇWŊZƌ\_\ZXUSQO~Lz9]%=a gA(z]8wIyJ|L}NQRUÆWʼnYƋ[Ǎ^`^[YVUSQN}L|Jy9_(Bz   nE*a:tFwHxJ{L}NPRT†VĈXŊ[ƌ]ǎ_a_]ZXVTRPM}L{JyHw;b*F   (&tG+d;rDtEvGxIzK|M~OQS…UÇWʼnYƋ\Ǎ^ȏ`b`^\YWUSQO~M|KzIxGvEtm@oAqBsDtFvGxJzL|MOQT…UĈXŊZƌ\Ǎ_ȏaɑcʓegeca_\ZXVSQO~M|KzJxHvFtDrBqAo@m>l=jm?n@pBrCtEuGxIzJ|L~OQSUÇWʼnYƋ[Ǎ^ȏ`ɐbʒd˔fhfdb`^[YWUSPO~L|JzIxGuEsCrBp@n?m>k=jl=km?nApBrDtEvGxIzK|M~OQS…UÇWʼnZƋ\Ǎ^ȏ`ɐbʒe˔g̖ijigeb`^\ZWUSQO~M|KzIxGvEtDrBpAn?m>l=jm?oApBrDtFvGxIzK|M~OQS…UÇWŊZƋ\Ǎ^ȏaɑcʒe˔g̖i͗kmkigeca^\ZWUSQO~M|KzIxGvFtDrBpAo?m>l=jjm?n@pBrCsEuGwIyJ{L}NPRTÆVʼnYƋ[Ǎ^Ȏ`ɐbʒd˓f˕h̗j͘lnljhfdb`^[YVTRPN}L{JyHwGuEsCqBp@n?m>kk=l>n@oAqCsDtFvHxJ{L}MOQT†VĈXŊZƌ\ǎ_ȏaɑcʓe˔g̖i͘kΙmomkigeca_]ZXVSQO~M}K{JxGvFtDrBqAo@m>lk>m?n@pBrDtEvGxIyK|M~OQSUÇWʼnYƋ\Ǎ^ȏ`ɐbʒd˔f˕i̗j͘lΚnpnljifdb`^[YWUSQO~M|JyIwGuEsDrBp@n?ml>n@oAqCsEuFwHyJ{L}NPRT†VĈXŊ[ƌ]ǎ_Ȑaɑcʓe˔h̖j͘kΙmϚoqomkjheca_][XVTRPN}L{JyHwFuDsCqAo@nm?oApBrDtEvGxIzK|M~OQS…UÇWʼnZƋ\Ǎ^ȏ`ɑbʒe˔g̕i̗j͙lΚnϛpqpnljigec`^\ZWUSQO~M|KzIxGvEtDrBpAon@oAqCsEuFwHyJ{L}NPRTÆVĉYŋ[nj]Ȏ`Ȑaɑdʓf˕h̖j͘lΚmϛoϜqrqonljhfdb`][YVTRPN}L{JyHwFuEsCqBpoApBrDtFvGxIzK|M~OQS…UÈWŊZƌ\Ǎ_ȏaɑcʒe˔g̖i͗k͙mΚnϛpНrsrpnmkigeca_\ZXUSQO~M|KzIxGvFtDrBqpBrCsEuGwIyJ{L}NPRTÇWʼnYƋ[Ǎ^Ȏ`ɐbʒd˓f˕h̗j͘lΚnϛpМqНstsqpnljhfdb`^[YVTRPN~L|JyHwGuEsCrqCsDtFvHyJ{L}NORT†VĈXŊZƌ]ǎ_ȏaɑcʓe˔g̖i͘kΙmΚoϜpНrўsusrqomkigeca_]ZXVTQOM}L{JyHwFuDrrDtEvGwIzK|M~OQS…UÇWʼnYƋ\Ǎ^ȏ`ɐbʒd˔f̕i̗j͙lΚnϛpМqОsџtutsqpnljifdb`^\YWUSQO~M|KzIxGvEtsEuFwHyJ{L}NPRT†VĈXŊ[ƌ]ǎ_Ȑaɑcʓf˕h̖j͘kΙmΛoϜqНrўsџuvusrqomkjhfca_][XVTRPN}L{JyHwFutEvGxIzK|M~OQS…UÇWŊZƋ\Ǎ^ȏaɑcʒe˔g̖i͗k͙mΚnϛpНrОsџtѠuwvtsrpnmkigeb`^\ZWUSQO~M|KzIxGvuGwHyJ{L}NPRTÆVʼnYƊ[ƌ]Ȏ_ɐbʑdʓf˕h̖j͘lΚmϛoϜqНsўtѠuҠvwvutrqomljhfdb`][YVTRPN}L{JyHwvGxJzK}MOQS…VĈXŊZƌ\Ǎ_ȏaɑcʓe˔g̖i͘kΙmΚoϜpНrОsџtҠvҡwwwvtsrpomkigeca_\ZXUTQOM|KzIxwHyJ|L~NPSTÇVʼnYƋ\Ǎ^Ȏ`ɐbʒd˔f˕h̗j͘lΚnϛoϜqНsџtѠuҠvҡwwwvutsqonljhfdb`^[YWTSPO}L|JzxJ{L}NPQT†VĈXŊZƌ]ǎ_ȏaɑcʓe˔h̖i͘kΙmΚoϜqНrўsџuѠwtuwvusrqomkigeca_]ZXVTQOM}L{zK|M~OQS…UÇWʼnZƋ\Ǎ^ȏ`ɐbʒd˔g̕i̗j͙lΚnϛpМrОsΟv~ttttssutsqpnljigeb`^\YWUSQO~M|{L}NPRT†VĈXŊ[ƌ]ǎ_Ȑaɑdʓf˕h̖j͘lΙmϛoϜqɝwxrrrrrrrrqqsrqomljhfda_][XVTRPN}|M~OQS…UÇWʼnZƋ\Ǎ^ȏaɑcʒe˔g̖i͗k͙mΚn›{sppppppppppppooppnmkigeca^\ZWUSQO~}NPRTÆVʼnYƋ[nj]Ȏ`ɐbʒdʓf˕h̗j͘lommmmmmmmmmmmmmmmmmmnljhfdb`][YVTRP~OQT…UĈXŊZƌ]ǎ_ȏaɑcʒe˔g̖ikjkjkjjkjjjjjjjjkjjjjjjkkigeca_\ZXUTQQRUÇWʼnYƋ[Ǎ^ȏ`ɐbʒdʔgzhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfdb`^[YWURRT†VĈXŊZƌ]ǎ_ȏaőfreeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeca_][XVTS…UÇWʼnZƋ\Ǎ^gjabbbaabbbbbbbbbabbbbbbbbabbbbbbbbbbbb`^\ZWUT†VĉYŊ[kc_____^_^________^^_______________________][YV…UÇWq][[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\[ZWxvYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYX4gCUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUC4g1J>PRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQ>1K019KOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOK:01.6ELLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLE6.- 3AIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA3, +0>>>>>>>:/*)| -7<<<<7-)| )|+33+)|??????????????????????????????????(0`     vN0qGGq0N   &$|Q2sH…UĈXXUHs2Q:&  <'4T3tHQTÇWŊZZWTQHt3T'U4  P3HW5гtH}NPS…VĉYƋ[\YVSPN}Ht5W3qH \:$aY5޴tGyJ|M~ORTÇWŊZƌ]^[XUROM|JyGt5Y$:a e>&zZ5sEvGxI{L}NQSÆVʼnYƋ\ǎ__]ZVTQO~L{IxGvEs5Z&?{   lB(]7pBrDuFwHzK|MPR…UĈXŊ[Ǎ^ȏaa_\XUSPN}KzIwFuDrBp7](B   )$rE)_7m?oAqCtEvGyJ{L~OQTÇWŊZƌ]Ȏ`ɐbc`^[WTRO~L|JyHvEtCqAo?m7_)E>$ _:${J,a8k=l?n@pBsDuGxIzK}NPS†VĈYƋ[Ǎ^Ȑaʒdeb_\YVTQN}L{IxGuDsBq@n?l=k8a,J$:}L-h;j=l>m@pBrDtFwHyJ|M~ORTÇWŊZnj]ȏ`ɑcʓfgda^[XUSPM|KzHwFtDrBp@n>l=j;i.N~L-in@pBrDuFwHzK}MPR…UĈXŋ[Ǎ^ȏaɑc˓f̕ijgdb_\YVSQN}KzIxGuDsBp@n>l=j/O~N.k>m?oAqCtEvGyJ{L~OQTÇWʼnZƌ]Ȏ`ɐbʓe˕g̗jkifca^[XURPM|JyHwFtCrAo?m>k0PN.l?n@pBsDuGxIzK}NPS…VĉYƋ\Ǎ^Ȑaʒd˔f̖i͘kmjheb`]ZWTQO~L{JxGvEsCqAo?m0PO/m@pArDtEwHyJ|MORUÇWŊZnj]ȏ`ɑcʓe˕h͗jΙmnljgda_\YVSPN}KzIwFuDrBp@n0QP0oAqCsEvGxI{L}NQT†VʼnYƋ\ǎ_ɐbʒd˔g̖j͘lΚnpmkifca^[WUROM|JyHvEtCqAo1RP0pBrDuFwHzK|MPR…UĈXŊ[Ǎ^ȏaɑc˓f̕i͗kΙmϛpqomjheb_\ZVTQN}L{IxGvEsBq2RQ0qCtEvGyJ{L~OQTÆWŊZƌ]Ȏ`ɐbʒe˕h̗j͙lΚoϜqrpnligda^[XUSPM}KzHwFuDr2TR1sDuGxIzK}NPS…VĈXƋ\Ǎ^Ȑaɒd˔f̖i͘kΚnϛpНrsromkhfc`]ZWTRO~L{JyGvEt3TS2tFvHyJ|MORTÇWŊZƌ]ȏ`ɑcʓe˕h̗kΙmϛoМqОsusqoljgeb_\YVTQN}K{IxGu4VT2vGxI{L}NQT†VʼnYƋ\ǎ_ɐaʒd˔g̖j͘lΚnϜpНrџtutrpnlifda^[XURPM|KzHw4VU3wHzK|MPR…UĈXŊ[Ǎ^ȏaɑcʓf̕i͗kΙmϛpНrўsџuvusqomjheb`]ZWTQO~L{Jy5XU4yJ{L~OQTÇVŊZƌ]Ȏ_ɐbʒe˕h̗j͙lΚoϜqНsџtҠvwvtsqnljgda_\YVSPN}Kz7YW4zK}NPS…VĉYƋ[Ǎ^Ȑaʒd˔g̖i͘lΚnϛpНrўtѠuҡwwwusrpmkifca^[XUROM|7ZW5|MORUÇWŊZnj]ȏ`ɑcʓe˕h̗jΙmϛoМqОsПvstvusqomjheb`]ZVTQO~8[Y6}NQTÆVʼnYƋ\ǎ_Ȑbʒd˔g̖j͘lΚnϜp͝t}ssssrrtspnljgda^\XVSP9\Y7PR…UĈXŊ[Ǎ^ȏaɑcʓf̕i͗kΙmǛuvppppppppooqpmkhfc`]ZWTR:][8QTÇWʼnZƌ]Ȏ_ɐbʒe˕h̗jxplllllllllllllllmjheb_\YVT;_\8S†VĉYƋ\Ǎ^ȏaʒd˔g|kiiiiiiiiiiiiiiiiiijifda^[XU<`]9UÇWŊZnj]ȏ`ɑcfeeeeeeeeeeeeeeeeeeeeefgec`]ZW=a^9†VʼnYƋ\Ǝ`taaaaaaaaaaaaaaaaaaaaaaaaaaabb_\Y=c_;ĈX^j\]\\\]\]]\\\\\\\]\]\\\\\\\]]\]]^^[?dhKbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYAk09MTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTM:0. 6FPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPF6. -2@LLLLLLLLLLLLLLLLLLLLLLLLLL@2-0g;HHHHHHHHHHHHHHHHHHHHHH;0g.J6CEEEEEEEEEEEEEEEEC6-K,12?BBBBBBBBBBBB?2,1*0;????????;/*)} -7====7-)} )|+33+)|??( @     uN/rHLv1P   %$zP0rG…UŊZ_ZJv2R:&  ;%4~P1qD~OSÇWƌ\a\WSHt3S&U4  M0HR1ЮnBxI|MQ…UŊZǎ_c_ZUQM|Er3U1qH Z7"`R1ޯl@rDvGzK~OSĈXƌ]Ȑafa]XTO~KzGvCp3T"8`nC)mU1j=m?pBtExI|MQ…VŊZǎ_ɑdhd_[VQM}IxFtBp?m3V)Cnh;i;k>oArDvGzLPTĈXƌ]Ȑaʓfjfb]XTOKzHvDrAo>k;ih;j=m?qBtFyJ}NR†VŊ[Ȏ`ʒd˕hlhd`[VRN}JyFtBq?m=jioAsDvH{LPTĉYnj]ɐb˔f̗jnjfb]YTPL{HvDrAo>lj=m@qCuFyJ}NRÆVƋ[Ȏ`ʒd̕h͙lplid`[VRN}JyFuBq@ml>oAsDwH{LPTʼnYǍ^ɐb˔g͗kΚnrokgb^YTPL{HwEsAon@qCuGyJ}NSÇWƋ\ȏ`ʒe̖i͙mϜpspmie`\WRN}JyFuCqpAsEwH{LP„UʼnZǍ^ɐc˔g͗kΚoНrurokgc^YUQL{HwEsqCuGzK~OSÇWƋ\ȏaʒe̖iΙmϜqўtvsqmiea\WSO~JyGusEwI|MQ…UʼnZǍ_ɑc˔g͘kΚoНrџuwurokgc_ZUQM|IxuGzK~OSÇWƌ\ȏaʓe̖iΙmϜqўtҠvwvtqmiea\WSO~KzxI|MQ…UŊZǎ_ɑc˕h͘lϛoϝtrtusokhc_ZUQM|zK~OTĈXƌ]Ȑaʓf̖j˙ozppppoqqnjfa]XTO~|MQ…VŊZǎ_ɑdÖorkjjjjjjkjklhd_[VQPTĈXƌ]oieeeeeeeeeeeeeeea]XTR†Vra___^_____________`^[VwvYXXXXXXXXXXXXXXXXXXXXXYX3gBRRRRRRRRRRRRRRRRRRRRRRA3g0J:JLLLLLLLLLLLLLLLLK:0K-15DGGGGGGGGGGGGD5-1+1>>>7-*} )|+33+)|(0 |S2|2S|c@' |Q1pFÇWWFp1Q'? iB)~P1nC~OTŊZ[UOCn1P)Bg?')P0Īj@wH|MSĈXǍ^_YSN}Iw@j0P'?)i@'CO/իi=pBuGzKP…VƋ\Ȑac]WQL{GuBp=i/O'@CY3k=oAsExJ}NSʼnYǎ_ʒdga[UOJyEtAo=k3YZ4m?qCvG{LQÇWƌ]ɐb˕hje_YSN}IwDr@n5[[5pBtFyJOUŊZȏ`ʓe̗jmhc]WQL{GuBq6\^7rDwH|MRĈXǍ^ɑc̕iΙmplga[UOJyEt8_`9uGzKP…VƋ[ȏa˔f͘lϛpsoje_YSN}Iw:ab:xI}NTʼnYǎ_ʒd̖jΚnНrurmhc]WQL{gg>~OUŊZȏ`ʓf̗jϛoОsuvsoje_YSBjiARĈXǍ^ɑc̕i̚o~ssrsrmic]WDmlC…VƋ[ȐaƔkulllllllmkga[FpoFʼnYjkeeeeeeeeeeefe_Jt|a섪`\\\\\\\\\\\]\\\^O1>=QTTTTTTTTTTTTTTQ=1>.&7GLLLLLLLLLLG7.&,1?EEEEEE?1,*}-8??8-*}+v+vAAA?AAAAAAAAAAAAAAAAA?AAAA(  wN/w3SwrH,xg@…U]Eo.LxmC)x_8yJRŊZbZR=e+FxmB(wY3oAvG}O†VǍ_g_VO}Gv7])Cwh;m?sDzKSƊ[ɑckc[SKzEs?mk=pBwHPÇWȎ`˕hoh`WOHwBpm@tE{LTƋ\ʒd͘lrld\TL{EtqCxIQĉYȏa̖iϛoupiaYQIxuF}M…Unj^ʓe͙musmf]UM}yJQŊZɐbqqpnjbZR~O†V{hhhhhhhf_Vyt^^^^^^^^^^_[3nDSSRRSSSSSSD3n0n=IIIIII=0n-n7@@6-n*p*pAAAAAAAAAAAAAAA?ADisplayCAL-3.5.0.0/DisplayCAL/theme/icons/DisplayCAL.icns0000644000076500000000000032205713230230667022456 0ustar devwheel00000000000000icns/ic08І jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \@@HHPHHPHHPHHPHHP ϬS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPz@MS"Ub_!ikL8ݢ`UW\ ՙbAz C)Whx;%vz0\9EЌoV[L`%,ФBBZ8KHɤH^^L8p))$4G\`zH)%ĸ_(-E(N[MȠ둈ݳ:ZG T)97&e;woz o&x] IZ rG >Y~  տ;mD2ϒP`BU HNϼ>ø@hCi*?Tfl5BXN:;R}Ԫܪ\\R@{,g]3/;Ad$Y'k%F, X]uٗ`> p_*T.깔Q\[̗9k"8:\ՌaW(Ϡnd', ?ϼ~7NrV)%kşRv fm0`1%Ipğr^zȢH)AS}=pm>렧^*;QL 1\d:ߡ0C#,+tJ;vq+SG(6xB[wᔠ4%$}3/ߟߑ#;7s*zq֍1Uq=3e5)(ڿ'u6X8 ;f]]YTށbܺ-#Ee6ȦUGñļx/4,CawONM$Uni>NB:_j9#GM6"8[w rcK~Tߑ7sPNOoPq[ǖliddt(_+`yn]֭yH?u!];#ލL6qçܜib6$ؠ` Gjb_;%)wC/ĀJ}n3BUj-Wt *փϾ}Q}be'#ߐ-RuFz% 1臁Q*,`#IlOIz}%K7"]84^ /щΞec{1">JvNK=sCYw P1 gEpA~t#58צV>޾zϥAo=@gIwgoyoSBvgahrF n҇˜WDGu=ᕖ\-N0^N=v,OQ|Arfiti2I3V% }0\:0V+O] $޹A wT xbOyby I0"zo0nl[ھ%w#q+p>bo*pNf f} _ɯ8EI;N=-a ӷtx^#0B4A\u.mfY9~!*F~&ma=g(6wf&R [CFSmupƐ,=/@e9JZ2> 鍈3wMÞvdKG+!LstM5>K)F1zLG(,S9 Sh!!!n!$(%iz/gyd*20㟚U>ң? MzXDL(unn9,-_QpN-~B(~ 6_落Nhr麽 8W+Zߓ>O\0vD-\$r@6ϮNUvvkF5JF>Yj^D"At-d3tzj +1ziU],W:Ջ@5qFtvN ƋU#HtPhajp tS;o(`y)DɊZ2sw6(Ⱝt׺=Uxr`RdOZ8Z5(/s J.賅1H?fT}Pe|EJ(c ߄3!=u%!@F l.Vu]=6ʔHAyj] _Z@< cV0otrahYp;˶*/E'6h#FqṱoprţӔW'4׬uR++基gCG eGŴk7Ӡ2!N],tĬj ܕos­WCvgfs(w|&%KjM"_,ʥov81VmMvbx|7oQ(-ohos_+9iٮ.QCeҌ)Ȇ"冠BZ6 JX)7-n my`"&q*Uiݏ^ƴ͆c;jH@!*5G6a[F@B#wa$f3;]VP>Jhӽ;~Y8@LQ2I^єdO̱5N:i,"d\ng.YӧKUW/|'h+<˵S8_ٳ=MZf)w3UzB-yWsρUIϡu%ֈ ]3ej}tkHCu7|zogN!H[dc8p% (O@,9?[{^o &EúJո0|2nacpkDx0gC e+M`^ŲPC/g@ W6pcs0LfGc7mZ$IjRSX.z1ON{`MbXhmc`%LVBH #V_tW>ӉJAk4%`a2rII Gp.'!M-6UV)lОPOhȼj z(oהUةsL8WJAj4' U`rQ~< U!HИ9Zw%$ܵg0zlmLWk|ẅ́um(dPo|](i  H.ܽ!DNhiJߊt+UJhkuIM@j&]Ә?*3Z*Gdzjm&4r׃6⫱PttL Y'iےA}[, \GdLѯ!Yk> OoBy'3h8ԑh5kL/ kr`P\D$INjpaoӻ ,n; ՀJFaQa+2x#4?8`+9Gr*\ 04-{i}Bqp!>)>7 # 5/aZX8y%0$jSB/1d{6h!7A>q5o̠0_U83zS?6./ d",Vxj "CƪzDͶ* z.٬}։ܟ֥p ou,SD(!r/JYʋcHҪn:)YP3`= |-CYD^`!}CczvɧkG n. hZ{꜏#]3[/Ҋ;B8 qC%a@εmq}o;+|I42D+QrQP< ح++x >{kT=rf%l(Ʈ;D~t|mItYbI IʃT0O Ԕ^6kM@"l|S?T)~Fb>r:Y0'5kx:/$)T [Ȱ$AIV$~C¸vu%dKySN7rLQE/CE[Lk| ΕCPk ^Qj*9_n1n9%-VsE^.&Vz V\q$hۊF]+|惜SSt2Yu~PVՀ=ʰd$ĿQ _=zEF>GYO"]NVw҂g\4`)c)3|jˏ 4oXX6Z4&74)3dPj^ڷԠ6_J/挏5N2qgz=߂ȯEGCb1'\rso=m&HXl\@I06jT֛z|pXKIDf}"KYk0v_D])*@$?s><N3;}Ñv\LUc/}OI1=:3Mhvk`׮-q8Ac'=;14[\q6\|ŕkLH9mxթ'}(Nlw` olBr~QɼA}U|[j^U $++H18Du~bM{pmU+ "4`\oGC˃){#Q3qH1fخ"V3ѳEY[kr˨ѵ\LJ4V_LvǮ%,f[.cSKp.u޻(WnQOb׍|BsΫ6Ʒ;Y>7G|GEd? sHoU*V2R2&Qf:# qe"8j/IӮ?A5;CY54GgF. +'?~ٔɨ(7Ơ MjMIYnAښٺgL[ya*E@ŦơqD7Sus#|/2@|\^-Ǭ&7!x8*A*󼙇ZGt2{{yVff_ߋFL}V89 P9'ks][2FEJx!ZbyURɱbn(NW4A>vR!MO0u9Vr Ju[{72Cm:f*_4Q%*xK`KCRe@SQ UPۅc+OZD`JG;TLXsG"5jK/u:+,IJAfۺ*DOtRC#QݯH?}g6F/VHkDLDUDh?E3e3TGvMf=ɶ$Z#-%NM} $'?FaHF z|ԤEVquϿ@ߠ򾀏7F6g!s~: ^.qbLL~\1fJ#ECkŏeM%1M0dbS. H0/e-Q*1V"0iGÖӵ߿@Ƞ>g< mWq'[Mk,}δ\Vnnl+ ʶ;{!k^ArLbnJ\Jt95'E+γO,F|"";9DcS/aڬe~f90/XA#4=x$i#um!.P4>x<&T+}0Q$$#MCFq2sYCs]iq6Gh1(z rD5?HR1ʃwZʮ~LxдzM vLkk醉y-&YUdp@! 6)"Q&?E1pT}S*J_z6DJx?*UrcJsLg)W %Ճ 3Cjs"vc0 8#w"dԎ%z^kߥ쭦@Sŀ/ΐl 8krD!DK/ xK iIӜ <ʮzΡ u~_ Ewiv&O,'J7Bt7rODE{e9bҜ+I6M, Ҳ~ztKm9m1R`:X)H@q7:q{\xjoɕz,8QHg-8&8:phAKE_FBeS?_sSlӚ$T*jy}Ԁt!jbVXoA%(??Ut!*K{Ag;s2jҫ!49*yQw3˪h#]_0[~oc")#8*.z $|S='yQoZZֺ)7TN: ^;(01KPf4Y2]zXt5 }:n!>N/׽ xb։IHY,h Qv0{Y`h2? c@TիWF [d5]3 (GS"ј';]oXoDkQm}g%Gx*8I}_jwPK]D@`35S)hK6vVdGl]o((mXKߕkƲX7f{!o聥Tȉ  ڊ[{U/':6]NT R1sKuƴ;6YTsWY`h݄O O[/'aF`սt-tt~R~@q@8 E۶aplkDNQ#jtV5R_,-"3BEޗ|jw#̈́hVB)Fn(t ݛx؝so}&lu'-K&K"XWXJڤ2xgKh @t;؂n((3c1qbc Xx81/t? (tI ((W1XXW7 ,Ҕs[- .O^ a7\lnJwbI@K(l2w Y/"$E]Mn`( 33ZL +C@W@ (#S,n -OP`!&3Q>"Q2,SV}G z5D`B#3̬C-FM5cht͝+whfؑuAzsH`0C15>:Ҥ׻XOYC!K|0ķd}r}s_'w牢|+:4Ч/@%лٹKz`vTsԦvGz VcYN?f niّ NgO3x @plK|"86 b)YcɼT7dcD]E+DJoYSOWKQI v[#8W?h3S0 U{0O +ҽ8hX!=y ^b1t=xfZ+ ז`X/;h th(0%f[a3.4*= =TВ7tܝ" k뗷`? W.R[RYz4Fb5$ӬzC֠̔,2 {1 V/ToE}LHdm;᧽1]p e'%4xPNa΍"b~.ez_4íč(4EEi'Xi]IaŌG#d=1''>ecߞiocbדfLDf0K[W .%\*E;t~dKaͱ00Osr3Ϯhf`CyP/zBhp +S_.9pr۔D]J}^(EG g kNGı%um^FDkug ]}*>"HRtSԮ)1mv>Mr8Րڭn%z $]&0a8PO5ԏ pa5D-45ZzN`v)d%}I@EE6gz3?Ggqm #mJ^V#Rg1#<>4M_v &(w Ia$oi}eI~esyãV:'syE8ޘ2L(uN*>SfIXeă~ܤq N _g! G@f$2>lp#"XXlS$г iuc*gr[#ˡmàWnAaW4s|M`J!hRmՇ=+-{x =|t `-ݻ5{ ٓ G KբÔTք&tQ"m>efβiMX]4\͜=r\ AZOS6JylGmߖ}"vd*m<3؟Qg:,ߥm) 1.g '2,;Q1<.up+7Z޺xe 6#!^L6-8Wlmd+WحQ:-pH+~9!wN ^0۟>JUҔMSfKdK.!;bFLPJZ7+# >*[;xTrhXػo?覸Hq&*iHcmqe?!B{(RpO>?OhP7.}k^EӰO/!DLT#>JoEd:Qu3![R~1zƀu)|ap)|V/kpER^$`r3J-6&aӢY;56&sDt ATEB6)o/O71ߠRqc!9t8SxE t,ڗ^Au"j!Z,6Tk z%rLsz ExCne7;_q Q* '##@e<~R徾5YQBӜ $q3{oI^3`<σBY,O>̻?A׮(\ɂ'N}:\=҉rWaƨ|=w4#v|8ᕓn3^?e1DmnTLZO&<פ-wgXCbh1#hBGnK37f 7 8$̶^3ũ^gp(_9ߘL3NS15u=.z9;> -Oe>@ߪ7Rs{Ot%q:>QpW Vظ qu;6WsGV+N[}W){װfICaʒq|$|xPyH XtXp9 6hNF HH3#:"Yc6a|?}g?A~g$]Zm)>Xm]pC|)d3WOnlMOf[sae{Äf0ZGA5X?&B#4Ψ|PVLcͼE="pkpa٦>Y(RVMen/߷zCۤ bAbKj VDf?듔}5,:+֋iìYū#>&:^_B lUkz12Ԅ#mYZ]rۧ79H1|hXsOanYl AbvO6/]ZeH uTP^\jԘTfÆJ k)x OyYѥ4O 'uQfztu^4Hke خW5ʿP5Ⱦfd1`vc+'v&PCcTjl)^%$^LU|"Kh}3ܳ.즳ИSmڱ?2?Z h術 I lّ"U < cżxWҡoZSk `X=1`[.q'4%8WHta!ɬ F>-K fj{`?Kօ{y_būVk3s,@ACo pa̓ݵddUZiTΝ@ s7K{~^T'[X$8=ȫ)us,i}=[dsK ΃r.KL0߿l7vwE^X#׸b xL#>}hE[k4cWO[d}|2E"궴$ɶ7ntΰi +:~$Fxp{1]p s.*cwZ6 vK|FBt`qv0 H z8&_5}K1D$ˀ{L~KߐgˏvMaJCAf\oxQeJXءQ|HN)t%,f9 Y5n+ ` n+~f귁foΑ/IY갢/N};ʂ֝_)|04AZktq7'ǛD %1dпnANCوOWkߚ QlIuص|c /Rt?]( |TX30b]hav sF >B;DͰKkA?;nً05?qiCcc`x5E)2؞r\txe?[qe8dADzֱkL8]VquN@\RĹP3jdTwiQb7JcF8ؑn(tqn/*󯟽cZ>^ W򨉇L h:}Sx%e^Í" t/uV//v~%R`\e11Ÿ#|VA?p1u+jZgIЏr*+7U5[/5F,@jwB<efH́n.Q44)53 (1Sz~(7l3+"BQc2!Hި|U_&ԢǷt Rd[8OBA:md)q/'?z%i$+H ! {hzKxEQae} Z5#KdcO}R&y07}D#Qi*& Ì\d7##1{[3$TIStp"f`~8# @B =P qܬpSOQݠzDR1Ľ&*M1NEfefqzg鴑qT|h?@f&SM\CtFx9D>"H:Gv=+Z>>t2Y1тe$>FT~# V(*_ƟB"=)Wv+(lȡ 6?tkg@+<60,US?$'42.ߐDl)V"|QO|*\$Qw>b["fyAkݰj[ٽ+dõ3R<)v;~Ѳߋ{g~獊] I~X"҄kk] -&D8FI WG܋=7 HPLY~z|Z!^DB<͜G6v*;ф)]4?ɓZNdܶWOah`~tj',uϽ?K5_"g$m[,f͔ Md65Du!^+L03vĽJK GOU6k+USr[cBO4"06~CPw2L *촩eTAh71޹aնK: yWΘ*7fw)zυKvu.UgSj,K0tmH0y@~!#xl"tYvN,CjPt0>1<#>d{jK%jd?pS5w^q>'5k>[F4 L6Efh.6F#VlUG\`x_Sԣ$_]^QK, 5U_|Ғ!5!%$C7lA{' E)r%_ۀ 'v_K<dOC|},裓h;CB@Ir8~[##vmn #H4!Ɇ#j%Cσx#ӶPx}`op |;@f?r! ~pn\~'B3߯dSaCK~#ݮ!ݚw|rb*LͅcZX.Az0ǻ[SH _lvխ~m :n{AU Jk'?$e]f6{)!@vEQqPz+D|TcNGJV*=i$?PMK٧`!fdoyl1#ksmWKeת4^T P ӵ!s~HtEaW3݈nu/paVqDP휧-iSB.jK]$~s p9&@5Ͷ\\z&R"6[Ћr4k%Vqǜb%SE 1;&i~4#ܾfq4U3Z$(xl>ޱ yM`MmK9b}#<܉UH,64:LăZ9,̯$*O:`$vP€;i&\@7Ϭ'0Y3m0AS k9o*nMqUX$ Doe(ʔOCQIem7-wR0w7շwkWբgzFaݥ |޲lU$ Ur%$5 e:rf+`~g$E 4 Ux:2| dׁpR3'Ǟl G4 !b:TQ)CN 1M 8R1V,9|9B% N *P؞vn ml>P:x͓<JzK5NJ3keƖ~`Q:P9kD'ܞ$,/xpy ,>oTa@G^xT`-̃lŰX#G"W'ܗ$Kg "X;e Oٟx,C@,lLeEծɧx|Kwn@_Of,Є;9vhVkJ=>&+r>Zs#+Ϻ} *#rH\gס̌\)y#YA=t6 pPRw&z6jRzl3kOZ֑ f2zQb>wG(NXIҜqkNY拆EyUS__"{߹EvV;ذ~}n-OL=D fK|!>nZVpT>52540L'*fQԓbGQgR鎪ƣ5}mh9C-R4@,;*z:Wd_1[MnUE-+l5UZ bZ#W:(f-0V@+{T N/>sWs^ƼqXq;lGD;҇hي{KR$:$v\G|vj-ģH  䅻kYfgCB4j-$]bȼ3DRK]Ib6hwiGئcQ6p ~;{TGiUҜ]k[# qR!޽xRWo(&ɭ)bw/m(g̯Blfa;-Ҷ'=,z21jl\\Tq~HٻI)OJΆHrS+@¾VG {.Y9׸Uc;rFA 7Ԏӗq1I(Ը[.6${5 p.\n8ky l>@N( bo!@2H"P7q5ESk,KFNY19}xo`^ 3#IK[pKxsʞBXa߉<o9ԢBiU7pB+)xTQ;kO^s{OjWi?qJfK0r8^w# "8] ɵwk0˅Eu9,>nmˆ g g:{ݴ1&@+Þpsl#ϩI,l+I@qZ%33,j ߬_ơێ` O*Ғ%9\?N 'W[gu?`{iW Y@,ʀI/#<¡E7T+~Ŏ}G8aA}.8@ Ve LjVrWb0!% JO3y? -GIw^s-ay$XLz#\Dn^E'$&DR6fڡW#sMĠ![e"`X}$p}3̽j|N~@`Zњ,/ɛTkk!!m^6KubG^?uU5o?%OKƓ"?OSUOh"[ r ObsbF9ҡJ>rZb`kA:tQKr(%dN0/%8i&)}^ܛ:NMUߠo V 0)S+Z-.RD!^ 7@C!fj5~/f_ZYDa'QEgKV`dxa[:;Tt\v(sp#ddw9.lUg]*@~M礑D[&ZG̃d_ƕ9L?|V@55:FYU6QHIj;؆4eƦ9(d7"LNc`%w$\%>xo>}?YO/O>z5_o^s$Y8S0uخ޿& m@W6+ [\&r@MQb>~E}KDQ |⿢:gmh=zkwɆ#7,C DV"jX"e*\\iPW CU%ۂw?lB戜|/*n }lH}Qp-܇[wa71++p,e$}zD/MDfhprm`LDUܯ-&5 *"bsA;aB@ylSa Y-d sbc?cH̚(n# ZP0x 8) L5A`"Ot' s a,fd`gQ?ЅDvd1\oi!GKs㸙a+ p' 3ӣ?/CNR+>Mvs9b|XdYQҦRQF?_8 =x T$13{{d5 ґ#uqY>Det6쉥9ΚdxK@(  !ob0&@Lp[mK6CߗdosəVI, Z9r)`L/ &MOh))?漈~&OYh],Kt8MZΣ_>e!]RZ5Jg&穴G{$Ԃir 5^YSlXv{M%Wt<0Đ]LRDfKq (lrKV&FOQ]m}6v>)AlB]qO=d:pXRt@?蠈#CE9S tӡ e).Op.xO~'q(q;߿u5AtʇvzB. > J030^Ke/`0NS[{(Qv;ռ<@8p_ Dg]hF5V[75''쀤ba+swjBPͽ8\q0jx (ZSL}GB6M  cj#ܛDDt8EZ$P2 \5&Ak9~\X}4w[ C;5h]n(cusƵ'A@?'&ĉz|}JfܞL krr'ݹ#9D=zXHS N9Z56QqFeU.m+xċ(;frf2Q\MT}t-c.R?ѡ.]C"ݧZeZʞ`~:@a EW"K 03|REuNHvL4ܒJ (F+)-EY`us9`:9 okL cs,Gy?g#fnZRRuܐ8Y4.` ܬR9(ت@[yHʟ>ࠖ}vE)h )K)vF"⮾w)go!|n~;*y*uIHoC6§_xSmэb]Y}i> „UCb"VҏGVG$Y:kÖO=^DH NH5/f}8oSnQ|D/OWCWkh:DEolfFv.{[gԗrH gnZދ "c9{utrɵ^j+#:fqާ BGZp5~}8Gy3ZS^+O@=!4rч [߹Dh:Z|/Nޡ1ͦDQ<lZ(xHTv& yGQJo6ŘSEA)9D.lyuKk|Ajk"}F/zVay~Wxum+، @]כkntg <,<WڦK+sHxj0rSЋiؾ l|Crgx8_KÓTesruĥ`w1fL!vEVx]h9;m!wזc=p ;o,0Vu3gES ̠07}/Y^b8%G,wp3x7߃ۙSHu[ OoNXAuF'&mW`19 '# y}Ӭ&Pݥ@3%S72yWE1a[X[IL5qp:_;;SY[M&LՅ|@p90 g/8DdžEFcz$-$QZm )5r߼B<&٩CYQGµƟj~<c:J:YF58}EL+^UfGW[߱B::^GwW<:@*W4sPfQOޡ9J[>_B=8V9ܓ4mϪ8c T-R>γ!mH HWx$O:nG‡]^$mb*:*W {WlH$ՃM,/>cѣH!'  +[{T. xaCHb+2Z(E֡׏VĕiTrJMOm!Ң M71%$]Y(`Qfx|̔"S+`r ̸H99ό7olј`CU7Rg}~.k`}˲-,ێ_P 90O}aCo͛ûy?\|[d¼[2LhkRe(!R>^3dYR&nx3m Kz#`82^sXx0ҏvkY&,36!택1~%.#QrnlC@J,/@iAd|T:Wtar_Dɦj2nv?sYa]45]TPj!DmĝqtK7)=BBc^7;qmv#-r-ႵkwjuWP\L@g"ב¡$pUЋ rg]ʱ 3TG6B2J@VwB_jjP!ÌkI#o w%9YRBv6n9҆Q# Șp$r̄ףRBm*pH/<-@RlIlOXf6.3-K':֍ta=涜C!ڜqAiNnq%s  fPǎ]q#=dt`KJ\1|t5&8Ӗޅ򡊘ySʹi%/W[.sGyyO@H xP3 T %>-GcxUAY^O e(E_R{x.1{Pu& 3\\^!ݠZ4^`-)WJi_U̍^;oApipRPU!R#\l}"V*F4=wa%Okn !)kT}U{{2a〥47`v^|q\ K =~Zᬌ>G^Q0֒hѵݭdqUSto 9}m!墷xx1m)CDLbK$H.-uVd [⁙HNE.0/n s \I꺦K BP>OhTAg3©y~"QQDQEOg2\k&<uaXB^ήjy 4MID/z:3.[ITКG"su:-ơz{Ӂ& 4l TqΥF(ub%q!^ UVS`EQ<+{Y`߃.:]BzT)֕ﲈcd\#AMw.Ѷ₍8G5WK'l? F`xJ:M#:=*E&&C&FaUH;\?O?'e۾tZ3r#*u\pxHۊr.,м=&raƳl[VBCWN묘\IYNCbJυ^vLXS_ ; !P \7$4X5d6|JHn[A.7-אƯPgjY y0if%ϰL*8v~|Ajq6 5j1AW < ;kO+$eQ #y0ĺZs\SXo# !f0MPÍmDuU7 ZiKs|_ zp;M>TYvw\ 1 Wb?u98DHwظнh3Z>YeVհY8xz|E pD>OqOju ?NB[0"R Dm.230ElB[9*#U ]<.g P0a,RìRܲo|lyB}M|ud--{OνF}!Ugo@&u?G3Xzmcp7#k;0tIsa yP;^7Sla`G=)zppԢqBPqLסI}(puhy:d]xzc7Nps&(w뱽f2C-JbOPڛQT[ }$=V>hp?r,R[T,Boakޣi?z_hxחn]CD vNgȥش/*`tes,8U0kBZ\g>n7ѤψߎVM b*gR08[?Qer؈x^|o;4zդ؅{R@*]'܉dTk6&\aSԙ])i}a?c |zUae:awixgl,No&ojdM=ښ= ) L]ke^,2&kcn1z9Ü7~?]4/%'^]&K]~ ;7¤+th~¼qy?1]7|vUЙМLԎҺspaB) 6cŹ94 »Liߖ%5u݁cf= &4`Qk]ڣߨS o% oqEeVj2s5kqc"”9w#LQr1? N> Jݻ(qMJ=F̿i\&DP"5ǫ Re?o_S\HpFhC[RW1Z%0Pjφ'3P$(= ݜE"pFr߲%C3j3"%-P-X%_uDD0!B )WYZGQuRI^Nd51b'2<_l-|SqF.@P_:ʝ|`p: 4L8U?H)]i;.M,P"2OjBߋ]PC .nRTJ vHz4: t:MC%Ym<,/mTsw_Df’|*~?51w*Z<;%?qn&D5/0. "ܨHn7zSri-APvƜ~&@|ye8-ߙ%1HZ7D W&X.c4M K-[+}í /q}a_obӿ7Z{Kʉ-9kvuZ/B#Co_ t?_ #LG/Ʀ{Jʁ<V'@*K.8GtŞڻ[tP&R :bɆ+Q S^x*1(e\_ui89I2?BιsW&kR䷉:HԑǁdI?%vNHO<,HIL۾^aq\ _ d~ӈOxB =r9QBL z95ΓݣDž0x_qŪXRedx&gwNœ]aƅңj9g$yB^>(XkéW@9ޏZ c=N{ K\-(T $?,Z065 ~9'B һqصV@"oaЀZY%!0.:ꐣ_ :<~ )o~H_$gn$!":'RTgvڵSɆ9g΄a>KcJUФ73JRtr,~hp*F'>&d\Z #r[S!},M&'ӟ7A6,a]Ιґ/YYV{=/_ 15yO9rcz_LQ䩱}yt^l,0_H]b:23[Meykm18ށEjLς_ێ2YDF>CIoLۃ78*`O*OEk+}w[{?F(.iՊLqh/$ 9Nj[374]7oqfVFoᗮPZ!6{mf*-#;7&.!2Q*V5+1qoHl퉨<,ݖL Lj8(K# !@&컼jGk / ꚬ 6 v8ٿҒ\l^U5U] w ~>3(ֹpm++|7ut{AW>+%ކ|Vts/0xĹxQWr:f+%zA5:,ق:2%bXŚ}KO0XRy7pzsojC/1ڪJ&P]742E@yI>*F& lBZ3Sj $̴e\N{ :G&톩$Odavtr/h6 G\ה ;Pw;z •x?4MF} L3-=F!o^I7fTGP-S.:|ϩC;5ɏd|Pu ~ϷawL@Agt,vwr8pG0Q52=$161͠q/T]`7VA2\f>uW%&9]C͍ k6qa%>!X H"5(ӻoZ?lcBYkHrS0]EG)S(רmr4Ĕgx|\"%uEĔѶ t?}O^rW6zWHw) &\5p8Qu} &*r1{RVϊƒEBpW C*ٍ!sFW[|䮋(" ɝ?F¶ f6w%gd0È؋.>&qΝM@Qc͡쬄q{dvNlrb+g,6EAmʹĊ?y4̸Z+RQ/K`f7ZV$$˚y``t8.JxŷbI!Q:Mȕv!փ=<ѓu'n} u}2vnZ%QȻ?6<:~rrx'@bOǡ8+Լ*lN X݂/[zWmһ֞>{nd~alOGn餷GwC%}ƚ/Q[m_ |sK čL!كY+Q_M=TJWԓlG.ֺ-OCp2ɩ'̄P*|"jkRc(,T1= i4ОfJE|y a5+*{gBÑ7@X 798RX2I:zu?/wPZ(XØ;TJr\=5i^ECO0b!Av_F l ga°" THd &U0ߙ=+5q}$vS9×7e]@b =MԖ+(#HE:cpd/saF۲UĻ*SBDfwdo7nFO+chтeeɝ=[lfd_R s (OH}MC~-n+`a+"ټP d8lPo=#ވ_K˜9 jpʻ;%Ls>2D#dwKz!&@K[#TM:npHDtO_ Jv5$7UlfZn#(W{X-7[c c&>},-(i%$ s2"-OIέR'"ϝG`{mwnG$tx/ͯT88ϩ.U3Y-MGG[Sg➻?"}g9[%H/%ST"7M]%tښkGļʵ]:rB; 1ZIع'"e;4 DK%8 %ëMQCēaѫ dfMqQJnJå_І/r'!dneO-W7xhۻ_%V8_VIMmu8WD%=dL 99ڿ(ư~CQ5M }6dNiVi97CJw^ Ē ([Rʙ} +(T*#I`^i X?" x,*M OQxQ^Ű`5/-teFAx7jD39HHvCd-j1KvAnMX)nLqTyDZv!k2%+葞Vgwޘ8.)?P^M]DBĥ}5X7 1sĐ4q$7~J7a@~@ H3r?/ Ff^r ]-eb<#a$TCZ8%'#V$!^)1uQ0mmk['iㄯ;p#.[4 yl=y^ Io3ZS:^ #l4W?N)s-սrJG^e]b 5Ef58yTI,dS=8aVo 0.(Ro ֎L CͻX\3ViήgZMaܑ+Xo>tAe t 2A,prC򡴕|'5?H/k/&K@7?5d+a4ZMڋz]l4ys\宁%.)^9X 8 t7mAzo)~/%,GċcFp(ce'~0Z;#GgޘA>ѩ-=HG,}X B[]IjP] *JAS0 N8F +D i-&0AE>=X1T8 W:)")ȣL0=-f&h̊\_?;N6߼ڕQ? H mcQ9.xTKlDf= MA ]I^7g*8+"]`T˝:ۡ(Щ6z[UIGHRkJòកav~'1p),/o3yHb`/Ho'qӥf)Runz5Ņ['`S5͝R+j"$@({#f(uǰxA6Idž FncwRKUT%/# 2YY.Uz:lTz}dkD֒|U6w2c_/kBlL=g`qգZy~s~Oz{ <(CLnoǵ<یLMBpGoN UMJF8P|beˢ{eU+N@0 ʀ_Dޱd)9FK[x] l ^W51 KQ?OJzoiޟ.Js3.͵ܪ&S&WÇQ nMY٨9T -fN,SCդ钬 7׷ ZcͱO?uko ~_q`,P6K5[+sb,a!QB_U:oqqPZ768$4V:X}rS?9'PwD? qgeXu-pV⸹(E9ıjCuwdkzq7C C[Ślj|OH]{, e'妶y9n=b!oX{|): Iʭ:WijE܈X?s T [L]TI RDd4Chmv.CͥnqRr enOr"ۭY``o6iNьkPB[7@& yLl`2M6AWyqmῈ#> Yu lL{ (Ԡs|}´c\Sss 0Pri8Gde`3zA@$1uh$Ĕѫ"+^Yp}E!?+qLHUMi@xΔdq (XҘRz 0q#d?|o@ Nb7 *ݰ^mj{jc f8?۲gaEeSe['DQ1ҺiՑrPjRI%oBEW- 2*/ -:>1?p!u!՚ B;1$'mPcSN 3;PHe pi?w!ǧkћB1pG(<3 e(7Psc. s t+L̦ɻ߼DӣfLHlJ?{A5#7%^M1r{E#^,PI"Ÿ-g omkR"1d3s =ZtmrZNT̡B~ 4|+bNNCnGl@)2;7N!+e?ƽQmMQ!ŸKk SNls%$bt *l#|K 6SI2Ez]rއ>@#/cSC4Lr-u\W|x0$iUvtM0P9vbõ{LS4>.k3(MI[X!ȜuZCc 8qScpL!PenFmo߿5Z"ZHvs#dUS7Dgu#WY4,Q,f&أo!QwOlVIa,iG~˜-4͑{9 |Fե%Y]\1UԈOƩǮ2.JK`X\uLR&9h@CRzwB{'ДOw\[jIg'/aҁ y3'fr>{CkqLk$=Tw?W:tр6׃szEEhװTrzq5Zy8(+~ޕ[-\9ըۅ/2S,JSIgcRƔ?lSe*grPg 5ӨL-ZǁF6WO[jq3T pP':.R/:A7Q"T{KkgN[ /LZeaIkk]]\k^wQNoH5dS1I!^W*'2M$kƖ'WܧNv*ӤR6܈}KX)]="_M/{O~ޗsu;ު}(%Q?..9 HGȚigO$ߠQB[d]2hLߤ9ixdzq6;t5k8A$|[]3Tb% "~?7>NlYCŐ'+EG9rQU.&\pEƫ 튀3O, @g_KȆn4QIN:hw|mM VRct" 5tesXrU4r:?-8ɷ(U:GTߵj5ؑ_p.KYHt`ݰʫ~Ueczϑ|1Bh=&tn_G=4XY̋Mv(~t NZMUdp["zs^TU67V"w_sj!8T+!t3 Eȿ$1zSH-7o'@:_ GM3!|Rsjv@r fa*r7"R_/F=OPJ ˶{0|ҩ :-. @U?_&AEbo&_)g"C4<24Y@=ނǯ&g]aⶈ<5]d,2'3<;_06ݎ=<$J{T.b~-Nr<*)SүZ0:ytءWMۨL{3ufSop~F()=_dd/J3MN-g(ŗڿŔduFeiK#݈u]n4dh#}ԍuYIh.=j񱇚i-;6Mrjuǩ4c'7&0- sEq R 9ԃ!C[YA>'d  cxF@w RGjP  |d˛F[ve9:rd?̀eE9X&hzZ./==(i :;E5 ׯ\a]\M /"f(fFGErΗ 1G0M؟cFr+,ށGFE?Oaxͷ,:]% 7/爄ƃ Fl\ 0.yᢡ3t*.}!nrnl1( a.HeY =fY T/v@Wx ߽.h/ u'a~I~ V9؊m fRel!)r Zh'Zg5Yu x3I",{q8,U7B~"ǔTܝa'ZyVd?k/y7 tfU'= ᖽ濔s!#?":Szf"zZP[+#{75qHv~C4o> yrܤ1n-Kjq"Lk[{ˠaCeiE%_)/Rg#rU<["Л!TIa˷ע !bͻ$qW6igL-h+["hoC~&c8yk5pHq4Y(M!'o%FQMJyxtgtMUpjus{Z"5_5 $\ W@h`Eo-&G>S&~7N_/"Qn7)JVHDHGG#_]Za.H.b$52Χ@Ҹ D΃Կa KR]XK1XSlzB%9A+_ SEG!4ɸ̅bOwۍ>w]'d~ǐ߇P|]Ѹ.r|ICYY)mdAu{=>TnbT.+X8<ޞa<TJ.k ,))gm-e3N$u:[3Rw]xDU1"4 X]Cmlc5wG_?hdbWYnᚳ{ip9g[gCZN*20ڬÚ=&tV"i_`!IqË pY2إ%B"_\wN1&O ~ԈrǰMh'(K*`FŇӺ:>vWlfNFס-uY/ShFQfV:cI5АTHKWcV#/}F1%{0|.G'WPr@s]$xM7/0.rKKQ&(sBdwbٽn1 7]bR)p.ߓ&w)M}wP* Q4:!63̮oEmڽv+~',;TX#':!Xp>$1v2cQƚh ױP#*E݀W5μg6{ܼ~fpMۀ_]spS$ӽ(3D?ԖH\_!qFjY #i?cla #-mUm^#Mu GPMOqȁ&bD vV!k*`!$go)ȴX$y6\!ý{ \e,\N{d\RZ``9M^:;Cf^3@eї7cY%ʷ IR! @Ur?Vk%rmQ%/"Bd Jcԭ Mතo.A1CTIxV},>_6D1S_1uEbgc 3m,JwjHpV7M&/_rU4: X]Bv.VNx|%7X'\A _~>=5vk!K5hS2 o"Y cOWBPQ/-tKElF:[O^E&7e,hn*F`dU~,O4{K?xr>$+e*k- +"oesifim?*[@k4Iuȿ :@/m ;$gH!*[hQX_J(ʫq KOӀRoz:xV²p{E'Ð#xJ3٩t~)L쾒RY? nhǷ34mxбM@I1MV4] PM+P?U_;#S1xb1:`- 12 b 1UAq0$\s/qƞrxz$`tY ?[?|d[?BtN{!Lm1\M^{9 >{uPsMKxzVcZ;l27p ^Җo#>{F3QHNympt,6˻|T@ W=L\E#*$Jj0&`̎gkV"{PhFUٰ*1VG А"(vHiD\Ys,Mfd9&cdzP@{YlD:aD U5TgdK?KN ر 4 ]!AGp.2"{NH9<§Z}JfFI{ K͓" C'Džs/"%C4;TWkI2 ;3#C9V-arvJ7sg Xי L81Lҙo| nk6;rDPpV;C<vw4wIG]]f>;2S8d e=^,B()jJo_VAui5jc*c4"ʽnXd$ia*VUoLw \g2n 4{Om, &B\]4I&g{߉FC*4e IO=v֨Әne /OSgFiZ)T;x [RGU oNM`(BZ\t:]Fb۩ [#X5qMT-)Cs7C˙/t=I 楑yAdn8|1T}g!o,6{sdOm|Ybffb.<)?Ry"5>c6ya0`T{o&$g--9C%1lhzs ʀ?LP 2X P|ߖyA͟1)~[ic#x4BCHr3=P~J>#b,/yr~xiYxt":Z>%ŗq+(8BE*WvCn2^!bt`ZL}Sʴ?~hE)o3Q./fm j Z$օ5iJ3@be6S{`Ә9`"eR[Y\cϟ^.k龟eOO'*q[}؟͡0W{.#}dv]م B籍[VJG7y4J뵒Lr'xn()ފ~Ye7(ceY׻z3^va.m*.൐s f8%7ٍߠ~o12~ƗESS]TaA%9S|qL0?J4nlMLM$x%a0IX jR ])n܎0mHo,h6hlH7r Ƙ*MGtoxQWt{$,WRɞ`hА.6ˊme{˗ҲWNgkY$m.$ cM1b"$Z޴?Fsv!W d`K{ɻ:4.~26kT㫬3I,Wn睉4qZ#M.,3[ q 5sG/N U`"JhwcűU]:' T)K=!4YyТ2GZ<R3'[2$Hf pU#OuLs'DVg{F& S2SqF+iMZqƿ5Dyzp׎W/2Tȱ>}iJ%(5٤4UguxQ{3W`9;uZ3HvVv=x, ևЧ m?d^ET<6g#1;uUI\]CtK.wkaI W}͋nc|hG}|̈́83.#`Uμz~Ͱ o0S fl.iL =SR)YlKHm|4?WDr@[bR蔛1ZlHM~4eRFxvH~S}F^PH²6?,?HG7MOpźdUґğbpR+:O4۠ZT CEldo0{K@qj:!V,⿓.H0:ˠr[T>8jF .M{Ά(1+QJ[]|9*@IZw#{UUEy~? oc9]UuO}>p2Q:fA\S!kd#O.imU+jotqFػMpAg]^^y0>LJ4LPL`ǭ`z53e0o4p!C&dI|0r%$w,[k$m9f(op6H,UQWЌ^SN WRF%M޸1'o> 8ͭƤ/1q.)VIcC-wG+Lge*-p2kP$Ft%GТ_bktc y Rƍ[guiC䍐>?6 ˃=>q3# QYcs%D1(%7 Gi4Xq`qJfk 0Y{>!\,cw!nt2 sfD8aEQ|a>HҬ{ť<&jFkvN` gu[Q$FfNJ> s P޹zQ> :nyn.4W98nF >ҥN  :^rs`{ýf4ןk8DIS dO 7$AX0S7 EOBOⴟ+u|k<5qlof;<6,%7_謘 y>c2ԦXu(sLcF0d!&LwF?<6܃y_LJD**ᾹHdɹ }]>hC\݀͡Z]=IbG6efPj련B6]B.unYWF68~}VA,J-f&R@*mC\O%jt0L<~L^/5~*Lʆ%5#rޢ*ÖHwI\xXQшfМ~!V @\vo.L5iKO!Oz'*z-FC'gI4Ɇ@u=V7bK>LM_ v_?6nH R *PКnjMn'8"?M#ͭbl ''>fZ~յsCزbo 1a;'FQr+~K_*q@&.:0ZQu8|dBY4;&}b:E|;5scb~)LzUpX\r̕[Mp7t#<Ml3/)[E iːL4W4;x,;O %|ξos~q+Wf-wJ8\=sՌ&m/Mqʐ_E>f9$\JIxJ.LYigۅ' ߦ"N.J/,9 X Q (MP.`AqD@ { Cl^`+竒,G7`jdu6SP_&L)Y"2rTDEڪV|Z->r^SZ o{W1YR3l>k {mTKBWFŲΜe)D\6YeYO.=Ea98ӹ^sJ>80wOOmh%PϓGovpҠ:YC8S.з5gv 7 7ᕅ."FhS'ŷ,VƬH§oo> BJxC5E.E3#}8֝U~22K!D;s13\lц2+ciʑtw`遀sϚd~J/Z@ju2q!_s4 n'ôR=B$ n(q迏Nzr<ó} 5h囧@H%$6b{+-˭b DGr' ՜kToYҰ\git32f }~~}~ ~{yxwutsqrststuwx{| ~zwtrqpqrrq rsux| }xurqrqrqrqqpqrqqsqssuw{}xutssrssr qrrqrpqppqqpqrsstwy}|xvtstssrsrsqrpoopqqruwx|ʃ |xwvvuvutstsrqrpqpqpqrsuwz}zzxwvwuttsrrqpqqpqtvy{ه}|zz{{yzyzxyxxwwvutrsrqqrqqpqqrttwz~Ƹ}|{z{zywxwvuutrsrqr twy{߱~ ~}~}}|}|{zxxwvutusrqr tvw{~Ɉ~~}}|{zyxxwuututstrrsuwy}}}|{zzyxxwuttsrrtvy{ۈƬ~}||zyxwuusttstuwz ׭~~}|{zxxwvutuvxz} 鰨#~}}||zyxwwuvxwz}ˇ ~}|zzyyx zz|} +~|{{zyxyz{~ۇѫ ~}}{ }~㬥 %~|}~󰦠 ˆc/ ʩ~okb)ۆݨynonf&ummoplcslmlmnol^ ˅æplmnnmW4&֧mklUC9 Ǿ݅騡kjjkePHEB4 ½ÿjkkaMJJHD= ýij[ONLJJGC7 V υЦ}ij gYRPNMKIIE@ ʾ䨢vi eYUTRPNMKJHD:tڿ򮣝rhhihic[YWUTRPNMKJGB%½mfgb^\[YWUTRPNMLIF:ľ˧jfgfda_]\ZYWUSRPNMLHDƾԄުhefgfdca_][ZXVTSQOMMVbZﭦgeffejjhfdca_][ZXVTSQUbig^ .hfefedglmkihfcca_][ZXVV`hhjgcL/ƫ…gfddeciqpnmkigecc`_\[Z^ffgghhcY/ٮ~gfdccdnvtrpnmkigecb`^^cfgfggfge^ۃ*뱬ȼyggeedeuywvtrpnmkigecbceefefgfbM#ʹuhghddk{|zywusqommkigefgfcW$dz˳pihhedr~|zywusqomlhcdeedefeec[i"ط̬olihfg{~|zywusqngcdedeec_1"麵̤qmjigm}{yywulcbcbcdcd_R*͞tqlkhu}{ysfbababbcbbcd`W"˾͙vqpmkzka`abccbcddcdaY&¼˓xurnrrb``aa`aab abcbcbccdccbZ»ʏ}xtr||h^_``__`aba[?ȏ{xtp^_`_``abab`]O$č{z{c^^]^]]^_^__`_`abaa]R j`^]^]^_`a`\S(ٽv``_^\]]\]]\^^]^]^`_`_`_`_\T!ںe`_^]]\\[\]^_`_`\U!ڸucb`^^]\\[\[\\]\]]^]]^_`_]V!۹gfcb`_^]\[Z[\]^]]^^_\V ڸqifecb_^]\[Z[\[\]^]^_^\V"ȿnkhedb`^]\ZZYZ[[Z[\\]]\][U*ľtpmkhecb`^\[ZZYYXYZZ[Z[\]]ZV&vspmkheba`^\[ZYWXYXYZ[ZZ[\[\ZU+·{sojifdba_][[YYXYXXWXXYZYZ[\[\[\]ZT(ª~wqkhfca_^]ZYXWVVWVXXWWXYZYY[Z[\[\[YR,ʺ|vrlheb`^\[YXXWVVUVWWVWWXWXYYZWQ)Ʊzvplfcb_^\[ZXWVUUVWWXWXYXYZYWO*~ysokgca_][[YWWVUVUVWXYZYUN0̻}wrmhdb`^][YXUWVUUTUTUVUUWWXWXYXZXUK*Ƚ{vqlgdb_][ZXWUVTS TTUTUUVUVUUVWXXWWRI֩/zuokfc`]\ZYXVUUSSTRSTTSTTUVUUVWVWXUPD-ž}xsnifa_][ZXWVUTRSRSTUTUVUVWVWUO?f4¼|uqlgba_][YWVUTTSRSRRSRRSTUVWWVTN( !ytpjeb_]\YXVUSSRPQQPQRSTUUTQLæ ý}xsmhdb^\ZXVUTSRQPQOPQPQRSTOH {vplgb_]ZXWVTSRQQPQPPQPQRSRSSTSTRNC ý}xsnjea_\ZXVUSSRQPOOPQRSSTSTTQL8,{vqlgb_\ZYVUSRRQPONOPQRSROIý~ytoie`][YWUTSQPNMNOPQRQMFſ|wqmhc^\ZXUTSQPPONMNNONOOPQPPQRRNK>j ~yuokfa^[YWVTQQPOONMLMNMNONOPQQNH& ½{vqlhb_[XVTSRPOONMLKKLM NNONOOPPOJD%ľ}xsnjea]ZWVSRPONNMMKKLLKLKLMNOMH=Lſ{vqlhc_[XVTSROONLJJKJKLMLMNONKF'Ŀ|wrmid`\XVTROPNMLLJJIJJHIJKLMMKF@(~yupkhb^[VTQQOMMLKJKIHHIHIJKKJKLMLIE2!zvqlhc`ZVSRQONLKJIGGHHGHIIHHIJKJFA&ÿ|wrnjea]XUQOOMLKJIIHHGHFFGGHHGHHIHHIJIIJGD5 #¾}xsojfb^YVROOLLJJIHGFGHIHIJIJID@ (弹~zuplgc`\XTPNMKJIHHGFFEDEFGFGHGHFA5 +~zvqlhc`\XTQOMKKIHGFEFFDEEDEEFGHGB>t+ӯ{vrnifb]YUROKJIHHFFEDCDCDDCCDDEDEFC?0媦|wrnkfc^ZWSPLJJG FEDDCCBCCBCBCDCDEFGD@;P#}xtolgc`\XTQMKHGFFEDCCBCBBABCDEEDED@="! œ|xspkhc_\YVROLHFDEDCCBAA@A@ABCBCDCDCA=6! ӗ}xtqmhda]YUROLIGFECBA@A@@A@A@ABCBCDCB>;"Mᒎ|xupliea]ZWTQMJGDCCBBA@@?@@?@A@AB@=<#!o 镋}yurnifa_[WTPMKHFBB@A@?@?>??>>??>?@A@@A@=92A{螇{xtqljfc`\WVQMLGFBBA@?@?>?@A@>;7"楃|xtqmjfc_\XUROMHFB@?>==>=>==>?>?=:8 D@|~zwsqnjfc_]YVSOMIGDB??==<=<;<;<=>?>??=97FNzzwtpmifc`]YVSPNJHDB@>==<=<<;;<;<:;<=<=><:7&:\yߩvtqnifc`]ZWTPNKIEC@=<=<;:;<;< =<<==<;86-<]v|ܢrpmjgc`\ZXUQNKJFDA><;:;::9:99::9:;<<;<<:85,6]s{ٚpnigda]ZWTQOLIFDA?=;:9889:;::;:75.=Ypv}֐lieca^[XUQOLJHEC@=;99:89988989:9:9:;964+2Rlsyigc`][WURPMJHECA><989978778989:9744*2Fjpv}ofda^ZXUROMKHFCA?=:87667667767898632#04elsy|ʾec`^\YVSPMKIFDB?<;96765567874326`hou{~ťc`^[XVSQOLJFEB@=<:7656656656786210 4Rdjqv{‹a_[YVTROLJGEB@?<9765454554565301+,6`gnsx|k^[YVTROLKHECA?=:87545432/0,Ucinvz}^[YWSRPMKGFCB@<;975323434542//,*2]dipvz~]ZWTSPNKIGEBA>;9764232343431//.+Haekrw|dYWUSQNKIHFBA><:8653221212332233421.%&N`gnsy~ZXUSQOLKHEDA?<<975320123220.--''ObhmuzgXTTQPNKIECB?><986521010010/.,+,'/HaimszXVTROMKIGDB@?=;97521//1//1100/.-+,+" "Ygms{_XTRPMLJHFDB@><976420../.-+*++'/]kqzfQPONMKJGFDCA>;:86320.-,**)**'G'4CGGEEDC@?><:86420.,*)()()' +8>?=<:77531/..,*'&         ͮ        ى Ӊ½ Љž€ ¼» Ă ¸ Āƴ ǁ Ǹ  ȃȿܕȄƲƀ  ˵ ڒJ͹ه qȃЇ͂ېb ɱŁ γȃ׏ āрǃ֎  Ӂ ̴  ςˮ݂ܾx Ӳ Ǽ ָ ҽ˂ðۅĀ z ̯օɂ ɻ  րհӼ ܀۷ŀ߿N݀ ʸMς̮ պد فݵցʷŀᾰ΀׹h˯ b ׮ڃ̴zರ¿ٹ} ߀侱 忳 ́ɳ倾ʹֳ߀ ٷ᷷ؾ 濹ҀͲ  ̻̀ڸ Ҁ²ˀ"β   ݺ Ǿ ؀ ~?| z€ wƀǀAsJ m  }d a-¿|@(y+ s }j z]7 w }pܢ ze w?{o۟ wdg |t/ wk¿ {sR¿ }vm ~zsX }tm ~}xqY  }~}{sk~~}}|vnR~~}|}||xof ~~|}|yrk9~~}|{|z{ytl^¾~~}}|{{zzung~}}||{{zzyvoh=~~}}||{zyywqjW~}}|{yxxwqja. ~~}||{zywrjex}||{zxyxxwvrkg6}|{{zyxxwwvslfC5ÿ{|{zyxxvvwslhP¿~{zyxwwvvurkfT {zyyxwvvurjfU yyxwwuusojeR yywxwvusngdO |xwvutsqngdDq¿ wvuvutqkec4/ xvvutsoid_-ÿzutssqmfcT{ÿ ~utsrohca9  tsrpkeaXosqoleb`4)rolgbbJÿ ~olgcaP &¾viebaQ/¿jdb_H+EocaV!%\tbW- ~iK6s~ua,ӀՀ׀ԀԁԀӀՁ π΀Ѐ ́̆͂΀ ˀ̀̅̀̀ ʀ˄̆״ˀʀʀˀ̈΀ ӾʀɁʁ́ˀ̂̃̀ѫʄɅʆ̀ˁ΀ԴɂȀɁʇˀˁɮȃɂʆˁӱҶ DŽɀȁɀʁʃˀˀ̀ ҳǀƃdžȂˀʂѲҀϰŁƀLjɇ̀Ѹћ ŁƅdžȀɃˀ̀ȵҁҮrgŁāŅƄDŽɀѵҁжqrqfǂĀŊƀǀȁɂˁ΀рtrqeĂÁĀŅƃǁȁʀϸztqrpeņÂŁƃǁ ̀ ΆvttqfÆŃƃǂȁ$ɺ΋xvvssrqssrhƒÆĂ ǀȁ̀ κς {ywvtssrsuuviĀĂłƂǀˀÿ͞}}{xwwuw{{ϞƒÁāńƁǀˁ ΀}{zzxyxyz{}ҝÄĂŁƀǀʀ̯} {{z{}}ӜƒÀƁŀǀ+̶~}~~՚ÂāȀ(̿՘Äā€Ő ½ƒÄǕý‚Áƀ̀ʛĿ…ƀ)ÿɢƒĀǀʪ  `½†Àɀ|ÿ€!ʵ ¼Á*ɹ¾ŀ&€Ʀ  ȀȪ ̍Ł Ȁɬ̌ā πˀ ؁āƀ"ʷ ξÁŀɁ Êŀˀ ĦÀĸ Ʒ Á'ɼƹfځ ǽh ŀˀȾ ɁЀǀ ˀʀƿ ƀˁ ƀ ς:Ƃ ހցŁ!Ҁہǀŀ¹ЀŀĀ€݂ƀĂ+ŀÁ»'ŀÂÁŀÅ/ż&#&Ɓƒ8ĀÀ@#$ŀ€ #  €   &   $  #XX    $$WWAAtt~  ¿tuSڼS׼  XXںOOedy۸y~¿  ½ y ýz i ýi P ýP " ¼! ¸ Y ǿZ û SǿS y¸{ ú  w ·x 7 Ʒ8KʰK|ή@ŶEih32^ qxz{}|{xupy~f~ytrqpqpprrwՖ~wuttrq pqpt{w|zzywwuussqqrv~Ҁ}{zwusrrt{ͤ~|ywuuyᤓ~zyy򩕕#}bӀ țrlS%ȼݝonnYջmjk\H8RѷÿjihZPNC伳þggf]ZUQK:뾻؝Ïefigb]YTX^쥱ʼncdppkfa]bheSŐƅei{ytojeef[ɲht}yocdde\yܺ~l}iaabbcbd_7‘łtt^^__`ab^Lܑ Ċe\]^__`^P Ǘw_][\]^^_\PѲha^[YXZZ[\]]ZPıofa\ZX YZZ[[\\YNߎ̪pd_YXVXYYZWL͍ɪzmb[XUTTU VVWWXUHյvj_YVTRS TUVVWWR@\re\WTQPPQRRSSTP)۸ym`YUQNOPQRRPL𾰡tg[VRPMNNOOPQQNEǵzl`VRNLKKLLMNK9ʸseZROLJIIJKLJFǸuk_TMKJGGFGHHIIJIF> 귬ymaWNJHFEDEEFFGHHEB𶞓{peZQHFECBBCEA8%|sg]SJEBB@A@@ABBCD@<%Fʆ|rh_UME@?>>=>??@AA>:!#a|ri`XPG@><;<;<<==>=:.eriaYPIB<99:99:;:82]{ؽiaYRKE>8976/Qp~ϣbZULE@:65566753*3gvĂ[UNHB;6443445420Vky^WPJC>832233100+^qWQKF@;61/0.-.* UqzRMJC?95/*++*$ )5974.)"    ʎ  |± Ʒˆ ׄHʴr ж ˃ Կ˩+~ͳۺֲĵ ݹҶ6RžỰUx/ӹɯv*״}F㾭{ͭ}¯){ w€;sdb!~Bͽz ܿ r ǿ z] ľ }u Ŀ~we1ƿ}zr ƿ~}zs^ }{sl~}{zsk:ǿ|zxrlS ǿyxrjZ ƼywoiWútneOrojb4żjeV)wdYݿ~eM 9qrZ' ЀӀҀ̂̚ѪʁˁҵȀʁ űǂȀʀ ҵҟȀŁǁоѻsbÁŁκvureÀƁxvxwĿÀˌ~}׵ÿ͙܆ý€Żʣ ^ ʭ~˿ɶ߃"ɾʂƭѳ̀ͺʻkǽtļüD¼Á\(%W [   ~ ¿ ¾  ſ þQſTxٓµzŷȹzɹ{QƶQ濰Դӯ @óAil32 c}w`m|y}xiuzpoprxRwzph mnoo{m@uvie kkllrWqsgbc wijjlfqe^_a fghhPnf\]^wheef|iNbh[Y[[abcrkj^3e^VXXY݁^__jfhic2VcUTTVj o\]_|e gdUZ]QRST Y[[qb cdcPYVOOPQ؀\WW~g__`aabJ$XOMMN\STn`\\]]_V9-(WJJKLWPQ_YXXYZZI42/)QGGHIgMSwTTUVWO?8631+MDEEQJLhPQRSPG?<:751,HCHMH\MNOPLFC@>;963,BA@AEkPJJKMLJGEB?=:83+8A=EAW}G-KPPNKIFDA><94*?;[GlBCEQWTROMJHEC@>@A5:?Y?@LZZWURPMKHFEGJF@9=vF;EY_\ZXUSQMHFEFGDA!^v]|98Sca_]ZXRIC?@AB>7Hg4Ededb`TH?:;<<=>=8Q6`jheUG:667899::<;87 JikVE622344556788753:.-//001223345431-(*+,-./0/.-- $))**+**+'  s[ ЂtvߗLʗM~܂ǂ땐~ ؐ| }‡yz{{}wxx}|׀vvuv{{芀Ͼptstwԁ}}͸asqstz-Ț omwvvÚz"djtquֿzvj3im|mԺ{wxyup7dxnvԵuqrrstrm]hбoklmmnoibܐάkfghijkklgaȦdbc ddefghhea[ gZ[]__``aacdb_\R'PUWY\]]^^]\YXU) GPSTSSUTRJ ˭ȳÌβUƬg^X7vſx[Z\S,ðʋ][ZXYM ¿ ȟ`^\ZZYWEưdb`^\ZYUþjeca_][`ʺjdwhfdb`^pikigeca®nljhfcĤKqpmkigƼtspoll{vsrouՀzvus|zyt}|yք.Շ絘/ ᷤ J ܵMԂ ֱ ӱάɨv:{~;lz|mis32тh evxz ey}mp[somirdk^d{`Qf]\]p~heRR^SnctabW=NVLWiZ\L/*HMIR\TPD923AHzvNMNGB=4/8A^sDNUPKE?<;8o]BZ[VQJGCA`xUSf`QE>?=<: vZWZD6577657D.++,./3+**+-/ Ƃ ΍y|z}yȉu~|ߐ̑mỹɇbr{͢sfѭrlhӍ̨polhb eegfd``oVWWZYY[VSSTUX ĴU ˮ]DiŴɐ_\SC¾äd`]ojfb~umhŮto𣠮zԀ 񡎣!ʬǪ ~俣 ~~t8mk@>bнb>:ss:ddde68RRRR@@ll !\\00GGRS[[STJJ..]]!"nn??TTRR::jjih >?yyDDjm pqLL"" JK ut -- ww %% NN ddgg  UU88  =>ss  %%99 II  bb jkqqjkbbNN;;)) !tu!  AA %%  ==  "\\" $lm$ &ll&#UU# "2||2"  #9{{9#   #*W漈W*#   !#%4\{Ȳ{\4%#!   !##$%%&&&&%%$##!     h8mk 5[myym[58͉8bbRR;;PPQQ;;TTef77;;cbttvvff@@ @@ oo aa (( KK dd``NO-- ee ss OҙO (Ko~~oK(  l8mkNȓN[[\\ SS Z[ "" hi ll(( bϡb   s8mkZzz[//^^{{^]00[zz[DisplayCAL-3.5.0.0/DisplayCAL/theme/icons/DisplayCAL.ico0000644000076500000000000046127213230230667022277 0ustar devwheel00000000000000 v (*@@ (BR00 %z  "D T hR^PNG  IHDR\rf{IDATx} GuSsߖeY @̕ l! ͒Mb &mBI 0m|ɶ,_l]5hfkzUglKGuuuuw+6=o7v0nۉf6=Y0nmnxe`D|aQdDXY\f.84nMig&9Saq|$͸/=pݞq㒋{}v{z,xlꞁ(bk(:;`]$Ak$zz8Ib/0@zt&ˊš:_CEz?t9/mgDYvof/yg,xn~A{)9q \-8BBRY yILIt4_+b2 I/*gs-b)E'9@7m [\vNtn6< ?_HGQ$ ;1 jRBruI{E܊f$X.7(;_DQ:"AXF L_~ʈWn)M}-o l~]q9^PQA ڎ4sh'&vg<ZJy;ԍ$K;nx_LcOb%02"`)H( $ıdJH1(;,Yvu}zme+- 0F l 8n]r9~o$o o o+h)=^*H!傡(E?D,8(@![ y%D #eSH,@*j_0 `fivP|/HHW>lgʐ'~Ƶy{NZ4biߊrs+ j h".`m8j!dV f̼"r*>e+%& FMЛ9yO+tۉm` /4 qm0D3bUPzzϘ5@(PP)h;AY "J%!Jمf'zl<׶Y$K~gR^*G[ӤoR%~/sKm_sr%izF-IS0@"]5#A ,DtUS!$I]Ol4+%%T@2c!8TP{{lhb=(3*Ɖ+ϕm`˯Y!D2IM!핎/z q9˛YLo|Z 7F_9%Xw o!er0h # akFGW(@TVR0=K;qa ] %$/:AC92.ۇT.GZ.&*I _jB䆰X]sD=MsD;f(3k- )vFC7}D(eP̹1!$,Sf1(u@W zX yg;D799cٺ2CWrAO_fbci dZ (A .0+V3S7c:tlB")⊀(*Q@ލpc L?7#CF׈D~Kؠq֣pwy!1B#]|q6cW޵R?#KeN) {ݣwAqũ h'`8-ngrC\mk,d,@ ")]wU O D}0I} 5Dཱྀا67Du 9IџFwb.ɛc,sZf^t׉cϦm~J!_ki${M'- ʛrz߂FZ5e EO/X5UhT"0=v qoQ%~ peD Sß1/y+4tPK1 "0:v9$?a^<f|k?)U+wJihhTc+&&L7&gGgy tt;WbIgE7pwz A3.mMB { 3TjAҾ]}y>;Whh _n3Wg} QJ_eOōSJ"\#)"- ~mE3}δkOk=JM7ӄw?uߞd ^>pzmރ/E ^o`d?vssd{^2^ޞJOY/MRՆF[J̺4Ԉ bi;=qߜz㣳0#4cWC1"րmyTa֔ YM0?2S>7ZNKNxL_$0I'u`Vr 1";I4Lugp=pFW6t Fb?E%f Ux!`.6' ȵp{R='?Tk%x/}q~Ϻy>ۥq R)|OtuH((^ {^`xP>sZz z=ZB@'6A_gC /E d-xqAx阀)Pu@b5Z Yz~/ Lj ~M-Gү'E~8ok{N3MhTўU ًߎK$ e7ꍵ}ONKrh>gw-;;(.C^ZhZ{*,+Y:hsȔcضi ̯}ssk%b(%l*\0:e^C׎vXIb?exM2.Hݵ4ybãy>OWo{Mo$k If ';< !7PFN>qՁCX]诠0 v34Z8՗a`0 a` }\2IZþZ'_B& PZ~A —@Ar?Lm~8qDbwǸ=QO7nO9.}q <F{1f{%51J\ʓ 3P!X!A42'I>|ß !H@ P@ L| &* |61=oa1:$L ({@"U䯜ϡT@>3g~`}m/]M!ozX2](wSw=#kH|4':7ȝqWg1f 6eOg8l`s}Hfx7OD`  ؓN+GB՛p2Y" qO,&<o 2XUK 7BR| jリ}9s|+TWo A5K+KSN[-C4gI%gأ&s-&uNnH$UfԁC>7mrb}Z=CQRjCg100c_.u~RꗱhٕIzLpwҸ!>?ϴP"TqGPꩩ7M Nj}9s| //Y7JoJc_Yrs/(11W~7,n (|Q1T~06"1[c] XC>:UqǼ`=˅aL-R}xQA?n-ܯ}4H+"(3g\|fX]]GG^wA oY/xzw-i3#ЍE04tܬ3a3|N$@TK%GTn0ufe -40:cfWw,oqf,^0.PGiD~1WGp*bjO%anنkhuSs`2}TOޯՄI8z-ظNīhh?s\7[f jG&$ǮX.bzᵫ1W3ȁ p>=рE.2Pх@bh0߷sKH|!p0a!.Gdc6FA87TG@&P3J;ƐIX}-0dp<_kO+qޞs s_ ?T/`֙%"g rmnC ()#[Aonp0żտ ^S$ԌvfQ E0&Xڨ:yzGcx#3Mܜ mxaF!'3`z R%>tiFWzhX5`atCf5':CT2 (959>v 6/Ubo_y;d@$[@^`FID|F#DB}Èz(spSxmx (8" Zajh y 0S-'h_L>(fN/cO0Cojz A=?{d$?hw N$p̷ ޞʿY_цv+%Y0ff4Sq1S(p`e^U A~ G#! dMd },5ixoƐ Ħ8>d_D_15eBATC{\_krOT<%}o{D>n k"CH~_hpWVL&^o8tpܗnV"a#~jӨ8 rթbD5%6FxP?S ] B]x.{r۔/'xH{)2ACHurCF$ 5jZ'b^_ 4(H:=K1p|KY 0u@{i6~ԕ>EUZ{~ۏMY>~z P? R:5b#(N>tiIo8Y> uAP=s!ȵ-xL"F:ny7ZUf#׶" >qu"p>4HAE`|$ۇYsll1E% [&<Ėh=;W4YAW{M? Nea0;0՚|;m>~g5 IQo>41HpQ~c}9T !Q;(WLW dHC@:#"G\Ay5yz~h{ gQm4&~گ!?SLA^_1EGa97B&`vM$v׏[}|*tpg%ݿ` \NtV|'魝(!FlHQA. 'TP"pa-4qNlYi/uhT ̉.cC'k7SyI g m?%eə1܂@cQ{`؋~W6qY)[w5vh+?e+0 B6@ukUm }+|ǿ?M3o]%:"GU2ԥ>GwykA t#iț?ʹfƳ.(H15hz2JgSm/2}..2\s QQq#Y#-CP0kV W<:~HTs̔THj +x=7\?&=YB*LO;U$3/F"t4F [zgƫI12˃*`!gāSDar`ČE `{运Ĵd(G~#3  \AЄW-mC5Jy&`?;7ຩЊb cG%nc]s`-m}7n=cKfEXhSuUzFo`Y5 nxMoV3?l.0׈G^xP:zw^w= z%f f9סNv65@_ ]e@F1]g992TkFt~0/876'`a H.v8>\O@Ei&%@G5g=h'JwCMN9&j}7A#]iN[ҫ}VdzV0/u ޚFibf ?M?|/wL5rsB `<8\rCJ'ꀽʬIΝ'|6a(2B*ո a tQnr bF~s#c$Գ9̍qR6Yz K%%~̌L\3:N[UK<ȏ}Q$C?O~"U'@q9eGɩ /< ?ymyo#p}ֲQ~(1]qG&X~]?Z3V1j:}WF7 dpo2WOܑ&vzoy`/^xJ|wnԔ&ދ>&̅nGszo,37Ic/;׾|ӗJQkM!}`/5D )h?Gp2RƳPTХgSpIx̀GTGwsŁ0p \su>r/m+a Nj3sq5=aQ ]a=Jl\?1I)Ҟ0/U{s7CTn3e9WosG.C–GiS."~Wg#gt; }7Z.]. _4u>uǀ爕N#,z|+1"l jhIwӔAҢ>r ií9.~0׿NiFۀa-T 1 !^?B8=fq@MwT=P2tY`3m{w.v]GxWdW̬Qj*ާj^r8AL1-ie,eHG}ZW\ܞK'DCr+4ԦÒRQcx@ mJvae5h1Bdbs@̭?=)9uX=L];037`?{l>&ON `&՗ & [hܒyhS{ΨD!ӡxtw&⤂'a ӊщ<5Jzz aenPE8,D:}d$bH0C M]q\Q _`߈[Ջfcb4w`tt*Q}, 9l+YH+7$ D+ }H<HFsx=aA7.d gs&}BN DKNGOU\JB"0D ƪz${c;~scCa3N`W^vG8~$v3Qz?z=i *Ewe@u_ 3D7 E=(룼'3Q]xGx .Gԁ[q_ׇb9F1Dƨ!s7?A* K0Or[q}iBcOo?aP$LESx,,OIC2$~;(cfP@F;_q)= ]tV;n/z?w7 @lՑ!^$v Pbُ`!gqF0?x{*{|D2pj xϏhFŌ$FYmCQ茙 ` U ذ* '~/?I ~pVyt o> @G=KV>Ņz?5L?V w{LSenJ0G·W04ҽ^qkϻA&2;R~g2 LՕDBGՅ \b2dF ;ZG]\n#kN>v<%G^: khSC!\|3("z ߁a.#IY#JU9TO~)3(b` *ɟdx2WW,z V8dJY(J*:r&GA>nA#gic2^T槊w b @ /yd뷼B$`WtE ?9c E&(o WI*lkd12t4D:q`8RVzn A11 04rQiE# |QCM?qՊ ۰j4rTUDfrq|<ԆG!A#:s[DӰi7_~_?s %=[v9[>L6  !hjH:n`_VRK<"'_cXNF+Y*@~+;⚴4 .\9qM'vnȩA~pP>R2+pg"nX`C@^dm|8oڂ VE|!m;&cbQkfE#AXaAc΂!O[Н#p#g "=i kd-طd4{T)}$|mxF;׾,FV%lK8؂k< QmWur ' WHo15oBOfYd`Ǵ i9z1fWEhרX'f$S tXy-.>AQk 96muKy3)BV O]>v(_Lz:+77aS,]aSs,v}xlC28ԏ3[)?֖_L8yDT^ )G\sEEU Fq8)atPvq"W@!ܘ !*0h\fXNU 3⌌GlMPEc)>c_c o`/ ?dHmAXOlF= R) f,zaPi=tGaP@$D߾c'I'.Ό$/sŕ}Լ`'ϢE(ZpmwH Rr "}%A9I$?WT̼h axE`U_iӘ@2x*h7MSn9І]A-L^2pgbPJ gf :|oҟIȗ(ևCeVEDVVe!H%ph(4cHCG'i'yًwqdǝ\=jM=7Z3bG?0,C ?tEn(q 9., Іu=&v8WH}A1A)}`&2X /QkjM t_bE [">&Б6S4u4F@ a9;FP|b?*pϖUwbdQw+'ćTD4*)^rw#JFƶZ+W9UKK khK|pSJ tBtPi[ď-2BtyCfׅz-&ϖ+Qee%8#+C%xs1sҟ{]0Hw4T%JQ?%'i1Rn.Й^.yrBu]t{?7C㟓`'G_ҮBMJk+ U6ʢ Lͩ%˜1 /81^eגs۩] ౪h VIW@*|@#3e%Zr_.F,b?CHq5CC)s'`L($AXɏ7fxKO`?nLceMB0%K>32OR8d!ϯ3;7sh4{WDk>8wQfxG14jZ*f]ȄA'H[@ݺ}~EcGJmNjo^^ĞB8w) -9@B%}Ij">wc03ނϫ1q,U c 3?I>3cFnO1NM +4rg؋#8}ߛGӬ>tIdէӇ,"" L`rrn5!G;5K[GC +BƜO;gvjSoԑ+Hc]Uyoa)_#~\H;>x[rR[=H2zT=[P)7RZ7:2z=&ANU%yhd.o031vf:h <'q/?2[ bܼ?}'|߃۵w٢}pڽ# <l]|Lza :LAԲQmCu@p Vs}K-8L0k>V*ș~ĦE@ȹTs<" ^мqFXH3a!d^* E;m(qc t}ę| |2ڄ#Ua~KH17/v`ϯB![@H=:w ?f>ڋ>y#cn^QW۾'M䁠?|H_w"xb\ѕ\~k2u1tC М `]X!v xY_Oo tz%1t:qHťϏΣȬ h3kR7Po ^|Z/p^8z^UYRKs]} S~  v[V;wuGX72رk!roecsLSF`QS&tbhgeF>;ՁXϚ'r)[.~C&p@tgzO%8/A5@FвDcnY ' >L}o 7~8^: !EҞ^v:3|?jSS(spPb쿿w*o M[JAVg"! 2'm Zܩ )yY@ 2JGAPi"rT^R%O6";w`.U B?j2Y+2X6b* hhm׎42n&+لK2g{FOa<8ٓZCj8*M._ȀI2}0Br88]/y0S&Ƿ_wn{GX1O̓=ߐ3cG/zbfڌ܁3$\R(ђ cXGZԈ.DGl 1Ă}\ 8h0I6}(`T'n jL=n.cFh$oIy`q4oM5']M*p+H{o0g&}:$#9G<3rx0Bj[o?Y.ɤ4_S_E 7봇גJmv>P3S܎ ѡ?LԟVįGd9̂9"ƟCHY@a\йBBDKUBUC1^\*E`=^a E_J<\6xte JV蕮=eծe1a_#$||c=87=ZP>P?~|ahގ] @A}*S0}Tk^z^|#`gR9ϕ*MԨu-J9i֭%,ҭ%/PwADȈB{7BG 0Gi4*YN9_ %~+Ua%2ױR, B*@0d 7vvKum&wqX{A[e;: YKZտgn߾HGY3O#3f"`%`˗񌈗:A=@ci9K%-hL֯ʅ& x .?1hgդ1CI@/i &N*;Hh!r?'$PPYlV1 :8&1Vq|d vLOUZh<}uKV ~S<Ď1$s`4Oyˎ{bBz$?OL+#^0lނ7/d( .L@ o ʼshJOچl{dkGxReѵWY3QSf8;%0rS!`w $#\CݡT/Y^+'o# @ 9\d4eAo^=&@ʥbX*&؇9~9y7P@StIf  箇GxL/3\9f;1eNʅ&W_w:Q'JIl/*r9%6NO0> luF*#yK㥏\'3Mtc<UBui:<ގ߹6*^j.c.πl>k)+0mݸ [u@}{xY TrO}>й~$_v tvZ[΅GQ\Xvqr UqX_MgvA߄fX3>_1/O[6 .IoODyCs5 fBy$95dVu@#$ԓtLr<^{ %ϔي7h b, `3n-Bfe&PS}[oN.foh;$ nހv[[+F5fjڳ`ޢ:8 u|ȿ^}sa"鳭U'2]Rdv<2TSYRԃNhb;nC frhN(qyP?+?QUTh`L`z..t!lޙ 16xPCՋk(*iԀ#.^s 3ޞ Pƿ}߿^JA)Ӫp6ڍCWI 't`T~G!SCՁNbhVbFTTWMމѲ 62d͵Οc[aL`lާцcMLaʣIä,vcGŻc39mHF:2taZ@lj ǞR#e3D'Jп`҆&4ko~]Ș'm |* z[3.5B_fgPHNg8Vt J(GF=/yzݪAۨ [Q#m)Raq=smTؘ # IH-F!-pSxk9鯷0nC;;FTNvpO%Wz}ͦ!lly]{ FzJ{|g$@c%)$ͩ-?β[$O?_4ouc(%ijva OvP5=}.7d,МޤLs9Bu1yPDnUMƇ0Ez/?k ϯ`st { uUIg|9X&Nx@O la1{?8LEco:qz@}C V?1,釾y $7 ˱ޙ0չn!zk՗ޤn1;?X*Ъտw-$Հ'^yoYfsV6Z&"9",d@$iؼNzx.ΙHguFUB]`0~NJ3wwx}Hpk8tA3Uy`A_nؓ. x &'aL5aN,۠>g LQ@+`~<*22J%>V-j@o7cDԑ& )!vty CXj>pX;F7ހV~?fd@>tի σVJH@tNkPD/lu'^'HhCmQ^̵-}!-'^'6cRsz[ϣxs8eC ӿH#-s!sU :DD>?V w)K S+J 2^L OYBHxeLtQBBaKT\"JE'吴jpdkߟ$Ԁ''ٕ[PYrvNQ@bVPƫp<%GEY܃E  V{B^ 'CQ>3e~=7ل*$^`I9ȈBwþև=*w*j08{^яT ?GeR*$Íxa -Zܙ` zL@$=ٔ_Ԫ͝]_@tBŨI[<+OB x2 @-K'SX$R_ ځ !o; v _G %|Zw//^T-ϣV!C *A˂vד 5aŪ N;o0ag +I8Re_yᔍ $ἎCBg~p?SIIKv9_?0fy_ay7g|."iBPB=#X>N"h e(%gj6RK`ja,h͙o$N^ȹмE=J3)TB!l+qaYAU#"O7/htNQ2zaĕ}&/ʹgE=D3Ü;'a!0 v~vO+׵`֣ h:/3s?:L?+؏ E/}s,J%B@L e殣%y]!W;+ R20K1Bx,&+3Tfᇿ }T/sWbz( X Ov\4\לzHt<طYa" m_km!`_3W.: KOj[BRG+ nFܥK960W` #נ}/$7}>Gh}#L Q\ypj}x%P x2 'r7vYGV !:tfыyKqư"Y5S_E%}O~\z7dx.|Ac+xԠ)_B#[zmۋw[ឝZ=.Az@+Fa,@1v@p?HW @@KPl+%z{ z 0E@_g!QC[_{h51'b9O"1y ՋLDB)()[/ h\h;z E'aH>͸B?+(#wryᯈ9so"fP>mX!G3bڮSAPw?C2RL[I\rw5yB&01+3Cr뎣qYHf zFp R>q 'NI (T8{pg0g W-qQ}$yG&0"0zjۄԟ  >TQz+ơk(lVQHg#J1Gihֳn[A`& @;Y6 D]̣@!8V SE$4,}D:u;>b{^:=F,QP;z/g0;L*qJO3olR8#Γj<(:h;b !-tt3lB>3$ls/XD= drn: \l:gMi;X s:DqobgIV&\~m_ԷEsc%LnmCCga0RD9>CuǷ ?N%2Jva',U rDa0"ʠ'64j^GM0;LT~(VF(_l,C`Xkc^NvUbzscP.K7MLJ3۷ =J~?Ԫ4/X◟'a|ʅb_)XMFWe KjГr`lVU6IZF/xh\7?"Rw۵&LA& M1SOz#,džEDC> h, Qva-XcJc=?w>eAw5|JێS 님 ~BHaW`5C!m@Xo%7z-68ěFT Qsعk ϔ}[ - xZ-ع/;* [!P r0_T\% ׌9Coq-fg)>})QRlol Ao[Wƈ ##kGf(gIf?p㵋ύ4v0#ŗp*"aIpe>"z c@ .L!<4s(2*o&`QEuy@0w~7{7V`xd'" M[Ԝ`x"V`Ciލ tA>jGds&>Uowk De:lcTxYM 6(HRӶLH 8'~z0PTyw!vzQ@Mxh@oP26 +FcB=^=HE]Z`HF$\6;'H!}513TRsCIo>PY/7>w柪q>P=~Q.$%(g *p"IO h`>8IʈD7_ Mi{a?R;&M>kOGʩ@&^w0`& U'LHsq#CX>̀TO9 d:7)3el}_~Zz `;(? [_e %/ʏzlw 辔PAV,=e>z d&1|NV=Tw dGw_X܃-5DBXzsɟ+7&~p/4n Uo->v 3pdaV$FaՔ ,|'uSrugqBxˁg϶00Qߣzv3ekbK^ F }CO6mx&Iay1De:<([ pf#Hqeܭ`<8ZB=O]΁9'cv7ukGcdQLK"s=2Sw*m6|oV^J7+4MjL=v p PqHP>CBQ*($KR,磀HyK{J+D>%"e FWFTeM9j"Swk-BIaA14% S քpgU%0(M5 #Bx=F0و{WptQ:y0~:#YBzmX$.TꦜF Hz= 6+c¡A2#G~]%?G)x W;ae`O໫'r Dr7 tf_TTsBx=@$MϘBXCUo ?p(i,AA?꒶[& 'ڼ(r.frZ=2|1##JO xd^C?Yo^fKIPG(33 8 6N{U7 `(ПvhQQIMbbf)Oh`#0ttc~k.>)5RR>U QtHd ě3"$\&X{]] p԰I_ ʲL@SZ:~?2`B-szaʻt;(3e-e}# ^R~п9ܯ p~سmxr36@\vJfٙ|f#f*\2ёa>q%FkJ\?VFIrdi\w>AO `_^Llka n枊H]R᳻IijҚ R6p(:kSe(!d.s-Y)ˆ" 2kOԡoWQqâMsN vޓUcs-%UH!->tvG` 3W uwl#yʍԆ@ 0oh %tPpdswFF%jn@C,U `roˇЍȡQȕ?20x;ZS")JS4[!#6 )cy|'ܫ7 t @d) ؉R@TN{0ebG͜hmA呦ݩ *f@XA#"{=#+۹)/   YJtSfeԚĎLʈ@42oі}k!ܷ=!\E \? K a7[)qfjcOz_B6(7b}$hbXAvtJ*@mz-Y]4W83B{ Z~ P&6Sok{gQy^(b@?8儬l(QݧA2;Fе6;FH C3P6 =A@.Oi%O[>ݶ%(]'bxQsχYch}cwa,LAIԤ"}S;F9~P`kḦeClyH\K>Af[ Ӱ B[P5ř-O?^[H0jÁ|x+x8B}9T rBpaP'S6@Ϡ#RγGq @e2PnmO cc15?#bhsɞo8lO3^s? y`xdj"`2h &F.pGE J" \yf,#0 [q"0, Q@6 /OvpwO^#UvS cƥ|_T,-tEð5S`xsB ,P"q?J<v>EPgW2~ =;Z/E|'s8rN i}D9Uc3 .D!8,\3o$C]_}67ӐM =!L 2l;} }9$%4Rչ7oI`Hg?cIl1``d2 JFL2D@(KͻwݛfW:UNWϝPtNS.G~c,he1ľ/F~( Q.@ߤs8BDK_*"gF0b2[̺(4A> Q1!#] =磀a 7OYD]ÛFdY<fat}޴ ՌDZ(?!B~Ԍ_{_,Ou'Rbtyu,\ {sϰ:|p;s?,IxI|s:9x4-?xׇ0οL`)ϫ@kiϞV$sVٿ^v'0 MFQ 2|?@9hPBrS4#h !lKtjȞ(jnQwF7ޭٖ@on)*'ɠ{̃*Hhw07Î SB;֒V_,t5ܼ>⅊S_X^[̡wŁ78T!>:${*v|N2? z C/NBpWe<֏- D+\ (H9Hi/gtU ZwM)@ޤ;{f%]ʏVc,iN$@55@H橉8q۟K4{t,Y{ߩ+PP}טz&Ն9]sjÊU(g׆x>&v9쾮j}!w[Np-dڌۧ q޺{@GIkwܮu1i :Nc[&h6N坄j}M.~4!,ݻ| c" Gҁ ^ B. ߥE&ĊQ%6:xڟSa„@r-OS}D2Xq0V5mcqhL`?lV/^advM:><D{-񵰷 ֘ـz:P\W8/x$\R6?ӳp-Kj[`ڒ)hyG?wɩYz sR9 b"VESra}pa% h)Gbq? ]^UO:B4_GI jαD 3E<e fƥ&'BE S2:BۥGIS/uڊn2``N80ّc>u2L fXՀ)g[/R)?m0 8S6?=NZ-i_$߫6sr",?_KoѦ(N!%RvR#|5)"){4|C&e`nEG*N5qjCTtP.-StRET/eSSR6@XpD>"`'"% NC(s{nLL~k^HHvi@cW Ԓ9TVl%e3$Sp@s˦sf 4BT6sxĀ463=9K*AAY>  ڛOq[M :܎JY@w4#t0 )jfEO{4I}ntFCͯ{2W)ž7'B@'^[a%lm^tb'Mٲ1L=缓Q/IoҏsWs=ZbƟ}ET .w`Ah3uE^D GBlD$@0\8"~3&4Iҳ㹕 ڞ (Xɀ& q߿:647v?򜄑qֶ`ԮvbRPT},7֗:'& 8P]Ew:TVϬ)`3:s sp>}0!Ȝ‎ZmǭSZ36wwq8:0_tXxz.~_GԼBn '|'_6&@[ W}C1MTaX ]!k]Nx! #סHC#&& @_P! =G\YՉOlS ;H?%4MfОT࿧>/]RfjS:{ \ ɱ0XٶU94KˊPڡjpo/8j8|⏔a>b|ĭQz ex.z|{RC/IGvx*D 4D& t9O:Fxq1>@RSb&"+DD9@4=( Kvd Qߞd3PӸgχ>)K ~eӪJVMiJXظcR SԶ;n6}/0hs?(`kn꨹{=˼w^1Bt}}d퓅mX(N _g1Ԩ!»X;i! >e =0zIG'οhXSVOFMN+y2OTkc%P~m$rtS5p8'Y!{V 6vآt Ꝇ~-CZ?胟Jdۭ:>`M$?r❭n{phqܚ2xJ,D4ty'qj&{"hK 0_-&wbl6Z:0D>S%=a@(v6MJ#t^'G#/Q) >(fǧsM27=QTcV.c\p'ν*?#?3zk1:;~y`dq̟W3gz1ed`ɨٶ)d@X߆ں1 *d=;ۆ E&jE}\9sK-/[&~s2X='Uz1 Γ9& Ü nbjl;I^>^,1I?}KŷSwa W3OSfA{YX^Gg*ĉ& 0L~Z f,D)JE^t E폿i DA A @~lju xǭh~?k({ClJtZlvقx.A3SJsl@$wQ\bMKXYsZ(27]خcpZ>z`gw&?bG/Fv 8G% %cF( 3{ D=vy˂\Z8Aܡh@|^Dg !\!2M>p! SJ8B;6‚]k6(z=R|οQ lJl*S;|7&cm|:oGZl. jH#6z~[iu{0s ;s[ۑPR"Sl _Z %m?yD2 %5HD8#N@P)?9赅g a @u :,pN{K^F?G2o4J lwOD$8s^rq~$JVaRaϥڽ,WQ;q}`1[WzcP_S|A.pn_ E6 #<4ՂCkFKD!{QmzvfqtAN5|?'Z 1K([v$ w#P Ν0P{Bp+HL Ac#> +C;qҙ @(jl:ΤkQ+!,ٲG[Rc(k`((9܇ Oius rm|, 6c _a2Fg5b7TSr/3Csioomjz;Т¼b$nvd܅Wt栀vg 0^ |f xAN:g92 ~=BgpashX?%ECC\fv ,^+(DpJ @_@ +&u&O_ ßAV-L*>q_Z jdzi#= CǓzRyea24KM+E;]M "&1f@H+z3yRdo`+m}1+cK`~[P6|U!X"qGGW).Cka{}X?5&^X TGWc% r<){C¶(d%AOmj h@ (ПxԠT6-Kjzsw S23G,Ol;[9LjP_u /i|^C eȎ7=90&@s PK|&@NGo[9?~닄^#$NU@< 9@! 3fq H`LZE}d20pUNsD ^CmO=}ǭ_:{׬#?ǁ(^O`|NZr}tj2|d=ढ'n 9t;nنu|)=U:'\12uS Q5 InIg*{5[53}0C@,z#s}r&}K- > Ua9ބ "T< }(yCsrlj@fzb,xo GSwuyvvŜ!GW /@sߛ ᷁Sw'ߥv` `M)~`PT::P'(lMއ=Ы/&Eo9.V݂?/'͢`@dDi>g`bXn;,/<8cy$}Xb~^d(4R`@!5=#pX LBGm4@Ж%?I{B'M]AȖԻ/y#z?x!g_E-Wg_d&svo pQӠ`)UOi6€qDM3PDFXjyYQ1(}E==.K`ӣԿ2fԠWF?YvNk FTg~8p#ϩ + [8'BMtX1MQB}YbD8O!z`sQ <2 T(XGh A >'(tDR r6zWЮkp45<yFd.3 CN (l{[m >0гxLă.=iz&n?E:5G =G}ڂ_wS:V T=􏥽 ] 2G0PbEנӭ}`6- D @,xʱgm%z[N+q4Pˑ(;;" $ˏzG/A½d)Qq׆-Y׀@2}7p|.zG*LYѹO}t" GV ? B09DS zJ EDl{Aq$k#H8quq72Ku=K 3j_j6<4ׇŃʬ8<u(? @!j2?m#.D5r^| 0fB% ܇ hɟ7ssy H@]_驿H3(x,1&= 1~"lQ#O}ż:>4ҽ߯W*g  9&ĞSP9q/& Pnhҁ^MG~{dĭXH_" ҋyBgՋLZځ*;Q!mbwj4{0j;Z߯=pē/!G?5 ؖw)A Hr ~ `~XOൺ;c!|DkxD|}n#A!X! 3p[/{ß<lZ4[~ⳣDGfġAO h n]?a4=&^o4 zzH\F~{df{L׫DSqjL8p:I_mEG ?cйo2;ޤRdzV0ޚ*PLj\v`jK:h=*B>1ΏT?6  ǘu&槦oֹ@O!s0pϔϙPӐ+ HGX,b/%4M0[Y_MDD^4g?wx5:rV;,"}1e??]VzdjTl" %eA6egz~@@`ZxROZ'Qڧʠ6ow`y#ui٥؞T3 L]gqm# 4[dۦ<p,N? pZDa"'0d Dfm>JC*-,Z;M/02`y2h~"!]bJG"%r$^d6~K]Ү.D;[۟BiG4;I}n~k`ʵ9QĚ_mS{-{U [O-qRFͷL|QCl+e΄CDy)tUk r^%}uSC/tդ owabQ1i h dh9>2Z+0L E{.mΔl5C=c' `f:`20ȇLw&!r &QP P:{͏?p!!fZ0_ys BЪa|}. .?S쵓isuqfw} m(8 Gvߕ K32uq׮XݱAuMpX3*d>,US9{VC{ ځƔ)4m#pP[!G^{Hd"0QݏMATIQܻ$f `p D4P8+ D=@C& ~y'c~(=%`|MT|pp& B]|2c~wf@9~716)-Q 2ʟGN|&Œ[0Ӡ֭\Ez⪊5}eIa v zZ]ELdVz pg0¨ĠzyHᩣ/2DH҅i4 6rJO^WI4v$43IfLc2^@I@e,yHM66^@5*BO@.V P?!@^v_q$TP{WGs[Pz@9PGjAppc$CA8&Cu,P~;B̈́gIѶt v5}~E{\Z^PaS{ ɬ?  Q /!$EM<3  hAXw(F7KR9GX A|` Dc氾(@0헿~MR< toɇ<Ƌڊ$Z_Z1A׉(e`J|e?`~-*a0FM rc;ǟpL>YBEl;҃TUQp 7;=[Pq+ ǔεJ[A`[tPfuڵzQ~Lp׮fJXb%fd_"G(Pނo@ ð"6̀%rGIfGQ}+ZdBˇRPgBĬw«qFރ #L(Lt?~X!|7z>׸' W"Ø}mfH %V҇43N>y[A $˯TOsh8O-}_y^0 88Ay¤;jRG.#/kaȶw OF80:Zv]qa]Fο C:XnCgyϿ/~ b ȗn;NlǛU!- dN=?Z`=Ekv#)ԎISݧ6)?"޾X}XA@ dUBw2Ku}M{mEj1$Qx;hӽ.5,jlZ3 @ q&B((A?$>=N IKh܏![hR!$3pߡ O" Ad|>dؗ eK}SO7wOXpm FM2&\ 4bq‚yN*U9PAw݇FtEWj|C6iʏ=W:'}?!|O%O)Xy|4l?L)Ʃ2{AXHw_OY%,@ g3"YЋ|~W=*>Emh+[])``% 9VA 6H3`G/\)s`$ޔKUi꒮T<҂k]2׏wY~9 8DXH%(pPK( D @cI(q ,c69S&[:@hk8:1H@p3ng z!\\nG7| C8y/[|J󱯍6g6թa+:W41 ;&/K+ݤ:azj@oR_wEuʲ2  zUPĦn%:nf&3 38徼 !y2^u{D0pFOP,4 ? aB'0>+?!{ O"ݒW-gfx?ZoG^WZw^igߢvmZ/`s5aYWZQ-B4< gԯu|kKO-7 @q``zO%hvB)3mȉ/b8` 0+ii$@+IB7l!<, 7 `48d<7Jo3)/%h|WW@/‚$}`\?'M:Mz>ON _A8_tW;Qtc{#eury)k+ː2N;ĩM?WZk?ij* 8  e@6`fO^ yV4ȕ>u9:e϶Hx.gMP{ c"x3!Ff0_8V{w2cc`; }d^(% $Eה wP,T릸lXAa>iH_v]J gvb_Fgà*l:J6`!d 6Oz1?fp/W*PGWI?ՖlLavLۗB2燔h{C}iYp 2G_ˢd4HiL%C/,0_Z݅l7vA_4k`x'Tۋ8/oX`?'qޯs 0`Kr!pJ2 㫶01|=ݟ^S/P bJڎO^ %A*fPS~oSW 8 13d;>b'@ tI9iˏՀl$?O|+ݵH)?i_ŧmP8o3W|&jAm~\^jEY_Pp0b>Jfh^wGn.dҀ**-aB#Nj_Ŏ>O=Qq0 }D(E,ct b8 $|{t ,U)й/`FaT6uhBQa)`mG迲[?w+ga?.rDܿ_ODɠZ; x0a s`d [e$vm6g1#5=s8&_f@+ e\ |fJ;(nLWVs|7l3X)1 !jc} Dp Olk4dLpӂ_y3 1_X]/G?1>?>:Tϵj)0N.ZЯV /15*%8[l[!ŸFVI? ݗcuoᴷ߃:'f"@"QiL`@}x><*%24M ~-P; T;XEd4wp` !j={o~UBLWi {N_ogJeBNTԿM-VG* o6.Kv)y1CJߗLb>0OFǤp )ê]9Pgx>OF`s Z]LMqAp_^Zgpٝ)?|\T#9k׍?j`/ 8%6$ 6`${ C_0k~l˟>e1j~DcÏ& O:xV>e v/BS.QPRRr~~?'5]OH$"b" /@pa/ICx<_¯U#Chf̀KG"-p4F 8AiѦ@p5b%v0,Џ6&).N7GyY$nO4xV{ G@>yFX@|fDHR~"|"܂8H !{ۙ%aA`B}wMyOI[A^ ~Փ~t[uU,C/94$h+"(>:Pe ?j&7G/hr{|_Еo@=O|!B^/U|>B b T@gs4Y3v _+;v@kB8I?Txd @4_R-~Vѵ:K_^G@pfYE>~{ny52 zy`d98h}lgf+cG$hEEVr~Hsˁ\Xn#N¨>`3A d$ N;m-!B ؓB"PEO|* "b!Ȃ@qÆS^08>Ա,yݷ>xiv̀'<=Ú43 -Jl5g>%$V0BcP^8*X,d=xw>5}̈́(dB> " M1RLO9}OAsPl= * J7CǙK﷕ou'_ GH}V 77IA™޷f@5C z]Ou @] e2kSxq [{՝CrON8_N(1'B}QzyF^|`y4TU}_Y` 5F^Ư/tWg+p2 + aJv61^D=7ij=@ti H"~KBBazA cpK":f;&@BYidEw) |\6f;d*҄?.?̑,2>#UEō}A0*6n#@,Á{YqZP:&{34_Fq' H~$ x9_o%;#ȶ?8o cFltc:~/Tv&na>d8γI5~!Rـ6봠ߞW}!v ϗ5cX;'Xx oVX šev0^'dzQu.7g2Μ1ǁ.=eXO3 r,Sa '>^dΝH$e#?IՁs{zkшAdel6t^Pݱlff⏅۞O`?Q%rn>uy׾fd $* >J4軔Îo_GpZW׫n@7y4`:> 9ѐ_gKr|N@~ 0aE-"2n:|b؃|Q-@_6,N+wC}~%v#/"g^pMkD07pYK( @O0G ST}qϿ @m|A@W܈@KyE; R}xM|(}4ϋUrzfkv﫿|Gh4 o_{ l-p@ x.7p7AGw خr^9 <'QȾ=*A?jr98IāGBzP>,(9 v{@сhys94=(dB<{tCiNEo}u8j3@`ko~ekuKFǾz-JgŸ*s9s7eSb(7jzi)ބƧ>$m~.EA =O1'b@/6~0*@̀H2o|yTN B090>Ew~<g">6C!e-h~w?2ݿ̿,Bra#'uě7 !T"УP^`QԿu& hz t}n7eSO?o0'4?K> /3xGn^Z`*/ά!,D@pwL<&a{{jYC#XFLͼNY?wO~^G7Ig&+R3CZB Xh~ 9kOrsc^HVym={Ns|?%H=@ c`Et:4L]3gpG,Ocj^0γ5O9'V`#(:-@ř ˜xĸNv & C xz}F⌺}]c,3iJ@E{$@gP"&%O<#!=zF$GG> ?d#(Km`v +l\"qD˱2h6F޻FrQ^+Bs Vq؀=n7njb82 p}S ^H#!@Evx H xIl|c$ )0F@~.qgGRUy:ZPCB>WP,A F8PndjLc4pwy;GyYv9sr!aX0 @}q> })A+KeP{6?nvv/ ¢彟@Q޿ `虋u߬$gw?߁@Ðs5׊|gbjDU(c& "bASn`Du3DLzӀ%A2PL}e H/52Gn \0󌁚 mkX%MU;5J-~H#S" ԮcO| hp{!d FB*# ]?O°17zM|9+ZeZ*P?BP1(>bAs1`cUUk#}RM곒_qQ>!^;c>,(T J^ԝɎz ׁ8:d@>!>/5y-J)9hG BxL{;o>z_g%Ŋ3 o HbLVk.}+.S>z׋yseu%*' N(ycc &>Q5O.vjP~ |g/AL11@93m>}KS(2jvZW#/~b5w VM&C/jժbH q`3‚@= Tm ӣ+m6#x+]𭝎o*SO2СĒ (4)(x8a>t'm)$9br~AY{_?h&`ĸDIڙi!B=˦o~WB?#)p;^ĵR"j Yz#F M5~cpo)6POH(,>2Y@Y@3 fxjx.Od{ĶDH\fj0gCo/H&sS+gYǕ:1?J}h /4F*2+L9x$ RqHzL^mAjl Vn}m1|uB" (S 8/>#Tkچӣ>x`aN ˈS߀]Bu`0=S+ﴶ_uL}xaZxX=ƙ׫ZL@P۟YU"DD)P?O v+jr SÐx#b±pJi]3{H<5>g8|X2@M,9L 0;kfAN@\$KB"^s4y/es}3g]ٟ]1Nov9+ox6yF?a>F  <ȷroB >@_䟩3!-,RǗ-o|}WLQbbৎ@nJH ~fr@(<} f-/{vm#Xsܶm >?9~d pi02?| ]m+4}yRWnC 'n}Uo99?5>껏I}U17c6@yE6*!96RL ۪K\v>0E>h;߈ [FmZiUξ+P߃.XtAN;0n,p?`6P&Rрa goRFbCeq1AY,W $ye,ި1,lLkzN|kV9x B 1 ϊֈHD{ 0@>+> } ppT0/ FOS h/PwC{УC;Nsp 6h?^"bQ:wN s l@r M?y޿/gGsxK~W}b^R~2B-c'Ҩ,cee`Ӂx/B1pZk  am0KI`_~f> +I;h#?M.tPy..WC#~FuYD6|47+ ~.hOىfÂI8Chnù/`[0ھ]Q.MqHsgqleí^_~/~Sl%(o`G?lo8`@@ǥĨw?\bAF毒츔)KQOxaA ;遟$l!@dKXEq_ T-_=JX{9Q(@IE I9At^kfC~ۜ'v= Dŏ8wjVתP<,1  QL+R $ `zj.eigݵϸ@1h~NBCО]@ #wd>=0sbΠ/P{1XMzA@CӤ ~Ex~2V9}?C0m鷜-W_{\?QhP՟ӷ'P!Xinqr( |Ɔb%Ѩ5 E67y5d8n TDV 6?1t_'I qԓI5C|mO]%&-(?1qj~F֍>JP{n`T)'ua 4>/.?@~%!?1˂B7>-#&A4PEQ£PAq?F𬟬SOMR/Y;~]ZSqV$޾>4}v|]ʕzɳ{T%l_ďF&Ѐ>>SOmܫV"R01GR7aj.8Hϕl|}/`P"ـ _؁, Z-: 'S> F$'pnGaDH ia>e!@J![+`sQC./pG3ۯԣ]S}owO/jA,O87_ k#u%t0/aB1 * U( F36a( ?~j2L![h/yq݃3>rE 04EBh@3t}-7[>Gb~:] tu}{~|4ow.hF<z=QQB` `˓z(V^@TL 8-iFh Z׋}﷊ 0VgĠW!'Q!AI-pa@)tB$mi&8r>Cq^$^ 7܇=7ϺX5_m6P_:Qܧy'XWk\!h TiQh@ K諉i!V8(ʾw5>C{aJ Ծ`Gs E,>ns*!Dyz aXϏw Pua goTٛ7}׀uqB~,)H@||>RFp ^=x 2&)diC(V^'o"ezNOs(y9? '` y#.>8N 8c~(ș)(@*Ri3w _8㊿1XS' ZH:9P?)Fc^ux6`x($c iRq S%(pP(;P. sNoŚߛ4/hӯ4aAB @oCLHh3ArP_`ۑ}NA@d- |u` =( t̀^/~55"yxY T槢al.t8 ˜P; ~}`mf4%qO! L9X )eol?DYq> `. b|4XnA{CŽ"nkaO~@cCeA ԠjzZ>YkԭO@p V.2b`,ˏ> f°тXNK94#b/gkH0PaPCМo8`>4DaEfph`vLEQv_̔@V ʳq΂ϸ¬Ti,wDEk4_1{O{ʯ}>\_5!š( `)ā7&}+ 86V:`p>g@= ##|x m~z=ȑ_PLHuz@I&Gal$A4$qအ@m߄mW?^[[y45IPՌs&Ang3{u=ݥ9z{z|L/`p;|CT9d6l PM T +0'A%C~HR2f@} z旙Ïғ) .9r"x^kOLY~E @1^u zˀU}0}73|e+޿}q/o;죔.z'](8&6#'zQ53-Yq>`qBOՄ9S~(7 |6?{yl$=$0;9n=_3(J+t=&ZfE￰siGZ?fyw޳t6Ĕk;l |TAw>̓ohLebzd!8FT*!C@ EI!rH~vhf!s@(?䣠INg۩/-=|1<H|tzyrW;gz;ƻSze޹zbW{ G?eOPq6B@jp95zϭ_k#:on؀Vc(&ju4HPPp@2bE'@cJ q,G_hM@ρÀZx=폎rG {uC٤ƫP[so+[?j ]YP!e^迳/ln:hT@G *+3Kb&4\|)ͨ~m{_сDD[a%<'/sFI@}!F8t'zy{_A ݕZg<_|ઋ߱p~~- =鉿~N}rAAX3Ď@N\@Y@Y!D3?ڣu$~-2<8=1͗)шui>gCd{暑7#PfG=6s ןyʥ{-_yye]Q,{7@?MڨW;u։ϯRo6@?ԘM7f)\tjD/Yf_" Y=@*P P?} MdU}LycLxUڝ.y2!>ﲔ/L7@A t}O VMĀ Ӌ!P1cL nV1@1xͱ3?q_4OS=;?9u ==^bΰ~~ >o_%)H ƣ?򧌟YVD1DU?oapҊBpHӗijb]wů! gˑ?2=D> B Fs(Dž@ 4@hpP_>l|kz>fȳ֞},ۅ ef gczg=Jݐc]D"182)˒p= pn~4 m`:7)>GN>@dJ ] b)mZi~[WS8:ZoZ{?zuҁ<~/,pAd11ZpϧWR7G V ؿ:L"7a|5qTMJ-C\ۑٔl_'@~op_B|~ja}Cf6/:-ZmSP>~v/%q[GPGU}FD6?yMS&A&t3g gF&dESNM(u;w>$Hm(/ b >*?)©MOf3WKK{~m_zU,)n/,L,I\{clzj}l4LTӑ] lg`Ԙդ 0sjtv\D(K1T*pDW B$rOWwK}3C~y\$n^UH0o>~wD] 3QU1 4H l z΀1/jyF?:Kt EkJ>j|^`HK֗37_ZW\[p_Cڛgek_-/ . xŸt{6g=|NGV1/ӜPVY] #D?qYiP#C B@O?yq0tX5'h/s:Mwn]ff]=ێyWs;>-pweM,w 2A@'}[#^G94bk0ЎC]ƼY V;.B OP @d&Pa>Ƌ@?J$(0]}Ndowv~a7ց!Ϡh U,w -`MVoVT+[8bAKhwcf:xx#_$q8ڡiG^_D9,\>Cc{Uy'PЧOp7^G"=ՒA9@pކcزW㿲nlSumc#Tk# +SR]; (>iʄF6Afʭ.;gslK׉?MٟC|k2S?z wC޽ -~)̗bę>`{/=Ɣ-ߘf|X͖QcuVoڑƮ30*BDaP/Qb ]· ^\iT!Cf O`/}%KbkvZ*X=9~5cA`g4"=+wm=Aڋ$^8RC%3 t]`υ$f_,$( Z pkxR`cIIENDB`(      !##$%%&&&&%%$##!   !#%@64s+\8{Ŕ>Ι?՚=ٚ<ܙ:ݗ7ޖ753ߐ1ݎ/܎.ً.Ո,΄*~'u&{a \E,4%#!   # *|GW'4լCGGEEDC@?><:86420.,*)()܅(~)i'K W*#   #K\/9]{kqzfQPONMKJGFDCA>;:86320.-,,,**݅)t*b*W'{K-9#  "7E"2Y|gȶms{_XTRPMLJHFDB@><976420../....-+o*c+a+ȖV'|8!2" #wHUaimszXVTROMKIGDB@?=;97521//1//1100/.j-d+b,_+xH"U# &OlbβhmuzgXTTQPNKIECB?><98652101001111110v/i.e,b+a,ΈQ'l & $Nl`ڱgnsy~ZXUSQOLKHEDA?<<97532011111222223~2o2l0g.c-a-ڇP'm$ "yH\aԯekrw|dYWUSQNKIHFBA><:865322121222332233r4o2l1g.b.b.{J%\"  So2=]dipvz~]ZWTSPNKIGEBA>;9764232222222233334s3q4o3l1e/b/`.S4=   %Ucinvz}^[YWSRPMKGFCB@<;9753233333333343444t4s4r5p4k2e/a/X, % Y{6A`ͪgnsx|k^[YVTROLKHECA?=:875444444444444445~5u5t5s5r4o3h2c/a0Z9A  !Rtdjqv{a_[YVTROLJGEB@?<9765454554555555566z6u6t6s6s6q5m3f0c1T+u! "/)`hou{~c`^[XVSQOLJFEB@=<:765665665555666666x6v6v7u8t8s8o6i2d1_0! )Pq4;eӨlsy|ec`^\YVSPMKIFDB?<;9666766666556666777w7v7u8v8u8t8q7k4e3c2P4;iFNjpv}ofda^ZXUROMKHFCA?=:877777667667767777|7x8w8v8u9t9s9q8n6g3d2iD#NyRblsyigc`][WURPMJHECA><9998997888877888898y9y9w9x9w9v9u:s9n7g4d4zO*bYjpv}lieca^[XUQOLJHEC@=;99:89988988889999:9y:y9x:w:w:u;u;s;o9j6e4R+k]qs{pnigda]ZWTQOLIFDA?=;:::9999999889999::{:z;y:y:x;w;v;v;u;r:j7f5U.q~]jv|rpmjgc`\ZXUQNKJFDA><;:;::9999:99::9:::~:{;z;y;x;w==<=<<;;<;<:;;;;<=}<|={={=z=y=x=x>w>w>v>sz>x>y>x?x>w?v?r=k9g7O69.%ӡՃЀ|xtqmjfc_\XUROMHFB@????>>>==>>>===>==>~?~>}?|?|?{?z?y?y?y?y?w?r=j:e8 % {ԇт{xtqljfc`\WVQMLGFBBA@?@???>>>>>>>>>>>>?~?}?}?|@{@y@yAy@x@x@w@q>j;a7 osەԋЇ̓ɀ}yurnifa_[WTPMKHFBB@A@?@?>>>??>>??>?؁?Հ?@~@~@}@}@|A|@{@zAyAyAw@q=j9W2sXM=ؒӎЋ͈ʄǀ|xupliea]ZWTQMJGDCCBBAAA@@?@@?@@@@@ۂ@ׁA@A~A}A}A|A|B{B{BzBzByBv@o=h  ̠חԔϐ̌ʈDžŀ}xtqmhda]YUROLIGFECCCBA@A@@A@@@@A@߇A؂AԁAрAAB~B~B}C}B|C{C{CzDzCuBn>g;  ֜әД̐ɌƈÄ|xspkhc_\YVROLHFDEDCCBBBAA@A@AAAAAقBՁBҀBπBBB~C~B}C|C{C|DzC{DyCtAl=^6SP8֡ҝϙ̕ʑƎÈ}xtolgc`\XTQMKHGFFEDDDCCBCBBABBBB؄CփCӂCЁC΁DʀDDD~E~E|D}E|E|E|EyDr@k=S9"8锶ڪզҡϝ˚ɖƑč|wrnkfc^ZWSPLJJGGGFEDDCCBCCBCBCCڄC׃DӂCЂD΁DˀDDǀDE~E~E}E|E}E|F|GxDo@f;ttUٯիѧΣ˟ȚƖÑ{vrnifb]YUROKJIHHFFEDDDCDCCCCCDچDׅCԄC҃D΂DˁEɀDǁEĀE€EEF~F~F}F}F|FvCn?uR0U  ӡشհѬΨʣǟŚ–~zvqlhc`\XTQOMKKIHGFEFFDDDEEDDDچEׅEԅFуFσF˂FɁFǁFāGÀGGGGG}H~H}H{GsBk> ɇgܼعԵбͭʨǣşš~zuplgc`\XTPNMKJIHHGFFEEEEDEEEڇEׇEՆF҅FτF̓FʃGȂFƂGāG‚GHGHHH~H}HxFqAY5g  ٢־Һ϶̲ɬƨţŸ}xsojfb^YVROOLLJJIHHHGGGGFFFGۈGׇGԆGхGτḦ́HʃHȃHƂIĂH€IIIJIJJJ}ItDm@ Njdӿκ˶ȲƭĨ|wrnjea]XUQOOMLKJIIHHGGGHFFGۉG؈HՇHӇGφHΆHʄIȄHƄHăI‚JIIJJJJJ~JzGsD~X5dΡ̺ɶDZĭ¨zvqlhc`ZVSRQONLKJIIIGGHHGGߊGۉH؈HՈHӇHЇIΆĪHɄHDŽIŃIÃI‚JJJJKKKK}JvFmA tNɻƷIJ­~yupkhb^[VTQQOMMLKJKIHHIHI݋IڊI؉IՈI҈IЈI·JˆJɆJDžKŅKÄJ„KKKLLLLML{IsEtR2N ǿŻõ|wrmid`\XVTROPNMLLJJIJJHIދIڊI׉JՉJ҈JЈJ͇J̇KɅKDžKƅKÄK„LLLLLLLMMKwFk@AgL%ſû{vqlhc_[XVTSROONLLLJJKJJތJیK׊KՊK҉KЈKΉL̇LʇLȆMƆLĆMÅMMNNNNNNON|KtFA/% ۦwľ}xsnjea]ZWVSRPONNMMKKLLKݍKڍK׋KԊLӊKЉL͈LˈLɇMȇMƆMĆMÅMNNNNNNOOOMwHd=w ť{vqlhb_[XVTSRPOONMLLLLߍK݌KٌL׋LԋLҊLЉM͈MˈMʇMȇMņMąMÅMMNNONOOPPO{JoDWj-~yuokfa^[YWVTQQPOONMMMޏMۍLٍM֌NԋMҋNϊN͉NˉNɉOLjNƈOćO‡OOPPPPPPPQQNwHW?&- ܮu|wqmhc^\ZXUTSQPPONMMMݏMڎM؍MՌMӌNыNϊỎNˉNɉNLjOňOŇPÈP†PPQPPQQQRRNzKe>t ĸ~ytoie`][YWUTSQPPPNNߏN܎MڎN׌NՌNӋNЋNϊN͊OˉOʉOȉOljOĈPÈP‡PPQQQQQRRRQ}MpF$7,{vqlgb_\ZYVUSRRQPOOޏO܎NٍN׍NՍNӋNЋOϋO͋OʉPɉPȈPƈPňPćP‡PQQQQRRRRSROwI$J}xsnjea_\ZXVUSSRQPߐPޏPێOٍO׌PԌPҌPЋPϊP̊QʊQȉQljQňRĉRˆRˆRRRRRSSTSTTQzL]8K{vplgb_]ZXWVTSRQQߏPݎPڎP׍P֍PӌQыPЋPΊQ̊PʊQȉQljQʼnRĊRÉR‰RSRSSTSTTTTR}NjC ÷}xsmhdb^\ZXVUTSRQސPܐQُO׎PԍPҍPьQόP͌QˋQɋQȋQNJRŊRĉRŠRRSSSTTTTTTTTOsH ytpjeb_]\YXVUSSߑRݐPڏQ؏Q֎PԎQҌQЍQΌQ̌QˌQɋRȋRNjRŊSĊSŠS‰SSSSTTTTTUUTQyLXaf"¼|uqlgba_][YWVUTޑTܑSِR׎SՎRӎRюSόRΌŘSʌSɌSNJTŊTŊTĊTŠTUUUUUUVVVWWVT|NX@("Lþ¸}xsnifa_][ZXWVޑUݑTڐR׏S֏SԎSҍRЍSΌŠSˌSʌSȌTƋTƋTċUĊTŠUUUVUVVVWVWWWU}Od?Lpļ´zuokfc`]\ZYXߑVݑUېUّSאSՎTӏRюSύS͍S̍TʌTɌSȋTƋTŊUċUÊUŠUVUUVVVWVWWWXUPmDq돫տؾڽݽŽƷİé{vqlgdb_][ZߔXݓWۓUّVؐT֐TԐTҏSЏSΏS͍SʎTʍTȍUȌTnjUƌUŌVËUċVŒUUVVVVWWWXXWWRsI򮫬ɿʿͿϾҽԼֻٹ۸ݹʻDzĬĥŸ}wrmhdb`^][ޓYܓXړUؑW֑VԐUҏUЏTΎU͎T̎UˍUʍUɍVǍVnjVŌVŋVČUÌU‹WWXWXXXYXXXZXUwKì½üżȼɻ̺ιйҸԷֶٴ۵ݴǭŦġœ•~ysokgca_]ߕ[ݕ[۔YؑW֒WՑVӐUяUϏUϏU͎V͎UʍVʍVȍVȌVƍWōWČWČWWŒWWXXXXXYYYYZYUzN Ԭ¹ĸƷɶ˶ͶϴѴҳղױٱܲްѱǣŜėĐzvplfcb_ߘ^ޖ\ە[ٓZؓX֒WՒVґVѐVϏUΏU͎V̎VʍVɍVǍVƌVƍWŌWčXÌWÌXŒXXXYXYYYYYYZYW|O 譣´ôŴȳɳ̲ͱбѱӯ֯ׯٯۮݭʡǗŒČ‡|vrlheb`ߚ^ܘ\ڗ[ٖYהXՓXԒWӐVѐVϏU͎V̎VʎVɎWȍWǍVƍWŌWčXÍWÍXŒXXXXYYZZZZZZZZW~Q ±İŰȯʯ̮έЭҭԫ֫ث٫۪ݪتǔƎňÃ~wqkhfcaޛ_ܚ^ژ]ؖZ֕Y֔XӓWғWВWΑV͏VːWʎVȏXȎXǎWŎWŎXčYĎYĎYŽYZYY[[[[Z[\[\[YR ­íŬƬɫ˫̪ΩЩҨը֧اڧڧݥߨњNJDŽ{sojifdbݞaۜ_ڙ]ژ[֘[ՖYӕYѓXϓYΑX͐XːWɐXȏXǎYǎYōYŎYĎYĎZÍYŽZŽZZ[[[[[\[\[\]ZT ©éŧƨɧ˧ͦϥХҥԤգץ٤ܤݤߤߥݦvspmkheߢbޠaܟ`۝^ٛ\֙[ՙZҖYѕYΔYΓW̒XʑYʐXɏYǐYƎYƎYĎYÎZÍZÎZŽZŽ[ŽZZ[[[\[\\\\\ZU ¦¥ĦƥǥɥˤͣΣТҢԢգעڢۣܣݣߥоڼΑtpmkhecݤbܢ`ڠ^؝\ל[՚ZҘZїYϕYΔX̔YʓYɑYȑYǏYƏYďYďZĎZĎ[ÎZŽZZŽ[Ž[[\Ž\\\\\\]]ZV £ģģǢȢɢˡ̠ΠПџԟԡٟ֠ڡܡݣޤޤп͵ͭ€nkhedާbޤ`ۢ^ء]ן\՝ZӚZљYϗYΖY˕Y˓YɒYȑYƑYƐZŐZďZĐ[Ï[ďZÎ[Ž[Ž[Î[[\\]]Ž\Ž]Ž]]][U ßğşǟɞɝ˝͞Ϝϝќӝԝ֝؝ٝڟܟݡޣߥ̸龩龣龜ړqifecݩbۦ_٤^آ]֠\Ԟ[Ҝ[К[ΙZ̖Z̕Zʔ[ɓ[Ȓ[Ȓ[Ƒ[Ő\Ɛ[Đ\Ï\Ï\\Ï\\]]]^]^^^_^\V汖œĝƝǛʛʛ˚̚ΙЛЛқӛ֛ל؜ٝڟ۠ݢޣҹ羣羝羖ӟ́gfcެbݫ`ۧ_٥^أ]ա\ӟ[ѝ[ϛ[Κ[̘Zʖ[ʕ[ɔ[Ȕ\Ǔ\ƒ\Œ\đ\ő\Ñ]Ð]Ð]]^Ð]]^^___‘_‘_\Vҳ›Ûśƚǚșʙ̙͙͙ϙϚљӚԛ֚כ؜ٞ۞ۡݣظ依侗彐ʓuc߰bޮ`ܬ^ک^ئ]֥\Ԣ\ӟ[О[ϝ[Λ[͙\̙[ʗ\ȕ\Ȕ]Ɠ\œ\Ē\đ]đ]Ñ^Ò]‘]‘^^^‘^Ð^‘__‘_‘`_]V˜ĘŘƘǘȘʗ˘̗ΗΗИҘәӚ՚֚ל؝ڞڡݰߺ㾘侓侌ن߷e߲`ݰ_ܮ^ګ]ب]֥\Ԥ\Ң[Р[П[Μ[͛\̚\ʘ\Ȗ\ǖ]ǔ]œ]Ŕ]ē^Ē^Ē^Ò^Ñ^^^‘^‘_Ñ_Ñ_Ò`Ò_‘`\U–ĖŖƖȖȖɕ˖͕̕ϖЖѕҘӘԚՙ֛ל؟١ݳ޵ᾓ⾍⾇⿃ؑvߴ`ݱ`ܯ_ڬ^ث\ק]զ]ң\Ѣ]Р]Ν\͝^˚^˙]ɗ^ɖ^Ǖ^ƕ]Ɠ^Ē^ē^Ē`Ñ_Ò`Ñ_Ò`Ñ_‘`‘`Ñ`Ò`_\T򊵔ÔÔŕƕǔɔʔʔ͕̔ΔϔЖҖҗҘԚ՛՜֞آܾ۱۲ྉᾄͅ߿jݳ`ܱ^ۮ]٬^֪]է]ӥ]Ҥ]ѡ^ϟ^͞^˛^˙^ə_ȗ_ǖ_ƕ_Ŕ_Ŕ`Ē`Ē`Ē`Ò`ÒaÑa’aÒaÒaÒa`\Sj“ÓœƓǓȓɓʓ˓͓̓ϓЖєҗҗԘԚԜ՞ۺ۲ٰس޿{z{ݹcܳ^ڰ^خ]׫^թ]Ԩ]Ӧ^Ѥ_Ϡ_͟_̝_˛^ʚ_ș_ǘ`Ǘ_ŕ`Ŕ`Ŕ`ĔaēaēaÓaÓaÓaēbÓa‘a]}RmD‘ÑÒĒŒŒǒȒɒɑʓ͓̓ΔϕϖЖҗӘӛԜ՞׮ױ׳Əݿ{xt݈pݴ^۲^ٯ^خ^׬^ժ^Ԧ^ҥ_ϣ_Ρ_Ξ_̝`ʜ_ʙ`ə`ǖaǖaƖaƕaĕaĕaŕbĔaĕbĔbĔb`]zODh‘ÐđŐŐƐǑȑɐɒ˒̓ΔΔϔЗјњқӜլկֲִʏ}xtr||hܳ^۱_ذ_׮_֫_Ԫ`Ҧ`Ѥ_ϣ_Π`͞`˝`ʛ`ɚașaǘaƗaŗaƖaŖaŕbŕbŕbŕba[b?㷐ďďŐŏƐȏȏȑɑː͕̒̓ΖϖИКћҜԾ԰ղԵΓxurnrrܹb۴`ڲ`ٰaخa֫`ԩaҦaФbϢb͠b̟b˝aʜbȚcșbƙcƘbǗcȖcŗdǖcƕcbZŽÏŎŎƏƐȐȎȐʑʒ˓ˑ͕̔ΖΙЙЛџҵүӳҷ֙vqpmkzkܷa۵`ٲaذa֭a֫bӨbҦbФb΢b͡b͟c˞cʜbțcədșdșcǘdƖdƖdaYyŽŽÎĎŎƎƏǏǑɑʑʑʑʔ͗̕̕ΘϙϛնүѰѴи۞tqlkhu}{ysfܷb۴aڲbذa֬bԪbӧcѦbФb΢c͠c˟cʝcʜdʚdɚdədədƗd`Wy>ÎÎďďŐŎǏǑǑɒʓˑ˓̗̔̔ΙΙϜѮбеξqmjigm}{yywulݺcܷb۴bٱbׯc֬bժcҨcѦcФdΣc̡d̟d˝d˜dʛdɚdȘd_R?fNi ŽÍĎďŏŐǐǏȐȑɒɓ˓̗̙͗͛̕ϩϯϲϴolihfg{~|zywusqngݸcݶc۳cٱcׯc֭cԪcҩdѦdϤdϢd͡e̟d̞e˝eǘc_hM1 ȳŽŽÎōŎŎŐƐǐȑɒȓʔʕ˖̙̙͛ηϯβδɮpihhedr~|zywusqomlhܿcݸdܶdڳdٱd׮eխeԫdҨeЦeУe΢fΠe͟eƙc[iŒŒŒÍÎĎĎĎŏƐƐǑǒɓɕʗ˗̛̙ΞϰͰͲ̵ϱuhghddk{|zywusqommkigeݼe޸eܶeڳeرe֯fխfԪfҨfѦfѤg͡fƚcWhzŽÏÏďĐŐƐƒƑǓȓȕɖʘʙ˛γ˯̷ֵ̱̳yggeedeuywvtrpnmkigecbc߻e޸e۶fڲeرf֮gլgӪgѨgϣfěbMŽŽÏďďďĒŐƒƒƒǓȔȖɗʘ˛˝˰˳˴˶۸~gfdccdnvtrpnmkigecb`^^cߺfݸg۵fڴgذg֮fիgΥeÛ^jÏÏÐÐĐđƑƒƓƔǔǕǖɗɘʚ˦ɸ˯˳ʶʶ҅gfddeciqpnmkigecc`_\[Z^޽f߹fݷg۵gٲh׮hΧcYjxÏÏÐÐÐĒĒƒƓƓƔǕǖȘȘɚʜ̽˲˰ʴʷʹ׍hfefedglmkihfcca_][ZXVV`h߹hܶjױgΨcL‘‘‘ĒŒƓƓƕƕǗȘșəɛʟʮʱʵɷɻݕgeffeeejjhfdca_][ZXVTSQUھb߻iشg̨^:ÐÐÐÒđĒœŔƕǖǖȘȚɛɝɰɰɲʵɷȿhefffffgfdca_][ZXVTSQOMMVԴb̥Z:‘ÐÐÒĒŒēŔŕƖǗșəɛʝŹ˰ʳɶʸĘjfffffgfda_]\ZYWUSRPNMLHDRš‘‘ĒÒĒĔŔƕƕƗȘȚɛɜʦdzʱ˳ʶɺǚmfggggggb^\[YWUTRPNMLIF:Rbt—‘‘’’“’ÓÓēēĔĕƖƗǙǙȚȜʝȹ̱ʲ˳ɶɻ˝rhhihhhic[YWUTRPNMKJGBԥ%TۑҒÓÕŔĕŖŖƘƘǘȚɜʝˡ̯ʲ˵ʷʺУviiiiiiieYUTRPNMKJHD:T`JV옑‘‘’ÑÑÒÒÒÓÒÓÔĔĕĕŗƘƙǙɛɜʝǮ̱ɳʵʸʻ٩}iiiijjjgYRPNMKIIE@|q?ŝ‘Ñ‘ÒÒÓÒÓÓēÔÕĕŔŖŖǗǙȚțɜɝ˞Ŀǵ˱˵˷ʹʼӃiiijjjjj[ONLJJGC7?šě‘’’ÒÓÓÓÓÓÔÓĔĕŕŖƗƗǙǙǚɛȝʟȦʲ˲˵ʸʺɾيjjjjjjkkaMJJHD=Ɵڑ’’“““ÓÓÓÔÔĔēĔĖƖŖƗƗǘǙǛȜɝɞʟµ̱̲˵˸˻ޑkjjkkkkkePHEB4nǟ—’““ÓÔÔÔÔÔĔĔĔĔĔĕĕŔŕƖƗǗƘǙǚțȜʞʟˢ̶̱̳˹̼mkkkkllllUC9n˜Ɵƞ’““““””ÔÔĔÕĕĔĔĕĕĕĖŖŖŗŖƗƗǘșǚȜɜɝʟʠƬ´Ͳʹͷ˺̼čplmmmmnnmW4!ɡƛ’“ÔԔÓÔÕÔĕĔĕĕĖŕĕŖŖŗŖƖŗǗȗǘȚəțʜʝʟˠˡʳγ͵ͷ̻̾ȏslmlmnolո^"Ĝ]ɡŚ““ÓÔÔÔÔÔĕĕĕŖĕĕŖŖƖŖŖŗŖƗƗƘǘȚȚȚɛɛʜʞ˟ˠɧϳγͶ̹ͻ̾ʓ~}~~ummoplջc]ǟɡř““““Ó”ÔÔÔÔĕĔĕĕĖĕĖŖŖŖŖŗƗƗƗƗǗǙǙșȚȚɛʜ˜ʞ̡̠̠ϲ͵ζ͹ͼ̿И}}}{{z{}}ynonӾfśɡɡؓ’“““ÓÓÔÔÔÔĔĕĕĕŕĕŕŖŖŖƖƖƖƗƗƗƘǗǘǘǚȚșȚɜʜʝ˞̡̞̠̣ϲεζ͹ͽӜ}{zzxyxyz{}~okҽbǝˤɡʒӓÓÓÓӔĔÔÔÕĕĕÔĕŕŖŖŖŖƖƖŖƗƗƗƘƗǗǘǘǘǘȚȚȚɛʛ˜ʞ˝̡̟̠͢êȲϳ϶ηκͽ٠}}{xwwuuuuw{{c›.˦ɠؓ’’“““ÓÔÔÔÓÕĔĔĕĕĕĕĕĕĕŖĖŖŖŖŗŗƗƖǗƗǗƘƘǘǙȘǘȘ~Ș|Ț}ɚ~ɛɛɜ˝˞̠͢͠͡΢гϴζθλξ{ywvtssrsuuvi.ǟJͦʡʓ“”“ÓÓÔÔĕÕĕĕĕĕĕĕĕĕĕŕĕŖĖŖŖƗƗƗƗƗƗǗǗǘǘǘǘȘ~ǘ}ș}ș{ș{ș{ț{ʛ}ʛ~ʛʝ˞˞͠͡΢ΣɦвϵзϹϼοÇxvvssrqssrhJǠSͧʡřÕÓÓÔÔÕÔÔÕĔĖĕĕĖŖĖŖŖĖŗŗƗŗƘƘƘƘǘƘƘǘǘǘǘǙǙș~ș|ș{ș{əzɚyȚxɛyɛzʜ{ʜ~˜˞̟̠͡΢ΣΤгжзϺϼʼnvttqqqqqfTȡ[ͧʡƙĔÔÔÔÕÕĕĕĖĕŖŕŖƖŖƗƖŗƗƗƘƘƗƘƘƘǘǘǘǘǙǙșȘ~Ǚ}ș|șzȚzșyəyɚxɚxɚxʜzʜz˜|˝}˞̞̟͡΢ΣФϦïѳѶϸлϼNJztqqqrpe[ɠRϨˣǛėĔĕĕĕŕĖŖĖŖŖŖƗƖƗƗƗƘƗƗƘƘƙƘƘǘǙǙșșȚ~ǚ}Ț}ɚ|Ț|țzɛyɛxɛwɛwʛuʛvʜxʜwʜz˞}̡̝̟̠΢ϣϤХβѴѶѸмоȋtrqqqeSˣGΩͥȝŗĕĖĕĖŖŖŖŖƗƖŗƗƘƗƗƗƘƘƘǙǙǙǙǚǙǙș~Ț~Ț}Ț|Ț{țzțxɛxɛwʛvɛuʛuɛuʛtʛuʜv˜x˜z̞}̞͟͠ΡΣϣХѥҲѴѶѹѽоȌqrqfGʣ0ϩͦʟƙŕĖŖƖŖŗƗƗƗƗǗǗǘǘǘǙǙǙșșșșȚȚȚ~Ț}ț|ɚ|ɚzțyțxɛxɛxɛwʜuɜuʜsʜtʜtʜsʝtʝu˝w̞z̞̟͟Ρ΢ΣХЦȧҴѵѷѹѽĊ͒rg0̣ϩΨˢțǗŗŗƖƗƗƗǘǘǘƘǘǙȘșȘȘșȚȚȚȚ}Ț}Ț|ɛ{țzɛzțyɛxɛxʛwʜuʛtʜtʜsʜsʜsʜsʜrʜr˞t˞v͞y̞{͞ΠΠ΢ϣФХѧҳѵҷһӿÑŊʛ͊ˢϩЪΤʝǘƗƗƗǗǘǗǘǘǘșǘșșȚș~ș~Ț}Ț}Ț|Ț{ɛzȚyɛyɛyɛxɛxɛwʛuɛuɜtʜu˜tʝsʝsʝs˝t˜r˝r˝s˞u̞w͞y̠}͠ΠϡТϣФѦѩ˱ҵԷԻԾҾϽΦ\ѫΨ̡țǘƗ~ǘǘȘǘ~Ǚșș}ș~ș}ș}Ț|Ț}ɚ|Ț{ȚzȚzɛzɚxɛxɛwʛwʜwʛv˜u˛u˜u˜tʜu˝s˝s˝s˜r˝q˞r̞r̝r̞t˟v͟w͠{͠~Ρ΢΢ϣФѥҦַչջҸ\ͤ ЫѫΦʟȚȘ}ǘ|ǘ|ș|Ǚ|ș|ə{ș{ș{ɚ{ə{ɚ{ɚzɚ{ɛzʛyʛwʛxʜwʜv˛v˜vʜuʜu˜t˜t˜t˜r˝s˝r˝q˝q˞q̞r˞r̝r̞r̟t̟w͟y͠{ΡϢϣФХѦѧӨַҳ!̣ЩlѭѪͤʞɛ}ș|șzșzș{Ț{ɚyșzɚyɛzɚxʚyʛxʚxʛw˛wʜvʛu˛u˜u˜t˜t˜t˜t˝r˜s˝r˝q̝q˝r̞q̝q̝p˞q̞q̞r̟t̟tΟw͠zΡ~΢ТϣФѤҦѧɦlΥѫӭЩͣʝɛzəzəxɚxɚxɚwɚwʚwʛwʛwʛvʛwʛuʛuʜu˛u˛t˜t˝s˜s˜s˝r˜r˝q̝q̝q˝q˞p˝p̞p̟p̞q̞q͞p̞q̟t͟vΠyϡ{ΡТФФѤѥҧԩϨ@ӭӭѩ̟ͤ|ʜxɛwɚvɜvʛuɛvʛuʜuʜuʜt˜sʜt˜t˜t˜s˜s̝s˜s˝r˝q˞q̝q̞r̞p͝p͞p͞p͞q͞p̞q͞p͟q͟r͟s͠u͠wϠzϢ}ϢУϤѤѦҦҧѨ̫@ΥЩRӮӮѪϥ̠|˞xʝvʛtʜt˜t˜s˜tʜs˜s˜r˜s̝r˝s̝q˝q̝q̞q̝q͞r̞p͞p͞p͞p͞p͟p͟p͞o͟o͟p͟q͠qΟr͟u͡wΡxϢ|ϢϣѣФѥѦӧөҬRΥЩRӭԯҫШΣ}̠x̞uʜtʜs˜s˜r˜s̝s̝r̝r̝r̝q̝r̝r͝q͝r̞p͞q͞p͞p͟q͟q͞p͞p͟p͟qΠq͟qΟrΠs͟sΡtΡwϡyϢ}ТѤФѧӨԫ֭װŮRЩ6ӭ԰ԮҬѦϤ}͡x͞u̞r˝q˞r̞r̞r̞r͝q̞r̞q̞q͝q͟q͟r͟q͟q͞p͟q͟qΟq͟q͠rΟqΠqΠs͠qΠsΠsΡuСwϡ{ФЦӨԫ֮ױرװʨ8ЧҫdԮկԮӬҩЦ~ϣz΢w͠t̟r̞q̞q̟q͟q͟q͟q͟q͟p͟q͟q͟q͟qΠqΠq͠rΟrΠqΠqΠqΠrϠsϡuϣxѥ|ҧԪլ֯ױծԫeҩѩӫdԭհհԯӬөҧ~Ѧ{ХyϤxϣw΢uΡtΡs͠q͟r͟rΟr͟r͡sϠtСsϢtУuѤwѥxѧ{ҧ|Өԫխծ֯խԩdӧѧҫ:Ӭsԯְְֱ֯ծԭӫԪөӨӨ~ҩ~ӧ}Ҩ~ө~ԩ~ԫԪիլ֮֮֮֯ԬԪsҪ:Ҧѩӫ>Ԭbӭծծկֱֱ֯ײױְְ֯ծ֭ԭӫӫbө>Ч}?????????????(@     FQ()&^7ӣBD@<853/ދ+օ*w)`%^G*) f?8gvjROLGE@=840-,++o,Σ]*f<8QVju[TOKGC?;730000/.j-d-Q&V PVg˺q}}XTOKEA>951112232q1h0c.̈R(W Z{71boz\VRMIE@;843223334w3o2i1a0[91 Xikuo\VQLGC?:755445566v6q5m3g2X,i  *<es}`[VQKGB>9655555667w7u8p6i4b2*  @]+%mǭyf`[UPJEA<888777889܀9y9v9r8l5f4M3(  T|<,tիmg`ZUOJC@:898889999{:y:w;u:o8g5U9,  Nv;(zةsmg`ZTNIC><;:;;;;;;ۀp9h7P6( &:ǧztmf`XRLGB==<;<;<<<=}=z=z>x>w?o>>>=>>>?}?{@z@y@v?p=g8 xhҋ̃{tmd^WPJDBA@?@@??@ف@A~B}AzBzBwAo=^6h _X0ҔˌĄ{skd\VNIECBA@A@@A݇AԂB̀B~C}C|CzCuBp?bC'0𙸢کў˕Ō{sjbZSNIGDCBBBBBCԃCρDɁED}E|F{FuBk=˅TװШɟÖyqiaYQLIGFEDEDEDօEЂEʂFŁFG~G}GzGsC^7UʢֻβȨßyof^VNMJHHFFFFGֆGЄH˄HƂHIII~JyGqCȎOͻDzèuld[SOMJHHGGGފH׈HцH̅HȄHĄJJJJ~JwF]8O ǻ|sh`XROLLJIJH݋I։JшJ̆JȆKĄKLLML{JqD _o&yof]VSONLJLJ܌K֊LщL͈LȆMņM…MMNOM{IbF+&}vkbZVSQNMMLڎMՌMЋM̉MȈNŇOOOPPQ~MmC} ʮyog\XTRONMߐMَMԌNϋN̊NɈOňP‡PPQQQOwI W{d~ska[XURQPݏOَOӋPϋPˊPljPĈQˆRRRSSS}M\C)Wxne^YVSRPېO֎PҎQΌQʋQNjRĊRŠRRTTTUPiAWLJ}rha]XUTݐRِRԎRЍŘSʋSNJTĉTTUUVVVRtH鰧ýwlc]YWߑUۏS֏SҍS΍SˌSnjSŋTŠUUUUVVWUzLϩԽؼǴèynd_\YےVؑTԐTЏT͎UʍUnjVƌVËWŠWWWWXYW}Q 樦úȹ̷ѶմٱԵş“|qha]ݕZؒWԑUҐUϏU̎UɍVnjVŌWÌXWXYXYZYS űɰͯҭ֬٬ޫ̚ċtibߚ^ڗ\֓XԒVАV͎VʎWȎXƎWōWÍYŽYYZZ[ZZT êƩʨΦҥ֤ڤݣۢ|pjdޟ`ڜ^֘ZҕXΓXˑXɑYƏXŎXÎZŽZZ[[[\\\W ģǢʡΠѠա؟ܡޣܷƃkeަaۡ^לZҙYϕZ̔YɑYƏYŎZĎZď[Ž[Ž[[\\]]X ŜȜ˜Λњԛלڞܞߤèǚߗncݩ`٣\ԟZЛ[͘Z˔[ȓ[ő[đ[Ð\\]Ð]]^_^Z毐˜ƙș˘ΘЗҗՙךڞƞŒ҂aܬ]ا[ӡ[Н[̚\ʗ\Ǖ]Ɠ\đ]Ñ]Ð^^_‘_‘_‘`YαĔƔȔʔ͔ϔҔӗ֘םَ̛ܵmܰ]ت\Ԧ]ѡ^̝]ʙ^Ȗ_Ɣ^ē_đ``Ò`‘`Òa’aY‘Òőǒɑ˓ΓДӖԚףرқ{~~ݹcٯ]֪^ҥ^Ο_˜_ə_Ɩ`ŕ`ŔaÓ`ÓaĔa’aX䃶ÏÏƏǏȐʐ̓ΕЖҚٿԳٝsopܴ`خ`ԩ`У`͠a˜așaȗbƕbŔbƕcbV}QÎŎǏȏʏ˒͔ΖϜԻҴޢpj}yg۳a׮bҨbϤc̠cʜcɚdșdǗda|QQ|]ÎŎŎǐɒʓ̖̘Ьϴ϶kfp|xnݼcڲb֬cҩcϤd͠d̝eʜea`=ǷÎĎŎƐǑɔ˗̛ΰͺkeh||xurmg޸eٲeխfҧfУf͠g_wÏÏďĒƒƓȔɘ̡˱ʿjdcryvrnjgddݷfٱgԬfϤeXwmÐÐÐőƒƔȗəͷɻʳ¡nedkrnjhd`]_ݽe۶hҪe|IÐÐÑŒœǖșɜɴʴɠtefhjhd`]YVS^ѭ`DѓŔǕǘɚ˩˲ɶ΢{ggge`^ZWSQK@DǾ‘’ÔĕŖǙɛȽʱʷ֦сhiieZWSPMDF—‘ÒÒĒēŔŕŗǘɛʢùʳɹܪֈiijfUQNI8H’’’ÓĔÔĔĕŖƘǛȝƲǴ˵˻܏kjkiWK?Ś““ÓÔÔÕŕŔŕƗǗǘɚɝʠδ̶˼nlmoW1 ZƜ“““”ÔÔÕĕĕŕĖŖƖƗƙȚɚʜ˟Ȩγ͸qonδ_[ƛ’“”ÔÔÔĔĕŖŖŖŗƗǗƗǘșȚʝ̡̞γ͸Ë~}{z{tͺeplŜǝ”’“ÓÔĕēĔĕĕĖŕŕŖƗƗƗǘǗǘ~ș|Ț{ʚ~ɝʞͦ͡ıϴκnjzxuvw{OxǠǞՓÔĔÕĕĕŖĖėƗƗƗƘƘǘǘȘǙ|șzșyəwɛxʝ}̞͠Σβ϶λʍwussmTՆzȢɟƗÔĕĕŖŖŗƖƗƗƘƘǘǙǙǚ~Ț|ɚ{Țwɛvʚuɛu˜y˞~̟΢Хѳзн̏troWߍwʡˡǚŖŖƗŗƗǗǘǙșșȚș~Ț}Țzțxɚwɛvʜtʜtʝs˞t̞z͟ΡУǩѴѹВqZqȡͤʝƘƗǗǘǘșșș~Ț}Ț|Țzțyɛwʛuʜtʜsʜrʜs˝r˝r̞w͟}ΡϣѦԵԼμzĜXΧ͢ɜǘ|Ǚ{ș|ș{əzɚzɚyɚyʛwʜw˛u˜t˜s˝r˝q̝q˞p˞q̟t͟wΡϣФЩ˲ˮXw̤Ч͡ɜ|Țxɚwɚxʚwʛvʛv˜u˛t˜r˝r˝q˞q˞q˞p̞p͞p̟r̠vΡ|ϢѤҦǟ}BΦЩϤ̞xʜs˜t˜t˜r˜r̜r˝q̝q͞p̞p͞p͞o͟p͟pΟr͠sϠxϢФѦӪĦBǟ{@ϧҪѨΤ{̞t̜r̞r̞q͟q͞q͟q͟p͟p͟qΠq͟qΟrΠsΡuϢ|Ѧԫ֯ǫAsͤ~uϩӫҪѨѥ|Ϥw΢tΡsΟrΟqΠqϡsУuѥxӧ}ԩԭҪҦuŜ qʡzJΦ}~ѨҩӫԮկ֮խլӪҩ~Ц{~̡xJšr????(0`   @9(q)K5oŠ9~lj7Ȉ4À.~r)oZ"KA'( UOqzRMJC?95/*+~+үe*M$O )^sqWQKF@;61/0.w-d.ڗY*s  Veky^WPJC>8322331j0e0V+e Qr3-gv[UNHB;6443445o4j2b0Q4-zQNp~bZULE@:655667ހ7t7n5e3{O*O]`{iaYRKE>8888889y9w9o7i6W/`edriaYPIB<99:99:;y;x;r:j8Z2d xaK|ri`XPG@><;<;<<|=z=x>r=l:zS.K Q~F(ц|rh_UME@?>>=>??}@{AzAs>k:T:!(񕺣ВȈ|sg]SJEBB@A@@ڄAπBB}C{Ds@l< хaϞƓ{peZQHFECBBCCтCʀE~E}EzEsA^8a 1 طάƟymaWNJHFEDEߋEӄF˃FŁGH}HzErB ݞo˸Ĭuk_TMKJGGF݊GӆH̄HƃIIJ~IwFe>o תĸseZROLJIIۊJӉJ͇JDžK„LLL}JuF ~×@zl`VRNLKKڍLӊL͉MȇM…MNNNzK]9@“tg[VRPMM؍MҋN̉NLjOˆOPQQNrE ѻym`YUQNݏN׍NыOˉPljPÇPQRRPzL Wb\re\WTQۑPՍPόQʌRƊRÊSSTTT~P[B)@vj_YVݑT׏RюS͌SɌSŋT‰UVVWWRd@@fо׻Īzmb[XْUԐTώTˎUȌUŌUÌVVWWXUsHfv¶ǴͲҰدЪÎpd_ܖY֒XӑV͏VʍVǍVČXŒXXYYZWwLv炮ëȩΨӦ٦ަ߱†ofߠaڛ\֗ZДX̒XȏXƎYÏZŽZ[[\\Y{NꁯĢɠΟӠןܠޥѲ͑hߨaۢ^՞[ЙY̔XȓZƐZď[Î[Ž[\]]Z}PtÚƙʙΙљՙٜܡ޾wޭ_ئ]ӡ[Μ[˘[ǔ\œ]Ñ]‘]^Ð^‘_\{PtcÔƕɔ͕ЕӖ֛ڣ߸ᾊو׆ٴeت\Ӥ\Р\˛]ȗ^ŕ^ē^Ò_‘_Ò`^}Pbx;’Ƒȑ˓ΓѕԚݼعttٯ^Ԫ^Ѥ_͞_ɛ`ȗ`Ŕ`ēaēb^vL;kRyÎƏȏ˒̔Ηћվ~l}׻iذaժaУb͟bɛcǘbǗd_tU7ϷÍŏƏɑ˓˗ӪϹŲht}yoٶcخcӨcϤd̟dʛe\ŎÎĎƏǓɕ̚ϲί΅ei{ytoje۵e֯fөf͡f[~7ďÐőǓȖ͠˳ֱӉcdppkfa]պb۴hѩeS7ռÐőŔǗșζɴ޲Տefigb]YTXʩ^e‘ÓēŕǘȜɶۓggf]ZUQK:f^HR߿‘’“ÔĖƘș˨ŴʸjihZPNC~rTڒÓÓÓĔŕŘțɝȺ˴ʽmjk\H8TؓӔÔÔĔŕŗǘȚȝͤ͵onnY|ŝꓓÔĕĔĕŖŗƖƗǘȚʛ˟ȱηȓ~}rl嵝S;Ȟř’““ÔÔĕĖĖŖŗƗǗȘǚ}ɛ˝̢̟͹˔xvxwb;QʡƚÔĕĔĖĖŕŖƖƗƘƘǘǘ~șzɚyɛy˝̟Ρά˳ϻΕvureQPʣȝŗŖŖƗƘƘƘǙșȚ~ț|țyɛwɚuʛu˜y˟ΡХѶѽӘsbP;̤ˡȚƗǘȘșșȚ}Ț{ɛzɛwɜuʜs˝r˜r˞t̟{ΠУҪӹʌ;w̤Φ̠ɚ|șzɚzɚyɛwʛwʛu˜u˜s˜s˝q̞q̞r͟vΡ~ϢҦŭƞ~RϨЦ͡˜wɛuʜt˜t˜r˝q˝q̝q̞p̞q̟p͟tΠ{УѤҩ२Rfɠ~bѩҪϦ΢y͞t̝r̝q͞p͞q͞p͟p͟rΠr΢wХԪ֮Ѵժbǟy8ΥЪӫӬӪҩҨ~Ҩ~ө~өӫԬӫѧ̢8qȟx5̣z[ϥ{mЦ}yϥ|yΦ{mͣx[ɟu5p????( @    lG$bzP)S)ρT*S*S+U*T*|R+mJ'b  :'({P(U*W+Y,\-].]/^0^/]/\/Y.X-~U-;)(g:lZ.[-]/_/_0`0`1a2a2c3c3c4d5b4_3\1vR-l JikɦVEd6b2c2c3c4d4d5e5f6g7h8h8e7a5[3܂Q6`jheάUGk:f6g6h7i8j9k9k:l:lo>o>i=b8 d^hxv]|n9v8ԳSca_]ZXֵRIuCq?r@rAsBtBrBm>]7i J3"i9줡m=v|Fm;EY_\ZXUSQܺMH{FwExFyGuDpAM7!" d5j:t?Yq?u@LZZWURPMKHFEGzJvFj@ . o?m;w[GlvBvCEոQWTROMJHEC@>@zA/"a8ZsAq=sEtAW}zGzGzGKPPNKIFDA><94*[pBtAs@tAwEkԌP}J}JKƥMLJGEB?=:83޸+vH˧vCuCvC{M{H}|y\MNOPָLFC@>;963, }MwDxExE}Q|JLג|zythPQRSPG?<:751, QyGzG{H{IgMSzvuswTTUVWŦO?8631+ W|J|J|K}LPQ_{vsrou‡YXXYZÖZնI42/)X챀O~MMN\STntspollؒ`\\]]_V9-(YɶVOOPQ\WW~qpmkigg__‘`ÒaÓaƕbJ$Z]QRSTY[[NjnljhfcqÓbēbŕbŕcƖdĔcP~VScUTTVjo\]_ܗkigeca|ŖeŖeƖeǖg“dUSdL3 e켎^VXXY^__Ýjwhfdb`^pʇfəhɚiciM2 bh[Y[[“a”bÕcrjeca_][`ߎkʚj^tPÙnf\]^wŖhĕeŖeƖf|db`^\ZYUivNf\Ɲq“e^_aǗfǘgǙhȚh`^\ZZYWE\ÚqȞsÕg“bÓcwȚiɚjɚjʜlА][ZXYMv[@ǝuɡvŘiŕeɛkʛk˜l˝lͤrx[Z\S,WsRȡwͤzʞpƙh̝m̞n͞o͞oΫ{g^X7mƝu[ΧΥzƛpΟoΠpϡrѤxôU[ṃ|ȫ보ҧyө}өϤxÖicNȱ鰰餤Ȭ}ˠwN`??(0 `2U+(T+?T+?W,(b4c3T+TS*S)V*V+W+W,V+V-X.Ug8qF8X-ҊX+\.]/_0`0`2a2a1^1\0Z0҄Z28Th߸UhâZCc6c3c4d4f5f6h7g7d5a5_5i|^{KChecɨRDj;i8j9k:l;mp=zvBيVyGHշPRNKHDA>83vDvFsAuEK{f}JLMLIEB?;71;lA&|MvCwE}NX~|ywNPPMD@<96/7'pFAPyGzHLjzxuLJVTUTӴH:73.7AsHAU|J~KSiQ~vsqsܔ_XY[T=1-7AvL&[NNOUVʎrolgg]^_ē`M*y0&W_URSX^ݙnlieq’`ĒbĔcŖdUJ_`UV`a]hrjgeb~|ŗeǗfǗf\ZTiZXZ_’`qgfc`^mˇjƘgWTbj•h]\tĕdŖe{da_\Z]cƔ`_6Ɯs×h`pǗgǗgȘh`][[U>{7f^ɡwƚmÔeʚjʛk˝lύ\][F^lf̣{˟t̞q̝m̞nϤur`Mfj8ɢ{ΪϠqФvҨ|ȬP׃8ʞrnS׵ˢzkS͞o'>>'A?AAAAAAAAAAAAAAAAAAAAA?AA(  V+~S*[~S*zT+zU-[X/oDV.W+W+Z,Z.Z.Y.Y/[3~v0ZWZDe6e5g7f7d6`5`70h`xUֵSf`ǨQEp>o?l=hS6gIz"UGP{AL"  t5 C.j0|V8f&M@80(#  =^$x yU;x ]rTzJck4A\.[ =>1rvP"kX{vS4'eMSp*)nLfqndyYUO<E*6x*`4DA$yV5]1Yp\g,RC\skq kknDTe 3?3 ,#SwM`!3 rv+^ i\uc)MTF+\ 7?[p$J\ /%\:k 'C \<tkudP8i1<Aaoc7z!j Y41`rkG7BR=P\wn>`  !11D<XCeCm?q8n2j(\D xqcULC5@H\z"Gw:Thy9eW{r~E[3 gpFQN h44bq{IGqs$!r~nqBo'&R6[`DCc[wb/;7 YY#>TSrO.5 mI0[ 7B<=OH9/8Uy6k@{pfYC)  *a"S}1&m+9u&9X_Aaq=8LJR/J-x:iQnDQfVWlTmQyKyGw7m`TXsotl\oN"23'("uYD9S60N%^>f6b V@g#`)e6 >+L Xc%3#}XJ -vZj@l!xhii_tPV;@&0 &&4Vs_?}jE"pX; Ay-8;8h,L7 &qYz@29T{+55-& 2LTUKLXno, m%}1C*B%`k SQ^>[P}U}od~\m[]bRT^ kZjN^[pye_~S`UTflUg"F)st6mkn0F!} X+a4&1F]r:ZpwkM{&N$ar9E7G@V9P A66>LZgp4qZmq[v=c=q?V :CH   #3>@(K}C}:!W2!~DQ0P*i; EH!n9O?,2<[rM;fmbyLj6P&1 m:2L}xr@M'on.O W Xf5O\Lfw>\j.RyVC'fR~v~~yWC 0:{&zPINohDyO |NP[{tnQUd e?>R)Gl[FrVb\4-DtE'R{Zc>K'>+IV@M}Yqug") uu[^ |?qU \ w6Y[zx# xMB Jt9As L[4W}KzzfUh.w~h6sm{w"=]F@&l rYEVi(w<e1wrpO~Fb6>2C zTJ]B0H X[ PEH4Uv)|"JKFAd)n?|AB'=@979D8X|s6Xa KL1#m 1VlT [ ra]=TBK {CU'\H,QF3;j\9``;=#Dn_2*Fa}{[{GsXn_4aGFxz$?_ QcXnS4  KB 0>2@Fu#\Rflze.crxJZ)*@La:FQd;H~DH!$Qc jI&k)!2)LA;0!EP':5B !0PX[#?m={f;P5o9GF^|C W% [>B#{+AWWn5pX^KB+~ql!37{k03uV,KNZiS~l\ [,!"oa6 g)2uXb4|g_\wCf;Q !VB| O sf)UUr`{Pd(\ >r %/ $GT<V. }dAq<ZK?/&n*@ ^nGO3+ FXSpIQ&?uBs{gJXn}95QZ `ds@mb/\d?LgHSb!yn_ fG./!o06!R#  7P ~L1ftp=\'X+ H8u5'T x~] XRLH#zY .11s1[B!D][P(D;6#ufzI4< (#ltXni F+fNZu"u:NdC2X+Qr#~=eXOHQhx7;&3fbEt;Qcqua0_Q7_T%<6%T/eCD1'R5& VB].,=XkoLMn3K -36iQh >@7'S{!: Z"5/Q Z><Ai,e\WKMnh76\Z@  vruzA)t`Ou iJ#XCW?OkRzN svLJan5(1<*9qq{"W#cRK`*abrR0f)@RwQhAGqk.(+W> %b9I<RQF3$:)J8]}Kq2}6L}f1 }UA;?J^xTG%-+ (=<{Vw&n|^ di8>&r+Z 0Wfm*#^MZQ)H8q[sBYRqma;y ^P!f[<( (wvpXz7QsR8] 8~@-xB<EW&duE=iG>x*g:PgR+y}~=\N0rdz{+ODa)jH:HF9v6(8+k(gnK/q:zOWj"0_z3vqbLE!V\ss<I0kA;31i?I|02I3WAYn\w6z$OrC$B*8gtd6>;v>{#R1`]YE)q1g)^_d/dG[#D'g7 %I=5OHlUoRZZp70wE {x7XQ_a JyW!t\&WCYa' 7s =E(deM?}o)Dk3=,bwm 3`XU5c}}rhh(oIR= [y9 ~?T(>J8X GYOYySHw,E.c&C8Hsl/!IsyezkUtm O}|d <FGF<&#LmPEL?exi?]jk[d+,1XFw54Rfeh+veq-780/HykFn_ YRyBw,0bDO5cn-v'y3^HiuO:OTxO$N8rMnS,?\N'aFWJXQ =%?Is~sLEL?cmY|Uwne58r"\%hC%_Q4^:1mgUc.G"str]{d5$u;TYV:;<QZ(E^~E8)@c)[sQu:E M0[5{Q0_x3M<>Hk,U^Z`;Ry7L`j`CufD#C)SQ%#@6Q|NeDZ7[%Ljpeq$4Gr P`EQ6<|g5W!FPy PK<lzgb~#~'r)WeTpiRgtQ}'p\(QM<CPqtyh>K5Wl>u]YBY(!{Z `~(RHz&<Zli- Ilz[O$R-OyFF4,fgI]|)e3zBt-TW2"GFm t}?Zt E%Q]T-&0GVRPw4l 17,kC ^.ha.xpUt[Cv,"Bz'>T)%;Qa(jPZ{%Z|a"o.Xn>oV]["Qum\ 9pfCpg?:ZAfF~eVvpq*oy -s]hMC[OmsW?;>[C4agkbSvMP\VvZWn=E,Z<N87rU[9AT*;1\\eBt5"9`+G]5C@:.~@S nIbX> gJQ*%ti!6.w" #op`J ! #~ab[yP!i zJ7G4<}:*=;OS4B;PPNl8 R^=>i_c_sZ|gd;m\P<3D] W^9E0Mh?D\ ;&{tM,/B$vmRx)&IicvR3dW1]F/m8uZi<gx;j ZHmv .j7`tQJ2&}4,sG(Tk4<*D/5qO{#LD\+ u{<@otQUoJG'yW/x~4* *s3H`"t" F=ekxX$TVn:8>xr\#vcavN2[A/>RQ(:m"jTS77yNEd|/4Lw?#X=T` o>[+7+}"_OWs[ {br$BU+4&k _eU.j3V_<673BYWvq^9lyaU("!v$@!_Hmc>e&8TAG-Jv0;d2DD}^DCAXg<3S Y{!LU 2zdJpK)ctGu9> M# El]T7#4_"|,Jc ;FZ;l|Qs,O3N|u;|Wsyl @ 1R J7 C$opJ />6H ;\$/~lg6H41Oswg74=FxU{V #$E aUwZ$CR@v \t)s3r3/ Jf;V ww(Me'c[^Hu6E s.v\m Tt(Z$Wy1k++0PS0rKRok9H/9tM?m0Ql/R>gBo-am%r UuwW&n4)H*Ph:DE0|Fz>7d.ku<u;m*oE3@Vf r_KZDDDCGTg`\w,E0mScl{l !|R\eI{F"]v"\I  pxoh ^1{-1%yDDOR~yt8S Y\\ T()8K., Wla &:#;Dv]g06C< {%SP,V3-(kz ^N\FNv:iDCsx;miSb8!n$#X,hS<(>UC0o0' s6.`Z`T,H$N/{]2ays GXYy:EjUA !)v2 L=ro %(JRSIL=K>k6{QU/A( Ci&CtBQN9kw> r=8f>]~r_Kc&cpDqole^ei!G[d #JMEeielgRo:9PUaK2 WM}I~d$[?od[(hH>[1W7C;XFw#c@Jx64=Sa 5}raS`:AE1f0[zKs@p:wrO|?#)xVU9H$biY 1{YefJ6_V *cxL":CEb.!}Pvae#\RI6xp"+f ]X'Ae g[7we]?.$V`J$*"g3+KC39~(;$=]~aM6,F|]Bs$-j  *R/ijVcwO7zFI,mCE],woPf>; ;S^]GYT}%7 !2he~ w|i+ !.;g pz3c#g=p[~<JoO.`(bda4EGL&nI6l`v-'y <6NP_ + s8vmY)^5d9>.i <{fy{4:3h0Ul 'D@mu9sLpq ZKvR!| B3K4 2&;o<8nzYI6Wa{NcD|~p /gfsP$Iq;G.sp\"P}e0t.QU Q'|O)d4kJjW@S$)a:JFy&4(-H?M(,WpYR\hT:;x us'ttZdx5sSqRqjY[ XU\&33/1b`yCBN`($\x[ULJ)@ N8]#,zmJL9`oQP\yu5/Uox&2N6^2VSp :vaqlwWa/^""W;^Sa/;?+6[c2e_-j Kyn2r[JM1LXcTUU" c&{dt3` " W SekoW2xhLn@K:Q(-$")X<.S;/Z+P< @c`[d1nY9yvKGF(8\! @EF No2yxkZkLqC;'t]b+tGBOvK]kE 11julR0]L={.>'V2yc_4t~.i~TK#`NGYzRtwWq| 4@kiS&hh6/e(9FcN]rc?/& f(RCk5;dcS _$o4S5aWGdQ3'7 /y S>!ACXY 2Y9bW+a=V&.L8T>^F5>#[eBc e n jFg;~ ,\Mm :R?YA&Z5Dgo49]+##G,RV` &kX.Ekj'TvZzS1YC3 Bi>8p~--C ~U qoNW#5R k[:jCD(9Lor /|b!%7:/NdJNHWG.!QXlp4.F83uALeN&39G\pUvD{/ u,B$SxS}mgq2!d~Z=Ui@yc ZP&^"wsSc=:*{#dusH2m)\-+MUeE_PfXNF`BI b/ PXtSgG=^hD!pj1Z!;aKy.%YF^\5T0)Y!Kpyg/<"IHi1H/LXd/Q/4)1uw6@?/|1&y2 -AKIdK=_50Z6XV N;bNA8l1;Q8>iW/I&tSiRWhCZY^#Oc=j RXM{!Bcs CGXrBQ_$,yVzfK*A#gWt+kUc\2!nEf_e 6D0]\F-bC:87 :@C<MA{Y8pP5z:,nX4sv#@$P WX.A}_GnEj&;"c4q<#,j7fP 01O+NY`*(chHswugCQ/k}nM!~:}*^X3]NG S#6uy&%PT4[$ --;CjQw}hR ?z_v[y/ZNm=sMuqTYr4\%t[!Vz/2T9wL0y/IQd;_xAto`+  gT 9A.u8 MysZ|J1qEzB'dw [Fj [Yy,?$uY7'*mw [!nGUZ?6@fx`gU/m_s3aOr*/ 6dDL7>8="6c } {!O M*  .@U06x9nRCR$&h2-Uy#(: eR/'j  { NMZlf T |-hAH]V*N&s]']@t$t#}%HIOP !&%h:O;EiCI7pX]~G+RrEu|wNcg 3 ^844ysMPFJ%Y0 B= =I0q*iRa _ aw,stR4x`fBAlAX$/nR rK^g'X/` 2(^"zwYmDZ;y{`v9?0M&s;F e^G|<&K-NQ4Ushs`cH{OI/Ewp+.N$ xjc >z@`@%1a.V.\}5~4 r .O . + /fSa8%^nB^iL1%([f5g0jo[+'_L1jv Tac5B~/?#`k l&=:O~ Tkm.7u]&(:n/XY7 ; '@ ]k.OW*CFC?#Q# TNFGJ\P9t#!';)0h5]w5%|/cudbA$E3*]b)jn&ucKOy~M-Nce~b%S=3. 9=IW|,Bo/"O-Q0 s913JgH7$ ]#|$2?,H!qCd ^x :1b5(`iv;.#FicMu F`4{l!"gnI Z ;P  -Wp=0.O u/3s`>=;SE_iz}uw!'A YQ}O<HP=&OX q<OcZyp! m#VjDP-rO_~&UQ i  $ / IZSO\A11zzz\o3&[P>d'Ce (o_MCVP1dvs`K}N?1!2^NKM7.#c ,VJ|=3=Q!{O(k{q}Baj/T.(yK%V?tGcOp]d]go_,}Ln-P A85!mCK eH4uSg^}5>;edaNwO]b`D9@r7*]Brw | M:y*}i-G -c^\)X.DE :^`~~}U,M4IW;nq, U\zj5v<9#T C_D,3 s{tVYj+DPY8H+{=,d\ )Y5;p*)B~!Yh&An zI c Z?D"T0/\q@<ASHHS|!cP%7bA\^EUj0gsh9{{E,4oRbSQT?[NKpO!SnR_;p+:\mc&(,z=r~E!Vcyci|3 V + , 'eE` V*uBYs]K5')'Tw,Za9RHu2XR?h@ `8Y  yr1c?gn( ab@fqfoxkV}>8-:2HI9}yO y [|  n 1 -0-b-:SpaubXl6`L_*SGaXU?W*K4fyQ Fa[}(w~Lf;+prKE1)!\0;X.-%1E!dj 69,Z:Y]6'erDZ  PY lsv#&-pUZzsJ&/W0fT!j6SYT4\k-|vfyC6/UMU/M{xOsC]d_H1^qq*2}09K dD~w| XgAYiY0i  Dzla$0sn-43Zz@ Sj1PT^2 U   M5p36UYi zX  68$'TQ&6itZd10o9|xrjcyb/c5{y\   F6W#vKE >QRN 6"\%7lrNwBOq']gf&EM*LPL(O!7YN.[:76"kbMkOI%t_vwmz W0(^'IeX>\V)Jga3Y5(UPBbZV_z7$"{ 5Ud-#RB^$)Wb'u#<` U ?O mc Ta$$*Se!WgJqR o"pK[b:N0egJ1QQQPx%V{am4HN8mu~Ii?VVH:R%bKimBmM^+CJM0).f1Xmi}E<S>Fy}ACb'i,|L ,'6 1\ , ? @v 2c9pka@@bBLyy F+<qf kIk!;: ATa9T" 3"~VO~W%}QcED~v/-;G0<e]g+&hC@lH[q9Bh_YM ;%TH]9Wx\1TG ' G ~  gAie qn?Nln]|LLLwRg=fT-y?{zq;#!sqgXQkdqhNHyF |?:q?wFXoNG+]#hs9ht_x3BgV 0 e8 V $q|h05QY8*nJ,#]/,vKb=e(PRi Usc[AiqYUK|UI!jd$Es:~AeKNl[qL[p V#I*pWdYZD4^ki": _$s7g!8 j7&@D2$4|4s iTJu]K4]kn:=.>\ 4K ws.16l<mYA`  7 K# "H.g`L}Hyi^2`.KRd5nFy\o6g ge   0IP$ZQ{w`6dr4E TrcHv# lsG2yJ_[hZhVc-+?6(?*TKmjEG'G^kqTw)4 `_'So(d;`+w4n*=3oG 450"96A=* SE Q+rkAU  08:aQ4N"3{&P6qzWZ<$>Gpnm.Nm>_pHcKz9@Sr!($;dy3U0qY}^v6`{_''# 2/KGS12Pi{gm<"J$M~a\{G3$69x Z <M  Evfd|$ 2.Pd9.u_ji~}%j 8{d[bmwOPu'b#@F{A.h5|j?^H>PAu; Y.2_)   fO.kVv*YCHoUm5L f9  q  5 Xq,.eZR,TVRkY:xTyC !643hL$Q9p/5^\s<Bn02:rkm&P=@ Mi0uO" T CuG1GDt x8x[g]5n [ ; ? X lKF}Eve]ab^jV[C8S`Ucc1-*~m/: H}>$9hPapUSsr# Rt( * = =  uz@Kp0z?K8.*]#>Y5#bg^Ose=B$<A..T!klS_k>s_YFq( kXT l CZBx~<1~[%x@R1  `  9 uKG}/qFp  Ben~Jbt\+KXs|c~GYZRae@{td< t U2h ioqp)M@TpkgW 5 7  $ |Cs{4(XKxg C)S%]fCYV_#_R Fgnua%79v7AKTZDu:`^ @C-GvKq 0(P Z u99^q$F\U#W;FEe Pt c YkJ|RH V4-Cd%\242 _  } $dKS5Nf@Q}.M  8< LZa} ZTZ7wX0ee'dNEfG  2#(' Ysgx.jX% N.r  BQI@?=m4isosYko+]:S)`neb--nh&yY2TSEDh*!k6V6ME75~ NX>BXB1%Rr-{3C? ;^]xix_I< 42 " *p G6)z,&imA3O&UK8->nBuK0'?m{E~:Vh}Am03vr/y-oqc4_\I5?RF Hd/u|wG Th`C7CCFLyexl1D 5sb!>--g;oXX.hYLh]t{e7MvT)'# r;HQSc! 5 NZ0Cu[ W4V)n~yp}H} *=+\ X R 2d %;ngI43ju"z#x&pc:p_?={VMc-<f O`&6ID\wZ%VZ1q <  KZ's&Z e8DYW?akY4yC5^Nfk]  j xXe.*IROL/70d]S zd lS"[3l] ]Az!u]k7FI~~mQL"`Mei/{ ]# I Q . > 0*XgT[5Q}0:v? ^!Q@wsmt1 ! J +"R/b1s]D P } O<%2B->g$ `<{" y~,.5F G  h 4B Z#C"~X+S:!(S([UiL5o@$?H+"}]2rB)UJYTG3  ` X{7K?'ppa6P_JldrL:.GIT"r_ }]/]p2B^kzDB{di W w0raGzAF5# ?$&z;x P<R ]=?%JL35#'$0Cb-)!/]c5L>*=>uU,F4<5 V Myp h  S 7y |}a|0->( @^@KAdjp-LHt* 0Z H  > GjY%RW%)Yi+}Xs 2FE p#c&ff-SV;e?BP'  " i  V  u ]U xwpx#ECKb.b[$ *qG/eWSF W<:ZaZ E)esX8/@A>0sQOM2~ 9>=Zgb 5rrF@M+_ !r:I's7 P [ 5 o  rj49ErB|^_In>!TL; v}M3,ks)vx dm7 8  1C@Od!.HO $A|8Y/ fR>I~d U*nn   qn/ E Fab1F=JC.1:/T &Z3fR Sr]RGw>T+F$*Ux\ga=;wa (BQW(PPUG7Z;#{%Uto!B)p8RFX5w?\=fT\pgPG4**0C+3P jJEYO)!Nr6 Hp A | E ]* XzB/$B9jClPEjV#fN;>RNSop0!xINDS%&& ~0)yW0IT  B30=>CeKQR@*4$YCf1\,mf.}> T <>7b 2  r ea 1m1 _&ZLe;sXOr2-0< Mm:TW+v$&d (  ?1V|nz> e qoLr9tI[] (F}>7 ws_2Qc  N  ! f~  v=S]6> xBI~WO}$u @S**njtB  + h: X S7B0cI^cV'<UTppk%_~h[O$i e,2{>0j`#Y  u  @ G)|1*  SKL 2EcB` @;Vm wkte[ vxp+H !\ O jBLxe  > }.gX],a,`Oc,arC#_[b'n;B"[F0b=HO D   q  dc 7^Hq6kt%uYG 9OAp;:0z:[n}$S=3"0 ng Hy % !  _UZSkt8x &Ny=Pym-ei(e/? y5EmP ^ - oK  Xu ,gQnT.9epx:=S u  hZkpW,`.220pBL?.? &pNoE# DBMOi8" z9;/%+ JiILPswP{-_`osE10 [ (  ^St|o ]-n,.zaPNRz XuCFaeO8l<->T;= Qx  $ @:-) ` >`  T8/G+T:ߋ#{ ; b q q?1eD3R; }   b  k V=F "  ~_[kCM9 4 &9p'ltm2#ZDq N\~V@M / R   J A *(YQu#,+p3;7kOABfoG}N$ `b8)9RMoN)D w; $ ? }3 h`65O$N3qbGdH` G>bLkyVM%mZhH,/@!W=5tvDQUFx p  X3 D H  Qf gz}je&3?)Ldqa ' =3reW :] mn `Uq< 7 d{[oC>.Vh\7q>y 6_xWCF\a6y8(` B Z DkC8l+m~ Pz  R TrW(f?@*`Q:pND\^M}<0~ T - + r)<4 0  $ as idOg-I ]   \7wQXeK8lA+v LV~u3 3B ;g ` lVM tg  -P:]TLP& fN 6~iM EsCaY@Wk1HNlw(_uA`cc aP #m`Kzh )  rZ MZ7'gb~>u|SzXL3{fKZG[UFWV.wX,;(O,VZ63JC^I}c{c u Iv@"=^Ik OVrP13nEH  X"} jhq  W ^Q BwCW$zgxNe $g\4*!xYbnNe;vXteFo- &eZ,.J4  (  FZdeEV;u'=|YGne8\(w`hpۯ2ޅ23#Cp` > [j% To k@bZ^< Z A  @:I3&LxZ0ym20 ;BvG-(>+7Rf2wl;d[ >I@V~b]7d'a(-)SDi10P{ x!v$ !KT P ; 0 c m  K e  +  5Ex`wS&L 4SU >  DG ,   -"i#<iz&Vx~ m ) /d@"\]$$) ",Z$-%+9%(S#z$,!/ l\zye4 Em~.ؓߠPm InC=T>st^3K s hTJ,agHM}{ ' y" vg4:A[j,(Ry0l]+)^v?twRR  E$ j !/ d  B ss  Fq K 1  }t * r XkJCH}i[q1[j8{KPQ%[3^6AicS=9 B ,-]ax Y,W B{ - ] Z1jEyfpOd6z4v\vqqrx_';,=GZii /    Ys  A&[j`  yUy'J1/}2l z1Gk+lC| A P(  H q d %W dJxx@7sY ~(<fZ. 93T; L5M9n d~:fm^+X(Z ^ \k  p P} e]\LuiJFW^|Y!xoBF'yo$Fk&> f   H ;d   ' s5 x 5 7 j   K T  d!ZBaVy *P1ep;wP}&7N{_[Be+*3$Jr@M| # O^ Eg 8 K fS Tw 4KlK\<PY Xwhkx  2U  J)VC1ZK J'b\}O"[޻JJմ8nԁZߙݰ`.Nn Sy!  ?6AG !y$%'K))/+)*X''""Gx f W7 7  > " .   y/Ml'tn.c8i@; 0R|)hRn%hlc wOo%"zQO4W ?g  .A zay-Fdxs##%C A D O I (F ;+Zsx3`U4SROLHW%:y&t * L[Ryu%7mm-CK#7  x@f8aX#Ea  0?h 8 2hgj~P\  +zea-\  P ' d z  A`WV_V  ] u    M k{N"4iPLNNJ5?%=G SG4V,+uI5^!PK ,   Xi   U }gqS9l h v  C > % ' 4  %C ' -  qe=K 0_.ir3 K  H[*Q>d c d~ e% F'4TbW8 WGy| !!|"`""">##J#P$"$"I$ "aOm8 r MP$nG#AdM(Ir.W4gw'Yeߝ|5\݆4u:yD0N*RC*]n7H"QHaFQ,  %~  ; % M g  D # < GjY S "3 -   L t 7_mfeQ?)a1Z Q1g!O}*##Sg'zE\%ciA@A/8F)%+J|n!8P@db  YS0  R  \f  r G*F]/Q7{ &LP6 3 D C@=ic4~m#=SH9M?M%2T5?0f.Y~] jzY EJvC\U%3$ZqA_?0.82D1"J5EMbHtuc@V\D~{`?k)V9dU K]cf.7 ;kLl]^Z 8`4I\p g  Ip    J K   f  Z  D E A D  cyde*EY0Ow,0 2s97wzEQdnh-H|"34`| 5|  15^?2b5@ b 8    g mR Qkh f mT57M$@cZU.&Z9IBIsSZ9s7f#DG7O  WTvoI 2 a Vh&g @  / 2 #   , Xi- (o\/n/QB(>)-2C 93I9M*&7Bq s0[@T/2e  K 1o N;HzM ^6RI\k$V ( +] *'"fUJ   f* C7p58v iKN1k x x Oc k N  -y&;Hql&p !6   l\m) Enr0n+RI3 6.Dq1@ I*cTK> j!+`F ^MFq5>Yqp9. 3  K(DX  e; q  hW[lXH  :tFd N < 7 0 E J 05   "!f6- y=QX@dڶ8vJ۩9ޅW3G?q >SIy|RW"2+Sq:\)Fu0 UJ=0CXJyߑ! qk G}WFMX~z+l   h D  # i   kx  i  1  A  6 aU K \ M  "8+V_}b  '<|]! B k {7- jI L  S Doqs= *(OHl-$6zy/,g#Wrrf^2x`6d|A&83u>\Z}=F%[h>5?~5BN?$m<8r]?] Vh>.{f641W_MZc E qHa + :58cZe |0I  O K l (FnX{h01{~[j a e c  @ u K m l   (d  t 3 , " [ ]  %  N Y9 F>T^D^j"qv   a8;uAwm};/b\2>1;[qF?j>)vbs9-:b,W$E/y/WyR!l , m$b2\UI5~VA'>L?:$)$&oCGP=%=rkMI}b9  P&  x9   D M   |~O H$ ~EmQgnkK1 Yz8)>CUp '796461606=/5 .|3+0)-,`&($&$$%#'"(L!(^&:"U4t] P hM*|J*gL{l214,"8U^ 62/t;b?fݓoؤ,׽6ֳ#z|حxڍc#MRײ֩^j 3ba!dK5K)ݘ- 9&E-| N.*Bg7\EpzNSL/5P5xAQ|[ `J$L ' ~ Hc>* G# B o [ >#!j&*)+ *&|!A[L{Y7zz Hx)r"@ U&d%0 q  sS   JX9pw - lr 0i N x#(9v !$:r!P:(<"v{ޭoI!DlVOURD6k-{9ICM,9ZY)bK^#"w3A-{3`Ac[.hfsB+o e2}de&IT0-B-<? ;S!>M74: V  c .  n  #  CT h / v  It NS rk+i##%&2&G%#P Vt|  ZH(w q6mC W e 1  GxjJ?U   ;NuTS.)$laZ7$:b@KmIXKLiVea /?ٶؤש܂խۭ>t!(ޠV|)o]IvU8G u=Z}e il&-<OO3C`M6$;BOB$#i    - 8Ia  kpL  x } 9 ] ?hn>.!_>lf-4\RmT)v.@4CZ; K>{UMC ,>w9\0,wB2pc$v,Impj.wA#x!] "+ @Am  s < 4  Na '  ,8` 1f   z UY0Zf7C 3!R!&.S       J%7O]In=z;;6{z`$@2mVsH@LBN'\Vai.O2| k ytCjZ=H"My>qM;b7gz G    I "?X#AZ" 'AK!$Mp& (#('(w*[($-(.*/x,50\/11y2y34362819192B94;87f7^877R7582 9 /:-g</y>2@f7BB=:=9>m8D@K7Aw6sB6vA5?6<76 9}676 6756E5#53[21y..*+%Y'T"#B{sfSM\~Z  0  \ cH  A#) o ?O!$?^Q&Bu߷޳QgH,ߘk\K!hۧԸ`ҩ:$C+ٕSNrۉ6[ۼۡlޞߙS q,gLW]" e u|ZmmJGBXEnlor9 z>Fyqg y=I _{%  l  uW |p<LFOL`6ObbRw/tEKXd9 *N1ra-qkP>pQ .M(e=aH4Zq$P()z@ 0`wcݚ&h;eвڎܟsqޏCِsHfCpԐ#R׉E*Kv~qpRsUN9-K^bl+[46o>2C!&X %= Zbc {@W%p48@k` pm     ` A |c \ 622y(|hU[zQ ~ R  X%<x  S ,Cy0Nc Q$87yO;lL? '[cs : pE g a Y # b q } &  <Pyq eCu,e-%R ?HbjgG-` 9k)jh(}v{ukV?߹2h۳Үߠ4B IP`ܡM j FX vCCS {jJgT`{.sP4hZ|3)bz fAtJRa(/k4>7w4r a=CA  _` lTH:   s34(kh!zA/= - T .l  zR 8c O<X<(? "i0TOm %u}!NG## 4!! /apjW _ (s wd"# $K%$%6(6%)$d) $("'!'(J)\)C'j"cV\0!0##y. OLujH   JHFS&X"U lI s{; ) ~k! | 2~ C H  p  i rN  R+ {H# Af| + DKxw",^;.PHeI-Dsv(@KSj}]RrIG*vesqF{?xER~}6o|Tm(AbYD4 "  J Z Y  r t  L  KGY &V ^  ' WDz  B-4Ow+ W ~ J kqQj  ]+B E)"V"H" A!5 V!$'N *:!:+ "+",_#,m#d+")!&W#-n  !"qs#"2 !osYcUGf&DYg/  KK,V~`  ]8   ^   UDBeu0m*9U\P@TtRqtnv g#&Q@2xn#m >VL77 3r.,T۲4 Tqvݼӿ&݉ߥE[pNݨ$0zc&o:U{"WFAl;3Xchu0E6TX"\` Jf(+DLAmVMdo qi z qoxn`1D %yXt7j]3:A>NF p$~!J($*'+**+(C,r&+$*#(#<'%z&(''*))l-,1044A87:s:<3<\=u={=n>l=:?=?>?`>>t>v=>;>=9<8:66947363`646677c:9=;W@>A?CB@ABA@"AK?@X>@=?`=?h=>=x>H>>>Y=> <6>9<6:3T80"6\.l4-T3<.2%0232c6394<5K>N7>t8=9D;9!8845613ώyν̡ʿgLj^û+˾`xǺuӺĦ&ҽɷ\8'|]s!{Qȯ\jʭ䬀X#m_Vå2VC ߬촰HݮHAK*g˰M aίí6íkȭ6)b<>mȵvIx*ܽùòƳCŊI8hZsVϛ=V*ܯۼb JޣI3#iY$UPJakZ P > 9 &   ug)OJ O~Ex i=%%+ -43-+'x$2!A:[,|Ue o Q1"N!4yiu~&"o$< &#'%&&&$%"4$^ b##4$tU&'!($)q(*,+/,,!1h,1',+1+/I+^-+-+8-=)/'w0O&G0?%.o$0*#%#_! $~$L*%%&!?'#'8%'8''(')Y& (%Q&}%n$%a#&#'%(h(B)U+(-%'.$.N"+,- (T$r\E8 @!h!l"O?##)$]$m#a" h u    % ' +YzF~inp~*Y T RgvtUh*.O2m/s-adgfo$3^b_#C>.N25_3wo\lt45j ޲ݰBCի0sץܯߔo2sFUM l+H>[9?@>@߯`FG!1"7 ߥx߉@k #myJj>Brfr-ZXaqQ}tIIKk_ pf   fc H>6~rKD&V    hl5I 6b o  %   I     >5:sFVX{k(:9&t5  @vU  0k^, !#G#(~ )}$&?]  _] D S_ + YSJK=5Vw 7 v Ygg 3u \ Sg  o3YT;j @\pGg8{-b(&DqnUv[ zQ-'*]g.Yڟ17Qء#-*LN8MY:%@nߔ^:7'|6ߤs:6&;WK 9[XeZN|9&,[\(BbNvN|[CV-w1Jv-DGZR87\! W mc,3)[ %d8:5XN}1~)P>={0+n%P! $`'U(G-+2N/W526464441G4s."3+1i*0J*0n+0y-001225486:7u;8'<9|<,;<[<==>>q@?zB@DBFBHNCIBGADw@@>;=$8=5=5=7=9M=^<<=:I>*9=7K6d@7A7yB;9A:O@h=<$?u;?[:?E9[?87>6<5:5846b45F46)464C8V4894895 86 6738^2^715273a2/'2+0';.$d* v%&wqtyp,:wJ2v<  5>@WS'uq b-W Mc~sC$J5L>.* Pۧ)t۝XEߔۘz"ٰ@ڥCmoMѭ۱6ًکڢ՟%pyTv֝,ؿ֒SڢJ܉pؽ/҆ *_&Ӧф˳Q!_ɩǯV'~ lj6*6̞ʖz>Ӑ.԰өUф4}ְxCֆxѓBkX?Pdkbmdձ)}%`?T~QL2M֞pPۛپ#SKޡݚߋݰ}^ܐׯݞ ~r܆ UAJHbm(v3Gqu+h]5B;S>c}nh^t;KR88P]tNb?K &|;p%"ReqcT!/VU:Mek43 Is ]X3=K   " Oroo< ^ ):W{X#/}\L   / < h  D z  'z [ G  Y r =BpG}8ck #!fYc {;~,m=;3(^O n$%%8!xo~6u$h_+79H$v " } E  B>8 s Lo w   , # g"CXTR<i44%lLW)-}-z5#X0Be&nTftQ w;N~G>nۀ(h܍X"aO߷@މoܸuYIۃ۱E&VکنZyKE7Щ ̀ǃʜďɔNɨ_6EΛϙњnHn;"f9c 5cО҅20,S(_D|fK`Mؤ]hkFJ؀ ׁ՟jaѼ;W ѻLyһMbu^ڴكl۪݋ݶhbc# zݽ7@'&D8zQ8(w[fo@|}8 8Cf{'<`wN^6V@ t# p oZu WHqH%NC> "#"$&%*%,$-#d-a"+W!(!%!":# $!0&k&M& &% %_",&#!'x%(G' +x).,1/e5x285=;\9>T@?_A>AABrBFDB:EyCE*DEDEEHEFDQH%DPJCwLqCNCNfEMGLJ;J|MhIQPUJRMTPVTrVVUV,T*TQnP}OLwMYIKLrGLFgLGLHLJHLBLKMKgNJ N"KLzKNJKH+LF^L#GLH6MKJNVOORQ$VpS|X}TYTgYSWQTOLQM[N@MLMLkONRQPR;RSRS~RRUQiQPO OMNKN&JNH?OGOGPFO?FMEJDDC>B8@4>Q1 <09o1j7365565q8j6k969168;56444313i0f4p0J5163V6\464O543210m/a.F,A,(q*%>)m#(["){"+r#-$/^&`1'1")0*.**&*[%(&b$" l ~ax*BAi~ 2   ) 5  CUXB@s'yya{tKT5#fPkR[ow(?R+![h6iCMݳ(ܵېLX>cݿ)rN@vMm޿=O';KߨۆJU6t?ܯאHr9 ׼Wא1ѡ 2md؜%׊EՓ+fҷA9eјA9S\g̙;WMɖOԿǾNV@VRį?Ȭ˶OSxd_C@ڳ۱ܻؓ׳- :{HNjOܬe ݴgF.U1gg}߯ Zչ3!F[\ZD /4Q=Y'{r-}8T}.%yQKPx.Tu<w;`5 &@R`syL,Hksq_VA  C8O " M- s  \   { M&! Nc :& ,\% C,/EGpV o1J2#0$v76 B x+JiNNijWND}1?v^7]NLH(%_S]|ߦ[{ް]4K5"(6D&_/=#P]l jٰ-؃^ۜ6)` ,/c_tүρVΖCϱՐѷ؟*גrߩ0W׷ ּב]*ٝr ՕB$ޅ*ܸULHۍߥ݀&ޏ۾ TF6޶X܌ݸX܎.'ґ؊Nחz֚>)քo׿:ؠۢ$؅Y[bwִG^B֊ςV6׷JNӥٽ*vl. S߱ܢ܆x Q=޴hgKE Fy1$\Ow)39[ k}Joh59J[[Q3TW? @:i%u+Kg~3T;  # 1' X } ?j  Ij   O O~A@a 6 }: u * }  $ i W 8 v f<B!,e.# J -r;!%Wp(5)'#3!t@:4&/<frp%Ilg1r\     M E ;Q qr  <)T.}@{_74a.vD3G}.eXTQ}qy 7 P j Vbx ,  9 J ! 1 &;o   f  ] -   o {H*x rf7 :   r /7 M ?   src9 _   ^ Q} Y R=bh %  JG );  "EdQ!6"##$b#0$!!L-@TlY|%#!y%$#&%h%3%#$`"3#"!w!X Lm2 9 "&!$b"%#Y&$%%%M&#:&"%"$!#"O#$I#b'#Q*$,'&U.'.).+z-.-0.i305)37 58u687{8H77d7Q7778!98;D9<9=Y:<::;78:54:48a3473j533A4_204Z1303M0A30m2/1/F@ZD@A4@m?%?==<<;;<5:;9j;f9:8o978&664i5X2413%336393g<3Z=3;38V34"2.!0 *-%0+"~)!(s#)'+y-,3n-R6-5+.1)Q*'#>''(!*%y+),,3..K///h0/0F/0 ./,.?+T-m*5,$*+'*|+ *m+x)+](F*&(%-'I#$!4"8 2,Q{7V[),  YG  Hr  cO)"u4x a _ zyh|!$760 TS$BDC*r!dd,1m/$5ߞ/Qq޻;\6ߣ(ޕ֢!h(<-=ks3҉ѴGRՒ5ُ֩4ق1S|`ۛxL՝ܿ IڮKuώщ˲SRƳǽ>lO<Һ1 ~ѼBۿ+E‘CſGƒ4ϻa.f+RǺBdƿqA qH }ԽT%Lٹöճ80{1PŶ9yAIU'[_h ̶[<,}˷ B2u=8‰±—9ŁĽǮ>ǡDɚ̨Mq͸SF ҩ|רڻ@.ޑ%qTzdn&tŎw;)BƜԎ24؏3ۥ%ݺIVޝqYߔ|C,U De t'2[D ezsC$sZ`thLH'&:go.[n}f"%N'} z  0Gp 6 \mG 4 " R M 2 TQ  ;]fTZW ' 6 -  D ; x F shH!= \ # / t *_yf  & +:N < bBh ASR3d3trEO}y F\^## 44Y"&]y|]W 'ߴqQG VSh L`QXݬ۷c*,h-hp">mnnZ SSN= v{?۔߁֨ܬuܲ֘xpTW|~WD.[;'FKUt/ U`lnT$`k94_; )]jeMfm$UO 4 e M ndfe W  v t I["k$%y%W%|#""$&"%!#Y"J"8#)!a$&!%S"&<$&'G&' (&D)%*P%W*$*$Q)?$'#?&#Z$#}"# ($ $q %7"&M%'R)(-)1+C5-E7/726 4^4516j/7-U8i-8B.9'0928 5}827G88X8:8:9;:]=A!@CAEfCOGDHETI7FIEG.DDB+A?=c=&;;5:<;:q;<;?>;k>B;<+:996848z4:5;8=b<3?L@@5D_AGAIAVI AAF?@=9;3:0:1:96"<{<>BAGE/JIKKKMJNJgNWJ~MI9LHHKF8JDIC}ICIDI"2;*189116 23U314g015/4/2 /0F.-O-G,,f,9,-e,/,1l-f2-1-0H-.,,+*V+w)*q()'[(F(p'F)'*='+'",t(v+()(''U%x'#'"6(!R)H!* )5'$a ? B"     = [   ! =D N | ]- 2tsh_])  -: [   p  k KV X   XP(WFZ,rQ%G5v!".>x){O4:w&?dKAcGI 9>:)X q9E #uq&c~(.ah+vbr3lHPD1@pz &P-nBgLE>ASSh.?<1KN_1[\| g+T!TQ~4Kw DDob)ybm BhQI7"+z0)Jycj%:Rv~R!3yafiQ6c({?, /Z;U|sked)gOdYu. y*,R  !Z(l  ~ / : . % $ 0 fd   : D\ hK2\^2%7 %  (x[xC:Ok :yA]d;g6&I*"y@]y?C"ZckK Y TU[Z*(9[+k4")~O7}a== t q;?Y!4">!^ Oz1[a"rCS/l^a NH q zN  MJ(4Ot) Y^    ~n~pahNf9v +6$&,L'K&7a$ ;CC04 v  R ; B{   n >| j @ g? 8 y<x6-J5\c(i<n t  _+m0A)j11  v = i^t&c $   " B OJRE8   S \ > aHR > 1 '  _ ax[$1 .( ? T  r   Z~}a-[Izg`   U^ T9 t  N w G 5     A r X  m l f     ot<Oayk4%g:d m  ;lt;K 1j6 CU, @I   ]f  O|mN trEU 7U T% FdUWMp"b. m w  l  s LXc ,w m 4 o \plp& = > 9 / < v+*4-~&.t~"p"kYQK?Op( VuK_KGo7}HDIjX7NC]&RZ (bDO@^\hlV^7 ,}n}7gOs\;5ht3C!l~>)lOoz 02&d~H_T.pw(Iz7 ^tH-,^7HpsQ L)crWJ>kVT ~\PE:-~DR8uKnUJ!i"3l,8$V}mVvq?x|#uku,f yI{)`>KD/[h =2p^X8K1l#?BR;`;T{[s@OuCݎBW o/ ۫?Dߋݽ`@z?oaM_tl,u M2xRPJk>KBf|߼GAߢ'ݍJLֻװPֵ/'ӦԊQ=TBؐE 4Mv?2MҠ\*2ըD. ٨ ؒن]Iֵ\$ՀչQXqDp#mێP/|g>ӺՈОuj͝ӡϫ$ћEːveԍɛɇ˯ 6bh tJ̟5Œ ͛ךI>P( )e+= ̇Ԇgv~f%׮*ѤӓגPY{rNrRϏ9I΀CqͳJDp͟DϠJW̙шˌҏdn?KɹˤtBKJ7KӞJ/ѰyTЛӈ0(ΐΛ@g}ѬB/):N՛[Θ؍ $aۅT޿ދߝnDX^.)RH0 Es.nykJ1Wc oC׺;ՂD ҉ Ҍ?$X:aM[Ѱ;՞ڽk$ +\2;ٟ=pGICdM( P*PCF0L@Hh''_u Qb;K%@2 S~r$SjXb>8 q'YWrfj"Ox}) HO/QR^Z3{&}K S f`  .   568 *| w A2c|8~ * Y z   >  tLa?  Uh : 0 7<Fgtc = Jv !4 _w i sS< ;  ^ / ;  tuCC{9I]OLg  _ q d? ) ] e NG] q 3 IJ y q 7B 1(#9| 4p964 %359Fvr^k?CGHnm:T =  t q  SL G '  a '  \ 5 c <{` d A  kn% 8i` ^ }   k 73 ]o  z t% F2R_a4>281<B[g*'u*2o>O*?6j whuyg^b~npY8dOO%zLfVTWZv e(z .kQ.tgs(oIP$Y@L=ie(2~:61'}&FQz.Xa^Oc_l(QPIShNx!!8hRfK1UV)a3 n% ra[$%gh sLRP"2 u_RE2dNe_S     ^ D   b- LfZp7  5 0   ( ) q * F   0   i s ; Bc1!Wd>5{mbBVj x$ (O"+&#- #$,",) $OC3ra|"%c$')'D,U&X,A$<*"&"""#($,e%C %+$9#{" "+$ "&"($ *&+ *p-./11536/5;7565i5433u22R1109111,437W7;;*?@@Df@"G>G:E,7YBg4=281541k120O31:537698:Y9: 89E5 81w6.W5+4*o5~*6+8.Z;X3>r8^@[=AAAB@CN?A>@ ?@z@@;B1BC4DC=F!CGASI@kJA@BK@KAKBKVD.K$FJ4H,J/JImKI@KH[IBGFDkB{B?b@>N??v?IB@{EB2HBCICJ#CJAJ@I;?GG#>D`=KB=?%=@>==>>@>qA?B?{C? D?wD?D?E@(F@QF?AE!BD#C|AD>DD2=D0=6D>MB*?m?@<1@8?5>3=i2<1;1#;2z:394926p9@7{979x8989`99999897f9H684@837281819293:4\;5,D۾&ܾއg |Տ=f͚wi[#Y0Xfl,/*/j@݉ݒRݦ-ݬTܛ ݲ-C/.dVS?T@aV'_F Z5h4TM]v+V8VaM9y )[Ho=4Zf1r'8^{{%4HGFXotIGs2]@cLMf"!Bvdz] X@~ 0%M(,y+?QS8Xޗ=\׮mٴ݂߫n`iۑnRoߜNބPߴyjvRߏ6ݝ݆ڭס؅Hݳߡuc N x$tlX8=j6^Qxe+wRr;=N2PcZ+o~hD_*VcwYJ+vw#d^y{xFlJ[ \z_Fz)S  l `g | Q& ; #  V  5.X?O^j).fu5x-#dQ ? > whE   ,%}[nSDlx7![d#4_J .  tH'Ai{p7+VKp2!$"'%8*(?+*|*3+(*$)!'R%jF$q 6$Q"M%$'&*f)1.+14.D4X052683v6745]546382R:1#;/:k.39-6U-4-v1{.*/n/z-Z0,1,1-1S/a1~1 1930302000h/1I/3F16#5_99?AABHBBA@>>;:97/94[9^291c:"3v:6Z:3::>;B'>ESAsHDLJGKJFLL LON K:OINIFQLHCGm@B>/=&?= >@=B=C=B=NA=v?I==<<@=+B>C=DSA?A?*@>>&$9֯:>GN%a7Ȩ1#MϠӦ ئd*ݝ޺tކ^ݥۄBZۧrڼ !gwԲڳ֌fڃ<ٷlإ78֟҃ԌvԊёK֍ًܷؓrwk^ ݽ)S F:q 'zZg}hgW6c}g(6 omNWT8=!fqi8X\g  R n(~ ( ^ | D ? A  R : k ^H  ? O Zb$sY*>Xvrt+fcuy D"$$ N$^!#}"r"k#]!$ ]$ r$!r$H#[$$$%#%"V%! $ 2"bc+s 0 fa ) ! " #!m#"A#$b#'$*<%-"'/)0,G1(0020_4.4}-3+1/*/(.m(n,(J+)**a+\,G--r0.04^0{7&2H9*496$7^7 4706-05),"3+1*#/J*-U*L,*8++&*{,"),E(+')'"(q(&w)&*'G,)-,../ 1031c4244r4/53 61g6n060:523M4?260#8H/j8D.y7-5N.j4/3x13h3A44454:5434Z423#12/ 1./-,-*-A).(/)40)/*-l**/)?''#H$y!!6 ?B  5!!!!r"##%$ '&'&'A''''(')@(+(-(Z.(-&\+%'##k!+H @~|Q % +)!I+""+#)Q$&#.##!! dJqTA5(}%:TQ>>%[yT1MqE 3! ! F8a,sZ  c756h Q*@  ( $ Eb8   ( Xc80a@%F W{  tbv=HT#37o5`^d N p ; tGX&i q  'P<*`Pe w &< = v vQ<dl  j A ,C SP |}H QV29.8 x]qo[U =|o3:| c 6 @R} y  R !!nK V   L.1r.R\%b Bnn< h}v= y9A_Po e " 6 W l%7eqe7,Ww$-N9-_ [SaB0 "<\8>/&#l8fua@VE]\KZ&SllPT ?O%N5Cx^hF>VNQZB7JD;PV/=o>&j--=3(Qy+X@UZ$@oP-28-Zpl7d1B{"^\-y7'\o-Z.,Q={`Rb'3I`LD f8{sLmV^+5ZQFSDR/wx}>eP+Es 82Vu`~7D"-3N%'a8 sOhBY 6d u'DHB*ߡgߺ(ރ]٦]D ]t^tWk#~RH xEߊݺ޸,߄Xx}`R3X~VB4Gm߳FPf> D^?Jkr6ܠf ڨݣ=ݙ xV _-_L,sw,hJ83d$-E;)d,#W׍كLLjM@hP ZP\;~"m5_~nV.1"87=:MUC5[,lr\)E(N/  Yw6 dX:vv[)!Scc." .   E  (r9 A 3 v ^ = R : n r  xC Q t M   m * A0qy2vX} < =[   Q2 + j M + C r @    ou   I c [ R A0$y5L&S}b%\?pU:\Xm{~@!D~|3   B 4K.Q&10 " .wAmxG "!"]"K"!{ KJHOV1>1   { wvq50 M  9`2N07b)TwhD GYJ?{$ ~ l  $/ "  E< :+ _ /;NT1' [ H!YL@q):]px\ # M! Y|b"X\N{"pyP"U /mGFAU9a5+6In2U^AU#U)U9 TtfJMCk4 3!]dJ ppe $   ` M  ?sC{7XCr~Z7V'9hb1S`a1JzZ_nEa, jxtVIG-  H 4!g-&R^%Cw5jOB#S* p{YuMu,a65>k {jnMvT^AQ,;.IGe7MvFH7Qh@/yE0}5&gp*]]h;|F3lz93 iM!ECI p  Y8  G b C z>  J -" 1T pYpi H(   A  V * (m1cC -(  E  +  F n  b w  ` <. &+ y|F J    t y H  l 4 d q ' & b W 5 M8   OCSj  p }'DUxz 1  5#;$qu4F&N<{ARAT,)EQe> `! n=neU?,%P5:U5Hs?8XRt~jB7M PSH2b*w.NP Oz yY O zn. %1!Bh\rnpsou@?}39/PQFvf3#+v~$:RSgnP``PZI.-*Z:!UtMj[AKFq=@U26;iLPi2<'UR2 . l  V  }?t  /m   w7 J 8  X   ? x l ]WlH 7b 6td7|ZDu`9MuQ5'[f4KZ$ 4H/-:REe^JkB6  Z "r_0-PN= c/Y_#:G!HL|Iw&+l=YgU1"m!x P@MImZAI5(1 /|OsuVb3O?UQ"A #{*/B@]*K7/xP`i zUߪf߶&&ۃ:u W13fw.DK{Kj W]yo3/MZX:\M=1:Tzߪ7 %~RNx,Ucid/k(tK4w7Q5G9',>Bu" NUo}-]1BV/Q&2fH i.BXH xB ~G1(YTWD  '1  9~ & q*l3 & ? 8C)wWQ7%u4  r  O ) o5 o  ^+jGM%[L|'F /= Asg  c  M p |+  )  8 n   2 6F ^w  v  ou   9S:k08R z V  K>` CK  z )L RZ@r_JoY j  xRFF/9wm;*GJ erG}@E~X ' @nwKq/P@$ | b - Q K  k Y=#[ 3l % C@U[Y`Jy /K % j L  j  g!Qxl_ a @ O J Cg/|& - OnxA  P j v E a ^fe1z,$dp? gVTx(}q4MN Xq#g,#f&3i+5PmQ6%2Qv0}rO^r$44mv& Qij!_g'=wl5%4|W@b3ۂ0ڛUgیES)= sެ2J`0crW5O_>]u 3ݍL mVi8ߡߠyݐ0Ԧ܀]bRեD [9nٖ}аחozM`;$jma %2"H2N\24*?CyOPXL3=uܠs,Qsh3~߷Gn'S40$u`tnc 7=LCTy` WwF'yL x 5bP } r3`byHL'',%qs:#[o_2_d\ZjVE & _nj1qj@  `f  vqRyjk/c+T)b1iWN=!y oB W O > s D\  X ZP  } G > -, @ n i0 '  -  c  Q  @ jl HL  A 1B ; q U $ _   vCSg M q ~0< ?  tYc V"]tl7q#9Hg-9;$hw AY\XY_ZC @ Z- \  (P  :  y y/mU@8  P~EuKN<^^Yq O 7.5 |   y-t+m8kD R   O 7 !2<~P8oC>AGY.0:%F7dK: PR+ h Hh b , 2 5xb_ 9 % ' ':_"C Y j!y UY "_h&<5~@vb)   > Ed2y6>h1 s: %  Z q +b SG P ^  tf | f >  \_9k4=  -  )   }{   4   `    4| \9DQ)tI!5Cl 8 e ; U+tdQ-n = q r5 k  ~G/g\tK6=)69OxhJG$/UkVNQ#lJn(>$7 ,K^zLi!j@O@ݟ;ܫaߕ :^{-av];V RlND 8!h, :?xOyvI wM1݌u(Qa_S,%?Cn8צ =VݍD12QvA>B@ ~ 8)z ^v)N5c# {;e\.'b߰ߺݿrSޚ޹bs|Wc6Yݫ޴Tj|6Cz!PmCU-|C  :}5FTa\LjP4xW}0\=SX)X y~?YppjD4<0HwvPCt W(!<P1MUc f;t%Z!|- -S+P< _ dI22sc!0!x@yfN8_VX`4#NrqTItszo;m PfVFl%I4Nfr:P)I,*#9{:+\q*` # >    E ^ = .d ==E1 , h o 0 3 \ 7[xd<5*Z\   6R]+$X*I|n,vS[!WzOwh t~ 9 D "H "#/" J a 3 pd ]F_*/LZx.}@]|,ir!h#Pj"Eds0~5($!!#3%)$'# )"(!I' -$< [\ cR!"&"@! A!F !P KeFpPe:J4(   + t!$c&!!:(#@)%U) 'm((&)#)v (n&Z#F )z [#r$m%7\%7%H% %d!%"%S$%_%%%$"&#%"+% $""!=3Ym[W$b] -f!R!v M^<R Q!\!! c! a!D #m $.!%-"7&"(&#n%x"4$?!"i! X !#!#"$W$/#%!5&Ok%"b %GS2V!8%"D\! 0j-[  \ / 'V\c@ # n?mEw7!RY-  F^V ZQ;  _ +   i v% -O;H9~Oeya'  u P }  O  >!V'C"J0^zI;C86]FLVm O$y\!J p5cW}(XG DEsa\@H5jcny9IfRvidHz$6k;7sMTs N%nN?{R9$h>f`Ai{HN? O[7z.,k?xF sQ2l yL'<) D   LS  (h`   c -q  r ,ZbL?7Vituwg/kSj t , a\R  5& q    +z-};(-~ 48GZ  (   - x  ze)  E  Y q  F[1<7"pipW   _ I  B  T '.- 9#<#e JXXv 1 m $$   s  W[  T m  Y k .T v =| K i - n mCf3 p - Z ",  M iS  RNTH t  + yU/gHT`:^DgS T^vn #P 3= gIo d ) [ o :?   l Ic3Yz W;I<%j(?~h7xmvyiX g v 5 a 'l  Q \  x m  P  {U D c4fj/S 5 @x4CydRHh~   Ym mL6 Se P 1= H  0L 2CR5}@OOza|5  x atB ;]Z  \ ! 0X   +M     ? `#\d p:`4ZRB0%H^J'q#| o e# /V j16s y s <dCaR%>B] [  F$   DA?4g]  hM E;vUD  SH Mj i K{8PO,h]N5ZuG)S;10yRkQIZS#9/=sBaK "v8&D%Qs|o. -hw?.hf~ kD!E7""a0g&r )<]T]$>SXU980JW%gd{mF#;QOX"hn,0os6b}M.}l+EtQDG bi"+[J$#j!mx!&W;,1Sxeq#'Q~*um,Z@qB 6}X_XiHx~ i@"d0}HNp/0tr U62^j SWfo't L ? B7U ML t @ c   3 )I2bRfC* ezGXl C   h ^s |!SM Xn' }<? : *f  `   E *, F~{gpdF<!JR  # )  t v>=  A]t> , # d  n  ` R  o  -  w-5V0X l * N   <2H9 \r < Qy+0l 8\  6XEX y .   p" <  X n f { 4 d  1c{> " g"N1l k 1 e   e / > P  vD&_#=, o 8  Q  X '6J mf&    P X td 6s r" g#   N  >P4I,jp4fh)0Wk* F\ H Q%(K  e {  ( ' | q/fU_0tU_2GuT~`_lFndBcHG,P?]D3  z   *     U \[Qc>Jc Y  } U )NBP8V <  > 3   @r 4m " 9   ;  K I -|xh jt'2,jbQ 87E#1  9 #  '  RHm]   \ e {  , W[\ J  lGq #Q$,sb1]9O x  V sCE [dzo  i 7 d n > m F  *1 W  W {Yd^~"{;(] 0 Z=Kn%e&z*L|+0a@E<-X{< Ly 7p3GVN>L!Szd~t\pC-. E QMlDcF?sC7R E/~yGr|gUf*#%S;ml yC ! T9 $ix_4 EK v+UO ڵB%7U?MPf0ޮߨB%yxcr9mb}x4c \j3uB/+,dVB4 \xx2*&tyzt 3~*lNh!'xAGQwz:r({R&Y2Gl& o<  {MK7 PsWpTr+V]m>"BIZ=So9R]Z\u,7=|&Qv__$A}h<z <O2I`>t88`U `}dma92 MC(. B^XHKhOmj>mn^1Gm3G D ' p @Z}u|D`T|1m^#E$@} t&herGc  ^yc C f97$Nny9Vya9  ! %g_ N+;. = & f  R  0 / \  wa!eW1V3+|WDfcU% q A#82  QdnpO+s?,y  H q   7 { kT+c 9Q /s D/! S i?HI-] L     \ Pxd4b5aP /   DW zf  v uVh A { Bk j$5  p   ra +0Rd-QnxY8>   t @ , 4 n '-F+}b{7K  7$  J  a    4/& I [S (s`( \ ` L F8H&  k & d 7 ; } #KT)3\ir8 L_*sXJ'B@ o e T < " NKk   |=  W3dhPYh Y$o~Tn5glHeTs ; BD 5 ' E\  < T 4 _  c Q =jpCOR Lv  ! Y [^~8)6 .> U#~lp!  b C  PBI0|^Pd e4VHNXvMc6jr&:=1 &=>QY?B|aCa\5T` "3sC].0m jF.\_F9uWtn:uqo O 4qm|T/QF=swZI$\;ۊ,k܎PZlrE `f ~[jZc-Nrl]~& KF3vRi*[*)*Q%)N+On>[k4hY~{!IK~tje&cl[axxioK)u1dhDH&S: 5=%.YM @]'/TKwN pF1=c"@sb+\db+)^f[j q:FcwXmJHJk($ A]fkrUSK 'Aq] 92)u4z_,- som + V m`.8]WWj{*60}'+hKpE#>[Q/nPG*]JyC mZ}' 1J_jREUMz$9t )75Sr}}emC;V? qNRaL 5 |   U Av   -D>7b_j&PY6N!r-T:5LB}   8 \E`KV*; %r [ R    % d Ow4g ,c x]g   x i X m  0I E* ~ G` R )  FI2 ~Bvv i"$ 0% a#$ 1,`ZA|vL<P7k ! m@Q7=.02gZ?i^/eu z9o]=e|X7R\WS V 0 } `?:  2  9q[Qt%l  :  P  w\ i[ gss/Q=U 7 r G   g  OGe]<I O N '  [ &F+$IHb+ \>UVJ V ( { z `v h   Y e#uVhmZ{xy RC% + 7e f ^4\ s |   XA K  ls _r+@9N:bO2h[[9#5nDNWqMM] oQB5;fZ |vK8&W"7Dn{~j P08KhI}7 Q7L"2AjFm7rRx9$/1F!A.FQGhgcMyU5QsmCHsK p%lmiX>{n%^XpU-rLeHC+wlAF tz{T\XFfg K%Hl/!!rrKT.}uabi%-k7%*M sFC`W2m>h9>r+kZd HOFmT=yxV5Hl޴iPRN=R G6&|YW^rDuNr4IOa kBYZv=h%;x v1E@x_yk$74Q{YDX~ H_h 'XM!l m. 8 Z I!Ya2H 6 Ee8F|Yz\  8 c D Y g v ( F, [ p aF    6   siK 52Z ] G iX3@lk=]D&  A K z q  h @9 r_ K   ! ^ 7m   c XF  0 5  <F d p j^  O o 7 =f |m"mYqB[dn )G W7MpEQMIYVA`v5hp~  ^ = FW,uZ>uC e B T9 $?oOixF 0s&6}Xa5o_u\=Q Iu]5 &22[[(^rJxj_7MMpi}{Aޮߢߔ.@&m;QiݿM] Dޞ>F .Y? Zj.E9}6>K18~.\Bڋ 30qݓ:NIޣo )Kא.S1m޷LLߥi?2P37Yk '4PernFTAaCua6#b_1AZ+V*rxnKc)~|.t/}0b6?5fZR"L;Yta k\{\s7n]q+HO_iJm=]zf"VK]f$;}\H|InvL vOX~X6ru3,d4H >#uecmI 'd1qFy72gr&Meu ZL\w"v{%YUa>~#+vBd|g-X8 k)WNh4?YxPlE%mj%yww2,m]Am["G):pY1\/9O.Z" U - z  & - R '  (7  !8%&K%1v!T}__{=I bB"A341K;;  l fmy 6  E  NT!iT  3 `ko]bVFm , M Q * n t >+ |: @<gaZ  ZA3 I Dx w]_y9sVFF@dx. | Tzk   6 < s   Grm' Z   oICr )XkE^.n#h"$& &%#{!nt qC7 5* QwL F P Qu Jl2jnA?)'Dokmv45"=6FW#N3f"g$I%$"4pZr Z     a \ TZb>* 3z<h5>sn  k h e V~`.@ | o*g 2_ lo : n-7.-Z  %n{h~qJz;O Dx  mw t kq I 1 ? .y -5  W}&co T + n S :YUI#xNy[!f&#J>Y!~T B d f !`0]+ cg'{2USnwk0gLs'M#4MX]p,%]]Uh |47:dJq8knd[gXKigyR_5& 1{kCnQD+d+Ib;%+xM I' 0K !kZcjmo {>`u ڊemJ amvjZA+ a(l =#5f 'oY7;tz& ݞ[\yl2/~^xAWx?;kEK0X<@#"(e8r)~ [A19X\4i;*yhPXQ*Y( $Gq == |oCs|!>Wv3 b.J"S)f)WyvRverHu6t~QXTK$nec  ' eHsv>W#?S'e\?QSZ^Z2@*#I8xQxj<P-Xr,5mSJ #Q=aTE9/&@P7 lk [tH(DBqCsh{78Bl&ihAn   | Rnz LKw+M]1\Dg{ [4I1iQHTwO0o0%qLkFx.Zpi }Uu0hgJfgm! HVeL !eI/L  A oq - % VAQbN3+ (*Z}bT[ ^ 69;>m=@TG"4}hd[(S` ]A %p{G:{n^)>W9&3'N`,PJy49]lsjm)~o&4 K @BeV4/o< rRUm%6'tOgzFXB",l7Ii(hmHiw$ Dk +(89D"+(pzO}I { Z H E 2 ;  K "kr$Y58j nsz M.L**x 9 Y%=-0 66/ ) 0 so/ i' wP ';.A,U,EK>.^a[Ru D  $  jFaR,= P 1rv_c J <y-s9 . Q r      ( =mA6H  $ |~TbiUi  K A Q L$+rDS{y{<oKDXy , v {d4h   c  a ! : w  O?[[?~T/rzw5P(t<]tW 2!uNm/!S1 $~ [!L 2J &'oo*e%>fpy)eS;p< m$zjxOopi{K><j:,^lAJ0 ?   ( jOG"MpyAvS"q]j3C C 1 $s:f;:<w ] ;  Q I l&R xP  ~5XBAyl3lFyFPhsL"]fG  5 Yr~O o q B > [<so (33]-j^4@TP5   5 WXfM^Gx5@ 1DKGFD;*  I ( v i q R <xV  R  Z +wcttzILL@'d3*y.g+(i8"obYf}#x 'Ya  d  | fl?j ? x'4JuUMFlkZM "9yBR C \u~H23B_Ui4_c 7@X#`KW"P 4yv!eZyyb{L1}If# el+X6qQ \x6A+l.64<%u#2,qltloJ54KlZ5Y&(X$ V}L A?a[-$Yp,CH(x?s) u;GY;`&ZF/WA}JCn$UI/ 4bD < ;* Q}z.Da\kbx=$hfZAp*T-uS$W8@xD@E%eFUnZ$bO_ ?  ?N |`&;ae"8EA8sG8    ncA:iGB .Fr,\qt)+!  Wc i  VLf7 C VnC _iaVtb EQ j q7^V`P)9cvNETeOGRN+ FW:A Y\Fo{& H6>ovPNEbHfz=rg b V1 i,o11>c{3// H2  qx G=  9 6  6  Y2S!T] {   W  N  wr T u]5*_   UDa [ \1   1 + e \  | &   '   OVO   0' X S  7u{K#  Aza8[[ - Z 0 b *lu2TwS j 9 O {    q4}=!8 n m  Q XNUy^'5koM 6? K'9({ {  F t s@ j R X H[Ee}2!Pe7 y  YT Dy^ xzbY [ E 9C : q% sq@g1   ! ) 2n B(Vd~I&eH C09`\ $Q  { a2Cv!bBNV6Q"\pwr |=a0*U12 2jgdQG?%IP,mCGo vPrBc7. /h!mB'a|RvJB~0l`[S .fOvMnc;Zq" ,@b&7 K5 aNAz:&w- 4gmYt]ul9O>Z;PE-Cv3QB<kogx>7yR92u([xe*FA^1b9BL4 Z]D6pVd"3e%)#OsV WKiH_aJlzjW),OYU} tHigv-M&F|' "`R7@g. aR0Seq#SIE H57BeD & zb.>=o`B6l o zWt F{d:/ v p ! ~l 1 j0p1 r  h ]  PQ[,\C" [  ]M B/  L  I Z % A !  R}4C ' . M   pl 5  ,XK C*OQnf^6Eg - L (u]< 0 PFD ;i{mG w^ ` uI 4  K  >  n > D {e `' 'H cb2T`?YiUp; `w Q~ s _  @ :    $Q  oE s 5o 1 6vQ    CxK`l     51 V39%n = 6o w Hx {  6 # t 9 }< (U 3  Q |;Z: F\F"\n^f\%4      _ld: Yi`Q 1t AcJtj1W?$0._c%7o}M89+*~w u ^ 8p {>pf! .Ui:t54gT8IC N%-|UNo ,,  * 5  cX ZeL9A;WA5q-/'HZJm( g. V%|d:+> a Q +6,iH +  +d ty(J((5 b!= MY&W, /:Jqa~.x"Ojl#'sG/(*da eV K| 60+ =z=,$n=q74m(\bPC[CJkO``uzSs"U 8PotVGGN8Bi6RNy1gXdWHw7  > vG f vDvuGH}YC{6'/rA{9E.gC)lc FX\=Rv%GV ?x1I$3J(]xK9VoW4F[dWdP@F`esaon0aLEG*tq4Mw,bK} `  j FDmjYd)`86W,:g"-N ;N> oYi.}*S+ 4M.hDe[4781> |K>SS%.:1unEh dOsQ&JncR3)`v_XkyZjK2pNLYvaEov`_xN^74f<E40@H{/""*n\L . E Zas ~46SGvoN v`&]{vA]9 9   C  ujACfW0RRQ]/DB0.,[+]V:M\$d qk1u{};8E5MS o>fcz&Wt*+82I"ShI@irbc$M8MF DtO[1l1tA< B t /a F u  % F  . &\  X- #%\]qy7 {  7 q =[?FY=A R M xN1K  g1. : hR 7>  Ep cX 2 :Sqn   -  0f ^ ,o] [ @  d+  u p a t'[v%<LS 8 qF w h KB fH XNZB  < IGR) 4YCK {_F E  j t SR;i@^z %$K 6  a M$ a ^  z, ; }\Xgss[\ Yb AP_" U i  0 C zG a?#otopmzra\T{T,o* V mj \ 7 } R F 7&{ {kO!JtzaR}7x,Eg 6pc q^ A G xfl##L.ZU `iRJ=W{ Wc}deJ&q~Izxn1%81nRHc 4EYH6e-a` $ Nqt  -!|IqH/MaHI[0on (MX&C<>wpH 6   X"  b - + = ]  QEiL|E|Tp}963*0.965#=M*`5FrKC op>/6tw  ' c q sWn- ]m ]v'0_/ap?>{=!JwK; UoI    L S I5,hYdyE p  |,GC2+ ^u9}b^R6Geuh-)yhXynJGtgPN!'# i i OR tTN/j_"E6O_,Qh:9B 3p,Q^!}B>}2]4 0b:B b"I* FW *i2Z%J.?%[&6hnb%]"xC?4H+-E?Sl`]x V,FVHoC$N>xy N+a{ >q xQh{Ch5|< @ |K!kU<0.Co_: LwT1 =2iF^SfZw Jd8z u*a{">lmK_@mb}yi;L t  O& v bd 9 q  J80qbnri W b `7aYu^x , |7] ! 0   b  _ [ 'ijvZ$oJuu W M k  |.p}\)e c0k i*0 ${OyiNyW|0$lc< *  ? j :=brOHEBso e z ` `O,w\L;an # _ o$ a|6O.. w'W  M r;  $$j U * 8w = H,  rf@8 %   0 D |b  k c c w KJk7Q M [ L]bpf  Z2(  ZnHHL-(@ Nv% a c- _d  %  x !]+Sm!MylFHfLy.xy$! @ RS_Fe g mt5? pi . m\ij0A&<bA!J)zhW:G @ 2ldyw#0u4 6  [  Jf  $C-A":{\Q)a##c- ?{Y>2DAM[Ntqb-G5^7~0#+ymFQh ntoS 'LKKp3|)}*hH0^{2g $DV38tyK?\nd6GcuMmR#>&v2ytc6#Bf+ArOJaD *-L roi( $Z-'%v[UX\l)~>i@T$66AR2A%(zuQ{8+wWCh27Z0_9 .!& Oj*O}R82rS~;2hbHHU)< %=2pE#2y9 dM q9 A[dho7UI.<h  5   8U>]A^/|U V on T B y >   V/@  9v 5 x $ D5ev&[122s D G(@4 R y z9G}/ ; H | W [  e% s YTrC ah (P Pdo, q+*C $ Og *x4N  t7 |F \ @   P   v` 1  Z u 0tkjkF.W^Ecbg R#.8C>t?& ,p - _  A 5^<u9N=Ia n  5  ? zBw.3GoA d "O2p|]0koWpda"$\/'\ h ^ #`.u;Vq}p $ n(jQa    ^u[qTxP}uCE~lP?)$NL JT  =v u$|:\ k U rT 57dq[o.QMnYt/q^  pp ]J!=;uoc / ?K'F  {] `4 N hW_/- ':p|QUC3`xs*v5fa _P{GN@{__fM6^U9 -T~b P qSgv$'~pm}Bt3"f!VfuWrFnwCb6puV=/N. 5 r+Zl xjdC}R ~Nq}?%I+h%A,NcF\l%d/1k@a4g#51]@W|; [!ds2%Boe1Nj9'830UtAArrfsi704 P4bm/0SXix=$+F4$%jyYZi M&e/r8XqcU?mZ8pP6n `jIK|U."L6l+ZgLdse;.6zXO$EkH& k@OxD}fJ uq-HH;Fl $v  j I <  Va W1 8K8 xC;W< k^U@y`]'  ! l ^- _D "  e  \   k b  h    5$K Q@ ]6 td4u-j{bT_   , : s ) ~F fS ?% *sM&>28pu PI -I1=O1 z     / m ~ : F ) Ui U   T  7FG1+ )F5}H/IF/S(| G Y H0oQm  4S?* x @ 3 bUy` ? ; {gA#o p[ 5 Z)[  B ' i ] G4b# I   :&&f%v <   O k(G=# 5Vb_  j $ [ +' =@jKSW|#U7-LP%o\}2A#1   D> [D |X/ a3Y .  W T  *  g ^  n L A b>PD?ZnY/~Y 8{$FvP*ZJ&tsak2JI{Yil~0  d[h JS 0ztES+Qv J2MVEI)"bDYaVl]'^ W , fx HS;iv g6BFd 9J&>M,^XTwo=uIC?u=7lu]L)cty Rd-ayx?=BX}kqSePI1I&>hI,|qyhY&1$V;$nZs:(H jeQ.C|uN&D[= *"05ti 6-"Q6j7|C X { 2 n'0&tH3%|#jl'.8[D@eLV$,A5$*B:$f'&B ]"Q$K`  5  6  ' @ ` I 'y' ,2}PF 8j 3ei| ?Dvh`UJX [  G p  2  E # 1 i  U X,*{aV A:  TeU 0  <~ [O GC7EG . S  _8 L -@  y 6 d   b  ]wX gpGDi>t cW  ~bK`8 A w C  #   n"m#ZCpN1  !7 >q ] m h~%k/*O5 | - . j4fTRy nbOHw;  m  i  )  A ] =   ~rX IV @  `Pi  ^  _ ' "  H <x P  U1G 5x 1r \D9J1\ x3 <87bGt2<  FF =Qw V~we }  ]D ^  6Y &UkC >c?"cg@qf;cJG^/`U  W CD77}Pnk^`IE_FAn@){<@.:!/~hR <{T"H ;EBXRN\zLxZ(G? #Pw:=bOcl@C N} U?9@$00I *)T\eS mruBdyu;i[Lu Z"st@tUc@5!O+>MK~wLbqilV]x]tx@/ 7> U ZEsB=r[CaM$*Eik#k5=I651O|VbB_>m"%FCa51eyEt"8[cc-q344gW&hErH  , + k8U{A |ri%:k/- {a! .$4K9f^:f2bP\#w MA > 7LlV f2 F"  e V X Fu;eL3IAdK0n,4!dYcf 8  \ SYX < 6 k E K%R@aIbE  . A JfyP Xt  a T.N 1f&0O  bb^@R{ZV Bpq0P; ^rjI;@ 8 bKXNu Pe ubp =  k Yp } [$ h:  S  6#  >E)TW]K- 6Wg WI?<yc  7 / &Wfw<  AA=#  x $t>2  us\5A E > F V S ' Z FE\  ! }?\D62] `Ma[.P!%9 co8VR9OJ$V i 95  [ \ ^  i  ].9CDTIM8Q x|(PQ^9>2Ne6FH1e Nm    YCx]X{0<=4L9H+ecCqf[{ Oh"RLgnfqMx4M_V[TsH2UM]Tfqs1KnrvUA HpuhR&m lt.RpCo;ku})5X7lJ8_P~QU :N42FyQ BAbKs;tuG3]H7 :Io&nk,"Dt,)t@:=YM8eI1Obv0]P6% Y&4 x k < ,yQ>\ 7 KNFbxIPy V k&g H&>O#aO0  D{X cE  & , cFCZb@#\B`woV r[ F| 1 m r8 X!< n W  a t )Xm I P  \ Y   @N?LCs'  p ?  o 0~8u( /" *1 ` Y7 y  J^!& k9 M6Jj d 8 WkWdxwl ( l   W x t h [ G O{CkB? #-2i U]`  Td5F Te lR? 2v?H' qg a tw~b ? , p; ] | Zh\?Q5  uI + s X Q w  /y8K (  wBj 2a+ ( )R c1-.F E0 < { .)):'\tr, }   t$ =y/aEJjf 's 8 J ~s `  k EN2@DM0U-pp(HpZV6N Kt,d{F5'#lFASR9>J ( ( bx _pO4~&i_ \ (kG"3?@i, SW50Yw`0Qq~$2l:u ;/F^.H\WPD,Zhr+2]:(E];Z&86}!, m|f {X vrR@PU7R< D(OoQ+?70y -zW%@F5gal| ca8KS q38`pTJA-hZ!,dHT=Vo>ajn` _hd3>K[V{1">YsB UDK.j6 H#wH)1Ffv  G%&$kdO9)cbN&"SI,2YQ44>FpS?\O]4Jm@Ew}`H}1DgQyu  'N @  = 9L <,XO ~ G~kiHNJ, 7P '?  y,mte Ig | :   t5 w  r ( P hR"_[ Nzy8$HCSJ~j 4*KKZZc= *RR o  U   y>qD"( #SED'D^ T eW SIUxjcO*,vW  JcY$F  EX qSggl.\RO'*&W]WQo n} DG{R[!N%.=(&aM4iy P ?m | {2!X1 }2Gd 8_'RWh1|`~A KREd  + ,l3< * L jt @vk$7QYIC 0}Q0 _gb-+vOj*pZ}  3  Z : D f <  Pr+ZC;ntCYo:  9, +KJrj pB53|qX,(=EeqNO[$Hj9 $xS(< \Zb {* +$R^O&(r97/)s T!wo ~^d Z_L3g^UzC/jZ%mL]LFn)TZLhro/eId| 6u  f[XJ FBX~f)nnFOo|SAm[Hp[AFQFYm9M? 2&]Qa3_: !V5)nI hoKF}J4e g^3)~N|F6t#~KH`P1 QEuJU % j X[0C;fC)(X 3Y@  l  $ a f {;)?# SC;?  2  tL4`  0 Z N ~ p6 ` UYq?= 5t3 ( Ka  [fc:  ^87K.mQ\^   ] O  $ m  "VdN 9:j\[{83-Op }n u( _K  ;  C#]+Q n # lz  U6 z  6 ;  y{/Cc3I  R "  3i q{< ,, ] * 3y ] < T 3 =1~8 ar6  =%jk ! %u4J WM6 A 3' 8= UC#q <' o tD U  (lM8 _ y (E 1 @ 'K O { ;4nq~f)l. Y / :be~UJ K#E/cR`tt f : _Xl.9  2(   S GM\:  A  yPfQiwZU=%4?  w s?R8 [ 1-: Z c %0. ;z* MC u N}l 9HOr:k;*N{"@/o`s1O Q B;LNz   & NV_ = c K_]  < &E s2 Jq  _^9=lu2w8]XSl' m ?v{ ZY n ! d NXCjWFg b}P*~b6 ' }  Y k2 S L  3EopG^)y Y5qKok0Tn; I S) ly Q : f  N z2\ mM<8QFd&{>*Rj&7<83Vo   gPA@3 Z{+ *)%\ aH@f T  @ P1 5*z_rM*Ppj_FKbDPd<, {.E _M  zTj xtN D. 5){Q* # # '06* RTG4wwj.\p? Od&`q!_Y ' uc -"H*R}UB B`M 0L   ^ ?u).o C5S?4Ga:N|1  Ir bsc g 3  ~G- v   D C  C r  O  \ P<@x]a#GJ OHTn 3 |"s . =  22 jk > f s   !  Fp, Vf Jy=BoKpt@~+-v,fw %:R #p  } ' Z    H ; * z [ . o  1J  A+D*ZEv'`{~F o 7 _6 ?B@Qq05k - <U  7.1 9   d | ! [6I !44mZ@"3M4|X?Z[ p G LD  Gi @ `1 p u I8h8F<=#Kku-uv? F 2 [ /Ly{1B((n7  zE  urzyL g ZD  lA{i,2KZ>'&Cylbh/af! iO 3-t,|O  gi 1 4 c T |_ \6s wI|%HoxA2R`0p  CG| ?'Su*oOd~mE)VBuZ-;%1h$uz4 qs/ igG,w7|&u;j4D"LUp52{ToWL :@D5`+r< /4Nv 2S.#&, t h: oQA)(v6*vrv<,/X(D)UC1*`IL=yQ,j\&2(!z -tx6S x ~  9u[1Bn10r7LNB6^c/0pE=bZzz@   t 2 f7vI> +@R K 8 G ng]jL*;,#(AA x' !hvH^CT @ m1D x K 14~#d  w k g b ' : Utc,VX?I 9ZM2Z*@4*C_E44")~Ns-( Y D   cV8f5K"O@,m!^3C7!+E&p.of j   N ( v Q zRQ:G|'D8} KB t 0 L K- 3S ;_ #o N9?PRzZUzA!=H,0 Q F ~ dEml\ # 1  / b  Q  h    s|42  6 = _% i9lU1uS  ;^ f tI  +DD9SZ W P1$ r q 3 d 9 ' _ **b}  ! a }]m !"'ZA:`\]2B>V^yO_2!}1 t  VoZS>9B2P|O c*T<,2D0;J@wy|=Ee`   ow fFG$AJ?HYN9htvwR$g9zRdU@S7:wNj@U* f KD'>; 3/ }a(G%,R[`NI<4"XY4Z{5 lsM  9 0 &bx_I. ^ N  a0C:Kalf=3qV _CPJt%<om-qbcBnS(|Bz-n:d   5a s=XDR\I"7VLjLf`3*at\=h/$I iE_C\id'm+w%3}pE6^\! *-7;pTcGK/|HwL0N5-sqR  6fL.[ px7-SJ5#/_sS'l_/Z ey;Yu?T\  A S4  b [ FB j  c g9q jx>W?>,hfng.:uN J , D 3 %Rqnu!f0>A K ]y /   gud8 ,y  K  sk@m7]6(x;Kh  ]5 { _ H Mzr+* # 9    ' X 4 rg t :- u9aiSrOH_^`|"mE'xWo# 8  X ;- { i lu U  ( ; A  C }  xHlP"6v  P RT` -nxKh| Ab J  u +T mi  T L a l k M_|`  n K  i5AA 1LT>wqOXO3EM  E -] n_Fr4 $   O X 2  _E t V +  _o  z,}+ 6M  / ICN  f{ Y,H b | i? t   8p mdlK_}+Nk92tv)d54V<W'veU~5$z  u8 _ gQ % d-g;A|W1^;#]I16^/?b7cE'?R,To."cGXq|Tm7d^[9|)O-S=4p$K78U d _ 5[x3v?#^|}CZ l?IV;4Yxgtqy lHW]s!D|x_*F /tSX9ZQZiJr=< 4 #]|-"o8-"9_#2h{2II M uECEG=H;C J  @:aT^w}w)u{2+LYwe[:rM9&o:Iya/4DQc < +   o}B3n#8d5!~]Ir SuTNx*    ~ ;%'k%H~pt6;MOh4m p8A  Z*b<vvC q 2 W [    e $h %  + AoA(TN3[uMt<g=1<a` h p 7  f  J D68>zA, N n D 5g ZFTef09 7 Q { z  zKt~lQ<5/a ?~O  5y ' A. U|5t9eg?`u&EQmZ$ ( M d O f 7 *  Ic3@G 6k s  m ZQ@,  $ (+=p,Qa=m,PJ' [ h e S { N V n kTl h b #d)r ) W [+d y{ 33`1e.Dpy:#pk ~ ; S+  ' > Ej  O dp K(6i ? H  J*l  2T"l | R@ M1kqchFGym,  z  i  YyRP&z n;|9dVR?>RR klA'q"+F 3 Z:,J A)9 _N1on`o{hD0| -YJJabcRU!J?UcQ-ncXyc2Gb' K _r@ 'kp~.Q8RNNDSS\/ T$wjZqrL2,6[)Yh[jNiW U  g yJg 2 W ` V  i x  UM:i#zFou!gw H9K '1 4 zx o K bs z x e 50 u  ,tR^ X m S , B' }u qd x,-nS-dr}G{&N*Jg F    w @ 6 A 4hMm  , y 4O l " D n  X  u W #  +7 |NXG.F # :O S^gh6@cd o )r HEZ   \c' q=u:e  njlv    ]: v,i  z;lV L %Tvp   K g W uO LL  b IX i ;K i  5 8n*yu    ~ _+[O-$DA   a qvjio+l b | :g{3k][('  l;  #  ^ b u  ~  I<| h 1  V  p  d U y}m^^B1  /`p6E9]= /" / ` | L  c KsoB| \ ' = h5n a%y/mWj$ K`oPon2 xY_ " n d}ou z<k\R  < jsL* Jk*kOw 8.j:gDcdE+F9szdEt"#9? NnJ metj{|P'#^,u38-[~6yr jj}z3D @*nwFO1RE j.)Yik]k6{IUUa,to9{=H jK4:oBm' ^@Ty@AHHP{ Ovn?RL? K+lRo].uQc2y9x/S5 h?K*&5'a6J]Hu;,~N@*Y//_VGoZ8]bi_f]Ha$`0rM . 9H() 2-"x~vUf<`W0*%X I%yE Zw{3GozL2/?nxEj|M c) IHc_40bDw/x  `  s DY1[: & m z    , [ _ `  7 D ik>XI~e7LL/ @ OB b/?2- = K e &  m    t?    's  g.{ U  MzIr  w oD%P mb`x9U    | 4MUc`  )    2 >:Y/($rQ8R~~3  ^g -l>x ,5 Kt3  H ! Z    TQn    r<ER  w ~ ) @/ Ew{$  TEQ Z F J 2j ]~pK?J  Y <   (usdTVK] )qZu  IQ (  V F pl h N i8   ;~F[ q& f5 ;  YZ       e %NYlg Q1f<I / l9m c ?0L q? *X `" X   { "     K\  ~5I 4 ~"}h:@]\HD<=(RGT RkS x ' R ((  iI~Dn1Lh, s?*f';VR1n-6Bu}]%s.%Q^L "!< k Nhi;7Z:}_b;7<H;OXF\ntKL.*Frt)2/Z#EIM@9VqPG/cjWX; r4ZmN<]>Ig 7USYk JLR)9FW(o:wy.GW< ^iWwUK߿Ju\ sbmJ+w*7 )ByF!7`FO+W7C~&6gF\5X<qy2e)IAY~Le[E_%BAX W>,NEkiL^5Ul3mwUpKmr#K_ufz{uN&#  6 s6 =k-f\2-;q/ b8LZ\vK`JqWn1iW|S4 W T .W%Y[ir6h } fIl+G   C { U ( *r}b%yW#oCl@M]V m P   8 5B &$   ) 8 52 A   B 5 g`    Vj 5 k Ej A\O0Pyc% x ,  y+ > I  i 7 Wi } 0* " ;8 %hH   = yT4bg E 53  ? CQPY+  ~ 6  ") d]c8 |@$  lPS5 k {qk 4 @8_a3 -K'(zyl e  :^ m8 Jjnv[esq $s %   i 3 T  l : S \@ d ; f<e$J N.#Rd!Re?nDZe sNEG I   z " % F U > N L 2 N   $    P #TzwRR1t   7a 0  4" Md   U 6g / S | p 0 f ] . h_#o '?EtpT-4>' <%q%XjxMh5cYu@C |    e 8Y4,:NgZ Y(3~>o( lX+GIGuAzOly>~y.:P" }   T}{],,R0^HD:sv7k"BFSGoC 06(hgOMj\&dbNxE V}b t)97:Fa-B\8S^^JhUwR&DS:x'<_`gx.Nc % 1Q `qdCm*t@FM; uqDB[|6->V?sbw=Z 7 _-0=va36QD 7!}M F @ K ^# R\p,doz`  KN}me^Zb/~-6YS +K | hZ BJ \ n )\y_ (S  k3#?j  q<}XRU Z) ~  s$l H8 !u |eb$9<FQHrd@  W Mpzk) B I t !  6N :y >"8E:'`   8 =%~lnk>Z. ` <  | 0 0 L&  )(Xn  kaz-DkQ$@@cK ` m a  S R  L ! +   kj    0 e ` Wq V $ r [  n 4 ? u 4 M  CR 0  5a2eyT{  (D IRCI ) , W e * U  4<  ]: %S N :>K ] .[^$F7~ sL<05K D0f0" 6 L:~ ^ , a     #p D $* t g "  sf0[S@M@Y\s , 4 I H  j ! E #  _ G N ^tmq # I S   /  !tIn9Zg bYy J}3gu ;  H$&$ j W= 1doJ F j   G C C B*UonwtN$.H=o:,}loZYP_ ' ,  y M @/j1'"Dg 'GVNp|Qr1 Z0@r)1g?efUbiL'  NT&9HY ~tG) u syt|3b8`<nfh?~*%np \mI^?;zF05{qh;{"j)qv5rYrK+ fa;]lVy4}&)O]3{MX =GwrE9.o"=>`wsHEi8~ j@oKiQ^=hayR,k]U }bcOl+&G8:\{(:w+ +_ a -M (fW6sre?7X ,? ^FEZWo%v at+,sC2sHe~7n4Rt<7ok*tYsK0vldWAO_Yci\"4 (^ e r  g x+;1hTZ]{zd CzBik%&vU nm4<&~Z[LOnx|3DP1btVX{ '`#$C@e>${abx#%.fC;4:\QW,$(d B #  /  3bf]#  <=][ZrZ36u0G{9 Jpz  ^) Y "1T0Q -:duMlf   V/  S 8 N B l  R ^)Qi4$TXr\Yc:O2qRot _1  {  XSP , YLy N  X  =d  "Mm { i ~ UX G&v~XJJk,jF4;"  c  _<P f [[ 5b 0q   15z   !   e 4 %K-Qc&R=%. z! 3J& P 1  .  8 y3..  OZ  &  r   *iIGX`vA[2YkEa ^ UT S H Q  Z  Z fvq  _  2G f   z HS@ W':v6S:g{:*Us%MSk 5s^l p 6  SUm;R jAM ; AP% H [ IXT!`FTru:i}EulAun=\Y-82<)M9}7O < U ( 3 + r*/tH^6;a1W8w~+5mKY0 u8<Lo   />x3La5m]SmWp5n?c33$PY=#o\w)IKD!o3 / #>]o]i > _ _ ( t   5  %KGz\V:[O~+L[c+jMQ" O Z B [ F5 iMf.02 ^M VQ 9 />cFa (f  #[3[ Q>\-$yIB,0K `^R !   `       ' C +  k / il5<MW&iZ'W7%Vpp r-*_! W zP   1 q Z  X   z ` | C?)l+\  K QFd W92 \G&\|`u  A*v"  ;f7Y  ~ y#s G?l ) a- D!} RD ykym]&A!F/PSjjP:91Ot o3 C  7v K _   8v * ; ,^ (  F!( I<9@m>3WyzN"m:(U S+. + & U Rlg  $lbprK_{#d(puTz?+B;5]Z$? *$Y0knEa w { eawU * %# <g>zH|2{ V> H( J ' U*#jF {8r+">Bba2HLS'C x8/^!i` xWU@CSv+Xtwg5Y  C  6 EnuXR|KfKFP0GF =6Ah vvT8 Z W  6   8L s $C!-|+dj3hDoPvXV2hcba9~v%M\SiSK_K0AiuWSYr 0I=!;} pP   hIp J7L [qp  K HWk5\DCm<)*1 ,vqXJYr{ M je:~*Y:/o  nlI\.H)hB7H%vMjc#n:og1\< *6jL|SS9;`|gKBs mw 2 % *Tt{ xN E  9LOyl|D]/Grjq 2b C|q~ kGspUg * _ n  ! # YQ  > ! D 4 N  nu~UTbg 73,6Kgv3 k 1 o z V { 0j U ! @^ 3? TLCS_m1*XK) M ub%n^prC H >BE[ 5 v a@|%-AXZjLt_m@{}r/b a6bC}4i zv 7I$ L@)u u) G h)J:rg  z b90 ]I?~J=/ rRKau!775z}z[)* z .K X +T6G2b({koa_F5t~J{h7 P E j T  5 vw<JJP"vnj\q?X)8KU (b3t"Q '74~k  oCL^"0X N J FHs4\[oTSC(8$x7ih5MTT,ZZ5{$ E %TB5 j    7  ~ ty3klDrXV2?M 1Q j|cCo { D rN+ I'Z]02 k t qP HdrYBvn*x|S U P [" B R %GZrrn Xi< YY  P  F 7[ " Q & :;llQSf$0&B  y  P | T  yj;} D AO8 9   x   %  V:InnPsEMP( W _ Z  EUH_7 _8X> TwvR?jM6  M @" j  l> U q h   I d HWp;4r@5?C@S.gUuR#RK@w " . /Oy j-} U | B \&0  [~^\)mBM>;S> ~tn_pAMi@d o*Ys 8mj2e9=o:IDV(O-GfmYW6]2|vUbw3dMHwopo|7x^C2s(K m,M{HZQoG D`t`bCZ5kI}a3KNJ[ *~o;;o%3kP1kkX;OhiS8}c![FC=H6B^J]>`H  _ FdIY3)& Lzq/w/!QH+H5R<'KsG%_Q=lp7[P6{]W@k< 0un:   KMIf7b.Y&vTCV(Q]a8&!9`f T:'Y735&o^x4H5D/N7y3wT~3 3R FXIB|!Qr\gdko  H}    L 1N(l1C3TL7`yWI[q$~?j|mu+8L F<$@Je;j}&s H '] 6 6Go DLz]si9TYFIqx p_U&#'DH{ibKu2#kcC -R!q#5u[6s#Yhsx%2uzn_Q^]ss_ ` #2eaVFQyvtYl)!iJ'I,\J1 VB#h$+)e] }> $zJ<:_02;~BwO]; TtCOpfN&/ |X)3jS 2UH)xHP55!sJ6DZyNd`Z'av8d'GpH 93:WU!mPKP"z L].\%]85F[R9BQUImDX M|  - 6MB.Gfw  p6 = 3 t .S - 6 (]d2aH2f_&&( J \IRq Wzqd$HF  3Re R *% {  ~  B \ D ; r   fa$Q v! gL* <\;85RWj -   + \\.#Q!Mf' e4  I R M g $ >pLi  a116 pQB R L m!=8T1 *1+* X s)RL | Y` w#  os 4 j j L P%$fww  W ~eZ  `' y 2 # xzreOt )g`yc}  @ V Hiz$PT'D\9oYRibdp/UICA)l BP & )$;vF j>l 6QFe;7]1qE0my[NM<3o? 6_f#r;m*:M#-[Itx[)]ZOTw; & VUgQ/d ' \s Z g 2Pq?n>3P@F!d}>kU%BT~@l[b6=qe/+}J2Z(s[`kw^~[h_3D wH A odSKv{ g `>NM}p`H%r;#0CBitqWMYQs-kje|#uYY{kKSV ^}!Fk=c/!+&OLkZ,^ixigh\4W@~ @ }  v5 $ ]  OUo@&T(uBKC` ` &   zq|`8Ss  y V m  C/~B0$7 ( a u 0 Z+* a ~~F# 1 yG\/F-GaNWDam:hh 6 c  ER  3 i.  #[  ]5p?S r=t Y 0qMJ Dkf^mK&ZkG?*y{.xb9\|hfq%#H  L +Wjo:iP">9i8NU<^@v w O ;   \ <utKTCXA)83Z"QevVv\j("TT`Fx6] Pjtj8cx`OE3#gmLgXMYf^\8IC wlKp5Wj 3jjX5l;= `6QQ6a w O \ 7 L +1 |&m#@Wg>h.:y{_Pn+^ VJ2 U   Wmu>-W?N8k w bh2kmw  r )  Wd Y g  F6M[u#sA TLf~/4z} 1^0 0 }~f     fnG h S f {  CRG/ ' ea}Vc$}o*=x[)h; , ]T u    hEQh  $  D B :; k b C z }   /8 $GP(pv 5 9kj   *b$r~=e!  ,M , F. dU>&!kO%_ m \ M qI `t3|gDo7AB   EP aPrP0 v 7 # L  ` j ZU'N';5#J/=~ojX #zG/]q Y  [  L  -qd9 {]2  ,1  h$<Y6Qzt8%("Fvs3 'D {   !w \  O  , I  D T  Q ,  LvdhLu4S  %\ L =   -  _n--:\u -z  5`F  u@  x "~V[13I<6?l|0w :7&cul? ] e   ah ]VH_08;GQ3xhfod)A^5EG(#Y{( ,L >=ZyCBZO1z i  u Qh ;&Q#XWvl1Ow"y3tpQtzDc Q\=|  R 2K+(U] oeV "[s)Z7~W`j8X8]:*}jLh)eBfe_?vK,!r'kUSq\cz(4G2F]"U h<*(,jY^HAmm  i k gCn#'%& B{d@vGps6Xl~@GE7 T gB`rY&C+   ACGE L,^T8pekh.I\]8<~s 3G HUXRJJljoA.uL[$,{0  PcV NgikL.ueF D&' VBbud8 ;~|z}GEb%[ 2 ES; *ack -g+b,{'^qI E<>dt(I  g ' #   cU0s Z?m"rER#[l :tGd6m@p Q   N J'}<   . 1{G,Kq ?W&%yiJgQxQ _9+ Kg{ IJ ^F; ^ +% {   5 E f  > >f)?19`~|?;RN ; W z 0nuD]`Q6 R M ?  - j e2@ V Tw8 WXA63 M a6* iYD   Q U 7nFR   . &  a" ]TSUobQ8?+QGvT`(K O e  $. Wk /BALh> L wQp~CA g&<ug \>,M|1@hK>0;b DVF O 1~ " X! ">_ mfv{M, 3o-&rJ6^$7 8X5J+0V+w7ghT [\(D |) |g 5!$ $#}$%T,7TC2pe),gG '@`+,s/}hH m Z    wZV1npqoybr:!S3%QGZ h   ?  I HD'FDPS>   B B 7# .Y`7btw-dP\%=ZZyNCt;B 6V&  _ _ c  3 a @*e"DXy)V\P=$ z UG`&R@ $T i \D  r BTcZ BP;|h.XUm a +j xd:>/EB<Xb4Rx@)$7KWb5N_)>x_>%ke>{!.v %yB & ~4 t` y  c2^,- v ldH*kr^JA68#2aN8|R1&vB*fw]zNTL2t* s Dt# <  _ $ -XdF"w6ukS091` \#)R.8} 1_3u2   vTF  RP CZbJ[u ] E  g8P4E]1y VF5fx Q a } d M Q9 F /{f[\D=as'IrFR6r8ZV,o<p? ! -  {  ~05  8 Y J  ]  { ?"T/<"7rJJxsj,N)Z@[ O tdeE+Hm  i| kSPlE n >: b?B A^(Oi RK 8wp# A p X W  8  D  !a ?}  - Qx   oxnPmz}#j -ol6{ j ?I RigD%{a1ZI2* Y N. y * K C V p\-)vr%R5Ohg1;H%[R>hj/(?}` 6  $  1 $T-$@N  _  9  y  q(mL1Rkntc6o&=Ye9+VEt*#  p  % ; ' 7- 5sAevW],d|)t1 9H6TIh xX}{HEdo3 N- f9s$Q`:|MiVGUx^]uO,C&z : _ya/ ZcI %~&r/ k,ASlo :-p6? |Z, mYk X#;z)teQM8? 7 (/Qr2x- 8SEO^I]WF#f!8k_t} E M';$UJ"    . nI'Z@^As^jd =, FlW:4.kbvDl;BO Nia4-v  aar]3xxkGzupq=9sn&9u_&l{1Do&#H<HL/I#Bz? !-s0?H^#5SKA)x,U^ w u[I^$S '  > 'bRV r(SnS~ sz~d>|+,4NvW7LjJ,!xYv)AP6Aq'aI5jH1U u 7"E } v  y 1K|%6;'3VS|5hA/z|V1   n!  j  !  ! 7@?0s p V * \i 5Y-2!1aF?v+DIz.EB 8   g2q/i\x1j% HkBH  _ M  u   A  3 y  >&i>{.Vj,R2K.VTL` 1<~  A^ HgV]slinmz8pB 3Y6 q_G/ o , D\Kh"m*'  O _ m ]  |ReS-BspW)Q?mzX.O268Y. 5O tH Y hMcy{=>8dQdbyu_+c F j4`=D@mL I[oOL,Ry !mm0bD*tx`#G tIE`:QVj!hDYs?)ovU84.CU/DBN'bF`w1bc`ywqzS\Hrx ZpAU?P]30A2L6Jzo*S{]z93$?Mq&}p _Y"(_EyAL0BG fX{NbrRc:C ;hI0U@A._g+lZ+>VrU>u9J~O4n< cdhjbdyf)] OHTF V3hW|wAx&~ ~~@Ft?zg )Q . n! Rzew=v!Cra{3x$!F;.>+Dwx2=g;H   4^ n\:\#dylffyN;@b@~o-rc;j e0 c nh a  F F 3%I%2{/e}6BqJ lH:j 43qHLCtPQ <:#Djeh 4E, H A md| 3DU0{(U N 3v Y Xm]R2"dEt9I  a  t R n  | z A&=x~q|*[hZm_ yu&a 2?t R)Ki' 5 k 76 g ;t5GnZbWJhK6is,3\o0O'$X(5=7^vhE5 ;c h  T  #  w} 2)%(Sz=`m^us #0K1 ZBFu#?J?lyP{\\Oh}yZM1MJL(YA/#cdb"J07bp1m= F ~ >  E  i  goo:|[/w5x>@0}-o3 hCH 5\$<  F.LY%n '-$>h(5q{GjU:~ 3YE!}i7*ble5_Vbhd { ekX[Qq 3 [t 0;3N08'BKKKPBQfjR&@*p#JDWI )fa6\` { e|>W[lq*uOiI8w#huiWBWV,2}14  qk b .kbeuy>@8G;y#0y,eVG%d_dw5~HcNI6    .t3usCg+#ZyZT%u^HyZ9BK3 S   2 < q.%pubC t8A)1=\G|&I6vYj pVMk>9)~U]P.cQ`SN& %  j   q_/+u`,# n   YOX)3^=m1c'j}28aD-@r".+    M7} 9 V }+<,4=uOPGlbo>*wt,=Q[We|U}62 \ E ^ x?f  i]$'/4$r z Db<n_f cJ y=J| ,#PS   i m 7 )) - x5 7 S * H  /teV&|s&+iwJ[Q C x _  _**`0]'"D //jtFM S (0}  W\QO}A ;d :ip=  mH)_1Kc1B-nsrDbh!7sY $ <f [ C : F I .mSF;9mtmlLw}A95sLex?N)9X =)p /vHf^H\   )uoP0/% [iy0 #HX0pd FU   4 } W w p   >|Vyrc_)z5w~yy4tL{xF`Od-*>C|/8L@>l10z#+Up5\4=.Wy *5Q?INg,dfD[j_MV   ee0I j%; ,:558E'&~MX 'el(YJ44"{MFkJ=f 3bLi_sq;@3  >C x  {}'y*,>y3}i@nb5 o-v9'z*bA9$~ kK i* Nd  a  j/m(IKYvD/}%P4gs:K[HcM+:^g] l2t2AOqC0h=Y4.RVqR\w(%Rf}^kFet}>U(1hxN&R   9 j  LCg5Fo slKs}iN^;p3YLuMrdArV`x k x[  6 :| i[s4a,_rP IS.?" d L c   ;  xi~l: d KK0d]( DjWi] C' ,GFpos*X r< P T M{l~:q,T  ; h )c7MXZcLME*[} :] 1iP ((-Ty } 1 \ &  M VV U-~r 2U ko @QD~Lb]?> v9(Qt z107O:)MG:ku@a s) P  Kly  g{a <,qpi/,xe[oO\zE}_>J7RLq J U  ) 3 D _ W P4&Jdl1;1  , S@jzP=3r;ba.^SU%   8 3! 9\k7f |]f w W & : *   l of r % @Z\ @N#X ?m@7lbdv0O%om+iLF7|"'HcNpl d emsKD  ; 6:p& }R3zm )?pqhHChy\JSfziojvyn"\)(/c\xUi_>o q  >  R  #9s?[-g*T8 v.-7Q;`S(n  k  @ xA1  1V= J XVJI&8*C 08v""3Apbok\FrCw  sqo0 Q ]k l # tkb&o8 '\`# QhXm2E9jMD  Mf O m] yB J 0wT|p#)!6b"Xa r~c22]o4ed5:2_Sr<.m.6k}6zT9] WO$?u_cDyI8c.fad' -+8(K5LJ hvqC~o BG ] z   v $    B sL |?&rN to6j?IWhCc%[S+)pXlrS}4iTd8*   Gk { -:>g>dqjWDm8`=35310;u 4yd,09@A!CR ^ H  @  gi?i|G uFl* @Px3wloKw_ 9)t8@V1uNc.HQ-  @ l&    %#Wxl"M2mHi0WG*rD9!om ^ C 9  O 8 m6@`E[)!( C p (e#(r}3 eG T E rf ld|3iz&S2n | x m ) T + D   OR 6 ; o < @p 1  H@*Dy|= X}i&vu8/S R lw %p5 I 2 ?o1 ?I2JRV${,zvVX4]  v -+d]1`M9 l M 3J !E9M ] 62U8 D /}_ZO| U g c1 6 v n  v q - [ {6x8j_`f#gSk*GuS O~? .  4BJ$yXs4?hQ$    3  4  9X}N {0CEb;(By"lwQfkGSp{jop  }:   G   TE1 iw\ CHz&*NjA uF!{3]KhkbBwI)578 MQ  ]&l_L   ,GV?Zb@18jo1 9%DI@HlYD$iLRbh_UrByI+|tJ,:f V]) B|q_Io}`HFFm84eca&sfZR'U@O x6%8%uZG   [haGEJ b edrY(In;w0 ~k( >P! F    ^  6s[B;DQ+sW1t,|\CaQ@W8s~dsMW';M/D;  . IKf='g{rf7hgbv;@p xB%;kX -A #H/58]X;e"Z$h9UL| Iw0 Or g0oi&TJVS%X h y  LwT>%L1?$~dtb-8 {F_X p7$ &K7.=jD.T- . NA XW W e2I=]\tQ W(97Nk\z&wps=,p`m9Qw? [   t d  #  w $e~$!kv5NL iE! %P7^75xEz90 !  f7 ~3 z   a > ! U HD|-5/#{fSBzZ :2v'! mCLIj $jH"S =U     5 ` h    [3WMI10er1"cf_zUs&7KZ9fu;qf|ScV  "o~  a<` t ALTKLta7yNFxG Y%qTri'S7a   T  q  } | [r ;N (c7WbS^   ? { a g T   )R Zty7a97G+k,qA\R/BD1C  E T : j x 4Jo  $ J=wh6@T:_3  5hqP08 yUI x~ : hozK4oZ"i]^ o w 2 3=g)fEpb2S-J(;FwMa-s_jaWkq U01 2  &W  4y d6p h^"y4S}Z_JBPB^+N*-Zp 7V/:=FRN*Gujl[g   O 3*%@|Jel_$g e4U*m(^l&NP)v65IKo}YaG  ]{ mr{E 5 ] W B9NCNc1r}]@%x#=r 2 H kLd zCpMr_ZWGrdR%<Ug,rh j !t   iXgOrja5n)#!>Khf^nkBYI,: = o f  !~$Y@Alz8W:W+Z{(d.LSn}  CEc # UETl9PAo=U4$Y  G^m~ .",x5mj?T9Hp9?K/[:V>!4$`2|n'fNUo\ y k  Q  H0 -  5'    w O n  P 4 HW4Ey(LCK_IOUO` 84 RD f kva0"91|.r<hxRsFUhl j f I WC U6Q[>fEl5 ^v*C%i5B# 7   6 j ?  / p:x  j6ea|pGa'1xdXci ?  "P = . A ikk:Zt@_l)i _ fJ C  F2t&+5w >Ap;Eo|d;Je>&= + K > = D  Xc8_iZ:  IyXrNdU_sO19%:YL7IbE # l b * _rjj'TXp;,tJ4   9 O}>57N<B "@Fy(i4=WQ]~tV&burI   IV Ex: OS1`H7+Py9w" m2DbN-6q8cCRv;W 5<XXH5_ qI9_m>K |5fG+G!jA]=u^aWv5h5$49]h}@,]8O]-wPFTm&d`%3L2Y lP wE 8 d.Oo ~po@'?Y]u EK!6}!f0?B*H$[k2c?a#< NDD1I?G#>JY '-} @ 0 L Pn|5+YTOs@_b>$K!clwo>;rZg5\.|$Y$D 4!  d zaES9~HdAs,*O!7s]s&lJm\P6o:{Ve^W8. _8 Dss2ZJ}?*_EY}a(x0SQM e xoI_C2tG)LsZo|A|"])[HG-,D p GD_VvqR/Ze'Bt(P.y --x@<V4] %  F S *<U A | :  \74aq8`G;X .]+  s  2  /{#aE%f;A >T En o s $ E } Q> , A * nJ ^"i=tn5N, x o`Tw)pm =     H ( O m A rv GDe y zrW)):l:dV#a @     c )'/+*=<_oal   g  _ k x [ b 9y ~ \ .Qv]JR9RIRc/4UGi1i=iMj% 1  6 _`&tXCu h@PACAF7z ;Fgu>MU -Q^Z~jtD7AmR QE [ M ` _d ZA|O=:-vPp 9#zwv A,tg^L-" XeY *95YmD=3nG6y0iKO5gi&t5CP)f>_J1^* penz)!pH`uf}-VvHxRpr-r~> S fqstsZ;E0#Ii/f@c   & Pn#+u[k=sx9!,G}f27_"HOnm1J 2Q O {:"(n3Rzf|] J/MuU Y?Q[..!X2Qq7TsL60zP3sT,d_ D3}z >  D 9d"ww* em1;ttt_YoRQt 2]jZ M|~W,;`#(vT#@1  1 n m-  L`m[F7I}W x< I{ M#:HqZc69|[ -t w ]0 *a37\]eb|'EY*}my2#rADpS52 hM ] l * x  ` 8 ?TR`*yk_yBiQ|aeIA7c-bgq^U ?.y 0s B a  t  *  O lAZ(mRER[7){W{>Vp_B  r ?7nvmIm _ 0|0PH6IYx+-z3A1aZa"``Yl)Q:VyF*^ 4'7xjD}  1 z !<"(%KkDr:vNVABjv{jSQxo!Ky}x*-;; } z M;"wUjK7)K@i>Z;(R2'?}B)wI4O-3 #O !Mx Rs[kuV5{92C5HY >kK$5= N~=!y;;&oRCWJ n  < P    # 61b|pJ`XcmX",yjH97/qJrnX  5DXi/Pf F } v = ` - *} : c  % \c46X)mrQ.jTTik\MB!)iiy8@J  A  R E eh |?= " mAC 4   oZrM)V=L$.wyrvM|c.= G i%  M C ZpIYvkCU* K  Iu     >  + \eB ^{Z8.Gq]hc P     G C . a 9 >tK\s3  i   } tl/3j ]j,]|I++q  6t#QC(([Y 3/*l  ' # z o I k bB , `1iGF H\p0VgVeMu" #M w   N >v L1YDLG X 3R  b {>yeUFv$B \=2 T5T ]V$=Q7V~52JAS<hj:u5eKX(r88NCl.=3LS#(b<[m4a  K}YKf.jtaG!A`p:FeN+t8VD !hs?d[DP!RF  _ dRrKQB -&cx_SY~\|1=vW*}nZ B qW A0siS   i , dkdGR"Iol7 xF6a0G.&w9V^+ ALK+ <   1H \3O.'_W`!! V)K)q)HO .UpJ![  b, /|H%B  W  S-,cd=lXWOk2';ygY m_ Z%beKhS23{*:  qz K l-s) z<D^%UP~ |tEaYw*H>7Z*q! d j ] `/ a 6yf^ n ?_ m # 1 w8::lq'pWb'W.<k |ywYJNB D, ( H I & = o a  0/ 7n#s Q_zSr/p;C-y=:8=7'iM[ B  l  \    v!G V SB o_ ay(@xJ,4TMkeLYyf qS  Z q;#zf4Ztu% _Zm v r h  g 0 9V 8{K0FqEDBQEW;#~[oB &|l   (l T Lq. K 5C7}:#?r:3\Z.,fheu8(TFgYA3WD8B|t ~:9`|[B] n)4T`$9,{Gr*Ox:`L[JD -h" 1l <5 { >  k U h v #'k1&Pe/r iW[6V*-dEatIJkip}.hi)**A r *h aUq<$O3IkJl5C1p:G9Kl^NZhYA|Y I '#)6aox =Xes6u"+,sd|yr:6`[|grA0>+; RHIj\k.4| Ub-d : ^ )r^9dNFN%JB-;]Ad>/}2 ]s< !.M&]'s5B  'dDR "BT#1dk;?-,_iQ%6)e>bId9n _dk\5 ynSykpoC P t,fhMmU#4$=]Vi2'IPh50#05R:fI } W _^q  t{1i&=vq~Fyej*c_RFer.]o\\  dWU@wDz)v\A@ZYr|D4.d6#E{YS4IOtqo$uoypxI~h R_ /( {e  dQ |B  chMlJ{|9D:`2IJ < j@Yg k?9eSdq 5JL_Z@YyJ Ry LXq6pi=pa68 :|[BV&D*f%@;:>{.4g1tZ  / 4* j{ FXz.>  { y }   s [ ; ng:UT;g6476:'b83Hp]wyW2N)1t.Sv` ?r H r : 9RM,s_END(R&yMmX4emsl&Rx#W<i=)`[k^uH/@ H  i ]OnMBN$\Z%`?eO 'iCUq<l  H B 8uwF&PK&dU@,JU|l9l`qJR|K  I: f *'EZOl{#x6e+xzJ"\%.1zg/;X>UN V2d$B5$?]     v73' .cM0hGWHg1w ]&t6cXyKvZt > }z AzC\dYw l (x `NaQ ;6QcSo9i.&{xuKGeA\KpQ+e!"O} vLN  0 T jSf-cb hiQ5h@WRohc0xf{~S fMz>O M~C}X%AZ[>]sKD?fcG[:'%) sfoS]fb62$9cxM S''A!7.Ry#r(RaQe"$L$@-- ]Md C [  A 8g3TF&7{c,2xv:ZiSRAeCZ  h {  < + `hGTRbla%nPZ2J #]EI+^q &  tF G 8  9N}0TYKhNQjem  n+xTy/b2=?lIUkQtB` U n  S H-#S r]  #z}*=?2hfd+R^rK }kLq@i]s:) ((  c=n.j.;>N.Ml*oW6E]xjii1+0AUtui~g `r  Ff     WL>XUK j38 j(U30fpmiN$B jz7UB92:V , Q(H/Dx1 U2 92Q$hF; 9  D >l YhvPV%%i4j^ ? { ] s f s l  kQb-}UJQ"D)%@6c(k/.|T(S^ L 0 8 &>!lrM Ozcl}5 'jkqD:m6wk]PaS&AMKOh ~ t = u Z94Tp@)Tz;o,=" h(. t9lC0&{GiJyU'Sr#YdxF2e#r  d [ :  p oI_t.HJ7k8wK)=qf8gfms&sC^*|,e8| H A L D} ? /3e5.X+!v\T {-Y ?G  -+fd02gS%h/t)+~wrlfhx3*Ey+lJuolwo(b9(} r ^`  j 5&9P)I{J YfK 2[ g8PCO.KDT1-rzeyFlWFG[O$[ +_hYu/al X GEnA) 6 **Q DzI/;;9O/hp    /   <VEZ] $ n A6B2z\`eS_Wo+6{AnHCSAE u/ !  T zS OHd~Y/ap3$l.ZN4*NL"t7Xw49 sDY*xI<  ~7 zz @  ,t)dusg'vVfz Br;c>FC=pP[=ERPw` 0d   / ; +R*OVd=-|in KH' uJErqT[?#RR@6kN H*Px lA  =n "g,ryZQ/WZ)^!Eu0Swy7.p;i,Ij|a+g $2:}>7~ q C>%=s|FP0?b 8gjOtnv&AeV!`M=w*"]|K~dF& O   o%c  . + "(k ($  I WcHw&pR8SNz ] 6WA 4?TYS<Zi!Z~+g3AZF{CWWqt3EC ~+ n? Qaw+6,<T{V4C\ wEll}p2k)@aX@H{KU&Qqn  'J' *YAv .h\w[[~d| Pu"YMS*OM/ia>iC[5tG3=  n H;  E   Fq8j_]d<%AKf XmdQ(rbv"(8F; z`d xtbe 4T3eZ*.8+^ = J 5. u!ewA:/OL$g>taE$sNm4"B^a.^!Ti%,u(v{=ctkMi;HBgX"gz-L51:JO v M,  2Ex6OHo)d0vq ?hg$6BDQ\S')QVvPZHQ~.\20-( 17}Jx  5W l C o5o6xZc {_&Jw,zozu3- x N& R 2z   `K9ozLnH9 u C$FyYX^ 3YJ.UqZUvW GP%u{ W{~J"Bsq}9~X  V X KKQQ=W/ .A}zTrUf ap y}f  ~ 4+  9)   W  K\nwGnauK*i%kW(1 Q^NwpV\DKDA<[S\p*e @ ,  9 ~ s >9OKE'Aa%Y-Df!]:dh[9t Ah W~3Dk%  tJ 7 Y 8cC  E B v1sdw;Q#,>ZIg;y1Nc~k?PA( WY A 'Zt6*h  [ N s  v6-g(E|Ab!d. E [ yp #6=cVa  c ]  1`? e;wBRS *0>8%9E_5c?}kF<, Qo"bB %   T{ h1n0HR|/E|`:^T }x0D d} ? Z $2 S q1 7 [r]_ a WcV ^y!_R[Ciqb+zgE7@/CuCyQ>hEOT~p<",<H @."'aF1`/pZH1b@SrV^hnZ<(r%. L $ >       2V"1 )/#iHDTve&?l9FU7WnL5nLdtwM$nE 6 i < (t7!5M>_'v6!~aG(g <5%Gf@e)Z;|r }u8 K  <B%w- \  d|lfOq+uF?7KnvqW?n mjfV\&;ffT m L,k)'~3Oe8'dq 5  P f =   Mald92E{)o)VoTIaM( 96}~g%   Yk v{@(VpV83^Qb F2bf+ >A -!r\SXNryXQo? [yF{^v3 OX, M})QUR6HO8pWxynW f Q%% } H g RH  %( IxU!84*/V}pAlS(+ ZV=u @i;`V^R }U' H8D$= N Hw3 ,8 <qEhbv Ocj#Pp4dFH)V!6 Pt,   = n C*y?" T66 .(*'Ce>^<<[T ,lMVDS1iQw\,( ANQut\I$I?W%8(8RInkd9G";S$u~\=cDA:- K F6 . ,|uAX)C(z8Q%8-5  `  J _duBf_k(0a8o]}`ax s%Y1=!SxD\/'m_\U4t/qi(W35k QSAz,t` ><  ?  u??J9Zy1J*n '%5D4<&mfBiz:lb-u|is,X;Xt5 O    ! pqAa8)4) x# 3[uq]JR_UH4RHIUlh>Etzl}n#E Aj e-Jo_ TB bT5i[G"DW^:[ Ym| Sa  P@&B[, .CHbGU'AJrDy_=o);SJ-cqDJl= iEEU,on|='< #wA!4olj85Pl$xH NG~*m&E5zq')z5d= 9`y|< ,5Bp->Om n TX KH9(c5K8Yt(VUbGg4_q<TVeV:-aq{~|H uWJUCmt aW> pG\XeBvDCoTaOFV* HiW_!~eVul|VP~3 6t E/a8AK{PV"dWOs_M>1elTQ]\d/;m\^h8l`>dJ,   =  bTV Tyi6X k/4qDR8  L<> nNg7--\DaBl}o,1|v9+fv'e D#qD|e*{6n2D9~[ s? \ Z ~ R p y ~`v' : r>E4QYY90$YU{P .E<@}.   ee I n l X i5]^b)aYQ)xh{-(jNpA;/gR1o5Rcd2/ _Ar 0C O  } ! - Uv'l}46m TVLw.CjQ96)C(Rw{I,]Z%g2&u^|42 ;S )NFRA(D\_4U) O$KcT-qFc}35WPqw;9>`2 "f:S\:$MxCwY6b<0rnmy\U !ZLx #M1svQ}i\[7'*Qt $-;K I i  l DOZxo5o]'jPYO=2&n/tZ]S)%+^0L TZz%{[t'6Pr01;UX/%;o$)?Q Z8P&A'sljW2|V\;fdrRf9's<>D!xbJ7Aq%_fmzXU<S'9t RZM5]P;~aMs>zZN/G!M9'?3e/Y sD7D.2)"zSa@J}lR`OS~)rl$w xog; l, gw|#DWb-RB"1gGVfLjU0 GG\+DfRb<-.s#ydqJwxU)V>G 3~N9"MUX}d {X4h=Q%PLO{t/Vk4)c%a'x5gCs{eVH)= ZIX4UBM-M7rL[@}MHON#I9]'\'  f  5 {1@k%mv?'L `qi3=er NN$k4D"hRYi~xL#H66TCqd TerwfQ5TkCY4*53}~,~T8]!}>&xr>GG8w Lk(7V`: =r!B  .AX7 f62u'E.[y\YYPg)?P(:U6:ChnM{9Q,M-8 tj T:O.62{{hq:8&/7L= ~i{7z g6oc":D\Pq F t [ c Q Db9b{LRgz9_5#Lrw 3sBS#`^RXJ*T AK({>P:<z~Ha ;0(u2TLpfrTR\ _,Q<NMw9_L3@o)E% `? /R!6?6Rfn6 s : >QrOC~T;IP)R] $~`PW7N&|/Uud  #6  ~ xF .g"M.TeZCy0-;}0hjwh 8 Z9y1v"&9bVzMFpHceQ )3\XHj7;"Dsa{QYs1I-jb^  L a}75  fh4AMYXJ4w\%Py_ W%F$N-&r*zb$ oyeps.Lch|tI0jHixXsLkZ Xfa  *|e }7bLzdzAUQT:H)ZXVLZAQD.VXJi_C?0]71 y pL y93]Ja$Ob7AWvr#sY7TC":+VCgrso:C-z;~rhI      Iw/@j Z U4uJY+|EY+ P r Q[CMW3aw?9xv0o06bWt6XtJ$f#2#7 ey # |AnG ~YVXxY/f!LD1!FXi,:InoZeq5u\%9(R&|h V$M6OyJqGb\XpY y  k I si_%|tm zDp.9uRMy#.,bzB`  O.?,^M>%yid4Hr /3 A g Z ijipA\sP/j\ N $5e]+'Ii|QU=h5l! P??SD!.f@(xgP^ 5  r\ *sc0iLxi =)D*1_`5Dw q ^S./#NVb;> _ 9 b DNmD4O}x~bys>Ctd9P=SCP:@PdO #0,@O}WAF=X!GT6 c(Q<I_uf{nCnJsyy=LI` E6  %    Y7(kXQXN{NVrOf}+F,-GAr05+s@4 ("#1([`j9o "0K@l%vX zF_Cye_/@W   5EeRkfLuKDq`A11W\f> 1F T  2Y RAQ;|q"Kr Fdcp2;BDKDuU/@b;K t B :=B 6o 0Z|BTd*es_A-WK.:`U'  1"N{7"Iqd`"R-eRM7$XzZ0 4di$Fc|<W 83V XUHDooRq%S{00VGI_n42nbN5b  Gl }[aK U.Z.@G%VJW3Q, JW lu nM}UjN#l}[{%O a+7jUb0^xQxC!1EP6UwrBIjF6iKSqBpB8/(ld[:f{~-d/cOA H B! hp Y{TE#7R +YQr'@k0 %/ZVIAH*y[ mj0 L$  m/(0|-)O~p :h03 R!zk,  +T ) jX R0G[HW?S +=Z* ]u.t!#}F?i8 R E>II%|+chi35{eFHIkbXVA  c cs>Zv:9H`3;; IL  ( @ MD,fu}Xe 0z!:BB}9m ? s 1V8j{">~ A.Q7!H s`eA`rwaR5--+z\\9xL  f !L3+,i  =bRjC"d_AGKB1kEd=\R}Ff?>F7UOH#L!1+"'6h 7=VM[:A%> @Bh32h. U   6LKp%hZ 0ovA:X8Jp,7U#E8GxJ]m"%laSA5FnIrg1)ns%^Z 8@E"UzRz l)5o]{tR ?~vy4vA-:p,Jd1Up z  5{c{sW,\   Wf  b5eN\_'hh: i3A^rV :Ma*aX719I)qd6 pX_m]%Si"OoMWxvO3k'h!'L2wH>F<|$CE"}ceP4`z[[gXUx<xd4CF -JL~4 ?Ld<6F. fPZ#hrENvs\JeXtx%$M1 n>b*zVdz *v 3:n9u)GTP#TC?Kh7Sx%m4&_<:$XDWI t> 2>p8?GR6Ff^;7qs>fP_dN2a*R6akS87UOf;qGuErOwV% h5X>$.fB'dVx[g58:WK~|x/)w@?b.  4^gd!"MvuBcf #|4an '#qiV(>2 o8meY5{fr[N`>Wd"| UD lYcdlxnTN8+MtC<t%BqQ?i=WjZ=LLfAmb v.3axCp1 jo7[)]i` Qi1TXY|tJ4:N(l| _?>1 %K(}~2wg+RFe4b n4: ck- AVSrVhBR6}]\%\G}gjr!^&2SkP:,C= 0r27zNz>:sk^m@Ga B  f45PHL\1Y'Ie-X Iy , % Q nC3 7-{x.vG@G:=PUUkA?LZqDhQsWr#^Tji1a~ Cd0J+IQ6eK3#IEi2oiK C ~KY]<L)?rlBXqm/lD15;}v Ca0. r!.&+[n6f$#7q}V? }hp(_;uu d4^M>Rg=jb.3T}e'R~O_b5jg4(vBd"WOpMqW}/`IKl;e =uk9Nt[ECxHunlQMVLSoq;_)jSzQz8 Y v 1&(l$`NsP[:w}e|LlaHu]16[]MW>8mW YW/s_#@hd(5 ^RguZjEu/o1DkNK#o:o1*Xo3&H[\l6vI#YR>d$s,![9 ~^ca~kUrRyDA|ej=9# 1uzN>!O5ty4b}+M2r E&1Iv)DYzB5F'>[a8)./|cf v Y #z&II4|f-J)cg>'8F4 ~]mF#X m1I|-SaH(`    #DJG{S0Z='I %f=|'x}Se+Mz@ z cB !9K2GX+c `g*E+!Fvb&.#H{pJl5 u  )vY&6Za'0&@+1d u`Z u 'RxoG_9p11 u-% 1%p'Sb [%.k_j.K=?`fk8'1.Rv|]-i;B-Pl_X?hko+9M)10B+4(!{(i*wrU4,}qCLV@G =N q a{ Lb)k2Q}8/c C76]wAp.{ MU~:>xk v(c~N0n>zH/n;zk*Myp@0*8+h-iklq`+K. 5"Dxo%J@ `  E t N M 65eYX|}JNnNM158oa.Pq`%Mzo01w  f`)H=6C_I +r'(*vNM-9Xu9##CcGc j;,KqQ#7*70{e 5;Id@jD$3;khAz$Hcm}XL|qmFhxbr(=6%c$rG4 JS9FO:!h 2BP'RzHAVKoZ _ { m E wsc.*XI7_;iQ3?W_E__<5h|o`MshgnEZ[kijn-O 8rU F -V dU{ch#w c H   ' 4r,{/E7$0 28Nm/*eX/Z,w2pj1FX?B]hXjODuV7~e yRZj.l*;D'1>'T)a 3J0*z)<DN Im ,R7@] %C2 C_U o   Q FOt% +INj_wz25YdxtV nI[ tj5c[ k05slg0t_  .u1, M"?N(|MHY   # \&@~SbeO~ ,TaF;)i jc-q\C;]M5&,v 8' ;`W/oxEypKrfn` (S V[VfG:cQP"pi9]hRU[V~pR  +s (. *"_Uw@+e`;os ~0iEQ*Tn 4 ) 1 UwS\ar]g]5xY3IlOXT0 j]fm5*-%oCZ"s &uv;|B=,W'S srUxO"}CE`pYGNI8/=JS\xD3:7|E% {~kU^7 <v&u qE V t   ""3;>)hv ] C[ J?b%$qeGf 3\    (YZgc|\ M)cUB$z=Zv  % O 0IWlT!P?;P@Z'XdmF1YWWy]`8y[a: q#a9G] H30_^hX8E%J_ *w7V,y mk#M:X\i5D|>?\Q`O(*P)R 6z UF:K06   d " m ;-|+X\RyAulq,H[Ml>eZojB5T ) 0 !-&py) { V+]\.x1 @xc!P$v*KO1fl\NwhG:\"gt\!#qp>}Eo Z%v`x~[[h U8U& 5ibx"=R4I+u&$F% +yy>8j=z{Qdi@ugTPTjHXJ!6*1 7}97g2A.A"( (q+si+ #zm5 Rxi>=s@vMV ;> j t-3'j;3Eu. Fa fm= ~e7UnVJq` y+ 7% C fAT_^?'V`Z`6_a jOl`XJ/fVa(fBo\%}^ GYw;yUK @EUB{]T1 F?ZUHRs@TL4E!.W== ~ 6Po (Y)F?EESl`c2_Xjoi r  H?lL&vx8<NQE<:mi]%1mj1GI!vr)uo5J`l->\#O7VSQuN`wIGhn=i>?7Rl-- dgU|HX IUK9~g*6/x|Vy x'/yK*,u,M'5d6?F8ktVs=]uJU5h?:2!>3h/E2-35P[ >0)/>& ei0(08'lF?`j._nhLWH6S,<0GB; d&^KC1$n[V~E19"eSUs,OhiI}pVv@r~C,khnTHwhS+H ZVdUVho2{ n 6 I RP ; 0 mpyO(6a1>PlgR~{ .mp q*/;(oVe+Y<-${ eHG4\?$JmI)I'QM-gIz$JF^Q8 #bR3K M4`Uu)Kq$C0rn9X(bcBo( |xw]JUU O2 ;]"fg/jXU$3X dQDsybBGF08iGPI4?/s+QJ 0A~cYoB"}D6M/31&?9(axlHuwi5Qfm`r>)QQobxR !2G{%iiOEZKAb2wzX%? ] #qF-G67t j.B=0$3 U|WrJ&,0eRPAb~D4zI G -|pS&k .yt~*g6 F:9PD)ch 42af?L9Aj/~:IE1~|9f#qf!pgS8G>S?fa-9D WP .zqWK0\@9 \_ Reqy!; /Qlv]%AWP[$3? ) ,E*iRx8WZuVG3c!j1pt6yM@$o) =XHFhayB ?IbaU|zV[ w ~b DO8]%~i",=&<OYyy_B!` 0L !~g_ R{Pe%NEI<>^fQn#+Zxe[D  XJef_6jV(Bc_46}m'C{h~;$*_~ecnmuLL^.z[80Vf(`\z8k?WB8L_ p}8B@g )]!{me/|p$ZN!UWy(c)E{/;&+A,86D~>6"gPcJ7@M]ME{!}J7$]{%l1PE/6Lx[PR;uAkF>"h?O.;>to^,qXH&m7WUXn]4#h{>TRpTIVR<E,$wW:*6!U7:V& p0 ]  &I?e FwZ"6[;vR}TadeTQ0 X.uY(KZ9o(EjR'/u[} 6W0.V: 2kc]~8iu._x+HCM69Qz {(,c47=Z,&5{{eC'#t-u[ zoN?Z!$K;:>akA.t,-1g#w{'"q*7& f]'M.Z98lAW.Hn2_>YCozpk0Ng& )=~D@n9]h_N|gmnI=E:hU  &*DF4c7G_B"MrLimleN$VTZ\XH0Zs'O[Rjyz|*]j_tz,C6FC(h `2~)-Zvkso0_R7$97 MM` J-J|$d<rWx=,rr |z?g^n 67/&PWV~/B b?3$Fi,R9n {o wvOW/_%6FL?8b5.i~qp- Q|VMx+AHqH/o@+TR OF^?qr=B^nv@ ;*U-By~MDl1pK_[@JMBv*33+Jjp^-x{i()s>RuuT1'u*ym>7f)R:@; =bP(W.  h +|/TzGW,|6@/ 7elu"cIzLDMU:!mKr# 5ilf uXj@:)Hw}~z)4+W u@\BPI6+/kESG[V3iF+nP)!iM#}} {YXHJQ/WJ7.5mG$QX@YE@@;0D~}cG C))v?`oORn  Vwu5?m^wEVGVbm_WbyZcH\[uk,{V|Ba4ij1>lY`.I+w[=%y0 _If;Re86yeSrE/.E|2 O-Xn_h( Md7|+eIM3GS}Ch}`j[K22KE`O?Hz1a[37>XLLfl?crA TcXk  Z  5 A,ku: L6Yua ZMU9(0_U-Q-.( 4g s Fmt3jU"8 d~1Yo|c|BKV.]Y_@aQx ~0_4 TDqSST*)Q47!T 2g?fhZ[*=dgF+c~Qa . 5qEiz!!d0&V"58 8XGZEpJhr[vJ R,M1 2gv(X+_No5x>pG)c8o^9**;u]`A0kp+-Lrh8*>;;hvzIh{U?{XAhce|f ?{wuFiJ9~\[ p$ \p f dT/#4J 4Ah?] CZFzajL i IlDM,e2)VV`s9d+*pa*;~Yx7 C&H{0>]tV,-d-tjH'|f(x }8:#Ac<_/Vitj{mn=zm)v)xtz.c;)Hjsb6PI0xh|_UgdsjIO/\uA(z[<QW~Do\(@q!snvqF&MXXCpppM 7H0U0 4a7z&y^Jo*? Aya$8Z/FdRQ=Bgh@=c'z{EK@!;RSq6VT^aPf CWh9H $7/Z#r*xKG=Ul}f[RWp6R]NCMFgO@ oIN(Kz, 7cR (i$?3PBozkX zS'XwbQw:D=%b6C;[RnUShuuZCkr_@} )c]gyX i=v7Lx9MZ;#-b(fN l9uuH4AEh0T[X E9OB}pr3X*"Vcm;${"+#<!;p{* _|HV;Yo7)Fnzl\Z8^z?}uDFfHA.z|kWXaSZ ]3` 6W=ETsu:<Xbi@^,GL]z /U`?Z$6o ObcLT!y!:X4UN=0BJ]iBb?!--@2.}@:L5e0Hsw?nq"B ^dTD'\?&2'Ej")Nf3s#-|X=nw^<]?59o/$5kWmhK:#1d?hLB|wsI~>#OgW|lb-szUQVp$-mV_Kkw8sE-|V_WKD}4cWd$St$\z-n 2#@2~CO Tq'o:k42 &6ys`QyPi9w^7whV>yQxh 6jazRazxrlU868 z,(`fNuQ7 fJn@>H@X  4!2zG@~~j P| E'Lh GH ^V{)!S Bcjr||Lg""y,P5 m6vGZlOy:,L;=U?T   : VIe - `SpE0V[T T0u${B,ZrNiMa  0JtZM_ihCQ~bwWGl#^{0RT/%u\S.}|2<v1NF0Ptigf:!P8&sf4[@\i%F,o~U *eIQ9K uT (NAN1$^\`<K]"Z]+fOT^\0 =3'a=F2. rP@Gvd28LO_QpkQol5# )JXn0K[#9O\B0:niFF9kFx^ }GaWJ!' l#l($Ty 6EdpAo4-tLnNOo"%jm  z.$u3,^x,3(eZ pja\Zw6% r<#( gCQfHvT"!`*tTf73L(Y _0;{ 99ZV ,nXVE^Xs;mp%,7&7[("5ye l-3!gYR:vi))%"Q V 3.ncu~WgKF $ vEUj$\N;POb{r&}(Jz+iSz5_H_m{;zTTsO^zP>/?tfqo>V@SY6atOK08qF  e}XFrN+>s6D5v [OD;CR6>} [CmB/|<Pr{:IQJ)u&Ed=Kq VN\v>W;kvz+XCkC%Q{$$,`Jv|8SR,ecbHC5Bg|f" a |K:aKSK7KsRsW^,@@S~qi;`cwmVC> $R;  "CktV3Oi\`PZ}V.LMn>9+ Bi$*@ e._& )VN3#TnMVAL|:%.D%#(JjlYNE^06ya2[W5ckl-xhc~qu)]oYydLx| zR-^ <'gXU|Nz=Djmdnt4w-x^0DwM*o oi Z 8<4^H)\F#'qp (!>kfL"{|@?rQ[E={At=2?SGvG *"  Is~x w_] {f)M?Ad#*6v>EO^xZl"MMR4VT+H[,as7jB"g^%s#M^b5c|0cG?`_ 8F3bu}/Z8O9ms$%zB Cf=SGTZm6?]h;]?N"XjQ9|5+GHi! .FxG|x'1CG}S^,5e:EGd*C0HygoF!wPa]f5BSI"C}_Kcl-g8co}L38{#s%Gha+xzf3| byH !veVwM3&>v)(&t4rrs{86hv0 9oqe; *>7(Nw:&jVD7fx*u5Z&cfZR9G.77+\   U8LQ^s}'N=S-R;nkFCVTs+,3#lAn`[*n2r>VMFB"[L+uy=Vx{\@j:G1 >b)y>7'[f vi);%\l>2hVo N#9lMYH+h@{sdO"4t~>#VjQ)H~#9T5B-z6E"(:mE +M<9;X \jW~8*"D)A ``EUG6l5)EhV1t4{G8vixi^ |t w~K!/*Z\6P=G^^4nE 50XINd .qaV 33aUS*>;jwrI}3>te(cOQGK#TQY#{Pwl=A)13NX{N3br(Q}%_e[!T95k7:9N1+ ZJ  URim %#-w6F{q U9FWb6I=jv-Wo9LB#B 8 $Wn]c^=tg}zgh{h>oIAt&a5 Y) UQ"q7C5z+qtB93S}|mE! ,zrZBanFhQ)|'1ith5 "b(_)Ek[$(%:1xRzCKU\r^|0+OM)Z{~5L^f%$~8ruxE_V<~ {vcaT%q+B gT&{dK.S2YgteDa<J!XD_TeUnk#ukEH?:=   1TF`WZ8DD3APPl   ^Gd~sw2DgMY!/0% ?gx(k4%KDR\URqIoVb3- ^$jL-?8}Y| ) %C*RW4lO )/0>>l/~9$SB !oQ+4>ZH s}eHox54*E1dOd=J:YC#$Rv}(i8Z;:2f"rI:F"b"Pb^^}{<Ve<7NY8cr{ \,o7O.G1V`[~> :c)p0zLf8Sv[4*7&r=ERtgvh _>[ `Ow17LhD=1-rclX&#[m?id';;d Jlq-^8Ts`?]c2S= )J[ TNL{s&=L/V^!PR4m1*5BJ[K-MKy}Z-)nW_M|kN~!qp85]|r.[FM6*&9  -J6#54?grN VBXqg{kx8 .sU%MNS@{dH=[ ,X(9.`_)N?\a[fTR,05TaXo1N HfO_*[a=(J B ~Ql!Vv$;\eh}g(Pasdn[v/Ae|_ 1ANEdq[E[0E/#EY/::8*"xN' 'u(PB="ztCgf8+s7 --YB3adQ@[!M~#5^FBLdt&e$||\N2`(/F`b_]unGJOk) Vf&AiOvu>p*#:PrV.wv+ j5J<1;Y<Zj!M0qP.iK@ M7/N}}hgbzz1/vtRuR  *^q_d6Y?{N-NuBj0, w9<g;K|CL:&XjQG"~;(omt0.lW*\*B)e:.[Hliz.3W' 7(\OX x*`F?|jVx\,P>VO`jGvN;$JQI2v.j}fP4{cSdZPY]6m|32yY8ijO;xi!=0y[dPIdc{}g]tMewKnZ 1qdY#9LTLC]>*'./    ? z:d02ui%TWygq[*8+5ETP3X ( m S-\th#"VIA V:kD`-,?L5t4Jr_g{PM>/N5g%'oRn 8t_S.Z<X=a'r 0 Tv N~(>_I \P}D_NV|^*-o#Dxnu=D<p> " px*,wYWOvPMG"(b}u~Q(>rA\ qc` &o-C.|['LbKz2 wMcILx2U>)%lQ Os*6~ S6x\oMcKs=gdrB"#@%Kdni$ b+'Ms-(MI WMTZS6r17vAheJW - } yE0_D'4nz?=e1Gw0]Uz.'D"_S3Rm17\(i}3KwvDZF!cWIz " poT Uvm(Y`?9Dbidb8C>"rL`^U#a@OjRnczDlw2VVfmN: q3@!]f-Mj rlp3<_j?D`tWVo%Q|i _at d K(OvU) Koh~ 3 `Lvr3Wq"vElC5n/S 0 N>lHF=MH!#{-"qA | g: Mc;__ ^:`$G:bW xaD2zO"\*Y}S%j2o]Jc,fPRj:-MXa\s0r VGcUc8%7UE&\ ma3nR~Cb PL}mJJU +qQQdE k&nNolG[(5:$GKbQ(K\D!-yC]vfj$ie}Q&LT 7$ N!!;ZrFU Op@B\~yVP1D!lwC\z4XC^~&vD#0Boc `d6CRB'YG&1o+V<dU69s QSPr&B@~b)qVy>J[5b"YRY"oU*eFF@ @DGh^dl]62wBMET>khJ>s*+{uvki uF ?LFJ;Un.r+9 f;\]{_ c"wqoxDB6-=t<=R7x<nIry%~*>J{<g4 seQp?o'c *E"0j\b_S//nV^UpMBLQs o%dO8 V{]KLB*ya\m.XeVHi0*_^$qaq7luHN`G=o#s7`;wDNP"pNtBE-358a{ :~35Ob "GEk{o^*`1 XgNu6UQN0#+S+}B$;x}K~8Fr?K9u|/v R!#r|:&yB<v,q)-$u=>R6zM[NETfdPk+ g%>p /gqN>LqN{{!bud ACu7}0+E~"d'tTdh@W&wq.#k ,}9<:nB8y .yLe+a&h+ o$t r(F`4bm0s6GVb "*0)$UCUAj$=Ed-P B V{0cS` TwP m@ROK4k `6 ]l>D6.JV ur P7CsjEh oE|yjrw*&\!:YD{BdaZh.<%v*2bt}Jr)L+-JA:QR`FV<MK QAXFm T<2 <uZssa 43<`m );8gR\fkg"$O=m#2h0 1P rZf(s(zG:c)/pYD;OdjUHt! G[o94rE[@ i|,+JL' T]:LEvv}N%#LsV!(]8I)>D]@(2iKy-kqWqd#dU5?1yG-pb?W:B4C3r{dK7gI|o-h9j=g+Y$o[&z-Vv ':7nnhtb/rH5: kr<N=7iVP :rV _Y"Su.h;H$WDNYx ROrY?d+_LsCWSLrZ GGKA`2[62]7Tg}X]2v{3&'ed JMwOW\-U*u M=syfmL= s 12[E<}A"`"Zt/tFZH3XIwI~eeq\9RZ,O $%M ^n@G eVn %X`Q?90P!+Xpv}7 y'W3A$4df#qoX`),yw~kM2,p(/{Ymwev~itupMP-YN [ d p^z>"7'PSrfWGlu:dj {hi/<<PCeK!@u?%i9nNepAgN'byrXT ZdS?$1O[%PmNJLQ/K.Th{: y[NH-NdQG( <4d\}Lx0#aBs`'b}D{0GwdsLdt; Cef8W&  pgU.guAdLU{I,yO`obYnF<5(#mw[Aj~prl}WcX-%B#qc(S`i6FC6~W2y1Pi41-549L)Oue,g$A-$asqc?!!g8_e.a+d}|z WZQwoD2D39O^W$L6{ ?y6'V[G<HUy+o^-[@ = 6w:M/a`mEqky_ |A%3bC pl}z-&h=2PQ2]qL%M ~\jxA/"}Od(Z;Eq~A^`p9|zA`8 <* [Dsnr lYva CI/f){()AF8C0*MJx8n{wL!OTa1E[sH?8~Z<dZ7B,5li[v}l]'Ra"C%LTf'92}}4g<"4UV@pW3A1=agZkAu1a0\\$6W.`H1-ghWA.}_Q/'552 PdMiS;h?P<;`#JTI ..TT0IjHs`fN5Jk&~9a@}Vkuc:eU-?'/3+/#] L>{ C6u8]M7J""bHOjJbhy]X&d_L>%''!&uxDm>bHhhH?S(fjSL:{e>0V`o $7& .gc('W=W&P0{j`}R bfGZs 0ixw&G r!X-]Ae?q,X/>,JRl "x&!$yR CH(V>G3u\7?V $5|O47!'=O{Xc >U>{7/en_Bu1a>=CD+A;(x>\"~VxS<mz*(n`}#e`%]H3 t`R_4AEWieFq}w{dC&W$*I-J4rR*9U#& 22,KEpv`p1&.jLw04z`0qUi= '52\-z\M~~ b%{Bzy )c<uOtE" Apk5]gCY61A=C}7J_"/-o)5 3 iCP`%=@1BDnft|} zaLBp"x~Y*f<QkgS5QrcJT0W%T&!f}c C8|VGv8+n  qH4R<ADN| NIo:_ @X:t\&pW$rK6.^LEGUUy1jZSyDv[ :D =kmN59{;wj6+4Ccn'N!>~/N_HO_\\-tvrB-tWW_a"o#K3ORyR~7q;-vR.wBN$8xE5Uv-(H3N N #ng,3eHx}]U/QF`U 9VEa  l\iBRL77lWV'_<`Pr#rtP(t7R; _/z7z#T>2+` )7Aq lZ%Y oQ-QU$KxM]ZZCN`G>4Sv+Huz9[s/w[1J L1wN}Ig'X_mV+@_63*~YtZ>f *Z=(dx;eC8)[I 5c\iyYj<{~,Y=i?~,4Xl_H.tfr k1I ^Sw QN$jY/1'mS"uu[l7 TG8*dVtQ&5D+`Bv#,fy4N' r>'pf;| 9_6 RnNlI paUh~c U,2;_4;GBYS,]Ojp`g=F7nBp_Cfu~C^;;.-dN1%fo )=R)/G J,Hti-#$Npf#4=<1=8pdL13#WYavklybw v-{/ L7CdatBu5#6vOLQSQlb!Q_gw!.aJmGgP1uD_=oiggN  oiWyF v '!8gj.~! -S ]&ehN r70eZ_&[Q/+InDAn)i+7rvtqBa7All^C7_Kt+3JlG'i{^9^x 9; aQNbbA1pfPJjMr~yCch4[{c$!SY%Gd>#?Vq`;j-0_6iewiD1 t[OHwhh=Rs t{~s|LaM,e+@j;G:KIBCOI%HAqiI#{hU=^1n$viBcHeB9]9 !GmHE!'|=I dZc29AU2J,VuAiUVxD L(M)4 KWBI83fk{#TQ96B^Nygur{ML0C< HL)gi9IA~SCJOA@q?Y2\/|?n LJ R}fB|NoQQ+;O-3;hNEHTreAt 'vD*= OS(*$I qfN1Wzr8^fv0X$Q(FPM>CHzW-a2 DA~z=mQ\`hBi?cGQ." t._P--AiXpPlMvg-0|.Kie\*5X iff{}8yw6]VwkP10\Q;oHqz9{Cg%fE 55P.V J`#s G^rl+riIY:I@`W5XazE rBZ,H^ Bb/r$Ty]uw/tr)/~6LC53naNYf6 KL! ,3AB~o&tL2/WKOGV QRQS7V{r6!E>I4r9y>8nO ^:$eZfxmPEkL%)^#FdsJjN0h_&aJ }}[wsh!*Hpm)vI5 R{s/>/Kf4i89Pabmbl( RvPEjw9\:Q<SE(8dGWBLm(GhfR&& zvfel(tQ36]u[7O^S e1LYO0EZKqo E))^uhS9Jv~= zY-f 7n(3_Gu!gcj%aqS 'IN #(_I?2xo]q92)9>q6""]@EprIU$"w5>sNoOmKMe*$"A)9&], Cn5ILq'G[xC%' Lou1!Nq1bSpCsBR^WY\:A.+d8P1{q*%C_{:fUWb[{DtM@jx3rpRJ.@PYy._Z"Rt>>-:j;:9:gZ{\]@+T%MG7Sy+A>X7Y ys*3Wx1<AuL}SBr7.fRInAC|_k][ZK Y om+X&0=PKIdas0BUmwHLiE{mmKn'-L&mJ*v 7,X8xGzy@Q(mRR ,4 ,M/_-F)yxp-BrIU6r0AwfGvF~H26@i\HX qtv>X>bp$?7\pHeRDT<?85#'J*%`Dm{u,=Ehmg 2 :TYgh4lUBccf XWoB?@#g7^zJVNJ$ 6Cv%U' l(-B b7]YIha"2c&HT 1E M1L YMje@jsu H zgOymj-17TGpSx.IQc.CV&ABX@< }~K%Id0IlZ}& 1K0YV C. uN>P9}Te"37:~4n?M{#V&:g!4@(YyTi`O.U"} 7xj-rNV<Lg!-{<>1NcDG7"Xg Lp1H8p)' eb`G0IP*^!?|&V1s, Jz+F +uC632WC9 FD<|k8;k M)gxca1RsSJZ z+7)`w@*THd7{o/A(dSe5Nse8 BnvbFM-7gua^1`bx)_DI#W.<m,SFjp!HhzK_4!'{C+8|eX+0:06WeOFr/[wI,Oxx\_DUY>=}HSozOa %y.(/=m0f]V!oE2=l!LWgcmn< G<IH6e|O d}G.TU*OLfqw0#JM#LqrrJy?t1CL\brxg4=Tg[&S)Beadf0^)fu#vs2&Q 9 @6B%+66)#;&N_[_PX[CJN(MF q2!GW QDL@D=pX&Bz*";l.<6>X(cbf#(r!v8raD\!pp/;3,+qY@th~ea(4#)U    G4@} JT` +E kO>Y#e;b&"559/ua>A $}>~AN;8Dibb=z- Enay+e>FS&__ycj,U[4&y%~;{q!3*I >mJli2}Q/5f~x3X*\=k_Ojn+ihi@nIdWDn MpIG"g%8PY^ c _u2`k!EtxdqC"]o}R3Z1A[}Dx= YPU~vC- UC]E\:+B?~$'U<=?~/~E1R1S^~`<ez;HX_& e95[Y$\,7^L[Z% mdig/JHsZ*x\f&nJ%jh"Y6$G( &YE,K[TzqV;9XLl5mnsP)$f[IN+XqIf>C `~z60_Je Mns&*5g9Yh>@m&SbQv/Ho%SfU2Ef]Y6t OBnLgYI,N?;^i]O#>z|ibB [rtlr8D d(^q,J! K;%n6U,<=P@k>)*e}lUPU)b =v[xdR,=(.ePds/?S$bf5JVo|9@^~VM9srjw|w%qW8I(TVkBsDuxf3a)d 2.*5e)q,uCv,l(Iz{ 9CQH4B@$w4IDL:0JpM+<o6SGj~5d~P7CG $T>)DL J5: S2 +2|"zD?$E 3%{6u70*;TmdqGH-3 B!o TPX\2=EFU",g]b]!CL-bIggsB>?Fo=&-JuK(UyzvtGz 4":1?>AA2;]0i DZY+XP0Vf?CC&@V&O <X5O 3P4A I!&3K 3j4zPBpC.]mKCx\&6kvqxNrGu~q=-$5_-@_[0 ,{(: / `#{8[%D*:c_[#vy }4F& dM a ; n<+*}XNE3.; r?W \YVGsZBweEf X)Qo!6>l@yh,iZucCrJc 4wc#oN[Jr^ejV3[CfIs% f\ ps)ydSfTy'>,V<.lljP{8096M9+`{P^cEP_@. 7]v_7;WKYX?]sHo5^12: _OjOEepuF# CsZrbX+W`yXADIpI8\\1[|x9Y](dH@K^  nXD M%5<E76)z5x:+ RJ<gdIkUWU*|%8NL{AM"#+I)~M"O)5h5R71LqvLmARyq"R|'iHH~)Z5a^,MYVBOs EAsWG_5 l`|zL_:dcH\PD~1 ~w %m+'1LY=6^TMiL]*N h>[y-JW3YN$a2*v~W[X^VgH|=>\36#}KVzkeek#-972e\S>/;LH*yJ-u?MPU;M.N}5ql!y>.w]O}\];m/Ie0 F*>6IZQQ*q'sRTnn+D5sDsQZtjPkWJuL20^< LK{~d,OSqJ ,O{ Gp[%dA B\|{0he12[&sSPd3#GfM$%`)Ap`DY 3?8$"ALdsoo[ImH7/eeD_<h@LR"sd&i<_2s={8,_s:u}6 RV bgI ?ztaDGhF+"'mtdl0GQ`MZ[]3DT:k[ypO4BM1\53HRH.cei$whknDKL/k95$-Ks@vV"\e$7~P3 vE u(UOyeSU>:8`SZ"Md'{, MWkAM&DxNkc+t%/>1TvL sl, bJ?>iS['  t~<J$"} 5Qid]plw`6(@jt)<;&&!kGo(^*dk_ |h$1t[4 9'kL*0HYtOE0UcVS ,2s7@WlI>Vck;laRJ@^ePiM7-}!^l n*A##c-/$!M9+l/S=VEib)pZ$]f dgRvr6~we'EZz r4GFlnG&-@.96$"E[(w~{o,kasc-sArqi'|Z(67@MdN3Yh&qg6KUQf.(5?{fMy18{wM*!rrGMAGo?#O QweDO_r-m,eWc+yL_7,\@hzeENon1?#P;"..!p<_KHI:0ob;nSwH#q); & MunZh.<{wl=db9Md( lGhS_KY8)?jDG~Ac]ZNUz &:,RzV^xh[I%Ztir).ZIyc g1Zd29P&Rs1[a~-?>m}hSTm>vPa6~P]X^y3D=[u( OKP<rqG26a[<Dn)N'?Gg[X:7]v}d3 F8RT=dfeINm~2|%'=hM*T< \ASW*4_l/D+3 |t7eIYQ3<4(VUD0]3! fXQ}cQ95RGz_0 b<O,>cFtNm U`xN855Pm  /lJ=r,A2r44Srf>6+ `7(] i); L/z86z m3 U)!YSoUtG9KwsGRzjS%EhUn[i'5uPTVzxJltI()y;~3<w\0Zvx&@sW'!^,b9&^Q:q1{eB_x7 ]u|4hLZr\l20>qm@*{"zJj/#&w[uV\,,/2xP^y;yxOFqI+Pgh,EKMd&`a bq!T)5(d3 J>DW0L<%'JFd,NwGX 0B$P'LzG_]0OtaTxn|^X7+7v0_U:?O1*Ugg 9(&mmL^2M4^dbS(dwZe8<ZiQe^r$5UCp>x }9y|lhPq2#/DfeK$X~'Y eZzt1o+F*u7X:R qIB+0-uorhen_$Tf~KhD9+fJ&q^y; f_QwCSBBQyj8L:~F*gG C{jAV5~k|2Z!c{ (I,*&Gi\`2h|1UN5K}b%ff Dk^/G=Y.L2:nZa8km8O8`%o `aW[=Z};r9hh|ez2u~&4!o}WE' l6a'-PV' |5$kDWpxTTz\\JG7Y1=a]%/o,Rz<=`qD4_E$LKUNcT;JlNs^'t}N.Vkd:j~.I4pZBu nT%@&z8p ]>DO.D:9-9Ur$F^HRl4fj[m4^|Df|m9s1~@mwKOGoZC^(^kw-.l.`ljKPhn[ : +*BC~tBD -#EE &^7:<WF_gvc)ouwAii[r0:lC4<4'^DI7<%y2~;HQ?j*O[PCo_o94`&%!?Uq3ajbfSQfH{>UXF'3]4#WkF@#  D\uXGn\ >zaa,V.Q[5j@| >T4n<!(Hrl<*V~).jBF5 O1ek U^WE~"Zvw0"/<>41Nw#K6"<YXte6`OmxlaCHoOY*CO|!7%L:)<ZQ%qLI/Ck#u@pO '@_E K;z`s#R2N\-]`QO@c3p {A.Hq/J/nlq.)dbhg@.lISV&E]6.=s@1hi}D l#R 7}q_BW:k@^w^nXd;&"{$I]S-48E-`\O~QT_7  SP9XeH (#N^dO$@# q4QH41^NI t%7;&/p(} N~L_=Ng-yoyd?QlUew1;bT|%1s` |tQGw\ (1[~VPa3EimcsgF7M&LU$3ks!G|*S6};lv9XGa6tfU\KG`@&:^<=Q, u ()duF(B#xdy" 0`H.qi{voZP )v?f]ra]NQa(o}e E-q[KY%KXwy)ja Rnk,;~[ q 2`A/mp$-H@S8C &$DegczleY%ei$N#E]R^0RP'12 3r|'p6i2H4/U<7~nei/ jiL=aPY9wAFm$a)CgUsc m~kCU%;x\Eb1FbE{wDg ZJoMmV%>I!yg"lw p# <{E,,:* >.(ng9OoR"PIbmiLey~ !V(#"9Ks"I9-MwM#j7kmH%Wxip fTX"dP{s$@W'jRs ~rpxH-du0 C G MQwuCc'1E%-!}2w@;[5g'f%e^],3?7CU _ jrOw GXpd$Eub1W fx7xjt%l!a\]cQZgE<gx;t|4K0*D HWcOg'H}F:'<6o|\Yi oc o5~zeDlAeMF kUW>PCO )CFah6xZ9 V2G&Zq yD{.]t=U+/FO .b~$iPl.)7|-Q2' %Q\/oT:ISfv_q#W'=:I*8K.+cAaJ5i-"6KXiV#6~$B>4?12]wuW 1M[ &t2r{?[,L  'UWBy^{NFf}9S=nSl E/'">[Wz<"acc_1|3G<^/85`Y~6Q`5n;dQ@$abdlvM3@Xj>5$(0VcrUFFjSjJZ-sg%}|hsydmA9r[6VToP6rIhiWQ8~l]z42znr0 H u"in&*lKA n:Ta0pMpZH3~!0g rKe>.sd8p.{n|~q+366]ZOtg>h$[s0t f<{v; ]|QLHJY VU&WdxXdBBF2t`K%xvH`oEd|i$oaciGbUNQ1W _Cnw*.iJS>7SMeNmOLGN>Fko\)}%gvs;^|u>*0y>H6hex1G3 l.r- lLv;2$Xt72'}A|Yx!ytSrXn%xV:qcS~qSk-|7j8J) D9 9@L{h$'RZkduSzq/ >V ,DNOEmCudWaZ['G RyahQO6 A-sc-A)>E({V W L] PTkha8aVeeblFs QfA#\OI{L5_B(&J`J?Me^i([m Y6Vjc=T`hM"Kh&ZY} e{=,FQP(A'GM RK*w_\0<`o#8!(`LGN\g8^7._+s`K<-JI9FK<o<!U ^&@k T6K Uc$3~b'%-Kh4M&!PcJE^8ip*uwkP1&ZT.qktK kuM1:DJ@0t*Z@td _8p"~5)$MqX! |T'PDTq."&\jEW6T-uk;75@:5xVx5 Uc +47L^.A"n,~)!{\7C?-XA/V@Dz=V:3SGsym*7Jo*;~w0ZQC}qM(4\ K;*oMVu*>9d3m>h~+s*HpVa@<_LRr =.fPaRWf\F>ULje7E10G=sZ+ ,`: `):]0kp6G~"v$nhA'P%^)v*fj}E''UgzeR|/k'C}^Nkm6m+67x*xXBR!ZP45m3[R7M;Vox3`%f;MkpngL@iSR~NdVhy<{;% tT(+PDoCL6<Vb Z7gy>Y7{@_JNPxlO>`qj}wmAF')]}pu{ >q$LAr<S%>b)Ux# 75S`]%7>us7}"$4T!,Ej{K38"!\]u.P<9{yB^s J+L JPE+%an6%9T2_/1)aj2*L+6TaQV iSEy>TY?LY5YC$ +UYL%3VZy6%uyfP:$h:wp+mC4t)B%Y*vhg &wrtr3\(yPJSMG)\}Tp~Gb`62Q[BC7' Vu~? WD `3LJuV]=?|1?G% [4c )\q\$R aTpd8o(P&z>WK_RIe6>ouh:AktQgFk{y/&e/fFC{i'?UH9B^1 kq`;U/>nc(!<aXh6\ kzGn]Mdv| a|B iY8\E~SY}!M')PnH]%[kW0Uq@TZIJB,l|[33XC,<yU25u&T(~.cA3,GxF/9cM mp$FsV!CUQuLWyxj.eC~D%I>;ITRPs|0#uEe*(iv5@HCGLx 5;>{Tu`>*r$`  8(o}=myz}er^ Za=L[} 0i>j@Y7(tjlGK<Xw":A?d|}]?Cpk[jA iQ>KwWjF&W`PWk_J|EL[n6I>MgIfACB!$Z]=xQhU 9my _Pad:vLa Hyc.P>qr%bh|J_]1~5-dGNXs8%@Vz.a:P\=jX!z eK7~GN_GmjW*,ZrH^B<Kl ` !:,dx9F&fPyJ4gQPji"0LBr^TikCS} 6,AxqTw6BR:lQTzH%\Y*}7feh:9> "T "<\ _nd><T*Qj`|wH]FvDRO)pOin'E(C@Cfst`<_dVF{{/X.* lkjLSe srUhtVm`"M!mf!zBf:se x4vM&wlM#CDf < dCw~ W&G)GBH~N&EoYx|yxnE/ |Ytv.$C.`:F)XR9 "UB(#VrnWPTS8d<A$:LQsi5'SE Q 7uU~zn4` WSeU-BWMQ4Sf[CD d] *6k4 +"KzXoDa&]W7h)M5`&%GIWFI\qY3v ~SO#A.pP[.2@{-*^b5(,$7?db* _&INQ*Ss5.-=*A1F 1F IBqcz+UOVSyZr#XoCmXN@2a5Fctj~CO5AbNkB%VZ^y|?x~NN8z4 ] xhFY'FuZ&)2BM~ HQ5 -rFdkX^z^d? 9`<ybZ_RIe2)1NseGc2}Q_M>Sc{2% Vzikb3%CNG9wv3&Sjj2avAR2|MMtFqeJ g~K=X\ Jr{ W@c!NNe ~ HDT[Vg!PI'z02{A@~E>_Rdz+[Mk_@T&C 8v kZ"e+2#/@7142ShD#J`!Opd:CTw3/P5xt|i_UY( 9-hNo/qTa<]P\{a<(5&x/I7(H6Q { UKv9/XYt[J}&&)K_|Q=r: :=5=Vz(Ny{yyf#;(_yM^={W-N0.+-AK Pol!Oerk<Q&w;[k;,5P ]+y_;q cTz6sGpy tv$Y&e&Zv(tesq>$XaP?<?oIMattui{#3~xPw4Z?D Re_Z6w"!GCy5awxHP-/"-%^2Igd }Ti9cMP3@q^pE@B.M97Bjfe{'E?iM2Q|N@3N7biB|/L5SW[Rrh7&dI/F9m8m-2vGGEZo8} eP4H'm7%0|7D]^>;"o\d5 9LmY)JBstH(=w7)W7mwYS' \ WfywuaIpg U dDp8p! tq[>Cx COJ>IUp}<D~PgY6"H^ R\:$-<(}R.s|e$phN"55+.F2f'@m'pk-ipnmS,S):K/ FKQpY'1j 6!B~C0$| BINsUF^* .'e@: q5Z2 89oB~X4WwXp*cN h0=z e icOzo0,svYe8RCVE?1k$|dN]}/;u-e*_KR')>!4gEQQ!G4yo-#EN(,*7.$q;pBC)%DM5/l:FsO62L AC\fPvYY{aZ{+`PB)>j% rVoXY- /WWCLe. e eI5z d65M}^(+U zReK# &,Z#&$ Tp]5P:r,pN'x;C_8[PA_0LzekGRP@$wCmhB{DerP$?\!.lo[X4RU+? }/|70(#>_c>vY`Q9_B ]7J-o~t!2AS]y',`{Jf!mRr 5 SjG={l}mQk"RSqJ1QkVHm#hN(!&;/>#=h$: O5$jEi~JeCx&QhXr7K*4>{]\2y( 1] `K3=+4j8``3G2:Z+54zD#fD'OkpgWV T$ =H J9UkG$Uv# Dt xo\=|?RgDS', %f;F_8(RyKNn KEz6X8F1+ *![L98XV$87H>(v7_%4e'panXt$c?8,P{|krX}Y>WA.|XZ!$P.MW=I78F3d.SF$CtSQcE=WHjn%OMArF$&U KFP BgL:j}O)%6LT.R*QJ_TH4 xNC-6W{Y& xW+WMRF[GVD58O9x^$J'Nxu^: $u4R4#V(Q&Jwh"4R@bb^[I m~e4m%?)tz[S,CH5Mwma~kV GKjp]dLX,M7j%'r-[1U1./T|a<;SRci?^V .PI7}g2;m&fV0vuJ) r!9:VikV44#[G ^\U?P/=2B&` >if !h(O;iXqWammV,AH{4<~_"d.'%4y /q31]83^Pg8z(96Y ! P>Kw/kp>4bY9@ 5 j&EfL$7|"F8ErZBo=JJwISNC3~\{p ~PA1';fig|DBff/h6mt /fB:ON)]3=t3~p!y 6l -hR<*fQ2BZhO?@|2`&eZNz]I3V 8`bF|Pt~R&l Llow]d<[ WO6];2<~Rfp^]O!QLyu4'Rj; =6g_6Wz1D l(ZmQ> bQm#$ c(eev.6zf' ?qHJ B*1>~  {6ERSL&?Sq%1KUhZ})IJb}n) 7Unx\XV(a3tj\\-Z0BjW&G-[n}2F!LnZJ-#^GHc*+ ~m{U2r0 7qQAt)`0XrDEcVFXsP/K4]y j@0xd)!7rb?00ZDg(FQ[f]m+ -_'XSLG*0Ys{iL? OD W2/AwOGrS :&P9[|UhQM)4LK! Y85L3vLL+<- ,TXzD2>vC }VY,QcG8<DDx0m-[ h>MR ^,`MKH?m6pqp=) 0V\@vc3NW:0|N c 2G9OP?o>}r{&KNDOh4r j@ @w4x96zNl]k!N30 thH/!.p UE!<RE?t\,v<[WVY95$ndxY32K8Ay^h(5='r f@Wd2/ZSg|@J #&N}r:4q^5iP`-_hlSRH/s2H1c#mC2\oa+LloENN o?ak3t{ 7;ZC ,I8j\Cz ~iOm~#.[6P 2uI&'xx057.aEHzpY % =svVjJj5y>:vCRBAzkVZz;=;)Gj}JvC*ct2} :x<ujU&_gEQQINBC13f$Wn T 5ue4(v*_B}A\A}XHyqSN#=EoV5 {O; xqM0PS}}=5DkMYsp_Hl 5gdo80#KZJ}83 ] ,el=Y=r0 :6\])&HBt\6R&<8g7 "sQ!`mY e2fP|kjbEuCJ P7jUs3g.0F$MGq.n[@v\H"9VouP?| 2!SYx AQ`jNhr'b(3%z`tl(.Wi\ i7/vav4'a 1j]%dD9>ej|L Xd=ntnjX~E+>: J yOx+@?:uv!O_ud.T$ 3RoQ^qdb{4P@HfS~PEpz8{ab_~b3Y: 1 o"C`Gd.ujo `W9q  ZN.39ijL UW ID t0QBdO&?&aLvZYa!viG)#t)fq`;\Qz\$nwR(v->i"VAG}S/{ =0t"fGSqBX|~Sc`~IW`v "\{ uX."de>K>SQ)q`@]s> fLsTHpdCEp3o7@X0J!c(JZF_OJoNw|)6-oe@`@\>S UEh{_* 5r 8C`p4c-G\_$OrSW )fxb)Q*axr>oe*:fyvaE5/>DXT8tIQ^,G+\s}1f0d[tzhO>Xe8WBTvj~e9 (mm QctVS =+-=t%f:FK_! 1Z-lRT lp}RqMA*#&LvuMe<e_>p%>Uv;z:plh.:UE_uS2I3z<) QlE*~Oz|9lkj{sm[/|ETD .+h8l.'Lq>|oeCW(lIzKrg;;olC=|bwRM&"-E&G^h~;J}D,"Ib>>LPDp 3lkT#-:6h"Lz.5Ns(r!r90KaOk8e4{UF3?lycAE  a4Yw0VY2hE1D< _Z,#F/S[a aUq=6V"KK!l Yaga\a^P8B:r|r6.6\89+/u e0%9ofDvmjB<d37!db XO4P$soM"cJ#g E"Pu9dwyY H>|>V$(\deAb ~'l< B}l<|<_&nnPDv?>V[2OZ$OpoG$z8 1lrN i!/tY3U _ 9YQ!f" '*XM/@O@J 5Il_\;1xbm6fiO T;tlDuP#yP@84M<I M?FT@EKu2KQ:"e|(C";\eQ(M:$/>!OSwED `XE2.e%%L;]k,$T#WFDiwut b;T* NuX.C\jC@^Y|^ug/'BoSJ{E &CQ4C }}r_5kH   Kc aF!4BuQ bb^K#n\_QD{m9Ab//T@o$d>,"7#F82P0CiT[3bTx<zT7)Q 1Qy bc h8:E,-O)y#<Hc tf?cEulWO)v: z%.Sx5cLp # hZ }#AV067S%S3|5"zd20-R;gd_2TatZzyH,_T=d y<.~9?8 Dt'ldv?%x9x q}W Hbp1z,w>w{ P/_,9 7Mhu0Lg&%D~cyj})0;F|Q_1M0FMQyHh 4|'y0]TC<}`-eqUMAG^)+*}(H1@ $xu"YM 9EIMz|B<_ZOerI2\c1N}FNWJ^8SNQiRw21=VegaZ%YUL B O;VK{t3f~W0F?C)/#fq\GQjMwZfK |{DImu  0 3{~? L#ApHloS}(6gM| 5eegf= 0xo{Gdm3`J]J9b&J25z-*$asQGWtIgf4f0G*{jSl$cf f1?4;c^#o POt_.NsIE%>W7Q_z03=sh;-B[Pn`jMZ~#e<`+#kO Bd@e!Y$^NPJg`dAA1 `UH0M(~Vh]bozqU(1~L5`s0z.j}* V J}e{]6bM&=LqAJ<zI=pn~R-13m *cB~'D+Q9#KLMk9Q]fu[H~/0h$OwaE4`;`/$},dC,n~<9v<SEL,&XA1#t =a;o"jar=;yr3k38 FhbA 5"b53k7yd|JRZ8C~&+<:o/V^{kE?2O%f$tky\V5g~iF~O,$< $-:ECa/|qH Llm$~>Q%"HRjBEJFOq.` b U^MU"i; x6xVN vx7i,WBO  / 3XsJQ$!o7*LbQ=7!  +t)3#5-,HMc[},@ZY8J]w|gHOb8'01Ysj-F]C $o/i22y94;8nSq%,*G D^Dchq?. {_q_dz Q]h H@r/_<]:Svwq[gnl:az>Jz08Z1Z>3,pSvTa;Faf sBo:: +z~,D mYKNiXp (@$JqO.Rluhq2\M9X m8p|V3`ri?h`#$`=XjInq dpFdNX] T6T8qi:)hEt4x}d` 7 "an /egzzN aS',;.{ 9gQEN>,V2YP 'h3@I X8(MUSlbSzEt$Tv084]|4YC|+Q !XRvkM3u-=8JZim>TD:-7v t$  YHk^r KdMxC): Q_-?kgG4;l.xu^ mM]mnoGG{YX9!Q&UQHXP9Lj(S:O|FmgY.YPP,PR,xWq`_$Ip@xfjqo][I?:j?Ko]u1O6g-.nJ$z>V ~/+ydQ#`xh@`jqqq!(VzL[ f`^&]Y]| [l--LO!wi?ge 85`Q`&,Co5\J1,>,9IK)F " a.$HAjAh"[[t}n6m1LKNo36>i2@DwxhW`7 z{w;!$>m+fm#Yn?zPYX\ vK/ XmM@v9O99?zJ!b 6%bM#`EkocZQDu%}7VQGeW z:QFj&~a=)RJjDBo K:]rWI+T!M\JCrv'iS4H.(;2-njCB]`TpqT'+bB[./|M"?3EMI>OauubB\E B-!X@W&J^YV  zzwp >1s9=Uu8 ys}c m;d~dAA G8w0;Cq%`Y"Bt>RSJ<5?Vd[+nwv|*Q~ Lb%N&Oen/Q@0qdUo{ bo)R7qK6wPFs+!tW+J{k+"l;AR"@x52l*ns?k!21ysI"X 2J#-yEXM&'\Y5CYh:sL&Z?: 4l!".$c0i27 Hh\7L)6Bh9*/l?pI0"R[/0W}fO3Ig[~{eH,G j 3I3e2 l ~aN.(#C~oeF/]? XF"+QP  1 N^ \K. rc/kl daVr=n@SIYXR!d! &dQ Mv p\{Q<](KM,:tIDnZ6b- @em[ C/'>u@P1]!1 >/{Pb]~:R qS&DpO*8~N!we(G\A~1s-AEsN5Rw C@Oi;i}sje`5YNB@/$gx$;x +U,fQ.or.I2Q>E9)0 `MB;?izqwX\GP]b(,V$% PKIwox-uWWx6=j{j^WSJ57vc$|`Uyb^qf4c%w^H.S-4Vyg7We4;;8@'Ii/Kd<~>gAc$LS@y9`c=9_B`LWc#<[?4Lr4O)[9wtMa?WHNXCY/B Lp\8Ij(mu9;"b\Qt:_Y'$c8G0LZ!-48{'vOA-J:WSd0 rdI1V& I@BgP^ fM?}yb_%DO*BNKF;# MQrK:iQW2FjI-' -;WA;$$tcROSP>j=(9t/z6h <; [/pA'kakvS5Rw`]&:ci3& h&\ HD(z{g4>8.(N-5qJ+;1r8g=wT5}9i-#OAh)jP;lQFJZ/zqA&<Q[t3tHIOo=uv.i+[t;XNSR>ckP?d=gQE7(.%P|Dle91ym87536c3;!f7|FJ^6~=-&`%R 'o xYq~d ^ZSA8!Gg}3(wr"a09:4] 1q2 n_$MH9K|rNj;)6]}/BJ) L44#ZjMmc9/"[}SJ; dz3$b>MvGR{M@ sZ V_}[IQGRm2;+i LE(fz5u][6X0(OA{ E\BNh]r0)9TZy|I.Dq.I:HLKkdM(;6=I]zp7 3ksf*'9ZcvE)tv9[ JCUecPH" I{3TS+fJ# ]n;tr:[% %L `sor^f@@4)\"V/11Jip"VmA?rPP}-yA +EsWs\s g;:wFH<^%]7mxM6*jCaRK $_&(cy)s?l=|0*2nLu"~ N$76t+ Mw%\7K4e0&YC31*  w~NRB &uPIn[[V<pKX33; qn`|2x_--eZ5rS'KlktrC@t/jz~W"r6S{4q#u +8>>:.F%<_AvSh'_!q$bkX_ )5`0eUcjGU_VwB{vNJz];@s Qoom6 2#[Qs)lG?(@h1S2`2!%]/BKlGB}SGc9{oS{.l"UAD>?C'FGB/[ 0~K/4?{vq76KMC;9@wIjM{F0?L#589TZQ #C(`:M7#)u.5)/,)z_mFccfyv=1j\z7I<} OPmVewfUCI+c\6wmRFOpJE'[] H HsNfEtttOrPXwHc,fCQ>tqB(6m4B0 q(,a07<KT !L "$"eQzA12s\v=6Lw/vm`\"`0C`ZQ05hk[DXzgHDI8pkOLGjwrV);gGNvT|``tnM! 'b  |Z9k0To.$!0\6Wp .+C:E46  +d3=Id.[zo|6z9$4=W>6%e $M34-(C8k2LisH )A=J L z,@H [a\M48IttxuMD_Sq^Q03FBZflxSv Zs#!w+v\HBmQ U;-Z.."%2.h-gb' tdr6un9ssYyRdPx4uJrj:Y(?l*fm{ ~O6Ov)E%Ea,(rz.XB^nm+ZE1?lNdw [gert:+YeM#r=t ; `S+( #= mByg!k] x7'xa6  KcXKYM}B@IHTkc8"\Ymv~T_;M*ca'feMB2zR`}7p CVf1zFZj~2Lh.#*@Xl+" O IN^@Wy^4Q#s`>Or!^W=,' p 3 #d\8e\!bu3(53-hEB~Y +;UEt)^x 0z({o|qb*F4p{}]]?rxW_ 'VHN;7.U+*-- ^5ZpFaQrS^?knPqH;D+\'8!+MdsqZ/^& <0s:0 "By;}|!j;-kH6xsg|c !mt)(f9:RMq C >h @Za3csgEnO72m(bGj  |H>~PE$!/m3Lb"r|{h4D :bsz`t5~  5Unu--!t7Y '=|(i\@m/[>.euu)`,$+2<KUI~qZ:cWt(1IjWV/K4G"9;0#(7;~%LEX:"^C=g'hX+&1=$8M]7G/]Stu5Ek0ft=J3~GK DSv1|5yRv/W+cms|EwxFQ~$N# Xs0&m8_thPK >W.KW*FF#cXI>@Pt4^Noh 6aH+() Edvt_z<`Q= Z]Dm -tBXa0.?_`.e8F f5I/b3Me9Y MBP #C2;]z +Hiwh} -?6=?6?:35ApZrV|j4c-v? ki{j.M-;ef*~>; [@d?"<2?#;|$7Jg\$_)`Zrs^nE P1yet> () tU{#y$|+td"o+!K<n\mj7R !Rx`!-tY; Z;'* L/}W\0gXu,WEF8zJ#_sI 9hah+HxstU0w8=;s{IjF<SPNt:U8PdShU9-l&E{dt %;QcKqtjQ,F85>?,& D:%cN(dJ5<2]G>@g',VPpvkM@`r|} ~?pk$8=u\&F6}j9y#iH=:m;2/>GWJp@4%xQ'xvX:l`J!%d^ ) % a]g}\va#)F)E w[nW Tc+~M!QCse$@4e!{\Qy~jacr_g:ph?Y>sExv/`q-A"8R 5+Mj/Dtls7=@. Ppb#J#VTagxe\P8<2QyTk/$Z*(;.yO|zs!\V"?[>[q_U$A79G_x<d:O ZSyg-!my; y NGh#2v*qW^R/TIc#{H" _ 5#$T6ifUb&0Kx=IO;Dgi@ !X{ty!UzPuSX 0%.fclu},V;n0vy/+Obi5lq{ZxVnY*@BW}I;qWu)^[?:aJ)__i:qC O&ySBZ( /g(^8bn`uEx22Kx :hq<BvbC7h:!zs` |1!9Wc8u/aZ22|S)%5*Zx$s/|ol>oP3PKN]tR+'gSzl gi; s8 sbbrR( vQ#Ev2i}4[H|m8a*/P4N'QCx("}NskVE dkV".?oGIKFOlTYa]y8/`fh~Pm;n2l4Q-+(I,Hb- : t~kdY >btjXUarb7kMx[ QzptL=D]])|Hjd qDUXM,LnXuV[v_vl_d$A-uDsOKX2hHrViVWLCF<JQaKU.l|M=0Z!N/-G@_'MpwC EKoo\] 2`HEz NA\+2 J.aot u Er<]v]KBI {[ A1iIsR_F1&l;8} @*.;CeA|X? YIjvu}K X!7@Sl]6 3I^Arn{vxlZh1k iU&z ^35dYG1p$C{HLtnzte^F?4?]9Fuzf5M$2Srt:| .Ce@"4JRHK7 \%L&xlN4eguX?6Vw )m"W'dh+Vw$Z{o<,6^9P 0G]1l?jJS_/3M OY@*@ c%P19PmqWJG~P}e/B(mw|DJ7TU6M B"Ty~j?bPgmG 7*msQ'\mA%jV^JXA+9/Qky[!Gg929W6pOaDh-J(JgQfV\{{zPz&2Rqgtlz,W}m"&'Qhm@6K(Sj~8Osu-KWH^F(4.$b:"eE "c u[MN^JwIsxRm%Y*.6["AF:'YL'%)^pY` g1}}Qg83 r .A;(_}]BYfjkP.\k69 ' *?\|wlzpO=9*9i;;:E511?85C`ZU:.Vn*B5*^)Eb.}F )_ BeBd~J< }buIt\' \ ti2'uPz>`=MOAn0{Fj a'Xy ) yR=:N~?5z L hJxl{ ]s;l$]B\Gb\Wc)x)D9Yp\,08i[%gh+]<3@S^! N.`,N8c%O8}$iU8 nEq< *D,9SBvNf];IDWk(Yl9= # Gg#+9fUrLD5 d!du_|~t6e-^okaMd=CF`i2.:RbKuLr&32w(#PH16z&gJStE+%i$i.Oq,f%[ddC5"d>4L0Bd!v%W\OPq?*.H[v6s%J&Tmbh/D{ Buv];,(J$FnC|bT_PBzkdu9Jby}l?Nj8FxeN@YGY,N|~`c8 9[0S1 bB[gNg Vs| .cjl9X*.)eMv+k[vA:?D[;l]\pSSYMs iImT/_:0mGz}-G9 \??d zZs|Jk2$cw?W2_;Uy'n_{[P,T+`[]+{bjC;eUj=RE3,q-luM6$ 9GRBUN32yXJ=[/m+/ -bQx\tt3`4f [:]5|+tYq9*H]8l(4/Kuxr|%K{ Ve 6j7 eL;' `8!IiEe`q+  0 Ux*>KI@@Z&m(H5`%U;V;sC0IaZ-]M-uk]9%7?=?7+[Oe'>oYIZbG2 fcH6O-xrx .Z}zw-QyPWs-+%3~K/bzCtuYZ Bx!d~hd1#1{JQ"YXurPS t_m$rwUaGQLLhLMC#$qh`@G4]A7"8dfd/WXu* $c(.p-Hvqo}! 8 Mx8hi/HDjX7-8yE&$ 6*Qlk 8s|fbqCIUO6l<OXD,GR%6B>CM"UchORx{1 ga-B:PjRi_BSDEWLrxOp8}al.pTJo=Lt4#a~rA\m5Z3-N5sU~1fNh#dvN y,Gjf3,g9R c /xP,ijo1LR"Mq(0 ;%w\m%~9m'Q^M0 Q(/0,+<` 1GK9D+wIQjxbk:Uhto% tSy%$J6pFCZ%XF4:AaK/TZbCyCCmOCLvI]   m$WJ@5c#CJq|R$4M*m4U1&$OVnlqWJv]TYRl4K=Jm~9{k}Z[Tc`4i6l:sT5)'b*0%]97] )/%} 8xqS1])]%sMF#SOMiB74m^. t~Bp5Ii*lVZkpVVk05l m61Tru@{xEOwlSK /2OR7;#a~E5i>V.L /[|7MTNA2&)$M+v7DOV!`"kxg6.ZrlOD0 bD7Er"cR9fc8Bz\v9?V'=,A eCwbH4z'Y%(3J_iqezUD=FcDbL<$mTOac`Itk:Kl? wCsWThG}g9*K\B(>]qvxT2A"kn6N,&-58ATw%V 5V}m/r`=1?(gJ:&iOB)XQ)(JtuZUWT: zT<T40: >!./Ean~'kSELwm%ZF S8L~W$1DR]]]2JvV_>[LozFcksK/7+p>Zmn \='%:I^ sz=i U>#Q V#@g~{`{>v"/SwO~om~ OL!2P}y\U`rzsq?T*u=K<X1#BvFz\t,Z) K4ev:MUaWstIXW6B1[<{PB63>F9 3Xi}]i|xN[Pyz=!lML$#F9|sa.s/y8lHwMX|'G&9v'=Usb`W J ;*%Dk L$bL`'L9 -hZ9xy*]OOXgtx=q\ilgrvqw-V-'@[I<Pe![e$zJmh+ycO?3,%t =C-eq1d=slE@\eYua]cEfZ=m./j2[#OIz&( a"$DY]J.6)AOxNltT[:?vD:'ZoyyiC )Q|$|  %`Hlk25#h;JSG?ATg)a&vUmN"Pz"Id?-)+241%|d0DYvh`_Ni z)TXt)[6ka-8c# -BTUm:J+!oUd,eD[ZGo*yk gy4L7u6Yuw&a N~imhnqJ`2l^`im`? kVR[im<`_D^(I$8IH]=T{'c{MCMu".,*N\S3dr4'$+~zJX* 7 Y 9p1Xx-m<m=n/m cPp:"M'3dl)uP)9682 '=ATl*S[I$`|7souwgTb<J<0$rD,% *,,_# W-ak# O+)OSZ)^zbCp[JA<_5*#X0 [6';Iok_p")9LjNyOllEj.KK6m)|)ttUoBe7I,M*Ny~wiQ1i+\bc|'! AT4UWG1"%Bq5Xz`NLnKPE6`~! $."_ >{AsK7@g/~?[`O*k)eH3VIt yc@|N^~5K]9j Dw5a|g[Zl 33vv.p9tJkU?+ k7l9TVqqx` A9;VH^a\^y8k=~ol8o]yG* WZ:w*A9Q atclu`J)x!MK]G,~xGZ?zc21 qQFvun|l4jt?-#bA=yHkReVhP{JFK$Wh|;}g?2*M`4/4M]YE!uR@EhlP&g-SZh'"WN w<9 &\Zs5=HBml.5&BB|hvZ'w9_lOpTSsA2"T{M:RQ-ULxWB{<AFHLcYp<`j^?|aL?M:>HLSP9p)0N q8FA) W "#=#S'i6Pt)[{}lZM* nz.a1M!=,xcQ'FsGSeGzikHxX9Y- ILy"=n!};x8g$T;zBvM3/X=R`c[SWl7/xkRvp=^@v{MV5wA8wSCJlcT>-7AYW2NU<MHOk" %<KPK9rp9T@2&].W 6fMkp\,71. #Fp '7N@w1yfdK)0U+ {i]URRSEZiyUvlSx %h[" |R*#rT e~=)/8L4`jlmzG~=RYS=nfbm>,A{D9q4\kbF~gBvr/zY+W9WRrU4 ?t". 5u;BLAWK`>k.v)3Hdx[3lLDW=&aF9v)L=]A'ZF#GcUm D}rz:1qxV\)F9/&'ZL#j%-Hr^;8$OXuoHnYNMFWet3w#< E<GfB?:7>V  yDq>p.VFBX[j 9XZl]#5q  Fjm]Sc@K.h3<&rF>|t> 6GG Fl *=Hkmc)Gta X}<'|9_ZY(&)%%. >NWv0hA1q5K"Z<-g4]EYz^bT%^s}U<;(M=k1zwIT<+Px 8n4^.d~Lxc`s(0//A~h. 0-Wgd@EIt idr[>[0UfnuCVKR2ln9U #TJ~Yg@T.`jCU2B,(- 8No ;m"BYcils;|J3|glKW0{G(> `CciNNm(-A.u\L=;0;4?C>U;e7mGmi 9M5Ch}y$aPO\p6Phz}l]S4|:Ic@Nr5?IEF.Pg[ZI(~M -Qu.l9?Tk-r$m"oqoe}R74& J .9<(=8BFHQFO8<G_nG-pI-=p  NGss{=1wn+d/HSYUPJA7*6&_1;L`|/q{b#Egs<^18Qw*4%>o #-/5:<;5023Dii.EC#jY%E,u IAINn<0 Y_6vX6`}0%O{WoK`@BQ=pJ[ffo^[LP3KF;&plnlgTE&FFEYJ`Y`r_agniu>z Driu 92@bgYN$[4e0P0#4\$Y^2 _LNh Idv|ylIWA,d7r}X[ qH4mx+R28={A;?1BX!cuM}7V3C=@PIcXun~Y%`8t_gO?1+0B[AuyX4)U=V%hPsgxt{|}|uhU?0(/B[vuq_SC,h)5 -6\cXC. ,A}Q[]VMH;JUWkg{|c|aK2g8Y#$?dJ BE]01ru{s/8GnvV=+z)h0e2v0,)( Fa/ yBCN"O`W"9=SjM5D{s']vT[tP YDPLP~\POV_}l_}QR_jonjkyvr 3,,^@vsp~|XJUttY< Ux?geq}~= #9H]r("5 + kvBM'(lF0k)G,'3 >L_MstQ-&YN39/i/5TblsrxT;h4Z@eX~mrd?m ;lN8o*M&1c3IXt[? qWRe0KHl u|43 *H$`EkbeuR{0qU,wS/}7 *OzCo=n3C?p&G+,N*w0)W?0!BlB,G\Qci <c6{PzR<9JjPF|#Te@" ~pjpxT(+v5s~u X yW5v+ (:?A_;l'c O8%b@*&8Sz|x!B^t{hTD\;9=DJMHy9g%\[ g-Un0p+M" hH02D%S^ j$x/C`*&YG{ZYE*2aJlP9-.>Wq|U}4,8)DJ$&QAcVcxJE4{qoTiAe5c/b*_$Z"T'N>GgBDU~7C9a@rznf]TiEI24, 2;FIF;' yH!S3ISQI{=209N9lvfkRpJyUtjC6G {Q( xep O<T:yswaI5+2FhPq( ['7:63p0**7@x[akS|Z|1 QP,&CHgk|?]1mLw/S7.41EFZRnNA:M<,8 <?AKbp^Q~FE7"6h P}aNGIQ^gnpyGlL5o32PD)^le 9 `5br)[f3 o 8Rl).dpH'yp(vKylGh+*8exu?zINj#2  ! @;bXp~{trsfycfn~$M1se+:5sQDFMqMRA7-p_' v#3'Vf3UShxMUE"\B;b=3?. +c 4=^?$91" dBM9L x!T k A*(>i;8^!%sb\_n_<c8h7[ 5QFq{AVy}ZCDbT%I/F(<hp~`2em6N1!('L4lAIGyBa@KOFqVy9WFn{='@I)TI%R|,lO&i\"qK [:1WFd[lvz[w1T"82+Y),*r9Oq{gA#<KLD5"|jdqZ}:'4#n 8-nGRN@# y: zpgeCeg_wEf;huD#1r0"_8sCsQqnxZ'` RXg!t$r`B8 _/Ss}ZD( zK$ {I ">^z(FrF=+h7|'\@|08qQL#3# 6_~G&3t)IjwJhYJ;,"%19=ODeAs8y+s bE( yruAsYJDGO\Rm pC iR[>x/t&tnR]p+77/+4 J8hp1 N+iKnXm5A#,*4CQdu{w}[R9"-_)_MY^r41!#6V v8d_.}dM?H=CRkQCO}*Fhj:ASc8  1m67E{GA#7X)dJ 4B?%2FXhu{yg3LC%EC<:>FPTduo<}hM/1M{NX.FVu6xyfPQm;qP@~:Z5>)$ xwF>!  (Ad#M*9>?BE1Fh=&zeigrJ/(q1kJriqh@@ }p(K40@\u/y[ag+N 6(YHym*-|6d}-2 A5YP a,G0iV-I RFEW ? e &9eK&^vzS1-J^i(qPz~PoXH;'<I2bmW-LPFd?c;S8;7&=FOU*XW^k``,H']lqo=s:VH::QuU\3#Iz.n Mh8oRcNK;1"%15OAgBj2X7 .On<[{onodg[^YgW[al.u:|yj.G Lc#=-L9K4>$(*:v%<n?Lo[ ~E~D4vKb%0'}=*[mieR4&##;WsoR<5.R/j?\}{U2z4l|;Q6 3C#`7}GLB1iJ1#!*D\gvO4QK]ZK3zG X9j,L.054%qi04I(X/]tta>5FRVYZ[XSPUas5GSW~Yl[VeCy4,*.8GYiuzr<Y'[%5!U8@6b3 k0y]s/NRC& ;\xva SgUgD_iW)w4%R4$rX"?,-6!? ?#7,#;Nar9G&a5?7!e,j9W^57u 'I*pTmo`C$ #5EQ]fif`Z\q ZY0$%-;A5o |c_R7C5 * #%6B HJMOT^qGOF}-JD "-U`lUxIP=~Uj1K?H]mlR %=u?;TuF! 9KSN ?4%Uff[PyHC>< CNXA6VTTQ9/ [^%hI^46+')-7AL2TL\TdGo,}@}wss!)]uyu\*<I$UN6?k<_;LXu|L5(4b8\qthM"acK&u:3[DoF7nCx"Mo|pG|/TY:\-x 3a:Vmsd9^]ez<g{vX+N t)[co, &p;`W}vzv} O*W/983+||Z$E>DkTfkyg:=>+m|gbi[ihhecchn%z,! %4BMU] jLtxV<5 3X5f{Dv]7zTW~RM-7]f}rf]brO d^oyS;# Qr{mKhIe,?0;YCw(GM<$Oz(:`H@R)ax(Bh #0-}`Em*,ae(:C{,.Sr}t^MJ^+s+Ddp1~zxzEmyHkBxmtei]nVPMNQSTRSXm_ST x\QXm D}f`;k?:\9F3N9hf|mdgx{6yinJ2" 2O[R/ozIP*?E[w4SujRTs+K@V|L2$a6BI2^7rNnzU. Ubl@eSk3RM\`X&Q:UDoGDE&JaYovhz^hSFI8" {p~2[AfxxyhNJ%x^TuXwfx }/r=h8el2z||{B%]-GTJ1}eMB@J^y4ke9.> +^)Y:$e#~s X(95EZx-ZW |)]D:W`aZJ+p[I9Q*./KljeLJl6m`sD2awhchwx~Rd-D k>8 =&.V[| Y $ xi`\`hq2|?6'sbK+Idx0q7=9e-N!=>M#kDsU.]l45f` &(" -'JZkoVLLV]C\UF7&OlH/&-mAbyfe!'KVL<4?\5jk5^csM/v4wL{ %E\6kYpssru|pGrY:  i2P .&|Gj2ekKLA,Z*`gqA]UWfxLskCpDe{:> )8`d":Qc l,l;cNS^Af-bN1!1F:g4* wX0!5FPL;!xgboCU:mXo+@:q]`{1P\OWKHRk1>FE61^CjO?/."Kj(?Yy7DB$4,!, ,0 ;$LP[dbVF2#)8EKD2h0x\F 95@VsiHY&mF|`pvqaJz3U%|g^ h!'fp*9BEDGILR@Ybo },6.x4G`7'u+E@'[u 1Y ,72R2b3i4_8I9%5- 1]vzgOBId&6DMQjW=bp]CFelK ~ Du hEyrB*/eS]k:s)A7EhwYEA1;.g>JZx%\x0Z^6pP1  & Mw!8Uoj<zeP?3)#v#ZPYl~l1.5.5990'%+5@FJQ[j?QH,P st9o4(E^haN,@VUMbGfHbLWLJG>::&=DKOKFEIUgyC~bn|N~s~\0]:$mY%S>`_ tefzX F x =V|}{Uh:V.M5QGec2CNROE22PeldM+Ci_|rLeF9-d|iI }nilmxjMZG86Ip,[18;?GPV0Y_]bq&0)JW}bwKj;M.&  Q 8`0+V=lQyd|z{tja\Z-VY^hq*|DK<s2_UIe*`RC>|AVJ@:>IWZK{%wnd[_WRVQWOZL\A]3c)n+;X}!@bM~rjlTk=n#r rkT'QpT?0*-:#SJvu">Q<_Zivrzw^l9G$'*Q?z;yM&+:Oivua@eRLRcwdRB79Ox#D=_LoJtCt=n>iIeYan]YUT\pIl)xO,l[W`s?e6Q`bXF/0L [ XE3.T x+<F=nH'  O4xBJF3h8v`Q@+riiqur +<)KPTsVNx:V*#%AUM~?gK8/Vg psqiS6iH.!&Amui`VKACVw-FU=_cfnv{oHvD_^:'+Fl&d6CG,FkDNbm9cB.&+3>H#R=YP]]XbMb5`alyy^~5la`gotz[}Dy*ri g p:a6L8dbtxo]G9p>^W^~oy:"DE`[{4dU-H'`3tAN\~jswc}Oy>j4P50= IU]ab\TD- ,?N[_ZK. hZYm{bB! /eC[1gVlwnje\OB>^FC`<O~ A< dz5<+ZyIp2Q4eRsr{hUGd%oBdZIq' :ohgjlk[e'YRTg D*GZfo:qhk^K6+/EjhL) ^( MT "5/M6b=uDIMPQPNMHrA76&pr 0FU[WJ 2#.B[ryjG~DmaVO0MhSg+,@fTeorme_]h}|mK`Iv~/!~ +3NZt4,MSX}XRNT cwfgwCm%v#Fq'RmukgY0PS]_O+oQ7('4qIec_}agoz +,lKfy rf?7M?'QZ $5CE[Tkbppj}^RIEDFyDO>0  /AOVSF1(@[mhIm`\ey~pt.!S2|BJMHB=|BaRZoiOd&j*Y$=DRs_r <!q3EUihUP\py6f: ~ T3ThmnqpLy%}SkP<219FpV\kG|8kdak'v>$PKQmKINZj~}hgF> {GJ# +-MMrl. ['yCWt_^ZKME?R4k/*%^) OsuT2 , W{.5s%Drjo}tYHG~as~ Uh#^<?JPSX\)bEjc{ $~WJ/j>h)A%$+/235;!CRQd{3ITR'J"DI^ 5Qnl(ybI3""6P#g:wFHF|IuVij[~H,v[8fRF?73.{-p1_9FE+Ti Aw4DB6*+/AJhhecNF3-\8L =a[ !$B*T)U!L=7 ?Xz*8>3[ Euk7(BLD,plqs}ozucZjC\b8N_)x-U{{Tw.@ |v{aoDV$0 E&[%$!#"*37@GI_NzRX\b`iY$J6%  2P p=Q[][]tdamNq:f#O / sI$ 6Tox %5Ke.F_rtiO@,npA^TZq$] *,& %/9AIM'J'9,b  k)M30<C L W[!V'G'0 nj{sdaysefzGZQ2Fewzo f*iQyxbV'1{|Pj"N*R C}!-"/,HC[[cob~]WVlYM\$[RA+ $/AM^kwxeP|;h(P2h?!y}2L_c\pSiYqw &)" ;;RYgzxr~Rd3M7eQN?=Lkg*:GMMH < *!Af&Klgy9fR > ,T;?Xzj<,h:BG0x Clx~CF wdWD7) )k&Z6?>2")? Q_#fEhie`_|bXc,aUA$%8TTzm}w|coKc3ZK 4jsJZ1X(m0HkgH{=zQ3LQNPY2iI{\l{}\]>#ppCN,!'Deq!9 ?4(#/ 46;DLU VN%8Cz/I`g|`DN;. ("';!HH ;"df[Ah5EkdHLp 4H!CH)` knnjd_`5jZ[o6hHy'O #RT 4KT$K,:+"*,6F;YWhglcaHH%&(9Kerf8wgHnPW98./-B:fTozbA.7a! < ;* #&;F`g| $[m<%{OF 2Nf3AB;2/5DR:YNLM06 '#W/>QcnjsYN?9%<N bg U1qbVOTFkQkkap3TZD/<CKUam{%Ee{MGgK^) B.xm@M@$!3TOcfWl;@ ":MW$U8JM>`7m6q=kKYXAf'rxueE |odlOmRuk}vV03z&[l^D14+JRnsV0U% ]N)" <~Cs!02)  .P+lGsNc8>}:W:lnxzp[?"Y 3" '</P4S(A w`W`z~hev @PN$B2,:@BHJRZ*h_vzpGF[^>)%4Rx@-YaJ &UD^eXx?[%F;9/<ECVO]][hSnKh@V4:( "2Qr~XxjfmXw\rzgM.,\B o~%w)d+U.N3Q;]LobT^, kk,*ZS5#7;/B = 1# 4P&eCjKX67 +/@,^&t}v^>!-7FDWDS3=%32!! +03325>*OUf}}i`Q(9"OlB-3T2y ! '@6Vhfi]Du$^ OKK IB&7+*("    3Rm}y&d-B$fE=OrhI,#;k/\y6uH]RC\1i/yCkSo)O 4 ,,n8Q ))X[ "$%0.,% 3ZwwX52UnyqY :%#(-$0-"}{ C]3gB]G?@3""B5kIW^\TIm>T0;" X-r$zBi0FU^2[@OJ6MOV`lqlY= '%1C3c.)#"#yU ,zpw{y-4 0%#462/9R{+XqdQJ69"/+'%':%Q!ccGr<T?-ETb|  #;Sh{t>^^G|/ w\@*  *0OMn[U@y$bE*+PtlP:%.3-A2N:S?RDID:;("Y2cPI.OLaq}%2Jf~<YqqL|m[N>.3Ld)q+p!];#:IQG0/C P^it{z0n?Z<B-/"#-9DM'O7DB'>- Y>=Oq%;;%%*! $=XqyaADanpgXG(7?'C3|sy= q0MYYoI\3TV\\Q<" :[(t>Tb{ncqEd#EKo]TZOp  )Da5rSundG(x[;  ,+5/:3#    0@?.)B\qwn [F(8349;<C=K<L;K=DA7DA5nXZp(# $7GVi{zbC ,Ol|s[%>Od^E  ~~)BE&2  6YlhS<).X8RuvM\%*S1y#b;Y]bw (&T0}9AEF@6(|cM6 (7B M$S.R*E,".-",CV[M'+-7F`x U58C)H(G3@?5F*D 7# \@;Kk295,%'>SfuxkZK9#/64+ "#/-01#,$+4*'U&n0n)W3~y+<Rmubf=4mUIK]x  8Vn{|oZC. &:K U#Z5^=Y2O<"*33-& tlq +C[ny 0M]b]SMuI\NCT$XWM='{rszus #A\t%%v_G/4ei:    1?B7"{ ~CVO4)@UgpCqhk`UNI@[35  weXR|Rh_mv++$  (+-F-`+w"xcD! "7DJ(E-<!- -/$  uhi(xPn!Mn~|slhlgPc)]SG6`MQdn]h' %1?NZ_^XMA1;ZoufH &,%! 9LMA/ %&)-049?JWgv#Ip{hS>!cE.x7o\ # 5AG-MDQWSaR^PMJ0IHNRWUK=**2ETZZTK>- ),( }tqw&2A Q7bXoiymd~VzLpI_MFY)ft~`,eEFd ##$) %8BA8+AflFJfmX8 !&y /+xu  6_5Vry^a3G-jI*k8 6a0\;"SE_\ad[cKZ9N'A5'(B`x~n G /BLM= ",11-# )7<1 -St-Mq[^OJ2:.)*/ ,2Z{zaZ]jU;?^4,K?WQZ_RbH\<J630(  <S[M0  "#;"G J@' 3><4&)-$.*-?/]8}GXgnmxeGT C/o`fvr}XmB\7W:oLp,]o-fBHJ$E=73.+ %":KSK7'12)*@S^]*O>7NROG8$ 27/"/]6RzZqOn5mjaTA4)OcibNe.WZgttvPn9b2Z?d_ M.lDpNYQ7RSX];`V^cVVI8:-$ '$ !''#   "4AH K0L9N:P4R'PJB8!2'1'4;CIE7!2BG@,}tnnorvtlq/_|!s'Y%="%%0?KR+O<BM3X%XM6 ,I\^Q;  +DXdcY#JB=Z5b4V:@C'O\ed$T16; :4$zv|} %1;=?<29O3d*h^F,"(%9HME4 . N<kS~_\K7'{l _&T)M(K$L OJ:znlrARQA-,'C7VI]\YmJw;{2u1g7R?4=2);A=0 $%0=9N?QEJP9\glkd Z/KL;X&P2  ,68.5>GKK;D:0-1:@B;b(i W5*@R Z V I 8#  5dIfshuS_=N/I,M0V6]6a+\R C1 #*%~ *% " F#`DfhZE.$'|2U<(>3 7GH?0#YBFb(9M `2qX}ppW/}rfYI6+4) (+*!~)%11):@FGGG)C>;C/7  ! #$"! )6?=30Z(xAH~Aq4`(T$Q)O.K1@)+-5 2#6N]&]BSbA}-t$T.2793& '.62N,Q"@"zigv1+KE^^cuZF-!8|Re_HZ'?  $  4:%6/)8 =C,H@KPNWPPO=K"A3%  !*-* ,e'1/&y^G6) $  !"! +$=4>E.WfmldT+<>"EB5#37RHjNtGn:\-B%)'(!`:h,X6TRXtg{$;GTagjv`~E!~ti]"NDB\3d$\K 8),(<9FDIBD4:-$!$&%## /774.&(.-%   |fbo*C=JQSPG>8t8e;U<C4.$"'4ACLjSWXW^V6Y`hmj [B"%" $  5.R<iBy;~)|tke^V5IS5ecR6 $""?[)lBsQlSYH>2$ -= DC:)-49 ;93)z+6<OA|A<3)yfZQ*I9@D4F';$  !!BY$b8ZSFi/{sZ;&.-%#08D:K,C2  $)q^[dw3Q5jBv@x0rg^XXYW NA=Y)eg_QB/   *CW&d4h>dBW>H57&* &7@ C>"3.&7;8-,6U<CLPPIt;_*I8+ & *19;(8/-7:7-! |#?4_Hu^{sp^I8/.06g:=>??8,7 W8oI{Q~Mv=i)\QH@92$04.B*H"F6 $#3-L:`EiLkJgC\3O>) + <EF<+ #&!$Mjxxpe WJ;0 %#!$"$'!) *!)$$* 12/)  yv} !"&,.5=9O9a3n-x&z"y"s&f0U=?K'R SH5  $ #  xsy6M&\.d1b+^R H?;:<=</:B6Q2X.V*K(;%)# *02-vrwuv,$<(G'M$N LIDA;720.+& !     )/( 6M^lu zyrgT@- ):DID;- foK`<\=dOxm$E U4WAQKJKCGA>D2J'Q#\#g(q4sAmN\WEZ+UC(  "0BU af(c5Y?KD<C.>!6-%##)28<:0q[tSbY]mg~ %B.O5O8E679*?!HNSROHC>#6$-!  3 G P K8 !.;BGD%>.3.&% ,< GH"=*)12/& {cSTn7@!1&% 0J`p |(4E|Tk_Td7YD$  )8DHD 9.+9!>?$<28C2O/U2Q9HD<P.W Y RB) ~j_]pbjrr+/B1G,A!1" "%+5=DHGC=0#  -42!D\c[I8%-3-;2<768+86554 0)-"?E<#gH3-};~]0MV5RECM5P+L&G(?08>4M0_0p2z:Jz^mlWm5X/ 5 ?6  ,7B+FACM7J*=( #)$///5*71'xlt3L\c*`0Q0;.-,))'$&(+,& %071! #285. 3D'F27. " %06:D<L6O-N JD:0)&:CC 5vry(8BB :+ (Ij 1Ldmcd4G (,,("& '0=YPxZZUnLSG>I0O+V/V8R>G>6;0"o]Xapxu ,?*K1L3E06+$&#!$)2;CEB:-  *496+#((!2.*<*G;F@=@,== C NW$^4[@Q<?+)lZRUzg{.,H2X-a!a\ R G<:3Z,x((*,u+]%B% -3." -;: +  !:"Q ^dd\&N4<C'LPOJA4  8L!U<VIRJG@93$*$%(-/,% /9: 3&(8IXbaR6+23+!0.  (6#D'S+`-h1f2^3O/>)+ usz,< FG>0 1Xy iE" #  '?L LE9-" '-?@VLjMzHBCJpVXb=f&_R='zvqui{p/@KKD7!()3?JPOG9*   &6AA9) !  1BI)K6E9<31*"%% -;GNK<'}v}.G!\$l!t v"q(e3T<@G,OTUOC.  %.0. '  (/4A5S2a-h2f?[PHb3k ni^M5}wuy%/ 3.,#8> =4 (  ",354.% )'    &)(# *<>1""!-7>$B)@)<%51 .-+*'#nbdp$1="A&C(?*<*6-00*4"7;= =7/"    )3750 ()694#""  +'D;SNX^YfWbRQJ8@736?FG =/!whciu!'&D(S%M: />IPSQ*IA>O5T)OD4&"&&!7B=+,EUYSG90.C(P$X#WM=( %)'vjjt "8O*`6h8g2])L 8(%4B L PLC7,$     '3:4%" ))$%/3;D>O;Q6F12+*.:JYa\ P ; ( " # *F_pxxoc2VFIQ?Q6K1?1/3"54+.95%*9BF%B;:M.U SH 7 ) ! $ /B PZ\XK6t_TT`u  #&('(*&055F9X>h>u;{0x!p_I4 !0A+KCET1YTF6&.B&P.R1M->!((?LR MC4!   6L\ef^O*?308!:60$  ! +341*"%5>=3($1 AP]dgbR: ~pjnz %)+)8'F(P,Y1a8h<n9t/u!peUA.   %.5:93*%%#9+G8OCRIQFM9E&<2,('()*-, &   ( @ Y o  ,q6V;67- $&!  %.#.0'63*  ").133558@I U]\Q< qejx   7M^'o1z52(~r ^G0   !&"0 FX(gBmVkac^SOB80!%  #%(*(! -<%J*V'b!hprp#i.W5?9!81&   (3#5,.,!'  "&*-3;B JNNH< ' vy #+/0-(2%D&O*W/Z0\*^!_\TG9(   !-.& ,7BJR*W>[J\NZJT>I-</#&. .&||$1#A&U%gv zl.V:<A C =/  !Eaj*]0D*#    $/9<;6-$ )39<8-~st,5:91+)CVageb]UI!= .   0 >@#8)%-17=DIL%J/E2;1/(!  &9B B6"  .>K PQLGDFMP+QELWBb5a(XC(    -RgfT7 %,#/'1)0+/+),%.,% ##  ,3311M,b)o(t)s+l-e/]1R0D.4&# "/):9?C;D0@ :40-+)"*2+@,I)N"I9 !%9A:'"'00;3>3>-;&62/, +.059"=&;)8(/%    9LMA0!&0695, & . 3 0 #  $#4GUbhjdXJ9 *!  !)-#*"% &/'4>7M5R0J'9% $*'#-;??#<'9'5#5 469<#?*C2B:@D8J.IF8( 2<:0#   &/'3-20+0$..//. ,-#;E C6zty)8 @ A4;D6P1U,V*X)X)V*R+J'>!0     /?!B#9'),17?D*F7C;99,/}#2#:'<'6%+"!#"1&E+U1a6a8Y7H26)! $&#  )+&# (-25*563?0D(<) '4:<<Z:l;s;q<h<`:V6K.?$-       18!5$+()-37#;1;<7D.D!=,)-164:17011,9(E&Q(V*S+G,5+"'!   !+/)  )--*'(4'B*O0\6dAeJ`RRS@I'/ xkgp!$2MBmMOKB|8q4d2T3@0)'     &("  %0):5?=@@<<0/ #)/5;>D?G;C3=,1%%!  $( $   ,>A4  !!#$*)7/E7P?WJZVW`QbEY5@~xz /7<UDoFB;5u0Y,9& (5;7*')"  !$')/-12464<3@5F4F,>,!5*F<VJaRfUcTXLF=.*   (6;9*  -%<-G6MGQ[PjKn?d,H!%68ICTGYAT5K)? 0  %39 7 1$    !)-.+)%*20>8I;M6E&/  , H_1k?lDgE[?O8F.>"2! '(! &''! ,32% -<(F<PMWZ``h^iT_EI0('0*5/6-7+8(;+?/B4?02&$-1+!     ,<J U_"e/c:\AI<-.  +5&9379/;*8)1+$/1 + %(%    #;IF4   +/5>>IELIIH>D27$& !#&!("+ .29@!A":)           0>FL&M1K<A=39,"' '$    !,10)  !!    ,:#G.O7T>T>P=H6>+0    #&+134 .&      */.&")1 33!+*+(" ,9?<!2!&  "*("  %#     '19!@&F(I(L'K%I%B#6!&   '+('('!   %!!    &* '  !*/0-( !#7EKI@0(. 1-(     ##$+%0/,"   !#$ $08:851.-!+!(   #"!%(($  # -33%1)*"#   (05662)19.F*L&MH< +!  '- 20(    $) (!*00.%     $&)5.D1P4U5O2<, ~w     !-5 8 3 '            %31;>>F7@)1       "',- -'     !"# %(-4'<+A0E2>320-$$ 2?#G1J=KBH?D3:, !* /-'       (2&<.B7A;9:.2!  $*-., %!      ##   "+!4'<,B-A,>(5$(  &067"1$)&$!!""     "(%-*2-5,3&.# "+/!0&,&$#!*-&(++' # /52$  & +#-')' $    %0772( "$#   " $#%)%1(8-<1;626#2+ #$!  * 2/#!,-(    %*#  "!* /0,!%$), *'!   #)+)&#         $"               !#!%*+*)%!$,#3 54-$   #("-$-#(      * 1 /&  &($      " 0 5 /       )24/    !          (*&  !-'5.7-2$(  !! ""         & 1 6 7 3 &    " ' "     )01%-,#.(       +12,"     "-54 *    #"       #/6 9'7(."#       $*02 1(          *4?B=-    "%"    %-.$ %***(%$&#          '/450$!)(  &/52 ' %'"   $&&"      # '+"-(,**'#   ! !&&# $)+( ! 06 2'$*)&!  "1 >DC7&    "   $'*,.-*  !        !).+      #  %/8<8* +< B%9'($    !!#,22- !  !",)3,6(1)   &*+("  ' * (   &**%   ',*!  "'&! %,-*$ / EMG!7 #  ",0 . &  "!"   #&"     !        !#    %( '     '-0.&  % 780 "!    !')%    !!               ",/- (    &,+#(*$ "$   ""     !+253/'                           ## ' +(          & (( "           # 03 .!   $(%  "" ) .)      #+ -#'   #$#    #!      '12, (-,& !%(!%             "'*'" !             #'#,'       !!"     $("         !  !!  !('%'!                      !          "$!   (*'                                  "'*+*$       $**&           "#%#                 $#      !#!     "$%#                              !!"""% (()($              ! !        #&&$                            #&&                        !         DisplayCAL-3.5.0.0/DisplayCAL/theme/jet_anim/0000755000076500000000000000000013242313606020313 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/jet_anim/jet_anim_01.png0000644000076500000000000002351112665102040023105 0ustar devwheel00000000000000PNG  IHDR^PLTE $$$+++333;;;CCCKKKSSS[[[ccckkkttt{{{ݪסۤԛ̌ӓ͓ܜ|stj|e{kuT|ԕLtɅZ[Cr;cK;4s+s߱cڍ\\dĊ6{|l*lڃkĶzTTIIl\"\{3{Ҍd$dDg[;;K44]lj&jۓۑ<\\TLLS'SDLg4gmKmhFh##cDcc;c""tLtv7vUVU[*[[3[--S;SR4RD1DB,BD#DJ2J\<\xRxc)ccʝSCCBB;$;3#3,,-!-J,JDƃ;);%%M?33w,w^xCx++dӂәDT7(7;;SYAYiQiu33~L~mӤLOK9K/J%Js``Rs$IDATx]_׷g2I&a}Ad2HqBqAŽD¢b-bjP[U'iw~;I*JBPp%1 sxyM5^kzM5^kyߜq_}x/F~8/A8A !A |"k2MSF/Z./|%3c #,/xR'B&RF rݬRT*%@yA/_o"hLLF'2J jzpp>>~3䇯F)VPS~ @fhP~x}aG@@`3Dd Qd*{`CABwG\.O.88((/IYe~P*{ 7# (((><"222***:::*:* DAE@Ţ s8\H*W?ˏ/YbgM@ 52WN]C0 4r E`phK:xz[ 1!AASH J7@TD"uz]<#'` 1ёa!@ MTx; , 5x:9:aKy>q4-QaAiSTN'w aF,1_:aDqKLuG$HL|ȈPD/hW(^SFJ퍺 MB#0 8!@Xx)bQ'@":LQQbBm9+F mhDdL\<"z_DxCAZ.e +$a^X(tb+Z(SLxVD<EdJK!CVg ,L2嘤lɘe3JRF% H#S QS8P6PTUXdT,R qi`,4kE JJK .+.3חoB0&AD$,6:2,0/#2efP$0I Hd$a$dJ5Uj,zѐIDO$ tt(+~DNy0s~/UpXDt=p{jCm|Yj㦊eTۜjKz `XT+ 5(aQGGSo wI.fE+Q?@fGBiqc1iy۳Zjk[.o)\QQiSURp#(^L.0G&Fܮ :/£f":⼸@4d57,Y[+%#cO̝{viVyu5THY@ȃ%6 ԗ?zP^=qsAsnQ02Ju?q$O=Y׉SϜHelV]Y_vZ޵]t}Z}]]-aX<^Z`o0' ;CXAb+9E(T>~޾;v;_ sC6g[Yۺ#p10TVώ #ҥֲPޓ/С+~>RDiC;2>8^Z) b2AV{vK}=mU+r/ЄLt0O?3*<8xØCW3AWcD%A0$ZQ}vVYhxe)˗rM 'Ȱ *{(ODspQԠD}?l8Pʦ'{v<ݳ8鍋XiZqB~uŀ(KAJ|QЫp1Ţ~q_T=;oC米Ax|pwppixQ:]A3Y%0Ewcڐ+]G _S.6Xnk`H[+'ou6WȬDE~. ! :£Qx ⦭>h+QoWS97QM (]6bOB($Rּ>3 k" UK;vs*_ ^1>E=0` IJnxGJ8y`EcrJȯ-+.mm#cyE7Hbvתe_(6֡pfL/fJO&50DK;&s߉CP*vR!雨՘A wDe7t_ʥV˵SmwŰ(A4# Fd DF2$b6,1sOCMMy=9{3ocwGF~`ޓ)ACRNv@0e?Ox(UE"_2`Nh.|=\ZRTR0R! QZ/zmvn2$8>o]?@p!`VT0R[ X vv?~!`\ GfMQcƒ1&d`Ɖ4!ne27Z9we&f]juxQYhy4& r#zJ*)`GہC='G\eKόQ¶g{4wWJ*`I&`ܵ4Xt%(T*D{F`XTn@4wt~v)ǼW_g+[6}.}EQD9DeI8tcFŎG+}fU1E *8۝ҌM志fEMPVFf5jtYSŚ=',Vqx3PqYq (0s!Ľw^t(] Z_z)i V>j}'1vY/r~MQZ RB)aY(Y*@H$1 Xv?iZ~o !3a|,gx؜m1⏥*ͻm֕:@!^۶|O󃄿WaÒ ✄@?"[jҝʱCJ^!A`gʮ;6$ 3mʭMe{q21Oj"VNKFՀdCB#c1.ܰ.;dz/K3oun*oڐ  `DJJHPLMmzsUWO~IMÈ)qxnuш&;7:22dƽ{$C?gKcMUzpiIq- ?{Iy?9qc8ݩq ŋ]Ս?x4Bq#tCD? #C+qoo8?WU=)1:])3 d3BrJ QDI׻,# f:,w;QӐ(_b %kvdMֆO] % W'':$[.<" DH֚v>0> qCi1.'ߖuǂG$u"`փBd+3mhby;a&9V ڹ"0 2C!H`Xtnŋ.<{̌E䰵ٹK LFa}Ò W5zB#y˳̏朽v-tNqsbAhGErʑ&H񒡠H׈ $Gnm>d@CBL/(ΰX?*v!ʸ鿿;@mW#_<,}r07;e<yUZG#$?ggz, F( +k֎,N9g~kt"NѢZʗEa!wjy(Z#j +r\{S-ʐc~O[ olꗂݑr#Cv.@knh|%Ldv¥)$m3n&DV.h`9%UHq^M>vyܢ; j-Y~r!O:־!C2`4ե8ƓzٹuEr:HvdĖ3ӈh!h댝s)x1 /Y$E u'ӈ :HN(ay/aޔ~gRc1eZ[X1 I\r2?8|6r1y҆Lb[øIlsꮆի/b@0ʽ jm!I]PxtnVHvKˈ_p[$@dn!,~@=~jkIb8{ߩYm}yǙvo=h}#bk[~h]yO&& Œ[oMY$rVKV,;ѭ\c4o:2bsKX`sesRX HT%M-M<5>$ +._ ZQ==CF.ãR0pj}/ϸJ%rmRw7b9ӐcK86 Sr+ܛ5Ah4mzmv%-`Q{҇",Cڶ^~Ƙĭ:\œ zPgRZHF<9[jz^Εz߉l#lļfgc,"gݮעQ"vz'O))yEKe?]1[|>r~M(;-E`p%trĻ3usw$X^f;J% Ǎ)vKR@i,2#x[p'<)ƣ>X=-ܪghqf4Yx .B5+qF0QL4lg/?e>mx*,mrY)#&]/ {I) \;:J ??5dF3n!cmc{_!%)u/)G8y %(DJ}۷J\R>iq?U/WL%9nȿIKE8 $6Է~i4Z+qM, %׌9v 䟎cb ir"]X.R삎[D 1' Xf^НQELrq[ٙ Hq[+vCJ$0bTwosB&1ѽnȹ= Շ2`͎6D>t13rX } T]Dz9:7*,ttX͌Y fMܲ4I@o>+AvR۩.qJfBS/*m_}˺ X`,Λ$J+%r|lxmo86muyXm:ke_(k!gF8JyCHW~o]ΎxqDU"I!awZ3Z8p:欜N${E 'xb 5VbY/-r4UWl~>RK⦜%e\`N/j3uT`㛫vܨ+/%ϯ7$N)7Chn^Iu0"a\X' Æ'7;Wzb 4zq6!4۸)`DIFqD&,飇 KKDu R?-w  U84z>ՉVi׷e|@! TIkތªkh0/ xEҰ]TD ke'Ȱa~(733K/jZZJ?~[9ugN<ӶҺ9\. ;~zqjׇjgd HQ"JuPHxx2E&` 6XrtlW sݿ4kt6+=XMpq5`)\dplE bMEc@B^-%Zn66e7ߞղpyKajiiގ7mjo,-*((:y]B%'TS}ŲSΔʼn,]>3CIIp6,r4?jY쪌o& ' BA"ZY$'aM-`vğ+׉4 6dM7lڸ %ÉLjѰȋ&h jUt@Ɣ1jKI߱O:6.؏N )ؔRhʱ)!tpdLS֥L=c ;x ?k5F'_Q}Q61J6"/Iiuh2IٹSɰ, |fhtؼc8Cn7]f S[܇0%4. cban(-54lh\n׬v,=q Jx+4Ԛh TP9#,>4<*".-Foė/-xs0]Jz!psXyjb*/_he`H(6谛Kͽyi;"OsT|hso CrsBԳ5EȜ r%2*4*a9<NHO\ONOڭFGxLw_E 08t̔fɕps3I|t ;8Nŋ3l+8 $,<"vct?M wǑ&Mn٘I08p7||@BpP3;7fH18"4 V%y=Z+א7-%脪Eα8#툊©@CXt0ϏLrrL{/TMd\렣mpL@``R yyJRJq lE 3:qhC 6~8& `p֒cb\ķz^Ub$>ɴ_K >ؽY&LSSlc&lH’̩"bFf|i 3Ur1^(VEQRv|4J=J 9=/yX#:`pmqC")PKt0Š%yoW+krU2#Tt(l?{cт#Xy#u:Q19Ø蜝I=.'{/lRp3* f`w_]q2,"{0^̼d|z`P#II^I?%ˠdcq>1^98Jp)§YwN$T2݃Jb$(da^A$[i}"+RG$]D&`7-"=HRE5jbE2(eOG i#‡@{ ^ ($J&@18~t:$@D*#2hZޠ.V C^JIL4&-ܷn]K >;Q*&"/U/2Ր, PZgiSg6 FAo4w`r-LvV %Gbj4ZpϠy3~z-)"C@ C zdRQhQ#| V(0Z& }§FDd40XtF;@BF":&`6a4FtZ jE)_JX:E S*҆Fn 4bcb̍G\x1QQ??I-~gB r҆H5D} nܹsGȗIXQ@2d̊[BASB!&IJNIII?RU"0F^tଵQ$_R!HBVgiѠ = OJJwFb11qyɩi ̖p+x,B.<<¯%( jAQefGy0%s]щH0(-8*FlBB<#uaVjX Baj_cV TK|Bl -/l^O*r\DDx #dX,9+xڵ=f_]ۊl|j;< ̔05c Ѓ/Je}'A[aOA(0 fY&L^ Bޱa/^]R^\,+~C`_cYK& ѡ N[e(7: buf^w-akY^a۶e{ebKqi۱UpxGo7e/Q@)XCT)znw(-8!I 3M ˓;+s**k.†ƭU6779뚄M{A-`)X& ǽf bށv<]*mHwWf'|-WWqV>PV-mRYd 틐bWd-ȥZ)cUACU>w^ ZUvbu8ل-Ϊum{^uE5Gun;m{[m~±A8BnŒJOT8:/lėٕ|dF[Uyʒ#;ӱ`~DGWsUOmj* hY`J&)`]j]Y҉泫h-dOlġJ48xY7:{tYsG{v|q>>??:>?[QTξڊ*mГ( +K^Ys"*sJvveNfetk*mZ~~r}eJW}˗\?U.*h&&[5625 VR3I$!QWjXdpXv|Ғ׶jn}-ut'F?{OZ|nwo>|jCM V@:/!ifg @ݕ*Vc@rt j;T*5^}tϭ_\1w0"bDH}Otl yard(Dώ"@L8oBKx+_q`/:N>zeȣCrWBY"PR^x0 ퟵǺJ.וM>XQE)UySa++ֺf؇ζ/3ޔ{4љgO\ ɖe$Z:9rȴ0Bq[G[>!ŻmFsql5|D}?k+w]Č2֨ %FLQ  -zź"&G6~A?Jn BG`GttZp)q-&rcRμ)!:=$qyӲ,hX77t{B|/VfDd>JK  `@9%9:Om+hԇ %?,׻wV~q+ge|Mи":,*/2hXM_|U?^/_u}^ܵQ JCgB&Yj Yzc21 1ɃnIar}ܾ,v$2S3U3-=r>(|1pbBHZ!!lmwlģy,oB\g^e`ԝ=KyÜ<WKT׃me!B TkH2[`X:NIc+q+=~מu\lJ,jp=K -7r[0¢3|'(7OVS| %%N " ,+1]b;)]n/) Q'A.4n|o 4{RP$fC"UNABolꆮ?Ɛ&ɬ&|?znq71'# AqF%!HtS3"B,;3:}WD7 \F;3pmws&P8#68"⊎Vk}'`Umwo%Bz%. M=;W}T6w3`#DSjrȥ,bbfۚ?,B bnJ5y֥p_xg$;#9ؖTPNtQIdYfKvު? ([Ktw<^sݶM;zJ"fR@XF*yVGchf¼9ȕTS݊VB@ 3G 4Hԗ٪7+D99 $\hQDm?u`bSڼx %Zw.9-^g4'Eu}uƫ ~,\ƅx>t9xXMzNJJ\FS 1䪜hL  ʝ9Õ1W܊S")Wz~/NU, e@Z"glZ E|bpv^T}"'➹ ddZ~:4 FOqkuzdsX/l*6,)ιF?NasCܥVSZJ|,vil+05:NDK5޴oW\ EX)`*ȋ^[QUeBȀt[0B3@jhF 'ebcҗ =dh%*^a;_ֵ "߮ڼupSUz}*}B Q8)b."Ed'75ezJ֓! FlM:>p0M`ӁLhG*O]FCDˆ$`T]]s!ÅpCré5({pv;o535RM_uCt\0FeɊ;kvom;oEoa>2G;w_=xs+X1*/0A"{-\hH&iĶc%*'lܤ "L4o zd` IE"| P_dDPTo(.8q>0mbyٶ3 JIX.`A aZ\塑MKljqѶ=6HV*2y6*jNr<4Y!5]=Owipen/[O?m Bd)R%F#j]wi"غJՀI.FXҚn2Yȶ;:t+c"\_:#/5y~w6堼=@edǵjIJNAr6/+,?uڙ~ YZL)DJѲ]Ņ߰Rh7EM[oʌZ9Kwxqv;A y$-m Ӄ|10$b6b̴~>11BPI I|MΓi$4VjXCΈC;_KdZܤ|6"r͇#boo*Kk&/-\qa'VE1 IdZ^8vS䔶;p{Oo޷M)$FZa_9 j0AIݯs6 JEE*nrMW`< wQ#>+pN;8#˫?;jwE*<+Sw( EvCCn+b2E1F %)9qޟktEY iDn7"iG-..Y>?ֶ=1"Nvf"4~[+XPox[o[!.0~!ϱX]E $̫s4;[B4>ڠcoXDR)R]GӐ2MC'WTn+wwp{69]=dYlwLv k*]ȊO<~Š3S-ߔ-o"##e}pa#~IQ %AAo]vO{sAg`Ӻ)_mx_Z##5ˇK#48"F3.[džMr QMY&q4aaȯQ.LJ߀&Gm\檖{p%,Xq(X&,{tL!ӥvav=3c@ ,bXik=sy&N냹BTP鬤"U0̘Q%lѲ B eP͞R.{yu;4ć@EYhG"OQ+c)g&#\mrB XJ+ӫ#x̶#jp쓇lk|~Tx@KokJe 5d>FQ$A7m-4svJ6+kt{_n}#7֍ >޹Bd?0T#ƚE(#EiV[U:/VT/ÙhWQHH|^5g>J!N-N1e8Kud=6kÆ̪ESa Am7XJ_ɲUJOM&z_ῴVVI(-(_ZB{ZRYEx=pS.qSyfD^iAXWq)T=ra=m<7mg$Ѷ|j6'1d榠SUuPS6JY>p3iؒD jƳMݽ$S6kI>3`q]wVE7)&J9p+߼R(ggaBghH[gGR;vvk\scѭRɧ폠 c79x\jΤtd ݲRۯo-d+{. K\M))hZ[dfLEaq j-Fx2l`j=RnnPIK^qÿ~Rj`&ߋ5Fתf:ÆvWI;i3R[ҍmkʻ[mh^rNỿ֔BPPޘ(u!J.XpnEgaº_d Illō %|^M7mj,ym"dp x7?mmv{yonQM&n| \80˶4vhC`f R!^yʲV`0_df[!pDn %lkRm{CWϦ_\n8M!ȮBǃ[>:[B[kѰ,RnOaoO(Ѱ^SD w\Y^ydt[71b*u(np NVY7MB %Ft\qI`*jhyO+ʑ!ӳU+J`[| (|q|A͙Sc4F9"w\TR}衳ܽ7Fb~!Ji뉨x/}U챕8Ķgn=7iF̸qa|_\xGq[8^DZN_C0xAU>+g|ɸssM;8}^z\J.ʆc`>~}{*lO8!.B_:.rτi,c\L 114] x> / -{zF]ݚұc6[,YlWQﳈۖC)qc I\eݞu[[jv+8ަGF\~\pjwpcL8'CyHdoD%5o  JbZm_t|<* %K\9'pTOsoŦ J3r|Sh2kX}DфvW\1g+LtIw5'4fAA(]"!!+g`}03ȺXMw:疫[0Nd.{}tw'V?'Vz%o62!ES!9C᫧ Lp-يcpՓ8e=o}-'Y7+ ̹@^*6պ 3A.D|.AU &Q4K* &YX[' 9m-rwo4&P5Jo8z_m<~w ǬyƤqp3RD)p2gGO|Ru,)q.F=U#ba=F.`FmTZN1aD|RTJ`xUZghAv{~@cr87wᕰ!n/YφєpR.$ l/1fÓ4x0ƹ8gy=Y@[;; 2_nwŚc5Y SS(Kjb~Mf /EdZHaʹ9c 4ؾnQ6޶Z[;mW8 $+?D bV'ߥ(*m07>e,0e(z5<]!mԣP" |7p )DpǠTfaf;$iċDQ,iӺ%^2:p!&{: LcNAX<{$q:2Դ4Jc;,X2@HLsbpn (٬Zq/D#IkôBFxs&'A*))`l)=i^jXkC{|ؤCz!OYTMWb"'_ƂK*8[C|]bGܱ,3BZQCkpJ3P J8(VK*eY%' ?ˑBVf0 O2&&c4RqWTQ| &I[#<p!I4$xEYh:NhRIr 2eaM(UbjQK=Ȉ {!G6^uܸ}RFJ6& ߩ 5dM|` E0/l#g&Ji0RKU雾s7W~1#i:U 4%0!"%"G< .>!dpd"NA;xo>)K\l$SXEj#:0`'KC aИ*d?GM93 ,>(Ɵ pϢ|k)\йaْjglVDWsO 龤 ߠod.@IzUk'-MÏlΗE:Gc\Ą3Gsڑ k+("C2_AAtAEܸWY GOzqEfz}^_k>akIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/jet_anim/jet_anim_03.png0000644000076500000000000002434212665102040023112 0ustar devwheel00000000000000PNG  IHDR^+PLTE $$$,,,444;;;DDDLKLTTTXWX[[[cXcccckkksss|||ԢݱܫۣқҔŋ͙ˍÃsۓ۬lƐƻ|{c[tԌԚUԄԣ\LZ̄tÓSKs>sۛ|ctAte:e\3\sc5cS܌˓j4j{C{cK+K\C%Ct{j\uMutTtlLl++dKddDd22lSlkDkk;kmuXu6(6ZDZT;T$$K:KK4KD3D<#9aL~?vA xgeY{[{koR,dL. Z JA& >?ɖF>TH_!DadC6aX7Kku!!}KE֭Y%DFR]}*T !K-}2TL IɈ, qi`sPG |@u@%jѸtOIbL""JvD5 *=?(Z,N(WFКP}uzd2F^׵LE{"0)B `0u(N߀`xYG"z^TAj0PhVLL  (i3KY&&C'LBqqxYcЮ@1jcT _iP)ڍ΀| Ʋ|5AGY@oy1JLX #h$qL( =>ѨPt Z KHHHL +HƟU*M 42@E\ޥVb{ &2󧦦JOO?ৌD ψx$(}ʻЉT (1j"1)%%#?+;;;'7'쬬t'AԠZQ+=y˔jUTz0v)/ $yG^ޡssA4PMM xLqЈlWj5 7Q)3Qfs~JdKKMINJCP+z ^0@ԪFHHLd@ @l9b1᫹@Cs5)I q.#idz+z!dgEOgKH\P x\>X,G931|XP LԌD LoG}`Vjr`r 4@9 ٜj 93_x3_[+W[U UX[ށ,ĄXd ^-őDʵ:S@ @'cJp\ 1g[AssHa&(Itt fyKW:e=UG-JYsIb~, E8)p全 ]D!3łWARK1[D hrn,zT < b=.'A*pTUۄSO qYor߃GBk*6 3 Zm v{sK3mmgZO״uTڛ6k>ܜw ' / .'C]^p.UbXqֳ-nǾgϞrkt7nxCܧT)sSR RWHYҕ!KQ*qB6gju:_=PU=xPuMFjN5l6Zabb)}R@)JPitd ;JWtӲrP}Pe\֞Ѻ.u]4pѳ͍-n0*+oD=(%g_jrͿ:.F+ؕ̔l\ CjPWlBKhC׾~s[ǿ6xPU@ m튓'j,W*8zKX`;W`WFltܧ6^hl+GzW /p;3o?WF;KNΝ_¿alp)F>Q%ɮ@UG!U?-uxt䃇ޅԢD?ũCσcڟ\p<])jp/r'A)3'Ժ ]`\Dl)drtP.^8*o}VR7͝}gDQ^(^Eqfn.|~Ruۆ:s1t)9i)̺NEȝne]p `8='nyg%UyQT*2g9H<XrXX$R9wѮYPnUG}yC)ҨD׻0y SE xzI:u11:Nɛ&K"pb ʑsXS`N?⦋?~3'oѫ2 E=^/vWWV1BGSa)AAX0!>sa}bwǿ=ZT럝׋]Ntk;#-@*`%?b.@}h+!0CaqWB|sWߟ/mVuG#<ϭjW*yd.L&&N)"d\zז%q^jK;W.m¡OONSF\ZQ=.!%-Hu_MkİjcN`x_x^\H:=:ňĽ z1^޹=Nkߙ΁'_=Xn$tĩ ?h+N3A])D(3NYSccKM#D *wiavf;sܬXzvJUElX2DԉP# =e5 yCHJVQT/_MW{eJ -5L#aBB8+ 1ʅ4?suƌwl5nH!Û]]xw&H4; iC9@~Ѣ2 Un`QAH9gij|cOMj-:z $%FފL%;kO\d%1uUymQ*`5@vjf\ h[gD"xZr@]/n#pJ>sbW)XH" }Ǝa0/ާcf=bdbHE6[rr^ DLy)H"6$OO;%W:&-|ܖ -'K,מ(N-$wb0! .G͙Eq.6W9nopWbVjR_ՇO[DNѡe-FrW>qc ;YJ YZm"H$Cx |zT6[yS ll5/߯iK0"y3i [Q_Aa6;++U%eM%AP><&;i`+\MOg'ZВ pdͿ!z=C^ O c#DZ-.wJeg*V|jcr…ת x%b W#DҤ \$-}KjkG_<02e|WN5,)+$3_(nH &ʾA#gW/Oč ;d["aJ,,>}Z_QkAl,gBhQ(ܪ|( ),@Aj݃ޭ[~HQO,߸tb_t$# WI>F̈1: ?vF#ӷ/U5V@,B2WiQՎ;O=>q3ZWP nF%E\VF[aB# L b|{ SV϶ 8z5$­C`-*7̧BU7=m vae~{b@ 4e`7"~5-H&#eF:W{uVunT7'KwWΞ:3QvnV7n;f#ycsV![vD>LI]UgKLIN6|MvXʃB]{ĉ ÷$c+[4AӺL0Mz5Fo%_ cR~3XKvTH o\g!H\QIwTM:nFhdU~&:nSSmUƆGV!Q/|rYb2c:;mn (|a"aT! ^˦! Zp1RӠH,D{+_h6x$ "ۧ3 As y g +a39h0y WTmnU~Z %Dk4a\fV1}ĊD$ Z/N=~z|b+HɌ1h>(R+mcou6an0vb`"ܽen4Ljv:@{Q,eIϼQ͑kot֯ŇWs-5Hx}_=}sq%#¹# 4f jZ*&I[RW&}b᥏]ga^*Ѽ*#:Z{p_Yfeiǒ0-./Q*3Bd)J%ӮF+BUpjؔF 햣E"=0*4?t3B.b^|VFmI.%G^2EKc(y0ZzzV oFf4U:HJGhYHv!MTl4w56%[{v1[e<ւ*hFr9ziSPKsmO%wB[_} nՕЪ-ϙ#=@g $GYq3t^n>6fE YmP"a-+5Dvuinq7}V":uw/]p浇jvnPweHs&EQG ֶ02A/sZ[{lr^qz Cdǜ~]:Bw-,1*('+j%WxxOq?>`2܍+X҉r=xfΣP0 nӜ^3)xl_M*SJAGlk JP7+`XiFn+q8jA4그1MioC> Mףekk:CBC6z\<ԄVWڍ Ocݽzx[Ot&뷨-s% 3F[wux\N<=_Z拧]@03=L#?/( #숐)Zm-yej< N^\o[4ze &M HJLC6![aJ\C+=?-^S $z PbO7[[yyw^OyVԞI:`X=l@($:)*33Bx) $k^q .„[ RcZEp4\ `+YKQ{t5ZV.$4&a[~k?Wc&]i]pm'E{%nx燆m'k/nx]zv(ԴtY.}f{^;(k7yl3}Il|f Dׁ???Ԅ6A7:YT9rU6GO.g$bhypŢXz("DRp]wOVG/!& ӓ\Y}O_qB%VKq52e!UyZ̸п+?ti}6$.7(+DE[sa>dWuoi =Ks`\qwg` |7UOG뛏>^𣻭.]̧F)QD>bG vz+UZ[gr U׾LO)*D"^V Ǜ{]V%6}Hu,Z|ËܩUcw`«੸~k^wn>Xb{şn-/)oinxvAOɘWc9zdGNi<^OȲ Vۚ~voַӦ/~73ҕzWYH;Dl d ްC vDgЛLӲ |Dg ^5]<}Bb+?u/wNԮ;B/Ah@7l'B΄fL?Z)0١gW[t~XjnЖ;%NP_^DCwG2cnl\g4 i\ @$Tlk/?,..<>ڏ +zŅe&Hue4hZ; 6'Jw(w?ᎲFaƗe_{87=-./3O.w VWFa}#UVމ8J\ޓЕNJCH1̺!Ž}E><<>|iUw5ӫͣ:]#kUkf3}ӄ.oà[oi9~)tݿ:ZU=X]=ZMMOGa+6ڏ(YəC=zu7T7DҰ3 fr6t;dn_spi#6[(g]#0 +CP&Ҁ8y8c!TN)h;oIh:&%9%%e/8&3ġfꈊz73l]DP:6K̄$$“'f&7 8'|`FNFX}QьtG :5ʀp\+kCKU"-=Z hYP) APV w=]T,Z q=uCSC7Y ;f@C\pD.4>n:)QQsw<]PD!J#BC%W D!d$Aif4t,Fz~f}M81ב(ɻi4dJ-LfSbHTaf𩼟f[li`ٔX0QXW&Z<(3iןD yI"W5sȇ3D'qLB|PӴr8QY kބmf }It2:I]UY/w|#C`P` MJ 3̐͠)do[{/.Ao7IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/jet_anim/jet_anim_04.png0000644000076500000000000002707712665102040023123 0ustar devwheel00000000000000PNG  IHDR^UPLTE ###+++333<<{{k[2[K+KK}tk;kkS-S;$;[C%CeӋőŬybL%L|T|rLr33jKjjDj++3#3|L|[tc4c^seDe$$T1>tdKd}\}tYtkTkDD00?hj[jO@OfRfq/r,+IDATx}_Sײ?;ف/JYK{zr[ IQ @Mъ,I {10 DHp֠G]c|o+6g3ġ/Wn]vQ>%ZUF4NO4"ĢvHܑp41( ՊRU^J$gE0W$ރFRbމE-l v$&%%%'LI䔤D(aؘ8"@<&(%R4}JP&^gBeR!QixJWڮT())qjϨ7cLVDWLqD+ҋeJT,">HJޙnݙYY,KFVVnKffFƻi Lb"e[,g=7ZXSPjT"m㪢n 8?mHK ,Yl'Ŝc6[ϳ5zI@+: WjVr-=)bR XRFffs97qf=l9 HǒfB% j8zF·_4 GRahL1z *"3 BZV3ǥf3)W2sf"KRҎmqqF~PѠiޥx*1sBGBblO b.,3hgA}/B1|Sʁ`i1D楎ڢKDtWru5HN;b4d[ǻ/ 8~WWy$J-ǜn  @#ɼ^RDKX(Gtķmgf|R/s _Y%*BUoyyTĘƠ B$&RF1\g%jGbr*Bpmrg5lZY❵ہ79kN쀸k$KEB!^R'BNIւCO1A Sfb:ew6:M͹U-VWCDmBz J2(%>tCJ^/K#lV).QNTg޷qBs:#ڛ:Jtv[k:KٛlQ-Xۊ򬖬4+c (OÉ(GT]u&d񠎝લ9Tu=Κwoe]]QG_@ࡢ{j}ha6ɂyuwfzZ2X cS4Qp増F%]@ n8[onh+k7R{D}x}DUoe ~G9oE JIOʆDu$)0/Xw#\ʀAnU%1GK'cvdp1ϱO?ZQtQ( ]1BK%!I@`Wz3?xuoyt^ qF]&]&*2R DHjӢ"nxͶ1V{hHS^և:XQ<]Y嬲 7<_gkd뢾 < 8(Rx`Th)&#==3*ّ(|> IJwL?545/12 IX׋9^AQCDڕiVuйo__d"ߵ0>?W.O< gmV+ל0x~#h|*K XӢ@0fγSx76uK+n.Z,XŻ왻ȁۅRrpFN֐  尀sǝGF/yV?|^l}%w@lN˜s- h\b"| JZC>Hi;# s^mvuuo?g팑pw뾉#lN OvLLޤCGHs"K,+J#V3)ۇ?,|?OSWK8U:L %}g6~H@*RuX豸N!җ}/~1zYd + ,'&*exkFZRB<:a-5FoUF0bcа h9V}pYˊw~E=D) Mz 2p]I !TsE& 9d@K_tk7ƔuYG$77iߣ5_6q#ޙ)Πՙ`|A&ј"!QU>R.f`_7f=F75lLqbШX׈5퐠β';쓧:g!ЃQ?hmw9%"m` ]:bi*E"{;}Խe3o:Z̺߇:y<@Qwm +q{d%JqDRv4(hCa)VIuU壯}=џl5+ ʪwgfnyͻsu&EX[[+iVĚÁa9*>.(ޕ`˄f]ueUqq{ґCPl4KBrKI:1I0nwݓf$*¼B@]z[X>j& s,%hOBKQ]\4;&鄛tt?|ܳw|LZO6O3W:?n9V V#4:[]Gu&,1 Tӑ/x!nĘ֋奉M6uwZJBc.:Zx/.0rBbA0,[`]? ΠQ .\zXHS3W{{-Ɉ"VM JFH *tVw>ư>R4vkl6GU$ED zɮ[*.Bb0Ҳɻ3VP}M^6W>U܂'CU6 wl: K;%.!`% D!BV(4\;oorgC;lیK:#dE@04u@,;'+ IEŸ`'5lY5ECn[yV0;qLdd>?؄,+./ȃD-DFFa*BRIi-3h Kw1lu&0ػK ׵UUge@V>k"#-PF,g"![?=]nM{ vuyvvzGN{(H4ok)p'3y(+,=VB%6RXMPiAr200$lpStE*jko?Ų @7O&z'k+J\R.3Q`–C),|o -ݪozfo:h\]@C"Y, o1pQg4+56gBD-??E|] wJNI隬$P Rzk7 =17{v暮ӥEg@EHRpLK^pin %Aveb+;04r* l +wߜgbz|Lb;.1i "R6:KVE4h[XE I=6VUf4=!_"Vy%W"rxAp8k" zH6 O=:Qɳ,Ľ0ÝY4qZJꢲ|`bLG[u1mׄq9jz<{~?a`MZpL`0H<@C1 #@sꦑm1G7Gņ\nj;:QSVme]AwP q[ye]ţ3=,چW\;w v,bsݩxh ,>( RCj|6ܲӟ㕊Ll z<=mfdfֱtPm]cQ#ț9< ׃Bz DMjuo}`0ܶ\$ =A 5l|}eK]-i KofJjJQ(ʼnbKlS`[kXJT!ݝiЂΨ7]AgDHN0$F2徵xf*\1l< ڷ 9>o*0ݓ.hy?hЉW`-nRH!%x/{~q o@kRPsjg "`X@.n-)PH+bOFualRuX{gaij0`W ڝVF!v++rjd7'K%qlX]od=b,L*KgARVD:=,9罃]է/]?7 >˵d*\Dİ6NӭzDibkWg~PLhx}wn}ꓦ~[dDa]އù%̗U\ g| ?ַdwq dʾan4ec eb(Iíg9.Ahj/ !n)=n$7-9Oaߢpw& xŚ *MGU`'톳0 ! d?MTmi˜H7rr܍/jW7;pmѻX3,`/,%?GomkA;nixtJ?h_#.hMx`+, !w>63gj. \|TD4-Qg[u&$%r3<5t 8Tb/N\r>P]V{ Jb-\obI em%+rea$Q>w]m2Q"u|(4׮L\f. 5O^̆썫&:}<1۴f4|4 `]N#vFr*tƄdtl퍽ן鱟}& waǻg#eC-`X% 73XHvG*}LuA<8EzRX~o-,ޠF/,Ȯ_ח&~{PPvMhupgraaҍ $RnzDQ>֎͵@Zb]__2g;Z\'Ni쵟fm(Ue/< N4}Xyeye7+V$/ )ж aB=#-YyT)mcy#- v'rV8bU!!93,lʚ an0 W^Pmrq&&JٕI|/bg;j_sZpWC9)y:QG\ AG4'zVTaYb?l5a#KXI¿)"P?\@UUrV )3i! <tE. J0}(iV@VVHa(_W!MY6wlu~CNxb8FKS d:/ F;MBn{{sШ x.7!M1R,CPE{ѳ/庸 #qjy2[z!V\!WaʢAx&VhVdLL01y¶d^Xb/48 Pq0XRhNHf?;K$Z/\?]$#j"X2 $1?}Y@ !h$0В8"R|ec!C,Ii75%aE+ EW&De fBFDEau!_ Lpo `::W(>^۱3955 #MHߵ DHvlq*65TiAaq&"ZLd6:dG3Tpʎ8"6ㆉbCCN1v[>E9h`ĩ@h GlC!gL!@zx5Ji !:B'IfH#ɬx2l?X^ـVMVȠaCcFOPHb.ѣ Bqd6AIP.!*J&Idn]qoH.ihP" `pReDi5NbGUjDDdf:%au eE! ׸q{=<+gC.!e*H]VD J8<CDPd2j 0rA`8ӕ&""؊LyZ"Q??DBkg&%Dmg?BVz{^oKbMIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/jet_anim/jet_anim_05.png0000644000076500000000000002676712665102040023131 0ustar devwheel00000000000000PNG  IHDR^dPLTE ###+++333<<qZb]|:|tԋY]+]K#K[;[ZCZS4SL3LK,KD,DT>ސ` x=GGQQLC*@tqzј`4d7 FsROHI-3eŘA!ɀ<07F1ACmø 9@x#x z&0m[L&jVfu8,H3#11]D#s䞇R1ΠGio‡aEj,&j2*.p1GEƘ-zNαjȉb gLDnvMHj[D}WGxc$%IdP/`ϒn0ˇ"Ѝ׃M#7YxH4g"fA#=@2\a:,<{b '0;PssIv{|g=)BYc8bY| a^YQ %k!"lLlIv{rrbRrJRRJJ2}NJo&%ΝkA(g1#]q74H**q "SSSRRS#%5-%9%%)11 AcG̠Z+8o^FƼ2szFFzb6 Pc& #e8H7$` 4e[8 w>o>\ ZHt"Ic[ bh+xVL[F\ %D*)195M&ѢEk.IK%l(Tc 9GO #DGAΰaB 2 2++sq A.\R@W9E5x=U\TXn!tyFgs3ӵ}v.2bP2R.1Y{xwyũ%N7L >:wn"\$R xYxΥ˜rSX!dJ֫NdPOlX/LKQkz8B?=:fa^i S RW&ܽSX%FtEahzY zCl6tƌh\Da)ҡ*,Hwb= D| k.kZtJ$1r$;[E sP2- @?"Tl!7xšMQk U|Ρ #4BW]sir\-eM@Q_VN2'I}*hc4*Е#4q"- Pfйp8!7@Z Of. y#eK-Hx v], Ht2-@cԔb?(BWH0x#1 [ 1xK|o+V,UwTں J&4fe?d//PW&3(D@gOb)+6H®n qOm}ۗ7/޺}_]Eqn;gP#OH0M  sO €<5Dyb s9{%5zE2߁ 69Ҝ]R|p}CunNXQPpef2&'x,DQJX'2EaKB 8*3+jg[/UT?|j*lݶm%jOX%C zV%~ʃϜkj |q'vug?ݟ_"h2 gI& (IF 8%~":P,2T\?;; E_Q.9Һx_\J˫׺_u|Ν|9-l Rԃx$t9 +ZsC̋BDRp y_N| C!>Nj 1Urjx W- B]ŭy %Fn 0?~5AnrZx  omi2Bcp^zJ2:fg&cw5|<*k;.|~_h)Ny4\F>oh->sے ~b[Q&O8^+ B ޠh%CW .ڗz?׻3ODBLpHou*wOg9޻KdplXF%' SQ0躻ZĞc]W9r`7qÍcΤpc{@Vu!L%h\g`>c] "&D3%?n h.|GO/JRYc?s! .%)$SJ5/XBRX+A*_urWu0?ݍOƕ/PZ/ ~ʥN<`b4RMKMfu ұl0m;,ӵb[ fUqM๙7-E(:氀CJZADN8D#ĊmJ:z(XJַ_hßN΢x z|\.`Zt%fRjl60Nj  ni^3A^ZJ{/E.akJ!OAzV퐘MC9YB"%ln/ ]47yak$Eϳ\81dy^]Qxb,V 92b\h07,Ȫ"oݽ#? XDiRC7>9~*(40`+0c$6Ks` )騲P+ o?.ӹ+A` DZm8XZf|"nlf&6E;qF3Fq! d( T4dQp0#e~Ҭ 2R%X2鴱[w٬#ҩ@[({'Y5{[^yQIpa4dQTa֠M``wЉh{gnOyGqlOvk|\G$[VT32S BFd۽rCCxqN[qdK{}Y$%2AA̅^.#qZ,vlD#Rƒo{!c3( Ѧ=?l̖0S=Q50RTfN8]Ts۱i+n4l}`[n x1F&"HTτR~1ltA(b~@ mbq|53Q t4:x 8A;fF͖ Z^憽uգo]!1T?!'C<ͫ+frЗNNlUBfŖ(U6W>%!3մ:|Ӆ*KK"IJ4HbqUeQnĊ,^DwTU210 ig)E\N H: ºN3kr0]gqëX.f51y̚|㖖d1%vهcP:mTKGW19dI@~tipK>#`H6#hbLTb!|=gjuSTfFw&oekxR0<`\R*;E:'9T.P[}0{42|yUb:[*ʮSS/f0\b`CgN~ev<ι73@TN8S}`Y08LZagpl1I$2:(DR{ 9knJjm 7ޯO6u2Bn]RB$Z`0ENjKur3 /L bE`O0#=/vgC߻:|S%\,`L0_~%!kD=d)uBk0YlTm_6%p\KKoKr6}#K;xc_nfs(' #XB hۿ!7;Zb>~88:6- lvnY5@4; MABFҩ(Ħ X )mz(NVi1EE#XtygidTC =pw:it2n!B19ZŒ`S'& \xSIPCCW~?u&'6l^4v\r J 1]lƧXI+W+ypC} ]?V`#Ս%ըD*Q_SB]x10uC(:368h9Uc- d|),98czdV.Ҷw5Yy 9 Ѭb=;2'R"hS I+tWtNxb2-J'[r痃utjԌZ|vxXlD> G(A/cL"MTS JЍ)h_Rab4΢@2kāsYARŶ}X"P3pmk93 .j;biĮ$v?q1K7agÛkX . 858A0gj";++>Wj btt4T].?'d-h$[]ltcXa`6cE.N"z|9Я N XnTWB0Xx>ks8WMj̖@mR¢.ǧW3#76cmY-t*t$Bg-$2,YvCcPYGV T]*Ydu % U2sϢa+RYH)dw)Ԭ;l>FK)aڀ$6.xAU#v=FJF@#cWn;KM5uM'j?ӧzKM*CW?lqLS ε>|nlV($`2cA=,Hta~`&Z7]UZDUvBl=b,F"HxԞ4xV~tw:VIa|Ao{[TJnj}9Fc (u.pfr.;7ٹcZe.O/vɧDcmR\4gL3 . |&)'eǚ*w͙id 1~0u²UKsal سMUߩ]x|\5k2#@y4b)k19~Y.|>f ? 3MvAG6)5x`dx9v1QAcs05nw4~'I9NSbuh,c^S#@=vxVkfrR(^Aܶ(-M4|O ?>=ur=G RDtjrD؋GlK]̻{|U?nI!mUAP{a^1sj1h,L%i`a1iϱG]}dKCyΎ@%#R ~c Gw=pl ?|й+.U@SȆRc[4גP+ hߝ.v\*: ޛq](.AȄ _:w)`?W0H}r f4}b l/G:vɇympf?x_ h"3HO從N/^bIM렱 TM1JS!m>՗;C?w7c6|\}f&%dj<;}~G2bB H柾"丩C)N [sN|QBrjtu6_ht0*Yo>U'Ui/Zmﱏd0ZOUҞw<.ZAYRNL QcMF*eJ/V:' '$C+8-+QdP 4<-*L 1Fvp x:k6l^k }Pn|Vt^#><|yFru'q<$;,vf,%ဗ8-퇏χqK4rz0а;@ x9Ѧx8h&qKĉ; Wz^96$ڙٱvNL]>8rGv6\ZswO~wy@.@/l;w)f ف#w.8H䠖tU8ۚ %hO)My߮k=FC4a4El& .Wy]G;r1 1젱6) #l5DW{2K}+UT%ǏK iq;|??w] |哝X{+8ʕ%l$V&DhDWBs,hЋӉ$v  Aa߄ 60ww]7Wչ6t?-t 9KXEC@_A,`49prbZqOŚ;hJq k Glt[鮼ʃ'5־㹯>QnJ.M/8BN('JOPg@lN4IOFK3 r\Ćpo'IZA\wvwq7bHSlGۥ\2N#Wf4t[DBb&tԅ\ha;-M4" þ7NYn]VzŠ 1iJ0 =pAdY[=5|x B7Irf6[@Ułf|6=ACQ0y]5ZEaѓ>9q R0F#" D1eߔ=oq=]l |ĐѪ.BrB2iAR*Uˤ/Jqߔ&أG"_aw^l,.<펑m2[6<˫*Ͳ0 xӕ6Fr}Ak¹mٕTh[+ z˫BeRٮ7F ,jFի{uڰUq/xgcJNީ{-J3yTb樻#~4Yr΍a ~o4M̽h*B9봣kk4j!{nϩ @C˼ZFJT+l3HΉleNҘˑ1FDmؖIt/6E1GD uvZ oA8&&7F_Rɾ2zy^^/]x?IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/jet_anim/jet_anim_06.png0000644000076500000000000002632712665102040023122 0ustar devwheel00000000000000PNG  IHDR^mPLTE ###+++333;;;CCCLLLTTTccckkk\\\hgh`_`ssspopxwx{{{ݫޱۣӛғˌăļ{t̅͒|ìdԋӅb܋kkTSף׌KF}ԂRAHj2Cu7J'JC>P hHHB$gdfff#;hhC/4b/W>g`RO&0@`m)ipp9pµx1h rKF5@1r> ْ/ :5eㅵ O)ϭ/aQR}Kr"KdI"Y=.-աgeFW@mDg$p\NaQ=;:[`gQ+9\@) 8z4/ LSW ؕ\TGFfNVD}2 rp۪55MUM.x(o{Ru X ,+A)Љaz=+ 8^,fJpSR3riՕ uuuMެִiO훻65׻6;e{PJz2Rx_F e^<1E2XwA(+;7 oG j8[Ztm*nnM9}ײ.TJ^.(% b=`b1%{gJu5\g0-I(,]E8$MUۏVhUǪ:*66}}ˁ]';8r;\v{!DPJƢ[9b@ȫiNDQٕ[<8 TC ݮƆvy;gΞ=w[󅵭7h~k}wcPW!pη+YPYR1 Èb|h8a$T"Vԇ8]~Qp5[_N{{}v\xtyז ȯa\/YiAR rXDt wsB@KYϛuk|o nghw'}姏 Եtu \M)(eW!(ei|{Rqnr{VR P @ K-[S„ s5LcEbbkKyڽTiHG7&QOWT">{<⽱χA5FoO=h]Tq? JaWA_ 1U]imik+REC s$ %5Gŭ#9?rox\x>}*,UKQ }yWEGzj0b] &EVI\OA h0[.9`XüqYH~~'&}~ߥOwᵠn9$+f3bBFN5xM t"G}eֻ.m%MϨG-+b%-jo*}?A) 57kQZ2XC^ faIHx~avs|'>ɍAĨJ-Jl*H%{s0v{o@<`OI@ZoSV=MَQ;b$|7n~ ǩzaϖ<QBLS J y֞UOvdQrR->:rF.ahD7"@edSX,\}N?EhXK y(UΙ;[cbO3!ي7L e )ŊLd0Lల!~gCN^j{ gb4$RI%=缿~?^;;9G$IYfA@BVk Ҁ%Ic9憖ꎾ9:MɪfV8~jF'=lvuov,jEA &kE'Qzyqj)ѰR [&^>я=b$u6d 8'^ 쬃">hX4.o#PR KZN>yи=.Ō¾'_V\,&@S`B ;A B;$\`XwgPU^o|g埏z]kg~* 0Ag)5YXuTEk+QH&Ζ ܲ'O߇ň0T4&ۀyߤ:ȭ23lkҷ~Ġiwo++b4"Jb8(C[Eo<e豾V'Q}m3J~x_6ԵNq-[e'+l5ѼW35-)"IJ#(xI[opΌj^}ߗ_㺶 𞜀J(CdX RYLj\og{G.c?-tGBG}wY 6`7K1qB8,g_kkύ c8g1inwFb,~[gfoS}N%r; &%:]9Qdَwjo>8QQNLD¨3mq+9 ?~uey J$4ǥ uSeٹk%GƆ'A?L$f AooFW>`ԈB*,e;1Y%$ ۿ('KT0Rp ^OJW[ qIPb4 b e狕窯nxsHq{/iX'lXH-8h dėj X9IL^PǠfӱhcL6"8vƈgsۚvǛnp,@D<Ѧ^tf `*}*\Z D糄+py!Y}|? U͎H~jasΩ_ڛ<:HI(YLN ZrX@fL;ZW=jU1iI{\Uw-;^_lˌt<1 @$˯)hcf^ ;e{?8:ov9P|BSfCNHuR ")hYwK_9#x*&9=KVzh4"x?U_SWx|ED>*. B Mj[h;7C"3Y'LTX0'?~S[U/p,ִ'MFz>Y5:QO2xpvsm:="f/0qtl,SLVEGQbb$ ,=FT"V GMofrdm^V*TnQehܯu`TOXک6A2C1Y ХW?+II͌z53dDC:bY;* cH:sě5D̄7*^ȈXFՖydҮ%ow~}klh.62ś>Ek_GIPĂ&6 7,A1H.®zmu-M[Z7}c|R=Kql0aczk`oÖu_[e!% `=I)cvhIFuګ#t -0+m;xG~=uL B^ ,ϥeT$1*P9(LQsכ?j00y)鮲88K!L+hQmSoNaјUDw'N ͽ݈v_H{pbF2*ZBGA ̬vu{響iڸIoZvHUx94R״׻Fwel&B =tFfaDZVsP!ͧ-%}t:EO>#bK=95{ $O濤$eXlH"bɶ5j{OȥψYlŭ97+\\_D5Ж!.__rc2[ruAZm~QIM`DK Q5, F8L`Zb(13s $$;Ӓɪ7 Wѓx}\0UH>bEȅv7_"5GڥeP)c'`ьƊpcjLW*r׬;D qS}נ]%D]Pdl)*FZ˓o}æ}lBc;.c>5Ĕ@LKtڞdZrvZv|G\AXdA!}0EbCJ=eXHU 3 HݙN,("it[303GD QK'2շ iEue;<ɬdv]vw߻&POi๓AjHϺbPU@VG8GA7D#s/(0s#纤zXˡ޵HNJ(LGe&B̒U#t= aD/+DQCw*.-m6̈́LdmhƳ :m^'&&zdKAۗ '~w+ h6bBO[O_q]2 MV#AA¯) KocdXd>`vl߷HU H byp-v8)/+)v8:81)fzt2>g+Pcds;$qqfR:z(VCg6v𝳸<سc]FZ`b3q=[E{-ڮoԎ^ _e"oxnz=vpgCJ :wn:/M#ђ戏L6; Ue`XX>4:.t&(pJ*ܵbȱ}$W3zۙG/lbփI`O|<c<NY!$$9T 8 !(T:YH&yG=+"џFhҩOG8[ZJ cTU-dntA .*v.<,vC$k smUE<,v`s=b<ٞGVEx5z&Hpא^d3h߅jnyF#3w&N̯x{ȷ*B{ӒLCʹ"%F 1.T -]'ic"R"DX${}r}_Mjaّ-.YC Hlč G|!3*rrL(;HN!^|jdXK` ا WR ؅GCǧzg:51W|_c:n~ k¬EtqjcO >T y^ޔK<8]Gz sծC^Atr 7c,=N ;;bAV`~UƵ?vcX?㙠!q#޽t_NA 4zI'r`keG{!;YQLIuV .MoO9zy3>Tх-' X: 'k~9$dT>Eg.(Zxޝ %q|*\&Q{wyo R|JMb7uF `#@c\ܡᜏõ߯%/U3O {w˅MON4,o5Qhzp<YW"l% ^/qKdӭIBn% ^Pi rlU "mbo(5 ^Ն-Zq5G[=~?-wO  j#=TG/l:2![XYL̳ːA*U[D߆;;yuۥsqas}_-7Qxu[~.9vu[k 1Oہ.C\ aJ>u) ݮ%^uSvys;ilWN Xxfz i_ճlZ.yGc~#>[h^7YgwU UUuml\^m`}ΪP 2NaZ2Ԯ<~L [Lq&+HI:`S$_3Un߻ N m8Z\遦{W¿'p ʕ$6Dqt܉ 4D"ہ4h4lIɩT)eXvpTZ'mkhlZv[S[Ӷ7Wm?ov:6qBrŠBdذ+wt-$?f"vͨ\zzMY-UN4ewmsםsm)kԔ\vk_MY!m zƪTl:RyΈI圥x>ZI̯&mrue) l܏¦MɗHgHwFɠ1ϺIZE 0/uI:b LslI 1դqABC!-6^Zr+DxUϪk^J5(isoŕ Md~1u4 ;e Wa*+{'AF+ϕgo\ mCj-1)mQFV6imgA1T;_p{csoltqLNb֙6nyp 0AQ9v^NῒvJh,n>B|QNF (# K (D'$VHKH|;irP.{-A)2o qF2$Ĭdd_aP+L@B;i'2HŹ8 -0%)-=9!>!)1!$AI7Y  a4Qp ]5/l M~ʄ]mc@i4qdgp!\$P8GX½ruPbxZ- c ,T*Hq^¢IU@=̅rh L/  P z: S-ԪY#/xxFnOjI#D 1G0393rt "t#ZD"HB#(# QL"od&2-u"yE&TCCv2yT%In]Kt#/cc|9Fʳk;XiJZC姐!#eQs/;ul`EAU+%&#fS ^^!3K݁tXVl  4=e2%& 54 -bPޤۗ)$E?c%>Prʨ&z&/5zx"B!W hh'ŏ 6@e{P*#"*"Ұ>iϿF0~h'@!TJFRk' W}ja?yJToIwDрL(U`m DJ^q"& V&Z>1&ɓj:h0IuQJD0`c`yR< CF+|R3 uAࡅ'՛t5U8pbX^311 +GX+Z0"\Zzf^o4ÄZ%uZYUԨD}g&)Т:|xz1@|vEkEFJǧ9U9~ Vo6 H)*ig"V֧ӡb@g^/9×/"Q|L:GT@ X(: _) =3E>//73iQ0K,Ʉ~4H'ŁtQ dס,jEzD4964J &e4| @bRbbRrRrrJ2\Ip%&&&$Łv2!Pz:~4IdY!6z& >%p.] Էu \II<ʀB@Pz)8a{+4K"9EEŀ9%$$R._bŲb,\|i*IVLF#k*r@e 4+*Q`p?f@\BrRʒ-UVujKYO;r L2YB\tTtI z0y" D[ 6P`R@ PŒn@4ކΖfKWATK2).2h0H*}w>J GoQGGƂMK@頂6-k9~eB KK^RxQTV u栎+-@ikyαS[7U\Z[۷mݱgkƶ*+ut7N-ltD={P f`ߔ'rbBX| Rb F <1-qًkgwMm on?STtxmJ:*| e5}G#:*xg^Ta ]A 5]b&uJr\|k~K^yG㞶޶}=Gmgm]yV HMIF!" Z?aA47!i 5hWu4~{8>usϜ>Pv\C9*ąYeN`@1iR WW_vTz+#yĎt(s2x9_W:?yEv{yxęG>ٞngcAښ?@)965}9zQL>bi~V[RVv䰦]:n]_R[y0љ׽GفqvlD61"فa}ρ#kY>yVخJF_֥I}uѮ4Z^gu)Qp8u=|`nX?a'pHOOr{X/"H6\lt~ΆplA)ն*mEjrb.Au/_HѮ(@Fg4C v0AguBpԟ]U'yD6ƛTv;ox@SޖAPJYV$`]1軴&R*&Hǫ:OTtBRJ+j]{< +O7`ec/O7n2 K/:aXS$khLH`EFZl*׎=e_u\eIT( #4/OrƧ_v -8lH#WI" Ie !*p:=) 8joS͞o{'ƽ2_zEc2ϭ~ul}m-A~$6*&2Ơ)ԇ (%\hX#~~͵ z&;}L_̬:r{>_t+gW.wt?mI6c0a)bC LH%`,*eŒvpdwwU={̷|oM=6v85x04H@ h᎕=td 2E .qXW <5^SQָq&Jio0Ծ.z?{ߖvA焬T 胍@UZ(ud|-,K1}Q@W"v =o8 o {Ds{ +ΆZ"`\H !*)q?J|!c Ll9ҧڜξGg=_5}u3Eae|wv89~ڲ "X*)GX,i,3`FJ}phX7 ^ú ffa=z?9u{ 20$Ń I`Wg2yXH$kJzqfbd;>fD|wvS]#[ .B" *F )Dʦ>p_@,WyH@e[j&s94E9+Ǝ)g`zޏ۝ڊ݇ }4uZ:BDB#V\VSc=1 $L;;pإq+ bU'eW>۲a '3q蹒 M%ܙ1j $ B0֒3ʺ3`5]'c;ï[ֆcgęd렓G9\Φ D-ƒŶIIJ0!oC[hZ`d`l)aiwϭ+4_"5"%jc9.z8F $:!c`XGN7fɰ=zxc{u E$#BP#ƒpR^R$uZ)HMΒc?ҏ9B?S''>ۧ_΂ѸJ huj: 1Q4 ˊT9cCYo|c=FTtވR*,VCpԪ<u@N6pσ_vײ5SpE͸/SB$ Ѡ7c1^]FYχ9F&xbB; iV "Vxb92 L(Dyrݿ{FKCXPPR) RT*%,Cdtxw]b/hU(Hh}T,bZ:-\M.]cֳ`w! ٝ-nO,DFFD+vAk6EE' 4l¸ Ld: |y|ւ+2c!UTI/P_HsWf~,2V;i[X}@V^}d`Y2(Κu-h!3Y:n>&.5 **-#URrmT\UY4x$yr?s_ޑ_v{`Y .pZˁr\~% Ih' $rP^O_}s7g<3wtoȫkX8%X @N#"mnw6VvNxܲsP)jY z_YH7i#R,w}g]f.`_b F X':و}[  piG1>`4#37iϿܽ䝛%9dBQ<׀26T.[.Z$D7(U$DFV&<|4##ooi2,=V3e|Q.~G5ECmg\[;-1GAuߺ~Ν5j|+-Q^d7 v41v)HSi8Pޒs ,jX5xsᛍ%rObL\išL}KdZ3w⁗MyW_\&L.?$u'id}ro%5'--!wmu<ؾuKYVEcZ+-@%t +ELH,6$pO^*P|b祐o58JcA=.6"$B!<-X#H,n'}ʆýa4POWTx۳2HFNY29$ |h.P~ˣG;>#ޘP=~cg+'=8l FoA "{"45A>R\*!UP:VQ?g 9pEχ}Uboi ]/Q)BwwK8 J 8cӱ,0ң[582|F73ahÆfG ?Z#a#mDҌTJi VI ¸4Fg\qnV)@l tWÞ Mk0*Nc VpW>nჸX?G2~ 1=t{ο1;wVDtZRm{%O"SjAWݕv_Pyc`*1r[OzמH ٗ bN[Pϵ=pXmtƕphuwpis3Zոw3՛ ΋@K̐7Qv9`}cb$6t]h׺99vnVΆd1vǶ]ݭv#R,_A;XEy@ĿT"+$+ZcxGYͱup=0]A޺=sVj;Ѱ8ł /0E d^O6QSIVA'' +۳:~2ݯ{V.Ir/;1~yQQۥev!o`KGN^dfP):-R&sxYVs̖F{8dds5 BNMLёv֔T:IpXo5DI֋Mb]] xJ ㉐"l)#Ou2s\ &qғ_9Tv-.%[5m4L![/8*_љ"q 4'ǚfWu| -$.r-Nr?<>wW1XeLMI ܌24[AF\(c&`LqBTEqo;įljōg6Xs?\r}kW hח _葲kw6;M#vp2WNȋ70p ]Z]iLoɯuiPWSYϑ='~_eOF=_=)n]r;y!Ցf#b#!^鐻+ɀ0MSBFGmYֺer'RZc2Xo4u13ö`xp^8:,!) $_%؄uvns +pݵ8DFJ t/FC"J%Og&ܰp|%`0EiD+ZG+w.\ZIpW؈6p+VKȮJr,*+HåD(#cbpo՜CyPA'zPpo oW!m}^/#S1,$GC TzVVGVsVw(O!8 ÉJCz!<֥NZR~ދՙ"#!N@,8j<Ўk p~ T"jCCgOOgx8T5ZmS.SH"̋HbEjj Y:j2].p UZ4 Ca<I +/OX|:pv"hgV]0/G!%'Rɖ/) L1CNr&L(rT\3 {id7Ѽ(cQӒZFFxL"'[ x* \x`,jIgP`F3q Az(DŴ[e_d4q'j(7<8OkfD4CKP!"Y#"e/){k9ԒjD 5܂T+INoUsޘW% v\ARIKD C#W{L%3J> gcC{ o)|JVFL&c^Yx+*ITJD~Nl"yPev_LAD18.xt0xu_BfENC$RP ⹺ɼ>icqefb̊'+qIrƯ0_̄M;Ul lb{J"=~6+ebďx{kzx1)'"܆ C<"x^{$~~V Q(ȴ]'"#ko][]*X4<('}%L$^xNYTpJ /5}oT2I<0nm0Uj4xiC֠X, !9eO'I*F.|ҨQ_`OL m&[Z`4dҡV@¸yk`.냢Zܩɤ7&\ZfZBg÷(FMeAH﯁ FdRI$fMZT>z ՄB4L/j 0n%C* `4Z`0E(AOm,4BzELx֩-2`PFIhZ00m? iP `J&ɿdK^:(؋Dd ?A!@SCJMҙp zx zhXhXxxxXx~, & XޒT Fo4FB"P蘘XWDgZJ[dq xU 5 BDqp%$$$&$&xbElLttDxh(jƟIôB=KB!9\&Ikj2$"bbWā+W^W\ ^^re"OåeXAK*TVb6nQ ?}$'%#Z*1!..6,A*b4sQ*X!Q&">qjsZX7+ f5h, ==u"oT'̛|| hR+P sT3ޒl`1[[,- jeB^fp}`ZYFo@{ŔLÇ ԡthEm$$nbF!M)_{б]T!f2ʪp_AV^zb@Ǭ FN6N(W5d6?Б}duשSݧNus܆4 c TP'i}i cvL?(4":v@+kۺxCG:Otg==SsuR dp_1H 4RvD78,"&~e#{AY2}w#G.]Cb(}7\>z%?7߶ۭE@){$DcrШŝ0|߅0h4"Qټ>i+/iIo=qd[]go;>qlLt+btX哻dg}kIӝrefI@ N~P"z毂C#V@H2aߵqBe?tmG7t*JT8DTű!'iٕȳ5,XKjr \€q %Y}XZn;hɞãbJp*./EQT.qxqӝWvn*/HIF2LjV`yݒѰ:A pץ(*<ؒCK'HtR1q3܏=N߫h8sm{-7^:0ߩr(%/Q3cN׵S_h m|Շ6<¬ }ޤ\W.&@ @ D|S9N?sܩQd{DL//~tء;%R3x;t䕾GEmR쎉LqlWKgCSoI?wV̀, q(|PYMVHXt\". [pmWZn~àuR~XqΝ8_o;QĜ":,_ɴ)WHG |wE4q^RǮcx[sb`Yo*;ڀ[Il2n0qFUr@Sߩ}~So/_>*zDO, (绎^ܟqB32HI1@ҥz-Ec[NӨXhâsˏ6qeШU}~@-\hCKaTe8W@bV"rµ~8/J홻E!bXt}:iSCO~/;\:\S)],Pp "!lDòWOlhgïhcV5ئŧgj~TfdB~&aExi@%T^;ʫ5 SYYtS%.3R-8XЩ5EI"FT`%ݸ'*ąlp miڞg?XƵ6-}phPޠ{{qW hXHM̖}ZUX[1ǤdvkCY,f$]R*d!7 ^!y#u{{tL8ݺQ :{닿TpHVEDH(Q,*&9OTx :ʺF=|v'5\:'t5flWa ~ey#r Ԩ^t%[ KB(7e <_q8^F<;]bΆ񼐹o-`R,Ǹ|w1C exw <݈= A.Cd&.$LCTt+׎R6`fb(u\FCt&1( ֆ GFU|dLN:Gm=V9sҚ}ѡ،c:{ A67r^Y?xE>Y~,+RtgW`\WŃ w-"2EhuA=%8Kt5UQB1yV'j}S*X8KKYpu&p;‘g%,XG`۴f;S|CG#(0S :A¥|Qc0`H ' ͇% /r~b{͓z5MJ!DEHH8B}5]}|whLNx1'b9WS[eA^h)saeaOU V͏ƜʅGG~9`Z %Q?r1158 ςW "~S5Nr۲jLmuwgoV -+w 6hgE鉅ڋkO?*p\5q~ʛ$MI% `P#E DrsyE-.W8wPdFq:Ǻ_+븵IL 1B`Z̓;Wٳ6e쵠b /kq@1Ǎ!'節Y}7p\]K^x@u6D1>& @—<:_ "IfD]w0YLDļdlѯuHR,d`[3/< L4P債4// dM.v?*=gYaޔUj Xך4&[ʏg]ll,;2/Ń9Ƈ̿wpbqr (^ah_ߒzRx`[+/=E\5Z:жF>-(R$܇ m|ijNd2ES qen꘸|Y HxޒfU=@K _J)P )6RTSᙯFUJŢ0}W6S%43 ZF%r!IUtdBNC٣pZW+6"ysz߳+-/n8 )ki-ńn-.@'ޝrZ QE.VlQ>/9tt\PW*p,=8i#MwX~@DFC8m%ϿzL()ȫ(>]gGsd Ft^5F5MF)eLٛ-t.S\" ]=-M6 Vt]DӘLRR1ǫ'8R!xpQٽ{M+fuJҗD]OkIԶm'.ݕ9O^OhĠa`_8ot4^aŃi_I=r)e`Dؙqr)b]r5NvWn'ktٽc5K^KƈOn,8KnhZ{7m/kqo02I/JψQ":_2۸/5-#GH %Vh遺Һ_gs1v'>@L(cw5B( ~q/5-..ch$'Iq'Vd^d]ς&/+[ ZZ[hk1i <4).4EI/)9廌LJVbX͞ ` :O͐Xe!F/?><&V"&2`z+(~2G@h߷Ƃ7v_DyU&2+ɴj>)Rd,lI d&Иdo-.+,n|~k6B檅,6й(kƊF*ϋoRӃ X>ULSf VkiNw_2E; bRlVa޵(H(Rחu]f\ZVi a: ]9\xCWA˺?Wh< t~~>,=4:n#HdK-:#dfNEf/ Wꉉ&dZºFvy˽0Y)KXcj!R3;3Zo+`|4c_P\bY^Vh@EZRw^sɑM;"',EAv>ճ*V#% 27%V~վk:NTqg#E]RHT>>]2G('ߦ]i\5Q}=p $$Li ?,]ŹaprHhb-Q01$Ƞ\Jز!%bZܾM-}&٤xg|yVmĚRUTIIuV~584Bg6:5܍v;U7bNB{lYLۜ(Y_rBls*nsWO BnV`϶~W$79s+9li&!m<+ݞ]t# 5n~~-Dvqº ;>Z "Դx39d vudl ,S#gW*[f5>ߥRΚ)? {_?y3S!i# C{L5@p[Fӝκi?s]MtbLq- ==]{-^;p{_|Yy𿬁y>.btS,w{ƞ-iⲢuw˥YUnW՗SZʹu4z@.MPbJ޷G+*&1yF@;&Gn ˒ԣh$3gtwְ=J .=C&jpC)ć7ёᶋ>ÙwFTZ}/ͭ)Jqy&ݩQtӥ\hr5+LoBmk`u!&.j4gpFbɖ +/؛&p8kaUF&C@x`Sх*0,fPd]P,zk{BhFi^}oPt7cg~8VUN%PV+-jG%n TaWh4Jeɫo*L54PkwJkCeLxdEjQ{Gfس:JTwd?}~KkWE̷̗F->ǻ[?>GFηwxja1N{R{[8{pMk* K*3v4v>Ṟrsǟ?Z!֎k뤲b-ӹE"ǩu;=.' 8=FYL;ז]%kqM/mp x9!8Kht ?t'PU#wO/tD55>xqG`cPF6ȝo;wo=\28Ez:<ƙ_{UBi'#GQtmV,X*O g(ȄNVCʆ BCs^N/uѧ.9)*N@>Y^̱'mA;"iR`k1,$* 3.]>&'`\[9&לHӏWFұT}Oqؘomǭs#=;[6oak]Yq[?rQF% E6Wո0慁  ;\YBm1rVϷš" rܾ3G{oaž4Zy[4 +p:<%&U"?:*˺<ʕm994hzro~pG?hEvPv`=bY̖d 2+{,6y/fYz]a1l!'m;uZ9XY񼺻zuO{;{г{漒*+gˢMAh-] tّ:#c04R}5e~TTICVSӉG_<8Ԕu'8Ж_ rPG GX$+*r内)x`EӕL)tऍKҋn>\'̸к~][2[gÁqx tQw, P2e㕚GSJlC0]Cwzbu`Cf׬N. 8~-,S2e+.n  Ŵޕjƙt<jkP6 С "dt꠴@S[M3^'p}P(UJaNpLqbA&m9[!jQq3p+HiJ۱Ə74C^QͶ ^pX 8/:4DP1"h:l@[-mi6MEml\  ZZobt a%Q,i( a7L FUsf:3#1aZL|Ѭ9yv%7Ҳ)ta>A  1YؤtC|\:oy8G/#6thV*WO&nl,j%&]-l:ْƭZOA OϽRiԞ#<мu2GYxcqj6=†ߣR\i>La`J FFXcglyA,D0KJ0l|~q+b3 p K߬£tJ`ѱxHD"HjtF='BƠQ! =NߘBT!EEOsұz`(Ll\;#!~a8^ֆfB܇2GӊM} xt Ơ 0JӼ\+"L$y/64T8G<&82$ Ap<&,* (ؘA]Z9kǜd VVp0waăC"Ohd@(bs'}kGOPOLvQa㟂!A2,Z J{KBx4RϦo 'Q=}CCF"Uzٻ%qJFS`S*O~cPJMJuDyRxf:B  Vѣ:'CZ=h-o50SϥR1aj%O+$)g"5z{#٤O=x|jY4jOB3N;ژ1)D Syꕸ7Hfϙj.tt;sP0V pu J;s(-i8D]!ޤLI::s1y8fԴWx mf#* !=xx&<${?NjUӒC?oL˔=>H3#+{O~z/|-_|-_|H  nIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/marker_btm.png0000644000076500000000000000033212665102054021355 0ustar devwheel00000000000000PNG  IHDR x!tEXtSoftwareAdobe ImageReadyqe<|IDATx 0Q4!XHA47ma:T{bW]Gh?К(|(Ű֣XA뱡"M=T x/P*BCE ``aIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/marker_btm@2x.png0000644000076500000000000000046613230230667021740 0ustar devwheel00000000000000PNG  IHDRktEXtSoftwareAdobe ImageReadyqe<IDATx 0e, *6 >}S(\\kMRRk-mu<\{n<X۹x[ lr^\'CP}0 BB@>TՇ P!`@ T* CP}0 UE ~S* P*"n #&IIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/marker_top.png0000644000076500000000000000033412665102054021377 0ustar devwheel00000000000000PNG  IHDR x!tEXtSoftwareAdobe ImageReadyqe<~IDATx @ դ&R̢,:1lmfnϜӟ.9PZ 2>t 䓤==51?3a-=8 ,=8QAqid`)GU]qIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/marker_top@2x.png0000644000076500000000000000050613230230667021753 0ustar devwheel00000000000000PNG  IHDRktEXtSoftwareAdobe ImageReadyqe<IDATxK 0Q+]:tٌueтO|:-oԡ^o˵k+[G@ wtZ81 Bx S! T!BU>@BB>@u0 +D}PX0:xZ!rP~P!/-n P4аIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/patch_anim/0000755000076500000000000000000013242313606020630 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/patch_anim/patch_anim_01.png0000644000076500000000000000155212665102040023740 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe< IDATxݱm@ᐰݨJb$؀Xg Mt."0.;~_F$~wMJ0u @ @@ @@ @@ @@ @@@ pQ?nł}  DXJ DD=n]8H WT{=A@ .j'~4CϲbZ=?6!|JYv:W,@@ @@ @@ vY2zZvYҤW,ӔIJCKhldטƎ/:&d٬3&hY, @@ @@@ @@@  S֣%ty.GqIq؃@>?Klldϗί;6d|ޙe4˼gOȌ@@ @@ @@ @@ @@ s[)Qf l)Q\FR\ aOdIJ̲HH<8Ab.l҇IJK b@ @@ @@ @@ -uݳJ]IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/patch_anim/patch_anim_04.png0000644000076500000000000000154612665102040023746 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATx1J#QqGKP4X5')39L56&v"͛߯3y/{E۶'@B @@ @ @@ @@ |j.XUUIw-M<5 @D%888MVC$G deye X $?\סY~_fv*gY5@RG[k,κ<=;%؃@@@ @@@ @@ -NYwz\NYBB^umJ&ſ8K,_ x64d3;!dwwۛYuN @@ @ @@ @ @`l9ݽ(}͒)Q\FR\X߫^~Sog)e,ͲIO!l^c;lm,3f eX r'@@  @@  @@ 06ٜwzS֣rzWW=AC-,,"#@D"{ؤ!X"@@ @@ @@ @@ @@@ @g`ww mIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/patch_anim/patch_anim_05.png0000644000076500000000000000154112665102040023742 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATx!R@aDt JN!S  LMU$$G얙ݢm_!@@  @@ @@ @@ \.;+yk@K,q q0I%qHdH"A@ 2,@ ~rU~ft7CUϲljj߿3YwY.ϻXb=@@ @@  @`в9ݽ(}G(($)(KUߦToRmhYfjưI/>ckӐY>>;w1l;@@ @@@ @@@ tS֣\29e=+H+իؿ:bۮM2|fؤ76So1WM;f2l6̲^Cf` @@ @@ @@ M>W(l$l`{ƺ@fK,,+H>dt`>$]X@X @@ @@  @@  /_xIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/patch_anim/patch_anim_06.png0000644000076500000000000000153612665102040023747 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATxݡN@ ()DLi(XH-I [Hm'@B @@ @ @@ @@ j.XUUIw-xj@K,q q0I%qHdH"A@ 2,@ r]f-~eIkmy[|S,7WYcfY\wg{ @@  @@ @ es{)QNY)QQHRQXM>ܤTעfeO&xjnϘYN:\OBfy r'@@  @@  @@ 06ٜwz,=G(`#)`KUc?u[M2|fؤ'6So1מ-:v2l6̲lBf` @@ @@ @@ M>W(l$l`{ƺ@fK,,+H>d/ 6"&}H,,",@  @@  @@ @ @@ @ _ 4u򚡃IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/patch_anim/patch_anim_07.png0000644000076500000000000000153312665102040023745 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATxݱN@qj0&:0ġ >L8;!&,|7 ;Lm'@B @@ @ @@ @@ z.XUUIw-M=5 @D%888MVC$G deye X 4?ԡY_f~*gY7@RQ|p?3mwYﻳXb=@@ @@  @`в9ݽ(}G(($)(KoSO7)>hYfjưI/^ckﺛbe>rev 6ȝ@@ @@ @@ @@ @@ ds{)a6K&GqIqXbWԩWǧ~7?RnYUc ps5 LN:n2b̲nCfY.` @@ @@ @@ M6(l$l`{ƺ@fK,,+H>d/ 6"&}H,,",@  @@  @@ @ @@ @  v ZIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/patch_anim/patch_anim_08.png0000644000076500000000000000155012665102040023745 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe< IDATx!N#Q`IDu$knGL[p^[^GRAnbf~o~G罒Wm;@@ @@ x@ @@ @@ ˥wqJzoS2DXbH[,qCd%8D"qx$LXWY `Ms#U:hf2~eS $o.Or;YnXb=@@ @@  @`в9ݽ(}G(($)(KoSw7)&hfYfjưI/\5^t7S,Ybfy 6ȝ@@ @@ @@ @@ @@ ds{)a6K&GqIqXbWԩۧf7RYEc pt8 LO:1tgY!sWA@@ @@ @@ &NYwz\NY 6 6=}cx@ %e@DBq$Ha2t`>$]X@X @@ @@  @@  *w.?FyIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/patch_anim/patch_anim_09.png0000644000076500000000000000153412665102040023750 0ustar devwheel00000000000000PNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATx!R@j*5H,C3HznFPx,S*Ao>얙ݢm Я@@ @@ ī@@ @@ \.VUUywSO Q`%"#o1)l @A?2YbY^Yfy%6(Wuo_עfYM-T<!6\ϟ=rs֝!f,X`@@ @@ @@ lNw;e=J)Qr9e=; I; ۔MJu-~*Y1lҋ&x;k,` @@ @@ @@ M66K)adrzWW%aիOz{W~, Y46 2ҏ&!Ig||3v۝e6̲l\@@ @@ @@ lNw;e=J)Qr9e=+H+ !u ̖XYW Ǒ| "=_@lEMXvYb D,Xb@@ @ @@ @ @@ @@ @@ @/zIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/pulsing_loop.wav0000644000076500000000000222405412665102054021770 0ustar devwheel00000000000000RIFF$( WAVEfmt "VXdata( rdzSoCd5U%F80!{m_Gy;j"U?,wfvL^5A* rsYS;2y[H9cZ(/Xi!; y4d3;`%{1vDb,\c3+gT*#zupyqpsply[wxw}./DAq`z@8xy7;ll(-b^E*x#}M/I?Uji,o  d H  Y  V  ~ 1 _ % d  7 y  ?i0U{",gX<'zU|LS7|z((Vy1jx-u24e!Q}Bo8gwmvfo]lWkl~rz+,sB){=}%~2[<6+m4FDBl9PAX1u+&z K0  r s  1 c N  ;u  y5!=?(nY5VH"!LV}6YiqwmvaF+U mH3UM9'\g\^?7 s.  n D  X 7aI .S^tq$G)pG_En4[9i+bR+x?xI) grKgQ|V"pn&\XI aE/m%daKeP)c.Zq0c?$PUF8NL b^84ocQQ*C7l'I 6 z`i9` B~1NvY3+;MJ[B]eM7U5{6i#XC\Lx 5>4_Muii  >ewBLh *7P!b9[X{F_?f+Z)`(([m)^Q%p2 i  7  a  \  Y ?  % X l  @ G #WR"oEsO<qHi9T}?Wd~t_:3s[Kx2]-m%`U mk* s # b  p  < U a -  j v   3 . a1%U*h%Oh!g \VSRUFTG9_ |lC3c%J)e"~kXT0;1 iD' :>{JVt^z|!.1COPXc[^WdOKH+=mJ}YD/n7w^N E|=cvn@+-Z[j% mi*mo)x/a:Fk|"5o+U{= iO>d!: |z?%5M:s;KS6(jOOkjo4r% >9e] 4=w3#gILs*:i&N[ *9^G7 D C " < M 5 j # dvX74Eg"H\;6i]  w[)iGvGkq1iL [>8" c L  m $  J  w    < %m 7=DY+v75Lg UH|@yU+ `E#~|yyy <c>9Lhw Qz6c.n  H&mMrz5Jh /CF^_`omlk{fiWLU3: .%m6rtd9H R{Om&5|>X4\0xQS5a+o>S^|E.&uD \Lx=SO):{H[^^Z-a]prmB|-Q(DW[MwS, `a99d57m`2 S_4fG%u9vnWvp S&-;[q%)DSw_ %l? ^CS9D)Dj75m3{= hW    A h  @ Q g w  ) ; ? > D 6 1 .        ] <     h 4  t[g>W ?4rM$t\;u#hU=7- {dEB,#,. ABXjy4<9ROhl./UKsk /]   6 $( IA _2 T J O a F  R ( V ; P K > V > v 2 r  o  n o k b X I =  S >-~a0yS/^*uwI:!}?lA<qBp]7Fot?D 0~N'iJ$h;mP`?E\sK%SmS6^aJcA%{kRLBr?'DNWJV#l-yS{LU-9 $=gu %NXo\IH89 IWK?`&rj W Zo.w"R)X Cd ,9LW\WWH 5#%p>ej\@-rAdr=)d!kSq"3aCm]D7' uke lhmwx+3QZ?|oJ*M~Q V=#CsOXqRA[xX30pr:R4k+wJ^~L* s 8 -  n ) =  u Y  & L g z  4 e ~0 D B T ^ K V K *A 08 %"  $    Q '  z : 1D  c G & \ a  +  s D  s >  m = s3cn`Qx7#~%1c\QGA<NKY-k/jSD[zM2zMzjiS@%m`[zKq@r1a6e6V0Z2a7d;gNn_n?(`Q0a"a'M J:W%{@#y21,-z*8(0{~ od PBJ7wD*aUunJd*G r}8Ds8JV_ kh!xVNs0$n'c/[ R c}B@@JV4n+{spblaNOWZOYGdKsMgqw,H;d&c?x7xR$p C)t???xP5t]'W_ /GgyCUk{59ZQypy0RVsy     .,2>BCLNrYWlWhY^[OHKLEN9B4=)+$'{vqVn4b#WC1dQ7$mKC<( 'B]k  *5KW0f<qUsmhLu]=i%l?YB/w'R6#xN_h*P$CbIKCy#ei hp"RSyp\;) ~} %?+VFi 8/oj LQ zb#\!Y'vW (:Py% QQsBm#Kc 1Fm%Car ()?G>N ; D*F+I>>JBBD`*b/ptvy+BVdz()BUbxN,b( h * e  b & i =  z L  Z J W _  Ty  J I %EhS/Ot=<T \b%kJ(;D]ia=V]WLz!u)Z,{L 9 t 0 t $ )D ORNaZxZJ~RFvPwHn3I2K17+1! '%*6Dr{)D2cxX>{#/{8<;j/,la|Kr  b7}[C w9u3u2f5D\2cEv[zQmKLr<c0RF &[1~R7r+NhQ"(>oX*w^&zQCjt>\q&puAC hRh@C/,( +4DWr@d2WH?x sN&5i2:]{E(x@Q^YqU+# ]  ' | # D !  X } P^  (H>(n9PT0*^Vl|x7w$T;r7^GeLY!EZ !m  M 9  ` v 3  F V  _ !  dt . RJClQ Hz6u-M(]-ffJ&uCSYG- }Dp?~pcSyCU*#~F~uCN6J^7w B~NsAt3PFo?Y"fp)Lr/gGA#g0~W6ZtgJ: "g?uH `'\.T `%q@{R _"c-cP X'T8rV/mH3ziSRHB>LTcs%Rz DpBxDL(w?XP3, | |F3se NPDNPZtx#*T[9Ogz(@J  N ^  L L $H?hRwEf3OesYd<ZSztrF!tDr%P&R^x;~AlL  y H [ r & ;  miC6$ j%aTk#(z1JT1_h][p)IxW(g/WIxS|8t5*O9K  _ W  " < ] ]  0}Rx"+~q[2%t<$nG"mMfm1>wj)y`>K1SpW e 3 j # c  " K iF~b%/Ve{ *&99JU[zw/k@.9 )U0[1RPbq0{)M \| _ 6( )?Ot."BZg\(WB[K'ai@@< s.>y_{5'wY-/{;/M2XC>3,w3C+e>Hy D@gS}0Hf7Rr ufO82 &2[~!1]s\!8i!3qsji+)af5J.M*Q4h+7JOpg~P  & % N _  a ' p _   I\zbXl>]TegCWVh=n*&Pas,G[os{th~\[5/h~.>THg`ap >_k'^1U i>zR  h*  rF  w $ @ N ] 4   9?   p b\q2-i)g`f<aianw!=m%D^Gf;6]Vh 'DXKXf[YQNp;K* gu#PTW bo.V]y#r0b2YpD;KU:C2_q.+up."^3 tVP:!|B s&,~$lsc?Uߘl ߓݔ8ޡ6܍E݄ۼ{T6& ۟ۇgUPFRcv3ܗfܱ٣+ZiݻڽYl޾Kߔܪ/ݧ,޸=Mg*$SW"Q zP2Y&{TSC)j~S`@l+wY,.r ^K`r]|#xveK* kE c  S & d ;     ; D | R w  4 o  2 9 M M P } R | N T Q D I $ 9  . "   p H , { T F D  )    vn LC +  \*~ YF |[>(~ 12ST{~ 8@ ~}   -7 |g   i H  f 0 x 3  e M  V  Q@ bD b`7`p J!No2l9Wh}6>OVapxx|r^L8wuq`[Qc9N2$*W%}X4s?VYWUyfi ;9w c & m ) t  T  3 a .`y *tn NEY =_8d(0AY[x@s 0RsE>\rD7X: m` g!U9HPAs_XA2,G{ReD.ZZ JtA5pPSi:F# {iZAD$%_fv> wP>O-0]\8Z"07KOcVIUB?$&w^0dT:]6u`ZLA@0 ",j=vMnix{<\+_HF!f/dI4 azA6'`#C'-HpN$r >/FS|] 'YXC z   ! J E k c q`  uq  ga1P=Az+A CRkY!Iftk=ocH,{E~}D4G\WwTl#Ef  8 J z , 5 l <  b ` # c h 0 w !   k q< ` I1; *}9|Iw^|  S >   c [   k t + ]  P } ^|htBw h8SFE)<=)bjxI'~oWS7+9?*/ jB'G%gJb_1>8J|+m@_x/H d q  xlgVH;8 "3Acp#- A;K^|-~ Zi'dfpI%M`}|zvD.#f#`=o#Y#c(h$n<= ߮߃Z2ߣzdF#D[LV+~ 0,|Qt? \H~0^|]^K"?X+:(}"e)F?0Cfs; \3^>DHW!MT>*0Z c03JQkG&O0SZro3| +%Smn_!qNs Q?0R se   2 x . E 4 b j % B  + N i  O q  ? *a @ y   - Q ,{ F }  4 b   D c.bU'N{W ?TY)m 1i7  UEM@zQs.c `HiAu Nm$w5HFWSXKC1hdR*-i,U~&p']t?!J!C p9=!~j L   r w  6 |  K lTi]o)LU1' %+DXau&4 "N6vOC zWSy'- c a  $ * P P b yxyy}`S: d(i Lv@+L1oOsx~~dcXO,?x|E?p$ b'_ 0>;35  y C }  R } 3 G q`;?!VA~)5=PW| :^&^DDs8wJq#?c{Z`HM85:8'"')%!84@IWm{v #* %&+#@"U,^*t&-)&(%&%zlc@1#xmWJ@/z.b@ '}kG#w e^D6#f+[8tYJ,/&EBTYsl !4WMz2wJVQ 7K MJV#Y"l=E#o_G27k|9jO7*v?qV:sif&fYH G|Q|?x-?Vw|*q ( R  | \  6  s  H U  e 1 b   > O  m   % $ %   "  t Q <  ~ Z ?  t ; V J    | 5 b$9i44}&9tEh _6g~DBp;I$kD2mV I:,:6N`oDX<tOF,xLB/~c82;yTW=_   m A  ! q o 4 Q "  i \ ( e . K d t 3 + O U Py XU KB ?/ %   p 2 U  e < U t  * >  @J  6? :)JjFD 4mz# LJ Tn% `F8)YzI0}0;-7Tr~]dKQYo:G qKJ/kkxPn=hC_BWSe[eow~4x,YB4+dU4 s| A&6x\] W>SrXWDuuN5|YMty!&?DYgku   n w * L   X 4 6   a 1 Z  Y o   $ # * h I  l %  M . 2 z 2 < e U   b = WI|.W&6Cs| [4H:SZDW;vO))C!:Ky@  !u   =  e    '  7f'J ]},Cx,Dy&Qb3O_}~resHO8K|>Pd0^Hl(Z@7S D 2 M  } o B  mhR'6+;\>7{Tdq [&]U!tJlKM Xn@2o"n w"BeBb>x);Nsr+qS k+w*M=) u}AqiX`S??&Q sH9n<g[(TEZ(v:DPSSAy/eG 2zAZ*t3N+FZs{ ' ;TM{Ni@^3:1, /5W w(O_ 8l)NYJz2S,*#)1O6t9eaBjWG/O5bd@Zd(f+ a/ xejrP]1mQRMF;4i)A | 1 b 6 Z  7-V T-0*AV5&`atNj1;`;%Rjg>lVfxO  $ }  v  X : . + Gp*:Aw+m8aap-qo<T6#uikxx,CrIu=kD'hW,Jj:WUF^= u  4  b E M f  N o ( u 4 u  `  :6]zI"Nv  8EeesnucvFy'`g \ D *} O 0   j <t 8   F n / k   k<  V M   {5 < H  dZ T;SAA;?/ 8ygf KD&wl8SZ=1bE^cKw#,F)_"1.F]N]BS\hliDSrC|dRMI~DSJLeMT @rq#?PR.hRTR) }@3oP|26]@ G k+,0'.d-,+; c*HtzYD#":Tnf0! yVB*wcL\:7 q<  Q O 3 T  ScW'9Wlly"zoGim!y a:a7DP3SCYRKbD]YR?1o&7RP3NETCN*%GcRrO4jxR D D  Q 8  W  5 M  I?@g_Oo>jd5} q9X2RjmgcE4V: o]@.nh8FSVR(|l#n A a E}    ! A _ } j K .  k N J6 n[b+?yaD h )#%&&./-98H>YVrR g(]*2E}ju0g/5S r-XL;H_*F]c 6~1d`8&yQ{x[;q^N3,'=5IZq%>P]wvU 8\r0N|n%vs!i,2FQt&$[THo$ `:q[L$z%n1uJ = Gl(5OT.^NabOzC/'S|kZX;)k`u7G}Obx=G z }w?AoJ4uM 6 _1V} X anD9K@cq;Z|d)GfsB{5n* N  sy 6  $ bE  X d ]  IW  S3S1QDU D4m{N~a7 G K"K~ed6u~U"h *>  Z ^  "  Ak   km   C [ $ l '  f @w ;    H     P )  ^E 09fyndS;02%Em #+ ;@ CZ Lj a m       * H k & 1 = <  L - W B X h m q s m   - G g s  k P @ m  Q  3  X - Y  m-\:u$#fC-WJdcEc!X><%G{X'^s%(n("Y&vjp6v_bOsH6C eq/~'h`]S`o P?~2nE*J(e5 )I]{ݞQyݸ2vC޲p:ބ!c"yDoSt~0hJRIfIUIjI/$ZtrO2I^93V/?EEip?9rpJP,An~7Oy1<<%v[Zt - ; < x  AE  @?0c^o{xukCK il$mPR=w >c*-30E;80&|^4 iD; bK p3{Ga(a)Onl>(?F`j8~0bS!rp H B[$b | CL   n P1   i -$ ^ X   w # ^  3  ^ '9   c8 -+{8*?3 8XPTl4B\P x(o.T7me 6>m{D2_2bt Qv*YX1oR$,<# RU8bwX7b"l  F!oUrCv=kHGyPX\d hb'K P v h q  v 8  q ' 1 kO t8X&sA`KpOtZq(< p! 7"K! #"#"$#;%S$%$&%M'h&'&(')8()("*V)*)+L*o+*+#+,+l,+,.,,r,-,,-,P-,S--N-(-@-2-"-7--)-,-,,_,,,,+M,Y+,*+*R+)*w)v*()e(s)'('D(V&'%&$I&$%`#$" $!:# a"! 'F]bZzl |sxrip_ [d aP W P  Z  f " ]4 a9 lXe&<Gv$,h\tP{&QA)P`g]: IQN`RM~Bo>X?M:JGBK6Y:q@SWi'1an/Nc !GZ~;]o!04MSNS&Y1X8O0P::;181%'kArG*rP(rD|L-uIrS#R%vG*_#~|[d3#d kL2%Z/l=u_aN}FU75:5%-'210r0h6X:TJMYFpHtEGLRJ\fn6YwB z7TzCu73ib$;ew02zqH>9dCLb,h2Ob5*q wG\:c ?foDG/i`=2}lQ/2v)>unI7*XjAR  5 \  6   x j E c R  T h P9VuU6NIdD m&!vP^*2K /WjD&TvF.O1o9Q_fevnghd]>]AD'3 TtZ/u0ek()<|Ga j)N s%iA'y-a6~3[A"HCYt}50  W h /  J  V  U  u M  N % y 7 m N i % :    s zO U 6   n > #  ~ j Kw 1P # ouJ[4 xFY)GxBoq{#!pnl@ew< SWC})Nd8D|QGnXG85,) 3:;\u@Whb'pr@C/ xm,j5nXvzEd ?Q3Z9b4a5 FU(U0o/h6h*icP@,vJ%W$q-J\^ `D\Yu 8e)2"_+>.z%6߻dJ ݶk[ܼ4o'u'ۯrކD8ݿ݆٢bق>oSUJSM]q}ٲ%Z$b ڤSޣ=ۋ^5Bܜ=݀exߔL(qR*Q qdOCCH(QVZk'kS93SFi`n )   ` UWh4Q>/g*sY u /"!a#"$#%$&%' ')'*(+),*-+-v,.:-/-0.F1m/2020]391314Q25252363b646O4 74W74757O57w5858585858575757r5f7V537*5646446t4514w535343 423G231v2[110V1`00/0L/s/... .-h-,,E,++B+**;*)))(E((y'l'&&%%)%5%j$z$##""":"P!~!  6AnSb)!db `:o^U"vEQ.?  W  %  n 0 W Z >  C) _rl'R<Sk\#nO-yq;9 `(U%{@ zM6TsRP2<_|Ho#fh zq0yB}VM(t?[3jR|i w#$z0~- ;{9C QSO0[Opr.)O2}UjLޠ߉!3޿Nއ0݇xܥ4OۚۇP/ ix=ڻj٘ٽfقB(بg׹!ך|ؾq؏lbT<^]`fwՔزզػشؿUմE/gڤ"vRۖ5ט1 ݐoJjޮf߈spۏyݷM xA'߿ghJK6:y7gE:Nlj&j9 Lw!MrCBi $Vf~%;O d(?:dpZd0a$  r^UU a & u > - U ` [ B  46X3EW\<~z5]B<[$SnQ = !t!5""""v#*# $#$B$7%$%Y%a&%&X&x'&(d'(')]()( *K)*)*%*r+*+*C,O+,+- ,u-r,-, .-w.s-.-/-D/C./|././. 0$/20X/Y0/p0/}0/0/0/0/~0/r0/_0/;0/"0//////t/G/j+}|)/:RNbx!1io,J]J}6w = _E]#lI$$Kuns_\Z?dqeks,{sD-B~d|Zt sV*21,V>uo;A h+tObFv8H)u@waV#5z7q9KIOK84rK*tFo- aLaOy2Ef~/Li)SBSt+a$CTB@~l`jA-]utoQ K a f o ,   ncB'de?9o9p? V|EDwD  r !!"!"/"-#"#"#$#}$$$h$4%$%%%^% &%O&%w&%&%&&&&&&&%&%&%z&%n&d%5&%%%$%$x%N$!%#$z#j$%#$"#?"#!"&!" ! !| KUQt +cp`lTYJVig t\@'  G m  a x Z T i Q U6YcsA6.mn6h|i haRD9/5q/Gkz l; cWB@1hp fKrH"=3,a|)_2{*Uj%_o};^1{pp6H4R]%p/fr8"xMk( ~o]p,' o/3KLUeES-cfDpKj~9YrdH)nXQ)x ?vuWAec#,gi'2dr1C (vG)|\A!*?p9p%L|/JHvY.W}:b%M"ul&Z%5Q<: F'I`pG!WqrdRV]\`iYsh7~7 P  V  i  ` ? c ^ T  A =  [LzpV q>`z/!UTm,l /.3. W+ t(ZNBCuN'C-~/R    H  ^  # - 1 d >Z9z'$pm$k~,<Xw2nL_7yaWUC=%0&       ~xjm^[FA2% ktIR$&|{HG"i~6Io9b3z4aV(Hj6s)gV)x?j3w"P$l2yMT_gI+dExx|lcrfV)Vd.vRrv'xb9lW+9V^x#0CG_QeC hO W4_XFh0<Wckv;{Fsg~j~|h[L8,yrkMPd.G%k<b ;zL^2vAvJw6}Ic 1^(]&e.Gcl6EuZ'&TH Ym@S!zL_9znQ/zl _VVPW`k) D  f C n  =  O 1 U 9 k G { b d n o f V ^ S K /  p  [ R @  z D  ~ c F D #  >  d '^  ymLq FRh-fG VM%QTN3An2O(<=2G'xl1PU|=e&S!qAtJ(lc0 qmcW_TcZ{Tl`cpQdQwPtD:3 lW:$ h7w$YK*mS,`2bBmMuyC\ H4* jTxdr` _+L:_fhn\cqt~ 8M{()MDxb2p.b/h 5d3U=]+`H"Ns&l8jY-4mhA9~*&#n/7~H` mZ>z<uhihNcCa9p0rD} N  T  L  S B z+a~<?hTk< V =d>p/ @&?/O9H=J;;84%toC<|~FA FJ  >Fav!C[  ^ #< = q + x ' i * d ) D  d , k 2  \ ' uP+vI$hU3p^ZE7!%w+oeXN M$M'B?EGFUFiJvQOln%Cj'@* `Q o    & 1C Ev f     @ , t Y q   ? 2 ` G u b i ~  o u U r ; O  6  _ . s 0 p +  B < o&3xw%k4DDW]F^m]S?2.@@ MlXnJW[?R@Q<_=VOZPN]bd~ 5*^_(!TOCL-TFf%p3nA a$bF>vbXH@77*15DOR#r)Un ZC}{JMc"Gh*cPM40lt`U3Q',yJj*Bg~ CT|EW?Bw1`X6k] K}LUNx&^7k :0yfkUzGn  j   7 c S   5 TtJCf?1y*I.g4 V4{xY\BM50*85E?5V8qVh#P+}Q{$T0_ Jj5XQ7p:%PPt`*S>`%h#@LBUu;3d;=,)(p/O k| yj.H,.xxeU@cU f!T==(i!UFhSD߁Ag1޹݌nLj,I!C (&%8AY1qKa݂ݱ< Lp߾ #\ZVA e5=Ff w:D*J^m3pA^>wWu% %!kQ+|TTi@^V>R\7S\QP3ElWP2rJ=S {R"3 c    o ` $ i  h # x 8 > $ Y  ; q  JR!Ze2M;z5Z32:7`=9V^}kR}:9 7 o w! !6 D"z " # u#!#K!-$R!$!$!%!N%!%!%!%!&!6&!R&!]&!m&!z&!r&!k&I!S&3!?& & % %R % `%'%}$ $F$#!~##\"="! Q! ? &gn#BD f=%z/w}2>~ 0 ~ T " o  V  p  O h  mC~?0zF/to.;}p;Bp kf9f$~~CpXWaXURFhK`%@uM&s8>:fs(: ~Jy#Y0{adTGGD>HVYv2Sk3]A r6sZA|%_#f/ LeL6r?*[;2]pXEy@0a >2a>o@)nSq? P"p+EOQfbftvfrhhlU`RPMLK9:4?B"8AFHGSpy!Bc8a#X(4_5*o'}IDGf%{jq)Wk@&6_1T At L & l < v m0ISQ+\D~q$Xd  % Qf  . !~c!!&!z9"i"") "f " # # 1# ># D#!@#!:#!-#!#!# " " " n"p D"F " !!V!g! p  1fUX 0)P5S7W<]6Q->93 {$o {yx  |  x  + }  E  m  ,  D[ ,/yo%"ty,.CZCzT a)xshf?KM4>5w,b/5953BEKKZff\mSiC(v| vlnW@d-J 4U-f2Gq7h{e@8`Wj\[]@7"~bPU&J`SGZb7bewiwm)nprC  #}Do5Sd @a Y$mA߰mC޺޻ޱޞޜީ+߱Tx0(bt ^> {DQN>&;#CS:F`'"f]L7q/[Hr#F5WSrmToUd0I%F>N8)h Cr?v0 D'N=cS`bpV`W>;jW9eG8!.$M8rXr6h8%ex _1g f)]X3s6z}xr4 g  Oj  & w j  H  >  ,  - j2I8@VBiPqz6jwy-cdO&,:b\Q&U  L R ` c ] |Z v? T. = W[6 ?o54k{8 l tw*Se*ILp~%8(K7 2U %  x  G  g  rM P47 ,L$0AG~cE;11z=@&=q8\l:MQG ]k;<m6SV;g7O ygh6@#B w~I_ A!5i.xL6Tm*^4KssNHr4H,o .   @w]AF?+$mbF@^P"g5!dY)kDgHP|"*7IES_|[k\YY@P"P49&zF l&rL&]!_S?dGjd(|7v%3d0Vr> V  5 = n {  K c ( 9 ^  s . Td.,_S :m7WCvt  *ENco w-*9?IKj[gf./@Wfo*Nh/HlYgo%z.LAIF\RVblnp $5HFad >2&.4JK`z&O#l>s>w.o 763@_\16)0H%d_?7w't] uX'  _ + Z 6 H2,yfQ Ma/[OOK+C&Ph?0z<p*]'>OVZZT)O2G=1. +Yg*c{*Irw/(r1,L {s*[PJj>-3J4d4PXc%L]%Yp/{Fp A  Y 0  s I 3  q E +  n U 8  | m N  m Z / { H  d *  ]  Z  J  H ^RK.%XB|EyF}1\{DKbhura't9 h! V[dq j=xKQ!|n!pYiwV*6tt$=St9Hߩi߀*c?/rXSNSZi ">RVvߙ_Daq(agG)i?7WBL,2G5 ]4#('FtkS:dF2KP %ri)u @!}q`.91VuhrU&Lrvx`ZUQ1?78c+l0":>>EU\qo"&JDg)n,Iz=.<y7p 4q{FTr 8 ? I  O F ET8."fsuS$t/`W(e1u`iKPKM`dz LQ%>|(cAf:}=yyQa;X#WIYNT:IH.=?r4e*H1J 6 1gc8sX2'|WAf1 X%o*}@q;x7D PZTWR)i)j,V?pc.VSxi8sp8Rt(oJv |$G=E~D ]?wTB1 +0Xe ,?_GUG&uB {8YLuAV+E =+=6.A)A+B"\]`k[?Vt6+\o8{'w+`O B-raz3Wj eVF-wZXD3n%G8tND1"/?bCGiKy,a~>z^/qVG![wEd 1J ~  + G u # I ~  U l  < i  _ g Z<};y5iW 8cKz 8/f9QUbqpub*p2a0V/I+%4sEuQ$o.Zm3$qG$  e E  h f  s |   v ^   @ 1  + 8 `  M6e x\'9O 4;u wt/){DI `d4X"q:` 0{hUJ/ nMs.UJ32 yv~YrSl?W$OI?(tO/ulH9 f ?/oGl9T.{[s3\?!xT@k YL%"|aG5 iUG%i\?#kZ=%m^>7e8&nJunE=l?b1{gEN3pS*}|zt{*#\&tEi~EJOz/R.\OCVG3QtJb\~PYFA/&b{I]#:l nB8sO(K6"*[s :? x   - m * J H  e & k ? r ] ~ t v w q ] W E 9  | y e [ N 2 . !    S &r S "  i0Y2p? Y&b?(yH)(;e3):t6}*aa e  U t  / _  F N   : @   ] " c c  >[#:`#&WV@h (e;hF-p6HfJgn y H z v  m  P  ,qSt(\kHEB lXBCD*K9j`&'s`s*j"c+Ig]A:%m`a _]*gNroU.Mz5O>1< gFe[:*qaj*y9uCo3ybt}G$:>z:bQ)Tt;$3Q14iS nT2Kjn:^2fFh8Z)   S:   j  L 4 k    ' 9  A C ; 1 s  @  w ^ 4 # 6 Z  eC\a)g'H&eR. h` `Wqd8 Vy_A/%nE/+5 NoEq%@8_{*zHjw&qPon eT0v*W,^>y  >Sb/pQrgnyiYM6  .8A^G+BZEGQSLPWPN ?L=D'47D k= s>6-;QlelpU>: {lM#.)5>F@HjOCJ#TJLJ>wN]KB:+3 <$(#|kNC' nejV=; Z0!|tbn5cRA+G JvR-n:Va'3~Cl@!bB|V*m~emjFj4`q ~3Z/#WZuQhI*)Ni"8 pIV0]v`X(\gh. ^J#tEs- v h   <e    K + C U Bg ]q r q n c & [ ) > P . X  d u l | g b 2 [  H ;   4 ]X%h s`8/PncEalYOF/q@q9"WD^Z(0gT6r]`\\ry9V/cd,o8EFSRX%j'XmsrfE^#g`covwl`PPQgq?y`u'/\K6 z8^J)qJwX?7HdZj~"h 7ho]4LQ4Snlm|lgqMDV(3g4h>\^"NlL]wiU'arI/2yxIWLR(A_7EGr? t,u=]&^k3+aV*.X"I4d4|r}gbs/^O 7T0=Q5(V o`kK`DNEQSa_hqv 19KSiflq |)w  d  v ? a  r : 5 b =!y$!qv,FTq6h2A\y&@Njzse{Pe6N@&gSv+Q+hQn)>yqQ\6-    } G} -w S @ A ) ! o  f  G  =       $  / 4 7 F u > ~ W w R v [ x p w c q d g r n h d l f b i Y R n W K N @ M 8 J @ 7  / "  g U  r J : j  @ Z V  * L Y 7 m#nI#r-EShMkl &Z?8Nil +j7K(oQ|-Q;dO>m6K75A~(eqX%*r9>ivHTwU> #wD eH* J{\`I4-w]Ax*oVOC(!wuLP/ 6LTs 15N4`lxy,R,=^ At4bC~7oI!O5au C9shVW0lP.b_ j6|,\F Wh M`*dL;2' r~fqSY|\[r~  (,  .  #     u s \f%J*VKw%ep$ lWP'q)c/SD_ Bb .?Go<oJau{zkhfwNkN_A]<V3@<8 iQFr5^>2!nRr4R(zOk-H'|az4<al*1 s|;Q l{*}.Y}(S b  O * C V  }   L    *2<i*,9]qiwj\#W4I7Z@[IRXlVj3l U7eQ[``:u/7g,KuR-$vAv^=(}Y%hf@/{){ ,AIA[Hff{w 88OQgw ,1XLc]y03@]+L!i&Z.o4f/l0y(c$p#__WLF51( {oXO?:3eb`JP87B+D7?OVgt-Pb0X%V#TV5W9;x0SZG#<G\vtT u*RW;Py-W]*=Pu| B)  f"    ' x + Y '  })l!BjW4|cCIX!Mc)m` ,Rhqrs_eUQB6-"xA0y\D8d1Mu.Z>%`6n[Y-/[X!9 a*U-e9W -  S ( ^ ,  Q )  h M  s T 6  e 6 , w Z | ? [  *   x Y q # _ 7 ' ~]~j^3:gpFJao/b {3RNCe/Yb@K~|IHpN*F _Pz*9gNLxC:iUKk RWWlNEY4dU61m T@.&):B^l"C S&qH|u0"M:zPo7\ATe&Gg %;M <(N#X*N2\a   M \  H N B = t 6  U ! z ' c f1jaW]7;#oBUu4EqJ,X+@Z#P2K!'AE)HAH\CnL|A>;),k[1w#_9c8`,D Rs<xcRz5In"Zmi  qS  l  f ` _ H B 8 - gwhT%/!+"mN@ !{_Ia;U =)m%Y B ' bZ'UURz THg)xX#~7E9n_{Ax>^?vk\EP@COKr| N5yAy^(b5z%X~.*a-96\ycNUR6V y[]S:RVXjQJK .P.f< yLP)u>H.z dn   @ e  \ ^ 9 7 ~  S C q  T& zR ~  ( M w,NX|',?NY^b]`]OE7yZDo C   N v& B  S I , f > 6 ` x  ; R  3 r ; {A h8P#DqEsP&{Z/~d; sR2nbNL79*% }     ####'' 447 /'-kYnHP)? d\@/ xbM(gm)$]o/pI $r u;V?5wG$SG0Xz]KeC/>_c F< hW%#Yt-K'x[:',2g} %9`JQ1{N*wKi(l:#pu :bz QEZ   l y e @ ( +  d Q ! C5r.w;O6xiF^myui~Li<]#=)~|Yi1L ; m 5     jy @Y T K 3 2 ) n E 7   | i i ] M J C 0 8 % "       r q q g c Q I 6 8 ' (   i e G 6 &  ~ V W " % w E e  @nDg}74HYiXd"MuNrfR [IN0KQ8z^3 x[$tC}h=\YEpu9n"l|]Da#Nw5ct5hLRJ2^]Cv4Sj.`4S%xdTI;:K*PSHa:(/qV9c^5LVp'e^aLU$O<s hdA(7Mw1Aj&loO7?DR~ZO[Q!KG5iE')#8a(?PFg[FO^ Y/1dwlgT6o9.Bd72= 8i.E'!nLm  wG  F  v T @  e H S H  ' (a l  ',XX#MDpa!:!I1^;hL|Lh`dgj^`hME;5'|f^OK3(}fG2% dV='weD4lVPE*ed P ? -              + = P.Z7xB[hj$IXv,:.59@SNaIjI{G8}6)~x nFH#~g:  Z !d   Fw )  Wf " + G O \ O f F e ( S8`!dnyf(}@x"}O'fGV X@}Z M nD7:}dvB@/Fj}w0blc?)%$ *:\u0 `1vMX6V^e7z `o.U7Vp4U &;S WS\HIC}H|1 C.VOkehegea>&s[])I:{Ep5T s?:8h /]k;kGhE#yz}tw+L@5}Ii4AamPS;L?G`B>D2M(~V,p? gQ gg 7d[\tP0.uG?n~r5o<+Qq/ p ; V T ' ` # @ ! W I w v  ) G |    & ( * ' 3 s n L 7 , U @ p d L 3 t * V  )     Z A         ' r E r Z j f k k t z  * Q r    ? 6 b W n }  ;  Z / L ` k   5 R X o ~ x q } ^ f O L 7 &   x ? @   < 1 Y @   P' T$lP}"5CdFTSAiiq$zKitsS:,n CIp*M HEyZh7S?$+ 9VCoPy>1W7osS&\6 "=qq d#XJ c>XtM~F_m#*).s\7"oY,e-{[&Z1g2PZc+*iOm-d\@<4EAvS]`\vghv3XTk|W:` j@,}|>gZ_GD? .["<p9iPYtr= h.v8m = | * U   @ c 'y D o     | p ` D +     g & {^9%OLd8!~GZo.%ha +_PJ ]f0q <|hHa?/  ~xzjb\bnb i!s3sOt]u.U w)0V[$|KyB p+>YyF}$ G0Gg-H}- V6{W09XNn!0H i }       W7 VgsZQ 0hyu*>z0~E25E \z;{.Ssw>%>i>VyH{RN}/)&{O`:{VJ?' !7-8EMHV|[sZjcZ^LoDi2g!prgmmgS^]DM~K;lAYE_9G.F!6/+&&#,$%,;1BPUru-3EOh#E]{ABfxz:<}`+N3}L']Y'rmI6thER6P+z/g&j*NVr&?9f_W  *; 9a B E ^ b ^ j j r; B iR yP nS y` uM oY hJ e2 o* ]( e T ^ R Z L Hg KJ I( J EPD@y>]J!F NAGDsDNG-ACHF?U^GB3'= @7:3/*q"_I=8 tk`H?{4upe_QZG87*w Y"N4 %cL, \P(sxoSOuXV8/5"/ z_5-kVJ/pY5)|gO$nL%}H$h>n,9bp @"eu75 B}9 VcE*8f1 v4km 'kb)MW=nFcvNmfOHGxHWA1Sag)zMsxxy#[}S"s8XEtE l,U5d:m~4_0 O?uk$[!BZ~?}U?Xn>oW%LhJ Q)s2bEsJMk@4bE6 vGcAz @3y7,uV1e>u)oI}Z@zj&6j]7 A ` Z   =   * Q ' w g  S % Z D s 4 l  0 W Qw   3 n 0 T <x l   $P,OoMk(F_7CuziQ6"-5'(i&;"V|kKb3? u A Y   z =c  } L Y  i " I 6 x 7 A  ` G J6c/)k KF1#`Y(Aa~,kJaP_Xo ,cPsyB+V\!zKIdO+' lb>?j-mE&]4{RBX'6 N*f_NWC1;  hB%WB* wokY[a`Wd ]brh  . Ebz;%X)w3//88.ZFWWdt ~:c $PKvbCr;eO,Z 8IaP/l6? {%$so9.cK %y_.4v_ P{>2xG!f L_HUI;g2 I o   C Y ~  L  9 B V ` m  < g    B G * a E r p  & < S c   ' D ] h& ~   ( & ! # / 25 ?5 S5 z4 / 8 ? 6 6 0 ; 0 ) / 0  . ( # # "         u X I T' 8     ou 5M .  d  n @  K j w $ ,  w w( 2 o  RRf%xR4sy& qMSlCt+ ;I^} :+_['xcU*/\t:dakv0"Z>LM y=[0^=!}whdet!f2vPkF\&x=Ne5Oi$KNp#1JVk|(6]_p%=JU6ePnj~# 9sJ`y)R|>s ;s=sZ@V'1kjU?~8B9+I`RZdSN7 i.v)!nNab!Gx.9v1pX t 6  S  V # Y $ r  V 8 s 2  [ b  : 9w o   'Zo-B\|*:UYm|rturgUG9$qKb%G   M   [ /Y  w J E t  Y * = i $ Z  { s= 1  l Q5 xD< ~MA'og6F)~S1jiSz[^U@C*\Xa]m|@X  88BLiw=d 5Tbl'B]n}u^@cS'H| 1^@9cU\PM)%cV6\Su94Vct*\L3y Eo}1p{&D7y{P?n@` @E;7:EKcx HBcur#N-Yu _'M(wBDq "JLE iW,U*|Nb hO(qpVm3H(pM)rZC2,nN H5*#*0(H6VCjir#K2x]-i5w,{H\%zS'tH*5Itl-8W/PJ3nb `Gw RE;oCU DC}KRyD/ t  C . h g  0 & ] n + F r "  >   w ZL2Fs:)G]C0QKhq{ $qbM,{P C4'|CL mGl Uu , N > A   K \ \ E  )q  l&1u+XA*f3+^=$ yLpu]xzU;" Io*Q"Q{&>.]@DYcs y;r=^pv}x{{g[tMhFR6+) sPiST Z/]{FMa#?3fW+zl.1b4E?`'HiY3! LpK/nGxzklGe3^`[ `me{/?M]y+/?X`}$HSj"&E]t*-6>PQ3UK]`eicb^^WaUJJ<7;+'.4MO^Znv#,2O`6A` (D"@3WSY`}%EOg  &+ 0.B1MDGWVQT^Vf^veU[`W\N_U#K9TqTHCGGMAGaGPVb4ppoBP=X]o,j83[m(lLe7p)E ^ Ttz!6Ks|#y1_,M;$9BMWWK\eAtp{]:{ `L(9I1[%h/68^={S\}$P(Q;kn 8Ins A Bl i   1 0[ l}    5 `> Y r  ( L      = X r ^ I $   ) 3 Q - % D 3 $ } + H     G   } <e 0  j'pZ6Pe2]#Mw<k,xqN,# QiN!J$c8oVaBs=S?7" 4]H0 k\hX\-B*fBzs`Dy&V-w8}nS@Y(A wHs/F9srTh*K L:0.jR""  M& f=nB2yyfeFM9;0&rj[E< ;2+7L W x  6\${?@Jm6c^z;-_Pr (4=nSw.h 6~.!-O?u@>: EA>_8:46%$ =K\hptsmljV=g/S!I'"s>gg;YP4,Y2 {I jI @ )DPb|5W,N!r\+2tfc9 _<"bXA1)#4mFdVboTQ/G`3(2  F  p  e  F   r . 5+R{_L;!mT1UmAOQ9m-h+LhH}go 9?E\ad{}qmvPi-gaJ=xBQw7djv<;j1C%i   %n  =Q C 0 7 o  8  o`;JmyDL($v`n>k(xz?-3~V?@k1HirD3( v4wj^"c+eEkgqCh %E\,9ERBZdS`cVKG7+ v`2[?"e3n: Z!jEZ_X0B_->~L|(9 Y4fuY}aZS4N$`Smx3Z u6m~/VW=v'c(y]Ls1*} iwO-o }AnZc^XFX#De15$uLxpA]!-`i)9E( Ur   II   8 & N  p < 1 M  z    !  0 X q { \ L -  h D  | s s [ @ F  9 !   p T *  _ H 1  i O 2 $ p P /       g > u*  w[KE!;O!Kl~ 4 e     B u    !! <D ag k    -  G ! d L { b   '  N ( . ? K  F % [ G S s i T b o  ^  O 7 V U C _ 9 { '   | q D # y Y A o ' 3  z W ) % @ J   UM "H7_Iv@o;jrS9&7l2(^a;C`h~SQXxvW<-,?PZnLW&OT~w,VIt$4>RTs9[4ES*nBl$Wk #3B%RaYcp~4m , T q      '' 2> He C S m e     % B U m s  % / I T n {  ( B C { W X m V u ? ! y s @ & n P     G  y _ R E3    h F m L  f=jDh.emDp3uMcy<T]V`k}7 p]cmq=fQth.;Ji36~eNEJ*~wgYFFC?SEQh0pOx06^a6LNq;+|b>rV}J} :Vd%h0M2qu+d8TrI&c2<af?u K*e:Wcz  #%6 L [go}M;mZ- scQG`08 [x<`8 k5[-m_H-)zEfT1N Wo[<`4ve\3TM.4/W$9# -#*37zGvPi^amjuex"Iy5Y|,Kz!Hk'V?n z= uthIY94*"uh$R"T(D3BQQ`JlPVcdv0@r0 7-NYaq/3M`oou}wdo^VT67-~Uf8ca/%?KgVg| H6t\k#EV%cFf]rkv|=nM*C>U5(Rb dU "x(nA#E}bPA-&*"0>]y {p iP< mL@4nnb`_^WS_QX\^hh 5>]} M)~:jx%S3Kd|J>tH =|SY=f?@j.WIiGF}:L[u4|j;P!  5 M  ^ [ q }                        # $ / 9 7 H mG rN eV eY `\ Uc Yo Lj C 8~ 4 7 # ( " "        ! " , ( 9 F L Z e ~      ( *  A / G E H h V | ^ d p { n  : G ` z  j  i  ] F , 0 ,  &  $ , #  p I  p K f A   ] ` S^ 'p.Z%-xY`i,j{ #4h0#M03K77c ~2G=5F5j?)T\z>_/r4k3Ge=W&*meIE/<sa\QN:<0.1#5 +-<)_3s4;EC S.^_js!W(h ]*/MTKkB9x4SI]l|@_9 L$ZG{;[a[U ['WKHl='& 1Rxq[; E`}mO6 2[bnZGB6%.B-O.o.3EQku1Q?i}y!lG)?LItY#&Qio2 ;sSB.j^R:WDt!V&R) v  R W  a  \ u  8 8 n d  3   N o w I "  5 f[  61]Ll-PKqls0Zj OS'jJUC)O&Dw9Y{ 8Q`je{|pud[L@n[#jS~Sk,eQ&G3 hL^ g9 b C G . '  { f V   qp   l "|Li2pO/*}3 qY/RnH'qaF"gfJn4 r4CQzUR* Xx!BId(xeq0? 2# .<4bZq 2"aDrH @rN#^g(kMMGG);%rFn^ V#AH9|rCYz2M{;~KDq'H~9D,vCc 5@~Je"cL^5W"@8Sv\[-vIP"-.A_;Xfi?|Y ;SQpTJwZ!]+CH\q:  % 14 dD d r D ! c , Z  "  0 K G w X i  @ o  ? T + H g {  G o    . b    2%f#'+)M+sD=?<C2AfGmPNRXVhc]mblpiW^FBv2Q"; X.vL~ <  k z 8 ? y ` Q  J ? p 1 - k _ 4  UO#l:uN.R<y\FxYX 9Cn/<lPJ )k3J +qi38` y%{[9F6@8s;@Xu&vU} a (}XA\ k>|N&ixWlWfKe@T5f:r@zDAPKQm]4]?i(3G_Kdz+RC u#6BPk@~mDfHUd,V(K:wb89r\sQ; ~\)p&|aDka4BR-]{`k`\jSmKx><7.% t [~qFB.  @  N H  8 / p K x ! V   $  , 6 @ B @ ] Z l F R K  > L 0 @ . ~ 1 m - a ! h & F  E  1       # . ; 9 ^ f q  ( V | 4 K >g \   ]`* nKG6{5q/!v~*/x Jje$_F4LLTw@LjG (E*j514@%' F$mlG!A_+&Tw Hs  1jQ#=  v  {Y  o+  E o(  A y * 8   yfMJ@s*Ec p|txkkUeP0C=c,,  Zpe=_66*E_9 !P>wzzN0ߡMe$߻ހE bްF||Y{?4j7|spluv^XC?ME\^:yi;'YEA1!}5(KO{R\CZ+-!w4s~F} v q . g Y I O ` N  < m ' jOcE;lU.{l=,aF 2I\>P2dFZ&`| ):Tg5hPjglzler`aM;2wNy\Mm Bp[&*q-\Si=Cs%V hc"!wL3vI&Tav"AC| ! a  F  / l  P  = g  O  n / h  3u$@~,K%by $qyit%_:UR In$.:{)VolY?6RjL6QC_.1xsPH0N[{E3~ Yhx\&F^ecn8"T{GlHxXZN?&Q<v3wH{#A nuSNC4" ߼߼߽߯ ,Fn+'@^Pv)].SAu| e1eXT !Xny=3nO ks"6t0^"GKer3XPKs!,S?#:eA-Vd),T @~BB uq&_H NYw)},}:&J`P)fR8{SgT[IY>   };  S 4 { } * _y  ? * ) %   %   JS)k?-PcS{u#@:UWuo,;Ma`\} ; }!!ns""6 s# # h$c!$!I%"%l"+&"&#&v#P'#'$(i$u($(%)F%p)%)%*&<*=&*u&*&*& + 'L+ '+N'+q'+'+'+'+',',',','+'+'+'+'+|'+S'L+:')+'*&*&k*y&#*?&)%})%')k%(%R($'s$p'$&#&I#%"g%e"$!6$q!# "m >"!Y  9XF#KEr(u!!)MLOe~ :j    - 6 Ad n21PVt4p&QCDGl^:b ( 0pI\uc{O59f(T`&JsCi6\9lA gI$z=(Z5[ *XR+r;Q$y5h{D.ir38g-r8v>z:HK`2*ߩ{_V);ߕiޱRޖދoWߙHy3R15'$ߤ߇߄o1f0OCXNDeKVܢOܴguߏNmܟ 5_4eݤ_0sެ?NߖQGWy-zdz}Z V=Xi qB(;`PUd?e`Xb(w;[.x>h/ Xk)7Y\''  V 4 "  p < /  ND=Hvv +4F;W<E+,fjz6}f9"SWBiEgq,Bgvk`I7 zlPA,^>mbK)5{Ws4T8 f=zhb1W@0MX&}eTf:9b/aDd+a'W#Mp6>`!bcv"$zd)! x I  c h $ 8 s i4  9 ` x  & j L  Gr m D1jGI8e_nz>pgsmrEnf_S9Nj>2"#Tz yBwik>nirdAyw&p[ Y0VK*GXGNi&UJ~1EjB`2^3i5 uY3 oh`#j9dM`vkt~-S|Dk9e LU~-iU.~K]JdEMOFpT({LAvnJT&~Ek S-]0dmK> {oDEw}>F_qx<&{]~v#1s>e<LIZ50y4GacL+/ rz    K Q % * u { ^ ]  M G @ 2  .+v}z*$ux&en [<xracb8WJ@@vm91MS~e ('8CNDFE1-#gZ8uM#i'a!~Fd*C>G5\i _(HHc(ipn{N u ( g   6  z "  9 l  bC3Qy >u#RsxDp&dEATwb,aEBb+ " a p/]0c7|\8 a@)qKl+= Gb4M4mkD~L{a]*;Y^l "vo-I>B'J; FkE/' s%B yA]6X܌ܞqcbމRFo*>&EJu~,ic*7iWP1a;*nL+ g|?j cB6x*L Er[ B  b  F Q % u z` k|gTMu vsi;:6_YK}%Z%Mp 9a ;Py2PYp{iP7$ygJD:&zn^N. iH#|YZ.Q n)y<uAuez44$Qm?p"tZ!s+) z   k Y  J   5  =n  -B q l  7H  p  4Ehp@J s|G;)[}&rVdu+d4;g#>v(2l!:5Sr#M e+b(c$\* Z@ ^)sTV*K.(iI&q9%}gD4|uud|Vy]jMnJY>T2]%S``cbu}~e`WB,,9(bj )UZ|~uyt+vAnVlr|z""Ko Fy.}Up^&b^PYQV>UuK_h0tk|%t.@pj QE({h#v}oCn#K"|@To/IlI-3dvSS@&le2)@UF  I V ) ? ]   Z X  'A ej    ! C, ]N td            h Z Q 4 #         y r \ R R @ G A E EL^cc0v*@Lbh GY~&;,VIoRhx~w]{/VB$|Go>J  ^  ' ~ B 7  V G R I J A 3O}jtJngn1I}zjKZMD?wAbH>D Tem8g%Z|7Gi&zQj)@ZsrH!T!}8cG=w_&/LT QdU<^1&Lft(~G+15>tLh]Yu#JCl!qg%@=tx:Hy^u*P@1&#&4ShxHt.kSA =\y3H0>(56XX(@Xlk}n]xE a(  = d  ~ 0 ;  ^ ] %  ~^I8#o]4eSz =DM;y2S 0|p^UKY&cKlg* b.Q&z(_U$@c2w]-t Z-Z C&g7^dH{U2@W`x9nU}z {N^|%8MCSRLS7h!/yE2o0U^99FqUru"h"]p2SQw3Cz_C- :"eFl >Gm~w_; f8e {S_Rxh}2 w ;fdWh>a{4!XHiz3"L4Mh bgpweu7n_cxG& g  5t  J N  v [  n B (' m^   & :V Y u  Lc #0H`]z{y^MzlhqTMX,I7 )  p 7 .      t nR ^H J. 7 #   p \ @ 0  $   & 9 \ ` |  c P I ? * `  }    1 U }    | h r 4i IO bV l@ / 7 (           s X S} 6w f c M B 1 r) T .   M & r I " w T '  d U > *       ! ! % % + 0 * ! ' r 3 Q  C  "     a 6 ` E  \ s7>XA`' [?nn}"t#X5isTA-$J~[iJQD#tB:>DuXQ9)a:SMwq8]a{>4_9  e4d~)%KGZ@QEW[^hV{XO??0 nUr:v2olXUXGQLRPWfl+Z;o8nVi5,S|%x &\9 rM ^f.uD^,yFCO\'3 q- D ( [  X o1+s} 4Gbeqt j;?v}y(^F>c35|_r"K`zzvwwvh]R<G'sT$%bwAth,]T7^o;>[Bs E'ZJsw(EGykp2  e { % 1 ~ - v F q  E  d p F i " T  Q  Q > U U R V |  , B l : [ ' T   C W @  [ GIXt9p= NKuG:@xcn(Gsa5r?m$B(s *-' &  N q B A  + v2 Mh)r^srxd*N?@H1fuy]9|S> /GU~,_ݙOx$߻wH'ݜ؈bT9Eڽ9C^oثӵW\ Ҽ֘uf>K(Ҷҗфb^HVGV\j~vչҎҥj֮)hBԐ֊?[ףձnO֥LؾS$س٩sڒ9ۈګ܄|ܓSݚAިޜ'ߖߥwDaP?I6VMiUV`EY UIRuC~7q@l0}&$)9$a)-&Qae]{S?o` I@8u$:~L'~}B4?R 2f  3 e  | ' \ `  1(b]} $'%%8{2^8{ZV&l%Zu'{k@S8'~CB , ~ ~ !!P![!!!!!"9"D""""" ##J#8##### $#R$!$$^$$$%$@%$%1%%d%%%&%c&%&&&)&&W&'i&<'&P'&'&'&'&'&'&(&(&/(&N(&E(&N(&N(&X(z&S(c&F(;&-(&(% (%'p%'9%'$r'$J'k$' $&#&t#I&## &"%\"d%!$!$"!@$ #R ^#"Tu"![v! SX L,,a,ur=e~_JU!IX*CiD F Z   y a = >  'hH71z!1#;8PReh{$!Pmڋ&nozb1݆1>"߰ uL $/|Mvo7 g.KSx8BL~]#mUr!p@4p3wO%y5|UL=l9iA V  o > c  $  ]J o=rI PFS,N16 `h+O&m9v)e!!<AW?r*2`KbIZ< l@UD[, W3}rsig`p-w$thTH34Us 2c*L{1Y/K]s|oRq'\D'|J_/OiS F>Q;?MC 9O#a_:<n ? U 9 * c  d C)>Cu7#f'^8&eb1QY+"[Kz% \@u KJnw.>mn:)]#h)ogR1OwߩQyMN[Q= ڠ\<~م+1w؏5=؞Z׈:b+ֲֻֿք֞s֎nvk]{TօJ֑T֚KֳYlh,הSפ׽ֻ@5rb״ؕ?؎>ڽuCۜoٿ9"܌q*-݌ێ55ސܢ Qe߭ݻ aބ+0ߙCbbr/y3AG[?f)5%<,A79<4I;QBj` %LV0i@l;i:zHU9wdFI| Iw^~<gR)=V -W  V - c  ( t`33 o=xI c Vz r9 M6t4C  :!\ ! &"!"z!"!P#"#f"#"[$"$'#$a#%#X%#%#%#% $ &$1&$I&"$]&$j& $}&$&$&#&#&#&#t&l#_&5#O&#5&"&"%q"%$"%!{%!P%Y!%!$ $s w$. <$#t#$n#(#l""7"b!!C!B  C .|q%peNM>a56L_Y._o, JUop -:dL%on)$>m%Y t ^ - ( ^ A  q  4 1 H _  U 9b8@S1y#Lq&rl.%D)fq;zOX'EXROm7!"R\d2$tK3{ ]Fz}/RBf2{v!Z5A]u;{,Ks{ k:n vc+ }I!{F:zAM~x[R4.ߣ߫ߓߥ߂ߛj߉TߋRߎMߓRߙVߤU߿etrߙ(C`߄ߴ$QR[C%oi^QkP4Y | kV&J=Y8->WLB|s ])A5 K[goheqWX{cneXbD' *eBHb{}8Xt9?o Y 1  s   * Q ; )P  e  (.V[wp'<!g(! {8FDUYUFJ ( Xo$ &`7EO `6 Wr Y ] V = 2 (      mu KP 9$ uz#I&ac/ $V1t<#731v|^Aa!}Bi(Ul8;O '  H1  ; D W L o   u .+  k !V $ h  m u1 !   T^ % \s A hj8i#wO\r`#a Cq<|=E_sqdxeYkZ">8,FLFj0X=2tUI )+)I&d'UDr AOv1\kt4VQ>3'$9<9N{h&!EDye'4Wez BKoB4b>"AFsIyG>Xs|!M/(Ladu(iA)Sp\ZFhis%'UGci6_(k )")RLBD cS^mam/uy{,}_}/U "Jh} ')?F@ZQYTW[Y \*V2_;QUac`UVUSd[#gClkfy*H ; ;Tq(P]MkcI|\ ' 5i   *  c H  R 1 a   G / k g  ! 4 0 m N ] y   ! * | M z F x J f ] K G , P  @ 5 ' l ? S b ,   T b  0 w  r / { + _ g ~S&05a,>.znJc=A1x('eAZjT#dp 2z8hE!JuW|#VSE?2*An4tF^LYUSbNgKFRXdvv/En!Eam3^Jg?lQZ9ZA`A |mZS@KH:EAEOW~dx|xkjgmsz2d_Q}H|E |IV3AmVp"U;2^~l;g~RSS-V>k9X(6)n  R v > U  } , H  d  0 W  . p*h$$a U)G c:}/L_n|~~ndVOH*5 \#MVHYI= c  F|  U _  P # C  6  pmaFR h1El2r#MI>n/KBZF.x15j}Cf+% >9kUIGy1zG= (pm]x=+1y0 4zK^E8n!p0%([ Jz5Xf$3NW_XyNlHXG@&(js+6au%?*L4N50{o/F)t#5ll7c a9<W'xPq L?n z&Pl6mfJ)7lK4x |l9LR4Nj*(di9HLiq %LY_jnilJdpC2[MuE [_VG1|+G.~a1D_`2Qf1Kn2>s#/|+r*91bGo7Al\[-7id<+!  ,D8`eyJO44xna \e ^E{4_f/+}Lht<-RTg~ 0gBP39s[#`Eq1Dr%EZe>gK*wB|R}<_ $e`)FOq+q8^_nC$_)uc`jt[kbZmDfC{CTKVl*[x7gO(^WaD?|x8cV4a:gv JFxLFm. \  ) R o & M t          { k p T h G : 1 8 '         ~ l| `q Ee :c 7T +[ &\ !Y J _ b o | u    ! B L J w x" ; S d     > ] q $ 6 G \ h  x ) 1 J Q j q y ~ ~ t } n n Q q A ` ' V  2   i 9 f ( G {6aPQJI^IZUWr8z|n`c2U^@()Y2kM,'46SQ*hvErSET)Vvs\Ii._hh| WY:NnJGCp#gU;N(q]H;aU&a:O {WPoe0j.^-xnS.@e1}a$]t D_c-c+IUV{~)Q2rX) W:\ ,(TR$JSw+^L{<t&=vH7Zfv!c$NZE` ,$L>Pcf7JYnk|ry]{b|WrBjGj9^-d,]&eP_ ^ ah[iajqx  (67LT!W1yHz^`1L"_Jb % P  n 8 @ l  B p  2 + D _ ` { q  D t  & : ) G @ f t w # ? Z }8 \ v       ( 3 .0 F9 PL EV Vc [ R{ L E 6 = > 4      q T tL d: 6$  U v  I  V & x B 9 m $ / ,  zMnHw &*</813'yrskLQ1t;blONP>`'y!iP"*ki37n}2%qs.w.^'l 2XIm 9k : JM^{Nv =s2<VcsHw#Uu #<O n= g     + >P Wq o    *  < @ b _ y |   3 I _ W v   5  \ @ T  ? T . P {   1 K /t R    ?7_\{./ZGi 9i Qk6XBW5km&K+wG[=a'E J#aHk`a}Z[Qj0\5m8fL=w3!kg3 W tp } 7 j S Q  Qw @3w>J*s*tCKAx9!uY@C m@ vx$] s`ezgUd>&0`Z|h"k%J ^)a:-}qXF8=97GP c&eK[2:Th&lIG>?GH bx wU5NHG\AQ49$lP N1&bs+b5Pt@k,T.s)A@WT,ZKgml}rv /?cg9\6pCWv 9e+NG\xs#I R5[{Z(wJZ .;k3Q mI^^FF,h8L<*m?7Oob5{,y+ =s   V [  s  / 8 } J  N Y  n  : 'o |   p)B sgF1MmbP #=CBbHbwu +),% |a?#vd`wOLM+3 tRh3twREW*qAeo.^ F > m 3  | P $ z x i P E D  0 %   | K  s U Y 0 5      c /b )    V\ 1   = e/7S  RMecb#]]-"$hv@4m<8,5-Jv>%}<2A>T48)( 'D8\i} l+?p97`)gC$Uz"Z'~t[9Subg D rld)RQ6[nz&b*_|#Lm :Sd*!( GV ky~[TF4*Gi);u!D.Mw?.QJVu]n![p_ ^)s<P?ke} :i 5`cA  X '  [  & _ o  x ! 6 HX h {   A U n| n vV A , ~ c Y A M    qZ 2 t S 8  ~T 9  T c * J  b )( ~f!mkxQo5$3=~B3]B@\e +K|#E z$7Yx$Gm4V - A>[lyEu   @* k+ 5 ; , 0 4 B9 S6 k+ ,      &  pneX961h^4&~pnQ1*  jH~CK@y 0@D\.zK}S%|I`Kmz x1Y|xGs| nOp?50dLKFZUZ+E0"{ odh(tB\tSKLZUZYfOoQOW]isr1CBOUrH({WP7pBs?s'j"\+e]Sc'K~R0BcVx S i           ,  .  ,  9  0  /         kl NE 4 $m5yX0S ]sO+L  ?v Eg(naI P"o0i:_&\)v :cyABrtg]> DmBI PV/!yyJ:ti?=- w[H++  !80I]cv;|<{-e!`9f WJ(t6dP=VGU5Jy[EiT $.@9[Vri|fx~ylqf}X_AOE- k<}^1}G kCZ#%hl+<qHU,IxVk@cv/JiA{E K}_Ha% |P0fiRf<@7(% |eY;' "(BDUh{ !-6PQwl/2Ta%?]pCBM&`'v'Y ZYJ DM,-c/~"Kzo0^z;ppx U"|#.a, |  b* q   Y   % p d  G 3 u , zV   =' |w   ,X a  .&DqqC !R"+4:K>748js^2 m+yZ%w 0X{ C % 4 p  Y R  v ' H 7 a } >    H ; RAmv+JSv7O:=0Y?tQ]5 Lk BOh,qDeo:J "gw8M(e=zT4 XIgn^@72 wP(}z[d:J7! i<ljM5:c=a D%o=u; jw<4yYXR e6VhvO<j!^4OXI! ]8c4#uW3"| ZE.)Ty R1OJx.D+j> BS7t}?ko?5cg.c,Da'~VU!9VtF}N S9>f[: (sTs%z# G#sHb  k U  p r ( 1 ;\i7U`07\"W%U1H~zL*j !> ~! ";!|"!""h#"#"4$R#$#$$9%d$%$%$&B%=&w%z&%&%&&&)&&\&'u&'&)'& '&'&'&&&&&&&&y&a&j&7&O&%"&%&%%:%%$Z%$%M$$#$#+$3##"q#d"#!"!/"!! =!) 0 %z=iC8 _Ns8scUK0lx  ?  ^  u E    S0b&o LP};>%}b4 mC,dj1QNtYIi-x%"]:-SHn e-Ig25>lJgn ::[;Or 5\xJn,VvIz7FVr$^@ZF1@s]$k R>}3_J}> x=u,kK9wzXLx;*Dd&z($rLzr;n]\"KMv51a W+6Wu57yU/iK%M(Pls O$M&pw * = y b % h ' W ~  V 8 g 2 p   J < u a  : FU v    " <R4~Uf/Ib~ 9IGQ\/d5m[[gv*EYy$:PStz%YzNq(0Pi'pLzLl(,/64=C=G7P9c7^+V)Y"N5#ljO5 !@_7Mp!:@^P\Y H  4# i ]   u  4  Ca*AkD&QD_E)BO'?k0|H+;885LCPun? 0fzP |] 3n^7 Ok6 j|OS!&_Qj3ff#YZXh/o.~7NoDcO3.iqHW43: nN`{V^0bpp%}U3O7A+CHtVL7>x%BmdVy/uqUVPPM~:X{T2X )<Xo}gFqQZnVEq&#w3zT|%Ump>V u[,nQ&{slYTyB|OoYn]petv=b6P]"BQM0|z {Z;JH]S.eu!bR]3(* c  >   v W]  }D#>GVQ\8;/yy1T!u@m1a"CJ4mO^hpu{giS-$wV?rL5Y*<GTDw`  tw}Kt b - G R ;  7 > ( O  c &x#9=!U*UZNiv#(mRm!,tR m$O'LtHQ+]C}u^wP79*n\D=)ogR/kK,i@k68wRM Ss-x3yETBe+_D%`s B 3jHC >@9D@T\k}+b ?gO*^1z!2bFGSktNML28 9?A8}7H1+}cu?H}w%~4[)}d.g)<Y4YEgUqSgVl^]UWT=?/0Zz"L+I_ Sw(Po/0[l-Ob)S@rSiGV;$ +Jh0S3_O nT6K+`v4K>+e0o_c+eW F T  z I > L 3 Y  {  v@3g")r 1bv$Bi#GGv1Vh"=DBSDK;0 |el=@j\'NA p> ]#L3cT  }    {  }  f  N  6rRq8R!-]2eP3R)7 j)]:IUByANZs7 <9z%k#v1^m44eK2{)pr|$:He9b/N CS-'~X fY\X_!RXLX3qGtN4/cj Or.F`_ipns-j-f4c;MG4K)CC2/' kJ+vaGC/wBf_HV:-xD%1KH^0y)\rm`*_Xd\b hH^k'T2 h#Ok'Yw5d,Jg | hS b ~     L   0 7  H ! ` F e d   0 5 3 < 3 x ; v & K F  *  [ * ^  / z.\:_% Sqj`;}o iV8<82s+la`m]Qg+!6 vxNn \A<dSHRqY5x>uP4!96BYky;.gd@M1&vX/vxU|v!J0@P=z&%-H{ 4E u fL0%F] {5  ; L  7  Y " p B z 3 w 0 S  > g  , = Z R d# c* e, Q; M/ =5 "  s X O 9 n ( T P C V N 2 lH!45dN5W`dtq5b#W7.YqxnF6,Qe%p1T1Z) l]=+e/lgV_g'^&m*EPTm;Xx&Hr>o 5AaCGh F+\\7%X YN.~ TK{-|,f7dBiN 1 Z=|w@i6Sco2zJa{rVDa+@m\/@l}GCh03ql,7hf#E7Ww(W8eO 7c0)2tIu,7 u\B;=9yBQUy @:wgQ%IK f?INw(lU9O,2ntOJvR!x 2Sb , ^-B]nvAcZ1X&vwFE+VtH&_ 5`_6U7 qyx~*1F`kCR)r*ih(| cDOf81#q;j* m Q  * Jt    R / Y | ` "  c   %   "  +  C  S h Y n f v a l T F B  ) l : o E  O D  u B xeOX%_@QI7;3xAig0pR ?+[Qo hH2 `NS1CcNxYbDw=e|`L@LTl&OIY#]4FB9 b2Em@6[{$\d>TqP.Ulxnn hAGg)rw6Z* f~  & v D c 0 h        " "  *       s [ 3y N #   w J 0R "    of 6E ) \7aV47!o I1 '2NXv<Z|FNu$!:+*sg? qM^*v1Bgs6qNji Jloj9]t}!vK4_d=a5LyoPA 'xSG/" !,5Sc0]z&cX a$gA V5h70XVx$6YP.w['8!<l<Z*Vd 8 Uc     5 g/ 9 N P b f  O % R  J 4 8 E ( J  M H L 6 8 n - 7    c$~d8W nfXM ;gph%XNr M"o? \>Q&dQ#*eb}a ^v*Ng4q"[]5dJ3/I0iDk} ;!YP{{ 4OXu*_BxU 5Y L B J L OM5+& $ +(*d0    a " f 7 G  W s =  T v > ( T : p  S"5-:E9F,944;(/9sJ`]bz^`Qv)(5i]k1`k-F.!zox -Mg]&n]8H-v_7!Ti*H0}Hd@Ep0#y7!rj ;6zk>>NG[VjVria`TSQF4+ qP2i<$'%hrH5w7>5g:$(a,12rB\r!yCT `T%d%o`GH~6j4[5U>SKbU\kjx1XAr?kb4"lQ\GL7S*_~ (dc ]OR#e<%U#s!*\^6y/U_} *Sm#+.>?DGJTTgZentzk{ngijm]Zttqv9Nhz,Z0{Gj6c -P-l 5bgQ;kTV# q  = 6   - cN     \ ] } 0 , r t 0 `I x  ! \ < k  * Y , I w  . O cz5O]  (/0.f#G&!j-Zv87  [z = `  J b h = g j    X @/\iy)D$h*E a6wIkuJj0? R^=K~%mn 6|}'.e:gc q!J@E OP!O-K&ftJG1~\TQM=@ICST#e@%2n{>HV8c*^ Kcm5Tmp]Pk6dC!i7k >HuDxNDw:Iwc<PpNB'Lr UED{q_SgNK>L6B2G-P:A-YDY_\bh| 6g 1NSq!|0 cku#R&P>zy,Sk,kW'*xi9;r H 8   N^   i R 5   B :   )7 g   ] J z  ?  ' Z u $ S q   + K R o         m R *    v J v r P OK #5   B   Gf K  X 3 T  m  p > 6 l n * 0A>kF 6 xD YQtJ9pQ' KDs4^THQKxYRO5{,G/q6Duz:QQ{G*b =)nZG8||u;@c!@R{22#E)J9'E>MDJQVVMa`u`{cq:Ry:_u5n?p4l G*N X^SbW v)D/b>n _WZsI|GxSK Pb#s' b / l 1 \ ' a ! F 7  bo16WGZPO#a 4 l8p 9(6I7K.R2WU XT.Nj_$2EL1ub23@Y %  r # N 4 b % l V   '  Lp  _s^pND"n? [7#}!Mk 7d"P8sa0A]0 V 2  _ ?  W D  O H F W 38 q   6N u   'WHwxzZ+eB M @  Y > # s ? %  ct >:E6w=8y>V y>k#8HXx{RB`+nO>3`QG0q'R$W=t6TX.v@ ߋq^\{UyW~h}ߑ߻);^l>m{ .`6Fv]dKXGT?JCTAWI[GO:P7<0" rUI)i?2C72 KO?jJ)|2c!^ ER@#bg; Q/wRaj[VTPV K -  C j . L  ' } } B j  j O 8  -Eq&Al-XmL4~Pz3_"Xu5_ua<oA*/;]M+DEJv@AHA/-H% U Iw(U S , v F *   t _ '  { a ` H f0 7- #    p ? %    { I     ` (    j 3 t m o V = 8  (  i / X 2 N   ^ D +  r ^0 pK"lM%}r20(}c(iJxK5!CLLjQ%C0AP^s`>asiXw/v `I*YMUqZ7k7gR-5uy]ZPESMQHVHb]z^r5n%XZ2l4oJV)m'w_3o.l+*Ksz?Wn~pGt(mN*Lsl/c> 5BM{| 3=?VVnT%V74YJyX>^*2 ,Bh *D5oB;gQ$`qD{7k+vS+i S`^mKyx.lB Z\ y@4   sM 2    S w ` E 4 b C 4 3  3 - I x O l m J x 7   ) f  @ }   R 0 B :l ~  ,  , -V   48|.}Cm Y:,r6j4!9'NKiz{:gDQT<]^_Q<Rr{,B^OI,<v #< P % ^  3 GX$q@Wt;]7kVCD6feqi rLJi5t'ߌvaRfKaV?R?g5oDߎBߗF_j ,`ߘ߭Leg5zQ{@c'L9 Y0Zv#Op*,xd(P:].jT"LRz1QqIPceZzQPQ4r /E!+57Egy,;nw=Y Ya#h CFdp$ ^W   H 4  L e  Nz $  ' ?_tA% p g?=Xr_j gb<JZ?~j=$qEh+U]~vVhFQ 2Qa:Fu1XIWKEv>g:u(C"Z]s*^ 0;qG ka   &q , ] J ?  : [ & Y  l G q  .  {[gNb?$l]X@>+u5S<GQY hnl~wfx={'}sjacb.B7vGqwG1}yNG G+ ~7;e"Q{K-d >4C;P*]0 x*.9;Pkr 9;|n1g w|/+y]I pl<- ZI7+qq^T4;! }eOh9U*?+tm\VML-;+% |c?+dU9jl \_SA@8B357/;:NYk!{Fi6/uUH![J5~Y:P_U6m%Vz2Sx+Ii$TYY; | : 7 8  s H5j1x$i<X  VP4c)FYu|~rlA*aj?B sf0yl5cU/*H] ] ( g Z  .  s < p c  SAH^m#<qr[bIXGe9]>dMx`o%/@wt7 {Ds E . # E Y  } E F #  d z B> u  s 5gr Y#8`D~ * rP R[  NC   T;     CB J b ]  `  =  #8 .#;BHw|**d SR+f(r\3& }V1xp_[_imsKq'3:_gG 'K,mx,J;dx'Nv#%659TA^EcGOrMNv=q1h1L>+om>1 wr)3Pr%K=|$5Sws 7 Y"q!O$/|w]a9I8aI 43m8lFyS0(f|"YI{9tV3x,OK & 7-PI{Y{RX?Isov"Vbo'w;h7] ? " { c B   Me#1x$8\;q}Z hh/Wl(eh4tF'\,l5P:h{ _MtGx~6^$-b6"e  0 % n 4 U J p  K 3 L x kp)xU;%uuBG Yf@B$, {pRR9:*&()Si  8Y  %Dm,'452(;S?gBD5:5;<&6M/d%m/q p{mi]L.='' dw-V:~M|ciB.g!hAGdsIt!m`;^VsN.e~7=gdX4.q_ . 6 Y / f H w O y p }r {,&pMn"gSm:b`?ZJt^h(?pXBE/CLx/"qg;N;|~e T2fcv M2FS]?h'jz.#(OmH+GMJ]N)oGO=q+Py:ke@!T6u8~^> Re/k)I\]`*b8RAOEAC9% pg&aIgelJ:7z`w7#}Ce7XSIJRp9d3knA|[ SHh )IHKRF; Kr*J4|N4qG)^ 3 ] K 1   F (  RA16GRRnOU(>0XDFz1Xlz cR.V+j]-#6YFqum SR|06`b1 i>  i / t *  u W   X G   WL   yc 5 }JQ t;dC= } iL ., (1Ibd (Lz'HD]s }!EXc|-+%) q\>b0M$tyR9*8dN.@So nOro~qmd\Z LSdb o 1cQ8 VFPx3{6 mK2mK) 4Il}D5'I a` &N,  A0 D ] 7   * $  0  v3G.&( q+_=d 3wET0tCc 2~Q=^YPZ v(/Myl"te9no"4f0qkPtO`SZUK`@hDxKHh{>u6RK J,u+}s**IVmz7O2\1vYU8xxDPJ]8 gK1UR}5?Y\#w t xrlZRNr3D"r8~EiO57k45[q+ edVZ SK_ vDBP,eH s]R5<>6GVjv +$PWy81ulQ ]??41qQ'}j0&LHve>on3N^7gq/r3e%z/^]~f F/RWcv#))% ^G!~vdo/tmenxap/oyU+ "|I[g>w,:V0`:\-FX % P   C h  # 8 8_ q|   # a   / a/ < O 0o xq   E " d 7  j & 9 I $ M k j x F j  , G. W? wD g z     x } b P ?  N * [ k  R 4 s  S { ;   ~ 98  Z " _ ^ gbVH},U +kKB-L=f^l\=M~U_VtE)?RU-$sE+0q~ZI$pnZrKh9l(x "#T8Ycwu x*X2 U|>hJ"rC]mG/$.L'z!8*M8t8#pzae94SZ]c.kN .WVqNh*,HRSl^qp~ki{Tp>oXVYC1*&i\B0(]R;* wwxgpkwaiV]NPEEN;[=O(C%I+KL&FFA"B&K-A6D7N3BLFZM`EsSuOYXH\g]__pz&z;=~Q_o17 Q^ d.GWl{(>>U_mD"EA`~V89\s! [   S  F m3 w   I   Q b . \  , !E 2^ @u Tw D K C 6 *  X  { , v V ^ B ! i  w ^ J   Wu+Mo6%*;tTx M4J[H.Zkz;'s T.7Wa<@: PjMH0)fF])Dd|LkKH(z I#]4}kYcA.:k4zsYCF, jFmH&|a>tO2|a7gR/aNyyVUDq9U78.1!4.4EJVodgkOGB><<54@O^M{fO(_EY7Kw jCF%.e$i*# @l75&-Nm#.CLrj  4 6 x  ? I o 5&  lM  o  +%MRdZk9Bws/4Y@9JF!.)ON\czGUL0|1R)c0+6/_-XJx ' T \ 8 2 u G S ^Pj()k4D` rfRAD#KEL(lR2u\s-gS^ZDmS=  57FOjz0:i|7I/o"@X_3> |vtTr1w xjNfa{XHGN1?t4@:#*`m} Ck {%25KIRA@3jK uAX%*d`+3{G;~D@xm'gBCb]68^yHo _I lq77~OD8 f4}"d[M=6* #1=:X$[>m]F'gNt :z)K}SHX6mZ7$~qC>z JZ|8O$S<n*x8q;~6Rld{Fj -"BE=OPrP{S]XOKL=:(,fYNwgSqES6B&obM"fp(a@]njp{K!Q7h <"E~D+ jT- vH=+ i  U    G O b  S ) > H V ` \ [ i N W A 6 -  t ? x  S   F \  r&-r0r!m Wh">XzK7qKpK n&DFo/Es&|#p/pUp'PI+ ^6^ =)s{V\T\ gl1=^z?r0HK Pd{Q%UQHd$m3o/*@b^?{b[Fv93VV0 ^2M],AV^jpukjbI>mke8C$VQK1_PZ"4s@`})?Wo=o9GcR"~"J}R)ZlO::mb U DCyRe: Y$ R0 zRJ;0o/i'XY!P.C*Q8RIPT^ecr4SxSkG5q TL|9,x5/J[p"@u&Z [tPq_`}p~"KP4F(cI{wP*v!  K 0 z - % < " i   kGJUmhgg-T[A+u!hx#l9DpR/c">u=]sy\{3[y~-CWN6.g`m `9t_q'&h# =   r X   h s  2N ]@,BaO@+^ bD"(:+`)YDlH>]Lv?BrcpDg+c`,@yKtEU(rb?IvPAf+c 4-gM~%KOwo@4bRz>4d^ 7$hj Yk>^?HR?/G{sVp;5v  ^ ; N S u l  EGr#uT3Rn $YV`}=IYHQ 4 !k%""E#9 # k$J!$!~%\"%"n&Q#&#B'/$'$ ($\(j%(%(&8)\&x)&)&)0'*b'#*'?*'L*'J*'N*'>*(/*' *')')')'?)'(['(+'Q(&'&'C&'%&% &%%$$1$H$###""B"!!S!  6@f|6Wvw\ G v " q  \ ? ' gH6nuqvt|8jEu$i'j UuW4{"#+y)RHa6+U57Ig9T1ysBGtJAN + =+f8AOGW}f6]Tm[``Li-Kg ~S eS$ce.=02[?E2b"\' MN   ; < $`  Je  av}Sc@Don<u;P Z,^Q|,/a<vAX]`RZQ9D<01O;>:3k'?gH YFj3vFDZq?;l'eb~+r%1-;/&xvW o  E I | ) $ ^ n  D R +  ?t  |+_{ F|:xu r,sQv>q(o=?Y\, s*tH#_[\ M. tA {jPg#J:! aCwogNx9d6V J =9*()'t ^X D-xkdJ7&xe^JG2+nX=5 uz&8[j} 5OZznV9"xUe6A+ Pe2Ozl<#}l*|08m>k;Q:H%?+R O ~.u=X(sC }uhr{ &8BvvJeST/t+FU=A)O+ujM-YDw Fnf&Mv    sSb07  w];&GP{:C i!EZx*Pa ha0jx.N?`9 unkaQO2?:!%xnV,B ,# !!$)wiL4xc9{ dZ8"`O#| Y5qMr:M ~Pv*U L@\BqhQI=< " 7Je (('_82=@%QmXVk$vb*mF"[;NSyp,p4)>Ul"O4k6h ; 4 2 '   | R G #  a [ 5 J &   R i' - \n/> G{U&\vfG@.c1oG!v3aVHh.&  Mt +-`@Uv ;|'#ODy) Jf    F% h   9 ~ < b D    > |( F J 1 h Y # B s   ' n 9 X @ K M 6 L  N  P U K D q A L ) 3 $  o M 4 m 9 % d ; ?  ak=6v&Q^|<jj5RZ,^Y; t)?&IWYz]YS+SDWCc+h3&ii'm#')C=Bki=FucZg<:YY/nC#߳ކvZ9C%'#'3S:lQe+-&V]'OY }J`.-z35[~EEOiE7G rvCZ9vX,N!S*R&IV |G * ~ ~"  " D  _ T ] B  an>!z` (Y`n "=@_]`jhkd_VR53-~tht[\P>ACw0Y0Y2E#F#1 ) m^K9{$n MJ6zY:"d K & } V F  } W / | N * ^ /  N *  a 8  R / ^ / f [ s ! P 6     rV KA * yO%l[@0h D ~\6eO9l> zO"X4m.[(?s3j$~@5r%*};PJ] Fau]Tdtc7Zh pK oI~iIda/?p<l|ja_Bnhk)]*n5X1ubH%ZvKMJ*x#k(x kN$$'Ac 8Z?%E3^3XpYKdJx5>"X7 lb6&xn^H @ (  } i < !  ^&o=r&76{9o!3/"<%])jnmP B 9r)Q  / E P ^ V q k k c T G 9 Z+ E n4h._ZlO=%DF VPYldubyMm1S9d|8Jw  kL  & A k  <^  ' v*qO+o#Q<MrE7Sry6)v>q$f*Oh,b+\%fFl*K0oM3~kcqr[XBST]EF}e=V 3%~?Toe>2wFYB~n[?93&, )*0G&M@XQub&3V-t:[~Ne7_ |<]$@BmvC!wRjQ=~6vC6d/0g ?P 7V3Ik#Cm8AGFrY,kczF'=b<T]kcD(mkxO&q0+ w  4E   Z  \ a ) + oU  ?  $ Pb!=U7wsNEB( `DjV,]2ejB2]G  y!m!5!-"~"A"'#w#2 # $ V$!$K!$!"%!b% "%-"%q"%"&"D&"a&#&G#&\#&{#&#&#&#&#&#&#&#&#&#q&#T&#&#&f#%C#% #X%"%"$"u$X"/$ "#!l#! #$!" 9" !# T! OJ t=vyl>R#/s>M1{^0~`15E V ^ m ~  "0 /%A3N>OMkOqVl:*oTI+vaWu_+, %%߸MQޖތ?BݢݛaTܳܣtwWJ9-۷۴ۥ۶ۥۧ۬۴ (FU;xbܗ܋ܶ# NByiݬݧ(T\ޓޡPaߊ߰9]56|&og1O\YYW+k qL@9m0 uj_,G!`#tJF&kN kq)ig^[5x2w5l&V5T~*Jk/Jds #$> $##B#7 #"j"d"%!!-!# w  8jH6E!FUW"Pm 6GG!Of#%RXl*+^B7W}rDx%% Z m  4 R \  5 K d q )h&t8@1CKEYLxEqF F EV m&r #B#c)@2Sq r RMY m%k ERcI) fg8 AnJS ) Y8 oM4_T=0{/p]E8#"/:GRz :Zw1_)O>p8Jvq"hR)Tzmn#R;ak_/lEsY*sb#dOC`D sKj 8Kw&%<;87)Q)d};=*qwG~)|k,0hs)Y\4i ;Oj*1s]!z)`!<~Hw4di@2{\T="  @%r.N\vkLGpX#1r^,#fF^p_gwrK/=aDp8<pNR q YE 1   u lE L&mU;n`-7e|&<.d#ha  N!"| " !$#!#"$"$ #$#g%#%Y$ &$&%&~%'%M'&'M&'&'& (&)('I(5'S(P'p(n'c(~'f(s'O(r'5(h'(M'(8''''&_'&'g&&%&&%-&x%%%a%$$4$p$##7#r#"""A"w!! !+ U w-7oo0U,Z8vEuSVgUdjag p r f r xKaEae F\+|3w7m`)~ d+vw2UK>= [;1f'T*,~W2([L"9GW Ht"08m3R*6$`1k1RIEex8b^Al'q5@jL(q^z,%PK+v7m sZ4 [ c5'fa.9 k- o\72n N<* zsuf\VZ=D 8"2 t`QE jtUG62xc J,tkrsmwB_+]/Zv MOc3Kv]gmUY,bc{ 7Bz(}[mJiP^g  W~.@N 1 \ k % y > 5 lD96P.GaY4CX,jrB^NihFH;x/\2V  %=E3B>3+ qJpeW6.SQVQ<hx/pHdjQ,5\:%Lkem:n#U >  Fd /  | F * /  W -  / 5 t#*a~0lw$my/d:Y]8#qLM?%I6*[K;zu: T~OHHVb.C_GN1# o< t[H5. 1Xw:*r{ +R0DUaiojwc[l=ZG6v=U PdjlK#e58EZN`-h3jp 3zn<4fu/fJ:+&-}1jD\D]IcqY{gs|{!D^q      KX)k%aqj C-V@U%#T<J=nXw(/6:6!  xT^=x@7umC:n-V;V`r!"Hs -{<mL>0 i?s]C"cE$skQC55+ !5+8PDLVZl}px{nNBv$zj^H+*s>%M[8$lh;)U{0d^ R j , c W 4 x )  *& .B)cxn{pyPl,UrHQ*Tk/CcEm.I{cvAx+ >}f{ L@J_mJ[?'^}@%Z,rm5p!G 'wxvdxT^JZIU9N1ED:7D,5,1& zh_<2$nVE3{\S0pRG2$~eMF/ $,CW x+`oC{ D|2~.y~I\ jt2qsnd]Is 1Jl |4[k TNd.$hL;t-ki2UBrf,h3^9O7  QY  T  ^  o y   f  H?  )T|[UG  pl ,RPFw4DyxXR0-`  j!"6"##r$$2 % k% %b!(&!& "&n":'"}'#'Z#(#5(#s(/$(m$($($($(.%(I%(p%(%(%(%`(%-(%'%'%n'f% 'Y%&-%[&$%$%$%X$$ $ $##c#"#W""!("%!! 1! "( u  \\oJ=w$d(W1e<l D}   < 3 q  D6 r ~"v _Bbp-fYtJi`hyqW*]R Uq5y/Z1{J v`77!9 [-JV})U~(W5sb)D9mh I2_=p'Q[jw_k?D .p.{>U <]N7X(t]v )ahD-ti_tergv 5?s}%piR9iKu(b NRNX[p3KqI}F;#.n'1Oi'8  t }(l>Yx">!_,zGB2Y9pO_^ a0P7WIS`Hh<r9r,!zhT 3  #  y ~ c A B  |  uC  AaNx>&l" mE[O"*NRf|  ;'X<}PWqzz $,,}/w2m*_'Z%M%=$D$! y{q_V{IGx7m2r'yshskkkeuiaT_HxKhKO-6&+ H(T0r=} =OCt/K!6 \ g  $  5 + J " P   0Y$1Xa$}-8?\/u1:8dHDqI/Rp/~d,m&{d!,usP:!'#Dz:5Rhf`&OnT@s5O_&w?FnX&R{g[_"9E9717;s0]AEO4Q%cp{ 5Yt/=Xm9[/I_zTD*1no,!_s:Yj^G(q9w6ce-cT/UtR4VKCu6g <cL}k*I.gN`~!@a .4N,a_{+G"D\?{s =,uUa D}!]`"gC(u YD+dM" p^   2 hX    O 9 q % L < s d 4  N # l ; \ ` s       h  ^ E  3   Y -  } \ t 9 u  ] b T X P f U N R 1 _  X  c p u  0 _   - & e D y 2 e 6 z  D o d   2 eV   'XA\ Qy IjxJu9Uf-Gp #|  o # ,  5 l %  : W bXcKd^M0Gx_$qV(wXYq)Gyt_b[ykA4<=\q+4xMAs7e*l"U4XBn?e\o4CppDXs\mA/:9=m4Oj^*&}sX.mKaIbYJ\D]iY,mE|?o7 M\<~avkydU8 ubU3!Z 5T_&= +vEiM)Y5jGl7`E"{|rqlsZJ??>54/<8XCYd!a"0jNX1wJFY8i/FU[0ZO#}4P\n 6h ?_)? ou   :7 u   * ^ z @ k  / H a s n v n i b X ^ F > .   w D i I  _ < c,3Z=Rf;%Vo/T-b='mnlfgj (Q=nT+R3jO F$j:VA U }  Q O  [  S \  ] L  +/ tv   +f>[z8Tr-+@8<1u2[ F)t8e=x 0 j  A V 3  j y " # > r + g  d ,7Ll^n$ Fl-~@h2}L kKn< o:d,kAzN[MdNct#8i5](Ea2zNT'- zUj2L.!}tmQJv=a0R9J?M+,=3?HRa u{  381^D{Rl .X}(Hp>]"O)V9v7f/xTE>nn#7h&e_: |C)f(`tgFYx,Q, fmUiC`9pHx\$xNX 9hPa)C~odLTJ[)W+W+]7o1vCZu"N M4te [wDA0Z ~Do3/=Qcm7N3 `:An; c0 KI ^ b% d_ 8Jw&$aS(-Jcht3Y4W$#('(H+c'#"$ $WZ&"6,c7r88RVdk)zLi=dEP}%U~(VQkGu&\<{tIVTKPp"-ZhG[ ? @ D C V G k  T ,fgL;|6B2v'@kVK.|I5^=c@S  C )! !2!"!P"""t"#"M#4######8$#$q$Z$$$$$2%$T%$%$%$%$%$%$&$&u$&P$ &$%#%#%q#%9#%"\%" %&"$!$k!`$ $ # p# #"uD"!^Y! +e DJGA7vDSM.q.RD   b 8 h E   C+ b K"\V~ XZ-$w#yAy+r  /!QBx#\bUz 4bm3N L$Q([y7L"X[1- xwNC% ke.2\]#1u?K?D{nF,eDLR Uv3M]P DR{d5q{FOj9V'߫ބW*e 7"ݏqRBߤ߶߷ݥݍݍ-wIideߜ]Z ^Ifߑau{sg= ,Wvw[ >K|#R"E"V!'a%\.e)a"#+U ,~Y{^hVU OW3/|$/2K/:2e3I[UlHHC  n Z $ 5 ~ 5  b K KLI8}?;"Rr kCwuiE;NV~eBOK % )!H!v!!!!!J"2""n"""!#"g###-##a###/$#C$#v$#$#$!$$%$$G$$Z$$V$%|$%}$%$ %$%$%$%$ %$%$$$$$$$$$$$$$v$$K$$0$$$$#$#y$#g$x#g$E#R$#B$";$"+$~" $N"#"#!#!#a!#!x# O# ?#Q # ""v{")g"("!4!{!{?!1  dc  >dkXx)K5K2X9I%1{Vc?)E  | c ^ + zE $ 1  3   G >Jk,C+ek_)+\G@Qv]S_>RK7o N%AodP aUb}K2@ArCGG 5Nއߍ!r7܌l[ڪp׺U*ؾՁ֊]Ӿi+қ[чg щҍ>Щ>ђDψ,ϕΩτiX)H F4EαNΫaέΊΠθμqNОπ,JъO\mZҶ`W֩PՂ HيQؽ"ٙycݼHީ;ߥ7+* !*=;Ic_|*8CfS_M<j]@|I(T\9R. n   nk    $ 4 S ] v    q W = #  t Y 3 f 5    f sB Q' 0     v f > 8 @ 2 ( < B W b D k   (! va   , R > A H L w \3iSWm'W@[d[o&Sv!1Wl !!!!" """###v#$#o$>$$$)%$%B%%%&%V& &&>&&[&&&'&I'&X'&w'&{'&'&'&'&z'u&v'M&]'&E'%'%'o%&#%&$z&s$7&$&#%C#w%",%]"$!$k!<$ #I ##="["!Zn!  k YwU*v,CHoN^"n 8 l + i  H 0s > w ! ? ,o x6>z q -}f<6vxSGMR!vl'.Xy$8x1+q+:Oq8H,@d2fX;'kEow\uLrAqdaegusrn}F/ V< c6 yo]fMm?=.'$miG/!cSE< }%3Fk2Ml3Y (KWw0t3k?F#n [g(&s>n\ Z1iu$[AI,e5tif7aOL`9D!7r I<|wN|Q f 1&Q  * X    ^  {  r ' [ 7DB\N+`F^OYTG%):iS*Kbr : ];>Qa\b` [ J9 'n~UR%3Kf"8^Ux $\})Wi PGnA1-Whrc 6 M U u U   3 k  i E @   (A % z)}~V?0juhrME0 "hJ0!+-57@9;=/05 sH#Yy)ZDNBp-o=1J1ND Urn? WUp?L &}N_'TMJWp&;v6P[qBhDa\av(I 3m$p+{>i=5|pHW?p 3R}&>{g?rF$@OAw S(LB2<FQ/q'Ty#f_%o8{ K  4 i B o  S w  A W z  . K _ t y m [ ~ D d 6 \ ! B  & ! f W < ' l  c D #  x \ F 0 . z  r b a U J L B J 8 H J H ` h n      # < U & x F z  2 2 d Y  "  Y M ~ (  J K q c  . \ 1w ? W s    !&*1.'%x$gN 4  q W < 4  ^ y  J  I  e . m  W ~   l m5 JHQo c Fj",~;sY}4DiFh/L,vL/weR$ _YP+>ztifNIMH AI8F*B)C&E7FAQ>AFNRXaQkPeao[s]rWrc`YvSKInDr7n1j&P O8;)d;oFq,@ jh(Bi*g4FxGo D"~,31f/Hy$~+0n8*Bk!Xg+{EYy,>xha02t]=kceFD5==LJI[l0Pi 4XV, ZP#1s9] t^M$3^?&)C"b,5X<_@z )D d{-s{( k:oHv,J.  a K k \ _ P P + , ] VMGR~Gw,E:XQ^ZQa^qRhMk;_ OC(^<_2{4k0|A v 9t ' u 5 [ & o " F p @ C  } S X     \ J1 4 rgZW>D(0  +4;,>PQg]t, M# i9 Y a ~    3 O x     - '  5  B 6 = 8 D P E X 9 k < d " s " | ' z v z t o s Y Z o A Y : B  $      v Mn )P + vMt0Y"^8fR|Lo{:@mV16c6rCn4 la8tWpKm);+gx=K"{~^]25 bk?O.b@a H0O%e<^0)W"fHv;H `({D[ @7#l+N yeOY52|Q5~dUBR+G%ixW\FZ0OI 7/13*0/28KuIyJmborolnfpw|+9Tr?Ee,Ji- Z,lAjz"Kc-Fv"@^ KsDZ*Rz"C/Y[ -7Xu51ja:kMzI ?s.`EuI]9q6z3l-h(u.nF~*!e_1I(;!rGn\e. }W   S U / A q 7 >   \ f -@ k  R` VE{=k)@u1a#=K0VS]lktrkh]QF$,lW:j%AsVE0R Hh & 9 u y # I K { y  & : H  fG |Ja7b`g#pXz 6{;'c}5;X)y<9r6sYL:X*G&'+0*HUq%)@RRj+yEy6mSP(LvJCp<})e-i6a(R   +6(Z8dp|||}zhX8O3#Ieo5RU3r!Dk;%.g3`M@nh <&b67 uoI~: bx5Q$- x- >%SOtx=&`PfN.^'q^ /"_>j3T6M9zpy <V}')?GN[W[[_ ] FSVB 9. nmRW=8i8f$T@(l<l[D^1 _gEL2fJl7K- iG/sedN?;n2]+A/%('(f!R$K*?/->3<HWYh%w*34GTWy +Hf'Ss /hP;<|^YLUXe|4Bc(~.bV/AX!lx?6}5Bs p  X # x   ' Z / o g      1 & ?  9 % K 2 I  <  ;  +   k < f  6    \o 3   rp 4 zr.&uMFjj*Wr fiww_~V|A! izI,#[<;AxeS.`(o<W9NUWX2ucE>0 k P 0&;Ol+BJgxO&hX=zIN7!oj'~E0bOy q!9If{+$GYyF$Z1h%]&Q t"}:58V S |  + >  G ! d * i 5 j + d - ` * K  +   x J X Nj%rIr*t-kGl`J wc>ou&8j)i>kK>$z u&lk1v4{Oh-=OlB;B WLd&_Q3wXf8,    k L !  ~ 7 v 5 L - Z4Xu/XqpU-   _  } k ,X   q 9 i a  R M   4  u)  : QB)HgAI^FgFF6`no%oEB tQGQluG.s:Q1 w6}K-jZjD8) s>tJ Y cI1,"  :Ci!t8Ii.IoZMV+fmrTIl)0hU6ItS7seEXRH[it)Ea(^ >vTB;$~O>m]gU8d{v0WhRI9=x2d9@R7J:28.")e8>M  :x  9 = ? m . &   %  1  K'gW,hGQ'a2\.]zDw}bC!DsJ&s YJPMZWdBd~SI6 ' J  k r  z @    't3W0C>C\<kAS6yh 7RwIr,gM])sF,N5}|yu z,RwPw G*|>SV%s[>a) f+4CG2XdV]dljmou8mAaQe]USMbLhPi1r$a^ dJ8/ubAn8e)V(vbK>e |4IqjT>K2 \a.qzdGA5!h=vLmYXCYr'8nP|$nKNxF4kJZOso"+c=YKCN,wa1r;a 2N$B`3'>-^3p2|6&$WLu2w_JK(#kX- kU=5lW7(f\V83'5HX~/<*GTTsatD] )Eb%rJm~0#;?SNi^vn| po}Qe:VB>1toTY,=c/j=YO.\^:%Jt6872ia(SK([^ x;~3gUXl0x+\[-@[2"xaD@  *,4Y 7_5j}2^o.WHv J 3 F >  = e %  j P . a  B w  : N  7Jdq"4LRR_`_RMME/rlVV1E#  f 6  h J  { ?  o 3 b  X j . : w w 1 :  r l" /Pa"y%VH=gv-LY%n,ej4l8f6m8Omf^40 eQ/ww{cuY^mpth3U`u -*39M\!_e q s|trgWU=5y#W<P8i> o;o5 Qr2J\8%c$LJi17qzF: VoT*U+ tcnGc6XjQTZQamr~inrbvl u,ATs !CBgo&>?R[dy))BU_ss )-Vq C&d4Lk 6w0QCzw*7_kaCzU=y KH 3Ug k7e=!HKtGx=^*q^1W/FZAn,I?yoD"rW.gV C^ 5D u  $ yV  > ] b a *   p -m  RS\|MV;=+P'p1\;7,ZyO?t*l(Om|8VOgb\Z}Ml5J1[cA-}HJl_aj[h<O.i -u J =  { N K D  A\?` S!.6']'5fkhBCUd8M(fnEt5%|v$8JbntxlaWHG- ~gU>#|VE*_ O i6xb.$|J&afU;0!S5wkhS?52 ^0\(~~nnG[VMB0.p ?4tT~%dN7wV( jGmD(R*k:+b2gX[93,strcX] _k!fW{b.U9^7qLzO =+7-}86R^/_wMN+," f PsAm8\F vI[35v|OI$zU8p<&h=w. bc   : > L K ~  & K l   < N w / Bl |   :Nts!R7Y0q=f|P$@dk([5`>i$<a,N'>/bQl_    {^B$lY@U)rBS"^8r(fe;>7P*\u ] O F  F 6  o   2 I [ :'hIf>X!}3@'Q8a:\KjR\RbUSWXLKLNBBI=LIOAPY_^gm %>Ne&Nq)U9t8R`8xnd]RS[l} 6"YR~AU Gk #\&Q2ym\Zs\j`]aj_c]\A[?J&r/m)>N[9v2iDa7irxM(w\E!v7qPIlz1EGBX ~PwwF.Z`)Dc?P/xtty;^ *df>F#}=xfmX?(1)  7  ) m  D  Z d + w  / k  !h:!eFl$;bn,z<}FL~dz\sVm[QSHJ)<2s7xhjKe+{T#X  } X #  H e ' F a  Z B r  b v! ~z2$=2bF]6 |a/mP&t`W*[p5L/~_H26Ns ''U?GrVy -6HqDWh|$/B`iu-Rl6JNedzk,}5cD_GZ?H>:2# $T'lAKx*Jh$WPe V]W4wbEE OmSTQ_o n.@j%*dE`#{Wv357=@FMSc %?HZZk~>Ae\ &'FH| ;0n`y}/4HQcj|9;H^s|j`@xvmYW[H.r >yQ~pU*]%iXM<* |yiqSUDM9$# #(-?Lgq7T w+:[jC{9:Qu&Z9e#f0b3z VdaVS> [#z,}>=\c!ig<P:+v)  )  8 ) H B S g z p !9*O.[#hT ;k@FX8W 6>lq  qNrCj#4}'?jp  )KRmF32O| LS   u H D % k\  " _x3ES6)G[%Fj1I$`m7OE/9u/j'IaA]0, o[[H9,'9A5d9-RQThHtP!;7_o(uX~R?r!`@t5a@i *'B9oLLceokw1yTpYrbhfg`IoIa3QD3 {Ll.1 xIS W][7MyG.4WynB| r'+F:w^y- Q>z2q,PD nvXP($ -;QWq(Qq)Uq#V!;^xIZ.=-yscwOaBh$Ebw#-=@6=`!p[DYPmL 'M,kiM r!<bX &2_Pr(iQ6mICz/o+ [ ) p  K 9 ~ t 0 A i }  G M   G A s A,}` E/pj'&[Opr7Nl~_N.zJ(oIv?Y(#    nC L. $    b ]D ./    v H  k [ { T S * " : #   W  [ ' U * U ' s d P , S *   w Dn B  Wp3RjA}3om.?GxS'c5\d[[`ye ^ 4kHss/KK:u?\8] (lHgN;"&qN &% .@Mb5^;c)?Kvd{B[ 'Np Pi&\|#1+HQvan0S8Qj$#A?YXnD~Ti( 08EPOfmeqwitodhPS-I:(p/rQN3fwNSw?IqI,x>: r4g.ligP)7}Q]I,%-5Og!0;Jvl,wNYaU|LT.1#2B~o. o.WMi3|!7XO+bOpq ~ u  _ x ? X"O6_f],LV~ >(f5HRU[JWP7tZ){M{JHX[z)Q+}30 W 7  l u  ) d  F U  l  S  F W #iu)\K |=Gf*U%d'N#`!leE9U)`N5 m=~fmOfC:?1#( $  #%#&>IFO^brl"08?R`dz)6>ITQMP>H:+{c?wV70iB4m^#|542,z+[h M\gJC?mU3`$jM.rj,cnnPP[sJE#rG( |&H%^+;@\ko-Tn':RD{`u#Gt2M&]O @m5Hl7^wA^v1  S]  ' $ o U  n;  s0|>C= y$-p!*g:"['`&!4KJyWiwnz8pMk[bqT{G ~ureo9K9tVZv3DjB' uK0yyFKwDzL7Jl4]W #5q> T  P \  o O ~ G > = J  d  ^  Vw  ?oN_`Fn$&vF~jo.pDPz9e Py(OxO \1uXC9.*x+v8wFG]x--&$mn5z;|,{7>;J  /  d ,   # 7 i  d X # v3 { B Rdl-%^@:V) 9yZ D zD{0N%vTZ{ 1Oizze6TnFK)cg7O{)0RNnI,BS N w [  a - ^ @ w G | L z Rg,|D k+$9Wk=+X9:=|"dy!U2lf7#Xw+P|VgKZO+{m]M77)}sq v chbcmidgq l yx{&z-8C9JSZ`_tvnr{lyiynoifuajQaR-;&%z[sAP,-zlI7 p#W]$KJho. |t.? >VU{qF#^`<e"m{Ky+peZhiq~(T /Yw$f J'}vQM*-xy}e,|T;BZ#u~WK}"gI/vq8+ fr;$Zm BG gM/s\B;~(l?% M xz^QR9>,2  ')  #  -  >  X  x  j a-cV;s%xqByatW(-/u_^e @BywCl:Tk  pZX6?"F|X"UB53@YFf-qV3?[s}1_~ #  2 ~ M p W e O  La  6_ &mwn|"1<S(DLHf1*6Kl}>6Pk+@jJn-uqCO2{Y0s`tBfHL!3%  {ld[RDK:&%}kTM4s_Ss6g0lYD=( y|jaah\[]Zkx~ .'H9fXnAt*BhGtA g1f11n^l%K} BW!h6zj2Rh .?2=CV&K Q2Y@RQiTi]nrhm|x{+I]w:G3bYn|M9hG|WHxNY@P[ i)p0\ZM`B'?gK<Xk / a  Y o  ! m p  " { u $ 4 { % m|   ]c  .=z@V},9eu!gL F:qU*LfGw+Gk%6ELORKWIAC 11dWB>z|IS!Fa,h [ in#Tp"%[[  A g ;  \ / \  v +   W/ tH_-xY#%?cjD'6Q6'lX$p+XNk5LO}BR$kyRXN[/C+;-01#/+0@GUfi  &-@&d#k,;3@/=-81/)' % qbG*rY7bEx ] qAz <Uz2B u}IA( M_'H. |Dz{jeiQR&I NELFIRfZY[Dm)e| y{{*l6f:eAZOPTQW>d;c/o&)z }#zz zw}|ulncqQ^\@B27&% % 1DFSip)I!o)A;Ui6`)q%>q(w K7p+uE,%]:/W z+C@ia'0aa%:Iy[J#0[})3HsX M  I  T & | - : g i  ' 5 V E l u y   !  9  ; % R $ I 3 H 5 Q @ I B C A A < 1 ? ) @  3 ' /     u N /   d y f V R 7 B  (     a L ,  x | c p \ f a P S E R @ @ & B ) : " 9  3 ? )  * & # #          ! - = : D S Y m q y w d X K 8  o _ : %      y H 1    h ^ nC V& 0 }ig>D"b)jO&P JdtI8XxU*=Mhs32f(Ib(m:rCSxIPSgH[ZZG$y9rL5m(tO>e`N40 rtaQTG?HKT`\lq x4|5xUf`eb]|JnJ/'z {rr^O>h0U;pIoE!|8Z-( X V*i j!Mii{G.v*Gk:u-Vp3\ ;2  0 $  qH1N-^']c'~j.r@i@5Xcx$*H,X@lO^ r  5j$24o1Lgk e+qCfa$mLS,I T+p[LBFz-P&5 b^Fp)aM 3vT:urbUKI|G]?==825?IXWam|~'D{9SZ &W{3U*fG#=GUp:FG +r+Q=n DQmc>] I   +z D 1 )b  G  Y Jbs0~ip'O b=ubzS:&sBaL3| 4Wa(]UY!Wp* c  u Ad  H U  e i @ &  v S m ! \ . (  x _ D 6      ) = U o { ) J  [ r 0 ; _ f   * H H k  | 6 Q {  / A f w t o Q I -  !      &  n  A . h I U  =    V (?   w >H   pl 1 bOY;ES}P5@\tb{,tGb]dC#t-dL9ip<3 ox>O.7&%(?^-`3~U.pH.ShQ-]U9:[w-PtRKE~f0 J]CO; yf) 1=y%ku7^iM1>QS Q&qC@v+b3]&eF p9d7o;X6l @6WLk $Kt !0A.PXh|v)]L]F}"5WlLV0c62W(zxp\FC43Y=A^S  n (  w 1 N C 4 [x ^BZ5r`T#1|\!jgXFO5f-K-jQhynbYJE*|teP:. ^x7W"yJ pO&tF fhG. v5vJ&Ej0I{_?.h`<NWY _ S  l &  Wb   ;    %  O  o z d5=5}7--'UL NwYBB, &h1wQ34Iw ~Pj:m2p5T mU->[V+ ^LB{.Gq`ATG3,#X 1   o P      f P r d R D . y V /   { S - P )  z F  \ 6 P  t j8 ,  H  ? 2  w^ ' '7J8RgfU,<ObwOiyb8P *c%W>IR,WxLUCFA&m4\:`Wi/U_0<5ߜ$$ޮ ߡݿ9W\܊(ݓ@ۘ?ܕUڈX۱6bB4$ %8K=iiۖ٘۾ -KpڌܱFNۛݣ gr>Kݻ?<ީ4=ߺ@P\b.JWt#Nc}#KGl T&CAPRe]\kOa'Sw%8eJ3+zUg %NnNMA:lZ8=[h38lnM+YY N6pdaZalo& VB4|O f ; c $ Y C | C f B Q 0=)7 h{WY&9b tv:#a[G[1=zm(c,8RTBjRnxeuccMZ4zhMP3) p8t4d_d4ap|">b[QH`n%iWfqj~4p'B " i % < > o  ]  R T  j 5 N + j C  _ ;  o i N , l D3 }lwcW_I1t'xeTI=~j-t:KhQJ,<7}$3hQ-aZjzZE;nx^rO`P0GMr_b I;7k- .T4M@Ti%to;20a<=j/~Y]BH,(!oR6$ &*+=R^f +1NUt6Yw.W~=c0o%RpT!REz68. AJ^ e n$/.X0cEM*SEQWWcEu%  r   u Z {  Z z L / + 8d5r UYSW|Is$=aqy4/IEHG?. l[MtNa.( ~GE8Fd/o:Qxe//  l & r M ) 9 e M _ , H  2 & - $ " o , _ 0 R 4 D N B M 5 p ? > J L J g  y N l " U6 \   ! _ ( k  J y 2 j 4 g Du?tN q"\pB])5:AN:j4/"m@c@<CWV=YrN , .  Q  `  } o p Fc-9Vr*@dh*!cAEs8h]{[RRAg3y:P7wk EX|-^>A= LwC#Z7vZhGD8/! ZQF, nv{yqdViG`%aN>QFD;=(}b-<$7 ~qR@&ykhayVua}ZvZsa[^|ow/"`Ur4KiK*VP^}IV$a7 [ k  6 ~ BB  ~ fRnkgscT@ _NE8}o$*M:][]yl_jC-m X= P n2/|\6i fMjfb6JQ!]  ax a c o G x 4  )  ( 45LK|q _[uX-|{)G[)u"]o,hAh<"CXQ2 pj2>qY4 ||  . 8  3  7 c a   F & l Y  @ (T 3j P [ g y y z y t Z F +   s T p + 5   P K  j  S f  b G ^i<m&#pAy |>XhV%B(\U/ !~6Ut3s#Zx19a/Blg3Ai,v|Bj{Ce5t2n?3V$29\n!#zp/KH=6m- Y |uK_ Bi0"~w.Qrw3FI <k^].Gy>} d7EH\syX3Dj!*3Egs0@[v{#iJJcFt)'2lWPh.y wnH+{xob_V^UZXgh^[iFo*w}oT( iE^;wY na4e6p< \:WgvHD( \Z~QD#|Qb\kLG  vl|3|;sgorv#Fi 3W,M5alz(N7b?rMrQR9AZ[,Q(|uG#6f?y4q2N8VmXl (CetwmaaR<B"+%|Q!eJt0Bx|'AE U!UPT\?}`V6W$U! /M6j&&b |S]P'5e-G%O(d,?:q p8=A[,b1gB]%5 9+'53Vg+UI hUHnBCC`W7uQ{z0KEE9v+Rrc*2Vl d8]QkM#-B^  Xu   e q  \W  4 a b  Nk  g  !E5[ zdK~ubA"4 F:@p;5%z$ V 0   A  i + g L {   & K < ~ 5 S5#((w/^AKaow**uh$w&O*i=ogvXh]jUg[dbzl| .fG}dlOLWU1Qd9V"VSR" T ( R - = C ( >  m 7 2+G m1h7<$I]wIgP2 Qc~1/n a   |  e  &  lo  O " VtE5S]{PC5g5{ f8o^ Z7|q N4fa.]WYju/(mKp#]s}sa99/l% =5A71}o0#<x G 5 x I # < h 3  S; -H8 `+1)>{P||#M[NVb{BJ j=i i)@W7f0Zz(L *N i!#1(9D6RS PXZX kpvxm~vlTM;'bOM!fJyKD. D]-jbw :cp>7wP@6[LqAQ<]+)V5"V_8Z(yK*mG1ZG%p[-MR?u-BEP*MZTn0uvNs*DkS8?XK@tF0P{j/0|V qb| <tFI \r'f g l+   J P o  L   !  .|+I\R#k \D`x#9<NHcLL</m.OVSw rR]6< x  l  1  B $ ! GNn3yh QH/Qer:MDa,IyVB>u.b+Z=PH^[d1b?s9|9;sUl- A|yptT~R4$0  _ 7 6 6 ! a  ! o z 7 k  ] (Z7pF;iDZPLF61~Q3g3  ?m !  >q   S # m  z s  , oCH$,u[ A"zFe]*j' FX,DRzw !5Ks=k-q9_ jSx0 @x9M/fh7sTz1 TwF^\\<}$F zvUI1MLOyF0vK O9mv ? ,FQTwTZP1N-}HLSBHwN!61Qg I1Tg\b#oS~s8H} Oa$rRJ!{e[LTL_};FrfJ}2NuG-DMX.Kqse0-JZ&LWPz*M_P'be`p@v"~MI ,?g|>|sfyzvfNJE<C=LsTgz%h&PQ| a@*BZR&y&y5t^ >=>:x?G6) :x%!~Agk K"Dp)k1(wJu*R-K+jT|De?Tfz!9\oxs_I:~tae!Q?l@mUt(@_Z&1Ug3P/mMDn*Z0&0Far5Lt 8aR#D:vv HW@>{A&Pn3n= :pr@ Kb  $ ) [ T 7  h ' ^ - F :  ! 2^ }  "Rd :8_{C)\5y>>E0)dV&<i}?s kI) a n  @ w V ` e L Q *IKnR%{w33B>Se uCF*lcm{ew\-d[c?Q sVy8[7:( %)7MTC"SM{g0pVE{:G&9}\l8bTf[CK0ID *yc{=@&j^c7CK;5}`C{!,=.j+54 lE q_J(:n1Gu8*RZa3^n \XWV_eq-`8WmoTA8 ! nS1YFMUCtLJOs}>z .Ayt gh_E tB&N\n)DBa Si>W+&c% b:Z}5;GJEM:+e>U]a -xsI~Z-9c76DgDU5ZxuST+U[=D:a\51jDx,i"YELW O a(tKl;.[#SS5E7YF"e zItKC'P`"AZQ)eS 5F  r u 0 1 @ E K 5 N/KoF\7'WkyR2`z,i>me? W o s q Q `  F s  4a;&FTG' ]n&E K*':8`gEU _~Gj<*U>|n(`VD:BZA]\|<:4[ 1Rxebb.   MY  !   5. |  &  j E 0 c  1 ^ m * @ R ^ v t  z w {r `T 3I $-  z C x  K  R  q , u )  fz -  s  }^]+DLm$c&':kCLDTw fRfw0u"m){##A+K`?y&Jxe%ZyID cuKF a4d7 oT.fK.!3 lb9!w V9&%-:Qbn.Bk  A >k Z d   E g  G y ) G j 6 c    G 8 x p   @ $ t J g t  7 ^ ( @ T } T 9  b S ) ^ $ m < u 5 f  S w P \41gBW$R"TMLCq+OD')/~.F#_; r:k(|/G h)~W7{];$  0K,m5[w%U2]k0 Sll&*|@`.w_g6* gN)( .  [ &  VU'[^&1*F`Uv6khN TS*(Z>r{~piK6hDa';|2 f* 2n9S-ur > yc  E I h  LFn)s 8dn m+RY^moqjs1~ O,b/k5mH!,47OkVddIv>u6'&-91A?O?_Zuf{y 9AeisqPA{pTb#F+`._IJ[i)Gi(q+|Oes[3 ey+M"yIy&W1&Ht/TOz"rIf Io*'2P.JE kN:cD ]@xPZ4QFoy?.e.SQTabd3G2:N.MP[PPCjCH-$Gdyg;*g7W)ynC=g0A""zZX T!S%W=RE`_X}n ;a7\zEg@qD<pW^q0BpvYW6! BW}K/ F\9 \` g ,JIy,`$x6 H_06I*HN^z jN '(E,{@Zu&Y_>Rv&X2!eV=:*#$)'7ET3.i\ ;K~yF2q= YJ]^ )G ; $  SoB.m[ > \pu`KYv"6iG9 gj06 j } ":F}C1|hHO 8 62IFt0TZK} h{h tlI_6_ 0wH#~~h\ D 5    iJr[>|8mU%>$fcro^c  .!s!!""DT""""" " # " " """a"-"s!/!Y! a @ mX ]9NF(Q8]\G>T EI1Dyz E 5 y w [ 1 | F<~#cgI\ =m4: lg[=V.GWo-K'q%dWne2%`Q"|vP@vPP#0tJ~+Z ;(i]9]J"lGb4I%`0{\W@R2 )iH^/qXdBh)]T9C1  @Stz]bU>5IiF;15T9D6&Dj\L d]tXN0Sn2Ji8T ~6R>K~fnZ]YMbT LIKV7c4YU+Y:VWGZ/Ez*EtYT  s " t f = A , n {  L J  0*QSu":GOTjdiighQ[0UQ 6 8 % } e 0      z rr ag LX >C 12 (        % ; O R q   + # 8 F4 ^` sv   Jt 'Q dJ*k,PkKwE)q6Mib ~-E_sydKCvO8}%O+sZG/,q.pZ ) f ,   h IM ,   h 3 R ;  M   T l 8  Y 0 Q  s K o ,  D } G m 8  c H ^N)EwxNJ{y'75;/:t ,L# rAK]+jTwmuU<=V%_Z !oz#=9[~Js;_7^ +~[cC7Q&Y#.Zi߫gްDݠݭfmA(ܾ܏qOGCDKWAkw݊ܢݲ5#tbޯ2ݚ^މ1ߍ,PL&AH=Zr?V->neR>. _1Z@U m_+$  e /  s    S  mDl3$H]vvpN/r ]e&i , I  " 5 X j   -  9  B  M t@\?A;3%1 6 8Tr9BvFuj;]2rPBy<|HuQ~`r ?9|?T>U#}SNwai4OM'{J>   r  \ 3 & Z P j q|ym>pnRWxjVa &28B<3uB [ bqmZ!?DjEz+ b0  L # U W k s   *  5C  R_   (  i8 \e_M=e}FWjNE]yP;y;{O1g!or4@%lEY-~XJ+&~M[2f+yMs3zJ/pjG.c_ .Ln+Ky+y5o'n Qb{0S`l])KTjk0C UIfa&/ ~Uv9YF2)$!''@Tj E]l `,e]B3dIWD+Vp%Y4Sp(ZF?*[![:i# KEmr 5@UfIKB u & 2  l ) 0   = B 7 z 5 k F }  F d]     'A$sGWh"1HQdx;GVeu3@M]j'=Lgs 7Qo(}.Mbi@Lt}%2(FG PMQ[WTHF;x*b< hz(V: k,o7H_M)  { . _ & V   Ou  z ; K  n " r B  U  u 6 Q   n V;    rd >A  ytLD(rFdEE^kA1j@iHx",XwL^n]2Ji Ep7Dv0N:9Mh ZJf`IzU?7  UW  e  v 3 q  :l  ?V  >ll1/MKT87h{*Sni3e3`1G%snY9^~7z5"IZm2]9G)Sfi{} Cp"+.&z1eI3pDuE'l)Kr/y+M~)WmF)*2f'8kP(4QI ] j d ( ~ A v p [ v3zUr<g)h^{ V]a-fVxZ6_h~&4^{R:ItUo$$ bw[NN:!4nH-tkcTF571gR5vfTNq0L%`,pVYE-u:{:pL:QHu g;&Ke.y\A"TtNuoXTJ4?&{]@& wrs}|| 2y?h~7uF(|?lG 9I{A5ymV|D3LzLjqi& c3EzKq!RF^o.v6s4EN9JD9 | w 1  1 : n  Oy" LhgZnl@MkO3zBhLB{;e.H1cU{~ #,=LTo[rmkv[|N?&|xotq^meIa6ZKWA73m5F%- k R.tY:}~tka\IA$8({\vB`)D'_h1A $a5d)8[u"'b*t,_&e6 < K \ Z y X X  Q ? vYh=N_X+/cr&NNiGJ=<\2 ]"G1AF4U2n4'CKWd|"<\k~-VOQ /h)+tZ}1oD AoMA'{P2|tbTPIHO\)`@lp G|Fp,l3[xgB|YBP!oW Ym6a3d%eSJi6L2Y3i  m F : )  i _ " L  HxIjL?+k h/Dc4K#+!%1F"pH:-e Vv <`8I zsyzu}r"='lK R8c$#aXDStSJw=~&Ts$N~(<]q Zv,m _E-rBKU(s-M%@nK0Zh[U ^ m3lD/Xb@Vm3`: 6 Ku"A~ns[dLB;8.*&($(&-#,@5[=cRp}-YEr9!|j XEINMpOvCLQ.`IzruM{6zh$:o00*1-!`[7s `J   S  G 6 l ~  S t    |  ^ 6  | o L H  .    il :*    W \ 8 [qnX>>5* M  (*:lPUZK>6:BA0aYesS-W C   / oI   A O  - y  X  e  R `  W G z 6  ! Nzb#VDkBg )+'(#\]4=u@d"3w 5 G d  H p  ( k b  U  | B QHe^c~n{ \Z awSoJ]4UB<9247EjBWjE2f-1rYO+ra2E*hFq+U-sCvTi)Gk==><~48eoM0\Br+?X?xEYFIIB9' bgJ;-]^#+ ;_8Ii>9{<|sB_;3 oU/rfWMGq4WBL4E%/& ! ~YL:)brOg'P I.%vS=yprQQBA2 ef^TNUSYf~0 \R(Fb5EcWD:Jx ?QL ~m+Ab&y3r4|=A w 1 x > T cdc5^=^gFn'}N5p<kQ~%0JL6>/rEx:xD\{X69Q`Unjpu'!@ ,C t F  3 x - k  | l 9    | )\ +  y @ y @ . } a5pG2qb`Iz3M?!ym@}wapRJI,dGkS2eJ'aCs^K/oE?g^A. {|m}r}cs_e5T$[ E4)z_0 g5}E X2Jcs&ov&h_ A d@}fp&! #&#-,M`6mFk_Y/ot[7I",k"H#-]gF !@pM GHb3*EsYj7]!GS[J?J7{BNUks'OAuq +Px ;aQ,Q/ #!(,X;Y#~W 02X f  }  < . s : 1 [ PVXHh0G_0to%Q_"KnV&GVkz~}Q- qbOj2Mcm2Md:s;zPt%9 zpJ( @r QOY,?   _L   u N  l  q  U - # t B  b ?ewo)b+;=1&]m?Q3g [UJC-DKu_zxX =O $r.E X:vP/# ";]xH jD4OgBBy<g\m yg=H4PAUB?3zKD-[&S}0L[f0|;=74.-x qkX@%tP+fQ< K Sv(_&?qf& iVmz-x!e o-:.i#SP,Od&\n3zQp$>b;c[<"yb@41  1Ka,z4F\,RHwAg5l/vFbHf i|:PjcSQ`OjH} FL;W^h}y5X07ALY%  S  M  y F W - #  q 7?  .\ aN~CQwIw:#m6?Eccgc7eBbNRTJfGo;u)smsz^ZTBs9]#= nyDf+E ' {H|5W/y{V`.:+    V 1z Z D = (  c E &  d m N T & ?  & { _ 5 ! t S 8  | M  v J % p 8 h # ^ 0 KFN~Ay*p(4` D48Q?g3}u2g <UIBR3Y 5j7x4~(M(p:RItGZlI C_ bOU LVpgB9\{C[<% {uxpz{~0$`PhCX+{+qG=m#sIXeTHJ)RrCG?f':d\-j!a= gJ N=kU}(A"W6^CV^uqww}yvvyoleVcUKG59+(!  (A)M:_JvShw&?w4=s+\'c>i M;xaSDRI]Tw lK5u y K L 2 , v r a W > `}I^0K}UJq5XCW1<tDV4_Gp-8S\eYUQ>0yV({<VHt,Wj F7t\ l;jA^@DB.*n  K e  9 z  I s  ? u 2i=S )i9S&uPd3?, uw]jYZBXJSSfNd0{i=7c/I1*P.z\6}VE xH] hLg5N 4) x z/1T_y90\>w^o3]Np> W;dMQ-Qk%YXP*1a*\8 VGz iC5^])*g 7{gdXM(P8V' Qm"R=NiZ*K-6s7   , dN    < < o j {  7 D X [ i q h ` h S  A b % >      e X/ &  w G a - o  m=o+fq#dD /u3yUFu1WhLYKgk(4c$[' mH&}{=Q0|P`8mR|Za.xThHnIHFf8RD:7hp XJ6# U b  M / y " 3 N t q  Q   3 Y  q 6  [    0 8 9 A Cs < Id >F .0 ,   ~ l K j  Q 2  o W & j F  [ * } 5   H \   e *\  i1Jgh  ~Z%2T.L %oB_Lc^O1Qr5VUf'|vJq/v JN _G6BQaZW433)xbK-tJ|uhJt&ds)8z<8n+z<5mt 9 Hc i}      +! C5 [0 C F [ Q M Z  G ) J = ? _ 7 m / 1 $     A W n  * S h   9  r  9 U  Y / u i  D , U n 8    1U _z   ! ZB l   4 q,i1M ;a#/*?MMaHpCA;$ {l`(V3r.a0"y Z$ c 9 , @  o U  "  .iA.{rmJ)/kuDs7k!!:Xc'N1 2!T?5{$Fx "q^D8~z8^c;hC)xc)3"Q(Fa+1 Vey%GUQ;V!Cf /Jl(EAfKz;z"lcG  - v;  1 | +  Z V q ~  8 X x x d C  q c Y  5  }   OH  } o # qmFIVsY2G'JPAO3}5)rr:\t \kb-W]&l=,i8*Kvvu;Hpa38,-S|4m$oI. `xag*v3!/H? p  ,;  _   b E p l ? P (.K c0`yi3&Klf CY)7V7W.j<v8/:) W?IeQN$:cox6:\x# x ! Q  , j " J o [ h  s L (   8 B&x7{ XHSI^,8ZcH;3W!M8{}kabNC>-dW4vF"wU$zWP a1Ui-i(a*n(;jZV n29o6Nz,|Gf1b@M `g6V- \M+}wtan]VVIVPWCVPO5WHFSQrOyLB>=L9C.GB4WIi8:;07;61 145K'b#y3~52!-)&,,3#,/-064DA[=bAdO^[rfnhryw{~~vyuhq4V:[XUQA>B+-+M_v:Sp1T zCT{ ; H a < v c  #P 4PfK;-eCD p3z|gE>NwqvFo&\h8H @\0^1hOMX5v$6u P[PD aA s?o*`p?}>x)f9t  'CDeQf|}|fcXE&}{Y@1 sn"tZ <O Ui@nA1u.6*Ei_+y0 z&(C8_pr Q$=S\C&ߓ(ބܚ`۷V\nڤ cޮ[ٵ؇ݨj݁PkJV7MAUU^m݇ؕݫص ]o޶٭ w]X>۩^3ܦF8lLEvcS8 sEK+xwjeR`G.E2rKd_!=Ln:rje l@gU x   ( & 0  )   t E p 3zEb!S <VBJ;*|& v]W'j6y-g H+XG~8m1v=\Rv 6?Udh&9&g >]`v.7PSO`kcjhhZccEM4z/w#i P\<+ ZG&zQ-wOV Xk<Xb+$mBp85`@d[jY\H9f B  l 4 w  U & \  R,XOlq(>h(1X.tBMT r@k%^4e4t!,nAR`2 ;h.\aYߔX%T)ޙgB2xnl{x-:Nr݋޶J2i2ߙaRF-9rI~8w;N ^WF3,}a9in_SM0;uZ>YMS6^t V2z4q%a(N5^-M)l?jAc x&;>:B_HHNM^ Z.lSmym4dx9L:nOfI-xPg#R4ZnTvA0d ^CFv@LA=a+__D=5K` * v  v v  [ A H  M  -]@rZj>d?)eNq.;Kd`z_i{ o  m!!b O" ">!-#!#!#U"E$"$"$5#<%|#%#%#&($?&X$q&r$&$&$&$&$'$*'$'%&'$'$'$&$&$&v$&J$V&'$&#%#%s#R%#$"$"G$!"#!y#e!# " " !!s ToKkWdJ5Z:cM y/b*[ ! C + f  > N#e\5>lPjj|?U%(' '+4PcqHBL:m(Pwz6; fj3DR!vGi#xT-o C_/l>yD\5EwT"ArGl%5nPR)z7}_`G0.k9 m>%&~9fLYiC@1337DF?@]Pjp&6YB_ 6,@grAl/Hfi$p28Z}p Fqp2k7JZD?`&zvy`eg,oJhDhAr"P!r6?G2B8,._&[t  p ^  L  : p  J ]    #    k \ /  | V 4 \ ' w m 3 ?  tg6(sx(B n?a #Lm>#}xmo~|'O,xL9q1`e=.S  / E   t  B s  z u  F.w }wdUQ12f~#@@W+l9s2l-j.>W'm?rDk@jAbAX4EyT>a6vO'p4_Jsq BlOYk/ ]  ~q R ~  }  M   #=YB)T xwY'I\5L2NqTL\C @Qni(^VMYj*CN|J|Bl5 s:jBk%.IfK[ (e&pWn47& d#zjJ$9qD^VF/"_AkD3q[9{zmW^XZN@HK?QTP Y(\IiPgtu66m5K<Ix)?t|lK} O (  . d t )  H  h < A  - z u ]j8 el*HRJJ.gSDvT/n4n6Wt 2DIYQ2j@cLXHTPLM?GG 9/!kG}_X7"$m)S8_zLV #8e;bySN!G \ " S   g -d '    Eb $ \ ^ @ -   | } ] G 0 $    r lM A    Y p H  | <  ~d4T F^/ntI ou6J>=XT`Jb8W^E+ s>xZm0,U/b3G3w&o^:Q>J8!iNYx [M>BmOZvbݿyh$ܧ^ܐPۺx4۸ڬکڡڏڟzڒbګ`saځ$ۛ]۷ډM_ܤ۸ 8rݙQg9ODKrPn3qATCj7z;j.xGl=xR&xiJ,{"j I#+8c{: b!}\ E+RA Cih j FcO$}SAp9X!yOw[ 9u(bU;i>RR;N"Y g^ 69SZi}Y v 5   K |  S l  I M  dV   aH   V( j  EJne,Js\2`AktfP J0-4J^[dogj}i\dC^4I @)!{~`PS7L <_2y;eS?5uC ~@zg K # 4  | i N ?   U q ' V 2 ~ I ~  P .  j p ? L *     n G " |iP;v0Q)<~lP9) vlXC8, hJV3Im_=;YLn!nYm6W:H{5GkhXP"-zjkGf"`~`g#@q~(J ]l4NJ^l|D-"t Z   ! ]   ! + 1 q C S d  l N } v / Q / K X w  / G U p |@ b      4 _ x     ! C j     ?Vs  )=Tfj#$! y]En(M 7  l K~ D  m ) r 6 i  p % 8 H E C : 3 fa>%r^%W<pY0l ?Bex %jPu0ZRK^N3k)g\n7?$~fRD(('%1CM*^-vSXz)W!/ EJFi\pm6^pXT0<@3APXYPTjYHK55c7iXO%.qE}MS4Z.j4e9^Bx*Q&~s%q$j?YJ^p^[[le(Rm 5&^K_ /V}-U>W}4R"!HH_grI^ATbz=nE,vLiI*]8!g[[*g oQ2gq;+^-  mhzeiQ e D \ " b  U q E D   i | % vB   Pf  Q4`$[&F[\.EZO#l#rr6 V  kw 0  ~" / K q \ R p    G ( i Gs% =Hc7zX=uP"2|7a? 9h.f< f!*@Tm Kb|/7COa{jO#t5yzSJL9|+>wggC2y !HqRv8<ZmL3(hK0$ -;P]x 9`)Q36n;G`'{Z!aH2tMjp~78c}(8 I\$^"o892I=83)oT;~l[& l]=( qtZVB8/'. $#3 @8LW Phj!5 [l|%)HWmz )2JUkx0?Xf{2Dx)D@[`kCs",=Vvj S*Y?Na(Kl Bm} /+>:LLS.O2TAR5C>K;>47*4%oC#mQFc`&ya!M `~N-UOlA9Y+.q}Kl }NI Z ? j J.x.K_,GQHQ ^/R^Yim9.\gB%[iWz=T,xcRG#(A*k>] Bz Ju.|1d`M`.OqqR5SXmt}s-vT%85aL}[e#k-t@~3  l  h c O # ( x " R i Z . \ <   /8Cf^vr4{4wSlbbiEn=WfXH1%J*   h? = e C  ~ 0 j ' 0 x ) z & }  n d SEG#x(cwA84l<.^Z, U!tXzH1(.6E8]['._f ']j>F|H~Yy _t_t e]   O 3 &  g 8 q , L  o A d v t t f M v ( V  (  G O   ; &  D [5f,N$qMl? V7^ C~O)k" gm dx E,w7k!|S'c>{[vFY=C+;  v~fm[`ZWEU4A)}SK:5+ao7K!Z&wI7s9|~L=3S| W,k*}FfE2 lK3y|n`a]\c[ir 8kMvU8j X pEH\S]q(fRaP4c u3tPpWtEr: e0"EI`} 4  T  q      7=~Cq@V3&$ft/=BnJ),3j%3dme.NLbj|OS##?Jix"0qt 5BSng ZE$jfI= 3  Y p  q L ( -  D nEE3k(M# aGB+Z!+*f< KNjN)XipZ.P[ l.A`'Ut?f -Y[2&j>ibG@g  (   y x c \ S ^ 8 D % .  1    | ^ F $  z o _ z G e 5 L 7 % %    a O (   k [ zG _B 1+     q E . _ U 1 ~ W,vZl26nb;<YY,Uy${)j$<@?T%_\A'zGgHmz|%tGhXKo(b * S|Jl;+ 2{ER[LpL R6xr GfT=g2]2@k>ZREM-zQ9E5aDVZlhl- ^8!XSr<*pO,n7|g rzi }A|,\fG1*If6__\( zS8T<-l>E1 o   YG     \ Z   > H }  * H S x $ O6 a }   & J r * / A Z e 5s R Y }                        m c M . ,       ta F 2 !"+CHU`wfc~F=/$   & A R ~        " I k l   %=0E0JP^kdxgz# sWB$m H -  v I { P  } D ]   @ ? ] F  o 7  i Q  . ) F Id{h3hJ\gX{; l6P1/6 uEXO:cnm{{w u j/rSr, T=q"eShQj8Z? |nGC|feON3L$.'0#-"%==T]o4C[5n[{@?mk%V~6V$HO f7q ! N@RO}r"P4mdG&yWQGI$fd6}IdMj]1%gT>) {!XQ00/E[&-\)  {%     8  Q ] l QIS:Bs)/m@95Jq/<g-i+Ud h*|AYsaq`ewJs7_ZH4l0ooM' /R w{!Bxa`  9  a "  *"  \# x 9  G1  OY  c   =N r(3z+|^!:}W5w>fCskY0J==p3>2/@5DWSaq|>e ,=<ea$Km23AK<E@)85+P^qh|Ot_aa0@!Bp.7bk<2?Z kw0-A>@_6y.wYU *S3Ol Fj ,.=CVXT]XUQC8/ mQ*wujpUq-[dhfL^'XVWiS8LMR=D? ;2(O$   [#R tc;V'6Vo,jO7,u M #F%7EPlS%|G;l3je]&@qD5 $H#%/C2MY<wF&GYOKT/?-.  E  N j  N N    T= ^ =  u  ? < g  T =   N 1{ 1 1 , ("2H B W P O @q 3X   ` =   ] R  _ <  = ;   VBP[mI@%P=Yo$| Q: jN` ak0XoB}M {M-wbFD|=j+[ C#+ %#5<2=BROzXwTYYYWG]5`+\W QWDQ<:)_ ;-j^SI2clHI|GQ r;KRx!@l9P B R[!Z:UZ{5K \~'`UB4m$F1*0>[yw"Zx 2O6pf/0yp+nYUD3@>HKr0eL @F'~)sk ?\QlE<Ex<B ZD |Em= M:|So@=dK@ ~), ,+ ?W C = = 3 4 & (  + G < L H D @ 5 )  q ^ R ? 3   g K $  wO?) {e`MNBE?8=EAV`Wh~$6COTf{DYy 5 #R ?z S k   - O  n % S s   J > e a  S  1 7 a S D  28 v4 ] m gt   R   5 |   @    , Q      e Q 2     w < p ?  r |9 ,  w| #!  C S W Xw ?  {   pA  e[S\  NcLf'x|/"we6B}.;C5TJ*no$&DMr&n; k\%d[=\,." k,Ej6 wy^wZA?$^(sX8[3 z]t4TEl?aP.u#a+ }jT=% ~4H\bm!r@Qm .'=g2+QL!LtKU% &j TMߨ8ln8ެܩ$Aޣۗݧ5,ٖVO܋ػ8{BۜgתpڶMږ(~gKB:֨D֯Q֣Z֢jַُ֦ٯָ: ڃ=\בFڠ=S{۶wm]&ۍEnNPfD H9cb~==yfR:r- _1i"Jx<[m**%! yliSS2oP!J,mI-yeaiiQjEvH B\Jsy 5  J i  x  5 M } " %JoSF rN9-#1P5!9pVDkec GM-  4 Q!! "0 ^"U " " A# v# #!#8!$E!B$^!m$y!$!$!$!$!$!$!$!$~!$m!$^!$O!$:!n$!N$ %$ # # #v D#@ # "n""o!6q!! wQ .L 8WJ mIr {Q jy )}7{6W@@X'fo| R  ' "  X h {  b * Z k Ka)l^ K`B56@CZZi*Hl@K;ydd?..W5wF$oeL>v#S ]}:l9.e>zPPy):pV#3i/7h~,`JDSnYCB4Ll.H}+~:Yg-{0c'>pgQ'4K!zxDe(Z Ou^4RpR-vDA+}@mkiWMT!Fm&Fwk<:]a4_8H+(wpH:xa1 SMu3SXey1Nx*;VzrEsN ~)@Uo4v Q>kHS!e9=5Qv&p#{m)  } n 2  e G  n  Z ' P  { PWA7$lU6cHuCi%\ &?Vd*7NPiqrxipWrAj%[M7(|Q+UCU #p}B,j@/jT n /( } ) 6 k  B P a  $ x \   )@^c6VH2/_GM Am1<al/ QQ/v@ \*m I,!}j7{hR?( %AYr7Ue85LR)OLhYqcl{wkE-nX@%z \yyEK|R@8<`k t1)?){_,m 6n \e[hhn BA]r>?TfcB|Fl.C) &0?V Z%r;Jdx$4]Gj5d 2b)\Bw;1)Wf&dR_M#U1fDD}Jz7^4rP*a^ V%z8yZ1KrT?}h L,8O;3G ev6w{f)T = I ] G  V S X pV[8d^Wp3\A:a$gYT4v v_u-mYB5j\raofkCY",ta6! @J 4rr w2eGTF` OGNl9/.Yz| p 7 s j u * q  Z  9 Yx")w x%GKqD~9pK$V|nSC/$uR*u^>9jHp^`J2&~xRQ;Fjk9H!ejw YC. , Nc4]kGy+g=t8 PGZ&lmA1yK[Kq.k+bw#*%)O1)9_O S[jSj)C*hA 9w(`?4f`7y $ {  = a @@  7$z$gg >Hk}Q*4DlGKD%fko+ | > ! f! !$!!W!$"!E"!y"!"!"!""" "".""4"#8""3""5""#""""""!"!N"!'"!"i!!\dE 6LmEM- X-D?I]g76 ig?,!Im eQ 5y~!e?h#aFbX5xF(g dvu#~F.o;pj\l(T   @  S  b '  ^M?Ls 78gaA(e<~H ; yj[8n8\ <qG`  " / 3 4 ' y Y@  f:o42h>,#t"Mm^; l)G`&5,P>o7$8 U P T > l K v  j  -  A s |D  GbG: (w)SwolUgc#m+yD~awF cB J k   8 n    / TI tN o k t y A \   ~ r e W N 7 *  &   t R   v[X%y`AbDyER.%=E_nhu)o6m0o/ROFj:S'&^* Q{r@b ",PG&qa0AX*pqu_| nP߆\83+%_!3UV$  Z  q S KV    I   W BJ  F Z    W| K   X !G   cs %1   {S &\j-d'Je w6SFAK,^N41l|LWy${#sUR<lG^EW kqDADBHi(S w=V;Zo9o#m   J M   a C u - ?  S  Y  O  n 3 } =   Ix .  ju/@TG*y\@*ZC96~Y2jd]W^TWX`ioyjQ`EI@:? 1M9L/o)&;9(&)+*=,G$b)vw uYG2tfF])pbBpQ[X&3DR Ix?+&@ Bi?W:LB3J0G[$}|(C/-1:Hg!^rC?s'sP.i'5vZaZ'>1h AW9{oF;^K= uTE& |v9Z(CVwc1\N)}g&r#nUY:7LM`q(82\m{'5[ p:=km LC#]N}F;ge  8  J  d Y b / [ g ] [ # rB4stJV*]TWy"!wMz"m5]b4uCHg:j>aBr ,OMub.Tp7Q_ ,<HVZkmtz~xuisMl6l ZZ<5M*tQE\o . }4`3n&_]-C2b7i%rvp _ n - f S N @  r(  + r QK0l&l}L;``* ]_%)xhM3F.~@M@JueV;V687@8InU-6vmg5Iz^oG6$ &nflxs"4FRs"/S{8Vj:\u-8m@x_-"X+o>AUVdqq y#x#{'y5x;|@bEoA^>N1M,D</e[E,trfolks0PtI)Y{I%m,tW2VW+F DMY0&`nBdP`BcHv,QI^M4}N WPY2q` cm"dy4_KJXAR2WtE J"mQ7e?Jy&e=f9Mh.5APT^^dfm2o8x@hHyLrP|\~ok}s8Bi~.@Vmy&Fe?[L{2@Zm$?DdsAHrv I _e    ) `M {   # Y  E n 9 d   , \ + a [ n l ' 9 \ g  ~ v  b E  =  + "  * / 9 5 9 J K P w M o a P T < l / o  m  x v  w { n { j s v t  %{ 0 1 ? W ] ] i v s ~      # , : > K W V c in ap Vt > 2r w t _ g U H ` = 2 *   s 3 _ l @ 4 h D & f^*x)8 E9WULgX]OU7H*#`1ocp[6\ tdQh>*'/T-Rvi =eBv1w!i4V"`*wYhVLE25')*:?sIs[^|\YMWVR _+XNrry~/n6]Fs ?CiV.pFV RKZV7}%U IO"p:E%mdE6r[ EI @ =a-a$R4{DPXnyKpjmrkpnsg1STa]SwC@?/2/ !,)#@']%0;I_cz6Qs5c!eVQ0rG gnd?t y\DIo ( N  ( o  N. [ {}c\?zzNKfc6\j(l2MV!gLeVVkP3/weQJ1{<~D=w *Jr(dmtw/ZnzZ Y58T* k   x  4 ~ g 7  ~ B  uk  Xu 0c+Sf@n7va{JW69-.'  -:CMb|7Za $#%,1)=LXRYLD>8n ^.kr<(nI"~] rD x9\qvvjlK\ ;w!4{Yd$q\9OX x$NV$HrrqF~.@{n8W_&p2dE'W) 1Vm/L~5*iSbZ~e`XTaMji6kRWD_Kd V~/iU{9fLcV[J6%cLw ck Z4i0[ MOC\Is.:l6Y   *  3 ( . > O A L \ ^ e Y e o } | z    / D  r  4 @ X s = e  " A @ c j  E 5 w d 2 [ T   [ !T9X1|QD0nZ I$}A_q )2Ps]F0pY:o'Cp{B2|i@.ga-|91 H B D D E N I P / i  *@8@C chFRc@c3) rM0yzto :CR`j|)15=?GN:y;t<a0S'3 ze`0y)[)d`Pv#'sXU+#7\Z"\Fwr-XUwYV@3;2[SkW< Pw.rJDA+%=y6i:dANPTuOKUZcn>zpK t$EQxCj @4gOm&Q '=GFl]y_y  &17]URw#/"8,&:8H-TAYZX~`ux>_P=yFp}"d+NUx `3uB:]1,xD^d g-fO9&f_;0mgBF 8C!q4 x  o V V _ H  ( @ g [ =  \Mt]!0P}fy)KilS4bL[sB@  } ?X '  h  Q j% " | * A q  h j  l  T  ]  qW= emE0ru(K7}YzTG! 9Z ,T+yY!AP? I   "V u  ! jh   c. l  n 8 n c  g N q 0 {   : XG bi w     y { ` >    ^ b4  I 2 # > J c ^ &6!yVE'}OEYS`[g m2-HL"#Vu_jWnk&Ik,w';i2\hL6!sid `f#iw0@Wd8nQq; Ly@~7nZ)8o,/sr"x0iUB*th4*kKfK{ +F^wZfGH7sBMJ{2\_o/5G[ewsC'a m\'o= {RR93#&:9N_>j0.dw5X?NjrCG+"*6J q)>4hM2h`u$.0qeJ7  { R 5 = ) q I D q  % ) ` @ a  2 S ` t } i N C  ! t e H 1 %  j F %  _ J  r I %  z I  [ 8 l ;  ` 9 v  @ " Q}/U$wQ*?\?]E%uqSCo5V'ND D571-724,IJU^lk|^<v` ?"qf+Te : Y (  m A  r &  Z e  e  D Y Q    e    H t        W 6    o y) _  V  P G / S  LT  _E  b n WMr :uFq+[wnm(mAbw^ d#8mlC niU5OGGg -0{0l Qv>gO8#poy '67cF hAj2} F ]12{#@qNC}#j6y]@?j*^{#Hq2^q3Jp,KtAd@D_oMJyg l]:d))x:tbhM;K Wc =7_OfS p  [(#   B  y = S  & K L ( P Ru   @  =AI}ag ?`u   ! %,GAXlxo_>, "@LkiI45Sny_8" /BS{X`pJn6'yyotcjKb3Q*7 #      t Wn BS &2 #     Y ! j Q /  e :   X yJ R  w H X  ' [ ) ] % d # u & >  P S YMF6q{(GF^A{3zzO`9o %~t8-@ AoA|mo5[ i`L:^<;O9wIx)u+U$ vL#Mr/.TlfLO:')Y:9d-$!/fMVgNC1eu`6dOs_]WA2 uE$z"W/\" #xKx@;h8(DtRMUr[ Avv!Jo bO' v\\jKv[gXrkM8g19r@k"}M'GZm5HtYSYn%IY5T    { [ < #    5a9 HLY9Q(`c\7  RZNU5 YCtyu{sY6xN)CdSd35no>~|0{oD6j 2 j Z  E 0 g  /Vi ueg5"v p^6cp&){@# d{4O3  5IZ7hEq@ GQnG\,x;jt Q<j.z27WU)+55O3d+p'& }nYp2X#lK; PEwk*$tA]M#ZBK`mpq&6uub!} h)"c.Bmt7`>~ x2f&n@+#K^x'Fd 7 ]puqPwzA/Pf6Oxe-3dJ t$M!~"w2YX)4oh.X/^6^-S6ZRz)Nj$P  :Bvdz .i%G hJ}[Co8w5aOz5V<x$ >Odl#>"`5xNcvu->EPVXZef{bspZfQcA\'[4cCNC=<31.  }(+3DKa }7]c 0 Q ) v V ~  I 7 ~ `  D ( n T  M % O < j  C g : d 3[ ;\} 101*J6H4C7I5<7(+(  uoOO)&  m 9Q  G |  E } 2 6 X  V  b  k  a  gfNM18kr(DVl~4.Lbmm(;BVpmB4lj#3Xstco?5})_{$J6v=jZBf+8& 2M`y'.lG`9y(c:7ovaXr!Axn82_wt\B' pKb= v8Ru #KN jrqz'Q2$8`<:]f G b'`x.CnIliY`Xgx6"eO~C2\0<6eIYt\"k##]Sq;{X(X1 vgFoS J:l S 3  d`E>Fj0X[FRgrq~\d/!o\=s {bG"meLbgt[.qDUOW*Np)4m u J ) _ + n Zl$!nDU% d 9#^3P_ r[)'xW092:IT"rHu/3jn Z\F=4)%tZ;! Sg%C: [    ` | (  F @ { c n Y Q $ L 4   3@ bo zmAc8:];h+w\k^f`_v >Z Eq1rNq ZS U}Ji@meliw -?fj4#l/KKU rjFVXYpZ^RQWIS.Y Bf9MxbP.V4^8EI/["Rq0Sf~r]9}`Ef5| P-j? M.c*a:E o1 ~\Ru1Q"|mY@,& '(D5\3Oo{ <` 6Q9n"^ `V0z fPP&u\^_.lc>xs)q/ _ & y  " cN n  >   C  } $ 3 ? # C F > z N B 5 . 1   B [ d q w x q _ } " x w g \ { ? A %     f * T  V   > F  l d um'!k}-L5y /4\,fu(r- 5D5KS Zuz09`qhJ/<` ` qhE%!wOs0kD8 W^ <,k8Q_bQyJ Z8^f8rc>h<*$lQL;n!oAK+p'e~D+:W*/vh2?37nOB/@9D |s  ? @ t Q % U Q  ' s  + % ? O M e c i u .n Ib ^W tG z3     ~ zp _9 J #  _ } V  Y E y * c  6 Q  5 : )^+92a)x@<\eQ3hn-f c)cD)c.zX3@Dy-Af-S/uH{d\-~ #[_N\=|k9_/r$I5?NSa"x<tT}jwsizcbL7~#qUB-zMrAq :[p=:L:])vL_ lIPJ.Nt|2ftn/|DjC#p4\1p{xs~zhbe`jn8R|=KlhUMd`3JxSekV.UYB*Ba$DO#vrX7+;o$%th9zNn@m   ycU<2$9^jYdw$4e%zt J*o 2%6;W-ZCcOoi~r !4>yuhSGSUL3:_H{0oKbS+@!,?"\WQ)D*qV+vOJ qg15yAY h  f + 4 AyB0}OM-2LU 'Wi =b3AQFWH/d9]] ?`}%5,L9p"C j V 3  w ^ ) 0IL [eH:OMu NLG8 t1tbW@CtUoV]fR\jz -g(g I obW'g\3zx-<p7%3Mra-:HM}_tqupdbQ.9&)&i/J5^Rq2Js%HV{x*-6%>0NP(Y &I n  ^'CA\W n-MtG7LY3h2{mY:+uS}6l%W3*.Jf BIv;{?W|J>>|alCa _| 67Y]82y)rkXo=^ ~TF0oRnlu~Ok2NI k  9  n >  @ ' c A y d s v t ] @ # h  Y +  | ]  p B k  . plA+nmEAZ&a4VK|'m Y@""3 3\w !8+Nbb!` 2IjA  ; sM   :W k  O 0 B  d 1 v0   5 ga   ' "u F r {/[4h+>s[XsAm2W  M    G m j Jx 6)   q ! x C a : Yc . g (  s Qb *   '   |A Y @ #@ 9>u]yC.1ph ]&Y;h=}!|_<>lz ^4;ajr  }~b^;A i>\'j1W p9X2YDbMjEq]2%l[}*c!Y\"&~pbb a+i`zD"L;nTYQ^v gGc%az78>d f(M7}EnWVY`pTSWowVHAn2@yEy{2p  p | s b  S ' ^ V i  ' f&X7aQsJvuvVR-[(h,r"Hh{nh9BYK9~N9O d#`:{"7 G U Z b V O [ 'L:. \:$t\N.}uudfu J1Z]FOqJ|&/AdVwN Q5~rVKoLZ!Wwl1ljq[%H-96i7 ,?P]m=?#zH%y-i/c=`U)`?C Ol,3Af/ l%11>JGdOq[ v"5JL)Q5;e%PnKr-A$ -9R0Yogb3: 656h-]rA]'x`Qy/ x`  9  ]'_V$@$^udC2kGPDa#0DHEE?|1Z8\b0v'NrWA~m#?}M<p4{f\b>y/snT<O/ u f ` ? B $x g T S 8 ,       ~ ^ P 5  z g a F H  %  W  e y / 2 + M  s  | 1 >kB4!\?/?`V`V?c`-'UW02cAWmA-~i>?g>o,YLB  #;Nt(Np8Qy s*b!T25=6296)}%e;m> ]M0 ?lsL#[x'Hh0V8owUJ.pF|wc`Z]5cT^\`qtvl[\LKMP+YHk{Ik/SD7{j\W}V5{PyFq"q~ -Jx/G?ch#6RI{\ x%  .  5 u c G * 8+c$p6aX{",g<by0C`=[] C W  " 0 ? i  f +  P  Mz  j?&e`:8t*y&t&9C}C}U-q[7?b'U#D*>,D?FVS_ay.a?sifO"XoXIrH'41n+ {  ?  K  A }  B r  4 N [ e w ] d e U W D   t 4 p $ 0 E ]ys,R6<C/ZkPD&bAz+pA% gLA3#2n UJF?/Y&~9!j} 2l!h=|M3(Qq&CyL I2Ib2$g&fIZK=S4 {L8,?(Uhkv>ud[i8bCamRN"`.N{#<]bmllfmV\OE9N g; <od& Ju<Fr96vs*uuCznGBx< qczPT:38/%88FPbz3aG{nNIzE;!oj%|MF9#|:\77(AD R `z4< = Q L p c   o - + K  ]9hMtvLlDR/8edg$f7xG e!Cfj!z?[wgqv_z4{ n_IhJ,@oA,ml" p#Orf~>f f / A C  ` S  0q,c)W wXxWgOtYb:s#`b!VFj/|kRH( ycl%VV.(lQH,$kzpo[nOe=U)B6 8`P9tW=^:z)Bz}SU4 EuX=<6Q |@"^$@(%.t~z ziY [ 8 I  ?  *6   L  8[  *  I W  iAf d9v'0'3N>nE;57  :+40kW.Xl@H s@Z(  t w> 4   Y M(  @ U p *  K  w 1 X 0 J     aQ ?'  \P/p] UC<4%) (")&.=BMLXkso&1KS_cl_6+yiV|5W1x^JB-|OQ&`H5\e1QX9l0]jk3pUb,A|0s"6Z_X,sYxcZ|Oq-rr{YF<qz-[62N`=c *~[U4#iU#Z1i[ފ(>߁ݐN ߙn܏/j,ޱޛݐ݁݃݊ݤ< _9ܙބ޵ V^ݢ߱M޻#ߜ.l, R{9Ndk8&uA{XoU:qm87cV  t  + : 2 a { d!C3&UI<0"n`g<_|Ps .Il z|[a>V)5uQc+- qt@C +l2vJ1[(Wxa`wJDJ)>>-)65z?^AMLLU*r$~$)!4@*CQPzav +Xr 7QMqlA[@J[rw {`lIL:fg$Ek#[(EN@ b  % N ]   ; 6 V I  _\ eLa@U(2td>F,zRa(M jH-l} $3:[i9E'OC T$T hzkffV[/a(a +7$OT[oy =_?b ;r7dV0$DGxW)8KQbk|dkWC?rD \~\g{)4BKJ/lF =)io3E`x+Cy 'x%MZ]/v X:z@[U~ND-:h ^d[MG\jz_HH;GoFp8fs=)Vm8 r)x:FGWv(  9 9 s I & X:~1W O[x<Jiw2-z32n!D_00jZ}Jt8FZ-eHv$:NRp_scdq=qCn$fh`YV7iY' tBt"J%M`!Q}i,&:r~TF{4DkK}N W-7EK O  NL f  &  R ' w P   ('N;PSwP n4V}p"@NlDTCbh!P9k 'NuoL;p4N!^?k$[>)pAl.FY^-' s8V$ctS4(.n.ecHAdW b@nT5RSCy0M hEU V^I_5p~*>{(j&8iV4w1Q-|>rOp57& ~aJ/, ?Q!h'߈L߭Jx-iߙfk(Y2oyBh7k&>co0j)+l-A{RP^[1<IZ%l-L[A8>rH+v6  i  L P   ` d H - l  ' k3 a y     : I d* `F lK qa k        .Ry%?*[du+t&]x )Kj<SMD D_X?)&I .BT  qb!!JY""% 8# # $S!u$!$"(%M"{%"%"&#R&V#&~#&#&#'#%'$O'!$T' $j'-$^' $^'$^'$&'#'#'#&y#&R#m&#,&"%"%="J%!$!$:!+$ #~ D# "C".!B!-  1z 1Skv'&h}bGf.x&j  ?  I 7 e l p Li</kGRw?f3\,c"a5y!h?x g`-Ys`cQ06`Bjb8v6Q\,*Y0\[XbC=x8YINFuO;y e:?`l7;iq=:^zRyXsRTi&XYD(o;V_`]RE)uZ9hk)-J9X~PM1|%7lQu"oI  C 4 r # C \  X " D  n w : " M : `n"Z5f*Vt07rLl-`GTdOd,gf_J7Ik`=bX%w|9-J=kN@ lxOLE$5.=lRr}[&aE Jt4ZJZ&ޫޔߚ{k`S^+FG 33.;PMoy݌ި#B_ 6[އ"F/Yߒ,oY1%uv \eEM6O0U'S{(FmBjJ^X=V#WLq1H# *  ^ r 0 3 I { D T  _ D # y  w.=>NBVB{b ;^ru7a(#Uul4x6LcCjuEBnQR :[  1!&!x!G""Z#U##H#T$$$ $k 8% % %5!%!@&!&!&B"&s"&"3'"N' #s'5#'h#'#'#'#'#'#' $'$' $~'!$c' $F'$ '#&#&#c&~#&U#%&#%"5%"$G"]$!#!t#9!" b"O !E!R 5<z:+KtG-%c2I+*  ]/byFR$+jaMw-s*g%b(py-F]}G?v24f.fCt!{.L'o[GQNHa'Nq;zWY &ra@\ SyrNn?cG"yC*Vy)n;)^qGCn'm20\k 0(6FLRS\[PQYqFVD+5 0 @p2lD,o,SgEkrL~"p3{ N/Of.p/c1z D]Bn+`6  (=P1sQo0 piZ`&7tE9y1s(I[[$zM0&fM7 `B  t E |Ra?e>>[V\2',Xm,^!k )HaccZG1k0 |4a _vSzx+o&>QK0Sy^$vauWbE }v ; l  P  N | ] O Z * I  0 $ - ,  9 G P d  v + E S # L  t V   I Q j g.]:{H)Op"TywhE!YX(  ' c d  L  n  ] > n  7b   9EyS#Qm \,e/JVMdA\^.oadx(e G+l*{H%G m"Br5gm!b*J {^7: mpXG3+ snL`"z>F|cDns^F_zA Fxpz3RwL)W,KTd| '1)' |w^\R_<=2|8mvN($TUh3")j3:X4#=k-SRd!},X)YgDL1 POrviQLG`=G>/?7 .07&5B6PHLbTds #0Vv 8 F;h\w;GEWn~^NDiH`._ :7v[(@S0vl3(hM6VifE R  T /   ] 9 ~  R  = r 5 ~     4 8 l F O j h n m 6 i ; ] R O f Q s ; { $ { ~ j [ a 5 M  8 0  a  Q R % e  NU7Oed&!|FOs VJaa\Oc~_<`k~0R<`]E;-Hdm1w? V.N,yU?F96o@E> Gwex!$RDk1 D#w\]Cw5 c/  F & W 4 : 5 . % a a   Tr/Qt|  (  |P^+Qa Ds  s  Q * u , +    `wNP{8[ ' vsnYc?V4^6dDiX4?0R FZ2d A}~|zy}'Fr N~Y(BwpB^6AG,_+tqXo8<p=|1)_U'A\jvhFz;jYDW*Nql:3hD mz2#F 9QXo_3q.}DM mI Mz^kIl)t s @v)?`Lo@C#?pL9ix4sJ%R\C%=jr5> [ .  g u + 4 n S  Ie  bkm`j@=n g sH}Lx8T1ZOqar{sm]M4~^O7>aSS;z F 0R_p. y H  R   :p e0G-Y\icI 7d#*ezSvKu]{=Cg8?d,5JX 1c5sh]L9<@FR:aTr;b"8ce)LqWA8 Fc{C2kC;|a1\+M'hS !'-?GIL]OoKoQSU?A8! vV&}v;pN:/u6D_1x$1Z{ a9x)yMc6g'FL Pb; X%Z4jkWh6X RYWX`x}q``[Z_YOTrfqw.V"2Jzu<L}SF/m( {&~'0UUtc4E.zVB6vcK> ,pO  (  z  s p 4 R 4 c & }  E6c:!o ^ O1| E~"R*ERp<VgutaP1vdX0wLix5W#v1s5s /d`2 _c96   U e4 .  i f M B 3  _ G /  c d W D D 7 : " - %     &   ,  ' # (  ) %       c F t - V  0   ] x = J    g o* <kt+FBA<|&,X]'.T:rE05J1f m(cQ?a%zv'fOKrOJ'STh -Dd'Thtg8';b8R+uhL>8*/:-Y5;Yf$\17n`Sh&qp*~c3S9 |i)epBmo.[ ` 8(8hwCu >a!/,~,[3J#9 saUD2-qP`!RBkC% peI3j!P0nrfchwU}a\jx~,Mu+Y.|l%nF-.' b8#gHqQ-}Wj2N Vf/Jkz Abie@`>vG+h u NP -  N  } aH & T g 8 q &  T ^$   Z n ?  Z  h >l ( u.h2}(,c:YBvC%[Y=!rOSX%XQ s6[GI?):{|v!_~!8o*=Bv?TVR3PqghDpio.&}T.XL @a ^z/ Xf19ppEF)4}wyfrty FWyr.!sD<9m `'xIEW kqSEW OVY+o wY?0DRpb>\CX;!y>E^P[FF;q+z 41qRawFr!Oe!?}Nzbw}\cTDMGDKGI^[gz%29@Z]m xGjU~5L+vuJKjbH,h;   L) u   G S ) 3 n r   a < _  : u  92P\#xUv> m26Qch  &0sK\ nX5n 9e&2<RUdapz{^2}JnfW{A02! 3rwED,i u4- +I m 5   !o f ^  A 5  )]  u  | h }UwCg@M(1 #,_-1:%B pspXP_m.')V9W}Hk mZN)> .!$*;Rl6}0T3"F~y7.s^;8TpG9t9!EeM7O+nN%$^\(>&Q4lRUCiU`W@Q*G C2 7t`*c.J51;-I"x>c|7Xc3! FkfH0%H O+S.<:OQVg-8 jcZXV_o)H{ @bSf*vFfO hlp7.e<= fnS:6aDmM F\hrd_?c0xT*L r&q"cORDlc=\;q  6 2 l I U   M-hDa|]B+l]luCD5">j,YZYJf}mfXEVIUT`jqwwwty.Ot #N l+av&Kc 5:\r{7Rs  iT3}hJx*N& p>W(8Wx5] }Hy<zc_)5_F#n]H2"Cn"a Y1>=ax*%5l3:;2:2|IsAZ6-2uB=vU4yi5,rW("QgX/'Zn(W!f)cr2'u0 P ? 7 i      H  e +X%'/(*I&b%hi[}Cb"(;Z9I -Iar9 ` q me^5@ eUM/z[=KMGh3fgW"y)|h G M   o L  Q S6Y='^|-dvc\!SQZk@}*?W_X} k(}8D{KbG.#w ^Z@@>*63:DNZx&=Q] ( L -  F}   3e  .E}&AH@ WVNuZRtKLU/KM`{  #?EzjO\J(e*RRR  *g   v } 1 y R    @*\% ?K!U$CIe"? qED`T.&vAh/UzpM1Sy%Hrq&zw&XartR)d0C=B ' l ` 8  r i ' NR(2Qa /\Y#m>^KL&{{:K/Y+8<1OEo yA+b^9*}f]NNK:E(F'KT u5Faz 4kK>yH SBQD P M ) 8 3 + Q w$TW5vc(fJ;h3aw  }o!!OU"" #a##% $ I$ {$ !$G!$s!%!:%!:%"K%"Z%;"]%V"V%k"D%r"C%u"'%s" %m"$m"$Q"$G"d$*"+$"#!#!W#! #!"O!\"! " ! A! N s  6H Op0vbvF.~F8bv7>|1C;m?z@u@ lN/"L(Z,T u4'z/.+93_F956:$ HU  k? C    ~J 8 {  Z 9 kZ  lA  o\  y  w  \ }2u adJn/Lt_H, ,qTD};fR"#OmvL.OUiW+wF+H6HC&Zs!?T߅#{|&1ݏtA6}߬EߒsTܭ@܂3T"8# ))3ܯTܜS܏sܐݔyݵ܄܇݉+ݤYݥݟGކ$AhhߚެP"ߩbQߢVL$ct{i)!kB+dVx,lx<=%PJdLgM sCEr(d.dQuClH!x*OnW$j!DR yGGK>>a-ti Z*p]Hdc=G%q9mm!Wf"{=0Mk?$ v   g  % t  ~ E   ! B j lPVSe<oJJQm|1ET'`x67K w !N"8 " #a!J$!$x"%"&#& $?'$'%D(%(%P)[&)&1*5'*'+'c+?(+(,(^,,),o),)-)Y-*s-M*-]*-*-*-*-*-*-*-*-*~-*Q-*+-t*,W*,+*V,),)+)I+C)*(*(*O()')'(*''&`'/&&%&,%m%$$($$~#H#""C"!!! 4 8 cz&\u3GKg]q  {  q z zuknjpcgOwDw61y, 13VKby4l$ WVwe^N\sfI[[tBK}dqsk &PCe4X*=qJ{ :*^N~a.HTUorrtea`T4a+<c`)8qHa(J{/amVB9}]a8Jk& wi4},ߥwPW'f2޴ݳݸݮ|dlyt2fM- }j@.~aE }W7t; yP\':[F{gHm4l<V![/ z R q  !    rv ;PeQvcUQ?> P!eX:t,g U2(r kSVGbV2k2qo| pjKq1GE$FooBN0~A߾ߦl߶H߰(߹%߯޻޾ ?KW5ߋLߘs߽4E_i}a@bqJCu/ '$k!w*gr $[~(W)b:9;8b4Q4V'DrTbbKu2q9 L[$(gS6sc<1 avO@+*vh Fy)m-AM jL<MV0=\\J.   w^  J   z:  Q F  MR  " # g I  =q|A,_f/$|@lBd8yQk)x)'w_-5*<`PNfrHz9g1 4\'pPSal{-Nhwuq$]2LZ=z)+T2:B^]cfgl,qsk[LK8"e}?U^ n5j[T[6k2_Af|! @ ; | A ^ ; N - ( ` xAYwAU0,qvTQ:C$ j|j\SK??+5/#-;Mh </Eacn vD5zg!Q|J4VvC|3izD[0~T.sU8unMI}7b1:.(#0'.(L;3:9JSmYWu8~wP+9E\km}I226nPcuC|N $Kq !)B\Ep'eW+  | K  b 2  ] tKc7[7e` L?ltD?we I8^-x,c`/^e+ jDO2GVQW SN-A-u{J[2MrsK)m7>$wxPQ$`Gm<+\;I9HJnQ!1t<bi"Z Ym7;ru=@0}V4     V " F 5  ? } X f r= $;YQ$ONUBZ/ NY0 m\.bf)4CA@UOiTwTq:m6esZC&k+lnF3NYMy#G<+4m(^pIr KcZv6j 5 Q o 5 `  u > z  K    e z W = t t  c h Q q n ` o d | t q k v u _ m J s 5 [ 9 L  H < *     ` ?f 6    l@ 5 i?Ua Z+/3'm!n8[D8P U[jWUeAv>Uk/S4}}'X 8dIx!q;fT>4v T()")/>Qb|wsfhmr*uUxUi+#pqqg\WS_WW[Tl`x}2E)G^fpx1U 8n3C/cp Apa2UweO^3zcriNY/}A   ] R  4 y > z , a  5  O A h Y q m r J 6 [ E 3   4 ~ < . yt~7-gphPeni@qsl5r\z )'XF >cTnu7=}Sh5> ! Ca 3O3s;` e9u6TiGB*= ;}x7T+7w eR4zn3_v9 p D q  : U   / E j w | y  z   } w Pn VL 8+     E } M3nuLR~q-FEt=b qf,*Fd,WaK;W_2 zQ_Hr&Z0 sy\pKJ7B,1, $7,MT_f~}wxxuuyw~7x>wN}h{m~~xy}}{z{z~zzwwriv}p|rvqwfrvhmWfBn>mfsrfqqrfnrokk]r9~%rfqzssv|`xS3w]T2/#3LSn/HPu =gB)@Mzl0o#9GqhiS<_1 c#  e zeSTN  ( >  E A  ` V  . ' o R h   - ` j y      zk UF 8(  x @ D n  M  o   4L  } F 2ERQtXI`lu&?oJ!XIc]G* ],}dQ2y`/ kfI}Gh?e+WJ<( sW,"~wz]_T&9 p( {Sl:&P{PE=vV~,kUJC33z1f2_(mK TV._kH2k-w Q  F * ? U l w  A ]  m ( . 1 4 4 6 % .   { V G & n I  x 5 ^ $ ? kV>FI2^2n*A3mLm1 J#[1; K9Wpr=68lI;o)ILw'4orFi,VJ:,516>V^xAT4@Vz}: C!t$bkpS~@,ovnTyJ-]Nzx(Tk ia}9H )Wh5Rt6w'b&w/S%zo4`v>tZv/4o'piC?}+d'N#2(?B\k9YyD=_{VU#xvPJAR}-Js_'eLr8"D=h^ABjt)1cv>r)Z*zQ%x=&wR8pM4zdVA/zY I *#}lV>,xiI!\<|vaVO3L=-(Y,dK)koaXnJUE?D)<;:D?J!y()zf$L*}w"(]i Z ?4.U]+=ud)l={b$Ly ) b  K y  3 g < r      = * c D R ] a u {  v $ ; z P P m j o ` m f V k K p D m  Z  M ? 0   X 7  h y 3 L   zr0.{W?a=(\>eY%X;vI6mAjH%iJ6fa:* frQ^3E3!I(\7aRp!/Rbwr;j1\w 9~%G%fM.$gFw(Uq*D`8g]~~fBkP?)GZ#R< Omh#84iV3}7sMu(@ u}LdM@$ kfVQXRQ_i 4Mf'zdnAuDna8P]{L 1HFbqNy","<9OaL[[nchhha]O KI20& pQPC. }qw\[TLBB1+ /!!(/B@>@@CD>81.|#[XT-%}\~Lf>+ rS _IqDvc-TY,U$[b,6|iK79&e[XAD%+,=Z g7IeG\AuGr2qOF$f5|I3s5k_BsF.!xZ9BZ] !>0HTiOvgsx~{z|nbxQk>p@n\'m fhYUl[d]`jmqr||'2.JHdRs~#R9oNf4[?Kb/|Pr>R%z",1.1--)$t^7tW;X-rLw? ^lA i0^+w=j;?b+= WPhf.= ],g@![0mIg(I So#K& oCU+ImZm5tRH({? s_A+7|^b12 [V)4n:XAo,EvEh\S@f&& c:~``4*, !?Bg8zD^$Px-aPVCE; iD=_: v^&T04D!RjtnUn, S < k   P ' s U  W 6  F*k )8@Q7L2QCR<?:6+)h[-!   sQ F Z B   p g   ^ s  L t ' 7 }1x"3c\h"bOzfS20yjRH6/+-.(89H^Y7{Wm/N4Edr-F`u4EAMLY]\GL@i:N7b`!4t2W.QM ov*i zVcLGF9S*6pBbQRd"\Ib HJVr@QMwxRG(Xh#7 f0 T'p7hFF ;h@*xG=0 (CfD?fj7sD}0lC.3yNK|1rW+g"B|/cEn%Ot2+kK*h::Ib(L7V>x`fnxmvqxmibEV0F;g:{\_D!W.g`A+H~E g8#Im>x-PEFK -gPL4#!#7 \-'!b4  1 W ,  @ !  l Z  !;lJI Y j*=[M,q.42B+Z/*3 qW~-Z9 _|,7 sl$@ 8tA(v"vCQC|By#   i [ + [  ` n  8 k  q < V r A C   T u  =  fBsGw:t Jn5v'U(Ec}*R]|BEmTHXY_hb|,i1f9-QXq+E Rq:]&Sb'E*e`6 "3:JYh~  k6ia6$X(~A`zP9"c'GR=CUmO@W%|pxbYNN/;02.  &%&/JJXq+:J[s)H}7ELy~^0[V#+]MC!UkzY2]1\>g6$Vez   % 5C Yd      6 % ^ X  P  a  L  U  ` G h  K z a)N<j .Wm2Hjya=n"V rAu.En " a  : n  5 c { % C T q  4 NW$)U[)/jaRJG<AE[R}T0~tQE cp9G, }]pN_B[:D/9!2 !   go\GG)-qredLT=:"/ q`uC`#@ #svFE,'p@M,k(zVl,OcvE)kw;uu6%e1z:6OD|I>P`!}8Us3g]+gBkR?@)7t.~9KPb-U?}@C}_(zu9Ho"_MN kH#nN9:wwXt,B006$Gu?R.7urTBN  e = p Y W Y > Y Vu)5|`"[_ ;'gs* \}3I8TCKE4+}ZJ-rNz/LusAMF qCNzO;- E i @ a # ^ =  b 1 z f C z # b  O 1 $   { v p o n b \  \  j + c 1 j G j U l e t w x y |  2 9 Y `   + 1 D  P  i j  v   k h ] F p A h , W  E 5 ( b D # n X /  i U 4   { c ?x R )  {`tCCh[26! [1bH$P!Rx0]1${C \R6S}29B]0l6s&8rwoNdHC{`)_!DFlz !bbD&Gd?FP0w=3_u FqAp:} Fn~F`*:yijb^=X7C0-1  +.AJVn{,Bdt+=e(:!TIbr+k PqQ?"tjIb,["At Bv*dT|`ovolI|$xFY-y^ Bd8)hRn. B  9 A V u P  M G < u 1v q|`4GOjNu XBt/a8X}4LgtrR?{Sm)mLH!\ .L i:R&|fP,^\[k4u<m![ Fz 0  \ F n  W  m  X  W  i  S  a 9 {~ _;;U"y*uXmki{)}MK ~QT4^-vk^ZKCGWV$f5Rj+#ZU+bT{g%E4n'SG AAj/c -BB.QabsmafTA<|}[LJAPN3!@$aUiS8(se^,BS moC0aU@6vp~6>il pm-r2< )zQ5 6w'Rn ? E^Q? f#u[N)se:K le=5u @MIL!!Z;4 ju"57o:Nqa"jNoo(w!%u;)K%uV h\_wEn f i L 2 p , u . j  8  ? t - b ' D h > a |    0?#I-I+F3P/?.8(7'      ` sL G/ 5  { R w > V  :  x C   W  [ } ' W # m l S E 2    [  _6W#pRW0% w1vJ)I\L- KwU%F `/{kO*au%:m'd*8G{>X#qZnAQ0k^E3.  'Ok$DR+]d^.J;"A16@UUja i5~mFZ+G[}G`nz # L. `( r# %   zff7S4;zJQ0aUA I O x/txiZWT2Wo YZiM( S`=}-Eu+G^0 |X<(z"i I< 96`n!j>luf]XL>1S)` .F`{s^V5 v\> s}XvEh%` X_W_fou|a;4# !Gx)c 'cKfC'A\K jqeG"Gn,L+ kphJY,LcL!8@E+C7a=T_;Qi@: Z> up    # K j                 { o _ O =      z  p g i c fo Rh XO WJ [D O9 U, U, T U S N X JMMR]RGPOLXLMGXRGWOQLX~YtV`r_cLk?|:v/&" / D U    + O XD io    @ & | R } F }  N M  L 0 f  e R  9 9{  Ve;{q D!K@j-5Yi6}Pi~h^tLy)YF m/MNr(=>cA X ( B  e  m f  cF2s1`B1`>dOJr~42j[@ P;8 [ A n      %" Q& o9 F ; V #V Ub g s | v Py    & g  I % ^ & S  3 B a n p v o W O t > q ! \  3  O 7 >    g  w ? 6   A _'@i7.:t8@ NW5G \x>oY UFW[Wn x0`R0re(OsqQHM  e 0 $ h ) ; <  T n ]*  ` DQCI!~$e:5/h[h;Odl~urS\:J*PPk _ 0 +O  BI  9:   }p 8 ?~   Ej  G4f!_5xG##u^QPO]'$~Ed@1,8#;o][N0_$zRT [e5 m)tmR.t;V$@H 61*-GQ'o5|JPd'Q 6 ZO O.j#x = ok>ly!_GBqAGOmeF"6]9nmMJK>.- ~1d:r/dUF5A{#SbkE#unH'7P/^Yfguod `R">/,#3#Rbl*DL3|_9mA$D)6Gt$f"{Vy!'z>>z9|\qYKR%QI\h~7j&-R3=,kp TXYlj= W~;-. % =  d+  z x   K "  .  "'3K]kfb/k Q @:HEH>#f"I q"c0 G `aeW Tp#22s&H   " i r  H C - 2 n k   @f zNFE|>>s5 }5&co)__O.:]|4tuZf H\KbCKMNa2yTJ!r)rXU{9W"( jS 76+-APVp 1Ifq gJu+UBn9Mp.n;y+i+H Xcj/.;NXi&{(e(}KH7 zsZJQN\iu!-UpWa'xj#nO%9r*e3t/Q5nS;-hKG+ ~a 6   X ( L} ?fI9Q'G!ul38x?`bS;gLp3q  `G sB|;cS# J `  B I B 9 Y  :  O e xoU>,  yNRpFf@mEdJh\d\rqV'D_Uy ]  ) I 0 y f  g  B j P  H ! P  T   QG q  A  ? 9t    wFwP<0mk?ioH5|Y)M,a>\xuQX6n,Z."\usp I3  & S  W * S O  % f/+,-4`!h ^D# )9CIUabKBp@EXmOߐ0܄Cs)ڔ by1tݧׅܧ#<۸gpڼ}ڍ=:ӢٿyٲRٛ>ٟ"ٞ%٢ٿ)/PAٗiv"ժe%*yd֦Q(B`۳د7IGڡmPۣݜ+M޽_"qߔ=QjEYA /OrfN8T2@<2(;(4{H[NGW"h0?T8ddL`>+Z&]D-:s,Sgh!+m]! *g * m  ^ P 3 4  2 < k z)[f~3q"$Ptm4q]jWHxD2z]K Y7<Q`dl*lq# v] p k ` K!PK!)d!!!!!!""d9"HF"0M"Y"u"j"r"t"[d"Cm"Y"\"J"("%"s"<!! !!x!S!U*!&   r ? a 8FKx&|:J *al0:ebH OO =rtZA=d  e " 6 8  0 : R ; ,,f%P80&%&'2%AEQmtB.ZQ =u8 ?cF6k3wf>]U+A<0;!  &1CWW|xhTIxW9"z qJ4~kM<#y ef;;neZJCfsBq0VR@ 4 u!L!z"4 " ^# #U!$!a$!$""$O"%y"G%"f%"%"%"%"j%"b%">%T"%/"$!$!p$!$$6!# p# #4 "<"q!9! * (>Ya:YPeB=%P nt@z ~ q 9 | i - N Y K @  i a* (qo)EqHz]H3o8j?}EtmZ9d.+s+n3i "xEFj>1nOy(n61eB]U p+s1 [ {AlF}}hULB6# *5B^s#$:3'JNZdXs`ehlndmb^-L=<6(Vb[]nrf^aTgVD>B.}u = Ti   ' i( Q s 5 w   ?  x 5 M o 4 | r % V    $ A D X P _ h / ]  > h ~' # ' : < C J V J [ R E F = jA P" &  u B \ 9 L  y ' ^ * H T `   nV ', `t8u<@AgBuE$WB#zY<7  ~z $;=I]t 4Uj~$5FRe<oEbptmH|7f'>,^x9E_RsUUv0&3 (z}doQ\c@]}3p~"~^%J9]Lm:9 ]<wqupix^LJFDZ%]Jw0n*UR \fQlcM6>~=j=`3IK>M:T!OXPaAI  s\&q+x _;rJr5doTpDQ UQ2#),m/bT0yUz7.Ffe@/4S,-5V/KH |ZT"*zbC4' D!c-)@Pos m,?t s/i}i&ql1rY!9B(b:N h &#" z&cD t l ^ 8 /  J o  N w * * o q  A ; }  -+Y['L4u7Zgcp/:wWlmuc]M6%}b<  | gm Y: 5    l I V )   o bA "   a n N , ^   7 w Z A P    r    ? kM>R-|*]%sj^:I?/T&mAvbE.^4[7z\|0Q`va9EQyM+j^$,m?1D\=:x(w%iqkPVJdLR*\^y7Dv!)sCj__5yN!5RwJ"xA/c_09cU{+t_Y>F'#[h*i(#FzhAp*Lar1{CdXau[vOcAM ; ! W\@c ln#at2IU4 } kBo *Tn^OdV=R_t{(f #bHoWN[`>kCRRGh&0X_dR x#Pz%f]2  V  W c % ! | E  T\&FEZ$V}  pPB* wW&_FV     M    J    J  f ;  1 U z a b E =6 5  $ D% - 6 5 \I i  W   <  M .m ~   `!Iy*t1\W8l4L_uz8b~yom,NE9g)h~t1s$<4 .+7[!&J |#+pI ep@Fx C !  ].  + K 3 w    n ~ 6 J i] m3ud21|^;oDx  5Y (#@6~AEWcYy U5T-0h yni݁xݥާTOܱyݑA_2 ۿ ۶ۦ-۴NjܠB#vܾ7^ި'(ߤޛ1ߙe. el-WV=X &xf<ffWCz2_+ Km =-@ )CC:,pJZy=\luoeK/X;A<wcdW%d*OdJ#xIHSa_IPmxklT EyBZ|{0h`M8lT/66"<:pW;'g;cAo] o&3~1>3b$]r BG L M u y  #  2 pCU@$-&f $~yR3#0V'z a:{nIxD-`0y2ZGj"A d.@et&#$$%#y\O1X~)^ Gj'hBS$_o1<s.g=i.a+W DVv]/P_ `WmyGmWgNlJR t 0 6 g  E 2 ] Y l u _  T:2;vD=4^*u\_EVn:,C\45%pqFZ SP xg; 7ycpVWfc&\G01>ߐIqlq9 0i]V J^>1,,`7R`bNL.K-{Mn&D|RX]Un8bXA\!p>3r}14sd=o Ai-d @J|rB5_ /Z , D+XJog '+*56I8MCRRfMhNoLqQy>oN|G{1~D.++}}&@[~Fo(Sr_98x|.LG1!   I   {   l  l P s w   \ FNc\>|g%nn%enZ\3Fjs !!/'""D(##T '$ $K!%!s%0"%";&"&L#&#*'$k';$'$'$($((5%Q(a%e(%v(%m(%i(%c(%K(%.(%(%'%'%d'`%')%&$R&$&t$%*$%#$t#$ #r#"",":"!!$!  Gay].]{sO   bh \ . 9   a.r=q;$yf?&G GIj ioYb{_>eL/m=]6,wP;3&6$E.b0xDSo"bV[ ZF,:|5s&Bh^z &d6p0l0l0W(_|#G*eAJ@6-lG^&~/EVIiP&12Y @vi/g/Q i  u / I o   ()@CCZWcvo~3>b2f)YXc,X{m{MCC/R)t=jJ ߷\v"ލ\ߑ&qD:޽ ަޟޜޗޯ,ޮJjޓߺ+\5߁x߿ Bm6= dD&HaIFep8.*zQHns7F&q=W+b^`$ZD LP;1]"p|T]F|)tEgx1P|xv[DUZZ;h "pw'Kn jV(2|BkmZ8Mt>9~AFtV,}}>M[lS>/%zZM;"!8XpQ%0nbh=aKu=KaDyZ ;C|k,c5<JPMM; 1" {Ds1Mz,>(u]u- ~nYCkv o~ G  | t M D y .=k TL~EJ} YRA.9-WHxdaPP;HMlhx!J\-G->_ai2QvLU()QdVkH:>+rVD  )5>FP i4qJiR(NXK$t2+Q94YfPS bg?K%-j@4d5Zo,A_4?jm*xhmb)dQ_'\ti6kWf mtZ,k5j\4{C,b m 3 ?   ; N r I  % ^ * x q " Q % , 8 4 G / ": 7+ : F F & &  r L   u ? X  f ) G  @ b ' 5  1y   @> qC @ ?#,N.f<CBU{F -dU3V }'\z.2bJByy=d,;\|En:yM@sIMpF $  M { F  y % y > Q pu2s.j :'E 6<<w.7?t"Vgy^Pf,1Z@5-GGP0I[*YH-;D`P\ _ m 3 q ? vd xw jmifcc^aj1tDr\{:dRw%n Rx"7k0qA@k +s?(U}[AB4t="6:ZIh>l h-tkqF1eF4"v(fK)~ umKa 8i rh2S&zKB~&:A_l 2DS`vxxwk~yjsaRZ=A4sCfbU1$g%aM7gydJ-ryoV -]{XT$WhV= j_yn2Ai;:po` gk] aw/K>C2.|m@v&{GV( g9`      s?vH vYbO-BE?//6 _vA@yeDilS "a baXpS5:PZ`7s2q +eV oR'fg4% x|XbMn-\r !"U };|Fym R v6d? {R@5A0RV%(m~^zTqMzI{R e/r9zKU VY[nIR($V D  q ;  l G r ' Z  ;  K  G , [ , S 5 M = E 4 9 ' o k : D p u    ml   08 =LGE*7ucO#h)y%j1AW|vl8ezfn?c+k1'|V-ci*pIO9NZo:dm>ff3e,i6`-H6Pb;UwK%f/yiFO*x1`, V  c A  o   ) . 0 C ,o9U%2^h*?GX_WN/ Q*aS#Re-)T  _ d l  i 9 [ d J  < 0 #Tkz`17Ro7_4j-GQ 'uhkx'a ]/u$mUHr-tR/d=`@ {r_P=9.)##05M8XUhvL)s9n`0kWJB );inJu Z l#$m},M;%xK`ULK7V1D1!l*:#F pz   Z A k 3    J # 4 = 1 C [ V N Y H  O , F I % j ( }  \ + g ~ : x  a ? , ^ )   ck 2   E b $ t.i,Z Y/4f%V[sa4gKEj8n*g%zJoF~lTFAsJ}(t K=-s[H6 0}=|Tlgtyyjxyu8Wi ?Vpx1*9IS]g_tushsmgLy>n.P8 rPM*#v6Ai8LJc %~R3Eh-e7wY:~&Q+a~QN;'=.R/W<Q?oM v Y w f e v i{mjgUPE1)nt$1}&=<d#d.8y^"KVZ_E"j(e E74 {P#m*;5aH_b`a[F|-  p a Y Y D:m8GrE!$BvQ+](.B B*@( [IUg8+Z/ 0`8 |C}c*o?4t|RM2MSR CN|CJ'xl8'dQ{ 7?    cY   E Z  ?  @ 6 }   * t \ e  ?B n  S @FEnTfptx2jOo_huYS:'lU|FM"   e Q&    fH ( B 1 K \  C s  y  t K cOGd4 uR9vf/>l~ 7Lz%&j| jm*!vD;rlO1vOM/%3U %?gJx7H]r VP|~BIns$+NZ:$W;pJUekpqz|~oi`QY5#jT>bW0dFpD"S %KZE _%{od'E j,ia2>hidE f)e5FnRL&erTM.% ruZcCWEF1&+.$&2;MTjv;"cAgxL{K?id;Hh@A6ho8M ?wS^E?GJ=GaDnp}51lBN_Vp  P  p '  5  ? B p W  c0  be [/ZVT49rAE$fc"VV7e{DrE Di/VAx5u~S6|bRBz  & S 3 | ^ x  &? _e"{3EVk{1Qw(Y1t=JvTs'4!)d= i-6wAygjh~?@fs[bww\IV;_G{lLC=>Di&\i2@Vh-HM `^'d <I?  o    ~ o , ]  #fWG#r;SgoxqnXHuE )p~JD  ^? P V : ? h  0 8 z  _ Z.:^#Gz;ICx@A knIL& yoWUZPBNW`jv+^k/?\Jyly"Iu/:I&`Ba^j~uyzdYK(rij,&ZGz:0G;s. _5 F7:[6_5!LI=bAhN*\No~@XS p*6iyMj*UI.2&.HNBfla fc-SvNHd}!es?#$M([IL.s"m0=u4=<C ` ? S N C =   k C  h ]9\y2:^S_ULo<`+ mcL p $ % d e   . 3 < E D D 0:]B*qU)wy1J/uJ: d7o#rx +WM c*NX)lE.G W7p:=~ E~K7r8P&tfQFS]hvI Jn'RGq  S`  F &  E  V&  CC(6FZ'vj2er}2`1S|QJd.~KZ4 4tT4^s( g  3 o {  l Y  _^  t M u  d 7 X  4  v$Lh _Ji6l"S[C0u8=/rG>loJ7j-8f] 0SqcF ] plbGD1^%<@Np\@pcFEwB  OPb75B}jL$ZJj(m'R={20gu(2tp91deW \ ETb4nv!;cWO$S?s~2SVw<9hO ULjC~%E-zKNXcb>TgUmWzG$sZAf< ^c!&NTNp{ p(Fohl\u)6s)ZvU]o9X V{)qZOGN_HfCp T:'\F 1}~v c@Nm7v  s b h 7 +  F * s # d  > IA `z q   y o E 6  .  v 0  W ? V ( y  3 W  LbPr7/Tj{00zn13SW+aN4&z+{.v?]o7PoK>RzvZ 8+0 Z (  2 b L N & `Y[ a#Z+DsN(}NX~ >k54FHJ=!t I }DZNTfuZu$%t. v  O I - ZqK{$Cc5;E\ grHlu#V+)OXn^0dD5[F&x^'ye"Dxyx{hyS?FK)YclS)4ca$[`A94~[?(vV*gCs[yOF) j4zI"D}(3SUa=( 1f  4 o * w  / H O C 4 & x S  W  A f  =Zv}uGJ<4TVi @znYiK*>}Ft#NA&FKkl44Cs[4 )c0RqN|<[*^dXLbAW_vr,)\\"~8|FKwS^%BzT"-D  l >  s ( +olF ,t6-60~DSBEn 9x ?Rfr7/907v{dN=! U=Uk8;}_M#]w@Oi*;[%AX?.OvV) o 9 g b V ' @    l D  s  a H K >  | O  w K \ " 0   iV $   EA VAF9KWM{7$"I*3^0x&)|<Gh)3sMo{mI!@GZ?aa'2Z~5Z5;Jd~=c'2)385(=K4s+1+. 1De6Giomre`]H*VESc]{Ybxy4L m#RtX%F_.wv+=Mc+qfx-|rdPnjK@#~ T 1`P+$IWm8{sy" n ^ b  =7  |   O C \ f j  TrW0+<KXiso:s|yt_&TNCi#wQ   {R W C  h , x ? y ? o ;  J Q   dj B  f g c D p   v 4   `    ^ 4  t<_X; . l   ' [   2 { / @ co   h H ~   2, o  Y <   ( F  4 x  <@cS tx)<^gtO r >)sy^:Y%ek} *~QxjkP/ =SY+7P,Np48T8*~^Z   1  ? @ D R Pe Qv 7l>mYI0n:yPTY'ei9?{;cOw7S*1!!*;YcޛGH T'biXGo/ZQvXsz0[<GV$ZN o O D C 0 0 s Y B%W5Q.W k60mJ1  : 6! !w!$"!"t"#"i#[###$,$t$$$$%R%Q%%%%%'&%W& &&?&&O&&z&'&5'&['&q'&'&'&'&'&'&'x&'\&'R&'1&t' &`'%P'%+'% 'f%&:%& %&$&$Z&c$6&-$%#%#%s#k%+#3%"$"$M"o$!5$!#c!#!_# #[ "r""N!}!! h R< ~Fj@m!.J7]T}p{ =)O7rCY'}Ek#  ?>  ln   J O )  t  W  [ =  Rv 4 MRyAn@u,,~;(,n'N"[b%!]=|Xnw~nMc!L9IwZMb(R[7VPw-2{CL dU39X~޴݌aܶi_F۹ٳ0dذ*)ק؋)ոY:/^֤ӏ՚2Ԑ}&&ԭ9ЈEkҬ΂bO ~H͘͞oѯ`ёRyH^>H?KIH?FYGuY̏т̜њ̽ <`mҘͺ+:Ӑ}Q)ԫrԦ3ўՎu֥7rlpزՃe״ZۍGٗIݬۭzjR$2ߧn<tM;0Ks 8?Bei/ W+Ao + K  r ; tb )8HPZoTPbD?*  !b!""g#"%$#$$%$<&H%&%i'X&'&l(.'('L)')M()([*(*)*>)*p)+z)B+)J+)Z+)V+)?+)-+d)+9)*)*(*(<*W()()'D)W'(&(&(&'%'%%&$&$%#$#U$s"#!#B!" ! =!p 2IGH wYIk10uiRm{DAe@lzN4;#( v&Z!9<9G)j"&",0JO`s V.G={~5^OT}6fLr!4d5Cg5Pg|sR, kc,zL M<BHTI1\PV^J b  I H ,  O 7  % 5h  LQ-]-Vr 1_ $=P7o]"[6WEw8=r-A[>g IZ.qgMjhޡ!m>ߔoC*ݼݥ ݪݭܵݻ+I3[N|݁ߪݶ&+g]ި3 }L#r \u5&?Z fZ{`(vO&t;S*{"d`&*gF}"T ?c  #1::C8{7c*I'@&$ wd[OJFQSTa)vHn63wR dWhL&r_e7zn \_l";vG#[0zSj%PI9%vL#  u R x ]5|8yAUf\T&{C5sB@HpM6`dz2$q"cP8 }HO_> HCDAw&Z`6Np z >=}VY6C:S[i&~ E b : q 2 w D ( h g 6 A 3  % ( / $ 1 E P * b I s y  4  { 6 Y < } O|~,a9Af`] vK+;jq(?]x G y0HNcidb`Q> i<n7<:CrLz+=jWKU g-   Km x  v & Y  N"J5zIdw;b*Sp +8F+SVlX1e<)wP'fR 9a!"?jvߎ<-ޛKi ܌vb-3ߖx۰V۔Fۛ/ۑ ۅ%ۀۈ<ۉ@ۚZ۬߀۰ߢ6wFfܘOݷ?:nާ\ -Fr6>i((fw=:w! \W*3yDdXPWCM736WQ$jy-?vZ&a_9+%rfyH5A& tM)  ~z}|{\C'bDTxR2 ~  E c  , x Q  R  9 J p  k % | + u . ; u 2 r * ^ J  G     w ^ Q . !  H N  /  p . \&5i9^wmK8gD{qiL?1+-+''4AL\j~/Sx:O 5k+#jW-IlyA D } "  e = 6  Q  K h C ; | ,K[U -Pt3rJw & = mjF#( )! i<   x m3 O *   ` & y ;  n 3  e ) k F  \  ~ d 4 f    dN A %   D  d H $k ;    r }C W :  } ;  {xJM8%Xy],DbOFC~Bb]^Kk'D7oTzMvo6iz[>?lvL $~4D.,CtojDNp-O )] }@z4{  0eR/Vj%ߌ/wV5;ީcݶݐ|cB 2F/e#ޮ4:%Voh޷ߋv @a9UCkz Vt7NfT!8W0rM 1oa41j'87IW^MZa^cS I9X#    ` + X  : ] y  - f   P   2 o      v Q  ~ L  M    N?  w i s"  _x ? $  BE   OS  _P}]1V%Y<d"Jb`04](ur^NHxMqPwUSiw8w AXdcJ;*s Zx;)<v\ U S 3 ]  W y J d 1 BU/ Vf-q:S0`zM b1UkjvE$kba%O*o(ZI_`  c r & r l  S P  P !  @Y  { h $  ~P "   ] 2  ] O)m]FQ~SN#Q PrB7^zgv:3#cwcIi0.]t/]2kHxQ/Py,BzcA0Vk@[b-Gk%qg ?|::F1l9Tg'TDqn'9KYf| 91NTgv ()?ZnEN: Q u ^ G   % ? i P = O o n q { ?| u o i ug D^ O D -  r 5     r K > c \ P T H O W[ fA u {wZ-Da*L~7ykojm& hh o s t5 m   B u   RR e   R 7 i  H3 ~{   $l b ' x  .A f h?Xb?Z:w@F_q3!B^Cz%eO6>BTWWo3eDPPWDLDD7/)!%nNL-(:W)>h\Wp1e2\F7  lH   3;  [ 9 w  $  j  - J /   5sKn[2j]ZLZFZn0tZ$8:~[/h d ; o!s=FVc:\YNJ&-o=wAp0i|/mP T:e=&&vJXJmodR%A0#.h7 = C  I [ r o R  D Q5u{0\~0nWX#dSY=7-)!CRs Dk44Bk_j'Gw?$H V  a   Cl i  V   9C d{   +p1Og {)9eoxv{dT?$taZJ"!  W   w| L$ " v   `W .   AOt|E'<#a^t22DIvn9n2TR 6z10`+B:j&-gw-BNW%%}caF*Uz.` B,tV;&uYQA$xsmd[Dq>h7G;8') kV5(nR;6}yifbJNFC1'&.4TZs~)($<-WM][kj 4F # 0NKRa8S y8)sXWUAB{~Dq2\  F y . I  d =}"Bfp$!mY ImtjI0++IiWf GE X}VK8F-.CHd@ujh+^ODzQX4;-%4} /BC-I3SF(~. ^i0?~+ c0j Z t % V {       c 9 ~7m*> G`YD+}m5&X5/7f{N1iSm#%y;'el!i+[t/;a B~()' 9 e%޴WW jw(Jܾܗ܄pkdnl܈,ݶR'5^ޞd&r@1Lg NZLrg$sBQ:`J<"BtW=\`s-hw=QX)QRn47p jE%x" 4i   ( 2 n M  * S x 6 j  * 4 A [ P g ^ { {  ) 5 F S _ m z      , 7 @ ? L U W s }     %  $ +  , ,&7,,6BMF^LnZWanh.CVk 2=W e<Is$9%V3j\}16?Nadv8F`s  }RJq"O' _}EB zU-o|#< q !R  k c  N J }   9 E ^  mq z',4A@bw"0-lL? K*>BYa0\2Z5fNNs;iBX9VDU]Ra]~pw 8_7+Sd|"b! KZ fNz-ufq dk@O$:vf ZK-K"F"1o Q / y    F  3 D  O ' Pg $z_:%"w jf{$5Xy%9H{|_' i  e ? 7   p z  k j  V S S_N;V@BnNG JauU&7dLz~ $+BACu3eB ' }OP)RU%Y~949f}Z cX  Tl  ; (  f 0 ( E  E,  ;$1vQxF]([\Z> DJL7sN@t< IG8Y.?= ~J| j*>In#Rw2ߪ^)ޭc%ݬ]8ܶ}Sެ|Fڳ݌I&ٌ܄38؈ۧFi!شzڹ/ڑg׿9׊$Y0ֹخ֞؝֍ؚvؕ\؝[ؐOس<ةFNL] n#׊Jכ[׬ؔHQzًر:YڃٓZfۯگOVܥۧIUݩܷ c{,Mߓޣ i߈'aN~;T.0.2@@j/F'UR'2`~ Z p,B[d#&gH60[7 dT4(k> {\ >  ytVe<Y >.V%wzWD0e>ce !9!P"] " v#K!#!}$C"$"u%#%z#C&#&$$&$M'$'$'?%(s%P(%y(%(%( &(0&(I&(U&(Y&(m&(_&(Z&(]&(2&j(=&C(& (%'%'%U'%'S%&%]&$&$%y$b%1$%#$#;$a###R#""~"o"""!!o! ! !  Y  !Zw   3 Tv}"4.PFqo 1;]h)Qm U SiCVE  _m J  2 s l = & " s 5 w b f > 0 E  %  { N A     s R )    {   _ J 4s    x  ~ u v t u} ^v du Wo Ht Dp 1k 8p $m Y V M L ; 8 +         y d E x! mP>2m: NoEj}g+#c QPB7#p%| rT0 u?\+T,Fbp~jUF ߡޢݘ ݈܇*ۅ=ڄcٚs؛Ӛ׳ҿ @$yjκҟ=+̄h/ʟ΃ko^zn˩ [ơNʸɇų\r7A İŸ!ŧXųȁȳD8ɟpƧjOZȣapˋd7v͕ `ͦGϵϜt`S2ӬpX/ ,J\w;Tl9?f4Dx P\Dyd3/-J<VHnSrTUQLJ2 .  m a >)f5_Q-ckYbC!S[Mo=x0oq+ 2a k    ! +!& >!9 I!7 S!E _!F b!F \!6 V!) D!& K! 6!$!#!!   \ 3 t V < /  s])z^K=,y~slx 'J j )0E Z>\i 5 ^   7 !] 4!u l! ! ! ! '"!R"+!"li$cY$e9YR 8mfu3 ޴QZsݢ Bߔ&܊޲ AۻjGِ{,ۄb۴ס09\gمզ"EVԅטEh ֕IbճѺj}24ЮӄiQ42ϩψrKBCBQ^2Ђ[Лҕ+>rш+;ԜҪ՗ӥ,+ּԶdcؼָ؃|MO!# 2Bax$.z13 xt |3 Z5=Tt}P' " ; U<i*ch[/[D8 b !h!)#~"R${#i%r$&g%'E&q('h)'J*(!+f)+*,*e-S+-+._,2/,/7-.0-0-19.U1.1.1.2/22/k2+/k22/q2A/v2/j2/[2/>2.2.1.1Q.i1.'1-0-0=- 0,/,P/),.+m.b+-*v-*, *h,)+()M+(*D(*')3'(&Q(:&'% '%m&$% $%#r$ ##",#!x"!! &!f z WR:BBE1 d$($] 1 !~.n1wEVuB o   SO v  T  G p - *  y  Z + g   np[wF&( FZ{@~pVeE3#3UrZu&wZ$vfbK-4sU 4s+)@2nG kk3 !m]s*4 VObQ.6)vE3% ?eqW+6mZntX%&R ~~gO- X$V=wEs=L zBOr,RU.|6߯gjd&C9ߟ/v 4 ߖq6 *ߦ8ߌQjiWM)@4Eo8CcN5^_R3[w %Z  D > /  r ( W , ? ; I%d".;eQuWPa!F>QuB8j7AUY/0 v~MX4D2 ZKx(gV=#y`,pLw:K""]S.sFte03Xqpn) ;Rq O[VW"k)s@}}cai^kyf_rru 'QFp/i.zO VDkU@#%r~jL ~KF!W>VichImlo}|0\0B:/a fqT'| \J~M@kzlR|'z_3 _5wU&\ &mhQ4,KwS?~bFp;F ''  $3Mp\-X}9|G[K>)'v+*rp.,c;_\;y" +^   D S | G " > W } ' c ! O 3 \ M + 8B hW r }  ^    > u4Zx'UTGn]'V-s<NvBq S['EZ0Au}bc? 3ZHjv,ht ^=v8QwI84&yu;'.ky4Jz " X  7  [ I y    &9FRXk% Hx@]z7o5Ru+ CX4]6Ya!O`)PRO7vF6"3 W7pV|6_S&Yk9W|#-rwE&2[ZQ4Lkp]=LJ(hgNcU@/t`7wfd3m7w![GM\^ k.pNkUqfaaVoPm6^*[B+jH|!@R\+r1ABJ 5?{t:b;` _C1 X!kV7$dXJD=KRX!l5Kr3|Z\_f@ZiJ!Hp~|H 7~-t?ZF 'A/c  1i  *\  ' @   h k 8  K /   + YE zj    #))x<Z=2$# e ' m 8 G  5 8 s  E . B ? | Z& gTy%U1Bmz^VqF.rt;QeV6=vEA}B`y(*WT9L?3 i@[WG#3EpHGT  U  y W J _ ' J @ Q #pF%| \QBt AvE^!(;8/}a=gw#5uL7'1@g W $ M > > F 9 8  r% 6ygA# wwDKjk1?zuhGN(Uw`g{t?34uK k} TGyW^B.-$ wzl&z=_f! M5l/e6b<`+{.fI+pnZ2;^0`YF-EmfB{o?xo [Iwi0I"oD9N._Bw:|JGDCF;w/n#`=6{rYJ5[}G@Qb,LP;w`)Iq"1Mmw4  m^gsZB%%7r(BU7yl'p8]0o'STn/v4y2~3u)h!XG)g;]*q._{ hOX*5m.S"' m e 1 9 i  2 p w[^/T,@*--93YM{zVbI] \'?h<_ 5osTQNO7.2#1'53@BK^s ';>RG]k}%Fz '%'7ATCxXajuthiPDx-Y5c~_1~>cwE-Wa/EnjL"Vc3QvpS'0pE&]QG.m"`?7 / ,*" 5 0C$Y*q9=Lj+\8Tax2~=`:|J$WtS3bXdX&^19CLC8dhYSSMKE9#,))< FPVV\^XKcG7A)5'dDaH/jI_0=${T!fO9Fl)gTFJ1j<]7 [E7Ky (=Eix@*yAji4A;?"qT&:nMw0yHLu~M?   s , ` 1 \ X.AbL~ `q(t ABvnVa.?Xl  GFgcvfaX-{M<4%}Z / 3 t j  J M s~3Es&]Z/+kvX4mZ?R-BEZN{2h @~InfHDa?UJO\GlFY[u=/L_=j pP/Yz![m*Ag|FH a[}+#L` g RcN/T*ulU 6R~"{GZRFU wwiH1 shk{a\:>;2) |j|Gv'f[[EDEo9@@$7-:49hDABCEHF}YLQ!]d^Xnl3bYgP]YKNAW4H] ySi Js6) nL.sk%"F^N%L]E7<7/8)c")s?Cg.wj`?[ ekzd<+6w6gZ*K]_x(I)Qc9w?KW"u+mTnsxy(SC!LRM"k:K &<H7B[?fchuiywt2lntwji@qztnk| z6xQt  ,3:cEKHdbu=x`z:q%]%g%=3JkoJT.@s X    3 Bn d     A . W \ z  >  M |      $ 9 J W j v h  H 9   g < { 6 r  f f P L J 2 ` # Q  6  .         v f Z A ~(   w t  d `Z h@ T RR95~M }4pMq4Jk4V~BA#8f_PFDyI>c{#EiAzZE9(#1;Ry8n(b0z+s jn'3FT( vXO$6Co.F   G V  7 i    D 6 P B K f U y < | *  t l I u - 2    DCDEr wqW_(y:%Wm,X  $"I)h08CXov1QtC$p`=bG]-3py0Ng?iߗ~w z+mVx1!X).U:F/*.Jn!97ps Lf IPQ9_3l1~$(f.=+v~|l0Kyj^r>kxoCd G ^ "  [ T 4 W 1 D p  @+ hW f    + . ? K K Z I E .     j eP ;+  T }  ? p 3 _ > L <  {  Fj_?K& .J4RG~SN9mN:{gpdfk  !?[w*X}<p*`5503d$dt2-]=  " J P a  w  T  b >  w 6 y  # \+J^wr!q)o7U-U!4   o ; e < X h  3 x R  e T  bz  W  :!3Q/"(}"g:_O[ur J)f< vS/gd<@rYjU_CR,RE$SYjy:3EB:`YaumFe )D;q)GNOT[:[SazUV\ZN4?(/4BPXbXkeOg)hcZfZNcLMK-& ~FnLc@o9${Fi3h<Q5p:|KX$&{bMG f8{5'[$nG/_U6+y_WNF;?9ASVl }@>]{ -f;z+r D0y:/Q t)~mFh/f%!b2\H=`#P\4y: |Ig! 5  n D eA \)mMu=xY% AD|&>{-Ia ; e )!_!!!!!!!w!xC!5!  @2 p\gZF8I2~o5^y*GMPMG ? 8     %q-]6@?Pe -p0qAr!._YOl+ DHy'|9lM$ ugfbh9vZ3@`$JY+17J+T)l-+(~<-X&jQ5vX!\0t"^K`)Jl{.;BGIXORNKuWUF6B#J D5:3j$D" p1|6mE_7q!ptMeuN-c}4a=bp|e&U:T7y*j^P>N7o$M[}IzK"N;4tq]$].VLo`y8 ~*LXe}%lI{JL0-.Xm9kfO',QBt F ?  "  \  Wv  -}h6:}HPt4Up:FUOgouhq|{sjYlD^WJD7.qU- _;z`aN;i4>#- HlEKl}5qJW^ K+H{@}*5Nnc C/KkEZp%,0-'}b;#|S&9{h0R=!+6A;T/L + H ]   q V  b0oJP kK(6Cwv >x#>k.T!HtM2 gLN5tm>d-$/OqISBNI_}}j rޟjܓ5b/ܱ۽ܱ۳۪ܿۿ-V"ݔ^ܐb[ްކނc^\`{ vL4|M7FT"Jz P G Cm#v$*ne8*C0D*)i;gV=e$4,<@/k Nb09`8()2mO+LV=d2h9LF3v9x>^(]k 3a41gM. wvO>?>vPr5;b|y^TF<>IAFy=M] _ P U  x 5qCy k9V8EG)_YR F!WG"" # #!$F"%"d',$'$(P%2)%)]&t*& +A'+',(,(,(H-8)-)-)S.*.K*.* /*B/*d/ +z/!+/9+/K+/f+/h+/q+/g+/`+u/^+\/I+:/6+/+.*.*`.*".y*-J*-*0-),)v,K),)+(8+i(*$(I*')t'Q) '(&<(>&'%%'d%&$%y$V%#$#$#z#|""!*"f!p! D  ]o0'l,5b%oPF.d`1Mo  70 t o  J 2   nZL]6y<32 nVq"_HR{Fi>Bq+c](Bhz6 i_Dtk8;^C@qr93zg6aP ow'aGAPzh!6TIADG+;j 6=.#+cߗC ޑ߇2ނބݙ( ܗ܀$*ܷ=ۑcjښو5Y#o׏}f,6٩c-ոդ؛՞բbՍD՗.՜*զ %(;!KCjiًդٶL\փښ,c~׶2]܈ػoمGcAGۿ8=ܿnM_1zl Jh!1D%<=mX)qBN*Y%qQR [37hJt5e"Dl+<Pk!  X 5 I /  | E  NUr` ]1[AEG)?7i$@G ZYMR )Pr< :`l-Q1Yz|hH$8F7FFU]SYe_mXobjikUg0so /Wt%@Gab6 .V c   D!@q!j!!'"#d"f"""6#hm### $3 ;$s S$ $ $ $)!%V!%g!/%!@%!Q%!`%!d%!f%!{%!S%!Z%!A%!)%! %!$u!$K!$!>$ $ #c c# #"eO" !c!3 a 3/<P5-My>]v| ] L  m[U7 g'sAa'Du3 i:b*o-YJ.*tcE 6- $%0MBVOނhݵݒܿX2ڛsٲ/"؇naIֿK@Hf~ԯ L |0ӡwKҙ<҉'bO&J7M=VVb||ҥҟS'ӠpӳDӗRդbhG?6׼֯2Iش׸3JUozښ 4ܹFgݐݳ.Vuߕ.0s(+y({o hL@3yi8!SIddWeFh$S2Otb4 TEX,s'JmhGm -FJW ^!k'wGvNwYzsvg %&0/DTUlj"M'zNi]-_bT@.1*KIhLy"f011|2E8H  Ik     F . T*  oeFJ Vaaa.WPS; +3 EvO[c ;Qj# U   $ 3!F+!KE!St!Ly!^!T!X!E!;!;!! !x!j!N!+!%!j D  t A  D[Mbp:+Hh$KQ8y f>@9x2Uu`[I7$f^D7y l  E @ ( # h  V ? B | %  #W  &>w,g:IfCHD}=Of7$@7wb/aG$YJ"eC[u#3e?4N^I&'^/N$]F}\t*L V 4\w'wbs;}+ (1+[;"kc +Xj,c*~Ck*+ݜߞogUd89  8(T>g߬݁ݰH'_ުa7ߙ jM= }|"=4iOE=|'8A>Rp'x x S 3o    X  sR98*x<d9'R\ B:qU&  P  x F ,  r H W  I B k T C f8& +|@eL.Fi9qIS(jPp.8GG(1&($ %T en. Zv.y )m;~TLbg X P 6 D  /p  V t  <W  ''  % s=JJ*d7m{"\q^W"_cC}h)K=zeF<4I'~F5DA|0m,o\V)/p0nbV&Yjo@U!|]Ew$X(pykq{luczk]^aY\`vy0qck Kq:b  9e)*(*,+9#Qp+o!)%(15CKMZ^lkz  .CMUw%DLq :W"Il:*o1sNR#Ioe[* hl&YJ<%J Thmh(cTR+[hd`?qZ,   ` t  U  8 ' q  2 pC6/Rq97zg+^CYz5>B=;9 xb[N,3\xW_"tE4P]$cq]&  [ d  / O Y  `  A n  h  )  @ J xn#*Ma 1'w; u#zFx?xw9I;#qY6#  8Kt)CXPr#c<Q>9@ul"9\_ J 9b `         ' # %  p ?  }QBE;u0 s[GuhmA@ wb%R?m%` 48NDZs1^(GKt@T,A\v4_?fvߦ2Rާuz^T^c&?U Dtw$t06F-z5Y:  -Ky1\(Uo} &*cwE\6) vSbA-Z &a9o ]E2"nT .,"-'FQqv*'fW~)m0f cCl6IU&uKk*S   B  m  G  E]W R\%TJ>1b{Dn|gGr.W9`-PbtuV{%U5t' 0  B  aV H s    Y  / -H\XA"CX;0Vn2-Iy!x0z6Si.q\U?-{r`eHM0F7)$x^O4&fM+tn\L3"j O/lpXU??3 xoQ58wW;k>vWKv?J%O#q`b6!Z%vYY7!e(r\v1EW> }zsbsnx|>mEtQ"\]9~9ji`y7#3(y!6|N'o]WY-"0Q#<W[(e X 3 < N 9  g}?e[@Nnu!06R9T2Aw+C} (Gz%Tq-1;76wGM%t(n1^5h |Ww&c6*FYG(^ L  N  4 k  6m ?m)j UD} -Tq38l<\oLja h?SUr1R3wc J9!861a;gT\-u2mTEC@o>lCt+^ 7 %b-xgd"T}!:q^J|e1;i\s 0MjglkT\9TFl*n>(tDQ-G))qpB@ Ur37K `g#8qxDZPDUZxX7g84l0i3'sfYP NV.aS}t68ooM-xAsj:B"pbj-. P/vT%8>`m +4#M(K%BlU)`D>to"9+P7nIjQsW{WhAT@4# {fD>KV f,l=d@X 0Yx%oy xU1Yn@z>#2SD:iu mg)GDi"0p"M- ( gE?J  L J U L X A  G # * q s % "Z2v Z7^{@q >$T5b2.23,, qNzFS3n^D+  l^ 0,   fw #<  v 'd  s s 6 H a 0 ~ l   J u~s6VM7ursV.#l&;62|BbaWlL}u5p6=RYo/I ww ,Im'MT92pYc3 n 7%7eQgx`Zk:{'ZK~*6oh7&^  Qr  s      {  P!_<Nm*0DDawqR6f5Yt(kn1%M&2  | | 8  % i;~3_DtGb&If"Xw,]1iX`6\EO he!TdS!h_89 %KGwL*mD]uiW`TPgLScRs%E* 63UA`'c1tMjN>q%Q80`&;$H##X=KE]}y5y,!&r$-FJ6[BEJ."<MdR:L n)E2@ oT   2 i + < V 6l Mn st s b X F 3     x R  kKN!``/TyE/sb2`@*[ Y~4 bWLe0ZzVh, iX>?DB `.p>iC4g ^!{afUp^"tOQ'?}VQ9 x 1 ) ^  z  Bd  Ed$3}*llMI,oVfiJtPZ#+m]% C4p/91"QfD4$-S^ }-{/^^9!i/8r hw UH  8  B  g ` 7w`x'Px1K0UAyIe+#_-&Dh|m<4%NV|r+;_^b"1r?#{;qR]&PXID~ y_!eC\ZDT7)32F"u ,"!"T)%*G6y9+: B@>gKZZp$eEy}t $Kao $6<\$X$p&$ 0 $ ;M^h4L~'*GHsPzV0&i] kPx-N&'V q)mWqvX@*Y.~%9uX`"O ?  h$  `  |   5  6  7 y)_*i7?hbn. b^xY 2Ke~jW8t\;&_jv4H-HQ<Lf(_U}<:S Qn  $ d G P  }  f [ E   F   Z  x i uf IW U U T V U W ` h t } {     ) U   " 5F pO h | ?   " w    z  +  L t M a q e n >  I     9 Zs kb U A     q X 3V    l F y  o  O w l ! k Y U p$2Q EZ|7;Ii!V2iL }CYl;jB-iL^B{<Ya607Nހ.Mݽ;Iݯ-ܧOzbܑ9N3ܳ|*P#;8Nnيٺ(Ba\ڜݒ> ێ\ުSܱi!܆aoRtqLJS +wW$oUy20 BhI_'b%+v,$pSTJv6&p  Vk}J2Y St6c*!#   &<|4R9 88$"7lzn H h tHD ~H>fn  "  A  uk   P"  W Y)td  O 1  A4  A F J kI$@X:HLV[x`9gvh8 +Vl? (pW&q*SO+ sDZ6(^[K:8W4S/@+#%2>4KG`nn{rpOI4# c>cKv*JdkB7y~-6Ew IH@^yt"k D$|%s4 RdqiJK@[h!>*h5-/g6M}:v2a\dS2xQ%j jXN_xV &u;HLXTHd3y,-Gq\ Vy;Kh/ Ero8Hqu`c?1&vTmBaKeds[4Gr.J  0 Z  '  b H P 2 9  ~  g=   t1asJ+ 7;5jHOF;53,$4-* ]<'LO^ :<   \i W + w 0 N r H v 4 1  u E  q b T V ; Q  O  H K I E c c t    ! - L  w ' O ~ ) b  E  O K / k $ o N  q RsF':40GXgMD sM+aP|*Ffh3ClH\WnXk[NH9=$XwM3B!D]f5H[+[f]Ar !  h N 1 k M %0Vk)!bZ N}L ;j[67cm5Atz]>tYpnqA8/%}%m:z_'=b@Re+9wHiG$ngG;0* ",2ISa'R}1D/fIT/Go]N\2 e!S#~>H!^`x5|={2Yi-  h U 0 $ e7nD k+uBbv:$vAW1f!{<sFd8  } !A!a!!!!!2"!w"""J""J"#c"=#k"\#q"s#k"#J"#P"#$"#!#!b#!U#p!+#&!" " "? c" "{!z!!6 A CZ#\kT6(=M%YpR;}(z7{ S C  . w ]  \  E _  M gv1]dJVdEyWaq }D;?uOf. d3 3>]~(Pv+]#q:hi"8 :NACKLiG~JC0'  p%K6:2<>nA:< 2-"h)q<pH?Xl:h5Ds`"/T)h EmL'% `BawX7b@R~a[^>1 L D!zoWQN}=q;_=`+_6c9k2|;IFSf t2W@!Hso7qy@3s+gihr_'lR#(OfrO,-`eQ@)Vmkq4dTP4[dK d  C s& ]   & N h  & . 6       {W g D + W  vP&W\/*@_g= 0cDdH!x5Jq.7A\)b"Zd@L%z|3mLifr\om"tc"hM DPf`% z.XFuS9PbM)E_d X 1O hA~^ "<Ch7ET~?S}.a (E1nOYh 6t  F 3 V w , e  H $ Z [ x y   / % > ? [ ^ _ ] n h y r w | { m ^  Q n 4 q ! ` E 1  g 9 n E 2  8 B  {d<Wa,d(M+~@7PobC;zFxS7~dQ%"|iVA1$ %$22PgUtM0ReV/yf+jVsY RVS)Qy9Zy cFu>FYjy"am)1LXioro^oPs@O5C(gLuHh4c2eD_\Ma =kN a/b(sdzw 1Jfu 5F~8sF\703g6f&<^Ux@?3f2 $[qv`!0@5 C%l vjQt` r >  y  j  V Y Q + } [  8 S Is W| ` n u  t d c H Im 'S B !  k ?  Z * d 0 Q  f C Q  n X  }6a@iMOXT{G-C`ha0<hAW$) ~i[PNITQ`s*IAx(c2s0z c$qf0"RE_X2@g  2 b P &  X J B Y H?kI  =FP&U.QBK0<<((NuO  `  U m  m  h  Z  ^ ; ) k  X  NQevL1](h*\\Ci"3G@Xd$dY%2U&XAvX(pYw9R1>}uv]RPY?J"?- ! rbT8)vaf^Pv?b3X7K-=.{~ztslbIODD6@08{veobqOpK[8a'_VISJKXMV[agqn||1?I\wz&@Pbqx#6"J<]Vrcu#>/]V|.CUn@\o->yu r_%OF \ ||K|zzO,4\eG,$T  o > 7 h h 2 , `  ~Y   t _ZFGTU:r `=c 02Q^VZSAv>K7% _#l=P cj'S^!#?7b( s   K  u   3 Q y irTfW$K6AG5@:MN[M^]ghs 7Q+yE d9rZF9)|A(JExo5$~eM.!}}c~]eOeDxTtFe^-XHy>%*rx*_Gl.[zBW1YVSRr`kfQ~?}#ymoA_8_{g4 </o<fE{/E'c.p-.!u]MO))~7@kQt(qu pm" mT_A~N,~A&.7H`dm<de^|EG+(2 "-=Yp25d:u .2cs(icYb?H4;+u?%vdH5!y\3uVk<H(9 trf[??2*% <=cl &<iY{y 3Aby7:r8{N%[:tIRDtd}7DE`Uhy{wsu^H>pE{a-SXD~MC=0n5 g0,O]k@}|^yHLBV[[5'~b6JyO4 +R s%JcTIC:]n TxGremr-g %d?m^ps$|/v|(eS D q   g " o  w ? 4r    Q 4 Q T V ` "N :     ~ K^ "  k H O ; d x W 9   !wwl]=@h j9KU4 S0-uXK( {vr z!Ga=_\ "xKQ!mY@'!0F_i%9^ :aAP}% p8udHgqE|,NA(gwZ5QQ y9=[{8q+}54G? Xe:j)_2ce]-:uDyaO54l gc[aejo *;9Osz )Cm x(Q4QVk 9j!7?6JcedhtsEvx|ktdS0TM<_+z x]0d8r_J{$`O4rQ< V4!Ble YFBA?!E$')F3CRegw0!/b aAKYHy s2PM+h ~$ $    /  @Z  Q!  d 0[m  b_  :  8* `  d  cQ,PjgGOmQX ; l   hx !  h F P ? 0 (  jX   5  g" 24BjF3Hb59))VX M$a6MG7h Ry4>h<wb<<8;~SLmIN1] buCME?\Jl&f7vZ*zpzq&}t(xU L  x #    O j 2 @  "a"* k. ` ), N 7 [ b F [  V q 6 eF<!p/yN(cP1zfPJf5'5H7#Tt9 e%iQ;H<=L{]n00%loE\ hbOhQnSNCezpxU{:qpk\JKh(yHwV\7o v  ; n' O p         { T ~( l 7  4 {>:i%1~3PN#Bf0=&p .]UN{?=7;eG-]S =O6MVe~;oB sCxd^Y]b~ehmzv 7W!E"o` f]I :-Fw-[-l*C*|H2yUh5E}tBt;pN{(Up "3TV(xCP|uxprVF/S2W/hMi>?)}?#uKo;H'}si__PBI.<"3 +-EIS^oI &-  Q P 3 9 c U  P ( O 8 H:>1!$trKY02}xc\OY>Q85D7\3vNIz@Y \as\P)xiU>})*x&$':ATu#-j%P{Es) PP#@jaBs1Wr+V ( DJL XGQD:-aCp1@dKpP!o?(~M7[U ~~=,eu'3sL|(R"Ec L[lP}WnNZbj0dc n,Tb[! ha6{3\:w14fP  ! c ) " 9  Ue  asJ9dp<v\%e$eS u  / 8 X U C j 4 Y R P  'H k"TG vO94qrU9<3y,&DgTPA_C3VZ,~y#$FZs1#zhB ^ D$4In TB#99G2Kz[W]h>Tl L  / ( @ x F 9 . N ! y Q H  @M,Ul5Iop.Hn| tR3l_;pBMR(y,L <_> 7 A  & x . n  O \   l B '   >N  /t/:[JPu%WW$Wm*>A_4e(yJ}Kk:a)\C5 \s<$d,Nm*pP_!mM- ~:K f Y .h1;|`JwQ0f3V zI4ro1>}OsNj?c"M'{_tQe@i*c+a 5oC>Wp8]1n@NYA!EPzjq2}{AoFG*V(!dIjw!I":QS_kpP{3wq_K@e19 ZxGeb._[Iu.7-{17&DyulBu1X@@  Z  Q v  \ I 9 }  ?  $     u X ,  i a M J ? : #      f X @   i f Hv '?    B f * U  BOtSO{L- <c5e)H]sy.W*'uYNO.t UV9n[cFtN3lfRxE\B ߪ=JޟeH*ݻ݂߱:߂`OݭBݑ9q8P1@B>J2C v/ސ<޳DSn;ލ`޻ޚF[u߽߰XNoB0nqPZERS`ci'rh .[h \3e~ *IG0hvtMj%RHm%;) [h4'~;0j*j'ZPt+AH H#f=W0cJ];QOTDM57>'+*yTMx2aSA$  %6Qh2Gq4^[W:<6j^Z3t  + b d g 9 d  [ P]  \?O*Kj@Z54 sd:0l?*x:!|FLI*hR~}M`,9 S PG t#n es )w|0-|8"wE*x]* j5X-|KA   wu 27   c V ( d  S & ` 1 { ^ ; %  M  j C  V  qkX(A%L+v (zZA+Sm7~?XaPu$~A:o:/0|$>t!?c$Lx%8U"Kp0[` XAb __K|,-Op XFRO DbG<Eg7[ p?N{; vY#a8w}V`9>##zoU7)"?Rz%Ol(3L\rE(R)A]9u9WHv0]%Pv PJkc68[v! bIjU3ZMDS8gS.s+yL&g7yfhvV&T=Iv:Hog:v jDH_-V s+;_-gMEm* \  + @ ^ X  A < . G " c+3yX%SG,8Vlm&Ng{}lR,t]6 jVI  '19MSu5Dh|36\q=~>te Al0p''QM fC |ppUA{;G!h?kf\L1,N`Ty(i &*2K+  \u#8|x T J   : n   3Hb1O`m~>Wz)H'~;TnQ$PZDZIF wmqEjGuW<7{"BA \/k F%Kx F,}YwF <6j:%aB'zIW^:_>[/K4.[,V)o-\pM![I~2Y|\D7~iL/ rfwBc(KI8,%{^9-0GW`,lU=g9A@fI=.( 3I7ecEci=wOeDK 3^/qe c%  5 Q a Q 0  $K[P]VY=1&5H;Cq4h$"Rwl?6 7q<'Yt73om+Hi P  T %Y   g 7e     Vh /\ 8 .   y t  u , D Z n  > _ ! ) B X \ 4 ]         #       x S ;  v b 2 S  Z ` 2 R .  _ 1  h U QN{{7Uj YL/z nNl:r.=ZOWD-mtBM0x\=!qmlgiajd_xg}|!05K]lu%:JR\dyy99IS[Vhhvs|~wnde]RxFi6]'P@ \qMW09c^67rcJ,#yjCZ r=?&m{bQG:&~ rJ>9t.'R8z~V>U;[/RVx%+." .&vDa>8=@?KEGcHEYGU]Ypw}svrioARwS|!n C#RDJ_7F3z3I7= R * x  / * + e & @+,8D0P'F  sUT g?V4YrIkoL#o<E vDoVM;]!sIq  #N w   F  v , & y " H  l6  <|;-^h;"zG |hkZXMLK%]9XMZmeqx}!,( -( {L,_BD& i!c-fkY/uG'A8<1:a0$My ng'gHPbRykw&N(O*y-u1%bSg{>Ks{VjL^=M-A53+3/(.<70C/P<\JsPfm *Ir 0>k,O "E%oHx79c] (#DGc[t )G"X$mJLpz%9FZRasp$':EMXmev &&4:>EXesu &89J_r=S`68qr82'ma uZg>5im8J$vT/utxbx:}#q d  7  *    j  D  tYZ,3 iS$fD#.n+x5 qP%,Q`t.U$~U6wBTkr0XjZ, CH/[an5nk* x1& y } 5 R Y  S ~ M p  Y b ; 7    y ka [H 5; *5 *0 ( ,D &I &F 8h Mn W x    Z x Q s  [ 8 Z D {  N 6p c    <& TC W l r    | e b P *   ~ Oz 9   =i  z  E  ]  il  R7 4}P* Q"FWjy2\r{~w em+[=QNKdAtE6:>?E M5Ybz!gXLhO=vި3gݳAdx݆ܽځa8!یٗXp"X@*۫!ۡ#۝-ےAیZۮr۽ؚ/An^٤ܤ7 ڂdݤ+ڕDޓH۵J}|eGBޱ5 ߥ% }{!l'\@PaCh/ *{AKbvUs7"JS|LLL8 Or3HaUya,o1"?O:ozDne^>TmM:/)ivB${ u`  5B }  1 z ] @ /  T  j { 0 ;  fe?>cpS>!^qnxc.UIJ-f$b !:w\:8>1d  /!2 !n ! P" "7!#!O#!#"#<"<$k"$"$"%">%#w%2#%R#%g#%#&#O&#N&#~&#&#&#&#&{#&o#&]#x&2#q&#\&"H&"$&"%"%F"%"%!N%!%`!$!$ S$ $7 #j##B"s" "T!R! (  tBW[x-l#M=;Vb%j  -h Vhg W2`L@6k&Hi 8 O e |   ,  M  X rV>D %lVjTB}<uW}*g:V/f?}Ys9PMi + -&FOK|bdߜ K݁܂ۼ%ډ:ٌm?QؐS`{IԽXVrӹԲ?bѦӛрal3S=I=ӳ8ӝDӛWӝ\әЄӡНӽӷ&G(ёRm յ[ўY:֚Җ/K~ӟ,ZԾ7ՄٔS\ִڻ&'דۗcv7I٤ݽ3mޣFߖ+܈ud_BީiyPHK\}G=B^D0--N+p-%Jubh/C[@%6!n[ 4w!}*n4jHnU} (JDi# 9-'Gzp*;[*m ; W " v n 85  vLR~ATQn(;qv!$SO yF!. ! "u!#&"#"F$h#$$b%$%8%a&%&I&W'&'e'<('(U()(h)P)))*<*g***++j+?++t+#,+x,+,,-C,g-i,-,-,0.,_.,.,.,.,/,G/,^/,v/,/,/,/,/,/l,/H,/$,/,/+z/+n/p+:/M+$/+/*.*.G*q.*'.)-s)-8)j-(-(,H(s,','+F'^+&*&*9&$*%)v%J)%($e(C$'#h'|#&#f&"%6"`%!$`!R$ # :# ""(!!Pr eUu; <mbE/ 1O}Js 21NT}j,'D J ` | i q , r L ` o R Fk5vAY,d6(b:&ZQ{8^%CLlDxXt(G V!$?MXx1߇\ޘݲ D ݌:^+وڅؿ53ح_֯֔CՐԥӺ[S6ҏҵ;.ѪЫ@l/j лξiΫ%Λ͘о͇Џ͓g͏Mͣ.͸$0!7LL̀nͷѐѼD͊*q3ө΍`MԳϺ!ՉЈ i|Y^owt ڪ՚7"֢zD ܪ^Riޓ)ۏ*{ܩC\`r2j":$k",)d3F |Ga2b\g|o&}u1`& lQjP VEVJ^Y rh/"`JL!3a+G=+:Q6n O<bx g5 qgA l  y  l  _ y +/]-y2Udw(R-T$_S1b"D}4* F2u&Mz(:Ralp}priEJ4*t_AuK8b/xTQ@%y}Uo&?'y^9-x``VN<?B;E;EQccx )0?Qdd 16VPs :5qf3P%{hu 1?Y~(?=EUAJ:;5|XR&" cX( o;Yt>qEm.Dk;wt4FXl  3 M e t  u~Yw3gS>T0xQ^#*Sg.5}V-gqklw}ߒߖަީݟM} ٭<tNؑ֯ Zr? ӵԌAѼji\ЎD҆ ϴkр11ͱО͖t͋gvHpNoI}:vP͚oͷКи Jfzћ@GҙϑN0ӵЍ!ӗQҵԈғwn֏eש8ddcِm*yqۈܠ7ܚ/wݺ<ߴEOz`sB|jwv}tgs>B-!xrIKd~ j3YK;af^r9sp Me"jz"Q8?T;n>+XM 2Uk?-;+ 7  8  *  j b s ?b  T v 2:qRJ a$;T{b6]Xc4p&s$3qk$2j#}.`(s!Afjl_o Ob  !R!`!"C"!"["#g#-#i#%$e$7 $r $ % .%!h%T!%!%!%!%."&K"8&u"J&"R&"`&"t&"s&#p&#p&&#l&9#o&9#S&7#9&>#*&0#&3#% #%#%"n%":%" %k"$H"$"I$!$!#a!p#!"# "{ c"+ "!E!  f \ ,C E T6f6Y5pi]>; i+_V*  o p / L ) P   wgP!-EyeJ2!Vf25|xSKG 3b'9!0o=DN7k+! 3.N+j ?'dQ)vY5LsiYۤgݵ:n A٣l܍AZ8 ذ؊ۥuۓX~E^1Z>D A?JK[q~2ۑD^}ؙ.bۏ%UٛJܑ \۪wH'ܭޙec1Bޯ)2ߗ>U5oQ>"Tw>N ZbzWE{x-; t6tRBu8P VO">};`{-u%A0 c  Y 0  e  |  {fm1`82Dd' {3c,V| 1"386>2B.b4T"OID4hNl*I !ho,V4m=ew;pNRI|BWB-< =QZ`ra^O^;S\atu7q .)~m_Ml')a Y`,lR9-g ^E7\Oq0: Qa   ?!Y!!!U!"!"F"Z",Y"Jt"hm"ib"qg"xV"oA"p""Y">!!y!@!!k $m  +Ppl}!U(~w--e2V}G <%\  } + (   &1G?PJ`mtpwpisk{R\\Sdby8N ([2tW9\'9SQ:?b Z^1K9߼ߊߐj߀HWF/$$0:>KRg߄߆߶ߥcJk6y+V@odVBHa`.dpS,CDt(\6U)3v9Oi/ cCX.I[tz|gM9te]5b<|\Q%p#STr=T`'f1|bd8S 1 $Hl=_ J[6NlBv;xXy9vc uj%R1cb)Zn5@T NJUt*,]# y g   m 9 = 7  ,q  -iv({]'r"k&] 1_.=o@hc 0Rr$Bey"@r&Bt5\(@UCd|*Gs1Pr3BS.uV{p&I^iwpTB) `:]g"G*E%o<r7d%^-b"x>5`D#/r8sRN{U@ m  ? +  VI  d o  y c  ' = C  _  r1 |QZp=qNlgp|V&:62Pz]3@Y4enN)R 9w@qoZxy,(RZW3&]nl,B}qD0 x\C ]nDNX4Mm*zM9M8uXo6/{ImFen_UPWdxY`kaia}`gjvHw6h F&_eYq|/Yi9Z;E:F[RsQ*Cyoj0aX!BOs X3wbmvlZD*K/2kb(S0oRlS@~gO4uR2`9nE.!jL@, .Gf3T|R2+n?3yV(F/V6'K f   5 M J 9 q g 5  S\%$LY{z35@LBF@I$7az2y$6gv67o`#Jf/q,<CI:?&wfO%A!q?{ 3}=dJj4\Z%I}Hcl[G_nV&7p \ J   P p ) + YHEK{X ]?yX)mg?GsRW!BxE{] v5 Y5hl:r9{qnZ'j[e%g+AZoB~g:SuC5j,kY"\@d1OfwpVg&BxQF$m^'i?wC^(l+eZ/Ab3"2TF=o?-OtNAz\nDU*. ,5YrI LV+u>\Js\J<*6 ~Ei]eiR0P]DB7W'w . GqYTi/[Qq1JlMy(NrU@~Y%]4 R2Wi >    #  D   : H i  o + A n   9  O + c = { V s    * 2 R 6 g M j n n + R s  #8 9g L d v Bm ]3~Fdv .m-5QMs\|.IZj+j1vBWakkyqzgsZbTT?@14# \y7T As?rB'I ~s 7)   v6 -  / F a  I 8 {  R 6 s Y pvi N*<uDn mW-@3N n}.w`4x .X!<@xPy#Pl5jqodlojtc^_{sAg*+Wh ]0dW9x^ is'L#=xnp:W2cW}R$8 =6NbV|KMHD/!$49kp}zl4wT15;PpRd`Mn>{*  +7;F#90DIUM<h1c-bn SMC$ va.e:d1i3a6U GU3v4S !pG!`0zf^G@F)$ox`vZV8ef}T9m,9kZ:W'6  ANt-E=v+fX%c\<6BZ&*JqZx$FGn OxF<_ apyV)$.:j@`ti0[ @{Fy!+D\[o/=it } ,(..4*<>.+&)" %&}*~*1/;J^[k|*=i!Mj<\ ?=u|  Q O 0  t H  j  `  o G ) 0 8  3K:S9P>O%)ke"K2b( TJbc{ $9/f(Z*6 o/g.Cq6^#Mv.D{m^3: 2}  ; O  w  '  > x  s ^CQo O>Wp[vCr.uU^>t4(Kc*a a;bsG*icH2+ D _,0Gd3fQ/nV$_5eG1zBP|D2s2wO(  hKo=6@Pxs3Upsh7g8c x49_.FVnkwh Zl   k i/ ? mBp^L'zU-2x9ihi\hjry\t+t ,GO{# i  ! Vj   Z 1 n b  K P >3   # c) [  * [ : a  , O t CV} .-*95.&]&_P, N  F q ' o g :  V 6 w E ; m ]xy!|'v-l"U;4 '!~!'@7Q[(&UlNaRBx3V%]6lF&s%f \SJGGIATep'=IivBS|:No7P|#Ej'Hcv 9Yhy  T5w XK'} 1vY56?R>X) ^6Ha sl M2MRM}*v7i5vQ qEuUL+ #1N:y_F^N3 H93,O_2s$`vM cK?03)4AEuWrz 5 i z   tq Z7( |FyEh  T,ZuA~  d k %! !B!!g! "!;"!Z"!}"!"!"!"!"!"!e"Z!?"5!" ! !n Z!' ! iN &:=cb'5VU czuK0tXH/%~  y   y  7 7 Y a  A p ) I `)Sq^ODE9C*'.*2!8$E/G?lJ~hDkN~ \ 0 j ) y H $ i ' {  x s ,  i J  u X fl Jr )_k'"q];c-OVr|~~uuU0 i3d7DgSa+H. 7<  8  N ~ A N  2 <v>{,Kn 8Vy $$BPWiCS_ H[:q-jiLX(^: 7/Of|߂m["ުt޾@ުޘݎݞ޴ݜޱݗޝݻޏޒޔ$ߕRߗzߩݴ߷1r ޳( DIrގ:މV-߀)7v(e7FMVo4daB&Bp]lUH,q2UGMi/g -Pq!kV@i]R(onI@"& V!q~=(C7C FSjSn` SX}FO}O5iIY\$}Z H J{j8TdE:Hb k9Qp+ Te  I % 2x  / ` $ = ` C , U  Wu P 29&k,6FVWag!}1^l~xfR{gf  !2!l!!Y"I " " G# #%!#V!$$n!M$!$!$!$!%!!%!1%!G%!A%!U%!W%!D%!@%!$%!%e!$@!$!$ p$ A$ #V # p#'#"d"&?"!z!Q'! _ j| vo-@`=Q?@2;y3P#{ O 3I%u&B  ^     *  W   \Huu6p6eYDkbt y2[;f.%WUa% \n7k.O}*hZsa&M=KH?+:a8%TPk> 9jRV)$g\%zW5ދJ3ܐU|6ܦُBכ5`HؚԠ׶RҸTՂЈ T:ξҗ5̢8ћ˞Xʞ*Bɴμ:1ǁ`̑q5,˵Ū|jWB-ų'ŹZʋ 8gmƜ.˱@3ȑ̾UdͰNj0lͳ`&Ѩ҈vVPE|IصOcIfۜܝݳX)cpHuW`+Z ^pHSDM+ OyY6=OR  9 @yXBd~~w@vU. 1F 8PP9D t !k!!7!VA"pm"""""#(#2#/#&# ####""""{{"hZ"cA"S"T!C!?!=!8r!K`!6B!B!G H V \ n { o d V 7 3 " : b   &O<v  / d  !>! o! ! ! ! " " 4"R"l"""""""""x"j"J"=".#"""""m"X"8""w"c"W"cD"<" "!!!G!!o!E!1!} L   M f -kW-PZ X|!`y'R[|fanRg'QI - Q   g  ' 7 *D YF ~A =(%  #$g,I;+F/6@f;BF ?JYjhpmrbrt@|d5mBo5~(}y.܈,ڔ]hN?K-eױ Cץ=TՕOԮ԰Ym:ԧ_ӌbӂ4B ҢѣtяIs!^ F)4!ҽҵҦҲ Ҹ)(>F*Z^oҊџҶѨ5sӼO icӭӻ&z^ԤH9;ֆջ3HֿצSgtB؟@8۱ه:1ݹJۘ?lܮc(!lߎMH[R]Jm4)V A`DX F7{?,/Mx \Odiil#^=WM+_f_eoT^&JhBI/.w|T S < K " *   |  v  X  Z ZMJI=NU<gSP*\4V]Mn@$+^;@*  q !3!q!!!!6"0"""""f#!##f# $#e$#$$$T$6%$%$%$% %&%@&D%^&Q%}&f%&n%&r%&q%&h%&[%&F%&?%& %&$t&$J&$&$&D$%$%#G%#$2#$"Q$"$)"#!N#g!"!y" "# !!9 - 6") x~LW.+bc0&{kF9{ `uHrE P  L = m v  A c . s 6  A  T / G    ~ ao G_ J P P A G M R N \ ui kn c e _ X U \ O Q K G" G$ F7 G8 6L 2L 2K 2T N V F E 2 !    g G l F oN^a3)|*_ ]|wtTf">Wjrx& 6 +{lSQ+)^w,,gCMYkCm=r0N/7A%ߟmCߟ7 ܥtڐYn]dOwlֈٙ0֯X؂)ՖC׆HԲj.֘wCӠ"rcE95#7BHoӉ5ӹW|ֲYӔ8c5׳ԊeUؿ;يְ/s׭?Zdfً݉Bޯۉ_6ݢVgr1r>O$\&bS1{WK4ge>5X5o ih O ; I  X {F-w#\ S`w 3LbA+;* WIz=R`(~mcRCC|Z`1x7j+I= a2NOXIT0q{3X'W'yP~3> i4}W3Ygj5P*x> ^AE  < X (  7  a +t '   Xd *$ ] M %    v{ EE    x 4G     s] H? 3    s T %  kdT@+]1F3 ue6|Rb/T @'~Qol7$Wr5o x2h A7f'k"83;Obn my4R6oZ78ap(Hv2Zm8OuOv:I@ *''/>Uq:KjQe%Y:ugB,dQ%;"yJm (2Vg|gYU1<n0e*ilv od_>+ UYk+a%GCY:yX8xG y8tpN3:!-r-{:9m Qw3Ai|y zpXF+s<FO2g<e>qS I%bc")PT7Ii dK c 5 e ! ? S Q   ^ @ % a j - 0    y \n 7[ .  }pl`\QY:`[Y[]qlv~m_]\,KJ;`:},   $ < b        ) 9 N U rc ew Jy D} 4   v u d [ G , g N %   n H h 4 \!l?U w8\jO!w~ 0,*GxT[TP'>G)u*rIP\2 4nTVyD961i TKj2&p47YuLv7 f}cfB\7<"9; )),9D Rq} .!AYK\~y2hKf;"HJY+h=~)tmX XZTZP YBw5T6V)nT]!Pe2+*rFxe9U'"[[5|gB#j3%41G~ KX   9/ ys   ] / j 2 |  Z v + b 7 P . M  * @ S- rL xe f m ~           {  n ^ ] J N t? e, N2 B% .   u c K I / ,     # ? ; \ g }    & (= =I `d rx     # Gj(Efp$<m3H ^r8oQzQ{v}qqdrBe<K+Z)V ! T  H c  F ; z ! f {  & |  q Sp1FMW! yU9^\O tLEa$vc_k?#:WWR5w;D [|=]\ LEB[c}%Kn F tL5-{$D't]b#kkrHoj8|Hd+eL`I?>:qi$ @ LIJNQ/i5 u<kL@;-@:@9+Sia7bNNA^&% zv6TFN*t%I!/'$K+o EOw m\ kQH:`,[N49R1W,4Ey#&eBvcE9P| #jO&joLltR#h{>Gn"  Zy # \   $"  ,  ( o{7:=W.n 11KO]ullb`B4sLI*$UlrClYg1 \ > B P < E  3 |  NnOS6-hK>=O4oo 8a&e_)|L36X|9a,hVW@{OGIb2A?;LWj1{ v-F9&B  XK   P r J $ p 0  m w  3E   A 1 h  a   ,=MfbnztM/~M )  j A -   WD   Ge  p k  V "     Ae gNwx J!f t3Nq<r$XC>_/-IFiACYJnq>"e>\AU|zwS<x@wN&Bq=<@A/ : f  y  c @ 9 L  ,u  q {{pu%tAl4_3rq !nTHx^zSJC)9 ,,7>Pnp 4 X1LcFw;@`Z+]5&OXj1`%c$ME_s7[ CL h' }_ x     $ X +{ C S z  F k   @ j E g   P  D j , p 1 =k e  2 }  $ 5D g~ r  HpIc~G$F  Nd   - @ B u  @ $ /   V 6 QSR$6=Qa`u{ 3Qz (U=8}w/q  v'sp(Q'|lly},R1}.d$j~_ [Dt E6ymL d)o:3T\#iNgya<,SEgUZ<)a?2fTs   x?pEV gLPf/_]:^5#W8| O4psD3o4!Aa@Y r!X@ r?{xz#GdD|*oE:Pr')z@+UruB]Ga6of=, YrD  :  Z 4   gg!{-*trQc"hhH kuGPyn|^<Va$ h8x6I);##z\9c;r" r  j ?  { Y  AC PYXddFPI5_G3l;ipSj3P5:?;)_=}`G ^4HWpCN3)6&K!Y0z4&L7OBX  > H ) 0 h i  | c ; 2e i           J x G 1 a l ;  L w H   >3R&7j UZ UNuQ @&y`/MeVDr4O^.1'?Z:8n :C{cE) ~Tu![?:2.!/2HYj D6FmU$g`TH/C}]>!Jer)X,_n:z)"TK}i+ M*{OWj/Hc + Ms)&/+;H4qA=HH F%NNdy\Qb^qo vMzg#@\s ;Hau0Je{;kB*IP0p/WH"eDkP G G z I ' K T V   @ M { O 8 r W   M? w  ' nC~?[<wuO!{Gj!Rm $ @UesxkQ ~}jVrDA=a#uIr7hGQ[4F Y ^   w C  i 0 % : Q  H >  \It-TS`G3 ~IP k!O\N!Kd@{G}N Z-x<v =`~'6fl4.va4aA\NS@ q[t/hgnFqqBuUv({=6WK?|[DG"NroUGE*}L&|yUl2Z;& kE'vX4 ta8p Kg-g@l8pfKE1vI/|rzn{t)Fn7^ ipdB911dB8~0VS)U3sVY=;?FR\kz> N ] l s t]At]B QF+c0+1@   ;!u ! "8!_"!"!#""U#g"#"#"#" $#6$0#\$D#d$f#w$d#n$e#n$`#c$Y#R$B#?$4#,$#$"#"#"#v"M#7"# ""!"z!S"8! " ! w!F ! | ; jUTr=2vQSs?3[/~&X[j k b ^^S\ _fnx> 2 `  B  C e  y 1 : c r  * ? Z    { 5?   hu < Fp&|!]R~7zXwG~,R>fT3GSQ nM&8B3\z!q$l ?ZLAhaK-x5{J5WXZ.:ai8vB_SP7 D]zB;r.jP.}(S$:6$5QG)t/)-2)-)-(-({-(P-(!-E(,','M,_'+&+&+$&*%*B%)$(4$O(#'#&n"P&!%-!$ $>#$Q"b! U~'SsKh   5  b ' 7 X vJcNp M3Qy!yE}K#.-;ZVy$L}X[VE<-/ ll[F)-)97QSZ[u~{}\Y7+]FzwhwGd/b H' ~uSB,{tK8wyqj\F^*Q JID4(h M=4 v{hnckj&bBcM]X{vov$4b/:&PP{| ?0iO{ >+bW'FXt P1[ XE1#zKu'0^|<]i'4nql3-OT 09WU}B 4A>j{>  2MBQsb4m-h ")7WAxL@[O-TP_}Z_Y[^TDGA62 zL+_o3;$UeY9'}4FlIv.p_amFl` < K  G a  E x   /Y j D=| 7u&Tr+m6;Uo)a2]ecpJ*w4"vUK2y3B!-`QfysiHX-GYOj2NG|gg r=/en@U;)'i@ZP/Y[tU4V+@~L|?L-Zt3i>ls`8k3~ygFB 0Rj:dn.XuB?yoc/4l3b1ng+fcjq W#bd)Jq &e'W=`>TK5j5 (E@E`|C ;o,t_K8Hw$p u  3 g  ! c  [ `   ]#(W%Ed(=h0$Jr]2hjw ^=dQ%PXlZ   9!{!!4!W*"hc"x""""##.#2#A#8#/#%%##2#""#"/"q" A" "!!H!! N k T.Of%/>bA{7(m m6HZptJ!~`RP0z P t ( X % g P ^ =+:k4L.=Ty}^(gS'\ 4OfJ/iGEWF_Cm;x Iz+]+r28)L sgn =`iRGL|M4Vk"q"t5S_+FySH9%^Px5SN L0-+122@RO`y#7N@vh@AwG6$lt(nb,}"qB0Zz ZVB;FSdPrB` 7`Jt (IboAz2_+!HS^as 7s-+][xM~3b$ N 4 i   = K m  Y  W /    _ m S. s  H ]%sYO#(Uh0rh@xV:vT#b.Q(u^'#5>`W~"7=Ucqv}nP-~oV^1J6 kD{Fg/)sK*g?+OJ"` Jhv kc  k > ] v 6   : g X   v, du|=wgIZg^+NG;{CC_i+6_;& JbJh@Is*Qpb&6xU0p+xc`G$ yRwxrzlzdtdV__S_\krJuj1u 8zBZu x(S* \"u2'>ue$N;Nfq~@TWko{otof\\M5@#$ztJ8)P`)Hy0Gq-M\4 p a  Q  ~e /+  ` x ? 8  z   Y Z 3   Q U r  V / j $ ff;wsfKMH&,  sU7_>)|WKQ1<aZB c lGA vV%0<Zzh+/wb#":,A1Veu1LO}T#XJPF+BeULi766&&@Ug +rIw:\$ )HtH ) H 5v @ X g ` x*He+@AVWafjsvg|pwoybj_gbnMVXe/Y*Q"^XP^IKQuJdIP<7@6 A 9 5 )n $Q ).  "   y N 4  n G l J +  z c a S 7 Z 3 P  4  $       f j E 3 "        x [ }J 2 %   }    { c N r/ l s c \ P H <t ,b 'J 4  c{Ha/K/ `-wO+b5_;~9qEyMj.0^S#Y=AR4Hj9Ew&`Z&)HT`t2+aZu% S0|ej. rFeL vo*/Xn.5wR~ L#pdcU^OWmy7VKs5m7hZS"a[9}:ooJY.UoHN8#7t(=wY4p4oBuAz%!OknFj*?WT m)u9Zyktxpqpriplp}XVs>B4!! 2T &0,;_B_pIhKqS^H *gx |uP0m\8$l z . m  XS  M  v B * 0 / C   7xXb4  Wk(s+L4x] 3E8lD;AC9.D1-J@LZRG++N&xcJ$]i -*6/  a!  f &  @9  [_ Z ' x  I  wy  x ;~t~L>.TM{y5bWF1eOWB+1! h ch S+W,`@XTdnw )+STmb .Ox 6B L8`SYsikvnbUZL6! qfR?!wvICrT&z2#>X3$OfpS34j{s>js hG&+O-[+?pi;>a9}h_@5Y'N 0 )16F Zl*w/G`o;Z-vGhPNhz/]UzkH{6/+l)'{i? Kw3Fx(|m)uW7<2_'!W' Z/{soH[BY(*whO- |  _B  / W M ^  i I  c $ S\   ?JG 8l~ Y " //JPWfZ}einb`bPI0"tn[D&xP)X<_A={={@  l . a # O  3 ` ) d " } Q  O  Z % ` $ U|;E%wSy,ZE5q?sQ"kvQv*q cQQ?5r5K0hCF~hX9nRB^%gyYT; \g}H9.vFnk_.- KoQG`P``m/Tn0Kd2 $Iw+o/q-b-YJ lJ@p>Y%=- OBUw<~A 7HsC\MJLmcIq~nG&%2 w6S+GX Lj(Kw/pFm(5<AZ2?(# B{FeS+RA3QkP E!Q@FeLsXU$xF.[a6\/aC' R,,d $&Vv/VjVei~q%iV^6xu3lg cObTx  { |:   s 7 K  | I  `Q/6R\2tcI #5($.6-@TGDAr"ExQ`3+//_  c  7   \   `  O 6$Sj%@`=v8c+E$8N7q>MQ{K Gq1.5N =wH6 Z9)03DQ_w XDzy"qS)u8sO<}:z Mw- V`%Co/ba L>fJd6SsnYv3S8<RTn+AU n x*A0h,4]V+jg"/X`@j2 levRk5F3=4&0)'%+0==L[Xtk6Lhi+[o36 B=_&b&` Bi/^. oudlAX3: z%ZX  '  I ) { ^  R E  " E e r  : w  ) ? GM G'C8BD-R!` M V W > 9b #=  v 4 q J  s 6 D g   T 1    R=   `[  }u2|Glek >je"Z ]Rr\'xB~Jd)G+sl\8)uL#h^A:7yrc e]aag-[>f=}Hgj$5>JUlr@&S@{Kn;Xo6$Oat kd9lN lG)?uy3Ouq*/BP .qi .3XF_ s$-5]: f< 7Ps cU.%JuZBj[(2"2L ]/@hF /@Qfk>% { ) z =y & { g ! B { + F  #  G +   SC   uh  wVuR m^^?@x~M`J]]79%/1R~OjD17BWnZgvWz>C51.67G]az ;czkb.6Toh1U M ZT5uFd%ZSqY)|K$hw(2jWA5tv4od.<[g}*JY,8t3Mj ga_w_Nh Xz 6r7X> PiZb0zl{Y,T`UYGfI[.Fp%^? !=/>X6v3Qo4l)8 q   TG p   1 p   : 5 1 1 D < \ @ t & #   L :  y P y ( q  k V L D ^4 F0   g@8}yxvr|nvvlupjwq\pnf_ub_[b_oVjPlCbJsHmFg3c3j.v#r!w {{ !/Caq"/ H$R@nWj < W - } 9 R p |  1 P |     J  Z  }   r W -   X i(    TP #  \ 4 /~Z.yMEx(a7kw9*v#{: ]IJ? Re"GJ8BW/{*pCt(k;{njy9v!HX//uoSnwt3,{IHp1'Jj J]#t {!iJ [h >}o%j:f E-\)f *:<:bcveo}{zspUYHL/FC$ z]I=yp~rlnrn~3TjBZEz-O$e"'UyD@.uBJD)zL>K(UB =0_`2["/G\ t3 _ x     * B V  u 7 K Z g  % 9 _ w  $ Y w * H P [ w 6 x & 9 5 [ }  T .3Kp,#{Kb`A(7OMk{CegMnV4m+8^?{.E 9 q :  5k  # Y o + B a {5FHCi+q7Hj"D,Wk y_>vd3.n:{sd4.e]J%e5^JT,Xn6V,}U_4To:]%NrTFfe1(^.MYf# y6@G\ AnBM Y"w? L#Z:~V6~aQ5#y udb`ltf !.?8pO{C"H`#P"`O?!usaeappDV]-kcB9y^fSZ/Y'N(^^e h2=Pi6Jn/W!pY  q  9 3 M \ d  m Hnloi N6*<CpM/)G ,Lrb3qF ;V@|)D`ixwjj]M@+gD%n>mG%~S,{AGN*f3]~+? `UF'wsGB lvHH jg?>zkK $LiD \/| X # E   u >^ -   {q K@  ^ Q /  x h 9 /  z v/ C  g " A  > }:OoI9LDC|G&gG5yaA1s]3&^Ot B2YNwA-1BRoCސc޲@?߇$f{(1sy kv29h |%_ v0t@Q REfN' ;e0dNu/wCMR,R dY};R (y)>q97s~ R  L o  < w   I 8 h K h | # H s 1  F - t 7 Y j  = e  / R y  : \ t 8 k   " A$bP' N!Nd0W%Q!~%BNi1ve3Xsy16FHX~`ylbt]jPGyDz2)#wpq_XJGD.+ |tdNG/%kWXf7T!)mDg N3vI a2a  ^ T>   ny #8 } : g  5 A  " H j   D3 l-~CrX"G3l VE1jVICAK:XGA] wHFs?E wsC`5tX5|[Z;.t+\J . u]~Eq4U>!|Qv;=aV- V[2])MVBj5qsh[j*\'sVwn+S<jl#.yZx^YQiL_MIS |85J:}KQ&Tj^S/Fwg\!.WsI}TTGFPn0Uh|EA t]" T6VKUTOM1J BT   5  X  l  ? ^ I   J \ k ' Z $ M s  U  >"sR2#POxl D`:R`y"Cd6 8-D7_Sp` *6&E"JP*c%cqh q{yz}|wuvsu_gJf>cX$Z ULLD<@*x2dK"0(xW=#oO]*G8n= v 6 Q !   a /A #   1Y   i i 1 0 n |  '  a K  8 ^ _ }-!3=O:Qj+{r_ I & h@"0aGL^y$m2XJ5)noQD?^+:,56w*@-[ }2x(HZuGB}M`"}OoH{`F@)}zwew |y #55Zq CZIw4wJwe+iR2!j\ \EM-yHiR]_ Zo#X{6NSA d2-(){6n=^C ^3]# _q nYn<#x0lAZ\9ne P3:E+?{ + h  ( ^g   W > R M Q  N A 8 8 | 3r#IaJ0]!b#0bSl +d!<[qx_x6b$D `W(XfIE  r >   -.  o ; E 0 k  | +  ra ! ~  *K;(`gVQP =|H}Y\1C(|sSHE3;AA<PZa/=@V`i|s@c ;DQ?^Lqw',v$v)hV?%{oRC.`I, fS*=&IYC(6Puz_ &=Wv>r#M8/DdA,\n eO0m)|n>Wa\(T>X%TryVC3 sv)F9hE&3o'iFB{&[;p2*Z`nr * 8 > M M N Q < E n0 d# A 3 xH._G4m9 jnA1KaJ]o.\E*f 1zGa#\J' jJB1 ncTB>  .:F^e|7R\79`e^q|o^eOe7]&ZLD8#'  fP3}cubVC%-~_I"xbOC5v3Z> 5 seSQEE80224'52@!>6=apF9t^ :qGcDs  THwB;Oy&E s-Gu 3W o)=Zz  $4E"H"BEMC@C-,% fO;$e<}J5S!t= Jv.j#Gf (OW vM |B:Zj/PbKm<}Ro"n _XMFL<>hBlNfSkbkcry#F*qHeAtB0nmb-Z741a{/?ut%kf RV(`P*fBl CWPw  8@UHuk1QmjubpSM4*b[25CP .j+Po(i8]'O-Y}@RxdI-&];f @ `N@80&'(f8Z Au/Af+h9dG?- dR' t-O{hu!Elcy'r"| r3D OV`et+Y&XfrVM0h0H }HjR4i {+e:qTyS(po2WJ ^5d"^3qM=(mM70 %!" ,9-V;cIuX4mBkj5vmm!S; _l9br6rmc7FS MkJR VPyK  5? Zx     1 E " o : } O d |   > O ` s     . ) 0 4 H C C Y Y T ^ b X ] g b a _ P M K = i 0 \ " >  g 2 m  A   ;  j:B Oy>?`)j-L *m/GYO9Mwz=%yP@Rr< aEu@ ~yryw'CT|"AV n,5T~ -K`|,0JDB?B&&}Z6g5j/~;s1\ L0B##`g P= w RBXZ2K|&W=}v \F  @Vm;pR/ zv$gCHX'Ao wLe& i N  ; 9 ~ q  G ) a v H z  & 4 M ` [ p        v a > /  Q . p ?  c ' i # _ j , )  Q 5 ~(+zO' uh#XGMvEXjC&HJ%b5w`Ev)L!4  $!2"<<]TZbty~-ECj qmR-xXF8%W5 |da6* tiNC!]W>#Q^+FT*qQ6e0yP!k]SV08&q u svqjx~0Xj~*47>B9TSRr`Wczp+BXn|%/*>:N=UV[Rfeqjs5O~%>SL^cx)Z1Mt2x";emC@w _&oK70\WJC!fSR/fOan'Qp)@A8=33|RV+D Rl9Kh0y!D/3B>;.t>eXSo%AQKsU<FmM>b"2qYOJGB?!P3cKe^t7=Wd ^?t;3g7s@}=v^?{ ?3r/1mk :L}#A`p!MLr$J~5^b| #In|  " ?/U4c5m119*=  {pTyNn<L3}V[<1{LM&!r{ZM/}xEQ'g~@Y/ mAr'K: rjV<8 w|uv!'""0+374=)/ $!%% R/eDtHz ? KLl9*gyEj^l!'{}'G.oD? j.pG#sD xXhBT$P0/-)&/1-4P [w*h-}6x[M#v3r$I|#RBcIy}Ab)758<C"9)><8@CA8=$:3F$<#.#4 ~]WC5& w~rmxng$d4QFSRGeOu]BB524' $8AHGI[J[\SWWSM]BJ;4,}vQU;R"}^1V 7a0V ' ~b`(+zQPtCjFn< ZIU2 tW`ER732 (!)02CAgVylv*=`~(2Ee{(j no6EuZj/3Ju"Y7 lIH% -2Pi,%\_ \=n>/tBX^BK SdkDB:Ig(@# p@{(_XQ |Qb+e#Gp64    kW   9  E r 0 h j _ s @ ?   H O ' ^  W hu'a0J3+|+r:tR({J>PODisplayCAL-3.5.0.0/DisplayCAL/theme/sash-left.png0000644000076500000000000000023612665102054021123 0ustar devwheel00000000000000PNG  IHDR ptEXtSoftwareAdobe ImageReadyqe<@IDATxb?:9sf=3`a&40k֬z 0Emj$G҈`D1EIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/sash-right.png0000644000076500000000000000023312665102054021303 0ustar devwheel00000000000000PNG  IHDR ptEXtSoftwareAdobe ImageReadyqe<=IDATxb?60k,Učiii(rL AH#5aH&Fr45FR] IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/sash.png0000644000076500000000000000025612665102054020175 0ustar devwheel00000000000000PNG  IHDR ptEXtSoftwareAdobe ImageReadyqe<PIDATxڄ Da]n 5>R:PyZͬPϭ"K8r d=d)vCDIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/shadow-bordertop.png0000644000076500000000000000020313223332672022514 0ustar devwheel00000000000000PNG  IHDRttEXtSoftwareAdobe ImageReadyqe<%IDATxbd``a 0} L dQFڙ6YIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/shadow.png0000644000076500000000000000020412665102054020515 0ustar devwheel00000000000000PNG  IHDRH-tEXtSoftwareAdobe ImageReadyqe<&IDATxbd``b ?k?t:qhdb@]] 7܃IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/shutter_anim/0000755000076500000000000000000013242313606021227 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/shutter_anim/shutter_anim_01.png0000644000076500000000000002223212665102040024734 0ustar devwheel00000000000000PNG  IHDRX$aIDATx0@̻O4/| / k_[;{??G?ы?~7X\&܋{L@v#x30|߼}i4x>د|+oD M^L& ;-K-o o/g?7/_?ߋ7p,p.Z\S2jag2P (iqhy O~ߗ?_/ŷ_ Zq.Z܋߄(ex, H3Z RM_-oMϛpo_"oñùBCY8-Z dZ=Ea(y Ay/~Mc3m4l0,FjA"ñ)`܋{Z>12RV~|xF5*WH VyÚ=o+yCPi\< c~oSܛ2Pd(+eKA.'c]-|J;ep⻞c4k` sд~/ęԥn |}%+rZ`R2_Ɯg]8 t/8FX5Z Ay{^{ׂvUS碮]j փO~`{yXI5GX#m =@J5A>=j!.C]Sp+Xb1TPI,52y-pD@z-G Z <[Rǒqp $#q {Q甅6@r]zhy✊Ցp,H [Y|#/|բ.9:)`ENDaZ űb(5U)聣j,Ѹr fcMRH!1.$VբNeݶ"O H.sQ @V0H  ZPnG*ej]-uZ3Z=0zYyVAy/51Ж:o5遥J /qZ )ZZڴe,h=% K\֣&Z 7RCԀ B9XP,AjM-"b[nQ;FWH% J z`P!J1ZIq/ѽ-RS()ZQ]\dJq8\'Ή`ZXJ\k)ҿ=Y\,bm!gYY] L#GɵʥrspXhR(X]\Ir)WŊP>ebj2QZUٽ֣&k5 qe) V `:8]^H_r9ͺ5=Ǽ)@HzqܪZ8b-Pg#Ơ? qj[[\~8@p:uPۙ cj 3d-p KD@x׻RKqIxdz.4 7v{Ho fǍmx2agk=JYp,Gݣ7\dz:ߍI/9: Q<+sr hQwQo5iDWXR-VĵiOs٬4Ekҙ-o46XR`\M%B%`ozl(֬[>4c 40R$4(e=ZЏ=` 8 (HdE4lF[q+CnG8yT4ߍD)$nV Hk 9@r4't6z%׫$,nD|wda8 EtQ[3X]ok/뱔Rs(qFVH`Ej3Y\7YqYZ 3+lZbeHR %8HR>Z:n$-nV~]63h t5z8@;5̷-d$#q:mg#{ЭT2JHOHmjK}5@Z@8&I Ɨ F*N8~HrB<1ڌusd  {;9@bMs 1`]Ը[eEՄC{ V@Fz&jܫ58T&-V,7GP~/)y@*!&-m-փ (\׋7$[ݬ33Yq D9h;gi!KjIP+y2"@OYu✊5@(vX-ĕPF%c>n%pA(q x6Σ3XX V@}4 oGFjEH4rvoGv$:|xHآRk Kr: d|jo@xFO\^8dT>ڄ+7m1c>R\ڠѻg|1 \ a3EΫ!K$eŭ ܗdc#"$) ,'S*U؈a#t"K` H9dz:m+€9WDh?ArDkӉg6*8iasb 8:# ,wɑ1Hgs@WAh+qSye :GyYeGOt22ݎЫebbS; yQ8Ij(nWC05asښ&g!K=܇F8,ғsr[*=q Ľh;O9VK[W5/d`EnܣֱX Xc~ڗ!sC|/yѼ#&K=94`31S5hzMB(JpcF =w>H:x5p =x~ A>n۴=6qn=j”sҝ4Oi6uMޑ3 .fE A?٤Ҕ[B<~sF!zbX eDG(M=`d)O>@R(a~#; GI_rbgrn ~GIG@B=N8}dYUQv@A:]qyx&L ^ޫXߴ8 ]YQ}P(s: bwp%(9ŢoPfRul#v,=3Y(Ӵd]-5Ҋ 9kֿuY++rojuG0v P1kch 4ԛrrڼ9H{VP,-䌵yl'qKp;4u.SnueE w fWww >G<uP71P3 SHdAl3x-` UAq Ň4xe!gYG}la*\q)ꆗau8Go}p&.A:eE>oS'Qܣ뤀\qBCkAye4~=rGe@)G.Oᤤ-{vc]n OjVuni\6Q='O8|L7?VftẉܶI7n}ҩ3tC|B(Yc+̸Fsd2Š8YlnpG-?sŢ+.X}Tq( ?,\>r-V#L%@"[b=ֲW.rRۄ۹L1* exnfmu8np6Hz$H+ȡ%O 5ev,e3+R =A0(=G/WOȚŧKND3H%$n])x -pԸV#Gpt򌱍^"RP+VeEJp>~2 ri/$Klk:qǞC\65w8?$|3[&kziOw}+(%p֎gw Z0FñzXÌ|PݧdҿԊ^+ZO})UI+,%:smKpluz}-PV?sc\JA1(mmojZIjI hjF %j9qOW1)zJ@Jy-V2\f(PZ(H8j\aҞ_Y uykVH@i&w^$w#e=@g[8z_y(T/VpUu" 0zZZX\#w/ H\:Z[ۦ_d"'r,5l\z Vʗǘ2 ~uVČp RkEֲZka~)^&9Pj`iYjlյp;=rURExSbQo!(%!C/8J_l@J/4) k` ڄ(n#Ҳ>gq @bFIH%:T:#FIԂRKh [hcd8ýu0\URh[/e"w)XPJOݿFh;m!Y/ HڻuS*)*{|&k+k2[=֤5Xz@\4=ά+Rc]+YS)Ѳ; Bj7P`5VKfPJ@F@r/q$)uwoֲ9ꒀ,MBq4Z( ڠ5kJ ," 5`8j;ux4ZVKՊf֙t(ڠP`Egb pb&|Ur,Z(:7hO3[  J8rlc1c(wҽkuy@[m'"רd/P`iVjWM2V;& .ʧbgGB J xIY*C [ᰞ\lrb9qǥ)#p;bj$k$XjE@jȁQ[›Xqe) Eч+ Z=՚,Rc]۶E %QG ȵ ̡B8}8. Rq=-*$cp5YK05BFHSuXVi9?, if )AbvK6Lƚ@eBFՈfJppϥ Hb8~0kR J pqX [Hp/g!ķӌ/[AaZ-``r85HI,tu>W7.iqZ@)2# Ps7\5\2{t8 5H4pP;\PED E+K iδAV=2$v&[w7.^5Y(pBQFj,`7 Zg!)AbgRfXR@ǵ&5#bʻtgHc t*T1ވKNgaA.\1C˒&v²xlbɝ/h5<U6ρp<4 %Hb\-#JyR-ݮ%PZaiU" e=+Fԥ1^ɥzd85HR7]&fx$([Iu`!9Eh\G)YKб[Vt :sbJ- N`ĤFNGf%HL`< 5ք5JQ;rY3`)T60&ϗ+>xZ@ B;v|EPK1J*k eIH:p`ĎTOkVxJ@ IItu!6A6,a5BT:~ ݧh]ʗC~`jj<#O H5h- ԝS!qߧ 4{Yl 754-TfrJ kkVVl\?M,44hĆF\lBY,oяvf4@Bp<.' CQj瓟ӟs_K_қ/Ewñr9G3x %>O4/| / k_[;{??G?ы?~?p,῜sqN5,A3AFћ3?o޿4nJ);p hZ_-E+w"-hYb=3:A75<9cX| T%S0ysS 9!G>hR7,Z@'+te5<ՠ!D?0~Tc  fΦb+Q`Q=i{^#(tЙ$zFkr{V8hT8AvdmPѸH1jp9Fe t~:35A3]0 %>*T' N\=Xjo}[ (L6&CWώctm =S'w+%V^1 ܄tb 5 kaAhT-09P_1GW *FkNM59TTT,A&.4Xs rPRk{nѱ.߭e& 'A%^d+iʟ'/AA8Xr@QӠf8n]lviM!Dkt{HnIEiqȸ8 $+C`-VF(:=JΚģCtNѭSp9׽NJ@80.s;Ȝ 81jlB!z`Ex#`i&NT9 Su ܞmbdrgRX0J0QtEP;ct{E =j{a4}; V(K/(15:w;ɣ$HX?4'QqTR1 9akHPrY.'|::qQgKL@YUaoE l F%/Z50Z1Hh+#`)RkM2{@HB[bEn\k/[E0&yԛS-E]E(0XI5GXc DzhkR$`()m uMåkx`EnW(Ril@%Ռu` ={XJl$i ؁c;#^Iב kQ甅6;z+r@baitY^Q[PQQZp䠈BI`ZXZ A7xnߖXı/B|/ǟeEngvQpΎ20{)%4,RVQrr-V#g!o`R(ZD\A|A^J "n"6@tx@0qO-Īt܃{[ F.RZe(e?uj q˕>ޔYn)l|LO=Jj5՚[U Gc-p m k1 5V˸H\D[M~:k*L u浩]V둋;ZX m4H؏5k½a%/ARJaEbׯ [&== JGB%X]fp^<ͤkG)kR<˽$-lgk)x/ARDeEbwcRKyp$fPqozD׊WzD*޸Ɲ<;I+$̠b͹\VqemS\6)M-At~K㏚.! o ̷Qj7@CYz0M@%`o?GyԓCgCL!)kݫ\p{zL\=ֵ֣ꁃ5|R e`Qz,iRkVWk/7&|.9iCO  a7nc=R @px@K0J?ExKɊpvB9(snG(Ff ȜČ =Vp{bA5qJ+$gZ6'8vF+mxń̵EQ-cbIhBRk=j]8@EO0&ܓOj {]q0 q8FzNgn#&-:z.Bi{zt+b?چXzxƴf*&.e=il[GYZ0ޤCѐ\Ɋeؔ܎9Q%$>Z- \3m/r: IZd рPDq!+I@!Jn`õ\o(ehVv % Mn=pxVH`Ej3Y7YyY3+lqr9j=ZC[}`{@f}l3ӑ!] НٌG){Eu^ɽ4r-bL_#$uRPF[uڈYoG[淩d>>m #w5@Z0Uph`D_1ܬ&蘈us =+GSK(CrY yh}T/Ӛ ^Vdk<3L!pq CQlur: 5jz m1M㺽V,7uDP~vGm*w;*ˍD|JntI ⏥ ǺVAr? W8'p%HYgfrvxT<|I- u'5@F襉|"5@Ƚ8^;gE"${%c9?\')4p8`Z4C#pp^P>q@Z^#{ۑ(n%(H{=w}սBh{YaPn'`uF#M5Xx fIk6:d 1>R{޼eq-'6G$8i @¼9Xnk `, b |4@$$={+xʒJ6j V! N?O{ZD6!qV&kwvlK #_8e? MK80;yd/H@$FsP-eYvnqrٸsb 8; ,$G@(1Ye9RΔUk(1m%~ 4i#1H% מⵀ3k}_9ӼО8PHo"{p8H<,riX= t9 qжx Ʃ&<:umə#sL:`̄zO@ȦIN9FTkvrQ*6غ\ j,M{ojUsUb:C\uLwi,7Q%2wbPkt&Sսe֎zl^AKNȧ`ʝD*%,: 4^GGd\H6sנ׃pjӂS-rM)Fؓw/@Z!X֩'R#Gc,7rE!u\QH9>],5i1PC # 5q"G5 Fq}3@IX}' ׻-H9{|1@92OH,tiuƮ&#ܬVH\e%d([ F%VB{j]MoHnr YQ XfȨ}rp,.zGr}Ч۶/籍8|dP@dLvuL >9( \^Gΰh= `9,ub)I21TPo&wz $+;$FJz޼nۊޛ|YO3XG>e@Aϲ"%H☈onp43vwG=8SM:iBr4 {=k8 ]*љ͋5lI Hiʉ oCβ"O4 zؘ{0yJg?a +F>㸆qя>8!nAP ^qV$\$^rpt);42<\2qD'/vy[Q̐|9wkSnOcp ǖ]9XlmSP>w]}{AJA2ZVKՊf TȞԀK-0%A׀Ah8H۱q^ }ku9@\-Gfj! J8t`#fbSWt.R;wAw }V񴀬A>|EPK1J*k]Eo!"٬#q`5Ӛx68%HRk3]}#(62UE7ZFL~w+ +]#!C@)Qv|5i?wwIBo܃n׺R W H (::uCK״sYӒs,ctz]t˩WB..]: ]t@ttҥҥKKH..]t@ttҥҥKKH..]: ]t@tҥ裋7kp-ɵ%h:()_oy睋rM^|W_E =wS⵹Eh(ek@d@Q\^^5[ou|??7~?_y7kp-)@܋{ e5eZt@f!(% I/2{ |/~ϟ}kI?bA_wFkpxmgB(ex,H3Z kH?K/ӓ(,/_}o=w׿u_ߦ܋{ emhײtP: pւ.Rk(#<>~QnغaXԂhEM^QC(#esgYS!cԀA`Kj2C⠨(ˣ|o*=ޔP&GY)3e;|g*ϳS;H+!R qwPBI(hARQHg|Ћ{zr1sNPogYx&c2c0{!%( .JD ʔ*'bGeFks=y59'NQf3,<3 /^S7X1r1V`@)fU   (Y<7Grhŀgᙰ4<#jMP*wɚsҜR9J 2ᗣ01Px9@D?duҲXyg=:.XO] ( 5OzFoW`oDko@c{Ub9,1vKt:n c֤rp䬆t{2bK⣧`ܧ0_hR7,ZuAP7uE9`YcM: W`5Ph5yFw,!Z, EԽZJ`yc8 uD]Qg_&q-Zӭj!CCB 1ƨc ^ փgEY !P뇺iM[3]0 %>4' N\5R(O<.(L6& ԩC^;OS&.n -{rhXh5MH+@Q(r_ܫ^N&+њP툨TT4,A&}/(HLN!aq),9P85ѽnc]2ru@vFr WҔ_/AA8Xr@Qиs d0DKkBR)uKSԹbޭ@rv8hHJ3;@)4 YKͱ-P(U- L%gM C:nCSI)xle}w'NKAAE*}$KjM@i}:v|/6-h[t pn4n#4;DjԀQ C*(U eȚ# uL]^3HNsD8b?04`] PXʃ>xq{5,SA`꘺}Ŏ*Br1֭!2 ‰v4>o, F 9ѽj%AeKtEcG AYz{+edSh0j5ErN_"KR֚!ei!Ѫ In]9] Ϋrn ;`|ըT~^$b`ZAbMkA[Zw[}6˺!Z|ըcHӕ~Ws֣2kBb'%LӆghZJdBPNQswFi9X18{I1ajMZ-13i3iK AA9OúqUc C MpJ`H ,-̅ĘqƐPw eNj5"+wf+Pblfh#ڊ6\owxt?ivb+րcI0Tv{U p悲$t)mFiئGGNGuҸ ؕepQ"q9VҐwv!mߥxRH* eMBnFpCEǽz'h Igv!m#G9zZ9Ukw3 QENs2(d*$Npt1w\; ȘkECGAbV[Q`~0@3k2ʠxӶGwNGZV[~L;cj AEnV#S`jM@R[$mE:zP'pxoJܱ4c` )0Ľ-`L mBkɊ JcͳU\K}wq|S- \Pր]iSږ碭ݢhփT;a-j;rqG V1Ɛs:V`Z@i&%HJHB]5Hm&F7K=7/ tc@JKWip.)q+ch˴'ђBlf}i@}@x/NFl}#rܫ1A^F)+wb8u@ `~ *!=>m p莶 CppݫV+5tߡ#6[`xRzNmeEՄM?? \*fJ?뱏xY#ꔇS8dMN[xyP*GpI Kizu[+q4*dhfqH˔tr;gh#×ԒP=znb"p pāDm* BF^r.g;\q"<z6wڹWTkQ@^, 5R#riAB*%ڷ U{Rqt*Bt$ qs:Fw ܷ, 3Vn$E*4w)&-(yٮz|Ν)C5(k`P^7#"$) QwZ@<^_TZaKMs*MPtJŽr:8BF&kw;Rdg@eɽc!Fyb\5A] GŽE`WYcٙ䴏D^c ɽʍY:s]o2H7k.;йtw @tMP(wo$!|#eb]q &T$k. 4ܵ ;7;IXG!77Pp8 &[Lu5f*(t)2mq8]^MN5q=:~6:\ ȐP6vʻkeo17Hzz0޳y,r+ktbs6/%Swo7[0EERݩx,&8bN) ԉ,d H(cRܟ{Ԃ)פhJl{H͌ޣeSVR?<ĺrE!:1 u*JXrѹLYgq@W18w.k p{ :kcW%,!{G]ۯv"uTw5ё8d 7YQ 0T昛 -VDHvg]j_,uZ[틥{uLn ,*Ӵd-5ՊyHtJʖ,2]Nfnto,-fN9Y#X9ڎ27o{y'4)Suxҁ^V$d똄kƌ}FC7SM7?@@iB5 KB.)[Wkx㒀G uehURrbe;rD+rNz)#۟S^1ΉŭIkIa13G: 8čm|],b8d +R (0 G=h#3B\*( ʸWܰzcS@x>NXwv@X% z+ SZȭK90Q;rn" b;By s-?vĕb4 YWSD>#XCPL`T*uE"e^N7k=ӛ$Yf @X1HG@ W@1LB&6#WNˁ1i%ԁgCM2f-p'Dy1u ep(d*rZݫGk5uV,JkezH'udj7@ hD9T [Y|s{!w+d`=ҍZ਍;Z ϝ&Z!ӹz{X]Ai 26 ֧X!7 15=wcA\PJ}W-jXRjהk482)SnM2f_jEV$B fԀ׵CH)&ipݫxV1*aA}#%8}D]!If BPic3|SH 1n`5N:~,h$J h~CG[F %ת4A8 m8svs^$ ` =UkE&Vpk OC ZKA(ծҬcI8jFh3Y۞rNңWq1x 1}\o(ФYy~3hn ظ%:uao9 C3|MQ1z \%IݬY9ԂRKP([+SZ s!Rۜkz![G+bvˌVH)$s@L܎=t1*b 1BwV{ͩ 12\qڬHZIXjE*n Zj̅f\׊ 86>{ǝSa@{)([CTh `l G͔n5pr{Ҹ`JVHjZHjAF?5p̉;rhC~R`y՝4^/bjAjIj@)2+S-Gkܑuym35)ЀQ?uF5!Y1Xj7U %X̶r,e1:-π#T*L%eք,Sq\@1Ɩp8{.mkYsuH@TQq 4-Vd)HƬ(53P90JVc 8j]lu>mz$8HDlplG@jMJL )]o X x /7!jN5S!H&%Xj))Íb՘c9l Њݵ:, e$s݀5j㑹e 4[w)Wz` )wњr: V44mЎ I (C3$d "Kvl\[tZ!W#Gfj!YVp4Ǯ5%FÔ]2F $k2K 0xe"Ś`p;eCqJqGdF<ŲiX%! J xp?v21,.k>wR<ºfPKA2fMr,K*a#9P(Y9phMZk㰀ê % SHZ(%Xj rڅKk~;T10JVk9̩BN88 P.$q?-ϩpԤ[(%X-@ A1FHSuXVi9_- if)AbvK?6Mƚ@ K^滵PQc5٪s(c0#q$7-ŚԂR+Y C 9`p8}Du8ZH̞ft}(x XJ{UZ(qGMV@ 1&!85޸jK+4Wyc0h#Ro {e,es wp\ chP\)́eHtvԥrA}+mU 2$%6k&C`iǣZ@ՈYo ҷURD ͰDmx#&5g~tgHc Utbꉃ$N]3,9k>LSܮZXjpa CT,RLW>ƵqՀ q< zozv K 0UoZ˔{.-PWZXx%z@ I].zhM*qxIPj!{΃s h#Nq.j|N.յq%}#:wˆAg\$,*#5d FLj,u5z%0nk"hMeA)t/^Kز0+Z1}v&7Lv r!ϐ>CtV؁2 1F݊5q [x kq}?|&0I-bU (CpsEtMﻕRP~о/&cJTh_p }st}]k-@jϒ& s!dw(Ɣ|ӟ ___+_yKկH|]~o9k}l g^K_ҋ߸[ߺ;߹{߻??G??'?y/|w.cqL98&AI@6xpM\[/, "(xO 2(-OyDX_w?_oo-XS86Q 3t? K @)QHA(#Oo?׿Og%׿o-[9 ڸFk3Kt@'o~󛗧 ˓' ?^{Ex>;|sqNZ>64kYdZ=EQTJ8կ~(+غaX҂hE-\Z5r|{Ҫ$$OH Vyš=oQFи8(*ʅl?2Jh6 #p-H)*c}Sz ){Y;µfϸ{LA>&(OT`r■D*8(0 g*S(JYwqD>.{㚹v{ី7L~?mCM( ŬXOO0C_ @o@W `@z]zjhŀ{ឰ4#jMPh*dMnd54.oL(L #o- x+\vuZy{=6-lN]HnʂoM'7x#Z ~"*Cjn0Zp%f6m S$95c<=G/[sւ|/cL l⁶Mhڈl& 4>8%D0-VPD!07L¹c8 mD[f_&vU8P: ;Z 6drh\$`+ )o{ !PhۇiMh[3]Wv58 HXGSAgx)˰5e zf.p 5pĎo0t`] PXVO\Pb:6isW_A!9kLr@"Ut? ,xcM0` պpB&(,q'N=ld%aJ8|Z!N%Bщssw b@\(&ڞ>Y,pXW4XRUt v ƗZ0(8>яr&2ǚ\}@_niݝ p>MCeނ-G ǘhcHU|j52kRBCLKË2Lr=Ce) Ȍq$nEi9X w䥸b)k2ךZc+3KvaaW8٪Ak1!FI2j 遥78>J& qGlPFo)4DZq:5 ! p=L-?s 1Y^v/nG}F9X@bQ8gm`(u [h@YgrZ@Jqaӣ#Veh⚏պz'px]AZpL~c{q Vk%$1/u[p#YshyֵEc)rT²- qUzkh:Z~;wE?LwK܎`=h8:KR3.u0+j pD@Z)0TNǏ *s`e%[ qNǜ>Z2G[ 31,4$Pfv!j8Jr@3^LeII;6B;S<i]73pex@Pָc-VC1ނS NjUzacM@qV Յ4 UzhءA#7' PM\D@%,GO>XK+C=0FYЭZv=[2[KpDE$K9ZPȜAHfEH"XѺ$ C\#74accVp \l-g+-[iEhy 5k+f{YrO ܛ޸c 8pkp`Cz[X5|#U!]]5a2X)<)  Cf=P{,k0SVrW G-X pe26#=V-q ]o# =*KrvG9uO(FkUKJ< ~ Z}7\S,wjeUZ[ycZpQh2&$=Yq˙OoQnQ%qn>ILUҺ@uܪ2e:I-5n-qzE< tp:R#+$3oINE-pp/G A IK<ͲBf^>SeSݱAAuZaZpDH x@26:Ƥ 7k7@bi, \^ZָC;bZwJj#Vĵ t3l֩+-!5љ@#YqQ`5 [gpҾ, {C'8:1Uz+ LĔrKݫN,XZ!$B9\{ ?:tY@h:&Kp>ְ|ϴZփ;V8A' ͺ04 kʀAZLA9+1` > 8oCn?xކWL;8RkȘk+B n+Cn{< ma]n] Gѝi߹փF ~D+b;tV [=i51qz#fE)ZaWQ!;Ӱ6tŭ9AC&{[b: k ںWÀA2$kµQ:yyo$rF`Xcfc=([ d",,]Z]֩ ta@?W cZ֣VkEpxh uY{{1@ -⏘rbhpDޏHYYAo3D#ۧ-dWŔ{ںW{4gm7k) CGoQ="ek譅Y8ElaE Gdv%&I|I:A U^aA ri[.򰇛;+L,9kQ^)^S OKLzD@վ% GFCzJN:h}?n`kZEμz% !)_Nڳ'AW?%)wfA7Fїܳwʊuݵ'M6ALg5/s%LJꞻ6a-vys&Lm YWp_HZ8{A'M39&L9'ISf#Xwm@xхZNkƬN|~@!4 > 1'}rWwzV|7Kn='{Nj\8Xhs6Zmj=hX$֫H,7{]WV~Msz ȕ2h-'K8gwW@dј\'hҊHW ̹9++bAuu<1u @ʵ ɚ[rf]mœyiSڼ|ϝzs]?:nvBrHCp1ždzd} t y-E+uNt"#ܫb0_LCZOXhEZl;z 'V|q? ZGXqdwj X- A2|Zׄch܃͉3yi_޽ CnV? ((h)<=K}ND)dJJ~8v !8V10Gx`Wñ \+=8x@,`|?%j=.~S׭\ ǘk54`jrX% iGihEzcTfk(prJ`Gגͪq%kRR<^@9.Ci'27`!Pz:z иi_z8N]x _y4^^{ܬHZAiGc[zå\8⎱AADqz>wSοw![G+bv|􌋌Zk@9k1R8\W1k%f=ԁOHiEh9 q1Wk)$=֤J ,sc{ZZR8rJ ~Gz< cXM6zk ސ2c,9Vc 8ji]]88ݜkhYGq@bFINAˍv֌G@ J ,sZ F/sZ I҇|sR9aZ+b4bNjMAkIZ@e.01P:Kc`̵-qPZ1#zttG%rt9tS.m)Wk)$k210ǿ_-+r- XGdFK3`wJӈSY-!ie 9Д>=׷}>ꐀ M! @uG,NJɔ5:L부1f5րz?tj.x8 qStr7YI5e.4wԒ9ף1f(F莃pZAbj9O9s!Hְ&c"\iݡsծkXb9 Њݵ:, e$sހ1Z㑥,e.4qOAk%coFkjȵJ@]h l@ڠP`ifJ9LQb bPlQ]2jеxhxV+$k2ޚX}T;Lѵ:< Cs|vc@(C3$n5tumF }`A%Cn3w$ .OϮ \P`遇Ϲ\+>zc)-x]X=84 c#(sG |Bɔ5,5֊oBQcj,C ob9Vkka+EчUAbDKZ!P`iuC0Ƙh#ZfgЀ ji!AHZRd1Xq) jw:VkGO H٢C 1*o&5P",i c껭PLb5٪188P* 1#qVcMZAkZ1(Qa+q @Z!e4#CRP2&̾sib 1w4kůiĘ-\\5޸e h6wa ^0j.񆫰Krm.ǩNsM- 7 u@qX.V(z(]*@Nv7(wbp)HLd6n\b{^k2,`5= LAFj,`7 }8% c8蠔ArOxolK+0Q;?z~3v{(c iRx#.iAK฾+fhYju]LQCzkT|XDp噸| qj@ q[(<`{n(w`DwtjĶ4s txEkbV)Ge ꭴk@F,q.jyʥ:;d*.q'O@kt@(k LA;Y62KE[ri&(Qv:݁F}(_e>q-0+UZ1}>L\ynUe$ZW 8Aq,%(ѪL 14Z0PͶ:VvW㒀 ARZ2틏AQI\Tq ݰ`Ub պs}Aa5|8D0PMY+qY@ZIEkaPKVLFE7_*h){7S|ӴܣS ȵ*%b5ktb⊆(G>Rb; h}w>_!O.c5 1F݊?x*@5nj|&0ZV1*\CpnsEtNﻔRk$_(Ohc1%*4yڎ/89{>.]U pn!!|=F~+L`<- c@qVe ga|OKV] NօV0͂ ]"H@VE1d@|D [%C`$ eO`À]sBlʐEw,n8q-ܚ ElJ 05qq%@$ `iQ൥ڲ/GO;|[8d' т[֓B?xR'ןg_o^~;s}w?ϯ/䗿7cp,ɱ9-hds0j;Χ`x׮o֓r-?w_}OD ;|,sYkڦ’:,(#Way $o;|sqNZ>64kYdZ=EQTJ8~(+KGuðъ[͹8ǵkZ=rUIH 0lI5{(+y2|~x#Z ~ DM=\˜b=5mBmoǬIrpԬtdSS'o}:1)ZmA6mE9`cM;(BO;rnZ*k1چ6h3/ZXuFkr9+(NY29t4.c^0Pr+seh3zZږL R21n68Epc G 5@2٘2P y?mL[8$3{rXh5x :PW,WQRcL%V *FkBAD۷\@8RRѱ^i5P Ԅc?_l),5Ph85ѽmic]2r% A'9I+i_WOAA8r@ѣsS 1\X. mH[Ҧ-mL[΋{grpБtfw%t YKkX)PLa 2ǚӆ%mJZCI+xO@v4W̾D]9Vc-({ GL&PڞYE}rH.gy!u\$TSFk GLeȚ" mL[^39${9"c"L=Xoc.(֘D8j\Pb:6isW_A!טnpV~'eqtP&K`)?p|_^XRrXi9}1ޣφ I@Vfç4X)tֽX˽a]`}JV1ؙ7_j5z DQ^XẔ&5A[Zw{rp>MCeނ-GTMe5zRּr>pX@cMJH|iI|xWCg,%a4ܭ(17WpY5(җׂe5jIIL/9=[ixVyՎs{gWcC \S18d ,S@Y 1 }8!ӡo2! -9:9{TɮLĔr[Wv" Z=ejЗcάD(,~N.9ixJqd)nܧ0:g G8]Ê2Z1.N&?sbͺ4 kʀCp>*l\bEu.(.d3zbBm̥-@T GA9-)'1n+G!=?p0.7]V I[xd8Ch=H X-l{<[QL)A^(A$tBiELj1tŭ9A1 :h}?W)V\+g-O΃8mOH7 1ռaa|y-3>Tv S4$y$`G1F3ajM@8^!m Cd CG#t]T)}Jkɻ$A_}n6茓8}: OI#\@Xu1Ah[o9CG8^ G4BKxMX{j2IN쵪r+ueEi٤1ܬ=wpu.QGX3Ż+ fhLvu ,$-Hڊ`'fNH6@›ɚ[r2Ipcm^Ndf=`Ԯ@^;PkE8Z';>s+MoR71Po ߣ!%qa-P]*912qr̃vc##/j݂H>H9q[쾉KN/B'p4 s(}`V=ȣX$9|랛#<1yB(N *^ܘ~. -H]8zhdU:qБ3{H58z۲5mNp kN7el2ϱ" -$QseBƵT= CnV1XkEzEƪ}9,R{U. $Bc=<o6UN\MFbEZc#c%Ʉ1p6_b=c7ᜮbҪ:% `qDZbEZc^s](_{y8Ukp̱; Z4VVd HLDҟm mi}Z tcw@*|M0z;Պj-$"rpbUn \8 9#96wMV2.25 (1Pz R8imd~8@J+bFiLjMd5",녣8t,;Z9jn%sأf=V,BO)%({C2RV^cc*Txk%z NJn5p 1q hiΚHzA酅sqS1( 1Z+7 Íq֥rœyC*b4bN2d%K/0Ŗ58jc(3VEVz Vos\ě]w:)K{Z ڠ+V'3R^8\1.-YCihxQU8PŹ88)`K }$+wط^5W7 Є*:K1Ŋɘ5!]K0ÈWCNmpz<9@'f;丁xd $SI 1Fj̅q*xi(;j WyQ A5i ̐D8ⱆU%Vm Auf)]-3t$Gh\,d)(S橌o*kc91LA~4ZVCUjE3l`K.W$= L)cp v]-0¡˵@1(qM6DV]dբkS3[ J/8sY \8t,;GÔ-V7P<\v;D=l,Sѝc\ sb1 @rK\Ew$ .OϮ \PZxc ]0 -x]Xi#HO &5PX-1bZx-s<7 HEV-Io^B2՚ ҂&Na)#ZfM2;1IO x5K R jD8| w:Vk- efiAbvK?V&cMj̅Eq=_ =V#Кj92V NĎq$)֤,5h(5s ]\0J8,qyAu8^H|z=1PD8GzXF !7Z3q7AbLBpHgjqk (-X"4K;еMRo kd,brp ci%0ᦡ(\s@ KcLѧH/S(]*@Nv7(wu٣3qwA`" }w;M&C`A(X G-(zY񆁹X>w H 2(6].056%Q):=o#UtbꉃgnAK฾+fhYju]cD8z,@1NŇEZ W*W8$1.~ eM`S0]CLaYwU2jmՈmird IY:/%15[ 0bI3tQk.Z18 cqc>}ZeGǠJ-Fi2^R^ԨY*-L`k6Юb;Ш] W е#d0q.gd hM\-WűDR%17nY6TG0jNcVlp!HJk3]}#(*ks*` GQTkRp`8i;g㴀X@ݩboxǟ|ӴܣS ȵ*%b5ktbm(G>Rb o؄[!v>_!O.c5 1F݊ѬC2q8T31B8ss ¹͙9RJ ƃ2]#B}B@)Qv|9e7οwuI2As 3A7{]GaiARWTn(c˂xTpn͆{$%+ǮYc'xB[/2ݚE Ⱥ-Z*#,.{z  Xd3P/cq--7ܦ^(d3PzJᎍ,"H@Gז)ז}0k3|W ]d_$ M$ )) HJJ$ ))) HJJ$ )) HJJ$ )) HJJ$ )) HJJܪW}1IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/shutter_anim/shutter_anim_06.png0000644000076500000000000002036512665102040024746 0ustar devwheel00000000000000PNG  IHDRX IDATxw$I`1-ɾL@6Oy9 /p/yկ~u}~Ͽoϯ~wr 1&8Y>^|ŋB7(z~ӟo>;w}{|>;|[8&sA$ QS~o.׿^>O}-Z5ccs.>ǵq\+gC % R8_.Oy'=Or6}/8/|w.9Bõ} hײ$(  {b;|駟^eo(n ZwK9õq\+{}G* ɝ-Ufxe \S;|*98\5y}\+̵=iW^sArGC7T*>?2Jh6 #p-H)*c=Y7fIE(F^={3 C1na[D(LrX(vTfiqN]^5s=qo#0چ6QY a^Ax;* @t%5hTb@ϽpOX{5&(q m{&{|NSBW 7GIpAP&r& ϷXBZXxt:G?z`UG5mCVI:59'ȎV :1F+K(/j9y'=E~ӟV]h3zZږL 9 R21nop2J׹y?0=u`+h+uڐ᧍ikGtx w;%Vc x(Z+0D0Z8b0O[1 mjzmr% W,.KIVک`, pp3{؛"Duxo(˕\ :y$YzVt`ɦat".Z!0@k~ກuI+,}Zh{@HB[bENuUN)[EP`g`܎j8-0kb[s}uwzoߺHN4\- r髱y* V@&bPC1 2ŚӒLӇ\OWYJ2!(h\ɹ[Qc0ި2j, 9}~gd%1&>s04>0[;*ic }ԄϬ?d ,c@ 1 }8!Ӯo2" -}xWת;Xr0-Nph02!0P8qF}ꭸqҐww!}}H3Q4. ʜZEnt́c*ҐhqWu_ )+;,㑽f=t,UZĸÕ9Z2j@#̅ϡ2ǚLG3qJպk@\+:Ow8 RV8c8Na,(sH+vݻu[֊ֵ"Jclr ǐP9.iڱqQ>PZHZvۗ4ueN{4 \'wĀ<2.0K+-\B2Vxtm!ñdEN{ ]JK1Y*NGd)`gL\;We H\>oc%`=K&r0vRxGm бTgr>PX>H⑚ }M¥sx`EN{4KR3._G G T ng̉ONe%[ qNǜ>Zt2k[ 31,4$0&kUp\3ΘcQ-!jE;6B;S\i]73OymZiV8ǵ!-HZ)ǡk^ 5+rh@j0HѰs\+;22:F~$s9VҊ\;uU@h$cj [ZNZP^[g\VdjjiE\c肱H-uH@=H홹*GKZwȵ2(/㌥VB22[Z3ZƵEnMJYKX".8n=XlxŊXнBbktPԬweWs.u3ZuR;g-[JHZ1YZ,wu5 9]+Krvǒ~`thYZc} 8ݵkcORuoqԲ>Hq\rӛ򽖛uVI{ܣyRyc=`){3断c]1"qN8]V) 癷vZ $ݩ iot +8]h85ܬ5+GB|J0|ljwzd±\|:Ƥ :r 7k3@b&}GC`IXXְ ȲDwu +Z:3lMWZBC0j)e^#YfH;v-A'yyғM!PM{bJܫdy@?"f[t=u:, 40Y 鰖3} bV >'>YŠzΠ;[f?hn5ke@fr{)Gp q 5Ro_L >wp B?XM|BM4\#9m9a%pd9@F׵X*_>E7,`unFY3qzZ#+-<{Vn['uZRdy@JH kGy %3m9 _ѐ]c3XcG C\f8nttkuY7 371׽J@:.q)mm0$V@"EsX5X m"$% QwY@^_T`Kw ȶL,}uEQ$@d-+9 5+ Lrd 57\:͛~+y H(i@C2:@ar qP]qGc ¹НC8FL7M#PXYUw9!γM֛+dj^cW7ZBg|nfhH*21/`In9D# :ktsj”sҝ4Oi6 29~fւtY,90C i@|JW1f-9'sһ:b>2$Z:ܴU*>UMDDt$l_++JO&ݬ2k0'NcRWGq`y呂ɢ1M۹NOT/4>avi`'fH6@£1Z{Pڼd) ;4.Snu-qJWMWrbe!]^7L@ PtA \qM!XHג9tw*2XCpL~3[\ gx.ޠ{kxkNe/Z@W|nx]qn۲@0K2T~oOR۬qmYz:>˽: Cn]HP3KY8xH*=:1H{2ŵOݤ:r jQkCCZOXF]) *p]z\s$|3[&C+72>8~KJ~k=j .ԪwHo ֧ZV\?㹙=Gl.8X>..)k\Nah 1V*!Ap/| &V]% - ]XULj H_N8Ncͱ"S]$>j|brgyp}ptas\]kD+FYˊ́}fp% S>:ucs@*|M0z;֊Lj@B񴵬 V1u.[G+bv|ڌBZ|x=q}ʇ1[e;@J+bFijɞ.3|}`A{ZFͭw{Ԭ]7{i2e+HAho8c 8J@h))kŞ#P G mjٕJ@6$vH'&DX3,Cs0ޠ o&Q @Z!e4#]\PjgoZ 0,gf9GfĘr KWsx1.PbAv; }P63pvpX6ye8n !H4pP\)M@B1Xj @2bV27$&Ʈ`o5n@9$k0E 5100gSjMJa.o=66qF9?b[Z E  SubꉃGfAK\ӎs -K͚Ӑe[Ҷ-.R.w*>,RL\Wtz [$%o Vꋧ`tj4X }+`DwtjĶ4sndIY#(AaX #8O5OEL\ynQa$ZYu8c~ 4C玕}Re; YqH@ )Itǎ$eٟ`Z!rݧh]ʇCq Ր8"ŚDPN dkT$~F`<Eo%\r%iG2kUJ0j -$*VVT.|[֥Bq}.6A,^o} >,V5w+~oV KԸ s}~|BR^zh!QɹhL~w)P~L|_ MƔ{i;2߻vYV¹P=qARWTn(cqTTpOH|OKV] NօV0d,(%,5ۛE, cA-nPtO =݃1w E(]ݱĵpknS+ F(- {tpE`$ WE1ז}%z䦁YZ/&aH@RR$%%III@RR$%%III@RR$%%III@RR$%%IIII@RR$%%III@RR*_.T9 IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/shutter_anim/shutter_anim_07.png0000644000076500000000000001737512665102040024756 0ustar devwheel00000000000000PNG  IHDRXIDATx8@303 ۿ _|Kq 98\$`O?(o޿{o?~x> 3Xw9✜>h`駟 ow9(7 R_{ñ/-т8cK->pM\TXR=-ʈ⢴*,Dz뭃5O_~~mgñ|r97k55ja'aI@C(PJQ7edfO>d?sgqג+,k98Fkw9Lh5r\3q5Xd2Z K(23(,7n?駃/5q [>oBõp<4kYdZ=EQTJFx\Fm ed3?(+KGuðъp ǖs[ǵp 5r|{Ҫ$$W0lI2š=QFFh\BP6Fyc>*)M~kZ&k嚹vxIȽ?N$(WT0tCL,fP:gaт9wQ*?~ aG|g9s'QpOܛ)h1tý \\W%"FLe*B2KK޸f{^'{3_mh%0r1W`)fU  D (٩V  K=rf61b0MdwMVIsRJ!( .ʄ_mñДnX*ܳڂ6mh#ڊ6sr5I@jjO#>\BZ \XG5mCVIDkT8P: ;Z 6drh\$cXByr*X@Mlڊ635m96f. ݥa@J&Ƣ>: :.)\ ?{vA^meN~ژ6qqi.)ܓGpF(nC=(*5 5U{y{~v0h'.igyڊIhMhSD}˕lY*]*: rq+JoƍX%wqA xܪ$^w|Ԛ^Ѷ. eࠓ\FGRJ?>t0jN pй|E@`1E )1>њІ%mJƴ5mHvIGiqȸXRA! >G)pL ׄtwr\)ڨ| iCڒ6m-i{[/xO@V2W̾DAڑQ\((8Fqc_&ױ bS@qĉFĹ#h{O.% ҐY Y 3Tv: { AA)Q|]&BM˚# mL[^3HvsD8b?Ez:LѼBc.(֐pd#]@  Cִ8PEH5&9@"Utq B;:Ny睋q |qT j9jJ-e\b$YzG+:edS0'J0l !0@UKxmS@kM!Ѫ Inٝ U QJ/t.[}6˺;!Z|+}KZb5Ƃ!qk19֤ALKE_idFPNѸNs4CC!%k5jPp^ XI5jIIϜL/99փrՇu]fb MY^2GqB-Hd$$$7Oҿ Ȅ#6(2:Vt D; 1~zMH%;}av>3εx#XF bɩƩcp`czmHJPĕg}xdתkUlhĮ,-gWkppXZqnww!}}H3Q4. ʚX[N͊{KO%$Ow+;,VGvY]+K1p?c)p2TK`$Z>PBbS%}j]5 CG&n9Kq@l }enWK+➿@EjkރԞzIVt{uzHZ}K+bF z^d3@5쭤e채!"Vb-t5~QԬ^]7#ŠTB2'UEBx9~++*4y%I $s} 8}j&ƞk=bmV 㼈+}>)߭ܬV%l|HLY,ot]@'\lU ҽA:1փdycEbׯ nn G VOM֬ʻ$딿'nj7L;-e=ȟ?ݜnqetAWЙZ6+-!5Ŕ.F2k=Tm! }t :BnUz* ,ZMĔ:뽔{C+SdE?>QB0K @qGgj[@A' Aw֮ڭ04ӬKA2Γ;|w8dE_m [}.;'Ièqn8Ofa]gc1X2{u)akχ֞i5SJW.a=]H8clW+>mݚ1\7- {& X@ Π;|jX$r:5^:P&u_4u5U[ٌU)LI_/}X̺E[s'ԚfF(6R!(' qoD|R3-2X^T{'Yv2fk::bBgL*pñ3/h?9ړgS!۔X[΅0!)gt%'km*[+ˍ,1H{ňEkꍐJNtA6r8{@%$=P)CCwGG(DgtH8:Fn9zfa6j!!61舖A,Zܭ9IH#1MĖFb$woowcfB_w莁Zbʭ},Rz@r6MBb*9-Ȝoئq퀀$uk޳ǫ]˒'\@z[^2M;Bc}OL@ nKzu1Hbs $wOl@|L[ԕ\, VgӎAz$ZCmWi Mˎ4H7!$M@]fd,Vt"L0;Z( ')ݘP' C.n0p*5AR$K-/9Xj3Ea}?n`(t'[^28AW\?.}rwfr>E_6zIl^)1Ș 8-3k>vSJ*21/?WI{I Svz8t]AgB.jk]4Oi6bhGmfv)2QƬ.Bb1P)i1[d:bsd.8Yhik̊IWmZ1@tёXn WYQ 04搛BH H{{ {y'L ,t'/I*e{%Kfit'f.ro,-M o(UQOHp`$2f|Ԫ?:>zl^NI잸Tanp>KMW:@d캐 D8n+]Eg H_ɉfsj^KXRt¸@}GO u^ĺ, _? tC=1~]9:7_&hLF]vO\*@8? acS@P~̩l SHBܧ nԪw/ .7KR+ϵ" :%ssQ _{r @,w9ц*|X4Zcs]Lj.`qF:Ɗqec={Ϋ˽Up ZF TV$!9MyzN]zHW<T/Z5IHe!8Zݵ+w$nn->s2/26IH1ǘ2PjS_ 12\fR΋Lj%$ǕOZfͭ{N{ԬU7{B:L)AIHN21%%z C׶>[ 1q HGS_2IHS8CR`Z+b4pT1R;Lu IK2}clQ漶zv[Ϸ*Jlrv54.\c!ps+ҷ X-YMѢ|EӈCYdyˁܼys2)}{oϷjU4u8]%)V$!Ξ>Mzui}JZgGsOOv08NGq@ ϲ y\ Нk WuQtA2Ka^j#`IZ="VRZf8PR: иclt[t+q-;f۠ID1%@iƍv&,e.j}`poPnɐ;#7.O. I([@R5(QQCpx-x]Xh=hx<׎9B-ɐ5Yk2^P)P1S:¡7Gê %L&Ko-~!6낡1`t(X1," MTkwOe B2&<՚@ IcY]\vr#ߝZr- efL~52 CqDP ᰼Db٦^{fW*Y 1#qV2ŚI]蚠[ >(P^Gl7Gp]G.d,$^fOL3: G Kݥ8Au)121`Dq-7{f21 !%S\c "Vrl;v {.[rmn;g$t{j `P'\(( n8 X熝JB1%*9 ڧAdZ fd'`狠,08B(\!(ƀc 1fca`.(YNJ9g%\oF1CnI5\Ss( k*T1ވ[IKlAKqe&ۤedC sOtRLWƹqրAP+J`(AO2cd5K kJϥ:g8!HJ.ZJu%^cY%9Eih\s"KpDtvˎAg ɒJj붞%1Qk#T%(8@XAk,;D>w /PZlx c2'LynZdhM_Rb,k@3۱:oX#qbl!qip\$ ]$fLcGPT2U\E7l 0c!sݧhݓ!<`jj\" kAZ4ԒSQ s}D-pvk-7M=ـ\Rq-VjcMbnUQxOȑ.%fs k׳x5:\ZcܭYd.(nQc\Sq31|J롅pE%5D cδ}RJ0) al"0DNЗ1G|O{8KzneH- >t|+uM`\- }@1թ",*0gA[*#7S>Ӓs,spĽpknX(dfhޣ+;4/r  F,cxirmٗ Hs,˾J@%"Ih$%%III@RR$%%IIII@RR$%%III@RR$%%III@RR$%%III@RR$%U?2 />IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/shutter_anim/shutter_anim_08.png0000644000076500000000000001563612665102040024755 0ustar devwheel00000000000000PNG  IHDRXeIDATxՒ+E=w 3333o,G"wE w$r裏CP;„P( P( P( P( P( BH(BH(BH(BH(BH(P2=#g8 _d3*OdL>{O>8Ї~x 5{ ;.7-~4Jrv`)SO=/0~({xo`-^ᚸc@ B(.J*? o|'j??o5{ ;.S[Zk0]  @)QHVq ՛U^0|of/w}/U_K/ߴ =Z#>w]-^4~kV׸6(RX] J_Vy\z?x@k>}~7 .@%@ @ѴdpQT,U7FYyg}vPnǦغaXъXn~õq\+{}GiU `ؒZe5{(+и8(*l($OWaIo\5y}\+̵=iWArA9!R qwPBI(`т4IvT{*?}YTZfϸ{LA>(0-ApUpqP"aTrX(vUfTAo޸f{^'{5_oPlj\ X="zy婢 (ٹ 4Td@ϽpOX{5&Pq %Y%Y ^'ͩK+ᛣ$ (~9 S T`o)u6b =r<ǽx!_*]_Hvߚ'+7o/`oTkgMOEFRcѸLxc0kYdhzR*$>zm`.hnX*ܳxO -ܴ1 *(v&+uxV16q5o`W!Xj5Xa&Xwy@Xxx O-<}1o+ ٭J3;@Ŗ HVZ{Iǖ` Kx om^Ȅo/9} NVJi~/x 2Hv[6HCfQFXN.U> ĉ,^^!l$U0M+bO, pMcx ϝBUA֘d5֭B6>s3ި &Hq 72Ir"aJpZ!MA` nG,$]Fsx V]Zn-యmRU;]Uu"G@b  -{k@[8xFe߂Bn_GҺWKjI\)`d,R+\(1Q}@%1&YLDt AnA9a LӮX'q?1$2J GToi4du"hLJ_@.z\Ӥ}@,n!#d̐{]wDz&msg8=@NNHCUKGvKuqXf|dab=NC~{>*Zqg;/Cҡ}HSh0'#(iӾC d e3Yj}d4ke֢N3uOO,8};+Hlpt*uur`9tVw8s 8xB/;$ʠx"ۥZeZGo%ql܁P=/Յh(h7AƓXW /-[ ~[pcL{\}ǺZ#BK"排4*ie}ǺZZg"{t]0ihm ]uR{fcLZWA l]1VVČ1w]d6X5hf+f{c=, bkEZ^ U]@ڬL2՜8 CF1;֊XBi.++Yaպ1{Xx>Ɗ {t]] @ S00XٺO"kdnu]{.7k7WK{=Ǭu_غG.$P :._GWj^|ljWl.5Ɗ`_4[sY9+#A.386} i7&UOБ9ܬRW0;%aZ[m'۴"ZF7tif }%0)}0ךGnÊPGt :z2)@0BRn~{m뤱nNx.9C J qW1#ެ׊PkE tC=AgН{vS0t2  Fn >WݰN) qLq0hqϘa ue8d7e lL#M7;w۬Gm QaSCvS?<:fZ >둴Jj1tţܦ즬ЌJ>dr<7[]a<$t)!+L$ABLP+h/0f&Ym}YP 5Ub=.0ZA' 碩3eMOh4=@Glf#PMYAZ`B5 X)+92X^4<#&tdMn`&%Y 'IeUQGGtL5Tn7U%+O "bH.O]AgtkBp/%twH.8PΠ;b"[mg5fa|˥?H#Ztiq7eIt-LmCBr]-,=1pX8@X9&E`(BԽ 6-3[+@Es5wx5#[*y= M;34c9M&j.VA6 3iW`R Q+{Ai^sNyoHtXĥOkhH-P:jn0xm5PX\p8 }״g+ Vc9'Ml>t^fIY@GCSKlYnЃQ%+@;VA7 PG,,O fHәsNV[&+sy/czs, ;5 4gchy 4)LVd[Ԕo[˓zI?:lm[ N舭&Scc3Po$Kmߪ6QuC]jR\%@ZN G0Cq 6`C >OG:"!9v1cJG tC=1~bE">%+L3o=a@ t@7Б3SUgH(d{iw8@+tjiZf8G`.1d*#VpqqY.*jU3~e|Xm^IҾ9vLA 2s@uZ- ]nGxlEOlAWƪʨ-0DjGˎ6hw $iӜFd`1Рܖ!;k#.'ӟI^(1],|,=X4@#x1s^i]›XqZ5ckEчuud(pO\\lt-X4@vO@wyZ1pҾMGJVp~֡|r,9(_-@-[6y٪>p U2H`Gb-E'APyfuuԅj X@ƂiF+]{2ar8V!",GX:ϩ%M+i5]* ;CadX@@М%`ZPl\+! m. ۠= ʓiAVH,&R׸D߸qetDFx\s[*Xj\ȹW5|d?T5ިzjp X-@@R[p|W'fhYڬsjl Yc>5pW!a*8HDFZ 'ԹmX+8V >Ը-̎RV@Q_*+Uзt5 +ZjT^Tk2JW .*)r]C>UwJ+oZ!j@kn)tY?95XEm׫;Y{ոhY*xw4%`l c 5ʎ-4s mm+KK׵ɏzd\L<UY ZgkZJQU ]ZXmijl HH֤fLcW$2Uݰ1 |S(L:šԴ!Epl cI@ݭ8{*VWQT O{Z7M=ـ\ƥXkRVT.\RbACRѸ>Mh}j,^o|XcYZc[f5. W#j<=ծ>_Wh^0i=䷹j>m o9]>{KݎeZ8=FXWꒀqIPnj[}Ǧr}sZ&wYc'k$ AVC` Ė!^'l~gm{o_|^+/N1\>g<!ȅcz_x_{7hzwi{o??l?裝|;3|N} QB 'F͟y{o._ݹ]уcù]xkNK` /RpL.eI$o}Y7ߴ?c/{_w?Nc9g,w7% \ר%/bH r@  #7dOw?_:I^}ջ7|U=I6ky{#Kz 58F꯾j7 XFzFr[ o۟~w믿ys8)iچq=K$G[P="DXQ0@FFy/vv ]~7oz}\ pm\#^_'{zdc9$Va7`oMP$|E o6pM^5sܓ^{o("iab)dpZMt$ΒEFgIonyի>؞<@4^3|N7I53{ី7KІ!ʆr(` I B\@DBH .87+WE~7xo\3=p/=/G7Pko3W`)1 q @FZd8VkjBϽpOx{&QЉy I%9 ) bs@BLM+)ua.YLGc;:@ - 9)}22||z 7o򁹓bHv.ܣy.G'd:Nz(4AV(:#L;meI]І-){̭jLutV;֑`KIllVj=knPnV.{e"6ĖNX9yfn[~Qk xm -6n4pΖ3! jiOw.BƦ=ubLbFqlͳ-|6ۃ`^ ys s΃E2#`K)΍`{W9x K14׽ck6q }^d\yK>\2Z66z+Z{P` {袼-n$IX>Mc{0E*Z$м=+W]6ʾ]/bE lL=/2A5deﱍ.E X]_AO7OeWk=8xT^KYQy5>,/y0j;EX>ѐj B,97L_l\Q'`ݛՌuZ2!C)4$i` Γ04fLJ P^$!VC1?|dhb>6) }il 0 bghǫ.޼$ +bG, d  "g jZ؝IM;CRW[浖cBȡ2/XqmL0;1bMVB_?5 }&`̀Ua?n%Y1׬6Xqs](>֛}0 d#}`-1~;ڂ)\%Gvڗ%dTo#`7KZ0tMSZqF@G.K`j5r]MԩFS("U#`&`iU6B[敒]@B.Fj+ugEhdtS(.]al',J+Y,۹OH7RK`}; t21ДPF6ͫO"iķL>㠓GtFl5;A:&vu$/oņXjR\$A|6Dj&;L~t REH! !N_|xqFI bJF$0#3c͠OBxIbLwg8Q8EqCȚ7\v-`٨`{0 XVJ:ℏ r6 ̘W\&p,%fxpY sc20Dz1B Vrfcͱ=` W ȡ0WPF@-އt)«b5^\=( w[k97`^)Ǥ#w"|+[&Iַ#\Ê|Ud(2ԋZlW, =98 t{儖ọ]lͱZ%A%(u/M!T,a@)". S{ 2k9XU/rʕjeM`؝$Hܺz[.uvb[UbosEh TEvMtm| 4 Ⱦ\: Fhu\5`c;ж>Sc-' fP" .7 [RcSC*ٟWA518X2e-%mlkͧjJ5AQ'>eq%E Za;')51Ě zPױOVm56jZP"-иe(کa;6`Slk?O jQZ`pD/_g.[;CSZpreA{h5[tC-+u#$ul@ئeVBPa+êhPί8a3\Cd(bG8Mܹ`DI6;,1=AײMڝDuV:`'Mm8>7!'㜛7o n f嚏&Ⱦ|<׎9B$ӒCoa5vksd_+1S5@$opGt]=GwUjBYd(ixq?- Rt)_l)9ס}s9)_,A- $VXxċDV[ UBHR :IҖr1#sTk "r,IXft= x ev֋!!b,tw>wU>!B*[݅=2ݻ6Y:9EC$h%a$ uB1+϶ @)Q$;#jՒɱ8"Vbk^B)By2d@G&; r, HdRvRC.y.b!U7V=up X,AHR[cϛ0*t5g 5|r[sYZc[t5)(nQc\S:B󞄱<Kkǜ]qR 16NKR~DGhKs cITyi;zEc>|.w- I{܃aǏ DdI9GJ y^w>cz.wys'x$Ֆc,ANK.Y772D>R!ȹE8fBIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash-mask.png0000644000076500000000000000254712665102054021467 0ustar devwheel00000000000000PNG  IHDR]H4tEXtSoftwareAdobe ImageReadyqe<PLTEU~IDATxсHCA97= y-T<_'}6ٳ&nO{nn ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^Wv|a׫v|a/z®^^]/b ^>xzavz®^^+ ^ՃWvz®W^1_]bՃWvz®W^^]x^/iw4^<io4^<ig4^<i_x3wu54h_^8H`nnn n˿ @/, bD{crQ_w&q>#f!57|X 6To ~#|O~/<\nװN.t|pKY{,z}N٭W?iZ08  eOI-gAK%ŏ9+wYYE={51 i2!͜Q 1JHs?m#T/a3 YJb -0Mv % MR7XRUQQpWϠb&:KԥT۠GQ?#W~cAb@[ױcmoo߿qqmmu::mσ%`2uԩe74ׯ?:ؕ+W}!]o>~#( y삟1Y"'I#@V)$t3hW9a(AyIwNUᵎˆUZ.o%pu"Jk蕻2k'crZRh3.7Cz~(Tp cW1[`Rali燆ɡFFAɳRg%Ca#kɎ&gQhzaƈy-^)ȵlXݯ#Ggmnn7nϞEvvNK7nNcu3K1sK+6j&'\(8DX# X[)4*S؏kk;yy]`uė|o>$_(,jpT jA7 r22V8cSi9r-Ri\B)ϯZ yr~)}ߣ Oҧu1 Z` ;HC y8 -%K"dtE`> TwNNsAMTvu0!6[ 'PS'ZL\`\hGC6Ju?5 G:i9?Ϝ>흝/ZTAj<*(! 2!iA0yBVMߪ SfΣĵk~'Տ~2uϱ=DWyQIa^>JZ*ʉ~v7}啠- ބFHh󤇉VT]ևRN! Ti knf ,GK3 D}XQ{!K7QvCgW *z?O6A D Ю96j׃)c໤ZK*3b0;-@\kTs롊_ ӧ/P=dr0UF($l ji EZ;5KlI_G!$S>lعπy勯yׯSO=z?rE_/*'39d#;JgQ'|Z•)Ck2yΦa,#uR#SMҠQSg6F 'q癩$o\֡9a<M: ,-!ejfzn'=^SU%Q[.e7ۄ 4[S8aC@JeR]u; FFRM> gd ؏h#J̙=z+6_f慇)K3ߵ@u/ פn Jjb~667^~www_qW~G>_W~OJ_꣒\x^T`-L.pp i CֽcK9_-6zX! >3RtAX6)ph$`qHHo]˜ɞg O{2WeŰ )Z :&ZedTYTV m0BH{P@H) $U'4mCtGY]7=An{{ӧȑ0i /ZxJ0JjR eRT%xJvǕD ,?w}}m'N'\Ox≟'?<%AbC |߳H"=2/Ƶ3j,#0(U`jr_J lĢ O.Pb=nH%4kSS%Cja9 N&GZ.U8?"+RLTp[%Q:"I~_VmpZBE{9E{4[ 8jڃ0ex^g7& t1@ܹs/ 9׏pY&/ "+1rPDRMxeNVB\y'WYĀ0w=Ϗ~ovZO>䇆TdN:*P55&ʘ8ν!jj|n V@4+ Y ATbQq1p aPET"84aQr2֨q6y7A^PKKĄMa2vKYd5]G:AT(ú6smomm9s79rg ǬGe{ $N5=~UC@uTRBpc񅾊 bMy8se$9RL{Xrdkiԧ꼝#YB"EڣC4c+1"dh@ ԑ3f*%wNn(krW(IqV Yo0B((b Tn=FC.3|I( Ǐ?ɽmlnlSFCB] Ԝ9&DM^d׳ ڗn0}6PA,4*pw[OV>}b8Y+Sg<{+?wߙ˓t@ujCr]!پZ&"\5@*IM>Q#aQh6N*"ڥ="S+Q&&dE&In GЩP^ #ѨĔRop 5m+Fw.*NJأe6Iⅺ%m5̄2a6=Dq[ײ툊c&:qhX7^0~oSzhZU[a]z7FOZU#bcVhȐ9O8g^Zo6 :KQp2;RzlRFIi&T*L2X`+Wh](A%򒷈̠/N:V" *D7WLjކwb +qsUuTSe:{T%Mv/\o#7A-fRX1j@@3&>7;!烀"HLYǬ Bў XT|{+WxʕwU_؂{3P2dylƴ$)nۊj5Q^2hHy҈*/yꩧ~7n|b`μ.t=G.joda@[ @oJ:2j()q=(xD})a8>sFRbO 7{Q_Q:u6{X ,L mVuhz7՜^؍P'xw@5JY)9nG p0UɃ'LTu9mh;uԟ;fkRMݪ~54fNȄ)n)0Td=6ن͓lVS/ϿS,+{+n/)^T]ƹ_ 57 ?B i,#ęj\H|0!D=I3[CK.ZßTpVqiPׄ O:Ņ&}>*UױS@Ky`ȓcX"56]E29r֑r#.4 UWki5)א!_a =J=1n*sQLh0^'V8:z'qIwv߷'6ruW]/ z}ِYXs"(w9k^9EX<y!sVXg)E%  Js:ƳT~S!cRC%kB$ r%vj!uW52UTÛ61r(&d`Dc| ץր@Y盏a.\.s̞^ͦٝe G7=^ïKY>OҐ9xR=߼?cGC8oh gcwq >O{͒z{(XPxB!(*`]%B[L`AfM*ѮONz|qTڒs4 ݆a>S3ֻ#$5gߝmjV=ӟwS!5Ed@<3BT L *rrd#eS#0#2+޾{''`X{.)rGlQ!'#*!pJQnQ!s I1HEҊQ>C=EG"? {݅^d9(hF+"jNG`Wa %Tz26u߂MF$%'°Qg1n1BAY;*!'$uOvTR͠B wсYC(NFSTɅ5\wVO5V(9ef  ] k_qǥK˝G|?uz/ͧ^Z$7ݲQś(2<\Îy0 )K!AOK}1@3 pm}Ν[͋u2$GǤϛ_+'k}\gaA*b| ^sd4UZN$sQŜ@0lOR,H?W@Olˊ zP-A])]U g'HQFO P# "!FMְ MG:)zZM?'E],4}Zl"yDzuG766N]pMG6"91bYu}/Mh<~ힻ0ƬA+fpY(Z$LSPE#Qu7SC*P< 6AI=/TBieSݿ2famO[;;GSO=ذ>XV8UwQIɻeDp7'lV1szgdAVSZV 5Ϋv&J:- G"i[ l*6dp&#\eArEu=/ ZRap+.R2Ǐ6l~zљ\?:\ Fe?$'g43.-kYJ\B\By-qa87Y1BkK{/\%R5`IƲL楶^ڋ?}Sq~^^X4kUG؀ͺ3SbސؔHRǷѽl5*Կ;6Gi31 U -,^WM 7*3l ~O-q!   u;cgoDs{؜ ^{v6݃&3`(/7ey& eyojpHCZpu-0O1KpUbSHr=ckH63rqح+l? N:CwywTлHwN=^˯d_SA]"n ˎ< ԨDVlҝR";UNW? <4 R2r}`Kb!7Ȭ[tNJjk3 КɔoiAoT'Fݑ677/syww{g3l:+V<@"xi"EDLrQUx'J;gRnU;_ P8FDZoe*Ӿ)x9\/( W2PEZȉO51t[ދ7wѣG5ݡ/-Fb~H7y:iq+,ciV݀3M xw յm.CڜerL'qX8$Cci k9$Eu&q5Ь;R;ڢֻFab 3AZE z"8h*hֲtemgOYQi=0?G^±b_ق&Ы+V_3 ҇ FpL5h XN8e2D2XA*'N7: Ġ(Y%",,RDEQڎruh"h\ŵ]xN:Rv9i7ӠԊVhdVa C*iZv%Q@uHf{CA4áhi2KSVcMA2+f}p 7gs¤Ϡ dQh tS!3 Cn -|GN0!?}+Ξ;_f#9eЇvg]R8֣Wz D@QDxuSC/נEF_d6 αڿl !@ֈ9  HβUDf[ еw~?х.J}j+U)Ü9ceCף@ŌmcS(w.%p6W{~ߦ6_ndx~"Rj-R]0dLp}T ij aȾ1T9PU{B9<'  lDSo)ϡ"mXrŋɓ̎<1d^ɣb(ܘ S7ZgO>7,W.3tn'g\hws\̪r0c+ۋWk饠yqHA6xR/A e*UL8gnHT C4*a֖B$!wR2ό{\+)R3?ˏ\ ve`ggK.)p9-JVK:' L(ok6e8h Tb(sap\$ŞcaUVJA7VB*;oYsI9ɸ7p칳ɽZ z,7|?(kQׄ'-OPkt֠1vʨCE>co*h`M2܈ΡPV D4uo:)YtD&z8!@8,^5w!&@B5%pZ!6.R;vyf_f;J i*lXl һ^xtwNIg̡\LtC@LUGB8bS#FHM3Y?bF8f)E/u>G+C֧63ɓ'_(V7--묁8 Rʊ0XqG~T3:z2=LDOXU3k6^V 6CāҳArP6-مAP#:Gq[dTp8#gtp엧٘KsΟ?vZʰՏr[lc S{X}M wfecbv<؝iSrdaI7wUDsv,Du>MvMx]0juNϰ>OZVt+k%h)6WwXvɳ>zm:uϜ9)Qm슗ڇ0ĩI)JYlg=3PjjIͬ:M^@~%zx%|idgB,(87=;v?'5e BwМͮq~9py'O+ɳ7uNYD,Lv(/W~QM$Q ;֛G >m&|^L.=k(B@(#G6J6eØxc,` d 0غLJ4t&leR+Ta0/\; As,n=ye9v%.2\k'i!։h!eŲ2ԐSbT5G.2Y= $o[!QǬ͈gar|~@0dLp~_Pdvk~PPKojIxQ,6KܰyĉS/*đj'&F;kQm->8 R};Ww5w8rj +TN{ ϰ^{zQ周bIھsP@`ڬ/Ns#AB4ⱡdTHg6?1޾ٳ?PWvPVfGGW =SW^ssnvݘ{*Kki)Cf.2O$Kc* *Q)xX8a+j21i$DGzJP#k{$jQ/n<DV+N> d"yX$_ Bi!rp$WYd&M_hnWGA8x[N1{[$VPJ322kh<4ti:9S6~.E^0KpM-(kTì;>#FHl Z:+BMj!0FfSa7vΜ9}N}b-Ti5@z@=;:%E-x ?Zp @0~Vr e,*K xA3c) DDCI%4QBl(YGoHC 9r[-J56lPz[[`wlmmK}RW:+ZcQ j5}`- /< Ur\XMiJzVwopqC(W X~! DPb1%oYF2E}vU lDKř0v dܹsm{{7j,q(@$(ԆĤ;fhBHOZӠGq WЌ=JVwՆCּDV}Anm>1'OOgI4ʴLEfHE~GvIGbB}5]w?Bi6%!`SC]B=Խ\A?kHyTp<$Ov.̚zKCƤ4gmZH7l3TGLF**Kʝwy(W7I.!U W%@ P4Se[Ƃ@{?mêIF 5ܷRi]{M>q<TP$ `0/?/q M0%oO SldEߋ@hz(kkk]t.w"`yR8~̂ gLTP==P zv1F:'6PK,eYyi*I&OHuϚ *(QPȦƞBSSi426# gfGTYH@`ySZK/v .D9}̜5 DJ#\77]EFƓ^ ͕=eerV1#~,}G%-$c!pM#b8"ަA/& 'wqw R*=!;(}swAHҳ%2kyfLK}+`zdz2fTO8몖;j/O>UG0b|Y JU~ZV\u ʵL2SNc)Cc3X.Yc~2]* rkx+ װa٠cW~hӕ;Vw3 M8gķ|չCdQUh]XeؘՔ$ .|U6b?-`m4$ͽ3uyxYS)Pu:M!DanTM4'CxŐ !`ix"Bע^;Fa3_M NЕF FnKJ)P S\M4Z3YTC;TwH[y=xsCW0ڦ.͕S/Js(=/<eN&kJWի [-ipe UaC sP*dqMhBg0mmmsl!~pVƓ'O @G~޲BEQ:'ּUpj,t7sTTw."V'mo%N¸$Ap*{3 u yE1RF8ಫR]T5a*cO҂*; O4y.%kw٬~s}#…39Dة01*[$LֲAvsHi; d)ӹD "̚d~M>4$,3Ha!#XAd|ҋ"O汇J?^O gNytz~^6-Aά%$ЦӋxA H7RNCaP{؂[0`Fdc at]t鍩&l|}Ȍ)dQuҥ "Oe `|JQfInaO9?tFa~bU"P9 QGeA2dZ`"mq=  aJEq>Apm~l펝8qǎS}j#I2_ЬOtH +J1@^^,9㚳5 { "Zؚ!9T!H\"P=B ‘"FٔR ar]+FSr&9iʒ[y{k{Ϝ=smF$:{$I4?i GՔ>"IrS s4^ԐSDYZgeF[82u n-@:@7T郦 H^*V5鄒q Hu֨Rp PhhD6E7(bĄU=K lhlUM '!JN.dtқҝ*01 ɉ2T!j*M8k; \R2Ȯy+cr]m:^$O &K2ưկr]`# [_PEv=9LB{ | cbgVK}gH{/^X~^Ә|_Pӗi v U>Ȍ%ڕN/*=B#[ du|azjKxhW7EN̉mvOjr'I"ۄo]S(s]2eWv/:a+.FT7 4؊w0hMm zV#dj=:Cĝ#>VDD!v:r 3HٱP¼h"3^QCDIF7ojgهl76^gwzyk md_*V`D/ЭR6+lwlN_6`z!ȉ7Aت|<4Di8dgplUƤ ~]+tz-b'գ~ۃ2w9ra(K@u ^VZXPmhsBpOq0އ Ih%"8S?n7E?a议I\ t )9Xr94r oYO /gu GiSLD\coݽ?y֦XBKA0 d!Ko.,(:` *y#c#ln "h+fŦ?VηA0ڨ Icu`|sVBu0L|>: %"E:2;::%$f3I8H@2HcFϸ /бgzLXF7ELpיdE}F=.3d:`^*gϜ}#_B;0SgCٸn1wܐ)ȕ{w␆~;;{:;É>Z 9֢ (=0;7%aaRIV94@ S(FU# *;7?ْYݎ)rG96_ 51@ɱ[Xò W"# {(WhQRЕEVi:&!|[R/ѝ?wѻimnƨBʔxC^3aT7UAƮꭺO’2iU+,n+գ$b<#!Mԥ*W.&F&&O"9ߤr0YǕ9l |K'MVn+.^ "f9h=,pN:bн/*Ng]/Ƨ[t0BUPb^?]1.B|MNU!]K4Rʅ՘BcwfΞ9f[7#$EJX3[-*+zV@IM HZ|lhV;SA$$(,Ά]7tsmhT?D7e)FKq'WK5W^bJSHVyc3gμAzy:g ,_]:B`84L:R5 wr=ĩ#a` "fWƒHf HleIFdɃa%J0Du}U:{S q*tCXЪww^$8VX㛁չP@6t',^z.iBm* UUeoEoiB(JP$Gj`LݬFNJxAQG` ;eug zQ x+tu7"LQ4h[KT}}lnnY)c",NhWMh0 ]6{WFZA^E[GҭУ1-"WtJ?;Ng=Qqu-Bٙ2ne<+oaa77#|by2Ax 'QjN" 6]:$@+6' $熭x^rRQa"P Z `W:'jyl[GyVnXŀ,2ףy[ yMsMt9@ar޷J/Hn wyxbUl;&̺ ߽Oʝ |+DSć:' k=*zv>E`b`&H; #> CA\N;x}#G򬓭8;Sii S %D6)ϰIvjR\6b4Z 볒jݐM2fJ[Cz;NzCH͸ "t.ݩJTrCGJO?+dQ."qTEbiFњTdAլZO?Cr1YH%! Ҁ+Pu`kpVlgHS%IW1HeCl(*V #5ER65'ͮLI4lC3\="N˜>c_MoڞjkU3{Ksu(Uu^@]pX;z5tK6'#IT1@bLmhdP,U[}G"V<qgʙ ʜnݵMZackkkwkF%bZ+#X ϰqgc|~TV3gDRE~Wz -0^H/@(ո|2DYljW)K\,bBݭDF A:$GZlfـ)+_Phhˑ%$e{8G!W &33 (KMkouһ3G(s-@ϝBw/&2V] Z3G4QǼ O],`cCFVB}5E}@+mԱSUj,GP*UawanVM=4قLС#HW,]%ZvL WRढM?sFdSusAŒ)֝]Q =\_ܜϽ6 Wz9`ǦXbPԖvaL81yҬgQP֐fQч@٬ Ɂ j,8 F *\=QFgɦizZ=蕋cJBdIdGRi kݔ)LBC4Stñ5a(֑#Z:UdG:&aR3::iQDHXSWXp0(NiÕE1wv'qtlZR YUʸ}5iZU p<\’yܹogGRXHs hJjֈҍq8 n !(liB%Fdo9lȏzY.It6r1WfQ)ˬЉ(F\Щ`R,h 7YWJhԩSzyL<\ ҩ l-߳c6prZ[Gz,m>N nxRMS->(GGمQ3)(8VCqܒX ?ލ)Yf.%Cs/xGDC߶ gHS}0u !ޣFa?\)y0rV/з=IJe9NQ$P'6O:UlWR5( \hN5(e:ӧ_B1t@1XLJR" E:߾a;EkqK 6E13RQU^XNOwrz:Wih&TaX5\^fHJ|߈ {b{n cNZ6EдձS67 .|ma m*oI`]o`!ȟ-0#cJ&S .hHRDm"QQDjpV?iLQK)Y%Cmɛ-QٹHMvzJf? ’94'29TRO#s 4@QAxDuz #-Zc@617P)oPgP'Sh!> -̝vVG ŘSxWuT*Tj kIJBbmR/:$]9Hi3)],4gC"Y^:&򌟌To0<;0E>Zc :QTɦ!T5l MHzP$XtO+p38:%NXzf4wlm:lh}083i l»pI<99<ǪOgI"w-wjXXA-&;X'C߱r,mH2Ao:k Donn=v@ ugA#ƫ 804{(x^]Sl`!t,^RAZpBCNI!.a26!Χ%&7__G&V(+訌[jLL@`;ʊ\Bl.{ /.TP|e,=Sr?j&U g>=JFe@iWy8^Jn;GkMosP o`:[ Ҵɚd$N|s䆳IajrDv47 .k_[pCй;I !>MhJiKb 1{8"K;.l rv۴_~lg+!> K$=d7 ,lLss-Aǐ叉A1xtqL$6YrQ"+ٽ(ߕ@ ~[\x3gGS0o˿GV)U.z4迊+B}Q{wݬ-́Bƀ4G '~ 0c 泭5ʾIJrNB6rUWh̸Lݒr;I_Pޮ$G^"PT0' ،\5 )TjyAHnoJ#\39q`6`MUŸ%A i2K2@uʙ3#CdacUVhD&#SsKwN:+0ټg}QѝO~Ɛ`Nur⤚yC(`h˕չ͡4c 367ã{K̸~ɬT" +4p\E a'hΞ=Hd):$9uAxE;:MTZ|7 />ߟ}_ 2Ss?U;PB W3hXBRITŵ؟kq]` \C ߛ`)>oaerI-9\sФݕ-Ӎ{}@UVe9w~Jz/*I|6RSfL[+Q;=W@ߖo߼ %cmn*VEu&!1Bc*@;L^m!NARjZ7`I(ɚ:z4z/g" MKNP.n8rl T:U)@Y ͇Q9>[^>htD]-̀0WmJ):(Ӎ  7n,ݸq?6}8lm`NB(hL:2YKor? hc,>}_zglnkXl$A@!'u9]>̓Ayqt T[[1p:sILiE!>ywh)e]њQo;Qwr@3M6C︙Z.J4[bLt8EP\VW2[[_l,*teNJpTf1.e_ t%ɚ5]բ1@P;X,a~1jcjn)P0KAGP}(\]p^G`P*2QOn?'| cmx53 ,btΌTepP39밣q-k{SwiQi?~'O]fԪƌ!dKu"{w߽<__hVwD,5[{y52}mkk`\asAF = @NāY1^uzBiΪo^%5W( -{oz n ~c1g?g@ ]oT}5&8@kcF+gH4E8 mz }BS&{/o1q=bSr T.9\ SK78}Zmo{y/DZw"]p17eqK.]yA~~/{g[5`1,#M:A‚0ڭV `߬3;@0%4- 9(0"؝7zGe kgg'=❿,EA/E 1K~=yÑf~֖=ԃvK]&Ռ޶a<:q"g|J2+0Bn|3_я|7}% Z55O4k rHZ?>4ya">HU<^!VbC!?42/,"F*>YʄdSwNkoMx-{w.\XН&A`Ňv2v/³+WJ0z=RN]؆O|"oQϿ|vwx|-67鍳޿zʲ{ꩧҏȏ(o;`iG1Lуp@LY+Kv{pAbA(k 20.Q#gmjK,r &ź7jK(xq-O'.e/ky???[[c Y?}~|A[O>d>W}Y9hx1R*5+3x1ױTi*V)<[CMWy*ϴ<N֔6gRqG ˊ$5 ?15K!<ٖBzgyA |C4ShN٢.@rV[$Bh-~i)]ISZ|6VBƱM<>tKo 7F9lk>]7/z|Wg~g {/70TE/=@a@1_cqX1r֠smVܯ<@A-9!e v~N K20p0G |I U9NP chHs,["{Ko,H_k %/y 9\ye7iFXbCk_Z:u*]xy{~~O=y0Z_%d?\o7,!ɏF,[[g[GI +`F* "o7TxK_Zq/?c&58yA=szznhWFtgӓͷ!UOC\3#i&%@ zرonn_ØFLJ/?<2ThƳ(Nu4F KrF C;DdžTa|i_h5 vl8 / YU3>)lTXf]g>,ᏅTEagBB LG D2ڀ{{|UT.o?j/*زX-=ñx!CiaV,fv"VL))azC#]!<Ã3Y$2=22H>i؈El+ҩ Gbhq%H4Nx0i۾߷-.i>Ƿǟz?wl_G>QW?n_Rn ~`;-_l* '~#O~|`-k^5/d_z1k^cM]dktU| _x2/SpvTO܌_6 w__bKan++ O즼5/y?땛|n&hTuXS‰ VN\R{׼]mǷ; ߀~$NIG~/VVܿoeJi?XI nٗ\re4>MElת^O\Y5D&JwsuXTX̖1~E爚w5"1QVܐNmZ&9"98g2uw7X-D8 CzyF3vw3վ,$K.{x.ó"0w o\)DC8>˗,- ~M//[KZ/vp>OІRK3V>:z38߿;~#\H1}7~Ae1o^/{˰//|>}˴5)%4#Zwo}6?2'I 3?_\q)kc54l<}lB_̠CݐcC[[6&OW&m{pڵwϸf)yLI>BnA%!|x `7Vr_K)&+ǩ]H*!2 ;0"E:'/B~Q=MQ!?J3f]jݖ p)}% @|, 7HQ db]!6O7 7FD9-ޕk>ѿ? {s!,f!,''ſ'Q"`v>S_E|Xny'dHe{ J (}5/-~9(.OO('٦=yG-9~|gy|$cWL{l_oE˵lk^Y2-V뎙)5qs/FŧeRh/Mb_f.)W%Ϝ9guyM|7WzXl&GA7Ϗ? Ӷ9 1b/;P&;1/f&<O# ƶ8|Tԥ㋳ o ضjR.:,0э߾gfQ?ME]u%2ҵ<^"3혓{F[[<ъ N\RuHnYvN|P7?*ig<3Oiw?zLjY/{s_/mwYVv w|S`Жtc=~qSkW`)H__%,_L807_/| `>o~'i˟}׾ZNkY,nCLu[~緜v%ڤ&;8!tz>ZMРYPg-/n *e;EМQFSDդغfYYzjR!/s}쀜$  poȐqÔ)|ʐܠ Te=x=%MӞ;(;=g ]xYJN5 dj&bOUɚp~mK1Y(K"`3UA-jx~#f" w3E5G#V^KLQg>Vt|>?8꫾ oͿy? SS~-˟߾㳟[ g?}E|GZR^R@yCPG5_||^MW :v׭}fKx1'$i5y"KGJ;Zҕrv @b|qGy*y(̼Xqlw_cw N2Kbs¬0H0LBV|Yo~`RUjQiZ*^۹ AE旮\}L8dA;PŒ61%c`!ƫN!l:@b\-oF6z~>2ZDu'SEw*k0|󞇓=IѢНF,ʯ?-`ޖH?N]2;-zۿ۷x;@kUvmS˫^RnݺU_?~'2+^Qlm~_xbgoqjc,,~?t}o6t+d ^.NJ8G?I?aGSY |zaPV SZ2U&( ߺi0gUbFL>0M*znERq{87M޽/UOT\ m 51Ƹ~n?㓃Ui[XpGKg}v{ǟ'ώi -M}9ʯKG[-4䓌ƏȏpuC{)o}[Q]C$ۢOX̺hek_?|'_L: IO?ѐeʃͯmD-ɽmo=_oc[TooôzO Eh}{7v~qu~Tw'?A 5rTb롓Rs4?@h61eڎtAtp PwzDln[7oֿK->/2!'"xBB0}8 }%5 Bpw䠼{ ^ݗY2k`ZpX l!EBnܻhZwo4}!Fpkt*$9,/1!jY7g+ ,$v=,M!g_?o|*BV3OG>~{~5Y{ak,gg|b¼)&A M[4dKz+^\wiڤ/ťPr; ;NRz ;6-o?_v]}|\RȖ'уsWIDZbvpx`%}?>3^Y z>v?C?|@{:LJ;#mDf>˫_-n|k_e<<<@B-Ϻttm])v._*C.۹eIr:W?G={_Ǜ`a]LoO~<)Ipwtu>/l48,g؛kZ7??Ǹx..¹xc.4%Rhi?k?IXAoLO ~K8|y׾wlwǟ'i$i<4mܯlւ/G7}k\Pr>OJV5GY._ፇ6S=o~u=xŀUdj).DILT!AsՌ%߲D+ ZAns/]z]q56di׀,S}g}Í'Yd\9RdF& Y0R<Ї>Sug`.X#$pljc^$'(cc] Z])ʶݼqc[rPɌJRܱ=A#,H44DA޽%wm3m;3]%ˁhx?ڔmEO~ym]3g'?Ԓjz K?V⁾~dLJoo;Ʌo6,POf5բ iǜ#&geyu6">"%0!M %a %\iynY&YB𭇿?)fdMS(34TN (ýa2 c+g m(Q+XP`%mX`œ.Jtl5p"=V-3ꚢ^ϛt r8q]}^LӲP>Qva96|ɿZdt̻KSd ND-]$2awcJ>H gz3iV"qiSv``VGǝ ݗlSnv_V 4DKe⾽[1@(k3F-f̊d/R'o=+㎣-HOt?!qu񞒛'#w9Y`ZpykxH@QI< 9GI4IGM,2#L}v*}'/*J6.J2ese ~-ktFB Np/]˗/<-zxS $6f՛0OmXΦt?]ow&6{Tº9UҲjvzAMꍍUfYwyo=<<N>;(Hs`n0iT_`x}FUέ~C;p-ᢕf0MQ,"Qt7YY$y² ~,vʼCs/.-)B dz gݙA(+y`"hf &LH05,!)UC-wFт݋kx`7 9L'S% hSV5/YJGI"w){屝o02BM k/c .3@:M:/'^vM?)&T2cg+T\:!!椈sxv,ZTFZLJSibT4YYμש.)X+pQӺ&Zp~ۋΆI/كVޥ_7m oP0C47#,_l~j&qsMmX6AJ^5J͟OZ.KΝz٘osH*"?EKi}AaaQ:z fwdE#˾ m}7Dw.ЃDVY"ᰛ#t/eRFKr*٧tZ,s2(ctlgvS*5s`c)RlkM=#yKDK$P -Qe/]_#NGQbv,iC! 벡;^DUBl]v#ˡ!׷40T /pVXמ@1*4~tRԍ1PWƙcNp{s ]{ vp%pHd +1ZRuu(&2aMZ\H`k kl_; -QبЂ*6^av̙n޺ad q/ n6Uisl[2+;\f\ChJ NzrLp 1;=\n=ڎb!],"y؏ 3 s3,fe87$$ E5-ޛ1 a[,]3#4& iykV[;Fcy x-gN7+SnT/ iw5=TNAa5kv`Ʌ-Eبʬt/b0 h_LnpYs/a`9V32D~vPrD ۊRx=WBˊZvhlT0֚ EFz$7eeݕ+W_pC|beXiVACI9*[p>3fwѢ"2]>nN":4M*&ҩ7+PmO8jc?n+LIQ@n%>D4%A1Dgn`40dR|ib,^9DBK)u+#$EhPx(PuKoOÃÛ?)e Hٻ1$jD78k!lOv<_áIszf-8&M2zU, ^Yw=xk#B};&BhP*0h*U,>] U'#<;T*~ySG%9.9= >1ŗx}m ]@`{\}`[@UQsm܃úН)lc>O`o 37ɲÆ!i@fs,ބ-Dx뎎Yr& VO(} N83mm( ﳆ垃45LCsPRw0eAxZhDV e޸ygϜyl pH&"a Z!IXV#yYebgR]b4 @`Fh_@Sq7`HA*B Z 34Кf)kD-:I8SEM/')5? 蠕S~{NtBjUR'߃ql^FM:f qr;LA[ZbAF  ]eLS0I4$;JW7DN $4gť U2xb⦑V-|n!6!\\(/a$XL:dPw~!Nelw jhY#w˝2< 6g(< wm_7${dnAP !nF}dήKp tX! Cvq2Yb/ϊ)Ș󪡷(DmRu2גɭWdX˵Dﵔ4o^ą^6)4ADz1(_>3 Zm]pg-xTB5:\]Y@ZfDT#7Y\rlz$ r xBIe(WvvԪ"h4;;t cl!uoB*Fӌ3 SAq7z/67,U5THC5>^I:?P0t)ѡdڊ31;6cV$x@)-3;6`rԽfF PUxN^4#T˘h]gJv/͠+T+xq`(sȮL=\|ۗak3ytMN}[J{=jx%`Xl%BM'8gxC&n?VdIj' +;$yNV8KXȥTT Ȋz3K,eh8="2MXN6OW9׎Dx$ޮD⣚L?NgϞ}֭[\,\SWm؅ꙩ; 뾓gj{un߂ \ e5kEM&2߱ zˈwoH4D?LPC " )iySZpF|zooV*|[]jf% ǡャ@Zp:,hytb㡐7s%E9l"5UET5bMNV ;)SbhC ._9983rh|[MWYȓ}\G I%F+D81Y>*D}eMSHe 4=QF"E|Fuwa2,w Va՛7n,2GѦ2z~tvՒP΂z{);U'&BY { a_PvvDZI;(|nigtwǗ` xo9Q8H(17a9,dg ĦQpf/}W!cQOQ.Сi5YA|!S3A84! 6J Ps;ܝyQaxi&5MVck\WxrԩH-#3FĴkGO( +kŋ4\q1z'a>4^J)3{L[bn 0d&:iWG sY]>y Il÷i֭!ř:5M(`r % eMbZ\"ruk~8=fTs/ /+B`(}>}S*N}φ`Q&]OH*ːmuBDk^=#,"uN :$MLyg)\x*40U_ǘ^Iuo2KvxtI >}Dq$R#2-uU(&g+buHQxm"TxMHfګ"jMfxW>N8A ~>JgOE&{hRio;B3$Cm_ &Tu_NnCR-b t6d$Yں-µ'~PVf –-yӫ;˹_C~e<%GuāR,afM9Up9y;[@=2n-x-ph[&%%+ 8yj!&/"d)BfAM):'[UV`AR[I"o^䳡S(=2 eՙX`v8*)% @XÊ{Ӓ]lvݓ& Q- %!s<*0~R4w9g2!P4/Um}:@"z7}ag2Ak\Wbu!9Ipqcڶٞ.vMW SX3hTIL!B#ؗ9k%!\xu,Q+'+*JnBk5 WzZe#R]2$,{MmEGui̙ͬMP$I Rڑrԅ8l&`krE(< 7ǀ^,`&&F1.(#Do-<0=")᥉߸5V7~Nmٚg,]CD9$E4'Ԭ:Tl>zo(ϦZ.c[w19;A$zR3ΙHl{3=ۘn(nk4,PvJ Un\  OmBJwq UDz64D'ӱM&HCib=1N8^ '榅GQ'/O 8=H_>QdE0  L> )BD9ғ?26H=zDNEΰ|! ? \U0Ÿ~q09|2'Èkɏ7]Oe Q~`Fb!fa"gsAr]H! [Jv=f<1YVW2}O#\z=%`aIjt"cǥ62l T6ҟn> &J7իcY`!ºUIS&EVP(C1]vjŢڻ4}8\RaA( Dt2,E to1s׉/"ʾu8g6:nG!B%=HqE.PYp_G0:I1F*Ⅼl@8 G2vM ^}_ZLlqKjVnt_z$lƞ[tq8w+' ;HyKix{PrRkTV\C\Ikqte k{Bj=X f t h1Hy𡇾t1lʻ -!Z$ݔDv0WXNn#k!Y.Q*{,8\rn˹g|Q3t }oșJ)p.bY l[X9i+nOiQ7LǸͩeA27nW\.f5qbkb9mv>f^;2YYRQbCมgh".j;'P"Cxƥ_#]ZġQ=^1;1]EjLqP;<96WFGpǻ!%nhgr z05Vk*-![We'F&wdy]NA}/XV r}ݯfK/6apm0F}*t쟮puՔ<÷^[܁%6wH,x߂)\&fd e"J {edN,PNwgtwo_cT haCo gevi\<DC[P8-TGj|j*L׎W P n\BӀS)Rj&A4,b :?7J*IU O4urm,Z7g^2uJ ͋*Y`(Vj=¹7L;jz9L3x^ ĥ7_pz-_c$Y)#AE I\aR("P&9Ҋr}¿l\3^b7|衯.SmI=m"T=T{H" [  ;vPH>?p{U4\y໋2!qpXER<Wf)Pnh$$1M'H^3E.qL 2Ut.o)ѣxDN(U~[ %NO1wdD ݳFH0ع1B>E3l%FԛV&b/dũW{-}!y_|Tg&'ٖ|fU |sJۊ(w,kzϠLoL+T ^"Ө2` o9HciwJ!ad(OtaANe,ngZ(SSqjZ.'5j33$ꕰKVɥ^Y-]7HߣL5}WTsgK=7c@)57lg,qRȁ ŪS1Oþ&̮Udyz=&j NcJ,4TwòðojlYDC^vܑ!_tzS_ELVXOW ]pqZ U J,1:˘ۊ‘6V&~<4}]VٳiN퐴hIiVkmⓤ٠SZ<`OnHtFDaN~` `)b&CYdӚ+)k2EG6]cOd ,@ZvHn9RTUZV:ퟲ^YgJx~xxxe t>!Yא6j}>wՄ'l%!#uO&~2X.w}^x'4c w?؉,PDPϯRA|ɵ3ݛ6!Y9 zo=72FЌ0:̦L}+@0 }f)vbh] qW{ÊN'5:On|YfS=-R0jjK Jn֭n,:ھ`COqQ_Ub N(͵kJ<*IQihM7o'U~#&1"JGSu4q2nA24?: 41ڒjBkn1mè1j 6%-ë^i[a>Akmү4Kq@ɂ0gyS* 3EոcHi(W)&4Qe3hlDabi(ެҙ&cTѺlkp/U-"0H3!ھ$$B4dj)9::zNAL:1Ȱ>}[24}ړg^:XF;vb~Wm{_t칗A#k1> Ӎ/4(c|8~nſ2B?jVPj**#xZ&RكN% i$ SdP)ʄV?^fDcut8[|ܙN Rd`{滮%S"U$ *\ZQ lA}&:G0N|%ۖqYΆz؟\ՆVw]4juKf{kg|6o7y*U7}%$` $UOOP8"cl[+Wq 20>,=MI^sDK,G=+`iR 7Ez * Px:jnI䑉- -*ҏN3{+Ni}7 1vkR-JZk%g~_~GDH)9`I/L3 6E:xZU)# _yʕQp(_*!z$%M1X_UC'Hᒩ B1nVZ/ss֭WyTb\\Cc沬~3Y (# O*yd #Ko kNCa|2T`SGF)=sLqUҮ9+CV!rFO޸ cIp(s5& =^gY~#);jj;1㮑AARˋ6qpڵ)/)}kgN(ta6w9zz YiSo!!_E) A砡kb EUfNoY՞8Xnaa0)aAo#j@kHZspo-:*nwT ހAgS ;y˜<0C8OaYc"K~XqBV-LUnXbz^'=}j7e[~n\J3*'3ϿqˊŎi #نclB~U;%5N,4Dj %e{w9vןQDo*'2f%Ȅ`}( KIl `컢]?kގ/iN08 $;ھf7\LtyJ-$A7i`b(S {!42'n'otִ"*1[$A2Mn"Lg,T6H{St h>e$J$o*#DM,uˉSZ'V{k Ť$ŮPbsW 7`ӑZ}W%/E Hz&`M8z#cB%!?J ӾXfGgYJ(tR$!CD)nKPB}Zup=d 8ĄUmaCA! f=9Cj\ʰZz|Lhݬ1S+>Ԍ%v(3At=ynC:TɉIM3~clW4psӄt͌|nvUoѢiEϹΌVLvw:U¥ϙȁLtF* aeNIހdإL'`*~DaNg#4T{h[ nw6gs(PLfFC-ųR$*D9cF;0}ƶ _P MaU+T_F2GkJ%BmD\ԝwj$G6Ч 5}ڥ%O*jЕnLLٹ1ޡW.'\8c&]a@TY2/>zxxuҙ,B ]uD:ZGfxZ$ڨ.ke!07iӣI3Cl^GmlN M6;)".,bqwn }@,~CCWӝ%/;xhl-3C]2»z#L2UewLK$#2'2 c/YEyk`E(iaݷr*jrVw1rO`Ѻia̓FؒTu|$J_6%,mxgΜy֭[\̼C[Sb]/` ؄,2]^ 3Lҳ؈my^$UA˝z' Dt"ZJեt#Qڵ7  S¢q' \,a!+&ň92 Qm rB3V2OE SَJ]IH/g }WG)Ql\3Fׅ)l5z Y#٦;Y!8r-XrZ!e/G[e"t\xJB%eWUGd=SQ84UR+d<0L( Г=Z#nMe~/OHXbAӭb7eh ѻ=Me!@mT`b vu(0~Q0sP =Zq¢ %l3彡xP`9@L<z b91JLPYe>EU>c4_tQ(_FDi\^&D?z43 tt̮lNgH Kt:w:o2\GSG_`@gj Le˺1ݕ@4Wlyp]4W'!~1Bn4|> Q5Xʸ{C2Ip5}uTl;Ԝ!y&g b^.h}>c_Wwہ93taYy 28yn;$]Q9*0A͒8B=:\!\[v'/7f:mc_T O؟)n,x(eNeoM%D_料yxxx0_ojcfBI'pV26WA@a%,1:p0Oe=7@E$FpfrdP o(6T3B™] 0vŽRUcym/]_ '8 2oU!PU\)Fo&IPh<2iEwI!O"ùKڃ>e))L!3`0֘3MaV^BcZ g4oqIIwCk`510}>mh i9ta2v/NZ0Cr3 Vv0*e}S6 nvOCtaNզ>-6V=<$$N_ p s&6t͈_xڴ>2qC]8>g60JX;$ykYpQi:q#%^+W]TLA[^l>孧%69wycb":U0Bz*p(A>nq%.$:2'A 4bX/E2Y;cZi ?1IX ţa}ɚ3clߍM,jQÕ b)5e`jH|Fe.2L+\uӉyί:0&Yn>L:DDAiӜwHwG ^_W ޓLZd;ׯ}d(W2xwEi&SPr1ypnO3- hpZ0@4p+ @;:9.]_J"q#wW3r*i>BTp"D%Ft53[z2A|,jFbԛj g xgw$j_ձL1J=GPRfWΝ=wm2'A@RRC{&y[aLCh2|/d]'ف1B.ŀ:Ff+! pST5xC~gp 7F7$덨4|0Wy}ގ$!gsL!4%AZ ;=Հ,m@/0hg;۬^,@sJt0Biac3 }H6EM~KBě4Nf \{($Ni}PH`s@ X5V{F^u*QD91J{qgZ={ڥ7H*3O3 `,y12)Gt^XZn58#wpe.^;0Kcܠ$05[A)SZL()0Ҁ]#NbfrsQ\8>^J5˟Yw=!q @T\tƶ))iqHX|ƀ'RV<DZF Ɋ@U% ?a lӕ/}0^aΞ;|E-Ǣ호;E82#ڂ)Fm9xܔ Q%NwG;pp5 '`gpH[9x{bu3. Ucw&H#/~=J XҺ=VQl-z4*4|Ѝ s)܌@\a⠔\Yƽǡc"o#㒆V_#+RXȐ0vHд{>ތ-QY?Asl7G4n@ve ZI1%'%,5+d GN"HYRel_yKtZ}6+ db*..xyuDJ˺|s.\?;LWTa,SuE]КBPW38/`֠]I64(''ffg\v՜m`8?KA5:# ɼ e,epLnL S}ijUG,+`:LdCrW@9 ][H*.d+9 T b/«#:͞|NLGQe0]{t2QT=a)q)Dm^6%G!+wyvxLZ'e("p]ͺ;ڌ/tN*44!(K!j2se谙`tHa :AplbgHpf^G )P -֏&]9Z0Ek+]Z| CY2% Q@dpJػh7$b0M?m:!svm1=h?Z&]= :Vfo]ӿ;L0`^ؚaT؎.Iѫ SPWu9Q7rg whǼs|&`a4w7^z0+kvJV+>$Kf23{<<^mCPO9>Rh31t2 QV T bX J lh0mFrjmB8%k<sŊөvh,AF\o  i*v'qːC{z^qhzQf MLFczd!h0.e.84sNrэ7\r1 D8,zR2LAXVe/=[HH̘Ð1 ;.!wۉvkMc}|_dpKtǜA8†Aneedare\bC@БfP};5 0)}+*Vd}_gi|AqrE9Ј<Ϋԟk 4ؕ1LkvAhQ';32D0J^ ZK]Ee3/le LyV(:\ǏPP3i )9.dS(7^spZ,}\E']lgvEۤZ}bBCrctFٟ0ٽ)4F#)$R4Khj3 DTwy<ǡ@Yk3oK81Ytqh=o f$=/h)j9b0"IxP~zkǞF+LjkGڊD{LTl8Ln١#)Cخ'!0جm!"t4 sуɲC]戰Ggle =^r==P`gϘ*xLzƨc;1Z+_p楣оx"e=^.";X B!vMkX|l ipD]5NwoODq1vaӻd(K&0eg'Wļf5I)R)6%,9qܾV#!~pHL3؞參1<#;]Y/ S:ԄwԠIr5YrW HZ=hgV+smd ^GCrԞ;{o\i,k2kRnAêN>`/MVC ́R)U 71~Z:ik+o ~lpeSu٦YKaFaf9|Ö]JDjS+ix4#27ln}ժ94t^Mmbfw`^Itz!@ {(! D`ŝgQ=O36{g3QU[6ͩCˤ[NGJY۟ϐ;q` vؿfB[;'Ļ~j艱n+e|"(IL'5#bw HIReϒj&q-&1SkWVdɝh:gS"~3llD p"I ֲ@x!tmhx>)Xd o]^֑)4Ǖ٩{RR= !.enwwgΜy-cF8w4c*6Ё FE:q&t~rOiY0K 6A+ҢއMcx:#n-/ 8rV7oCfR^C/_lmLj]-(evS3Q'hHȆܻ͉_T5^[$!R bSK p\Y\,Yah>SЖ"F s~`vq5$A\,G;rϿrY.S8W\~ .g  ALvw/7\:S4KM\}$ts6ðCq2g\WNr,:H}_(Je˔ƌXt`2&tLL9/ҩTG ,]ٰ'>a9w "w S+KGORg'&#cXҒPVԭIL==~:1y)7`97;Ôw.@ŸxE/_-LOk;'PK.=ŋ"ZDK3/?v!膾\3ĸ6<Oo!$hAfե3Ɛw{_)KNZȱ3v- y9q&Bf:R" ;FM%uRxf/KV0.S3k,&#eX7' L-Xd>@7tk#Ӱ*(A[(w7z?ZA@J' (InMJr*"WF*iSΞ}_VNt`swB6hNY[f¿}s.خ`)(, Ag9WM1=BɁ']y~츤xY@'3nip?,e~d  FJ7/C"NjD51]h2QtNIDڤݕ 2Wbڹm@'MsIlݎ I@->+ӤRe4v;?uP3޹f6Aq,I$$.!"@ e`[ Q>}:dzwwۻ=oSUw0s3#{P9Ä5;ie'Oo"Yu7n_g4/Ϟf ZxyRT(aŵbTH؄F 3&r>J")'&#}c1@)0%%٘)TT6! moC^2k.dbK$Rt&Mv4YS'#."=\DKV_ SR"te. fy,T4'9}F!hqI&~yen0)E "z$VV`7v\ i; y(\zxQn3@ߗ=jB_r_G F-;> a)iXݽxv;@J^P%v?]hQ`qDsW0unCo!Eh .fDaKjc)n=yM2yM]K9Of(i76'Ҍ]BE[+ZLm^xw?_9M2e| Fٚ7"#[5KZ2\<~t f2%W;BdBaNDgz'K{} _ QJC_RPТS{^XtŚAǒMNfGBJPNg3fToigjϴ//MQ3j 0 }vQIW4!/d.h*]I/`=o7;meDERS0/F;is;vUhPe!. e )cZ4~yH+1i49x?SҿNxұ]J<%̟6pST0ͧI2P~1hH!zMQ_S%=ՙ05gv EVYN2v=Qlz_\BKas9UulWRLI  'Wuu f@'ّe "—'MD"H-t{,)BH5<);)N%51C}=#bd!`;?]_zuu̝ 0/x0.<4"{0Px bb(ǖ2aI3؛tԳI7LIEf.:),!}{Gʮh~K-N!*ۈ\``}U<fs8vt;I-A2 3T ;S]&TL r`[}ܞ" qFqZ"6$Do|?~8]I["N/J"C8e~_6]Oᡃ kG8SLerΛB.DY]("9|ܐB"h+,UVi==pQuHmx/Fc."ZgO(ZgZp& sl3mqyĐbfYx&&>(yb!v'BDUNrF(FI?(@y5+e3m!{g)KXmuޕq#3tӴPV*jGsBn ~q a]k{KT7?yW0NTN,lcs&`ܰjp(/ JLYL-Ժ!7hq:}E^J9i~IBy>(h!^TTY;IiSD>Ȱ QI=^p|b'W o\J2]=[t@\>Β."aIQ4~@-;ܓpUo7T=`P&L% MPy`Em2Gnp%ugI}_~l.0gw!&̷ 7"f`1%np{"Bx<ey&ڮw, g䮕OJuZS/Fzҭ8mM2E48f(#h#B$-`,fL׶T N Y׽m \R>3 >-` 66ݤ{> L7;,!Nz`q|eӀ`jwTw?B%A0x@xf:*z*{,3M,ޠ[ k4yZGj`rA~Nԋ+ݘuE@8Rۿ ?LyksYF M-g_*Nyvrzman1" ^~?%:s' A4oO;#⾗ v^HjN~^ "q՝s2 @;]4W9CX͑na1x0u!;0I7 ',4a8-iB(vp|!F?O@3j,ʄF<H- `e^1 %&l+`ڰ5Vi j> dʢsEeA۟ ,l'fk3J I5Fm)f$/y1[ou>D F|OQt26 ,l)f=}MӾ@M(L0R:хMoCtCknE"Y80D$F==8YP(;䓒+7 tdAvsBHJ Ez3RlW⨊,I"Fj,DM0CWg$22ʲB>j[cg),V5>[v8Qdq1 U%("I(8>P7WL ;M}!kC;KJ51>!^{gFX>lgLHR{m!mpj,s|+fž_2H39ʺW˿u/"%sn\CQc6Wd&]l`uJ<„Dmݻ@-%[bEj4$B^3eJ3Щ!O%wa- 1M^? 4A-)?&dO3 +}e9ĭgߧ{G,0Mot?neb.DE<#~,Iz{.[?cKOX@XRJ֠Y]%B"a c٤N:Ҥd=)ݣϿOi w#E-xu{/_GV9xz*h_R>xUb(E!,4CƢGgԜ+rtǷR}&",$gt>)*F*(nw_B `Mb;hP4zh~A vtfN2D r, fKMu/)D)U΁3-;:5s)ֽ1KXEŽ=)xrOtUD!9=bS?{=Og寮_ O݂2W$8*1[gsL`z$S~P.%S?P)EY q@ %y a}'Z喡5mup #˸y<8/fOX}8IYeݵbCdT+;!nNz52HyJrdPq_5m[#qRϗq4c1La{R79YƆh K'jM[)bꦶL"wyBDH&SE.l7>[_ĂWU23?__3E {QbF (]<3񂘉ܻ?RņAU7^W=qƁrY6,{7Z[bW@ڧ-b8͡1*.tbLG57^G tSXg7ZR˄QL䨔DcɕMx~_NzqL?ݤG`{7xdb>&}aF%8.g 8doه#h {Ǐ?Ȕg9}אu߽~B=u3D`!bDj7R" j0:x)*Xx{7J)po&_Xa,~Ɓ%II=~z1mz0t@ 507K Ck4|omd!k;: ÿBzAG3F6YClm ָ\X egOy.预VxZ}6ZU[8lC1p>Ly4_=y%TxoRqxӽ\c܉`Б PFZu-{#]}ްM8G~M,KC(,29ģ88ţL[hnrx5K-PWn<)Ni PgTG'VXĂp/ BlEgPqh7/.=qh$(?rW3Ew6V);;O^<9Mf[z܅(y`dĊ0Z"{}|$E(/wݿ!anNا68#uuu:7$wVtჾ@Oes*3tlb ;\i e/9 m5nԢI!7Gc/ P ,Qi zKߎu\:f#,4oEnX_p=$M tO biErO.h>܋dҌ !qdGAa~[r. FLubu{^#{s@#"*ypTʑ2ewg~y}W椻{/tb}x, 78TqlQ4݆Ė K7$OGqݧUe9D\ mv鲋lumF=܌<*""U`ۛB1{hLh+lB`XC /]xhyMC sB905euq:pz!Io:rXCWRCq`?hviyPSj`1l[QYm:=J% AYͨ\-Lviy)jxϞ'O|&#)xw?O)?O^e@wz\=d E ǢNqFfV&i^uto8;ۖ%!3x*HnX﫣D./aZe,. $JW $Xc wa9>AuT3K5H3ˆxWTtk 垖%2cp'bn"$El"+X,e >ŋE&ɁYmQu4ҚΦ 0]K5}r6\lfab7=)?5;yU8/Zb: _ Q%u}i=~{ck0çz iyJ2Y)i#TҺ=fjx`-1̶- Zw3j7l]`p]:MwR(V^ $6]YJj^+mE'?NtwZtE@S`Fi_I8z حE&c{JfZ1u_ lR,I/^HÑ]GNwof=~gGkh2Y!!946 K  EF;I?\B Nw*\Q7֍dd-ŭzQؑSP}Eo bh,F*u;XLWzT sgM)HTJ˰ rtAB9j2דS;@[\$yPW$Jj)$@(pp鎋 bi{_?01w %LH4&X33ttZ5, ;1h *:*--z˕%9=)iS qlkB{FLOTwVY{Ϟ>z!8'W@lo ݇?i. .,lEkDCWZRM,Ԋ83e{j%@aoF g~&;#oJ#|u *\2l0\F2Q*U!ܚ3 P64RS'˪+>ROĐ&i+{2`5zwH -Oe{7Yq0o˚3Ted up TYvU#\H:WRǥMa"~)TJ85FvN ޒd v==xUJsdsIm3skXOS6c"IE}o z0*چgWaۥipr.I]Q̎GM77ó=hhx>r4 .",ٞHH%DB.eMZp>x`FהZ(|N:ebҾyjSb@؜&"}KŖS9UZ $RwK4 d:K1J^]thkC(P;t7wmȉ{:6淽x5c!mٳg_<}/G) dh6k}3>yd.:̇YJfQcVe܆aPux>YH@~¢7fнCI=KL΃l5r_B琂H/ {T;s 6yiJ4 1{ ʰ^=,>{?Xi y(t_yɿ]K 0LRL)_@m=<}!5iJrS=zj+p&'J?@:jB2[-Ӕ&+fRB"/{e@t`_vyȝMl ز-GA$$3jW}")7WY qDlPioB)Pa8e_cK%rs9<2d8 ]G&ku-CP )P\[I׽/o2f<}/?{1 >wx//Lqe%~}yn6CH{؊s$ cc Dvi8o<?VI̝Y"mó؄Օ< 9(o4T:Lewmų8O|2 m$LuIF)SP uR2jrA?֥W>-|1qPdR򎝅*[MѧN(C`nv,$)RzjC!UP2xZJO{ur61J>ӿV`G?/;< ]?W)& L>*'E;3YkWa wP#D9q & ؠHo|;gC~݉_k[{Pc?1L"Y0w~%l#rj]׎)jI[wB[$Xp݅V>(ձ,P(tL-kn)Y~L6!KazpX}5L`.Uu qb#T ƆJ}gଡ଼hu-cSήԖfOü`Yk-(0p-6 e J1<]D&08¨ )S6|wmKZR>Fr1/l0Y.x ޗ*4)XvwgY c~. ^M7ǿZ1W7:܀4Aq'j5d0πVy=}Lcy-*LzW+ 4;K_D]rt`bXipO!iL„MOɞe")z  q™](-7Y0C|QE L5 ]Ҡ_6&ؓ4ީJc?l܂ tK>~/GUyW?CGSbY.vX"T2d\=Qk$DB,МTG8ۥq. 4Cډb\bvZDW0p;q:A;nBZ$,(˺MaUk0yH²W6Kly ʪƛf{WIV8]]Rnu4<0Ap]ķ⒞ nOܶ5j76gȘ7'7uB&xONx|] ?EL)2 ).|{Xt$Ȫ(lO;-H0pZ5%+ʠ41apT&pY-Z[_hswC?{w7T2SQ0WSmcعZB}E)[o"UV%Ǝ" XX0Q,2(Ewyl[Fv֘QE(ަ1 {Lpl>uȘIGg5t Z2E~9<q685Ws}AoE/>?Nxm7,P0ZV*aR1M˩Ufv`HVC-oPgVMg˃+a: "/d2)D]Qq &(1K&3gNV Z k d$╽Myu'rVdToG/^EY[g=~ɿ'90 ->Dx9D$'PaQ%Jήv)[Rv^o{#hZaE1]iro 1tR=q }6I~x''o8Q&##m GVqSa AW]UDpnQ eLBu!Ҙ 82E,iDŽt*,1gˊ'tESчƀzoD {>iB>7ӧ~1}p);8{rH€)b 5h+d] rl3]*`fB7fR;RNYu^Lĝ$QۙU u;X6c7nr5BcbbetYK((|p/ i@'Zp_= krD3*V&9dFģPM(2Y/E1ȼ°ViPKCK J»z4t czxdn}14*nD5\`[r˺7F!0Z=tf;|=̘ݠԛCG:zz ׹$ɆJy2m؆r7D)Ctq})=[}^3?MS)yJD7*^Zrˆ 1 9.fv@[ERLz(:gs>btM8OkZ}0^;(ps0sNw[@gBe0~ !"Z:n2_ьpju_ $hw٩cZP[N94 \͗d>ϖMZ>>}g5݌q鬓E.U-@ŵx"&,>c$n8E 4Iu]Pbm2fAzE^ml{1@OQMB|9ۈ92~MRd[7^IЧQBwLЌQ2h=·#|J6Ɏ6rfSq8-&6f'"jc0M9`~ d G$]ړCi99Hg]&A,O}L3nWAΓea;'zNv{'OLx:S[9?ڻDԈuq8I`rv/١SW2كϮ8wubPK B\3Ǚn#dGqϣ"er#d CT8j{`5DCrOmO o ctV"*],XE,'!7"UH(NY"*Oᶉݨʼn<xah k93KӅ}2.0 ۲AS %%ب9!ziuF"<0p_vLb賲ÖQZ̉?yO=IZ;Gу!kw0t!vrØ{6N(tDfgf*m%,ƱcFag;=a9DdJPMa/iF6d B?I :MWڈLZz%B-p c1dRaU|02ϕav'R͉gKWw[8~ixjhYRVk^;e'=w2.z߶,ݟ CivyqG1{=!=qio;](鐔mPj6 ƻkvɊE[)nz9W-$?Z<" *p^zkha,:9upy&D|W:Tho1a U$GGޡ+35x}GT4`_t*z 1vO:FV Bjӥ+ztd#|@LO a6+ ./&:&9Sꃺ>/a _׋ϟmfkT/8hq8ˤ8\= 2>k{bZKdNou e &9Tb5F[.dB:.Hrl%F`M-j&?_mB{K޵5ZS%-f5,HAN5oӧO9m;ףoW향 v}-`L 2k 86 U['< QLlx;*w(h1Rk6H7^ x{*BƍvlG.s\##zG|c\lN *C-߾ PeԆflwZTtHIw`qfUWea& Ԗw~;'3EqX. 6Y:3d !~`ZQMYx@^׍_N'ǏpľC|BkVCVB5@vxA0K.! 㔦T-_%3T$z`ձJcnC65Z͍_]S$ԧxtC#nl$psه4nPwF=KHyh4lq^fր,*`~R4i6%.Kˁ /J"!,Ē!D:==RrPXa[DNRKH&qMc"qEճh>4iE7ɻ/ʇ_nY72n*&3h94<.;L)6PeAip{ UuSTJwA33Uy}}2%HaKNyTYRo %_Bl۽DMcΟ9t;!jD{HndZNK5mgW[Ю&Y=^o7A8O%4VV~?/\Kgϱ޼+07G~P ͻ|_pfQzZlcLIw&C~Gk );_ԠO\l%Љ3f@{)_8Ɏ0Ydeq>0 i6}cqxB.>>3MPx :W% *E%ڹU E1EEܠz#S&0K+=wv.yy|r,DQh{CFjqSLt)6epvB8N}"螀)AKXln1IZe{Vzm Nң61igvᾞ~5wq~~&@qȁu:3N_$w!ݥ*}Ѕ-6n,d:+m"lXQyx"Nα.YMZUa٧҅pi]jn!Kԕt#:\.AܹnI':@&+a0^ʈ)AFikd(nŞYwRx#-]0dmI7XQ7 F)%Rh4  PNgdI٠&_4Hi^̎a!}3:<ë;|oZlN/dTޕ&x[&`ٯx3,15]&Yy)u+& 4I'E]}#gK2ҥAjU/e:_(H(wȩ+).!A1wZY ;QHA98GD9h9 GiސqmdlkJ%w Apl" T_ R*|Igʦ4T0L љ+%ūJXdžȆkcjNr wðk USh }q>¸KkvlvjR'k[i D# JPQ[<~VDŽǏr>F =ze8!ﳃnFQܛ''U~ȟ*Bȝ#!$6PrGk!cvx0{^HXOG`ɹ'CFXѣ#uHwұ5B[tT. Wmv~2[S’ۍN8w{؃D]83Zj@ Q58xޞ۳Y& |XA …d, >'3o@Apȍ}OSQY@qNww/b0wP ^P?|`<-0t sH>UMxn n͉]@{2o'4(B@/JdNwBg YS/{w[]5w#5w ޞYiW挪A%f@H-z6+YЃO4,~(9RH?a _Ytަ)XL>cZ&sغ0]PM?4[4iFqxO]iPdA| wӚh#L@l؆M^c_为 Ƭ MSiM0mDз'pAXSH>>aA2E-m *> (Ƀ[;[>Cbܢ2:ԥD! ˔ LAy`Bゑ/PVaxbRHntjMx$UvjRy#5B~Pb]YsOa{i<=e8Akq(0ۈ1 ,f?\uqYḚc8GUˊ-!am\ԿSćH D:C38(xf^h$ODͅcC=L չ8$8OZ]nw t˙/u!/q l5=m&$УFn6 K爚Lo6 KB>C%vvUSLrMHjbޭ8X..ϚIdN(8Gt;G~V;y^oT< k7^n>ͭ)p|Gf KQzuIБs}UP mX=#!HV4S:pU[>H>ݣsHs?}Ǘfxa nBMT嘳66O!ͲL WJu]4A3\ kԌمc:5GHғb |@ C116bt\NUʷfY,qŒe!5(T@p.uAݪ?W+5158 nV|i!W88"ڻJ,Khkx%5͡CDVص/wF⯲o@ly?4Goнd IFS:;H u݁Ⓩ1 9pGx%`}&e,ם(!5XV_ح1C\MVR+YMNR蕞[ם8Bc+6I?͚>2 &eMRzGjٱT~xZŐQНd`#r!ڌrÜib{m[_Y"30.tglS4[;MV}4ALC4cY6q =|5,T;mq@w} wg#Y z$2$CHkg*t8X,5R &SR[-,A6wဣ2ȋU՝}+j( OD9~vhANƸz,[{^ %wNı`(߇Qs}X9j$w=㎻sf@՚N&w*5JˢŇpѲYB{R{N@"AwhP!; l5>’dqWWDrbՆ q8((W)ޭNj\ ȟODzr0F5F3i,Q\>䂧G+>ȉt]p]{(Ie+J#xp}iXӈy>i'T"4K: )2_ϦС"tqv2H؇d^ǩĄI hIu_ 2☝5EO[4V'Gqnh:iWnS|L{+4X2y4[/.V:Ö8Gl3(+iEalZdFX OYAyX*7Hɋ+m8XpeN+S@@,ůS[V &PjS,5gFv" ƓQ ͵D: Z5 <͞=hFwϚC ?0J}1C!~@ mN>lB7T"UVC٣rȩ;"Lȝ!+%i :b³L+ 'Bkի?֜q`Vz1U+-d!2dd:D퓠v.덇._P%NG?ՌXQBeVYڀ* g!d̺U`)1D=MwWFpFtF< SO97ԝCwFQ 5\d lxaIHbfa؏*N8@yNNF7NiuEiit'&31c8$‚KmEkr~m1G- VކVt%R[x di!fʛdӺiF؋PTD1U1 4ʔ׮'ǰHK34V wɀ(2ȩ9xHIt] /]\f2!MXŖg ilfVbb hT,<H 1DKjļIU4M#. s]2C ME72q(ƎEYkt`zD>?&<~(8ʝw?N3gLs/^0_cP1SH߶<ϒdUZF[57o^2hh}e\,|hᲹ6WE G /_a<`Gqn\1JM5>] a`BXNDKWf8qOf.|LLH+MhRc + uɹ~3dN`ؾ3^+Bv*kmVgĜs A>ܫo{ՌLu1N,}[I"W0A  %3)>xUvSY)|I]d}Ų%UeRQ[ XY8!C, E3;UxSq.M/$HV};gzw3q2x@MA'2* tJmKru A^&p"0|$Cܐ$>2"k]O ^[; 7 G_˻o,o0%wpHF_or=FSX߼|/ &<˗Jlx_SP{Jݷ ETyrIPOo03`͙;uCs^kR!Sپh}E,43x>*^.!du/+maրޥ?U?( ]9q|oԠo=[O*Q;YMX7+a\w"Q5i@-hՂS"HFɺ+zؾ* 5 ,Gwd?4]Dm7E$BH)|,/Cxr1/_(//s%MzNxka2Z#5`gmE9,P1l8t`+%.wfC;= m_VC!ݲg²4N c}UO N? n1زYm_;AT>qD寜f4ґ8'(e6^2O*Ř(Dw8!hc7Υ7=%i $y5a@n!ȷY쾭7My^Ox?ŎQJg1 5ZgZ?3UcvyCJ*5tR诨DE PHldj8Du'9y3k4H}Xq[MdCQN[mQ*]9`Nqִb2Nv%:-)lhQig8@t!c9zBUރׅR>W֮/_'V0͟v3 ~͍ Jg ]ibW51/ɼ灛cF/<3+L$q:Ft}K}YgkXG \rj\YB&$軗`H5 ٲMÛGM(:}Ӓ%F!q_oތBW I/Jw.a8.!TzQ婻ԕ}ѝg liJPfαwΟh AgW: T?4>d=I\\X 0DTIu+;z"WSm*\' ;؄ ;t}LŕO!@[H $+R, ]S+,v4I Xcaj*%Pn<VJ#qsU 1KYA81j=(z]6Xx:zhI#!M% ώf=<%ֳfa%&`mZ6*tM ׍}p/ {-vIu/(Nøuق_ξaUn0QfcL_?9I3ѿ"cOޙ4;(bs%PcRPjj"d n1`c0X9Vcc13ӻ^ oڍ,p69pOBP೉ZNG.h<*c cw3ΊwNHMjMaa>_^2}p7|`[ 0% TAMeͱmX^aZNJh GXӄuQIh =QNd^y )Ŝmpz9q4=͘y q#D#.Мʶ%&tHQ.\3e!簻~@MK77Y˴[oz`fG{Bf'˫{cMgv80K1gjIGCu'꣨*b2*(;c B%iN hz+fM\[A韖} _a=Kp:Qz-im:SƘt+E VzCj ww@U䲛\bdJ͋%8f)g77r";H: UX0!vGawK5H*xmr̻!J—8/'??t'Yr$Z(SwveNϛQfnvW%N}wh~?KF2 L<5c]/}jQNHhlIaoz* X>CFC#" n `Mg0Mۍ]zj?HVcݴiٻKVٛi)L".7.y|7TVc/[fj+gT]S7pRච(j84.R9R紖&8F1xl;" TɡfuddA)0twcO+`2?'S-Je]C jRD067وelOPUP3Fk6k6k I'G4pg5pWH&̱$_LK=%«IICySݩ \,U[,0[^ZwC hcC:4?azNxZ_?Q[)CQytR8B,8k͕\;2q*lePՕݼK?fRbΘ$NpDBM4͒3D8}P2Jٔ͠|@v.3 C@Mqki Fᐎ[ aL(b};a"v$G+9@Zl-nǛruWw Аf\-T] ˡ*wNʴic}6y0 :6 ^'| [Zf-KɬQ]ae;0 CV!ḬcuGNZGcLc2J|`2ʥτyT|SZ=1 K{9c*KVbO1~ij/kEuZŽ5"*jB;R˛ "݇ܡ⺔W&-Mt(ˁgjGmHB,ȝ>puv4_w^7h~xݐvә7˾t.m˗d#܄yfcj^zd5 FZ"p0!沑ݠw BP)Fw(yt?8#}w&}6pQ5%QWej1Cl$\-Fg  QgIjAw.?/i13Cۺ ơ],&GEfcC#nZ‡fˋS٬rK\z8Ag7w~tXẒvгW&iA7z=5-Ј%x@rڟM7sJף؟5i)jT[+D{\e.); 0UObQ}Dh+}'h0J;4F3ڐ$k7VVgK"\d6Ƿ t I4gt4QƉ]T:`IXzp9;g<"BlyΛb򝹘H4}ի?z%(,Εh #2(9fW!=(Jif`'O3X57εA>/}X ~k %I4Ȟ5YڱVkQK` NEh~Bwn(eai׽ f(nJz0 mEg1K.M'>}AU0Y9,<~TH2ȐzD(xrK B1}9jA!'C .Ry\"B!83yE.e7~V ΎE|esGƳč,(d}V|ly(Q$.Ѕ)Q J ?',fO3)g.o*[U7UvxK\SШr`Р|"Nt厱^PF }0cX*{` rL^G!Y JD~q(Tڝ)#$JS[ĵ,>楪}*P͚)R8MXгHD3`kciJ[(*z `ͦ-@|Gմ}M̌0[68sWD X-'^9Z4̫F`htM7eL\30K((ewj0-}=WߑN!͟ oOy?$^w`eҜ-|s%v ^*VfגeGaYI̓ eiSZ}>`y7fAs ۩[xf("h5MAy iכ03#%q|7;gFo]8*?NGY#D?,G>xɲU%v]3+Hz,KM՚e2SS"k.'[F3рqk!˜TO+[NAC<6mv:G'?޵G;/sQ$ȉ' $0q>&FtÑI,Ć Eu Q$όEr8=}ֽV~9k5LbtWW9{^k[7+?N+<>88uzvvdW=QLXv;'$ bE8K- T''BFU[ 8хL >VENoǫ })T[3-hd>Bv)ݽB]2".k\Ki\l5Ȇq嚏6;ӳqiu\pljFj/%'(i%MkcQeR ,mDےm'u0*PRe.01d2.s:HbKȤ x-Olk+᷿=}n]i~lE+i|KZt \åWoYXkj/JÅH 2mu:±h"K_lƽpQ1CZy_ppOC#ɏF4oD.z!Ckgbe6/"^Е śp"@P[<ūv}&Aa E x:1&!QgshLI ^v;!#r4;8%p8DZt-G Jn2?AmnN uڤ,ѡӓF:|_Lw ]y{BBql+AU@H*/˻UifW13szQo13BK|azlLݡA 89]l[  3mtaNYP]lKт{ $NOoTCkƮU[Kڄ֎~TcCȖM0w4[}Q 4*<2;OEBw"%5$S&u{9.A]|W.X85Re*nB1}O\| ^yJ㥏*hJIk~&JpX'y7lqR>/{bo@U SC`L$]j3$صx#O01BEz]%? 4m164CJq.C-"g}yގ)vr>)UU~,|wT)pr`1pĿoS74(Vj]Кj"&]op`xLF\+J%,,ng4caYlMNCXx,HOJ2`ǑI".!D`^}f?ǝm"Z7(/zVG=Jb pN YP ńɳN@d Qz}E1t9%)[Bd²?vH0i ϿG]`35GKǎ^RyˈXG!@eD127aea7[=I)j4Hݱ3'@=f-"ۤHqj ewnT26Ug4u2Mͪ #3X㤐hp8 T쥽x&oz '~=o"w*Ewtb*+ɜ$PRu-=ݹ!ic&RX=Nfɚ B?[Gy?h\؏QO s# 0<D2OI7yP \"pcaMMŋjO Q#xEUb~ 2\IB Mψ#c>}sɜT&睭gnfDa0e9ozaPk $VSɖ,Pi,#s(Q/j_qS(CRg)j9y8l;B=̏Cu)AwhjVw-T\.(yt@&i\*5!tZ1'aV+0P#kJSm*`XsN܆B1?ōy"SBzN,-#DXck:{·k}]q\Ih R԰1.~M ુ;?킧xGOxvzzv٬DtHd$U'Z-VxGS X!Ned4( Z)~jJYO%z*xl'n/]!fnPP(%䏓 -1n0=,\ [AŽ]=#2Eh&WPLs$VX{]bRFWeTkĄ,>4rx=FR1|o' HQ)u)Ùjd|^}` r6u+gR죀4O;[:6ݩ*R$,Emy2BSxbd; |U&\!%]̾.o\,a;I};ؖEJUl"SɴEQK A©$G$GaK4҅=Y0{f1ó*dYW ƥ+&٢BV EC[E `weA swBK$+}  ~{#NhDQYeHBTjc`޺I Œ<a{ dV|ѥ{Vp||XO+IݻwƛȠrf4\L:m9!f걸HA88gGiJz*B.W l>B>ȍ2^l 'Qh-+}vܘ{eNHM\/.:uaIs!}}*UvۣW"ZӔQO#<C9 Ӕ 5ĬGF<$\jihtjzpե7TB`x6PÙnEyOI=T0O9k2e ͏}N 3/; صyRKiH[ g=P<b\8Ip} EvAqcY 5-l/ҽ]]J5۾Z\͋an%dGV4eQƇ =p8\O^%)۟FNrZZ8tdUo&ЄZieXVe?Sg N},M.M3^]6G(ZV,Ftݢ'M 2)r$K.~&3E^<۳P2@f» Pk+e\@?OÇZB1Q4cn'BT1. .Q#dI(b…C!G%sgn<kno>A wK/t^I@§üPh +#]If9"bbl5d{dY.0- ˲Qt:ZO$yl ]!rzs*qR2Z]`5iU\XwsR)"PX,[;نL\Y(b\Hܛ#`EžGb i2aU98U :,x k/o8j?XfPъ=#5iby4pnYzQa1=L',ЖifǓɽBw3ttܬ;Iq ="̦g0) x4WBcBs^1O f ײ? (du*ZBFu!%GU@"ݴ`va 4υ+ͤE3?Yq=4kf\`$c&$ۮ 50r tS gHݻS9r8 N,ePvSj_4X B,臶CNq+x.~5J`^)Ji;.tK Y "ROy% $ dq@Ntlv OJO_aZTϙ@ٹӲ-=IJ0f /gR 9(]SﭣIE> >0=ysq>[3!%dgm=ܔR(ł J>\uV3j(ԧ:} )!k'<>t;ɕ17 y:(7+G{abԃ|8D8CI,ՃM ()Aݐ/ӓ>SDP4uX-5c5WW=,NM&Cb"p ! {emb >yNyZ帋Y3vA .ǖs:,ݒ hȸqß2Wh%•Mu||@bWtJd$V,xbr&uy3鎆¢ݓi!ݝEUT}N&b'##(@H}ӚV5JY&]eб(xMqD"f2 ÄZ(ϫtPlmmrqA&M4=.SS _jXbg77zWnvR ȯ2pk4[d|ٗ{%9Sr{.?9,COݻww)s9<ʔw,擢POJKWmU["_xqnM?zM %&6KҚlOKW&[|n^P(Ys`W?ᾜ 7$..&&L9 U,>iOkr@"6?VMR ]x+*- EE|ch{1WS;Vldk:ċt9DK΢mEE cOu]M%*!8ɭ3F;xMy}ڇ֠hXu%HgW30yDҬT,eZpv\@{-O0놫OM6A1^*7ٷU 3[ug ٍ ny\h"F]8CGiYv) li1Yy| J㫐\bʞ(#F@&XE l*6c2,ffpOյFHR@fwv0Up62^ؠZ,_-Ѹ̸y.l*'QynZ*ed#f@]$oZ!Eaǹ|_a%)lfV)7ߟ.7'ՄjK}cԱCѫpMƙY#^H4O@]%@-du8n;!4V>%3Ѳɺ 0̭<a9"kvZO5B  ZPASQR,LYh̡ }*bҨݷ0Rd[T[4N[A My(8"Iܹsg<{8v1rHC% 7bjǠX\՗%si8vLKCrc~g]ƐW"tr "1$MENaΑ8.&zP:fU`<_'s._>5V:5 X^* S R,nЍ.h{vT,&76=lv\CIieG,Mc(tM9[n:dBwQt7ۿ4<]Ox2᝞?)Ǭ"0 e/ 7xj;1ԃ9ud輗urXJVA3${wV5g&w~'YcȂτt@gpH\c۳&doaaik?repbz7z2Q7{mC2 UM!BlPFo^4,q&˖aB0.)M{dc\0qx.O(I "3G0}TFZ O_;u^iBd4Gy=481%_oMqaVNؐ"Ha 6,dbvO{k>L $!cW1>(08$Y׀=T,u_A <wMɐgHvD2N\ȕd:}7vsz"|e MMAc0KY[Hu|+K @4?ON_ߞ< ݅ZÏ{6cU~jwE_7qxu;":4Ԉ& ]mSQ%zF~ALeެL3Z#<t\ *(+gѧBsv;\ !L[WR*SqBun%qpsҮy3yi"b{ZQZ^)1Tt@nf sm{xaۖP[ʻhiag0MphRlJ#! MXl eȺ'0+"x<+B&Zvhݿwe{fpGU25n,jx` q;fpꘒqh7Y,FS\o \ o=DA.ed01W.D ˓RAEnGzuAE-#X")O:fCy Z0QᾤJMIC}1R@q `+$-.v3zAnbKRG߫"(EZx1cܝc 7Q=_ѳ/KXUd'_l k04I,&QmXPHGbgܥM9l+"D\k]-SjQRv -z8-w<}=G]6L% 4~v{L,!͙?O.n0da#^/˜RT\p '|͊6cX^JН#mWL ;flwy6mjRFAw|1qHduzjb-mhw}YLw~~K2W:>v7=z% I2h/S\F6Eŝ |])٨~Q#]0/ Qߪjaֆ߽ŁGGGUfb:< o6N͛Tkͫ- VdTA >(S? ) hD[)=ԝ_!P^;e ?TG&0ذר OiZ4Pu>/? ]G@`Eu9%tUi͑z\F^ R'I mZG7 L~<[ʞ0 ],X@ Դ=|W|(jJ8CQ.X 9C 8h 0&{c y|=}g[淏tOr[6ФdJ!DzL4qu(89dyV+. 0zćwXD”WT*#k#]ĒHX’ar`ijAأZ"^ej^68-}$`8L"n"A XRORX(Xm81DG)ށcQ&؈#1&YVb{ium*[0\NMjeS⾒оupp|{V^}byk֢w_999};MD.EdPc#Ćﵽ%tN@x|.X +Z$UzN3mPI9^b;_/XI'\|!|-!43q*cQvvmu ߃Zذ|\yo%}\6iw Hըf%Eu)avƗR%ԙ%xLE:`7(eֈk66&>Foڈ}|Hr!zQ koK6Cѹ7o~ykׯ?7fج| ~tm%g魠$pjuW_*х<"k1Š)Yth2v]ղE9EZ@U}*'=t"^p\RH$5H晀L !  fN K"({9&dމ Ôe|k::B0v MLRd5V9#f."=_a<-b$ͣa ?b3iv!g$fh\eI碼>@9J=?6ݳJqZ_?.,dP |r 7'D",%1`EL^Kڦ rnYm5"M+LBiurm|ZCQR+I\.وK!N髿0sue[ cXx Ti!OF,ڊ];#210C;8p"ZmH) 1nApKQ im 1-v0;4&^v||;wLvrjݛןH>j"Q6w qmEv3<ȽRͬRq;8n莝8 FM}"G~p~ƅݣSs(A`Uqv鑻ʠf߇w")S#kx 'S/2;}`-\3"?7-P&i#l1YSuhj?#$ލplj6Pc unfFZc /+X *]sڌGn~Xez e<7/LybI;99fo.^CvB*]b.ݖ/a7K [U[ aNajThmIbz.3;ѡ{huW2'q bUFF3:EVܲ_s%dF٧}0!ჲ/*~),Tu)]Le6٩uE:i2E;fݿ\iRL!&i0)h۷Bȹ6:YsVqÇEʩxF%)!@:84qMm*w![ }YƇl ANg}+xn߃uņE? *, ƕb++k%0Û}蘠$?b(.V·챞}֭Ȝ -j=9-9(xi;X|<~A)V{BqӓO:7a)XJCB^QJbPѫY}([D+?Íݵ]q\>uF+98X OMlO kq;|Nr&˻R,tW'Ќ*Z& o C5 4 )${+<eTeQcVҞze@2q=Mx0|%1Wvª)Ibш̠]SC͸y~zΝuo /)3! Y_ߜ%)h{ttt޽}ڜԕ>Squ/=Đ,IȢ޲nZ[a @(tUA>%dtr(>܅ }[{ d:9l<)u&^MȌb @Xjg2eϥFk_)}h0^^e.>{3+^*ƈB;цr5l\ۀ0Lyl",ϒ0::ju;;AYBn|2(TÇѣG_q&TyssbQf\SP'|hg S`ϪP_W3 d-#]I;vC< ̧a)a/P!]]N+ěSIh(0"b~vk+k]_A YiO I2Kq", kUqR=1,%nY[e\l5@ޠ$%@w/Vd;sRSJHOYNa"x,Y#??D PVnh4 *¸$)̖sq||ʜ)k>rᕹA7޿rRA@BkSSY_Wy1U03]` ͔;UWii{fGn|FwJ!&>%f!LPTݞB?lmVRA?v-!@VA4~F=VԱI}bq, w셜7_@wSʣBh`57&W ZkY3WN;|N|ĸ3>ҕ,Χ;Lw;q?)^zS^IU?q͋#_1ė[F?mi ;*2`?L ayddj/( :ئW /nMN=@߫oI%/#9gt3Slv~"= &нMkRᖗqbP'}.?*PU9Rzuh-iٓa`z]&ʈ.E0w)Oσ‰򓲏. KC8i6c|{ ̜fMnaðV4R ĮqjPAƒ|{{7MwOWvϟJs9*kS|Ν¢hH[LM|T*QpCs$r{/Z:@E JdXt`+E2g%Z6 b5$бVH y ׺ַ᢭U( Y@5 >V˸=ptj 8"b ]:FCq|^NÎ9&4shC[֔ł yK7VnMmt>4ܳU G" YD$qtqiSÃ{ʹh ʄ@LOz oƛ>{~ga7x}L<`/cfdz&,ibQ ]>84- +ty(x~7DY_Qe1f.CP\ WFv휃K9B]uԸ*x3ϡ# BDo$zŸ+ڰ_1b~$^/G 8sC&| otnA $L˵+ A!:k0"74 dtOZt{6q?2cw w}Ӄ}gW_Q]L] nrcݕ|TQ<ևKmJl !['^-j][p'z2{ rWe%:() Rja0Đqyu3>xƍ{vvvU6ݽa)sx36~"nީV6oнs>|J n˷uм-j) ?\cptWGBQWs%Q,w 4#I1'4hVOZؠgqa _6g!nMna-`mr|Y% ̂wB&^MvAm-\a}7ā5"P>SHBD /CSy3/0a7./S'0nl`W`-uB4ޝ?lP&3}zm~ ^L7VsT+g,=ؼwGzA-r@=&\+L>$  7WB rE ۷d0+nYoT@2u$e 0tQ55*lsqC!GC_u1`j1XCD~# omA$ UA+q #(ٗeO 1md3\P(3|V_-a7h ȣ{_)OUJ;w-'zDBt&By_O}omi.(b`պaz7O-emuHNv "Ԝ q `|bXD!j>atq|$R!Dov&՜7LhVK#< YZV01vq85gT7 P/[,p5;FXqF)4$xbf cE)/I Kw-PH% 4`8<5l(k&juUvŮ2( wt3{> y$3>o4Ã<%=R "OA_\vdBJ{F)ǿ$ X!ٻ-˗*À0dE;UlZɁ*8"6o$.LjI0E@@Ykǫ$kS~&zЦ Uһ7y$LL8 ^J+hmZ3Saf1hub/peY;}ʰZ:fH@d1'NI7yPWt:YbB%RG­Oӳo߸qm^ 敷;x' J MȻY |^]U8~>޾7ow}|cgp/XJxtTB_͎&zPʪeȉ3B-~[jׅ!"ua `WvVI(ɍ\u]o;jxv: YtY<Ɍي,GH/Hwt65*VUY+21F[>nHzf]ɱHw .C XxĜ66j /k5w5%LJ)Tp]] TuZ~_ 7CE2x;x{x>:-*hѫS^|Ccg?VeؔӢ4}vlJ%cG4Y3xQm1p;E nmp-D"<ӊ_oQ!mv/$TpBcaJ+r_Ư 4_wAM,>CaG2 +$ VP3 =٩O:)Iΐ-/8?pDdG29愾 LOh?z !h HC+ Bn)M}vp_.RnC϶a$-KHϲ{pttӳ{=Ih"&πl\`kr)dieKU!=VK(DUӮ}0 .gĻ ' Ѱ$;ùhӬEAMa諨q&kc -i<$b!O)Jat_XBSU:ETz鲾jAAf`|mtIwkcz8 ]M,3w7<|oqIɄ +34Qr'=W]X"7oEk1}w8<ٯ4'eC0XB vB,D”qIYuH!nVz&;d@whvm<1(X HAz\򊾣@"l*BuIЅ%WkC%]󊮕3ftL8җ κ# FZ´09tS}]&]) b&ʬH 5sW"$E-I}GUSIݻ~G` eVn` p/9*x\@k:<Ңѣ?uI4IUQ,aے[­D9KKt[h]jw{߷1([ԦǤ)c\8=Mc2uWŢ]h'ԞFy_ 7.b^bq8hL^{8.0)Ұ)x6mG}sjcES+r JvJ!0=qӽ{oo׶g؝haz X2<t8q m֥蝏7o7%M=R:nYK;°`!AD5+ ,bU!CNA(N,6%wx=nݸodҕ :RR!G(a}B9p<6peND| %c{,7O%ˎ8I{8gNu9BG-™-04Xv2)f@-3H20ݻ{k}o0Lv%?ٗ))XvNAd@LaI@Ŕۢ{>;={p ]5T[Y[[\UG}Sl۾%{A* N7q-4z4hY7BWS#Dij~ a#]x\6_Dyy0Bx ~Uy'|U.AAsĨpVWP "Dl;fͅ_ԌlAĜ/47 Ym#/j=3W<ױ'oУh%dbV@Fcejw{bBẆb{zُ#bk2ň3Hfc!LznƢw\{ 'z87{pǟ*8r3h-k$AjQt7q\9- cu]u[BOjfWYtQ+ lw4LuVH>TFi6MlN97wA vzK 1i VLS KFu|\݉wC9ʕ/ROZ}-ii^=u֗߿IeX?3wgyl!M2欌}A${76E[ f$xLzψnU1pB׺^)ա햩ϡTYf.%xC?>0lsd@[t4w \9EDXyI7)(c%3U3FT 9ҸZ1I#[\~{AF29-ࡾMzQwVHq8ޚqI.R:mVrt<|ܛ6D3l$;@ hcEVɋe͊C-z[zo}}Ufz1hx¹VZ0- O:a]`G7HnF9GI%Phjm#P^Qae͇"o6' ;0`T!V4|9+cXCosءoFvG(H3:PJ߿M-3ARh+}GJWqzzrѣ/\.vq (7U@4.b ^JHﺗΧteS擢wrr7Ϳ}\A0HUqL[`hÒj e\ yBi鋲.%1 㮛t5zmUХ4L+v$LڄcYqqx2HhO]py"z}8L%Zm /߼r1 3R"߅*NAw $ScvlQbL"bl& ;x&b:juQ5f`PXQ 38Q Mf!Q!Tz32,0 L 5CNDz8dd#I%Q@.W׍JM'6@#R*{F`\{r &. ym8mRNӳoQŬEN ]T1)f!Q3hh;.;$?J|.ZOoz2^ϗ6l>_|^|~j_7/| ?|ڵx6Ř 5t]EixX"Rx_{} `RV^2}0@[m Nr` nݸk@̾C;1*6F|~j&osaCba^ͻ<֒J"ɮᅛ"LAۆc{4SАk;w Eيpjn0=dWo,xij&Y6ب?$^›ow08]|&e cc;P~-7q_<ټ'ޏoZ "CK䡀^\= EYxD䑪&9YLaH^q)UxhlF@>֝ڴg?ۓJX7xV<nRԃ؅̳)g4'hQhH>f@=09x9y6Vt;K̳mVǖ_>88?yʕ%W2\޲[!ʐpԆNREpmvp+FeXEQ.6G,: ( ߄ZȫnI)%ӎZLmR  ّ  (B9Xw lDrO|,?'OhA+n#c.#!MӜ}r$cR ^WǕ# 8duG&d{3^k۠gZv~6F zzzr֭?ѣ?.]}Y?'T؉4iV-Y $6tsO72AkʂS[W7̪ó⎴tH#rx^$|eq>&bR\wOQ3>g/ @Yki)i뵊L!ՔNoK&V5#o7bm@J{3egCMQah z #0knh F\gG*]yk?jMxE1"L [Oy"EբW kZ^}_~A 萍$=Cpa+["a'+dMp!wȴouRέ987R.QVx4M!~E %pR[CJ JCqԢ)@wB itM adݬB,Winݾ?~KG<@O]]=HxҝX8|1m ^F;P5)Y_,Nz|e[ԧ?鿰˗o+~JOݍtG"(( s f.,H&2D4L_*:>'( y[n0Eh!DTQpY^ :l(X$h6oؕI$өb4=wNT۰=4ûweT_=.{ ċb:K5{rs/"S]a a#;13=+٢yGM̒6D$P u%7$oCu}L{Os_k).GzqC"&4UBHq7`@aTLF0ieuk` *9* it_ʼnw$ +LS #:q8Y; 5Ӹ7 ?.먫k]' Y.fcwk؟~>~nݺ哓Rj{<!FQ $:PP'GPy cԺP2^; *t_/^ 0/ͯtLePd'rc%BA(pzP*Ʋf%/hZ> 6K@"0hGZ H $)`5jcc`n^$:bvae5oyP[+QΖj?k8ز&2-6L\om&ѣG|,*W SyZ0[lt.׾pgG<!Pm\u,@:ͨ[R׋*Ϋaګ s>^|/_KFr˅"}B:0Q #ShV q4Q75?IpV]4Pq[gth >h>3֋t#xQ2U/[{tC'ф)O0 FMZ 4~-so߾/leͮ;A*bL\y+ZWؕP\Lx׿x)[PߩaIs^O+]t3k׮'jVL,=U izNXD"55[B$R2>l}XxC&*,(9'PMfȓn ǟ֢j@we?h(*Pu/aGˀaoܧ,eUFKB-Aa;alytjmA7~n&:/tߔ'0Mb sůhX rjv(v-i!|>,w1JR{}0I@iW߫^m~«bgNҍ۞Lװk2[yi 4ص@6$Jߨu4XNѦ̠Kltr4sbԈÍG'XW{i 8g e@vjJl;^R)~n;++Gh8m~zhm ݯݹsg6ݍ"ҕQ}Y qu}#5bע0>j0!ynCK QŪ\lC{ԃz@Te2ťX6\rM+׮]+.]TW (C9@T$)t`a[>IF|]W4eRjVBHSm%: 'Z^@@հ&0{H4I_(aS=牋Lۑel7Ms\v-0 Ԯͩ4yKo],t}Xye)hCU%HbDJ|23OC>G*xNO(dDŽ`TԲV=tҟg?kKo誅 R bp& &^`iz`E(|89'8{}+5:3h2D8"SƖН6UV)RAO)!>=6ȿʾ1ڰ?H ]GU,AKޚ~bNکe!8ŲIzjn`!;_vnbRD C- o&ۡ4w |I)n2I9|/|N3y^ 3,fn?X~EPTOqګ0gV^ }9_kK/7]r 65a7|Lt{9ÅSVahX&lnLj r=::o})n):ѥ%#- afd>iS &E+s \W=xDDp"zi᫟Ue)zʕ+k׮ЕW~'WӖu$f5 H)㈤_sЮSQBA0 vL=[X S[Eb./ Py;ۢ MAAKDjz#Gg[X*9KDtVz.XwGmQcEIeA)yt.OoۻK;H>?]R4=o^Ԑ`HÐxm w1=:k C|8l'GxLK`}a OW_}_?+?tҥ7se19XE,@bPzJsbQMwPW,RCU~DEŲ`#ȁxKa0:f1dWr(IItgfN3bȡLӿ;qes~`C$D7eՔ_y;IQ]НOt=-9'A'#gY/ 1p{3 mdi'1᩹`7 5;)֜x4t!^bۂWCe/o/mO9l>ϯ?o}S˯_%QmWlk0x)>#)KwΚ] c9z J=L74 ,hX$a=p}ςЮ17:.$<ش`8|ҌZQO@ěA\bu>G~ǿqݯnQVN`Qu9z0^k+ŧW7PvD# O&꺊gRrm u$f`01^Xd41MD=o=-|!r_w6޵MB|,y ;!{e*}E/}g;!]UɘS]Pw){8&n޷*Q Nf4.CIG[,`qU֐N-t_5f4؀,Tc!17?(1[Ne=VM_JT<`jS ' \uuooW_++?r~3t5k\G$"bf  J_m =Cp&1:` a|2xCm,a `&F"fabzՖhLދֈj pM_(?܊ kM)(n|(z%''rtt>G}C3*.BAfvx-3_-f. _#X7,.0u1j=mWUX(KG[Rŗv]|]z׽tqLL{;wPs_}kK/o^ҿq2ޠt +y^Ă(]2ˌ;c0~+歉e Ż;%\@*ǑqkMM\׈%!řO(S\44MvOyI)0O^Y4mرd$[X ^f{o 5GɟI JT]yV;Z; T(xQW+bFhjsh>BCʵ==GrD\q`t]l o-Evv"_1"}umm>^~׮/]W^\r x -q%&N%\Y tC\1o ^cn%r1~ZEB5PtL1)Lf?o :.iNAakԫFP)+_PZkBòYgg>>>q||ϭޗL#T9 \ͶЁ,h"̶yxwV>6s`1i!NxMiܜsxC_Bv ašLiS_N~py;_Kߗ7]~3 +W__|{/]ͯ߿_˟CVbpR QBQ{yFDq18 3pv_D臝\S\ a9ZB*r$R*e YĉY&c9}6M>8:>qzzr{S>|d ;N; L\˝epdaXN]œ6/ԴCMHc[T Q 6]t|tsE[7b|R)'… w6O}0_\o>IpIL'߫K}/K/J}p7.]j6^|GŹ*Xδ[s7OO7_s)fߒL~4plǓϊ[Yډ/p=*QmZ[_-py mÿjR0x||.2rDm(vşDq?å"Ď>#P\P,-) )g GU"xK>OWӕ\o>ywc= EH]Z<,})-bR_Ϻ͊~.M|IQdR&E.xQ{'g&ɦDMsY+iNj>(IaR\ E{Q^|<x:R.a닏b[*̙AkkNjΊ.ܮE{,"/|͋E{]\gi lxnkm"|Q^Ygxx䋏Njċ/>>i"EUIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/0000755000076500000000000000000013242313606021023 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/splash_anim_01.png0000644000076500000000000005454612665102044024345 0ustar devwheel00000000000000PNG  IHDRjY-IDATx de}ﭾɫ$&7&o7qɍxr 0KU þU n(L?9u{"CO|o۪$@x@x@x@x@x < < < < <@x@x@x@x < < < <? < < < <@x@x@x@x@x < < < Aߦ1}{g,;> U$0oեa^;d׌蚕9U`= |r(;xm"Ծo~`pO.{ʩM|ʜ^^ۤa^+c''qeOħxM{ˑ^)_+%]%[\zjR J >!ÐN"dz>Aϋ[ԴEzVBx陞FsKuԲ%{rg'9l= &@ e"k!_p|L*HD( ׌xũ̩=ު%=| gg';~]]%qJtNiQrHj$%Sh¾AC~aN*?J~@'TNN*s6S_Axk.fd6٨_0y~*9;ǯ`p?B_k9SAEN_@J}͈-ɽ=/kuz)k@xk8٤[ҭtNNsj#qy"8In_x_;;0$EyceJT`(Գ*?쩤>'NZi'OtRoϩis̳VKxn}fu^S_>Kt$:9IN,6BV0;8ÇE7`d#AcX0|pm&@Y~H|ZǴg'=>O֬ڒ5 <.Cv𜒝R]cɉ!TT#p#nD#H+v78&w$d F  scqSN}vRNg'=,Fӛ^'7=k@x`5gWlzEvJrҮGg':4'KN'mGb#ĻcXO4E"q?h4ux&"C`4h`L`E}'O*up Ou:=uEٕ7,x-mzJyh]lUvP3Ov Ʌ{j8Nr,9.CcHZh\W<E"qABf40,Hį0 wEMrd#䧔a'B EZ)ɏ˞4"hũ̩='}=*=!ҦSʃV\xHwȎ/x]OWʗ꼊N*8SlDF7iHD*$%'-'QH9ShZf)x$D/t.>;Y|㓇[H|\lFzң'[tVSx^vg'lVvN)_C:Ut$h(s\MplMpԒ$~ )&8 M*Z⑤E~rSG{|zSWHzJ ݥLr/eή'J=ؿ˩/UեH*F=8SrFIRUlt"=Lgҩp*it*5D!5ePKiI}buŒ/E{ٕ8i}QySdtMg˃VLxMwnLyώob:ο)I;٩.| 7pE$#1-(YҜHrbT,]J%RZbKLQ%3#Dz4ΎeRT&7Ig&"ctf4NϐӉAY~d,OͲ'_t_%LWgIu| щ&x<'Dg9=eGS8K!\F ,FA>_8<+Q0G紐?pD!3(KP`&3c&@QI- cL{Jo/seovKʚ5 I=T"eN'`\ԥ tNzvӛ|Xd) <+X {wQӝשLKkzHvTŒr SMu\4{t*:NsDz5,krB+ z'E҉LQ~0M9[j(/OeOH|ԸH|\4z|r^R@$=S'=`WM[]-ѱD2K5(i+NV+k+Q&J3Ru+^"~]zD?Vȯ7GάGeZڋy2ВInzSb2b˳}I1i| [xLwbh; 8Ɏn_ʲKFv^ꦹte=|;FFEpʥYg+sL,_.i,_*U`rRZ,PK~-,>ϧ/IM2g69Fңǽ=ĩ}=;͈>3/7}'IyN-55 <sJw|+R&OdTi̐?zP3{ufKDKCtⱽ{;Y$Yjy *T}Nǟ_TTe 4{J{bS$>}S_6;7ʜ2rS,G^2N4OoνMTڔwZIyN%<;t絔)/˫neL{.fr3D.:=˧|]HW8FB ]?t%  .S}^? P&ziH},(u=>̙C-$LB_aHJz_OTAhԷN/; SR^ n=ɘ6T\N[V_SK9s5JwTڷSeg^PfvK첹kIuzVtCc˓,Q͓S[''뙚L3q`&!1%ɯ^|*eJ{爉RiT,'ݽ:eSAZY0Yz 4Ģ6yjS` n\`iI/(@x&Vʙ[Ns+ed_PQ1ʮX>Y09Օ(T4E7<2~ Indt,9mbBmSSӷkAL fcZio0u! pr\&%ǩOpy>ܢ=ۣEz-ӛbeAȢ46Uhg7LY~l8a]9LtؤZߎυkLٔ]&7J;%Uv^_G+SVRȕFG'ד!9IpfIl[gL53={׬=*3w 4 n%&5N6eor|F= J/\侞 ,Oo4U"<"y6MڔX <&k73-{wRF$;uP%MRf,]2saLqWԞ.;e%Z^OPS7$M//6kC|-s|o?ڏ}nۯ}ao͎?k_/xg=uï?p/_~qOm^\.B!Y~3XzoZ_e)r铛5 yj3& 8< 5|H-k1(Ax+"< Vwn*wg74%r)SKw ]PK99reǽ:=M<9>s^ܼ&9JmG~cW'>oxҷ_|OؼťM?o>M|S[Rmfڛ0&:Gu G+ ܱ^7Ll*>X{a!365Wxxe9e͆xhFxXQ˙v*Nr >yP%OJܷC*T[:n@EݰTђ綪CK>| ~?%[Uת/=mן|K/.?DϚfKSwJi&.q]kAJt+  -E~^6y9,R|}%)yxE.kS'5_oVLxvuʙ*ޝUx*K>&2!br_FJ4!9uzf.Gx<,!v=\]o۪o;ğ~fiHz D?ri6)"RG~'vT;kTp9ti%-`}F^zBz/*u:A6 %&3;_ۻ'3_@p.e}~Q4Ư&ىٙQG_߹oRu'vKiS8wddCbead'yuBh-c3&6[Y3\lHxrnCgCv;rdһ;e*VʔvW{v=;!;'oQ C'=3'&Fnw8o<.mJ BooR^\% <U:ϟLaJd&.N~z01s,;Nv'pS۪;m/z G=IʛsSBzxA}z12f-m56zyhf2+!ʚtjf@z:e5h&4ߩf9'a5fҝePŶ)Ә3 ;Qw^%mYԤG,0mx`r}jSJy%'Olɱ41'hp%~{W <ၶ m%6^5[aqUEڻ'3Ѕ4 TT4vѧ1< 7wlV݅iIWrҧ7iA}Jy#7M- C OlǥT| pJ^+kҴ&/S/'4S'5!<ׁNutfb[9V*Of ]j32G&Rس[zO77ןc]",?7o-mNL(61ceHIyKxJyE3ͫ]_85}f'<@x5MO Mus:^"D}XS x N!:,&6i/N c\֤>7lӚvKج&Xs/?8whS^G%ҙ!tQKj9Ӓޝ1i!,=p̖ nm?{aO,齼{fMN',+RYJӚ\ܲJrϼ"v^8$$v9/^L95=~怼nWW1L 1ypE^@wc|eXṭ$Єfg(iz!qBa`nNgS\?~ͷܝwn\tw "qO\ yRn5A>1oAx+&)4)?$¹1R`\Werr3F~˯ {=׼4}sSwNO1MWW}sx+|A62:{/T/;'&5͋+jTGŠMSABxxӵf>wCx;WYx]\sKf SBx^}/ߚ~I'}ߓRsOIK 6x,9sw[=Kx]'Hgͧ¯מ j,S{~^ܒ);>Ğ$To nh=<FxMLi:%&-k - oV]ۓt x̵«%8 /SXK)=pkN£s=28GgOscNC6~"Ⱥx.-Cxi1˥6K+Ҋ@=tM{e궗Z2NMP“O ۟3izẒ=-ǣ|Iǣx4 O=m}vKS>=69}ˤץ/{=AxWo#|<Xxz^5G“GlGǻhy

    ~ϵ]22&<(zxdʡʥ 4`>T=DXxNxd<;?{mSs.ޱ^Ï {zgxqq{f&}rrQ`%=_*Q*OQl,ߠ>K‹Xm}:F/S ~~?g?xGK$<^<)G}9W/; 3Źf{22z@.K$<^*&$x, bxI‹x霅 n;?£ M5|!<ၝVxnL~2WLm+ Yx }Gx$G`Nj[hRx4R ^_ĦwmtSŴ|rZgѿ+e J /~{eٝ&X@&hx/岦)Mk{iMux>Ifg諒w><}z=HLs'3ޝ;:BuLk9^'oߵ<@xu/%@xzOᩃ+|b,>nTi7-/++}偳RI^} .o~SJ{W𰐝itJw򰊼lNg3=:ҬlW < 鞦jjs/'ؕ5ř1exx4ե7f-m1=3ufv.O>7whۿw˪L9zxht[L̴>t"Ct'?d PkfV.CxIMJyaWiM }x%a^Oyj/^?0(΍qisldL6'&o66kVKoqᣏ{}m5F7^{i/,fR~FLݙJuXlngyܦwjNh`)}$V%tuxE>5)O^DT23QڴLmң;#G=[M}OOK{zڛ_{{;oz' %m;^>[<ʣ6{u =;iR4dg3vTTʴIwg׻rVr+gzAx+簋lmZW4}WR^,|njGf]M1W:W>C<DXj1G==z;oBƢ;g)=77Gizˮ{'WZvTW}?qcr@_$WD'''n%ٍM}e7҄ Y7"Y3}a(Գ%wLK9S9Exv3hBx O)}"wy[Y݆Wzy<K&+ 4¥Mڤ ,e}UA(oңͱ=IZNIo.H|z󁅅H~/~O_DG:AKuSw%L^=vmnu] o'2X.3'.˧zw̧"/G{2$&'5>F_*«+kz^}EO}[0$h Mm~Nܟϭ.Tɩu#?UCÃWʮT8YR f.5TʤtǥL9Q)SNwn*.@xk*f˚Bz,+ "<1ÇpSXhjS6y7OXz|0^X^nJECОYub߸䜼E:mG%YMVg$AbJ35Y%75y86EO#эsΒiӘV牞1IvDfmHEvLKJ4ɽ;t*NәmXV[x )VR6x\ڔw~0%X(Id+5sie98tG4]CeNKi75yԔ`zZ:M1E&C/SwtӜޣK7YD7|8ƩnR} |nyxܳ%;2T].덧5q)SZ2*WU8dSs*gR @xk.<Դ)5ZBWԔ'Ol^^46~^26X26ңd*d^8o_/qU19!*s25YiS/wk姡[kԘdhMHM|m,7=ō%K)˚DSD0S(aK=;1Y$ N{%7jD'N*qu}_K}Mc{;wtGd$Ălwl[n9X5*kR}jYS~ .Ҧϋƃ檂qs!=[4W1ħ9/4JD!?MDVOPĨ.zDr?.8Jr,ac@/]D?$DgMuRW8eW(fw2iPёht'"8 ,Gxگ׷Cx- hVxʚKjSetIMTJzziY(b҉bb_rD7*W*$>Q'RH[CjDJ$8~GLS(aTxϮQΩ)5 X.A-"+BN"j ڢI^4S/V %Q^t`ꨄLϱ]N.eAuﮙt#X^qҦ'֦' L'Xzfr<=h˜GIzO_I,1o9D (k"8KҢT$g.eե:wut.QVdGhhˮQN-e6U <ၝFx^ʚͤ<&g!ܔMsWT2YI&rӚ2BG=>C~EC~J}Y,2!U> ˍ> -DwLX8:]2{ut]dӘeԷ+e^EXΰ M@xUٽ൬LSOY6~qz̋̕X2H$ y,c d&g'\;ZMwZhJ4J$CXPV K}ƏK'IN{)i._N.˗ڿ%e(Jd<$;*c6khXt,Kx-5RF7?b}:e<&Fkk$=iO.d4J%N9^[LRǥN񙩯?RO}|A]JF$ YO"zKœ 'rSGӖXra{q0kx\)Vzv<)d}9KRQvNv3tgWΤ_WN#Iy<,7iO/bQJzQ'N)iOX_0ZHi>}qݐX`,{@ː~FKnԙ(TJ2O %@k2V|S&R$ILs0ޣs]K0iܮg'ˎjW)p |SN{\gl''?kX$tB "3 㯗L1 N.WRʥKѹ:ש;>g7 vĭowH㯝d׎t5My,? 7(<K#u3Pⴈ/ S Ţ`8 wf ^0FCXp(E!_Tg9TʪhIyľA{'48fJv2' cMiO#GHce(H&FZ&#-% NJrxo'9ySk <]Bx^KS?Mz:!=q,ΞYWBŧDF~'`)"dHX$D ?"6NpvS$G/%HϿ6u;?$fTMw g'=~^#KO5hŧ:AH4iI-"Ԉ$"uB8Il<ΜEpN9ɩF~nUfd'2F*Jwj ͺA_شף,rڣJ{foF|Rg(J8܏S,?' .z&pлJASSM{roM|';g@g]S AR2d 1|0a'Em5Xjd蟁˕,95YNiDJʎX:ݪ <ၝRx*mz W'=_ҞZTǥNnQ˝,?N~fO AC/$ N@Mµqِ:Hg}:Q ӭ_Uv+ <rGIϮSӞG{<">TxHvdhe(R&*=RgcTɂLQr5ҜSΓu%;3bjϋynu9KMU||.ߧ?N"}"2N26,7H˕6]I":e%vˮtHOxXWof]oI=>ZX~r.$@.D/pMJ]4(D1oۙd'h <ၵ:EzJrڣޞZl$>9ǫ jS%(D"4&:Bcb3ƽ8Yp<|J5u?n'9;5[ʮXI-Wz].sډO:=ҩ27-BEҲCL'FIN:X_yIu^J&;@x`{zN%NޞNM_>Uʏ˞NTRE p"L '7')XDl[UAx!V'٨)KjON}' _ih$A$E'Xfr9V\]Ntͤ R&@UȰY䲤ܜ ^*9rE것Bx^˛vk&{|v.Dh*D/2NUp+NkFt; <ၵ^'4+?Uj"@.OHr) U.iJ^$+S\ iSS_DL[QAx;fi$>e\M&mCk$KلtE|Nٖ@J2$ԜD\5+U < ف=/kEvN8%&fK^nɭ <ၝYx9 xr$hIpp58Q~tA5 < 2g3ɯQ НFb\t":[$h դVBs+E6)8k_ڕ#A3j*Մ%v4.[ICvrlU,0XNm <; o%ʞk!2۩˕(N{]Sn*<4fb ֥eR vQjh%,-.@x@x < < < < <@x@x@x@x < < < <? < < < <@x@x@x@x@So$%IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/splash_anim_02.png0000644000076500000000000010013612665102044024331 0ustar devwheel00000000000000PNG  IHDRj%IDATx{iv>Z3ϥT]}/j[$2E% # =a{ BR 3f< G0`B`,jt׺tթs2sZo}2SuxEdtZY044444Vƻ04444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444447744444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447% `y'L9x[?{lޔkqoho]?@8u647L}x߬o <647e

    23B(:k@%A\~L?q`MSVgT FCF,N;uYg;vO1h䭁[?gcZPY-Zo{Cm+Bhzg˒a&j.P.cѳce` ªyd$3 cY(K = ʓyhe ٌg<,Ml!R75/m`ǩZ_kʊ%TzjT/ !H*m`̈0Zfw&zB"r>-k9E"WV@#XY ڠ1ڧs|K7wj5dJG5b>F-.Gx !m+AC.j$M[ j$-{䑖˙j0pgw+%9zZBP HB>CфZ}` |M/fkXקSљ7d0ܔumѐُH`nuAVc26Ody&✵(9Žd||Wf-йpE9"ZJL`7}{_f(TRl*Y JQ o^"IDdJs# Og/>ypqmVCfTM\c&( 2En)Iۄ29f*/Fd}*3nhgnazwmI?b*L@EBC %M@0#h o 8؜cwg6 \>뵴eE{-2o2 w0IF\*3 z7amfV4n?f<7]m;# \)*"Ӧq|vfbLbKE?1W, M?J<}MS$Qܩ"͠A-ԇMO5%$ceߓP 23ǒD*S@nYhhf`4-x{wVsv~yvmѳb#@L ZY#jBvQPk'RS rИ Ȁf\`llcuClmSG*#[KXu!xIUK2[o {@7۞ζ33e̎ͿKӌnvlhǻ[z["\)q%ej *1!nhs<$H\I2VO&s`0_K.?;LdTX~o .j5Q{ZT5F0K@_-f!/\wIteC/'>7St@*5-5@16#r(-R? 8$eGs,HXZ5ϻ*ͽ[lLK ˷3l \v`4XD.qEo.OakZԣ]ia&­mCtT6C:̪݋'{3fGPj!Ws޺Qkށ6R` gֵy9}37\W$0cY5Ė##3ֻ"@l|DK%LiM_\j"Lf ZjݒYnH,*ofs"4p"N̓[[Y_'{|y؀e0+)^aLU)8@("v7o.o/nޘgT3NA': 6h67Q7)UU˔&]L yi!ݴxUB TtW-U 9UݘIܜzfFVϳ@9RٚAY^P J R-l̂@-p3@ ڄ x#^o&brֵL-6+=Ъ,TB8J}xuWhrQt*.(J) *8ԩ* DSp^Q+gWρw_ `{ L`?O|P浮tͮAˡS?6hg`>_їkTFafqr&T"U 8#i$#җA9qGAҜSĊTU6_׮/n{3Sa"0 *D( uթY(bsЫLRMjVԉ\ :JBZvSŬHE)>MIY8] `Ӝ$ N/at@4ťJV/ UE$U3mW="WLJl<gxqZ:r{fDbp}l6'OIճbbA®,BT+4D(PRfQFU fb7/74_/ pk~~ >Yb7Vn X+׀_:wZ|p|^=zò4fLMcPf A v P`6+^.&:(83}~rH]| Ps5#Y&ǧ>ƼYJO{8\;`:ǎO>c#5Gь.BRjx1OO/v\t1s |ti^Uk0y)\cD-:&a3*& y<79Fmͦ~ɴn[TaB *F!:3L1'+# (j `nRh^=ftBWWѥ8;H*X#.ԓTꤚ2<@Uг^]1Vd~=?Y%]e6 %f4x% t|ވkx}1VsE뭓rvqgPnZTh8˱HDO8E!&jP]DH)V`E+թEU~8j _;xvNׁdyڼ6V/qP?v`wh\6ri;u)\ 3k FM}$+%,H[We+n-gpYy9 聀pJ3N'"ӂ*ѝf47* DINFqyNG' u"؞DMa&7El$X,˃A,"N8`y"G/.h` sjK0. mдP7x]@w vT|C-\]-V7&dDX%AE\! ^C91]〲 '~o|K@ql;δobZKXݞw} xq/=M|Yc~iG3|ӡPDyw~k860ADsο`[R;OT(bA$NQ S"9Ԡ^#FBF7N:B7jB¡I749:}nZ ½+22 %05a(J K/i(TFi r`cFuV]NBIk 6EJ3R|48c ig]YM87QJj (q-&p,PO|1Z"%l9}Oi1*.@fÏGp饰|JdJVPZ6GTJ( "7ntJޠ jiJk^½{A=̄B:QdUH8 Du7X ыw*%Z0Pˉ![u SJB $ތ:Z$\_LSsRE~CMe6s7>Sޕ@ER pE)uLU%t*.Rb8,ՠ-)*bfZģ|[_` ɖ<@so]쮯 ^GoW mm Gf;u1ş)L6 @9ǣ>>[cgv67 䣧Uk.R~;U92NE7agDJ90pq؞a1cHA7!n+G2Q`YLu%!9S1PW)Y $Є{Ph(IQP(AFZ)1=Q+Dp f#SeyÜx#%)6?/Xe67W:e T`2l BEL簰fB8HRD o~wq N#p[[|;A@Bg W~rذs8'>ŌQ1`{uG=ه\m`MOKЫEFڡ0ˤכ^>-[OZ{0ӅeF18Uܨn:- 5'ʄPA;4XTuEY!BwHzE!\0s k*E'$CE0q,{Ep!hcL$NZi 4؋4Ac#xu<ܚz&Y_l}yeKi`ڗ0:&Z % ,X!,u( ^B+Ϣ+_ۿKtuX N{)M0C'~dJGw jw7vm_Hwn\}M;A.}R_,+s(VfWTOzFyt'S6ipĨ? M.t{BW;0XG kUsInf4`.AYex6HUhU`{p*3E*,\t(2ҙ%I gQTulPЭB5t=0L%#EitFܔgöQ-b43&* *Z!""29Ťę1\ Շk$AG+zK߃+P09;h,10֕CkqG`=z]zUlN3E6g܀oy 6~ L@U)7vmviVc)« I*ˌʬ>S,f9{Y1#CC=t;apN n[.tq8 ["3gD[#nX4Zb"=H"[B5èHqh1BU/ mD;H44-2jr-O5`绰a>5Sm 2q=:C:]CBٵ/p.Kn7=hɾ]_ _&,z! Hoz(64>6lOe|xl,#@mY|fs*7 D4Cdc$L#Y3 IZC3|9pjLY};D̸#,TwڳɖN0%Xrau* .'$nAĀZ']I~nV! ZiVa M \fF^"m{q/Fn5 D9ܵ~sYquz@:S8aUvES,|aAfzr+ABg3W7yY*ۥLl 5;vߩY{;!Pڣbt#e=``m-0,R5m} *y=u;EfBz: ew`iiS[t"Y~zwmLk/i}wOUeK\Ng7XXC+ѽ'%{1ő4I2\P hx酯e-KQY*yUE*b^^t@xHiC J 6-,A(em=W{ [~mF<{;V\ޜةT1[jRqaHZ٥DJ3( 蛗o=w7Hg y\`5ͣ5`}-xx77 J_Y0aUh"} khwXS (몬`Ws ul ^33'glZ+y>` PnB# `)G7H1: fm 0A뱋tܜpwM ٠9TMwԨiVc"lª2t;=I=* CYi!bt݈Ũs Evp/F߳3$|(4g-- 7b;mlK*9'$qw*DZ|Te)IJ($f+Yueq}?.g-+kB7zwn- zWg qaztu @SHN'h$)%SuՋCvE=`kz o֭!>bWknt f=,-"?x8TaJ0-\2LyR,ۉ7ӅY$[SczB7|p E$jsQsiBb`LrwH̝ Y'JXk!* ¼RD),4W*˧aMъs :通FO1l+-|`L rKd=ˊ/fi|rT +Rc]}6?]k SL[vXxfPNAmw M7'pz筩J *PtQ(iEU Dq}oQ8\kק-q]۱o \Z*ԥ5@ |st{6ۍUMCPeYxO[Tou;QJkeP-K,ʳ  Ob0mt3uG67 t( 2)&kehoQ(P""n"#JGQBHbDY23,lp6V/T0͚y}|/[4<\o{Po3Vw;X=g_;1k=.=?ZvxxaWfHf-y"u<YDCШOZ3ػg_%U;U&RsN T$b;Cp>ST"3l6x_hN #+-ɕ(e?OЫ\ͤM͙+|K~r 03'qt1"Ĺ7q!P\:NЬ.QD6tUi4D=ŗ vE67WfgԌR,j"d=|sks}hլ+rwo6U={kڮ;V|7`ɝ&ӣ@mlPLI`6ljT`"/P ]cy#oSq!n?[#+ xe| &;6{C5ƣ: zaUp6&;RxsBU6sBL ]JPR ބeS131 zcc 9˙#{W3jyLcfENQ*δ!j2d>A7A TTPi32٪6HY[.'dyẠS3/K>%Rڥ'$ڲ_!1DNcWte>c+x#^u~ّ6\l\-W,ԑZ],z;1 `@?:jIn6?~zpky)SM`Oogx:fy=&@w?ρljL^r ]]NԖ5ZvGXQL`sV**{(ndԘǚS3e!O i $Ј<y$0Ms:&ok463$4܌c( A MF%S~ :1ELuᗹ<@uQFuBy̼TN-՗'ZzuOz~?vxl3ۂvxǯZD%M (Ҿ=bnsP3rr< 쨓^X01 ;l><_{5c9~ֲ@pX.K` P%̏@c uܼKM8UiqQc2qKJ:AW*wJ LCnD;21!9(NL@r exziPe@PZh2dR:R"&PE(% %' ].,Dyj6]k>1(HH-[h'qG9`G}~ T Dڳnx#ѓܮ.lJͻ̥{!ZY Z CWh0}o`enwNkO# j~q_ }?9?6s<o=$%k {(c8;v%Y^ֺ LkZL-z))ĤFni)\!tq99u"9ЦdjX¹17aLL6S@Ca!\P!3!yÅes<ҡBSt،y"EJ4 dEd;Cn!3 o[Oz6Kz%}*fOŴ Xn5 Ze񱎗Ӗu*8#eu[7/0!nIM:Y<қPh*IvuH>QiNϛH~LN͖,Vty <ν^y&oEl ŗA Xdic@?D.wy X,SLfH"sɪQzدdՋ[^@H̎;K[A w%mR|l- b %)RĖm-1I11@cmU@8ݙIs ` <4#[D,qdN|͒2#iH} ;rzm}zuW9|lވ$ygڼؔyqԂeŠ*Mee}gew pb:|eVkasxw\!LU"9_SրfKC@%<6Q%gASҌ`˺]k9ٴ*1pp#+&'VD,<ؖ%ـ=~.ɥEsx#>ݳb 瀣֊`Sdَ@,o>7zPw1OÁ;`LoNh.:0vlv <ɝckSܻ rGz[NOGnk ?ox: 'aQsLi9 $3ƜM)InQ guaQ_R!l.*1(D"d46u'p^2`WJ.J DM0@ l`V#,AHk@׵G4\?@"1 ћ#L[~^-|LVfk38xN?|SqF|NA7D]-`yeVL9@U*0!K+n9gtj]z٧g xFK^뫅:3lMi6KyzY*7-,Ac}g+MU<\ʧ7Lܦsab G.?/'P`(&֗Wv%xTF59Mj )0׾.W͗-Ǐ?=;C<sTވKӚ֬%~Q5-z8a HW<@]`%lOuz6wW. om Sp8EO[6O=JONiځtރacw_+S'>-*lyjFlvlm=m糹pI9ׄI֘r%q3cB<,XFT3eM-k68va={ζ6&h9p9ssK>6Ll@6by}Ҩo1nӉO)ԣ%&5h_9n}BS ۀS%fy"Y;tlhhA65[8c3'Gg=͉h~nuR=kS=F֐`ק45._~8^]-,7` Kktum?^oy.n|n3SM8o.-Qe# )ZI*}ulR=dDi1{ YcSԵ/H{gf>D4S ]CS)^xLtl*6c2Buq<CS:َ+~XyG )~[?lUz]&ңVFsx.i œj53e 3쎔R 8'ÛpGze7sm{x1Al+ih_^+ gϹؑ xjt@wuusT^_,tܟ/n&M~b?q/rV׊=җy 掜W,\lZS5Ud#uQTZڒeN HiN[qތΎYSC=a+ĺmM ՃZO~O+OLӚ֒͠@'~ qJlj~ :rŎjFJltiV:, o@s="=Ӌ\Kq>i+ uiHҙQֺ:ິ@T@&ĘӰ$ݼD֕٥UyBҢ.F^8˛] nnwE3EN^% eIΰkI!rkcdT[M/)[,[R\fg"zdy,ul&Ki²فھ8W]}<)#~jr\~[hçwSSҚ[͕̕TTZ2 ꀘ>uw?W2kVn2=]jxt`Y+%B9tcлڭPjt]KBMcq,ݷNRV9|:-flxS mƼT3]Xœd(&3 |%2. mS\LbWp+쵛(%Y 炎}vL%h6;5}ɕɥGZތkP eae؃$8v\Nkrݔf ţu}/tnec8okNf)vWZ]WSt"S5,@+KZ^?[}xC TKtBQo1^)c7鷹14yzuk4Gx.}x֥kGHM:ߒҬ1=[׾О\JghP;VA:i%Yxe|9A%J{y'lSq)$H\6)rq3l97Bujl\e!+3si櫷9t5k+=s15ͺ!;fw;zxSOA6ވLxsvRjml,/Љ`z- @wb0;"93*$M&zdI&ʱ4^d階 ɎXmi9i@N+؅9b˭w)Ykuu{ZcP9Sl.@:ާg)'9J7~ވYnS v?>_Jw7NA`P|Rpy%rXqy]&J]SEz1Y) :-+M߱8@;/X^ Jq: 6íO<:(xUߥ8תKÉTK ]'n Wn1~P`q=G_ 4MġEMx!yn>Ϫ8>=` z4l\a pfGu,cm±rSGJ˴)ȥ:7׵VY'~F`L-u:,Di=C@qdW5aHPY 99\ai6'  Qn8u2 `9o+۽J耮e ~["~l"_@RMt*O6f=:zAk4\Aaevv!9 kKvhG`|~7si*o-k %Y[N;d~S7 p5= lZMk@@Kw H\ƒɧt&n/U;5c;w`B59Yr4~O(F\~|rTqy-ܖ2˟ۆУj^81-ү֧;%\feNL@k#t`yK텱i6'p1xrPؙSi&վaܺB1%. ǣ`]G-}$L,őXa bo, L = S0 }+HZf-u<3GPMd]05Ukʴz۹f g׊"O'P ];MW,JhK/7*7ⵃߝɋ61@:-ǍM13RjRNJOE>cďEs\N s r,y1 4)KCB2=7nupi\' cv=@b]r}c]Uq~DbTp~CLOo0nmnD u\ic\Ou$6. &K.(GhhLl3aͮ- HoM7gx#^/; vO'o-g^Q|Sٮ*MZ]y:gDz^s޼<d/zcM~T;_&}ٍ92NϏZ qwjA-~_M3h$i4JR(.%BBU4-& 5_?~E|X$񡕼rJ&:4&:^{=$?`ˏ>1o] '''`{ L T6X'*@a2BT[::<Wۘ:X;1 F\W TvnQFY-ȩքLk^;[omDɓuiOR|6 n܋A ݛP+nT'm( Ydm*9%vx3Up搀Yҏ.gp|{ҁ)G{#PiiO:"na ٥0zĖ}sב)A']N,ƜX %S 9}Taki@VB.Vj>+{ż0Y~ѢЧ+0A[Tn! yhB\?"{ \>Ξ_ۧF'k{BXwΈ%Rϔ"me 2a=꒝衾;qQ mEѹnbވ^{Pڮ>p66_I;̂m3ak_ ms7ct~XEMVUŽ-Ǩk͎ }YL#QΪMggS,fً9aZ p!Ȉ1<:R{kΖ n`&>yf' rۏwEX_~I m۝prv]g;fdTD @6Yܬ%D0Yn-zTk,i?O*n)/^p?5u'.M4mln#H ᦰREBWĘ1ąB/ᓿ)A$pvwUwX;| Z\02f#8 <;8ÝRo]ce%ٹ9׵$4جB?z\ӝq_\, 'XRfz,.]VLLv8,L`U\M* *4oUǠwmFxw%/W#.O)g= dAt0/vՕ쀎Gѓ͡'n0P'9)\i;~* ZI \I(SX1q.ŏ/ӧx֕sks6Mݺi6YΎ=(nƒMi '(l[] N&x_i͞>/P`Km =Nbiq%RVtbPl*\)!Ig?lg<],7g na؂ՀExkj'Vg #S6u2Ytg]u<=[)Vq9{Od@ NIɏMB 1mMP'a9H1Crá&AiєoGr*?UaYFˇٞq#p2ył0=ҚxψjBl{`>T_*Ul8V&`) k;`W:A`xSGbs<7u%5s:OQv[2" \MԊPfQhL=~>)]k6`]dM{ Ďxr8G_,x?Vw#S~܄{]=u:pAkJ~귈{gb!%XGɎt L|$Gzۖ!.J<4bJsQ] ux=>kew^x Mc''A XgݝA <^&G*MDM3pq 9chAO]=E@v_][Xmnے}svވ:_7 vQlr9MN)9ʴ/ZU*Mՠ.bPZ ͻ󰏎փ Tt斔fvy'x U׿+?wh!EHWu0r6pt!*UMS(.ּ = .7C* %vcby(z[wqeQkDzrI}>"g1>gq _.9n7.\@n{`3@VSfwШyRU4oK1y+&p8G–?| .hG =#n7.t~ަ1D-Vf1El>m]M.w:Yi J"@6I`VttMl :\]4tq~|Nal}ߩ}NN`)/\O큋d,@Ag+s?dF`xq#SҼO/냆u+mGvLO˛'{UA!E\rTЕ %Q1#Dr;( O8?kb8kw! AJk@Ggυ}xGO;{嫿4L,gnD'haI}<+ R<hVŀR:]̱ ytB pX%n!EuIfuӞ̗3s&`G1/]?eIkFZ]؁eO[i¾%yl/JO9s!N?g+_<ؠGJblg`[F81/;73ƻ@(uy*`&osQ9@\ŵb1DQE|P8yog?3Yt BFHj84ut@?G?z H~>Wo^[o[aӛ}ڲg )H}M>0#F'ɍ\HmNœVH@F?}pix Pąy"ل|N㛺SME@A;\ qiI(KKB,$5G׋g#<yL)I<+5^fg Etye?oOO2-9ƕ~~B(qpW"J p s \XI{|zziG+U8Jt1M|7u\pChoH6~j?y_~2qJͣt17;ޯOF;gߒG(FSg Lr9\N4&X #Vv5a L,4Ws-S P5})t&>U{Th/蕟=qIyw4D^R'k{.ԁyƀͫ4 ϐo;g<^^/fB9Umn* }u^22Q` i.mP&*TM |DibePe"TEI뗮~q?_+p9 @󿂒K+ qܟ?x7&IPpmK{7k?]mZܼ;k=ni2=0^kzt^>eωq!RjPtq@ {uSR ,s&jvh6wS[LŐO xMi:i R^Х@T숂~Қ.$rfY]h7\BM`#Gqϴ"y`/X?] ?3]wyrx@P m t%J,^i2*(SȻ@,/~__{ciQogռl7-`/t@ضP8{Ws>TP'K]P +Tyu_~KujC]iٜnG \Mze.va2ٽ/5Zɽ&i$zjv"JNS^(BqIb*CŻr(ė>~D(E4-)N$.Y$S,MKCc~Uxtiȗ`Za/^wpވ/=O_nU*`X6i!PR(Ye"kBY7*(^"ԢŋpT`)Ťm1{_b)k k'=w+B\OfGi)QC 4%]+(v__7͟?;t2;_cƛ>;o@8LS Xխ(ipAaqB)F8a$)dE4lZLQy^IW #Nh"CQM[COzOL0oUr. 6 3XbYk|k[Bޣv_{ >>aF gY؍Gax!ES'ئZ/N@(5G68QUT1"PDO|EHv L,8}{Gw[-;w|(ص&X7'Ç?}Jk2[&( ^6QUΙ1 B?w-Y uዪ*$ђ. %xu5ץFiKͺ)̢& KUي IO9P ŨCw G~%F" %%l4QDIM&.he6bcV,sl (AqJͮF٬¼`'N`leOZL&Dq:jB)D*+6^HW f`@bBWm- LqF וv"$)&UykI(.ʕ,'D ;mua:a):[C.Ņ:LE O/47ニnVV|I7".`uDh5RNL&b^ꤘ"R6FIu; /""j-0U,W4n-^Tud0hR h Yr%{% ř~yRVV" L·j8EɵC/+bFxB0@5A(&0aQѢ Da&CZQ6gL>-ɥ|5d,lm[b.@؛*bDJӜɣ=&QTǛoA_]/nǿ4waEb0Jo."u"&!Z&PFR2HQSVtPV)B QQzQ (&t1Up@CB{V'Ҝ㝤L$98AܤeJ{C R$3)f.ii TV\Lsk͕mv"IȢRtla2^(0c6~`) &bqTZ{|1{FѫM٭l {JsCtFbvC,mrvn.sgK2-;ۄbz0#%בyy`=ovwLq^] z~+ք 5P+䔠*69BW^BmB% P=*\58 @m }h51@\l0''͗)U )9AUAesou$biɁiAwADnD$Լ`LPg8>JߎlS:ǎLt!IW*Z3}NJ2KfG8|kB_ϻXЭoҍG݀,.S648A}=ư3Yۋ^%+" /lIkϯ#;lDJdh"@BҀ@V* !,, Q!5(Y u)Sd[qMZ ɞШBE2jpЕPYUOrvCTӝ3]ɰA)W#V/boD[@LjNMxSspr6DUHGdUC+! Œ F:YDBt"!҄'ЪVCI:[aRMxucn"]F#SOQ|;8pLeSĒscթcz?YVuW7Maވψ}ӌ~~qmGRfc.Z l2׬)nL4-NU(/&f10=4a,4XRK H$&PTz$%(}tXlsu$Bm, ZNcpK"eVtv1k4S" y8X;kq Z!Tm"PM%*!51,|cC~?vGiMpjZf:U]R܀K%m.LesRSπi}Qϻ }DZI9xqsp" y PT\lfD}JFRD4u؜S"tTYCXeAE X5Q(`khhd`C @.,P$R%X5Zw3djZ׬JA6`k3o(bdH Pi^,jP &=T SB݅!h5CV' \" RK0$pp~T_o,ΖWaogsyQ$c@p\|><)_7oyyWj0 ┊0nW=5(Ʀ PbI)lΗa?RE ('#M #4JqT䜀FM^@w Aij4eEAlzPSXhMEѯYl J2[sj8P)}pb8QTjISxqb QX/>:i!?n"D6H{ =reI@3nԿx-HwԀp#s_t[ pB/t (pix#czV>-,/AO} 0;xѱyp}߿vl+x 0w}UFӚ/[;!4fwsF=dޖ8/΅*:QKB^8(kQYyt eOjuLtEttPZ'-pѸ,$$N8\2 )!^LYW&i I qH!)%K"5@BbTg&~pTn*.sq:QI)dbmE{iV s=,mt@XJa~Fa) ln)8qnQ^/*PmuoI33Wa+3}aqh`FkPaEγ`i0ɓ~%韩\ӎS &k$#ZKV6<'/^5İ`,u`  JC4*BuW&٨d_]]1S8dZ,6;Xppw߫oqK0Ree{x\ws 0cAݔ=uj!)r6%#@]Q7 KkExQXxJ -@@ b@(npd^|0.LSk&k?S`%WYrzAP 'A-XZM6oQӆժmk7!`Zm[tq +tyaC&ҙ hB=#5yvNCw݉?7<^Tž1vkd/2Je\J+mȦHm@Vm@Rj(U`8%։ <]!^Z /Z'7*| d[294.j@ 3.QV$a>%fek_Es%!0%7`N~`ꡆ D=7&0X1g3tgS^7O P5ɗys^CﱉL=Y}O&v_v"ƿ`qZ)/yeջ'A/ҟfӬ;l*@Mvr:/B(6!6T0S#,P<;A' 3,X%I 0/D͹sŰL7FٶbS Qƭn7Yˋ bֵd+L x{{4~cg-{^je\YVv. h ;f͞Hmc(9{M<5¦N^Csz ܤϥ`bȆ ?B z @ LFa50@iE*mzhf7iG:ESk- d~B@.Kѱ6Gݤ$d"dHm:r)қdϭKg`ꋁ)]y'vx#~6AYlT=EAox`˓h4!Ўki6&)| uN @RL`vhuV9kp^OW,.EDžlfDߠX4M"jZm,[b3 sVuxtfAҬ!X0Uzg@a%d+B*4qde]}SX#Ә,;%g׳zN[ӝ@/ f 3tw>y9{fZ3Ppv㸹v'؟L۶-1͆ycHЧdnwi L4IVY `g[&+:r`.LuRbs6gVVK !jrĚq[g%D%DS,)HLmBۮu=MFwH]y?a=y``i4]~=n? yw@ԾGU)K 6cLsX: GxKy2SQ@A`i~zm=NJ$5YL ށTҚ\=2mƐ*" (Y[j8 Y [fk~Et"_(p~93vβ”C N)܈x#~F>lN^f{kj^=,Z.@OJ0,P'Ƭf IJN@:0=0]@J r%Ƴn"Eـ1\]V`SKgb{7Qk#M[8"E9ۧ[xsK!ԈDX]KO&4fOt%)8g ܧ.&w hm/@7o`y.Wxxh;d{+k@7͎]_hBGļmIQ,`@6mרKK\Pxa6 f5ґ Y2X j眹H2UmT1VXNEO@, a4NMJ`%$kbyhpLQzJl\;̎!B $=#?|xȉ%~#ey=5w,L9nvTog;͹TdFZ޺@-Gz^N!2Z /EKͮNH/ DR۸luZg l3h. ?I.&朧#pj-ݨ kVa5}:&X1N,6dt,{+x7ew~M\_mw˰; vgt`i](P7Rmaz4S̛儩\AgM[[Qkl"(MiE(,, ¬Siݨۍ8cz?Z,'M_&ygۏky+sk'q 73^}!O\=a0v=H$2Vkl>׀`m``=r ںK#|[@qs݁b>}tmݫ[{+7N?):!H}~`h#[םX87Hjdhn(.sCS#,@:Z̽j26OQ7ϱ @@z=|agvZt9:e{-* v#^=݇?bk={p}eO5v1xkl6\^ͼ 7&_߲k__~s&ۻ8LU>~xMr~?~eӓ/|\)xވ}֠,P{.wpB~CCAyjV_< ;ʭ\`u?ZӇLom{Wp'ͽ-޼9dl#![boIFzӱ㭦u-{`Z|O\[ï>#6yQv:oT/ z/r,;fٛ,`7oވ/ ݗźKN2?c<~trOe Bcx h=0~mGpz6}NLK)+Go>qgn05}ں^ey Xu_a ς ^'{tzv/dbn?>oD#ʳݺ7yol'; L_|"/ 7 x/ z/ rP,.>>~O–{50zq?o^\?^r ?}\g?s< fϋ?_H7oO'*Ⱦz?9>|?Z_}^g+6J>qZ7^1^|W1~~hY>:=&?Y D^ 1oOʱ/~ ?s z_jF 3~ok{5kWgw[^ٞ0xO$7bq{=>~w{OdDx#   kDx# @3?+6ox#~JAg7o(z)?=?x#^"/) F o#F7bĈ#F 1bĈ#1bĈF1bĈx#F1b#F1bވ#F1oĈ#F 1bĈ#1bĈ? 1̣G1b`x#F1b#F1bވ#F1oĈ#F7bĈ#F 1bĈ#1bĈF1b#F1bވ#F1oĈ#F7bĈ#F 1bĈ#1bĈF1bĈx#F1b#F1oĈ#F7bĈ#F 1bĈ#1bĈF1bĈx#F1b#F1bވ#F1oĈ#F 1bĈ#1bĈF1bĈx#F1b#F1bވ#F1oĈ#F7bĈ#F 1bĈF1bĈx#F1b#F1bވ#F1oĈ#F7bĈ#F 1bĈ#1bĈF1b#F1bވ#F1oĈ#F7bĈ#F 1bĈ#1bĈF1bĈx#F1b#F1oĈ#F7bĈ#F 1bĈ#1bĈF1bĈx#F1b#F1bވ#F1oĈ#F 1bĈ#1bĈF1bĈx#F1b_X:iIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/splash_anim_15.png0000644000076500000000000020625112665102044024342 0ustar devwheel00000000000000PNG  IHDRj pIDATxkeY-wF仲U]8@@A z$gH3e2DJ&4>9Ù{}NUiqވq]r'3C^b/S_^zW^z׫W^zuիW^:իW^zիWxzիW^zի^^z׫W^zuիW^:իW^zիWxzիW^zի^^zW^z׫W^:իW^zիWxzիW^zsRzi&a: : >Ykl֯\Kի3^>bP[p2sqf5\쒸ǖ]xz r occg/ 2sQ`%Ƿ_>=Z<ŝ%ǶRGDŽUw׫o4>fx`xlѭk(,^}eON.o;Ϗ;u.xu٢R+>Y_Ӯ=_t׫ɲvaq{gȊΓ?/(R-zzMa{ұylygɐʒv^%lu?s]^u tfEPx\5?L^^_$\ߦ;@#5Ӭ ]:ٟ5Ze;`vebgf||A^^_?"mL_NI˝%G:tƕy7gm;u@l׉(e<Ƚ t/"szzQKN"SB_g> @:0XE/4yYFlRe-W_ ,PЅܮaLBϙ+vY罞96ѫ^^/%Vxc4xgy`9%ehv]䵢hveey5y-aT/i)/+}]E؜^zzy n;(=;Ycyɚ=VrĐ2uLʼqYy򳈔tիׯ;T+ ;{|jcdiO/8g kA^^/7c^'FPq =|Hi)s}׫4<;.>o]?؝n^y޼a{uby0 i<.vu 9Obo5/yƢW^>;.w5D"wMyOy݋O^"dq)o6R&m; Wv\='ѳ ay[2/怳eJ:ŝ " 믩>e/U9^4yT ;ueo-q˜`/(e^]˶ѝ!;! "m<ϯ 6zzeiPa>վN~1 <>yp >~!39Q[ԫ3^^SF86c] 8k\[fp|nN&[w/0o>h"h8Š`1#Z<zw=b!F W2kvWe gvvINmRy]\>W[\wBi!;Wkr`]^X@Xzv"c:@k>枠et. y4B‰)4 3].'t1k{]٫uumdN]E/O*U\8m5H,9RY<:.fi'l6hWVaf!i-Нjoo(^^@>uNؐл<bry?]dmE.y<sJV)-2}= 6xܵyܶDt3^^bW!+>Wn_Xb{\vXZJkViY=ϒ,qvm1>`O(VGq9uV_$`u{O>jzⲼ]loR] ;eL9'UcyD vwEB| 16yB;{N08鞵Ѿ; ~dyy<8by-X/]vbQl|92/ԼI"L-@6L^13mQWL;0ƈ}@Xq{7u׫U{N3 M F?veb' 4.*Uvggtay=}[s=b^^۫;o&)wlYI?{wKnR(9ǵvcvǮ4[Y`xy ;/Rf:iϏ9kt mU(fN޹9U4{,%v)ʜɃ˛ef(5[t֟ w^1<`w?}`li3+SwY=;`д5޽z!vG |f@H]ȩ3X\;Wϣx%;ܶ|mu}&K\ʗ)8kouM<qX"gýRm{t yOLWhݲ:Y<7 Jgxz|g1ѿ3a @)5o㏫0/TgG9S!LpRy)cq:oƍ:c~$vU6\Y31F̽>jnO']M|?{w;ivܵ掌]=x8Z9Z(h¤؜9Mp0.*Y^frwBW rЙ\;6K +=:oR3i4ƴ}'{k583JЀ]?{w /k(~MPsY_Lo(.>ф4àW~ 3beXFl_d)㭙\ ~;|W^-7+EU.2SH tn2O^rsBةI*3m Ue.q0IpХܫ^^>3. pnV?Y2ZkbcvZ(k`,X%4 =ͬew@xzL2] ز] o@p)stĕ2M+ Z$O+kW G }%.ߘVV^Zf7tW^Jv=w^mWa=x5#I{XgR\_n)+ag}&M91̘|1y-7vݰ鿲zO_@6>-t#<+Y~ pvJauLm 6}P6-G&r3/'SR&j^:v,qg.#p-/ea ^^>J8=M7٩)Guի Z,)PmfwPQys=,oצzpDZ[Z)I bZub|_ϧ•HG  $[g-)Îhxzu`c4ෞ rG2?@Thգ-]; ZXI|+|+PO[v^ԗTH+e IA2GÝ쨂> sQ\V:&8N:k]2`__ LH .; vj.e`k_]|Z9sZˍmf@ClD !0n6gX]²O>K^^_cCЃ0M j)NZ9O|9L>`t}VDвҩ𹅣+̓4ՕL չ)'$a$ *s2$NfWW^^BɝT߲;[ݟC0;%i/g ez-a/`'G[\=q'-ڀ{n_@V+3q؜|$guY6(Zzy^^~} Fs>=mõ VN<N`0hG%u"3zԐ]2&+N:%iW cCWǻ@PƂ †' ? *t}y^~Ŭ>S<A8inU cxz LLςqg+# iSz}r)SWl;l;|C9\,=< g; 1b< G zuo706νMv`eIг<].sʰW_LH/XA97sN6q5#;Z,82]lnqܩSO<`ۻ?:+C8-Ť0fPC r\EIյ2[.W^~ ^$}7ܬf c SKɒVUizKNw*6d)vl fo]n&g *eJxp>$cWr|Uf x; _j׫܋/R 0%Js0Փ0a" Ui٤b`} P t~Ɋ=zFoՀFzUɒ@ؾ!8嶤yxsV473[I+ vypIƑ \ȁ52~]NK^^^sFGBʼ  W>&HIdi8V2f(5@l-amXr|-n RlǃhX%VM*Jynh\C5N wkhvMK ֗*SBo|G| : ➇/.r> ]{*sI )|0j)mn{x 5E=EӂIsLjL-*'M`μ J0]P:SIzz:+36X$D 8?ϣ$OP+`k|r؞B^Ϛ]THWjp\%0xԸ25$LmҧL eZJƬ}O-UlvP3-F|6*Wg 2uet'$Lx5gm|SYnn "Rbv^W^_t{~ۋ>[0Ԛs̑q>SnLl =`2nqX p ;+ mzRb뚠S;9gTI9tpĵmkTP.a6 }|/Qgyz݋?o"FУS vqef:/ \sXSWFB1vCH6jN('9TJzG I4-*E_bF pְ:'$Ɓe-Z_%qɭ1,P#1\x͏u7>K0{xE@yg7琠q/WH[FJ@ *rũ>D vVg`\er:f*YZWEGJ4%fo]1p8f-җnK4SSh*O6m^V%0'>$RoX +[no ^y/x:p/X7`+j_"VܗŸ+r Qeihq_&k*Uqp F"/h9Zdyq+x?oѡqnnsʱ❟`-\v:KYAùU,kZ'zzFVSC:v1:: "|3 Mݒ5EAb'AH\UNj7ʡexNg gAmv[bފX"I2l *(Zțs`4B5W,"k0$y 6Fjgxܰٴ~Bk۩G 'j4Q] v/ >ͤm|^(M-ui@l@mqV1ZY&PNZ{o)2'Lˍ5VPX`ܵ7-9@Ws$G$/ßBI||>:9%vLGaUX@Y2vRIx>_`YE}g?X~N=iKeq" RY @R,Y3bO éi=rl7]Qy2 T@(o]:  >>].=v31plBMp9-Xt?~ QG\T 1Z? 'OGg7"&j@HivavtX0ozykG,GQ#A K2onm n`s ;~App\.?*; fmuv32J.s,)%^λy`-J#eJ;g{7ONEBE㶬|v˙)[+|BΤeLU>Nc?GV~`7@6ֽ:zOtgIgXE$̵|Wؘ貀C04(Pn /vقv9!A ˀ7XJѨTeMPEsqOr-~N|lvŔBU,kیwIWÝ&<35$Dagb>Ah֚Sj0Zkwf`/ 9D!a ì p ..3$ YfŨ0­#O1rLزo9w&Sf@?'y23¯ev-jXvx_@yR,ugm;:>ǵ7iWNRhqÛ)U u_S[rLcFJS F,,76qֈ="vz9Tvm"ßvdr(efbKfȗgL5l>M6LrIq^y5\q jmo1ij$Lҧs7vvyT`we"~Y<]m=pvAHzͱm.5};lߵvr+gfۿ3x/IGHIj(T)B`v>SlU#["\E!YbBݙWn0M)2y6,Gip"[r#g8BA6Iuvnfu[ajšIy  n~}2@M0*!3\9T39gvSNf?~ 8)w].j>J^gI v.RV|`8օqev҈Ű" zKZ Ec =<۾/]g֦ IJe_ۋRF=_uTYEs0Qlj }6~ OQYMO'>q_ZsśϤ*b6[18YJNmwWA-ʝʝn I69{`v̚_&:z)e/xt;k_ϐ2==vmlY Z5A6֠"9l/U"WX*$ H 57ƒhѧ8RB Þ}n%<ˁJ1,Y?_pk'´2293:5\#g9R ȅٜkl<@XֿW>;ݽ  nwĕa!KJdch1Er |MYsGw+cyQ5"$\|0/]=bO7K1Trs$cP&@Lin g)4m L5d ,DiP%&G7DȺnBBѯz >ltA#j *,|'UGg9>`cxPZFq]cuz WJoK9-0XyQ&; [ջoAU \qR]ιI9KP/!YۜQeRɸA=v}d&O.z [=W ɴCleτfW7gTlTcV!66&#l|dD &)&{kdHoSju'Y5PuIQ J`fL%Fś*rv<fY+ tSAYɘR%M)(@s>=5ˣyA\:\W߀s![̀7e͐)g7j1 di's;m մx>/} |pہ) L6U+r fXU5{;+OFu,'/w]qun"#mIkK3!VX\31ϦqJ\C!qأ.9C[2yN++6݅9S&\n{ӧk1&l4ˎRݣM>̇:H(Yw5rŲ7\.kX\45$*s4A߭ul.|ip4+n[}m\vjV@J x2M;ڻ+̏éKK;]᝛N=`Gau yzloBeۋCL.jh `EZ :2 TLّ 4cg>=; %(NK+0XpL.Sak@4]Q 5KZ@D"p>Xc1~f5W./'qفFD(wܲ ˭g o%M&C۞]1%%ܺ}e.%KUƨ5Havc9a; Ȋfбcׯ]&ؚS U8CӲd6 N,Y(A2bDT) r[՞Pr2]H^q.T'"8{*ALnv&&55!{v" L7W%eؼB@Gѭg'sVNxR4ĔOʖn9u?I]XԬ6kG $fGޞDթii[ \9W_}^yCZY;-]avc*M\BެQW\ҷ` ײtUO)RY,KL+Su}͕&gs`,`G@7K]k6sْI@e<F9 6bQLҴCBd;#bS1M)rTo ؘ b#TM"67oWBPȣ4 3` 3 d %ȐXI"aGc,4 4&!gMN!{pOF*aZ550H T8k5C<]*mZI@SH^h Wqz5gk* sVzqCӛK <̲&,iU w,'Hs+)sRpjqc~[vwI=O=xzZ5(2KD6ː ,И$نf2?xieJD*o2Kj|gg$MM,H^9!F¤9@!bF-˛%V~7 /f+I+k m.ַgѕʻx֗$"gtl.rt%JAX/$a2vJ +ٸRBπ dcy )Iob;x>w%دbw-ww=l5 =Y֔|fim7BftjqȞ V{q08i(þ'KHHӳ;})U)cY`% 63ƚ] Q6@DHGWwޥbb Bd#ӣuc޸$E & )14bIX e$' Eog+f3ܯ󉟤 LIGp'馚 i- ݖK}ulJYx}Ǝ)0;9tf/FȌOq׵͎bp1KVF@gLMM4L~R܁IÎNfNO+b,q ZMb8p)Tx͕UFL<ݐ"X4> G.ܘ` FczwJë%Fd1[,\%Y3WK1j8Y;ݥ/cިa!]Ȇ:,Be|9`ukiHrZ5c`W]nzuf.Lg*w˘X~r]ex7cax\T-k͜ |̨JdH''lF%$)qPZ9saP!w0ca1AsQŬ #!a<D Ǡ.kŘY8frp'T&`c`_ RX@GFB`kEb!#wxGAVFk Ȉܬ!@\*& A,yl$XلL$X^EڤFL%Eh><'̓Q?m#DOSd'NY"!1&!΃-05јlzVƛWav71m-O -zuh^۾)GM tHow_7PrL>qp,5I3gNy1V><e26r _;/KP:& 0!~hE,͋Z^l%҇G Y>zt)4Ͻ5 7`m큛WԖNG*|;L vj ɖ@DHx@|姧̘渂߹ 2 c3f4^5| Ya8E(V˚Pa"2b!R1tqܝ\-Q .R'S4݃hiCտ: lrbjP",R#^a!kN~T~li4hW2ajTP >0/' dvǮn;0gְ:+Y;ss%MsLWL󆄕لl9eg ޚ,zxͱu@׆WMV;&M4d%6olR)'[dTsSx)L2%GOn.Y:Jl!PhLY?kDn'1ևmx5Qٵ$GWlAϮ:(*0%2Ȧ!62zf^H#| ,j0GD 5ph*K: Rwډ$n#BAe~ I 1Bkg0ĥ rvI53@&1IɀW Օb=$(43IX6Е;7淿.7@W[nوbLX}8/G)V8>;B&,LDiLB{MD&2h~n+c`fD*N3-STܤb 3J7avNjipOG~vDLno]tsx3%XDY%T@<77Фɦz$rh ȃ:|"ng:jZ"K`f]p:lѥJSqr<Ͻ(}@W⁽@Nb KnawO{T7ʤ3ShJ2A}qe^f;yvdD5k'E͌c#w_+܌2 y~~ʷnlNU!5җ8MyIrј|#4p64X,6.Fls:o_گS#dJP:mdpNo3 xkC#e)<:^Ϛ}?o}LovhO=nyeL&>$qB2!IAY]4&7 ĩʘ swF82əCáaؗyggsdmcT,tufm73Qہ!z'xgl?W8OWAz}6o[ Uf VV )fs:?Xo?6f#1@D1U#a$S2gzϏG5R%| 1ۅvʸEb@9^1ܮ6T'E䀜/3n[W77_L-I.OTy:ƦhtWdKT\1yI)M 0x u+즓h,sG;h'YDQRf[{囏9<m7e{{'\ w}:s6g >mti_ʒ:! qH|(2zr&I*0f2VfϛI]/0Q&f f'o&`)j04zcF\S:#j&PH#yGDj`rQ,v 2$DJQ1fW~G>L#wgJ _&92XbR> kz ȄɈJ",CHLȾ~8 ^Gk0 wWݒ1Cd`Qߣ$` 1<'N\݌58b$ ԇE#!j: Ŷsce %%'MdVpJoPslɿ2OX~NMjjTH ?db¬Hn1aQ2 PY\Oi)Ķ$WνaYVyhc0e+mFq:㕴g:>>f&ZdLG(;q8,-SqZz.nJ ʶrQEūOYtBY꺞oe6FպeYFݔw Sר2YSM6k ׯ=#|5 1 m|rRgId`@DQt f5b%rNbd㑓d %M|l2@SNjf>kw0eA+ R ."udavT;Kl,%ƤapA˚`p"DHJ>;& ޽ O>r} %@LXB jӵz{!|(7$k[3n7! 9g'v.(gzg5<2Y:.͜<2<^:0WwO*zRd/ My &禓)$LPcMYl,/߼2V:` a :&+^M)6CJMt,2VRg^/ ˅dy㛠J |x:Rwa3ݬ=pg yI tph1äs,D ,%ů>M0!f6dLD$-a02!ABo^OwN㔒Y*2:sl ap!"$fv@~vaw^lWEbM/6w?+A&E2,+AʉƳx25%caz.]UQfao w%/'01oO_oJnUEȔ-iYV1--՚q8PH4cj '6Д%!4 sb 8S8wjr]qYRy00{wJF[fL;sx^,0ߍiMČS%Y1Fč+*`E$͌3S DdD&a"죿|YRgD>8X^i w"@iXEݹytìo'iq^{^OE 0 vD㴑7BG.\ɃYb0HG)NnB n0($s5<7{QΙĘ<9֍mA+lȫ+-I3!{m߻p7!?{~i9bl G`03Ȓc0F<o~y>$efŨ]!RXx@Ɉ q !%vxr/Jۇ35Q!SO/%Ab[.;I6029cFbyr˼]m=~:@$zyw;rBa:q6O>Ib \K%J6y,+SavSfd8q+T3KN؆_"CFlS@aqL(z^/R\ۧ ++tP$̃goLJ$^> &P4{LL!u'f1[Co4<Vgfuٹ1(34Zbn>}2SYgd'2y|0O5eVwidQ׀\83fjzvV+3woU%O6o ϖ,g;|@!U?0 g3I)4`7zOziVFUyMcwEˀTW-r8%+l)҂0++q9hCkoPo'J0|ϙP/u`r}rJqbGݸd"gv;hpc[-~ 6?fݽs2g> ey 8 m}퐃%>{ Qs)z˨,*ԮXAZܔ|: G|16J?v sUv)3!7եH=U=n4VÛ `fe03e/+(ޱW;O#@7l@A4OAxN8K4YD hJ^nJC ;DC1M0ƪf:A u`lj0LM08 vס\b:Ÿs(L"518Viސqߖ35`些S^[ix<|ŧ&l h'n@`FO<`4L2R>61%@d -nF$̃T"UTHh0D2b%bQ|mԻ?% PkΚ3󫀇 5dyL~Y?Uom |I&U;ׇ=O~c6OU`q .6|{W42|1cAO_}ndEe{u ArM0XJrD8E4QumʓOT1&&K4M'Ȗhgh>9$L)@Q79圹dSL6eQŎEd3؉e7I3iIIHsF&qGSVY!0 ky*[BLG(ND.] ,%؞/K SlJ9Xk|sϹ^KVu_Y|c/%#A?頝& >Xv+>\V'S!|fl¤DO|ΓaJ٠9vf491`JFH,"uߝ\LlᱰkwY͂pVҮ9W~VMxP+k~NJ_<~{qr嶙gOZņX)(6fGd2Y&X)+4WْN.]”Bj}2L|n*C|=66S$Qg4sI  z^w-t7zz-EFJʾ h{A=SR7IbѹS dGL1M`3G$38M&!3Rv 0dˤ0Iţ&0,Ĥ,o>:ۏSN-^lO~Z,X؍ZMh/5:|=~5d`lt{|kU+ͭ ˋ [='eBV2!5AlF0>2_rf IA@ٷX6BݗP3<7Gd7dOOcI?vJKYCw=9' Y>Rkx44 4YҜJOnD<1`s ͈0RN_}=8:"3re) (s k*W Tma$Sf!e?ș&S`Sլ`Rɤ)G#55n!P20))1El f6^`a0-2XJ-~SQt|@2gwJ9t+KSX`eKb8e#EbI ,˙&RaDYbDA'X2 ^?8;%tW/ xi0m(r]\||< nRC]#$h?#2?<؂\fC k ,aD ?F(+b9Յ!0QA bTR >ϖٿ1#n>zq:04ꐐh> #&(&++g=g] qKИe9}Os->/+7wէeZIֿ&G0ʙ9| ǿޫ+E۝N; A+GnDlfw9X%\~z"SHX H">$L/Ha&E& ٍ2r[X(J Sf% J_+ު,mݫ˴:^^j+ Fr܂WaykK쬯e>L'b2bY˜JCc^YDig@C}7[OW㤒&Q>"#S,c:Ձ$)'޺"̐ F{L!`n}ǿw_'-){jr < 賥b}lǐzj~ LaA-`We6Or_e,Ntay$X^mI) ܼ9r^/ ؅dq8ȰO}8xďم(4Y}GMyicqex? _D*YČa_}$bi#ݘւ 42d K8i$>`[.>ٵ:q|?~pƷg`+?߹u{Em0ed BuU4rHwx"[jvw$$ `R%~'}Lc0&1 3H3h"0f2 dH6z,1 !u唕X#`H$_ElrՕexkkUWy2K-kn?7g+?լpŨ"-Oɟ=BbNpxx|[m0X&@M1YҜ0x^?r&d>0X' K^ٌ{|\Nw;~x1M:tgZSv&'M:.90/g>ԙ%7#"Q:at C6X$,bƦ$H&QY  Չߘ{w<5awsJ!<[[fW6?aZlYFrx| '<+U$nÇgѰ0){Þ\{phQ(T6!g12;=1:WȠ4e,\Z} y`Ɩg?G_מN:6'|%BՁԥJ(2x4n7gr9:12<NxdgqjYK6.r-tbC V3S#BS2uRs9eR,T%&X#F)pC~0(ڼi9\Xjq)_wf`c^\ޑƑwhQӴbA)yϮ0׷GK[@ F 0 1MljwMƤD`R)+Ӕ( 1$&9svGFF66UA$<߂ȒJwb}*kX*KI=f``F m%Ob`~NHk NRz2l-dGO}z~cOB,F}Y6Rf&o&%OWu2!EF,yVN'Ev7{w}K1Yssa2QKٝfeULd2dX.&txTd,3(U]3y2&l o a1 '& eKPa14$lb fἌ2BY&(+G|{_}}M3%1eeQKFFndYY%O8+d)6 M*9˘GT13oFΜUses%!T@̙l0bBȅʲ\T5 D͚ƪ([Ȝ!_Q`XM_| 8SIvӐ4 _Bkpi.F{MNokL\{pY3%^soً+!~Kw|ߚG.I#+f_Yfb{gѭOO )GYU%S̷%xc8KjdD 'o>>y荧f (%k&Q✕ SVl|H`bHluJ8Nb} VXر1y@,bY9qdD&f9=% b!L$,p9D$$]wNmM)(gGs]AV +,pS'KI3K(L8?˱i`JT1O>EI=P^.tt$FMk+SLF&%Ҙau„A_ٕ<_o>ҽ-D&S#3. Y9O&4Hά 6eAȜ Ӕg4]9棃h3QFdT3rH=F`Yc̙ L-㺳=OBT ƍTwVu(!s+3VZ܇2ہ4sوD#hfuYFD.beh6_ՄFl>\}ľKڬ=x^y5koox2{NˬFWޝӸ`(2D=gZdRfVK tDDFbbK&"  )Dsb['fe[vfi[9&5N"7&qjҒɵ )QaJ5ګggc={/|Kca;{0?W'QHr5eX+˩0N[\3FQW_9~{> K"a%{#51ut;%qpV)QfHx896!tRd%A՘jqR#@a @^[6X@%-z#&C@Dd:6RVƱ$GLh `6t[0VJ1ͧ0]5;RfZ28V]2h3 $ZAf`3\ab3[71+3/߿w# g#[Kl`JSPHM8g*dgc'a5IFM4)s6g=(2 2onI*Qr ӧU`ൠVVNN4WX$JW?&`8~'9?/??2мo>o>N`t`=Bzh.C~W]l[J,3ˆdUa3m&0clUS̜cvhLOe{(ne{0q;1+R67'E p&ye-]4=.F'Rf5|)/9/<ӼH0`V1ʱ9æf*B, ZPM\Y,].io{Nfl0;o)vW˕ ϮWoucȶS6>l2D ڗY0̳ e&3|L @ಾ(33211ķ 2 M* `y ^i1yZ3Jjkmbi[z?Oe` l{'W2<[GPMqPĈ0Y:a0L@*30ͣ/>y!0e"ۂh S欢1Ԉ3Ħm2&ب"@dlxz혷Ьn̆lY!Ol X*90(ȲfVcjdd%9*),A%6yDjK`FczL3Ű")L]Sfed=G 9ϥFpÕ ZxZsXX܂͵WvlD@*Z3bN6@SR4g&UQ&,%<խC\I߱JjD)e5RR"4kv|s.KUYIbgܔTEܐ˙'FFĦPzy Ll9,ϱ&!OdLIG#X.L`}Q:NL&7Q_Eݞ\ۘte:qAu L-@q:&|,Ǫ+yzf6 (Yfj.\oKPc9( L9:"cbD5vhv,dbar7Ћy,OY@y<2 Gale ;d"7װ>儕rye(=חY$jڵu`وb$#1ǿ֏uDY)Iaq.M{t0n;|>|f{mD0M Il\p6VLY'74=φꖦzKrX |1L܂f7^?~÷ۏIG9wB"1eYX1)M#Д2?cMS~<<%T UM٦08#Ȳ2AJV_l0&uW A2qQxF=`"Uԭ5"Oap80e%_ȣj`=my;R,3C=f7c0[cCkbFH Ko<ЀrcUoXf{=_\6h i7#񕘾B.m&;:JdbcU0C ?9af&JL Va 1)(39ӌIZ9sYWx5Nl2oA9V==^e,yxԏ?/>~u&9Ȗ y;ҧO7GO^}򥟾{Gjd6 dfВA5QrY3xlOw6_ nΦow#e FlgdQ]JlF%㦔=%2SV%fӬ!_nKU26gv䲣ˆY$^lY},"hU>40IBx'ࠥ9a=1[*+AbKaTdyӫY.39 S2 K[vNZFݕfDhWev^!b@[!cc#&YH٘٘ɍ0S8Y~$PM`M(ƖX&dWt}ɝ^'2-;&AYӈEPVUX+xjSLs6%6И/5I@k6z*DH*@# +W1M BP汒o)M];ZUYXIa夔 v s5.RSN_[{3P)o ~G~| 軨IYR`W\|o?xGo< RFj,Q9" ~=;1eв;i)KI:!3Wy )LffgQ'"}o.7 7eyLrD􇛲l:zQՄ"'q(DjBU&x"cHtyᵶPyHDѧ'DV 筂ktʮUs֕mZIg.oL xWuo?x_WIqc[ ׺Ps22mR}Kع'|E"ȞI`HPݙJbí}3n!J;cI^̵pYpzc3A% tE-J"ru0Tѡ"4N\w4PNE42W hSM:.Q>}d?ώrwJqMV rrQHsR}>yʬ+րwYW}mځyׂui.j{Luڜ 1-%: @/N K\MKQ51A{<*r:dQtDCD]zR!LҐ.*D+P5ן.jxW64J"KgcTZ>+N:9eԬMI1%~7"]Ry^ŧ9e\CYF83Iju3DG23)W!:7ױ)MY? d[6V)R2|Pq%$l-uQ(c& .{U)qQDw/>_~8WFZk/7?mES[O̦֮|ژ@o_$)<}H$  wa^f={gҷUCr@|t2l?K=M~jzǢ[Ғ&%mMmTX1$|LrۧZ^}q %JʲUz]%P/C@i;JcJl) 1.!ՒAs5(IbIH]",.I…@x竿ߺ/'$#^"mOw =z;o;Kr5Oڙ 8}8@z%N*re<!omkT|;8$5%d|'v9{wObP& w;;K'w?^( ! Uκe\V% cb• P̡9,n sKlRՀ2qjmi-&kOWx=n.չ'q ^љs%Zo/BMXݟ ID=O-Aԓ2PZ("3&Yf%轷y훿~+o0QV!_MX."r$V?_g΍:,gpFw9k27~Q_OK+_qAwUd$R <ƍKrOvIڈpXZ!tsau6%;HN;C츗~q4.)8f1"2 q&qwj~:Yӑ WfKPc@EpBMtQt7xq^)6T+niAmV2Jv̷@_*nHuPZ.GR$iJd =mڨsD=`4zx|5z9V<ͥNj㺆׶*z9 0r\@\c$!.S7 1r,EFO8E!&j$P]D2c4VTU[7lđ f|]BK{;OB/ݿpƅڻp;!_;| ~/M s1B'87qgoO0} x?ę8k}Qc:-cK-ؑg^a堤X#Ne(BH; 5~)IC tdq^Ӥ-X%8n8M'uf̢7j${BUt1,aj4Y@E[ JVfNif(qqA<֬zPN _^za;zm<𓘪=1|9lG@oaW,N+Öw|o|o{F,h0XuH )̣ݣJr8- 0#L'Q<S%ҡ={X$"@$i\S4ɲbg#1r3+0J3JWWe*MC@ؐny$֤L|P  ٔjs:H~PYOIW!(ZTdUgظo&V 8[9ۥɌ,۵SV">/r*FV} mbn ^:~1yRqtl?.0x,8i^UQi &t/oS+nniL|=_`^2§B|]@Ϯ>K+Y<Ɠ7Gm+4X> 'xsEE*lBDP9p缩Z(U/Ǽi ޶%ץSS @PP_ I:_.%eZWKZ,~saMu>଩?4i/ qz ǭݍ&{rs>n l20nY"PR9 ec (LbZU\V,_oMDbĕ"wՐSކZʁ+?3w[xɯ,{G_7^ K0nv;؞iOx - 9- /Bu-R92}VM,SYLjqjӋ?)e"AŅB0jZ%&݈{PV6[wɼk$;?F9'U(ühr`zi޴Sm瀦vXa*|M*6_yvw/ӔƀҚ[5jXޝoz1reVLP)fk~Ii&`إT(sClXb}b):$"L*wzWַ0!x_Ii ޔ澚>8 N(Jp?p9]b (6Og. ;G@l;+Xkq>-{x5Xl"開%RV|ťYR~"`W̍Ǎ1F3x@ ,Rf[";T`I^za$EZ85}#sbR(*$KyvrA.%pl ~U-^[T]LiޔvWݘBnHkH2ǕkMn*hY- FWҒU&؁ㅩ=ߍ)zyNw˶RhsI, Z(Tj14u}TwKQV(%䰺Y]ނ jxvk552ȹ]\%#|ݐ94 N+N)d~S @ Z̉aSIAe}15Z9+nMN<2^x|:^gr ^FC22Mbi`nٸV!NN nה_6T 7m& M1pUǫIRm,j{mŅrri[c`L7 LS(N[DgjӎOgȵFy:.e@ -!iM«@\7P+ZïuE4A!uFW DK)z<Ũ(d*KB~|:JN#P~bH(XUlۜ6 8Y\ K&ҁWFbHURd ʳCas|"TR%=Q_y(X^> Ԡ+eA7}6 䵪P^>@څ+s;E[,FjTWLu^X'Ƹ+_ IoU𗽉M٣Z3ۨfGµݾKN-0_r\2SCA 5ggQl!'ՠ']`&l֖ 켮`;WV"lত6,)JִiRIh{bf(7/.^ lkbK ò֨(܄*,'{R l^; j%EئĽ {. ֩dL1rQ*Ÿª8ѧuS'(bsy9I¨un>s @NaQDC}"×*~XLؘZ&*d)ԘG* n )p`*pd43Q^זb}}/lK_>}MK[$/uy7Fj<5jyHSsyL Tb IN+ S$RI|_zX]h4hU'Y N0K4ӕgpkql\'ù١qx\k4tDvF ӱL֧R#GϓeZjrSTdL*digAl" &܅ TF N-F!$1 nu:Rh҇'v\=Q2sy[EzQ H9440 nLJa:Fg1z '`Z%Wk]ybkq\Kw~#7k}")[_ZPUk8)hCk%"(p}Tݾ}M_ W ' ^GʠxŀpW%y|5 xזb,egG# 3xkRM?6Tl>ʜfS s5M鱴(I.8NM**]nS-`3&†L`Bd:&YH7 NAM/2"zw8\P^":RtS2VZ ZB-x g˾{4T\}wa^OMPkvyM7pS7>}-uA$(G?]42UJEB$;w~D)nkצ-Jqo=?~cx 󎼵[+>=:gJ#p,KL]\a2i*zl\a?G8^7;fya[:G=3Ųݲ9p9HMvnղIF*9cA1iBs WqvRPx̓6wB֞D\uv PlHʺ~h*lBA܎p=X^^ Wpzy8Ya@uƁFřJ F~ZG \{Kwr*U96OmAEoy{}}@|dچ,27i5 Gs;-́e|we.6c9(le xcܖȞwC~:RL,wPw -[d(eVLhkP+Xc,l(/XT"X| O +x=njKhrWu^O:\܂qxϚ&G!fx ;P,2UP.W+66Vî}ysM/.WO8x5|妹*GSS1ԚY=q_8.q]SV\p-, }O$0;fhGgWtZNEpP΃`.TIUaFL'աYӐ^|GPlRM YgYj`:mt6ߧ5 5r ]=>>x gp~ V-8sV!ў`9Uk9&]M!dȱ38uHxKNpJӸ},:tecss[^gMml:_b H)Ҥ{|Բ5hZF!;Yo7~N  &+P+w:)p<5x֘W5\j+BHByUtUٜ2MS ?t xpsH4`XcJSw9P%-]5<jJsNq|͒Df}cM̯Zux=>յbI+7Qk+iXLvbR㉽pEM.Lc-?gY*Y @^ft̴VM x檲U:5؍9@Uӝ5%I6%mřY]M[x,6  pR&OD͎bT3hR+;]zT!he؏Y @*z\ H)lJadX m=.TMA^1|׀7h@ bnNdHP+=xYZ;ߐêlAaqt8-^F#6L٣ZPȍfWujք\ӜkwgoDٴ2`Y4X*9z$hEWqp[7".uU\@z̪\ay>uBXQZ-UGBj_u1iIcҘ~ģG05s4g%e\cVx.q? THWO{Z.Ҝ,gMzC<\ +e+T_jl|T\~^[jͮq6ٗNvH..L@OH1jc=.1R_1XћO'71Nꮪ4-M^5[+;FaOJר0>76:v8r{x=nš)n6(,x g)u5gDMrl -:\p`Ii"B3)޲p{=*UfUxX5cm6Ktl5Fz8:=)qAb3.fyhB#*dvd4@ݪKuTʴY*2NbIgfhœ)=`J!8rYNX z\c, !nsmwAIcvxxU]57CS*P&;\^#8+qm;stcknΰ}rQxiYDܮbn \,F6Quյn<߮~n|])̜eskDRߙAq'.p` QW4Ϛc6-%q2H]LL5RƏŊDᗑ&uYfL=z>xe3MzVu,_:vhx=>Ҵfm3j$k01\M4_웾rWg+ מ3m Wq˿esŤR 玦l ں5VsLQzqb>>kު` hcNnL#]̩1F@118E!ڏIF_:]ĤlCD|EbllփHY @TЬxZF ?+:eZMSj H سxKhgWOid=ޓbߦUZSxV*;s=1}[>9ҜfIj`\(<]]^n{zQz8YQW(>fKyr.75EX>奱) t2>Q)&d2_6><&G0IݯN uhU!hfn3;0 㔦Ԧ<(- ~YۃYTڋhJ ǒ`F)v()0q)k14XN#.`"Le+<}҇w<ڷk 9,敥 .f ՚7dRS\e~l/^ j`$\f⣀sR]U- MKiڊO3TN˩*lM/.M09Uj7]~=Z nS ' '{ +ƪJ:>g:T{BM+ @/ωbSN>gQ|Kׂ/'ZPxsdd8EK°:+c7Ο<5M5u4kۙ,wq%_<]3pK@k{B&s`rRh2Q!r]%+eH|21X澻pn. +9~|s̘5}1 4J_t7orYCL].F|<+ZYb`8>332qwA:$%9Bt;"Ҝ C˼!M[r켓 ~+0V<-x+L4JoP<UL|UTDZ6=yeYEWk<:禃/,|-H%Zv};/VUtzoخYΑUm^ 4;7f?7e3zLX:5~6ƜTd\Ÿ4X3/ 4keƟÄ[Ecnt8=UaX@2cԄј^R!ڮɥ9Tt ~V`C7 Z esKB["GBy,}oϪm#?x=>wW.NcԚ!T\hTrs'BD*\Ԕ'"NmUVV^-S&Xb{D 6m.ݦI;gʡV)LXrc&ϣ&Ha,ѬM鹩յ/;^t j$wo)b0fBOQ$μ0%YX/}}F}޼76|6/HA\m5Huƛ:^ܑA8!YFs17L 00#Q3xyE9ljER~#ڗ@TR%a~)uEq @5)u^wl En ~-/ c^׾eAyR9䬔B* Sj$Mzs·Q~d~EWOծ0kSXOvPU&ݦOYy)<SVDj|- ]]h"<~ű`2CMeSҜ_Nd pKRZ m^rp^?[*)Qp{h_XmXhNjR&WU{28nLG32@whLČ LLf?P +C\~~߇⤅^UMzcyAc)ϧ3^kV ' Ļ8W[k!XS?1B,Y W֬zil3MFqnbʮ1N4qwOߧ4_P-\=#0cPH21 Zk}BPL.ӓIy;.jxM֩M,0u ~hj/^-^Xa?lfV6SMz^7G  )ZӚ>E r{>(˙5iSb%t7~NԜRw:LkF ^2X&`.s#/s$XxV9鿡Uj ]QvL0:Z{|,)=~ĀGtDukBIk˓ ~s#^_$u&MIQrܒw~~{>w8,B|JeW̰=O絘s,\W`" |'>_R[+zݣQe봤-ݗ ZKS4lRvN@$w:<f1Vp7*).+Bԑ%A,LhO()7ȞbJ QRQzW0cS9eRӾ% j]qҨ23va{ޔ#?sgށ!ܱ \0 M;ǿE4Ȓ.`w ޲zO < x }/Vcәw?_6/X Ҏ0rc2iL+Dc' l@ J$VNbpfK,3Sц,Eى#<0X\H1ԑ_ǼH v ףٶ~V *뿖IQxB~At ɋ}j9x=n2~׸RP&>U99FDrnFoM\A(SX2(ӹjg?z'{Χ+̻9kcQ4ۆ s2U[(nxCyF-:ww7Y9(-f?ffؔlZ˖_,ZUt]L"54{8@Hkz@#Iyŧ]>ስn'1`kV 栄iCԙ(y*ܜޔ [r1sWA<\_Tf:p|8uzu;&٪1Niϟ3ϛ^U=mRa:'&2YG[[U:3%iLyCt`N: $-V@@9& Mpu7)+oK{("{$GnioL^:REQ^n'&wi34dvI'RE *I\&Vm[xhlΚV4m\-Y\PEdz/7Q)'8-jtSw%ɝqC1_=t_u S,DyƍQg7q"Jg::> b7u$Ǻ.ZܦYQ|S_^Nan YbP$[ '~^49@^t>|iЛZ[eW/]\ qzz[_l*8#Ju"mUJԗ5چP.SGl8?zp bY7ɞq<Бɼω3㈡7L@pZoͫT2\^reS|ORYFc~5=9_4׾vJ#+SW` = ".eUЕ571Bg\pw^ο?==_ w$\-?|_Az[mfhJq头c8=5ְ9bcݪ+(r'c@vIj3<2ΊvQ_H|ZV܈kW;lXRԥ76;z!->VJk66]"'ކpnCUP..afqZMI\:*N2ի?}vGKA'?p|_M8W^έwSK%Rq-*$;信g2 Be "22b ΛEP/cb*Yl:ZŇYhZVC>($^En A=_O\;эD+u;Bo Tmd$ 6$*,HdJ$BaLL B%uj"4)=m ДLzDQ2 xJ<ɯ;KBT>jc CLG& HQQ&k컁0,K>7~K_飫z챫}Z;6NܘYƒ ?7"$.cCbdɦjbJb4FXZqj,Feb'X>b({VYF c;k`g Î͛-(ҝہntk o2}<)ii@4@ØR$`) U*}U@R4@(4Q{r7*'<H3ŀ6Vzqy_ח?6,nޱN7_/}.[He EYrv $~Ա9âMY-℈Rf2\`1*Z V`gjBM] 6[ϬSj2#]Uwq qnN?Bvu{\Cs^jJA¸MQ  x) ΀"S'%tH H4SSDS"o<ֿIUVKUnV/T`< Pv.<T+/+/տQwG+鶂`ޣJ_^\sG<3;|{Ż ]nB8L &1`tKq-~1:L2 0fXSg6TcLai 86Rk(9p>38)<*/o$3 rI$0% tp&xȤ⚨a J'H5i$Is@L)$Sq,|P )(b\|-z7-& 9LiJP=9?0vy{O q(;*0n«*2`(@Sdg_Wq|GIt>+ V#|;qsAS`~T&FJ 3u1Rԙ8~ypr 6.d1m BßK=Ip }JnCfuu}R>w nJk9TRR`H&#Ԝ`JnH&)m2 TxR!%2ч$TDu:ސ(S5I CIw/̯\~g;vqWDdВLEz3ٰy|}K?jNB*``JItC.'QzBpU,{b7z_zzkz˰ӗucmss}|`y|`<oa$$01d9'0CLMh..fO;惁x.y.YmZ\\1eRk;lry%NWnq /x7PYTPNvPm=hlvi`MM )圔`!JhrQMJDcH&J*x$$PE|HK$p!]lFM't*IUI XHaI`ng6S4+>†΅02'JVn{f璅ݎ dLwJ&f>8:\'A:b'H YHB!5q{K+[ʳxӒQIxir伬Nκ2`X];J_;r?m _{ yVgbb%efHeO!1 2R ’͝rx.ML )@rH+ʀ1!PK"T459c"B`ɑXI$q (ĄI֩Zzj{ $AŸ鐩eZvRDT"& V/)L7;: #cc)N3+%emLYD`e[\%Y,X7+R@ؔL0MO9yzݱs2{tۏnVz  l;"SS3Vzl$+ "FL(=A1DT]A5%e m㤀j"AF.^&઀TzBIF%UNBL`7UmR2dƀZvĩyqHmw3I)Cĉ}P PD]4cБJ+K+}Y 0`} F0ƴ 1&fFOӒg/>:pR&"gWKzuzI;^nELޡց 5oJbL/5<ؒ( n1 mIYh DjL2l@R. yάT@I I5OJCR'r qBK`2P4jfaAdPHNUG+˾ Rc]VuYinIL󂀞ܔD\P@\\D$JPW,  TUSxHULm",jM` LU!d۵#s_>/oztLnڼnIPj)Źy5|(<4CB1X-8kp5ji"[&)BjHMjKHhJX.ӛTӥ$Jz<uHF$VU$ ɢjFjq % " bT)&zWaA@zDUs4=/~PSX8I5A-Yײ.HE"B6AWOe]RĊH@ң'NZ"L 1115YO)n x0Ek6#0n"[&w:%n6\~Su[;:zt(ިS}ݤ V{>[lf¨E 2%fO`i:G9|K BDFU$r(.24:M\d2UjsRSl%5+n͢J][;4\6;H K82$ `(^"~)CMlRׁ7\>;: ;z|ӚϢ- Ҝ.py8bg2nSWX4^èH䔄.EOf'\T䀂9Ǯ<:.Bj1PkB "]I!).Aܣ.h4nK0ݑT,cJd魮J]!dAÀiSrCs9 9j~ LHufc ק8E\R)'sm9ʀgqhVeI..e|e|_³l;ףn65n=KWR3"81Ty :NRhԼ[#o 2R"HFؠ\D߳x*UJ:ēPjX˓I6&'&McX(9K4$RF oe4Moi4*LY606D)Ҝ% 'pqxQZL8$QFq&wpu*i䨥O^ny! !::d35ONTexl[˟!Eq렇#oPQҋ#/7 Dd D6G5<5b0R fB *%<%D@Ҵ 6SrP$%L.Ք`,&`ԑ@Xb7 x3 N+#XyRbЍŝlqlY*`ht}vvx= cU1zr qq+*6;`w"F-{B9L@m\˾9†"²"/,+p() ƭ"mH+/ܑ Ó@"fzN H/T.!Z,ƃ݆Z ^!%@쩈~C&i]YZ2P bMbc8p}x;r[SdƆT0bX!yH!vׁscn?vnuojPgIcaZvűC!aUJS.O!apGvt>2/:&Jzk hBK* -u6ͬFKJs)3p#ӖOȩ2 dRy#j(L,^a˖uHV&]  Pv9\nZ/:4&v7`h`WݗkȂxeOcv gMmޔtQˋBf؝B"qne`p^ZbI SJŭuXt,۔ ;B¸(ʕAQL(55AL[_PQihsШi.2 !քeޥf@3pz|-1揀8LYR0 Su6snQmlϢ8]q2Z˛]&#Ҕ~2;6TЁף&]7C腺qZ:5C☸dPxe_9Nc bSa"*uoO6]@Ei^Jԅ#S t dH-s6ӎq}PC i")ɺ O 2_3%4s@ѶO°2Q+:1nf&tT&\v}rqءyA:z|Avu76TDaJk\,ٱ<$R!yFGF\ĆN{zo)s.]V,ɆRӟOeBt1䘑i (LF򺚽 EX\Ed2C7-ˑF \ҖUJY[*=5.N&GB4s RPD]02]vݦ Nc|qez)ًGY\^>.wL% ujo_=(˓h4]ڨx.u"FO#7dZjI #qհ'ƋKk$P- ٌAHiD SqdB&sJNe(pl6t1B̕H(j/H="+@,YXNXAXhHV4bfND8.0\OeI :5ҩY!uǵz Qݺw|\s|{yOio; *8/G]O0ncqMkNm c8_I< l1S\)NKΦuUrm,σF+eye.T[vmGܿNǎz8?n1)-Kq7%mZ\D&muB޿Qp<{V8f;&Ey?1uO]dM&LIfc쿛hm9AeZwsiٶWoǵ0ENMiXGD-0e aXU Ԙ2 +X4^!Hv2{ȡ(0Hx'UTܮūӋM'\):]ErCPSus<[]x=رFBpsNmVp 4]@OJ@@X,Ʈ:/$l|,30]@ՀOMCib@ fu3Pә(nIL-Po&que)Jx,;OKnS~zI[CSX> Ϗbkj2v (:6Ie.NOOW˺V /M@#^7mMс ;~ g!ϽxK7 at\',9R&mUt d܆Q^6zPX3J SʳP p4:ALla5( 4GB1!a%N?) :+żR@[;ؠP)5'oF6lTi~l[fpHmgс > ][SNϥLd!,Mqq*`Im*#GZXAL& 0 btq23Z\_\EgW DR^ա=?lcG ZK]-" JO_+K?!JE Q˛YՉ) 5^Ҝ?q`ESj S,fF]N(uJUo1fl`;8?Ff}PsX)%ŏ({t^sc|[ރWdvЂ]i߬.N+m WJ9NJ?d<0תܴ3D}mj2Z,ɤҪE T\ZUoxpVq+e7̍歲ty;E* n\^,>+.}@9u|O@|zwNmB qY V\˛צ6w'EՔh] x,NP[<^hY]O\.OMV\X+ԉw9]~tPlIShuu/~G זu5ߟAWU_һ #ދ-aߟ?{ҫۧ ЫjU0啹0 &0\_mlm>UwRu_@m_ f{xycEOrc|j`ׁF7p 䐙첌XW'didUo;0߉ ;W0 'hnH.r%Ԉ+OV7ӗkNF`k3'X{`iėtfh%h낵ނ.V!X)jϐ{zz5Ze.^j`YCnyŹ,_4zt㋠PrϫnRpǨ󟿡WZ_4'^d.ή8S`޸R|UUS::~m3MqWsnE^_'ܔz]u`-S-Ӝ gMO>K Y`)'zAy.8! =7O%&L.ζ|6YokgiS Mw-aV՘7 {Zm 5*jhy3;,שyEʲU˃L@kAly϶KKWU]\0`,JY垥^ק{{QֽGg{R8rPhӞuWӝy 춭z lU֧7޹֐>{˚^m-X=_(7(~Zޱ;r28˺tmŷ_W`8}kJ !m@Wy \?m(}jaׁׁX٫Zxt K B[o@kJp\W? olV]Um*`{|?/-o_.RխӘ-8͏]YA®gx;OVcb൫{ؖW{ln+\fd=/Sok]kU (>uJuuP{}z{Inwr*_b?ި[>S{t{Ayr9_;;G_>$0dOEHn ::z|w[r/rʫ/ˍkWkS5=V>^{oG>7gy}׮*'u|/~u>XSuex[,U65:ztu}л>ǿvss w<|{X:=ׁm?x/N/7 ::z||0cٿǞ_×/yq^W㯾ν0)??6g>􎍿/5P?G< |ϯOyV;z|~",qc~p ŸvZm?n/pp?Gey=tсׁ9<'b!-Ƌc= g:/u??]}a=Ƒ?=7x}' Ixx_p_'sG523G^^GOO4_ :ztuu~A`E[^S(~Aցףg||)?CgyUPhѣG=zѣG=zѣG=:zѣG=zѣG=zѣG=:zѣG^=zсףG=z|ѣG]ѣGx=zѣG^=zсףG=ztѣGx=zѣG^=zсףG=:zѣG=zѣG=zѣG=:zѣG=zѣG=zѣG=:zѣG^=zсףG=ztѣGx=zѣG^=zсףG=ztѣGx=zѣG^=zѣG=:zѣG=zѣG=zѣG=:zѣG=zѣG=zѣGx=zѣG^=zсףG=ztѣGx=zѣG^=zсףG=ztѣGx=zѣG=zѣG=:zѣG=zѣG=zѣG=:zѣG=zѣG=ztѣGx=zѣG^=zсףG=ztѣGx=zѣG^=zсףG=ztѣG=zѣG=zѣG=:zѣGO,mЇǸIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/splash_anim_16.png0000644000076500000000000020671712665102044024352 0ustar devwheel00000000000000PNG  IHDRj IDATxY$i{fd,E[eKUc 1,")l>@P89>`BwךWfDƾj߽|ߧGdRzCBusssw=v=\23L5TSM5gxz joj&jjOO%צ`VI11joj jjjoj&jj jjjoj&jj joj&jj jjjoj&jj jjjoj jjjoj&jj jjjoj&jj joj&jj jjj*L/TS}s 0˱񏦀*`4BAH5C7Ǥfmxc U3hFm8|M3Ûj_cs$H{Uۇ4I=G 2ks{c &j_Ϣ> ?ZQw_9d 6{ [c &j_?V7vD'%6%SO7G ?qkV1Mi \7M?w ˯$j6xSMYdyqq9?ޱj榌dIAfӯjSW=[&o>3@'V7z%cXښZ80,^)ۧc'Sd `)>68cobvM5g>2R@Ֆ'eekI:y_XÖ:4r뎛n<0b=dy'cN<ÙiNNyN6u-ñImcv]M>Y FWܞI%[ys1*+ê㟔U-Ɠ2WY>aM5TCg:*Tqdx|7vKS0U:XӪJU3>zJvMvM5կ_ 8$^\0Ң#'''Q.Ty{IvM5կ7[%P|90@Q )7כncyge?d=58 c}9*`"|X'UN`7TSMUh (ۊMzaI vl}[o4LD{cj$mUl].vM5կ7+MC0T]坐 ZCO [GK%)@s6F &j_o ApٗXÖXqjM^5jX_9bNÖ6 1VI7y'}L`7TSMW^^HyyW^ypL#@6lIA7ċQZ6Uϧe'ocq26lP#mA%S[&v# ilXrOvV&* D-@OWZxEϺEԕ.4Z<κMTVs%c>) `g6CjǛ.&^.K9'zM5L#2H n,v 醑c6 F6 LOn5~bd=.]N7Tju^fu 0?pkO6`hCcoy 6k aW^ .p!ۛ ՉI2T4gZW7m$+Ht;^=q)`)Y^D< ,ج3G.Oi(?3sjbZm3TS2؍Nm܊X\N)o>eWBV"V|*NlVu`;zP}5'4l{J`wgH+𩲼#nj16]ز}\t.7~|ro>npkUX C& f+ XckQXlX)l'u`9<٭'m T}M71vO;=;L`kn!C2Vodu SUޢkEL#`)LK75ʍ` $fL#A6M1Y'$\OX+nSC[vO\{uH F @ooY݈jP/)9/>.&jkOmCf'֧u'r.Tlm22[?+8sPp\R*pY5C{-ʓ V0;F,5p8۱n8+}SxSMI`ye\rsT2]5`y(xVEz}q3un{ZM1`uISUhN$bg֬ZNjV; |!piQ+`T,n4SSAr6-#ǭ Nt7k+mp75R^ MXNm\O tgb>W(q*TN03#L &j,jS`SI!6(jFX&Lay(64O$sNr$`wR: ^fg>F$nՠ?3L7TzP+ipV21V7XVzlSђi<n?g Y6Yi< qImV9m]O8,ni]J4yY]WM5gW6W*g{CWK<8ؕ 6'o\p<ύmLXUO6w"tLy1 y@8Yݒr(e@>X* G=`q7TS}1!, ҇ Y^،hC'ٗO'ٓw 6ySxNLt뛀*+l7 u3ժӲ5Eey x\<}gqc71֒$|H*)ccm3\`1e9@nɁaO4[՟VA6./vkz9iX]O9t71p,C{mzrgY? +Ag%e^!PY hlWoVq͒mr>%;}>Jl_D,GvH /~JV#?խ+YN^ lcln ցe!v-c,<덥7z*Lz,A8Bio8iVir.?1Pz@{Z7zmDD lp 檰 ~3=\!3i7TR˞fyLm JP\z^/hĹ9Ђcֹc=v'l nO;DWm}vDž=o+wml5;5wJ7ctC VXےq|s]tZh$lZߊY[ׁHeǁiqͳJ  "@^vxF9gZ׾,Y]~cs ~B]ңe&XTS}J2dle~&/ZϬ^>W6h'@ag ,'M x뜭ʡޓl5}iwde¤tJ@]i mYݙ%1TS}A 2rl8+p 0v*`+nQ8s`wp5/F |س,,[`/.;ms4a~^`c-ʰՕxt^y ۚc}Kh0+ X0+.eOZ} m@Lmd`7f%j$)=Vk2Zg% ;6<.>^ߺ\V`|gxSM v,edޒhE[ZKL./@,6,`p0d+§O<.A;.d@mh _ncm~|kBJOl1Pnۚ~E[ vrVG)0s2m`{1dD)c`'} M»'jOgK3RDr˰ , bV P1JSkbti6;6euwҚg8 kwnS( fbnۛq:˿I=` .%lۻ/fbxSM`}2jZCs|0s2qce{A\v, W }`wZ[}_@OU4i.P9~ZVWp pڎӕ`'ˌ ,5ƒnxSMi`w^jUlqE}hGX'|孲'(gyc|E 9fM`wR: ; ?3<;4KQaS,ž Ĵl%a2۪nu6&JYt.~f X Ϝgy}ho[%YxeVa˲ܥ#% NON0;͌np[+4|$]kw"jLJe~ *D)YIDᘰ=;guc1fۘ7ASNioo>o] 0ަ niЀ%&tM@TkNZ1J$UefL:VԶ2V 29Q@m{X@We6V0ZC9`\Hq=Ӡ@8TS}ZM,؆aBM L, Ƹ1yø! cW,G v S6er'e|C[oG=@4{t9": 啫@j7\eQ(ߐ-Dcu옮iib =65:dӰ9>w{_cZ< ܖM"7h:0gמiß x:_݊Ypt @iV&gbxSMify%dpc%+F+KVmFxЛo|tJ$wymp}v%oVn{o ^rVGI2$Vڗ40S)Z9՝=gm2!'So>17PlmcKNg܆8[ AۡEJfyC<a`啰5v| 6&Q^'QXr<q5P-I}uյknq2C׾czR<՛@Yݺ*VG|.ޣiaҤҜjѬ>& 3CW (r Sl!-맥ChbuJt`4q0?^ijN6p”VqNAc$r.W*)sX7AZp2as/op}yahca+tC?^ zڛOVv WVmW-r.EۓĜ!yKs6W58{[g٠4"{(avTn o>Wpg:ʰcu$$hzSlE*.ڐcPqz)nSn3DžnLҁ]VfZхiq,/ms&!J10M\i;T󻄫7AXV'0nXB2|DEu$c ,.ے(%3 Mwg ^2]Wd3l=>Ɛ!㶵Yt.. p&\0__N fr<6<:E<%P6pQ=ܣgZkQZ/].B8AZ}^GX] T&HS޿Ix[*uu۲c 'j_zm 3 etJWzYޛ7qU Χv NV񌏋e-u-Mvr`53Xi:ŀ7 :1+NȵmiJeaN^Rq ՠ;Xu|M>Vób%PIt=je/{ZzºgpªJ;ɾ]Lވn>?*mr423'PSP`uɂ K BuiFfuv CW^}ohyi߶O7T/d֭靏δ{nSƦ( ZڛmPC.,:innoR PiIqA{s v+b3&i'ZsG|%C vE^JЙC<^٘Kw9Z@$]NGI.0$($/|q%ٝ-1 ̸yZV77K2e|Bw7TS}x EKel,V)۔%C[%|сs(~ΐ ML܎>jDfb]_/^N}LmL n+)}@b~Y3Yi;Opݦ6*,Pr" @f 6ҞΌ@b͠eub:~/[Z,gy+r0MG aFLLm9걳$Jc" z+@o6؎T2荁a#ٛcF11(uc[V'xqD`4UMp..p>trSXbIm_U*Iέa K#^ CCE+3-e_gߙ zaԲH<]׭ˤ'"L7TɆ=y܆ǔgt LHwzoOS1򩷼~:19+ޡv_#gvcJMX+^e3 ׆sۉY+t k+V) b9m) Qbu b Aչcu @Wߏ8X]9s ֦&9hk7 GmKڕ WyN>4<`S7LH3Z1gm1f xkr%{~֭/ɭq } B`^r&()G6~%VG*Rmo;T=s@f$0 tw%pyhVxJ>O;M-ͩU;xrUq b\ =nB-/F8V׀]ɖVPJ)-3;Z z]Ӏt5FT BgHX[J J*rffy1]P\vs15]bW03caXS ꓁xP@̾9вUMyΨ><Ėe uټŒ}C0X5-2 Ϟ,g]䑏ǵ-ֱNҵ-yJk1Cx^&izbZ0':([Гd-?k2;bÖ^YZR i[e.rk=Xa hɍXzlm؊ ) LIJearˬm&W.es{T}` nGn[..J'*t1^/܉-z+|3!TUa1`0*^pE2uD+ۘ`gk`xBun:1t]hX2]ziFgG̡,k3hW~6PꤝYJRK8lp}륂@fy9f2hzPע4P-⯗IwO)kZG?ee0Ӧ?3,o^NcS6!nU|=a VWO/_vl)%[FyJ[g?Xv8N t%Jۢtko"e!D6Dt}56Pf`mJ 1bm WC\!Y6mB=?w;;Ʒ*yli>G˥hsm9+gs%e.Mm_o ~EIC;{:`/wtjR239*u{KyRVRi: aћmҖ[4Mj0y5TgE ( 5q5TF; MNض<ن~sxqqVE }^`uu.Y"-eզL.dWԺ4%gGq=lvf)d->A`؈-ǃe\47Z BRc*{ۖzs2wZ "m-3ht}k~сlvuM7g)ݾO<Uw Iϖm*ۯذ)m]r;LNZV_Kk0'p!}!LեlKt.;K2Rl ^}<^0Cr,+1[ L9",1 ޭnn3H/p9@^zpW޻o*B^fKsNF9^3E2P2Zѩer!-)+^na:SG(焖h@gB _Eu+:s1etЫcbv:kO7կ#НWS<Qv]O.^Ng:yB pQa n@zsrǽpExG<^SsZ܂q iWqѾbN'%3{vnN(-ujK!y|Q7jOgP U1Lq9߲Ug"M8Ou`W1;5Deն.؉R~DT{Z@G'QG |c3a3aJ9\Vq%.y2;:p =fV^Jz`GK>NY08ޢ/>^ETgf׵+iݶy\3.bzN Nq#mw:Qe#_G G ؜ZkgtB/4& |xSڀI$\zi4WFq“UWߕk8.Ax "f-M%`aF.[ p}Gp VTec `q]BP.c,y+~$.|l.*`Z l!K&xdQ3l5jZ8{oYnO:@a&eJncZ  WPMDw@gM)嬮 ukQiN,o>`Q&mȧ O6)m~Yߕt{fr@.3ε.]N7]3(0]cQ۩^憯@ؙ]L,,B@`n˪! W޻en;@9ӳ1cã탅bbmb60 yv6 Sf{3NqID]f;3,D 9f羌o63\S^M1􀮎z>`wVF[|lMV]13LS6dʇ:f]tus~hv6ԶQ@f%Bnf_43*--֦L7էNÞM铼Viix"|:PP(1}_I@Rb(C#2 P r1`r`io U fP> K fRTvfuGrpfX|$' {mi LnAȜTHJl>:Z3Xd\R62xX(Ez*v> tT QXYc :VTk:).keY9:a Db<xS}>?6ISPl:Ig U$z>ìX,i@dUE۲c篣bw@WV&]g[ ܯby6v۴ t1-U]vaF-j{†~,LZ pL1a󋨒R@]ėuIEuL̬&<˭JӶvUMSd? 1BLJJ*C5(\br st+M: $ӂql4@u}5[ki?*7 (*hfp a10˳:i-*֛]^lKx4-0vu//Vd /<*4|Lƒ{waD㼓0&J4#K+ϭË@׵+96;oP}'mtp7W$yř[{0#\m?/iZ(-5ꌮ3k4PmKf&&u*Li?6 b=Y@:?NEcKO f!@> ncYe$_V0>ml0S2…+"1%$ӪG;Ef3Bu,duP(2S Akd.^6v/ xZaF I+E%80K.>3m'iaNz:< ;ɛMwԝqMojwO=xhcV+4 R71sS03o{J]BjPn.zİTtrܼGw 9u6%o.b^Gc[HL+ȘO9A/>; Ԩg`gF"svg]nY˘ۖEk?Sbe۱:1 UfPkej/e&洲&JZn]trxg ͼm[:[,/xS}쎞? @[fjqٚ&aYܲ lHe{9zyӤ*KZsVEIVbΊ&D)sRiavhdU`cQy]ܺ&|4٘ݶrrbLKẌ(o\LJ G#b0C]l>8Ҙ"]uk{rRk6drV-T)elh1:GF/hcjFXqmerY3Y:9jTg @z@gp67|8TddI sS: =-;i;-UmU w4k  ,cڕP Y^@型`T v2hSJOC$0 y]H Z.vQCV^Oʵ`2 D]% X]m;ܮ6-ZA )YiӁ_?-Ons/sD8?GGFWͅ"BcoYfkA:1Xbt\ku( tTQ1]l#\,idbmlM7է)= 湯{-6c_ޱlflZE\:xNIZn9kWt-ʜR ~5Fo]F8䏍VV)9UI"i&Ppxmmq{,(m>ZZ M7'ݝF)=<-9f NYY2Uєfx~-$ I2+NPrİyYjegterJߒPz8 `v/cXQa)L vAJflUYEK``k?pP2 dL&6fVכGW`Za%Y:k3( biQcJ^?'~i+*-PQ@:k4*ESb0>HËFtѿ{cteq[$Z:-xIZsׁ&Qbuc-q]nkZve;hK5;m^ҊU# E+g9-JV-[}o9ܺ3@׵0919`25`o?1-K&5&[.D|nGt[.9ڻl0$TyihmnR"X畿*y%nx4&ps0%XwnF/bKv |,mgEՠ%pZUVQz.Q5xS}IY =؝>*;Lsحki-9B:.fZ.jtKl,@ȭjiWFw4t*@dvRr2YҐa@MZV}uԲ<+mIywԺ>S,sdS9%Fgv ܶ0E`/\ fq>Ln&b bM>w{)Y^uvqK\ RӛcPtI)FCg \]?e~gH7Vi4E *ZqTlO39jbFFE.FQ;|x F&)HeI21+ =[T[A$ZSOj/(Oem18[a$n7kx]Jh!O6Q@#0FrjUTx@bWm-BR6\^V܎(>tΎBW–.~G/f6~:֤,̘,أz=x<łeg`:bZu޻RYIiybVVbP?TӌI*}grZQڗVu׺L:AW T@Kcexd (1堜 .Y?TݦfM-Kا7ր83LtR2~;Ý'/ˠ8)2uG(/.b.;50*-m _4KQai=i ʩ5wFrم[͚"i81AbhdC~}>5F _?Wˮ4]wFϮ?8C/XimlQ+,P$m3Quc'Hq'hms‹ [4Ay`4%34.rm2ObwSZp? op?o"֋XTѿW[9^ե>`d~Y l+y23iN4UJvwVJ!˃`PX;Zqy\ qs5jƀqe5զ3<6aRJk ؿϳa(Ca`GaKL(4 M9ʼk28Wm o= lPlSl050aA:la|imLT6W$F-`0#͔[fn&`@ Tˌ(BzRm `ᖡ`voYV/6fOxhZk; Ҕf UB&D`d3HLO:>@@j)R]/KJJF-+.Qf-+w\\?u QTbP[hML )b8Mq+j纸(4" I老,,vRST†P]dk nMI`}_C[ &O FXb1klֲ;ʋWۛXu[h3"ª~[2]oeU5pK3)t6rp3&LP`T%ei@/LoUIJKp{!Z`01D$v2XZ1Vv-֋m.fzq&gs@vB/׮AR3AFb#V73բᗳ> M'䔚R ۼv. 78g{w;@*ReO@Ecclbt90QNJ([µ.saq|bXAxD6&mg>38{$SZP2TO4T ~٢Y@n}\ yL5f} \?"JM=Py^2꿯-W \tRϠq5mRcr pY%"P2TF4Ylƅ_Tu6YC"HE1gjMcX\ovCVd:rST ȶ6o~zvo+BqN΄#fw_?WPX9w?N))2 h37wڄkFl1h>/63˭,6ojQe6f2$p tΞ0T ş=n`7[J2nu]kfZ%66+?cభ Z)~ fҊ>F^A,Щ.;%64rgntv2i~YnYqn"h3 YҖ1}k hfB8KJ Qb`D)X<W4vvL9\|_fsfpbtD޼1@-p#$D1,gv⍿_,.B!y6"Z.WO^q8x&/5Pfbmn0qF]~egܾpGn54ZY4,@*Ԙ'$AJd QUEk.\eJ#"%ijGFoH[<9Zfi ϣ*7^ZbQۺl%Efh1,O/vjkN~m^u 'bOe{g[Pknv[iBܣ}[Օs=@hYvQ )ZY_bnIb2FAmp_6IM-0&D%3#26f"b*32I$ǼQdrPMӤ&G($81S4Tf!@dB ~?\.sXWf] ,֔ Csׯ5#qa # ̈وs^߾fCJGjS68+ F'8x[=X@KS9]Þ=)E9jE$5ϟ٭:3s<=2yHcۺd0J9^LӦ>.ږ%m l N՜oS.ﭟ镳\.eq-w]-g}%Le+[@S [*ւ9Ƕ $-4%7Sa#hEX {=ahި "?GɌH\ "@И0!(`NF*NBh|HZdLBdTGXbDx?D~s.n`))Łk?ek3;,L)̻]x{o^v[8 20P&Vsn]:㻦;Q͙Z3G ~:͙ ױ Wmryq{OT +Sђ9gey\Djaڶ<&gnOKa3WHuRi;lIh_d)I/  m?T>={ۯtٮ9[sRnoT][S2ؑo//fs!3toc`{2Sd~*-J),_2,N1" sᛄFdԗ8%ICdin/Y+D;fH[ D( LfbIWl `Ă%&Ҵ[#U(2\J"$&d!f;_?3 ;I>vVMZz,Y2/|o(%bb-Yr,[ʰgER/hͥ߼ueFF+UcVzYB(h/-'9Ӽ|~W9c-*VUi?b{˷Yf 2}y>N*MX2/!N1Nl9tx޻<pGܝo_%~h~ԁ_Us Y2nٲ//3Rܲ;p5FKSK &IylT͜b`E vftw`ܭej-M+&Zh)bx t05" ؾ]o8k%8 Ylf$bDZ fA lb&f |@q 3an\&< )3$#\@8DWgRABuQX ^(Zϗrz9ȴ~>z? HJ"V~Flѥζ.D,9J-s;BzbwQ߆`hy6K߸?4Lia3SjT(/bmTVCYi>:zWszaEԈhZUXyIba=0A}^f0$YkG0 6Cl:p:2OBlΊ4 );C)ڭ1J F,٢LbS}Ro:߽ؕ^n=ׁ^93mJS(ԳTPԙEJRZ/3Sgt+L7THH { e} ?va W"4ʰ&M*޴t`QH쑱u㸑&4 F `T)$`͌#S2"pNtہ̛͘`$Җb,LH$HG$75gM\_d+ervݣ׾1$FbLA?|{CSMm9pFRS`TU|?zVck<-tFfMԁ[k`FZhC=Fc֜G" h"938YR`澄vJҮ5h{B4`M~>F-JvG[ t`{vxS?K,p~w1o.wςw:ky^)dɗrf ER”؁]ե%5$>QHܵ1yQADkǐShdepXLڶNa*FBI'0x棏BTL-^NADy4 @!KH@l 5l$}@I*c/n56)8m&,֥&,,Q`osۯB#0[~]ki{?>x;ު6f3"=uƮC2}3? 4F$Pi}rn"VEN2+D#UWoHb5JUAm1P׎c󥬁1H>wTJr\hbSvqJJu#/%f6'>ڜHhr!8Y%vGD`pH}6ؽ.T# Hn]={@wǞ˷mtf>Ffvgz, C vfn޶4?PnfbyngƩQYԅ)yUFvA3Htb5) )8`f-V@Gv3:d7AM L<4Nr 82b3rFXaJd  XgKU* `#JE)b ,QA0!FogE_?ʿ ~~)pw{KsO_̘dDjy0p`ƂZ,|_~{g9w5R2Z:FI8i_p답[m3 5LY\kX?»Sݶh)B&rciTVe-&ehz{:qŘhۚl=uZ_] J¹MP<q:} @[Uڢ@7Tݟj{sz*A[,ospfw E;s1wZũ\b06 !6_ՙ@T@M|ӁMMCh3QgTO 1dGJkdƬI@c5MhI-Υ_fE; R$e( #Ҡ e6V1H9Q@4h9Ĵ\AP. 5Y0&62"vA I392{&$ zAT=e&WS1*}(0MIR% ^xp~C fRfq%ڵ&ٸpbVR&xy7^"h& ̘XQ:oczJT{zY Uƨ5R40*Kfj#VN5B9.R{Yv0@n04o^ P = zthYx|*7Tbvm7_h՚@ zn=3AQ&A̅ה/j , lkqc5}a)ua;ܦ`[ZR "3HT S1˖vƗj%RNS7!R 1AuwlFs KP Օ^Dd x# XBLlsV~;"HFdޜ42b! cX|TsW{_焰SRF$|50HLN Q{_yBwԚt lkenk=v)mdЍs\\R#X!MyTMԷT{.Yg瞹;ڌANjhܞ j OKQR=ުL+"hbtյQig?rfhaORtMj+Oɒv~]i͌XId#M|rh$RFdR?3T{C%  f@DfBH\g/Z6dL لlb1Š,+oo|ìL"A)FŎɿ9r}" Ř٘8oE,]sYD6S *`|([haA0xeݛoӟc @jQ\y!ȅ 7ʺm6cg/=y|ѩ",F%Q&Hj3<TTuO߈k)o> N@"#]lRϔ{YNj `f4ÛWw>|*4ࣹ33쪺U_.W4Tg0"(|3 IR 4JgCP !EG5F (4a"\j`Ǒ8p(vVgٺNBSL;R~b&l~bѼNS*a>S+8Fٜ@Jm47[AMIAUQT)N@O45ffU"@9"bMDđPQ]E8ēAĈ|D 7o|i~W}ń8ۿ{{Ī `b%Xls_*ۗ*_4+((@L 蝛ou⡑" A8Sm3SeAfu`E؀4*TU޵G@Tjj 1L+[ RJ%f٠Mg.%K&K/qw*g}m6i﷽6@d,m6l H)ܰIO |Mu"+bw%|QsAx6l᳽-P lAntl] sh,\O̓]q)yYG Vj@E1De|9&c%#kX6"JoDdrxLamC"s=>Q\s un~j $)\w Ji`% & 佣VaĤ%\X*"[o_y?}6P+T9:ÿq 0Mދ8+.)s4[juBI.?zß=3`I^97: BufPtGg"DX54gBTFjeRje֘U#$pTno:cZE%9Ё jۢd45!IPw Gjt{,zi-v$ZWAW/]@ub vMm-V: ץ q*X%(4R (LfBm, .Z%D8lOH(E3d0B.7El;@b>SX6'’}.?rWWRf&Y>3ɛ0wyNEA`4H#`djZT@J$p`$Bd#fe0L|ϘlMs͗dfWwZe n̮7/ߺ31;g[%VMYp&`ǭ<RBo܇'v_k P&)/cdTkBQA4ALεQp`EFETSkLIVEEL--M5&UP4&U%U&imqK[ 8*LrmjiyZÃŮ]XIxRX|=moSݪy^; IZh d>TB1-Q@1XqAE'H*i`vϤfa0ؔ&癃̳|f%HjL7';#̆raEO(HR g&,*M+C%wE1DDO2Q,V)qAk4dİsc@a `m SI G$)I\Dl"DlbXHZばDrRo~r>6<g#Y *}o_nHC%%:kc# cwBO/Br ^}QّD^9Sc5@MQѨbVH[?¥h Uрآi6yr$Fh AT6U5Yjj aOvKJQ&ɀ:eb k'ÙQ7bnPࡒQZU'RmN7 <{|tf?[Gv'f5p*l[>tmR)!͓ " @DđȈ*f 0cFe! f ]|}X]eZe$P&42!123DvL?1c7lat܍z|h @ҤM~͇gK=5 E"$`n(NH{([ QRg%&7zmvϽ=f@ f"E wpJF"5w h yo{oU!$hb#")1A\ǐѳb4VUϳTR}ʊ`Q ̪jVJ eH QMsU%o@b4d 8dj`U;}xXH MdMDbo6l]Ve ] dǁSM7cdwρf|=+-΂ Б[κꙇ?W6~ xV<-*j@Mi&h G B UXԈ4KP 7*+F,D}"E "%0p2 ZE}ΛYbY}-\rc /-m2@?{y]Svu`ѭ Jd03l H$@$0Ą+3 Lf0 0Ȉ#N$Ƒof̬1SgghJjBU"5s[AihTp,_7%5"@p3Uc.  Y<>u"* %]{\nWK$kIbLNa|DZS&n]Or qPb=9%+1ȭX\|RW5N,/",GXL!,.$F(0W&PvSOtTP0qd ɑ(RZ-Q|{UP.@biXNח@h{rq{l\ _[_s߅c"j *Dn.'F0"H` gZ YMA ! >r3aϨ{9L*MI@y *pFELԘ #2"8(9mSr`Lß)^|S%V^/)6>*gz&1^ׁ;v_fcT?i=<)TEz>24HPf;"`"XapDE"]쫂^ywhg*ԗ6h?#9'IjaZ޽w߽[uR2&&ItR2>gQ+Dn'Q+Ğb*ܲK7&/9A[(oi,+.AFLMJL1s2b?6jjimTY}Η/2=#[!p$|rJhܚ @/t'&xm6m-cyMu,+._3yg9~:+=;U-|Z,"fuZZ9Ƴ4I\2< 0iH jlxfުd%UHIDM23șwj{{G}zB ckarRYa(Zy'os&Fȁ^ۊ?6F * MX!FJBD0҂`f{ ;b$2{oG[v-֝(U{`P`;;igq ٝ]9! bkk[shR̗)2EV;-ܤl Үe U3RE,4VQ[V`R_*n[ =YEB!2D1<]͘S &61%y*/P)=tJe1Ky?qѡh[fF׶6D_;K r%t{?ޕ3!@ /op݈9 xuB}o?vk[Q'E`JQ{ߺfVozvkw;^Ku@,R! Գ?x;o⭟ε6[@1:EF1iVg޾V18Ӵ&zQʵ4oe .ͼU ,, pߗ`}C#Y>sת37:ݬQVΪrzdtDֶ*Й%x%0MX:0۴y $ejiNurpY]^.zSb&R4֝c3gJ:-{4B",h@I҈fQal 1KIB9T%7݈?]m[ÔH} -l0^{:rU$ )r3]X^F $Xd  a¾b%4:Ӫ~N ̶om-Gij;߽GT58򨡼 ^?{'g1[R*[$|>[GƙT}DJ=43Is9jDIK!tq.Lҭ 1@ /ޙe-7hIpFY%C+w5e/cYblن코#8Vwv&N6i=TOݍ2K[QJwyFXbjLfM7+) fDQU`M TV D L&Ycp1%I-v7@ csa8+Yw*Z2(tepd@07=F8B܌X`DDL)aL}҅7^(N=6a{oC-*oDC7}?}"X1+H,Q}fU_v; 4nF41cƂ5Fs/]Ǚ/>2o1]F*%E3gc u yZ^45PdJ0H ުFjD~Xy;pt~ajёgpu\9zjfg-8UtLbF+rҲU<ڜo*lLbuag<|f7?E]^]Հ2-(ni 803eP7&(K Uab F,Fbŭ ATcqB w 21Fo-畭L>V^~\2('R_߉ ;F#  h]cvgv%KÀ [Y=(-~A~ݼ![2os&,@ܫϿYBO2,K0 [_?D>dQ ]3w }e7W Mwc`,؊w+|VZ696P;{A@ _ƈhDE_˯}0{[ |'V窎jIOծ UyD~`i낁K,Ug~1ƽwM]IA,1(`!De*Q"L1b_3[N)4!=UocA&.0os#ՅY YT3X2 ~l(}QcLJT[Ѓ"&P !ݗx b %q(D|UK_3sZʊV1,Yc |Rs(~D`D,RB, &r_}n2ʈNxo>>.G=?Y ov}&ݺAN ͋_y{QA.Oi6}(羰 9-1c<[~[I-d-H}o'H1ܫ~U}owz IFY5m%7IMv&1, uX[&r8øM~<`uM7*X:rPm(n3UmQ41!D#egx :21)Z1{i0Fĸa߬1ӂ"eVH1!o2101b2d6SP_$$+Lb.@D;G֧9OxDx{K =p~1˗.;E| )RW};?TcWѭ_=,:'گ|7 X]t1.:{^y[/ᝃcGbyG h`*̓}w7q:`cLѬ'|Uk8sZKVNWwyu/oµwZ%CqneՎXutšK#j9šSKXfVU×glfAEf`=0i.]8鱫dž!FQU0-d$FUZ揾qP\&g׮zgOY5œT!a1&a2a%\."IrWU>ɢdn'ݬԙIaɐK9(:)B4N&`R9 vŵ+)@0%,߸tc:)))}x9;|_\=0+>$D-xXq^/}3߹t.Ec%BYV=/yWu(/#خp!n |qZ\d_ɋ=rݱ]ٕkR6 '{"{6$>8ӐCx nHY[w^.-AI*W g8>ww 11Y7vTGF@khS(\^äA@D(&5є ZR$OLHTqU#y^nz[P1P4iߛ4Ӗ.M_Kd Dy/]GQ6@D|p8t@yOqh^7_?~i 󍫔yp'_ŋpp] 5ZJ+O|>ŵ}x9jh{<^s)R '5\?եWk=4w%dbe Ų HajEn9MD 2;|B¡hW !&pmTK"5AHUӨȄP9MbF"5k>$tšwmAo{ΊK=v26K[Ÿfi,k餚SgW&/]R^v?㦃Tznw_XScI'ÿ_?a r5>LO.oK/6U. tW{ԗtϚg 2$rpi•wq #܇BR#?˔h0ƺwQ9鑗sr"5w1+q0%^b)3Wk8gۥ0~@w^~\6.ݪBoԔ")=Z@غ1CC?䤪$T [iUBWJS$ILD)ꈹWI]Y@ZœD<9+6=8f!II<ߤ/oM'9ݟC~LiX]{|_|ptiQ7~w_:I^^z `5X{/}o_ym(1 ^S/})% iȲ&Aئn6_} ,x^~d|z '=y!]ɱҳI8pusQ-!G7BȲ B-y9f"@i/(Hmc=!.Zuyт_?׭hi'7c—0';Oá'./yN H뚿팺ZtE@ )!QqwĐiԸzS!T+ܩ%QDEDW>E:9t^y9fiULǧcC 1l-a:~N!Yrw~}wnpOՕo|յ:R#)bLkWܟ>wnʘY]^oJӥ:Pq> Q} !zJ[\d} \}g_\ʕVAGeY $w5S_7 )вii5 $GG7&E)ya.š6A EBn#o6箺-W (< ȳW^|^ܱv]4;Y "`ˑSP4:`e_:>z{yar{+39zػQiTIWy.š3%+u^l2q>'s^-@e8g4*审ˏaroWܡXX9cW\:%xFsHZz.11.Ց2* T01fr@]myIT UW Q@$yJR ^yl3CpK'BiHfaTYy?|!8`7ڏ'x+n}ޓ2ƂpQ-9:J{?>G^tEH@LaϿkn<Գ9VM jPCBY-ǎOܵH(#yZLX=ST%fqe*A`;CYQ@R)LXtscz"] f":/v] v8'gwZ(<'K6vDZT^ө,1+䦷k+s|#d)AxMTHII2*1.̒jr*1RU) G+ ҝKN"fFII d.ONɷM[t[/ѯ7kWHs('7)L?_2WwW޽oG7AgOQU夵 __K}!tdv"g]w^z/_֏N=h[u%Ja rsx\Y.;(W$BA9STtj,%Q;TIM)։$$&.* uAQq, E3.dK'[@7]#[ͧK:~4`Ku@:r~>_K5o֫{_G^W~Q?]}cW}:)n5W~W> >-dLP7ѡRar{潗q C=]µtfO39=Bjk$#SL@-+_`(ZN`#H{48 2E܆k+:.2a.Z|r6< j^:5=`S@pѝ{).(M޷/-.dJUtjI\J* FUB%E&TDq~\%K"D xZan gØ2R99rxխaڟeCz_Ը'`^}?E/kz컿,˷xSp\ysѧuB*wx_go?YTmW_%sC]bz?xw) wtX+i}rBeJ̼XX"3fc ՙws+{Gt\ܮSP."SQvqsrb sgPݴ@Ry#Wwm?E]Gڳҋp.,Od:.bu|G_{-랙*AB" &!]T@V(j~mg6 VpK'7"{N XtWoK㛡x;UgWe/c[>3 =G}Tpt3R—^~=_u^VʜQH%YHS 1+Cg2su䌘R{zOf^GA, =  E>wut"` USe;m"\z q?qcݜ!i^^p'Z9m7LM66)$e 2QIH]\5 "+$@$%WqARBLptPuj‚ /G%!KWa =6 x/KQ1Ӭ$du6M{ʷcp X={Gt)o^>p|'7~)/[~_x/q=@O_]ڗ?DCDum\Q'Br[W{Wէ_˯e!yV5@)F(93'颶fBޣMqL]Č=Sϯ LH w=z=RO~>J“j l/;-dy?`; t~rp:r'Õ4W&5}EC8r@Ɛf 8޷dY6wV!L &q%$Z **1Q*`̥t*%V)DD>9~g@5z:p}5yssSN^Z{/#yrLR'>x!{#{v[Oy\to|I?zi#^b1x W|{_М{rOgGdЙ U w$˪NVdž)' `olN )^FގXq)In@oYa)=X-U,\܃n;|;ߞ;z)NŹ=`i'U-A{`wT“q$U, b*TXWIx/bTJMRIQH ]tBZԅ~gg8#_;֚7y57+_X-wݒÖ pk@Җ?a -pk}, p|nux*8<7,~rQⰧf}2 ׻o0w!$l$7c=8]*F^6}=[34C"A,b:/DVyaBR=[2K}.w=[,p{Jk[p w|[–A;,/?ָF&NY/R[H̦wUGLR8_@tNea%. .JJ6 tH*F }0o[8NszŎ,o߾=os㩺奦=?E _^)~}^Gyn10SfQg<txҠNk xe.bap{=4gIT{4A N,Hj'uHppww.\.\Q%ih&ۖ{; c%?nx>saw$7w}j t1e:Ký,?.0x,:xR}рhrI>ԧ~?[qucàH)Q d,ıSiAoew~8m@gSz)o xSpw#B AY]<3A 7A81h|蕊 xMٝ[2wrwãMn+VY/E0+S@JT7'2, BIL+B9D$@\)"KGՐ674;< ޙwڗ{%~. sF.#n?qppA,'FOB )U=Xb HGKDrB]) 2*\z/I4na#)؝ i |akHs[NΎm՛xlW|,K [ >H`fz}x>xX==g6+93ů}ׯ;AcrLf:sZ&GՙrC[k2d(=x!tW1CLYɖ] B p2k@zc]8Y@%t9_*L2G(Zq߸OL:<\3AChFYNn@ܡu`=bj0)ܫI#읩rNJ-yN) Z/ 袱;K,@ΆH,No <{|\Jwv6z5,i`shN~K9`DmY;+`}8zֱ-W~X#@/~+4cՙOGlKiw>S=8-w椓bN8XG sɳut49I3UWgIE[gi!MtHd(h߆ Xr%\G8x11>1Uqǟ? ^5]j 9ryHCs9HZ,Dt')8>)uJ b)$>c7`_bcnm!3^]3XL\}ඵgR`l?\#^n0ͷ:BꊋsmN\™%ϗTpq/?7dTG]vxXH_*5\Iτ œPw b4@wQϽZυ#Q &\ԡP,{kgCRAdqu+:===8Y(S&*:h[orPE sX/TI85. 1m=PkKKNM!N\:R[ J1e>r.>]1g7l@dnēOu÷͢% h98-s20wdqcj)9Mr)&yVDw?➹I!t[娺T3x+Jr,BY&,^\d5/:w+ 3v;+Lxu7U:x.5}l2jt\dLEJ>o }Z*IB $~8Z~MAR1X Dr}m(f5b쵛-1 qno=Ch ]֥ ɼ."`XX U}!4x縜A !-<m!̳ruhӯCpy xM٣AN:=YHb;bPIT8,/F~9Ub1!38ħ*Pe?ԶVm>^_Ǹ57r!܇!&_lFaʟ%c.I%Hԭ幀'Pҕk ߫' rzﲋL-z s.grΖXS@sW[vŐ''jco|R nq8]no6y׫v"cf\׶hכ5\ڀCuw`_^; r! u6fQ骱*I*Lˀ͆2On[f~7p_b9.=zgM?e,\w6Bi2軳ϡwρ[^ֽem5bqYb>peAϮ]eAܩfbzur.9r/l- qit!D$Ir1sy7^4Ǔ:L™'^k8_o_0s*Ԗ@R\P=iMW%677-`;&n.?g4ƣ؞D+ca_J& i4Ogz} YBGsf8 ¥ˎ,dXEo(~A^AP^xoȩ0Gd-KY$4@9FT`"sTä|6VownEX^Ҁ05BdpC|.%'!N1K3=T<\@G1$seJ2$'$Xy oVT];78-!"O6v^ P\WAqNL|)bRiwU^֏ӵc."?S.CzWB,n; 2Óx`\oc4^}xAMUy >kQ(.cõ. JZ)[V'aΒu9-cU^hGT,y.L|`)7~VVr$UWow VW#- ecVKpٟ<oYSL.M=wX&"(LJr NVfUy1)aXw+}# $WAÜif9DՅDx22S#tqǜHh-ᤉXsnuJa8ynkjk)ưfNLIW0\^u'x0fh+ryS^`3/y< ͒R,zߌvA.}T>鱛o Ttp6W ঳,Mt$F%Ҡ&|uҩmwR,.#{tC#FM/455544lUǗO֜?B/=Z@s 8|'ߦ@%l/\I8ݽ [IMt^,>駛 XUfם% U)B&s % :Du% 2 )g^R0FďdSS^O'Y - xu(Ns&s5ATy :v09D-m՗8<=9x..Bmdc~2-%nc ACNnآY7:m5ۊ: ܥ+qd9 Vz$:_iwgeouM xMۗwO-Ndl kʖلCR5k"'H:t@9(cE={ +e>^]S^{[ Vj&tm.t\ d5u@W:>c|ǷK3$ܹN^3^ i8konkܴU&yY1qa&Nnq6B B};I#:z9j:Îg ?t]O MaKfâ\1;"ʤN! (ʞF  1.o_d^' lt•=p5g7 7u~4xs'""<qxrQS:($k}tYy?^tQ6&,M|H<p`{-9 uqx1i0qKPY޴}|>ܦy!4M ֐*cޫTzl#ݻsZdh)3P)CLbF9֓bھ01scwpFS^/(v,6Ý^D̼= pcA-H0?xyu~Gg/gO?or-PO>GΛdw7͞:.>|K6-\ٖӛ:{wgӜl Le >ON|:OtMÝzˇ}3t3[BpCy(synv͝6Wl,Ӧr6Ls0qW,{,6O:>L06Qb)~cȲ9Ɲ{t O7aqR#R1qb OƔU=% Mӽ =O?™Vg?$Onk 6`XÄwM,'U-{ФM$v6cGW WX9|^& ]-1G" zK!ð(cP4jK( O+V`ܒ% Ԁt&N2+̊YY.ϻ(t܁i-,0 G ɠPq9poWz6 Ά]=~`֖0Ɯ8›XM͝^ y~6pġMV-NbC>o;I.bw@b Y0wb %Q<;6w4/AӮ; ׋yf)r@(Ye xdvQ}m3A}yͭ52[ѣG>r ַ~.0|2f2O++1Ynn:!e::lc 8ن0ä r;uRҠH<\ZZ{퇟pF( '3~f~av’ǎH4O76wvaN w{), I72a~Mmz@A jΫrWoXo~ۇ1s_Qi9YaܜiW3Μ}t FKqv\pcAu#X ,6w? n xMp :,Csv`e =w%IԈKsR\\Ju#ixҊ zc|8nϊ7\MwzkNOo w6C~n;p˹/?P⑯i:9 8&HNo'KOsv/μߟ_>YXsxxox eʒ/t/̀~ĩ^GWk|pݓ1&Zalj0ܞi(ݮ`\Ix3wq߄mqvn}0EwFK07ʵRs[-s2՝C|EDUX+y7dICHVb!uS] KڜS/J6lϹTE IZ F e) ^$;0&㆝ c6B>nc>9ϱ 1 v㿘+fpOLi3Ur67n֘bT7uhLV).jiSއ4H65*z8qy^aXX V&M/xe"F^ȴ4ҝ޿vML]_0e.wy$ٗP>y5>5ΜoΙolZ2]:^ gbV|3\:ua2 &nxz0J%.:Qe(^WGgSȭ%(D _ACAC9Q`G7g21PX p^½.}?7BB1O^z#_7gn6y1w?2}i{||Colt|CN`Z~z7Q;aRvDB"4uz'4gN~’-Ԁ״bL*.K8lG0rf2Uh*QU! V@:hb [7p6)'}v> kN Xj fyN+!iCȳ/-wWF(nh2BlVer^Yg[Nz@IfFOe|4V5Sa+- j1icŦ8 -#myel?޶0E&|_n="42syREjf*2YQL*@7XF[cUa{kxyO'0hȸ=n~c6&i+󥯜&0[ lB7JN,{ MKt{r ) 4LA5X:.w76sܥ6o4OVypN YbPֱY~Ņ˵G-S7χdu><ި╓p|׻~Ϳp%ttC6NEMBD}37=6-X!@]7ɃÔNP1"j-1>'ϪnHN;ԪurW7Xض?je&N?Y?_0b9{HO5v<<Sb'Өj6(8(;ΠCKq)DH9 "& B!'n+o;d`i.b28ibj> ]'_~E1Bl8IΊZ+x0l>q֟Gp-~[rSseB3 $>CN1F, Ъ˚nEc7^yν6i8Zi'0p5'6]csZgҜ9\bS A1@ p7Q$q8JxG_+dX#>\ efe:`C,;?z[߽z$߾ѿїڣé6"lB<7\BdwnF& (.qWqBDi"0ATp&NR^4Y"/}E>sUe8Rk GR]7|aaG~7_0;[v_ß|Z~s_S7wtaIͭ9J͍p&H7-S#zX1DTCijBq),zub1Q1(G@/gO;>e'DB7+um ^G>EFw'0u9u(:SGj@i$ U:*U@RA(Qx{/<v(*|mqO!AH_B*Sy|z_ vwvޥ;N` p%d%\t[Ю̋pl{3 ṓn qeCuduS85‘5Z:e&sELHk %e hDs0}7t~%J<5ێpH\]V~怇-3ni;f;+aLRuwS w֌Kr^^(𶹸]w^XJCzKTRI{t&ԤKL. UQuQKB$ Ȯ;S+'Ջ8?e&"fn7uk]-nʝ~]}u$ \\ArrP'NO<^3OSO/GS{Y6 w@v7-7>X&4g`w3K@'%##&ܨ.&D,ͻq ifdxEz5KgҧwY- ckMww%9 kkkyp2C+@E[2qj@#G3!44H'GbɤsKaI!˴ r~owWa"nsԀtA\($>4O^D8)Bp(HN'E"=/<#FINBSrDhtq&pPJ,IH!"aRBBPSA*O@C8v~GH"F{`|4/㷍.(БJ+T Å"p1:D "$B;qW%e϶01j"ngv`^'ÜLp|hJSpw dM xMr{šC1 up 5 !zKB[@RZE2t 3P~0e'BY0IKD&$.qeP8D%Q0EäF.,e`'p X #U38 0f;=&Ihu+D'$E b"蒌Pti@s+K\=eSq(+ FAvY; ːqMJ|\ 5 esvq~ xM0 6Ϛ9?q8-Yrv\RB}J\21X X&M t4O@1SԑJ. F$L@D FX)9rπAv:IjpH5:njm (0LgAi]m&'Θ{IӓL")MܬD IV{+CSG'<¾]Ú3[>`sxVA5p 8>JX.wE$A1Us@ģN)M1c3TOagZKW &BW6GU':;*@BDq XRwue CЅpxu%MawA@9Y@HR.%ҍ!x-xϦ#ϫ1/pkjjk9ovurllk9sp9g<9/o}1 =AO%U*@EXpu ((<4M0ZU%Zo0` J][p"X#&)QgTg1e8C k$!.:^NXQV L% Zwcv'p b󒋉gTqd4;4SLёKlB;uZA區vC BݼZ4oJ55}]Ya]\iS[po4 k_[p",&Qљ2`Ǝ6g5 0SCp8jAE¹rRm5i`ҀhD`@=+ r f* ..r9lz1u-m;!}rXrK3t,z1wv!g|,.`.k`wVA.\^5JFfatj &Y5.k{*b% BDFU$r(.4:9Tc[iprq-+yzn)硗)-&t zx|a N-MwG)!M5)5Wi gA :|. d$;]f*)zE,  h@ucOj 9FE;D8S2%r, F& ~J+ :98X(f?#׃1[2(cB8!>aHr=y]p6Wʇ&, <!,99jHJ3cjY^$J/OR ]ԽLW9DN!Jw}}%gnLgw5k\wv|ҪCEiJQ=lEQ3O )5c"R.WH-<]=i`.\DےN/`d@0Rq $>%VAK_n YJKBZ”HS,Tp+5f/PT,7bٵGwRL(h)N1*/KhSrF`&Ed+Y|vMX Sv ]9vՓ/$GA/\!EX=A*6b H.`=pe;c۸}s uAeE^P0 SKUE,Kh`"1b>HD'(@m #Ֆeh2DGve d"#^x|-µ1c{zi7Ű2.q!qbi#{ĕ,}X)VY-T wwP N׃_s3ϺXנƬE-XƊ`UJSVFXй#.ڕ>2uRE݈C\Fe$!/ 3*4$L ܔ`. \0r*0nQ615J,_ju{ֺ>n["!TlFj(HLl ;ŭX* RRCpBcn#9®Bp[wpog캽cotl9Mݹt^E  N) ]; aͽc`5"1 yzGFܖĺṆ3nQ\, : 4X+?ʄRBcF r04efY2ŵd2C7-ˑz w\–ՄJY <5ɑMލ-/~rCr~;ƞLC'!`n_5 65}BxۖϻJҗ'h.k:uscL\0B||!N&ÂTKR( kϥ璃$XxqzI}u!7(!Maz*8%ҲPYTlt1B̕H(n/=QN 0HDbTvf5<`%/RG29rE!̼[aHeœ?/-|™i'E.gtS^Ȏe߿{YK@ \_(~Zk['ȝƘ0<)'u24{5i)p\\ Hni"([,s](syrr>(0pn?]~u]b&f3=/&-s~p`;n_]vqҪ.^Ϯ;]=w6a"X)@=`;KAG+ 2@O|4\^^`4Wǵ0ENMXGD-(^q(`EVhPc4ܟ R+A"+]eO)PJρUuq,r{+[-}wa|@4͇^NS^ӹ0H!Ewzs mVpP.t=z)a)d(ֈp'Iec|j2.F0ˀdtJ]qn){+MQcyxZ"֋s OXwd_քEQP4oy8f)Bh߽tj58-y^ L`S^sy;?@4owxnott]XEMYrLb˹u mqPX3vN CȳP p4:@L@a(`Qi[nRu:/%_) :+xNnJSpphbL@G9BLΙ?l㜠@؀ vyv{ SLd!+M`o86cr4.PathbϋaȌ".*HHM-W7a5T)JC2,f\^/|^@ɼ9.ujYT'NЇbܬ< hAܮy6/4hgpViw\8_8 \n="Cnnc Gca V{qzƢEÒ_bpzWx:j/U\}}*jK\}-7V?nc.9[/F uNNeDX{'VwNyE( fp^gs ,mFv'–SŦ183s=AVGny4[QܢP`ccC weI+D.|y1:B:1cA0DOX/1 VaJ 8 ǒ!HވE`+6`Ì넛Év)jlj9U wiS8.Novw{7F|.x<^/\p|륔dUg G.0O"?(eXU0 qfnh3ͧή:l2kq 2=[sy]S/p|Wݗ>8 nƣcr^x<: 't{9zx l//<4+D לrj7 WOf#57v_.zC}۵n:!qыTa׀׀ ^|wvyzgGmse]u}q1No?y|aۖx`UU \u}ԵQeh_XA6}MA7]=nT`pvsh;q ;"]^^/8>F=<}&;Wu^uzv^6^@d^u{)ϊ[* d;[ WW[/8cKno;}nm!L8:!6ݭ+Fy<OZJθ2Hz~q98eSNbBr*`Xp(C-W^^ et|jĞOVӗkNF`i#+X{`{LӼ`OA)jwzUSg.GF96O<*ˇ >!o'N<pkSww/+{IlC8V3W^-Bqҹ-–9"^? MdFՔGǧZyt}y3y{Oox~B. xM?wv'r䫺;{ixD*ipa|8q]O`qNÝG0n' WY/7×sUj!duk5nUW6a5?.~&a׀׀ =}s NBݽN43ݻSONrMJ` a.y½ Oq6?ˣ;: sgw)>ƭy998~60nuw(B6屭`9?||]^^z]]_>]MW7cN4tkkkv}åzsmsl=v|m)ke n}מ9m Cnso|N}lZe9wS{]^^/> ;yΟǷ$\N }eVs\8ܻ[pp+(VA77<\o=E^zE$~wQ]r?|IuyU<+o9 nslM]~Ol?~趹~a@׀׀7ݯtj/r&4mN&-<9MC)?|"'fc4555ԡws!,_9?9s<^<<ѣgO6sq ~`0xos~>}/ xruR?y[avv?.a׀׀ E+}iU?>N3s}_{uP}j_\= k\߮vEa&?n xM x x`{:9 /\.o='tykϠZ^S^'~}6o)W.9~|)8 xM} >$"IھMMMMM xMMMMMM xMMMMMM xMMMMMM xMMMMMM xMMMMMM xMMMMMM xMMMMMM xMMMMM xMMMMMM xMMMMMMjãkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjkjjjjjjkjjjjjjkjjjjjjkjjjjjG}mIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_version.png0000644000076500000000000000372412665102054022301 0ustar devwheel00000000000000PNG  IHDRjtEXtSoftwareAdobe ImageReadyqe<vIDATxݿe%9 'j? Ec &XYDARHc!" vX+t H!P lMxaݻ+c|ggfGMnvco x x x x x x x x x x x x x x x x x x-3oVukqVm)z.pne(ӬfӲ&vzg_YvoI~<LnVr> j[9mXn˫%o?u%_缗r6˟M.Kvr›GH^y}Bg+_YmMg~̻eLp Eo>]'̗e;&<`[ښ̮{wRќ͉,_Lx`b7,y'jb]?eq/MCFom_^ȡY탦+O]T>54\~)݉s4g+_g=PI%wgqiS&<`@[Uص̇_?϶\G673*z`aѧۈ7Y(l0XΡ=Y2X^`K@_F,ZK+M~LU#V-7ahm]sfֆUYuVqߜ)}%X(6G0O%bSX]@+<;kAUۯ4'IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/tab_hilite@2x.png0000644000076500000000000000142612665102054021715 0ustar devwheel00000000000000PNG  IHDRFtEXtSoftwareAdobe ImageReadyqe<PLTE777444666555333888IDATxے D卉MV( }vwSsah 5BQ7ˣ?bLat#a^3cWM߰sYRSУwwk)hP3՘P9VДϳjײ4-]z;+VY q~UYZNU/Λ@Cna -)DUG :s),%U>ԟTWƴwRB*'U-$U-#GIeMRT| hOT&FɥHeSI{)y9tTf]͡k2*T~].}:tT.Vd,(ՂeTL#?KSF~+i*nMo_i|[圢w}_C6) SA@W2åбc=A@#4 Ah#=a>f lJ0<)|.s 0G:C2̱# s4l\`.8WK[58g3~a0#o!BX&g3:ƌs  Q )q %+I05:F#pU85H#Oс8 JJ2gkP>:By?k?!Wj&3%.X-OIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/tab_selected.png0000644000076500000000000000164512665102054021660 0ustar devwheel00000000000000PNG  IHDRTH_"PLTE""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""pPMtRNS0f괓]$o{ l r9BҺ*!LzfUDM8<0YṊ ЭwoWg&@M)z>kGd.QhW&6K u.]h譖 ZY9}% Hr@{h&`u3;M Y _ӜW=.:9hxulz$/KDlH2dƢHݙ4_1=5# W_Q%NӼeuh2?4dNgv瞎G4JVLR(թWT|0H$=Ց&Q^S[d%Ϋȫ0oG( @ArFB2~fPkt޹7:Y'YjeU$l)k՘c[km]OG,A |LW* ~{"ᒽaIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/tab_selected@2x.png0000644000076500000000000000502012665102054022221 0ustar devwheel00000000000000PNG  IHDRb ttEXtSoftwareAdobe ImageReadyqe< IDATxUO.J A ia((S˔JV PR IQESIIQ$I$(I-H Ң$, B$u_Λ7?~sϹsWLmJf 1q.!Q2WJz#)xƩW]Kվl5cީ6["UQH\ጸRgVMq>hxWTH5oԮ/Ovŧ> {IP.G<%Xtj4)>+ZsVa1^_/}+-1ǒe(}̈?} #x|*o7)4EY *ݵs$-J*YHr4"n'KoQX@s%c\Nز񳰶2}N/P$u8e~)nKH-G̓U}$ r,_`r?'!#j!@`u笅Š8$&(t^;JXT+yPT+brDYj)NIISO$Òqk)&Ё,<(/piee!е[Xo@$ E!g9v-{> JIkx @-VxtCؕdҨ]Dq ёTK9$cPl)TKE%:Ќ@'XIH Y<:wnM'hLZ31\W9^ޕ1rƱ".NH AVȃriMÞ_(wmAs(qfs Be(wW U(qm qv>:ޟ-&AxP)B#&3 8Q8e8xxK ;ՎC91̴@# = S^ @8&!6KJ\%Gi q$1zdž8ROR0%.ALJI)Plj~!q)d#qzcErfޱ~ lIQS;؎y=_8n$P޹FbրD+8v$^mFkQ~ű#sD3.<ȋ*fH7"y!$]]8$PBaI֤z7RSK<8 ฒxDZ\_'m u^N#iVюϑ|'ɵ6I ,` ѬfFKNy.ZRZ8Zw9ޤ >v,'Mq'1ylK`+ǝeQ~SviruY=y,> Β?ʌs %cyP0,l^+=%q<(@ɯCH-z=Deii=s͜򁚾> K$vIC/C+NĜ'|8IRm„cnz~&IQ jsx*MGx$'͡.6_\{gRTI?5簔Th߮fc(hو|+w K_(AMp$Ak}jyMȶVO;F<\Fw8'-Y ͍vu^M <G2?$5DjfW`[χo쾼Mmo-mӽZ!se_Y6ȣc%6EE`aЬ*yf-KYeg qd 8JIOn^|3 aHm}^kۥī*y 4kFwwIpdJ ^sCGX$,Aปd^A(>g$8uȧ2S%,K "*>8 w*NWCFɨKgq&6-Ƶ e \^isKp?B ê\[v8đj+*r]PڛU}hNYZ;%㶆h.jkr72o ;FI!(YgoIzڼ.FT[d^B@O gw{( NoITlOƯEO+j17m.w dѓ{ϙ' 4!SV\"ԬIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/theme-info.txt0000644000076500000000000000104212665102054021317 0ustar devwheel00000000000000Theme files =========== This is the default (and only) theme. Copyright information --------------------- This theme uses some icons from various 3rd party authors licensed under GPL. See sources, misc/debian.copyright for extended copyright information. Audio credits ------------- CC0 audio files from freesound.org have been used to create some of the sound effects. These are: intro_new.wav: pulse3D.wav by Sclolex, space_string.wav by fons engine_hum_loop.wav: EnginesTurbinesOne.wav by pushkin Audio processing was done in Audacity. DisplayCAL-3.5.0.0/DisplayCAL/theme/x-2px-12x12-999.png0000644000076500000000000000036013013112273021304 0ustar devwheel00000000000000PNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<IDATxڔP Tq7/7pd7p7p'\i$Q m Ssn༉8oL))fNthR1 AYkp ")a86ku@A`&K{> gljv9խXD: yq`coՃIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/x-2px-12x12-999@2x.png0000644000076500000000000000175613013112273021670 0ustar devwheel00000000000000PNG  IHDRש pHYs   cHRMz%u0`:o_FPLTEfff  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~YtRNS AYIDATxڬ1 ;3X2\H' )CĶ R <2Ia$Qt6#x=hZ6n`mog*8+'IENDB`DisplayCAL-3.5.0.0/DisplayCAL/ti1/0000755000076500000000000000000013242313606016120 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/DisplayCAL/ti1/ccxx.ti10000644000076500000000000000115412665102034017504 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1 for creating .ti3 for ccxxmake" ORIGINATOR "Argyll targen" CREATED "Thu Apr 19 13:24:37 2012" KEYWORD "APPROX_WHITE_POINT" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 4 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.91 2 100.00 0.0000 0.0000 41.238 21.260 1.9306 3 0.0000 100.00 0.0000 35.757 71.520 11.921 4 0.0000 0.0000 100.00 18.050 7.2205 95.055 END_DATA DisplayCAL-3.5.0.0/DisplayCAL/ti1/d3-e4-s17-g52-m17-b0-f0.ti10000644000076500000000000072220213154615407021575 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" CREATED "Thu Aug 31 12:34:40 2017" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB" WHITE_COLOR_PATCHES "4" BLACK_COLOR_PATCHES "4" SINGLE_DIM_STEPS "17" COMP_GREY_STEPS "52" MULTI_DIM_STEPS "17" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 4954 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 93.750 100.00 100.00 89.540 97.130 108.58 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 6.2500 0.0000 0.0000 1.2105 1.1085 1.0099 10 12.500 0.0000 0.0000 1.5859 1.3021 1.0275 11 18.750 0.0000 0.0000 2.1981 1.6177 1.0561 12 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 13 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 14 37.500 0.0000 0.0000 5.7370 3.4424 1.2220 15 43.750 0.0000 0.0000 7.5607 4.3827 1.3074 16 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 17 56.250 0.0000 0.0000 12.290 6.8213 1.5290 18 62.500 0.0000 0.0000 15.230 8.3369 1.6668 19 68.750 0.0000 0.0000 18.573 10.061 1.8234 20 75.000 0.0000 0.0000 22.335 12.000 1.9997 21 81.250 0.0000 0.0000 26.528 14.162 2.1962 22 87.500 0.0000 0.0000 31.167 16.554 2.4136 23 93.750 0.0000 0.0000 36.264 19.182 2.6524 24 93.750 0.0000 6.2500 36.356 19.219 3.1377 25 100.00 18.750 0.0000 42.869 24.130 3.2595 26 100.00 18.750 6.2500 42.961 24.167 3.7448 27 0.0000 6.2500 0.0000 1.1825 1.3650 1.0608 28 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 29 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 30 0.0000 37.500 0.0000 5.1076 9.2140 2.3692 31 0.0000 50.000 6.2500 8.6703 16.191 4.0114 32 0.0000 50.000 0.0000 8.5782 16.154 3.5261 33 0.0000 56.250 0.0000 10.790 20.578 4.2634 34 0.0000 62.500 0.0000 13.339 25.675 5.1131 35 0.0000 68.750 0.0000 16.238 31.472 6.0794 36 0.0000 75.000 0.0000 19.500 37.995 7.1667 37 0.0000 81.250 0.0000 23.136 45.267 8.3789 38 100.00 81.250 0.0000 63.967 66.319 10.292 39 100.00 87.500 0.0000 67.989 74.363 11.633 40 100.00 93.750 0.0000 72.409 83.200 13.106 41 100.00 100.00 0.0000 77.235 92.853 14.715 42 0.0000 0.0000 12.500 1.2564 1.1026 2.3507 43 0.0000 0.0000 18.750 1.5244 1.2097 3.7620 44 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 45 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 46 0.0000 0.0000 37.500 3.0733 1.8292 11.920 47 0.0000 0.0000 43.750 3.8716 2.1484 16.125 48 0.0000 0.0000 50.000 4.8252 2.5298 21.147 49 0.0000 0.0000 56.250 5.9417 2.9764 27.028 50 0.0000 0.0000 62.500 7.2283 3.4909 33.805 51 0.0000 0.0000 68.750 8.6916 4.0762 41.512 52 0.0000 0.0000 75.000 10.338 4.7346 50.184 53 0.0000 0.0000 81.250 12.174 5.4687 59.852 54 0.0000 0.0000 87.500 14.204 6.2808 70.547 55 0.0000 0.0000 93.750 16.435 7.1729 82.296 56 0.0000 0.0000 100.00 18.871 8.1473 95.129 57 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 58 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 59 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 60 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 61 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 62 11.765 11.765 11.765 2.2218 2.2853 2.4001 63 13.726 13.726 13.726 2.5817 2.6639 2.8126 64 15.686 15.686 15.686 2.9968 3.1007 3.2883 65 17.647 17.647 17.647 3.4695 3.5979 3.8300 66 19.608 19.608 19.608 4.0016 4.1577 4.4398 67 21.569 21.569 21.569 4.5953 4.7822 5.1201 68 23.529 23.529 23.529 5.2523 5.4734 5.8731 69 25.490 25.490 25.490 5.9745 6.2332 6.7007 70 27.451 27.451 27.451 6.7637 7.0634 7.6050 71 29.412 29.412 29.412 7.6213 7.9656 8.5879 72 31.373 31.373 31.373 8.5492 8.9418 9.6512 73 33.333 33.333 33.333 9.5488 9.9933 10.797 74 35.294 35.294 35.294 10.622 11.122 12.026 75 37.255 37.255 37.255 11.769 12.329 13.341 76 39.216 39.216 39.216 12.993 13.616 14.743 77 41.176 41.176 41.176 14.294 14.985 16.234 78 43.137 43.137 43.137 15.674 16.437 17.816 79 45.098 45.098 45.098 17.134 17.973 19.489 80 47.059 47.059 47.059 18.675 19.594 21.255 81 49.020 49.020 49.020 20.299 21.303 23.117 82 50.980 50.980 50.980 22.007 23.100 25.074 83 52.941 52.941 52.941 23.800 24.986 27.129 84 54.902 54.902 54.902 25.679 26.963 29.282 85 56.863 56.863 56.863 27.646 29.032 31.536 86 58.824 58.824 58.824 29.701 31.194 33.891 87 60.784 60.784 60.784 31.846 33.450 36.349 88 62.745 62.745 62.745 34.081 35.802 38.911 89 64.706 64.706 64.706 36.409 38.250 41.578 90 66.667 66.667 66.667 38.829 40.796 44.351 91 68.627 68.627 68.627 41.343 43.440 47.232 92 70.588 70.588 70.588 43.951 46.185 50.221 93 72.549 72.549 72.549 46.656 49.030 53.321 94 74.510 74.510 74.510 49.457 51.977 56.531 95 76.471 76.471 76.471 52.356 55.027 59.853 96 78.431 78.431 78.431 55.354 58.180 63.289 97 80.392 80.392 80.392 58.452 61.439 66.838 98 82.353 82.353 82.353 61.650 64.803 70.503 99 84.314 84.314 84.314 64.949 68.275 74.285 100 86.275 86.275 86.275 68.351 71.854 78.183 101 88.235 88.235 88.235 71.857 75.541 82.200 102 90.196 90.196 90.196 75.466 79.338 86.337 103 92.157 92.157 92.157 79.181 83.246 90.594 104 94.118 94.118 94.118 83.001 87.265 94.972 105 96.078 96.078 96.078 86.929 91.397 99.472 106 98.039 98.039 98.039 90.963 95.641 104.10 107 6.2500 6.2500 0.0000 1.3930 1.4736 1.0707 108 12.500 6.2500 0.0000 1.7684 1.6671 1.0883 109 18.750 6.2500 0.0000 2.3806 1.9828 1.1170 110 25.000 6.2500 0.0000 3.2598 2.4361 1.1582 111 31.250 6.2500 0.0000 4.4319 3.0404 1.2131 112 37.500 6.2500 0.0000 5.9195 3.8074 1.2828 113 43.750 6.2500 0.0000 7.7432 4.7477 1.3683 114 50.000 6.2500 0.0000 9.9219 5.8711 1.4704 115 56.250 6.2500 0.0000 12.473 7.1863 1.5899 116 62.500 6.2500 0.0000 15.412 8.7019 1.7276 117 68.750 6.2500 0.0000 18.756 10.426 1.8843 118 75.000 6.2500 0.0000 22.517 12.365 2.0606 119 81.250 6.2500 0.0000 26.711 14.527 2.2571 120 87.500 6.2500 0.0000 31.350 16.919 2.4744 121 93.750 6.2500 0.0000 36.446 19.547 2.7132 122 100.00 6.2500 0.0000 42.013 22.417 2.9741 123 6.2500 12.500 0.0000 1.7186 2.1245 1.1792 124 12.500 12.500 0.0000 2.0940 2.3181 1.1968 125 18.750 12.500 0.0000 2.7061 2.6337 1.2255 126 25.000 12.500 0.0000 3.5853 3.0870 1.2667 127 31.250 12.500 0.0000 4.7574 3.6913 1.3216 128 37.500 12.500 0.0000 6.2450 4.4584 1.3913 129 43.750 12.500 0.0000 8.0688 5.3987 1.4768 130 50.000 12.500 0.0000 10.247 6.5220 1.5789 131 56.250 12.500 0.0000 12.798 7.8373 1.6984 132 62.500 12.500 0.0000 15.738 9.3529 1.8361 133 68.750 12.500 0.0000 19.081 11.077 1.9928 134 75.000 12.500 0.0000 22.843 13.016 2.1691 135 81.250 12.500 0.0000 27.036 15.178 2.3656 136 87.500 12.500 0.0000 31.675 17.570 2.5829 137 93.750 12.500 0.0000 36.772 20.198 2.8218 138 100.00 12.500 0.0000 42.338 23.068 3.0826 139 100.00 12.500 6.2500 42.430 23.105 3.5679 140 12.500 18.750 0.0000 2.6248 3.3796 1.3738 141 18.750 18.750 0.0000 3.2370 3.6952 1.4024 142 25.000 18.750 0.0000 4.1162 4.1485 1.4436 143 31.250 18.750 0.0000 5.2882 4.7528 1.4986 144 37.500 18.750 0.0000 6.7758 5.5199 1.5683 145 43.750 18.750 0.0000 8.5996 6.4602 1.6537 146 50.000 18.750 0.0000 10.778 7.5835 1.7558 147 56.250 18.750 0.0000 13.329 8.8988 1.8753 148 62.500 18.750 0.0000 16.269 10.414 2.0131 149 68.750 18.750 0.0000 19.612 12.138 2.1697 150 75.000 18.750 0.0000 23.374 14.078 2.3460 151 81.250 18.750 0.0000 27.567 16.240 2.5425 152 87.500 18.750 0.0000 32.206 18.632 2.7599 153 87.500 18.750 6.2500 32.298 18.669 3.2452 154 6.2500 18.750 0.0000 2.2494 3.1860 1.3562 155 6.2500 25.000 0.0000 3.0118 4.7106 1.6103 156 12.500 25.000 0.0000 3.3872 4.9041 1.6279 157 18.750 25.000 0.0000 3.9994 5.2198 1.6566 158 25.000 25.000 0.0000 4.8786 5.6731 1.6978 159 31.250 25.000 0.0000 6.0506 6.2774 1.7527 160 37.500 25.000 0.0000 7.5382 7.0444 1.8224 161 43.750 25.000 0.0000 9.3620 7.9848 1.9079 162 50.000 25.000 0.0000 11.541 9.1081 2.0099 163 56.250 25.000 0.0000 14.092 10.423 2.1295 164 62.500 25.000 0.0000 17.031 11.939 2.2672 165 68.750 25.000 0.0000 20.374 13.663 2.4239 166 75.000 25.000 0.0000 24.136 15.602 2.6001 167 81.250 25.000 0.0000 28.330 17.765 2.7966 168 87.500 25.000 0.0000 32.968 20.156 3.0140 169 93.750 25.000 0.0000 38.065 22.784 3.2528 170 93.750 25.000 6.2500 38.157 22.821 3.7381 171 6.2500 31.250 0.0000 4.0281 6.7429 1.9491 172 12.500 31.250 0.0000 4.4035 6.9365 1.9667 173 18.750 31.250 0.0000 5.0157 7.2521 1.9953 174 25.000 31.250 0.0000 5.8949 7.7055 2.0365 175 31.250 31.250 0.0000 7.0669 8.3098 2.0915 176 37.500 31.250 0.0000 8.5546 9.0768 2.1612 177 43.750 31.250 0.0000 10.378 10.017 2.2466 178 50.000 31.250 0.0000 12.557 11.140 2.3487 179 56.250 31.250 0.0000 15.108 12.456 2.4682 180 62.500 31.250 0.0000 18.047 13.971 2.6060 181 68.750 31.250 0.0000 21.391 15.695 2.7626 182 75.000 31.250 0.0000 25.152 17.635 2.9389 183 81.250 31.250 0.0000 29.346 19.797 3.1354 184 87.500 31.250 0.0000 33.985 22.189 3.3528 185 93.750 31.250 0.0000 39.081 24.817 3.5916 186 93.750 31.250 6.2500 39.173 24.853 4.0769 187 6.2500 37.500 0.0000 5.3181 9.3225 2.3791 188 12.500 37.500 0.0000 5.6935 9.5161 2.3967 189 18.750 37.500 0.0000 6.3056 9.8317 2.4253 190 25.000 37.500 0.0000 7.1849 10.285 2.4665 191 31.250 37.500 0.0000 8.3569 10.889 2.5215 192 37.500 37.500 0.0000 9.8445 11.656 2.5912 193 43.750 37.500 0.0000 11.668 12.597 2.6766 194 50.000 37.500 0.0000 13.847 13.720 2.7787 195 56.250 37.500 0.0000 16.398 15.035 2.8982 196 62.500 37.500 0.0000 19.337 16.551 3.0360 197 68.750 37.500 0.0000 22.681 18.275 3.1926 198 75.000 37.500 0.0000 26.442 20.214 3.3689 199 81.250 37.500 0.0000 30.636 22.376 3.5654 200 87.500 37.500 0.0000 35.275 24.768 3.7828 201 87.500 37.500 6.2500 35.367 24.805 4.2681 202 0.0000 43.750 0.0000 6.6890 12.376 2.8963 203 6.2500 43.750 0.0000 6.8995 12.485 2.9062 204 12.500 43.750 0.0000 7.2749 12.679 2.9238 205 18.750 43.750 0.0000 7.8871 12.994 2.9525 206 25.000 43.750 0.0000 8.7663 13.447 2.9937 207 31.250 43.750 0.0000 9.9383 14.052 3.0486 208 37.500 43.750 0.0000 11.426 14.819 3.1183 209 43.750 43.750 0.0000 13.250 15.759 3.2038 210 50.000 43.750 0.0000 15.428 16.882 3.3059 211 56.250 43.750 0.0000 17.979 18.198 3.4254 212 62.500 43.750 0.0000 20.919 19.713 3.5631 213 68.750 43.750 0.0000 24.262 21.437 3.7198 214 75.000 43.750 0.0000 28.024 23.377 3.8961 215 81.250 43.750 0.0000 32.217 25.539 4.0926 216 87.500 43.750 0.0000 36.856 27.931 4.3099 217 93.750 43.750 0.0000 41.953 30.559 4.5487 218 93.750 43.750 6.2500 42.045 30.595 5.0340 219 6.2500 50.000 0.0000 8.7887 16.263 3.5359 220 12.500 50.000 0.0000 9.1641 16.456 3.5535 221 18.750 50.000 0.0000 9.7762 16.772 3.5822 222 25.000 50.000 0.0000 10.655 17.225 3.6234 223 31.250 50.000 0.0000 11.827 17.830 3.6783 224 37.500 50.000 0.0000 13.315 18.597 3.7480 225 43.750 50.000 0.0000 15.139 19.537 3.8335 226 50.000 50.000 0.0000 17.318 20.660 3.9356 227 56.250 50.000 0.0000 19.868 21.976 4.0551 228 62.500 50.000 0.0000 22.808 23.491 4.1929 229 68.750 50.000 0.0000 26.151 25.215 4.3495 230 75.000 50.000 0.0000 29.913 27.154 4.5258 231 81.250 50.000 0.0000 34.106 29.317 4.7223 232 87.500 50.000 0.0000 38.745 31.709 4.9397 233 93.750 50.000 0.0000 43.842 34.336 5.1785 234 100.00 50.000 0.0000 49.408 37.206 5.4393 235 6.2500 56.250 0.0000 11.001 20.686 4.2733 236 12.500 56.250 0.0000 11.376 20.880 4.2909 237 18.750 56.250 0.0000 11.988 21.195 4.3196 238 25.000 56.250 0.0000 12.867 21.649 4.3608 239 31.250 56.250 0.0000 14.039 22.253 4.4157 240 37.500 56.250 0.0000 15.527 23.020 4.4854 241 43.750 56.250 0.0000 17.351 23.960 4.5708 242 50.000 56.250 0.0000 19.529 25.084 4.6729 243 56.250 56.250 0.0000 22.080 26.399 4.7925 244 62.500 56.250 0.0000 25.020 27.914 4.9302 245 68.750 56.250 0.0000 28.363 29.638 5.0869 246 75.000 56.250 0.0000 32.125 31.578 5.2631 247 81.250 56.250 0.0000 36.318 33.740 5.4596 248 87.500 56.250 0.0000 40.957 36.132 5.6770 249 93.750 56.250 0.0000 46.054 38.760 5.9158 250 100.00 56.250 0.0000 51.620 41.630 6.1766 251 6.2500 62.500 0.0000 13.550 25.783 5.1229 252 12.500 62.500 0.0000 13.925 25.977 5.1405 253 18.750 62.500 0.0000 14.537 26.292 5.1692 254 25.000 62.500 0.0000 15.416 26.746 5.2104 255 31.250 62.500 0.0000 16.588 27.350 5.2653 256 37.500 62.500 0.0000 18.076 28.117 5.3350 257 43.750 62.500 0.0000 19.900 29.057 5.4205 258 50.000 62.500 0.0000 22.078 30.181 5.5226 259 56.250 62.500 0.0000 24.629 31.496 5.6421 260 62.500 62.500 0.0000 27.569 33.012 5.7798 261 68.750 62.500 0.0000 30.912 34.735 5.9365 262 75.000 62.500 0.0000 34.674 36.675 6.1128 263 81.250 62.500 0.0000 38.867 38.837 6.3093 264 87.500 62.500 0.0000 43.506 41.229 6.5266 265 93.750 62.500 0.0000 48.603 43.857 6.7655 266 100.00 62.500 0.0000 54.169 46.727 7.0263 267 6.2500 68.750 0.0000 16.449 31.581 6.0893 268 12.500 68.750 0.0000 16.824 31.774 6.1069 269 18.750 68.750 0.0000 17.436 32.090 6.1356 270 25.000 68.750 0.0000 18.315 32.543 6.1768 271 31.250 68.750 0.0000 19.487 33.147 6.2317 272 37.500 68.750 0.0000 20.975 33.914 6.3014 273 43.750 68.750 0.0000 22.799 34.855 6.3869 274 50.000 68.750 0.0000 24.977 35.978 6.4889 275 56.250 68.750 0.0000 27.528 37.293 6.6085 276 62.500 68.750 0.0000 30.468 38.809 6.7462 277 68.750 68.750 0.0000 33.811 40.533 6.9029 278 75.000 68.750 0.0000 37.573 42.472 7.0791 279 81.250 68.750 0.0000 41.766 44.635 7.2756 280 87.500 68.750 0.0000 46.405 47.026 7.4930 281 93.750 68.750 0.0000 51.502 49.654 7.7318 282 100.00 68.750 0.0000 57.068 52.524 7.9927 283 6.2500 75.000 0.0000 19.710 38.103 7.1766 284 12.500 75.000 0.0000 20.086 38.297 7.1942 285 18.750 75.000 0.0000 20.698 38.613 7.2229 286 25.000 75.000 0.0000 21.577 39.066 7.2641 287 31.250 75.000 0.0000 22.749 39.670 7.3190 288 37.500 75.000 0.0000 24.237 40.437 7.3887 289 43.750 75.000 0.0000 26.061 41.378 7.4741 290 50.000 75.000 0.0000 28.239 42.501 7.5762 291 56.250 75.000 0.0000 30.790 43.816 7.6958 292 62.500 75.000 0.0000 33.730 45.332 7.8335 293 68.750 75.000 0.0000 37.073 47.056 7.9902 294 75.000 75.000 0.0000 40.835 48.995 8.1664 295 81.250 75.000 0.0000 45.028 51.157 8.3629 296 87.500 75.000 0.0000 49.667 53.549 8.5803 297 93.750 75.000 0.0000 54.764 56.177 8.8191 298 100.00 75.000 0.0000 60.330 59.047 9.0799 299 6.2500 81.250 0.0000 23.347 45.375 8.3887 300 12.500 81.250 0.0000 23.722 45.569 8.4063 301 18.750 81.250 0.0000 24.335 45.884 8.4350 302 25.000 81.250 0.0000 25.214 46.338 8.4762 303 31.250 81.250 0.0000 26.386 46.942 8.5311 304 37.500 81.250 0.0000 27.873 47.709 8.6008 305 43.750 81.250 0.0000 29.697 48.649 8.6863 306 50.000 81.250 0.0000 31.876 49.773 8.7884 307 56.250 81.250 0.0000 34.427 51.088 8.9079 308 62.500 81.250 0.0000 37.366 52.604 9.0457 309 68.750 81.250 0.0000 40.709 54.327 9.2023 310 75.000 81.250 0.0000 44.471 56.267 9.3786 311 81.250 81.250 0.0000 48.665 58.429 9.5751 312 87.500 81.250 0.0000 53.304 60.821 9.7925 313 93.750 81.250 0.0000 58.400 63.449 10.031 314 0.0000 87.500 0.0000 27.159 53.311 9.7197 315 6.2500 87.500 0.0000 27.369 53.419 9.7296 316 12.500 87.500 0.0000 27.745 53.613 9.7472 317 18.750 87.500 0.0000 28.357 53.928 9.7759 318 25.000 87.500 0.0000 29.236 54.382 9.8171 319 31.250 87.500 0.0000 30.408 54.986 9.8720 320 37.500 87.500 0.0000 31.896 55.753 9.9417 321 43.750 87.500 0.0000 33.720 56.693 10.027 322 50.000 87.500 0.0000 35.898 57.817 10.129 323 56.250 87.500 0.0000 38.449 59.132 10.249 324 62.500 87.500 0.0000 41.389 60.647 10.386 325 68.750 87.500 0.0000 44.732 62.371 10.543 326 75.000 87.500 0.0000 48.494 64.311 10.719 327 81.250 87.500 0.0000 52.687 66.473 10.916 328 87.500 87.500 0.0000 57.326 68.865 11.133 329 93.750 87.500 0.0000 62.423 71.493 11.372 330 0.0000 93.750 0.0000 31.578 62.148 11.193 331 6.2500 93.750 0.0000 31.789 62.257 11.203 332 12.500 93.750 0.0000 32.164 62.450 11.220 333 18.750 93.750 0.0000 32.776 62.766 11.249 334 25.000 93.750 0.0000 33.656 63.219 11.290 335 31.250 93.750 0.0000 34.828 63.824 11.345 336 37.500 93.750 0.0000 36.315 64.591 11.415 337 43.750 93.750 0.0000 38.139 65.531 11.500 338 50.000 93.750 0.0000 40.318 66.654 11.602 339 56.250 93.750 0.0000 42.869 67.970 11.722 340 62.500 93.750 0.0000 45.808 69.485 11.860 341 68.750 93.750 0.0000 49.151 71.209 12.016 342 75.000 93.750 0.0000 52.913 73.148 12.193 343 81.250 93.750 0.0000 57.107 75.311 12.389 344 87.500 93.750 0.0000 61.746 77.703 12.606 345 93.750 93.750 0.0000 66.842 80.330 12.845 346 0.0000 100.00 0.0000 36.405 71.801 12.802 347 6.2500 100.00 0.0000 36.616 71.909 12.812 348 12.500 100.00 0.0000 36.991 72.103 12.829 349 18.750 100.00 0.0000 37.603 72.418 12.858 350 25.000 100.00 0.0000 38.482 72.872 12.899 351 31.250 100.00 0.0000 39.655 73.476 12.954 352 37.500 100.00 0.0000 41.142 74.243 13.024 353 43.750 100.00 0.0000 42.966 75.183 13.109 354 50.000 100.00 0.0000 45.145 76.307 13.211 355 56.250 100.00 0.0000 47.695 77.622 13.331 356 62.500 100.00 0.0000 50.635 79.137 13.469 357 68.750 100.00 0.0000 53.978 80.861 13.625 358 75.000 100.00 0.0000 57.740 82.801 13.802 359 81.250 100.00 0.0000 61.934 84.963 13.998 360 87.500 100.00 0.0000 66.572 87.355 14.215 361 93.750 100.00 0.0000 71.669 89.983 14.454 362 0.0000 0.0000 6.2500 1.0921 1.0368 1.4853 363 6.2500 0.0000 6.2500 1.3026 1.1454 1.4952 364 12.500 0.0000 6.2500 1.6780 1.3389 1.5128 365 18.750 0.0000 6.2500 2.2902 1.6546 1.5414 366 25.000 0.0000 6.2500 3.1694 2.1079 1.5826 367 31.250 0.0000 6.2500 4.3415 2.7122 1.6376 368 37.500 0.0000 6.2500 5.8291 3.4792 1.7073 369 43.750 0.0000 6.2500 7.6528 4.4196 1.7927 370 50.000 0.0000 6.2500 9.8315 5.5429 1.8948 371 56.250 0.0000 6.2500 12.382 6.8581 2.0143 372 62.500 0.0000 6.2500 15.322 8.3737 2.1521 373 68.750 0.0000 6.2500 18.665 10.098 2.3087 374 75.000 0.0000 6.2500 22.427 12.037 2.4850 375 81.250 0.0000 6.2500 26.620 14.199 2.6815 376 87.500 0.0000 6.2500 31.259 16.591 2.8989 377 87.500 6.2500 6.2500 31.442 16.956 2.9597 378 93.750 6.2500 6.2500 36.538 19.584 3.1985 379 0.0000 6.2500 6.2500 1.2747 1.4019 1.5461 380 12.500 6.2500 6.2500 1.8606 1.7040 1.5736 381 18.750 6.2500 6.2500 2.4727 2.0196 1.6023 382 25.000 6.2500 6.2500 3.3520 2.4729 1.6435 383 31.250 6.2500 6.2500 4.5240 3.0772 1.6984 384 37.500 6.2500 6.2500 6.0116 3.8443 1.7681 385 43.750 6.2500 6.2500 7.8354 4.7846 1.8536 386 50.000 6.2500 6.2500 10.014 5.9079 1.9557 387 56.250 6.2500 6.2500 12.565 7.2232 2.0752 388 62.500 6.2500 6.2500 15.504 8.7388 2.2129 389 68.750 6.2500 6.2500 18.848 10.463 2.3696 390 75.000 6.2500 6.2500 22.609 12.402 2.5458 391 81.250 6.2500 6.2500 26.803 14.564 2.7424 392 100.00 0.0000 0.0000 41.830 22.052 2.9132 393 100.00 0.0000 6.2500 41.922 22.089 3.3985 394 100.00 6.2500 6.2500 42.105 22.454 3.4594 395 0.0000 12.500 6.2500 1.6002 2.0528 1.6547 396 6.2500 12.500 6.2500 1.8107 2.1614 1.6645 397 12.500 12.500 6.2500 2.1861 2.3549 1.6821 398 18.750 12.500 6.2500 2.7983 2.6706 1.7108 399 25.000 12.500 6.2500 3.6775 3.1239 1.7520 400 31.250 12.500 6.2500 4.8495 3.7282 1.8069 401 37.500 12.500 6.2500 6.3372 4.4952 1.8766 402 43.750 12.500 6.2500 8.1609 5.4355 1.9621 403 50.000 12.500 6.2500 10.340 6.5589 2.0642 404 56.250 12.500 6.2500 12.890 7.8741 2.1837 405 62.500 12.500 6.2500 15.830 9.3897 2.3214 406 68.750 12.500 6.2500 19.173 11.114 2.4781 407 75.000 12.500 6.2500 22.935 13.053 2.6544 408 81.250 12.500 6.2500 27.129 15.215 2.8509 409 87.500 12.500 6.2500 31.767 17.607 3.0682 410 93.750 12.500 6.2500 36.864 20.235 3.3070 411 0.0000 18.750 0.0000 2.0389 3.0775 1.3463 412 0.0000 18.750 6.2500 2.1310 3.1143 1.8316 413 6.2500 18.750 6.2500 2.3415 3.2229 1.8415 414 12.500 18.750 6.2500 2.7169 3.4164 1.8591 415 18.750 18.750 6.2500 3.3291 3.7321 1.8877 416 25.000 18.750 6.2500 4.2083 4.1854 1.9289 417 31.250 18.750 6.2500 5.3803 4.7897 1.9839 418 37.500 18.750 6.2500 6.8680 5.5567 2.0536 419 43.750 18.750 6.2500 8.6917 6.4971 2.1390 420 50.000 18.750 6.2500 10.870 7.6204 2.2411 421 56.250 18.750 6.2500 13.421 8.9356 2.3606 422 62.500 18.750 6.2500 16.361 10.451 2.4984 423 68.750 18.750 6.2500 19.704 12.175 2.6550 424 75.000 18.750 6.2500 23.466 14.115 2.8313 425 81.250 18.750 6.2500 27.659 16.277 3.0278 426 93.750 18.750 0.0000 37.303 21.260 2.9987 427 93.750 18.750 6.2500 37.395 21.296 3.4840 428 0.0000 12.500 0.0000 1.5081 2.0160 1.1694 429 0.0000 25.000 6.2500 2.8934 4.6389 2.0857 430 6.2500 25.000 6.2500 3.1039 4.7474 2.0956 431 12.500 25.000 6.2500 3.4793 4.9410 2.1132 432 18.750 25.000 6.2500 4.0915 5.2566 2.1419 433 25.000 25.000 6.2500 4.9707 5.7100 2.1831 434 31.250 25.000 6.2500 6.1427 6.3143 2.2380 435 37.500 25.000 6.2500 7.6304 7.0813 2.3077 436 43.750 25.000 6.2500 9.4541 8.0216 2.3932 437 50.000 25.000 6.2500 11.633 9.1449 2.4952 438 56.250 25.000 6.2500 14.184 10.460 2.6148 439 62.500 25.000 6.2500 17.123 11.976 2.7525 440 68.750 25.000 6.2500 20.466 13.700 2.9092 441 75.000 25.000 6.2500 24.228 15.639 3.0854 442 81.250 25.000 6.2500 28.422 17.801 3.2819 443 87.500 25.000 6.2500 33.061 20.193 3.4993 444 100.00 25.000 0.0000 43.631 25.654 3.5137 445 100.00 25.000 6.2500 43.724 25.691 3.9990 446 0.0000 31.250 6.2500 3.9097 6.6713 2.4245 447 6.2500 31.250 6.2500 4.1202 6.7798 2.4344 448 12.500 31.250 6.2500 4.4956 6.9734 2.4520 449 18.750 31.250 6.2500 5.1078 7.2890 2.4806 450 25.000 31.250 6.2500 5.9870 7.7423 2.5218 451 31.250 31.250 6.2500 7.1591 8.3466 2.5768 452 37.500 31.250 6.2500 8.6467 9.1136 2.6465 453 43.750 31.250 6.2500 10.470 10.054 2.7319 454 50.000 31.250 6.2500 12.649 11.177 2.8340 455 56.250 31.250 6.2500 15.200 12.493 2.9535 456 62.500 31.250 6.2500 18.139 14.008 3.0913 457 68.750 31.250 6.2500 21.483 15.732 3.2479 458 75.000 31.250 6.2500 25.244 17.671 3.4242 459 81.250 31.250 6.2500 29.438 19.834 3.6207 460 87.500 31.250 6.2500 34.077 22.226 3.8381 461 100.00 31.250 0.0000 44.648 27.687 3.8524 462 100.00 31.250 6.2500 44.740 27.723 4.3377 463 0.0000 37.500 6.2500 5.1997 9.2509 2.8545 464 6.2500 37.500 6.2500 5.4102 9.3594 2.8644 465 12.500 37.500 6.2500 5.7856 9.5529 2.8820 466 18.750 37.500 6.2500 6.3978 9.8686 2.9106 467 25.000 37.500 6.2500 7.2770 10.322 2.9518 468 31.250 37.500 6.2500 8.4490 10.926 3.0068 469 37.500 37.500 6.2500 9.9367 11.693 3.0765 470 43.750 37.500 6.2500 11.760 12.634 3.1619 471 50.000 37.500 6.2500 13.939 13.757 3.2640 472 56.250 37.500 6.2500 16.490 15.072 3.3835 473 62.500 37.500 6.2500 19.429 16.588 3.5213 474 68.750 37.500 6.2500 22.773 18.312 3.6779 475 75.000 37.500 6.2500 26.534 20.251 3.8542 476 81.250 37.500 6.2500 30.728 22.413 4.0507 477 93.750 37.500 0.0000 40.371 27.396 4.0216 478 93.750 37.500 6.2500 40.463 27.433 4.5069 479 100.00 37.500 6.2500 46.030 30.303 4.7677 480 0.0000 43.750 6.2500 6.7811 12.413 3.3816 481 6.2500 43.750 6.2500 6.9916 12.522 3.3915 482 12.500 43.750 6.2500 7.3670 12.715 3.4091 483 18.750 43.750 6.2500 7.9792 13.031 3.4378 484 25.000 43.750 6.2500 8.8584 13.484 3.4790 485 31.250 43.750 6.2500 10.030 14.089 3.5339 486 37.500 43.750 6.2500 11.518 14.856 3.6036 487 43.750 43.750 6.2500 13.342 15.796 3.6891 488 50.000 43.750 6.2500 15.520 16.919 3.7912 489 56.250 43.750 6.2500 18.071 18.235 3.9107 490 62.500 43.750 6.2500 21.011 19.750 4.0484 491 68.750 43.750 6.2500 24.354 21.474 4.2051 492 75.000 43.750 6.2500 28.116 23.413 4.3814 493 81.250 43.750 6.2500 32.309 25.576 4.5779 494 87.500 43.750 6.2500 36.948 27.968 4.7952 495 100.00 43.750 0.0000 47.519 33.429 4.8096 496 100.00 43.750 6.2500 47.611 33.465 5.2949 497 100.00 37.500 0.0000 45.938 30.266 4.2824 498 6.2500 50.000 6.2500 8.8808 16.300 4.0212 499 12.500 50.000 6.2500 9.2562 16.493 4.0388 500 18.750 50.000 6.2500 9.8684 16.809 4.0675 501 25.000 50.000 6.2500 10.748 17.262 4.1087 502 31.250 50.000 6.2500 11.920 17.866 4.1636 503 37.500 50.000 6.2500 13.407 18.633 4.2333 504 43.750 50.000 6.2500 15.231 19.574 4.3188 505 50.000 50.000 6.2500 17.410 20.697 4.4209 506 56.250 50.000 6.2500 19.961 22.012 4.5404 507 62.500 50.000 6.2500 22.900 23.528 4.6782 508 68.750 50.000 6.2500 26.243 25.252 4.8348 509 75.000 50.000 6.2500 30.005 27.191 5.0111 510 81.250 50.000 6.2500 34.199 29.354 5.2076 511 87.500 50.000 6.2500 38.837 31.745 5.4250 512 93.750 50.000 6.2500 43.934 34.373 5.6638 513 100.00 50.000 6.2500 49.500 37.243 5.9246 514 100.00 50.000 12.500 49.665 37.309 6.7900 515 6.2500 56.250 6.2500 11.093 20.723 4.7586 516 12.500 56.250 6.2500 11.468 20.917 4.7762 517 18.750 56.250 6.2500 12.080 21.232 4.8049 518 25.000 56.250 6.2500 12.960 21.685 4.8461 519 31.250 56.250 6.2500 14.132 22.290 4.9010 520 37.500 56.250 6.2500 15.619 23.057 4.9707 521 43.750 56.250 6.2500 17.443 23.997 5.0561 522 50.000 56.250 6.2500 19.622 25.120 5.1582 523 56.250 56.250 6.2500 22.173 26.436 5.2778 524 62.500 56.250 6.2500 25.112 27.951 5.4155 525 68.750 56.250 6.2500 28.455 29.675 5.5722 526 75.000 56.250 6.2500 32.217 31.615 5.7484 527 81.250 56.250 6.2500 36.411 33.777 5.9449 528 87.500 56.250 6.2500 41.049 36.169 6.1623 529 93.750 56.250 6.2500 46.146 38.797 6.4011 530 100.00 56.250 6.2500 51.712 41.667 6.6619 531 100.00 56.250 12.500 51.877 41.732 7.5274 532 6.2500 62.500 6.2500 13.642 25.820 5.6082 533 12.500 62.500 6.2500 14.017 26.014 5.6258 534 18.750 62.500 6.2500 14.629 26.329 5.6545 535 25.000 62.500 6.2500 15.508 26.783 5.6957 536 31.250 62.500 6.2500 16.681 27.387 5.7506 537 37.500 62.500 6.2500 18.168 28.154 5.8203 538 43.750 62.500 6.2500 19.992 29.094 5.9058 539 50.000 62.500 6.2500 22.171 30.218 6.0079 540 56.250 62.500 6.2500 24.721 31.533 6.1274 541 62.500 62.500 6.2500 27.661 33.048 6.2651 542 68.750 62.500 6.2500 31.004 34.772 6.4218 543 75.000 62.500 6.2500 34.766 36.712 6.5981 544 81.250 62.500 6.2500 38.960 38.874 6.7946 545 87.500 62.500 6.2500 43.598 41.266 7.0119 546 93.750 62.500 6.2500 48.695 43.894 7.2508 547 100.00 62.500 6.2500 54.261 46.764 7.5116 548 100.00 62.500 12.500 54.426 46.829 8.3770 549 6.2500 68.750 6.2500 16.541 31.617 6.5746 550 12.500 68.750 6.2500 16.916 31.811 6.5922 551 18.750 68.750 6.2500 17.528 32.127 6.6209 552 25.000 68.750 6.2500 18.408 32.580 6.6621 553 31.250 68.750 6.2500 19.580 33.184 6.7170 554 37.500 68.750 6.2500 21.067 33.951 6.7867 555 43.750 68.750 6.2500 22.891 34.892 6.8722 556 50.000 68.750 6.2500 25.070 36.015 6.9742 557 56.250 68.750 6.2500 27.621 37.330 7.0938 558 62.500 68.750 6.2500 30.560 38.846 7.2315 559 68.750 68.750 6.2500 33.903 40.570 7.3882 560 75.000 68.750 6.2500 37.665 42.509 7.5644 561 81.250 68.750 6.2500 41.859 44.671 7.7609 562 87.500 68.750 6.2500 46.497 47.063 7.9783 563 93.750 68.750 6.2500 51.594 49.691 8.2171 564 100.00 68.750 6.2500 57.160 52.561 8.4780 565 100.00 68.750 12.500 57.325 52.627 9.3434 566 6.2500 75.000 6.2500 19.803 38.140 7.6619 567 12.500 75.000 6.2500 20.178 38.334 7.6795 568 18.750 75.000 6.2500 20.790 38.649 7.7082 569 25.000 75.000 6.2500 21.669 39.103 7.7493 570 31.250 75.000 6.2500 22.841 39.707 7.8043 571 37.500 75.000 6.2500 24.329 40.474 7.8740 572 43.750 75.000 6.2500 26.153 41.414 7.9594 573 50.000 75.000 6.2500 28.331 42.538 8.0615 574 56.250 75.000 6.2500 30.882 43.853 8.1811 575 62.500 75.000 6.2500 33.822 45.369 8.3188 576 68.750 75.000 6.2500 37.165 47.092 8.4755 577 75.000 75.000 6.2500 40.927 49.032 8.6517 578 81.250 75.000 6.2500 45.120 51.194 8.8482 579 87.500 75.000 6.2500 49.759 53.586 9.0656 580 93.750 75.000 6.2500 54.856 56.214 9.3044 581 93.750 75.000 12.500 55.020 56.279 10.170 582 0.0000 81.250 6.2500 23.229 45.304 8.8642 583 6.2500 81.250 6.2500 23.439 45.412 8.8740 584 12.500 81.250 6.2500 23.814 45.606 8.8916 585 18.750 81.250 6.2500 24.427 45.921 8.9203 586 25.000 81.250 6.2500 25.306 46.375 8.9615 587 31.250 81.250 6.2500 26.478 46.979 9.0164 588 37.500 81.250 6.2500 27.966 47.746 9.0861 589 43.750 81.250 6.2500 29.789 48.686 9.1716 590 50.000 81.250 6.2500 31.968 49.810 9.2737 591 56.250 81.250 6.2500 34.519 51.125 9.3932 592 62.500 81.250 6.2500 37.458 52.640 9.5310 593 68.750 81.250 6.2500 40.802 54.364 9.6876 594 75.000 81.250 6.2500 44.563 56.304 9.8639 595 81.250 81.250 6.2500 48.757 58.466 10.060 596 87.500 81.250 6.2500 53.396 60.858 10.278 597 93.750 81.250 6.2500 58.492 63.486 10.517 598 93.750 81.250 12.500 58.657 63.551 11.382 599 0.0000 87.500 6.2500 27.251 53.347 10.205 600 6.2500 87.500 6.2500 27.462 53.456 10.215 601 12.500 87.500 6.2500 27.837 53.650 10.232 602 18.750 87.500 6.2500 28.449 53.965 10.261 603 25.000 87.500 6.2500 29.328 54.418 10.302 604 31.250 87.500 6.2500 30.500 55.023 10.357 605 37.500 87.500 6.2500 31.988 55.790 10.427 606 43.750 87.500 6.2500 33.812 56.730 10.512 607 50.000 87.500 6.2500 35.990 57.853 10.615 608 56.250 87.500 6.2500 38.541 59.169 10.734 609 62.500 87.500 6.2500 41.481 60.684 10.872 610 68.750 87.500 6.2500 44.824 62.408 11.028 611 75.000 87.500 6.2500 48.586 64.348 11.205 612 81.250 87.500 6.2500 52.779 66.510 11.401 613 87.500 87.500 6.2500 57.418 68.902 11.619 614 93.750 87.500 6.2500 62.515 71.530 11.857 615 93.750 87.500 12.500 62.679 71.595 12.723 616 0.0000 93.750 6.2500 31.671 62.185 11.678 617 6.2500 93.750 6.2500 31.881 62.294 11.688 618 12.500 93.750 6.2500 32.256 62.487 11.706 619 18.750 93.750 6.2500 32.869 62.803 11.734 620 25.000 93.750 6.2500 33.748 63.256 11.776 621 31.250 93.750 6.2500 34.920 63.860 11.830 622 37.500 93.750 6.2500 36.407 64.627 11.900 623 43.750 93.750 6.2500 38.231 65.568 11.986 624 50.000 93.750 6.2500 40.410 66.691 12.088 625 56.250 93.750 6.2500 42.961 68.006 12.207 626 62.500 93.750 6.2500 45.900 69.522 12.345 627 68.750 93.750 6.2500 49.244 71.246 12.502 628 75.000 93.750 6.2500 53.005 73.185 12.678 629 81.250 93.750 6.2500 57.199 75.348 12.874 630 87.500 93.750 6.2500 61.838 77.739 13.092 631 93.750 93.750 6.2500 66.934 80.367 13.331 632 93.750 93.750 12.500 67.099 80.433 14.196 633 0.0000 100.00 6.2500 36.497 71.837 13.287 634 6.2500 100.00 6.2500 36.708 71.946 13.297 635 12.500 100.00 6.2500 37.083 72.139 13.315 636 18.750 100.00 6.2500 37.695 72.455 13.343 637 25.000 100.00 6.2500 38.575 72.908 13.384 638 31.250 100.00 6.2500 39.747 73.513 13.439 639 37.500 100.00 6.2500 41.234 74.280 13.509 640 43.750 100.00 6.2500 43.058 75.220 13.595 641 50.000 100.00 6.2500 45.237 76.343 13.697 642 56.250 100.00 6.2500 47.788 77.659 13.816 643 62.500 100.00 6.2500 50.727 79.174 13.954 644 68.750 100.00 6.2500 54.070 80.898 14.111 645 75.000 100.00 6.2500 57.832 82.838 14.287 646 81.250 100.00 6.2500 62.026 85.000 14.483 647 87.500 100.00 6.2500 66.665 87.392 14.701 648 93.750 100.00 6.2500 71.761 90.019 14.940 649 93.750 100.00 12.500 71.925 90.085 15.805 650 6.2500 0.0000 12.500 1.4670 1.2111 2.3606 651 12.500 0.0000 12.500 1.8424 1.4047 2.3782 652 18.750 0.0000 12.500 2.4545 1.7203 2.4069 653 25.000 0.0000 12.500 3.3337 2.1736 2.4481 654 31.250 0.0000 12.500 4.5058 2.7779 2.5030 655 37.500 0.0000 12.500 5.9934 3.5450 2.5727 656 43.750 0.0000 12.500 7.8171 4.4853 2.6582 657 50.000 0.0000 12.500 9.9958 5.6086 2.7602 658 56.250 0.0000 12.500 12.547 6.9239 2.8798 659 62.500 0.0000 12.500 15.486 8.4395 3.0175 660 68.750 0.0000 12.500 18.829 10.163 3.1742 661 75.000 0.0000 12.500 22.591 12.103 3.3504 662 81.250 0.0000 12.500 26.785 14.265 3.5470 663 87.500 0.0000 12.500 31.424 16.657 3.7643 664 93.750 0.0000 12.500 36.520 19.285 4.0031 665 93.750 6.2500 12.500 36.703 19.650 4.0640 666 0.0000 6.2500 12.500 1.4390 1.4676 2.4116 667 6.2500 6.2500 12.500 1.6495 1.5761 2.4214 668 12.500 6.2500 12.500 2.0249 1.7697 2.4390 669 18.750 6.2500 12.500 2.6371 2.0853 2.4677 670 25.000 6.2500 12.500 3.5163 2.5386 2.5089 671 31.250 6.2500 12.500 4.6883 3.1429 2.5638 672 37.500 6.2500 12.500 6.1759 3.9100 2.6336 673 43.750 6.2500 12.500 7.9997 4.8503 2.7190 674 50.000 6.2500 12.500 10.178 5.9736 2.8211 675 56.250 6.2500 12.500 12.729 7.2889 2.9406 676 62.500 6.2500 12.500 15.669 8.8045 3.0784 677 68.750 6.2500 12.500 19.012 10.528 3.2350 678 75.000 6.2500 12.500 22.774 12.468 3.4113 679 81.250 6.2500 12.500 26.967 14.630 3.6078 680 87.500 6.2500 12.500 31.606 17.022 3.8252 681 100.00 0.0000 12.500 42.087 22.155 4.2640 682 100.00 6.2500 12.500 42.269 22.520 4.3248 683 100.00 12.500 12.500 42.595 23.171 4.4333 684 6.2500 12.500 12.500 1.9750 2.2271 2.5300 685 18.750 12.500 12.500 2.9626 2.7363 2.5762 686 25.000 12.500 12.500 3.8418 3.1896 2.6174 687 31.250 12.500 12.500 5.0138 3.7939 2.6724 688 37.500 12.500 12.500 6.5015 4.5609 2.7421 689 43.750 12.500 12.500 8.3252 5.5013 2.8275 690 50.000 12.500 12.500 10.504 6.6246 2.9296 691 56.250 12.500 12.500 13.055 7.9398 3.0491 692 62.500 12.500 12.500 15.994 9.4554 3.1869 693 68.750 12.500 12.500 19.338 11.179 3.3435 694 75.000 12.500 12.500 23.099 13.119 3.5198 695 81.250 12.500 12.500 27.293 15.281 3.7163 696 87.500 12.500 12.500 31.932 17.673 3.9337 697 93.750 12.500 12.500 37.028 20.301 4.1725 698 100.00 12.500 18.750 42.863 23.278 5.8446 699 0.0000 18.750 12.500 2.2953 3.1801 2.6970 700 6.2500 18.750 12.500 2.5058 3.2886 2.7069 701 12.500 18.750 12.500 2.8812 3.4821 2.7245 702 18.750 18.750 12.500 3.4934 3.7978 2.7532 703 25.000 18.750 12.500 4.3726 4.2511 2.7944 704 31.250 18.750 12.500 5.5447 4.8554 2.8493 705 37.500 18.750 12.500 7.0323 5.6224 2.9190 706 43.750 18.750 12.500 8.8560 6.5628 3.0045 707 50.000 18.750 12.500 11.035 7.6861 3.1065 708 56.250 18.750 12.500 13.586 9.0013 3.2261 709 62.500 18.750 12.500 16.525 10.517 3.3638 710 68.750 18.750 12.500 19.868 12.241 3.5205 711 75.000 18.750 12.500 23.630 14.180 3.6967 712 81.250 18.750 12.500 27.824 16.343 3.8933 713 87.500 18.750 12.500 32.462 18.734 4.1106 714 93.750 18.750 12.500 37.559 21.362 4.3494 715 100.00 18.750 12.500 43.126 24.232 4.6103 716 0.0000 25.000 12.500 3.0577 4.7046 2.9512 717 6.2500 25.000 12.500 3.2682 4.8132 2.9610 718 12.500 25.000 12.500 3.6436 5.0067 2.9786 719 18.750 25.000 12.500 4.2558 5.3223 3.0073 720 25.000 25.000 12.500 5.1350 5.7757 3.0485 721 31.250 25.000 12.500 6.3071 6.3800 3.1034 722 37.500 25.000 12.500 7.7947 7.1470 3.1731 723 43.750 25.000 12.500 9.6184 8.0873 3.2586 724 50.000 25.000 12.500 11.797 9.2106 3.3607 725 56.250 25.000 12.500 14.348 10.526 3.4802 726 62.500 25.000 12.500 17.287 12.042 3.6179 727 68.750 25.000 12.500 20.631 13.765 3.7746 728 75.000 25.000 12.500 24.392 15.705 3.9509 729 81.250 25.000 12.500 28.586 17.867 4.1474 730 87.500 25.000 12.500 33.225 20.259 4.3647 731 93.750 25.000 12.500 38.321 22.887 4.6036 732 100.00 25.000 12.500 43.888 25.757 4.8644 733 0.0000 31.250 12.500 4.0740 6.7370 3.2899 734 6.2500 31.250 12.500 4.2846 6.8455 3.2998 735 12.500 31.250 12.500 4.6600 7.0391 3.3174 736 18.750 31.250 12.500 5.2721 7.3547 3.3461 737 25.000 31.250 12.500 6.1513 7.8080 3.3873 738 31.250 31.250 12.500 7.3234 8.4123 3.4422 739 37.500 31.250 12.500 8.8110 9.1794 3.5119 740 43.750 31.250 12.500 10.635 10.120 3.5974 741 50.000 31.250 12.500 12.813 11.243 3.6995 742 56.250 31.250 12.500 15.364 12.558 3.8190 743 62.500 31.250 12.500 18.304 14.074 3.9567 744 68.750 31.250 12.500 21.647 15.798 4.1134 745 75.000 31.250 12.500 25.409 17.737 4.2896 746 81.250 31.250 12.500 29.602 19.899 4.4862 747 87.500 31.250 12.500 34.241 22.291 4.7035 748 93.750 31.250 12.500 39.338 24.919 4.9423 749 100.00 31.250 12.500 44.904 27.789 5.2032 750 0.0000 37.500 12.500 5.3640 9.3166 3.7199 751 6.2500 37.500 12.500 5.5745 9.4251 3.7298 752 12.500 37.500 12.500 5.9499 9.6187 3.7474 753 18.750 37.500 12.500 6.5621 9.9343 3.7761 754 25.000 37.500 12.500 7.4413 10.388 3.8173 755 31.250 37.500 12.500 8.6133 10.992 3.8722 756 37.500 37.500 12.500 10.101 11.759 3.9419 757 43.750 37.500 12.500 11.925 12.699 4.0274 758 50.000 37.500 12.500 14.103 13.823 4.1295 759 56.250 37.500 12.500 16.654 15.138 4.2490 760 62.500 37.500 12.500 19.594 16.653 4.3867 761 68.750 37.500 12.500 22.937 18.377 4.5434 762 75.000 37.500 12.500 26.699 20.317 4.7196 763 81.250 37.500 12.500 30.892 22.479 4.9162 764 87.500 37.500 12.500 35.531 24.871 5.1335 765 93.750 37.500 12.500 40.628 27.499 5.3723 766 100.00 37.500 12.500 46.194 30.369 5.6332 767 0.0000 43.750 12.500 6.9455 12.479 4.2471 768 6.2500 43.750 12.500 7.1560 12.588 4.2570 769 12.500 43.750 12.500 7.5314 12.781 4.2745 770 18.750 43.750 12.500 8.1435 13.097 4.3032 771 25.000 43.750 12.500 9.0227 13.550 4.3444 772 31.250 43.750 12.500 10.195 14.154 4.3993 773 37.500 43.750 12.500 11.682 14.921 4.4691 774 43.750 43.750 12.500 13.506 15.862 4.5545 775 50.000 43.750 12.500 15.685 16.985 4.6566 776 56.250 43.750 12.500 18.236 18.300 4.7761 777 62.500 43.750 12.500 21.175 19.816 4.9139 778 68.750 43.750 12.500 24.518 21.540 5.0705 779 75.000 43.750 12.500 28.280 23.479 5.2468 780 81.250 43.750 12.500 32.474 25.641 5.4433 781 87.500 43.750 12.500 37.113 28.033 5.6607 782 93.750 43.750 12.500 42.209 30.661 5.8995 783 100.00 43.750 12.500 47.776 33.531 6.1603 784 0.0000 50.000 12.500 8.8346 16.257 4.8768 785 6.2500 50.000 12.500 9.0451 16.365 4.8867 786 12.500 50.000 12.500 9.4205 16.559 4.9043 787 18.750 50.000 12.500 10.033 16.875 4.9330 788 25.000 50.000 12.500 10.912 17.328 4.9742 789 31.250 50.000 12.500 12.084 17.932 5.0291 790 37.500 50.000 12.500 13.572 18.699 5.0988 791 43.750 50.000 12.500 15.395 19.640 5.1842 792 50.000 50.000 12.500 17.574 20.763 5.2863 793 56.250 50.000 12.500 20.125 22.078 5.4059 794 62.500 50.000 12.500 23.064 23.594 5.5436 795 68.750 50.000 12.500 26.408 25.317 5.7003 796 75.000 50.000 12.500 30.169 27.257 5.8765 797 81.250 50.000 12.500 34.363 29.419 6.0730 798 87.500 50.000 12.500 39.002 31.811 6.2904 799 93.750 50.000 12.500 44.098 34.439 6.5292 800 0.0000 56.250 6.2500 10.882 20.614 4.7487 801 0.0000 56.250 12.500 11.047 20.680 5.6142 802 6.2500 56.250 12.500 11.257 20.789 5.6240 803 12.500 56.250 12.500 11.633 20.982 5.6416 804 18.750 56.250 12.500 12.245 21.298 5.6703 805 25.000 56.250 12.500 13.124 21.751 5.7115 806 31.250 56.250 12.500 14.296 22.356 5.7664 807 37.500 56.250 12.500 15.784 23.123 5.8361 808 43.750 56.250 12.500 17.607 24.063 5.9216 809 50.000 56.250 12.500 19.786 25.186 6.0237 810 56.250 56.250 12.500 22.337 26.501 6.1432 811 62.500 56.250 12.500 25.276 28.017 6.2809 812 68.750 56.250 12.500 28.620 29.741 6.4376 813 75.000 56.250 12.500 32.381 31.680 6.6139 814 81.250 56.250 12.500 36.575 33.843 6.8104 815 87.500 56.250 12.500 41.214 36.234 7.0277 816 93.750 56.250 12.500 46.310 38.862 7.2666 817 0.0000 62.500 6.2500 13.431 25.712 5.5984 818 0.0000 62.500 12.500 13.596 25.777 6.4638 819 6.2500 62.500 12.500 13.806 25.886 6.4737 820 12.500 62.500 12.500 14.181 26.079 6.4913 821 18.750 62.500 12.500 14.794 26.395 6.5199 822 25.000 62.500 12.500 15.673 26.848 6.5611 823 31.250 62.500 12.500 16.845 27.453 6.6161 824 37.500 62.500 12.500 18.332 28.220 6.6858 825 43.750 62.500 12.500 20.156 29.160 6.7712 826 50.000 62.500 12.500 22.335 30.283 6.8733 827 56.250 62.500 12.500 24.886 31.599 6.9928 828 62.500 62.500 12.500 27.825 33.114 7.1306 829 68.750 62.500 12.500 31.169 34.838 7.2872 830 75.000 62.500 12.500 34.930 36.777 7.4635 831 81.250 62.500 12.500 39.124 38.940 7.6600 832 87.500 62.500 12.500 43.763 41.332 7.8774 833 93.750 62.500 12.500 48.859 43.959 8.1162 834 0.0000 68.750 6.2500 16.330 31.509 6.5647 835 0.0000 68.750 12.500 16.495 31.575 7.4302 836 6.2500 68.750 12.500 16.705 31.683 7.4400 837 12.500 68.750 12.500 17.081 31.877 7.4576 838 18.750 68.750 12.500 17.693 32.192 7.4863 839 25.000 68.750 12.500 18.572 32.646 7.5275 840 31.250 68.750 12.500 19.744 33.250 7.5824 841 37.500 68.750 12.500 21.232 34.017 7.6521 842 43.750 68.750 12.500 23.055 34.957 7.7376 843 50.000 68.750 12.500 25.234 36.081 7.8397 844 56.250 68.750 12.500 27.785 37.396 7.9592 845 62.500 68.750 12.500 30.724 38.912 8.0970 846 68.750 68.750 12.500 34.068 40.635 8.2536 847 75.000 68.750 12.500 37.829 42.575 8.4299 848 81.250 68.750 12.500 42.023 44.737 8.6264 849 87.500 68.750 12.500 46.662 47.129 8.8438 850 93.750 68.750 12.500 51.758 49.757 9.0826 851 0.0000 75.000 6.2500 19.592 38.032 7.6520 852 0.0000 75.000 12.500 19.756 38.097 8.5175 853 6.2500 75.000 12.500 19.967 38.206 8.5273 854 12.500 75.000 12.500 20.342 38.399 8.5449 855 18.750 75.000 12.500 20.955 38.715 8.5736 856 25.000 75.000 12.500 21.834 39.168 8.6148 857 31.250 75.000 12.500 23.006 39.773 8.6697 858 37.500 75.000 12.500 24.493 40.540 8.7394 859 43.750 75.000 12.500 26.317 41.480 8.8249 860 50.000 75.000 12.500 28.496 42.603 8.9270 861 56.250 75.000 12.500 31.047 43.919 9.0465 862 62.500 75.000 12.500 33.986 45.434 9.1842 863 68.750 75.000 12.500 37.329 47.158 9.3409 864 75.000 75.000 12.500 41.091 49.098 9.5172 865 81.250 75.000 12.500 45.285 51.260 9.7137 866 87.500 75.000 12.500 49.924 53.652 9.9310 867 100.00 75.000 6.2500 60.422 59.084 9.5652 868 100.00 75.000 12.500 60.587 59.150 10.431 869 0.0000 81.250 12.500 23.393 45.369 9.7296 870 6.2500 81.250 12.500 23.603 45.478 9.7395 871 12.500 81.250 12.500 23.979 45.671 9.7571 872 18.750 81.250 12.500 24.591 45.987 9.7858 873 25.000 81.250 12.500 25.470 46.440 9.8270 874 31.250 81.250 12.500 26.642 47.045 9.8819 875 37.500 81.250 12.500 28.130 47.812 9.9516 876 43.750 81.250 12.500 29.954 48.752 10.037 877 50.000 81.250 12.500 32.132 49.875 10.139 878 56.250 81.250 12.500 34.683 51.191 10.259 879 62.500 81.250 12.500 37.623 52.706 10.396 880 68.750 81.250 12.500 40.966 54.430 10.553 881 75.000 81.250 12.500 44.728 56.369 10.729 882 81.250 81.250 12.500 48.921 58.532 10.926 883 87.500 81.250 12.500 53.560 60.924 11.143 884 100.00 81.250 6.2500 64.059 66.356 10.777 885 100.00 81.250 12.500 64.223 66.421 11.643 886 0.0000 87.500 12.500 27.415 53.413 11.070 887 6.2500 87.500 12.500 27.626 53.522 11.080 888 12.500 87.500 12.500 28.001 53.715 11.098 889 18.750 87.500 12.500 28.613 54.031 11.127 890 25.000 87.500 12.500 29.493 54.484 11.168 891 31.250 87.500 12.500 30.665 55.089 11.223 892 37.500 87.500 12.500 32.152 55.856 11.292 893 43.750 87.500 12.500 33.976 56.796 11.378 894 50.000 87.500 12.500 36.155 57.919 11.480 895 56.250 87.500 12.500 38.706 59.234 11.600 896 62.500 87.500 12.500 41.645 60.750 11.737 897 68.750 87.500 12.500 44.988 62.474 11.894 898 75.000 87.500 12.500 48.750 64.413 12.070 899 81.250 87.500 12.500 52.944 66.576 12.267 900 87.500 87.500 12.500 57.583 68.967 12.484 901 100.00 87.500 6.2500 68.081 74.400 12.118 902 100.00 87.500 12.500 68.246 74.465 12.984 903 0.0000 93.750 12.500 31.835 62.251 12.544 904 6.2500 93.750 12.500 32.045 62.359 12.553 905 12.500 93.750 12.500 32.421 62.553 12.571 906 18.750 93.750 12.500 33.033 62.869 12.600 907 25.000 93.750 12.500 33.912 63.322 12.641 908 31.250 93.750 12.500 35.084 63.926 12.696 909 37.500 93.750 12.500 36.572 64.693 12.766 910 43.750 93.750 12.500 38.396 65.633 12.851 911 50.000 93.750 12.500 40.574 66.757 12.953 912 56.250 93.750 12.500 43.125 68.072 13.073 913 62.500 93.750 12.500 46.065 69.588 13.210 914 68.750 93.750 12.500 49.408 71.311 13.367 915 75.000 93.750 12.500 53.169 73.251 13.543 916 81.250 93.750 12.500 57.363 75.413 13.740 917 87.500 93.750 12.500 62.002 77.805 13.957 918 100.00 93.750 6.2500 72.501 83.237 13.591 919 100.00 93.750 12.500 72.665 83.303 14.457 920 0.0000 100.00 12.500 36.662 71.903 14.153 921 6.2500 100.00 12.500 36.872 72.012 14.162 922 12.500 100.00 12.500 37.248 72.205 14.180 923 18.750 100.00 12.500 37.860 72.521 14.209 924 25.000 100.00 12.500 38.739 72.974 14.250 925 31.250 100.00 12.500 39.911 73.578 14.305 926 37.500 100.00 12.500 41.399 74.345 14.375 927 43.750 100.00 12.500 43.222 75.286 14.460 928 50.000 100.00 12.500 45.401 76.409 14.562 929 56.250 100.00 12.500 47.952 77.724 14.682 930 62.500 100.00 12.500 50.891 79.240 14.819 931 68.750 100.00 12.500 54.235 80.964 14.976 932 75.000 100.00 12.500 57.996 82.903 15.152 933 81.250 100.00 12.500 62.190 85.066 15.349 934 87.500 100.00 12.500 66.829 87.457 15.566 935 100.00 100.00 6.2500 77.328 92.890 15.200 936 100.00 100.00 12.500 77.492 92.955 16.066 937 6.2500 0.0000 18.750 1.7349 1.3183 3.7719 938 12.500 0.0000 18.750 2.1103 1.5118 3.7895 939 18.750 0.0000 18.750 2.7225 1.8275 3.8182 940 25.000 0.0000 18.750 3.6017 2.2808 3.8594 941 31.250 0.0000 18.750 4.7737 2.8851 3.9143 942 37.500 0.0000 18.750 6.2613 3.6521 3.9840 943 43.750 0.0000 18.750 8.0851 4.5924 4.0694 944 50.000 0.0000 18.750 10.264 5.7158 4.1715 945 56.250 0.0000 18.750 12.815 7.0310 4.2911 946 62.500 0.0000 18.750 15.754 8.5466 4.4288 947 68.750 0.0000 18.750 19.097 10.270 4.5855 948 75.000 0.0000 18.750 22.859 12.210 4.7617 949 81.250 0.0000 18.750 27.053 14.372 4.9582 950 87.500 0.0000 18.750 31.692 16.764 5.1756 951 93.750 0.0000 18.750 36.788 19.392 5.4144 952 93.750 6.2500 18.750 36.971 19.757 5.4753 953 0.0000 6.2500 18.750 1.7069 1.5747 3.8229 954 6.2500 6.2500 18.750 1.9174 1.6833 3.8327 955 12.500 6.2500 18.750 2.2928 1.8768 3.8503 956 18.750 6.2500 18.750 2.9050 2.1925 3.8790 957 25.000 6.2500 18.750 3.7842 2.6458 3.9202 958 31.250 6.2500 18.750 4.9562 3.2501 3.9751 959 37.500 6.2500 18.750 6.4439 4.0171 4.0448 960 43.750 6.2500 18.750 8.2676 4.9575 4.1303 961 50.000 6.2500 18.750 10.446 6.0808 4.2324 962 56.250 6.2500 18.750 12.997 7.3960 4.3519 963 62.500 6.2500 18.750 15.937 8.9116 4.4896 964 68.750 6.2500 18.750 19.280 10.635 4.6463 965 75.000 6.2500 18.750 23.042 12.575 4.8226 966 81.250 6.2500 18.750 27.235 14.737 5.0191 967 87.500 6.2500 18.750 31.874 17.129 5.2364 968 100.00 0.0000 18.750 42.355 22.262 5.6752 969 100.00 6.2500 18.750 42.537 22.627 5.7361 970 0.0000 12.500 18.750 2.0324 2.2257 3.9314 971 6.2500 12.500 18.750 2.2430 2.3342 3.9412 972 12.500 12.500 18.750 2.6184 2.5278 3.9588 973 18.750 12.500 18.750 3.2305 2.8434 3.9875 974 25.000 12.500 18.750 4.1097 3.2968 4.0287 975 31.250 12.500 18.750 5.2818 3.9011 4.0836 976 37.500 12.500 18.750 6.7694 4.6681 4.1533 977 43.750 12.500 18.750 8.5932 5.6084 4.2388 978 50.000 12.500 18.750 10.772 6.7317 4.3409 979 56.250 12.500 18.750 13.323 8.0470 4.4604 980 62.500 12.500 18.750 16.262 9.5626 4.5981 981 68.750 12.500 18.750 19.605 11.286 4.7548 982 75.000 12.500 18.750 23.367 13.226 4.9311 983 81.250 12.500 18.750 27.561 15.388 5.1276 984 87.500 12.500 18.750 32.200 17.780 5.3449 985 93.750 12.500 18.750 37.296 20.408 5.5838 986 0.0000 12.500 12.500 1.7645 2.1185 2.5201 987 0.0000 18.750 18.750 2.5633 3.2872 4.1083 988 6.2500 18.750 18.750 2.7738 3.3957 4.1182 989 12.500 18.750 18.750 3.1492 3.5893 4.1358 990 25.000 18.750 18.750 4.6406 4.3583 4.2056 991 31.250 18.750 18.750 5.8126 4.9626 4.2606 992 37.500 18.750 18.750 7.3002 5.7296 4.3303 993 43.750 18.750 18.750 9.1240 6.6699 4.4157 994 50.000 18.750 18.750 11.303 7.7932 4.5178 995 56.250 18.750 18.750 13.854 9.1085 4.6374 996 62.500 18.750 18.750 16.793 10.624 4.7751 997 68.750 18.750 18.750 20.136 12.348 4.9318 998 75.000 18.750 18.750 23.898 14.287 5.1080 999 81.250 18.750 18.750 28.092 16.450 5.3045 1000 87.500 18.750 18.750 32.730 18.841 5.5219 1001 93.750 18.750 18.750 37.827 21.469 5.7607 1002 100.00 18.750 18.750 43.393 24.339 6.0215 1003 100.00 18.750 25.000 43.778 24.493 8.0484 1004 6.2500 25.000 18.750 3.5362 4.9203 4.3723 1005 12.500 25.000 18.750 3.9116 5.1139 4.3899 1006 18.750 25.000 18.750 4.5237 5.4295 4.4186 1007 25.000 25.000 18.750 5.4029 5.8828 4.4598 1008 31.250 25.000 18.750 6.5750 6.4871 4.5147 1009 37.500 25.000 18.750 8.0626 7.2542 4.5844 1010 43.750 25.000 18.750 9.8864 8.1945 4.6699 1011 50.000 25.000 18.750 12.065 9.3178 4.7720 1012 56.250 25.000 18.750 14.616 10.633 4.8915 1013 62.500 25.000 18.750 17.555 12.149 5.0292 1014 68.750 25.000 18.750 20.899 13.872 5.1859 1015 75.000 25.000 18.750 24.660 15.812 5.3621 1016 81.250 25.000 18.750 28.854 17.974 5.5587 1017 87.500 25.000 18.750 33.493 20.366 5.7760 1018 93.750 25.000 18.750 38.589 22.994 6.0148 1019 100.00 25.000 18.750 44.156 25.864 6.2757 1020 0.0000 31.250 18.750 4.3420 6.8441 4.7012 1021 6.2500 31.250 18.750 4.5525 6.9527 4.7111 1022 12.500 31.250 18.750 4.9279 7.1462 4.7287 1023 18.750 31.250 18.750 5.5401 7.4619 4.7574 1024 25.000 31.250 18.750 6.4193 7.9152 4.7986 1025 31.250 31.250 18.750 7.5913 8.5195 4.8535 1026 37.500 31.250 18.750 9.0789 9.2865 4.9232 1027 43.750 31.250 18.750 10.903 10.227 5.0086 1028 50.000 31.250 18.750 13.081 11.350 5.1107 1029 56.250 31.250 18.750 15.632 12.665 5.2303 1030 62.500 31.250 18.750 18.572 14.181 5.3680 1031 68.750 31.250 18.750 21.915 15.905 5.5247 1032 75.000 31.250 18.750 25.677 17.844 5.7009 1033 81.250 31.250 18.750 29.870 20.007 5.8974 1034 87.500 31.250 18.750 34.509 22.398 6.1148 1035 93.750 31.250 18.750 39.606 25.026 6.3536 1036 100.00 31.250 18.750 45.172 27.896 6.6144 1037 0.0000 37.500 18.750 5.6320 9.4237 5.1312 1038 6.2500 37.500 18.750 5.8425 9.5323 5.1411 1039 12.500 37.500 18.750 6.2179 9.7258 5.1587 1040 18.750 37.500 18.750 6.8300 10.041 5.1874 1041 25.000 37.500 18.750 7.7092 10.495 5.2286 1042 31.250 37.500 18.750 8.8813 11.099 5.2835 1043 37.500 37.500 18.750 10.369 11.866 5.3532 1044 43.750 37.500 18.750 12.193 12.806 5.4386 1045 50.000 37.500 18.750 14.371 13.930 5.5407 1046 56.250 37.500 18.750 16.922 15.245 5.6603 1047 62.500 37.500 18.750 19.862 16.761 5.7980 1048 68.750 37.500 18.750 23.205 18.484 5.9547 1049 75.000 37.500 18.750 26.967 20.424 6.1309 1050 81.250 37.500 18.750 31.160 22.586 6.3274 1051 87.500 37.500 18.750 35.799 24.978 6.5448 1052 93.750 37.500 18.750 40.896 27.606 6.7836 1053 100.00 37.500 18.750 46.462 30.476 7.0444 1054 0.0000 43.750 18.750 7.2134 12.586 5.6584 1055 6.2500 43.750 18.750 7.4239 12.695 5.6682 1056 12.500 43.750 18.750 7.7993 12.888 5.6858 1057 18.750 43.750 18.750 8.4115 13.204 5.7145 1058 25.000 43.750 18.750 9.2907 13.657 5.7557 1059 31.250 43.750 18.750 10.463 14.261 5.8106 1060 37.500 43.750 18.750 11.950 15.029 5.8803 1061 43.750 43.750 18.750 13.774 15.969 5.9658 1062 50.000 43.750 18.750 15.953 17.092 6.0679 1063 56.250 43.750 18.750 18.504 18.407 6.1874 1064 62.500 43.750 18.750 21.443 19.923 6.3251 1065 68.750 43.750 18.750 24.786 21.647 6.4818 1066 75.000 43.750 18.750 28.548 23.586 6.6581 1067 81.250 43.750 18.750 32.742 25.749 6.8546 1068 87.500 43.750 18.750 37.381 28.140 7.0719 1069 93.750 43.750 18.750 42.477 30.768 7.3108 1070 100.00 43.750 18.750 48.044 33.638 7.5716 1071 0.0000 50.000 18.750 9.1026 16.364 6.2881 1072 6.2500 50.000 18.750 9.3131 16.472 6.2980 1073 12.500 50.000 18.750 9.6885 16.666 6.3155 1074 18.750 50.000 18.750 10.301 16.982 6.3442 1075 25.000 50.000 18.750 11.180 17.435 6.3854 1076 31.250 50.000 18.750 12.352 18.039 6.4403 1077 37.500 50.000 18.750 13.840 18.806 6.5101 1078 43.750 50.000 18.750 15.663 19.747 6.5955 1079 50.000 50.000 18.750 17.842 20.870 6.6976 1080 56.250 50.000 18.750 20.393 22.185 6.8171 1081 62.500 50.000 18.750 23.332 23.701 6.9549 1082 68.750 50.000 18.750 26.676 25.425 7.1115 1083 75.000 50.000 18.750 30.437 27.364 7.2878 1084 81.250 50.000 18.750 34.631 29.526 7.4843 1085 87.500 50.000 18.750 39.270 31.918 7.7017 1086 93.750 50.000 18.750 44.366 34.546 7.9405 1087 100.00 50.000 18.750 49.933 37.416 8.2013 1088 0.0000 56.250 18.750 11.315 20.787 7.0254 1089 6.2500 56.250 18.750 11.525 20.896 7.0353 1090 12.500 56.250 18.750 11.900 21.089 7.0529 1091 18.750 56.250 18.750 12.513 21.405 7.0816 1092 25.000 56.250 18.750 13.392 21.858 7.1228 1093 31.250 56.250 18.750 14.564 22.463 7.1777 1094 37.500 56.250 18.750 16.052 23.230 7.2474 1095 43.750 56.250 18.750 17.875 24.170 7.3328 1096 50.000 56.250 18.750 20.054 25.293 7.4349 1097 56.250 56.250 18.750 22.605 26.609 7.5545 1098 62.500 56.250 18.750 25.544 28.124 7.6922 1099 68.750 56.250 18.750 28.888 29.848 7.8489 1100 75.000 56.250 18.750 32.649 31.788 8.0251 1101 81.250 56.250 18.750 36.843 33.950 8.2216 1102 87.500 56.250 18.750 41.482 36.342 8.4390 1103 93.750 56.250 18.750 46.578 38.969 8.6778 1104 100.00 56.250 18.750 52.145 41.839 8.9387 1105 0.0000 62.500 18.750 13.863 25.884 7.8751 1106 6.2500 62.500 18.750 14.074 25.993 7.8849 1107 12.500 62.500 18.750 14.449 26.187 7.9025 1108 18.750 62.500 18.750 15.062 26.502 7.9312 1109 25.000 62.500 18.750 15.941 26.955 7.9724 1110 31.250 62.500 18.750 17.113 27.560 8.0273 1111 37.500 62.500 18.750 18.600 28.327 8.0970 1112 43.750 62.500 18.750 20.424 29.267 8.1825 1113 50.000 62.500 18.750 22.603 30.390 8.2846 1114 56.250 62.500 18.750 25.154 31.706 8.4041 1115 62.500 62.500 18.750 28.093 33.221 8.5419 1116 68.750 62.500 18.750 31.436 34.945 8.6985 1117 75.000 62.500 18.750 35.198 36.885 8.8748 1118 81.250 62.500 18.750 39.392 39.047 9.0713 1119 87.500 62.500 18.750 44.031 41.439 9.2887 1120 93.750 62.500 18.750 49.127 44.067 9.5275 1121 100.00 62.500 18.750 54.694 46.937 9.7883 1122 0.0000 68.750 18.750 16.763 31.682 8.8414 1123 6.2500 68.750 18.750 16.973 31.790 8.8513 1124 12.500 68.750 18.750 17.348 31.984 8.8689 1125 18.750 68.750 18.750 17.961 32.300 8.8976 1126 25.000 68.750 18.750 18.840 32.753 8.9388 1127 31.250 68.750 18.750 20.012 33.357 8.9937 1128 37.500 68.750 18.750 21.500 34.124 9.0634 1129 43.750 68.750 18.750 23.323 35.065 9.1489 1130 50.000 68.750 18.750 25.502 36.188 9.2510 1131 56.250 68.750 18.750 28.053 37.503 9.3705 1132 62.500 68.750 18.750 30.992 39.019 9.5082 1133 68.750 68.750 18.750 34.336 40.743 9.6649 1134 75.000 68.750 18.750 38.097 42.682 9.8411 1135 81.250 68.750 18.750 42.291 44.844 10.038 1136 87.500 68.750 18.750 46.930 47.236 10.255 1137 93.750 68.750 18.750 52.026 49.864 10.494 1138 100.00 68.750 18.750 57.593 52.734 10.755 1139 0.0000 75.000 18.750 20.024 38.205 9.9287 1140 6.2500 75.000 18.750 20.235 38.313 9.9386 1141 12.500 75.000 18.750 20.610 38.507 9.9562 1142 18.750 75.000 18.750 21.222 38.822 9.9849 1143 25.000 75.000 18.750 22.102 39.276 10.026 1144 31.250 75.000 18.750 23.274 39.880 10.081 1145 37.500 75.000 18.750 24.761 40.647 10.151 1146 43.750 75.000 18.750 26.585 41.587 10.236 1147 50.000 75.000 18.750 28.764 42.711 10.338 1148 56.250 75.000 18.750 31.315 44.026 10.458 1149 62.500 75.000 18.750 34.254 45.541 10.596 1150 68.750 75.000 18.750 37.597 47.265 10.752 1151 75.000 75.000 18.750 41.359 49.205 10.928 1152 81.250 75.000 18.750 45.553 51.367 11.125 1153 87.500 75.000 18.750 50.192 53.759 11.342 1154 93.750 75.000 18.750 55.288 56.387 11.581 1155 100.00 75.000 18.750 60.855 59.257 11.842 1156 0.0000 81.250 18.750 23.661 45.476 11.141 1157 6.2500 81.250 18.750 23.871 45.585 11.151 1158 12.500 81.250 18.750 24.247 45.779 11.168 1159 18.750 81.250 18.750 24.859 46.094 11.197 1160 25.000 81.250 18.750 25.738 46.547 11.238 1161 31.250 81.250 18.750 26.910 47.152 11.293 1162 37.500 81.250 18.750 28.398 47.919 11.363 1163 43.750 81.250 18.750 30.222 48.859 11.448 1164 50.000 81.250 18.750 32.400 49.982 11.550 1165 56.250 81.250 18.750 34.951 51.298 11.670 1166 62.500 81.250 18.750 37.891 52.813 11.808 1167 68.750 81.250 18.750 41.234 54.537 11.964 1168 75.000 81.250 18.750 44.995 56.477 12.141 1169 81.250 81.250 18.750 49.189 58.639 12.337 1170 87.500 81.250 18.750 53.828 61.031 12.554 1171 93.750 81.250 18.750 58.925 63.659 12.793 1172 100.00 81.250 18.750 64.491 66.529 13.054 1173 0.0000 87.500 18.750 27.683 53.520 12.482 1174 6.2500 87.500 18.750 27.894 53.629 12.492 1175 12.500 87.500 18.750 28.269 53.822 12.509 1176 18.750 87.500 18.750 28.881 54.138 12.538 1177 25.000 87.500 18.750 29.761 54.591 12.579 1178 31.250 87.500 18.750 30.933 55.196 12.634 1179 37.500 87.500 18.750 32.420 55.963 12.704 1180 43.750 87.500 18.750 34.244 56.903 12.789 1181 50.000 87.500 18.750 36.423 58.026 12.891 1182 56.250 87.500 18.750 38.974 59.342 13.011 1183 62.500 87.500 18.750 41.913 60.857 13.149 1184 68.750 87.500 18.750 45.256 62.581 13.305 1185 75.000 87.500 18.750 49.018 64.521 13.481 1186 81.250 87.500 18.750 53.212 66.683 13.678 1187 87.500 87.500 18.750 57.850 69.075 13.895 1188 93.750 87.500 18.750 62.947 71.702 14.134 1189 100.00 87.500 18.750 68.514 74.572 14.395 1190 0.0000 93.750 18.750 32.103 62.358 13.955 1191 6.2500 93.750 18.750 32.313 62.466 13.965 1192 12.500 93.750 18.750 32.689 62.660 13.982 1193 18.750 93.750 18.750 33.301 62.976 14.011 1194 25.000 93.750 18.750 34.180 63.429 14.052 1195 31.250 93.750 18.750 35.352 64.033 14.107 1196 37.500 93.750 18.750 36.840 64.800 14.177 1197 43.750 93.750 18.750 38.663 65.741 14.262 1198 50.000 93.750 18.750 40.842 66.864 14.364 1199 56.250 93.750 18.750 43.393 68.179 14.484 1200 62.500 93.750 18.750 46.333 69.695 14.622 1201 68.750 93.750 18.750 49.676 71.419 14.778 1202 75.000 93.750 18.750 53.437 73.358 14.955 1203 81.250 93.750 18.750 57.631 75.520 15.151 1204 87.500 93.750 18.750 62.270 77.912 15.368 1205 93.750 93.750 18.750 67.367 80.540 15.607 1206 100.00 93.750 18.750 72.933 83.410 15.868 1207 0.0000 100.00 18.750 36.930 72.010 15.564 1208 6.2500 100.00 18.750 37.140 72.119 15.574 1209 12.500 100.00 18.750 37.516 72.312 15.591 1210 18.750 100.00 18.750 38.128 72.628 15.620 1211 25.000 100.00 18.750 39.007 73.081 15.661 1212 31.250 100.00 18.750 40.179 73.686 15.716 1213 37.500 100.00 18.750 41.667 74.453 15.786 1214 43.750 100.00 18.750 43.490 75.393 15.871 1215 50.000 100.00 18.750 45.669 76.516 15.973 1216 56.250 100.00 18.750 48.220 77.832 16.093 1217 62.500 100.00 18.750 51.159 79.347 16.231 1218 68.750 100.00 18.750 54.503 81.071 16.387 1219 75.000 100.00 18.750 58.264 83.010 16.564 1220 81.250 100.00 18.750 62.458 85.173 16.760 1221 87.500 100.00 18.750 67.097 87.565 16.977 1222 93.750 100.00 18.750 72.193 90.192 17.216 1223 100.00 100.00 18.750 77.760 93.062 17.477 1224 6.2500 0.0000 25.000 2.1197 1.4722 5.7988 1225 12.500 0.0000 25.000 2.4951 1.6657 5.8164 1226 18.750 0.0000 25.000 3.1073 1.9814 5.8451 1227 25.000 0.0000 25.000 3.9865 2.4347 5.8863 1228 31.250 0.0000 25.000 5.1585 3.0390 5.9412 1229 37.500 0.0000 25.000 6.6462 3.8060 6.0109 1230 43.750 0.0000 25.000 8.4699 4.7463 6.0963 1231 50.000 0.0000 25.000 10.649 5.8697 6.1984 1232 56.250 0.0000 25.000 13.199 7.1849 6.3180 1233 62.500 0.0000 25.000 16.139 8.7005 6.4557 1234 68.750 0.0000 25.000 19.482 10.424 6.6124 1235 75.000 0.0000 25.000 23.244 12.364 6.7886 1236 81.250 0.0000 25.000 27.438 14.526 6.9851 1237 87.500 0.0000 25.000 32.076 16.918 7.2025 1238 93.750 0.0000 25.000 37.173 19.546 7.4413 1239 93.750 6.2500 25.000 37.355 19.911 7.5022 1240 93.750 12.500 25.000 37.681 20.562 7.6107 1241 6.2500 6.2500 25.000 2.3023 1.8372 5.8596 1242 12.500 6.2500 25.000 2.6777 2.0307 5.8772 1243 18.750 6.2500 25.000 3.2898 2.3464 5.9059 1244 25.000 6.2500 25.000 4.1690 2.7997 5.9471 1245 31.250 6.2500 25.000 5.3411 3.4040 6.0020 1246 37.500 6.2500 25.000 6.8287 4.1710 6.0717 1247 43.750 6.2500 25.000 8.6525 5.1114 6.1572 1248 50.000 6.2500 25.000 10.831 6.2347 6.2593 1249 56.250 6.2500 25.000 13.382 7.5499 6.3788 1250 62.500 6.2500 25.000 16.321 9.0655 6.5165 1251 68.750 6.2500 25.000 19.665 10.789 6.6732 1252 75.000 6.2500 25.000 23.426 12.729 6.8495 1253 81.250 6.2500 25.000 27.620 14.891 7.0460 1254 87.500 6.2500 25.000 32.259 17.283 7.2633 1255 100.00 0.0000 25.000 42.739 22.416 7.7021 1256 100.00 6.2500 25.000 42.922 22.781 7.7630 1257 100.00 12.500 25.000 43.247 23.432 7.8715 1258 6.2500 12.500 25.000 2.6278 2.4881 5.9681 1259 12.500 12.500 25.000 3.0032 2.6817 5.9857 1260 18.750 12.500 25.000 3.6153 2.9973 6.0144 1261 25.000 12.500 25.000 4.4946 3.4507 6.0556 1262 31.250 12.500 25.000 5.6666 4.0550 6.1105 1263 37.500 12.500 25.000 7.1542 4.8220 6.1802 1264 43.750 12.500 25.000 8.9780 5.7623 6.2657 1265 50.000 12.500 25.000 11.157 6.8856 6.3678 1266 56.250 12.500 25.000 13.708 8.2009 6.4873 1267 62.500 12.500 25.000 16.647 9.7165 6.6250 1268 68.750 12.500 25.000 19.990 11.440 6.7817 1269 75.000 12.500 25.000 23.752 13.380 6.9580 1270 81.250 12.500 25.000 27.946 15.542 7.1545 1271 87.500 12.500 25.000 32.584 17.934 7.3718 1272 0.0000 6.2500 25.000 2.0918 1.7287 5.8498 1273 0.0000 12.500 25.000 2.4173 2.3796 5.9583 1274 0.0000 18.750 25.000 2.9481 3.4411 6.1352 1275 6.2500 18.750 25.000 3.1586 3.5497 6.1451 1276 12.500 18.750 25.000 3.5340 3.7432 6.1627 1277 18.750 18.750 25.000 4.1462 4.0588 6.1914 1278 25.000 18.750 25.000 5.0254 4.5122 6.2325 1279 31.250 18.750 25.000 6.1974 5.1165 6.2875 1280 37.500 18.750 25.000 7.6851 5.8835 6.3572 1281 43.750 18.750 25.000 9.5088 6.8238 6.4426 1282 50.000 18.750 25.000 11.687 7.9471 6.5447 1283 56.250 18.750 25.000 14.238 9.2624 6.6643 1284 62.500 18.750 25.000 17.178 10.778 6.8020 1285 68.750 18.750 25.000 20.521 12.502 6.9587 1286 75.000 18.750 25.000 24.283 14.441 7.1349 1287 81.250 18.750 25.000 28.476 16.604 7.3314 1288 87.500 18.750 25.000 33.115 18.995 7.5488 1289 93.750 18.750 25.000 38.212 21.623 7.7876 1290 0.0000 25.000 18.750 3.3257 4.8118 4.3624 1291 0.0000 25.000 25.000 3.7105 4.9657 6.3893 1292 6.2500 25.000 25.000 3.9210 5.0742 6.3992 1293 12.500 25.000 25.000 4.2964 5.2678 6.4168 1294 18.750 25.000 25.000 4.9086 5.5834 6.4455 1295 31.250 25.000 25.000 6.9598 6.6410 6.5416 1296 37.500 25.000 25.000 8.4474 7.4081 6.6113 1297 43.750 25.000 25.000 10.271 8.3484 6.6968 1298 50.000 25.000 25.000 12.450 9.4717 6.7989 1299 56.250 25.000 25.000 15.001 10.787 6.9184 1300 62.500 25.000 25.000 17.940 12.303 7.0561 1301 68.750 25.000 25.000 21.284 14.026 7.2128 1302 75.000 25.000 25.000 25.045 15.966 7.3890 1303 81.250 25.000 25.000 29.239 18.128 7.5856 1304 87.500 25.000 25.000 33.878 20.520 7.8029 1305 93.750 25.000 25.000 38.974 23.148 8.0417 1306 100.00 25.000 25.000 44.541 26.018 8.3026 1307 0.0000 31.250 25.000 4.7268 6.9980 6.7281 1308 6.2500 31.250 25.000 4.9373 7.1066 6.7380 1309 12.500 31.250 25.000 5.3127 7.3001 6.7556 1310 18.750 31.250 25.000 5.9249 7.6158 6.7843 1311 25.000 31.250 25.000 6.8041 8.0691 6.8255 1312 31.250 31.250 25.000 7.9761 8.6734 6.8804 1313 37.500 31.250 25.000 9.4638 9.4404 6.9501 1314 43.750 31.250 25.000 11.288 10.381 7.0355 1315 50.000 31.250 25.000 13.466 11.504 7.1376 1316 56.250 31.250 25.000 16.017 12.819 7.2572 1317 62.500 31.250 25.000 18.957 14.335 7.3949 1318 68.750 31.250 25.000 22.300 16.059 7.5516 1319 75.000 31.250 25.000 26.061 17.998 7.7278 1320 81.250 31.250 25.000 30.255 20.161 7.9243 1321 87.500 31.250 25.000 34.894 22.552 8.1417 1322 93.750 31.250 25.000 39.991 25.180 8.3805 1323 100.00 31.250 25.000 45.557 28.050 8.6414 1324 0.0000 37.500 25.000 6.0168 9.5776 7.1581 1325 6.2500 37.500 25.000 6.2273 9.6862 7.1680 1326 12.500 37.500 25.000 6.6027 9.8797 7.1856 1327 18.750 37.500 25.000 7.2149 10.195 7.2143 1328 25.000 37.500 25.000 8.0941 10.649 7.2555 1329 31.250 37.500 25.000 9.2661 11.253 7.3104 1330 37.500 37.500 25.000 10.754 12.020 7.3801 1331 43.750 37.500 25.000 12.577 12.960 7.4655 1332 50.000 37.500 25.000 14.756 14.084 7.5676 1333 56.250 37.500 25.000 17.307 15.399 7.6872 1334 62.500 37.500 25.000 20.247 16.915 7.8249 1335 68.750 37.500 25.000 23.590 18.638 7.9816 1336 75.000 37.500 25.000 27.351 20.578 8.1578 1337 81.250 37.500 25.000 31.545 22.740 8.3543 1338 87.500 37.500 25.000 36.184 25.132 8.5717 1339 93.750 37.500 25.000 41.281 27.760 8.8105 1340 100.00 37.500 25.000 46.847 30.630 9.0713 1341 0.0000 43.750 25.000 7.5982 12.740 7.6853 1342 6.2500 43.750 25.000 7.8087 12.849 7.6951 1343 12.500 43.750 25.000 8.1841 13.042 7.7127 1344 18.750 43.750 25.000 8.7963 13.358 7.7414 1345 25.000 43.750 25.000 9.6755 13.811 7.7826 1346 31.250 43.750 25.000 10.848 14.415 7.8375 1347 37.500 43.750 25.000 12.335 15.182 7.9072 1348 43.750 43.750 25.000 14.159 16.123 7.9927 1349 50.000 43.750 25.000 16.338 17.246 8.0948 1350 56.250 43.750 25.000 18.888 18.561 8.2143 1351 62.500 43.750 25.000 21.828 20.077 8.3520 1352 68.750 43.750 25.000 25.171 21.801 8.5087 1353 75.000 43.750 25.000 28.933 23.740 8.6850 1354 81.250 43.750 25.000 33.127 25.903 8.8815 1355 87.500 43.750 25.000 37.765 28.294 9.0988 1356 93.750 43.750 25.000 42.862 30.922 9.3377 1357 100.00 43.750 25.000 48.428 33.792 9.5985 1358 0.0000 50.000 25.000 9.4874 16.518 8.3150 1359 6.2500 50.000 25.000 9.6979 16.626 8.3249 1360 12.500 50.000 25.000 10.073 16.820 8.3424 1361 18.750 50.000 25.000 10.685 17.136 8.3711 1362 25.000 50.000 25.000 11.565 17.589 8.4123 1363 31.250 50.000 25.000 12.737 18.193 8.4672 1364 37.500 50.000 25.000 14.224 18.960 8.5370 1365 43.750 50.000 25.000 16.048 19.901 8.6224 1366 50.000 50.000 25.000 18.227 21.024 8.7245 1367 56.250 50.000 25.000 20.778 22.339 8.8440 1368 62.500 50.000 25.000 23.717 23.855 8.9818 1369 68.750 50.000 25.000 27.060 25.579 9.1384 1370 75.000 50.000 25.000 30.822 27.518 9.3147 1371 81.250 50.000 25.000 35.016 29.680 9.5112 1372 87.500 50.000 25.000 39.655 32.072 9.7286 1373 93.750 50.000 25.000 44.751 34.700 9.9674 1374 100.00 50.000 25.000 50.318 37.570 10.228 1375 0.0000 56.250 25.000 11.699 20.941 9.0523 1376 6.2500 56.250 25.000 11.910 21.050 9.0622 1377 12.500 56.250 25.000 12.285 21.243 9.0798 1378 18.750 56.250 25.000 12.897 21.559 9.1085 1379 25.000 56.250 25.000 13.777 22.012 9.1497 1380 31.250 56.250 25.000 14.949 22.617 9.2046 1381 37.500 56.250 25.000 16.436 23.384 9.2743 1382 43.750 56.250 25.000 18.260 24.324 9.3598 1383 50.000 56.250 25.000 20.439 25.447 9.4618 1384 56.250 56.250 25.000 22.990 26.763 9.5814 1385 62.500 56.250 25.000 25.929 28.278 9.7191 1386 68.750 56.250 25.000 29.272 30.002 9.8758 1387 75.000 56.250 25.000 33.034 31.941 10.052 1388 81.250 56.250 25.000 37.228 34.104 10.249 1389 87.500 56.250 25.000 41.867 36.495 10.466 1390 93.750 56.250 25.000 46.963 39.123 10.705 1391 100.00 56.250 25.000 52.530 41.993 10.966 1392 0.0000 62.500 25.000 14.248 26.038 9.9020 1393 6.2500 62.500 25.000 14.459 26.147 9.9118 1394 12.500 62.500 25.000 14.834 26.340 9.9294 1395 18.750 62.500 25.000 15.446 26.656 9.9581 1396 25.000 62.500 25.000 16.326 27.109 9.9993 1397 31.250 62.500 25.000 17.498 27.714 10.054 1398 37.500 62.500 25.000 18.985 28.481 10.124 1399 43.750 62.500 25.000 20.809 29.421 10.209 1400 50.000 62.500 25.000 22.988 30.544 10.311 1401 56.250 62.500 25.000 25.539 31.860 10.431 1402 62.500 62.500 25.000 28.478 33.375 10.569 1403 68.750 62.500 25.000 31.821 35.099 10.725 1404 75.000 62.500 25.000 35.583 37.039 10.902 1405 81.250 62.500 25.000 39.777 39.201 11.098 1406 87.500 62.500 25.000 44.415 41.593 11.316 1407 93.750 62.500 25.000 49.512 44.220 11.554 1408 100.00 62.500 25.000 55.078 47.090 11.815 1409 0.0000 68.750 25.000 17.147 31.836 10.868 1410 6.2500 68.750 25.000 17.358 31.944 10.878 1411 12.500 68.750 25.000 17.733 32.138 10.896 1412 18.750 68.750 25.000 18.345 32.453 10.924 1413 25.000 68.750 25.000 19.225 32.907 10.966 1414 31.250 68.750 25.000 20.397 33.511 11.021 1415 37.500 68.750 25.000 21.884 34.278 11.090 1416 43.750 68.750 25.000 23.708 35.218 11.176 1417 50.000 68.750 25.000 25.887 36.342 11.278 1418 56.250 68.750 25.000 28.438 37.657 11.397 1419 62.500 68.750 25.000 31.377 39.173 11.535 1420 68.750 68.750 25.000 34.720 40.896 11.692 1421 75.000 68.750 25.000 38.482 42.836 11.868 1422 81.250 68.750 25.000 42.676 44.998 12.065 1423 87.500 68.750 25.000 47.315 47.390 12.282 1424 93.750 68.750 25.000 52.411 50.018 12.521 1425 100.00 68.750 25.000 57.978 52.888 12.782 1426 0.0000 75.000 25.000 20.409 38.358 11.956 1427 6.2500 75.000 25.000 20.620 38.467 11.965 1428 12.500 75.000 25.000 20.995 38.661 11.983 1429 18.750 75.000 25.000 21.607 38.976 12.012 1430 25.000 75.000 25.000 22.486 39.429 12.053 1431 31.250 75.000 25.000 23.659 40.034 12.108 1432 37.500 75.000 25.000 25.146 40.801 12.178 1433 43.750 75.000 25.000 26.970 41.741 12.263 1434 50.000 75.000 25.000 29.149 42.864 12.365 1435 56.250 75.000 25.000 31.699 44.180 12.485 1436 62.500 75.000 25.000 34.639 45.695 12.622 1437 68.750 75.000 25.000 37.982 47.419 12.779 1438 75.000 75.000 25.000 41.744 49.359 12.955 1439 81.250 75.000 25.000 45.938 51.521 13.152 1440 87.500 75.000 25.000 50.576 53.913 13.369 1441 93.750 75.000 25.000 55.673 56.541 13.608 1442 100.00 75.000 25.000 61.239 59.411 13.869 1443 0.0000 81.250 25.000 24.046 45.630 13.168 1444 6.2500 81.250 25.000 24.256 45.739 13.178 1445 12.500 81.250 25.000 24.632 45.932 13.195 1446 18.750 81.250 25.000 25.244 46.248 13.224 1447 25.000 81.250 25.000 26.123 46.701 13.265 1448 31.250 81.250 25.000 27.295 47.306 13.320 1449 37.500 81.250 25.000 28.783 48.073 13.390 1450 43.750 81.250 25.000 30.606 49.013 13.475 1451 50.000 81.250 25.000 32.785 50.136 13.577 1452 56.250 81.250 25.000 35.336 51.452 13.697 1453 62.500 81.250 25.000 38.275 52.967 13.835 1454 68.750 81.250 25.000 41.619 54.691 13.991 1455 75.000 81.250 25.000 45.380 56.631 14.168 1456 81.250 81.250 25.000 49.574 58.793 14.364 1457 87.500 81.250 25.000 54.213 61.185 14.581 1458 93.750 81.250 25.000 59.309 63.812 14.820 1459 100.00 81.250 25.000 64.876 66.683 15.081 1460 0.0000 87.500 25.000 28.068 53.674 14.509 1461 6.2500 87.500 25.000 28.279 53.783 14.518 1462 12.500 87.500 25.000 28.654 53.976 14.536 1463 18.750 87.500 25.000 29.266 54.292 14.565 1464 25.000 87.500 25.000 30.145 54.745 14.606 1465 31.250 87.500 25.000 31.317 55.350 14.661 1466 37.500 87.500 25.000 32.805 56.117 14.731 1467 43.750 87.500 25.000 34.629 57.057 14.816 1468 50.000 87.500 25.000 36.807 58.180 14.918 1469 56.250 87.500 25.000 39.358 59.496 15.038 1470 62.500 87.500 25.000 42.298 61.011 15.175 1471 68.750 87.500 25.000 45.641 62.735 15.332 1472 75.000 87.500 25.000 49.403 64.674 15.508 1473 81.250 87.500 25.000 53.596 66.837 15.705 1474 87.500 87.500 25.000 58.235 69.228 15.922 1475 93.750 87.500 25.000 63.332 71.856 16.161 1476 100.00 87.500 25.000 68.898 74.726 16.422 1477 0.0000 93.750 25.000 32.488 62.512 15.982 1478 6.2500 93.750 25.000 32.698 62.620 15.992 1479 12.500 93.750 25.000 33.074 62.814 16.009 1480 18.750 93.750 25.000 33.686 63.130 16.038 1481 25.000 93.750 25.000 34.565 63.583 16.079 1482 31.250 93.750 25.000 35.737 64.187 16.134 1483 37.500 93.750 25.000 37.225 64.954 16.204 1484 43.750 93.750 25.000 39.048 65.895 16.289 1485 50.000 93.750 25.000 41.227 67.018 16.391 1486 56.250 93.750 25.000 43.778 68.333 16.511 1487 62.500 93.750 25.000 46.717 69.849 16.649 1488 68.750 93.750 25.000 50.061 71.573 16.805 1489 75.000 93.750 25.000 53.822 73.512 16.982 1490 81.250 93.750 25.000 58.016 75.674 17.178 1491 87.500 93.750 25.000 62.655 78.066 17.395 1492 93.750 93.750 25.000 67.751 80.694 17.634 1493 100.00 93.750 25.000 73.318 83.564 17.895 1494 0.0000 100.00 25.000 37.314 72.164 17.591 1495 6.2500 100.00 25.000 37.525 72.273 17.601 1496 12.500 100.00 25.000 37.900 72.466 17.618 1497 18.750 100.00 25.000 38.512 72.782 17.647 1498 25.000 100.00 25.000 39.392 73.235 17.688 1499 31.250 100.00 25.000 40.564 73.840 17.743 1500 37.500 100.00 25.000 42.051 74.607 17.813 1501 43.750 100.00 25.000 43.875 75.547 17.898 1502 50.000 100.00 25.000 46.054 76.670 18.000 1503 56.250 100.00 25.000 48.605 77.985 18.120 1504 62.500 100.00 25.000 51.544 79.501 18.258 1505 68.750 100.00 25.000 54.887 81.225 18.414 1506 75.000 100.00 25.000 58.649 83.164 18.590 1507 81.250 100.00 25.000 62.843 85.327 18.787 1508 87.500 100.00 25.000 67.482 87.718 19.004 1509 93.750 100.00 25.000 72.578 90.346 19.243 1510 100.00 100.00 25.000 78.145 93.216 19.504 1511 6.2500 0.0000 31.250 2.6327 1.6773 8.5008 1512 12.500 0.0000 31.250 3.0081 1.8709 8.5184 1513 18.750 0.0000 31.250 3.6203 2.1865 8.5471 1514 25.000 0.0000 31.250 4.4995 2.6398 8.5883 1515 31.250 0.0000 31.250 5.6715 3.2442 8.6432 1516 37.500 0.0000 31.250 7.1592 4.0112 8.7129 1517 43.750 0.0000 31.250 8.9829 4.9515 8.7983 1518 50.000 0.0000 31.250 11.162 6.0748 8.9004 1519 56.250 0.0000 31.250 13.712 7.3901 9.0200 1520 62.500 0.0000 31.250 16.652 8.9057 9.1577 1521 68.750 0.0000 31.250 19.995 10.630 9.3144 1522 75.000 0.0000 31.250 23.757 12.569 9.4906 1523 81.250 0.0000 31.250 27.951 14.731 9.6871 1524 87.500 0.0000 31.250 32.589 17.123 9.9045 1525 93.750 0.0000 31.250 37.686 19.751 10.143 1526 93.750 6.2500 31.250 37.868 20.116 10.204 1527 0.0000 6.2500 31.250 2.6047 1.9338 8.5518 1528 6.2500 6.2500 31.250 2.8153 2.0424 8.5616 1529 12.500 6.2500 31.250 3.1907 2.2359 8.5792 1530 18.750 6.2500 31.250 3.8028 2.5515 8.6079 1531 25.000 6.2500 31.250 4.6820 3.0049 8.6491 1532 31.250 6.2500 31.250 5.8541 3.6092 8.7040 1533 37.500 6.2500 31.250 7.3417 4.3762 8.7737 1534 43.750 6.2500 31.250 9.1654 5.3165 8.8592 1535 50.000 6.2500 31.250 11.344 6.4398 8.9613 1536 56.250 6.2500 31.250 13.895 7.7551 9.0808 1537 62.500 6.2500 31.250 16.834 9.2707 9.2185 1538 68.750 6.2500 31.250 20.178 10.995 9.3752 1539 75.000 6.2500 31.250 23.939 12.934 9.5515 1540 81.250 6.2500 31.250 28.133 15.096 9.7480 1541 87.500 6.2500 31.250 32.772 17.488 9.9653 1542 100.00 0.0000 31.250 43.252 22.621 10.404 1543 100.00 6.2500 31.250 43.435 22.986 10.465 1544 100.00 12.500 31.250 43.760 23.637 10.573 1545 6.2500 12.500 31.250 3.1408 2.6933 8.6701 1546 12.500 12.500 31.250 3.5162 2.8869 8.6877 1547 18.750 12.500 31.250 4.1283 3.2025 8.7164 1548 25.000 12.500 31.250 5.0075 3.6558 8.7576 1549 31.250 12.500 31.250 6.1796 4.2601 8.8125 1550 37.500 12.500 31.250 7.6672 5.0272 8.8822 1551 43.750 12.500 31.250 9.4910 5.9675 8.9677 1552 50.000 12.500 31.250 11.670 7.0908 9.0698 1553 56.250 12.500 31.250 14.221 8.4061 9.1893 1554 62.500 12.500 31.250 17.160 9.9217 9.3271 1555 68.750 12.500 31.250 20.503 11.645 9.4837 1556 75.000 12.500 31.250 24.265 13.585 9.6600 1557 81.250 12.500 31.250 28.459 15.747 9.8565 1558 87.500 12.500 31.250 33.097 18.139 10.074 1559 93.750 12.500 31.250 38.194 20.767 10.313 1560 100.00 12.500 37.500 44.412 23.897 14.003 1561 0.0000 18.750 31.250 3.4611 3.6463 8.8372 1562 6.2500 18.750 31.250 3.6716 3.7548 8.8471 1563 12.500 18.750 31.250 4.0470 3.9484 8.8647 1564 18.750 18.750 31.250 4.6592 4.2640 8.8934 1565 25.000 18.750 31.250 5.5384 4.7173 8.9346 1566 31.250 18.750 31.250 6.7104 5.3216 8.9895 1567 37.500 18.750 31.250 8.1981 6.0887 9.0592 1568 43.750 18.750 31.250 10.022 7.0290 9.1446 1569 50.000 18.750 31.250 12.200 8.1523 9.2467 1570 56.250 18.750 31.250 14.751 9.4676 9.3663 1571 62.500 18.750 31.250 17.691 10.983 9.5040 1572 68.750 18.750 31.250 21.034 12.707 9.6607 1573 75.000 18.750 31.250 24.796 14.646 9.8369 1574 81.250 18.750 31.250 28.989 16.809 10.033 1575 87.500 18.750 31.250 33.628 19.201 10.251 1576 93.750 18.750 31.250 38.725 21.828 10.490 1577 100.00 18.750 31.250 44.291 24.698 10.750 1578 0.0000 25.000 31.250 4.2235 5.1708 9.0913 1579 6.2500 25.000 31.250 4.4340 5.2794 9.1012 1580 12.500 25.000 31.250 4.8094 5.4729 9.1188 1581 18.750 25.000 31.250 5.4216 5.7886 9.1475 1582 25.000 25.000 31.250 6.3008 6.2419 9.1887 1583 31.250 25.000 31.250 7.4728 6.8462 9.2436 1584 37.500 25.000 31.250 8.9604 7.6132 9.3133 1585 43.750 25.000 31.250 10.784 8.5536 9.3988 1586 50.000 25.000 31.250 12.963 9.6769 9.5009 1587 56.250 25.000 31.250 15.514 10.992 9.6204 1588 62.500 25.000 31.250 18.453 12.508 9.7581 1589 68.750 25.000 31.250 21.797 14.232 9.9148 1590 75.000 25.000 31.250 25.558 16.171 10.091 1591 81.250 25.000 31.250 29.752 18.333 10.288 1592 87.500 25.000 31.250 34.391 20.725 10.505 1593 93.750 25.000 31.250 39.487 23.353 10.744 1594 100.00 25.000 31.250 45.054 26.223 11.005 1595 0.0000 31.250 31.250 5.2398 7.2032 9.4301 1596 6.2500 31.250 31.250 5.4503 7.3117 9.4400 1597 12.500 31.250 31.250 5.8257 7.5053 9.4576 1598 18.750 31.250 31.250 6.4379 7.8209 9.4863 1599 25.000 31.250 31.250 7.3171 8.2743 9.5275 1600 37.500 31.250 31.250 9.9768 9.6456 9.6521 1601 43.750 31.250 31.250 11.801 10.586 9.7375 1602 50.000 31.250 31.250 13.979 11.709 9.8396 1603 56.250 31.250 31.250 16.530 13.024 9.9592 1604 62.500 31.250 31.250 19.470 14.540 10.097 1605 68.750 31.250 31.250 22.813 16.264 10.254 1606 75.000 31.250 31.250 26.574 18.203 10.430 1607 81.250 31.250 31.250 30.768 20.366 10.626 1608 87.500 31.250 31.250 35.407 22.757 10.844 1609 93.750 31.250 31.250 40.504 25.385 11.083 1610 100.00 31.250 31.250 46.070 28.255 11.343 1611 0.0000 37.500 31.250 6.5298 9.7828 9.8601 1612 6.2500 37.500 31.250 6.7403 9.8913 9.8700 1613 12.500 37.500 31.250 7.1157 10.085 9.8876 1614 18.750 37.500 31.250 7.7279 10.401 9.9163 1615 25.000 37.500 31.250 8.6071 10.854 9.9575 1616 31.250 37.500 31.250 9.7791 11.458 10.012 1617 37.500 37.500 31.250 11.267 12.225 10.082 1618 43.750 37.500 31.250 13.090 13.166 10.168 1619 50.000 37.500 31.250 15.269 14.289 10.270 1620 56.250 37.500 31.250 17.820 15.604 10.389 1621 62.500 37.500 31.250 20.760 17.120 10.527 1622 68.750 37.500 31.250 24.103 18.844 10.684 1623 75.000 37.500 31.250 27.864 20.783 10.860 1624 81.250 37.500 31.250 32.058 22.945 11.056 1625 87.500 37.500 31.250 36.697 25.337 11.274 1626 93.750 37.500 31.250 41.794 27.965 11.513 1627 100.00 37.500 31.250 47.360 30.835 11.773 1628 0.0000 43.750 31.250 8.1112 12.945 10.387 1629 6.2500 43.750 31.250 8.3217 13.054 10.397 1630 12.500 43.750 31.250 8.6971 13.247 10.415 1631 18.750 43.750 31.250 9.3093 13.563 10.443 1632 25.000 43.750 31.250 10.188 14.016 10.485 1633 31.250 43.750 31.250 11.361 14.621 10.540 1634 37.500 43.750 31.250 12.848 15.388 10.609 1635 43.750 43.750 31.250 14.672 16.328 10.695 1636 50.000 43.750 31.250 16.851 17.451 10.797 1637 56.250 43.750 31.250 19.401 18.767 10.916 1638 62.500 43.750 31.250 22.341 20.282 11.054 1639 68.750 43.750 31.250 25.684 22.006 11.211 1640 75.000 43.750 31.250 29.446 23.945 11.387 1641 81.250 43.750 31.250 33.640 26.108 11.583 1642 87.500 43.750 31.250 38.278 28.499 11.801 1643 93.750 43.750 31.250 43.375 31.127 12.040 1644 100.00 43.750 31.250 48.941 33.997 12.300 1645 0.0000 50.000 31.250 10.000 16.723 11.017 1646 6.2500 50.000 31.250 10.211 16.832 11.027 1647 12.500 50.000 31.250 10.586 17.025 11.044 1648 18.750 50.000 31.250 11.198 17.341 11.073 1649 25.000 50.000 31.250 12.078 17.794 11.114 1650 31.250 50.000 31.250 13.250 18.398 11.169 1651 37.500 50.000 31.250 14.737 19.165 11.239 1652 43.750 50.000 31.250 16.561 20.106 11.324 1653 50.000 50.000 31.250 18.740 21.229 11.427 1654 56.250 50.000 31.250 21.291 22.544 11.546 1655 62.500 50.000 31.250 24.230 24.060 11.684 1656 68.750 50.000 31.250 27.573 25.784 11.840 1657 75.000 50.000 31.250 31.335 27.723 12.017 1658 81.250 50.000 31.250 35.529 29.886 12.213 1659 87.500 50.000 31.250 40.168 32.277 12.431 1660 93.750 50.000 31.250 45.264 34.905 12.669 1661 100.00 50.000 31.250 50.831 37.775 12.930 1662 0.0000 56.250 31.250 12.212 21.146 11.754 1663 6.2500 56.250 31.250 12.423 21.255 11.764 1664 12.500 56.250 31.250 12.798 21.448 11.782 1665 18.750 56.250 31.250 13.410 21.764 11.810 1666 25.000 56.250 31.250 14.290 22.217 11.852 1667 31.250 56.250 31.250 15.462 22.822 11.907 1668 37.500 56.250 31.250 16.949 23.589 11.976 1669 43.750 56.250 31.250 18.773 24.529 12.062 1670 50.000 56.250 31.250 20.952 25.652 12.164 1671 56.250 56.250 31.250 23.503 26.968 12.283 1672 62.500 56.250 31.250 26.442 28.483 12.421 1673 68.750 56.250 31.250 29.785 30.207 12.578 1674 75.000 56.250 31.250 33.547 32.147 12.754 1675 81.250 56.250 31.250 37.741 34.309 12.951 1676 87.500 56.250 31.250 42.380 36.701 13.168 1677 93.750 56.250 31.250 47.476 39.328 13.407 1678 100.00 56.250 31.250 53.043 42.199 13.668 1679 0.0000 62.500 31.250 14.761 26.244 12.604 1680 6.2500 62.500 31.250 14.972 26.352 12.614 1681 12.500 62.500 31.250 15.347 26.546 12.631 1682 18.750 62.500 31.250 15.959 26.861 12.660 1683 25.000 62.500 31.250 16.839 27.315 12.701 1684 31.250 62.500 31.250 18.011 27.919 12.756 1685 37.500 62.500 31.250 19.498 28.686 12.826 1686 43.750 62.500 31.250 21.322 29.626 12.911 1687 50.000 62.500 31.250 23.501 30.750 13.013 1688 56.250 62.500 31.250 26.052 32.065 13.133 1689 62.500 62.500 31.250 28.991 33.580 13.271 1690 68.750 62.500 31.250 32.334 35.304 13.427 1691 75.000 62.500 31.250 36.096 37.244 13.604 1692 81.250 62.500 31.250 40.290 39.406 13.800 1693 87.500 62.500 31.250 44.928 41.798 14.018 1694 93.750 62.500 31.250 50.025 44.426 14.256 1695 100.00 62.500 31.250 55.591 47.296 14.517 1696 0.0000 68.750 31.250 17.660 32.041 13.570 1697 6.2500 68.750 31.250 17.871 32.149 13.580 1698 12.500 68.750 31.250 18.246 32.343 13.598 1699 18.750 68.750 31.250 18.858 32.659 13.626 1700 25.000 68.750 31.250 19.738 33.112 13.668 1701 31.250 68.750 31.250 20.910 33.716 13.723 1702 37.500 68.750 31.250 22.397 34.483 13.792 1703 43.750 68.750 31.250 24.221 35.424 13.878 1704 50.000 68.750 31.250 26.400 36.547 13.980 1705 56.250 68.750 31.250 28.951 37.862 14.099 1706 62.500 68.750 31.250 31.890 39.378 14.237 1707 68.750 68.750 31.250 35.233 41.102 14.394 1708 75.000 68.750 31.250 38.995 43.041 14.570 1709 81.250 68.750 31.250 43.189 45.203 14.767 1710 87.500 68.750 31.250 47.828 47.595 14.984 1711 93.750 68.750 31.250 52.924 50.223 15.223 1712 100.00 68.750 31.250 58.491 53.093 15.484 1713 0.0000 75.000 31.250 20.922 38.564 14.658 1714 6.2500 75.000 31.250 21.133 38.672 14.667 1715 12.500 75.000 31.250 21.508 38.866 14.685 1716 18.750 75.000 31.250 22.120 39.181 14.714 1717 25.000 75.000 31.250 22.999 39.635 14.755 1718 31.250 75.000 31.250 24.172 40.239 14.810 1719 37.500 75.000 31.250 25.659 41.006 14.880 1720 43.750 75.000 31.250 27.483 41.946 14.965 1721 50.000 75.000 31.250 29.662 43.070 15.067 1722 56.250 75.000 31.250 32.212 44.385 15.187 1723 62.500 75.000 31.250 35.152 45.900 15.324 1724 68.750 75.000 31.250 38.495 47.624 15.481 1725 75.000 75.000 31.250 42.257 49.564 15.657 1726 81.250 75.000 31.250 46.450 51.726 15.854 1727 87.500 75.000 31.250 51.089 54.118 16.071 1728 93.750 75.000 31.250 56.186 56.746 16.310 1729 100.00 75.000 31.250 61.752 59.616 16.571 1730 0.0000 81.250 31.250 24.559 45.836 15.870 1731 6.2500 81.250 31.250 24.769 45.944 15.880 1732 12.500 81.250 31.250 25.145 46.138 15.897 1733 18.750 81.250 31.250 25.757 46.453 15.926 1734 25.000 81.250 31.250 26.636 46.907 15.967 1735 31.250 81.250 31.250 27.808 47.511 16.022 1736 37.500 81.250 31.250 29.296 48.278 16.092 1737 43.750 81.250 31.250 31.119 49.218 16.177 1738 50.000 81.250 31.250 33.298 50.342 16.279 1739 56.250 81.250 31.250 35.849 51.657 16.399 1740 62.500 81.250 31.250 38.788 53.172 16.537 1741 68.750 81.250 31.250 42.132 54.896 16.693 1742 75.000 81.250 31.250 45.893 56.836 16.869 1743 81.250 81.250 31.250 50.087 58.998 17.066 1744 87.500 81.250 31.250 54.726 61.390 17.283 1745 93.750 81.250 31.250 59.822 64.018 17.522 1746 100.00 81.250 31.250 65.389 66.888 17.783 1747 0.0000 87.500 31.250 28.581 53.879 17.211 1748 6.2500 87.500 31.250 28.792 53.988 17.221 1749 12.500 87.500 31.250 29.167 54.181 17.238 1750 18.750 87.500 31.250 29.779 54.497 17.267 1751 25.000 87.500 31.250 30.658 54.950 17.308 1752 31.250 87.500 31.250 31.830 55.555 17.363 1753 37.500 87.500 31.250 33.318 56.322 17.433 1754 43.750 87.500 31.250 35.142 57.262 17.518 1755 50.000 87.500 31.250 37.321 58.385 17.620 1756 56.250 87.500 31.250 39.871 59.701 17.740 1757 62.500 87.500 31.250 42.811 61.216 17.877 1758 68.750 87.500 31.250 46.154 62.940 18.034 1759 75.000 87.500 31.250 49.916 64.880 18.210 1760 81.250 87.500 31.250 54.109 67.042 18.407 1761 87.500 87.500 31.250 58.748 69.434 18.624 1762 93.750 87.500 31.250 63.845 72.061 18.863 1763 100.00 87.500 31.250 69.411 74.932 19.124 1764 0.0000 93.750 31.250 33.001 62.717 18.684 1765 6.2500 93.750 31.250 33.211 62.826 18.694 1766 12.500 93.750 31.250 33.587 63.019 18.711 1767 18.750 93.750 31.250 34.199 63.335 18.740 1768 25.000 93.750 31.250 35.078 63.788 18.781 1769 31.250 93.750 31.250 36.250 64.392 18.836 1770 37.500 93.750 31.250 37.738 65.159 18.906 1771 43.750 93.750 31.250 39.561 66.100 18.991 1772 50.000 93.750 31.250 41.740 67.223 19.093 1773 56.250 93.750 31.250 44.291 68.538 19.213 1774 62.500 93.750 31.250 47.230 70.054 19.351 1775 68.750 93.750 31.250 50.574 71.778 19.507 1776 75.000 93.750 31.250 54.335 73.717 19.683 1777 81.250 93.750 31.250 58.529 75.879 19.880 1778 87.500 93.750 31.250 63.168 78.271 20.097 1779 93.750 93.750 31.250 68.264 80.899 20.336 1780 100.00 93.750 31.250 73.831 83.769 20.597 1781 0.0000 100.00 31.250 37.827 72.369 20.293 1782 6.2500 100.00 31.250 38.038 72.478 20.303 1783 12.500 100.00 31.250 38.413 72.671 20.320 1784 18.750 100.00 31.250 39.025 72.987 20.349 1785 25.000 100.00 31.250 39.905 73.440 20.390 1786 31.250 100.00 31.250 41.077 74.045 20.445 1787 37.500 100.00 31.250 42.564 74.812 20.515 1788 43.750 100.00 31.250 44.388 75.752 20.600 1789 50.000 100.00 31.250 46.567 76.875 20.702 1790 56.250 100.00 31.250 49.118 78.191 20.822 1791 62.500 100.00 31.250 52.057 79.706 20.960 1792 68.750 100.00 31.250 55.400 81.430 21.116 1793 75.000 100.00 31.250 59.162 83.370 21.292 1794 81.250 100.00 31.250 63.356 85.532 21.489 1795 87.500 100.00 31.250 67.995 87.924 21.706 1796 93.750 100.00 31.250 73.091 90.551 21.945 1797 100.00 100.00 31.250 78.658 93.421 22.206 1798 6.2500 0.0000 37.500 3.2838 1.9377 11.930 1799 12.500 0.0000 37.500 3.6592 2.1313 11.948 1800 18.750 0.0000 37.500 4.2714 2.4469 11.977 1801 25.000 0.0000 37.500 5.1506 2.9003 12.018 1802 31.250 0.0000 37.500 6.3227 3.5046 12.073 1803 37.500 0.0000 37.500 7.8103 4.2716 12.142 1804 43.750 0.0000 37.500 9.6340 5.2119 12.228 1805 50.000 0.0000 37.500 11.813 6.3352 12.330 1806 56.250 0.0000 37.500 14.364 7.6505 12.450 1807 62.500 0.0000 37.500 17.303 9.1661 12.587 1808 68.750 0.0000 37.500 20.646 10.890 12.744 1809 75.000 0.0000 37.500 24.408 12.829 12.920 1810 81.250 0.0000 37.500 28.602 14.992 13.117 1811 87.500 0.0000 37.500 33.240 17.383 13.334 1812 93.750 0.0000 37.500 38.337 20.011 13.573 1813 93.750 6.2500 37.500 38.520 20.376 13.634 1814 0.0000 6.2500 37.500 3.2559 2.1942 11.981 1815 6.2500 6.2500 37.500 3.4664 2.3028 11.991 1816 12.500 6.2500 37.500 3.8418 2.4963 12.009 1817 18.750 6.2500 37.500 4.4539 2.8120 12.037 1818 25.000 6.2500 37.500 5.3332 3.2653 12.079 1819 31.250 6.2500 37.500 6.5052 3.8696 12.134 1820 37.500 6.2500 37.500 7.9928 4.6366 12.203 1821 43.750 6.2500 37.500 9.8166 5.5769 12.289 1822 50.000 6.2500 37.500 11.995 6.7003 12.391 1823 56.250 6.2500 37.500 14.546 8.0155 12.510 1824 62.500 6.2500 37.500 17.486 9.5311 12.648 1825 68.750 6.2500 37.500 20.829 11.255 12.805 1826 75.000 6.2500 37.500 24.591 13.194 12.981 1827 81.250 6.2500 37.500 28.784 15.357 13.178 1828 87.500 6.2500 37.500 33.423 17.749 13.395 1829 100.00 0.0000 37.500 43.904 22.881 13.834 1830 100.00 6.2500 37.500 44.086 23.246 13.895 1831 0.0000 12.500 37.500 3.5814 2.8452 12.090 1832 6.2500 12.500 37.500 3.7919 2.9537 12.100 1833 12.500 12.500 37.500 4.1673 3.1473 12.117 1834 18.750 12.500 37.500 4.7795 3.4629 12.146 1835 25.000 12.500 37.500 5.6587 3.9162 12.187 1836 31.250 12.500 37.500 6.8307 4.5205 12.242 1837 37.500 12.500 37.500 8.3184 5.2876 12.312 1838 43.750 12.500 37.500 10.142 6.2279 12.397 1839 50.000 12.500 37.500 12.321 7.3512 12.499 1840 56.250 12.500 37.500 14.872 8.6665 12.619 1841 62.500 12.500 37.500 17.811 10.182 12.757 1842 68.750 12.500 37.500 21.154 11.906 12.913 1843 75.000 12.500 37.500 24.916 13.845 13.090 1844 81.250 12.500 37.500 29.110 16.008 13.286 1845 87.500 12.500 37.500 33.749 18.399 13.503 1846 93.750 12.500 37.500 38.845 21.027 13.742 1847 0.0000 12.500 31.250 2.9303 2.5848 8.6603 1848 0.0000 18.750 37.500 4.1122 3.9067 12.267 1849 6.2500 18.750 37.500 4.3227 4.0152 12.277 1850 12.500 18.750 37.500 4.6981 4.2088 12.294 1851 18.750 18.750 37.500 5.3103 4.5244 12.323 1852 25.000 18.750 37.500 6.1895 4.9777 12.364 1853 31.250 18.750 37.500 7.3616 5.5821 12.419 1854 37.500 18.750 37.500 8.8492 6.3491 12.489 1855 43.750 18.750 37.500 10.673 7.2894 12.574 1856 50.000 18.750 37.500 12.852 8.4127 12.676 1857 56.250 18.750 37.500 15.402 9.7280 12.796 1858 62.500 18.750 37.500 18.342 11.244 12.934 1859 68.750 18.750 37.500 21.685 12.967 13.090 1860 75.000 18.750 37.500 25.447 14.907 13.266 1861 81.250 18.750 37.500 29.641 17.069 13.463 1862 87.500 18.750 37.500 34.279 19.461 13.680 1863 93.750 18.750 37.500 39.376 22.089 13.919 1864 100.00 18.750 37.500 44.942 24.959 14.180 1865 0.0000 25.000 37.500 4.8746 5.4313 12.521 1866 6.2500 25.000 37.500 5.0851 5.5398 12.531 1867 12.500 25.000 37.500 5.4605 5.7334 12.548 1868 18.750 25.000 37.500 6.0727 6.0490 12.577 1869 25.000 25.000 37.500 6.9519 6.5023 12.618 1870 31.250 25.000 37.500 8.1239 7.1066 12.673 1871 37.500 25.000 37.500 9.6116 7.8736 12.743 1872 43.750 25.000 37.500 11.435 8.8140 12.828 1873 50.000 25.000 37.500 13.614 9.9373 12.930 1874 56.250 25.000 37.500 16.165 11.253 13.050 1875 62.500 25.000 37.500 19.104 12.768 13.188 1876 68.750 25.000 37.500 22.448 14.492 13.344 1877 75.000 25.000 37.500 26.209 16.431 13.521 1878 81.250 25.000 37.500 30.403 18.594 13.717 1879 87.500 25.000 37.500 35.042 20.986 13.934 1880 93.750 25.000 37.500 40.138 23.613 14.173 1881 100.00 25.000 37.500 45.705 26.483 14.434 1882 0.0000 31.250 37.500 5.8909 7.4636 12.860 1883 6.2500 31.250 37.500 6.1014 7.5721 12.870 1884 12.500 31.250 37.500 6.4768 7.7657 12.887 1885 18.750 31.250 37.500 7.0890 8.0813 12.916 1886 25.000 31.250 37.500 7.9682 8.5347 12.957 1887 31.250 31.250 37.500 9.1403 9.1390 13.012 1888 37.500 31.250 37.500 10.628 9.9060 13.082 1889 43.750 31.250 37.500 12.452 10.846 13.167 1890 50.000 31.250 37.500 14.630 11.970 13.269 1891 56.250 31.250 37.500 17.181 13.285 13.389 1892 62.500 31.250 37.500 20.121 14.801 13.526 1893 68.750 31.250 37.500 23.464 16.524 13.683 1894 75.000 31.250 37.500 27.226 18.464 13.859 1895 81.250 31.250 37.500 31.419 20.626 14.056 1896 87.500 31.250 37.500 36.058 23.018 14.273 1897 93.750 31.250 37.500 41.155 25.646 14.512 1898 100.00 31.250 37.500 46.721 28.516 14.773 1899 0.0000 37.500 37.500 7.1809 10.043 13.290 1900 6.2500 37.500 37.500 7.3914 10.152 13.300 1901 12.500 37.500 37.500 7.7668 10.345 13.317 1902 18.750 37.500 37.500 8.3790 10.661 13.346 1903 25.000 37.500 37.500 9.2582 11.114 13.387 1904 31.250 37.500 37.500 10.430 11.719 13.442 1905 43.750 37.500 37.500 13.742 13.426 13.597 1906 50.000 37.500 37.500 15.920 14.549 13.699 1907 56.250 37.500 37.500 18.471 15.864 13.819 1908 62.500 37.500 37.500 21.411 17.380 13.956 1909 68.750 37.500 37.500 24.754 19.104 14.113 1910 75.000 37.500 37.500 28.516 21.043 14.289 1911 81.250 37.500 37.500 32.709 23.206 14.486 1912 87.500 37.500 37.500 37.348 25.597 14.703 1913 93.750 37.500 37.500 42.445 28.225 14.942 1914 100.00 37.500 37.500 48.011 31.095 15.203 1915 0.0000 43.750 37.500 8.7623 13.206 13.817 1916 6.2500 43.750 37.500 8.9728 13.314 13.827 1917 12.500 43.750 37.500 9.3482 13.508 13.844 1918 18.750 43.750 37.500 9.9604 13.823 13.873 1919 25.000 43.750 37.500 10.840 14.277 13.914 1920 31.250 43.750 37.500 12.012 14.881 13.969 1921 37.500 43.750 37.500 13.499 15.648 14.039 1922 43.750 43.750 37.500 15.323 16.588 14.124 1923 50.000 43.750 37.500 17.502 17.712 14.226 1924 56.250 43.750 37.500 20.053 19.027 14.346 1925 62.500 43.750 37.500 22.992 20.543 14.484 1926 68.750 43.750 37.500 26.335 22.266 14.640 1927 75.000 43.750 37.500 30.097 24.206 14.817 1928 81.250 43.750 37.500 34.291 26.368 15.013 1929 87.500 43.750 37.500 38.929 28.760 15.230 1930 93.750 43.750 37.500 44.026 31.388 15.469 1931 100.00 43.750 37.500 49.593 34.258 15.730 1932 0.0000 50.000 37.500 10.652 16.983 14.447 1933 6.2500 50.000 37.500 10.862 17.092 14.456 1934 12.500 50.000 37.500 11.237 17.286 14.474 1935 18.750 50.000 37.500 11.850 17.601 14.503 1936 25.000 50.000 37.500 12.729 18.054 14.544 1937 31.250 50.000 37.500 13.901 18.659 14.599 1938 37.500 50.000 37.500 15.388 19.426 14.669 1939 43.750 50.000 37.500 17.212 20.366 14.754 1940 50.000 50.000 37.500 19.391 21.489 14.856 1941 56.250 50.000 37.500 21.942 22.805 14.976 1942 62.500 50.000 37.500 24.881 24.320 15.113 1943 68.750 50.000 37.500 28.225 26.044 15.270 1944 75.000 50.000 37.500 31.986 27.984 15.446 1945 81.250 50.000 37.500 36.180 30.146 15.643 1946 87.500 50.000 37.500 40.819 32.538 15.860 1947 93.750 50.000 37.500 45.915 35.166 16.099 1948 100.00 50.000 37.500 51.482 38.036 16.360 1949 0.0000 56.250 37.500 12.864 21.407 15.184 1950 6.2500 56.250 37.500 13.074 21.515 15.194 1951 12.500 56.250 37.500 13.449 21.709 15.211 1952 18.750 56.250 37.500 14.062 22.025 15.240 1953 25.000 56.250 37.500 14.941 22.478 15.281 1954 31.250 56.250 37.500 16.113 23.082 15.336 1955 37.500 56.250 37.500 17.600 23.849 15.406 1956 43.750 56.250 37.500 19.424 24.790 15.491 1957 50.000 56.250 37.500 21.603 25.913 15.593 1958 56.250 56.250 37.500 24.154 27.228 15.713 1959 62.500 56.250 37.500 27.093 28.744 15.851 1960 68.750 56.250 37.500 30.437 30.468 16.007 1961 75.000 56.250 37.500 34.198 32.407 16.184 1962 81.250 56.250 37.500 38.392 34.569 16.380 1963 87.500 56.250 37.500 43.031 36.961 16.597 1964 93.750 56.250 37.500 48.127 39.589 16.836 1965 100.00 56.250 37.500 53.694 42.459 17.097 1966 0.0000 62.500 37.500 15.412 26.504 16.034 1967 6.2500 62.500 37.500 15.623 26.612 16.043 1968 12.500 62.500 37.500 15.998 26.806 16.061 1969 18.750 62.500 37.500 16.610 27.122 16.090 1970 25.000 62.500 37.500 17.490 27.575 16.131 1971 31.250 62.500 37.500 18.662 28.179 16.186 1972 37.500 62.500 37.500 20.149 28.946 16.256 1973 43.750 62.500 37.500 21.973 29.887 16.341 1974 50.000 62.500 37.500 24.152 31.010 16.443 1975 56.250 62.500 37.500 26.703 32.325 16.563 1976 62.500 62.500 37.500 29.642 33.841 16.700 1977 68.750 62.500 37.500 32.985 35.565 16.857 1978 75.000 62.500 37.500 36.747 37.504 17.033 1979 81.250 62.500 37.500 40.941 39.666 17.230 1980 87.500 62.500 37.500 45.580 42.058 17.447 1981 93.750 62.500 37.500 50.676 44.686 17.686 1982 100.00 62.500 37.500 56.243 47.556 17.947 1983 0.0000 68.750 37.500 18.311 32.301 17.000 1984 6.2500 68.750 37.500 18.522 32.410 17.010 1985 12.500 68.750 37.500 18.897 32.603 17.027 1986 18.750 68.750 37.500 19.510 32.919 17.056 1987 25.000 68.750 37.500 20.389 33.372 17.097 1988 31.250 68.750 37.500 21.561 33.977 17.152 1989 37.500 68.750 37.500 23.048 34.744 17.222 1990 43.750 68.750 37.500 24.872 35.684 17.307 1991 50.000 68.750 37.500 27.051 36.807 17.409 1992 56.250 68.750 37.500 29.602 38.123 17.529 1993 62.500 68.750 37.500 32.541 39.638 17.667 1994 68.750 68.750 37.500 35.885 41.362 17.823 1995 75.000 68.750 37.500 39.646 43.301 18.000 1996 81.250 68.750 37.500 43.840 45.464 18.196 1997 87.500 68.750 37.500 48.479 47.856 18.413 1998 93.750 68.750 37.500 53.575 50.483 18.652 1999 100.00 68.750 37.500 59.142 53.353 18.913 2000 0.0000 75.000 37.500 21.573 38.824 18.087 2001 6.2500 75.000 37.500 21.784 38.933 18.097 2002 12.500 75.000 37.500 22.159 39.126 18.115 2003 18.750 75.000 37.500 22.771 39.442 18.143 2004 25.000 75.000 37.500 23.651 39.895 18.185 2005 31.250 75.000 37.500 24.823 40.499 18.239 2006 37.500 75.000 37.500 26.310 41.266 18.309 2007 43.750 75.000 37.500 28.134 42.207 18.395 2008 50.000 75.000 37.500 30.313 43.330 18.497 2009 56.250 75.000 37.500 32.864 44.645 18.616 2010 62.500 75.000 37.500 35.803 46.161 18.754 2011 68.750 75.000 37.500 39.146 47.885 18.911 2012 75.000 75.000 37.500 42.908 49.824 19.087 2013 81.250 75.000 37.500 47.102 51.986 19.283 2014 87.500 75.000 37.500 51.740 54.378 19.501 2015 93.750 75.000 37.500 56.837 57.006 19.740 2016 100.00 75.000 37.500 62.403 59.876 20.000 2017 0.0000 81.250 37.500 25.210 46.096 19.299 2018 6.2500 81.250 37.500 25.420 46.204 19.309 2019 12.500 81.250 37.500 25.796 46.398 19.327 2020 18.750 81.250 37.500 26.408 46.714 19.355 2021 25.000 81.250 37.500 27.287 47.167 19.397 2022 31.250 81.250 37.500 28.459 47.771 19.452 2023 37.500 81.250 37.500 29.947 48.538 19.521 2024 43.750 81.250 37.500 31.770 49.479 19.607 2025 50.000 81.250 37.500 33.949 50.602 19.709 2026 56.250 81.250 37.500 36.500 51.917 19.828 2027 62.500 81.250 37.500 39.440 53.433 19.966 2028 68.750 81.250 37.500 42.783 55.157 20.123 2029 75.000 81.250 37.500 46.544 57.096 20.299 2030 81.250 81.250 37.500 50.738 59.258 20.496 2031 87.500 81.250 37.500 55.377 61.650 20.713 2032 93.750 81.250 37.500 60.474 64.278 20.952 2033 100.00 81.250 37.500 66.040 67.148 21.213 2034 0.0000 87.500 37.500 29.232 54.140 20.640 2035 6.2500 87.500 37.500 29.443 54.248 20.650 2036 12.500 87.500 37.500 29.818 54.442 20.668 2037 18.750 87.500 37.500 30.430 54.758 20.696 2038 25.000 87.500 37.500 31.310 55.211 20.738 2039 31.250 87.500 37.500 32.482 55.815 20.792 2040 37.500 87.500 37.500 33.969 56.582 20.862 2041 43.750 87.500 37.500 35.793 57.523 20.948 2042 50.000 87.500 37.500 37.972 58.646 21.050 2043 56.250 87.500 37.500 40.523 59.961 21.169 2044 62.500 87.500 37.500 43.462 61.477 21.307 2045 68.750 87.500 37.500 46.805 63.201 21.464 2046 75.000 87.500 37.500 50.567 65.140 21.640 2047 81.250 87.500 37.500 54.761 67.302 21.836 2048 87.500 87.500 37.500 59.399 69.694 22.054 2049 93.750 87.500 37.500 64.496 72.322 22.293 2050 100.00 87.500 37.500 70.062 75.192 22.553 2051 0.0000 93.750 37.500 33.652 62.977 22.113 2052 6.2500 93.750 37.500 33.862 63.086 22.123 2053 12.500 93.750 37.500 34.238 63.280 22.141 2054 18.750 93.750 37.500 34.850 63.595 22.169 2055 25.000 93.750 37.500 35.729 64.048 22.211 2056 31.250 93.750 37.500 36.901 64.653 22.266 2057 37.500 93.750 37.500 38.389 65.420 22.335 2058 43.750 93.750 37.500 40.212 66.360 22.421 2059 50.000 93.750 37.500 42.391 67.483 22.523 2060 56.250 93.750 37.500 44.942 68.799 22.642 2061 62.500 93.750 37.500 47.881 70.314 22.780 2062 68.750 93.750 37.500 51.225 72.038 22.937 2063 75.000 93.750 37.500 54.986 73.978 23.113 2064 81.250 93.750 37.500 59.180 76.140 23.310 2065 87.500 93.750 37.500 63.819 78.532 23.527 2066 93.750 93.750 37.500 68.915 81.160 23.766 2067 100.00 93.750 37.500 74.482 84.030 24.027 2068 0.0000 100.00 37.500 38.479 72.630 23.722 2069 6.2500 100.00 37.500 38.689 72.738 23.732 2070 12.500 100.00 37.500 39.064 72.932 23.750 2071 18.750 100.00 37.500 39.677 73.247 23.778 2072 25.000 100.00 37.500 40.556 73.701 23.820 2073 31.250 100.00 37.500 41.728 74.305 23.875 2074 37.500 100.00 37.500 43.215 75.072 23.944 2075 43.750 100.00 37.500 45.039 76.012 24.030 2076 50.000 100.00 37.500 47.218 77.136 24.132 2077 56.250 100.00 37.500 49.769 78.451 24.251 2078 62.500 100.00 37.500 52.708 79.967 24.389 2079 68.750 100.00 37.500 56.052 81.690 24.546 2080 75.000 100.00 37.500 59.813 83.630 24.722 2081 81.250 100.00 37.500 64.007 85.792 24.919 2082 87.500 100.00 37.500 68.646 88.184 25.136 2083 93.750 100.00 37.500 73.742 90.812 25.375 2084 100.00 100.00 37.500 79.309 93.682 25.636 2085 100.00 100.00 43.750 80.107 94.001 29.840 2086 12.500 0.0000 43.750 4.4575 2.4505 16.152 2087 18.750 0.0000 43.750 5.0697 2.7662 16.181 2088 25.000 0.0000 43.750 5.9489 3.2195 16.222 2089 31.250 0.0000 43.750 7.1209 3.8238 16.277 2090 37.500 0.0000 43.750 8.6085 4.5908 16.347 2091 43.750 0.0000 43.750 10.432 5.5312 16.432 2092 50.000 0.0000 43.750 12.611 6.6545 16.534 2093 56.250 0.0000 43.750 15.162 7.9697 16.654 2094 62.500 0.0000 43.750 18.101 9.4853 16.792 2095 68.750 0.0000 43.750 21.445 11.209 16.948 2096 75.000 0.0000 43.750 25.206 13.149 17.125 2097 81.250 0.0000 43.750 29.400 15.311 17.321 2098 87.500 0.0000 43.750 34.039 17.703 17.538 2099 93.750 0.0000 43.750 39.135 20.331 17.777 2100 93.750 6.2500 43.750 39.318 20.696 17.838 2101 93.750 12.500 43.750 39.643 21.347 17.947 2102 6.2500 6.2500 43.750 4.2646 2.6220 16.196 2103 12.500 6.2500 43.750 4.6400 2.8156 16.213 2104 18.750 6.2500 43.750 5.2522 3.1312 16.242 2105 25.000 6.2500 43.750 6.1314 3.5845 16.283 2106 31.250 6.2500 43.750 7.3034 4.1888 16.338 2107 37.500 6.2500 43.750 8.7911 4.9559 16.408 2108 43.750 6.2500 43.750 10.615 5.8962 16.493 2109 50.000 6.2500 43.750 12.793 7.0195 16.595 2110 56.250 6.2500 43.750 15.344 8.3348 16.715 2111 62.500 6.2500 43.750 18.284 9.8504 16.853 2112 68.750 6.2500 43.750 21.627 11.574 17.009 2113 75.000 6.2500 43.750 25.389 13.514 17.185 2114 81.250 6.2500 43.750 29.582 15.676 17.382 2115 87.500 6.2500 43.750 34.221 18.068 17.599 2116 100.00 0.0000 43.750 44.702 23.201 18.038 2117 100.00 6.2500 43.750 44.884 23.566 18.099 2118 100.00 12.500 43.750 45.210 24.217 18.207 2119 6.2500 12.500 43.750 4.5901 3.2730 16.304 2120 12.500 12.500 43.750 4.9655 3.4665 16.322 2121 18.750 12.500 43.750 5.5777 3.7822 16.350 2122 25.000 12.500 43.750 6.4569 4.2355 16.392 2123 31.250 12.500 43.750 7.6290 4.8398 16.447 2124 37.500 12.500 43.750 9.1166 5.6068 16.516 2125 43.750 12.500 43.750 10.940 6.5471 16.602 2126 50.000 12.500 43.750 13.119 7.6705 16.704 2127 56.250 12.500 43.750 15.670 8.9857 16.823 2128 62.500 12.500 43.750 18.609 10.501 16.961 2129 68.750 12.500 43.750 21.953 12.225 17.118 2130 75.000 12.500 43.750 25.714 14.165 17.294 2131 81.250 12.500 43.750 29.908 16.327 17.490 2132 87.500 12.500 43.750 34.547 18.719 17.708 2133 0.0000 6.2500 43.750 4.0541 2.5135 16.186 2134 0.0000 12.500 43.750 4.3796 3.1644 16.294 2135 0.0000 18.750 43.750 4.9105 4.2259 16.471 2136 6.2500 18.750 43.750 5.1210 4.3345 16.481 2137 12.500 18.750 43.750 5.4964 4.5280 16.499 2138 18.750 18.750 43.750 6.1085 4.8437 16.527 2139 25.000 18.750 43.750 6.9877 5.2970 16.569 2140 31.250 18.750 43.750 8.1598 5.9013 16.623 2141 37.500 18.750 43.750 9.6474 6.6683 16.693 2142 43.750 18.750 43.750 11.471 7.6087 16.779 2143 50.000 18.750 43.750 13.650 8.7320 16.881 2144 56.250 18.750 43.750 16.201 10.047 17.000 2145 62.500 18.750 43.750 19.140 11.563 17.138 2146 68.750 18.750 43.750 22.483 13.287 17.295 2147 75.000 18.750 43.750 26.245 15.226 17.471 2148 81.250 18.750 43.750 30.439 17.388 17.667 2149 87.500 18.750 43.750 35.078 19.780 17.885 2150 93.750 18.750 43.750 40.174 22.408 18.124 2151 100.00 18.750 43.750 45.741 25.278 18.384 2152 0.0000 25.000 43.750 5.6729 5.7505 16.725 2153 6.2500 25.000 43.750 5.8834 5.8590 16.735 2154 12.500 25.000 43.750 6.2588 6.0526 16.753 2155 18.750 25.000 43.750 6.8709 6.3682 16.781 2156 25.000 25.000 43.750 7.7501 6.8216 16.823 2157 31.250 25.000 43.750 8.9222 7.4259 16.878 2158 37.500 25.000 43.750 10.410 8.1929 16.947 2159 43.750 25.000 43.750 12.234 9.1332 17.033 2160 50.000 25.000 43.750 14.412 10.257 17.135 2161 56.250 25.000 43.750 16.963 11.572 17.254 2162 62.500 25.000 43.750 19.903 13.087 17.392 2163 68.750 25.000 43.750 23.246 14.811 17.549 2164 75.000 25.000 43.750 27.008 16.751 17.725 2165 81.250 25.000 43.750 31.201 18.913 17.922 2166 87.500 25.000 43.750 35.840 21.305 18.139 2167 93.750 25.000 43.750 40.937 23.933 18.378 2168 100.00 25.000 43.750 46.503 26.803 18.639 2169 0.0000 31.250 43.750 6.6892 7.7829 17.064 2170 6.2500 31.250 43.750 6.8997 7.8914 17.074 2171 12.500 31.250 43.750 7.2751 8.0850 17.092 2172 18.750 31.250 43.750 7.8872 8.4006 17.120 2173 25.000 31.250 43.750 8.7665 8.8539 17.161 2174 31.250 31.250 43.750 9.9385 9.4582 17.216 2175 37.500 31.250 43.750 11.426 10.225 17.286 2176 43.750 31.250 43.750 13.250 11.166 17.372 2177 50.000 31.250 43.750 15.429 12.289 17.474 2178 56.250 31.250 43.750 17.979 13.604 17.593 2179 62.500 31.250 43.750 20.919 15.120 17.731 2180 68.750 31.250 43.750 24.262 16.844 17.888 2181 75.000 31.250 43.750 28.024 18.783 18.064 2182 81.250 31.250 43.750 32.217 20.945 18.260 2183 87.500 31.250 43.750 36.856 23.337 18.478 2184 93.750 31.250 43.750 41.953 25.965 18.716 2185 100.00 31.250 43.750 47.519 28.835 18.977 2186 0.0000 37.500 43.750 7.9792 10.362 17.494 2187 6.2500 37.500 43.750 8.1897 10.471 17.504 2188 12.500 37.500 43.750 8.5651 10.665 17.522 2189 18.750 37.500 43.750 9.1772 10.980 17.550 2190 25.000 37.500 43.750 10.056 11.434 17.591 2191 31.250 37.500 43.750 11.228 12.038 17.646 2192 37.500 37.500 43.750 12.716 12.805 17.716 2193 43.750 37.500 43.750 14.540 13.745 17.802 2194 50.000 37.500 43.750 16.718 14.868 17.904 2195 56.250 37.500 43.750 19.269 16.184 18.023 2196 62.500 37.500 43.750 22.209 17.699 18.161 2197 68.750 37.500 43.750 25.552 19.423 18.318 2198 75.000 37.500 43.750 29.314 21.363 18.494 2199 81.250 37.500 43.750 33.507 23.525 18.690 2200 87.500 37.500 43.750 38.146 25.917 18.908 2201 93.750 37.500 43.750 43.243 28.545 19.146 2202 100.00 37.500 43.750 48.809 31.415 19.407 2203 0.0000 43.750 43.750 9.5606 13.525 18.021 2204 6.2500 43.750 43.750 9.7711 13.633 18.031 2205 12.500 43.750 43.750 10.146 13.827 18.049 2206 18.750 43.750 43.750 10.759 14.143 18.077 2207 25.000 43.750 43.750 11.638 14.596 18.119 2208 31.250 43.750 43.750 12.810 15.200 18.174 2209 37.500 43.750 43.750 14.298 15.967 18.243 2210 50.000 43.750 43.750 18.300 18.031 18.431 2211 56.250 43.750 43.750 20.851 19.346 18.550 2212 62.500 43.750 43.750 23.790 20.862 18.688 2213 68.750 43.750 43.750 27.134 22.586 18.845 2214 75.000 43.750 43.750 30.895 24.525 19.021 2215 81.250 43.750 43.750 35.089 26.687 19.217 2216 87.500 43.750 43.750 39.728 29.079 19.435 2217 93.750 43.750 43.750 44.824 31.707 19.674 2218 100.00 43.750 43.750 50.391 34.577 19.934 2219 0.0000 50.000 43.750 11.450 17.303 18.651 2220 6.2500 50.000 43.750 11.660 17.411 18.661 2221 12.500 50.000 43.750 12.036 17.605 18.678 2222 18.750 50.000 43.750 12.648 17.920 18.707 2223 25.000 50.000 43.750 13.527 18.374 18.748 2224 31.250 50.000 43.750 14.699 18.978 18.803 2225 37.500 50.000 43.750 16.187 19.745 18.873 2226 43.750 50.000 43.750 18.010 20.685 18.958 2227 50.000 50.000 43.750 20.189 21.809 19.060 2228 56.250 50.000 43.750 22.740 23.124 19.180 2229 62.500 50.000 43.750 25.679 24.640 19.318 2230 68.750 50.000 43.750 29.023 26.363 19.474 2231 75.000 50.000 43.750 32.784 28.303 19.651 2232 81.250 50.000 43.750 36.978 30.465 19.847 2233 87.500 50.000 43.750 41.617 32.857 20.065 2234 93.750 50.000 43.750 46.714 35.485 20.303 2235 100.00 50.000 43.750 52.280 38.355 20.564 2236 0.0000 56.250 43.750 13.662 21.726 19.388 2237 6.2500 56.250 43.750 13.872 21.835 19.398 2238 12.500 56.250 43.750 14.248 22.028 19.416 2239 18.750 56.250 43.750 14.860 22.344 19.444 2240 25.000 56.250 43.750 15.739 22.797 19.486 2241 31.250 56.250 43.750 16.911 23.401 19.541 2242 37.500 56.250 43.750 18.399 24.168 19.610 2243 43.750 56.250 43.750 20.222 25.109 19.696 2244 50.000 56.250 43.750 22.401 26.232 19.798 2245 56.250 56.250 43.750 24.952 27.547 19.917 2246 62.500 56.250 43.750 27.891 29.063 20.055 2247 68.750 56.250 43.750 31.235 30.787 20.212 2248 75.000 56.250 43.750 34.996 32.726 20.388 2249 81.250 56.250 43.750 39.190 34.889 20.585 2250 87.500 56.250 43.750 43.829 37.280 20.802 2251 93.750 56.250 43.750 48.925 39.908 21.041 2252 100.00 56.250 43.750 54.492 42.778 21.302 2253 0.0000 62.500 43.750 16.211 26.823 20.238 2254 6.2500 62.500 43.750 16.421 26.932 20.248 2255 12.500 62.500 43.750 16.797 27.125 20.265 2256 18.750 62.500 43.750 17.409 27.441 20.294 2257 25.000 62.500 43.750 18.288 27.894 20.335 2258 31.250 62.500 43.750 19.460 28.499 20.390 2259 37.500 62.500 43.750 20.948 29.266 20.460 2260 43.750 62.500 43.750 22.771 30.206 20.545 2261 50.000 62.500 43.750 24.950 31.329 20.647 2262 56.250 62.500 43.750 27.501 32.644 20.767 2263 62.500 62.500 43.750 30.440 34.160 20.905 2264 68.750 62.500 43.750 33.784 35.884 21.061 2265 75.000 62.500 43.750 37.545 37.823 21.238 2266 81.250 62.500 43.750 41.739 39.986 21.434 2267 87.500 62.500 43.750 46.378 42.377 21.652 2268 93.750 62.500 43.750 51.474 45.005 21.890 2269 100.00 62.500 43.750 57.041 47.875 22.151 2270 0.0000 68.750 43.750 19.110 32.621 21.204 2271 6.2500 68.750 43.750 19.320 32.729 21.214 2272 12.500 68.750 43.750 19.696 32.923 21.232 2273 18.750 68.750 43.750 20.308 33.238 21.260 2274 25.000 68.750 43.750 21.187 33.692 21.302 2275 31.250 68.750 43.750 22.359 34.296 21.357 2276 37.500 68.750 43.750 23.847 35.063 21.426 2277 43.750 68.750 43.750 25.670 36.003 21.512 2278 50.000 68.750 43.750 27.849 37.127 21.614 2279 56.250 68.750 43.750 30.400 38.442 21.733 2280 62.500 68.750 43.750 33.339 39.957 21.871 2281 68.750 68.750 43.750 36.683 41.681 22.028 2282 75.000 68.750 43.750 40.444 43.621 22.204 2283 81.250 68.750 43.750 44.638 45.783 22.401 2284 87.500 68.750 43.750 49.277 48.175 22.618 2285 93.750 68.750 43.750 54.373 50.803 22.857 2286 100.00 68.750 43.750 59.940 53.673 23.118 2287 0.0000 75.000 43.750 22.372 39.143 22.292 2288 6.2500 75.000 43.750 22.582 39.252 22.301 2289 12.500 75.000 43.750 22.957 39.445 22.319 2290 18.750 75.000 43.750 23.570 39.761 22.348 2291 25.000 75.000 43.750 24.449 40.214 22.389 2292 31.250 75.000 43.750 25.621 40.819 22.444 2293 37.500 75.000 43.750 27.109 41.586 22.514 2294 43.750 75.000 43.750 28.932 42.526 22.599 2295 50.000 75.000 43.750 31.111 43.649 22.701 2296 56.250 75.000 43.750 33.662 44.965 22.821 2297 62.500 75.000 43.750 36.601 46.480 22.958 2298 68.750 75.000 43.750 39.945 48.204 23.115 2299 75.000 75.000 43.750 43.706 50.143 23.291 2300 81.250 75.000 43.750 47.900 52.306 23.488 2301 87.500 75.000 43.750 52.539 54.698 23.705 2302 93.750 75.000 43.750 57.635 57.325 23.944 2303 100.00 75.000 43.750 63.202 60.195 24.205 2304 0.0000 81.250 43.750 26.008 46.415 23.504 2305 6.2500 81.250 43.750 26.219 46.524 23.514 2306 12.500 81.250 43.750 26.594 46.717 23.531 2307 18.750 81.250 43.750 27.206 47.033 23.560 2308 25.000 81.250 43.750 28.085 47.486 23.601 2309 31.250 81.250 43.750 29.257 48.091 23.656 2310 37.500 81.250 43.750 30.745 48.858 23.726 2311 43.750 81.250 43.750 32.569 49.798 23.811 2312 50.000 81.250 43.750 34.747 50.921 23.913 2313 56.250 81.250 43.750 37.298 52.236 24.033 2314 62.500 81.250 43.750 40.238 53.752 24.171 2315 68.750 81.250 43.750 43.581 55.476 24.327 2316 75.000 81.250 43.750 47.343 57.415 24.503 2317 81.250 81.250 43.750 51.536 59.578 24.700 2318 87.500 81.250 43.750 56.175 61.969 24.917 2319 93.750 81.250 43.750 61.272 64.597 25.156 2320 100.00 81.250 43.750 66.838 67.467 25.417 2321 0.0000 87.500 43.750 30.031 54.459 24.845 2322 6.2500 87.500 43.750 30.241 54.568 24.854 2323 12.500 87.500 43.750 30.616 54.761 24.872 2324 18.750 87.500 43.750 31.229 55.077 24.901 2325 25.000 87.500 43.750 32.108 55.530 24.942 2326 31.250 87.500 43.750 33.280 56.134 24.997 2327 37.500 87.500 43.750 34.767 56.901 25.067 2328 43.750 87.500 43.750 36.591 57.842 25.152 2329 50.000 87.500 43.750 38.770 58.965 25.254 2330 56.250 87.500 43.750 41.321 60.280 25.374 2331 62.500 87.500 43.750 44.260 61.796 25.511 2332 68.750 87.500 43.750 47.604 63.520 25.668 2333 75.000 87.500 43.750 51.365 65.459 25.844 2334 81.250 87.500 43.750 55.559 67.622 26.041 2335 87.500 87.500 43.750 60.198 70.013 26.258 2336 93.750 87.500 43.750 65.294 72.641 26.497 2337 100.00 87.500 43.750 70.861 75.511 26.758 2338 0.0000 93.750 43.750 34.450 63.297 26.318 2339 6.2500 93.750 43.750 34.660 63.405 26.328 2340 12.500 93.750 43.750 35.036 63.599 26.345 2341 18.750 93.750 43.750 35.648 63.914 26.374 2342 25.000 93.750 43.750 36.527 64.368 26.415 2343 31.250 93.750 43.750 37.699 64.972 26.470 2344 37.500 93.750 43.750 39.187 65.739 26.540 2345 43.750 93.750 43.750 41.011 66.679 26.625 2346 50.000 93.750 43.750 43.189 67.803 26.727 2347 56.250 93.750 43.750 45.740 69.118 26.847 2348 62.500 93.750 43.750 48.680 70.634 26.985 2349 68.750 93.750 43.750 52.023 72.357 27.141 2350 75.000 93.750 43.750 55.785 74.297 27.317 2351 81.250 93.750 43.750 59.978 76.459 27.514 2352 87.500 93.750 43.750 64.617 78.851 27.731 2353 93.750 93.750 43.750 69.714 81.479 27.970 2354 100.00 93.750 43.750 75.280 84.349 28.231 2355 0.0000 100.00 43.750 39.277 72.949 27.927 2356 6.2500 100.00 43.750 39.487 73.058 27.937 2357 12.500 100.00 43.750 39.863 73.251 27.954 2358 18.750 100.00 43.750 40.475 73.567 27.983 2359 25.000 100.00 43.750 41.354 74.020 28.024 2360 31.250 100.00 43.750 42.526 74.624 28.079 2361 37.500 100.00 43.750 44.014 75.391 28.149 2362 43.750 100.00 43.750 45.837 76.332 28.234 2363 50.000 100.00 43.750 48.016 77.455 28.336 2364 56.250 100.00 43.750 50.567 78.770 28.456 2365 62.500 100.00 43.750 53.507 80.286 28.594 2366 68.750 100.00 43.750 56.850 82.010 28.750 2367 75.000 100.00 43.750 60.611 83.949 28.926 2368 81.250 100.00 43.750 64.805 86.111 29.123 2369 87.500 100.00 43.750 69.444 88.503 29.340 2370 93.750 100.00 43.750 74.541 91.131 29.579 2371 6.2500 0.0000 43.750 4.0821 2.2570 16.135 2372 6.2500 0.0000 50.000 5.0357 2.6384 21.157 2373 12.500 0.0000 50.000 5.4111 2.8319 21.175 2374 18.750 0.0000 50.000 6.0232 3.1475 21.204 2375 25.000 0.0000 50.000 6.9024 3.6009 21.245 2376 31.250 0.0000 50.000 8.0745 4.2052 21.300 2377 37.500 0.0000 50.000 9.5621 4.9722 21.369 2378 43.750 0.0000 50.000 11.386 5.9125 21.455 2379 50.000 0.0000 50.000 13.564 7.0358 21.557 2380 56.250 0.0000 50.000 16.115 8.3511 21.677 2381 62.500 0.0000 50.000 19.055 9.8667 21.814 2382 68.750 0.0000 50.000 22.398 11.591 21.971 2383 75.000 0.0000 50.000 26.160 13.530 22.147 2384 81.250 0.0000 50.000 30.353 15.692 22.344 2385 87.500 0.0000 50.000 34.992 18.084 22.561 2386 93.750 0.0000 50.000 40.089 20.712 22.800 2387 93.750 6.2500 50.000 40.271 21.077 22.861 2388 93.750 12.500 50.000 40.597 21.728 22.969 2389 6.2500 6.2500 50.000 5.2182 3.0034 21.218 2390 12.500 6.2500 50.000 5.5936 3.1969 21.236 2391 18.750 6.2500 50.000 6.2058 3.5126 21.264 2392 25.000 6.2500 50.000 7.0850 3.9659 21.306 2393 31.250 6.2500 50.000 8.2570 4.5702 21.361 2394 37.500 6.2500 50.000 9.7446 5.3372 21.430 2395 43.750 6.2500 50.000 11.568 6.2776 21.516 2396 50.000 6.2500 50.000 13.747 7.4009 21.618 2397 56.250 6.2500 50.000 16.298 8.7161 21.737 2398 62.500 6.2500 50.000 19.237 10.232 21.875 2399 68.750 6.2500 50.000 22.581 11.956 22.032 2400 75.000 6.2500 50.000 26.342 13.895 22.208 2401 81.250 6.2500 50.000 30.536 16.057 22.405 2402 87.500 6.2500 50.000 35.175 18.449 22.622 2403 100.00 0.0000 50.000 45.655 23.582 23.061 2404 100.00 6.2500 50.000 45.838 23.947 23.122 2405 100.00 12.500 50.000 46.163 24.598 23.230 2406 6.2500 12.500 50.000 5.5437 3.6543 21.327 2407 12.500 12.500 50.000 5.9191 3.8479 21.344 2408 18.750 12.500 50.000 6.5313 4.1635 21.373 2409 25.000 12.500 50.000 7.4105 4.6169 21.414 2410 31.250 12.500 50.000 8.5825 5.2212 21.469 2411 37.500 12.500 50.000 10.070 5.9882 21.539 2412 43.750 12.500 50.000 11.894 6.9285 21.624 2413 50.000 12.500 50.000 14.073 8.0518 21.726 2414 56.250 12.500 50.000 16.623 9.3671 21.846 2415 62.500 12.500 50.000 19.563 10.883 21.984 2416 68.750 12.500 50.000 22.906 12.607 22.140 2417 75.000 12.500 50.000 26.668 14.546 22.317 2418 81.250 12.500 50.000 30.862 16.708 22.513 2419 87.500 12.500 50.000 35.500 19.100 22.730 2420 0.0000 6.2500 50.000 5.0077 2.8948 21.208 2421 0.0000 12.500 50.000 5.3332 3.5458 21.317 2422 0.0000 18.750 50.000 5.8640 4.6073 21.494 2423 6.2500 18.750 50.000 6.0745 4.7158 21.504 2424 12.500 18.750 50.000 6.4500 4.9094 21.521 2425 18.750 18.750 50.000 7.0621 5.2250 21.550 2426 25.000 18.750 50.000 7.9413 5.6784 21.591 2427 31.250 18.750 50.000 9.1134 6.2827 21.646 2428 37.500 18.750 50.000 10.601 7.0497 21.716 2429 43.750 18.750 50.000 12.425 7.9900 21.801 2430 50.000 18.750 50.000 14.603 9.1133 21.903 2431 56.250 18.750 50.000 17.154 10.429 22.023 2432 62.500 18.750 50.000 20.094 11.944 22.161 2433 68.750 18.750 50.000 23.437 13.668 22.317 2434 75.000 18.750 50.000 27.199 15.608 22.493 2435 81.250 18.750 50.000 31.392 17.770 22.690 2436 87.500 18.750 50.000 36.031 20.162 22.907 2437 93.750 18.750 50.000 41.128 22.789 23.146 2438 100.00 18.750 50.000 46.694 25.659 23.407 2439 0.0000 25.000 50.000 6.6264 6.1319 21.748 2440 6.2500 25.000 50.000 6.8369 6.2404 21.758 2441 12.500 25.000 50.000 7.2123 6.4340 21.775 2442 18.750 25.000 50.000 7.8245 6.7496 21.804 2443 25.000 25.000 50.000 8.7037 7.2029 21.845 2444 31.250 25.000 50.000 9.8758 7.8072 21.900 2445 37.500 25.000 50.000 11.363 8.5743 21.970 2446 43.750 25.000 50.000 13.187 9.5146 22.055 2447 50.000 25.000 50.000 15.366 10.638 22.157 2448 56.250 25.000 50.000 17.917 11.953 22.277 2449 62.500 25.000 50.000 20.856 13.469 22.415 2450 68.750 25.000 50.000 24.199 15.193 22.571 2451 75.000 25.000 50.000 27.961 17.132 22.748 2452 81.250 25.000 50.000 32.155 19.294 22.944 2453 87.500 25.000 50.000 36.794 21.686 23.161 2454 93.750 25.000 50.000 41.890 24.314 23.400 2455 100.00 25.000 50.000 47.457 27.184 23.661 2456 0.0000 31.250 50.000 7.6427 8.1642 22.087 2457 6.2500 31.250 50.000 7.8533 8.2728 22.097 2458 12.500 31.250 50.000 8.2287 8.4663 22.114 2459 18.750 31.250 50.000 8.8408 8.7820 22.143 2460 25.000 31.250 50.000 9.7200 9.2353 22.184 2461 31.250 31.250 50.000 10.892 9.8396 22.239 2462 37.500 31.250 50.000 12.380 10.607 22.309 2463 43.750 31.250 50.000 14.203 11.547 22.394 2464 50.000 31.250 50.000 16.382 12.670 22.496 2465 56.250 31.250 50.000 18.933 13.986 22.616 2466 62.500 31.250 50.000 21.872 15.501 22.753 2467 68.750 31.250 50.000 25.216 17.225 22.910 2468 75.000 31.250 50.000 28.977 19.164 23.086 2469 81.250 31.250 50.000 33.171 21.327 23.283 2470 87.500 31.250 50.000 37.810 23.719 23.500 2471 93.750 31.250 50.000 42.907 26.346 23.739 2472 100.00 31.250 50.000 48.473 29.216 24.000 2473 0.0000 37.500 50.000 8.9327 10.744 22.517 2474 6.2500 37.500 50.000 9.1432 10.852 22.527 2475 12.500 37.500 50.000 9.5186 11.046 22.544 2476 18.750 37.500 50.000 10.131 11.362 22.573 2477 25.000 37.500 50.000 11.010 11.815 22.614 2478 31.250 37.500 50.000 12.182 12.419 22.669 2479 37.500 37.500 50.000 13.670 13.186 22.739 2480 43.750 37.500 50.000 15.493 14.127 22.824 2481 50.000 37.500 50.000 17.672 15.250 22.926 2482 56.250 37.500 50.000 20.223 16.565 23.046 2483 62.500 37.500 50.000 23.162 18.081 23.183 2484 68.750 37.500 50.000 26.506 19.805 23.340 2485 75.000 37.500 50.000 30.267 21.744 23.516 2486 81.250 37.500 50.000 34.461 23.906 23.713 2487 87.500 37.500 50.000 39.100 26.298 23.930 2488 93.750 37.500 50.000 44.196 28.926 24.169 2489 100.00 37.500 50.000 49.763 31.796 24.430 2490 0.0000 43.750 50.000 10.514 13.906 23.044 2491 6.2500 43.750 50.000 10.725 14.015 23.054 2492 12.500 43.750 50.000 11.100 14.208 23.071 2493 18.750 43.750 50.000 11.712 14.524 23.100 2494 25.000 43.750 50.000 12.591 14.977 23.141 2495 31.250 43.750 50.000 13.763 15.582 23.196 2496 37.500 43.750 50.000 15.251 16.349 23.266 2497 43.750 43.750 50.000 17.075 17.289 23.351 2498 50.000 43.750 50.000 19.253 18.412 23.453 2499 56.250 43.750 50.000 21.804 19.728 23.573 2500 62.500 43.750 50.000 24.744 21.243 23.711 2501 68.750 43.750 50.000 28.087 22.967 23.867 2502 75.000 43.750 50.000 31.849 24.906 24.044 2503 81.250 43.750 50.000 36.042 27.069 24.240 2504 87.500 43.750 50.000 40.681 29.461 24.457 2505 93.750 43.750 50.000 45.778 32.088 24.696 2506 100.00 43.750 50.000 51.344 34.958 24.957 2507 0.0000 50.000 50.000 12.403 17.684 23.674 2508 6.2500 50.000 50.000 12.614 17.793 23.683 2509 12.500 50.000 50.000 12.989 17.986 23.701 2510 18.750 50.000 50.000 13.601 18.302 23.730 2511 25.000 50.000 50.000 14.481 18.755 23.771 2512 31.250 50.000 50.000 15.653 19.359 23.826 2513 37.500 50.000 50.000 17.140 20.126 23.896 2514 43.750 50.000 50.000 18.964 21.067 23.981 2515 56.250 50.000 50.000 23.694 23.505 24.203 2516 62.500 50.000 50.000 26.633 25.021 24.340 2517 68.750 50.000 50.000 29.976 26.745 24.497 2518 75.000 50.000 50.000 33.738 28.684 24.673 2519 81.250 50.000 50.000 37.932 30.847 24.870 2520 87.500 50.000 50.000 42.570 33.238 25.087 2521 93.750 50.000 50.000 47.667 35.866 25.326 2522 100.00 50.000 50.000 53.233 38.736 25.587 2523 0.0000 56.250 50.000 14.615 22.107 24.411 2524 6.2500 56.250 50.000 14.826 22.216 24.421 2525 12.500 56.250 50.000 15.201 22.410 24.438 2526 18.750 56.250 50.000 15.813 22.725 24.467 2527 25.000 56.250 50.000 16.693 23.178 24.508 2528 31.250 56.250 50.000 17.865 23.783 24.563 2529 37.500 56.250 50.000 19.352 24.550 24.633 2530 43.750 56.250 50.000 21.176 25.490 24.718 2531 50.000 56.250 50.000 23.355 26.613 24.820 2532 56.250 56.250 50.000 25.906 27.929 24.940 2533 62.500 56.250 50.000 28.845 29.444 25.078 2534 68.750 56.250 50.000 32.188 31.168 25.234 2535 75.000 56.250 50.000 35.950 33.108 25.411 2536 81.250 56.250 50.000 40.144 35.270 25.607 2537 87.500 56.250 50.000 44.782 37.662 25.824 2538 93.750 56.250 50.000 49.879 40.290 26.063 2539 100.00 56.250 50.000 55.445 43.160 26.324 2540 0.0000 62.500 50.000 17.164 27.205 25.261 2541 6.2500 62.500 50.000 17.375 27.313 25.270 2542 12.500 62.500 50.000 17.750 27.507 25.288 2543 18.750 62.500 50.000 18.362 27.822 25.317 2544 25.000 62.500 50.000 19.242 28.276 25.358 2545 31.250 62.500 50.000 20.414 28.880 25.413 2546 37.500 62.500 50.000 21.901 29.647 25.483 2547 43.750 62.500 50.000 23.725 30.587 25.568 2548 50.000 62.500 50.000 25.904 31.711 25.670 2549 56.250 62.500 50.000 28.454 33.026 25.790 2550 62.500 62.500 50.000 31.394 34.541 25.927 2551 68.750 62.500 50.000 34.737 36.265 26.084 2552 75.000 62.500 50.000 38.499 38.205 26.260 2553 81.250 62.500 50.000 42.693 40.367 26.457 2554 87.500 62.500 50.000 47.331 42.759 26.674 2555 93.750 62.500 50.000 52.428 45.387 26.913 2556 100.00 62.500 50.000 57.994 48.257 27.174 2557 0.0000 68.750 50.000 20.063 33.002 26.227 2558 6.2500 68.750 50.000 20.274 33.110 26.237 2559 12.500 68.750 50.000 20.649 33.304 26.254 2560 18.750 68.750 50.000 21.261 33.620 26.283 2561 25.000 68.750 50.000 22.141 34.073 26.324 2562 31.250 68.750 50.000 23.313 34.677 26.379 2563 37.500 68.750 50.000 24.800 35.444 26.449 2564 43.750 68.750 50.000 26.624 36.385 26.534 2565 50.000 68.750 50.000 28.803 37.508 26.636 2566 56.250 68.750 50.000 31.354 38.823 26.756 2567 62.500 68.750 50.000 34.293 40.339 26.894 2568 68.750 68.750 50.000 37.636 42.063 27.050 2569 75.000 68.750 50.000 41.398 44.002 27.227 2570 81.250 68.750 50.000 45.592 46.164 27.423 2571 87.500 68.750 50.000 50.230 48.556 27.640 2572 93.750 68.750 50.000 55.327 51.184 27.879 2573 100.00 68.750 50.000 60.893 54.054 28.140 2574 0.0000 75.000 50.000 23.325 39.525 27.314 2575 6.2500 75.000 50.000 23.536 39.633 27.324 2576 12.500 75.000 50.000 23.911 39.827 27.342 2577 18.750 75.000 50.000 24.523 40.142 27.370 2578 25.000 75.000 50.000 25.402 40.596 27.412 2579 31.250 75.000 50.000 26.574 41.200 27.466 2580 37.500 75.000 50.000 28.062 41.967 27.536 2581 43.750 75.000 50.000 29.886 42.907 27.622 2582 50.000 75.000 50.000 32.064 44.031 27.724 2583 56.250 75.000 50.000 34.615 45.346 27.843 2584 62.500 75.000 50.000 37.555 46.862 27.981 2585 68.750 75.000 50.000 40.898 48.585 28.138 2586 75.000 75.000 50.000 44.660 50.525 28.314 2587 81.250 75.000 50.000 48.853 52.687 28.510 2588 87.500 75.000 50.000 53.492 55.079 28.728 2589 93.750 75.000 50.000 58.589 57.707 28.967 2590 100.00 75.000 50.000 64.155 60.577 29.227 2591 0.0000 81.250 50.000 26.962 46.797 28.526 2592 6.2500 81.250 50.000 27.172 46.905 28.536 2593 12.500 81.250 50.000 27.548 47.099 28.554 2594 18.750 81.250 50.000 28.160 47.414 28.582 2595 25.000 81.250 50.000 29.039 47.868 28.624 2596 31.250 81.250 50.000 30.211 48.472 28.679 2597 37.500 81.250 50.000 31.699 49.239 28.748 2598 43.750 81.250 50.000 33.522 50.179 28.834 2599 50.000 81.250 50.000 35.701 51.303 28.936 2600 56.250 81.250 50.000 38.252 52.618 29.055 2601 62.500 81.250 50.000 41.191 54.133 29.193 2602 68.750 81.250 50.000 44.535 55.857 29.350 2603 75.000 81.250 50.000 48.296 57.797 29.526 2604 81.250 81.250 50.000 52.490 59.959 29.723 2605 87.500 81.250 50.000 57.129 62.351 29.940 2606 93.750 81.250 50.000 62.225 64.979 30.179 2607 100.00 81.250 50.000 67.792 67.849 30.440 2608 0.0000 87.500 50.000 30.984 54.840 29.867 2609 6.2500 87.500 50.000 31.195 54.949 29.877 2610 12.500 87.500 50.000 31.570 55.142 29.895 2611 18.750 87.500 50.000 32.182 55.458 29.923 2612 25.000 87.500 50.000 33.061 55.911 29.965 2613 31.250 87.500 50.000 34.233 56.516 30.019 2614 37.500 87.500 50.000 35.721 57.283 30.089 2615 43.750 87.500 50.000 37.545 58.223 30.175 2616 50.000 87.500 50.000 39.723 59.346 30.277 2617 56.250 87.500 50.000 42.274 60.662 30.396 2618 62.500 87.500 50.000 45.214 62.177 30.534 2619 68.750 87.500 50.000 48.557 63.901 30.691 2620 75.000 87.500 50.000 52.319 65.841 30.867 2621 81.250 87.500 50.000 56.512 68.003 31.063 2622 87.500 87.500 50.000 61.151 70.395 31.281 2623 93.750 87.500 50.000 66.248 73.023 31.520 2624 100.00 87.500 50.000 71.814 75.893 31.780 2625 0.0000 93.750 50.000 35.404 63.678 31.340 2626 6.2500 93.750 50.000 35.614 63.787 31.350 2627 12.500 93.750 50.000 35.989 63.980 31.368 2628 18.750 93.750 50.000 36.602 64.296 31.396 2629 25.000 93.750 50.000 37.481 64.749 31.438 2630 31.250 93.750 50.000 38.653 65.353 31.493 2631 37.500 93.750 50.000 40.140 66.120 31.562 2632 43.750 93.750 50.000 41.964 67.061 31.648 2633 50.000 93.750 50.000 44.143 68.184 31.750 2634 56.250 93.750 50.000 46.694 69.499 31.869 2635 62.500 93.750 50.000 49.633 71.015 32.007 2636 68.750 93.750 50.000 52.977 72.739 32.164 2637 75.000 93.750 50.000 56.738 74.678 32.340 2638 81.250 93.750 50.000 60.932 76.841 32.537 2639 87.500 93.750 50.000 65.571 79.232 32.754 2640 93.750 93.750 50.000 70.667 81.860 32.993 2641 100.00 93.750 50.000 76.234 84.730 33.254 2642 0.0000 100.00 50.000 40.230 73.330 32.949 2643 6.2500 100.00 50.000 40.441 73.439 32.959 2644 12.500 100.00 50.000 40.816 73.632 32.977 2645 18.750 100.00 50.000 41.428 73.948 33.005 2646 25.000 100.00 50.000 42.308 74.401 33.047 2647 31.250 100.00 50.000 43.480 75.006 33.102 2648 37.500 100.00 50.000 44.967 75.773 33.171 2649 43.750 100.00 50.000 46.791 76.713 33.257 2650 50.000 100.00 50.000 48.970 77.836 33.359 2651 56.250 100.00 50.000 51.521 79.152 33.478 2652 62.500 100.00 50.000 54.460 80.667 33.616 2653 68.750 100.00 50.000 57.803 82.391 33.773 2654 75.000 100.00 50.000 61.565 84.331 33.949 2655 81.250 100.00 50.000 65.759 86.493 34.146 2656 87.500 100.00 50.000 70.398 88.885 34.363 2657 93.750 100.00 50.000 75.494 91.512 34.602 2658 100.00 100.00 50.000 81.061 94.383 34.863 2659 100.00 100.00 56.250 82.177 94.829 40.743 2660 12.500 0.0000 56.250 6.5276 3.2785 27.056 2661 18.750 0.0000 56.250 7.1398 3.5941 27.084 2662 25.000 0.0000 56.250 8.0190 4.0474 27.126 2663 31.250 0.0000 56.250 9.1910 4.6517 27.181 2664 37.500 0.0000 56.250 10.679 5.4188 27.250 2665 43.750 0.0000 56.250 12.502 6.3591 27.336 2666 50.000 0.0000 56.250 14.681 7.4824 27.438 2667 56.250 0.0000 56.250 17.232 8.7977 27.557 2668 62.500 0.0000 56.250 20.171 10.313 27.695 2669 68.750 0.0000 56.250 23.515 12.037 27.852 2670 75.000 0.0000 56.250 27.276 13.977 28.028 2671 81.250 0.0000 56.250 31.470 16.139 28.225 2672 87.500 0.0000 56.250 36.109 18.531 28.442 2673 93.750 0.0000 56.250 41.205 21.158 28.681 2674 93.750 6.2500 56.250 41.388 21.523 28.742 2675 93.750 12.500 56.250 41.713 22.174 28.850 2676 6.2500 6.2500 56.250 6.3347 3.4499 27.099 2677 12.500 6.2500 56.250 6.7101 3.6435 27.117 2678 18.750 6.2500 56.250 7.3223 3.9591 27.145 2679 25.000 6.2500 56.250 8.2015 4.4124 27.186 2680 31.250 6.2500 56.250 9.3735 5.0167 27.241 2681 37.500 6.2500 56.250 10.861 5.7838 27.311 2682 43.750 6.2500 56.250 12.685 6.7241 27.397 2683 50.000 6.2500 56.250 14.864 7.8474 27.499 2684 56.250 6.2500 56.250 17.414 9.1627 27.618 2685 62.500 6.2500 56.250 20.354 10.678 27.756 2686 68.750 6.2500 56.250 23.697 12.402 27.913 2687 75.000 6.2500 56.250 27.459 14.342 28.089 2688 81.250 6.2500 56.250 31.653 16.504 28.285 2689 87.500 6.2500 56.250 36.291 18.896 28.503 2690 100.00 0.0000 56.250 46.772 24.029 28.942 2691 100.00 6.2500 56.250 46.954 24.394 29.002 2692 100.00 12.500 56.250 47.280 25.045 29.111 2693 6.2500 12.500 56.250 6.6602 4.1009 27.208 2694 12.500 12.500 56.250 7.0356 4.2944 27.225 2695 18.750 12.500 56.250 7.6478 4.6101 27.254 2696 25.000 12.500 56.250 8.5270 5.0634 27.295 2697 31.250 12.500 56.250 9.6991 5.6677 27.350 2698 37.500 12.500 56.250 11.187 6.4347 27.420 2699 43.750 12.500 56.250 13.010 7.3751 27.505 2700 50.000 12.500 56.250 15.189 8.4984 27.607 2701 56.250 12.500 56.250 17.740 9.8136 27.727 2702 62.500 12.500 56.250 20.679 11.329 27.864 2703 68.750 12.500 56.250 24.023 13.053 28.021 2704 75.000 12.500 56.250 27.784 14.993 28.197 2705 81.250 12.500 56.250 31.978 17.155 28.394 2706 87.500 12.500 56.250 36.617 19.547 28.611 2707 0.0000 6.2500 56.250 6.1242 3.3414 27.089 2708 0.0000 12.500 56.250 6.4497 3.9923 27.198 2709 0.0000 18.750 56.250 6.9806 5.0538 27.375 2710 6.2500 18.750 56.250 7.1911 5.1624 27.384 2711 12.500 18.750 56.250 7.5665 5.3559 27.402 2712 18.750 18.750 56.250 8.1786 5.6716 27.431 2713 25.000 18.750 56.250 9.0578 6.1249 27.472 2714 31.250 18.750 56.250 10.230 6.7292 27.527 2715 37.500 18.750 56.250 11.718 7.4962 27.597 2716 43.750 18.750 56.250 13.541 8.4366 27.682 2717 50.000 18.750 56.250 15.720 9.5599 27.784 2718 56.250 18.750 56.250 18.271 10.875 27.904 2719 62.500 18.750 56.250 21.210 12.391 28.041 2720 68.750 18.750 56.250 24.554 14.115 28.198 2721 75.000 18.750 56.250 28.315 16.054 28.374 2722 81.250 18.750 56.250 32.509 18.216 28.571 2723 87.500 18.750 56.250 37.148 20.608 28.788 2724 93.750 18.750 56.250 42.244 23.236 29.027 2725 100.00 18.750 56.250 47.811 26.106 29.288 2726 0.0000 25.000 56.250 7.7430 6.5784 27.629 2727 6.2500 25.000 56.250 7.9535 6.6870 27.639 2728 12.500 25.000 56.250 8.3289 6.8805 27.656 2729 18.750 25.000 56.250 8.9410 7.1961 27.685 2730 25.000 25.000 56.250 9.8202 7.6495 27.726 2731 31.250 25.000 56.250 10.992 8.2538 27.781 2732 37.500 25.000 56.250 12.480 9.0208 27.851 2733 43.750 25.000 56.250 14.304 9.9611 27.936 2734 50.000 25.000 56.250 16.482 11.084 28.038 2735 56.250 25.000 56.250 19.033 12.400 28.158 2736 62.500 25.000 56.250 21.973 13.915 28.296 2737 68.750 25.000 56.250 25.316 15.639 28.452 2738 75.000 25.000 56.250 29.078 17.579 28.628 2739 81.250 25.000 56.250 33.271 19.741 28.825 2740 87.500 25.000 56.250 37.910 22.133 29.042 2741 93.750 25.000 56.250 43.007 24.761 29.281 2742 100.00 25.000 56.250 48.573 27.631 29.542 2743 0.0000 31.250 56.250 8.7593 8.6108 27.968 2744 6.2500 31.250 56.250 8.9698 8.7193 27.977 2745 12.500 31.250 56.250 9.3452 8.9129 27.995 2746 18.750 31.250 56.250 9.9573 9.2285 28.024 2747 25.000 31.250 56.250 10.837 9.6818 28.065 2748 31.250 31.250 56.250 12.009 10.286 28.120 2749 37.500 31.250 56.250 13.496 11.053 28.189 2750 43.750 31.250 56.250 15.320 11.993 28.275 2751 50.000 31.250 56.250 17.499 13.117 28.377 2752 56.250 31.250 56.250 20.050 14.432 28.497 2753 62.500 31.250 56.250 22.989 15.948 28.634 2754 68.750 31.250 56.250 26.332 17.671 28.791 2755 75.000 31.250 56.250 30.094 19.611 28.967 2756 81.250 31.250 56.250 34.288 21.773 29.164 2757 87.500 31.250 56.250 38.926 24.165 29.381 2758 93.750 31.250 56.250 44.023 26.793 29.620 2759 100.00 31.250 56.250 49.589 29.663 29.881 2760 0.0000 37.500 56.250 10.049 11.190 28.398 2761 6.2500 37.500 56.250 10.260 11.299 28.407 2762 12.500 37.500 56.250 10.635 11.492 28.425 2763 18.750 37.500 56.250 11.247 11.808 28.454 2764 25.000 37.500 56.250 12.127 12.261 28.495 2765 31.250 37.500 56.250 13.299 12.866 28.550 2766 37.500 37.500 56.250 14.786 13.633 28.619 2767 43.750 37.500 56.250 16.610 14.573 28.705 2768 50.000 37.500 56.250 18.789 15.696 28.807 2769 56.250 37.500 56.250 21.340 17.012 28.927 2770 62.500 37.500 56.250 24.279 18.527 29.064 2771 68.750 37.500 56.250 27.622 20.251 29.221 2772 75.000 37.500 56.250 31.384 22.191 29.397 2773 81.250 37.500 56.250 35.578 24.353 29.594 2774 87.500 37.500 56.250 40.216 26.745 29.811 2775 93.750 37.500 56.250 45.313 29.372 30.050 2776 100.00 37.500 56.250 50.879 32.243 30.311 2777 0.0000 43.750 56.250 11.631 14.353 28.925 2778 6.2500 43.750 56.250 11.841 14.461 28.935 2779 12.500 43.750 56.250 12.217 14.655 28.952 2780 18.750 43.750 56.250 12.829 14.971 28.981 2781 25.000 43.750 56.250 13.708 15.424 29.022 2782 31.250 43.750 56.250 14.880 16.028 29.077 2783 37.500 43.750 56.250 16.368 16.795 29.147 2784 43.750 43.750 56.250 18.191 17.735 29.232 2785 50.000 43.750 56.250 20.370 18.859 29.334 2786 56.250 43.750 56.250 22.921 20.174 29.454 2787 62.500 43.750 56.250 25.860 21.690 29.591 2788 68.750 43.750 56.250 29.204 23.413 29.748 2789 75.000 43.750 56.250 32.965 25.353 29.924 2790 81.250 43.750 56.250 37.159 27.515 30.121 2791 87.500 43.750 56.250 41.798 29.907 30.338 2792 93.750 43.750 56.250 46.894 32.535 30.577 2793 100.00 43.750 56.250 52.461 35.405 30.838 2794 0.0000 50.000 56.250 13.520 18.131 29.554 2795 6.2500 50.000 56.250 13.730 18.239 29.564 2796 12.500 50.000 56.250 14.106 18.433 29.582 2797 18.750 50.000 56.250 14.718 18.748 29.611 2798 25.000 50.000 56.250 15.597 19.202 29.652 2799 31.250 50.000 56.250 16.769 19.806 29.707 2800 37.500 50.000 56.250 18.257 20.573 29.776 2801 43.750 50.000 56.250 20.081 21.513 29.862 2802 50.000 50.000 56.250 22.259 22.637 29.964 2803 56.250 50.000 56.250 24.810 23.952 30.083 2804 62.500 50.000 56.250 27.750 25.467 30.221 2805 68.750 50.000 56.250 31.093 27.191 30.378 2806 75.000 50.000 56.250 34.854 29.131 30.554 2807 81.250 50.000 56.250 39.048 31.293 30.751 2808 87.500 50.000 56.250 43.687 33.685 30.968 2809 93.750 50.000 56.250 48.784 36.313 31.207 2810 100.00 50.000 56.250 54.350 39.183 31.468 2811 0.0000 56.250 56.250 15.732 22.554 30.292 2812 6.2500 56.250 56.250 15.942 22.662 30.302 2813 12.500 56.250 56.250 16.318 22.856 30.319 2814 18.750 56.250 56.250 16.930 23.172 30.348 2815 25.000 56.250 56.250 17.809 23.625 30.389 2816 31.250 56.250 56.250 18.981 24.229 30.444 2817 37.500 56.250 56.250 20.469 24.996 30.514 2818 43.750 56.250 56.250 22.293 25.937 30.599 2819 50.000 56.250 56.250 24.471 27.060 30.701 2820 62.500 56.250 56.250 29.962 29.891 30.959 2821 68.750 56.250 56.250 33.305 31.615 31.115 2822 75.000 56.250 56.250 37.066 33.554 31.291 2823 81.250 56.250 56.250 41.260 35.716 31.488 2824 87.500 56.250 56.250 45.899 38.108 31.705 2825 93.750 56.250 56.250 50.996 40.736 31.944 2826 100.00 56.250 56.250 56.562 43.606 32.205 2827 0.0000 62.500 56.250 18.281 27.651 31.141 2828 6.2500 62.500 56.250 18.491 27.760 31.151 2829 12.500 62.500 56.250 18.867 27.953 31.169 2830 18.750 62.500 56.250 19.479 28.269 31.198 2831 25.000 62.500 56.250 20.358 28.722 31.239 2832 31.250 62.500 56.250 21.530 29.326 31.294 2833 37.500 62.500 56.250 23.018 30.093 31.363 2834 43.750 62.500 56.250 24.841 31.034 31.449 2835 50.000 62.500 56.250 27.020 32.157 31.551 2836 56.250 62.500 56.250 29.571 33.472 31.670 2837 62.500 62.500 56.250 32.510 34.988 31.808 2838 68.750 62.500 56.250 35.854 36.712 31.965 2839 75.000 62.500 56.250 39.615 38.651 32.141 2840 81.250 62.500 56.250 43.809 40.814 32.338 2841 87.500 62.500 56.250 48.448 43.205 32.555 2842 93.750 62.500 56.250 53.544 45.833 32.794 2843 100.00 62.500 56.250 59.111 48.703 33.055 2844 0.0000 68.750 56.250 21.180 33.448 32.108 2845 6.2500 68.750 56.250 21.390 33.557 32.118 2846 12.500 68.750 56.250 21.766 33.751 32.135 2847 18.750 68.750 56.250 22.378 34.066 32.164 2848 25.000 68.750 56.250 23.257 34.519 32.205 2849 31.250 68.750 56.250 24.429 35.124 32.260 2850 37.500 68.750 56.250 25.917 35.891 32.330 2851 43.750 68.750 56.250 27.741 36.831 32.415 2852 50.000 68.750 56.250 29.919 37.954 32.517 2853 56.250 68.750 56.250 32.470 39.270 32.637 2854 62.500 68.750 56.250 35.410 40.785 32.775 2855 68.750 68.750 56.250 38.753 42.509 32.931 2856 75.000 68.750 56.250 42.514 44.449 33.107 2857 81.250 68.750 56.250 46.708 46.611 33.304 2858 87.500 68.750 56.250 51.347 49.003 33.521 2859 93.750 68.750 56.250 56.444 51.631 33.760 2860 100.00 68.750 56.250 62.010 54.501 34.021 2861 0.0000 75.000 56.250 24.442 39.971 33.195 2862 6.2500 75.000 56.250 24.652 40.080 33.205 2863 12.500 75.000 56.250 25.028 40.273 33.222 2864 18.750 75.000 56.250 25.640 40.589 33.251 2865 25.000 75.000 56.250 26.519 41.042 33.292 2866 31.250 75.000 56.250 27.691 41.647 33.347 2867 37.500 75.000 56.250 29.179 42.414 33.417 2868 43.750 75.000 56.250 31.002 43.354 33.502 2869 50.000 75.000 56.250 33.181 44.477 33.605 2870 56.250 75.000 56.250 35.732 45.792 33.724 2871 62.500 75.000 56.250 38.671 47.308 33.862 2872 68.750 75.000 56.250 42.015 49.032 34.018 2873 75.000 75.000 56.250 45.776 50.971 34.195 2874 81.250 75.000 56.250 49.970 53.134 34.391 2875 87.500 75.000 56.250 54.609 55.525 34.609 2876 93.750 75.000 56.250 59.705 58.153 34.847 2877 100.00 75.000 56.250 65.272 61.023 35.108 2878 0.0000 81.250 56.250 28.078 47.243 34.407 2879 6.2500 81.250 56.250 28.289 47.352 34.417 2880 12.500 81.250 56.250 28.664 47.545 34.435 2881 18.750 81.250 56.250 29.276 47.861 34.463 2882 25.000 81.250 56.250 30.155 48.314 34.505 2883 31.250 81.250 56.250 31.327 48.918 34.559 2884 37.500 81.250 56.250 32.815 49.685 34.629 2885 43.750 81.250 56.250 34.639 50.626 34.715 2886 50.000 81.250 56.250 36.817 51.749 34.817 2887 56.250 81.250 56.250 39.368 53.064 34.936 2888 62.500 81.250 56.250 42.308 54.580 35.074 2889 68.750 81.250 56.250 45.651 56.304 35.231 2890 75.000 81.250 56.250 49.413 58.243 35.407 2891 81.250 81.250 56.250 53.606 60.406 35.603 2892 87.500 81.250 56.250 58.245 62.797 35.821 2893 93.750 81.250 56.250 63.342 65.425 36.060 2894 100.00 81.250 56.250 68.908 68.295 36.320 2895 0.0000 87.500 56.250 32.101 55.287 35.748 2896 6.2500 87.500 56.250 32.311 55.395 35.758 2897 12.500 87.500 56.250 32.687 55.589 35.775 2898 18.750 87.500 56.250 33.299 55.905 35.804 2899 25.000 87.500 56.250 34.178 56.358 35.845 2900 31.250 87.500 56.250 35.350 56.962 35.900 2901 37.500 87.500 56.250 36.838 57.729 35.970 2902 43.750 87.500 56.250 38.661 58.670 36.055 2903 50.000 87.500 56.250 40.840 59.793 36.158 2904 56.250 87.500 56.250 43.391 61.108 36.277 2905 62.500 87.500 56.250 46.330 62.624 36.415 2906 68.750 87.500 56.250 49.674 64.348 36.571 2907 75.000 87.500 56.250 53.435 66.287 36.748 2908 81.250 87.500 56.250 57.629 68.449 36.944 2909 87.500 87.500 56.250 62.268 70.841 37.162 2910 93.750 87.500 56.250 67.364 73.469 37.400 2911 100.00 87.500 56.250 72.931 76.339 37.661 2912 0.0000 93.750 56.250 36.520 64.125 37.221 2913 6.2500 93.750 56.250 36.731 64.233 37.231 2914 12.500 93.750 56.250 37.106 64.427 37.249 2915 18.750 93.750 56.250 37.718 64.742 37.277 2916 25.000 93.750 56.250 38.597 65.196 37.319 2917 31.250 93.750 56.250 39.769 65.800 37.373 2918 37.500 93.750 56.250 41.257 66.567 37.443 2919 43.750 93.750 56.250 43.081 67.507 37.529 2920 50.000 93.750 56.250 45.259 68.631 37.631 2921 56.250 93.750 56.250 47.810 69.946 37.750 2922 62.500 93.750 56.250 50.750 71.461 37.888 2923 68.750 93.750 56.250 54.093 73.185 38.045 2924 75.000 93.750 56.250 57.855 75.125 38.221 2925 81.250 93.750 56.250 62.048 77.287 38.417 2926 87.500 93.750 56.250 66.687 79.679 38.635 2927 93.750 93.750 56.250 71.784 82.307 38.874 2928 100.00 93.750 56.250 77.350 85.177 39.134 2929 0.0000 100.00 56.250 41.347 73.777 38.830 2930 6.2500 100.00 56.250 41.557 73.885 38.840 2931 12.500 100.00 56.250 41.933 74.079 38.858 2932 18.750 100.00 56.250 42.545 74.395 38.886 2933 25.000 100.00 56.250 43.424 74.848 38.927 2934 31.250 100.00 56.250 44.596 75.452 38.982 2935 37.500 100.00 56.250 46.084 76.219 39.052 2936 43.750 100.00 56.250 47.908 77.160 39.138 2937 50.000 100.00 56.250 50.086 78.283 39.240 2938 56.250 100.00 56.250 52.637 79.598 39.359 2939 62.500 100.00 56.250 55.577 81.114 39.497 2940 68.750 100.00 56.250 58.920 82.838 39.654 2941 75.000 100.00 56.250 62.682 84.777 39.830 2942 81.250 100.00 56.250 66.875 86.939 40.026 2943 87.500 100.00 56.250 71.514 89.331 40.244 2944 93.750 100.00 56.250 76.611 91.959 40.483 2945 6.2500 0.0000 56.250 6.1522 3.0849 27.038 2946 6.2500 0.0000 62.500 7.4388 3.5995 33.815 2947 12.500 0.0000 62.500 7.8142 3.7930 33.832 2948 18.750 0.0000 62.500 8.4263 4.1086 33.861 2949 25.000 0.0000 62.500 9.3055 4.5620 33.902 2950 31.250 0.0000 62.500 10.478 5.1663 33.957 2951 37.500 0.0000 62.500 11.965 5.9333 34.027 2952 43.750 0.0000 62.500 13.789 6.8736 34.112 2953 50.000 0.0000 62.500 15.968 7.9969 34.214 2954 56.250 0.0000 62.500 18.519 9.3122 34.334 2955 62.500 0.0000 62.500 21.458 10.828 34.472 2956 68.750 0.0000 62.500 24.801 12.552 34.628 2957 75.000 0.0000 62.500 28.563 14.491 34.805 2958 81.250 0.0000 62.500 32.757 16.653 35.001 2959 87.500 0.0000 62.500 37.395 19.045 35.218 2960 93.750 0.0000 62.500 42.492 21.673 35.457 2961 100.00 0.0000 62.500 48.058 24.543 35.718 2962 0.0000 6.2500 62.500 7.4108 3.8559 33.866 2963 6.2500 6.2500 62.500 7.6213 3.9645 33.876 2964 12.500 6.2500 62.500 7.9967 4.1580 33.893 2965 18.750 6.2500 62.500 8.6089 4.4737 33.922 2966 25.000 6.2500 62.500 9.4881 4.9270 33.963 2967 31.250 6.2500 62.500 10.660 5.5313 34.018 2968 37.500 6.2500 62.500 12.148 6.2983 34.088 2969 43.750 6.2500 62.500 13.972 7.2387 34.173 2970 50.000 6.2500 62.500 16.150 8.3620 34.275 2971 56.250 6.2500 62.500 18.701 9.6772 34.395 2972 62.500 6.2500 62.500 21.641 11.193 34.533 2973 68.750 6.2500 62.500 24.984 12.917 34.689 2974 75.000 6.2500 62.500 28.745 14.856 34.865 2975 81.250 6.2500 62.500 32.939 17.018 35.062 2976 87.500 6.2500 62.500 37.578 19.410 35.279 2977 93.750 6.2500 62.500 42.675 22.038 35.518 2978 100.00 6.2500 62.500 48.241 24.908 35.779 2979 100.00 12.500 62.500 48.566 25.559 35.887 2980 6.2500 12.500 62.500 7.9468 4.6154 33.984 2981 12.500 12.500 62.500 8.3222 4.8090 34.002 2982 18.750 12.500 62.500 8.9344 5.1246 34.030 2983 25.000 12.500 62.500 9.8136 5.5779 34.072 2984 31.250 12.500 62.500 10.986 6.1823 34.127 2985 37.500 12.500 62.500 12.473 6.9493 34.196 2986 43.750 12.500 62.500 14.297 7.8896 34.282 2987 50.000 12.500 62.500 16.476 9.0129 34.384 2988 56.250 12.500 62.500 19.027 10.328 34.503 2989 62.500 12.500 62.500 21.966 11.844 34.641 2990 68.750 12.500 62.500 25.309 13.568 34.798 2991 75.000 12.500 62.500 29.071 15.507 34.974 2992 81.250 12.500 62.500 33.265 17.669 35.170 2993 87.500 12.500 62.500 37.903 20.061 35.388 2994 93.750 12.500 62.500 43.000 22.689 35.627 2995 93.750 12.500 68.750 44.463 23.274 43.334 2996 0.0000 18.750 62.500 8.2672 5.5684 34.151 2997 6.2500 18.750 62.500 8.4777 5.6769 34.161 2998 12.500 18.750 62.500 8.8531 5.8705 34.179 2999 18.750 18.750 62.500 9.4652 6.1861 34.207 3000 25.000 18.750 62.500 10.344 6.6395 34.249 3001 31.250 18.750 62.500 11.516 7.2438 34.303 3002 37.500 18.750 62.500 13.004 8.0108 34.373 3003 43.750 18.750 62.500 14.828 8.9511 34.459 3004 50.000 18.750 62.500 17.006 10.074 34.561 3005 56.250 18.750 62.500 19.557 11.390 34.680 3006 62.500 18.750 62.500 22.497 12.905 34.818 3007 68.750 18.750 62.500 25.840 14.629 34.975 3008 75.000 18.750 62.500 29.602 16.569 35.151 3009 81.250 18.750 62.500 33.795 18.731 35.347 3010 87.500 18.750 62.500 38.434 21.123 35.565 3011 93.750 18.750 62.500 43.531 23.751 35.804 3012 100.00 18.750 62.500 49.097 26.621 36.064 3013 0.0000 25.000 62.500 9.0295 7.0930 34.405 3014 6.2500 25.000 62.500 9.2400 7.2015 34.415 3015 12.500 25.000 62.500 9.6154 7.3951 34.433 3016 18.750 25.000 62.500 10.228 7.7107 34.461 3017 25.000 25.000 62.500 11.107 8.1640 34.503 3018 31.250 25.000 62.500 12.279 8.7683 34.558 3019 37.500 25.000 62.500 13.767 9.5354 34.627 3020 43.750 25.000 62.500 15.590 10.476 34.713 3021 50.000 25.000 62.500 17.769 11.599 34.815 3022 56.250 25.000 62.500 20.320 12.914 34.934 3023 62.500 25.000 62.500 23.259 14.430 35.072 3024 68.750 25.000 62.500 26.603 16.154 35.229 3025 75.000 25.000 62.500 30.364 18.093 35.405 3026 81.250 25.000 62.500 34.558 20.255 35.602 3027 87.500 25.000 62.500 39.197 22.647 35.819 3028 93.750 25.000 62.500 44.293 25.275 36.058 3029 100.00 25.000 62.500 49.860 28.145 36.319 3030 0.0000 31.250 62.500 10.046 9.1253 34.744 3031 6.2500 31.250 62.500 10.256 9.2339 34.754 3032 12.500 31.250 62.500 10.632 9.4274 34.772 3033 18.750 31.250 62.500 11.244 9.7430 34.800 3034 25.000 31.250 62.500 12.123 10.196 34.841 3035 31.250 31.250 62.500 13.295 10.801 34.896 3036 37.500 31.250 62.500 14.783 11.568 34.966 3037 43.750 31.250 62.500 16.607 12.508 35.052 3038 50.000 31.250 62.500 18.785 13.631 35.154 3039 56.250 31.250 62.500 21.336 14.947 35.273 3040 62.500 31.250 62.500 24.276 16.462 35.411 3041 68.750 31.250 62.500 27.619 18.186 35.568 3042 75.000 31.250 62.500 31.381 20.126 35.744 3043 81.250 31.250 62.500 35.574 22.288 35.940 3044 87.500 31.250 62.500 40.213 24.680 36.158 3045 93.750 31.250 62.500 45.310 27.307 36.397 3046 100.00 31.250 62.500 50.876 30.177 36.657 3047 0.0000 37.500 62.500 11.336 11.705 35.174 3048 6.2500 37.500 62.500 11.546 11.813 35.184 3049 12.500 37.500 62.500 11.922 12.007 35.202 3050 18.750 37.500 62.500 12.534 12.323 35.230 3051 25.000 37.500 62.500 13.413 12.776 35.271 3052 31.250 37.500 62.500 14.585 13.380 35.326 3053 37.500 37.500 62.500 16.073 14.147 35.396 3054 43.750 37.500 62.500 17.897 15.088 35.482 3055 50.000 37.500 62.500 20.075 16.211 35.584 3056 56.250 37.500 62.500 22.626 17.526 35.703 3057 62.500 37.500 62.500 25.566 19.042 35.841 3058 68.750 37.500 62.500 28.909 20.766 35.998 3059 75.000 37.500 62.500 32.670 22.705 36.174 3060 81.250 37.500 62.500 36.864 24.867 36.370 3061 87.500 37.500 62.500 41.503 27.259 36.588 3062 93.750 37.500 62.500 46.600 29.887 36.827 3063 100.00 37.500 62.500 52.166 32.757 37.087 3064 0.0000 43.750 62.500 12.917 14.867 35.701 3065 6.2500 43.750 62.500 13.128 14.976 35.711 3066 12.500 43.750 62.500 13.503 15.169 35.729 3067 18.750 43.750 62.500 14.115 15.485 35.757 3068 25.000 43.750 62.500 14.995 15.938 35.799 3069 31.250 43.750 62.500 16.167 16.543 35.854 3070 37.500 43.750 62.500 17.654 17.310 35.923 3071 43.750 43.750 62.500 19.478 18.250 36.009 3072 50.000 43.750 62.500 21.657 19.373 36.111 3073 56.250 43.750 62.500 24.208 20.689 36.230 3074 62.500 43.750 62.500 27.147 22.204 36.368 3075 68.750 43.750 62.500 30.490 23.928 36.525 3076 75.000 43.750 62.500 34.252 25.868 36.701 3077 81.250 43.750 62.500 38.446 28.030 36.897 3078 87.500 43.750 62.500 43.084 30.422 37.115 3079 93.750 43.750 62.500 48.181 33.049 37.354 3080 100.00 43.750 62.500 53.747 35.919 37.614 3081 0.0000 50.000 62.500 14.806 18.645 36.331 3082 6.2500 50.000 62.500 15.017 18.754 36.341 3083 12.500 50.000 62.500 15.392 18.947 36.358 3084 18.750 50.000 62.500 16.005 19.263 36.387 3085 25.000 50.000 62.500 16.884 19.716 36.428 3086 31.250 50.000 62.500 18.056 20.320 36.483 3087 37.500 50.000 62.500 19.543 21.088 36.553 3088 43.750 50.000 62.500 21.367 22.028 36.638 3089 50.000 50.000 62.500 23.546 23.151 36.740 3090 56.250 50.000 62.500 26.097 24.466 36.860 3091 62.500 50.000 62.500 29.036 25.982 36.998 3092 68.750 50.000 62.500 32.379 27.706 37.154 3093 75.000 50.000 62.500 36.141 29.645 37.331 3094 81.250 50.000 62.500 40.335 31.808 37.527 3095 87.500 50.000 62.500 44.974 34.199 37.745 3096 93.750 50.000 62.500 50.070 36.827 37.983 3097 100.00 50.000 62.500 55.637 39.697 38.244 3098 0.0000 56.250 62.500 17.018 23.069 37.068 3099 6.2500 56.250 62.500 17.229 23.177 37.078 3100 12.500 56.250 62.500 17.604 23.371 37.096 3101 18.750 56.250 62.500 18.216 23.686 37.124 3102 25.000 56.250 62.500 19.096 24.140 37.166 3103 31.250 56.250 62.500 20.268 24.744 37.221 3104 37.500 56.250 62.500 21.755 25.511 37.290 3105 43.750 56.250 62.500 23.579 26.451 37.376 3106 50.000 56.250 62.500 25.758 27.575 37.478 3107 56.250 56.250 62.500 28.309 28.890 37.597 3108 62.500 56.250 62.500 31.248 30.405 37.735 3109 68.750 56.250 62.500 34.591 32.129 37.892 3110 75.000 56.250 62.500 38.353 34.069 38.068 3111 81.250 56.250 62.500 42.547 36.231 38.265 3112 87.500 56.250 62.500 47.186 38.623 38.482 3113 93.750 56.250 62.500 52.282 41.251 38.721 3114 100.00 56.250 62.500 57.849 44.121 38.982 3115 0.0000 62.500 62.500 19.567 28.166 37.918 3116 6.2500 62.500 62.500 19.778 28.274 37.928 3117 12.500 62.500 62.500 20.153 28.468 37.945 3118 18.750 62.500 62.500 20.765 28.783 37.974 3119 25.000 62.500 62.500 21.645 29.237 38.015 3120 31.250 62.500 62.500 22.817 29.841 38.070 3121 37.500 62.500 62.500 24.304 30.608 38.140 3122 43.750 62.500 62.500 26.128 31.548 38.225 3123 50.000 62.500 62.500 28.307 32.672 38.327 3124 56.250 62.500 62.500 30.858 33.987 38.447 3125 68.750 62.500 62.500 37.140 37.226 38.741 3126 75.000 62.500 62.500 40.902 39.166 38.918 3127 81.250 62.500 62.500 45.096 41.328 39.114 3128 87.500 62.500 62.500 49.734 43.720 39.332 3129 93.750 62.500 62.500 54.831 46.348 39.570 3130 100.00 62.500 62.500 60.398 49.218 39.831 3131 0.0000 68.750 62.500 22.466 33.963 38.884 3132 6.2500 68.750 62.500 22.677 34.072 38.894 3133 12.500 68.750 62.500 23.052 34.265 38.912 3134 18.750 68.750 62.500 23.665 34.581 38.940 3135 25.000 68.750 62.500 24.544 35.034 38.982 3136 31.250 68.750 62.500 25.716 35.638 39.037 3137 37.500 68.750 62.500 27.203 36.405 39.106 3138 43.750 68.750 62.500 29.027 37.346 39.192 3139 50.000 68.750 62.500 31.206 38.469 39.294 3140 56.250 68.750 62.500 33.757 39.784 39.413 3141 62.500 68.750 62.500 36.696 41.300 39.551 3142 68.750 68.750 62.500 40.039 43.024 39.708 3143 75.000 68.750 62.500 43.801 44.963 39.884 3144 81.250 68.750 62.500 47.995 47.125 40.081 3145 87.500 68.750 62.500 52.634 49.517 40.298 3146 93.750 68.750 62.500 57.730 52.145 40.537 3147 100.00 68.750 62.500 63.297 55.015 40.798 3148 0.0000 75.000 62.500 25.728 40.486 39.972 3149 6.2500 75.000 62.500 25.939 40.594 39.981 3150 12.500 75.000 62.500 26.314 40.788 39.999 3151 18.750 75.000 62.500 26.926 41.103 40.028 3152 25.000 75.000 62.500 27.806 41.557 40.069 3153 31.250 75.000 62.500 28.978 42.161 40.124 3154 37.500 75.000 62.500 30.465 42.928 40.194 3155 43.750 75.000 62.500 32.289 43.868 40.279 3156 50.000 75.000 62.500 34.468 44.992 40.381 3157 56.250 75.000 62.500 37.019 46.307 40.501 3158 62.500 75.000 62.500 39.958 47.823 40.638 3159 68.750 75.000 62.500 43.301 49.546 40.795 3160 75.000 75.000 62.500 47.063 51.486 40.971 3161 81.250 75.000 62.500 51.257 53.648 41.168 3162 87.500 75.000 62.500 55.895 56.040 41.385 3163 93.750 75.000 62.500 60.992 58.668 41.624 3164 100.00 75.000 62.500 66.558 61.538 41.885 3165 0.0000 81.250 62.500 29.365 47.758 41.184 3166 6.2500 81.250 62.500 29.575 47.866 41.194 3167 12.500 81.250 62.500 29.951 48.060 41.211 3168 18.750 81.250 62.500 30.563 48.375 41.240 3169 25.000 81.250 62.500 31.442 48.829 41.281 3170 31.250 81.250 62.500 32.614 49.433 41.336 3171 37.500 81.250 62.500 34.102 50.200 41.406 3172 43.750 81.250 62.500 35.925 51.140 41.491 3173 50.000 81.250 62.500 38.104 52.264 41.593 3174 56.250 81.250 62.500 40.655 53.579 41.713 3175 62.500 81.250 62.500 43.594 55.095 41.851 3176 68.750 81.250 62.500 46.938 56.818 42.007 3177 75.000 81.250 62.500 50.699 58.758 42.183 3178 81.250 81.250 62.500 54.893 60.920 42.380 3179 87.500 81.250 62.500 59.532 63.312 42.597 3180 93.750 81.250 62.500 64.628 65.940 42.836 3181 100.00 81.250 62.500 70.195 68.810 43.097 3182 0.0000 87.500 62.500 33.387 55.801 42.525 3183 6.2500 87.500 62.500 33.598 55.910 42.534 3184 12.500 87.500 62.500 33.973 56.104 42.552 3185 18.750 87.500 62.500 34.585 56.419 42.581 3186 25.000 87.500 62.500 35.464 56.873 42.622 3187 31.250 87.500 62.500 36.637 57.477 42.677 3188 37.500 87.500 62.500 38.124 58.244 42.747 3189 43.750 87.500 62.500 39.948 59.184 42.832 3190 50.000 87.500 62.500 42.127 60.308 42.934 3191 56.250 87.500 62.500 44.677 61.623 43.054 3192 62.500 87.500 62.500 47.617 63.138 43.191 3193 68.750 87.500 62.500 50.960 64.862 43.348 3194 75.000 87.500 62.500 54.722 66.802 43.524 3195 81.250 87.500 62.500 58.916 68.964 43.721 3196 87.500 87.500 62.500 63.554 71.356 43.938 3197 93.750 87.500 62.500 68.651 73.984 44.177 3198 100.00 87.500 62.500 74.217 76.854 44.438 3199 0.0000 93.750 62.500 37.807 64.639 43.998 3200 6.2500 93.750 62.500 38.017 64.748 44.008 3201 12.500 93.750 62.500 38.393 64.941 44.025 3202 18.750 93.750 62.500 39.005 65.257 44.054 3203 25.000 93.750 62.500 39.884 65.710 44.095 3204 31.250 93.750 62.500 41.056 66.314 44.150 3205 37.500 93.750 62.500 42.544 67.082 44.220 3206 43.750 93.750 62.500 44.367 68.022 44.305 3207 50.000 93.750 62.500 46.546 69.145 44.407 3208 56.250 93.750 62.500 49.097 70.460 44.527 3209 62.500 93.750 62.500 52.036 71.976 44.665 3210 68.750 93.750 62.500 55.380 73.700 44.821 3211 75.000 93.750 62.500 59.141 75.639 44.997 3212 81.250 93.750 62.500 63.335 77.802 45.194 3213 87.500 93.750 62.500 67.974 80.193 45.411 3214 93.750 93.750 62.500 73.070 82.821 45.650 3215 100.00 93.750 62.500 78.637 85.691 45.911 3216 0.0000 100.00 62.500 42.633 74.291 45.607 3217 6.2500 100.00 62.500 42.844 74.400 45.617 3218 12.500 100.00 62.500 43.219 74.594 45.634 3219 18.750 100.00 62.500 43.832 74.909 45.663 3220 25.000 100.00 62.500 44.711 75.362 45.704 3221 31.250 100.00 62.500 45.883 75.967 45.759 3222 37.500 100.00 62.500 47.370 76.734 45.829 3223 43.750 100.00 62.500 49.194 77.674 45.914 3224 50.000 100.00 62.500 51.373 78.797 46.016 3225 56.250 100.00 62.500 53.924 80.113 46.136 3226 62.500 100.00 62.500 56.863 81.628 46.274 3227 68.750 100.00 62.500 60.207 83.352 46.430 3228 75.000 100.00 62.500 63.968 85.292 46.606 3229 81.250 100.00 62.500 68.162 87.454 46.803 3230 87.500 100.00 62.500 72.801 89.846 47.020 3231 93.750 100.00 62.500 77.897 92.474 47.259 3232 100.00 100.00 62.500 83.464 95.344 47.520 3233 6.2500 0.0000 68.750 8.9021 4.1847 41.522 3234 12.500 0.0000 68.750 9.2775 4.3783 41.540 3235 18.750 0.0000 68.750 9.8897 4.6939 41.569 3236 25.000 0.0000 68.750 10.769 5.1472 41.610 3237 31.250 0.0000 68.750 11.941 5.7515 41.665 3238 37.500 0.0000 68.750 13.429 6.5185 41.734 3239 43.750 0.0000 68.750 15.252 7.4589 41.820 3240 50.000 0.0000 68.750 17.431 8.5822 41.922 3241 56.250 0.0000 68.750 19.982 9.8975 42.042 3242 62.500 0.0000 68.750 22.921 11.413 42.179 3243 68.750 0.0000 68.750 26.265 13.137 42.336 3244 75.000 0.0000 68.750 30.026 15.076 42.512 3245 81.250 0.0000 68.750 34.220 17.239 42.709 3246 87.500 0.0000 68.750 38.859 19.630 42.926 3247 93.750 0.0000 68.750 43.955 22.258 43.165 3248 93.750 6.2500 68.750 44.138 22.623 43.226 3249 0.0000 6.2500 68.750 8.8741 4.4412 41.573 3250 6.2500 6.2500 68.750 9.0847 4.5497 41.583 3251 12.500 6.2500 68.750 9.4601 4.7433 41.601 3252 18.750 6.2500 68.750 10.072 5.0589 41.629 3253 25.000 6.2500 68.750 10.951 5.5122 41.671 3254 31.250 6.2500 68.750 12.123 6.1165 41.726 3255 37.500 6.2500 68.750 13.611 6.8836 41.795 3256 43.750 6.2500 68.750 15.435 7.8239 41.881 3257 50.000 6.2500 68.750 17.613 8.9472 41.983 3258 56.250 6.2500 68.750 20.164 10.262 42.102 3259 62.500 6.2500 68.750 23.104 11.778 42.240 3260 68.750 6.2500 68.750 26.447 13.502 42.397 3261 75.000 6.2500 68.750 30.209 15.441 42.573 3262 81.250 6.2500 68.750 34.402 17.604 42.770 3263 87.500 6.2500 68.750 39.041 19.995 42.987 3264 100.00 0.0000 68.750 49.522 25.128 43.426 3265 100.00 6.2500 68.750 49.704 25.493 43.487 3266 100.00 12.500 68.750 50.030 26.144 43.595 3267 6.2500 12.500 68.750 9.4102 5.2007 41.692 3268 12.500 12.500 68.750 9.7856 5.3942 41.709 3269 18.750 12.500 68.750 10.398 5.7099 41.738 3270 25.000 12.500 68.750 11.277 6.1632 41.779 3271 31.250 12.500 68.750 12.449 6.7675 41.834 3272 37.500 12.500 68.750 13.937 7.5345 41.904 3273 43.750 12.500 68.750 15.760 8.4749 41.989 3274 50.000 12.500 68.750 17.939 9.5982 42.091 3275 56.250 12.500 68.750 20.490 10.913 42.211 3276 62.500 12.500 68.750 23.429 12.429 42.349 3277 68.750 12.500 68.750 26.773 14.153 42.505 3278 75.000 12.500 68.750 30.534 16.092 42.682 3279 81.250 12.500 68.750 34.728 18.255 42.878 3280 87.500 12.500 68.750 39.367 20.646 43.095 3281 0.0000 12.500 62.500 7.7363 4.5069 33.974 3282 0.0000 12.500 68.750 9.1997 5.0921 41.682 3283 0.0000 18.750 68.750 9.7305 6.1536 41.859 3284 6.2500 18.750 68.750 9.9410 6.2622 41.869 3285 12.500 18.750 68.750 10.316 6.4557 41.886 3286 18.750 18.750 68.750 10.929 6.7714 41.915 3287 25.000 18.750 68.750 11.808 7.2247 41.956 3288 31.250 18.750 68.750 12.980 7.8290 42.011 3289 37.500 18.750 68.750 14.467 8.5960 42.081 3290 43.750 18.750 68.750 16.291 9.5364 42.166 3291 50.000 18.750 68.750 18.470 10.660 42.268 3292 56.250 18.750 68.750 21.021 11.975 42.388 3293 62.500 18.750 68.750 23.960 13.491 42.526 3294 68.750 18.750 68.750 27.304 15.214 42.682 3295 75.000 18.750 68.750 31.065 17.154 42.858 3296 81.250 18.750 68.750 35.259 19.316 43.055 3297 87.500 18.750 68.750 39.898 21.708 43.272 3298 93.750 18.750 68.750 44.994 24.336 43.511 3299 100.00 18.750 68.750 50.561 27.206 43.772 3300 0.0000 25.000 68.750 10.493 7.6782 42.113 3301 6.2500 25.000 68.750 10.703 7.7867 42.123 3302 12.500 25.000 68.750 11.079 7.9803 42.140 3303 18.750 25.000 68.750 11.691 8.2959 42.169 3304 25.000 25.000 68.750 12.570 8.7493 42.210 3305 31.250 25.000 68.750 13.742 9.3536 42.265 3306 37.500 25.000 68.750 15.230 10.121 42.335 3307 43.750 25.000 68.750 17.054 11.061 42.420 3308 50.000 25.000 68.750 19.232 12.184 42.522 3309 56.250 25.000 68.750 21.783 13.500 42.642 3310 62.500 25.000 68.750 24.723 15.015 42.780 3311 68.750 25.000 68.750 28.066 16.739 42.936 3312 75.000 25.000 68.750 31.828 18.678 43.113 3313 81.250 25.000 68.750 36.021 20.841 43.309 3314 87.500 25.000 68.750 40.660 23.232 43.526 3315 93.750 25.000 68.750 45.757 25.860 43.765 3316 100.00 25.000 68.750 51.323 28.730 44.026 3317 0.0000 31.250 68.750 11.509 9.7106 42.452 3318 6.2500 31.250 68.750 11.720 9.8191 42.462 3319 12.500 31.250 68.750 12.095 10.013 42.479 3320 18.750 31.250 68.750 12.707 10.328 42.508 3321 25.000 31.250 68.750 13.586 10.782 42.549 3322 31.250 31.250 68.750 14.759 11.386 42.604 3323 37.500 31.250 68.750 16.246 12.153 42.674 3324 43.750 31.250 68.750 18.070 13.093 42.759 3325 50.000 31.250 68.750 20.249 14.217 42.861 3326 56.250 31.250 68.750 22.799 15.532 42.981 3327 62.500 31.250 68.750 25.739 17.047 43.118 3328 68.750 31.250 68.750 29.082 18.771 43.275 3329 75.000 31.250 68.750 32.844 20.711 43.451 3330 81.250 31.250 68.750 37.038 22.873 43.648 3331 87.500 31.250 68.750 41.676 25.265 43.865 3332 93.750 31.250 68.750 46.773 27.893 44.104 3333 100.00 31.250 68.750 52.339 30.763 44.365 3334 0.0000 37.500 68.750 12.799 12.290 42.882 3335 6.2500 37.500 68.750 13.010 12.399 42.892 3336 12.500 37.500 68.750 13.385 12.592 42.909 3337 18.750 37.500 68.750 13.997 12.908 42.938 3338 25.000 37.500 68.750 14.876 13.361 42.979 3339 31.250 37.500 68.750 16.049 13.966 43.034 3340 37.500 37.500 68.750 17.536 14.733 43.104 3341 43.750 37.500 68.750 19.360 15.673 43.189 3342 50.000 37.500 68.750 21.539 16.796 43.291 3343 56.250 37.500 68.750 24.089 18.111 43.411 3344 62.500 37.500 68.750 27.029 19.627 43.548 3345 68.750 37.500 68.750 30.372 21.351 43.705 3346 75.000 37.500 68.750 34.134 23.290 43.881 3347 81.250 37.500 68.750 38.327 25.453 44.078 3348 87.500 37.500 68.750 42.966 27.844 44.295 3349 93.750 37.500 68.750 48.063 30.472 44.534 3350 100.00 37.500 68.750 53.629 33.342 44.795 3351 0.0000 43.750 68.750 14.381 15.453 43.409 3352 6.2500 43.750 68.750 14.591 15.561 43.419 3353 12.500 43.750 68.750 14.967 15.755 43.436 3354 18.750 43.750 68.750 15.579 16.070 43.465 3355 25.000 43.750 68.750 16.458 16.524 43.506 3356 31.250 43.750 68.750 17.630 17.128 43.561 3357 37.500 43.750 68.750 19.118 17.895 43.631 3358 43.750 43.750 68.750 20.941 18.835 43.716 3359 50.000 43.750 68.750 23.120 19.959 43.818 3360 56.250 43.750 68.750 25.671 21.274 43.938 3361 62.500 43.750 68.750 28.610 22.789 44.076 3362 68.750 43.750 68.750 31.954 24.513 44.232 3363 75.000 43.750 68.750 35.715 26.453 44.409 3364 81.250 43.750 68.750 39.909 28.615 44.605 3365 87.500 43.750 68.750 44.548 31.007 44.822 3366 93.750 43.750 68.750 49.644 33.635 45.061 3367 100.00 43.750 68.750 55.211 36.505 45.322 3368 0.0000 50.000 68.750 16.270 19.230 44.039 3369 6.2500 50.000 68.750 16.480 19.339 44.048 3370 12.500 50.000 68.750 16.856 19.532 44.066 3371 18.750 50.000 68.750 17.468 19.848 44.095 3372 25.000 50.000 68.750 18.347 20.301 44.136 3373 31.250 50.000 68.750 19.519 20.906 44.191 3374 37.500 50.000 68.750 21.007 21.673 44.261 3375 43.750 50.000 68.750 22.830 22.613 44.346 3376 50.000 50.000 68.750 25.009 23.736 44.448 3377 56.250 50.000 68.750 27.560 25.052 44.568 3378 62.500 50.000 68.750 30.500 26.567 44.705 3379 68.750 50.000 68.750 33.843 28.291 44.862 3380 75.000 50.000 68.750 37.604 30.231 45.038 3381 81.250 50.000 68.750 41.798 32.393 45.235 3382 87.500 50.000 68.750 46.437 34.785 45.452 3383 93.750 50.000 68.750 51.534 37.412 45.691 3384 100.00 50.000 68.750 57.100 40.283 45.952 3385 0.0000 56.250 68.750 18.482 23.654 44.776 3386 6.2500 56.250 68.750 18.692 23.762 44.786 3387 12.500 56.250 68.750 19.068 23.956 44.803 3388 18.750 56.250 68.750 19.680 24.271 44.832 3389 25.000 56.250 68.750 20.559 24.725 44.873 3390 31.250 56.250 68.750 21.731 25.329 44.928 3391 37.500 56.250 68.750 23.219 26.096 44.998 3392 43.750 56.250 68.750 25.042 27.036 45.083 3393 50.000 56.250 68.750 27.221 28.160 45.185 3394 56.250 56.250 68.750 29.772 29.475 45.305 3395 62.500 56.250 68.750 32.712 30.991 45.443 3396 68.750 56.250 68.750 36.055 32.714 45.599 3397 75.000 56.250 68.750 39.816 34.654 45.776 3398 81.250 56.250 68.750 44.010 36.816 45.972 3399 87.500 56.250 68.750 48.649 39.208 46.189 3400 93.750 56.250 68.750 53.746 41.836 46.428 3401 100.00 56.250 68.750 59.312 44.706 46.689 3402 0.0000 62.500 68.750 21.031 28.751 45.626 3403 6.2500 62.500 68.750 21.241 28.859 45.635 3404 12.500 62.500 68.750 21.617 29.053 45.653 3405 18.750 62.500 68.750 22.229 29.369 45.682 3406 25.000 62.500 68.750 23.108 29.822 45.723 3407 31.250 62.500 68.750 24.280 30.426 45.778 3408 37.500 62.500 68.750 25.768 31.193 45.848 3409 43.750 62.500 68.750 27.591 32.134 45.933 3410 50.000 62.500 68.750 29.770 33.257 46.035 3411 56.250 62.500 68.750 32.321 34.572 46.155 3412 62.500 62.500 68.750 35.260 36.088 46.292 3413 68.750 62.500 68.750 38.604 37.812 46.449 3414 75.000 62.500 68.750 42.365 39.751 46.625 3415 81.250 62.500 68.750 46.559 41.913 46.822 3416 87.500 62.500 68.750 51.198 44.305 47.039 3417 93.750 62.500 68.750 56.294 46.933 47.278 3418 100.00 62.500 68.750 61.861 49.803 47.539 3419 0.0000 68.750 68.750 23.930 34.548 46.592 3420 6.2500 68.750 68.750 24.140 34.657 46.602 3421 12.500 68.750 68.750 24.516 34.850 46.619 3422 18.750 68.750 68.750 25.128 35.166 46.648 3423 25.000 68.750 68.750 26.007 35.619 46.689 3424 31.250 68.750 68.750 27.179 36.224 46.744 3425 37.500 68.750 68.750 28.667 36.991 46.814 3426 43.750 68.750 68.750 30.490 37.931 46.899 3427 50.000 68.750 68.750 32.669 39.054 47.001 3428 56.250 68.750 68.750 35.220 40.370 47.121 3429 62.500 68.750 68.750 38.160 41.885 47.259 3430 75.000 68.750 68.750 45.264 45.548 47.592 3431 81.250 68.750 68.750 49.458 47.711 47.788 3432 87.500 68.750 68.750 54.097 50.103 48.005 3433 93.750 68.750 68.750 59.194 52.730 48.244 3434 100.00 68.750 68.750 64.760 55.600 48.505 3435 0.0000 75.000 68.750 27.192 41.071 47.679 3436 6.2500 75.000 68.750 27.402 41.179 47.689 3437 12.500 75.000 68.750 27.777 41.373 47.707 3438 18.750 75.000 68.750 28.390 41.689 47.735 3439 25.000 75.000 68.750 29.269 42.142 47.777 3440 31.250 75.000 68.750 30.441 42.746 47.831 3441 37.500 75.000 68.750 31.929 43.513 47.901 3442 43.750 75.000 68.750 33.752 44.454 47.987 3443 50.000 75.000 68.750 35.931 45.577 48.089 3444 56.250 75.000 68.750 38.482 46.892 48.208 3445 62.500 75.000 68.750 41.421 48.408 48.346 3446 68.750 75.000 68.750 44.765 50.132 48.503 3447 75.000 75.000 68.750 48.526 52.071 48.679 3448 81.250 75.000 68.750 52.720 54.233 48.875 3449 87.500 75.000 68.750 57.359 56.625 49.093 3450 93.750 75.000 68.750 62.455 59.253 49.332 3451 100.00 75.000 68.750 68.022 62.123 49.592 3452 0.0000 81.250 68.750 30.828 48.343 48.891 3453 6.2500 81.250 68.750 31.039 48.451 48.901 3454 12.500 81.250 68.750 31.414 48.645 48.919 3455 18.750 81.250 68.750 32.026 48.961 48.947 3456 25.000 81.250 68.750 32.905 49.414 48.989 3457 31.250 81.250 68.750 34.077 50.018 49.044 3458 37.500 81.250 68.750 35.565 50.785 49.113 3459 43.750 81.250 68.750 37.389 51.726 49.199 3460 50.000 81.250 68.750 39.567 52.849 49.301 3461 56.250 81.250 68.750 42.118 54.164 49.420 3462 62.500 81.250 68.750 45.058 55.680 49.558 3463 68.750 81.250 68.750 48.401 57.404 49.715 3464 75.000 81.250 68.750 52.163 59.343 49.891 3465 81.250 81.250 68.750 56.356 61.505 50.088 3466 87.500 81.250 68.750 60.995 63.897 50.305 3467 93.750 81.250 68.750 66.092 66.525 50.544 3468 100.00 81.250 68.750 71.658 69.395 50.805 3469 0.0000 87.500 68.750 34.851 56.387 50.232 3470 6.2500 87.500 68.750 35.061 56.495 50.242 3471 12.500 87.500 68.750 35.436 56.689 50.260 3472 18.750 87.500 68.750 36.049 57.004 50.288 3473 25.000 87.500 68.750 36.928 57.458 50.330 3474 31.250 87.500 68.750 38.100 58.062 50.384 3475 37.500 87.500 68.750 39.588 58.829 50.454 3476 43.750 87.500 68.750 41.411 59.769 50.540 3477 50.000 87.500 68.750 43.590 60.893 50.642 3478 56.250 87.500 68.750 46.141 62.208 50.761 3479 62.500 87.500 68.750 49.080 63.724 50.899 3480 68.750 87.500 68.750 52.424 65.447 51.056 3481 75.000 87.500 68.750 56.185 67.387 51.232 3482 81.250 87.500 68.750 60.379 69.549 51.428 3483 87.500 87.500 68.750 65.018 71.941 51.646 3484 93.750 87.500 68.750 70.114 74.569 51.885 3485 100.00 87.500 68.750 75.681 77.439 52.145 3486 0.0000 93.750 68.750 39.270 65.224 51.705 3487 6.2500 93.750 68.750 39.480 65.333 51.715 3488 12.500 93.750 68.750 39.856 65.526 51.733 3489 18.750 93.750 68.750 40.468 65.842 51.761 3490 25.000 93.750 68.750 41.347 66.295 51.803 3491 31.250 93.750 68.750 42.519 66.900 51.858 3492 37.500 93.750 68.750 44.007 67.667 51.927 3493 43.750 93.750 68.750 45.831 68.607 52.013 3494 50.000 93.750 68.750 48.009 69.730 52.115 3495 56.250 93.750 68.750 50.560 71.046 52.234 3496 62.500 93.750 68.750 53.500 72.561 52.372 3497 68.750 93.750 68.750 56.843 74.285 52.529 3498 75.000 93.750 68.750 60.605 76.225 52.705 3499 81.250 93.750 68.750 64.798 78.387 52.902 3500 87.500 93.750 68.750 69.437 80.779 53.119 3501 93.750 93.750 68.750 74.534 83.406 53.358 3502 100.00 93.750 68.750 80.100 86.277 53.619 3503 0.0000 100.00 68.750 44.097 74.877 53.314 3504 6.2500 100.00 68.750 44.307 74.985 53.324 3505 12.500 100.00 68.750 44.683 75.179 53.342 3506 18.750 100.00 68.750 45.295 75.494 53.370 3507 25.000 100.00 68.750 46.174 75.948 53.412 3508 31.250 100.00 68.750 47.346 76.552 53.467 3509 37.500 100.00 68.750 48.834 77.319 53.536 3510 43.750 100.00 68.750 50.658 78.259 53.622 3511 50.000 100.00 68.750 52.836 79.383 53.724 3512 56.250 100.00 68.750 55.387 80.698 53.843 3513 62.500 100.00 68.750 58.327 82.214 53.981 3514 68.750 100.00 68.750 61.670 83.937 54.138 3515 75.000 100.00 68.750 65.431 85.877 54.314 3516 81.250 100.00 68.750 69.625 88.039 54.511 3517 87.500 100.00 68.750 74.264 90.431 54.728 3518 93.750 100.00 68.750 79.361 93.059 54.967 3519 100.00 100.00 68.750 84.927 95.929 55.228 3520 100.00 100.00 75.000 86.573 96.587 63.899 3521 12.500 0.0000 75.000 10.924 5.0367 50.212 3522 18.750 0.0000 75.000 11.536 5.3524 50.241 3523 25.000 0.0000 75.000 12.415 5.8057 50.282 3524 31.250 0.0000 75.000 13.587 6.4100 50.337 3525 37.500 0.0000 75.000 15.075 7.1770 50.406 3526 43.750 0.0000 75.000 16.899 8.1173 50.492 3527 50.000 0.0000 75.000 19.077 9.2407 50.594 3528 56.250 0.0000 75.000 21.628 10.556 50.713 3529 62.500 0.0000 75.000 24.568 12.072 50.851 3530 68.750 0.0000 75.000 27.911 13.795 51.008 3531 75.000 0.0000 75.000 31.673 15.735 51.184 3532 81.250 0.0000 75.000 35.866 17.897 51.381 3533 87.500 0.0000 75.000 40.505 20.289 51.598 3534 93.750 0.0000 75.000 45.602 22.917 51.837 3535 93.750 6.2500 75.000 45.784 23.282 51.898 3536 93.750 12.500 75.000 46.110 23.933 52.006 3537 6.2500 6.2500 75.000 10.731 5.2082 50.255 3538 12.500 6.2500 75.000 11.106 5.4017 50.273 3539 18.750 6.2500 75.000 11.719 5.7174 50.301 3540 25.000 6.2500 75.000 12.598 6.1707 50.343 3541 31.250 6.2500 75.000 13.770 6.7750 50.398 3542 37.500 6.2500 75.000 15.258 7.5420 50.467 3543 43.750 6.2500 75.000 17.081 8.4824 50.553 3544 50.000 6.2500 75.000 19.260 9.6057 50.655 3545 56.250 6.2500 75.000 21.811 10.921 50.774 3546 62.500 6.2500 75.000 24.750 12.437 50.912 3547 68.750 6.2500 75.000 28.094 14.160 51.069 3548 75.000 6.2500 75.000 31.855 16.100 51.245 3549 81.250 6.2500 75.000 36.049 18.262 51.441 3550 87.500 6.2500 75.000 40.688 20.654 51.659 3551 100.00 0.0000 75.000 51.168 25.787 52.098 3552 100.00 6.2500 75.000 51.351 26.152 52.158 3553 100.00 12.500 75.000 51.676 26.803 52.267 3554 6.2500 12.500 75.000 11.057 5.8591 50.364 3555 12.500 12.500 75.000 11.432 6.0527 50.381 3556 18.750 12.500 75.000 12.044 6.3683 50.410 3557 25.000 12.500 75.000 12.923 6.8217 50.451 3558 31.250 12.500 75.000 14.095 7.4260 50.506 3559 37.500 12.500 75.000 15.583 8.1930 50.576 3560 43.750 12.500 75.000 17.407 9.1333 50.661 3561 50.000 12.500 75.000 19.585 10.257 50.763 3562 56.250 12.500 75.000 22.136 11.572 50.883 3563 62.500 12.500 75.000 25.076 13.088 51.021 3564 68.750 12.500 75.000 28.419 14.811 51.177 3565 75.000 12.500 75.000 32.181 16.751 51.353 3566 81.250 12.500 75.000 36.374 18.913 51.550 3567 87.500 12.500 75.000 41.013 21.305 51.767 3568 0.0000 6.2500 75.000 10.521 5.0996 50.245 3569 0.0000 12.500 75.000 10.846 5.7506 50.354 3570 0.0000 18.750 75.000 11.377 6.8121 50.531 3571 6.2500 18.750 75.000 11.587 6.9207 50.541 3572 12.500 18.750 75.000 11.963 7.1142 50.558 3573 18.750 18.750 75.000 12.575 7.4298 50.587 3574 25.000 18.750 75.000 13.454 7.8832 50.628 3575 31.250 18.750 75.000 14.626 8.4875 50.683 3576 37.500 18.750 75.000 16.114 9.2545 50.753 3577 43.750 18.750 75.000 17.938 10.195 50.838 3578 50.000 18.750 75.000 20.116 11.318 50.940 3579 56.250 18.750 75.000 22.667 12.633 51.060 3580 62.500 18.750 75.000 25.607 14.149 51.197 3581 68.750 18.750 75.000 28.950 15.873 51.354 3582 75.000 18.750 75.000 32.712 17.812 51.530 3583 81.250 18.750 75.000 36.905 19.975 51.727 3584 87.500 18.750 75.000 41.544 22.366 51.944 3585 93.750 18.750 75.000 46.641 24.994 52.183 3586 100.00 18.750 75.000 52.207 27.864 52.444 3587 0.0000 25.000 75.000 12.139 8.3367 50.785 3588 6.2500 25.000 75.000 12.350 8.4452 50.795 3589 12.500 25.000 75.000 12.725 8.6388 50.812 3590 18.750 25.000 75.000 13.337 8.9544 50.841 3591 25.000 25.000 75.000 14.217 9.4077 50.882 3592 31.250 25.000 75.000 15.389 10.012 50.937 3593 37.500 25.000 75.000 16.876 10.779 51.007 3594 43.750 25.000 75.000 18.700 11.719 51.092 3595 50.000 25.000 75.000 20.879 12.843 51.194 3596 56.250 25.000 75.000 23.430 14.158 51.314 3597 62.500 25.000 75.000 26.369 15.674 51.452 3598 68.750 25.000 75.000 29.712 17.397 51.608 3599 75.000 25.000 75.000 33.474 19.337 51.785 3600 81.250 25.000 75.000 37.668 21.499 51.981 3601 87.500 25.000 75.000 42.306 23.891 52.198 3602 93.750 25.000 75.000 47.403 26.519 52.437 3603 100.00 25.000 75.000 52.969 29.389 52.698 3604 0.0000 31.250 75.000 13.156 10.369 51.124 3605 6.2500 31.250 75.000 13.366 10.478 51.133 3606 12.500 31.250 75.000 13.742 10.671 51.151 3607 18.750 31.250 75.000 14.354 10.987 51.180 3608 25.000 31.250 75.000 15.233 11.440 51.221 3609 31.250 31.250 75.000 16.405 12.044 51.276 3610 37.500 31.250 75.000 17.893 12.811 51.346 3611 43.750 31.250 75.000 19.716 13.752 51.431 3612 50.000 31.250 75.000 21.895 14.875 51.533 3613 56.250 31.250 75.000 24.446 16.190 51.653 3614 62.500 31.250 75.000 27.385 17.706 51.790 3615 68.750 31.250 75.000 30.729 19.430 51.947 3616 75.000 31.250 75.000 34.490 21.369 52.123 3617 81.250 31.250 75.000 38.684 23.532 52.320 3618 87.500 31.250 75.000 43.323 25.923 52.537 3619 93.750 31.250 75.000 48.419 28.551 52.776 3620 100.00 31.250 75.000 53.986 31.421 53.037 3621 0.0000 37.500 75.000 14.446 12.949 51.554 3622 6.2500 37.500 75.000 14.656 13.057 51.563 3623 12.500 37.500 75.000 15.032 13.251 51.581 3624 18.750 37.500 75.000 15.644 13.566 51.610 3625 25.000 37.500 75.000 16.523 14.020 51.651 3626 31.250 37.500 75.000 17.695 14.624 51.706 3627 37.500 37.500 75.000 19.183 15.391 51.776 3628 43.750 37.500 75.000 21.006 16.331 51.861 3629 50.000 37.500 75.000 23.185 17.455 51.963 3630 56.250 37.500 75.000 25.736 18.770 52.083 3631 62.500 37.500 75.000 28.675 20.286 52.220 3632 68.750 37.500 75.000 32.019 22.009 52.377 3633 75.000 37.500 75.000 35.780 23.949 52.553 3634 81.250 37.500 75.000 39.974 26.111 52.750 3635 87.500 37.500 75.000 44.613 28.503 52.967 3636 93.750 37.500 75.000 49.709 31.131 53.206 3637 100.00 37.500 75.000 55.276 34.001 53.467 3638 0.0000 43.750 75.000 16.027 16.111 52.081 3639 6.2500 43.750 75.000 16.238 16.220 52.091 3640 12.500 43.750 75.000 16.613 16.413 52.108 3641 18.750 43.750 75.000 17.225 16.729 52.137 3642 25.000 43.750 75.000 18.104 17.182 52.178 3643 31.250 43.750 75.000 19.276 17.786 52.233 3644 37.500 43.750 75.000 20.764 18.553 52.303 3645 43.750 43.750 75.000 22.588 19.494 52.388 3646 50.000 43.750 75.000 24.766 20.617 52.490 3647 56.250 43.750 75.000 27.317 21.932 52.610 3648 62.500 43.750 75.000 30.257 23.448 52.748 3649 68.750 43.750 75.000 33.600 25.172 52.904 3650 75.000 43.750 75.000 37.362 27.111 53.080 3651 81.250 43.750 75.000 41.555 29.274 53.277 3652 87.500 43.750 75.000 46.194 31.665 53.494 3653 93.750 43.750 75.000 51.291 34.293 53.733 3654 100.00 43.750 75.000 56.857 37.163 53.994 3655 0.0000 50.000 75.000 17.916 19.889 52.710 3656 6.2500 50.000 75.000 18.127 19.997 52.720 3657 12.500 50.000 75.000 18.502 20.191 52.738 3658 18.750 50.000 75.000 19.114 20.507 52.767 3659 25.000 50.000 75.000 19.993 20.960 52.808 3660 31.250 50.000 75.000 21.166 21.564 52.863 3661 37.500 50.000 75.000 22.653 22.331 52.932 3662 43.750 50.000 75.000 24.477 23.272 53.018 3663 50.000 50.000 75.000 26.656 24.395 53.120 3664 56.250 50.000 75.000 29.206 25.710 53.240 3665 62.500 50.000 75.000 32.146 27.226 53.377 3666 68.750 50.000 75.000 35.489 28.950 53.534 3667 75.000 50.000 75.000 39.251 30.889 53.710 3668 81.250 50.000 75.000 43.445 33.051 53.907 3669 87.500 50.000 75.000 48.083 35.443 54.124 3670 93.750 50.000 75.000 53.180 38.071 54.363 3671 100.00 50.000 75.000 58.746 40.941 54.624 3672 0.0000 56.250 75.000 20.128 24.312 53.448 3673 6.2500 56.250 75.000 20.339 24.421 53.458 3674 12.500 56.250 75.000 20.714 24.614 53.475 3675 18.750 56.250 75.000 21.326 24.930 53.504 3676 25.000 56.250 75.000 22.205 25.383 53.545 3677 31.250 56.250 75.000 23.378 25.988 53.600 3678 37.500 56.250 75.000 24.865 26.755 53.670 3679 43.750 56.250 75.000 26.689 27.695 53.755 3680 50.000 56.250 75.000 28.868 28.818 53.857 3681 56.250 56.250 75.000 31.418 30.134 53.977 3682 62.500 56.250 75.000 34.358 31.649 54.115 3683 68.750 56.250 75.000 37.701 33.373 54.271 3684 75.000 56.250 75.000 41.463 35.312 54.448 3685 81.250 56.250 75.000 45.657 37.475 54.644 3686 87.500 56.250 75.000 50.295 39.867 54.861 3687 93.750 56.250 75.000 55.392 42.494 55.100 3688 100.00 56.250 75.000 60.958 45.364 55.361 3689 0.0000 62.500 75.000 22.677 29.409 54.297 3690 6.2500 62.500 75.000 22.888 29.518 54.307 3691 12.500 62.500 75.000 23.263 29.711 54.325 3692 18.750 62.500 75.000 23.875 30.027 54.354 3693 25.000 62.500 75.000 24.754 30.480 54.395 3694 31.250 62.500 75.000 25.926 31.085 54.450 3695 37.500 62.500 75.000 27.414 31.852 54.519 3696 43.750 62.500 75.000 29.238 32.792 54.605 3697 50.000 62.500 75.000 31.416 33.915 54.707 3698 56.250 62.500 75.000 33.967 35.231 54.827 3699 62.500 62.500 75.000 36.907 36.746 54.964 3700 68.750 62.500 75.000 40.250 38.470 55.121 3701 75.000 62.500 75.000 44.012 40.410 55.297 3702 81.250 62.500 75.000 48.205 42.572 55.494 3703 87.500 62.500 75.000 52.844 44.964 55.711 3704 93.750 62.500 75.000 57.941 47.591 55.950 3705 100.00 62.500 75.000 63.507 50.462 56.211 3706 0.0000 68.750 75.000 25.576 35.207 55.264 3707 6.2500 68.750 75.000 25.787 35.315 55.274 3708 12.500 68.750 75.000 26.162 35.509 55.291 3709 18.750 68.750 75.000 26.774 35.824 55.320 3710 25.000 68.750 75.000 27.653 36.278 55.361 3711 31.250 68.750 75.000 28.826 36.882 55.416 3712 37.500 68.750 75.000 30.313 37.649 55.486 3713 43.750 68.750 75.000 32.137 38.589 55.571 3714 50.000 68.750 75.000 34.316 39.713 55.673 3715 56.250 68.750 75.000 36.866 41.028 55.793 3716 62.500 68.750 75.000 39.806 42.544 55.931 3717 68.750 68.750 75.000 43.149 44.267 56.087 3718 75.000 68.750 75.000 46.911 46.207 56.264 3719 81.250 68.750 75.000 51.105 48.369 56.460 3720 87.500 68.750 75.000 55.743 50.761 56.677 3721 93.750 68.750 75.000 60.840 53.389 56.916 3722 100.00 68.750 75.000 66.406 56.259 57.177 3723 0.0000 75.000 75.000 28.838 41.729 56.351 3724 6.2500 75.000 75.000 29.049 41.838 56.361 3725 12.500 75.000 75.000 29.424 42.032 56.379 3726 18.750 75.000 75.000 30.036 42.347 56.407 3727 25.000 75.000 75.000 30.915 42.800 56.448 3728 31.250 75.000 75.000 32.087 43.405 56.503 3729 37.500 75.000 75.000 33.575 44.172 56.573 3730 43.750 75.000 75.000 35.399 45.112 56.659 3731 50.000 75.000 75.000 37.577 46.235 56.761 3732 56.250 75.000 75.000 40.128 47.551 56.880 3733 62.500 75.000 75.000 43.068 49.066 57.018 3734 68.750 75.000 75.000 46.411 50.790 57.175 3735 81.250 75.000 75.000 54.366 54.892 57.547 3736 87.500 75.000 75.000 59.005 57.284 57.765 3737 93.750 75.000 75.000 64.102 59.912 58.004 3738 100.00 75.000 75.000 69.668 62.782 58.264 3739 0.0000 81.250 75.000 32.474 49.001 57.563 3740 6.2500 81.250 75.000 32.685 49.110 57.573 3741 12.500 81.250 75.000 33.060 49.303 57.591 3742 18.750 81.250 75.000 33.673 49.619 57.619 3743 25.000 81.250 75.000 34.552 50.072 57.661 3744 31.250 81.250 75.000 35.724 50.677 57.716 3745 37.500 81.250 75.000 37.211 51.444 57.785 3746 43.750 81.250 75.000 39.035 52.384 57.871 3747 50.000 81.250 75.000 41.214 53.507 57.973 3748 56.250 81.250 75.000 43.765 54.823 58.092 3749 62.500 81.250 75.000 46.704 56.338 58.230 3750 68.750 81.250 75.000 50.048 58.062 58.387 3751 75.000 81.250 75.000 53.809 60.002 58.563 3752 81.250 81.250 75.000 58.003 62.164 58.760 3753 87.500 81.250 75.000 62.642 64.556 58.977 3754 93.750 81.250 75.000 67.738 67.183 59.216 3755 100.00 81.250 75.000 73.305 70.054 59.477 3756 0.0000 87.500 75.000 36.497 57.045 58.904 3757 6.2500 87.500 75.000 36.708 57.154 58.914 3758 12.500 87.500 75.000 37.083 57.347 58.932 3759 18.750 87.500 75.000 37.695 57.663 58.960 3760 25.000 87.500 75.000 38.574 58.116 59.001 3761 31.250 87.500 75.000 39.746 58.721 59.056 3762 37.500 87.500 75.000 41.234 59.488 59.126 3763 43.750 87.500 75.000 43.058 60.428 59.212 3764 50.000 87.500 75.000 45.236 61.551 59.314 3765 56.250 87.500 75.000 47.787 62.867 59.433 3766 62.500 87.500 75.000 50.727 64.382 59.571 3767 68.750 87.500 75.000 54.070 66.106 59.728 3768 75.000 87.500 75.000 57.832 68.045 59.904 3769 81.250 87.500 75.000 62.025 70.208 60.100 3770 87.500 87.500 75.000 66.664 72.600 60.318 3771 93.750 87.500 75.000 71.761 75.227 60.557 3772 100.00 87.500 75.000 77.327 78.097 60.817 3773 0.0000 93.750 75.000 40.916 65.883 60.377 3774 6.2500 93.750 75.000 41.127 65.991 60.387 3775 12.500 93.750 75.000 41.502 66.185 60.405 3776 18.750 93.750 75.000 42.114 66.501 60.433 3777 25.000 93.750 75.000 42.994 66.954 60.475 3778 31.250 93.750 75.000 44.166 67.558 60.530 3779 37.500 93.750 75.000 45.653 68.325 60.599 3780 43.750 93.750 75.000 47.477 69.266 60.685 3781 50.000 93.750 75.000 49.656 70.389 60.787 3782 56.250 93.750 75.000 52.207 71.704 60.906 3783 62.500 93.750 75.000 55.146 73.220 61.044 3784 68.750 93.750 75.000 58.489 74.944 61.201 3785 75.000 93.750 75.000 62.251 76.883 61.377 3786 81.250 93.750 75.000 66.445 79.045 61.574 3787 87.500 93.750 75.000 71.084 81.437 61.791 3788 93.750 93.750 75.000 76.180 84.065 62.030 3789 100.00 93.750 75.000 81.747 86.935 62.291 3790 0.0000 100.00 75.000 45.743 75.535 61.986 3791 6.2500 100.00 75.000 45.954 75.644 61.996 3792 12.500 100.00 75.000 46.329 75.837 62.014 3793 18.750 100.00 75.000 46.941 76.153 62.042 3794 25.000 100.00 75.000 47.821 76.606 62.084 3795 31.250 100.00 75.000 48.993 77.210 62.139 3796 37.500 100.00 75.000 50.480 77.978 62.208 3797 43.750 100.00 75.000 52.304 78.918 62.294 3798 50.000 100.00 75.000 54.483 80.041 62.396 3799 56.250 100.00 75.000 57.034 81.356 62.515 3800 62.500 100.00 75.000 59.973 82.872 62.653 3801 68.750 100.00 75.000 63.316 84.596 62.810 3802 75.000 100.00 75.000 67.078 86.535 62.986 3803 81.250 100.00 75.000 71.272 88.698 63.182 3804 87.500 100.00 75.000 75.910 91.089 63.400 3805 93.750 100.00 75.000 81.007 93.717 63.639 3806 6.2500 0.0000 75.000 10.549 4.8432 50.194 3807 6.2500 0.0000 81.250 12.384 5.5773 59.862 3808 6.2500 6.2500 81.250 12.567 5.9423 59.923 3809 12.500 6.2500 81.250 12.942 6.1358 59.941 3810 18.750 6.2500 81.250 13.554 6.4515 59.969 3811 31.250 0.0000 81.250 15.423 7.1441 60.005 3812 37.500 0.0000 81.250 16.911 7.9111 60.074 3813 43.750 0.0000 81.250 18.734 8.8514 60.160 3814 50.000 0.0000 81.250 20.913 9.9748 60.262 3815 56.250 0.0000 81.250 23.464 11.290 60.381 3816 62.500 0.0000 81.250 26.403 12.806 60.519 3817 68.750 0.0000 81.250 29.747 14.529 60.676 3818 75.000 0.0000 81.250 33.508 16.469 60.852 3819 81.250 0.0000 81.250 37.702 18.631 61.049 3820 81.250 6.2500 81.250 37.884 18.996 61.109 3821 93.750 0.0000 81.250 47.437 23.651 61.505 3822 93.750 6.2500 81.250 47.620 24.016 61.566 3823 93.750 12.500 81.250 47.945 24.667 61.674 3824 12.500 0.0000 81.250 12.759 5.7708 59.880 3825 18.750 0.0000 81.250 13.372 6.0865 59.909 3826 25.000 0.0000 81.250 14.251 6.5398 59.950 3827 25.000 6.2500 81.250 14.433 6.9048 60.011 3828 31.250 6.2500 81.250 15.605 7.5091 60.066 3829 37.500 6.2500 81.250 17.093 8.2761 60.135 3830 43.750 6.2500 81.250 18.917 9.2165 60.221 3831 50.000 6.2500 81.250 21.095 10.340 60.323 3832 56.250 6.2500 81.250 23.646 11.655 60.442 3833 62.500 6.2500 81.250 26.586 13.171 60.580 3834 68.750 6.2500 81.250 29.929 14.894 60.737 3835 75.000 6.2500 81.250 33.691 16.834 60.913 3836 87.500 0.0000 81.250 42.341 21.023 61.266 3837 87.500 6.2500 81.250 42.523 21.388 61.327 3838 100.00 0.0000 81.250 53.004 26.521 61.766 3839 100.00 6.2500 81.250 53.186 26.886 61.826 3840 100.00 12.500 81.250 53.512 27.537 61.935 3841 6.2500 12.500 81.250 12.892 6.5932 60.032 3842 12.500 12.500 81.250 13.268 6.7868 60.049 3843 18.750 12.500 81.250 13.880 7.1024 60.078 3844 25.000 12.500 81.250 14.759 7.5558 60.119 3845 31.250 12.500 81.250 15.931 8.1601 60.174 3846 37.500 12.500 81.250 17.419 8.9271 60.244 3847 43.750 12.500 81.250 19.242 9.8674 60.329 3848 50.000 12.500 81.250 21.421 10.991 60.431 3849 56.250 12.500 81.250 23.972 12.306 60.551 3850 62.500 12.500 81.250 26.911 13.822 60.689 3851 68.750 12.500 81.250 30.255 15.545 60.845 3852 75.000 12.500 81.250 34.016 17.485 61.021 3853 81.250 12.500 81.250 38.210 19.647 61.218 3854 87.500 12.500 81.250 42.849 22.039 61.435 3855 0.0000 6.2500 81.250 12.356 5.8338 59.913 3856 0.0000 12.500 81.250 12.682 6.4847 60.022 3857 0.0000 18.750 81.250 13.212 7.5462 60.199 3858 6.2500 18.750 81.250 13.423 7.6548 60.209 3859 12.500 18.750 81.250 13.798 7.8483 60.226 3860 18.750 18.750 81.250 14.411 8.1639 60.255 3861 25.000 18.750 81.250 15.290 8.6173 60.296 3862 31.250 18.750 81.250 16.462 9.2216 60.351 3863 37.500 18.750 81.250 17.949 9.9886 60.421 3864 43.750 18.750 81.250 19.773 10.929 60.506 3865 50.000 18.750 81.250 21.952 12.052 60.608 3866 56.250 18.750 81.250 24.503 13.368 60.728 3867 62.500 18.750 81.250 27.442 14.883 60.865 3868 68.750 18.750 81.250 30.785 16.607 61.022 3869 75.000 18.750 81.250 34.547 18.546 61.198 3870 81.250 18.750 81.250 38.741 20.709 61.395 3871 87.500 18.750 81.250 43.380 23.101 61.612 3872 93.750 18.750 81.250 48.476 25.728 61.851 3873 100.00 18.750 81.250 54.043 28.598 62.112 3874 0.0000 25.000 81.250 13.975 9.0708 60.453 3875 6.2500 25.000 81.250 14.185 9.1793 60.463 3876 12.500 25.000 81.250 14.561 9.3729 60.480 3877 18.750 25.000 81.250 15.173 9.6885 60.509 3878 25.000 25.000 81.250 16.052 10.142 60.550 3879 31.250 25.000 81.250 17.224 10.746 60.605 3880 37.500 25.000 81.250 18.712 11.513 60.675 3881 43.750 25.000 81.250 20.536 12.454 60.760 3882 50.000 25.000 81.250 22.714 13.577 60.862 3883 56.250 25.000 81.250 25.265 14.892 60.982 3884 62.500 25.000 81.250 28.205 16.408 61.120 3885 68.750 25.000 81.250 31.548 18.131 61.276 3886 75.000 25.000 81.250 35.309 20.071 61.453 3887 81.250 25.000 81.250 39.503 22.233 61.649 3888 87.500 25.000 81.250 44.142 24.625 61.866 3889 93.750 25.000 81.250 49.239 27.253 62.105 3890 100.00 25.000 81.250 54.805 30.123 62.366 3891 0.0000 31.250 81.250 14.991 11.103 60.792 3892 6.2500 31.250 81.250 15.202 11.212 60.801 3893 12.500 31.250 81.250 15.577 11.405 60.819 3894 18.750 31.250 81.250 16.189 11.721 60.848 3895 25.000 31.250 81.250 17.068 12.174 60.889 3896 31.250 31.250 81.250 18.241 12.778 60.944 3897 37.500 31.250 81.250 19.728 13.546 61.014 3898 43.750 31.250 81.250 21.552 14.486 61.099 3899 50.000 31.250 81.250 23.731 15.609 61.201 3900 56.250 31.250 81.250 26.281 16.924 61.321 3901 62.500 31.250 81.250 29.221 18.440 61.458 3902 68.750 31.250 81.250 32.564 20.164 61.615 3903 75.000 31.250 81.250 36.326 22.103 61.791 3904 81.250 31.250 81.250 40.519 24.266 61.988 3905 87.500 31.250 81.250 45.158 26.657 62.205 3906 93.750 31.250 81.250 50.255 29.285 62.444 3907 100.00 31.250 81.250 55.821 32.155 62.705 3908 0.0000 37.500 81.250 16.281 13.683 61.222 3909 6.2500 37.500 81.250 16.492 13.791 61.231 3910 12.500 37.500 81.250 16.867 13.985 61.249 3911 18.750 37.500 81.250 17.479 14.300 61.278 3912 25.000 37.500 81.250 18.358 14.754 61.319 3913 31.250 37.500 81.250 19.530 15.358 61.374 3914 37.500 37.500 81.250 21.018 16.125 61.444 3915 43.750 37.500 81.250 22.842 17.065 61.529 3916 50.000 37.500 81.250 25.020 18.189 61.631 3917 56.250 37.500 81.250 27.571 19.504 61.751 3918 62.500 37.500 81.250 30.511 21.020 61.888 3919 68.750 37.500 81.250 33.854 22.743 62.045 3920 75.000 37.500 81.250 37.616 24.683 62.221 3921 81.250 37.500 81.250 41.809 26.845 62.418 3922 87.500 37.500 81.250 46.448 29.237 62.635 3923 93.750 37.500 81.250 51.545 31.865 62.874 3924 100.00 37.500 81.250 57.111 34.735 63.135 3925 0.0000 43.750 81.250 17.863 16.845 61.749 3926 6.2500 43.750 81.250 18.073 16.954 61.759 3927 12.500 43.750 81.250 18.448 17.147 61.776 3928 18.750 43.750 81.250 19.061 17.463 61.805 3929 25.000 43.750 81.250 19.940 17.916 61.846 3930 31.250 43.750 81.250 21.112 18.520 61.901 3931 37.500 43.750 81.250 22.600 19.288 61.971 3932 43.750 43.750 81.250 24.423 20.228 62.056 3933 50.000 43.750 81.250 26.602 21.351 62.158 3934 56.250 43.750 81.250 29.153 22.666 62.278 3935 62.500 43.750 81.250 32.092 24.182 62.416 3936 68.750 43.750 81.250 35.436 25.906 62.572 3937 75.000 43.750 81.250 39.197 27.845 62.748 3938 81.250 43.750 81.250 43.391 30.008 62.945 3939 87.500 43.750 81.250 48.030 32.399 63.162 3940 93.750 43.750 81.250 53.126 35.027 63.401 3941 100.00 43.750 81.250 58.693 37.897 63.662 3942 0.0000 50.000 81.250 19.752 20.623 62.378 3943 6.2500 50.000 81.250 19.962 20.731 62.388 3944 12.500 50.000 81.250 20.338 20.925 62.406 3945 18.750 50.000 81.250 20.950 21.241 62.435 3946 25.000 50.000 81.250 21.829 21.694 62.476 3947 31.250 50.000 81.250 23.001 22.298 62.531 3948 37.500 50.000 81.250 24.489 23.065 62.600 3949 43.750 50.000 81.250 26.312 24.006 62.686 3950 50.000 50.000 81.250 28.491 25.129 62.788 3951 56.250 50.000 81.250 31.042 26.444 62.908 3952 62.500 50.000 81.250 33.981 27.960 63.045 3953 68.750 50.000 81.250 37.325 29.684 63.202 3954 75.000 50.000 81.250 41.086 31.623 63.378 3955 81.250 50.000 81.250 45.280 33.785 63.575 3956 87.500 50.000 81.250 49.919 36.177 63.792 3957 93.750 50.000 81.250 55.016 38.805 64.031 3958 100.00 50.000 81.250 60.582 41.675 64.292 3959 0.0000 56.250 81.250 21.964 25.046 63.116 3960 6.2500 56.250 81.250 22.174 25.155 63.126 3961 12.500 56.250 81.250 22.550 25.348 63.143 3962 18.750 56.250 81.250 23.162 25.664 63.172 3963 25.000 56.250 81.250 24.041 26.117 63.213 3964 31.250 56.250 81.250 25.213 26.722 63.268 3965 37.500 56.250 81.250 26.701 27.489 63.338 3966 43.750 56.250 81.250 28.524 28.429 63.423 3967 50.000 56.250 81.250 30.703 29.552 63.525 3968 56.250 56.250 81.250 33.254 30.868 63.645 3969 62.500 56.250 81.250 36.193 32.383 63.783 3970 68.750 56.250 81.250 39.537 34.107 63.939 3971 75.000 56.250 81.250 43.298 36.047 64.116 3972 81.250 56.250 81.250 47.492 38.209 64.312 3973 87.500 56.250 81.250 52.131 40.601 64.529 3974 93.750 56.250 81.250 57.227 43.228 64.768 3975 100.00 56.250 81.250 62.794 46.098 65.029 3976 0.0000 62.500 81.250 24.513 30.143 63.965 3977 6.2500 62.500 81.250 24.723 30.252 63.975 3978 12.500 62.500 81.250 25.099 30.446 63.993 3979 18.750 62.500 81.250 25.711 30.761 64.022 3980 25.000 62.500 81.250 26.590 31.214 64.063 3981 31.250 62.500 81.250 27.762 31.819 64.118 3982 37.500 62.500 81.250 29.250 32.586 64.187 3983 43.750 62.500 81.250 31.073 33.526 64.273 3984 50.000 62.500 81.250 33.252 34.649 64.375 3985 56.250 62.500 81.250 35.803 35.965 64.494 3986 62.500 62.500 81.250 38.742 37.480 64.632 3987 68.750 62.500 81.250 42.086 39.204 64.789 3988 75.000 62.500 81.250 45.847 41.144 64.965 3989 81.250 62.500 81.250 50.041 43.306 65.162 3990 87.500 62.500 81.250 54.680 45.698 65.379 3991 93.750 62.500 81.250 59.776 48.326 65.618 3992 100.00 62.500 81.250 65.343 51.196 65.879 3993 0.0000 68.750 81.250 27.412 35.941 64.932 3994 6.2500 68.750 81.250 27.622 36.049 64.942 3995 12.500 68.750 81.250 27.998 36.243 64.959 3996 18.750 68.750 81.250 28.610 36.559 64.988 3997 25.000 68.750 81.250 29.489 37.012 65.029 3998 31.250 68.750 81.250 30.661 37.616 65.084 3999 37.500 68.750 81.250 32.149 38.383 65.154 4000 43.750 68.750 81.250 33.972 39.324 65.239 4001 50.000 68.750 81.250 36.151 40.447 65.341 4002 56.250 68.750 81.250 38.702 41.762 65.461 4003 62.500 68.750 81.250 41.641 43.278 65.599 4004 68.750 68.750 81.250 44.985 45.002 65.755 4005 75.000 68.750 81.250 48.746 46.941 65.932 4006 81.250 68.750 81.250 52.940 49.103 66.128 4007 87.500 68.750 81.250 57.579 51.495 66.345 4008 93.750 68.750 81.250 62.675 54.123 66.584 4009 100.00 68.750 81.250 68.242 56.993 66.845 4010 0.0000 75.000 81.250 30.674 42.464 66.019 4011 6.2500 75.000 81.250 30.884 42.572 66.029 4012 12.500 75.000 81.250 31.259 42.766 66.047 4013 18.750 75.000 81.250 31.872 43.081 66.075 4014 25.000 75.000 81.250 32.751 43.535 66.116 4015 31.250 75.000 81.250 33.923 44.139 66.171 4016 37.500 75.000 81.250 35.411 44.906 66.241 4017 43.750 75.000 81.250 37.234 45.846 66.327 4018 50.000 75.000 81.250 39.413 46.970 66.429 4019 56.250 75.000 81.250 41.964 48.285 66.548 4020 62.500 75.000 81.250 44.903 49.800 66.686 4021 68.750 75.000 81.250 48.247 51.524 66.843 4022 75.000 75.000 81.250 52.008 53.464 67.019 4023 81.250 75.000 81.250 56.202 55.626 67.215 4024 87.500 75.000 81.250 60.841 58.018 67.433 4025 93.750 75.000 81.250 65.937 60.646 67.671 4026 100.00 75.000 81.250 71.504 63.516 67.932 4027 0.0000 81.250 81.250 34.310 49.735 67.231 4028 6.2500 81.250 81.250 34.521 49.844 67.241 4029 12.500 81.250 81.250 34.896 50.038 67.259 4030 18.750 81.250 81.250 35.508 50.353 67.287 4031 25.000 81.250 81.250 36.387 50.806 67.329 4032 31.250 81.250 81.250 37.559 51.411 67.384 4033 37.500 81.250 81.250 39.047 52.178 67.453 4034 43.750 81.250 81.250 40.871 53.118 67.539 4035 50.000 81.250 81.250 43.049 54.241 67.641 4036 56.250 81.250 81.250 45.600 55.557 67.760 4037 62.500 81.250 81.250 48.540 57.072 67.898 4038 68.750 81.250 81.250 51.883 58.796 68.055 4039 75.000 81.250 81.250 55.645 60.736 68.231 4040 87.500 81.250 81.250 64.477 65.290 68.645 4041 93.750 81.250 81.250 69.574 67.918 68.884 4042 100.00 81.250 81.250 75.140 70.788 69.144 4043 0.0000 87.500 81.250 38.333 57.779 68.572 4044 6.2500 87.500 81.250 38.543 57.888 68.582 4045 12.500 87.500 81.250 38.918 58.081 68.600 4046 18.750 87.500 81.250 39.531 58.397 68.628 4047 25.000 87.500 81.250 40.410 58.850 68.669 4048 31.250 87.500 81.250 41.582 59.455 68.724 4049 37.500 87.500 81.250 43.069 60.222 68.794 4050 43.750 87.500 81.250 44.893 61.162 68.880 4051 50.000 87.500 81.250 47.072 62.285 68.982 4052 56.250 87.500 81.250 49.623 63.601 69.101 4053 62.500 87.500 81.250 52.562 65.116 69.239 4054 68.750 87.500 81.250 55.906 66.840 69.396 4055 75.000 87.500 81.250 59.667 68.780 69.572 4056 81.250 87.500 81.250 63.861 70.942 69.768 4057 87.500 87.500 81.250 68.500 73.334 69.986 4058 93.750 87.500 81.250 73.596 75.961 70.225 4059 100.00 87.500 81.250 79.163 78.831 70.485 4060 0.0000 93.750 81.250 42.752 66.617 70.045 4061 6.2500 93.750 81.250 42.962 66.725 70.055 4062 12.500 93.750 81.250 43.338 66.919 70.073 4063 18.750 93.750 81.250 43.950 67.235 70.101 4064 25.000 93.750 81.250 44.829 67.688 70.143 4065 31.250 93.750 81.250 46.001 68.292 70.198 4066 37.500 93.750 81.250 47.489 69.059 70.267 4067 43.750 93.750 81.250 49.313 70.000 70.353 4068 50.000 93.750 81.250 51.491 71.123 70.455 4069 56.250 93.750 81.250 54.042 72.438 70.574 4070 62.500 93.750 81.250 56.982 73.954 70.712 4071 68.750 93.750 81.250 60.325 75.678 70.869 4072 75.000 93.750 81.250 64.087 77.617 71.045 4073 81.250 93.750 81.250 68.280 79.779 71.241 4074 87.500 93.750 81.250 72.919 82.171 71.459 4075 93.750 93.750 81.250 78.016 84.799 71.698 4076 100.00 93.750 81.250 83.582 87.669 71.959 4077 0.0000 100.00 81.250 47.579 76.269 71.654 4078 6.2500 100.00 81.250 47.789 76.378 71.664 4079 12.500 100.00 81.250 48.165 76.571 71.682 4080 18.750 100.00 81.250 48.777 76.887 71.710 4081 25.000 100.00 81.250 49.656 77.340 71.752 4082 31.250 100.00 81.250 50.828 77.945 71.806 4083 37.500 100.00 81.250 52.316 78.712 71.876 4084 43.750 100.00 81.250 54.139 79.652 71.962 4085 50.000 100.00 81.250 56.318 80.775 72.064 4086 56.250 100.00 81.250 58.869 82.091 72.183 4087 62.500 100.00 81.250 61.809 83.606 72.321 4088 68.750 100.00 81.250 65.152 85.330 72.478 4089 75.000 100.00 81.250 68.913 87.269 72.654 4090 81.250 100.00 81.250 73.107 89.432 72.850 4091 87.500 100.00 81.250 77.746 91.824 73.068 4092 93.750 100.00 81.250 82.843 94.451 73.307 4093 100.00 100.00 81.250 88.409 97.321 73.567 4094 100.00 100.00 87.500 90.439 98.133 84.262 4095 12.500 0.0000 87.500 14.790 6.5829 70.574 4096 18.750 0.0000 87.500 15.402 6.8985 70.603 4097 25.000 0.0000 87.500 16.281 7.3518 70.644 4098 31.250 0.0000 87.500 17.453 7.9561 70.699 4099 37.500 0.0000 87.500 18.941 8.7231 70.769 4100 43.750 0.0000 87.500 20.765 9.6635 70.854 4101 50.000 0.0000 87.500 22.943 10.787 70.956 4102 56.250 0.0000 87.500 25.494 12.102 71.076 4103 62.500 0.0000 87.500 28.434 13.618 71.213 4104 68.750 0.0000 87.500 31.777 15.341 71.370 4105 75.000 0.0000 87.500 35.539 17.281 71.546 4106 81.250 0.0000 87.500 39.732 19.443 71.743 4107 81.250 6.2500 87.500 39.915 19.808 71.804 4108 93.750 0.0000 87.500 49.468 24.463 72.199 4109 93.750 6.2500 87.500 49.650 24.828 72.260 4110 93.750 12.500 87.500 49.976 25.479 72.368 4111 6.2500 6.2500 87.500 14.597 6.7543 70.617 4112 12.500 6.2500 87.500 14.972 6.9479 70.635 4113 18.750 6.2500 87.500 15.585 7.2635 70.664 4114 25.000 6.2500 87.500 16.464 7.7168 70.705 4115 31.250 6.2500 87.500 17.636 8.3211 70.760 4116 37.500 6.2500 87.500 19.123 9.0882 70.829 4117 43.750 6.2500 87.500 20.947 10.028 70.915 4118 50.000 6.2500 87.500 23.126 11.152 71.017 4119 56.250 6.2500 87.500 25.677 12.467 71.137 4120 62.500 6.2500 87.500 28.616 13.983 71.274 4121 68.750 6.2500 87.500 31.960 15.706 71.431 4122 75.000 6.2500 87.500 35.721 17.646 71.607 4123 87.500 0.0000 87.500 44.371 21.835 71.960 4124 87.500 6.2500 87.500 44.554 22.200 72.021 4125 100.00 0.0000 87.500 55.034 27.333 72.460 4126 100.00 6.2500 87.500 55.217 27.698 72.521 4127 100.00 12.500 87.500 55.542 28.349 72.629 4128 6.2500 12.500 87.500 14.923 7.4053 70.726 4129 12.500 12.500 87.500 15.298 7.5988 70.743 4130 18.750 12.500 87.500 15.910 7.9145 70.772 4131 25.000 12.500 87.500 16.789 8.3678 70.813 4132 31.250 12.500 87.500 17.961 8.9721 70.868 4133 37.500 12.500 87.500 19.449 9.7391 70.938 4134 43.750 12.500 87.500 21.273 10.679 71.023 4135 50.000 12.500 87.500 23.451 11.803 71.126 4136 56.250 12.500 87.500 26.002 13.118 71.245 4137 62.500 12.500 87.500 28.942 14.634 71.383 4138 68.750 12.500 87.500 32.285 16.357 71.539 4139 75.000 12.500 87.500 36.047 18.297 71.716 4140 81.250 12.500 87.500 40.240 20.459 71.912 4141 87.500 12.500 87.500 44.879 22.851 72.130 4142 0.0000 6.2500 87.500 14.387 6.6458 70.608 4143 0.0000 12.500 87.500 14.712 7.2967 70.716 4144 0.0000 18.750 87.500 15.243 8.3582 70.893 4145 6.2500 18.750 87.500 15.453 8.4668 70.903 4146 12.500 18.750 87.500 15.829 8.6603 70.920 4147 18.750 18.750 87.500 16.441 8.9760 70.949 4148 25.000 18.750 87.500 17.320 9.4293 70.990 4149 31.250 18.750 87.500 18.492 10.034 71.045 4150 37.500 18.750 87.500 19.980 10.801 71.115 4151 43.750 18.750 87.500 21.804 11.741 71.200 4152 50.000 18.750 87.500 23.982 12.864 71.302 4153 56.250 18.750 87.500 26.533 14.180 71.422 4154 62.500 18.750 87.500 29.473 15.695 71.560 4155 68.750 18.750 87.500 32.816 17.419 71.716 4156 75.000 18.750 87.500 36.578 19.358 71.893 4157 81.250 18.750 87.500 40.771 21.521 72.089 4158 87.500 18.750 87.500 45.410 23.913 72.307 4159 93.750 18.750 87.500 50.507 26.540 72.545 4160 100.00 18.750 87.500 56.073 29.410 72.806 4161 0.0000 25.000 87.500 16.005 9.8828 71.147 4162 6.2500 25.000 87.500 16.216 9.9913 71.157 4163 12.500 25.000 87.500 16.591 10.185 71.175 4164 18.750 25.000 87.500 17.203 10.501 71.203 4165 25.000 25.000 87.500 18.083 10.954 71.244 4166 31.250 25.000 87.500 19.255 11.558 71.299 4167 37.500 25.000 87.500 20.742 12.325 71.369 4168 43.750 25.000 87.500 22.566 13.266 71.455 4169 50.000 25.000 87.500 24.745 14.389 71.557 4170 56.250 25.000 87.500 27.296 15.704 71.676 4171 62.500 25.000 87.500 30.235 17.220 71.814 4172 68.750 25.000 87.500 33.578 18.944 71.971 4173 75.000 25.000 87.500 37.340 20.883 72.147 4174 81.250 25.000 87.500 41.534 23.045 72.343 4175 87.500 25.000 87.500 46.172 25.437 72.561 4176 93.750 25.000 87.500 51.269 28.065 72.800 4177 100.00 25.000 87.500 56.835 30.935 73.060 4178 0.0000 31.250 87.500 17.022 11.915 71.486 4179 6.2500 31.250 87.500 17.232 12.024 71.496 4180 12.500 31.250 87.500 17.607 12.217 71.513 4181 18.750 31.250 87.500 18.220 12.533 71.542 4182 25.000 31.250 87.500 19.099 12.986 71.583 4183 31.250 31.250 87.500 20.271 13.591 71.638 4184 37.500 31.250 87.500 21.759 14.358 71.708 4185 43.750 31.250 87.500 23.582 15.298 71.793 4186 50.000 31.250 87.500 25.761 16.421 71.895 4187 56.250 31.250 87.500 28.312 17.736 72.015 4188 62.500 31.250 87.500 31.251 19.252 72.153 4189 68.750 31.250 87.500 34.595 20.976 72.309 4190 75.000 31.250 87.500 38.356 22.915 72.486 4191 81.250 31.250 87.500 42.550 25.078 72.682 4192 87.500 31.250 87.500 47.189 27.469 72.899 4193 93.750 31.250 87.500 52.285 30.097 73.138 4194 100.00 31.250 87.500 57.852 32.967 73.399 4195 0.0000 37.500 87.500 18.312 14.495 71.916 4196 6.2500 37.500 87.500 18.522 14.603 71.926 4197 12.500 37.500 87.500 18.897 14.797 71.943 4198 18.750 37.500 87.500 19.510 15.112 71.972 4199 25.000 37.500 87.500 20.389 15.566 72.013 4200 31.250 37.500 87.500 21.561 16.170 72.068 4201 37.500 37.500 87.500 23.049 16.937 72.138 4202 43.750 37.500 87.500 24.872 17.877 72.223 4203 50.000 37.500 87.500 27.051 19.001 72.325 4204 56.250 37.500 87.500 29.602 20.316 72.445 4205 62.500 37.500 87.500 32.541 21.832 72.583 4206 68.750 37.500 87.500 35.885 23.555 72.739 4207 75.000 37.500 87.500 39.646 25.495 72.916 4208 81.250 37.500 87.500 43.840 27.657 73.112 4209 87.500 37.500 87.500 48.479 30.049 73.329 4210 93.750 37.500 87.500 53.575 32.677 73.568 4211 100.00 37.500 87.500 59.142 35.547 73.829 4212 0.0000 43.750 87.500 19.893 17.657 72.443 4213 6.2500 43.750 87.500 20.103 17.766 72.453 4214 12.500 43.750 87.500 20.479 17.959 72.470 4215 18.750 43.750 87.500 21.091 18.275 72.499 4216 25.000 43.750 87.500 21.970 18.728 72.540 4217 31.250 43.750 87.500 23.142 19.333 72.595 4218 37.500 43.750 87.500 24.630 20.100 72.665 4219 43.750 43.750 87.500 26.454 21.040 72.750 4220 50.000 43.750 87.500 28.632 22.163 72.853 4221 56.250 43.750 87.500 31.183 23.478 72.972 4222 62.500 43.750 87.500 34.123 24.994 73.110 4223 68.750 43.750 87.500 37.466 26.718 73.266 4224 75.000 43.750 87.500 41.228 28.657 73.443 4225 81.250 43.750 87.500 45.421 30.820 73.639 4226 87.500 43.750 87.500 50.060 33.211 73.857 4227 93.750 43.750 87.500 55.157 35.839 74.095 4228 100.00 43.750 87.500 60.723 38.709 74.356 4229 0.0000 50.000 87.500 21.782 21.435 73.073 4230 6.2500 50.000 87.500 21.993 21.544 73.083 4231 12.500 50.000 87.500 22.368 21.737 73.100 4232 18.750 50.000 87.500 22.980 22.053 73.129 4233 25.000 50.000 87.500 23.859 22.506 73.170 4234 31.250 50.000 87.500 25.031 23.110 73.225 4235 37.500 50.000 87.500 26.519 23.877 73.295 4236 43.750 50.000 87.500 28.343 24.818 73.380 4237 50.000 50.000 87.500 30.521 25.941 73.482 4238 56.250 50.000 87.500 33.072 27.256 73.602 4239 62.500 50.000 87.500 36.012 28.772 73.740 4240 68.750 50.000 87.500 39.355 30.496 73.896 4241 75.000 50.000 87.500 43.117 32.435 74.072 4242 81.250 50.000 87.500 47.310 34.597 74.269 4243 87.500 50.000 87.500 51.949 36.989 74.486 4244 93.750 50.000 87.500 57.046 39.617 74.725 4245 100.00 50.000 87.500 62.612 42.487 74.986 4246 0.0000 56.250 87.500 23.994 25.858 73.810 4247 6.2500 56.250 87.500 24.205 25.967 73.820 4248 12.500 56.250 87.500 24.580 26.160 73.838 4249 18.750 56.250 87.500 25.192 26.476 73.866 4250 25.000 56.250 87.500 26.071 26.929 73.907 4251 31.250 56.250 87.500 27.243 27.534 73.962 4252 37.500 56.250 87.500 28.731 28.301 74.032 4253 43.750 56.250 87.500 30.555 29.241 74.118 4254 50.000 56.250 87.500 32.733 30.364 74.220 4255 56.250 56.250 87.500 35.284 31.680 74.339 4256 62.500 56.250 87.500 38.224 33.195 74.477 4257 68.750 56.250 87.500 41.567 34.919 74.634 4258 75.000 56.250 87.500 45.329 36.859 74.810 4259 81.250 56.250 87.500 49.522 39.021 75.006 4260 87.500 56.250 87.500 54.161 41.413 75.224 4261 93.750 56.250 87.500 59.258 44.040 75.463 4262 100.00 56.250 87.500 64.824 46.911 75.723 4263 0.0000 62.500 87.500 26.543 30.955 74.660 4264 6.2500 62.500 87.500 26.754 31.064 74.670 4265 12.500 62.500 87.500 27.129 31.258 74.687 4266 18.750 62.500 87.500 27.741 31.573 74.716 4267 25.000 62.500 87.500 28.620 32.027 74.757 4268 31.250 62.500 87.500 29.792 32.631 74.812 4269 37.500 62.500 87.500 31.280 33.398 74.882 4270 43.750 62.500 87.500 33.104 34.338 74.967 4271 50.000 62.500 87.500 35.282 35.461 75.069 4272 56.250 62.500 87.500 37.833 36.777 75.189 4273 62.500 62.500 87.500 40.773 38.292 75.327 4274 68.750 62.500 87.500 44.116 40.016 75.483 4275 75.000 62.500 87.500 47.878 41.956 75.659 4276 81.250 62.500 87.500 52.071 44.118 75.856 4277 87.500 62.500 87.500 56.710 46.510 76.073 4278 93.750 62.500 87.500 61.807 49.138 76.312 4279 100.00 62.500 87.500 67.373 52.008 76.573 4280 0.0000 68.750 87.500 29.442 36.753 75.626 4281 6.2500 68.750 87.500 29.653 36.861 75.636 4282 12.500 68.750 87.500 30.028 37.055 75.654 4283 18.750 68.750 87.500 30.640 37.371 75.682 4284 25.000 68.750 87.500 31.519 37.824 75.723 4285 31.250 68.750 87.500 32.691 38.428 75.778 4286 37.500 68.750 87.500 34.179 39.195 75.848 4287 43.750 68.750 87.500 36.003 40.136 75.934 4288 50.000 68.750 87.500 38.181 41.259 76.036 4289 56.250 68.750 87.500 40.732 42.574 76.155 4290 62.500 68.750 87.500 43.672 44.090 76.293 4291 68.750 68.750 87.500 47.015 45.814 76.450 4292 75.000 68.750 87.500 50.777 47.753 76.626 4293 81.250 68.750 87.500 54.970 49.915 76.822 4294 87.500 68.750 87.500 59.609 52.307 77.040 4295 93.750 68.750 87.500 64.706 54.935 77.279 4296 100.00 68.750 87.500 70.272 57.805 77.539 4297 0.0000 75.000 87.500 32.704 43.276 76.713 4298 6.2500 75.000 87.500 32.914 43.384 76.723 4299 12.500 75.000 87.500 33.290 43.578 76.741 4300 18.750 75.000 87.500 33.902 43.893 76.770 4301 25.000 75.000 87.500 34.781 44.347 76.811 4302 31.250 75.000 87.500 35.953 44.951 76.866 4303 37.500 75.000 87.500 37.441 45.718 76.935 4304 43.750 75.000 87.500 39.265 46.658 77.021 4305 50.000 75.000 87.500 41.443 47.782 77.123 4306 56.250 75.000 87.500 43.994 49.097 77.242 4307 62.500 75.000 87.500 46.934 50.612 77.380 4308 68.750 75.000 87.500 50.277 52.336 77.537 4309 75.000 75.000 87.500 54.039 54.276 77.713 4310 81.250 75.000 87.500 58.232 56.438 77.910 4311 87.500 75.000 87.500 62.871 58.830 78.127 4312 93.750 75.000 87.500 67.968 61.458 78.366 4313 100.00 75.000 87.500 73.534 64.328 78.627 4314 0.0000 81.250 87.500 36.340 50.547 77.926 4315 6.2500 81.250 87.500 36.551 50.656 77.935 4316 12.500 81.250 87.500 36.926 50.850 77.953 4317 18.750 81.250 87.500 37.538 51.165 77.982 4318 25.000 81.250 87.500 38.418 51.619 78.023 4319 31.250 81.250 87.500 39.590 52.223 78.078 4320 37.500 81.250 87.500 41.077 52.990 78.148 4321 43.750 81.250 87.500 42.901 53.930 78.233 4322 50.000 81.250 87.500 45.080 55.053 78.335 4323 56.250 81.250 87.500 47.631 56.369 78.455 4324 62.500 81.250 87.500 50.570 57.884 78.592 4325 68.750 81.250 87.500 53.913 59.608 78.749 4326 75.000 81.250 87.500 57.675 61.548 78.925 4327 81.250 81.250 87.500 61.869 63.710 79.122 4328 87.500 81.250 87.500 66.508 66.102 79.339 4329 93.750 81.250 87.500 71.604 68.730 79.578 4330 100.00 81.250 87.500 77.171 71.600 79.839 4331 0.0000 87.500 87.500 40.363 58.591 79.266 4332 6.2500 87.500 87.500 40.573 58.700 79.276 4333 12.500 87.500 87.500 40.949 58.893 79.294 4334 18.750 87.500 87.500 41.561 59.209 79.323 4335 25.000 87.500 87.500 42.440 59.662 79.364 4336 31.250 87.500 87.500 43.612 60.267 79.419 4337 37.500 87.500 87.500 45.100 61.034 79.488 4338 43.750 87.500 87.500 46.924 61.974 79.574 4339 50.000 87.500 87.500 49.102 63.097 79.676 4340 56.250 87.500 87.500 51.653 64.413 79.795 4341 62.500 87.500 87.500 54.593 65.928 79.933 4342 68.750 87.500 87.500 57.936 67.652 80.090 4343 75.000 87.500 87.500 61.698 69.592 80.266 4344 81.250 87.500 87.500 65.891 71.754 80.463 4345 93.750 87.500 87.500 75.627 76.773 80.919 4346 100.00 87.500 87.500 81.193 79.644 81.180 4347 0.0000 93.750 87.500 44.782 67.429 80.740 4348 6.2500 93.750 87.500 44.993 67.538 80.749 4349 12.500 93.750 87.500 45.368 67.731 80.767 4350 18.750 93.750 87.500 45.980 68.047 80.796 4351 25.000 93.750 87.500 46.860 68.500 80.837 4352 31.250 93.750 87.500 48.032 69.104 80.892 4353 37.500 93.750 87.500 49.519 69.871 80.962 4354 43.750 93.750 87.500 51.343 70.812 81.047 4355 50.000 93.750 87.500 53.522 71.935 81.149 4356 56.250 93.750 87.500 56.073 73.250 81.269 4357 62.500 93.750 87.500 59.012 74.766 81.406 4358 68.750 93.750 87.500 62.355 76.490 81.563 4359 75.000 93.750 87.500 66.117 78.429 81.739 4360 81.250 93.750 87.500 70.311 80.591 81.936 4361 87.500 93.750 87.500 74.950 82.983 82.153 4362 93.750 93.750 87.500 80.046 85.611 82.392 4363 100.00 93.750 87.500 85.613 88.481 82.653 4364 0.0000 100.00 87.500 49.609 77.081 82.349 4365 6.2500 100.00 87.500 49.820 77.190 82.358 4366 12.500 100.00 87.500 50.195 77.383 82.376 4367 18.750 100.00 87.500 50.807 77.699 82.405 4368 25.000 100.00 87.500 51.686 78.152 82.446 4369 31.250 100.00 87.500 52.859 78.757 82.501 4370 37.500 100.00 87.500 54.346 79.524 82.570 4371 43.750 100.00 87.500 56.170 80.464 82.656 4372 50.000 100.00 87.500 58.349 81.587 82.758 4373 56.250 100.00 87.500 60.899 82.903 82.878 4374 62.500 100.00 87.500 63.839 84.418 83.015 4375 68.750 100.00 87.500 67.182 86.142 83.172 4376 75.000 100.00 87.500 70.944 88.081 83.348 4377 81.250 100.00 87.500 75.137 90.244 83.545 4378 87.500 100.00 87.500 79.776 92.636 83.762 4379 93.750 100.00 87.500 84.873 95.263 84.001 4380 6.2500 0.0000 87.500 14.414 6.3893 70.557 4381 6.2500 0.0000 93.750 16.645 7.2815 82.306 4382 6.2500 6.2500 93.750 16.828 7.6465 82.367 4383 12.500 6.2500 93.750 17.203 7.8400 82.385 4384 18.750 6.2500 93.750 17.815 8.1557 82.413 4385 31.250 0.0000 93.750 19.684 8.8483 82.449 4386 37.500 0.0000 93.750 21.172 9.6153 82.518 4387 43.750 0.0000 93.750 22.995 10.556 82.604 4388 50.000 0.0000 93.750 25.174 11.679 82.706 4389 56.250 0.0000 93.750 27.725 12.994 82.825 4390 62.500 0.0000 93.750 30.664 14.510 82.963 4391 68.750 0.0000 93.750 34.008 16.234 83.120 4392 68.750 6.2500 93.750 34.190 16.599 83.181 4393 81.250 0.0000 93.750 41.963 20.335 83.492 4394 81.250 6.2500 93.750 42.146 20.700 83.553 4395 93.750 0.0000 93.750 51.698 25.355 83.949 4396 93.750 6.2500 93.750 51.881 25.720 84.010 4397 93.750 12.500 93.750 52.207 26.371 84.118 4398 12.500 0.0000 93.750 17.021 7.4750 82.324 4399 18.750 0.0000 93.750 17.633 7.7906 82.352 4400 25.000 0.0000 93.750 18.512 8.2440 82.394 4401 25.000 6.2500 93.750 18.695 8.6090 82.454 4402 31.250 6.2500 93.750 19.867 9.2133 82.509 4403 37.500 6.2500 93.750 21.354 9.9803 82.579 4404 43.750 6.2500 93.750 23.178 10.921 82.665 4405 50.000 6.2500 93.750 25.357 12.044 82.767 4406 56.250 6.2500 93.750 27.908 13.359 82.886 4407 62.500 6.2500 93.750 30.847 14.875 83.024 4408 75.000 0.0000 93.750 37.769 18.173 83.296 4409 75.000 6.2500 93.750 37.952 18.538 83.357 4410 87.500 0.0000 93.750 46.602 22.727 83.710 4411 87.500 6.2500 93.750 46.784 23.092 83.771 4412 100.00 0.0000 93.750 57.265 28.225 84.210 4413 100.00 6.2500 93.750 57.447 28.590 84.270 4414 100.00 12.500 93.750 57.773 29.241 84.379 4415 6.2500 12.500 93.750 17.153 8.2974 82.475 4416 12.500 12.500 93.750 17.529 8.4910 82.493 4417 18.750 12.500 93.750 18.141 8.8066 82.522 4418 25.000 12.500 93.750 19.020 9.2599 82.563 4419 31.250 12.500 93.750 20.192 9.8643 82.618 4420 37.500 12.500 93.750 21.680 10.631 82.688 4421 43.750 12.500 93.750 23.503 11.572 82.773 4422 50.000 12.500 93.750 25.682 12.695 82.875 4423 56.250 12.500 93.750 28.233 14.010 82.995 4424 62.500 12.500 93.750 31.173 15.526 83.132 4425 68.750 12.500 93.750 34.516 17.250 83.289 4426 75.000 12.500 93.750 38.277 19.189 83.465 4427 81.250 12.500 93.750 42.471 21.351 83.662 4428 87.500 12.500 93.750 47.110 23.743 83.879 4429 0.0000 6.2500 93.750 16.617 7.5379 82.357 4430 0.0000 12.500 93.750 16.943 8.1889 82.466 4431 0.0000 18.750 93.750 17.474 9.2504 82.643 4432 6.2500 18.750 93.750 17.684 9.3589 82.652 4433 12.500 18.750 93.750 18.060 9.5525 82.670 4434 18.750 18.750 93.750 18.672 9.8681 82.699 4435 25.000 18.750 93.750 19.551 10.321 82.740 4436 31.250 18.750 93.750 20.723 10.926 82.795 4437 37.500 18.750 93.750 22.211 11.693 82.865 4438 43.750 18.750 93.750 24.034 12.633 82.950 4439 50.000 18.750 93.750 26.213 13.756 83.052 4440 56.250 18.750 93.750 28.764 15.072 83.172 4441 62.500 18.750 93.750 31.703 16.587 83.309 4442 68.750 18.750 93.750 35.047 18.311 83.466 4443 75.000 18.750 93.750 38.808 20.251 83.642 4444 81.250 18.750 93.750 43.002 22.413 83.839 4445 87.500 18.750 93.750 47.641 24.805 84.056 4446 93.750 18.750 93.750 52.737 27.433 84.295 4447 100.00 18.750 93.750 58.304 30.303 84.556 4448 0.0000 25.000 93.750 18.236 10.775 82.897 4449 6.2500 25.000 93.750 18.447 10.884 82.907 4450 12.500 25.000 93.750 18.822 11.077 82.924 4451 18.750 25.000 93.750 19.434 11.393 82.953 4452 25.000 25.000 93.750 20.313 11.846 82.994 4453 31.250 25.000 93.750 21.485 12.450 83.049 4454 37.500 25.000 93.750 22.973 13.217 83.119 4455 43.750 25.000 93.750 24.797 14.158 83.204 4456 50.000 25.000 93.750 26.975 15.281 83.306 4457 56.250 25.000 93.750 29.526 16.596 83.426 4458 62.500 25.000 93.750 32.466 18.112 83.563 4459 68.750 25.000 93.750 35.809 19.836 83.720 4460 75.000 25.000 93.750 39.571 21.775 83.896 4461 81.250 25.000 93.750 43.764 23.937 84.093 4462 87.500 25.000 93.750 48.403 26.329 84.310 4463 93.750 25.000 93.750 53.500 28.957 84.549 4464 100.00 25.000 93.750 59.066 31.827 84.810 4465 0.0000 31.250 93.750 19.252 12.807 83.235 4466 6.2500 31.250 93.750 19.463 12.916 83.245 4467 12.500 31.250 93.750 19.838 13.109 83.263 4468 18.750 31.250 93.750 20.450 13.425 83.292 4469 25.000 31.250 93.750 21.330 13.878 83.333 4470 31.250 31.250 93.750 22.502 14.483 83.388 4471 37.500 31.250 93.750 23.989 15.250 83.457 4472 43.750 31.250 93.750 25.813 16.190 83.543 4473 50.000 31.250 93.750 27.992 17.313 83.645 4474 56.250 31.250 93.750 30.543 18.629 83.765 4475 62.500 31.250 93.750 33.482 20.144 83.902 4476 68.750 31.250 93.750 36.825 21.868 84.059 4477 75.000 31.250 93.750 40.587 23.808 84.235 4478 81.250 31.250 93.750 44.781 25.970 84.432 4479 87.500 31.250 93.750 49.419 28.362 84.649 4480 93.750 31.250 93.750 54.516 30.989 84.888 4481 100.00 31.250 93.750 60.082 33.859 85.149 4482 0.0000 37.500 93.750 20.542 15.387 83.665 4483 6.2500 37.500 93.750 20.753 15.495 83.675 4484 12.500 37.500 93.750 21.128 15.689 83.693 4485 18.750 37.500 93.750 21.740 16.005 83.722 4486 25.000 37.500 93.750 22.620 16.458 83.763 4487 31.250 37.500 93.750 23.792 17.062 83.818 4488 37.500 37.500 93.750 25.279 17.829 83.887 4489 43.750 37.500 93.750 27.103 18.770 83.973 4490 50.000 37.500 93.750 29.282 19.893 84.075 4491 56.250 37.500 93.750 31.833 21.208 84.195 4492 62.500 37.500 93.750 34.772 22.724 84.332 4493 68.750 37.500 93.750 38.115 24.448 84.489 4494 75.000 37.500 93.750 41.877 26.387 84.665 4495 81.250 37.500 93.750 46.071 28.549 84.862 4496 87.500 37.500 93.750 50.709 30.941 85.079 4497 93.750 37.500 93.750 55.806 33.569 85.318 4498 100.00 37.500 93.750 61.372 36.439 85.579 4499 0.0000 43.750 93.750 22.124 18.549 84.193 4500 6.2500 43.750 93.750 22.334 18.658 84.202 4501 12.500 43.750 93.750 22.710 18.851 84.220 4502 18.750 43.750 93.750 23.322 19.167 84.249 4503 25.000 43.750 93.750 24.201 19.620 84.290 4504 31.250 43.750 93.750 25.373 20.225 84.345 4505 37.500 43.750 93.750 26.861 20.992 84.415 4506 43.750 43.750 93.750 28.684 21.932 84.500 4507 50.000 43.750 93.750 30.863 23.055 84.602 4508 56.250 43.750 93.750 33.414 24.371 84.722 4509 62.500 43.750 93.750 36.353 25.886 84.859 4510 68.750 43.750 93.750 39.697 27.610 85.016 4511 75.000 43.750 93.750 43.458 29.550 85.192 4512 81.250 43.750 93.750 47.652 31.712 85.389 4513 87.500 43.750 93.750 52.291 34.104 85.606 4514 93.750 43.750 93.750 57.387 36.731 85.845 4515 100.00 43.750 93.750 62.954 39.602 86.106 4516 0.0000 50.000 93.750 24.013 22.327 84.822 4517 6.2500 50.000 93.750 24.223 22.436 84.832 4518 12.500 50.000 93.750 24.599 22.629 84.850 4519 18.750 50.000 93.750 25.211 22.945 84.878 4520 25.000 50.000 93.750 26.090 23.398 84.920 4521 31.250 50.000 93.750 27.262 24.003 84.975 4522 37.500 50.000 93.750 28.750 24.770 85.044 4523 43.750 50.000 93.750 30.574 25.710 85.130 4524 50.000 50.000 93.750 32.752 26.833 85.232 4525 56.250 50.000 93.750 35.303 28.148 85.351 4526 62.500 50.000 93.750 38.243 29.664 85.489 4527 68.750 50.000 93.750 41.586 31.388 85.646 4528 75.000 50.000 93.750 45.348 33.327 85.822 4529 81.250 50.000 93.750 49.541 35.490 86.019 4530 87.500 50.000 93.750 54.180 37.881 86.236 4531 93.750 50.000 93.750 59.277 40.509 86.475 4532 100.00 50.000 93.750 64.843 43.379 86.736 4533 0.0000 56.250 93.750 26.225 26.750 85.560 4534 6.2500 56.250 93.750 26.435 26.859 85.570 4535 12.500 56.250 93.750 26.811 27.053 85.587 4536 18.750 56.250 93.750 27.423 27.368 85.616 4537 25.000 56.250 93.750 28.302 27.822 85.657 4538 31.250 56.250 93.750 29.474 28.426 85.712 4539 37.500 56.250 93.750 30.962 29.193 85.782 4540 43.750 56.250 93.750 32.786 30.133 85.867 4541 50.000 56.250 93.750 34.964 31.257 85.969 4542 56.250 56.250 93.750 37.515 32.572 86.089 4543 62.500 56.250 93.750 40.455 34.087 86.226 4544 68.750 56.250 93.750 43.798 35.811 86.383 4545 75.000 56.250 93.750 47.560 37.751 86.559 4546 81.250 56.250 93.750 51.753 39.913 86.756 4547 87.500 56.250 93.750 56.392 42.305 86.973 4548 93.750 56.250 93.750 61.489 44.933 87.212 4549 100.00 56.250 93.750 67.055 47.803 87.473 4550 0.0000 62.500 93.750 28.774 31.848 86.409 4551 6.2500 62.500 93.750 28.984 31.956 86.419 4552 12.500 62.500 93.750 29.360 32.150 86.437 4553 18.750 62.500 93.750 29.972 32.465 86.465 4554 25.000 62.500 93.750 30.851 32.919 86.507 4555 31.250 62.500 93.750 32.023 33.523 86.562 4556 37.500 62.500 93.750 33.511 34.290 86.631 4557 43.750 62.500 93.750 35.334 35.230 86.717 4558 50.000 62.500 93.750 37.513 36.354 86.819 4559 56.250 62.500 93.750 40.064 37.669 86.938 4560 62.500 62.500 93.750 43.004 39.185 87.076 4561 68.750 62.500 93.750 46.347 40.908 87.233 4562 75.000 62.500 93.750 50.108 42.848 87.409 4563 81.250 62.500 93.750 54.302 45.010 87.606 4564 87.500 62.500 93.750 58.941 47.402 87.823 4565 93.750 62.500 93.750 64.038 50.030 88.062 4566 100.00 62.500 93.750 69.604 52.900 88.323 4567 0.0000 68.750 93.750 31.673 37.645 87.376 4568 6.2500 68.750 93.750 31.883 37.754 87.386 4569 12.500 68.750 93.750 32.259 37.947 87.403 4570 18.750 68.750 93.750 32.871 38.263 87.432 4571 25.000 68.750 93.750 33.750 38.716 87.473 4572 31.250 68.750 93.750 34.922 39.320 87.528 4573 37.500 68.750 93.750 36.410 40.087 87.598 4574 43.750 68.750 93.750 38.234 41.028 87.683 4575 50.000 68.750 93.750 40.412 42.151 87.785 4576 56.250 68.750 93.750 42.963 43.466 87.905 4577 62.500 68.750 93.750 45.903 44.982 88.042 4578 68.750 68.750 93.750 49.246 46.706 88.199 4579 75.000 68.750 93.750 53.008 48.645 88.375 4580 81.250 68.750 93.750 57.201 50.807 88.572 4581 87.500 68.750 93.750 61.840 53.199 88.789 4582 93.750 68.750 93.750 66.937 55.827 89.028 4583 100.00 68.750 93.750 72.503 58.697 89.289 4584 0.0000 75.000 93.750 34.935 44.168 88.463 4585 6.2500 75.000 93.750 35.145 44.276 88.473 4586 12.500 75.000 93.750 35.521 44.470 88.490 4587 18.750 75.000 93.750 36.133 44.785 88.519 4588 25.000 75.000 93.750 37.012 45.239 88.560 4589 31.250 75.000 93.750 38.184 45.843 88.615 4590 37.500 75.000 93.750 39.672 46.610 88.685 4591 43.750 75.000 93.750 41.495 47.550 88.770 4592 50.000 75.000 93.750 43.674 48.674 88.872 4593 56.250 75.000 93.750 46.225 49.989 88.992 4594 62.500 75.000 93.750 49.164 51.505 89.130 4595 68.750 75.000 93.750 52.508 53.228 89.286 4596 75.000 75.000 93.750 56.269 55.168 89.463 4597 81.250 75.000 93.750 60.463 57.330 89.659 4598 87.500 75.000 93.750 65.102 59.722 89.877 4599 93.750 75.000 93.750 70.198 62.350 90.115 4600 100.00 75.000 93.750 75.765 65.220 90.376 4601 0.0000 81.250 93.750 38.571 51.440 89.675 4602 6.2500 81.250 93.750 38.782 51.548 89.685 4603 12.500 81.250 93.750 39.157 51.742 89.703 4604 18.750 81.250 93.750 39.769 52.057 89.731 4605 25.000 81.250 93.750 40.648 52.511 89.772 4606 31.250 81.250 93.750 41.821 53.115 89.827 4607 37.500 81.250 93.750 43.308 53.882 89.897 4608 43.750 81.250 93.750 45.132 54.822 89.983 4609 50.000 81.250 93.750 47.311 55.946 90.085 4610 56.250 81.250 93.750 49.861 57.261 90.204 4611 62.500 81.250 93.750 52.801 58.777 90.342 4612 68.750 81.250 93.750 56.144 60.500 90.499 4613 75.000 81.250 93.750 59.906 62.440 90.675 4614 81.250 81.250 93.750 64.099 64.602 90.871 4615 87.500 81.250 93.750 68.738 66.994 91.089 4616 93.750 81.250 93.750 73.835 69.622 91.328 4617 100.00 81.250 93.750 79.401 72.492 91.588 4618 0.0000 87.500 93.750 42.594 59.483 91.016 4619 6.2500 87.500 93.750 42.804 59.592 91.026 4620 12.500 87.500 93.750 43.180 59.786 91.043 4621 18.750 87.500 93.750 43.792 60.101 91.072 4622 25.000 87.500 93.750 44.671 60.555 91.113 4623 31.250 87.500 93.750 45.843 61.159 91.168 4624 37.500 87.500 93.750 47.331 61.926 91.238 4625 43.750 87.500 93.750 49.154 62.866 91.323 4626 50.000 87.500 93.750 51.333 63.990 91.425 4627 56.250 87.500 93.750 53.884 65.305 91.545 4628 62.500 87.500 93.750 56.823 66.820 91.683 4629 68.750 87.500 93.750 60.167 68.544 91.839 4630 75.000 87.500 93.750 63.928 70.484 92.016 4631 81.250 87.500 93.750 68.122 72.646 92.212 4632 87.500 87.500 93.750 72.761 75.038 92.430 4633 93.750 87.500 93.750 77.857 77.666 92.668 4634 100.00 87.500 93.750 83.424 80.536 92.929 4635 0.0000 93.750 93.750 47.013 68.321 92.489 4636 6.2500 93.750 93.750 47.224 68.430 92.499 4637 12.500 93.750 93.750 47.599 68.623 92.517 4638 18.750 93.750 93.750 48.211 68.939 92.545 4639 25.000 93.750 93.750 49.090 69.392 92.586 4640 31.250 93.750 93.750 50.262 69.996 92.641 4641 37.500 93.750 93.750 51.750 70.764 92.711 4642 43.750 93.750 93.750 53.574 71.704 92.797 4643 50.000 93.750 93.750 55.752 72.827 92.899 4644 56.250 93.750 93.750 58.303 74.142 93.018 4645 62.500 93.750 93.750 61.243 75.658 93.156 4646 68.750 93.750 93.750 64.586 77.382 93.313 4647 75.000 93.750 93.750 68.348 79.321 93.489 4648 81.250 93.750 93.750 72.541 81.484 93.685 4649 87.500 93.750 93.750 77.180 83.875 93.903 4650 100.00 93.750 93.750 87.843 89.373 94.402 4651 0.0000 100.00 93.750 51.840 77.973 94.098 4652 6.2500 100.00 93.750 52.050 78.082 94.108 4653 12.500 100.00 93.750 52.426 78.276 94.126 4654 18.750 100.00 93.750 53.038 78.591 94.154 4655 25.000 100.00 93.750 53.917 79.044 94.195 4656 31.250 100.00 93.750 55.089 79.649 94.250 4657 37.500 100.00 93.750 56.577 80.416 94.320 4658 43.750 100.00 93.750 58.401 81.356 94.406 4659 50.000 100.00 93.750 60.579 82.479 94.508 4660 56.250 100.00 93.750 63.130 83.795 94.627 4661 62.500 100.00 93.750 66.070 85.310 94.765 4662 68.750 100.00 93.750 69.413 87.034 94.922 4663 75.000 100.00 93.750 73.175 88.974 95.098 4664 81.250 100.00 93.750 77.368 91.136 95.294 4665 87.500 100.00 93.750 82.007 93.528 95.512 4666 93.750 100.00 93.750 87.104 96.156 95.751 4667 100.00 100.00 93.750 92.670 99.026 96.011 4668 6.2500 0.0000 100.00 19.082 8.2559 95.139 4669 6.2500 6.2500 100.00 19.264 8.6209 95.200 4670 12.500 6.2500 100.00 19.640 8.8144 95.217 4671 18.750 6.2500 100.00 20.252 9.1301 95.246 4672 31.250 0.0000 100.00 22.120 9.8227 95.281 4673 37.500 0.0000 100.00 23.608 10.590 95.351 4674 43.750 0.0000 100.00 25.432 11.530 95.436 4675 50.000 0.0000 100.00 27.610 12.653 95.538 4676 56.250 0.0000 100.00 30.161 13.969 95.658 4677 62.500 0.0000 100.00 33.101 15.484 95.796 4678 62.500 6.2500 100.00 33.283 15.849 95.857 4679 68.750 6.2500 100.00 36.627 17.573 96.013 4680 81.250 0.0000 100.00 44.399 21.310 96.325 4681 81.250 6.2500 100.00 44.582 21.675 96.386 4682 93.750 0.0000 100.00 54.135 26.329 96.781 4683 93.750 6.2500 100.00 54.317 26.694 96.842 4684 93.750 12.500 100.00 54.643 27.345 96.951 4685 12.500 0.0000 100.00 19.457 8.4494 95.156 4686 18.750 0.0000 100.00 20.069 8.7650 95.185 4687 25.000 0.0000 100.00 20.948 9.2184 95.226 4688 25.000 6.2500 100.00 21.131 9.5834 95.287 4689 31.250 6.2500 100.00 22.303 10.188 95.342 4690 37.500 6.2500 100.00 23.791 10.955 95.412 4691 43.750 6.2500 100.00 25.614 11.895 95.497 4692 50.000 6.2500 100.00 27.793 13.018 95.599 4693 56.250 6.2500 100.00 30.344 14.334 95.719 4694 68.750 0.0000 100.00 36.444 17.208 95.952 4695 75.000 0.0000 100.00 40.206 19.148 96.129 4696 75.000 6.2500 100.00 40.388 19.513 96.190 4697 87.500 0.0000 100.00 49.038 23.702 96.543 4698 87.500 6.2500 100.00 49.221 24.067 96.603 4699 100.00 0.0000 100.00 59.701 29.199 97.042 4700 100.00 6.2500 100.00 59.884 29.565 97.103 4701 100.00 12.500 100.00 60.209 30.215 97.212 4702 6.2500 12.500 100.00 19.590 9.2718 95.308 4703 12.500 12.500 100.00 19.965 9.4654 95.326 4704 18.750 12.500 100.00 20.577 9.7810 95.354 4705 25.000 12.500 100.00 21.456 10.234 95.396 4706 31.250 12.500 100.00 22.628 10.839 95.451 4707 37.500 12.500 100.00 24.116 11.606 95.520 4708 43.750 12.500 100.00 25.940 12.546 95.606 4709 50.000 12.500 100.00 28.119 13.669 95.708 4710 56.250 12.500 100.00 30.669 14.985 95.827 4711 62.500 12.500 100.00 33.609 16.500 95.965 4712 68.750 12.500 100.00 36.952 18.224 96.122 4713 75.000 12.500 100.00 40.714 20.163 96.298 4714 81.250 12.500 100.00 44.907 22.326 96.495 4715 87.500 12.500 100.00 49.546 24.718 96.712 4716 0.0000 6.2500 100.00 19.054 8.5123 95.190 4717 0.0000 12.500 100.00 19.379 9.1633 95.298 4718 0.0000 18.750 100.00 19.910 10.225 95.475 4719 6.2500 18.750 100.00 20.120 10.333 95.485 4720 12.500 18.750 100.00 20.496 10.527 95.503 4721 18.750 18.750 100.00 21.108 10.843 95.531 4722 25.000 18.750 100.00 21.987 11.296 95.573 4723 31.250 18.750 100.00 23.159 11.900 95.628 4724 37.500 18.750 100.00 24.647 12.667 95.697 4725 43.750 18.750 100.00 26.471 13.608 95.783 4726 50.000 18.750 100.00 28.649 14.731 95.885 4727 56.250 18.750 100.00 31.200 16.046 96.004 4728 62.500 18.750 100.00 34.140 17.562 96.142 4729 68.750 18.750 100.00 37.483 19.286 96.299 4730 75.000 18.750 100.00 41.245 21.225 96.475 4731 81.250 18.750 100.00 45.438 23.387 96.671 4732 87.500 18.750 100.00 50.077 25.779 96.889 4733 93.750 18.750 100.00 55.174 28.407 97.128 4734 100.00 18.750 100.00 60.740 31.277 97.388 4735 100.00 25.000 100.00 61.503 32.802 97.643 4736 6.2500 25.000 100.00 20.883 11.858 95.739 4737 12.500 25.000 100.00 21.258 12.051 95.757 4738 18.750 25.000 100.00 21.870 12.367 95.786 4739 25.000 25.000 100.00 22.750 12.820 95.827 4740 31.250 25.000 100.00 23.922 13.425 95.882 4741 37.500 25.000 100.00 25.409 14.192 95.951 4742 43.750 25.000 100.00 27.233 15.132 96.037 4743 50.000 25.000 100.00 29.412 16.255 96.139 4744 56.250 25.000 100.00 31.963 17.571 96.258 4745 62.500 25.000 100.00 34.902 19.086 96.396 4746 68.750 25.000 100.00 38.245 20.810 96.553 4747 75.000 25.000 100.00 42.007 22.750 96.729 4748 81.250 25.000 100.00 46.201 24.912 96.926 4749 87.500 25.000 100.00 50.840 27.304 97.143 4750 93.750 25.000 100.00 55.936 29.931 97.382 4751 0.0000 25.000 100.00 20.672 11.749 95.729 4752 0.0000 31.250 100.00 21.689 13.782 96.068 4753 6.2500 31.250 100.00 21.899 13.890 96.078 4754 12.500 31.250 100.00 22.275 14.084 96.096 4755 18.750 31.250 100.00 22.887 14.399 96.124 4756 25.000 31.250 100.00 23.766 14.853 96.165 4757 31.250 31.250 100.00 24.938 15.457 96.220 4758 37.500 31.250 100.00 26.426 16.224 96.290 4759 43.750 31.250 100.00 28.249 17.164 96.376 4760 50.000 31.250 100.00 30.428 18.288 96.478 4761 56.250 31.250 100.00 32.979 19.603 96.597 4762 62.500 31.250 100.00 35.918 21.119 96.735 4763 68.750 31.250 100.00 39.262 22.842 96.892 4764 75.000 31.250 100.00 43.023 24.782 97.068 4765 81.250 31.250 100.00 47.217 26.944 97.264 4766 87.500 31.250 100.00 51.856 29.336 97.482 4767 93.750 31.250 100.00 56.952 31.964 97.721 4768 100.00 31.250 100.00 62.519 34.834 97.981 4769 0.0000 37.500 100.00 22.979 16.361 96.498 4770 6.2500 37.500 100.00 23.189 16.470 96.508 4771 12.500 37.500 100.00 23.565 16.663 96.526 4772 18.750 37.500 100.00 24.177 16.979 96.554 4773 25.000 37.500 100.00 25.056 17.432 96.596 4774 31.250 37.500 100.00 26.228 18.037 96.650 4775 37.500 37.500 100.00 27.716 18.804 96.720 4776 43.750 37.500 100.00 29.539 19.744 96.806 4777 50.000 37.500 100.00 31.718 20.867 96.908 4778 56.250 37.500 100.00 34.269 22.183 97.027 4779 62.500 37.500 100.00 37.208 23.698 97.165 4780 68.750 37.500 100.00 40.552 25.422 97.322 4781 75.000 37.500 100.00 44.313 27.362 97.498 4782 81.250 37.500 100.00 48.507 29.524 97.694 4783 87.500 37.500 100.00 53.146 31.916 97.912 4784 93.750 37.500 100.00 58.242 34.543 98.151 4785 100.00 37.500 100.00 63.809 37.413 98.411 4786 0.0000 43.750 100.00 24.560 19.524 97.025 4787 6.2500 43.750 100.00 24.771 19.632 97.035 4788 12.500 43.750 100.00 25.146 19.826 97.053 4789 18.750 43.750 100.00 25.758 20.141 97.081 4790 25.000 43.750 100.00 26.637 20.595 97.123 4791 31.250 43.750 100.00 27.809 21.199 97.178 4792 37.500 43.750 100.00 29.297 21.966 97.247 4793 43.750 43.750 100.00 31.121 22.906 97.333 4794 50.000 43.750 100.00 33.299 24.030 97.435 4795 56.250 43.750 100.00 35.850 25.345 97.554 4796 62.500 43.750 100.00 38.790 26.861 97.692 4797 68.750 43.750 100.00 42.133 28.584 97.849 4798 75.000 43.750 100.00 45.895 30.524 98.025 4799 81.250 43.750 100.00 50.088 32.686 98.222 4800 87.500 43.750 100.00 54.727 35.078 98.439 4801 93.750 43.750 100.00 59.824 37.706 98.678 4802 100.00 43.750 100.00 65.390 40.576 98.939 4803 0.0000 50.000 100.00 26.449 23.302 97.655 4804 6.2500 50.000 100.00 26.660 23.410 97.665 4805 12.500 50.000 100.00 27.035 23.604 97.682 4806 18.750 50.000 100.00 27.647 23.919 97.711 4807 25.000 50.000 100.00 28.527 24.373 97.752 4808 31.250 50.000 100.00 29.699 24.977 97.807 4809 37.500 50.000 100.00 31.186 25.744 97.877 4810 43.750 50.000 100.00 33.010 26.684 97.962 4811 50.000 50.000 100.00 35.189 27.808 98.065 4812 56.250 50.000 100.00 37.740 29.123 98.184 4813 62.500 50.000 100.00 40.679 30.638 98.322 4814 68.750 50.000 100.00 44.022 32.362 98.478 4815 75.000 50.000 100.00 47.784 34.302 98.655 4816 81.250 50.000 100.00 51.978 36.464 98.851 4817 87.500 50.000 100.00 56.616 38.856 99.069 4818 93.750 50.000 100.00 61.713 41.484 99.307 4819 100.00 50.000 100.00 67.279 44.354 99.568 4820 0.0000 56.250 100.00 28.661 27.725 98.392 4821 6.2500 56.250 100.00 28.872 27.833 98.402 4822 12.500 56.250 100.00 29.247 28.027 98.420 4823 18.750 56.250 100.00 29.859 28.343 98.449 4824 25.000 56.250 100.00 30.739 28.796 98.490 4825 31.250 56.250 100.00 31.911 29.400 98.545 4826 37.500 56.250 100.00 33.398 30.167 98.614 4827 43.750 56.250 100.00 35.222 31.108 98.700 4828 50.000 56.250 100.00 37.401 32.231 98.802 4829 56.250 56.250 100.00 39.952 33.546 98.921 4830 62.500 56.250 100.00 42.891 35.062 99.059 4831 68.750 56.250 100.00 46.234 36.786 99.216 4832 75.000 56.250 100.00 49.996 38.725 99.392 4833 81.250 56.250 100.00 54.190 40.887 99.589 4834 87.500 56.250 100.00 58.828 43.279 99.806 4835 93.750 56.250 100.00 63.925 45.907 100.04 4836 100.00 56.250 100.00 69.491 48.777 100.31 4837 0.0000 62.500 100.00 31.210 32.822 99.242 4838 6.2500 62.500 100.00 31.421 32.931 99.252 4839 12.500 62.500 100.00 31.796 33.124 99.269 4840 18.750 62.500 100.00 32.408 33.440 99.298 4841 25.000 62.500 100.00 33.287 33.893 99.339 4842 31.250 62.500 100.00 34.460 34.497 99.394 4843 37.500 62.500 100.00 35.947 35.264 99.464 4844 43.750 62.500 100.00 37.771 36.205 99.549 4845 50.000 62.500 100.00 39.950 37.328 99.652 4846 56.250 62.500 100.00 42.500 38.643 99.771 4847 62.500 62.500 100.00 45.440 40.159 99.909 4848 68.750 62.500 100.00 48.783 41.883 100.07 4849 75.000 62.500 100.00 52.545 43.822 100.24 4850 81.250 62.500 100.00 56.738 45.984 100.44 4851 87.500 62.500 100.00 61.377 48.376 100.66 4852 93.750 62.500 100.00 66.474 51.004 100.89 4853 100.00 62.500 100.00 72.040 53.874 101.16 4854 0.0000 68.750 100.00 34.109 38.619 100.21 4855 6.2500 68.750 100.00 34.320 38.728 100.22 4856 12.500 68.750 100.00 34.695 38.921 100.24 4857 18.750 68.750 100.00 35.307 39.237 100.26 4858 25.000 68.750 100.00 36.187 39.690 100.31 4859 31.250 68.750 100.00 37.359 40.295 100.36 4860 37.500 68.750 100.00 38.846 41.062 100.43 4861 43.750 68.750 100.00 40.670 42.002 100.52 4862 50.000 68.750 100.00 42.849 43.125 100.62 4863 56.250 68.750 100.00 45.400 44.441 100.74 4864 62.500 68.750 100.00 48.339 45.956 100.88 4865 68.750 68.750 100.00 51.682 47.680 101.03 4866 75.000 68.750 100.00 55.444 49.620 101.21 4867 81.250 68.750 100.00 59.638 51.782 101.40 4868 87.500 68.750 100.00 64.276 54.174 101.62 4869 93.750 68.750 100.00 69.373 56.801 101.86 4870 100.00 68.750 100.00 74.939 59.672 102.12 4871 0.0000 75.000 100.00 37.371 45.142 101.30 4872 6.2500 75.000 100.00 37.582 45.251 101.31 4873 12.500 75.000 100.00 37.957 45.444 101.32 4874 18.750 75.000 100.00 38.569 45.760 101.35 4875 25.000 75.000 100.00 39.448 46.213 101.39 4876 31.250 75.000 100.00 40.620 46.817 101.45 4877 37.500 75.000 100.00 42.108 47.584 101.52 4878 43.750 75.000 100.00 43.932 48.525 101.60 4879 50.000 75.000 100.00 46.110 49.648 101.71 4880 56.250 75.000 100.00 48.661 50.963 101.82 4881 62.500 75.000 100.00 51.601 52.479 101.96 4882 68.750 75.000 100.00 54.944 54.203 102.12 4883 75.000 75.000 100.00 58.706 56.142 102.30 4884 81.250 75.000 100.00 62.899 58.305 102.49 4885 87.500 75.000 100.00 67.538 60.696 102.71 4886 93.750 75.000 100.00 72.635 63.324 102.95 4887 100.00 75.000 100.00 78.201 66.194 103.21 4888 0.0000 81.250 100.00 41.008 52.414 102.51 4889 6.2500 81.250 100.00 41.218 52.523 102.52 4890 12.500 81.250 100.00 41.593 52.716 102.54 4891 18.750 81.250 100.00 42.206 53.032 102.56 4892 25.000 81.250 100.00 43.085 53.485 102.61 4893 31.250 81.250 100.00 44.257 54.089 102.66 4894 37.500 81.250 100.00 45.745 54.856 102.73 4895 43.750 81.250 100.00 47.568 55.797 102.82 4896 50.000 81.250 100.00 49.747 56.920 102.92 4897 56.250 81.250 100.00 52.298 58.235 103.04 4898 62.500 81.250 100.00 55.237 59.751 103.17 4899 68.750 81.250 100.00 58.581 61.475 103.33 4900 75.000 81.250 100.00 62.342 63.414 103.51 4901 81.250 81.250 100.00 66.536 65.577 103.70 4902 87.500 81.250 100.00 71.175 67.968 103.92 4903 93.750 81.250 100.00 76.271 70.596 104.16 4904 100.00 81.250 100.00 81.838 73.466 104.42 4905 0.0000 87.500 100.00 45.030 60.458 103.85 4906 6.2500 87.500 100.00 45.241 60.566 103.86 4907 12.500 87.500 100.00 45.616 60.760 103.88 4908 18.750 87.500 100.00 46.228 61.076 103.90 4909 25.000 87.500 100.00 47.107 61.529 103.95 4910 31.250 87.500 100.00 48.279 62.133 104.00 4911 37.500 87.500 100.00 49.767 62.900 104.07 4912 43.750 87.500 100.00 51.591 63.841 104.16 4913 50.000 87.500 100.00 53.769 64.964 104.26 4914 56.250 87.500 100.00 56.320 66.279 104.38 4915 62.500 87.500 100.00 59.260 67.795 104.52 4916 68.750 87.500 100.00 62.603 69.519 104.67 4917 75.000 87.500 100.00 66.365 71.458 104.85 4918 81.250 87.500 100.00 70.558 73.620 105.04 4919 87.500 87.500 100.00 75.197 76.012 105.26 4920 93.750 87.500 100.00 80.294 78.640 105.50 4921 100.00 87.500 100.00 85.860 81.510 105.76 4922 0.0000 93.750 100.00 49.449 69.296 105.32 4923 6.2500 93.750 100.00 49.660 69.404 105.33 4924 12.500 93.750 100.00 50.035 69.598 105.35 4925 18.750 93.750 100.00 50.648 69.913 105.38 4926 25.000 93.750 100.00 51.527 70.367 105.42 4927 31.250 93.750 100.00 52.699 70.971 105.47 4928 37.500 93.750 100.00 54.186 71.738 105.54 4929 43.750 93.750 100.00 56.010 72.678 105.63 4930 50.000 93.750 100.00 58.189 73.802 105.73 4931 56.250 93.750 100.00 60.740 75.117 105.85 4932 62.500 93.750 100.00 63.679 76.632 105.99 4933 68.750 93.750 100.00 67.023 78.356 106.15 4934 75.000 93.750 100.00 70.784 80.296 106.32 4935 81.250 93.750 100.00 74.978 82.458 106.52 4936 87.500 93.750 100.00 79.617 84.850 106.74 4937 93.750 93.750 100.00 84.713 87.478 106.97 4938 100.00 93.750 100.00 90.280 90.348 107.24 4939 0.0000 100.00 100.00 54.276 78.948 106.93 4940 6.2500 100.00 100.00 54.487 79.056 106.94 4941 12.500 100.00 100.00 54.862 79.250 106.96 4942 18.750 100.00 100.00 55.474 79.566 106.99 4943 25.000 100.00 100.00 56.354 80.019 107.03 4944 31.250 100.00 100.00 57.526 80.623 107.08 4945 37.500 100.00 100.00 59.013 81.390 107.15 4946 43.750 100.00 100.00 60.837 82.331 107.24 4947 50.000 100.00 100.00 63.016 83.454 107.34 4948 56.250 100.00 100.00 65.567 84.769 107.46 4949 62.500 100.00 100.00 68.506 86.285 107.60 4950 68.750 100.00 100.00 71.849 88.009 107.75 4951 75.000 100.00 100.00 75.611 89.948 107.93 4952 81.250 100.00 100.00 79.805 92.110 108.13 4953 87.500 100.00 100.00 84.443 94.502 108.34 4954 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DENSITY_EXTREME_VALUES "8" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 47.36070 100.0000 25.61297 21.62916 97.37627 2 100.0000 0.000000 79.35140 52.42580 26.28975 58.72153 3 0.000000 0.000000 58.99710 6.485834 3.193987 29.89445 4 100.0000 66.65930 0.000000 56.05879 50.50543 7.656144 5 0.000000 35.60110 0.000000 4.685619 8.370208 2.228550 6 84.44440 0.000000 0.000000 28.84279 15.35583 2.304665 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DEVICE_COMBINATION_VALUES "9" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 100.0000 100.0000 54.27632 78.94783 106.9308 2 100.0000 0.000000 100.0000 59.70128 29.19948 97.04219 3 0.000000 0.000000 100.0000 18.87111 8.147314 95.12896 4 100.0000 100.0000 0.000000 77.23538 92.85269 14.71507 5 0.000000 100.0000 0.000000 36.40521 71.80052 12.80184 6 100.0000 0.000000 0.000000 41.83017 22.05217 2.913230 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 8 50.00000 50.00000 50.00000 21.14266 22.19007 24.08306 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ti1/d3-e4-s2-g28-m0-b0-f0.ti10000644000076500000000000000675713154615407021434 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" CREATED "Thu Aug 31 12:27:38 2017" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB" WHITE_COLOR_PATCHES "4" BLACK_COLOR_PATCHES "4" SINGLE_DIM_STEPS "2" COMP_GREY_STEPS "52" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 34 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 100.00 95.106 100.00 108.84 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 7 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 8 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 9 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 10 13.726 13.726 13.726 2.5817 2.6639 2.8126 11 17.647 17.647 17.647 3.4695 3.5979 3.8300 12 21.569 21.569 21.569 4.5953 4.7822 5.1201 13 25.490 25.490 25.490 5.9745 6.2332 6.7007 14 29.412 29.412 29.412 7.6213 7.9656 8.5879 15 33.333 33.333 33.333 9.5488 9.9933 10.797 16 37.255 37.255 37.255 11.769 12.329 13.341 17 41.176 41.176 41.176 14.294 14.985 16.234 18 45.098 45.098 45.098 17.134 17.973 19.489 19 49.020 49.020 49.020 20.299 21.303 23.117 20 52.941 52.941 52.941 23.800 24.986 27.129 21 56.863 56.863 56.863 27.646 29.032 31.536 22 60.784 60.784 60.784 31.846 33.450 36.349 23 64.706 64.706 64.706 36.409 38.250 41.578 24 68.627 68.627 68.627 41.343 43.440 47.232 25 72.549 72.549 72.549 46.656 49.030 53.321 26 76.471 76.471 76.471 52.356 55.027 59.853 27 80.392 80.392 80.392 58.452 61.439 66.838 28 84.314 84.314 84.314 64.949 68.275 74.285 29 88.235 88.235 88.235 71.857 75.541 82.200 30 92.157 92.157 92.157 79.181 83.246 90.594 31 96.078 96.078 96.078 86.929 91.397 99.472 32 100.00 0.0000 0.0000 41.830 22.052 2.9132 33 0.0000 100.00 0.0000 36.405 71.801 12.802 34 0.0000 0.0000 100.00 18.871 8.1473 95.129 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DENSITY_EXTREME_VALUES "8" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 47.36070 100.0000 25.61297 21.62916 97.37627 2 100.0000 0.000000 79.35140 52.42580 26.28975 58.72153 3 0.000000 0.000000 58.99710 6.485834 3.193987 29.89445 4 100.0000 66.65930 0.000000 56.05879 50.50543 7.656144 5 0.000000 35.60110 0.000000 4.685619 8.370208 2.228550 6 84.44440 0.000000 0.000000 28.84279 15.35583 2.304665 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DEVICE_COMBINATION_VALUES "9" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 100.0000 100.0000 54.27632 78.94783 106.9308 2 100.0000 0.000000 100.0000 59.70128 29.19948 97.04219 3 0.000000 0.000000 100.0000 18.87111 8.147314 95.12896 4 100.0000 100.0000 0.000000 77.23538 92.85269 14.71507 5 0.000000 100.0000 0.000000 36.40521 71.80052 12.80184 6 100.0000 0.000000 0.000000 41.83017 22.05217 2.913230 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 8 50.00000 50.00000 50.00000 21.14266 22.19007 24.08306 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ti1/d3-e4-s3-g52-m3-b0-f0.ti10000644000076500000000000001303213154615407021415 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" CREATED "Thu Aug 31 13:00:19 2017" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB" WHITE_COLOR_PATCHES "4" BLACK_COLOR_PATCHES "4" SINGLE_DIM_STEPS "3" COMP_GREY_STEPS "52" MULTI_DIM_STEPS "3" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 79 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 50.000 100.00 50.000 48.970 77.836 33.359 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 7 100.00 0.0000 0.0000 41.830 22.052 2.9132 8 100.00 0.0000 50.000 45.655 23.582 23.061 9 100.00 0.0000 100.00 59.701 29.199 97.042 10 100.00 50.000 100.00 67.279 44.354 99.568 11 100.00 50.000 50.000 53.233 38.736 25.587 12 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 13 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 14 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 15 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 16 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 17 11.765 11.765 11.765 2.2218 2.2853 2.4001 18 13.726 13.726 13.726 2.5817 2.6639 2.8126 19 15.686 15.686 15.686 2.9968 3.1007 3.2883 20 17.647 17.647 17.647 3.4695 3.5979 3.8300 21 19.608 19.608 19.608 4.0016 4.1577 4.4398 22 21.569 21.569 21.569 4.5953 4.7822 5.1201 23 23.529 23.529 23.529 5.2523 5.4734 5.8731 24 25.490 25.490 25.490 5.9745 6.2332 6.7007 25 27.451 27.451 27.451 6.7637 7.0634 7.6050 26 29.412 29.412 29.412 7.6213 7.9656 8.5879 27 31.373 31.373 31.373 8.5492 8.9418 9.6512 28 33.333 33.333 33.333 9.5488 9.9933 10.797 29 35.294 35.294 35.294 10.622 11.122 12.026 30 37.255 37.255 37.255 11.769 12.329 13.341 31 39.216 39.216 39.216 12.993 13.616 14.743 32 41.176 41.176 41.176 14.294 14.985 16.234 33 43.137 43.137 43.137 15.674 16.437 17.816 34 45.098 45.098 45.098 17.134 17.973 19.489 35 47.059 47.059 47.059 18.675 19.594 21.255 36 49.020 49.020 49.020 20.299 21.303 23.117 37 50.980 50.980 50.980 22.007 23.100 25.074 38 54.902 54.902 54.902 25.679 26.963 29.282 39 56.863 56.863 56.863 27.646 29.032 31.536 40 58.824 58.824 58.824 29.701 31.194 33.891 41 60.784 60.784 60.784 31.846 33.450 36.349 42 62.745 62.745 62.745 34.081 35.802 38.911 43 64.706 64.706 64.706 36.409 38.250 41.578 44 66.667 66.667 66.667 38.829 40.796 44.351 45 68.627 68.627 68.627 41.343 43.440 47.232 46 70.588 70.588 70.588 43.951 46.185 50.221 47 72.549 72.549 72.549 46.656 49.030 53.321 48 74.510 74.510 74.510 49.457 51.977 56.531 49 76.471 76.471 76.471 52.356 55.027 59.853 50 78.431 78.431 78.431 55.354 58.180 63.289 51 80.392 80.392 80.392 58.452 61.439 66.838 52 82.353 82.353 82.353 61.650 64.803 70.503 53 84.314 84.314 84.314 64.949 68.275 74.285 54 86.275 86.275 86.275 68.351 71.854 78.183 55 88.235 88.235 88.235 71.857 75.541 82.200 56 90.196 90.196 90.196 75.466 79.338 86.337 57 92.157 92.157 92.157 79.181 83.246 90.594 58 94.118 94.118 94.118 83.001 87.265 94.972 59 96.078 96.078 96.078 86.929 91.397 99.472 60 98.039 98.039 98.039 90.963 95.641 104.10 61 100.00 50.000 0.0000 49.408 37.206 5.4393 62 50.000 50.000 0.0000 17.318 20.660 3.9356 63 50.000 100.00 0.0000 45.145 76.307 13.211 64 100.00 100.00 0.0000 77.235 92.853 14.715 65 100.00 100.00 50.000 81.061 94.383 34.863 66 0.0000 50.000 0.0000 8.5782 16.154 3.5261 67 0.0000 50.000 50.000 12.403 17.684 23.674 68 52.941 52.941 52.941 23.800 24.986 27.129 69 0.0000 100.00 0.0000 36.405 71.801 12.802 70 0.0000 100.00 50.000 40.230 73.330 32.949 71 0.0000 0.0000 50.000 4.8252 2.5298 21.147 72 50.000 0.0000 50.000 13.564 7.0358 21.557 73 50.000 0.0000 100.00 27.610 12.653 95.538 74 0.0000 0.0000 100.00 18.871 8.1473 95.129 75 0.0000 50.000 100.00 26.449 23.302 97.655 76 50.000 50.000 100.00 35.189 27.808 98.065 77 50.000 100.00 100.00 63.016 83.454 107.34 78 0.0000 100.00 100.00 54.276 78.948 106.93 79 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DENSITY_EXTREME_VALUES "8" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 47.36070 100.0000 25.61297 21.62916 97.37627 2 100.0000 0.000000 79.35140 52.42580 26.28975 58.72153 3 0.000000 0.000000 58.99710 6.485834 3.193987 29.89445 4 100.0000 66.65930 0.000000 56.05879 50.50543 7.656144 5 0.000000 35.60110 0.000000 4.685619 8.370208 2.228550 6 84.44440 0.000000 0.000000 28.84279 15.35583 2.304665 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DEVICE_COMBINATION_VALUES "9" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 100.0000 100.0000 54.27632 78.94783 106.9308 2 100.0000 0.000000 100.0000 59.70128 29.19948 97.04219 3 0.000000 0.000000 100.0000 18.87111 8.147314 95.12896 4 100.0000 100.0000 0.000000 77.23538 92.85269 14.71507 5 0.000000 100.0000 0.000000 36.40521 71.80052 12.80184 6 100.0000 0.000000 0.000000 41.83017 22.05217 2.913230 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 8 50.00000 50.00000 50.00000 21.14266 22.19007 24.08306 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ti1/d3-e4-s4-g52-m4-b0-f0.ti10000644000076500000000000001624313154615407021426 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" CREATED "Thu Aug 31 12:13:31 2017" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB" WHITE_COLOR_PATCHES "4" BLACK_COLOR_PATCHES "4" SINGLE_DIM_STEPS "4" COMP_GREY_STEPS "52" MULTI_DIM_STEPS "4" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 115 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 66.667 100.00 73.933 57.660 101.79 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 33.333 0.0000 0.0000 4.7091 2.9124 1.1738 7 66.667 0.0000 0.0000 17.413 9.4625 1.7691 8 100.00 0.0000 0.0000 41.830 22.052 2.9132 9 100.00 0.0000 33.333 43.454 22.701 11.464 10 100.00 33.333 33.333 46.670 29.133 12.536 11 100.00 66.667 33.333 57.686 51.162 16.208 12 100.00 66.667 66.667 63.246 53.385 45.495 13 66.667 0.0000 100.00 35.284 16.610 95.898 14 100.00 0.0000 100.00 59.701 29.199 97.042 15 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 16 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 17 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 18 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 19 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 20 11.765 11.765 11.765 2.2218 2.2853 2.4001 21 13.726 13.726 13.726 2.5817 2.6639 2.8126 22 15.686 15.686 15.686 2.9968 3.1007 3.2883 23 17.647 17.647 17.647 3.4695 3.5979 3.8300 24 19.608 19.608 19.608 4.0016 4.1577 4.4398 25 21.569 21.569 21.569 4.5953 4.7822 5.1201 26 23.529 23.529 23.529 5.2523 5.4734 5.8731 27 25.490 25.490 25.490 5.9745 6.2332 6.7007 28 27.451 27.451 27.451 6.7637 7.0634 7.6050 29 29.412 29.412 29.412 7.6213 7.9656 8.5879 30 31.373 31.373 31.373 8.5492 8.9418 9.6512 31 33.333 33.333 33.333 9.5488 9.9933 10.797 32 35.294 35.294 35.294 10.622 11.122 12.026 33 37.255 37.255 37.255 11.769 12.329 13.341 34 39.216 39.216 39.216 12.993 13.616 14.743 35 41.176 41.176 41.176 14.294 14.985 16.234 36 43.137 43.137 43.137 15.674 16.437 17.816 37 45.098 45.098 45.098 17.134 17.973 19.489 38 47.059 47.059 47.059 18.675 19.594 21.255 39 49.020 49.020 49.020 20.299 21.303 23.117 40 50.980 50.980 50.980 22.007 23.100 25.074 41 52.941 52.941 52.941 23.800 24.986 27.129 42 54.902 54.902 54.902 25.679 26.963 29.282 43 56.863 56.863 56.863 27.646 29.032 31.536 44 58.824 58.824 58.824 29.701 31.194 33.891 45 60.784 60.784 60.784 31.846 33.450 36.349 46 62.745 62.745 62.745 34.081 35.802 38.911 47 64.706 64.706 64.706 36.409 38.250 41.578 48 66.667 66.667 66.667 38.829 40.796 44.351 49 68.627 68.627 68.627 41.343 43.440 47.232 50 70.588 70.588 70.588 43.951 46.185 50.221 51 72.549 72.549 72.549 46.656 49.030 53.321 52 74.510 74.510 74.510 49.457 51.977 56.531 53 76.471 76.471 76.471 52.356 55.027 59.853 54 78.431 78.431 78.431 55.354 58.180 63.289 55 80.392 80.392 80.392 58.452 61.439 66.838 56 82.353 82.353 82.353 61.650 64.803 70.503 57 84.314 84.314 84.314 64.949 68.275 74.285 58 86.275 86.275 86.275 68.351 71.854 78.183 59 88.235 88.235 88.235 71.857 75.541 82.200 60 90.196 90.196 90.196 75.466 79.338 86.337 61 92.157 92.157 92.157 79.181 83.246 90.594 62 94.118 94.118 94.118 83.001 87.265 94.972 63 96.078 96.078 96.078 86.929 91.397 99.472 64 98.039 98.039 98.039 90.963 95.641 104.10 65 33.333 33.333 0.0000 7.9254 9.3441 2.2459 66 66.667 33.333 0.0000 20.629 15.894 2.8412 67 100.00 33.333 0.0000 45.046 28.484 3.9853 68 100.00 66.667 0.0000 56.062 50.512 7.6573 69 66.667 66.667 0.0000 31.645 37.923 6.5132 70 33.333 66.667 0.0000 18.941 31.373 5.9179 71 33.333 100.00 0.0000 40.114 73.713 12.976 72 66.667 100.00 0.0000 52.818 80.263 13.571 73 100.00 100.00 0.0000 77.235 92.853 14.715 74 100.00 100.00 33.333 78.859 93.502 23.266 75 100.00 100.00 66.667 84.419 95.726 52.553 76 0.0000 33.333 0.0000 4.2163 7.4316 2.0721 77 0.0000 33.333 33.333 5.8397 8.0809 10.623 78 33.333 66.667 66.667 26.125 34.246 43.756 79 0.0000 66.667 0.0000 15.232 29.460 5.7441 80 0.0000 66.667 33.333 16.856 30.110 14.295 81 33.333 66.667 33.333 20.565 32.022 14.469 82 66.667 66.667 33.333 33.268 38.572 15.064 83 0.0000 100.00 0.0000 36.405 71.801 12.802 84 0.0000 100.00 33.333 38.029 72.450 21.353 85 33.333 100.00 33.333 41.738 74.362 21.526 86 66.667 100.00 33.333 54.441 80.912 22.122 87 66.667 100.00 66.667 60.002 83.136 51.409 88 66.667 0.0000 33.333 19.036 10.112 10.320 89 66.667 0.0000 66.667 24.597 12.336 39.607 90 100.00 0.0000 66.667 49.014 24.925 40.751 91 100.00 33.333 66.667 52.230 31.357 41.823 92 66.667 33.333 33.333 22.253 16.543 11.392 93 66.667 33.333 66.667 27.813 18.767 40.679 94 0.0000 0.0000 33.333 2.6234 1.6493 9.5508 95 0.0000 33.333 66.667 11.400 10.305 39.910 96 33.333 33.333 66.667 15.109 12.217 40.084 97 0.0000 66.667 66.667 22.416 32.333 43.582 98 0.0000 100.00 66.667 43.589 74.674 50.640 99 33.333 100.00 66.667 47.298 76.586 50.813 100 33.333 0.0000 33.333 6.3325 3.5617 9.7246 101 33.333 0.0000 66.667 11.893 5.7855 39.012 102 33.333 0.0000 100.00 22.580 10.060 95.303 103 0.0000 0.0000 66.667 8.1838 3.8731 38.838 104 0.0000 0.0000 100.00 18.871 8.1473 95.129 105 0.0000 33.333 100.00 22.087 14.579 96.201 106 33.333 33.333 100.00 25.796 16.491 96.375 107 66.667 33.333 100.00 38.500 23.041 96.970 108 100.00 33.333 100.00 62.918 35.631 98.114 109 0.0000 66.667 100.00 33.103 36.608 99.873 110 33.333 66.667 100.00 36.812 38.520 100.05 111 66.667 66.667 100.00 49.516 45.070 100.64 112 66.667 100.00 100.00 70.689 87.410 107.70 113 0.0000 100.00 100.00 54.276 78.948 106.93 114 33.333 100.00 100.00 57.985 80.860 107.10 115 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DENSITY_EXTREME_VALUES "8" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 47.36070 100.0000 25.61297 21.62916 97.37627 2 100.0000 0.000000 79.35140 52.42580 26.28975 58.72153 3 0.000000 0.000000 58.99710 6.485834 3.193987 29.89445 4 100.0000 66.65930 0.000000 56.05879 50.50543 7.656144 5 0.000000 35.60110 0.000000 4.685619 8.370208 2.228550 6 84.44440 0.000000 0.000000 28.84279 15.35583 2.304665 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DEVICE_COMBINATION_VALUES "9" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 100.0000 100.0000 54.27632 78.94783 106.9308 2 100.0000 0.000000 100.0000 59.70128 29.19948 97.04219 3 0.000000 0.000000 100.0000 18.87111 8.147314 95.12896 4 100.0000 100.0000 0.000000 77.23538 92.85269 14.71507 5 0.000000 100.0000 0.000000 36.40521 71.80052 12.80184 6 100.0000 0.000000 0.000000 41.83017 22.05217 2.913230 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 8 50.00000 50.00000 50.00000 21.14266 22.19007 24.08306 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ti1/d3-e4-s5-g52-m5-b0-f0.ti10000644000076500000000000002364713154615407021436 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" CREATED "Thu Aug 31 12:05:52 2017" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB" WHITE_COLOR_PATCHES "4" BLACK_COLOR_PATCHES "4" SINGLE_DIM_STEPS "5" COMP_GREY_STEPS "52" MULTI_DIM_STEPS "5" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DENSITY_EXTREME_VALUES "8" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 47.36070 100.0000 25.61297 21.62916 97.37627 2 100.0000 0.000000 79.35140 52.42580 26.28975 58.72153 3 0.000000 0.000000 58.99710 6.485834 3.193987 29.89445 4 100.0000 66.65930 0.000000 56.05879 50.50543 7.656144 5 0.000000 35.60110 0.000000 4.685619 8.370208 2.228550 6 84.44440 0.000000 0.000000 28.84279 15.35583 2.304665 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DEVICE_COMBINATION_VALUES "9" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 100.0000 100.0000 54.27632 78.94783 106.9308 2 100.0000 0.000000 100.0000 59.70128 29.19948 97.04219 3 0.000000 0.000000 100.0000 18.87111 8.147314 95.12896 4 100.0000 100.0000 0.000000 77.23538 92.85269 14.71507 5 0.000000 100.0000 0.000000 36.40521 71.80052 12.80184 6 100.0000 0.000000 0.000000 41.83017 22.05217 2.913230 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 8 50.00000 50.00000 50.00000 21.14266 22.19007 24.08306 END_DATADisplayCAL-3.5.0.0/DisplayCAL/ti1/d3-e4-s9-g52-m9-b0-f0.ti10000644000076500000000000011313413154615407021435 0ustar devwheel00000000000000CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" CREATED "Thu Aug 31 12:31:37 2017" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB" WHITE_COLOR_PATCHES "4" BLACK_COLOR_PATCHES "4" SINGLE_DIM_STEPS "9" COMP_GREY_STEPS "52" MULTI_DIM_STEPS "9" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 778 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 87.500 100.00 100.00 84.443 94.502 108.34 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 12.500 0.0000 0.0000 1.5859 1.3021 1.0275 10 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 11 37.500 0.0000 0.0000 5.7370 3.4424 1.2220 12 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 13 62.500 0.0000 0.0000 15.230 8.3369 1.6668 14 75.000 0.0000 0.0000 22.335 12.000 1.9997 15 87.500 0.0000 0.0000 31.167 16.554 2.4136 16 100.00 0.0000 0.0000 41.830 22.052 2.9132 17 100.00 12.500 12.500 42.595 23.171 4.4333 18 100.00 12.500 25.000 43.247 23.432 7.8715 19 100.00 25.000 25.000 44.541 26.018 8.3026 20 100.00 37.500 25.000 46.847 30.630 9.0713 21 100.00 50.000 25.000 50.318 37.570 10.228 22 100.00 62.500 25.000 55.078 47.090 11.815 23 100.00 75.000 25.000 61.239 59.411 13.869 24 100.00 87.500 25.000 68.898 74.726 16.422 25 0.0000 0.0000 12.500 1.2564 1.1026 2.3507 26 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 27 0.0000 0.0000 37.500 3.0733 1.8292 11.920 28 0.0000 0.0000 50.000 4.8252 2.5298 21.147 29 0.0000 0.0000 62.500 7.2283 3.4909 33.805 30 0.0000 0.0000 75.000 10.338 4.7346 50.184 31 0.0000 0.0000 87.500 14.204 6.2808 70.547 32 0.0000 0.0000 100.00 18.871 8.1473 95.129 33 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 34 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 35 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 36 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 37 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 38 11.765 11.765 11.765 2.2218 2.2853 2.4001 39 13.726 13.726 13.726 2.5817 2.6639 2.8126 40 15.686 15.686 15.686 2.9968 3.1007 3.2883 41 17.647 17.647 17.647 3.4695 3.5979 3.8300 42 19.608 19.608 19.608 4.0016 4.1577 4.4398 43 21.569 21.569 21.569 4.5953 4.7822 5.1201 44 23.529 23.529 23.529 5.2523 5.4734 5.8731 45 25.490 25.490 25.490 5.9745 6.2332 6.7007 46 27.451 27.451 27.451 6.7637 7.0634 7.6050 47 29.412 29.412 29.412 7.6213 7.9656 8.5879 48 31.373 31.373 31.373 8.5492 8.9418 9.6512 49 33.333 33.333 33.333 9.5488 9.9933 10.797 50 35.294 35.294 35.294 10.622 11.122 12.026 51 39.216 39.216 39.216 12.993 13.616 14.743 52 41.176 41.176 41.176 14.294 14.985 16.234 53 43.137 43.137 43.137 15.674 16.437 17.816 54 45.098 45.098 45.098 17.134 17.973 19.489 55 47.059 47.059 47.059 18.675 19.594 21.255 56 49.020 49.020 49.020 20.299 21.303 23.117 57 50.980 50.980 50.980 22.007 23.100 25.074 58 52.941 52.941 52.941 23.800 24.986 27.129 59 54.902 54.902 54.902 25.679 26.963 29.282 60 56.863 56.863 56.863 27.646 29.032 31.536 61 58.824 58.824 58.824 29.701 31.194 33.891 62 60.784 60.784 60.784 31.846 33.450 36.349 63 62.745 62.745 62.745 34.081 35.802 38.911 64 64.706 64.706 64.706 36.409 38.250 41.578 65 66.667 66.667 66.667 38.829 40.796 44.351 66 68.627 68.627 68.627 41.343 43.440 47.232 67 70.588 70.588 70.588 43.951 46.185 50.221 68 72.549 72.549 72.549 46.656 49.030 53.321 69 74.510 74.510 74.510 49.457 51.977 56.531 70 76.471 76.471 76.471 52.356 55.027 59.853 71 78.431 78.431 78.431 55.354 58.180 63.289 72 80.392 80.392 80.392 58.452 61.439 66.838 73 82.353 82.353 82.353 61.650 64.803 70.503 74 84.314 84.314 84.314 64.949 68.275 74.285 75 86.275 86.275 86.275 68.351 71.854 78.183 76 88.235 88.235 88.235 71.857 75.541 82.200 77 90.196 90.196 90.196 75.466 79.338 86.337 78 92.157 92.157 92.157 79.181 83.246 90.594 79 94.118 94.118 94.118 83.001 87.265 94.972 80 96.078 96.078 96.078 86.929 91.397 99.472 81 98.039 98.039 98.039 90.963 95.641 104.10 82 12.500 12.500 0.0000 2.0940 2.3181 1.1968 83 25.000 12.500 0.0000 3.5853 3.0870 1.2667 84 37.500 12.500 0.0000 6.2450 4.4584 1.3913 85 50.000 12.500 0.0000 10.247 6.5220 1.5789 86 62.500 12.500 0.0000 15.738 9.3529 1.8361 87 75.000 12.500 0.0000 22.843 13.016 2.1691 88 87.500 12.500 0.0000 31.675 17.570 2.5829 89 100.00 12.500 0.0000 42.338 23.068 3.0826 90 100.00 25.000 0.0000 43.631 25.654 3.5137 91 25.000 25.000 0.0000 4.8786 5.6731 1.6978 92 37.500 25.000 0.0000 7.5382 7.0444 1.8224 93 50.000 25.000 0.0000 11.541 9.1081 2.0099 94 62.500 25.000 0.0000 17.031 11.939 2.2672 95 75.000 25.000 0.0000 24.136 15.602 2.6001 96 87.500 25.000 0.0000 32.968 20.156 3.0140 97 100.00 25.000 12.500 43.888 25.757 4.8644 98 12.500 37.500 0.0000 5.6935 9.5161 2.3967 99 25.000 37.500 0.0000 7.1849 10.285 2.4665 100 37.500 37.500 0.0000 9.8445 11.656 2.5912 101 50.000 37.500 0.0000 13.847 13.720 2.7787 102 62.500 37.500 0.0000 19.337 16.551 3.0360 103 75.000 37.500 0.0000 26.442 20.214 3.3689 104 87.500 37.500 0.0000 35.275 24.768 3.7828 105 100.00 37.500 0.0000 45.938 30.266 4.2824 106 12.500 50.000 0.0000 9.1641 16.456 3.5535 107 25.000 50.000 0.0000 10.655 17.225 3.6234 108 37.500 50.000 0.0000 13.315 18.597 3.7480 109 50.000 50.000 0.0000 17.318 20.660 3.9356 110 62.500 50.000 0.0000 22.808 23.491 4.1929 111 75.000 50.000 0.0000 29.913 27.154 4.5258 112 87.500 50.000 0.0000 38.745 31.709 4.9397 113 100.00 50.000 0.0000 49.408 37.206 5.4393 114 12.500 62.500 0.0000 13.925 25.977 5.1405 115 25.000 62.500 0.0000 15.416 26.746 5.2104 116 37.500 62.500 0.0000 18.076 28.117 5.3350 117 50.000 62.500 0.0000 22.078 30.181 5.5226 118 62.500 62.500 0.0000 27.569 33.012 5.7798 119 75.000 62.500 0.0000 34.674 36.675 6.1128 120 87.500 62.500 0.0000 43.506 41.229 6.5266 121 87.500 62.500 12.500 43.763 41.332 7.8774 122 12.500 75.000 0.0000 20.086 38.297 7.1942 123 25.000 75.000 0.0000 21.577 39.066 7.2641 124 37.500 75.000 0.0000 24.237 40.437 7.3887 125 50.000 75.000 0.0000 28.239 42.501 7.5762 126 62.500 75.000 0.0000 33.730 45.332 7.8335 127 75.000 75.000 0.0000 40.835 48.995 8.1664 128 87.500 75.000 0.0000 49.667 53.549 8.5803 129 87.500 75.000 12.500 49.924 53.652 9.9310 130 12.500 87.500 0.0000 27.745 53.613 9.7472 131 25.000 87.500 0.0000 29.236 54.382 9.8171 132 37.500 87.500 0.0000 31.896 55.753 9.9417 133 50.000 87.500 0.0000 35.898 57.817 10.129 134 62.500 87.500 0.0000 41.389 60.647 10.386 135 75.000 87.500 0.0000 48.494 64.311 10.719 136 87.500 87.500 0.0000 57.326 68.865 11.133 137 87.500 87.500 12.500 57.583 68.967 12.484 138 12.500 100.00 0.0000 36.991 72.103 12.829 139 25.000 100.00 0.0000 38.482 72.872 12.899 140 37.500 100.00 0.0000 41.142 74.243 13.024 141 50.000 100.00 0.0000 45.145 76.307 13.211 142 62.500 100.00 0.0000 50.635 79.137 13.469 143 75.000 100.00 0.0000 57.740 82.801 13.802 144 87.500 100.00 0.0000 66.572 87.355 14.215 145 87.500 100.00 12.500 66.829 87.457 15.566 146 87.500 100.00 25.000 67.482 87.718 19.004 147 25.000 0.0000 12.500 3.3337 2.1736 2.4481 148 37.500 0.0000 12.500 5.9934 3.5450 2.5727 149 50.000 0.0000 12.500 9.9958 5.6086 2.7602 150 62.500 0.0000 12.500 15.486 8.4395 3.0175 151 75.000 0.0000 12.500 22.591 12.103 3.3504 152 87.500 0.0000 12.500 31.424 16.657 3.7643 153 100.00 0.0000 12.500 42.087 22.155 4.2640 154 100.00 0.0000 25.000 42.739 22.416 7.7021 155 100.00 0.0000 37.500 43.904 22.881 13.834 156 25.000 12.500 12.500 3.8418 3.1896 2.6174 157 37.500 12.500 12.500 6.5015 4.5609 2.7421 158 50.000 12.500 12.500 10.504 6.6246 2.9296 159 62.500 12.500 12.500 15.994 9.4554 3.1869 160 75.000 12.500 12.500 23.099 13.119 3.5198 161 87.500 12.500 12.500 31.932 17.673 3.9337 162 100.00 12.500 37.500 44.412 23.897 14.003 163 12.500 25.000 0.0000 3.3872 4.9041 1.6279 164 12.500 25.000 12.500 3.6436 5.0067 2.9786 165 25.000 25.000 12.500 5.1350 5.7757 3.0485 166 37.500 25.000 12.500 7.7947 7.1470 3.1731 167 50.000 25.000 12.500 11.797 9.2106 3.3607 168 62.500 25.000 12.500 17.287 12.042 3.6179 169 75.000 25.000 12.500 24.392 15.705 3.9509 170 87.500 25.000 12.500 33.225 20.259 4.3647 171 87.500 25.000 25.000 33.878 20.520 7.8029 172 0.0000 37.500 12.500 5.3640 9.3166 3.7199 173 12.500 37.500 12.500 5.9499 9.6187 3.7474 174 25.000 37.500 12.500 7.4413 10.388 3.8173 175 37.500 37.500 12.500 10.101 11.759 3.9419 176 50.000 37.500 12.500 14.103 13.823 4.1295 177 62.500 37.500 12.500 19.594 16.653 4.3867 178 75.000 37.500 12.500 26.699 20.317 4.7196 179 87.500 37.500 12.500 35.531 24.871 5.1335 180 100.00 37.500 12.500 46.194 30.369 5.6332 181 0.0000 50.000 12.500 8.8346 16.257 4.8768 182 12.500 50.000 12.500 9.4205 16.559 4.9043 183 25.000 50.000 12.500 10.912 17.328 4.9742 184 37.500 50.000 12.500 13.572 18.699 5.0988 185 50.000 50.000 12.500 17.574 20.763 5.2863 186 62.500 50.000 12.500 23.064 23.594 5.5436 187 75.000 50.000 12.500 30.169 27.257 5.8765 188 87.500 50.000 12.500 39.002 31.811 6.2904 189 100.00 50.000 12.500 49.665 37.309 6.7900 190 0.0000 62.500 12.500 13.596 25.777 6.4638 191 12.500 62.500 12.500 14.181 26.079 6.4913 192 25.000 62.500 12.500 15.673 26.848 6.5611 193 37.500 62.500 12.500 18.332 28.220 6.6858 194 50.000 62.500 12.500 22.335 30.283 6.8733 195 62.500 62.500 12.500 27.825 33.114 7.1306 196 75.000 62.500 12.500 34.930 36.777 7.4635 197 100.00 62.500 0.0000 54.169 46.727 7.0263 198 100.00 62.500 12.500 54.426 46.829 8.3770 199 0.0000 75.000 12.500 19.756 38.097 8.5175 200 12.500 75.000 12.500 20.342 38.399 8.5449 201 25.000 75.000 12.500 21.834 39.168 8.6148 202 37.500 75.000 12.500 24.493 40.540 8.7394 203 50.000 75.000 12.500 28.496 42.603 8.9270 204 62.500 75.000 12.500 33.986 45.434 9.1842 205 75.000 75.000 12.500 41.091 49.098 9.5172 206 100.00 75.000 0.0000 60.330 59.047 9.0799 207 100.00 75.000 12.500 60.587 59.150 10.431 208 0.0000 87.500 12.500 27.415 53.413 11.070 209 12.500 87.500 12.500 28.001 53.715 11.098 210 25.000 87.500 12.500 29.493 54.484 11.168 211 37.500 87.500 12.500 32.152 55.856 11.292 212 50.000 87.500 12.500 36.155 57.919 11.480 213 62.500 87.500 12.500 41.645 60.750 11.737 214 75.000 87.500 12.500 48.750 64.413 12.070 215 100.00 87.500 0.0000 67.989 74.363 11.633 216 100.00 87.500 12.500 68.246 74.465 12.984 217 0.0000 100.00 12.500 36.662 71.903 14.153 218 12.500 100.00 12.500 37.248 72.205 14.180 219 25.000 100.00 12.500 38.739 72.974 14.250 220 37.500 100.00 12.500 41.399 74.345 14.375 221 50.000 100.00 12.500 45.401 76.409 14.562 222 62.500 100.00 12.500 50.891 79.240 14.819 223 75.000 100.00 12.500 57.996 82.903 15.152 224 100.00 100.00 0.0000 77.235 92.853 14.715 225 100.00 100.00 12.500 77.492 92.955 16.066 226 100.00 100.00 25.000 78.145 93.216 19.504 227 25.000 0.0000 25.000 3.9865 2.4347 5.8863 228 37.500 0.0000 25.000 6.6462 3.8060 6.0109 229 50.000 0.0000 25.000 10.649 5.8697 6.1984 230 62.500 0.0000 25.000 16.139 8.7005 6.4557 231 75.000 0.0000 25.000 23.244 12.364 6.7886 232 87.500 0.0000 25.000 32.076 16.918 7.2025 233 87.500 12.500 25.000 32.584 17.934 7.3718 234 12.500 12.500 25.000 3.0032 2.6817 5.9857 235 25.000 12.500 25.000 4.4946 3.4507 6.0556 236 37.500 12.500 25.000 7.1542 4.8220 6.1802 237 50.000 12.500 25.000 11.157 6.8856 6.3678 238 62.500 12.500 25.000 16.647 9.7165 6.6250 239 75.000 12.500 25.000 23.752 13.380 6.9580 240 75.000 25.000 25.000 25.045 15.966 7.3890 241 0.0000 25.000 12.500 3.0577 4.7046 2.9512 242 0.0000 25.000 25.000 3.7105 4.9657 6.3893 243 12.500 25.000 25.000 4.2964 5.2678 6.4168 244 37.500 25.000 25.000 8.4474 7.4081 6.6113 245 50.000 25.000 25.000 12.450 9.4717 6.7989 246 62.500 25.000 25.000 17.940 12.303 7.0561 247 0.0000 12.500 0.0000 1.5081 2.0160 1.1694 248 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 249 0.0000 37.500 0.0000 5.1076 9.2140 2.3692 250 0.0000 37.500 25.000 6.0168 9.5776 7.1581 251 12.500 37.500 25.000 6.6027 9.8797 7.1856 252 25.000 37.500 25.000 8.0941 10.649 7.2555 253 37.500 37.500 25.000 10.754 12.020 7.3801 254 50.000 37.500 25.000 14.756 14.084 7.5676 255 62.500 37.500 25.000 20.247 16.915 7.8249 256 75.000 37.500 25.000 27.351 20.578 8.1578 257 87.500 37.500 25.000 36.184 25.132 8.5717 258 0.0000 50.000 0.0000 8.5782 16.154 3.5261 259 0.0000 50.000 25.000 9.4874 16.518 8.3150 260 12.500 50.000 25.000 10.073 16.820 8.3424 261 25.000 50.000 25.000 11.565 17.589 8.4123 262 37.500 50.000 25.000 14.224 18.960 8.5370 263 50.000 50.000 25.000 18.227 21.024 8.7245 264 62.500 50.000 25.000 23.717 23.855 8.9818 265 75.000 50.000 25.000 30.822 27.518 9.3147 266 87.500 50.000 25.000 39.655 32.072 9.7286 267 0.0000 62.500 0.0000 13.339 25.675 5.1131 268 0.0000 62.500 25.000 14.248 26.038 9.9020 269 12.500 62.500 25.000 14.834 26.340 9.9294 270 25.000 62.500 25.000 16.326 27.109 9.9993 271 37.500 62.500 25.000 18.985 28.481 10.124 272 50.000 62.500 25.000 22.988 30.544 10.311 273 62.500 62.500 25.000 28.478 33.375 10.569 274 75.000 62.500 25.000 35.583 37.039 10.902 275 87.500 62.500 25.000 44.415 41.593 11.316 276 0.0000 75.000 0.0000 19.500 37.995 7.1667 277 0.0000 75.000 25.000 20.409 38.358 11.956 278 12.500 75.000 25.000 20.995 38.661 11.983 279 25.000 75.000 25.000 22.486 39.429 12.053 280 37.500 75.000 25.000 25.146 40.801 12.178 281 50.000 75.000 25.000 29.149 42.864 12.365 282 62.500 75.000 25.000 34.639 45.695 12.622 283 75.000 75.000 25.000 41.744 49.359 12.955 284 87.500 75.000 25.000 50.576 53.913 13.369 285 0.0000 87.500 0.0000 27.159 53.311 9.7197 286 0.0000 87.500 25.000 28.068 53.674 14.509 287 12.500 87.500 25.000 28.654 53.976 14.536 288 25.000 87.500 25.000 30.145 54.745 14.606 289 37.500 87.500 25.000 32.805 56.117 14.731 290 50.000 87.500 25.000 36.807 58.180 14.918 291 62.500 87.500 25.000 42.298 61.011 15.175 292 75.000 87.500 25.000 49.403 64.674 15.508 293 87.500 87.500 25.000 58.235 69.228 15.922 294 0.0000 100.00 0.0000 36.405 71.801 12.802 295 0.0000 100.00 25.000 37.314 72.164 17.591 296 12.500 100.00 25.000 37.900 72.466 17.618 297 25.000 100.00 25.000 39.392 73.235 17.688 298 37.500 100.00 25.000 42.051 74.607 17.813 299 50.000 100.00 25.000 46.054 76.670 18.000 300 62.500 100.00 25.000 51.544 79.501 18.258 301 75.000 100.00 25.000 58.649 83.164 18.590 302 12.500 0.0000 12.500 1.8424 1.4047 2.3782 303 12.500 0.0000 25.000 2.4951 1.6657 5.8164 304 12.500 0.0000 37.500 3.6592 2.1313 11.948 305 25.000 0.0000 37.500 5.1506 2.9003 12.018 306 37.500 0.0000 37.500 7.8103 4.2716 12.142 307 50.000 0.0000 37.500 11.813 6.3352 12.330 308 62.500 0.0000 37.500 17.303 9.1661 12.587 309 75.000 0.0000 37.500 24.408 12.829 12.920 310 87.500 0.0000 37.500 33.240 17.383 13.334 311 87.500 12.500 37.500 33.749 18.399 13.503 312 0.0000 12.500 37.500 3.5814 2.8452 12.090 313 12.500 12.500 37.500 4.1673 3.1473 12.117 314 25.000 12.500 37.500 5.6587 3.9162 12.187 315 37.500 12.500 37.500 8.3184 5.2876 12.312 316 50.000 12.500 37.500 12.321 7.3512 12.499 317 62.500 12.500 37.500 17.811 10.182 12.757 318 75.000 12.500 37.500 24.916 13.845 13.090 319 0.0000 12.500 12.500 1.7645 2.1185 2.5201 320 0.0000 12.500 25.000 2.4173 2.3796 5.9583 321 0.0000 25.000 37.500 4.8746 5.4313 12.521 322 12.500 25.000 37.500 5.4605 5.7334 12.548 323 25.000 25.000 37.500 6.9519 6.5023 12.618 324 37.500 25.000 37.500 9.6116 7.8736 12.743 325 50.000 25.000 37.500 13.614 9.9373 12.930 326 62.500 25.000 37.500 19.104 12.768 13.188 327 75.000 25.000 37.500 26.209 16.431 13.521 328 87.500 25.000 37.500 35.042 20.986 13.934 329 100.00 25.000 37.500 45.705 26.483 14.434 330 0.0000 37.500 37.500 7.1809 10.043 13.290 331 12.500 37.500 37.500 7.7668 10.345 13.317 332 25.000 37.500 37.500 9.2582 11.114 13.387 333 37.255 37.255 37.255 11.769 12.329 13.341 334 50.000 37.500 37.500 15.920 14.549 13.699 335 62.500 37.500 37.500 21.411 17.380 13.956 336 75.000 37.500 37.500 28.516 21.043 14.289 337 87.500 37.500 37.500 37.348 25.597 14.703 338 100.00 37.500 37.500 48.011 31.095 15.203 339 0.0000 50.000 37.500 10.652 16.983 14.447 340 12.500 50.000 37.500 11.237 17.286 14.474 341 25.000 50.000 37.500 12.729 18.054 14.544 342 37.500 50.000 37.500 15.388 19.426 14.669 343 50.000 50.000 37.500 19.391 21.489 14.856 344 62.500 50.000 37.500 24.881 24.320 15.113 345 75.000 50.000 37.500 31.986 27.984 15.446 346 87.500 50.000 37.500 40.819 32.538 15.860 347 100.00 50.000 37.500 51.482 38.036 16.360 348 0.0000 62.500 37.500 15.412 26.504 16.034 349 12.500 62.500 37.500 15.998 26.806 16.061 350 25.000 62.500 37.500 17.490 27.575 16.131 351 37.500 62.500 37.500 20.149 28.946 16.256 352 50.000 62.500 37.500 24.152 31.010 16.443 353 62.500 62.500 37.500 29.642 33.841 16.700 354 75.000 62.500 37.500 36.747 37.504 17.033 355 87.500 62.500 37.500 45.580 42.058 17.447 356 100.00 62.500 37.500 56.243 47.556 17.947 357 0.0000 75.000 37.500 21.573 38.824 18.087 358 12.500 75.000 37.500 22.159 39.126 18.115 359 25.000 75.000 37.500 23.651 39.895 18.185 360 37.500 75.000 37.500 26.310 41.266 18.309 361 50.000 75.000 37.500 30.313 43.330 18.497 362 62.500 75.000 37.500 35.803 46.161 18.754 363 75.000 75.000 37.500 42.908 49.824 19.087 364 87.500 75.000 37.500 51.740 54.378 19.501 365 100.00 75.000 37.500 62.403 59.876 20.000 366 0.0000 87.500 37.500 29.232 54.140 20.640 367 12.500 87.500 37.500 29.818 54.442 20.668 368 25.000 87.500 37.500 31.310 55.211 20.738 369 37.500 87.500 37.500 33.969 56.582 20.862 370 50.000 87.500 37.500 37.972 58.646 21.050 371 62.500 87.500 37.500 43.462 61.477 21.307 372 75.000 87.500 37.500 50.567 65.140 21.640 373 87.500 87.500 37.500 59.399 69.694 22.054 374 100.00 87.500 37.500 70.062 75.192 22.553 375 0.0000 100.00 37.500 38.479 72.630 23.722 376 12.500 100.00 37.500 39.064 72.932 23.750 377 25.000 100.00 37.500 40.556 73.701 23.820 378 37.500 100.00 37.500 43.215 75.072 23.944 379 50.000 100.00 37.500 47.218 77.136 24.132 380 62.500 100.00 37.500 52.708 79.967 24.389 381 75.000 100.00 37.500 59.813 83.630 24.722 382 87.500 100.00 37.500 68.646 88.184 25.136 383 100.00 100.00 37.500 79.309 93.682 25.636 384 12.500 0.0000 50.000 5.4111 2.8319 21.175 385 25.000 0.0000 50.000 6.9024 3.6009 21.245 386 37.500 0.0000 50.000 9.5621 4.9722 21.369 387 50.000 0.0000 50.000 13.564 7.0358 21.557 388 62.500 0.0000 50.000 19.055 9.8667 21.814 389 75.000 0.0000 50.000 26.160 13.530 22.147 390 87.500 0.0000 50.000 34.992 18.084 22.561 391 100.00 0.0000 50.000 45.655 23.582 23.061 392 100.00 12.500 50.000 46.163 24.598 23.230 393 100.00 12.500 62.500 48.566 25.559 35.887 394 25.000 12.500 50.000 7.4105 4.6169 21.414 395 37.500 12.500 50.000 10.070 5.9882 21.539 396 50.000 12.500 50.000 14.073 8.0518 21.726 397 62.500 12.500 50.000 19.563 10.883 21.984 398 75.000 12.500 50.000 26.668 14.546 22.317 399 87.500 12.500 50.000 35.500 19.100 22.730 400 87.500 12.500 62.500 37.903 20.061 35.388 401 87.500 25.000 62.500 39.197 22.647 35.819 402 12.500 25.000 50.000 7.2123 6.4340 21.775 403 25.000 25.000 50.000 8.7037 7.2029 21.845 404 37.500 25.000 50.000 11.363 8.5743 21.970 405 50.000 25.000 50.000 15.366 10.638 22.157 406 62.500 25.000 50.000 20.856 13.469 22.415 407 75.000 25.000 50.000 27.961 17.132 22.748 408 87.500 25.000 50.000 36.794 21.686 23.161 409 100.00 25.000 50.000 47.457 27.184 23.661 410 100.00 25.000 62.500 49.860 28.145 36.319 411 12.500 37.500 50.000 9.5186 11.046 22.544 412 25.000 37.500 50.000 11.010 11.815 22.614 413 37.500 37.500 50.000 13.670 13.186 22.739 414 50.000 37.500 50.000 17.672 15.250 22.926 415 62.500 37.500 50.000 23.162 18.081 23.183 416 75.000 37.500 50.000 30.267 21.744 23.516 417 87.500 37.500 50.000 39.100 26.298 23.930 418 100.00 37.500 50.000 49.763 31.796 24.430 419 0.0000 50.000 50.000 12.403 17.684 23.674 420 12.500 50.000 50.000 12.989 17.986 23.701 421 25.000 50.000 50.000 14.481 18.755 23.771 422 37.500 50.000 50.000 17.140 20.126 23.896 423 62.500 50.000 50.000 26.633 25.021 24.340 424 75.000 50.000 50.000 33.738 28.684 24.673 425 87.500 50.000 50.000 42.570 33.238 25.087 426 100.00 50.000 50.000 53.233 38.736 25.587 427 0.0000 62.500 50.000 17.164 27.205 25.261 428 12.500 62.500 50.000 17.750 27.507 25.288 429 25.000 62.500 50.000 19.242 28.276 25.358 430 37.500 62.500 50.000 21.901 29.647 25.483 431 50.000 62.500 50.000 25.904 31.711 25.670 432 62.500 62.500 50.000 31.394 34.541 25.927 433 75.000 62.500 50.000 38.499 38.205 26.260 434 87.500 62.500 50.000 47.331 42.759 26.674 435 100.00 62.500 50.000 57.994 48.257 27.174 436 0.0000 75.000 50.000 23.325 39.525 27.314 437 12.500 75.000 50.000 23.911 39.827 27.342 438 25.000 75.000 50.000 25.402 40.596 27.412 439 37.500 75.000 50.000 28.062 41.967 27.536 440 50.000 75.000 50.000 32.064 44.031 27.724 441 62.500 75.000 50.000 37.555 46.862 27.981 442 75.000 75.000 50.000 44.660 50.525 28.314 443 87.500 75.000 50.000 53.492 55.079 28.728 444 100.00 75.000 50.000 64.155 60.577 29.227 445 0.0000 87.500 50.000 30.984 54.840 29.867 446 12.500 87.500 50.000 31.570 55.142 29.895 447 25.000 87.500 50.000 33.061 55.911 29.965 448 37.500 87.500 50.000 35.721 57.283 30.089 449 50.000 87.500 50.000 39.723 59.346 30.277 450 62.500 87.500 50.000 45.214 62.177 30.534 451 75.000 87.500 50.000 52.319 65.841 30.867 452 87.500 87.500 50.000 61.151 70.395 31.281 453 100.00 87.500 50.000 71.814 75.893 31.780 454 0.0000 100.00 50.000 40.230 73.330 32.949 455 12.500 100.00 50.000 40.816 73.632 32.977 456 25.000 100.00 50.000 42.308 74.401 33.047 457 37.500 100.00 50.000 44.967 75.773 33.171 458 50.000 100.00 50.000 48.970 77.836 33.359 459 62.500 100.00 50.000 54.460 80.667 33.616 460 75.000 100.00 50.000 61.565 84.331 33.949 461 87.500 100.00 50.000 70.398 88.885 34.363 462 100.00 100.00 50.000 81.061 94.383 34.863 463 100.00 100.00 62.500 83.464 95.344 47.520 464 25.000 0.0000 62.500 9.3055 4.5620 33.902 465 37.500 0.0000 62.500 11.965 5.9333 34.027 466 50.000 0.0000 62.500 15.968 7.9969 34.214 467 62.500 0.0000 62.500 21.458 10.828 34.472 468 75.000 0.0000 62.500 28.563 14.491 34.805 469 87.500 0.0000 62.500 37.395 19.045 35.218 470 100.00 0.0000 62.500 48.058 24.543 35.718 471 12.500 12.500 50.000 5.9191 3.8479 21.344 472 12.500 12.500 62.500 8.3222 4.8090 34.002 473 25.000 12.500 62.500 9.8136 5.5779 34.072 474 37.500 12.500 62.500 12.473 6.9493 34.196 475 50.000 12.500 62.500 16.476 9.0129 34.384 476 62.500 12.500 62.500 21.966 11.844 34.641 477 75.000 12.500 62.500 29.071 15.507 34.974 478 75.000 25.000 62.500 30.364 18.093 35.405 479 0.0000 25.000 50.000 6.6264 6.1319 21.748 480 0.0000 25.000 62.500 9.0295 7.0930 34.405 481 12.500 25.000 62.500 9.6154 7.3951 34.433 482 25.000 25.000 62.500 11.107 8.1640 34.503 483 37.500 25.000 62.500 13.767 9.5354 34.627 484 50.000 25.000 62.500 17.769 11.599 34.815 485 62.500 25.000 62.500 23.259 14.430 35.072 486 62.500 25.000 75.000 26.369 15.674 51.452 487 75.000 25.000 75.000 33.474 19.337 51.785 488 0.0000 37.500 50.000 8.9327 10.744 22.517 489 0.0000 37.500 62.500 11.336 11.705 35.174 490 12.500 37.500 62.500 11.922 12.007 35.202 491 25.000 37.500 62.500 13.413 12.776 35.271 492 37.500 37.500 62.500 16.073 14.147 35.396 493 50.000 37.500 62.500 20.075 16.211 35.584 494 62.500 37.500 62.500 25.566 19.042 35.841 495 75.000 37.500 62.500 32.670 22.705 36.174 496 87.500 37.500 62.500 41.503 27.259 36.588 497 100.00 37.500 62.500 52.166 32.757 37.087 498 0.0000 50.000 62.500 14.806 18.645 36.331 499 12.500 50.000 62.500 15.392 18.947 36.358 500 25.000 50.000 62.500 16.884 19.716 36.428 501 37.500 50.000 62.500 19.543 21.088 36.553 502 50.000 50.000 62.500 23.546 23.151 36.740 503 62.500 50.000 62.500 29.036 25.982 36.998 504 75.000 50.000 62.500 36.141 29.645 37.331 505 87.500 50.000 62.500 44.974 34.199 37.745 506 100.00 50.000 62.500 55.637 39.697 38.244 507 0.0000 62.500 62.500 19.567 28.166 37.918 508 12.500 62.500 62.500 20.153 28.468 37.945 509 25.000 62.500 62.500 21.645 29.237 38.015 510 37.500 62.500 62.500 24.304 30.608 38.140 511 50.000 62.500 62.500 28.307 32.672 38.327 512 75.000 62.500 62.500 40.902 39.166 38.918 513 87.500 62.500 62.500 49.734 43.720 39.332 514 100.00 62.500 62.500 60.398 49.218 39.831 515 0.0000 75.000 62.500 25.728 40.486 39.972 516 12.500 75.000 62.500 26.314 40.788 39.999 517 25.000 75.000 62.500 27.806 41.557 40.069 518 37.500 75.000 62.500 30.465 42.928 40.194 519 50.000 75.000 62.500 34.468 44.992 40.381 520 62.500 75.000 62.500 39.958 47.823 40.638 521 75.000 75.000 62.500 47.063 51.486 40.971 522 87.500 75.000 62.500 55.895 56.040 41.385 523 100.00 75.000 62.500 66.558 61.538 41.885 524 0.0000 87.500 62.500 33.387 55.801 42.525 525 12.500 87.500 62.500 33.973 56.104 42.552 526 25.000 87.500 62.500 35.464 56.873 42.622 527 37.500 87.500 62.500 38.124 58.244 42.747 528 50.000 87.500 62.500 42.127 60.308 42.934 529 62.500 87.500 62.500 47.617 63.138 43.191 530 75.000 87.500 62.500 54.722 66.802 43.524 531 87.500 87.500 62.500 63.554 71.356 43.938 532 100.00 87.500 62.500 74.217 76.854 44.438 533 0.0000 100.00 62.500 42.633 74.291 45.607 534 12.500 100.00 62.500 43.219 74.594 45.634 535 25.000 100.00 62.500 44.711 75.362 45.704 536 37.500 100.00 62.500 47.370 76.734 45.829 537 50.000 100.00 62.500 51.373 78.797 46.016 538 62.500 100.00 62.500 56.863 81.628 46.274 539 75.000 100.00 62.500 63.968 85.292 46.606 540 87.500 100.00 62.500 72.801 89.846 47.020 541 12.500 0.0000 62.500 7.8142 3.7930 33.832 542 12.500 0.0000 75.000 10.924 5.0367 50.212 543 25.000 0.0000 75.000 12.415 5.8057 50.282 544 37.500 0.0000 75.000 15.075 7.1770 50.406 545 50.000 0.0000 75.000 19.077 9.2407 50.594 546 62.500 0.0000 75.000 24.568 12.072 50.851 547 75.000 0.0000 75.000 31.673 15.735 51.184 548 87.500 0.0000 75.000 40.505 20.289 51.598 549 87.500 12.500 75.000 41.013 21.305 51.767 550 87.500 25.000 75.000 42.306 23.891 52.198 551 87.500 25.000 87.500 46.172 25.437 72.561 552 25.000 12.500 75.000 12.923 6.8217 50.451 553 37.500 12.500 75.000 15.583 8.1930 50.576 554 50.000 12.500 75.000 19.585 10.257 50.763 555 62.500 12.500 75.000 25.076 13.088 51.021 556 75.000 12.500 75.000 32.181 16.751 51.353 557 100.00 0.0000 75.000 51.168 25.787 52.098 558 100.00 12.500 75.000 51.676 26.803 52.267 559 100.00 25.000 75.000 52.969 29.389 52.698 560 12.500 25.000 75.000 12.725 8.6388 50.812 561 25.000 25.000 75.000 14.217 9.4077 50.882 562 37.500 25.000 75.000 16.876 10.779 51.007 563 50.000 25.000 75.000 20.879 12.843 51.194 564 0.0000 12.500 50.000 5.3332 3.5458 21.317 565 0.0000 12.500 62.500 7.7363 4.5069 33.974 566 0.0000 12.500 75.000 10.846 5.7506 50.354 567 0.0000 25.000 75.000 12.139 8.3367 50.785 568 0.0000 37.500 75.000 14.446 12.949 51.554 569 12.500 37.500 75.000 15.032 13.251 51.581 570 25.000 37.500 75.000 16.523 14.020 51.651 571 37.500 37.500 75.000 19.183 15.391 51.776 572 50.000 37.500 75.000 23.185 17.455 51.963 573 62.500 37.500 75.000 28.675 20.286 52.220 574 75.000 37.500 75.000 35.780 23.949 52.553 575 87.500 37.500 75.000 44.613 28.503 52.967 576 100.00 37.500 75.000 55.276 34.001 53.467 577 0.0000 50.000 75.000 17.916 19.889 52.710 578 12.500 50.000 75.000 18.502 20.191 52.738 579 25.000 50.000 75.000 19.993 20.960 52.808 580 37.500 50.000 75.000 22.653 22.331 52.932 581 50.000 50.000 75.000 26.656 24.395 53.120 582 62.500 50.000 75.000 32.146 27.226 53.377 583 75.000 50.000 75.000 39.251 30.889 53.710 584 87.500 50.000 75.000 48.083 35.443 54.124 585 100.00 50.000 75.000 58.746 40.941 54.624 586 0.0000 62.500 75.000 22.677 29.409 54.297 587 12.500 62.500 75.000 23.263 29.711 54.325 588 25.000 62.500 75.000 24.754 30.480 54.395 589 37.500 62.500 75.000 27.414 31.852 54.519 590 50.000 62.500 75.000 31.416 33.915 54.707 591 62.500 62.500 75.000 36.907 36.746 54.964 592 75.000 62.500 75.000 44.012 40.410 55.297 593 87.500 62.500 75.000 52.844 44.964 55.711 594 100.00 62.500 75.000 63.507 50.462 56.211 595 0.0000 75.000 75.000 28.838 41.729 56.351 596 12.500 75.000 75.000 29.424 42.032 56.379 597 25.000 75.000 75.000 30.915 42.800 56.448 598 37.500 75.000 75.000 33.575 44.172 56.573 599 50.000 75.000 75.000 37.577 46.235 56.761 600 62.500 75.000 75.000 43.068 49.066 57.018 601 87.500 75.000 75.000 59.005 57.284 57.765 602 100.00 75.000 75.000 69.668 62.782 58.264 603 0.0000 87.500 75.000 36.497 57.045 58.904 604 12.500 87.500 75.000 37.083 57.347 58.932 605 25.000 87.500 75.000 38.574 58.116 59.001 606 37.500 87.500 75.000 41.234 59.488 59.126 607 50.000 87.500 75.000 45.236 61.551 59.314 608 62.500 87.500 75.000 50.727 64.382 59.571 609 75.000 87.500 75.000 57.832 68.045 59.904 610 87.500 87.500 75.000 66.664 72.600 60.318 611 100.00 87.500 75.000 77.327 78.097 60.817 612 0.0000 100.00 75.000 45.743 75.535 61.986 613 12.500 100.00 75.000 46.329 75.837 62.014 614 25.000 100.00 75.000 47.821 76.606 62.084 615 37.500 100.00 75.000 50.480 77.978 62.208 616 50.000 100.00 75.000 54.483 80.041 62.396 617 62.500 100.00 75.000 59.973 82.872 62.653 618 75.000 100.00 75.000 67.078 86.535 62.986 619 87.500 100.00 75.000 75.910 91.089 63.400 620 100.00 100.00 75.000 86.573 96.587 63.899 621 100.00 100.00 87.500 90.439 98.133 84.262 622 25.000 0.0000 87.500 16.281 7.3518 70.644 623 37.500 0.0000 87.500 18.941 8.7231 70.769 624 50.000 0.0000 87.500 22.943 10.787 70.956 625 62.500 0.0000 87.500 28.434 13.618 71.213 626 75.000 0.0000 87.500 35.539 17.281 71.546 627 87.500 0.0000 87.500 44.371 21.835 71.960 628 87.500 12.500 87.500 44.879 22.851 72.130 629 12.500 12.500 75.000 11.432 6.0527 50.381 630 12.500 12.500 87.500 15.298 7.5988 70.743 631 25.000 12.500 87.500 16.789 8.3678 70.813 632 37.500 12.500 87.500 19.449 9.7391 70.938 633 50.000 12.500 87.500 23.451 11.803 71.126 634 62.500 12.500 87.500 28.942 14.634 71.383 635 75.000 12.500 87.500 36.047 18.297 71.716 636 100.00 0.0000 87.500 55.034 27.333 72.460 637 100.00 12.500 87.500 55.542 28.349 72.629 638 100.00 25.000 87.500 56.835 30.935 73.060 639 12.500 25.000 87.500 16.591 10.185 71.175 640 25.000 25.000 87.500 18.083 10.954 71.244 641 37.500 25.000 87.500 20.742 12.325 71.369 642 50.000 25.000 87.500 24.745 14.389 71.557 643 62.500 25.000 87.500 30.235 17.220 71.814 644 75.000 25.000 87.500 37.340 20.883 72.147 645 75.000 25.000 100.00 42.007 22.750 96.729 646 0.0000 25.000 87.500 16.005 9.8828 71.147 647 0.0000 37.500 87.500 18.312 14.495 71.916 648 12.500 37.500 87.500 18.897 14.797 71.943 649 25.000 37.500 87.500 20.389 15.566 72.013 650 37.500 37.500 87.500 23.049 16.937 72.138 651 50.000 37.500 87.500 27.051 19.001 72.325 652 62.500 37.500 87.500 32.541 21.832 72.583 653 75.000 37.500 87.500 39.646 25.495 72.916 654 87.500 37.500 87.500 48.479 30.049 73.329 655 100.00 37.500 87.500 59.142 35.547 73.829 656 0.0000 50.000 87.500 21.782 21.435 73.073 657 12.500 50.000 87.500 22.368 21.737 73.100 658 25.000 50.000 87.500 23.859 22.506 73.170 659 37.500 50.000 87.500 26.519 23.877 73.295 660 50.000 50.000 87.500 30.521 25.941 73.482 661 62.500 50.000 87.500 36.012 28.772 73.740 662 75.000 50.000 87.500 43.117 32.435 74.072 663 87.500 50.000 87.500 51.949 36.989 74.486 664 100.00 50.000 87.500 62.612 42.487 74.986 665 0.0000 62.500 87.500 26.543 30.955 74.660 666 12.500 62.500 87.500 27.129 31.258 74.687 667 25.000 62.500 87.500 28.620 32.027 74.757 668 37.500 62.500 87.500 31.280 33.398 74.882 669 50.000 62.500 87.500 35.282 35.461 75.069 670 62.500 62.500 87.500 40.773 38.292 75.327 671 75.000 62.500 87.500 47.878 41.956 75.659 672 87.500 62.500 87.500 56.710 46.510 76.073 673 100.00 62.500 87.500 67.373 52.008 76.573 674 0.0000 75.000 87.500 32.704 43.276 76.713 675 12.500 75.000 87.500 33.290 43.578 76.741 676 25.000 75.000 87.500 34.781 44.347 76.811 677 37.500 75.000 87.500 37.441 45.718 76.935 678 50.000 75.000 87.500 41.443 47.782 77.123 679 62.500 75.000 87.500 46.934 50.612 77.380 680 75.000 75.000 87.500 54.039 54.276 77.713 681 87.500 75.000 87.500 62.871 58.830 78.127 682 100.00 75.000 87.500 73.534 64.328 78.627 683 0.0000 87.500 87.500 40.363 58.591 79.266 684 12.500 87.500 87.500 40.949 58.893 79.294 685 25.000 87.500 87.500 42.440 59.662 79.364 686 37.500 87.500 87.500 45.100 61.034 79.488 687 50.000 87.500 87.500 49.102 63.097 79.676 688 62.500 87.500 87.500 54.593 65.928 79.933 689 75.000 87.500 87.500 61.698 69.592 80.266 690 100.00 87.500 87.500 81.193 79.644 81.180 691 0.0000 100.00 87.500 49.609 77.081 82.349 692 12.500 100.00 87.500 50.195 77.383 82.376 693 25.000 100.00 87.500 51.686 78.152 82.446 694 37.500 100.00 87.500 54.346 79.524 82.570 695 50.000 100.00 87.500 58.349 81.587 82.758 696 62.500 100.00 87.500 63.839 84.418 83.015 697 75.000 100.00 87.500 70.944 88.081 83.348 698 87.500 100.00 87.500 79.776 92.636 83.762 699 12.500 0.0000 87.500 14.790 6.5829 70.574 700 12.500 0.0000 100.00 19.457 8.4494 95.156 701 25.000 0.0000 100.00 20.948 9.2184 95.226 702 37.500 0.0000 100.00 23.608 10.590 95.351 703 50.000 0.0000 100.00 27.610 12.653 95.538 704 62.500 0.0000 100.00 33.101 15.484 95.796 705 75.000 0.0000 100.00 40.206 19.148 96.129 706 87.500 0.0000 100.00 49.038 23.702 96.543 707 87.500 12.500 100.00 49.546 24.718 96.712 708 87.500 25.000 100.00 50.840 27.304 97.143 709 12.500 12.500 100.00 19.965 9.4654 95.326 710 25.000 12.500 100.00 21.456 10.234 95.396 711 37.500 12.500 100.00 24.116 11.606 95.520 712 50.000 12.500 100.00 28.119 13.669 95.708 713 62.500 12.500 100.00 33.609 16.500 95.965 714 75.000 12.500 100.00 40.714 20.163 96.298 715 100.00 0.0000 100.00 59.701 29.199 97.042 716 100.00 12.500 100.00 60.209 30.215 97.212 717 100.00 25.000 100.00 61.503 32.802 97.643 718 12.500 25.000 100.00 21.258 12.051 95.757 719 25.000 25.000 100.00 22.750 12.820 95.827 720 37.500 25.000 100.00 25.409 14.192 95.951 721 50.000 25.000 100.00 29.412 16.255 96.139 722 62.500 25.000 100.00 34.902 19.086 96.396 723 0.0000 12.500 87.500 14.712 7.2967 70.716 724 0.0000 12.500 100.00 19.379 9.1633 95.298 725 0.0000 25.000 100.00 20.672 11.749 95.729 726 0.0000 37.500 100.00 22.979 16.361 96.498 727 12.500 37.500 100.00 23.565 16.663 96.526 728 25.000 37.500 100.00 25.056 17.432 96.596 729 37.500 37.500 100.00 27.716 18.804 96.720 730 50.000 37.500 100.00 31.718 20.867 96.908 731 62.500 37.500 100.00 37.208 23.698 97.165 732 75.000 37.500 100.00 44.313 27.362 97.498 733 87.500 37.500 100.00 53.146 31.916 97.912 734 100.00 37.500 100.00 63.809 37.413 98.411 735 0.0000 50.000 100.00 26.449 23.302 97.655 736 12.500 50.000 100.00 27.035 23.604 97.682 737 25.000 50.000 100.00 28.527 24.373 97.752 738 37.500 50.000 100.00 31.186 25.744 97.877 739 50.000 50.000 100.00 35.189 27.808 98.065 740 62.500 50.000 100.00 40.679 30.638 98.322 741 75.000 50.000 100.00 47.784 34.302 98.655 742 87.500 50.000 100.00 56.616 38.856 99.069 743 100.00 50.000 100.00 67.279 44.354 99.568 744 0.0000 62.500 100.00 31.210 32.822 99.242 745 12.500 62.500 100.00 31.796 33.124 99.269 746 25.000 62.500 100.00 33.287 33.893 99.339 747 37.500 62.500 100.00 35.947 35.264 99.464 748 50.000 62.500 100.00 39.950 37.328 99.652 749 62.500 62.500 100.00 45.440 40.159 99.909 750 75.000 62.500 100.00 52.545 43.822 100.24 751 87.500 62.500 100.00 61.377 48.376 100.66 752 100.00 62.500 100.00 72.040 53.874 101.16 753 0.0000 75.000 100.00 37.371 45.142 101.30 754 12.500 75.000 100.00 37.957 45.444 101.32 755 25.000 75.000 100.00 39.448 46.213 101.39 756 37.500 75.000 100.00 42.108 47.584 101.52 757 50.000 75.000 100.00 46.110 49.648 101.71 758 62.500 75.000 100.00 51.601 52.479 101.96 759 75.000 75.000 100.00 58.706 56.142 102.30 760 87.500 75.000 100.00 67.538 60.696 102.71 761 100.00 75.000 100.00 78.201 66.194 103.21 762 0.0000 87.500 100.00 45.030 60.458 103.85 763 12.500 87.500 100.00 45.616 60.760 103.88 764 25.000 87.500 100.00 47.107 61.529 103.95 765 37.500 87.500 100.00 49.767 62.900 104.07 766 50.000 87.500 100.00 53.769 64.964 104.26 767 62.500 87.500 100.00 59.260 67.795 104.52 768 75.000 87.500 100.00 66.365 71.458 104.85 769 87.500 87.500 100.00 75.197 76.012 105.26 770 100.00 87.500 100.00 85.860 81.510 105.76 771 0.0000 100.00 100.00 54.276 78.948 106.93 772 12.500 100.00 100.00 54.862 79.250 106.96 773 25.000 100.00 100.00 56.354 80.019 107.03 774 37.500 100.00 100.00 59.013 81.390 107.15 775 50.000 100.00 100.00 63.016 83.454 107.34 776 62.500 100.00 100.00 68.506 86.285 107.60 777 75.000 100.00 100.00 75.611 89.948 107.93 778 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DENSITY_EXTREME_VALUES "8" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 8 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 47.36070 100.0000 25.61297 21.62916 97.37627 2 100.0000 0.000000 79.35140 52.42580 26.28975 58.72153 3 0.000000 0.000000 58.99710 6.485834 3.193987 29.89445 4 100.0000 66.65930 0.000000 56.05879 50.50543 7.656144 5 0.000000 35.60110 0.000000 4.685619 8.370208 2.228550 6 84.44440 0.000000 0.000000 28.84279 15.35583 2.304665 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 END_DATA CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" DEVICE_COMBINATION_VALUES "9" CREATED "August 31, 2017" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT INDEX RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 9 BEGIN_DATA 0 100.0000 100.0000 100.0000 95.10649 100.0000 108.8440 1 0.000000 100.0000 100.0000 54.27632 78.94783 106.9308 2 100.0000 0.000000 100.0000 59.70128 29.19948 97.04219 3 0.000000 0.000000 100.0000 18.87111 8.147314 95.12896 4 100.0000 100.0000 0.000000 77.23538 92.85269 14.71507 5 0.000000 100.0000 0.000000 36.40521 71.80052 12.80184 6 100.0000 0.000000 0.000000 41.83017 22.05217 2.913230 7 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 8 50.00000 50.00000 50.00000 21.14266 22.19007 24.08306 END_DATADisplayCAL-3.5.0.0/DisplayCAL/trash.py0000644000076500000000000000726512665102055017132 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import sys import os if sys.platform == "win32": from win32com.shell import shell, shellcon import pythoncom import win32api def recycle(path): path = os.path.join(win32api.GetShortPathName(os.path.split(path)[0]), os.path.split(path)[1]) if len(path) > 259: path = win32api.GetShortPathName(path) if path.startswith("\\\\?\\") and len(path) < 260: path = path[4:] if (hasattr(shell, "CLSID_FileOperation") and hasattr(shell, "IID_IFileOperation")): # Vista and later fo = pythoncom.CoCreateInstance(shell.CLSID_FileOperation, None, pythoncom.CLSCTX_ALL, shell.IID_IFileOperation) fo.SetOperationFlags(shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION | shellcon.FOF_RENAMEONCOLLISION | shellcon.FOF_SILENT) try: item = shell.SHCreateItemFromParsingName(path, None, shell.IID_IShellItem) fo.DeleteItem(item) success = fo.PerformOperations() is None aborted = fo.GetAnyOperationsAborted() except pythoncom.com_error, exception: raise TrashAborted(-1) else: # XP retcode, aborted = shell.SHFileOperation((0, shellcon.FO_DELETE, path, "", shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION | shellcon.FOF_RENAMEONCOLLISION | shellcon.FOF_SILENT, None, None)) success = retcode == 0 if aborted: raise TrashAborted(aborted) return success and not aborted else: from time import strftime from urllib import quote import shutil from util_os import getenvu, expanduseru class TrashAborted(Exception): pass class TrashcanUnavailableError(Exception): pass def trash(paths): """ Move files and folders to the trash. If a trashcan facility does not exist, do not touch the files. Return a list of successfully processed paths. """ if isinstance(paths, (str, unicode)): paths = [paths] if not isinstance(paths, list): raise TypeError(str(type(paths)) + " is not list") deleted = [] if sys.platform == "win32": for path in paths: path = os.path.abspath(path) if not os.path.exists(path): raise IOError("No such file or directory: " + path) if recycle(path): deleted.append(path) else: # http://freedesktop.org/wiki/Specifications/trash-spec trashroot = os.path.join(getenvu("XDG_DATA_HOME", os.path.join(expanduseru("~"), ".local", "share")), "Trash") trashinfo = os.path.join(trashroot, "info") # Older Linux distros and Mac OS X trashcan = os.path.join(expanduseru("~"), ".Trash") if sys.platform != "darwin" and not os.path.isdir(trashcan): # Modern Linux distros trashcan = os.path.join(trashroot, "files") if not os.path.isdir(trashcan): try: os.makedirs(trashcan) except OSError: raise TrashcanUnavailableError("Not a directory: '%s'" % trashcan) for path in paths: if os.path.isdir(trashcan): n = 1 dst = os.path.join(trashcan, os.path.basename(path)) while os.path.exists(dst): # avoid name clashes n += 1 dst = os.path.join(trashcan, os.path.basename(path) + "." + str(n)) if os.path.isdir(trashinfo): info = open(os.path.join(trashinfo, os.path.basename(dst) + ".trashinfo"), "w") info.write("[Trash Info]\n") info.write("Path=%s\n" % quote(path.encode(sys.getfilesystemencoding()))) info.write("DeletionDate=" + strftime("%Y-%m-%dT%H:%M:%S")) info.close() shutil.move(path, dst) else: # if trashcan does not exist, simply delete file/folder? pass # if os.path.isdir(path) and not os.path.islink(path): # shutil.rmtree(path) # else: # os.remove(path) deleted.append(path) return deleted DisplayCAL-3.5.0.0/DisplayCAL/util_decimal.py0000644000076500000000000000124112665102054020427 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import decimal import math def float2dec(f, digits=10): parts = str(f).split(".") if len(parts) > 1: if parts[1][:digits] == "9" * digits: f = math.ceil(f) elif parts[1][:digits] == "0" * digits: f = math.floor(f) return decimal.Decimal(str(f)) def stripzeros(n): """ Strip zeros and convert to decimal. Will always return the shortest decimal representation (1.0 becomes 1, 1.234567890 becomes 1.23456789). """ if isinstance(n, (float, int)): n = "%.10f" % n else: n = str(n) if "." in n: n = n.rstrip("0").rstrip(".") try: n = decimal.Decimal(n) except decimal.InvalidOperation, exception: pass return n DisplayCAL-3.5.0.0/DisplayCAL/util_http.py0000644000076500000000000000402112665102054020007 0ustar devwheel00000000000000# -*- coding: utf-8 -*- # http://code.activestate.com/recipes/146306-http-client-to-post-using-multipartform-data/ import httplib import mimetypes import uuid def post_multipart(host, selector, fields, files, charset="UTF-8"): """ Post fields and files to an http host as multipart/form-data. fields is a sequence of (name, value) elements for regular form fields. files is a sequence of (name, filename, value) elements for data to be uploaded as files Return the server's response page. """ content_type, body = encode_multipart_formdata(fields, files, charset) h = httplib.HTTPConnection(host) h.putrequest('POST', selector) h.putheader('Content-Type', content_type) h.putheader('Content-Length', str(len(body))) h.endheaders() h.send(body) resp = h.getresponse() return resp.read() def encode_multipart_formdata(fields, files, charset="UTF-8"): """ fields is a sequence of (name, value) elements for regular form fields. files is a sequence of (name, filename, value) elements for data to be uploaded as files Return (content_type, body) ready for httplib.HTTP instance """ BOUNDARY = '----=_NextPart_%s' % uuid.uuid1() CRLF = '\r\n' L = [] for (key, value) in fields: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"' % key) L.append('Content-Type: text/plain; charset=%s' % charset) L.append('') L.append(value.encode(charset)) for (key, filename, value) in files: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename)) L.append('Content-Type: %s' % get_content_type(filename)) L.append('') L.append(value) L.append('--' + BOUNDARY + '--') L.append('') body = CRLF.join(L) content_type = 'multipart/form-data; boundary=%s' % BOUNDARY return content_type, body def get_content_type(filename): return mimetypes.guess_type(filename)[0] or 'application/octet-stream' DisplayCAL-3.5.0.0/DisplayCAL/util_io.py0000644000076500000000000002026213104456141017442 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import copy import gzip import operator import os import sys import tarfile from StringIO import StringIO from time import time from safe_print import safe_print from util_str import universal_newlines class EncodedWriter(object): """ Decode data with data_encoding and encode it with file_encoding before writing it to file_obj. Either data_encoding or file_encoding can be None. """ def __init__(self, file_obj, data_encoding=None, file_encoding=None, errors="replace"): self.file = file_obj self.data_encoding = data_encoding self.file_encoding = file_encoding self.errors = errors def __getattr__(self, name): return getattr(self.file, name) def write(self, data): if self.data_encoding and not isinstance(data, unicode): data = data.decode(self.data_encoding, self.errors) if self.file_encoding and isinstance(data, unicode): data = data.encode(self.file_encoding, self.errors) self.file.write(data) class Files(): """ Read and/or write from/to several files at once. """ def __init__(self, files, mode="r"): """ Return a Files object. files must be a list or tuple of file objects or filenames (the mode parameter is only used in the latter case). """ self.files = [] for item in files: if isinstance(item, basestring): self.files.append(open(item, mode)) else: self.files.append(item) def __iter__(self): return iter(self.files) def close(self): for item in self.files: item.close() def flush(self): for item in self.files: item.flush() def seek(self, pos, mode=0): for item in self.files: item.seek(pos, mode) def truncate(self, size=None): for item in self.files: item.truncate(size) def write(self, data): for item in self.files: item.write(data) def writelines(self, str_sequence): self.write("".join(str_sequence)) class GzipFileProper(gzip.GzipFile): """ Proper GZIP file implementation, where the optional filename in the header has directory components removed, and is converted to ISO 8859-1 (Latin-1). On Windows, the filename will also be forced to lowercase. See RFC 1952 GZIP File Format Specification version 4.3 """ def _write_gzip_header(self): self.fileobj.write('\037\213') # magic header self.fileobj.write('\010') # compression method fname = os.path.basename(self.name) if fname.endswith(".gz"): fname = fname[:-3] elif fname.endswith(".tgz"): fname = "%s.tar" % fname[:-4] elif fname.endswith(".wrz"): fname = "%s.wrl" % fname[:-4] flags = 0 if fname: flags = gzip.FNAME self.fileobj.write(chr(flags)) gzip.write32u(self.fileobj, long(time())) self.fileobj.write('\002') self.fileobj.write('\377') if fname: if sys.platform == "win32": # Windows is case insensitive by default (although it can be # set to case sensitive), so according to the GZIP spec, we # force the name to lowercase fname = fname.lower() self.fileobj.write(fname.encode("ISO-8859-1", "replace") .replace("?", "_") + '\000') def __enter__(self): return self def __exit__(self, type, value, tb): self.close() class LineBufferedStream(): """ Buffer lines and only write them to stream if line separator is detected """ def __init__(self, stream, data_encoding=None, file_encoding=None, errors="replace", linesep_in="\r\n", linesep_out="\n"): self.buf = "" self.data_encoding = data_encoding self.file_encoding = file_encoding self.errors = errors self.linesep_in = linesep_in self.linesep_out = linesep_out self.stream = stream def __del__(self): self.commit() def __getattr__(self, name): return getattr(self.stream, name) def close(self): self.commit() self.stream.close() def commit(self): if self.buf: if self.data_encoding and not isinstance(self.buf, unicode): self.buf = self.buf.decode(self.data_encoding, self.errors) if self.file_encoding: self.buf = self.buf.encode(self.file_encoding, self.errors) self.stream.write(self.buf) self.buf = "" def write(self, data): data = data.replace(self.linesep_in, "\n") for char in data: if char == "\r": while self.buf and not self.buf.endswith(self.linesep_out): self.buf = self.buf[:-1] else: if char == "\n": self.buf += self.linesep_out self.commit() else: self.buf += char class LineCache(): """ When written to it, stores only the last n + 1 lines and returns only the last n non-empty lines when read. """ def __init__(self, maxlines=1): self.clear() self.maxlines = maxlines def clear(self): self.cache = [""] def flush(self): pass def read(self, triggers=None): lines = [""] for line in self.cache: read = True if triggers: for trigger in triggers: if trigger.lower() in line.lower(): read = False break if read and line: lines.append(line) return "\n".join(filter(lambda line: line, lines)[-self.maxlines:]) def write(self, data): cache = list(self.cache) for char in data: if char == "\r": cache[-1] = "" elif char == "\n": cache.append("") else: cache[-1] += char self.cache = (filter(lambda line: line, cache[:-1]) + cache[-1:])[-self.maxlines - 1:] class StringIOu(StringIO): """ StringIO which converts all new line formats in buf to POSIX newlines. """ def __init__(self, buf=''): StringIO.__init__(self, universal_newlines(buf)) class Tee(Files): """ Write to a file and stdout. """ def __init__(self, file_obj): Files.__init__((sys.stdout, file_obj)) def __getattr__(self, name): return getattr(self.files[1], name) def close(self): self.files[1].close() def seek(self, pos, mode=0): return self.files[1].seek(pos, mode) def truncate(self, size=None): return self.files[1].truncate(size) class TarFileProper(tarfile.TarFile): """ Support extracting to unicode location and using base name """ def extract(self, member, path="", full=True): """Extract a member from the archive to the current working directory, using its full name or base name. Its file information is extracted as accurately as possible. `member' may be a filename or a TarInfo object. You can specify a different directory using `path'. """ self._check("r") if isinstance(member, basestring): tarinfo = self.getmember(member) else: tarinfo = member # Prepare the link target for makelink(). if tarinfo.islnk(): name = tarinfo.linkname.decode(self.encoding) if not full: name = os.path.basename(name) tarinfo._link_target = os.path.join(path, name) try: name = tarinfo.name.decode(self.encoding) if not full: name = os.path.basename(name) self._extract_member(tarinfo, os.path.join(path, name)) except EnvironmentError, e: if self.errorlevel > 0: raise else: if e.filename is None: self._dbg(1, "tarfile: %s" % e.strerror) else: self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) except ExtractError, e: if self.errorlevel > 1: raise else: self._dbg(1, "tarfile: %s" % e) def extractall(self, path=".", members=None, full=True): """Extract all members from the archive to the current working directory and set owner, modification time and permissions on directories afterwards. `path' specifies a different directory to extract to. `members' is optional and must be a subset of the list returned by getmembers(). """ directories = [] if members is None: members = self for tarinfo in members: if tarinfo.isdir(): # Extract directories with a safe mode. directories.append(tarinfo) tarinfo = copy.copy(tarinfo) tarinfo.mode = 0700 self.extract(tarinfo, path, full) # Reverse sort directories. directories.sort(key=operator.attrgetter('name')) directories.reverse() # Set correct owner, mtime and filemode on directories. for tarinfo in directories: name = tarinfo.name.decode(self.encoding) if not full: name = os.path.basename(name) dirpath = os.path.join(path, name) try: self.chown(tarinfo, dirpath) self.utime(tarinfo, dirpath) self.chmod(tarinfo, dirpath) except ExtractError, e: if self.errorlevel > 1: raise else: self._dbg(1, "tarfile: %s" % e) DisplayCAL-3.5.0.0/DisplayCAL/util_list.py0000644000076500000000000000410013104456141017777 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import re def floatlist(alist): """ Convert all list items to floats (0.0 on error) """ result = [] for item in alist: try: result.append(float(item)) except ValueError: result.append(0.0) return result def get(alist, index, default=None): """ Similar to dict.get, return item at index or default if not in list """ if index > -1 and index < len(alist): return alist[index] return default def index_ignorecase(self, value, start = None, stop = None): """ Case-insensitive version of list.index """ items = [(item.lower() if isinstance(item, (str, unicode)) else item) for item in self] return items.index(value, start or 0, stop or len(self)) def index_fallback_ignorecase(self, value, start = None, stop = None): """ Return index of value in list. Prefer a case-sensitive match. """ if value in self: return self.index(value, start or 0, stop or len(self)) return index_ignorecase(self, value, start or 0, stop or len(self)) def intlist(alist): """ Convert all list items to ints (0 on error) """ result = [] for item in alist: try: result.append(int(item)) except ValueError: result.append(0) return result alphanumeric_re = re.compile("\D+|\d+") def natsort_key_factory(ignorecase=True, n=10): """ Create natural sort key function. Note that if integer parts are longer than n digits, sort order may no longer be entirely natural. """ def natsort_key(item): matches = alphanumeric_re.findall(item) key = [] for match in matches: if match.isdigit(): match = match.rjust(n, "0") elif ignorecase: match = match.lower() key.append(match) return key return natsort_key def natsort(list_in, ignorecase=True, reverse=False, n=10): """ Sort a list which (also) contains integers naturally. Note that if integer parts are longer than n digits, sort order will no longer be entirely natural. """ return sorted(list_in, key=natsort_key_factory(ignorecase, n), reverse=reverse) def strlist(alist): """ Convert all list items to strings """ return [str(item) for item in alist] DisplayCAL-3.5.0.0/DisplayCAL/util_mac.py0000644000076500000000000000500712665102054017575 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import subprocess as sp from time import sleep from meta import name as appname from options import verbose def get_osascript_args(applescript): """ Return arguments ready to use for osascript """ if isinstance(applescript, basestring): applescript = applescript.splitlines() args = [] for line in applescript: args.extend(['-e', line]) return args def get_osascript_args_or_run(applescript, run=True): """ Return arguments ready to use for osascript or run the AppleScript """ if run: return osascript(applescript) else: return get_osascript_args(applescript) def mac_app_activate(delay=0, mac_app_name="Finder"): """ Activate (show & bring to front) an application if it is running. """ applescript = [ 'if app "%s" is running then' % mac_app_name, # Use 'run script' to prevent the app activating upon script # compilation even if not running r'run script "tell app \"%s\" to activate"' % mac_app_name, 'end if' ] if delay: sleep(delay) return osascript(applescript) def mac_terminal_do_script(script=None, do=True): """ Run a script in Terminal. """ applescript = [ 'if app "Terminal" is running then', 'tell app "Terminal"', 'activate', 'do script ""', # Terminal is already running, open a new # window to make sure it is not blocked by # another process 'end tell', 'else', 'tell app "Terminal" to activate', # Terminal is not yet running, # launch & use first window 'end if' ] if script: applescript.extend([ 'tell app "Terminal"', 'do script "%s" in first window' % script.replace('"', '\\"'), 'end tell' ]) return get_osascript_args_or_run(applescript, script and do) def mac_terminal_set_colors(background="black", cursor="gray", text="gray", text_bold="gray", do=True): """ Set Terminal colors. """ applescript = [ 'tell app "Terminal"', 'set background color of first window to "%s"' % background, 'set cursor color of first window to "%s"' % cursor, 'set normal text color of first window to "%s"' % text, 'set bold text color of first window to "%s"' % text_bold, 'end tell' ] return get_osascript_args_or_run(applescript, do) def osascript(applescript): """ Run AppleScript with the 'osascript' command Return osascript's exit code. """ args = get_osascript_args(applescript) p = sp.Popen(['osascript'] + args, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) output, errors = p.communicate() retcode = p.wait() return retcode, output, errors DisplayCAL-3.5.0.0/DisplayCAL/util_os.py0000644000076500000000000005054613242301247017463 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import fnmatch import ctypes import errno import glob import locale import os import re import shutil import subprocess as sp import sys import tempfile import time if sys.platform not in ("darwin", "win32"): # Linux import grp import pwd try: reloaded except NameError: # First import. All fine reloaded = 0 else: # Module is being reloaded. NOT recommended. reloaded += 1 import warnings warnings.warn("Module %s is being reloaded. This is NOT recommended." % __name__, RuntimeWarning) warnings.warn("Implicitly reloading builtins", RuntimeWarning) if sys.platform == "win32": reload(__builtin__) warnings.warn("Implicitly reloading os", RuntimeWarning) reload(os) warnings.warn("Implicitly reloading os.path", RuntimeWarning) reload(os.path) if sys.platform == "win32": warnings.warn("Implicitly reloading win32api", RuntimeWarning) reload(win32api) if sys.platform == "win32": from win32file import * from winioctlcon import FSCTL_GET_REPARSE_POINT FILE_ATTRIBUTE_REPARSE_POINT = 1024 SYMBOLIC_LINK = 'symbolic' MOUNTPOINT = 'mountpoint' GENERIC = 'generic' from encoding import get_encodings fs_enc = get_encodings()[1] _listdir = os.listdir if sys.platform == "win32": # Add support for long paths (> 260 chars) # and retry ERROR_SHARING_VIOLATION import __builtin__ import winerror import win32api _open = __builtin__.open def retry_sharing_violation_factory(fn, delay=0.25, maxretries=20): def retry_sharing_violation(*args, **kwargs): retries = 0 while True: try: return fn(*args, **kwargs) except WindowsError, exception: if exception.winerror == winerror.ERROR_SHARING_VIOLATION: if retries < maxretries: retries += 1 time.sleep(delay) continue raise return retry_sharing_violation def open(path, *args, **kwargs): """ Wrapper around __builtin__.open dealing with win32 long paths """ return _open(make_win32_compatible_long_path(path), *args, **kwargs) __builtin__.open = open _access = os.access def access(path, mode): return _access(make_win32_compatible_long_path(path), mode) os.access = access _exists = os.path.exists def exists(path): return _exists(make_win32_compatible_long_path(path)) os.path.exists = exists _isdir = os.path.isdir def isdir(path): return _isdir(make_win32_compatible_long_path(path)) os.path.isdir = isdir _isfile = os.path.isfile def isfile(path): return _isfile(make_win32_compatible_long_path(path)) os.path.isfile = isfile def listdir(path): return _listdir(make_win32_compatible_long_path(path)) _lstat = os.lstat def lstat(path): return _lstat(make_win32_compatible_long_path(path)) os.lstat = lstat _mkdir = os.mkdir def mkdir(path, mode=0777): return _mkdir(make_win32_compatible_long_path(path, 247), mode) os.mkdir = mkdir _makedirs = os.makedirs def makedirs(path, mode=0777): return _makedirs(make_win32_compatible_long_path(path, 247), mode) os.makedirs = makedirs _remove = os.remove def remove(path): return _remove(make_win32_compatible_long_path(path)) os.remove = retry_sharing_violation_factory(remove) _rename = os.rename def rename(src, dst): src, dst = [make_win32_compatible_long_path(path) for path in (src, dst)] return _rename(src, dst) os.rename = retry_sharing_violation_factory(rename) _stat = os.stat def stat(path): return _stat(make_win32_compatible_long_path(path)) os.stat = stat _unlink = os.unlink def unlink(path): return _unlink(make_win32_compatible_long_path(path)) os.unlink = retry_sharing_violation_factory(unlink) _GetShortPathName = win32api.GetShortPathName def GetShortPathName(path): return _GetShortPathName(make_win32_compatible_long_path(path)) win32api.GetShortPathName = GetShortPathName else: def listdir(path): paths = _listdir(path) if isinstance(path, unicode): # Undecodable filenames will still be string objects. Ignore them. paths = filter(lambda path: isinstance(path, unicode), paths) return paths os.listdir = listdir def quote_args(args): """ Quote commandline arguments where needed. It quotes all arguments that contain spaces or any of the characters ^!$%&()[]{}=;'+,`~ """ args_out = [] for arg in args: if re.search("[\^!$%&()[\]{}=;'+,`~\s]", arg): arg = '"' + arg + '"' args_out.append(arg) return args_out def dlopen(name): try: return ctypes.CDLL(name) except: pass def find_library(pattern, arch=None): """ Use ldconfig cache to find installed library. Can use fnmatch-style pattern matching. """ try: p = sp.Popen(["/sbin/ldconfig", "-p"], stdout=sp.PIPE) stdout, stderr = p.communicate() except: return if not arch: try: p = sp.Popen(["file", "-L", sys.executable], stdout=sp.PIPE) file_stdout, file_stderr = p.communicate() except: pass else: # /usr/bin/python2.7: ELF 64-bit LSB shared object, x86-64, # version 1 (SYSV), dynamically linked, interpreter # /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, # BuildID[sha1]=41a1f0d4da3afee8f22d1947cc13a9f33f59f2b8, stripped parts = file_stdout.split(",") if len(parts) > 1: arch = parts[1].strip() for line in stdout.splitlines(): # libxyz.so (libc6,x86_64) => /lib64/libxyz.so.1 parts = line.split("=>", 1) candidate = parts[0].split(None, 1) if len(parts) < 2 or len(candidate) < 2: continue info = candidate[1].strip("( )").split(",") if arch and len(info) > 1 and info[1].strip() != arch: # Skip libs for wrong arch continue filename = candidate[0] if fnmatch.fnmatch(filename, pattern): path = parts[1].strip() return path def expanduseru(path): """ Unicode version of os.path.expanduser """ if sys.platform == "win32": # The code in this if-statement is copied from Python 2.7's expanduser # in ntpath.py, but uses getenvu() instead of os.environ[] if path[:1] != '~': return path i, n = 1, len(path) while i < n and path[i] not in '/\\': i = i + 1 if 'HOME' in os.environ: userhome = getenvu('HOME') elif 'USERPROFILE' in os.environ: userhome = getenvu('USERPROFILE') elif not 'HOMEPATH' in os.environ: return path else: drive = getenvu('HOMEDRIVE', '') userhome = os.path.join(drive, getenvu('HOMEPATH')) if i != 1: #~user userhome = os.path.join(dirname(userhome), path[1:i]) return userhome + path[i:] return unicode(os.path.expanduser(path), fs_enc) def expandvarsu(path): """ Unicode version of os.path.expandvars """ if sys.platform == "win32": # The code in this if-statement is copied from Python 2.7's expandvars # in ntpath.py, but uses getenvu() instead of os.environ[] if '$' not in path and '%' not in path: return path import string varchars = string.ascii_letters + string.digits + '_-' res = '' index = 0 pathlen = len(path) while index < pathlen: c = path[index] if c == '\'': # no expansion within single quotes path = path[index + 1:] pathlen = len(path) try: index = path.index('\'') res = res + '\'' + path[:index + 1] except ValueError: res = res + path index = pathlen - 1 elif c == '%': # variable or '%' if path[index + 1:index + 2] == '%': res = res + c index = index + 1 else: path = path[index+1:] pathlen = len(path) try: index = path.index('%') except ValueError: res = res + '%' + path index = pathlen - 1 else: var = path[:index] if var in os.environ: res = res + getenvu(var) else: res = res + '%' + var + '%' elif c == '$': # variable or '$$' if path[index + 1:index + 2] == '$': res = res + c index = index + 1 elif path[index + 1:index + 2] == '{': path = path[index+2:] pathlen = len(path) try: index = path.index('}') var = path[:index] if var in os.environ: res = res + getenvu(var) else: res = res + '${' + var + '}' except ValueError: res = res + '${' + path index = pathlen - 1 else: var = '' index = index + 1 c = path[index:index + 1] while c != '' and c in varchars: var = var + c index = index + 1 c = path[index:index + 1] if var in os.environ: res = res + getenvu(var) else: res = res + '$' + var if c != '': index = index - 1 else: res = res + c index = index + 1 return res return unicode(os.path.expandvars(path), fs_enc) def fname_ext(path): """ Get filename and extension """ return os.path.splitext(os.path.basename(path)) def get_program_file(name, foldername): """ Get path to program file """ if sys.platform == "win32": paths = getenvu("PATH", os.defpath).split(os.pathsep) paths += glob.glob(os.path.join(getenvu("PROGRAMFILES", ""), foldername)) paths += glob.glob(os.path.join(getenvu("PROGRAMW6432", ""), foldername)) exe_ext = ".exe" else: paths = None exe_ext = "" return which(name + exe_ext, paths=paths) def getenvu(name, default = None): """ Unicode version of os.getenv """ if sys.platform == "win32": name = unicode(name) # http://stackoverflow.com/questions/2608200/problems-with-umlauts-in-python-appdata-environvent-variable length = ctypes.windll.kernel32.GetEnvironmentVariableW(name, None, 0) if length == 0: return default buffer = ctypes.create_unicode_buffer(u'\0' * length) ctypes.windll.kernel32.GetEnvironmentVariableW(name, buffer, length) return buffer.value var = os.getenv(name, default) if isinstance(var, basestring): return var if isinstance(var, unicode) else unicode(var, fs_enc) def getgroups(username=None, names_only=False): """ Return a list of groups that user is member of, or groups of current process if username not given """ if username is None: groups = [grp.getgrgid(g) for g in os.getgroups()] else: groups = [g for g in grp.getgrall() if username in g.gr_mem] gid = pwd.getpwnam(username).pw_gid groups.append(grp.getgrgid(gid)) if names_only: groups = [g.gr_name for g in groups] return groups def islink(path): """ Cross-platform islink implementation. Supports Windows NT symbolic links and reparse points. """ if sys.platform != "win32" or sys.getwindowsversion()[0] < 6: return os.path.islink(path) return bool(os.path.exists(path) and GetFileAttributes(path) & FILE_ATTRIBUTE_REPARSE_POINT == FILE_ATTRIBUTE_REPARSE_POINT) def is_superuser(): if sys.platform == "win32": if sys.getwindowsversion() >= (5, 1): return bool(ctypes.windll.shell32.IsUserAnAdmin()) else: try: return bool(ctypes.windll.advpack.IsNTAdmin(0, 0)) except Exception: return False else: return os.geteuid() == 0 def launch_file(filepath): """ Open a file with its assigned default app. Return tuple(returncode, stdout, stderr) or None if functionality not available """ filepath = filepath.encode(fs_enc) retcode = None kwargs = dict(stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) if sys.platform == "darwin": retcode = sp.call(['open', filepath], **kwargs) elif sys.platform == "win32": # for win32, we could use os.startfile, but then we'd not be able # to return exitcode (does it matter?) kwargs = {} kwargs["startupinfo"] = sp.STARTUPINFO() kwargs["startupinfo"].dwFlags |= sp.STARTF_USESHOWWINDOW kwargs["startupinfo"].wShowWindow = sp.SW_HIDE kwargs["shell"] = True kwargs["close_fds"] = True retcode = sp.call('start "" "%s"' % filepath, **kwargs) elif which('xdg-open'): retcode = sp.call(['xdg-open', filepath], **kwargs) return retcode def listdir_re(path, rex = None): """ Filter directory contents through a regular expression """ files = os.listdir(path) if rex: rex = re.compile(rex, re.IGNORECASE) files = filter(rex.search, files) return files def make_win32_compatible_long_path(path, maxpath=259): if (sys.platform == "win32" and len(path) > maxpath and os.path.isabs(path) and not path.startswith("\\\\?\\")): path = "\\\\?\\" + path return path def mkstemp_bypath(path, dir=None, text=False): """ Wrapper around mkstemp that uses filename and extension from path as prefix and suffix for the temporary file, and the directory component as temporary file directory if 'dir' is not given. """ fname, ext = fname_ext(path) if not dir: dir = os.path.dirname(path) return tempfile.mkstemp(ext, fname + "-", dir, text) def mksfile(filename): """ Create a file safely and return (fd, abspath) If filename already exists, add '(n)' as suffix before extension (will try up to os.TMP_MAX or 10000 for n) Basically, this works in a similar way as _mkstemp_inner from the standard library 'tempfile' module. """ flags = tempfile._bin_openflags fname, ext = os.path.splitext(filename) for seq in xrange(tempfile.TMP_MAX): if not seq: pth = filename else: pth = "%s(%i)%s" % (fname, seq, ext) try: fd = os.open(pth, flags, 0600) tempfile._set_cloexec(fd) return (fd, os.path.abspath(pth)) except OSError, e: if e.errno == errno.EEXIST: continue # Try again raise raise IOError, (errno.EEXIST, "No usable temporary file name found") def movefile(src, dst, overwrite=True): """ Move a file to another location. dst can be a directory in which case a file with the same basename as src will be created in it. Set overwrite to True to make sure existing files are overwritten. """ if os.path.isdir(dst): dst = os.path.join(dst, os.path.basename(src)) if os.path.isfile(dst) and overwrite: os.remove(dst) shutil.move(src, dst) def putenvu(name, value): """ Unicode version of os.putenv (also correctly updates os.environ) """ if sys.platform == "win32" and isinstance(value, unicode): ctypes.windll.kernel32.SetEnvironmentVariableW(unicode(name), value) else: os.environ[name] = value.encode(fs_enc) def parse_reparse_buffer(original, reparse_type=SYMBOLIC_LINK): """ Implementing the below in Python: typedef struct _REPARSE_DATA_BUFFER { ULONG ReparseTag; USHORT ReparseDataLength; USHORT Reserved; union { struct { USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; ULONG Flags; WCHAR PathBuffer[1]; } SymbolicLinkReparseBuffer; struct { USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; WCHAR PathBuffer[1]; } MountPointReparseBuffer; struct { UCHAR DataBuffer[1]; } GenericReparseBuffer; } DUMMYUNIONNAME; } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; """ # Size of our data types SZULONG = 4 # sizeof(ULONG) SZUSHORT = 2 # sizeof(USHORT) # Our structure. # Probably a better way to iterate a dictionary in a particular order, # but I was in a hurry, unfortunately, so I used pkeys. buffer = { 'tag' : SZULONG, 'data_length' : SZUSHORT, 'reserved' : SZUSHORT, SYMBOLIC_LINK : { 'substitute_name_offset' : SZUSHORT, 'substitute_name_length' : SZUSHORT, 'print_name_offset' : SZUSHORT, 'print_name_length' : SZUSHORT, 'flags' : SZULONG, 'buffer' : u'', 'pkeys' : [ 'substitute_name_offset', 'substitute_name_length', 'print_name_offset', 'print_name_length', 'flags', ] }, MOUNTPOINT : { 'substitute_name_offset' : SZUSHORT, 'substitute_name_length' : SZUSHORT, 'print_name_offset' : SZUSHORT, 'print_name_length' : SZUSHORT, 'buffer' : u'', 'pkeys' : [ 'substitute_name_offset', 'substitute_name_length', 'print_name_offset', 'print_name_length', ] }, GENERIC : { 'pkeys' : [], 'buffer': '' } } # Header stuff buffer['tag'] = original[:SZULONG] buffer['data_length'] = original[SZULONG:SZUSHORT] buffer['reserved'] = original[SZULONG+SZUSHORT:SZUSHORT] original = original[8:] # Parsing k = reparse_type for c in buffer[k]['pkeys']: if type(buffer[k][c]) == int: sz = buffer[k][c] bytes = original[:sz] buffer[k][c] = 0 for b in bytes: n = ord(b) if n: buffer[k][c] += n original = original[sz:] # Using the offset and length's grabbed, we'll set the buffer. buffer[k]['buffer'] = original return buffer def readlink(path): """ Cross-platform implenentation of readlink. Supports Windows NT symbolic links and reparse points. """ if sys.platform != "win32": return os.readlink(path) # This wouldn't return true if the file didn't exist if not islink(path): # Mimic POSIX error raise OSError(22, 'Invalid argument', path) # Open the file correctly depending on the string type. if type(path) is unicode: createfilefn = CreateFileW else: createfilefn = CreateFile handle = createfilefn(path, GENERIC_READ, 0, None, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT, 0) # MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16384 = (16 * 1024) buffer = DeviceIoControl(handle, FSCTL_GET_REPARSE_POINT, None, 16 * 1024) # Above will return an ugly string (byte array), so we'll need to parse it. # But first, we'll close the handle to our file so we're not locking it anymore. CloseHandle(handle) # Minimum possible length (assuming that the length is bigger than 0) if len(buffer) < 9: return type(path)() # Parse and return our result. result = parse_reparse_buffer(buffer) offset = result[SYMBOLIC_LINK]['substitute_name_offset'] ending = offset + result[SYMBOLIC_LINK]['substitute_name_length'] rpath = result[SYMBOLIC_LINK]['buffer'][offset:ending].decode('UTF-16-LE') if len(rpath) > 4 and rpath[0:4] == '\\??\\': rpath = rpath[4:] return rpath def relpath(path, start): """ Return a relative version of a path """ path = os.path.abspath(path).split(os.path.sep) start = os.path.abspath(start).split(os.path.sep) if path == start: return "." elif path[:len(start)] == start: return os.path.sep.join(path[len(start):]) elif start[:len(path)] == path: return os.path.sep.join([".."] * (len(start) - len(path))) def waccess(path, mode): """ Test access to path """ if mode & os.R_OK: try: test = open(path, "rb") except EnvironmentError: return False test.close() if mode & os.W_OK: if os.path.isdir(path): dir = path else: dir = os.path.dirname(path) try: if os.path.isfile(path): test = open(path, "ab") else: test = tempfile.TemporaryFile(prefix=".", dir=dir) except EnvironmentError: return False test.close() if mode & os.X_OK: return os.access(path, mode) return True def which(executable, paths = None): """ Return the full path of executable """ if not paths: paths = getenvu("PATH", os.defpath).split(os.pathsep) for cur_dir in paths: filename = os.path.join(cur_dir, executable) if os.path.isfile(filename): try: # make sure file is actually executable if os.access(filename, os.X_OK): return filename except Exception, exception: pass return None def whereis(names, bin=True, bin_paths=None, man=True, man_paths=None, src=True, src_paths=None, unusual=False, list_paths=False): """ Wrapper around whereis """ args = [] if bin: args.append("-b") if bin_paths: args.append("-B") args.extend(bin_paths) if man: args.append("-m") if man_paths: args.append("-M") args.extend(man_paths) if src: args.append("-s") if src_paths: args.append("-S") args.extend(src_paths) if bin_paths or man_paths or src_paths: args.append("-f") if unusual: args.append("-u") if list_paths: args.append("-l") if isinstance(names, basestring): names = [names] p = sp.Popen(["whereis"] + args + names, stdout=sp.PIPE) stdout, stderr = p.communicate() result = {} for line in stdout.strip().splitlines(): # $ whereis abc xyz # abc: /bin/abc # xyz: /bin/xyz /usr/bin/xyz match = line.split(":", 1) if match: result[match[0]] = match[-1].split() return result if sys.platform == "win32" and sys.getwindowsversion() >= (6, ): class win64_disable_file_system_redirection: # http://code.activestate.com/recipes/578035-disable-file-system-redirector/ r""" Disable Windows File System Redirection. When a 32 bit program runs on a 64 bit Windows the paths to C:\Windows\System32 automatically get redirected to the 32 bit version (C:\Windows\SysWow64), if you really do need to access the contents of System32, you need to disable the file system redirection first. """ _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection def __enter__(self): self.old_value = ctypes.c_long() self.success = self._disable(ctypes.byref(self.old_value)) def __exit__(self, type, value, traceback): if self.success: self._revert(self.old_value) DisplayCAL-3.5.0.0/DisplayCAL/util_str.py0000644000076500000000000003630513242301247017647 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import codecs import exceptions import locale import re import string import sys import unicodedata try: from functools import reduce except ImportError: # Python < 2.6 pass env_errors = (EnvironmentError, ) if sys.platform == "win32": import pywintypes env_errors = env_errors + (pywintypes.error, pywintypes.com_error) from encoding import get_encodings fs_enc = get_encodings()[1] ascii_printable = "".join([getattr(string, name) for name in "digits", "ascii_letters", "punctuation", "whitespace"]) # Control chars are defined as charcodes in the decimal range 0-31 (inclusive) # except whitespace characters, plus charcode 127 (DEL) control_chars = "".join([chr(i) for i in range(0, 9) + range(14, 32) + [127]]) # Safe character substitution - can be used for filenames # i.e. no \/:*?"<>| will be added through substitution # Contains only chars that are not normalizable safesubst = {# Latin-1 supplement u"\u00a2": u"c", # Cent sign u"\u00a3": u"GBP", # Pound sign u"\u00a5": u"JPY", # Yen sign u"\u00a9": u"(C)", # U+00A9 copyright sign u"\u00ac": u"!", # Not sign u"\u00ae": u"(R)", # U+00AE registered sign u"\u00b0": u"deg", # Degree symbol u"\u00b1": u"+-", u"\u00c4": u"Ae", # Capital letter A with diaresis (Umlaut) u"\u00c5": u"Aa", # Capital letter A with ring above u"\u00c6": u"AE", u"\u00d6": u"Oe", # Capital letter O with diaresis (Umlaut) u"\u00dc": u"Ue", # Capital letter U with diaresis (Umlaut) u"\u00d7": u"x", # U+00D7 multiplication sign u"\u00df": u"ss", u"\u00e4": u"ae", # Small letter a with diaresis (Umlaut) u"\u00e5": u"aa", # Small letter a with ring above u"\u00e6": u"ae", u"\u00f6": u"oe", # Small letter o with diaresis (Umlaut) u"\u00fc": u"ue", # Small letter u with diaresis (Umlaut) # Latin extended A u"\u0152": u"OE", u"\u0153": u"oe", # General punctuation u"\u2010": u"-", u"\u2011": u"-", u"\u2012": u"-", u"\u2013": u"-", # U+2013 en dash u"\u2014": u"--", # U+2014 em dash u"\u2015": u"---", # U+2015 horizontal bar u"\u2018": u"'", u"\u2019": u"'", u"\u201a": u",", u"\u201b": u"'", u"\u201c": u"''", u"\u201d": u"''", u"\u201e": u",,", u"\u201f": u"''", u"\u2032": u"'", u"\u2033": u"''", u"\u2034": u"'''", u"\u2035": u"'", u"\u2036": u"''", u"\u2037": u"'''", u"\u2053": u"~", # Superscripts and subscripts u"\u207b": u"-", # Superscript minus u"\u208b": u"-", # Subscript minus # Currency symbols u"\u20a1": u"CRC", # Costa Rica 'Colon' u"\u20a6": u"NGN", # Nigeria 'Naira' u"\u20a9": u"KRW", # South Korea 'Won' u"\u20aa": u"ILS", # Isreael 'Sheqel' u"\u20ab": u"VND", # Vietnam 'Dong' u"\u20ac": u"EUR", u"\u20ad": u"LAK", # Laos 'Kip' u"\u20ae": u"MNT", # Mongolia 'Tugrik' u"\u20b2": u"PYG", # Paraguay 'Guarani' u"\u20b4": u"UAH", # Ukraine 'Hryvnja' u"\u20b5": u"GHS", # Ghana 'Cedi' u"\u20b8": u"KZT", # Kasachstan 'Tenge' u"\u20b9": u"INR", # Indian 'Rupee' u"\u20ba": u"TRY", # Turkey 'Lira' u"\u20bc": u"AZN", # Aserbaidchan 'Manat' u"\u20bd": u"RUB", # Russia 'Ruble' u"\u20be": u"GEL", # Georgia 'Lari' # Letter-like symbols u"\u2117": u"(P)", # Mathematical operators u"\u2212": u"-", # U+2212 minus sign u"\u2260": u"!=", # Enclosed alphanumerics u"\u2460": u"(1)", u"\u2461": u"(2)", u"\u2462": u"(3)", u"\u2463": u"(4)", u"\u2464": u"(5)", u"\u2465": u"(6)", u"\u2466": u"(7)", u"\u2467": u"(8)", u"\u2468": u"(9)", u"\u2469": u"(10)", u"\u246a": u"(11)", u"\u246b": u"(12)", u"\u246c": u"(13)", u"\u246d": u"(14)", u"\u246e": u"(15)", u"\u246f": u"(16)", u"\u2470": u"(17)", u"\u2471": u"(18)", u"\u2472": u"(19)", u"\u2473": u"(20)", u"\u24eb": u"(11)", u"\u24ec": u"(12)", u"\u24ed": u"(13)", u"\u24ee": u"(14)", u"\u24ef": u"(15)", u"\u24f0": u"(16)", u"\u24f1": u"(17)", u"\u24f2": u"(18)", u"\u24f3": u"(19)", u"\u24f4": u"(20)", u"\u24f5": u"(1)", u"\u24f6": u"(2)", u"\u24f7": u"(3)", u"\u24f8": u"(4)", u"\u24f9": u"(5)", u"\u24fa": u"(6)", u"\u24fb": u"(7)", u"\u24fc": u"(8)", u"\u24fd": u"(9)", u"\u24fe": u"(10)", u"\u24ff": u"(0)", # Dingbats u"\u2776": u"(1)", u"\u2777": u"(2)", u"\u2778": u"(3)", u"\u2779": u"(4)", u"\u277a": u"(5)", u"\u277b": u"(6)", u"\u277c": u"(7)", u"\u277d": u"(8)", u"\u277e": u"(9)", u"\u277f": u"(10)", u"\u2780": u"(1)", u"\u2781": u"(2)", u"\u2782": u"(3)", u"\u2783": u"(4)", u"\u2784": u"(5)", u"\u2785": u"(6)", u"\u2786": u"(7)", u"\u2787": u"(8)", u"\u2788": u"(9)", u"\u2789": u"(10)", u"\u278a": u"(1)", u"\u278b": u"(2)", u"\u278c": u"(3)", u"\u278d": u"(4)", u"\u278e": u"(5)", u"\u278f": u"(6)", u"\u2790": u"(7)", u"\u2791": u"(8)", u"\u2792": u"(9)", u"\u2793": u"(10)",} # Extended character substitution - can NOT be used for filenames # Contains only chars that are not normalizable subst = dict(safesubst) subst.update({# Latin-1 supplement u"\u00a6": u"|", u"\u00ab": u"<<", u"\u00bb": u">>", u"\u00bc": u"1/4", u"\u00bd": u"1/2", u"\u00be": u"3/4", u"\u00f7": u":", # General punctuation u"\u201c": u"\x22", u"\u201d": u"\x22", u"\u201f": u"\x22", u"\u2033": u"\x22", u"\u2036": u"\x22", u"\u2039": u"<", u"\u203a": u">", u"\u203d": u"!?", u"\u2044": u"/", # Number forms u"\u2153": u"1/3", u"\u2154": u"2/3", u"\u215b": u"1/8", u"\u215c": u"3/8", u"\u215d": u"5/8", u"\u215e": u"7/8", # Arrows u"\u2190": u"<-", u"\u2192": u"->", u"\u2194": u"<->", # Mathematical operators u"\u226a": u"<<", u"\u226b": u">>", u"\u2264": u"<=", u"\u2265": u"=>",}) class StrList(list): """ It's a list. It's a string. It's a list of strings that behaves like a string! And like a list.""" def __init__(self, seq=tuple()): list.__init__(self, seq) def __iadd__(self, text): self.append(text) return self def __getattr__(self, attr): return getattr(str(self), attr) def __str__(self): return "".join(self) def asciize(obj): """ Turn several unicode chars into an ASCII representation. This function either takes a string or an exception as argument (when used as error handler for encode or decode). """ chars = u"" if isinstance(obj, Exception): for char in obj.object[obj.start:obj.end]: chars += subst.get(char, normalencode(char).strip() or u"?") return chars, obj.end else: return obj.encode("ASCII", "asciize") codecs.register_error("asciize", asciize) def safe_asciize(obj): """ Turn several unicode chars into an ASCII representation. This function either takes a string or an exception as argument (when used as error handler for encode or decode). """ chars = u"" if isinstance(obj, Exception): for char in obj.object[obj.start:obj.end]: if char in safesubst: subst_char = safesubst[char] else: subst_char = u"_" if char not in subst: subst_char = normalencode(char).strip() or subst_char chars += subst_char return chars, obj.end else: return obj.encode("ASCII", "safe_asciize") codecs.register_error("safe_asciize", safe_asciize) def escape(obj): """ Turn unicode chars into escape codes. This function either takes a string or an exception as argument (when used as error handler for encode or decode). """ chars = u"" if isinstance(obj, Exception): for char in obj.object[obj.start:obj.end]: chars += subst.get(char, u"\\u" % hex(ord(char))[2:]) return chars, obj.end else: return obj.encode("ASCII", "escape") codecs.register_error("escape", escape) def make_ascii_printable(text, subst=""): return "".join([char if char in ascii_printable else subst for char in text]) def make_filename_safe(unistr, encoding=fs_enc, subst="_", concat=True): """ Make sure unicode string is safe to use as filename. I.e. turn characters that are invalid in the filesystem encoding into ASCII equivalents and replace characters that are invalid in filenames with substitution character. """ # Turn characters that are invalid in the filesystem encoding into ASCII # substitution character '?' # NOTE that under Windows, encoding with the filesystem encoding may # substitute some characters even in "strict" replacement mode depending # on the Windows language setting for non-Unicode programs! (Python 2.x # under Windows supports Unicode by wrapping the win32 ASCII API, so it is # a non-Unicode program from that point of view. This problem presumably # doesn't exist with Python 3.x which uses the win32 Unicode API) unidec = unistr.encode(encoding, "replace").decode(encoding) # Replace substitution character '?' with ASCII equivalent of original char uniout = u"" for i, c in enumerate(unidec): if c == u"?": # Note: We prevent IndexError by using slice notation which will # return an empty string if unistr should be somehow shorter than # unidec. Technically, this should never happen, but who knows # what hidden bugs and quirks may linger in the Python 2.x Unicode # implementation... c = safe_asciize(unistr[i:i + 1]) uniout += c # Remove invalid chars pattern = r"[\\/:*?\"<>|]" if concat: pattern += "+" uniout = re.sub(pattern, subst, uniout) return uniout def normalencode(unistr, form="NFKD", encoding="ASCII", errors="ignore"): """ Return encoded normal form of unicode string """ return unicodedata.normalize(form, unistr).encode(encoding, errors) def center(text, width = None): """ Center (mono-spaced) text. If no width is given, the longest line (after breaking at each newline) is used as max width. """ text = text.split("\n") if width is None: width = 0 for line in text: if len(line) > width: width = len(line) i = 0 for line in text: text[i] = line.center(width) i += 1 return "\n".join(text) def create_replace_function(template, values): """ Create a replace function for use with e.g. re.sub """ def replace_function(match, template=template, values=values): template = match.expand(template) return template % values return replace_function def ellipsis(text, maxlen=64, pos="r"): """ Truncate text to maxlen characters and add elipsis if it was longer. Elipsis position can be 'm' (middle) or 'r' (right). """ if len(text) <= maxlen: return text if pos == "r": return text[:maxlen - 1] + u"\u2026" elif pos == "m": return text[:maxlen / 2] + u"\u2026" + text[-maxlen / 2 + 1:] def hexunescape(match): """ To be used with re.sub """ return unichr(int(match.group(1), 16)) def universal_newlines(txt): """ Return txt with all new line formats converted to POSIX newlines. """ return txt.replace("\r\n", "\n").replace("\r", "\n") def replace_control_chars(txt, replacement=" ", collapse=False): """ Replace all control characters. Default replacement character is ' ' (space). If the 'collapse' keyword argument evaluates to True, consecutive replacement characters are collapsed to a single one. """ txt = strtr(txt, dict(zip(control_chars, [replacement] * len(control_chars)))) if collapse: while replacement * 2 in txt: txt = txt.replace(replacement * 2, replacement) return txt def safe_basestring(obj): """ Return a unicode or string representation of obj Return obj if isinstance(obj, basestring). Otherwise, return unicode(obj), string(obj), or repr(obj), whichever succeeds first. """ if isinstance(obj, env_errors): # Possible variations of environment-type errors: # - instance with 'errno', 'strerror', 'filename' and 'args' attributes # (created by EnvironmentError with three arguments) # NOTE: The 'args' attribute will contain only the first two arguments # - instance with 'errno', 'strerror' and 'args' attributes # (created by EnvironmentError with two arguments) # - instance with just 'args' attribute # (created by EnvironmentError with one or more than three arguments) # - urllib2.URLError with empty 'args' attribute but 'reason' and # 'filename' attributes # - pywintypes.error with 'funcname', 'message', 'strerror', 'winerror' # and 'args' attributes if hasattr(obj, "reason"): if isinstance(obj.reason, basestring): obj.args = (obj.reason, ) else: obj.args = obj.reason error = [] if getattr(obj, "winerror", None) is not None: # pywintypes.error or WindowsError error.append("[Windows Error %s]" % obj.winerror) elif getattr(obj, "errno", None) is not None: error.append("[Errno %s]" % obj.errno) if getattr(obj, "strerror", None) is not None: if getattr(obj, "filename", None) is not None: error.append(obj.strerror.rstrip(":.") + ":") elif getattr(obj, "funcname", None) is not None: # pywintypes.error error.append(obj.funcname + ": " + obj.strerror) else: error.append(obj.strerror) if not error: error = list(obj.args) if getattr(obj, "filename", None) is not None: error.append(obj.filename) error = [safe_unicode(arg) for arg in error] obj = " ".join(error) elif isinstance(obj, KeyError) and obj.args: obj = "Key does not exist: " + repr(obj.args[0]) oobj = obj if not isinstance(obj, basestring): try: obj = unicode(obj) except UnicodeDecodeError: try: obj = str(obj) except UnicodeEncodeError: obj = repr(obj) if isinstance(oobj, Exception) and not isinstance(oobj, Warning): if obj and oobj.__class__.__name__ in dir(exceptions): obj = obj[0].capitalize() + obj[1:] module = getattr(oobj, "__module__", "") package = safe_basestring.__module__.split(".")[0] # Our own package if not module.startswith(package + "."): clspth = ".".join(filter(None, [module, oobj.__class__.__name__])) if not obj.startswith(clspth + ":") and obj != clspth: obj = ": ".join(filter(None, [clspth, obj])) return obj def safe_str(obj, enc=fs_enc, errors="replace"): """ Return string representation of obj """ obj = safe_basestring(obj) if isinstance(obj, unicode): return obj.encode(enc, errors) else: return obj def safe_unicode(obj, enc=fs_enc, errors="replace"): """ Return unicode representation of obj """ obj = safe_basestring(obj) if isinstance(obj, unicode): return obj else: return obj.decode(enc, errors) def strtr(txt, replacements): """ String multi-replace, a bit like PHP's strtr. replacements can be a dict or a list. If it is a list, all items are replaced with the empty string (""). """ if hasattr(replacements, "iteritems"): replacements = replacements.iteritems() elif isinstance(replacements, basestring): replacements = zip(replacements, [""] * len(replacements)) for srch, sub in replacements: txt = txt.replace(srch, sub) return txt def wrap(text, width = 70): """ A word-wrap function that preserves existing line breaks and spaces. Expects that existing line breaks are posix newlines (\\n). """ return reduce(lambda line, word, width=width: '%s%s%s' % (line, ' \n'[(len(line)-line.rfind('\n')-1 + len(word.split('\n',1)[0] ) >= width)], word), text.split(' ') ) def test(): for k, v in subst.iteritems(): print k, v if __name__ == "__main__": test() DisplayCAL-3.5.0.0/DisplayCAL/util_win.py0000644000076500000000000003235213242301247017632 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import ctypes import _winreg import struct import sys import pywintypes import win32api import win32con import win32process import winerror from win32com.shell import shell as win32com_shell from ctypes import POINTER, byref, sizeof, windll from ctypes.wintypes import HANDLE, DWORD, LPWSTR from util_os import quote_args if not hasattr(ctypes, "c_bool"): # Python 2.5 ctypes.c_bool = ctypes.c_int if sys.getwindowsversion() >= (6, ): LPDWORD = POINTER(DWORD) PROCESS_QUERY_LIMITED_INFORMATION = 0x1000 kernel32 = windll.kernel32 QueryFullProcessImageNameW = kernel32.QueryFullProcessImageNameW QueryFullProcessImageNameW.argtypes = [HANDLE, DWORD, LPWSTR, LPDWORD] QueryFullProcessImageNameW.restype = bool try: psapi = ctypes.windll.psapi except WindowsError: psapi = None # DISPLAY_DEVICE structure, StateFlags member # http://msdn.microsoft.com/en-us/library/dd183569%28v=vs.85%29.aspx # wingdi.h # Flags for parent devices DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = 0x1 DISPLAY_DEVICE_MIRRORING_DRIVER = 0x8 # Represents a pseudo device used to mirror application drawing for remoting or other purposes. # An invisible pseudo monitor is associated with this device. # For example, NetMeeting uses it. Note that GetSystemMetrics (SM_MONITORS) only accounts for visible display monitors. DISPLAY_DEVICE_MODESPRUNED = 0x8000000 # The device has more display modes than its output devices support. DISPLAY_DEVICE_PRIMARY_DEVICE = 0x4 # The primary desktop is on the device. # For a system with a single display card, this is always set. # For a system with multiple display cards, only one device can have this set. DISPLAY_DEVICE_REMOVABLE = 0x20 # The device is removable; it cannot be the primary display. DISPLAY_DEVICE_VGA_COMPATIBLE = 0x10 # The device is VGA compatible. DISPLAY_DEVICE_DISCONNECT = 0x2000000 DISPLAY_DEVICE_MULTI_DRIVER = 0x2 DISPLAY_DEVICE_REMOTE = 0x4000000 # Flags for child devices DISPLAY_DEVICE_ACTIVE = 0x1 # DISPLAY_DEVICE_ACTIVE specifies whether a monitor is presented as being "on" by the respective GDI view. # Windows Vista: EnumDisplayDevices will only enumerate monitors that can be presented as being "on." DISPLAY_DEVICE_ATTACHED = 0x2 # MONITORINFO structure, dwFlags member # https://msdn.microsoft.com/de-de/library/windows/desktop/dd145065(v=vs.85).aspx MONITORINFOF_PRIMARY = 0x1 # Icm.h CLASS_MONITOR = struct.unpack("!L", "mntr")[0] CLASS_PRINTER = struct.unpack("!L", "prtr")[0] CLASS_SCANNER = struct.unpack("!L", "scnr")[0] # ShellExecute SEE_MASK_FLAG_NO_UI = 0x00000400 SEE_MASK_NOASYNC = 0x00000100 SEE_MASK_NOCLOSEPROCESS = 0x00000040 SEE_MASK_WAITFORINPUTIDLE = 0x02000000 def _get_icm_display_device_key(devicekey): monkey = devicekey.split("\\")[-2:] # pun totally intended subkey = "\\".join(["Software", "Microsoft", "Windows NT", "CurrentVersion", "ICM", "ProfileAssociations", "Display"] + monkey) return _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, subkey) def _get_mscms_dll_handle(): try: return ctypes.windll.mscms except WindowsError: return None def calibration_management_isenabled(): """ Check if calibration is enabled under Windows 7 """ if sys.getwindowsversion() < (6, 1): # Windows XP and Vista don't have calibration management return False if False: # Using registry - NEVER # Also, does not work! key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ICM\Calibration") return bool(_winreg.QueryValueEx(key, "CalibrationManagementEnabled")[0]) else: # Using ctypes mscms = _get_mscms_dll_handle() pbool = ctypes.pointer(ctypes.c_bool()) if not mscms or not mscms.WcsGetCalibrationManagementState(pbool): return return bool(pbool.contents) def disable_calibration_management(): """ Disable calibration loading under Windows 7 """ enable_calibration_management(False) def disable_per_user_profiles(display_no=0): """ Disable per user profiles under Vista/Windows 7 """ enable_per_user_profiles(False, display_no) def enable_calibration_management(enable=True): """ Enable calibration loading under Windows 7 """ if sys.getwindowsversion() < (6, 1): raise NotImplementedError("Calibration Management is only available " "in Windows 7 or later") if False: # Using registry - NEVER # Also, does not work! key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ICM\Calibration", _winreg.KEY_SET_VALUE) _winreg.SetValueEx(key, "CalibrationManagementEnabled", 0, _winreg.REG_DWORD, int(enable)) else: # Using ctypes (must be called with elevated permissions) mscms = _get_mscms_dll_handle() if not mscms: return False if not mscms.WcsSetCalibrationManagementState(enable): raise get_windows_error(ctypes.windll.kernel32.GetLastError()) return True def enable_per_user_profiles(enable=True, display_no=0, devicekey=None): """ Enable per user profiles under Vista/Windows 7 """ if sys.getwindowsversion() < (6, ): # Windows XP doesn't have per-user profiles raise NotImplementedError("Per-user profiles are only available " "in Windows Vista, 7 or later") if not devicekey: device = get_display_device(display_no) if device: devicekey = device.DeviceKey if devicekey: if False: # Using registry - NEVER key = _get_icm_display_device_key(devicekey) _winreg.SetValueEx(key, "UsePerUserProfiles", 0, _winreg.REG_DWORD, int(enable)) else: # Using ctypes mscms = _get_mscms_dll_handle() if not mscms: return False if not mscms.WcsSetUsePerUserProfiles(unicode(devicekey), CLASS_MONITOR, enable): raise get_windows_error(ctypes.windll.kernel32.GetLastError()) return True def get_display_devices(devicename): """ Get all display devices of an output (there can be several) Return value: list of display devices Example usage: get_display_devices('\\\\.\\DISPLAY1') devicename = '\\\\.\\DISPLAYn' where n is a positive integer starting at 1 """ devices = [] n = 0 while True: try: devices.append(win32api.EnumDisplayDevices(devicename, n)) except pywintypes.error: break n += 1 return devices def get_first_display_device(devicename, exception_cls=pywintypes.error): """ Get the first display of device . """ try: return win32api.EnumDisplayDevices(devicename, 0) except exception_cls: pass def get_active_display_device(devicename, devices=None): """ Get active display device of an output (there can only be one per output) Return value: display device object or None Example usage: get_active_display_device('\\\\.\\DISPLAY1') devicename = '\\\\.\\DISPLAYn' where n is a positive integer starting at 1 """ if not devices: devices = get_display_devices(devicename) for device in devices: if (device.StateFlags & DISPLAY_DEVICE_ACTIVE and (len(devices) == 1 or device.StateFlags & DISPLAY_DEVICE_ATTACHED)): return device def get_display_device(display_no=0, use_active_display_device=False, exception_cls=pywintypes.error): # The ordering will work as long as Argyll continues using # EnumDisplayMonitors monitors = get_real_display_devices_info() moninfo = monitors[display_no] if use_active_display_device: return get_active_display_device(moninfo["Device"]) else: return get_first_display_device(moninfo["Device"], exception_cls) def get_process_filename(pid, handle=0): if sys.getwindowsversion() >= (6, ): flags = PROCESS_QUERY_LIMITED_INFORMATION else: flags = win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ if not handle: handle = win32api.OpenProcess(flags, False, pid) try: if sys.getwindowsversion() >= (6, ): dwSize = win32con.MAX_PATH while True: dwFlags = 0 # The name should use the Win32 path format lpdwSize = DWORD(dwSize) lpExeName = ctypes.create_unicode_buffer("", lpdwSize.value + 1) success = QueryFullProcessImageNameW(int(handle), dwFlags, lpExeName, byref(lpdwSize)) if success and 0 < lpdwSize.value < dwSize: break error = kernel32.GetLastError() if error != winerror.ERROR_INSUFFICIENT_BUFFER: raise ctypes.WinError(error) dwSize = dwSize + 256 if dwSize > 0x1000: # This prevents an infinite loop under Windows Server 2008 # if the path contains spaces, see # http://msdn.microsoft.com/en-us/library/ms684919(VS.85).aspx#4 raise ctypes.WinError(error) filename = lpExeName.value else: filename = win32process.GetModuleFileNameEx(handle, 0) finally: win32api.CloseHandle(handle) return filename def get_file_info(filename): """ Get exe/dll file information """ info = {"FileInfo": None, "StringFileInfo": {}, "FileVersion": None} finfo = win32api.GetFileVersionInfo(filename, "\\") info["FileInfo"] = finfo info["FileVersion"] = "%i.%i.%i.%i" % (finfo["FileVersionMS"] / 65536, finfo["FileVersionMS"] % 65536, finfo["FileVersionLS"] / 65536, finfo["FileVersionLS"] % 65536) for lcid, codepage in win32api.GetFileVersionInfo(filename, "\\VarFileInfo\\Translation"): info["StringFileInfo"][lcid, codepage] = {} for name in ["Comments", "CompanyName", "FileDescription", "FileVersion", "InternalName", "LegalCopyright", "LegalTrademarks", "OriginalFilename", "PrivateBuild", "ProductName", "ProductVersion", "SpecialBuild"]: value = win32api.GetFileVersionInfo(filename, u"\\StringFileInfo\\%04X%04X\\%s" % (lcid, codepage, name)) if value is not None: info["StringFileInfo"][lcid, codepage][name] = value return info def get_pids(): """ Get PIDs of all running processes """ pids_count = 1024 while True: pids = (DWORD * pids_count)() pids_size = sizeof(pids) bytes = DWORD() if not psapi.EnumProcesses(byref(pids), pids_size, byref(bytes)): raise get_windows_error(ctypes.windll.kernel32.GetLastError()) if bytes.value >= pids_size: pids_count *= 2 continue count = bytes.value / (pids_size / pids_count) return filter(None, pids[:count]) def get_real_display_devices_info(): """ Return info for real (non-virtual) devices """ # See Argyll source spectro/dispwin.c MonitorEnumProc, get_displays monitors = [] for monitor in win32api.EnumDisplayMonitors(None, None): try: moninfo = win32api.GetMonitorInfo(monitor[0]) except pywintypes.error: pass else: if moninfo and not moninfo["Device"].startswith("\\\\.\\DISPLAYV"): monitors.append(moninfo) return monitors def get_windows_error(errorcode): return ctypes.WinError(errorcode) def per_user_profiles_isenabled(display_no=0, devicekey=None): """ Check if per user profiles is enabled under Vista/Windows 7 """ if sys.getwindowsversion() < (6, ): # Windows XP doesn't have per-user profiles return False if not devicekey: device = get_display_device(display_no) if device: devicekey = device.DeviceKey if devicekey: if False: # Using registry - NEVER key = _get_icm_display_device_key(devicekey) return bool(_winreg.QueryValueEx(key, "UsePerUserProfiles")[0]) else: # Using ctypes mscms = _get_mscms_dll_handle() pbool = ctypes.pointer(ctypes.c_bool()) if not mscms or not mscms.WcsGetUsePerUserProfiles(unicode(devicekey), CLASS_MONITOR, pbool): return return bool(pbool.contents) def run_as_admin(cmd, args, close_process=True, async=False, wait_for_idle=False, show=True): """ Run command with elevated privileges. This is a wrapper around ShellExecuteEx. Returns a dictionary with hInstApp and hProcess members. """ return shell_exec(cmd, args, "runas", close_process, async, wait_for_idle, show) def shell_exec(filename, args, operation="open", close_process=True, async=False, wait_for_idle=False, show=True): """ Run command. This is a wrapper around ShellExecuteEx. Returns a dictionary with hInstApp and hProcess members. """ flags = SEE_MASK_FLAG_NO_UI if not close_process: flags |= SEE_MASK_NOCLOSEPROCESS if not async: flags |= SEE_MASK_NOASYNC if wait_for_idle: flags |= SEE_MASK_WAITFORINPUTIDLE params = " ".join(quote_args(args)) if show: show = win32con.SW_SHOWNORMAL else: show = win32con.SW_HIDE return win32com_shell.ShellExecuteEx(fMask=flags, lpVerb=operation, lpFile=filename, lpParameters=params, nShow=show) def win_ver(): """ Get Windows version info """ csd = sys.getwindowsversion()[-1] # Use the registry to get product name, e.g. 'Windows 7 Ultimate'. # Not recommended, but we don't care. pname = "Windows" key = None try: key = _winreg.OpenKeyEx(_winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion") pname = _winreg.QueryValueEx(key, "ProductName")[0] except Exception, e: pass finally: if key: _winreg.CloseKey(key) return pname, csd if __name__ == "__main__": if "calibration" in sys.argv[1:]: if "enable" in sys.argv[1:] or "disable" in sys.argv[1:]: enable_calibration_management(sys.argv[1:][-1] != "disable") print calibration_management_isenabled() elif "per_user_profiles" in sys.argv[1:]: if "enable" in sys.argv[1:] or "disable" in sys.argv[1:]: enable_per_user_profiles(sys.argv[1:][-1] != "disable") print per_user_profiles_isenabled() DisplayCAL-3.5.0.0/DisplayCAL/util_x.py0000644000076500000000000000130613221373200017272 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import os import warnings def get_display(display_name=None): """ Parse X display name and return (hostname, display number, screen number) """ if not display_name: display_name = os.getenv("DISPLAY", ":0.0") display_parts = display_name.split(":") hostname = display_parts[0] display, screen = 0, 0 if len(display_parts) > 1: try: display_screen = tuple(int(n) for n in display_parts[1].split(".")) except ValueError: warnings.warn("invalid value for display name: %r" % display_name, Warning) else: display = display_screen[0] if len(display_screen) > 1: screen = display_screen[1] else: screen = 0 return hostname, display, screen DisplayCAL-3.5.0.0/DisplayCAL/util_xml.py0000644000076500000000000000235012665102054017633 0ustar devwheel00000000000000# -*- coding: utf-8 -*- def dict2xml(d, elementname="element", pretty=True, allow_attributes=True, level=0): indent = pretty and "\t" * level or "" xml = [] attributes = [] children = [] if isinstance(d, (dict, list)): start_tag = [] start_tag.append(indent + "<" + elementname) if isinstance(d, dict): for key, value in d.iteritems(): if isinstance(value, (dict, list)) or not allow_attributes: children.append(dict2xml(value, key, pretty, allow_attributes, level + 1)) else: if pretty: attributes.append("\n" + indent) attributes.append(' %s="%s"' % (key, escape(unicode(value)))) else: for value in d: children.append(dict2xml(value, "item", pretty, allow_attributes, level + 1)) start_tag.extend(attributes) start_tag.append(children and ">" or "/>") xml.append("".join(start_tag)) if children: for child in children: xml.append(child) xml.append("%s" % (indent, elementname)) else: xml.append("%s<%s>%s" % (indent, elementname, escape(unicode(d)), elementname)) return (pretty and "\n" or "").join(xml) def escape(xml): return xml.replace("&", "&").replace("<", "<").replace(">", ">").replace('"', """) DisplayCAL-3.5.0.0/DisplayCAL/webwin.py0000644000076500000000000000674413113255301017275 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Re-implementation of Argyll's webwin in pure python. """ import BaseHTTPServer from StringIO import StringIO import shutil import threading import time from urllib import unquote from meta import name as appname, version as appversion WEBDISP_HTML = r""" %s Web Display
    """ % appname WEBDISP_JS = r"""if (typeof XMLHttpRequest == "undefined") { XMLHttpRequest = function () { try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) {} try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e) {} try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} throw new Error("This browser does not support XMLHttpRequest."); }; } var cpat = ["#000"]; var oXHR; var pat; function XHR_request() { oXHR.open("GET", "/ajax/messages?" + encodeURIComponent(cpat.join("|") + "|" + Math.random()), true); oXHR.onreadystatechange = XHR_response; oXHR.send(); } function XHR_response() { if (oXHR.readyState != 4) return; if (oXHR.status != 200) { return; } var rt = oXHR.responseText; if (rt.charAt(0) == '\r' && rt.charAt(1) == '\n') rt = rt.slice(2); rt = rt.split("|") if (rt[0] && cpat != rt) { cpat = rt; pat.style.background = rt[1] ? rt[0] : "transparent"; // Older dispwin compat document.body.style.background = (rt[1] || rt[0]); // Older dispwin compat if (rt.length == 6) { pat.style.left = (rt[2] * 100) + "%"; pat.style.top = (rt[3] * 100) + "%"; pat.style.width = (rt[4] * 100) + "%"; pat.style.height = (rt[5] * 100) + "%"; } } setTimeout(XHR_request, 50); } window.onload = function() { pat = document.getElementById("pattern"); oXHR = new XMLHttpRequest(); XHR_request(); }; """ class WebWinHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): """ Simple HTTP request handler with GET and HEAD commands. """ server_version = appname + "-WebWinHTTP/" + appversion def do_GET(self): """Serve a GET request.""" s = self.send_head() if s: self.wfile.write(s) def do_HEAD(self): """Serve a HEAD request.""" self.send_head() def log_message(self, format, *args): pass def send_head(self): """Common code for GET and HEAD commands. This sends the response code and MIME headers. Return value is either a string (which has to be written to the outputfile by the caller unless the command was HEAD), or None, in which case the caller has nothing further to do. """ if self.path == "/": s = WEBDISP_HTML ctype = "text/html; charset=UTF-8" elif self.path == "/webdisp.js": s = WEBDISP_JS ctype = "application/javascript" elif self.path.startswith("/ajax/messages?"): curpat = "|".join(unquote(self.path.split("?").pop()).split("|")[:6]) while (self.server.patterngenerator.listening and self.server.patterngenerator.pattern == curpat): time.sleep(0.05) s = self.server.patterngenerator.pattern ctype = "text/plain; charset=UTF-8" else: self.send_error(404) return if self.server.patterngenerator.listening: try: self.send_response(200) self.send_header("Cache-Control", "no-cache") self.send_header("Content-Type", ctype) self.end_headers() return s except: pass DisplayCAL-3.5.0.0/DisplayCAL/wexpect.py0000644000076500000000000035077013104456141017467 0ustar devwheel00000000000000"""Pexpect is a Python module for spawning child applications and controlling them automatically. Pexpect can be used for automating interactive applications such as ssh, ftp, passwd, telnet, etc. It can be used to a automate setup scripts for duplicating software package installations on different servers. It can be used for automated software testing. Pexpect is in the spirit of Don Libes' Expect, but Pexpect is pure Python. Other Expect-like modules for Python require TCL and Expect or require C extensions to be compiled. Pexpect does not use C, Expect, or TCL extensions. It should work on any platform that supports the standard Python pty module. The Pexpect interface focuses on ease of use so that simple tasks are easy. There are two main interfaces to Pexpect -- the function, run() and the class, spawn. You can call the run() function to execute a command and return the output. This is a handy replacement for os.system(). For example:: pexpect.run('ls -la') The more powerful interface is the spawn class. You can use this to spawn an external child command and then interact with the child by sending lines and expecting responses. For example:: child = pexpect.spawn('scp foo myname@host.example.com:.') child.expect ('Password:') child.sendline (mypassword) This works even for commands that ask for passwords or other input outside of the normal stdio streams. Credits: Noah Spurrier, Richard Holden, Marco Molteni, Kimberley Burchett, Robert Stone, Hartmut Goebel, Chad Schroeder, Erick Tryzelaar, Dave Kirby, Ids vander Molen, George Todd, Noel Taylor, Nicolas D. Cesar, Alexander Gattin, Geoffrey Marshall, Francisco Lourenco, Glen Mabey, Karthik Gurusamy, Fernando Perez, Corey Minyard, Jon Cohen, Guillaume Chazarain, Andrew Ryan, Nick Craig-Wood, Andrew Stone, Jorgen Grahn (Let me know if I forgot anyone.) Free, open source, and all that good stuff. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Pexpect Copyright (c) 2008 Noah Spurrier http://pexpect.sourceforge.net/ $Id: pexpect.py 507 2007-12-27 02:40:52Z noah $ """ import os, sys, time import select import string import re import struct import types import errno import traceback import signal import subprocess if sys.platform != 'win32': import pty import tty import termios import resource import fcntl else: from StringIO import StringIO from ctypes import windll import pywintypes from win32com.shell.shellcon import CSIDL_APPDATA from win32com.shell.shell import SHGetSpecialFolderPath from win32console import * from win32process import * from win32con import * from win32gui import * import win32api import win32file import winerror __version__ = '2.3' __revision__ = '$Revision: 399 $' __all__ = ['ExceptionPexpect', 'EOF', 'TIMEOUT', 'spawn', 'run', 'which', 'split_command_line', '__version__', '__revision__'] from meta import name as appname # Exception classes used by this module. class ExceptionPexpect(Exception): """Base class for all exceptions raised by this module. """ def __init__(self, value): self.value = value def __str__(self): return str(self.value) def get_trace(self): """This returns an abbreviated stack trace with lines that only concern the caller. In other words, the stack trace inside the Pexpect module is not included. """ tblist = traceback.extract_tb(sys.exc_info()[2]) #tblist = filter(self.__filter_not_pexpect, tblist) tblist = [item for item in tblist if self.__filter_not_pexpect(item)] tblist = traceback.format_list(tblist) return ''.join(tblist) def __filter_not_pexpect(self, trace_list_item): """This returns True if list item 0 the string 'pexpect.py' in it. """ if trace_list_item[0].find('pexpect.py') == -1: return True else: return False class EOF(ExceptionPexpect): """Raised when EOF is read from a child. This usually means the child has exited.""" class TIMEOUT(ExceptionPexpect): """Raised when a read time exceeds the timeout. """ ##class TIMEOUT_PATTERN(TIMEOUT): ## """Raised when the pattern match time exceeds the timeout. ## This is different than a read TIMEOUT because the child process may ## give output, thus never give a TIMEOUT, but the output ## may never match a pattern. ## """ ##class MAXBUFFER(ExceptionPexpect): ## """Raised when a scan buffer fills before matching an expected pattern.""" def run (command, timeout=-1, withexitstatus=False, events=None, extra_args=None, logfile=None, cwd=None, env=None): """ This function runs the given command; waits for it to finish; then returns all output as a string. STDERR is included in output. If the full path to the command is not given then the path is searched. Note that lines are terminated by CR/LF (\\r\\n) combination even on UNIX-like systems because this is the standard for pseudo ttys. If you set 'withexitstatus' to true, then run will return a tuple of (command_output, exitstatus). If 'withexitstatus' is false then this returns just command_output. The run() function can often be used instead of creating a spawn instance. For example, the following code uses spawn:: from pexpect import * child = spawn('scp foo myname@host.example.com:.') child.expect ('(?i)password') child.sendline (mypassword) The previous code can be replace with the following:: from pexpect import * run ('scp foo myname@host.example.com:.', events={'(?i)password': mypassword}) Examples ======== Start the apache daemon on the local machine:: from pexpect import * run ("/usr/local/apache/bin/apachectl start") Check in a file using SVN:: from pexpect import * run ("svn ci -m 'automatic commit' my_file.py") Run a command and capture exit status:: from pexpect import * (command_output, exitstatus) = run ('ls -l /bin', withexitstatus=1) Tricky Examples =============== The following will run SSH and execute 'ls -l' on the remote machine. The password 'secret' will be sent if the '(?i)password' pattern is ever seen:: run ("ssh username@machine.example.com 'ls -l'", events={'(?i)password':'secret\\n'}) This will start mencoder to rip a video from DVD. This will also display progress ticks every 5 seconds as it runs. For example:: from pexpect import * def print_ticks(d): print d['event_count'], run ("mencoder dvd://1 -o video.avi -oac copy -ovc copy", events={TIMEOUT:print_ticks}, timeout=5) The 'events' argument should be a dictionary of patterns and responses. Whenever one of the patterns is seen in the command out run() will send the associated response string. Note that you should put newlines in your string if Enter is necessary. The responses may also contain callback functions. Any callback is function that takes a dictionary as an argument. The dictionary contains all the locals from the run() function, so you can access the child spawn object or any other variable defined in run() (event_count, child, and extra_args are the most useful). A callback may return True to stop the current run process otherwise run() continues until the next event. A callback may also return a string which will be sent to the child. 'extra_args' is not used by directly run(). It provides a way to pass data to a callback function through run() through the locals dictionary passed to a callback. """ if timeout == -1: child = spawn(command, maxread=2000, logfile=logfile, cwd=cwd, env=env) else: child = spawn(command, timeout=timeout, maxread=2000, logfile=logfile, cwd=cwd, env=env) if events is not None: patterns = events.keys() responses = events.values() else: patterns=None # We assume that EOF or TIMEOUT will save us. responses=None child_result_list = [] event_count = 0 while 1: try: index = child.expect (patterns) if type(child.after) in types.StringTypes: child_result_list.append(child.before + child.after) else: # child.after may have been a TIMEOUT or EOF, so don't cat those. child_result_list.append(child.before) if type(responses[index]) in types.StringTypes: child.send(responses[index]) elif type(responses[index]) is types.FunctionType: callback_result = responses[index](locals()) sys.stdout.flush() if type(callback_result) in types.StringTypes: child.send(callback_result) elif callback_result: break else: raise TypeError ('The callback must be a string or function type.') event_count = event_count + 1 except TIMEOUT, e: child_result_list.append(child.before) break except EOF, e: child_result_list.append(child.before) break child_result = ''.join(child_result_list) if withexitstatus: child.close() return (child_result, child.exitstatus) else: return child_result def spawn(command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None, codepage=None, columns=None, rows=None): log('=' * 80) log('Buffer size: %s' % maxread) if searchwindowsize: log('Search window size: %s' % searchwindowsize) log('Timeout: %ss' % timeout) if env: log('Environment:') for name in env: log('\t%s=%s' % (name, env[name])) if cwd: log('Working directory: %s' % cwd) log('Spawning %s' % join_args([command] + args)) if sys.platform == 'win32': return spawn_windows(command, args, timeout, maxread, searchwindowsize, logfile, cwd, env, codepage, columns, rows) else: return spawn_unix(command, args, timeout, maxread, searchwindowsize, logfile, cwd, env) class spawn_unix (object): """This is the main class interface for Pexpect. Use this class to start and control child applications. """ def __init__(self, command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None): """This is the constructor. The command parameter may be a string that includes a command and any arguments to the command. For example:: child = pexpect.spawn ('/usr/bin/ftp') child = pexpect.spawn ('/usr/bin/ssh user@example.com') child = pexpect.spawn ('ls -latr /tmp') You may also construct it with a list of arguments like so:: child = pexpect.spawn ('/usr/bin/ftp', []) child = pexpect.spawn ('/usr/bin/ssh', ['user@example.com']) child = pexpect.spawn ('ls', ['-latr', '/tmp']) After this the child application will be created and will be ready to talk to. For normal use, see expect() and send() and sendline(). Remember that Pexpect does NOT interpret shell meta characters such as redirect, pipe, or wild cards (>, |, or *). This is a common mistake. If you want to run a command and pipe it through another command then you must also start a shell. For example:: child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > log_list.txt"') child.expect(pexpect.EOF) The second form of spawn (where you pass a list of arguments) is useful in situations where you wish to spawn a command and pass it its own argument list. This can make syntax more clear. For example, the following is equivalent to the previous example:: shell_cmd = 'ls -l | grep LOG > log_list.txt' child = pexpect.spawn('/bin/bash', ['-c', shell_cmd]) child.expect(pexpect.EOF) The maxread attribute sets the read buffer size. This is maximum number of bytes that Pexpect will try to read from a TTY at one time. Setting the maxread size to 1 will turn off buffering. Setting the maxread value higher may help performance in cases where large amounts of output are read back from the child. This feature is useful in conjunction with searchwindowsize. The searchwindowsize attribute sets the how far back in the incomming seach buffer Pexpect will search for pattern matches. Every time Pexpect reads some data from the child it will append the data to the incomming buffer. The default is to search from the beginning of the imcomming buffer each time new data is read from the child. But this is very inefficient if you are running a command that generates a large amount of data where you want to match The searchwindowsize does not effect the size of the incomming data buffer. You will still have access to the full buffer after expect() returns. The logfile member turns on or off logging. All input and output will be copied to the given file object. Set logfile to None to stop logging. This is the default. Set logfile to sys.stdout to echo everything to standard output. The logfile is flushed after each write. Example log input and output to a file:: child = pexpect.spawn('some_command') fout = file('mylog.txt','w') child.logfile = fout Example log to stdout:: child = pexpect.spawn('some_command') child.logfile = sys.stdout The logfile_read and logfile_send members can be used to separately log the input from the child and output sent to the child. Sometimes you don't want to see everything you write to the child. You only want to log what the child sends back. For example:: child = pexpect.spawn('some_command') child.logfile_read = sys.stdout To separately log output sent to the child use logfile_send:: self.logfile_send = fout The delaybeforesend helps overcome a weird behavior that many users were experiencing. The typical problem was that a user would expect() a "Password:" prompt and then immediately call sendline() to send the password. The user would then see that their password was echoed back to them. Passwords don't normally echo. The problem is caused by the fact that most applications print out the "Password" prompt and then turn off stdin echo, but if you send your password before the application turned off echo, then you get your password echoed. Normally this wouldn't be a problem when interacting with a human at a real keyboard. If you introduce a slight delay just before writing then this seems to clear up the problem. This was such a common problem for many users that I decided that the default pexpect behavior should be to sleep just before writing to the child application. 1/20th of a second (50 ms) seems to be enough to clear up the problem. You can set delaybeforesend to 0 to return to the old behavior. Most Linux machines don't like this to be below 0.03. I don't know why. Note that spawn is clever about finding commands on your path. It uses the same logic that "which" uses to find executables. If you wish to get the exit status of the child you must call the close() method. The exit or signal status of the child will be stored in self.exitstatus or self.signalstatus. If the child exited normally then exitstatus will store the exit return code and signalstatus will be None. If the child was terminated abnormally with a signal then signalstatus will store the signal value and exitstatus will be None. If you need more detail you can also read the self.status member which stores the status returned by os.waitpid. You can interpret this using os.WIFEXITED/os.WEXITSTATUS or os.WIFSIGNALED/os.TERMSIG. """ self.STDIN_FILENO = pty.STDIN_FILENO self.STDOUT_FILENO = pty.STDOUT_FILENO self.STDERR_FILENO = pty.STDERR_FILENO self.stdin = sys.stdin self.stdout = sys.stdout self.stderr = sys.stderr self.searcher = None self.ignorecase = False self.before = None self.after = None self.match = None self.match_index = None self.terminated = True self.exitstatus = None self.signalstatus = None self.status = None # status returned by os.waitpid self.flag_eof = False self.pid = None self.child_fd = -1 # initially closed self.timeout = timeout self.delimiter = EOF self.logfile = logfile self.logfile_read = None # input from child (read_nonblocking) self.logfile_send = None # output to send (send, sendline) self.maxread = maxread # max bytes to read at one time into buffer self.buffer = '' # This is the read buffer. See maxread. self.searchwindowsize = searchwindowsize # Anything before searchwindowsize point is preserved, but not searched. # Most Linux machines don't like delaybeforesend to be below 0.03 (30 ms). self.delaybeforesend = 0.05 # Sets sleep time used just before sending data to child. Time in seconds. self.delayafterclose = 0.1 # Sets delay in close() method to allow kernel time to update process status. Time in seconds. self.delayafterterminate = 0.1 # Sets delay in terminate() method to allow kernel time to update process status. Time in seconds. self.softspace = False # File-like object. self.name = '<' + repr(self) + '>' # File-like object. self.encoding = None # File-like object. self.closed = True # File-like object. self.ocwd = os.getcwdu() self.cwd = cwd self.env = env self.__irix_hack = (sys.platform.lower().find('irix')>=0) # This flags if we are running on irix # Solaris uses internal __fork_pty(). All others use pty.fork(). if (sys.platform.lower().find('solaris')>=0) or (sys.platform.lower().find('sunos5')>=0): self.use_native_pty_fork = False else: self.use_native_pty_fork = True # allow dummy instances for subclasses that may not use command or args. if command is None: self.command = None self.args = None self.name = '' else: self._spawn (command, args) def __del__(self): """This makes sure that no system resources are left open. Python only garbage collects Python objects. OS file descriptors are not Python objects, so they must be handled explicitly. If the child file descriptor was opened outside of this class (passed to the constructor) then this does not close it. """ if not self.closed: # It is possible for __del__ methods to execute during the # teardown of the Python VM itself. Thus self.close() may # trigger an exception because os.close may be None. # -- Fernando Perez try: self.close() except AttributeError: pass def __str__(self): """This returns a human-readable string that represents the state of the object. """ s = [] s.append(repr(self)) s.append('version: ' + __version__ + ' (' + __revision__ + ')') s.append('command: ' + str(self.command)) s.append('args: ' + str(self.args)) s.append('searcher: ' + str(self.searcher)) s.append('buffer (last 100 chars): ' + str(self.buffer)[-100:]) s.append('before (last 100 chars): ' + str(self.before)[-100:]) s.append('after: ' + str(self.after)) s.append('match: ' + str(self.match)) s.append('match_index: ' + str(self.match_index)) s.append('exitstatus: ' + str(self.exitstatus)) s.append('flag_eof: ' + str(self.flag_eof)) s.append('pid: ' + str(self.pid)) s.append('child_fd: ' + str(self.child_fd)) s.append('closed: ' + str(self.closed)) s.append('timeout: ' + str(self.timeout)) s.append('delimiter: ' + str(self.delimiter)) s.append('logfile: ' + str(self.logfile)) s.append('logfile_read: ' + str(self.logfile_read)) s.append('logfile_send: ' + str(self.logfile_send)) s.append('maxread: ' + str(self.maxread)) s.append('ignorecase: ' + str(self.ignorecase)) s.append('searchwindowsize: ' + str(self.searchwindowsize)) s.append('delaybeforesend: ' + str(self.delaybeforesend)) s.append('delayafterclose: ' + str(self.delayafterclose)) s.append('delayafterterminate: ' + str(self.delayafterterminate)) return '\n'.join(s) def _spawn(self,command,args=[]): """This starts the given command in a child process. This does all the fork/exec type of stuff for a pty. This is called by __init__. If args is empty then command will be parsed (split on spaces) and args will be set to parsed arguments. """ # The pid and child_fd of this object get set by this method. # Note that it is difficult for this method to fail. # You cannot detect if the child process cannot start. # So the only way you can tell if the child process started # or not is to try to read from the file descriptor. If you get # EOF immediately then it means that the child is already dead. # That may not necessarily be bad because you may haved spawned a child # that performs some task; creates no stdout output; and then dies. # If command is an int type then it may represent a file descriptor. if type(command) == type(0): raise ExceptionPexpect ('Command is an int type. If this is a file descriptor then maybe you want to use fdpexpect.fdspawn which takes an existing file descriptor instead of a command string.') if type (args) != type([]): raise TypeError ('The argument, args, must be a list.') if args == []: self.args = split_command_line(command) self.command = self.args[0] else: self.args = args[:] # work with a copy self.args.insert (0, command) self.command = command command_with_path = which(self.command) if command_with_path is None: raise ExceptionPexpect ('The command was not found or was not executable: %s.' % self.command) self.command = command_with_path self.args[0] = self.command self.name = '<' + ' '.join (self.args) + '>' assert self.pid is None, 'The pid member should be None.' assert self.command is not None, 'The command member should not be None.' if self.use_native_pty_fork: try: self.pid, self.child_fd = pty.fork() except OSError, e: raise ExceptionPexpect('Error! pty.fork() failed: ' + str(e)) else: # Use internal __fork_pty self.pid, self.child_fd = self.__fork_pty() if self.pid == 0: # Child try: self.child_fd = sys.stdout.fileno() # used by setwinsize() self.setwinsize(24, 80) except: # Some platforms do not like setwinsize (Cygwin). # This will cause problem when running applications that # are very picky about window size. # This is a serious limitation, but not a show stopper. pass # Do not allow child to inherit open file descriptors from parent. max_fd = resource.getrlimit(resource.RLIMIT_NOFILE)[0] for i in range (3, max_fd): try: os.close (i) except OSError: pass # I don't know why this works, but ignoring SIGHUP fixes a # problem when trying to start a Java daemon with sudo # (specifically, Tomcat). signal.signal(signal.SIGHUP, signal.SIG_IGN) if self.cwd is not None: os.chdir(self.cwd) try: if self.env is None: os.execv(self.command, self.args) else: os.execvpe(self.command, self.args, self.env) finally: if self.cwd is not None: # Restore the original working dir os.chdir(self.ocwd) # Parent self.terminated = False self.closed = False def __fork_pty(self): """This implements a substitute for the forkpty system call. This should be more portable than the pty.fork() function. Specifically, this should work on Solaris. Modified 10.06.05 by Geoff Marshall: Implemented __fork_pty() method to resolve the issue with Python's pty.fork() not supporting Solaris, particularly ssh. Based on patch to posixmodule.c authored by Noah Spurrier:: http://mail.python.org/pipermail/python-dev/2003-May/035281.html """ parent_fd, child_fd = os.openpty() if parent_fd < 0 or child_fd < 0: raise ExceptionPexpect, "Error! Could not open pty with os.openpty()." pid = os.fork() if pid < 0: raise ExceptionPexpect, "Error! Failed os.fork()." elif pid == 0: # Child. os.close(parent_fd) self.__pty_make_controlling_tty(child_fd) os.dup2(child_fd, 0) os.dup2(child_fd, 1) os.dup2(child_fd, 2) if child_fd > 2: os.close(child_fd) else: # Parent. os.close(child_fd) return pid, parent_fd def __pty_make_controlling_tty(self, tty_fd): """This makes the pseudo-terminal the controlling tty. This should be more portable than the pty.fork() function. Specifically, this should work on Solaris. """ child_name = os.ttyname(tty_fd) # Disconnect from controlling tty if still connected. fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY); if fd >= 0: os.close(fd) os.setsid() # Verify we are disconnected from controlling tty try: fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY); if fd >= 0: os.close(fd) raise ExceptionPexpect, "Error! We are not disconnected from a controlling tty." except: # Good! We are disconnected from a controlling tty. pass # Verify we can open child pty. fd = os.open(child_name, os.O_RDWR); if fd < 0: raise ExceptionPexpect, "Error! Could not open child pty, " + child_name else: os.close(fd) # Verify we now have a controlling tty. fd = os.open("/dev/tty", os.O_WRONLY) if fd < 0: raise ExceptionPexpect, "Error! Could not open controlling tty, /dev/tty" else: os.close(fd) def fileno (self): # File-like object. """This returns the file descriptor of the pty for the child. """ return self.child_fd def close (self, force=True): # File-like object. """This closes the connection with the child application. Note that calling close() more than once is valid. This emulates standard Python behavior with files. Set force to True if you want to make sure that the child is terminated (SIGKILL is sent if the child ignores SIGHUP and SIGINT). """ if not self.closed: self.flush() os.close (self.child_fd) time.sleep(self.delayafterclose) # Give kernel time to update process status. if self.isalive(): if not self.terminate(force): raise ExceptionPexpect ('close() could not terminate the child using terminate()') self.child_fd = -1 self.closed = True #self.pid = None def flush (self): # File-like object. """This does nothing. It is here to support the interface for a File-like object. """ pass def isatty (self): # File-like object. """This returns True if the file descriptor is open and connected to a tty(-like) device, else False. """ return os.isatty(self.child_fd) def waitnoecho (self, timeout=-1): """This waits until the terminal ECHO flag is set False. This returns True if the echo mode is off. This returns False if the ECHO flag was not set False before the timeout. This can be used to detect when the child is waiting for a password. Usually a child application will turn off echo mode when it is waiting for the user to enter a password. For example, instead of expecting the "password:" prompt you can wait for the child to set ECHO off:: p = pexpect.spawn ('ssh user@example.com') p.waitnoecho() p.sendline(mypassword) If timeout is None then this method to block forever until ECHO flag is False. """ if timeout == -1: timeout = self.timeout if timeout is not None: end_time = time.time() + timeout while True: if not self.getecho(): return True if timeout < 0 and timeout is not None: return False if timeout is not None: timeout = end_time - time.time() time.sleep(0.1) def getecho (self): """This returns the terminal echo mode. This returns True if echo is on or False if echo is off. Child applications that are expecting you to enter a password often set ECHO False. See waitnoecho(). """ attr = termios.tcgetattr(self.child_fd) if attr[3] & termios.ECHO: return True return False def setecho (self, state): """This sets the terminal echo mode on or off. Note that anything the child sent before the echo will be lost, so you should be sure that your input buffer is empty before you call setecho(). For example, the following will work as expected:: p = pexpect.spawn('cat') p.sendline ('1234') # We will see this twice (once from tty echo and again from cat). p.expect (['1234']) p.expect (['1234']) p.setecho(False) # Turn off tty echo p.sendline ('abcd') # We will set this only once (echoed by cat). p.sendline ('wxyz') # We will set this only once (echoed by cat) p.expect (['abcd']) p.expect (['wxyz']) The following WILL NOT WORK because the lines sent before the setecho will be lost:: p = pexpect.spawn('cat') p.sendline ('1234') # We will see this twice (once from tty echo and again from cat). p.setecho(False) # Turn off tty echo p.sendline ('abcd') # We will set this only once (echoed by cat). p.sendline ('wxyz') # We will set this only once (echoed by cat) p.expect (['1234']) p.expect (['1234']) p.expect (['abcd']) p.expect (['wxyz']) """ self.child_fd attr = termios.tcgetattr(self.child_fd) if state: attr[3] = attr[3] | termios.ECHO else: attr[3] = attr[3] & ~termios.ECHO # I tried TCSADRAIN and TCSAFLUSH, but these were inconsistent # and blocked on some platforms. TCSADRAIN is probably ideal if it worked. termios.tcsetattr(self.child_fd, termios.TCSANOW, attr) def read_nonblocking (self, size = 1, timeout = -1): """This reads at most size characters from the child application. It includes a timeout. If the read does not complete within the timeout period then a TIMEOUT exception is raised. If the end of file is read then an EOF exception will be raised. If a log file was set using setlog() then all data will also be written to the log file. If timeout is None then the read may block indefinitely. If timeout is -1 then the self.timeout value is used. If timeout is 0 then the child is polled and if there was no data immediately ready then this will raise a TIMEOUT exception. The timeout refers only to the amount of time to read at least one character. This is not effected by the 'size' parameter, so if you call read_nonblocking(size=100, timeout=30) and only one character is available right away then one character will be returned immediately. It will not wait for 30 seconds for another 99 characters to come in. This is a wrapper around os.read(). It uses select.select() to implement the timeout. """ if self.closed: raise ValueError ('I/O operation on closed file in read_nonblocking().') if timeout == -1: timeout = self.timeout # Note that some systems such as Solaris do not give an EOF when # the child dies. In fact, you can still try to read # from the child_fd -- it will block forever or until TIMEOUT. # For this case, I test isalive() before doing any reading. # If isalive() is false, then I pretend that this is the same as EOF. if not self.isalive(): r,w,e = self.__select([self.child_fd], [], [], 0) # timeout of 0 means "poll" if not r: self.flag_eof = True raise EOF ('End Of File (EOF) in read_nonblocking(). Braindead platform.') elif self.__irix_hack: # This is a hack for Irix. It seems that Irix requires a long delay before checking isalive. # This adds a 2 second delay, but only when the child is terminated. r, w, e = self.__select([self.child_fd], [], [], 2) if not r and not self.isalive(): self.flag_eof = True raise EOF ('End Of File (EOF) in read_nonblocking(). Pokey platform.') r,w,e = self.__select([self.child_fd], [], [], timeout) if not r: if not self.isalive(): # Some platforms, such as Irix, will claim that their processes are alive; # then timeout on the select; and then finally admit that they are not alive. self.flag_eof = True raise EOF ('End of File (EOF) in read_nonblocking(). Very pokey platform.') else: raise TIMEOUT ('Timeout exceeded in read_nonblocking().') if self.child_fd in r: try: s = os.read(self.child_fd, size) except OSError, e: # Linux does this self.flag_eof = True raise EOF ('End Of File (EOF) in read_nonblocking(). Exception style platform.') if s == '': # BSD style self.flag_eof = True raise EOF ('End Of File (EOF) in read_nonblocking(). Empty string style platform.') if self.logfile is not None: self.logfile.write (s) self.logfile.flush() if self.logfile_read is not None: self.logfile_read.write (s) self.logfile_read.flush() return s raise ExceptionPexpect ('Reached an unexpected state in read_nonblocking().') def read (self, size = -1): # File-like object. """This reads at most "size" bytes from the file (less if the read hits EOF before obtaining size bytes). If the size argument is negative or omitted, read all data until EOF is reached. The bytes are returned as a string object. An empty string is returned when EOF is encountered immediately. """ if size == 0: return '' if size < 0: self.expect (self.delimiter) # delimiter default is EOF return self.before # I could have done this more directly by not using expect(), but # I deliberately decided to couple read() to expect() so that # I would catch any bugs early and ensure consistant behavior. # It's a little less efficient, but there is less for me to # worry about if I have to later modify read() or expect(). # Note, it's OK if size==-1 in the regex. That just means it # will never match anything in which case we stop only on EOF. cre = re.compile('.{%d}' % size, re.DOTALL) index = self.expect ([cre, self.delimiter]) # delimiter default is EOF if index == 0: return self.after ### self.before should be ''. Should I assert this? return self.before def readline (self, size = -1): # File-like object. """This reads and returns one entire line. A trailing newline is kept in the string, but may be absent when a file ends with an incomplete line. Note: This readline() looks for a \\r\\n pair even on UNIX because this is what the pseudo tty device returns. So contrary to what you may expect you will receive the newline as \\r\\n. An empty string is returned when EOF is hit immediately. Currently, the size argument is mostly ignored, so this behavior is not standard for a file-like object. If size is 0 then an empty string is returned. """ if size == 0: return '' index = self.expect (['\r\n', self.delimiter]) # delimiter default is EOF if index == 0: return self.before + '\r\n' else: return self.before def __iter__ (self): # File-like object. """This is to support iterators over a file-like object. """ return self def next (self): # File-like object. """This is to support iterators over a file-like object. """ result = self.readline() if result == "": raise StopIteration return result def readlines (self, sizehint = -1): # File-like object. """This reads until EOF using readline() and returns a list containing the lines thus read. The optional "sizehint" argument is ignored. """ lines = [] while True: line = self.readline() if not line: break lines.append(line) return lines def write(self, s): # File-like object. """This is similar to send() except that there is no return value. """ self.send (s) def writelines (self, sequence): # File-like object. """This calls write() for each element in the sequence. The sequence can be any iterable object producing strings, typically a list of strings. This does not add line separators There is no return value. """ for s in sequence: self.write (s) def send(self, s): """This sends a string to the child process. This returns the number of bytes written. If a log file was set then the data is also written to the log. """ time.sleep(self.delaybeforesend) if self.logfile is not None: self.logfile.write (s) self.logfile.flush() if self.logfile_send is not None: self.logfile_send.write (s) self.logfile_send.flush() c = os.write(self.child_fd, s) return c def sendline(self, s=''): """This is like send(), but it adds a line feed (os.linesep). This returns the number of bytes written. """ n = self.send(s) n = n + self.send (os.linesep) return n def sendcontrol(self, char): """This sends a control character to the child such as Ctrl-C or Ctrl-D. For example, to send a Ctrl-G (ASCII 7):: child.sendcontrol('g') See also, sendintr() and sendeof(). """ char = char.lower() a = ord(char) if a>=97 and a<=122: a = a - ord('a') + 1 return self.send (chr(a)) d = {'@':0, '`':0, '[':27, '{':27, '\\':28, '|':28, ']':29, '}': 29, '^':30, '~':30, '_':31, '?':127} if char not in d: return 0 return self.send (chr(d[char])) def sendeof(self): """This sends an EOF to the child. This sends a character which causes the pending parent output buffer to be sent to the waiting child program without waiting for end-of-line. If it is the first character of the line, the read() in the user program returns 0, which signifies end-of-file. This means to work as expected a sendeof() has to be called at the beginning of a line. This method does not send a newline. It is the responsibility of the caller to ensure the eof is sent at the beginning of a line. """ ### Hmmm... how do I send an EOF? ###C if ((m = write(pty, *buf, p - *buf)) < 0) ###C return (errno == EWOULDBLOCK) ? n : -1; #fd = sys.stdin.fileno() #old = termios.tcgetattr(fd) # remember current state #attr = termios.tcgetattr(fd) #attr[3] = attr[3] | termios.ICANON # ICANON must be set to recognize EOF #try: # use try/finally to ensure state gets restored # termios.tcsetattr(fd, termios.TCSADRAIN, attr) # if hasattr(termios, 'CEOF'): # os.write (self.child_fd, '%c' % termios.CEOF) # else: # # Silly platform does not define CEOF so assume CTRL-D # os.write (self.child_fd, '%c' % 4) #finally: # restore state # termios.tcsetattr(fd, termios.TCSADRAIN, old) if hasattr(termios, 'VEOF'): char = termios.tcgetattr(self.child_fd)[6][termios.VEOF] else: # platform does not define VEOF so assume CTRL-D char = chr(4) self.send(char) def sendintr(self): """This sends a SIGINT to the child. It does not require the SIGINT to be the first character on a line. """ if hasattr(termios, 'VINTR'): char = termios.tcgetattr(self.child_fd)[6][termios.VINTR] else: # platform does not define VINTR so assume CTRL-C char = chr(3) self.send (char) def eof (self): """This returns True if the EOF exception was ever raised. """ return self.flag_eof def terminate(self, force=False): """This forces a child process to terminate. It starts nicely with SIGHUP and SIGINT. If "force" is True then moves onto SIGKILL. This returns True if the child was terminated. This returns False if the child could not be terminated. """ if not self.isalive(): return True try: self.kill(signal.SIGHUP) time.sleep(self.delayafterterminate) if not self.isalive(): return True self.kill(signal.SIGCONT) time.sleep(self.delayafterterminate) if not self.isalive(): return True self.kill(signal.SIGINT) time.sleep(self.delayafterterminate) if not self.isalive(): return True if force: self.kill(signal.SIGKILL) time.sleep(self.delayafterterminate) if not self.isalive(): return True else: return False return False except OSError, e: # I think there are kernel timing issues that sometimes cause # this to happen. I think isalive() reports True, but the # process is dead to the kernel. # Make one last attempt to see if the kernel is up to date. time.sleep(self.delayafterterminate) if not self.isalive(): return True else: return False def wait(self): """This waits until the child exits. This is a blocking call. This will not read any data from the child, so this will block forever if the child has unread output and has terminated. In other words, the child may have printed output then called exit(); but, technically, the child is still alive until its output is read. """ if self.isalive(): pid, status = os.waitpid(self.pid, 0) else: raise ExceptionPexpect ('Cannot wait for dead child process.') self.exitstatus = os.WEXITSTATUS(status) if os.WIFEXITED (status): self.status = status self.exitstatus = os.WEXITSTATUS(status) self.signalstatus = None self.terminated = True elif os.WIFSIGNALED (status): self.status = status self.exitstatus = None self.signalstatus = os.WTERMSIG(status) self.terminated = True elif os.WIFSTOPPED (status): raise ExceptionPexpect ('Wait was called for a child process that is stopped. This is not supported. Is some other process attempting job control with our child pid?') return self.exitstatus def isalive(self): """This tests if the child process is running or not. This is non-blocking. If the child was terminated then this will read the exitstatus or signalstatus of the child. This returns True if the child process appears to be running or False if not. It can take literally SECONDS for Solaris to return the right status. """ if self.terminated: return False if self.flag_eof: # This is for Linux, which requires the blocking form of waitpid to get # status of a defunct process. This is super-lame. The flag_eof would have # been set in read_nonblocking(), so this should be safe. waitpid_options = 0 else: waitpid_options = os.WNOHANG try: pid, status = os.waitpid(self.pid, waitpid_options) except OSError, e: # No child processes if e[0] == errno.ECHILD: raise ExceptionPexpect ('isalive() encountered condition where "terminated" is 0, but there was no child process. Did someone else call waitpid() on our process?') else: raise e # I have to do this twice for Solaris. I can't even believe that I figured this out... # If waitpid() returns 0 it means that no child process wishes to # report, and the value of status is undefined. if pid == 0: try: pid, status = os.waitpid(self.pid, waitpid_options) ### os.WNOHANG) # Solaris! except OSError, e: # This should never happen... if e[0] == errno.ECHILD: raise ExceptionPexpect ('isalive() encountered condition that should never happen. There was no child process. Did someone else call waitpid() on our process?') else: raise e # If pid is still 0 after two calls to waitpid() then # the process really is alive. This seems to work on all platforms, except # for Irix which seems to require a blocking call on waitpid or select, so I let read_nonblocking # take care of this situation (unfortunately, this requires waiting through the timeout). if pid == 0: return True if pid == 0: return True if os.WIFEXITED (status): self.status = status self.exitstatus = os.WEXITSTATUS(status) self.signalstatus = None self.terminated = True elif os.WIFSIGNALED (status): self.status = status self.exitstatus = None self.signalstatus = os.WTERMSIG(status) self.terminated = True elif os.WIFSTOPPED (status): raise ExceptionPexpect ('isalive() encountered condition where child process is stopped. This is not supported. Is some other process attempting job control with our child pid?') return False def kill(self, sig): """This sends the given signal to the child application. In keeping with UNIX tradition it has a misleading name. It does not necessarily kill the child unless you send the right signal. """ # Same as os.kill, but the pid is given for you. if self.isalive(): os.kill(self.pid, sig) def compile_pattern_list(self, patterns): """This compiles a pattern-string or a list of pattern-strings. Patterns must be a StringType, EOF, TIMEOUT, SRE_Pattern, or a list of those. Patterns may also be None which results in an empty list (you might do this if waiting for an EOF or TIMEOUT condition without expecting any pattern). This is used by expect() when calling expect_list(). Thus expect() is nothing more than:: cpl = self.compile_pattern_list(pl) return self.expect_list(cpl, timeout) If you are using expect() within a loop it may be more efficient to compile the patterns first and then call expect_list(). This avoid calls in a loop to compile_pattern_list():: cpl = self.compile_pattern_list(my_pattern) while some_condition: ... i = self.expect_list(clp, timeout) ... """ if patterns is None: return [] if type(patterns) is not types.ListType: patterns = [patterns] compile_flags = re.DOTALL # Allow dot to match \n if self.ignorecase: compile_flags = compile_flags | re.IGNORECASE compiled_pattern_list = [] for p in patterns: if type(p) in types.StringTypes: compiled_pattern_list.append(re.compile(p, compile_flags)) elif p is EOF: compiled_pattern_list.append(EOF) elif p is TIMEOUT: compiled_pattern_list.append(TIMEOUT) elif type(p) is type(re.compile('')): compiled_pattern_list.append(p) else: raise TypeError ('Argument must be one of StringTypes, EOF, TIMEOUT, SRE_Pattern, or a list of those type. %s' % str(type(p))) return compiled_pattern_list def expect(self, pattern, timeout = -1, searchwindowsize=None): """This seeks through the stream until a pattern is matched. The pattern is overloaded and may take several types. The pattern can be a StringType, EOF, a compiled re, or a list of any of those types. Strings will be compiled to re types. This returns the index into the pattern list. If the pattern was not a list this returns index 0 on a successful match. This may raise exceptions for EOF or TIMEOUT. To avoid the EOF or TIMEOUT exceptions add EOF or TIMEOUT to the pattern list. That will cause expect to match an EOF or TIMEOUT condition instead of raising an exception. If you pass a list of patterns and more than one matches, the first match in the stream is chosen. If more than one pattern matches at that point, the leftmost in the pattern list is chosen. For example:: # the input is 'foobar' index = p.expect (['bar', 'foo', 'foobar']) # returns 1 ('foo') even though 'foobar' is a "better" match Please note, however, that buffering can affect this behavior, since input arrives in unpredictable chunks. For example:: # the input is 'foobar' index = p.expect (['foobar', 'foo']) # returns 0 ('foobar') if all input is available at once, # but returs 1 ('foo') if parts of the final 'bar' arrive late After a match is found the instance attributes 'before', 'after' and 'match' will be set. You can see all the data read before the match in 'before'. You can see the data that was matched in 'after'. The re.MatchObject used in the re match will be in 'match'. If an error occurred then 'before' will be set to all the data read so far and 'after' and 'match' will be None. If timeout is -1 then timeout will be set to the self.timeout value. A list entry may be EOF or TIMEOUT instead of a string. This will catch these exceptions and return the index of the list entry instead of raising the exception. The attribute 'after' will be set to the exception type. The attribute 'match' will be None. This allows you to write code like this:: index = p.expect (['good', 'bad', pexpect.EOF, pexpect.TIMEOUT]) if index == 0: do_something() elif index == 1: do_something_else() elif index == 2: do_some_other_thing() elif index == 3: do_something_completely_different() instead of code like this:: try: index = p.expect (['good', 'bad']) if index == 0: do_something() elif index == 1: do_something_else() except EOF: do_some_other_thing() except TIMEOUT: do_something_completely_different() These two forms are equivalent. It all depends on what you want. You can also just expect the EOF if you are waiting for all output of a child to finish. For example:: p = pexpect.spawn('/bin/ls') p.expect (pexpect.EOF) print p.before If you are trying to optimize for speed then see expect_list(). """ compiled_pattern_list = self.compile_pattern_list(pattern) return self.expect_list(compiled_pattern_list, timeout, searchwindowsize) def expect_list(self, pattern_list, timeout = -1, searchwindowsize = -1): """This takes a list of compiled regular expressions and returns the index into the pattern_list that matched the child output. The list may also contain EOF or TIMEOUT (which are not compiled regular expressions). This method is similar to the expect() method except that expect_list() does not recompile the pattern list on every call. This may help if you are trying to optimize for speed, otherwise just use the expect() method. This is called by expect(). If timeout==-1 then the self.timeout value is used. If searchwindowsize==-1 then the self.searchwindowsize value is used. """ return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize) def expect_exact(self, pattern_list, timeout = -1, searchwindowsize = -1): """This is similar to expect(), but uses plain string matching instead of compiled regular expressions in 'pattern_list'. The 'pattern_list' may be a string; a list or other sequence of strings; or TIMEOUT and EOF. This call might be faster than expect() for two reasons: string searching is faster than RE matching and it is possible to limit the search to just the end of the input buffer. This method is also useful when you don't want to have to worry about escaping regular expression characters that you want to match.""" if type(pattern_list) in types.StringTypes or pattern_list in (TIMEOUT, EOF): pattern_list = [pattern_list] return self.expect_loop(searcher_string(pattern_list), timeout, searchwindowsize) def expect_loop(self, searcher, timeout = -1, searchwindowsize = -1): """This is the common loop used inside expect. The 'searcher' should be an instance of searcher_re or searcher_string, which describes how and what to search for in the input. See expect() for other arguments, return value and exceptions. """ self.searcher = searcher if timeout == -1: timeout = self.timeout if timeout is not None: end_time = time.time() + timeout if searchwindowsize == -1: searchwindowsize = self.searchwindowsize try: incoming = self.buffer freshlen = len(incoming) while True: # Keep reading until exception or return. index = searcher.search(incoming, freshlen, searchwindowsize) if index >= 0: self.buffer = incoming[searcher.end : ] self.before = incoming[ : searcher.start] self.after = incoming[searcher.start : searcher.end] self.match = searcher.match self.match_index = index return self.match_index # No match at this point if timeout < 0 and timeout is not None: raise TIMEOUT ('Timeout exceeded in expect_any().') # Still have time left, so read more data c = self.read_nonblocking (self.maxread, timeout) freshlen = len(c) time.sleep (0.0001) incoming = incoming + c if timeout is not None: timeout = end_time - time.time() except EOF, e: self.buffer = '' self.before = incoming self.after = EOF index = searcher.eof_index if index >= 0: self.match = EOF self.match_index = index return self.match_index else: self.match = None self.match_index = None raise EOF (str(e) + '\n' + str(self)) except TIMEOUT, e: self.buffer = incoming self.before = incoming self.after = TIMEOUT index = searcher.timeout_index if index >= 0: self.match = TIMEOUT self.match_index = index return self.match_index else: self.match = None self.match_index = None raise TIMEOUT (str(e) + '\n' + str(self)) except: self.before = incoming self.after = None self.match = None self.match_index = None raise def getwinsize(self): """This returns the terminal window size of the child tty. The return value is a tuple of (rows, cols). """ TIOCGWINSZ = getattr(termios, 'TIOCGWINSZ', 1074295912L) s = struct.pack('HHHH', 0, 0, 0, 0) x = fcntl.ioctl(self.fileno(), TIOCGWINSZ, s) return struct.unpack('HHHH', x)[0:2] def setwinsize(self, r, c): """This sets the terminal window size of the child tty. This will cause a SIGWINCH signal to be sent to the child. This does not change the physical window size. It changes the size reported to TTY-aware applications like vi or curses -- applications that respond to the SIGWINCH signal. """ # Check for buggy platforms. Some Python versions on some platforms # (notably OSF1 Alpha and RedHat 7.1) truncate the value for # termios.TIOCSWINSZ. It is not clear why this happens. # These platforms don't seem to handle the signed int very well; # yet other platforms like OpenBSD have a large negative value for # TIOCSWINSZ and they don't have a truncate problem. # Newer versions of Linux have totally different values for TIOCSWINSZ. # Note that this fix is a hack. TIOCSWINSZ = getattr(termios, 'TIOCSWINSZ', -2146929561) if TIOCSWINSZ == 2148037735L: # L is not required in Python >= 2.2. TIOCSWINSZ = -2146929561 # Same bits, but with sign. # Note, assume ws_xpixel and ws_ypixel are zero. s = struct.pack('HHHH', r, c, 0, 0) fcntl.ioctl(self.fileno(), TIOCSWINSZ, s) def interact(self, escape_character = chr(29), input_filter = None, output_filter = None): """This gives control of the child process to the interactive user (the human at the keyboard). Keystrokes are sent to the child process, and the stdout and stderr output of the child process is printed. This simply echos the child stdout and child stderr to the real stdout and it echos the real stdin to the child stdin. When the user types the escape_character this method will stop. The default for escape_character is ^]. This should not be confused with ASCII 27 -- the ESC character. ASCII 29 was chosen for historical merit because this is the character used by 'telnet' as the escape character. The escape_character will not be sent to the child process. You may pass in optional input and output filter functions. These functions should take a string and return a string. The output_filter will be passed all the output from the child process. The input_filter will be passed all the keyboard input from the user. The input_filter is run BEFORE the check for the escape_character. Note that if you change the window size of the parent the SIGWINCH signal will not be passed through to the child. If you want the child window size to change when the parent's window size changes then do something like the following example:: import pexpect, struct, fcntl, termios, signal, sys def sigwinch_passthrough (sig, data): s = struct.pack("HHHH", 0, 0, 0, 0) a = struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ , s)) global p p.setwinsize(a[0],a[1]) p = pexpect.spawn('/bin/bash') # Note this is global and used in sigwinch_passthrough. signal.signal(signal.SIGWINCH, sigwinch_passthrough) p.interact() """ # Flush the buffer. self.stdout.write (self.buffer) self.stdout.flush() self.buffer = '' mode = tty.tcgetattr(self.STDIN_FILENO) tty.setraw(self.STDIN_FILENO) try: self.__interact_copy(escape_character, input_filter, output_filter) finally: tty.tcsetattr(self.STDIN_FILENO, tty.TCSAFLUSH, mode) def __interact_writen(self, fd, data): """This is used by the interact() method. """ while data != '' and self.isalive(): n = os.write(fd, data) data = data[n:] def __interact_read(self, fd): """This is used by the interact() method. """ return os.read(fd, 1000) def __interact_copy(self, escape_character = None, input_filter = None, output_filter = None): """This is used by the interact() method. """ while self.isalive(): r,w,e = self.__select([self.child_fd, self.STDIN_FILENO], [], []) if self.child_fd in r: try: data = self.__interact_read(self.child_fd) except OSError, e: break if output_filter: data = output_filter(data) if self.logfile is not None: self.logfile.write (data) self.logfile.flush() os.write(self.STDOUT_FILENO, data) if self.STDIN_FILENO in r: data = self.__interact_read(self.STDIN_FILENO) if input_filter: data = input_filter(data) i = data.rfind(escape_character) if i != -1: data = data[:i] self.__interact_writen(self.child_fd, data) break self.__interact_writen(self.child_fd, data) def __select (self, iwtd, owtd, ewtd, timeout=None): """This is a wrapper around select.select() that ignores signals. If select.select raises a select.error exception and errno is an EINTR error then it is ignored. Mainly this is used to ignore sigwinch (terminal resize). """ # if select() is interrupted by a signal (errno==EINTR) then # we loop back and enter the select() again. if timeout is not None: end_time = time.time() + timeout while True: try: return select.select (iwtd, owtd, ewtd, timeout) except select.error, e: if e[0] == errno.EINTR: # if we loop back we have to subtract the amount of time we already waited. if timeout is not None: timeout = end_time - time.time() if timeout < 0: return ([],[],[]) else: # something else caused the select.error, so this really is an exception raise ############################################################################## # The following methods are no longer supported or allowed. def setmaxread (self, maxread): """This method is no longer supported or allowed. I don't like getters and setters without a good reason. """ raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the maxread member variable.') def setlog (self, fileobject): """This method is no longer supported or allowed. """ raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the logfile member variable.') ############################################################################## # End of spawn_unix class ############################################################################## class spawn_windows (spawn_unix, object): """This is the main class interface for Pexpect. Use this class to start and control child applications. """ def __init__(self, command, args=[], timeout=30, maxread=60000, searchwindowsize=None, logfile=None, cwd=None, env=None, codepage=None, columns=None, rows=None): self.stdin = sys.stdin self.stdout = sys.stdout self.stderr = sys.stderr self.searcher = None self.ignorecase = False self.before = None self.after = None self.match = None self.match_index = None self.terminated = True self.exitstatus = None self.signalstatus = None self.status = None # status returned by os.waitpid self.flag_eof = False self.pid = None self.child_fd = -1 # initially closed self.timeout = timeout self.delimiter = EOF self.logfile = logfile self.logfile_read = None # input from child (read_nonblocking) self.logfile_send = None # output to send (send, sendline) self.maxread = maxread # max bytes to read at one time into buffer self.buffer = '' # This is the read buffer. See maxread. self.searchwindowsize = searchwindowsize # Anything before searchwindowsize point is preserved, but not searched. self.delaybeforesend = 0.05 # Sets sleep time used just before sending data to child. Time in seconds. self.delayafterclose = 0.1 # Sets delay in close() method to allow kernel time to update process status. Time in seconds. self.delayafterterminate = 0.1 # Sets delay in terminate() method to allow kernel time to update process status. Time in seconds. self.softspace = False # File-like object. self.name = '<' + repr(self) + '>' # File-like object. self.encoding = None # File-like object. self.closed = True # File-like object. self.ocwd = os.getcwdu() self.cwd = cwd self.env = env self.codepage = codepage self.columns = columns self.rows = rows # allow dummy instances for subclasses that may not use command or args. if command is None: self.command = None self.args = None self.name = '' else: self._spawn (command, args) def __del__(self): """This makes sure that no system resources are left open. Python only garbage collects Python objects, not the child console.""" try: self.wtty.terminate_child() except: pass try: self.wtty.terminate() except: pass def _spawn(self,command,args=[]): """This starts the given command in a child process. This does all the fork/exec type of stuff for a pty. This is called by __init__. If args is empty then command will be parsed (split on spaces) and args will be set to parsed arguments. """ # The pid and child_fd of this object get set by this method. # Note that it is difficult for this method to fail. # You cannot detect if the child process cannot start. # So the only way you can tell if the child process started # or not is to try to read from the file descriptor. If you get # EOF immediately then it means that the child is already dead. # That may not necessarily be bad because you may haved spawned a child # that performs some task; creates no stdout output; and then dies. # If command is an int type then it may represent a file descriptor. if type(command) == type(0): raise ExceptionPexpect ('Command is an int type. If this is a file descriptor then maybe you want to use fdpexpect.fdspawn which takes an existing file descriptor instead of a command string.') if type (args) != type([]): raise TypeError ('The argument, args, must be a list.') if args == []: #Momentairly broken - path '\' characters being misinterpreted #self.args = split_command_line(command) self.args = [command] self.command = self.args[0] else: self.args = args[:] # work with a copy self.args.insert (0, command) self.command = command command_with_path = which(self.command) if command_with_path is None: raise ExceptionPexpect ('The command was not found or was not executable: %s.' % self.command) self.command = command_with_path self.args[0] = self.command self.name = '<' + ' '.join (self.args) + '>' #assert self.pid is None, 'The pid member should be None.' #assert self.command is not None, 'The command member should not be None.' self.wtty = Wtty(timeout=self.timeout, codepage=self.codepage, columns=self.columns, rows=self.rows, cwd=self.cwd) self.child_fd = self.wtty.spawn(self.command, self.args, self.env) self.terminated = False self.closed = False self.pid = self.wtty.pid def fileno (self): # File-like object. """There is no child fd.""" return 0 def close(self, force=True): # File-like object. """ Closes the child console.""" self.closed = self.terminate(force) if not self.closed: raise ExceptionPexpect ('close() could not terminate the child using terminate()') self.closed = True def isatty(self): # File-like object. """The child is always created with a console.""" return True def getecho (self): """This returns the terminal echo mode. This returns True if echo is on or False if echo is off. Child applications that are expecting you to enter a password often set ECHO False. See waitnoecho().""" return self.wtty.getecho() def setecho (self, state): """This sets the terminal echo mode on or off.""" self.wtty.setecho(state) def read_nonblocking (self, size = 1, timeout = -1): """This reads at most size characters from the child application. It includes a timeout. If the read does not complete within the timeout period then a TIMEOUT exception is raised. If the end of file is read then an EOF exception will be raised. If a log file was set using setlog() then all data will also be written to the log file. If timeout is None then the read may block indefinitely. If timeout is -1 then the self.timeout value is used. If timeout is 0 then the child is polled and if there was no data immediately ready then this will raise a TIMEOUT exception. The timeout refers only to the amount of time to read at least one character. This is not effected by the 'size' parameter, so if you call read_nonblocking(size=100, timeout=30) and only one character is available right away then one character will be returned immediately. It will not wait for 30 seconds for another 99 characters to come in. This is a wrapper around Wtty.read(). """ if self.closed: raise ValueError ('I/O operation on closed file in read_nonblocking().') if timeout == -1: timeout = self.timeout s = self.wtty.read_nonblocking(timeout, size) if s == '': if not self.wtty.isalive(): self.flag_eof = True raise EOF('End Of File (EOF) in read_nonblocking().') if timeout is None: # Do not raise TIMEOUT because we might be waiting for EOF # sleep to keep CPU utilization down time.sleep(.05) else: raise TIMEOUT ('Timeout exceeded in read_nonblocking().') else: if self.logfile is not None: self.logfile.write (s) self.logfile.flush() if self.logfile_read is not None: self.logfile_read.write (s) self.logfile_read.flush() return s def send(self, s): """This sends a string to the child process. This returns the number of bytes written. If a log file was set then the data is also written to the log. """ (self.delaybeforesend) if self.logfile is not None: self.logfile.write (s) self.logfile.flush() if self.logfile_send is not None: self.logfile_send.write (s) self.logfile_send.flush() c = self.wtty.write(s) return c ### UNIMPLEMENTED ### def sendcontrol(self, char): raise ExceptionPexpect ('sendcontrol() is not supported on windows') ### UNIMPLEMENTED ### ### Parent buffer does not wait for endline by default. def sendeof(self): raise ExceptionPexpect ('sendeof() is not supported on windows') def sendintr(self): """This sends a SIGINT to the child. It does not require the SIGINT to be the first character on a line. """ self.wtty.sendintr() def terminate(self, force=False): """Terminate the child. Force not used. """ if not self.isalive(): return True self.wtty.terminate_child() time.sleep(self.delayafterterminate) if not self.isalive(): return True return False def kill(self, sig): """Sig == sigint for ctrl-c otherwise the child is terminated.""" if sig == signal.SIGINT: self.wtty.sendintr() else: self.wtty.terminate_child() def wait(self): """This waits until the child exits. This is a blocking call. This will not read any data from the child, so this will block forever if the child has unread output and has terminated. In other words, the child may have printed output then called exit(); but, technically, the child is still alive until its output is read.""" if not self.isalive(): raise ExceptionPexpect ('Cannot wait for dead child process.') # We can't use os.waitpid under Windows because of 'permission denied' # exception? Perhaps if not running as admin (or UAC enabled under # Vista/7). Simply loop and wait for child to exit. while self.isalive(): time.sleep(.05) # Keep CPU utilization down return self.exitstatus def isalive(self): """Determines if the child is still alive.""" if self.terminated: return False if self.wtty.isalive(): return True else: self.exitstatus = GetExitCodeProcess(self.wtty.getchild()) # left-shift exit status by 8 bits like os.waitpid self.status = self.exitstatus << 8 self.terminated = True return False def getwinsize(self): """This returns the terminal window size of the child tty. The return value is a tuple of (rows, cols). """ return self.wtty.getwinsize() def setwinsize(self, r, c): """Set the size of the child screen buffer. """ self.wtty.setwinsize(r, c) ### Prototype changed def interact(self): """Makes the child console visible for interaction""" self.wtty.interact() ### Prototype changed def stop_interact(self): """Hides the child console from the user.""" self.wtty.stop_interact() ############################################################################## # End of spawn_windows class ############################################################################## class Wtty: def __init__(self, timeout=30, codepage=None, columns=None, rows=None, cwd=None): self.__buffer = StringIO() self.__bufferY = 0 self.__currentReadCo = PyCOORDType(0, 0) self.__parentPid = 0 self.__oproc = 0 self.conpid = 0 self.__otid = 0 self.__switch = True self.__childProcess = None self.codepage = (codepage or windll.kernel32.GetConsoleOutputCP() or windll.kernel32.GetOEMCP()) log("Code page: %s" % self.codepage) self.columns = columns self.cwd = cwd self.rows = rows self.console = False self.lastRead = 0 self.lastReadData = "" self.pid = None self.processList = [] # We need a timeout for connecting to the child process self.timeout = timeout self.totalRead = 0 def spawn(self, command, args=[], env=None): """Spawns spawner.py with correct arguments.""" ts = time.time() self.startChild(args, env) while True: msg = PeekMessage(0, 0, 0, PM_REMOVE) childPid = msg[1][2] # Sometimes GetMessage returns a bogus PID, so keep calling it # until we can successfully connect to the child or timeout is # reached if childPid: try: self.__childProcess = win32api.OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION, False, childPid) except pywintypes.error, e: pass else: self.pid = childPid break if time.time() > ts + self.timeout: log('Timeout exceeded in Wtty.spawn().') break time.sleep(.05) if not self.__childProcess: raise ExceptionPexpect ('The process ' + args[0] + ' could not be started.') winHandle = int(GetConsoleWindow()) self.__switch = True if winHandle != 0: self.__parentPid = GetWindowThreadProcessId(winHandle)[1] # Do we have a console attached? Do not rely on winHandle, because # it will also be non-zero if we didn't have a console, and then # spawned a child process! Using sys.stdout.isatty() seems safe self.console = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty() # If the original process had a console, record a list of attached # processes so we can check if we need to reattach/reallocate the # console later self.processList = GetConsoleProcessList() else: self.switchTo(False) self.__switch = False def startChild(self, args, env): si = GetStartupInfo() si.dwFlags = STARTF_USESHOWWINDOW si.wShowWindow = SW_HIDE # Determine the directory of wexpect.py or, if we are running 'frozen' # (eg. py2exe deployment), of the packed executable dirname = os.path.dirname(sys.executable if getattr(sys, 'frozen', False) else os.path.abspath(__file__)) if getattr(sys, 'frozen', False): logdir = appname else: logdir = dirname logdir = os.path.basename(logdir) spath = [dirname] pyargs = ['-c'] if getattr(sys, 'frozen', False): # If we are running 'frozen', add library.zip and lib\library.zip # to sys.path # py2exe: Needs appropriate 'zipfile' option in setup script and # 'bundle_files' 3 spath.append(os.path.join(dirname, 'library.zip')) spath.append(os.path.join(dirname, 'library.zip', appname)) if os.path.isdir(os.path.join(dirname, 'lib')): dirname = os.path.join(dirname, 'lib') spath.append(os.path.join(dirname, 'library.zip')) spath.append(os.path.join(dirname, 'library.zip', appname)) pyargs.insert(0, '-S') # skip 'import site' pid = GetCurrentProcessId() tid = win32api.GetCurrentThreadId() # If we are running 'frozen', expect python.exe in the same directory # as the packed executable. # py2exe: The python executable can be included via setup script by # adding it to 'data_files' commandLine = '"%s" %s "%s"' % (os.path.join(dirname, 'python.exe') if getattr(sys, 'frozen', False) else os.path.join(os.path.dirname(sys.executable), 'python.exe'), ' '.join(pyargs), "import sys; sys.path = %s + sys.path;" "args = %s; import wexpect;" "wexpect.ConsoleReader(wexpect.join_args(args), %i, %i, cp=%i, c=%s, r=%s, logdir=%r)" % (("%r" % spath).replace('"', r'\"'), ("%r" % args).replace('"', r'\"'), pid, tid, self.codepage, self.columns, self.rows, logdir)) log(commandLine) self.__oproc, _, self.conpid, self.__otid = CreateProcess(None, commandLine, None, None, False, CREATE_NEW_CONSOLE, env, self.cwd, si) def switchTo(self, attached=True): """Releases from the current console and attatches to the childs.""" if not self.__switch or not self.__oproc_isalive(): return if attached: FreeConsole() AttachConsole(self.conpid) self.__consin = GetStdHandle(STD_INPUT_HANDLE) self.__consout = self.getConsoleOut() def switchBack(self): """Releases from the current console and attaches to the parents.""" if not self.__switch or not self.__oproc_isalive(): return if self.console: # If we originally had a console, re-attach it (or allocate a new one) # If we didn't have a console to begin with, there's no need to # re-attach/allocate FreeConsole() if len(self.processList) > 1: # Our original console is still present, re-attach AttachConsole(self.__parentPid) else: # Our original console has been free'd, allocate a new one AllocConsole() self.__consin = None self.__consout = None def getConsoleOut(self): consout = win32file.CreateFile('CONOUT$', GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, None, OPEN_EXISTING, 0, 0) return PyConsoleScreenBufferType(consout) def getchild(self): """Returns a handle to the child process.""" return self.__childProcess def terminate(self): """Terminate the ConsoleReader process.""" win32api.TerminateProcess(self.__oproc, 1) def terminate_child(self): """Terminate the child process.""" win32api.TerminateProcess(self.__childProcess, 1) def createKeyEvent(self, char): """Creates a single key record corrosponding to the ascii character char.""" evt = PyINPUT_RECORDType(KEY_EVENT) evt.KeyDown = True evt.Char = char if char in ("\n", "\r"): evt.VirtualKeyCode = 0x0d # VK_RETURN evt.RepeatCount = 1 return evt def write(self, s): """Writes input into the child consoles input buffer.""" if len(s) == 0: return 0 records = [self.createKeyEvent(c) for c in unicode(s)] self.switchTo() try: wrote = self.__consin.WriteConsoleInput(records) except Exception, e: log(e, '_exceptions') self.switchBack() raise self.switchBack() return wrote def getPoint(self, offset): """Converts an offset to a point represented as a tuple.""" consinfo = self.__consout.GetConsoleScreenBufferInfo() x = offset % consinfo['Size'].X y = offset / consinfo['Size'].X return (x, y) def getOffset(self, x, y): """Converts a tuple-point to an offset.""" consinfo = self.__consout.GetConsoleScreenBufferInfo() return x + y * consinfo['Size'].X def readConsole(self, startCo, endCo): """Reads the console area from startCo to endCo and returns it as a string.""" buff = [] self.lastRead = 0 startCo = PyCOORDType(startCo.X, startCo.Y) endX = endCo.X endY = endCo.Y while True: startOff = self.getOffset(startCo.X, startCo.Y) endOff = self.getOffset(endX, endY) readlen = endOff - startOff if readlen > 4000: readlen = 4000 endPoint = self.getPoint(startOff + 4000) else: endPoint = self.getPoint(endOff) s = self.__consout.ReadConsoleOutputCharacter(readlen, startCo) ln = len(s) self.lastRead += ln self.totalRead += ln buff.append(s) startCo.X, startCo.Y = endPoint[0], endPoint[1] if readlen <= 0 or (startCo.X >= endX and startCo.Y >= endY): break return ''.join(buff) def parseData(self, s): """Ensures that special characters are interpretted as newlines or blanks, depending on if there written over characters or screen-buffer-fill characters.""" consinfo = self.__consout.GetConsoleScreenBufferInfo() strlist = [] for i, c in enumerate(s): strlist.append(c) if (self.totalRead - self.lastRead + i + 1) % consinfo['Size'].X == 0: strlist.append('\r\n') s = '\r\n'.join([line.rstrip(u' ') for line in ''.join(strlist).split('\r\n')]) try: return s.encode("cp%i" % self.codepage, 'replace') except LookupError: return s.encode(getattr(sys.stdout, 'encoding', None) or sys.getdefaultencoding(), 'replace') def readConsoleToCursor(self): """Reads from the current read position to the current cursor position and inserts the string into self.__buffer.""" if not self.__consout: return "" consinfo = self.__consout.GetConsoleScreenBufferInfo() cursorPos = consinfo['CursorPosition'] #log('=' * 80) #log('cursor: %r, current: %r' % (cursorPos, self.__currentReadCo)) if cursorPos.Y < self.__currentReadCo.Y: # Has the child cleared the screen buffer? self.__buffer.seek(0) self.__buffer.truncate() self.__bufferY = 0 self.__currentReadCo.X = 0 self.__currentReadCo.Y = 0 isSameX = cursorPos.X == self.__currentReadCo.X isSameY = cursorPos.Y == self.__currentReadCo.Y isSamePos = isSameX and isSameY #log('isSameY: %r' % isSameY) #log('isSamePos: %r' % isSamePos) if isSameY or not self.lastReadData.endswith('\r\n'): # Read the current slice again self.totalRead -= self.lastRead self.__currentReadCo.X = 0 self.__currentReadCo.Y = self.__bufferY #log('cursor: %r, current: %r' % (cursorPos, self.__currentReadCo)) raw = self.readConsole(self.__currentReadCo, cursorPos) rawlist = [] while raw: rawlist.append(raw[:consinfo['Size'].X]) raw = raw[consinfo['Size'].X:] raw = ''.join(rawlist) s = self.parseData(raw) for i, line in enumerate(reversed(rawlist)): if len(line) == consinfo['Size'].X: # Record the Y offset where the most recent line break was detected self.__bufferY += len(rawlist) - i break #log('lastReadData: %r' % self.lastReadData) #log('s: %r' % s) #isSameData = False if isSamePos and self.lastReadData == s: #isSameData = True s = '' #log('isSameData: %r' % isSameData) #log('s: %r' % s) if s: lastReadData = self.lastReadData pos = self.getOffset(self.__currentReadCo.X, self.__currentReadCo.Y) self.lastReadData = s if isSameY or not lastReadData.endswith('\r\n'): # Detect changed lines self.__buffer.seek(pos) buf = self.__buffer.read() #log('buf: %r' % buf) #log('raw: %r' % raw) if raw.startswith(buf): # Line has grown rawslice = raw[len(buf):] # Update last read bytes so line breaks can be detected in parseData lastRead = self.lastRead self.lastRead = len(rawslice) s = self.parseData(rawslice) self.lastRead = lastRead else: # Cursor has been repositioned s = '\r' + s #log('s: %r' % s) self.__buffer.seek(pos) self.__buffer.truncate() self.__buffer.write(raw) self.__currentReadCo.X = cursorPos.X self.__currentReadCo.Y = cursorPos.Y return s def read_nonblocking(self, timeout, size): """Reads data from the console if available, otherwise waits timeout seconds, and writes the string 'None' to the pipe if no data is available after that time.""" self.switchTo() consinfo = self.__consout.GetConsoleScreenBufferInfo() cursorPos = consinfo['CursorPosition'] maxconsoleY = consinfo['Size'].Y / 2 reset = False eof = False try: while True: #Wait for child process to be paused if cursorPos.Y > maxconsoleY: reset = True time.sleep(.2) start = time.clock() s = self.readConsoleToCursor() if reset: self.refreshConsole() reset = False if len(s) != 0: self.switchBack() return s if eof or timeout <= 0: self.switchBack() if eof and self.__oproc_isalive(): try: TerminateProcess(self.__oproc, 0) except pywintypes.error, e: log(e, '_exceptions') log('Could not terminate ConsoleReader after child exited.') return '' if not self.isalive(): eof = True # Child has already terminated, but there may still be # output coming in with a slight delay time.sleep(.1) time.sleep(0.001) end = time.clock() timeout -= end - start except Exception, e: log(e, '_exceptions') log('End Of File (EOF) in Wtty.read_nonblocking().') self.switchBack() raise EOF('End Of File (EOF) in Wtty.read_nonblocking().') def refreshConsole(self): """Clears the console after pausing the child and reading all the data currently on the console. The last line before clearing becomes the first line after clearing.""" consinfo = self.__consout.GetConsoleScreenBufferInfo() cursorPos = consinfo['CursorPosition'] startCo = PyCOORDType(0, cursorPos.Y) self.totalRead = 0 raw = self.readConsole(startCo, cursorPos) orig = PyCOORDType(0, 0) self.__consout.SetConsoleCursorPosition(orig) writelen = consinfo['Size'].X * consinfo['Size'].Y self.__consout.FillConsoleOutputCharacter(u' ', writelen, orig) self.__consout.WriteConsoleOutputCharacter(raw, orig) cursorPos.Y = 0 self.__consout.SetConsoleCursorPosition(cursorPos) self.__currentReadCo = cursorPos self.__bufferY = 0 self.__buffer.truncate(0) self.__buffer.write(raw) def setecho(self, state): """Sets the echo mode of the child console.""" self.switchTo() try: mode = self.__consin.GetConsoleMode() if state: mode |= 0x0004 else: mode &= ~0x0004 self.__consin.SetConsoleMode(mode) except: self.switchBack() raise self.switchBack() def getecho(self): """Returns the echo mode of the child console.""" self.switchTo() try: mode = self.__consin.GetConsoleMode() ret = (mode & 0x0004) > 0 self.switchBack() except: self.switchBack() raise return ret def getwinsize(self): """Returns the size of the child console as a tuple of (rows, columns).""" self.switchTo() try: size = self.__consout.GetConsoleScreenBufferInfo()['Size'] self.switchBack() except: self.switchBack() raise return (size.Y, size.X) def setwinsize(self, r, c): """Sets the child console screen buffer size to (r, c).""" self.switchTo() try: self.__consout.SetConsoleScreenBufferSize(PyCOORDType(c, r)) except: self.switchBack() raise self.switchBack() def interact(self): """Displays the child console for interaction.""" if not self.isalive(): return self.switchTo() try: ShowWindow(GetConsoleWindow(), SW_SHOW) except: self.switchBack() raise self.switchBack() def stop_interact(self): """Hides the child console.""" self.switchTo() try: ShowWindow(GetConsoleWindow(), SW_HIDE) except: self.switchBack() raise self.switchBack() def isalive(self): """True if the child is still alive, false otherwise""" return GetExitCodeProcess(self.__childProcess) == STILL_ACTIVE def __oproc_isalive(self): return GetExitCodeProcess(self.__oproc) == STILL_ACTIVE def sendintr(self): """Sends the sigint signal to the child.""" self.switchTo() try: time.sleep(.15) win32api.GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, self.pid) time.sleep(.25) except: self.switchBack() raise self.switchBack() class ConsoleReader: def __init__(self, path, pid, tid, env=None, cp=None, c=None, r=None, logdir=None): self.logdir = logdir log('=' * 80, 'consolereader', logdir) log("OEM code page: %s" % windll.kernel32.GetOEMCP(), 'consolereader', logdir) consolecp = windll.kernel32.GetConsoleOutputCP() log("Console output code page: %s" % consolecp, 'consolereader', logdir) if consolecp != cp: log("Setting console output code page to %s" % cp, 'consolereader', logdir) try: SetConsoleOutputCP(cp) except Exception, e: log(e, 'consolereader_exceptions', logdir) else: log("Console output code page: %s" % windll.kernel32.GetConsoleOutputCP(), 'consolereader', logdir) log('Spawning %s' % path, 'consolereader', logdir) try: try: consout = self.getConsoleOut() self.initConsole(consout, c, r) SetConsoleTitle(path) si = GetStartupInfo() self.__childProcess, _, childPid, self.__tid = CreateProcess(None, path, None, None, False, CREATE_NEW_PROCESS_GROUP, None, None, si) except Exception, e: log(e, 'consolereader_exceptions', logdir) time.sleep(.1) win32api.PostThreadMessage(int(tid), WM_USER, 0, 0) sys.exit() time.sleep(.1) win32api.PostThreadMessage(int(tid), WM_USER, childPid, 0) parent = win32api.OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION , 0, int(pid)) paused = False cursorinfo = consout.GetConsoleCursorInfo() while GetExitCodeProcess(self.__childProcess) == STILL_ACTIVE: try: if GetExitCodeProcess(parent) != STILL_ACTIVE: try: TerminateProcess(self.__childProcess, 0) except pywintypes.error, e: log(e, 'consolereader_exceptions', logdir) sys.exit() consinfo = consout.GetConsoleScreenBufferInfo() cursorPos = consinfo['CursorPosition'] maxconsoleY = consinfo['Size'].Y / 2 if cursorPos.Y > maxconsoleY and not paused: #log('ConsoleReader.__init__: cursorPos %s' #% cursorPos, 'consolereader', logdir) #log('suspendThread', 'consolereader', logdir) self.suspendThread() paused = True SetConsoleTitle(path + ' (suspended)') # Hide cursor consout.SetConsoleCursorInfo(cursorinfo[0], 0) if cursorPos.Y <= maxconsoleY and paused: #log('ConsoleReader.__init__: cursorPos %s' #% cursorPos, 'consolereader', logdir) #log('resumeThread', 'consolereader', logdir) self.resumeThread() paused = False SetConsoleTitle(path) # Show cursor consout.SetConsoleCursorInfo(cursorinfo[0], cursorinfo[1]) time.sleep(.1) except KeyboardInterrupt: # Only let child react to CTRL+C, ignore in ConsoleReader pass SetConsoleTitle(path + ' (terminated)') consout.SetConsoleCursorInfo(cursorinfo[0], 0) # Hide cursor while GetExitCodeProcess(parent) == STILL_ACTIVE: time.sleep(.1) except Exception, e: log(e, 'consolereader_exceptions', logdir) def handler(self, sig): log(sig, 'consolereader', logdir) return False def getConsoleOut(self): consout = win32file.CreateFile('CONOUT$', GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, None, OPEN_EXISTING, 0, 0) return PyConsoleScreenBufferType(consout) def initConsole(self, consout, c=None, r=None): # Window size can't be larger than maximum window size consinfo = consout.GetConsoleScreenBufferInfo() maxwinsize = consinfo['MaximumWindowSize'] rect = PySMALL_RECTType(0, 0, min(maxwinsize.X - 1, 79), min(maxwinsize.Y - 1, 24)) consout.SetConsoleWindowInfo(True, rect) # Buffer size can't be smaller than window size size = PyCOORDType(max(rect.Right + 1, c or 80), max(rect.Bottom + 1, r or 16000)) consout.SetConsoleScreenBufferSize(size) pos = PyCOORDType(0, 0) consout.FillConsoleOutputCharacter(u' ', size.X * size.Y, pos) def suspendThread(self): """Pauses the main thread of the child process.""" handle = windll.kernel32.OpenThread(THREAD_SUSPEND_RESUME, 0, self.__tid) SuspendThread(handle) def resumeThread(self): """Un-pauses the main thread of the child process.""" handle = windll.kernel32.OpenThread(THREAD_SUSPEND_RESUME, 0, self.__tid) ResumeThread(handle) class searcher_string (object): """This is a plain string search helper for the spawn.expect_any() method. Attributes: eof_index - index of EOF, or -1 timeout_index - index of TIMEOUT, or -1 After a successful match by the search() method the following attributes are available: start - index into the buffer, first byte of match end - index into the buffer, first byte after match match - the matching string itself """ def __init__(self, strings): """This creates an instance of searcher_string. This argument 'strings' may be a list; a sequence of strings; or the EOF or TIMEOUT types. """ self.eof_index = -1 self.timeout_index = -1 self._strings = [] for n, s in zip(range(len(strings)), strings): if s is EOF: self.eof_index = n continue if s is TIMEOUT: self.timeout_index = n continue self._strings.append((n, s)) def __str__(self): """This returns a human-readable string that represents the state of the object.""" ss = [ (ns[0],' %d: "%s"' % ns) for ns in self._strings ] ss.append((-1,'searcher_string:')) if self.eof_index >= 0: ss.append ((self.eof_index,' %d: EOF' % self.eof_index)) if self.timeout_index >= 0: ss.append ((self.timeout_index,' %d: TIMEOUT' % self.timeout_index)) ss.sort() ss = zip(*ss)[1] return '\n'.join(ss) def search(self, buffer, freshlen, searchwindowsize=None): """This searches 'buffer' for the first occurence of one of the search strings. 'freshlen' must indicate the number of bytes at the end of 'buffer' which have not been searched before. It helps to avoid searching the same, possibly big, buffer over and over again. See class spawn for the 'searchwindowsize' argument. If there is a match this returns the index of that string, and sets 'start', 'end' and 'match'. Otherwise, this returns -1. """ absurd_match = len(buffer) first_match = absurd_match # 'freshlen' helps a lot here. Further optimizations could # possibly include: # # using something like the Boyer-Moore Fast String Searching # Algorithm; pre-compiling the search through a list of # strings into something that can scan the input once to # search for all N strings; realize that if we search for # ['bar', 'baz'] and the input is '...foo' we need not bother # rescanning until we've read three more bytes. # # Sadly, I don't know enough about this interesting topic. /grahn for index, s in self._strings: if searchwindowsize is None: # the match, if any, can only be in the fresh data, # or at the very end of the old data offset = -(freshlen+len(s)) else: # better obey searchwindowsize offset = -searchwindowsize n = buffer.find(s, offset) if n >= 0 and n < first_match: first_match = n best_index, best_match = index, s if first_match == absurd_match: return -1 self.match = best_match self.start = first_match self.end = self.start + len(self.match) return best_index class searcher_re (object): """This is regular expression string search helper for the spawn.expect_any() method. Attributes: eof_index - index of EOF, or -1 timeout_index - index of TIMEOUT, or -1 After a successful match by the search() method the following attributes are available: start - index into the buffer, first byte of match end - index into the buffer, first byte after match match - the re.match object returned by a succesful re.search """ def __init__(self, patterns): """This creates an instance that searches for 'patterns' Where 'patterns' may be a list or other sequence of compiled regular expressions, or the EOF or TIMEOUT types.""" self.eof_index = -1 self.timeout_index = -1 self._searches = [] for n, s in zip(range(len(patterns)), patterns): if s is EOF: self.eof_index = n continue if s is TIMEOUT: self.timeout_index = n continue self._searches.append((n, s)) def __str__(self): """This returns a human-readable string that represents the state of the object.""" ss = [ (n,' %d: re.compile("%s")' % (n,str(s.pattern))) for n,s in self._searches] ss.append((-1,'searcher_re:')) if self.eof_index >= 0: ss.append ((self.eof_index,' %d: EOF' % self.eof_index)) if self.timeout_index >= 0: ss.append ((self.timeout_index,' %d: TIMEOUT' % self.timeout_index)) ss.sort() ss = zip(*ss)[1] return '\n'.join(ss) def search(self, buffer, freshlen, searchwindowsize=None): """This searches 'buffer' for the first occurence of one of the regular expressions. 'freshlen' must indicate the number of bytes at the end of 'buffer' which have not been searched before. See class spawn for the 'searchwindowsize' argument. If there is a match this returns the index of that string, and sets 'start', 'end' and 'match'. Otherwise, returns -1.""" absurd_match = len(buffer) first_match = absurd_match # 'freshlen' doesn't help here -- we cannot predict the # length of a match, and the re module provides no help. if searchwindowsize is None: searchstart = 0 else: searchstart = max(0, len(buffer)-searchwindowsize) for index, s in self._searches: match = s.search(buffer, searchstart) if match is None: continue n = match.start() if n < first_match: first_match = n the_match = match best_index = index if first_match == absurd_match: return -1 self.start = first_match self.match = the_match self.end = self.match.end() return best_index def log(e, suffix='', logdir=None): if isinstance(e, Exception): # Get the full traceback e = traceback.format_exc() #if hasattr(sys.stdout, 'isatty') and sys.stdout.isatty(): ## Only try to print if stdout is a tty, otherwise we might get ## an 'invalid handle' exception #print e if not logdir: if getattr(sys, 'frozen', False): logdir = appname else: logdir = os.path.split(os.path.dirname(os.path.abspath(__file__))) if logdir[-1] == 'lib': logdir.pop() logdir = logdir[-1] if sys.platform == "win32": parent = SHGetSpecialFolderPath(0, CSIDL_APPDATA, 1) elif sys.platform == "darwin": parent = os.path.join(os.path.expanduser("~"), "Library", "Logs") else: parent = os.getenv("XDG_DATA_HOME", os.path.expandvars("$HOME/.local/share")) # If old user data directory exists, use its basename if logdir == appname and os.path.isdir(os.path.join(parent, "dispcalGUI")): logdir = "dispcalGUI" logdir = os.path.join(parent, logdir) if sys.platform != "darwin": logdir = os.path.join(logdir, "logs") if not os.path.exists(logdir): try: os.makedirs(logdir) except OSError: pass if os.path.isdir(logdir) and os.access(logdir, os.W_OK): logfile = os.path.join(logdir, 'wexpect%s.log' % suffix) if os.path.isfile(logfile): try: logstat = os.stat(logfile) except Exception, exception: pass else: try: mtime = time.localtime(logstat.st_mtime) except ValueError, exception: # This can happen on Windows because localtime() is buggy on # that platform. See: # http://stackoverflow.com/questions/4434629/zipfile-module-in-python-runtime-problems # http://bugs.python.org/issue1760357 # To overcome this problem, we ignore the real modification # date and force a rollover mtime = time.localtime(time() - 60 * 60 * 24) if time.localtime()[:3] > mtime[:3]: # do rollover try: os.remove(logfile) except Exception, exception: pass try: fout = open(logfile, 'a') except: pass else: ts = time.time() fout.write('%s,%s %s\n' % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(ts)), ('%3f' % (ts - int(ts)))[2:5], e)) fout.close() def excepthook(etype, value, tb): log(''.join(traceback.format_exception(etype, value, tb))) #sys.excepthook = excepthook def which (filename): """This takes a given filename; tries to find it in the environment path; then checks if it is executable. This returns the full path to the filename if found and executable. Otherwise this returns None.""" # Special case where filename already contains a path. if os.path.dirname(filename) != '': if os.access (filename, os.X_OK): return filename if not os.environ.has_key('PATH') or os.environ['PATH'] == '': p = os.defpath else: p = os.environ['PATH'] # Oddly enough this was the one line that made Pexpect # incompatible with Python 1.5.2. #pathlist = p.split (os.pathsep) pathlist = string.split (p, os.pathsep) for path in pathlist: f = os.path.join(path, filename) if os.access(f, os.X_OK): return f return None def join_args(args): """Joins arguments into a command line. It quotes all arguments that contain spaces or any of the characters ^!$%&()[]{}=;'+,`~""" commandline = [] for arg in args: if re.search('[\^!$%&()[\]{}=;\'+,`~\s]', arg): arg = '"%s"' % arg commandline.append(arg) return ' '.join(commandline) def split_command_line(command_line): """This splits a command line into a list of arguments. It splits arguments on spaces, but handles embedded quotes, doublequotes, and escaped characters. It's impossible to do this with a regular expression, so I wrote a little state machine to parse the command line. """ arg_list = [] arg = '' # Constants to name the states we can be in. state_basic = 0 state_esc = 1 state_singlequote = 2 state_doublequote = 3 state_whitespace = 4 # The state of consuming whitespace between commands. state = state_basic state_backup = state for c in command_line: if state not in (state_esc, state_singlequote) and c == '\\': # Escape the next character state_backup = state state = state_esc elif state == state_basic or state == state_whitespace: if c == r"'": # Handle single quote state = state_singlequote elif c == r'"': # Handle double quote state = state_doublequote elif c.isspace(): # Add arg to arg_list if we aren't in the middle of whitespace. if state == state_whitespace: None # Do nothing. else: arg_list.append(arg) arg = '' state = state_whitespace else: arg = arg + c state = state_basic elif state == state_esc: # Follow bash escaping rules within double quotes: # http://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html if state_backup == state_doublequote and c not in ('$', '`', '"', '\\', '\n'): arg += '\\' arg = arg + c if state_backup != state_whitespace: state = state_backup else: state = state_basic elif state == state_singlequote: if c == r"'": state = state_basic else: arg = arg + c elif state == state_doublequote: if c == r'"': state = state_basic else: arg = arg + c if arg != '': arg_list.append(arg) return arg_list DisplayCAL-3.5.0.0/DisplayCAL/win_knownpaths.py0000644000076500000000000002543112757414644021071 0ustar devwheel00000000000000# knownpaths.py (https://gist.github.com/mkropat/7550097) # # The MIT License (MIT) # # Copyright (c) 2014 Michael Kropat # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # # I explicitly permit the knownpaths.py source code to be licensed by anyone # under the terms of the GNU GPL v3, as an alternative to the X11/MIT license. from __future__ import print_function # Python 2.6/2.7 compatibility import ctypes, sys from ctypes import windll, wintypes from uuid import UUID class GUID(ctypes.Structure): # [1] _fields_ = [ ("Data1", wintypes.DWORD), ("Data2", wintypes.WORD), ("Data3", wintypes.WORD), ("Data4", wintypes.BYTE * 8) ] def __init__(self, uuid_): ctypes.Structure.__init__(self) self.Data1, self.Data2, self.Data3, self.Data4[0], self.Data4[1], rest = uuid_.fields for i in range(2, 8): self.Data4[i] = rest>>(8 - i - 1)*8 & 0xff class FOLDERID: # [2] AccountPictures = UUID('{008ca0b1-55b4-4c56-b8a8-4de4b299d3be}') AdminTools = UUID('{724EF170-A42D-4FEF-9F26-B60E846FBA4F}') ApplicationShortcuts = UUID('{A3918781-E5F2-4890-B3D9-A7E54332328C}') CameraRoll = UUID('{AB5FB87B-7CE2-4F83-915D-550846C9537B}') CDBurning = UUID('{9E52AB10-F80D-49DF-ACB8-4330F5687855}') CommonAdminTools = UUID('{D0384E7D-BAC3-4797-8F14-CBA229B392B5}') CommonOEMLinks = UUID('{C1BAE2D0-10DF-4334-BEDD-7AA20B227A9D}') CommonPrograms = UUID('{0139D44E-6AFE-49F2-8690-3DAFCAE6FFB8}') CommonStartMenu = UUID('{A4115719-D62E-491D-AA7C-E74B8BE3B067}') CommonStartup = UUID('{82A5EA35-D9CD-47C5-9629-E15D2F714E6E}') CommonTemplates = UUID('{B94237E7-57AC-4347-9151-B08C6C32D1F7}') Contacts = UUID('{56784854-C6CB-462b-8169-88E350ACB882}') Cookies = UUID('{2B0F765D-C0E9-4171-908E-08A611B84FF6}') Desktop = UUID('{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}') DeviceMetadataStore = UUID('{5CE4A5E9-E4EB-479D-B89F-130C02886155}') Documents = UUID('{FDD39AD0-238F-46AF-ADB4-6C85480369C7}') DocumentsLibrary = UUID('{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}') Downloads = UUID('{374DE290-123F-4565-9164-39C4925E467B}') Favorites = UUID('{1777F761-68AD-4D8A-87BD-30B759FA33DD}') Fonts = UUID('{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}') GameTasks = UUID('{054FAE61-4DD8-4787-80B6-090220C4B700}') History = UUID('{D9DC8A3B-B784-432E-A781-5A1130A75963}') ImplicitAppShortcuts = UUID('{BCB5256F-79F6-4CEE-B725-DC34E402FD46}') InternetCache = UUID('{352481E8-33BE-4251-BA85-6007CAEDCF9D}') Libraries = UUID('{1B3EA5DC-B587-4786-B4EF-BD1DC332AEAE}') Links = UUID('{bfb9d5e0-c6a9-404c-b2b2-ae6db6af4968}') LocalAppData = UUID('{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}') LocalAppDataLow = UUID('{A520A1A4-1780-4FF6-BD18-167343C5AF16}') LocalizedResourcesDir = UUID('{2A00375E-224C-49DE-B8D1-440DF7EF3DDC}') Music = UUID('{4BD8D571-6D19-48D3-BE97-422220080E43}') MusicLibrary = UUID('{2112AB0A-C86A-4FFE-A368-0DE96E47012E}') NetHood = UUID('{C5ABBF53-E17F-4121-8900-86626FC2C973}') OriginalImages = UUID('{2C36C0AA-5812-4b87-BFD0-4CD0DFB19B39}') PhotoAlbums = UUID('{69D2CF90-FC33-4FB7-9A0C-EBB0F0FCB43C}') PicturesLibrary = UUID('{A990AE9F-A03B-4E80-94BC-9912D7504104}') Pictures = UUID('{33E28130-4E1E-4676-835A-98395C3BC3BB}') Playlists = UUID('{DE92C1C7-837F-4F69-A3BB-86E631204A23}') PrintHood = UUID('{9274BD8D-CFD1-41C3-B35E-B13F55A758F4}') Profile = UUID('{5E6C858F-0E22-4760-9AFE-EA3317B67173}') ProgramData = UUID('{62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}') ProgramFiles = UUID('{905e63b6-c1bf-494e-b29c-65b732d3d21a}') ProgramFilesX64 = UUID('{6D809377-6AF0-444b-8957-A3773F02200E}') ProgramFilesX86 = UUID('{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}') ProgramFilesCommon = UUID('{F7F1ED05-9F6D-47A2-AAAE-29D317C6F066}') ProgramFilesCommonX64 = UUID('{6365D5A7-0F0D-45E5-87F6-0DA56B6A4F7D}') ProgramFilesCommonX86 = UUID('{DE974D24-D9C6-4D3E-BF91-F4455120B917}') Programs = UUID('{A77F5D77-2E2B-44C3-A6A2-ABA601054A51}') Public = UUID('{DFDF76A2-C82A-4D63-906A-5644AC457385}') PublicDesktop = UUID('{C4AA340D-F20F-4863-AFEF-F87EF2E6BA25}') PublicDocuments = UUID('{ED4824AF-DCE4-45A8-81E2-FC7965083634}') PublicDownloads = UUID('{3D644C9B-1FB8-4f30-9B45-F670235F79C0}') PublicGameTasks = UUID('{DEBF2536-E1A8-4c59-B6A2-414586476AEA}') PublicLibraries = UUID('{48DAF80B-E6CF-4F4E-B800-0E69D84EE384}') PublicMusic = UUID('{3214FAB5-9757-4298-BB61-92A9DEAA44FF}') PublicPictures = UUID('{B6EBFB86-6907-413C-9AF7-4FC2ABF07CC5}') PublicRingtones = UUID('{E555AB60-153B-4D17-9F04-A5FE99FC15EC}') PublicUserTiles = UUID('{0482af6c-08f1-4c34-8c90-e17ec98b1e17}') PublicVideos = UUID('{2400183A-6185-49FB-A2D8-4A392A602BA3}') QuickLaunch = UUID('{52a4f021-7b75-48a9-9f6b-4b87a210bc8f}') Recent = UUID('{AE50C081-EBD2-438A-8655-8A092E34987A}') RecordedTVLibrary = UUID('{1A6FDBA2-F42D-4358-A798-B74D745926C5}') ResourceDir = UUID('{8AD10C31-2ADB-4296-A8F7-E4701232C972}') Ringtones = UUID('{C870044B-F49E-4126-A9C3-B52A1FF411E8}') RoamingAppData = UUID('{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}') RoamedTileImages = UUID('{AAA8D5A5-F1D6-4259-BAA8-78E7EF60835E}') RoamingTiles = UUID('{00BCFC5A-ED94-4e48-96A1-3F6217F21990}') SampleMusic = UUID('{B250C668-F57D-4EE1-A63C-290EE7D1AA1F}') SamplePictures = UUID('{C4900540-2379-4C75-844B-64E6FAF8716B}') SamplePlaylists = UUID('{15CA69B3-30EE-49C1-ACE1-6B5EC372AFB5}') SampleVideos = UUID('{859EAD94-2E85-48AD-A71A-0969CB56A6CD}') SavedGames = UUID('{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}') SavedSearches = UUID('{7d1d3a04-debb-4115-95cf-2f29da2920da}') Screenshots = UUID('{b7bede81-df94-4682-a7d8-57a52620b86f}') SearchHistory = UUID('{0D4C3DB6-03A3-462F-A0E6-08924C41B5D4}') SearchTemplates = UUID('{7E636BFE-DFA9-4D5E-B456-D7B39851D8A9}') SendTo = UUID('{8983036C-27C0-404B-8F08-102D10DCFD74}') SidebarDefaultParts = UUID('{7B396E54-9EC5-4300-BE0A-2482EBAE1A26}') SidebarParts = UUID('{A75D362E-50FC-4fb7-AC2C-A8BEAA314493}') SkyDrive = UUID('{A52BBA46-E9E1-435f-B3D9-28DAA648C0F6}') SkyDriveCameraRoll = UUID('{767E6811-49CB-4273-87C2-20F355E1085B}') SkyDriveDocuments = UUID('{24D89E24-2F19-4534-9DDE-6A6671FBB8FE}') SkyDrivePictures = UUID('{339719B5-8C47-4894-94C2-D8F77ADD44A6}') StartMenu = UUID('{625B53C3-AB48-4EC1-BA1F-A1EF4146FC19}') Startup = UUID('{B97D20BB-F46A-4C97-BA10-5E3608430854}') System = UUID('{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}') SystemX86 = UUID('{D65231B0-B2F1-4857-A4CE-A8E7C6EA7D27}') Templates = UUID('{A63293E8-664E-48DB-A079-DF759E0509F7}') UserPinned = UUID('{9E3995AB-1F9C-4F13-B827-48B24B6C7174}') UserProfiles = UUID('{0762D272-C50A-4BB0-A382-697DCD729B80}') UserProgramFiles = UUID('{5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}') UserProgramFilesCommon = UUID('{BCBD3057-CA5C-4622-B42D-BC56DB0AE516}') Videos = UUID('{18989B1D-99B5-455B-841C-AB7C74E4DDFC}') VideosLibrary = UUID('{491E922F-5643-4AF4-A7EB-4E7A138D8174}') Windows = UUID('{F38BF404-1D43-42F2-9305-67DE0B28FC23}') class UserHandle: # [3] current = wintypes.HANDLE(0) common = wintypes.HANDLE(-1) _CoTaskMemFree = windll.ole32.CoTaskMemFree # [4] _CoTaskMemFree.restype= None _CoTaskMemFree.argtypes = [ctypes.c_void_p] _SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath # [5] [3] _SHGetKnownFolderPath.argtypes = [ ctypes.POINTER(GUID), wintypes.DWORD, wintypes.HANDLE, ctypes.POINTER(ctypes.c_wchar_p) ] class PathNotFoundException(Exception): pass def get_path(folderid, user_handle=UserHandle.common): fid = GUID(folderid) pPath = ctypes.c_wchar_p() S_OK = 0 if _SHGetKnownFolderPath(ctypes.byref(fid), 0, user_handle, ctypes.byref(pPath)) != S_OK: raise PathNotFoundException() path = pPath.value _CoTaskMemFree(pPath) return path if __name__ == '__main__': if len(sys.argv) < 2 or sys.argv[1] in ['-?', '/?']: print('python knownpaths.py FOLDERID {current|common}') sys.exit(0) try: folderid = getattr(FOLDERID, sys.argv[1]) except AttributeError: print('Unknown folder id "%s"' % sys.argv[1], file=sys.stderr) sys.exit(1) try: if len(sys.argv) == 2: print(get_path(folderid)) else: print(get_path(folderid, getattr(UserHandle, sys.argv[2]))) except PathNotFoundException: print('Folder not found "%s"' % ' '.join(sys.argv[1:]), file=sys.stderr) sys.exit(1) # [1] http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx # [2] http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457.aspx # [3] http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx # [4] http://msdn.microsoft.com/en-us/library/windows/desktop/ms680722.aspx # [5] http://web.archive.org/web/20111025090317/http://www.themacaque.com/?p=954 DisplayCAL-3.5.0.0/DisplayCAL/worker.py0000644000076500000000000163731213242301247017321 0ustar devwheel00000000000000# -*- coding: utf-8 -*- # stdlib from __future__ import with_statement from binascii import hexlify import atexit import ctypes import getpass import glob import httplib import math import mimetypes import os import pipes import platform import re import socket import shutil import string import subprocess as sp import sys import tempfile import textwrap import threading import traceback import urllib import urllib2 import urlparse import warnings import zipfile import zlib from UserString import UserString from hashlib import md5, sha256 from threading import _MainThread, currentThread from time import sleep, strftime, time if sys.platform == "darwin": from platform import mac_ver from thread import start_new_thread elif sys.platform == "win32": from ctypes import windll import _winreg else: import grp # 3rd party if sys.platform == "win32": from win32com.shell import shell as win32com_shell import pythoncom import win32api import win32con import win32event import pywintypes import winerror elif sys.platform != "darwin": try: import dbus except ImportError: dbus = None dbus_session = None else: try: dbus_session = dbus.SessionBus() except dbus.exceptions.DBusException: dbus_session = None # custom import CGATS import ICCProfile as ICCP import audio import colormath import config import defaultpaths import imfile import localization as lang import wexpect from argyll_cgats import (add_dispcal_options_to_cal, add_options_to_ti3, cal_to_fake_profile, cal_to_vcgt, extract_cal_from_profile, extract_cal_from_ti3, extract_device_gray_primaries, extract_fix_copy_cal, ti3_to_ti1, verify_cgats, verify_ti1_rgb_xyz) from argyll_instruments import (get_canonical_instrument_name, instruments as all_instruments) from argyll_names import (names as argyll_names, altnames as argyll_altnames, optional as argyll_optional, viewconds, intents, observers) from config import (autostart, autostart_home, script_ext, defaults, enc, exe, exedir, exe_ext, fs_enc, getcfg, geticon, get_data_path, get_total_patches, get_verified_path, isapp, isexe, is_ccxx_testchart, logdir, profile_ext, pydir, setcfg, split_display_name, writecfg, appbasename) from debughelpers import (Error, DownloadError, Info, UnloggedError, UnloggedInfo, UnloggedWarning, Warn) from defaultpaths import (cache, get_known_folder_path, iccprofiles_home, iccprofiles_display_home) from edid import WMIError, get_edid from jsondict import JSONDict from log import DummyLogger, LogFile, get_file_logger, log, safe_print import madvr from meta import VERSION, VERSION_BASE, domain, name as appname, version from multiprocess import cpu_count, pool_slice from options import (always_fail_download, debug, experimental, test, test_badssl, test_require_sensor_cal, verbose) from ordereddict import OrderedDict from network import LoggingHTTPRedirectHandler, NoHTTPRedirectHandler from patterngenerators import (PrismaPatternGeneratorClient, ResolveLSPatternGeneratorServer, ResolveCMPatternGeneratorServer, WebWinHTTPPatternGeneratorServer) from trash import trash from util_decimal import stripzeros from util_http import encode_multipart_formdata from util_io import (EncodedWriter, Files, GzipFileProper, LineBufferedStream, LineCache, StringIOu as StringIO, TarFileProper) from util_list import intlist, natsort if sys.platform == "darwin": from util_mac import (mac_app_activate, mac_terminal_do_script, mac_terminal_set_colors, osascript) elif sys.platform == "win32": import util_win from util_win import run_as_admin, shell_exec, win_ver try: import wmi except Exception, exception: safe_print("Error - could not import WMI:", exception) wmi = None import colord from util_os import (expanduseru, fname_ext, getenvu, is_superuser, launch_file, make_win32_compatible_long_path, mksfile, mkstemp_bypath, quote_args, dlopen, which) if sys.platform not in ("darwin", "win32"): from util_os import getgroups if sys.platform == "win32" and sys.getwindowsversion() >= (6, ): from util_os import win64_disable_file_system_redirection from util_str import (make_filename_safe, safe_basestring, safe_asciize, safe_str, safe_unicode, strtr, universal_newlines) from worker_base import (MP_Xicclu, WorkerBase, Xicclu, _mp_generate_B2A_clut, _mp_xicclu, check_argyll_bin, get_argyll_util, get_argyll_utilname, get_argyll_version_string as base_get_argyll_version_string, parse_argyll_version_string, printcmdline) from wxaddons import BetterCallLater, BetterWindowDisabler, wx from wxwindows import (ConfirmDialog, HtmlInfoDialog, InfoDialog, ProgressDialog, SimpleTerminal, show_result_dialog) from wxDisplayAdjustmentFrame import DisplayAdjustmentFrame from wxDisplayUniformityFrame import DisplayUniformityFrame from wxUntetheredFrame import UntetheredFrame RDSMM = None if sys.platform not in ("darwin", "win32"): try: import RealDisplaySizeMM as RDSMM except ImportError, exception: warnings.warn(safe_str(exception, enc), Warning) import wx.lib.delayedresult as delayedresult INST_CAL_MSGS = ["Do a reflective white calibration", "Do a transmissive white calibration", "Do a transmissive dark calibration", "Place the instrument on its reflective white reference", "Click the instrument on its reflective white reference", "Place the instrument in the dark", "Place cap on the instrument", # i1 Pro "or place on the calibration reference", # i1 Pro "Place ambient adapter and cap on the instrument", "Set instrument sensor to calibration position", # ColorMunki "Place the instrument on its transmissive white source", "Use the appropriate tramissive blocking", "Change filter on instrument to"] USE_WPOPEN = 0 keycodes = {wx.WXK_NUMPAD0: ord("0"), wx.WXK_NUMPAD1: ord("1"), wx.WXK_NUMPAD2: ord("2"), wx.WXK_NUMPAD3: ord("3"), wx.WXK_NUMPAD4: ord("4"), wx.WXK_NUMPAD5: ord("5"), wx.WXK_NUMPAD6: ord("6"), wx.WXK_NUMPAD7: ord("7"), wx.WXK_NUMPAD8: ord("8"), wx.WXK_NUMPAD9: ord("9"), wx.WXK_NUMPAD_ADD: ord("+"), wx.WXK_NUMPAD_ENTER: ord("\n"), wx.WXK_NUMPAD_EQUAL: ord("="), wx.WXK_NUMPAD_DIVIDE: ord("/"), wx.WXK_NUMPAD_MULTIPLY: ord("*"), wx.WXK_NUMPAD_SUBTRACT: ord("-")} technology_strings_170 = JSONDict() technology_strings_170["u"] = "Unknown" technology_strings_170.path = "technology_strings-1.7.0.json" # Argyll 1.7.1 fixes the technology type and display type selector # "uniqueification" bug and thus uses different technology selectors technology_strings_171 = JSONDict() technology_strings_171["u"] = "Unknown" technology_strings_171.path = "technology_strings-1.7.1.json" workers = [] def Property(func): return property(**func()) def add_keywords_to_cgats(cgats, keywords): """ Add keywords to CGATS """ if not isinstance(cgats, CGATS.CGATS): cgats = CGATS.CGATS(cgats) for keyword, value in keywords.iteritems(): cgats[0].add_keyword(keyword, value) return cgats def check_create_dir(path): """ Try to create a directory and show an error message on failure. """ if not os.path.exists(path): try: os.makedirs(path) except Exception, exception: return Error(lang.getstr("error.dir_creation", path) + "\n\n" + safe_unicode(exception)) if not os.path.isdir(path): return Error(lang.getstr("error.dir_notdir", path)) return True def check_cal_isfile(cal=None, missing_msg=None, notfile_msg=None, silent=False): """ Check if a calibration file exists and show an error message if not. """ if not silent: if not missing_msg: missing_msg = lang.getstr("error.calibration.file_missing", cal) if not notfile_msg: notfile_msg = lang.getstr("file_notfile", cal) return check_file_isfile(cal, missing_msg, notfile_msg, silent) def check_profile_isfile(profile_path=None, missing_msg=None, notfile_msg=None, silent=False): """ Check if a profile exists and show an error message if not. """ if not silent: if not missing_msg: missing_msg = lang.getstr("error.profile.file_missing", profile_path) if not notfile_msg: notfile_msg = lang.getstr("file_notfile", profile_path) return check_file_isfile(profile_path, missing_msg, notfile_msg, silent) def check_file_isfile(filename, missing_msg=None, notfile_msg=None, silent=False): """ Check if a file exists and show an error message if not. """ if not os.path.exists(filename): if not silent: if not missing_msg: missing_msg = lang.getstr("file.missing", filename) return Error(missing_msg) return False if not os.path.isfile(filename): if not silent: if not notfile_msg: notfile_msg = lang.getstr("file.notfile", filename) return Error(notfile_msg) return False return True def check_set_argyll_bin(paths=None): """ Check if Argyll binaries can be found, otherwise let the user choose. """ if check_argyll_bin(paths): return True else: return set_argyll_bin() def check_ti3_criteria1(RGB, XYZ, black_XYZ, white_XYZ, delta_to_sRGB_threshold_E=10, delta_to_sRGB_threshold_L=10, delta_to_sRGB_threshold_C=75, delta_to_sRGB_threshold_H=75, print_debuginfo=True): sRGBLab = colormath.RGB2Lab(RGB[0] / 100.0, RGB[1] / 100.0, RGB[2] / 100.0, noadapt=not white_XYZ) if white_XYZ: if black_XYZ: black_Lab = colormath.XYZ2Lab(*colormath.adapt(black_XYZ[0], black_XYZ[1], black_XYZ[2], white_XYZ)) black_C = math.sqrt(math.pow(black_Lab[1], 2) + math.pow(black_Lab[2], 2)) if black_Lab[0] < 3 and black_C < 3: # Sanity check: Is this color reasonably dark and achromatic? # Then do BPC so we can compare better to perfect black sRGB XYZ = colormath.blend_blackpoint(XYZ[0], XYZ[1], XYZ[2], black_XYZ) XYZ = colormath.adapt(XYZ[0], XYZ[1], XYZ[2], white_XYZ) Lab = colormath.XYZ2Lab(*XYZ) delta_to_sRGB = colormath.delta(*sRGBLab + Lab + (2000, )) # Depending on how (a)chromatic the sRGB color is, scale the thresholds # Use math derived from DE2000 formula to get chroma and hue angle L, a, b = sRGBLab b_pow = math.pow(b, 2) C = math.sqrt(math.pow(a, 2) + b_pow) C_pow = math.pow(C, 7) G = .5 * (1 - math.sqrt(C_pow / (C_pow + math.pow(25, 7)))) a = (1 + G) * a C = math.sqrt(math.pow(a, 2) + b_pow) h = 0 if a == 0 and b == 0 else math.degrees(math.atan2(b, a)) + (0 if b >= 0 else 360.0) # C and h scaling factors C_scale = C / 100.0 h_scale = h / 360.0 # RGB hue, saturation and value scaling factors H, S, V = colormath.RGB2HSV(*[v / 100.0 for v in RGB]) SV_scale = S * V # Scale the thresholds delta_to_sRGB_threshold_E += (delta_to_sRGB_threshold_E * max(C_scale, SV_scale)) delta_to_sRGB_threshold_L += (delta_to_sRGB_threshold_L * max(C_scale, SV_scale)) # Allow higher chroma errors as luminance of reference decreases L_scale = max(1 - (1 * C_scale) + (100.0 - L) / 100.0, 1) delta_to_sRGB_threshold_C = ((delta_to_sRGB_threshold_C * max(C_scale, SV_scale) + 2) * L_scale) delta_to_sRGB_threshold_H = ((delta_to_sRGB_threshold_H * max(C_scale, h_scale, H, SV_scale) + 2) * L_scale) criteria1 = (delta_to_sRGB["E"] > delta_to_sRGB_threshold_E and (abs(delta_to_sRGB["L"]) > delta_to_sRGB_threshold_L or abs(delta_to_sRGB["C"]) > delta_to_sRGB_threshold_C or abs(delta_to_sRGB["H"]) > delta_to_sRGB_threshold_H)) # This patch has an unusually high delta 00 to its sRGB equivalent delta_to_sRGB["E_ok"] = delta_to_sRGB["E"] <= delta_to_sRGB_threshold_E delta_to_sRGB["L_ok"] = (abs(delta_to_sRGB["L"]) <= delta_to_sRGB_threshold_L) delta_to_sRGB["C_ok"] = (abs(delta_to_sRGB["C"]) <= delta_to_sRGB_threshold_C) delta_to_sRGB["H_ok"] = (abs(delta_to_sRGB["H"]) <= delta_to_sRGB_threshold_H) delta_to_sRGB["ok"] = (delta_to_sRGB["E_ok"] and delta_to_sRGB["L_ok"] and delta_to_sRGB["C_ok"] and delta_to_sRGB["H_ok"]) debuginfo = ("RGB: %6.2f %6.2f %6.2f RGB(sRGB)->Lab(D50): %6.2f %6.2f %6.2f " "L_scale: %5.3f C: %5.2f C_scale: %5.3f h: %5.2f " "h_scale: %5.3f H: %5.2f H_scale: %5.3f S: %5.2f " "V: %5.2f SV_scale: %5.3f Thresholds: E %5.2f L %5.2f " "C %5.2f H %5.2f XYZ->Lab(D50): %6.2f %6.2f %6.2f delta " "RGB(sRGB)->Lab(D50) to XYZ->Lab(D50): dE %5.2f dL %5.2f dC " "%5.2f dH %5.2f" % (RGB[0], RGB[1], RGB[2], sRGBLab[0], sRGBLab[1], sRGBLab[2], L_scale, C, C_scale, h, h_scale, H * 360, H, S, V, SV_scale, delta_to_sRGB_threshold_E, delta_to_sRGB_threshold_L, delta_to_sRGB_threshold_C, delta_to_sRGB_threshold_H, Lab[0], Lab[1], Lab[2], delta_to_sRGB["E"], delta_to_sRGB["L"], delta_to_sRGB["C"], delta_to_sRGB["H"])) if print_debuginfo: safe_print(debuginfo) return sRGBLab, Lab, delta_to_sRGB, criteria1, debuginfo def check_ti3_criteria2(prev_Lab, Lab, prev_sRGBLab, sRGBLab, prev_RGB, RGB, sRGB_delta_E_scale_factor=.5): delta = colormath.delta(*prev_Lab + Lab + (2000, )) sRGB_delta = colormath.delta(*prev_sRGBLab + sRGBLab + (2000, )) sRGB_delta["E"] *= sRGB_delta_E_scale_factor criteria2 = delta["E"] < sRGB_delta["E"] # These two patches have different RGB values # but suspiciously low delta E 76. if criteria2 and (prev_RGB[0] == prev_RGB[1] == prev_RGB[2] and RGB[0] == RGB[1] == RGB[2]): # If RGB gray, check if the Y difference makes sense criteria2 = ((RGB[0] > prev_RGB[0] and Lab[0] <= prev_Lab[0]) or (RGB[0] < prev_RGB[0] and Lab[0] >= prev_Lab[0])) delta["L_ok"] = not criteria2 delta["E_ok"] = True else: delta["E_ok"] = not criteria2 delta["L_ok"] = True return delta, sRGB_delta, criteria2 def check_ti3(ti3, print_debuginfo=True): """ Check subsequent patches' expected vs real deltaE and collect patches with different RGB values, but suspiciously low delta E Used as a means to find misreads. The expected dE is calculated by converting from a patches RGB values (assuming sRGB) to Lab and comparing the values. """ if not isinstance(ti3, CGATS.CGATS): ti3 = CGATS.CGATS(ti3) data = ti3.queryv1("DATA") datalen = len(data) black = data.queryi1({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}) if black: black = black["XYZ_X"], black["XYZ_Y"], black["XYZ_Z"] elif print_debuginfo: safe_print("Warning - no black patch found in CGATS") white = data.queryi1({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100}) if white: white = white["XYZ_X"], white["XYZ_Y"], white["XYZ_Z"] elif print_debuginfo: safe_print("Warning - no white patch found in CGATS") suspicious = [] prev = {} delta = {} for index, item in data.iteritems(): (sRGBLab, Lab, delta_to_sRGB, criteria1, debuginfo) = check_ti3_criteria1((item["RGB_R"], item["RGB_G"], item["RGB_B"]), (item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"]), black, white, print_debuginfo=False) if (criteria1 or (prev and (max(prev["item"]["RGB_R"], item["RGB_R"]) - min(prev["item"]["RGB_R"], item["RGB_R"]) > 1.0 / 2.55 or max(prev["item"]["RGB_G"], item["RGB_G"]) - min(prev["item"]["RGB_G"], item["RGB_G"]) > 1.0 / 2.55 or max(prev["item"]["RGB_B"], item["RGB_B"]) - min(prev["item"]["RGB_B"], item["RGB_B"]) > 1.0 / 2.55))): if prev: (delta, sRGB_delta, criteria2) = check_ti3_criteria2(prev["Lab"], Lab, prev["sRGBLab"], sRGBLab, (prev["item"]["RGB_R"], prev["item"]["RGB_G"], prev["item"]["RGB_B"]), (item["RGB_R"], item["RGB_G"], item["RGB_B"])) else: criteria2 = False if criteria1 or criteria2: if print_debuginfo: if criteria2: debuginfo = (("%s dE to previous XYZ->Lab(D50): " "%5.3f dE_OK: %s L_OK: %s " "0.5 dE RGB(sRGB)->Lab(D50) to previous " "RGB(sRGB)->Lab(D50): %5.3f") % (debuginfo, delta["E"], delta["E_ok"], delta["L_ok"], sRGB_delta["E"])) sample_id = "Patch #%%.0%id" % len(str(datalen)) safe_print(sample_id % item.SAMPLE_ID, debuginfo) suspicious.append((prev["item"] if criteria2 else None, item, delta if criteria2 else None, sRGB_delta if criteria2 else None, prev["delta_to_sRGB"] if criteria2 else None, delta_to_sRGB)) prev["item"] = item prev["sRGBLab"] = sRGBLab prev["Lab"] = Lab prev["delta_to_sRGB"] = delta_to_sRGB return suspicious def create_shaper_curves(RGB_XYZ, bwd_mtx, single_curve=False, bpc=True, logfn=None, slope_limit=False, profile=None, options_dispcal=None, optimize=False): """ Create input (device to PCS) shaper curves """ RGB_XYZ.sort() R_R = [] G_G = [] B_B = [] R_X = [] G_Y = [] B_Z = [] XYZbp = None XYZwp = None for (R, G, B), (X, Y, Z) in RGB_XYZ.iteritems(): X, Y, Z = colormath.adapt(X, Y, Z, RGB_XYZ[(100, 100, 100)]) if 100 > R > 0 and min(X, Y, Z) < 100.0 / 65535: # Skip non-black/non-white gray values not encodable in 16-bit continue R_R.append(R / 100.0) G_G.append(G / 100.0) B_B.append(B / 100.0) R_X.append(X / 100.0) G_Y.append(Y / 100.0) B_Z.append(Z / 100.0) if R == G == B == 0: XYZbp = [v / 100.0 for v in (X, Y, Z)] elif R == G == B == 100: XYZwp = [v / 100.0 for v in (X, Y, Z)] numvalues = len(R_R) # Scale black to zero for i in xrange(numvalues): if bwd_mtx * [1, 1, 1] == [1, 1, 1]: (R_X[i], G_Y[i], B_Z[i]) = colormath.apply_bpc(R_X[i], G_Y[i], B_Z[i], XYZbp, (0, 0, 0), XYZwp) else: (R_X[i], G_Y[i], B_Z[i]) = colormath.blend_blackpoint(R_X[i], G_Y[i], B_Z[i], XYZbp) rinterp = colormath.Interp(R_R, R_X) ginterp = colormath.Interp(G_G, G_Y) binterp = colormath.Interp(B_B, B_Z) curves = [] for i in xrange(3): curves.append([]) # Interpolate TRC numentries = 33 maxval = numentries - 1.0 powinterp = {"r": colormath.Interp([], []), "g": colormath.Interp([], []), "b": colormath.Interp([], [])} RGBwp = bwd_mtx * XYZwp for n in xrange(numentries): n /= maxval # Apply slight power to input value so we sample near # black more accurately n **= 1.2 Y = ginterp(n) X = rinterp(n) Z = binterp(n) if Y >= 1: # Fix Y >= 1 to whitepoint. Mainly for HDR with PQ clipping, # where input gray < 1 can result in >= white Y X, Y, Z = XYZwp elif single_curve: X, Y, Z = [v * Y for v in XYZwp] RGB = bwd_mtx * (X, Y, Z) for i, channel in enumerate("rgb"): v = RGB[i] v = min(max(v, 0), 1) if slope_limit: v = max(v, n / 64.25) powinterp[channel].xp.append(n) powinterp[channel].fp.append(v) for n in xrange(numentries): for i, channel in enumerate("rgb"): v = powinterp[channel](n / maxval) curves[i].append(v) # Interpolate to final resolution for curve in curves: # Make monotonically increasing curve[:] = colormath.make_monotonically_increasing(curve) # Spline interpolation to larger size x = (i / 255.0 * (len(curve) - 1) for i in xrange(256)) spline = ICCP.CRInterpolation(curve) curve[:] = (min(max(spline(v), 0), 1) for v in x) # Ensure still monotonically increasing curve[:] = colormath.make_monotonically_increasing(curve) if optimize: curves = _create_optimized_shaper_curves(bwd_mtx, bpc, single_curve, curves, profile, options_dispcal, XYZbp, logfn) return curves def _create_optimized_shaper_curves(bwd_mtx, bpc, single_curve, curves, profile, options_dispcal, XYZbp=None, logfn=None): # Get black and white luminance if isinstance(profile.tags.get("lumi"), ICCP.XYZType): white_cdm2 = profile.tags.lumi.Y else: white_cdm2 = 100.0 black_Y = XYZbp and XYZbp[1] or 0 black_cdm2 = black_Y * white_cdm2 # Calibration gamma defaults gamma_type = None calgamma = 0 outoffset = None # Get actual calibration gamma (if any) calgarg = get_arg("g", options_dispcal) if not calgarg: calgarg = get_arg("G", options_dispcal) if (calgarg and isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType) and not profile.tags.vcgt.is_linear()): calgamma = {"l": -3.0, "s": -2.4, "709": -709, "240": -240}.get(calgarg[1][1:], calgamma) if not calgamma: try: calgamma = float(calgarg[1][1:]) except ValueError: # Not a gamma value pass if calgamma: gamma_type = calgarg[1][0] outoffset = defaults["calibration.black_output_offset"] calfarg = get_arg("f", options_dispcal) if calfarg: try: outoffset = float(calfarg[1][1:]) except ValueError: pass caltrc = ICCP.CurveType(profile=profile) if calgamma > 0: caltrc.set_bt1886_trc(black_Y, outoffset, calgamma, gamma_type) else: caltrc.set_trc(calgamma) caltf = caltrc.get_transfer_function(True, (0, 1), black_Y, outoffset) logfn and logfn("Black relative luminance = %.6f" % round(black_Y, 6)) if outoffset is not None: logfn and logfn("Black output offset = %.2f" % round(outoffset, 2)) if calgamma > 0: logfn and logfn("Calibration gamma = %.2f %s" % (round(calgamma, 2), {"g": "relative", "G": "absolute"}.get(gamma_type))) if calgamma: logfn and logfn(u"Calibration overall transfer function " u"≈ %s (Δ %.2f%%)" % (caltf[0][0], 100 - caltf[1] * 100)) if calgamma > 0 and black_Y: # Calculate effective gamma midpoint = colormath.interp((len(caltrc) - 1) / 2.0, range(len(caltrc)), caltrc) gamma = colormath.get_gamma([(0.5, midpoint / 65535.0)]) logfn and logfn(u"Calibration effective gamma = %.2f" % gamma) tfs = [] for i, channel in enumerate("rgb"): trc = ICCP.CurveType(profile=profile) trc[:] = [v / float(curves[i][-1]) * 65535 for v in curves[i]] # Get transfer function and see if we have a good match # to a standard. If we do, use the standard transfer # function instead of our measurement based one. # This avoids artifacts when processing is done in # limited (e.g. 8 bit) precision by a color managed # application and the source profile uses the same # standard transfer function. tf = trc.get_transfer_function(True, (0, 1), black_Y, outoffset) label = ["Transfer function", channel.upper()] label.append(u"≈ %s (Δ %.2f%%)" % (tf[0][0], 100 - tf[1] * 100)) logfn and logfn(" ".join(label)) gamma = tf[0][1] if gamma > 0 and black_Y: # Calculate effective gamma gamma = colormath.get_gamma([(0.5, 0.5 ** gamma)], vmin=-black_Y) logfn and logfn("Effective gamma = %.2f" % round(gamma, 2)) # Only use standard transfer function if we got a good match if tf[1] >= 0.98: # Good match logfn and logfn("Got good match (+-2%)") if (single_curve and calgamma and round(tf[0][1], 1) == round(caltf[0][1], 1)): # Use calibration gamma tf = caltf logfn and logfn("Using calibration transfer function") tfs.append((tf, trc)) if len(tfs) == 3: # Only use standard transfer function if we got a good # identical match for all three channels. optcurves = [] for i, channel in enumerate("rgb"): tf, trc = tfs[i] gamma = tf[0][1] if gamma > 0 and black_Y: # Calculate effective gamma egamma = colormath.get_gamma([(0.5, 0.5 ** gamma)], vmin=-black_Y) else: egamma = gamma if outoffset is None: outoffset = tf[0][2] if gamma > 0 and bpc and (outoffset == 1.0 or not black_Y) and bwd_mtx * [1, 1, 1] != [1, 1, 1]: # Single gamma value, BPC, all output offset or # zero black luminance if gamma_type == "g": gamma = egamma trc.set_trc(gamma, 1) else: # Complex or gamma with offset if gamma == -1023: # DICOM is a special case trc.set_dicom_trc(black_cdm2, white_cdm2) elif gamma == -1886: # BT.1886 is a special case trc.set_bt1886_trc(black_Y) elif gamma == -2084: # SMPTE 2084 is a special case trc.set_smpte2084_trc(black_cdm2, white_cdm2) elif gamma > 0 and black_Y: # BT.1886-like or power law with offset if bpc and gamma_type == "g": # Use effective gamma needed to # achieve target effective gamma # after accounting for BPC eegamma = colormath.get_gamma([(0.5, 0.5 ** egamma)], vmin=-black_Y) else: eegamma = egamma trc.set_bt1886_trc(black_Y, outoffset, eegamma, "g") else: # L*, sRGB, Rec. 709, SMPTE 240M, or # power law without offset if bpc and gamma_type == "g": # Use effective gamma gamma = egamma trc.set_trc(gamma) trc.apply_bpc() tf = trc.get_transfer_function(True, (0, 1), black_Y, outoffset) logfn and logfn("Using transfer function for %s: %s" % (channel.upper(), tf[0][0])) gamma = tf[0][1] if gamma > 0 and black_Y: # Calculate effective gamma gamma = colormath.get_gamma([(0.5, 0.5 ** gamma)], vmin=-black_Y) logfn and logfn("Effective gamma = %.2f" % round(gamma, 2)) optcurves.append([v / 65535.0 * curves[i][-1] for v in trc]) curves = optcurves return curves def get_argyll_version(name, silent=False, paths=None): """ Determine version of a certain Argyll utility. """ argyll_version_string = get_argyll_version_string(name, silent, paths) return parse_argyll_version_string(argyll_version_string) def get_argyll_version_string(name, silent=False, paths=None): argyll_version_string = "0.0.0" if (silent and check_argyll_bin(paths)) or (not silent and check_set_argyll_bin(paths)): argyll_version_string = base_get_argyll_version_string(name, paths) return argyll_version_string def get_current_profile_path(include_display_profile=True, save_profile_if_no_path=False): profile = None profile_path = getcfg("calibration.file", False) if profile_path: filename, ext = os.path.splitext(profile_path) if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(profile_path) except Exception, exception: safe_print("ICCP.ICCProfile(%r):" % profile_path, exception) elif include_display_profile: profile = config.get_display_profile() if profile and not profile.fileName and save_profile_if_no_path: if profile.ID == "\0" * 16: profile.calculateID() profile_cache_path = os.path.join(cache, "icc") if check_create_dir(profile_cache_path) is True: profile.fileName = os.path.join(profile_cache_path, "id=" + hexlify(profile.ID) + profile_ext) if not os.path.isfile(profile.fileName): profile.write() if profile: return profile.fileName def parse_argument_string(args): """ Parses an argument string and returns a list of arguments. """ return [re.sub('^["\']|["\']$', '', arg) for arg in re.findall('(?:^|\s+)(-[^\s"\']+|"[^"]+?"|\'[^\']+?\'|[^\s"\']+)', args)] def get_cfg_option_from_args(option_name, argmatch, args, whole=False): """ Parse args and return option (if found), otherwise default """ option = defaults[option_name] iarg = get_arg(argmatch, args, whole) if iarg: if len(iarg[1]) == len(argmatch): # Option value is the next argument if len(args) > iarg[0] + 1: option = args[iarg[0] + 1] else: # Option value follows argument directly option = iarg[1][len(argmatch):] return option def get_options_from_args(dispcal_args=None, colprof_args=None): """ Extract options used for dispcal and colprof from argument strings. """ re_options_dispcal = [ "[moupHVFE]", "d(?:\d+(?:,\d+)?|madvr|web)", "[cv]\d+", "q(?:%s)" % "|".join(config.valid_values["calibration.quality"]), "y(?:%s)" % "|".join(filter(None, config.valid_values["measurement_mode"])), "[tT](?:\d+(?:\.\d+)?)?", "w\d+(?:\.\d+)?,\d+(?:\.\d+)?", "[bfakAB]\d+(?:\.\d+)?", "(?:g(?:240|709|l|s)|[gG]\d+(?:\.\d+)?)", "[pP]\d+(?:\.\d+)?,\d+(?:\.\d+)?,\d+(?:\.\d+)?", 'X(?:\s*\d+|\s+["\'][^"\']+?["\'])', # Argyll >= 1.3.0 colorimeter correction matrix / Argyll >= 1.3.4 calibration spectral sample "I[bw]{,2}", # Argyll >= 1.3.0 drift compensation "YA", # Argyll >= 1.5.0 disable adaptive mode "Q\w+" ] re_options_colprof = [ "q[lmh]", "b[lmh]", # B2A quality "a(?:%s)" % "|".join(config.valid_values["profile.type"]), '[sSMA]\s+["\'][^"\']+?["\']', "[cd](?:%s)(?=\W|$)" % "|".join(viewconds), "[tT](?:%s)(?=\W|$)" % "|".join(intents) ] options_dispcal = [] options_colprof = [] if dispcal_args: options_dispcal = re.findall(" -(" + "|".join(re_options_dispcal) + ")", " " + dispcal_args) if colprof_args: options_colprof = re.findall(" -(" + "|".join(re_options_colprof) + ")", " " + colprof_args) return options_dispcal, options_colprof def get_options_from_cprt(cprt): """ Extract options used for dispcal and colprof from profile copyright. """ if not isinstance(cprt, unicode): if isinstance(cprt, (ICCP.TextDescriptionType, ICCP.MultiLocalizedUnicodeType)): cprt = unicode(cprt) else: cprt = unicode(cprt, fs_enc, "replace") dispcal_args = cprt.split(" dispcal ") colprof_args = None if len(dispcal_args) > 1: dispcal_args[1] = dispcal_args[1].split(" colprof ") if len(dispcal_args[1]) > 1: colprof_args = dispcal_args[1][1] dispcal_args = dispcal_args[1][0] else: dispcal_args = None colprof_args = cprt.split(" colprof ") if len(colprof_args) > 1: colprof_args = colprof_args[1] else: colprof_args = None return dispcal_args, colprof_args def get_options_from_cal(cal): if not isinstance(cal, CGATS.CGATS): cal = CGATS.CGATS(cal) if 0 in cal: cal = cal[0] if not cal or not "ARGYLL_DISPCAL_ARGS" in cal or \ not cal.ARGYLL_DISPCAL_ARGS: return [], [] dispcal_args = cal.ARGYLL_DISPCAL_ARGS[0].decode("UTF-7", "replace") return get_options_from_args(dispcal_args) def get_options_from_profile(profile): """ Try and get options from profile. First, try the 'targ' tag and look for the special DisplayCAL sections 'ARGYLL_DISPCAL_ARGS' and 'ARGYLL_COLPROF_ARGS'. If either does not exist, fall back to the copyright tag (DisplayCAL < 0.4.0.2) """ if not isinstance(profile, ICCP.ICCProfile): profile = ICCP.ICCProfile(profile) dispcal_args = None colprof_args = None if "targ" in profile.tags: ti3 = CGATS.CGATS(profile.tags.targ) if 1 in ti3 and "ARGYLL_DISPCAL_ARGS" in ti3[1] and \ ti3[1].ARGYLL_DISPCAL_ARGS: dispcal_args = ti3[1].ARGYLL_DISPCAL_ARGS[0].decode("UTF-7", "replace") if 0 in ti3 and "ARGYLL_COLPROF_ARGS" in ti3[0] and \ ti3[0].ARGYLL_COLPROF_ARGS: colprof_args = ti3[0].ARGYLL_COLPROF_ARGS[0].decode("UTF-7", "replace") if not dispcal_args and "cprt" in profile.tags: dispcal_args = get_options_from_cprt(profile.getCopyright())[0] if not colprof_args and "cprt" in profile.tags: colprof_args = get_options_from_cprt(profile.getCopyright())[1] return get_options_from_args(dispcal_args, colprof_args) def get_options_from_ti3(ti3): """ Try and get options from TI3 file by looking for the special DisplayCAL sections 'ARGYLL_DISPCAL_ARGS' and 'ARGYLL_COLPROF_ARGS'. """ if not isinstance(ti3, CGATS.CGATS): ti3 = CGATS.CGATS(ti3) dispcal_args = None colprof_args = None if 1 in ti3 and "ARGYLL_DISPCAL_ARGS" in ti3[1] and \ ti3[1].ARGYLL_DISPCAL_ARGS: dispcal_args = ti3[1].ARGYLL_DISPCAL_ARGS[0].decode("UTF-7", "replace") if 0 in ti3 and "ARGYLL_COLPROF_ARGS" in ti3[0] and \ ti3[0].ARGYLL_COLPROF_ARGS: colprof_args = ti3[0].ARGYLL_COLPROF_ARGS[0].decode("UTF-7", "replace") return get_options_from_args(dispcal_args, colprof_args) def get_pattern_geometry(): """ Return pattern geometry for pattern generator """ x, y, size = [float(v) for v in getcfg("dimensions.measureframe").split(",")] size = size * defaults["size.measureframe"] match = re.search("@ -?\d+, -?\d+, (\d+)x(\d+)", getcfg("displays", raw=True)) if match: display_size = [int(item) for item in match.groups()] else: display_size = 1920, 1080 w, h = [min(size / v, 1.0) for v in display_size] if config.get_display_name(None, True) == "Prisma": w = h x = (display_size[0] - w * display_size[0]) * x / display_size[0] y = (display_size[1] - h * display_size[1]) * y / display_size[1] x, y, w, h = [max(v, 0) for v in (x, y, w, h)] size = min((w * display_size[0] * h * display_size[1]) / float(display_size[0] * display_size[1]), 1.0) return x, y, w, h, size def get_python_and_pythonpath(): """ Return (system) python and pythonpath """ # Determine the path of python, and python module search paths # If we are running 'frozen', expect python.exe in the same directory # as the packed executable. # py2exe: The python executable can be included via setup script by # adding it to 'data_files' pythonpath = list(sys.path) dirname = os.path.dirname(sys.executable) if sys.platform == "win32": if getattr(sys, "frozen", False): pythonpath = [dirname] # If we are running 'frozen', add library.zip and lib\library.zip # to sys.path # py2exe: Needs appropriate 'zipfile' option in setup script and # 'bundle_files' 3 pythonpath.append(os.path.join(dirname, "library.zip")) pythonpath.append(os.path.join(dirname, "library.zip", appname)) if os.path.isdir(os.path.join(dirname, "lib")): dirname = os.path.join(dirname, "lib") pythonpath.append(os.path.join(dirname, "library.zip")) pythonpath.append(os.path.join(dirname, "library.zip", appname)) python = os.path.join(dirname, "python.exe") else: # Linux / Mac OS X if isapp: python = os.path.join(dirname, "python") else: paths = os.defpath.split(os.pathsep) python = (which("python2.7", paths) or which("python2.6", paths) or "/usr/bin/env python") return (python, pythonpath) def get_arg(argmatch, args, whole=False): """ Return first found entry beginning with the argmatch string or None """ for i, arg in enumerate(args): if (whole and arg == argmatch) or (not whole and arg.startswith(argmatch)): return i, arg def http_request(parent=None, domain=None, request_type="GET", path="", params=None, files=None, headers=None, charset="UTF-8", failure_msg="", silent=False): """ HTTP request wrapper """ if params is None: params = {} if files: content_type, params = encode_multipart_formdata(params.iteritems(), files) else: for key in params: params[key] = safe_str(params[key], charset) params = urllib.urlencode(params) if headers is None: if sys.platform == "darwin": # Python's platform.platform output is useless under Mac OS X # (e.g. 'Darwin-15.0.0-x86_64-i386-64bit' for Mac OS X 10.11 El Capitan) oscpu = "Mac OS X %s; %s" % (mac_ver()[0], mac_ver()[-1]) elif sys.platform == "win32": machine = platform.machine() oscpu = "%s; %s" % (" ".join(filter(lambda v: v, win_ver())), {"AMD64": "x86_64"}.get(machine, machine)) else: # Linux oscpu = "%s; %s" % (' '.join(platform.dist()), platform.machine()) headers = {"User-Agent": "%s/%s (%s)" % (appname, version, oscpu)} if request_type == "GET": path += '?' + params params = None else: if files: headers.update({"Content-Type": content_type, "Content-Length": str(len(params))}) else: headers.update({"Content-Type": "application/x-www-form-urlencoded", "Accept": "text/plain"}) conn = httplib.HTTPConnection(domain) try: conn.request(request_type, path, params, headers) resp = conn.getresponse() except (socket.error, httplib.HTTPException), exception: msg = " ".join([failure_msg, lang.getstr("connection.fail", " ".join([str(arg) for arg in exception.args]))]).strip() safe_print(msg) if not silent: wx.CallAfter(InfoDialog, parent, msg=msg, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False) return False if resp.status >= 400: uri = "http://" + domain + path msg = " ".join([failure_msg, lang.getstr("connection.fail.http", " ".join([str(resp.status), resp.reason]))]).strip() + "\n" + uri safe_print(msg) html = universal_newlines(resp.read().strip()) html = re.sub(re.compile(r"", re.I | re.S), "", html) html = re.sub(re.compile(r"", re.I | re.S), "", html) safe_print(html) if not silent: wx.CallAfter(HtmlInfoDialog, parent, msg=msg, html=html, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error"), log=False) return False return resp def insert_ti_patches_omitting_RGB_duplicates(cgats1, cgats2_path, logfn=safe_print): """ Insert patches from first TI file after first patch of second TI, ignoring RGB duplicates. Return second TI as CGATS instance. """ cgats2 = CGATS.CGATS(cgats2_path) cgats1_data = cgats1.queryv1("DATA") data = cgats2.queryv1("DATA") data_format = cgats2.queryv1("DATA_FORMAT") # Get only RGB data data.parent.DATA_FORMAT = CGATS.CGATS() data.parent.DATA_FORMAT.key = "DATA_FORMAT" data.parent.DATA_FORMAT.parent = data data.parent.DATA_FORMAT.root = data.root data.parent.DATA_FORMAT.type = "DATA_FORMAT" for i, label in enumerate(("RGB_R", "RGB_G", "RGB_B")): data.parent.DATA_FORMAT[i] = label cgats1_data.parent.DATA_FORMAT = data.parent.DATA_FORMAT rgbdata = str(data) # Restore DATA_FORMAT data.parent.DATA_FORMAT = data_format # Collect all preconditioning point datasets not in data cgats1_data.vmaxlen = data.vmaxlen cgats1_datasets = [] for i, dataset in cgats1_data.iteritems(): if not str(dataset) in rgbdata: # Not a duplicate cgats1_datasets.append(dataset) if cgats1_datasets: # Insert preconditioned point datasets after first patch if logfn: logfn("%s: Adding %i fixed points to %s" % (appname, len(cgats1_datasets), cgats2_path)) data.moveby1(1, len(cgats1_datasets)) for i, dataset in enumerate(cgats1_datasets): dataset.key = i + 1 dataset.parent = data dataset.root = data.root data[dataset.key] = dataset return cgats2 def make_argyll_compatible_path(path): """ Make the path compatible with the Argyll utilities. This is currently only effective under Windows to make sure that any unicode 'division' slashes in the profile name are replaced with underscores. """ skip = -1 if re.match(r'\\\\\?\\', path, re.I): # Don't forget about UNC paths: # \\?\UNC\Server\Volume\File # \\?\C:\File skip = 2 parts = path.split(os.path.sep) if sys.platform == "win32" and len(parts) > skip + 1: driveletterpart = parts[skip + 1] if (len(driveletterpart) == 2 and driveletterpart[0].upper() in string.ascii_uppercase and driveletterpart[1] == ":"): skip += 1 for i, part in enumerate(parts): if i > skip: parts[i] = make_filename_safe(part) return os.path.sep.join(parts) def set_argyll_bin(parent=None, silent=False, callafter=None, callafter_args=()): """ Set the directory containing the Argyll CMS binary executables """ if parent and not parent.IsShownOnScreen(): parent = None # do not center on parent if not visible # Check if Argyll version on PATH is newer than configured Argyll version paths = getenvu("PATH", os.defpath).split(os.pathsep) argyll_version_string = get_argyll_version_string("dispwin", True, paths) argyll_version = parse_argyll_version_string(argyll_version_string) argyll_version_string_cfg = get_argyll_version_string("dispwin", True) argyll_version_cfg = parse_argyll_version_string(argyll_version_string_cfg) # Don't prompt for 1.2.3_foo if current version is 1.2.3 # but prompt for 1.2.3 if current version is 1.2.3_foo # Also prompt for 1.2.3_beta2 if current version is 1.2.3_beta if ((argyll_version > argyll_version_cfg and (argyll_version[:4] == argyll_version_cfg[:4] or not argyll_version_string.startswith(argyll_version_string_cfg))) or (argyll_version < argyll_version_cfg and argyll_version_string_cfg.startswith(argyll_version_string))): argyll_dir = os.path.dirname(get_argyll_util("dispwin", paths) or "") dlg = ConfirmDialog(parent, msg=lang.getstr("dialog.select_argyll_version", (argyll_version_string, argyll_version_string_cfg)), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), alt=lang.getstr("browse"), bitmap=geticon(32, "dialog-question")) dlg_result = dlg.ShowModal() dlg.Destroy() if dlg_result == wx.ID_OK: setcfg("argyll.dir", None) # Always write cfg directly after setting Argyll directory so # subprocesses that read the configuration will use the right # executables writecfg() return True if dlg_result == wx.ID_CANCEL: if callafter: callafter(*callafter_args) return False else: argyll_dir = None if parent and not check_argyll_bin(): dlg = ConfirmDialog(parent, msg=lang.getstr("dialog.argyll.notfound.choice"), ok=lang.getstr("download"), cancel=lang.getstr("cancel"), alt=lang.getstr("browse"), bitmap=geticon(32, "dialog-question")) dlg_result = dlg.ShowModal() dlg.Destroy() if dlg_result == wx.ID_OK: # Download Argyll CMS from DisplayCAL import app_update_check app_update_check(parent, silent, argyll=True) return False elif dlg_result == wx.ID_CANCEL: if callafter: callafter(*callafter_args) return False defaultPath = os.path.join(*get_verified_path("argyll.dir", path=argyll_dir)) dlg = wx.DirDialog(parent, lang.getstr("dialog.set_argyll_bin"), defaultPath=defaultPath, style=wx.DD_DIR_MUST_EXIST) dlg.Center(wx.BOTH) result = False while not result: result = dlg.ShowModal() == wx.ID_OK if result: path = dlg.GetPath().rstrip(os.path.sep) if os.path.basename(path) != "bin": path = os.path.join(path, "bin") result = check_argyll_bin([path]) if result: if verbose >= 3: safe_print("Setting Argyll binary directory:", path) setcfg("argyll.dir", path) # Always write cfg directly after setting Argyll directory so # subprocesses that read the configuration will use the right # executables writecfg() break else: not_found = [] for name in argyll_names: if (not get_argyll_util(name, [path]) and not name in argyll_optional): not_found.append((" " + lang.getstr("or") + " ").join(filter(lambda altname: not "argyll" in altname, [altname + exe_ext for altname in argyll_altnames[name]]))) InfoDialog(parent, msg=path + "\n\n" + lang.getstr("argyll.dir.invalid", ", ".join(not_found)), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) else: break dlg.Destroy() if not result and callafter: callafter(*callafter_args) return result class EvalFalse(object): """ Evaluate to False in boolean comparisons """ def __init__(self, wrapped_object): self._wrapped_object = wrapped_object def __getattribute__(self, name): return getattr(object.__getattribute__(self, "_wrapped_object"), name) def __nonzero__(self): return False class DummyDialog(object): def __init__(self, *args, **kwargs): self.is_shown_on_screen = True def Close(self, force=False): pass def Destroy(self): pass def EndModal(self, id=-1): return id def Hide(self): pass def IsShownOnScreen(self): return self.is_shown_on_screen def Show(self, show=True): self.is_shown_on_screen = show def ShowModal(self): pass class FilteredStream(): """ Wrap a stream and filter all lines written to it. """ # Discard the whole line if it is empty after replacing patterns discard = "" # If one of the triggers is contained in a line, skip the whole line triggers = ["Place instrument on test window", "key to continue", "key to retry", "key to take a reading", "] to read", "' to set", "' to report", "' to toggle", " or Q to ", "place on the white calibration reference", "read failed due to the sensor being in the wrong position", "Ambient filter should be removed"] + INST_CAL_MSGS substitutions = {r"\^\[": "", # ESC key on Linux/OSX "patch ": "Patch ", re.compile(r"Point \d+", re.I): ""} # Strip these patterns from input before writing. Note that this only works # on full lines (ending with linesep_in) prestrip = "" def __init__(self, stream, data_encoding=None, file_encoding=None, errors="replace", discard=None, linesep_in="\r\n", linesep_out="\n", substitutions=None, triggers=None, prestrip=None): self.stream = stream self.data_encoding = data_encoding self.file_encoding = file_encoding self.errors = errors if discard is not None: self.discard = discard self.linesep_in = linesep_in self.linesep_out = linesep_out if substitutions is not None: self.substitutions = substitutions if triggers is not None: self.triggers = triggers if prestrip is not None: self.prestrip = prestrip self._buffer = "" def __getattr__(self, name): return getattr(self.stream, name) def write(self, data): """ Write data to stream, stripping all unwanted output. Incoming lines are expected to be delimited by linesep_in. """ if not data: return if self.prestrip and (re.search(self.prestrip, data) or self._buffer): if not data.endswith(self.linesep_in): # Buffer all data until we see a line ending self._buffer += data return elif self._buffer: # Assemble the full line from the buffer data = self._buffer + data self._buffer = "" data = re.sub(self.prestrip, "", data) lines = [] for line in data.split(self.linesep_in): if line and not re.sub(self.discard, "", line): line = "" write = True for trigger in self.triggers: if trigger.lower() in line.lower(): write = False break if write: if self.data_encoding and not isinstance(line, unicode): line = line.decode(self.data_encoding, self.errors) for search, sub in self.substitutions.iteritems(): line = re.sub(search, sub, line) if self.file_encoding: line = line.encode(self.file_encoding, self.errors) lines.append(line) if lines: self.stream.write(self.linesep_out.join(lines)) class Producer(object): """ Generic producer """ def __init__(self, worker, producer, continue_next=False): self.worker = worker self.producer = producer self.continue_next = continue_next def __call__(self, *args, **kwargs): result = self.producer(*args, **kwargs) if not self.continue_next and self.worker._progress_wnd: if (hasattr(self.worker.progress_wnd, "animbmp") and self.worker.progress_wnd.progress_type in (0, 2)): # Allow time for animation fadeout wx.CallAfter(self.worker.progress_wnd.stop_timer, False) if self.worker.progress_wnd.progress_type == 0: sleep(4) else: sleep(1) return result class StringWithLengthOverride(UserString): """ Allow defined behavior in comparisons and when evaluating length """ def __init__(self, seq, length=None): UserString.__init__(self, seq) if length is None: length = len(seq) self.length = length def __len__(self): return self.length class Sudo(object): """ Determine if a command can be run via sudo """ def __init__(self): self.availoptions = {} self.sudo = which("sudo") if self.sudo: # Determine available sudo options man = which("man") if man: manproc = sp.Popen([man, "sudo"], stdout=sp.PIPE, stderr=sp.PIPE) # Strip formatting stdout = re.sub(".\x08", "", manproc.communicate()[0]) self.availoptions = {"E": bool(re.search("-E\W", stdout)), "l [command]": bool(re.search("-l\W(?:.*?\W)?command\W", stdout)), "K": bool(re.search("-K\W", stdout)), "k": bool(re.search("-k\W", stdout))} if debug: safe_print("[D] Available sudo options:", ", ".join(filter(lambda option: self.availoptions[option], self.availoptions.keys()))) def __len__(self): return int(bool(self.sudo)) def __str__(self): return str(self.sudo or "") def __unicode__(self): return unicode(self.sudo or "") def _expect_timeout(self, patterns, timeout=-1, child_timeout=1): """ wexpect.spawn.expect with better timeout handling. The default expect can block up to timeout seconds if the child is already dead. To prevent this, we run expect in a loop until a pattern is matched, timeout is reached or an exception occurs. The max time an expect call will block if the child is already dead can be set with the child_timeout parameter. """ if timeout == -1: timeout = self.subprocess.timeout patterns = list(patterns) if not wexpect.TIMEOUT in patterns: patterns.append(wexpect.TIMEOUT) start = time() while True: result = self.subprocess.expect(patterns, timeout=child_timeout) if (self.subprocess.after is not wexpect.TIMEOUT or time() - start >= timeout): break return result def _terminate(self): """ Terminate running sudo subprocess """ self.subprocess.sendcontrol("C") self._expect_timeout([wexpect.EOF], 10) if self.subprocess.after is wexpect.TIMEOUT: safe_print("Warning: sudo timed out") if not self.subprocess.terminate(force=True): safe_print("Warning: Couldn't terminate timed-out " "sudo subprocess") else: safe_print(self.subprocess.before.strip().decode(enc, "replace")) def authenticate(self, args, title, parent=None): """ Athenticate for a given command The return value will be a tuple (auth_succesful, password). auth_succesful will be a custom class that will always have length 0 if authentication was not successful or the command is not allowed (even if the actual string length is non-zero), thus allowing for easy boolean comparisons. """ # Authentication using sudo is pretty convoluted if dealing with # platform and configuration differences. Ask for a password by first # clearing any cached credentials (sudo -K) so that sudo is guaranteed # to ask for a password if a command is run through it, then we spawn # sudo true (with true being the standard GNU utility that always # has an exit status of 0) and expect the password prompt. The user # is then given the opportunity to enter a password, which is then fed # to sudo. If sudo exits with a status of 0, the password must have # been accepted, but we still don't know for sure if our command is # allowed, so we run sudo -l to determine if it is # indeed allowed. pwd = "" dlg = ConfirmDialog( parent, title=title, msg=lang.getstr("dialog.enter_password"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "lock")) dlg.pwd_txt_ctrl = wx.TextCtrl(dlg, -1, pwd, size=(320, -1), style=wx.TE_PASSWORD | wx.TE_PROCESS_ENTER) dlg.pwd_txt_ctrl.Bind(wx.EVT_TEXT_ENTER, lambda event: dlg.EndModal(wx.ID_OK)) dlg.sizer3.Add(dlg.pwd_txt_ctrl, 1, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.ok.SetDefault() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() # Remove cached credentials self.kill() sudo_args = ["-p", "Password:", "true"] try: p = self.subprocess = wexpect.spawn(safe_str(self.sudo), sudo_args) except Exception, exception: return StringWithLengthOverride("Could not run %s %s: %s" % (self.sudo, " ".join(sudo_args), exception), 0), pwd self._expect_timeout(["Password:", wexpect.EOF], 10) # We need to call isalive() to set the exitstatus while p.isalive() and p.after == "Password:": # Ask for password dlg.pwd_txt_ctrl.SetFocus() result = dlg.ShowModal() pwd = dlg.pwd_txt_ctrl.GetValue() if result != wx.ID_OK: self._terminate() return False, pwd p.send(pwd + os.linesep) self._expect_timeout(["Password:", wexpect.EOF], 10) if p.after == "Password:": msg = lang.getstr("dialog.enter_password") errstr = p.before.strip().decode(enc, "replace") if errstr: safe_print(errstr) msg = "\n\n".join([errstr, msg]) dlg.message.SetLabel(msg) dlg.message.Wrap(dlg.GetSize()[0] - 32 - 12 * 2) dlg.pwd_txt_ctrl.SetValue("") dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() dlg.Destroy() if p.after is wexpect.TIMEOUT: safe_print("Error: sudo timed out") if not p.terminate(force=True): safe_print("Warning: Couldn't terminate timed-out sudo " "subprocess") return StringWithLengthOverride("sudo timed out", 0), pwd if p.exitstatus != 0: return StringWithLengthOverride(p.before.strip().decode(enc, "replace") or ("sudo exited prematurely with " "status %s" % p.exitstatus), 0), pwd # Password was accepted, check if command is allowed return self.is_allowed(args, pwd), pwd def is_allowed(self, args=None, pwd=""): """ Check if a command is allowed via sudo. Return either a string listing allowed and forbidden commands, or the fully-qualified path of the command along with any arguments, or an error message in case the command is not allowed, or False if the password was not accepted. The returned error is a custom class that will always have length 0 if the command is not allowed (even if the actual string length is non-zero), thus allowing for easy boolean comparisons. """ sudo_args = ["-p", "Password:", "-l"] # Set sudo args based on available options if self.availoptions.get("l [command]") and args: sudo_args += args try: p = self.subprocess = wexpect.spawn(safe_str(self.sudo), sudo_args) except Exception, exception: return StringWithLengthOverride("Could not run %s %s: %s" % (self.sudo, " ".join(sudo_args), exception), 0) self._expect_timeout(["Password:", wexpect.EOF], 10) # We need to call isalive() to set the exitstatus while p.isalive() and p.after == "Password:": p.send(pwd + os.linesep) self._expect_timeout(["Password:", wexpect.EOF], 10) if p.after == "Password:": # Password was not accepted self._terminate() return StringWithLengthOverride(p.before.strip().decode(enc, "replace"), 0) if p.after is wexpect.TIMEOUT: safe_print("Error: sudo timed out") if not p.terminate(force=True): safe_print("Warning: Couldn't terminate timed-out sudo " "subprocess") return StringWithLengthOverride("sudo timed out", 0) if p.exitstatus != 0: return StringWithLengthOverride(p.before.strip().decode(enc, "replace") or ("sudo exited prematurely with " "status %s" % p.exitstatus), 0) return p.before.strip().decode(enc, "replace") def kill(self): """ Remove cached credentials """ kill_arg = None if self.availoptions.get("K"): kill_arg = "-K" elif self.availoptions.get("k"): kill_arg = "-k" if kill_arg: sp.call([safe_str(self.sudo), kill_arg]) class WPopen(sp.Popen): def __init__(self, *args, **kwargs): sp.Popen.__init__(self, *args, **kwargs) self._seekpos = 0 self._stdout = kwargs["stdout"] self.after = None self.before = None self.exitstatus = None self.logfile_read = None self.match = None self.maxlen = 80 self.timeout = 30 def isalive(self): self.exitstatus = self.poll() return self.exitstatus is None def expect(self, patterns, timeout=-1): if not isinstance(patterns, list): patterns = [patterns] if timeout == -1: timeout = self.timeout if timeout is not None: end = time() + timeout while timeout is None or time() < end: self._stdout.seek(self._seekpos) buf = self._stdout.read() self._seekpos += len(buf) if not buf and not self.isalive(): self.match = wexpect.EOF("End Of File (EOF) in expect() - dead child process") if wexpect.EOF in patterns: return self.match raise self.match if buf and self.logfile_read: self.logfile_read.write(buf) for pattern in patterns: if isinstance(pattern, basestring) and pattern in buf: offset = buf.find(pattern) self.after = buf[offset:] self.before = buf[:offset] self.match = buf[offset:offset + len(pattern)] return self.match sleep(.01) if timeout is not None: self.match = wexpect.TIMEOUT("Timeout exceeded in expect()") if wexpect.TIMEOUT in patterns: return self.match raise self.match def send(self, s): self.stdin.write(s) self._stdout.seek(self._seekpos) buf = self._stdout.read() self._seekpos += len(buf) if buf and self.logfile_read: self.logfile_read.write(buf) def terminate(self, force=False): sp.Popen.terminate(self) class Worker(WorkerBase): def __init__(self, owner=None): """ Create and return a new worker instance. """ WorkerBase.__init__(self) self.owner = owner # owner should be a wxFrame or similar if sys.platform == "win32": self.pty_encoding = "cp%i" % windll.kernel32.GetACP() else: self.pty_encoding = enc self.cmdrun = False self.dispcal_create_fast_matrix_shaper = False self.dispread_after_dispcal = False self.finished = True self.instrument_on_screen = False self.interactive = False self.spotread_just_do_instrument_calibration = False self.lastcmdname = None # Filter out warnings from OS components (e.g. shared libraries) # E.g.: # Nov 26 16:28:16 dispcal[1006] : void CGSUpdateManager::log() const: conn 0x1ec57 token 0x3ffffffffffd0a prestrip = re.compile(r"\D+\s+\d+\s+\d+:\d+:\d+\s+\w+\[\d+\]\s+:[\S\s]*") discard = [r"[\*\.]+|Current (?:RGB|XYZ)(?: +.*)?"] self.lastmsg_discard = re.compile("|".join(discard)) self.measurement_modes = {} self._init_sounds(dummy=True) self.options_colprof = [] self.options_dispcal = [] self.options_dispread = [] self.options_targen = [] self.pauseable = False discard = [r"^Display type is .+", r"^Doing (?:some initial|check) measurements", r"^Adjust .+? Press space when done\.\s*", r"^\s*(?:[/\\]\s+)?(?:Adjusted )?(Current", r"Initial", r"[Tt]arget) (?:Br(?:ightness)?", r"50% Level", r"white", r"(?:Near )?[Bb]lack", r"(?:advertised )?gamma", r"RGB", r"\d(?:\.\d+)?).*", r"^Gamma curve .+", r"^Display adjustment menu:", r"^Press", r"^\d\).+", r"^(?:1%|Black|Red|Green|Blue|White|Grey)\s+=.+", r"^\s*patch \d+ of \d+.*", r"^\s*point \d+.*", r"^\s*Added \d+/\d+", # These need to be last because they're very generic! r"[\*\.]+", r"\s*\d*%?"] self.recent_discard = re.compile("|".join(discard), re.I) self.resume = False self.sudo = None self.auth_timestamp = 0 self.sessionlogfiles = {} self.triggers = ["Password:"] self.recent = FilteredStream(LineCache(maxlines=3), self.pty_encoding, discard=self.recent_discard, triggers=self.triggers + ["stopped at user request"], prestrip=prestrip) self.lastmsg = FilteredStream(LineCache(), self.pty_encoding, discard=self.lastmsg_discard, triggers=self.triggers, prestrip=prestrip) self.clear_argyll_info() self.set_argyll_version_from_string(getcfg("argyll.version"), False) self.clear_cmd_output() self._detecting_video_levels = False self._patterngenerators = {} self._progress_dlgs = {} self._progress_wnd = None self._pwdstr = "" workers.append(self) def _init_sounds(self, dummy=False): if dummy: self.measurement_sound = audio.DummySound() self.commit_sound = audio.DummySound() else: # Sounds when measuring # Needs to be stereo! self.measurement_sound = audio.Sound(get_data_path("beep.wav")) self.commit_sound = audio.Sound(get_data_path("camera_shutter.wav")) def add_measurement_features(self, args, display=True, ignore_display_name=False, allow_nondefault_observer=False, ambient=False, allow_video_levels=True): """ Add common options and to dispcal, dispread and spotread arguments """ if display and not get_arg("-d", args): args.append("-d" + self.get_display()) if display and allow_video_levels: self.add_video_levels_arg(args) if not get_arg("-c", args): args.append("-c%s" % getcfg("comport.number")) instrument_name = self.get_instrument_name() measurement_mode = getcfg("measurement_mode") if measurement_mode == "auto": # Make changes in DisplayCAL.MainFrame.set_ccxx_measurement_mode too! if instrument_name == "ColorHug": measurement_mode = "R" elif instrument_name == "ColorHug2": measurement_mode = "F" else: measurement_mode = "l" instrument_features = self.get_instrument_features() if (not ambient and measurement_mode and not get_arg("-y", args) and instrument_name != "specbos 1201"): # Always specify -y for colorimeters (won't be read from .cal # when updating) # The specbos 1201 (unlike 1211) doesn't support measurement # mode selection if self.argyll_version >= [1, 5, 0]: measurement_mode_map = instrument_features.get("measurement_mode_map", {}) measurement_mode = measurement_mode_map.get(measurement_mode[0], measurement_mode) args.append("-y" + measurement_mode[0]) if getcfg("measurement_mode.projector") and \ instrument_features.get("projector_mode") and \ self.argyll_version >= [1, 1, 0] and not get_arg("-p", args): # Projector mode, Argyll >= 1.1.0 Beta args.append("-p") if instrument_features.get("adaptive_mode"): if getcfg("measurement_mode.adaptive"): if ((self.argyll_version[0:3] > [1, 1, 0] or (self.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.argyll_version_string and not "RC1" in self.argyll_version_string and not "RC2" in self.argyll_version_string)) and self.argyll_version[0:3] < [1, 5, 0] and not get_arg("-V", args, True)): # Adaptive measurement mode, Argyll >= 1.1.0 RC3 args.append("-V") else: if self.argyll_version[0:3] >= [1, 5, 0]: # Disable adaptive measurement mode args.append("-YA") if (instrument_name in ("Spyder4", "Spyder5") and self.argyll_version == [1, 7, 0] and measurement_mode in ("f", "e") and not get_arg("-YR:", args)): # Prevent 'Warning - Spyder: measuring refresh rate failed' args.append("-YR:60") non_argyll_prisma = (config.get_display_name() == "Prisma" and not defaults["patterngenerator.prisma.argyll"]) if display and not (get_arg("-dweb", args) or get_arg("-dmadvr", args)): if ((self.argyll_version <= [1, 0, 4] and not get_arg("-p", args)) or (self.argyll_version > [1, 0, 4] and not get_arg("-P", args))): if ((config.get_display_name() == "Resolve" or non_argyll_prisma) and not ignore_display_name): # Move Argyll test window to lower right corner and make it # very small dimensions_measureframe = "1,1,0.01" else: dimensions_measureframe = getcfg("dimensions.measureframe") if get_arg("-dcc", args): # Rescale for Chromecast default patch size of 10% dimensions_measureframe = config.get_measureframe_dimensions( dimensions_measureframe, 10) args.append(("-p" if self.argyll_version <= [1, 0, 4] else "-P") + dimensions_measureframe) farg = get_arg("-F", args, True) if ((config.get_display_name() == "Resolve" or non_argyll_prisma) and not ignore_display_name): if farg: # Remove -F (darken background) as we relay colors to # pattern generator args = args[:farg[0]] + args[farg[0] + 1:] elif getcfg("measure.darken_background") and not farg: args.append("-F") if getcfg("measurement_mode.highres") and \ instrument_features.get("highres_mode") and not get_arg("-H", args, True): args.append("-H") if (allow_nondefault_observer and self.instrument_can_use_nondefault_observer() and getcfg("observer") != defaults["observer"] and not get_arg("-Q", args)): args.append("-Q" + getcfg("observer")) if (not ambient and self.instrument_can_use_ccxx() and not is_ccxx_testchart() and not get_arg("-X", args)): # Use colorimeter correction? ccmx = getcfg("colorimeter_correction_matrix_file").split(":", 1) if len(ccmx) > 1 and ccmx[1]: ccmx = ccmx[1] else: ccmx = None if ccmx and (not ccmx.lower().endswith(".ccss") or self.instrument_supports_ccss()): result = check_file_isfile(ccmx) if isinstance(result, Exception): return result try: cgats = CGATS.CGATS(ccmx) except (IOError, CGATS.CGATSError), exception: return exception else: ccxx_instrument = get_canonical_instrument_name( str(cgats.queryv1("INSTRUMENT") or ""), {"DTP94-LCD mode": "DTP94", "eye-one display": "i1 Display", "Spyder 2 LCD": "Spyder2", "Spyder 3": "Spyder3"}) if ((ccxx_instrument and instrument_name.lower().replace(" ", "") in ccxx_instrument.lower().replace(" ", "")) or ccmx.lower().endswith(".ccss")): tempdir = self.create_tempdir() if isinstance(tempdir, Exception): return tempdir ccmxcopy = os.path.join(tempdir, os.path.basename(ccmx)) if not os.path.isfile(ccmxcopy): if 0 in cgats and cgats[0].type.strip() == "CCMX": # Add display base ID if missing self.check_add_display_type_base_id(cgats) try: # Copy ccmx to profile dir cgats.write(ccmxcopy) except Exception, exception: return Error(lang.getstr("error.copy_failed", (ccmx, ccmxcopy)) + "\n\n" + safe_unicode(exception)) result = check_file_isfile(ccmxcopy) if isinstance(result, Exception): return result args.append("-X") args.append(os.path.basename(ccmxcopy)) if (display and (getcfg("drift_compensation.blacklevel") or getcfg("drift_compensation.whitelevel")) and self.argyll_version >= [1, 3, 0] and not get_arg("-I", args)): args.append("-I") if getcfg("drift_compensation.blacklevel"): args[-1] += "b" if getcfg("drift_compensation.whitelevel"): args[-1] += "w" # TTBD/FIXME: Skipping of sensor calibration can't be done in # emissive mode (see Argyll source spectro/ss.c, around line 40) if (getcfg("allow_skip_sensor_cal") and instrument_features.get("skip_sensor_cal") and self.argyll_version >= [1, 1, 0] and not get_arg("-N", args, True) and not self.spotread_just_do_instrument_calibration): args.append("-N") return True def add_video_levels_arg(self, args): if (config.get_display_name() != "madVR" and getcfg("patterngenerator.use_video_levels") and self.argyll_version >= [1, 6]): args.append("-E") def authenticate(self, cmd, title=appname, parent=None): """ Athenticate (using sudo) for a given command The return value will either be True (authentication successful and command allowed), False (in case of the user cancelling the password dialog), None (Windows or running as root) or an error. """ if sys.platform == "win32" or os.geteuid() == 0: return self.auth_timestamp = 0 ocmd = cmd if cmd and not os.path.isabs(cmd): cmd = get_argyll_util(ocmd) if not cmd: cmd = which(ocmd) if not cmd or not os.path.isfile(cmd): return Error(lang.getstr("file.missing", ocmd)) _disabler = BetterWindowDisabler() result = True if not self.sudo: self.sudo = Sudo() if not self.sudo: result = Error(lang.getstr("file.missing", "sudo")) if result is True: pwd = self.pwd args = [cmd, "-?"] if not pwd or not self.sudo.is_allowed(args, pwd): # If no password was previously available, or if the requested # command cannot be run via sudo regardless of password (we check # this with sudo -l ), we ask for a password. safe_print(lang.getstr("auth")) progress_dlg = self._progress_wnd or getattr(wx.GetApp(), "progress_dlg", None) if parent is None: if progress_dlg and progress_dlg.IsShownOnScreen(): parent = progress_dlg else: parent = self.owner result, pwd = self.sudo.authenticate(args, title, parent) if result: self.pwd = pwd result = True elif result is False: safe_print(lang.getstr("aborted")) else: result = Error(result) if result is True: self.auth_timestamp = time() del _disabler return result def blend_profile_blackpoint(self, profile1, profile2, outoffset=0.0, gamma=2.4, gamma_type="B", size=None, apply_trc=True, white_cdm2=100, minmll=0, maxmll=10000, ambient_cdm2=5, content_rgb_space="DCI P3", hdr_chroma_compression=False): """ Apply BT.1886-like tone response to profile1 using profile2 blackpoint. profile1 has to be a matrix profile """ odata = self.xicclu(profile2, (0, 0, 0), pcs="x") if len(odata) != 1 or len(odata[0]) != 3: raise ValueError("Blackpoint is invalid: %s" % odata) XYZbp = odata[0] smpte2084 = gamma in ("smpte2084.hardclip", "smpte2084.rolloffclip") hlg = gamma == "hlg" hdr = smpte2084 or hlg lumi = profile2.tags.get("lumi", ICCP.XYZType()) if not lumi.Y: lumi.Y = 100.0 profile_black_cdm2 = XYZbp[1] * lumi.Y if smpte2084: # SMPTE ST.2084 (PQ) self.log(os.path.basename(profile1.fileName) + u" → " + lang.getstr("trc." + gamma) + (u" %i cd/m² (mastering %s-%i cd/m²)" % (white_cdm2, stripzeros("%.4f" % minmll), maxmll))) elif hlg: # Hybrid Log-Gamma (HLG) outoffset = 1.0 self.log(os.path.basename(profile1.fileName) + u" → " + lang.getstr("trc." + gamma) + (u" %i cd/m² (ambient %s cd/m²)" % (lumi.Y, stripzeros("%.2f" % ambient_cdm2)))) elif apply_trc: self.log("Applying BT.1886-like TRC to " + os.path.basename(profile1.fileName)) else: self.log("Applying BT.1886-like black offset to " + os.path.basename(profile1.fileName)) self.log("Black XYZ (normalized 0..100) = %.6f %.6f %.6f" % tuple([v * 100 for v in XYZbp])) self.log("Black Lab = %.6f %.6f %.6f" % tuple(colormath.XYZ2Lab(*[v * 100 for v in XYZbp]))) self.log("Output offset = %.2f%%" % (outoffset * 100)) if hdr: odesc = profile1.getDescription() desc = re.sub(r"\s*(?:color profile|primaries with " "\S+ transfer function)$", "", odesc) if smpte2084: # SMPTE ST.2084 (PQ) if gamma != "smpte2084.rolloffclip": maxmll = white_cdm2 black_cdm2 = profile_black_cdm2 * (1 - outoffset) if XYZbp[1]: XYZbp_cdm2 = [v / XYZbp[1] * black_cdm2 for v in XYZbp] else: XYZbp_cdm2 = [0, 0, 0] profile1.set_smpte2084_trc(XYZbp_cdm2, white_cdm2, minmll, maxmll, rolloff=True, blend_blackpoint=False) desc += (u" " + lang.getstr("trc." + gamma) + (u" %s-%i cd/m² (mastering %s-%i cd/m²)" % (stripzeros("%.4f" % profile_black_cdm2), white_cdm2, stripzeros("%.4f" % minmll), maxmll))) elif hlg: # Hybrid Log-Gamma (HLG) black_cdm2 = 0 # Black offset will be applied separate for HLG white_cdm2 = lumi.Y profile1.set_hlg_trc((0, 0, 0), white_cdm2, 1.2, ambient_cdm2) desc += (u" " + lang.getstr("trc." + gamma) + (u" %s-%i cd/m² (ambient %s cd/m²)" % (stripzeros("%.4f" % profile_black_cdm2), white_cdm2, stripzeros("%.2f" % ambient_cdm2)))) profile1.setDescription(desc) if gamma == "smpte2084.rolloffclip" or hlg: rgb_space = profile1.get_rgb_space() if not rgb_space: raise Error(odesc + ": " + lang.getstr("profile.unsupported", (lang.getstr("unknown"), profile1.colorSpace))) rgb_space[0] = 1.0 # Set gamma to 1.0 (not actually used) rgb_space = colormath.get_rgb_space(rgb_space) self.recent.write(desc + "\n") linebuffered_logfiles = [] if sys.stdout.isatty(): linebuffered_logfiles.append(safe_print) else: linebuffered_logfiles.append(log) if self.sessionlogfile: linebuffered_logfiles.append(self.sessionlogfile) logfiles = Files([LineBufferedStream( FilteredStream(Files(linebuffered_logfiles), enc, discard="", linesep_in="\n", triggers=[])), self.recent, self.lastmsg]) if hdr_chroma_compression: xf = Xicclu(profile2, "r", direction="f", pcs="x", worker=self) xb = MP_Xicclu(profile2, "r", direction="if", pcs="x", use_cam_clipping=True, worker=self, logfile=logfiles) if content_rgb_space: content_rgb_space = colormath.get_rgb_space(content_rgb_space) for i, color in enumerate(("white", "red", "green", "blue")): if i == 0: xyY = colormath.XYZ2xyY(*content_rgb_space[1]) else: xyY = content_rgb_space[2:][i - 1] for j, coord in enumerate("xy"): v = xyY[j] self.log(lang.getstr("3dlut.content.colorspace") + " " + lang.getstr(color) + " " + coord + " %6.4f" % v) else: xf=None xb=None if smpte2084: hdr_format = "PQ" elif hlg: hdr_format = "HLG" profile = ICCP.create_synthetic_hdr_clut_profile(hdr_format, rgb_space, desc, black_cdm2, white_cdm2, minmll, # Not used for HLG maxmll, # Not used for HLG system_gamma=1.2, # Not used for PQ ambient_cdm2=ambient_cdm2, # Not used for PQ maxsignal=1.0, # Not used for PQ content_rgb_space=content_rgb_space, forward_xicclu=xf, backward_xicclu=xb, worker=self, logfile=logfiles) profile1.tags.A2B0 = profile.tags.A2B0 profile1.tags.DBG0 = profile.tags.DBG0 profile1.tags.DBG1 = profile.tags.DBG1 profile1.tags.DBG2 = profile.tags.DBG2 profile1.tags.kTRC = profile.tags.kTRC if not apply_trc or hdr: # Apply only the black point blending portion of BT.1886 mapping logfiles = self.get_logfiles() logfiles.write("Applying black offset...\n") profile1.apply_black_offset(XYZbp, logfiles=logfiles, thread_abort=self.thread_abort, abortmessage=lang.getstr("aborted")) return if gamma_type in ("b", "g"): # Get technical gamma needed to achieve effective gamma self.log("Effective gamma = %.2f" % gamma) tgamma = colormath.xicc_tech_gamma(gamma, XYZbp[1], outoffset) else: tgamma = gamma self.log("Technical gamma = %.2f" % tgamma) profile1.set_bt1886_trc(XYZbp, outoffset, gamma, gamma_type, size) def calibrate_instrument_producer(self): cmd, args = get_argyll_util("spotread"), ["-v", "-e"] if cmd: self.spotread_just_do_instrument_calibration = True result = self.add_measurement_features(args, display=False) if isinstance(result, Exception): self.spotread_just_do_instrument_calibration = False return result result = self.exec_cmd(cmd, args, skip_scripts=True) self.spotread_just_do_instrument_calibration = False return result else: return Error(lang.getstr("argyll.util.not_found", "spotread")) def instrument_can_use_ccxx(self, check_measurement_mode=True, instrument_name=None): """ Return boolean whether the instrument in its current measurement mode can use a CCMX or CCSS colorimeter correction """ # Special cases: # Spectrometer (not needed), # ColorHug (only sensible in factory or raw measurement mode), # ColorMunki Smile (only generic LCD CCFL measurement mode), # Colorimétre HCFR (only raw measurement mode), # DTP94 (only LCD, refresh and generic measurement modes) # Spyder4/5 (only generic LCD and refresh measurement modes) # K-10 (only factory measurement mode) # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.get_ccxx_measurement_modes # - DisplayCAL.MainFrame.set_ccxx_measurement_mode # - DisplayCAL.MainFrame.update_colorimeter_correction_matrix_ctrl_items # - worker.Worker.check_add_display_type_base_id if not instrument_name: instrument_name = self.get_instrument_name() return (self.argyll_version >= [1, 3, 0] and not self.get_instrument_features(instrument_name).get("spectral") and (not check_measurement_mode or getcfg("measurement_mode") == "auto" or ((instrument_name not in ("ColorHug", "ColorHug2") or getcfg("measurement_mode") in ("F", "R")) and (instrument_name != "ColorMunki Smile" or getcfg("measurement_mode") == "f") and (instrument_name != "Colorimtre HCFR" or # Missing é is NOT a typo getcfg("measurement_mode") == "R") and (instrument_name != "DTP94" or getcfg("measurement_mode") in ("l", "c", "g")) and (instrument_name not in ("Spyder4", "Spyder5") or getcfg("measurement_mode") in ("l", "c")) and (instrument_name != "K-10" or getcfg("measurement_mode") == "F")))) def instrument_can_use_nondefault_observer(self, instrument_name=None): if not instrument_name: instrument_name = self.get_instrument_name() return bool(self.get_instrument_features(instrument_name).get("spectral") or self.instrument_supports_ccss(instrument_name)) @Property def progress_wnd(): def fget(self): if not self._progress_wnd: if (getattr(self, "progress_start_timer", None) and self.progress_start_timer.IsRunning()): if currentThread().__class__ is not _MainThread: raise RuntimeError("GUI access in non-main thread!") # Instantiate the progress dialog instantly on access self.progress_start_timer.Notify() self.progress_start_timer.Stop() return self._progress_wnd def fset(self, progress_wnd): self._progress_wnd = progress_wnd return locals() @property def progress_wnds(self): progress_wnds = self._progress_dlgs.values() if hasattr(self, "terminal"): progress_wnds.append(self.terminal) return progress_wnds @Property def pwd(): def fget(self): return self._pwdstr[10:].ljust(int(math.ceil(len(self._pwdstr[10:]) / 4.0) * 4), "=").decode("base64").decode("UTF-8") def fset(self, pwd): self._pwdstr = "/tmp/%s%s" % (md5(getpass.getuser()).hexdigest().encode("base64")[:5], pwd.encode("UTF-8").encode("base64").rstrip("=\n")) return locals() def get_argyll_instrument_conf(self, what=None): """ Check for Argyll CMS udev rules/hotplug scripts """ filenames = [] if what == "installed": for filename in ("/etc/udev/rules.d/55-Argyll.rules", "/etc/udev/rules.d/45-Argyll.rules", "/etc/hotplug/Argyll", "/etc/hotplug/Argyll.usermap", "/lib/udev/rules.d/55-Argyll.rules", "/lib/udev/rules.d/69-cd-sensors.rules"): if os.path.isfile(filename): filenames.append(filename) else: if what == "expected": fn = lambda filename: filename else: fn = get_data_path if os.path.isdir("/etc/udev/rules.d"): if glob.glob("/dev/bus/usb/*/*"): # USB and serial instruments using udev, where udev # already creates /dev/bus/usb/00X/00X devices filenames.append(fn("usb/55-Argyll.rules")) else: # USB using udev, where there are NOT /dev/bus/usb/00X/00X # devices filenames.append(fn("usb/45-Argyll.rules")) else: if os.path.isdir("/etc/hotplug"): # USB using hotplug and Serial using udev # (older versions of Linux) filenames.extend(fn(filename) for filename in ("usb/Argyll", "usb/Argyll.usermap")) return filter(lambda filename: filename, filenames) def check_add_display_type_base_id(self, cgats, cfgname="measurement_mode"): """ Add DISPLAY_TYPE_BASE_ID to CCMX """ if not cgats.queryv1("DISPLAY_TYPE_BASE_ID"): # c, l (most colorimeters) # R (ColorHug and Colorimétre HCFR) # F (ColorHug) # f (ColorMunki Smile) # g (DTP94) # IMPORTANT: Make changes aswell in the following locations: # - DisplayCAL.MainFrame.create_colorimeter_correction_handler # - DisplayCAL.MainFrame.get_ccxx_measurement_modes # - DisplayCAL.MainFrame.set_ccxx_measurement_modes # - DisplayCAL.MainFrame.update_colorimeter_correction_matrix_ctrl_items # - worker.Worker.instrument_can_use_ccxx cgats[0].add_keyword("DISPLAY_TYPE_BASE_ID", {"c": 2, "l": 1, "R": 2, "F": 1, "f": 1, "g": 3}.get(getcfg(cfgname), 1)) safe_print("Added DISPLAY_TYPE_BASE_ID %r" % cgats[0].DISPLAY_TYPE_BASE_ID) def check_display_conf_oy_compat(self, display_no): """ Check the screen configuration for oyranos-monitor compatibility oyranos-monitor works off screen coordinates, so it will not handle overlapping screens (like separate X screens, which will usually have the same x, y coordinates)! So, oyranos-monitor can only be used if: - The wx.Display count is > 1 which means NOT separate X screens OR if we use the 1st screen - The screens don't overlap """ oyranos = False if wx.Display.GetCount() > 1 or display_no == 1: oyranos = True for display_rect_1 in self.display_rects: for display_rect_2 in self.display_rects: if display_rect_1 is not display_rect_2: if display_rect_1.Intersects(display_rect_2): oyranos = False break if not oyranos: break return oyranos def check_is_single_measurement(self, txt): if (("ambient light measuring" in txt.lower() or "Will use emissive mode instead" in txt) and not getattr(self, "is_ambient_measurement", False)): self.is_ambient_measurement = True self.is_single_measurement = True if (getattr(self, "is_single_measurement", False) and "Place instrument on spot to be measured" in txt): self.is_single_measurement = False self.do_single_measurement() self.is_ambient_measurement = False def do_single_measurement(self): if getattr(self, "subprocess_abort", False) or \ getattr(self, "thread_abort", False): # If we are aborting, ignore request return self.progress_wnd.Pulse(" " * 4) if self.is_ambient_measurement: self.is_ambient_measurement = False dlg = ConfirmDialog(self.progress_wnd, msg=lang.getstr("instrument.measure_ambient"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) self.progress_wnd.dlg = dlg dlg_result = dlg.ShowModal() dlg.Destroy() if self.finished: return if dlg_result != wx.ID_OK: self.abort_subprocess() return False if self.safe_send(" "): self.progress_wnd.Pulse(lang.getstr("please_wait")) def check_instrument_calibration(self, txt): """ Check if current instrument needs sensor calibration by looking at Argyll CMS command output """ if not self.instrument_calibration_complete: if "calibration complete" in txt.lower(): self.instrument_calibration_complete = True else: for calmsg in INST_CAL_MSGS: if calmsg in txt or "calibration failed" in txt.lower(): self.do_instrument_calibration( "calibration failed" in txt.lower()) break def check_instrument_place_on_screen(self, txt): """ Check if instrument should be placed on screen by looking at Argyll CMS command output """ if "place instrument on test window" in txt.lower(): self.instrument_place_on_screen_msg = True if ((self.instrument_place_on_screen_msg and "key to continue" in txt.lower()) or (self.instrument_calibration_complete and "place instrument on spot" in txt.lower() and self.progress_wnd is getattr(self, "terminal", None))): self.instrument_place_on_screen_msg = False if (self.cmdname == get_argyll_utilname("dispcal") and sys.platform == "darwin"): # On the Mac dispcal's test window # hides the cursor and steals focus start_new_thread(mac_app_activate, (1, wx.GetApp().AppName)) if (self.instrument_calibration_complete or ((config.is_untethered_display() or getcfg("measure.darken_background") or self.madtpg_fullscreen is False) and (not self.dispread_after_dispcal or self.cmdname == get_argyll_utilname("dispcal")) and not self.instrument_on_screen)): # Show a dialog asking user to place the instrument on the # screen if the instrument calibration was completed, # or if we measure a remote ("Web") display, # or if we use a black background during measurements, # but in case of the latter two only if dispread is not # run directly after dispcal self.instrument_calibration_complete = False self.instrument_place_on_screen() else: if self.isalive(): # Delay to work-around a problem with i1D2 and Argyll 1.7 # to 1.8.3 under Mac OS X 10.11 El Capitan where skipping # interactive display adjustment would botch the first # reading (black) wx.CallLater(1500, self.instrument_on_screen_continue) def instrument_on_screen_continue(self): self.log("%s: Skipping place instrument on screen message..." % appname) self.safe_send(" ") self.pauseable_now = True self.instrument_on_screen = True def check_instrument_sensor_position(self, txt): """ Check instrument sensor position by looking at Argyll CMS command output """ if "read failed due to the sensor being in the wrong position" in txt.lower(): self.instrument_sensor_position_msg = True if (self.instrument_sensor_position_msg and " or q to " in txt.lower()): self.instrument_sensor_position_msg = False self.instrument_reposition_sensor() def check_retry_measurement(self, txt): if ("key to retry:" in txt and not "read stopped at user request!" in self.recent.read() and ("Sample read failed due to misread" in self.recent.read() or "Sample read failed due to communication problem" in self.recent.read()) and not self.subprocess_abort): self.retrycount += 1 self.log("%s: Retrying (%s)..." % (appname, self.retrycount)) self.recent.write("\r\n%s: Retrying (%s)..." % (appname, self.retrycount)) self.safe_send(" ") def check_spotread_result(self, txt): """ Check if spotread returned a result """ if (self.cmdname == get_argyll_utilname("spotread") and (self.progress_wnd is not getattr(self, "terminal", None) or getattr(self.terminal, "Name", None) == "VisualWhitepointEditor") and ("Result is XYZ:" in txt or "Result is Y:" in txt or (self.instrument_calibration_complete and self.spotread_just_do_instrument_calibration))): # Single spotread reading, we are done wx.CallLater(1000, self.quit_terminate_cmd) def detect_video_levels(self): """ Detect wether we need video (16..235) or data (0..255) levels """ if (self.resume or not getcfg("patterngenerator.detect_video_levels") or config.get_display_name() == "Untethered" or is_ccxx_testchart()): return self._detecting_video_levels = True try: return self._detect_video_levels() finally: self._detecting_video_levels = False def _detect_video_levels(self): """ Detect black clipping due to incorrect levels """ self.log("Detecting output levels range...") tempdir = self.create_tempdir() if isinstance(tempdir, Exception): return tempdir ti1_path = os.path.join(tempdir, "0_16.ti1") try: with open(ti1_path, "wb") as ti1: ti1.write("""CTI1 DESCRIPTOR "Argyll Calibration Target chart information 1" ORIGINATOR "Argyll targen" CREATED "Thu Apr 20 12:22:05 2017" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 3 BEGIN_DATA 1 100.00 100.00 100.00 95.046 100.00 108.91 2 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 3 6.2500 6.2500 6.2500 0.2132 0.2241 0.2443 END_DATA """) except Exception, exception: return exception setcfg("patterngenerator.use_video_levels", 0) result = self.measure_ti1(ti1_path, get_data_path("linear.cal"), allow_video_levels=False) if isinstance(result, Exception) or not result: return result ti3_path = os.path.join(tempdir, "0_16.ti3") try: ti3 = CGATS.CGATS(ti3_path) except (IOError, CGATS.CGATSError), exception: return exception try: verify_ti1_rgb_xyz(ti3) except CGATS.CGATSError, exception: return exception luminance_XYZ_cdm2 = ti3.queryv1("LUMINANCE_XYZ_CDM2") if not luminance_XYZ_cdm2: return Error(lang.getstr("error.testchart.missing_fields", (ti3_path, "LUMINANCE_XYZ_CDM2"))) try: Y_cdm2 = float(luminance_XYZ_cdm2.split()[1]) except (IndexError, ValueError): return Error(lang.getstr("error.testchart.invalid", ti3_path)) if not Y_cdm2 or math.isnan(Y_cdm2): return Error(lang.getstr("error.luminance.invalid")) black_0 = ti3[0].DATA[1] black_16 = ti3[0].DATA[2] if black_0 and black_16: self.log("RGB level 0 is %.6f cd/m2" % (black_0["XYZ_Y"] / 100.0 * Y_cdm2)) self.log("RGB level 16 is %.6f cd/m2" % (black_16["XYZ_Y"] / 100.0 * Y_cdm2)) # Check delta cd/m2 to determine if data or video levels # We need to take the display white luminance into account threshold = 0.02 / Y_cdm2 * 100 # Threshold 0.02 cd/m2 assume_video_levels = black_16["XYZ_Y"] - black_0["XYZ_Y"] < threshold if assume_video_levels and config.get_display_name() == "madVR": # This is an error return Error(lang.getstr("madvr.wrong_levels_detected")) setcfg("patterngenerator.use_video_levels", int(assume_video_levels)) if assume_video_levels: self.log("Detected limited range output levels") else: self.log("Assuming full range output levels") else: return Error(lang.getstr("error.testchart.missing_fields", (ti3_path, ", ".join(black_0.keys())))) def do_instrument_calibration(self, failed=False): """ Ask user to initiate sensor calibration and execute. Give an option to cancel. """ if getattr(self, "subprocess_abort", False) or \ getattr(self, "thread_abort", False): # If we are aborting, ignore request return self.progress_wnd.Pulse(" " * 4) if failed: msg = lang.getstr("failure") elif self.get_instrument_name() == "ColorMunki": msg = lang.getstr("instrument.calibrate.colormunki") else: # Detect type of calibration (emissive dark or reflective) # by looking for serial number of calibration tile # Argyll up to 1.8.3: 'Serial no.' # Argyll 1.9.x: 'S/N' serial = re.search("(?:Serial no.|S/N) (\S+)", self.recent.read(), re.I) if serial: # Reflective calibration, white reference tile required # (e.g. i1 Pro hires mode) msg = lang.getstr("instrument.calibrate.reflective", serial.group(1)) else: # Emissive dark calibration msg = lang.getstr("instrument.calibrate") dlg = ConfirmDialog(self.progress_wnd, msg=msg + "\n\n" + self.get_instrument_name(), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) self.progress_wnd.dlg = dlg dlg_result = dlg.ShowModal() dlg.Destroy() if self.finished: return if dlg_result != wx.ID_OK: self.abort_subprocess() return False self.progress_wnd.Pulse(lang.getstr("please_wait")) if self.safe_send(" "): self.progress_wnd.Pulse(lang.getstr("instrument.calibrating")) def abort_all(self, confirm=False): aborted = False for worker in workers: if not getattr(worker, "finished", True): worker.abort_subprocess(confirm) aborted = True return aborted def abort_subprocess(self, confirm=False): """ Abort the current subprocess or thread """ if getattr(self, "abort_requested", False): return self.abort_requested = True if confirm and getattr(self, "progress_wnd", None): prev_dlg = getattr(self.progress_wnd, "dlg", None) if (prev_dlg and prev_dlg.IsShownOnScreen() and not isinstance(prev_dlg, DummyDialog)): self.abort_requested = False return pause = (not getattr(self.progress_wnd, "paused", False) and hasattr(self.progress_wnd, "pause_continue_handler")) if pause: self.progress_wnd.pause_continue_handler(True) self.pause_continue() dlg = ConfirmDialog(self.progress_wnd, msg=lang.getstr("dialog.confirm_cancel"), ok=lang.getstr("yes"), cancel=lang.getstr("no"), bitmap=geticon(32, "dialog-warning")) self.progress_wnd.dlg = dlg dlg_result = dlg.ShowModal() if isinstance(prev_dlg, DummyDialog): self.progress_wnd.dlg = prev_dlg dlg.Destroy() if dlg_result != wx.ID_OK: if pause: self.progress_wnd.Resume() else: self.progress_wnd.keepGoing = True if hasattr(self.progress_wnd, "cancel"): self.progress_wnd.cancel.Enable() self.abort_requested = False return self.patch_count = 0 self.subprocess_abort = True self.thread_abort = True if self.use_patterngenerator or self.use_madnet_tpg: abortfilename = os.path.join(self.tempdir, ".abort") open(abortfilename, "w").close() delayedresult.startWorker(self.quit_terminate_consumer, self.quit_terminate_cmd) def quit_terminate_consumer(self, delayedResult): try: result = delayedResult.get() except Exception, exception: if hasattr(exception, "originalTraceback"): self.log(exception.originalTraceback, fn=log) else: self.log(traceback.format_exc(), fn=log) result = UnloggedError(safe_str(exception)) if isinstance(result, Exception): show_result_dialog(result, getattr(self, "progress_wnd", None)) result = False if not result: self.subprocess_abort = False self.thread_abort = False self.abort_requested = False if hasattr(self, "progress_wnd"): self.progress_wnd.Resume() def instrument_place_on_screen(self): """ Show a dialog asking user to place the instrument on the screen and give an option to cancel """ if getattr(self, "subprocess_abort", False) or \ getattr(self, "thread_abort", False): # If we are aborting, ignore request return self.progress_wnd.Pulse(" " * 4) dlg = ConfirmDialog(self.progress_wnd, msg=lang.getstr("instrument.place_on_screen") + "\n\n" + self.get_instrument_name(), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-information")) self.progress_wnd.dlg = dlg dlg_result = dlg.ShowModal() dlg.Destroy() if self.finished: return if dlg_result != wx.ID_OK: self.abort_subprocess() return False if not isinstance(self.progress_wnd, (UntetheredFrame, DisplayUniformityFrame)): self.safe_send(" ") self.pauseable_now = True self.instrument_on_screen = True def instrument_reposition_sensor(self): if getattr(self, "subprocess_abort", False) or \ getattr(self, "thread_abort", False): # If we are aborting, ignore request return self.progress_wnd.Pulse(" " * 4) dlg = ConfirmDialog(self.progress_wnd, msg=lang.getstr("instrument.reposition_sensor"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) self.progress_wnd.dlg = dlg dlg_result = dlg.ShowModal() dlg.Destroy() if self.finished: return if dlg_result != wx.ID_OK: self.abort_subprocess() return False self.safe_send(" ") def clear_argyll_info(self): """ Clear Argyll CMS version, detected displays and instruments. """ self.argyll_bin_dir = None self.argyll_version = [0, 0, 0] self.argyll_version_string = "0.0.0" self._displays = [] self.display_edid = [] self.display_manufacturers = [] self.display_names = [] self.display_rects = [] self.displays = [] self.instruments = [] self.lut_access = [] def clear_cmd_output(self): """ Clear any output from the last run command. """ self.cmd = None self.cmdname = None self.retcode = -1 self.output = [] self.errors = [] self.recent.clear() self.retrycount = 0 self.lastmsg.clear() self.repeat = False self.send_buffer = None # Log interaction with Argyll tools if (not hasattr(self, "logger") or (isinstance(self.logger, DummyLogger) and self.owner and self.owner.Name == "mainframe")): if not self.owner or self.owner.Name != "mainframe": self.logger = DummyLogger() else: self.logger = get_file_logger("interact") if (hasattr(self, "thread") and self.thread.isAlive() and self.interactive): self.logger.info("-" * 80) self.sessionlogfile = None self.madtpg_fullscreen = None self.use_madnet_tpg = False self.use_patterngenerator = False self.patch_sequence = False self.patch_count = 0 self.patterngenerator_sent_count = 0 self.exec_cmd_returnvalue = None self.tmpfiles = {} self.buffer = [] def lut3d_get_filename(self, path=None, include_input_profile=True, include_ext=True): # 3D LUT filename with crcr32 hash before extension - up to DCG 2.9.0.7 profile_save_path = os.path.splitext(path or getcfg("calibration.file") or defaults["calibration.file"])[0] lut3d = [getcfg("3dlut.gamap.use_b2a") and "gg" or "G", "i" + getcfg("3dlut.rendering_intent"), "r%i" % getcfg("3dlut.size"), "e" + getcfg("3dlut.encoding.input"), "E" + getcfg("3dlut.encoding.output"), "I%s:%s:%s" % (getcfg("3dlut.trc_gamma_type"), getcfg("3dlut.trc_output_offset"), getcfg("3dlut.trc_gamma"))] if getcfg("3dlut.format") == "3dl": lut3d.append(str(getcfg("3dlut.bitdepth.input"))) if getcfg("3dlut.format") in ("3dl", "png", "ReShade"): lut3d.append(str(getcfg("3dlut.bitdepth.output"))) if include_ext: lut3d_ext = getcfg("3dlut.format") if lut3d_ext == "eeColor": lut3d_ext = "txt" elif lut3d_ext == "madVR": lut3d_ext = "3dlut" elif lut3d_ext == "ReShade": lut3d_ext = "png" elif lut3d_ext == "icc": lut3d_ext = profile_ext[1:] else: lut3d_ext = "" if include_input_profile: input_profname = os.path.splitext(os.path.basename(getcfg("3dlut.input.profile")))[0] else: input_profname = "" lut3d_path = ".".join(filter(None, [profile_save_path, input_profname, "%X" % (zlib.crc32("-".join(lut3d)) & 0xFFFFFFFF), lut3d_ext])) if not include_input_profile or not os.path.isfile(lut3d_path): # 3D LUT filename with plain options before extension - DCG 2.9.0.8+ enc_in = lut3d[3][1:] enc_out = lut3d[4][1:] encoding = enc_in if enc_in != enc_out: encoding += enc_out if getcfg("3dlut.output.profile.apply_cal"): cal_exclude = "" else: cal_exclude = "e" if getcfg("3dlut.trc").startswith("smpte2084"): lut3dp = [str(getcfg("3dlut.trc_output_offset")) + ",2084"] if (getcfg("3dlut.hdr_peak_luminance") < 10000 or getcfg("3dlut.trc") == "smpte2084.rolloffclip" or getcfg("3dlut.hdr_minmll") or getcfg("3dlut.hdr_maxmll") < 10000): lut3dp.append("@%i" % getcfg("3dlut.hdr_peak_luminance")) if getcfg("3dlut.trc") == "smpte2084.hardclip": lut3dp.append("h") else: lut3dp.append("s") if getcfg("3dlut.hdr_minmll"): lut3dp.append("%.4f" % getcfg("3dlut.hdr_minmll")) if (getcfg("3dlut.hdr_minmll") and getcfg("3dlut.hdr_maxmll") < 10000): lut3dp.append("-") if getcfg("3dlut.hdr_maxmll") < 10000: lut3dp.append("%i" % getcfg("3dlut.hdr_maxmll")) elif getcfg("3dlut.trc") == "hlg": lut3dp = ["HLG"] if getcfg("3dlut.hdr_ambient_luminance") != 5: lut3dp.append("@%i" % getcfg("3dlut.hdr_ambient_luminance")) else: lut3dp = [lut3d[5][1].replace("b", "bb") + lut3d[5][3:].replace(":", ",")] # TRC lut3dp.extend([cal_exclude, lut3d[0], # Gamut mapping mode lut3d[1][1:], # Rendering intent encoding, lut3d[2][1:]]) # Resolution bitdepth_in = None bitdepth_out = None if len(lut3d) > 6: bitdepth_in = lut3d[6] # Input bitdepth if len(lut3d) > 7: bitdepth_out = lut3d[7] # Output bitdepth if bitdepth_in or bitdepth_out: bitdepth = bitdepth_in if bitdepth_out and bitdepth_in != bitdepth_out: bitdepth += bitdepth_out lut3dp.append(bitdepth) lut3d_path = ".".join(filter(None, [profile_save_path, input_profname, "".join(lut3dp), lut3d_ext])) return lut3d_path def create_3dlut(self, profile_in, path, profile_abst=None, profile_out=None, apply_cal=True, intent="r", format="cube", size=17, input_bits=10, output_bits=12, maxval=1.0, input_encoding="n", output_encoding="n", trc_gamma=None, trc_gamma_type="B", trc_output_offset=0.0, save_link_icc=True, apply_black_offset=True, use_b2a=False, white_cdm2=100, minmll=0, maxmll=10000, ambient_cdm2=5, content_rgb_space="DCI P3", hdr_display=False, XYZwp=None): """ Create a 3D LUT from one (device link) or two (device) profiles, optionally incorporating an abstract profile. """ # .cube: http://doc.iridas.com/index.php?title=LUT_Formats # .3dl: http://www.kodak.com/US/plugins/acrobat/en/motion/products/look/UserGuide.pdf # http://download.autodesk.com/us/systemdocs/pdf/lustre_color_management_user_guide.pdf # .spi3d: https://github.com/imageworks/OpenColorIO/blob/master/src/core/FileFormatSpi3D.cpp # .mga: http://pogle.pandora-int.com/download/manual/lut3d_format.html for profile in (profile_in, profile_out): if (profile.profileClass not in ("mntr", "link", "scnr", "spac") or profile.colorSpace != "RGB"): raise NotImplementedError(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace))) if profile_in.profileClass == "link": break # Setup temp dir cwd = self.create_tempdir() if isinstance(cwd, Exception): raise cwd result = None path = os.path.split(path) path = os.path.join(path[0], make_argyll_compatible_path(path[1])) filename, ext = os.path.splitext(path) name = os.path.basename(filename) if profile_in.profileClass == "link": link_basename = os.path.basename(profile_in.fileName) link_filename = os.path.join(cwd, link_basename) profile_in.write(link_filename) else: collink = get_argyll_util("collink") if not collink: raise Error(lang.getstr("argyll.util.not_found", "collink")) extra_args = parse_argument_string(getcfg("extra_args.collink")) smpte2084 = trc_gamma in ("smpte2084.hardclip", "smpte2084.rolloffclip") hlg = trc_gamma == "hlg" hdr = smpte2084 or hlg profile_in_basename = make_argyll_compatible_path(os.path.basename(profile_in.fileName)) hdr_use_src_gamut = (hdr and profile_in_basename == "Rec2020.icm" and intent in ("la", "lp", "p", "pa", "ms", "s") and not get_arg("-G", extra_args) and not get_arg("-g", extra_args)) if hdr and not hdr_use_src_gamut and not use_b2a: # Always use B2A instead of inverse forward table (faster and # better result if B2A table has enough effective resolution) # for HDR with colorimetric intents use_b2a = True # Check B2A resolution and regenerate on-the-fly if too low b2a = profile_out.tags.get("B2A1", profile_out.tags.get("B2A0")) if not b2a or (isinstance(b2a, ICCP.LUT16Type) and b2a.clut_grid_steps < 17): b2aresult = self.update_profile_B2A(profile_out) if isinstance(b2aresult, Exception): raise b2aresult profile_out.write() use_xicclu = (experimental and not profile_abst and not use_b2a and format != "madVR" and intent in ("a", "aw", "r") and input_encoding in ("n", "t", "T") and output_encoding in ("n", "t")) # Prepare building a device link link_basename = name + profile_ext link_filename = os.path.join(cwd, link_basename) profile_out_basename = make_argyll_compatible_path(os.path.basename(profile_out.fileName)) if profile_in_basename == profile_out_basename: (profile_out_filename, profile_out_ext) = os.path.splitext(profile_out_basename) profile_out_basename = "%s (2)%s" % (profile_out_filename, profile_out_ext) profile_out.fileName = os.path.join(cwd, profile_out_basename) profile_out.write() profile_out_cal_path = os.path.splitext(profile_out.fileName)[0] + ".cal" manufacturer = profile_out.getDeviceManufacturerDescription() model = profile_out.getDeviceModelDescription() device_manufacturer = profile_out.device["manufacturer"] device_model = profile_out.device["model"] mmod = profile_out.tags.get("mmod") self.set_sessionlogfile(None, name, cwd) # Apply calibration? if apply_cal: extract_cal_from_profile(profile_out, profile_out_cal_path) if self.argyll_version < [1, 6] or use_xicclu: # Can't apply the calibration with old collink versions - # apply the calibration to the 'out' profile prior to # device linking instead applycal = get_argyll_util("applycal") if not applycal: raise Error(lang.getstr("argyll.util.not_found", "applycal")) safe_print(lang.getstr("apply_cal")) result = self.exec_cmd(applycal, ["-v", profile_out_cal_path, profile_out_basename, profile_out.fileName], capture_output=True, skip_scripts=True, sessionlogfile=self.sessionlogfile) if isinstance(result, Exception) and not getcfg("dry_run"): raise result elif not result: raise Error("\n\n".join([lang.getstr("apply_cal.error"), "\n".join(self.errors)])) profile_out = ICCP.ICCProfile(profile_out.fileName) # Deal with applying TRC collink_version_string = get_argyll_version_string("collink") collink_version = parse_argyll_version_string(collink_version_string) if trc_gamma: if (not hdr and not use_xicclu and (collink_version >= [1, 7] or not trc_output_offset)): # Make sure the profile has the expected Rec. 709 TRC # for BT.1886 self.log(appname + ": Applying Rec. 709 TRC to " + os.path.basename(profile_in.fileName)) for i, channel in enumerate(("r", "g", "b")): if channel + "TRC" in profile_in.tags: profile_in.tags[channel + "TRC"].set_trc(-709) else: # For HDR or Argyll < 1.7 beta, alter profile TRC # Argyll CMS prior to 1.7 beta development code 2014-07-10 # does not support output offset, alter the source profile # instead (note that accuracy is limited due to 16-bit # encoding used in ICC profile, collink 1.7 can use full # floating point processing and will be more precise) self.blend_profile_blackpoint(profile_in, profile_out, trc_output_offset, trc_gamma, trc_gamma_type, white_cdm2=white_cdm2, minmll=minmll, maxmll=maxmll, ambient_cdm2=ambient_cdm2, content_rgb_space=content_rgb_space, hdr_chroma_compression=not hdr_use_src_gamut) elif apply_black_offset: # Apply only the black point blending portion of BT.1886 mapping self.blend_profile_blackpoint(profile_in, profile_out, 1.0, apply_trc=False) # Deal with whitepoint profile_in_wtpt_XYZ = profile_in.tags.wtpt.ir.values() if XYZwp: self.log("Using whitepoint chromaticity %.4f %.4f for input" % tuple(colormath.XYZ2xyY(*XYZwp)[:2])) (profile_in.tags.wtpt.X, profile_in.tags.wtpt.Y, profile_in.tags.wtpt.Z) = XYZwp profile_in.fileName = os.path.join(cwd, profile_in_basename) profile_in.write() if hdr_use_src_gamut: in_rgb_space = profile_in.get_rgb_space() in_colors = colormath.get_rgb_space_primaries_wp_xy(in_rgb_space) content_rgb_space = colormath.get_rgb_space(content_rgb_space) content_colors = colormath.get_rgb_space_primaries_wp_xy(content_rgb_space) if hdr_use_src_gamut and content_colors != in_colors: # Use source gamut to preserve more saturation. # Assume content colorspace (i.e. DCI P3) encoded within # container colorspace (i.e. Rec. 2020) tools = {} for toolname in (#"iccgamut", #"timage", "cctiff", "tiffgamut"): tools[toolname] = get_argyll_util(toolname) if not tools[toolname]: raise Error(lang.getstr("argyll.util.not_found", toolname)) # Get source profile crx, cry = content_rgb_space[2:][0][:2] cgx, cgy = content_rgb_space[2:][1][:2] cbx, cby = content_rgb_space[2:][2][:2] cwx, cwy = colormath.XYZ2xyY(*content_rgb_space[1])[:2] rgb_space_name = (colormath.find_primaries_wp_xy_rgb_space_name(content_colors) or "Custom") profile_src = ICCP.ICCProfile.from_chromaticities(crx, cry, cgx, cgy, cbx, cby, cwx, cwy, 1.0, rgb_space_name, "") fd, profile_src.fileName = tempfile.mkstemp(profile_ext, "%s-" % rgb_space_name, dir=cwd) stream = os.fdopen(fd, "wb") profile_src.write(stream) stream.close() # Apply HDR TRC to source self.blend_profile_blackpoint(profile_src, profile_out, trc_output_offset, trc_gamma, trc_gamma_type, white_cdm2=white_cdm2, minmll=minmll, maxmll=maxmll, ambient_cdm2=ambient_cdm2, hdr_chroma_compression=False) profile_src.write() # Create link from source to destination profile gam_link_filename = tempfile.mktemp(profile_ext, "gam-link-", dir=cwd) result = self.exec_cmd(collink, ["-v", "-G", "-ir", profile_src.fileName, profile_in_basename, gam_link_filename], capture_output=True, skip_scripts=True, sessionlogfile=self.sessionlogfile) if isinstance(result, Exception) and not getcfg("dry_run"): raise result elif not result: raise Error("\n".join(self.errors) or "%s %s" % (collink, lang.getstr("error"))) # Create RGB image ##gam_in_tiff = tempfile.mktemp(".tif", "gam-in-", dir=cwd) ##result = self.exec_cmd(tools["timage"], ["-x", gam_in_tiff], ##capture_output=True, ##skip_scripts=True, ##sessionlogfile=self.sessionlogfile) ##if isinstance(result, Exception) and not getcfg("dry_run"): ##raise result ##elif not result: ##raise Error("\n".join(self.errors) or lang.getstr("error")) fd, gam_in_tiff = tempfile.mkstemp(".tif", "gam-in-", dir=cwd) stream = os.fdopen(fd, "wb") imfile.write_rgb_clut(stream, 65, format="TIFF") stream.close() # Convert RGB image from source to destination to get source # encoded within destination. gam_out_tiff = tempfile.mktemp(".tif", "gam-out-", dir=cwd) result = self.exec_cmd(tools["cctiff"], ["-p", gam_link_filename, gam_in_tiff, gam_out_tiff], capture_output=True, skip_scripts=True, sessionlogfile=self.sessionlogfile) if isinstance(result, Exception) and not getcfg("dry_run"): raise result elif not result: raise Error("\n".join(self.errors) or "%s %s" % (tools["cctiff"], lang.getstr("error"))) # Create gamut surface from image ##gam_filename = os.path.splitext(profile_src.fileName)[0] + ".gam" ##result = self.exec_cmd(tools["iccgamut"], ["-ir", "-pj", ##profile_src.fileName], ##capture_output=True, ##skip_scripts=True, ##sessionlogfile=self.sessionlogfile) gam_filename = os.path.splitext(gam_out_tiff)[0] + ".gam" result = self.exec_cmd(tools["tiffgamut"], ["-ir", "-pj", profile_in.fileName, gam_out_tiff], capture_output=True, skip_scripts=True, sessionlogfile=self.sessionlogfile) if isinstance(result, Exception) and not getcfg("dry_run"): raise result elif not result: raise Error("\n".join(self.errors) or "%s %s" % (tools["tiffgamut"], lang.getstr("error"))) else: gam_filename = None # Now build the device link args = ["-v", "-qh", "-g" if use_b2a else "-G", "-i%s" % intent, "-r%i" % size, "-n"] if gam_filename: # Use source gamut args.insert(3, gam_filename) if profile_abst: profile_abst.write(os.path.join(cwd, "abstract.icc")) args.extend(["-p", "abstract.icc"]) if self.argyll_version >= [1, 6]: if format == "madVR": args.append("-3m") elif format == "eeColor" and not test: args.append("-3e") elif (format == "cube" and collink_version >= [1, 7] and not test): args.append("-3c") args.append("-e%s" % input_encoding) args.append("-E%s" % output_encoding) if (((trc_gamma and trc_gamma_type in ("b", "B")) or (not trc_gamma and apply_black_offset)) and collink_version >= [1, 7]): args.append("-b") # Use RGB->RGB forced black point hack if (trc_gamma and not hdr and trc_gamma_type in ("b", "B")): if collink_version >= [1, 7]: args.append("-I%s:%s:%s" % (trc_gamma_type, trc_output_offset, trc_gamma)) elif not trc_output_offset: args.append("-I%s:%s" % (trc_gamma_type, trc_gamma)) if apply_cal: # Apply the calibration when building our device link # i.e. use collink -a parameter (apply calibration curves # to link output and append linear) args.extend(["-a", os.path.basename(profile_out_cal_path)]) if extra_args: args += extra_args # cLUT Input value tweaks to make Video encoded black land on # 65 res grid nodes, which should help 33 and 17 res cLUTs too def cLUT65_to_VidRGB(v): if size not in (17, 33, 65): return v if v <= 236.0 / 256: # Scale up to near black point return v * 256.0 / 255 else: return 1 - (1 - v) * (1 - 236.0 / 255) / (1 - 236.0 / 256) def VidRGB_to_cLUT65(v): if size not in (17, 33, 65): return v if v <= 236.0 / 255.0: return v * 255.0 / 256 else: return 1 - (1 - v) * (1 - 236.0 / 256) / (1 - 236.0 / 255) logfiles = self.get_logfiles() if use_xicclu: # Create device link using xicclu is_argyll_lut_format = format == "icc" def clipVidRGB(RGB): """ Clip a value to the RGB Video range 16..235 RGB. Clip the incoming value RGB[] in place. Return a bit mask of the channels that have/would clip, scale all non-black values to avoid positive clipping and return the restoring scale factor (> 1.0) if this has occured, return the full value in the clip direction in full[], and return the uncliped value in unclipped[]. """ clipmask = 0 scale = 1.0 full = [None] * 3 unclipped = list(RGB) # Locate the channel with the largest value mx = max(RGB) # One channel positively clipping if mx > 235.0 / 255.0: scale = ((235.0 - 16.0) / 255.0) / (mx - (16.0 / 255.0)) # Scale all non-black value down towards black, to avoid clipping for i, v in enumerate(RGB): # Note if channel would clip in itself if v > 235.0 / 255.0: full[i] = 1.0 clipmask |= 1 << i if v > 16.0 / 255.0: RGB[i] = (v - 16.0 / 255.0) * scale + 16.0 / 255.0 # See if any values negatively clip for i, v in enumerate(RGB): if v < 16.0 / 255.0: RGB[i] = 16.0 / 255.0 full[i] = 0.0 clipmask |= 1 << i scale = 1.0 / scale return clipmask, scale, full, unclipped, RGB logfiles.write("Generating input values...\n") clip = {} RGB_src_in = [] maxind = size - 1.0 level_16 = VidRGB_to_cLUT65(16.0 / 255) * maxind level_235 = VidRGB_to_cLUT65(235.0 / 255) * maxind prevperc = 0 cliphack = False # Clip TV levels BtB/WtW in for full range out? for a in xrange(size): for b in xrange(size): for c in xrange(size): if self.thread_abort: raise Info(lang.getstr("aborted")) abc = (a, b, c) RGB = [v / maxind for v in abc] if input_encoding in ("t", "T"): # TV levels in if (cliphack and output_encoding == "n" and (min(abc) < level_16 or max(abc) > math.ceil(level_235))): # Don't lookup out of range values continue else: RGB = [cLUT65_to_VidRGB(v) for v in RGB] clip[abc] = clipVidRGB(RGB) if a == b == c and a in (math.ceil(level_16), math.ceil(level_235)): self.log("Input RGB (0..255) %f %f %f" % tuple(v * 255 for v in RGB)) # Convert 16..235 to 0..255 for xicclu RGB = [colormath.convert_range(v, 16.0 / 255, 235.0 / 255, 0, 1) for v in RGB] RGB = [min(max(v, 0), 1) * 255 for v in RGB] RGB_src_in.append(RGB) perc = round(len(RGB_src_in) / float(size ** 3) * 100) if perc > prevperc: logfiles.write("\r%i%%" % perc) prevperc = perc logfiles.write("\n") # Forward lookup input RGB through source profile logfiles.write("Looking up input values through source profile...\n") XYZ_src_out = self.xicclu(profile_in, RGB_src_in, intent[0], pcs="x", scale=255, logfile=logfiles) if intent == "aw": XYZw = self.xicclu(profile_in, [[1, 1, 1]], intent[0], pcs="x")[0] # Lookup scaled down white XYZ logfiles.write("Looking for solution...\n") for n in xrange(9): XYZscaled = [] for i in xrange(2001): XYZscaled.append([v * (1 - (n * 2001 + i) / 20000.0) for v in XYZw]) RGBscaled = self.xicclu(profile_out, XYZscaled, "a", "if", pcs="x", get_clip=True) # Find point at which it no longer clips XYZwscaled = None for i, RGBclip in enumerate(RGBscaled): if self.thread_abort: raise Info(lang.getstr("aborted")) if RGBclip[3] is True or max(RGBclip[:3]) > 1: # Clipped, skip continue # Found XYZwscaled = XYZscaled[i] logfiles.write("Solution found at index %i " "(step size %f)\n" % (i, 1 / 2000.0)) logfiles.write("RGB white %6.4f %6.4f %6.4f\n" % tuple(RGBclip[:3])) logfiles.write("XYZ white %6.4f %6.4f %6.4f, " "CCT %.1f K\n" % tuple(XYZscaled[i] + [colormath.XYZ2CCT(*XYZwscaled)])) break else: if n == 8: break if XYZwscaled: # Found solution break if not XYZwscaled: raise Error("No solution found in %i " "iterations with %i steps" % (n, i)) for i, XYZ in enumerate(XYZ_src_out): XYZ[:] = [v / XYZw[1] * XYZwscaled[1] for v in XYZ] # Inverse forward lookup source profile output XYZ through # destination profile num_cpus = cpu_count() num_workers = min(max(num_cpus, 1), size) if "A2B0" in profile_out.tags: if num_cpus > 2: num_workers = int(num_workers * 0.75) num_batches = size // 9 else: if num_cpus > 2: num_workers = 2 num_batches = 1 logfiles.write("Creating 3D LUT from inverse forward lookup " "(%i workers)...\n" % num_workers) RGB_dst_out = [] for slices in pool_slice(_mp_xicclu, XYZ_src_out, (profile_out.fileName, intent[0], "if"), {"pcs": "x", "use_cam_clipping": True, "abortmessage": lang.getstr("aborted")}, num_workers, self.thread_abort, logfiles, num_batches=num_batches): RGB_dst_out.extend(slices) logfiles.write("\n") logfiles.write("Filling cLUT...\n") profile_link = ICCP.ICCProfile() profile_link.profileClass = "link" profile_link.connectionColorSpace = "RGB" profile_link.tags.A2B0 = A2B0 = ICCP.LUT16Type(None, "A2B0", profile_link) A2B0.matrix = colormath.Matrix3x3([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) if input_encoding in ("t", "T"): A2B0.input = [[]] * 3 for i in xrange(2048): A2B0.input[0].append(VidRGB_to_cLUT65(i / 2047.0) * 65535) else: A2B0.input = [[0, 65535]] * 3 A2B0.output = [[0, 65535]] * 3 A2B0.clut = [] clut = {} for a in xrange(size): for b in xrange(size): for c in xrange(size): abc = (a, b, c) if (cliphack and input_encoding in ("t", "T") and output_encoding == "n" and (min(abc) < level_16 or max(abc) > math.ceil(level_235))): # TV levels in, no value from lookup, full # range out continue if max([v / maxind for v in abc]) < 0.5 / maxind: # Black hack self.log("Black hack - forcing level %i to 0" % (cLUT65_to_VidRGB(a / maxind) * 255)) RGB = [0] * 3 else: RGB = RGB_dst_out[len(clut)] clut[abc] = RGB preserve_sync = getcfg("3dlut.preserve_sync") prevperc = 0 for a in xrange(size): for b in xrange(size): A2B0.clut.append([]) for c in xrange(size): abc = (a, b, c) if (cliphack and input_encoding in ("t", "T") and output_encoding == "n" and (min(abc) < level_16 or max(abc) > math.ceil(level_235))): # TV levels in, no value from lookup, full # range out key = tuple(min(max(v, math.ceil(level_16)), math.ceil(level_235)) for v in abc) RGB = clut[key] else: # Got value from lookup RGB = clut[abc] if output_encoding == "t": # TV levels out # Convert 0..255 to 16..235 RGB = [colormath.convert_range(v, 0, 1, 16.0 / 255, 235.0 / 255) for v in RGB] if input_encoding in ("t", "T"): # TV levels in, scale/extrapolate clip clipmask, scale, full, uci, cin = clip[abc] for j, v in enumerate(RGB): if clipmask: if input_encoding != "T" and scale > 1: # We got +ve clipping # Re-scale all non-black values if v > 16.0 / 255.0: v = (v - 16.0 / 255.0) * scale + 16.0 / 255.0 # Deal with -ve clipping and sync if clipmask & (1 << j): if full[j] == 0.0: # Only extrapolate in black direction ifull = 1.0 - full[j] # Opposite limit to full # Do simple extrapolation (Not perfect though) v = ifull + (v - ifull) * (uci[j] - ifull) / (cin[j] - ifull) # Clip or pass sync through if (v < 0.0 or v > 1.0 or (preserve_sync and abs(uci[j] - full[j]) < 1e-6)): v = full[j] RGB[j] = v RGB = [min(max(v, 0), 1) * 65535 for v in RGB] A2B0.clut[-1].append(RGB) perc = round(len(A2B0.clut) / float(size ** 2) * 100) if perc > prevperc: logfiles.write("\r%i%%" % perc) prevperc = perc logfiles.write("\n") profile_link.write(link_filename) result = True else: # Create device link (and 3D LUT, if applicable) using collink is_argyll_lut_format = (self.argyll_version >= [1, 6] and (((format == "eeColor" or (format == "cube" and collink_version >= [1, 7])) and not test) or format == "madVR") or format == "icc") result = self.exec_cmd(collink, args + [profile_in_basename, profile_out_basename, link_filename], capture_output=True, skip_scripts=True) if (result and not isinstance(result, Exception) and save_link_icc and os.path.isfile(link_filename)): profile_link = ICCP.ICCProfile(link_filename) profile_link.setDescription(name) profile_link.setCopyright(getcfg("copyright")) if manufacturer: profile_link.setDeviceManufacturerDescription(manufacturer) if model: profile_link.setDeviceModelDescription(model) profile_link.device["manufacturer"] = device_manufacturer profile_link.device["model"] = device_model if mmod: profile_link.tags.mmod = mmod profile_link.tags.meta = ICCP.DictType() profile_link.tags.meta.update([("CMF_product", appname), ("CMF_binary", appname), ("CMF_version", version), ("collink.args", sp.list2cmdline( args + [profile_in_basename, profile_out_basename, link_basename])), ("collink.version", collink_version_string), ("encoding.input", input_encoding), ("encoding.output", output_encoding)]) profile_link.calculateID() profile_link.write(filename + profile_ext) profile_link.tags.A2B0.clut_writepng(filename + ".A2B0.CLUT.png") if hdr: if format == "madVR": # We need to update Input_Primaries, otherwise the # madVR 3D LUT won't work correctly! (collink fills # Input_Primaries from a lookup through the input # profile, which won't work correctly in our case as # the input profile is a gamut mapped CLUT) h3d = madvr.H3DLUT(os.path.join(cwd, name + ".3dlut")) input_primaries = re.search("Input_Primaries" + "\s+(\d\.\d+)" * 8, h3d.parametersData) if input_primaries: components = list(input_primaries.groups()) (profile_in.tags.wtpt.X, profile_in.tags.wtpt.Y, profile_in.tags.wtpt.Z) = profile_in_wtpt_XYZ rgb_space = profile_in.get_rgb_space() components_new = [] for i in xrange(3): for j in xrange(2): components_new.append(rgb_space[2 + i][j]) components_new.append(profile_in.tags.wtpt.ir.xyY[0]) components_new.append(profile_in.tags.wtpt.ir.xyY[1]) for i, component in enumerate(components_new): frac = len(components[i].split(".").pop()) numberformat = "%%.%if" % frac components_new[i] = numberformat % round(component, frac) parametersData = list(h3d.parametersData) cstart, cend = input_primaries.span() parametersData[cstart + 16:cend] = " ".join(components_new) if smpte2084: h3d.parametersData = "Input_Transfer_Function PQ\r\n" if hdr_display: h3d.parametersData += "Output_Transfer_Function PQ\r\n" else: h3d.parametersData = "" h3d.parametersData += "".join(parametersData) h3d.write() else: raise Error("madVR 3D LUT doesn't contain " "Input_Primaries") # Save HDR source profile in_name, in_ext = os.path.splitext(profile_in_basename) profile_in.fileName = os.path.join(os.path.dirname(path), self.lut3d_get_filename(profile_in_basename, False, False) + in_ext) profile_in.write() if isinstance(profile_in.tags.get("A2B0"), ICCP.LUT16Type): # Write diagnostic PNG profile_in.tags.A2B0.clut_writepng( os.path.splitext(profile_in.fileName)[0] + ".A2B0.CLUT.png") # HDR RGB profile_in.tags.DBG0.clut_writepng( os.path.splitext(profile_in.fileName)[0] + ".DBG0.CLUT.png") # Display RGB profile_in.tags.DBG1.clut_writepng( os.path.splitext(profile_in.fileName)[0] + ".DBG1.CLUT.png") # Display XYZ profile_in.tags.DBG2.clut_writepng( os.path.splitext(profile_in.fileName)[0] + ".DBG2.CLUT.png") if is_argyll_lut_format: # Collink has already written the 3DLUT for us if format == "cube": # Strip any leading whitespace from each line (although # leading/trailing spaces are allowed according to the spec). # Also, Argyll does not write (optional) DOMAIN_MIN/MAX # keywords. Add them after the fact. cube_filename = os.path.join(cwd, name + ".cube") if os.path.isfile(cube_filename): add_domain = True cube_data = [] with open(cube_filename, "rb") as cube_file: for line in cube_file: # Strip any leading whitespace line = line.lstrip() if line.startswith("DOMAIN_"): # Account for the possibility that a # future Argyll version might write # DOMAIN_MIN/MAX keywords. add_domain = False elif line.startswith("0.") and add_domain: # 1st cube data entry marks end of keywords. # Add DOMAIN_MIN/MAX keywords cube_data.append("DOMAIN_MIN 0.0 0.0 0.0\n") fp_offset = str(maxval).find(".") domain_max = "DOMAIN_MAX %s %s %s\n" % (("%%.%if" % len(str(maxval)[fp_offset + 1:]), ) * 3) cube_data.append(domain_max % ((maxval ,) * 3)) cube_data.append("\n") add_domain = False cube_data.append(line) # Write updated cube with open(cube_filename, "wb") as cube_file: cube_file.write("".join(cube_data)) result2 = self.wrapup(not isinstance(result, UnloggedInfo) and result, dst_path=path, ext_filter=[".3dlut", ".cube", ".log", ".png", ".txt"]) if not result: result = UnloggedError(lang.getstr("aborted")) if isinstance(result2, Exception): if isinstance(result, Exception): result = Error(safe_unicode(result) + "\n\n" + safe_unicode(result2)) else: result = result2 if not isinstance(result, Exception): return if isinstance(result, Exception): raise result elif not result: raise UnloggedError(lang.getstr("aborted")) # We have to create the 3DLUT ourselves logfiles.write("Generating %s 3D LUT...\n" % format) def VidRGB_to_eeColor(v): return v * 255.0/256.0 def eeColor_to_VidRGB(v): return v * 256.0/255.0 # Create input RGB values RGB_oin = [] RGB_in = [] RGB_indexes = [] seen = {} if format == "eeColor": # Fixed size size = 65 elif format == "ReShade": format = "png" step = 1.0 / (size - 1) RGB_triplet = [0.0, 0.0, 0.0] RGB_index = [0, 0, 0] # Set the fastest and slowest changing columns, from right to left if (format in ("3dl", "mga", "spi3d") or (format == "png" and getcfg("3dlut.image.order") == "bgr")): columns = (0, 1, 2) elif format == "eeColor": columns = (2, 0, 1) else: columns = (2, 1, 0) for i in xrange(0, size): # Red if format == "eeColor" and i == size - 1: # Last cLUT entry is fixed to 1.0 for eeColor and unchangeable continue RGB_triplet[columns[0]] = step * i RGB_index[columns[0]] = i for j in xrange(0, size): # Green if format == "eeColor" and j == size - 1: # Last cLUT entry is fixed to 1.0 for eeColor and unchangeable continue RGB_triplet[columns[1]] = step * j RGB_index[columns[1]] = j for k in xrange(0, size): # Blue if self.thread_abort: raise Info(lang.getstr("aborted")) if format == "eeColor" and k == size - 1: # Last cLUT entry is fixed to 1.0 for eeColor and unchangeable continue RGB_triplet[columns[2]] = step * k RGB_oin.append(list(RGB_triplet)) RGB_copy = list(RGB_triplet) if format == "eeColor": for l in xrange(3): RGB_copy[l] = eeColor_to_VidRGB(RGB_copy[l]) if input_encoding in ("t", "T"): RGB_copy[l] = VidRGB_to_cLUT65(RGB_copy[l]) RGB_index[columns[2]] = k RGB_in.append(RGB_copy) RGB_indexes.append(list(RGB_index)) # Lookup RGB -> RGB values through devicelink profile using icclu # (Using icclu instead of xicclu because xicclu in versions # prior to Argyll CMS 1.6.0 could not deal with devicelink profiles) RGB_out = self.xicclu(link_filename, RGB_in, use_icclu=True, logfile=logfiles) if format == "eeColor" and output_encoding == "n": RGBw = self.xicclu(link_filename, [[1, 1, 1]], use_icclu=True)[0] # Remove temporary files, move log file result2 = self.wrapup(dst_path=path, ext_filter=[".log"]) if isinstance(result, Exception): raise result if format != "png": lut = [["# Created with %s %s" % (appname, version)]] valsep = " " linesep = "\n" if format == "3dl": if maxval is None: maxval = 1023 if output_bits is None: output_bits = math.log(maxval + 1) / math.log(2) if input_bits is None: input_bits = output_bits maxval = math.pow(2, output_bits) - 1 pad = len(str(maxval)) lut.append(["# INPUT RANGE: %i" % input_bits]) lut.append(["# OUTPUT RANGE: %i" % output_bits]) lut.append([]) for i in xrange(0, size): lut[-1].append("%i" % int(round(i * step * (math.pow(2, input_bits) - 1)))) for RGB_triplet in RGB_out: lut.append([]) for component in (0, 1, 2): lut[-1].append("%i" % int(round(RGB_triplet[component] * maxval))) elif format == "cube": if maxval is None: maxval = 1.0 lut.append(["LUT_3D_SIZE %i" % size]) lut.append(["DOMAIN_MIN 0.0 0.0 0.0"]) fp_offset = str(maxval).find(".") domain_max = "DOMAIN_MAX %s %s %s" % (("%%.%if" % len(str(maxval)[fp_offset + 1:]), ) * 3) lut.append([domain_max % ((maxval ,) * 3)]) lut.append([]) for RGB_triplet in RGB_out: lut.append([]) for component in (0, 1, 2): lut[-1].append("%.6f" % (RGB_triplet[component] * maxval)) elif format == "spi3d": if maxval is None: maxval = 1.0 lut = [["SPILUT 1.0"]] lut.append(["3 3"]) lut.append(["%i %i %i" % ((size, ) * 3)]) for i, RGB_triplet in enumerate(RGB_out): lut.append([str(index) for index in RGB_indexes[i]]) for component in (0, 1, 2): lut[-1].append("%.6f" % (RGB_triplet[component] * maxval)) elif format == "eeColor": if maxval is None: maxval = 1.0 lut = [] for i, RGB_triplet in enumerate(RGB_out): lut.append(["%.6f" % (component * maxval) for component in RGB_oin[i]]) for component in (0, 1, 2): v = RGB_triplet[component] * maxval if output_encoding == "n": # For eeColor and full range RGB, make sure that the cLUT # output maps to 1.0 # The output curve will correct this v /= RGBw[component] v = min(v, 1) v = VidRGB_to_eeColor(v) lut[-1].append("%.6f" % v) linesep = "\r\n" elif format == "mga": lut = [["#HEADER"], ["#filename: %s" % os.path.basename(path)], ["#type: 3D cube file"], ["#format: 1.00"], ["#created: %s" % strftime("%d %B %Y")], ["#owner: %s" % getpass.getuser()], ["#title: %s" % os.path.splitext(os.path.basename(path))[0]], ["#END"]] lut.append([]) lut.append(["channel 3d"]) lut.append(["in %i" % (size ** 3)]) maxval = 2 ** output_bits - 1 lut.append(["out %i" % (maxval + 1)]) lut.append([""]) lut.append(["format lut"]) lut.append([""]) lut.append(["values\tred\tgreen\tblue"]) for i, RGB_triplet in enumerate(RGB_out): lut.append(["%i" % i]) for component in (0, 1, 2): lut[-1].append(("%i" % int(round(RGB_triplet[component] * maxval)))) valsep = "\t" elif format == "png": lut = [[]] if output_bits > 8: # PNG only supports 8 and 16 bit output_bits = 16 maxval = 2 ** output_bits - 1 for RGB_triplet in RGB_out: if len(lut[-1]) == size: # Append new scanline lut.append([]) lut[-1].append([int(round(v * maxval)) for v in RGB_triplet]) # Current layout is vertical if getcfg("3dlut.image.layout") == "h": # Change layout to horizontal lutv = lut lut = [[]] for i in xrange(size): if len(lut[-1]) == size ** 2: # Append new scanline lut.append([]) for j in xrange(size): lut[-1].extend(lutv[i + size * j]) if format != "png": lut.append([]) for i, line in enumerate(lut): lut[i] = valsep.join(line) result = linesep.join(lut) # Write 3DLUT lut_file = open(path, "wb") if format != "png": lut_file.write(result) else: im = imfile.Image(lut, output_bits) im.write(lut_file) lut_file.close() if format == "eeColor": # Write eeColor 1D LUTs for i, color in enumerate(["red", "green", "blue"]): for count, inout in [(1024, "first"), (8192, "second")]: with open(filename + "-" + inout + "1d" + color + ".txt", "wb") as lut1d: for j in xrange(count): v = j / (count - 1.0) if inout == "second" and output_encoding == "n": # For eeColor and Full range RGB, unmap the # cLUT output maps from 1.0 v *= RGBw[i] lut1d.write("%.6f\n" % v) if isinstance(result2, Exception): raise result2 def enumerate_displays_and_ports(self, silent=False, check_lut_access=True, enumerate_ports=True, include_network_devices=True): """ Enumerate the available displays and ports. Also sets Argyll version number, availability of certain options like black point rate, and checks LUT access for each display. """ if (silent and check_argyll_bin()) or (not silent and check_set_argyll_bin()): displays = [] xrandr_names = {} lut_access = [] if verbose >= 1: safe_print(lang.getstr("enumerating_displays_and_comports")) instruments = [] current_display_name = config.get_display_name() cfg_instruments = getcfg("instruments") current_instrument = config.get_instrument_name() if enumerate_ports: cmd = get_argyll_util("dispcal") else: cmd = get_argyll_util("dispwin") for instrument in cfg_instruments: # Names are canonical from 1.1.4.7 onwards, but we may have # verbose names from an old configuration instrument = get_canonical_instrument_name(instrument) if instrument.strip(): instruments.append(instrument) args = [] if include_network_devices: args.append("-dcc:?") args.append("-?") argyll_bin_dir = os.path.dirname(cmd) if (argyll_bin_dir != self.argyll_bin_dir): self.argyll_bin_dir = argyll_bin_dir safe_print(self.argyll_bin_dir) result = self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, silent=True, log_output=False) if isinstance(result, Exception): safe_print(result) arg = None defaults["calibration.black_point_hack"] = 0 defaults["calibration.black_point_rate.enabled"] = 0 defaults["patterngenerator.prisma.argyll"] = 0 n = -1 self.display_rects = [] non_standard_display_args = ("-dweb[:port]", "-dmadvr") if test: # Add dummy Chromecasts self.output.append(u" -dcc[:n]") self.output.append(u" 100 = '\xd4\xc7\xf3 Test A'") self.output.append(u" 101 = '\xd4\xc7\xf3 Test B'") argyll_version_string = None for line in self.output: if isinstance(line, unicode): n += 1 line = line.strip() if (argyll_version_string is None and "version" in line.lower()): argyll_version_string = line[line.lower().find("version") + 8:] if (argyll_version_string != self.argyll_version_string): self.set_argyll_version_from_string(argyll_version_string) safe_print("ArgyllCMS " + self.argyll_version_string) config.defaults["copyright"] = ("No copyright. Created " "with %s %s and Argyll" "CMS %s" % (appname, version, argyll_version_string)) if self.argyll_version > [1, 0, 4]: # Rate of blending from neutral to black point. defaults["calibration.black_point_rate.enabled"] = 1 if (self.argyll_version >= [1, 7] and not "Beta" in self.argyll_version_string): # Forced black point hack available # (Argyll CMS 1.7) defaults["calibration.black_point_hack"] = 1 if self.argyll_version >= [1, 9, 4]: # Add CIE 2012 observers valid_observers = natsort(observers + ["2012_2", "2012_10"]) else: valid_observers = observers for key in ["%s", "colorimeter_correction.%s", "colorimeter_correction.%s.reference"]: key %= "observer" config.valid_values[key] = valid_observers continue line = line.split(None, 1) if len(line) and line[0][0] == "-": arg = line[0] if arg == "-A": # Rate of blending from neutral to black point. defaults["calibration.black_point_rate.enabled"] = 1 elif arg in non_standard_display_args: displays.append(arg) elif arg == "-b" and not line[-1].startswith("bright"): # Forced black point hack available # (Argyll CMS 1.7b 2014-12-22) defaults["calibration.black_point_hack"] = 1 elif arg == "-dprisma[:host]": defaults["patterngenerator.prisma.argyll"] = 1 elif len(line) > 1 and line[1][0] == "=": value = line[1].strip(" ='") if arg == "-d": # Standard displays match = re.findall("(.+?),? at (-?\d+), (-?\d+), " "width (\d+), height (\d+)", value) if len(match): xrandr_name = re.search(", Output (.+)", match[0][0]) if xrandr_name: xrandr_names[len(displays)] = xrandr_name.group(1) display = "%s @ %s, %s, %sx%s" % match[0] if " ".join(value.split()[-2:]) == \ "(Primary Display)": display += u" [PRIMARY]" displays.append(display) self.display_rects.append( wx.Rect(*[int(item) for item in match[0][1:]])) elif arg == "-dcc[:n]": # Chromecast if value: # Note the Chromecast name may be mangled due # to being UTF-8 encoded, but commandline output # will always be decoded to Unicode using the # stdout encoding, which may not be UTF-8 # (e.g. under Windows). We can recover characters # valid in both UTF-8 and stdout encoding # by a re-encode/decode step displays.append("Chromecast %s: %s" % (line[0], safe_unicode(safe_str(value, enc), "UTF-8"))) elif arg == "-dprisma[:host]": # Prisma (via Argyll CMS) # : @ # 141550000000: prisma-0000 @ 172.31.31.162 match = re.findall(".+?: (.+) @ (.+)", value) if len(match): displays.append("Prisma %s: %s @ %s" % (line[0], safe_unicode(safe_str(match[0][0], enc), "UTF-8"), match[0][1])) elif arg == "-c" and enumerate_ports: if ((re.match("/dev(?:/[\w.\-]+)*$", value) or re.match("COM\d+$", value)) and getcfg("skip_legacy_serial_ports")): # Skip all legacy serial ports (this means we # deliberately don't support DTP92 and # Spectrolino, although they may work when # used with a serial to USB adaptor) continue value = value.split(None, 1) if len(value) > 1: value = value[1].split("'", 1)[0].strip("()") else: value = value[0] value = get_canonical_instrument_name(value) instruments.append(value) if test: inames = all_instruments.keys() inames.sort() for iname in inames: iname = get_canonical_instrument_name(iname) if not iname in instruments: instruments.append(iname) if verbose >= 1: safe_print(lang.getstr("success")) if instruments != self.instruments: self.instruments = instruments setcfg("instruments", instruments) if (current_instrument != self.get_instrument_name() and current_instrument in instruments): setcfg("comport.number", instruments.index(current_instrument) + 1) if displays != self._displays: self._displays = list(displays) setcfg("displays", displays) if RDSMM: # Sync with Argyll - needed under Linux to map EDID RDSMM.enumerate_displays() displays = filter(lambda display: not display in non_standard_display_args, displays) self.display_edid = [] self.display_manufacturers = [] self.display_names = [] if sys.platform == "win32": # The ordering will work as long # as Argyll continues using # EnumDisplayMonitors monitors = util_win.get_real_display_devices_info() for i, display in enumerate(displays): if (display.startswith("Chromecast ") or display.startswith("Prisma ")): self.display_edid.append({}) if display.startswith("Prisma "): display_manufacturer = "Q, Inc" else: display_manufacturer = "Google" self.display_manufacturers.append(display_manufacturer) self.display_names.append(display.split(":", 1)[1].strip()) continue display_name = split_display_name(display) # Make sure we have nice descriptions desc = [] if sys.platform == "win32" and i < len(monitors): # Get monitor description using win32api device = util_win.get_active_display_device( monitors[i]["Device"]) if device: desc.append(device.DeviceString.decode(fs_enc, "replace")) # Deal with HiDPI - update monitor rect m_left, m_top, m_right, m_bottom = monitors[i]["Monitor"] m_width = m_right - m_left m_height = m_bottom - m_top self.display_rects[i] = wx.Rect(m_left, m_top, m_width, m_height) is_primary = u" [PRIMARY]" in display display = " @ ".join([display_name, "%i, %i, %ix%i" % (m_left, m_top, m_width, m_height)]) if is_primary: display += u" [PRIMARY]" # Get monitor descriptions from EDID try: # Important: display_name must be given for get_edid # under Mac OS X, but it doesn't hurt to always # include it edid = get_edid(i, display_name) except (EnvironmentError, TypeError, ValueError, WMIError), exception: if isinstance(exception, EnvironmentError): safe_print(exception) edid = {} self.display_edid.append(edid) if edid: manufacturer = edid.get("manufacturer", "").split() monitor = edid.get("monitor_name", edid.get("ascii", str(edid["product_id"] or ""))) if monitor and not monitor in "".join(desc): desc = [monitor] else: manufacturer = [] if desc and desc[-1] not in display: # Only replace the description if it not already # contains the monitor model display = " @".join([" ".join(desc), display.split("@")[-1]]) displays[i] = display self.display_manufacturers.append(" ".join(manufacturer)) self.display_names.append(split_display_name(display)) if self.argyll_version >= [1, 4, 0]: displays.append("Web @ localhost") self.display_edid.append({}) self.display_manufacturers.append("") self.display_names.append("Web") if self.argyll_version >= [1, 6, 0]: displays.append("madVR") self.display_edid.append({}) self.display_manufacturers.append("") self.display_names.append("madVR") # Prisma (via DisplayCAL) displays.append("Prisma") self.display_edid.append({}) self.display_manufacturers.append("Q, Inc") self.display_names.append("Prisma") # Resolve displays.append("Resolve") self.display_edid.append({}) self.display_manufacturers.append("DaVinci") self.display_names.append("Resolve") # Untethered displays.append("Untethered") self.display_edid.append({}) self.display_manufacturers.append("") self.display_names.append("Untethered") # self.displays = displays setcfg("displays", displays) if (current_display_name != config.get_display_name() and current_display_name in self.display_names): setcfg("display.number", self.display_names.index(current_display_name) + 1) # Filter out Prisma (via DisplayCAL), Resolve and Untethered # IMPORTANT: Also make changes to display filtering in # worker.Worker.has_separate_lut_access displays = displays[:-3] if self.argyll_version >= [1, 6, 0]: # Filter out madVR displays = displays[:-1] if self.argyll_version >= [1, 4, 0]: # Filter out Web @ localhost displays = displays[:-1] if check_lut_access: dispwin = get_argyll_util("dispwin") test_cal = get_data_path("test.cal") if not test_cal: safe_print(lang.getstr("file.missing", "test.cal")) tmp = self.create_tempdir() if isinstance(tmp, Exception): safe_print(tmp) tmp = None for i, disp in enumerate(displays): if (disp.startswith("Chromecast ") or disp.startswith("Prisma ") or not test_cal): lut_access.append(None) continue if sys.platform == "darwin": # There's no easy way to check LUT access under # Mac OS X because loading a LUT isn't persistent # unless you run as root. Just assume we have # access to all displays. lut_access.append(True) continue if verbose >= 1: safe_print(lang.getstr("checking_lut_access", (i + 1))) # Save current calibration? if tmp: current_cal = os.path.join(tmp, "current.cal") tmp_cal = current_cal result = self.save_current_video_lut(i + 1, current_cal, silent=True) # Load test.cal result = self.exec_cmd(dispwin, ["-d%s" % (i +1), "-c", test_cal], capture_output=True, skip_scripts=True, silent=True) if isinstance(result, Exception): safe_print(result) elif result is None: lut_access.append(None) continue # Check if LUT == test.cal result = self.exec_cmd(dispwin, ["-d%s" % (i +1), "-V", test_cal], capture_output=True, skip_scripts=True, silent=True) if isinstance(result, Exception): safe_print(result) elif result is None: lut_access.append(None) continue retcode = -1 for line in self.output: if line.find("IS loaded") >= 0: retcode = 0 break # Reset LUT & (re-)load previous cal (if any) if not tmp or not os.path.isfile(current_cal): current_cal = self.get_dispwin_display_profile_argument(i) result = self.exec_cmd(dispwin, ["-d%s" % (i + 1), "-c", current_cal], capture_output=True, skip_scripts=True, silent=True) if isinstance(result, Exception): safe_print(result) if tmp and os.path.isfile(tmp_cal): try: os.remove(tmp_cal) except EnvironmentError, exception: safe_print(exception) lut_access.append(retcode == 0) if verbose >= 1: if retcode == 0: safe_print(lang.getstr("success")) else: safe_print(lang.getstr("failure")) else: lut_access.extend([None] * len(displays)) if self.argyll_version >= [1, 4, 0]: # Web @ localhost lut_access.append(False) if self.argyll_version >= [1, 6, 0]: # madVR lut_access.append(True) # Prisma (via DisplayCAL) lut_access.append(False) # Resolve lut_access.append(False) # Untethered lut_access.append(False) self.lut_access = lut_access elif silent or not check_argyll_bin(): self.clear_argyll_info() def exec_cmd(self, cmd, args=[], capture_output=False, display_output=False, low_contrast=True, skip_scripts=False, silent=False, parent=None, asroot=False, log_output=True, title=appname, shell=False, working_dir=None, dry_run=None, sessionlogfile=None): """ Execute a command. Return value is either True (succeed), False (failed), None (canceled) or an exception. cmd is the full path of the command. args are the arguments, if any. capture_output (if True) swallows any output from the command and sets the 'output' and 'errors' properties of the Worker instance. display_output shows the log after the command. low_contrast (if True) sets low contrast shell colors while the command is run. skip_scripts (if True) skips the creation of shell scripts that allow re-running the command. Note that this is also controlled by a global config option and scripts will only be created if it evaluates to False. silent (if True) skips most output and also most error dialogs (except unexpected failures) parent sets the parent window for auth dialog (if asroot is True). asroot (if True) on Linux runs the command using sudo. log_output (if True) logs any output if capture_output is also set. title = Title for auth dialog (if asroot is True) working_dir = Working directory. If None, will be determined from absulte path of last argument and last argument will be set to only the basename. If False, no working dir will be used and file arguments not changed. """ # If dry_run is explicitly set to False, ignore dry_run config value dry_run = dry_run is not False and (dry_run or getcfg("dry_run")) if not capture_output: capture_output = not sys.stdout.isatty() self.clear_cmd_output() if None in [cmd, args]: if verbose >= 1 and not silent: safe_print(lang.getstr("aborted")) return False self.cmd = cmd cmdname = os.path.splitext(os.path.basename(cmd))[0] self.cmdname = cmdname if not "-?" in args and cmdname == get_argyll_utilname("dispwin"): if "-I" in args or "-U" in args: if "-Sl" in args or "-Sn" in args: # Root is required if installing a profile to a system # location asroot = True elif not ("-s" in args or self.calibration_loading_generally_supported): # Loading/clearing calibration not supported # Don't actually do it, pretend we were successful if "-V" in args: self.output.append("IS loaded") self.retcode = 0 return True if asroot: silent = False measure_cmds = (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread"), get_argyll_utilname("spotread")) process_cmds = (get_argyll_utilname("collink"), get_argyll_utilname("colprof"), get_argyll_utilname("targen")) # Run commands through wexpect.spawn instead of subprocess.Popen if # any of these conditions apply use_pty = args and not "-?" in args and cmdname in measure_cmds + process_cmds self.measure_cmd = not "-?" in args and cmdname in measure_cmds self.use_patterngenerator = (self.measure_cmd and cmdname != get_argyll_utilname("spotread") and (config.get_display_name() == "Resolve" or (config.get_display_name() == "Prisma" and not defaults["patterngenerator.prisma.argyll"]))) use_3dlut_override = (((self.use_patterngenerator and config.get_display_name(None, True) == "Prisma") or (config.get_display_name(None, True) == "madVR" and (sys.platform != "win32" or not getcfg("madtpg.native")))) and cmdname == get_argyll_utilname("dispread") and "-V" in args) if use_3dlut_override: args.remove("-V") working_basename = None if args and args[-1].find(os.path.sep) > -1: working_basename = os.path.basename(args[-1]) if cmdname not in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread"), get_argyll_utilname("colprof"), get_argyll_utilname("targen"), get_argyll_utilname("txt2ti3")): # Last arg is with extension working_basename = os.path.splitext(working_basename)[0] if working_dir is None: working_dir = os.path.dirname(args[-1]) if working_dir is None: working_dir = self.tempdir if working_dir and not os.path.isdir(working_dir): working_dir = None if working_dir and working_dir == self.tempdir: # Get a list of files in the temp directory and their modification # times so we can determine later if anything has changed and we # should keep the files in case of errors for filename in os.listdir(working_dir): self.tmpfiles[filename] = os.stat(os.path.join(working_dir, filename)).st_mtime if (working_basename and working_dir == self.tempdir and not silent and log_output and not dry_run): self.set_sessionlogfile(sessionlogfile, working_basename, working_dir) if not silent or verbose >= 3: self.log("-" * 80) if self.sessionlogfile: safe_print("Session log:", self.sessionlogfile.filename) safe_print("") use_madvr = (cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread"), get_argyll_utilname("dispwin")) and get_arg("-dmadvr", args) and madvr) if use_madvr: # Try to connect to running madTPG or launch a new instance try: if self.madtpg_connect(): # Connected # Check madVR version madvr_version = self.madtpg.get_version() if not madvr_version or madvr_version < madvr.min_version: self.madtpg_disconnect(False) return Error(lang.getstr("madvr.outdated", madvr.min_version)) self.log("Connected to madVR version %i.%i.%i.%i (%s)" % (madvr_version + (self.madtpg.uri, ))) if isinstance(self.madtpg, madvr.MadTPG_Net): # Need to handle calibration clearing/loading/saving # for madVR net-protocol pure python implementation cal = None calfilename = None profile = None ramp = False if cmdname == get_argyll_utilname("dispwin"): if "-c" in args: # Clear calibration self.log("MadTPG_Net clear calibration") ramp = None if "-L" in args: # NOTE: Hmm, profile will be None. It's not # functionality we currently use though. profile = config.get_display_profile() if "-s" in args: # Save calibration. Get from madTPG self.log("MadTPG_Net save calibration:", args[-1]) ramp = self.madtpg.get_device_gamma_ramp() if not ramp: self.madtpg_disconnect(False) return Error("madVR_GetDeviceGammaRamp failed") cal = """CAL KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA """ # Convert ushort_Array_256_Array_3 to dictionary RGB = {} for j in xrange(3): for i in xrange(256): if not i in RGB: RGB[i] = [] RGB[i].append(ramp[j][i] / 65535.0) # Get RGB from dictionary for i, (R, G, B) in RGB.iteritems(): cal += "%f %f %f %f\n" % (i / 255.0, R, G, B) cal += "END_DATA" # Write out .cal file try: with open(args[-1], "w") as calfile: calfile.write(cal) except (IOError, OSError), exception: self.madtpg_disconnect(False) return exception cal = None ramp = False elif working_basename: # .cal/.icc/.icm file to load calfilename = args[-1] elif cmdname == get_argyll_utilname("dispread"): # Check for .cal file to load # NOTE this isn't normally used as we use -K # for madTPG, but is overridable by the user k_arg = get_arg("-k", args, True) if k_arg: calfilename = args[k_arg[0] + 1] else: ramp = None else: # dispcal ramp = None if calfilename: # Load calibration from .cal file or ICC profile self.log("MadTPG_Net load calibration:", calfilename) result = check_file_isfile(calfilename) if isinstance(result, Exception): self.madtpg_disconnect(False) return result if calfilename.lower().endswith(".cal"): # .cal file try: cal = CGATS.CGATS(calfilename) except (IOError, CGATS.CGATSError), exception: self.madtpg_disconnect(False) return exception else: # ICC profile try: profile = ICCP.ICCProfile(calfilename) except (IOError, ICCP.ICCProfileInvalidError), exception: self.madtpg_disconnect(False) return exception if profile: # Load calibration from ICC profile (if present) cal = extract_cal_from_profile(profile, None, False) if not cal: # Linear ramp = None if cal: # Check calibration we're going to load try: cal = verify_cgats(cal, ("RGB_R", "RGB_G", "RGB_B")) if len(cal.DATA) != 256: # Needs to have 256 entries raise CGATSError("%s: %s != 256" % (lang.getstr("calibration"), lang.getstr("number_of_entries"))) except CGATS.CGATSError, exception: self.madtpg_disconnect(False) return exception # Convert calibration to ushort_Array_256_Array_3 ramp = ((ctypes.c_ushort * 256) * 3)() for i in xrange(256): for j, channel in enumerate("RGB"): ramp[j][i] = int(round(cal.DATA[i]["RGB_" + channel] * 65535)) else: ramp = None if (ramp is not False and not self.madtpg.set_device_gamma_ramp(ramp)): self.madtpg_disconnect(False) return Error("madVR_SetDeviceGammaRamp failed") if (isinstance(self.madtpg, madvr.MadTPG_Net) and cmdname == get_argyll_utilname("dispwin")): # For madVR net-protocol pure python implementation # we are now done self.madtpg_disconnect(False) return True if not "-V" in args and not use_3dlut_override: endis = "disable" else: endis = "enable" if not getattr(self.madtpg, endis + "_3dlut")(): self.madtpg_disconnect(False) return Error("madVR_%s3dlut failed" % endis.capitalize()) fullscreen = self.madtpg.is_use_fullscreen_button_pressed() if sys.platform == "win32": # Make sure interactive display adjustment window isn't # concealed by temporarily disabling fullscreen if # needed. This is only a problem in single display # configurations. # Check if we have more than one "real" display. non_virtual_displays = [] for display_no in xrange(len(self.displays)): if not config.is_virtual_display(display_no): non_virtual_displays.append(display_no) if len(non_virtual_displays) == 1: # We only have one "real" display connected if cmdname == get_argyll_utilname("dispcal"): if not ("-m" in args or "-u" in args) and fullscreen: # Disable fullscreen if self.madtpg.set_use_fullscreen_button(False): self.log("Temporarily leaving madTPG " "fullscreen") self.madtpg_previous_fullscreen = fullscreen else: self.log("Warning - couldn't " "temporarily leave madTPG " "fullscreen") elif (getattr(self, "madtpg_previous_fullscreen", None) and cmdname == get_argyll_utilname("dispread") and self.dispread_after_dispcal): # Restore fullscreen if self.madtpg.set_use_fullscreen_button(True): self.log("Restored madTPG fullscreen") self.madtpg_previous_fullscreen = None else: self.log("Warning - couldn't restore " "madTPG fullscreen") self.madtpg_fullscreen = self.madtpg.is_use_fullscreen_button_pressed() if ((not (cmdname == get_argyll_utilname("dispwin") or self.dispread_after_dispcal) or (cmdname == get_argyll_utilname("dispcal") and ("-m" in args or "-u" in args)) or self._detecting_video_levels) and self.madtpg_fullscreen and not self.instrument_on_screen): # Show place instrument on screen message with countdown countdown = 15 # We need to show the progress bar to make OSD visible if not self.madtpg.show_progress_bar(countdown): self.madtpg_disconnect() return Error("madVR_ShowProgressBar failed") self.madtpg_osd = not self.madtpg.is_disable_osd_button_pressed() if not self.madtpg_osd: # Enable OSD if disabled if self.madtpg.set_disable_osd_button(False): self.log("Temporarily enabled madTPG OSD for " "instrument placement countdown") else: self.log("Warning - couldn't temporarily " "enable madTPG OSD") for i in xrange(countdown): if self.subprocess_abort or self.thread_abort: break if not self.madtpg.set_osd_text( lang.getstr("instrument.place_on_screen.madvr", (countdown - i, self.get_instrument_name()))): self.madtpg_disconnect() return Error("madVR_SetOsdText failed") ts = time() if i % 2 == 0: # Flash test area red self.madtpg.show_rgb(.8, 0, 0) else: self.madtpg.show_rgb(.15, .15, .15) delay = time() - ts if delay < 1: sleep(1 - delay) self.instrument_on_screen = True if not self.madtpg_osd: # Disable OSD if self.madtpg.set_disable_osd_button(True): self.log("Restored madTPG 'Disable OSD' button " "state") self.madtpg_osd = None else: self.log("Warning - could not restore madTPG " "'Disable OSD' button state") # Get pattern config patternconfig = self.madtpg.get_pattern_config() if (not patternconfig or not isinstance(patternconfig, tuple) or len(patternconfig) != 4): self.madtpg_disconnect() return Error("madVR_GetPatternConfig failed") self.log("Pattern area: %i%%" % patternconfig[0]) self.log("Background level: %i%%" % patternconfig[1]) self.log("Background mode: %s" % {0: "Constant", 1: "APL gamma", 2: "APL linear"}.get(patternconfig[2], patternconfig[2])) self.log("Border width: %i pixels" % patternconfig[3]) if isinstance(self.madtpg, madvr.MadTPG_Net): args.remove("-dmadvr") args.insert(0, "-P1,1,0.01") else: # Only if using native madTPG implementation! if not get_arg("-P", args): # Setup patch size to match pattern config args.insert(0, "-P0.5,0.5,%f" % math.sqrt(patternconfig[0])) if not patternconfig[1] and self.argyll_version >= [1, 7]: # Setup black background if background level is zero. # Only do this for Argyll >= 1.7 to prevent messing # with pattern area when Argyll 1.6.x is used args.insert(0, "-F") # Disconnect self.madtpg_disconnect(False) self.log("") else: return Error(lang.getstr("madtpg.launch.failure")) except Exception, exception: if isinstance(getattr(self, "madtpg", None), madvr.MadTPG_Net): self.madtpg_disconnect() return exception # Use mad* net protocol pure python implementation use_madnet = use_madvr and isinstance(self.madtpg, madvr.MadTPG_Net) # Use mad* net protocol pure python implementation as pattern generator self.use_madnet_tpg = use_madnet and cmdname != get_argyll_utilname("dispwin") if self.use_patterngenerator or self.use_madnet_tpg: # Run a dummy command so we can grab the RGB numbers for # the pattern generator from the output carg = get_arg("-C", args, True) if carg: index = min(carg[0] + 1, len(args) - 1) args[index] += " && " else: args.insert(0, "-C") args.insert(1, "") index = 1 python, pythonpath = get_python_and_pythonpath() script_dir = working_dir pythonscript = """from __future__ import print_function import os, sys, time if sys.platform != "win32": print(*["\\nCurrent RGB"] + sys.argv[1:]) abortfilename = os.path.join(%r, ".abort") okfilename = os.path.join(%r, ".ok") while 1: if os.path.isfile(abortfilename): break if os.path.isfile(okfilename): try: os.remove(okfilename) except OSError, e: pass else: break time.sleep(0.001) """ % (script_dir, script_dir) waitfilename = os.path.join(script_dir, ".wait") if sys.platform == "win32": # Avoid problems with encoding python = win32api.GetShortPathName(python) for i, path in enumerate(pythonpath): if os.path.exists(path): pythonpath[i] = win32api.GetShortPathName(path) # Write out .wait.py file scriptfilename = waitfilename + ".py" with open(scriptfilename, "w") as scriptfile: scriptfile.write(pythonscript) scriptfilename = win32api.GetShortPathName(scriptfilename) # Write out .wait.cmd file with open(waitfilename + ".cmd", "w") as waitfile: waitfile.write('@echo off\n') waitfile.write('echo.\n') waitfile.write('echo Current RGB %*\n') waitfile.write('set "PYTHONPATH=%s"\n' % safe_str(os.pathsep.join(pythonpath), enc)) waitfile.write('"%s" -S "%s" %%*\n' % (safe_str(python, enc), safe_str(scriptfilename, enc))) args[index] += waitfilename else: # Write out .wait file with open(waitfilename, "w") as waitfile: waitfile.write('#!/usr/bin/env python\n') waitfile.write(pythonscript) os.chmod(waitfilename, 0755) args[index] += '"%s" ./%s' % (strtr(safe_str(python), {'"': r'\"', "$": r"\$"}), os.path.basename(waitfilename)) if verbose >= 1 or not silent: if not silent or verbose >= 3: if (not silent and dry_run and not self.cmdrun): safe_print(lang.getstr("dry_run")) safe_print("") self.cmdrun = True if working_dir: self.log(lang.getstr("working_dir")) indent = " " for name in working_dir.split(os.path.sep): self.log(textwrap.fill(name + os.path.sep, 80, expand_tabs=False, replace_whitespace=False, initial_indent=indent, subsequent_indent=indent)) indent += " " self.log("") self.log(lang.getstr("commandline")) printcmdline(cmd, args, fn=self.log, cwd=working_dir) self.log("") if not silent and dry_run: if not self.lastcmdname or self.lastcmdname == cmdname: safe_print(lang.getstr("dry_run.end")) if self.owner and hasattr(self.owner, "infoframe_toggle_handler"): wx.CallAfter(self.owner.infoframe_toggle_handler, show=True) if use_madnet: self.madtpg_disconnect() return UnloggedInfo(lang.getstr("dry_run.info")) cmdline = [cmd] + args for i, item in enumerate(cmdline): if i > 0 and item.find(os.path.sep) > -1: if sys.platform == "win32": item = make_win32_compatible_long_path(item) if (re.search("[^\x20-\x7e]", os.path.basename(item)) and os.path.exists(item) and i < len(cmdline) - 1): # Avoid problems with encoding under Windows by using # GetShortPathName, but be careful with the last # parameter which may be used as the basename for the # output file item = win32api.GetShortPathName(item) if working_dir and os.path.dirname(cmdline[i]) == working_dir: # Strip the path from all items in the working dir item = os.path.basename(item) if item != cmdline[i]: cmdline[i] = item if (working_dir and sys.platform == "win32" and re.search("[^\x20-\x7e]", working_dir) and os.path.exists(working_dir)): # Avoid problems with encoding working_dir = win32api.GetShortPathName(working_dir) sudo = None if asroot and ((sys.platform != "win32" and os.geteuid() != 0) or (sys.platform == "win32" and sys.getwindowsversion() >= (6, ))): if sys.platform == "win32": # Vista and later pass else: if not self.auth_timestamp: if hasattr(self, "thread") and self.thread.isAlive(): # Careful: We can only show the auth dialog if running # in the main GUI thread! if use_madnet: self.madtpg_disconnect() return Error("Authentication requested in non-GUI thread") result = self.authenticate(cmd, title, parent) if result is False: if use_madnet: self.madtpg_disconnect() return None elif isinstance(result, Exception): if use_madnet: self.madtpg_disconnect() return result sudo = unicode(self.sudo) if sudo: if not use_pty: # Sudo may need a tty depending on configuration use_pty = True cmdline.insert(0, sudo) if (cmdname == get_argyll_utilname("dispwin") and sys.platform != "darwin" and self.sudo.availoptions.get("E") and getcfg("sudo.preserve_environment")): # Preserve environment so $DISPLAY is set cmdline.insert(1, "-E") if not use_pty: cmdline.insert(1, "-S") # Set empty string as password prompt to hide it from stderr cmdline.insert(1, "") cmdline.insert(1, "-p") else: # Use a designated prompt cmdline.insert(1, "Password:") cmdline.insert(1, "-p") if (working_dir and working_basename and not skip_scripts and not getcfg("skip_scripts")): try: cmdfilename = os.path.join(working_dir, working_basename + "." + cmdname + script_ext) allfilename = os.path.join(working_dir, working_basename + ".all" + script_ext) first = not os.path.exists(allfilename) last = cmdname == get_argyll_utilname("dispwin") cmdfile = open(cmdfilename, "w") allfile = open(allfilename, "a") cmdfiles = Files((cmdfile, allfile)) if first: context = cmdfiles else: context = cmdfile if sys.platform == "win32": context.write("@echo off\n") context.write(('PATH %s;%%PATH%%\n' % os.path.dirname(cmd)).encode(enc, "safe_asciize")) cmdfiles.write('pushd "%~dp0"\n'.encode(enc, "safe_asciize")) if cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread")): cmdfiles.write("color 07\n") else: context.write(('PATH=%s:$PATH\n' % os.path.dirname(cmd)).encode(enc, "safe_asciize")) if sys.platform == "darwin" and config.mac_create_app: cmdfiles.write('pushd "`dirname ' '\\"$0\\"`/../../.."\n') else: cmdfiles.write('pushd "`dirname \\"$0\\"`"\n') if cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread")) and \ sys.platform != "darwin": cmdfiles.write('echo -e "\\033[40;2;37m" && clear\n') os.chmod(cmdfilename, 0755) os.chmod(allfilename, 0755) cmdfiles.write(u" ".join(quote_args(cmdline)).replace(cmd, cmdname).encode(enc, "safe_asciize") + "\n") if sys.platform == "win32": cmdfiles.write("set exitcode=%errorlevel%\n") if cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread")): # Reset to default commandline shell colors cmdfiles.write("color\n") cmdfiles.write("popd\n") cmdfiles.write("if not %exitcode%==0 exit /B %exitcode%\n") else: cmdfiles.write("exitcode=$?\n") if cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread")) and \ sys.platform != "darwin": # reset to default commandline shell colors cmdfiles.write('echo -e "\\033[0m" && clear\n') cmdfiles.write("popd\n") cmdfiles.write("if [ $exitcode -ne 0 ]; " "then exit $exitcode; fi\n") cmdfiles.close() if sys.platform == "darwin": if config.mac_create_app: # Could also use .command file directly, but using # applescript allows giving focus to the terminal # window automatically after a delay script = mac_terminal_do_script() + \ mac_terminal_set_colors(do=False) + \ ['-e', 'set shellscript to quoted form of ' '(POSIX path of (path to resource ' '"main.command"))', '-e', 'tell app ' '"Terminal"', '-e', 'do script shellscript ' 'in first window', '-e', 'delay 3', '-e', 'activate', '-e', 'end tell', '-o'] # Part 1: "cmdfile" appfilename = os.path.join(working_dir, working_basename + "." + cmdname + ".app").encode(fs_enc) cmdargs = ['osacompile'] + script + [appfilename] p = sp.Popen(cmdargs, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) p.communicate() shutil.move(cmdfilename, appfilename + "/Contents/Resources/main.command") os.chmod(appfilename + "/Contents/Resources/main.command", 0755) # Part 2: "allfile" appfilename = os.path.join( working_dir, working_basename + ".all.app") cmdargs = ['osacompile'] + script + [appfilename] p = sp.Popen(cmdargs, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) p.communicate() shutil.copyfile(allfilename, appfilename + "/Contents/Resources/main.command") os.chmod(appfilename + "/Contents/Resources/main.command", 0755) if last: os.remove(allfilename) except Exception, exception: self.log("Warning - error during shell script creation:", safe_unicode(exception)) cmdline = [safe_str(arg, fs_enc) for arg in cmdline] working_dir = None if not working_dir else working_dir.encode(fs_enc) try: if not self.measure_cmd and self.argyll_version >= [1, 2]: # Argyll tools will no longer respond to keys if debug: self.log("[D] Setting ARGYLL_NOT_INTERACTIVE 1") os.environ["ARGYLL_NOT_INTERACTIVE"] = "1" elif "ARGYLL_NOT_INTERACTIVE" in os.environ: del os.environ["ARGYLL_NOT_INTERACTIVE"] if debug: self.log("[D] argyll_version", self.argyll_version) self.log("[D] ARGYLL_NOT_INTERACTIVE", os.environ.get("ARGYLL_NOT_INTERACTIVE")) if self.measure_cmd: if isinstance(self.measurement_sound, audio.DummySound): self._init_sounds(dummy=False) for name, version in (("MIN_DISPLAY_UPDATE_DELAY_MS", [1, 5]), ("DISPLAY_SETTLE_TIME_MULT", [1, 7])): backup = os.getenv("ARGYLL_%s_BACKUP" % name) value = None if (getcfg("measure.override_%s" % name.lower()) and self.argyll_version >= version): if backup is None: # Backup current value if any current = os.getenv("ARGYLL_%s" % name, "") os.environ["ARGYLL_%s_BACKUP" % name] = current else: current = backup if current: self.log("%s: Overriding ARGYLL_%s %s" % (appname, name, current)) # Override value = str(getcfg("measure.%s" % name.lower())) self.log("%s: Setting ARGYLL_%s %s" % (appname, name, value)) elif backup is not None: value = backup del os.environ["ARGYLL_%s_BACKUP" % name] if value: self.log("%s: Restoring ARGYLL_%s %s" % (appname, name, value)) elif "ARGYLL_%s" % name in os.environ: del os.environ["ARGYLL_%s" % name] elif "ARGYLL_%s" % name in os.environ: self.log("%s: ARGYLL_%s" % (appname, name), os.getenv("ARGYLL_%s" % name)) if value: os.environ["ARGYLL_%s" % name] = value elif cmdname in (get_argyll_utilname("iccgamut"), get_argyll_utilname("tiffgamut"), get_argyll_utilname("viewgam")): os.environ["ARGYLL_3D_DISP_FORMAT"] = "VRML" if sys.platform not in ("darwin", "win32"): os.environ["ENABLE_COLORHUG"] = "1" if sys.platform == "win32": startupinfo = sp.STARTUPINFO() startupinfo.dwFlags |= sp.STARTF_USESHOWWINDOW startupinfo.wShowWindow = sp.SW_HIDE else: startupinfo = None if not use_pty: data_encoding = enc if silent: stderr = sp.STDOUT else: stderr = tempfile.SpooledTemporaryFile() if capture_output: stdout = tempfile.SpooledTemporaryFile() elif sys.stdout.isatty(): stdout = sys.stdout else: stdout = sp.PIPE if sudo: stdin = tempfile.SpooledTemporaryFile() stdin.write(self.pwd.encode(enc, "replace") + os.linesep) stdin.seek(0) else: stdin = sp.PIPE else: data_encoding = self.pty_encoding kwargs = dict(timeout=20, cwd=working_dir, env=os.environ) if sys.platform == "win32": kwargs["codepage"] = windll.kernel32.GetACP() # As Windows' console always hard wraps at the # rightmost column, increase the buffer width kwargs["columns"] = 160 stderr = None stdout = EncodedWriter(StringIO(), None, data_encoding) logfiles = [] if (hasattr(self, "thread") and self.thread.isAlive() and self.interactive and getattr(self, "terminal", None)): logfiles.append(FilteredStream(self.terminal, discard="", triggers=self.triggers)) if log_output: linebuffered_logfiles = [] if sys.stdout.isatty(): linebuffered_logfiles.append(safe_print) else: linebuffered_logfiles.append(log) if self.sessionlogfile: linebuffered_logfiles.append(self.sessionlogfile) logfiles.append(LineBufferedStream( FilteredStream(Files(linebuffered_logfiles), data_encoding, discard="", linesep_in="\n", triggers=[]))) logfiles.append(stdout) if (hasattr(self, "thread") and self.thread.isAlive() and cmdname in measure_cmds + process_cmds): logfiles.extend([self.recent, self.lastmsg, self]) logfiles = Files(logfiles) if self.use_patterngenerator: pgname = config.get_display_name() self.setup_patterngenerator(logfiles) if not hasattr(self.patterngenerator, "conn"): # Wait for connection - blocking self.patterngenerator.wait() if hasattr(self.patterngenerator, "conn"): self.patterngenerator_send((.5, ) * 3) else: # User aborted before connection was established return False if pgname == "Prisma": x, y, w, h, size = get_pattern_geometry() if use_3dlut_override: self.patterngenerator.enable_processing(size=size * 100) else: self.patterngenerator.disable_processing(size=size * 100) tries = 1 while tries > 0: if self.subprocess_abort or self.thread_abort: break if use_pty: if self.argyll_version >= [1, 2] and USE_WPOPEN and \ os.environ.get("ARGYLL_NOT_INTERACTIVE"): self.subprocess = WPopen(cmdline, stdin=sp.PIPE, stdout=tempfile.SpooledTemporaryFile(), stderr=sp.STDOUT, shell=shell, cwd=working_dir, startupinfo=startupinfo) else: # Minimum Windows version: XP or Server 2003 if (sys.platform == "win32" and sys.getwindowsversion() < (5, 1)): raise Error(lang.getstr("windows.version.unsupported")) try: self.subprocess = wexpect.spawn(cmdline[0], cmdline[1:], **kwargs) except wexpect.ExceptionPexpect, exception: self.retcode = -1 raise Error(safe_unicode(exception)) if debug >= 9 or (test and not "-?" in args): self.subprocess.interact() self.subprocess.logfile_read = logfiles if self.measure_cmd: keyhit_strs = [" or Q to ", "8\) Exit"] patterns = keyhit_strs + ["Current", r" \d+ of \d+"] self.log("%s: Starting interaction with subprocess" % appname) else: patterns = [] self.log("%s: Waiting for EOF" % appname) loop = 0 pwdsent = False authfailed = False eof = False while 1: if loop < 1 and sudo: curpatterns = ["Password:"] + patterns else: curpatterns = patterns # NOTE: Using a timeout of None can block indefinitely # and prevent expect() from ever returning! self.subprocess.expect(curpatterns + [wexpect.EOF, wexpect.TIMEOUT], timeout=1) if self.subprocess.after is wexpect.EOF: self.log("%s: Reached EOF (OK)" % appname) break elif self.subprocess.after is wexpect.TIMEOUT: if not self.subprocess.isalive(): self.log("%s: Subprocess no longer alive (timeout)" % appname) if eof: break eof = True continue elif (self.subprocess.after == "Password:" and loop < 1 and sudo): if pwdsent: self.subprocess.sendcontrol("C") authfailed = True self.auth_timestamp = 0 else: self._safe_send(self.pwd.encode(enc, "replace") + os.linesep, obfuscate=True) pwdsent = True if not self.subprocess.isalive(): break continue elif self.measure_cmd: if filter(lambda keyhit_str: re.search(keyhit_str, self.subprocess.after), keyhit_strs): # Wait for the keypress self.log("%s: Waiting for send buffer" % appname) while not self.send_buffer: if not self.subprocess.isalive(): self.log("%s: Subprocess no longer alive (unknown reason)" % appname) break sleep(.05) if (self.send_buffer and self.subprocess.isalive()): self.log("%s: Sending buffer: %r" % (appname, self.send_buffer)) self._safe_send(self.send_buffer) self.send_buffer = None if not self.subprocess.isalive(): break loop += 1 # We need to call isalive() to set the exitstatus. # We can't use wait() because it might block in the # case of a timeout if self.subprocess.isalive(): self.log("%s: Checking subprocess status" % appname) while self.subprocess.isalive(): sleep(.1) self.log("%s: Subprocess no longer alive (OK)" % appname) self.retcode = self.subprocess.exitstatus if authfailed: raise Error(lang.getstr("auth.failed")) else: try: if (asroot and sys.platform == "win32" and sys.getwindowsversion() >= (6, )): p = run_as_admin(cmd, args, close_process=False, show=False) while not self.subprocess_abort: # Wait for subprocess to exit self.retcode = win32event.WaitForSingleObject(p["hProcess"], 50) if not self.retcode: break p["hProcess"].Close() return self.retcode == 0 else: self.subprocess = sp.Popen(cmdline, stdin=stdin, stdout=stdout, stderr=stderr, shell=shell, cwd=working_dir, startupinfo=startupinfo) except Exception, exception: self.retcode = -1 raise Error(safe_unicode(exception)) self.retcode = self.subprocess.wait() if stdin != sp.PIPE and not getattr(stdin, "closed", True): stdin.close() if self.is_working() and self.subprocess_abort and \ self.retcode == 0: self.retcode = -1 self.subprocess = None tries -= 1 if not silent and stderr: stderr.seek(0) errors = stderr.readlines() if not capture_output or stderr is not stdout: stderr.close() if len(errors): for line in errors: if "Instrument Access Failed" in line and \ "-N" in cmdline[:-1]: cmdline.remove("-N") tries = 1 break if line.strip() and \ line.find("User Aborted") < 0 and \ line.find("XRandR 1.2 is faulty - falling back " "to older extensions") < 0: self.errors.append(line.decode(data_encoding, "replace")) if tries > 0 and not use_pty: stderr = tempfile.SpooledTemporaryFile() if capture_output or use_pty: stdout.seek(0) self.output = [re.sub("^\.{4,}\s*$", "", line.decode(data_encoding, "replace")) for line in stdout.readlines()] stdout.close() if len(self.output) and log_output: if not use_pty: self.log("".join(self.output).strip()) if display_output and self.owner and \ hasattr(self.owner, "infoframe_toggle_handler"): wx.CallAfter(self.owner.infoframe_toggle_handler, show=True) if tries > 0 and not use_pty: stdout = tempfile.SpooledTemporaryFile() if not silent and len(self.errors): errstr = "".join(self.errors).strip() self.log(errstr) except (Error, socket.error, EnvironmentError, RuntimeError), exception: return exception except Exception, exception: if debug: self.log('[D] working_dir:', working_dir) errmsg = (" ".join(cmdline).decode(fs_enc) + "\n" + safe_unicode(traceback.format_exc())) self.retcode = -1 return Error(errmsg) finally: if (sudo and cmdname not in ("chown", get_argyll_utilname("dispwin")) and working_dir and working_dir == self.tempdir and os.listdir(working_dir)): # We need to take ownership of any files created by commands # run via sudo otherwise we cannot move or remove them from # the temporary directory! errors = self.errors output = self.output retcode = self.retcode self.exec_cmd("chown", ["-R", getpass.getuser().decode(fs_enc), working_dir], capture_output=capture_output, skip_scripts=True, asroot=True) self.errors = errors self.output = output self.retcode = retcode if self.patterngenerator: if hasattr(self.patterngenerator, "conn"): try: if config.get_display_name() == "Resolve": # Send fullscreen black to prevent plasma burn-in try: self.patterngenerator.send((0, ) * 3, x=0, y=0, w=1, h=1) except socket.error: pass else: self.patterngenerator.disconnect_client() except Exception, exception: self.log(exception) if hasattr(self, "madtpg"): self.madtpg_disconnect() if debug and not silent: self.log("*** Returncode:", self.retcode) if self.retcode != 0: if use_pty and verbose >= 1 and not silent: self.log(lang.getstr("aborted")) if use_pty and len(self.output): errmsg = None for i, line in enumerate(self.output): if "Calibrate failed with 'User hit Abort Key' (No device error)" in line: break if ((": Error" in line and not "failed with 'User Aborted'" in line and not "returned error code 1" in line) or (line.startswith("Failed to") and not "Failed to meet target" in line) or ("Requested ambient light capability" in line and len(self.output) == i + 2) or ("Diagnostic:" in line and (len(self.output) == i + 1 or self.output[i + 1].startswith("usage:"))) or "communications failure" in line.lower()): # "returned error code 1" == user aborted if (sys.platform == "win32" and ("config 1 failed (Operation not supported or " "unimplemented on this platform) (Permissions ?)") in line): self.output.insert(i, lang.getstr("argyll.instrument.driver.missing") + "\n\n" + lang.getstr("argyll.error.detail") + " ") if "Diagnostic:" in line: errmsg = line else: errmsg = "".join(self.output[i:]) startpos = errmsg.find(": Error") if startpos > -1: errmsg = errmsg[startpos + 2:] if errmsg: return UnloggedError(errmsg.strip()) if self.exec_cmd_returnvalue is not None: return self.exec_cmd_returnvalue return self.retcode == 0 def flush(self): pass def _generic_consumer(self, delayedResult, consumer, continue_next, *args, **kwargs): # consumer must accept result as first arg result = None exception = None try: result = delayedResult.get() except Exception, exception: if (exception.__class__ is Exception and exception.args and exception.args[0] == "aborted"): # Special case - aborted result = False else: if hasattr(exception, "originalTraceback"): self.log(exception.originalTraceback) else: self.log(traceback.format_exc()) result = UnloggedError(safe_str(exception)) if self.progress_start_timer.IsRunning(): self.progress_start_timer.Stop() self.finished = True if not continue_next or isinstance(result, Exception) or not result: self.stop_progress() self.subprocess_abort = False self.thread_abort = False self.recent.clear() self.lastmsg.clear() if self.thread.isAlive(): # Consumer may check if thread is still alive. Technically # it shouldn't be at that point when using CallAfter, but e.g. on # OS X there seems to be overlap with the thread counting as # 'alive' even though it already exited self.thread.join() wx.CallAfter(consumer, result, *args, **kwargs) def generate_A2B0(self, profile, clutres=None, logfile=None): # Lab cLUT is currently not implemented and should NOT be used! if profile.connectionColorSpace != "XYZ": raise Error(lang.getstr("profile.unsupported", (profile.connectionColorSpace, profile.connectionColorSpace))) if logfile: safe_print("-" * 80) logfile.write("Creating perceptual A2B0 table\n") logfile.write("\n") # Make new A2B0 A2B0 = ICCP.LUT16Type(None, "A2B0", profile) # Matrix (identity) A2B0.matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # Input / output curves (linear) A2B0.input = [] A2B0.output = [] channel = [] for j in xrange(256): channel.append(j * 257) for table in (A2B0.input, A2B0.output): for i in xrange(3): table.append(channel) # cLUT if logfile: logfile.write("Generating A2B0 table lookup input values...\n") A2B0.clut = [] if not clutres: clutres = len(profile.tags.A2B0.clut[0]) if logfile: logfile.write("cLUT grid res: %i\n" % clutres) vrange = xrange(clutres) step = 1.0 / (clutres - 1.0) idata = [] for R in vrange: for G in vrange: for B in vrange: idata.append([v * step for v in (R, G, B)]) if logfile: logfile.write("Looking up input values through A2B0 table...\n") odata = self.xicclu(profile, idata, pcs="x", logfile=logfile) numrows = len(odata) if numrows != clutres ** 3: raise ValueError("Number of cLUT entries (%s) exceeds cLUT res " "maximum (%s^3 = %s)" % (numrows, clutres, clutres ** 3)) XYZbp = list(odata[0]) XYZwp = list(odata[-1]) if logfile: logfile.write("Filling cLUT...\n") for i, (X, Y, Z) in enumerate(odata): if i % clutres == 0: if self.thread_abort: raise Info(lang.getstr("aborted")) A2B0.clut.append([]) if logfile: logfile.write("\r%i%%" % round(i / (numrows - 1.0) * 100)) # Apply black point compensation XYZ = colormath.blend_blackpoint(X, Y, Z, XYZbp) XYZ = [v / XYZwp[1] for v in XYZ] A2B0.clut[-1].append([max(v * 32768, 0) for v in XYZ]) if logfile: logfile.write("\n") profile.tags.A2B0 = A2B0 return True def generate_B2A_from_inverse_table(self, profile, clutres=None, source="A2B", tableno=None, bpc=False, smooth=True, rgb_space=None, logfile=None, filename=None, only_input_curves=False): """ Generate a profile's B2A table by inverting the A2B table (default A2B1 or A2B0) It is also poosible to re-generate a B2A table by interpolating the B2A table itself. """ if tableno is None: if "A2B1" in profile.tags: tableno = 1 else: tableno = 0 if not clutres: if "B2A%i" % tableno in profile.tags: tablename = "B2A%i" % tableno else: tablename = "A2B%i" % tableno clutres = len(profile.tags[tablename].clut[0]) if source == "B2A" and clutres > 23: # B2A interpolation is smoothest when used with a lower cLUT res clutres = 23 if logfile: if source == "A2B": msg = ("Generating B2A%i table by inverting A2B%i table\n" % (tableno, tableno)) else: msg = "Re-generating B2A%i table by interpolation\n" % tableno logfile.write(msg) logfile.write("\n") # Note that intent 0 will be colorimetric if no other tables are # present intent = {0: "p", 1: "r", 2: "s"}[tableno] # Lookup RGB -> XYZ for primaries, black- and white point idata = [[0, 0, 0], [1, 1, 1], [1, 0, 0], [0, 1, 0], [0, 0, 1]] direction = {"A2B": "f", "B2A": "ib"}[source] odata = self.xicclu(profile, idata, intent, direction, pcs="x") # Scale to Y = 1 XYZwp_abs = odata[1] XYZwpY = odata[1][1] odata = [[n / XYZwpY for n in v] for v in odata] XYZbp = odata[0] XYZwp = odata[1] XYZr = odata[2] XYZg = odata[3] XYZb = odata[4] # Sanity check whitepoint if (round(XYZwp[0], 3) != .964 or round(XYZwp[1], 3) != 1 or round(XYZwp[2], 3) != .825): raise Error("Argyll CMS xicclu: Invalid white XYZ: " "%.4f %.4f %.4f" % tuple(XYZwp_abs)) # Get the primaries XYZrgb = [XYZr, XYZg, XYZb] # Sanity check primaries: # Red Y, Z shall not be higher than X # Green X, Z shall not be higher than Y # Blue X, Y shall not be higher than Z for i, XYZ in enumerate(XYZrgb): for j, v in enumerate(XYZ): if v > XYZ[i]: raise Error("xicclu: Invalid primary %s XYZ: " "%.4f %.4f %.4f" % (("RGB"[i], ) + tuple(XYZ))) if logfile: logfile.write("Black XYZ: %.4f %.4f %.4f\n" % tuple(XYZbp)) logfile.write("White XYZ: %.4f %.4f %.4f\n" % tuple(XYZwp)) for i in xrange(3): logfile.write("%s XYZ: %.4f %.4f %.4f\n" % (("RGB"[i], ) + tuple(XYZrgb[i]))) # Prepare input PCS values if logfile: logfile.write("Generating input curve PCS values...\n") idata = [] numentries = 4096 maxval = numentries - 1.0 vrange = xrange(numentries) Lbp, abp, bbp = colormath.XYZ2Lab(*[v * 100 for v in XYZbp]) # Method to determine device <-> PCS neutral axis relationship # 0: L* (a*=b*=0) -> RGB # 1: As method 0, but blend a* b* to blackpoint hue # 2: R=G=B -> PCS # 3: As method 0, but blend a* b* to blackpoint hue in XYZ (BPC) # Method 0 and 1 result in lowest invprofcheck dE2k, with method 1 # having a slight edge due to more accurately encoding the blackpoint method = 1 if method != 2: for i in vrange: L, a, b = i / maxval * 100, 0, 0 if method in (1, 3) and not bpc and XYZbp != [0, 0, 0]: # Blend to blackpoint hue if method == 1: vv = (L - Lbp) / (100.0 - Lbp) # 0 at bp, 1 at wp vv = 1.0 - vv if vv < 0.0: vv = 0.0 elif vv > 1.0: vv = 1.0 vv = math.pow(vv, 40.0) a += vv * abp b += vv * bbp else: X, Y, Z = colormath.Lab2XYZ(L, a, b) XYZ = colormath.blend_blackpoint(X, Y, Z, None, XYZbp) a, b = colormath.XYZ2Lab(*[v * 100 for v in XYZ])[1:] idata.append((L, a, b)) pcs = profile.connectionColorSpace[0].lower() if source == "B2A": # NOTE: # Argyll's B2A tables are slightly inaccurate: # 0 0 0 PCS -> RGB may give RGB levels > 0 (it should clip # instead). Inversely, 0 0 0 RGB -> PCS (through inverted B2A) # will return PCS values that are too low or zero (ie. not the # black point as expected) # TODO: How to deal with this? pass if method == 2: # lookup RGB -> XYZ values through profile using xicclu to get TRC odata = [] if not bpc: numentries -= 1 maxval -= 1 for i in xrange(numentries): odata.append([i / maxval] * 3) idata = self.xicclu(profile, odata, intent, {"A2B": "f", "B2A": "ib"}[source], pcs="x") if not bpc: numentries += 1 maxval += 1 idata.insert(0, [0, 0, 0]) odata.insert(0, [0, 0, 0]) wY = idata[-1][1] oXYZ = idata = [[n / wY for n in v] for v in idata] D50 = colormath.get_whitepoint("D50") fpL = [colormath.XYZ2Lab(*v + [D50])[0] for v in oXYZ] else: oXYZ = [colormath.Lab2XYZ(*v) for v in idata] fpL = [v[0] for v in idata] fpX = [v[0] for v in oXYZ] fpY = [v[1] for v in oXYZ] fpZ = [v[2] for v in oXYZ] if method != 2 and bpc and XYZbp != [0, 0, 0]: if logfile: logfile.write("Applying BPC to input curve PCS values...\n") for i, (L, a, b) in enumerate(idata): X, Y, Z = colormath.Lab2XYZ(L, a, b) X, Y, Z = colormath.blend_blackpoint(X, Y, Z, None, XYZbp) idata[i] = colormath.XYZ2Lab(X * 100, Y * 100, Z * 100) if logfile: logfile.write("Looking up input curve RGB values...\n") direction = {"A2B": "if", "B2A": "b"}[source] if method != 2: # Lookup Lab -> RGB values through profile using xicclu to get TRC odata = self.xicclu(profile, idata, intent, direction, pcs="l", get_clip=True) # Deal with values that got clipped (below black as well as white) do_low_clip = True for i, values in enumerate(odata): if values[3] is True or i == 0: if do_low_clip and (i / maxval * 100 < Lbp or i == 0): # Set to black self.log("Setting curve entry #%i (%.6f %.6f %.6f) to " "black because it got clipped" % ((i, ) + tuple(values[:3]))) values[:] = [0.0, 0.0, 0.0] elif (i == maxval and [round(v, 4) for v in values[:3]] == [1, 1, 1]): # Set to white self.log("Setting curve entry #%i (%.6f %.6f %.6f) to " "white because it got clipped" % ((i, ) + tuple(values[:3]))) values[:] = [1.0, 1.0, 1.0] else: # First non-clipping value disables low clipping do_low_clip = False if len(values) > 3: values.pop() # Sanity check white if (round(odata[-1][0], 3) != 1 or round(odata[-1][1], 3) != 1 or round(odata[-1][2], 3) != 1): wrgb_warning = ("Warning: xicclu: Suspicious white " "RGB: %.4f %.4f %.4f\n" % tuple(odata[-1])) if logfile: logfile.write(wrgb_warning) else: safe_print(wrgb_warning) xpR = [v[0] for v in odata] xpG = [v[1] for v in odata] xpB = [v[2] for v in odata] # Initialize B2A if only_input_curves: # Use existing B2A table itable = profile.tags["B2A%i" % tableno] else: # Create new B2A table itable = ICCP.LUT16Type(None, "B2A%i" % tableno, profile) use_cam_clipping = True # Setup matrix scale = 1 + (32767 / 32768.0) m3 = colormath.Matrix3x3(((scale, 0, 0), (0, scale, 0), (0, 0, scale))) if only_input_curves: # Use existing matrix m2 = itable.matrix * m3.inverted() elif profile.connectionColorSpace == "XYZ": # Use a matrix that scales the profile colorspace into the XYZ # encoding range, to make optimal use of the cLUT grid points xyYrgb = [colormath.XYZ2xyY(*XYZ) for XYZ in XYZrgb] area1 = 0.5 * abs(sum(x0 * y1 - x1 * y0 for ((x0, y0, Y0), (x1, y1, Y1)) in zip(xyYrgb, xyYrgb[1:] + [xyYrgb[0]]))) if logfile: logfile.write("Setting up matrix\n") matrices = [] # RGB spaces used as PCS candidates. # Six synthetic RGB spaces that are large enough to encompass # display gamuts (except the LaserVue one) found on # http://www.tftcentral.co.uk/articles/pointers_gamut.htm # aswell as a selection of around two dozen profiles from openSUSE # ICC Profile Taxi database aswell as other user contributions rgb_spaces = [] rgb = [("R", (1.0, 0.0, 0.0)), ("G", (0.0, 1.0, 0.0)), ("B", (0.0, 0.0, 1.0))] # Add matrix from just white + 50% gray + black + primaries # as first entry ##outname = os.path.splitext(profile.fileName)[0] ##if not os.path.isfile(outname + ".ti3"): ##if isinstance(profile.tags.get("targ"), ICCP.Text): ##with open(outname + ".ti3", "wb") as ti3: ##ti3.write(profile.tags.targ) ##else: ##ti1name = "ti1/d3-e4-s2-g28-m0-b0-f0.ti1" ##ti1 = get_data_path(ti1name) ##if not ti1: ##raise Error(lang.getstr("file.missing", ti1name)) ##ti1, ti3, gray = self.ti1_lookup_to_ti3(ti1, profile, ##intent="a", ##white_patches=1) ##outname += "." + ti1name ##ti3.write(outname + ".ti3") ##result = self._create_matrix_profile(outname, omit="TRC") result = True if isinstance(result, Exception) or not result: if logfile: logfile.write("Warning - could not compute RGBW matrix") if result: logfile.write(": " + safe_unicode(result)) else: logfile.write("\n") else: comp_rgb_space = [2.2, "D50"] # Oversaturate primaries to add headroom wx, wy = colormath.XYZ2xyY(*XYZwp)[:2] # Determine saturation factor by looking at distance between # Rec. 2020 blue and actual blue primary bx, by, bY = colormath.XYZ2xyY( *colormath.adapt(*colormath.RGB2XYZ(0, 0, 1, "Rec. 2020"), whitepoint_source="D65")) bx2, by2, bY2 = xyYrgb[2] bu, bv = colormath.xyY2Lu_v_(bx, by, bY)[1:] bu2, bv2 = colormath.xyY2Lu_v_(bx2, by2, bY2)[1:] dist = math.sqrt((bx - bx2) ** 2 + (by - by2) ** 2) sat = 1 + math.ceil(dist * 100) / 100.0 if logfile: logfile.write("Increasing saturation of actual " "primaries for PCS candidate to " "%i%%...\n" % round(sat * 100)) for i, channel in enumerate("rgb"): ##x, y, Y = result.tags[channel + "XYZ"].pcs.xyY x, y, Y = xyYrgb[i] if logfile: logfile.write(channel.upper() + " xy %.6f %.6f -> " % (x, y)) x, y, Y = colormath.xyYsaturation(x, y, Y, wx, wy, sat) if logfile: logfile.write("%.6f %.6f\n" % (x, y)) xyYrgb[i] = x, y, Y (rx, ry, rY), (gx, gy, gY), (bx, by, bY) = xyYrgb mtx = colormath.rgb_to_xyz_matrix(rx, ry, gx, gy, bx, by, XYZwp) for i, (channel, components) in enumerate(rgb): X, Y, Z = mtx * components comp_rgb_space.append(colormath.XYZ2xyY(X, Y, Z)) comp_rgb_space.append("PCS candidate based on actual " "primaries") rgb_spaces.append(comp_rgb_space) # A colorspace that encompasses Rec709. Uses Rec. 2020 blue. rgb_spaces.append([2.2, "D50", [0.68280181011, 0.315096403371, 0.224182128906], [0.310096375087, 0.631250246526, 0.73258972168], [0.129244796433, 0.0471357502953, 0.0432281494141], "Rec709-encompassing, variant 1"]) # A colorspace that encompasses Rec709. Uses slightly different # primaries (based on WLED and B+RG LED) than variant 1. rgb_spaces.append([2.2, "D50", [0.664580313612, 0.329336320112, 0.228820800781], [0.318985161632, 0.644740328564, 0.742568969727], [0.143284983488, 0.0303535582465, 0.0286102294922], "Rec709-encompassing, variant 2"]) # A colorspace that encompasses Rec709 with imaginary red and blue rgb_spaces.append([2.2, "D50", [0.672053135694, 0.331936091367, 0.250122070312], [0.319028093312, 0.644705491217, 0.710144042969], [0.113899645442, 0.0424325604954, 0.0396270751953], "Rec709-encompassing, variant 3"]) # A colorspace that encompasses Rec709. Uses red and blue from # variant 2, but a slightly different green primary. rgb_spaces.append([2.2, "D50", [0.664627993657, 0.329338357942, 0.244033813477], [0.300155771607, 0.640946446796, 0.728302001953], [0.143304213944, 0.0303410650333, 0.0276641845703], "Rec709-encompassing, variant 4"]) # A colorspace with Plasma-like primaries. Uses Rec. 2020 blue. rgb_spaces.append([2.2, "D50", [0.692947816539, 0.30857396028, 0.244430541992], [0.284461719244, 0.70017174365, 0.709167480469], [0.129234824405, 0.0471509419335, 0.0464019775391], "SMPTE-431-2/DCI-P3-encompassing, variant 1"]) # A colorspace that encompasses both AdobeRGB and NTSC1953. Uses # Rec. 2020 blue. rgb_spaces.append([2.2, "D50", [0.680082575358, 0.319746686121, 0.314331054688], [0.200003470174, 0.730003123156, 0.641983032227], [0.129238369699, 0.0471305063812, 0.0436706542969], "AdobeRGB-NTSC1953-hybrid, variant 1"]) # A colorspace with Plasma-like primaries. Uses Rec. 2020 blue. # More saturated green primary than variant 1. rgb_spaces.append([2.2, "D50", [0.692943297796, 0.308579731457, 0.268966674805], [0.249088838269, 0.730263586072, 0.684844970703], [0.129230721306, 0.047147329564, 0.0461883544922], "SMPTE-431-2/DCI-P3-encompassing, variant 2"]) # A colorspace that encompasses both AdobeRGB and NTSC1953. # Different, more saturated primaries than variant 1. rgb_spaces.append([2.2, "D50", [0.700603882817, 0.299296301842, 0.274520874023], [0.200006562972, 0.75, 0.697494506836], [0.143956453416, 0.0296952711131, 0.0279693603516], "AdobeRGB-NTSC1953-hybrid, variant 2"]) # A colorspace that encompasses DCI P3 with imaginary red and blue rgb_spaces.append([2.2, "D50", [0.699964323939, 0.312334528794, 0.253814697266], [0.284337791321, 0.68212854805, 0.73779296875], [0.098165262763, 0.00937830372063, 0.00839233398438], "SMPTE-431-2/DCI-P3-encompassing, variant 3"]) # A colorspace that encompasses DCI P3 with imaginary red and blue # (red and blue are practically the same as Rec2020-encompassing) rgb_spaces.append([2.2, "D50", [0.717267960557, 0.29619267491, 0.231002807617], [0.284277504105, 0.682088122605, 0.760604858398], [0.0981978292034, 0.00940337224384, 0.00840759277344], "SMPTE-431-2/DCI-P3-encompassing, variant 4"]) # Rec. 2020 rgb_spaces.append([2.2, "D50", [0.7084978651, 0.293540723619, 0.279037475586], [0.190200063067, 0.775375775201, 0.675354003906], [0.129244405192, 0.0471399056886, 0.0456085205078], "Rec2020"]) # A colorspace that encompasses Rec2020 with imaginary primaries rgb_spaces.append([2.2, "D50", [0.71715243505, 0.296225595183, 0.291244506836], [0.191129060214, 0.795212673762, 0.700057983398], [0.0981403936826, 0.00939694681658, 0.00869750976562], "Rec2020-encompassing"]) if rgb_space: rgb_space = list(rgb_space[:5]) rgb_spaces = [rgb_space + ["Custom"]] # Find smallest candidate that encompasses space defined by actual # primaries if logfile: logfile.write("Checking for suitable PCS candidate...\n") pcs_candidate = None pcs_candidates = [] XYZsrgb = [] for channel, components in rgb: XYZsrgb.append(colormath.adapt(*colormath.RGB2XYZ(*components), whitepoint_source="D65")) XYZrgb_sequence = [XYZrgb, XYZsrgb] for rgb_space in rgb_spaces: if rgb_space[1] not in ("D50", colormath.get_whitepoint("D50")): # Adapt to D50 for i in xrange(3): X, Y, Z = colormath.xyY2XYZ(*rgb_space[2 + i]) X, Y, Z = colormath.adapt(X, Y, Z, rgb_space[1]) rgb_space[2 + i] = colormath.XYZ2xyY(X, Y, Z) rgb_space[1] = "D50" extremes = [] skip = False for XYZrgb in XYZrgb_sequence: for i, color in enumerate(["red", "green", "blue"]): RGB = colormath.XYZ2RGB(XYZrgb[i][0], XYZrgb[i][1], XYZrgb[i][2], rgb_space=rgb_space, clamp=False) maxima = max(RGB) minima = min(RGB) if minima < 0: maxima += abs(minima) if XYZrgb is XYZsrgb: if maxima > 1 and color == "blue": # We want our PCS candiate to contain Rec. 709 # blue, which may not be the case for our # candidate based off the actual display # primaries. Blue region is typically the one # where the most artifacts would be visible in # color conversions if the source blue is # clipped if logfile: logfile.write("Skipping %s because it does " "not encompass Rec. 709 %s\n" % (rgb_space[-1], color)) skip = True break else: extremes.append(maxima) if skip: break if skip: continue # Check area % (in xy for simplicity's sake) xyYrgb = rgb_space[2:5] area2 = 0.5 * abs(sum(x0 * y1 - x1 * y0 for ((x0, y0, Y0), (x1, y1, Y1)) in zip(xyYrgb, xyYrgb[1:] + [xyYrgb[0]]))) if logfile: logfile.write("%s fit: %.2f (area: %.2f%%)\n" % (rgb_space[-1], round(1.0 / max(extremes), 2), area1 / area2 * 100)) pcs_candidates.append((area1 / area2, 1.0 / max(extremes), rgb_space)) # Check if tested RGB space contains actual primaries if round(max(extremes), 2) <= 1.0: break XYZrgb = [] if not pcs_candidate and False: # NEVER? # Create quick medium quality shaper+matrix profile and use the # matrix from that if logfile: logfile.write("No suitable PCS candidate. " "Computing best fit matrix...\n") # Lookup small testchart so profile computation finishes quickly ti1name = "ti1/d3-e4-s5-g52-m5-b0-f0.ti1" ti1 = get_data_path(ti1name) if not ti1: raise Error(lang.getstr("file.missing", ti1name)) ti1, ti3, gray = self.ti1_lookup_to_ti3(ti1, profile, intent="a", white_patches=1) dirname, basename = os.path.split(profile.fileName) basepath = os.path.join(dirname, "." + os.path.splitext(basename)[0] + "-MTX.tmp") ti3.write(basepath + ".ti3") # Calculate profile cmd, args = get_argyll_util("colprof"), ["-v", "-qm", "-as", basepath] result = self.exec_cmd(cmd, args, capture_output=True, sessionlogfile=getattr(self, "sessionlogfile", None)) if isinstance(result, Exception): raise result if result: mtx = ICCP.ICCProfile(basepath + profile_ext) for column in "rgb": tag = mtx.tags.get(column + "XYZ") if isinstance(tag, ICCP.XYZType): XYZrgb.append(tag.values()) #os.remove(basepath + ".ti3") #os.remove(basepath + profile_ext) if not XYZrgb: raise Error(lang.getstr("profile.required_tags_missing", "rXYZ/gXYZ/bXYZ")) pcs_candidate = "BestFit" else: # If clutres is -1 (auto), set it depending on area coverage if clutres == -1: if area1 / area2 <= .51: clutres = 45 elif area1 / area2 <= .73: clutres = 33 # Use PCS candidate with best fit # (best fit is the smallest fit greater or equal 1 and # largest possible coverage) pcs_candidates.sort(key=lambda row: (-row[0], row[1])) for coverage, fit, rgb_space in pcs_candidates: if round(fit, 2) >= 1: break if logfile: logfile.write("Using primaries: %s\n" % rgb_space[-1]) for channel, components in rgb: XYZrgb.append(colormath.RGB2XYZ(*components, rgb_space=rgb_space)) pcs_candidate = rgb_space[-1] for i in xrange(3): logfile.write("Using %s XYZ: %.4f %.4f %.4f\n" % (("RGB"[i], ) + tuple(XYZrgb[i]))) # Construct the final matrix Xr, Yr, Zr = XYZrgb[0] Xg, Yg, Zg = XYZrgb[1] Xb, Yb, Zb = XYZrgb[2] if logfile: logfile.write("R+G+B XYZ: %.4f %.4f %.4f\n" % (Xr + Xg + Xb, Yr + Yg + Yb, Zr + Zg + Zb)) m1 = colormath.Matrix3x3(((Xr, Xg, Xb), (Yr, Yg, Yb), (Zr, Zg, Zb))).inverted() matrices.append(m1) Sr, Sg, Sb = m1 * XYZwp if logfile: logfile.write("Correction factors: %.4f %.4f %.4f\n" % (Sr, Sg, Sb)) m2 = colormath.Matrix3x3(((Sr * Xr, Sg * Xg, Sb * Xb), (Sr * Yr, Sg * Yg, Sb * Yb), (Sr * Zr, Sg * Zg, Sb * Zb))).inverted() matrices.append(m2) matrices.append(m3) for m, matrix in enumerate(matrices): if logfile: logfile.write("Matrix %i:\n" % (m + 1)) for row in matrix: logfile.write("%r\n" % row) itable.matrix = m2 * m3 if logfile: logfile.write("Final matrix:\n") for row in itable.matrix: logfile.write("%r\n" % row) else: # L*a*b* LUT # Use identity matrix for Lab as mandated by ICC spec itable.matrix = colormath.Matrix3x3([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) m2 = None if profile.connectionColorSpace == "XYZ": if logfile: logfile.write("Applying matrix to input curve XYZ values...\n") # Apply matrix rX = [] rY = [] rZ = [] for i in vrange: X, Y, Z = fpX[i], fpY[i], fpZ[i] X, Y, Z = m2 * (X, Y, Z) rX.append(X) rY.append(Y) rZ.append(Z) interp = (colormath.Interp(xpR, rX), colormath.Interp(xpG, rY), colormath.Interp(xpB, rZ)) rinterp = (colormath.Interp(rX, xpR), colormath.Interp(rY, xpG), colormath.Interp(rZ, xpB)) Linterp = None else: Lscale = 65280.0 / 65535.0 oldmin = (xpR[0] + xpG[0] + xpB[0]) / 3.0 oldmax = (xpR[-1] + xpG[-1] + xpB[-1]) / 3.0 oldrange = oldmax - oldmin newmin = 0.0 newmax = 100 newrange = newmax - newmin xpL = [] for i in vrange: v = (xpR[i] + xpG[i] + xpB[i]) / 3.0 v = max((((v - oldmin) * newrange) / oldrange) + newmin, 0) xpL.append(v) Linterp = colormath.Interp(xpL, fpL) rLinterp = colormath.Interp(fpL, xpL) interp = None # Set input curves # Apply inverse TRC to input values to distribute them # optimally across cLUT grid points if logfile: logfile.write("Generating input curves...\n") itable.input = [[], [], []] for j in vrange: if self.thread_abort: raise Info(lang.getstr("aborted")) if profile.connectionColorSpace == "XYZ": v = [rinterp[i](j / maxval) for i in xrange(3)] else: # CIELab PCS encoding v = [rLinterp(j / (maxval * Lscale) * 100) / 100.0] v.extend([j / maxval] * 2) for i in xrange(len(itable.input)): itable.input[i].append(min(v[i] * 65535, 65535)) if logfile and j % math.floor(maxval / 100.0) == 0: logfile.write("\r%i%%" % round(j / maxval * 100)) if logfile: logfile.write("\n") if False and method and not bpc: # Force the blackpoint - NEVER if logfile: logfile.write("Forcing B2A input curve blackpoint...\n") XYZbp_m = m2 * XYZbp for i in xrange(3): black_index = int(math.ceil(maxval * XYZbp_m[i])) if logfile: logfile.write("Channel #%i\n" % i) for j in xrange(black_index + 1): v = 0 if logfile: logfile.write("#%i %i -> %i\n" % (j, itable.input[i][j], v)) itable.input[i][j] = v if only_input_curves: # We are done return True if clutres == -1: # Auto clutres = 33 step = 1.0 / (clutres - 1.0) do_lookup = True if do_lookup: # Generate inverse table lookup input values # Use slightly less than equal the amount of CPUs for workers # for best utilization (each worker has 2 xicclu sub-processes) num_cpus = cpu_count() num_workers = min(max(num_cpus, 1), clutres) if num_cpus > 2: num_workers = int(num_workers * 0.75) if logfile: logfile.write("Generating %s%i table lookup input values...\n" % (source, tableno)) logfile.write("cLUT grid res: %i\n" % clutres) logfile.write("Looking up input values through %s%i table (%i workers)...\n" % (source, tableno, num_workers)) logfile.write("%s CAM Jab for clipping\n" % (use_cam_clipping and "Using" or "Not using")) idata = [] odata1 = [] odata2 = [] threshold = int((clutres - 1) * 0.75) threshold2 = int((clutres - 1) / 3) for slices in pool_slice(_mp_generate_B2A_clut, range(clutres), (profile.fileName, intent, direction, pcs, use_cam_clipping, clutres, step, threshold, threshold2, interp, Linterp, m2, XYZbp, XYZwp, bpc, lang.getstr("aborted")), {}, num_workers, self.thread_abort, logfile, num_batches=clutres // 9): for i, data in enumerate((idata, odata1, odata2)): data.extend(slices[i]) if logfile: logfile.write("\n") if logfile and (pcs == "x" or clutres // 2 != clutres / 2.0): if pcs == "x": iXYZbp = idata[0] iXYZwp = idata[-1] logfile.write("Input black XYZ: %s\n" % iXYZbp) logfile.write("Input white XYZ: %s\n" % iXYZwp) else: iLabbp = idata[clutres * (clutres // 2) + clutres // 2] iLabwp = idata[(clutres ** 2 * (clutres - 1) + clutres * (clutres // 2) + clutres // 2)] logfile.write("Input black L*a*b*: %s\n" % iLabbp) logfile.write("Input white L*a*b*: %s\n" % iLabwp) if not use_cam_clipping: odata = odata1 elif pcs == "l": odata = odata2 else: # Linearly interpolate the crossover to CAM Jab clipping region cam_diag = False odata = [] j, k = 0, 0 r = float(threshold - threshold2) for a in xrange(clutres): for b in xrange(clutres): for c in xrange(clutres): if a <= threshold and b <= threshold and c <= threshold: v = odata1[j] j += 1 if a > threshold2 or b > threshold2 or c > threshold2: d = max(a, b, c) if cam_diag: v = [100.0, 100.0, 0.0] v2 = [0.0, 100.0, 100.0] else: v2 = odata2[k] k += 1 for i, n in enumerate(v): v[i] *= (threshold - d) / r v2[i] *= 1 - (threshold - d) / r v[i] += v2[i] else: if cam_diag: v = [100.0, 0.0, 100.0] else: v = odata2[k] k += 1 odata.append(v) numrows = len(odata) if numrows != clutres ** 3: raise ValueError("Number of cLUT entries (%s) exceeds cLUT res " "maximum (%s^3 = %s)" % (numrows, clutres, clutres ** 3)) if logfile and (pcs == "x" or clutres // 2 != clutres / 2.0): if pcs == "x": oRGBbp = odata[0] oRGBwp = odata[-1] else: oRGBbp = odata[clutres * (clutres // 2) + clutres // 2] oRGBwp = odata[(clutres ** 2 * (clutres - 1) + clutres * (clutres // 2) + clutres // 2)] logfile.write("Output black RGB: %.4f %.4f %.4f\n" % tuple(oRGBbp)) logfile.write("Output white RGB: %.4f %.4f %.4f\n" % tuple(oRGBwp)) odata = [[n / 100.0 for n in v] for v in odata] # Fill cCLUT itable.clut = [] if logfile: logfile.write("Filling cLUT...\n") if not do_lookup: # Linearly scale RGB for R in xrange(clutres): if self.thread_abort: raise Info(lang.getstr("aborted")) for G in xrange(clutres): itable.clut.append([]) for B in xrange(clutres): itable.clut[-1].append([v * step * 65535 for v in (R, G, B)]) if logfile: logfile.write("\r%i%%" % round((R * G * B) / ((clutres - 1.0) ** 3) * 100)) else: for i, RGB in enumerate(odata): if i % clutres == 0: if self.thread_abort: raise Info(lang.getstr("aborted")) itable.clut.append([]) if logfile: logfile.write("\r%i%%" % round(i / (numrows - 1.0) * 100)) # Set RGB black and white explicitly if pcs == "x": if i == 0: RGB = 0, 0, 0 elif i == numrows - 1.0: RGB = 1, 1, 1 elif clutres // 2 != clutres / 2.0: # For CIELab cLUT, white- and black point will only # fall on a cLUT point if uneven cLUT res if i == clutres * (clutres // 2) + clutres // 2: ##if raw_input("%i %r" % (i, RGB)): RGB = 0, 0, 0 elif i == (clutres ** 2 * (clutres - 1) + clutres * (clutres // 2) + clutres // 2): ##if raw_input("%i %r" % (i, RGB)): RGB = 1, 1, 1 itable.clut[-1].append([v * 65535 for v in RGB]) if logfile: logfile.write("\n") if getcfg("profile.b2a.hires.diagpng") and filename: # Generate diagnostic images fname, ext = os.path.splitext(filename) for suffix, table in [("pre", profile.tags.get("B2A%i" % tableno)), ("post", itable)]: if table: table.clut_writepng(fname + ".B2A%i.%s.CLUT.png" % (tableno, suffix)) # Update profile profile.tags["B2A%i" % tableno] = itable if smooth: self.smooth_B2A(profile, tableno, getcfg("profile.b2a.hires.diagpng"), filename, logfile) # Set output curves itable.output = [[], [], []] numentries = 256 maxval = numentries - 1.0 for i in xrange(len(itable.output)): for j in xrange(numentries): itable.output[i].append(j / maxval * 65535) return True def smooth_B2A(self, profile, tableno, diagpng=2, filename=None, logfile=None): """ Apply extra smoothing to the cLUT """ itable = profile.tags.get("B2A%i" % tableno) if not itable: return False itable.smooth(diagpng, profile.connectionColorSpace, filename, logfile) return True def get_device_id(self, quirk=True, use_serial_32=True, truncate_edid_strings=False, omit_manufacturer=False, query=False): """ Get org.freedesktop.ColorManager device key """ if config.is_virtual_display(): return None display_no = max(0, min(len(self.displays) - 1, getcfg("display.number") - 1)) edid = self.display_edid[display_no] if not edid: # Fall back to XrandR name if not (quirk and use_serial_32 and not truncate_edid_strings and not omit_manufacturer): return if RDSMM: display = RDSMM.get_display(display_no) if display: xrandr_name = display.get("xrandr_name") if xrandr_name: edid = {"monitor_name": xrandr_name} return colord.device_id_from_edid(edid, quirk=quirk, use_serial_32=use_serial_32, truncate_edid_strings=truncate_edid_strings, omit_manufacturer=omit_manufacturer, query=query) def get_display(self): """ Get the currently configured display number. Returned is the Argyll CMS dispcal/dispread -d argument """ display_name = config.get_display_name(None, True) if display_name == "Web @ localhost": return "web:%i" % getcfg("webserver.portnumber") if display_name == "madVR": return "madvr" if display_name == "Untethered": return "0" if (display_name == "Resolve" or (display_name == "Prisma" and not defaults["patterngenerator.prisma.argyll"])): return "1" if display_name == "Prisma": host = getcfg("patterngenerator.prisma.host") try: host = socket.gethostbyname(host) except socket.error: pass return "prisma:%s" % host if display_name.startswith("Chromecast "): return "cc:%s" % display_name.split(":")[0].split(None, 1)[1].strip() if display_name.startswith("Prisma "): return "prisma:%s" % display_name.split("@")[-1].strip() display_no = min(len(self.displays), getcfg("display.number")) - 1 display = str(display_no + 1) if ((sys.platform not in ("darwin", "win32") or test) and (self.has_separate_lut_access() or getcfg("use_separate_lut_access")) and (not getcfg("display_lut.link") or (display_no > -1 and not self.lut_access[display_no]))): display_lut_no = min(len(self.displays), getcfg("display_lut.number")) - 1 if display_lut_no > -1 and not self.lut_access[display_lut_no]: for display_lut_no, disp in enumerate(self.lut_access): if disp: break display += "," + str(display_lut_no + 1) return display def get_display_edid(self): """ Return EDID of currently configured display """ n = getcfg("display.number") - 1 if n >= 0 and n < len(self.display_edid): return self.display_edid[n] return {} def get_display_name(self, prepend_manufacturer=False, prefer_edid=False, remove_manufacturer=True): """ Return name of currently configured display """ n = getcfg("display.number") - 1 if n >= 0 and n < len(self.display_names): display = [] manufacturer = None display_name = None if prefer_edid: edid = self.get_display_edid() manufacturer = edid.get("manufacturer") display_name = edid.get("monitor_name", edid.get("ascii", str(edid.get("product_id") or ""))) if not manufacturer: manufacturer = self.display_manufacturers[n] if not display_name: display_name = self.display_names[n] if manufacturer: manufacturer = colord.quirk_manufacturer(manufacturer) if prepend_manufacturer: if manufacturer.lower() not in display_name.lower(): display.append(manufacturer) elif remove_manufacturer: start = display_name.lower().find(manufacturer.lower()) if start > -1: display_name = (display_name[:start] + display_name[start + len(manufacturer):]).lstrip() display_name = re.sub("^[^([{\w]+", "", display_name) display.append(display_name) return " ".join(display) return "" def get_display_name_short(self, prepend_manufacturer=False, prefer_edid=False): """ Return shortened name of configured display (if possible) If name can't be shortened (e.g. because it's already 10 characters or less), return full string """ display_name = self.get_display_name(prepend_manufacturer, prefer_edid) if len(display_name) > 10: maxweight = 0 for part in re.findall('[^\s_]+(?:\s*\d+)?', re.sub("\([^)]+\)", "", display_name)): digits = re.search("\d+", part) if digits: # Weigh parts with digits higher than those without chars = re.sub("\d+", "", part) weight = len(chars) + len(digits.group()) * 5 else: # Weigh parts with uppercase letters higher than those without chars = "" for char in part: if char.lower() != char: chars += char weight = len(chars) if chars and weight >= maxweight: # Weigh parts further to the right higher display_name = re.sub("^[^([{\w]+", "", part) maxweight = weight return display_name def get_dispwin_display_profile_argument(self, display_no=0): """ Return argument corresponding to the display profile for use with dispwin. Will either return '-L' (use current profile) or a filename """ arg = "-L" try: return ICCP.get_display_profile(display_no, path_only=True) or arg except Exception, exception: safe_print(exception) return arg def update_display_name_manufacturer(self, ti3, display_name=None, display_manufacturer=None, write=True): """ Update display name and manufacturer in colprof arguments embedded in 'ARGYLL_COLPROF_ARGS' section in a TI3 file. """ options_colprof = [] if not display_name and not display_manufacturer: # Note: Do not mix'n'match display name and manufacturer from # different sources try: ti3_options_colprof = get_options_from_ti3(ti3)[1] except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: safe_print(exception) ti3_options_colprof = [] for option in ti3_options_colprof: if option[0] == "M": display_name = option.split(None, 1)[-1][1:-1] elif option[0] == "A": display_manufacturer = option.split(None, 1)[-1][1:-1] if not display_name and not display_manufacturer: # Note: Do not mix'n'match display name and manufacturer from # different sources edid = self.display_edid[max(0, min(len(self.displays), getcfg("display.number") - 1))] display_name = edid.get("monitor_name", edid.get("ascii", str(edid.get("product_id") or ""))) display_manufacturer = edid.get("manufacturer") if not display_name and not display_manufacturer: # Note: Do not mix'n'match display name and manufacturer from # different sources display_name = self.get_display_name() if display_name: options_colprof.append("-M") options_colprof.append(display_name) if display_manufacturer: options_colprof.append("-A") options_colprof.append(display_manufacturer) if write: # Add dispcal and colprof arguments to ti3 if is_ccxx_testchart(): options_dispcal = [] else: options_dispcal = self.options_dispcal ti3 = add_options_to_ti3(ti3, options_dispcal, options_colprof) if ti3: ti3.write() return options_colprof def get_instrument_features(self, instrument_name=None): """ Return features of currently configured instrument """ features = all_instruments.get(instrument_name or self.get_instrument_name(), {}) if test_require_sensor_cal: features["sensor_cal"] = True features["skip_sensor_cal"] = False return features def get_instrument_measurement_modes(self, instrument_id=None, skip_ccxx_modes=True): """ Enumerate measurement modes supported by the instrument """ if not instrument_id: features = self.get_instrument_features() instrument_id = features.get("id", self.get_instrument_name()) if instrument_id: measurement_modes = self.measurement_modes.get(instrument_id, OrderedDict()) if not measurement_modes: result = self.exec_cmd(get_argyll_util("spotread"), ["-?"], capture_output=True, skip_scripts=True, silent=True, log_output=False) if isinstance(result, Exception): safe_print(result) if test: self.output.extend("""Measure spot values, Version 1.7.0_beta Author: Graeme W. Gill, licensed under the GPL Version 2 or later Diagnostic: Usage requested usage: spotread [-options] [logfile] -v Verbose mode -s Print spectrum for each reading -S Plot spectrum for each reading -c listno Set communication port from the following list (default 1) 1 = 'COM13 (Klein K-10)' 2 = 'COM1' 3 = 'COM3' 4 = 'COM4' -t Use transmission measurement mode -e Use emissive measurement mode (absolute results) -eb Use display white brightness relative measurement mode -ew Use display white point relative chromatically adjusted mode -p Use telephoto measurement mode (absolute results) -pb Use projector white brightness relative measurement mode -pw Use projector white point relative chromatically adjusted mode -a Use ambient measurement mode (absolute results) -f Use ambient flash measurement mode (absolute results) -y F K-10: Factory Default [Default,CB1] c K-10: Default CRT File P K-10: Klein DLP Lux E K-10: Klein SMPTE C b K-10: TVL XVM245 d K-10: Klein LED Bk LCD m K-10: Klein Plasma p K-10: DLP Screen o K-10: TVL LEM150 O K-10: Sony EL OLED z K-10: Eizo CG LCD L K-10: FSI 2461W h K-10: HP DreamColor 2 1 K-10: LCD CCFL Wide Gamut IPS (LCD2690WUXi) l|c Other: l = LCD, c = CRT -I illum Set simulated instrument illumination using FWA (def -i illum): M0, M1, M2, A, C, D50, D50M2, D65, F5, F8, F10 or file.sp] -i illum Choose illuminant for computation of CIE XYZ from spectral data & FWA: A, C, D50 (def.), D50M2, D65, F5, F8, F10 or file.sp -Q observ Choose CIE Observer for spectral data or CCSS instrument: 1931_2 (def), 1964_10, S&B 1955_2, shaw, J&V 1978_2 (Choose FWA during operation) -F filter Set filter configuration (if aplicable): n None p Polarising filter 6 D65 u U.V. Cut -E extrafilterfile Apply extra filter compensation file -x Display Yxy instead of Lab -h Display LCh instead of Lab -V Show running average and std. devation from ref. -T Display correlated color temperatures and CRI -N Disable auto calibration of instrument -O Do one cal. or measure and exit -H Start in high resolution spectrum mode (if available) -X file.ccmx Apply Colorimeter Correction Matrix -Y r|n Override refresh, non-refresh display mode -Y R:rate Override measured refresh rate with rate Hz -Y A Use non-adaptive integration time mode (if available). -W n|h|x Override serial port flow control: n = none, h = HW, x = Xon/Xoff -D [level] Print debug diagnostics to stderr logfile Optional file to save reading results as text""".splitlines()) measurement_modes_follow = False if self.argyll_version >= [1, 7, 1]: technology_strings = technology_strings_171 else: technology_strings = technology_strings_170 for line in self.output: line = line.strip() if line.startswith("-y "): line = line.lstrip("-y ") measurement_modes_follow = True elif line.startswith("-"): measurement_modes_follow = False parts = [v.strip() for v in line.split(None, 1)] if measurement_modes_follow and len(parts) == 2: measurement_mode, desc = parts if (measurement_mode not in (string.digits[1:] + string.ascii_letters)): # Ran out of selectors continue measurement_mode_instrument_id, desc = desc.split(":", 1) desc = desc.strip() if measurement_mode_instrument_id == instrument_id: # Found a mode for our instrument if (re.sub(r"\s*\(.*?\)$", "", desc) in technology_strings.values() + [""] and skip_ccxx_modes): # This mode is supplied via CCMX/CCSS, skip continue desc = re.sub(r"\s*(?:File|\[[^\]]*\])", "", desc) measurement_modes[measurement_mode] = desc self.measurement_modes[instrument_id] = measurement_modes return measurement_modes return {} def get_instrument_name(self): """ Return name of currently configured instrument """ n = getcfg("comport.number") - 1 if n >= 0 and n < len(self.instruments): return self.instruments[n] return "" def has_lut_access(self): display_no = min(len(self.lut_access), getcfg("display.number")) - 1 return display_no > -1 and bool(self.lut_access[display_no]) def has_separate_lut_access(self): """ Return True if separate LUT access is possible and needed. """ # Filter out Prisma, Resolve and Untethered # IMPORTANT: Also make changes to display filtering in # worker.Worker.enumerate_displays_and_ports lut_access = self.lut_access[:-3] if self.argyll_version >= [1, 6, 0]: # Filter out madVR lut_access = lut_access[:-1] if self.argyll_version >= [1, 4, 0]: # Filter out Web @ localhost lut_access = lut_access[:-1] return (len(self.displays) > 1 and False in lut_access and True in lut_access) def import_colorimeter_corrections(self, cmd, args=None, asroot=False): """ Import colorimeter corrections. cmd can be 'i1d3ccss', 'spyd4en' or 'oeminst' """ if not args: args = [] if (is_superuser() or asroot) and not "-Sl" in args: # If we are root or need root privs anyway, install to local # system scope args.insert(0, "-Sl") return self.exec_cmd(cmd, ["-v"] + args, capture_output=True, skip_scripts=True, silent=False, asroot=asroot) def import_edr(self, args=None, asroot=False): """ Import X-Rite .edr files """ return self.import_colorimeter_corrections(get_argyll_util("i1d3ccss"), args, asroot) def import_spyd4cal(self, args=None, asroot=False): """ Import Spyder4/5 calibrations to spy4cal.bin """ return self.import_colorimeter_corrections(get_argyll_util("spyd4en"), args, asroot) def install_3dlut(self, path, filename=None): if getcfg("3dlut.format") == "madVR" and madvr: # Install (load) 3D LUT using madTPG safe_print(path) xy = None smpte2084 = False hdr_to_sdr = not getcfg("3dlut.hdr_display") # Get parameters from actual 3D LUT file h3dlut = madvr.H3DLUT(path) parameters = h3dlut.parametersData.strip('\0').splitlines() for line in parameters: if line.startswith("Input_Primaries"): try: xy = [round(float(v), 4) for v in line.split(None, 1)[-1].split()] except (IndexError, ValueError), exception: safe_print("Warning: madVR 3D LUT parameters could not " "be parsed:", line) else: safe_print(line) if (line.startswith("Input_Transfer_Function") and line.split(None, 1)[-1] == "PQ"): smpte2084 = True safe_print(line) rgb_space_name = colormath.find_primaries_wp_xy_rgb_space_name(xy) if rgb_space_name: safe_print("Input primaries match", rgb_space_name) gamut_slots = {"Rec. 709": 0, "SMPTE-C": 1, # SMPTE RP 145 (NTSC) "PAL/SECAM": 2, "Rec. 2020": 3, "DCI P3": 4} gamut = gamut_slots.get(rgb_space_name, 0) args = [path, True, gamut] if smpte2084: methodname = "load_hdr_3dlut_file" args.append(hdr_to_sdr) lut3d_section = "HDR" if hdr_to_sdr: lut3d_section += " to SDR" else: methodname = "load_3dlut_file" lut3d_section = "calibration" safe_print("Installing madVR 3D LUT for %s slot %i (%s)..." % (lut3d_section, gamut, dict(zip(gamut_slots.itervalues(), gamut_slots.iterkeys()))[gamut])) try: # Connect & load 3D LUT if (self.madtpg_connect() and getattr(self.madtpg, methodname)(*args)): raise Info(lang.getstr("3dlut.install.success")) else: raise Error(lang.getstr("3dlut.install.failure")) except Exception, exception: return exception finally: if hasattr(self, "madtpg"): self.madtpg.quit() if isinstance(self.madtpg, madvr.MadTPG_Net): self.madtpg.shutdown() elif config.get_display_name(None, True) == "Prisma": try: # Use Prisma HTTP REST interface to upload 3D LUT if not self.patterngenerator: self.setup_patterngenerator() self.patterngenerator.connect() # Check preset. If it has a custom LUT assigned, we delete the # currently assigned LUT before uploading, unless its filename # is the same as the LUT to be uploaded, in which case it will # be simply overwritten, and unless the custom LUT is still # assigned to another preset as well. presetname = getcfg("patterngenerator.prisma.preset") if False: # NEVER? # Check all presets for currently assigned LUT # Check the preset we're going to use for the upload last presetnames = filter(lambda name: name != presetname, config.valid_values["patterngenerator.prisma.preset"]) else: # Check only the preset we're going to use for the upload presetnames = [] presetnames.append(presetname) assigned_luts = {} for presetname in presetnames: self.log("Loading Prisma preset", presetname) preset = self.patterngenerator.load_preset(presetname) assigned_lut = preset["v"].get("cube", "") if not assigned_lut in assigned_luts: assigned_luts[assigned_lut] = 0 assigned_luts[assigned_lut] += 1 # Only remove the currently assigned custom LUT if it's not # assigned to another preset if (assigned_lut.lower().endswith(".3dl") and assigned_luts[assigned_lut] == 1): remove = preset["v"]["cube"] else: remove = False # Check total size of installed 3D LUTs. The Prisma has 1 MB of # custom LUT storage, which is enough for 15 67 KB LUTs. maxsize = 1024 * 67 * 15 installed = self.patterngenerator.get_installed_3dluts() rawlen = len(installed["raw"]) size = 0 numinstalled = 0 for table in installed["v"]["tables"]: if table.get("n") != remove: size += table.get("s", 0) numinstalled += 1 else: rawlen -= len('{"n":"%s", "s":%i},' % (table["n"], table.get("s", 0))) filesize = os.stat(path).st_size size_exceeded = size + filesize > maxsize # NOTE that the total number of 3D LUT slots seems to be limited # to 32, which includes built-in LUTs. maxluts = 32 luts_exceeded = numinstalled >= maxluts if size_exceeded or luts_exceeded: if size_exceeded: missing = size + filesize - maxsize elif luts_exceeded: missing = filesize * (numinstalled + 1 - maxluts) else: missing = size + filesize - 1024 * 67 * 2 raise Error(lang.getstr("3dlut.holder.out_of_memory", (getcfg("patterngenerator.prisma.host"), round(missing / 1024.0), getcfg("patterngenerator.prisma.host"), "Prisma"))) if remove and remove != filename: self.log("Removing currently assigned LUT", remove) self.patterngenerator.remove_3dlut(remove) self.log("Uploading LUT", path, "as", filename) self.patterngenerator.load_3dlut_file(path, filename) self.log("Setting LUT", filename) self.patterngenerator.set_3dlut(filename) self.log("Setting PrismaVue to zero") self.patterngenerator.set_prismavue(0) except Exception, exception: return exception return Info(lang.getstr("3dlut.install.success")) else: return Error(lang.getstr("3dlut.install.unsupported")) def install_profile(self, profile_path, capture_output=True, skip_scripts=False, silent=False): """ Install a profile by copying it to an appropriate location and registering it with the system """ colord_install = None oy_install = None argyll_install = self._install_profile_argyll(profile_path, capture_output, skip_scripts, silent) if isinstance(argyll_install, basestring): # The installed name may be different due to escaping non-ASCII # chars (see prepare_dispwin), so get the profile path profile_path = argyll_install argyll_install = True if sys.platform == "win32": # Assign profile to active display display_no = min(len(self.displays), getcfg("display.number")) - 1 monitors = util_win.get_real_display_devices_info() moninfo = monitors[display_no] displays = util_win.get_display_devices(moninfo["Device"]) active_display = util_win.get_active_display_device(None, displays) if not active_display: self.log(appname + ": Warning - no active display device!") if not displays: self.log(appname + ": Warning - could not enumerate " "display devices for %s!" % moninfo["Device"]) elif active_display.DeviceKey != displays[0].DeviceKey: self.log(appname + ": Setting profile for active display device...") try: ICCP.set_display_profile(os.path.basename(profile_path), devicekey=active_display.DeviceKey) except Exception, exception: # Not a critical error. Only log the exception. if (isinstance(exception, EnvironmentError) and not exception.filename and not os.path.isfile(profile_path)): exception.filename = profile_path self.log(appname + ": Warning - could not set profile for " "active display device:", exception) else: self.log(appname + ": ...ok") loader_install = None profile = None try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: return exception device_id = self.get_device_id(quirk=True, query=True) if (sys.platform not in ("darwin", "win32") and not getcfg("dry_run") and (argyll_install is not True or self.argyll_version < [1, 6] or not os.getenv("ARGYLL_USE_COLORD") or not dlopen("libcolordcompat.so")) and which("colormgr")): if device_id: result = False # Try a range of possible device IDs device_ids = [device_id, self.get_device_id(quirk=True, truncate_edid_strings=True), self.get_device_id(quirk=True, use_serial_32=False), self.get_device_id(quirk=True, use_serial_32=False, truncate_edid_strings=True), self.get_device_id(quirk=False), self.get_device_id(quirk=False, truncate_edid_strings=True), self.get_device_id(quirk=False, use_serial_32=False), self.get_device_id(quirk=False, use_serial_32=False, truncate_edid_strings=True), # Try with manufacturer omitted self.get_device_id(omit_manufacturer=True), self.get_device_id(truncate_edid_strings=True, omit_manufacturer=True), self.get_device_id(use_serial_32=False, omit_manufacturer=True), self.get_device_id(use_serial_32=False, truncate_edid_strings=True, omit_manufacturer=True)] for device_id in OrderedDict.fromkeys(device_ids).iterkeys(): if device_id: # NOTE: This can block result = self._install_profile_colord(profile, device_id) if isinstance(result, colord.CDObjectQueryError): # Device ID was not found, try next one continue else: # Either returned ok or there was another error break colord_install = result if not device_id or result is not True: gcm_import = bool(which("gcm-import")) if gcm_import: self._install_profile_gcm(profile) # gcm-import doesn't seem to return a useful exit code or # stderr output, so check for our profile profilename = os.path.basename(profile.fileName) for dirname in iccprofiles_home: profile_install_path = os.path.join(dirname, profilename) if os.path.isfile(profile_install_path): colord_install = Warn(lang.getstr("profile.import.success")) break if (which("oyranos-monitor") and self.check_display_conf_oy_compat(getcfg("display.number"))): if device_id: profile_name = re.sub("[- ]", "_", device_id.lower()) + ".icc" else: profile_name = None result = self._install_profile_oy(profile_path, profile_name, capture_output, skip_scripts, silent) oy_install = result if (argyll_install is not True and ((colord_install and not isinstance(colord_install, colord.CDError)) or oy_install is True)): # Ignore Argyll install errors if colord or Oyranos install was # succesful argyll_install = None # Check if atleast one of our profile install methods did return a # result that is not an error for result in (argyll_install, colord_install, oy_install): check = result is True or isinstance(result, Warning) if check: break # Only go on to create profile loader if profile loading on login # isn't disabled in the config file, and we are not under Mac OS X # (no loader required there), and if atleast one of our profile # install methods did return a result that is not an error if (getcfg("profile.load_on_login") and sys.platform != "darwin" and check): # Create profile loader. Failing to create it is a critical error # under Windows if calibration loading isn't handled by the OS # (this is checked), and also under Linux if colord profile install # failed (colord handles loading otherwise) check = (sys.platform == "win32" or (not colord_install or isinstance(colord_install, colord.CDError))) if (getcfg("profile.install_scope") == "l" and sys.platform != "win32"): # We need a system-wide config file to store the path to # the Argyll binaries for the profile loader if (not config.makecfgdir("system", self) or (not config.writecfg("system", self) and check)): # If the system-wide config dir could not be created, # or the system-wide config file could not be written, # error out if under Linux and colord profile install failed return Error(lang.getstr("error.autostart_system")) if sys.platform == "win32": loader_install = self._install_profile_loader_win32(silent) else: loader_install = self._install_profile_loader_xdg(silent) if loader_install is not True and check: return loader_install # Check if atleast one of our profile install methods returned a result for result in (argyll_install, colord_install, oy_install): if result is not None: return argyll_install, colord_install, oy_install, loader_install if not result: # This should never happen result = Error(lang.getstr("profile.install.error")) return result def install_argyll_instrument_conf(self, uninstall=False, filenames=None): """ (Un-)install Argyll CMS instrument configuration under Linux """ udevrules = "/etc/udev/rules.d" hotplug = "/etc/hotplug" if not os.path.isdir(udevrules) and not os.path.isdir(hotplug): return Error(lang.getstr("udev_hotplug.unavailable")) if not filenames: filenames = self.get_argyll_instrument_conf("installed" if uninstall else None) if not filenames: return Error("\n".join(lang.getstr("file.missing", filename) for filename in self.get_argyll_instrument_conf("expected"))) if uninstall: backupbase = os.path.join(config.datahome, "backup", strftime("%Y%m%dT%H%M%S")) for filename in filenames: if filename.endswith(".rules"): dst = udevrules else: dst = hotplug if uninstall: # Move file to backup location backupdir = "".join([backupbase, os.path.dirname(filename)]) if not os.path.isdir(backupdir): os.makedirs(backupdir) cmd, args = "mv", [filename, "".join([backupbase, filename])] else: cmd, args = "cp", ["--remove-destination", filename] args.append(os.path.join(dst, os.path.basename(filename))) result = self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, asroot=True) if result is not True: break elif not uninstall: self.exec_cmd("chmod", ["0644", args[-1]], capture_output=True, skip_scripts=True, asroot=True) install_result = result paths = ["/sbin", "/usr/sbin"] paths.extend(getenvu("PATH", os.defpath).split(os.pathsep)) if not uninstall: if not isinstance(result, Exception) and result: # Add colord group if it does not exist if "colord" not in [g.gr_name for g in grp.getgrall()]: groupadd = which("groupadd", paths) if groupadd: result = self.exec_cmd(groupadd, ["colord"], capture_output=True, skip_scripts=True, asroot=True) if not isinstance(result, Exception) and result: # Add user to colord group if not yet a member if "colord" not in getgroups(getpass.getuser(), True): usermod = which("usermod", paths) if usermod: result = self.exec_cmd(usermod, ["-a", "-G", "colord", getpass.getuser()], capture_output=True, skip_scripts=True, asroot=True) if install_result is True and dst == udevrules: # Reload udev rules udevadm = which("udevadm", paths) if udevadm: result = self.exec_cmd(udevadm, ["control", "--reload-rules"], capture_output=True, skip_scripts=True, asroot=True) return result def install_argyll_instrument_drivers(self, uninstall=False, launch_devman=False): """ (Un-)install the Argyll CMS instrument drivers under Windows """ winxp = sys.getwindowsversion() < (6,) if launch_devman: if winxp: cmd = "start" args = ["mmc", "devmgmt.msc"] else: cmd = "mmc" args = ["devmgmt.msc"] self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, asroot=not winxp, shell=winxp, working_dir=False) if uninstall: if not winxp: # Windows Vista and newer with win64_disable_file_system_redirection(): pnputil = which("PnPutil.exe") if not pnputil: return Error(lang.getstr("file.missing", "PnPutil.exe")) result = self.exec_cmd(pnputil, ["-e"], capture_output=True, log_output=False, silent=True, skip_scripts=True) if not result: return Error(lang.getstr("argyll.instrument.drivers.uninstall.failure")) elif isinstance(result, Exception): return result output = universal_newlines("".join(self.output)) for entry in output.split("\n\n"): entry = [line.split(":", 1)[-1].strip() for line in entry.split("\n")] for value in entry: if value == "ArgyllCMS": result = self.exec_cmd(pnputil, ["-f", "-d", entry[0]], capture_output=True, skip_scripts=True, asroot=True) else: # Windows XP # Uninstallation not supported pass else: # Install driver using modified 'zadic' command line tool from # https://github.com/fhoech/libwdi result = None # Get Argyll version resp = http_request(None, domain, "GET", "/Argyll/VERSION", failure_msg=lang.getstr("update_check.fail"), silent=True) if resp: argyll_version_string = resp.read().strip() else: argyll_version_string = self.argyll_version_string installer_basename = ("Argyll_V%s_USB_driver_installer.exe" % argyll_version_string) download_dir = os.path.join(expanduseru("~"), "Downloads") installer = os.path.join(download_dir, installer_basename) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and not os.path.isfile(installer)): # DisplayCAL versions prior to 3.1.6 were using ~/Downloads # regardless of Known Folder path, so files may already exist download_dir = get_known_folder_path("Downloads") installer = os.path.join(download_dir, installer_basename) if not os.path.isfile(installer): installer_zip = self.download("https://%s/Argyll/%s.zip" % (domain, installer_basename)) if isinstance(installer_zip, Exception): return installer_zip elif not installer_zip: # Cancelled return installer = os.path.splitext(installer_zip)[0] # Open installer ZIP archive try: with zipfile.ZipFile(installer_zip) as z: # Extract installer if it does not exist or if the existing # file is different from the one in the archive if os.path.isfile(installer): with open(installer, "rb") as f: crc = zlib.crc32(f.read()) else: crc = None if (not os.path.isfile(installer) or crc != z.getinfo(installer_basename).CRC): z.extract(installer_basename, os.path.dirname(installer_zip)) except Exception, exception: return exception # Get supported instruments USB device IDs usb_ids = {} for instrument_name, instrument in all_instruments.iteritems(): if instrument.get("usb_ids"): for entry in instrument.get("usb_ids"): usb_id = (entry["vid"], entry["pid"]) if entry.get("hid"): # Skip HID devices continue else: usb_ids[usb_id] = usb_ids.get(usb_id, [instrument_name]) usb_ids[usb_id].append(instrument_name) # Check connected USB devices for supported instruments not_main_thread = currentThread().__class__ is not _MainThread if not_main_thread: # If running in a thread, need to call pythoncom.CoInitialize pythoncom.CoInitialize() try: if not wmi: raise NotImplementedError("WMI not available") wmi_connection = wmi.WMI() query = "Select * From Win32_USBControllerDevice" for item in wmi_connection.query(query): for usb_id, instrument_names in usb_ids.iteritems(): hardware_id = ur"USB\VID_%04X&PID_%04X" % usb_id try: device_id = item.Dependent.DeviceID except wmi.x_wmi, exception: self.log(exception) continue if device_id.startswith(hardware_id): # Found supported instrument try: self.log(item.Dependent.Caption) except wmi.x_wmi, exception: self.log(", ".join(instrument_names)) # Install driver for specific device result = self.exec_cmd(installer, ["--noprompt", "--usealldevices", "--vid", hex(usb_id[0]), "--pid", hex(usb_id[1])], capture_output=True, skip_scripts=True, asroot=True) output = universal_newlines("".join(self.output)) if isinstance(result, Exception): return result elif not result or "Failed to install driver" in output: return Error(lang.getstr("argyll.instrument.drivers.install.failure")) except Exception, exception: self.log(exception) finally: if not_main_thread: # If running in a thread, need to call pythoncom.CoUninitialize pythoncom.CoUninitialize() if not result: # No matching device found. Install driver anyway, doesn't # matter for which specific device as the .inf contains entries # for all supported ones, thus instruments that are connected # later should be recognized usb_id, instrument_names = usb_ids.popitem() result = self.exec_cmd(installer, ["--noprompt", "--vid", hex(usb_id[0]), "--pid", hex(usb_id[1]), "--create", "%s (Argyll)" % instrument_names[-1]], capture_output=True, skip_scripts=True, asroot=True) output = universal_newlines("".join(self.output)) if not result or "Failed to install driver" in output: return Error(lang.getstr("argyll.instrument.drivers.install.failure")) return result def _install_profile_argyll(self, profile_path, capture_output=False, skip_scripts=False, silent=False): """ Install profile using dispwin. Return the profile path, an error or False """ if (sys.platform == "darwin" and False): # NEVER # Alternate way of 'installing' the profile under OS X by just # copying it profiles = os.path.join("Library", "ColorSync", "Profiles") profile_install_path = os.path.join(profiles, os.path.basename(profile_path)) network = os.path.join(os.path.sep, "Network", profiles) if getcfg("profile.install_scope") == "l": profile_install_path = os.path.join(os.path.sep, profile_install_path) elif (getcfg("profile.install_scope") == "n" and os.path.isdir(network)): profile_install_path = os.path.join(network, profile_install_path) else: profile_install_path = os.path.join(os.path.expanduser("~"), profile_install_path) cmd, args = "cp", ["-f", profile_path, profile_install_path] result = self.exec_cmd(cmd, args, capture_output, low_contrast=False, skip_scripts=skip_scripts, silent=silent, asroot=getcfg("profile.install_scope") in ("l", "n"), title=lang.getstr("profile.install")) if not isinstance(result, Exception) and result: self.output = ["Installed"] else: cmd, args = self.prepare_dispwin(None, profile_path, True) if not isinstance(cmd, Exception): profile_path = args[-1] if sys.platform == "win32" and sys.getwindowsversion() >= (6, ): # Set/unset per-user profiles under Vista / Windows 7 idx = getcfg("display.number") - 1 try: device0 = util_win.get_display_device(idx, exception_cls=None) devicea = util_win.get_display_device(idx, True) except Exception, exception: self.log("util_win.get_display_device(%s):" % idx, exception) else: per_user = not "-Sl" in args for i, device in enumerate((device0, devicea)): if not device: self.log("Warning: There is no %s display " "device to %s per-user profiles" % ("1st" if i == 0 else "active", "enable" if per_user else "disable")) continue try: util_win.enable_per_user_profiles(per_user, devicekey=device.DeviceKey) except Exception, exception: self.log("util_win.enable_per_user_profiles(%s, devicekey=%r): %s" % (per_user, device.DeviceKey, exception)) if "-Sl" in args and (sys.platform != "darwin" or intlist(mac_ver()[0].split(".")) >= [10, 6]): # If a 'system' install is requested under Linux, # Mac OS X >= 10.6 or Windows, # install in 'user' scope first because a system-wide install # doesn't also set it as current user profile on those systems # (on Mac OS X < 10.6, we can use ColorSyncScripting to set it). # It has the small drawback under Linux and OS X 10.6 that # it will copy the profile to both the user and system-wide # locations, though, which is not a problem under Windows as # they are the same. args.remove("-Sl") result = self.exec_cmd(cmd, args, capture_output, low_contrast=False, skip_scripts=skip_scripts, silent=silent, title=lang.getstr("profile.install")) output = list(self.output) args.insert(0, "-Sl") else: output = None result = True if not isinstance(result, Exception) and result: result = self.exec_cmd(cmd, args, capture_output, low_contrast=False, skip_scripts=skip_scripts, silent=silent, title=lang.getstr("profile.install")) else: result = cmd if not isinstance(result, Exception) and result is not None: result = False for line in output or self.output: if "Installed" in line: if (sys.platform == "darwin" and "-Sl" in args and intlist(mac_ver()[0].split(".")) < [10, 6]): # The profile has been installed, but we need a little # help from AppleScript to actually make it the default # for the current user. Only works under Mac OS < 10.6 n = getcfg("display.number") path = os.path.join(os.path.sep, "Library", "ColorSync", "Profiles", os.path.basename(args[-1])) applescript = ['tell app "ColorSyncScripting"', 'set displayProfile to POSIX file "%s" as alias' % path, 'set display profile of display %i to displayProfile' % n, 'end tell'] try: retcode, output, errors = osascript(applescript) except Exception, exception: self.log(exception) else: if errors.strip(): self.log("osascript error: %s" % errors) else: result = True break elif (sys.platform == "darwin" and False): # NEVER # After 'installing' a profile under Mac OS X by just # copying it, show system preferences applescript = ['tell application "System Preferences"', 'activate', 'set current pane to pane id "com.apple.preference.displays"', 'reveal (first anchor of current pane whose name is "displaysColorTab")', # This needs access for assistive devices enabled #'tell application "System Events"', #'tell process "System Preferences"', #'select row 2 of table 1 of scroll area 1 of group 1 of tab group 1 of window ""', #'end tell', #'end tell', 'end tell'] try: retcode, output, errors = osascript(applescript) except Exception, exception: self.log(exception) else: if errors.strip(): self.log("osascript error: %s" % errors) else: result = True else: result = True break if not result and self.errors: result = Error("".join(self.errors).strip()) else: result = profile_path # DO NOT call wrapup() here, it'll remove the profile in the temp # directory before dispwin can get a hold of it when running with UAC # under Windows, because that makes the call to dispwin run in a # separate thread. DisplayCAL.MainFrame.profile_finish_consumer calls # DisplayCAL.MainFrame.start_timers(True) after displaying the result # message which takes care of cleanup. return result def _install_profile_colord(self, profile, device_id): """ Install profile using colord """ self.log("%s: Trying device ID %r" % (appname, device_id)) try: colord.install_profile(device_id, profile, logfn=self.log) except Exception, exception: self.log(exception) return exception return True def _install_profile_gcm(self, profile): """ Install profile using gcm-import """ if which("colormgr"): # Check if profile already exists in database try: colord.get_object_path("icc-" + hexlify(profile.ID), "profile") except colord.CDObjectQueryError: # Profile not in database pass except colord.CDError, exception: self.log(exception) else: # Profile already in database, nothing to do return None # gcm-import will check if the profile is already in the database # (based on profile ID), but will fail to overwrite a profile with the # same name. We need to remove those profiles so gcm-import can work. profilename = os.path.basename(profile.fileName) for dirname in iccprofiles_home: profile_install_path = os.path.join(dirname, profilename) if os.path.isfile(profile_install_path) and \ profile_install_path != profile.fileName: try: trash([profile_install_path]) except Exception, exception: self.log(exception) else: # Give colord time to recognize that the profile was # removed, otherwise gcm-import may complain if it's # a profile that was already in the database sleep(3) if self._progress_wnd and not getattr(self._progress_wnd, "dlg", None): self._progress_wnd.dlg = DummyDialog() # Run gcm-import cmd, args = which("gcm-import"), [profile.fileName] # gcm-import does not seem to return a useful exit code (it's always 1) # or stderr output self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) def _install_profile_oy(self, profile_path, profile_name=None, capture_output=False, skip_scripts=False, silent=False): """ Install profile using oyranos-monitor """ display = self.displays[max(0, min(len(self.displays) - 1, getcfg("display.number") - 1))] x, y = [pos.strip() for pos in display.split("@")[-1].split(",")[0:2]] if getcfg("profile.install_scope") == "l": # If system-wide install, copy profile to # /var/lib/color/icc/devices/display var_icc = "/var/lib/color/icc/devices/display" if not profile_name: profile_name = os.path.basename(profile_path) profile_install_path = os.path.join(var_icc, profile_name) result = self.exec_cmd("mkdir", ["-p", os.path.dirname(profile_install_path)], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) if not isinstance(result, Exception) and result: result = self.exec_cmd("cp", ["-f", profile_path, profile_install_path], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) else: result = True dirname = None for dirname in iccprofiles_display_home: if os.path.isdir(dirname): # Use the first one that exists break else: dirname = None if not dirname: # Create the first one in the list dirname = iccprofiles_display_home[0] try: os.makedirs(dirname) except Exception, exception: self.log(exception) result = False if result is not False: profile_install_path = os.path.join(dirname, os.path.basename(profile_path)) try: shutil.copyfile(profile_path, profile_install_path) except Exception, exception: self.log(exception) result = False if not isinstance(result, Exception) and result is not False: cmd = which("oyranos-monitor") args = ["-x", x, "-y", y, profile_install_path] result = self.exec_cmd(cmd, args, capture_output, low_contrast=False, skip_scripts=skip_scripts, silent=silent, working_dir=False) ##if getcfg("profile.install_scope") == "l": ##result = self.exec_cmd(cmd, args, ##capture_output, ##low_contrast=False, ##skip_scripts=skip_scripts, ##silent=silent, ##asroot=True, ##working_dir=False) if not result and self.errors: result = Error("".join(self.errors).strip()) return result def _install_profile_loader_win32(self, silent=False): """ Install profile loader """ if (sys.platform == "win32" and sys.getwindowsversion() >= (6, 1) and util_win.calibration_management_isenabled()): self._uninstall_profile_loader_win32() return True # Must return either True on success or an Exception object on error result = True # Remove outdated (pre-0.5.5.9) profile loaders display_no = self.get_display() name = "%s Calibration Loader (Display %s)" % (appname, display_no) if autostart_home: loader_v01b = os.path.join(autostart_home, ("dispwin-d%s-c-L" % display_no) + ".lnk") if os.path.exists(loader_v01b): try: # delete v0.1b loader os.remove(loader_v01b) except Exception, exception: self.log(u"Warning - could not remove old " u"v0.1b calibration loader '%s': %s" % tuple(safe_unicode(s) for s in (loader_v01b, exception))) loader_v02b = os.path.join(autostart_home, name + ".lnk") if os.path.exists(loader_v02b): try: # delete v02.b/v0.2.1b loader os.remove(loader_v02b) except Exception, exception: self.log(u"Warning - could not remove old " u"v0.2b calibration loader '%s': %s" % tuple(safe_unicode(s) for s in (loader_v02b, exception))) loader_v0558 = os.path.join(autostart_home, name + ".lnk") if os.path.exists(loader_v0558): try: # delete v0.5.5.8 user loader os.remove(loader_v0558) except Exception, exception: self.log(u"Warning - could not remove old " u"v0.2b calibration loader '%s': %s" % tuple(safe_unicode(s) for s in (loader_v02b, exception))) if autostart: loader_v0558 = os.path.join(autostart, name + ".lnk") if os.path.exists(loader_v0558): try: # delete v0.5.5.8 system loader os.remove(loader_v0558) except Exception, exception: self.log(u"Warning - could not remove old " u"v0.2b calibration loader '%s': %s" % tuple(safe_unicode(s) for s in (loader_v02b, exception))) # Create unified loader name = appname + " Profile Loader" if autostart: autostart_lnkname = os.path.join(autostart, name + ".lnk") if autostart_home: autostart_home_lnkname = os.path.join(autostart_home, name + ".lnk") loader_args = [] if os.path.basename(exe).lower() in ("python.exe", "pythonw.exe"): cmd = os.path.join(exedir, "pythonw.exe") pyw = os.path.normpath(os.path.join(pydir, "..", appname + "-apply-profiles.pyw")) if os.path.exists(pyw): # Running from source or 0install # Check if this is a 0install implementation, in which # case we want to call 0launch with the appropriate # command if re.match("sha\d+(?:new)?", os.path.basename(os.path.dirname(pydir))): cmd = which("0install-win.exe") or "0install-win.exe" loader_args.extend(["run", "--batch", "--no-wait", "--offline", "--command=run-apply-profiles", "http://%s/0install/%s.xml" % (domain.lower(), appname)]) else: # Running from source loader_args.append(pyw) else: # Regular install loader_args.append(get_data_path(os.path.join("scripts", appname + "-apply-profiles"))) else: cmd = os.path.join(pydir, appname + "-apply-profiles.exe") not_main_thread = currentThread().__class__ is not _MainThread if not_main_thread: # If running in a thread, need to call pythoncom.CoInitialize pythoncom.CoInitialize() import taskscheduler try: ts = taskscheduler.TaskScheduler() except Exception, exception: safe_print("Warning - could not access task scheduler:", exception) ts = None task = None else: task = ts.query_task(appname + " Profile Loader Launcher") elevate = (getcfg("profile.install_scope") == "l" and sys.getwindowsversion() >= (6, )) loader_lockfile = os.path.join(config.confighome, appbasename + "-apply-profiles.lock") loader_running = os.path.isfile(loader_lockfile) if not loader_running or (not task and elevate): # Launch profile loader if not yet running, or restart if no task # and going to elevate (launching profile loader with elevated # privileges will try to create scheduled task so we can run # elevated at login without UAC prompt) errmsg = "Warning - could not launch profile loader" if elevate: errmsg += " with elevated privileges" try: shell_exec(cmd, loader_args + ["--skip"], operation="runas" if elevate else "open", wait_for_idle=True) except pywintypes.error, exception: if exception.args[0] == winerror.ERROR_CANCELLED: errmsg += " (user cancelled)" else: errmsg += " " + safe_str(exception) safe_print(errmsg) if task or (ts and ts.query_task(appname + " Profile Loader Launcher")): if not_main_thread: pythoncom.CoUninitialize() return True try: scut = pythoncom.CoCreateInstance(win32com_shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, win32com_shell.IID_IShellLink) scut.SetPath(cmd) if len(loader_args) == 1: scut.SetWorkingDirectory(pydir) if os.path.basename(cmd) == appname + "-apply-profiles.exe": scut.SetIconLocation(cmd, 0) else: scut.SetIconLocation(get_data_path(os.path.join("theme", "icons", appname + "-apply-profiles.ico")), 0) scut.SetArguments(sp.list2cmdline(loader_args)) scut.SetShowCmd(win32con.SW_SHOWDEFAULT) if is_superuser(): if autostart: try: scut.QueryInterface(pythoncom.IID_IPersistFile).Save(autostart_lnkname, 0) except Exception, exception: if not silent: result = Warning(lang.getstr("error.autostart_creation", autostart) + "\n" + safe_unicode(exception)) # Now try user scope else: if not silent: result = Warning(lang.getstr("error.autostart_system")) if autostart_home: if (autostart and os.path.isfile(autostart_lnkname)): # Remove existing user loader if os.path.isfile(autostart_home_lnkname): os.remove(autostart_home_lnkname) else: # Only create user loader if no system loader try: scut.QueryInterface( pythoncom.IID_IPersistFile).Save( autostart_home_lnkname, 0) except Exception, exception: if not silent: result = Warning(lang.getstr("error.autostart_creation", autostart_home) + "\n" + safe_unicode(exception)) else: if not silent: result = Warning(lang.getstr("error.autostart_user")) except Exception, exception: if not silent: result = Warning(lang.getstr("error.autostart_creation", autostart_home) + "\n" + safe_unicode(exception)) finally: if not_main_thread: # If running in a thread, need to call pythoncom.CoUninitialize pythoncom.CoUninitialize() return result def _uninstall_profile_loader_win32(self): """ Uninstall profile loader """ name = appname + " Profile Loader" if autostart and is_superuser(): autostart_lnkname = os.path.join(autostart, name + ".lnk") if os.path.exists(autostart_lnkname): try: os.remove(autostart_lnkname) except Exception, exception: self.log(autostart_lnkname, exception) if autostart_home: autostart_home_lnkname = os.path.join(autostart_home, name + ".lnk") if os.path.exists(autostart_home_lnkname): try: os.remove(autostart_home_lnkname) except Exception, exception: self.log(autostart_home_lnkname, exception) return True def _install_profile_loader_xdg(self, silent=False): """ Install profile loader """ # See http://standards.freedesktop.org/autostart-spec # Must return either True on success or an Exception object on error result = True # Remove wrong-cased entry potentially created by DisplayCAL < 3.1.6 name = "z-%s-apply-profiles" % appname desktopfile_path = os.path.join(autostart_home, name + ".desktop") if os.path.exists(desktopfile_path): try: os.remove(desktopfile_path) except Exception, exception: result = Warning(lang.getstr("error.autostart_remove_old", desktopfile_path)) # Create unified loader # Prepend 'z' so our loader hopefully loads after # possible nvidia-settings entry (which resets gamma table) name = "z-%s-apply-profiles" % appname.lower() desktopfile_path = os.path.join(autostart_home, name + ".desktop") system_desktopfile_path = os.path.join(autostart, name + ".desktop") try: # Create user loader, even if we later try to # move it to the system-wide location so that atleast # the user loader is present if the move to the system # dir fails if not os.path.exists(autostart_home): os.makedirs(autostart_home) desktopfile = open(desktopfile_path, "w") desktopfile.write('[Desktop Entry]\n') desktopfile.write('Version=1.0\n') desktopfile.write('Encoding=UTF-8\n') desktopfile.write('Type=Application\n') desktopfile.write('Name=%s\n' % (appname + ' ICC Profile Loader').encode("UTF-8")) desktopfile.write('Comment=%s\n' % lang.getstr("calibrationloader.description", lcode="en").encode("UTF-8")) if lang.getcode() != "en": desktopfile.write(('Comment[%s]=%s\n' % (lang.getcode(), lang.getstr("calibrationloader.description"))).encode("UTF-8")) pyw = os.path.normpath(os.path.join(pydir, "..", appname + "-apply-profiles.pyw")) icon = appname.lower() + "-apply-profiles" if os.path.exists(pyw): # Running from source, or 0install/Listaller install # Check if this is a 0install implementation, in which # case we want to call 0launch with the appropriate # command if re.match("sha\d+(?:new)?", os.path.basename(os.path.dirname(pydir))): executable = ("0launch --console --offline " "--command=run-apply-profiles " "http://%s/0install/%s.xml" % (domain.lower(), appname)) else: icon = os.path.join(pydir, "theme", "icons", "256x256", appname.lower() + "-apply-profiles.png") executable = pyw else: # Regular install executable = appname.lower() + "-apply-profiles" desktopfile.write('Icon=%s\n' % icon.encode("UTF-8")) desktopfile.write('Exec=%s\n' % executable.encode("UTF-8")) desktopfile.write('Terminal=false\n') desktopfile.close() except Exception, exception: if not silent: result = Warning(lang.getstr("error.autostart_creation", desktopfile_path) + "\n" + safe_unicode(exception)) else: if getcfg("profile.install_scope") == "l" and autostart: # Move system-wide loader if (self.exec_cmd("mkdir", ["-p", autostart], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) is not True or self.exec_cmd("mv", ["-f", desktopfile_path, system_desktopfile_path], capture_output=True, low_contrast=False, skip_scripts=True, silent=True, asroot=True) is not True) and \ not silent: result = Warning(lang.getstr("error.autostart_creation", system_desktopfile_path)) return result def instrument_supports_ccss(self, instrument_name=None): """ Return whether instrument supports CCSS files or not """ if not instrument_name: instrument_name = self.get_instrument_name() return ("i1 DisplayPro, ColorMunki Display" in instrument_name or "Spyder4" in instrument_name or "Spyder5" in instrument_name) def create_ccxx(self, args=None, working_dir=None): """ Create CCMX or CCSS """ if not args: args = [] cmd = get_argyll_util("ccxxmake") if not "-I" in args: # Display manufacturer & name name = self.get_display_name(True) if name: args.insert(0, "-I") args.insert(1, name) elif not "-T" in args: # Display technology args.insert(0, "-T") displaytech = ["LCD" if getcfg("measurement_mode") == "l" else "CRT"] if (self.get_instrument_features().get("projector_mode") and getcfg("measurement_mode.projector")): displaytech.append("Projector") args.insert(1, " ".join(displaytech)) if not getcfg("ccmx.use_four_color_matrix_method"): args.insert(0, "-v") return self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, silent=False, working_dir=working_dir) def create_gamut_views(self, profile_path): """ Generate gamut views (VRML files) and show progress in current progress dialog """ if getcfg("profile.create_gamut_views"): self.log("-" * 80) self.log(lang.getstr("gamut.view.create")) self.lastmsg.clear() self.recent.clear() self.recent.write(lang.getstr("gamut.view.create")) sleep(.75) # Allow time for progress window to update return self.calculate_gamut(profile_path) else: return None, None def create_profile(self, dst_path=None, skip_scripts=False, display_name=None, display_manufacturer=None, tags=None): """ Create an ICC profile and process the generated file """ safe_print(lang.getstr("create_profile")) if dst_path is None: dst_path = os.path.join(getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded") + profile_ext) cmd, args = self.prepare_colprof( os.path.basename(os.path.splitext(dst_path)[0]), display_name, display_manufacturer, tags) if not isinstance(cmd, Exception): profile = None profile_path = args[-1] + profile_ext if "-aX" in args: # If profile type is X (XYZ cLUT + matrix), only create the # cLUT, then add the matrix tags later from a forward lookup of # a smaller testchart (faster computation!) args.insert(args.index("-aX"), "-ax") args.remove("-aX") is_regular_grid = False is_primaries_only = False if getcfg("profile.type") in ("X", "x", "S", "s"): # Check if TI3 RGB matches one of our regular grid or # primaries + gray charts ti3 = CGATS.CGATS(args[-1] + ".ti3") (ti3_extracted, ti3_RGB_XYZ, ti3_remaining) = extract_device_gray_primaries(ti3) for ti1_name in ("ti1/d3-e4-s2-g28-m0-b0-f0", # Primaries + gray "ti1/d3-e4-s3-g52-m3-b0-f0", # 3^3 grid "ti1/d3-e4-s4-g52-m4-b0-f0", # 4^3 grid "ti1/d3-e4-s5-g52-m5-b0-f0", # 5^3 grid "ti1/d3-e4-s9-g52-m9-b0-f0", # 9^3 grid "ti1/d3-e4-s17-g52-m17-b0-f0"): # 17^3 grid ti1_filename = "%s.ti1" % ti1_name ti1_path = get_data_path(ti1_filename) if not ti1_path: if ti1_name in ("ti1/d3-e4-s2-g28-m0-b0-f0", "ti1/d3-e4-s3-g52-m3-b0-f0", "ti1/d3-e4-s4-g52-m4-b0-f0", "ti1/d3-e4-s5-g52-m5-b0-f0"): return Error(lang.getstr("file.missing", ti1_filename)) else: continue ti1 = CGATS.CGATS(ti1_path) (ti1_extracted, ti1_RGB_XYZ, ti1_remaining) = extract_device_gray_primaries(ti1) # Quantize to 8 bit for comparison # XXX Note that round(50 * 2.55) = 127, but # round(50 / 100 * 255) = 128 (the latter is what we want)! if (sorted(tuple(round(v / 100.0 * 255) for v in RGB) for RGB in ti3_remaining.keys()) == sorted(tuple(round(v / 100.0 * 255) for v in RGB) for RGB in ti1_remaining.keys())): if ti1_name == "ti1/d3-e4-s2-g28-m0-b0-f0": is_primaries_only = True elif getcfg("profile.type") in ("X", "x"): is_regular_grid = True break if not display_name: arg = get_arg("-M", args, True) if arg and len(args) - 1 > arg[0]: display_name = args[arg[0] + 1] if not display_manufacturer: arg = get_arg("-A", args, True) if arg and len(args) - 1 > arg[0]: display_manufacturer = args[arg[0] + 1] if is_regular_grid: # Use our own forward profile code profile = self.create_RGB_XYZ_cLUT_fwd_profile(ti3, os.path.basename(args[-1]), getcfg("copyright"), display_manufacturer, display_name, self.log) if getcfg("profile.type") == "x": # Swapped matrix - need to create it ourselves # Start with sRGB sRGB = profile.from_named_rgb_space("sRGB") for channel in "rgb": tagname = channel + "TRC" profile.tags[tagname] = sRGB.tags[tagname] # Swap RGB -> BRG profile.tags.rXYZ = sRGB.tags.bXYZ profile.tags.gXYZ = sRGB.tags.rXYZ profile.tags.bXYZ = sRGB.tags.gXYZ elif not is_primaries_only: # Use colprof to create profile result = self.exec_cmd(cmd, args, low_contrast=False, skip_scripts=skip_scripts) if (is_regular_grid and getcfg("profile.type") == "X") or is_primaries_only: # Use our own accurate matrix self.log("-" * 80) self.log("Creating matrix from primaries") xy = [] for R, G, B in [(100, 0, 0), (0, 100, 0), (0, 0, 100), (100, 100, 100)]: if R == G == B: RGB_XYZ = ti3_RGB_XYZ else: RGB_XYZ = ti3_remaining xy.append(colormath.XYZ2xyY(*(v / 100 for v in RGB_XYZ[(R, G, B)]))[:2]) mtx = ICCP.ICCProfile.from_chromaticities(xy[0][0], xy[0][1], xy[1][0], xy[1][1], xy[2][0], xy[2][1], xy[3][0], xy[3][1], 2.2, # Will be replaced os.path.basename(args[-1]), getcfg("copyright"), display_manufacturer, display_name) if is_primaries_only: # Use matrix profile profile = mtx # Add luminance tag luminance_XYZ_cdm2 = ti3.queryv1("LUMINANCE_XYZ_CDM2") if luminance_XYZ_cdm2: profile.tags.lumi = ICCP.XYZType(profile=profile) profile.tags.lumi.Y = float(luminance_XYZ_cdm2.split()[1]) # Add blackpoint tag profile.tags.bkpt = ICCP.XYZType(profile=profile) black_XYZ = [v / 100.0 for v in ti3_RGB_XYZ[(0, 0, 0)]] (profile.tags.bkpt.X, profile.tags.bkpt.Y, profile.tags.bkpt.Z) = black_XYZ # Check if we have calibration, if so, add vcgt for cgats in ti3.itervalues(): if cgats.type == "CAL": profile.tags.vcgt = cal_to_vcgt(cgats) else: # Add matrix tags to cLUT profile for tagcls in ("XYZ", "TRC"): for channel in "rgb": tagname = channel + tagcls profile.tags[tagname] = mtx.tags[tagname] if is_regular_grid or is_primaries_only: # Write profile profile.write(profile_path) result = True if (os.path.isfile(args[-1] + ".ti3.backup") and os.path.isfile(args[-1] + ".ti3")): # Restore backed up TI3 os.rename(args[-1] + ".ti3", args[-1] + ".bpc.ti3") os.rename(args[-1] + ".ti3.backup", args[-1] + ".ti3") ti3_file = open(args[-1] + ".ti3", "rb") ti3 = ti3_file.read() ti3_file.close() elif not is_regular_grid and not is_primaries_only: ti3 = None if os.path.isfile(args[-1] + ".chrm"): # Get ChromaticityType tag with open(args[-1] + ".chrm", "rb") as blob: chrm = ICCP.ChromaticityType(blob.read()) else: chrm = None else: result = cmd bpc_applied = False profchanged = False if not isinstance(result, Exception) and result: errors = self.errors output = self.output retcode = self.retcode try: if not profile: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: result = Error(lang.getstr("profile.invalid") + "\n" + profile_path) else: # Do we have a B2A0 table? has_B2A = "B2A0" in profile.tags # Hires CIECAM02 gamut mapping - perceptual and saturation # tables, also colorimetric table for non-RGB profiles # Use collink for smoother result. # Only for XYZ LUT and if source profile is a simple matrix # profile, otherwise CIECAM02 tables will already have been # created by colprof gamap = ((getcfg("gamap_perceptual") or getcfg("gamap_saturation")) and getcfg("gamap_profile")) collink = None if ("A2B0" in profile.tags and profile.connectionColorSpace == "XYZ" and (gamap or profile.colorSpace != "RGB") and getcfg("profile.b2a.hires")): collink = get_argyll_util("collink") if not collink: self.log(lang.getstr("argyll.util.not_found", "collink")) gamap_profile = None if gamap and collink: try: gamap_profile = ICCP.ICCProfile(getcfg("gamap_profile")) except (IOError, ICCProfileInvalidError), exception: self.log(exception) else: if (not "A2B0" in gamap_profile.tags and "rXYZ" in gamap_profile.tags and "gXYZ" in gamap_profile.tags and "bXYZ" in gamap_profile.tags): # Simple matrix source profile. Change gamma to 1.0 gamap_profile.tags.rTRC = ICCP.CurveType() gamap_profile.tags.rTRC.append(1.0) gamap_profile.tags.gTRC = gamap_profile.tags.rTRC gamap_profile.tags.bTRC = gamap_profile.tags.rTRC # Write to temp file fd, gamap_profile.fileName = mkstemp_bypath(gamap_profile.fileName, dir=self.tempdir) stream = os.fdopen(fd, "wb") gamap_profile.write(stream) stream.close() if profile.colorSpace == "RGB" and has_B2A: # Only table 0 (colorimetric) in display profile. # Assign it to table 1 as per ICC spec to prepare # for adding table 0 (perceptual) and 2 (saturation) profile.tags.B2A1 = profile.tags.B2A0 else: gamap_profile = None tables = [] if gamap_profile or (collink and profile.colorSpace != "RGB"): self.log("-" * 80) self.log("Creating CIECAM02 gamut mapping using collink") size = getcfg("profile.b2a.hires.size") # Make sure to map 'auto' value (-1) to an actual size size = {-1: 33}.get(size, size) collink_args = ["-v", "-q" + getcfg("profile.quality"), "-G", "-r%i" % size] if is_regular_grid: # Do not preserve output shaper curves in devicelink collink_args.append("-no") for tableno, cfgname in [(0, "gamap_perceptual"), (2, "gamap_saturation")]: if getcfg(cfgname): tables.append((tableno, getcfg(cfgname + "_intent"))) if profile.colorSpace != "RGB": # Create colorimetric table for non-RGB profile tables.append((1, "r")) # Get inking rules from colprof extra args extra_args = getcfg("extra_args.colprof") inking = re.findall(r"-[Kk](?:[zhxr]|p[0-9\.\s]+)|" "-[Ll][0-9\.\s]+", extra_args) if inking: collink_args.extend(parse_argument_string(" ".join(inking))) for tableno, intent in tables: # Create device link(s) gamap_args = [] if tableno == 1: # Use PhotoPrintRGB as PCS if creating colorimetric # table for non-RGB profile. # PhotoPrintRGB is a synthetic linear gamma space # with the Rec2020 red and blue adapted to D50 # and a green of x 0.1292 (same as blue x) y 0.8185 # It almost completely encompasses PhotoGamutRGB pcs = get_data_path("ref/PhotoPrintRGB.icc") if pcs: try: gamap_profile = ICCP.ICCProfile(pcs) except (IOError, ICCProfileInvalidError), exception: self.log(exception) else: missing = lang.getstr("file.missing", "ref/PhotoPrintRGB.icc") if gamap_profile: self.log(missing) else: result = Error(missing) break else: if getcfg("gamap_src_viewcond"): gamap_args.append("-c" + getcfg("gamap_src_viewcond")) if getcfg("gamap_out_viewcond"): gamap_args.append("-d" + getcfg("gamap_out_viewcond")) link_profile = tempfile.mktemp(profile_ext, dir=self.tempdir) result = self.exec_cmd(collink, collink_args + gamap_args + ["-i" + intent, gamap_profile.fileName, profile_path, link_profile], sessionlogfile=self.sessionlogfile) if not isinstance(result, Exception) and result: try: link_profile = ICCP.ICCProfile(link_profile) except (IOError, ICCP.ICCProfileInvalidError), exception: self.log(exception) continue table = "B2A%i" % tableno profile.tags[table] = link_profile.tags.A2B0 # Remove temporary link profile os.remove(link_profile.fileName) # Update B2A matrix with source profile matrix matrix = colormath.Matrix3x3([[gamap_profile.tags.rXYZ.X, gamap_profile.tags.gXYZ.X, gamap_profile.tags.bXYZ.X], [gamap_profile.tags.rXYZ.Y, gamap_profile.tags.gXYZ.Y, gamap_profile.tags.bXYZ.Y], [gamap_profile.tags.rXYZ.Z, gamap_profile.tags.gXYZ.Z, gamap_profile.tags.bXYZ.Z]]) matrix.invert() scale = 1 + (32767 / 32768.0) matrix *= colormath.Matrix3x3(((scale, 0, 0), (0, scale, 0), (0, 0, scale))) profile.tags[table].matrix = matrix profchanged = True else: break elif (getcfg("profile.b2a.hires") and getcfg("profile.b2a.hires.smooth") and gamap): # Smooth existing B2A tables linebuffered_logfiles = [] if sys.stdout.isatty(): linebuffered_logfiles.append(safe_print) else: linebuffered_logfiles.append(log) if self.sessionlogfile: linebuffered_logfiles.append(self.sessionlogfile) logfiles = Files([LineBufferedStream( FilteredStream(Files(linebuffered_logfiles), enc, discard="", linesep_in="\n", triggers=[])), self.recent, self.lastmsg]) smooth_tables = [] for tableno in (0, 2): table = profile.tags.get("B2A%i" % tableno) if table in smooth_tables: continue if self.smooth_B2A(profile, tableno, getcfg("profile.b2a.hires.diagpng") and 2, logfile=logfiles): smooth_tables.append(table) profchanged = True self.errors = errors self.output = output self.retcode = retcode if not isinstance(result, Exception) and result: if (gamap_profile and os.path.dirname(gamap_profile.fileName) == self.tempdir): # Remove temporary source profile os.remove(gamap_profile.fileName) if profchanged and tables: # Make sure we match Argyll colprof i.e. have a complete # set of tables if not "A2B1" in profile.tags: profile.tags.A2B1 = profile.tags.A2B0 if not "A2B2" in profile.tags: profile.tags.A2B2 = profile.tags.A2B0 # A2B processing process_A2B = ("A2B0" in profile.tags and profile.colorSpace == "RGB" and profile.connectionColorSpace in ("XYZ", "Lab") and (getcfg("profile.b2a.hires") or getcfg("profile.quality.b2a") in ("l", "n") or not has_B2A)) if process_A2B: if getcfg("profile.black_point_compensation"): XYZbp = (0, 0, 0) elif getcfg("profile.black_point_correction") < 1: # Correct black point a* b* and make neutral hues near # black blend over to the new blackpoint. The correction # factor determines the amount of the measured black hue # that should be retained. # It makes the profile slightly less accurate near # black, but the effect is negligible and the visual # benefit is of greater importance (allows for # calibration blackpoint hue correction to have desired # effect, and makes relcol with BPC visually match # perceptual in Photoshop). try: odata = self.xicclu(profile, (0, 0, 0), pcs="l") if len(odata) != 1 or len(odata[0]) != 3: raise ValueError("Blackpoint is invalid: %s" % odata) except Exception, exception: self.log(exception) XYZbp = None else: bpcorr = getcfg("profile.black_point_correction") Labbp = (odata[0][0], odata[0][1] * bpcorr, odata[0][2] * bpcorr) XYZbp = colormath.Lab2XYZ(*Labbp) else: XYZbp = None if XYZbp: if "A2B1" in profile.tags: table = "A2B1" else: table = "A2B0" if isinstance(profile.tags[table], ICCP.LUT16Type): if getcfg("profile.black_point_compensation"): logmsg = "Applying black point compensation to" else: logmsg = ("Applying %i%% black point " "correction to" % (bpcorr * 100)) self.log("%s %s table" % (logmsg, table)) try: profile.tags[table].apply_black_offset(XYZbp, self.get_logfiles(), self.thread_abort, lang.getstr("aborted")) except Exception, exception: result = exception else: bpc_applied = True profchanged = True else: self.log("Can't change black point " "in non-LUT16Type %s " "table" % table) if (getcfg("profile.b2a.hires") or not has_B2A): if profchanged: # We need to write the changed profile before # enhancing B2A resolution! try: profile.write() except Exception, exception: return exception result = self.update_profile_B2A(profile) if not isinstance(result, Exception) and result: profchanged = True if profchanged and tables: # Make sure we match Argyll colprof i.e. have a complete # set of tables if profile.colorSpace != "RGB": if len(tables) == 1: # We only created a colorimetric table, the # others are still low quality. Assign # colorimetric table profile.tags.B2A0 = profile.tags.B2A1 if len(tables) < 3: # We only created colorimetric and/or perceptual # tables, saturation table is still low quality. # Assign perceptual table profile.tags.B2A2 = profile.tags.B2A0 if not "B2A2" in profile.tags: profile.tags.B2A2 = profile.tags.B2A0 # If profile type is X (XYZ cLUT + matrix) add the matrix tags # from a lookup of a smaller testchart or A2B/B2A (faster # computation!). If profile is a shaper+matrix profile, # re-generate shaper curves from testchart with only # gray+primaries (better curve smoothness and neutrality) # Make sure we do this *after* all changes on the A2B/B2A tables # are done, because we may end up using them for lookup! if getcfg("profile.type") in ("X", "s", "S"): if getcfg("profile.type") == "X": if (not isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType) or profile.tags.vcgt.is_linear() or getattr(self, "single_curve", None) is False): # Use matrix from 3x shaper curves profile if vcgt # is linear ptype = "s" if profchanged: # We need to write the changed profile before # creating TRC tags because we will be using # lookup through A2B/B2A table! try: profile.write() except Exception, exception: return exception else: # Use matrix from single shaper curve profile if # vcgt is nonlinear ptype = "S" if is_regular_grid or is_primaries_only: omit = "XYZ" # Don't re-create matrix else: omit = None else: ptype = getcfg("profile.type") omit = "XYZ" # Don't re-create matrix result = self._create_matrix_profile(args[-1], profile, ptype, omit, getcfg("profile.black_point_compensation")) if isinstance(result, ICCP.ICCProfile): result = True profchanged = True if not isinstance(result, Exception) and result: if ("rTRC" in profile.tags and "gTRC" in profile.tags and "bTRC" in profile.tags and isinstance(profile.tags.rTRC, ICCP.CurveType) and isinstance(profile.tags.gTRC, ICCP.CurveType) and isinstance(profile.tags.bTRC, ICCP.CurveType) and ((getcfg("profile.black_point_compensation") and not "A2B0" in profile.tags) or (process_A2B and (getcfg("profile.b2a.hires") or not has_B2A))) and len(profile.tags.rTRC) > 1 and len(profile.tags.gTRC) > 1 and len(profile.tags.bTRC) > 1): self.log("-" * 80) for component in ("r", "g", "b"): self.log("Applying black point compensation to " "%sTRC" % component) profile.apply_black_offset((0, 0, 0), include_A2B=False, set_blackpoint=False) if getcfg("profile.black_point_compensation"): bpc_applied = True profchanged = True if profchanged and not isinstance(result, Exception) and result: if "bkpt" in profile.tags and bpc_applied: # We need to update the blackpoint tag try: odata = self.xicclu(profile, (0, 0, 0), intent="a", pcs="x") if len(odata) != 1 or len(odata[0]) != 3: raise ValueError("Blackpoint is invalid: %s" % odata) except Exception, exception: self.log(exception) else: (profile.tags.bkpt.X, profile.tags.bkpt.Y, profile.tags.bkpt.Z) = odata[0] # We need to write the changed profile try: profile.write() except Exception, exception: return exception if (bpc_applied or not has_B2A or getcfg("profile.type") in ("s", "S", "g", "G")): # We need to re-do profile self check self.exec_cmd(get_argyll_util("profcheck"), [args[-1] + ".ti3", args[-1] + profile_ext], capture_output=True, skip_scripts=True) # Get profile max and avg err to be later added to metadata # Argyll outputs the following: # Profile check complete, peak err = x.xxxxxx, avg err = x.xxxxxx, RMS = x.xxxxxx peak = None avg = None rms = None for line in self.output: if line.startswith("Profile check complete"): peak = re.search("(?:peak err|max\.) = (\d+(?:\.\d+))", line) avg = re.search("avg(?: err|\.) = (\d+(?:\.\d+))", line) rms = re.search("RMS = (\d+(?:\.\d+))", line) if peak: peak = peak.groups()[0] if avg: avg = avg.groups()[0] if rms: rms = rms.groups()[0] break if not isinstance(result, Exception) and result: (gamut_volume, gamut_coverage) = self.create_gamut_views(profile_path) self.log("-" * 80) if not isinstance(result, Exception) and result: result = self.update_profile(profile, ti3, chrm, tags, avg, peak, rms, gamut_volume, gamut_coverage, quality=getcfg("profile.quality")) result2 = self.wrapup(not isinstance(result, UnloggedInfo) and result, dst_path=dst_path) if isinstance(result2, Exception): if isinstance(result, Exception): result = Error(safe_unicode(result) + "\n\n" + safe_unicode(result2)) else: result = result2 elif not isinstance(result, Exception) and result: setcfg("last_cal_or_icc_path", dst_path) setcfg("last_icc_path", dst_path) return result def create_RGB_XYZ_cLUT_fwd_profile(self, ti3, description, copyright, manufacturer, model, logfn=None): """ Create a RGB to XYZ forward profile """ # Extract grays and remaining colors (ti3_extracted, RGB_XYZ, remaining) = extract_device_gray_primaries(ti3, True, logfn) bwd_matrix = colormath.Matrix3x3([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) # Check if we have calibration, if so, add vcgt vcgt = False options_dispcal = [] is_hq_cal = False for cgats in ti3.itervalues(): if cgats.type == "CAL": vcgt = cal_to_vcgt(cgats) options_dispcal = get_options_from_cal(cgats)[0] is_hq_cal = "qh" in options_dispcal dEs = [] RGB_XYZ.sort() for X, Y, Z in RGB_XYZ.itervalues(): if Y >= 1: X, Y, Z = colormath.adapt(X, Y, Z, RGB_XYZ[(100, 100, 100)]) L, a, b = colormath.XYZ2Lab(X, Y, Z) dE = colormath.delta(L, 0, 0, L, a, b, "00")["E"] dEs.append(dE) if debug or verbose > 1: self.log("L* %5.2f a* %5.2f b* %5.2f dE*00 %4.2f" % (L, a, b, dE)) dE_avg = sum(dEs) / len(dEs) dE_max = max(dEs) self.log("R=G=B (>= 1% luminance) dE*00 avg", dE_avg, "peak", dE_max) # Create profile profile = ICCP.ICCProfile() profile.setDescription(description) profile.setCopyright(copyright) if manufacturer: profile.setDeviceManufacturerDescription(manufacturer) if model: profile.setDeviceModelDescription(model) luminance_XYZ_cdm2 = ti3.queryv1("LUMINANCE_XYZ_CDM2") if luminance_XYZ_cdm2: profile.tags.lumi = ICCP.XYZType(profile=profile) profile.tags.lumi.Y = float(luminance_XYZ_cdm2.split()[1]) profile.tags.wtpt = ICCP.XYZType(profile=profile) white_XYZ = [v / 100.0 for v in RGB_XYZ[(100, 100, 100)]] (profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z) = white_XYZ profile.tags.bkpt = ICCP.XYZType(profile=profile) black_XYZ = [v / 100.0 for v in RGB_XYZ[(0, 0, 0)]] (profile.tags.bkpt.X, profile.tags.bkpt.Y, profile.tags.bkpt.Z) = black_XYZ # Check if we have calibration, if so, add vcgt if vcgt: profile.tags.vcgt = vcgt # Interpolate shaper curves from grays - returned curves are adapted # to D50 self.single_curve = round(dE_max, 2) <= 1.25 and round(dE_avg, 2) <= 0.5 if self.single_curve: self.log("Got high quality calibration, using single device to PCS " "shaper curve for cLUT") gray = create_shaper_curves(RGB_XYZ, bwd_matrix, self.single_curve, getcfg("profile.black_point_compensation"), logfn, profile=profile, options_dispcal=options_dispcal, optimize=self.single_curve) curves = [curve[:] for curve in gray] # Add black back in XYZbp = [v / 100.0 for v in colormath.adapt(*RGB_XYZ[(0, 0, 0)], whitepoint_source=RGB_XYZ[(100, 100, 100)])] for i in xrange(len(gray[0])): (gray[0][i], gray[1][i], gray[2][i]) = colormath.apply_bpc(*(curve[i] for curve in gray), bp_in=(0, 0, 0), bp_out=XYZbp) def get_XYZ_from_curves(n, m): # Curves are adapted to D50 XYZ1 = [curve[int(math.floor((len(curve) - 1.0) / m * n))] for curve in gray] XYZ2 = [curve[int(math.ceil((len(curve) - 1.0) / m * n))] for curve in gray] return [(XYZ1[i] + XYZ2[i]) / 2.0 for i in xrange(3)] # Quantize RGB to make lookup easier # XXX Note that round(50 * 2.55) = 127, but # round(50 / 100 * 255) = 128 (the latter is what we want)! remaining = OrderedDict([(tuple(round(k / 100.0 * 255) for k in RGB), XYZ) for RGB, XYZ in remaining.iteritems()]) # Need to sort so columns increase (fastest to slowest) B G R remaining.sort() # Build initial cLUT # Try to fill a 5x5x5 or 3x3x3 cLUT clut_actual = 0 for iclutres in (17, 9, 5, 4, 3): clut = [] step = 100 / (iclutres - 1.0) for a in xrange(iclutres): for b in xrange(iclutres): clut.append([]) for c in xrange(iclutres): # XXX Note that round(50 * 2.55) = 127, but # round(50 / 100 * 255) = 128 (the latter is what we want)! RGB = tuple(round((k * step) / 100.0 * 255) for k in (a, b, c)) # Prefer actual measurements over interpolated values XYZ = remaining.get(RGB) if not XYZ: if a == b == c: # Fall back to interpolated values for gray # (already black scaled) XYZ = get_XYZ_from_curves(a, iclutres - 1) # Range 0..1 clut[-1].append(XYZ) elif iclutres > 3: # Try next smaller cLUT res break else: raise ValueError("Measurement data is missing " "RGB %.4f %.4f %.4f" % RGB) else: clut_actual += 1 X, Y, Z = (v / 100.0 for v in XYZ) ### Need to black scale actual measurements ##X, Y, Z = colormath.blend_blackpoint(X, Y, Z, ##black_XYZ) # Range 0..1 clut[-1].append(colormath.adapt(X, Y, Z, white_XYZ)) if c < iclutres - 1: break if b < iclutres - 1: break if a == iclutres - 1: break self.log("Initial cLUT resolution %ix%ix%i" % ((iclutres,) * 3)) profile.tags.A2B0 = ICCP.create_RGB_A2B_XYZ(curves, clut) # Interpolate to higher cLUT resolution quality = getcfg("profile.quality") clutres = {"m": 17, "l": 9}.get(quality, 33) # XXX: Need to implement proper 3D interpolation if clutres > iclutres: # Lookup input RGB to interpolated XYZ RGB_in = [] step = 100 / (clutres - 1.0) for a in xrange(clutres): for b in xrange(clutres): for c in xrange(clutres): RGB_in.append([a * step, b * step, c * step]) XYZ_out = self.xicclu(profile, RGB_in, "a", pcs="X", scale=100) profile.fileName = None # Create new cLUT clut = [] i = -1 actual = 0 interpolated = 0 for a in xrange(clutres): for b in xrange(clutres): clut.append([]) for c in xrange(clutres): # XXX Note that round(50 * 2.55) = 127, but # round(50 / 100 * 255) = 128 (the latter is what we want)! RGB = tuple(round((k * step) / 100.0 * 255) for k in (a, b, c)) # Prefer actual measurements over interpolated values prev_actual = actual XYZ = remaining.get(RGB) i += 1 if not XYZ: # Fall back to interpolated values # (already black scaled) if a == b == c: XYZ = get_XYZ_from_curves(a, clutres - 1) # Range 0..1 clut[-1].append(XYZ) continue else: XYZ = XYZ_out[i] interpolated += 1 else: actual += 1 X, Y, Z = (v / 100.0 for v in XYZ) ##if actual > prev_actual: ### Need to black scale actual measurements ##X, Y, Z = colormath.blend_blackpoint(X, Y, Z, ##black_XYZ) # Range 0..1 clut[-1].append(colormath.adapt(X, Y, Z, white_XYZ)) if actual > clut_actual: # Did we get any additional actual measured cLUT points? self.log("cLUT resolution %ix%ix%i: Got %i " "additional values from actual measurements" % (clutres, clutres, clutres, actual - clut_actual)) profile.tags.A2B0 = ICCP.create_RGB_A2B_XYZ(curves, clut) clut_actual = actual self.log("Final interpolated cLUT resolution %ix%ix%i" % ((len(profile.tags.A2B0.clut[0]),) * 3)) profile.tags.A2B0.profile = profile ### Add black back in ##black_XYZ_D50 = colormath.adapt(*black_XYZ, whitepoint_source=white_XYZ) ##profile.tags.A2B0.apply_black_offset(black_XYZ_D50) return profile def _create_matrix_profile(self, outname, profile=None, ptype="s", omit=None, bpc=False): """ Create matrix profile from lookup through ti3 .ti3 has to exist. If is given, it has to be an ICCProfile instance, and the matrix tags will be added to this profile. should be the type of profile, i.e. one of g, G, s or S. if given should be the tag to omit, either 'TRC' or 'XYZ'. We use a testchart with only gray + primaries for TRC, and larger testchart for the matrix. This should give the smoothest overall result. Returns an ICCProfile with fileName set to .ic[cm]. """ if omit == "XYZ": tags = "shaper" else: tags = "shaper+matrix" self.log("-" * 80) self.log(u"Creating %s tags in separate step" % tags) fakeread = get_argyll_util("fakeread") if not fakeread: return Error(lang.getstr("argyll.util.not_found", "fakeread")) colprof = get_argyll_util("colprof") if not colprof: return Error(lang.getstr("argyll.util.not_found", "colprof")) # Strip potential CAL from Ti3 try: oti3 = CGATS.CGATS(outname + ".ti3") except (IOError, CGATS.CGATSError), exception: return exception else: if 0 in oti3: ti3 = oti3[0] ti3.filename = oti3.filename # So we can log the name ti3.fix_zero_measurements(logfile=self.get_logfiles(False)) else: return Error(lang.getstr("error.measurement.file_invalid", outname + ".ti3")) for ti1name, tagcls in [("d3-e4-s3-g52-m3-b0-f0", "XYZ"), (None, "TRC")]: if tagcls == omit: continue elif (tagcls == "TRC" and profile and "A2B0" in profile.tags and ptype == "s"): # Create TRC from forward lookup through A2B numentries = 256 maxval = numentries - 1.0 RGBin = [] for i in xrange(numentries): RGBin.append((i / maxval, ) * 3) if "B2A0" in profile.tags: # Inverse backward direction = "ib" else: # Forward direction = "f" XYZout = self.xicclu(profile, RGBin, "p", direction, pcs="x") # Get RGB space from already added matrix column tags rgb_space = colormath.get_rgb_space(profile.get_rgb_space("pcs", 1)) mtx = rgb_space[-1].inverted() self.log("-" * 80) for channel in "rgb": tagname = channel + tagcls self.log(u"Adding %s from %s lookup to %s" % (tagname, {"f": "forward A2B0", "ib": "inverse backward B2A0"}.get(direction), profile.getDescription())) profile.tags[tagname] = ICCP.CurveType() for XYZ in XYZout: RGB = mtx * XYZ for i, channel in enumerate("rgb"): tagname = channel + tagcls profile.tags[tagname].append(min(max(RGB[i], 0), 1) * 65535) break if not ti1name: # Extract gray+primaries into new TI3 (ti3, RGB_XYZ, remaining) = extract_device_gray_primaries(ti3, tagcls == "TRC", self.log) ti3.sort_by_RGB() self.log(ti3.DATA) if tagcls == "TRC" and profile: rgb_space = colormath.get_rgb_space(profile.get_rgb_space("pcs")) fwd_mtx = rgb_space[-1] bwd_mtx = fwd_mtx.inverted() self.log("-" * 80) options_dispcal = get_options_from_ti3(oti3)[0] curves = create_shaper_curves(RGB_XYZ, bwd_mtx, ptype == "S", bpc, self.log, profile=profile, options_dispcal=options_dispcal, optimize=ptype == "S") for i, channel in enumerate("rgb"): tagname = channel + tagcls self.log(u"Adding %s from interpolation to %s" % (tagname, profile.getDescription())) profile.tags[tagname] = trc = ICCP.CurveType(profile=profile) trc[:] = [v * 65535 for v in curves[i]] if not bpc: XYZbp = None for (R, G, B), (X, Y, Z) in RGB_XYZ.iteritems(): if R == G == B == 0: XYZbp = [v / 100 for v in (X, Y, Z)] XYZbp = colormath.adapt(*XYZbp, whitepoint_source=RGB_XYZ[(100, 100, 100)]) if XYZbp: # Add black back in profile.apply_black_offset(XYZbp, include_A2B=False) if ptype == "S": # Single curve profile.tags["rTRC"][:] = profile.tags["gTRC"][:] profile.tags["bTRC"][:] = profile.tags["gTRC"][:] break ti3.write(outname + ".0.ti3") if ti1name: ti1 = get_data_path("ti1/%s.ti1" % ti1name) if not ti1: return Error(lang.getstr("file.missing", "ti1/%s.ti1" % ti1name)) fakeout = outname + "." + ti1name try: shutil.copyfile(ti1, fakeout + ".ti1") except EnvironmentError, exception: return exception # Lookup ti1 through ti3 result = self.exec_cmd(fakeread, [outname + ".0.ti3", fakeout], capture_output=True, skip_scripts=True, sessionlogfile=self.sessionlogfile) try: os.remove(fakeout + ".ti1") except EnvironmentError, exception: self.log(exception) if not result: return UnloggedError("\n".join(self.errors)) elif isinstance(result, Exception): return result try: os.remove(outname + ".0.ti3") except EnvironmentError, exception: self.log(exception) else: # Use gray+primaries from existing ti3 fakeout = outname + ".0" result = self.exec_cmd(colprof, ["-v", "-q" + getcfg("profile.quality"), "-a" + ptype, fakeout], sessionlogfile=self.sessionlogfile) try: os.remove(fakeout + ".ti3") except EnvironmentError, exception: self.log(exception) if isinstance(result, Exception) or not result: return result try: matrix_profile = ICCP.ICCProfile(fakeout + profile_ext) except (IOError, ICCP.ICCProfileInvalidError), exception: return Error(lang.getstr("profile.invalid") + "\n" + fakeout + profile_ext) if profile: self.log("-" * 80) for channel in "rgb": tagname = channel + tagcls tag = matrix_profile.tags.get(tagname) if tag: self.log(u"Adding %s from matrix profile to %s" % (tagname, profile.getDescription())) profile.tags[tagname] = tag else: self.log(lang.getstr("profile.required_tags_missing", tagname)) else: profile = matrix_profile profile.fileName = outname + profile_ext try: os.remove(fakeout + profile_ext) except EnvironmentError, exception: self.log(exception) return profile def update_profile(self, profile, ti3=None, chrm=None, tags=None, avg=None, peak=None, rms=None, gamut_volume=None, gamut_coverage=None, quality=None): """ Update profile tags and metadata """ if isinstance(profile, basestring): profile_path = profile try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: return Error(lang.getstr("profile.invalid") + "\n" + profile_path) else: profile_path = profile.fileName if (profile.profileClass == "mntr" and profile.colorSpace == "RGB" and not (self.tempdir and profile_path.startswith(self.tempdir))): setcfg("last_cal_or_icc_path", profile_path) setcfg("last_icc_path", profile_path) if ti3: # Embed original TI3 profile.tags.targ = profile.tags.DevD = profile.tags.CIED = ICCP.TextType( "text\0\0\0\0" + str(ti3) + "\0", "targ") if chrm: # Add ChromaticityType tag profile.tags.chrm = chrm # Fixup desc tags - ASCII needs to be 7-bit # also add Unicode strings if different from ASCII if "desc" in profile.tags and isinstance(profile.tags.desc, ICCP.TextDescriptionType): profile.setDescription(profile.getDescription()) if "dmdd" in profile.tags and isinstance(profile.tags.dmdd, ICCP.TextDescriptionType): profile.setDeviceModelDescription( profile.getDeviceModelDescription()) if "dmnd" in profile.tags and isinstance(profile.tags.dmnd, ICCP.TextDescriptionType): profile.setDeviceManufacturerDescription( profile.getDeviceManufacturerDescription()) if tags and tags is not True: # Add custom tags for tagname, tag in tags.iteritems(): if tagname == "mmod": profile.device["manufacturer"] = "\0\0" + tag["manufacturer"][1] + tag["manufacturer"][0] profile.device["model"] = "\0\0" + tag["model"][0] + tag["model"][1] profile.tags[tagname] = tag elif tags is True: edid = self.get_display_edid() if edid: profile.device["manufacturer"] = "\0\0" + edid["edid"][9] + edid["edid"][8] profile.device["model"] = "\0\0" + edid["edid"][11] + edid["edid"][10] # Add Apple-specific 'mmod' tag (TODO: need full spec) mmod = ("mmod" + ("\x00" * 6) + edid["edid"][8:10] + ("\x00" * 2) + edid["edid"][11] + edid["edid"][10] + ("\x00" * 4) + ("\x00" * 20)) profile.tags.mmod = ICCP.ICCProfileTag(mmod, "mmod") # Add new meta information based on EDID profile.set_edid_metadata(edid) elif not "meta" in profile.tags: # Make sure meta tag exists profile.tags.meta = ICCP.DictType() profile.tags.meta.update({"CMF_product": appname, "CMF_binary": appname, "CMF_version": version}) # Set license profile.tags.meta["License"] = getcfg("profile.license") # Set profile quality quality = {"v": "very low", "l": "low", "m": "medium", "h": "high"}.get(quality) if quality: profile.tags.meta["Quality"] = quality # Set OPENICC_automatic_generated to "0" profile.tags.meta["OPENICC_automatic_generated"] = "0" # Set GCM DATA_source to "calib" profile.tags.meta["DATA_source"] = "calib" # Add instrument profile.tags.meta["MEASUREMENT_device"] = self.get_instrument_name().lower() spec_prefixes = "CMF_,DATA_,MEASUREMENT_,OPENICC_" # Add screen brightness if applicable if sys.platform not in ("darwin", "win32") and dbus_session: try: proxy = dbus_session.get_object("org.gnome.SettingsDaemon", "/org/gnome/SettingsDaemon/Power") iface = dbus.Interface(proxy, dbus_interface="org.gnome.SettingsDaemon.Power.Screen") brightness = iface.GetPercentage() except dbus.exceptions.DBusException: pass else: profile.tags.meta["SCREEN_brightness"] = str(brightness) spec_prefixes += ",SCREEN_" # Set device ID device_id = self.get_device_id(quirk=True, query=True) if device_id: profile.tags.meta["MAPPING_device_id"] = device_id spec_prefixes += ",MAPPING_" prefixes = (profile.tags.meta.getvalue("prefix", "", None) or spec_prefixes).split(",") for prefix in spec_prefixes.split(","): if not prefix in prefixes: prefixes.append(prefix) profile.tags.meta["prefix"] = ",".join(prefixes) if (avg, peak, rms) != (None, ) * 3: # Make sure meta tag exists if not "meta" in profile.tags: profile.tags.meta = ICCP.DictType() # Update meta prefix prefixes = (profile.tags.meta.getvalue("prefix", "", None) or "ACCURACY_").split(",") if not "ACCURACY_" in prefixes: prefixes.append("ACCURACY_") profile.tags.meta["prefix"] = ",".join(prefixes) # Add error info if avg is not None: profile.tags.meta["ACCURACY_dE76_avg"] = avg if peak is not None: profile.tags.meta["ACCURACY_dE76_max"] = peak if rms is not None: profile.tags.meta["ACCURACY_dE76_rms"] = rms profile.set_gamut_metadata(gamut_volume, gamut_coverage) # Set default rendering intent if ("B2A0" in profile.tags and ("B2A1" in profile.tags or "B2A2" in profile.tags)): profile.intent = {"p": 0, "r": 1, "s": 2, "a": 3}[getcfg("gamap_default_intent")] # Check if we need to video scale vcgt if isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType): try: cal = extract_cal_from_profile(profile, None, False) except Exception, exception: self.log(exception) else: white = False if cal: if cal.queryv1("TV_OUTPUT_ENCODING") == "YES": black, white = (16, 235) else: output_enc = cal.queryv1("OUTPUT_ENCODING") if output_enc: try: black, white = (float(v) for v in output_enc.split()) except (TypeError, ValueError): white = False if white and (black, white) != (0, 255): self.log("Need to scale vcgt to video levels (%s..%s)" % (black, white)) # Need to create videoscaled vcgt from calibration data = cal.queryv1("DATA") if data: self.log("Scaling vcgt to video levels (%s..%s)" % (black, white)) for entry in data.itervalues(): for column in "RGB": v_old = entry["RGB_" + column] # For video encoding the extra bits of # precision are created by bit shifting rather # than scaling, so we need to scale the fp # value to account for this newmin = (black / 256.0) * (65536 / 65535.) newmax = (white / 256.0) * (65536 / 65535.) v_new = colormath.convert_range(v_old, 0, 1, newmin, newmax) entry["RGB_" + column] = v_new profile.tags.vcgt = cal_to_vcgt(cal) else: self.log("Warning - no scaling applied - no " "calibration data!") # Calculate profile ID profile.calculateID() try: profile.write() except Exception, exception: return exception return True def get_logfiles(self, include_progress_buffers=True): linebuffered_logfiles = [] if sys.stdout.isatty(): linebuffered_logfiles.append(safe_print) else: linebuffered_logfiles.append(log) if self.sessionlogfile: linebuffered_logfiles.append(self.sessionlogfile) logfiles = LineBufferedStream( FilteredStream(Files(linebuffered_logfiles), enc, discard="", linesep_in="\n", triggers=[])) if include_progress_buffers: logfiles = Files([logfiles, self.recent, self.lastmsg]) return logfiles def update_profile_B2A(self, profile, generate_perceptual_table=True, clutres=None, smooth=None, rgb_space=None): # Use reverse A2B interpolation to generate B2A table if not clutres: if getcfg("profile.b2a.hires"): # Chosen resolution clutres = getcfg("profile.b2a.hires.size") elif getcfg("profile.quality.b2a") in "ln": # Low quality/resolution clutres = 9 else: # Medium quality/resolution clutres = 17 if smooth is None: smooth = getcfg("profile.b2a.hires.smooth") logfiles = self.get_logfiles() tables = [1] self.log("-" * 80) # Add perceptual tables if not present if "A2B0" in profile.tags and not "A2B1" in profile.tags: if not isinstance(profile.tags.A2B0, ICCP.LUT16Type): self.log("%s: Can't process non-LUT16Type A2B0 table" % appname) return [] try: # Copy A2B0 logfiles.write("Generating A2B1 by copying A2B0\n") profile.tags.A2B1 = profile.tags.A2B0 if "B2A0" in profile.tags: # Copy B2A0 B2A0 = profile.tags.B2A0 profile.tags.B2A1 = B2A1 = ICCP.LUT16Type(None, "B2A1", profile) B2A1.matrix = [] for row in B2A0.matrix: B2A1.matrix.append(list(row)) B2A1.input = [] B2A1.output = [] for table in ("input", "output"): for channel in getattr(B2A0, table): getattr(B2A1, table).append(list(channel)) B2A1.clut = [] for block in B2A0.clut: B2A1.clut.append([]) for row in block: B2A1.clut[-1].append(list(row)) except Exception, exception: return exception if not "A2B2" in profile.tags and generate_perceptual_table: # Argyll always creates a complete set of A2B / B2A tables if # colprof -s (perceptual) or -S (perceptual and saturation) is used, # so we can assume that if A2B2 is not present then it is safe to # re-generate B2A0 because it was not created by Argyll CMS. tables.append(0) # Invert A2B tables if present. Always invert colorimetric A2B table. rtables = [] filename = profile.fileName for tableno in tables: if "A2B%i" % tableno in profile.tags: if ("B2A%i" % tableno in profile.tags and profile.tags["B2A%i" % tableno] in rtables): continue if not isinstance(profile.tags["A2B%i" % tableno], ICCP.LUT16Type): self.log("%s: Can't process non-LUT16Type A2B%i table" % (appname, tableno)) continue # Check if we want to apply BPC bpc = tableno != 1 if (bpc and (profile.tags["A2B%i" % tableno].clut[0][0] != [0, 0, 0] or profile.tags["A2B%i" % tableno].input[0][0] != 0 or profile.tags["A2B%i" % tableno].input[1][0] != 0 or profile.tags["A2B%i" % tableno].input[2][0] != 0 or profile.tags["A2B%i" % tableno].output[0][0] != 0 or profile.tags["A2B%i" % tableno].output[1][0] != 0 or profile.tags["A2B%i" % tableno].output[2][0] != 0)): # Need to apply BPC table = ICCP.LUT16Type(profile=profile) # Copy existing B2A1 table matrix, cLUT and output curves table.matrix = rtables[0].matrix table.clut = rtables[0].clut table.output = rtables[0].output profile.tags["B2A%i" % tableno] = table elif bpc: # BPC not needed, copy existing B2A profile.tags["B2A%i" % tableno] = rtables[0] return rtables if not filename or not os.path.isfile(filename) or bpc: # Write profile to temp dir tempdir = self.create_tempdir() if isinstance(tempdir, Exception): return tempdir fd, profile.fileName = tempfile.mkstemp(profile_ext, dir=tempdir) stream = os.fdopen(fd, "wb") profile.write(stream) stream.close() temp = True else: temp = False # Invert A2B try: result = self.generate_B2A_from_inverse_table(profile, clutres, "A2B", tableno, bpc, smooth, rgb_space, logfiles, filename, bpc) except (Error, Info), exception: return exception except Exception, exception: self.log(traceback.format_exc()) return exception else: if result: rtables.append(profile.tags["B2A%i" % tableno]) else: return False finally: if temp: os.remove(profile.fileName) profile.fileName = filename return rtables def is_working(self): """ Check if any Worker instance is busy. Return True or False. """ for worker in workers: if not getattr(worker, "finished", True): return True return False def start_measurement(self, consumer, apply_calibration=True, progress_msg="", resume=False, continue_next=False): """ Start a measurement and use a progress dialog for progress information """ self.start(consumer, self.measure, wkwargs={"apply_calibration": apply_calibration}, progress_msg=progress_msg, resume=resume, continue_next=continue_next, pauseable=True) def start_calibration(self, consumer, remove=False, progress_msg="", resume=False, continue_next=False): """ Start a calibration and use a progress dialog for progress information """ self.start(consumer, self.calibrate, wkwargs={"remove": remove}, progress_msg=progress_msg, resume=resume, continue_next=continue_next, interactive_frame="adjust", pauseable=True) def madtpg_init(self): if not hasattr(self, "madtpg"): if sys.platform == "win32" and getcfg("madtpg.native"): # Using native implementation (madHcNet32.dll) self.madtpg = madvr.MadTPG() else: # Using madVR net-protocol pure python implementation self.madtpg = madvr.MadTPG_Net() self.madtpg.debug = verbose def madtpg_connect(self): self.madtpg_init() self.patterngenerator = self.madtpg return self.madtpg.connect(method2=madvr.CM_StartLocalInstance) def madtpg_disconnect(self, restore_settings=True): """ Restore madVR settings and disconnect """ if restore_settings: restore_fullscreen = getattr(self, "madtpg_previous_fullscreen", None) restore_osd = getattr(self, "madtpg_osd", None) is False if restore_fullscreen or restore_osd: check = self.madtpg.get_version() if not check: check = self.madtpg_connect() if check: if restore_fullscreen: # Restore fullscreen if self.madtpg.set_use_fullscreen_button(True): self.log("Restored madTPG 'Fullscreen' button state") self.madtpg_previous_fullscreen = None else: self.log("Warning - could not restore madTPG " "'Fullscreen' button state") if restore_osd: # Restore disable OSD if self.madtpg.set_disable_osd_button(True): self.log("Restored madTPG 'Disable OSD' button state") self.madtpg_osd = None else: self.log("Warning - could not restore madTPG 'Disable " "OSD' button state") else: self.log("Warning - could not re-connect to madTPG to restore" "'Fullscreen'/'Disable OSD' button states") self.madtpg.disconnect() def measure(self, apply_calibration=True): """ Measure the configured testchart """ result = self.detect_video_levels() if isinstance(result, Exception): return result precond_ti1 = None precond_ti3 = None testchart_file = getcfg("testchart.file") auto = getcfg("testchart.auto_optimize") or 7 if testchart_file == "auto" and auto > 4: # Testchart auto-optimization # Create optimized testchart on-the-fly. To do this, create a # simple profile for preconditioning if config.get_display_name() == "Untethered": return Error(lang.getstr("testchart.auto_optimize.untethered.unsupported")) # Use small testchart for grayscale+primaries (34 patches) precond_ti1_path = get_data_path("ti1/d3-e4-s2-g28-m0-b0-f0.ti1") precond_ti1 = CGATS.CGATS(precond_ti1_path) setcfg("testchart.file", precond_ti1_path) cmd, args = self.prepare_dispread(apply_calibration) setcfg("testchart.file", "auto") if not isinstance(cmd, Exception): # Measure testchart result = self.exec_cmd(cmd, args) if not isinstance(result, Exception) and result: # Create preconditioning profile self.pauseable = False basename = args[-1] precond_ti3 = CGATS.CGATS(basename + ".ti3") precond_ti3.fix_zero_measurements(logfile=self.get_logfiles(False)) precond_ti3.write() cmd, args = get_argyll_util("colprof"), ["-v", "-qh", "-as", basename] result = self.exec_cmd(cmd, args) if not isinstance(result, Exception) and result: # Create optimized testchart if getcfg("use_fancy_progress"): # Fade out animation/sound self.cmdname = get_argyll_utilname("targen") # Allow time for fade out sleep(4) s = min(auto, 11) * 4 - 3 g = s * 3 - 2 f = get_total_patches(4, 4, s, g, auto, auto, 0) f += 120 cmd, args = (get_argyll_util("targen"), ["-v", "-d3", "-e4", "-s%i" % s, "-g%i" % g, "-m0", "-f%i" % f, "-A1.0"]) if self.argyll_version >= [1, 1]: args.append("-G") if self.argyll_version >= [1, 3, 3]: args.append("-N0.5") if self.argyll_version >= [1, 6]: args.extend(["-B4", "-b0"]) if self.argyll_version >= [1, 6, 2]: args.append("-V1.6") args.extend(["-c", basename + profile_ext, basename]) result = self.exec_cmd(cmd, args) self.pauseable = True else: result = cmd else: result = True if testchart_file == "auto" and auto < 5: # Use pre-baked testchart if auto == 1: testchart = "ti1/d3-e4-s2-g28-m0-b0-f0.ti1" elif auto == 2: testchart = "ti1/d3-e4-s3-g52-m3-b0-f0.ti1" elif auto == 3: testchart = "ti1/d3-e4-s4-g52-m4-b0-f0.ti1" else: testchart = "ti1/d3-e4-s5-g52-m5-b0-f0.ti1" testchart_path = get_data_path(testchart) if testchart_path: setcfg("testchart.file", testchart_path) else: result = Error(lang.getstr("not_found", testchart)) if not isinstance(result, Exception) and result: cmd, args = self.prepare_dispread(apply_calibration) if testchart_file == "auto": # Restore "auto" setting setcfg("testchart.file", "auto") else: cmd = result if not isinstance(cmd, Exception) and cmd: if config.get_display_name() == "Untethered": cmd, args2 = get_argyll_util("spotread"), ["-v", "-e"] if getcfg("extra_args.spotread").strip(): args2 += parse_argument_string(getcfg("extra_args.spotread")) result = self.add_measurement_features(args2, False, allow_nondefault_observer=is_ccxx_testchart()) if isinstance(result, Exception): return result else: args2 = args result = self.exec_cmd(cmd, args2) if not isinstance(result, Exception) and result: self.update_display_name_manufacturer(args[-1] + ".ti3") ti3 = args[-1] + ".ti3" if precond_ti3: # Add patches from preconditioning measurements ti3 = insert_ti_patches_omitting_RGB_duplicates(precond_ti3, ti3, self.log) options = {"OBSERVER": get_cfg_option_from_args("observer", "-Q", args[:-1])} ti3 = add_keywords_to_cgats(ti3, options) ti3.write() # Restore original TI1 ti1_orig = args[-1] + ".original.ti1" ti1 = args[-1] + ".ti1" if os.path.isfile(ti1_orig): try: if os.path.isfile(ti1): # Should always exist os.remove(ti1) os.rename(ti1_orig, ti1) except Exception, exception: self.log("Warning - could not restore " "backup of original TI1 file %s:" % safe_unicode(ti1_orig), exception) else: self.log("Restored backup of original TI1 file") if precond_ti1 and os.path.isfile(ti1): # Need to add precond TI1 patches to TI1. # Do this AFTER the measurements because we don't want to # measure precond patches twice. ti1 = insert_ti_patches_omitting_RGB_duplicates(precond_ti1, ti1, self.log) ti1.write() else: result = cmd result2 = self.wrapup(not isinstance(result, UnloggedInfo) and result, isinstance(result, Exception) or not result) if isinstance(result2, Exception): if isinstance(result, Exception): result = Error(safe_unicode(result) + "\n\n" + safe_unicode(result2)) else: result = result2 return result def ensure_patch_sequence(self, ti1, write=True): """ Ensure correct patch sequence of TI1 file Return either the changed CGATS object or the original path/TI1 """ patch_sequence = getcfg("testchart.patch_sequence") if patch_sequence != "optimize_display_response_delay": # Need to re-order patches if not isinstance(ti1, CGATS.CGATS): try: ti1 = CGATS.CGATS(ti1) except Exception, exception: self.log("Warning - could not process TI1 file %s:" % safe_unicode(ti1), exception) return ti1 self.log("Changing patch sequence:", lang.getstr("testchart." + patch_sequence)) if patch_sequence == "maximize_lightness_difference": result = ti1.checkerboard() elif patch_sequence == "maximize_rec709_luma_difference": result = ti1.checkerboard(CGATS.sort_by_rec709_luma) elif patch_sequence == "maximize_RGB_difference": result = ti1.checkerboard(CGATS.sort_by_RGB_sum) elif patch_sequence == "vary_RGB_difference": result = ti1.checkerboard(CGATS.sort_by_RGB, None, split_grays=True, shift=True) if not result: self.log("Warning - patch sequence was not changed") elif write: # Make a copy try: shutil.copyfile(ti1.filename, os.path.splitext(ti1.filename)[0] + ".original.ti1") except Exception, exception: self.log("Warning - could not make backup of TI1 file %s:" % safe_unicode(ti1.filename), exception) # Write new TI1 to original filename try: ti1.write() except Exception, exception: self.log("Warning - could not write TI1 file %s:" % safe_unicode(ti1.filename), exception) return ti1 def parse(self, txt): if not txt: return self.logger.info("%r" % txt) self.check_instrument_calibration(txt) self.check_instrument_place_on_screen(txt) self.check_instrument_sensor_position(txt) self.check_retry_measurement(txt) self.check_is_single_measurement(txt) self.check_spotread_result(txt) if self.cmdname in (get_argyll_utilname("dispcal"), get_argyll_utilname("dispread"), get_argyll_utilname("spotread")): if (self.cmdname == get_argyll_utilname("dispcal") and ", repeat" in txt.lower()): self.repeat = True elif ", ok" in txt.lower(): self.repeat = False if (re.search(r"Patch [2-9]\d* of ", txt, re.I) or (re.search(r"Patch \d+ of |The instrument can be removed from " "the screen", txt, re.I) and self.patch_count > 1) or ("Result is XYZ:" in txt and not isinstance(self.progress_wnd, UntetheredFrame))): if self.cmdname == get_argyll_utilname("dispcal") and self.repeat: if (getcfg("measurement.play_sound") and hasattr(self.progress_wnd, "sound_on_off_btn")): self.measurement_sound.safe_play() else: if (getcfg("measurement.play_sound") and (hasattr(self.progress_wnd, "sound_on_off_btn") or isinstance(self.progress_wnd, DisplayUniformityFrame) or getattr(self.progress_wnd, "Name", None) == "VisualWhitepointEditor")): self.commit_sound.safe_play() if hasattr(self.progress_wnd, "animbmp"): self.progress_wnd.animbmp.frame = 0 def setup_patterngenerator(self, logfile=None): pgname = config.get_display_name(None, True) if self.patterngenerator: # Use existing pattern generator instance self.patterngenerator.logfile = logfile self.patterngenerator.use_video_levels = getcfg("patterngenerator.use_video_levels") if hasattr(self.patterngenerator, "conn"): # Try to use existing connection try: self.patterngenerator_send((.5, ) * 3, True) except (socket.error, httplib.HTTPException), exception: self.log(exception) self.patterngenerator.disconnect_client() elif pgname == "Prisma": patterngenerator = PrismaPatternGeneratorClient self.patterngenerator = patterngenerator( host=getcfg("patterngenerator.prisma.host"), port=getcfg("patterngenerator.prisma.port"), use_video_levels=getcfg("patterngenerator.use_video_levels"), logfile=logfile) elif pgname == "Web @ localhost": patterngenerator = WebWinHTTPPatternGeneratorServer self.patterngenerator = patterngenerator( port=getcfg("webserver.portnumber"), logfile=logfile) elif pgname.startswith("Chromecast "): from chromecast_patterngenerator import ChromeCastPatternGenerator self.patterngenerator = ChromeCastPatternGenerator( name=self.get_display_name(), logfile=logfile) else: # Resolve if getcfg("patterngenerator.resolve") == "LS": patterngenerator = ResolveLSPatternGeneratorServer else: patterngenerator = ResolveCMPatternGeneratorServer self.patterngenerator = patterngenerator( port=getcfg("patterngenerator.resolve.port"), use_video_levels=getcfg("patterngenerator.use_video_levels"), logfile=logfile) @Property def patterngenerator(): def fget(self): pgname = config.get_display_name() return self._patterngenerators.get(pgname) def fset(self, patterngenerator): pgname = config.get_display_name() self._patterngenerators[pgname] = patterngenerator return locals() @property def patterngenerators(self): return self._patterngenerators def patterngenerator_send(self, rgb, raise_exceptions=False): """ Send RGB color to pattern generator """ if getattr(self, "abort_requested", False): return x, y, w, h, size = get_pattern_geometry() size = min(sum((w, h)) / 2.0, 1.0) if getcfg("measure.darken_background") or size == 1.0: bgrgb = (0, 0, 0) else: # Constant APL rgbl = sum([v * size for v in rgb]) bgrgb = [(1.0 - v * size) * (1.0 - size) for v in rgb] bgrgbl = sum(bgrgb) desired_apl = getcfg("patterngenerator.apl") apl = desired_apl * 3 bgrgb = [max(apl - max(rgbl - apl, 0.0), 0.0) / bgrgbl * v for v in bgrgb] self.log("%s: Sending RGB %.3f %.3f %.3f, background RGB %.3f %.3f %.3f, " "x %.4f, y %.4f, w %.4f, h %.4f" % ((appname, ) + tuple(rgb) + tuple(bgrgb) + (x, y, w, h))) try: self.patterngenerator.send(rgb, bgrgb, x=x, y=y, w=w, h=h) except Exception, exception: if raise_exceptions: raise else: self.exec_cmd_returnvalue = exception self.abort_subprocess() else: self.patterngenerator_sent_count += 1 self.log("%s: Patterngenerator sent count: %i" % (appname, self.patterngenerator_sent_count)) @Property def pauseable(): def fget(self): return self._pauseable def fset(self, pauseable): self._pauseable = pauseable self.pauseable_now = False return locals() def pause_continue(self): if not self.pauseable or not self.pauseable_now: return if (getattr(self.progress_wnd, "paused", False) and not getattr(self, "paused", False)): self.paused = True self.log("%s: Pausing..." % appname) self.safe_send("\x1b") elif (not getattr(self.progress_wnd, "paused", False) and getattr(self, "paused", False)): self.paused = False self.log("%s: Continuing..." % appname) self.safe_send(" ") def prepare_colprof(self, profile_name=None, display_name=None, display_manufacturer=None, tags=None): """ Prepare a colprof commandline. All options are read from the user configuration. Profile name and display name can be ovverridden by passing the corresponding arguments. """ if profile_name is None: profile_name = getcfg("profile.name.expanded") inoutfile = self.setup_inout(profile_name) if not inoutfile or isinstance(inoutfile, Exception): return inoutfile, None if not os.path.exists(inoutfile + ".ti3"): return Error(lang.getstr("error.measurement.file_missing", inoutfile + ".ti3")), None if not os.path.isfile(inoutfile + ".ti3"): return Error(lang.getstr("file_notfile", inoutfile + ".ti3")), None # cmd = get_argyll_util("colprof") args = [] args.append("-v") # verbose args.append("-q" + getcfg("profile.quality")) args.append("-a" + getcfg("profile.type")) gamap_args = args if getcfg("profile.type") in ["l", "x", "X"]: if getcfg("gamap_saturation"): gamap = "S" elif getcfg("gamap_perceptual"): gamap = "s" else: gamap = None gamap_profile = None if gamap and getcfg("gamap_profile"): # CIECAM02 gamut mapping - perceptual and saturation tables # Only for L*a*b* LUT or if source profile is not a simple matrix # profile, otherwise create hires CIECAM02 tables with collink try: gamap_profile = ICCP.ICCProfile(getcfg("gamap_profile")) except ICCProfileInvalidError, exception: self.log(exception) return Error(lang.getstr("profile.invalid") + "\n" + getcfg("gamap_profile")) except IOError, exception: return exception if (getcfg("profile.type") != "l" and getcfg("profile.b2a.hires") and not "A2B0" in gamap_profile.tags and "rXYZ" in gamap_profile.tags and "gXYZ" in gamap_profile.tags and "bXYZ" in gamap_profile.tags): self.log("-> Delegating CIECAM02 gamut mapping to collink") # Make a copy so we can store options without adding them # to actual colprof arguments gamap_args = [] gamap_profile = None gamap_args.append("-" + gamap) gamap_args.append(getcfg("gamap_profile")) gamap_args.append("-t" + getcfg("gamap_perceptual_intent")) if gamap == "S": gamap_args.append("-T" + getcfg("gamap_saturation_intent")) if getcfg("gamap_src_viewcond"): gamap_args.append("-c" + getcfg("gamap_src_viewcond")) if getcfg("gamap_out_viewcond"): gamap_args.append("-d" + getcfg("gamap_out_viewcond")) b2a_q = getcfg("profile.quality.b2a") if (getcfg("profile.b2a.hires") and getcfg("profile.type") in ("l", "x", "X") and not (gamap and gamap_profile)): # Disable B2A creation in colprof, B2A is handled # by A2B inversion code b2a_q = "n" if b2a_q and b2a_q != getcfg("profile.quality"): args.append("-b" + b2a_q) args.append("-C") args.append(getcfg("copyright").encode("ASCII", "asciize")) if getcfg("extra_args.colprof").strip(): args += parse_argument_string(getcfg("extra_args.colprof")) options_dispcal = [] if "-d3" in self.options_targen: # only add display desc and dispcal options if creating RGB profile options_dispcal = self.options_dispcal if len(self.displays): args.extend( self.update_display_name_manufacturer(inoutfile + ".ti3", display_name, display_manufacturer, write=False)) self.options_colprof = list(args) if gamap_args is not args: self.options_colprof.extend(gamap_args) args.append("-D") args.append(profile_name) args.append(inoutfile) # Add dispcal and colprof arguments to ti3 ti3 = add_options_to_ti3(inoutfile + ".ti3", options_dispcal, self.options_colprof) if ti3: color_rep = (ti3.queryv1("COLOR_REP") or "").split("_") # Prepare ChromaticityType tag self.log("-> Preparing ChromaticityType tag from TI3 colorants") colorants = ti3.get_colorants() if colorants and not None in colorants: chrm = ICCP.ChromaticityType() chrm.type = 0 for colorant in colorants: if color_rep[1] == "LAB": XYZ = colormath.Lab2XYZ(colorant["LAB_L"], colorant["LAB_A"], colorant["LAB_B"]) else: XYZ = (colorant["XYZ_X"], colorant["XYZ_Y"], colorant["XYZ_Z"]) chrm.channels.append(colormath.XYZ2xyY(*XYZ)[:-1]) with open(inoutfile + ".chrm", "wb") as blob: blob.write(chrm.tagData) self.log("-> Storing settings in TI3") # Black point compensation ti3[0].add_keyword("USE_BLACK_POINT_COMPENSATION", "YES" if getcfg("profile.black_point_compensation") else "NO") # Black point correction # NOTE that profile black point correction is not the same as # calibration black point correction! # See Worker.create_profile ti3[0].add_keyword("BLACK_POINT_CORRECTION", getcfg("profile.black_point_correction")) # Hires B2A with optional smoothing ti3[0].add_keyword("HIRES_B2A", "YES" if getcfg("profile.b2a.hires") else "NO") ti3[0].add_keyword("HIRES_B2A_SIZE", getcfg("profile.b2a.hires.size")) ti3[0].add_keyword("SMOOTH_B2A", "YES" if getcfg("profile.b2a.hires.smooth") else "NO") # Display update delay if getcfg("measure.override_min_display_update_delay_ms"): ti3[0].add_keyword("MIN_DISPLAY_UPDATE_DELAY_MS", getcfg("measure.min_display_update_delay_ms")) # Display settle time multiplier if getcfg("measure.override_display_settle_time_mult"): ti3[0].add_keyword("DISPLAY_SETTLE_TIME_MULT", getcfg("measure.display_settle_time_mult")) # Remove AUTO_OPTIMIZE if ti3[0].queryv1("AUTO_OPTIMIZE"): ti3[0].remove_keyword("AUTO_OPTIMIZE") # Patch sequence ti3[0].add_keyword("PATCH_SEQUENCE", getcfg("testchart.patch_sequence").upper()) # Add 3D LUT options if set, else remove them for keyword, cfgname in {"3DLUT_SOURCE_PROFILE": "3dlut.input.profile", "3DLUT_TRC": "3dlut.trc", "3DLUT_HDR_PEAK_LUMINANCE": "3dlut.hdr_peak_luminance", "3DLUT_HDR_MAXMLL": "3dlut.hdr_maxmll", "3DLUT_HDR_MINMLL": "3dlut.hdr_minmll", "3DLUT_HDR_AMBIENT_LUMINANCE": "3dlut.hdr_ambient_luminance", "3DLUT_HDR_DISPLAY": "3dlut.hdr_display", "3DLUT_GAMMA": "3dlut.trc_gamma", "3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET": "3dlut.trc_output_offset", "3DLUT_INPUT_ENCODING": "3dlut.encoding.input", "3DLUT_OUTPUT_ENCODING": "3dlut.encoding.output", "3DLUT_GAMUT_MAPPING_MODE": "3dlut.gamap.use_b2a", "3DLUT_RENDERING_INTENT": "3dlut.rendering_intent", "3DLUT_FORMAT": "3dlut.format", "3DLUT_SIZE": "3dlut.size", "3DLUT_INPUT_BITDEPTH": "3dlut.bitdepth.input", "3DLUT_OUTPUT_BITDEPTH": "3dlut.bitdepth.output", "3DLUT_APPLY_CAL": "3dlut.output.profile.apply_cal", "SIMULATION_PROFILE": "measurement_report.simulation_profile"}.iteritems(): if getcfg("3dlut.create"): value = getcfg(cfgname) if cfgname == "3dlut.gamap.use_b2a": if value: value = "g" else: value = "G" elif cfgname == "3dlut.trc_gamma": if getcfg("3dlut.trc_gamma_type") == "B": value = -value elif (cfgname == "3dlut.input.profile" and os.path.basename(os.path.dirname(value)) == "ref" and get_data_path("ref/" + os.path.basename(value)) == value): # Store relative path instead of absolute path if # ref file value = "ref/" + os.path.basename(value) elif cfgname == "measurement_report.simulation_profile": if (getcfg("3dlut.trc").startswith("smpte2084") or getcfg("3dlut.trc") == "hlg"): # Use 3D LUT profile value = getcfg("3dlut.input.profile") # Add 3D LUT HDR parameters and store only filename # (file will be copied to profile dir) fn, ext = os.path.splitext(os.path.basename(value)) lut3d_fn = self.lut3d_get_filename(fn, False, False) value = lut3d_fn + ext else: value = None else: value = None if value is not None: ti3[0].add_keyword(keyword, safe_str(value, "UTF-7")) elif keyword in ti3[0]: ti3[0].remove_keyword(keyword) # 3D LUT content color space (currently only used for HDR) for color in ("white", "red", "green", "blue"): for coord in "xy": keyword = ("3DLUT_CONTENT_COLORSPACE_%s_%s" % (color.upper(), coord.upper())) if getcfg("3dlut.create"): value = getcfg("3dlut.content.colorspace.%s.%s" % (color, coord)) ti3[0].add_keyword(keyword, safe_str(value, "UTF-7")) elif keyword in ti3[0]: ti3[0].remove_keyword(keyword) ti3[0].fix_zero_measurements(logfile=self.get_logfiles(False)) if 1 in ti3: # Add video level encoding flag if needed black_white = False if "-E" in options_dispcal: black_white = (16, 235) elif (config.get_display_name() == "madVR" and tags is True and self.madtpg_connect()): # Get output encoding from madVR # Note: 'tags' will only be True if creating profile # directly after measurements, and only in that case will # we want to query madVR black_white = self.madtpg.get_black_and_white_level() self.madtpg_disconnect(False) if black_white == (16, 235): ti3[1].add_keyword("TV_OUTPUT_ENCODING", "YES") elif black_white and black_white != (0, 255): ti3[1].add_keyword("OUTPUT_ENCODING", " ".join(str(v) for v in black_white)) ti3.write() return cmd, args def prepare_dispcal(self, calibrate=True, verify=False, dry_run=False): """ Prepare a dispcal commandline. All options are read from the user configuration. You can choose if you want to calibrate and/or verify by passing the corresponding arguments. """ cmd = get_argyll_util("dispcal") args = [] args.append("-v2") # verbose if getcfg("argyll.debug"): args.append("-D8") result = self.add_measurement_features(args, allow_nondefault_observer=True) if isinstance(result, Exception): return result, None if calibrate: if getcfg("trc"): args.append("-q" + getcfg("calibration.quality")) inoutfile = self.setup_inout() if not inoutfile or isinstance(inoutfile, Exception): return inoutfile, None if getcfg("profile.update") or \ self.dispcal_create_fast_matrix_shaper: args.append("-o") if getcfg("calibration.update") and not dry_run: cal = getcfg("calibration.file", False) calcopy = os.path.join(inoutfile + ".cal") filename, ext = os.path.splitext(cal) ext = ".cal" cal = filename + ext if ext.lower() == ".cal": result = check_cal_isfile(cal) if isinstance(result, Exception): return result, None if not result: return None, None if not os.path.exists(calcopy): try: # Copy cal to profile dir shutil.copyfile(cal, calcopy) except Exception, exception: return Error(lang.getstr("error.copy_failed", (cal, calcopy)) + "\n\n" + safe_unicode(exception)), None result = check_cal_isfile(calcopy) if isinstance(result, Exception): return result, None if not result: return None, None cal = calcopy else: rslt = extract_fix_copy_cal(cal, calcopy) if isinstance(rslt, ICCP.ICCProfileInvalidError): return Error(lang.getstr("profile.invalid") + "\n" + cal), None elif isinstance(rslt, Exception): return Error(lang.getstr("cal_extraction_failed") + "\n" + cal + "\n\n" + unicode(str(rslt), enc, "replace")), None if not isinstance(rslt, list): return None, None if getcfg("profile.update"): profile_path = os.path.splitext( getcfg("calibration.file", False))[0] + profile_ext result = check_profile_isfile(profile_path) if isinstance(result, Exception): return result, None if not result: return None, None profilecopy = os.path.join(inoutfile + profile_ext) if not os.path.exists(profilecopy): try: # Copy profile to profile dir shutil.copyfile(profile_path, profilecopy) except Exception, exception: return Error(lang.getstr("error.copy_failed", (profile_path, profilecopy)) + "\n\n" + safe_unicode(exception)), None result = check_profile_isfile(profilecopy) if isinstance(result, Exception): return result, None if not result: return None, None args.append("-u") if calibrate or verify: if calibrate and not \ getcfg("calibration.interactive_display_adjustment"): # Skip interactive display adjustment args.append("-m") whitepoint_colortemp = getcfg("whitepoint.colortemp", False) whitepoint_x = getcfg("whitepoint.x", False) whitepoint_y = getcfg("whitepoint.y", False) if whitepoint_colortemp or None in (whitepoint_x, whitepoint_y): whitepoint = getcfg("whitepoint.colortemp.locus") if whitepoint_colortemp: whitepoint += str(whitepoint_colortemp) args.append("-" + whitepoint) else: args.append("-w%s,%s" % (whitepoint_x, whitepoint_y)) luminance = getcfg("calibration.luminance", False) if luminance: args.append("-b%s" % luminance) if getcfg("trc"): args.append("-" + getcfg("trc.type") + str(getcfg("trc"))) args.append("-f%s" % getcfg("calibration.black_output_offset")) if bool(int(getcfg("calibration.ambient_viewcond_adjust"))): args.append("-a%s" % getcfg("calibration.ambient_viewcond_adjust.lux")) if not getcfg("calibration.black_point_correction.auto"): args.append("-k%s" % getcfg("calibration.black_point_correction")) if defaults["calibration.black_point_rate.enabled"] and \ float(getcfg("calibration.black_point_correction")) < 1: black_point_rate = getcfg("calibration.black_point_rate") if black_point_rate: args.append("-A%s" % black_point_rate) black_luminance = getcfg("calibration.black_luminance", False) if black_luminance: args.append("-B%f" % black_luminance) elif (not (getcfg("calibration.black_point_correction.auto") or getcfg("calibration.black_point_correction")) and defaults["calibration.black_point_hack"]): # Forced black point hack # (Argyll CMS 1.7b 2014-12-22) # Always use this if no black luminance or black point hue # correction specified. The rationale is that a reasonably good # quality digitally driven display should have no "dead zone" # above zero device input if set up correctly. Using this option # with a display that is not well behaved may result in a loss # of shadow detail. args.append("-b") if verify: if calibrate and type(verify) == int: args.append("-e%s" % verify) # Verify final computed curves elif self.argyll_version >= [1, 6]: args.append("-z") # Verify current curves else: args.append("-E") # Verify current curves if getcfg("extra_args.dispcal").strip(): args += parse_argument_string(getcfg("extra_args.dispcal")) if (config.get_display_name() == "Resolve" or (config.get_display_name() == "Prisma" and not defaults["patterngenerator.prisma.argyll"])): # Substitute actual measurement frame dimensions self.options_dispcal = map(lambda arg: re.sub("^-[Pp]1,1,0.01$", "-P" + getcfg("dimensions.measureframe"), arg), args) # Re-add -F (darken background) so it can be set when loading settings if getcfg("measure.darken_background"): self.options_dispcal.append("-F") else: self.options_dispcal = list(args) if calibrate: args.append(inoutfile) return cmd, args def prepare_dispread(self, apply_calibration=True): """ Prepare a dispread commandline. All options are read from the user configuration. You can choose if you want to apply the current calibration, either the previously by dispcal created one by passing in True, by passing in a valid path to a .cal file, or by passing in None (current video card gamma table). """ self.lastcmdname = get_argyll_utilname("dispread") inoutfile = self.setup_inout() if not inoutfile or isinstance(inoutfile, Exception): return inoutfile, None if not os.path.exists(inoutfile + ".ti1"): filename, ext = os.path.splitext(getcfg("testchart.file")) result = check_file_isfile(filename + ext) if isinstance(result, Exception): return result, None try: if ext.lower() in (".icc", ".icm"): try: profile = ICCP.ICCProfile(filename + ext) except (IOError, ICCP.ICCProfileInvalidError), exception: return Error(lang.getstr("error.testchart.read", getcfg("testchart.file"))), None ti3 = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) elif ext.lower() == ".ti1": shutil.copyfile(filename + ext, inoutfile + ".ti1") else: # ti3 try: ti3 = open(filename + ext, "rU") except Exception, exception: return Error(lang.getstr("error.testchart.read", getcfg("testchart.file"))), None if ext.lower() != ".ti1": ti3_lines = [line.strip() for line in ti3] ti3.close() if not "CTI3" in ti3_lines: return Error(lang.getstr("error.testchart.invalid", getcfg("testchart.file"))), None ti1 = open(inoutfile + ".ti1", "w") ti1.write(ti3_to_ti1(ti3_lines)) ti1.close() except Exception, exception: return Error(lang.getstr("error.testchart.creation_failed", inoutfile + ".ti1") + "\n\n" + safe_unicode(exception)), None if apply_calibration is not False: if apply_calibration is True: # Always a .cal file in that case cal = os.path.join(getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded")) + ".cal" elif apply_calibration is None: # Use current videoLUT cal = inoutfile + ".cal" result = self.save_current_video_lut(self.get_display(), cal) if (isinstance(result, Exception) and not isinstance(result, UnloggedInfo)): return result, None else: cal = apply_calibration # can be .cal or .icc / .icm calcopy = inoutfile + ".cal" filename, ext = os.path.splitext(cal) if getcfg("dry_run"): options_dispcal = [] elif ext.lower() == ".cal": result = check_cal_isfile(cal) if isinstance(result, Exception): return result, None if not result: return None, None # Get dispcal options if present try: options_dispcal = get_options_from_cal(cal)[0] except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: return exception, None if not os.path.exists(calcopy): try: # Copy cal to temp dir shutil.copyfile(cal, calcopy) except Exception, exception: return Error(lang.getstr("error.copy_failed", (cal, calcopy)) + "\n\n" + safe_unicode(exception)), None result = check_cal_isfile(calcopy) if isinstance(result, Exception): return result, None if not result: return None, None else: # .icc / .icm result = check_profile_isfile(cal) if isinstance(result, Exception): return result, None if not result: return None, None try: profile = ICCP.ICCProfile(filename + ext) except (IOError, ICCP.ICCProfileInvalidError), exception: profile = None if profile: ti3 = StringIO(profile.tags.get("CIED", "") or profile.tags.get("targ", "")) # Get dispcal options if present options_dispcal = get_options_from_profile(profile)[0] else: ti3 = StringIO("") ti3_lines = [line.strip() for line in ti3] ti3.close() if not "CTI3" in ti3_lines: return Error(lang.getstr("error.cal_extraction", (cal))), None try: tmpcal = open(calcopy, "w") tmpcal.write(extract_cal_from_ti3(ti3_lines)) tmpcal.close() except Exception, exception: return Error(lang.getstr("error.cal_extraction", (cal)) + "\n\n" + safe_unicode(exception)), None cal = calcopy if options_dispcal: self.options_dispcal = ["-" + arg for arg in options_dispcal] # # Make sure any measurement options are present if not self.options_dispcal: self.prepare_dispcal(dry_run=True) # Special case -X because it can have a separate filename argument if "-X" in self.options_dispcal: index = self.options_dispcal.index("-X") if (len(self.options_dispcal) > index + 1 and self.options_dispcal[index + 1][0] != "-"): self.options_dispcal = (self.options_dispcal[:index] + self.options_dispcal[index + 2:]) # Strip options we may override (basically all the stuff which can be # added by add_measurement_features. -X is repeated because it can # have a number instead of explicit filename argument, e.g. -X1) dispcal_override_args = ("-F", "-H", "-I", "-P", "-V", "-X", "-d", "-c", "-p", "-y") self.options_dispcal = filter(lambda arg: not arg[:2] in dispcal_override_args, self.options_dispcal) # Only add the dispcal extra args which may override measurement features dispcal_extra_args = parse_argument_string(getcfg("extra_args.dispcal")) for i, arg in enumerate(dispcal_extra_args): if not arg.startswith("-") and i > 0: # Assume option to previous arg arg = dispcal_extra_args[i - 1] if arg[:2] in dispcal_override_args: self.options_dispcal.append(dispcal_extra_args[i]) result = self.add_measurement_features(self.options_dispcal, ignore_display_name=True) if isinstance(result, Exception): return result, None cmd = get_argyll_util("dispread") args = [] args.append("-v") # verbose if getcfg("argyll.debug"): args.append("-D8") result = self.add_measurement_features(args, allow_nondefault_observer=is_ccxx_testchart()) if isinstance(result, Exception): return result, None if apply_calibration is not False: if (self.argyll_version >= [1, 3, 3] and (not self.has_lut_access() or not getcfg("calibration.use_video_lut")) and len(get_arg("-d", args)[1].split(",")) == 1): # Only use -K if we don't use -d n,m args.append("-K") else: args.append("-k") args.append(cal) if self.get_instrument_features().get("spectral"): args.append("-s") if getcfg("extra_args.dispread").strip(): args += parse_argument_string(getcfg("extra_args.dispread")) self.options_dispread = list(args) cgats = self.ensure_patch_sequence(inoutfile + ".ti1") if getattr(self, "terminal", None) and isinstance(self.terminal, UntetheredFrame): result = self.set_terminal_cgats(cgats) if isinstance(result, Exception): return result, None return cmd, self.options_dispread + [inoutfile] def prepare_dispwin(self, cal=None, profile_path=None, install=True): """ Prepare a dispwin commandline. All options are read from the user configuration. If you pass in cal as True, it will try to load the current display profile's calibration. If cal is a path, it'll use that instead. If cal is False, it'll clear the current calibration. If cal is None, it'll try to load the calibration from a profile specified by profile_path. """ cmd = get_argyll_util("dispwin") args = [] args.append("-v") if getcfg("argyll.debug"): if self.argyll_version >= [1, 3, 1]: args.append("-D8") else: args.append("-E8") args.append("-d" + self.get_display()) if sys.platform != "darwin" or cal is False: # Mac OS X 10.7 Lion needs root privileges when clearing # calibration args.append("-c") if cal is True: args.append(self.get_dispwin_display_profile_argument( max(0, min(len(self.displays), getcfg("display.number")) - 1))) elif cal: result = check_cal_isfile(cal) if isinstance(result, Exception): return result, None if not result: return None, None args.append(cal) else: if cal is None: if not profile_path: profile_save_path = os.path.join( getcfg("profile.save_path"), getcfg("profile.name.expanded")) profile_path = os.path.join(profile_save_path, getcfg("profile.name.expanded") + profile_ext) result = check_profile_isfile(profile_path) if isinstance(result, Exception): return result, None if not result: return None, None try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: return Error(lang.getstr("profile.invalid") + "\n" + profile_path), None if profile.profileClass != "mntr" or \ profile.colorSpace != "RGB": return Error(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace)) + "\n" + profile_path), None if install: if getcfg("profile.install_scope") != "u" and \ (((sys.platform == "darwin" or (sys.platform != "win32" and self.argyll_version >= [1, 1, 0])) and (os.geteuid() == 0 or which("sudo"))) or (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and self.argyll_version > [1, 1, 1])): # -S option is broken on Linux with current Argyll # releases args.append("-S" + getcfg("profile.install_scope")) else: # Make sure user profile dir exists # (e.g. on Mac OS X 10.9 Mavericks, it does not by # default) for profile_dir in reversed(iccprofiles_home): if os.path.isdir(profile_dir): break if not os.path.isdir(profile_dir): try: os.makedirs(profile_dir) except OSError, exception: return exception, None args.append("-I") # Always copy to temp dir so if a user accidentally tries # to install a profile from the location where it's already # installed (e.g. system32/spool/drivers/color) it doesn't # get nuked by dispwin tmp_dir = self.create_tempdir() if not tmp_dir or isinstance(tmp_dir, Exception): return tmp_dir, None # Check directory and in/output file(s) result = check_create_dir(tmp_dir) if isinstance(result, Exception): return result, None profile_name = os.path.basename(profile_path) if (sys.platform in ("win32", "darwin") or fs_enc.upper() not in ("UTF8", "UTF-8")) and \ re.search("[^\x20-\x7e]", profile_name): # Copy to temp dir and give ASCII-only name to # avoid profile install issues profile_tmp_path = os.path.join(tmp_dir, safe_asciize(profile_name)) else: profile_tmp_path = os.path.join(tmp_dir, profile_name) shutil.copyfile(profile_path, profile_tmp_path) profile_path = profile_tmp_path args.append(profile_path) return cmd, args def prepare_targen(self): """ Prepare a targen commandline. All options are read from the user configuration. """ path = self.create_tempdir() if not path or isinstance(path, Exception): return path, None # Check directory and in/output file(s) result = check_create_dir(path) if isinstance(result, Exception): return result, None inoutfile = os.path.join(path, "temp") cmd = get_argyll_util("targen") args = [] args.append('-v') args.append('-d3') args.append('-e%s' % getcfg("tc_white_patches")) if self.argyll_version >= [1, 6]: args.append('-B%s' % getcfg("tc_black_patches")) args.append('-s%s' % getcfg("tc_single_channel_patches")) args.append('-g%s' % getcfg("tc_gray_patches")) args.append('-m%s' % getcfg("tc_multi_steps")) if self.argyll_version >= [1, 6, 0]: args.append('-b%s' % getcfg("tc_multi_bcc_steps")) tc_algo = getcfg("tc_algo") if getcfg("tc_fullspread_patches") > 0: args.append('-f%s' % config.get_total_patches()) if tc_algo: args.append('-' + tc_algo) if tc_algo in ("i", "I"): args.append('-a%s' % getcfg("tc_angle")) if tc_algo == "": args.append('-A%s' % getcfg("tc_adaption")) if self.argyll_version >= [1, 3, 3]: args.append('-N%s' % getcfg("tc_neutral_axis_emphasis")) if (self.argyll_version == [1, 1, "RC1"] or self.argyll_version >= [1, 1]): args.append('-G') else: args.append('-f0') if getcfg("tc_precond") and getcfg("tc_precond_profile"): args.append('-c') args.append(getcfg("tc_precond_profile")) if getcfg("tc_filter"): args.append('-F%s,%s,%s,%s' % (getcfg("tc_filter_L"), getcfg("tc_filter_a"), getcfg("tc_filter_b"), getcfg("tc_filter_rad"))) if (self.argyll_version >= [1, 6, 2] and ("-c" in args or self.argyll_version >= [1, 6, 3])): args.append('-V%s' % (1 + getcfg("tc_dark_emphasis") * 3)) if self.argyll_version == [1, 1, "RC2"] or self.argyll_version >= [1, 1]: args.append('-p%s' % getcfg("tc_gamma")) if getcfg("extra_args.targen").strip(): # Disallow -d and -D as the testchart editor only supports # video RGB (-d3) args += filter(lambda arg: not arg.lower().startswith("-d"), parse_argument_string(getcfg("extra_args.targen"))) self.options_targen = list(args) args.append(inoutfile) return cmd, args def progress_handler(self, event): """ Handle progress dialog updates and react to Argyll CMS command output """ if getattr(self, "subprocess_abort", False) or \ getattr(self, "thread_abort", False): self.progress_wnd.Pulse(lang.getstr("aborting")) return percentage = None msg = self.recent.read(FilteredStream.triggers) lastmsg = self.lastmsg.read(FilteredStream.triggers).strip() warning = r"\D+: Warning -.*" msg = re.sub(warning, "", msg) lastmsg = re.sub(warning, "", lastmsg) # Filter for '=' so that 1% reading during calibration check # measurements doesn't trigger swapping from the interactive adjustment # to the progress window if re.match(r"\s*\d+%\s*(?:[^=]+)?$", lastmsg): # colprof, download progress try: percentage = int(self.lastmsg.read().split("%")[0]) except ValueError: pass elif re.match("Patch \\d+ of \\d+", lastmsg, re.I): # dispcal/dispread components = lastmsg.split() try: start = float(components[1]) end = float(components[3]) except ValueError: pass else: percentage = max(start - 1, 0) / end * 100 elif re.match("Added \\d+/\\d+", lastmsg, re.I): # targen components = lastmsg.lower().replace("added ", "").split("/") try: start = float(components[0]) end = float(components[1]) except ValueError: pass else: percentage = start / end * 100 else: iteration = re.search("It (\\d+):", msg) if iteration: # targen try: start = float(iteration.groups()[0]) except ValueError: pass else: end = 20 percentage = min(start, 20.0) / end * 100 lastmsg = "" if (percentage is not None and time() > self.starttime + 3 and self.progress_wnd is getattr(self, "terminal", None) and not self._detecting_video_levels): # We no longer need keyboard interaction, switch over to # progress dialog wx.CallAfter(self.swap_progress_wnds) if hasattr(self.progress_wnd, "progress_type"): if (self.pauseable or getattr(self, "interactive_frame", "") in ("ambient", "luminance")): # If pauseable, we assume it's a measurement progress_type = 1 # Measuring elif self.cmdname == get_argyll_utilname("targen"): progress_type = 2 # Generating test patches else: progress_type = 0 # Processing if self.progress_wnd.progress_type != progress_type: self.progress_wnd.set_progress_type(progress_type) if getattr(self.progress_wnd, "original_msg", None) and \ msg != self.progress_wnd.original_msg: # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title. # This has a chance of throwing a IOError: [Errno 9] Bad file # descriptor under Windows, so check for wxGTK if "__WXGTK__" in wx.PlatformInfo: safe_print("") self.progress_wnd.SetTitle(self.progress_wnd.original_msg) self.progress_wnd.original_msg = None if percentage is not None: if "Setting up the instrument" in msg or \ "Commencing device calibration" in msg or \ "Commencing display calibration" in msg or \ "Calibration complete" in msg: self.recent.clear() msg = "" keepGoing, skip = self.progress_wnd.UpdateProgress(max(min(percentage, 100), 0), msg + "\n" + lastmsg) elif re.match("\d+(?:\.\d+)? (?:[KM]iB)", lastmsg, re.I): keepGoing, skip = self.progress_wnd.Pulse("\n".join([msg, lastmsg])) else: if getattr(self.progress_wnd, "lastmsg", "") == msg or not msg: keepGoing, skip = self.progress_wnd.Pulse() else: if "Setting up the instrument" in lastmsg: msg = lang.getstr("instrument.initializing") elif "Created web server at" in msg: webserver = re.search("(http\:\/\/[^']+)", msg) if webserver: msg = (lang.getstr("webserver.waiting") + " " + webserver.groups()[0]) keepGoing, skip = self.progress_wnd.Pulse(msg) self.pause_continue() if hasattr(self.progress_wnd, "pause_continue"): if "read stopped at user request!" in lastmsg: self.progress_wnd.pause_continue.Enable() if self.progress_wnd.pause_continue.IsShown() != self.pauseable: self.progress_wnd.pause_continue.Show(self.pauseable) self.progress_wnd.Layout() if not keepGoing and not getattr(self, "abort_requested", False): # Only confirm abort if we are not currently doing interactive # display adjustment self.abort_subprocess(not isinstance(self._progress_wnd, DisplayAdjustmentFrame)) if self.finished is True: return if (self.progress_wnd.IsShownOnScreen() and not self.progress_wnd.IsActive() and (not getattr(self.progress_wnd, "dlg", None) or not self.progress_wnd.dlg.IsShownOnScreen()) and wx.GetApp().GetTopWindow() and wx.GetApp().GetTopWindow().IsShownOnScreen() and (wx.GetApp().IsActive() or (sys.platform == "darwin" and not self.activated))): for window in wx.GetTopLevelWindows(): if (window and window is not self.progress_wnd and isinstance(window, wx.Dialog) and window.IsShownOnScreen()): return self.activated = True self.progress_wnd.Raise() def progress_dlg_start(self, progress_title="", progress_msg="", parent=None, resume=False, fancy=True): """ Start a progress dialog, replacing existing one if present """ if self._progress_wnd and \ self.progress_wnd is getattr(self, "terminal", None): self.terminal.stop_timer() self.terminal.Hide() if self.finished is True: return pauseable = getattr(self, "pauseable", False) fancy = fancy and getcfg("use_fancy_progress") if (resume and self._progress_wnd and self._progress_wnd in self._progress_dlgs.values()): progress_wnd = self._progress_wnd else: key = (self.show_remaining_time, self.cancelable, fancy, parent, parent and parent.IsShownOnScreen()) progress_wnd = self._progress_dlgs.get(key) if progress_wnd: if self._progress_wnd is not progress_wnd: self.progress_wnd = progress_wnd # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title # This has a chance of throwing a IOError: [Errno 9] Bad file # descriptor under Windows, so check for wxGTK if "__WXGTK__" in wx.PlatformInfo: safe_print("") self.progress_wnd.SetTitle(progress_title) if not resume or not self.progress_wnd.IsShown(): self.progress_wnd.reset() self.progress_wnd.Pulse(progress_msg) if hasattr(self.progress_wnd, "pause_continue"): self.progress_wnd.pause_continue.Show(pauseable) self.progress_wnd.Layout() self.progress_wnd.Resume() if not self.progress_wnd.IsShownOnScreen(): self.progress_wnd.place() self.progress_wnd.Show() else: style = wx.PD_SMOOTH | wx.PD_ELAPSED_TIME if self.show_remaining_time: style |= wx.PD_REMAINING_TIME if self.cancelable: style |= wx.PD_CAN_ABORT # Set maximum to 101 to prevent the 'cancel' changing to 'close' # when 100 is reached self._progress_dlgs[key] = ProgressDialog( progress_title, progress_msg, maximum=101, parent=parent, handler=self.progress_handler, keyhandler=self.terminal_key_handler, pauseable=pauseable, style=style, start_timer=False, fancy=fancy) self.progress_wnd = self._progress_dlgs[key] if hasattr(self.progress_wnd, "progress_type"): if (pauseable or getattr(self, "interactive_frame", "") in ("ambient", "luminance")): # If pauseable, we assume it's a measurement self.progress_wnd.progress_type = 1 # Measuring elif self.cmdname == get_argyll_utilname("targen"): self.progress_wnd.progress_type = 2 # Generating test patches else: self.progress_wnd.progress_type = 0 # Processing if not self.progress_wnd.timer.IsRunning(): self.progress_wnd.start_timer() self.progress_wnd.original_msg = progress_msg def quit_terminate_cmd(self): """ Forcefully abort the current subprocess. Try to gracefully exit first by sending common Argyll CMS abort keystrokes (ESC), forcefully terminate the subprocess if not reacting """ # If running wexpect.spawn in a thread under Windows, writing to # sys.stdout from another thread can fail sporadically with IOError 9 # 'Bad file descriptor', so don't use sys.stdout # Careful: Python 2.5 Producer objects don't have a name attribute if (hasattr(self, "thread") and self.thread.isAlive() and (not hasattr(currentThread(), "name") or currentThread().name != self.thread.name)): logfn = log else: logfn = safe_print subprocess = getattr(self, "subprocess", None) if self.isalive(subprocess): try: if self.measure_cmd and hasattr(subprocess, "send"): self.log("%s: Trying to end subprocess gracefully..." % appname, fn=logfn) try: if subprocess.after == "Current": # Stop measurement self.safe_send(" ") sleep(1) ts = time() while (self.isalive(subprocess) and self.subprocess == subprocess): self.safe_send("\x1b") if time() > ts + 20: break sleep(.5) except Exception, exception: self.log(traceback.format_exc(), fn=logfn) self.log("%s: Exception in quit_terminate_command: %s" % (appname, exception), fn=logfn) if self.isalive(subprocess): self.log("%s: Trying to terminate subprocess..." % appname, fn=logfn) subprocess.terminate() ts = time() while self.isalive(subprocess): if time() > ts + 3: break sleep(.25) if sys.platform != "win32" and self.isalive(subprocess): self.log("%s: Trying to terminate subprocess forcefully..." % appname, fn=logfn) if isinstance(subprocess, sp.Popen): subprocess.kill() else: subprocess.terminate(force=True) ts = time() while self.isalive(subprocess): if time() > ts + 3: break sleep(.25) if self.isalive(subprocess): self.log("...warning: couldn't terminate subprocess.", fn=logfn) else: self.log("...subprocess terminated.", fn=logfn) except Exception, exception: self.log(traceback.format_exc(), fn=logfn) self.log("%s: Exception in quit_terminate_command: %s" % (appname, exception), fn=logfn) subprocess_isalive = self.isalive(subprocess) if (subprocess_isalive or (hasattr(self, "thread") and not self.thread.isAlive())): # We don't normally need this as closing of the progress window is # handled by _generic_consumer(), but there are two cases where it # is desirable to have this 'safety net': # 1. The user aborted a running task, but we couldn't terminate the # associated subprocess. In that case, we have a lingering # subprocess which is problematic but we can't do anything about # it. Atleast we need to give control back to the user by closing # the progress window so he can interact with the application # and doesn't have to resort to forecfully terminate it. # 2. We started a thread with continue_next=True, which then exited # without returning an error, yet not the result we were looking # for, so we never started the next thread with resume=True, but # we forgot to call stop_progress() exlicitly. This should never # happen if we design our result consumer correctly to handle # this particular case, but we need to make sure the user can # close the progress window in case we mess up. if hasattr(self, "thread") and not self.thread.isAlive(): wx.CallAfter(self.stop_progress) if subprocess_isalive: wx.CallAfter(show_result_dialog, Warning("Couldn't terminate %s. Please try to end " "it manually before continuing to use %s. " "If you can not terminate %s, restarting " "%s may also help. Apologies for the " "inconvenience." % (self.cmd, appname, self.cmd, appname)), self.owner) if self.patterngenerator: self.patterngenerator.listening = False return not subprocess_isalive def report(self, report_calibrated=True): """ Report on calibrated or uncalibrated display device response """ cmd, args = self.prepare_dispcal(calibrate=False) if isinstance(cmd, Exception): return cmd if args: if report_calibrated: args.append("-r") else: args.append("-R") return self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) def reset_cal(self): cmd, args = self.prepare_dispwin(False) result = self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, silent=False) return result def safe_send(self, bytes): self.send_buffer = bytes return True def _safe_send(self, bytes, retry=3, obfuscate=False): """ Safely send a keystroke to the current subprocess """ for i in xrange(0, retry): if obfuscate: logbytes = "***" else: logbytes = bytes self.logger.info("Sending key(s) %r (%i)" % (logbytes, i + 1)) try: wrote = self.subprocess.send(bytes) except Exception, exception: self.logger.exception("Exception: %s" % safe_unicode(exception)) else: if wrote == len(bytes): return True sleep(.25) return False def save_current_video_lut(self, display_no, outfilename, interpolate_to_256=True, silent=False): """ Save current videoLUT, optionally interpolating to n entries """ result = None if (self.argyll_version[0:3] > [1, 1, 0] or (self.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.argyll_version_string)): cmd, args = (get_argyll_util("dispwin"), ["-d%s" % display_no, "-s", outfilename]) result = self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True, silent=silent) if (isinstance(result, Exception) and not isinstance(result, UnloggedInfo)): return result if not result: return Error(lang.getstr("calibration.load_error")) # Make sure there are 256 entries in the .cal file, otherwise dispwin # will complain and not be able to load it back in. # Under Windows, the GetDeviceGammaRamp API seems to enforce 256 entries # regardless of graphics card, but under Linux and Mac OS X there may be # more than 256 entries if the graphics card has greater than 8 bit # videoLUTs (e.g. Quadro and newer consumer cards) cgats = CGATS.CGATS(outfilename) data = cgats.queryv1("DATA") if data and len(data) != 256: safe_print("VideoLUT has %i entries, interpolating to 256" % len(data)) rgb = {"I": [], "R": [], "G": [], "B": []} for entry in data.itervalues(): for column in ("I", "R", "G", "B"): rgb[column].append(entry["RGB_" + column]) interp = {} for column in ("R", "G", "B"): interp[column] = colormath.Interp(rgb["I"], rgb[column]) resized = CGATS.CGATS() data.parent.DATA = resized resized.key = 'DATA' resized.parent = data.parent resized.root = cgats resized.type = 'DATA' for i in xrange(256): entry = {"RGB_I": i / 255.0} for column in ("R", "G", "B"): entry["RGB_" + column] = interp[column](entry["RGB_I"]) resized.add_data(entry) cgats.write() return result def set_argyll_version(self, name, silent=False, cfg=False): self.set_argyll_version_from_string(get_argyll_version_string(name, silent), cfg) def set_argyll_version_from_string(self, argyll_version_string, cfg=True): self.argyll_version_string = argyll_version_string if cfg: setcfg("argyll.version", argyll_version_string) # Always write cfg directly after setting Argyll version so # subprocesses that read the configuration will use the right # version writecfg() self.argyll_version = parse_argyll_version_string(argyll_version_string) def set_sessionlogfile(self, sessionlogfile, basename, dirname): if sessionlogfile: self.sessionlogfile = sessionlogfile else: self.sessionlogfile = LogFile(basename, dirname) self.sessionlogfiles[basename] = self.sessionlogfile def set_terminal_cgats(self, cgats): if not isinstance(cgats, CGATS.CGATS): try: cgats = CGATS.CGATS(cgats) except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: return exception self.terminal.cgats = cgats def setup_inout(self, basename=None): """ Setup in/outfile basename and session logfile """ dirname = self.create_tempdir() if not dirname or isinstance(dirname, Exception): return dirname # Check directory and in/output file(s) result = check_create_dir(dirname) if isinstance(result, Exception): return result if basename is None: basename = getcfg("profile.name.expanded") basename = make_argyll_compatible_path(basename) self.set_sessionlogfile(None, basename, dirname) return os.path.join(dirname, basename) def argyll_support_file_exists(self, name, scope=None): """ Check if named file exists in any of the known Argyll support locations valid for the chosen Argyll CMS version. Scope can be 'u' (user), 'l' (local system) or None (both) """ paths = [] if sys.platform != "darwin": if not scope or scope == "u": paths.append(defaultpaths.appdata) if not scope or scope == "l": paths += defaultpaths.commonappdata else: if not scope or scope == "u": paths.append(defaultpaths.library_home) if not scope or scope == "l": paths.append(defaultpaths.library) searchpaths = [] if self.argyll_version >= [1, 5, 0]: if sys.platform != "darwin": searchpaths.extend(os.path.join(dir_, "ArgyllCMS", name) for dir_ in paths) else: paths2 = [] if not scope or scope == "u": paths2.append(defaultpaths.appdata) if not scope or scope == "l": paths2.append(defaultpaths.library) if (self.argyll_version >= [1, 9] and self.argyll_version <= [1, 9, 1]): # Argyll CMS 1.9 and 1.9.1 use *nix locations due to a # configuration problem paths2.extend([os.path.join(defaultpaths.home, ".local", "share"), "/usr/local/share"]) searchpaths.extend(os.path.join(dir_, "ArgyllCMS", name) for dir_ in paths2) searchpaths.extend(os.path.join(dir_, "color", name) for dir_ in paths) for searchpath in searchpaths: if os.path.isfile(searchpath): return True return False def spyder2_firmware_exists(self, scope=None): """ Check if the Spyder 2 firmware file exists in any of the known locations valid for the chosen Argyll CMS version. Scope can be 'u' (user), 'l' (local system) or None (both) """ if self.argyll_version < [1, 2, 0]: spyd2en = get_argyll_util("spyd2en") if not spyd2en: return False return os.path.isfile(os.path.join(os.path.dirname(spyd2en), "spyd2PLD.bin")) else: return self.argyll_support_file_exists("spyd2PLD.bin", scope=scope) def spyder4_cal_exists(self): """ Check if the Spyder4/5 calibration file exists in any of the known locations valid for the chosen Argyll CMS version. """ if self.argyll_version < [1, 3, 6]: # We couldn't use it even if it exists return False return self.argyll_support_file_exists("spyd4cal.bin") def start(self, consumer, producer, cargs=(), ckwargs=None, wargs=(), wkwargs=None, progress_title=appname, progress_msg="", parent=None, progress_start=100, resume=False, continue_next=False, stop_timers=True, interactive_frame="", pauseable=False, cancelable=True, show_remaining_time=True, fancy=True): """ Start a worker process. Also show a progress dialog while the process is running. consumer consumer function. producer producer function. cargs consumer arguments. ckwargs consumer keyword arguments. wargs producer arguments. wkwargs producer keyword arguments. progress_title progress dialog title. Defaults to '%s'. progress_msg progress dialog message. Defaults to ''. progress_start show progress dialog after delay (ms). resume resume previous progress dialog (elapsed time etc). continue_next do not hide progress dialog after producer finishes. stop_timers stop the timers on the owner window if True interactive_frame "" or "uniformity" (selects the type of interactive window) pauseable Is the operation pauseable? (show pause button on progress dialog) cancelable Is the operation cancelable? (show cancel button on progress dialog) fancy Use fancy progress dialog with animated throbber & sound fx """ % appname if ckwargs is None: ckwargs = {} if wkwargs is None: wkwargs = {} while self.is_working(): sleep(.25) # wait until previous worker thread finishes if hasattr(self.owner, "stop_timers") and stop_timers: self.owner.stop_timers() if not parent: parent = self.owner if progress_start < 1: # Can't be zero! progress_start = 1 self.activated = False self.cmdname = None self.cmdrun = False self.finished = False self.instrument_calibration_complete = False if not resume: self.instrument_on_screen = False self.instrument_place_on_screen_msg = False self.instrument_sensor_position_msg = False self.interactive_frame = interactive_frame self.is_single_measurement = (interactive_frame == "ambient" or interactive_frame == "luminance" or (isinstance(interactive_frame, wx.TopLevelWindow) and interactive_frame.Name == "VisualWhitepointEditor")) self.is_ambient_measurement = interactive_frame == "ambient" self.lastcmdname = None self.pauseable = pauseable self.paused = False self.cancelable = cancelable self.show_remaining_time = show_remaining_time self.fancy = fancy self.resume = resume self.subprocess_abort = False self.abort_requested = False self.starttime = time() self.thread_abort = False if (fancy and (not self.interactive or interactive_frame not in ("uniformity", "untethered")) and not isinstance(interactive_frame, wx.TopLevelWindow)): # Pre-init progress dialog bitmaps ProgressDialog.get_bitmaps(0) ProgressDialog.get_bitmaps(1) if self.interactive: self.progress_start_timer = wx.Timer() if progress_msg and progress_title == appname: progress_title = progress_msg if (config.get_display_name() == "Untethered" and interactive_frame != "uniformity"): interactive_frame = "untethered" if interactive_frame == "adjust": windowclass = DisplayAdjustmentFrame elif interactive_frame == "uniformity": windowclass = DisplayUniformityFrame elif interactive_frame == "untethered": windowclass = UntetheredFrame else: windowclass = SimpleTerminal if getattr(self, "terminal", None) and isinstance(self.terminal, windowclass): self.progress_wnd = self.terminal if not resume: if isinstance(self.progress_wnd, SimpleTerminal): self.progress_wnd.console.SetValue("") elif (isinstance(self.progress_wnd, DisplayAdjustmentFrame) or isinstance(self.progress_wnd, DisplayUniformityFrame) or isinstance(self.progress_wnd, UntetheredFrame)): self.progress_wnd.reset() self.progress_wnd.stop_timer() self.progress_wnd.Resume() self.progress_wnd.start_timer() # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title safe_print("") if isinstance(self.progress_wnd, SimpleTerminal): self.progress_wnd.SetTitle(progress_title) self.progress_wnd.Show() if resume and isinstance(self.progress_wnd, SimpleTerminal): self.progress_wnd.console.ScrollLines( self.progress_wnd.console.GetNumberOfLines()) else: if getattr(self, "terminal", None): # Destroy the wx object so the decref'd python object can # be garbage collected self.terminal.Destroy() if interactive_frame == "adjust": self.terminal = DisplayAdjustmentFrame(parent, handler=self.progress_handler, keyhandler=self.terminal_key_handler) elif interactive_frame == "uniformity": self.terminal = DisplayUniformityFrame(parent, handler=self.progress_handler, keyhandler=self.terminal_key_handler) elif interactive_frame == "untethered": self.terminal = UntetheredFrame(parent, handler=self.progress_handler, keyhandler=self.terminal_key_handler) elif isinstance(interactive_frame, wx.TopLevelWindow): self.terminal = interactive_frame else: self.terminal = SimpleTerminal(parent, title=progress_title, handler=self.progress_handler, keyhandler=self.terminal_key_handler) if getattr(self.terminal, "worker", self) is not self: safe_print("DEBUG: In worker.Worker.start: worker.Worker()." "terminal.worker is not self! This is probably a" "bug.") self.terminal.worker = self self.progress_wnd = self.terminal else: if not progress_msg: progress_msg = lang.getstr("please_wait") # Show the progress dialog after a delay self.progress_start_timer = BetterCallLater(progress_start, self.progress_dlg_start, progress_title, progress_msg, parent, resume, fancy) if not hasattr(self, "_disabler"): self._disabler = BetterWindowDisabler(self.progress_wnds) # Can't use startWorker because we may need access to self.thread from # within thread, and startWorker does not return before the actual # thread starts running jobID = None sender = delayedresult.SenderCallAfter(self._generic_consumer, jobID, args=[consumer, continue_next] + list(cargs), kwargs=ckwargs) self.thread = delayedresult.Producer(sender, Producer(self, producer, continue_next), args=wargs, kwargs=wkwargs, name=jobID, group=None, daemon=False, senderArg=None, sendReturn=True) self.thread.start() return True def stop_progress(self): if hasattr(self, "_disabler"): del self._disabler if getattr(self, "progress_wnd", False): if getattr(self.progress_wnd, "dlg", None): if self.progress_wnd.dlg.IsShownOnScreen(): self.progress_wnd.dlg.EndModal(wx.ID_CANCEL) self.progress_wnd.dlg = None self.progress_wnd.stop_timer() if getattr(self.progress_wnd, "Name", None) == "VisualWhitepointEditor": self.progress_wnd.Close() else: self.progress_wnd.Hide() self.subprocess_abort = False self.thread_abort = False self.interactive = False self.resume = False def swap_progress_wnds(self): """ Swap the current interactive window with a progress dialog """ parent = self.terminal.GetParent() if isinstance(self.terminal, DisplayAdjustmentFrame): title = lang.getstr("calibration") else: title = self.terminal.GetTitle() self.progress_dlg_start(title, "", parent, self.resume, self.fancy) def terminal_key_handler(self, event): """ Key handler for the interactive window or progress dialog. """ keycode = None if event.GetEventType() in (wx.EVT_CHAR_HOOK.typeId, wx.EVT_KEY_DOWN.typeId): keycode = event.GetKeyCode() elif event.GetEventType() == wx.EVT_MENU.typeId: keycode = self.progress_wnd.id_to_keycode.get(event.GetId()) if keycode is not None and getattr(self, "subprocess", None) and \ hasattr(self.subprocess, "send"): keycode = keycodes.get(keycode, keycode) if keycode in (ord("\x1b"), ord("8"), ord("Q"), ord("q")): # exit self.abort_subprocess(True) return try: self.safe_send(chr(keycode)) except: pass def calculate_gamut(self, profile_path, intent="r", direction="f", order="n", compare_standard_gamuts=True): """ Calculate gamut, volume, and coverage % against sRGB and Adobe RGB. Return gamut volume (int, scaled to sRGB = 1.0) and coverage (dict) as tuple. """ if isinstance(profile_path, list): profile_paths = profile_path else: profile_paths = [profile_path] outname = os.path.splitext(profile_paths[0])[0] mods = [] if intent != "r": mods.append(intent) if direction != "f": mods.append(direction) if order != "n": mods.append(order) if mods: outname += " " + "".join(["[%s]" % mod.upper() for mod in mods]) gamut_volume = None gamut_coverage = {} # Create profile gamut and vrml det = getcfg("iccgamut.surface_detail") for i, profile_path in enumerate(profile_paths): if not profile_path: self.log("Warning: calculate_gamut(): No profile path %i" % i) continue result = self.exec_cmd(get_argyll_util("iccgamut"), ["-v", "-w", "-i" + intent, "-f" + direction, "-o" + order, "-d%.2f" % det, profile_path], capture_output=True, skip_scripts=True) if not isinstance(result, Exception) and result: # iccgamut output looks like this: # Header: # <...> # # Total volume of gamut is xxxxxx.xxxxxx cubic colorspace units for line in self.output: match = re.search("(\d+(?:\.\d+)?)\s+cubic\s+colorspace\s+" "units", line) if match: gamut_volume = float(match.groups()[0]) / ICCP.GAMUT_VOLUME_SRGB break else: break name = os.path.splitext(profile_paths[0])[0] gamfilename = name + ".gam" wrlfilename = name + ".wrl" tmpfilenames = [gamfilename, wrlfilename] if compare_standard_gamuts: comparison_gamuts = [("srgb", "sRGB"), ("adobe-rgb", "ClayRGB1998"), ("dci-p3", "SMPTE431_P3")] else: comparison_gamuts = [] for profile_path in profile_paths[1:]: filename, ext = os.path.splitext(profile_path) comparison_gamuts.append((filename.lower().replace(" ", "-"), filename + ".gam")) threads = [] viewgam = get_argyll_util("viewgam") for key, src in comparison_gamuts: if not isinstance(result, Exception) and result: # Create gamut view and intersection if os.path.isabs(src): src_path = src src = os.path.splitext(os.path.basename(src))[0] else: if mods: src += " " + "".join(["[%s]" % mod.upper() for mod in mods]) src_path = get_data_path("ref/%s.gam" % src) if not src_path: continue outfilename = outname + " vs " + src if mods: outfilename += " " + "".join(["[%s]" % mod.upper() for mod in mods]) outfilename += ".wrl" tmpfilenames.append(outfilename) # Multi-threaded gamut view calculation worker = Worker() args = ["-cw", "-t0", "-w", src_path, "-cn", "-t.3", "-s", gamfilename, "-i", outfilename] thread = threading.Thread(target=self.create_gamut_view_worker, name="CreateGamutViewWorker", args=(worker, viewgam, args, key, src, gamut_coverage)) threads.append((thread, worker, args)) thread.start() # Wait for threads to finish for thread, worker, args in threads: thread.join() self.log("-" * 80) self.log(lang.getstr("commandline")) printcmdline(viewgam, args, fn=self.log, cwd=os.path.dirname(args[-1])) self.log("") self.log("".join(worker.output)) if not isinstance(result, Exception) and result: for tmpfilename in tmpfilenames: if (tmpfilename == gamfilename and tmpfilename != outname + ".gam"): # Use the original file name filename = outname + ".gam" elif (tmpfilename == wrlfilename and tmpfilename != outname + ".wrl"): # Use the original file name filename = outname + ".wrl" else: filename = tmpfilename try: def tweak_vrml(vrml): # Set viewpoint further away vrml = re.sub("(Viewpoint\s*\{)[^}]+\}", r"\1 position 0 0 340 }", vrml) # Fix label color for -a* axis label = re.search(r'Transform\s*\{\s*translation\s+[+\-0-9.]+\s*[+\-0-9.]+\s*[+\-0-9.]+\s+children\s*\[\s*Shape\s*\{\s*geometry\s+Text\s*\{\s*string\s*\["-a\*"\]\s*fontStyle\s+FontStyle\s*\{[^}]*\}\s*\}\s*appearance\s+Appearance\s*\{\s*material\s+Material\s*{[^}]*\}\s*\}\s*\}\s*\]\s*\}', vrml) if label: label = label.group() vrml = vrml.replace(label, re.sub(r"(diffuseColor)\s+[+\-0-9.]+\s+[+\-0-9.]+\s+[+\-0-9.]+", r"\1 0.0 1.0 0.0", label)) # Add range to axes vrml = re.sub(r'(string\s*\[")(\+?)(L\*)("\])', r'\1\3", "\2\0$\4', vrml) vrml = re.sub(r'(string\s*\[")([+\-]?)(a\*)("\])', r'\1\3", "\2\0$\4', vrml) vrml = re.sub(r'(string\s*\[")([+\-]?)(b\*)("\])', r'\1\3 \2\0$\4', vrml) vrml = vrml.replace("\0$", "100") return vrml gzfilename = filename + ".gz" if sys.platform == "win32": filename = make_win32_compatible_long_path(filename) gzfilename = make_win32_compatible_long_path(gzfilename) tmpfilename = make_win32_compatible_long_path(tmpfilename) if getcfg("vrml.compress"): # Compress gam and wrl files using gzip with GzipFileProper(gzfilename, "wb") as gz: # Always use original filename with '.gz' extension, # that way the filename in the header will be correct with open(tmpfilename, "rb") as infile: gz.write(tweak_vrml(infile.read())) # Remove uncompressed file os.remove(tmpfilename) tmpfilename = gzfilename else: with open(tmpfilename, "rb") as infile: vrml = infile.read() with open(tmpfilename, "wb") as outfile: outfile.write(tweak_vrml(vrml)) if filename.endswith(".wrl"): filename = filename[:-4] + ".wrz" else: filename = gzfilename if tmpfilename != filename: # Rename the file if filename is different if os.path.exists(filename): os.remove(filename) os.rename(tmpfilename, filename) except Exception, exception: self.log(exception) elif result: # Exception self.log(result) return gamut_volume, gamut_coverage @staticmethod def create_gamut_view_worker(worker, viewgam, args, key, src, gamut_coverage): """ Gamut view creation producer """ try: result = worker.exec_cmd(viewgam, args, capture_output=True, skip_scripts=True, silent=True, log_output=False) if not isinstance(result, Exception) and result: # viewgam output looks like this: # Intersecting volume = xxx.x cubic units # 'path/to/1.gam' volume = xxx.x cubic units, intersect = xx.xx% # 'path/to/2.gam' volume = xxx.x cubic units, intersect = xx.xx% for line in worker.output: match = re.search("[\\\/]%s.gam'\s+volume\s*=\s*" "\d+(?:\.\d+)?\s+cubic\s+units,?" "\s+intersect\s*=\s*" "(\d+(?:\.\d+)?)" % re.escape(src), line) if match: gamut_coverage[key] = float(match.groups()[0]) / 100.0 break except Exception, exception: worker.log(traceback.format_exc()) def calibrate(self, remove=False): """ Calibrate the screen and process the generated file(s). """ result = self.detect_video_levels() if isinstance(result, Exception): return result capture_output = not sys.stdout.isatty() cmd, args = self.prepare_dispcal() if not isinstance(cmd, Exception): result = self.exec_cmd(cmd, args, capture_output=capture_output) else: result = cmd if not isinstance(result, Exception) and result and getcfg("trc"): dst_pathname = os.path.join(getcfg("profile.save_path"), getcfg("profile.name.expanded"), getcfg("profile.name.expanded")) cal = args[-1] + ".cal" result = check_cal_isfile( cal, lang.getstr("error.calibration.file_not_created")) if not isinstance(result, Exception) and result: cal_cgats = add_dispcal_options_to_cal(cal, self.options_dispcal) if cal_cgats: cal_cgats.write() if getcfg("profile.update") or \ self.dispcal_create_fast_matrix_shaper: profile_path = args[-1] + profile_ext result = check_profile_isfile( profile_path, lang.getstr("error.profile.file_not_created")) if not isinstance(result, Exception) and result: try: profile = ICCP.ICCProfile(profile_path) except (IOError, ICCP.ICCProfileInvalidError), exception: result = Error(lang.getstr("profile.invalid") + "\n" + profile_path) if not isinstance(result, Exception) and result: if not getcfg("profile.update"): # Created fast matrix shaper profile # we need to set cprt, targ and a few other things profile.setCopyright(getcfg("copyright")) # Fast matrix shaper profiles currently don't # contain TI3 data, but look for it anyways # to be future-proof ti3 = add_options_to_ti3( profile.tags.get("targ", profile.tags.get("CIED", "")), self.options_dispcal) if not ti3: ti3 = CGATS.CGATS("TI3\n") ti3[1] = cal_cgats edid = self.get_display_edid() display_name = edid.get("monitor_name", edid.get("ascii", str(edid.get("product_id") or ""))) display_manufacturer = edid.get("manufacturer") profile.setDeviceModelDescription(display_name) if display_manufacturer: profile.setDeviceManufacturerDescription( display_manufacturer) (gamut_volume, gamut_coverage) = self.create_gamut_views(profile_path) self.update_profile(profile, ti3=str(ti3), chrm=None, tags=True, avg=None, peak=None, rms=None, gamut_volume=gamut_volume, gamut_coverage=gamut_coverage, quality=getcfg("calibration.quality")) else: # Update desc tag - ASCII needs to be 7-bit # also add Unicode string if different from ASCII if "desc" in profile.tags and isinstance(profile.tags.desc, ICCP.TextDescriptionType): profile.setDescription( getcfg("profile.name.expanded")) # Calculate profile ID profile.calculateID() try: profile.write() except Exception, exception: self.log(exception) result2 = self.wrapup(not isinstance(result, UnloggedInfo) and result, remove or isinstance(result, Exception) or not result) if isinstance(result2, Exception): if isinstance(result, Exception): result = Error(safe_unicode(result) + "\n\n" + safe_unicode(result2)) else: result = result2 elif not isinstance(result, Exception) and result and getcfg("trc"): setcfg("last_cal_path", dst_pathname + ".cal") setcfg("calibration.file.previous", getcfg("calibration.file", False)) if (getcfg("profile.update") or self.dispcal_create_fast_matrix_shaper): setcfg("last_cal_or_icc_path", dst_pathname + profile_ext) setcfg("last_icc_path", dst_pathname + profile_ext) setcfg("calibration.file", dst_pathname + profile_ext) else: setcfg("calibration.file", dst_pathname + ".cal") setcfg("last_cal_or_icc_path", dst_pathname + ".cal") return result @property def calibration_loading_generally_supported(self): # Loading/clearing calibration seems to have undesirable side-effects # on Mac OS X 10.6 and newer return (sys.platform != "darwin" or intlist(mac_ver()[0].split(".")) < [10, 6]) @property def calibration_loading_supported(self): # Loading/clearing calibration seems to have undesirable side-effects # on Mac OS X 10.6 and newer return (self.calibration_loading_generally_supported and not config.is_virtual_display()) def change_display_profile_cal_whitepoint(self, profile, x, y, outfilename, calibration_only=False, use_collink=False): """ Change display profile (and calibration) whitepoint. Do it in an colorimetrically accurate manner (as far as possible). """ XYZw = colormath.xyY2XYZ(x, y) xicclu = get_argyll_util("xicclu") if not xicclu: return Error(lang.getstr("argyll.util.not_found", "xicclu")) tempdir = self.create_tempdir() if isinstance(tempdir, Exception): return tempdir outpathname = os.path.splitext(outfilename)[0] outname = os.path.basename(outpathname) logfiles = Files([self.recent, self.lastmsg, LineBufferedStream(safe_print)]) ofilename = profile.fileName temppathname = os.path.join(tempdir, outname) if ofilename and os.path.isfile(ofilename): # Profile comes from a file temp = False temporig = ofilename else: # Profile not associated to a file, write to temp dir temp = True profile.fileName = temporig = temppathname + ".orig.icc" profile.write(temporig) # Remember original white XYZ origXYZ = profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z # Make a copy of the profile with changed whitepoint profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z = XYZw tempcopy = temppathname + ".copy.icc" profile.write(tempcopy) # Generate updated calibration with changed whitepoint if use_collink: collink = get_argyll_util("collink") if not collink: profile.fileName = ofilename self.wrapup(False) return Error(lang.getstr("argyll.util.not_found", "collink")) linkpath = temppathname + ".link.icc" result = self.exec_cmd(collink, ["-v", "-n", "-G", "-iaw", "-b", tempcopy, temporig, linkpath], capture_output=True) if not result or isinstance(result, Exception): profile.fileName = ofilename self.wrapup(False) return result link = ICCP.ICCProfile(linkpath) RGBscaled = [] for i in xrange(256): RGBscaled.append([i / 255.0] * 3) RGBscaled = self.xicclu(link, RGBscaled) logfiles.write("RGB white %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[-1])) # Restore original white XYZ profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z = origXYZ # Get white RGB XYZwscaled = self.xicclu(profile, RGBscaled[-1], "a", pcs="x")[0] logfiles.write("XYZ white %6.4f %6.4f %6.4f, CCT %i\n" % tuple(XYZwscaled + [colormath.XYZ2CCT(*XYZwscaled)])) else: # Lookup scaled down white XYZ logfiles.write("Looking for solution...\n") XYZscaled = [] for i in xrange(2000): XYZscaled.append([v * (1 - i / 1999.0) for v in XYZw]) RGBscaled = self.xicclu(profile, XYZscaled, "a", "if", pcs="x", get_clip=True) # Set filename to copy (used by worker.xicclu to get profile path) profile.fileName = tempcopy # Find point at which it no longer clips for i, RGBclip in enumerate(RGBscaled): if RGBclip[3] is True: # Clipped, skip continue # Found XYZwscaled = XYZscaled[i] logfiles.write("Solution found at index %i (step size %f)\n" % (i, 1 / 1999.0)) logfiles.write("RGB white %6.4f %6.4f %6.4f\n" % tuple(RGBclip[:3])) logfiles.write("XYZ white %6.4f %6.4f %6.4f, CCT %i\n" % tuple(XYZscaled[i] + [colormath.XYZ2CCT(*XYZscaled[i])])) break else: profile.fileName = ofilename self.wrapup(False) return Error("No solution found in %i steps" % i) # Generate RGB input values # Reduce interpolation res as target whitepoint moves farther away # from profile whitepoint in RGB res = max(int(round((min(RGBclip[:3]) / 1.0) * 33)), 9) logfiles.write("Interpolation res %i\n" % res) RGBscaled = [] for i in xrange(res): RGBscaled.append([v * (i / (res - 1.0)) for v in (1, 1, 1)]) # Lookup RGB -> XYZ through whitepoint adjusted profile RGBscaled2XYZ = self.xicclu(profile, RGBscaled, "a", pcs="x") # Restore original XYZ profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z = origXYZ # Restore original filename (used by worker.xicclu to get profile path) profile.fileName = temporig # Get original black point XYZk = self.xicclu(profile, [0, 0, 0], "a", pcs="x")[0] logfiles.write("XYZ black %6.4f %6.4f %6.4f\n" % tuple(XYZk)) logfiles.write("XYZ white after forward lookup %6.4f %6.4f %6.4f\n" % tuple(RGBscaled2XYZ[-1])) # Scale down XYZ XYZscaled = [] for i in xrange(res): XYZ = [v * XYZwscaled[1] for v in RGBscaled2XYZ[i]] if i == 0: bp_in = XYZ XYZ = colormath.apply_bpc(*XYZ, bp_in=bp_in, bp_out=XYZk, wp_out=XYZwscaled, weight=True) XYZscaled.append(XYZ) logfiles.write("XYZ white after scale down %6.4f %6.4f %6.4f\n" % tuple(XYZscaled[-1])) # Lookup XYZ -> RGB through original profile RGBscaled = self.xicclu(profile, XYZscaled, "a", "if", pcs="x", use_cam_clipping=True) logfiles.write("RGB black after inverse forward lookup %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[0])) logfiles.write("RGB white after inverse forward lookup %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[-1])) if res != 256: # Interpolate R = [] G = [] B = [] for i, RGB in enumerate(RGBscaled): R.append(RGB[0]) G.append(RGB[1]) B.append(RGB[2]) if res > 2: # Catmull-Rom spline interpolation Ri = ICCP.CRInterpolation(R) Gi = ICCP.CRInterpolation(G) Bi = ICCP.CRInterpolation(B) else: # Linear interpolation Ri = colormath.Interp(range(res), R) Gi = colormath.Interp(range(res), G) Bi = colormath.Interp(range(res), B) RGBscaled = [] step = (res - 1) / 255.0 for i in xrange(256): RGB = [Ri(i * step), Gi(i * step), Bi(i * step)] RGBscaled.append(RGB) logfiles.write("RGB black after interpolation %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[0])) logfiles.write("RGB white after interpolation %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[-1])) has_nonlinear_vcgt = (isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType) and not profile.tags.vcgt.is_linear()) if has_nonlinear_vcgt: # Apply cal ocal = extract_cal_from_profile(profile) bp_out = ocal.queryv1({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0}).values() ocalpath = temppathname + ".cal" ocal.filename = ocalpath RGBscaled = self.xicclu(ocal, RGBscaled) logfiles.write("RGB black after cal %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[0])) logfiles.write("RGB white after cal %6.4f %6.4f %6.4f\n" % tuple(RGBscaled[-1])) else: bp_out = (0, 0, 0) cal = """CAL KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB" BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA """ for i, RGB in enumerate(RGBscaled): R, G, B = colormath.apply_bpc(*RGB, bp_in=RGBscaled[0], bp_out=bp_out, wp_out=RGBscaled[-1], weight=True) cal += "%f %f %f %f\n" % (i / 255.0, R, G, B) cal += "END_DATA" cal = CGATS.CGATS(cal) cal.filename = outpathname + ".cal" cal.write() if calibration_only: # Only update calibration profile.setDescription(outname) profile.tags.vcgt = cal_to_fake_profile(cal).tags.vcgt profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z = XYZw profile.calculateID() profile.write(outfilename) self.wrapup(False) return True else: # Re-create profile cti3 = None if isinstance(profile.tags.get("targ"), ICCP.Text): # Get measurement data try: cti3 = CGATS.CGATS(profile.tags.targ) except (IOError, CGATS.CGATSError): pass else: if not 0 in cti3 or cti3[0].type.strip() != "CTI3": # Not Argyll measurement data cti3 = None if not cti3: # Use fakeread fakeread = get_argyll_util("fakeread") if not fakeread: profile.fileName = ofilename self.wrapup(False) return Error(lang.getstr("argyll.util.not_found", "fakeread")) shutil.copyfile(defaults["testchart.file"], temppathname + ".ti1") result = self.exec_cmd(fakeread, [temporig, temppathname]) if not result or isinstance(result, Exception): profile.fileName = ofilename self.wrapup(False) return result cti3 = CGATS.CGATS(temppathname + ".ti3") # Get RGB from measurement data RGBorig = [] for i, sample in cti3[0].DATA.iteritems(): RGB = [] for j, component in enumerate("RGB"): RGB.append(sample["RGB_" + component]) RGBorig.append(RGB) # Lookup RGB -> scaled RGB through calibration RGBscaled = self.xicclu(cal, RGBorig, scale=100) if has_nonlinear_vcgt: # Undo original calibration RGBscaled = self.xicclu(ocal, RGBscaled, direction="b", scale=100) # Update CAL in ti3 file if 1 in cti3 and cti3[1].type.strip() == "CAL": cti3[1].DATA = cal[0].DATA else: cti3[1] = cal[0] # Lookup scaled RGB -> XYZ through profile RGBscaled2XYZ = self.xicclu(profile, RGBscaled, "a", pcs="x", scale=100) # Update measurement data if "LUMINANCE_XYZ_CDM2" in cti3[0]: XYZa = [float(v) * XYZwscaled[i] for i, v in enumerate(cti3[0].LUMINANCE_XYZ_CDM2.split())] cti3[0].add_keyword("LUMINANCE_XYZ_CDM2", " ".join([str(v) for v in XYZa])) for i, sample in cti3[0].DATA.iteritems(): for j, component in enumerate("XYZ"): sample["XYZ_" + component] = RGBscaled2XYZ[i][j] / XYZwscaled[1] * 100 cti3.write(temppathname + ".ti3") # Preserve custom tags display_name = profile.getDeviceModelDescription() display_manufacturer = profile.getDeviceManufacturerDescription() tags = {} for tagname in ("mmod", "meta"): if tagname in profile.tags: tags[tagname] = profile.tags[tagname] if temp: os.remove(temporig) os.remove(tempcopy) # Compute profile self.options_targen = ["-d3"] return self.create_profile(outfilename, True, display_name, display_manufacturer, tags) def chart_lookup(self, cgats, profile, as_ti3=False, fields=None, check_missing_fields=False, function="f", pcs="l", intent="r", bt1886=None, white_patches=4, white_patches_total=True, raise_exceptions=False): """ Lookup CIE or device values through profile """ if profile.colorSpace == "RGB": labels = ('RGB_R', 'RGB_G', 'RGB_B') else: labels = ('CMYK_C', 'CMYK_M', 'CMYK_Y', 'CMYK_K') ti1 = None ti3_ref = None gray = None try: if not isinstance(cgats, CGATS.CGATS): cgats = CGATS.CGATS(cgats, True) else: # Always make a copy and do not alter a passed in CGATS instance! cgats_filename = cgats.filename cgats = CGATS.CGATS(str(cgats)) cgats.filename = cgats_filename if 0 in cgats: # only look at the first section cgats[0].filename = cgats.filename cgats = cgats[0] primaries = cgats.queryi(labels) if primaries and not as_ti3: primaries.fix_device_values_scaling(profile.colorSpace) cgats.type = 'CTI1' cgats.COLOR_REP = profile.colorSpace ti1, ti3_ref, gray = self.ti1_lookup_to_ti3(cgats, profile, function, pcs, "r", white_patches, white_patches_total) if bt1886 or intent == "a": cat = profile.guess_cat() or "Bradford" for item in ti3_ref.DATA.itervalues(): if pcs == "l": X, Y, Z = colormath.Lab2XYZ(item["LAB_L"], item["LAB_A"], item["LAB_B"]) else: X, Y, Z = item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] if bt1886: X, Y, Z = bt1886.apply(X, Y, Z) if intent == "a": X, Y, Z = colormath.adapt(X, Y, Z, "D50", profile.tags.wtpt.values(), cat=cat) X, Y, Z = [v * 100 for v in (X, Y, Z)] if pcs == "l": (item["LAB_L"], item["LAB_A"], item["LAB_B"]) = colormath.XYZ2Lab(X, Y, Z) else: item["XYZ_X"], item["XYZ_Y"], item["XYZ_Z"] = X, Y, Z else: if not primaries and check_missing_fields: raise ValueError(lang.getstr("error.testchart.missing_fields", (cgats.filename, ", ".join(labels)))) ti1, ti3_ref = self.ti3_lookup_to_ti1(cgats, profile, fields, intent, white_patches) except Exception, exception: if raise_exceptions: raise exception InfoDialog(self.owner, msg=safe_unicode(exception), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) return ti1, ti3_ref, gray def ti1_lookup_to_ti3(self, ti1, profile, function="f", pcs=None, intent="r", white_patches=4, white_patches_total=True): """ Read TI1 (filename or CGATS instance), lookup device->pcs values colorimetrically through profile using Argyll's xicclu utility and return TI3 (CGATS instance) """ # ti1 if isinstance(ti1, basestring): ti1 = CGATS.CGATS(ti1) if not isinstance(ti1, CGATS.CGATS): raise TypeError('Wrong type for ti1, needs to be CGATS.CGATS ' 'instance') # profile if isinstance(profile, basestring): profile = ICCP.ICCProfile(profile) if not isinstance(profile, ICCP.ICCProfile): raise TypeError('Wrong type for profile, needs to be ' 'ICCP.ICCProfile instance') # determine pcs for lookup color_rep = profile.connectionColorSpace.upper() if color_rep == "RGB": pcs = None elif not pcs: if color_rep == 'LAB': pcs = 'l' elif color_rep == 'XYZ': pcs = 'x' else: raise ValueError('Unknown CIE color representation ' + color_rep) else: if pcs == "l": color_rep = "LAB" elif pcs == "x": color_rep = "XYZ" # get profile color space colorspace = profile.colorSpace # required fields for ti1 if colorspace == "CMYK": required = ("CMYK_C", "CMYK_M", "CMYK_Y", "CMYK_K") else: required = ("RGB_R", "RGB_G", "RGB_B") ti1_filename = ti1.filename try: ti1 = verify_cgats(ti1, required, True) except CGATS.CGATSInvalidError: raise ValueError(lang.getstr("error.testchart.invalid", ti1_filename)) except CGATS.CGATSKeyError: raise ValueError(lang.getstr("error.testchart.missing_fields", (ti1_filename, ", ".join(required)))) # read device values from ti1 data = ti1.queryv1("DATA") if not data: raise ValueError(lang.getstr("error.testchart.invalid", ti1_filename)) device_data = data.queryv(required) if not device_data: raise ValueError(lang.getstr("error.testchart.missing_fields", (ti1_filename, ", ".join(required)))) if colorspace == "RGB" and white_patches: # make sure the first four patches are white so the whitepoint can be # averaged white_rgb = {'RGB_R': 100, 'RGB_G': 100, 'RGB_B': 100} white = dict(white_rgb) wp = ti1.queryv1("APPROX_WHITE_POINT") if wp: wp = [float(v) for v in wp.split()] wp = [CGATS.rpad((v / wp[1]) * 100.0, data.vmaxlen) for v in wp] else: wp = colormath.get_standard_illuminant("D65", scale=100) for label in data.parent.DATA_FORMAT.values(): if not label in white: if label.upper() == 'LAB_L': value = 100 elif label.upper() in ('LAB_A', 'LAB_B'): value = 0 elif label.upper() == 'XYZ_X': value = wp[0] elif label.upper() == 'XYZ_Y': value = 100 elif label.upper() == 'XYZ_Z': value = wp[2] else: value = '0' white.update({label: value}) white_added_count = 0 if profile.profileClass != "link": if white_patches_total: # Ensure total of n white patches while len(data.queryi(white_rgb)) < white_patches: data.insert(0, white) white_added_count += 1 else: # Add exactly n white patches while white_added_count < white_patches: data.insert(0, white) white_added_count += 1 safe_print("Added %i white patch(es)" % white_added_count) idata = [] for primaries in device_data.values(): idata.append(primaries.values()) if debug: safe_print("ti1_lookup_to_ti3 %s -> %s idata" % (profile.colorSpace, color_rep)) for v in idata: safe_print(" ".join(("%3.4f", ) * len(v)) % tuple(v)) # lookup device->cie values through profile using (x)icclu if pcs or self.argyll_version >= [1, 6]: use_icclu = False else: # DeviceLink profile, we have to use icclu under older Argyll CMS # versions because older xicclu cannot handle devicelink use_icclu = True input_encoding = None output_encoding = None if not pcs: # Try to determine input/output encoding for devicelink if isinstance(profile.tags.get("meta"), ICCP.DictType): input_encoding = profile.tags.meta.getvalue("encoding.input") output_encoding = profile.tags.meta.getvalue("encoding.output") if input_encoding == "T": # 'T' (clip wtw on input) not supported for xicclu input_encoding = "t" # Fall back to configured 3D LUT encoding if (not input_encoding or input_encoding not in config.valid_values["3dlut.encoding.input"]): input_encoding = getcfg("3dlut.encoding.input") if input_encoding == "T": # 'T' (clip wtw on input) not supported for xicclu input_encoding = "t" if (not output_encoding or output_encoding not in config.valid_values["3dlut.encoding.output"]): output_encoding = getcfg("3dlut.encoding.output") if (self.argyll_version < [1, 6] and not (input_encoding == output_encoding == "n")): # Fail if encoding is not n (data levels) raise ValueError("The used version of ArgyllCMS only" "supports full range RGB encoding.") odata = self.xicclu(profile, idata, intent, function, pcs=pcs, scale=100, use_icclu=use_icclu, input_encoding=input_encoding, output_encoding=output_encoding) gray = [] igray = [] igray_idx = [] if colorspace == "RGB": # treat r=g=b specially: set expected a=b=0 for i, cie in enumerate(odata): r, g, b = idata[i] if r == g == b < 100: # if grayscale and not white if pcs == 'x': # Need to scale XYZ coming from xicclu # Lab is already scaled cie = colormath.XYZ2Lab(*[n * 100.0 for n in cie]) cie = (cie[0], 0, 0) # set a=b=0 igray.append("%s %s %s" % cie) igray_idx.append(i) if pcs == 'x': cie = colormath.Lab2XYZ(*cie) luminance = cie[1] else: luminance = colormath.Lab2XYZ(*cie)[1] if luminance * 100.0 >= 1: # only add if luminance is greater or equal 1% because # dark tones fluctuate too much gray.append((r, g, b)) if False: # NEVER? # set cie in odata to a=b=0 odata[i] = cie if igray and False: # NEVER? # lookup cie->device values for grays through profile using xicclu gray = [] ogray = self.xicclu(profile, igray, "r", "b", pcs="l", scale=100) for i, rgb in enumerate(ogray): cie = idata[i] if colormath.Lab2XYZ(cie[0], 0, 0)[1] * 100.0 >= 1: # only add if luminance is greater or equal 1% because # dark tones fluctuate too much gray.append(rgb) # update values in ti1 and data for ti3 for n, channel in enumerate(("R", "G", "B")): data[igray_idx[i] + white_added_count]["RGB_" + channel] = rgb[n] odata[igray_idx[i]] = cie # write output ti3 ofile = StringIO() if pcs: ofile.write('CTI3 \n') ofile.write('\nDESCRIPTOR "Argyll Calibration Target chart information 3"\n') else: ofile.write('CTI1 \n') ofile.write('\nDESCRIPTOR "Argyll Calibration Target chart information 1"\n') ofile.write('KEYWORD "DEVICE_CLASS"\n') ofile.write('DEVICE_CLASS "' + ('DISPLAY' if colorspace == 'RGB' else 'OUTPUT') + '"\n') include_sample_name = False for i, cie in enumerate(odata): if i == 0: icolor = profile.colorSpace if icolor == 'RGB': olabel = 'RGB_R RGB_G RGB_B' elif icolor == 'CMYK': olabel = 'CMYK_C CMYK_M CMYK_Y CMYK_K' else: raise ValueError('Unknown color representation ' + icolor) if color_rep == 'LAB': ilabel = 'LAB_L LAB_A LAB_B' elif color_rep in ('XYZ', 'RGB'): ilabel = 'XYZ_X XYZ_Y XYZ_Z' else: raise ValueError('Unknown CIE color representation ' + color_rep) ofile.write('KEYWORD "COLOR_REP"\n') if icolor == color_rep: ofile.write('COLOR_REP "' + icolor + '"\n') else: ofile.write('COLOR_REP "' + icolor + '_' + color_rep + '"\n') ofile.write('\n') ofile.write('NUMBER_OF_FIELDS ') if include_sample_name: ofile.write(str(2 + len(icolor) + len(color_rep)) + '\n') else: ofile.write(str(1 + len(icolor) + len(color_rep)) + '\n') ofile.write('BEGIN_DATA_FORMAT\n') ofile.write('SAMPLE_ID ') if include_sample_name: ofile.write('SAMPLE_NAME ' + olabel + ' ' + ilabel + '\n') else: ofile.write(olabel + ' ' + ilabel + '\n') ofile.write('END_DATA_FORMAT\n') ofile.write('\n') ofile.write('NUMBER_OF_SETS ' + str(len(odata)) + '\n') ofile.write('BEGIN_DATA\n') if pcs == 'x': # Need to scale XYZ coming from xicclu, Lab is already scaled cie = [round(n * 100.0, 5 - len(str(int(abs(n * 100.0))))) for n in cie] elif not pcs: # Actually CIE = RGB because Devicelink idata[i] = cie cie = [round(n * 100.0, 5 - len(str(int(abs(n * 100.0))))) for n in colormath.RGB2XYZ(*[n / 100.0 for n in cie])] device = [str(n) for n in idata[i]] cie = [str(n) for n in cie] if include_sample_name: ofile.write(str(i) + ' ' + data[i - 1][1].strip('"') + ' ' + ' '.join(device) + ' ' + ' '.join(cie) + '\n') else: ofile.write(str(i) + ' ' + ' '.join(device) + ' ' + ' '.join(cie) + '\n') ofile.write('END_DATA\n') ofile.seek(0) ti3 = CGATS.CGATS(ofile)[0] if (colorspace == "RGB" and white_patches and profile.profileClass == "link"): if white_patches_total: # Ensure total of n white patches while len(ti3.DATA.queryi(white_rgb)) < white_patches: ti3.DATA.insert(0, white) white_added_count += 1 else: # Add exactly n white patches while white_added_count < white_patches: ti3.DATA.insert(0, white) white_added_count += 1 safe_print("Added %i white patch(es)" % white_added_count) if debug: safe_print(ti3) return ti1, ti3, map(list, gray) def ti3_lookup_to_ti1(self, ti3, profile, fields=None, intent="r", add_white_patches=4): """ Read TI3 (filename or CGATS instance), lookup cie->device values colorimetrically through profile using Argyll's xicclu utility and return TI1 and compatible TI3 (CGATS instances) """ # ti3 copy = True if isinstance(ti3, basestring): copy = False ti3 = CGATS.CGATS(ti3) if not isinstance(ti3, CGATS.CGATS): raise TypeError('Wrong type for ti3, needs to be CGATS.CGATS ' 'instance') ti3_filename = ti3.filename if copy: # Make a copy and do not alter a passed in CGATS instance! ti3 = CGATS.CGATS(str(ti3)) if fields == "XYZ": labels = ("XYZ_X", "XYZ_Y", "XYZ_Z") else: labels = ("LAB_L", "LAB_A", "LAB_B") try: ti3v = verify_cgats(ti3, labels, True) except CGATS.CGATSInvalidError, exception: raise ValueError(lang.getstr("error.testchart.invalid", ti3_filename) + "\n" + lang.getstr(safe_unicode(exception))) except CGATS.CGATSKeyError: try: if fields: raise else: labels = ("XYZ_X", "XYZ_Y", "XYZ_Z") ti3v = verify_cgats(ti3, labels, True) except CGATS.CGATSKeyError: missing = ", ".join(labels) if not fields: missing += " " + lang.getstr("or") + " LAB_L, LAB_A, LAB_B" raise ValueError(lang.getstr("error.testchart.missing_fields", (ti3_filename, missing))) else: color_rep = 'XYZ' else: color_rep = fields or 'LAB' # profile if isinstance(profile, basestring): profile = ICCP.ICCProfile(profile) if not isinstance(profile, ICCP.ICCProfile): raise TypeError('Wrong type for profile, needs to be ' 'ICCP.ICCProfile instance') # determine pcs for lookup if color_rep == 'LAB': pcs = 'l' required = ("LAB_L", "LAB_A", "LAB_B") elif color_rep == 'XYZ': pcs = 'x' required = ("XYZ_X", "XYZ_Y", "XYZ_Z") else: raise ValueError('Unknown CIE color representation ' + color_rep) # get profile color space colorspace = profile.colorSpace # read cie values from ti3 data = ti3v.queryv1("DATA") if not data: raise ValueError(lang.getstr("error.testchart.invalid", ti3_filename)) cie_data = data.queryv(required) if not cie_data: raise ValueError(lang.getstr("error.testchart.missing_fields", (ti3_filename, ", ".join(required)))) idata = [] if colorspace == "RGB" and add_white_patches: # make sure the first four patches are white so the whitepoint can be # averaged wp = [n * 100.0 for n in profile.tags.wtpt.values()] if color_rep == 'LAB': wp = colormath.XYZ2Lab(*wp) wp = OrderedDict((('L', wp[0]), ('a', wp[1]), ('b', wp[2]))) else: wp = OrderedDict((('X', wp[0]), ('Y', wp[1]), ('Z', wp[2]))) wp = [wp] * int(add_white_patches) safe_print("Added %i white patches" % add_white_patches) else: wp = [] for cie in wp + cie_data.values(): cie = cie.values() if color_rep == 'XYZ': # assume scale 0...100 in ti3, we need to convert to 0...1 cie = [n / 100.0 for n in cie] idata.append(cie) if debug: safe_print("ti3_lookup_to_ti1 %s -> %s idata" % (color_rep, profile.colorSpace)) for v in idata: safe_print(" ".join(("%3.4f", ) * len(v)) % tuple(v)) # lookup cie->device values through profile.icc using xicclu odata = self.xicclu(profile, idata, intent, "b", pcs=pcs, scale=100) # write output ti1/ti3 ti1out = StringIO() ti1out.write('CTI1\n') ti1out.write('\n') ti1out.write('DESCRIPTOR "Argyll Calibration Target chart information 1"\n') include_sample_name = False for i, device in enumerate(odata): if i == 0: if color_rep == 'LAB': ilabel = 'LAB_L LAB_A LAB_B' elif color_rep == 'XYZ': ilabel = 'XYZ_X XYZ_Y XYZ_Z' else: raise ValueError('Unknown CIE color representation ' + color_rep) ocolor = profile.colorSpace.upper() if ocolor == 'RGB': olabel = 'RGB_R RGB_G RGB_B' elif ocolor == 'CMYK': olabel = 'CMYK_C CMYK_M CMYK_Y CMYK_K' else: raise ValueError('Unknown color representation ' + ocolor) olabels = olabel.split() # add device fields to DATA_FORMAT if not yet present if not olabels[0] in ti3v.DATA_FORMAT.values() and \ not olabels[1] in ti3v.DATA_FORMAT.values() and \ not olabels[2] in ti3v.DATA_FORMAT.values() and \ (ocolor == 'RGB' or (ocolor == 'CMYK' and not olabels[3] in ti3v.DATA_FORMAT.values())): ti3v.DATA_FORMAT.add_data(olabels) # add required fields to DATA_FORMAT if not yet present if not required[0] in ti3v.DATA_FORMAT.values() and \ not required[1] in ti3v.DATA_FORMAT.values() and \ not required[2] in ti3v.DATA_FORMAT.values(): ti3v.DATA_FORMAT.add_data(required) ti1out.write('KEYWORD "COLOR_REP"\n') ti1out.write('COLOR_REP "' + ocolor + '"\n') ti1out.write('\n') ti1out.write('NUMBER_OF_FIELDS ') if include_sample_name: ti1out.write(str(2 + len(color_rep) + len(ocolor)) + '\n') else: ti1out.write(str(1 + len(color_rep) + len(ocolor)) + '\n') ti1out.write('BEGIN_DATA_FORMAT\n') ti1out.write('SAMPLE_ID ') if include_sample_name: ti1out.write('SAMPLE_NAME ' + olabel + ' ' + ilabel + '\n') else: ti1out.write(olabel + ' ' + ilabel + '\n') ti1out.write('END_DATA_FORMAT\n') ti1out.write('\n') ti1out.write('NUMBER_OF_SETS ' + str(len(odata)) + '\n') ti1out.write('BEGIN_DATA\n') if i < len(wp): if ocolor == 'RGB': device = [100.00, 100.00, 100.00] else: device = [0, 0, 0, 0] # Make sure device values do not exceed valid range of 0..100 device = [str(max(0, min(v, 100))) for v in device] cie = (wp + cie_data.values())[i].values() cie = [str(n) for n in cie] if include_sample_name: ti1out.write(str(i + 1) + ' ' + data[i][1].strip('"') + ' ' + ' '.join(device) + ' ' + ' '.join(cie) + '\n') else: ti1out.write(str(i + 1) + ' ' + ' '.join(device) + ' ' + ' '.join(cie) + '\n') if i > len(wp) - 1: # don't include whitepoint patches in ti3 # set device values in ti3 for n, v in enumerate(olabels): # Assuming 0..100, 4 decimal digits is # enough for roughly 19 bits integer # device values ti3v.DATA[i - len(wp)][v] = round(float(device[n]), 4) # set PCS values in ti3 for n, v in enumerate(cie): ti3v.DATA[i - len(wp)][required[n]] = float(v) ti1out.write('END_DATA\n') ti1out.seek(0) ti1 = CGATS.CGATS(ti1out) if debug: safe_print(ti1) return ti1, ti3v def download(self, uri): # Set timeout to a sane value default_timeout = socket.getdefaulttimeout() socket.setdefaulttimeout(20) # 20 seconds try: return self._download(uri) finally: socket.setdefaulttimeout(default_timeout) def _download(self, uri, force=False): if test_badssl: uri = "https://%s.badssl.com/" % test_badssl orig_uri = uri total_size = None filename = os.path.basename(uri) download_dir = os.path.join(expanduseru("~"), "Downloads") download_path = os.path.join(download_dir, filename) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and not os.path.isfile(download_path)): # DisplayCAL versions prior to 3.1.6 were using ~/Downloads # regardless of Known Folder path, so files may already exist download_dir = get_known_folder_path("Downloads") download_path = os.path.join(download_dir, filename) response = None hashes = None is_main_dl = (uri.startswith("https://%s/download/" % domain.lower()) or uri.startswith("https://%s/Argyll/" % domain.lower())) if is_main_dl: # Always force connection to server even if local file exists for # displaycal.net/downloads/* and displaycal.net/Argyll/* # to force a hash check force = True if force or not os.path.isfile(download_path): cafile = None try: import ssl from ssl import CertificateError, SSLError except ImportError: CertificateError = ValueError SSLError = socket.error else: if hasattr(ssl, "get_default_verify_paths"): cafile = ssl.get_default_verify_paths().cafile if cafile: safe_print("Using CA file", cafile) components = urlparse.urlparse(uri) safe_print(lang.getstr("connecting.to", (components.hostname, components.port or socket.getservbyname(components.scheme)))) LoggingHTTPRedirectHandler.newurl = uri opener = urllib2.build_opener(LoggingHTTPRedirectHandler) try: response = opener.open(uri) if always_fail_download or test_badssl: raise urllib2.URLError("") newurl = getattr(LoggingHTTPRedirectHandler, "newurl", uri) if (is_main_dl or not newurl.startswith("https://%s/" % domain.lower())): # Get SHA-256 hashes so we can verify the downloaded file. # Only do this for 3rd party hosts/mirrors (no sense # doing it for files downloaded securely directly from # displaycal.net when that is also the source of our hashes # file, unless we are verifying an existing local app setup # or portable archive) noredir = urllib2.build_opener(NoHTTPRedirectHandler) hashes = noredir.open("https://%s/sha256sums.txt" % domain.lower()) except (urllib2.URLError, CertificateError, SSLError), exception: if response: response.close() if "CERTIFICATE_VERIFY_FAILED" in safe_str(exception): ekey = "ssl.certificate_verify_failed" if not cafile and isapp: ekey += ".root_ca_missing" safe_print(lang.getstr(ekey)) elif "SSLV3_ALERT_HANDSHAKE_FAILURE" in safe_str(exception): safe_print(lang.getstr("ssl.handshake_failure")) elif not "SSL:" in safe_str(exception): return exception else: safe_print(exception) if getattr(LoggingHTTPRedirectHandler, "newurl", uri) != uri: uri = LoggingHTTPRedirectHandler.newurl return DownloadError(lang.getstr("download.fail") + " " + lang.getstr("connection.fail", uri), orig_uri) uri = response.geturl() filename = os.path.basename(uri) if hashes: # Read max. 64 KB hashes hashesdata = hashes.read(1024 * 64) hashes.close() hashesdict = {} for line in hashesdata.splitlines(): if not line.strip(): continue name_hash = [value.strip() for value in line.split(None, 1)] if len(name_hash) != 2 or "" in name_hash: response.close() return DownloadError(lang.getstr("file.hash.malformed", filename), orig_uri) hashesdict[name_hash[1].lstrip("*")] = name_hash[0] expectedhash_hex = hashesdict.get(filename, "").lower() if not expectedhash_hex: response.close() return DownloadError(lang.getstr("file.hash.missing", filename), orig_uri) actualhash = sha256() total_size = response.info().getheader("Content-Length") if total_size is not None: try: total_size = int(total_size) except (TypeError, ValueError): return DownloadError(lang.getstr("download.fail.wrong_size", ("<%s>" % lang.getstr("unknown"), ) * 2), orig_uri) else: if not total_size: total_size = None contentdispo = response.info().getheader("Content-Disposition") if contentdispo: filename = re.search('filename="([^"]+)"', contentdispo) if filename: filename = filename.groups()[0] if not filename: filename = make_filename_safe(uri.rstrip("/"), concat=False) content_type = response.info().getheader("Content-Type") if content_type: content_type = content_type.split(";", 1)[0] ext = mimetypes.guess_extension(content_type or "", False) filename += ext or ".html" download_dir = os.path.join(expanduseru("~"), "Downloads") download_path = os.path.join(download_dir, filename) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and not os.path.isfile(download_path)): # DisplayCAL versions prior to 3.1.6 were using ~/Downloads # regardless of Known Folder path, so files may already exist download_dir = get_known_folder_path("Downloads") download_path = os.path.join(download_dir, filename) if (not os.path.isfile(download_path) or (total_size is not None and os.stat(download_path).st_size != total_size)): # Acquire files safely so no-one but us can mess with them fd = tmp_fd = tmp_download_path = None try: fd, download_path = mksfile(download_path) tmp_fd, tmp_download_path = mksfile(download_path + ".download") except EnvironmentError, mksfile_exception: response.close() for fd, pth in [(fd, download_path), (tmp_fd, tmp_download_path)]: if fd: os.close(fd) try: os.remove(download_path) except EnvironmentError, exception: safe_print(exception) return mksfile_exception safe_print(lang.getstr("downloading"), uri, u"\u2192", download_path) self.recent.write(lang.getstr("downloading") + " " + filename + "\n") min_chunk_size = 1024 * 8 chunk_size = min_chunk_size bytes_so_far = 0 prev_bytes_so_far = 0 unit = "Bytes" unit_size = 1.0 if total_size > 1048576: unit = "MiB" unit_size = 1048576.0 elif total_size > 1024: unit = "KiB" unit_size = 1024.0 ts = time() bps = 0 prev_percent = -1 update_ts = time() fps = 20 frametime = 1.0 / fps if not os.path.isdir(download_dir): os.makedirs(download_dir) download_file = None download_file_exception = None try: with os.fdopen(tmp_fd, "rb+") as tmp_download_file: while True: if self.thread_abort: safe_print(lang.getstr("aborted")) return False chunk = response.read(chunk_size) if not chunk: break bytes_read = len(chunk) bytes_so_far += bytes_read tmp_download_file.write(chunk) # Determine data rate tdiff = time() - ts if tdiff >= 1: bps = (bytes_so_far - prev_bytes_so_far) / tdiff prev_bytes_so_far = bytes_so_far ts = time() elif not bps: if tdiff: bps = bytes_so_far / tdiff else: bps = bytes_read bps_unit = "Bytes" bps_unit_size = 1.0 if bps > 1048576: bps_unit = "MiB" bps_unit_size = 1048576.0 elif bps > 1024: bps_unit = "KiB" bps_unit_size = 1024.0 if total_size: percent = math.floor(float(bytes_so_far) / total_size * 100) if percent > prev_percent or time() >= update_ts + frametime: self.lastmsg.write("\r%i%% (%.1f / %.1f %s, %.2f %s/s)" % (percent, bytes_so_far / unit_size, total_size / unit_size, unit, round(bps / bps_unit_size, 2), bps_unit)) prev_percent = percent update_ts = time() elif time() >= update_ts + frametime: if bytes_so_far > 1048576 and unit_size < 1048576: unit = "MiB" unit_size = 1048576.0 elif bytes_so_far > 1024 and unit_size < 1024: unit = "KiB" unit_size = 1024.0 self.lastmsg.write("\r%.1f %s (%.2f %s/s)" % (bytes_so_far / unit_size, unit, round(bps / bps_unit_size, 2), bps_unit)) update_ts = time() # Adjust chunk size based on DL rate if (int(bps / fps) > chunk_size or min_chunk_size <= int(bps / fps) < int(chunk_size * 0.75)): if debug or test or verbose > 1: safe_print("Download buffer size changed from %i KB to %i KB" % (chunk_size / 1024.0, bps / fps / 1024)) chunk_size = int(bps / fps) if not bytes_so_far: return DownloadError(lang.getstr("download.fail.empty_response", uri), orig_uri) if total_size is not None and bytes_so_far != total_size: return DownloadError(lang.getstr("download.fail.wrong_size", (total_size, bytes_so_far)), orig_uri) if total_size is None or bytes_so_far == total_size: # Succesful download, write to destination tmp_download_file.seek(0) try: with os.fdopen(fd, "wb") as download_file: while True: chunk = tmp_download_file.read(1024 * 1024) if not chunk: break download_file.write(chunk) if hashes: actualhash.update(chunk) except EnvironmentError, download_file_exception: return download_file_exception safe_print(lang.getstr("success")) finally: response.close() if not download_file_exception: # Remove temporary download file unless there was an error # writing destination try: os.remove(tmp_download_path) except EnvironmentError, exception: safe_print(exception) if self.thread_abort or download_file_exception: # Remove destination file if download aborted or error # writing destination if not download_file: # Need to close file descriptor first os.close(fd) try: os.remove(download_path) except EnvironmentError, exception: safe_print(exception) else: # File already exists if response: response.close() if hashes: # Verify hash. Get hash of existing file with open(download_path, "rb") as download_file: while True: chunk = download_file.read(1024 * 1024) if not chunk: break actualhash.update(chunk) if hashes: # Verify hash. Compare to expected hash actualhash_hex = actualhash.hexdigest() if actualhash_hex != expectedhash_hex: return Error(lang.getstr("file.hash.verification.fail", (download_path, "SHA-256=" + expectedhash_hex, "SHA-256=" + actualhash_hex))) else: safe_print("Verified hash SHA-256=" + actualhash_hex) return download_path def process_argyll_download(self, result, exit=False): if isinstance(result, Exception): show_result_dialog(result, self.owner) elif result: if (result.lower().endswith(".zip") or result.lower().endswith(".tgz")): self.start(self.set_argyll_bin, self.extract_archive, cargs=(result, ), wargs=(result, ), progress_msg=lang.getstr("please_wait"), fancy=False) else: show_result_dialog(lang.getstr("error.file_type_unsupported") + "\n" + result, self.owner) def extract_archive(self, filename): extracted = [] if filename.lower().endswith(".zip"): cls = zipfile.ZipFile mode = "r" elif filename.lower().endswith(".tgz"): cls = TarFileProper.open # classmethod mode = "r:gz" else: return extracted with cls(filename, mode) as z: outdir = os.path.realpath(os.path.dirname(filename)) if cls is not zipfile.ZipFile: method = z.getnames else: method = z.namelist names = method() names.sort() extracted = [os.path.join(outdir, os.path.normpath(name)) for name in names] if names: name0 = os.path.normpath(names[0]) for outpath in extracted: if not os.path.realpath(outpath).startswith(os.path.join(outdir, name0)): return Error(lang.getstr("file.invalid") + "\n" + filename) if cls is not zipfile.ZipFile: z.extractall(outdir) else: for name in names: # If the ZIP file was created with Unicode names stored # in the file, 'name' will already be Unicode. # Otherwise, it'll either be 7-bit ASCII or (legacy) # cp437 encoding outname = safe_unicode(name, "cp437") outpath = os.path.join(outdir, os.path.normpath(outname)) if outname.endswith("/"): if not os.path.isdir(outpath): os.makedirs(outpath) elif not os.path.isfile(outpath): with open(outpath, "wb") as outfile: outfile.write(z.read(name)) return extracted def set_argyll_bin(self, result, filename): if isinstance(result, Exception): show_result_dialog(result, self.owner) elif result and os.path.isdir(result[0]): setcfg("argyll.dir", os.path.join(result[0], "bin")) # Always write cfg directly after setting Argyll directory so # subprocesses that read the configuration will use the right # executables writecfg() from DisplayCAL import check_donation snapshot = VERSION > VERSION_BASE self.owner.set_argyll_bin_handler(None, True, self.owner.check_instrument_setup, (check_donation, (self.owner, snapshot))) else: show_result_dialog(lang.getstr("error.no_files_extracted_from_archive", filename), self.owner) def process_download(self, result, exit=False): if isinstance(result, Exception): show_result_dialog(result, self.owner) elif result: if exit: if self.owner: self.owner.Close() else: wx.GetApp().ExitMainLoop() launch_file(result) def verify_calibration(self): """ Verify the current calibration """ cmd, args = self.prepare_dispcal(calibrate=False, verify=True) if not isinstance(cmd, Exception): result = self.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) else: result = cmd return result def measure_ti1(self, ti1_path, cal_path=None, colormanaged=False, allow_video_levels=True): """ Measure a TI1 testchart file """ if allow_video_levels: result = self.detect_video_levels() if isinstance(result, Exception): return result if config.get_display_name() == "Untethered": cmd, args = get_argyll_util("spotread"), ["-v", "-e"] if getcfg("extra_args.spotread").strip(): args += parse_argument_string(getcfg("extra_args.spotread")) result = self.set_terminal_cgats(ti1_path) if isinstance(result, Exception): return result else: cmd = get_argyll_util("dispread") args = ["-v"] if getcfg("argyll.debug"): args.append("-D8") if config.get_display_name() in ("madVR", "Prisma") and colormanaged: args.append("-V") if cal_path: if (self.argyll_version >= [1, 3, 3] and (not self.has_lut_access() or not getcfg("calibration.use_video_lut"))): args.append("-K") else: args.append("-k") args.append(cal_path) if getcfg("extra_args.dispread").strip(): args += parse_argument_string(getcfg("extra_args.dispread")) result = self.add_measurement_features(args, cmd == get_argyll_util("dispread"), allow_nondefault_observer=is_ccxx_testchart(), allow_video_levels=allow_video_levels) if isinstance(result, Exception): return result self.options_dispread = list(args) if config.get_display_name() != "Untethered": args.append(os.path.splitext(ti1_path)[0]) return self.exec_cmd(cmd, args, skip_scripts=True) def wrapup(self, copy=True, remove=True, dst_path=None, ext_filter=None): """ Wrap up - copy and/or clean temporary file(s). """ if debug: safe_print("[D] wrapup(copy=%s, remove=%s)" % (copy, remove)) if not self.tempdir or not os.path.isdir(self.tempdir): return # nothing to do if (isinstance(copy, Exception) and not isinstance(copy, (UnloggedError, UnloggedInfo, UnloggedWarning)) and self.sessionlogfile): # This is an incomplete run, log exception to session logfile self.sessionlogfile.write(safe_basestring(copy)) while self.sessionlogfiles: self.sessionlogfiles.popitem()[1].close() self.sessionlogfile = None if isinstance(copy, Exception): # This is an incomplete run, check if any files have been added or # modified (except log files and 'hidden' temporary files) changes = False for filename in os.listdir(self.tempdir): if (filename.endswith(".log") or filename in (".abort", ".ok", ".wait", ".wait.cmd", ".wait.py")): # Skip log files and 'hidden' temporary files continue if (filename not in self.tmpfiles or os.stat(os.path.join(self.tempdir, filename)).st_mtime != self.tmpfiles[filename]): changes = True break if not changes: copy = False result = True if copy: try: src_listdir = os.listdir(self.tempdir) except Exception, exception: result = exception remove = False if not isinstance(result, Exception) and src_listdir: if not ext_filter: ext_filter = [".app", ".cal", ".ccmx", ".ccss", ".cmd", ".command", ".gam", ".gz", ".icc", ".icm", ".log", ".png", ".sh", ".ti1", ".ti3", ".wrl", ".wrz"] save_path = getcfg("profile.save_path") if dst_path is None: dst_path = os.path.join(save_path, getcfg("profile.name.expanded"), getcfg("profile.name.expanded") + ".ext") if isinstance(copy, Exception): # This is an incomplete run parts = os.path.normpath(dst_path).split(os.sep) # DON'T use os.path.join due to how it works under Windows: # os.path.join("c:", "foo") represents a path relative to # the current directory on drive C: (c:foo), not c:\foo. # Save incomplete runs to different directory parts = [config.datahome, "incomplete"] + parts[-2:] dst_path = os.sep.join(parts) result = check_create_dir(os.path.dirname(dst_path)) if isinstance(result, Exception): remove = False else: if isinstance(copy, Exception): safe_print("Moving files of incomplete run to", os.path.dirname(dst_path)) for basename in src_listdir: name, ext = os.path.splitext(basename) if ext_filter is None or ext.lower() in ext_filter: src = os.path.join(self.tempdir, basename) dst = os.path.join(os.path.dirname(dst_path), basename) if sys.platform == "win32": dst = make_win32_compatible_long_path(dst) if os.path.exists(dst): if os.path.isdir(dst): if verbose >= 2: safe_print(appname + ": Removing existing " "destination directory tree", dst) try: shutil.rmtree(dst, True) except Exception, exception: safe_print(u"Warning - directory '%s' " u"could not be removed: %s" % tuple(safe_unicode(s) for s in (dst, exception))) else: if verbose >= 2: safe_print(appname + ": Removing existing " "destination file", dst) try: os.remove(dst) except Exception, exception: safe_print(u"Warning - file '%s' could " u"not be removed: %s" % tuple(safe_unicode(s) for s in (dst, exception))) if remove: if verbose >= 2: safe_print(appname + ": Moving temporary " "object %s to %s" % (src, dst)) try: shutil.move(src, dst) except Exception, exception: safe_print(u"Warning - temporary object " u"'%s' could not be moved to " u"'%s': %s" % tuple(safe_unicode(s) for s in (src, dst, exception))) try: shutil.copyfile(src, dst) except Exception, exception: result2 = Error(lang.getstr("error.copy_failed", (src, dst)) + "\n" + safe_unicode(exception)) if isinstance(result, Exception): result = "\n".join(safe_unicode(error) for error in (result, result2)) else: result = result2 remove = False else: if os.path.isdir(src): if verbose >= 2: safe_print(appname + ": Copying temporary " "directory tree %s to %s" % (src, dst)) try: shutil.copytree(src, dst) except Exception, exception: safe_print(u"Warning - temporary " u"directory '%s' could not " u"be copied to '%s': %s" % tuple(safe_unicode(s) for s in (src, dst, exception))) else: if verbose >= 2: safe_print(appname + ": Copying temporary " "file %s to %s" % (src, dst)) try: shutil.copyfile(src, dst) except Exception, exception: safe_print(u"Warning - temporary file " u"'%s' could not be copied " u"to '%s': %s" % tuple(safe_unicode(s) for s in (src, dst, exception))) if remove: try: src_listdir = os.listdir(self.tempdir) except Exception, exception: safe_print(u"Error - directory '%s' listing failed: %s" % tuple(safe_unicode(s) for s in (self.tempdir, exception))) else: for basename in src_listdir: name, ext = os.path.splitext(basename) if ext_filter is None or ext.lower() not in ext_filter: src = os.path.join(self.tempdir, basename) isdir = os.path.isdir(src) if isdir: if verbose >= 2: safe_print(appname + ": Removing temporary " "directory tree", src) try: shutil.rmtree(src, True) except Exception, exception: safe_print(u"Warning - temporary directory " u"'%s' could not be removed: %s" % tuple(safe_unicode(s) for s in (src, exception))) else: if verbose >= 2: safe_print(appname + ": Removing temporary file", src) try: os.remove(src) except Exception, exception: safe_print(u"Warning - temporary file " u"'%s' could not be removed: %s" % tuple(safe_unicode(s) for s in (src, exception))) try: src_listdir = os.listdir(self.tempdir) except Exception, exception: safe_print(u"Error - directory '%s' listing failed: %s" % tuple(safe_unicode(s) for s in (self.tempdir, exception))) else: if not src_listdir: if verbose >= 2: safe_print(appname + ": Removing empty temporary directory", self.tempdir) try: shutil.rmtree(self.tempdir, True) except Exception, exception: safe_print(u"Warning - temporary directory '%s' could " u"not be removed: %s" % tuple(safe_unicode(s) for s in (self.tempdir, exception))) if isinstance(result, Exception): result = Error(safe_unicode(result) + "\n\n" + lang.getstr("tempdir_should_still_contain_files", self.tempdir)) return result def write(self, txt): if True: # Don't buffer self._write(txt) return # NEVER - Use line buffer self.buffer.append(txt) self.buffer = [line for line in StringIO("".join(self.buffer))] for line in self.buffer: if not (line.endswith("\n") or line.rstrip().endswith(":") or line.rstrip().endswith(",") or line.rstrip().endswith(".")): break self._write(line) self.buffer = self.buffer[1:] def _write(self, txt): if re.search("press 1|space when done|patch 1 of ", txt, re.I): # There are some intial measurements which we can't check for # unless -D (debug) is used for Argyll tools if not "patch 1 of " in txt.lower() or not self.patch_sequence: if "patch 1 of " in txt.lower(): self.patch_sequence = True self.patch_count = 0 self.patterngenerator_sent_count = 0 update = re.search(r"[/\\] current|patch \d+ of |the instrument " "can be removed from the screen", txt, re.I) # Send colors to pattern generator use_patterngenerator = (self.use_patterngenerator and self.patterngenerator and hasattr(self.patterngenerator, "conn")) if use_patterngenerator or self.use_madnet_tpg: rgb = re.search(r"Current RGB(?:\s+\d+){3}((?:\s+\d+(?:\.\d+)){3})", txt) if rgb: rgb = [float(v) for v in rgb.groups()[0].strip().split()] if self.use_madnet_tpg: if self.madtpg.show_rgb(*rgb): self.patterngenerator_sent_count += 1 self.log("%s: MadTPG_Net sent count: %i" % (appname, self.patterngenerator_sent_count)) else: self.exec_cmd_returnvalue = Error(lang.getstr("patterngenerator.sync_lost")) self.abort_subprocess() else: self.patterngenerator_send(rgb) # Create .ok file which will be picked up by .wait script okfilename = os.path.join(self.tempdir, ".ok") open(okfilename, "w").close() if update: # Check if patch count is higher than patterngenerator sent count if (self.patch_count > self.patterngenerator_sent_count and self.exec_cmd_returnvalue is None): # This should never happen self.exec_cmd_returnvalue = Error(lang.getstr("patterngenerator.sync_lost")) self.abort_subprocess() if update and not (self.subprocess_abort or self.thread_abort or "the instrument can be removed from the screen" in txt.lower()): self.patch_count += 1 if use_patterngenerator or self.use_madnet_tpg: self.log("%s: Patch update count: %i" % (appname, self.patch_count)) if self.use_madnet_tpg and re.match("Patch \\d+ of \\d+", txt, re.I): # Set madTPG progress bar components = txt.split() try: start = int(components[1]) end = int(components[3]) except ValueError: pass else: self.madtpg.set_progress_bar_pos(start, end) # Parse wx.CallAfter(self.parse, txt) DisplayCAL-3.5.0.0/DisplayCAL/worker_base.py0000644000076500000000000005373513220271163020312 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement from binascii import hexlify import atexit import math import os import pipes import re import shutil import subprocess as sp import sys import tempfile import textwrap import traceback if sys.platform == "win32": import win32api from argyll_names import (names as argyll_names, altnames as argyll_altnames, optional as argyll_optional) from config import exe_ext, fs_enc, get_data_path, getcfg, profile_ext from debughelpers import (Error, Info, UnloggedError, UnloggedInfo, UnloggedWarning, Warn) from log import LogFile, safe_print from meta import name as appname from multiprocess import mp, pool_slice from options import debug, verbose from util_os import getenvu, quote_args, which from util_str import safe_basestring, safe_str, safe_unicode import CGATS import colormath import config import ICCProfile as ICCP import localization as lang def Property(func): return property(**func()) def _mp_xicclu(chunk, thread_abort_event, progress_queue, profile_filename, intent="r", direction="f", order="n", pcs=None, scale=1, cwd=None, startupinfo=None, use_icclu=False, use_cam_clipping=False, logfile=None, show_actual_if_clipped=False, input_encoding=None, output_encoding=None, abortmessage="Aborted"): if not config.cfg.items(config.ConfigParser.DEFAULTSECT): config.initcfg() profile = ICCP.ICCProfile(profile_filename) xicclu = Xicclu(profile, intent, direction, order, pcs, scale, cwd, startupinfo, use_icclu, use_cam_clipping, logfile, None, show_actual_if_clipped, input_encoding, output_encoding) prevperc = 0 start = 0 num_subchunks = 50 subchunksize = float(len(chunk)) / num_subchunks for i in xrange(num_subchunks): if thread_abort_event.is_set(): xicclu.exit() return Info(abortmessage) end = int(math.ceil(subchunksize * (i + 1))) xicclu(chunk[start:end]) start = end perc = round((i + 1.0) / num_subchunks * 100) if progress_queue and perc > prevperc: progress_queue.put(perc - prevperc) prevperc = perc xicclu.exit() return xicclu.get() def _mp_generate_B2A_clut(chunk, thread_abort_event, progress_queue, profile_filename, intent, direction, pcs, use_cam_clipping, clutres, step, threshold, threshold2, interp, Linterp, m2, XYZbp, XYZwp, bpc, abortmessage="Aborted"): """ B2A cLUT generation worker This should be spawned as a multiprocessing process """ if debug: safe_print("comtypes?", "comtypes" in str(sys.modules.keys())) safe_print("numpy?", "numpy" in str(sys.modules.keys())) safe_print("wx?", "wx" in str(sys.modules.keys())) safe_print("x3dom?", "x3dom" in str(sys.modules.keys())) if not config.cfg.items(config.ConfigParser.DEFAULTSECT): config.initcfg() idata = [] abmaxval = 255 + (255 / 256.0) profile = ICCP.ICCProfile(profile_filename) xicclu1 = Xicclu(profile, intent, direction, "n", pcs, 100) if use_cam_clipping: # Use CAM Jab for clipping for cLUT grid points after a given # threshold xicclu2 = Xicclu(profile, intent, direction, "n", pcs, 100, use_cam_clipping=True) prevperc = 0 count = 0 chunksize = len(chunk) for interp_tuple in (interp, Linterp): if interp_tuple: # Use numpy for speed if interp_tuple is interp: interp_list = list(interp_tuple) else: interp_list = [interp_tuple] for i, ointerp in enumerate(interp_list): interp_list[i] = colormath.Interp(ointerp.xp, ointerp.fp, use_numpy=True) if interp_tuple is interp: interp = interp_list else: Linterp = interp_list[0] if profile.connectionColorSpace == "XYZ": m2i = m2.inverted() for a in chunk: if thread_abort_event.is_set(): if use_cam_clipping: xicclu2.exit() xicclu1.exit() return Info(abortmessage) for b in xrange(clutres): for c in xrange(clutres): d, e, f = [v * step for v in (a, b, c)] if profile.connectionColorSpace == "XYZ": # Apply TRC to XYZ values to distribute them optimally # across cLUT grid points. XYZ = [interp[i](v) for i, v in enumerate((d, e, f))] ##print "%3.6f %3.6f %3.6f" % tuple(XYZ), '->', # Scale into PCS v = m2i * XYZ if bpc and XYZbp != [0, 0, 0]: v = colormath.blend_blackpoint(v[0], v[1], v[2], None, XYZbp) ##print "%3.6f %3.6f %3.6f" % tuple(v) ##raw_input() if intent == "a": v = colormath.adapt(*v + [XYZwp, profile.tags.wtpt.ir.values()]) else: # Legacy CIELAB L = Linterp(d * 100) v = L, -128 + e * abmaxval, -128 + f * abmaxval idata.append("%.6f %.6f %.6f" % tuple(v)) # Lookup CIE -> device values through profile using xicclu if not use_cam_clipping or (pcs == "x" and a <= threshold and b <= threshold and c <= threshold): xicclu1(v) if use_cam_clipping and (pcs == "l" or a > threshold2 or b > threshold2 or c > threshold2): xicclu2(v) count += 1.0 perc = round(count / (chunksize * clutres ** 2) * 100) if progress_queue and perc > prevperc: progress_queue.put(perc - prevperc) prevperc = perc if use_cam_clipping: xicclu2.exit() data2 = xicclu2.get() else: data2 = [] xicclu1.exit() data1 = xicclu1.get() return idata, data1, data2 def check_argyll_bin(paths=None): """ Check if the Argyll binaries can be found. """ prev_dir = None for name in argyll_names: exe = get_argyll_util(name, paths) if not exe: if name in argyll_optional: continue return False cur_dir = os.path.dirname(exe) if prev_dir: if cur_dir != prev_dir: if name in argyll_optional: if verbose: safe_print("Warning: Optional Argyll " "executable %s is not in the same " "directory as the main executables " "(%s)." % (exe, prev_dir)) else: if verbose: safe_print("Error: Main Argyll " "executable %s is not in the same " "directory as the other executables " "(%s)." % (exe, prev_dir)) return False else: prev_dir = cur_dir if verbose >= 3: safe_print("Argyll binary directory:", cur_dir) if debug: safe_print("[D] check_argyll_bin OK") if debug >= 2: if not paths: paths = getenvu("PATH", os.defpath).split(os.pathsep) argyll_dir = (getcfg("argyll.dir") or "").rstrip(os.path.sep) if argyll_dir: if argyll_dir in paths: paths.remove(argyll_dir) paths = [argyll_dir] + paths safe_print("[D] Searchpath:\n ", "\n ".join(paths)) # Fedora doesn't ship Rec709.icm config.defaults["3dlut.input.profile"] = get_data_path(os.path.join("ref", "Rec709.icm")) or \ get_data_path(os.path.join("ref", "sRGB.icm")) or "" config.defaults["testchart.reference"] = get_data_path(os.path.join("ref", "ColorChecker.cie")) or "" config.defaults["gamap_profile"] = get_data_path(os.path.join("ref", "sRGB.icm")) or "" return True argyll_utils = {} def get_argyll_util(name, paths=None): """ Find a single Argyll utility. Return the full path. """ cfg_argyll_dir = getcfg("argyll.dir") if paths: cache_key = os.pathsep.join(paths) else: cache_key = cfg_argyll_dir exe = argyll_utils.get(cache_key, {}).get(name, None) if exe: return exe if not paths: paths = getenvu("PATH", os.defpath).split(os.pathsep) argyll_dir = (cfg_argyll_dir or "").rstrip(os.path.sep) if argyll_dir: if argyll_dir in paths: paths.remove(argyll_dir) paths = [argyll_dir] + paths elif verbose >= 4: safe_print("Info: Searching for", name, "in", os.pathsep.join(paths)) for path in paths: for altname in argyll_altnames.get(name, []): exe = which(altname + exe_ext, [path]) if exe: break if exe: break if verbose >= 4: if exe: safe_print("Info:", name, "=", exe) else: safe_print("Info:", "|".join(argyll_altnames[name]), "not found in", os.pathsep.join(paths)) if exe: if not cache_key in argyll_utils: argyll_utils[cache_key] = {} argyll_utils[cache_key][name] = exe return exe def get_argyll_utilname(name, paths=None): """ Find a single Argyll utility. Return the basename without extension. """ exe = get_argyll_util(name, paths) if exe: exe = os.path.basename(os.path.splitext(exe)[0]) return exe def get_argyll_version(name, paths=None): """ Determine version of a certain Argyll utility. """ argyll_version_string = get_argyll_version_string(name, paths) return parse_argyll_version_string(argyll_version_string) def get_argyll_version_string(name, paths=None): argyll_version_string = "0.0.0" cmd = get_argyll_util(name, paths) if sys.platform == "win32": startupinfo = sp.STARTUPINFO() startupinfo.dwFlags |= sp.STARTF_USESHOWWINDOW startupinfo.wShowWindow = sp.SW_HIDE else: startupinfo = None try: p = sp.Popen([cmd.encode(fs_enc), "-?"], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.STDOUT, startupinfo=startupinfo) except Exception, exception: safe_print(exception) return argyll_version_string for i, line in enumerate((p.communicate()[0] or "").splitlines()): if isinstance(line, basestring): line = line.strip() if "version" in line.lower(): argyll_version_string = line[line.lower().find("version") + 8:] break return argyll_version_string def parse_argyll_version_string(argyll_version_string): argyll_version = re.findall("(\d+|[^.\d]+)", argyll_version_string) for i, v in enumerate(argyll_version): try: argyll_version[i] = int(v) except ValueError: pass return argyll_version def printcmdline(cmd, args=None, fn=safe_print, cwd=None): """ Pretty-print a command line. """ if args is None: args = [] if cwd is None: cwd = os.getcwdu() fn(" " + cmd) i = 0 lines = [] for item in args: ispath = False if item.find(os.path.sep) > -1: if os.path.dirname(item) == cwd: item = os.path.basename(item) ispath = True if sys.platform == "win32": item = sp.list2cmdline([item]) if not item.startswith('"'): item = quote_args([item])[0] else: item = pipes.quote(item) lines.append(item) i += 1 for line in lines: fn(textwrap.fill(line, 80, expand_tabs=False, replace_whitespace=False, initial_indent=" ", subsequent_indent=" ")) class ThreadAbort(object): def __init__(self): self.event = mp.Event() def __nonzero__(self): return self.event.is_set() def __cmp__(self, other): if self.event.is_set() < other: return -1 if self.event.is_set() > other: return 1 return 0 class WorkerBase(object): def __init__(self): """ Create and return a new base worker instance. """ self.sessionlogfile = None self.subprocess_abort = False self.tempdir = None self._thread_abort = ThreadAbort() def create_tempdir(self): """ Create a temporary working directory and return its path. """ if not self.tempdir or not os.path.isdir(self.tempdir): # we create the tempdir once each calibrating/profiling run # (deleted by 'wrapup' after each run) if verbose >= 2: if not self.tempdir: msg = "there is none" else: msg = "the previous (%s) no longer exists" % self.tempdir safe_print(appname + ": Creating a new temporary directory " "because", msg) try: self.tempdir = tempfile.mkdtemp(prefix=appname + u"-") except Exception, exception: self.tempdir = None return Error("Error - couldn't create temporary directory: " + safe_str(exception)) return self.tempdir def isalive(self, subprocess=None): """ Check if subprocess is still alive """ if not subprocess: subprocess = getattr(self, "subprocess", None) return (subprocess and ((hasattr(subprocess, "poll") and subprocess.poll() is None) or (hasattr(subprocess, "isalive") and subprocess.isalive()))) def log(self, *args, **kwargs): """ Log to global logfile and session logfile (if any) """ msg = " ".join(safe_basestring(arg) for arg in args) fn = kwargs.get("fn", safe_print) fn(msg) if self.sessionlogfile: self.sessionlogfile.write(msg + "\n") @Property def thread_abort(): def fget(self): return self._thread_abort def fset(self, abort): if abort: self._thread_abort.event.set() else: self._thread_abort.event.clear() return locals() def xicclu(self, profile, idata, intent="r", direction="f", order="n", pcs=None, scale=1, cwd=None, startupinfo=None, raw=False, logfile=None, use_icclu=False, use_cam_clipping=False, get_clip=False, show_actual_if_clipped=False, input_encoding=None, output_encoding=None): """ Call xicclu, feed input floats into stdin, return output floats. input data needs to be a list of 3-tuples (or lists) with floats, alternatively a list of strings. output data will be returned in same format, or as list of strings if 'raw' is true. """ with Xicclu(profile, intent, direction, order, pcs, scale, cwd, startupinfo, use_icclu, use_cam_clipping, logfile, self, show_actual_if_clipped, input_encoding, output_encoding) as xicclu: xicclu(idata) return xicclu.get(raw, get_clip) class Xicclu(WorkerBase): def __init__(self, profile, intent="r", direction="f", order="n", pcs=None, scale=1, cwd=None, startupinfo=None, use_icclu=False, use_cam_clipping=False, logfile=None, worker=None, show_actual_if_clipped=False, input_encoding=None, output_encoding=None): WorkerBase.__init__(self) self.logfile = logfile self.worker = worker self.temp = False utilname = "icclu" if use_icclu else "xicclu" xicclu = get_argyll_util(utilname) if not xicclu: raise Error(lang.getstr("argyll.util.not_found", utilname)) if not isinstance(profile, (CGATS.CGATS, ICCP.ICCProfile)): if profile.lower().endswith(".cal"): profile = CGATS.CGATS(profile) else: profile = ICCP.ICCProfile(profile) is_profile = isinstance(profile, ICCP.ICCProfile) if not profile.fileName or not os.path.isfile(profile.fileName): if not cwd: cwd = self.create_tempdir() if isinstance(cwd, Exception): raise cwd fd, profile.fileName = tempfile.mkstemp(profile_ext, dir=cwd) stream = os.fdopen(fd, "wb") profile.write(stream) stream.close() self.temp = True elif not cwd: cwd = os.path.dirname(profile.fileName) profile_basename = safe_unicode(os.path.basename(profile.fileName)) profile_path = profile.fileName if sys.platform == "win32": profile_path = win32api.GetShortPathName(profile_path) self.profile_path = safe_str(profile_path) if sys.platform == "win32" and not startupinfo: startupinfo = sp.STARTUPINFO() startupinfo.dwFlags |= sp.STARTF_USESHOWWINDOW startupinfo.wShowWindow = sp.SW_HIDE xicclu = safe_str(xicclu) cwd = safe_str(cwd) args = [xicclu, "-s%s" % scale] if utilname == "xicclu": if (is_profile and show_actual_if_clipped and "A2B0" in profile.tags and ("B2A0" in profile.tags or direction == "if")): args.append("-a") if use_cam_clipping: args.append("-b") if get_argyll_version("xicclu") >= [1, 6]: # Add encoding parameters # Note: Not adding -e -E can cause problems due to unitialized # in_tvenc and out_tvenc variables in xicclu.c for Argyll 1.6.x if not input_encoding: input_encoding = "n" if not output_encoding: output_encoding = "n" args += ["-e" + input_encoding, "-E" + output_encoding] args.append("-f" + direction) self.output_scale = 1.0 if is_profile: if profile.profileClass not in ("abst", "link"): args.append("-i" + intent) if order != "n": args.append("-o" + order) if profile.profileClass != "link": if (direction in ("f", "ib") and (pcs == "x" or (profile.connectionColorSpace == "XYZ" and not pcs))): # In case of forward lookup with XYZ PCS, use 0..100 scaling # internally so we get extra precision from xicclu for the # decimal part. Scale back to 0..1 later. pcs = "X" self.output_scale = 100.0 if pcs: args.append("-p" + pcs) args.append(self.profile_path) if debug or verbose > 1: self.sessionlogfile = LogFile(profile_basename + ".xicclu", os.path.dirname(profile.fileName)) if is_profile: profile_act = ICCP.ICCProfile(profile.fileName) self.sessionlogfile.write("Profile ID %s (actual %s)" % (hexlify(profile.ID), hexlify(profile_act.calculateID(False)))) if cwd: self.log(lang.getstr("working_dir")) indent = " " for name in cwd.split(os.path.sep): self.log(textwrap.fill(name + os.path.sep, 80, expand_tabs=False, replace_whitespace=False, initial_indent=indent, subsequent_indent=indent)) indent += " " self.log("") self.log(lang.getstr("commandline")) printcmdline(xicclu, args[1:], fn=self.log, cwd=cwd) self.log("") self.startupinfo = startupinfo self.args = args self.cwd = cwd self.spawn() def spawn(self): self.closed = False self.output = [] self.errors = [] self.stdout = tempfile.SpooledTemporaryFile() self.stderr = tempfile.SpooledTemporaryFile() self.subprocess = sp.Popen(self.args, stdin=sp.PIPE, stdout=self.stdout, stderr=self.stderr, cwd=self.cwd, startupinfo=self.startupinfo) def __call__(self, idata): if not isinstance(idata, basestring): idata = list(idata) # Make a copy for i, v in enumerate(idata): if isinstance(v, (float, int, long)): self([idata]) return if not isinstance(v, basestring): for n in v: if not isinstance(n, (float, int, long)): raise TypeError("xicclu: Expecting list of " "strings or n-tuples with " "floats") idata[i] = " ".join([str(n) for n in v]) else: idata = idata.splitlines() numrows = len(idata) chunklen = 1000 i = 0 p = self.subprocess while True: # Process in chunks to prevent broken pipe if input data is too # large if self.subprocess_abort or self.thread_abort: if p.poll() is None: p.stdin.write("\n") p.stdin.close() p.wait() raise Info(lang.getstr("aborted")) if p.poll() is None: # We don't use communicate() because it will end the # process p.stdin.write("\n".join(idata[chunklen * i: chunklen * (i + 1)]) + "\n") p.stdin.flush() else: # Error break if self.logfile: self.logfile.write("\r%i%%" % min(round(chunklen * (i + 1) / float(numrows) * 100), 100)) if chunklen * (i + 1) > numrows - 1: break i += 1 def __enter__(self): return self def __exit__(self, etype=None, value=None, tb=None): self.exit() if tb: return False def close(self): if self.closed: return p = self.subprocess if p.poll() is None: try: p.stdin.write("\n") except IOError: pass p.stdin.close() p.wait() self.stdout.seek(0) self.output = self.stdout.readlines() self.stdout.close() self.stderr.seek(0) self.errors = self.stderr.readlines() self.stderr.close() if self.sessionlogfile and self.errors: self.sessionlogfile.write("\n".join(self.errors)) if self.logfile: self.logfile.write("\n") self.closed = True if p.returncode: # Error raise IOError("\n".join(self.errors)) def exit(self): self.close() if self.temp and os.path.isfile(self.profile_path): os.remove(self.profile_path) if self.tempdir and not os.listdir(self.tempdir): try: shutil.rmtree(self.tempdir, True) except Exception, exception: safe_print(u"Warning - temporary directory '%s' could " u"not be removed: %s" % tuple(safe_unicode(s) for s in (self.tempdir, exception))) def get(self, raw=False, get_clip=False): if raw: if self.sessionlogfile: self.sessionlogfile.write("\n".join(self.output)) self.sessionlogfile.close() return self.output parsed = [] j = 0 for i, line in enumerate(self.output): line = line.strip() if line.startswith("["): if self.sessionlogfile: self.sessionlogfile.write(line) continue elif not "->" in line: if self.sessionlogfile and line: self.sessionlogfile.write(line) continue elif self.sessionlogfile: self.sessionlogfile.write("#%i %s" % (j, line)) parts = line.split("->")[-1].strip().split() clip = parts.pop() == "(clip)" if clip: parts.pop() parsed.append([float(n) / self.output_scale for n in parts]) if get_clip: parsed[-1].append(clip) j += 1 if self.sessionlogfile: self.sessionlogfile.close() return parsed @Property def subprocess_abort(): def fget(self): if self.worker: return self.worker.subprocess_abort return False def fset(self, v): pass return locals() @Property def thread_abort(): def fget(self): if self.worker: return self.worker.thread_abort return False def fset(self, v): pass return locals() class MP_Xicclu(Xicclu): def __init__(self, profile, intent="r", direction="f", order="n", pcs=None, scale=1, cwd=None, startupinfo=None, use_icclu=False, use_cam_clipping=False, logfile=None, worker=None, show_actual_if_clipped=False, input_encoding=None, output_encoding=None): WorkerBase.__init__(self) self.logfile = logfile self.worker = worker self._in = [] self._args = (profile.fileName, intent, direction, order, pcs, scale, cwd, startupinfo, use_icclu, use_cam_clipping, None, show_actual_if_clipped, input_encoding, output_encoding, lang.getstr("aborted")) self._out = [] num_cpus = mp.cpu_count() if isinstance(profile.tags.get("A2B0"), ICCP.LUT16Type): size = profile.tags.A2B0.clut_grid_steps self.num_workers = min(max(num_cpus, 1), size) if num_cpus > 2: self.num_workers = int(self.num_workers * 0.75) self.num_batches = size // 9 else: if num_cpus > 2: self.num_workers = 2 else: self.num_workers = num_cpus self.num_batches = 1 def __call__(self, idata): self._in.append(idata) def close(self): pass def exit(self): pass def spawn(self): pass def get(self): for slices in pool_slice(_mp_xicclu, self._in, self._args, {}, self.num_workers, self.thread_abort, self.logfile, num_batches=self.num_batches): self._out.extend(slices) return self._out DisplayCAL-3.5.0.0/DisplayCAL/wxaddons.py0000644000076500000000000003706513226307131017635 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from time import sleep import os import sys import threading import types from colormath import specialpow from wxfixes import wx def AdjustMinMax(self, minvalue=0.0, maxvalue=1.0): """ Adjust min/max """ buffer = self.GetDataBuffer() for i, byte in enumerate(buffer): buffer[i] = chr(min(int(round(minvalue * 255 + ord(byte) * (maxvalue - minvalue))), 255)) wx.Image.AdjustMinMax = AdjustMinMax def Blend(self, bitmap, x, y): """ Blend the given bitmap over the specified position in this bitmap. """ dc = wx.MemoryDC(self) dc.DrawBitmap(bitmap, x, y) wx.Bitmap.Blend = Blend def Invert(self): """ Invert image colors """ databuffer = self.GetDataBuffer() for i, byte in enumerate(databuffer): databuffer[i] = chr(255 - ord(byte)) wx.Image.Invert = Invert def IsBW(self): """ Check if image is grayscale in the most effective way possible. Note that this is a costly operation even though it returns as quickly as possible for non-grayscale images (i.e. when it encounters the first non-equal RGB triplet). """ for i, byte in enumerate(self.GetDataBuffer()): if i % 3 == 2: if byte != prev_byte: return False prev_byte = byte return True wx.Image.IsBW = IsBW def GetRealClientArea(self): """ Return the real (non-overlapping) client area of a display """ # need to fix overlapping ClientArea on some Linux multi-display setups # the client area must be always smaller than the geometry clientarea = list(self.ClientArea) if self.Geometry[0] > clientarea[0]: clientarea[0] = self.Geometry[0] if self.Geometry[1] > clientarea[1]: clientarea[1] = self.Geometry[1] if self.Geometry[2] < clientarea[2]: clientarea[2] = self.Geometry[2] if self.Geometry[3] < clientarea[3]: clientarea[3] = self.Geometry[3] return wx.Rect(*clientarea) wx.Display.GetRealClientArea = GetRealClientArea def GetAllChildren(self, skip=None): """ Get children of window and its subwindows """ if not isinstance(skip, (list, tuple)): skip = [skip] children = filter(lambda child: child not in skip, self.GetChildren()) allchildren = [] for child in children: allchildren.append(child) if hasattr(child, "GetAllChildren") and hasattr(child.GetAllChildren, "__call__"): allchildren += child.GetAllChildren(skip) return allchildren wx.Window.GetAllChildren = GetAllChildren def GetDisplay(self): """ Return the display the window is shown on """ display_no = wx.Display.GetFromWindow(self) if display_no < 0: # window outside visible area display_no = 0 return wx.Display(display_no) wx.Window.GetDisplay = GetDisplay def SetMaxFontSize(self, pointsize=11): font = self.GetFont() if font.GetPointSize() > pointsize: font.SetPointSize(pointsize) self.SetFont(font) wx.Window.SetMaxFontSize = SetMaxFontSize def RealCenterOnScreen(self, dir=wx.BOTH): """ Center the window on the screen it is on, unlike CenterOnScreen which always centers on 1st screen. """ x, y = self.Position left, top, w, h = self.GetDisplay().ClientArea if dir & wx.HORIZONTAL: x = left + w / 2 - self.Size[0] / 2 if dir & wx.VERTICAL: y = top + h / 2 - self.Size[1] / 2 self.Position = x, y wx.TopLevelWindow.RealCenterOnScreen = RealCenterOnScreen def SetSaneGeometry(self, x=None, y=None, w=None, h=None): """ Set a 'sane' window position and/or size (within visible screen area). """ if not None in (x, y): # First, move to coordinates given self.SetPosition((x, y)) # Returns the first display's client area if the window # is completely outside the client area of all displays display_client_rect = self.GetDisplay().ClientArea if sys.platform not in ("darwin", "win32"): # Linux safety_margin = 40 else: safety_margin = 20 if not None in (w, h): # Set given size, but resize if needed to fit inside client area min_w, min_h = self.MinSize self.SetSize((max(min(display_client_rect[2], w), min_w), max(min(display_client_rect[3] - safety_margin, h), min_h))) if not None in (x, y): if not display_client_rect.ContainsXY(x, y) or \ not display_client_rect.ContainsRect((x, y, 100, 100)): # If outside client area or near the borders, # move to leftmost / topmost coordinates of client area self.SetPosition(display_client_rect[0:2]) wx.Window.SetSaneGeometry = SetSaneGeometry def GridGetSelectedRowsFromSelection(self): """ Return the number of fully selected rows. Unlike GetSelectedRows, include rows that have been selected by chosing individual cells. """ numcols = self.GetNumberCols() rows = [] i = -1 for cell in self.GetSelection(): row, col = cell if row > i: i = row rownumcols = 0 rownumcols += 1 if rownumcols == numcols: rows.append(row) return rows wx.grid.Grid.GetSelectedRowsFromSelection = GridGetSelectedRowsFromSelection def GridGetSelectionRows(self): """ Return the selected rows, even if not all cells in a row are selected. """ rows = [] i = -1 for row, col in self.GetSelection(): if row > i: i = row rows.append(row) return rows wx.grid.Grid.GetSelectionRows = GridGetSelectionRows def IsSizer(self): """ Check if the window is a sizer """ return isinstance(self, wx.Sizer) wx.Window.IsSizer = IsSizer def gamma_encode(R, G, B, alpha=wx.ALPHA_OPAQUE): """ (Re-)Encode R'G'B' colors with specific platform gamma. R, G, B = color components in range 0..255 Note this only has effect under wxMac which assumes a decoding gamma of 1.8 """ if sys.platform == "darwin": # Adjust for wxMac assuming gamma 1.8 instead of sRGB # Decode R'G'B' -> linear light using sRGB transfer function, then # re-encode to gamma = 1.0 / 1.8 so that when decoded with gamma = 1.8 # we get the correct sRGB color RGBa = [int(round(specialpow(v / 255., -2.4) ** (1.0 / 1.8) * 255)) for v in (R, G, B)] RGBa.append(alpha) return RGBa else: return [R, G, B, alpha] def get_platform_window_decoration_size(): if sys.platform in ("darwin", "win32"): # Size includes windows decoration if sys.platform == "win32": border = 8 # Windows 7 titlebar = 30 # Windows 7 else: border = 0 # Mac OS X 10.7 Lion titlebar = 22 # Mac OS X 10.7 Lion else: # Linux. Size does not include window decoration border = 0 titlebar = 0 return border, titlebar def draw_granger_rainbow(dc, x=0, y=0, width=1920, height=1080): """ Draw a granger rainbow to a DC """ if not isinstance(dc, wx.GCDC): raise NotImplementedError("%s lacks alpha transparency support" % dc.__class__) # Widths column_width = int(162.0 / 1920.0 * width) rainbow_width = width - column_width * 2 strip_width = int(rainbow_width / 7.0) rainbow_width = strip_width * 7 column_width = (width - rainbow_width) / 2 # Gray columns left/right dc.GradientFillLinear(wx.Rect(x, y, width, height), wx.Colour(0, 0, 0), wx.Colour(255, 255, 255), wx.UP) # Granger rainbow rainbow = [(255, 0, 255), (0, 0, 255), (0, 255, 255), (0, 255, 0), (255, 255, 0), (255, 0, 0), (255, 0, 255)] start = rainbow[-2] for i, end in enumerate(rainbow): dc.GradientFillLinear(wx.Rect(x + column_width + strip_width * i, y, strip_width, height), wx.Colour(*start), wx.Colour(*end), wx.RIGHT) start = end # White-to-black gradient with transparency for shading # Top half - white to transparent dc.GradientFillLinear(wx.Rect(x + column_width, y, rainbow_width, height / 2), wx.Colour(0, 0, 0, 0), wx.Colour(255, 255, 255, 255), wx.UP) # Bottom half - transparent to black dc.GradientFillLinear(wx.Rect(x + column_width, y + height / 2, rainbow_width, height / 2), wx.Colour(0, 0, 0, 255), wx.Colour(255, 255, 255, 0), wx.UP) def create_granger_rainbow_bitmap(width=1920, height=1080, filename=None): """ Create a granger rainbow bitmap """ # Main bitmap bmp = wx.EmptyBitmap(width, height) mdc = wx.MemoryDC(bmp) dc = wx.GCDC(mdc) draw_granger_rainbow(dc, 0, 0, width, height) mdc.SelectObject(wx.NullBitmap) if filename: name, ext = os.path.splitext(filename) ext = ext.lower() bmp_type = {".bmp": wx.BITMAP_TYPE_BMP, ".jpe": wx.BITMAP_TYPE_JPEG, ".jpg": wx.BITMAP_TYPE_JPEG, ".jpeg": wx.BITMAP_TYPE_JPEG, ".jfif": wx.BITMAP_TYPE_JPEG, ".pcx": wx.BITMAP_TYPE_PCX, ".png": wx.BITMAP_TYPE_PNG, ".tga": wx.BITMAP_TYPE_TGA, ".tif": wx.BITMAP_TYPE_TIFF, ".tiff": wx.BITMAP_TYPE_TIFF, ".xpm": wx.BITMAP_TYPE_XPM}.get(ext, wx.BITMAP_TYPE_PNG) bmp.SaveFile(filename, bmp_type) else: return bmp def get_parent_frame(window): """ Get parent frame (if any) """ parent = window.Parent while parent: if isinstance(parent, wx.Frame): return parent parent = parent.Parent class CustomEvent(wx.PyEvent): def __init__(self, typeId, object, window=None): wx.PyEvent.__init__(self, object.GetId(), typeId) self.EventObject = object self.Window = window def GetWindow(self): return self.Window _global_timer_lock = threading.Lock() wxEVT_BETTERTIMER = wx.NewEventType() EVT_BETTERTIMER = wx.PyEventBinder(wxEVT_BETTERTIMER, 1) class BetterTimerEvent(wx.PyCommandEvent): def __init__(self, id=wx.ID_ANY, ms=0): wx.PyCommandEvent.__init__(self, wxEVT_BETTERTIMER, id) self._ms = ms def GetInterval(self): return self._ms Interval = property(GetInterval) class BetterTimer(wx.Timer): """ A wx.Timer replacement. Doing GUI updates using regular timers can be incredibly segfaulty under wxPython Phoenix when several timers run concurrently. This approach uses a global lock to work around the issue. """ def __init__(self, owner=None, timerid=wx.ID_ANY): wx.Timer.__init__(self, None, timerid) self._owner = owner def Notify(self): if self._owner and _global_timer_lock.acquire(False): try: wx.PostEvent(self._owner, BetterTimerEvent(self.Id, self.Interval)) finally: _global_timer_lock.release() class BetterCallLater(wx.CallLater): def __init__(self, millis, callableObj, *args, **kwargs): wx.CallLater.__init__(self, millis, callableObj, *args, **kwargs) def Notify(self): if _global_timer_lock.acquire(True): try: wx.CallLater.Notify(self) finally: _global_timer_lock.release() class ThreadedTimer(object): """ A wx.Timer replacement that uses threads instead of actual timers which are a limited resource """ def __init__(self, owner=None, timerid=wx.ID_ANY): self._owner = owner if timerid < 0: timerid = wx.NewId() self._id = timerid self._ms = 0 self._oneshot = False self._keep_running = False self._thread = None def _notify(self): if _global_timer_lock.acquire(self._oneshot): try: self.Notify() finally: _global_timer_lock.release() def _timer(self): self._keep_running = True while self._keep_running: sleep(self._ms / 1000.0) if self._keep_running: wx.CallAfter(self._notify) if self._oneshot: self._keep_running = False def Destroy(self): pass def GetId(self): return self._id def GetInterval(self): return self._ms def GetOwner(self): return self._owner def SetOwner(self, owner): self._owner = owner Id = property(GetId) Interval = property(GetInterval) Owner = property(GetOwner, SetOwner) def IsOneShot(self): return self._oneshot def IsRunning(self): return self._keep_running def Notify(self): if self._owner: self._owner.ProcessEvent(BetterTimerEvent(self._id, self._ms)) def Start(self, milliseconds=-1, oneShot=False): if self._thread and self._thread.isAlive(): self._keep_running = False self._thread.join() if milliseconds > -1: self._ms = milliseconds self._oneshot = oneShot self._thread = threading.Thread(target=self._timer) self._thread.start() def Stop(self): self._keep_running = False class ThreadedCallLater(ThreadedTimer): def __init__(self, millis, callableObj, *args, **kwargs): ThreadedTimer.__init__(self) self._oneshot = True self._callable = callableObj self._has_run = False self._result = None self.SetArgs(*args, **kwargs) self.Start(millis) def GetResult(self): return self._result Result = property(GetResult) def HasRun(self): return self._has_run def Notify(self): self._result = self._callable(*self._args, **self._kwargs) self._has_run = True def SetArgs(self, *args, **kwargs): self._args = args self._kwargs = kwargs def Start(self, millis=None, *args, **kwargs): if args: self._args = args if kwargs: self._kwargs = kwargs ThreadedTimer.Start(self, millis, True) Restart = Start class BetterWindowDisabler(object): """ Also disables child windows instead of only top level windows. This is actually needed under Mac OS X where disabling a top level window will not prevent interaction with its children. """ windows = set() def __init__(self, skip=None): self._windows = [] self.skip = skip self.disable() def __del__(self): self.enable() def disable(self): self.enable(False) def enable(self, enable=True): if not enable: skip = self.skip or [] if skip: if not isinstance(skip, (list, tuple)): skip = [skip] toplevel = list(wx.GetTopLevelWindows()) for w in toplevel: if (w and w not in skip and "Inspection" not in "%s" % w and w not in BetterWindowDisabler.windows): self._windows.append(w) for child in w.GetAllChildren(skip + toplevel): if (child and not isinstance(child, (wx.Panel, wx.PyPanel)) and child not in BetterWindowDisabler.windows): # Don't disable panels, this can have weird side # effects for contained controls self._windows.append(child) def Enable(w, enable=True): w._BetterWindowDisabler_enabled = enable def Disable(w): w._BetterWindowDisabler_enabled = False for w in reversed(self._windows): BetterWindowDisabler.windows.add(w) enabled = w.IsEnabled() w.Disable() w._BetterWindowDisabler_Disable = w.Disable w.Disable = types.MethodType(Disable, w, type(w)) w._BetterWindowDisabler_Enable = w.Enable w.Enable = types.MethodType(Enable, w, type(w)) w.Enable(enabled) return for w in self._windows: BetterWindowDisabler.windows.remove(w) if w: if hasattr(w, "_BetterWindowDisabler_Disable"): w.Disable = w._BetterWindowDisabler_Disable if hasattr(w, "_BetterWindowDisabler_Enable"): w.Enable = w._BetterWindowDisabler_Enable if hasattr(w, "_BetterWindowDisabler_enabled"): w.Enable(w._BetterWindowDisabler_enabled) class CustomGridCellEvent(CustomEvent): def __init__(self, typeId, object, row=-1, col=-1, window=None): CustomEvent.__init__(self, typeId, object, window) self.Row = row self.Col = col def GetRow(self): return self.Row def GetCol(self): return self.Col class FileDrop(wx.FileDropTarget): def __init__(self, drophandlers=None): wx.FileDropTarget.__init__(self) if drophandlers is None: drophandlers = {} self.drophandlers = drophandlers self.unsupported_handler = None def OnDropFiles(self, x, y, filenames): self._files = [] self._filenames = filenames for filename in filenames: name, ext = os.path.splitext(filename) if ext.lower() in self.drophandlers: self._files.append((ext.lower(), filename)) if self._files: self._files.reverse() wx.CallLater(1, wx.CallAfter, self.process) elif self.unsupported_handler: wx.CallLater(1, wx.CallAfter, self.unsupported_handler) return False def process(self): ms = 1.0 / 60 while self._files: if hasattr(self, "parent") and hasattr(self.parent, "worker"): while self.parent.worker.is_working(): wx.Yield() sleep(ms) if self.parent.worker.thread_abort: return ext, filename = self._files.pop() self.drophandlers[ext](filename) DisplayCAL-3.5.0.0/DisplayCAL/wxDisplayAdjustmentFrame.py0000644000076500000000000017042213242301247022777 0ustar devwheel00000000000000# -*- coding: UTF-8 -*- """ Interactive display calibration UI """ import os import re import sys if sys.platform == "win32": from ctypes import windll elif sys.platform == "darwin": from platform import mac_ver from wxaddons import wx from lib.agw import labelbook from lib.agw.fmresources import * from lib.agw.pygauge import PyGauge from config import (get_data_path, get_default_dpi, get_icon_bundle, getbitmap, getcfg, geticon, setcfg) from config import enc from log import get_file_logger from meta import name as appname from options import debug from ordereddict import OrderedDict from util_list import intlist from util_str import safe_unicode, wrap from wxwindows import (BaseApp, BaseFrame, FlatShadedButton, numpad_keycodes, nav_keycodes, processing_keycodes, wx_Panel) import audio import config import localization as lang BGCOLOUR = wx.Colour(0x33, 0x33, 0x33) BORDERCOLOUR = wx.Colour(0x22, 0x22, 0x22) FGCOLOUR = wx.Colour(0x99, 0x99, 0x99) CRT = True def get_panel(parent, size=wx.DefaultSize): scale = max(getcfg("app.dpi") / get_default_dpi(), 1.0) size = tuple(int(round(v * scale)) for v in size) panel = wx_Panel(parent, wx.ID_ANY, size=size) if debug: from random import randint panel.SetBackgroundColour(wx.Colour(randint(0, 255), randint(0, 255), randint(0, 255))) get_panel.i += 1 wx.StaticText(panel, wx.ID_ANY, str(get_panel.i) + " " + str(size)) else: panel.SetBackgroundColour(BGCOLOUR) return panel get_panel.i = 0 def get_xy_vt_dE(groups): x = float(groups[0]) y = float(groups[1]) vt = "" dE = 0 if len(groups) > 2: vt = groups[2] or "" if groups[3]: dE = float(groups[3]) return x, y, vt, dE def set_label_and_size(txtctrl, label): txtctrl.SetMinSize((txtctrl.GetSize()[0], -1)) txtctrl.SetLabel(label) txtctrl.SetMinSize(txtctrl.GetSize()) class DisplayAdjustmentImageContainer(labelbook.ImageContainer): def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="ImageContainer"): """ Override default agw ImageContainer to use BackgroundColour and ForegroundColour with no borders/labeltext and hilite image instead of hilite shading """ labelbook.ImageContainer.__init__(self, parent, id, pos, size, style, agwStyle, name) imagelist = None for img in ("tab_hilite", "tab_selected"): bmp = getbitmap("theme/%s" % img) if not imagelist: img_w, img_h = bmp.Size imagelist = wx.ImageList(img_w, img_h) imagelist.Add(bmp) self.stateimgs = imagelist def HitTest(self, pt): """ Returns the index of the tab at the specified position or ``wx.NOT_FOUND`` if ``None``, plus the flag style of L{HitTest}. :param `pt`: an instance of `wx.Point`, to test for hits. :return: The index of the tab at the specified position plus the hit test flag, which can be one of the following bits: ====================== ======= ================================ HitTest Flags Value Description ====================== ======= ================================ ``IMG_OVER_IMG`` 0 The mouse is over the tab icon ``IMG_OVER_PIN`` 1 The mouse is over the pin button ``IMG_OVER_EW_BORDER`` 2 The mouse is over the east-west book border ``IMG_NONE`` 3 Nowhere ====================== ======= ================================ """ if self.GetParent().GetParent().is_busy: return -1, IMG_NONE style = self.GetParent().GetAGWWindowStyleFlag() if style & INB_USE_PIN_BUTTON: if self._pinBtnRect.Contains(pt): return -1, IMG_OVER_PIN for i in xrange(len(self._pagesInfoVec)): if self._pagesInfoVec[i].GetPosition() == wx.Point(-1, -1): break if i in self.GetParent().disabled_pages: continue # For Web Hover style, we test the TextRect if not self.HasAGWFlag(INB_WEB_HILITE): buttonRect = wx.RectPS((self._pagesInfoVec[i].GetPosition()[0], self._pagesInfoVec[i].GetPosition()[1] + i * 8), self._pagesInfoVec[i].GetSize()) else: buttonRect = self._pagesInfoVec[i].GetTextRect() if buttonRect.Contains(pt): return i, IMG_OVER_IMG if self.PointOnSash(pt): return -1, IMG_OVER_EW_BORDER else: return -1, IMG_NONE def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` event for L{ImageContainer}. :param `event`: a `wx.PaintEvent` event to be processed. """ dc = wx.BufferedPaintDC(self) style = self.GetParent().GetAGWWindowStyleFlag() backBrush = wx.Brush(self.GetBackgroundColour()) if style & INB_BORDER: borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DSHADOW)) else: borderPen = wx.TRANSPARENT_PEN size = self.GetSize() # Background dc.SetBrush(backBrush) borderPen.SetWidth(1) dc.SetPen(borderPen) dc.DrawRectangle(0, 0, size.x, size.y) bUsePin = (style & INB_USE_PIN_BUTTON and [True] or [False])[0] if bUsePin: # Draw the pin button clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) if self._bCollapsed: return clientSize = 0 bUseYcoord = (style & INB_RIGHT or style & INB_LEFT) if bUseYcoord: clientSize = size.GetHeight() else: clientSize = size.GetWidth() # We reserver 20 pixels for the 'pin' button # The drawing of the images start position. This is # depenedent of the style, especially when Pin button # style is requested if bUsePin: if style & INB_TOP or style & INB_BOTTOM: pos = (style & INB_BORDER and [0] or [1])[0] else: pos = (style & INB_BORDER and [20] or [21])[0] else: pos = (style & INB_BORDER and [0] or [1])[0] nPadding = 4 # Pad text with 2 pixels on the left and right nTextPaddingLeft = 2 count = 0 for i in xrange(len(self._pagesInfoVec)): if self.GetParent().GetParent().is_busy and i != self.GetParent().GetSelection(): continue if i in self.GetParent().disabled_pages: continue count = count + 1 # incase the 'fit button' style is applied, we set the rectangle width to the # text width plus padding # Incase the style IS applied, but the style is either LEFT or RIGHT # we ignore it normalFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) dc.SetFont(normalFont) textWidth, textHeight = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption()) # Restore font to be normal normalFont.SetWeight(wx.FONTWEIGHT_NORMAL) dc.SetFont(normalFont) # Default values for the surronounding rectangle # around a button rectWidth = self._nImgSize # To avoid the recangle to 'touch' the borders rectHeight = self._nImgSize # Incase the style requires non-fixed button (fit to text) # recalc the rectangle width if style & INB_FIT_BUTTON and \ not ((style & INB_LEFT) or (style & INB_RIGHT)) and \ not self._pagesInfoVec[i].GetCaption() == "" and \ not (style & INB_SHOW_ONLY_IMAGES): rectWidth = ((textWidth + nPadding * 2) > rectWidth and [nPadding * 2 + textWidth] or [rectWidth])[0] # Make the width an even number if rectWidth % 2 != 0: rectWidth += 1 # Check that we have enough space to draw the button # If Pin button is used, consider its space as well (applicable for top/botton style) # since in the left/right, its size is already considered in 'pos' pinBtnSize = (bUsePin and [20] or [0])[0] if pos + rectWidth + pinBtnSize > clientSize: break # Calculate the button rectangle modRectWidth = ((style & INB_LEFT or style & INB_RIGHT) and [rectWidth - 2] or [rectWidth])[0] modRectHeight = ((style & INB_LEFT or style & INB_RIGHT) and [rectHeight] or [rectHeight - 2])[0] if bUseYcoord: buttonRect = wx.Rect(1, pos, modRectWidth, modRectHeight) else: buttonRect = wx.Rect(pos , 1, modRectWidth, modRectHeight) if bUseYcoord: rect = wx.Rect(0, pos, rectWidth, rectWidth) else: rect = wx.Rect(pos, 0, rectWidth, rectWidth) # Incase user set both flags: # INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES # We override them to display both if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES: style ^= INB_SHOW_ONLY_TEXT style ^= INB_SHOW_ONLY_IMAGES self.GetParent().SetAGWWindowStyleFlag(style) # Draw the caption and text imgTopPadding = 0 if not style & INB_SHOW_ONLY_TEXT and self._pagesInfoVec[i].GetImageIndex() != -1: if bUseYcoord: imgXcoord = 0 imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [pos] or [pos + imgTopPadding])[0] + (8 * (count - 1)) else: imgXcoord = pos + (rectWidth / 2) - (self._nImgSize / 2) imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [self._nImgSize / 2] or [imgTopPadding])[0] if self._nHoeveredImgIdx == i: self.stateimgs.Draw(0, dc, 0, imgYcoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) if self._nIndex == i: self.stateimgs.Draw(1, dc, 0, imgYcoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) self._ImageList.Draw(self._pagesInfoVec[i].GetImageIndex(), dc, imgXcoord, imgYcoord, wx.IMAGELIST_DRAW_TRANSPARENT, True) # Draw the text if not style & INB_SHOW_ONLY_IMAGES and not self._pagesInfoVec[i].GetCaption() == "": dc.SetFont(normalFont) # Check if the text can fit the size of the rectangle, # if not truncate it fixedText = self._pagesInfoVec[i].GetCaption() if not style & INB_FIT_BUTTON or (style & INB_LEFT or (style & INB_RIGHT)): fixedText = self.FixTextSize(dc, self._pagesInfoVec[i].GetCaption(), self._nImgSize *2 - 4) # Update the length of the text textWidth, textHeight = dc.GetTextExtent(fixedText) if bUseYcoord: textOffsetX = ((rectWidth - textWidth) / 2 ) textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [pos + self._nImgSize + imgTopPadding + 3] or \ [pos + ((self._nImgSize * 2 - textHeight) / 2 )])[0] else: textOffsetX = (rectWidth - textWidth) / 2 + pos + nTextPaddingLeft textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [self._nImgSize + imgTopPadding + 3] or \ [((self._nImgSize * 2 - textHeight) / 2 )])[0] dc.SetTextForeground(self.GetForegroundColour()) dc.DrawText(fixedText, textOffsetX, textOffsetY) # Update the page info self._pagesInfoVec[i].SetPosition(buttonRect.GetPosition()) self._pagesInfoVec[i].SetSize(buttonRect.GetSize()) pos += rectWidth # Update all buttons that can not fit into the screen as non-visible #for ii in xrange(count, len(self._pagesInfoVec)): #self._pagesInfoVec[ii].SetPosition(wx.Point(-1, -1)) # Draw the pin button if bUsePin: clientRect = self.GetClientRect() pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20) self.DrawPin(dc, pinRect, not self._bCollapsed) class DisplayAdjustmentFlatImageBook(labelbook.FlatImageBook): def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, agwStyle=0, name="FlatImageBook"): """ Override default agw ImageContainer to use BackgroundColour and ForegroundColour with no borders/labeltext and hilite image instead of hilite shading """ labelbook.FlatImageBook.__init__(self, parent, id, pos, size, style, agwStyle, name) def CreateImageContainer(self): return DisplayAdjustmentImageContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag()) def SetAGWWindowStyleFlag(self, agwStyle): """ Sets the window style. :param `agwStyle`: can be a combination of the following bits: =========================== =========== ================================================== Window Styles Hex Value Description =========================== =========== ================================================== ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for L{FlatImageBook}. ``INB_LEFT`` 0x2 Place labels on the left side. Available only for L{FlatImageBook}. ``INB_RIGHT`` 0x4 Place labels on the right side. ``INB_TOP`` 0x8 Place labels above the page area. ``INB_BORDER`` 0x10 Draws a border around L{LabelBook} or L{FlatImageBook}. ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for L{LabelBook}. ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for L{LabelBook}. ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control. ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for L{LabelBook}. ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control. ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for L{LabelBook}. ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for L{LabelBook}. ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area. ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. =========================== =========== ================================================== """ self._agwStyle = agwStyle # Check that we are not in initialization process if self._bInitializing: return if not self._pages: return # Detach the windows attached to the sizer if self.GetSelection() >= 0: self._mainSizer.Detach(self._windows[self.GetSelection()]) self._mainSizer.Detach(self._pages) # Create new sizer with the requested orientaion className = self.GetName() if className == "LabelBook": self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: self._mainSizer = wx.BoxSizer(wx.HORIZONTAL) else: self._mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self._mainSizer) # Add the tab container and the separator self._mainSizer.Add(self._pages, 0, wx.EXPAND) if className == "FlatImageBook": scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 if agwStyle & INB_LEFT or agwStyle & INB_RIGHT: border = int(round(24 * scale)) self._pages.SetSizeHints(self._pages._nImgSize + border, -1) else: self._pages.SetSizeHints(-1, self._pages._nImgSize) # Attach the windows back to the sizer to the sizer if self.GetSelection() >= 0: self.DoSetSelection(self._windows[self.GetSelection()]) if agwStyle & INB_FIT_LABELTEXT: self.ResizeTabArea() self._mainSizer.Layout() dummy = wx.SizeEvent(wx.DefaultSize) wx.PostEvent(self, dummy) self._pages.Refresh() class DisplayAdjustmentPanel(wx_Panel): def __init__(self, parent=None, id=wx.ID_ANY, title="", ctrltype="luminance"): wx_Panel.__init__(self, parent, id) self.ctrltype = ctrltype self.SetBackgroundColour(BGCOLOUR) self.SetForegroundColour(FGCOLOUR) self.SetSizer(wx.BoxSizer(wx.VERTICAL)) self.title_txt = wx.StaticText(self, wx.ID_ANY, title) font = self.title_txt.GetFont() font.SetPointSize(font.PointSize + 1) font.SetWeight(wx.FONTWEIGHT_BOLD) self.title_txt.SetFont(font) self.title_txt.SetForegroundColour(FGCOLOUR) self.GetSizer().Add(self.title_txt) self.sizer = wx.FlexGridSizer(0, 2, 0, 0) self.GetSizer().Add(self.sizer, flag=wx.TOP, border=8) self.gauges = OrderedDict() self.txt = OrderedDict() if ctrltype == "check_all": txt = wx.StaticText(self, wx.ID_ANY, lang.getstr("calibration.interactive_display_adjustment.check_all")) txt.SetForegroundColour(FGCOLOUR) txt.SetMaxFontSize(10) txt.Wrap(250) self.desc = txt self.GetSizer().Insert(1, txt, flag=wx.TOP, border=8) for name, lstr in (("luminance", "calibration.luminance"), ("black_level", "calibration.black_luminance"), ("white_point", "whitepoint"), ("black_point", "black_point")): bitmap = wx.StaticBitmap(self, wx.ID_ANY, getbitmap("theme/icons/16x16/%s" % name)) bitmap.SetToolTipString(lang.getstr(lstr)) self.add_txt(name, bitmap, 4) return if ctrltype.startswith("rgb"): if ctrltype == "rgb_offset": # CRT lstr = "calibration.interactive_display_adjustment.black_point.crt" else: lstr = "calibration.interactive_display_adjustment.white_point" txt = wx.StaticText(self, wx.ID_ANY, lang.getstr(lstr) + " " + lang.getstr("calibration.interactive_display_adjustment.generic_hint.plural")) txt.SetForegroundColour(FGCOLOUR) txt.SetMaxFontSize(10) txt.Wrap(250) self.desc = txt self.GetSizer().Insert(1, txt, flag=wx.TOP, border=8) self.sizer.Add((1, 4)) self.sizer.Add((1, 4)) self.add_marker() self.add_gauge("R", ctrltype + "_red", "R") self.sizer.Add((1, 4)) self.sizer.Add((1, 4)) self.add_gauge("G", ctrltype + "_green", "G") self.sizer.Add((1, 4)) self.sizer.Add((1, 4)) self.add_gauge("B", ctrltype + "_blue", "B") self.add_marker("btm") self.add_txt("rgb") else: txt = wx.StaticText(self, wx.ID_ANY, " ") txt.SetForegroundColour(FGCOLOUR) txt.SetMaxFontSize(10) txt.Wrap(250) self.desc = txt self.GetSizer().Insert(1, txt, flag=wx.TOP, border=8) self.sizer.Add((1, 4)) self.sizer.Add((1, 4)) self.add_marker() bitmapnames = {"rgb_offset": "black_level", "rgb_gain": "luminance"} lstrs = {"black_level": "calibration.black_luminance", "rgb_offset": "calibration.black_luminance", "rgb_gain": "calibration.luminance", "luminance": "calibration.luminance"} self.add_gauge("L", bitmapnames.get(ctrltype, ctrltype), lang.getstr(lstrs.get(ctrltype, ctrltype))) self.add_marker("btm") self.add_txt("luminance") def add_gauge(self, name="R", bitmapname=None, tooltip=None): if bitmapname == "black_level" or bitmapname.startswith("rgb_offset"): gaugecolors = {"R": (wx.Colour(102, 0, 0), wx.Colour(204, 0, 0)), "G": (wx.Colour(0, 102, 0), wx.Colour(0, 204, 0)), "B": (wx.Colour(0, 0, 102), wx.Colour(0, 0, 204)), "L": (wx.Colour(102, 102, 102), wx.Colour(204, 204, 204))} else: gaugecolors = {"R": (wx.Colour(153, 0, 0), wx.Colour(255, 0, 0)), "G": (wx.Colour(0, 153, 0), wx.Colour(0, 255, 0)), "B": (wx.Colour(0, 0, 153), wx.Colour(0, 0, 255)), "L": (wx.Colour(153, 153, 153), wx.Colour(255, 255, 255))} scale = max(getcfg("app.dpi") / get_default_dpi(), 1.0) self.gauges[name] = PyGauge(self, size=(int(round(200 * scale)), int(round(8 * scale)))) self.gauges[name].SetBackgroundColour(BORDERCOLOUR) self.gauges[name].SetBarGradient(gaugecolors[name]) self.gauges[name].SetBorderColour(BORDERCOLOUR) self.gauges[name].SetValue(0) if bitmapname: self.gauges[name].label = wx.StaticBitmap(self, wx.ID_ANY, getbitmap("theme/icons/16x16/%s" % bitmapname)) if tooltip: self.gauges[name].label.SetToolTipString(tooltip) else: self.gauges[name].label = wx.StaticText(self, wx.ID_ANY, name) self.gauges[name].label.SetForegroundColour(FGCOLOUR) self.sizer.Add(self.gauges[name].label, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=8) self.sizer.Add(self.gauges[name], flag=wx.ALIGN_CENTER_VERTICAL) def add_marker(self, direction="top"): self.sizer.Add((1, 1)) scale = max(getcfg("app.dpi") / get_default_dpi(), 1.0) self.sizer.Add(wx.StaticBitmap(self, -1, getbitmap("theme/marker_%s" % direction), size=(int(round(200 * scale)), int(round(10 * scale))))) def add_txt(self, name, spacer=None, border=8): checkmark = wx.StaticBitmap(self, wx.ID_ANY, getbitmap("theme/icons/16x16/checkmark")) txtsizer = wx.BoxSizer(wx.HORIZONTAL) if spacer: self.sizer.Add(spacer, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8) txtsizer.Add(checkmark, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8) else: self.sizer.Add(checkmark, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=8) initial = lang.getstr("initial") current = lang.getstr("current") target = lang.getstr("target") strings = {len(initial): initial, len(current): current, len(target): target} longest = strings[max(strings.keys())] label = longest + u" x 0.0000 y 0.0000 VDT 0000K 0.0 \u0394E*00" checkmark.GetContainingSizer().Hide(checkmark) self.sizer.Add(txtsizer, flag=wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=border) self.txt[name] = wx.StaticText(self, wx.ID_ANY, label) self.txt[name].SetForegroundColour(BGCOLOUR) self.txt[name].SetMaxFontSize(10) self.txt[name].checkmark = checkmark self.txt[name].spacer = spacer txtsizer.Add(self.txt[name]) self.txt[name].Fit() self.txt[name].SetMinSize((self.txt[name].GetSize()[0], self.txt[name].GetSize()[1] * 2)) def update_desc(self): if self.ctrltype in ("luminance", "black_level"): if self.ctrltype == "black_level": lstr = "calibration.interactive_display_adjustment.black_level.crt" elif getcfg("measurement_mode") == "c": # CRT lstr = "calibration.interactive_display_adjustment.white_level.crt" else: lstr = "calibration.interactive_display_adjustment.white_level.lcd" self.desc.SetLabel(lang.getstr(lstr) + " " + lang.getstr("calibration.interactive_display_adjustment.generic_hint.singular")) self.desc.Wrap(250) class DisplayAdjustmentFrame(BaseFrame): def __init__(self, parent=None, handler=None, keyhandler=None, start_timer=True): BaseFrame.__init__(self, parent, wx.ID_ANY, lang.getstr("calibration.interactive_display_adjustment"), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL, name="displayadjustmentframe") self.SetIcons(get_icon_bundle([256, 48, 32, 16], appname)) self.SetBackgroundColour(BGCOLOUR) self.sizer = wx.FlexGridSizer(0, 3, 0, 0) self.sizer.AddGrowableCol(1) self.sizer.AddGrowableRow(2) self.SetSizer(self.sizer) # FlatImageNotebook self.lb = DisplayAdjustmentFlatImageBook(self, agwStyle=INB_LEFT | INB_SHOW_ONLY_IMAGES) self.lb.SetBackgroundColour(BGCOLOUR) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.sizer.Add(self.lb, 1, flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.pagenum_2_argyll_key_num = {} # Page - black luminance self.page_black_luminance = DisplayAdjustmentPanel(self, wx.ID_ANY, lang.getstr("calibration.black_luminance"), "black_level") self.lb.AddPage(self.page_black_luminance, lang.getstr("calibration.black_luminance"), True, 0) self.pagenum_2_argyll_key_num[len(self.pagenum_2_argyll_key_num)] = "1" # Page - white point self.page_white_point = DisplayAdjustmentPanel(self, wx.ID_ANY, lang.getstr("whitepoint") + " / " + lang.getstr("calibration.luminance"), "rgb_gain") self.lb.AddPage(self.page_white_point, lang.getstr("whitepoint"), True, 1) self.pagenum_2_argyll_key_num[len(self.pagenum_2_argyll_key_num)] = "2" # Page - luminance self.page_luminance = DisplayAdjustmentPanel(self, wx.ID_ANY, lang.getstr("calibration.luminance")) self.lb.AddPage(self.page_luminance, lang.getstr("calibration.luminance"), True, 2) self.pagenum_2_argyll_key_num[len(self.pagenum_2_argyll_key_num)] = "3" # Page - black point self.page_black_point = DisplayAdjustmentPanel(self, wx.ID_ANY, lang.getstr("black_point") + " / " + lang.getstr("calibration.black_luminance"), "rgb_offset") self.lb.AddPage(self.page_black_point, lang.getstr("black_point"), True, 3) self.pagenum_2_argyll_key_num[len(self.pagenum_2_argyll_key_num)] = "4" # Page - check all self.page_check_all = DisplayAdjustmentPanel(self, wx.ID_ANY, lang.getstr("calibration.check_all"), "check_all") self.lb.AddPage(self.page_check_all, lang.getstr("calibration.check_all"), True, 4) self.pagenum_2_argyll_key_num[len(self.pagenum_2_argyll_key_num)] = "5" # Set colours on tab list self.lb.Children[0].SetBackgroundColour(BGCOLOUR) self.lb.Children[0].SetForegroundColour(FGCOLOUR) # Sound when measuring # Needs to be stereo! self.measurement_sound = audio.Sound(get_data_path("beep.wav")) # Add buttons self.btnsizer = wx.BoxSizer(wx.HORIZONTAL) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.sizer.Add(self.btnsizer, flag=wx.ALIGN_RIGHT | wx.EXPAND) self.btnsizer.Add(get_panel(self, (2, 12)), 1, flag=wx.EXPAND) self.indicator_panel = get_panel(self, (22, 12)) self.indicator_panel.SetSizer(wx.BoxSizer(wx.HORIZONTAL)) self.indicator_panel.SetForegroundColour(FGCOLOUR) self.btnsizer.Add(self.indicator_panel, flag=wx.EXPAND) scale = max(getcfg("app.dpi") / get_default_dpi(), 1.0) self.indicator_ctrl = wx.StaticBitmap(self.indicator_panel, wx.ID_ANY, geticon(10, "empty", use_mask=True), size=(int(round(10 * scale)), int(round(10 * scale)))) self.indicator_ctrl.SetForegroundColour(FGCOLOUR) self.indicator_panel.GetSizer().Add(self.indicator_ctrl, flag=wx.ALIGN_CENTER_VERTICAL) self.indicator_panel.GetSizer().Add(get_panel(self.indicator_panel, (10, 12)), flag=wx.EXPAND) self.create_start_interactive_adjustment_button() self.adjustment_btn.SetDefault() self.btnsizer.Add(get_panel(self, (6, 12)), flag=wx.EXPAND) if getcfg("measurement.play_sound"): bitmap = getbitmap("theme/icons/16x16/sound_volume_full") else: bitmap = getbitmap("theme/icons/16x16/sound_off") self.sound_on_off_btn = self.create_gradient_button(bitmap, "", name="sound_on_off_btn") self.sound_on_off_btn.SetToolTipString(lang.getstr("measurement.play_sound")) self.sound_on_off_btn.Bind(wx.EVT_BUTTON, self.measurement_play_sound_handler) self.btnsizer.Add(get_panel(self, (12, 12)), flag=wx.EXPAND) self.calibration_btn = self.create_gradient_button(getbitmap("theme/icons/10x10/skip"), "", name="calibration_btn") self.calibration_btn.Bind(wx.EVT_BUTTON, self.continue_to_calibration) self.calibration_btn.Disable() self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.add_panel((12, 12), flag=wx.EXPAND) self.keyhandler = keyhandler if sys.platform == "darwin": # Use an accelerator table for tab, space, 0-9, A-Z, numpad, # navigation keys and processing keys keycodes = [wx.WXK_TAB, wx.WXK_SPACE] keycodes.extend(range(ord("0"), ord("9"))) keycodes.extend(range(ord("A"), ord("Z"))) keycodes.extend(numpad_keycodes) keycodes.extend(nav_keycodes) keycodes.extend(processing_keycodes) self.id_to_keycode = {} for keycode in keycodes: self.id_to_keycode[wx.NewId()] = keycode accels = [] for id, keycode in self.id_to_keycode.iteritems(): self.Bind(wx.EVT_MENU, self.key_handler, id=id) accels.append((wx.ACCEL_NORMAL, keycode, id)) if keycode == wx.WXK_TAB: accels.append((wx.ACCEL_SHIFT, keycode, id)) self.SetAcceleratorTable(wx.AcceleratorTable(accels)) else: self.Bind(wx.EVT_CHAR_HOOK, self.key_handler) # Event handlers self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.Bind(wx.EVT_MOVE, self.OnMove, self) self.timer = wx.Timer(self) if handler: self.Bind(wx.EVT_TIMER, handler, self.timer) self.Bind(labelbook.EVT_IMAGENOTEBOOK_PAGE_CHANGING, self.OnPageChanging) self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy, self) if "gtk3" in wx.PlatformInfo: # Fix background color not working for panels under GTK3 self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) # Final initialization steps self.logger = get_file_logger("adjust") self._setup(True) self.Show() if start_timer: self.start_timer() if "gtk3" in wx.PlatformInfo: OnEraseBackground = wx_Panel.__dict__["OnEraseBackground"] def EndModal(self, returncode=wx.ID_OK): return returncode def MakeModal(self, makemodal=False): pass def OnClose(self, event): #if getattr(self, "measurement_play_sound_ctrl", None): #setcfg("measurement.play_sound", #int(self.measurement_play_sound_ctrl.GetValue())) config.writecfg() if not self.timer.IsRunning(): self.Destroy() else: self.keepGoing = False def OnDestroy(self, event): self.stop_timer() del self.timer def OnMove(self, event): if self.IsShownOnScreen() and not self.IsIconized() and \ (not self.GetParent() or not self.GetParent().IsShownOnScreen()): prev_x = getcfg("position.progress.x") prev_y = getcfg("position.progress.y") x, y = self.GetScreenPosition() if x != prev_x or y != prev_y: setcfg("position.progress.x", x) setcfg("position.progress.y", y) def OnPageChanging(self, event): oldsel = event.GetOldSelection() newsel = event.GetSelection() self.abort() event.Skip() def Pulse(self, msg=""): if msg: msg = safe_unicode(msg, enc) if ((msg in (lang.getstr("instrument.initializing"), lang.getstr("instrument.calibrating"), lang.getstr("please_wait"), lang.getstr("aborting")) or msg == " " * 4 or ": error -" in msg.lower() or "failed" in msg.lower() or msg.startswith(lang.getstr("webserver.waiting")) or msg.startswith(lang.getstr("connection.waiting"))) and msg != self.lastmsg): self.lastmsg = msg self.Freeze() for txt in self.lb.GetCurrentPage().txt.itervalues(): txt.checkmark.GetContainingSizer().Hide(txt.checkmark) txt.SetLabel(" ") txt = self.lb.GetCurrentPage().txt.values()[0] if txt.GetLabel() != wrap(msg, 46): txt.SetLabel(wrap(msg, 46)) txt.SetForegroundColour(FGCOLOUR) self.Thaw() return self.keepGoing, False def Resume(self): self.keepGoing = True def UpdateProgress(self, value, msg=""): return self.Pulse(msg) def UpdatePulse(self, msg=""): return self.Pulse(msg) def _assign_image_list(self): imagelist = None modes = {CRT: {"black_luminance": "luminance", "luminance": "contrast"}} for img in ("black_luminance", "white_point", "luminance", "black_point", "check_all"): img = modes.get(getcfg("measurement_mode") == "c", {}).get(img, img) bmp = getbitmap("theme/icons/72x72/%s" % img) if not imagelist: img_w, img_h = bmp.Size imagelist = wx.ImageList(img_w, img_h) imagelist.Add(bmp) self.lb.AssignImageList(imagelist) def _setup(self, init=False): self.logger.info("-" * 80) self.cold_run = True self.is_busy = None self.is_measuring = None self.keepGoing = True self.lastmsg = "" self.target_br = None self._assign_image_list() if getcfg("measurement_mode") == "c": self.lb.disabled_pages = [] if getcfg("calibration.black_luminance", False): self.lb.SetSelection(0) else: self.lb.disabled_pages.append(0) self.lb.SetSelection(1) else: self.lb.disabled_pages = [0, 3] self.lb.SetSelection(1) if getcfg("trc"): self.calibration_btn.SetLabel(lang.getstr("calibration.start")) elif getcfg("calibration.continue_next"): self.calibration_btn.SetLabel(lang.getstr("calibration.skip")) else: self.calibration_btn.SetLabel(lang.getstr("finish")) for btn in (self.adjustment_btn, self.sound_on_off_btn, self.calibration_btn): if hasattr(btn, "_lastBestSize"): del btn._lastBestSize self.calibration_btn.GetContainingSizer().Layout() # Update black luminance page description self.lb.GetPage(0).update_desc() # Update white luminance page description self.lb.GetPage(2).update_desc() # Set size scale = getcfg("app.dpi") / get_default_dpi() if scale < 1: scale = 1 img_w, img_h = map(int, map(round, (84 * scale, 72 * scale))) min_h = (img_h + 8) * (self.lb.GetPageCount() - len(self.lb.disabled_pages)) + 2 - 8 if init: self.lb.SetMinSize((418, min_h)) self.lb.SetMinSize((self.lb.GetMinSize()[0], max(self.lb.GetMinSize()[1], min_h))) self.lb.GetCurrentPage().Fit() self.lb.GetCurrentPage().Layout() self.lb.Fit() self.lb.Layout() self.SetMinSize((0, 0)) self.Fit() self.Layout() # The button sizer will be as wide as the labelbook or wider, # so use it as reference w = self.btnsizer.GetSize()[0] - img_w - 12 for pagenum in xrange(0, self.lb.GetPageCount()): page = self.lb.GetPage(pagenum) page.SetSize((w, -1)) page.desc.SetLabel(page.desc.GetLabel().replace("\n", " ")) if (sys.platform == "darwin" and intlist(mac_ver()[0].split(".")) >= [10, 10]): margin = 24 else: margin = 12 page.desc.Wrap(w - margin) bitmaps = {"black_level": {CRT: "luminance", not CRT: "black_level"}, "luminance": {CRT: "contrast", not CRT: "luminance"}} if page.ctrltype == "check_all": for name in bitmaps: bitmap = bitmaps.get(name).get(getcfg("measurement_mode") == "c") page.txt[name].spacer.SetBitmap(getbitmap("theme/icons/16x16/" + bitmap)) else: ctrltype = {"rgb_offset": "black_level", "rgb_gain": "luminance"}.get(page.ctrltype, page.ctrltype) bitmap = bitmaps.get(ctrltype).get(getcfg("measurement_mode") == "c") page.gauges["L"].label.SetBitmap(getbitmap("theme/icons/16x16/" + bitmap)) page.Fit() page.Layout() for txt in page.txt.itervalues(): txt.SetLabel(" ") self.lb.SetMinSize((self.lb.GetMinSize()[0], max(self.lb.GetCurrentPage().GetSize()[1], min_h))) self.Fit() self.Sizer.SetSizeHints(self) self.Sizer.Layout() # Set position x = getcfg("position.progress.x") y = getcfg("position.progress.y") self.SetSaneGeometry(x, y) def abort(self): if self.has_worker_subprocess(): if self.is_measuring: self.worker.safe_send(" ") def abort_and_send(self, key): self.abort() if self.has_worker_subprocess(): if self.worker.safe_send(key): self.is_busy = True self.adjustment_btn.Disable() self.calibration_btn.Disable() def add_panel(self, size=wx.DefaultSize, flag=0): panel = get_panel(self, size) self.sizer.Add(panel, flag=flag) return panel def continue_to_calibration(self, event=None): if getcfg("trc"): self.abort_and_send("7") else: self.abort_and_send("8") def create_start_interactive_adjustment_button(self, icon="play", enable=False, startstop="start"): if getattr(self, "adjustment_btn", None): self.adjustment_btn._bitmap = getbitmap("theme/icons/10x10/%s" % icon) self.adjustment_btn.SetLabel(lang.getstr("calibration.interactive_display_adjustment.%s" % startstop)) self.adjustment_btn.Enable(enable) return self.adjustment_btn = self.create_gradient_button(getbitmap("theme/icons/10x10/%s" % icon), lang.getstr("calibration.interactive_display_adjustment.%s" % startstop), name="adjustment_btn") self.adjustment_btn.Bind(wx.EVT_BUTTON, self.start_interactive_adjustment) self.adjustment_btn.Enable(enable) def create_gradient_button(self, bitmap, label, name): btn = FlatShadedButton(self, bitmap=bitmap, label=label, name=name, fgcolour=FGCOLOUR) self.btnsizer.Add(btn) self.btnsizer.Layout() return btn def flush(self): pass def has_worker_subprocess(self): return bool(getattr(self, "worker", None) and getattr(self.worker, "subprocess", None)) def isatty(self): return True def key_handler(self, event): #print {wx.EVT_CHAR.typeId: 'EVT_CHAR', #wx.EVT_CHAR_HOOK.typeId: 'EVT_CHAR_HOOK', #wx.EVT_KEY_DOWN.typeId: 'EVT_KEY_DOWN', #wx.EVT_MENU.typeId: 'EVT_MENU'}.get(event.GetEventType(), #event.GetEventType()) keycode = None if event.GetEventType() in (wx.EVT_CHAR.typeId, wx.EVT_CHAR_HOOK.typeId, wx.EVT_KEY_DOWN.typeId): keycode = event.GetKeyCode() elif event.GetEventType() == wx.EVT_MENU.typeId: keycode = self.id_to_keycode.get(event.GetId()) if keycode == wx.WXK_TAB: self.global_navigate() or event.Skip() elif keycode >= 0: if keycode == ord(" "): if (not isinstance(self.FindFocus(), FlatShadedButton) or self.FindFocus() is self.adjustment_btn): if self.is_measuring: self.abort() else: self.start_interactive_adjustment() else: event.Skip() elif keycode in [ord(str(c)) for c in range(1, 6)]: key_num = chr(keycode) pagenum = dict(zip(self.pagenum_2_argyll_key_num.values(), self.pagenum_2_argyll_key_num.keys())).get(key_num) if pagenum not in self.lb.disabled_pages and not self.is_measuring: self.lb.SetSelection(pagenum) self.start_interactive_adjustment() elif keycode in (ord("\x1b"), ord("7"), ord("8"), ord("Q"), ord("q")): if not getcfg("trc") and keycode == ord("7"): # Ignore pass elif self.keyhandler: self.keyhandler(event) elif self.has_worker_subprocess(): self.worker.safe_send(chr(keycode)) else: event.Skip() else: event.Skip() else: event.Skip() def measurement_play_sound_handler(self, event): #self.measurement_play_sound_ctrl.SetValue(not self.measurement_play_sound_ctrl.GetValue()) setcfg("measurement.play_sound", int(not(bool(getcfg("measurement.play_sound"))))) if getcfg("measurement.play_sound"): bitmap = getbitmap("theme/icons/16x16/sound_volume_full") else: bitmap = getbitmap("theme/icons/16x16/sound_off") self.sound_on_off_btn._bitmap = bitmap def parse_txt(self, txt): colors = {True: wx.Colour(0x33, 0xcc, 0x0), False: FGCOLOUR} if not txt: return self.logger.info("%r" % txt) self.Pulse(txt) if "/ Current" in txt: indicator = getbitmap("theme/icons/10x10/record") else: indicator = getbitmap("theme/icons/10x10/record_outline") target_br = re.search("Target white brightness = (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if getcfg("measurement_mode") == "c": target_bl = re.search("Target Near Black = (\d+(?:\.\d+)?), Current = (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if target_bl: self.lb.GetCurrentPage().target_bl = ["Target", float(target_bl.groups()[0])] initial_br = re.search("(Initial|Target)(?: Br)? (\d+(?:\.\d+)?)\s*(?:, x (\d+(?:\.\d+)?)\s*, y (\d+(?:\.\d+)?)(?:\s*, (?:(V[CD]T \d+K?) )?DE(?: 2K)? (\d+(?:\.\d+)?))?|$)".replace(" ", "\s+"), txt, re.I) current_br = None current_bl = None if target_br and not getattr(self, "target_br", None): self.target_br = ["Target", float(target_br.groups()[0])] if initial_br: self.lb.GetCurrentPage().initial_br = [initial_br.groups()[0], float(initial_br.groups()[1])] + list(initial_br.groups()[2:]) if self.lb.GetCurrentPage().ctrltype != "check_all": current_br = re.search("Current(?: Br)? (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) else: current_br = re.search("Target Brightness = (?:\d+(?:\.\d+)?), Current = (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if not current_br: current_br = re.search("Current Brightness = (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if getcfg("measurement_mode") == "c": if target_bl: current_bl = float(target_bl.groups()[1]) else: current_bl = re.search("Black = XYZ (?:\d+(?:\.\d+)?) (\d+(?:\.\d+)?) (?:\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if current_bl: current_bl = float(current_bl.groups()[0]) xy_dE_rgb = re.search("x (\d+(?:\.\d+)?)[=+-]*, y (\d+(?:\.\d+)?)[=+-]*,? (?:(V[CD]T \d+K?) )?DE(?: 2K)? (\d+(?:\.\d+)?) R([=+-]+) G([=+-]+) B([=+-]+)".replace(" ", "\s+"), txt, re.I) white_xy_dE_re = "(?:Target white = x (?:\d+(?:\.\d+)?), y (?:\d+(?:\.\d+)?), Current|Current white) = x (\d+(?:\.\d+)?), y (\d+(?:\.\d+)?), (?:(?:(V[CD]T \d+K?) )?DE(?: 2K)?|error =) (\d+(?:\.\d+)?)".replace(" ", "\s+") white_xy_dE = re.search(white_xy_dE_re, txt, re.I) black_xy_dE = re.search(white_xy_dE_re.replace("white", "black"), txt, re.I) white_xy_target = re.search("Target white = x (\d+(?:\.\d+)?), y (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) black_xy_target = re.search("Target black = x (\d+(?:\.\d+)?), y (\d+(?:\.\d+)?)".replace(" ", "\s+"), txt, re.I) if current_br or current_bl or xy_dE_rgb or white_xy_dE or black_xy_dE: self.Freeze() #for t in ("target_br", "target_bl", "initial_br", "current_br", "current_bl"): #if locals()[t]: #print "\n" + t, locals()[t].groups(), if current_br: initial_br = getattr(self.lb.GetCurrentPage(), "initial_br", None) if self.lb.GetCurrentPage().ctrltype in ("rgb_gain", "luminance", "check_all"): target_br = getattr(self, "target_br", None) else: target_br = None if self.lb.GetCurrentPage().ctrltype == "rgb_gain" and initial_br: initial_br = ["Initial"] + initial_br[1:] compare_br = target_br or initial_br or ("Initial", float(current_br.groups()[0])) lstr = (compare_br[0]).lower() if compare_br[1]: percent = 100.0 / compare_br[1] else: percent = 100.0 l_diff = float(current_br.groups()[0]) - compare_br[1] l = int(round(50 + l_diff * percent)) if self.lb.GetCurrentPage().gauges.get("L"): self.lb.GetCurrentPage().gauges["L"].SetValue(min(max(l, 1), 100)) self.lb.GetCurrentPage().gauges["L"].Refresh() if self.lb.GetCurrentPage().txt.get("luminance"): if initial_br or target_br: #and round(l_diff, 2): if round(l_diff, 2) > 0: sign = "+" elif round(l_diff, 2) < 0: sign = "-" else: sign = u"\u00B1" # plusminus label = u"%s %.2f cd/m\u00b2\n%s %.2f cd/m\u00b2 (%s%.2f%%)" % (lang.getstr(lstr), compare_br[1], lang.getstr("current"), float(current_br.groups()[0]), sign, abs(l_diff) * percent) else: label = lang.getstr("current") + u" %.2f cd/m\u00b2" % float(current_br.groups()[0]) self.lb.GetCurrentPage().txt["luminance"].checkmark.GetContainingSizer().Show(self.lb.GetCurrentPage().txt["luminance"].checkmark, lstr == "target" and abs(l_diff) * percent <= 1) self.lb.GetCurrentPage().txt["luminance"].SetForegroundColour(colors[lstr == "target" and abs(l_diff) * percent <= 1]) set_label_and_size(self.lb.GetCurrentPage().txt["luminance"], label) if current_bl and self.lb.GetCurrentPage().txt.get("black_level"): target_bl = getattr(self.lb.GetCurrentPage(), "target_bl", None) or getattr(self.lb.GetCurrentPage(), "initial_br", None) if target_bl: percent = 100.0 / target_bl[1] if target_bl: #and round(target_bl[1], 2) != round(current_bl, 2): l_diff = current_bl - target_bl[1] if round(l_diff, 2) > 0: sign = "+" elif round(l_diff, 2) < 0: sign = "-" else: sign = u"\u00B1" # plusminus label = u"%s %.2f cd/m\u00b2\n%s %.2f cd/m\u00b2 (%s%.2f%%)" % (lang.getstr("target"), target_bl[1], lang.getstr("current"), current_bl, sign, abs(l_diff) * percent) else: if target_bl: l_diff = 0 else: l_diff = None label = lang.getstr("current") + u" %.2f cd/m\u00b2" % current_bl self.lb.GetCurrentPage().txt["black_level"].checkmark.GetContainingSizer().Show(self.lb.GetCurrentPage().txt["black_level"].checkmark, l_diff is not None and abs(l_diff) * percent <= 1) self.lb.GetCurrentPage().txt["black_level"].SetForegroundColour(colors[l_diff is not None and abs(l_diff) * percent <= 1]) set_label_and_size(self.lb.GetCurrentPage().txt["black_level"], label) # groups()[0] = x # groups()[1] = y # groups()[2] = VDT/VCT (optional) # groups()[3] = dE # groups()[4] = R +- # groups()[5] = G +- # groups()[6] = B +- if xy_dE_rgb: x, y, vdt, dE = get_xy_vt_dE(xy_dE_rgb.groups()) r = int(round(50 - (xy_dE_rgb.groups()[4].count("+") - xy_dE_rgb.groups()[4].count("-")) * (dE))) g = int(round(50 - (xy_dE_rgb.groups()[5].count("+") - xy_dE_rgb.groups()[5].count("-")) * (dE))) b = int(round(50 - (xy_dE_rgb.groups()[6].count("+") - xy_dE_rgb.groups()[6].count("-")) * (dE))) if self.lb.GetCurrentPage().gauges.get("R"): self.lb.GetCurrentPage().gauges["R"].SetValue(min(max(r, 1), 100)) self.lb.GetCurrentPage().gauges["R"].Refresh() if self.lb.GetCurrentPage().gauges.get("G"): self.lb.GetCurrentPage().gauges["G"].SetValue(min(max(g, 1), 100)) self.lb.GetCurrentPage().gauges["G"].Refresh() if self.lb.GetCurrentPage().gauges.get("B"): self.lb.GetCurrentPage().gauges["B"].SetValue(min(max(b, 1), 100)) self.lb.GetCurrentPage().gauges["B"].Refresh() if self.lb.GetCurrentPage().txt.get("rgb"): self.lb.GetCurrentPage().txt["rgb"].checkmark.GetContainingSizer().Show(self.lb.GetCurrentPage().txt["rgb"].checkmark, abs(dE) <= 1) self.lb.GetCurrentPage().txt["rgb"].SetForegroundColour(colors[abs(dE) <= 1]) label = (lang.getstr("current") + u" x %.4f y %.4f %s %.1f \u0394E*00" % (x, y, vdt, dE)).replace(" ", " ") initial_br = getattr(self.lb.GetCurrentPage(), "initial_br", None) if initial_br and len(initial_br) > 3: x, y, vdt, dE = get_xy_vt_dE(initial_br[2:]) label = (lang.getstr(initial_br[0].lower()) + u" x %.4f y %.4f %s %.1f \u0394E*00\n" % (x, y, vdt, dE)).replace(" ", " ") + label set_label_and_size(self.lb.GetCurrentPage().txt["rgb"], label) if white_xy_dE: x, y, vdt, dE = get_xy_vt_dE(white_xy_dE.groups()) if self.lb.GetCurrentPage().txt.get("white_point"): self.lb.GetCurrentPage().txt["white_point"].checkmark.GetContainingSizer().Show(self.lb.GetCurrentPage().txt["white_point"].checkmark, abs(dE) <= 1) self.lb.GetCurrentPage().txt["white_point"].SetForegroundColour(colors[abs(dE) <= 1]) label = (lang.getstr("current") + u" x %.4f y %.4f %s %.1f \u0394E*00" % (x, y, vdt, dE)).replace(" ", " ") if white_xy_target: x, y, vdt, dE = get_xy_vt_dE(white_xy_target.groups()) label = (lang.getstr("target") + u" x %.4f y %.4f\n" % (x, y)).replace(" ", " ") + label set_label_and_size(self.lb.GetCurrentPage().txt["white_point"], label) if black_xy_dE: x, y, vdt, dE = get_xy_vt_dE(black_xy_dE.groups()) if self.lb.GetCurrentPage().txt.get("white_point"): self.lb.GetCurrentPage().txt["black_point"].checkmark.GetContainingSizer().Show(self.lb.GetCurrentPage().txt["black_point"].checkmark, abs(dE) <= 1) self.lb.GetCurrentPage().txt["black_point"].SetForegroundColour(colors[abs(dE) <= 1]) label = (lang.getstr("current") + u" x %.4f y %.4f %s %.1f \u0394E*00" % (x, y, vdt, dE)).replace(" ", " ") if black_xy_target: x, y, vdt, dE = get_xy_vt_dE(black_xy_target.groups()) label = (lang.getstr("target") + u" x %.4f y %.4f\n" % (x, y)).replace(" ", " ") + label set_label_and_size(self.lb.GetCurrentPage().txt["black_point"], label) if ((current_br or current_bl or xy_dE_rgb) and self.lb.GetCurrentPage().ctrltype != "check_all"): if getcfg("measurement.play_sound"): self.measurement_sound.safe_play() self.indicator_ctrl.SetBitmap(indicator) self.btnsizer.Layout() if current_br or current_bl or xy_dE_rgb or white_xy_dE or black_xy_dE: self.lb.GetCurrentPage().Layout() self.Thaw() if "Press 1 .. 7" in txt or "8) Exit" in txt: if self.cold_run: self.cold_run = False self.Pulse(" " * 4) if self.is_measuring is not False: self.lb.Children[0].Refresh() if self.is_measuring is True: self.create_start_interactive_adjustment_button(enable=True) else: self.adjustment_btn.Enable() self.is_busy = False self.is_measuring = False self.indicator_ctrl.SetBitmap(geticon(10, "empty", use_mask=True)) self.calibration_btn.Enable() self.lb.SetFocus() # Make frame receive EVT_CHAR_HOOK events under Linux elif "initial measurements" in txt or "check measurements" in txt: self.is_busy = True self.lb.Children[0].Refresh() self.Pulse(lang.getstr("please_wait")) if not self.is_measuring: self.create_start_interactive_adjustment_button("pause", True, "stop") self.is_measuring = True self.lb.SetFocus() # Make frame receive EVT_CHAR_HOOK events under Linux #self.SetTitle("is_measuring %s timer.IsRunning %s keepGoing %s" % #(str(self.is_measuring), self.timer.IsRunning(), self.keepGoing)) def reset(self): self.Freeze() self._setup() # Reset controls for pagenum in xrange(0, self.lb.GetPageCount()): page = self.lb.GetPage(pagenum) page.initial_br = None page.target_bl = None for name in ("R", "G", "B", "L"): if page.gauges.get(name): page.gauges[name].SetValue(0) page.gauges[name].Refresh() for txt in page.txt.itervalues(): txt.checkmark.GetContainingSizer().Hide(txt.checkmark) txt.SetForegroundColour(FGCOLOUR) self.create_start_interactive_adjustment_button() self.calibration_btn.Disable() self.Thaw() def start_interactive_adjustment(self, event=None): if self.is_measuring: self.abort() else: self.abort_and_send(self.pagenum_2_argyll_key_num[self.lb.GetSelection()]) def start_timer(self, ms=50): self.timer.Start(ms) def stop_timer(self): self.timer.Stop() def write(self, txt): wx.CallAfter(self.parse_txt, txt) if __name__ == "__main__": from thread import start_new_thread from time import sleep class Subprocess(): def send(self, bytes): start_new_thread(test, (bytes,)) class Worker(object): def __init__(self): self.subprocess = Subprocess() def safe_send(self, bytes): self.subprocess.send(bytes) return True config.initcfg() lang.init() app = BaseApp(0) if "--crt" in sys.argv[1:]: setcfg("measurement_mode", "c") else: setcfg("measurement_mode", "l") app.TopWindow = DisplayAdjustmentFrame(start_timer=False) app.TopWindow.worker = Worker() app.TopWindow.Show() i = 0 def test(bytes=None): global i # 0 = dispcal -v -yl # 1 = dispcal -v -yl -b130 # 2 = dispcal -v -yl -B0.5 # 3 = dispcal -v -yl -t5200 # 4 = dispcal -v -yl -t5200 -b130 -B0.5 menu = r""" Press 1 .. 7 1) Black level (CRT: Offset/Brightness) 2) White point (Color temperature, R,G,B, Gain/Contrast) 3) White level (CRT: Gain/Contrast, LCD: Brightness/Backlight) 4) Black point (R,G,B, Offset/Brightness) 5) Check all 6) Measure and set ambient for viewing condition adjustment 7) Continue on to calibration 8) Exit """ if bytes == " ": txt = "\n" + menu elif bytes == "1": # Black level txt = [r"""Doing some initial measurements Black = XYZ 0.19 0.20 0.28 Grey = XYZ 27.20 27.79 24.57 White = XYZ 126.48 128.71 112.75 Adjust CRT brightness to get target level. Press space when done. Target 1.29 / Current 2.02 -""", r"""Doing some initial measurements Black = XYZ 0.19 0.20 0.29 Grey = XYZ 27.11 27.76 24.72 White = XYZ 125.91 128.38 113.18 Adjust CRT brightness to get target level. Press space when done. Target 1.28 / Current 2.02 -""", r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.28 Grey = XYZ 27.08 27.72 24.87 White = XYZ 125.47 127.86 113.60 Adjust CRT brightness to get target level. Press space when done. Target 1.28 / Current 2.02 -""", r"""Doing some initial measurements Black = XYZ 0.19 0.20 0.29 Grey = XYZ 27.11 27.77 25.01 White = XYZ 125.21 127.80 113.90 Adjust CRT brightness to get target level. Press space when done. Target 1.28 / Current 2.03 -""", r"""Doing some initial measurements Black = XYZ 0.19 0.20 0.30 Grey = XYZ 23.56 24.14 21.83 White = XYZ 124.87 130.00 112.27 Adjust CRT brightness to get target level. Press space when done. Target 1.28 / Current 1.28"""][i] elif bytes == "2": # White point txt = [r"""Doing some initial measurements Red = XYZ 81.08 39.18 2.41 Green = XYZ 27.63 80.13 10.97 Blue = XYZ 18.24 9.90 99.75 White = XYZ 126.53 128.96 112.57 Adjust R,G & B gain to desired white point. Press space when done. Initial Br 128.96, x 0.3438 , y 0.3504 , VDT 5152K DE 2K 4.7 / Current Br 128.85, x 0.3439-, y 0.3502+ VDT 5151K DE 2K 4.8 R- G++ B-""", r"""Doing some initial measurements Red = XYZ 80.48 38.87 2.43 Green = XYZ 27.58 79.99 10.96 Blue = XYZ 18.34 9.93 100.24 White = XYZ 125.94 128.32 113.11 Adjust R,G & B gain to desired white point. Press space when done. Initial Br 130.00, x 0.3428 , y 0.3493 , VDT 5193K DE 2K 4.9 / Current Br 128.39, x 0.3428-, y 0.3496+ VDT 5190K DE 2K 4.7 R- G++ B-""", r"""Doing some initial measurements Red = XYZ 80.01 38.57 2.44 Green = XYZ 27.51 79.85 10.95 Blue = XYZ 18.45 9.94 100.77 White = XYZ 125.48 127.88 113.70 Adjust R,G & B gain to desired white point. Press space when done. Initial Br 127.88, x 0.3419 , y 0.3484 , VDT 5232K DE 2K 5.0 / Current Br 127.87, x 0.3419-, y 0.3485+ VDT 5231K DE 2K 4.9 R- G++ B-""", r"""Doing some initial measurements Red = XYZ 79.69 38.48 2.44 Green = XYZ 27.47 79.76 10.95 Blue = XYZ 18.50 9.95 101.06 White = XYZ 125.08 127.71 113.91 Adjust R,G & B gain to get target x,y. Press space when done. Target Br 127.71, x 0.3401 , y 0.3540 / Current Br 127.70, x 0.3412-, y 0.3481+ DE 4.8 R- G++ B-""", r"""Doing some initial measurements Red = XYZ 79.47 38.41 2.44 Green = XYZ 27.41 79.72 10.94 Blue = XYZ 18.52 9.96 101.20 White = XYZ 124.87 130.00 112.27 Adjust R,G & B gain to get target x,y. Press space when done. Target Br 130.00, x 0.3401 , y 0.3540 / Current Br 130.00, x 0.3401=, y 0.3540= DE 0.0 R= G= B="""][i] elif bytes == "3": # White level txt = [r"""Doing some initial measurements White = XYZ 126.56 128.83 112.65 Adjust CRT Contrast or LCD Brightness to desired level. Press space when done. Initial 128.83 / Current 128.85""", r"""Doing some initial measurements White = XYZ 125.87 128.23 113.43 Adjust CRT Contrast or LCD Brightness to get target level. Press space when done. Target 130.00 / Current 128.24 +""", r"""Doing some initial measurements White = XYZ 125.33 127.94 113.70 Adjust CRT Contrast or LCD Brightness to desired level. Press space when done. Initial 127.94 / Current 127.88""", r"""Doing some initial measurements White = XYZ 125.00 127.72 114.03 Adjust CRT Contrast or LCD Brightness to desired level. Press space when done. Initial 127.72 / Current 127.69""", r"""Doing some initial measurements White = XYZ 124.87 130.00 112.27 Adjust CRT Contrast or LCD Brightness to get target level. Press space when done. Target 130.00 / Current 130.00"""][i] elif bytes == "4": # Black point txt = [r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 27.25 27.83 24.52 White = XYZ 126.60 128.86 112.54 Adjust R,G & B offsets to get target x,y. Press space when done. Target Br 1.29, x 0.3440 , y 0.3502 / Current Br 2.03, x 0.3409+, y 0.3484+ DE 1.7 R++ G+ B-""", r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 27.19 27.87 24.94 White = XYZ 125.83 128.16 113.57 Adjust R,G & B offsets to get target x,y. Press space when done. Target Br 1.28, x 0.3423 , y 0.3487 / Current Br 2.03, x 0.3391+, y 0.3470+ DE 1.7 R++ G+ B-""", r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 27.14 27.79 24.97 White = XYZ 125.49 127.89 113.90 Adjust R,G & B offsets to get target x,y. Press space when done. Target Br 1.28, x 0.3417 , y 0.3482 / Current Br 2.02, x 0.3386+, y 0.3466+ DE 1.7 R++ G+ B-""", r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.30 Grey = XYZ 27.10 27.79 25.12 White = XYZ 125.12 127.68 114.09 Adjust R,G & B offsets to get target x,y. Press space when done. Target Br 1.28, x 0.3401 , y 0.3540 / Current Br 2.04, x 0.3373+, y 0.3465+ DE 4.4 R+ G++ B-""", r"""Doing some initial measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 23.56 24.14 21.83 White = XYZ 124.87 130.00 112.27 Adjust R,G & B offsets to get target x,y. Press space when done. Target Br 1.28, x 0.3401 , y 0.3540 / Current Br 1.28, x 0.3401=, y 0.3540= DE 0.0 R= G= B="""][i] elif bytes == "5": # Check all txt = [r"""Doing check measurements Black = XYZ 0.19 0.20 0.29 Grey = XYZ 27.22 27.80 24.49 White = XYZ 126.71 128.91 112.34 1% = XYZ 1.94 1.98 1.76 Current Brightness = 128.91 Target 50% Level = 24.42, Current = 27.80, error = 2.6% Target Near Black = 1.29, Current = 2.02, error = 0.6% Current white = x 0.3443, y 0.3503, VDT 5137K DE 2K 5.0 Target black = x 0.3443, y 0.3503, Current = x 0.3411, y 0.3486, error = 1.73 DE Press 1 .. 7""", r"""Doing check measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 27.10 27.75 24.85 White = XYZ 125.78 128.17 113.53 1% = XYZ 1.93 1.98 1.79 Target Brightness = 130.00, Current = 128.17, error = -1.4% Target 50% Level = 24.28, Current = 27.75, error = 2.7% Target Near Black = 1.28, Current = 2.02, error = 0.6% Current white = x 0.3423, y 0.3488, VDT 5215K DE 2K 4.9 Target black = x 0.3423, y 0.3488, Current = x 0.3391, y 0.3467, error = 1.69 DE Press 1 .. 7""", r"""Doing check measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 27.09 27.74 24.95 White = XYZ 125.32 127.78 113.82 1% = XYZ 1.93 1.98 1.80 Current Brightness = 127.78 Target 50% Level = 24.21, Current = 27.74, error = 2.8% Target Near Black = 1.28, Current = 2.02, error = 0.6% Current white = x 0.3415, y 0.3483, VDT 5243K DE 2K 4.9 Target black = x 0.3415, y 0.3483, Current = x 0.3386, y 0.3465, error = 1.55 DE Press 1 .. 7""", r"""Doing check measurements Black = XYZ 0.19 0.20 0.29 Grey = XYZ 26.98 27.68 24.97 White = XYZ 125.00 127.56 113.99 1% = XYZ 1.92 1.97 1.80 Current Brightness = 127.56 Target 50% Level = 24.17, Current = 27.68, error = 2.8% Target Near Black = 1.28, Current = 2.02, error = 0.6% Target white = x 0.3401, y 0.3540, Current = x 0.3410, y 0.3480, error = 4.83 DE Target black = x 0.3401, y 0.3540, Current = x 0.3372, y 0.3464, error = 4.48 DE Press 1 .. 7""", r"""Doing check measurements Black = XYZ 0.19 0.21 0.29 Grey = XYZ 23.56 24.14 21.83 White = XYZ 124.87 130.00 112.27 1% = XYZ 1.92 1.97 1.80 Target Brightness = 130.00, Current = 130.00, error = 0.0% Target 50% Level = 24.14, Current = 24.14, error = 0.0% Target Near Black = 1.27, Current = 1.27, error = 0.0% Target white = x 0.3401, y 0.3540, Current = x 0.3401, y 0.3540, error = 0.00 DE Target black = x 0.3401, y 0.3540, Current = x 0.3401, y 0.3540, error = 0.00 DE Press 1 .. 7"""][i] elif bytes == "7" or not bytes: if bytes == "7": if i < 4: i += 1 else: i -= 4 wx.CallAfter(app.TopWindow.reset) txt = [r"""Setting up the instrument Place instrument on test window. Hit Esc or Q to give up, any other key to continue: Display type is LCD Target white = native white point Target white brightness = native brightness Target black brightness = native brightness Target advertised gamma = 2.400000""", r"""Setting up the instrument Place instrument on test window. Hit Esc or Q to give up, any other key to continue: Display type is LCD Target white = native white point Target white brightness = 130.000000 cd/m^2 Target black brightness = native brightness Target advertised gamma = 2.400000""", r"""Setting up the instrument Place instrument on test window. Hit Esc or Q to give up, any other key to continue: Display type is LCD Target white = native white point Target white brightness = native brightness Target black brightness = 0.500000 cd/m^2 Target advertised gamma = 2.400000""", r"""Setting up the instrument Place instrument on test window. Hit Esc or Q to give up, any other key to continue: Display type is LCD Target white = 5200.000000 degrees kelvin Daylight spectrum Target white brightness = native brightness Target black brightness = native brightness Target advertised gamma = 2.400000""", r"""Setting up the instrument Place instrument on test window. Hit Esc or Q to give up, any other key to continue: Display type is CRT Target white = 5200.000000 degrees kelvin Daylight spectrum Target white brightness = 130.000000 cd/m^2 Target black brightness = 0.500000 cd/m^2 Target advertised gamma = 2.400000"""][i] + r""" Display adjustment menu:""" + menu elif bytes == "8": wx.CallAfter(app.TopWindow.Close) return else: return for line in txt.split("\n"): sleep(.0625) wx.CallAfter(app.TopWindow.write, line) print line start_new_thread(test, tuple()) app.MainLoop() DisplayCAL-3.5.0.0/DisplayCAL/wxDisplayUniformityFrame.py0000644000076500000000000011771313230502757023040 0ustar devwheel00000000000000# -*- coding: UTF-8 -*- """ Interactive display calibration UI """ from __future__ import with_statement from time import strftime import os import re import sys from wxaddons import wx from config import (getbitmap, getcfg, get_icon_bundle, get_display_number, get_display_rects, get_verified_path, setcfg) from log import get_file_logger, safe_print from meta import name as appname, version as appversion from util_os import launch_file, waccess from wxaddons import CustomEvent from wxMeasureFrame import MeasureFrame from wxwindows import (BaseApp, BaseFrame, FlatShadedButton, numpad_keycodes, nav_keycodes, processing_keycodes, wx_Panel) import colormath import config import localization as lang import report BGCOLOUR = wx.Colour(0x33, 0x33, 0x33) class FlatShadedNumberedButton(FlatShadedButton): def __init__(self, parent, id=wx.ID_ANY, bitmap=None, label="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.NO_BORDER, validator=wx.DefaultValidator, name="gradientbutton", bgcolour=None, fgcolour=None, index=0): FlatShadedButton.__init__(self, parent, id, bitmap, label, pos, size, style, validator, name, bgcolour, fgcolour) self.index = index def OnGainFocus(self, event): self.TopLevelParent.index = self.index FlatShadedButton.OnGainFocus(self, event) class DisplayUniformityFrame(BaseFrame): def __init__(self, parent=None, handler=None, keyhandler=None, start_timer=True, rows=None, cols=None): if not rows: rows = getcfg("uniformity.rows") if not cols: cols = getcfg("uniformity.cols") BaseFrame.__init__(self, parent, wx.ID_ANY, lang.getstr("report.uniformity"), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL, name="displayuniformityframe") self.SetIcons(get_icon_bundle([256, 48, 32, 16], appname)) self.SetBackgroundColour(BGCOLOUR) self.sizer = wx.GridSizer(rows, cols, 0, 0) self.SetSizer(self.sizer) self.rows = rows self.cols = cols self.colors = (wx.WHITE, wx.Colour(192, 192, 192), wx.Colour(128, 128, 128), wx.Colour(64, 64, 64)) self.labels = {} self.panels = [] self.buttons = [] for index in xrange(rows * cols): panel = wx_Panel(self, style=wx.BORDER_SIMPLE) panel.SetBackgroundColour(BGCOLOUR) sizer = wx.BoxSizer(wx.VERTICAL) panel.SetSizer(sizer) self.panels.append(panel) button = FlatShadedNumberedButton(panel, label=lang.getstr("measure"), bitmap=getbitmap("theme/icons/10x10/record"), index=index) button.Bind(wx.EVT_BUTTON, self.measure) self.buttons.append(button) label = wx.StaticText(panel) label.SetForegroundColour(wx.WHITE) self.labels[index] = label sizer.Add(label, 1, wx.ALIGN_CENTER) sizer.Add(button, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER | wx.BOTTOM | wx.LEFT | wx.RIGHT, border=8) self.sizer.Add(panel, 1, wx.EXPAND) self.disable_buttons() self.keyhandler = keyhandler if sys.platform == "darwin": # Use an accelerator table for tab, space, 0-9, A-Z, numpad, # navigation keys and processing keys keycodes = [wx.WXK_TAB, wx.WXK_SPACE] keycodes.extend(range(ord("0"), ord("9"))) keycodes.extend(range(ord("A"), ord("Z"))) keycodes.extend(numpad_keycodes) keycodes.extend(nav_keycodes) keycodes.extend(processing_keycodes) self.id_to_keycode = {} for keycode in keycodes: self.id_to_keycode[wx.NewId()] = keycode accels = [] for id, keycode in self.id_to_keycode.iteritems(): self.Bind(wx.EVT_MENU, self.key_handler, id=id) accels.append((wx.ACCEL_NORMAL, keycode, id)) if keycode == wx.WXK_TAB: accels.append((wx.ACCEL_SHIFT, keycode, id)) self.SetAcceleratorTable(wx.AcceleratorTable(accels)) else: self.Bind(wx.EVT_CHAR_HOOK, self.key_handler) # Event handlers self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.Bind(wx.EVT_MOVE, self.OnMove, self) self.timer = wx.Timer(self) if handler: self.Bind(wx.EVT_TIMER, handler, self.timer) self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy, self) # Final initialization steps self.logger = get_file_logger("uniformity") self._setup() self.Show() if start_timer: self.start_timer() def EndModal(self, returncode=wx.ID_OK): return returncode def MakeModal(self, makemodal=False): pass def OnClose(self, event): if not self.timer.IsRunning(): self.Destroy() else: self.keepGoing = False def OnDestroy(self, event): self.stop_timer() del self.timer def OnMove(self, event): pass def Pulse(self, msg=""): return self.keepGoing, False def Resume(self): self.keepGoing = True def Show(self, show=True): if show: display_no = getcfg("display.number") - 1 if display_no < 0 or display_no > wx.Display.GetCount() - 1: display_no = 0 else: display_no = get_display_number(display_no) x, y, w, h = wx.Display(display_no).ClientArea # Place frame on correct display self.SetPosition((x, y)) self.SetSize((w, h)) self.disable_buttons() wx.CallAfter(self.Maximize) wx.Frame.Show(self, show) self.panels[0].SetFocus() def UpdateProgress(self, value, msg=""): return self.Pulse(msg) def UpdatePulse(self, msg=""): return self.Pulse(msg) def disable_buttons(self): self.enable_buttons(False) def enable_buttons(self, enable=True): for button in self.buttons: button.Enable(enable) def flush(self): pass get_display = MeasureFrame.__dict__["get_display"] def has_worker_subprocess(self): return bool(getattr(self, "worker", None) and getattr(self.worker, "subprocess", None)) def hide_cursor(self): cursor_id = wx.CURSOR_BLANK cursor = wx.StockCursor(cursor_id) self.SetCursor(cursor) for panel in self.panels: panel.SetCursor(cursor) for label in self.labels.values(): label.SetCursor(cursor) for button in self.buttons: button.SetCursor(cursor) def isatty(self): return True def key_handler(self, event): keycode = None if event.GetEventType() in (wx.EVT_CHAR.typeId, wx.EVT_CHAR_HOOK.typeId, wx.EVT_KEY_DOWN.typeId): keycode = event.GetKeyCode() elif event.GetEventType() == wx.EVT_MENU.typeId: keycode = self.id_to_keycode.get(event.GetId()) if keycode == wx.WXK_TAB: self.global_navigate() or event.Skip() elif keycode >= 0: if self.has_worker_subprocess() and keycode < 256: if keycode == wx.WXK_ESCAPE or chr(keycode) == "Q": # ESC or Q self.worker.abort_subprocess() elif (self.index > -1 and not self.is_measuring and (not isinstance(self.FindFocus(), wx.Control) or keycode != wx.WXK_SPACE)): # Any other key self.measure(CustomEvent(wx.EVT_BUTTON.typeId, self.buttons[self.index])) else: event.Skip() else: event.Skip() else: event.Skip() def measure(self, event=None): if event: self.index = event.GetEventObject().index self.is_measuring = True self.results[self.index] = [] self.labels[self.index].SetLabel("") self.hide_cursor() self.disable_buttons() self.buttons[self.index].Hide() self.panels[self.index].SetBackgroundColour(self.colors[len(self.results[self.index])]) self.panels[self.index].Refresh() self.panels[self.index].Update() # Use a delay to allow for TFT lag wx.CallLater(200, self.safe_send, " ") def parse_txt(self, txt): if not txt: return self.logger.info("%r" % txt) if "Setting up the instrument" in txt: self.Pulse(lang.getstr("instrument.initializing")) if "Spot read failed" in txt: self.last_error = txt if "Result is XYZ:" in txt: # Result is XYZ: d.dddddd d.dddddd d.dddddd, D50 Lab: d.dddddd d.dddddd d.dddddd # CCT = ddddK (Delta E d.dddddd) # Closest Planckian temperature = ddddK (Delta E d.dddddd) # Closest Daylight temperature = ddddK (Delta E d.dddddd) XYZ = re.search("XYZ:\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)", txt) self.results[self.index].append({"XYZ": [float(value) for value in XYZ.groups()]}) self.last_error = None loci = {"t": "Daylight", "T": "Planckian"} for locus in loci.values(): if locus in txt: CT = re.search("Closest\s+%s\s+temperature\s+=\s+(\d+)K" % locus, txt, re.I) self.results[self.index][-1]["C%sT" % locus[0]] = int(CT.groups()[0]) if "key to take a reading" in txt and not self.last_error: if not self.is_measuring: self.enable_buttons() return if len(self.results[self.index]) < len(self.colors): # Take readings at 5 different brightness levels per swatch self.measure() else: self.is_measuring = False self.show_cursor() self.enable_buttons() self.buttons[self.index].Show() self.buttons[self.index].SetFocus() self.buttons[self.index].SetBitmap(getbitmap("theme/icons/16x16/checkmark")) self.panels[self.index].SetBackgroundColour(BGCOLOUR) self.panels[self.index].Refresh() self.panels[self.index].Update() if len(self.results) == self.rows * self.cols: # All swatches have been measured, show results # Let the user choose a location for the results html display_no, geometry, client_area = self.get_display() # Translate from wx display index to Argyll display index geometry = "%i, %i, %ix%i" % tuple(geometry) for i, display in enumerate(getcfg("displays")): if display.find("@ " + geometry) > -1: safe_print("Found display %s at index %i" % (display, i)) break display = display.replace(" [PRIMARY]", "") defaultFile = u"Uniformity Check %s — %s — %s" % (appversion, re.sub(r"[\\/:*?\"<>|]+", "_", display), strftime("%Y-%m-%d %H-%M.html")) defaultDir = get_verified_path(None, os.path.join(getcfg("profile.save_path"), defaultFile))[0] dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir, defaultFile, wildcard=lang.getstr("filetype.html") + "|*.html;*.htm", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: path = dlg.GetPath() if not waccess(path, os.W_OK): from worker import show_result_dialog show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return save_path = os.path.splitext(path)[0] + ".html" setcfg("last_filedialog_path", save_path) dlg.Destroy() if result != wx.ID_OK: return locus = loci.get(getcfg("whitepoint.colortemp.locus")) try: report.create(save_path, {"${REPORT_VERSION}": appversion, "${DISPLAY}": display, "${DATETIME}": strftime("%Y-%m-%d %H:%M:%S"), "${ROWS}": str(self.rows), "${COLS}": str(self.cols), "${RESULTS}": str(self.results), "${LOCUS}": locus}, getcfg("report.pack_js"), "uniformity") except (IOError, OSError), exception: from worker import show_result_dialog show_result_dialog(exception, self) else: launch_file(save_path) if getcfg("uniformity.measure.continuous"): self.measure(event=Event(self.buttons[self.index])) def reset(self): self._setup() for panel in self.panels: panel.SetBackgroundColour(BGCOLOUR) for button in self.buttons: button.SetBitmap(getbitmap("theme/icons/10x10/record")) button.Show() for index in self.labels: self.labels[index].SetLabel("") self.labels[index].GetContainingSizer().Layout() self.show_cursor() def _setup(self): self.logger.info("-" * 80) self.index = 0 self.is_measuring = False self.keepGoing = True self.last_error = None self.results = {} self.display_rects = get_display_rects() def safe_send(self, bytes): if self.has_worker_subprocess() and not self.worker.subprocess_abort: self.worker.safe_send(bytes) def show_cursor(self): cursor = wx.StockCursor(wx.CURSOR_ARROW) self.SetCursor(cursor) for panel in self.panels: panel.SetCursor(cursor) for label in self.labels.values(): label.SetCursor(cursor) for button in self.buttons: button.SetCursor(cursor) def start_timer(self, ms=50): self.timer.Start(ms) def stop_timer(self): self.timer.Stop() def write(self, txt): wx.CallAfter(self.parse_txt, txt) class Event(): def __init__(self, evtobj): self.evtobj = evtobj def GetEventObject(self): return self.evtobj if __name__ == "__main__": from thread import start_new_thread from time import sleep class Subprocess(): def send(self, bytes): start_new_thread(test, (bytes,)) class Worker(object): def __init__(self): self.subprocess = Subprocess() self.subprocess_abort = False def abort_subprocess(self): self.subprocess.send("Q") def safe_send(self, bytes): self.subprocess.send(bytes) return True config.initcfg() lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = DisplayUniformityFrame(start_timer=False, rows=3, cols=3) app.TopWindow.worker = Worker() app.TopWindow.Show() i = 0 def test(bytes=None): global i menu = r"""Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""" if not bytes: txt = menu elif bytes == " ": txt = [[""" Result is XYZ: 115.629826 123.903717 122.761510, D50 Lab: 108.590836 -5.813746 -13.529075 CCT = 6104K (Delta E 7.848119) Closest Planckian temperature = 5835K (Delta E 6.927113) Closest Daylight temperature = 5963K (Delta E 3.547392) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 65.336831 69.578641 68.180005, D50 Lab: 86.789788 -3.888434 -10.469442 CCT = 5983K (Delta E 6.816507) Closest Planckian temperature = 5757K (Delta E 5.996638) Closest Daylight temperature = 5883K (Delta E 2.598118) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 26.944662 28.614568 28.107897, D50 Lab: 60.439948 -2.589848 -7.899247 CCT = 5969K (Delta E 6.279024) Closest Planckian temperature = 5760K (Delta E 5.519000) Closest Daylight temperature = 5887K (Delta E 2.119333) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.153402 6.500147 6.625585, D50 Lab: 30.640770 -1.226804 -5.876967 CCT = 6123K (Delta E 4.946609) Closest Planckian temperature = 5943K (Delta E 4.353019) Closest Daylight temperature = 6082K (Delta E 0.985734) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.640770 -1.226804 -5.876967 CCT = 6123K (Delta E 4.946609) Closest Planckian temperature = 5943K (Delta E 4.353019) Closest Daylight temperature = 6082K (Delta E 0.985734) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 116.565941 124.165894 121.365684, D50 Lab: 108.678651 -4.762572 -12.508939 CCT = 5972K (Delta E 6.890329) Closest Planckian temperature = 5745K (Delta E 6.060831) Closest Daylight temperature = 5871K (Delta E 2.660205) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 64.511790 68.522425 66.980369, D50 Lab: 86.267011 -3.491468 -10.263432 CCT = 5945K (Delta E 6.363056) Closest Planckian temperature = 5735K (Delta E 5.590753) Closest Daylight temperature = 5862K (Delta E 2.186503) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 26.905684 28.417087 27.988741, D50 Lab: 60.263695 -1.987837 -8.005457 CCT = 5930K (Delta E 5.234243) Closest Planckian temperature = 5755K (Delta E 4.591707) Closest Daylight temperature = 5884K (Delta E 1.187672) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.144071 6.471379 6.584408, D50 Lab: 30.571861 -1.030833 -5.816641 CCT = 6083K (Delta E 4.418192) Closest Planckian temperature = 5923K (Delta E 3.883022) Closest Daylight temperature = 6062K (Delta E 0.510176) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.571861 -1.030833 -5.816641 CCT = 6083K (Delta E 4.418192) Closest Planckian temperature = 5923K (Delta E 3.883022) Closest Daylight temperature = 6062K (Delta E 0.510176) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 116.611176 123.928350 121.363808, D50 Lab: 108.599092 -4.350754 -12.644938 CCT = 5960K (Delta E 6.444925) Closest Planckian temperature = 5747K (Delta E 5.664879) Closest Daylight temperature = 5873K (Delta E 2.263144) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 64.672460 68.441938 67.178377, D50 Lab: 86.226954 -2.956057 -10.516177 CCT = 5931K (Delta E 5.640857) Closest Planckian temperature = 5744K (Delta E 4.950818) Closest Daylight temperature = 5872K (Delta E 1.545901) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 26.708397 28.224354 27.854805, D50 Lab: 60.090889 -2.043543 -8.080532 CCT = 5946K (Delta E 5.317449) Closest Planckian temperature = 5768K (Delta E 4.666630) Closest Daylight temperature = 5897K (Delta E 1.265350) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.154005 6.469558 6.599849, D50 Lab: 30.567493 -0.904424 -5.891430 CCT = 6079K (Delta E 4.041262) Closest Planckian temperature = 5932K (Delta E 3.549922) Closest Daylight temperature = 6072K (Delta E 0.177697) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.567493 -0.904424 -5.891430 CCT = 6079K (Delta E 4.041262) Closest Planckian temperature = 5932K (Delta E 3.549922) Closest Daylight temperature = 6072K (Delta E 0.177697) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 120.030166 127.667344 125.560879, D50 Lab: 109.839774 -4.542272 -13.098348 CCT = 5991K (Delta E 6.554213) Closest Planckian temperature = 5772K (Delta E 5.765044) Closest Daylight temperature = 5899K (Delta E 2.368586) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 66.590402 70.542611 69.377397, D50 Lab: 87.262309 -3.134252 -10.747149 CCT = 5951K (Delta E 5.807812) Closest Planckian temperature = 5758K (Delta E 5.100360) Closest Daylight temperature = 5886K (Delta E 1.698719) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 27.489125 29.158690 28.738045, D50 Lab: 60.921426 -2.478038 -8.105322 CCT = 5976K (Delta E 6.028851) Closest Planckian temperature = 5773K (Delta E 5.298263) Closest Daylight temperature = 5902K (Delta E 1.900430) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.326874 6.649709 6.776715, D50 Lab: 30.995780 -0.896754 -5.916062 CCT = 6071K (Delta E 4.005433) Closest Planckian temperature = 5926K (Delta E 3.517820) Closest Daylight temperature = 6065K (Delta E 0.144142) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.995780 -0.896754 -5.916062 CCT = 6071K (Delta E 4.005433) Closest Planckian temperature = 5926K (Delta E 3.517820) Closest Daylight temperature = 6065K (Delta E 0.144142) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 121.643262 130.105649 128.560173, D50 Lab: 110.635861 -5.574898 -13.543244 CCT = 6071K (Delta E 7.533820) Closest Planckian temperature = 5815K (Delta E 6.643605) Closest Daylight temperature = 5943K (Delta E 3.258868) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 67.775736 72.266319 71.178047, D50 Lab: 88.096621 -4.123469 -10.928024 CCT = 6023K (Delta E 6.995424) Closest Planckian temperature = 5788K (Delta E 6.159783) Closest Daylight temperature = 5915K (Delta E 2.767919) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 28.131948 29.978900 29.595129, D50 Lab: 61.636012 -3.012753 -8.258625 CCT = 6030K (Delta E 6.867980) Closest Planckian temperature = 5798K (Delta E 6.047536) Closest Daylight temperature = 5926K (Delta E 2.657241) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.473470 6.765282 6.888164, D50 Lab: 31.266484 -0.517860 -5.923364 CCT = 6007K (Delta E 2.947859) Closest Planckian temperature = 5902K (Delta E 2.582843) Closest Daylight temperature = 6042K (Delta E 0.798814) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.266484 -0.517860 -5.923364 CCT = 6007K (Delta E 2.947859) Closest Planckian temperature = 5902K (Delta E 2.582843) Closest Daylight temperature = 6042K (Delta E 0.798814) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 116.801943 124.624261 123.359911, D50 Lab: 108.831883 -5.063829 -13.483891 CCT = 6057K (Delta E 7.069302) Closest Planckian temperature = 5816K (Delta E 6.229078) Closest Daylight temperature = 5944K (Delta E 2.843045) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 64.869350 68.842421 67.977252, D50 Lab: 86.425958 -3.370123 -10.910497 CCT = 5991K (Delta E 6.099488) Closest Planckian temperature = 5785K (Delta E 5.362276) Closest Daylight temperature = 5914K (Delta E 1.966958) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 26.750888 28.302175 27.882982, D50 Lab: 60.160759 -2.171950 -8.007010 CCT = 5948K (Delta E 5.551435) Closest Planckian temperature = 5762K (Delta E 4.873477) Closest Daylight temperature = 5891K (Delta E 1.471926) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.255018 6.563924 6.746680, D50 Lab: 30.792814 -0.788285 -6.137368 CCT = 6105K (Delta E 3.641727) Closest Planckian temperature = 5970K (Delta E 3.198805) Closest Daylight temperature = 6113K (Delta E 0.167052) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.792814 -0.788285 -6.137368 CCT = 6105K (Delta E 3.641727) Closest Planckian temperature = 5970K (Delta E 3.198805) Closest Daylight temperature = 6113K (Delta E 0.167052) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 115.081771 122.300809 119.963479, D50 Lab: 108.051237 -4.328489 -12.711256 CCT = 5969K (Delta E 6.425079) Closest Planckian temperature = 5755K (Delta E 5.648226) Closest Daylight temperature = 5882K (Delta E 2.248055) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 62.334621 66.118418 64.979303, D50 Lab: 85.056784 -3.250929 -10.473103 CCT = 5960K (Delta E 6.051574) Closest Planckian temperature = 5758K (Delta E 5.316783) Closest Daylight temperature = 5886K (Delta E 1.916058) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 25.849804 27.374348 27.163845, D50 Lab: 59.319238 -2.248166 -8.249728 CCT = 5996K (Delta E 5.653680) Closest Planckian temperature = 5804K (Delta E 4.968356) Closest Daylight temperature = 5934K (Delta E 1.575347) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 5.898029 6.233309 6.427531, D50 Lab: 29.993614 -1.240610 -6.124217 CCT = 6197K (Delta E 4.937751) Closest Planckian temperature = 6011K (Delta E 4.350182) Closest Daylight temperature = 6153K (Delta E 0.996499) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.993614 -1.240610 -6.124217 CCT = 6197K (Delta E 4.937751) Closest Planckian temperature = 6011K (Delta E 4.350182) Closest Daylight temperature = 6153K (Delta E 0.996499) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 114.661874 122.077962 119.963424, D50 Lab: 107.975846 -4.649371 -12.841206 CCT = 5996K (Delta E 6.745175) Closest Planckian temperature = 5771K (Delta E 5.934859) Closest Daylight temperature = 5898K (Delta E 2.538832) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 61.818899 65.859246 64.979340, D50 Lab: 84.924570 -3.876653 -10.701093 CCT = 6024K (Delta E 6.822442) Closest Planckian temperature = 5794K (Delta E 6.006530) Closest Daylight temperature = 5922K (Delta E 2.615316) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 25.795743 27.295989 27.081138, D50 Lab: 59.247303 -2.163010 -8.233441 CCT = 5988K (Delta E 5.511791) Closest Planckian temperature = 5800K (Delta E 4.842103) Closest Daylight temperature = 5931K (Delta E 1.447924) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 5.925222 6.263326 6.427544, D50 Lab: 30.067324 -1.256015 -5.997186 CCT = 6170K (Delta E 5.014894) Closest Planckian temperature = 5984K (Delta E 4.416741) Closest Daylight temperature = 6124K (Delta E 1.057856) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.067324 -1.256015 -5.997186 CCT = 6170K (Delta E 5.014894) Closest Planckian temperature = 5984K (Delta E 4.416741) Closest Daylight temperature = 6124K (Delta E 1.057856) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""], [""" Result is XYZ: 116.839314 123.894968 122.159446, D50 Lab: 108.587904 -3.955352 -13.160232 CCT = 5975K (Delta E 5.963774) Closest Planckian temperature = 5774K (Delta E 5.240593) Closest Daylight temperature = 5903K (Delta E 1.842768) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 63.469751 67.164836 66.177725, D50 Lab: 85.587118 -2.928291 -10.687360 CCT = 5951K (Delta E 5.590334) Closest Planckian temperature = 5764K (Delta E 4.908104) Closest Daylight temperature = 5892K (Delta E 1.506948) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 26.106117 27.645671 27.403890, D50 Lab: 59.567264 -2.255152 -8.227727 CCT = 5991K (Delta E 5.663331) Closest Planckian temperature = 5798K (Delta E 4.976351) Closest Daylight temperature = 5928K (Delta E 1.582241) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 6.001154 6.326623 6.508185, D50 Lab: 30.221991 -1.083417 -6.086282 CCT = 6157K (Delta E 4.496558) Closest Planckian temperature = 5990K (Delta E 3.957006) Closest Daylight temperature = 6131K (Delta E 0.597640) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""", """ Result is XYZ: 0.104401 0.110705 0.109155, D50 Lab: 0.221991 -1.083417 -6.086282 CCT = 6157K (Delta E 4.496558) Closest Planckian temperature = 5990K (Delta E 3.957006) Closest Daylight temperature = 6131K (Delta E 0.597640) Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:"""]][app.TopWindow.index][i] if i < 3: i += 1 else: i -= 3 elif bytes in ("Q", "q"): wx.CallAfter(app.TopWindow.Close) return else: return for line in txt.split("\n"): sleep(.03125) wx.CallAfter(app.TopWindow.write, line) print line start_new_thread(test, tuple()) app.MainLoop() DisplayCAL-3.5.0.0/DisplayCAL/wxenhancedplot.py0000755000076500000000000030230013104456141021020 0ustar devwheel00000000000000#----------------------------------------------------------------------------- # Name: wx.lib.plot.py # Purpose: Line, Bar and Scatter Graphs # # Author: Gordon Williams # # Created: 2003/11/03 # RCS-ID: $Id: plot.py 65712 2010-10-01 17:56:32Z RD $ # Copyright: (c) 2002 # Licence: Use as you wish. #----------------------------------------------------------------------------- # 12/15/2003 - Jeff Grimmett (grimmtooth@softhome.net) # # o 2.5 compatability update. # o Renamed to plot.py in the wx.lib directory. # o Reworked test frame to work with wx demo framework. This saves a bit # of tedious cut and paste, and the test app is excellent. # # 12/18/2003 - Jeff Grimmett (grimmtooth@softhome.net) # # o wxScrolledMessageDialog -> ScrolledMessageDialog # # Oct 6, 2004 Gordon Williams (g_will@cyberus.ca) # - Added bar graph demo # - Modified line end shape from round to square. # - Removed FloatDCWrapper for conversion to ints and ints in arguments # # Oct 15, 2004 Gordon Williams (g_will@cyberus.ca) # - Imported modules given leading underscore to name. # - Added Cursor Line Tracking and User Point Labels. # - Demo for Cursor Line Tracking and Point Labels. # - Size of plot preview frame adjusted to show page better. # - Added helper functions PositionUserToScreen and PositionScreenToUser in PlotCanvas. # - Added functions GetClosestPoints (all curves) and GetClosestPoint (only closest curve) # can be in either user coords or screen coords. # # Jun 22, 2009 Florian Hoech (florian.hoech@gmx.de) # - Fixed exception when drawing empty plots on Mac OS X # - Fixed exception when trying to draw point labels on Mac OS X (Mac OS X # point label drawing code is still slow and only supports wx.COPY) # - Moved label positions away from axis lines a bit # - Added PolySpline class and modified demo 1 and 2 to use it # - Added center and diagonal lines option (Set/GetEnableCenterLines, # Set/GetEnableDiagonals) # - Added anti-aliasing option with optional high-resolution mode # (Set/GetEnableAntiAliasing, Set/GetEnableHiRes) and demo # - Added option to specify exact number of tick marks to use for each axis # (SetXSpec(, SetYSpec() -- work like 'min', but with # tick marks) # - Added support for background and foreground colours (enabled via # SetBackgroundColour/SetForegroundColour on a PlotCanvas instance) # - Changed PlotCanvas printing initialization from occuring in __init__ to # occur on access. This will postpone any IPP and / or CUPS warnings # which appear on stderr on some Linux systems until printing functionality # is actually used. # # """ This is a simple light weight plotting module that can be used with Boa or easily integrated into your own wxPython application. The emphasis is on small size and fast plotting for large data sets. It has a reasonable number of features to do line and scatter graphs easily as well as simple bar graphs. It is not as sophisticated or as powerful as SciPy Plt or Chaco. Both of these are great packages but consume huge amounts of computer resources for simple plots. They can be found at http://scipy.com This file contains two parts; first the re-usable library stuff, then, after a "if __name__=='__main__'" test, a simple frame and a few default plots for examples and testing. Based on wxPlotCanvas Written by K.Hinsen, R. Srinivasan; Ported to wxPython Harm van der Heijden, feb 1999 Major Additions Gordon Williams Feb. 2003 (g_will@cyberus.ca) -More style options -Zooming using mouse "rubber band" -Scroll left, right -Grid(graticule) -Printing, preview, and page set up (margins) -Axis and title labels -Cursor xy axis values -Doc strings and lots of comments -Optimizations for large number of points -Legends Did a lot of work here to speed markers up. Only a factor of 4 improvement though. Lines are much faster than markers, especially filled markers. Stay away from circles and triangles unless you only have a few thousand points. Times for 25,000 points Line - 0.078 sec Markers Square - 0.22 sec dot - 0.10 circle - 0.87 cross,plus - 0.28 triangle, triangle_down - 0.90 Thanks to Chris Barker for getting this version working on Linux. Zooming controls with mouse (when enabled): Left mouse drag - Zoom box. Left mouse double click - reset zoom. Right mouse click - zoom out centred on click location. """ import string as _string import time as _time import sys import wx # Needs Numeric or numarray or NumPy try: import numpy as _Numeric except: try: import numarray as _Numeric #if numarray is used it is renamed Numeric except: try: import Numeric as _Numeric except: msg= """ This module requires the Numeric/numarray or NumPy module, which could not be imported. It probably is not installed (it's not part of the standard Python distribution). See the Numeric Python site (http://numpy.scipy.org) for information on downloading source or binaries.""" raise ImportError, "Numeric,numarray or NumPy not found. \n" + msg else: _Numeric.Float = _Numeric.float _Numeric.Float64 = _Numeric.float64 _Numeric.Int32 = _Numeric.int32 from wxfixes import get_dc_font_scale def convert_to_list_of_tuples(iterable): points = [] for p in iterable: points.append(tuple(p)) return points # # Plotting classes... # class PolyPoints: """Base Class for lines and markers - All methods are private. """ def __init__(self, points, attr): self._points = _Numeric.array(points).astype(_Numeric.Float64) self._logscale = (False, False) self._pointSize = (1.0, 1.0) self.currentScale= (1,1) self.currentShift= (0,0) self.scaled = self.points self.attributes = {} self.attributes.update(self._attributes) for name, value in attr.items(): if name not in self._attributes.keys(): raise KeyError, "Style attribute incorrect. Should be one of %s" % self._attributes.keys() self.attributes[name] = value def setLogScale(self, logscale): self._logscale = logscale def __getattr__(self, name): if name == 'points': if len(self._points)>0: data = _Numeric.array(self._points,copy=True) if self._logscale[0]: data = self.log10(data, 0) if self._logscale[1]: data = self.log10(data, 1) return data else: return self._points else: raise AttributeError, name def log10(self, data, ind): data = _Numeric.compress(data[:,ind]>0,data,0) data[:,ind] = _Numeric.log10(data[:,ind]) return data def boundingBox(self): if len(self.points) == 0: # no curves to draw # defaults to (-1,-1) and (1,1) but axis can be set in Draw minXY= _Numeric.array([-1.0,-1.0]) maxXY= _Numeric.array([ 1.0, 1.0]) else: minXY= _Numeric.minimum.reduce(self.points) maxXY= _Numeric.maximum.reduce(self.points) return minXY, maxXY def scaleAndShift(self, scale=(1,1), shift=(0,0)): if len(self.points) == 0: # no curves to draw return if (scale is not self.currentScale) or (shift is not self.currentShift): # update point scaling self.scaled = scale*self.points+shift self.currentScale= scale self.currentShift= shift # else unchanged use the current scaling def getLegend(self): return self.attributes['legend'] def getClosestPoint(self, pntXY, pointScaled= True): """Returns the index of closest point on the curve, pointXY, scaledXY, distance x, y in user coords if pointScaled == True based on screen coords if pointScaled == False based on user coords """ if pointScaled == True: #Using screen coords p = self.scaled pxy = self.currentScale * _Numeric.array(pntXY)+ self.currentShift else: #Using user coords p = self.points pxy = _Numeric.array(pntXY) #determine distance for each point d= _Numeric.sqrt(_Numeric.add.reduce((p-pxy)**2,1)) #sqrt(dx^2+dy^2) pntIndex = _Numeric.argmin(d) dist = d[pntIndex] return [pntIndex, self.points[pntIndex], self.scaled[pntIndex] / self._pointSize, dist] class PolyLine(PolyPoints): """Class to define line type and style - All methods except __init__ are private. """ _attributes = {'colour': 'black', 'width': 1, 'style': wx.SOLID, 'legend': ''} def __init__(self, points, **attr): """Creates PolyLine object points - sequence (array, tuple or list) of (x,y) points making up line **attr - key word attributes Defaults: 'colour'= 'black', - wx.Pen Colour any wx.NamedColour 'width'= 1, - Pen width 'style'= wx.SOLID, - wx.Pen style 'legend'= '' - Line Legend to display """ PolyPoints.__init__(self, points, attr) def draw(self, dc, printerScale, coord= None): colour = self.attributes['colour'] width = self.attributes['width'] * printerScale * self._pointSize[0] style= self.attributes['style'] if not isinstance(colour, wx.Colour): colour = wx.NamedColour(colour) pen = wx.Pen(colour, width, style) pen.SetCap(wx.CAP_BUTT) dc.SetPen(pen) if coord is None: if len(self.scaled): # bugfix for Mac OS X if (wx.VERSION >= (4,) and isinstance(self.scaled, _Numeric.ndarray)): # Need to convert to list of tuples scaled = convert_to_list_of_tuples(self.scaled) dc.DrawLines(scaled) else: dc.DrawLines(self.scaled) else: dc.DrawLines(coord) # draw legend line def getSymExtent(self, printerScale): """Width and Height of Marker""" h= self.attributes['width'] * printerScale * self._pointSize[0] w= 5 * h return (w,h) class PolySpline(PolyLine): """Class to define line type and style - All methods except __init__ are private. """ _attributes = {'colour': 'black', 'width': 1, 'style': wx.SOLID, 'legend': ''} def __init__(self, points, **attr): """Creates PolyLine object points - sequence (array, tuple or list) of (x,y) points making up line **attr - key word attributes Defaults: 'colour'= 'black', - wx.Pen Colour any wx.NamedColour 'width'= 1, - Pen width 'style'= wx.SOLID, - wx.Pen style 'legend'= '' - Line Legend to display """ PolyLine.__init__(self, points, **attr) def draw(self, dc, printerScale, coord= None): colour = self.attributes['colour'] width = self.attributes['width'] * printerScale * self._pointSize[0] style= self.attributes['style'] if not isinstance(colour, wx.Colour): colour = wx.NamedColour(colour) pen = wx.Pen(colour, width, style) pen.SetCap(wx.CAP_ROUND) dc.SetPen(pen) if coord is None: if len(self.scaled): # bugfix for Mac OS X if (wx.VERSION >= (4,) and isinstance(self.scaled, _Numeric.ndarray)): # Need to convert to list of tuples scaled = convert_to_list_of_tuples(self.scaled) dc.DrawSpline(scaled) else: dc.DrawSpline(self.scaled) else: dc.DrawLines(coord) # draw legend line class PolyMarker(PolyPoints): """Class to define marker type and style - All methods except __init__ are private. """ _attributes = {'colour': 'black', 'width': 1, 'size': 2, 'fillcolour': None, 'fillstyle': wx.SOLID, 'marker': 'circle', 'legend': ''} def __init__(self, points, **attr): """Creates PolyMarker object points - sequence (array, tuple or list) of (x,y) points **attr - key word attributes Defaults: 'colour'= 'black', - wx.Pen Colour any wx.NamedColour 'width'= 1, - Pen width 'size'= 2, - Marker size 'fillcolour'= same as colour, - wx.Brush Colour any wx.NamedColour 'fillstyle'= wx.SOLID, - wx.Brush fill style (use wx.TRANSPARENT for no fill) 'marker'= 'circle' - Marker shape 'legend'= '' - Marker Legend to display Marker Shapes: - 'circle' - 'dot' - 'square' - 'triangle' - 'triangle_down' - 'cross' - 'plus' """ PolyPoints.__init__(self, points, attr) def draw(self, dc, printerScale, coord= None): colour = self.attributes['colour'] width = self.attributes['width'] * printerScale * self._pointSize[0] size = self.attributes['size'] * printerScale * self._pointSize[0] fillcolour = self.attributes['fillcolour'] fillstyle = self.attributes['fillstyle'] marker = self.attributes['marker'] if colour and not isinstance(colour, wx.Colour): colour = wx.NamedColour(colour) if fillcolour and not isinstance(fillcolour, wx.Colour): fillcolour = wx.NamedColour(fillcolour) dc.SetPen(wx.Pen(colour, width)) if fillcolour: dc.SetBrush(wx.Brush(fillcolour,fillstyle)) else: dc.SetBrush(wx.Brush(colour, fillstyle)) if coord is None: if len(self.scaled): # bugfix for Mac OS X self._drawmarkers(dc, self.scaled, marker, size) else: self._drawmarkers(dc, coord, marker, size) # draw legend marker def getSymExtent(self, printerScale): """Width and Height of Marker""" s= 5*self.attributes['size'] * printerScale * self._pointSize[0] return (s,s) def _drawmarkers(self, dc, coords, marker,size=1): f = eval('self._' +marker) f(dc, coords, size) def _circle(self, dc, coords, size=1): fact= 2.5*size wh= 5.0*size rect= _Numeric.zeros((len(coords),4),_Numeric.Float)+[0.0,0.0,wh,wh] rect[:,0:2]= coords-[fact,fact] dc.DrawEllipseList(rect.astype(_Numeric.Int32)) def _dot(self, dc, coords, size=1): dc.DrawPointList(coords) def _square(self, dc, coords, size=1): fact= 2.5*size wh= 5.0*size rect= _Numeric.zeros((len(coords),4),_Numeric.Float)+[0.0,0.0,wh,wh] rect[:,0:2]= coords-[fact,fact] dc.DrawRectangleList(rect.astype(_Numeric.Int32)) def _triangle(self, dc, coords, size=1): shape= [(-2.5*size,1.44*size), (2.5*size,1.44*size), (0.0,-2.88*size)] poly= _Numeric.repeat(coords,3,0) poly.shape= (len(coords),3,2) poly += shape dc.DrawPolygonList(poly.astype(_Numeric.Int32)) def _triangle_down(self, dc, coords, size=1): shape= [(-2.5*size,-1.44*size), (2.5*size,-1.44*size), (0.0,2.88*size)] poly= _Numeric.repeat(coords,3,0) poly.shape= (len(coords),3,2) poly += shape dc.DrawPolygonList(poly.astype(_Numeric.Int32)) def _cross(self, dc, coords, size=1): fact= 2.5*size for f in [[-fact,-fact,fact,fact],[-fact,fact,fact,-fact]]: lines= _Numeric.concatenate((coords,coords),axis=1)+f dc.DrawLineList(lines.astype(_Numeric.Int32)) def _plus(self, dc, coords, size=1): fact= 2.5*size for f in [[-fact,0,fact,0],[0,-fact,0,fact]]: lines= _Numeric.concatenate((coords,coords),axis=1)+f dc.DrawLineList(lines.astype(_Numeric.Int32)) class PlotGraphics: """Container to hold PolyXXX objects and graph labels - All methods except __init__ are private. """ def __init__(self, objects, title='', xLabel='', yLabel= ''): """Creates PlotGraphics object objects - list of PolyXXX objects to make graph title - title shown at top of graph xLabel - label shown on x-axis yLabel - label shown on y-axis """ if type(objects) not in [list,tuple]: raise TypeError, "objects argument should be list or tuple" self.objects = objects self.title= title self.xLabel= xLabel self.yLabel= yLabel self._pointSize = (1.0, 1.0) def setLogScale(self, logscale): if type(logscale) != tuple: raise TypeError, 'logscale must be a tuple of bools, e.g. (False, False)' if len(self.objects) == 0: return for o in self.objects: o.setLogScale(logscale) def boundingBox(self): p1, p2 = self.objects[0].boundingBox() for o in self.objects[1:]: p1o, p2o = o.boundingBox() p1 = _Numeric.minimum(p1, p1o) p2 = _Numeric.maximum(p2, p2o) return p1, p2 def scaleAndShift(self, scale=(1,1), shift=(0,0)): for o in self.objects: o.scaleAndShift(scale, shift) def setPrinterScale(self, scale): """Thickens up lines and markers only for printing""" self.printerScale= scale def setXLabel(self, xLabel= ''): """Set the X axis label on the graph""" self.xLabel= xLabel def setYLabel(self, yLabel= ''): """Set the Y axis label on the graph""" self.yLabel= yLabel def setTitle(self, title= ''): """Set the title at the top of graph""" self.title= title def getXLabel(self): """Get x axis label string""" return self.xLabel def getYLabel(self): """Get y axis label string""" return self.yLabel def getTitle(self, title= ''): """Get the title at the top of graph""" return self.title def draw(self, dc): for o in self.objects: #t=_time.clock() # profile info o._pointSize = self._pointSize o.draw(dc, self.printerScale) #dt= _time.clock()-t #print o, "time=", dt def getSymExtent(self, printerScale): """Get max width and height of lines and markers symbols for legend""" self.objects[0]._pointSize = self._pointSize symExt = self.objects[0].getSymExtent(printerScale) for o in self.objects[1:]: o._pointSize = self._pointSize oSymExt = o.getSymExtent(printerScale) symExt = _Numeric.maximum(symExt, oSymExt) return symExt def getLegendNames(self): """Returns list of legend names""" lst = [None]*len(self) for i in range(len(self)): lst[i]= self.objects[i].getLegend() return lst def __len__(self): return len(self.objects) def __getitem__(self, item): return self.objects[item] #------------------------------------------------------------------------------- # Main window that you will want to import into your application. class PlotCanvas(wx.Panel): """ Subclass of a wx.Panel which holds two scrollbars and the actual plotting canvas (self.canvas). It allows for simple general plotting of data with zoom, labels, and automatic axis scaling.""" def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name="plotCanvas"): """Constructs a panel, which can be a child of a frame or any other non-control window""" wx.Panel.__init__(self, parent, id, pos, size, style, name) sizer = wx.FlexGridSizer(2,2,0,0) self.canvas = wx.Window(self, -1) self.sb_vert = wx.ScrollBar(self, -1, style=wx.SB_VERTICAL) self.sb_vert.SetScrollbar(0,1000,1000,1000) self.sb_hor = wx.ScrollBar(self, -1, style=wx.SB_HORIZONTAL) self.sb_hor.SetScrollbar(0,1000,1000,1000) sizer.Add(self.canvas, 1, wx.EXPAND) sizer.Add(self.sb_vert, 0, wx.EXPAND) sizer.Add(self.sb_hor, 0, wx.EXPAND) sizer.Add((0,0)) sizer.AddGrowableRow(0, 1) sizer.AddGrowableCol(0, 1) self.sb_vert.Show(False) self.sb_hor.Show(False) self.SetSizer(sizer) self.Fit() self.border = (1,1) self.SetBackgroundColour("white") # Create some mouse events for zooming self.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) self.canvas.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) self.canvas.Bind(wx.EVT_MOTION, self.OnMotion) self.canvas.Bind(wx.EVT_LEFT_DCLICK, self.OnMouseDoubleClick) self.canvas.Bind(wx.EVT_RIGHT_DOWN, self.OnMouseRightDown) # scrollbar events self.Bind(wx.EVT_SCROLL_THUMBTRACK, self.OnScroll) self.Bind(wx.EVT_SCROLL_PAGEUP, self.OnScroll) self.Bind(wx.EVT_SCROLL_PAGEDOWN, self.OnScroll) self.Bind(wx.EVT_SCROLL_LINEUP, self.OnScroll) self.Bind(wx.EVT_SCROLL_LINEDOWN, self.OnScroll) # set curser as cross-hairs self.canvas.SetCursor(wx.CROSS_CURSOR) self.HandCursor = wx.CursorFromImage(Hand.GetImage()) self.GrabHandCursor = wx.CursorFromImage(GrabHand.GetImage()) self.MagCursor = wx.CursorFromImage(MagPlus.GetImage()) # Things for printing self._print_data = None self._pageSetupData= None self.printerScale = 1 self.parent= parent # scrollbar variables self._sb_ignore = False self._adjustingSB = False self._sb_xfullrange = 0 self._sb_yfullrange = 0 self._sb_xunit = 0 self._sb_yunit = 0 self._dragEnabled = False self._screenCoordinates = _Numeric.array([0.0, 0.0]) self._logscale = (False, False) # Zooming variables self._zoomInFactor = 0.5 self._zoomOutFactor = 2 self._zoomCorner1= _Numeric.array([0.0, 0.0]) # left mouse down corner self._zoomCorner2= _Numeric.array([0.0, 0.0]) # left mouse up corner self._zoomEnabled= False self._hasDragged= False # Drawing Variables self.last_draw = None self._pointScale= 1 self._pointShift= 0 self._xSpec= 'auto' self._ySpec= 'auto' self._gridEnabled= False self._legendEnabled= False self._titleEnabled= True self._centerLinesEnabled = False self._diagonalsEnabled = False # Fonts self._fontCache = {} self._fontSizeAxis= 10 self._fontSizeTitle= 15 self._fontSizeLegend= 7 # pointLabels self._pointLabelEnabled= False self.last_PointLabel= None self._pointLabelFunc= None self.canvas.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave) self._logicalFunction = wx.COPY # wx.EQUIV not supported on Mac OS X self._useScientificNotation = False self._antiAliasingEnabled = False self._hiResEnabled = False self._pointSize = (1.0, 1.0) self._fontScale = 1.0 self.canvas.Bind(wx.EVT_PAINT, self.OnPaint) self.canvas.Bind(wx.EVT_SIZE, self.OnSize) # OnSize called to make sure the buffer is initialized. # This might result in OnSize getting called twice on some # platforms at initialization, but little harm done. self.OnSize(None) # sets the initial size based on client size self._gridColour = wx.NamedColour('black') def SetCursor(self, cursor): self.canvas.SetCursor(cursor) def GetGridColour(self): return self._gridColour def SetGridColour(self, colour): if isinstance(colour, wx.Colour): self._gridColour = colour else: self._gridColour = wx.NamedColour(colour) # SaveFile def SaveFile(self, fileName= ''): """Saves the file to the type specified in the extension. If no file name is specified a dialog box is provided. Returns True if sucessful, otherwise False. .bmp Save a Windows bitmap file. .xbm Save an X bitmap file. .xpm Save an XPM bitmap file. .png Save a Portable Network Graphics file. .jpg Save a Joint Photographic Experts Group file. """ extensions = { "bmp": wx.BITMAP_TYPE_BMP, # Save a Windows bitmap file. "xbm": wx.BITMAP_TYPE_XBM, # Save an X bitmap file. "xpm": wx.BITMAP_TYPE_XPM, # Save an XPM bitmap file. "jpg": wx.BITMAP_TYPE_JPEG, # Save a JPG file. "png": wx.BITMAP_TYPE_PNG, # Save a PNG file. } fType = _string.lower(fileName[-3:]) dlg1 = None while fType not in extensions: if dlg1: # FileDialog exists: Check for extension dlg2 = wx.MessageDialog(self, 'File name extension\n' 'must be one of\nbmp, xbm, xpm, png, or jpg', 'File Name Error', wx.OK | wx.ICON_ERROR) try: dlg2.ShowModal() finally: dlg2.Destroy() else: # FileDialog doesn't exist: just check one dlg1 = wx.FileDialog( self, "Choose a file with extension bmp, gif, xbm, xpm, png, or jpg", ".", "", "BMP files (*.bmp)|*.bmp|XBM files (*.xbm)|*.xbm|XPM file (*.xpm)|*.xpm|PNG files (*.png)|*.png|JPG files (*.jpg)|*.jpg", wx.SAVE|wx.OVERWRITE_PROMPT ) if dlg1.ShowModal() == wx.ID_OK: fileName = dlg1.GetPath() fType = _string.lower(fileName[-3:]) else: # exit without saving dlg1.Destroy() return False if dlg1: dlg1.Destroy() # Save Bitmap res= self._Buffer.SaveFile(fileName, extensions[fType]) return res @property def print_data(self): if not self._print_data: self._print_data = wx.PrintData() self._print_data.SetPaperId(wx.PAPER_LETTER) self._print_data.SetOrientation(wx.LANDSCAPE) return self._print_data @property def pageSetupData(self): if not self._pageSetupData: self._pageSetupData= wx.PageSetupDialogData() self._pageSetupData.SetMarginBottomRight((25,25)) self._pageSetupData.SetMarginTopLeft((25,25)) self._pageSetupData.SetPrintData(self.print_data) return self._pageSetupData def PageSetup(self): """Brings up the page setup dialog""" data = self.pageSetupData data.SetPrintData(self.print_data) dlg = wx.PageSetupDialog(self.parent, data) try: if dlg.ShowModal() == wx.ID_OK: data = dlg.GetPageSetupData() # returns wx.PageSetupDialogData # updates page parameters from dialog self.pageSetupData.SetMarginBottomRight(data.GetMarginBottomRight()) self.pageSetupData.SetMarginTopLeft(data.GetMarginTopLeft()) self.pageSetupData.SetPrintData(data.GetPrintData()) self._print_data=wx.PrintData(data.GetPrintData()) # updates print_data finally: dlg.Destroy() def Printout(self, paper=None): """Print current plot.""" if paper != None: self.print_data.SetPaperId(paper) pdd = wx.PrintDialogData(self.print_data) printer = wx.Printer(pdd) out = PlotPrintout(self) print_ok = printer.Print(self.parent, out) if print_ok: self._print_data = wx.PrintData(printer.GetPrintDialogData().GetPrintData()) out.Destroy() def PrintPreview(self): """Print-preview current plot.""" printout = PlotPrintout(self) printout2 = PlotPrintout(self) self.preview = wx.PrintPreview(printout, printout2, self.print_data) if not self.preview.Ok(): wx.MessageDialog(self, "Print Preview failed.\n" \ "Check that default printer is configured\n", \ "Print error", wx.OK|wx.CENTRE).ShowModal() self.preview.SetZoom(40) # search up tree to find frame instance frameInst= self while not isinstance(frameInst, wx.Frame): frameInst= frameInst.GetParent() frame = wx.PreviewFrame(self.preview, frameInst, "Preview") frame.Initialize() frame.SetPosition(self.GetPosition()) frame.SetSize((600,550)) frame.Centre(wx.BOTH) frame.Show(True) def setLogScale(self, logscale): if type(logscale) != tuple: raise TypeError, 'logscale must be a tuple of bools, e.g. (False, False)' if self.last_draw is not None: graphics, xAxis, yAxis= self.last_draw graphics.setLogScale(logscale) self.last_draw = (graphics, None, None) self.SetXSpec('min') self.SetYSpec('min') self._logscale = logscale def getLogScale(self): return self._logscale def SetFontSizeAxis(self, point= 10): """Set the tick and axis label font size (default is 10 point)""" self._fontSizeAxis= point def GetFontSizeAxis(self): """Get current tick and axis label font size in points""" return self._fontSizeAxis def SetFontSizeTitle(self, point= 15): """Set Title font size (default is 15 point)""" self._fontSizeTitle= point def GetFontSizeTitle(self): """Get current Title font size in points""" return self._fontSizeTitle def SetFontSizeLegend(self, point= 7): """Set Legend font size (default is 7 point)""" self._fontSizeLegend= point def GetFontSizeLegend(self): """Get current Legend font size in points""" return self._fontSizeLegend def SetShowScrollbars(self, value): """Set True to show scrollbars""" if value not in [True,False]: raise TypeError, "Value should be True or False" if value == self.GetShowScrollbars(): return self.sb_vert.Show(value) self.sb_hor.Show(value) wx.CallAfter(self.Layout) def GetShowScrollbars(self): """Set True to show scrollbars""" return self.sb_vert.IsShown() def SetUseScientificNotation(self, useScientificNotation): self._useScientificNotation = useScientificNotation def GetUseScientificNotation(self): return self._useScientificNotation def SetEnableAntiAliasing(self, enableAntiAliasing): """Set True to enable anti-aliasing.""" self._antiAliasingEnabled = enableAntiAliasing self.Redraw() def GetEnableAntiAliasing(self): return self._antiAliasingEnabled def SetEnableHiRes(self, enableHiRes): """Set True to enable high-resolution mode when using anti-aliasing.""" self._hiResEnabled = enableHiRes self.Redraw() def GetEnableHiRes(self): return self._hiResEnabled def SetEnableDrag(self, value): """Set True to enable drag.""" if value not in [True,False]: raise TypeError, "Value should be True or False" if value: if self.GetEnableZoom(): self.SetEnableZoom(False) self.SetCursor(self.HandCursor) else: self.SetCursor(wx.CROSS_CURSOR) self._dragEnabled = value def GetEnableDrag(self): return self._dragEnabled def SetEnableZoom(self, value): """Set True to enable zooming.""" if value not in [True,False]: raise TypeError, "Value should be True or False" if value: if self.GetEnableDrag(): self.SetEnableDrag(False) self.SetCursor(self.MagCursor) else: self.SetCursor(wx.CROSS_CURSOR) self._zoomEnabled= value def GetEnableZoom(self): """True if zooming enabled.""" return self._zoomEnabled def SetEnableGrid(self, value): """Set True, 'Horizontal' or 'Vertical' to enable grid.""" if value not in [True,False,'Horizontal','Vertical']: raise TypeError, "Value should be True, False, Horizontal or Vertical" self._gridEnabled= value self.Redraw() def GetEnableGrid(self): """True if grid enabled.""" return self._gridEnabled def SetEnableCenterLines(self, value): """Set True, 'Horizontal' or 'Vertical' to enable center line(s).""" if value not in [True,False,'Horizontal','Vertical']: raise TypeError, "Value should be True, False, Horizontal or Vertical" self._centerLinesEnabled= value self.Redraw() def GetEnableCenterLines(self): """True if grid enabled.""" return self._centerLinesEnabled def SetEnableDiagonals(self, value): """Set True, 'Bottomleft-Topright' or 'Bottomright-Topleft' to enable center line(s).""" if value not in [True,False,'Bottomleft-Topright','Bottomright-Topleft']: raise TypeError, "Value should be True, False, Bottomleft-Topright or Bottomright-Topleft" self._diagonalsEnabled= value self.Redraw() def GetEnableDiagonals(self): """True if grid enabled.""" return self._diagonalsEnabled def SetEnableLegend(self, value): """Set True to enable legend.""" if value not in [True,False]: raise TypeError, "Value should be True or False" self._legendEnabled= value self.Redraw() def GetEnableLegend(self): """True if Legend enabled.""" return self._legendEnabled def SetEnableTitle(self, value): """Set True to enable title.""" if value not in [True,False]: raise TypeError, "Value should be True or False" self._titleEnabled= value self.Redraw() def GetEnableTitle(self): """True if title enabled.""" return self._titleEnabled def SetEnablePointLabel(self, value): """Set True to enable pointLabel.""" if value not in [True,False]: raise TypeError, "Value should be True or False" self._pointLabelEnabled= value self.Redraw() #will erase existing pointLabel if present self.last_PointLabel = None def GetEnablePointLabel(self): """True if pointLabel enabled.""" return self._pointLabelEnabled def SetPointLabelFunc(self, func): """Sets the function with custom code for pointLabel drawing ******** more info needed *************** """ self._pointLabelFunc= func def GetPointLabelFunc(self): """Returns pointLabel Drawing Function""" return self._pointLabelFunc def Reset(self): """Unzoom the plot.""" self.last_PointLabel = None #reset pointLabel if self.last_draw is not None: self._Draw(self.last_draw[0]) def ScrollRight(self, units): """Move view right number of axis units.""" self.last_PointLabel = None #reset pointLabel if self.last_draw is not None: graphics, xAxis, yAxis= self.last_draw xAxis= (xAxis[0]+units, xAxis[1]+units) self._Draw(graphics,xAxis,yAxis) def ScrollUp(self, units): """Move view up number of axis units.""" self.last_PointLabel = None #reset pointLabel if self.last_draw is not None: graphics, xAxis, yAxis= self.last_draw yAxis= (yAxis[0]+units, yAxis[1]+units) self._Draw(graphics,xAxis,yAxis) def GetXY(self, event): """Wrapper around _getXY, which handles log scales""" x,y = self._getXY(event) if self.getLogScale()[0]: x = _Numeric.power(10,x) if self.getLogScale()[1]: y = _Numeric.power(10,y) return x,y def _getXY(self,event): """Takes a mouse event and returns the XY user axis values.""" x,y= self.PositionScreenToUser(event.GetPosition()) return x,y def PositionUserToScreen(self, pntXY): """Converts User position to Screen Coordinates""" userPos= _Numeric.array(pntXY) x,y= userPos * self._pointScale + self._pointShift return x,y def PositionScreenToUser(self, pntXY): """Converts Screen position to User Coordinates""" screenPos= _Numeric.array(pntXY) x,y= (screenPos-self._pointShift)/self._pointScale return x,y def SetXSpec(self, type= 'auto'): """xSpec- defines x axis type. Can be 'none', 'min' or 'auto' where: 'none' - shows no axis or tick mark values 'min' - shows min bounding box values 'auto' - rounds axis range to sensible values - like 'min', but with tick marks """ self._xSpec= type def SetYSpec(self, type= 'auto'): """ySpec- defines x axis type. Can be 'none', 'min' or 'auto' where: 'none' - shows no axis or tick mark values 'min' - shows min bounding box values 'auto' - rounds axis range to sensible values - like 'min', but with tick marks """ self._ySpec= type def GetXSpec(self): """Returns current XSpec for axis""" return self._xSpec def GetYSpec(self): """Returns current YSpec for axis""" return self._ySpec def GetXMaxRange(self): xAxis = self._getXMaxRange() if self.getLogScale()[0]: xAxis = _Numeric.power(10,xAxis) return xAxis def _getXMaxRange(self): """Returns (minX, maxX) x-axis range for displayed graph""" graphics= self.last_draw[0] p1, p2 = graphics.boundingBox() # min, max points of graphics xAxis = self._axisInterval(self._xSpec, p1[0], p2[0]) # in user units return xAxis def GetYMaxRange(self): yAxis = self._getYMaxRange() if self.getLogScale()[1]: yAxis = _Numeric.power(10,yAxis) return yAxis def _getYMaxRange(self): """Returns (minY, maxY) y-axis range for displayed graph""" graphics= self.last_draw[0] p1, p2 = graphics.boundingBox() # min, max points of graphics yAxis = self._axisInterval(self._ySpec, p1[1], p2[1]) return yAxis def GetXCurrentRange(self): xAxis = self._getXCurrentRange() if self.getLogScale()[0]: xAxis = _Numeric.power(10,xAxis) return xAxis def _getXCurrentRange(self): """Returns (minX, maxX) x-axis for currently displayed portion of graph""" return self.last_draw[1] def GetYCurrentRange(self): yAxis = self._getYCurrentRange() if self.getLogScale()[1]: yAxis = _Numeric.power(10,yAxis) return yAxis def _getYCurrentRange(self): """Returns (minY, maxY) y-axis for currently displayed portion of graph""" return self.last_draw[2] def Draw(self, graphics, xAxis = None, yAxis = None, dc = None): """Wrapper around _Draw, which handles log axes""" graphics.setLogScale(self.getLogScale()) # check Axis is either tuple or none if type(xAxis) not in [type(None),tuple]: raise TypeError, "xAxis should be None or (minX,maxX)"+str(type(xAxis)) if type(yAxis) not in [type(None),tuple]: raise TypeError, "yAxis should be None or (minY,maxY)"+str(type(xAxis)) # check case for axis = (a,b) where a==b caused by improper zooms if xAxis != None: if xAxis[0] == xAxis[1]: return if self.getLogScale()[0]: xAxis = _Numeric.log10(xAxis) if yAxis != None: if yAxis[0] == yAxis[1]: return if self.getLogScale()[1]: yAxis = _Numeric.log10(yAxis) self._Draw(graphics, xAxis, yAxis, dc) def _Draw(self, graphics, xAxis = None, yAxis = None, dc = None): """\ Draw objects in graphics with specified x and y axis. graphics- instance of PlotGraphics with list of PolyXXX objects xAxis - tuple with (min, max) axis range to view yAxis - same as xAxis dc - drawing context - doesn't have to be specified. If it's not, the offscreen buffer is used """ if dc is None: # sets new dc and clears it dc = wx.BufferedDC(wx.ClientDC(self.canvas), self._Buffer) bbr = wx.Brush(self.GetBackgroundColour(), wx.SOLID) dc.SetBackground(bbr) dc.SetBackgroundMode(wx.SOLID) dc.Clear() if self._antiAliasingEnabled: if not isinstance(dc, wx.GCDC): try: dc = wx.GCDC(dc) except Exception, exception: pass else: if self._hiResEnabled: dc.SetMapMode(wx.MM_TWIPS) # high precision - each logical unit is 1/20 of a point self._pointSize = tuple(1.0 / lscale for lscale in dc.GetLogicalScale()) self._setSize() elif self._pointSize != (1.0, 1.0): self._pointSize = (1.0, 1.0) self._setSize() self._fontScale = get_dc_font_scale(dc) graphics._pointSize = self._pointSize dc.SetTextForeground(self.GetForegroundColour()) dc.SetTextBackground(self.GetBackgroundColour()) dc.BeginDrawing() # dc.Clear() # set font size for every thing but title and legend dc.SetFont(self._getFont(self._fontSizeAxis)) # sizes axis to axis type, create lower left and upper right corners of plot if xAxis is None or yAxis is None: # One or both axis not specified in Draw p1, p2 = graphics.boundingBox() # min, max points of graphics if xAxis is None: xAxis = self._axisInterval(self._xSpec, p1[0], p2[0]) # in user units if yAxis is None: yAxis = self._axisInterval(self._ySpec, p1[1], p2[1]) # Adjust bounding box for axis spec p1[0],p1[1] = xAxis[0], yAxis[0] # lower left corner user scale (xmin,ymin) p2[0],p2[1] = xAxis[1], yAxis[1] # upper right corner user scale (xmax,ymax) else: # Both axis specified in Draw p1= _Numeric.array([xAxis[0], yAxis[0]]) # lower left corner user scale (xmin,ymin) p2= _Numeric.array([xAxis[1], yAxis[1]]) # upper right corner user scale (xmax,ymax) self.last_draw = (graphics, _Numeric.array(xAxis), _Numeric.array(yAxis)) # saves most recient values # Get ticks and textExtents for axis if required if self._xSpec is not 'none': xticks = self._xticks(xAxis[0], xAxis[1]) else: xticks = None if xticks: xTextExtent = dc.GetTextExtent(xticks[-1][1])# w h of x axis text last number on axis else: xTextExtent= (0,0) # No text for ticks if self._ySpec is not 'none': yticks = self._yticks(yAxis[0], yAxis[1]) else: yticks = None if yticks: if self.getLogScale()[1]: yTextExtent = dc.GetTextExtent('-2e-2') else: yTextExtentBottom = dc.GetTextExtent(yticks[0][1]) yTextExtentTop = dc.GetTextExtent(yticks[-1][1]) yTextExtent= (max(yTextExtentBottom[0],yTextExtentTop[0]), max(yTextExtentBottom[1],yTextExtentTop[1])) else: yTextExtent= (0,0) # No text for ticks # TextExtents for Title and Axis Labels titleWH, xLabelWH, yLabelWH= self._titleLablesWH(dc, graphics) # TextExtents for Legend legendBoxWH, legendSymExt, legendTextExt = self._legendWH(dc, graphics) # room around graph area rhsW= max(xTextExtent[0], legendBoxWH[0])+5*self._pointSize[0] # use larger of number width or legend width lhsW= yTextExtent[0]+ yLabelWH[1] + 3*self._pointSize[0] bottomH= max(xTextExtent[1], yTextExtent[1]/2.)+ xLabelWH[1] + 2*self._pointSize[1] topH= yTextExtent[1]/2. + titleWH[1] textSize_scale= _Numeric.array([rhsW+lhsW,bottomH+topH]) # make plot area smaller by text size textSize_shift= _Numeric.array([lhsW, bottomH]) # shift plot area by this amount # draw title if requested if self._titleEnabled: dc.SetFont(self._getFont(self._fontSizeTitle)) titlePos= (self.plotbox_origin[0]+ lhsW + (self.plotbox_size[0]-lhsW-rhsW)/2.- titleWH[0]/2., self.plotbox_origin[1]- self.plotbox_size[1]) dc.DrawText(graphics.getTitle(),titlePos[0],titlePos[1]) # draw label text dc.SetFont(self._getFont(self._fontSizeAxis)) xLabelPos= (self.plotbox_origin[0]+ lhsW + (self.plotbox_size[0]-lhsW-rhsW)/2.- xLabelWH[0]/2., self.plotbox_origin[1]- xLabelWH[1]) dc.DrawText(graphics.getXLabel(),xLabelPos[0],xLabelPos[1]) yLabelPos= (self.plotbox_origin[0] - 3*self._pointSize[0], self.plotbox_origin[1]- bottomH- (self.plotbox_size[1]-bottomH-topH)/2.+ yLabelWH[0]/2.) if graphics.getYLabel(): # bug fix for Linux dc.DrawRotatedText(graphics.getYLabel(),yLabelPos[0],yLabelPos[1],90) # drawing legend makers and text if self._legendEnabled: self._drawLegend(dc,graphics,rhsW,topH,legendBoxWH, legendSymExt, legendTextExt) # allow for scaling and shifting plotted points scale = (self.plotbox_size-textSize_scale) / (p2-p1)* _Numeric.array((1,-1)) shift = -p1*scale + self.plotbox_origin + textSize_shift * _Numeric.array((1,-1)) self._pointScale= scale / self._pointSize # make available for mouse events self._pointShift= shift / self._pointSize self._drawAxes(dc, p1, p2, scale, shift, xticks, yticks) graphics.scaleAndShift(scale, shift) graphics.setPrinterScale(self.printerScale) # thicken up lines and markers if printing # set clipping area so drawing does not occur outside axis box ptx,pty,rectWidth,rectHeight= self._point2ClientCoord(p1, p2) # allow graph to overlap axis lines by adding units to width and height dc.SetClippingRegion(ptx*self._pointSize[0],pty*self._pointSize[1],rectWidth*self._pointSize[0]+2,rectHeight*self._pointSize[1]+1) # Draw extras self._drawExtras(dc, p1, p2, scale, shift) # Draw the lines and markers #start = _time.clock() graphics.draw(dc) # print "entire graphics drawing took: %f second"%(_time.clock() - start) # remove the clipping region dc.DestroyClippingRegion() dc.EndDrawing() self._adjustScrollbars() def Redraw(self, dc=None): """Redraw the existing plot.""" if self.last_draw is not None: graphics, xAxis, yAxis= self.last_draw self._Draw(graphics,xAxis,yAxis,dc) def Clear(self): """Erase the window.""" self.last_PointLabel = None #reset pointLabel dc = wx.BufferedDC(wx.ClientDC(self.canvas), self._Buffer) bbr = wx.Brush(self.GetBackgroundColour(), wx.SOLID) dc.SetBackground(bbr) dc.SetBackgroundMode(wx.SOLID) dc.Clear() if self._antiAliasingEnabled: try: dc = wx.GCDC(dc) except Exception, exception: pass dc.SetTextForeground(self.GetForegroundColour()) dc.SetTextBackground(self.GetBackgroundColour()) self.last_draw = None def Zoom(self, Center, Ratio): """ Zoom on the plot Centers on the X,Y coords given in Center Zooms by the Ratio = (Xratio, Yratio) given """ self.last_PointLabel = None #reset maker x,y = Center if self.last_draw != None: (graphics, xAxis, yAxis) = self.last_draw w = (xAxis[1] - xAxis[0]) * Ratio[0] h = (yAxis[1] - yAxis[0]) * Ratio[1] xAxis = ( x - w/2, x + w/2 ) yAxis = ( y - h/2, y + h/2 ) self._Draw(graphics, xAxis, yAxis) def GetClosestPoints(self, pntXY, pointScaled= True): """Returns list with [curveNumber, legend, index of closest point, pointXY, scaledXY, distance] list for each curve. Returns [] if no curves are being plotted. x, y in user coords if pointScaled == True based on screen coords if pointScaled == False based on user coords """ if self.last_draw is None: #no graph available return [] graphics, xAxis, yAxis= self.last_draw l = [] for curveNum,obj in enumerate(graphics): #check there are points in the curve if len(obj.points) == 0: continue #go to next obj #[curveNumber, legend, index of closest point, pointXY, scaledXY, distance] cn = [curveNum]+ [obj.getLegend()]+ obj.getClosestPoint( pntXY, pointScaled) l.append(cn) return l def GetClosestPoint(self, pntXY, pointScaled= True): """Returns list with [curveNumber, legend, index of closest point, pointXY, scaledXY, distance] list for only the closest curve. Returns [] if no curves are being plotted. x, y in user coords if pointScaled == True based on screen coords if pointScaled == False based on user coords """ #closest points on screen based on screen scaling (pointScaled= True) #list [curveNumber, index, pointXY, scaledXY, distance] for each curve closestPts= self.GetClosestPoints(pntXY, pointScaled) if closestPts == []: return [] #no graph present #find one with least distance dists = [c[-1] for c in closestPts] mdist = min(dists) #Min dist i = dists.index(mdist) #index for min dist return closestPts[i] #this is the closest point on closest curve GetClosetPoint = GetClosestPoint def UpdatePointLabel(self, mDataDict): """Updates the pointLabel point on screen with data contained in mDataDict. mDataDict will be passed to your function set by SetPointLabelFunc. It can contain anything you want to display on the screen at the scaledXY point you specify. This function can be called from parent window with onClick, onMotion events etc. """ if self.last_PointLabel != None: #compare pointXY if _Numeric.sometrue(mDataDict["pointXY"] != self.last_PointLabel["pointXY"]): #closest changed self._drawPointLabel(self.last_PointLabel) #erase old self._drawPointLabel(mDataDict) #plot new else: #just plot new with no erase self._drawPointLabel(mDataDict) #plot new #save for next erase self.last_PointLabel = mDataDict # event handlers ********************************** def OnMotion(self, event): if self._zoomEnabled and event.LeftIsDown(): if self._hasDragged: self._drawRubberBand(self._zoomCorner1, self._zoomCorner2) # remove old else: self._hasDragged= True self._zoomCorner2[0], self._zoomCorner2[1] = self._getXY(event) self._drawRubberBand(self._zoomCorner1, self._zoomCorner2) # add new elif self._dragEnabled and event.LeftIsDown(): coordinates = event.GetPosition() newpos, oldpos = map(_Numeric.array, map(self.PositionScreenToUser, [coordinates, self._screenCoordinates])) dist = newpos-oldpos self._screenCoordinates = coordinates if self.last_draw is not None: graphics, xAxis, yAxis= self.last_draw yAxis -= dist[1] xAxis -= dist[0] self._Draw(graphics,xAxis,yAxis) def OnMouseLeftDown(self,event): self._zoomCorner1[0], self._zoomCorner1[1]= self._getXY(event) self._screenCoordinates = _Numeric.array(event.GetPosition()) if self._dragEnabled: self.SetCursor(self.GrabHandCursor) self.canvas.CaptureMouse() def OnMouseLeftUp(self, event): if self._zoomEnabled: if self._hasDragged == True: self._drawRubberBand(self._zoomCorner1, self._zoomCorner2) # remove old self._zoomCorner2[0], self._zoomCorner2[1]= self._getXY(event) self._hasDragged = False # reset flag minX, minY= _Numeric.minimum( self._zoomCorner1, self._zoomCorner2) maxX, maxY= _Numeric.maximum( self._zoomCorner1, self._zoomCorner2) self.last_PointLabel = None #reset pointLabel if self.last_draw != None: self._Draw(self.last_draw[0], xAxis = (minX,maxX), yAxis = (minY,maxY), dc = None) #else: # A box has not been drawn, zoom in on a point ## this interfered with the double click, so I've disables it. # X,Y = self._getXY(event) # self.Zoom( (X,Y), (self._zoomInFactor,self._zoomInFactor) ) if self._dragEnabled: self.SetCursor(self.HandCursor) if self.canvas.HasCapture(): self.canvas.ReleaseMouse() def OnMouseDoubleClick(self,event): if self._zoomEnabled: # Give a little time for the click to be totally finished # before (possibly) removing the scrollbars and trigering # size events, etc. wx.FutureCall(200,self.Reset) def OnMouseRightDown(self,event): if self._zoomEnabled: X,Y = self._getXY(event) self.Zoom( (X,Y), (self._zoomOutFactor, self._zoomOutFactor) ) def OnPaint(self, event): # All that is needed here is to draw the buffer to screen if self.last_PointLabel != None: self._drawPointLabel(self.last_PointLabel) #erase old self.last_PointLabel = None dc = wx.BufferedPaintDC(self.canvas, self._Buffer) if self._antiAliasingEnabled: try: dc = wx.GCDC(dc) except Exception, exception: pass def OnSize(self,event): # The Buffer init is done here, to make sure the buffer is always # the same size as the Window Size = self.canvas.GetClientSize() Size.width = max(1, Size.width) Size.height = max(1, Size.height) # Make new offscreen bitmap: this bitmap will always have the # current drawing in it, so it can be used to save the image to # a file, or whatever. self._Buffer = wx.EmptyBitmap(Size.width, Size.height) self._setSize() self.last_PointLabel = None #reset pointLabel if self.last_draw is None: self.Clear() else: graphics, xSpec, ySpec = self.last_draw self._Draw(graphics,xSpec,ySpec) def OnLeave(self, event): """Used to erase pointLabel when mouse outside window""" if self.last_PointLabel != None: self._drawPointLabel(self.last_PointLabel) #erase old self.last_PointLabel = None def OnScroll(self, evt): if not self._adjustingSB: self._sb_ignore = True sbpos = evt.GetPosition() if evt.GetOrientation() == wx.VERTICAL: fullrange,pagesize = self.sb_vert.GetRange(),self.sb_vert.GetPageSize() sbpos = fullrange-pagesize-sbpos dist = sbpos*self._sb_yunit-(self._getYCurrentRange()[0]-self._sb_yfullrange) self.ScrollUp(dist) if evt.GetOrientation() == wx.HORIZONTAL: dist = sbpos*self._sb_xunit-(self._getXCurrentRange()[0]-self._sb_xfullrange) self.ScrollRight(dist) # Private Methods ************************************************** def _setSize(self, width=None, height=None): """DC width and height.""" if width is None: (self.width,self.height) = self.canvas.GetClientSize() else: self.width, self.height= width,height self.width *= self._pointSize[0] # high precision self.height *= self._pointSize[1] # high precision self.plotbox_size = 0.97*_Numeric.array([self.width, self.height]) xo = 0.5*(self.width-self.plotbox_size[0]) yo = self.height-0.5*(self.height-self.plotbox_size[1]) self.plotbox_origin = _Numeric.array([xo, yo]) def _setPrinterScale(self, scale): """Used to thicken lines and increase marker size for print out.""" # line thickness on printer is very thin at 600 dot/in. Markers small self.printerScale= scale def _printDraw(self, printDC): """Used for printing.""" if self.last_draw != None: graphics, xSpec, ySpec= self.last_draw self._Draw(graphics,xSpec,ySpec,printDC) def _drawPointLabel(self, mDataDict): """Draws and erases pointLabels""" width = self._Buffer.GetWidth() height = self._Buffer.GetHeight() tmp_Buffer = self._Buffer.GetSubBitmap((0, 0, width, height)) dcs = wx.MemoryDC(self._Buffer) dcs.BeginDrawing() self._pointLabelFunc(dcs,mDataDict) #custom user pointLabel function dcs.EndDrawing() dc = wx.ClientDC( self.canvas ) dc = wx.BufferedDC(dc, self._Buffer) #this will erase if called twice dc.Blit(0, 0, width, height, dcs, 0, 0, self._logicalFunction) self._Buffer = tmp_Buffer def _drawLegend(self,dc,graphics,rhsW,topH,legendBoxWH, legendSymExt, legendTextExt): """Draws legend symbols and text""" # top right hand corner of graph box is ref corner trhc= self.plotbox_origin+ (self.plotbox_size-[rhsW,topH])*[1,-1] legendLHS= .091* legendBoxWH[0] # border space between legend sym and graph box lineHeight= max(legendSymExt[1], legendTextExt[1]) * 1.1 #1.1 used as space between lines dc.SetFont(self._getFont(self._fontSizeLegend)) for i in range(len(graphics)): o = graphics[i] s= i*lineHeight if isinstance(o,PolyMarker): # draw marker with legend pnt= (trhc[0]+legendLHS+legendSymExt[0]/2., trhc[1]+s+lineHeight/2.) o.draw(dc, self.printerScale, coord= _Numeric.array([pnt])) elif isinstance(o,PolyLine): # draw line with legend pnt1= (trhc[0]+legendLHS, trhc[1]+s+lineHeight/2.) pnt2= (trhc[0]+legendLHS+legendSymExt[0], trhc[1]+s+lineHeight/2.) o.draw(dc, self.printerScale, coord= _Numeric.array([pnt1,pnt2])) else: raise TypeError, "object is neither PolyMarker or PolyLine instance" # draw legend txt pnt= (trhc[0]+legendLHS+legendSymExt[0]+5*self._pointSize[0], trhc[1]+s+lineHeight/2.-legendTextExt[1]/2) dc.DrawText(o.getLegend(),pnt[0],pnt[1]) dc.SetFont(self._getFont(self._fontSizeAxis)) # reset def _titleLablesWH(self, dc, graphics): """Draws Title and labels and returns width and height for each""" # TextExtents for Title and Axis Labels dc.SetFont(self._getFont(self._fontSizeTitle)) if self._titleEnabled: title= graphics.getTitle() titleWH= dc.GetTextExtent(title) else: titleWH= (0,0) dc.SetFont(self._getFont(self._fontSizeAxis)) xLabel, yLabel= graphics.getXLabel(),graphics.getYLabel() xLabelWH= dc.GetTextExtent(xLabel) yLabelWH= dc.GetTextExtent(yLabel) return titleWH, xLabelWH, yLabelWH def _legendWH(self, dc, graphics): """Returns the size in screen units for legend box""" if self._legendEnabled != True: legendBoxWH= symExt= txtExt= (0,0) else: # find max symbol size symExt= graphics.getSymExtent(self.printerScale) # find max legend text extent dc.SetFont(self._getFont(self._fontSizeLegend)) txtList= graphics.getLegendNames() txtExt= dc.GetTextExtent(txtList[0]) for txt in graphics.getLegendNames()[1:]: txtExt= _Numeric.maximum(txtExt,dc.GetTextExtent(txt)) maxW= symExt[0]+txtExt[0] maxH= max(symExt[1],txtExt[1]) # padding .1 for lhs of legend box and space between lines maxW= maxW* 1.1 maxH= maxH* 1.1 * len(txtList) dc.SetFont(self._getFont(self._fontSizeAxis)) legendBoxWH= (maxW,maxH) return (legendBoxWH, symExt, txtExt) def _drawRubberBand(self, corner1, corner2): """Draws/erases rect box from corner1 to corner2""" ptx,pty,rectWidth,rectHeight= self._point2ClientCoord(corner1, corner2) # draw rectangle dc = wx.ClientDC( self.canvas ) dc.BeginDrawing() dc.SetPen(wx.Pen(wx.BLACK)) dc.SetBrush(wx.Brush( wx.WHITE, wx.TRANSPARENT ) ) dc.SetLogicalFunction(wx.INVERT) dc.DrawRectangle( ptx,pty, rectWidth,rectHeight) dc.SetLogicalFunction(wx.COPY) dc.EndDrawing() def _getFont(self,size): """Take font size, adjusts if printing and returns wx.Font""" s = size*self.printerScale*self._fontScale of = self.GetFont() # Linux speed up to get font from cache rather than X font server key = (int(s), of.GetFamily (), of.GetStyle (), of.GetWeight ()) font = self._fontCache.get (key, None) if font: return font # yeah! cache hit else: font = wx.Font(int(s), of.GetFamily(), of.GetStyle(), of.GetWeight()) self._fontCache[key] = font return font def _point2ClientCoord(self, corner1, corner2): """Converts user point coords to client screen int coords x,y,width,height""" c1= _Numeric.array(corner1) c2= _Numeric.array(corner2) # convert to screen coords pt1= c1*self._pointScale+self._pointShift pt2= c2*self._pointScale+self._pointShift # make height and width positive pul= _Numeric.minimum(pt1,pt2) # Upper left corner plr= _Numeric.maximum(pt1,pt2) # Lower right corner rectWidth, rectHeight= plr-pul ptx,pty= pul return ptx, pty, rectWidth, rectHeight def _axisInterval(self, spec, lower, upper): """Returns sensible axis range for given spec""" if spec == 'none' or spec == 'min' or isinstance(spec, (float, int)): if lower == upper: return lower-0.5, upper+0.5 else: return lower, upper elif spec == 'auto': range = upper-lower if range == 0.: return lower-0.5, upper+0.5 log = _Numeric.log10(range) power = _Numeric.floor(log) fraction = log-power if fraction <= 0.05: power = power-1 grid = 10.**power lower = lower - lower % grid mod = upper % grid if mod != 0: upper = upper - mod + grid return lower, upper elif type(spec) == type(()): lower, upper = spec if lower <= upper: return lower, upper else: return upper, lower else: raise ValueError, str(spec) + ': illegal axis specification' def _drawAxes(self, dc, p1, p2, scale, shift, xticks, yticks): penWidth= self.printerScale * self._pointSize[0] # increases thickness for printing only dc.SetPen(wx.Pen(self._gridColour, penWidth)) # set length of tick marks--long ones make grid if self._gridEnabled: x,y,width,height= self._point2ClientCoord(p1,p2) if self._gridEnabled == 'Horizontal': yTickLength= (width/2.0 +1) * self._pointSize[1] xTickLength= 3 * self.printerScale * self._pointSize[0] elif self._gridEnabled == 'Vertical': yTickLength= 3 * self.printerScale * self._pointSize[1] xTickLength= (height/2.0 +1) * self._pointSize[0] else: yTickLength= (width/2.0 +1) * self._pointSize[1] xTickLength= (height/2.0 +1) * self._pointSize[0] else: yTickLength= 3 * self.printerScale * self._pointSize[1] # lengthens lines for printing xTickLength= 3 * self.printerScale * self._pointSize[0] if self._xSpec is not 'none': lower, upper = p1[0],p2[0] text = 1 for y, d in [(p1[1], -xTickLength), (p2[1], xTickLength)]: # miny, maxy and tick lengths for x, label in xticks: pt = scale*_Numeric.array([x, y])+shift dc.DrawLine(pt[0],pt[1],pt[0],pt[1] + d) # draws tick mark d units if text: dc.DrawText(label,pt[0],pt[1]+2*self._pointSize[1]) a1 = scale*_Numeric.array([lower, y])+shift a2 = scale*_Numeric.array([upper, y])+shift dc.DrawLine(a1[0],a1[1],a2[0],a2[1]) # draws upper and lower axis line text = 0 # axis values not drawn on top side if self._ySpec is not 'none': lower, upper = p1[1],p2[1] text = 1 h = dc.GetCharHeight() for x, d in [(p1[0], -yTickLength), (p2[0], yTickLength)]: for y, label in yticks: pt = scale*_Numeric.array([x, y])+shift dc.DrawLine(pt[0],pt[1],pt[0]-d,pt[1]) if text: dc.DrawText(label,pt[0]-dc.GetTextExtent(label)[0]-3*self._pointSize[0], pt[1]-0.75*h) a1 = scale*_Numeric.array([x, lower])+shift a2 = scale*_Numeric.array([x, upper])+shift dc.DrawLine(a1[0],a1[1],a2[0],a2[1]) text = 0 # axis values not drawn on right side def _drawExtras(self, dc, p1, p2, scale, shift): b1, b2 = self.last_draw[0].boundingBox() if self._centerLinesEnabled: x, y = [b1[i] + (b2[i] - b1[i]) / 2.0 for i in xrange(2)] x, y = self.PositionUserToScreen((x, y)) x, y = x * self._pointSize[0], y * self._pointSize[1] if self._centerLinesEnabled in ('Horizontal', True): dc.DrawLine(scale[0] * p1[0] + shift[0], y, scale[0] * p2[0] + shift[0], y) if self._centerLinesEnabled in ('Vertical', True): dc.DrawLine(x, scale[1] * p1[1] + shift[1], x, scale[1] * p2[1] + shift[1]) if self._diagonalsEnabled: x1, y1 = self.PositionUserToScreen(b1) x1, y1 = x1 * self._pointSize[0], y1 * self._pointSize[1] x2, y2 = self.PositionUserToScreen(b2) x2, y2 = x2 * self._pointSize[0], y2 * self._pointSize[1] if self._diagonalsEnabled in ('Bottomleft-Topright', True): dc.DrawLine(x1, y1, x2, y2) if self._diagonalsEnabled in ('Bottomright-Topleft', True): dc.DrawLine(x1, y2, x2, y1) def _xticks(self, *args): if self._logscale[0]: return self._logticks(*args) else: attr = {'numticks': self._xSpec} return self._ticks(*args, **attr) def _yticks(self, *args): if self._logscale[1]: return self._logticks(*args) else: attr = {'numticks': self._ySpec} return self._ticks(*args, **attr) def _logticks(self, lower, upper): #lower,upper = map(_Numeric.log10,[lower,upper]) #print 'logticks',lower,upper ticks = [] mag = _Numeric.power(10,_Numeric.floor(lower)) if upper-lower > 6: t = _Numeric.power(10,_Numeric.ceil(lower)) base = _Numeric.power(10,_Numeric.floor((upper-lower)/6)) def inc(t): return t*base-t else: t = _Numeric.ceil(_Numeric.power(10,lower)/mag)*mag def inc(t): return 10**int(_Numeric.floor(_Numeric.log10(t)+1e-16)) majortick = int(_Numeric.log10(mag)) while t <= pow(10,upper): if majortick != int(_Numeric.floor(_Numeric.log10(t)+1e-16)): majortick = int(_Numeric.floor(_Numeric.log10(t)+1e-16)) ticklabel = '1e%d'%majortick else: if upper-lower < 2: minortick = int(t/pow(10,majortick)+.5) ticklabel = '%de%d'%(minortick,majortick) else: ticklabel = '' ticks.append((_Numeric.log10(t), ticklabel)) t += inc(t) if len(ticks) == 0: ticks = [(0,'')] return ticks def _ticks(self, lower, upper, numticks=None): if isinstance(numticks, (float, int)): ideal = (upper-lower)/float(numticks) else: ideal = (upper-lower)/7. log = _Numeric.log10(ideal) power = _Numeric.floor(log) if isinstance(numticks, (float, int)): grid = ideal else: fraction = log-power factor = 1. error = fraction for f, lf in self._multiples: e = _Numeric.fabs(fraction-lf) if e < error: error = e factor = f grid = factor * 10.**power if self._useScientificNotation and (power > 4 or power < -4): format = '%+7.1e' else: if ideal > int(ideal): fdigits = len(str(round(ideal, 4)).split('.')[-1][:4].rstrip('0')) else: fdigits = 0 if power >= 0: digits = max(1, int(power)) format = '%' + `digits`+'.'+`fdigits`+'f' else: digits = -int(power) format = '%'+`digits+2`+'.'+`fdigits`+'f' ticks = [] t = -grid*_Numeric.floor(-lower/grid) while t <= upper: if t == -0: t = 0 ticks.append( (t, format % (t,)) ) t = t + grid return ticks _multiples = [(2., _Numeric.log10(2.)), (5., _Numeric.log10(5.))] def _adjustScrollbars(self): if self._sb_ignore: self._sb_ignore = False return if not self.GetShowScrollbars(): return self._adjustingSB = True needScrollbars = False # horizontal scrollbar r_current = self._getXCurrentRange() r_max = list(self._getXMaxRange()) sbfullrange = float(self.sb_hor.GetRange()) r_max[0] = min(r_max[0],r_current[0]) r_max[1] = max(r_max[1],r_current[1]) self._sb_xfullrange = r_max unit = (r_max[1]-r_max[0])/float(self.sb_hor.GetRange()) pos = int((r_current[0]-r_max[0])/unit) if pos >= 0: pagesize = int((r_current[1]-r_current[0])/unit) self.sb_hor.SetScrollbar(pos, pagesize, sbfullrange, pagesize) self._sb_xunit = unit needScrollbars = needScrollbars or (pagesize != sbfullrange) else: self.sb_hor.SetScrollbar(0, 1000, 1000, 1000) # vertical scrollbar r_current = self._getYCurrentRange() r_max = list(self._getYMaxRange()) sbfullrange = float(self.sb_vert.GetRange()) r_max[0] = min(r_max[0],r_current[0]) r_max[1] = max(r_max[1],r_current[1]) self._sb_yfullrange = r_max unit = (r_max[1]-r_max[0])/sbfullrange pos = int((r_current[0]-r_max[0])/unit) if pos >= 0: pagesize = int((r_current[1]-r_current[0])/unit) pos = (sbfullrange-1-pos-pagesize) self.sb_vert.SetScrollbar(pos, pagesize, sbfullrange, pagesize) self._sb_yunit = unit needScrollbars = needScrollbars or (pagesize != sbfullrange) else: self.sb_vert.SetScrollbar(0, 1000, 1000, 1000) self.SetShowScrollbars(needScrollbars) self._adjustingSB = False #------------------------------------------------------------------------------- # Used to layout the printer page class PlotPrintout(wx.Printout): """Controls how the plot is made in printing and previewing""" # Do not change method names in this class, # we have to override wx.Printout methods here! def __init__(self, graph): """graph is instance of plotCanvas to be printed or previewed""" wx.Printout.__init__(self) self.graph = graph def HasPage(self, page): if page == 1: return True else: return False def GetPageInfo(self): return (1, 1, 1, 1) # disable page numbers def OnPrintPage(self, page): dc = self.GetDC() # allows using floats for certain functions ## print "PPI Printer",self.GetPPIPrinter() ## print "PPI Screen", self.GetPPIScreen() ## print "DC GetSize", dc.GetSize() ## print "GetPageSizePixels", self.GetPageSizePixels() # Note PPIScreen does not give the correct number # Calulate everything for printer and then scale for preview PPIPrinter= self.GetPPIPrinter() # printer dots/inch (w,h) #PPIScreen= self.GetPPIScreen() # screen dots/inch (w,h) dcSize= dc.GetSize() # DC size if self.graph._antiAliasingEnabled and not isinstance(dc, wx.GCDC): try: dc = wx.GCDC(dc) except Exception, exception: pass else: if self.graph._hiResEnabled: dc.SetMapMode(wx.MM_TWIPS) # high precision - each logical unit is 1/20 of a point pageSize= self.GetPageSizePixels() # page size in terms of pixcels clientDcSize= self.graph.GetClientSize() # find what the margins are (mm) margLeftSize,margTopSize= self.graph.pageSetupData.GetMarginTopLeft() margRightSize, margBottomSize= self.graph.pageSetupData.GetMarginBottomRight() # calculate offset and scale for dc pixLeft= margLeftSize*PPIPrinter[0]/25.4 # mm*(dots/in)/(mm/in) pixRight= margRightSize*PPIPrinter[0]/25.4 pixTop= margTopSize*PPIPrinter[1]/25.4 pixBottom= margBottomSize*PPIPrinter[1]/25.4 plotAreaW= pageSize[0]-(pixLeft+pixRight) plotAreaH= pageSize[1]-(pixTop+pixBottom) # ratio offset and scale to screen size if preview if self.IsPreview(): ratioW= float(dcSize[0])/pageSize[0] ratioH= float(dcSize[1])/pageSize[1] pixLeft *= ratioW pixTop *= ratioH plotAreaW *= ratioW plotAreaH *= ratioH # rescale plot to page or preview plot area self.graph._setSize(plotAreaW,plotAreaH) # Set offset and scale dc.SetDeviceOrigin(pixLeft,pixTop) # Thicken up pens and increase marker size for printing ratioW= float(plotAreaW)/clientDcSize[0] ratioH= float(plotAreaH)/clientDcSize[1] aveScale= (ratioW+ratioH)/2 if self.graph._antiAliasingEnabled and not self.IsPreview(): scale = dc.GetUserScale() dc.SetUserScale(scale[0] / self.graph._pointSize[0], scale[1] / self.graph._pointSize[1]) self.graph._setPrinterScale(aveScale) # tickens up pens for printing self.graph._printDraw(dc) # rescale back to original self.graph._setSize() self.graph._setPrinterScale(1) self.graph.Redraw() #to get point label scale and shift correct return True #---------------------------------------------------------------------- try: from embeddedimage import PyEmbeddedImage except ImportError: from wx.lib.embeddedimage import PyEmbeddedImage MagPlus = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAOFJ" "REFUeJy1VdEOxCAIo27//8XbuKfuPASGZ0Zisoi2FJABbZM3bY8c13lo5GvbjioBPAUEB0Yc" "VZ0iGRRc56Ee8DcikEgrJD8EFpzRegQASiRtBtzuA0hrdRPYQxaEKyJPG6IHyiK3xnNZvUSS" "NvUuzgYh0il4y14nCFPk5XgmNbRbQbVotGo9msj47G3UXJ7fuz8Q8FAGEu0/PbZh2D3NoshU" "1VUydBGVZKMimlGeErdNGUmf/x7YpjMjcf8HVYvS2adr6aFVlCy/5Ijk9q8SeCR9isJR8SeJ" "8pv7S0Wu2Acr0qdj3w7DRAAAAABJRU5ErkJggg==") GrabHand = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAARFJ" "REFUeJy1VdESgzAIS2j//4s3s5fRQ6Rad5M7H0oxCZhWSpK1TjwUBCBJAIBItL1fijlfe1yJ" "8noCGC9KgrXO7f0SyZEDAF/H2opsAHv9V/548nplT5Jo7YAFQKQ1RMWzmHUS96suqdBrHkuV" "uxpdJjCS8CfGXWdJ2glzcquKSR5c46QOtCpgNyIHj6oieAXg3282QvMX45hy8a8H0VonJZUO" "clesjOPg/dhBTq64o1Kacz4Ri2x5RKsf8+wcWQaJJL+A+xRcZHeQeBKjK+5EFiVJ4xy4x2Mn" "1Vk4U5/DWmfPieiqbye7a3tV/cCsWKu76K76KUFFchVnhigJ/hmktelm/m3e3b8k+Ec8PqLH" "CT4JRfyK9o1xYwAAAABJRU5ErkJggg==") Hand = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAARBJ" "REFUeJytluECwiAIhDn1/Z942/UnjCGoq+6XNeWDC1xAqbKr6zyo61Ibds60J8GBT0yS3IEM" "ABuIpJTa4IOLiAAQksuKyixLH1ShHgTgZl8KiALxOsODPoEMkgJ25Su6zoO3ZrjRnI96OLIq" "k7dsqOCboDa4XV/nwQEQVeFtmMnvbSJja+oagKBUaLn9hzd7VipRa9ostIv0O1uhzzaqNJxk" "hViwDVxqg51kksMg9r2rDDIFwHCap130FBhdMzeAfWg//6Ki5WWQrHSv6EIUeVs0g3wT3J7r" "FmWQp/JJDXeRh2TXcJa91zAH2uN2mvXFsrIrsjS8rnftWmWfAiLIStuD9m9h9belvzgS/1fP" "X7075IwDENteAAAAAElFTkSuQmCC") #--------------------------------------------------------------------------- # if running standalone... # # ...a sample implementation using the above # def _draw1Objects(): # 100 points sin function, plotted as green circles data1 = 2.*_Numeric.pi*_Numeric.arange(200)/200. data1.shape = (100, 2) data1[:,1] = _Numeric.sin(data1[:,0]) markers1 = PolyMarker(data1, legend='Green Markers', colour='green', marker='circle',size=1) # 50 points cos function, plotted as red line data1 = 2.*_Numeric.pi*_Numeric.arange(100)/100. data1.shape = (50,2) data1[:,1] = _Numeric.cos(data1[:,0]) lines = PolySpline(data1, legend= 'Red Line', colour='red') # A few more points... pi = _Numeric.pi markers2 = PolyMarker([(0., 0.), (pi/4., 1.), (pi/2, 0.), (3.*pi/4., -1)], legend='Cross Legend', colour='blue', marker='cross') return PlotGraphics([markers1, lines, markers2],"Graph Title", "X Axis", "Y Axis") def _draw2Objects(): # 100 points sin function, plotted as green dots data1 = 2.*_Numeric.pi*_Numeric.arange(200)/200. data1.shape = (100, 2) data1[:,1] = _Numeric.sin(data1[:,0]) line1 = PolySpline(data1, legend='Green Line', colour='green', width=6, style=wx.DOT) # 50 points cos function, plotted as red dot-dash data1 = 2.*_Numeric.pi*_Numeric.arange(100)/100. data1.shape = (50,2) data1[:,1] = _Numeric.cos(data1[:,0]) line2 = PolySpline(data1, legend='Red Line', colour='red', width=3, style= wx.DOT_DASH) # A few more points... pi = _Numeric.pi markers1 = PolyMarker([(0., 0.), (pi/4., 1.), (pi/2, 0.), (3.*pi/4., -1)], legend='Cross Hatch Square', colour='blue', width= 3, size= 6, fillcolour= 'red', fillstyle= wx.CROSSDIAG_HATCH, marker='square') return PlotGraphics([markers1, line1, line2], "Big Markers with Different Line Styles") def _draw3Objects(): markerList= ['circle', 'dot', 'square', 'triangle', 'triangle_down', 'cross', 'plus', 'circle'] m=[] for i in range(len(markerList)): m.append(PolyMarker([(2*i+.5,i+.5)], legend=markerList[i], colour='blue', marker=markerList[i])) return PlotGraphics(m, "Selection of Markers", "Minimal Axis", "No Axis") def _draw4Objects(): # 25,000 point line data1 = _Numeric.arange(5e5,1e6,10) data1.shape = (25000, 2) line1 = PolyLine(data1, legend='Wide Line', colour='green', width=5) # A few more points... markers2 = PolyMarker(data1, legend='Square', colour='blue', marker='square') return PlotGraphics([line1, markers2], "25,000 Points", "Value X", "") def _draw5Objects(): # Empty graph with axis defined but no points/lines points=[] line1 = PolyLine(points, legend='Wide Line', colour='green', width=5) return PlotGraphics([line1], "Empty Plot With Just Axes", "Value X", "Value Y") def _draw6Objects(): # Bar graph points1=[(1,0), (1,10)] line1 = PolyLine(points1, colour='green', legend='Feb.', width=10) points1g=[(2,0), (2,4)] line1g = PolyLine(points1g, colour='red', legend='Mar.', width=10) points1b=[(3,0), (3,6)] line1b = PolyLine(points1b, colour='blue', legend='Apr.', width=10) points2=[(4,0), (4,12)] line2 = PolyLine(points2, colour='Yellow', legend='May', width=10) points2g=[(5,0), (5,8)] line2g = PolyLine(points2g, colour='orange', legend='June', width=10) points2b=[(6,0), (6,4)] line2b = PolyLine(points2b, colour='brown', legend='July', width=10) return PlotGraphics([line1, line1g, line1b, line2, line2g, line2b], "Bar Graph - (Turn on Grid, Legend)", "Months", "Number of Students") def _draw7Objects(): # Empty graph with axis defined but no points/lines x = _Numeric.arange(1,1000,1) y1 = 4.5*x**2 y2 = 2.2*x**3 points1 = _Numeric.transpose([x,y1]) points2 = _Numeric.transpose([x,y2]) line1 = PolyLine(points1, legend='quadratic', colour='blue', width=1) line2 = PolyLine(points2, legend='cubic', colour='red', width=1) return PlotGraphics([line1,line2], "double log plot", "Value X", "Value Y") class TestFrame(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, (600, 400)) # Now Create the menu bar and items self.mainmenu = wx.MenuBar() menu = wx.Menu() menu.Append(200, 'Page Setup...', 'Setup the printer page') self.Bind(wx.EVT_MENU, self.OnFilePageSetup, id=200) menu.Append(201, 'Print Preview...', 'Show the current plot on page') self.Bind(wx.EVT_MENU, self.OnFilePrintPreview, id=201) menu.Append(202, 'Print...', 'Print the current plot') self.Bind(wx.EVT_MENU, self.OnFilePrint, id=202) menu.Append(203, 'Save Plot...', 'Save current plot') self.Bind(wx.EVT_MENU, self.OnSaveFile, id=203) menu.Append(205, 'E&xit', 'Enough of this already!') self.Bind(wx.EVT_MENU, self.OnFileExit, id=205) self.mainmenu.Append(menu, '&File') menu = wx.Menu() menu.Append(206, 'Draw1', 'Draw plots1') self.Bind(wx.EVT_MENU,self.OnPlotDraw1, id=206) menu.Append(207, 'Draw2', 'Draw plots2') self.Bind(wx.EVT_MENU,self.OnPlotDraw2, id=207) menu.Append(208, 'Draw3', 'Draw plots3') self.Bind(wx.EVT_MENU,self.OnPlotDraw3, id=208) menu.Append(209, 'Draw4', 'Draw plots4') self.Bind(wx.EVT_MENU,self.OnPlotDraw4, id=209) menu.Append(210, 'Draw5', 'Draw plots5') self.Bind(wx.EVT_MENU,self.OnPlotDraw5, id=210) menu.Append(260, 'Draw6', 'Draw plots6') self.Bind(wx.EVT_MENU,self.OnPlotDraw6, id=260) menu.Append(261, 'Draw7', 'Draw plots7') self.Bind(wx.EVT_MENU,self.OnPlotDraw7, id=261) menu.Append(211, '&Redraw', 'Redraw plots') self.Bind(wx.EVT_MENU,self.OnPlotRedraw, id=211) menu.Append(212, '&Clear', 'Clear canvas') self.Bind(wx.EVT_MENU,self.OnPlotClear, id=212) menu.Append(213, '&Scale', 'Scale canvas') self.Bind(wx.EVT_MENU,self.OnPlotScale, id=213) menu.Append(214, 'Enable &Zoom', 'Enable Mouse Zoom', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableZoom, id=214) menu.Append(215, 'Enable &Grid', 'Turn on Grid', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableGrid, id=215) menu.Append(217, 'Enable &Drag', 'Activates dragging mode', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableDrag, id=217) menu.Append(220, 'Enable &Legend', 'Turn on Legend', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableLegend, id=220) menu.Append(222, 'Enable &Point Label', 'Show Closest Point', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnablePointLabel, id=222) menu.Append(223, 'Enable &Anti-Aliasing', 'Smooth output', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableAntiAliasing, id=223) menu.Append(224, 'Enable &High-Resolution AA', 'Draw in higher resolution', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableHiRes, id=224) menu.Append(226, 'Enable Center Lines', 'Draw center lines', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableCenterLines, id=226) menu.Append(227, 'Enable Diagonal Lines', 'Draw diagonal lines', kind=wx.ITEM_CHECK) self.Bind(wx.EVT_MENU,self.OnEnableDiagonals, id=227) menu.Append(231, 'Set Gray Background', 'Change background colour to gray') self.Bind(wx.EVT_MENU,self.OnBackgroundGray, id=231) menu.Append(232, 'Set &White Background', 'Change background colour to white') self.Bind(wx.EVT_MENU,self.OnBackgroundWhite, id=232) menu.Append(233, 'Set Red Label Text', 'Change label text colour to red') self.Bind(wx.EVT_MENU,self.OnForegroundRed, id=233) menu.Append(234, 'Set &Black Label Text', 'Change label text colour to black') self.Bind(wx.EVT_MENU,self.OnForegroundBlack, id=234) menu.Append(225, 'Scroll Up 1', 'Move View Up 1 Unit') self.Bind(wx.EVT_MENU,self.OnScrUp, id=225) menu.Append(230, 'Scroll Rt 2', 'Move View Right 2 Units') self.Bind(wx.EVT_MENU,self.OnScrRt, id=230) menu.Append(235, '&Plot Reset', 'Reset to original plot') self.Bind(wx.EVT_MENU,self.OnReset, id=235) self.mainmenu.Append(menu, '&Plot') menu = wx.Menu() menu.Append(300, '&About', 'About this thing...') self.Bind(wx.EVT_MENU, self.OnHelpAbout, id=300) self.mainmenu.Append(menu, '&Help') self.SetMenuBar(self.mainmenu) # A status bar to tell people what's happening self.CreateStatusBar(1) self.client = PlotCanvas(self) #define the function for drawing pointLabels self.client.SetPointLabelFunc(self.DrawPointLabel) # Create mouse event for showing cursor coords in status bar self.client.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) # Show closest point when enabled self.client.canvas.Bind(wx.EVT_MOTION, self.OnMotion) self.Show(True) def DrawPointLabel(self, dc, mDataDict): """This is the fuction that defines how the pointLabels are plotted dc - DC that will be passed mDataDict - Dictionary of data that you want to use for the pointLabel As an example I have decided I want a box at the curve point with some text information about the curve plotted below. Any wxDC method can be used. """ # ---------- dc.SetPen(wx.Pen(wx.BLACK)) dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) ) sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point dc.DrawRectangle( sx-5,sy-5, 10, 10) #10by10 square centered on point px,py = mDataDict["pointXY"] cNum = mDataDict["curveNum"] pntIn = mDataDict["pIndex"] legend = mDataDict["legend"] #make a string to display s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn) dc.DrawText(s, sx , sy+1) # ----------- def OnMouseLeftDown(self,event): s= "Left Mouse Down at Point: (%.4f, %.4f)" % self.client._getXY(event) self.SetStatusText(s) event.Skip() #allows plotCanvas OnMouseLeftDown to be called def OnMotion(self, event): #show closest point (when enbled) if self.client.GetEnablePointLabel() == True: #make up dict with info for the pointLabel #I've decided to mark the closest point on the closest curve dlst= self.client.GetClosestPoint( self.client._getXY(event), pointScaled= True) if dlst != []: #returns [] if none curveNum, legend, pIndex, pointXY, scaledXY, distance = dlst #make up dictionary to pass to my user function (see DrawPointLabel) mDataDict= {"curveNum":curveNum, "legend":legend, "pIndex":pIndex,\ "pointXY":pointXY, "scaledXY":scaledXY} #pass dict to update the pointLabel self.client.UpdatePointLabel(mDataDict) event.Skip() #go to next handler def OnFilePageSetup(self, event): self.client.PageSetup() def OnFilePrintPreview(self, event): self.client.PrintPreview() def OnFilePrint(self, event): self.client.Printout() def OnSaveFile(self, event): self.client.SaveFile() def OnFileExit(self, event): self.Close() def OnPlotDraw1(self, event): self.resetDefaults() self.client.Draw(_draw1Objects()) def OnPlotDraw2(self, event): self.resetDefaults() self.client.Draw(_draw2Objects()) def OnPlotDraw3(self, event): self.resetDefaults() self.client.SetFont(wx.Font(10,wx.SCRIPT,wx.NORMAL,wx.NORMAL)) self.client.SetFontSizeAxis(20) self.client.SetFontSizeLegend(12) self.client.SetXSpec('min') self.client.SetYSpec('none') self.client.Draw(_draw3Objects()) def OnPlotDraw4(self, event): self.resetDefaults() drawObj= _draw4Objects() self.client.Draw(drawObj) ## # profile ## start = _time.clock() ## for x in range(10): ## self.client.Draw(drawObj) ## print "10 plots of Draw4 took: %f sec."%(_time.clock() - start) ## # profile end def OnPlotDraw5(self, event): # Empty plot with just axes self.resetDefaults() drawObj= _draw5Objects() # make the axis X= (0,5), Y=(0,10) # (default with None is X= (-1,1), Y= (-1,1)) self.client.Draw(drawObj, xAxis= (0,5), yAxis= (0,10)) def OnPlotDraw6(self, event): #Bar Graph Example self.resetDefaults() #self.client.SetEnableLegend(True) #turn on Legend #self.client.SetEnableGrid(True) #turn on Grid self.client.SetXSpec('none') #turns off x-axis scale self.client.SetYSpec('auto') self.client.Draw(_draw6Objects(), xAxis= (0,7)) def OnPlotDraw7(self, event): #log scale example self.resetDefaults() self.client.setLogScale((True,True)) self.client.Draw(_draw7Objects()) def OnPlotRedraw(self,event): self.client.Redraw() def OnPlotClear(self,event): self.client.Clear() def OnPlotScale(self, event): if self.client.last_draw != None: graphics, xAxis, yAxis= self.client.last_draw self.client.Draw(graphics,(1,3.05),(0,1)) def OnEnableZoom(self, event): self.client.SetEnableZoom(event.IsChecked()) self.mainmenu.Check(217, not event.IsChecked()) def OnEnableGrid(self, event): self.client.SetEnableGrid(event.IsChecked()) def OnEnableDrag(self, event): self.client.SetEnableDrag(event.IsChecked()) self.mainmenu.Check(214, not event.IsChecked()) def OnEnableLegend(self, event): self.client.SetEnableLegend(event.IsChecked()) def OnEnablePointLabel(self, event): self.client.SetEnablePointLabel(event.IsChecked()) def OnEnableAntiAliasing(self, event): self.client.SetEnableAntiAliasing(event.IsChecked()) def OnEnableHiRes(self, event): self.client.SetEnableHiRes(event.IsChecked()) def OnEnableCenterLines(self, event): self.client.SetEnableCenterLines(event.IsChecked()) def OnEnableDiagonals(self, event): self.client.SetEnableDiagonals(event.IsChecked()) def OnBackgroundGray(self, event): self.client.SetBackgroundColour("#CCCCCC") self.client.Redraw() def OnBackgroundWhite(self, event): self.client.SetBackgroundColour("white") self.client.Redraw() def OnForegroundRed(self, event): self.client.SetForegroundColour("red") self.client.Redraw() def OnForegroundBlack(self, event): self.client.SetForegroundColour("black") self.client.Redraw() def OnScrUp(self, event): self.client.ScrollUp(1) def OnScrRt(self,event): self.client.ScrollRight(2) def OnReset(self,event): self.client.Reset() def OnHelpAbout(self, event): from wx.lib.dialogs import ScrolledMessageDialog about = ScrolledMessageDialog(self, __doc__, "About...") about.ShowModal() def resetDefaults(self): """Just to reset the fonts back to the PlotCanvas defaults""" self.client.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL)) self.client.SetFontSizeAxis(10) self.client.SetFontSizeLegend(7) self.client.setLogScale((False,False)) self.client.SetXSpec('auto') self.client.SetYSpec('auto') def __test(): class MyApp(wx.App): def OnInit(self): wx.InitAllImageHandlers() frame = TestFrame(None, -1, "PlotCanvas") #frame.Show(True) self.SetTopWindow(frame) return True app = MyApp(0) app.MainLoop() if __name__ == '__main__': __test() DisplayCAL-3.5.0.0/DisplayCAL/wxfixes.py0000644000076500000000000013157413231511006017475 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import os import re import shutil import sys import tempfile from meta import name as appname, wx_minversion # wxversion will be removed in Phoenix try: import wxversion except ImportError: pass else: if not getattr(sys, "frozen", False) and not "wx" in sys.modules: wxversion.ensureMinimal("%i.%i" % wx_minversion[:2]) import wx if wx.VERSION < wx_minversion: app = wx.GetApp() or wx.App(0) result = wx.MessageBox("This application requires a version of wxPython " "greater than or equal to %s, but your most recent " "version is %s.\n\n" "Would you like to download a new version of wxPython?\n" % (".".join(str(n) for n in wx_minversion), wx.__version__), "wxPython Upgrade Needed", style=wx.YES_NO) if result == wx.YES: import webbrowser webbrowser.open("http://wxpython.org/") app.MainLoop() sys.exit() import wx.grid from wx.lib.buttons import GenBitmapButton as _GenBitmapButton from wx.lib.buttons import ThemedGenButton as _ThemedGenButton from wx.lib.buttons import GenBitmapTextButton as _GenBitmapTextButton from wx.lib import platebtn from wx import xrc from colormath import convert_range from util_str import safe_str if not hasattr(platebtn, "PB_STYLE_TOGGLE"): platebtn.PB_STYLE_TOGGLE = 32 if not hasattr(platebtn, "PB_STYLE_DROPARROW"): platebtn.PB_STYLE_DROPARROW = 16 if u"phoenix" in wx.PlatformInfo: # Phoenix compatibility from wx.lib.agw import aui from wx.lib import embeddedimage import wx.adv # Deprecated items wx.DEFAULT = wx.FONTFAMILY_DEFAULT wx.DECORATIVE = wx.FONTFAMILY_DECORATIVE wx.ROMAN = wx.FONTFAMILY_ROMAN wx.SCRIPT = wx.FONTFAMILY_SCRIPT wx.SWISS = wx.FONTFAMILY_SWISS wx.MODERN = wx.FONTFAMILY_MODERN wx.TELETYPE = wx.FONTFAMILY_TELETYPE wx.NORMAL = wx.FONTWEIGHT_NORMAL | wx.FONTSTYLE_NORMAL wx.LIGHT = wx.FONTWEIGHT_LIGHT wx.BOLD = wx.FONTWEIGHT_BOLD wx.ITALIC = wx.FONTSTYLE_ITALIC wx.SLANT = wx.FONTSTYLE_SLANT wx.SOLID = wx.PENSTYLE_SOLID | wx.BRUSHSTYLE_SOLID wx.DOT = wx.PENSTYLE_DOT wx.LONG_DASH = wx.PENSTYLE_LONG_DASH wx.SHORT_DASH = wx.PENSTYLE_SHORT_DASH wx.DOT_DASH = wx.PENSTYLE_DOT_DASH wx.USER_DASH = wx.PENSTYLE_USER_DASH wx.TRANSPARENT = wx.PENSTYLE_TRANSPARENT | wx.BRUSHSTYLE_TRANSPARENT wx.STIPPLE_MASK_OPAQUE = wx.BRUSHSTYLE_STIPPLE_MASK_OPAQUE wx.STIPPLE_MASK = wx.BRUSHSTYLE_STIPPLE_MASK wx.STIPPLE = wx.BRUSHSTYLE_STIPPLE wx.BDIAGONAL_HATCH = wx.BRUSHSTYLE_BDIAGONAL_HATCH wx.CROSSDIAG_HATCH = wx.BRUSHSTYLE_CROSSDIAG_HATCH wx.FDIAGONAL_HATCH = wx.BRUSHSTYLE_FDIAGONAL_HATCH wx.CROSS_HATCH = wx.BRUSHSTYLE_CROSS_HATCH wx.HORIZONTAL_HATCH = wx.BRUSHSTYLE_HORIZONTAL_HATCH wx.VERTICAL_HATCH = wx.BRUSHSTYLE_VERTICAL_HATCH embeddedimage.PyEmbeddedImage.getBitmap = embeddedimage.PyEmbeddedImage.GetBitmap def BitmapFromIcon(icon): bmp = wx.Bitmap() bmp.CopyFromIcon(icon) return bmp def IconFromBitmap(bmp): icon = wx.Icon() icon.CopyFromBitmap(bmp) return bmp wx.BitmapFromIcon = BitmapFromIcon wx.CursorFromImage = wx.Cursor wx.EmptyBitmap = wx.Bitmap wx.EmptyBitmapRGBA = (lambda width, height, red=0, green=0, blue=0, alpha=0: wx.Bitmap.FromRGBA(width, height, red, green, blue, alpha)) wx.EmptyIcon = wx.Icon wx.IconFromBitmap = wx.Icon wx.ImageFromStream = wx.Image wx.ListCtrl.InsertStringItem = lambda self, index, label: self.InsertItem(index, label) wx.ListCtrl.SetStringItem = lambda self, index, col, label: self.SetItem(index, col, label) wx.Menu.RemoveItem = lambda self, item: self.Remove(item) wx.NamedColour = wx.Colour wx.PyControl = wx.Control wx.PyWindow = wx.Window wx.PyPanel = wx.Panel wx.StockCursor = wx.Cursor wx.Window.SetToolTipString = wx.Window.SetToolTip # Moved items wx.HL_DEFAULT_STYLE = wx.adv.HL_DEFAULT_STYLE wx.HyperlinkCtrl = wx.adv.HyperlinkCtrl wx.HyperlinkCtrlNameStr = wx.adv.HyperlinkCtrlNameStr wx.SOUND_ASYNC = wx.adv.SOUND_ASYNC wx.Sound = wx.adv.Sound wx.wxEVT_TASKBAR_BALLOON_CLICK = wx.adv.wxEVT_TASKBAR_BALLOON_CLICK wx.wxEVT_TASKBAR_BALLOON_TIMEOUT = wx.adv.wxEVT_TASKBAR_BALLOON_TIMEOUT wx.wxEVT_TASKBAR_CLICK = wx.adv.wxEVT_TASKBAR_CLICK wx.wxEVT_TASKBAR_LEFT_DCLICK = wx.adv.wxEVT_TASKBAR_LEFT_DCLICK wx.wxEVT_TASKBAR_LEFT_DOWN = wx.adv.wxEVT_TASKBAR_LEFT_DOWN wx.wxEVT_TASKBAR_LEFT_UP = wx.adv.wxEVT_TASKBAR_LEFT_UP wx.wxEVT_TASKBAR_MOVE = wx.adv.wxEVT_TASKBAR_MOVE wx.wxEVT_TASKBAR_RIGHT_DOWN = wx.adv.wxEVT_TASKBAR_RIGHT_DOWN wx.wxEVT_TASKBAR_RIGHT_UP = wx.adv.wxEVT_TASKBAR_RIGHT_UP wx.wxEVT_TASKBAR_RIGHT_DCLICK = wx.adv.wxEVT_TASKBAR_RIGHT_DCLICK wx.EVT_TASKBAR_BALLOON_CLICK = wx.adv.EVT_TASKBAR_BALLOON_CLICK wx.EVT_TASKBAR_BALLOON_TIMEOUT = wx.adv.EVT_TASKBAR_BALLOON_TIMEOUT wx.EVT_TASKBAR_CLICK = wx.adv.EVT_TASKBAR_CLICK wx.EVT_TASKBAR_LEFT_DCLICK = wx.adv.EVT_TASKBAR_LEFT_DCLICK wx.EVT_TASKBAR_LEFT_DOWN = wx.adv.EVT_TASKBAR_LEFT_DOWN wx.EVT_TASKBAR_LEFT_UP = wx.adv.EVT_TASKBAR_LEFT_UP wx.EVT_TASKBAR_MOVE = wx.adv.EVT_TASKBAR_MOVE wx.EVT_TASKBAR_RIGHT_DOWN = wx.adv.EVT_TASKBAR_RIGHT_DOWN wx.EVT_TASKBAR_RIGHT_UP = wx.adv.EVT_TASKBAR_RIGHT_UP wx.EVT_TASKBAR_RIGHT_DCLICK = wx.adv.EVT_TASKBAR_RIGHT_DCLICK # Removed items wx.DC.BeginDrawing = lambda self: None wx.DC.DrawRectangleRect = lambda dc, rect: dc.DrawRectangle(rect) wx.DC.DrawRoundedRectangleRect = lambda dc, rect, radius: dc.DrawRoundedRectangle(rect, radius) wx.DC.EndDrawing = lambda self: None if not hasattr(wx.DC, "SetClippingRect"): wx.DC.SetClippingRect = lambda dc, rect: dc.SetClippingRegion(rect.x, rect.y, rect.width, rect.height) wx.IconBundle.AddIconFromFile = lambda file, type=wx.BITMAP_TYPE_ANY: wx.IconBundle.AddIcon(file, type) def ContainsRect(self, *args): if len(args) > 1: rect = wx.Rect(*args) else: rect = args[0] return self.Contains(rect) wx.Rect.ContainsRect = ContainsRect wx.Rect.ContainsXY = lambda self, x, y: self.Contains((x, y)) wx.RectPS = wx.Rect wx.RegionFromBitmap = wx.Region def GetItemIndex(self, window): for index, sizeritem in enumerate(self.Children): if sizeritem.Window == window: return index wx.Sizer.GetItemIndex = GetItemIndex wx.TopLevelWindow.Restore = lambda self: self.Iconize(False) # Renamed items wx.OPEN = wx.FD_OPEN wx.OVERWRITE_PROMPT = wx.FD_OVERWRITE_PROMPT wx.SAVE = wx.FD_SAVE wx.SystemSettings_GetColour = wx.SystemSettings.GetColour wx.SystemSettings_GetFont = wx.SystemSettings.GetFont wx.SystemSettings_GetMetric = wx.SystemSettings.GetMetric wx.grid.EVT_GRID_CELL_CHANGE = wx.grid.EVT_GRID_CELL_CHANGED if hasattr( wx.grid.Grid, "GridSelectRows"): # wxPython Phoenix 4.0.0a wx.grid.Grid.wxGridSelectRows = wx.grid.Grid.GridSelectRows else: # wxPython Phoenix 4.0.0b wx.grid.Grid.wxGridSelectRows = wx.grid.Grid.SelectRows wx.grid.PyGridCellEditor = wx.grid.GridCellEditor wx.grid.PyGridCellRenderer = wx.grid.GridCellRenderer wx.RegionFromBitmapColour = wx.Region # Bugfixes if not hasattr(wx.grid.GridEvent, "CmdDown"): # This may be a bug in the current development version of Phoenix wx.grid.GridEvent.CmdDown = lambda self: False # Not sure if this is a bug, but the PositionToXY signature differs from # current Phoenix docs. Actual return value is a 3-tuple, not a 2-tuple: # (bool inrange, int col, int line) PositionToXY = wx.TextCtrl.PositionToXY wx.TextCtrl.PositionToXY = lambda self, pos: PositionToXY(self, pos)[1:] def TabFrame__init__(self, parent): pre = wx.Window.__init__(self) self._tabs = None self._rect = wx.Rect(0, 0, 200, 200) self._tab_ctrl_height = 20 self._tab_rect = wx.Rect() self._parent = parent # With Phoenix, the TabFrame is unintentionally visible in the top left # corner (horizontal and vertical lines with a length of 20px each that # are lighter than the border color if tabs are at the top, or a # 20x20px square if tabs are at the bottom). Setting its size to 0, 0 # prevents this. Also see https://github.com/RobinD42/Phoenix/pull/91 self.Create(parent, size=(0, 0)) aui.TabFrame.__init__ = TabFrame__init__ wx._ListCtrl = wx.ListCtrl wx._SpinCtrl = wx.SpinCtrl wx._StaticText = wx.StaticText if "gtk3" in wx.PlatformInfo: # GTK3 fixes class wx_Panel(wx.Panel): # Fix panel background color not working under wxGTK3 def __init__(self, *args, **kwargs): if not args and hasattr(wx, "PreFrame"): pre = wx.PrePanel() self.PostCreate(pre) self.Bind(wx.EVT_WINDOW_CREATE, self.OnCreate) else: wx.Panel.__init__(self, *args, **kwargs) self.OnCreate(None) def OnCreate(self, event): self.Unbind(wx.EVT_WINDOW_CREATE) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) def OnEraseBackground(self, event): dc = event.GetDC() rect = self.GetClientRect() dc.SetClippingRect(rect) bgcolor = self.BackgroundColour dc.BeginDrawing() dc.SetBrush(wx.Brush(bgcolor, wx.SOLID)) dc.SetPen(wx.Pen(bgcolor, wx.SOLID)) dc.DrawRectangle(*rect) dc.EndDrawing() from wx import dataview DataViewListCtrl = dataview.DataViewListCtrl class ListCtrl(DataViewListCtrl): # Implement ListCtrl as DataViewListCtrl # Works around header rendering ugliness with GTK3 def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.LC_ICON, validator=wx.DefaultValidator, name=wx.ListCtrlNameStr): dv_style = 0 if style & wx.LC_SINGLE_SEL: dv_style |= dataview.DV_SINGLE DataViewListCtrl.__init__(self, parent, id, pos, size, dv_style, validator) self.Name = name self._columns = {} self._items = {} self.Bind(dataview.EVT_DATAVIEW_SELECTION_CHANGED, self.OnEvent) self.Bind(dataview.EVT_DATAVIEW_ITEM_ACTIVATED, self.OnEvent) def OnEvent(self, event): typeId = event.GetEventType() if typeId == dataview.EVT_DATAVIEW_SELECTION_CHANGED.typeId: if self.GetSelectedRow() != wx.NOT_FOUND: typeId = wx.EVT_LIST_ITEM_SELECTED.typeId else: typeId = wx.EVT_LIST_ITEM_DESELECTED.typeId event = wx.ListEvent(typeId, self.Id) elif typeId == dataview.EVT_DATAVIEW_ITEM_ACTIVATED.typeId: event = wx.ListEvent(wx.EVT_LIST_ITEM_ACTIVATED.typeId, self.Id) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) def InsertColumn(self, pos, col): self._columns[pos] = col def SetColumnWidth(self, pos, width): self.AppendTextColumn(self._columns[pos], width=width) def InsertStringItem(self, row, label): self._items[row] = [] return row def SetStringItem(self, row, col, label): self._items[row].append(label) if len(self._items[row]) == len(self._columns): # Row complete DataViewListCtrl.InsertItem(self, row, self._items[row]) def GetItem(self, row, col=0): item = self.RowToItem(row) item.GetId = lambda: row item.GetText = lambda: self.GetTextValue(row, col) return item def SetItemState(self, row, state, stateMask): if state == stateMask == wx.LIST_STATE_SELECTED: self.SelectRow(row) else: raise NotImplementedError("SetItemState is only implemented for " "selecting a single row") def GetNextItem(self, row, geometry=wx.LIST_NEXT_ALL, state=wx.LIST_STATE_DONTCARE): if (row == -1 and geometry == wx.LIST_NEXT_ALL and state == wx.LIST_STATE_SELECTED): return self.GetSelectedRow() else: raise NotImplementedError("GetNextItem is only implemented for " "returning the selected row") def GetItemCount(self): return len(self._items) GetFirstSelected = DataViewListCtrl.__dict__["GetSelectedRow"] def GetItemState(self, row, stateMask): if stateMask == wx.LIST_STATE_SELECTED: if self.GetSelectedRow() == row: return wx.LIST_STATE_SELECTED else: return 0 else: raise NotImplementedError("GetItemState is only implemented to " "check if a row is selected") def Select(self, row, on=1): if on: self.SelectRow(row) else: self.UnselectRow(row) wx.ListCtrl = ListCtrl class SpinCtrl(wx._SpinCtrl): _spinwidth = 0 def __init__(self, parent, id=wx.ID_ANY, value="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.SP_ARROW_KEYS, min=0, max=100, initial=0, name="wxSpinCtrl"): if size[0] != -1: # Adjust initial size for GTK3 to accomodate spin buttons if not SpinCtrl._spinwidth: spin = wx.SpinCtrl(parent, -1) text = wx.TextCtrl(parent, -1) SpinCtrl._spinwidth = spin.Size[0] - text.Size[0] + 11 spin.Destroy() text.Destroy() size = size[0] + SpinCtrl._spinwidth, size[1] wx._SpinCtrl.__init__(self, parent, id, value, pos, size, style, min, max, initial, name) wx.SpinCtrl = SpinCtrl _StaticText_SetLabel = wx._StaticText.SetLabel class StaticText(wx._StaticText): def __init__(self, *args, **kwargs): wx._StaticText.__init__(self, *args, **kwargs) def SetFont(self, font): wx.Control.SetFont(self, font) self.SetLabel(self.Label) def SetLabel(self, label): # Fix GTK3 label auto-resize on label change not working if not self.WindowStyle & wx.ST_NO_AUTORESIZE: self.MaxSize = -1, -1 self.MinSize = -1, -1 _StaticText_SetLabel(self, label) if not self.WindowStyle & wx.ST_NO_AUTORESIZE: # Find widest line max_width = 0 for line in label.splitlines(): width = self.GetTextExtent(line)[0] if width > max_width: max_width = width self.Size = max_width, -1 self.MaxSize = self.Size[0], -1 def Wrap(self, width): wx._StaticText.Wrap(self, width) self.SetLabel(self.Label) Label = property(lambda self: self.GetLabel(), SetLabel) wx.StaticText = StaticText else: wx_Panel = wx.Panel def Property(func): return property(**func()) wx.BitmapButton._SetBitmapLabel = wx.BitmapButton.SetBitmapLabel def SetBitmapLabel(self, bitmap): """ Replacement for SetBitmapLabel which avoids flickering """ if self.GetBitmapLabel() != bitmap: self._SetBitmapLabel(bitmap) wx.BitmapButton.SetBitmapLabel = SetBitmapLabel def BitmapButtonEnable(self, enable = True): """ Replacement for BitmapButton.Enable which circumvents repainting issues (bitmap does not change on button state change) """ wx.Button.Enable(self, enable) if not hasattr(self, "_bitmaplabel"): self._bitmaplabel = self.GetBitmapLabel() if not hasattr(self, "_bitmapdisabled"): self._bitmapdisabled = self.GetBitmapDisabled() if enable: if self._bitmaplabel.IsOk(): self.SetBitmapLabel(self._bitmaplabel) else: if self._bitmapdisabled.IsOk(): self.SetBitmapLabel(self._bitmapdisabled) def BitmapButtonDisable(self): """ Replacement for BitmapButton.Disable which circumvents repainting issues (bitmap does not change on button state change) """ self.Enable(False) if not u"phoenix" in wx.PlatformInfo: wx.BitmapButton.Enable = BitmapButtonEnable wx.BitmapButton.Disable = BitmapButtonDisable def FindMenuItem(self, label): """ Replacement for wx.Menu.FindItem """ label = GTKMenuItemGetFixedLabel(label) for menuitem in self.GetMenuItems(): if GTKMenuItemGetFixedLabel(menuitem.Label) == label: return menuitem.GetId() wx.Menu.FindItem = FindMenuItem def GTKMenuItemGetFixedLabel(label): if sys.platform not in ("darwin", "win32"): # The underscore is a special character under GTK, like the # ampersand on Mac OS X and Windows # Recent wxPython versions already do the right thing, but we need # this workaround for older releases if "__" in label: label = label.replace("__", "_") while label and label[0] == "_": label = label[1:] return label if not hasattr(wx.Sizer, "GetItemIndex"): def GetItemIndex(self, item): for i, child in enumerate(self.GetChildren()): if child.GetWindow() is item: return i return -1 wx.Sizer.GetItemIndex = GetItemIndex if sys.platform == "darwin": # wxMac seems to loose foreground color of StaticText # when enabled again @Property def StaticTextEnabled(): def fget(self): return self.IsEnabled() def fset(self, enable=True): self.Enable(enable) return locals() wx.StaticText.Enabled = StaticTextEnabled def StaticTextDisable(self): self.Enable(False) wx.StaticText.Disable = StaticTextDisable def StaticTextEnable(self, enable=True): enable = bool(enable) if self.Enabled is enable: return self._enabled = enable if not hasattr(self, "_fgcolor"): self._fgcolor = self.ForegroundColour color = self._fgcolor if not enable: bgcolor = self.Parent.BackgroundColour bgblend = .5 blend = .5 color = wx.Colour(int(round(bgblend * bgcolor.Red() + blend * color.Red())), int(round(bgblend * bgcolor.Green() + blend * color.Green())), int(round(bgblend * bgcolor.Blue() + blend * color.Blue()))) self.ForegroundColour = color wx.StaticText.Enable = StaticTextEnable def StaticTextIsEnabled(self): return getattr(self, "_enabled", True) wx.StaticText.IsEnabled = StaticTextIsEnabled wx.Window._SetToolTipString = wx.Window.SetToolTipString def SetToolTipString(self, string): """ Replacement for SetToolTipString which updates correctly """ wx.Window.SetToolTip(self, None) wx.Window._SetToolTipString(self, string) wx.Window.SetToolTipString = SetToolTipString wx._Sizer = wx.Sizer class Sizer(wx._Sizer): def Add(self, *args, **kwargs): from config import get_default_dpi, getcfg scale = getcfg("app.dpi") / get_default_dpi() if isinstance(args[0], int): args = list(args) index = args.pop(0) args = tuple(args) else: index = None if scale > 1: if kwargs.get("border"): kwargs["border"] = int(round(kwargs["border"] * scale)) if args and isinstance(args[0], tuple): spacer = list(args[0]) ##print spacer, '->', for i, dimension in enumerate(spacer): if dimension > 0: spacer[i] = int(round(dimension * scale)) ##print spacer args = (tuple(spacer), ) + args[1:] if index is None: return wx._Sizer.Add(self, *args, **kwargs) else: return wx._Sizer.Insert(self, index, *args, **kwargs) Insert = Add wx.Sizer = Sizer wx._BoxSizer = wx.BoxSizer class BoxSizer(wx._BoxSizer): Add = Sizer.__dict__["Add"] Insert = Add wx.BoxSizer = BoxSizer wx._GridSizer = wx.GridSizer class GridSizer(wx._GridSizer): def __init__(self, rows=0, cols=0, vgap=0, hgap=0): if vgap or hgap: from config import get_default_dpi, getcfg scale = getcfg("app.dpi") / get_default_dpi() if scale > 1: ##print vgap, hgap, '->', vgap, hgap = [int(round(v * scale)) for v in (vgap, hgap)] ##print vgap, hgap super(GridSizer, self).__init__(rows, cols, vgap, hgap) Add = Sizer.__dict__["Add"] Insert = Add wx.GridSizer = GridSizer wx._FlexGridSizer = wx.FlexGridSizer class FlexGridSizer(wx._FlexGridSizer): def __init__(self, rows=0, cols=0, vgap=0, hgap=0): if vgap or hgap: from config import get_default_dpi, getcfg scale = getcfg("app.dpi") / get_default_dpi() if scale > 1: ##print vgap, hgap, '->', vgap, hgap = [int(round(v * scale)) for v in (vgap, hgap)] ##print vgap, hgap super(FlexGridSizer, self).__init__(rows, cols, vgap, hgap) Add = Sizer.__dict__["Add"] Insert = Add wx.FlexGridSizer = FlexGridSizer def GridGetSelection(self): """ Return selected rows, cols, block and cells """ sel = [] numrows = self.GetNumberRows() numcols = self.GetNumberCols() # rows rows = self.GetSelectedRows() for row in rows: for i in xrange(numcols): sel.append((row, i)) # cols cols = self.GetSelectedCols() for col in cols: for i in xrange(numrows): sel.append((i, col)) # block tl = self.GetSelectionBlockTopLeft() br = self.GetSelectionBlockBottomRight() if tl and br: for n in xrange(min(len(tl), len(br))): for i in xrange(tl[n][0], br[n][0] + 1): # rows for j in xrange(tl[n][1], br[n][1] + 1): # cols sel.append((i, j)) # single selected cells sel.extend(self.GetSelectedCells()) sel = list(set(sel)) sel.sort() return sel wx.grid.Grid.GetSelection = GridGetSelection def adjust_font_size_for_gcdc(font): font.SetPointSize(get_gcdc_font_size(font.PointSize)) return font def get_dc_font_scale(dc): """ Get correct font scaling factor for DC """ pointsize = (1.0, 1.0) if isinstance(dc, wx.GCDC): pointsize = tuple(1.0 / scale for scale in dc.GetLogicalScale()) if sys.platform in ("darwin", "win32") or (not isinstance(dc, wx.GCDC) and not "gtk3" in wx.PlatformInfo): return sum(pointsize) / 2.0 else: # On Linux, we need to correct the font size by a certain factor if # wx.GCDC is used, to make text the same size as if wx.GCDC weren't used from config import get_default_dpi, getcfg, set_default_app_dpi set_default_app_dpi() scale = getcfg("app.dpi") / get_default_dpi() if wx.VERSION < (2, 9): # On Linux, we need to correct the font size by a certain factor if # wx.GCDC is used, to make text the same size as if wx.GCDC weren't used screenppi = map(float, wx.ScreenDC().GetPPI()) ppi = dc.GetPPI() scale *= (screenppi[0] / ppi[0] + screenppi[1] / ppi[1]) / 2.0 return (scale * pointsize[0] + scale * pointsize[1]) / 2.0 def get_dc_font_size(size, dc): """ Get correct font size for DC """ return size * get_dc_font_scale(dc) def get_gcdc_font_size(size): dc = wx.MemoryDC(wx.EmptyBitmap(1, 1)) try: dc = wx.GCDC(dc) except: pass return get_dc_font_size(size, dc) def get_bitmap_disabled(bitmap): # Use Rec. 709 luma coefficients to convert to grayscale image = bitmap.ConvertToImage().ConvertToGreyscale(.2126, .7152, .0722) if image.HasMask() and not image.HasAlpha(): image.InitAlpha() if image.HasAlpha(): alphabuffer = image.GetAlphaBuffer() for i, byte in enumerate(alphabuffer): if byte > "\0": alphabuffer[i] = chr(int(round(ord(byte) * .3))) return image.ConvertToBitmap() def get_bitmap_hover(bitmap, ctrl=None): image = bitmap.ConvertToImage() if image.HasMask() and not image.HasAlpha(): image.InitAlpha() if sys.platform == "darwin": color = [44, 93, 205] # Use Mavericks-like color scheme else: color = list(wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT)[:3]) R = color[0] / 255.0 G = color[1] / 255.0 B = color[2] / 255.0 # Assume Rec. 709 gamma 2.2 to determine rel. luminance lum = .2126 * R ** 2.2 + .7152 * G ** 2.2 + .0722 * B ** 2.2 is_bw = image.IsBW() if ctrl: bgcolor = ctrl.Parent.BackgroundColour if is_bw: # Adjust hilight color by background color if luminance difference # is below threshhold R = bgcolor[0] / 255.0 G = bgcolor[1] / 255.0 B = bgcolor[2] / 255.0 # Assume Rec. 709 gamma 2.2 to determine rel. luminance bglum = .2126 * R ** 2.2 + .7152 * G ** 2.2 + .0722 * B ** 2.2 lumdiff = (max(lum, bglum) - min(lum, bglum)) ** (1 / 2.2) if lumdiff < 1.0 / 3.0: if lum > bglum: newmin = bglum ** (1 / 2.2) * 255 newmax = 255 else: newmin = 0 newmax = bglum ** (1 / 2.2) * 153 # 60% for i, v in enumerate(color): color[i] = int(round(convert_range(v, 0, 255, newmin, newmax))) databuffer = image.GetDataBuffer() alphabuffer = image.GetAlphaBuffer() minv = 256 # Intentionally above max possible value j = 0 RGB = {} for i, byte in enumerate(databuffer): RGB[i % 3] = ord(byte) if i % 3 == 2: RGBv = RGB.values() if not is_bw: RGBv_max = max(RGBv) if minv == 256 and alphabuffer[j] > "\x20": # If a pixel is at least 12.5% opaque, check if it's value # is less than or equal the previously seen minimum pixel # value as a crude means to determine if the graphic # contains a black outline. minv = min(RGBv_max, minv) for k in xrange(3): if is_bw: v = color[k] else: v = RGB[k] if minv > 0 and min(RGBv) != RGBv_max: # If the minimum seen at least 12.5% opaque pixel value # is above zero, assume a graphic without black outline # and adjust intensity by applying a power. The hilight # color isn't used. v = (v / 255.0) ** 0.8 * 255 else: # If the minimum seen at least 12.5% opaque pixel value # is zero, adjust value by hilight color value, so that # graphics with a black outline get the hilight color # at black. v = convert_range(v, 0, 255, color[k], 255) v = int(round(v)) databuffer[i - 2 + k] = chr(v) j += 1 if isinstance(ctrl, wx.BitmapButton) and sys.platform == "win32": # wx.BitmapButton draws the focus bitmap over the normal bitmap, # leading to ugly aliased edges. Yuck. Prevent this by setting the # background to the control's background color instead of transparent. bmp = wx.EmptyBitmap(image.Width, image.Height) dc = wx.MemoryDC() dc.SelectObject(bmp) dc.SetBrush(wx.Brush(bgcolor)) dc.SetPen(wx.Pen(bgcolor, width=0)) dc.DrawRectangle(0, 0, image.Width, image.Height) dc.DrawBitmap(image.ConvertToBitmap(), 0, 0, True) dc.SelectObject(wx.NullBitmap) else: bmp = image.ConvertToBitmap() return bmp def get_bitmap_pressed(bitmap): image = bitmap.ConvertToImage() if image.HasMask() and not image.HasAlpha(): image.InitAlpha() databuffer = image.GetDataBuffer() for i, byte in enumerate(databuffer): if byte > "\0": databuffer[i] = chr(int(round(ord(byte) * .85))) return image.ConvertToBitmap() def get_bitmap_focus(bitmap): image = bitmap.ConvertToImage() if image.HasMask() and not image.HasAlpha(): image.InitAlpha() databuffer = image.GetDataBuffer() for i, byte in enumerate(databuffer): if byte > "\0": databuffer[i] = chr(int(round((ord(byte) / 255.0) ** 0.8 * 255))) return image.ConvertToBitmap() def set_bitmap_labels(btn, disabled=True, focus=None, pressed=True): bitmap = btn.BitmapLabel if not bitmap.IsOk(): size = btn.MinSize if -1 in size: size = (16, 16) bitmap = wx.ArtProvider.GetBitmap(wx.ART_MISSING_IMAGE, size=size) # Disabled if disabled: btn.SetBitmapDisabled(get_bitmap_disabled(bitmap)) # Focus/Hover if sys.platform != "darwin" and focus is not False: # wxMac applies hover state also to disabled buttons... if focus is None: # Use hover bitmap bmp = get_bitmap_hover(bitmap, btn) else: # Use focus bitmap bmp = get_bitmap_focus(bitmap) btn.SetBitmapFocus(bmp) if hasattr(btn, "SetBitmapCurrent"): # Phoenix btn.SetBitmapCurrent(bmp) else: # Classic btn.SetBitmapHover(bmp) # Selected if pressed: if sys.platform == "darwin": bmp = get_bitmap_hover(bitmap, btn) elif focus is False: bmp = get_bitmap_pressed(bitmap) if hasattr(btn, "SetBitmapPressed"): # Phoenix btn.SetBitmapPressed(bmp) else: # Classic btn.SetBitmapSelected(bmp) # wx.DirDialog and wx.FileDialog are normally not returned by # wx.GetTopLevelWindows, do some trickery to work around _DirDialog = wx.DirDialog _FileDialog = wx.FileDialog class PathDialogBase(wx.Dialog): def __init__(self, name): wx.Dialog.__init__(self, None, -1, name=name) self._ismodal = False self._isshown = False self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy) def __getattr__(self, name): return getattr(self.filedialog, name) def IsModal(self): return self._ismodal def IsShown(self): return self._isshown def OnDestroy(self, event): self.filedialog.Destroy() event.Skip() def Show(self, show=True): self._isshown = show self.filedialog.Show(show) def ShowModal(self): self._isshown = True self._ismodal = True returncode = self.filedialog.ShowModal() self._ismodal = False self._isshown = False return returncode class DirDialog(PathDialogBase): def __init__(self, *args, **kwargs): PathDialogBase.__init__(self, name="dirdialog") self.filedialog = _DirDialog(*args, **kwargs) class FileDialog(PathDialogBase): def __init__(self, *args, **kwargs): PathDialogBase.__init__(self, name="filedialog") self.filedialog = _FileDialog(*args, **kwargs) wx.DirDialog = DirDialog wx.FileDialog = FileDialog wx._ScrolledWindow = wx.ScrolledWindow class ScrolledWindow(wx._ScrolledWindow): """ ScrolledWindow that scrolls child controls into view on focus. OnChildFocus and ScrollChildIntoView borrowed from wx.lib.scrolledpanel. """ def __init__(self, *args, **kwargs): wx._ScrolledWindow.__init__(self, *args, **kwargs) self.Bind(wx.EVT_CHILD_FOCUS, self.OnChildFocus) def OnChildFocus(self, evt): # If the child window that gets the focus is not visible, # this handler will try to scroll enough to see it. evt.Skip() child = evt.GetWindow() self.ScrollChildIntoView(child) def ScrollChildIntoView(self, child): """ Scrolls the panel such that the specified child window is in view. """ sppu_x, sppu_y = self.GetScrollPixelsPerUnit() vs_x, vs_y = self.GetViewStart() cr = child.GetRect() clntsz = self.GetClientSize() new_vs_x, new_vs_y = -1, -1 # is it before the left edge? if cr.x < 0 and sppu_x > 0: new_vs_x = vs_x + (cr.x / sppu_x) # is it above the top? if cr.y < 0 and sppu_y > 0: new_vs_y = vs_y + (cr.y / sppu_y) # For the right and bottom edges, scroll enough to show the # whole control if possible, but if not just scroll such that # the top/left edges are still visible # is it past the right edge ? if cr.right > clntsz.width and sppu_x > 0: diff = (cr.right - clntsz.width) / sppu_x if cr.x - diff * sppu_x > 0: new_vs_x = vs_x + diff + 1 else: new_vs_x = vs_x + (cr.x / sppu_x) # is it below the bottom ? if cr.bottom > clntsz.height and sppu_y > 0: diff = (cr.bottom - clntsz.height) / sppu_y if cr.y - diff * sppu_y > 0: new_vs_y = vs_y + diff + 1 else: new_vs_y = vs_y + (cr.y / sppu_y) # if we need to adjust if new_vs_x != -1 or new_vs_y != -1: #print "%s: (%s, %s)" % (self.GetName(), new_vs_x, new_vs_y) self.Scroll(new_vs_x, new_vs_y) wx.ScrolledWindow = ScrolledWindow class GenButton(object): """ A generic button, based on wx.lib.buttons.GenButton. Fixes wx.lib.buttons.ThemedGenButton not taking into account backgroun color when pressed. """ def __init__(self): self.bezelWidth = 2 self.hasFocus = False self.up = True self.useFocusInd = True def OnPaint(self, event): (width, height) = self.ClientSize x1 = y1 = 0 x2 = width y2 = height dc = wx.PaintDC(self) brush = self.GetBackgroundBrush(dc) if brush is not None: brush.SetColour(self.Parent.BackgroundColour) dc.SetBackground(brush) dc.Clear() self.DrawBezel(dc, x1, y1, x2, y2) self.DrawLabel(dc, width, height) if self.hasFocus and self.useFocusInd: self.DrawFocusIndicator(dc, width, height) if not "gtk3" in wx.PlatformInfo: # GTK3 doesn't respect NO_BORDER in hovered state when using wx.BitmapButton _GenBitmapButton = wx.BitmapButton class GenBitmapButton(GenButton, _GenBitmapButton): def __init__(self, *args, **kwargs): GenButton.__init__(self) _GenBitmapButton.__init__(self, *args, **kwargs) self.hover = False set_bitmap_labels(self) if _GenBitmapButton is not wx.BitmapButton: self.Bind(wx.EVT_ENTER_WINDOW, self.OnMouseEnter) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeave) @Property def BitmapFocus(): def fget(self): return self.GetBitmapFocus() def fset(self, bitmap): self.SetBitmapFocus(self, bitmap) return locals() @Property def BitmapDisabled(): def fget(self): return self.GetBitmapDisabled() def fset(self, bitmap): self.SetBitmapDisabled(self, bitmap) return locals() @Property def BitmapHover(): def fget(self): return self.GetBitmapHover() def fset(self, bitmap): self.SetBitmapHover(self, bitmap) return locals() @Property def BitmapSelected(): def fget(self): return self.GetBitmapSelected() def fset(self, bitmap): self.SetBitmapSelected(self, bitmap) return locals() @Property def BitmapLabel(): def fget(self): return self.GetBitmapLabel() def fset(self, bitmap): self.SetBitmapLabel(self, bitmap) return locals() def DrawLabel(self, dc, width, height, dx=0, dy=0): bmp = self.BitmapLabel if self.BitmapDisabled and not self.IsEnabled(): bmp = self.BitmapDisabled elif self.BitmapSelected and not self.up: bmp = self.BitmapSelected elif self.BitmapHover and self.hover: bmp = self.BitmapHover elif self.BitmapFocus and self.hasFocus: bmp = self.BitmapFocus bw, bh = bmp.GetWidth(), bmp.GetHeight() hasMask = bmp.GetMask() != None dc.DrawBitmap(bmp, (width-bw)/2+dx, (height-bh)/2+dy, hasMask) def GetBitmapHover(self): return self.bmpHover def OnMouseEnter(self, event): if not self.IsEnabled(): return if not self.hover: self.hover = True self.Refresh() event.Skip() def OnMouseLeave(self, event): if not self.IsEnabled(): return if self.hover: self.hover = False self.Refresh() event.Skip() def SetBitmapHover(self, bitmap): self.bmpHover = bitmap class ThemedGenButton(GenButton, _ThemedGenButton): """ A themed generic button, based on wx.lib.buttons.ThemedGenButton. Fixes wx.lib.buttons.ThemedGenButton sometimes not reflecting enabled state correctly as well as not taking into account background color when pressed, and mimics a default button under Windows more closely by not drawing a focus outline and not shifting the label when pressed. Also implements state for SetDefault. """ _reallyenabled = True labelDelta = 1 def __init__(self, *args, **kwargs): GenButton.__init__(self) _ThemedGenButton.__init__(self, *args, **kwargs) self._default = False def Disable(self): self.Enable(False) def DoGetBestSize(self): """ Overridden base class virtual. Determines the best size of the button based on the label and bezel size. """ w, h, useMin = self._GetLabelSize() if self.style & wx.BU_EXACTFIT: width = w + 2 + 2 * self.bezelWidth + 4 * int(self.useFocusInd) height = h + 2 + 2 * self.bezelWidth + 4 * int(self.useFocusInd) else: defSize = wx.Button.GetDefaultSize() width = 12 + w if useMin and width < defSize.width: width = defSize.width height = 11 + h if useMin and height < defSize.height: height = defSize.height width = width + self.bezelWidth - 2 height = height + self.bezelWidth - 2 return (width, height) def DrawBezel(self, dc, x1, y1, x2, y2): rect = wx.Rect(x1, y1, x2, y2) if self.up: state = 0 else: state = wx.CONTROL_PRESSED | wx.CONTROL_SELECTED if not self.IsEnabled(): state = wx.CONTROL_DISABLED elif self._default: state |= wx.CONTROL_ISDEFAULT pt = self.ScreenToClient(wx.GetMousePosition()) if self.GetClientRect().Contains(pt): state |= wx.CONTROL_CURRENT wx.RendererNative.Get().DrawPushButton(self, dc, rect, state) def DrawLabel(self, dc, width, height, dx=0, dy=0): dc.SetFont(self.GetFont()) if self.Enabled: dc.SetTextForeground(self.ForegroundColour) else: dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) label = self.Label tw, th = dc.GetTextExtent(label) if sys.platform != "win32" and not self.up: dx = dy = self.labelDelta dc.DrawText(label, (width-tw)/2+dx, (height-th)/2+dy) def Enable(self, enable=True): if enable != self.Enabled: self.Enabled = enable wx.PyControl.Enable(self, enable) self.Refresh() @Property def Enabled(): def fget(self): return self._reallyenabled def fset(self, enabled): self._reallyenabled = enabled return locals() def IsEnabled(self): return self.Enabled def OnLeftDown(self, event): if not self.Enabled: return self.up = False self.CaptureMouse() self.SetFocus() self.useFocusInd = False self.Refresh() event.Skip() def OnGainFocus(self, event): self.hasFocus = True self.useFocusInd = bool(self.bezelWidth) self.Refresh() self.Update() def SetDefault(self): self._default = True _ThemedGenButton.SetDefault(self) class PlateButton(platebtn.PlateButton): """ Fixes wx.lib.platebtn.PlateButton sometimes not reflecting enabled state correctly aswelll as other quirks """ _reallyenabled = True def __init__(self, *args, **kwargs): platebtn.PlateButton.__init__(self, *args, **kwargs) self.Unbind(wx.EVT_LEAVE_WINDOW) self.Bind(wx.EVT_LEAVE_WINDOW, lambda evt: wx.CallLater(80, self.__LeaveWindow)) def DoGetBestSize(self): """Calculate the best size of the button :return: :class:`Size` """ # A liitle more padding left + right width = 24 height = 6 if self.Label: # NOTE: Should measure with a GraphicsContext to get right # size, but due to random segfaults on linux special # handling is done in the drawing instead... lsize = self.GetFullTextExtent(self.Label) width += lsize[0] height += lsize[1] if self._bmp['enable'] is not None: bsize = self._bmp['enable'].Size width += (bsize[0] + 10) if height <= bsize[1]: height = bsize[1] + 6 else: height += 3 else: width += 10 if self._menu is not None or self._style & platebtn.PB_STYLE_DROPARROW: width += 12 best = wx.Size(width, height) self.CacheBestSize(best) return best def GetBitmapLabel(self): """Get the label bitmap :return: :class:`Bitmap` or None """ return self._bmp["enable"] def __DrawBitmap(self, gc): """Draw the bitmap if one has been set :param GCDC `gc`: :class:`GCDC` to draw with :return: x cordinate to draw text at """ if self.IsEnabled(): bmp = self._bmp['enable'] else: bmp = self._bmp['disable'] xpos = 12 if bmp is not None and bmp.IsOk(): bw, bh = bmp.GetSize() ypos = (self.GetSize()[1] - bh) // 2 gc.DrawBitmap(bmp, xpos, ypos, bmp.GetMask() != None) return bw + xpos else: return xpos def __DrawButton(self): """Draw the button""" # TODO using a buffered paintdc on windows with the nobg style # causes lots of weird drawing. So currently the use of a # buffered dc is dissabled for this style. if platebtn.PB_STYLE_NOBG & self._style: dc = wx.PaintDC(self) else: dc = wx.AutoBufferedPaintDCFactory(self) dc.SetBackground(wx.Brush(self.Parent.BackgroundColour)) dc.Clear() gc = wx.GCDC(dc) # Setup gc.SetFont(adjust_font_size_for_gcdc(self.GetFont())) gc.SetBackgroundMode(wx.TRANSPARENT) # Calc Object Positions width, height = self.GetSize() # XXX: Using self.GetTextextent instead of gc.GetTextExtent # seems to fix sporadic segfaults with wxPython Phoenix under Windows. # TODO: Figure out why this is the case. tw, th = self.GetTextExtent(self.Label) txt_y = max((height - th) // 2, 1) # The background needs some help to look transparent on # on Gtk and Windows if wx.Platform in ['__WXGTK__', '__WXMSW__']: gc.SetBrush(self.GetBackgroundBrush(gc)) gc.SetPen(wx.TRANSPARENT_PEN) gc.DrawRectangle(0, 0, width, height) gc.SetBrush(wx.TRANSPARENT_BRUSH) if self._state['cur'] == platebtn.PLATE_HIGHLIGHT and self.IsEnabled(): gc.SetTextForeground(self._color['htxt']) gc.SetPen(wx.TRANSPARENT_PEN) self.__DrawHighlight(gc, width, height) elif self._state['cur'] == platebtn.PLATE_PRESSED and self.IsEnabled(): gc.SetTextForeground(self._color['htxt']) pen = wx.Pen(platebtn.AdjustColour(self._color['press'], -80, 220), 1) gc.SetPen(pen) self.__DrawHighlight(gc, width, height) txt_x = self.__DrawBitmap(gc) t_x = max((width - tw - (txt_x + 8)) // 2, txt_x + 8) gc.DrawText(self.Label, t_x, txt_y) self.__DrawDropArrow(gc, width - 10, (height // 2) - 2) else: if self.IsEnabled(): gc.SetTextForeground(self.GetForegroundColour()) else: txt_c = wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT) gc.SetTextForeground(txt_c) # Draw bitmap and text if self._state['cur'] != platebtn.PLATE_PRESSED or not self.IsEnabled(): txt_x = self.__DrawBitmap(gc) t_x = max((width - tw - (txt_x + 8)) // 2, txt_x + 8) gc.DrawText(self.Label, t_x, txt_y) self.__DrawDropArrow(gc, width - 10, (height // 2) - 2) def __LeaveWindow(self): """Handle updating the buttons state when the mouse cursor leaves""" if (self._style & platebtn.PB_STYLE_TOGGLE) and self._pressed: self._SetState(platebtn.PLATE_PRESSED) else: self._SetState(platebtn.PLATE_NORMAL) self._pressed = False def __PostEvent(self): """Post a button event to parent of this control""" if self._style & platebtn.PB_STYLE_TOGGLE: etype = wx.wxEVT_COMMAND_TOGGLEBUTTON_CLICKED else: etype = wx.wxEVT_COMMAND_BUTTON_CLICKED bevt = wx.CommandEvent(etype, self.GetId()) bevt.SetEventObject(self) bevt.SetString(self.GetLabel()) self.GetEventHandler().ProcessEvent(bevt) _PostEvent = __PostEvent def Update(self): pass Disable = ThemedGenButton.__dict__["Disable"] Enable = ThemedGenButton.__dict__["Enable"] Enabled = ThemedGenButton.__dict__["Enabled"] IsEnabled = ThemedGenButton.__dict__["IsEnabled"] Label = property(lambda self: self.GetLabel(), lambda self, label: self.SetLabel(label)) if not hasattr(PlateButton, "_SetState"): PlateButton._SetState = PlateButton.SetState class TempXmlResource(object): _temp = None def __init__(self, xmlpath): from config import get_default_dpi, getcfg scale = getcfg("app.dpi") / get_default_dpi() if scale > 1 or "gtk3" in wx.PlatformInfo: if not TempXmlResource._temp: try: TempXmlResource._temp = tempfile.mkdtemp(prefix=appname + u"-XRC-") except: pass if TempXmlResource._temp and os.path.isdir(TempXmlResource._temp): # Read original XML with open(xmlpath, "rb") as xmlfile: xml = xmlfile.read() # Adjust spacing for scale for tag in ("border", "hgap", "vgap"): xml = re.sub(r"<%s>(\d+)" % (tag, tag), lambda match: "<%s>%i" % (tag, round(int(match.group(1)) * scale), tag), xml) for tag in ("size", ): xml = re.sub(r"<%s>(-?\d+)\s*,\s*(-?\d+)" % (tag, tag), lambda match: "<%s>%i,%i" % ((tag, ) + tuple(round(int(v) * scale) if int(v) > 0 else int(v) for v in match.groups()) + (tag, )), xml) # Set relative paths to absolute basedir = os.path.dirname(os.path.dirname(xmlpath)) basedir = basedir.replace("\\", "/") xml = xml.replace(">../", ">%s/" % safe_str(basedir, "UTF-8")) # Fix background color not working for panels under wxGTK3 if "gtk3" in wx.PlatformInfo: xml = xml.replace('class="wxPanel"', 'class="wxPanel" subclass="DisplayCAL.wxfixes.wx_Panel"') # Write modified XML xmlpath = os.path.join(TempXmlResource._temp, os.path.basename(xmlpath)) with open(xmlpath, "wb") as xmlfile: xmlfile.write(xml) from wxwindows import BaseApp BaseApp.register_exitfunc(self._cleanup) self.xmlpath = xmlpath self.res = xrc.XmlResource(xmlpath) def _cleanup(self): if (TempXmlResource._temp and self.xmlpath.startswith(TempXmlResource._temp + os.path.sep) and os.path.isfile(self.xmlpath)): os.remove(self.xmlpath) if not os.listdir(TempXmlResource._temp): shutil.rmtree(TempXmlResource._temp) def __getattr__(self, name): return getattr(self.res, name) class ThemedGenBitmapTextButton(ThemedGenButton, _GenBitmapTextButton): """A themed generic bitmapped button with text label""" def __init__(self, parent, id=-1, bitmap=wx.NullBitmap, label='', pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, validator=wx.DefaultValidator, name="genbutton"): GenButton.__init__(self) _GenBitmapTextButton.__init__(self, parent, id, bitmap, label, pos, size, style, validator, name) self._default = False def DrawLabel(self, dc, width, height, dx=0, dy=0): bmp = self.bmpLabel if bmp is not None: # if the bitmap is used if self.bmpDisabled and not self.IsEnabled(): bmp = self.bmpDisabled if self.bmpFocus and self.hasFocus: bmp = self.bmpFocus if self.bmpSelected and not self.up: bmp = self.bmpSelected bw,bh = bmp.GetWidth(), bmp.GetHeight() if sys.platform != "win32" and not self.up: dx = dy = self.labelDelta hasMask = bmp.GetMask() is not None else: bw = bh = 0 # no bitmap -> size is zero dc.SetFont(self.GetFont()) if self.IsEnabled(): dc.SetTextForeground(self.GetForegroundColour()) else: dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) label = self.GetLabel() tw, th = dc.GetTextExtent(label) # size of text sw, sh = dc.GetTextExtent(" ") # extra spacing from bitmap if sys.platform != "win32" and not self.up: dx = dy = self.labelDelta pos_x = (width-bw-sw-tw)/2+dx # adjust for bitmap and text to centre if bmp is not None: dc.DrawBitmap(bmp, pos_x, (height-bh)/2+dy, hasMask) # draw bitmap if available pos_x = pos_x + sw # extra spacing from bitmap dc.DrawText(label, pos_x + dx+bw, (height-th)/2+dy) # draw the text class BitmapWithThemedButton(wx.BoxSizer): def __init__(self, parent, id=-1, bitmap=wx.NullBitmap, label="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, validator=wx.DefaultValidator, name="button"): wx.BoxSizer.__init__(self, wx.HORIZONTAL) self._bmp = wx.StaticBitmap(parent, -1, bitmap) self.Add(self._bmp, flag=wx.ALIGN_CENTER_VERTICAL) if wx.Platform == "__WXMSW__": btncls = ThemedGenButton else: btncls = wx.Button self._btn = btncls(parent, id, label, pos, size, style, validator, name) self.Add(self._btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=8) def __getattr__(self, name): return getattr(self._btn, name) def Bind(self, event, handler): self._btn.Bind(event, handler) def SetBitmapLabel(self, bitmap): self._bmp.SetBitmap(bitmap) self.Layout() DisplayCAL-3.5.0.0/DisplayCAL/wxLUT3DFrame.py0000644000076500000000000017671613242301247020202 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement import glob import os import re import shutil import sys if sys.platform == "win32": import win32api from argyll_cgats import cal_to_fake_profile from argyll_names import video_encodings from config import (defaults, get_data_path, get_verified_path, getcfg, geticon, hascfg, profile_ext, setcfg) from log import safe_print from meta import name as appname, version from options import debug from util_decimal import stripzeros from util_os import islink, readlink, waccess from util_str import safe_unicode, strtr from worker import (Error, Info, UnloggedInfo, get_current_profile_path, show_result_dialog) import ICCProfile as ICCP import colormath import config import localization as lang import madvr import worker from worker import UnloggedWarning, check_set_argyll_bin, get_options_from_profile from wxwindows import (BaseApp, BaseFrame, ConfirmDialog, FileDrop, InfoDialog, wx) from wxfixes import TempXmlResource import floatspin import xh_filebrowsebutton import xh_floatspin import xh_bitmapctrls from wx import xrc class LUT3DFrame(BaseFrame): """ 3D LUT creation window """ def __init__(self, parent=None, setup=True): self.res = TempXmlResource(get_data_path(os.path.join("xrc", "3dlut.xrc"))) self.res.InsertHandler(xh_filebrowsebutton.FileBrowseButtonWithHistoryXmlHandler()) self.res.InsertHandler(xh_floatspin.FloatSpinCtrlXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, parent, "lut3dframe") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, parent, "lut3dframe") self.init() self.Bind(wx.EVT_CLOSE, self.OnClose) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-3DLUT-maker")) self.set_child_ctrls_as_attrs(self) self.panel = self.FindWindowByName("panel") if setup: self.setup() def setup(self): self.worker = worker.Worker(self) self.worker.set_argyll_version("collink") for which in ("input", "abstract", "output"): ctrl = self.FindWindowByName("%s_profile_ctrl" % which) setattr(self, "%s_profile_ctrl" % which, ctrl) ctrl.changeCallback = getattr(self, "%s_profile_ctrl_handler" % which) if which not in ("abstract", "output"): ctrl.SetHistory(get_data_path("ref", "\.(icc|icm)$")) ctrl.SetMaxFontSize(11) # Drop targets droptarget = FileDrop(self, {".icc": getattr(self, "%s_drop_handler" % which), ".icm": getattr(self, "%s_drop_handler" % which)}) ctrl.SetDropTarget(droptarget) # Bind event handlers self.abstract_profile_cb.Bind(wx.EVT_CHECKBOX, self.use_abstract_profile_ctrl_handler) self.output_profile_current_btn.Bind(wx.EVT_BUTTON, self.output_profile_current_ctrl_handler) self.lut3d_trc_apply_none_ctrl.Bind(wx.EVT_RADIOBUTTON, self.lut3d_trc_apply_ctrl_handler) self.lut3d_trc_apply_black_offset_ctrl.Bind(wx.EVT_RADIOBUTTON, self.lut3d_trc_apply_ctrl_handler) self.lut3d_trc_apply_ctrl.Bind(wx.EVT_RADIOBUTTON, self.lut3d_trc_apply_ctrl_handler) self.lut3d_bind_event_handlers() self.lut3d_create_btn.SetDefault() self.setup_language() self.XYZbpin = [0, 0, 0] # XYZbpout will be set to the blackpoint of the selected profile. This # is used to determine if lack output offset controls should be shown. # Set a initial value slightly above zero so output offset controls are # shown if the selected profile doesn't exist. self.XYZbpout = [0.001, 0.001, 0.001] self.update_controls() self.update_layout() config.defaults.update({ "position.lut3dframe.x": self.GetDisplay().ClientArea[0] + 40, "position.lut3dframe.y": self.GetDisplay().ClientArea[1] + 60, "size.lut3dframe.w": self.GetMinSize()[0], "size.lut3dframe.h": self.GetMinSize()[1]}) if (hascfg("position.lut3dframe.x") and hascfg("position.lut3dframe.y") and hascfg("size.lut3dframe.w") and hascfg("size.lut3dframe.h")): self.SetSaneGeometry(int(getcfg("position.lut3dframe.x")), int(getcfg("position.lut3dframe.y")), int(getcfg("size.lut3dframe.w")), int(getcfg("size.lut3dframe.h"))) else: self.Center() def lut3d_bind_event_handlers(self): # Shared with main window self.lut3d_apply_cal_cb.Bind(wx.EVT_CHECKBOX, self.lut3d_apply_cal_ctrl_handler) self.lut3d_create_btn.Bind(wx.EVT_BUTTON, self.lut3d_create_handler) self.lut3d_hdr_peak_luminance_ctrl.Bind(floatspin.EVT_FLOATSPIN, self.lut3d_hdr_peak_luminance_handler) self.lut3d_hdr_display_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_hdr_display_handler) self.lut3d_bind_trc_handlers() self.lut3d_bind_hdr_trc_handlers() self.lut3d_bind_content_colorspace_handlers() self.lut3d_bind_common_handlers() def lut3d_bind_trc_handlers(self): self.lut3d_trc_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_trc_ctrl_handler) self.lut3d_trc_gamma_ctrl.Bind(wx.EVT_COMBOBOX, self.lut3d_trc_gamma_ctrl_handler) self.lut3d_trc_gamma_ctrl.Bind(wx.EVT_KILL_FOCUS, self.lut3d_trc_gamma_ctrl_handler) self.lut3d_trc_gamma_type_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_trc_gamma_type_ctrl_handler) self.lut3d_trc_black_output_offset_ctrl.Bind(wx.EVT_SLIDER, self.lut3d_trc_black_output_offset_ctrl_handler) self.lut3d_trc_black_output_offset_intctrl.Bind(wx.EVT_TEXT, self.lut3d_trc_black_output_offset_ctrl_handler) def lut3d_bind_hdr_trc_handlers(self): self.lut3d_hdr_ambient_luminance_ctrl.Bind(floatspin.EVT_FLOATSPIN, self.lut3d_hdr_ambient_luminance_handler) self.lut3d_hdr_minmll_ctrl.Bind(floatspin.EVT_FLOATSPIN, self.lut3d_hdr_minmll_handler) self.lut3d_hdr_maxmll_ctrl.Bind(floatspin.EVT_FLOATSPIN, self.lut3d_hdr_maxmll_handler) def lut3d_bind_content_colorspace_handlers(self): self.lut3d_content_colorspace_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_content_colorspace_handler) for color in ("white", "red", "green", "blue"): for coord in "xy": v = getcfg("3dlut.content.colorspace.%s.%s" % (color, coord)) getattr(self, "lut3d_content_colorspace_%s_%s" % (color, coord)).Bind(floatspin.EVT_FLOATSPIN, self.lut3d_content_colorspace_xy_handler) def lut3d_bind_common_handlers(self): self.encoding_input_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_encoding_input_ctrl_handler) self.encoding_output_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_encoding_output_ctrl_handler) self.gamut_mapping_inverse_a2b.Bind(wx.EVT_RADIOBUTTON, self.lut3d_gamut_mapping_mode_handler) self.gamut_mapping_b2a.Bind(wx.EVT_RADIOBUTTON, self.lut3d_gamut_mapping_mode_handler) self.lut3d_rendering_intent_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_rendering_intent_ctrl_handler) self.lut3d_format_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_format_ctrl_handler) self.lut3d_size_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_size_ctrl_handler) self.lut3d_bitdepth_input_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_bitdepth_input_ctrl_handler) self.lut3d_bitdepth_output_ctrl.Bind(wx.EVT_CHOICE, self.lut3d_bitdepth_output_ctrl_handler) def OnClose(self, event=None): if (getattr(self.worker, "thread", None) and self.worker.thread.isAlive()): self.worker.abort_subprocess(True) return if sys.platform == "darwin" or debug: self.focus_handler(event) if (self.IsShownOnScreen() and not self.IsMaximized() and not self.IsIconized()): x, y = self.GetScreenPosition() setcfg("position.lut3dframe.x", x) setcfg("position.lut3dframe.y", y) setcfg("size.lut3dframe.w", self.GetSize()[0]) setcfg("size.lut3dframe.h", self.GetSize()[1]) if self.Parent: config.writecfg() else: config.writecfg(module="3DLUT-maker", options=("3dlut.", "last_3dlut_path", "position.lut3dframe", "size.lut3dframe")) if event: # Hide first (looks nicer) self.Hide() # Need to use CallAfter to prevent hang under Windows if minimized wx.CallAfter(self.Destroy) def use_abstract_profile_ctrl_handler(self, event): setcfg("3dlut.use_abstract_profile", int(self.abstract_profile_cb.GetValue())) enable = bool(getcfg("3dlut.use_abstract_profile")) self.abstract_profile_ctrl.Enable(enable) def lut3d_trc_apply_ctrl_handler(self, event=None): v = self.lut3d_trc_apply_ctrl.GetValue() self.lut3d_trc_ctrl.Enable(v) self.lut3d_trc_gamma_label.Enable(v) self.lut3d_trc_gamma_ctrl.Enable(v) self.lut3d_trc_gamma_type_ctrl.Enable(v) if event: setcfg("3dlut.apply_trc", int(v)) setcfg("3dlut.apply_black_offset", int(self.lut3d_trc_apply_black_offset_ctrl.GetValue())) self.lut3d_hdr_peak_luminance_label.Enable(v) self.lut3d_hdr_peak_luminance_ctrl.Enable(v) self.lut3d_hdr_peak_luminance_ctrl_label.Enable(v) self.lut3d_hdr_minmll_label.Enable(v) self.lut3d_hdr_minmll_ctrl.Enable(v) self.lut3d_hdr_minmll_ctrl_label.Enable(v) self.lut3d_hdr_maxmll_label.Enable(v) self.lut3d_hdr_maxmll_ctrl.Enable(v) self.lut3d_hdr_maxmll_ctrl_label.Enable(v) self.lut3d_hdr_diffuse_white_label.Enable(v) self.lut3d_hdr_diffuse_white_txt.Enable(v) self.lut3d_hdr_diffuse_white_txt_label.Enable(v) self.lut3d_hdr_ambient_luminance_label.Enable(v) self.lut3d_hdr_ambient_luminance_ctrl.Enable(v) self.lut3d_hdr_ambient_luminance_ctrl_label.Enable(v) self.lut3d_hdr_system_gamma_label.Enable(v) self.lut3d_hdr_system_gamma_txt.Enable(v) self.lut3d_content_colorspace_label.Enable(v) self.lut3d_content_colorspace_ctrl.Enable(v) for color in ("white", "red", "green", "blue"): for coord in "xy": getattr(self, "lut3d_content_colorspace_%s_label" % color[0]).Enable(v) getattr(self, "lut3d_content_colorspace_%s_%s" % (color, coord)).Enable(v) getattr(self, "lut3d_content_colorspace_%s_%s_label" % (color, coord)).Enable(v) self.lut3d_trc_black_output_offset_label.Enable(v) self.lut3d_trc_black_output_offset_ctrl.Enable(v) self.lut3d_trc_black_output_offset_intctrl.Enable(v) self.lut3d_trc_black_output_offset_intctrl_label.Enable(v) self.lut3d_show_input_value_clipping_warning(event) self.lut3d_show_hdr_display_control() def lut3d_show_input_value_clipping_warning(self, layout): self.panel.Freeze() show = (self.lut3d_trc_apply_none_ctrl.GetValue() and self.XYZbpout > self.XYZbpin and getcfg("3dlut.rendering_intent") not in ("la", "p", "pa", "ms", "s", "lp")) self.lut3d_input_value_clipping_bmp.Show(show) self.lut3d_input_value_clipping_label.Show(show) if layout: self.panel.Sizer.Layout() self.update_layout() self.panel.Thaw() def lut3d_apply_cal_ctrl_handler(self, event): setcfg("3dlut.output.profile.apply_cal", int(self.lut3d_apply_cal_cb.GetValue())) def lut3d_hdr_display_handler(self, event): if (self.lut3d_hdr_display_ctrl.GetSelection() and not getcfg("3dlut.hdr_display")): if not show_result_dialog(UnloggedInfo(lang.getstr("3dlut.format.madVR.hdr.confirm")), self, confirm=lang.getstr("ok")): self.lut3d_hdr_display_ctrl.SetSelection(0) return self.lut3d_set_option("3dlut.hdr_display", self.lut3d_hdr_display_ctrl.GetSelection()) def lut3d_hdr_peak_luminance_handler(self, event): self.lut3d_set_option("3dlut.hdr_peak_luminance", self.lut3d_hdr_peak_luminance_ctrl.GetValue()) def lut3d_hdr_ambient_luminance_handler(self, event): self.lut3d_set_option("3dlut.hdr_ambient_luminance", self.lut3d_hdr_ambient_luminance_ctrl.GetValue()) def lut3d_hdr_minmll_handler(self, event): self.lut3d_set_option("3dlut.hdr_minmll", self.lut3d_hdr_minmll_ctrl.GetValue()) def lut3d_hdr_maxmll_handler(self, event): self.lut3d_set_option("3dlut.hdr_maxmll", self.lut3d_hdr_maxmll_ctrl.GetValue()) def lut3d_trc_black_output_offset_ctrl_handler(self, event): if event.GetId() == self.lut3d_trc_black_output_offset_intctrl.GetId(): self.lut3d_trc_black_output_offset_ctrl.SetValue( self.lut3d_trc_black_output_offset_intctrl.GetValue()) else: self.lut3d_trc_black_output_offset_intctrl.SetValue( self.lut3d_trc_black_output_offset_ctrl.GetValue()) v = self.lut3d_trc_black_output_offset_ctrl.GetValue() / 100.0 if v != getcfg("3dlut.trc_output_offset"): self.lut3d_set_option("3dlut.trc_output_offset", v) self.lut3d_update_trc_control() #self.lut3d_show_trc_controls() def lut3d_trc_gamma_ctrl_handler(self, event): try: v = float(self.lut3d_trc_gamma_ctrl.GetValue().replace(",", ".")) if (v < config.valid_ranges["3dlut.trc_gamma"][0] or v > config.valid_ranges["3dlut.trc_gamma"][1]): raise ValueError() except ValueError: wx.Bell() self.lut3d_trc_gamma_ctrl.SetValue(str(getcfg("3dlut.trc_gamma"))) else: if str(v) != self.lut3d_trc_gamma_ctrl.GetValue(): self.lut3d_trc_gamma_ctrl.SetValue(str(v)) if v != getcfg("3dlut.trc_gamma"): self.lut3d_set_option("3dlut.trc_gamma", v) self.lut3d_update_trc_control() #self.lut3d_show_trc_controls() event.Skip() def lut3d_trc_ctrl_handler(self, event): self.Freeze() if self.lut3d_trc_ctrl.GetSelection() == 1: # BT.1886 self.lut3d_set_option("3dlut.trc_gamma", 2.4) self.lut3d_set_option("3dlut.trc_gamma_type", "B") self.lut3d_set_option("3dlut.trc_output_offset", 0.0) trc = "bt1886" elif self.lut3d_trc_ctrl.GetSelection() == 0: # Pure power gamma 2.2 self.lut3d_set_option("3dlut.trc_gamma", 2.2) self.lut3d_set_option("3dlut.trc_gamma_type", "b") self.lut3d_set_option("3dlut.trc_output_offset", 1.0) trc = "gamma2.2" elif self.lut3d_trc_ctrl.GetSelection() == 2: # SMPTE 2084, hard clip self.lut3d_set_option("3dlut.trc_output_offset", 0.0) trc = "smpte2084.hardclip" self.lut3d_set_option("3dlut.hdr_maxmll", 10000) elif self.lut3d_trc_ctrl.GetSelection() == 3: # SMPTE 2084, roll-off clip self.lut3d_set_option("3dlut.trc_output_offset", 0.0) trc = "smpte2084.rolloffclip" self.lut3d_set_option("3dlut.hdr_maxmll", 10000) elif self.lut3d_trc_ctrl.GetSelection() == 4: # HLG self.lut3d_set_option("3dlut.trc_output_offset", 0.0) trc = "hlg" else: trc = "customgamma" # Have to use CallAfter, otherwise only part of the text will # be selected (wxPython bug?) wx.CallAfter(self.lut3d_trc_gamma_ctrl.SetFocus) wx.CallLater(1, self.lut3d_trc_gamma_ctrl.SelectAll) self.lut3d_set_option("3dlut.trc", trc) if trc != "customgamma": self.lut3d_update_trc_controls() self.lut3d_show_trc_controls() self.Thaw() def lut3d_trc_gamma_type_ctrl_handler(self, event): v = self.trc_gamma_types_ab[self.lut3d_trc_gamma_type_ctrl.GetSelection()] if v != getcfg("3dlut.trc_gamma_type"): self.lut3d_set_option("3dlut.trc_gamma_type", v) self.lut3d_update_trc_control() self.lut3d_show_trc_controls() def abstract_drop_handler(self, path): if not self.worker.is_working(): self.abstract_profile_ctrl.SetPath(path) self.set_profile("abstract") def lut3d_encoding_input_ctrl_handler(self, event): encoding = self.encoding_input_ab[self.encoding_input_ctrl.GetSelection()] self.lut3d_set_option("3dlut.encoding.input", encoding) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_encoding_controls() elif self.Parent: self.Parent.lut3d_update_encoding_controls() def lut3d_encoding_output_ctrl_handler(self, event): encoding = self.encoding_output_ab[self.encoding_output_ctrl.GetSelection()] if getcfg("3dlut.format") == "madVR" and encoding != "t": profile = getattr(self, "output_profile", None) if (profile and "meta" in profile.tags and isinstance(profile.tags.meta, ICCP.DictType) and "EDID_model" in profile.tags.meta): devicename = profile.tags.meta["EDID_model"] else: devicename = None dlg = ConfirmDialog(self, msg=lang.getstr("3dlut.encoding.output.warning.madvr", devicename or lang.getstr("device.name.placeholder")), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: self.encoding_output_ctrl.SetSelection( self.encoding_output_ba[getcfg("3dlut.encoding.output")]) return False self.lut3d_set_option("3dlut.encoding.output", encoding) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_encoding_controls() elif self.Parent: self.Parent.lut3d_update_encoding_controls() def input_drop_handler(self, path): if not self.worker.is_working(): self.input_profile_ctrl.SetPath(path) self.set_profile("input") def output_drop_handler(self, path): if not self.worker.is_working(): self.output_profile_ctrl.SetPath(path) self.set_profile("output") def abstract_profile_ctrl_handler(self, event): self.set_profile("abstract", silent=not event) def input_profile_ctrl_handler(self, event): self.set_profile("input", silent=not event) if self.Parent: self.Parent.lut3d_init_input_profiles() self.Parent.lut3d_update_controls() def lut3d_bitdepth_input_ctrl_handler(self, event): self.lut3d_set_option("3dlut.bitdepth.input", self.lut3d_bitdepth_ab[self.lut3d_bitdepth_input_ctrl.GetSelection()]) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_shared_controls() elif self.Parent: self.Parent.lut3d_update_shared_controls() def lut3d_bitdepth_output_ctrl_handler(self, event): if (getcfg("3dlut.format") in ("png", "ReShade") and self.lut3d_bitdepth_ab[self.lut3d_bitdepth_output_ctrl.GetSelection()] not in (8, 16)): wx.Bell() self.lut3d_bitdepth_output_ctrl.SetSelection(self.lut3d_bitdepth_ba[8]) self.lut3d_set_option("3dlut.bitdepth.output", self.lut3d_bitdepth_ab[self.lut3d_bitdepth_output_ctrl.GetSelection()]) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_shared_controls() elif self.Parent: self.Parent.lut3d_update_shared_controls() def lut3d_content_colorspace_handler(self, event): sel = self.lut3d_content_colorspace_ctrl.Selection try: rgb_space = self.lut3d_content_colorspace_names[sel] except IndexError: # Custom rgb_space = None else: rgb_space = colormath.get_rgb_space(rgb_space) for i, color in enumerate(("white", "red", "green", "blue")): if i == 0: xyY = colormath.XYZ2xyY(*rgb_space[1]) else: xyY = rgb_space[2:][i - 1] for j, coord in enumerate("xy"): v = round(xyY[j], 4) self.lut3d_set_option("3dlut.content.colorspace.%s.%s" % (color, coord), v) self.lut3d_update_trc_controls() self.panel.Freeze() sizer = self.lut3d_content_colorspace_red_x.ContainingSizer sizer.ShowItems(not rgb_space) self.panel.Layout() self.panel.Thaw() if isinstance(self, LUT3DFrame): self.update_layout() def lut3d_content_colorspace_xy_handler(self, event): option = event.GetEventObject().Name.replace("_", ".")[5:] self.lut3d_set_option("3dlut" + option, event.GetEventObject().GetValue()) self.lut3d_update_trc_controls() def lut3d_create_consumer(self, result=None): if isinstance(result, Exception): show_result_dialog(result, self) # Remove temporary files self.worker.wrapup(False) if not isinstance(result, Exception) and result: if not isinstance(self, LUT3DFrame) and getattr(self, "lut3d_path", None): # 3D LUT tab is part of main window if getcfg("3dlut.create"): # 3D LUT was created automatically after profiling, show # usual profile summary window self.profile_finish(True, getcfg("calibration.file", False), lang.getstr("calibration_profiling.complete"), lang.getstr("profiling.incomplete"), install_3dlut=True) else: # 3D LUT was created manually self.profile_finish(True, getcfg("calibration.file", False), "", lang.getstr("profiling.incomplete"), install_3dlut=True) def lut3d_create_handler(self, event, path=None, copy_from_path=None): if sys.platform == "darwin" or debug: self.focus_handler(event) if not check_set_argyll_bin(): return if isinstance(self, LUT3DFrame): profile_in = self.set_profile("input") if getcfg("3dlut.use_abstract_profile"): profile_abst = self.set_profile("abstract") else: profile_abst = None profile_out = self.set_profile("output") else: profile_abst = None profile_in_path = getcfg("3dlut.input.profile") if not profile_in_path or not os.path.isfile(profile_in_path): show_result_dialog(Error(lang.getstr("error.profile.file_missing", getcfg("3dlut.input.profile", raw=True))), parent=self) return try: profile_in = ICCP.ICCProfile(profile_in_path) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + profile_in_path), parent=self) return profile_out = config.get_current_profile() if not profile_out: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n%s" % getcfg("calibration.file", False)), parent=self) return if path: # Called from script client self.lut3d_path = None elif not copy_from_path: self.lut3d_set_path() path = self.lut3d_path if (not None in (profile_in, profile_out) or (profile_in and profile_in.profileClass == "link")): if profile_out and profile_in.isSame(profile_out, force_calculation=True): if not show_result_dialog(Warning(lang.getstr("error.source_dest_same")), self, confirm=lang.getstr("continue")): return checkoverwrite = True remember_last_3dlut_path = False if not path: defaultDir, defaultFile = get_verified_path("last_3dlut_path") if copy_from_path: defaultFile = os.path.basename(copy_from_path) # Only remember last used path if it was a deliberate user # choice via the filedialog remember_last_3dlut_path = True if copy_from_path and config.get_display_name() == "Resolve": # Find path to Resolve LUT folder if sys.platform == "win32": drives = win32api.GetLogicalDriveStrings() for drive in drives.split("\0")[:-1]: lut_dir = os.path.join(drive, "ProgramData", "Blackmagic Design", "DaVinci Resolve", "Support", "LUT") if os.path.isdir(lut_dir): defaultDir = lut_dir remember_last_3dlut_path = False break else: # Assume OS X volumes = ["/"] + glob.glob("/Volumes/*") for volume in volumes: lut_dir = os.path.join(volume, "Library", "Application Support", "Blackmagic Design", "DaVinci Resolve", "LUT") if os.path.isdir(lut_dir): defaultDir = lut_dir remember_last_3dlut_path = False break ext = getcfg("3dlut.format") if (ext != "madVR" and not isinstance(self, LUT3DFrame) and getcfg("3dlut.output.profile.apply_cal")): # Check if there's a clash between current videoLUT # and 3D LUT (do both contain non-linear calibration?) profile_display_name = profile_out.getDeviceModelDescription() tempdir = self.worker.create_tempdir() if isinstance(tempdir, Exception): show_result_dialog(tempdir, self) return tempcal = os.path.join(tempdir, "temp.cal") cancel = False real_displays_count = 0 show_nonlinear_videolut_warning = False for i, display_name in enumerate(self.worker.display_names): if (display_name == profile_display_name and display_name != "madVR" and self.worker.lut_access[i] and self.worker.save_current_video_lut( i + 1, tempcal, silent=True) is True and not cal_to_fake_profile(tempcal).tags.vcgt.is_linear()): show_nonlinear_videolut_warning = True break if not config.is_virtual_display(i): real_displays_count += 1 if (show_nonlinear_videolut_warning or real_displays_count == 1): if copy_from_path: confirm = lang.getstr("3dlut.save_as") else: confirm = lang.getstr("3dlut.install") if not show_result_dialog(UnloggedWarning( lang.getstr("3dlut.1dlut.videolut.nonlinear")), self, confirm=confirm): cancel = True if os.path.isfile(tempcal): os.remove(tempcal) if cancel: return if ext == "ReShade": dlg = wx.DirDialog(self, lang.getstr("3dlut.install"), defaultPath=defaultDir) else: if ext == "eeColor": ext = "txt" elif ext == "madVR": ext = "3dlut" elif ext == "icc": ext = profile_ext[1:] defaultFile = os.path.splitext(defaultFile or os.path.basename(config.defaults.get("last_3dlut_path")))[0] + "." + ext dlg = wx.FileDialog(self, lang.getstr("3dlut.save_as"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard="*." + ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() if ext == "ReShade": path = os.path.join(path.rstrip(os.path.sep), "ColorLookupTable.png") dlg.Destroy() checkoverwrite = False if path: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return if remember_last_3dlut_path: setcfg("last_3dlut_path", path) if checkoverwrite and os.path.isfile(path): dlg = ConfirmDialog(self, msg=lang.getstr("dialog.confirm_overwrite", (path)), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap =geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return if self.Parent: config.writecfg() elif isinstance(self, LUT3DFrame): config.writecfg(module="3DLUT-maker", options=("3dlut.", "last_3dlut_path", "position.lut3dframe", "size.lut3dframe")) if copy_from_path: # Instead of creating a 3D LUT, copy existing one src_name = os.path.splitext(copy_from_path)[0] dst_name = os.path.splitext(path)[0] src_paths = [copy_from_path] dst_paths = [path] if getcfg("3dlut.format") == "eeColor": # eeColor: 3D LUT + 6x 1D LUT for part in ("first", "second"): for channel in ("blue", "green", "red"): src_path = "%s-%s1d%s.txt" % (src_name, part, channel) if os.path.isfile(src_path): src_paths.append(src_path) dst_paths.append("%s-%s1d%s.txt" % (dst_name, part, channel)) elif getcfg("3dlut.format") == "ReShade": dst_dir = os.path.dirname(path) # Check if MasterEffect is installed me_header_path = os.path.join(dst_dir, "MasterEffect.h") use_mclut3d = False if (use_mclut3d and os.path.isfile(me_header_path) and os.path.isdir(os.path.join(dst_dir, "MasterEffect"))): dst_paths = [os.path.join(dst_dir, "MasterEffect", "mclut3d.png")] # Alter existing MasterEffect.h with open(me_header_path, "rb") as me_header_file: me_header = me_header_file.read() # Enable LUT me_header = re.sub(r"#define\s+USE_LUT\s+0", "#define USE_LUT 1", me_header) # iLookupTableMode 2 = use mclut3d.png me_header = re.sub(r"#define\s+iLookupTableMode\s+\d+", "#define iLookupTableMode 2", me_header) # Amount of color change by lookup table. # 1.0 means full effect. me_header = re.sub(r"#define\s+fLookupTableMix\s+\d+(?:\.\d+)", "#define fLookupTableMix 1.0", me_header) with open(me_header_path, "wb") as me_header_file: me_header_file.write(me_header) else: # Write out our own shader clut_fx_path = get_data_path("ColorLookupTable.fx") if not clut_fx_path: show_result_dialog(Error(lang.getstr("file.missing", "ColorLookupTable.fx")), self) return with open(clut_fx_path, "rb") as clut_fx_file: clut_fx = clut_fx_file.read() clut_size = getcfg("3dlut.size") clut_fx = strtr(clut_fx, {"${VERSION}": version, "${WIDTH}": str(clut_size ** 2), "${HEIGHT}": str(clut_size), "${FORMAT}": "RGBA%i" % getcfg("3dlut.bitdepth.output")}) reshade_shaders = os.path.join(dst_dir, "reshade-shaders") if os.path.isdir(reshade_shaders): # ReShade >= 3.x with default shaders path = os.path.join(reshade_shaders, "Textures", os.path.basename(path)) dst_paths = [path] dst_dir = os.path.join(reshade_shaders, "Shaders") else: reshade_fx_path = os.path.join(dst_dir, "ReShade.fx") # Adjust path for correct installation if ReShade.fx # is a symlink. if islink(reshade_fx_path): # ReShade < 3.0 reshade_fx_path = readlink(reshade_fx_path) dst_dir = os.path.dirname(reshade_fx_path) path = os.path.join(dst_dir, os.path.basename(path)) dst_paths = [path] if os.path.isfile(reshade_fx_path): # ReShade < 3.0 # Alter existing ReShade.fx with open(reshade_fx_path, "rb") as reshade_fx_file: reshade_fx = reshade_fx_file.read() # Remove existing shader include reshade_fx = re.sub(r'[ \t]*//\s*Automatically\s+\S+\s+by\s+%s\s+.+[ \t]*\r?\n?' % appname, "", reshade_fx) reshade_fx = re.sub(r'[ \t]*#include\s+"ColorLookupTable.fx"[ \t]*\r?\n?', "", reshade_fx).rstrip("\r\n") reshade_fx += "%s// Automatically added by %s %s%s" % (os.linesep * 2, appname, version, os.linesep) reshade_fx += '#include "ColorLookupTable.fx"' + os.linesep with open(reshade_fx_path, "wb") as reshade_fx_file: reshade_fx_file.write(reshade_fx) clut_fx_path = os.path.join(dst_dir, "ColorLookupTable.fx") with open(clut_fx_path, "wb") as clut_fx_file: clut_fx_file.write(clut_fx) for src_path, dst_path in zip(src_paths, dst_paths): shutil.copyfile(src_path, dst_path) return self.worker.interactive = False self.worker.start(self.lut3d_create_consumer, self.lut3d_create_producer, wargs=(profile_in, profile_abst, profile_out, path), progress_msg=lang.getstr("3dlut.create"), resume=not isinstance(self, LUT3DFrame) and getcfg("3dlut.create")) def lut3d_create_producer(self, profile_in, profile_abst, profile_out, path): apply_cal = (profile_out and isinstance(profile_out.tags.get("vcgt"), ICCP.VideoCardGammaType) and (getcfg("3dlut.output.profile.apply_cal") or not hasattr(self, "lut3d_apply_cal_cb"))) input_encoding = getcfg("3dlut.encoding.input") output_encoding = getcfg("3dlut.encoding.output") if (getcfg("3dlut.apply_trc") or not hasattr(self, "lut3d_trc_apply_none_ctrl")): if (getcfg("3dlut.trc").startswith("smpte2084") or # SMPTE ST.2084 (PQ) getcfg("3dlut.trc") == "hlg"): # Hybrid Log-Gamma (HLG) trc_gamma = getcfg("3dlut.trc") else: trc_gamma = getcfg("3dlut.trc_gamma") else: trc_gamma = None XYZwp = None if not isinstance(self, LUT3DFrame): x = getcfg("3dlut.whitepoint.x", False) y = getcfg("3dlut.whitepoint.y", False) if x and y: XYZwp = colormath.xyY2XYZ(x, y) trc_gamma_type = getcfg("3dlut.trc_gamma_type") outoffset = getcfg("3dlut.trc_output_offset") intent = getcfg("3dlut.rendering_intent") format = getcfg("3dlut.format") size = getcfg("3dlut.size") input_bits = getcfg("3dlut.bitdepth.input") output_bits = getcfg("3dlut.bitdepth.output") apply_black_offset = getcfg("3dlut.apply_black_offset") use_b2a = getcfg("3dlut.gamap.use_b2a") white_cdm2 = getcfg("3dlut.hdr_peak_luminance") minmll = getcfg("3dlut.hdr_minmll") maxmll = getcfg("3dlut.hdr_maxmll") ambient_cdm2 = getcfg("3dlut.hdr_ambient_luminance") content_rgb_space = [1.0, [], [], [], []] for i, color in enumerate(("white", "red", "green", "blue")): for coord in "xy": v = getcfg("3dlut.content.colorspace.%s.%s" % (color, coord)) content_rgb_space[i + 1].append(v) # Dummy Y value, not used for primaries but needs to be present content_rgb_space[i + 1].append(1.0) content_rgb_space[1] = colormath.xyY2XYZ(*content_rgb_space[1]) content_rgb_space = colormath.get_rgb_space(content_rgb_space) try: self.worker.create_3dlut(profile_in, path, profile_abst, profile_out, apply_cal=apply_cal, intent=intent, format=format, size=size, input_bits=input_bits, output_bits=output_bits, input_encoding=input_encoding, output_encoding=output_encoding, trc_gamma=trc_gamma, trc_gamma_type=trc_gamma_type, trc_output_offset=outoffset, apply_black_offset=apply_black_offset, use_b2a=use_b2a, white_cdm2=white_cdm2, minmll=minmll, maxmll=maxmll, ambient_cdm2=ambient_cdm2, content_rgb_space=content_rgb_space, hdr_display=getcfg("3dlut.hdr_display"), XYZwp=XYZwp) except Exception, exception: return exception return True def lut3d_format_ctrl_handler(self, event): # Get selected format format = self.lut3d_formats_ab[self.lut3d_format_ctrl.GetSelection()] if getcfg("3dlut.format") in ("eeColor", "madVR", "ReShade") and format not in ("eeColor", "madVR", "ReShade"): # If previous format was eeColor/madVR/ReShade, restore 3D LUT encoding setcfg("3dlut.encoding.input", getcfg("3dlut.encoding.input.backup")) setcfg("3dlut.encoding.output", getcfg("3dlut.encoding.output.backup")) if getcfg("3dlut.format") in ("eeColor", "madVR", "mga", "ReShade"): setcfg("3dlut.size", getcfg("3dlut.size.backup")) if getcfg("3dlut.format") not in ("eeColor", "madVR", "ReShade") and format in ("eeColor", "madVR", "ReShade"): # If selected format is eeColor/madVR/ReShade, backup 3D LUT encoding setcfg("3dlut.encoding.input.backup", getcfg("3dlut.encoding.input")) setcfg("3dlut.encoding.output.backup", getcfg("3dlut.encoding.output")) # Set selected format self.lut3d_set_option("3dlut.format", format) if format in ("eeColor", "madVR", "mga", "ReShade"): setcfg("3dlut.size.backup", getcfg("3dlut.size")) if format == "eeColor": # -et -Et for eeColor if getcfg("3dlut.encoding.input") not in ("t", "T"): self.lut3d_set_option("3dlut.encoding.input", "t") self.lut3d_set_option("3dlut.encoding.output", "t") # eeColor uses a fixed size of 65x65x65 self.lut3d_set_option("3dlut.size", 65) elif format == "mga": # Pandora uses a fixed bitdepth of 16 self.lut3d_set_option("3dlut.bitdepth.output", 16) self.lut3d_bitdepth_output_ctrl.SetSelection(self.lut3d_bitdepth_ba[16]) elif format == "madVR": # -et -Et for madVR if getcfg("3dlut.encoding.input") not in ("t", "T"): self.lut3d_set_option("3dlut.encoding.input", "t") self.lut3d_set_option("3dlut.encoding.output", "t") # collink says madVR works best with 65 self.lut3d_set_option("3dlut.size", 65) elif format in ("png", "ReShade"): if format == "ReShade": self.lut3d_set_option("3dlut.encoding.input", "n") self.lut3d_set_option("3dlut.encoding.output", "n") self.lut3d_set_option("3dlut.bitdepth.output", 8) elif getcfg("3dlut.bitdepth.output") not in (8, 16): self.lut3d_set_option("3dlut.bitdepth.output", 8) self.lut3d_bitdepth_output_ctrl.SetSelection(self.lut3d_bitdepth_ba[getcfg("3dlut.bitdepth.output")]) size = getcfg("3dlut.size") snap_size = self.lut3d_snap_size(size) if snap_size != size: self.lut3d_set_option("3dlut.size", snap_size) self.lut3d_size_ctrl.SetSelection(self.lut3d_size_ba[getcfg("3dlut.size")]) self.lut3d_update_encoding_controls() self.lut3d_enable_size_controls() self.lut3d_show_bitdepth_controls() if not isinstance(self, LUT3DFrame): self.panel.Freeze() self.lut3d_show_controls() self.calpanel.Layout() self.update_main_controls() self.panel.Thaw() if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_shared_controls() return else: self.panel.Freeze() self.lut3d_show_hdr_display_control() self.panel.Layout() self.panel.Thaw() self.update_layout() if self.Parent: self.Parent.lut3d_update_shared_controls() self.lut3d_create_btn.Enable(format != "madVR" or self.output_profile_ctrl.IsShown()) def lut3d_size_ctrl_handler(self, event): size = self.lut3d_size_ab[self.lut3d_size_ctrl.GetSelection()] snap_size = self.lut3d_snap_size(size) if snap_size != size: wx.Bell() self.lut3d_size_ctrl.SetSelection(self.lut3d_size_ba[snap_size]) self.lut3d_set_option("3dlut.size", snap_size) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_shared_controls() elif self.Parent: self.Parent.lut3d_update_shared_controls() def lut3d_snap_size(self, size): if getcfg("3dlut.format") == "mga" and size not in (17, 33): if size < 33: size = 17 else: size = 33 elif getcfg("3dlut.format") == "ReShade" and size not in (16, 32, 64): if size < 32: size = 16 elif size < 64: size = 32 else: size = 64 return size def output_profile_ctrl_handler(self, event): self.set_profile("output", silent=not event) def output_profile_current_ctrl_handler(self, event): profile_path = get_current_profile_path(True, True) if profile_path and os.path.isfile(profile_path): self.output_profile_ctrl.SetPath(profile_path) self.set_profile("output", profile_path or False, silent=not event) def lut3d_gamut_mapping_mode_handler(self, event): self.lut3d_set_option("3dlut.gamap.use_b2a", int(self.gamut_mapping_b2a.GetValue())) if getattr(self, "lut3dframe", None): self.lut3dframe.update_controls() elif self.Parent: self.Parent.lut3d_update_b2a_controls() def get_commands(self): return self.get_common_commands() + ["3DLUT-maker [create ]"] def process_data(self, data): if data[0] == "3DLUT-maker" and (len(data) == 1 or (len(data) == 3 and data[1] == "create")): if self.IsIconized(): self.Restore() self.Raise() if len(data) == 3: wx.CallAfter(self.lut3d_create_handler, CustomEvent(wx.EVT_BUTTON.evtType[0], self.lut3d_create_btn), path=data[2]) return "ok" return "invalid" def lut3d_rendering_intent_ctrl_handler(self, event): self.lut3d_set_option("3dlut.rendering_intent", self.rendering_intents_ab[self.lut3d_rendering_intent_ctrl.GetSelection()]) if getattr(self, "lut3dframe", None): self.lut3dframe.lut3d_update_shared_controls() else: if isinstance(self, LUT3DFrame): self.lut3d_show_input_value_clipping_warning(True) if self.Parent: self.Parent.lut3d_update_shared_controls() def set_profile(self, which, profile_path=None, silent=False): path = getattr(self, "%s_profile_ctrl" % which).GetPath() if which == "output": if profile_path is None: profile_path = get_current_profile_path(True, True) self.output_profile_current_btn.Enable(self.output_profile_ctrl.IsShown() and bool(profile_path) and os.path.isfile(profile_path) and profile_path != path) if path: if not os.path.isfile(path): if not silent: show_result_dialog(Error(lang.getstr("file.missing", path)), parent=self) return try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): if not silent: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + path), parent=self) except IOError, exception: if not silent: show_result_dialog(exception, parent=self) else: if ((which in ("input", "output") and (profile.profileClass not in ("mntr", "link", "scnr", "spac") or profile.colorSpace != "RGB")) or (which == "abstract" and (profile.profileClass != "abst" or profile.colorSpace not in ("Lab", "XYZ")))): show_result_dialog(Error(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace))), parent=self) else: if profile.profileClass == "link": if which == "output": self.input_profile_ctrl.SetPath(path) if getcfg("3dlut.output.profile") == path: # The original file was probably overwritten # by the device link. Reset. setcfg("3dlut.output.profile", None) self.output_profile_ctrl.SetPath(getcfg("3dlut.output.profile")) self.set_profile("input", silent=silent) return else: self.Freeze() self.abstract_profile_cb.SetValue(False) self.abstract_profile_cb.Hide() self.abstract_profile_ctrl.Hide() self.output_profile_label.Hide() self.output_profile_ctrl.Hide() self.output_profile_current_btn.Hide() self.lut3d_apply_cal_cb.Hide() self.lut3d_trc_label.Hide() self.lut3d_trc_apply_none_ctrl.Hide() self.lut3d_input_value_clipping_bmp.Hide() self.lut3d_input_value_clipping_label.Hide() self.lut3d_trc_apply_black_offset_ctrl.Hide() self.gamut_mapping_mode.Hide() self.gamut_mapping_inverse_a2b.Hide() self.gamut_mapping_b2a.Hide() self.lut3d_show_encoding_controls(False) self.lut3d_show_trc_controls(False) self.lut3d_rendering_intent_label.Hide() self.lut3d_rendering_intent_ctrl.Hide() self.panel.GetSizer().Layout() self.update_layout() self.Thaw() else: if which == "input": if (not hasattr(self, which + "_profile") or getcfg("3dlut.%s.profile" % which) != profile.fileName): # Get profile blackpoint so we can check if it makes # sense to show TRC type and output offset controls try: odata = self.worker.xicclu(profile, (0, 0, 0), pcs="x") except Exception, exception: show_result_dialog(exception, self) self.set_profile_ctrl_path(which) return else: if len(odata) != 1 or len(odata[0]) != 3: show_result_dialog("Blackpoint is invalid: %s" % odata, self) self.set_profile_ctrl_path(which) return self.XYZbpin = odata[0] self.Freeze() self.lut3d_trc_label.Show() self.lut3d_trc_apply_none_ctrl.Show() self.lut3d_trc_apply_black_offset_ctrl.Show() self.gamut_mapping_mode.Show() self.gamut_mapping_inverse_a2b.Show() self.gamut_mapping_b2a.Show() enable = bool(getcfg("3dlut.use_abstract_profile")) self.abstract_profile_cb.SetValue(enable) self.abstract_profile_cb.Show() self.abstract_profile_ctrl.Enable(enable) self.abstract_profile_ctrl.Show() self.output_profile_label.Show() self.output_profile_ctrl.Show() self.output_profile_current_btn.Show() self.lut3d_apply_cal_cb.Show() self.lut3d_show_encoding_controls() self.lut3d_update_encoding_controls() # Update controls related to output profile setattr(self, "input_profile", profile) if not self.set_profile("output", silent=silent): self.update_linking_controls() self.lut3d_trc_apply_ctrl_handler() elif which == "output": if (not hasattr(self, which + "_profile") or getcfg("3dlut.%s.profile" % which) != profile.fileName): # Get profile blackpoint so we can check if input # values would be clipped try: odata = self.worker.xicclu(profile, (0, 0, 0), pcs="x") except Exception, exception: show_result_dialog(exception, self) self.set_profile_ctrl_path(which) return else: if len(odata) != 1 or len(odata[0]) != 3: show_result_dialog("Blackpoint is invalid: %s" % odata, self) self.set_profile_ctrl_path(which) return self.XYZbpout = odata[0] self.Freeze() enable_apply_cal = (isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType)) self.lut3d_apply_cal_cb.SetValue(enable_apply_cal and bool(getcfg("3dlut.output.profile.apply_cal"))) self.lut3d_apply_cal_cb.Enable(enable_apply_cal) self.gamut_mapping_inverse_a2b.Enable() allow_b2a_gamap = ("B2A0" in profile.tags and isinstance(profile.tags.B2A0, ICCP.LUT16Type) and profile.tags.B2A0.clut_grid_steps >= 17) # Allow using B2A instead of inverse A2B? self.gamut_mapping_b2a.Enable(allow_b2a_gamap) if not allow_b2a_gamap: setcfg("3dlut.gamap.use_b2a", 0) self.update_linking_controls() self.lut3d_trc_apply_ctrl_handler() self.lut3d_rendering_intent_label.Show() self.lut3d_rendering_intent_ctrl.Show() self.panel.GetSizer().Layout() self.update_layout() self.Thaw() setattr(self, "%s_profile" % which, profile) if which == "output" and not self.output_profile_ctrl.IsShown(): return setcfg("3dlut.%s.profile" % which, profile.fileName) self.lut3d_create_btn.Enable(bool(getcfg("3dlut.input.profile")) and os.path.isfile(getcfg("3dlut.input.profile")) and ((bool(getcfg("3dlut.output.profile")) and os.path.isfile(getcfg("3dlut.output.profile"))) or profile.profileClass == "link") and (getcfg("3dlut.format") != "madVR" or self.output_profile_ctrl.IsShown())) return profile self.set_profile_ctrl_path(which) else: if which == "input": self.set_profile_ctrl_path(which) self.lut3d_update_encoding_controls() else: if not silent: setattr(self, "%s_profile" % which, None) setcfg("3dlut.%s.profile" % which, None) if which == "output": self.lut3d_apply_cal_cb.Disable() self.lut3d_create_btn.Disable() def set_profile_ctrl_path(self, which): getattr(self, "%s_profile_ctrl" % which).SetPath(getcfg("3dlut.%s.profile" % which)) def setup_language(self): BaseFrame.setup_language(self) for which in ("input", "abstract", "output"): msg = {"input": lang.getstr("3dlut.input.profile"), "abstract": lang.getstr("3dlut.use_abstract_profile"), "output": lang.getstr("output.profile")}[which] kwargs = dict(toolTip=msg.rstrip(":"), dialogTitle=msg, fileMask=lang.getstr("filetype.icc") + "|*.icc;*.icm") ctrl = getattr(self, "%s_profile_ctrl" % which) for name, value in kwargs.iteritems(): setattr(ctrl, name, value) self.lut3d_setup_language() def lut3d_setup_language(self): # Shared with main window items = [] for item in ("Gamma 2.2", "trc.rec1886", "trc.smpte2084.hardclip", "trc.smpte2084.rolloffclip", "trc.hlg", "custom"): items.append(lang.getstr(item)) self.lut3d_trc_ctrl.SetItems(items) self.trc_gamma_types_ab = {0: "b", 1: "B"} self.trc_gamma_types_ba = {"b": 0, "B": 1} self.lut3d_trc_gamma_type_ctrl.SetItems([lang.getstr("trc.type.relative"), lang.getstr("trc.type.absolute")]) self.lut3d_content_colorspace_names = ["Rec. 2020", "DCI P3", "Rec. 709"] self.lut3d_content_colorspace_ctrl.SetItems(self.lut3d_content_colorspace_names + [lang.getstr("custom")]) self.rendering_intents_ab = {} self.rendering_intents_ba = {} self.lut3d_rendering_intent_ctrl.Clear() intents = list(config.valid_values["3dlut.rendering_intent"]) if self.worker.argyll_version < [1, 8, 3]: intents.remove("lp") for i, ri in enumerate(intents): self.lut3d_rendering_intent_ctrl.Append(lang.getstr("gamap.intents." + ri)) self.rendering_intents_ab[i] = ri self.rendering_intents_ba[ri] = i self.lut3d_formats_ab = {} self.lut3d_formats_ba = {} self.lut3d_format_ctrl.Clear() i = 0 for format in config.valid_values["3dlut.format"]: if format != "madVR" or self.worker.argyll_version >= [1, 6]: self.lut3d_format_ctrl.Append(lang.getstr("3dlut.format.%s" % format)) self.lut3d_formats_ab[i] = format self.lut3d_formats_ba[format] = i i += 1 self.lut3d_hdr_display_ctrl.SetItems([lang.getstr(item) for item in ("3dlut.format.madVR.hdr_to_sdr", "3dlut.format.madVR.hdr")]) self.lut3d_size_ab = {} self.lut3d_size_ba = {} self.lut3d_size_ctrl.Clear() for i, size in enumerate(config.valid_values["3dlut.size"]): self.lut3d_size_ctrl.Append("%sx%sx%s" % ((size, ) * 3)) self.lut3d_size_ab[i] = size self.lut3d_size_ba[size] = i self.lut3d_bitdepth_ab = {} self.lut3d_bitdepth_ba = {} self.lut3d_bitdepth_input_ctrl.Clear() self.lut3d_bitdepth_output_ctrl.Clear() for i, bitdepth in enumerate(config.valid_values["3dlut.bitdepth.input"]): self.lut3d_bitdepth_input_ctrl.Append(str(bitdepth)) self.lut3d_bitdepth_output_ctrl.Append(str(bitdepth)) self.lut3d_bitdepth_ab[i] = bitdepth self.lut3d_bitdepth_ba[bitdepth] = i def lut3d_setup_encoding_ctrl(self): format = getcfg("3dlut.format") # Shared with amin window if format == "madVR": encodings = ["t"] config.defaults["3dlut.encoding.input"] = "t" config.defaults["3dlut.encoding.output"] = "t" else: encodings = list(video_encodings) config.defaults["3dlut.encoding.input"] = "n" config.defaults["3dlut.encoding.output"] = "n" if (self.worker.argyll_version >= [1, 7] and self.worker.argyll_version != [1, 7, 0, "_beta"]): # Argyll 1.7 beta 3 (2015-04-02) added clip WTW on input TV encoding encodings.insert(2, "T") config.valid_values["3dlut.encoding.input"] = encodings # collink: xvYCC output encoding is not supported config.valid_values["3dlut.encoding.output"] = filter(lambda v: v not in ("T", "x", "X"), encodings) self.encoding_input_ab = {} self.encoding_input_ba = {} self.encoding_output_ab = {} self.encoding_output_ba = {} self.encoding_input_ctrl.Freeze() self.encoding_input_ctrl.Clear() self.encoding_output_ctrl.Freeze() self.encoding_output_ctrl.Clear() for i, encoding in enumerate(config.valid_values["3dlut.encoding.input"]): lstr = lang.getstr("3dlut.encoding.type_%s" % encoding) self.encoding_input_ctrl.Append(lstr) self.encoding_input_ab[i] = encoding self.encoding_input_ba[encoding] = i for o, encoding in enumerate(config.valid_values["3dlut.encoding.output"]): lstr = lang.getstr("3dlut.encoding.type_%s" % encoding) self.encoding_output_ctrl.Append(lstr) self.encoding_output_ab[o] = encoding self.encoding_output_ba[encoding] = o self.encoding_input_ctrl.Thaw() self.encoding_output_ctrl.Thaw() def lut3d_set_option(self, option, v, set_changed=True): """ Set option to value and update settings state """ if (hasattr(self, "profile_settings_changed") and set_changed and getcfg("3dlut.create") and v != getcfg(option)): self.profile_settings_changed() setcfg(option, v) if option in ("3dlut.hdr_peak_luminance", "3dlut.hdr_minmll", "3dlut.hdr_maxmll"): self.lut3d_hdr_update_diffuse_white() elif option == "3dlut.hdr_ambient_luminance": self.lut3d_hdr_update_system_gamma() def lut3d_hdr_update_diffuse_white(self): # Update knee start info for BT.2390-3 roll-off bt2390 = colormath.BT2390(0, getcfg("3dlut.hdr_peak_luminance"), getcfg("3dlut.hdr_minmll"), getcfg("3dlut.hdr_maxmll")) diffuse_ref_cdm2 = 94.37844 diffuse_PQ = colormath.specialpow(diffuse_ref_cdm2 / 10000, 1.0 / -2084) # Determine white cd/m2 after roll-off diffuse_tgt_cdm2 = colormath.specialpow(bt2390.apply(diffuse_PQ), -2084) * 10000 if diffuse_tgt_cdm2 < diffuse_ref_cdm2: signalcolor = "#CC0000" else: signalcolor = "#008000" self.lut3d_hdr_diffuse_white_txt.ForegroundColour = signalcolor self.lut3d_hdr_diffuse_white_txt.Label = "%.2f" % diffuse_tgt_cdm2 self.lut3d_hdr_diffuse_white_txt_label.ForegroundColour = signalcolor self.lut3d_hdr_diffuse_white_txt.ContainingSizer.Layout() def lut3d_hdr_update_system_gamma(self): # Update system gamma for HLG based on ambient luminance (BT.2390-3) hlg = colormath.HLG(ambient_cdm2=getcfg("3dlut.hdr_ambient_luminance")) self.lut3d_hdr_system_gamma_txt.Label = str(stripzeros("%.4f" % hlg.gamma)) def update_controls(self): """ Update controls with values from the configuration """ self.panel.Freeze() self.lut3d_create_btn.Disable() self.input_profile_ctrl.SetPath(getcfg("3dlut.input.profile")) self.output_profile_ctrl.SetPath(getcfg("3dlut.output.profile")) self.input_profile_ctrl_handler(None) enable = bool(getcfg("3dlut.use_abstract_profile")) self.abstract_profile_cb.SetValue(enable) self.abstract_profile_ctrl.SetPath(getcfg("3dlut.abstract.profile")) self.abstract_profile_ctrl_handler(None) self.output_profile_ctrl_handler(None) self.lut3d_update_shared_controls() self.panel.Thaw() def lut3d_update_shared_controls(self): # Shared with main window self.lut3d_update_trc_controls() self.lut3d_rendering_intent_ctrl.SetSelection(self.rendering_intents_ba[getcfg("3dlut.rendering_intent")]) # MadVR only available with Argyll 1.6+, fall back to default self.lut3d_format_ctrl.SetSelection(self.lut3d_formats_ba.get(getcfg("3dlut.format"), self.lut3d_formats_ba[defaults["3dlut.format"]])) self.lut3d_hdr_display_ctrl.SetSelection(getcfg("3dlut.hdr_display")) self.lut3d_size_ctrl.SetSelection(self.lut3d_size_ba[getcfg("3dlut.size")]) self.lut3d_enable_size_controls() self.lut3d_bitdepth_input_ctrl.SetSelection(self.lut3d_bitdepth_ba[getcfg("3dlut.bitdepth.input")]) self.lut3d_bitdepth_output_ctrl.SetSelection(self.lut3d_bitdepth_ba[getcfg("3dlut.bitdepth.output")]) self.lut3d_show_bitdepth_controls() if self.Parent: self.Parent.lut3d_update_shared_controls() def lut3d_update_trc_control(self): if getcfg("3dlut.trc").startswith("smpte2084"): # SMPTE 2084 if getcfg("3dlut.trc") == "smpte2084.hardclip": sel = 2 else: sel = 3 self.lut3d_trc_ctrl.SetSelection(sel) elif getcfg("3dlut.trc") == "hlg": # Hybrid Log-Gamma (HLG) self.lut3d_trc_ctrl.SetSelection(4) elif (getcfg("3dlut.trc_gamma_type") == "B" and getcfg("3dlut.trc_output_offset") == 0 and getcfg("3dlut.trc_gamma") == 2.4): self.lut3d_trc_ctrl.SetSelection(1) # BT.1886 setcfg("3dlut.trc", "bt1886") elif (getcfg("3dlut.trc_gamma_type") == "b" and getcfg("3dlut.trc_output_offset") == 1 and getcfg("3dlut.trc_gamma") == 2.2): self.lut3d_trc_ctrl.SetSelection(0) # Pure power gamma 2.2 setcfg("3dlut.trc", "gamma2.2") else: self.lut3d_trc_ctrl.SetSelection(5) # Custom setcfg("3dlut.trc", "customgamma") def lut3d_update_trc_controls(self): self.lut3d_update_trc_control() self.lut3d_trc_gamma_ctrl.SetValue(str(getcfg("3dlut.trc_gamma"))) self.lut3d_trc_gamma_type_ctrl.SetSelection(self.trc_gamma_types_ba[getcfg("3dlut.trc_gamma_type")]) outoffset = int(getcfg("3dlut.trc_output_offset") * 100) self.lut3d_trc_black_output_offset_ctrl.SetValue(outoffset) self.lut3d_trc_black_output_offset_intctrl.SetValue(outoffset) self.lut3d_hdr_peak_luminance_ctrl.SetValue(getcfg("3dlut.hdr_peak_luminance")) self.lut3d_hdr_minmll_ctrl.SetValue(getcfg("3dlut.hdr_minmll")) self.lut3d_hdr_maxmll_ctrl.SetValue(getcfg("3dlut.hdr_maxmll")) self.lut3d_hdr_update_diffuse_white() self.lut3d_hdr_ambient_luminance_ctrl.SetValue(getcfg("3dlut.hdr_ambient_luminance")) self.lut3d_hdr_update_system_gamma() # Content colorspace (currently only used for SMPTE 2084) content_colors = [] for color in ("red", "green", "blue", "white"): for coord in "xy": v = getcfg("3dlut.content.colorspace.%s.%s" % (color, coord)) getattr(self, "lut3d_content_colorspace_%s_%s" % (color, coord)).SetValue(v) content_colors.append(round(v, 4)) rgb_space_name = colormath.find_primaries_wp_xy_rgb_space_name(content_colors, self.lut3d_content_colorspace_names) if rgb_space_name: i = self.lut3d_content_colorspace_names.index(rgb_space_name) else: i = self.lut3d_content_colorspace_ctrl.Count - 1 self.lut3d_content_colorspace_ctrl.SetSelection(i) def update_linking_controls(self): self.gamut_mapping_inverse_a2b.SetValue( not getcfg("3dlut.gamap.use_b2a")) self.gamut_mapping_b2a.SetValue( bool(getcfg("3dlut.gamap.use_b2a"))) self.lut3d_show_trc_controls() if (hasattr(self, "input_profile") and "rTRC" in self.input_profile.tags and "gTRC" in self.input_profile.tags and "bTRC" in self.input_profile.tags and self.input_profile.tags.rTRC == self.input_profile.tags.gTRC == self.input_profile.tags.bTRC and isinstance(self.input_profile.tags.rTRC, ICCP.CurveType)): tf = self.input_profile.tags.rTRC.get_transfer_function(outoffset=1.0) if (getcfg("3dlut.input.profile") != self.input_profile.fileName): # Use BT.1886 gamma mapping for SMPTE 240M / # Rec. 709 TRC setcfg("3dlut.apply_trc", int(tf[0][1] in (-240, -709) or (tf[0][0].startswith("Gamma") and tf[1] >= .95))) # Use only BT.1886 black output offset setcfg("3dlut.apply_black_offset", int(tf[0][1] not in (-240, -709) and (not tf[0][0].startswith("Gamma") or tf[1] < .95) and self.XYZbpin != self.XYZbpout)) self.lut3d_trc_apply_black_offset_ctrl.Enable( tf[0][1] not in (-240, -709) and self.XYZbpin != self.XYZbpout) # Set gamma to profile gamma if single gamma # profile if tf[0][0].startswith("Gamma") and tf[1] >= .95: if not getcfg("3dlut.trc_gamma.backup", False): # Backup current gamma setcfg("3dlut.trc_gamma.backup", getcfg("3dlut.trc_gamma")) setcfg("3dlut.trc_gamma", round(tf[0][1], 2)) # Restore previous gamma if not single gamma # profile elif getcfg("3dlut.trc_gamma.backup", False): setcfg("3dlut.trc_gamma", getcfg("3dlut.trc_gamma.backup")) setcfg("3dlut.trc_gamma.backup", None) self.lut3d_update_trc_controls() elif (hasattr(self, "input_profile") and isinstance(self.input_profile.tags.get("A2B0"), ICCP.LUT16Type) and isinstance(self.input_profile.tags.get("A2B1", ICCP.LUT16Type()), ICCP.LUT16Type) and isinstance(self.input_profile.tags.get("A2B2", ICCP.LUT16Type()), ICCP.LUT16Type)): self.lut3d_trc_apply_black_offset_ctrl.Enable(self.XYZbpin != self.XYZbpout) if self.XYZbpin == self.XYZbpout: setcfg("3dlut.apply_black_offset", 0) else: self.lut3d_trc_apply_black_offset_ctrl.Disable() setcfg("3dlut.apply_black_offset", 0) if getcfg("3dlut.apply_black_offset"): self.lut3d_trc_apply_black_offset_ctrl.SetValue(True) elif getcfg("3dlut.apply_trc"): self.lut3d_trc_apply_ctrl.SetValue(True) else: self.lut3d_trc_apply_none_ctrl.SetValue(True) def lut3d_show_bitdepth_controls(self): frozen = self.IsFrozen() if not frozen: self.Freeze() show = True input_show = show and getcfg("3dlut.format") == "3dl" self.lut3d_bitdepth_input_label.Show(input_show) self.lut3d_bitdepth_input_ctrl.Show(input_show) output_show = show and getcfg("3dlut.format") in ("3dl", "png") self.lut3d_bitdepth_output_label.Show(output_show) self.lut3d_bitdepth_output_ctrl.Show(output_show) if isinstance(self, LUT3DFrame): self.panel.GetSizer().Layout() self.update_layout() else: self.update_scrollbars() if not frozen: self.Thaw() def lut3d_show_hdr_display_control(self): self.lut3d_hdr_display_ctrl.Show((getcfg("3dlut.apply_trc") or not hasattr(self, "lut3d_trc_apply_none_ctrl")) and getcfg("3dlut.trc").startswith("smpte2084") and getcfg("3dlut.format") == "madVR") def lut3d_show_trc_controls(self, show=True): self.panel.Freeze() show = show and self.worker.argyll_version >= [1, 6] if hasattr(self, "lut3d_trc_apply_ctrl"): self.lut3d_trc_apply_ctrl.Show(show) self.lut3d_trc_ctrl.Show(show) smpte2084 = getcfg("3dlut.trc").startswith("smpte2084") hlg = getcfg("3dlut.trc") == "hlg" hdr = smpte2084 or hlg show = show and (getcfg("3dlut.trc") == "customgamma" or (isinstance(self, LUT3DFrame) or getcfg("show_advanced_options"))) self.lut3d_trc_gamma_label.Show(show and not hdr) self.lut3d_trc_gamma_ctrl.Show(show and not hdr) smpte2084r = getcfg("3dlut.trc") == "smpte2084.rolloffclip" # Show items in this order so we end up with the correct controls shown showcc = (smpte2084r or hlg) and (isinstance(self, LUT3DFrame) or getcfg("show_advanced_options")) self.lut3d_content_colorspace_label.ContainingSizer.ShowItems(showcc) sel = self.lut3d_content_colorspace_ctrl.Selection lastsel = self.lut3d_content_colorspace_ctrl.Count - 1 sizer = self.lut3d_content_colorspace_red_x.ContainingSizer sizer.ShowItems(showcc and sel == lastsel) self.lut3d_hdr_minmll_label.Show(show and smpte2084) self.lut3d_hdr_minmll_ctrl.Show(show and smpte2084) self.lut3d_hdr_minmll_ctrl_label.Show(show and smpte2084) self.lut3d_hdr_maxmll_label.Show(show and smpte2084r) self.lut3d_hdr_maxmll_ctrl.Show(show and smpte2084r) self.lut3d_hdr_maxmll_ctrl_label.Show(show and smpte2084r) self.lut3d_hdr_diffuse_white_label.Show(show and smpte2084r) self.lut3d_hdr_diffuse_white_txt.Show(show and smpte2084r) self.lut3d_hdr_diffuse_white_txt_label.Show(show and smpte2084r) self.lut3d_hdr_ambient_luminance_label.Show(show and hlg) self.lut3d_hdr_ambient_luminance_ctrl.Show(show and hlg) self.lut3d_hdr_ambient_luminance_ctrl_label.Show(show and hlg) self.lut3d_hdr_system_gamma_label.Show(show and hlg) self.lut3d_hdr_system_gamma_txt.Show(show and hlg) show = (show or smpte2084) and not hlg show = show and ((hasattr(self, "lut3d_create_cb") and getcfg("3dlut.create")) or self.XYZbpout > [0, 0, 0]) self.lut3d_trc_gamma_type_ctrl.Show(show and not hdr) self.lut3d_trc_black_output_offset_label.Show(show) self.lut3d_trc_black_output_offset_ctrl.Show(show) self.lut3d_trc_black_output_offset_intctrl.Show(show) self.lut3d_trc_black_output_offset_intctrl_label.Show(show) self.lut3d_hdr_peak_luminance_label.Show(smpte2084) self.lut3d_hdr_peak_luminance_ctrl.Show(smpte2084) self.lut3d_hdr_peak_luminance_ctrl_label.Show(smpte2084) self.lut3d_show_hdr_display_control() self.panel.Layout() self.panel.Thaw() if isinstance(self, LUT3DFrame): self.update_layout() def lut3d_show_encoding_controls(self, show=True): show = show and ((self.worker.argyll_version >= [1, 7] and self.worker.argyll_version != [1, 7, 0, "_beta"]) or self.worker.argyll_version >= [1, 6]) # Argyll 1.7 beta 3 (2015-04-02) added clip WTW on input TV encoding self.encoding_input_label.Show(show) self.encoding_input_ctrl.Show(show) show = show and self.worker.argyll_version >= [1, 6] self.encoding_output_label.Show(show) self.encoding_output_ctrl.Show(show) def lut3d_update_encoding_controls(self): self.lut3d_setup_encoding_ctrl() self.encoding_input_ctrl.SetSelection(self.encoding_input_ba[getcfg("3dlut.encoding.input")]) self.encoding_input_ctrl.Enable(self.encoding_input_ctrl.Count > 1) self.encoding_output_ctrl.SetSelection(self.encoding_output_ba[getcfg("3dlut.encoding.output")]) self.encoding_output_ctrl.Enable(getcfg("3dlut.format") != "madVR") def lut3d_enable_size_controls(self): self.lut3d_size_ctrl.Enable(getcfg("3dlut.format") not in ("eeColor", "madVR")) def main(): config.initcfg("3DLUT-maker") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = LUT3DFrame(setup=False) if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() app.TopWindow.setup() app.TopWindow.Show() if __name__ == "__main__": main() DisplayCAL-3.5.0.0/DisplayCAL/wxLUTViewer.py0000644000076500000000000021120013226307131020174 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import math import os import re import subprocess as sp import sys import tempfile import numpy from argyll_cgats import cal_to_fake_profile, vcgt_to_cal from config import (fs_enc, get_argyll_display_number, get_data_path, get_display_profile, get_display_rects, getcfg, geticon, get_verified_path, setcfg) from log import safe_print from meta import name as appname from options import debug from util_decimal import float2dec from util_os import waccess from util_str import safe_unicode from worker import (Error, UnloggedError, UnloggedInfo, Worker, get_argyll_util, make_argyll_compatible_path, show_result_dialog) from wxaddons import get_platform_window_decoration_size, wx from wxMeasureFrame import MeasureFrame from wxwindows import (BaseApp, BaseFrame, BitmapBackgroundPanelText, CustomCheckBox, FileDrop, InfoDialog, TooltipWindow) from wxfixes import GenBitmapButton as BitmapButton, wx_Panel import colormath import config import wxenhancedplot as plot import localization as lang import ICCProfile as ICCP BGCOLOUR = "#333333" FGCOLOUR = "#999999" GRIDCOLOUR = "#444444" if sys.platform == "darwin": FONTSIZE_LARGE = 11 FONTSIZE_SMALL = 10 else: FONTSIZE_LARGE = 9 FONTSIZE_SMALL = 8 class CoordinateType(list): """ List of coordinates. [(Y, x)] where Y is in the range 0..100 and x in the range 0..255 """ def __init__(self, profile=None): self.profile = profile self._transfer_function = {} def get_gamma(self, use_vmin_vmax=False, average=True, least_squares=False, slice=(0.01, 0.99)): """ Return average or least squares gamma or a list of gamma values """ if len(self): start = slice[0] * 100 end = slice[1] * 100 values = [] for i, (y, x) in enumerate(self): n = colormath.XYZ2Lab(0, y, 0)[0] if n >= start and n <= end: values.append((x / 255.0 * 100, y)) else: # Identity if average or least_squares: return 1.0 return [1.0] vmin = 0 vmax = 100.0 if use_vmin_vmax: if len(self) > 2: vmin = self[0][0] vmax = self[-1][0] return colormath.get_gamma(values, 100.0, vmin, vmax, average, least_squares) def get_transfer_function(self, best=True, slice=(0.05, 0.95), outoffset=None): """ Return transfer function name, exponent and match percentage """ transfer_function = self._transfer_function.get((best, slice)) if transfer_function: return transfer_function xp = [] fp = [] for y, x in self: xp.append(x) fp.append(y) interp = colormath.Interp(xp, fp, use_numpy=True) otrc = ICCP.CurveType(profile=self.profile) for i in xrange(len(self)): otrc.append(interp(i / (len(self) - 1.0) * 255) / 100 * 65535) match = otrc.get_transfer_function(best, slice, outoffset=outoffset) self._transfer_function[(best, slice)] = match return match def set_trc(self, power=2.2, values=(), vmin=0, vmax=100): """ Set the response to a certain function. Positive power, or -2.4 = sRGB, -3.0 = L*, -240 = SMPTE 240M, -601 = Rec. 601, -709 = Rec. 709 (Rec. 601 and 709 transfer functions are identical) """ self[:] = [[y, x] for y, x in values] for i in xrange(len(self)): self[i][0] = vmin + colormath.specialpow(self[i][1] / 255.0, power) * (vmax - vmin) class PolyBox(plot.PolyLine): def __init__(self, x, y, w, h, **attr): plot.PolyLine.__init__(self, [(x, y), (x + w, y), (x + w, y + h), (x, y + h), (x, y)], **attr) class LUTCanvas(plot.PlotCanvas): def __init__(self, *args, **kwargs): plot.PlotCanvas.__init__(self, *args, **kwargs) self.Unbind(wx.EVT_SCROLL_THUMBTRACK) self.Unbind(wx.EVT_SCROLL_PAGEUP) self.Unbind(wx.EVT_SCROLL_PAGEDOWN) self.Unbind(wx.EVT_SCROLL_LINEUP) self.Unbind(wx.EVT_SCROLL_LINEDOWN) self.HandCursor = wx.StockCursor(wx.CURSOR_CROSS) self.GrabHandCursor = wx.StockCursor(wx.CURSOR_SIZING) self.SetBackgroundColour(BGCOLOUR) self.SetEnableAntiAliasing(True) self.SetEnableHiRes(True) self.SetEnableCenterLines(True) self.SetEnableDiagonals('Bottomleft-Topright') self.SetEnableDrag(True) self.SetEnableGrid(False) self.SetEnablePointLabel(True) self.SetEnableTitle(False) self.SetForegroundColour(FGCOLOUR) self.SetFontSizeAxis(FONTSIZE_SMALL) self.SetFontSizeLegend(FONTSIZE_SMALL) self.SetFontSizeTitle(FONTSIZE_LARGE) self.SetGridColour(GRIDCOLOUR) self.setLogScale((False,False)) self.SetPointLabelFunc(self.DrawPointLabel) self.canvas.BackgroundColour = BGCOLOUR if sys.platform == "win32" and sys.getwindowsversion() >= (6, ): # Enable/disable double buffering on-the-fly to make pointlabel work self.canvas.Bind(wx.EVT_ENTER_WINDOW, self._disabledoublebuffer) self.canvas.Bind(wx.EVT_LEAVE_WINDOW, self._enabledoublebuffer) self.worker = Worker(self.TopLevelParent) self.errors = [] self.resetzoom() def DrawLUT(self, vcgt=None, title=None, xLabel=None, yLabel=None, r=True, g=True, b=True): if not title: title = "" if not xLabel: xLabel = "" if not yLabel: yLabel = "" detect_increments = False Plot = plot.PolyLine Plot._attributes["width"] = 1 maxv = 65535 linear_points = [] axis_y = 255.0 if xLabel in ("L*", "Y"): axis_x = 100.0 else: axis_x = 255.0 if getattr(self, "axis_x", None) != (0, axis_x): wx.CallAfter(self.center) self.axis_x, self.axis_y = (0, axis_x), (0, axis_y) if not self.last_draw: self.center_x = axis_x / 2.0 self.center_y = axis_y / 2.0 self.proportional = False self.spec_x = self.spec_y = 5 lines = [PolyBox(0, 0, axis_x, axis_y, colour=GRIDCOLOUR, width=1)] self.point_grid = [{}, {}, {}] if not vcgt: irange = range(0, 256) elif "data" in vcgt: # table data = list(vcgt['data']) while len(data) < 3: data.append(data[0]) r_points = [] g_points = [] b_points = [] if (not isinstance(vcgt, ICCP.VideoCardGammaTableType) and not isinstance(data[0], ICCP.CurveType)): # Coordinate list irange = range(0, len(data[0])) for i in xrange(len(data)): if i == 0 and r: for n, y in data[i]: if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) r_points.append([n, y]) self.point_grid[i][n] = y elif i == 1 and g: for n, y in data[i]: if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) g_points.append([n, y]) self.point_grid[i][n] = y elif i == 2 and b: for n, y in data[i]: if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) b_points.append([n, y]) self.point_grid[i][n] = y else: irange = range(0, vcgt['entryCount']) maxv = math.pow(256, vcgt['entrySize']) - 1 for i in irange: j = i * (axis_y / (vcgt['entryCount'] - 1)) if not detect_increments: linear_points.append([j, j]) if r: n = float(data[0][i]) / maxv * axis_x if not detect_increments or not r_points or \ i == vcgt['entryCount'] - 1 or n != i: if detect_increments and n != i and \ len(r_points) == 1 and i > 1 and \ r_points[-1][0] == r_points[-1][1]: r_points.append([i - 1, i - 1]) if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): r_points.append([n, j]) self.point_grid[0][n] = j else: r_points.append([j, n]) self.point_grid[0][j] = n if g: n = float(data[1][i]) / maxv * axis_x if not detect_increments or not g_points or \ i == vcgt['entryCount'] - 1 or n != i: if detect_increments and n != i and \ len(g_points) == 1 and i > 1 and \ g_points[-1][0] == g_points[-1][1]: g_points.append([i - 1, i - 1]) if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): g_points.append([n, j]) self.point_grid[1][n] = j else: g_points.append([j, n]) self.point_grid[1][j] = n if b: n = float(data[2][i]) / maxv * axis_x if not detect_increments or not b_points or \ i == vcgt['entryCount'] - 1 or n != i: if detect_increments and n != i and \ len(b_points) == 1 and i > 1 and \ b_points[-1][0] == b_points[-1][1]: b_points.append([i - 1, i - 1]) if xLabel == "L*": n = colormath.XYZ2Lab(0, n / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): b_points.append([n, j]) self.point_grid[2][n] = j else: b_points.append([j, n]) self.point_grid[2][j] = n else: # formula irange = range(0, 256) step = 100.0 / axis_y r_points = [] g_points = [] b_points = [] for i in irange: # float2dec(v) fixes miniscule deviations in the calculated gamma # n = float2dec(n, 8) if not detect_increments: linear_points.append([i, (i)]) if r: vmin = float2dec(vcgt["redMin"] * axis_x) v = float2dec(math.pow(step * i / 100.0, vcgt["redGamma"])) vmax = float2dec(vcgt["redMax"] * axis_x) n = vmin + v * (vmax - vmin) if xLabel == "L*": n = colormath.XYZ2Lab(0, float(n) / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): r_points.append([n, i]) self.point_grid[0][n] = i else: r_points.append([i, n]) self.point_grid[0][i] = n if g: vmin = float2dec(vcgt["greenMin"] * axis_x) v = float2dec(math.pow(step * i / 100.0, vcgt["greenGamma"])) vmax = float2dec(vcgt["greenMax"] * axis_x) n = vmin + v * (vmax - vmin) if xLabel == "L*": n = colormath.XYZ2Lab(0, float(n) / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): g_points.append([n, i]) self.point_grid[1][n] = i else: g_points.append([i, n]) self.point_grid[1][i] = n if b: vmin = float2dec(vcgt["blueMin"] * axis_x) v = float2dec(math.pow(step * i / 100.0, vcgt["blueGamma"])) vmax = float2dec(vcgt["blueMax"] * axis_x) n = vmin + v * (vmax - vmin) if xLabel == "L*": n = colormath.XYZ2Lab(0, float(n) / axis_x * 100, 0)[0] * (axis_x / 100.0) if xLabel in ("L*", "Y"): b_points.append([n, i]) self.point_grid[2][n] = i else: b_points.append([i, n]) self.point_grid[2][i] = n #for n in sorted(self.point_grid[0].keys()): #print n, self.point_grid[0].get(n), self.point_grid[1].get(n), self.point_grid[2].get(n) self.entryCount = irange[-1] + 1 linear = [[0, 0], [irange[-1], irange[-1]]] if not vcgt: if detect_increments: r_points = g_points = b_points = linear else: r_points = g_points = b_points = linear_points # Note: We need to make sure each point is a float because it # might be a decimal.Decimal, which can't be divided by floats! self.r_unique = len(set(round(float(y) / axis_y * irange[-1]) for x, y in r_points)) self.g_unique = len(set(round(float(y) / axis_y * irange[-1]) for x, y in g_points)) self.b_unique = len(set(round(float(y) / axis_y * irange[-1]) for x, y in b_points)) legend = [] colour = None if r and g and b and r_points == g_points == b_points: colour = 'white' points = r_points legend.append('R') legend.append('G') legend.append('B') elif r and g and r_points == g_points: colour = 'yellow' points = r_points legend.append('R') legend.append('G') elif r and b and r_points == b_points: colour = 'magenta' points = b_points legend.append('R') legend.append('B') elif g and b and g_points == b_points: colour = 'cyan' points = b_points legend.append('G') legend.append('B') else: if r: legend.append('R') if g: legend.append('G') if b: legend.append('B') linear_points = [(i, int(round(v / axis_y * maxv))) for i, v in linear_points] if colour and points: # Note: We need to make sure each point is a float because it # might be a decimal.Decimal, which can't be divided by floats! points_quantized = [(i, int(round(float(v) / axis_y * maxv))) for i, v in points] suffix = ((', ' + lang.getstr('linear').capitalize()) if points_quantized == (linear if detect_increments else linear_points) else '') lines.append(Plot(points, legend='='.join(legend) + suffix, colour=colour)) if colour != 'white': if r and colour not in ('yellow', 'magenta'): # Note: We need to make sure each point is a float because it # might be a decimal.Decimal, which can't be divided by floats! points_quantized = [(i, int(round(float(v) / axis_y * maxv))) for i, v in r_points] suffix = ((', ' + lang.getstr('linear').capitalize()) if points_quantized == (linear if detect_increments else linear_points) else '') lines.append(Plot(r_points, legend='R' + suffix, colour='red')) if g and colour not in ('yellow', 'cyan'): # Note: We need to make sure each point is a float because # it might be a decimal.Decimal, which can't be divided by floats! points_quantized = [(i, int(round(float(v) / axis_y * maxv))) for i, v in g_points] suffix = ((', ' + lang.getstr('linear').capitalize()) if points_quantized == (linear if detect_increments else linear_points) else '') lines.append(Plot(g_points, legend='G' + suffix, colour='green')) if b and colour not in ('cyan', 'magenta'): # Note: We need to make sure each point is a float because # it might be a decimal.Decimal, which can't be divided by floats! points_quantized = [(i, int(round(float(v) / axis_y * maxv))) for i, v in b_points] suffix = ((', ' + lang.getstr('linear').capitalize()) if points_quantized == (linear if detect_increments else linear_points) else '') lines.append(Plot(b_points, legend='B' + suffix, colour='#0080FF')) self._DrawCanvas(plot.PlotGraphics(lines, title, " ".join([xLabel, lang.getstr("in")]), " ".join([yLabel, lang.getstr("out")]))) def DrawPointLabel(self, dc, mDataDict): """ Draw point labels. dc - DC that will be passed mDataDict - Dictionary of data that you want to use for the pointLabel """ if not self.last_draw: return graphics, xAxis, yAxis= self.last_draw # sizes axis to axis type, create lower left and upper right corners of plot if xAxis is None or yAxis is None: # One or both axis not specified in Draw p1, p2 = graphics.boundingBox() # min, max points of graphics if xAxis is None: xAxis = self._axisInterval(self._xSpec, p1[0], p2[0]) # in user units if yAxis is None: yAxis = self._axisInterval(self._ySpec, p1[1], p2[1]) # Adjust bounding box for axis spec p1[0],p1[1] = xAxis[0], yAxis[0] # lower left corner user scale (xmin,ymin) p2[0],p2[1] = xAxis[1], yAxis[1] # upper right corner user scale (xmax,ymax) else: # Both axis specified in Draw p1= plot._Numeric.array([xAxis[0], yAxis[0]]) # lower left corner user scale (xmin,ymin) p2= plot._Numeric.array([xAxis[1], yAxis[1]]) # upper right corner user scale (xmax,ymax) ptx,pty,rectWidth,rectHeight= self._point2ClientCoord(p1, p2) # allow graph to overlap axis lines by adding units to width and height dc.SetClippingRegion(ptx,pty,rectWidth+2,rectHeight+2) dc.SetPen(wx.Pen(wx.WHITE, 1, wx.DOT)) dc.SetBrush(wx.Brush( wx.WHITE, wx.SOLID ) ) sx, sy = mDataDict["scaledXY"] # Scaled x, y of closest point dc.DrawLine(0, sy, ptx+rectWidth+2, sy) dc.DrawLine(sx, 0, sx, pty+rectHeight+2) def GetClosestPoints(self, pntXY, pointScaled= True): """Returns list with [curveNumber, legend, index of closest point, pointXY, scaledXY, distance] list for each curve. Returns [] if no curves are being plotted. x, y in user coords if pointScaled == True based on screen coords if pointScaled == False based on user coords """ if self.last_draw is None: #no graph available return [] graphics, xAxis, yAxis= self.last_draw l = [] for curveNum,obj in enumerate(graphics): #check there are points in the curve if len(obj.points) == 0 or isinstance(obj, PolyBox): continue #go to next obj #[curveNumber, legend, index of closest point, pointXY, scaledXY, distance] cn = [curveNum]+ [obj.getLegend()]+ obj.getClosestPoint( pntXY, pointScaled) l.append(cn) return l def _disabledoublebuffer(self, event): window = self while window: if not isinstance(window, wx.TopLevelWindow): window.SetDoubleBuffered(False) window = window.Parent event.Skip() def _enabledoublebuffer(self, event): window = self while window: if not isinstance(window, wx.TopLevelWindow): window.SetDoubleBuffered(True) window = window.Parent event.Skip() def OnMouseDoubleClick(self, event): if self.last_draw: boundingbox = self.last_draw[0].boundingBox() else: boundingbox = None self.resetzoom(boundingbox=boundingbox) if self.last_draw: self.center() def OnMouseLeftDown(self,event): self.erase_pointlabel() self._zoomCorner1[0], self._zoomCorner1[1]= self._getXY(event) self._screenCoordinates = plot._Numeric.array(event.GetPosition()) if self._dragEnabled: self.SetCursor(self.GrabHandCursor) self.canvas.CaptureMouse() def OnMouseLeftUp(self, event): if self._dragEnabled: self.SetCursor(self.HandCursor) if self.canvas.HasCapture(): self.canvas.ReleaseMouse() self._set_center() if hasattr(self.TopLevelParent, "OnMotion"): self.TopLevelParent.OnMotion(event) def _DrawCanvas(self, graphics): """ Draw proportionally correct, center and zoom """ w = float(self.GetSize()[0] or 1) h = float(self.GetSize()[1] or 1) if w > 45: w -= 45 if h > 20: h -= 20 ratio = [w / h, h / w] axis_x, axis_y = self.axis_x, self.axis_y spec_x = self.spec_x spec_y = self.spec_y if self._zoomfactor < 1: while spec_x * self._zoomfactor < self.spec_x / 2.0: spec_x *= 2 while spec_y * self._zoomfactor < self.spec_y / 2.0: spec_y *= 2 else: while spec_x * self._zoomfactor > self.spec_x * 2: spec_x /= 2 while spec_y * self._zoomfactor > self.spec_y * 2: spec_y /= 2 if self.proportional: if ratio[0] > ratio[1]: self.SetXSpec(spec_x * self._zoomfactor * ratio[0]) else: self.SetXSpec(spec_x * self._zoomfactor) if ratio[0] > 1: axis_x=tuple([v * ratio[0] for v in axis_x]) if ratio[1] > ratio[0]: self.SetYSpec(spec_y * self._zoomfactor * ratio[1]) else: self.SetYSpec(spec_y * self._zoomfactor) if ratio[1] > 1: axis_y=tuple([v * ratio[1] for v in axis_y]) else: self.SetXSpec(spec_x * self._zoomfactor) self.SetYSpec(spec_y * self._zoomfactor) x, y = self.center_x, self.center_y w = (axis_x[1] - axis_x[0]) * self._zoomfactor h = (axis_y[1] - axis_y[0]) * self._zoomfactor axis_x = (x - w / 2, x + w / 2) axis_y = (y - h / 2, y + h / 2) self.Draw(graphics, axis_x, axis_y) def _set_center(self): """ Set center position from current X and Y axis """ if not self.last_draw: return axis_x = self.GetXCurrentRange() axis_y = self.GetYCurrentRange() if axis_x[0] < 0: if axis_x[1] < 0: x = axis_x[0] + (abs(axis_x[0]) - abs(axis_x[1])) / 2.0 else: x = axis_x[0] + (abs(axis_x[1]) + abs(axis_x[0])) / 2.0 else: x = axis_x[0] + (abs(axis_x[1]) - abs(axis_x[0])) / 2.0 if axis_y[0] < 0: if axis_y[1] < 0: y = axis_y[0] + (abs(axis_y[0]) - abs(axis_y[1])) / 2.0 else: y = axis_y[0] + (abs(axis_y[1]) + abs(axis_y[0])) / 2.0 else: y = axis_y[0] + (abs(axis_y[1]) - abs(axis_y[0])) / 2.0 self.center_x, self.center_y = x, y def center(self, boundingbox=None): """ Center the current graphic """ if boundingbox: # Min, max points of graphics p1, p2 = boundingbox # In user units min_x, max_x = self._axisInterval(self._xSpec, p1[0], p2[0]) min_y, max_y = self._axisInterval(self._ySpec, p1[1], p2[1]) else: min_x, max_x = self.GetXMaxRange() min_y, max_y = self.GetYMaxRange() self.center_x = 0 + sum((min_x, max_x)) / 2.0 self.center_y = 0 + sum((min_y, max_y)) / 2.0 if not boundingbox: self.erase_pointlabel() self._DrawCanvas(self.last_draw[0]) def erase_pointlabel(self): if self.GetEnablePointLabel() and self.last_PointLabel: # Erase point label self._drawPointLabel(self.last_PointLabel) self.last_PointLabel = None def resetzoom(self, boundingbox=None): self.center_x = 0 self.center_y = 0 self._zoomfactor = 1.0 if boundingbox: # Min, max points of graphics p1, p2 = boundingbox # In user units min_x, max_x = self._axisInterval(self._xSpec, p1[0], p2[0]) min_y, max_y = self._axisInterval(self._ySpec, p1[1], p2[1]) max_abs_x = abs(min_x) + max_x max_abs_y = abs(min_y) + max_y max_abs_axis_x = (abs(self.axis_x[0]) + self.axis_x[1]) max_abs_axis_y = (abs(self.axis_y[0]) + self.axis_y[1]) w = float(self.GetSize()[0] or 1) h = float(self.GetSize()[1] or 1) if w > 45: w -= 45 if h > 20: h -= 20 ratio = [w / h, h / w] if ratio[0] > 1: max_abs_axis_x *= ratio[0] if ratio[1] > 1: max_abs_axis_y *= ratio[1] if max_abs_x / max_abs_y > max_abs_axis_x / max_abs_axis_y: self._zoomfactor = max_abs_x / max_abs_axis_x else: self._zoomfactor = max_abs_y / max_abs_axis_y def zoom(self, direction=1): _zoomfactor = .025 * direction if (self._zoomfactor + _zoomfactor > 0 and self._zoomfactor + _zoomfactor <= 5): self._zoomfactor += _zoomfactor self._set_center() self.erase_pointlabel() self._DrawCanvas(self.last_draw[0]) class LUTFrame(BaseFrame): def __init__(self, *args, **kwargs): if len(args) < 3 and not "title" in kwargs: kwargs["title"] = lang.getstr("calibration.lut_viewer.title") if not "name" in kwargs: kwargs["name"] = "lut_viewer" BaseFrame.__init__(self, *args, **kwargs) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-curve-viewer")) self.profile = None self.xLabel = lang.getstr("in") self.yLabel = lang.getstr("out") self.sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.sizer) panel = wx_Panel(self) panel.SetBackgroundColour(BGCOLOUR) self.sizer.Add(panel, flag=wx.EXPAND) panel.SetSizer(wx.FlexGridSizer(0, 5, 0, 8)) panel.Sizer.AddGrowableCol(0) panel.Sizer.AddGrowableCol(4) panel.Sizer.Add((1,1)) panel.Sizer.Add((1,12)) panel.Sizer.Add((1,12)) panel.Sizer.Add((1,12)) panel.Sizer.Add((1,1)) panel.Sizer.Add((1,1)) self.plot_mode_select = wx.Choice(panel, -1, size=(-1, -1), choices=[]) panel.Sizer.Add(self.plot_mode_select, flag=wx.ALIGN_CENTER_VERTICAL) self.Bind(wx.EVT_CHOICE, self.plot_mode_select_handler, id=self.plot_mode_select.GetId()) self.tooltip_btn = BitmapButton(panel, -1, geticon(16, "question-inverted"), style=wx.NO_BORDER) self.tooltip_btn.SetBackgroundColour(BGCOLOUR) self.tooltip_btn.Bind(wx.EVT_BUTTON, self.tooltip_handler) self.tooltip_btn.SetToolTipString(lang.getstr("gamut_plot.tooltip")) panel.Sizer.Add(self.tooltip_btn, flag=wx.ALIGN_CENTER_VERTICAL) self.save_plot_btn = BitmapButton(panel, -1, geticon(16, "image-x-generic-inverted"), style=wx.NO_BORDER) self.save_plot_btn.SetBackgroundColour(BGCOLOUR) panel.Sizer.Add(self.save_plot_btn, flag=wx.ALIGN_CENTER_VERTICAL) self.save_plot_btn.Bind(wx.EVT_BUTTON, self.SaveFile) self.save_plot_btn.SetToolTipString(lang.getstr("save_as") + " " + "(*.bmp, *.xbm, *.xpm, *.jpg, *.png)") self.save_plot_btn.Disable() panel.Sizer.Add((1,1)) panel.Sizer.Add((1,1)) panel.Sizer.Add((1,4)) panel.Sizer.Add((1,4)) panel.Sizer.Add((1,4)) panel.Sizer.Add((1,1)) self.client = LUTCanvas(self) self.sizer.Add(self.client, 1, wx.EXPAND) self.box_panel = wx_Panel(self) self.box_panel.SetBackgroundColour(BGCOLOUR) self.sizer.Add(self.box_panel, flag=wx.EXPAND) self.status = BitmapBackgroundPanelText(self, name="statuspanel") self.status.SetMaxFontSize(11) self.status.label_y = 8 self.status.textshadow = False self.status.SetBackgroundColour(BGCOLOUR) self.status.SetForegroundColour(FGCOLOUR) h = self.status.GetTextExtent("Ig")[1] self.status.SetMinSize((0, h * 2 + 18)) self.sizer.Add(self.status, flag=wx.EXPAND) self.box_sizer = wx.FlexGridSizer(0, 3, 4, 4) self.box_sizer.AddGrowableCol(0) self.box_sizer.AddGrowableCol(2) self.box_panel.SetSizer(self.box_sizer) self.box_sizer.Add((0, 0)) hsizer = wx.BoxSizer(wx.HORIZONTAL) self.box_sizer.Add(hsizer, flag=wx.ALIGN_CENTER | wx.BOTTOM | wx.TOP, border=4) self.rendering_intent_select = wx.Choice(self.box_panel, -1, choices=[lang.getstr("gamap.intents.a"), lang.getstr("gamap.intents.r"), lang.getstr("gamap.intents.p"), lang.getstr("gamap.intents.s")]) hsizer.Add((10, self.rendering_intent_select.Size[1])) hsizer.Add(self.rendering_intent_select, flag=wx.ALIGN_CENTER_VERTICAL) self.rendering_intent_select.Bind(wx.EVT_CHOICE, self.rendering_intent_select_handler) self.rendering_intent_select.SetSelection(1) self.direction_select = wx.Choice(self.box_panel, -1, choices=[lang.getstr("direction.backward"), lang.getstr("direction.forward.inverted")]) hsizer.Add(self.direction_select, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10) self.direction_select.Bind(wx.EVT_CHOICE, self.direction_select_handler) self.direction_select.SetSelection(0) self.show_actual_lut_cb = CustomCheckBox(self.box_panel, -1, lang.getstr("calibration.show_actual_lut")) self.show_actual_lut_cb.SetForegroundColour(FGCOLOUR) self.show_actual_lut_cb.SetMaxFontSize(11) hsizer.Add(self.show_actual_lut_cb, flag=wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL) self.show_actual_lut_cb.Bind(wx.EVT_CHECKBOX, self.show_actual_lut_handler) self.box_sizer.Add((0, 0)) self.box_sizer.Add((0, 0)) self.cbox_sizer = wx.BoxSizer(wx.HORIZONTAL) self.box_sizer.Add(self.cbox_sizer, flag=wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL | wx.TOP, border=4) self.box_sizer.Add((0, 0)) self.cbox_sizer.Add((10, 0)) self.reload_vcgt_btn = BitmapButton(self.box_panel, -1, geticon(16, "stock_refresh-inverted"), style=wx.NO_BORDER) self.reload_vcgt_btn.SetBackgroundColour(BGCOLOUR) self.cbox_sizer.Add(self.reload_vcgt_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=8) self.reload_vcgt_btn.Bind(wx.EVT_BUTTON, self.reload_vcgt_handler) self.reload_vcgt_btn.SetToolTipString( lang.getstr("calibration.load_from_display_profile")) self.reload_vcgt_btn.Disable() self.apply_bpc_btn = BitmapButton(self.box_panel, -1, geticon(16, "color-inverted"), style=wx.NO_BORDER) self.apply_bpc_btn.SetBackgroundColour(BGCOLOUR) self.cbox_sizer.Add(self.apply_bpc_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=8) self.apply_bpc_btn.Bind(wx.EVT_BUTTON, self.apply_bpc_handler) self.apply_bpc_btn.SetToolTipString(lang.getstr("black_point_compensation")) self.apply_bpc_btn.Disable() self.install_vcgt_btn = BitmapButton(self.box_panel, -1, geticon(16, "install-inverted"), style=wx.NO_BORDER) self.install_vcgt_btn.SetBackgroundColour(BGCOLOUR) self.cbox_sizer.Add(self.install_vcgt_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=8) self.install_vcgt_btn.Bind(wx.EVT_BUTTON, self.install_vcgt_handler) self.install_vcgt_btn.SetToolTipString(lang.getstr("apply_cal")) self.install_vcgt_btn.Disable() self.save_vcgt_btn = BitmapButton(self.box_panel, -1, geticon(16, "document-save-as-inverted"), style=wx.NO_BORDER) self.save_vcgt_btn.SetBackgroundColour(BGCOLOUR) self.cbox_sizer.Add(self.save_vcgt_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=20) self.save_vcgt_btn.Bind(wx.EVT_BUTTON, self.SaveFile) self.save_vcgt_btn.SetToolTipString(lang.getstr("save_as") + " " + "(*.cal)") self.save_vcgt_btn.Disable() self.show_as_L = CustomCheckBox(self.box_panel, -1, u"L* \u2192") self.show_as_L.SetForegroundColour(FGCOLOUR) self.show_as_L.SetMaxFontSize(11) self.show_as_L.SetValue(True) self.cbox_sizer.Add(self.show_as_L, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=4) self.show_as_L.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.toggle_red = CustomCheckBox(self.box_panel, -1, "R") self.toggle_red.SetForegroundColour(FGCOLOUR) self.toggle_red.SetMaxFontSize(11) self.toggle_red.SetValue(True) self.cbox_sizer.Add(self.toggle_red, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_red.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.cbox_sizer.Add((4, 0)) self.toggle_green = CustomCheckBox(self.box_panel, -1, "G") self.toggle_green.SetForegroundColour(FGCOLOUR) self.toggle_green.SetMaxFontSize(11) self.toggle_green.SetValue(True) self.cbox_sizer.Add(self.toggle_green, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_green.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.cbox_sizer.Add((4, 0)) self.toggle_blue = CustomCheckBox(self.box_panel, -1, "B") self.toggle_blue.SetForegroundColour(FGCOLOUR) self.toggle_blue.SetMaxFontSize(11) self.toggle_blue.SetValue(True) self.cbox_sizer.Add(self.toggle_blue, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_blue.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.toggle_clut = CustomCheckBox(self.box_panel, -1, "LUT") self.toggle_clut.SetForegroundColour(FGCOLOUR) self.toggle_clut.SetMaxFontSize(11) self.cbox_sizer.Add(self.toggle_clut, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=16) self.toggle_clut.Bind(wx.EVT_CHECKBOX, self.toggle_clut_handler) self.client.canvas.Bind(wx.EVT_MOTION, self.OnMotion) self.droptarget = FileDrop(self) self.droptarget.drophandlers = { ".cal": self.drop_handler, ".icc": self.drop_handler, ".icm": self.drop_handler } self.client.SetDropTarget(self.droptarget) border, titlebar = get_platform_window_decoration_size() self.MinSize = (config.defaults["size.lut_viewer.w"] + border * 2, config.defaults["size.lut_viewer.h"] + titlebar + border) self.SetSaneGeometry( getcfg("position.lut_viewer.x"), getcfg("position.lut_viewer.y"), getcfg("size.lut_viewer.w") + border * 2, getcfg("size.lut_viewer.h") + titlebar + border) self.Bind(wx.EVT_MOVE, self.OnMove) self.Bind(wx.EVT_SIZE, self.OnSize) children = self.GetAllChildren() self.Bind(wx.EVT_KEY_DOWN, self.key_handler) for child in children: if isinstance(child, wx.Choice): child.SetMaxFontSize(11) child.Bind(wx.EVT_KEY_DOWN, self.key_handler) child.Bind(wx.EVT_MOUSEWHEEL, self.OnWheel) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and isinstance(child, wx.Panel)): # No need to enable double buffering under Linux and Mac OS X. # Under Windows, enabling double buffering on the panel seems # to work best to reduce flicker. child.SetDoubleBuffered(True) self.display_no = -1 self.display_rects = get_display_rects() def apply_bpc_handler(self, event): cal = vcgt_to_cal(self.profile) cal.filename = self.profile.fileName or "" cal.apply_bpc(weight=True) self.LoadProfile(cal_to_fake_profile(cal)) def drop_handler(self, path): """ Drag'n'drop handler for .cal/.icc/.icm files. """ filename, ext = os.path.splitext(path) if ext.lower() not in (".icc", ".icm"): profile = cal_to_fake_profile(path) if not profile: InfoDialog(self, msg=lang.getstr("error.file.open", path), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) profile = None else: try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: InfoDialog(self, msg=lang.getstr("profile.invalid") + "\n" + path, ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) profile = None self.show_actual_lut_cb.SetValue(False) self.current_cal = profile self.LoadProfile(profile) get_display = MeasureFrame.__dict__["get_display"] def handle_errors(self): if self.client.errors: show_result_dialog(Error("\n\n".join(set(safe_unicode(error) for error in self.client.errors))), self) self.client.errors = [] def install_vcgt_handler(self, event): cwd = self.worker.create_tempdir() if isinstance(cwd, Exception): show_result_dialog(cwd, self) else: cal = os.path.join(cwd, re.sub(r"[\\/:*?\"<>|]+", "", make_argyll_compatible_path( self.profile.getDescription() or "Video LUT"))) vcgt_to_cal(self.profile).write(cal) cmd, args = self.worker.prepare_dispwin(cal) if isinstance(cmd, Exception): show_result_dialog(cmd, self) elif cmd: result = self.worker.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) if isinstance(result, Exception): show_result_dialog(result, self) elif not result: show_result_dialog(Error("".join(self.worker.errors)), self) # Important: # Make sure to only delete the temporary cal file we created try: os.remove(cal) except Exception, exception: safe_print(u"Warning - temporary file " u"'%s' could not be removed: %s" % tuple(safe_unicode(s) for s in (cal, exception))) def key_handler(self, event): # AltDown # CmdDown # ControlDown # GetKeyCode # GetModifiers # GetPosition # GetRawKeyCode # GetRawKeyFlags # GetUniChar # GetUnicodeKey # GetX # GetY # HasModifiers # KeyCode # MetaDown # Modifiers # Position # RawKeyCode # RawKeyFlags # ShiftDown # UnicodeKey # X # Y key = event.GetKeyCode() if (event.ControlDown() or event.CmdDown()): # CTRL (Linux/Mac/Windows) / CMD (Mac) if key == 83 and self.profile: # S self.SaveFile() return else: event.Skip() elif key in (43, wx.WXK_NUMPAD_ADD): # + key zoom in self.client.zoom(-1) elif key in (45, wx.WXK_NUMPAD_SUBTRACT): # - key zoom out self.client.zoom(1) else: event.Skip() def direction_select_handler(self, event): self.toggle_clut_handler(event) def rendering_intent_select_handler(self, event): self.toggle_clut_handler(event) def toggle_clut_handler(self, event): try: self.lookup_tone_response_curves() except Exception, exception: show_result_dialog(exception, self) else: self.trc = None self.DrawLUT() self.handle_errors() def tooltip_handler(self, event): if not hasattr(self, "tooltip_window"): self.tooltip_window = TooltipWindow(self, msg=event.EventObject.ToolTip.Tip, title=event.EventObject.TopLevelParent.Title, bitmap=geticon(32, "dialog-information")) else: self.tooltip_window.Show() self.tooltip_window.Raise() def show_actual_lut_handler(self, event): setcfg("lut_viewer.show_actual_lut", int(self.show_actual_lut_cb.GetValue())) if hasattr(self, "current_cal"): profile = self.current_cal else: profile = None self.load_lut(profile=profile) def load_lut(self, profile=None): self.current_cal = profile if (getcfg("lut_viewer.show_actual_lut") and (self.worker.argyll_version[0:3] > [1, 1, 0] or (self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string)) and not config.is_untethered_display()): tmp = self.worker.create_tempdir() if isinstance(tmp, Exception): show_result_dialog(tmp, self) return outfilename = os.path.join(tmp, re.sub(r"[\\/:*?\"<>|]+", "", make_argyll_compatible_path( config.get_display_name( include_geometry=True) or "Video LUT"))) result = self.worker.save_current_video_lut(self.worker.get_display(), outfilename, silent=not __name__ == "__main__") if not isinstance(result, Exception) and result: profile = cal_to_fake_profile(outfilename) else: if isinstance(result, Exception): safe_print(result) # Important: lut_viewer_load_lut is called after measurements, # so make sure to only delete the temporary cal file we created try: os.remove(outfilename) except Exception, exception: safe_print(u"Warning - temporary file " u"'%s' could not be removed: %s" % tuple(safe_unicode(s) for s in (outfilename, exception))) if profile and (profile.is_loaded or not profile.fileName or os.path.isfile(profile.fileName)): if not self.profile or \ self.profile.fileName != profile.fileName or \ not self.profile.isSame(profile): self.LoadProfile(profile) else: self.LoadProfile(None) def lookup_tone_response_curves(self, intent="r"): """ Lookup Y -> RGB tone values through TRC tags or LUT """ profile = self.profile if profile.connectionColorSpace == "RGB": mult = 1 else: mult = 4 size = 256 * mult # Final number of coordinates if hasattr(self, "rendering_intent_select"): intent = {0: "a", 1: "r", 2: "p", 3: "s"}.get(self.rendering_intent_select.GetSelection()) use_trc_tags = (intent == "r" and (not ("B2A0" in self.profile.tags or "A2B0" in self.profile.tags) or not self.toggle_clut.GetValue()) and isinstance(self.rTRC, ICCP.CurveType) and isinstance(self.gTRC, ICCP.CurveType) and isinstance(self.bTRC, ICCP.CurveType) and len(self.rTRC) == len(self.gTRC) == len(self.bTRC)) has_same_trc = self.rTRC == self.gTRC == self.bTRC if profile.version >= 4: self.client.errors.append(Error("\n".join([lang.getstr("profile.iccv4.unsupported"), profile.getDescription()]))) return if (profile.colorSpace not in ("RGB", "GRAY") or profile.connectionColorSpace not in ("Lab", "XYZ", "RGB")): if profile.colorSpace not in ("RGB", "GRAY"): unsupported_colorspace = profile.colorSpace else: unsupported_colorspace = profile.connectionColorSpace self.client.errors.append(Error(lang.getstr("profile.unsupported", (profile.profileClass, unsupported_colorspace)))) return if profile.colorSpace == "GRAY": direction = "b" elif profile.connectionColorSpace == "RGB": direction = "f" elif "B2A0" in profile.tags: direction = {0: "b", 1: "if", 2: "f", 3: "ib"}.get(self.direction_select.GetSelection()) else: direction = "if" # Prepare input Lab values XYZ_triplets = [] Lab_triplets = [] RGB_triplets = [] for i in xrange(0, size): if direction in ("b", "if"): ##if intent == "a": ### Experimental - basically this makes the resulting ### response match relative colorimetric ##X, Y, Z = colormath.Lab2XYZ(i * (100.0 / (size - 1)), 0, 0) ##L, a, b = colormath.XYZ2Lab(*[v * 100 for v in ##colormath.adapt(X, Y, Z, ##whitepoint_destination=profile.tags.wtpt.values())]) ##else: a = b = 0 Lab_triplets.append([i * (100.0 / (size - 1)), a, b]) else: RGB_triplets.append([i * (1.0 / (size - 1))] * 3) if profile.colorSpace == "GRAY": use_icclu = True pcs = "x" for Lab in Lab_triplets: XYZ_triplets.append(colormath.Lab2XYZ(*Lab)) elif profile.connectionColorSpace == "RGB": use_icclu = False pcs = None intent = None else: use_icclu = False pcs = "l" if direction in ("b", "if"): if pcs == "l": idata = Lab_triplets else: idata = XYZ_triplets else: idata = RGB_triplets order = {True: "n", False: "r"}.get(("B2A0" in self.profile.tags or "A2B0" in self.profile.tags) and self.toggle_clut.GetValue()) # Lookup values through 'input' profile using xicclu try: odata = self.worker.xicclu(profile, idata, intent, direction, order, pcs, use_icclu=use_icclu, get_clip=direction == "if") except Exception, exception: self.client.errors.append(Error(safe_unicode(exception))) if self.client.errors: return if direction in ("b", "if") or profile.connectionColorSpace == "RGB": if direction == "if": Lbp = self.worker.xicclu(profile, [[0, 0, 0]], intent, "f", order, "l", use_icclu=use_icclu)[0][0] maxval = size - 1.0 # Deal with values that got clipped (below black as well as white) do_low_clip = True for i, values in enumerate(odata): if values[3] is True or i == 0: if do_low_clip and (i / maxval * 100 < Lbp or i == 0): # Set to black values[:] = [0.0, 0.0, 0.0] elif (i == maxval and [round(v, 4) for v in values[:3]] == [1, 1, 1]): # Set to white values[:] = [1.0, 1.0, 1.0] else: # First non-clipping value disables low clipping do_low_clip = False if len(values) > 3: values.pop() RGB_triplets = odata else: Lab_triplets = odata self.rTRC = CoordinateType(self.profile) self.gTRC = CoordinateType(self.profile) self.bTRC = CoordinateType(self.profile) for j, RGB in enumerate(RGB_triplets): for i, v in enumerate(RGB): v = min(v, 1.0) if (not v and j < len(RGB_triplets) - 1 and not min(RGB_triplets[j + 1][i], 1.0)): continue v *= 255 if profile.connectionColorSpace == "RGB": x = j / (size - 1.0) * 255 if i == 0: self.rTRC.append([x, v]) elif i == 1: self.gTRC.append([x, v]) elif i == 2: self.bTRC.append([x, v]) else: X, Y, Z = colormath.Lab2XYZ(*Lab_triplets[j], **{"scale": 100}) if direction in ("b", "if"): X = Z = Y elif intent == "a": wp = profile.tags.wtpt.ir.values() X, Y, Z = colormath.adapt(X, Y, Z, wp, (1, 1, 1)) elif intent != "a": wp = profile.tags.wtpt.ir.values() X, Y, Z = colormath.adapt(X, Y, Z, "D50", (1, 1, 1)) if i == 0: self.rTRC.append([X, v]) elif i == 1: self.gTRC.append([Y, v]) elif i == 2: self.bTRC.append([Z, v]) if profile.connectionColorSpace == "RGB": return if use_trc_tags: if has_same_trc: self.bTRC = self.gTRC = self.rTRC return # Generate interpolated TRCs for transfer function detection for sig in ("rTRC", "gTRC", "bTRC"): x, xp, y, yp = [], [], [], [] # First, get actual values for i, (Y, v) in enumerate(getattr(self, sig)): ##if not i or Y >= trc[sig][i - 1]: xp.append(v) yp.append(Y) # Second, interpolate to given size and use the same y axis # for all channels for i in xrange(size): x.append(i / (size - 1.0) * 255) y.append(colormath.Lab2XYZ(i / (size - 1.0) * 100, 0, 0)[1] * 100) xi = numpy.interp(y, yp, xp) yi = numpy.interp(x, xi, y) setattr(self, "tf_" + sig, CoordinateType(self.profile)) for Y, v in zip(yi, x): if Y <= yp[0]: Y = yp[0] getattr(self, "tf_" + sig).append([Y, v]) def move_handler(self, event): if not self.IsShownOnScreen(): return display_no, geometry, client_area = self.get_display() if display_no != self.display_no: self.display_no = display_no # Translate from wx display index to Argyll display index n = get_argyll_display_number(geometry) if n is not None: # Save Argyll display index to configuration setcfg("display.number", n + 1) # Load profile self.load_lut(get_display_profile(n)) event.Skip() def plot_mode_select_handler(self, event): #self.client.resetzoom() self.DrawLUT() def get_commands(self): return self.get_common_commands() + ["curve-viewer [filename]", "load "] def process_data(self, data): if (data[0] == "curve-viewer" and len(data) < 3) or (data[0] == "load" and len(data) == 2): if self.IsIconized(): self.Restore() self.Raise() if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: self.droptarget.OnDropFiles(0, 0, [path]) return "ok" return "invalid" def reload_vcgt_handler(self, event): cmd, args = self.worker.prepare_dispwin(True) if isinstance(cmd, Exception): show_result_dialog(cmd, self) elif cmd: result = self.worker.exec_cmd(cmd, args, capture_output=True, skip_scripts=True) if isinstance(result, Exception): show_result_dialog(result, self) elif not result: show_result_dialog(UnloggedError("".join(self.worker.errors)), self) else: self.load_lut(get_display_profile()) def LoadProfile(self, profile): if profile and not isinstance(profile, ICCP.ICCProfile): try: profile = ICCP.ICCProfile(profile) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + profile), self) profile = None if not profile: profile = ICCP.ICCProfile() profile._data = "\0" * 128 profile._tags.desc = ICCP.TextDescriptionType("", "desc") profile.size = len(profile.data) profile.is_loaded = True if profile.getDescription(): title = u" \u2014 ".join([lang.getstr("calibration.lut_viewer.title"), profile.getDescription()]) else: title = lang.getstr("calibration.lut_viewer.title") self.SetTitle(title) self.profile = profile self.rTRC = self.tf_rTRC = profile.tags.get("rTRC", profile.tags.get("kTRC")) self.gTRC = self.tf_gTRC = profile.tags.get("gTRC", profile.tags.get("kTRC")) self.bTRC = self.tf_bTRC = profile.tags.get("bTRC", profile.tags.get("kTRC")) self.trc = None curves = [] curves.append(lang.getstr('vcgt')) self.client.errors = [] self.toggle_clut.SetValue("B2A0" in profile.tags or "A2B0" in profile.tags) if ((self.rTRC and self.gTRC and self.bTRC) or (self.toggle_clut.GetValue() and profile.colorSpace in ("RGB", "GRAY"))): try: self.lookup_tone_response_curves() except Exception, exception: wx.CallAfter(show_result_dialog, exception, self) else: curves.append(lang.getstr('[rgb]TRC')) if getcfg("show_advanced_options"): if isinstance(self.profile.tags.get("A2B0"), ICCP.LUT16Type): curves.append(lang.getstr('profile.tags.A2B0.shaper_curves.input')) curves.append(lang.getstr('profile.tags.A2B0.shaper_curves.output')) if isinstance(self.profile.tags.get("A2B1"), ICCP.LUT16Type): curves.append(lang.getstr('profile.tags.A2B1.shaper_curves.input')) curves.append(lang.getstr('profile.tags.A2B1.shaper_curves.output')) if isinstance(self.profile.tags.get("A2B2"), ICCP.LUT16Type): curves.append(lang.getstr('profile.tags.A2B2.shaper_curves.input')) curves.append(lang.getstr('profile.tags.A2B2.shaper_curves.output')) if isinstance(self.profile.tags.get("B2A0"), ICCP.LUT16Type): curves.append(lang.getstr('profile.tags.B2A0.shaper_curves.input')) curves.append(lang.getstr('profile.tags.B2A0.shaper_curves.output')) if isinstance(self.profile.tags.get("B2A1"), ICCP.LUT16Type): curves.append(lang.getstr('profile.tags.B2A1.shaper_curves.input')) curves.append(lang.getstr('profile.tags.B2A1.shaper_curves.output')) if isinstance(self.profile.tags.get("B2A2"), ICCP.LUT16Type): curves.append(lang.getstr('profile.tags.B2A2.shaper_curves.input')) curves.append(lang.getstr('profile.tags.B2A2.shaper_curves.output')) selection = self.plot_mode_select.GetSelection() center = False if curves and (selection < 0 or selection > len(curves) - 1): selection = 0 center = True self.plot_mode_select.SetItems(curves) self.plot_mode_select.Enable(len(curves) > 1) self.plot_mode_select.SetSelection(selection) self.cbox_sizer.Layout() self.box_sizer.Layout() self.DrawLUT() if center: wx.CallAfter(self.client.center) wx.CallAfter(self.handle_errors) def add_tone_values(self, legend): if not self.profile: return colorants = legend[0] if (self.plot_mode_select.GetSelection() == 0 and 'vcgt' in self.profile.tags): if 'R' in colorants or 'G' in colorants or 'B' in colorants: legend.append(lang.getstr("tone_values")) if '=' in colorants and 0: # NEVER unique = [] if 'R' in colorants: unique.append(self.client.r_unique) if 'G' in colorants: unique.append(self.client.g_unique) if 'B' in colorants: unique.append(self.client.b_unique) unique = min(unique) legend[-1] += " %.1f%% (%i/%i)" % (unique / (self.client.entryCount / 100.0), unique, self.client.entryCount) else: if 'R' in colorants: legend[-1] += " %.1f%% (%i/%i)" % (self.client.r_unique / (self.client.entryCount / 100.0), self.client.r_unique, self.client.entryCount) if 'G' in colorants: legend[-1] += " %.1f%% (%i/%i)" % (self.client.g_unique / (self.client.entryCount / 100.0), self.client.g_unique, self.client.entryCount) if 'B' in colorants: legend[-1] += " %.1f%% (%i/%i)" % (self.client.b_unique / (self.client.entryCount / 100.0), self.client.b_unique, self.client.entryCount) unique = [] unique.append(self.client.r_unique) unique.append(self.client.g_unique) unique.append(self.client.b_unique) if not 0 in unique and not "R=G=B" in colorants: unique = min(unique) legend[-1] += ", %s %.1f%% (%i/%i)" % (lang.getstr("grayscale"), unique / (self.client.entryCount / 100.0), unique, self.client.entryCount) elif (self.plot_mode_select.GetSelection() == 1 and isinstance(self.tf_rTRC, (ICCP.CurveType, CoordinateType)) and len(self.tf_rTRC) > 1 and isinstance(self.tf_gTRC, (ICCP.CurveType, CoordinateType)) and len(self.tf_gTRC) > 1 and isinstance(self.tf_bTRC, (ICCP.CurveType, CoordinateType)) and len(self.tf_bTRC) > 1): transfer_function = None if (not getattr(self, "trc", None) and len(self.tf_rTRC) == len(self.tf_gTRC) == len(self.tf_bTRC)): if isinstance(self.tf_rTRC, ICCP.CurveType): self.trc = ICCP.CurveType(profile=self.profile) for i in xrange(len(self.tf_rTRC)): self.trc.append((self.tf_rTRC[i] + self.tf_gTRC[i] + self.tf_bTRC[i]) / 3.0) else: self.trc = CoordinateType(self.profile) for i in xrange(len(self.tf_rTRC)): self.trc.append([(self.tf_rTRC[i][0] + self.tf_gTRC[i][0] + self.tf_bTRC[i][0]) / 3.0, (self.tf_rTRC[i][1] + self.tf_gTRC[i][1] + self.tf_bTRC[i][1]) / 3.0]) if getattr(self, "trc", None): transfer_function = self.trc.get_transfer_function(slice=(0.00, 1.00), outoffset=1.0) #if "R" in colorants and "G" in colorants and "B" in colorants: #if self.profile.tags.rTRC == self.profile.tags.gTRC == self.profile.tags.bTRC: #transfer_function = self.profile.tags.rTRC.get_transfer_function() #elif ("R" in colorants and #(not "G" in colorants or #self.profile.tags.rTRC == self.profile.tags.gTRC) and #(not "B" in colorants or #self.profile.tags.rTRC == self.profile.tags.bTRC)): #transfer_function = self.profile.tags.rTRC.get_transfer_function() #elif ("G" in colorants and #(not "R" in colorants or #self.profile.tags.gTRC == self.profile.tags.rTRC) and #(not "B" in colorants or #self.profile.tags.gTRC == self.profile.tags.bTRC)): #transfer_function = self.profile.tags.gTRC.get_transfer_function() #elif ("B" in colorants and #(not "G" in colorants or #self.profile.tags.bTRC == self.profile.tags.gTRC) and #(not "R" in colorants or #self.profile.tags.bTRC == self.profile.tags.rTRC)): #transfer_function = self.profile.tags.bTRC.get_transfer_function() if transfer_function and transfer_function[1] >= .95: if self.tf_rTRC == self.tf_gTRC == self.tf_bTRC: label = lang.getstr("rgb.trc") else: label = lang.getstr("rgb.trc.averaged") if round(transfer_function[1], 2) == 1.0: value = u"%s" % (transfer_function[0][0]) else: value = u"≈ %s (Δ %.2f%%)" % (transfer_function[0][0], 100 - transfer_function[1] * 100) legend.append(" ".join([label, value])) def DrawLUT(self, event=None): self.SetStatusText('') self.Freeze() curves = None if self.profile: if self.plot_mode_select.GetSelection() == 0: # Convert calibration information from embedded WCS profile # (if present) to VideCardFormulaType if the latter is not present if (isinstance(self.profile.tags.get("MS00"), ICCP.WcsProfilesTagType) and not "vcgt" in self.profile.tags): vcgt = self.profile.tags["MS00"].get_vcgt() if vcgt: self.profile.tags["vcgt"] = vcgt if 'vcgt' in self.profile.tags: curves = self.profile.tags['vcgt'] else: curves = None elif (self.plot_mode_select.GetSelection() == 1 and isinstance(self.rTRC, (ICCP.CurveType, CoordinateType)) and isinstance(self.gTRC, (ICCP.CurveType, CoordinateType)) and isinstance(self.bTRC, (ICCP.CurveType, CoordinateType))): if (len(self.rTRC) == 1 and len(self.gTRC) == 1 and len(self.bTRC) == 1): # gamma curves = { 'redMin': 0.0, 'redGamma': self.rTRC[0], 'redMax': 1.0, 'greenMin': 0.0, 'greenGamma': self.gTRC[0], 'greenMax': 1.0, 'blueMin': 0.0, 'blueGamma': self.bTRC[0], 'blueMax': 1.0 } else: # curves curves = { 'data': [self.rTRC, self.gTRC, self.bTRC], 'entryCount': len(self.rTRC), 'entrySize': 2 } elif self.plot_mode_select.GetSelection() in range(2, 14): if self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.A2B0.shaper_curves.input'): tables = self.profile.tags.A2B0.input elif self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.A2B0.shaper_curves.output'): tables = self.profile.tags.A2B0.output elif self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.A2B1.shaper_curves.input'): tables = self.profile.tags.A2B1.input elif self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.A2B1.shaper_curves.output'): tables = self.profile.tags.A2B1.output elif self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.A2B2.shaper_curves.input'): tables = self.profile.tags.A2B2.input elif self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.A2B2.shaper_curves.output'): tables = self.profile.tags.A2B2.output elif self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.B2A0.shaper_curves.input'): tables = self.profile.tags.B2A0.input elif self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.B2A0.shaper_curves.output'): tables = self.profile.tags.B2A0.output elif self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.B2A1.shaper_curves.input'): tables = self.profile.tags.B2A1.input elif self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.B2A1.shaper_curves.output'): tables = self.profile.tags.B2A1.output elif self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.B2A2.shaper_curves.input'): tables = self.profile.tags.B2A2.input elif self.plot_mode_select.GetStringSelection() == lang.getstr('profile.tags.B2A2.shaper_curves.output'): tables = self.profile.tags.B2A2.output entry_count = len(tables[0]) x = [v / (entry_count - 1.0) * 255 for v in range(entry_count)] curves = { 'data': [zip(x, [v / 65535.0 * 255 for v in tables[0]]), zip(x, [v / 65535.0 * 255 for v in tables[1]]), zip(x, [v / 65535.0 * 255 for v in tables[2]])], 'entryCount': entry_count, 'entrySize': 2 } yLabel = [] if self.toggle_red.GetValue(): yLabel.append("R") if self.toggle_green.GetValue(): yLabel.append("G") if self.toggle_blue.GetValue(): yLabel.append("B") if (self.plot_mode_select.GetSelection() in [0] + range(2, 14) or (self.profile and self.profile.connectionColorSpace == "RGB")): self.xLabel = "".join(yLabel) else: if self.show_as_L.GetValue(): self.xLabel = "L*" else: self.xLabel = "Y" self.yLabel = "".join(yLabel) self.toggle_red.Enable(bool(curves)) self.toggle_green.Enable(bool(curves)) self.toggle_blue.Enable(bool(curves)) self.show_as_L.Enable(bool(curves)) self.show_as_L.Show(self.plot_mode_select.GetSelection() not in [0] + range(2, 14) and self.profile.connectionColorSpace != "RGB") self.toggle_clut.Show(self.profile.connectionColorSpace != "RGB" and self.plot_mode_select.GetSelection() == 1 and ("B2A0" in self.profile.tags or "A2B0" in self.profile.tags)) self.toggle_clut.Enable(self.profile.connectionColorSpace != "RGB" and self.plot_mode_select.GetSelection() == 1 and isinstance(self.profile.tags.get("rTRC"), ICCP.CurveType) and isinstance(self.profile.tags.get("gTRC"), ICCP.CurveType) and isinstance(self.profile.tags.get("bTRC"), ICCP.CurveType)) self.save_plot_btn.Enable(bool(curves)) if hasattr(self, "reload_vcgt_btn"): self.reload_vcgt_btn.Enable(not(self.plot_mode_select.GetSelection()) and bool(self.profile)) self.reload_vcgt_btn.Show(not(self.plot_mode_select.GetSelection())) if hasattr(self, "apply_bpc_btn"): enable_bpc = (not(self.plot_mode_select.GetSelection()) and bool(self.profile) and isinstance(self.profile.tags.get("vcgt"), ICCP.VideoCardGammaType)) if enable_bpc: values = self.profile.tags.vcgt.getNormalizedValues() self.apply_bpc_btn.Enable(enable_bpc and values[0] != (0, 0, 0)) self.apply_bpc_btn.Show(not(self.plot_mode_select.GetSelection())) if hasattr(self, "install_vcgt_btn"): self.install_vcgt_btn.Enable(not(self.plot_mode_select.GetSelection()) and bool(self.profile) and isinstance(self.profile.tags.get("vcgt"), ICCP.VideoCardGammaType)) self.install_vcgt_btn.Show(not(self.plot_mode_select.GetSelection())) if hasattr(self, "save_vcgt_btn"): self.save_vcgt_btn.Enable(not(self.plot_mode_select.GetSelection()) and bool(self.profile) and isinstance(self.profile.tags.get("vcgt"), ICCP.VideoCardGammaType)) self.save_vcgt_btn.Show(not(self.plot_mode_select.GetSelection())) if hasattr(self, "show_actual_lut_cb"): self.show_actual_lut_cb.Show(self.plot_mode_select.GetSelection() == 0) if hasattr(self, "rendering_intent_select"): self.rendering_intent_select.Show(self.plot_mode_select.GetSelection() == 1 and self.profile.connectionColorSpace != "RGB") if hasattr(self, "direction_select"): self.direction_select.Show(self.toggle_clut.IsShown() and self.toggle_clut.GetValue() and "B2A0" in self.profile.tags and "A2B0" in self.profile.tags) self.show_as_L.GetContainingSizer().Layout() if hasattr(self, "cbox_sizer"): self.cbox_sizer.Layout() if hasattr(self, "box_sizer"): self.box_sizer.Layout() if self.client.last_PointLabel != None: self.client._drawPointLabel(self.client.last_PointLabel) #erase old self.client.last_PointLabel = None wx.CallAfter(self.client.DrawLUT, curves, xLabel=self.xLabel, yLabel=self.yLabel, r=self.toggle_red.GetValue() if hasattr(self, "toggle_red") else False, g=self.toggle_green.GetValue() if hasattr(self, "toggle_green") else False, b=self.toggle_blue.GetValue() if hasattr(self, "toggle_blue") else False) self.Thaw() def OnClose(self, event): self.listening = False if self.worker.tempdir and os.path.isdir(self.worker.tempdir): self.worker.wrapup(False) config.writecfg(module="curve-viewer", options=("display.number", )) # Hide first (looks nicer) self.Hide() # Need to use CallAfter to prevent hang under Windows if minimized wx.CallAfter(self.Destroy) def OnMotion(self, event): if isinstance(event, wx.MouseEvent): if not event.LeftIsDown(): self.UpdatePointLabel(self.client._getXY(event)) else: self.client.erase_pointlabel() event.Skip() # Go to next handler def OnMove(self, event=None): if self.IsShownOnScreen() and not \ self.IsMaximized() and not self.IsIconized(): x, y = self.GetScreenPosition() setcfg("position.lut_viewer.x", x) setcfg("position.lut_viewer.y", y) if event: event.Skip() def OnSize(self, event=None): if self.IsShownOnScreen() and not \ self.IsMaximized() and not self.IsIconized(): w, h = self.GetSize() border, titlebar = get_platform_window_decoration_size() setcfg("size.lut_viewer.w", w - border * 2) setcfg("size.lut_viewer.h", h - titlebar - border) if event: event.Skip() if sys.platform == "win32": # Needed under Windows when using double buffering self.Refresh() def OnWheel(self, event): xy = wx.GetMousePosition() if self.client.last_draw: if event.WheelRotation < 0: direction = 1.0 else: direction = -1.0 self.client.zoom(direction) def SaveFile(self, event=None): """Saves the file to the type specified in the extension. If no file name is specified a dialog box is provided. Returns True if sucessful, otherwise False. .bmp Save a Windows bitmap file. .xbm Save an X bitmap file. .xpm Save an XPM bitmap file. .png Save a Portable Network Graphics file. .jpg Save a Joint Photographic Experts Group file. """ fileName = " ".join([self.plot_mode_select.GetStringSelection(), os.path.basename(os.path.splitext(self.profile.fileName or lang.getstr("unnamed"))[0])]) if (event and hasattr(self, "save_vcgt_btn") and event.GetId() == self.save_vcgt_btn.GetId()): extensions = {"cal": 1} defType = "cal" else: extensions = { "bmp": wx.BITMAP_TYPE_BMP, # Save a Windows bitmap file. "xbm": wx.BITMAP_TYPE_XBM, # Save an X bitmap file. "xpm": wx.BITMAP_TYPE_XPM, # Save an XPM bitmap file. "jpg": wx.BITMAP_TYPE_JPEG, # Save a JPG file. "png": wx.BITMAP_TYPE_PNG, # Save a PNG file. } defType = "png" fileName += "." + defType fType = None dlg1 = None while fType not in extensions: if dlg1: # FileDialog exists: Check for extension InfoDialog(self, msg=lang.getstr("error.file_type_unsupported"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-error")) else: # FileDialog doesn't exist: just check one dlg1 = wx.FileDialog( self, lang.getstr("save_as"), get_verified_path("last_filedialog_path")[0], fileName, "|".join(["%s (*.%s)|*.%s" % (ext.upper(), ext, ext) for ext in sorted(extensions.keys())]), wx.SAVE|wx.OVERWRITE_PROMPT ) dlg1.SetFilterIndex(sorted(extensions.keys()).index(defType)) if dlg1.ShowModal() == wx.ID_OK: fileName = dlg1.GetPath() if not waccess(fileName, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", fileName)), self) return fType = fileName[-3:].lower() setcfg("last_filedialog_path", fileName) else: # exit without saving dlg1.Destroy() return False if dlg1: dlg1.Destroy() # Save Bitmap if (event and hasattr(self, "save_vcgt_btn") and event.GetId() == self.save_vcgt_btn.GetId()): res = vcgt_to_cal(self.profile) res.write(fileName) else: res= self.client._Buffer.SaveFile(fileName, extensions.get(fType, ".png")) return res def SetStatusText(self, text): self.status.Label = text self.status.Refresh() def UpdatePointLabel(self, xy): if self.client.GetEnablePointLabel(): # Show closest point (when enbled) # Make up dict with info for the point label dlst = self.client.GetClosestPoint(xy, pointScaled=True) if dlst != [] and hasattr(self.client, "point_grid"): curveNum, legend, pIndex, pointXY, scaledXY, distance = dlst legend = legend.split(", ") R, G, B = (self.client.point_grid[0].get(pointXY[0], 0 if self.toggle_red.GetValue() else None), self.client.point_grid[1].get(pointXY[0], 0 if self.toggle_green.GetValue() else None), self.client.point_grid[2].get(pointXY[0], 0 if self.toggle_blue.GetValue() else None)) if (R == G == B or ((R == G or G == B or R == B) and None in (R, G ,B))): rgb = "" else: rgb = legend[0] + " " if 1: joiner = u" \u2192 " if (self.plot_mode_select.GetSelection() == 1 and self.profile.connectionColorSpace != "RGB"): if self.show_as_L.GetValue(): format = "L* %.4f", "%s %.2f" else: format = "Y %.4f", "%s %.2f" axis_y = 100.0 else: label = [] if R is not None: label.append("R") if G is not None: label.append("G") if B is not None: label.append("B") format = "%s %%.2f" % "=".join(label), "%s %.2f" axis_y = 255.0 if R == G == B or ((R == G or G == B or R == B) and None in (R, G ,B)): #if R is None: RGB = " ".join(["=".join(["%s" % v for v, s in filter(lambda v: v[1] is not None, (("R", R), ("G", G), ("B", B)))]), "%.2f" % pointXY[1]]) #else: #RGB = "R=G=B %.2f" % R else: RGB = " ".join([format[1] % (v, s) for v, s in filter(lambda v: v[1] is not None, (("R", R), ("G", G), ("B", B)))]) legend[0] = joiner.join([format[0] % pointXY[0], RGB]) if (self.plot_mode_select.GetSelection() == 1 and self.profile.connectionColorSpace != "RGB"): pointXY = pointXY[1], pointXY[0] else: joiner = u" \u2192 " format = "%.2f", "%.2f" axis_y = 255.0 legend[0] += " " + joiner.join([format[i] % point for i, point in enumerate(pointXY)]) if len(legend) == 1: gamma = [] for label, v in (("R", R), ("G", G), ("B", B)): if v is None: continue if (self.plot_mode_select.GetSelection() == 1 and self.profile.connectionColorSpace != "RGB"): x = v y = pointXY[1] if self.show_as_L.GetValue(): y = colormath.Lab2XYZ(y, 0, 0)[1] * 100 else: x = pointXY[0] y = v if x <= 0 or x >= 255 or y <= 0 or y >= axis_y: continue if R == G == B or ((R == G or G == B or R == B) and None in (R, G ,B)): label = "=".join(["%s" % s for s, v in filter(lambda (s, v): v is not None, (("R", R), ("G", G), ("B", B)))]) # Note: We need to make sure each point is a float because it # might be a decimal.Decimal, which can't be divided by floats! gamma.append(label + " %.2f" % round(math.log(float(y) / axis_y) / math.log(x / 255.0), 2)) if "=" in label: break if gamma: legend.append("Gamma " + " ".join(gamma)) if self.profile.connectionColorSpace != "RGB": self.add_tone_values(legend) legend = [", ".join(legend[:-1])] + [legend[-1]] self.SetStatusText("\n".join(legend)) # Make up dictionary to pass to DrawPointLabel mDataDict= {"curveNum": curveNum, "legend": legend, "pIndex": pIndex, "pointXY": pointXY, "scaledXY": scaledXY} # Pass dict to update the point label self.client.UpdatePointLabel(mDataDict) def update_controls(self): self.show_actual_lut_cb.Enable((self.worker.argyll_version[0:3] > [1, 1, 0] or (self.worker.argyll_version[0:3] == [1, 1, 0] and not "Beta" in self.worker.argyll_version_string)) and not config.is_untethered_display()) self.show_actual_lut_cb.SetValue(bool(getcfg("lut_viewer.show_actual_lut")) and not config.is_untethered_display()) @property def worker(self): return self.client.worker def display_changed(self, event): self.worker.enumerate_displays_and_ports(check_lut_access=False, enumerate_ports=False, include_network_devices=False) def main(): config.initcfg("curve-viewer") # Backup display config cfg_display = getcfg("display.number") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = LUTFrame(None, -1) app.TopWindow.Bind(wx.EVT_CLOSE, app.TopWindow.OnClose, app.TopWindow) if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() app.TopWindow.display_changed(None) app.TopWindow.Bind(wx.EVT_DISPLAY_CHANGED, app.TopWindow.display_changed) app.TopWindow.display_no, geometry, client_area = app.TopWindow.get_display() app.TopWindow.Bind(wx.EVT_MOVE, app.TopWindow.move_handler, app.TopWindow) display_no = get_argyll_display_number(geometry) setcfg("display.number", display_no + 1) app.TopWindow.update_controls() for arg in sys.argv[1:]: if os.path.isfile(arg): app.TopWindow.drop_handler(safe_unicode(arg)) break else: app.TopWindow.load_lut(get_display_profile(display_no)) app.TopWindow.Show() if __name__ == '__main__': main() DisplayCAL-3.5.0.0/DisplayCAL/wxMeasureFrame.py0000644000076500000000000005233413223332672020742 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import os import re import sys import warnings import config import localization as lang from config import (defaults, enc, getcfg, geticon, get_argyll_display_number, get_default_dpi, get_display_number, get_display_rects, scale_adjustment_factor, setcfg, writecfg) from debughelpers import handle_error from log import safe_print from meta import name as appname from options import debug from util_list import floatlist, strlist from util_str import safe_str, safe_unicode from wxaddons import wx from wxwindows import BaseApp, ConfirmDialog, InfoDialog, InvincibleFrame from wxfixes import GenBitmapButton as BitmapButton try: import RealDisplaySizeMM as RDSMM except ImportError, exception: RDSMM = None warnings.warn(safe_str(exception, enc), Warning) def get_default_size(): """ Get and return the default size for the window in pixels. The default size is always equivalent to 100 x 100 mm according to the display's size as returned by the RealDisplaySizeMM function, which uses the same code as Argyll to determine that size. This function is used internally. """ display_sizes = [] display_sizes_mm = [] for display_no in xrange(len(getcfg("displays"))): display_no = get_display_number(display_no) display_size = wx.Display(display_no).Geometry[2:] display_size_mm = [] if RDSMM: try: display_size_mm = RDSMM.RealDisplaySizeMM(display_no) except Exception, exception: handle_error(u"Error - RealDisplaySizeMM() failed: " + safe_unicode(exception), silent=True) else: display_size_mm = floatlist(display_size_mm) if debug: safe_print("[D] display_size_mm:", display_size_mm) if not len(display_size_mm) or 0 in display_size_mm: ppi_def = get_default_dpi() method = 1 if method == 0: # use configurable screen diagonal inch = 20.0 mm = inch * 25.4 f = mm / math.sqrt(math.pow(display_size[0], 2) + \ math.pow(display_size[1], 2)) w_mm = math.sqrt(math.pow(mm, 2) - \ math.pow(display_size[1] * f, 2)) h_mm = math.sqrt(math.pow(mm, 2) - \ math.pow(display_size[0] * f, 2)) display_size_mm = w_mm, h_mm elif method == 1: # use the first display display_size_1st = wx.DisplaySize() display_size_mm = floatlist(wx.DisplaySizeMM()) if 0 in display_size_mm: # bogus display_size_mm = [display_size_1st[0] / ppi_def * 25.4, display_size_1st[1] / ppi_def * 25.4] if display_no > 0: display_size_mm[0] = display_size[0] / ( display_size_1st[0] / display_size_mm[0]) display_size_mm[1] = display_size[1] / ( display_size_1st[1] / display_size_mm[1]) else: # use assumed ppi display_size_mm = (display_size[0] / ppi_def * 25.4, display_size[1] / ppi_def * 25.4) display_sizes.append(display_size) display_sizes_mm.append(display_size_mm) if sum(mm[0] for mm in display_sizes_mm) / \ len(display_sizes_mm) == display_sizes_mm[0][0] and \ sum(mm[1] for mm in display_sizes_mm) / \ len(display_sizes_mm) == display_sizes_mm[0][1]: # display_size_mm is the same for all screens, use the 1st one display_size = display_sizes[0] display_size_mm = display_sizes_mm[0] else: if getcfg("display_lut.link"): display_no = getcfg("display.number") - 1 else: display_no = getcfg("display_lut.number") - 1 display_size = display_sizes[display_no] display_size_mm = display_sizes_mm[display_no] px_per_mm = (display_size[0] / display_size_mm[0], display_size[1] / display_size_mm[1]) if debug: safe_print("[D] H px_per_mm:", px_per_mm[0]) safe_print("[D] V px_per_mm:", px_per_mm[1]) return round(100.0 * max(px_per_mm)) class MeasureFrame(InvincibleFrame): """ A rectangular window to set the measure area size for dispcal/dispread. """ exitcode = 1 def __init__(self, parent=None, id=-1): InvincibleFrame.__init__(self, parent, id, lang.getstr("measureframe.title"), style=wx.DEFAULT_FRAME_STYLE & ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX), name="measureframe") self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.Bind(wx.EVT_CLOSE, self.close_handler, self) self.Bind(wx.EVT_MOVE, self.move_handler, self) self.Bind(wx.EVT_SHOW, self.show_handler) self.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_SET_FOCUS, self.focus_handler) self.panel = wx.Panel(self, -1) self.sizer = wx.GridSizer(3, 1, 0, 0) self.panel.SetSizer(self.sizer) self.hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(self.hsizer, flag=wx.ALIGN_CENTER_HORIZONTAL | wx.ALL | wx.ALIGN_TOP, border=10) self.zoommaxbutton = BitmapButton(self.panel, -1, geticon(16, "zoom-best-fit"), style=wx.NO_BORDER, name="zoommaxbutton") self.zoommaxbutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.zoommax_handler, self.zoommaxbutton) self.hsizer.Add(self.zoommaxbutton, flag=wx.ALIGN_CENTER) self.zoommaxbutton.SetToolTipString(lang.getstr("measureframe.zoommax")) self.hsizer.Add((8, 1)) self.zoominbutton = BitmapButton(self.panel, -1, geticon(16, "zoom-in"), style=wx.NO_BORDER, name="zoominbutton") self.zoominbutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.zoomin_handler, self.zoominbutton) self.hsizer.Add(self.zoominbutton, flag=wx.ALIGN_CENTER) self.zoominbutton.SetToolTipString(lang.getstr("measureframe.zoomin")) self.hsizer.Add((8, 1)) self.zoomnormalbutton = BitmapButton(self.panel, -1, geticon(16, "zoom-original"), style=wx.NO_BORDER, name="zoomnormalbutton") self.zoomnormalbutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.zoomnormal_handler, self.zoomnormalbutton) self.hsizer.Add(self.zoomnormalbutton, flag=wx.ALIGN_CENTER) self.zoomnormalbutton.SetToolTipString(lang.getstr("measureframe." "zoomnormal")) self.hsizer.Add((8, 1)) self.zoomoutbutton = BitmapButton(self.panel, -1, geticon(16, "zoom-out"), style=wx.NO_BORDER, name="zoomoutbutton") self.zoomoutbutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.zoomout_handler, self.zoomoutbutton) self.hsizer.Add(self.zoomoutbutton, flag=wx.ALIGN_CENTER) self.zoomoutbutton.SetToolTipString(lang.getstr("measureframe.zoomout")) self.centerbutton = BitmapButton(self.panel, -1, geticon(16, "window-center"), style=wx.NO_BORDER, name="centerbutton") self.centerbutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.center_handler, self.centerbutton) self.sizer.Add(self.centerbutton, flag=wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT, border=10) self.centerbutton.SetToolTipString(lang.getstr("measureframe.center")) self.vsizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.vsizer, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL) self.measure_darken_background_cb = wx.CheckBox(self.panel, -1, lang.getstr("measure.darken_background")) self.measure_darken_background_cb.SetValue( bool(int(getcfg("measure.darken_background")))) self.measure_darken_background_cb.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_CHECKBOX, self.measure_darken_background_ctrl_handler, id=self.measure_darken_background_cb.GetId()) self.vsizer.Add(self.measure_darken_background_cb, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.LEFT | wx.RIGHT | wx.TOP, border=10) self.measurebutton = wx.Button(self.panel, -1, lang.getstr("measureframe.measurebutton"), name="measurebutton") self.measurebutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.measure_handler, self.measurebutton) self.vsizer.Add(self.measurebutton, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, border=10) self.measurebutton.SetMaxFontSize(11) self.measurebutton.SetDefault() self.last_focused = self.measurebutton self.display_no = wx.Display.GetFromWindow(self) self.display_rects = get_display_rects() def measure_darken_background_ctrl_handler(self, event): if self.measure_darken_background_cb.GetValue() and \ getcfg("measure.darken_background.show_warning"): dlg = ConfirmDialog(self, msg=lang.getstr("measure.darken_background." "warning"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) chk = wx.CheckBox(dlg, -1, lang.getstr("dialog.do_not_show_again")) dlg.Bind(wx.EVT_CHECKBOX, self.measure_darken_background_warning_handler, id=chk.GetId()) dlg.sizer3.Add(chk, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() rslt = dlg.ShowModal() if rslt == wx.ID_CANCEL: self.measure_darken_background_cb.SetValue(False) setcfg("measure.darken_background", int(self.measure_darken_background_cb.GetValue())) def measure_darken_background_warning_handler(self, event): setcfg("measure.darken_background.show_warning", int(not event.GetEventObject().GetValue())) def info_handler(self, event): InfoDialog(self, msg=lang.getstr("measureframe.info"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False) def measure_handler(self, event): if self.Parent and hasattr(self.Parent, "call_pending_function"): self.Parent.call_pending_function() else: MeasureFrame.exitcode = 255 self.Close() def Show(self, show=True): if show: self.measure_darken_background_cb.SetValue( bool(int(getcfg("measure.darken_background")))) if self.Parent and hasattr(self.Parent, "display_ctrl"): display_no = self.Parent.display_ctrl.GetSelection() else: display_no = getcfg('display.number') - 1 if display_no < 0 or display_no > wx.Display.GetCount() - 1: display_no = 0 else: display_no = get_display_number(display_no) x, y = wx.Display(display_no).Geometry[:2] self.SetPosition((x, y)) # place measure frame on correct display self.place_n_zoom( *floatlist(getcfg("dimensions.measureframe").split(","))) self.display_no = wx.Display.GetFromWindow(self) elif self.IsShownOnScreen(): setcfg("dimensions.measureframe", self.get_dimensions()) if self.Parent and hasattr(self.Parent, "get_set_display"): self.Parent.get_set_display() wx.Frame.Show(self, show) def Hide(self): self.Show(False) def place_n_zoom(self, x=None, y=None, scale=None): """ Place and scale the window. x, y and scale need to be in Argyll coordinates (0.0...1.0) if given. Without arguments, they are read from the user configuration. """ if debug: safe_print("[D] measureframe.place_n_zoom") if None in (x, y, scale): cur_x, cur_y, cur_scale = floatlist(self.get_dimensions().split(",")) if x is None: x = cur_x if y is None: y = cur_y if scale is None: scale = cur_scale if scale > 50.0: # Argyll max scale = 50 if debug: safe_print(" x:", x) if debug: safe_print(" y:", y) if debug: safe_print(" scale:", scale) if debug: safe_print("[D] scale_adjustment_factor:", scale_adjustment_factor) scale /= scale_adjustment_factor if debug: safe_print("[D] scale / scale_adjustment_factor:", scale) display = self.get_display(getcfg("display.number") - 1) display_client_rect = display[2] if debug: safe_print("[D] display_client_rect:", display_client_rect) display_client_size = display_client_rect[2:] if debug: safe_print("[D] display_client_size:", display_client_size) measureframe_min_size = [max(self.sizer.GetMinSize())] * 2 if debug: safe_print("[D] measureframe_min_size:", measureframe_min_size) default_measureframe_size = get_default_size() defaults["size.measureframe"] = default_measureframe_size size = [min(display_client_size[0], default_measureframe_size * scale), min(display_client_size[1], default_measureframe_size * scale)] if measureframe_min_size[0] > size[0]: size = measureframe_min_size if size[0] > display_client_size[0]: size[0] = display_client_size[0] if size[1] > display_client_size[1]: size[1] = display_client_size[1] if max(size) >= max(display_client_size): scale = 50 if debug: safe_print("[D] measureframe_size:", size) self.SetMaxSize((-1, -1)) self.SetMinSize(size) self.SetSize(size) self.SetMaxSize(size) display_rect = display[1] if debug: safe_print("[D] display_rect:", display_rect) display_size = display_rect[2:] if debug: safe_print("[D] display_size:", display_size) if sys.platform in ("darwin", "win32"): titlebar = 0 # size already includes window decorations else: titlebar = 25 # assume titlebar height of 25px measureframe_pos = [display_rect[0] + round((display_size[0] - size[0]) * x), display_rect[1] + round((display_size[1] - size[1]) * y) - titlebar] if measureframe_pos[0] < display_client_rect[0]: measureframe_pos[0] = display_client_rect[0] if measureframe_pos[1] < display_client_rect[1]: measureframe_pos[1] = display_client_rect[1] if debug: safe_print("[D] measureframe_pos:", measureframe_pos) setcfg("dimensions.measureframe", ",".join(strlist((x, y, scale)))) self.SetPosition(measureframe_pos) def zoomin_handler(self, event): if debug: safe_print("[D] measureframe_zoomin_handler") # We can't use self.get_dimensions() here because if we are near # fullscreen, next magnification step will be larger than normal display_size = self.get_display()[1][2:] default_measureframe_size = get_default_size() size = floatlist(self.GetSize()) x, y = None, None self.place_n_zoom(x, y, scale=(display_size[0] / default_measureframe_size) / (display_size[0] / size[0]) + .125) def zoomout_handler(self, event): if debug: safe_print("[D] measureframe_zoomout_handler") # We can't use self.get_dimensions() here because if we are # fullscreen, scale will be 50, thus changes won't be visible quickly display_size = self.get_display()[1][2:] default_measureframe_size = get_default_size() size = floatlist(self.GetSize()) x, y = None, None self.place_n_zoom(x, y, scale=(display_size[0] / default_measureframe_size) / (display_size[0] / size[0]) - .125) def zoomnormal_handler(self, event): if debug: safe_print("[D] measureframe_zoomnormal_handler") x, y = None, None scale = floatlist(defaults["dimensions.measureframe"].split(","))[2] self.place_n_zoom(x, y, scale=scale) def zoommax_handler(self, event): if debug: safe_print("[D] measureframe_zoommax_handler") display_client_rect = self.get_display()[2] if debug: safe_print("[D] display_client_rect:", display_client_rect) display_client_size = display_client_rect[2:] if debug: safe_print("[D] display_client_size:", display_client_size) size = self.GetSize() if debug: safe_print(" size:", size) if max(size) >= max(display_client_size) - 50: dim = getcfg("dimensions.measureframe.unzoomed") self.place_n_zoom(*floatlist(dim.split(","))) else: setcfg("dimensions.measureframe.unzoomed", self.get_dimensions()) self.place_n_zoom(x=.5, y=.5, scale=50.0) def center_handler(self, event): if debug: safe_print("[D] measureframe_center_handler") x, y = floatlist(defaults["dimensions.measureframe"].split(","))[:2] self.place_n_zoom(x, y) def close_handler(self, event): if debug: safe_print("[D] measureframe_close_handler") self.Hide() if self.Parent: self.Parent.Show() if getattr(self.Parent, "restore_measurement_mode"): self.Parent.restore_measurement_mode() if getattr(self.Parent, "restore_testchart"): self.Parent.restore_testchart() else: writecfg() self.Destroy() if MeasureFrame.exitcode != 255: MeasureFrame.exitcode = 0 def get_display(self, display_no=None): """ Get the display number, geometry and client area, taking into account separate X screens, TwinView and similar """ if wx.Display.GetCount() == 1 and len(self.display_rects) > 1: # Separate X screens, TwinView or similar display = wx.Display(0) geometry = display.Geometry union = wx.Rect() xy = [] for rect in self.display_rects: if rect[:2] in xy or rect[2:] == geometry[2:]: # Overlapping x y coordinates or screen filling whole # reported geometry, so assume separate X screens union = None break xy.append(rect[:2]) union = union.Union(rect) if union == geometry: # Assume TwinView or similar where Argyll enumerates 1+n # displays but wx only 'sees' one that is the union of them framerect = self.Rect if display_no is not None: geometry = self.display_rects[display_no] else: display_no = 0 for i, coord in enumerate(framerect[:2]): if coord < 0: framerect[i] = 0 elif coord > geometry[i + 2]: framerect[i] = geometry[i] for i, display_rect in enumerate(self.display_rects): if display_rect.Contains(framerect[:2]): display_no = i geometry = display_rect break elif display_no is None: # Assume separate X screens display_no = 0 client_rect = wx.Rect(*tuple(geometry)).Intersect(display.GetRealClientArea()) else: display_no = wx.Display.GetFromWindow(self) display = self.GetDisplay() geometry = display.Geometry client_rect = display.GetRealClientArea() return display_no, geometry, client_rect def move_handler(self, event): if not self.IsShownOnScreen(): return display_no, geometry, client_area = self.get_display() if display_no != self.display_no: self.display_no = display_no # Translate from wx display index to Argyll display index n = get_argyll_display_number(geometry) if n is not None: # Save Argyll display index to configuration setcfg("display.number", n + 1) def focus_handler(self, e): e.Skip() if debug: safe_print("SET_FOCUS", e.EventObject.Name) if e.EventObject is self and getattr(self, "last_focused", None) not in (None, self): self.last_focused.SetFocus() if debug: safe_print(self.last_focused.Name + ".SetFocus()") def focus_lost_handler(self, e): e.Skip() if debug: safe_print("KILL_FOCUS", e.EventObject.Name) if e.EventObject is not self: self.last_focused = e.EventObject if debug and self.last_focused: safe_print("last_focused", self.last_focused.Name) def show_handler(self, e): e.Skip() if getattr(e, "IsShown", getattr(e, "GetShow", bool))(): self.measurebutton.SetFocus() def get_dimensions(self): """ Calculate and return the relative dimensions from the pixel values. Returns x, y and scale in Argyll coordinates (0.0...1.0). """ if debug: safe_print("[D] measureframe.get_dimensions") display = self.get_display() display_rect = display[1] display_size = display_rect[2:] display_client_rect = display[2] display_client_size = display_client_rect[2:] if debug: safe_print("[D] display_size:", display_size) if debug: safe_print("[D] display_client_size:", display_client_size) default_measureframe_size = get_default_size() if debug: safe_print("[D] default_measureframe_size:", default_measureframe_size) measureframe_pos = floatlist(self.GetScreenPosition()) measureframe_pos[0] -= display_rect[0] measureframe_pos[1] -= display_rect[1] if debug: safe_print("[D] measureframe_pos:", measureframe_pos) size = floatlist(self.GetSize()) if debug: safe_print(" size:", size) if max(size) >= max(display_client_size) - 50: # Fullscreen? scale = 50.0 # Argyll max is 50 measureframe_pos = [.5, .5] else: scale = (display_size[0] / default_measureframe_size) / \ (display_size[0] / size[0]) if debug: safe_print("[D] scale:", scale) if debug: safe_print("[D] scale_adjustment_factor:", scale_adjustment_factor) scale *= scale_adjustment_factor if size[0] >= display_client_size[0]: measureframe_pos[0] = .5 elif measureframe_pos[0] != 0: if display_size[0] - size[0] < measureframe_pos[0]: measureframe_pos[0] = display_size[0] - size[0] measureframe_pos[0] = 1.0 / ((display_size[0] - size[0]) / (measureframe_pos[0])) if size[1] >= display_client_size[1]: measureframe_pos[1] = .5 elif measureframe_pos[1] != 0: if display_size[1] - size[1] < measureframe_pos[1]: measureframe_pos[1] = display_size[1] - size[1] if sys.platform in ("darwin", "win32"): titlebar = 0 # size already includes window decorations else: titlebar = 25 # assume titlebar height of 25px measureframe_pos[1] = 1.0 / ((display_size[1] - size[1]) / (measureframe_pos[1] + titlebar)) if debug: safe_print("[D] scale:", scale) if debug: safe_print("[D] measureframe_pos:", measureframe_pos) measureframe_dimensions = ",".join(str(max(0, n)) for n in measureframe_pos + [scale]) if debug: safe_print("[D] measureframe_dimensions:", measureframe_dimensions) return measureframe_dimensions def main(): config.initcfg() lang.init() app = BaseApp(0) app.TopWindow = MeasureFrame() app.TopWindow.Show() app.MainLoop() if __name__ == "__main__": main() sys.exit(MeasureFrame.exitcode) DisplayCAL-3.5.0.0/DisplayCAL/wxProfileInfo.py0000644000076500000000000020264513223332672020604 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement import re import subprocess as sp import math import os import sys import tempfile from config import (defaults, fs_enc, get_argyll_display_number, get_data_path, get_display_profile, get_display_rects, getbitmap, getcfg, geticon, get_verified_path, profile_ext, setcfg, writecfg) from log import safe_print from meta import name as appname from options import debug from ordereddict import OrderedDict from util_io import GzipFileProper from util_list import intlist from util_os import launch_file, make_win32_compatible_long_path, waccess from util_str import safe_unicode, strtr, universal_newlines, wrap from worker import (Error, UnloggedError, UnloggedInfo, check_set_argyll_bin, get_argyll_util, make_argyll_compatible_path, show_result_dialog) from wxaddons import get_platform_window_decoration_size, wx from wxLUTViewer import LUTCanvas, LUTFrame from wxVRML2X3D import vrmlfile2x3dfile from wxwindows import (BaseApp, BaseFrame, BitmapBackgroundPanelText, CustomCheckBox, CustomGrid, CustomRowLabelRenderer, ConfirmDialog, FileDrop, InfoDialog, SimpleBook, TwoWaySplitter) from wxfixes import GenBitmapButton as BitmapButton, wx_Panel import colormath import config import wxenhancedplot as plot import localization as lang import ICCProfile as ICCP import x3dom BGCOLOUR = "#333333" FGCOLOUR = "#999999" TEXTCOLOUR = "#333333" if sys.platform == "darwin": FONTSIZE_SMALL = 10 else: FONTSIZE_SMALL = 8 class GamutCanvas(LUTCanvas): def __init__(self, *args, **kwargs): LUTCanvas.__init__(self, *args, **kwargs) self.SetEnableTitle(False) self.SetFontSizeAxis(FONTSIZE_SMALL) self.SetFontSizeLegend(FONTSIZE_SMALL) self.pcs_data = [] self.profiles = {} self.colorspace = "a*b*" self.intent = "" self.direction = "" self.order = "" self.reset() self.resetzoom() def DrawCanvas(self, title=None, colorspace=None, whitepoint=None, center=False, show_outline=True): if not title: title = "" if colorspace: self.colorspace = colorspace # Defaults poly = plot.PolyLine poly._attributes["width"] = 3 polys = [] # L*a*b* optimalcolors = [(52.40, 95.40, 10.58), (52.33, 91.23, 38.56), (52.31, 89.09, 65.80), (52.30, 88.24, 89.93), (59.11, 84.13, 101.46), (66.02, 75.66, 113.09), (72.36, 64.33, 123.65), (78.27, 50.88, 132.94), (83.64, 36.33, 140.63), (88.22, 22.05, 145.02), (92.09, 8.49, 143.95), (90.38, -4.04, 141.05), (87.54, -23.02, 136.16), (85.18, -37.06, 132.16), (82.10, -52.65, 126.97), (85.53, -65.59, 122.51), (82.01, -81.46, 116.55), (77.35, -97.06, 108.72), (74.76, -122.57, 90.91), (68.33, -134.27, 80.11), (63.07, -152.99, 56.41), (54.57, -159.74, 42.75), (44.43, -162.58, 27.45), (46.92, -162.26, 13.87), (48.53, -144.04, -4.73), (49.50, -115.82, -25.38), (59.18, -85.50, -47.00), (59.33, -68.64, -58.79), (59.41, -52.73, -69.57), (50.80, -25.33, -84.08), (42.05, 8.67, -98.57), (33.79, 43.74, -111.63), (26.63, 74.31, -121.90), (20.61, 98.44, -128.77), (14.87, 117.34, -131.97), (9.74, 127.16, -129.59), (5.20, 125.79, -120.43), (7.59, 122.01, -116.33), (10.21, 117.89, -111.81), (26.35, 115.11, -100.95), (40.68, 115.59, -87.47), (39.37, 115.48, -78.51), (46.49, 114.84, -66.24), (53.49, 111.63, -54.17), (52.93, 107.54, -38.16), (52.58, 101.53, -16.45), (52.40, 95.40, 10.58)] # CIE 1931 2-deg chromaticity coordinates # http://www.cvrl.org/offercsvccs.php xy = [(0.175560, 0.005294), (0.175161, 0.005256), (0.174821, 0.005221), (0.174510, 0.005182), (0.174112, 0.004964), (0.174008, 0.004981), (0.173801, 0.004915), (0.173560, 0.004923), (0.173337, 0.004797), (0.173021, 0.004775), (0.172577, 0.004799), (0.172087, 0.004833), (0.171407, 0.005102), (0.170301, 0.005789), (0.168878, 0.006900), (0.166895, 0.008556), (0.164412, 0.010858), (0.161105, 0.013793), (0.156641, 0.017705), (0.150985, 0.022740), (0.143960, 0.029703), (0.135503, 0.039879), (0.124118, 0.057803), (0.109594, 0.086843), (0.091294, 0.132702), (0.068706, 0.200723), (0.045391, 0.294976), (0.023460, 0.412703), (0.008168, 0.538423), (0.003859, 0.654823), (0.013870, 0.750186), (0.038852, 0.812016), (0.074302, 0.833803), (0.114161, 0.826207), (0.154722, 0.805864), (0.192876, 0.781629), (0.229620, 0.754329), (0.265775, 0.724324), (0.301604, 0.692308), (0.337363, 0.658848), (0.373102, 0.624451), (0.408736, 0.589607), (0.444062, 0.554714), (0.478775, 0.520202), (0.512486, 0.486591), (0.544787, 0.454434), (0.575151, 0.424232), (0.602933, 0.396497), (0.627037, 0.372491), (0.648233, 0.351395), (0.665764, 0.334011), (0.680079, 0.319747), (0.691504, 0.308342), (0.700606, 0.299301), (0.707918, 0.292027), (0.714032, 0.285929), (0.719033, 0.280935), (0.723032, 0.276948), (0.725992, 0.274008), (0.728272, 0.271728), (0.729969, 0.270031), (0.731089, 0.268911), (0.731993, 0.268007), (0.732719, 0.267281), (0.733417, 0.266583), (0.734047, 0.265953), (0.734390, 0.265610), (0.734592, 0.265408), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734548, 0.265452), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310), (0.734690, 0.265310)] if self.colorspace == "xy": label_x = "x" label_y = "y" if show_outline: polys.append(plot.PolySpline(xy, colour=wx.Colour(102, 102, 102, 153), width=1.75)) polys.append(plot.PolyLine([xy[0], xy[-1]], colour=wx.Colour(102, 102, 102, 153), width=1.75)) max_x = 0.75 max_y = 0.85 min_x = -.05 min_y = -.05 step = .1 elif self.colorspace == "u'v'": label_x = "u'" label_y = "v'" if show_outline: uv = [colormath.xyY2Lu_v_(x, y, 100)[1:] for x, y in xy] polys.append(plot.PolySpline(uv, colour=wx.Colour(102, 102, 102, 153), width=1.75)) polys.append(plot.PolyLine([uv[0], uv[-1]], colour=wx.Colour(102, 102, 102, 153), width=1.75)) max_x = 0.625 max_y = 0.6 min_x = -.025 min_y = -.025 step = .1 elif self.colorspace == "u*v*": # Hard to present gamut projection appropriately in 2D # because blue tones 'cave in' towards the center label_x = "u*" label_y = "v*" max_x = 150.0 max_y = 150.0 min_x = -150.0 min_y = -150.0 step = 50 elif self.colorspace == "DIN99": label_x = "a99" label_y = "b99" max_x = 50.0 max_y = 50.0 min_x = -50.0 min_y = -50.0 step = 25 elif self.colorspace in ("DIN99b", "DIN99c", "DIN99d"): if self.colorspace == "DIN99c": label_x = "a99c" label_y = "b99c" else: label_x = "a99d" label_y = "b99d" max_x = 65.0 max_y = 65.0 min_x = -65.0 min_y = -65.0 step = 25 elif self.colorspace == "ICtCp": label_x = "Ct" label_y = "Cp" max_x = 0.4 max_y = 0.5 min_x = -0.5 min_y = -0.4 step = .1 elif self.colorspace == "IPT": label_x = "P" label_y = "T" max_x = 1.0 max_y = 1.0 min_x = -1.0 min_y = -1.0 step = .25 else: if self.colorspace == "Lpt": label_x = "p" label_y = "t" else: label_x = "a*" label_y = "b*" max_x = 150.0 max_y = 150.0 min_x = -150.0 min_y = -150.0 step = 50 convert2coords = {"a*b*": lambda X, Y, Z: colormath.XYZ2Lab(*[v * 100 for v in X, Y, Z])[1:], "xy": lambda X, Y, Z: colormath.XYZ2xyY(X, Y, Z)[:2], "u*v*": lambda X, Y, Z: colormath.XYZ2Luv(*[v * 100 for v in X, Y, Z])[1:], "u'v'": lambda X, Y, Z: colormath.XYZ2Lu_v_(X, Y, Z)[1:], "DIN99": lambda X, Y, Z: colormath.XYZ2DIN99(*[v * 100 for v in X, Y, Z])[1:], "DIN99b": lambda X, Y, Z: colormath.XYZ2DIN99b(*[v * 100 for v in X, Y, Z])[1:], "DIN99c": lambda X, Y, Z: colormath.XYZ2DIN99c(*[v * 100 for v in X, Y, Z])[1:], "DIN99d": lambda X, Y, Z: colormath.XYZ2DIN99d(*[v * 100 for v in X, Y, Z])[1:], "ICtCp": lambda X, Y, Z: colormath.XYZ2ICtCp(X, Y, Z, clamp=False)[1:], "IPT": lambda X, Y, Z: colormath.XYZ2IPT(X, Y, Z)[1:], "Lpt": lambda X, Y, Z: colormath.XYZ2Lpt(*[v * 100 for v in X, Y, Z])[1:]}[self.colorspace] if show_outline and (self.colorspace == "a*b*" or self.colorspace.startswith("DIN99")): if self.colorspace == "a*b*": optimalcolors = [Lab[1:] for Lab in optimalcolors] else: optimalcolors = [convert2coords(*colormath.Lab2XYZ(L, a, b)) for L, a, b in optimalcolors] polys.append(plot.PolySpline(optimalcolors, colour=wx.Colour(102, 102, 102, 153), width=1.75)) # Add color temp graph from 4000 to 9000K if whitepoint == 1: colortemps = [] for kelvin in xrange(4000, 25001, 100): colortemps.append(convert2coords(*colormath.CIEDCCT2XYZ(kelvin))) polys.append(plot.PolySpline(colortemps, colour=wx.Colour(255, 255, 255, 204), width=1.5)) elif whitepoint == 2: colortemps = [] for kelvin in xrange(1667, 25001, 100): colortemps.append(convert2coords(*colormath.planckianCT2XYZ(kelvin))) polys.append(plot.PolySpline(colortemps, colour=wx.Colour(255, 255, 255, 204), width=1.5)) kwargs = {"scale": 255} amount = len(self.pcs_data) for i, pcs_triplets in enumerate(reversed(self.pcs_data)): if not pcs_triplets or len(pcs_triplets) == 1: amount -= 1 continue # Convert xicclu output to coordinates coords = [] for pcs_triplet in pcs_triplets: coords.append(convert2coords(*pcs_triplet)) profile = self.profiles.get(len(self.pcs_data) - 1 - i) if (profile and profile.profileClass == "nmcl" and "ncl2" in profile.tags and isinstance(profile.tags.ncl2, ICCP.NamedColor2Type) and profile.connectionColorSpace in ("Lab", "XYZ")): # Named color profile for j, (x, y) in enumerate(coords): RGBA = colormath.XYZ2RGB(*pcs_triplets[j], **kwargs) polys.append(plot.PolyMarker([(x, y)], colour=wx.Colour(*intlist(RGBA)), size=2, marker="plus", width=1.75)) else: xy = [] for x, y in coords[:-1]: xy.append((x, y)) if i == 0 or amount == 1: if x > max_x: max_x = x if y > max_y: max_y = y if x < min_x: min_x = x if y < min_y: min_y = y xy2 = [] for j, (x, y) in enumerate(xy): xy2.append((x, y)) if len(xy2) == self.size: xy3 = [] for k, (x, y) in enumerate(xy2): xy3.append((x, y)) if len(xy3) == 2: if i == 1: # Draw comparison profile with grey outline RGBA = 102, 102, 102, 255 w = 2 else: RGBA = colormath.XYZ2RGB(*pcs_triplets[j - len(xy2) + k], **kwargs) w = 3 polys.append(poly(list(xy3), colour=wx.Colour(*intlist(RGBA)), width=w)) if i == 1: xy3 = [] else: xy3 = xy3[1:] xy2 = xy2[self.size:] # Add whitepoint x, y = coords[-1] if i == 1: # Draw comparison profile with grey outline RGBA = 204, 204, 204, 102 marker="cross" s = 1.5 w = 1.75 else: RGBA = colormath.XYZ2RGB(*pcs_triplets[-1], **kwargs) marker = "plus" s = 2 w = 1.75 polys.append(plot.PolyMarker([(x, y)], colour=wx.Colour(*intlist(RGBA)), size=s, marker=marker, width=w)) xy_range = max(abs(min_x), abs(min_y)) + max(max_x, max_y) if center or not self.last_draw: self.axis_x = self.axis_y = (min(min_x, min_y), max(max_x, max_y)) self.spec_x = xy_range / step self.spec_y = xy_range / step if polys: graphics = plot.PlotGraphics(polys, title, label_x, label_y) p1, p2 = graphics.boundingBox() spacer = plot.PolyMarker([(p1[0] - xy_range / 20.0, p1[1] - xy_range / 20.0), (p2[0] + xy_range / 20.0, p2[1] + xy_range / 20.0)], colour=wx.Colour(0x33, 0x33, 0x33), size=0) graphics.objects.append(spacer) if center or not self.last_draw: boundingbox = spacer.boundingBox() self.resetzoom(boundingbox) self.center(boundingbox) self._DrawCanvas(graphics) def reset(self): self.axis_x = self.axis_y = -128, 128 def set_pcs_data(self, i): if len(self.pcs_data) < i + 1: self.pcs_data.append([]) else: self.pcs_data[i] = [] def setup(self, profiles=None, profile_no=None, intent="a", direction="f", order="n"): self.size = 40 # Number of segments from one primary to the next secondary color if not check_set_argyll_bin(): return # Setup xicclu xicclu = get_argyll_util("xicclu") if not xicclu: return cwd = self.worker.create_tempdir() if isinstance(cwd, Exception): raise cwd if not profiles: profiles = [ICCP.ICCProfile(get_data_path("ref/sRGB.icm")), get_display_profile()] for i, profile in enumerate(profiles): if profile_no is not None and i != profile_no: continue if (not profile or profile.profileClass == "link" or profile.connectionColorSpace not in ("Lab", "XYZ")): self.set_pcs_data(i) self.profiles[i] = None continue check = self.profiles.get(i) if (check and check.fileName == profile.fileName and check.ID == profile.calculateID(False) and intent == self.intent and direction == self.direction and order == self.order): continue self.profiles[i] = profile self.set_pcs_data(i) pcs_triplets = [] if (profile.profileClass == "nmcl" and "ncl2" in profile.tags and isinstance(profile.tags.ncl2, ICCP.NamedColor2Type) and profile.connectionColorSpace in ("Lab", "XYZ")): for k, v in profile.tags.ncl2.iteritems(): color = v.pcs.values() if profile.connectionColorSpace == "Lab": # Need to convert to XYZ color = colormath.Lab2XYZ(*color) if intent == "a" and "wtpt" in profile.tags: color = colormath.adapt(color[0], color[1], color[2], whitepoint_destination=profile.tags.wtpt.ir.values()) pcs_triplets.append(color) pcs_triplets.sort() elif profile.version >= 4: self.profiles[i] = None self.errors.append(Error("\n".join([lang.getstr("profile.iccv4.unsupported"), profile.getDescription()]))) continue else: channels = {'XYZ': 3, 'Lab': 3, 'Luv': 3, 'YCbr': 3, 'Yxy': 3, 'RGB': 3, 'GRAY': 1, 'HSV': 3, 'HLS': 3, 'CMYK': 4, 'CMY': 3, '2CLR': 2, '3CLR': 3, '4CLR': 4, '5CLR': 5, '6CLR': 6, '7CLR': 7, '8CLR': 8, '9CLR': 9, 'ACLR': 10, 'BCLR': 11, 'CCLR': 12, 'DCLR': 13, 'ECLR': 14, 'FCLR': 15}.get(profile.colorSpace) if not channels: self.errors.append(Error(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace)))) continue # Create input values device_values = [] if profile.colorSpace in ("Lab", "Luv", "XYZ", "Yxy"): # Use ICC PCSXYZ encoding range minv = 0.0 maxv = 0xffff / 32768.0 else: minv = 0.0 maxv = 1.0 step = (maxv - minv) / (self.size - 1) for j in xrange(min(3, channels)): for k in xrange(min(3, channels)): device_value = [0.0] * channels device_value[j] = maxv if j != k or channels == 1: for l in xrange(self.size): device_value[k] = minv + step * l device_values.append(list(device_value)) if profile.colorSpace in ("HLS", "HSV", "Lab", "Luv", "YCbr", "Yxy"): # Convert to actual color space # TODO: Handle HLS and YCbr tmp = list(device_values) device_values = [] for j, values in enumerate(tmp): if profile.colorSpace == "HSV": HSV = list(colormath.RGB2HSV(*values)) device_values.append(HSV) elif profile.colorSpace == "Lab": Lab = list(colormath.XYZ2Lab(*[v * 100 for v in values])) device_values.append(Lab) elif profile.colorSpace == "Luv": Luv = list(colormath.XYZ2Luv(*[v * 100 for v in values])) device_values.append(Luv) elif profile.colorSpace == "Yxy": xyY = list(colormath.XYZ2xyY(*values)) device_values.append(xyY) # Add white if profile.colorSpace == "RGB": device_values.append([1.0] * channels) elif profile.colorSpace == "HLS": device_values.append([0, 1, 0]) elif profile.colorSpace == "HSV": device_values.append([0, 0, 1]) elif profile.colorSpace in ("Lab", "Luv", "YCbr"): if profile.colorSpace == "YCbr": device_values.append([1.0, 0.0, 0.0]) else: device_values.append([100.0, 0.0, 0.0]) elif profile.colorSpace in ("XYZ", "Yxy"): if profile.colorSpace == "XYZ": device_values.append(profile.tags.wtpt.pcs.values()) else: device_values.append(profile.tags.wtpt.pcs.xyY) elif profile.colorSpace != "GRAY": device_values.append([0.0] * channels) if debug: safe_print("In:") for v in device_values: safe_print(" ".join(("%3.4f", ) * len(v)) % tuple(v)) # Lookup device -> XYZ values through profile using xicclu try: odata = self.worker.xicclu(profile, device_values, intent, direction, order) except Exception, exception: self.errors.append(Error(safe_unicode(exception))) continue if debug: safe_print("Out:") for pcs_triplet in odata: if debug: safe_print(" ".join(("%3.4f", ) * len(pcs_triplet)) % tuple(pcs_triplet)) pcs_triplets.append(pcs_triplet) if profile.connectionColorSpace == "Lab": pcs_triplets[-1] = list(colormath.Lab2XYZ(*pcs_triplets[-1])) if len(self.pcs_data) < i + 1: self.pcs_data.append(pcs_triplets) else: self.pcs_data[i] = pcs_triplets # Remove temporary files self.worker.wrapup(False) self.intent = intent self.direction = direction self.order = order class GamutViewOptions(wx_Panel): def __init__(self, *args, **kwargs): scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 wx_Panel.__init__(self, *args, **kwargs) self.SetBackgroundColour(BGCOLOUR) self.sizer = wx.FlexGridSizer(0, 3, 4, 0) self.sizer.AddGrowableCol(0) self.sizer.AddGrowableCol(1) self.sizer.AddGrowableCol(2) self.SetSizer(self.sizer) self.sizer.Add((0, 0)) legendsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(legendsizer) # Whitepoint legend legendsizer.Add(wx.StaticBitmap(self, -1, getbitmap("theme/cross-2px-12x12-fff")), flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=2) self.whitepoint_legend = wx.StaticText(self, -1, lang.getstr("whitepoint")) self.whitepoint_legend.SetMaxFontSize(11) self.whitepoint_legend.SetForegroundColour(FGCOLOUR) legendsizer.Add(self.whitepoint_legend, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10) # Comparison profile whitepoint legend self.comparison_whitepoint_bmp = wx.StaticBitmap(self, -1, getbitmap("theme/x-2px-12x12-999")) legendsizer.Add(self.comparison_whitepoint_bmp, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=20) self.comparison_whitepoint_legend = wx.StaticText(self, -1, "%s (%s)" % (lang.getstr("whitepoint"), lang.getstr("comparison_profile"))) self.comparison_whitepoint_legend.SetMaxFontSize(11) self.comparison_whitepoint_legend.SetForegroundColour(FGCOLOUR) legendsizer.Add(self.comparison_whitepoint_legend, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=8) self.sizer.Add((0, 0)) # Empty 'row' self.sizer.Add((0, 0)) self.sizer.Add((0, 0)) self.sizer.Add((0, 0)) self.sizer.Add((0, 0)) self.options_sizer = wx.FlexGridSizer(0, 3, 4, 8) self.options_sizer.AddGrowableCol(2) self.sizer.Add(self.options_sizer, flag=wx.EXPAND) # Colorspace select self.colorspace_outline_bmp = wx.StaticBitmap(self, -1, getbitmap("theme/solid-16x2-666")) self.options_sizer.Add(self.colorspace_outline_bmp, flag=wx.ALIGN_CENTER_VERTICAL) self.colorspace_label = wx.StaticText(self, -1, lang.getstr("colorspace")) self.colorspace_label.SetMaxFontSize(11) self.colorspace_label.SetForegroundColour(FGCOLOUR) self.options_sizer.Add(self.colorspace_label, flag=wx.ALIGN_CENTER_VERTICAL) self.colorspace_select = wx.Choice(self, -1, size=(150 * scale, -1), choices=["CIE a*b*", "CIE u*v*", "CIE u'v'", "CIE xy", "DIN99", "DIN99b", "DIN99c", "DIN99d", "ICtCp", "IPT", "Lpt"]) self.options_sizer.Add(self.colorspace_select, flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) self.colorspace_select.Bind(wx.EVT_CHOICE, self.generic_select_handler) self.colorspace_select.SetSelection(0) # Colorspace outline self.options_sizer.Add((0, 0)) self.options_sizer.Add((0, 0)) self.draw_gamut_outline_cb = CustomCheckBox(self, -1, lang.getstr("colorspace.show_outline")) self.draw_gamut_outline_cb.Bind(wx.EVT_CHECKBOX, self.draw_gamut_outline_handler) self.draw_gamut_outline_cb.SetMaxFontSize(11) self.draw_gamut_outline_cb.SetForegroundColour(FGCOLOUR) self.draw_gamut_outline_cb.SetValue(True) self.options_sizer.Add(self.draw_gamut_outline_cb, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=4) # Colortemperature curve select self.whitepoint_bmp = wx.StaticBitmap(self, -1, getbitmap("theme/solid-16x1-fff")) self.options_sizer.Add(self.whitepoint_bmp, flag=wx.ALIGN_CENTER_VERTICAL) self.whitepoint_label = wx.StaticText(self, -1, lang.getstr("whitepoint.colortemp.locus.curve")) self.whitepoint_label.SetMaxFontSize(11) self.whitepoint_label.SetForegroundColour(FGCOLOUR) self.options_sizer.Add(self.whitepoint_label, flag=wx.ALIGN_CENTER_VERTICAL) self.whitepoint_select = wx.Choice(self, -1, size=(150 * scale, -1), choices=[lang.getstr("calibration.file.none"), lang.getstr("whitepoint.colortemp.locus.daylight"), lang.getstr("whitepoint.colortemp.locus.blackbody")]) self.options_sizer.Add(self.whitepoint_select, flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) self.whitepoint_select.Bind(wx.EVT_CHOICE, self.generic_select_handler) self.whitepoint_select.SetSelection(0) self.whitepoint_bmp.Hide() # Comparison profile select self.comparison_profile_bmp = wx.StaticBitmap(self, -1, getbitmap("theme/dashed-16x2-666")) self.options_sizer.Add(self.comparison_profile_bmp, flag=wx.ALIGN_CENTER_VERTICAL) self.comparison_profile_label = wx.StaticText(self, -1, lang.getstr("comparison_profile")) self.comparison_profile_label.SetMaxFontSize(11) self.comparison_profile_label.SetForegroundColour(FGCOLOUR) self.options_sizer.Add(self.comparison_profile_label, flag=wx.ALIGN_CENTER_VERTICAL) self.comparison_profiles = OrderedDict([(lang.getstr("calibration.file.none"), None)]) srgb = None try: srgb = ICCP.ICCProfile(get_data_path("ref/sRGB.icm")) except EnvironmentError: pass except Exception, exception: safe_print(exception) if srgb: self.comparison_profiles[os.path.basename(srgb.fileName)] = srgb for profile in config.get_standard_profiles(): basename = os.path.basename(profile.fileName) if basename not in self.comparison_profiles: self.comparison_profiles[basename] = profile self.comparison_profile_select = wx.Choice(self, -1, size=(150 * scale, -1), choices=[]) self.comparison_profiles_sort() self.options_sizer.Add(self.comparison_profile_select, flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) self.comparison_profile_select.Bind(wx.EVT_CHOICE, self.comparison_profile_select_handler) droptarget = FileDrop(self.TopLevelParent, {".icc": self.comparison_profile_drop_handler, ".icm": self.comparison_profile_drop_handler}) self.comparison_profile_select.SetDropTarget(droptarget) if srgb: self.comparison_profile_select.SetSelection(1) self.comparison_profile_select.SetToolTipString(srgb.fileName) # Rendering intent select self.options_sizer.Add((0, 0)) self.rendering_intent_label = wx.StaticText(self, -1, lang.getstr("rendering_intent")) self.rendering_intent_label.SetMaxFontSize(11) self.rendering_intent_label.SetForegroundColour(FGCOLOUR) self.options_sizer.Add(self.rendering_intent_label, flag=wx.ALIGN_CENTER_VERTICAL) self.rendering_intent_select = wx.Choice(self, -1, size=(150 * scale, -1), choices=[lang.getstr("gamap.intents.a"), lang.getstr("gamap.intents.r"), lang.getstr("gamap.intents.p"), lang.getstr("gamap.intents.s")]) self.options_sizer.Add(self.rendering_intent_select, flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) self.rendering_intent_select.Bind(wx.EVT_CHOICE, self.rendering_intent_select_handler) self.rendering_intent_select.SetSelection(0) self.options_sizer.Add((0, 0)) # LUT toggle self.toggle_clut = CustomCheckBox(self, -1, "LUT") self.toggle_clut.SetForegroundColour(FGCOLOUR) self.toggle_clut.SetMaxFontSize(11) self.options_sizer.Add(self.toggle_clut, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_clut.Bind(wx.EVT_CHECKBOX, self.toggle_clut_handler) self.toggle_clut.Hide() # Direction selection self.direction_select = wx.Choice(self, -1, size=(150 * scale, -1), choices=[lang.getstr("direction.forward"), lang.getstr("direction.backward.inverted")]) self.options_sizer.Add(self.direction_select, flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) self.direction_select.Bind(wx.EVT_CHOICE, self.direction_select_handler) self.direction_select.SetSelection(0) self.sizer.Add((0, 0)) def DrawCanvas(self, profile_no=None, reset=True): # Gamut plot parent = self.TopLevelParent parent.client.SetEnableCenterLines(False) parent.client.SetEnableDiagonals(False) parent.client.SetEnableGrid(True) parent.client.SetEnablePointLabel(False) try: parent.client.setup([self.comparison_profile, parent.profile], profile_no, intent=self.intent, direction=self.direction, order=self.order) except Exception, exception: show_result_dialog(exception, parent) if reset: parent.client.reset() parent.client.resetzoom() wx.CallAfter(self.draw, center=reset) wx.CallAfter(parent.handle_errors) @property def colorspace(self): return self.get_colorspace() @property def comparison_profile(self): return self.comparison_profiles.values()[self.comparison_profile_select.GetSelection()] def comparison_profile_drop_handler(self, path): try: profile = ICCP.ICCProfile(path) except Exception, exception: show_result_dialog(exception, self.TopLevelParent) else: basename = os.path.basename(profile.fileName) self.comparison_profiles[basename] = profile self.comparison_profiles_sort() self.comparison_profile_select.SetSelection(self.comparison_profiles.keys().index(basename)) self.comparison_profile_select_handler(None) def comparison_profile_select_handler(self, event): if self.comparison_profile_select.GetSelection() > 0: self.comparison_profile_select.SetToolTipString(self.comparison_profile.fileName) else: self.comparison_profile_select.SetToolTip(None) self.comparison_whitepoint_bmp.Show(self.comparison_profile_select.GetSelection() > 0) self.comparison_whitepoint_legend.Show(self.comparison_profile_select.GetSelection() > 0) self.comparison_profile_bmp.Show(self.comparison_profile_select.GetSelection() > 0) self.DrawCanvas(0, reset=False) def comparison_profiles_sort(self): comparison_profiles = self.comparison_profiles[2:] comparison_profiles.sort(cmp, key=lambda s: s.lower()) self.comparison_profiles = self.comparison_profiles[:2] self.comparison_profiles.update(comparison_profiles) self.comparison_profile_select.SetItems(self.comparison_profiles.keys()) @property def direction(self): if self.direction_select.IsShown(): return {0: "f", 1: "ib"}.get(self.direction_select.GetSelection()) else: return "f" def draw(self, center=False): colorspace = self.colorspace parent = self.TopLevelParent parent.client.proportional = True parent.client.DrawCanvas("%s %s" % (colorspace, lang.getstr("colorspace")), colorspace, whitepoint=self.whitepoint_select.GetSelection(), center=center, show_outline=self.draw_gamut_outline_cb.GetValue()) def draw_gamut_outline_handler(self, event): self.colorspace_outline_bmp.Show(self.draw_gamut_outline_cb.GetValue()) self.draw() def generic_select_handler(self, event): self.whitepoint_bmp.Show(self.whitepoint_select.GetSelection() > 0) parent = self.TopLevelParent if parent.client.profiles: self.draw(center=event.GetId() == self.colorspace_select.GetId()) else: self.DrawCanvas() def get_colorspace(self, dimensions=2): return {0: "a*b*" if dimensions == 2 else "Lab", 1: "u*v*" if dimensions == 2 else "Luv", 2: "u'v'" if dimensions == 2 else "Lu'v'", 3: "xy" if dimensions == 2 else "xyY", 4: "DIN99", 5: "DIN99b", 6: "DIN99c", 7: "DIN99d", 8: "ICtCp", 9: "IPT", 10: "Lpt"}.get(self.colorspace_select.GetSelection(), "a*b*" if dimensions == 2 else "Lab") @property def intent(self): return {0: "a", 1: "r", 2: "p", 3: "s"}.get(self.rendering_intent_select.GetSelection()) @property def order(self): parent = self.TopLevelParent return {True: "n", False: "r"}.get(bool(parent.profile) and not ("B2A0" in parent.profile.tags or "A2B0" in parent.profile.tags) or self.toggle_clut.GetValue()) def rendering_intent_select_handler(self, event): self.DrawCanvas(reset=False) def direction_select_handler(self, event): self.DrawCanvas(reset=False) def toggle_clut_handler(self, event): parent = self.TopLevelParent self.Freeze() self.direction_select.Enable(bool(parent.profile) and "B2A0" in parent.profile.tags and "A2B0" in parent.profile.tags and self.toggle_clut.GetValue()) self.DrawCanvas(reset=False) self.Thaw() class ProfileInfoFrame(LUTFrame): def __init__(self, *args, **kwargs): if len(args) < 3 and not "title" in kwargs: kwargs["title"] = lang.getstr("profile.info") if not "name" in kwargs: kwargs["name"] = "profile_info" BaseFrame.__init__(self, *args, **kwargs) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-profile-info")) self.profile = None self.xLabel = lang.getstr("in") self.yLabel = lang.getstr("out") self.sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.sizer) self.splitter = TwoWaySplitter(self, -1, agwStyle = wx.SP_LIVE_UPDATE | wx.SP_NOSASH) self.sizer.Add(self.splitter, 1, flag=wx.EXPAND) p1 = wx_Panel(self.splitter, name="canvaspanel") p1.SetBackgroundColour(BGCOLOUR) p1.sizer = wx.BoxSizer(wx.VERTICAL) p1.SetSizer(p1.sizer) self.splitter.AppendWindow(p1) self.plot_mode_sizer = wx.BoxSizer(wx.HORIZONTAL) p1.sizer.Add(self.plot_mode_sizer, flag=wx.ALIGN_CENTER | wx.TOP, border=12) # The order of the choice items is significant for compatibility # with LUTFrame: # 0 = vcgt, # 1 = [rgb]TRC # 2 = gamut self.plot_mode_select = wx.Choice(p1, -1, choices=[lang.getstr("vcgt"), lang.getstr("[rgb]TRC"), lang.getstr("gamut")]) self.plot_mode_sizer.Add(self.plot_mode_select, flag=wx.ALIGN_CENTER_VERTICAL) self.plot_mode_select.Bind(wx.EVT_CHOICE, self.plot_mode_select_handler) self.plot_mode_select.Disable() self.tooltip_btn = BitmapButton(p1, -1, geticon(16, "question-inverted"), style=wx.NO_BORDER) self.tooltip_btn.SetBackgroundColour(BGCOLOUR) self.tooltip_btn.Bind(wx.EVT_BUTTON, self.tooltip_handler) self.tooltip_btn.SetToolTipString(lang.getstr("gamut_plot.tooltip")) self.plot_mode_sizer.Add(self.tooltip_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=8) self.save_plot_btn = BitmapButton(p1, -1, geticon(16, "image-x-generic-inverted"), style=wx.NO_BORDER) self.save_plot_btn.SetBackgroundColour(BGCOLOUR) self.save_plot_btn.Bind(wx.EVT_BUTTON, self.SaveFile) self.save_plot_btn.SetToolTipString(lang.getstr("save_as") + " " + "(*.bmp, *.xbm, *.xpm, *.jpg, *.png)") self.save_plot_btn.Disable() self.plot_mode_sizer.Add(self.save_plot_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=8) self.view_3d_btn = BitmapButton(p1, -1, geticon(16, "3D"), style=wx.NO_BORDER) self.view_3d_btn.SetBackgroundColour(BGCOLOUR) self.view_3d_btn.Bind(wx.EVT_BUTTON, self.view_3d) self.view_3d_btn.Bind(wx.EVT_CONTEXT_MENU, self.view_3d_format_popup) self.view_3d_btn.SetToolTipString(lang.getstr("view.3d")) self.view_3d_btn.Disable() self.plot_mode_sizer.Add(self.view_3d_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=12) self.view_3d_format_btn = BitmapButton(p1, -1, getbitmap("theme/dropdown-arrow"), style=wx.NO_BORDER) self.view_3d_format_btn.MinSize = (-1, self.view_3d_btn.Size[1]) self.view_3d_format_btn.SetBackgroundColour(BGCOLOUR) self.view_3d_format_btn.Bind(wx.EVT_BUTTON, self.view_3d_format_popup) self.view_3d_format_btn.Bind(wx.EVT_CONTEXT_MENU, self.view_3d_format_popup) self.view_3d_format_btn.SetToolTipString(lang.getstr("view.3d")) self.view_3d_format_btn.Disable() self.plot_mode_sizer.Add(self.view_3d_format_btn, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=4) self.client = GamutCanvas(p1) p1.sizer.Add(self.client, 1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP | wx.BOTTOM, border=4) self.options_panel = SimpleBook(p1) self.options_panel.SetBackgroundColour(BGCOLOUR) p1.sizer.Add(self.options_panel, flag=wx.EXPAND | wx.BOTTOM, border=8) self.status = BitmapBackgroundPanelText(p1) self.status.SetMaxFontSize(11) self.status.label_y = 0 self.status.textshadow = False self.status.SetBackgroundColour(BGCOLOUR) self.status.SetForegroundColour(FGCOLOUR) h = self.status.GetTextExtent("Ig")[1] self.status.SetMinSize((0, h * 2 + 10)) p1.sizer.Add(self.status, flag=wx.EXPAND) # Gamut view options self.gamut_view_options = GamutViewOptions(p1) self.options_panel.AddPage(self.gamut_view_options, "") # Curve view options self.lut_view_options = wx_Panel(p1, name="lut_view_options") self.lut_view_options.SetBackgroundColour(BGCOLOUR) self.lut_view_options_sizer = self.box_sizer = wx.FlexGridSizer(0, 3, 4, 4) self.lut_view_options_sizer.AddGrowableCol(0) self.lut_view_options_sizer.AddGrowableCol(2) self.lut_view_options.SetSizer(self.lut_view_options_sizer) self.options_panel.AddPage(self.lut_view_options, "") self.lut_view_options_sizer.Add((0, 0)) hsizer = wx.BoxSizer(wx.HORIZONTAL) self.lut_view_options_sizer.Add(hsizer, flag=wx.ALIGN_CENTER | wx.BOTTOM, border=8) self.rendering_intent_select = wx.Choice(self.lut_view_options, -1, choices=[lang.getstr("gamap.intents.a"), lang.getstr("gamap.intents.r"), lang.getstr("gamap.intents.p"), lang.getstr("gamap.intents.s")]) hsizer.Add((10, self.rendering_intent_select.Size[1])) hsizer.Add(self.rendering_intent_select, flag=wx.ALIGN_CENTER_VERTICAL) self.rendering_intent_select.Bind(wx.EVT_CHOICE, self.rendering_intent_select_handler) self.rendering_intent_select.SetSelection(1) self.direction_select = wx.Choice(self.lut_view_options, -1, choices=[lang.getstr("direction.backward"), lang.getstr("direction.forward.inverted")]) hsizer.Add(self.direction_select, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10) self.direction_select.Bind(wx.EVT_CHOICE, self.direction_select_handler) self.direction_select.SetSelection(0) self.lut_view_options_sizer.Add((0, 0)) self.lut_view_options_sizer.Add((0, 0)) hsizer = wx.BoxSizer(wx.HORIZONTAL) self.lut_view_options_sizer.Add(hsizer, flag=wx.ALIGN_CENTER) hsizer.Add((16, 0)) self.show_as_L = CustomCheckBox(self.lut_view_options, -1, u"L* \u2192") self.show_as_L.SetForegroundColour(FGCOLOUR) self.show_as_L.SetValue(True) hsizer.Add(self.show_as_L, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border=4) self.show_as_L.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.toggle_red = CustomCheckBox(self.lut_view_options, -1, "R") self.toggle_red.SetForegroundColour(FGCOLOUR) self.toggle_red.SetValue(True) hsizer.Add(self.toggle_red, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_red.Bind(wx.EVT_CHECKBOX, self.DrawLUT) hsizer.Add((4, 0)) self.toggle_green = CustomCheckBox(self.lut_view_options, -1, "G") self.toggle_green.SetForegroundColour(FGCOLOUR) self.toggle_green.SetValue(True) hsizer.Add(self.toggle_green, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_green.Bind(wx.EVT_CHECKBOX, self.DrawLUT) hsizer.Add((4, 0)) self.toggle_blue = CustomCheckBox(self.lut_view_options, -1, "B") self.toggle_blue.SetForegroundColour(FGCOLOUR) self.toggle_blue.SetValue(True) hsizer.Add(self.toggle_blue, flag=wx.ALIGN_CENTER_VERTICAL) self.toggle_blue.Bind(wx.EVT_CHECKBOX, self.DrawLUT) self.toggle_clut = CustomCheckBox(self.lut_view_options, -1, "LUT") self.toggle_clut.SetForegroundColour(FGCOLOUR) hsizer.Add(self.toggle_clut, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=16) self.toggle_clut.Bind(wx.EVT_CHECKBOX, self.toggle_clut_handler) self.lut_view_options_sizer.Add((0, 0)) p2 = wx_Panel(self.splitter, name="gridpanel") p2.sizer = wx.BoxSizer(wx.VERTICAL) p2.SetSizer(p2.sizer) self.splitter.AppendWindow(p2) self.grid = CustomGrid(p2, -1) self.grid.alternate_row_label_background_color = wx.Colour(230, 230, 230) self.grid.alternate_cell_background_color = self.grid.alternate_row_label_background_color self.grid.draw_horizontal_grid_lines = False self.grid.draw_vertical_grid_lines = False self.grid.draw_row_labels = False self.grid.show_cursor_outline = False self.grid.style = "" self.grid.CreateGrid(0, 2) self.grid.SetCellHighlightPenWidth(0) self.grid.SetCellHighlightROPenWidth(0) self.grid.SetDefaultCellBackgroundColour(self.grid.GetLabelBackgroundColour()) font = self.grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 self.grid.SetDefaultCellFont(font) self.grid.SetSelectionMode(wx.grid.Grid.wxGridSelectRows) self.grid.SetRowLabelSize(self.grid.GetDefaultRowSize()) self.grid.SetColLabelSize(0) self.grid.DisableDragRowSize() self.grid.EnableDragColSize() self.grid.EnableEditing(False) self.grid.EnableGridLines(False) self.grid.Bind(wx.grid.EVT_GRID_COL_SIZE, self.resize_grid) p2.sizer.Add(self.grid, 1, flag=wx.EXPAND) drophandlers = { ".icc": self.drop_handler, ".icm": self.drop_handler } self.droptarget = FileDrop(self, drophandlers) self.client.SetDropTarget(self.droptarget) droptarget = FileDrop(self, drophandlers) self.grid.SetDropTarget(droptarget) min_w = max(self.options_panel.GetBestSize()[0] + 24, defaults["size.profile_info.w"] - self.splitter._GetSashSize()) self.splitter.SetMinimumPaneSize(min_w) self.splitter.SetHSplit(0) border, titlebar = get_platform_window_decoration_size() self.SetSaneGeometry( getcfg("position.profile_info.x"), getcfg("position.profile_info.y"), defaults["size.profile_info.split.w"] + border * 2, getcfg("size.profile_info.h") + titlebar + border) self.SetMinSize((min_w + border * 2, defaults["size.profile_info.h"] + titlebar + border)) self.splitter.SetSplitSize((defaults["size.profile_info.split.w"] + border * 2, self.GetSize()[1])) self.splitter.SetExpandedSize(self.GetSize()) self.client.canvas.Bind(wx.EVT_MOTION, self.OnMotion) self.Bind(wx.EVT_CLOSE, self.OnClose) self.Bind(wx.EVT_MOVE, self.OnMove) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGING, self.OnSashPosChanging) self.display_no = -1 self.display_rects = get_display_rects() children = self.GetAllChildren() self.Bind(wx.EVT_KEY_DOWN, self.key_handler) for child in children: if isinstance(child, wx.Choice): child.SetMaxFontSize(11) child.Bind(wx.EVT_KEY_DOWN, self.key_handler) child.Bind(wx.EVT_MOUSEWHEEL, self.OnWheel) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and isinstance(child, wx.Panel)): # No need to enable double buffering under Linux and Mac OS X. # Under Windows, enabling double buffering on the panel seems # to work best to reduce flicker. child.SetDoubleBuffered(True) def DrawCanvas(self, profile_no=None, reset=True): self.SetStatusText('') if self.plot_mode_select.GetSelection() == self.plot_mode_select.GetCount() - 1: # Gamut plot self.plot_mode_sizer.Show(self.view_3d_btn) self.plot_mode_sizer.Show(self.view_3d_format_btn) self.options_panel.GetCurrentPage().DrawCanvas(reset=reset) self.save_plot_btn.Enable() self.view_3d_btn.Enable() self.view_3d_format_btn.Enable() else: # Curves plot self.plot_mode_sizer.Hide(self.view_3d_btn) self.plot_mode_sizer.Hide(self.view_3d_format_btn) self.client.SetEnableCenterLines(True) self.client.SetEnableDiagonals('Bottomleft-Topright') self.client.SetEnableGrid(False) self.client.SetEnablePointLabel(True) if (isinstance(self.profile.tags.get("vcgt"), ICCP.VideoCardGammaType) or (self.rTRC and self.gTRC and self.bTRC) or (("B2A0" in self.profile.tags or "A2B0" in self.profile.tags) and self.profile.colorSpace == "RGB")): self.toggle_red.Enable() self.toggle_green.Enable() self.toggle_blue.Enable() self.DrawLUT() self.handle_errors() else: self.toggle_red.Disable() self.toggle_green.Disable() self.toggle_blue.Disable() self.client.DrawLUT() self.splitter.GetTopLeft().sizer.Layout() self.splitter.GetTopLeft().Refresh() def LoadProfile(self, profile, reset=True): if not isinstance(profile, ICCP.ICCProfile): try: profile = ICCP.ICCProfile(profile) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + profile), self) self.DrawCanvas(reset=reset) return self.profile = profile self.rTRC = self.tf_rTRC = profile.tags.get("rTRC", profile.tags.get("kTRC")) self.gTRC = self.tf_gTRC = profile.tags.get("gTRC", profile.tags.get("kTRC")) self.bTRC = self.tf_bTRC = profile.tags.get("bTRC", profile.tags.get("kTRC")) self.trc = None self.gamut_view_options.direction_select.Enable("B2A0" in self.profile.tags and "A2B0" in self.profile.tags) if not self.gamut_view_options.direction_select.Enabled: self.gamut_view_options.direction_select.SetSelection(0) self.gamut_view_options.toggle_clut.SetValue("B2A0" in profile.tags or "A2B0" in profile.tags) self.gamut_view_options.toggle_clut.Show("B2A0" in profile.tags or "A2B0" in profile.tags) self.gamut_view_options.toggle_clut.Enable(isinstance(self.rTRC, ICCP.CurveType) and isinstance(self.gTRC, ICCP.CurveType) and isinstance(self.bTRC, ICCP.CurveType)) self.toggle_clut.SetValue("B2A0" in profile.tags or "A2B0" in profile.tags) plot_mode = self.plot_mode_select.GetSelection() plot_mode_count = self.plot_mode_select.GetCount() choice = [] info = profile.get_info() self.client.errors = [] if ((self.rTRC and self.gTRC and self.bTRC) or (("B2A0" in self.profile.tags or "A2B0" in self.profile.tags) and self.profile.colorSpace == "RGB")): # vcgt needs to be in here for compatibility with LUTFrame choice.append(lang.getstr("vcgt")) try: self.lookup_tone_response_curves() except Exception, exception: wx.CallAfter(show_result_dialog, exception, self) else: choice.append(lang.getstr("[rgb]TRC")) if getcfg("show_advanced_options"): if isinstance(self.profile.tags.get("A2B0"), ICCP.LUT16Type): choice.append(lang.getstr('profile.tags.A2B0.shaper_curves.input')) choice.append(lang.getstr('profile.tags.A2B0.shaper_curves.output')) if isinstance(self.profile.tags.get("A2B1"), ICCP.LUT16Type): choice.append(lang.getstr('profile.tags.A2B1.shaper_curves.input')) choice.append(lang.getstr('profile.tags.A2B1.shaper_curves.output')) if isinstance(self.profile.tags.get("A2B2"), ICCP.LUT16Type): choice.append(lang.getstr('profile.tags.A2B2.shaper_curves.input')) choice.append(lang.getstr('profile.tags.A2B2.shaper_curves.output')) if isinstance(self.profile.tags.get("B2A0"), ICCP.LUT16Type): choice.append(lang.getstr('profile.tags.B2A0.shaper_curves.input')) choice.append(lang.getstr('profile.tags.B2A0.shaper_curves.output')) if isinstance(self.profile.tags.get("B2A1"), ICCP.LUT16Type): choice.append(lang.getstr('profile.tags.B2A1.shaper_curves.input')) choice.append(lang.getstr('profile.tags.B2A1.shaper_curves.output')) if isinstance(self.profile.tags.get("B2A2"), ICCP.LUT16Type): choice.append(lang.getstr('profile.tags.B2A2.shaper_curves.input')) choice.append(lang.getstr('profile.tags.B2A2.shaper_curves.output')) choice.append(lang.getstr("gamut")) self.Freeze() self.plot_mode_select.SetItems(choice) if plot_mode < 0: plot_mode = self.plot_mode_select.GetCount() - 1 self.plot_mode_select.SetSelection(min(plot_mode, self.plot_mode_select.GetCount() - 1)) self.select_current_page() self.plot_mode_select.Enable() self.SetTitle(u" \u2014 ".join([lang.getstr("profile.info"), profile.getDescription()])) rows = [("", "")] lines = [] for label, value in info: label = label.replace("\0", "") value = wrap(universal_newlines(value.strip()).replace("\t", "\n"), 52).replace("\0", "").split("\n") linecount = len(value) for i, line in enumerate(value): value[i] = line.strip() label = universal_newlines(label).split("\n") while len(label) < linecount: label.append("") lines.extend(zip(label, value)) for i, line in enumerate(lines): line = list(line) indent = re.match("\s+", line[0]) for j, v in enumerate(line): if v.endswith("_"): continue key = re.sub("[^0-9A-Za-z]+", "_", strtr(line[j], {u"\u0394E": "Delta E"}).lower().strip(), 0).strip("_") val = lang.getstr(key) if key != val: line[j] = val if indent: #if i + 1 < len(lines) and lines[i + 1][0].startswith(" "): #marker = u" ├ " #else: #marker = u" └ " line[0] = indent.group() + line[0].strip() elif line[0]: #if i + 1 < len(lines) and lines[i + 1][0].startswith(" "): #marker = u"▼ " #else: #marker = u"► " pass rows.append(line) rows.append(("", "")) if self.grid.GetNumberRows(): self.grid.DeleteRows(0, self.grid.GetNumberRows()) self.grid.AppendRows(len(rows)) labelcolor = self.grid.GetLabelTextColour() alpha = 102 namedcolor = False for i, (label, value) in enumerate(rows): self.grid.SetCellValue(i, 0, " " + label) bgcolor = self.grid.GetCellBackgroundColour(i, 0) bgblend = (255 - alpha) / 255.0 blend = alpha / 255.0 textcolor = wx.Colour(int(round(bgblend * bgcolor.Red() + blend * labelcolor.Red())), int(round(bgblend * bgcolor.Green() + blend * labelcolor.Green())), int(round(bgblend * bgcolor.Blue() + blend * labelcolor.Blue()))) if label == lang.getstr("named_colors"): namedcolor = True elif label.strip() and label.lstrip() == label: namedcolor = False if namedcolor: color = re.match("(Lab|XYZ)((?:\s+-?\d+(?:\.\d+)){3,})", value) else: color = None if color: if color.groups()[0] == "Lab": color = colormath.Lab2RGB(*[float(v) for v in color.groups()[1].strip().split()], **dict(scale=255)) else: # XYZ color = colormath.XYZ2RGB(*[float(v) for v in color.groups()[1].strip().split()], **dict(scale=255)) labelbgcolor = wx.Colour(*[int(round(v)) for v in color]) rowlabelrenderer = CustomRowLabelRenderer(labelbgcolor) else: rowlabelrenderer = None self.grid.SetRowLabelRenderer(i, rowlabelrenderer) self.grid.SetCellTextColour(i, 0, textcolor) self.grid.SetCellValue(i, 1, value) self.grid.AutoSizeColumn(0) self.resize_grid() self.grid.ClearSelection() self.Layout() self.DrawCanvas(reset=reset) self.Thaw() def OnClose(self, event): if (getattr(self.worker, "thread", None) and self.worker.thread.isAlive()): self.worker.abort_subprocess(True) return self.worker.wrapup(False) writecfg(module="profile-info", options=("3d.format", "last_cal_or_icc_path", "last_icc_path", "position.profile_info", "size.profile_info")) # Hide first (looks nicer) self.Hide() # Need to use CallAfter to prevent hang under Windows if minimized wx.CallAfter(self.Destroy) def OnMotion(self, event): if isinstance(event, wx.MouseEvent): xy = self.client._getXY(event) else: xy = event if self.plot_mode_select.GetSelection() < self.plot_mode_select.GetCount() - 1: # Curves plot if isinstance(event, wx.MouseEvent): if not event.LeftIsDown(): self.UpdatePointLabel(xy) else: self.client.erase_pointlabel() else: # Gamut plot page = self.options_panel.GetCurrentPage() if (page.colorspace in ("a*b*", "u*v*") or page.colorspace.startswith("DIN99")): format = "%.2f %.2f" else: format = "%.4f %.4f" whitepoint_no = page.whitepoint_select.GetSelection() if whitepoint_no > 0: if page.colorspace == "a*b*": x, y, Y = colormath.Lab2xyY(100.0, xy[0], xy[1]) elif page.colorspace == "u*v*": X, Y, Z = colormath.Luv2XYZ(100.0, xy[0], xy[1]) x, y = colormath.XYZ2xyY(X, Y, Z)[:2] elif page.colorspace == "u'v'": x, y = colormath.u_v_2xy(xy[0], xy[1]) elif page.colorspace.startswith("DIN99"): # DIN99 L99 = colormath.Lab2DIN99(100, 0, 0)[0] if page.colorspace == "DIN99b": # DIN99b a, b = colormath.DIN99b2Lab(L99, xy[0], xy[1])[1:] elif page.colorspace == "DIN99c": # DIN99c a, b = colormath.DIN99c2Lab(L99, xy[0], xy[1])[1:] elif page.colorspace == "DIN99d": # DIN99d a, b = colormath.DIN99d2Lab(L99, xy[0], xy[1])[1:] else: # DIN99 a, b = colormath.DIN992Lab(L99, xy[0], xy[1])[1:] x, y = colormath.Lab2xyY(100.0, a, b)[:2] elif page.colorspace == "ICtCp": X, Y, Z = colormath.ICtCp2XYZ(1.0, xy[0], xy[1]) x, y = colormath.XYZ2xyY(X, Y, Z)[:2] elif page.colorspace == "IPT": X, Y, Z = colormath.IPT2XYZ(1.0, xy[0], xy[1]) x, y = colormath.XYZ2xyY(X, Y, Z)[:2] elif page.colorspace == "Lpt": X, Y, Z = colormath.Lpt2XYZ(100.0, xy[0], xy[1]) x, y = colormath.XYZ2xyY(X, Y, Z)[:2] else: # xy x, y = xy cct, delta = colormath.xy_CCT_delta(x, y, daylight=whitepoint_no == 1) status = format % xy if cct: if delta: locus = {"Blackbody": "blackbody", "Daylight": "daylight"}.get(page.whitepoint_select.GetStringSelection(), page.whitepoint_select.GetStringSelection()) status = u"%s, CCT %i (%s %.2f)" % ( format % xy, cct, lang.getstr("delta_e_to_locus", locus), delta["E"]) else: status = u"%s, CCT %i" % (format % xy, cct) self.SetStatusText(status) else: self.SetStatusText(format % xy) if isinstance(event, wx.MouseEvent): event.Skip() # Go to next handler def OnMove(self, event=None): if self.IsShownOnScreen() and not \ self.IsMaximized() and not self.IsIconized(): x, y = self.GetScreenPosition() setcfg("position.profile_info.x", x) setcfg("position.profile_info.y", y) if event: event.Skip() def OnSashPosChanging(self, event): border, titlebar = get_platform_window_decoration_size() self.splitter.SetExpandedSize((self.splitter._splitx + self.splitter._GetSashSize() + border * 2, self.GetSize()[1])) setcfg("size.profile_info.w", self.splitter._splitx + self.splitter._GetSashSize()) wx.CallAfter(self.redraw) wx.CallAfter(self.resize_grid) def OnSize(self, event=None): if self.IsShownOnScreen() and self.IsMaximized(): self.splitter.AdjustLayout() self.splitter.Refresh() wx.CallAfter(self.redraw) wx.CallAfter(self.resize_grid) if self.IsShownOnScreen() and not self.IsIconized(): wx.CallAfter(self._setsize) if event: event.Skip() def OnWheel(self, event): xy = wx.GetMousePosition() if not self.client.GetClientRect().Contains(self.client.ScreenToClient(xy)): if self.grid.GetClientRect().Contains(self.grid.ScreenToClient(xy)): self.grid.SetFocus() event.Skip() elif self.client.last_draw: if event.WheelRotation < 0: direction = 1.0 else: direction = -1.0 self.client.zoom(direction) def _setsize(self): if not self.IsMaximized(): w, h = self.GetSize() border, titlebar = get_platform_window_decoration_size() if self.splitter._expanded < 0: self.splitter.SetExpandedSize((self.splitter._splitx + self.splitter._GetSashSize() + border * 2, self.GetSize()[1])) self.splitter.SetSplitSize((w, self.GetSize()[1])) setcfg("size.profile_info.w", self.splitter._splitx + self.splitter._GetSashSize()) setcfg("size.profile_info.split.w", w - border * 2) else: self.splitter.SetExpandedSize((w, self.GetSize()[1])) setcfg("size.profile_info.w", w - border * 2) setcfg("size.profile_info.h", h - titlebar - border) def drop_handler(self, path): """ Drag'n'drop handler for .cal/.icc/.icm files. """ self.LoadProfile(path, reset=False) def get_platform_window_size(self, defaultwidth=None, defaultheight=None, split=False): if split: name = ".split" else: name = "" if not defaultwidth: defaultwidth = defaults["size.profile_info%s.w" % name] if not defaultheight: defaultheight = defaults["size.profile_info.h"] border, titlebar = get_platform_window_decoration_size() #return (max(max(getcfg("size.profile_info%s.w" % name), #defaultwidth) + border * 2, self.GetMinSize()[0]), #max(getcfg("size.profile_info.h"), #defaultheight) + titlebar + border) if split: w, h = self.splitter.GetSplitSize() else: w, h = self.splitter.GetExpandedSize() return (max(w, defaultwidth + border * 2, self.GetMinSize()[0]), max(h, defaultheight + titlebar + border)) def key_handler(self, event): # AltDown # CmdDown # ControlDown # GetKeyCode # GetModifiers # GetPosition # GetRawKeyCode # GetRawKeyFlags # GetUniChar # GetUnicodeKey # GetX # GetY # HasModifiers # KeyCode # MetaDown # Modifiers # Position # RawKeyCode # RawKeyFlags # ShiftDown # UnicodeKey # X # Y key = event.GetKeyCode() if (event.ControlDown() or event.CmdDown()): # CTRL (Linux/Mac/Windows) / CMD (Mac) focus = self.FindFocus() if focus and self.grid in (focus, focus.GetParent(), focus.GetGrandParent()): event.Skip() if key == 83 and self.profile: # S self.SaveFile() return else: event.Skip() elif key in (43, wx.WXK_NUMPAD_ADD): # + key zoom in self.client.zoom(-1) elif key in (45, wx.WXK_NUMPAD_SUBTRACT): # - key zoom out self.client.zoom(1) else: event.Skip() def plot_mode_select_handler(self, event): self.Freeze() self.select_current_page() reset = (self.plot_mode_select.GetSelection() == self.plot_mode_select.GetCount() - 1) if not reset: self.client.resetzoom() self.DrawCanvas(reset=reset) if not reset: wx.CallAfter(self.client.center) self.Thaw() def get_commands(self): return self.get_common_commands() + ["profile-info [filename]", "load "] def process_data(self, data): if (data[0] == "profile-info" and len(data) < 3) or (data[0] == "load" and len(data) == 2): if self.IsIconized(): self.Restore() self.Raise() if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: self.droptarget.OnDropFiles(0, 0, [path]) return "ok" return "invalid" def redraw(self): if self.plot_mode_select.GetSelection() == self.plot_mode_select.GetCount() - 1 and self.client.last_draw: # Update gamut plot self.client.Parent.Freeze() self.client._DrawCanvas(self.client.last_draw[0]) self.client.Parent.Thaw() def resize_grid(self, event=None): self.grid.SetColSize(1, max(self.grid.GetSize()[0] - self.grid.GetRowLabelSize() - self.grid.GetColSize(0) - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), 0)) self.grid.SetMargins(0 - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), 0 - wx.SystemSettings_GetMetric(wx.SYS_HSCROLL_Y)) self.grid.ForceRefresh() def select_current_page(self): if self.plot_mode_select.GetSelection() == self.plot_mode_select.GetCount() - 1: # Gamut plot self.options_panel.SetSelection(0) else: # Curves plot self.options_panel.SetSelection(1) self.splitter.GetTopLeft().Layout() def view_3d(self, event): profile = self.profile if not profile: defaultDir, defaultFile = get_verified_path("last_icc_path") dlg = wx.FileDialog(self, lang.getstr("profile.choose"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc") + "|*.icc;*.icm", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() path = dlg.GetPath() dlg.Destroy() if result != wx.ID_OK: return try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + path), self) else: setcfg("last_icc_path", path) setcfg("last_cal_or_icc_path", path) if profile: view_3d_format = getcfg("3d.format") if view_3d_format == "HTML": x3d = True html = True elif view_3d_format == "X3D": x3d = True html = False else: x3d = False html = False profile_path = None if profile.fileName and os.path.isfile(profile.fileName): profile_path = profile.fileName if not profile_path or not waccess(os.path.dirname(profile_path), os.W_OK): result = self.worker.create_tempdir() if isinstance(result, Exception): show_result_dialog(result, self) return desc = profile.getDescription() profile_path = os.path.join(self.worker.tempdir, make_argyll_compatible_path(desc) + profile_ext) profile.write(profile_path) profile_mtime = os.stat(profile_path).st_mtime filename, ext = os.path.splitext(profile_path) comparison_profile = self.gamut_view_options.comparison_profile comparison_profile_path = None comparison_profile_mtime = 0 if comparison_profile: comparison_profile_path = comparison_profile.fileName if (comparison_profile_path and not waccess(os.path.dirname(comparison_profile_path), os.W_OK)): result = self.worker.create_tempdir() if isinstance(result, Exception): show_result_dialog(result, self) return comparison_profile_path = os.path.join(self.worker.tempdir, make_argyll_compatible_path(os.path.basename(comparison_profile_path))) comparison_profile.write(comparison_profile_path) comparison_profile_mtime = os.stat(comparison_profile_path).st_mtime mods = [] intent = self.gamut_view_options.intent if intent != "r": mods.append(intent) direction = self.gamut_view_options.direction[-1] if direction != "f": mods.append(direction) order = self.gamut_view_options.order if order != "n": mods.append(order) if mods: filename += " " + "".join(["[%s]" % mod.upper() for mod in mods]) if comparison_profile_path: filename += " vs " + os.path.splitext(os.path.basename(comparison_profile_path))[0] if mods: filename += " " + "".join(["[%s]" % mod.upper() for mod in mods]) for vrmlext in (".vrml", ".vrml.gz", ".wrl", ".wrl.gz", ".wrz"): vrmlpath = filename + vrmlext if sys.platform == "win32": vrmlpath = make_win32_compatible_long_path(vrmlpath) if os.path.isfile(vrmlpath): break outfilename = filename colorspace = self.gamut_view_options.get_colorspace(3) if colorspace != "Lab": outfilename += " " + colorspace vrmloutpath = outfilename + vrmlext x3dpath = outfilename + ".x3d" if html: finalpath = x3dpath + ".html" elif x3d: finalpath = x3dpath else: finalpath = vrmloutpath if sys.platform == "win32": vrmloutpath = make_win32_compatible_long_path(vrmloutpath) x3dpath = make_win32_compatible_long_path(x3dpath) finalpath = make_win32_compatible_long_path(finalpath) for outpath in (finalpath, vrmloutpath, vrmlpath): if os.path.isfile(outpath): mtime = os.stat(outpath).st_mtime if profile_mtime > mtime or comparison_profile_mtime > mtime: # Profile(s) have changed, delete existing 3D visualization # so it will be re-generated os.remove(outpath) if os.path.isfile(finalpath): launch_file(finalpath) else: if os.path.isfile(vrmloutpath): self.view_3d_consumer(True, None, None, vrmloutpath, x3d, x3dpath, html) elif os.path.isfile(vrmlpath): self.view_3d_consumer(True, colorspace, None, vrmlpath, x3d, x3dpath, html) else: # Create VRML file profile_paths = [profile_path] if comparison_profile_path: profile_paths.append(comparison_profile_path) self.worker.start(self.view_3d_consumer, self.worker.calculate_gamut, cargs=(colorspace, filename, None, x3d, x3dpath, html), wargs=(profile_paths, intent, direction, order, False), progress_msg=lang.getstr("gamut.view.create"), continue_next=x3d, fancy=False) def view_3d_consumer(self, result, colorspace, filename, vrmlpath, x3d, x3dpath, html): if filename: if getcfg("vrml.compress"): vrmlpath = filename + ".wrz" else: vrmlpath = filename + ".wrl" if os.path.isfile(vrmlpath) and colorspace not in ("Lab", None): filename, ext = os.path.splitext(vrmlpath) if ext.lower() in (".gz", ".wrz"): cls = GzipFileProper else: cls = open with cls(vrmlpath, "rb") as vrmlfile: vrml = vrmlfile.read() vrml = x3dom.update_vrml(vrml, colorspace) vrmlpath = filename + " " + colorspace + ext with cls(vrmlpath, "wb") as vrmlfile: vrmlfile.write(vrml) if not os.path.isfile(vrmlpath): if self.worker.errors: result = UnloggedError("".join(self.worker.errors).strip()) else: result = Error(lang.getstr("file.missing", vrmlpath)) if isinstance(result, Exception): self.worker.stop_progress() show_result_dialog(result, self) elif x3d: vrmlfile2x3dfile(vrmlpath, x3dpath, embed=getcfg("x3dom.embed"), html=html, view=True, force=False, cache=getcfg("x3dom.cache"), worker=self.worker) else: launch_file(vrmlpath) def view_3d_format_popup(self, event): menu = wx.Menu() item_selected = False for file_format in config.valid_values["3d.format"]: item = menu.AppendRadioItem(-1, file_format) item.Check(file_format == getcfg("3d.format")) self.Bind(wx.EVT_MENU, self.view_3d_format_handler, id=item.Id) self.PopupMenu(menu) for item in menu.MenuItems: self.Unbind(wx.EVT_MENU, id=item.Id) menu.Destroy() def view_3d_format_handler(self, event): for item in event.EventObject.MenuItems: if item.IsChecked(): setcfg("3d.format", item.GetItemLabelText()) self.view_3d(None) def main(): config.initcfg("profile-info") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = ProfileInfoFrame(None, -1) if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() display_no = get_argyll_display_number(app.TopWindow.get_display()[1]) for arg in sys.argv[1:]: if os.path.isfile(arg): app.TopWindow.drop_handler(safe_unicode(arg)) break else: app.TopWindow.LoadProfile(get_display_profile(display_no)) app.TopWindow.Show() if __name__ == "__main__": main() DisplayCAL-3.5.0.0/DisplayCAL/wxReportFrame.py0000644000076500000000000010457513220336704020616 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from time import gmtime, strftime import math import os import sys from config import get_data_path, initcfg, getcfg, geticon, hascfg, setcfg from log import safe_print from meta import name as appname from util_str import strtr from worker import Error, get_current_profile_path, show_result_dialog import CGATS import ICCProfile as ICCP import config import localization as lang import worker from util_list import natsort_key_factory from wxTestchartEditor import TestchartEditor from wxwindows import BaseApp, BaseFrame, FileDrop, InfoDialog, wx from wxfixes import TempXmlResource import xh_fancytext import xh_filebrowsebutton import xh_hstretchstatbmp import xh_bitmapctrls from wx import xrc class ReportFrame(BaseFrame): """ Measurement report creation window """ def __init__(self, parent=None): BaseFrame.__init__(self, parent, -1, lang.getstr("measurement_report")) self.Bind(wx.EVT_CLOSE, self.OnClose) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) res = TempXmlResource(get_data_path(os.path.join("xrc", "report.xrc"))) res.InsertHandler(xh_fancytext.StaticFancyTextCtrlXmlHandler()) res.InsertHandler(xh_filebrowsebutton.FileBrowseButtonWithHistoryXmlHandler()) res.InsertHandler(xh_hstretchstatbmp.HStretchStaticBitmapXmlHandler()) res.InsertHandler(xh_bitmapctrls.BitmapButton()) res.InsertHandler(xh_bitmapctrls.StaticBitmap()) self.panel = res.LoadPanel(self, "panel") self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(self.panel, 1, flag=wx.EXPAND) self.set_child_ctrls_as_attrs(self) self.measurement_report_btn = wx.Button(self.panel, -1, lang.getstr("measure")) self.panel.Sizer.Insert(2, self.measurement_report_btn, flag=wx.RIGHT | wx.BOTTOM | wx.ALIGN_RIGHT, border=16) self.worker = worker.Worker(self) self.worker.set_argyll_version("xicclu") BaseFrame.setup_language(self) self.mr_setup_language() self.mr_init_controls() self.mr_init_frame() def mr_init_controls(self): for which in ("chart", "simulation_profile", "devlink_profile", "output_profile"): ctrl = self.FindWindowByName("%s_ctrl" % which) setattr(self, "%s_ctrl" % which, ctrl) ctrl.changeCallback = getattr(self, "%s_ctrl_handler" % which) if which not in ("devlink_profile", "output_profile"): if which == "chart": wildcard = "\.(cie|ti1|ti3)$" else: wildcard = "\.(icc|icm)$" history = [] if which == "simulation_profile": standard_profiles = config.get_standard_profiles(True) basenames = [] for path in standard_profiles: basename = os.path.basename(path) if not basename in basenames: basenames.append(basename) history.append(path) else: paths = get_data_path("ref", wildcard) or [] for path in paths: basepath, ext = os.path.splitext(path) if not (path.lower().endswith(".ti2") and basepath + ".cie" in paths): history.append(path) natsort_key = natsort_key_factory() history = sorted(history, key=lambda path: natsort_key(os.path.basename(path))) ctrl.SetHistory(history) ctrl.SetMaxFontSize(11) # Drop targets handler = getattr(self, "%s_drop_handler" % which) if which.endswith("_profile"): drophandlers = {".icc": handler, ".icm": handler} else: drophandlers = {".cgats": handler, ".cie": handler, ".ti1": handler, ".ti2": handler, ".ti3": handler, ".txt": handler} ctrl.SetDropTarget(FileDrop(self, drophandlers)) # Bind event handlers self.fields_ctrl.Bind(wx.EVT_CHOICE, self.fields_ctrl_handler) self.chart_btn.Bind(wx.EVT_BUTTON, self.chart_btn_handler) self.simulation_profile_cb.Bind(wx.EVT_CHECKBOX, self.use_simulation_profile_ctrl_handler) self.use_simulation_profile_as_output_cb.Bind(wx.EVT_CHECKBOX, self.use_simulation_profile_as_output_handler) self.enable_3dlut_cb.Bind(wx.EVT_CHECKBOX, self.enable_3dlut_handler) self.apply_none_ctrl.Bind(wx.EVT_RADIOBUTTON, self.apply_trc_ctrl_handler) self.apply_black_offset_ctrl.Bind(wx.EVT_RADIOBUTTON, self.apply_trc_ctrl_handler) self.apply_trc_ctrl.Bind(wx.EVT_RADIOBUTTON, self.apply_trc_ctrl_handler) self.mr_trc_ctrl.Bind(wx.EVT_CHOICE, self.mr_trc_ctrl_handler) self.mr_trc_gamma_ctrl.Bind(wx.EVT_COMBOBOX, self.mr_trc_gamma_ctrl_handler) self.mr_trc_gamma_ctrl.Bind(wx.EVT_KILL_FOCUS, self.mr_trc_gamma_ctrl_handler) self.mr_trc_gamma_type_ctrl.Bind(wx.EVT_CHOICE, self.mr_trc_gamma_type_ctrl_handler) self.mr_black_output_offset_ctrl.Bind(wx.EVT_SLIDER, self.mr_black_output_offset_ctrl_handler) self.mr_black_output_offset_intctrl.Bind(wx.EVT_TEXT, self.mr_black_output_offset_ctrl_handler) self.simulate_whitepoint_cb.Bind(wx.EVT_CHECKBOX, self.simulate_whitepoint_ctrl_handler) self.simulate_whitepoint_relative_cb.Bind(wx.EVT_CHECKBOX, self.simulate_whitepoint_relative_ctrl_handler) self.devlink_profile_cb.Bind(wx.EVT_CHECKBOX, self.use_devlink_profile_ctrl_handler) self.output_profile_current_btn.Bind(wx.EVT_BUTTON, self.output_profile_current_ctrl_handler) self.mr_update_controls() def mr_init_frame(self): self.measurement_report_btn.SetDefault() self.update_layout() config.defaults.update({ "position.reportframe.x": self.GetDisplay().ClientArea[0] + 40, "position.reportframe.y": self.GetDisplay().ClientArea[1] + 60, "size.reportframe.w": self.GetMinSize()[0], "size.reportframe.h": self.GetMinSize()[1]}) if (hascfg("position.reportframe.x") and hascfg("position.reportframe.y") and hascfg("size.reportframe.w") and hascfg("size.reportframe.h")): self.SetSaneGeometry(int(getcfg("position.reportframe.x")), int(getcfg("position.reportframe.y")), int(getcfg("size.reportframe.w")), int(getcfg("size.reportframe.h"))) else: self.Center() def OnClose(self, event=None): if (self.IsShownOnScreen() and not self.IsMaximized() and not self.IsIconized()): x, y = self.GetScreenPosition() setcfg("position.reportframe.x", x) setcfg("position.reportframe.y", y) setcfg("size.reportframe.w", self.GetSize()[0]) setcfg("size.reportframe.h", self.GetSize()[1]) config.writecfg() if event: event.Skip() def apply_trc_ctrl_handler(self, event): v = self.apply_trc_ctrl.GetValue() setcfg("measurement_report.apply_trc", int(v)) setcfg("measurement_report.apply_black_offset", int(self.apply_black_offset_ctrl.GetValue())) self.mr_update_main_controls() def mr_black_output_offset_ctrl_handler(self, event): if event.GetId() == self.mr_black_output_offset_intctrl.GetId(): self.mr_black_output_offset_ctrl.SetValue( self.mr_black_output_offset_intctrl.GetValue()) else: self.mr_black_output_offset_intctrl.SetValue( self.mr_black_output_offset_ctrl.GetValue()) v = self.mr_black_output_offset_ctrl.GetValue() / 100.0 if v != getcfg("measurement_report.trc_output_offset"): setcfg("measurement_report.trc_output_offset", v) self.mr_update_trc_control() #self.mr_show_trc_controls() def mr_trc_gamma_ctrl_handler(self, event): try: v = float(self.mr_trc_gamma_ctrl.GetValue().replace(",", ".")) if (v < config.valid_ranges["measurement_report.trc_gamma"][0] or v > config.valid_ranges["measurement_report.trc_gamma"][1]): raise ValueError() except ValueError: wx.Bell() self.mr_trc_gamma_ctrl.SetValue(str(getcfg("measurement_report.trc_gamma"))) else: if str(v) != self.mr_trc_gamma_ctrl.GetValue(): self.mr_trc_gamma_ctrl.SetValue(str(v)) if v != getcfg("measurement_report.trc_gamma"): setcfg("measurement_report.trc_gamma", v) self.mr_update_trc_control() self.mr_show_trc_controls() event.Skip() def mr_trc_ctrl_handler(self, event): self.Freeze() if self.mr_trc_ctrl.GetSelection() == 1: # BT.1886 setcfg("measurement_report.trc_gamma", 2.4) setcfg("measurement_report.trc_gamma_type", "B") setcfg("measurement_report.trc_output_offset", 0.0) self.mr_update_trc_controls() elif self.mr_trc_ctrl.GetSelection() == 0: # Pure power gamma 2.2 setcfg("measurement_report.trc_gamma", 2.2) setcfg("measurement_report.trc_gamma_type", "b") setcfg("measurement_report.trc_output_offset", 1.0) self.mr_update_trc_controls() else: # Custom # Have to use CallAfter, otherwise only part of the text will # be selected (wxPython bug?) wx.CallAfter(self.mr_trc_gamma_ctrl.SetFocus) wx.CallLater(1, self.mr_trc_gamma_ctrl.SelectAll) self.mr_show_trc_controls() self.Thaw() def mr_trc_gamma_type_ctrl_handler(self, event): v = self.trc_gamma_types_ab[self.mr_trc_gamma_type_ctrl.GetSelection()] if v != getcfg("measurement_report.trc_gamma_type"): setcfg("measurement_report.trc_gamma_type", v) self.mr_update_trc_control() self.mr_show_trc_controls() def chart_btn_handler(self, event): if self.Parent: parent = self.Parent else: parent = self chart = getcfg("measurement_report.chart") if not hasattr(parent, "tcframe"): parent.tcframe = TestchartEditor(parent, path=chart, cfg="measurement_report.chart", parent_set_chart_methodname="mr_set_testchart") elif (not hasattr(parent.tcframe, "ti1") or chart != parent.tcframe.ti1.filename): parent.tcframe.tc_load_cfg_from_ti1(None, chart, "measurement_report.chart", "mr_set_testchart") setcfg("tc.show", 1) parent.tcframe.Show() parent.tcframe.Raise() def chart_ctrl_handler(self, event): chart = self.chart_ctrl.GetPath() values = [] try: cgats = CGATS.CGATS(chart) except (IOError, CGATS.CGATSInvalidError, CGATS.CGATSInvalidOperationError, CGATS.CGATSKeyError, CGATS.CGATSTypeError, CGATS.CGATSValueError), exception: show_result_dialog(exception, self) else: data_format = cgats.queryv1("DATA_FORMAT") accurate = cgats.queryv1("ACCURATE_EXPECTED_VALUES") == "true" if data_format: basename, ext = os.path.splitext(chart) for column in data_format.itervalues(): column_prefix = column.split("_")[0] if (column_prefix in ("CMYK", "LAB", "RGB", "XYZ") and column_prefix not in values and (((ext.lower() == ".cie" or accurate) and column_prefix in ("LAB", "XYZ")) or (ext.lower() == ".ti1" and column_prefix in ("CMYK", "RGB")) or (ext.lower() not in (".cie", ".ti1")))): values.append(column_prefix) if values: self.panel.Freeze() self.fields_ctrl.SetItems(values) self.fields_ctrl.GetContainingSizer().Layout() self.panel.Thaw() fields = getcfg("measurement_report.chart.fields") if ext.lower() == ".ti1": index = 0 elif "RGB" in values and not ext.lower() == ".cie": index = values.index("RGB") elif "CMYK" in values: index = values.index("CMYK") elif "XYZ" in values: index = values.index("XYZ") elif "LAB" in values: index = values.index("LAB") else: index = 0 self.fields_ctrl.SetSelection(index) setcfg("measurement_report.chart", chart) self.chart_patches_amount.Freeze() self.chart_patches_amount.SetLabel( str(cgats.queryv1("NUMBER_OF_SETS") or "")) self.update_estimated_measurement_time("chart") self.chart_patches_amount.GetContainingSizer().Layout() self.chart_patches_amount.Thaw() self.chart_white = cgats.get_white_cie() if event: v = int(not self.chart_white or not "RGB" in values) setcfg("measurement_report.whitepoint.simulate", v) setcfg("measurement_report.whitepoint.simulate.relative", v) if not values: if chart: show_result_dialog(lang.getstr("error.testchart.missing_fields", (chart, "RGB/CMYK %s LAB/XYZ" % lang.getstr("or"))), self) self.chart_ctrl.SetPath(getcfg("measurement_report.chart")) else: self.chart_btn.Enable("RGB" in values) if self.Parent: parent = self.Parent else: parent = self if (event and self.chart_btn.Enabled and hasattr(parent, "tcframe") and self.tcframe.IsShownOnScreen() and (not hasattr(parent.tcframe, "ti1") or chart != parent.tcframe.ti1.filename)): parent.tcframe.tc_load_cfg_from_ti1(None, chart, "measurement_report.chart", "mr_set_testchart") self.fields_ctrl.Enable(self.fields_ctrl.GetCount() > 1) self.fields_ctrl_handler(event) def chart_drop_handler(self, path): if not self.worker.is_working(): self.chart_ctrl.SetPath(path) self.chart_ctrl_handler(True) def devlink_profile_ctrl_handler(self, event): self.set_profile("devlink") def devlink_profile_drop_handler(self, path): if not self.worker.is_working(): self.devlink_profile_ctrl.SetPath(path) self.set_profile("devlink") def enable_3dlut_handler(self, event): setcfg("3dlut.enable", int(self.enable_3dlut_cb.GetValue())) setcfg("measurement_report.use_devlink_profile", 0) self.mr_update_main_controls() def fields_ctrl_handler(self, event): setcfg("measurement_report.chart.fields", self.fields_ctrl.GetStringSelection()) if event: self.mr_update_main_controls() def output_profile_ctrl_handler(self, event): self.set_profile("output") def output_profile_current_ctrl_handler(self, event): profile_path = get_current_profile_path(True, True) if profile_path and os.path.isfile(profile_path): self.output_profile_ctrl.SetPath(profile_path) self.set_profile("output") def output_profile_drop_handler(self, path): if not self.worker.is_working(): self.output_profile_ctrl.SetPath(path) self.set_profile("output") def set_profile(self, which, profile_path=None, silent=False): path = getattr(self, "%s_profile_ctrl" % which).GetPath() if which == "output": ##if profile_path is None: ##profile_path = get_current_profile_path(True, True) ##self.output_profile_current_btn.Enable(self.output_profile_ctrl.IsShown() and ##bool(profile_path) and ##os.path.isfile(profile_path) and ##profile_path != path) profile = config.get_current_profile(True) if profile: path = profile.fileName else: path = None setcfg("measurement_report.output_profile", path) XYZbpout = self.XYZbpout # XYZbpout will be set to the blackpoint of the selected profile. # This is used to determine if black output offset controls should # be shown. Set a initial value slightly above zero so output # offset controls are shown if the selected profile doesn't exist. self.XYZbpout = [0.001, 0.001, 0.001] else: profile = None if which == "input": XYZbpin = self.XYZbpin self.XYZbpin = [0, 0, 0] if path or profile: if path and not os.path.isfile(path): if not silent: show_result_dialog(Error(lang.getstr("file.missing", path)), parent=self) return if not profile: try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError): if not silent: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + path), parent=self) except IOError, exception: if not silent: show_result_dialog(exception, parent=self) if profile: if ((which == "simulation" and (profile.profileClass not in ("mntr", "prtr") or profile.colorSpace not in ("CMYK", "RGB"))) or (which == "output" and (profile.profileClass != "mntr" or profile.colorSpace != "RGB")) or (which == "devlink" and profile.profileClass != "link")): show_result_dialog(NotImplementedError(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace))), parent=self) else: if (not getattr(self, which + "_profile", None) or getattr(self, which + "_profile").fileName != profile.fileName): # Profile selection has changed if which == "simulation": # Get profile blackpoint so we can check if it makes # sense to show TRC type and output offset controls try: odata = self.worker.xicclu(profile, (0, 0, 0), pcs="x") except Exception, exception: show_result_dialog(exception, self) self.set_profile_ctrl_path(which) return else: if len(odata) != 1 or len(odata[0]) != 3: show_result_dialog("Blackpoint is invalid: %s" % odata, self) self.set_profile_ctrl_path(which) return self.XYZbpin = odata[0] elif which == "output": # Get profile blackpoint so we can check if input # values would be clipped try: odata = self.worker.xicclu(profile, (0, 0, 0), pcs="x") except Exception, exception: show_result_dialog(exception, self) self.set_profile_ctrl_path(which) return else: if len(odata) != 1 or len(odata[0]) != 3: show_result_dialog("Blackpoint is invalid: %s" % odata, self) self.set_profile_ctrl_path(which) return self.XYZbpout = odata[0] else: # Profile selection has not changed # Restore cached XYZbp values if which == "output": self.XYZbpout = XYZbpout elif which == "input": self.XYZbpin = XYZbpin setattr(self, "%s_profile" % which, profile) if not silent: setcfg("measurement_report.%s_profile" % which, profile and profile.fileName) if which == "simulation": self.use_simulation_profile_ctrl_handler(None) elif hasattr(self, "XYZbpin"): self.mr_update_main_controls() return profile if path: self.set_profile_ctrl_path(which) else: setattr(self, "%s_profile" % which, None) if not silent: setcfg("measurement_report.%s_profile" % which, None) self.mr_update_main_controls() def set_profile_ctrl_path(self, which): getattr(self, "%s_profile_ctrl" % which).SetPath(getcfg("measurement_report.%s_profile" % which)) def mr_setup_language(self): # Shared with main window for which in ("chart", "simulation_profile", "devlink_profile", "output_profile"): if which.endswith("_profile"): wildcard = lang.getstr("filetype.icc") + "|*.icc;*.icm" else: wildcard = (lang.getstr("filetype.ti1_ti3_txt") + "|*.cgats;*.cie;*.ti1;*.ti2;*.ti3;*.txt") msg = {"chart": "measurement_report_choose_chart_or_reference", "devlink_profile": "devicelink_profile", "output_profile": "measurement_report_choose_profile"}.get(which, which) kwargs = dict(toolTip=lang.getstr(msg).rstrip(":"), dialogTitle=lang.getstr(msg), fileMask=wildcard) ctrl = getattr(self, "%s_ctrl" % which) for name, value in kwargs.iteritems(): setattr(ctrl, name, value) items = [] for item in ("Gamma 2.2", "trc.rec1886", "custom"): items.append(lang.getstr(item)) self.mr_trc_ctrl.SetItems(items) self.trc_gamma_types_ab = {0: "b", 1: "B"} self.trc_gamma_types_ba = {"b": 0, "B": 1} self.mr_trc_gamma_type_ctrl.SetItems([lang.getstr("trc.type.relative"), lang.getstr("trc.type.absolute")]) def mr_show_trc_controls(self): shown = self.apply_trc_ctrl.IsShown() enable6 = (shown and bool(getcfg("measurement_report.apply_trc"))) show = shown and (self.mr_trc_ctrl.GetSelection() == 2 or getcfg("show_advanced_options")) self.panel.Freeze() self.mr_trc_ctrl.Enable(enable6) self.mr_trc_ctrl.Show(shown) self.mr_trc_gamma_label.Enable(enable6) self.mr_trc_gamma_label.Show(show) self.mr_trc_gamma_ctrl.Enable(enable6) self.mr_trc_gamma_ctrl.Show(show) self.mr_trc_gamma_type_ctrl.Enable(enable6) self.mr_black_output_offset_label.Enable(enable6 and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_label.Show(show and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_ctrl.Enable(enable6 and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_ctrl.Show(show and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_intctrl.Enable(enable6 and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_intctrl.Show(show and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_intctrl_label.Enable(enable6 and self.XYZbpout > [0, 0, 0]) self.mr_black_output_offset_intctrl_label.Show(show and self.XYZbpout > [0, 0, 0]) self.mr_trc_gamma_type_ctrl.Show(show and self.XYZbpout > [0, 0, 0]) self.panel.Layout() self.panel.Thaw() def simulate_whitepoint_ctrl_handler(self, event): v = self.simulate_whitepoint_cb.GetValue() setcfg("measurement_report.whitepoint.simulate", int(v)) self.mr_update_main_controls() def simulate_whitepoint_relative_ctrl_handler(self, event): setcfg("measurement_report.whitepoint.simulate.relative", int(self.simulate_whitepoint_relative_cb.GetValue())) def simulation_profile_ctrl_handler(self, event): self.set_profile("simulation") def simulation_profile_drop_handler(self, path): if not self.worker.is_working(): self.simulation_profile_ctrl.SetPath(path) self.set_profile("simulation") def mr_update_controls(self): """ Update controls with values from the configuration """ self.panel.Freeze() self.simulation_profile_ctrl.SetPath(getcfg("measurement_report.simulation_profile")) self.set_profile("simulation", silent=True) self.mr_update_trc_controls() self.devlink_profile_ctrl.SetPath(getcfg("measurement_report.devlink_profile")) self.set_profile("devlink", silent=True) self.output_profile_ctrl.SetPath(getcfg("measurement_report.output_profile")) self.set_profile("output", silent=True) self.mr_set_testchart(getcfg("measurement_report.chart")) self.use_simulation_profile_ctrl_handler(None, update_trc=False) self.panel.Thaw() def mr_update_trc_control(self): if (getcfg("measurement_report.trc_gamma_type") == "B" and getcfg("measurement_report.trc_output_offset") == 0 and getcfg("measurement_report.trc_gamma") == 2.4): self.mr_trc_ctrl.SetSelection(1) # BT.1886 elif (getcfg("measurement_report.trc_gamma_type") == "b" and getcfg("measurement_report.trc_output_offset") == 1 and getcfg("measurement_report.trc_gamma") == 2.2): self.mr_trc_ctrl.SetSelection(0) # Pure power gamma 2.2 else: self.mr_trc_ctrl.SetSelection(2) # Custom def mr_update_trc_controls(self): self.mr_update_trc_control() self.mr_trc_gamma_ctrl.SetValue(str(getcfg("measurement_report.trc_gamma"))) self.mr_trc_gamma_type_ctrl.SetSelection(self.trc_gamma_types_ba[getcfg("measurement_report.trc_gamma_type")]) outoffset = int(getcfg("measurement_report.trc_output_offset") * 100) self.mr_black_output_offset_ctrl.SetValue(outoffset) self.mr_black_output_offset_intctrl.SetValue(outoffset) def mr_set_testchart(self, path): self.chart_ctrl.SetPath(path) self.chart_ctrl_handler(None) def mr_update_main_controls(self): ##print "MR update main ctrls", self.panel.Freeze() chart_has_white = bool(getattr(self, "chart_white", None)) color = getcfg("measurement_report.chart.fields") sim_profile_color = (getattr(self, "simulation_profile", None) and self.simulation_profile.colorSpace) if getcfg("measurement_report.use_simulation_profile"): setcfg("measurement_report.use_simulation_profile", int(sim_profile_color == color)) self.simulation_profile_cb.Enable(sim_profile_color == color) self.simulation_profile_cb.Show(color in ("CMYK", "RGB")) enable1 = bool(getcfg("measurement_report.use_simulation_profile")) ##print enable1, enable2 = (sim_profile_color == "RGB" and bool(getcfg("measurement_report.use_simulation_profile_as_output"))) self.simulation_profile_cb.SetValue(enable1) self.simulation_profile_ctrl.Show(color in ("CMYK", "RGB")) self.use_simulation_profile_as_output_cb.Show(enable1 and sim_profile_color == "RGB") self.use_simulation_profile_as_output_cb.SetValue(enable1 and enable2) self.enable_3dlut_cb.Enable(enable1 and enable2) self.enable_3dlut_cb.SetValue(enable1 and enable2 and bool(getcfg("3dlut.enable"))) self.enable_3dlut_cb.Show(enable1 and sim_profile_color == "RGB" and config.get_display_name() in ("madVR", "Prisma")) enable5 = (sim_profile_color == "RGB" and isinstance(self.simulation_profile.tags.get("rXYZ"), ICCP.XYZType) and isinstance(self.simulation_profile.tags.get("gXYZ"), ICCP.XYZType) and isinstance(self.simulation_profile.tags.get("bXYZ"), ICCP.XYZType) and not isinstance(self.simulation_profile.tags.get("A2B0"), ICCP.LUT16Type)) ##print enable5, self.XYZbpin, self.XYZbpout self.mr_trc_label.Show(enable1 and enable5) self.apply_none_ctrl.Show(enable1 and enable5) self.apply_none_ctrl.SetValue( (not getcfg("measurement_report.apply_black_offset") and not getcfg("measurement_report.apply_trc")) or not enable5) self.apply_black_offset_ctrl.Show(enable1 and enable5) self.apply_black_offset_ctrl.SetValue(enable5 and bool(getcfg("measurement_report.apply_black_offset"))) self.apply_trc_ctrl.Show(enable1 and enable5) self.apply_trc_ctrl.SetValue(enable5 and bool(getcfg("measurement_report.apply_trc"))) enable6 = (enable1 and enable5 and bool(getcfg("measurement_report.apply_trc") or getcfg("measurement_report.apply_black_offset"))) self.mr_show_trc_controls() show = (self.apply_none_ctrl.GetValue() and enable1 and enable5 and self.XYZbpout > self.XYZbpin) self.input_value_clipping_bmp.Show(show) self.input_value_clipping_label.Show(show) self.simulate_whitepoint_cb.Enable((enable1 and not enable2) or (color in ("LAB", "XYZ") and chart_has_white)) enable3 = bool(getcfg("measurement_report.whitepoint.simulate")) self.simulate_whitepoint_cb.SetValue(((enable1 and not enable2) or color in ("LAB", "XYZ")) and enable3) self.simulate_whitepoint_relative_cb.Enable(((enable1 and not enable2) or color in ("LAB", "XYZ")) and enable3) self.simulate_whitepoint_relative_cb.SetValue( ((enable1 and not enable2) or color in ("LAB", "XYZ")) and enable3 and bool(getcfg("measurement_report.whitepoint.simulate.relative"))) self.devlink_profile_cb.Show(enable1 and enable2) enable4 = bool(getcfg("measurement_report.use_devlink_profile")) self.devlink_profile_cb.SetValue(enable1 and enable2 and enable4) self.devlink_profile_ctrl.Enable(enable1 and enable2 and enable4) self.devlink_profile_ctrl.Show(enable1 and enable2) self.output_profile_label.Enable((color in ("LAB", "RGB", "XYZ") or enable1) and (not enable1 or not enable2 or self.apply_trc_ctrl.GetValue() or self.apply_black_offset_ctrl.GetValue())) self.output_profile_ctrl.Enable((color in ("LAB", "RGB", "XYZ") or enable1) and (not enable1 or not enable2 or self.apply_trc_ctrl.GetValue() or self.apply_black_offset_ctrl.GetValue())) output_profile = ((hasattr(self, "presets") and getcfg("measurement_report.output_profile") not in self.presets or not hasattr(self, "presets")) and bool(getattr(self, "output_profile", None))) self.measurement_report_btn.Enable(((enable1 and enable2 and (not enable6 or output_profile) and (not enable4 or (bool(getcfg("measurement_report.devlink_profile")) and os.path.isfile(getcfg("measurement_report.devlink_profile"))))) or (((not enable1 and color in ("LAB", "RGB", "XYZ")) or (enable1 and sim_profile_color == color and not enable2)) and output_profile)) and bool(getcfg("measurement_report.chart")) and os.path.isfile(getcfg("measurement_report.chart"))) self.panel.Layout() self.panel.Thaw() if hasattr(self, "update_scrollbars"): self.update_scrollbars() self.calpanel.Layout() else: self.update_layout() def update_estimated_measurement_time(self, which, patches=None): """ Update the estimated measurement time shown """ integration_time = self.worker.get_instrument_features().get("integration_time") if integration_time: if which == "chart" and not patches: patches = int(self.chart_patches_amount.Label) opatches = patches # Scale integration time based on display technology tech = getcfg("display.technology").lower() prop = [1, 1] if "plasma" in tech or "crt" in tech: prop[0] = 1.9 elif "projector" in tech or "dlp" in tech: prop[0] = 2.2 prop[1] = 2.2 elif "oled" in tech: prop[0] = 2.2 integration_time = [min(prop[i] * v, 20) for i, v in enumerate(integration_time)] # Get time per patch (tpp) tpp = [v for v in integration_time] if (("plasma" in tech or "crt" in tech or "projector" in tech or "dlp" in tech) and self.worker.get_instrument_name() in ("ColorMunki", "DTP92", "DTP94", "i1 Display", "i1 Display 1", "i1 Display 2", "i1 DisplayPro, ColorMunki Display", "i1 Monitor", "i1 Pro", "i1 Pro 2", "K-10", "specbos", "Spyder2", "Spyder3", "Spyder4", "Spyder5")): # Not all instruments can measure refresh rate! Add .25 secs # for those who do if refresh mode is used. tpp = [v + .25 for v in tpp] if config.get_display_name() == "madVR": # madVR takes a tad longer tpp = [v + .45 for v in tpp] min_delay_s = .2 if getcfg("measure.override_min_display_update_delay_ms"): # Add additional display update delay (zero at <= 200 ms) min_delay_ms = getcfg("measure.min_display_update_delay_ms") min_delay_s = max(min_delay_ms / 1000.0, min_delay_s) if getcfg("measure.override_display_settle_time_mult"): # We don't have access to display rise/fall time, so use this as # generic delay multiplier settle_mult = getcfg("measure.display_settle_time_mult") else: settle_mult = 1.0 tpp = [v + min_delay_s + .145 * settle_mult for v in tpp] avg_delay = sum(tpp) / (8 / 3.0) seconds = avg_delay * patches oseconds = seconds if getcfg("drift_compensation.blacklevel"): # Assume black patch every 60 seconds seconds += math.ceil(oseconds / 60.0) * ((20 - tpp[0]) / 2.0 + tpp[0]) # Assume black patch every n samples seconds += math.ceil(opatches / 40.0) * ((20 - tpp[0]) / 2.0 + tpp[0]) if getcfg("drift_compensation.whitelevel"): # Assume white patch every 60 seconds seconds += math.ceil(oseconds / 60.0) * tpp[1] # Assume white patch every n samples seconds += math.ceil(opatches / 40.0) * tpp[1] if (which in ("testchart", "chart") and getcfg("testchart.patch_sequence") != "optimize_display_response_delay"): # Roughly 650s patch response delay per 1000 patches # reduced by roughly 1 / 1.75 through optimization. seconds -= 0.65 / 1.75 * patches seconds += 0.65 * patches timestamp = gmtime(seconds) hours = int(strftime("%H", timestamp)) minutes = int(strftime("%M", timestamp)) minutes += int(math.ceil(int(strftime("%S", timestamp)) / 60.0)) if minutes > 59: minutes = 0 hours += 1 else: hours, minutes = "--", "--" getattr(self, which + "_meas_time").Label = lang.getstr("estimated_measurement_time", (hours, minutes)) # Show visual warning by coloring the text if measurement is going to # take a long time. Display and instrument stability and repeatability # may be an issue over such long periods of time. if hours != "--" and hours > 7: # Warning color "red" color = "#FF3300" elif hours != "--" and hours > 3: # Warning color "orange" color = "#F07F00" else: # Default text color color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT) getattr(self, which + "_meas_time").ForegroundColour = color def use_devlink_profile_ctrl_handler(self, event): setcfg("3dlut.enable", 0) setcfg("measurement_report.use_devlink_profile", int(self.devlink_profile_cb.GetValue())) self.mr_update_main_controls() def use_simulation_profile_ctrl_handler(self, event, update_trc=True): if event: use_sim_profile = self.simulation_profile_cb.GetValue() setcfg("measurement_report.use_simulation_profile", int(use_sim_profile)) else: use_sim_profile = getcfg("measurement_report.use_simulation_profile") sim_profile = getattr(self, "simulation_profile", None) enable = False if sim_profile: v = int(sim_profile.profileClass == "prtr") setcfg("measurement_report.whitepoint.simulate", v) setcfg("measurement_report.whitepoint.simulate.relative", v) if ("rTRC" in sim_profile.tags and "gTRC" in sim_profile.tags and "bTRC" in sim_profile.tags and sim_profile.tags.rTRC == sim_profile.tags.gTRC == sim_profile.tags.bTRC and isinstance(sim_profile.tags.rTRC, ICCP.CurveType)): tf = sim_profile.tags.rTRC.get_transfer_function(outoffset=1.0) if update_trc or self.XYZbpin == self.XYZbpout: # Use only BT.1886 black output offset setcfg("measurement_report.apply_black_offset", int(tf[0][1] not in (-240, -709) and (not tf[0][0].startswith("Gamma") or tf[1] < .95) and self.XYZbpin != self.XYZbpout)) if update_trc: # Use BT.1886 gamma mapping for SMPTE 240M / Rec. 709 TRC setcfg("measurement_report.apply_trc", int(tf[0][1] in (-240, -709) or (tf[0][0].startswith("Gamma") and tf[1] >= .95))) # Set gamma to profile gamma if single gamma profile if tf[0][0].startswith("Gamma") and tf[1] >= .95: if not getcfg("measurement_report.trc_gamma.backup", False): # Backup current gamma setcfg("measurement_report.trc_gamma.backup", getcfg("measurement_report.trc_gamma")) setcfg("measurement_report.trc_gamma", round(tf[0][1], 2)) # Restore previous gamma if not single gamma profile elif getcfg("measurement_report.trc_gamma.backup", False): setcfg("measurement_report.trc_gamma", getcfg("measurement_report.trc_gamma.backup")) setcfg("measurement_report.trc_gamma.backup", None) self.mr_update_trc_controls() enable = (tf[0][1] not in (-240, -709) and self.XYZbpin != self.XYZbpout) self.apply_black_offset_ctrl.Enable(use_sim_profile and enable) self.mr_update_main_controls() def use_simulation_profile_as_output_handler(self, event): setcfg("measurement_report.use_simulation_profile_as_output", int(self.use_simulation_profile_as_output_cb.GetValue())) self.mr_update_main_controls() if __name__ == "__main__": config.initcfg() lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = ReportFrame() app.TopWindow.Show() app.MainLoop() DisplayCAL-3.5.0.0/DisplayCAL/wxScriptingClient.py0000644000076500000000000004261413154615407021472 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement from time import sleep import errno import os import socket import sys import threading from config import confighome, getcfg, geticon, initcfg, setcfg, writecfg from meta import name as appname from safe_print import safe_print from util_str import safe_str, safe_unicode, universal_newlines from wexpect import split_command_line from wxaddons import wx from wxfixes import GenBitmapButton from wxwindows import BaseApp, SimpleTerminal, numpad_keycodes import config import demjson import localization as lang import wx.lib.delayedresult as delayedresult ERRORCOLOR = "#FF3300" RESPONSECOLOR = "#CCCCCC" class ScriptingClientFrame(SimpleTerminal): def __init__(self): SimpleTerminal.__init__(self, None, wx.ID_ANY, lang.getstr("scripting-client"), start_timer=False, pos=(getcfg("position.scripting.x"), getcfg("position.scripting.y")), size=(getcfg("size.scripting.w"), getcfg("size.scripting.h")), consolestyle=wx.TE_CHARWRAP | wx.TE_MULTILINE | wx.TE_PROCESS_ENTER | wx.TE_RICH | wx.VSCROLL | wx.NO_BORDER, show=False, name="scriptingframe") self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-scripting-client")) self.console.SetForegroundColour("#EEEEEE") self.console.SetDefaultStyle(wx.TextAttr("#EEEEEE")) self.busy = False self.commands = [] self.history = [] self.historyfilename = os.path.join(confighome, config.appbasename + "-scripting-client.history") if os.path.isfile(self.historyfilename): try: with open(self.historyfilename) as historyfile: for line in historyfile: self.history.append(safe_unicode(line, "UTF-8").rstrip("\r\n")) except EnvironmentError, exception: safe_print("Warning - couldn't read history file:", exception) # Always have empty selection at bottom self.history.append("") self.historypos = len(self.history) - 1 self.overwrite = False # Determine which application we should connect to by default (if any) self.conn = None scripting_hosts = self.get_scripting_hosts() self.sizer.Layout() if sys.platform != "darwin": # Under Mac OS X, the transparency messes up the window shadow if # there is another window's border behind self.SetTransparent(240) self.Bind(wx.EVT_ACTIVATE, self.OnActivate) self.Bind(wx.EVT_SIZE, self.OnSize) self.Unbind(wx.EVT_CHAR_HOOK) self.console.Unbind(wx.EVT_KEY_DOWN, self.console) self.console.Bind(wx.EVT_KEY_DOWN, self.key_handler) self.console.Bind(wx.EVT_TEXT_COPY, self.copy_text_handler) self.console.Bind(wx.EVT_TEXT_PASTE, self.paste_text_handler) if sys.platform == "darwin": # Under Mac OS X, pasting text via the context menu isn't catched # by EVT_TEXT_PASTE. TODO: Implement custom context menu. self.console.Bind(wx.EVT_CONTEXT_MENU, lambda event: None) if scripting_hosts: self.add_text("> getscriptinghosts" + "\n") for host in scripting_hosts: self.add_text(host + "\n") ip_port = scripting_hosts[0].split()[0] self.add_text("> connect " + ip_port + "\n") self.connect_handler(ip_port) def OnActivate(self, event): self.console.SetFocus() linecount = self.console.GetNumberOfLines() lastline = self.console.GetLineText(linecount - 1) lastpos = self.console.GetLastPosition() start, end = self.console.GetSelection() if (start == end and self.console.GetInsertionPoint() < lastpos - len(lastline)): self.console.SetInsertionPoint(lastpos) def OnClose(self, event): # So we can send_command('close') ourselves without prematurely exiting # the wx main loop while self.busy: wx.Yield() sleep(.05) # Hide first (looks nicer) self.Hide() try: with open(self.historyfilename, "wb") as historyfile: for command in self.history: if command: historyfile.write(safe_str(command, "UTF-8") + os.linesep) except EnvironmentError, exception: safe_print("Warning - couldn't write history file:", exception) self.listening = False # Need to use CallAfter to prevent hang under Windows if minimized wx.CallAfter(self.Destroy) def OnMove(self, event=None): if self.IsShownOnScreen() and not self.IsMaximized() and not \ self.IsIconized(): x, y = self.GetScreenPosition() setcfg("position.scripting.x", x) setcfg("position.scripting.y", y) if event: event.Skip() def OnSize(self, event=None): if self.IsShownOnScreen() and not self.IsMaximized() and not \ self.IsIconized(): w, h = self.GetSize() setcfg("size.scripting.w", w) setcfg("size.scripting.h", h) if event: event.Skip() def add_error_text(self, text): self.add_text(text) end = self.console.GetLastPosition() start = end - len(text) self.mark_text(start, end, ERRORCOLOR) def check_result(self, delayedResult, get_response=False, additional_commands=None, colorize=True): try: result = delayedResult.get() except Exception, exception: if hasattr(exception, "originalTraceback"): self.add_text(exception.originalTraceback) result = exception if result: if isinstance(result, socket.socket): self.conn = result result = lang.getstr("connection.established") text = "%s\n" % safe_unicode(result) self.add_text(text) if colorize or isinstance(result, Exception): end = self.console.GetLastPosition() start = end - len(text) if isinstance(result, Exception): color = ERRORCOLOR else: color = RESPONSECOLOR self.mark_text(start, end, color) if get_response and not isinstance(result, Exception): delayedresult.startWorker(self.check_result, get_response, cargs=(False, additional_commands)) else: self.add_text("> ") if additional_commands: self.add_text(additional_commands[0].rstrip("\n")) if additional_commands[0].endswith("\n"): self.send_command_handler(additional_commands[0], additional_commands[1:]) return self.console.SetFocus() self.busy = False def clear(self): self.console.Clear() self.add_text("> ") self.console.SetInsertionPoint(2) def connect_handler(self, ip_port): ip, port = ip_port.split(":", 1) try: port = int(port) except ValueError: self.add_error_text(lang.getstr("port.invalid", port) + "\n") self.add_text("> ") return if self.conn: self.disconnect() self.add_text(lang.getstr("connecting.to", (ip, port)) + "\n") self.busy = True delayedresult.startWorker(self.check_result, self.connect, cargs=(self.get_app_info, None, False), wargs=(ip, port)) def copy_text_handler(self, event): # Override native copy to clipboard because reading the text back # from wx.TheClipboard results in wrongly encoded characters under # Mac OS X # TODO: The correct way to fix this would actually be in the pasting # code because pasting text that was copied from other sources still # has the problem with this workaround clipdata = wx.TextDataObject() clipdata.SetText(self.console.GetStringSelection()) wx.TheClipboard.Open() wx.TheClipboard.SetData(clipdata) wx.TheClipboard.Close() def disconnect(self): if self.conn: try: peer = self.conn.getpeername() self.conn.shutdown(socket.SHUT_RDWR) except socket.error, exception: if exception.errno != errno.ENOTCONN: self.add_text(safe_unicode(exception) + "\n") else: self.add_text(lang.getstr("disconnected.from", peer) + "\n") self.conn.close() del self.conn self.conn = None self.commands = [] else: self.add_error_text(lang.getstr("not_connected") + "\n") def get_app_info(self): commands = ["setresponseformat plain", "getcommands", "getappname"] try: for command in commands: self.conn.send_command(command) response = self.conn.get_single_response() if command == "getcommands": self.commands = response.splitlines() elif command == "getappname": wx.CallAfter(self.add_text, lang.getstr("connected.to.at", ((response, ) + self.conn.getpeername())) + "\n%s\n" % lang.getstr("scripting-client.cmdhelptext")) except socket.error, exception: return exception def get_commands(self): return self.get_common_commands() + ["clear", "connect :", "disconnect", "echo ", "getscriptinghosts"] def get_common_commands(self): cmds = SimpleTerminal.get_common_commands(self) return filter(lambda cmd: not cmd.startswith("echo "), cmds) def get_last_line(self): linecount = self.console.GetNumberOfLines() lastline = self.console.GetLineText(linecount - 1) lastpos = self.console.GetLastPosition() start, end = self.console.GetSelection() startcol, startrow = self.console.PositionToXY(start) endcol, endrow = self.console.PositionToXY(end) if startcol > lastpos or endcol > lastpos: # Under Mac OS X, PositionToXY seems to be broken and returns insane # numbers. Calculate them ourselves. Note they will only be correct # for the last line, but that's all we care about. startcol = len(lastline) - (lastpos - start) endcol = len(lastline) - (lastpos - end) return lastline, lastpos, startcol, endcol def get_response(self): try: return "< " + "\n< ".join(self.conn.get_single_response().splitlines()) except socket.error, exception: return exception def key_handler(self, event): ##safe_print("KeyCode", event.KeyCode, "UnicodeKey", event.UnicodeKey, ##"AltDown:", event.AltDown(), ##"CmdDown:", event.CmdDown(), ##"ControlDown:", event.ControlDown(), ##"MetaDown:", event.MetaDown(), ##"ShiftDown:", event.ShiftDown(), ##"console.CanUndo:", self.console.CanUndo(), ##"console.CanRedo:", self.console.CanRedo()) insertionpoint = self.console.GetInsertionPoint() lastline, lastpos, startcol, endcol = self.get_last_line() ##safe_print(insertionpoint, lastline, lastpos, startcol, endcol) cmd_or_ctrl = (event.ControlDown() or event.CmdDown()) and not event.AltDown() if cmd_or_ctrl and event.KeyCode == 65: # A self.console.SelectAll() elif cmd_or_ctrl and event.KeyCode in (67, 88): # C self.copy_text_handler(None) elif insertionpoint >= lastpos - len(lastline): if cmd_or_ctrl: if startcol > 1 and event.KeyCode == 86: # V self.paste_text_handler(None) elif event.KeyCode in (89, 90): # Y / Z if (event.KeyCode == 89 or (sys.platform != "win32" and event.ShiftDown())): if self.console.CanRedo(): self.console.Redo() else: wx.Bell() elif self.console.CanUndo() and lastline[2:]: self.console.Undo() else: wx.Bell() elif event.KeyCode != wx.WXK_SHIFT and event.UnicodeKey: # wxPython 3 "Phoenix" defines UnicodeKey as "\x00" when # control key pressed if event.UnicodeKey != "\0": wx.Bell() elif event.KeyCode in (10, 13, wx.WXK_NUMPAD_ENTER): # Enter, return key self.send_command_handler(lastline[2:]) elif event.KeyCode == wx.WXK_BACK: # Backspace if startcol > 1 and endcol > 2: if endcol > startcol: # TextCtrl.WriteText would be optimal, but it doesn't # do anything under wxGTK with wxPython 2.8.12 self.add_text("\r" + lastline[:startcol] + lastline[endcol:]) self.console.SetInsertionPoint(lastpos - len(lastline) + startcol) else: event.Skip() else: wx.Bell() elif event.KeyCode in (wx.WXK_DELETE, wx.WXK_NUMPAD_DELETE): if startcol > 1 and (endcol < len(lastline) or startcol < endcol): if endcol > startcol: # TextCtrl.WriteText would be optimal, but it doesn't # do anything under wxGTK with wxPython 2.8.12 self.add_text("\r" + lastline[:startcol] + lastline[endcol:]) self.console.SetInsertionPoint(lastpos - len(lastline) + startcol) else: event.Skip() else: wx.Bell() elif event.KeyCode in (wx.WXK_DOWN, wx.WXK_NUMPAD_DOWN, wx.WXK_NUMPAD_PAGEDOWN, wx.WXK_PAGEDOWN): if self.historypos < len(self.history) - 1: self.historypos += 1 self.add_text("\r> " + self.history[self.historypos]) else: wx.Bell() elif event.KeyCode in (wx.WXK_END, wx.WXK_NUMPAD_END): event.Skip() elif event.KeyCode in (wx.WXK_HOME, wx.WXK_NUMPAD_HOME): self.console.SetInsertionPoint(lastpos - len(lastline) + 2) elif event.KeyCode in (wx.WXK_INSERT, wx.WXK_NUMPAD_INSERT): self.overwrite = not self.overwrite elif event.KeyCode in (wx.WXK_LEFT, wx.WXK_NUMPAD_LEFT): if (startcol > 2): event.Skip() else: wx.Bell() elif event.KeyCode in (wx.WXK_RIGHT, wx.WXK_NUMPAD_RIGHT): if endcol < len(lastline): event.Skip() else: wx.Bell() elif event.KeyCode in (wx.WXK_UP, wx.WXK_NUMPAD_UP, wx.WXK_NUMPAD_PAGEUP, wx.WXK_PAGEUP): if self.historypos > 0: self.historypos -= 1 self.add_text("\r> " + self.history[self.historypos]) else: wx.Bell() elif event.KeyCode == wx.WXK_TAB: # Tab completion # Can't use built-in AutoComplete feature because it only # works for single-line TextCtrls commonpart = lastline[2:endcol] candidates = [] for command in sorted(list(set(self.commands + self.get_commands()))): command = command.split()[0] if command.startswith(commonpart): candidates.append(command) findcommon = bool(candidates) while findcommon and len(candidates[0]) > len(commonpart): commonpart += candidates[0][len(commonpart)] for candidate in candidates: if candidate.startswith(commonpart): continue else: commonpart = commonpart[:-1] findcommon = False break if len(candidates) > 1: self.add_text("\n%s\n" % " ".join(candidates)) self.add_text("\r> " + commonpart + lastline[endcol:]) self.console.SetInsertionPoint(self.console.GetLastPosition() - len(lastline[endcol:])) elif event.UnicodeKey or event.KeyCode in numpad_keycodes: if startcol > 1: event.Skip() if self.overwrite and startcol == endcol: self.add_text("\r> " + lastline[2:startcol] + lastline[endcol + 1:]) self.console.SetInsertionPoint(insertionpoint) else: wx.Bell() self.console.SetInsertionPoint(lastpos) elif event.KeyCode not in (wx.WXK_ALT, wx.WXK_COMMAND, wx.WXK_CONTROL, wx.WXK_SHIFT): wx.Bell() self.console.SetInsertionPoint(lastpos) def mark_text(self, start, end, color): self.console.SetStyle(start, end, wx.TextAttr(color)) def paste_text_handler(self, event): do = wx.TextDataObject() wx.TheClipboard.Open() success = wx.TheClipboard.GetData(do) wx.TheClipboard.Close() if success: insertionpoint = self.console.GetInsertionPoint() lastline, lastpos, startcol, endcol = self.get_last_line() cliptext = universal_newlines(do.GetText()) lines = cliptext.replace("\n", "\n\0").split("\0") command1 = (lastline[2:startcol] + lines[0].rstrip("\n") + lastline[endcol:]) self.add_text("\r> " + command1) if "\n" in cliptext: self.send_command_handler(command1, lines[1:]) else: self.console.SetInsertionPoint(insertionpoint + len(cliptext)) def process_data(self, data): if data[0] == "echo" and len(data) > 1: linecount = self.console.GetNumberOfLines() lastline = self.console.GetLineText(linecount - 1) if lastline: self.add_text("\n") txt = " ".join(data[1:]) safe_print(txt) self.add_text(txt + "\n") if lastline: self.add_text("> ") return "ok" return "invalid" def process_data_local(self, data): if data[0] == "clear" and len(data) == 1: self.clear() elif (data[0] == "connect" and len(data) == 2 and len(data[1].split(":")) == 2): wx.CallAfter(self.connect_handler, data[1]) elif data[0] == "disconnect" and len(data) == 1: self.disconnect() self.add_text("> ") #elif data[0] == "echo" and len(data) > 1: #self.add_text(" ".join(data[1:]) + "\n") #return elif data[0] == "getscriptinghosts" and len(data) == 1: return self.get_scripting_hosts() else: return "invalid" return "ok" def send_command(self, command): try: self.conn.send_command(command) except socket.error, exception: return exception if not wx.GetApp().IsMainLoopRunning(): delayedresult.AbortEvent()() def send_command_handler(self, command, additional_commands=None): self.add_text("\n") command = command.strip() if not command: self.add_text("> ") return data = split_command_line(command) response = self.process_data_local(data) if response == "ok": pass elif isinstance(response, list): self.add_text("\n".join(response)) self.add_text("\n> ") elif not self or not self.conn: self.add_error_text(lang.getstr("not_connected") + "\n") self.add_text("> ") else: self.busy = True delayedresult.startWorker(self.check_result, self.send_command, cargs=(self.get_response, additional_commands), wargs=(command, )) self.history.insert(len(self.history) - 1, command) if len(self.history) > 1000: del self.history[0] self.historypos = len(self.history) - 1 def main(): config.initcfg("scripting-client") lang.init() app = BaseApp(0) app.TopWindow = ScriptingClientFrame() if sys.platform == "darwin": app.TopWindow.init_menubar() app.TopWindow.listen() app.TopWindow.Show() app.MainLoop() writecfg(module="scripting-client", options=("position.scripting", "size.scripting")) if __name__ == "__main__": main() DisplayCAL-3.5.0.0/DisplayCAL/wxSynthICCFrame.py0000644000076500000000000010000313223332672020750 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import math import os import sys from ICCProfile import ICCProfile from config import (enc, get_data_path, get_verified_path, getcfg, hascfg, profile_ext, setcfg) from log import log, safe_print from meta import name as appname from options import debug from ordereddict import OrderedDict from util_io import Files from util_os import waccess from util_str import safe_str from worker import Error, FilteredStream, LineBufferedStream, show_result_dialog import ICCProfile as ICCP import colormath import config import localization as lang import worker from wxwindows import BaseApp, BaseFrame, FileDrop, InfoDialog, wx from wxfixes import TempXmlResource from wxLUT3DFrame import LUT3DFrame import floatspin import xh_floatspin import xh_bitmapctrls from wx import xrc class SynthICCFrame(BaseFrame): """ Synthetic ICC creation window """ # Shared methods from 3D LUT UI for lut3d_ivar_name, lut3d_ivar in LUT3DFrame.__dict__.iteritems(): if lut3d_ivar_name.startswith("lut3d_"): locals()[lut3d_ivar_name] = lut3d_ivar def __init__(self, parent=None): self.res = TempXmlResource(get_data_path(os.path.join("xrc", "synthicc.xrc"))) self.res.InsertHandler(xh_floatspin.FloatSpinCtrlXmlHandler()) self.res.InsertHandler(xh_bitmapctrls.BitmapButton()) self.res.InsertHandler(xh_bitmapctrls.StaticBitmap()) if hasattr(wx, "PreFrame"): # Classic pre = wx.PreFrame() self.res.LoadOnFrame(pre, parent, "synthiccframe") self.PostCreate(pre) else: # Phoenix wx.Frame.__init__(self) self.res.LoadFrame(self, parent, "synthiccframe") self.init() self.Bind(wx.EVT_CLOSE, self.OnClose) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-synthprofile")) self.set_child_ctrls_as_attrs(self) self.panel = self.FindWindowByName("panel") self._updating_ctrls = False # Presets presets = [""] + sorted(colormath.rgb_spaces.keys()) self.preset_ctrl.SetItems(presets) self.worker = worker.Worker(self) # Drop targets self.droptarget = FileDrop(self) self.droptarget.drophandlers = {".icc": self.drop_handler, ".icm": self.drop_handler} self.panel.SetDropTarget(self.droptarget) # Bind event handlers self.preset_ctrl.Bind(wx.EVT_CHOICE, self.preset_ctrl_handler) for color in ("red", "green", "blue", "white", "black"): for component in "XYZxy": if component in "xy": handler = "xy" else: handler = "XYZ" self.Bind(floatspin.EVT_FLOATSPIN, getattr(self, "%s_%s_ctrl_handler" % (color, handler)), getattr(self, "%s_%s" % (color, component))) self.black_point_cb.Bind(wx.EVT_CHECKBOX, self.black_point_enable_handler) self.trc_ctrl.Bind(wx.EVT_CHOICE, self.trc_ctrl_handler) self.trc_gamma_ctrl.Bind(wx.EVT_COMBOBOX, self.trc_gamma_ctrl_handler) self.trc_gamma_ctrl.Bind(wx.EVT_KILL_FOCUS, self.trc_gamma_ctrl_handler) self.trc_gamma_type_ctrl.Bind(wx.EVT_CHOICE, self.trc_gamma_type_ctrl_handler) self.lut3d_bind_hdr_trc_handlers() self.black_output_offset_ctrl.Bind(wx.EVT_SLIDER, self.black_output_offset_ctrl_handler) self.black_output_offset_intctrl.Bind(wx.EVT_TEXT, self.black_output_offset_ctrl_handler) self.colorspace_rgb_ctrl.Bind(wx.EVT_RADIOBUTTON, self.colorspace_ctrl_handler) self.colorspace_gray_ctrl.Bind(wx.EVT_RADIOBUTTON, self.colorspace_ctrl_handler) self.black_luminance_ctrl.Bind(floatspin.EVT_FLOATSPIN, self.black_luminance_ctrl_handler) self.luminance_ctrl.Bind(floatspin.EVT_FLOATSPIN, self.luminance_ctrl_handler) self.save_as_btn.Bind(wx.EVT_BUTTON, self.save_as_btn_handler) self.save_as_btn.SetDefault() self.save_as_btn.Disable() self.setup_language() self.update_controls() self.update_layout() self.save_btn.Hide() config.defaults.update({ "position.synthiccframe.x": self.GetDisplay().ClientArea[0] + 40, "position.synthiccframe.y": self.GetDisplay().ClientArea[1] + 60, "size.synthiccframe.w": self.GetMinSize()[0], "size.synthiccframe.h": self.GetMinSize()[1]}) if (hascfg("position.synthiccframe.x") and hascfg("position.synthiccframe.y") and hascfg("size.synthiccframe.w") and hascfg("size.synthiccframe.h")): self.SetSaneGeometry(int(getcfg("position.synthiccframe.x")), int(getcfg("position.synthiccframe.y")), int(getcfg("size.synthiccframe.w")), int(getcfg("size.synthiccframe.h"))) else: self.Center() def OnClose(self, event=None): if sys.platform == "darwin" or debug: self.focus_handler(event) if (self.IsShownOnScreen() and not self.IsMaximized() and not self.IsIconized()): x, y = self.GetScreenPosition() setcfg("position.synthiccframe.x", x) setcfg("position.synthiccframe.y", y) setcfg("size.synthiccframe.w", self.GetSize()[0]) setcfg("size.synthiccframe.h", self.GetSize()[1]) if self.Parent: config.writecfg() else: config.writecfg(module="synthprofile", options=("synthprofile.", "last_icc_path", "position.synthiccframe", "size.synthiccframe", "3dlut.hdr_")) if event: # Hide first (looks nicer) self.Hide() # Need to use CallAfter to prevent hang under Windows if minimized wx.CallAfter(self.Destroy) def black_luminance_ctrl_handler(self, event): v = self.black_luminance_ctrl.GetValue() white_Y = getcfg("synthprofile.luminance") if v >= white_Y * .9: if event: wx.Bell() v = white_Y * .9 if event: min_Y = (1 / 65535.0) * 100 increment = (1 / 65535.0) * white_Y if increment < min_Y: increment = min_Y * (white_Y / 100.0) min_inc = 1.0 / (10.0 ** self.black_luminance_ctrl.GetDigits()) if increment < min_inc: increment = min_inc self.black_luminance_ctrl.SetIncrement(increment) fmt = "%%.%if" % self.black_luminance_ctrl.GetDigits() if fmt % v > fmt % 0 and fmt % v < fmt % increment: if event: v = increment else: v = 0 elif fmt % v == fmt % 0: v = 0 v = round(v / increment) * increment self.black_luminance_ctrl.SetValue(v) old = getcfg("synthprofile.black_luminance") setcfg("synthprofile.black_luminance", v) if event: self.black_xy_ctrl_handler(None) self.black_point_cb.Enable(v > 0) self.black_point_enable_handler(None) if (v != old and (old == 0 or v == 0)) or event is True: self.Freeze() i = self.trc_ctrl.GetSelection() self.trc_gamma_type_ctrl.Show(i in (0, 5) and bool(v)) if not v: self.bpc_ctrl.SetValue(False) self.bpc_ctrl.Enable(bool(v)) black_output_offset_show = (i in (0, 5, 7, 8) and bool(v)) self.black_output_offset_label.Show(black_output_offset_show) self.black_output_offset_ctrl.Show(black_output_offset_show) self.black_output_offset_intctrl.Show(black_output_offset_show) self.black_output_offset_intctrl_label.Show(black_output_offset_show) self.panel.GetSizer().Layout() self.update_layout() self.Thaw() def black_output_offset_ctrl_handler(self, event): if event.GetId() == self.black_output_offset_intctrl.GetId(): self.black_output_offset_ctrl.SetValue( self.black_output_offset_intctrl.GetValue()) else: self.black_output_offset_intctrl.SetValue( self.black_output_offset_ctrl.GetValue()) v = self.black_output_offset_ctrl.GetValue() / 100.0 setcfg("synthprofile.trc_output_offset", v) self.update_trc_control() def black_point_enable_handler(self, event): v = getcfg("synthprofile.black_luminance") for component in "XYZxy": getattr(self, "black_%s" % component).Enable(v > 0 and self.black_point_cb.Value) def black_XYZ_ctrl_handler(self, event): luminance = getcfg("synthprofile.luminance") XYZ = [] for component in "XYZ": XYZ.append(getattr(self, "black_%s" % component).GetValue() / 100.0) if component == "Y": self.black_luminance_ctrl.SetValue(XYZ[-1] * luminance) self.black_luminance_ctrl_handler(None) if not XYZ[-1]: XYZ = [0, 0, 0] for i in xrange(3): getattr(self, "black_%s" % "XYZ"[i]).SetValue(0) break for i, v in enumerate(colormath.XYZ2xyY(*XYZ)[:2]): getattr(self, "black_%s" % "xy"[i]).SetValue(v) def black_xy_ctrl_handler(self, event): # Black Y scaled to 0..1 range Y = (getcfg("synthprofile.black_luminance") / getcfg("synthprofile.luminance")) xy = [] for component in "xy": xy.append(getattr(self, "black_%s" % component).GetValue() or 1.0 / 3) getattr(self, "black_%s" % component).SetValue(xy[-1]) for i, v in enumerate(colormath.xyY2XYZ(*xy + [Y])): getattr(self, "black_%s" % "XYZ"[i]).SetValue(v * 100) def blue_XYZ_ctrl_handler(self, event): self.parse_XYZ("blue") def blue_xy_ctrl_handler(self, event): self.parse_xy("blue") def colorspace_ctrl_handler(self, event): show = bool(self.colorspace_rgb_ctrl.Value) for color in ("red", "green", "blue"): getattr(self, "label_%s" % color).Show(show) for component in "XYZxy": getattr(self, "%s_%s" % (color, component)).Show(show) self.enable_save_as_btn() self.update_layout() def drop_handler(self, path): try: profile = ICCP.ICCProfile(path) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(Error(lang.getstr("profile.invalid") + "\n" + path), self) else: if profile.version >= 4: show_result_dialog(Error(lang.getstr("profile.iccv4.unsupported")), self) return if (profile.colorSpace not in ("RGB", "GRAY") or profile.connectionColorSpace not in ("Lab", "XYZ")): show_result_dialog(Error(lang.getstr("profile.unsupported", (profile.profileClass, profile.colorSpace))), self) return rgb = [(1, 1, 1), (0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1)] for i in xrange(256): rgb.append((1.0 / 255 * i, 1.0 / 255 * i, 1.0 / 255 * i)) try: colors = self.worker.xicclu(profile, rgb, intent="a", pcs="x") except Exception, exception: show_result_dialog(exception, self) else: self.panel.Freeze() for ctrl, value in [(self.colorspace_rgb_ctrl, profile.colorSpace == "RGB"), (self.colorspace_gray_ctrl, profile.colorSpace == "GRAY")]: ctrl.SetValue(value) self.colorspace_ctrl_handler(None) if "lumi" in profile.tags: luminance = profile.tags.lumi.Y else: luminance = 100 setcfg("synthprofile.luminance", luminance) self.luminance_ctrl.SetValue(luminance) for i, color in enumerate(("white", "black")): for j, component in enumerate("XYZ"): getattr(self, "%s_%s" % (color, component)).SetValue(colors[i][j] / colors[0][1] * 100) self.parse_XYZ(color) for i, color in enumerate(("red", "green", "blue")): xyY = colormath.XYZ2xyY(*colors[2 + i]) for j, component in enumerate("xy"): getattr(self, "%s_%s" % (color, component)).SetValue(xyY[j]) self.parse_xy(None) self.black_XYZ_ctrl_handler(None) trc = ICCP.CurveType(profile=profile) for XYZ in colors[5:]: trc.append(XYZ[1] / colors[0][1] * 65535) transfer_function = trc.get_transfer_function(outoffset=1.0) if transfer_function and transfer_function[1] >= .95: # Use detected transfer function gamma = transfer_function[0][1] else: # Use 50% gamma value gamma = math.log(colors[132][1]) / math.log(128.0 / 255) self.set_trc(round(gamma, 2)) setcfg("synthprofile.trc_gamma_type", "g") self.trc_gamma_type_ctrl.SetSelection(self.trc_gamma_types_ba["g"]) self.panel.Thaw() def enable_save_as_btn(self): self.save_as_btn.Enable(bool(self.get_XYZ())) def get_XYZ(self): """ Get XYZ in 0..1 range """ XYZ = {} black_Y = (getcfg("synthprofile.black_luminance") / getcfg("synthprofile.luminance")) for color in ("white", "red", "green", "blue", "black"): for component in "XYZ": v = getattr(self, "%s_%s" % (color, component)).GetValue() / 100.0 if color == "black": key = "k" if not self.black_point_cb.Value: v = XYZ["w%s" % component] * black_Y else: key = color[0] XYZ[key + component] = v if (XYZ["wX"] and XYZ["wY"] and XYZ["wZ"] and (self.colorspace_gray_ctrl.Value or (XYZ["rX"] and XYZ["gY"] and XYZ["bZ"]))): return XYZ def green_XYZ_ctrl_handler(self, event): self.parse_XYZ("green") def green_xy_ctrl_handler(self, event): self.parse_xy("green") def luminance_ctrl_handler(self, event): v = self.luminance_ctrl.GetValue() setcfg("synthprofile.luminance", v) self.lut3d_set_option("3dlut.hdr_peak_luminance", v) self.black_luminance_ctrl_handler(event) def parse_XYZ(self, name, set_blackpoint=False): if not set_blackpoint: set_blackpoint = not self.black_point_cb.Value if not self._updating_ctrls: self.preset_ctrl.SetSelection(0) XYZ = {} # Black Y scaled to 0..1 range black_Y = (getcfg("synthprofile.black_luminance") / getcfg("synthprofile.luminance")) for component in "XYZ": v = getattr(self, "%s_%s" % (name, component)).GetValue() XYZ[component] = v if name == "white" and set_blackpoint: getattr(self, "black_%s" % (component)).SetValue(v * black_Y) if "X" in XYZ and "Y" in XYZ and "Z" in XYZ: xyY = colormath.XYZ2xyY(XYZ["X"], XYZ["Y"], XYZ["Z"]) for i, component in enumerate("xy"): getattr(self, "%s_%s" % (name, component)).SetValue(xyY[i]) if name == "white" and set_blackpoint: getattr(self, "black_%s" % (component)).SetValue(xyY[i]) self.enable_save_as_btn() def parse_xy(self, name=None, set_blackpoint=False): if not set_blackpoint: set_blackpoint = not self.black_point_cb.Value if not self._updating_ctrls: self.preset_ctrl.SetSelection(0) xy = {} for color in ("white", "red", "green", "blue"): for component in "xy": v = getattr(self, "%s_%s" % (color, component)).GetValue() xy[color[0] + component] = v if name == "white": wXYZ = colormath.xyY2XYZ(xy["wx"], xy["wy"], 1.0) else: wXYZ = [] for component in "XYZ": wXYZ.append(getattr(self, "white_%s" % component).GetValue() / 100.0) if name == "white": # Black Y scaled to 0..1 range black_Y = (getcfg("synthprofile.black_luminance") / getcfg("synthprofile.luminance")) for i, component in enumerate("XYZ"): getattr(self, "white_%s" % component).SetValue(wXYZ[i] * 100) if set_blackpoint: getattr(self, "black_%s" % component).SetValue(wXYZ[i] * black_Y * 100) has_rgb_xy = True # Calculate RGB to XYZ matrix from chromaticities and white try: mtx = colormath.rgb_to_xyz_matrix(xy["rx"], xy["ry"], xy["gx"], xy["gy"], xy["bx"], xy["by"], wXYZ) except ZeroDivisionError: # Singular matrix has_rgb_xy = False rgb = {"r": (1.0, 0.0, 0.0), "g": (0.0, 1.0, 0.0), "b": (0.0, 0.0, 1.0)} XYZ = {} for color in ("red", "green", "blue"): if has_rgb_xy: # Calculate XYZ for primaries v = mtx * rgb[color[0]] if not has_rgb_xy: v = (0, 0, 0) XYZ[color[0]] = v for i, component in enumerate("XYZ"): getattr(self, "%s_%s" % (color, component)).SetValue(XYZ[color[0]][i] * 100) self.enable_save_as_btn() def preset_ctrl_handler(self, event): preset_name = self.preset_ctrl.GetStringSelection() if preset_name: gamma, white, red, green, blue = colormath.rgb_spaces[preset_name] white = colormath.get_whitepoint(white) self._updating_ctrls = True self.panel.Freeze() if self.preset_ctrl.GetStringSelection() == "DCI P3": tech = self.tech["dcpj"] else: tech = self.tech[""] self.tech_ctrl.SetStringSelection(tech) for i, component in enumerate("XYZ"): getattr(self, "white_%s" % component).SetValue(white[i] * 100) self.parse_XYZ("white", True) for color in ("red", "green", "blue"): for i, component in enumerate("xy"): getattr(self, "%s_%s" % (color, component)).SetValue(locals()[color][i]) self.parse_xy(None) self.set_trc(gamma) self.panel.Thaw() self._updating_ctrls = False def get_commands(self): return self.get_common_commands() + ["synthprofile [filename]", "load "] def process_data(self, data): if (data[0] == "synthprofile" and len(data) < 3) or (data[0] == "load" and len(data) == 2): if self.IsIconized(): self.Restore() self.Raise() if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: self.droptarget.OnDropFiles(0, 0, [path]) return "ok" return "invalid" def set_trc(self, gamma): if gamma == -1023: # DICOM self.trc_ctrl.SetSelection(1) elif gamma == -2.0: # HLG self.trc_ctrl.SetSelection(2) elif gamma == -3.0: # L* self.trc_ctrl.SetSelection(3) elif gamma == -709: # Rec. 709 self.trc_ctrl.SetSelection(4) elif gamma == -1886: # Rec. 1886 self.trc_ctrl.SetSelection(5) self.trc_ctrl_handler() elif gamma == -240: # SMPTE 240M self.trc_ctrl.SetSelection(6) elif gamma == -2084: # SMPTE 2084, roll-off clip self.trc_ctrl.SetSelection(8) elif gamma == -2.4: # sRGB self.trc_ctrl.SetSelection(9) else: # Gamma self.trc_ctrl.SetSelection(0) setcfg("synthprofile.trc_gamma", gamma) self.update_trc_controls() def profile_name_ctrl_handler(self, event): self.enable_save_as_btn() def red_XYZ_ctrl_handler(self, event): self.parse_XYZ("red") def red_xy_ctrl_handler(self, event): self.parse_xy("red") def save_as_btn_handler(self, event): try: gamma = float(self.trc_gamma_ctrl.Value) except ValueError: wx.Bell() gamma = 2.2 self.trc_gamma_ctrl.Value = str(gamma) defaultDir, defaultFile = get_verified_path("last_icc_path") defaultFile = lang.getstr("unnamed") path = None dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.icc") + "|*" + profile_ext, style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if os.path.splitext(path)[1].lower() not in (".icc", ".icm"): path += profile_ext if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return setcfg("last_icc_path", path) else: return XYZ = self.get_XYZ() if self.trc_ctrl.GetSelection() in (0, 5): # 0 = Gamma # 5 = Rec. 1886 - trc set here is only used if black = 0 trc = gamma elif self.trc_ctrl.GetSelection() == 1: # DICOM trc = -1 elif self.trc_ctrl.GetSelection() == 2: # HLG trc = -2 elif self.trc_ctrl.GetSelection() == 3: # L* trc = -3.0 elif self.trc_ctrl.GetSelection() == 4: # Rec. 709 trc = -709 elif self.trc_ctrl.GetSelection() == 6: # SMPTE 240M trc = -240 elif self.trc_ctrl.GetSelection() in (7, 8): # SMPTE 2084 trc = -2084 elif self.trc_ctrl.GetSelection() == 9: # sRGB trc = -2.4 rolloff = self.trc_ctrl.GetSelection() == 8 class_i = self.profile_class_ctrl.GetSelection() tech_i = self.tech_ctrl.GetSelection() ciis_i = self.ciis_ctrl.GetSelection() consumer = lambda result: (isinstance(result, Exception) and show_result_dialog(result, self)) wargs = (XYZ, trc, path) wkwargs = {"rgb": self.colorspace_rgb_ctrl.Value, "rolloff": rolloff, "bpc": self.bpc_ctrl.Value, "profile_class": self.profile_classes.keys()[class_i], "tech": self.tech.keys()[tech_i], "ciis": self.ciis.keys()[ciis_i]} if (trc == -2084 and rolloff) or trc == -2: if trc == -2084: msg = "smpte2084.rolloffclip" else: msg = "hlg" self.worker.recent.write(lang.getstr("trc." + msg) + "\n") self.worker.start(consumer, self.create_profile, wargs=(XYZ, trc, path), wkwargs=wkwargs, progress_msg=lang.getstr("synthicc.create")) else: consumer(self.create_profile(*wargs, **wkwargs)) def create_profile(self, XYZ, trc, path, rgb=True, rolloff=True, bpc=False, profile_class="mntr", tech=None, ciis=None): white = XYZ["wX"], XYZ["wY"], XYZ["wZ"] if rgb: # Color profile profile = ICCP.ICCProfile.from_XYZ((XYZ["rX"], XYZ["rY"], XYZ["rZ"]), (XYZ["gX"], XYZ["gY"], XYZ["gZ"]), (XYZ["bX"], XYZ["bY"], XYZ["bZ"]), (XYZ["wX"], XYZ["wY"], XYZ["wZ"]), 1.0, "", getcfg("copyright")) black = colormath.adapt(XYZ["kX"], XYZ["kY"], XYZ["kZ"], white) profile.tags.rTRC = ICCP.CurveType(profile=profile) profile.tags.gTRC = ICCP.CurveType(profile=profile) profile.tags.bTRC = ICCP.CurveType(profile=profile) channels = "rgb" else: # Grayscale profile profile = ICCP.ICCProfile() profile.colorSpace = "GRAY" profile.setCopyright(getcfg("copyright")) profile.tags.wtpt = ICCP.XYZType() (profile.tags.wtpt.X, profile.tags.wtpt.Y, profile.tags.wtpt.Z) = (XYZ["wX"], XYZ["wY"], XYZ["wZ"]) black = [XYZ["wY"] * (getcfg("synthprofile.black_luminance") / getcfg("synthprofile.luminance"))] * 3 profile.tags.kTRC = ICCP.CurveType(profile=profile) channels = "k" if trc == -2: # HLG outoffset = 1 else: outoffset = getcfg("synthprofile.trc_output_offset") if trc == -1: # DICOM # Absolute luminance values! try: if rgb: # Color profile profile.set_dicom_trc([v * getcfg("synthprofile.luminance") for v in black], getcfg("synthprofile.luminance")) else: # Grayscale profile profile.tags.kTRC.set_dicom_trc(getcfg("synthprofile.black_luminance"), getcfg("synthprofile.luminance")) except ValueError, exception: return exception elif trc > -1 and black != [0, 0, 0]: # Gamma with output offset or Rec. 1886-like if rgb: # Color profile profile.set_bt1886_trc(black, outoffset, trc, getcfg("synthprofile.trc_gamma_type")) else: # Grayscale profile profile.tags.kTRC.set_bt1886_trc(black[1], outoffset, trc, getcfg("synthprofile.trc_gamma_type")) elif trc == -2084 or trc == -2: # SMPTE 2084 or HLG if trc == -2084: hdr_format = "PQ" else: hdr_format = "HLG" minmll = getcfg("3dlut.hdr_minmll") if rolloff: maxmll = getcfg("3dlut.hdr_maxmll") else: maxmll = getcfg("synthprofile.luminance") if rgb: # Color profile if trc == -2084: profile.set_smpte2084_trc([v * getcfg("synthprofile.luminance") * (1 - outoffset) for v in black], getcfg("synthprofile.luminance"), minmll, maxmll, rolloff=True, blend_blackpoint=False) else: # HLG profile.set_hlg_trc((0, 0, 0), getcfg("synthprofile.luminance"), 1.2, getcfg("3dlut.hdr_ambient_luminance"), blend_blackpoint=False) if rolloff or trc == -2: rgb_space = profile.get_rgb_space() rgb_space[0] = 1.0 # Set gamma to 1.0 (not actually used) rgb_space = colormath.get_rgb_space(rgb_space) linebuffered_logfiles = [] if sys.stdout.isatty(): linebuffered_logfiles.append(safe_print) else: linebuffered_logfiles.append(log) logfiles = Files([LineBufferedStream( FilteredStream(Files(linebuffered_logfiles), enc, discard="", linesep_in="\n", triggers=[])), self.worker.recent, self.worker.lastmsg]) quality = getcfg("profile.quality") clutres = {"m": 17, "l": 9}.get(quality, 33) profile.tags.A2B0 = ICCP.create_synthetic_hdr_clut_profile( hdr_format, rgb_space, "", getcfg("synthprofile.black_luminance") * (1 - outoffset), getcfg("synthprofile.luminance"), minmll, maxmll, 1.2, getcfg("3dlut.hdr_ambient_luminance"), clutres=clutres, worker=self.worker, logfile=logfiles).tags.A2B0 if black != [0, 0, 0] and outoffset and not bpc: profile.apply_black_offset(black) if rolloff or trc == -2: profile.write(path) self.worker.update_profile_B2A(profile, not bpc, smooth=False, rgb_space=rgb_space) else: # Grayscale profile if trc == -2084: profile.tags.kTRC.set_smpte2084_trc(getcfg("synthprofile.black_luminance") * (1 - outoffset), getcfg("synthprofile.luminance"), minmll, maxmll, rolloff=True) else: # HLG profile.tags.kTRC.set_smpte2084_trc(0, 1.2, getcfg("3dlut.hdr_ambient_luminance")) if black != [0, 0, 0] and outoffset and not bpc: profile.tags.kTRC.apply_bpc(black[1]) elif black != [0, 0, 0]: if rgb: # Color profile vmin = 0 else: # Grayscale profile vmin = black[1] for i, channel in enumerate(channels): TRC = profile.tags["%sTRC" % channel] TRC.set_trc(trc, 1024, vmin=vmin * 65535) if rgb: profile.apply_black_offset(black) else: for channel in channels: profile.tags["%sTRC" % channel].set_trc(trc, 1) if black != [0, 0, 0] and bpc: if rgb: profile.apply_black_offset((0, 0, 0)) else: profile.tags.kTRC.apply_bpc() for tagname in ("lumi", "bkpt"): if tagname == "lumi": # Absolute X, Y, Z = [(v / XYZ["wY"]) * getcfg("synthprofile.luminance") for v in (XYZ["wX"], XYZ["wY"], XYZ["wZ"])] else: X, Y, Z = (XYZ["kX"], XYZ["kY"], XYZ["kZ"]) profile.tags[tagname] = ICCP.XYZType() (profile.tags[tagname].X, profile.tags[tagname].Y, profile.tags[tagname].Z) = X, Y, Z # Profile class profile.profileClass = profile_class # Technology type if tech: profile.tags.tech = ICCP.SignatureType("sig \0\0\0\0" + tech, "tech") # Colorimetric intent image state if ciis: profile.tags.ciis = ICCP.SignatureType("sig \0\0\0\0" + ciis, "ciis") profile.setDescription(os.path.splitext(os.path.basename(path))[0]) profile.calculateID() try: profile.write(path) except Exception, exception: return exception def setup_language(self): BaseFrame.setup_language(self) items = [] for item in self.trc_ctrl.Items: items.append(lang.getstr(item)) self.trc_ctrl.SetItems(items) self.trc_ctrl.SetSelection(0) self.trc_gamma_types_ab = {0: "g", 1: "G"} self.trc_gamma_types_ba = {"g": 0, "G": 1} self.trc_gamma_type_ctrl.SetItems([lang.getstr("trc.type.relative"), lang.getstr("trc.type.absolute")]) self.profile_classes = OrderedDict(get_mapping(ICCP.profileclass.items(), ["mntr", "scnr"])) self.profile_class_ctrl.SetItems(self.profile_classes.values()) self.profile_class_ctrl.SetSelection(0) self.tech = OrderedDict(get_mapping([("", "unspecified")] + ICCP.tech.items(), ["", "fscn", "dcam", "rscn", "vidm", "vidc", "pjtv", "CRT ", "PMD ", "AMD ", "mpfs", "dmpc", "dcpj"])) self.tech_ctrl.SetItems(self.tech.values()) self.tech_ctrl.SetSelection(0) self.ciis = OrderedDict(get_mapping([("", "unspecified")] + ICCP.ciis.items(), ["", "scoe", "sape", "fpce"])) self.ciis_ctrl.SetItems(self.ciis.values()) self.ciis_ctrl.SetSelection(0) def trc_ctrl_handler(self, event=None): if not self._updating_ctrls: self.preset_ctrl.SetSelection(0) i = self.trc_ctrl.GetSelection() if i == 5: # BT.1886 setcfg("synthprofile.trc_gamma", 2.4) setcfg("synthprofile.trc_gamma_type", "G") setcfg("synthprofile.trc_output_offset", 0.0) if not self._updating_ctrls: self.update_trc_controls() def trc_gamma_type_ctrl_handler(self, event): setcfg("synthprofile.trc_gamma_type", self.trc_gamma_types_ab[self.trc_gamma_type_ctrl.GetSelection()]) self.update_trc_control() def trc_gamma_ctrl_handler(self, event): if not self._updating_ctrls: try: v = float(self.trc_gamma_ctrl.GetValue().replace(",", ".")) if (v < config.valid_ranges["gamma"][0] or v > config.valid_ranges["gamma"][1]): raise ValueError() except ValueError: wx.Bell() self.trc_gamma_ctrl.SetValue(str(getcfg("synthprofile.trc_gamma"))) else: if str(v) != self.trc_gamma_ctrl.GetValue(): self.trc_gamma_ctrl.SetValue(str(v)) setcfg("synthprofile.trc_gamma", float(self.trc_gamma_ctrl.GetValue())) self.preset_ctrl.SetSelection(0) self.update_trc_control() event.Skip() def update_controls(self): """ Update controls with values from the configuration """ self.luminance_ctrl.SetValue(getcfg("synthprofile.luminance")) self.black_luminance_ctrl.SetValue(getcfg("synthprofile.black_luminance")) self.update_trc_control() self.update_trc_controls() def update_trc_control(self): if self.trc_ctrl.GetSelection() in (0, 5): if (getcfg("synthprofile.trc_gamma_type") == "G" and getcfg("synthprofile.trc_output_offset") == 0 and getcfg("synthprofile.trc_gamma") == 2.4): self.trc_ctrl.SetSelection(5) # BT.1886 else: self.trc_ctrl.SetSelection(0) # Gamma def update_trc_controls(self): i = self.trc_ctrl.GetSelection() self.panel.Freeze() self.trc_gamma_label.Show(i in (0, 5)) self.trc_gamma_ctrl.SetValue(str(getcfg("synthprofile.trc_gamma"))) self.trc_gamma_ctrl.Show(i in (0, 5)) self.trc_gamma_type_ctrl.SetSelection(self.trc_gamma_types_ba[getcfg("synthprofile.trc_gamma_type")]) self.panel.GetSizer().Layout() self.panel.Thaw() if i in (0, 5, 7, 8): # Gamma, BT.1886, SMPTE 2084 (PQ) outoffset = int(getcfg("synthprofile.trc_output_offset") * 100) else: outoffset = 100 self.black_output_offset_ctrl.SetValue(outoffset) self.black_output_offset_intctrl.SetValue(outoffset) self.lut3d_hdr_minmll_ctrl.SetValue(getcfg("3dlut.hdr_minmll")) self.lut3d_hdr_maxmll_ctrl.SetValue(getcfg("3dlut.hdr_maxmll")) setcfg("3dlut.hdr_peak_luminance", getcfg("synthprofile.luminance")) self.lut3d_hdr_update_diffuse_white() self.lut3d_hdr_ambient_luminance_ctrl.SetValue(getcfg("3dlut.hdr_ambient_luminance")) self.lut3d_hdr_update_system_gamma() self.lut3d_hdr_minmll_label.Show(i in (7, 8)) # SMPTE 2084 (PQ) self.lut3d_hdr_minmll_ctrl.Show(i in (7, 8)) # SMPTE 2084 (PQ) self.lut3d_hdr_minmll_ctrl_label.Show(i in (7, 8)) # SMPTE 2084 (PQ) self.lut3d_hdr_maxmll_label.Show(i == 8) # SMPTE 2084 (PQ) self.lut3d_hdr_maxmll_ctrl.Show(i == 8) # SMPTE 2084 (PQ) self.lut3d_hdr_maxmll_ctrl_label.Show(i == 8) # SMPTE 2084 (PQ) self.lut3d_hdr_diffuse_white_label.Show(i == 8) # SMPTE 2084 (PQ) self.lut3d_hdr_diffuse_white_txt.Show(i == 8) # SMPTE 2084 (PQ) self.lut3d_hdr_diffuse_white_txt_label.Show(i == 8) # SMPTE 2084 (PQ) self.lut3d_hdr_ambient_luminance_label.Show(i == 2) # HLG self.lut3d_hdr_ambient_luminance_ctrl.Show(i == 2) # HLG self.lut3d_hdr_ambient_luminance_ctrl_label.Show(i == 2) # HLG self.lut3d_hdr_system_gamma_label.Show(i == 2) # HLG self.lut3d_hdr_system_gamma_txt.Show(i == 2) # HLG self.black_luminance_ctrl_handler(True) if i in (4, 6): # Rec 709 or SMPTE 240M # Match Adobe 'video' profiles self.profile_class_ctrl.SetStringSelection(self.profile_classes["scnr"]) self.tech_ctrl.SetStringSelection(self.tech["vidc"]) self.ciis_ctrl.SetStringSelection(self.ciis["fpce"]) elif self.profile_class_ctrl.GetStringSelection() == self.profile_classes["scnr"]: # If 'input' profile, reset class/tech/colorimetric intent image state self.profile_class_ctrl.SetStringSelection(self.profile_classes["mntr"]) self.tech_ctrl.SetStringSelection(self.tech[""]) self.ciis_ctrl.SetStringSelection(self.ciis[""]) def white_XYZ_ctrl_handler(self, event): self.parse_XYZ("white") self.parse_xy() def white_xy_ctrl_handler(self, event): self.parse_xy("white") def get_mapping(mapping, keys): return sorted([(k, lang.getstr(v.lower().replace(" ", "_"))) for k, v in filter(lambda item: item[0] in keys, mapping)], key=lambda item: item[0]) def main(): config.initcfg("synthprofile") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = SynthICCFrame() if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() app.process_argv(1) app.TopWindow.Show() if __name__ == "__main__": main() DisplayCAL-3.5.0.0/DisplayCAL/wxTestchartEditor.py0000644000076500000000000040214413154615407021477 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement import csv import math import os import re import shutil import sys import time if sys.platform == "win32": import win32file import CGATS import ICCProfile as ICCP import colormath import config import imfile import localization as lang from argyll_RGB2XYZ import RGB2XYZ as argyll_RGB2XYZ, XYZ2RGB as argyll_XYZ2RGB from argyll_cgats import ti3_to_ti1, verify_cgats from config import (defaults, getbitmap, getcfg, geticon, get_current_profile, get_display_name, get_data_path, get_total_patches, get_verified_path, hascfg, profile_ext, setcfg, writecfg) from debughelpers import handle_error from log import safe_print from meta import name as appname from options import debug, tc_use_alternate_preview, test, verbose from ordereddict import OrderedDict from util_io import StringIOu as StringIO from util_os import expanduseru, is_superuser, launch_file, waccess from util_str import safe_str, safe_unicode from worker import (Error, Worker, check_file_isfile, check_set_argyll_bin, get_argyll_util, get_current_profile_path, show_result_dialog) from wxaddons import CustomEvent, CustomGridCellEvent, wx from wxwindows import (BaseApp, BaseFrame, CustomGrid, ConfirmDialog, FileBrowseBitmapButtonWithChoiceHistory, FileDrop, InfoDialog, get_gradient_panel) from wxfixes import GenBitmapButton as BitmapButton import floatspin from wxMeasureFrame import get_default_size def swap_dict_keys_values(mydict): return dict([(v, k) for (k, v) in mydict.iteritems()]) class TestchartEditor(BaseFrame): def __init__(self, parent = None, id = -1, path=None, cfg="testchart.file", parent_set_chart_methodname="set_testchart", setup=True): BaseFrame.__init__(self, parent, id, lang.getstr("testchart.edit"), name="tcgen") self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-testchart-editor")) self.Bind(wx.EVT_CLOSE, self.tc_close_handler) self.tc_algos_ab = { "": lang.getstr("tc.ofp"), "t": lang.getstr("tc.t"), "r": lang.getstr("tc.r"), "R": lang.getstr("tc.R"), "q": lang.getstr("tc.q"), "i": lang.getstr("tc.i"), "I": lang.getstr("tc.I") } self.cfg = cfg self.parent_set_chart_methodname = parent_set_chart_methodname if setup: self.setup(path) def setup(self, path=None): self.worker = Worker(self) self.worker.set_argyll_version("targen") if self.worker.argyll_version >= [1, 1, 0]: self.tc_algos_ab["Q"] = lang.getstr("tc.Q") self.tc_algos_ba = swap_dict_keys_values(self.tc_algos_ab) self.label_b2a = {"R %": "RGB_R", "G %": "RGB_G", "B %": "RGB_B", "X": "XYZ_X", "Y": "XYZ_Y", "Z": "XYZ_Z"} self.droptarget = FileDrop(self) self.droptarget.drophandlers = { ".cgats": self.ti1_drop_handler, ".cie": self.tc_drop_ti3_handler, ".csv": self.csv_drop_handler, ".gam": self.tc_drop_ti3_handler, ".icc": self.ti1_drop_handler, ".icm": self.ti1_drop_handler, ".jpg": self.tc_drop_ti3_handler, ".jpeg": self.tc_drop_ti3_handler, ".png": self.tc_drop_ti3_handler, ".tif": self.tc_drop_ti3_handler, ".tiff": self.tc_drop_ti3_handler, ".ti1": self.ti1_drop_handler, ".ti3": self.ti1_drop_handler, ".txt": self.ti1_drop_handler } scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 if tc_use_alternate_preview: # splitter splitter = self.splitter = wx.SplitterWindow(self, -1, style = wx.SP_LIVE_UPDATE | wx.SP_3DSASH) if wx.VERSION < (2, 9): self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED, self.tc_sash_handler, splitter) self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGING, self.tc_sash_handler, splitter) p1 = wx.Panel(splitter) p1.sizer = wx.BoxSizer(wx.VERTICAL) p1.SetSizer(p1.sizer) p2 = wx.Panel(splitter) # Setting a droptarget seems to cause crash when destroying ##p2.SetDropTarget(self.droptarget) p2.sizer = wx.BoxSizer(wx.VERTICAL) p2.SetSizer(p2.sizer) splitter.SetMinimumPaneSize(23) # splitter end panel = self.panel = p1 else: panel = self.panel = wx.Panel(self) panel.SetDropTarget(self.droptarget) self.sizer = wx.BoxSizer(wx.VERTICAL) panel.SetSizer(self.sizer) border = 4 sizer = wx.FlexGridSizer(0, 4, 0, 0) self.sizer.Add(sizer, flag = (wx.ALL & ~wx.BOTTOM), border = 12) # white patches sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.white")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_white_patches = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, name = "tc_white_patches") self.Bind(wx.EVT_TEXT, self.tc_white_patches_handler, id = self.tc_white_patches.GetId()) sizer.Add(self.tc_white_patches, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # single channel patches sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.single")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border = border) self.tc_single_channel_patches = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, max = 256, name = "tc_single_channel_patches") self.tc_single_channel_patches.Bind(wx.EVT_KILL_FOCUS, self.tc_single_channel_patches_handler) self.Bind(wx.EVT_SPINCTRL, self.tc_single_channel_patches_handler, id = self.tc_single_channel_patches.GetId()) hsizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(hsizer) hsizer.Add(self.tc_single_channel_patches, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.single.perchannel")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # black patches if self.worker.argyll_version >= [1, 6]: hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.black")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border=border) self.tc_black_patches = wx.SpinCtrl(panel, -1, size=(65 * scale, -1), min=0, name="tc_black_patches") self.Bind(wx.EVT_TEXT, self.tc_black_patches_handler, id=self.tc_black_patches.GetId()) hsizer.Add(self.tc_black_patches, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # gray axis patches sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.gray")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_gray_patches = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, max = 256, name = "tc_gray_patches") self.tc_gray_patches.Bind(wx.EVT_KILL_FOCUS, self.tc_gray_handler) self.Bind(wx.EVT_SPINCTRL, self.tc_gray_handler, id = self.tc_gray_patches.GetId()) sizer.Add(self.tc_gray_patches, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # multidim steps sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.multidim")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border = border) hsizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(hsizer) self.tc_multi_steps = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, max = 21, name = "tc_multi_steps") # 16 multi dim steps = 4096 patches self.tc_multi_steps.Bind(wx.EVT_KILL_FOCUS, self.tc_multi_steps_handler) self.Bind(wx.EVT_SPINCTRL, self.tc_multi_steps_handler, id = self.tc_multi_steps.GetId()) hsizer.Add(self.tc_multi_steps, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) if self.worker.argyll_version >= [1, 6, 0]: self.tc_multi_bcc_cb = wx.CheckBox(panel, -1, lang.getstr("centered")) self.tc_multi_bcc_cb.Bind(wx.EVT_CHECKBOX, self.tc_multi_bcc_cb_handler) hsizer.Add(self.tc_multi_bcc_cb, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border=border) self.tc_multi_patches = wx.StaticText(panel, -1, "", name = "tc_multi_patches") hsizer.Add(self.tc_multi_patches, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # full spread patches sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.fullspread")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_fullspread_patches = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, max = 9999, name = "tc_fullspread_patches") self.Bind(wx.EVT_TEXT, self.tc_fullspread_handler, id = self.tc_fullspread_patches.GetId()) sizer.Add(self.tc_fullspread_patches, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # algo algos = self.tc_algos_ab.values() algos.sort() sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.algo")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border = border) self.tc_algo = wx.Choice(panel, -1, choices = algos, name = "tc_algo") self.tc_algo.Disable() self.Bind(wx.EVT_CHOICE, self.tc_algo_handler, id = self.tc_algo.GetId()) sizer.Add(self.tc_algo, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # adaption hsizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(hsizer, 1, flag = wx.EXPAND) hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.adaption")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_adaption_slider = wx.Slider(panel, -1, 0, 0, 100, size = (64 * scale, -1), name = "tc_adaption_slider") self.tc_adaption_slider.Disable() self.Bind(wx.EVT_SLIDER, self.tc_adaption_handler, id = self.tc_adaption_slider.GetId()) hsizer.Add(self.tc_adaption_slider, flag = wx.ALIGN_CENTER_VERTICAL) self.tc_adaption_intctrl = wx.SpinCtrl(panel, -1, size = (65 * scale, -1), min = 0, max = 100, name = "tc_adaption_intctrl") self.tc_adaption_intctrl.Disable() self.Bind(wx.EVT_TEXT, self.tc_adaption_handler, id = self.tc_adaption_intctrl.GetId()) sizer.Add(self.tc_adaption_intctrl, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) hsizer = wx.GridSizer(0, 2, 0, 0) sizer.Add(hsizer, 1, flag = wx.EXPAND) hsizer.Add(wx.StaticText(panel, -1, "%"), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.angle")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border = border) # angle hsizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(hsizer, 1, flag = wx.EXPAND) self.tc_angle_slider = wx.Slider(panel, -1, 0, 0, 5000, size = (128 * scale, -1), name = "tc_angle_slider") self.tc_angle_slider.Disable() self.Bind(wx.EVT_SLIDER, self.tc_angle_handler, id = self.tc_angle_slider.GetId()) hsizer.Add(self.tc_angle_slider, flag = wx.ALIGN_CENTER_VERTICAL) self.tc_angle_intctrl = wx.SpinCtrl(panel, -1, size = (75 * scale, -1), min = 0, max = 5000, name = "tc_angle_intctrl") self.tc_angle_intctrl.Disable() self.Bind(wx.EVT_TEXT, self.tc_angle_handler, id = self.tc_angle_intctrl.GetId()) hsizer.Add(self.tc_angle_intctrl, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # gamma if (self.worker.argyll_version == [1, 1, "RC2"] or self.worker.argyll_version >= [1, 1]): sizer.Add(wx.StaticText(panel, -1, lang.getstr("trc.gamma")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.tc_gamma_floatctrl = floatspin.FloatSpin(panel, -1, size=(65 * scale, -1), min_val=0.0, max_val=9.9, increment=0.05, digits=2, name="tc_gamma_floatctrl") self.Bind(floatspin.EVT_FLOATSPIN, self.tc_gamma_handler, id=self.tc_gamma_floatctrl.GetId()) sizer.Add(self.tc_gamma_floatctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # neutral axis emphasis if self.worker.argyll_version >= [1, 3, 3]: sizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.neutral_axis_emphasis")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border=border) hsizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(hsizer, 1, flag = wx.EXPAND) self.tc_neutral_axis_emphasis_slider = wx.Slider(panel, -1, 0, 0, 100, size=(64 * scale, -1), name="tc_neutral_axis_emphasis_slider") self.tc_neutral_axis_emphasis_slider.Disable() self.Bind(wx.EVT_SLIDER, self.tc_neutral_axis_emphasis_handler, id=self.tc_neutral_axis_emphasis_slider.GetId()) hsizer.Add(self.tc_neutral_axis_emphasis_slider, flag=wx.ALIGN_CENTER_VERTICAL) self.tc_neutral_axis_emphasis_intctrl = wx.SpinCtrl(panel, -1, size=(65 * scale, -1), min=0, max=100, name="tc_neutral_axis_emphasis_intctrl") self.tc_neutral_axis_emphasis_intctrl.Disable() self.Bind(wx.EVT_TEXT, self.tc_neutral_axis_emphasis_handler, id=self.tc_neutral_axis_emphasis_intctrl.GetId()) hsizer.Add(self.tc_neutral_axis_emphasis_intctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) hsizer.Add(wx.StaticText(panel, -1, "%"), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # dark patch emphasis if self.worker.argyll_version >= [1, 6, 2]: hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.dark_emphasis")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border=border) self.tc_dark_emphasis_slider = wx.Slider(panel, -1, 0, 0, 100, size=(64 * scale, -1), name="tc_dark_emphasis_slider") self.tc_dark_emphasis_slider.Disable() self.Bind(wx.EVT_SLIDER, self.tc_dark_emphasis_handler, id=self.tc_dark_emphasis_slider.GetId()) hsizer.Add(self.tc_dark_emphasis_slider, flag=wx.ALIGN_CENTER_VERTICAL) self.tc_dark_emphasis_intctrl = wx.SpinCtrl(panel, -1, size=(65 * scale, -1), min=0, max=100, name="tc_dark_emphasis_intctrl") self.tc_dark_emphasis_intctrl.Disable() self.Bind(wx.EVT_TEXT, self.tc_dark_emphasis_handler, id=self.tc_dark_emphasis_intctrl.GetId()) hsizer.Add(self.tc_dark_emphasis_intctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) hsizer.Add(wx.StaticText(panel, -1, "%"), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # precond profile hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag = wx.ALL & ~(wx.BOTTOM | wx.TOP) | wx.EXPAND, border = 12) self.tc_precond = wx.CheckBox(panel, -1, lang.getstr("tc.precond"), name = "tc_precond") self.tc_precond.Disable() self.Bind(wx.EVT_CHECKBOX, self.tc_precond_handler, id = self.tc_precond.GetId()) hsizer.Add(self.tc_precond, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_precond_profile = FileBrowseBitmapButtonWithChoiceHistory( panel, -1, toolTip=lang.getstr("tc.precond"), dialogTitle=lang.getstr("tc.precond"), fileMask=lang.getstr("filetype.icc_mpp") + "|*.icc;*.icm;*.mpp", changeCallback=self.tc_precond_profile_handler, history=get_data_path("ref", "\.(icm|icc)$")) self.tc_precond_profile.SetMaxFontSize(11) hsizer.Add(self.tc_precond_profile, 1, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_precond_profile_current_btn = wx.Button(panel, -1, lang.getstr("profile.current"), name="tc_precond_profile_current") self.Bind(wx.EVT_BUTTON, self.tc_precond_profile_current_ctrl_handler, id=self.tc_precond_profile_current_btn.GetId()) hsizer.Add(self.tc_precond_profile_current_btn, 0, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.precond_droptarget = FileDrop(self) self.precond_droptarget.drophandlers = { ".icc": self.precond_profile_drop_handler, ".icm": self.precond_profile_drop_handler } self.tc_precond_profile.SetDropTarget(self.precond_droptarget) # limit samples to lab sphere hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag = wx.ALL & ~(wx.BOTTOM | wx.TOP), border = 12) self.tc_filter = wx.CheckBox(panel, -1, lang.getstr("tc.limit.sphere"), name = "tc_filter") self.Bind(wx.EVT_CHECKBOX, self.tc_filter_handler, id = self.tc_filter.GetId()) hsizer.Add(self.tc_filter, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # L hsizer.Add(wx.StaticText(panel, -1, "L"), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_filter_L = wx.SpinCtrl(panel, -1, initial = 50, size = (65 * scale, -1), min = 0, max = 100, name = "tc_filter_L") self.Bind(wx.EVT_TEXT, self.tc_filter_handler, id = self.tc_filter_L.GetId()) hsizer.Add(self.tc_filter_L, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # a hsizer.Add(wx.StaticText(panel, -1, "a"), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_filter_a = wx.SpinCtrl(panel, -1, initial = 0, size = (65 * scale, -1), min = -128, max = 127, name = "tc_filter_a") self.Bind(wx.EVT_TEXT, self.tc_filter_handler, id = self.tc_filter_a.GetId()) hsizer.Add(self.tc_filter_a, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # b hsizer.Add(wx.StaticText(panel, -1, "b"), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_filter_b = wx.SpinCtrl(panel, -1, initial = 0, size = (65 * scale, -1), min = -128, max = 127, name = "tc_filter_b") self.Bind(wx.EVT_TEXT, self.tc_filter_handler, id = self.tc_filter_b.GetId()) hsizer.Add(self.tc_filter_b, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # radius hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.limit.sphere_radius")), flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.tc_filter_rad = wx.SpinCtrl(panel, -1, initial = 255, size = (65 * scale, -1), min = 1, max = 255, name = "tc_filter_rad") self.Bind(wx.EVT_TEXT, self.tc_filter_handler, id = self.tc_filter_rad.GetId()) hsizer.Add(self.tc_filter_rad, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # diagnostic VRML files hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag = wx.ALL & ~(wx.BOTTOM | wx.TOP), border = 12 + border) self.vrml_save_as_btn = wx.BitmapButton(panel, -1, geticon(16, "3D")) if sys.platform == "darwin": # Work-around bitmap cutoff on left and right side w = self.vrml_save_as_btn.Size[0] + 4 else: w = -1 self.vrml_save_as_btn.MinSize = (w, -1) self.vrml_save_as_btn.SetToolTipString(lang.getstr("tc.3d")) self.vrml_save_as_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_view_3d, id=self.vrml_save_as_btn.GetId()) self.vrml_save_as_btn.Bind(wx.EVT_CONTEXT_MENU, self.view_3d_format_popup) hsizer.Add(self.vrml_save_as_btn, flag=wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, border=border * 2) hsizer.Add((1, 1)) self.view_3d_format_btn = wx.BitmapButton(panel, -1, getbitmap("theme/dropdown-arrow")) if sys.platform == "darwin": # Work-around bitmap cutoff on left and right side w = self.view_3d_format_btn.Size[0] + 4 else: w = -1 self.view_3d_format_btn.MinSize = (w, self.vrml_save_as_btn.Size[1]) self.view_3d_format_btn.Bind(wx.EVT_BUTTON, self.view_3d_format_popup) self.view_3d_format_btn.Bind(wx.EVT_CONTEXT_MENU, self.view_3d_format_popup) self.view_3d_format_btn.SetToolTipString(lang.getstr("tc.3d")) self.view_3d_format_btn.Disable() hsizer.Add(self.view_3d_format_btn, flag=(wx.ALL & ~wx.LEFT) | wx.ALIGN_CENTER_VERTICAL, border=border * 2) self.tc_vrml_cie = wx.CheckBox(panel, -1, "", name = "tc_vrml_cie", style = wx.RB_GROUP) self.tc_vrml_cie.SetToolTipString(lang.getstr("tc.3d")) self.Bind(wx.EVT_CHECKBOX, self.tc_vrml_handler, id = self.tc_vrml_cie.GetId()) hsizer.Add(self.tc_vrml_cie, flag = (wx.ALL & ~wx.LEFT) | wx.ALIGN_CENTER_VERTICAL, border = border * 2) self.tc_vrml_cie_colorspace_ctrl = wx.Choice(panel, -1, choices=config.valid_values["tc_vrml_cie_colorspace"]) self.tc_vrml_cie_colorspace_ctrl.SetToolTipString(lang.getstr("tc.3d")) self.Bind(wx.EVT_CHOICE, self.tc_vrml_handler, id=self.tc_vrml_cie_colorspace_ctrl.GetId()) hsizer.Add(self.tc_vrml_cie_colorspace_ctrl, flag=(wx.ALL & ~wx.LEFT) | wx.ALIGN_CENTER_VERTICAL, border=border * 2) self.tc_vrml_device = wx.CheckBox(panel, -1, "", name = "tc_vrml_device") self.tc_vrml_device.SetToolTipString(lang.getstr("tc.3d")) self.Bind(wx.EVT_CHECKBOX, self.tc_vrml_handler, id = self.tc_vrml_device.GetId()) hsizer.Add(self.tc_vrml_device, flag = (wx.ALL & ~wx.LEFT) | wx.ALIGN_CENTER_VERTICAL, border = border * 2) self.tc_vrml_device_colorspace_ctrl = wx.Choice(panel, -1, choices=config.valid_values["tc_vrml_device_colorspace"]) self.tc_vrml_device_colorspace_ctrl.SetToolTipString(lang.getstr("tc.3d")) self.Bind(wx.EVT_CHOICE, self.tc_vrml_handler, id=self.tc_vrml_device_colorspace_ctrl.GetId()) hsizer.Add(self.tc_vrml_device_colorspace_ctrl, flag=(wx.ALL & ~wx.LEFT) | wx.ALIGN_CENTER_VERTICAL, border=border * 2) hsizer.Add(wx.StaticText(panel, -1, lang.getstr("tc.vrml.black_offset")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.tc_vrml_black_offset_intctrl = wx.SpinCtrl(panel, -1, size=(55 * scale, -1), min=0, max=40, name="tc_vrml_black_offset_intctrl") self.Bind(wx.EVT_TEXT, self.tc_vrml_black_offset_ctrl_handler, id=self.tc_vrml_black_offset_intctrl.GetId()) hsizer.Add(self.tc_vrml_black_offset_intctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.tc_vrml_use_D50_cb = wx.CheckBox(panel, -1, lang.getstr("tc.vrml.use_D50"), name="tc_vrml_use_D50_cb") self.Bind(wx.EVT_CHECKBOX, self.tc_vrml_use_D50_handler, id=self.tc_vrml_use_D50_cb.GetId()) hsizer.Add(self.tc_vrml_use_D50_cb, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.tc_vrml_compress_cb = wx.CheckBox(panel, -1, lang.getstr("compression.gzip"), name="tc_vrml_compress_cb") self.Bind(wx.EVT_CHECKBOX, self.tc_vrml_compress_handler, id=self.tc_vrml_compress_cb.GetId()) hsizer.Add(self.tc_vrml_compress_cb, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # buttons hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag = (wx.ALL & ~wx.BOTTOM) | wx.ALIGN_CENTER, border = 12) self.preview_btn = wx.Button(panel, -1, lang.getstr("testchart.create"), name = "tc_create") self.Bind(wx.EVT_BUTTON, self.tc_preview_handler, id = self.preview_btn.GetId()) hsizer.Add(self.preview_btn, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.save_btn = wx.Button(panel, -1, lang.getstr("save")) self.save_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_save_handler, id = self.save_btn.GetId()) hsizer.Add(self.save_btn, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.save_as_btn = wx.Button(panel, -1, lang.getstr("save_as")) self.save_as_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_save_as_handler, id = self.save_as_btn.GetId()) hsizer.Add(self.save_as_btn, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.export_btn = wx.Button(panel, -1, lang.getstr("export"), name = "tc_export") self.export_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_export_handler, id = self.export_btn.GetId()) hsizer.Add(self.export_btn, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) self.clear_btn = wx.Button(panel, -1, lang.getstr("testchart.discard"), name = "tc_clear") self.clear_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_clear_handler, id = self.clear_btn.GetId()) hsizer.Add(self.clear_btn, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = border) # buttons row 2 hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag=wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT, border=12) hsizer.Add(wx.StaticText(panel, -1, lang.getstr("testchart.add_saturation_sweeps")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.saturation_sweeps_intctrl = wx.SpinCtrl(panel, -1, size=(50 * scale, -1), initial=getcfg("tc.saturation_sweeps"), min=2, max=255) self.saturation_sweeps_intctrl.Disable() hsizer.Add(self.saturation_sweeps_intctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) for color in ("R", "G", "B", "C", "M", "Y"): name = "saturation_sweeps_%s_btn" % color setattr(self, name, wx.Button(panel, -1, color, size=(30 * scale, -1))) getattr(self, "saturation_sweeps_%s_btn" % color).Disable() self.Bind(wx.EVT_BUTTON, self.tc_add_saturation_sweeps_handler, id=getattr(self, name).GetId()) hsizer.Add(getattr(self, name), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.saturation_sweeps_custom_btn = wx.Button(panel, -1, "=", size=(30 * scale, -1)) self.saturation_sweeps_custom_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_add_saturation_sweeps_handler, id=self.saturation_sweeps_custom_btn.GetId()) hsizer.Add(self.saturation_sweeps_custom_btn, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) for component in ("R", "G", "B"): hsizer.Add(wx.StaticText(panel, -1, component), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) name = "saturation_sweeps_custom_%s_ctrl" % component setattr(self, name, floatspin.FloatSpin(panel, -1, size=(65 * scale, -1), value=getcfg("tc.saturation_sweeps.custom.%s" % component), min_val=0, max_val=100, increment=100.0 / 255, digits=2)) getattr(self, "saturation_sweeps_custom_%s_ctrl" % component).Disable() self.Bind(floatspin.EVT_FLOATSPIN, self.tc_algo_handler, id=getattr(self, name).GetId()) hsizer.Add(getattr(self, name), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # buttons row 3 hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(hsizer, flag=wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT, border=12) self.add_ti3_btn = wx.Button(panel, -1, lang.getstr("testchart.add_ti3_patches")) self.add_ti3_btn.Disable() self.Bind(wx.EVT_BUTTON, self.tc_add_ti3_handler, id=self.add_ti3_btn.GetId()) hsizer.Add(self.add_ti3_btn, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.add_ti3_relative_cb = wx.CheckBox(panel, -1, lang.getstr("whitepoint.simulate.relative")) self.add_ti3_relative_cb.Disable() self.Bind(wx.EVT_CHECKBOX, self.tc_add_ti3_relative_handler, id=self.add_ti3_relative_cb.GetId()) hsizer.Add(self.add_ti3_relative_cb, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) hsizer.Add((50, 1)) patch_order_choices = [] for lstr in ("testchart.sort_RGB_gray_to_top", "testchart.sort_RGB_white_to_top", "testchart.sort_RGB_red_to_top", "testchart.sort_RGB_green_to_top", "testchart.sort_RGB_blue_to_top", "testchart.sort_RGB_cyan_to_top", "testchart.sort_RGB_magenta_to_top", "testchart.sort_RGB_yellow_to_top", "testchart.sort_by_HSI", "testchart.sort_by_HSL", "testchart.sort_by_HSV", "testchart.sort_by_L", "testchart.sort_by_rec709_luma", "testchart.sort_by_RGB", "testchart.sort_by_RGB_sum", "testchart.sort_by_BGR", "testchart.optimize_display_response_delay", "testchart.interleave", "testchart.shift_interleave", "testchart.maximize_lightness_difference", "testchart.maximize_rec709_luma_difference", "testchart.maximize_RGB_difference", "testchart.vary_RGB_difference"): patch_order_choices.append(lang.getstr(lstr)) self.change_patch_order_ctrl = wx.Choice(panel, -1, choices=patch_order_choices) self.change_patch_order_ctrl.SetSelection(0) self.change_patch_order_ctrl.SetToolTipString(lang.getstr("testchart.change_patch_order")) hsizer.Add(self.change_patch_order_ctrl, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) self.change_patch_order_btn = wx.Button(panel, -1, lang.getstr("apply")) self.Bind(wx.EVT_BUTTON, self.tc_sort_handler, id=self.change_patch_order_btn.GetId()) hsizer.Add(self.change_patch_order_btn, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=border) # grid self.sizer.Add((-1, 12)) self.grid = CustomGrid(panel, -1, size=(-1, 100)) self.grid.DisableDragColSize() self.grid.EnableGridLines(False) self.grid.SetCellHighlightPenWidth(0) self.grid.SetCellHighlightROPenWidth(0) self.grid.SetColLabelSize(self.grid.GetDefaultRowSize()) self.grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) self.grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) self.grid.SetScrollRate(0, 5) self.grid.draw_horizontal_grid_lines = False self.grid.draw_vertical_grid_lines = False self.sizer.Add(self.grid, 1, flag=wx.EXPAND) self.grid.CreateGrid(0, 0) font = self.grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 self.grid.SetDefaultCellFont(font) self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.tc_grid_cell_change_handler) self.grid.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.tc_grid_label_left_click_handler) self.grid.Bind(wx.grid.EVT_GRID_LABEL_LEFT_DCLICK, self.tc_grid_label_left_dclick_handler) self.grid.Bind(wx.grid.EVT_GRID_RANGE_SELECT, self.tc_grid_range_select_handler) self.grid.DisableDragRowSize() if tc_use_alternate_preview: separator_color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW) separator = wx.Panel(panel, size=(-1, 1)) separator.BackgroundColour = separator_color self.sizer.Add(separator, flag=wx.EXPAND) # preview area if tc_use_alternate_preview: self.sizer.SetSizeHints(self) self.sizer.Layout() self.sizer.SetMinSize((self.sizer.MinSize[0], self.sizer.MinSize[1] + 1)) p1.SetMinSize(self.sizer.MinSize) splitter.SplitHorizontally(p1, p2, self.sizer.GetMinSize()[1]) hsizer = wx.BoxSizer(wx.VERTICAL) gradientpanel = get_gradient_panel(p2, lang.getstr("preview")) gradientpanel.MinSize = (-1, 23) p2.sizer.Add(gradientpanel, flag=wx.EXPAND) p2.sizer.Add(hsizer, 1, flag=wx.EXPAND) p2.BackgroundColour = "#333333" preview = CustomGrid(p2, -1, size=(-1, 100)) preview.DisableDragColSize() preview.DisableDragRowSize() preview.EnableEditing(False) preview.EnableGridLines(False) preview.SetCellHighlightPenWidth(0) preview.SetCellHighlightROPenWidth(0) preview.SetColLabelSize(self.grid.GetDefaultRowSize()) preview.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) preview.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) preview.SetLabelTextColour("#CCCCCC") preview.SetScrollRate(0, 5) preview._default_col_label_renderer.bgcolor = "#333333" preview._default_row_label_renderer.bgcolor = "#333333" preview.alternate_cell_background_color = False preview.alternate_row_label_background_color = False preview.draw_horizontal_grid_lines = False preview.draw_vertical_grid_lines = False preview.rendernative = False preview.style = "" preview.CreateGrid(0, 0) font = preview.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 preview.SetDefaultCellFont(font) preview.SetLabelFont(font) preview.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.tc_mouseclick_handler) self.preview = preview preview.SetDefaultCellBackgroundColour("#333333") preview.SetLabelBackgroundColour("#333333") hsizer.Add(preview, 1, wx.EXPAND) panel = p2 if sys.platform not in ("darwin", "win32"): separator_color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW) separator = wx.Panel(panel, size=(-1, 1)) separator.BackgroundColour = separator_color panel.Sizer.Add(separator, flag=wx.EXPAND) # status status = wx.StatusBar(self, -1) status.SetStatusStyles([wx.SB_FLAT]) self.SetStatusBar(status) # layout if tc_use_alternate_preview: self.SetMinSize((self.GetMinSize()[0], self.GetMinSize()[1] + splitter.SashSize + p2.sizer.MinSize[1])) else: self.sizer.SetSizeHints(self) self.sizer.Layout() defaults.update({ "position.tcgen.x": self.GetDisplay().ClientArea[0] + 40, "position.tcgen.y": self.GetDisplay().ClientArea[1] + 60, "size.tcgen.w": self.GetMinSize()[0], "size.tcgen.h": self.GetMinSize()[1] }) if hascfg("position.tcgen.x") and hascfg("position.tcgen.y") and hascfg("size.tcgen.w") and hascfg("size.tcgen.h"): self.SetSaneGeometry(int(getcfg("position.tcgen.x")), int(getcfg("position.tcgen.y")), int(getcfg("size.tcgen.w")), int(getcfg("size.tcgen.h"))) else: self.Center() self.tc_size_handler() children = self.GetAllChildren() for child in children: if hasattr(child, "SetFont"): child.SetMaxFontSize(11) child.Bind(wx.EVT_KEY_DOWN, self.tc_key_handler) if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and isinstance(child, wx.Panel)): # No need to enable double buffering under Linux and Mac OS X. # Under Windows, enabling double buffering on the panel seems # to work best to reduce flicker. child.SetDoubleBuffered(True) self.Bind(wx.EVT_MOVE, self.tc_move_handler) self.Bind(wx.EVT_SIZE, self.tc_size_handler, self) self.Bind(wx.EVT_MAXIMIZE, self.tc_size_handler, self) self.Children[0].Bind(wx.EVT_WINDOW_DESTROY, self.tc_destroy_handler) self.tc_update_controls() self.tc_check() if path is not False: wx.CallAfter(self.tc_load_cfg_from_ti1, None, path) def csv_drop_handler(self, path): if self.worker.is_working(): return if not self.tc_check_save_ti1(): return self.worker.start(self.csv_convert_finish, self.csv_convert, wargs=(path, ), progress_msg=lang.getstr("testchart.read"), parent=self, progress_start=500, cancelable=False, continue_next=True, show_remaining_time=False, fancy=False) def csv_convert(self, path): # Read CSV file and get rows rows = [] maxval = 100.0 try: with open(path, "rb") as csvfile: sniffer = csv.Sniffer() rawcsv = csvfile.read() dialect = sniffer.sniff(rawcsv, delimiters=",;\t") has_header = sniffer.has_header(rawcsv) csvfile.seek(0) for i, row in enumerate(csv.reader(csvfile, dialect=dialect)): if has_header: continue if len(row) == 3 or len(row) == 6: # Add row number before first column row.insert(0, i) if len(row) not in (4, 7): raise ValueError(lang.getstr("error.testchart.invalid", path)) row = [int(row[0])] + [float(v) for v in row[1:]] for v in row[1:]: if v > maxval: maxval = v rows.append(row) except Exception, exception: result = exception else: # Scale to 0..100 if actual value range is different if maxval > 100: for i, row in enumerate(rows): rows[i][1:] = [v / maxval * 100 for v in row[1:]] # Create temporary TI1 ti1 = CGATS.CGATS("""CTI1 KEYWORD "COLOR_REP" COLOR_REP "RGB" NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 4 BEGIN_DATA END_DATA""") # Add rows to TI1 data = ti1[0].DATA for row in rows: if len(row) < 7: # Missing XYZ, add via simple sRGB-like model row.extend(v * 100 for v in argyll_RGB2XYZ(*[v / 100.0 for v in row[1:]])) data.add_data(row) # Create temp dir result = tmp = self.worker.create_tempdir() if not isinstance(result, Exception): # Write out temporary TI1 ti1.filename = os.path.join(tmp, os.path.splitext(os.path.basename(path))[0] + ".ti1") ti1.write() result = ti1 return result def csv_convert_finish(self, result): if isinstance(result, Exception): show_result_dialog(result, self) else: self.tc_load_cfg_from_ti1(None, result.filename, resume=True) def precond_profile_drop_handler(self, path): self.tc_precond_profile.SetPath(path) self.tc_precond_profile_handler() def get_commands(self): return (self.get_common_commands() + ["testchart-editor [filename | create filename]", "load "]) def process_data(self, data): if (data[0] == "testchart-editor" and (len(data) < 3 or (len(data) == 3 and data[1] == "create"))) or (data[0] == "load" and len(data) == 2): if self.IsIconized(): self.Restore() self.Raise() if len(data) == 2: path = data[1] if not os.path.isfile(path) and not os.path.isabs(path): path = get_data_path(path) if not path: return "fail" else: self.droptarget.OnDropFiles(0, 0, [path]) elif len(data) == 3: # Create testchart wx.CallAfter(self.tc_preview_handler, path=data[2]) return "ok" return "invalid" def ti1_drop_handler(self, path): self.tc_load_cfg_from_ti1(None, path) def resize_grid(self): num_cols = self.grid.GetNumberCols() if not num_cols: return grid_w = self.grid.GetSize()[0] - self.grid.GetRowLabelSize() - self.grid.GetDefaultRowSize() col_w = round(grid_w / (num_cols - 1)) last_col_w = grid_w - col_w * (num_cols - 2) for i in xrange(num_cols): if i == 3: w = self.grid.GetDefaultRowSize() elif i == num_cols - 2: w = last_col_w - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X) else: w = col_w self.grid.SetColSize(i, w) self.grid.SetMargins(0 - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), 0) self.grid.ForceRefresh() if hasattr(self, "preview"): num_cols = self.preview.GetNumberCols() if not num_cols: return grid_w = (self.preview.GetSize()[0] - self.preview.GetRowLabelSize() - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X)) col_w = round(grid_w / num_cols) for i in xrange(num_cols): self.preview.SetColSize(i, col_w) self.preview.SetMargins(0 - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), 0) self.preview.ForceRefresh() def tc_grid_range_select_handler(self, event): if debug: safe_print("[D] tc_grid_range_select_handler") if not self.grid.GetBatchCount(): wx.CallAfter(self.tc_set_default_status) event.Skip() def tc_grid_label_left_click_handler(self, event): wx.CallAfter(self.tc_set_default_status) event.Skip() def tc_grid_label_left_dclick_handler(self, event): row, col = event.GetRow(), event.GetCol() if col == -1: # row label clicked data = self.ti1.queryv1("DATA") wp = self.ti1.queryv1("APPROX_WHITE_POINT") if wp: wp = [float(v) for v in wp.split()] wp = [(v / wp[1]) * 100.0 for v in wp] else: wp = colormath.get_standard_illuminant("D65", scale=100) newdata = { "SAMPLE_ID": row + 2, "RGB_R": 100.0, "RGB_G": 100.0, "RGB_B": 100.0, "XYZ_X": wp[0], "XYZ_Y": 100.0, "XYZ_Z": wp[2] } self.tc_add_data(row, [newdata]) event.Skip() def tc_key_handler(self, event): # AltDown # CmdDown # ControlDown # GetKeyCode # GetModifiers # GetPosition # GetRawKeyCode # GetRawKeyFlags # GetUniChar # GetUnicodeKey # GetX # GetY # HasModifiers # KeyCode # MetaDown # Modifiers # Position # RawKeyCode # RawKeyFlags # ShiftDown # UnicodeKey # X # Y if debug: safe_print("[D] event.KeyCode", event.GetKeyCode(), "event.RawKeyCode", event.GetRawKeyCode(), "event.UniChar", event.GetUniChar(), "event.UnicodeKey", event.GetUnicodeKey(), "CTRL/CMD:", event.ControlDown() or event.CmdDown(), "ALT:", event.AltDown(), "SHIFT:", event.ShiftDown()) if (event.ControlDown() or event.CmdDown()): # CTRL (Linux/Mac/Windows) / CMD (Mac) key = event.GetKeyCode() focus = self.FindFocus() if focus and self.grid in (focus, focus.GetParent(), focus.GetGrandParent()): if key in (8, 127): # BACKSPACE / DEL rows = self.grid.GetSelectionRows() if rows and len(rows) and min(rows) >= 0 and max(rows) + 1 <= self.grid.GetNumberRows(): if len(rows) == self.grid.GetNumberRows(): self.tc_check_save_ti1() else: self.tc_delete_rows(rows) return elif key == 86 and self.grid.IsEditable(): # V wx.CallAfter(self.tc_save_check) if key == 83: # S if (hasattr(self, "ti1")): if (event.ShiftDown() or event.AltDown() or not self.ti1.filename or not os.path.exists(self.ti1.filename)): self.tc_save_as_handler() elif self.ti1.modified: self.tc_save_handler(True) return else: event.Skip() else: event.Skip() def tc_sash_handler(self, event): if event.GetSashPosition() < self.sizer.GetMinSize()[1]: self.splitter.SetSashPosition(self.sizer.GetMinSize()[1]) event.Skip() def tc_size_handler(self, event = None): wx.CallAfter(self.resize_grid) if self.IsShownOnScreen() and not self.IsMaximized() and not self.IsIconized(): w, h = self.GetSize() setcfg("size.tcgen.w", w) setcfg("size.tcgen.h", h) if event: event.Skip() def tc_sort_handler(self, event): idx = self.change_patch_order_ctrl.GetSelection() if idx == 0: self.ti1.sort_RGB_gray_to_top() elif idx == 1: self.ti1.sort_RGB_white_to_top() elif idx == 2: self.ti1.sort_RGB_to_top(1, 0, 0) # Red elif idx == 3: self.ti1.sort_RGB_to_top(0, 1, 0) # Green elif idx == 4: self.ti1.sort_RGB_to_top(0, 0, 1) # Blue elif idx == 5: self.ti1.sort_RGB_to_top(0, 1, 1) # Cyan elif idx == 6: self.ti1.sort_RGB_to_top(1, 0, 1) # Magenta elif idx == 7: self.ti1.sort_RGB_to_top(1, 1, 0) # Yellow elif idx == 8: self.ti1.sort_by_HSI() elif idx == 9: self.ti1.sort_by_HSL() elif idx == 10: self.ti1.sort_by_HSV() elif idx == 11: self.ti1.sort_by_L() elif idx == 12: self.ti1.sort_by_rec709_luma() elif idx == 13: self.ti1.sort_by_RGB() elif idx == 14: self.ti1.sort_by_RGB_sum() elif idx == 15: self.ti1.sort_by_BGR() elif idx == 16: # Minimize display response delay self.ti1.sort_by_BGR() self.ti1.sort_RGB_gray_to_top() self.ti1.sort_RGB_white_to_top() elif idx == 17: # Interleave self.ti1.checkerboard(None, None) elif idx == 18: # Shift & interleave self.ti1.checkerboard(None, None, split_grays=True, shift=True) elif idx == 19: # Maximize L* difference self.ti1.checkerboard() elif idx == 20: # Maximize Rec. 709 luma difference self.ti1.checkerboard(CGATS.sort_by_rec709_luma) elif idx == 21: # Maximize RGB difference self.ti1.checkerboard(CGATS.sort_by_RGB_sum) elif idx == 22: # Vary RGB difference self.ti1.checkerboard(CGATS.sort_by_RGB, None, split_grays=True, shift=True) self.tc_clear(False) self.tc_preview(True) def tc_enable_sort_controls(self): enable = hasattr(self, "ti1") self.change_patch_order_ctrl.Enable(enable) self.change_patch_order_btn.Enable(enable) def tc_grid_cell_change_handler(self, event, save_check=True): data = self.ti1[0]["DATA"] sample = data[event.GetRow()] label = self.label_b2a.get(self.grid.GetColLabelValue(event.GetCol())) strval = "0" + self.grid.GetCellValue(event.GetRow(), event.GetCol()).replace(",", ".") value_set = False try: value = float(strval) if value > 100: raise ValueError("RGB value %r%% is invalid" % value) elif value < 0: raise ValueError("Negative RGB value %r%% is invalid" % value) except ValueError, exception: if not self.grid.GetBatchCount(): wx.Bell() if label in self.ti1[0]["DATA_FORMAT"].values(): strval = str(sample[label]) if "." in strval: strval = strval.rstrip("0").rstrip(".") else: strval = "" else: if label in ("RGB_R", "RGB_G", "RGB_B"): sample[label] = value # If the same RGB combo is already in the ti1, use its XYZ # TODO: Implement proper lookup when using precond profile # This costs too much performance when updating multiple cells! # (e.g. paste operation from spreadsheet) ##ref = data.queryi({"RGB_R": sample["RGB_R"], ##"RGB_G": sample["RGB_G"], ##"RGB_B": sample["RGB_B"]}) ##if ref: ##for i in ref: ##if ref[i] != sample: ##ref = ref[i] ##break ##if "XYZ_X" in ref: ##XYZ = [component / 100.0 for component in (ref["XYZ_X"], ref["XYZ_Y"], ref["XYZ_Z"])] ##else: # Fall back to default D65-ish values XYZ = argyll_RGB2XYZ(*[component / 100.0 for component in (sample["RGB_R"], sample["RGB_G"], sample["RGB_B"])]) sample["XYZ_X"], sample["XYZ_Y"], sample["XYZ_Z"] = [component * 100.0 for component in XYZ] # FIXME: Should this be removed? There are no XYZ fields in the editor #for label in ("XYZ_X", "XYZ_Y", "XYZ_Z"): #for col in range(self.grid.GetNumberCols()): #if self.label_b2a.get(self.grid.GetColLabelValue(col)) == label: #self.grid.SetCellValue(event.GetRow(), col, str(round(sample[label], 4))) #value_set = True elif label in ("XYZ_X", "XYZ_Y", "XYZ_Z"): # FIXME: Should this be removed? There are no XYZ fields in the editor if value < 0: value = 0.0 sample[label] = value RGB = argyll_XYZ2RGB(*[component / 100.0 for component in (sample["XYZ_X"], sample["XYZ_Y"], sample["XYZ_Z"])]) sample["RGB_R"], sample["RGB_G"], sample["RGB_B"] = [component * 100.0 for component in RGB] for label in ("RGB_R", "RGB_G", "RGB_B"): for col in range(self.grid.GetNumberCols()): if self.label_b2a.get(self.grid.GetColLabelValue(col)) == label: self.grid.SetCellValue(event.GetRow(), col, str(round(sample[label], 4))) value_set = True self.tc_grid_setcolorlabel(event.GetRow(), data) if not self.grid.GetBatchCount() and save_check: self.tc_save_check() if not value_set: self.grid.SetCellValue(event.GetRow(), event.GetCol(), re.sub("^0+(?!\.)", "", strval) or "0") def tc_white_patches_handler(self, event = None): setcfg("tc_white_patches", self.tc_white_patches.GetValue()) self.tc_check() if event: event.Skip() def tc_black_patches_handler(self, event = None): setcfg("tc_black_patches", self.tc_black_patches.GetValue()) self.tc_check() if event: event.Skip() def tc_single_channel_patches_handler(self, event = None): if event: event.Skip() event = CustomEvent(event.GetEventType(), event.GetEventObject()) if event and event.GetEventType() == wx.EVT_TEXT.evtType[0]: wx.CallLater(3000, self.tc_single_channel_patches_handler2, event) # 3 seconds delay to allow user to finish keying in a value before it is validated else: wx.CallAfter(self.tc_single_channel_patches_handler2, event) def tc_single_channel_patches_handler2(self, event = None): if self.tc_single_channel_patches.GetValue() == 1: if event and event.GetEventType() in (0, wx.EVT_SPINCTRL.evtType[0]) and getcfg("tc_single_channel_patches") == 2: # decrease self.tc_single_channel_patches.SetValue(0) else: # increase self.tc_single_channel_patches.SetValue(2) setcfg("tc_single_channel_patches", self.tc_single_channel_patches.GetValue()) self.tc_check() def tc_gray_handler(self, event = None): if event: event.Skip() event = CustomEvent(event.GetEventType(), event.GetEventObject()) if event and event.GetEventType() == wx.EVT_TEXT.evtType[0]: wx.CallLater(3000, self.tc_gray_handler2, event) # 3 seconds delay to allow user to finish keying in a value before it is validated else: wx.CallAfter(self.tc_gray_handler2, event) def tc_gray_handler2(self, event = None): if self.tc_gray_patches.GetValue() == 1: if event and event.GetEventType() in (0, wx.EVT_SPINCTRL.evtType[0]) and getcfg("tc_gray_patches") == 2: # decrease self.tc_gray_patches.SetValue(0) else: # increase self.tc_gray_patches.SetValue(2) setcfg("tc_gray_patches", self.tc_gray_patches.GetValue()) self.tc_check() def tc_fullspread_handler(self, event = None): setcfg("tc_fullspread_patches", self.tc_fullspread_patches.GetValue()) self.tc_algo_handler() self.tc_check() def tc_gamma_handler(self, event): setcfg("tc_gamma", self.tc_gamma_floatctrl.GetValue()) def tc_get_total_patches(self, white_patches = None, black_patches=None, single_channel_patches = None, gray_patches = None, multi_steps = None, multi_bcc_steps=None, fullspread_patches = None): if hasattr(self, "ti1") and [white_patches, black_patches, single_channel_patches, gray_patches, multi_steps, multi_bcc_steps, fullspread_patches] == [None] * 7: return self.ti1.queryv1("NUMBER_OF_SETS") if white_patches is None: white_patches = self.tc_white_patches.GetValue() if black_patches is None: if self.worker.argyll_version >= [1, 6]: black_patches = self.tc_black_patches.GetValue() elif hasattr(self, "ti1"): black_patches = self.ti1.queryv1("BLACK_COLOR_PATCHES") if single_channel_patches is None: single_channel_patches = self.tc_single_channel_patches.GetValue() single_channel_patches_total = single_channel_patches * 3 if gray_patches is None: gray_patches = self.tc_gray_patches.GetValue() if (gray_patches == 0 and (single_channel_patches > 0 or black_patches > 0) and white_patches > 0): gray_patches = 2 if multi_steps is None: multi_steps = self.tc_multi_steps.GetValue() if multi_bcc_steps is None and getcfg("tc_multi_bcc") and self.worker.argyll_version >= [1, 6]: multi_bcc_steps = self.tc_multi_steps.GetValue() if fullspread_patches is None: fullspread_patches = self.tc_fullspread_patches.GetValue() return get_total_patches(white_patches, black_patches, single_channel_patches, gray_patches, multi_steps, multi_bcc_steps, fullspread_patches) def tc_get_black_patches(self): if self.worker.argyll_version >= [1, 6]: black_patches = self.tc_black_patches.GetValue() else: black_patches = 0 single_channel_patches = self.tc_single_channel_patches.GetValue() gray_patches = self.tc_gray_patches.GetValue() if gray_patches == 0 and single_channel_patches > 0 and black_patches > 0: gray_patches = 2 multi_steps = self.tc_multi_steps.GetValue() if multi_steps > 1 or gray_patches > 1: # black always in multi channel or gray patches black_patches -= 1 return max(0, black_patches) def tc_get_white_patches(self): white_patches = self.tc_white_patches.GetValue() single_channel_patches = self.tc_single_channel_patches.GetValue() gray_patches = self.tc_gray_patches.GetValue() if gray_patches == 0 and single_channel_patches > 0 and white_patches > 0: gray_patches = 2 multi_steps = self.tc_multi_steps.GetValue() if multi_steps > 1 or gray_patches > 1: # white always in multi channel or gray patches white_patches -= 1 return max(0, white_patches) def tc_multi_steps_handler(self, event = None): if event: event.Skip() event = CustomEvent(event.GetEventType(), event.GetEventObject()) if event and event.GetEventType() == wx.EVT_TEXT.evtType[0]: wx.CallLater(3000, self.tc_multi_steps_handler2, event) # 3 seconds delay to allow user to finish keying in a value before it is validated else: wx.CallAfter(self.tc_multi_steps_handler2, event) def tc_multi_steps_handler2(self, event = None): if self.tc_multi_steps.GetValue() == 1: if event and event.GetEventType() in (0, wx.EVT_SPINCTRL.evtType[0]) and getcfg("tc_multi_steps") == 2: # decrease self.tc_multi_steps.SetValue(0) else: # increase self.tc_multi_steps.SetValue(2) multi_steps = self.tc_multi_steps.GetValue() multi_patches = int(math.pow(multi_steps, 3)) if getcfg("tc_multi_bcc") and self.worker.argyll_version >= [1, 6]: pref = "tc_multi_bcc_steps" if multi_steps: multi_patches += int(math.pow(multi_steps - 1, 3)) multi_steps += multi_steps - 1 setcfg("tc_multi_steps", self.tc_multi_steps.GetValue()) else: pref = "tc_multi_steps" setcfg("tc_multi_bcc_steps", 0) self.tc_multi_patches.SetLabel(lang.getstr("tc.multidim.patches", (multi_patches, multi_steps))) setcfg(pref, self.tc_multi_steps.GetValue()) self.tc_check() def tc_neutral_axis_emphasis_handler(self, event=None): if event.GetId() == self.tc_neutral_axis_emphasis_slider.GetId(): self.tc_neutral_axis_emphasis_intctrl.SetValue(self.tc_neutral_axis_emphasis_slider.GetValue()) else: self.tc_neutral_axis_emphasis_slider.SetValue(self.tc_neutral_axis_emphasis_intctrl.GetValue()) setcfg("tc_neutral_axis_emphasis", self.tc_neutral_axis_emphasis_intctrl.GetValue() / 100.0) self.tc_algo_handler() def tc_dark_emphasis_handler(self, event=None): if event.GetId() == self.tc_dark_emphasis_slider.GetId(): self.tc_dark_emphasis_intctrl.SetValue(self.tc_dark_emphasis_slider.GetValue()) else: self.tc_dark_emphasis_slider.SetValue(self.tc_dark_emphasis_intctrl.GetValue()) setcfg("tc_dark_emphasis", self.tc_dark_emphasis_intctrl.GetValue() / 100.0) self.tc_algo_handler() def tc_algo_handler(self, event = None): tc_algo_enable = self.tc_fullspread_patches.GetValue() > 0 self.tc_algo.Enable(tc_algo_enable) tc_algo = self.tc_algos_ba[self.tc_algo.GetStringSelection()] self.tc_adaption_slider.Enable(tc_algo_enable and tc_algo == "") self.tc_adaption_intctrl.Enable(tc_algo_enable and tc_algo == "") tc_precond_enable = (tc_algo in ("I", "Q", "R", "t") or (tc_algo == "" and self.tc_adaption_slider.GetValue() > 0)) if self.worker.argyll_version >= [1, 3, 3]: self.tc_neutral_axis_emphasis_slider.Enable(tc_algo_enable and tc_precond_enable) self.tc_neutral_axis_emphasis_intctrl.Enable(tc_algo_enable and tc_precond_enable) self.tc_precond.Enable(bool(getcfg("tc_precond_profile"))) if not getcfg("tc_precond_profile"): self.tc_precond.SetValue(False) else: self.tc_precond.SetValue(bool(int(getcfg("tc_precond")))) if self.worker.argyll_version >= [1, 6, 2]: tc_dark_emphasis_enable = (self.worker.argyll_version >= [1, 6, 3] or (tc_precond_enable and bool(int(getcfg("tc_precond"))) and bool(getcfg("tc_precond_profile")))) self.tc_dark_emphasis_slider.Enable(tc_dark_emphasis_enable) self.tc_dark_emphasis_intctrl.Enable(tc_dark_emphasis_enable) self.tc_angle_slider.Enable(tc_algo_enable and tc_algo in ("i", "I")) self.tc_angle_intctrl.Enable(tc_algo_enable and tc_algo in ("i", "I")) setcfg("tc_algo", tc_algo) self.tc_enable_add_precond_controls() def tc_enable_add_precond_controls(self): tc_algo = getcfg("tc_algo") add_preconditioned_enable = (hasattr(self, "ti1") and bool(getcfg("tc_precond_profile"))) self.saturation_sweeps_intctrl.Enable(add_preconditioned_enable) for color in ("R", "G", "B", "C", "M", "Y"): getattr(self, "saturation_sweeps_%s_btn" % color).Enable( add_preconditioned_enable) RGB = {} for component in ("R", "G", "B"): ctrl = getattr(self, "saturation_sweeps_custom_%s_ctrl" % component) ctrl.Enable(add_preconditioned_enable) RGB[component] = ctrl.GetValue() self.saturation_sweeps_custom_btn.Enable( add_preconditioned_enable and not (RGB["R"] == RGB["G"] == RGB["B"])) self.add_ti3_btn.Enable(add_preconditioned_enable) self.add_ti3_relative_cb.Enable(add_preconditioned_enable) def tc_adaption_handler(self, event = None): if event.GetId() == self.tc_adaption_slider.GetId(): self.tc_adaption_intctrl.SetValue(self.tc_adaption_slider.GetValue()) else: self.tc_adaption_slider.SetValue(self.tc_adaption_intctrl.GetValue()) setcfg("tc_adaption", self.tc_adaption_intctrl.GetValue() / 100.0) self.tc_algo_handler() def tc_add_saturation_sweeps_handler(self, event): try: profile = ICCP.ICCProfile(getcfg("tc_precond_profile")) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(exception, self) else: rgb_space = profile.get_rgb_space() if not rgb_space: show_result_dialog(Error( lang.getstr("profile.required_tags_missing", lang.getstr("profile.type.shaper_matrix"))), self) return R, G, B = {self.saturation_sweeps_R_btn.GetId(): (1, 0, 0), self.saturation_sweeps_G_btn.GetId(): (0, 1, 0), self.saturation_sweeps_B_btn.GetId(): (0, 0, 1), self.saturation_sweeps_C_btn.GetId(): (0, 1, 1), self.saturation_sweeps_M_btn.GetId(): (1, 0, 1), self.saturation_sweeps_Y_btn.GetId(): (1, 1, 0), self.saturation_sweeps_custom_btn.GetId(): (self.saturation_sweeps_custom_R_ctrl.GetValue() / 100.0, self.saturation_sweeps_custom_G_ctrl.GetValue() / 100.0, self.saturation_sweeps_custom_B_ctrl.GetValue() / 100.0)}[event.GetId()] maxv = self.saturation_sweeps_intctrl.GetValue() newdata = [] rows = self.grid.GetSelectionRows() if rows: row = rows[-1] else: row = self.grid.GetNumberRows() - 1 for i in xrange(maxv): saturation = 1.0 / (maxv - 1) * i RGB, xyY = colormath.RGBsaturation(R, G, B, 1.0 / (maxv - 1) * i, rgb_space) X, Y, Z = colormath.xyY2XYZ(*xyY) newdata.append({ "SAMPLE_ID": row + 2, "RGB_R": round(RGB[0] * 100, 4), "RGB_G": round(RGB[1] * 100, 4), "RGB_B": round(RGB[2] * 100, 4), "XYZ_X": X * 100, "XYZ_Y": Y * 100, "XYZ_Z": Z * 100 }) self.tc_add_data(row, newdata) self.grid.select_row(row + len(newdata)) def tc_drop_ti3_handler(self, path): if not hasattr(self, "ti1"): wx.Bell() elif getcfg("tc_precond_profile"): self.tc_add_ti3_handler(None, path) else: show_result_dialog(lang.getstr("tc.precond.notset"), self) def tc_add_ti3_handler(self, event, chart=None): try: profile = ICCP.ICCProfile(getcfg("tc_precond_profile")) except (IOError, ICCP.ICCProfileInvalidError), exception: show_result_dialog(exception, self) return if not chart: defaultDir, defaultFile = get_verified_path("testchart.reference") dlg = wx.FileDialog(self, lang.getstr("testchart_or_reference"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=(lang.getstr("filetype.ti1_ti3_txt") + "|*.cgats;*.cie;*.gam;*.icc;*.icm;*.jpg;*.jpeg;*.png;*.ti1;*.ti2;*.ti3;*.tif;*.tiff;*.txt"), style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() if result == wx.ID_OK: chart = dlg.GetPath() setcfg("testchart.reference", chart) dlg.Destroy() if result != wx.ID_OK: return use_gamut = False # Determine if this is an image filename, ext = os.path.splitext(chart) if ext.lower() in (".jpg", ".jpeg", ".png", ".tif", ".tiff"): llevel = wx.Log.GetLogLevel() wx.Log.SetLogLevel(0) # Suppress TIFF library related message popups try: img = wx.Image(chart, wx.BITMAP_TYPE_ANY) if not img.IsOk(): raise Error(lang.getstr("error.file_type_unsupported")) except Exception, exception: show_result_dialog(exception, self) return finally: wx.Log.SetLogLevel(llevel) if test: dlg = ConfirmDialog(self, title=lang.getstr("testchart.add_ti3_patches"), msg=lang.getstr("gamut"), ok="L*a*b*", alt="RGB", bitmap=geticon(32, appname + "-testchart-editor")) result = dlg.ShowModal() if result == wx.ID_CANCEL: return use_gamut = result == wx.ID_OK else: img = None if ext.lower() in (".icc", ".icm"): try: nclprof = ICCP.ICCProfile(chart) if (nclprof.profileClass != "nmcl" or not "ncl2" in nclprof.tags or not isinstance(nclprof.tags.ncl2, ICCP.NamedColor2Type) or nclprof.connectionColorSpace not in ("Lab", "XYZ")): raise Error(lang.getstr("profile.only_named_color")) except Exception, exception: show_result_dialog(exception, self) return if nclprof.connectionColorSpace == "Lab": data_format = "LAB_L LAB_A LAB_B" else: data_format = " XYZ_X XYZ_Y XYZ_Z" chart = ["GAMUT ", "BEGIN_DATA_FORMAT", data_format, "END_DATA_FORMAT", "BEGIN_DATA", "END_DATA"] if "wtpt" in nclprof.tags: chart.insert(1, 'KEYWORD "APPROX_WHITE_POINT"') chart.insert(2, 'APPROX_WHITE_POINT "%.4f %.4f %.4f"' % tuple(v * 100 for v in nclprof.tags.wtpt.ir.values())) for k, v in nclprof.tags.ncl2.iteritems(): chart.insert(-1, "%.4f %.4f %.4f" % tuple(v.pcs.values())) chart = "\n".join(chart) self.worker.start(self.tc_add_ti3_consumer, self.tc_add_ti3, cargs=(profile, ), wargs=(chart, img, use_gamut, profile), wkwargs={}, progress_msg=lang.getstr("testchart.add_ti3_patches"), parent=self, progress_start=500, fancy=False) def tc_add_ti3_consumer(self, result, profile=None): if isinstance(result, Exception): show_result_dialog(result, self) else: chart = result data_format = chart.queryv1("DATA_FORMAT").values() if getcfg("tc_add_ti3_relative"): intent = "r" else: intent = "a" if not (chart[0].type.strip() == "GAMUT" and "RGB_R" in data_format and "RGB_G" in data_format and "RGB_B" in data_format): as_ti3 = ("LAB_L" in data_format and "LAB_A" in data_format and "LAB_B" in data_format) or ("XYZ_X" in data_format and "XYZ_Y" in data_format and "XYZ_Z" in data_format) if getcfg("tc_add_ti3_relative"): adapted = chart.adapt() ti1, ti3, void = self.worker.chart_lookup(chart, profile, as_ti3, intent=intent, white_patches=False) if not ti1 or not ti3: return if as_ti3: chart = ti1 else: chart = ti3 dataset = chart.queryi1("DATA") data_format = dataset.queryv1("DATA_FORMAT").values() # Returned CIE values are always either XYZ or Lab if ("LAB_L" in data_format and "LAB_A" in data_format and "LAB_B" in data_format): cie = "Lab" else: cie = "XYZ" newdata = [] rows = self.grid.GetSelectionRows() if rows: row = rows[-1] else: row = self.grid.GetNumberRows() - 1 for i in dataset.DATA: if cie == "Lab": (dataset.DATA[i]["XYZ_X"], dataset.DATA[i]["XYZ_Y"], dataset.DATA[i]["XYZ_Z"]) = colormath.Lab2XYZ( dataset.DATA[i]["LAB_L"], dataset.DATA[i]["LAB_A"], dataset.DATA[i]["LAB_B"], scale=100) if intent == "r": (dataset.DATA[i]["XYZ_X"], dataset.DATA[i]["XYZ_Y"], dataset.DATA[i]["XYZ_Z"]) = colormath.adapt( dataset.DATA[i]["XYZ_X"], dataset.DATA[i]["XYZ_Y"], dataset.DATA[i]["XYZ_Z"], "D50", profile.tags.wtpt.values()) entry = {"SAMPLE_ID": row + 2 + i} for label in ("RGB_R", "RGB_G", "RGB_B", "XYZ_X", "XYZ_Y", "XYZ_Z"): entry[label] = round(dataset.DATA[i][label], 4) newdata.append(entry) self.tc_add_data(row, newdata) self.grid.select_row(row + len(newdata)) def tc_add_ti3(self, chart, img=None, use_gamut=True, profile=None): if img: cwd = self.worker.create_tempdir() if isinstance(cwd, Exception): return cwd size = 70.0 scale = math.sqrt((img.Width * img.Height) / (size * size)) w, h = int(round(img.Width / scale)), int(round(img.Height / scale)) loresimg = img.Scale(w, h, wx.IMAGE_QUALITY_NORMAL) if loresimg.CountColours() < img.CountColours(size * size): # Assume a photo quality = wx.IMAGE_QUALITY_HIGH else: # Assume a target quality = wx.IMAGE_QUALITY_NORMAL ext = os.path.splitext(chart)[1] if (ext.lower() in (".tif", ".tiff") or (self.worker.argyll_version >= [1, 4] and ext.lower() in (".jpeg", ".jpg"))): imgpath = chart else: imgpath = os.path.join(cwd, "image.tif") img.SaveFile(imgpath, wx.BITMAP_TYPE_TIF) outpath = os.path.join(cwd, "imageout.tif") # Process image to get colors # Two ways to do this: Convert image using cctiff # or use tiffgamut # In both cases, a profile embedded in the image will be used # with the preconditioning profile as fallback if there is no # image profile if not use_gamut: # Use cctiff cmdname = "cctiff" else: # Use tiffgamut cmdname = "tiffgamut" gam = os.path.join(cwd, "image.gam") cmd = get_argyll_util(cmdname) if cmd: ppath = getcfg("tc_precond_profile") intent = "r" if getcfg("tc_add_ti3_relative") else "a" for n in xrange(2 if ppath else 1): if use_gamut: res = 10 if imgpath == chart else 1 args = ["-d%s" % res, "-O", gam] #if self.worker.argyll_version >= [1, 0, 4]: #args.append("-f100") else: args = ["-a"] if self.worker.argyll_version >= [1, 4]: # Always save as TIFF args.append("-fT") elif self.worker.argyll_version >= [1, 1]: # TIFF photometric encoding 1..n args.append("-t1") else: # TIFF photometric encoding 1..n args.append("-e1") args.append("-i%s" % intent) if n == 0: # Try to use embedded profile args.append(imgpath) if not use_gamut: # Target args.append("-i%s" % intent) args.append(ppath) else: # Fall back to preconditioning profile args.append(ppath) args.append(imgpath) if not use_gamut: args.append(outpath) result = self.worker.exec_cmd(cmd, ["-v"] + args, capture_output=True, skip_scripts=True) if not result: errors = "".join(self.worker.errors) if ("Error - Can't open profile in file" in errors or "Error - Can't read profile" in errors): # Try again? continue break if isinstance(result, Exception) or not result: self.worker.wrapup(False) if isinstance(result, Exception): return result elif result: if use_gamut: chart = gam else: last_output_space = None for line in self.worker.output: if line.startswith("Output space ="): last_output_space = line.split("=")[1].strip() if last_output_space == "RGB": chart = outpath else: chart = imgpath else: return Error("\n".join(self.worker.errors or self.worker.output)) else: return Error(lang.getstr("argyll.util.not_found", cmdname)) if not use_gamut: llevel = wx.Log.GetLogLevel() wx.Log.SetLogLevel(0) # Suppress TIFF library related message popups try: img = wx.Image(chart, wx.BITMAP_TYPE_ANY) if not img.IsOk(): raise Error(lang.getstr("error.file_type_unsupported")) except Exception, exception: return exception finally: wx.Log.SetLogLevel(llevel) self.worker.wrapup(False) if img.Width != w or img.Height != h: img.Rescale(w, h, quality) # Select RGB colors and fill chart chart = ["TI1 ", "BEGIN_DATA_FORMAT", "RGB_R RGB_G RGB_B", "END_DATA_FORMAT", "BEGIN_DATA", "END_DATA"] for y in xrange(h): for x in xrange(w): R, G, B = (img.GetRed(x, y) / 2.55, img.GetGreen(x, y) / 2.55, img.GetBlue(x, y) / 2.55) chart.insert(-1, "%.4f %.4f %.4f" % (R, G, B)) chart = "\n".join(chart) try: chart = CGATS.CGATS(chart) if not chart.queryv1("DATA_FORMAT"): raise CGATS.CGATSError(lang.getstr("error.testchart.missing_fields", (chart.filename, "DATA_FORMAT"))) except (IOError, CGATS.CGATSError), exception: return exception finally: path = None if isinstance(chart, CGATS.CGATS): if chart.filename: path = chart.filename elif os.path.isfile(chart): path = chart if path and os.path.dirname(path) == self.worker.tempdir: self.worker.wrapup(False) if img: if use_gamut: threshold = 2 else: threshold = 4 try: void, ti3, void = self.worker.chart_lookup(chart, profile, intent=intent, white_patches=False, raise_exceptions=True) except Exception, exception: return exception if ti3: chart = ti3 else: return Error(lang.getstr("error.generic", (-1, lang.getstr("unknown")))) colorsets = OrderedDict() weights = {} demph = getcfg("tc_dark_emphasis") # Select Lab color data = chart.queryv1("DATA") for sample in data.itervalues(): if not use_gamut: RGB = sample["RGB_R"], sample["RGB_G"], sample["RGB_B"] L, a, b = (sample["LAB_L"], sample["LAB_A"], sample["LAB_B"]) color = round(L / 10), round(a / 15), round(b / 15) if not color in colorsets: weights[color] = 0 colorsets[color] = [] if L >= 50: weights[color] += L / 50 - demph else: weights[color] += L / 50 + demph colorsets[color].append((L, a, b)) if not use_gamut: colorsets[color][-1] += RGB # Fill chart data_format = "LAB_L LAB_A LAB_B" if not use_gamut: data_format += " RGB_R RGB_G RGB_B" chart = ["GAMUT ", "BEGIN_DATA_FORMAT", data_format, "END_DATA_FORMAT", "BEGIN_DATA", "END_DATA"] weight = bool(filter(lambda color: weights[color] >= threshold, colorsets.iterkeys())) for color, colors in colorsets.iteritems(): if weight and weights[color] < threshold: continue L, a, b = 0, 0, 0 R, G, B = 0, 0, 0 for v in colors: L += v[0] a += v[1] b += v[2] if len(v) == 6: R += v[3] G += v[4] B += v[5] L /= len(colors) a /= len(colors) b /= len(colors) R /= len(colors) G /= len(colors) B /= len(colors) chart.insert(-1, "%.4f %.4f %.4f" % (L, a, b)) if not use_gamut: chart[-2] += " %.4f %.4f %.4f" % (R, G, B) chart = CGATS.CGATS("\n".join(chart)) else: chart.fix_device_values_scaling() return chart def tc_add_ti3_relative_handler(self, event): setcfg("tc_add_ti3_relative", int(self.add_ti3_relative_cb.GetValue())) def tc_angle_handler(self, event = None): if event.GetId() == self.tc_angle_slider.GetId(): self.tc_angle_intctrl.SetValue(self.tc_angle_slider.GetValue()) else: self.tc_angle_slider.SetValue(self.tc_angle_intctrl.GetValue()) setcfg("tc_angle", self.tc_angle_intctrl.GetValue() / 10000.0) def tc_multi_bcc_cb_handler(self, event=None): setcfg("tc_multi_bcc", int(self.tc_multi_bcc_cb.GetValue())) self.tc_multi_steps_handler2() def tc_precond_handler(self, event = None): setcfg("tc_precond", int(self.tc_precond.GetValue())) self.tc_adaption_slider.SetValue((1 if getcfg("tc_precond") else defaults["tc_adaption"]) * 100) self.tc_adaption_handler(self.tc_adaption_slider) self.tc_algo_handler() def tc_precond_profile_handler(self, event = None): tc_precond_enable = bool(self.tc_precond_profile.GetPath()) self.tc_precond.Enable(tc_precond_enable) setcfg("tc_precond_profile", self.tc_precond_profile.GetPath()) self.tc_algo_handler() def tc_precond_profile_current_ctrl_handler(self, event): profile_path = get_current_profile_path(True, True) if profile_path: self.tc_precond_profile.SetPath(profile_path) self.tc_precond_profile_handler() else: show_result_dialog(Error(lang.getstr("display_profile.not_detected", get_display_name(None, True))), self) def tc_filter_handler(self, event = None): setcfg("tc_filter", int(self.tc_filter.GetValue())) setcfg("tc_filter_L", self.tc_filter_L.GetValue()) setcfg("tc_filter_a", self.tc_filter_a.GetValue()) setcfg("tc_filter_b", self.tc_filter_b.GetValue()) setcfg("tc_filter_rad", self.tc_filter_rad.GetValue()) def tc_vrml_black_offset_ctrl_handler(self, event): setcfg("tc_vrml_black_offset", self.tc_vrml_black_offset_intctrl.GetValue()) def tc_vrml_compress_handler(self, event): setcfg("vrml.compress", int(self.tc_vrml_compress_cb.GetValue())) def tc_vrml_handler(self, event = None): d = self.tc_vrml_device.GetValue() l = self.tc_vrml_cie.GetValue() if event: setcfg("tc_vrml_device", int(d)) setcfg("tc_vrml_cie", int(l)) setcfg("tc_vrml_cie_colorspace", self.tc_vrml_cie_colorspace_ctrl.GetStringSelection()) setcfg("tc_vrml_device_colorspace", self.tc_vrml_device_colorspace_ctrl.GetStringSelection()) self.vrml_save_as_btn.Enable(hasattr(self, "ti1") and (d or l)) self.view_3d_format_btn.Enable(hasattr(self, "ti1") and (d or l)) def tc_vrml_use_D50_handler(self, event): setcfg("tc_vrml_use_D50", int(self.tc_vrml_use_D50_cb.GetValue())) def tc_update_controls(self): self.tc_algo.SetStringSelection(self.tc_algos_ab.get(getcfg("tc_algo"), self.tc_algos_ab.get(defaults["tc_algo"]))) self.tc_white_patches.SetValue(getcfg("tc_white_patches")) if self.worker.argyll_version >= [1, 6]: self.tc_black_patches.SetValue(getcfg("tc_black_patches")) self.tc_single_channel_patches.SetValue(getcfg("tc_single_channel_patches")) self.tc_gray_patches.SetValue(getcfg("tc_gray_patches")) if getcfg("tc_multi_bcc_steps"): setcfg("tc_multi_bcc", 1) self.tc_multi_steps.SetValue(getcfg("tc_multi_bcc_steps")) else: setcfg("tc_multi_bcc", 0) self.tc_multi_steps.SetValue(getcfg("tc_multi_steps")) if hasattr(self, "tc_multi_bcc_cb"): self.tc_multi_bcc_cb.SetValue(bool(getcfg("tc_multi_bcc"))) self.tc_multi_steps_handler2() self.tc_fullspread_patches.SetValue(getcfg("tc_fullspread_patches")) self.tc_angle_slider.SetValue(getcfg("tc_angle") * 10000) self.tc_angle_handler(self.tc_angle_slider) self.tc_adaption_slider.SetValue(getcfg("tc_adaption") * 100) self.tc_adaption_handler(self.tc_adaption_slider) if (self.worker.argyll_version == [1, 1, "RC2"] or self.worker.argyll_version >= [1, 1]): self.tc_gamma_floatctrl.SetValue(getcfg("tc_gamma")) if self.worker.argyll_version >= [1, 3, 3]: self.tc_neutral_axis_emphasis_slider.SetValue(getcfg("tc_neutral_axis_emphasis") * 100) self.tc_neutral_axis_emphasis_handler(self.tc_neutral_axis_emphasis_slider) if self.worker.argyll_version >= [1, 6, 2]: self.tc_dark_emphasis_slider.SetValue(getcfg("tc_dark_emphasis") * 100) self.tc_dark_emphasis_handler(self.tc_dark_emphasis_slider) self.tc_precond_profile.SetPath(getcfg("tc_precond_profile")) self.tc_filter.SetValue(bool(int(getcfg("tc_filter")))) self.tc_filter_L.SetValue(getcfg("tc_filter_L")) self.tc_filter_a.SetValue(getcfg("tc_filter_a")) self.tc_filter_b.SetValue(getcfg("tc_filter_b")) self.tc_filter_rad.SetValue(getcfg("tc_filter_rad")) self.tc_vrml_cie.SetValue(bool(int(getcfg("tc_vrml_cie")))) self.tc_vrml_cie_colorspace_ctrl.SetSelection( config.valid_values["tc_vrml_cie_colorspace"].index(getcfg("tc_vrml_cie_colorspace"))) self.tc_vrml_device_colorspace_ctrl.SetSelection( config.valid_values["tc_vrml_device_colorspace"].index(getcfg("tc_vrml_device_colorspace"))) self.tc_vrml_device.SetValue(bool(int(getcfg("tc_vrml_device")))) self.tc_vrml_black_offset_intctrl.SetValue(getcfg("tc_vrml_black_offset")) self.tc_vrml_use_D50_cb.SetValue(bool(getcfg("tc_vrml_use_D50"))) self.tc_vrml_handler() self.tc_vrml_compress_cb.SetValue(bool(getcfg("vrml.compress"))) self.add_ti3_relative_cb.SetValue(bool(getcfg("tc_add_ti3_relative"))) self.tc_enable_sort_controls() def tc_check(self, event = None): white_patches = self.tc_white_patches.GetValue() self.tc_amount = self.tc_get_total_patches(white_patches) self.preview_btn.Enable(self.tc_amount - max(0, self.tc_get_white_patches()) - max(0, self.tc_get_black_patches()) >= 8) self.clear_btn.Enable(hasattr(self, "ti1")) self.tc_save_check() self.save_as_btn.Enable(hasattr(self, "ti1")) self.export_btn.Enable(hasattr(self, "ti1")) self.tc_vrml_handler() self.tc_enable_add_precond_controls() self.tc_enable_sort_controls() self.tc_set_default_status() def tc_save_check(self): self.save_btn.Enable(hasattr(self, "ti1") and self.ti1.modified and bool(self.ti1.filename) and os.path.exists(self.ti1.filename) and get_data_path(os.path.join("ref", os.path.basename(self.ti1.filename))) != self.ti1.filename and get_data_path(os.path.join("ti1", os.path.basename(self.ti1.filename))) != self.ti1.filename) def tc_save_cfg(self): setcfg("tc_white_patches", self.tc_white_patches.GetValue()) if self.worker.argyll_version >= [1, 6]: setcfg("tc_black_patches", self.tc_black_patches.GetValue()) setcfg("tc_single_channel_patches", self.tc_single_channel_patches.GetValue()) setcfg("tc_gray_patches", self.tc_gray_patches.GetValue()) setcfg("tc_multi_steps", self.tc_multi_steps.GetValue()) setcfg("tc_fullspread_patches", self.tc_fullspread_patches.GetValue()) tc_algo = self.tc_algos_ba[self.tc_algo.GetStringSelection()] setcfg("tc_algo", tc_algo) setcfg("tc_angle", self.tc_angle_intctrl.GetValue() / 10000.0) setcfg("tc_adaption", self.tc_adaption_intctrl.GetValue() / 100.0) tc_precond_enable = tc_algo in ("I", "Q", "R", "t") or (tc_algo == "" and self.tc_adaption_slider.GetValue() > 0) if tc_precond_enable: setcfg("tc_precond", int(self.tc_precond.GetValue())) setcfg("tc_precond_profile", self.tc_precond_profile.GetPath()) setcfg("tc_filter", int(self.tc_filter.GetValue())) setcfg("tc_filter_L", self.tc_filter_L.GetValue()) setcfg("tc_filter_a", self.tc_filter_a.GetValue()) setcfg("tc_filter_b", self.tc_filter_b.GetValue()) setcfg("tc_filter_rad", self.tc_filter_rad.GetValue()) setcfg("tc_vrml_cie", int(self.tc_vrml_cie.GetValue())) setcfg("tc_vrml_device", int(self.tc_vrml_device.GetValue())) def tc_preview_handler(self, event=None, path=None): if self.worker.is_working(): return fullspread_patches = getcfg("tc_fullspread_patches") single_patches = getcfg("tc_single_channel_patches") gray_patches = getcfg("tc_gray_patches") multidim_patches = getcfg("tc_multi_steps") multidim_bcc_patches = getcfg("tc_multi_bcc_steps") wkwargs = {} if fullspread_patches and (single_patches > 2 or gray_patches > 2 or multidim_patches > 2 or multidim_bcc_patches) and wx.GetKeyState(wx.WXK_SHIFT): dlg = ConfirmDialog(self, -1, lang.getstr("testchart.create"), lang.getstr("testchart.separate_fixed_points"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, appname + "-testchart-editor")) dlg.sizer3.Add((1, 4)) for name in ("single", "gray", "multidim"): if (locals()[name + "_patches"] > 2 or (name == "multidim" and multidim_bcc_patches)): setattr(dlg, name, wx.CheckBox(dlg, -1, lang.getstr("tc." + name))) dlg.sizer3.Add(getattr(dlg, name), 1, flag=wx.TOP, border=4) getattr(dlg, name).Value = True dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() choice = dlg.ShowModal() for name in ("single", "gray", "multidim"): if hasattr(dlg, name): wkwargs[name] = getattr(dlg, name).Value dlg.Destroy() if choice == wx.ID_CANCEL: return if not self.tc_check_save_ti1(): return if not check_set_argyll_bin(): return safe_print("-" * 80) safe_print(lang.getstr("testchart.create")) self.worker.interactive = False self.worker.start(self.tc_preview, self.tc_create, cargs=(path, ), wargs=(), wkwargs=wkwargs, progress_msg=lang.getstr("testchart.create"), parent=self, progress_start=500) def tc_preview_update(self, startindex): if not hasattr(self, "preview"): return numcols = self.preview.GetNumberCols() startrow = startindex / numcols startcol = startindex % numcols i = 0 row = startrow numrows = self.preview.GetNumberRows() neededrows = math.ceil(float(self.grid.GetNumberRows()) / numcols) - numrows if neededrows > 0: self.preview.AppendRows(neededrows) while True: if row == startrow: cols = xrange(startcol, numcols) else: cols = xrange(numcols) for col in cols: if startindex + i < self.grid.GetNumberRows(): color = self.grid.GetCellBackgroundColour(startindex + i, 3) textcolor = self.grid.GetCellTextColour(startindex + i, 3) value = self.grid.GetCellValue(startindex + i, 3) else: color = self.preview.GetDefaultCellBackgroundColour() textcolor = self.preview.GetDefaultCellTextColour() value = "" self.preview.SetCellBackgroundColour(row, col, color) self.preview.SetCellTextColour(row, col, textcolor) self.preview.SetCellValue(row, col, value) i += 1 row += 1 if startindex + i >= self.grid.GetNumberRows(): break if row < self.preview.GetNumberRows(): self.preview.DeleteRows(row, self.preview.GetNumberRows() - row) def tc_clear_handler(self, event): self.tc_check_save_ti1() def tc_clear(self, clear_ti1=True): grid = self.grid if grid.GetNumberRows() > 0: grid.DeleteRows(0, grid.GetNumberRows()) if grid.GetNumberCols() > 0: grid.DeleteCols(0, grid.GetNumberCols()) grid.Refresh() self.separator.Hide() self.sizer.Layout() if hasattr(self, "preview"): if self.preview.GetNumberRows() > 0: self.preview.DeleteRows(0, self.preview.GetNumberRows()) if self.preview.GetNumberCols() > 0: self.preview.DeleteCols(0, self.preview.GetNumberCols()) self.preview.Refresh() if clear_ti1: if hasattr(self, "ti1"): del self.ti1 self.tc_update_controls() self.tc_check() # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title safe_print("") self.SetTitle(lang.getstr("testchart.edit")) def tc_export_handler(self, event): if not hasattr(self, "ti1"): return path = None (defaultDir, defaultFile) = (get_verified_path("last_testchart_export_path")[0], os.path.basename(os.path.splitext(self.ti1.filename or defaults["last_testchart_export_path"])[0])) dlg = wx.FileDialog(self, lang.getstr("export"), defaultDir=defaultDir, defaultFile=defaultFile, # Disable JPEG as it introduces slight color errors wildcard=##lang.getstr("filetype.jpg") + "|*.jpg|" + lang.getstr("filetype.png") + " (8-bit)|*.png|" + lang.getstr("filetype.png") + " (16-bit)|*.png|" + lang.getstr("filetype.tif") + " (8-bit)|*.tif|" + lang.getstr("filetype.tif") + " (16-bit)|*.tif|" + "DPX|*.dpx|" + "CSV (0.0..100.0)|*.csv|" + "CSV (0..255)|*.csv|" + "CSV (0..1023)|*.csv", style=wx.SAVE | wx.OVERWRITE_PROMPT) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: filter_index = dlg.GetFilterIndex() path = dlg.GetPath() dlg.Destroy() if path: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return setcfg("last_testchart_export_path", path) self.writecfg() else: return if filter_index < 5: # Image format scale = getcfg("app.dpi") / config.get_default_dpi() if scale < 1: scale = 1 dlg = ConfirmDialog(self, title=lang.getstr("export"), msg=lang.getstr("testchart.export.repeat_patch"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, appname + "-testchart-editor")) sizer = wx.BoxSizer(wx.HORIZONTAL) dlg.sizer3.Add(sizer, 0, flag=wx.TOP | wx.ALIGN_LEFT, border=12) intctrl = wx.SpinCtrl(dlg, -1, size=(60 * scale, -1), min=config.valid_ranges["tc_export_repeat_patch_max"][0], max=config.valid_ranges["tc_export_repeat_patch_max"][1], value=str(getcfg("tc_export_repeat_patch_max"))) sizer.Add(intctrl, 0, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=4) sizer.Add(wx.StaticText(dlg, -1, u"× " + lang.getstr("max")), 0, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=12) intctrl2 = wx.SpinCtrl(dlg, -1, size=(60 * scale, -1), min=config.valid_ranges["tc_export_repeat_patch_min"][0], max=config.valid_ranges["tc_export_repeat_patch_min"][1], value=str(getcfg("tc_export_repeat_patch_min"))) sizer.Add(intctrl2, 0, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=4) sizer.Add(wx.StaticText(dlg, -1, u"× " + lang.getstr("min")), 0, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() result = dlg.ShowModal() repeatmax = intctrl.GetValue() repeatmin = intctrl2.GetValue() dlg.Destroy() if result != wx.ID_OK: return setcfg("tc_export_repeat_patch_max", repeatmax) setcfg("tc_export_repeat_patch_min", repeatmin) self.writecfg() defaults["size.measureframe"] = get_default_size() self.display_size = wx.DisplaySize() if path: self.worker.start(lambda result: None, self.tc_export, wargs=(path, filter_index), wkwargs={}, progress_msg=lang.getstr("export"), parent=self, progress_start=500, fancy=False) def tc_export(self, path, filter_index): if filter_index < 5: # Image format self.tc_export_subroutine(path, filter_index) else: # CSV with open(path, "wb") as csvfile: self.tc_export_subroutine(csv.writer(csvfile), filter_index) def tc_export_subroutine(self, target, filter_index, allow_gaps=False): maxlen = len(self.ti1[0].DATA) if filter_index < 5: # Image format name, ext = os.path.splitext(target)[0], {0: ".png", 1: ".png", 2: ".tif", 3: ".tif", 4: ".dpx"}[filter_index] format = {".dpx": "DPX", ".png": "PNG", ".tif": "TIFF"}[ext] bitdepth = {0: 8, 1: 16, 2: 8, 3: 16, 4: 10}[filter_index] vscale = (2 ** bitdepth - 1) repeatmax = getcfg("tc_export_repeat_patch_max") repeatmin = getcfg("tc_export_repeat_patch_min") maxcount = maxlen * repeatmax filenameformat = "%%s-%%0%id%%s" % len(str(maxcount)) count = 0 secs = 0 # Scale from screen dimensions to fixed 1080p viewport sw, sh = 1920, 1080 x, y, size = [float(v) for v in getcfg("dimensions.measureframe").split(",")] size *= defaults["size.measureframe"] displays = getcfg("displays") match = None display_no = getcfg("display.number") - 1 if display_no in range(len(displays)): match = re.search("@ -?\d+, -?\d+, (\d+)x(\d+)", displays[display_no]) if match: display_size = [int(item) for item in match.groups()] else: display_size = self.display_size w, h = [min(size / v, 1.0) for v in display_size] x = (display_size[0] - size) * x / display_size[0] y = (display_size[1] - size) * y / display_size[1] x, y, w, h = [max(v, 0) for v in (x, y, w, h)] x, w = [int(round(v * sw)) for v in (x, w)] y, h = [int(round(v * sh)) for v in (y, h)] dimensions = w, h else: # CSV vscale = {5: 100, 6: 255, 7: 1023}[filter_index] is_winnt6 = sys.platform == "win32" and sys.getwindowsversion() >= (6, ) use_winnt6_symlinks = is_winnt6 and is_superuser() for i in xrange(maxlen): if self.worker.thread_abort: break self.worker.lastmsg.write("%d%%\n" % (100.0 / maxlen * (i + 1))) R, G, B = (self.ti1[0].DATA[i]["RGB_R"], self.ti1[0].DATA[i]["RGB_G"], self.ti1[0].DATA[i]["RGB_B"]) if not filter_index < 5: # CSV if vscale != 100: # XXX: Careful when rounding floats! # Incorrect: int(round(50 * 2.55)) = 127 (127.499999) # Correct: int(round(50 / 100.0 * 255)) = 128 (127.5) R, G, B = [int(round(v / 100.0 * vscale)) for v in [R, G, B]] target.writerow([str(v) for v in [i, R, G, B]]) continue # Image format X, Y, Z = colormath.RGB2XYZ(R / 100.0, G / 100.0, B / 100.0, scale=100.0) L, a, b = colormath.XYZ2Lab(X, Y, Z) # XXX: Careful when rounding floats! # Incorrect: int(round(50 * 2.55)) = 127 (127.499999) # Correct: int(round(50 / 100.0 * 255)) = 128 (127.5) color = (int(round(R / 100.0 * vscale)), int(round(G / 100.0 * vscale)), int(round(B / 100.0 * vscale))) count += 1 filename = filenameformat % (name, count, ext) repeat = int(round(repeatmin + ((repeatmax - repeatmin) / 100.0 * (100 - L)))) imfile.write([[color]], filename, bitdepth, format, dimensions, {"original_width": sw, "original_height": sh, "offset_x": x, "offset_y": y, "frame_position": count, "frame_rate": 1, "held_count": repeat if allow_gaps else 1, "timecode": [int(v) for v in time.strftime("%H:%M:%S:00", time.gmtime(secs)).split(":")]}) secs += 1 ##safe_print("RGB", R, G, B, "L* %.2f" % L, "repeat", repeat) if repeat > 1: if allow_gaps: count += repeat - 1 secs += repeat - 1 continue for j in xrange(repeat - 1): count += 1 filecopyname = filenameformat % (name, count, ext) if format == "DPX": imfile.write([[color]], filecopyname, bitdepth, format, dimensions, {"original_width": sw, "original_height": sh, "offset_x": x, "offset_y": y, "frame_position": count, "frame_rate": 1, "timecode": [int(v) for v in time.strftime("%H:%M:%S:00", time.gmtime(secs)).split(":")]}) secs += 1 if format == "DPX": continue if os.path.isfile(filecopyname): os.unlink(filecopyname) if is_winnt6: if use_winnt6_symlinks: win32file.CreateSymbolicLink(filecopyname, os.path.basename(filename), 0) else: shutil.copyfile(filename, filecopyname) else: os.symlink(os.path.basename(filename), filecopyname) def tc_save_handler(self, event = None): self.tc_save_as_handler(event, path = self.ti1.filename) def tc_save_as_handler(self, event = None, path = None): checkoverwrite = True if path is None or (event and not os.path.isfile(path)): path = None defaultDir = get_verified_path("last_ti1_path")[0] if hasattr(self, "ti1") and self.ti1.filename: if os.path.isfile(self.ti1.filename): defaultDir = os.path.dirname(self.ti1.filename) defaultFile = os.path.basename(self.ti1.filename) else: defaultFile = os.path.basename(config.defaults["last_ti1_path"]) dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir = defaultDir, defaultFile = defaultFile, wildcard = lang.getstr("filetype.ti1") + "|*.ti1", style = wx.SAVE | wx.OVERWRITE_PROMPT) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: filename, ext = os.path.splitext(path) if ext.lower() != ".ti1": path += ".ti1" else: checkoverwrite = False if path: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return if checkoverwrite and os.path.isfile(path): dlg = ConfirmDialog(self, msg=lang.getstr("dialog.confirm_overwrite", (path)), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return setcfg("last_ti1_path", path) try: file_ = open(path, "w") file_.write(str(self.ti1)) file_.close() self.ti1.filename = path self.ti1.root.setmodified(False) if not self.IsBeingDeleted(): # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title safe_print("") self.SetTitle(lang.getstr("testchart.edit").rstrip(".") + ": " + os.path.basename(path)) except Exception, exception: handle_error(Error(u"Error - testchart could not be saved: " + safe_unicode(exception)), parent=self) else: if self.Parent: if path != getcfg(self.cfg) and self.parent_set_chart_methodname: dlg = ConfirmDialog(self, msg = lang.getstr("testchart.confirm_select"), ok = lang.getstr("testchart.select"), cancel = lang.getstr("testchart.dont_select"), bitmap = geticon(32, "dialog-question")) result = dlg.ShowModal() dlg.Destroy() if result == wx.ID_OK: setcfg(self.cfg, path) self.writecfg() if path == getcfg(self.cfg) and self.parent_set_chart_methodname: getattr(self.Parent, self.parent_set_chart_methodname)(path) if not self.IsBeingDeleted(): self.save_btn.Disable() return True return False def tc_view_3d(self, event): if (self.ti1.filename and not (self.worker.tempdir and self.ti1.filename.startswith(self.worker.tempdir)) and waccess(os.path.dirname(self.ti1.filename), os.W_OK)): regenerate = self.ti1.modified paths = self.tc_save_3d(os.path.splitext(self.ti1.filename)[0], regenerate=regenerate) if (not regenerate and os.path.isfile(self.ti1.filename)): # Check if the testchart is newer than the 3D file(s) ti1_mtime = os.stat(self.ti1.filename).st_mtime for path in paths: if os.stat(path).st_mtime < ti1_mtime: regenerate = True break if regenerate: paths = self.tc_save_3d(os.path.splitext(self.ti1.filename)[0], regenerate=True) else: paths = self.tc_save_3d_as_handler(None) for path in paths: launch_file(path) def tc_save_3d_as_handler(self, event): path = None paths = [] if (hasattr(self, "ti1") and self.ti1.filename and os.path.isfile(self.ti1.filename)): defaultDir = os.path.dirname(self.ti1.filename) defaultFile = self.ti1.filename else: defaultDir = get_verified_path("last_vrml_path")[0] defaultFile = defaults["last_vrml_path"] view_3d_format = getcfg("3d.format") if view_3d_format == "HTML": formatext = ".html" elif view_3d_format == "VRML": if getcfg("vrml.compress"): formatext = ".wrz" else: formatext = ".wrl" else: formatext = ".x3d" defaultFile = os.path.splitext(os.path.basename(defaultFile))[0] + formatext dlg = wx.FileDialog(self, lang.getstr("save_as"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("view.3d") + "|*" + formatext, style=wx.SAVE | wx.OVERWRITE_PROMPT) dlg.Center(wx.BOTH) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path: if not waccess(path, os.W_OK): show_result_dialog(Error(lang.getstr("error.access_denied.write", path)), self) return [] filename, ext = os.path.splitext(path) if ext.lower() != formatext: path += formatext setcfg("last_vrml_path", path) paths = self.tc_save_3d(filename) return paths def tc_save_3d(self, filename, regenerate=True): paths = [] view_3d_format = getcfg("3d.format") if view_3d_format == "VRML": if getcfg("vrml.compress"): formatext = ".wrz" else: formatext = ".wrl" else: formatext = ".x3d" if view_3d_format == "HTML": formatext += ".html" if getcfg("tc_vrml_device") or getcfg("tc_vrml_cie"): colorspaces = [] if getcfg("tc_vrml_device"): colorspaces.append(getcfg("tc_vrml_device_colorspace")) if getcfg("tc_vrml_cie"): colorspaces.append(getcfg("tc_vrml_cie_colorspace")) for colorspace in colorspaces: path = filename + " " + colorspace + formatext if os.path.exists(path): if regenerate: dlg = ConfirmDialog(self, msg=lang.getstr("dialog.confirm_overwrite", (path)), ok=lang.getstr("overwrite"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) result = dlg.ShowModal() dlg.Destroy() else: result = wx.ID_CANCEL if result != wx.ID_OK: paths.append(path) continue try: self.ti1[0].export_3d(path, colorspace, RGB_black_offset=getcfg("tc_vrml_black_offset"), normalize_RGB_white=getcfg("tc_vrml_use_D50"), compress=formatext == ".wrz", format=view_3d_format) except Exception, exception: handle_error(UserWarning(u"Warning - 3D file could not be " "saved: " + safe_unicode(exception)), parent=self) else: paths.append(path) return paths def tc_check_save_ti1(self, clear = True): if hasattr(self, "ti1"): if (self.ti1.root.modified or not self.ti1.filename or not os.path.exists(self.ti1.filename)): if self.save_btn.Enabled: ok = lang.getstr("save") else: ok = lang.getstr("save_as") dlg = ConfirmDialog(self, msg = lang.getstr("testchart.save_or_discard"), ok = ok, cancel = lang.getstr("cancel"), bitmap = geticon(32, "dialog-warning")) if self.IsBeingDeleted(): dlg.buttonpanel.Hide(0) if self.save_btn.Enabled: dlg.save_as = wx.Button(dlg.buttonpanel, -1, lang.getstr("save_as")) ID_SAVE_AS = dlg.save_as.GetId() dlg.Bind(wx.EVT_BUTTON, dlg.OnClose, id = ID_SAVE_AS) dlg.sizer2.Add((12, 12)) dlg.sizer2.Add(dlg.save_as) else: ID_SAVE_AS = wx.ID_OK dlg.discard = wx.Button(dlg.buttonpanel, -1, lang.getstr("testchart.discard")) ID_DISCARD = dlg.discard.GetId() dlg.Bind(wx.EVT_BUTTON, dlg.OnClose, id = ID_DISCARD) dlg.sizer2.Add((12, 12)) dlg.sizer2.Add(dlg.discard) dlg.buttonpanel.Layout() dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() result = dlg.ShowModal() dlg.Destroy() if result in (wx.ID_OK, ID_SAVE_AS): if result == ID_SAVE_AS: path = None else: path = self.ti1.filename if not self.tc_save_as_handler(True, path): return False elif result == wx.ID_CANCEL: return False clear = True if clear and not self.IsBeingDeleted(): self.tc_clear() return True def tc_close_handler(self, event = None): if (getattr(self.worker, "thread", None) and self.worker.thread.isAlive()): self.worker.abort_subprocess(True) return if (not event or self.IsShownOnScreen()) and self.tc_check_save_ti1(False): setcfg("tc.saturation_sweeps", self.saturation_sweeps_intctrl.GetValue()) for component in ("R", "G", "B"): setcfg("tc.saturation_sweeps.custom.%s" % component, getattr(self, "saturation_sweeps_custom_%s_ctrl" % component).GetValue()) self.worker.wrapup(False) # Hide first (looks nicer) self.Hide() if self.Parent: setcfg("tc.show", 0) return True else: self.writecfg() # Need to use CallAfter to prevent hang under Windows if minimized wx.CallAfter(self.Destroy) elif isinstance(event, wx.CloseEvent) and event.CanVeto(): event.Veto() def tc_move_handler(self, event = None): if self.IsShownOnScreen() and not self.IsMaximized() and not self.IsIconized(): x, y = self.GetScreenPosition() setcfg("position.tcgen.x", x) setcfg("position.tcgen.y", y) if event: event.Skip() def tc_destroy_handler(self, event): event.Skip() def tc_load_cfg_from_ti1(self, event = None, path = None, cfg=None, parent_set_chart_methodname=None, resume=False): if self.worker.is_working(): return if cfg: self.cfg = cfg if path is None: path = getcfg(self.cfg) if path == "auto": return if parent_set_chart_methodname: self.parent_set_chart_methodname = parent_set_chart_methodname if not self.tc_check_save_ti1(): return safe_print(lang.getstr("testchart.read")) self.worker.interactive = False self.worker.start(self.tc_load_cfg_from_ti1_finish, self.tc_load_cfg_from_ti1_worker, wargs=(path, ), wkwargs={}, progress_title=lang.getstr("testchart.read"), progress_msg=lang.getstr("testchart.read"), parent=self, progress_start=500, cancelable=False, resume=resume, show_remaining_time=False, fancy=False) def tc_load_cfg_from_ti1_worker(self, path): path = safe_unicode(path) try: filename, ext = os.path.splitext(path) if ext.lower() not in (".icc", ".icm"): if ext.lower() == ".ti3": ti1 = CGATS.CGATS(ti3_to_ti1(open(path, "rU"))) ti1.filename = filename + ".ti1" else: ti1 = CGATS.CGATS(path) ti1.filename = path else: # icc or icm profile profile = ICCP.ICCProfile(path) ti1 = CGATS.CGATS(ti3_to_ti1(profile.tags.get("CIED", "") or profile.tags.get("targ", ""))) ti1.filename = filename + ".ti1" ti1.fix_device_values_scaling() try: ti1_1 = verify_cgats(ti1, ("RGB_R", "RGB_B", "RGB_G")) except CGATS.CGATSError, exception: msg = {CGATS.CGATSKeyError: lang.getstr("error.testchart.missing_fields", (path, "RGB_R, RGB_G, RGB_B"))}.get(exception.__class__, lang.getstr("error.testchart.invalid", path) + "\n" + lang.getstr(safe_unicode(exception))) return Error(msg) else: try: verify_cgats(ti1, ("XYZ_X", "XYZ_Y", "XYZ_Z")) except CGATS.CGATSKeyError: # Missing XYZ, add via simple sRGB-like model data = ti1_1.queryv1("DATA") data.parent.DATA_FORMAT.add_data(("XYZ_X", "XYZ_Y", "XYZ_Z")) for sample in data.itervalues(): XYZ = argyll_RGB2XYZ(*[sample["RGB_" + channel] / 100.0 for channel in "RGB"]) for i, component in enumerate("XYZ"): sample["XYZ_" + component] = XYZ[i] * 100 else: if ext.lower() not in (".ti1", ".ti2") and ti1_1: ti1_1.add_keyword("ACCURATE_EXPECTED_VALUES", "true") ti1.root.setmodified(False) self.ti1 = ti1 except Exception, exception: return Error(lang.getstr("error.testchart.read", path) + "\n\n" + safe_unicode(exception)) white_patches = self.ti1.queryv1("WHITE_COLOR_PATCHES") or None black_patches = self.ti1.queryv1("BLACK_COLOR_PATCHES") or None single_channel_patches = self.ti1.queryv1("SINGLE_DIM_STEPS") or None gray_patches = self.ti1.queryv1("COMP_GREY_STEPS") or None multi_bcc_steps = self.ti1.queryv1("MULTI_DIM_BCC_STEPS") or 0 multi_steps = self.ti1.queryv1("MULTI_DIM_STEPS") or multi_bcc_steps fullspread_patches = self.ti1.queryv1("NUMBER_OF_SETS") gamma = self.ti1.queryv1("EXTRA_DEV_POW") or 1.0 dark_emphasis = ((self.ti1.queryv1("DARK_REGION_EMPHASIS") or 1.0) - 1.0) / 3.0 if None in (white_patches, single_channel_patches, gray_patches, multi_steps): if None in (single_channel_patches, gray_patches, multi_steps): white_patches = 0 black_patches = 0 R = [] G = [] B = [] gray_channel = [0] data = self.ti1.queryv1("DATA") multi = { "R": [], "G": [], "B": [] } if multi_steps is None: multi_steps = 0 uniqueRGB = [] vmaxlen = 4 for i in data: if self.worker.thread_abort: return False # XXX Note that round(50 * 2.55) = 127, but # round(50 / 100 * 255) = 128 (the latter is what we want)! patch = [round(v / 100.0 * 255, vmaxlen) for v in (data[i]["RGB_R"], data[i]["RGB_G"], data[i]["RGB_B"])] # normalize to 0...255 range strpatch = [str(int(round(round(v, 1)))) for v in patch] if patch[0] == patch[1] == patch[2] == 255: # white white_patches += 1 if 255 not in gray_channel: gray_channel.append(255) elif patch[0] == patch[1] == patch[2] == 0: # black black_patches += 1 if 0 not in R and 0 not in G and 0 not in B: R.append(0) G.append(0) B.append(0) if 0 not in gray_channel: gray_channel.append(0) elif patch[2] == patch[1] == 0 and patch[0] not in R: # red R.append(patch[0]) elif patch[0] == patch[2] == 0 and patch[1] not in G: # green G.append(patch[1]) elif patch[0] == patch[1] == 0 and patch[2] not in B: # blue B.append(patch[2]) elif patch[0] == patch[1] == patch[2]: # gray if patch[0] not in gray_channel: gray_channel.append(patch[0]) elif multi_steps == 0: multi_steps = None if debug >= 9: safe_print("[D]", strpatch) if strpatch not in uniqueRGB: uniqueRGB.append(strpatch) if patch[0] not in multi["R"]: multi["R"].append(patch[0]) if patch[1] not in multi["G"]: multi["G"].append(patch[1]) if patch[2] not in multi["B"]: multi["B"].append(patch[2]) if single_channel_patches is None: single_channel_patches = min(len(R), len(G), len(B)) if gray_patches is None: gray_patches = len(gray_channel) if multi_steps is None: multi_steps = 0 if single_channel_patches is None: # NEVER (old code, needs work for demphasis/gamma, remove?) R_inc = self.tc_get_increments(R, vmaxlen) G_inc = self.tc_get_increments(G, vmaxlen) B_inc = self.tc_get_increments(B, vmaxlen) if debug: safe_print("[D] R_inc:") for i in R_inc: if self.worker.thread_abort: return False safe_print("[D] %s: x%s" % (i, R_inc[i])) safe_print("[D] G_inc:") for i in G_inc: if self.worker.thread_abort: return False safe_print("[D] %s: x%s" % (i, G_inc[i])) safe_print("[D] B_inc:") for i in B_inc: if self.worker.thread_abort: return False safe_print("[D] %s: x%s" % (i, B_inc[i])) RGB_inc = {"0": 0} for inc in R_inc: if self.worker.thread_abort: return False if inc in G_inc and inc in B_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = R_inc[inc] for inc in G_inc: if self.worker.thread_abort: return False if inc in R_inc and inc in B_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = G_inc[inc] for inc in B_inc: if self.worker.thread_abort: return False if inc in R_inc and inc in G_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = B_inc[inc] if False: RGB_inc_max = max(RGB_inc.values()) if RGB_inc_max > 0: single_channel_patches = RGB_inc_max + 1 else: single_channel_patches = 0 else: single_inc = {"0": 0} for inc in RGB_inc: if self.worker.thread_abort: return False if inc != "0": finc = float(inc) n = int(round(float(str(255.0 / finc)))) finc = 255.0 / n n += 1 if debug >= 9: safe_print("[D] inc:", inc) safe_print("[D] n:", n) for i in range(n): if self.worker.thread_abort: return False v = str(int(round(float(str(i * finc))))) if debug >= 9: safe_print("[D] Searching for", v) if [v, "0", "0"] in uniqueRGB and ["0", v, "0"] in uniqueRGB and ["0", "0", v] in uniqueRGB: if not inc in single_inc: single_inc[inc] = 0 single_inc[inc] += 1 else: if debug >= 9: safe_print("[D] Not found!") break single_channel_patches = max(single_inc.values()) if debug: safe_print("[D] single_channel_patches:", single_channel_patches) if 0 in R + G + B: fullspread_patches += 3 # black in single channel patches elif single_channel_patches >= 2: fullspread_patches += 3 # black always in SINGLE_DIM_STEPS if gray_patches is None: # NEVER (old code, needs work for demphasis/gamma, remove?) RGB_inc = self.tc_get_increments(gray_channel, vmaxlen) if debug: safe_print("[D] RGB_inc:") for i in RGB_inc: if self.worker.thread_abort: return False safe_print("[D] %s: x%s" % (i, RGB_inc[i])) if False: RGB_inc_max = max(RGB_inc.values()) if RGB_inc_max > 0: gray_patches = RGB_inc_max + 1 else: gray_patches = 0 else: gray_inc = {"0": 0} for inc in RGB_inc: if self.worker.thread_abort: return False if inc != "0": finc = float(inc) n = int(round(float(str(255.0 / finc)))) finc = 255.0 / n n += 1 if debug >= 9: safe_print("[D] inc:", inc) safe_print("[D] n:", n) for i in range(n): if self.worker.thread_abort: return False v = str(int(round(float(str(i * finc))))) if debug >= 9: safe_print("[D] Searching for", v) if [v, v, v] in uniqueRGB: if not inc in gray_inc: gray_inc[inc] = 0 gray_inc[inc] += 1 else: if debug >= 9: safe_print("[D] Not found!") break gray_patches = max(gray_inc.values()) if debug: safe_print("[D] gray_patches:", gray_patches) if 0 in gray_channel: fullspread_patches += 1 # black in gray patches if 255 in gray_channel: fullspread_patches += 1 # white in gray patches elif gray_patches >= 2: fullspread_patches += 2 # black and white always in COMP_GREY_STEPS if multi_steps is None: # NEVER (old code, needs work for demphasis/gamma, remove?) R_inc = self.tc_get_increments(multi["R"], vmaxlen) G_inc = self.tc_get_increments(multi["G"], vmaxlen) B_inc = self.tc_get_increments(multi["B"], vmaxlen) RGB_inc = {"0": 0} for inc in R_inc: if self.worker.thread_abort: return False if inc in G_inc and inc in B_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = R_inc[inc] for inc in G_inc: if self.worker.thread_abort: return False if inc in R_inc and inc in B_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = G_inc[inc] for inc in B_inc: if self.worker.thread_abort: return False if inc in R_inc and inc in G_inc and R_inc[inc] == G_inc[inc] == B_inc[inc]: RGB_inc[inc] = B_inc[inc] if debug: safe_print("[D] RGB_inc:") for i in RGB_inc: if self.worker.thread_abort: return False safe_print("[D] %s: x%s" % (i, RGB_inc[i])) multi_inc = {"0": 0} for inc in RGB_inc: if self.worker.thread_abort: return False if inc != "0": finc = float(inc) n = int(round(float(str(255.0 / finc)))) finc = 255.0 / n n += 1 if debug >= 9: safe_print("[D] inc:", inc) safe_print("[D] n:", n) for i in range(n): if self.worker.thread_abort: return False r = str(int(round(float(str(i * finc))))) for j in range(n): if self.worker.thread_abort: return False g = str(int(round(float(str(j * finc))))) for k in range(n): if self.worker.thread_abort: return False b = str(int(round(float(str(k * finc))))) if debug >= 9: safe_print("[D] Searching for", i, j, k, [r, g, b]) if [r, g, b] in uniqueRGB: if not inc in multi_inc: multi_inc[inc] = 0 multi_inc[inc] += 1 else: if debug >= 9: safe_print("[D] Not found! (b loop)") break if [r, g, b] not in uniqueRGB: if debug >= 9: safe_print("[D] Not found! (g loop)") break if [r, g, b] not in uniqueRGB: if debug >= 9: safe_print("[D] Not found! (r loop)") break multi_patches = max(multi_inc.values()) multi_steps = int(float(str(math.pow(multi_patches, 1 / 3.0)))) if debug: safe_print("[D] multi_patches:", multi_patches) safe_print("[D] multi_steps:", multi_steps) elif multi_steps >= 2: fullspread_patches += 2 # black and white always in MULTI_DIM_STEPS else: white_patches = len(self.ti1[0].queryi({"RGB_R": 100, "RGB_G": 100, "RGB_B": 100})) black_patches = len(self.ti1[0].queryi({"RGB_R": 0, "RGB_G": 0, "RGB_B": 0})) if single_channel_patches >= 2: fullspread_patches += 3 # black always in SINGLE_DIM_STEPS if gray_patches >= 2: fullspread_patches += 2 # black and white always in COMP_GREY_STEPS if multi_steps >= 2: fullspread_patches += 2 # black and white always in MULTI_DIM_STEPS fullspread_patches -= white_patches if self.worker.argyll_version >= [1, 6]: fullspread_patches -= black_patches fullspread_patches -= single_channel_patches * 3 fullspread_patches -= gray_patches fullspread_patches -= int(float(str(math.pow(multi_steps, 3)))) - single_channel_patches * 3 return (white_patches, black_patches, single_channel_patches, gray_patches, multi_steps, multi_bcc_steps, fullspread_patches, gamma, dark_emphasis) def tc_load_cfg_from_ti1_finish(self, result): self.worker.wrapup(False) if isinstance(result, tuple): # UGLY HACK: This 'safe_print' call fixes a GTK assertion and # segfault under Arch Linux when setting the window title safe_print("") self.SetTitle(lang.getstr("testchart.edit").rstrip(".") + ": " + os.path.basename(self.ti1.filename)) safe_print(lang.getstr("success")) (white_patches, black_patches, single_channel_patches, gray_patches, multi_steps, multi_bcc_steps, fullspread_patches, gamma, dark_emphasis) = result fullspread_ba = { "ERROR_OPTIMISED_PATCHES": "", # OFPS in older Argyll CMS versions #"ERROR_OPTIMISED_PATCHES": "R", # Perc. space random - same keyword as OFPS in older Argyll CMS versions, don't use "IFP_PATCHES": "t", # Inc. far point "INC_FAR_PATCHES": "t", # Inc. far point in older Argyll CMS versions "OFPS_PATCHES": "", # OFPS "RANDOM_DEVICE_PATCHES": "r", # Dev. space random "RANDOM_PATCHES": "r", # Dev. space random in older Argyll CMS versions "RANDOM_PERCEPTUAL_PATCHES": "R", # Perc. space random #"RANDOM_PERCEPTUAL_PATCHES": "Q", # Perc. space filling quasi-random - same keyword as perc. space random, don't use "SIMPLEX_DEVICE_PATCHES": "i", # Dev. space body centered cubic grid "SIMPLEX_PERCEPTUAL_PATCHES": "I", # Perc. space body centered cubic grid "SPACEFILING_RANDOM_PATCHES": "q", # Device space filling quasi-random, typo in older Argyll CMS versions "SPACEFILLING_RANDOM_PATCHES": "q", # Device space filling quasi-random } algo = None for key in fullspread_ba.keys(): if self.ti1.queryv1(key) > 0: algo = fullspread_ba[key] break if white_patches != None: setcfg("tc_white_patches", white_patches) if black_patches != None: setcfg("tc_black_patches", black_patches) if single_channel_patches != None: setcfg("tc_single_channel_patches", single_channel_patches) if gray_patches != None: setcfg("tc_gray_patches", gray_patches) if multi_steps != None: setcfg("tc_multi_steps", multi_steps) if multi_bcc_steps != None: setcfg("tc_multi_bcc_steps", multi_bcc_steps) setcfg("tc_fullspread_patches", self.ti1.queryv1("NUMBER_OF_SETS") - self.tc_get_total_patches(white_patches, black_patches, single_channel_patches, gray_patches, multi_steps, multi_bcc_steps, 0)) if gamma != None: setcfg("tc_gamma", gamma) if dark_emphasis != None: setcfg("tc_dark_emphasis", dark_emphasis) if algo != None: setcfg("tc_algo", algo) self.writecfg() self.tc_update_controls() self.tc_preview(True) return True else: safe_print(lang.getstr("aborted")) if self.Parent and hasattr(self.Parent, "start_timers"): self.Parent.start_timers() if isinstance(result, Exception): show_result_dialog(result, self) def tc_get_increments(self, channel, vmaxlen = 4): channel.sort() increments = {"0": 0} for i, v in enumerate(channel): for j in reversed(xrange(i, len(channel))): inc = round(float(str(channel[j] - v)), vmaxlen) if inc > 0: inc = str(inc) if not inc in increments: increments[inc] = 0 increments[inc] += 1 return increments def tc_create(self, gray=False, multidim=False, single=False): """ Create testchart using targen. Setting gray, multidim or single to True will ad those patches in a separate step if any number of iterative patches are to be generated as well. """ self.writecfg() fullspread_patches = getcfg("tc_fullspread_patches") white_patches = getcfg("tc_white_patches") black_patches = getcfg("tc_black_patches") single_patches = getcfg("tc_single_channel_patches") gray_patches = getcfg("tc_gray_patches") multidim_patches = getcfg("tc_multi_steps") multidim_bcc_patches = getcfg("tc_multi_bcc_steps") extra_args = getcfg("extra_args.targen") result = True fixed_ti1 = None if fullspread_patches > 0 and (gray or multidim or single): # Generate fixed points first so they don't punch "holes" into the # OFPS distribution setcfg("tc_white_patches", 0) setcfg("tc_black_patches", 0) if not single: setcfg("tc_single_channel_patches", 0) if not gray: setcfg("tc_gray_patches", 0) if not multidim: setcfg("tc_multi_steps", 0) setcfg("tc_multi_bcc_steps", 0) setcfg("tc_fullspread_patches", 0) setcfg("extra_args.targen", "") result = self.tc_create_ti1() if fullspread_patches > 0 and (gray or multidim or single): setcfg("tc_white_patches", white_patches) setcfg("tc_black_patches", black_patches) if single: setcfg("tc_single_channel_patches", 2) else: setcfg("tc_single_channel_patches", single_patches) if gray: setcfg("tc_gray_patches", 2) else: setcfg("tc_gray_patches", gray_patches) if multidim: setcfg("tc_multi_steps", 2) setcfg("tc_multi_bcc_steps", 0) else: setcfg("tc_multi_steps", multidim_patches) setcfg("tc_multi_bcc_steps", multidim_bcc_patches) setcfg("tc_fullspread_patches", fullspread_patches) setcfg("extra_args.targen", extra_args) fixed_ti1 = result if not isinstance(result, Exception) and result: result = self.tc_create_ti1() if isinstance(result, CGATS.CGATS): if fixed_ti1: if gray: result[0].add_keyword("COMP_GREY_STEPS", gray_patches) if multidim: result[0].add_keyword("MULTI_DIM_STEPS", multidim_patches) if multidim_bcc_patches: result[0].add_keyword("MULTI_DIM_BCC_STEPS", multidim_bcc_patches) if single: result[0].add_keyword("SINGLE_DIM_STEPS", single_patches) fixed_data = fixed_ti1.queryv1("DATA") data = result.queryv1("DATA") data_format = result.queryv1("DATA_FORMAT") # Get only RGB data data.parent.DATA_FORMAT = CGATS.CGATS() data.parent.DATA_FORMAT.key = "DATA_FORMAT" data.parent.DATA_FORMAT.parent = data data.parent.DATA_FORMAT.root = data.root data.parent.DATA_FORMAT.type = "DATA_FORMAT" for i, label in enumerate(("RGB_R", "RGB_G", "RGB_B")): data.parent.DATA_FORMAT[i] = label fixed_data.parent.DATA_FORMAT = data.parent.DATA_FORMAT rgbdata = str(data) # Restore DATA_FORMAT data.parent.DATA_FORMAT = data_format # Collect all fixed point datasets not in data fixed_data.vmaxlen = data.vmaxlen fixed_datasets = [] for i, dataset in fixed_data.iteritems(): if not str(dataset) in rgbdata: fixed_datasets.append(dataset) if fixed_datasets: # Insert fixed point datasets after first patch data.moveby1(1, len(fixed_datasets)) for i, dataset in enumerate(fixed_datasets): dataset.key = i + 1 dataset.parent = data dataset.root = data.root data[dataset.key] = dataset self.ti1 = result setcfg("tc_single_channel_patches", single_patches) setcfg("tc_gray_patches", gray_patches) setcfg("tc_multi_steps", multidim_patches) setcfg("tc_multi_bcc_steps", multidim_bcc_patches) return result def tc_create_ti1(self): cmd, args = self.worker.prepare_targen() if not isinstance(cmd, Exception): result = self.worker.exec_cmd(cmd, args, low_contrast = False, skip_scripts = True, silent = False, parent = self) else: result = cmd if not isinstance(result, Exception) and result: if not isinstance(result, Exception): path = os.path.join(self.worker.tempdir, "temp.ti1") result = check_file_isfile(path, silent = False) if not isinstance(result, Exception) and result: try: result = CGATS.CGATS(path) safe_print(lang.getstr("success")) except Exception, exception: result = Error(u"Error - testchart file could not be read: " + safe_unicode(exception)) else: result.filename = None self.worker.wrapup(False) return result def tc_preview(self, result, path=None): self.tc_check() if isinstance(result, Exception): show_result_dialog(result, self) elif result: if not hasattr(self, "separator"): # We add this here because of a wxGTK 2.8 quirk where the # vertical scrollbar otherwise has a 1px horizontal # line at the top otherwise. separator_color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW) self.separator = wx.Panel(self.panel, size=(-1, 1)) self.separator.BackgroundColour = separator_color index = len(self.sizer.Children) - 1 if (sys.platform not in ("darwin", "win32") or tc_use_alternate_preview): index -= 1 self.sizer.Insert(index, self.separator, flag=wx.EXPAND) else: self.separator.Show() self.sizer.Layout() if verbose >= 1: safe_print(lang.getstr("tc.preview.create")) data = self.ti1.queryv1("DATA") modified = self.ti1.modified data.vmaxlen = 6 self.ti1.modified = modified if hasattr(self, "preview"): self.preview.BeginBatch() w = self.grid.GetDefaultRowSize() numcols = (self.sizer.Size[0] - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X)) / w self.preview.AppendCols(numcols) for i in xrange(numcols): self.preview.SetColLabelValue(i, str(i + 1)) grid = self.grid grid.BeginBatch() data_format = self.ti1.queryv1("DATA_FORMAT") for i in data_format: if data_format[i] in ("RGB_R", "RGB_G", "RGB_B"): grid.AppendCols(1) grid.SetColLabelValue(grid.GetNumberCols() - 1, data_format[i].split("_")[-1] + " %") grid.AppendCols(1) grid.SetColLabelValue(grid.GetNumberCols() - 1, "") grid.SetColSize(grid.GetNumberCols() - 1, self.grid.GetDefaultRowSize()) self.tc_amount = self.ti1.queryv1("NUMBER_OF_SETS") grid.AppendRows(self.tc_amount) dc = wx.MemoryDC(wx.EmptyBitmap(1, 1)) dc.SetFont(grid.GetLabelFont()) w, h = dc.GetTextExtent("99%s" % self.ti1.queryv1("NUMBER_OF_SETS")) grid.SetRowLabelSize(max(w, grid.GetDefaultRowSize())) attr = wx.grid.GridCellAttr() attr.SetAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) attr.SetReadOnly() grid.SetColAttr(grid.GetNumberCols() - 1, attr) for i in data: sample = data[i] for j in range(grid.GetNumberCols()): label = self.label_b2a.get(grid.GetColLabelValue(j)) if label in ("RGB_R", "RGB_G", "RGB_B"): grid.SetCellValue(i, j, CGATS.rpad(sample[label], data.vmaxlen + (1 if sample[label] < 0 else 0))) self.tc_grid_setcolorlabel(i, data) self.tc_preview_update(0) if hasattr(self, "preview"): w, h = dc.GetTextExtent("99%s" % self.preview.GetNumberRows()) self.preview.SetRowLabelSize(max(w, grid.GetDefaultRowSize())) self.preview.EndBatch() self.tc_set_default_status() if verbose >= 1: safe_print(lang.getstr("success")) self.resize_grid() grid.EndBatch() if path: wx.CallAfter(self.tc_save_as_handler, path=path) if self.Parent and hasattr(self.Parent, "start_timers"): self.Parent.start_timers() def tc_add_data(self, row, newdata): self.grid.BeginBatch() self.grid.InsertRows(row + 1, len(newdata)) data = self.ti1.queryv1("DATA") if hasattr(self, "preview"): self.preview.BeginBatch() data_format = self.ti1.queryv1("DATA_FORMAT") data.moveby1(row + 1, len(newdata)) for i in xrange(len(newdata)): dataset = CGATS.CGATS() for label in data_format.itervalues(): if not label in newdata[i]: newdata[i][label] = 0.0 dataset[label] = newdata[i][label] dataset.key = row + 1 + i dataset.parent = data dataset.root = data.root dataset.type = 'SAMPLE' data[dataset.key] = dataset for label in ("RGB_R", "RGB_G", "RGB_B"): for col in range(self.grid.GetNumberCols()): if self.label_b2a.get(self.grid.GetColLabelValue(col)) == label: sample = newdata[i] self.grid.SetCellValue(row + 1 + i, col, CGATS.rpad(sample[label], data.vmaxlen + (1 if sample[label] < 0 else 0))) self.tc_grid_setcolorlabel(row + 1 + i, data) self.tc_preview_update(row + 1) self.tc_amount = self.ti1.queryv1("NUMBER_OF_SETS") dc = wx.MemoryDC(wx.EmptyBitmap(1, 1)) dc.SetFont(self.grid.GetLabelFont()) w, h = dc.GetTextExtent("99%s" % self.tc_amount) self.grid.SetRowLabelSize(max(w, self.grid.GetDefaultRowSize())) self.resize_grid() self.grid.EndBatch() self.tc_set_default_status() self.tc_save_check() if hasattr(self, "preview"): self.preview.EndBatch() def tc_grid_setcolorlabel(self, row, data=None): grid = self.grid col = grid.GetNumberCols() - 1 if data is None: data = self.ti1.queryv1("DATA") sample = data[row] style, colour, labeltext, labelcolour = self.tc_getcolorlabel(sample) grid.SetCellBackgroundColour(row, col, colour) grid.SetCellValue(row, col, labeltext) if labelcolour: grid.SetCellTextColour(row, col, labelcolour) self.grid.Refresh() if hasattr(self, "preview"): style, colour, labeltext, labelcolour = self.tc_getcolorlabel(sample) numcols = self.preview.GetNumberCols() row = sample.key / numcols col = sample.key % numcols if row > self.preview.GetNumberRows() - 1: self.preview.AppendRows(1) self.preview.SetCellBackgroundColour(row, col, colour) self.preview.SetCellValue(row, col, labeltext) if labelcolour: self.preview.SetCellTextColour(row, col, labelcolour) self.preview.Refresh() def tc_getcolorlabel(self, sample): colour = wx.Colour(*[int(round(value / 100.0 * 255)) for value in (sample.RGB_R, sample.RGB_G, sample.RGB_B)]) # mark patches: # W = white (R/G/B == 100) # K = black (R/G/B == 0) # k = light black (R == G == B > 0) # R = red # r = light red (R == 100 and G/B > 0) # G = green # g = light green (G == 100 and R/B > 0) # B = blue # b = light blue (B == 100 and R/G > 0) # C = cyan # c = light cyan (G/B == 100 and R > 0) # M = magenta # m = light magenta (R/B == 100 and G > 0) # Y = yellow # y = light yellow (R/G == 100 and B > 0) # border = 50% value style = wx.NO_BORDER if sample.RGB_R == sample.RGB_G == sample.RGB_B: # Neutral / black / white if sample.RGB_R < 50: labelcolour = wx.Colour(255, 255, 255) else: if sample.RGB_R == 50: style = wx.SIMPLE_BORDER labelcolour = wx.Colour(0, 0, 0) if sample.RGB_R <= 50: labeltext = "K" elif sample.RGB_R == 100: labeltext = "W" else: labeltext = "k" elif (sample.RGB_G == 0 and sample.RGB_B == 0) or (sample.RGB_R == 100 and sample.RGB_G == sample.RGB_B): # Red if sample.RGB_R > 75: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_R == 50: style = wx.SIMPLE_BORDER if sample.RGB_R == 100 and sample.RGB_G > 0: labeltext = "r" else: labeltext = "R" elif (sample.RGB_R == 0 and sample.RGB_B == 0) or (sample.RGB_G == 100 and sample.RGB_R == sample.RGB_B): # Green if sample.RGB_G > 75: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_G == 50: style = wx.SIMPLE_BORDER if sample.RGB_G == 100 and sample.RGB_R > 0: labeltext = "g" else: labeltext = "G" elif (sample.RGB_R == 0 and sample.RGB_G == 0) or (sample.RGB_B == 100 and sample.RGB_R == sample.RGB_G): # Blue if sample.RGB_R > 25: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_B == 50: style = wx.SIMPLE_BORDER if sample.RGB_B == 100 and sample.RGB_R > 0: labeltext = "b" else: labeltext = "B" elif (sample.RGB_R == 0 or sample.RGB_B == 100) and sample.RGB_G == sample.RGB_B: # Cyan if sample.RGB_G > 75: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_G == 50: style = wx.SIMPLE_BORDER if sample.RGB_G == 100 and sample.RGB_R > 0: labeltext = "c" else: labeltext = "C" elif (sample.RGB_G == 0 or sample.RGB_R == 100) and sample.RGB_R == sample.RGB_B: # Magenta if sample.RGB_R > 75: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_R == 50: style = wx.SIMPLE_BORDER if sample.RGB_R == 100 and sample.RGB_G > 0: labeltext = "m" else: labeltext = "M" elif (sample.RGB_B == 0 or sample.RGB_G == 100) and sample.RGB_R == sample.RGB_G: # Yellow if sample.RGB_G > 75: labelcolour = wx.Colour(0, 0, 0) else: labelcolour = wx.Colour(255, 255, 255) if sample.RGB_R == 100 and sample.RGB_G == 50: style = wx.SIMPLE_BORDER if sample.RGB_B > 0: labeltext = "y" else: labeltext = "Y" else: labeltext = "" labelcolour = None return style, colour, labeltext, labelcolour def tc_set_default_status(self, event = None): if hasattr(self, "tc_amount"): statustxt = "%s: %s" % (lang.getstr("tc.patches.total"), self.tc_amount) sel = self.grid.GetSelectionRows() if sel: statustxt += " / %s: %s" % (lang.getstr("tc.patches.selected"), len(sel)) index = self.grid.GetGridCursorRow() if index > -1: colour = self.grid.GetCellBackgroundColour(index, 3) patchinfo = u" \u2014 %s %s: R=%s G=%s B=%s" % (lang.getstr("tc.patch"), index + 1, colour[0], colour[1], colour[2]) statustxt += patchinfo self.SetStatusText(statustxt) def tc_mouseclick_handler(self, event): if not getattr(self, "ti1", None): return index = event.Row * self.preview.GetNumberCols() + event.Col if index > self.ti1.queryv1("NUMBER_OF_SETS") - 1: return self.grid.select_row(index, event.ShiftDown(), event.ControlDown() or event.CmdDown()) return def tc_delete_rows(self, rows): self.grid.BeginBatch() if hasattr(self, "preview"): self.preview.BeginBatch() rows.sort() rows.reverse() data = self.ti1.queryv1("DATA") # Optimization: Delete consecutive rows in least number of operations consecutive = [] rows.append(-1) for row in rows: if row == -1 or (consecutive and consecutive[-1] != row + 1): self.grid.DeleteRows(consecutive[-1], len(consecutive)) if consecutive[0] != len(data) - 1: data.moveby1(consecutive[-1] + len(consecutive), -len(consecutive)) for crow in consecutive: dict.pop(data, len(data) - 1) consecutive = [] consecutive.append(row) rows.pop() if hasattr(self, "preview"): self.tc_preview_update(rows[-1]) data.setmodified() self.tc_amount = self.ti1.queryv1("NUMBER_OF_SETS") row = min(rows[-1], self.grid.GetNumberRows() - 1) self.grid.SelectRow(row) self.grid.SetGridCursor(row, 0) self.grid.MakeCellVisible(row, 0) self.grid.EndBatch() self.tc_save_check() if hasattr(self, "preview"): self.preview.EndBatch() self.tc_set_default_status() def view_3d_format_popup(self, event): menu = wx.Menu() item_selected = False for file_format in config.valid_values["3d.format"]: item = menu.AppendRadioItem(-1, file_format) item.Check(file_format == getcfg("3d.format")) self.Bind(wx.EVT_MENU, self.view_3d_format_handler, id=item.Id) self.PopupMenu(menu) for item in menu.MenuItems: self.Unbind(wx.EVT_MENU, id=item.Id) menu.Destroy() def view_3d_format_handler(self, event): for item in event.EventObject.MenuItems: if item.IsChecked(): setcfg("3d.format", item.GetItemLabelText()) self.tc_view_3d(None) def writecfg(self): if self.Parent: writecfg() else: writecfg(module="testchart-editor", options=("3d_format", "last_ti1_path", "last_testchart_export_path", "last_vrml_path", "position.tcgen", "size.tcgen", "tc.", "tc_")) def main(): config.initcfg("testchart-editor") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = TestchartEditor(setup=False) if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() app.TopWindow.setup(path=False) app.process_argv(1) or app.TopWindow.tc_load_cfg_from_ti1() app.TopWindow.Show() if __name__ == "__main__": main() DisplayCAL-3.5.0.0/DisplayCAL/wxUntetheredFrame.py0000644000076500000000000006472713230502025021446 0ustar devwheel00000000000000# -*- coding: UTF-8 -*- """ Interactive display calibration UI """ import math import os import re import sys import time from wxaddons import wx from config import (getbitmap, getcfg, geticon, get_data_path, get_icon_bundle, setcfg) from log import get_file_logger, safe_print from meta import name as appname from options import debug, test, verbose from wxwindows import (BaseApp, BaseFrame, BitmapBackgroundPanel, CustomCheckBox, CustomGrid, FlatShadedButton, numpad_keycodes, nav_keycodes, processing_keycodes, wx_Panel) import CGATS import audio import colormath import config import localization as lang BGCOLOUR = wx.Colour(0x33, 0x33, 0x33) FGCOLOUR = wx.Colour(0x99, 0x99, 0x99) class UntetheredFrame(BaseFrame): def __init__(self, parent=None, handler=None, keyhandler=None, start_timer=True): BaseFrame.__init__(self, parent, wx.ID_ANY, lang.getstr("measurement.untethered"), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL, name="untetheredframe") self.SetIcons(get_icon_bundle([256, 48, 32, 16], appname)) self.sizer = wx.FlexGridSizer(2, 1, 0, 0) self.sizer.AddGrowableCol(0) self.sizer.AddGrowableRow(0) self.sizer.AddGrowableRow(1) self.panel = wx_Panel(self) self.SetSizer(self.sizer) self.sizer.Add(self.panel, 1, wx.EXPAND) self.panel.SetBackgroundColour(BGCOLOUR) panelsizer = wx.FlexGridSizer(3, 2, 8, 8) panelsizer.AddGrowableCol(0) panelsizer.AddGrowableCol(1) panelsizer.AddGrowableRow(1) self.panel.SetSizer(panelsizer) self.label_RGB = wx.StaticText(self.panel, wx.ID_ANY, " ") self.label_RGB.SetForegroundColour(FGCOLOUR) panelsizer.Add(self.label_RGB, 0, wx.TOP | wx.LEFT | wx.EXPAND, border=8) self.label_XYZ = wx.StaticText(self.panel, wx.ID_ANY, " ") self.label_XYZ.SetForegroundColour(FGCOLOUR) panelsizer.Add(self.label_XYZ, 0, wx.TOP | wx.RIGHT | wx.EXPAND, border=8) if sys.platform == "darwin": style = wx.BORDER_THEME else: style = wx.BORDER_SIMPLE self.panel_RGB = BitmapBackgroundPanel(self.panel, size=(256, 256), style=style) self.panel_RGB.scalebitmap = (True, True) self.panel_RGB.SetBitmap(getbitmap("theme/checkerboard-32x32x5-333-444")) panelsizer.Add(self.panel_RGB, 1, wx.LEFT | wx.EXPAND, border=8) self.panel_XYZ = BitmapBackgroundPanel(self.panel, size=(256, 256), style=style) self.panel_XYZ.scalebitmap = (True, True) self.panel_XYZ.SetBitmap(getbitmap("theme/checkerboard-32x32x5-333-444")) panelsizer.Add(self.panel_XYZ, 1, wx.RIGHT | wx.EXPAND, border=8) sizer = wx.BoxSizer(wx.HORIZONTAL) self.back_btn = FlatShadedButton(self.panel, bitmap=geticon(10, "back"), label="", fgcolour=FGCOLOUR) self.back_btn.Bind(wx.EVT_BUTTON, self.back_btn_handler) sizer.Add(self.back_btn, 0, wx.LEFT | wx.RIGHT, border=8) self.label_index = wx.StaticText(self.panel, wx.ID_ANY, " ") self.label_index.SetForegroundColour(FGCOLOUR) sizer.Add(self.label_index, 0, wx.ALIGN_CENTER_VERTICAL) self.next_btn = FlatShadedButton(self.panel, bitmap=geticon(10, "play"), label="", fgcolour=FGCOLOUR) self.next_btn.Bind(wx.EVT_BUTTON, self.next_btn_handler) sizer.Add(self.next_btn, 0, wx.LEFT, border=8) sizer.Add((12, 1), 1) self.measure_auto_cb = CustomCheckBox(self.panel, wx.ID_ANY, lang.getstr("auto")) self.measure_auto_cb.SetForegroundColour(FGCOLOUR) self.measure_auto_cb.Bind(wx.EVT_CHECKBOX, self.measure_auto_ctrl_handler) sizer.Add(self.measure_auto_cb, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT) panelsizer.Add(sizer, 0, wx.BOTTOM | wx.EXPAND, border=8) sizer = wx.BoxSizer(wx.HORIZONTAL) self.measure_btn = FlatShadedButton(self.panel, bitmap=geticon(10, "play"), label=lang.getstr("measure"), fgcolour=FGCOLOUR) self.measure_btn.Bind(wx.EVT_BUTTON, self.measure_btn_handler) sizer.Add(self.measure_btn, 0, wx.RIGHT, border=6) # Sound when measuring # Needs to be stereo! self.measurement_sound = audio.Sound(get_data_path("beep.wav")) self.commit_sound = audio.Sound(get_data_path("camera_shutter.wav")) if getcfg("measurement.play_sound"): bitmap = geticon(16, "sound_volume_full") else: bitmap = geticon(16, "sound_off") self.sound_on_off_btn = FlatShadedButton(self.panel, bitmap=bitmap, fgcolour=FGCOLOUR) self.sound_on_off_btn.SetToolTipString(lang.getstr("measurement.play_sound")) self.sound_on_off_btn.Bind(wx.EVT_BUTTON, self.measurement_play_sound_handler) sizer.Add(self.sound_on_off_btn, 0) sizer.Add((12, 1), 1) self.finish_btn = FlatShadedButton(self.panel, label=lang.getstr("finish"), fgcolour=FGCOLOUR) self.finish_btn.Bind(wx.EVT_BUTTON, self.finish_btn_handler) sizer.Add(self.finish_btn, 0, wx.RIGHT, border=8) panelsizer.Add(sizer, 0, wx.BOTTOM | wx.EXPAND, border=8) self.grid = CustomGrid(self, -1, size=(536, 256)) self.grid.DisableDragColSize() self.grid.DisableDragRowSize() self.grid.SetScrollRate(0, 5) self.grid.SetCellHighlightROPenWidth(0) self.grid.SetColLabelSize(self.grid.GetDefaultRowSize()) self.grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) self.grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) self.grid.draw_horizontal_grid_lines = False self.grid.draw_vertical_grid_lines = False self.grid.style = "" self.grid.CreateGrid(0, 9) self.grid.SetRowLabelSize(62) for i in xrange(9): if i in (3, 4): size = self.grid.GetDefaultRowSize() if i == 4: attr = wx.grid.GridCellAttr() attr.SetBackgroundColour(wx.Colour(0, 0, 0, 0)) self.grid.SetColAttr(i, attr) else: size = 62 self.grid.SetColSize(i, size) for i, label in enumerate(["R", "G", "B", "", "", "L*", "a*", "b*", ""]): self.grid.SetColLabelValue(i, label) self.grid.SetCellHighlightPenWidth(0) self.grid.SetDefaultCellBackgroundColour(self.grid.GetLabelBackgroundColour()) font = self.grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 self.grid.SetDefaultCellFont(font) self.grid.SetSelectionMode(wx.grid.Grid.wxGridSelectRows) self.grid.EnableEditing(False) self.grid.EnableGridLines(False) self.grid.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.grid_left_click_handler) self.grid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.grid_left_click_handler) self.sizer.Add(self.grid, 1, wx.EXPAND) self.Fit() self.SetMinSize(self.GetSize()) self.keyhandler = keyhandler if sys.platform == "darwin": # Use an accelerator table for tab, space, 0-9, A-Z, numpad, # navigation keys and processing keys keycodes = [wx.WXK_TAB, wx.WXK_SPACE] keycodes.extend(range(ord("0"), ord("9"))) keycodes.extend(range(ord("A"), ord("Z"))) keycodes.extend(numpad_keycodes) keycodes.extend(nav_keycodes) keycodes.extend(processing_keycodes) self.id_to_keycode = {} for keycode in keycodes: self.id_to_keycode[wx.NewId()] = keycode accels = [] for id, keycode in self.id_to_keycode.iteritems(): self.Bind(wx.EVT_MENU, self.key_handler, id=id) accels.append((wx.ACCEL_NORMAL, keycode, id)) if keycode == wx.WXK_TAB: accels.append((wx.ACCEL_SHIFT, keycode, id)) self.SetAcceleratorTable(wx.AcceleratorTable(accels)) else: self.Bind(wx.EVT_CHAR_HOOK, self.key_handler) self.Bind(wx.EVT_KEY_DOWN, self.key_handler) # Event handlers self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.Bind(wx.EVT_MOVE, self.OnMove, self) self.Bind(wx.EVT_SIZE, self.OnResize, self) self.timer = wx.Timer(self) if handler: self.Bind(wx.EVT_TIMER, handler, self.timer) self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy, self) # Final initialization steps for child in self.GetAllChildren(): if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and isinstance(child, wx.Panel)): # No need to enable double buffering under Linux and Mac OS X. # Under Windows, enabling double buffering on the panel seems # to work best to reduce flicker. child.SetDoubleBuffered(True) self.logger = get_file_logger("untethered") self._setup() self.Show() if start_timer: self.start_timer() def EndModal(self, returncode=wx.ID_OK): return returncode def MakeModal(self, makemodal=False): pass def OnClose(self, event): config.writecfg() if not self.timer.IsRunning(): self.Destroy() else: self.keepGoing = False def OnDestroy(self, event): self.stop_timer() del self.timer def OnMove(self, event): if self.IsShownOnScreen() and not self.IsIconized() and \ (not self.GetParent() or not self.GetParent().IsShownOnScreen()): prev_x = getcfg("position.progress.x") prev_y = getcfg("position.progress.y") x, y = self.GetScreenPosition() if x != prev_x or y != prev_y: setcfg("position.progress.x", x) setcfg("position.progress.y", y) def OnResize(self, event): wx.CallAfter(self.resize_grid) event.Skip() def Pulse(self, msg=""): if msg == lang.getstr("instrument.initializing"): self.label_RGB.SetLabel(msg) return self.keepGoing, False def Resume(self): self.keepGoing = True def UpdateProgress(self, value, msg=""): return self.Pulse(msg) def UpdatePulse(self, msg=""): return self.Pulse(msg) def back_btn_handler(self, event): if self.index > 0: self.update(self.index - 1) def enable_btns(self, enable=True, enable_measure_button=False): self.is_measuring = not enable and enable_measure_button self.back_btn.Enable(enable and self.index > 0) self.next_btn.Enable(enable and self.index < self.index_max) self.measure_btn._bitmap = geticon(10, {True: "play", False: "pause"}.get(enable)) self.measure_btn.Enable(enable or enable_measure_button) self.measure_btn.SetDefault() if self.measure_btn.Enabled and not isinstance(self.FindFocus(), (wx.Control, CustomGrid)): self.measure_btn.SetFocus() def finish_btn_handler(self, event): self.finish_btn.Disable() self.cgats[0].type = "CTI3" self.cgats[0].add_keyword("COLOR_REP", "RGB_XYZ") if self.white_XYZ[1] > 0: # Normalize to Y = 100 query = self.cgats[0].DATA for i in query: XYZ = query[i]["XYZ_X"], query[i]["XYZ_Y"], query[i]["XYZ_Z"] XYZ = [v / self.white_XYZ[1] * 100 for v in XYZ] query[i]["XYZ_X"], query[i]["XYZ_Y"], query[i]["XYZ_Z"] = XYZ normalized = "YES" else: normalized = "NO" self.cgats[0].add_keyword("NORMALIZED_TO_Y_100", normalized) self.cgats[0].add_keyword("DEVICE_CLASS", "DISPLAY") self.cgats[0].add_keyword("INSTRUMENT_TYPE_SPECTRAL", "NO") if hasattr(self.cgats[0], "APPROX_WHITE_POINT"): self.cgats[0].remove_keyword("APPROX_WHITE_POINT") # Remove L*a*b* from DATA_FORMAT if present for i, label in reversed(self.cgats[0].DATA_FORMAT.items()): if label.startswith("LAB_"): self.cgats[0].DATA_FORMAT.pop(i) # Add XYZ to DATA_FORMAT if not yet present for label in ("XYZ_X", "XYZ_Y", "XYZ_Z"): if not label in self.cgats[0].DATA_FORMAT.values(): self.cgats[0].DATA_FORMAT.add_data((label, )) self.cgats[0].write(os.path.splitext(self.cgats.filename)[0] + ".ti3") self.safe_send("Q") time.sleep(.5) self.safe_send("Q") def flush(self): pass def get_Lab_RGB(self): row = self.cgats[0].DATA[self.index] XYZ = row["XYZ_X"], row["XYZ_Y"], row["XYZ_Z"] self.last_XYZ = XYZ Lab = colormath.XYZ2Lab(*XYZ) if self.white_XYZ[1] > 0: XYZ = [v / self.white_XYZ[1] * 100 for v in XYZ] white_XYZ_Y100 = [v / self.white_XYZ[1] * 100 for v in self.white_XYZ] white_CCT = colormath.XYZ2CCT(*white_XYZ_Y100) if white_CCT: DXYZ = colormath.CIEDCCT2XYZ(white_CCT, scale=100.0) if DXYZ: white_CIEDCCT_Lab = colormath.XYZ2Lab(*DXYZ) PXYZ = colormath.planckianCT2XYZ(white_CCT, scale=100.0) if PXYZ: white_planckianCCT_Lab = colormath.XYZ2Lab(*PXYZ) white_Lab = colormath.XYZ2Lab(*white_XYZ_Y100) if (DXYZ and PXYZ and (colormath.delta(*white_CIEDCCT_Lab + white_Lab)["E"] < 6 or colormath.delta(*white_planckianCCT_Lab + white_Lab)["E"] < 6)): # Is white close enough to daylight or planckian locus? XYZ = colormath.adapt(XYZ[0], XYZ[1], XYZ[2], white_XYZ_Y100, "D65") X, Y, Z = [v / 100.0 for v in XYZ] color = [int(round(v)) for v in colormath.XYZ2RGB(X, Y, Z, scale=255)] return Lab, color def grid_left_click_handler(self, event): if not self.is_measuring: row, col = event.GetRow(), event.GetCol() if row == -1 and col > -1: # col label clicked pass elif row > -1: # row clicked if not (event.CmdDown() or event.ControlDown() or event.ShiftDown()): self.update(row) event.Skip() def has_worker_subprocess(self): return bool(getattr(self, "worker", None) and getattr(self.worker, "subprocess", None)) def isatty(self): return True def key_handler(self, event): keycode = None is_key_event = event.GetEventType() in (wx.EVT_CHAR.typeId, wx.EVT_CHAR_HOOK.typeId, wx.EVT_KEY_DOWN.typeId) if is_key_event: keycode = event.GetKeyCode() elif event.GetEventType() == wx.EVT_MENU.typeId: keycode = self.id_to_keycode.get(event.GetId()) if keycode == wx.WXK_TAB: self.global_navigate() or event.Skip() elif keycode >= 0: if keycode in (wx.WXK_UP, wx.WXK_NUMPAD_UP): self.back_btn_handler(None) elif keycode in (wx.WXK_DOWN, wx.WXK_NUMPAD_DOWN): self.next_btn_handler(None) elif keycode in (wx.WXK_HOME, wx.WXK_NUMPAD_HOME): if self.index > -1: self.update(0) elif keycode in (wx.WXK_END, wx.WXK_NUMPAD_END): if self.index_max > -1: self.update(self.index_max) elif keycode in (wx.WXK_PAGEDOWN, wx.WXK_NUMPAD_PAGEDOWN): if self.index > -1: self.grid.MovePageDown() self.update(self.grid.GetGridCursorRow()) elif keycode in (wx.WXK_PAGEUP, wx.WXK_NUMPAD_PAGEUP): if self.index > -1: self.grid.MovePageUp() self.update(self.grid.GetGridCursorRow()) elif is_key_event and (event.ControlDown() or event.CmdDown()): event.Skip() elif self.has_worker_subprocess() and keycode < 256: if keycode == wx.WXK_ESCAPE or chr(keycode) == "Q": # ESC or Q self.worker.abort_subprocess() elif (not isinstance(self.FindFocus(), wx.Control) or keycode != wx.WXK_SPACE): # Any other key self.measure_btn_handler(None) else: event.Skip() else: event.Skip() else: event.Skip() def measure(self, event=None): self.enable_btns(False, True) # Use a delay to allow for TFT lag wx.CallLater(200, self.safe_send, " ") def measure_auto_ctrl_handler(self, event): auto = self.measure_auto_cb.GetValue() setcfg("untethered.measure.auto", int(auto)) def measure_btn_handler(self, event): if self.is_measuring: self.is_measuring = False else: self.last_XYZ = (-1, -1, -1) self.measure_count = 1 self.measure() def measurement_play_sound_handler(self, event): setcfg("measurement.play_sound", int(not(bool(getcfg("measurement.play_sound"))))) if getcfg("measurement.play_sound"): bitmap = geticon(16, "sound_volume_full") else: bitmap = geticon(16, "sound_off") self.sound_on_off_btn._bitmap = bitmap def next_btn_handler(self, event): if self.index < self.index_max: self.update(self.index + 1) def parse_txt(self, txt): if not txt: return self.logger.info("%r" % txt) data_len = len(self.cgats[0].DATA) if (self.grid.GetNumberRows() < data_len): self.index = 0 self.index_max = data_len - 1 self.grid.AppendRows(data_len - self.grid.GetNumberRows()) for i in self.cgats[0].DATA: self.grid.SetRowLabelValue(i, "%i" % (i + 1)) row = self.cgats[0].DATA[i] RGB = [] for j, label in enumerate("RGB"): value = int(round(row["RGB_%s" % label] / 100.0 * 255)) self.grid.SetCellValue(row.SAMPLE_ID - 1, j, "%i" % value) RGB.append(value) self.grid.SetCellBackgroundColour(row.SAMPLE_ID - 1, 3, wx.Colour(*RGB)) if "Connecting to the instrument" in txt: self.Pulse(lang.getstr("instrument.initializing")) if "Spot read needs a calibration" in txt: self.is_measuring = False if "Spot read failed" in txt: self.last_error = txt if "Result is XYZ:" in txt: self.last_error = None if getcfg("measurement.play_sound"): self.measurement_sound.safe_play() # Result is XYZ: d.dddddd d.dddddd d.dddddd, D50 Lab: d.dddddd d.dddddd d.dddddd XYZ = re.search("XYZ:\s+(-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?)", txt) if not XYZ: return XYZ = [float(v) for v in XYZ.groups()] row = self.cgats[0].DATA[self.index] if (row["RGB_R"] == 100 and row["RGB_G"] == 100 and row["RGB_B"] == 100): # White if XYZ[1] > 0: self.cgats[0].add_keyword("LUMINANCE_XYZ_CDM2", "%.6f %.6f %.6f" % tuple(XYZ)) self.white_XYZ = XYZ Lab1 = colormath.XYZ2Lab(*self.last_XYZ) Lab2 = colormath.XYZ2Lab(*XYZ) delta = colormath.delta(*Lab1 + Lab2) if debug or test or verbose > 1: safe_print("Last recorded Lab: %.4f %.4f %.4f" % Lab1) safe_print("Current Lab: %.4f %.4f %.4f" % Lab2) safe_print("Delta E to last recorded Lab: %.4f" % delta["E"]) safe_print("Abs. delta L to last recorded Lab: %.4f" % abs(delta["L"])) safe_print("Abs. delta C to last recorded Lab: %.4f" % abs(delta["C"])) if (delta["E"] > getcfg("untethered.min_delta") or (abs(delta["L"]) > getcfg("untethered.min_delta.lightness") and abs(delta["C"]) < getcfg("untethered.max_delta.chroma"))): self.measure_count += 1 if self.measure_count == 2: if getcfg("measurement.play_sound"): self.commit_sound.safe_play() self.measure_count = 0 # Reset row label self.grid.SetRowLabelValue(self.index, "%i" % (self.index + 1)) # Update CGATS query = self.cgats[0].queryi({"RGB_R": row["RGB_R"], "RGB_G": row["RGB_G"], "RGB_B": row["RGB_B"]}) for i in query: index = query[i].SAMPLE_ID - 1 if index not in self.measured: self.measured.append(index) if index == self.index + 1: # Increment the index if we have consecutive patches self.index = index query[i]["XYZ_X"], query[i]["XYZ_Y"], query[i]["XYZ_Z"] = XYZ if getcfg("untethered.measure.auto"): self.show_RGB(False, False) self.show_XYZ() Lab, color = self.get_Lab_RGB() for i in query: row = query[i] self.grid.SetCellBackgroundColour(query[i].SAMPLE_ID - 1, 4, wx.Colour(*color)) for j in xrange(3): self.grid.SetCellValue(query[i].SAMPLE_ID - 1, 5 + j, "%.2f" % Lab[j]) self.grid.MakeCellVisible(self.index, 0) self.grid.ForceRefresh() if len(self.measured) == data_len: self.finished = True self.finish_btn.Enable() else: # Jump to the next or previous unmeasured patch, if any index = self.index for i in xrange(self.index + 1, data_len): if (getcfg("untethered.measure.auto") or not i in self.measured): self.index = i break if self.index == index: for i in xrange(self.index - 1, -1, -1): if not i in self.measured: self.index = i break if self.index != index: # Mark the row containing the next/previous patch self.grid.SetRowLabelValue(self.index, u"\u25ba %i" % (self.index + 1)) self.grid.MakeCellVisible(self.index, 0) if "key to take a reading" in txt and not self.last_error: if getcfg("untethered.measure.auto") and self.is_measuring: if not self.finished and self.keepGoing: self.measure() else: self.enable_btns() else: show_XYZ = self.index in self.measured delay = getcfg("untethered.measure.manual.delay") * 1000 wx.CallLater(delay, self.show_RGB, not show_XYZ) if show_XYZ: wx.CallLater(delay, self.show_XYZ) wx.CallLater(delay, self.enable_btns) def pause_continue_handler(self, event=None): if not event: self.parse_txt(self.worker.lastmsg.read()) @property def paused(self): return False def reset(self): self._setup() def resize_grid(self): num_cols = self.grid.GetNumberCols() if not num_cols: return grid_w = self.grid.GetSize()[0] - self.grid.GetDefaultRowSize() * 2 col_w = round(grid_w / (num_cols - 1)) last_col_w = grid_w - col_w * (num_cols - 2) self.grid.SetRowLabelSize(col_w) for i in xrange(num_cols): if i in (3, 4): w = self.grid.GetDefaultRowSize() elif i == num_cols - 1: w = last_col_w - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X) else: w = col_w self.grid.SetColSize(i, w) self.grid.SetMargins(0 - wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X), 0) self.grid.ForceRefresh() def _setup(self): self.logger.info("-" * 80) self.is_measuring = False self.keepGoing = True self.last_error = None self.index = -1 self.index_max = -1 self.last_XYZ = (-1, -1, -1) self.white_XYZ = (-1, -1, -1) self.measure_count = 0 self.measured = [] self.finished = False self.label_RGB.SetLabel(" ") self.label_XYZ.SetLabel(" ") self.panel_RGB.SetBackgroundColour(BGCOLOUR) self.panel_RGB.Refresh() self.panel_RGB.Update() self.panel_XYZ.SetBackgroundColour(BGCOLOUR) self.panel_XYZ.Refresh() self.panel_XYZ.Update() self.label_index.SetLabel(" ") self.enable_btns(False) self.measure_auto_cb.SetValue(bool(getcfg("untethered.measure.auto"))) self.finish_btn.Disable() if self.grid.GetNumberRows(): self.grid.DeleteRows(0, self.grid.GetNumberRows()) # Set position x = getcfg("position.progress.x") y = getcfg("position.progress.y") self.SetSaneGeometry(x, y) def safe_send(self, bytes): if self.has_worker_subprocess() and not self.worker.subprocess_abort: self.worker.safe_send(bytes) def show_RGB(self, clear_XYZ=True, mark_current_row=True): row = self.cgats[0].DATA[self.index] self.label_RGB.SetLabel("RGB %i %i %i" % (round(row["RGB_R"] / 100.0 * 255), round(row["RGB_G"] / 100.0 * 255), round(row["RGB_B"] / 100.0 * 255))) color = [int(round(v / 100.0 * 255)) for v in (row["RGB_R"], row["RGB_G"], row["RGB_B"])] self.panel_RGB.SetBackgroundColour(wx.Colour(*color)) self.panel_RGB.SetBitmap(None) self.panel_RGB.Refresh() self.panel_RGB.Update() if clear_XYZ: self.label_XYZ.SetLabel(" ") self.panel_XYZ.SetBackgroundColour(BGCOLOUR) self.panel_XYZ.SetBitmap(getbitmap("theme/checkerboard-32x32x5-333-444")) self.panel_XYZ.Refresh() self.panel_XYZ.Update() if mark_current_row: self.grid.SetRowLabelValue(self.index, u"\u25ba %i" % (self.index + 1)) self.grid.MakeCellVisible(self.index, 0) if self.index not in self.grid.GetSelectedRows(): self.grid.SelectRow(self.index) self.grid.SetGridCursor(self.index, 0) self.label_index.SetLabel("%i/%i" % (self.index + 1, len(self.cgats[0].DATA))) self.label_index.GetContainingSizer().Layout() def show_XYZ(self): Lab, color = self.get_Lab_RGB() self.label_XYZ.SetLabel("L*a*b* %.2f %.2f %.2f" % Lab) self.panel_XYZ.SetBackgroundColour(wx.Colour(*color)) self.panel_XYZ.SetBitmap(None) self.panel_XYZ.Refresh() self.panel_XYZ.Update() def start_timer(self, ms=50): self.timer.Start(ms) def stop_timer(self): self.timer.Stop() def update(self, index): # Reset row label self.grid.SetRowLabelValue(self.index, "%i" % (self.index + 1)) self.index = index show_XYZ = self.index in self.measured self.show_RGB(not show_XYZ) if show_XYZ: self.show_XYZ() self.enable_btns() def write(self, txt): wx.CallAfter(self.parse_txt, txt) if __name__ == "__main__": from thread import start_new_thread from time import sleep import random from util_io import Files import ICCProfile as ICCP import worker class Subprocess(): def send(self, bytes): start_new_thread(test, (bytes,)) class Worker(worker.Worker): def __init__(self): worker.Worker.__init__(self) self.finished = False self.instrument_calibration_complete = False self.instrument_place_on_screen_msg = False self.instrument_sensor_position_msg = False self.is_ambient_measuring = False self.subprocess = Subprocess() self.subprocess_abort = False def abort_subprocess(self): self.safe_send("Q") def safe_send(self, bytes): print "*** Sending %r" % bytes self.subprocess.send(bytes) return True config.initcfg() print "untethered.min_delta", getcfg("untethered.min_delta") print "untethered.min_delta.lightness", getcfg("untethered.min_delta.lightness") print "untethered.max_delta.chroma", getcfg("untethered.max_delta.chroma") lang.init() lang.update_defaults() app = BaseApp(0) app.TopWindow = UntetheredFrame(start_timer=False) testchart = getcfg("testchart.file") if os.path.splitext(testchart)[1].lower() in (".icc", ".icm"): try: testchart = ICCP.ICCProfile(testchart).tags.targ except: pass try: app.TopWindow.cgats = CGATS.CGATS(testchart) except: app.TopWindow.cgats = CGATS.CGATS("""TI1 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT BEGIN_DATA 1 0 0 0 0 0 0 END_DATA """) app.TopWindow.worker = Worker() app.TopWindow.worker.progress_wnd = app.TopWindow app.TopWindow.Show() files = Files([app.TopWindow.worker, app.TopWindow]) def test(bytes=None): print "*** Received %r" % bytes menu = r"""Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""" if not bytes: txt = menu elif bytes == " ": i = app.TopWindow.index row = app.TopWindow.cgats[0].DATA[i] txt = [""" Result is XYZ: %.6f %.6f %.6f Place instrument on spot to be measured, and hit [A-Z] to read white and setup FWA compensation (keyed to letter) [a-z] to read and make FWA compensated reading from keyed reference 'r' to set reference, 's' to save spectrum, 'h' to toggle high res., 'k' to do a calibration Hit ESC or Q to exit, any other key to take a reading:""" % (row.XYZ_X, row.XYZ_Y, row.XYZ_Z), """" Result is XYZ: %.6f %.6f %.6f Spot read needs a calibration before continuing Place cap on the instrument, or place on a dark surface, or place on the white calibration reference, and then hit any key to continue, or hit Esc or Q to abort:""" % (row.XYZ_X, row.XYZ_Y, row.XYZ_Z)][random.choice([0, 1])] elif bytes in ("Q", "q"): wx.CallAfter(app.TopWindow.Close) return else: return for line in txt.split("\n"): sleep(.03125) if app.TopWindow: wx.CallAfter(files.write, line) print line start_new_thread(test, tuple()) app.MainLoop() DisplayCAL-3.5.0.0/DisplayCAL/wxVisualWhitepointEditor.py0000644000076500000000000026307013142403032023041 0ustar devwheel00000000000000# -*- coding: utf-8 -*- """ Visual whitepoint editor Based on wx.lib.agw.cubecolourdialog 0.4 by Andrea Gavana @ 26 Feb 2012 License: wxPython license """ from __future__ import with_statement import colorsys import os import re import sys import threading from math import pi, sin, cos, sqrt, atan2 if sys.platform == "darwin": from platform import mac_ver from time import sleep from wxfixes import wx from wx.lib.agw import aui from wx.lib.intctrl import IntCtrl from config import (defaults, fs_enc, getbitmap, getcfg, get_argyll_display_number, get_default_dpi, get_display_name, get_icon_bundle, geticon, initcfg, profile_ext, setcfg) from log import safe_print from meta import name as appname from util_list import intlist from util_str import wrap from worker import (Error, UnloggedError, Warn, Worker, get_argyll_util, show_result_dialog) from wxfixes import (wx_Panel, GenBitmapButton as BitmapButton, get_bitmap_disabled, get_bitmap_hover, get_bitmap_pressed) from wxwindows import FlatShadedButton, HStretchStaticBitmap, TaskBarNotification import localization as lang import ICCProfile as ICCP try: import RealDisplaySizeMM as RDSMM except ImportError: RDSMM = None # Use non-native mini frames on all platforms aui.framemanager.AuiManager_UseNativeMiniframes = lambda manager: (manager.GetAGWFlags() & aui.AUI_MGR_USE_NATIVE_MINIFRAMES) == aui.AUI_MGR_USE_NATIVE_MINIFRAMES colourAttributes = ["r", "g", "b", "h", "s", "v"] colourMaxValues = [255, 255, 255, 359, 255, 255] def Property(func): return property(**func()) def rad2deg(x): """ Transforms radians into degrees. :param `x`: a float representing an angle in radians. """ return 180.0*x/pi def deg2rad(x): """ Transforms degrees into radians. :param `x`: a float representing an angle in degrees. """ return x*pi/180.0 def s(i): """ Scale for HiDPI if necessary """ return i * max(getcfg("app.dpi") / get_default_dpi(), 1) def update_patterngenerator(self): while self and wx.App.IsMainLoopRunning(): if self.update_patterngenerator_event.wait(0.05): self.update_patterngenerator_event.clear() x, y, size = self.patterngenerator_config self.patterngenerator.send((self._colour.r / 255.0, self._colour.g / 255.0, self._colour.b / 255.0), (self._bgcolour.r / 255.0, self._bgcolour.g / 255.0, self._bgcolour.b / 255.0), x=x, y=y, w=size, h=size) sleep(0.05) def _show_result_after(*args, **kwargs): wx.CallAfter(show_result_dialog, *args, **kwargs) def _wait_thread(fn, *args, **kwargs): # Wait until thread is finished. Yield while waiting. thread = threading.Thread(target=fn, name="VisualWhitepointEditorMaintenance", args=args, kwargs=kwargs) thread.start() while thread.isAlive(): wx.Yield() sleep(0.05) def Distance(pt1, pt2): """ Returns the distance between 2 points. :param `pt1`: an instance of :class:`Point`; :param `pt2`: another instance of :class:`Point`. """ distance = sqrt((pt1.x - pt2.x)**2.0 + (pt1.y - pt2.y)**2.0) return int(round(distance)) def AngleFromPoint(pt, center): """ Returns the angle between the x-axis and the line connecting the center and the point `pt`. :param `pt`: an instance of :class:`Point`; :param `center`: a float value representing the center. """ y = -1*(pt.y - center.y) x = pt.x - center.x if x == 0 and y == 0: return 0.0 else: return atan2(y, x) class AuiDarkDockArt(aui.dockart.AuiDefaultDockArt): def __init__(self, *args, **kwargs): aui.dockart.AuiDefaultDockArt.__init__(self, *args, **kwargs) if hasattr(self, "SetDefaultColours"): self.SetDefaultColours(wx.Colour(51, 51, 51)) else: self.SetColour(aui.dockart.AUI_DOCKART_INACTIVE_CAPTION_COLOUR, wx.Colour(43, 43, 43)) self.SetColour(aui.dockart.AUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR, wx.Colour(153, 153, 153)) self.SetColour(aui.dockart.AUI_DOCKART_BORDER_COLOUR, wx.Colour(51, 102, 204)) if hasattr(aui, "AUI_DOCKART_HINT_WINDOW_COLOUR"): self.SetColour(aui.dockart.AUI_DOCKART_HINT_WINDOW_COLOUR, wx.Colour(102, 153, 204)) self.SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_NONE) self.SetCustomPaneBitmap(geticon(16, "button-pin"), aui.dockart.AUI_BUTTON_CLOSE, False) self.SetCustomPaneBitmap(geticon(16, "button-pin"), aui.dockart.AUI_BUTTON_PIN, False) def DrawBackground(self, dc, window, orient, rect): """ Draws a background. :param `dc`: a :class:`DC` device context; :param `window`: an instance of :class:`Window`; :param integer `orient`: the gradient (if any) orientation; :param Rect `rect`: the background rectangle. """ dc.SetPen(wx.TRANSPARENT_PEN) dc.SetBrush(wx.Brush(wx.Colour(51, 51, 51))) dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height) def DrawPaneButton(self, dc, window, button, button_state, _rect, pane): """ Draws a pane button in the pane caption area. :param `dc`: a :class:`DC` device context; :param `window`: an instance of :class:`Window`; :param integer `button`: the button to be drawn; :param integer `button_state`: the pane button state; :param Rect `_rect`: the pane caption rectangle; :param `pane`: the pane for which the button is drawn. """ if not pane: return if button == aui.dockart.AUI_BUTTON_CLOSE: if pane.state & aui.dockart.optionActive: bmp = self._active_close_bitmap else: bmp = self._inactive_close_bitmap elif button == aui.dockart.AUI_BUTTON_PIN: if pane.state & aui.dockart.optionActive: bmp = self._active_pin_bitmap else: bmp = self._inactive_pin_bitmap elif button == aui.dockart.AUI_BUTTON_MAXIMIZE_RESTORE: if pane.IsMaximized(): if pane.state & aui.dockart.optionActive: bmp = self._active_restore_bitmap else: bmp = self._inactive_restore_bitmap else: if pane.state & aui.dockart.optionActive: bmp = self._active_maximize_bitmap else: bmp = self._inactive_maximize_bitmap elif button == aui.dockart.AUI_BUTTON_MINIMIZE: if pane.state & aui.dockart.optionActive: bmp = self._active_minimize_bitmap else: bmp = self._inactive_minimize_bitmap isVertical = pane.HasCaptionLeft() rect = wx.Rect(*_rect) if isVertical: old_x = rect.x rect.x = rect.x + (rect.width/2) - (bmp.GetWidth()/2) rect.width = old_x + rect.width - rect.x - 1 else: old_y = rect.y rect.y = rect.y + (rect.height/2) - (bmp.GetHeight()/2) rect.height = old_y + rect.height - rect.y - 1 if button_state == aui.dockart.AUI_BUTTON_STATE_PRESSED: rect.x += 1 rect.y += 1 if button_state == aui.dockart.AUI_BUTTON_STATE_HOVER: bmp = get_bitmap_hover(bmp) elif button_state == aui.dockart.AUI_BUTTON_STATE_PRESSED: bmp = get_bitmap_pressed(bmp) if isVertical: bmp = wx.ImageFromBitmap(bmp).Rotate90(clockwise=False).ConvertToBitmap() # draw the button itself dc.DrawBitmap(bmp, rect.x, rect.y, True) def SetCustomPaneBitmap(self, bmp, button, active, maximize=False): """ Sets a custom button bitmap for the pane button. :param Bitmap `bmp`: the actual bitmap to set; :param integer `button`: the button identifier; :param bool `active`: whether it is the bitmap for the active button or not; :param bool `maximize`: used to distinguish between the maximize and restore bitmaps. """ if button == aui.dockart.AUI_BUTTON_CLOSE: if active: self._active_close_bitmap = bmp else: self._inactive_close_bitmap = bmp if wx.Platform == "__WXMAC__": self._custom_pane_bitmaps = True elif button == aui.dockart.AUI_BUTTON_PIN: if active: self._active_pin_bitmap = bmp else: self._inactive_pin_bitmap = bmp elif button == aui.dockart.AUI_BUTTON_MAXIMIZE_RESTORE: if maximize: if active: self._active_maximize_bitmap = bmp else: self._inactive_maximize_bitmap = bmp else: if active: self._active_restore_bitmap = bmp else: self._inactive_restore_bitmap = bmp elif button == aui.dockart.AUI_BUTTON_MINIMIZE: if active: self._active_minimize_bitmap = bmp else: self._inactive_minimize_bitmap = bmp class AuiManager_LRDocking(aui.AuiManager): """ AuiManager with only left/right docking. Also, it is not necessary to hover the drop guide, a drop hint will show near the edges regardless. """ def CreateGuideWindows(self): self.DestroyGuideWindows() def DoDrop(self, docks, panes, target, pt, offset=wx.Point(0, 0)): """ This is an important function. It basically takes a mouse position, and determines where the panes new position would be. If the pane is to be dropped, it performs the drop operation using the specified dock and pane arrays. By specifying copy dock and pane arrays when calling, a "what-if" scenario can be performed, giving precise coordinates for drop hints. :param `docks`: a list of :class:`AuiDockInfo` classes; :param `panes`: a list of :class:`AuiPaneInfo` instances; :param Point `pt`: a mouse position to check for a drop operation; :param Point `offset`: a possible offset from the input point `pt`. """ if target.IsToolbar(): return self.DoDropToolbar(docks, panes, target, pt, offset) else: if target.IsFloating(): allow, hint = self.DoDropFloatingPane(docks, panes, target, pt) if allow: return allow, hint return self.DoDropNonFloatingPane(docks, panes, target, pt) def DoDropNonFloatingPane(self, docks, panes, target, pt): """ Handles the situation in which the dropped pane is not floating. :param `docks`: a list of :class:`AuiDockInfo` classes; :param `panes`: a list of :class:`AuiPaneInfo` instances; :param AuiPaneInfo `target`: the target pane containing the toolbar; :param Point `pt`: a mouse position to check for a drop operation. """ # The ONLY change from # wx.lib.framemanager.FrameManager.DoDropNonFloatingPane # is the removal of top offset by setting new_row_pixels_y to 0. # This way, the drag hint is shown when the mouse is near the right # frame side irrespective of mouse Y position. screenPt = self._frame.ClientToScreen(pt) clientSize = self._frame.GetClientSize() frameRect = aui.GetInternalFrameRect(self._frame, self._docks) drop = self.CopyTarget(target) # The result should always be shown drop.Show() part = self.HitTest(pt.x, pt.y) if not part: return False, target if part.type == aui.AuiDockUIPart.typeDockSizer: if len(part.dock.panes) != 1: return False, target part = self.GetPanePart(part.dock.panes[0].window) if not part: return False, target if not part.pane: return False, target part = self.GetPanePart(part.pane.window) if not part: return False, target insert_dock_row = False insert_row = part.pane.dock_row insert_dir = part.pane.dock_direction insert_layer = part.pane.dock_layer direction = part.pane.dock_direction if direction == aui.AUI_DOCK_TOP: if pt.y >= part.rect.y and pt.y < part.rect.y+aui.auiInsertRowPixels: insert_dock_row = True elif direction == aui.AUI_DOCK_BOTTOM: if pt.y > part.rect.y+part.rect.height-aui.auiInsertRowPixels and \ pt.y <= part.rect.y + part.rect.height: insert_dock_row = True elif direction == aui.AUI_DOCK_LEFT: if pt.x >= part.rect.x and pt.x < part.rect.x+aui.auiInsertRowPixels: insert_dock_row = True elif direction == aui.AUI_DOCK_RIGHT: if pt.x > part.rect.x+part.rect.width-aui.auiInsertRowPixels and \ pt.x <= part.rect.x+part.rect.width: insert_dock_row = True elif direction == aui.AUI_DOCK_CENTER: # "new row pixels" will be set to the default, but # must never exceed 20% of the window size new_row_pixels_x = s(20) new_row_pixels_y = 0 if new_row_pixels_x > (part.rect.width*20)/100: new_row_pixels_x = (part.rect.width*20)/100 if new_row_pixels_y > (part.rect.height*20)/100: new_row_pixels_y = (part.rect.height*20)/100 # determine if the mouse pointer is in a location that # will cause a new row to be inserted. The hot spot positions # are along the borders of the center pane insert_layer = 0 insert_dock_row = True pr = part.rect if pt.x >= pr.x and pt.x < pr.x + new_row_pixels_x: insert_dir = aui.AUI_DOCK_LEFT elif pt.y >= pr.y and pt.y < pr.y + new_row_pixels_y: insert_dir = aui.AUI_DOCK_TOP elif pt.x >= pr.x + pr.width - new_row_pixels_x and pt.x < pr.x + pr.width: insert_dir = aui.AUI_DOCK_RIGHT elif pt.y >= pr.y+ pr.height - new_row_pixels_y and pt.y < pr.y + pr.height: insert_dir = aui.AUI_DOCK_BOTTOM else: return False, target insert_row = aui.GetMaxRow(panes, insert_dir, insert_layer) + 1 if insert_dock_row: panes = aui.DoInsertDockRow(panes, insert_dir, insert_layer, insert_row) drop.Dock().Direction(insert_dir).Layer(insert_layer). \ Row(insert_row).Position(0) return self.ProcessDockResult(target, drop) # determine the mouse offset and the pane size, both in the # direction of the dock itself, and perpendicular to the dock if part.orientation == wx.VERTICAL: offset = pt.y - part.rect.y size = part.rect.GetHeight() else: offset = pt.x - part.rect.x size = part.rect.GetWidth() drop_position = part.pane.dock_pos # if we are in the top/left part of the pane, # insert the pane before the pane being hovered over if offset <= size/2: drop_position = part.pane.dock_pos panes = aui.DoInsertPane(panes, part.pane.dock_direction, part.pane.dock_layer, part.pane.dock_row, part.pane.dock_pos) # if we are in the bottom/right part of the pane, # insert the pane before the pane being hovered over if offset > size/2: drop_position = part.pane.dock_pos+1 panes = aui.DoInsertPane(panes, part.pane.dock_direction, part.pane.dock_layer, part.pane.dock_row, part.pane.dock_pos+1) drop.Dock(). \ Direction(part.dock.dock_direction). \ Layer(part.dock.dock_layer).Row(part.dock.dock_row). \ Position(drop_position) return self.ProcessDockResult(target, drop) class Colour(object): """ This is a class similar to :class:`Colour`, which adds Hue, Saturation and Brightness capability. It contains also methods to convert RGB triplets into HSB triplets and vice-versa. """ def __init__(self, colour): """ Default class constructor. :param `colour`: a standard :class:`Colour`. """ self.r = colour.Red() self.g = colour.Green() self.b = colour.Blue() self._alpha = colour.Alpha() self.ToHSV() def ToRGB(self): """ Converts a HSV triplet into a RGB triplet. """ maxVal = self.v delta = (maxVal*self.s)/255.0 minVal = maxVal - delta hue = float(self.h) if self.h > 300 or self.h <= 60: self.r = maxVal if self.h > 300: self.g = int(round(minVal)) hue = (hue - 360.0)/60.0 self.b = int(round(-(hue*delta - minVal))) else: self.b = int(round(minVal)) hue = hue/60.0 self.g = int(round(hue*delta + minVal)) elif self.h > 60 and self.h < 180: self.g = int(round(maxVal)) if self.h < 120: self.b = int(round(minVal)) hue = (hue/60.0 - 2.0)*delta self.r = int(round(minVal - hue)) else: self.r = int(round(minVal)) hue = (hue/60.0 - 2.0)*delta self.b = int(round(minVal + hue)) else: self.b = int(round(maxVal)) if self.h < 240: self.r = int(round(minVal)) hue = (hue/60.0 - 4.0)*delta self.g = int(round(minVal - hue)) else: self.g = int(round(minVal)) hue = (hue/60.0 - 4.0)*delta self.r = int(round(minVal + hue)) def ToHSV(self): """ Converts a RGB triplet into a HSV triplet. """ minVal = float(min(self.r, min(self.g, self.b))) maxVal = float(max(self.r, max(self.g, self.b))) delta = maxVal - minVal self.v = int(round(maxVal)) if abs(delta) < 1e-6: self.h = self.s = 0 else: temp = delta/maxVal self.s = int(round(temp*255.0)) if self.r == int(round(maxVal)): temp = float(self.g-self.b)/delta elif self.g == int(round(maxVal)): temp = 2.0 + (float(self.b-self.r)/delta) else: temp = 4.0 + (float(self.r-self.g)/delta) temp *= 60 if temp < 0: temp += 360 elif temp >= 360.0: temp = 0 self.h = int(round(temp)) def GetPyColour(self): """ Returns the wxPython :class:`Colour` associated with this instance. """ return wx.Colour(self.r, self.g, self.b, self._alpha) class BasePyControl(wx.PyControl): """ Base class used to hold common code for the HSB colour wheel and the RGB colour cube. """ def __init__(self, parent, bitmap=None): """ Default class constructor. Used internally. Do not call it in your code! :param `parent`: the control parent; :param `bitmap`: the background bitmap for this custom control. """ wx.PyControl.__init__(self, parent, style=wx.NO_BORDER) self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) self._bitmap = bitmap self._mainFrame = wx.GetTopLevelParent(self) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_MOTION, self.OnMotion) def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` for :class:`BasePyControl`. :param `event`: a :class:`PaintEvent` event to be processed. """ dc = wx.AutoBufferedPaintDC(self) self.Draw(dc) def Draw(self, dc): if "gtk3" in wx.PlatformInfo: bgcolour = self.Parent.BackgroundColour else: bgcolour = self.BackgroundColour dc.SetBackground(wx.Brush(bgcolour)) dc.Clear() dc.DrawBitmap(self._bitmap, 0, 0, True) def OnEraseBackground(self, event): """ Handles the ``wx.EVT_ERASE_BACKGROUND`` for :class:`BasePyControl`. :param `event`: a :class:`EraseEvent` event to be processed. :note: This is intentionally empty to reduce flicker. """ pass def DrawMarkers(self, dc=None): """ Draws the markers on top of the background bitmap. :param `dc`: an instance of :class:`DC`. :note: This method must be overridden in derived classes. """ pass def DrawLines(self, dc): """ Draws the lines connecting the markers on top of the background bitmap. :param `dc`: an instance of :class:`DC`. :note: This method must be overridden in derived classes. """ pass def AcceptsFocusFromKeyboard(self): """ Can this window be given focus by keyboard navigation? If not, the only way to give it focus (provided it accepts it at all) is to click it. :note: This method always returns ``False`` as we do not accept focus from the keyboard. :note: Overridden from :class:`PyControl`. """ return False def AcceptsFocus(self): """ Can this window be given focus by mouse click? :note: This method always returns ``False`` as we do not accept focus from mouse click. :note: Overridden from :class:`PyControl`. """ return False def OnLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` for :class:`BasePyControl`. :param `event`: a :class:`MouseEvent` event to be processed. :note: This method must be overridden in derived classes. """ pass def OnLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` for :class:`BasePyControl`. :param `event`: a :class:`MouseEvent` event to be processed. :note: This method must be overridden in derived classes. """ pass def OnMotion(self, event): """ Handles the ``wx.EVT_MOTION`` for :class:`BasePyControl`. :param `event`: a :class:`MouseEvent` event to be processed. :note: This method must be overridden in derived classes. """ pass def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` for :class:`BasePyControl`. :param `event`: a :class:`SizeEvent` event to be processed. """ self.Refresh() def DoGetBestSize(self): """ Overridden base class virtual. Determines the best size of the control based on the bitmap size. :note: Overridden from :class:`PyControl`. """ return wx.Size(self._bitmap.GetWidth(), self._bitmap.GetHeight()) class BasePyButton(BasePyControl): def __init__(self, parent, bitmap): BasePyControl.__init__(self, parent, bitmap) self._bitmap_enabled = bitmap self._bitmap_disabled = get_bitmap_disabled(bitmap) self._bitmap_hover = get_bitmap_hover(bitmap) self._bitmap_pressed = get_bitmap_pressed(bitmap) self.Bind(wx.EVT_ENTER_WINDOW, self.OnMouseEnter) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeave) def OnLeftDown(self, event): if self.Enabled: self._bitmap = self._bitmap_pressed self.Refresh() event.Skip() def OnLeftUp(self, event): if self.Enabled: self._bitmap = self._bitmap_hover self.Refresh() event.Skip() def OnMouseEnter(self, event): if self.Enabled: if self.HasCapture(): self._bitmap = self._bitmap_pressed else: self._bitmap = self._bitmap_hover self.Refresh() event.Skip() def OnMouseLeave(self, event): if self.Enabled: self._bitmap = self._bitmap_enabled self.Refresh() event.Skip() def Enable(self, enable=True): if enable != self.Enabled: BasePyControl.Enable(self, enable) if self.Enabled: self._bitmap = self._bitmap_enabled else: self._bitmap = self._bitmap_disabled self.Refresh() class HSVWheel(BasePyControl): """ Implements the drawing, mouse handling and sizing routines for the HSV colour wheel. """ def __init__(self, parent, bgcolour): """ Default class constructor. Used internally. Do not call it in your code! :param `parent`: the control parent window. """ BasePyControl.__init__(self, parent, bitmap=getbitmap("theme/colorwheel")) self._bitmap = self._bitmap.ConvertToImage().AdjustChannels(.8, .8, .8).ConvertToBitmap() self._mouseIn = False self._buffer = wx.EmptyBitmap(self._bitmap.Width, self._bitmap.Height) self._bg = wx.EmptyBitmap(self._bitmap.Width, self._bitmap.Height) self._bgdc = wx.MemoryDC(self._bg) self.BackgroundColour = bgcolour self.Draw(self._bgdc) def DrawMarkers(self, dc=None): """ Draws the markers on top of the background bitmap. :param `dc`: an instance of :class:`DC`. """ if dc is None: dc = wx.ClientDC(self) if sys.platform != "darwin": dc = wx.BufferedDC(dc, self._buffer) # Blit the DC with our background to the current DC. # Much faster than redrawing the background every time. dc.Blit(0, 0, self._bg.Width, self._bg.Height, self._bgdc, 0, 0) brightMark = self._mainFrame._currentRect darkMarkOuter = wx.Rect(brightMark.x-1, brightMark.y-1, brightMark.width+2, brightMark.height+2) darkMarkInner = wx.Rect(brightMark.x+1, brightMark.y+1, brightMark.width-2, brightMark.height-2) dc.SetBrush(wx.TRANSPARENT_BRUSH) for pencolour, rect in ((wx.Colour(34, 34, 34), darkMarkOuter), (wx.LIGHT_GREY, brightMark), (wx.Colour(34, 34, 34), darkMarkInner)): dc.SetPen(wx.Pen(pencolour, 1)) dc.DrawRectangleRect(rect) def OnLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` for :class:`HSVWheel`. :param `event`: a :class:`MouseEvent` event to be processed. """ point = wx.Point(event.GetX(), event.GetY()) self._mouseIn = False if self.InCircle(point): self._mouseIn = True if self._mouseIn: self.CaptureMouse() self.TrackPoint(point) def OnLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` for :class:`HSVWheel`. :param `event`: a :class:`MouseEvent` event to be processed. """ if self.GetCapture(): self.ReleaseMouse() self._mouseIn = False def OnMotion(self, event): """ Handles the ``wx.EVT_MOTION`` for :class:`HSVWheel`. :param `event`: a :class:`MouseEvent` event to be processed. """ point = wx.Point(event.GetX(), event.GetY()) if self.GetCapture() and self._mouseIn: self.TrackPoint(point) def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` for :class:`BasePyControl`. :param `event`: a :class:`PaintEvent` event to be processed. """ dc = wx.AutoBufferedPaintDC(self) if self._mainFrame._initOver: self.DrawMarkers(dc) else: self.Draw(dc) def InCircle(self, pt): """ Returns whether a point is inside the HSV wheel or not. :param `pt`: an instance of :class:`Point`. """ return Distance(pt, self._mainFrame._centre) <= (self._bitmap.Size[0]) / 2 def TrackPoint(self, pt): """ Track a mouse event inside the HSV colour wheel. :param `pt`: an instance of :class:`Point`. """ if not self._mouseIn: return mainFrame = self._mainFrame colour = mainFrame._colour colour.h = int(round(rad2deg(AngleFromPoint(pt, mainFrame._centre)))) if colour.h < 0: colour.h += 360 colour.s = int(round(Distance(pt, mainFrame._centre)*255.0/((self._bitmap.Size[0] - s(12)) / 2)*0.2)) if colour.s > 255: colour.s = 255 mainFrame.CalcRects() self.DrawMarkers() colour.ToRGB() mainFrame.SetSpinVals() mainFrame.DrawBright() class BaseLineCtrl(wx.PyControl): """ Base class used to hold common code for the Alpha channel control and the brightness palette control. """ def __init__(self, parent, size=wx.DefaultSize): """ Default class constructor. Used internally. Do not call it in your code! :param `parent`: the control parent window. """ wx.PyControl.__init__(self, parent, size=size, style=wx.NO_BORDER) self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) self._mainFrame = wx.GetTopLevelParent(self) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_MOTION, self.OnMotion) def OnEraseBackground(self, event): """ Handles the ``wx.EVT_ERASE_BACKGROUND`` for :class:`BaseLineCtrl`. :param `event`: a :class:`EraseEvent` event to be processed. :note: This is intentionally empty to reduce flicker. """ pass def OnLeftDown(self, event): """ Handles the ``wx.EVT_LEFT_DOWN`` for :class:`BaseLineCtrl`. :param `event`: a :class:`MouseEvent` event to be processed. """ point = wx.Point(event.GetX(), event.GetY()) theRect = self.GetClientRect() if not theRect.Contains(point): event.Skip() return self.CaptureMouse() self.TrackPoint(point) def OnLeftUp(self, event): """ Handles the ``wx.EVT_LEFT_UP`` for :class:`BaseLineCtrl`. :param `event`: a :class:`MouseEvent` event to be processed. """ if self.GetCapture(): self.ReleaseMouse() self.Refresh() # Needed for proper redrawing after click under OS X def OnMotion(self, event): """ Handles the ``wx.EVT_MOTION`` for :class:`BaseLineCtrl`. :param `event`: a :class:`MouseEvent` event to be processed. """ point = wx.Point(event.GetX(), event.GetY()) if self.GetCapture(): self.TrackPoint(point) def OnSize(self, event): """ Handles the ``wx.EVT_SIZE`` for :class:`BaseLineCtrl`. :param `event`: a :class:`SizeEvent` event to be processed. """ self.Refresh() def BuildRect(self): """ Internal method. """ brightRect = wx.Rect(*self.GetClientRect()) brightRect.x += s(2) brightRect.y += s(2) brightRect.width -= s(4) brightRect.height -= s(4) return brightRect def AcceptsFocusFromKeyboard(self): """ Can this window be given focus by keyboard navigation? If not, the only way to give it focus (provided it accepts it at all) is to click it. :note: This method always returns ``False`` as we do not accept focus from the keyboard. :note: Overridden from :class:`PyControl`. """ return False def AcceptsFocus(self): """ Can this window be given focus by mouse click? :note: This method always returns ``False`` as we do not accept focus from mouse click. :note: Overridden from :class:`PyControl`. """ return False class BrightCtrl(BaseLineCtrl): """ Implements the drawing, mouse handling and sizing routines for the brightness palette control. """ def __init__(self, parent, colour=None): """ Default class constructor. Used internally. Do not call it in your code! :param `parent`: the control parent window. """ BaseLineCtrl.__init__(self, parent, size=(s(20), s(102))) self._colour = colour or self._mainFrame._colour self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_MOUSEWHEEL, self.mousewheel_handler) def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` for :class:`BrightCtrl`. :param `event`: a :class:`PaintEvent` event to be processed. """ dc = wx.AutoBufferedPaintDC(self) self.DrawMarkers(dc) def DoGetBestSize(self): """ Overridden base class virtual. Determines the best size of the control. :note: Overridden from :class:`PyControl`. """ return wx.Size(s(20), s(102)) def Draw(self, dc): if "gtk3" in wx.PlatformInfo: bgcolour = self.Parent.BackgroundColour else: bgcolour = self.BackgroundColour dc.SetBackground(wx.Brush(bgcolour)) dc.Clear() colour = self._colour.GetPyColour() brightRect = self.BuildRect() target_red = colour.Red() target_green = colour.Green() target_blue = colour.Blue() h, s, v = colorsys.rgb_to_hsv(target_red / 255.0, target_green / 255.0, target_blue / 255.0) v = .8 vstep = v/(brightRect.height-1) for y_pos in range(brightRect.y, brightRect.height+brightRect.y): r, g, b = [round(c * 255.0) for c in colorsys.hsv_to_rgb(h, s, v)] colour = wx.Colour(int(r), int(g), int(b)) dc.SetPen(wx.Pen(colour, 1, wx.SOLID)) dc.DrawRectangle(brightRect.x, y_pos, brightRect.width, 1) v = v - vstep dc.SetPen(wx.TRANSPARENT_PEN) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawRectangleRect(brightRect) def TrackPoint(self, pt): """ Tracks a mouse action inside the palette control. :param `pt`: an instance of :class:`Point`. """ brightRect = self.BuildRect() d = brightRect.GetBottom() - pt.y d *= 255 d /= brightRect.height if d < 0: d = 0 if d > 255: d = 255; mainFrame = self._mainFrame colour = self._colour colour.v = int(round(d)) mainFrame.DrawMarkers() colour.ToRGB() mainFrame.SetSpinVals() def DrawMarkers(self, dc=None): """ Draws square markers used with mouse gestures. :param `dc`: an instance of :class:`DC`. """ if dc is None: dc = wx.ClientDC(self) if sys.platform != "darwin": dc = wx.BufferedDC(dc) self.Draw(dc) colour = self._colour brightRect = self.BuildRect() y = int(round(colour.v/255.0*(brightRect.height-s(6)))) y = brightRect.height-s(4)-1 - y h = s(8) darkMarkOuter = wx.Rect(brightRect.x-2, y-1, brightRect.width+4, h) brightMark = wx.Rect(brightRect.x-1, y, brightRect.width+2, h-2) darkMarkInner = wx.Rect(brightRect.x, y+1, brightRect.width, h-4) dc.SetBrush(wx.TRANSPARENT_BRUSH) for pencolour, rect in ((wx.Colour(34, 34, 34), darkMarkOuter), (wx.LIGHT_GREY, brightMark), (wx.Colour(34, 34, 34), darkMarkInner)): dc.SetPen(wx.Pen(pencolour, 1)) dc.DrawRectangleRect(rect) def mousewheel_handler(self, event): self._spin(event.GetWheelRotation()) def _spin(self, direction): if direction > 0: if self._colour.v < 255: self._colour.v += 1 else: if self._colour.v > 0: self._colour.v -= 1 self._mainFrame.DrawMarkers() self._colour.ToRGB() self._mainFrame.SetSpinVals() class HSlider(BaseLineCtrl): """ Implements the drawing, mouse handling and sizing routines for the slider control. """ def __init__(self, parent, value=0, minval=0, maxval=100, onchange=None): """ Default class constructor. Used internally. Do not call it in your code! :param `parent`: the control parent window. """ BaseLineCtrl.__init__(self, parent, size=(s(140), s(8))) self.value = value self.minval = minval self.maxval = maxval self.onchange = onchange self._hasfocus = False self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SET_FOCUS, self.focus_handler) self.Bind(wx.EVT_KILL_FOCUS, self.focus_handler) self.Bind(wx.EVT_KEY_DOWN, self.key_handler) self.Bind(wx.EVT_KEY_UP, self.key_handler) self.Bind(wx.EVT_MOUSEWHEEL, self.mousewheel_handler) def OnPaint(self, event): """ Handles the ``wx.EVT_PAINT`` for :class:`BrightCtrl`. :param `event`: a :class:`PaintEvent` event to be processed. """ dc = wx.AutoBufferedPaintDC(self) self.DrawMarkers(dc) def DoGetBestSize(self): """ Overridden base class virtual. Determines the best size of the control. :note: Overridden from :class:`PyControl`. """ return wx.Size(s(140), s(8)) def BuildRect(self): brightRect = self.GetClientRect() brightRect.y += (brightRect.height - 8) / 2.0 brightRect.height = s(8) return brightRect def Draw(self, dc): if "gtk3" in wx.PlatformInfo: bgcolour = self.Parent.BackgroundColour else: bgcolour = self.BackgroundColour dc.SetBackground(wx.Brush(bgcolour)) dc.Clear() brightRect = self.BuildRect() dc.SetPen(wx.TRANSPARENT_PEN) dc.SetBrush(wx.Brush(wx.Colour(76, 76, 76))) dc.DrawRectangleRect(brightRect) def TrackPoint(self, pt): """ Tracks a mouse action inside the palette control. :param `pt`: an instance of :class:`Point`. """ brightRect = self.BuildRect() d = pt.x d *= self.maxval d /= brightRect.width if d < self.minval: d = self.minval if d > self.maxval: d = self.maxval; self.value = d self.DrawMarkers() if callable(self.onchange): self.onchange() def DrawMarkers(self, dc=None): """ Draws square markers used with mouse gestures. :param `dc`: an instance of :class:`DC`. """ if dc is None: dc = wx.ClientDC(self) if sys.platform != "darwin": dc = wx.BufferedDC(dc) self.Draw(dc) brightRect = self.BuildRect() w = s(8) x = int(round((self.value-self.minval)/float(self.maxval-self.minval)*(brightRect.width-w))) brightMark = wx.Rect(x, brightRect.y, w, brightRect.height) dc.SetBrush(wx.Brush(wx.Colour(153, 153, 153))) dc.DrawRectangleRect(brightMark) def GetValue(self): return self.value def SetValue(self, value): self.value = value self.DrawMarkers() @Property def Value(): def fget(self): return self.GetValue() def fset(self, value): self.SetValue(value) return locals() def GetMax(self): return self.maxval def GetMin(self): return self.minval def SetMax(self, maxval): self.maxval = maxval self.Refresh() @Property def Max(): def fget(self): return self.GetMax() def fset(self, value): self.SetMax(value) return locals() def focus_handler(self, event): self._hasfocus = event.GetEventType() == wx.EVT_SET_FOCUS.evtType[0] def key_handler(self, event): if event.KeyCode in (wx.WXK_RIGHT, wx.WXK_NUMPAD_RIGHT): self._spin(1) elif event.KeyCode in (wx.WXK_LEFT, wx.WXK_NUMPAD_LEFT): self._spin(-1) else: event.Skip() def mousewheel_handler(self, event): self._spin(event.GetWheelRotation()) def _spin(self, direction): inc = (self.maxval - self.minval) / self.ClientSize[0] if direction > 0: if self.Value < self.maxval: self.Value += inc else: if self.Value > self.minval: self.Value -= inc self._mainFrame.area_handler() class NumSpin(wx_Panel): def __init__(self, parent, id=-1, *args, **kwargs): wx_Panel.__init__(self, parent) self.BackgroundColour = "#404040" self.Sizer = wx.BoxSizer(wx.HORIZONTAL) self.numctrl = IntCtrl(self, -1, *args, **kwargs) self.numctrl.BackgroundColour = self.BackgroundColour self.numctrl.SetColors("#999999", "#CC0000") self.numctrl.Bind(wx.EVT_KEY_DOWN, self.key_handler) self.numctrl.Bind(wx.EVT_MOUSEWHEEL, self.mousewheel_handler) self.Sizer.Add(self.numctrl, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, s(5)) vsizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(vsizer, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, s(2)) self.spinup = BasePyButton(self, geticon(10, "spin_up")) self.spinup.BackgroundColour = self.BackgroundColour self.spinup.Bind(wx.EVT_LEFT_DOWN, self.left_down_handler) self.spinup.Bind(wx.EVT_LEFT_UP, self.left_up_handler) vsizer.Add(self.spinup, 0, wx.ALIGN_BOTTOM | wx.BOTTOM, s(1)) self.spindn = BasePyButton(self, geticon(10, "spin_down")) self.spindn.BackgroundColour = self.BackgroundColour self.spindn.Bind(wx.EVT_LEFT_DOWN, self.left_down_handler) self.spindn.Bind(wx.EVT_LEFT_UP, self.left_up_handler) vsizer.Add(self.spindn, 0, wx.ALIGN_TOP | wx.TOP, s(1)) self._left_down_count = 0 self._left_up_count = 0 def __getattr__(self, name): return getattr(self.numctrl, name) def is_button_pressed(self, btn): return (btn.Enabled and btn.HasCapture() and btn.ClientRect.Contains(btn.ScreenToClient(wx.GetMousePosition()))) def left_down_handler(self, event): self._left_down_count += 1 if self._capture_mouse(event): if event.GetEventObject() is self.spinup: self._spin(1, event, bell=False) else: self._spin(-1, event, bell=False) event.Skip() def left_up_handler(self, event): self._left_up_count += 1 while self._left_up_count > self._left_down_count: # Broken platform (wxMac?) :-( #print 'UP', self._left_up_count, 'DN', self._left_down_count self.left_down_handler(event) obj = event.GetEventObject() if obj.HasCapture(): obj.ReleaseMouse() event.Skip() def key_handler(self, event): if event.KeyCode in (wx.WXK_UP, wx.WXK_NUMPAD_UP): self._spin(1, event, bell=False) elif event.KeyCode in (wx.WXK_DOWN, wx.WXK_NUMPAD_DOWN): self._spin(-1, event, bell=False) else: event.Skip() def mousewheel_handler(self, event): if event.GetWheelRotation() > 0: self._spin(1, event, bell=False) else: self._spin(-1, event, bell=False) def _capture_mouse(self, event): obj = event.GetEventObject() if obj.Enabled and not obj.HasCapture(): point = wx.Point(event.GetX(), event.GetY()) if obj.ClientRect.Contains(point): obj.CaptureMouse() return True return obj.Enabled and obj.HasCapture() def _spin(self, inc, event, n=None, delay=500, bell=True): current = self.numctrl.GetValue() if n is None: n = current + inc if inc > 0: btn = self.spinup else: btn = self.spindn if event or self.is_button_pressed(btn): if n == current or (inc > 0 and n < current) or (inc < 0 and n > current): #print '!_spin', current, inc, n, delay, bell pass elif self.numctrl.GetMin() <= n <= self.numctrl.GetMax(): #print '_spin', current, inc, n, delay, bell self.SetValue(n) elif bell: wx.Bell() if btn.Enabled and btn.HasCapture(): current = self.numctrl.GetValue() wx.CallLater(delay, self._spin, inc, None, current + inc, 100) def GetValue(self): return self.numctrl.GetValue() def SetValue(self, value): self.numctrl.SetValue(value) if self.numctrl.GetMax() <= value: self.spinup.HasCapture() and self.spinup.ReleaseMouse() if self.numctrl.GetMin() >= value: self.spindn.HasCapture() and self.spindn.ReleaseMouse() self.spinup.Enable(self.numctrl.GetMax() > value) self.spindn.Enable(self.numctrl.GetMin() < value) @Property def Value(): def fget(self): return self.GetValue() def fset(self, value): self.SetValue(value) return locals() class ProfileManager(object): """ Manages profiles associated with the display that a window is on. Clears calibration on the display we're on, and restores it when moved to another display or the window is closed. """ managers = [] def __init__(self, window, geometry=None, profile=None): self._display = window.GetDisplay() self._lock = threading.Lock() self._profiles = {} self._srgb_profile = ICCP.ICCProfile.from_named_rgb_space("sRGB") self._srgb_profile.setDescription(appname + " Visual Whitepoint Editor " "Temporary Profile") self._srgb_profile.calculateID() self._window = window self._window.Bind(wx.EVT_CLOSE, self.window_close_handler) self._window.Bind(wx.EVT_MOVE, self.window_move_handler) self._window.Bind(wx.EVT_DISPLAY_CHANGED, self.display_changed_handler) self._worker = Worker() ProfileManager.managers.append(self) self.update(False) self._profiles_overridden = {} if geometry and profile: self._profiles_overridden[geometry] = profile def _manage_display(self, display_no, geometry): # Has to be thread-safe! with self._lock: try: display_profile = ICCP.get_display_profile(display_no) except (ICCP.ICCProfileInvalidError, IOError, IndexError), exception: safe_print("Could not get display profile for display %i" % (display_no + 1), "@ %i, %i, %ix%i:" % geometry, exception) else: profile = self._profiles_overridden.get(geometry) if not profile: profile = display_profile if display_profile and display_profile.ID != self._srgb_profile.ID: # Set initial whitepoint according to vcgt # Convert calibration information from embedded WCS # profile (if present) to VideCardGammaType if the # latter is not present if (isinstance(profile.tags.get("MS00"), ICCP.WcsProfilesTagType) and not "vcgt" in profile.tags): profile.tags["vcgt"] = profile.tags["MS00"].get_vcgt() if isinstance(profile.tags.get("vcgt"), ICCP.VideoCardGammaType): values = profile.tags.vcgt.getNormalizedValues() RGB = [] for i in xrange(3): RGB.append(int(round(values[-1][i] * 255))) (self._window._colour.r, self._window._colour.g, self._window._colour.b) = RGB self._window._colour.ToHSV() wx.CallAfter(self._window.DrawAll) # Remember profile, but discard profile filename # (Important - can't re-install profile from same path # where it is installed!) if not self._set_profile_temp_filename(display_profile): return self._profiles[geometry] = display_profile self._install_profile(display_no, self._srgb_profile) def _install_profile(self, display_no, profile, wrapup=False): # Has to be thread-safe! if self._window.patterngenerator: return dispwin = get_argyll_util("dispwin") if not dispwin: _show_result_after(Error(lang.getstr("argyll.util.not_found", "dispwin"))) return if not profile.fileName or not os.path.isfile(profile.fileName): if not self._set_profile_temp_filename(profile): return profile.write() result = self._worker.exec_cmd(dispwin, ["-v", "-d%i" % (display_no + 1), "-I", profile.fileName], capture_output=True, dry_run=False) if not result: result = UnloggedError("".join(self._worker.errors)) if isinstance(result, Exception): _show_result_after(result, wrap=120) if wrapup: self._worker.wrapup(False) # Remove temporary profiles ProfileManager.managers.remove(self) def _install_profile_locked(self, display_no, profile, wrapup=False): # Has to be thread-safe! with self._lock: self._install_profile(display_no, profile, wrapup) def _set_profile_temp_filename(self, profile): temp = self._worker.create_tempdir() if isinstance(temp, Exception): _show_result_after(temp) return if profile.fileName: profile_name = os.path.basename(profile.fileName) else: profile_name = profile.getDescription() + profile_ext if (sys.platform in ("win32", "darwin") or fs_enc.upper() not in ("UTF8", "UTF-8")) and re.search("[^\x20-\x7e]", profile_name): profile_name = safe_asciize(profile_name) profile.fileName = os.path.join(temp, profile_name) return True def _stop_timer(self): if (hasattr(self, "_update_timer") and self._update_timer.IsRunning()): self._update_timer.Stop() def update(self, restore_display_profiles=True): """ Clear calibration on the current display, and restore it on the previous one (if any) """ if restore_display_profiles: self.restore_display_profiles() display_no = get_argyll_display_number(self._display.Geometry) if display_no is not None: threading.Thread(target=self._manage_display, args=(display_no, self._display.Geometry.Get())).start() if not self._window.patterngenerator: display_name = get_display_name(display_no, True) if display_name: display_name = display_name.replace("[PRIMARY]", lang.getstr("display.primary")) self._window.SetTitle(display_name + u" ‒ " + lang.getstr("whitepoint.visual_editor")) else: msg = lang.getstr("whitepoint.visual_editor.display_changed.warning") safe_print(msg) def restore_display_profiles(self, wrapup=False, wait=False): """ Reinstall memorized display profiles, restore calibration """ while self._profiles: geometry, profile = self._profiles.popitem() display_no = get_argyll_display_number(geometry) if display_no is not None: thread = threading.Thread(target=self._install_profile_locked, args=(display_no, profile, wrapup)) thread.start() if wait: thread.join() else: msg = lang.getstr("whitepoint.visual_editor.display_changed.warning") safe_print(msg) def display_changed_handler(self, event): # Houston, we (may) have a problem! Memorized profile associations may # no longer be correct. def warn_update(): msg = lang.getstr("whitepoint.visual_editor.display_changed.warning") show_result_dialog(Warn(msg)) self and self.update() wx.CallLater(1000, warn_update) def window_close_handler(self, event): """ Restores profile(s) when the managed window is closed. """ self._stop_timer() self.restore_display_profiles(True, True) event.Skip() def window_move_handler(self, event): """ Clear calibration on the current display, and restore it on the previous one (if any) when the window is moved from one to another display. """ display = self._window.GetDisplay() if not self._display or display.Geometry != self._display.Geometry: self._display = display self._stop_timer() def update(): self._window and self.update() self._update_timer = wx.CallLater(50, update) event.Skip() class VisualWhitepointEditor(wx.Frame): """ This is the VisualWhitepointEditor main class implementation. """ def __init__(self, parent, colourData=None, title=wx.EmptyString, pos=wx.DefaultPosition, patterngenerator=None, geometry=None, profile=None): """ Default class constructor. :param `colourData`: a standard :class:`ColourData` (as used in :class:`ColourFrame`); to hide the alpha channel control or not. :param `patterngenerator`: a patterngenerator object :param `geometry`: the geometry of the display the profile is assigned to :param `profile`: the profile of the display with the given geometry """ self.patterngenerator = patterngenerator self.update_patterngenerator_event = threading.Event() style = wx.DEFAULT_FRAME_STYLE if patterngenerator: style &= ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX) wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=title or lang.getstr("whitepoint.visual_editor"), pos=pos, style=style, name="VisualWhitepointEditor") if not patterngenerator: self._mgr = AuiManager_LRDocking(self, aui.AUI_MGR_DEFAULT | aui.AUI_MGR_LIVE_RESIZE | aui.AUI_MGR_SMOOTH_DOCKING) self._mgr.SetArtProvider(AuiDarkDockArt()) self.SetIcons(get_icon_bundle([256, 48, 32, 16], appname)) if colourData: self._colourData = colourData else: self._colourData = wx.ColourData() RGB = [] for attribute in "rgb": RGB.append(getcfg("whitepoint.visual_editor." + attribute)) self._colourData.SetColour(wx.Colour(*RGB)) self._colour = Colour(self._colourData.GetColour()) self._bgcolour = Colour(self._colourData.GetColour()) self._bgcolour.v = getcfg("whitepoint.visual_editor.bg_v") self._bgcolour.ToRGB() self._inMouse = False self._initOver = False self._inDrawAll = False self.mainPanel = wx_Panel(self, -1) self.mainPanel.BackgroundColour = "#333333" self.mainPanel.ForegroundColour = "#999999" self.bgPanel = wx_Panel(self, -1) self.bgPanel.Show(not patterngenerator) self.hsvBitmap = HSVWheel(self.mainPanel, self.mainPanel.BackgroundColour) self.brightCtrl = BrightCtrl(self.mainPanel) self.brightCtrl.BackgroundColour = self.mainPanel.BackgroundColour self.bgBrightCtrl = BrightCtrl(self.mainPanel, self._bgcolour) self.bgBrightCtrl.BackgroundColour = self.mainPanel.BackgroundColour if sys.platform == "win32" and sys.getwindowsversion() >= (6, ): # No need to enable double buffering under Linux and Mac OS X. # Under Windows, enabling double buffering on the panel seems # to work best to reduce flicker. self.mainPanel.SetDoubleBuffered(True) self.bgPanel.SetDoubleBuffered(True) self.newColourPanel = wx_Panel(self.bgPanel, style=wx.SIMPLE_BORDER) self.redSpin = NumSpin(self.mainPanel, -1, min=0, max=255, style=wx.NO_BORDER | wx.ALIGN_RIGHT) self.greenSpin = NumSpin(self.mainPanel, -1, min=0, max=255, style=wx.NO_BORDER | wx.ALIGN_RIGHT) self.blueSpin = NumSpin(self.mainPanel, -1, min=0, max=255, style=wx.NO_BORDER | wx.ALIGN_RIGHT) self.hueSpin = NumSpin(self.mainPanel, -1, min=0, max=359, style=wx.NO_BORDER | wx.ALIGN_RIGHT) self.saturationSpin = NumSpin(self.mainPanel, -1, min=0, max=255, style=wx.NO_BORDER | wx.ALIGN_RIGHT) self.brightnessSpin = NumSpin(self.mainPanel, -1, min=0, max=255, style=wx.NO_BORDER | wx.ALIGN_RIGHT) self.reset_btn = FlatShadedButton(self.mainPanel, -1, label=lang.getstr("reset"), fgcolour="#999999") x, y, scale = (float(v) for v in getcfg("dimensions.measureframe.whitepoint.visual_editor").split(",")) self.area_size_slider = HSlider(self.mainPanel, min(scale * 100, 1000), 10, 1000, self.area_handler) self.display_size_mm = {} self.set_area_size_slider_max() self.set_default_size() self.area_size_slider.BackgroundColour = self.mainPanel.BackgroundColour if "gtk3" in wx.PlatformInfo: size = (16, 16) else: size = (-1, -1) self.zoomnormalbutton = BitmapButton(self.mainPanel, -1, geticon(16, "zoom-original-outline"), size=size, style=wx.NO_BORDER) self.zoomnormalbutton.BackgroundColour = self.mainPanel.BackgroundColour self.Bind(wx.EVT_BUTTON, self.zoomnormal_handler, self.zoomnormalbutton) self.zoomnormalbutton.SetToolTipString(lang.getstr("measureframe." "zoomnormal")) self.area_x_slider = HSlider(self.mainPanel, int(round(x * 1000)), 0, 1000, self.area_handler) self.area_x_slider.BackgroundColour = self.mainPanel.BackgroundColour self.center_x_button = BitmapButton(self.mainPanel, -1, geticon(16, "window-center-outline"), size=size, style=wx.NO_BORDER) self.center_x_button.BackgroundColour = self.mainPanel.BackgroundColour self.Bind(wx.EVT_BUTTON, self.center_x_handler, self.center_x_button) self.center_x_button.SetToolTipString(lang.getstr("measureframe.center")) self.area_y_slider = HSlider(self.mainPanel, int(round(y * 1000)), 0, 1000, self.area_handler) self.area_y_slider.BackgroundColour = self.mainPanel.BackgroundColour self.center_y_button = BitmapButton(self.mainPanel, -1, geticon(16, "window-center-outline"), size=size, style=wx.NO_BORDER) self.center_y_button.BackgroundColour = self.mainPanel.BackgroundColour self.Bind(wx.EVT_BUTTON, self.center_y_handler, self.center_y_button) self.center_y_button.SetToolTipString(lang.getstr("measureframe.center")) self.measure_btn = FlatShadedButton(self.mainPanel, -1, label=lang.getstr("measure"), name="visual_whitepoint_editor_measure_btn", fgcolour="#999999") self.measure_btn.SetDefault() self.Bind(wx.EVT_SIZE, self.size_handler) self.SetProperties() self.DoLayout() self.spinCtrls = [self.redSpin, self.greenSpin, self.blueSpin, self.hueSpin, self.saturationSpin, self.brightnessSpin] for spin in self.spinCtrls: spin.Bind(wx.EVT_TEXT, self.OnSpinCtrl) self.reset_btn.Bind(wx.EVT_BUTTON, self.reset_handler) self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) self.Bind(wx.EVT_SHOW, self.show_handler) self.Bind(wx.EVT_MAXIMIZE, self.maximize_handler) self.Bind(wx.EVT_CHAR_HOOK, self.OnKeyDown) # Set up panes self.mainPanel.Fit() mainPanelSize = (self.mainPanel.Size[0], self.mainPanel.Size[1] + s(10)) if not patterngenerator: self._mgr.AddPane(self.mainPanel, aui.AuiPaneInfo(). Name("mainPanel"). Fixed(). Left(). TopDockable(False). BottomDockable(False). PaneBorder(False). CloseButton(False). PinButton(True). MinSize(mainPanelSize)) self._mgr.AddPane(self.bgPanel, aui.AuiPaneInfo(). Name("bgPanel"). CenterPane(). CloseButton(False). PaneBorder(False)) self._mgr.Update() self.Bind(aui.EVT_AUI_PANE_CLOSE, self.close_pane_handler) self.Bind(aui.EVT_AUI_PANE_FLOATED, self.float_pane_handler) self.Bind(aui.EVT_AUI_PANE_DOCKED, self.float_pane_handler) # Account for pane titlebar self.Sizer.SetSizeHints(self) self.Sizer.Layout() if not patterngenerator: if hasattr(self, "MinClientSize"): # wxPython 2.9+ minClientSize = self.MinClientSize else: minClientSize = self.WindowToClientSize(self.MinSize) w, h = self.newColourPanel.Size self.ClientSize = mainPanelSize[0] + w + s(26), max(minClientSize[1], h + s(26)) if sys.platform not in ("win32", "darwin"): correction = s(40) else: correction = 0 w, h = (int(round(self.default_size)), ) * 2 minClientSize = mainPanelSize[0] + max(minClientSize[1], w + s(26)), max(minClientSize[1], h + s(26)) + correction if hasattr(self, "MinClientSize"): # wxPython 2.9+ self.MinClientSize = minClientSize else: self.MinSize = self.ClientToWindowSize(minClientSize) x, y = self.Position w, h = self.Size if (not patterngenerator and (self.newColourPanel.Size[0] > min(self.bgPanel.Size[0], self.GetDisplay().ClientArea[2] - mainPanelSize[0]) or self.newColourPanel.Size[1] > min(self.bgPanel.Size[1], self.GetDisplay().ClientArea[3]))): w, h = self.GetDisplay().ClientArea[2:] self.SetSaneGeometry(x, y, w, h) if patterngenerator: self.update_patterngenerator_thread = threading.Thread( target=update_patterngenerator, name="VisualWhitepointEditorPatternGeneratorUpdateThread", args=(self,)) self.update_patterngenerator_thread.start() self._pm = ProfileManager(self, geometry, profile) self.Bind(wx.EVT_MOVE, self.move_handler) wx.CallAfter(self.InitFrame) self.keepGoing = True self.measure_btn.Bind(wx.EVT_BUTTON, self.measure) def SetProperties(self): """ Sets some initial properties for :class:`VisualWhitepointEditor` (sizes, values). """ min_w = self.redSpin.numctrl.GetTextExtent("255")[0] + s(30) self.redSpin.SetMinSize((min_w, -1)) self.greenSpin.SetMinSize((min_w, -1)) self.blueSpin.SetMinSize((min_w, -1)) self.hueSpin.SetMinSize((min_w, -1)) self.saturationSpin.SetMinSize((min_w, -1)) self.brightnessSpin.SetMinSize((min_w, -1)) def DoLayout(self): """ Layouts all the controls in the :class:`VisualWhitepointEditor`. """ margin = s(12) dialogSizer = wx.FlexGridSizer(1, 2, 0, 0) dialogSizer.AddGrowableRow(0) dialogSizer.AddGrowableCol(1) mainSizer = wx.BoxSizer(wx.VERTICAL) shadow = HStretchStaticBitmap(self.mainPanel, -1, getbitmap("theme/shadow-bordertop")) mainSizer.Add(shadow, 0, wx.EXPAND) label = wx.StaticText(self.mainPanel, -1, lang.getstr("whitepoint")) label.SetMaxFontSize(11) font = label.Font font.SetWeight(wx.BOLD) label.Font = font mainSizer.Add(label, 0, wx.LEFT, margin) hsvGridSizer = wx.GridSizer(2, 3, margin, margin) hsvSizer = wx.BoxSizer(wx.HORIZONTAL) hsvSizer.Add(self.hsvBitmap, 0, wx.ALL, margin) hsvSizer.Add(self.brightCtrl, 0, wx.TOP|wx.BOTTOM, margin + s(5) + 2) hsvSizer.Add((margin + s(5), 1)) hsvSizer.Add(self.bgBrightCtrl, 0, wx.TOP|wx.BOTTOM, margin + s(5) + 2) hsvSizer.Add((margin + s(5), 1)) mainSizer.Add(hsvSizer, 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER, margin) for channel in ("red", "green", "blue", "hue", "saturation", "brightness"): label = wx.StaticText(self.mainPanel, -1, lang.getstr(channel)) label.SetMaxFontSize(11) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(label) sizer.Add(getattr(self, channel + "Spin"), 0, wx.TOP|wx.EXPAND, s(4)) hsvGridSizer.Add(sizer, 0, wx.EXPAND) mainSizer.Add(hsvGridSizer, 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER, margin) mainSizer.Add(self.reset_btn, 0, wx.ALL | wx.ALIGN_CENTER, margin) shadow = HStretchStaticBitmap(self.mainPanel, -1, getbitmap("theme/shadow-bordertop")) mainSizer.Add(shadow, 0, wx.EXPAND, margin) area_slider_label = wx.StaticText(self.mainPanel, -1, lang.getstr("measureframe.title")) area_slider_label.SetMaxFontSize(11) font = area_slider_label.Font font.SetWeight(wx.BOLD) area_slider_label.Font = font mainSizer.Add(area_slider_label, 0, wx.LEFT | wx.BOTTOM, margin) if "gtk3" in wx.PlatformInfo: vmargin = margin else: vmargin = s(6) slider_sizer = wx.FlexGridSizer(3, 3, vmargin, margin) slider_sizer.AddGrowableCol(1) mainSizer.Add(slider_sizer, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, margin) area_size_label = wx.StaticText(self.mainPanel, -1, lang.getstr("size")) area_size_label.SetMaxFontSize(11) slider_sizer.Add(area_size_label, 0, wx.ALIGN_CENTER_VERTICAL) slider_sizer.Add(self.area_size_slider, 0, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) slider_sizer.Add(self.zoomnormalbutton, 0, wx.ALIGN_CENTER_VERTICAL) area_x_label = wx.StaticText(self.mainPanel, -1, "X") area_x_label.SetMaxFontSize(11) slider_sizer.Add(area_x_label, 0, wx.ALIGN_CENTER_VERTICAL) slider_sizer.Add(self.area_x_slider, 0, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) slider_sizer.Add(self.center_x_button, 0, wx.ALIGN_CENTER_VERTICAL) area_y_label = wx.StaticText(self.mainPanel, -1, "Y") area_y_label.SetMaxFontSize(11) slider_sizer.Add(area_y_label, 0, wx.ALIGN_CENTER_VERTICAL) slider_sizer.Add(self.area_y_slider, 0, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) slider_sizer.Add(self.center_y_button, 0, wx.ALIGN_CENTER_VERTICAL) mainSizer.Add(self.measure_btn, 0, wx.ALL | wx.ALIGN_CENTER, margin) self.mainPanel.SetAutoLayout(True) self.mainPanel.SetSizer(mainSizer) mainSizer.Fit(self.mainPanel) mainSizer.SetSizeHints(self.mainPanel) dialogSizer.Add(self.mainPanel, 0, wx.EXPAND) if self.bgPanel.IsShown(): dialogSizer.Add(self.bgPanel, 1, wx.EXPAND, 0) self.SetAutoLayout(True) self.SetSizer(dialogSizer) dialogSizer.Fit(self) dialogSizer.SetSizeHints(self) self.Layout() self.mainSizer = mainSizer self.dialogSizer = dialogSizer def InitFrame(self): """ Initialize the :class:`VisualWhitepointEditor`. """ hsvRect = self.hsvBitmap.GetClientRect() self._centre = wx.Point(hsvRect.x + hsvRect.width/2, hsvRect.y + hsvRect.height/2) self.CalcRects() self.SetSpinVals() self._initOver = True wx.CallAfter(self.Refresh) def show_handler(self, event): if (getattr(event, "IsShown", getattr(event, "GetShow", bool))() and sys.platform == "darwin" and intlist(mac_ver()[0].split(".")) >= [10, 10]): # Under Yosemite and up, if users use the default titlebar zoom # button to go fullscreen, they will be left with a black screen # after the window has been closed (shortcoming of wxMac). # It is possible to switch back to normal view by alt-tabbing, # but users need to be made aware of it. wx.CallAfter(self.notify, wrap(lang.getstr("fullscreen.osx.warning"), 80), icon=geticon(32, "dialog-warning"), timeout=0) event.Skip() def CalcRects(self): """ Calculates the brightness control user-selected rect. """ RECT_WIDTH = s(5) pt = self.PtFromAngle(self._colour.h, self._colour.s, self._centre) self._currentRect = wx.Rect(pt.x - RECT_WIDTH, pt.y - RECT_WIDTH, 2*RECT_WIDTH, 2*RECT_WIDTH) def DrawMarkers(self, dc=None): """ Draws the markers for all the controls. :param `dc`: an instance of :class:`DC`. If `dc` is ``None``, a :class:`ClientDC` is created on the fly. """ self.hsvBitmap.DrawMarkers(dc) self.brightCtrl.DrawMarkers(dc) self.bgBrightCtrl.DrawMarkers(dc) def DrawHSB(self): """ Refreshes the HSB colour wheel. """ self.hsvBitmap.Refresh() def DrawBright(self): """ Refreshes the brightness control. """ self.brightCtrl.Refresh() self.bgBrightCtrl.Refresh() def SetSpinVals(self): """ Sets the values for all the spin controls. """ self.redSpin.SetValue(self._colour.r) self.greenSpin.SetValue(self._colour.g) self.blueSpin.SetValue(self._colour.b) self.hueSpin.SetValue(self._colour.h) self.saturationSpin.SetValue(self._colour.s) self.brightnessSpin.SetValue(self._colour.v) self.SetPanelColours() self.update_patterngenerator() def update_patterngenerator(self): if self.patterngenerator: size = min((self.area_size_slider.GetValue() / float(self.area_size_slider.GetMax() - self.area_size_slider.GetMin())), 1) x = max(self.area_x_slider.GetValue() / float(self.area_x_slider.GetMax()) * (1 - size), 0) y = max(self.area_y_slider.GetValue() / float(self.area_y_slider.GetMax()) * (1 - size), 0) self.patterngenerator_config = x, y, size self.update_patterngenerator_event.set() def SetPanelColours(self): """ Assigns colours to the colour panels. """ self.newColourPanel.BackgroundColour = self._colour.GetPyColour() self._bgcolour.h = self._colour.h self._bgcolour.s = self._colour.s self._bgcolour.ToRGB() self.bgPanel.BackgroundColour = self._bgcolour.GetPyColour() self.bgPanel.Refresh() def OnCloseWindow(self, event): """ Handles the ``wx.EVT_CLOSE`` event for :class:`VisualWhitepointEditor`. :param `event`: a :class:`CloseEvent` event to be processed. """ if self.IsFullScreen(): self.ShowFullScreen(False) event.Skip() def OnKeyDown(self, event): """ Handles the ``wx.EVT_CHAR_HOOK`` event for :class:`VisualWhitepointEditor`. :param `event`: a :class:`KeyEvent` event to be processed. """ if event.GetKeyCode() == wx.WXK_ESCAPE: if self.IsFullScreen(): self.ShowFullScreen(False) self.Restore() else: self.Close() #elif event.KeyCode in (wx.WXK_LEFT, wx.WXK_RIGHT, wx.WXK_UP, #wx.WXK_DOWN): #self._colour.h += {wx.WXK_LEFT: 1, #wx.WXK_RIGHT: -1, #wx.WXK_UP: 0, #wx.WXK_DOWN: 0}[event.KeyCode] #if self._colour.h > 359: #self._colour.h = 0 #elif self._colour.h < 0: #self._colour.h = 359 #self._colour.s += {wx.WXK_LEFT: 0, #wx.WXK_RIGHT: 0, #wx.WXK_UP: 1, #wx.WXK_DOWN: -1}[event.KeyCode] #if self._colour.s > 255: #self._colour.s = 255 #elif self._colour.s < 0: #self._colour.s = 0 #print self._colour.h, self._colour.s #self._colour.ToRGB() #self.DrawAll() else: event.Skip() def PtFromAngle(self, angle, sat, center): """ Given the angle with respect to the x-axis, returns the point based on the saturation value. :param `angle`: a float representing an angle; :param `sat`: a float representing the colour saturation value; :param `center`: a float value representing the center. """ angle = deg2rad(angle) sat = min(sat*((self.hsvBitmap._bitmap.Size[0] - s(12)) / 2)/51.0, ((self.hsvBitmap._bitmap.Size[0] - s(12)) / 2)) x = sat*cos(angle) y = sat*sin(angle) pt = wx.Point(int(round(x)), -int(round(y))) pt.x += center.x pt.y += center.y return pt def OnSpinCtrl(self, event): """ Handles the ``wx.EVT_SPINCTRL`` event for RGB and HSB colours. :param `event`: a :class:`SpinEvent` event to be processed. """ obj = event.GetEventObject().Parent position = self.spinCtrls.index(obj) colourVal = event.GetString() try: colourVal = int(colourVal) except: wx.Bell() return attribute, maxVal = colourAttributes[position], colourMaxValues[position] self.AssignColourValue(attribute, colourVal, maxVal, position) def AssignColourValue(self, attribute, colourVal, maxVal, position): """ Common code to handle spin control changes. """ originalVal = getattr(self._colour, attribute) if colourVal != originalVal and self._initOver: if colourVal < 0: colourVal = 0 if colourVal > maxVal: colourVal = maxVal setattr(self._colour, attribute, colourVal) if position < 3: self._colour.ToHSV() else: self._colour.ToRGB() self.DrawAll() def DrawAll(self): """ Draws all the custom controls after a colour change. """ if self._initOver and not self._inDrawAll: self._inDrawAll = True self.hsvBitmap.DrawMarkers() self.brightCtrl.DrawMarkers() self.CalcRects() self.DrawHSB() self.DrawBright() self.SetSpinVals() self._inDrawAll = False def GetColourData(self): """ Returns a wxPython compatible :class:`ColourData`. """ self._colourData.SetColour(self._colour.GetPyColour()) return self._colourData def GetRGBAColour(self): """ Returns a 4-elements tuple of red, green, blue, alpha components. """ return (self._colour.r, self._colour.g, self._colour.b, self._colour._alpha) def GetHSVAColour(self): """ Returns a 4-elements tuple of hue, saturation, brightness, alpha components. """ return (self._colour.h, self._colour.s, self._colour.v, self._colour._alpha) def EndModal(self, returncode=wx.ID_OK): return returncode def MakeModal(self, makemodal=False): pass def Pulse(self, msg=""): return self.keepGoing, False def Resume(self): self.keepGoing = True def UpdateProgress(self, value=None, msg=""): return self.Pulse(msg) def UpdatePulse(self, msg=""): return self.Pulse(msg) def area_handler(self, event=None): scale = self.area_size_slider.Value / 100.0 x = self.area_x_slider.Value / 1000.0 y = self.area_y_slider.Value / 1000.0 w, h = (int(round(self.default_size * scale)), ) * 2 self.bgPanel.MinSize = -1, -1 self.newColourPanel.Size = w, h self.bgPanel.MinSize = w + s(24), h + s(24) bg_w, bg_h = (float(v) for v in self.bgPanel.Size) self.newColourPanel.Position = ((bg_w - (w)) * x), ((bg_h - (h)) * y) if event: event.Skip() if event and event.GetEventType() == wx.EVT_SIZE.evtType[0]: wx.CallAfter(self.area_handler) else: self.bgPanel.Refresh() self.update_patterngenerator() def center_x_handler(self, event): self.area_x_slider.SetValue(500) self.area_handler() def center_y_handler(self, event): self.area_y_slider.SetValue(500) self.area_handler() def close_pane_handler(self, event): event.Veto() # Prevent closing of pane self.dock_pane() def dock_pane(self): self._mgr.GetPane("mainPanel").Dock().CloseButton(False) self._mgr.Update() self.mainPanel.Refresh() self.area_handler() def float_pane_handler(self, event): if event.GetEventType() == aui.EVT_AUI_PANE_FLOATED.evtType[0]: pos = [self.Position[i] + (self.Size[i] - self.ClientSize[i]) / {0: 2, 1: 1}[i] + s(10) for i in (0, 1)] pos[0] += self.mainPanel.Position[0] pos[1] -= (self.Size[0] - self.ClientSize[0]) / 2 self._mgr.GetPane("mainPanel").FloatingPosition(pos).CloseButton(True) wx.CallAfter(self.area_handler) else: wx.CallAfter(self.dock_pane) def flush(self): pass def maximize_handler(self, event): """ Handles maximize and fullscreen events """ #print '_isfullscreen?', getattr(self, "_isfullscreen", False) if not getattr(self, "_isfullscreen", False): self._isfullscreen = True #print 'Setting fullscreen...' self.ShowFullScreen(True) #print '...done setting fullscreen.' wx.CallAfter(self.notify, lang.getstr("fullscreen.message")) def move_handler(self, event): event.Skip() display = self.GetDisplay() if not self._pm._display or display.Geometry != self._pm._display.Geometry: self.set_area_size_slider_max() self.set_default_size() self.area_handler() def measure(self, event): if (not self.Parent or not hasattr(self.Parent, "ambient_measure_handler") or not self.Parent.worker.displays or not self.Parent.worker.instruments): wx.Bell() return self.measure_btn.Disable() self.setcfg() self.Parent.ambient_measure_handler(event) def notify(self, msg, title=None, icon=None, timeout=-1): # Notification needs to have this frame as toplevel parent so key events # bubble to parent #print 'Showing fullscreen notification' if getattr(self, "notification", None): self.notification.fade("out") self.notification = TaskBarNotification(icon or geticon(32, "dialog-information"), title or self.Title, msg, self.bgPanel, (-1, s(32)), timeout) self.notification.Center(wx.HORIZONTAL) def size_handler(self, event): if getattr(self, "_isfullscreen", False): if getattr(self, "notification", None): #print 'Fading out notification' self.notification.fade("out") wx.CallAfter(self._check_fullscreen) self.area_handler(event) def _check_fullscreen(self): #print '_isfullscreen?', getattr(self, "_isfullscreen", False) if getattr(self, "_isfullscreen", False): self._isfullscreen = self.IsFullScreen() #print 'IsFullScreen()?', self._isfullscreen def start_timer(self, ms=50): pass def stop_timer(self): pass def reset_handler(self, event): RGB = [] for attribute in "rgb": RGB.append(defaults["whitepoint.visual_editor." + attribute]) self._colourData.SetColour(wx.Colour(*RGB)) self._colour.r, self._colour.g, self._colour.b = self._colourData.GetColour()[:3] self._colour.ToHSV() self._bgcolour.v = defaults["whitepoint.visual_editor.bg_v"] self.DrawAll() def set_area_size_slider_max(self): # Set max value according to display size maxv = 1000 if RDSMM: geometry = self.GetDisplay().Geometry.Get() display_no = get_argyll_display_number(geometry) if display_no is not None: size_mm = RDSMM.RealDisplaySizeMM(display_no) if not 0 in size_mm: self.display_size_mm[geometry] = [float(v) for v in size_mm] maxv = int(round(max(size_mm) / 100.0 * 100)) if maxv > 100: self.area_size_slider.SetMax(maxv) if self.area_size_slider.GetValue() > self.area_size_slider.GetMax(): self.area_size_slider.SetValue(maxv) def set_default_size(self): geometry = self.GetDisplay().Geometry.Get() size_mm = self.display_size_mm.get(geometry) if size_mm: px_per_mm = max(geometry[2] / size_mm[0], geometry[3] / size_mm[1]) self.default_size = px_per_mm * 100 else: self.default_size = 300 def setcfg(self): for attribute in "rgb": value = getattr(self._colour, attribute) setcfg("whitepoint.visual_editor." + attribute, value) setcfg("whitepoint.visual_editor.bg_v", self._bgcolour.v) x, y = (ctrl.Value / 1000.0 for ctrl in (self.area_x_slider, self.area_y_slider)) scale = self.area_size_slider.Value / 100.0 setcfg("dimensions.measureframe.whitepoint.visual_editor", "%f,%f,%f" % (x, y, scale)) def write(self, txt): pass def zoomnormal_handler(self, event): scale = float(defaults["dimensions.measureframe.whitepoint.visual_editor"].split(",")[2]) self.area_size_slider.SetValue(int(round(scale * 100))) self.area_handler() if __name__ == "__main__": from wxwindows import BaseApp initcfg() lang.init() app = BaseApp(0) worker = Worker() worker.enumerate_displays_and_ports(check_lut_access=False, enumerate_ports=False) app.TopWindow = VisualWhitepointEditor(None) app.TopWindow.Show() app.MainLoop() DisplayCAL-3.5.0.0/DisplayCAL/wxVRML2X3D.py0000644000076500000000000001717613223332672017554 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import os import sys from meta import name as appname from safe_print import safe_print from util_os import launch_file, make_win32_compatible_long_path, waccess from util_str import safe_unicode from worker import Worker, show_result_dialog from wxaddons import wx from wxfixes import GenBitmapButton as BitmapButton from wxwindows import BaseApp, BaseFrame, FileDrop import config import localization as lang import x3dom class VRML2X3DFrame(BaseFrame): def __init__(self, html, embed, view, force, cache): BaseFrame.__init__(self, None, wx.ID_ANY, lang.getstr("vrml_to_x3d_converter"), style=wx.DEFAULT_FRAME_STYLE & ~(wx.MAXIMIZE_BOX | wx.RESIZE_BORDER), name="vrml2x3dframe") self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname + "-VRML-to-X3D-converter")) self.Bind(wx.EVT_CLOSE, self.OnClose) self.cache = cache self.embed = embed self.force = force self.html = html self.worker = Worker(self) sizer = wx.BoxSizer(wx.HORIZONTAL) self.SetSizer(sizer) panel = wx.Panel(self) sizer.Add(panel) panelsizer = wx.BoxSizer(wx.HORIZONTAL) panel.SetSizer(panelsizer) self.btn = BitmapButton(panel, wx.ID_ANY, config.geticon(256, "3d-primitives"), style=wx.NO_BORDER) self.btn.SetToolTipString(lang.getstr("file.select")) self.btn.Bind(wx.EVT_BUTTON, lambda event: vrmlfile2x3dfile(None, html=html, embed=embed, view=view, force=force, cache=cache, worker=self.worker)) self.droptarget = FileDrop(self) vrml_drop_handler = lambda vrmlpath: vrmlfile2x3dfile(vrmlpath, html=html, embed=embed, view=view, force=force, cache=cache, worker=self.worker) self.droptarget.drophandlers = { ".vrml": vrml_drop_handler, ".vrml.gz": vrml_drop_handler, ".wrl": vrml_drop_handler, ".wrl.gz": vrml_drop_handler, ".wrz": vrml_drop_handler } self.btn.SetDropTarget(self.droptarget) panelsizer.Add(self.btn, flag=wx.ALL, border=12) self.Fit() self.SetMinSize(self.GetSize()) self.SetMaxSize(self.GetSize()) def OnClose(self, event): # Hide first (looks nicer) self.Hide() # Need to use CallAfter to prevent hang under Windows if minimized wx.CallAfter(self.Destroy) def get_commands(self): return (self.get_common_commands() + ["VRML-to-X3D-converter [filename...]", "load "]) def process_data(self, data): if data[0] in ("VRML-to-X3D-converter", "load"): if self.IsIconized(): self.Restore() self.Raise() if len(data) > 1: self.droptarget.OnDropFiles(0, 0, data[1:]) return "ok" return "invalid" def main(): if "--help" in sys.argv[1:]: safe_print("Usage: %s [--embed] [--no-gui] [--view] [FILE]" % sys.argv[0]) safe_print("Convert VRML file to X3D") safe_print("The output is written to FILENAME.x3d(.html)") safe_print("") safe_print(" --embed Embed viewer components in HTML instead of " "referencing them") safe_print(" --force Force fresh download of viewer components") safe_print(" --no-cache Don't use viewer components cache (only " "uses existing cache if") safe_print(" embedding components, can be overridden " "with --force)") safe_print(" --no-gui Don't show GUI (terminal mode)") safe_print(" --no-html Don't generate HTML file") safe_print(" --view View the generated file (if --no-gui)") safe_print(" FILE Filename of VRML file to convert") return config.initcfg("VRML-to-X3D-converter") lang.init() lang.update_defaults() cache = not "--no-cache" in sys.argv[1:] embed = "--embed" in sys.argv force = "--force" in sys.argv html = not "--no-html" in sys.argv[1:] if "--no-gui" in sys.argv[1:]: view = "--view" in sys.argv[1:] for arg in sys.argv[1:]: if os.path.isfile(arg): vrmlfile2x3dfile(safe_unicode(arg), html=html, embed=embed, view=view, force=force, cache=cache) else: view = not "--no-view" in sys.argv[1:] app = BaseApp(0) app.TopWindow = VRML2X3DFrame(html, embed, view, force, cache) if sys.platform == "darwin": app.TopWindow.init_menubar() wx.CallLater(1, _main, app) app.MainLoop() def _main(app): app.TopWindow.listen() app.process_argv() app.TopWindow.Show() def vrmlfile2x3dfile(vrmlpath=None, x3dpath=None, html=True, embed=False, view=False, force=False, cache=True, worker=None): """ Convert VRML to HTML. Output is written to .x3d.html unless you set x3dpath to desired output path, or False to be prompted for an output path. """ while not vrmlpath or not os.path.isfile(vrmlpath): if "--no-gui" in sys.argv[1:]: if not vrmlpath or vrmlpath.startswith("--"): safe_print("No filename given.") else: safe_print("%r is not a file." % vrmlpath) sys.exit(1) if not wx.GetApp(): app = BaseApp(0) defaultDir, defaultFile = config.get_verified_path("last_vrml_path") dlg = wx.FileDialog(None, lang.getstr("file.select"), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.vrml") + "|*.vrml;*.vrml.gz;*.wrl.gz;*.wrl;*.wrz", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.Center(wx.BOTH) result = dlg.ShowModal() vrmlpath = dlg.GetPath() dlg.Destroy() if result != wx.ID_OK: return config.setcfg("last_vrml_path", vrmlpath) config.writecfg(module="VRML-to-X3D-converter", options=("last_vrml_path", )) filename, ext = os.path.splitext(vrmlpath) if x3dpath is None: x3dpath = filename + ".x3d" if x3dpath: dirname = os.path.dirname(x3dpath) while not x3dpath or not waccess(dirname, os.W_OK): if "--no-gui" in sys.argv[1:]: if not x3dpath: safe_print("No HTML output filename given.") else: safe_print("%r is not writable." % dirname) sys.exit(1) if not wx.GetApp(): app = BaseApp(0) if x3dpath: defaultDir, defaultFile = os.path.split(x3dpath) else: defaultFile = os.path.basename(filename) + ".x3d" dlg = wx.FileDialog(None, lang.getstr("error.access_denied.write", dirname), defaultDir=defaultDir, defaultFile=defaultFile, wildcard=lang.getstr("filetype.x3d") + "|*.x3d", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT) dlg.Center(wx.BOTH) result = dlg.ShowModal() dlg.Destroy() if result != wx.ID_OK: return x3dpath = dlg.GetPath() dirname = os.path.dirname(x3dpath) vrmlpath, x3dpath = [safe_unicode(path) for path in (vrmlpath, x3dpath)] if sys.platform == "win32": vrmlpath = make_win32_compatible_long_path(vrmlpath) x3dpath = make_win32_compatible_long_path(x3dpath) if html: finalpath = x3dpath + ".html" if sys.platform == "win32": finalpath = make_win32_compatible_long_path(finalpath) x3dpath = finalpath[:-5] else: finalpath = x3dpath if worker: worker.clear_cmd_output() worker.start(lambda result: show_result_dialog(result, wx.GetApp().GetTopWindow()) if isinstance(result, Exception) else result and view and launch_file(finalpath), x3dom.vrmlfile2x3dfile, wargs=(vrmlpath, x3dpath, html, embed, force, cache, worker), progress_title=lang.getstr("vrml_to_x3d_converter"), progress_start=1, resume=worker.progress_wnd and worker.progress_wnd.IsShownOnScreen(), fancy=False) else: result = x3dom.vrmlfile2x3dfile(vrmlpath, x3dpath, html, embed, force, cache, None) if not isinstance(result, Exception) and result and view: launch_file(finalpath) else: sys.exit(1) if __name__ == "__main__": main() DisplayCAL-3.5.0.0/DisplayCAL/wxwindows.py0000644000076500000000000065460413242301247020063 0ustar devwheel00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement from datetime import datetime from time import gmtime, sleep, strftime, time import errno import math import os import re import signal import socket import string import subprocess as sp import sys import tarfile import threading import warnings import xml.parsers.expat import zipfile import demjson import ICCProfile as ICCP import audio import config from config import (defaults, getbitmap, getcfg, geticon, get_data_path, get_default_dpi, get_verified_path, pyname, setcfg, confighome, appbasename, logdir, set_default_app_dpi) from debughelpers import (Error, DownloadError, Info, UnloggedError, UnloggedInfo, UnloggedWarning, Warn, getevtobjname, getevttype, handle_error) from log import log as log_, safe_print from meta import name as appname from network import get_valid_host from options import debug from ordereddict import OrderedDict from network import ScriptingClientSocket from util_io import StringIOu as StringIO from util_os import get_program_file, launch_file, waccess from util_str import safe_str, safe_unicode, wrap from util_xml import dict2xml from wxaddons import (CustomEvent, FileDrop as _FileDrop, gamma_encode, get_parent_frame, get_platform_window_decoration_size, wx, BetterWindowDisabler, BetterTimer, EVT_BETTERTIMER) from wexpect import split_command_line from wxfixes import (GenBitmapButton, GenButton, GTKMenuItemGetFixedLabel, PlateButton, ThemedGenButton, adjust_font_size_for_gcdc, get_bitmap_disabled, get_dc_font_size, platebtn, set_bitmap_labels, wx_Panel) from lib.agw import labelbook, pygauge from lib.agw.gradientbutton import GradientButton, CLICK, HOVER from lib.agw.fourwaysplitter import (_TOLERANCE, FLAG_CHANGED, FLAG_PRESSED, NOWHERE, FourWaySplitter, FourWaySplitterEvent) import localization as lang import util_str import floatspin try: from wx.lib.agw import aui from wx.lib.agw.aui import AuiDefaultTabArt except ImportError: from wx import aui from wx.aui import PyAuiTabArt as AuiDefaultTabArt import wx.lib.filebrowsebutton as filebrowse from wx.lib.agw import hyperlink from wx.lib import fancytext from wx.lib.statbmp import GenStaticBitmap import wx.html taskbar = None if sys.platform == "win32" and sys.getwindowsversion() >= (6, 1): try: import taskbar except Exception, exception: safe_print(exception) numpad_keycodes = [wx.WXK_NUMPAD0, wx.WXK_NUMPAD1, wx.WXK_NUMPAD2, wx.WXK_NUMPAD3, wx.WXK_NUMPAD4, wx.WXK_NUMPAD5, wx.WXK_NUMPAD6, wx.WXK_NUMPAD7, wx.WXK_NUMPAD8, wx.WXK_NUMPAD9, wx.WXK_NUMPAD_ADD, wx.WXK_NUMPAD_DECIMAL, wx.WXK_NUMPAD_ENTER, wx.WXK_NUMPAD_EQUAL, wx.WXK_NUMPAD_DIVIDE, wx.WXK_NUMPAD_MULTIPLY, wx.WXK_NUMPAD_SEPARATOR, wx.WXK_NUMPAD_SUBTRACT] nav_keycodes = [wx.WXK_DOWN, wx.WXK_END, wx.WXK_HOME, wx.WXK_LEFT, wx.WXK_PAGEDOWN, wx.WXK_PAGEUP, wx.WXK_RIGHT, wx.WXK_TAB, wx.WXK_UP, wx.WXK_NUMPAD_DOWN, wx.WXK_NUMPAD_END, wx.WXK_NUMPAD_HOME, wx.WXK_NUMPAD_LEFT, wx.WXK_NUMPAD_PAGEDOWN, wx.WXK_NUMPAD_PAGEUP, wx.WXK_NUMPAD_RIGHT, wx.WXK_NUMPAD_UP] processing_keycodes = [wx.WXK_ESCAPE, wx.WXK_RETURN, wx.WXK_INSERT, wx.WXK_DELETE, wx.WXK_BACK] modifier_keycodes = [wx.WXK_SHIFT, wx.WXK_CONTROL, wx.WXK_ALT, wx.WXK_COMMAND] def Property(func): return property(**func()) class AboutDialog(wx.Dialog): def __init__(self, *args, **kwargs): kwargs["style"] = wx.DEFAULT_DIALOG_STYLE & ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX) kwargs["name"] = "aboutdialog" wx.Dialog.__init__(self, *args, **kwargs) # Set an icon so text isn't crammed to the left of the titlebar under # Windows (other platforms?) self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.sizer) if "gtk3" in wx.PlatformInfo: # Fix background color not working for panels under GTK3 self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) if "gtk3" in wx.PlatformInfo: OnEraseBackground = wx_Panel.__dict__["OnEraseBackground"] def OnClose(self, event): self.Hide() def Layout(self): self.sizer.SetSizeHints(self) self.sizer.Layout() def add_items(self, items): self.ok = ThemedGenButton(self, -1, lang.getstr("ok")) self.Bind(wx.EVT_BUTTON, self.OnClose, id=self.ok.GetId()) items.extend([self.ok, (1, 16)]) for item in items: if (not isinstance(item, wx.Window) and hasattr(item, "__iter__") and filter(lambda subitem: not isinstance(subitem, (int, float)), item)): sizer = wx.BoxSizer(wx.HORIZONTAL) self.add_item(sizer, self.sizer) for subitem in item: self.add_item(subitem, sizer) else: self.add_item(item, self.sizer) self.ok.SetDefault() self.ok.SetFocus() def add_item(self, item, sizer): if isinstance(item, (HyperLinkCtrl, ThemedGenButton)): item.BackgroundColour = self.BackgroundColour if isinstance(item, wx.Window): pointsize = 10 font = item.GetFont() if item.GetLabel() and font.GetPointSize() > pointsize: font.SetPointSize(pointsize) item.SetFont(font) flag = wx.ALIGN_CENTER_HORIZONTAL if isinstance(item, (wx.Panel, wx.PyPanel)): flag |= wx.EXPAND elif sizer is self.sizer: flag |= wx.LEFT | wx.RIGHT sizer.Add(item, 0, flag, 12) class AnimatedBitmap(wx.PyControl): """ Animated bitmap """ def __init__(self, parent, id=wx.ID_ANY, bitmaps=None, range=(0, -1), loop=True, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.NO_BORDER): """ Create animated bitmap bitmaps should be an array of bitmaps. range should be the indexes of the range of frames that should be looped. -1 means last frame. """ wx.PyControl.__init__(self, parent, id, pos, size, style) self._minsize = size self.SetBitmaps(bitmaps or [], range, loop) # Avoid flickering under Windows self.Bind(wx.EVT_ERASE_BACKGROUND, lambda event: None) self.Bind(wx.EVT_PAINT, self.OnPaint) self._timer = BetterTimer(self) self.Bind(EVT_BETTERTIMER, self.OnTimer, self._timer) self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy) def OnDestroy(self, event): self._timer.Stop() del self._timer def DoGetBestSize(self): return self._minsize def OnPaint(self, event): dc = wx.BufferedPaintDC(self) dc.SetBackground(wx.Brush(self.Parent.BackgroundColour)) dc.Clear() if self._bitmaps: if self.frame > len(self._bitmaps) - 1: self.frame = len(self._bitmaps) - 1 dc.DrawBitmap(self._bitmaps[self.frame], 0, 0, True) def OnTimer(self, event): first_frame, last_frame = self.range if first_frame < 0: first_frame += len(self._bitmaps) if last_frame < 0: last_frame += len(self._bitmaps) frame = self.frame if frame < last_frame: frame += 1 elif self.loop: frame = first_frame if frame != self.frame: self.frame = frame self.Refresh() def Play(self, fps=24): self._timer.Start(1000.0 / fps) def Stop(self): self._timer.Stop() def SetBitmaps(self, bitmaps, range=(0, -1), loop=True): w, h = self._minsize for bitmap in bitmaps: w = max(bitmap.Size[0], w) h = max(bitmap.Size[0], h) self._minsize = w, h self._bitmaps = bitmaps self.loop = loop self.range = range self.frame = 0 class AuiBetterTabArt(AuiDefaultTabArt): def DrawTab(self, dc, wnd, page, in_rect, close_button_state, paint_control=False): """ Draws a single tab. :param `dc`: a :class:`DC` device context; :param `wnd`: a :class:`Window` instance object; :param `page`: the tab control page associated with the tab; :param Rect `in_rect`: rectangle the tab should be confined to; :param integer `close_button_state`: the state of the close button on the tab; :param bool `paint_control`: whether to draw the control inside a tab (if any) on a :class:`MemoryDC`. """ # if the caption is empty, measure some temporary text caption = page.caption if not caption: caption = "Xj" dc.SetFont(self._selected_font) if hasattr(dc, "GetFullMultiLineTextExtent"): # Phoenix selected_textx, selected_texty = dc.GetMultiLineTextExtent(caption) else: # Classic selected_textx, selected_texty, dummy = dc.GetMultiLineTextExtent(caption) dc.SetFont(self._normal_font) if hasattr(dc, "GetFullMultiLineTextExtent"): # Phoenix normal_textx, normal_texty = dc.GetMultiLineTextExtent(caption) else: # Classic normal_textx, normal_texty, dummy = dc.GetMultiLineTextExtent(caption) control = page.control # figure out the size of the tab tab_size, x_extent = self.GetTabSize(dc, wnd, page.caption, page.bitmap, page.active, close_button_state, control) tab_height = self._tab_ctrl_height - 3 tab_width = tab_size[0] tab_x = in_rect.x tab_y = in_rect.y + in_rect.height - tab_height caption = page.caption # select pen, brush and font for the tab to be drawn if page.active: dc.SetFont(self._selected_font) textx, texty = selected_textx, selected_texty else: dc.SetFont(self._normal_font) textx, texty = normal_textx, normal_texty if not page.enabled: dc.SetTextForeground(self._tab_disabled_text_colour) pagebitmap = page.dis_bitmap else: dc.SetTextForeground(self._tab_text_colour(page)) pagebitmap = page.bitmap # create points that will make the tab outline clip_width = tab_width if tab_x + clip_width > in_rect.x + in_rect.width: clip_width = in_rect.x + in_rect.width - tab_x # since the above code above doesn't play well with WXDFB or WXCOCOA, # we'll just use a rectangle for the clipping region for now -- dc.SetClippingRegion(tab_x, tab_y, clip_width+1, tab_height-3) border_points = [wx.Point() for i in xrange(6)] agwFlags = self.GetAGWFlags() if agwFlags & aui.AUI_NB_BOTTOM: border_points[0] = wx.Point(tab_x, tab_y) border_points[1] = wx.Point(tab_x, tab_y+tab_height-6) border_points[2] = wx.Point(tab_x+2, tab_y+tab_height-4) border_points[3] = wx.Point(tab_x+tab_width-2, tab_y+tab_height-4) border_points[4] = wx.Point(tab_x+tab_width, tab_y+tab_height-6) border_points[5] = wx.Point(tab_x+tab_width, tab_y) else: #if (agwFlags & aui.AUI_NB_TOP) border_points[0] = wx.Point(tab_x, tab_y+tab_height-4) border_points[1] = wx.Point(tab_x, tab_y+2) border_points[2] = wx.Point(tab_x+2, tab_y) border_points[3] = wx.Point(tab_x+tab_width-2, tab_y) border_points[4] = wx.Point(tab_x+tab_width, tab_y+2) border_points[5] = wx.Point(tab_x+tab_width, tab_y+tab_height-4) # TODO: else if (agwFlags & aui.AUI_NB_LEFT) # TODO: else if (agwFlags & aui.AUI_NB_RIGHT) drawn_tab_yoff = border_points[1].y drawn_tab_height = border_points[0].y - border_points[1].y if page.active: # draw active tab # draw base background colour r = wx.Rect(tab_x, tab_y, tab_width, tab_height) dc.SetPen(self._base_colour_pen) dc.SetBrush(self._base_colour_brush) dc.DrawRectangle(r.x+1, r.y+1, r.width-1, r.height-4) # this white helps fill out the gradient at the top of the tab dc.SetPen( wx.Pen(self._tab_gradient_highlight_colour) ) dc.SetBrush( wx.Brush(self._tab_gradient_highlight_colour) ) dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height-4) # these two points help the rounded corners appear more antialiased dc.SetPen(self._base_colour_pen) dc.DrawPoint(r.x+2, r.y+1) dc.DrawPoint(r.x+r.width-2, r.y+1) # set rectangle down a bit for gradient drawing r.SetHeight(r.GetHeight()/2) r.x += 2 r.width -= 3 r.y += r.height r.y -= 2 # draw gradient background top_colour = self._tab_bottom_colour bottom_colour = self._tab_top_colour dc.GradientFillLinear(r, bottom_colour, top_colour, wx.NORTH) else: # draw inactive tab r = wx.Rect(tab_x, tab_y+1, tab_width, tab_height-3) # start the gradent up a bit and leave the inside border inset # by a pixel for a 3D look. Only the top half of the inactive # tab will have a slight gradient r.x += 2 r.y += 1 r.width -= 3 r.height /= 2 # -- draw top gradient fill for glossy look top_colour = self._tab_inactive_top_colour bottom_colour = self._tab_inactive_bottom_colour dc.GradientFillLinear(r, bottom_colour, top_colour, wx.NORTH) r.y += r.height r.y -= 1 # -- draw bottom fill for glossy look top_colour = self._tab_inactive_bottom_colour bottom_colour = self._tab_inactive_bottom_colour dc.GradientFillLinear(r, top_colour, bottom_colour, wx.SOUTH) # draw tab outline dc.SetPen(self._border_pen) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawPolygon(border_points) # there are two horizontal grey lines at the bottom of the tab control, # this gets rid of the top one of those lines in the tab control if page.active: if agwFlags & aui.AUI_NB_BOTTOM: dc.SetPen(wx.Pen(self._background_bottom_colour)) # TODO: else if (agwFlags & aui.AUI_NB_LEFT) # TODO: else if (agwFlags & aui.AUI_NB_RIGHT) else: # for aui.AUI_NB_TOP dc.SetPen(self._base_colour_pen) dc.DrawLine(border_points[0].x+1, border_points[0].y, border_points[5].x, border_points[5].y) text_offset = tab_x + 8 close_button_width = 0 if close_button_state != aui.AUI_BUTTON_STATE_HIDDEN: close_button_width = self._active_close_bmp.GetWidth() if agwFlags & aui.AUI_NB_CLOSE_ON_TAB_LEFT: text_offset += close_button_width - 5 bitmap_offset = 0 if pagebitmap.IsOk(): bitmap_offset = tab_x + 8 if agwFlags & aui.AUI_NB_CLOSE_ON_TAB_LEFT and close_button_width: bitmap_offset += close_button_width - 5 # draw bitmap dc.DrawBitmap(pagebitmap, bitmap_offset, drawn_tab_yoff + (drawn_tab_height/2) - (pagebitmap.GetHeight()/2), True) text_offset = bitmap_offset + pagebitmap.GetWidth() text_offset += 3 # bitmap padding else: if agwFlags & aui.AUI_NB_CLOSE_ON_TAB_LEFT == 0 or not close_button_width: text_offset = tab_x + 8 draw_text = aui.ChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width) ypos = drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1 offset_focus = text_offset if control is not None: try: if control.GetPosition() != wx.Point(text_offset+1, ypos): control.SetPosition(wx.Point(text_offset+1, ypos)) if not control.IsShown(): control.Show() if paint_control: bmp = aui.TakeScreenShot(control.GetScreenRect()) dc.DrawBitmap(bmp, text_offset+1, ypos, True) controlW, controlH = control.GetSize() text_offset += controlW + 4 textx += controlW + 4 except wx.PyDeadObjectError: pass # draw tab text if hasattr(dc, "GetFullMultiLineTextExtent"): # Phoenix rectx, recty = dc.GetMultiLineTextExtent(draw_text) else: # Classic rectx, recty, dummy = dc.GetMultiLineTextExtent(draw_text) textfg = dc.GetTextForeground() shadow = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DLIGHT) dc.SetTextForeground(shadow) dc.DrawLabel(draw_text, wx.Rect(text_offset + 1, ypos + 1, rectx, recty)) dc.SetTextForeground(textfg) dc.DrawLabel(draw_text, wx.Rect(text_offset, ypos, rectx, recty)) # draw focus rectangle if (agwFlags & aui.AUI_NB_NO_TAB_FOCUS) == 0: self.DrawFocusRectangle(dc, page, wnd, draw_text, offset_focus, bitmap_offset, drawn_tab_yoff, drawn_tab_height, rectx, recty) out_button_rect = wx.Rect() # draw close button if necessary if close_button_state != aui.AUI_BUTTON_STATE_HIDDEN: bmp = self._disabled_close_bmp if close_button_state == aui.AUI_BUTTON_STATE_HOVER: bmp = self._hover_close_bmp elif close_button_state == aui.AUI_BUTTON_STATE_PRESSED: bmp = self._pressed_close_bmp shift = (agwFlags & aui.AUI_NB_BOTTOM and [1] or [0])[0] if agwFlags & aui.AUI_NB_CLOSE_ON_TAB_LEFT: rect = wx.Rect(tab_x + 4, tab_y + (tab_height - bmp.GetHeight())/2 - shift, close_button_width, tab_height) else: rect = wx.Rect(tab_x + tab_width - close_button_width - 1, tab_y + (tab_height - bmp.GetHeight())/2 - shift, close_button_width, tab_height) rect = aui.IndentPressedBitmap(rect, close_button_state) dc.DrawBitmap(bmp, rect.x, rect.y, True) out_button_rect = rect out_tab_rect = wx.Rect(tab_x, tab_y, tab_width, tab_height) dc.DestroyClippingRegion() return out_tab_rect, out_button_rect, x_extent def SetDefaultColours(self, base_colour=None): """ Sets the default colours, which are calculated from the given base colour. :param `base_colour`: an instance of :class:`Colour`. If defaulted to ``None``, a colour is generated accordingly to the platform and theme. """ if base_colour is None: base_colour = aui.GetBaseColour() self.SetBaseColour( base_colour ) self._border_colour = aui.StepColour(base_colour, 75) self._border_pen = wx.Pen(self._border_colour) self._background_top_colour = aui.StepColour(self._base_colour, 90) self._background_bottom_colour = aui.StepColour(self._base_colour, 120) self._tab_top_colour = self._base_colour self._tab_bottom_colour = aui.StepColour(self._base_colour, 130) self._tab_gradient_highlight_colour = aui.StepColour(self._base_colour, 130) self._tab_inactive_top_colour = self._background_top_colour self._tab_inactive_bottom_colour = aui.StepColour(self._base_colour, 110) self._tab_text_colour = lambda page: page.text_colour self._tab_disabled_text_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT) class BaseApp(wx.App): """ Application base class implementing common functionality. """ _exithandlers = [] _query_end_session = None def __init__(self, *args, **kwargs): # Fix sys.prefix for SetInstallPrefix used inside wx.App which does not # decode to Unicode when calling SetInstallPrefix. DisplayCAL when # bundled by Py2App can't be run from a path containing Unicode # characters under Mac OS X otherwise. prefix = sys.prefix sys.prefix = safe_unicode(sys.prefix) wx.App.__init__(self, *args, **kwargs) # Restore prefix sys.prefix = prefix if (not kwargs.get("clearSigInt", True) or len(args) == 4 and not args[3]): # Install our own SIGINT handler so we can do cleanup on receiving # SIGINT safe_print("Installing SIGINT handler") signal.signal(signal.SIGINT, self.signal_handler) # This timer allows processing of SIGINT / CTRL+C, because normally # with clearSigInt=False, SIGINT / CTRL+C are only processed during # UI events self._signal_timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, lambda e: None, self._signal_timer) self._signal_timer.Start(100) def signal_handler(self, signum, frame): if signum == signal.SIGINT: safe_print("Received SIGINT") safe_print("Sending query to end session...") self.ProcessEvent(wx.CloseEvent(wx.EVT_QUERY_END_SESSION.evtType[0])) def OnInit(self): self.AppName = pyname set_default_app_dpi() # We use a lock so we can make sure the exit handlers are executed # properly before we actually exit when receiving OS # logout/reboot/shutdown events. This is needed because it is not # guaranteed that when we receive EVT_QUERY_END_SESSION and close # the main application window (which will normally exit the main event # loop unless BaseApp.ExitOnFrameDelete is False) that OnExit (which'll # execute the exit handlers) will run right away because normally it'll # run after the main event loop exits (i.e. in the next iteration of the # main loop after an implicit or explicit call of ExitMainLoop). # Also, we need to call OnExit explicitly when receiving EVT_END_SESSION # because there will be no next iteration of the event loop (the OS # simply kills the application after the handler is executed). If OnExit # was already called before as a result of receiving # EVT_QUERY_END_SESSION and exiting the main event loop (remember this # is not guaranteed because of the way the event loop works!) and did # already finish, this'll do nothing and we can just exit. If OnExit is # still executing the exit handlers and thus holds the lock, the lock # makes sure that we wait for OnExit to finish before we explicitly call # sys.exit(0) (which'll make sure exit handlers registered by atexit # will run) to finally exit for good before the OS tries to kill the # application. self._lock = threading.Lock() self.Bind(wx.EVT_QUERY_END_SESSION, self.query_end_session) self.Bind(wx.EVT_END_SESSION, self.end_session) return True def MacOpenFiles(self, paths): if (self.TopWindow and isinstance(getattr(self.TopWindow, "droptarget", None), FileDrop)): self.TopWindow.droptarget.OnDropFiles(0, 0, paths) def MacReopenApp(self): if self.TopWindow and self.TopWindow.IsShownOnScreen(): self.TopWindow.Raise() def process_argv(self, count=0): paths = [] for arg in sys.argv[1:]: if os.path.isfile(arg): paths.append(safe_unicode(arg)) if len(paths) == count: break if paths: self.MacOpenFiles(paths) return paths def OnExit(self): safe_print("Executing BaseApp.OnExit()") with self._lock: if BaseApp._exithandlers: safe_print("Running application exit handlers") BaseApp._run_exitfuncs() if hasattr(wx.App, "OnExit"): return wx.App.OnExit(self) else: return 0 @staticmethod def _run_exitfuncs(): """run any registered exit functions _exithandlers is traversed in reverse order so functions are executed last in, first out. """ # Inspired by python's 'atexit' module. # It's important that the exit handlers run *before* the actual main # loop exits, otherwise they might not run at all if the app is closed # externally (e.g. if the OS asks the app to close on logout). # Using the 'atexit' module will NOT work! exc_info = None while BaseApp._exithandlers: func, args, kwargs = BaseApp._exithandlers.pop() try: func(*args, **kwargs) except SystemExit: exc_info = sys.exc_info() except: import traceback safe_print("Error in BaseApp._run_exitfuncs:") safe_print(traceback.format_exc()) if exc_info is not None: raise exc_info[0], exc_info[1], exc_info[2] @staticmethod def register_exitfunc(func, *args, **kwargs): BaseApp._exithandlers.append((func, args, kwargs)) def query_end_session(self, event): safe_print("Received query to end session") if event.CanVeto(): safe_print("Can veto") else: safe_print("Cannot veto") if self.TopWindow and self.TopWindow is not self._query_end_session: if not isinstance(self.TopWindow, wx.Dialog): safe_print("Trying to close main top-level application window...") if self.TopWindow.Close(force=not event.CanVeto()): self.TopWindow.listening = False self._query_end_session = self.TopWindow safe_print("Main top-level application window processed close event") return else: safe_print("Failed to close main top-level application window") if event.CanVeto(): event.Veto() safe_print("Vetoed query to end session") def end_session(self, event): safe_print("Ending session") self.ExitMainLoop() # We may need to call OnExit() explicitly because there is not # guaranteed to be a next iteration of the main event loop try: self.OnExit() except: # Yes, this can fail with a TypeError, amazingly enough :-( # Apparently sometimes, wx already shuts down the application # and OnExit will be None. We assume in this case that OnExit # already ran. pass # Calling sys.exit makes sure that exit handlers registered by atexit # will run safe_print("Calling sys.exit(0)") sys.exit(0) active_window = None responseformats = {} class BaseFrame(wx.Frame): """ Main frame base class. """ def __init__(self, *args, **kwargs): wx.Frame.__init__(self, *args, **kwargs) self.init() def FindWindowByName(self, name): """ wxPython Phoenix FindWindowByName descends into the parent windows, we don't want that """ for child in self.GetAllChildren(): if hasattr(child, "Name") and child.Name == name: return child def __OnDestroy(self, event): if event.GetEventObject() is self: self.listening = False event.Skip() def init(self): self.Bind(wx.EVT_ACTIVATE, self.activate_handler) self.Bind(wx.EVT_WINDOW_DESTROY, self.__OnDestroy) def init_menubar(self): self.MenuBar = wx.MenuBar() filemenu = wx.Menu() quit = filemenu.Append(-1 if wx.VERSION < (2, 9) else wx.ID_EXIT, "&%s\tCtrl+Q" % lang.getstr("menuitem.quit")) self.Bind(wx.EVT_MENU, lambda event: self.Close(), quit) if sys.platform != "darwin": self.MenuBar.Append(filemenu, "&%s" % lang.getstr("menu.file")) def activate_handler(self, event): global active_window active_window = self def listen(self): if isinstance(getattr(sys, "_appsocket", None), socket.socket): addr, port = sys._appsocket.getsockname() if addr == "0.0.0.0": try: addr = get_valid_host()[1] except socket.error: pass safe_print(lang.getstr("app.listening", (addr, port))) self.listening = True self.listener = threading.Thread(target=self.connection_handler, name="ScriptingHost.ConnectionHandler") self.listener.start() def connect(self, ip, port): if getattr(self, "conn", None): self.conn.disconnect() conn = ScriptingClientSocket() conn.settimeout(3) try: conn.connect((ip, port)) except socket.error, exception: del conn return exception return conn def connection_handler(self): """ Handle socket connections """ self._msghandlercount = 0 while self and getattr(self, "listening", False): try: # Wait for connection conn, addrport = sys._appsocket.accept() except socket.timeout: continue except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.05) continue break if (addrport[0] != "127.0.0.1" and not getcfg("app.allow_network_clients")): # Network client disallowed conn.close() safe_print(lang.getstr("app.client.network.disallowed", addrport)) sleep(.2) continue try: conn.settimeout(.2) except socket.error, exception: conn.close() safe_print(lang.getstr("app.client.ignored", exception)) sleep(.2) continue safe_print(lang.getstr("app.client.connect", addrport)) self._msghandlercount += 1 threading.Thread(target=self.message_handler, name="ScriptingHost.MessageHandler-%d" % self._msghandlercount, args=(conn, addrport)).start() sys._appsocket.close() def message_handler(self, conn, addrport): """ Handle messages sent via socket """ responseformats[conn] = "plain" buffer = "" while self and getattr(self, "listening", False): # Wait for incoming message try: incoming = conn.recv(4096) except socket.timeout: continue except socket.error, exception: if exception.errno == errno.EWOULDBLOCK: sleep(.05) continue break else: if not incoming: break buffer += incoming while "\n" in buffer and self and getattr(self, "listening", False): end = buffer.find("\n") line = buffer[:end].strip() buffer = buffer[end + 1:] if line: command_timestamp = datetime.now().strftime("%Y-%m-%dTH:%M:%S.%f") line = safe_unicode(line, "UTF-8") safe_print(lang.getstr("app.incoming_message", addrport + (line, ))) data = split_command_line(line) response = None # Non-UI commands if data[0] == "getappname" and len(data) == 1: response = pyname elif data[0] == "getcfg" and len(data) < 3: if len(data) == 2: # Return cfg value if data[1] in defaults: if responseformats[conn].startswith("xml"): response = {"name": data[1], "value": getcfg(data[1])} else: response = {data[1]: getcfg(data[1])} else: response = "invalid" else: # Return whole cfg if responseformats[conn] != "plain": response = [] else: response = OrderedDict() for name in sorted(defaults): value = getcfg(name, False) if value is not None: if responseformats[conn] != "plain": response.append({"name": name, "value": value}) else: response[name] = value elif data[0] == "getcommands" and len(data) == 1: response = sorted(self.get_commands()) elif data[0] == "getdefault" and len(data) == 2: if data[1] in defaults: if responseformats[conn] != "plain": response = {"name": data[1], "value": defaults[data[1]]} else: response = {data[1]: defaults[data[1]]} else: response = "invalid" elif data[0] == "getdefaults" and len(data) == 1: if responseformats[conn] != "plain": response = [] else: response = OrderedDict() for name in sorted(defaults): if responseformats[conn] != "plain": response.append({"name": name, "value": defaults[name]}) else: response[name] = defaults[name] elif data[0] == "getvalid" and len(data) == 1: if responseformats[conn] != "plain": response = {} for section, options in (("ranges", config.valid_ranges), ("values", config.valid_values)): valid = response[section] = [] for name, values in options.iteritems(): valid.append({"name": name, "values": values}) else: response = {"ranges": config.valid_ranges, "values": config.valid_values} if responseformats[conn] == "plain": valid = [] for section, options in response.iteritems(): valid.append("[%s]" % section) for name, values in options.iteritems(): valid.append("%s = %s" % (name, " ".join(demjson.encode(value) for value in values))) response = valid elif (data[0] == "setresponseformat" and len(data) == 2 and data[1] in ("json", "json.pretty", "plain", "xml", "xml.pretty")): responseformats[conn] = data[1] response = "ok" if response is not None: self.send_response(response, data, conn, command_timestamp) continue # UI commands wx.CallAfter(self.finish_processing, data, conn, command_timestamp) try: conn.shutdown(socket.SHUT_RDWR) except socket.error, exception: if exception.errno != errno.ENOTCONN: safe_print("Warning - could not shutdown connection:", exception) safe_print(lang.getstr("app.client.disconnect", addrport)) conn.close() responseformats.pop(conn) def get_app_state(self, format): win = self.get_top_window() if isinstance(win, wx.Dialog) and win.IsShown(): if isinstance(win, (DirDialog, FileDialog)): response = format_ui_element(win, format) if format != "plain": response.update({"message": win.Message, "path": win.Path}) else: response = [response, demjson.encode(win.Message), "path", demjson.encode(win.Path)] elif isinstance(win, (AboutDialog, BaseInteractiveDialog, ProgressDialog)): response = format_ui_element(win, format) if format == "plain": response = [response] if hasattr(win, "message") and win.message: if format != "plain": response["message"] = win.message.Label else: response.append(demjson.encode(win.message.Label)) # Ordering in tab order for child in win.GetAllChildren(): if (child and isinstance(child, (FlatShadedButton, GenButton, wx.Button)) and child.TopLevelParent is win and child.IsShownOnScreen() and child.IsEnabled()): if format != "plain": if not "buttons" in response: response["buttons"] = [] response["buttons"].append(child.Label) else: if not "buttons" in response: response.append("buttons") response.append(demjson.encode(child.Label)) elif win.__class__ is wx.Dialog: response = format_ui_element(win, format) if format == "plain": response = [response] else: return "blocked" if format == "plain": response = " ".join(response) return response if hasattr(self, "worker") and self.worker.is_working(): return "busy" return "idle" def get_commands(self): return self.get_common_commands() def get_common_commands(self): cmds = ["abort", "activate [window]", "alt", "cancel", "ok [filename]", "close [window]", "echo ", "getactivewindow", "getappname", "getcellvalues [window] ", "getcommands", "getcfg [option]", "getdefault
    ", "restore-defaults [category...]", "setcfg

    Version history

    2016-01-11 10:34 (UTC) 3.0.6.3

    3.0.6.3

    Fixed in this release:

    • Traceback after first run on some configurations.
    2016-01-04 18:14 (UTC) 3.0.6.2

    3.0.6.2

    Fixed in this release:

    • Mac OS X: 'NoneType' error when creating a 3D LUT after profiling or trying to install/save a 3D LUT.
    2015-12-24 19:34 (UTC) 3.0.6.1

    3.0.6.1

    Fixed in this release:

    • Standalone tools: If ArgyllCMS executables were not found at launch, the dialog asking for their location closed immediately.
    • Mac OS X: Error message “'Menu' object has no attribute 'IsShownOnScreen'” when trying to use the menu or Cmd-Q to quit after using some of the controls.
    • Mac OS X: Find ArgyllCMS reference files if ArgyllCMS was installed via Homebrew.
    • Mac OS X: Application logfiles for standalone tools weren't written anymore (regression of r3431).
    • Mac OS X: Standalone tools couldn't be run in parallel to each other or the main application.
    2015-12-21 21:12 (UTC) 3.0.6

    3.0.6

    Added in this release:

    • Support for the Q, Inc./Murideo Prisma video processor (pattern generation, 3D LUT upload).
    • Support for Argyll 1.8.3 (and newer) luminance preserving perceptual intent.
    • CIECAM02 viewing conditions for critical print evaluation environment (ISO-3664 P1) and television/film studio.

    Changed in this release:

    • Advanced option: Smoother CIECAM02 perceptual and saturation gamut mapping for XYZ LUT profiles if the source profile is a matrix profile and “Enhance effective resolution of PCS to device tables” is enabled. Also works if creating CMYK (printer) profiles from existing reflective measurements (you can specify black generation and ink limiting parameters as additional commandline parameters to colprof).
    • Advanced option: Default CIECAM02 perceptual gamut mapping to (ICC) perceptual.
    • Profile information, 3D gamut visualization: Re-generate existing gamut visualization if involved profile(s) have a newer modification date than the visualization file(s).
    • When changing the 3D LUT input color space on the 3D LUT tab, automatically set a corresponding tone curve (match standalone 3D LUT maker behavior).

    Fixed in this release:

    • Colorimeter correction creation: Reference instrument, manufacturer name/ID and observer choice weren't added to the correction file if it was created by ArgyllCMS 1.8 or newer. This could prevent uploading the correction to the online database.
    • Optimize performance of adding log messages to the log window, especially under Mac OS X where enabling Argyll debug output could generate high CPU load and stall UI updates due to the huge amount of messages generated each second during measurements.
    • Re-enumerate 3D LUT input color space profiles when changing to a different ArgyllCMS version.
    • When re-creating a profile from an existing measurement file or profile that contains 3D LUT settings, remove those settings from its enclosed settings container if automatic 3D LUT creation after profiling is disabled in the current configuration (prevents a 3D LUT being automatically created unexpectedly after re-creating the profile).
    • Curve viewer: Hovering a specific channel would display unexpected zero values for the other two channels in the status bar (regression of r3309, ${APPNAME} >= 3.0.3).
    • Mac OS X: Revert r3478 (${APPNAME} >= 3.0.4.3) which prevented custom values typed into comboboxes actually updating the configuration due to a Mac OS X specific wxWidgets bug that is not yet fixed in wxPython (#9862). Work-around the underlying problem that r3478 was meant to fix (wxPython 3 generates an EVT_TEXT when calling SetValue on a ComboBox, which could cause an infinite loop of events to be generated, wxPython 2.8 does not).
    2015-11-26 21:14 (UTC) 3.0.5

    3.0.5

    Changed in this release:

    • Added Rec. 2020 as well as Rec. 709, SMPTE 431-2 (DCI P3) and Rec. 2020 derivatives with imaginary primaries to PCS candidates for enhancing the effective resolution of PCS to device tables, and set the default lookup table size to “Auto” (base 33x33x33, increased if needed).
    • Enabled verification without a display profile by using the simulation profile as output with its tone curve unmodified.

    Fixed in this release:

    • Black point compensation (when enabled) was not being applied to PCS-to-device table when creating XYZ LUT profiles. Note that using black point compensation for LUT profiles is neither recommended nor required, as it needlessly reduces the accuracy of the profile, and LUT profiles by default are generated with a perceptual table that maps the black point.
    • Work-around a problem with i1D2 and Argyll 1.7 to 1.8.3 under Mac OS X 10.11 El Capitan where disabling interactive display adjustment would botch the first reading (black).
    • Calibration loader: Don't show bogus “Calibration curves could not be loaded” message when using ArgyllCMS 1.8.3 and the display profile does not contain calibration (profiles not created by ${APPNAME} or ArgyllCMS).
    2015-09-25 22:16 (UTC) 3.0.4.3

    3.0.4.3

    Fixed in this release:

    • Restore 3D LUT source colorspace setting when loading a settings file.
    • Error message popup when selecting xvYCC encoding for eeColor (this input encoding is unsupported for eeColor 3D LUTs).
    • When selecting a settings file that changes the 3D LUT format, make sure the selectable 3D LUT encodings are updated.
    • File parsing errors when reading a measurement file to be used for a measurement report could prevent the main window from reappearing.
    • Profile 3D gamut view, testchart 3D diagnostic: X3D file could not be created if the file name started with a number.
    • Cosmetic: Standalone 3D LUT maker: Set controls to the correct state if no target profile is set and hide all irrelevant controls if using a device link profile as source profile.
    • Mac OS X: Hang when when changing whitepoint chromaticity coordinates.
    2015-09-07 14:31 (UTC) 3.0.4.2

    3.0.4.2

    Changed in this release:

    • Show a progress dialog during user-initiated display and instrument enumeration to give some visual feedback (and the ability to cancel) in case it takes longer than expected.
    • Give initial display and instrument enumeration at startup a timeout of ten seconds.
    • Removed option to automatically detect new instruments.
    • Linux: Enable verifying display profiles only available via X atom.
    • Linux: Cache the current display profile on disk if it comes from an X atom to allow it to be used as preconditioning profile for the testchart editor or as destination profile for the standalone 3D LUT maker (the cache path is ~/.cache/icc/id=<profile-id>.icc).

    Fixed in this release:

    • Sporadic failure to create a spectral colorimeter correction when using ArgyllCMS 1.8 and newer.
    • Linux: Traceback when using the “Current profile” button on the testchart editor to set the preconditioning profile to the current display profile, and the display profile path is not available (e.g. if the profile comes from an X atom).
    2015-09-01 12:56 (UTC) 3.0.4.1

    3.0.4.1

    Fixed in this release:

    • wxPython Phoenix compatibility: Ensure that timer notifications run in the main GUI thread.
    • Mac OS X: Fix Resolve pattern generator loosing sync immediately if ${APPNAME} is running standalone from a path that contains spaces.
    2015-08-10 01:22 (UTC) 3.0.4

    3.0.4

    Added in this release:

    • Ability to create 3D LUTs in PNG (Portable Network Graphic) and ReShade format. The latter allows fully color managed Direct3D (8–11.2) and OpenGL applications (e.g. games) under Windows (Vista and higher).
    • Compatibility for updated ArgyllCMS 1.8 Beta display technology mappings when creating colorimeter corrections.
    • “Apply calibration (vcgt)” to 3D LUT tab as advanced option, as well as a warning when installing a 3D LUT with applied calibration for a display with non-linear videocard gamma tables.
    • Option to enable/disable the 3D LUT tab.

    Changed in this release:

    • Speed up calculation of 3D LUTs in 3DL, MGA, and SPI3D format when using a size smaller than 65x65x65.
    • Only prompt to import colorimeter corrections from the vendor software if none is currently selected.
    • Changed uniformity measurement report criteria to follow ISO 12646:2015 and allow selection of the layout to be used. “Update measurement or uniformity report” in the “Tools” menu can now also be used to update old uniformity reports.
    • The “Install profile” button changes to “Install 3D LUT” when on the 3D LUT tab.

    Fixed in this release:

    • “Auto” colorimeter correction setting not selecting an available correction if the display device name contained the manufacturer name.
    • When creating a 3D LUT as part of a profiling run and if the path to ArgyllCMS contained non-ASCII characters, profile creation failed with an Unicode error.
    • Linux (cosmetic): Background of some bitmap buttons was black when wxGTK is built against GTK3.
    • Linux (cosmetic): Splash screen mask not working correctly with wxPython 3 classic.
    • Mac OS X, Windows: Changing (only) the 3D LUT gamma type setting and creating a 3D LUT from an existing profile could lead to a confirmation prompt to overwrite an existing 3D LUT with a different gamma type setting, because this setting was differentiated in the 3D LUT file name with the uppercase or lowercase letter “B” (Windows and Mac OS X have a case-insensitive file system).

    2015-07-09 15:00 (UTC) 3.0.3.1

    3.0.3.1

    Fixed in this release:

    • Make sure there are exactly 256 entries when saving the current videoLUT, otherwise dispwin will complain and not be able to load it back in. Fixes restoring current videoLUT after checking access under Linux when using a graphics card with more than 256 videoLUT entries per channel (e.g. nVidia Quadro).
    2015-07-06 22:58 (UTC) 3.0.3

    3.0.3

    Added in this release:

    • Curve viewer and profile information: Detect more known tone response curves.
    • Colorimetric observer choice as advanced calibration option for instruments that support it (i.e. spectrometers as well as i1 Display Pro, ColorMunki Display and Spyder 4/5).
    • Synthetic ICC profile creator:
      • SMPTE 2084 HDR tone response curve option.
      • Re-introduced black point compensation option.

    Changed in this release:

    • All remaining presets now use testchart auto-optimization for best profiling accuracy. Setting the patch amount slider to 73 or 97 patches will create a simple matrix-based profile aimed at quickly profiling high quality professional displays that are often very linear and have good additive color mixing properties.
    • When saving a 3D LUT for Resolve, try to find the Resolve LUT folder automatically.
    • When saving an existing 3D LUT, pre-fill the filename field in the file dialog with the existing name instead of “Unnamed”.
    • During interactive display adjustment, allow cancelling without confirmation and don't show “Calibration has not been finished” message.
    • Removed most pre-baked testcharts.
    • Improved the help text on the “Profiling” tab.

    Fixed in this release:

    • When creating a profile and accompanying 3D LUT (from new measurements) that overwrite existing files with the same name (popup confirmation before commencing measurements), the progress dialog was never closed automatically and the application window never re-enabled after creating the profile. This could happen if the profile name didn't contain a fine grained enough time or other component distinguishing it from the name of the existing files, e.g. when measuring and creating two or more profiles as well as accompanying 3D LUTs, for the same display, with the same settings, in a single session one after the other.
    • When switching to the “Untethered” display, the “Profile only” button wasn't shown if not already visible.
    • Verifying using a device link profile that alters (corrects) device white on a display that was not adjusted to match the target whitepoint using the display controls, showed higher than actual errors in the measurement report (device link and 3D LUT being fine regardless) due to the report not accounting for the difference of unaltered (uncorrected) device white versus altered (corrected) device white.
    • Set 3D LUT verification options for Resolve automatically after profile generation.
    • Switching from pre-baked testchart to “Auto” and back to same previous pre-baked chart didn't work (was still using “Auto” testchart).
    • When changing the calibration tone curve of an existing profile (that used 1D LUT calibration) to “As measured”, store the updated setting in newly created profiles (unless using an existing calibration).
    • After creating a 3D LUT that incorporates 1D LUT calibration and previewing this calibration on a display connected directly to the system when saving/installing the 3D LUT, restore video card gamma table to the current display profile calibration (if any) afterwards.
    • Creating colorimeter correction with non-7-bit-ASCII characters in the description.
    • Added workaround for undecodable strings in some 3rd party ICC profiles.
    • Restoring defaults from the “Options” menu no longer resets the contribution popup “Do not show again” preference.
    • Cosmetic: Work-around ArgyllCMS 1.7 (harmless) warning message “Spyder: Measuring refresh rate failed” when using the Spyder4/5 with measurement modes “LCD (CCFL)” or “LCD (White LED)”.
    • Synthetic ICC profile creator:
      • Very low non-zero black points (Y around 0.0015 on a 0..100 scale) were parsed as zero from existing profiles due to rounding down to the next legal 16-bit ICC profile v2 encoded value.
      • Parsing grayscale profiles and profiles with a PCS other than CIE XYZ now works.
    • madTPG network interface cross-platform support (Linux/Mac OS X): Reset video card gamma table when calibrating.
    • Linux: Work-around visual wxPython quirks when wxGTK is built against GTK3.
    • Linux (cosmetic): Prefer pygame audio backend to avoid fade crackling.
    2015-06-08 00:08 (UTC) 3.0.2

    3.0.2

    Added in this release:

    • Instrument first-time setup (i.e. importing colorimeter corrections) will now automatically run when it hasn't been run before.

    Changed in this release:

    • Removed black point correction choice when switching to “refresh” measurement mode.
    • Cosmetic: Always show main buttons, but disable them if no action is possible.

    Fixed in this release:

    • Mac OS X (standalone): Use bundled python when running from application bundle (fixes Resolve and madTPG interface).
    • Windows: Installing a profile as system default wasn't working correctly when UAC was enabled (regression of a change in 3.0.1).
    2015-05-31 20:35 (UTC) 3.0.1

    3.0.1

    Added in this release:

    • madTPG network interface cross-platform support. This means you can now connect from Linux or Mac OS X to madTPG running under Windows.
    • Functionality to change display profile (and calibration) whitepoint of existing profiles without re-measuring (no UI, only available via the command line). This is more or less a gimmick and should not be used if colorimetric accuracy is important, but should result in a more precise white point change than using (for example) f.lux or redshift because it fully takes into account the profile colorimetry, although white point shifting in real time is not supported.
    • Option to enable/disable startup sound.
    • Additional verification testcharts (roughly 750 and 1000 patches in size).
    • Output number placeholder for use in the profile name (as another means to disinguish equal display models).

    Changed in this release:

    • Force planckian locus in measurement reports if color temperature is >= 1667 and < 4000.
    • Improve “enhance effective resolution of PCS-to-device tables” slightly: Move CAM Jab clipping blending region from 50%..100% to 33%..75% in the cLUT grid. This improves inverse profile self check errors very slightly and in some cases visually further improves gamut mapping smoothness in the blue region for gamuts that are really limited there (e.g. Laptops/Notebooks, cheap TN panels).

    Fixed in this release:

    • Uniformity measurements not working with spectrometer if instrument self-calibration is performed during the measurements.
    • Work-around Python 2.7 configuration file parsing bug if configuration file gets corrupted (e.g. through hard disk issues, destructive edits or similar).
    • When installing a profile, always copy it to a temporary directory first so if accidentally installing a profile from the location where it's already installed (e.g. system32\spool\drivers\color) it doesn't get nuked by dispwin.
    • Cosmetic: Fix “ProgressDialog object has no attribute 'remaining_time'” when the fancy progress dialog is disabled under “Options” and using the testchart editor to create a testchart.
    • Chromecast messing with display enumeration under Linux and Mac OS X.
    • If missing, add DISPLAY_TYPE_BASE_ID to colorimeter correction matrix (CCMX) files when reading (fixes “Instrument access failed” when using ArgyllCMS 1.7 with older CCMX files).
    • When creating a synthetic ICC profile with Rec. 1886 tone response curve and a black level of zero, the fallback gamma value of 2.2 was used instead of the configured gamma of 2.4.
    2015-05-02 22:11 (UTC) 3.0

    3.0

    Added in this release:

    • Tabbed user interface. See screenshots.
    • Full support for ArgyllCMS 1.7.0, which includes support for the ColorHug2, K-10A, Spyder5, the capability to use a Google Chromecast as pattern generator, and more. Note that the accuracy of using a ChromeCast is limited due to the internal RGB to YCbCr conversion and upscaling in the device.
    • Optional automatic testchart optimization as part of the characterization process.
    • madTPG launches automatically when used (requires madVR 0.87.12 or later).
    • Optionally create a 3D LUT automatically after profiling. 3D LUT settings are stored in the profile and synced with measurement report settings when loaded.
    • 1-click install of madVR 3D LUTs after generation (requires madVR 0.87.12 or later).
    • 3D LUT maker: Optionally allow to use PCS-to-device instead of inverse device-to-PCS gamut mapping. This allows for fast creation of 3D LUTs, but the result is dependent on the quality and accuracy of the profile's B2A tables.
    • 3D LUT maker/measurement report: Added an option to just apply black output offset to the tone response curve instead of overriding it completely. This option is only available for source profiles that have a tone response curve which is not defined by a simple power function (e.g. sRGB). Also added a warning message if input values would be clipped when using the tone response curve unmodified.
    • Show reference versus corrected colorimeter measurements along with delta E when creating a colorimeter correction matrix.
    • Optionally clip WTW on input when creating a 3D LUT (requires ArgyllCMS 1.7 or later).
    • Additional error checking for patterngenerator network interface: Check if each Argyll test pattern update is followed by a network send. Fail with a sync error otherwise.
    • Easily create a compressed archive of the currently selected profile and related files with the click of a button next to the “Settings” dropdown.
    • Testchart editor:
      • Support loading of CGATS files which do not contain XYZ values.
      • CSV import (drag and drop a CSV file) and export.
      • Export 16-bit PNG and TIFF or 10-bit DPX files.
      • Improved speed of image file export.
      • Dragging and dropping image files extracts and adds reference patches if a preconditioning profile is set.

    Changed in this release:

    • Generate XYZ LUT profiles by default and for all presets. Consequently, black point compensation now defaults to off and is an advanced option (not shown by default).
    • XYZ LUT + matrix profiles will always have black point compensated matrix TRC tags. That way “dumb” applications which fall back to the matrix won't clip shadow detail if they don't support BPC internally, while “smart” applications can use the accurate LUTs.
    • When creating XYZ LUT profiles with enhanced effective PCS-to-device table resolution, improve reproduction of saturated colors for displays with limited gamut (e.g. smaller than sRGB), increasing visible detail and saturation in those areas. This should typically affect saturated blues the most. Users of displays that cover most of sRGB except parts of the blue region may see an improvement as well. Also, more accurately encode the PCS-to-device black point.
    • Show display technology type of spectral colorimeter corrections and sort by the shown name instead of the filename.
    • Moved display update delay and settle time controls to main window (“Show advanced options” must be enabled).
    • Force a minimum display update delay of 600 ms for Resolve irrespective of chosen preset.
    • Don't unload current settings file when changing calibration tone curve to “As measured”.
    • When creating a profile, automatically filter out XYZ = 0 readings if the RGB stimulus is < 5% (except black).
    • Files generated during incomplete/failed runs are moved to a different location than the storage directory. See “User data and configuration file locations”, “Incomplete/failed runs”. Compare the list of files in the temporary directory and their modification times before and after running ArgyllCMS tools to determine if files should be kept in case of errors.
    • When updating via Zero Install, force exact version.
    • 3D LUT: Default to 65x65x65 cube for all 3D LUT formats except Pandora (.mga) which only supports 17x17x17 and 33x33x33.
    • 3D LUT: Default to 16..235 TV level encoding for the eeColor.
    • Measurement report: Changed displayed range of Y to be always 0..100 with four decimal digits.
    • Linux, Windows: On application startup, the current video LUT is restored after checking video LUT access. This differs from the previous behavior where the video LUT was reset to the calibration (if present) of the currently assigned display profile(s) (if any).

    Fixed in this release:

    • Error message when trying to quit the application while the “About” dialog was shown (regression of a change in 2.6 how lingering dialogs are handled on application exit).
    • Using Resolve as pattern generator prevented ambient measurements.
    • Fixed bug with Resolve interface related to APL that resulted in pattern updates being rejected by Resolve due to negative background RGB. This could happen with bright patches if the test patch size was above roughly 30% and below 100% screen area.
    • Due to file descriptors for session logfiles not being closed after being done with the file, ${APPNAME} could run out of available file descriptors when used to create or inspect a large amount of profiles in a single session.
    • Disabled rollover for session logfiles.
    • Worked around uninitialized variables with Argyll's xicclu utility in versions 1.6.x to prevent unexpected color lookup output values.
    • Make sure the 1% reading during calibration check measurements doesn't trigger continuing to the following step.
    • Clicking the “Pause” button on the progress dialog in the first few seconds before instrument initialization was complete would not pause measurements, and disabled the button until clicking “Cancel”.
    • Verifying a device link created with an encoding other than full range RGB.
    • Curve viewer: Amount of tone values and grayscale % for calibration curves was not calculated correctly if the number of entries was not 256.
    • Testchart editor: Deleting a selection of non-consecutive rows didn't work correctly.
    2014-11-15 20:46 (UTC) 2.6

    2.6

    Added in this release:

    • Scripting support (locally and over the network).
    • Possibilty to do spectrometer self-calibration on its own (look in the “Options” menu). Useful in conjunction with “Allow to skip spectrometer self-calibration”.
    • Curve viewer, profile information: Support plotting tone response curve of grayscale profiles.
    • wxPython 3.0.2 “Phoenix” compatibility.
    • Linux: Install/uninstall instrument configuration files (udev rules/hotplug scripts) from the “Tools” menu.

    Changed in this release:

    • Use extended testchart as default for matrix profiles.
    • When switching profiles or displays, make sure the measurement report and 3D LUT creation windows are updated accordingly if shown.
    • Unset Argyll display update delay/settle time environment variables after disabling their override when they were not set initially.
    • All standalone tools have separate configuration files (overridden by main configuration if newer and vice versa) and logfiles.
    • VRML to X3D converter can now do batch processing.
    • Enhanced UI for colorimeter correction creation.
    • Limit the ability to create colorimeter corrections for the Klein K-10 to factory measurement mode.
    • Detect instruments at startup if no instruments were previously configured.
    • Changed “Resolve” preset to use a minimum display update delay of 600 ms and constant APL patterns by default.
    • Restore defaults for display update delay and settle time multiplier when loading settings without override.
    • Linux: The system-wide configuration file is ignored except for the profile loader.

    Fixed in this release:

    • Calibration curve plot was not working anymore for profiles with formula-type vcgt tags (regression of r2384, did not affect Argyll-generated profiles).
    • Re-use existing Resolve connection if possible and only shut it down on application exit (fixes “Address already in use” error under Linux and Mac OS X).
    • When using Resolve, the measurement window position and size aswell as the “Use black background” setting were not correctly stored in the generated calibration file and/or profile and could thus not be restored by loading the file(s).
    • When exporting test patches as image files, limit pixel dimensions to FullHD (fixes memory error when exporting fullscreen patches).
    • When applying a tone response curve to an existing profile, make sure curve values can't become negative at and near zero input.
    • Fix generation of synthetic grayscale profiles.
    • Linux (only if ArgyllCMS was installed via Zero Install)/Mac OS X/Windows: If the ArgyllCMS directory was not explicitly configured, ArgyllCMS reference profiles (e.g. Rec709.icm) were not added automatically to file dropdown lists and the “Install ArgyllCMS instrument drivers...” menu item (Windows only) was grayed out (this impacted convenience, not functionality).
    • Cosmetic, Mac OS X 10.8 and earlier: Splash screen had a light gray border instead of being semi-transparent.
    • Mac OS X 10.10 Yosemite: Disable functionality to load/clear calibration like under Mac OS X 10.6 and up.
    2014-09-06 00:07 (UTC) 2.5

    2.5

    Added in this release:

    • ArgyllCMS 1.7 beta compatibility: Klein K10-A support (requires ArgyllCMS 1.7 beta test 2014-05-21 or newer) and updated technology strings for colorimeter correction creation. When creating 3D LUTs with Rec. 1886 or custom tone response curve, force RGB source 0 0 0 to map to RGB destination 0 0 0 (requires ArgyllCMS 1.7 beta development code 2014-07-10 or newer).
    • Enable black output offset instead of all-input offset for 3D LUTs, measurement report and synthetic profile creation (based on ArgyllCMS 1.7 beta development code 2014-07-12, thanks to Graeme Gill). Note that for 3D LUTs, if using output offset ideally ArgyllCMS 1.7 should be used aswell once it becomes available since the current implementation in ${APPNAME} that enables output offset when used with ArgyllCMS 1.6.3 or older has limited 16-bit precision for the black point mapping (due to the implementation altering the source profile TRC on-the-fly in that case, and the ICCv2 16-bit encoding used for the TRC tags in the source profile), while ArgyllCMS 1.7 will enable full floating point processing (due to the black point mapping then taking place internally in collink, and ${APPNAME} not having to alter the source profile TRC beforehand).
    • Black point can be specified in XYZ or chromaticity coordinates when creating a synthetic ICC profile.
    • When dropping an existing profile onto the synthetic ICC profile creation window, set whitepoint, primaries, blackpoint and tone response curve (average) according to the profile.
    • Support for the Resolve 10.1 (and newer) CM pattern generator. See also 3D LUT creation workflow for Resolve on the ${APPNAME} Wiki.
    • Enable interactive display adjustment without creating calibration curves by setting “Tone curve” to “As measured”. This also causes all calibration setting placeholders in the profile name to be ignored.
    • Added options to override the minimum display update delay (requires ArgyllCMS 1.5 or newer) and display settle time multiplier (requires ArgyllCMS 1.7 Beta or newer). These options can be found in the “Set additional commandline arguments...” window accessible from the “Options” menu. Note that these two settings (unlike the additional commandline parameters) are stored in the profile, and will be restored when the profile is selected again under “Settings”.
    • Testchart editor: If generating any number of iterative patches as well as single channel, gray or multidimensional patches, it is possible to add the single channel, gray and multidimensional patches in a separate step by holding the shift key while clicking on “Create testchart”. This prevents those patches affecting the iterative patch distribution, with the drawback of making the patch distribution less even. This is an experimental feature.
    • Windows: Simplified ArgyllCMS instrument driver installation by adding a respective menu item to the “Tools” menu.

    Changed in this release:

    • Visual overhaul.
    • Calibration curves are no longer automatically loaded into the video card gamma table when loading a settings file. To manually load calibration curves into the video card gamma table, choose “Load calibration curves from calibration file or profile...” in the “Options” menu (Linux and Windows only), or install a profile, or use the “Preview calibration” checkbox (Linux and Windows only) in the profile installation dialog. The previous behavior can be restored by editing ${APPNAME}.ini and adding a line calibration.autoload = 1.
    • Split “Smooth B2A tables” into “Enhance effective resolution of colorimetric PCS[11]-to-device table” and “Smoothing” options and moved them to advanced gamut mapping options.
    • Renamed “Apply BT.1886 gamma mapping” to “Apply tone response curve”.
    • Always override the source profile tone response curve when using “Apply tone response curve” (3D LUT creation and measurement report) so the result will be correct for the chosen parameters regardless of source profile tone response curve.
    • Removed black point compensation option from synthetic profile creation window.
    • Changing the black level or black point Y value when creating a synthetic ICC profile now rounds up or down to make it a multiple of the 16-bit encoding precision used in ICC v2 profiles (which is roughly 0.00153 when normalized to 0..100).
    • Re-enabled moving the standalone curve viewer between displays updating the graph according to the display it is currently on.
    • Always append the measurement mode to the instrument string in the measurement report.
    • Confirm quitting the application (via the application menu “Quit” item or the associated keyboard shortcut) if a task is still running (in practice this only affects Mac OS X as the menu is not accessible on other platforms while a task is running).
    • When selecting “Locate ArgyllCMS executables...” in the menu to switch to a different ArgyllCMS version, automatically detect if a newer version is on the search path and offer to use it right away without having to manually browse to the location.
    • Renamed “Gamma” entry in calibration tone response curve dropdown to “Custom” to emphasize that it is a curve with custom gamma exponent and other parameters.
    • When switching calibration tone response curve from Rec. 1886 to custom, restore the previous gamma and black output offset parameters (or defaults in case a preset was used).
    • Show an error message if trying to measure the ambient light color with an instrument which only has a monochrome ambient sensor (e.g. Spyder 3 and 4 Elite or Pro).
    • Importing colorimeter corrections and enabling the Spyder 2 is now truly automatic (necessary files are downloaded if not present on the local system).
    • Made black level control an advanced calibration option.
    • Loading a profile that does not contain calibration settings sets all calibration options to “As measured”.
    • When creating or loading a profile (except presets), it is now automatically set as the current profile in the measurement report and 3D LUT creation windows.
    • Enabled interactive display adjustment for the madVR and Resolve presets and altered them to not do video card gamma table calibration by default.
    • All presets that create LUT profiles use optimized testcharts.
    • When a virtual display is selected, don't offer profile installation but 3D LUT creation instead.
    • ReadMe: Completed testchart editor documentation.
    • Testchart editor: Always enable “Add saturation sweeps” and “Add reference patches...” controls when a preconditioning profile is set, regardless of selected patch distribution and adaptation.
    • Testchart editor: When enabling/disabling the preconditioning profile, set adaptation to 100%/10% respectively.
    • Testchart editor: Greatly improved the speed of inserting patches into large testcharts with thousands of patches.
    • Linux, profile installation: Try to install the profile using all available systems regardless if one of them fails to install the profile. Only report profile installation as failed if all available systems failed to install the profile. Report specific failures when profile installation only partly succeeds.
    • Linux, profile installation: Try colormgr as fallback (if available) if profile installation using Argyll 1.6+ failed.
    • Linux: Use the EDID MD5 to find the device ID (this only works with colord versions released after 26. Apr. 2013).
    • Mac OS X: No longer require administrator privileges if running from a non-administrator user account.
    • Windows Vista and newer: Enable system-wide profile and OEM files installation without the need to run the whole application as administrator. The UAC shield icon is shown on buttons if an action requires administrator privileges.

    Fixed in this release:

    • The “Apply BT.1886 gamma mapping” checkbox in the 3D LUT creation window did re-enable itself when clicking on “Create 3D LUT” if Rec709.icm was selected as source profile.
    • Synthetic ICC profile creation: Setting gamma to absolute or relative when not using Rec. 1886 now actually makes a difference (previously the end result was always an absolute curve).
    • “Show actual calibration curves from video card” could not be enabled in the standalone curve viewer if the previously selected display did not allow video LUT access.
    • Measuring the ambient light level with an instrument which only has a monochrome ambient sensor (e.g. Spyder 3 and 4 Elite or Pro).
    • If loading a settings file created with automatic black point hue correction, that setting was not restored and the default value of no correction was used.
    • When doing a “Profile only” and using the current calibration from the video card gamma table, ArgyllCMS expects 256 entries. Interpolate on-the-fly if the number of entries in the video card gamma table is not 256 (this currently only affects Mac OS X 10.9 and newer where the table contains 1024 entries).
    • If the display manufacturer string recorded in a profile was the same as the three-letter manufacturer ID string (e.g. NEC), the profile could not be uploaded to the openSUSE ICC Profile Taxi service due to a bogus “missing metadata” error message (regression of r1422).
    • Profile information window: Color coordinates in the status bar were wrong if the selected colorspace was not a*b* (bug introduced in ${APPNAME} 2.0).
    • The specbos 1201 was not working due to not supporting measurement mode selection.
    • When getting normalized vcgt tag values, scaling was off if the vcgt wasn't 16-bit. This prevented e.g. the measurement report from working with certain 3rd-party display profiles.
    • Cosmetic: Correct padding of the patch number in the measurement report summary (fixes missing padding when multiple patches are evaluated for a single criterion).
    • Trivial: Tab order of controls (top-down, left-right).
    • Testchart editor: IndexError if trying to add saturation sweeps or reference patches when no cells are selected.
    • Linux, profile installation: Do not regard a missing colormgr as error.
    • Mac OS X: Selecting “About”, “Locate ArgyllCMS executables...” (preferences) and “Quit” in the application menu does something again (this stopped working with the move to wxPython 3.0 GUI library in ${APPNAME} 2.0).
    2014-05-11 19:00 (UTC) 2.1

    2.1

    Added in this release:

    • “Auto” measurement mode for the ColorHug. This will automatically create a colorimeter correction with the reference based on EDID[10] as part of the normal measurement process. This is a work-around for the red primary shift problem that some ColorHug users are experiencing (note that this will make ColorHug measurements closely match the gamut boundaries defined by the primaries and whitepoint from EDID). This mode should only be used as a last resort if no colorimeter correction with reference measurements from a spectrometer or other known accurate instrument can be obtained.
    • Auto-update functionality. Apply updates from within ${APPNAME} under Mac OS X and Windows, or if using Zero Install.

    Changed in this release:

    • Improved Zero Install integration. Installation is now as simple as a standalone installation.
    • Switched “Smooth B2A tables” off and “Low quality B2A tables” back on for the madVR preset to save some time during profile generation.
    • The HTML-embedded X3D viewer will now by default try and load its components from the web, with a fallback to a locally cached copy (if available) and not anymore the other way around. This means generated HTML files will automatically use updated viewer components when an internet connection is available.
    • Choosing “Profile information” from the “File” menu will now always present a file dialog to pick a profile and no longer use the profile currently selected in the main window (this functionality is still available via the small blue “Info” button next to the settings dropdown).
    • Show profile information with right pane expanded by default.
    • Don't lock measurement mode for colorimeter corrections, instead set colorimeter correction to none if an incompatible measurement mode is selected.
    • Allow black point compensation if “low quality B2A tables” is enabled.
    • Windows: Limit profile name length so that the length of the path of the temporary directory plus the length of the profile name does not exceed 254 characters (which is the maximum useable length for ArgyllCMS tools where an extension with a length of four characters is added automatically).

    Fixed in this release:

    • When using the ColorHug in “Factory” or “Raw” measurement mode in ${APPNAME} (r1378 or later) with a colorimeter correction that was created with ArgyllCMS 1.5 or later, the measurement mode was being locked to the wrong mode (a colorimeter correction created in “Factory” mode would lock to “Raw” and vice versa).
    • Transpareny rendering in the HTML-embedded X3D viewer: Transparency is now gamma-corrected.
    • Tone response curves plot: Removed the very slight interpolation offset error at zero input (around +0.5 RGB on a 0-255 scale for a synthetic 16-bit tone response curve following a gamma of 2.2 with no black offset) for tone response curves that have zero output at non-zero input.
    • Trying to open files with unicode characters in their filename or path in the standalone testchart editor, curve viewer, profile information, or VRML to X3D converter application from the commandline, via the desktop's “open with” functionality, or by assigning a supported filetype to be opened with the respective application failed (dragging and dropping the file onto the respective application window worked fine).
    • Correctly reflect in the GUI if black point compensation can be applied. Black point compensation is available for curves + matrix profiles and XYZLUT profiles with either “low quality B2A tables” or “smooth B2A tables” enabled.
    • Linux: Fixed a problem with unicode when querying colord for the current display profile (regression of r1832).
    • Windows: Report could not be saved after finishing display uniformity measurements due to the file dialog not receiving mouse clicks or keyboard input.
    • Windows: Work-around python issues with long pathnames (>= 260 characters).
    2014-04-23 00:43 (UTC) 2.0

    2.0

    Added in this release:

    • New profiling option “smooth B2A tables” for XYZ LUT profiles. This should improve the smoothness of the relative colorimetric gamut mapping. Enabling this option will also generate a simple but effective perceptual mapping (which will be almost identical to the colorimetric mapping, but map the black point) if no other advanced gamut mapping options have been chosen.

      See below example images for the result you can expect (note though that the particular synthetic image chosen, a “granger rainbow”, exaggerates banding, real-world material is much less likely to show this).

      Original Granger Rainbow image

      Original “granger rainbow” image

      Granger Rainbow - default colorimetric rendering

      Default colorimetric rendering (2500 OFPS XYZ LUT profile)

      Granger Rainbow - “smooth” colorimetric rendering

      “Smooth” colorimetric rendering (2500 OFPS XYZ LUT profile, inverted A2B)

      Granger Rainbow - “smooth” perceptual rendering

      “Smooth” perceptual rendering (2500 OFPS XYZ LUT profile, inverted A2B)

      For the test, the image has been converted from sRGB to the display profile. Note that the sRGB blue in the image is actually out of gamut for the specific display used, which made the test particularly challenging (the edges visible in the blue gradient for the rendering are a result of the color being out of gamut, and the gamut mapping thus hitting the less smooth gamut boundaries).

      Technical discussion: “smooth B2A tables” works by inverting the already present A2B colorimetric table, making use of ArgyllCMS to do clipping in CAM Jab for saturated colors. A new cLUT, cLUT matrix and cLUT device channel curves are then generated. The matrix and device channel curves scale and transform the input values to distribute them across the cLUT grid points, trying to make good use of the limited number of points. Additional smoothing is then applied to the cLUT (this can be disabled by editing ${APPNAME}.ini and adding a line profile.b2a.smooth.extra = 0). Diagnostic PNG images are created for each of the B2A cLUT tables (pre/post/post smoothing). This approach is relatively straightforward, but seems very effective in creating a smooth yet accurate mapping. There is a drawback though, if the native device gamut boundary is bumpy, the error at the gamut boundary and thus the max error can go up. In most cases, I feel this will be acceptable, and the smoothness and often also increased in-gamut accuracy should make up for the potential higher max error. If you're interested, you can check the error of the B2A table vs the A2B table by running (in a terminal) invprofcheck -k -h -w -e on the profile, and compare it to the error of a profile where “smooth B2A tables” was not used. Comments and feedback welcome as always.

    • Synthetic ICC profiles can be created with DICOM or BT.1886 tone response curve, with or without black offset, and can either be RGB (curves + matrix) or gray (curves only).
    • Expanded the color space choices for profile gamut views with L*u*v* and DIN99 family colorspaces.
    • Expanded the color space choices for diagnostic 3D views of testcharts with HSI, HSL, DIN99 family, LCH(ab), LCH(uv), L*u*v*, Lu'v' and xyY colorspaces. To differentiate the LCH(ab) and LCH(uv) views from L*a*b* and L*u*v* respectively, a layout where the hue angle increases along the horizontal and chroma along the vertical axis is used.
    • 3D views of profile gamuts and testcharts can be created as VRML, X3D, or X3D in HTML with embedded viewer for WebGL-enabled browsers.
    • VRML to X3D standalone converter. Output options are X3D (XML) and X3D in HTML. The HTML files generated by default use the X3DOM runtime to implement a viewer, which requires a WebGL-enabled browser. The converter can be run from a terminal without GUI. Run it with the --help argument to view the list of options.
    • Rendering intent and direction selector for curve viewer tone response curve plot. Also changed layout of controls slightly.
    • LUT checkbox to profile info gamut view (if the profile is a LUT profile and contains both LUT and matrix tags). This allows inspecting the gamut characterized by the LUT versus the one defined by the matrix.
    • Show estimated remaining time in the progress dialog if applicable. Note that it is not always particularly accurate, and for operations consisting of multiple steps (e.g. calibration & profiling), the shown estimate is for the current (sub-)step only.

    Changed in this release:

    • Slightly adjusted presets:
      • Changed “madVR” and “Video” presets to use Rec. 1886 as calibration target.
      • Changed “Prepress” and “Softproof” presets to use full black point hue correction during calibration.
      • Disabled interactive display adjustment for “Laptop” preset.
      • Set profile type for those presets that defaulted to curves + matrix to single curve + matrix.
    • Changed profile black point compensation option to map the black point to zero more reliably. This means black point compensation can no longer be used for L*a*b* LUT profiles, and will only be applied to the LUT part of XYZ LUT profiles if the new “smooth B2A tables” profiling option is used.
    • Changed 3D LUT and measurement report settings to automatically enable/disable Rec. 1886 gamma mapping if the source profile has/doesn't have a known “camera” transfer function (e.g. SMPTE 240M or Rec. 709).
    • Unlocked calibration Rec. 1886 gamma controls to bring them in line with the 3D LUT and measurement report offerings.
    • Set BT.1886 gamma mapping defaults to gamma 2.4 absolute to match the recommendation.
    • Show error message in case of ambient measurement failing due to instrument communications failure.
    • Curve viewer: Enable dragging and zooming.
    • Profile information comparison profile selection, measurement report simulation profile selection: The list of automatically recognized profiles (if they are installed) has been extended to the full range of ECI offset, gravure and newsprint profiles as well as their basICColor equivalents (available on colormanagement.org) and an increased range of RGB working space profiles. Other profiles can be added by dragging-and-dropping them on the profile list.
    • Never center the display adjustment and untethered measurement windows on the screen, or show them at their parent window coordinates if no previous coordinates were stored in the configuration (always use default coordinates of topleft screen corner in that case).
    • In the case of essential resource files missing (e.g. broken installation or deleted application files), show a more informative error message.
    • Diagnostic 3D views of testcharts are no longer created automatically. You have to click the “3D” button.
    • Slightly increased the logging verbosity.
    • Linux: No longer use GObject Introspection to interface with colord. It could in rare cases cause hard to diagnose problems with wxPython. Rely on colord support in ArgyllCMS 1.6 and newer instead (with a fallback to colormgr for profile queries or if libcolordcompat.so is not available for profile installation).
    • Linux: Deal with distribution-specific differences for the location of ArgyllCMS reference files (currently supported are XDG_DATA_DIRS/argyllcms/ref, XDG_DATA_DIRS/color/argyll and XDG_DATA_DIRS/color/argyll/ref).
    • Linux: Use udev hwdb instead of pnp.ids for looking up PNP ID to manufacturer name if available.

    Fixed in this release:

    • Unhandled exception when trying to start measurements on a display that was added/enabled while ${APPNAME} was already running.
    • In case of untethered measurements, correctly detect and react to recurring need for intermittent instrument calibration.
    • Re-enabled the ability to generate some 3D LUT formats from existing DeviceLink profiles.
    • Don't allow leading dashes in profile filename which might trick the ArgyllCMS tools into mistaking parts of it as an option parameter.
    • Refresh display measurement mode was not correctly restored from saved settings.
    • Moving the measurement window between displays resulted in an error and did not update the display configuration (regression of r1737).
    • Linux: Make curve viewer and profile information compatible with wxPython 3.0.
    • Linux: When the trash directory was not already present, files couldn't be moved to the trash.
    • Linux: System-wide profile installation should now also work if sudo is configured to require a TTY.
    • Linux/colord interface: Leave out manufacturer name part of device ID if the PNP ID wasn't found in the database.
    • Linux/colord interface: Deal with potential differences in device ID depending on installed colord version and desktop environment.
    • Linux, Mac OS X: In rare cases, a worker thread could reach an infinitely blocked state.
    • Mac OS X: Standalone tools (broken due to internal symlinks pointing to wrong locations).
    • Mac OS X: Create user profile directory if it does not exist when trying to install a profile (fixes inability to install a profile if the user profile directory does not exist).
    • Mac OS X 10.6 and newer: Calibration loading/clearing is now disabled due to undesirable side-effects (loading calibration from the current display profile could make it necessary to manually restore the display profile by opening system preferences → display → color and loading or clearing a calibration could have side-effects on calibration and profiling measurements).
    2014-02-09 22:55 (UTC) 1.7.5.7

    1.7.5.7

    Added in this release:

    • Unique icons for all standalone tools.
    • Profile information can plot and display colors from named color profiles (including ICC v4). Thanks to Alexander Bohn for adding the original named color support in the ICC profile module.
    • Testchart editor, “Add reference patches”: Named color profiles can be used as reference.
    • Linux: Desktop entries for standalone tools.
    • Mac OS X: Application bundles for standalone tools (Note: They won't work without the main application being present in the same folder, as the resources are shared and contained in the main application bundle).

    Changed in this release:

    • Error handling: Omit traceback from error messages for filesystem and operating system related errors (like disk full or no read permissions on a file) as such errors are not code-related.
    • Updated french translation (thanks to Loïc Guegant).
    • If a profile is corrupted, show the curves window regardless if enabled. Show the profile error message only when the corrupted profile is first accessed, not each time the curves window is shown/hidden.
    • Testchart editor, “Add reference patches” (dealing with image colorspaces): Support Lab TIFF images. Fail on colorspace mismatches.
    • Removed DCI_P3.icm profile (prefer SMPTE431_P3.icm which is part of recent ArgyllCMS releases).

    Fixed in this release:

    • Disable double-click centering and scaling for curve views (this was never supposed to be possible in the first place).
    • Testchart editor, “Add reference patches” (chromatic adaptation): When no device white is available, make sure alternate whitepoint definitions (APPROX_WHITE_POINT, LUMINANCE_XYZ_CDM2 fields) are actually used if present.
    • Always automatically add a file type extension to the filename in the curve/gamut saving dialog (fixes “unsupported filetype” error when trying to save under Mac OS X without manually adding the extension to the filename).
    • Calibration preview for calibration & profile from “<current>” setting no longer switches between .cal and .icm file created in that same run.
    2014-01-19 10:02 (UTC) 1.7.1.6

    1.7.1.6

    Added in this release:

    • A new option to not use the video card gamma table to apply calibration (default like in 1.5.2.5/1.5.3.1: On for madVR, off for everything else).
    • Correlated color temperature, gamma, RGB gray balance and gamut graphs to measurement report.
    • Re-added the default testchart for gamma + matrix profiles.
    • Testchart editor: Dark region emphasis controls (ArgyllCMS 1.6.2).
    • Testchart editor: Black patches amount control (ArgyllCMS 1.6).
    • Testchart editor: Ability to add saturation sweeps and reference patches (from CGATS or images) to a testchart if using a preconditioning profile and adaptation = 100%.
    • Standalone curve viewer. This allows to view the curves of the currently assigned display profile or the actual video card gamma table without launching ${APPNAME}.
    • Curve viewer can reload, apply black point compensation to, load into the videocard, and export calibration files.

    Changed in this release:

    • Untethered measurements window: Enable keyboard navigation in the grid view (up/down/pageup/pagedown/home/end keys).
    • Measurements are now pauseable.
    • Cancelling a potentially long-running operation like measurements or profile generation now needs to be confirmed.
    • Improved robustness of ambient measurement code.
    • Show an error message when communication with the instrument fails (instead of just logging the error).
    • Show an error message when trying to measure ambient light and ambient measurements are unsupported (instead of just logging the error).
    • Regenerated testcharts preconditioned by gamma-based profiles with slight dark region emphasis.
    • Updated french translation (thanks to Loïc Guégant).
    • “Allow skipping of spectrometer calibration” will now always try to skip spectrometer calibration if enabled, not just when doing a calibration and subsequent profile in one go (“Calibrate & profile”). This means a calibration timeout will then be in effect (which is 60 minutes for the ColorMunki Design/Photo, i1 Pro and i1 Pro 2), and a recalibration will only be needed if this timeout has been exceeded before the start of an operation.
    • Testchart VRML export: Only use Bradford chromatic adaptation if ACCURATE_EXPECTED_VALUES in the .ti1 file is true (i.e. a preconditioning profile was used), otherwise XYZ scaling (to visually match VRML files generated by ArgyllCMS).
    • Renamed “Verify profile” to “Measurement report”. Added options for BT.1886 gamma mapping, whitepoint simulation, (limited) support for device link profiles, and madVR color management (3D LUTs). Overhauled report HTML layout and style.
    • Use nicer filenames and titles for HTML reports and uniformity check (e.g. include the display name for which the report was generated).
    • Improved dealing with profile linking errors during 3D LUT generation (show error dialog instead of just logging the error).
    • Always use a cLUT resolution of 65 and don't preserve device curves for 3D LUT generation, regardless of the selected 3D LUT format or size (this should make results consistent between eeColor/madVR, which were always generated like that, and the other formats).
    • Allow the use of PC levels for madVR 3D LUT output encoding.
    • Synchronize input and output encoding for eeColor 3D LUT format.
    • Disable xvYCC output encoding (not supported) and consequently disable it also as input encoding for eeColor because it needs the same input/output encoding.
    • Allow loading of calibration files that do not contain settings.
    • Testchart editor: Combined patch ordering controls.
    • Testchart editor: Vastly enhanced performance of row delete operations on very large testcharts (several thousand patches). Also slightly improved speed of testchart loading.
    • Measurement report charts: Each larger chart contains all the patches from the previous smaller chart. Re-generated video charts preconditioned to Rec. 709 and with slight dark region emphasis.
    • Windows 7 and up: Prefer ${APPNAME} profile loader over calibration loading facility of the OS (the latter introduces quantization artifacts and applies wrong scaling, the former uses ArgyllCMS and thus doesn't have these problems).
    • Windows: Do not regard unability to determine startup folders as fatal error (this means an autostart entry to load calibration on login can not be created automatically in that case though, so unless Windows 7 or newer is used which has the ability to load calibration without external utilities, calibration needs to be loaded manually).
    • Windows/madVR: Always reset the video card gamma table to linear when using a calibration file and not using the video card gamma table to apply the calibration (this should prevent the potential problem of double calibration being applied if loading a calibration on a display, then switching over to madVR on the same display and using a calibration file while not using the video card gamma table to apply the calibration).

    Fixed in this release:

    • A possible unicode decode error when the computer name contains non-ASCII characters, introduced in 1.5.2.5.
    • In some instances the handling of profile name placeholders was quirky (problematic character sequences were those consisting of the same characters, case insensitive, as calibration speed or profile quality shortcodes, i.e. FxF, MxM, SxS, VFxVF and VSxVS, with x being any non alphanumeric character).
    • When loading a settings file, only switch to the associated display device if it can be unambiguously determined (fixes multi-screen setups with identical screens always switching to the first one, a bug introduced in 1.5.2.5).
    • Ignore messages from the logging module (fixes a bogus error message being displayed under Windows when closing ${APPNAME}, introduced in 1.5.2.5).
    • Handling of separate video card gamma table access controls was a bit quirky since the addition of virtual display devices.
    • If the 3D LUT target profile was overwritten by the generated device link profile (which could happen if choosing the same path and file name for the 3D LUT/device link profile as the target profile), it prevented changing the source profile.
    • Instrument (spectrometer) calibration can be required multiple times during a calibration run, depending on its duration. This was not handled correctly by the GUI.
    • 3D LUT generation with TV RGB 16-235 encoding could lead to wrongly encoded 3D LUTs if not using the eeColor or madVR format.
    • 3D LUT generation with YCbCr encodings failed with an error if not using the eeColor or madVR format.
    • Standalone utilities (3D LUT maker, curve viewer, profile information, and testchart editor) now function properly even if ${APPNAME} itself was never launched before (previously the ArgyllCMS version was read from the configuration, so if it was never configured before it could happen that not all available options where shown or it was never asked to select an ArgyllCMS executable directory in case the ArgyllCMS executables were not found).
    • Don't block other windows when an operation fails while a progress dialog with a modal dialog on top is shown.
    2013-10-23 20:09 (UTC) 1.5.3.1

    1.5.3.1

    Added in this release:

    • New feature: When creating a profile from existing measurement data, averaging of measurements can be performed by selecting multiple files.

    Fixed in this release:

    • Fixed possible unicode error in logging module.
    • Fixed a bug with optimizing a testchart for untethered measurements halving the amount of different device combinations by repeating patches if the total patch count was even.
    • Mac OS X 10.6: Fixed weird behavior due to a bug in OS X 10.6's version of sudo.
    2013-10-22 14:32 (UTC) 1.5.2.5

    1.5.2.5

    Added in this release:

    • Full ArgyllCMS 1.6.0 support (e.g. JETI specbos 1211/1201, madVR calibration and 3D LUT generation, body centered cubic grid option for creating testcharts).
    • Testchart editor: Charts can be exported as PNG or TIFF files.
    • Testchart editor: Gamma and neutral axis emphasis controls.
    • Testchart editor: “Use current profile as preconditioning profile” button.
    • Testchart editor: Save VRML diagnostic files for testcharts without the need to re-generate the chart.
    • Testchart editor: Sort patches by L*, RGB, sum of RGB or sort RGB gray and white to top.
    • Untethered display measurement and profiling. Be sure to read the note on optimizing testcharts for untethered measurements in automatic mode.
    • Shortcut for the BT.1886 tone curve (previously available by setting gamma to 2.4, absolute, and black output offset to zero).
    • 3D LUT: Enable additional intents.
    • 3D LUT: Support eeColor and Pandora LUT formats.
    • 3D LUT: Support ArgyllCMS 1.6 video encodings and BT.1886 gamma mapping.
    • Windows 8 ArgyllCMS driver installation instructions to the ReadMe.
    • Instructions how to proceed when a process cannot be started to the ReadMe.
    • Softproof preset (based on FOGRA recommendation).
    • madVR preset.
    • sRGB preset.
    • Allow specifying extra arguments for Argyll's targen command.
    • Computer name, EDID serial and EDID CRC32 placeholders for use in the profile name.
    • Synthetic profile creation facility (e.g. for use as source in 3D LUT generation).
    • ACES RGB and DCI P3 colorspace definitions and reference profiles.
    • Dry run. If enabled in the options menu, all functionality that calls ArgyllCMS executables will effectively do nothing. This allows review of the used command line parameters by checking the log.
    • Additional session logs are saved for most operations involving the Argyll tools (i.e. directly in the folder where created files are saved to).
    • Show profile self check ΔE*76 info in profile installation dialog.

    Changed in this release:

    • Testchart and preset improvements:
      • All testcharts for LUT profiles have been complemented with additional single channel patches. This should in most cases improve average and maximum delta E of generated profiles, in some cases significantly. In fact, testing has shown that the new “small testchart for LUT profiles” with 154 patches total yields better results than the previous “extended testchart for LUT profiles” with 238 patches.
      • The charts for curves + matrix profiles have been improved by adding a few additional body centered cubic grid patches - all the charts which are not tuned for a certain display type are body centered cubic grid based (this was also the case previously for the LUT testcharts, but not for the matrix charts).
      • The patch order in the LUT charts has been optimized to improve measurement speed.
      • The chart for gamma + matrix profiles has been removed in favor of the updated default chart for matrix profiles.
      • New additional charts for LUT profiles have been added in various sizes.
      • For each of the new charts for LUT profiles, starting from the “very large” size, optimized farthest-point-sampled versions have been added which are pre-conditioned for several common display types: sRGB tone response with Rec. 709 primaries and D65 whitepoint (consumer-grade displays), gamma 2.2 with Rec. 709 primaries and D65 whitepoint (consumer-grade displays, TVs), gamma 2.2 with AdobeRGB primaries and D65 whitepoint (entry-level and high-end graphics displays), L* tone response with NTSC primaries and D50 whitepoint (high-end graphics displays).
      • The naming and patch count of the testcharts for LUT profiles has changed. The mapping that most closely resembles the old testcharts is as follows (total number of patches in parentheses):
        • Old “Default testchart for LUT profiles” (124) → new “Small testchart for LUT profiles” (154)
        • Old “Extended testchart for LUT profiles” (238) → new “Default testchart for LUT profiles” (270)
        • Old “Large testchart for LUT profiles” (396) → new “Extended testchart for LUT profiles” (442)
        • Old “Very large testchart for LUT profiles” (912) → new “Very large testchart for LUT profiles” (994)
        • Old “Massive testchart for LUT profiles” (2386) → new “Massive testchart for LUT profiles” (2527)
      Use of the new charts is highly recommended. All presets have been updated to use the new chart types. The “prepress" preset has also been updated to generate a XYZ LUT profile by default.
    • Detect if the instrument can use CCMX or CCSS colorimeter corrections based on the measurement mode. Disable colorimeter corrections for non-base display types.
    • Correctly map measurement mode to DISPLAY_TYPE_BASE_ID for all supported instruments when creating CCMX.
    • If a colorimeter correction with DISPLAY_TYPE_BASE_ID or DISPLAY_TYPE_REFRESH is selected, automatically set the correct measurement mode.
    • If measuring the colorimeter correction testchart, automatically ensure a suitable measurement mode for colorimeters (if they support more than refresh and non-refresh measurement modes).
    • Do not use spline interpolation for curve plots.
    • Updated french translation, thanks to Loïc Guégant.
    • Renamed calibration quality to calibration speed.
    • Set calibration speed for all presets to medium.
    • Standalone testchart editor: Parse first non-option argument as file to be opened.
    • Testchart editor: Always generate good optimized points rather than fast.
    • Testchart editor: Use existing file path when saving testchart.
    • Testchart editor: Greatly improved the speed of paste operations when comparatively large data sets are used.
    • Disallow -d and -D as extra arguments for Argyll's targen as the testchart editor only supports video RGB.
    • Reset adaptive measurement mode when restoring defaults.
    • Close all profile information windows when hiding the main window instead of just hiding them (don't reopen them when the main window is shown again).
    • Curve viewer: Use float formatting for input RGB display.
    • Only skip legacy serial ports if no instrument detected.
    • Also specify Argyll dispcal/dispread -y parameter for spectrometers.
    • Use Rec. 709 whitepoint chromaticity coordinates for “Video” preset.
    • Changed profile installation error message for virtual display devices.
    • Make it clearer which calibration is used when doing a “Profile only”: When a calibration file is going to be used, change the message from the warning “The current calibration curves will be used” to the informational “The calibration file <x> will be used” with the usual options to embed/not embed/reset video card gamma table.
    • Allow the use of calibration curves when profiling a web display.
    • When creating a colorimeter correction from profile(s), get the instrument name from the embedded TI3 if the data source is not EDID.
    • Do not specify (superfluous and thus ignored) patch window positioning arguments for dispcal/dispread when using a virtual display.
    • 3D LUT: Removed black point compensation option (no longer easily possible because it now uses Argyll's collink internally. You can still have the effect of BPC by creating a display profile with BPC enabled and using it as destination profile during 3D LUT creation).
    • Always copy/move temporary files to the save location if not a dry run, also in case of an error. If copy/move fails, keep them in the temporary directory and inform the user.
    • Disable black point compensation for the “Prepress” preset (there are three presets without bpc - “madVR”, “Prepress” and “Softproof”) and use L* as calibration tone curve.

    Fixed in this release:

    • Show black point correction choice also when switching from refresh to any other measurement mode instead of only when switching from refresh to LCD measurement mode or vice versa.
    • Corrected averaged RGB transfer function display.
    • Adaptive measurement mode could not be disabled (regression of r1152 where adaptive measurement mode was made default in ${APPNAME}).
    • Work-around a very rare problem where a (bogus) display size of 0x0 mm is returned.
    • Check if the configured colorimeter correction exists before adding it to the list.
    • Update colorimeter correction and testchart lists after deleting settings files.
    • Don't carry over colprof arguments from testchart file (fixes occasional wrong display model and manufacturer in profiles).
    • Average, RMS and maximum delta E metadata was not added to profiles if equal to or greater than 10.
    • Unhandled exception when 3D LUT window was opened and there was no profile selected under settings and also no display profile set.
    • Unhandled exception if colorimeter correction does not exist.
    • Standalone curve viewer: Fix loading of .cal file via commandline argument.
    • Don't strip trailing zeros when displaying average gamma in the status bar of the profile information or curve window.
    • Only set adaptive and hires measurement mode when the instrument supports it (fixes measurement mode switching to non-adaptive if toggling betweeen a colorimeter and a spectrometer).
    • Mac OS X with ArgyllCMS 1.5 and newer: Also search library folders for ArgyllCMS support files (fixes imported colorimeter corrections not found).
    • Only fall back to private copy of pnp.ids under Mac OS X and Windows.
    • Updated link to Datacolor website download section for the Spyder 2 Windows installers.
    • Transposed bits for EDID red y chromaticity coordinate.
    • Curve viewer / profile info window: Reset tone response curve calculation when toggling LUT checkbox.
    • Correctly react to detected display changes when the actual physical displays didn't change (e.g. when switching Argyll between versions supporting and not supporting the virtual “Web” display).
    • Keypresses or cancel were not recognized during patch reading.
    • Display uniformity measurements: Q or ESC had to be pressed twice to exit.
    • Do not use “install profile” message for non-display profiles.
    • 3D LUT: “apply vcgt” checkbox stayed disabled after switching from a devicelink source profile to a non-devicelink source profile.
    • Update all open windows when switching Argyll versions
    • Do not reset selected colorimeter correction to none when selecting a preset or a settings file.
    • Measurement window position was not correct when switching from web display.
    • Show an error message when choosing a directory as profile save path where no subdirectories can be created.
    • Python 2.7 compatibility: Mask u16Fixed16Number (fixes profile information not working for profiles with negative XYZ or chromaticity values when using Python 2.7).
    • wxPython 2.9 compatibility: Do not specify number of rows in dynamically growing FlexGridSizer.
    • Linux: Use colord's quirk_vendor_name to fix the manufacturer string.
    • Mac OS X 10.6 and up: Clearing and loading calibration needs root privileges in some circumstances.
    • Windows: Correctly escape quotes in arguments (fixes hang when profile name, program path or Argyll path contains a single quote).
    • Windows: Show a meaningful error message when a subprocess can't be started instead of hanging indefinitely.
    • Windows: Ignore WMI errors.
    • Windows: Selecting testcharts saved in the root of a drive under Windows.
    • Windows: Disable broken Windows 2000 support (was broken since 0.8.5.6 when the interactive display adjustment GUI was introduced and is not fixable as Windows 2000 does not implement the required AttachConsole functionality).
    • Windows/Mac OS X: If Argyll profile installation failed, a success message was still shown.
    2013-03-03 19:42 (UTC) 1.2.7.0

    1.2.7.0

    Fixed in this release:

    • Colorimeter correction creation not working when using ArgyllCMS 1.5.0 because of missing newly required fields in CGATS data.
    • Mac OS X: Accidentally swapped “/Users/<Username>/Library/Application Support” and “/Library/Application Support”.
    2013-03-01 09:39 (UTC) 1.2.6.6

    1.2.6.6

    Added in this release:

    • ArgyllCMS 1.5.0 compatibility.
    • Ability to do remote measurements using ArgyllCMS 1.4.0 and newer (Firefox is recommended as client). See remote measurements and profiling.
    • Include black level and contrast in profile verification reports (if possible, i.e. if the test chart contains a RGB=0 patch).
    • 3D LUT: Support color space conversion ('spac') profiles.
    • DCI P3 reference profile.
    • Add “Quality” (if applicable) and “License” metadata to profiles.
    • Add colord device ID mapping to profile metadata.
    • Linux: Add screen brightness to profile metadata if profiling a mobile computer's screen (using the org.gnome.SettingsDaemon.Power DBus interface).
    • Additional logging.

    Changed in this release:

    • Revised display uniformity test to generate HTML reports.
    • Use a delay of 200 ms for display uniformity measurements.
    • Detect “Calibrate failed with 'User hit Abort Key' (No device error)” ArgyllCMS error message and ignore further errors to prevent popping up multiple error dialogs.
    • Reload currently selected calibration after verifying a profile.
    • Add metadata to fast shaper matrix profiles (e.g. gamut volume and coverage).
    • When deleting a settings file, also offer CCSS, CCMX and files starting with the settings file basename in the same directory for deletion.
    • Enable use of absolute values in profile verification reports regardless of testchart.
    • When loading a profile without calibration settings, look for an accompanying colorimeter correction in the same directory.
    • When only creating a profile and not calibrating, give a clear choice whether to embed current calibration curves in a profile or not.
    • When using black point compensation, keep the black point compensated TI3 measurement file in addition to the unaltered file.
    • When restoring default settings, don't reset the 3D LUT abstract profile as well as 3D LUT and profile info window positions.
    • Truncate the colorimeter correction description displayed in the dropdown if it's overly long.
    • Only load linear calibration curves into the curve viewer when resetting the video card gamma table.
    • Do not remove spaces from the instrument name when assembling the profile name.
    • Only compress JavaScript in HTML reports if the report.pack_js configuration option is set (default 1 = compress).

    Fixed in this release:

    • Improved instrument event handling.
    • When measuring the screen using a spectrometer, make sure to repeat the instrument calibration until it is successfully completed or canceled (ColorMunki Design/Photo).
    • When measuring ambient light with a spectrometer, abort after a 30 second timeout if instrument calibration did not complete.
    • Correctly react if the instrument sensor is in the wrong position and prompt the user to set the correct position.
    • Mouse cursor and clicked “Measure” button stayed hidden when aborting a measurement in the display device uniformity test window.
    • Updating the calibration (vcgt) of a profile didn't work if first selecting a .cal file, ticking the “Update calibration” checkbox and then switching to the profile.
    • Disable all calibration controls (except the quality slider) when “Update calibration” is ticked.
    • Only enable “Update calibration” checkbox if calibration can actually be updated.
    • Disable the “Create colorimeter correction...” and “Create 3D LUT...” menu items as well as the “LUT” checkbox in the curves and profile information windows if ArgyllCMS executables are not found.
    • Update measurement modes when switching Argyll versions.
    • wxPython 2.9 compatibility.
    • Set manufacturer, model, creator and ID in reference profiles (except ClayRGB and sRGB from Argyll).
    • Only switch over to progress dialog after a three second delay (fixes erroneously switching over to progress dialog under Windows when running calibration or display uniformity measurements directly after a canceled testchart measurement).
    • If using a DTP92, only offer refresh measurement mode.
    • Make sure updated profiles also have updated descriptions.
    • Also overwrite .gam.gz and .wrz files if overwriting an existing profile.
    • Mac OS X: Make sure the menus are re-enabled after calibrate & profile.
    2013-01-07 19:41 (UTC) 1.1.8.3

    1.1.8.3

    Changed in this release:

    • Show display device uniformity measurement window on selected display device if multiple display devices are connected.
    • Hide mouse cursor and clicked button while measuring display device uniformity.

    Fixed in this release:

    • Sporadic measurement hang when measuring display device uniformity.
    • Wrong window being shown when calibrating after display device uniformity measurements or vice versa.
    2013-01-05 13:32 (UTC) 1.1.7.0

    1.1.7.0

    Added in this release:

    • Preliminary ArgyllCMS 1.5.0 compatibility.
    • Added facility to measure and report display device uniformity. Known issue: Sometimes measurements hang. Press space to try and continue.
    • 3D LUTs can optionally incorporate abstract (“Look”) profiles.
    • 3D LUTs can be created from Device Link (class “link”) and input (class “scnr”) profiles.
    • 3D LUTs can also be created in SPI3D format.

    Changed in this release:

    • Updated french translation, thanks to Loïc Guégant.

    Fixed in this release:

    • Fedora: Calibration curves were reset to linear when installing a profile and using the Fedora packaged ArgyllCMS.
    • Linux, Mac OS X, Windows (Administrator): Colorimeter corrections imported from i1 Profiler and ColorMunki Display software were not listed in the dropdown menu.
    2012-11-05 20:32 (UTC) 1.1.2.9

    1.1.2.9

    Changed in this release:

    • Simplified Spyder 2 enabling instructions.

    Fixed in this release:

    • Broken Unicode support (unhandled exception) when dealing with colorimeter correction descriptions containing 8-Bit characters.
    • Check if xicclu is found before attempting to use it for the profile information window (gets rid of bogus “'NoneType' object has no attribute 'encode'” message).
    • Use a default generic message when prompting to choose a profile.
    2012-10-05 19:04 (UTC) 1.1.2.1

    1.1.2.1

    Changed in this release:

    • Disable source profile selector in advanced gamut mapping options if not atleast one of perceptual or saturation checkboxes is selected.
    • Only show a warning if an incompatible colorimeter correction is explicitly selected via the filebrowser.
    • Show a less cryptic error message if an invalid file is selected when importing colorimeter corrections from other display profiling software.

    Fixed in this release:

    • Whitepoint color temperature is an integer, not a float. This fixes calibration settings being detected as changed when they actually haven't.
    • Worked around a bug in wxPython where controls in a hidden window react to focus events. This fixes the sporadic hang after calibration measurements during a “Calibrate & profile” run.
    • Linux, Mac OS X: Unhandled exception when trying to import colorimeter corrections from other display profiling software and selecting a file with '.txt' extension.
    2012-09-15 15:38 (UTC) 1.1

    1.1

    Added in this release:

    • Additional profile name placeholder %ds for the display device serial from EDID if applicable (may be empty or bogus).
    • Windows: Additional profile name placeholders %dnw (DeviceString) and %dnws (shortened DeviceString, it may be the same as %dnw if shortening isn't possible). The former is equivalent to what's shown in the display device dropdown. The DeviceString is often more verbose as the sometimes very generic EDID device name (placeholder %dn).

    Changed in this release:

    • Updated spanish translation (thanks to Roberto Quintero).

    Fixed in this release:

    • Show an error message if a colorimeter correction cannot be used with the selected instrument.
    • Show an error message when trying to import colorimeter corrections from an unsupported filetype.
    2012-08-01 10:13 (UTC) 1.0.9.0

    1.0.9.0

    Changed in this release:

    • Use the original file basename for colorimeter corrections copied over to the storage directory (previously, if a colorimeter correction was copied, it inherited the same basename as the rest of the measurement/profile/calibration files, thus making it a bit cumbersome to determine which colorimeter correction was originally the source, especially in profile verification reports which only showed the filename and not the description from the file contents).
    • Show colorimeter correction file basename in addition to the description if they are different.
    • Linux: Fall back to gcm-import if colord profile installation fails.

    Fixed in this release:

    • When switching to L*/Rec. 709/SMPTE or sRGB and then loading settings with a gamma value, the gamma entry field was not shown.
    • Report on calibrated/uncalibrated display and calibration verification did not work if using a colorimeter correction (regression of changeset #1020).
    • Do not freeze if loading a settings file which had an accompanying colorimeter correction that was since deleted.
    • Windows 2000: Don't fail to launch.
    2012-06-28 22:05 (UTC) 1.0.7.7

    1.0.7.7

    This is a bug-fix release for version 1.0.7.6.

    Fixed in this release:

    • Unhandled exception in gamut view calculation after profile creation if using french localization.
    2012-06-23 00:25 (UTC) 1.0.7.6

    1.0.7.6

    Added in this release:

    • Option to auto-select a suitable colorimeter correction if available locally.
    • Ability to choose between L*a*b*, XYZ and xyY in profile verification reports.

    Changed in this release:

    • Reset default black point correction from automatic to off.
    • If a profile contains no 'vcgt' tag, assume linear calibration.
    • When creating a colorimeter correction, remember the last selected reference and colorimeter measurement file separately.
    • When creating a colorimeter correction, automatically only use white, red, green and blue patches (at 100% device value each) from measurement files, regardless if they contain more patches. This allows re-using of measurement files with different patch counts (as long as they contain those four combinations) that have been created as by-product of other operations, e.g. during profiling. Note that measurements still need to be done under identical conditions and within reasonable timeframe (ideally less than a few minutes apart) to minimize effects of display and instrument drift when creating colorimeter corrections from them.
    • When measuring the colorimeter correction testchart, automatically set the resulting measurement as last selected reference or colorimeter file depending on whether it contains spectral data or not.
    • When restoring the current calibration after measuring the colorimeter correction testchart, do it silently (don't show a message window).
    • Filter colorimeter corrections by selected instrument.
    • Show colorimeter correction description in the dropdown instead of the filename. Show the filename and path on mouse hover.
    • ColorHug: Only enable colorimeter corrections for “Factory” and “Raw” measurement modes.
    • ColorHug: Automatically set “Factory” measurement mode when measuring the colorimeter correction testchart and measurement mode is not yet “Factory” or “Raw”. Restore previous measurement mode afterwards.
    • Linux: Enable ColorHug support by default.
    • Linux: colord wrapper now uses PyGObject instead of ctypes.
    • Updated french translation, thanks to Loïc Guégant.

    Fixed in this release:

    • When creating a 3D LUT, don't fail if the target profile contains no 'vcgt' tag and the preference is “Apply calibration” (which is the default) irrespective of checkbox state.
    • Use colorimeter correction (if applicable) from settings stored in calibration files and profiles when loading them.
    • When creating a colorimeter correction, the display name in the description is now taken from the measurement file if available.
    • When creating a colorimeter correction, automatically order the measurements exactly the same by device (RGB) triplets.
    • Hide any profile information window(s) when the main window is hidden and restore them when it is shown again.
    • Correct ID on profile created from EDID after adding gamut coverage/volume metadata.
    • Measurement modes other than “LCD (generic)” and “Refresh (generic)” are now correctly restored from settings embedded in calibration files and profiles.
    • If using the current calibration curves for profiling without calibrating (“Profile only” with “Reset video card gamma table” unchecked), using ArgyllCMS 1.4.0, the resulting profile will now contain a 'vcgt' tag with the current calibration like with previous Argyll versions.
    • RGB bars and chromaticity/color temperature readouts when adjusting a whitepoint with blackbody target are now working correctly.
    • Ignore and do not show any explicitly selected Colorimeter Calibration Spectral Sample (CCSS) file for instruments that do not support it.
    • Changing Argyll version/binaries in ${APPNAME} with automatic instrument detection switched off is working correctly again without the need to restart the program.
    • Show ColorHug-specific measurement modes (please run instrument detection once again to refresh the list if you already used the ColorHug in a previous version of ${APPNAME}).
    • Saturation gamut mapping settings are no longer ignored.
    • Trying to view profile information for profiles whose black point X Y Z sum is zero will no longer result in a division by zero error.
    • Black point compensation is no longer attempted if not atleast one black or white patch is found in measurement data.
    • Linux: Don't error out if profile installation with dispwin fails, but profile installation via colord or oyranos-monitor is successful (fixes profile installation when using the distribution-packaged Argyll under Fedora)
    • Linux: colord device key name now correctly adheres to device naming spec for xrandr devices (fixes some profile installation problems).
    • Linux, Windows: Correctly detect in the profile loader if linear calibration is assumed when using ArgyllCMS 1.4.0 or newer.
    • Windows: Continuous measurements during interactive display adjustment are now stopped reliably when clicking the “Stop measurements” button or hitting the space key.
    2012-04-02 19:24 (UTC) 0.9.9.1

    0.9.9.1

    Added in this release:

    • Spyder 4 support if using ArgyllCMS >= 1.3.6. To make all measurement modes available, you have to use “Import correction matrices from other display profiling softwares...” from the “Tools” menu.
    • Experimental ColorHug support is enabled through ArgyllCMS >= 1.3.6 if the ENABLE_COLORHUG environment variable is set, but the ColorHug currently doesn't work reliably across all platforms.
    • Added information about instrument measurement modes to the ReadMe.

    Changed in this release:

    • GUI spring-cleaning: Re-arranged some controls and replaced radiobuttons and read-only combo-boxes with choice controls instead. Only the controls related to a selected choice are shown.
    • Default calibration black point correction to automatic.
    • Replaced previous 19-patch colorimeter correction testchart with smaller 4-patch version (just red, green, blue at 100% each and white, as is the default with ArgyllCMS 1.3.6).
    • Linux packages: Added ArgyllCMS to dependencies. Please note: If you want the latest Argyll features or run into problems, it is recommended to download the standalone Argyll binaries from argyllcms.com as the distribution repositories often only contain older ArgyllCMS releases.

    Fixed in this release:

    • Fixed unhandled exception when adding metadata to a profile from EDID that contains an invalid (out of range) gamma value.
    • Fixed slightly off the mark whitepoint in resulting profile when using black point compensation (typical max. error 0.2 ΔE*76). You may want to re-create existing profiles.
    • Do not reset visibility of advanced calibration options when restoring defaults.
    • Store black point compensation setting in profiles.
    • Mac OS X: The application bundle now again contains all required files (no missing files when dragging just the bundle to Mac OS X “Applications” folder).
    2012-03-15 14:45 (UTC) 0.9.6.6

    0.9.6.6

    Added in this release:

    • Black point compensation option for profiles (default ON). This effectively prevents black crush, but at the expense of accuracy of the resulting profile.
    • Profile information window with 2D gamut plot as well as information pane which shows profile header and tag data in detail (with few exceptions).
    • Ability to create display correction 3D LUTs for use in movie post-processing applications that don't have ICC support. Currently supported are the .3dl and .cube formats.
    • Write gamut VRML files and calculate coverage and volume percentages against sRGB and Adobe RGB when creating profiles.
    • Add 'chrm' tag (xy chromaticities for each primary) to created profiles. Unlike the values from 'rXYZ', 'gXYZ', 'bXYZ', A2Bx or 'clrt' tags, the 'chrm' data corresponds to the actual measured chromaticities without chromatic adaptation or interpolation. The 'chrm' tag is purely informational.
    • Windows 7 and later: Added an option to let the operating system handle calibration loading when installing a profile (this option requires ${APPNAME} to be run as Administrator and is also available in the ${APPNAME} installer. If selecting the option there, the ${APPNAME} Profile Loader will not be installed to the startup items. A shortcut to the loader is still available in the ${APPNAME} folder in the start menu though, to be able to quickly force a reload of calibration).

    Changed in this release:

    • Instrument detection now defaults to manual. A click on the icon with the swirling arrows or choosing the corresponding menu item in the “Options” menu detects connected instruments. Automatic instrument detection can be (re-)enabled/disabled there, too.
    • The ${APPNAME} Profile Loader can now be set to not show error messages again (errors will still be logged).
    • Tone response curves are now plotted as L* → RGB by default and are also calculated for LUT profiles (profiles with both LUT and matrix TRC tags allow on-the-fly switching between them). In addition, the transfer function is shown if it can be estimated.
    • Windows: Allow enabling/disabling of calibration loading on login when installing a profile (to be able to change this option when Windows 7 or later is set up to handle calibration loading, either ${APPNAME} needs to be run as administrator or in the Windows color management control panel “Advanced” tab, click on “Change system defaults...” and disable “Use Windows display calibration”).

    Fixed in this release:

    • Do not fail to launch due to unhandled exception when parsing CGATS files containing KEYWORD, INDEX, SAMPLE_ID or DATA_FORMAT values in exponential notation.
    • Do not use exponential notation for low (< 0.0001) calibration black level target values.
    • Correctly handle failed instrument calibration (by asking to repeat) and measurement failures which are not misreads or communication failures (and should thus not be retried automatically).
    • Also look at ASCII descriptor blocks when determining the display device name from EDID (fixes display model not being set in profiles for certain Apple displays).
    • Don't loose 'mmod' tag (monitor make and model) when creating a profile from measurement data embedded in an existing profile.
    • Automatically restore calibration after measuring the colorimeter correction testchart.
    • Restore ArgyllCMS < 1.3.0 compatibility (broken in 0.8.9.3).
    • Windows Vista, 7 and later: Automatically enable “Use my settings for this device” in Windows' colormanagement settings when installing a profile.
    2012-02-11 03:56 (UTC) 0.8.9.3

    0.8.9.3

    Fixed in this release:

    • Selecting a smaller default testchart than the recommended one did not work (was reset to the recommended default when starting measurements or re-starting ${APPNAME}).
    • Restore previously selected testchart if canceling colorimeter correction measurements.
    • Disable the “Measure” button in the “Create colorimeter correction” dialog if no display or instrument detected/selected.
    • Disable menus while the main window isn't shown (only affects operating systems where the menu is not part of the main window e.g. Mac OS X).
    • Linux: Fixed i1 Display Pro / ColorMunki Display missing from Argyll udev rules (this was actually already fixed in 0.8.5.2, but not mentioned in the changelog).
    • Mac OS X Lion: Removed sporadic password dialog being shown after calibration measurements when running “Calibrate & profile”.
    • Mac OS X Lion: Fixed an issue with profile installation for the current user which only installed the profile for the root user, thus not making it available in system preferences and making e.g. the login screen the only visible place where it was effectively being used.

    Changed in this release:

    • Allow the selection of LCD or CRT measurement modes for spectrometers too (determines the available controls during interactive display adjustment).

    Added in this release:

    • GUI for interactive display adjustment.
    • Add 'mmod' tag (monitor make and model, an Apple-specific private tag) to created profiles (ensures the profiles still show up in Mac OS X system preferences if “Show profiles for this display only” is ticked).
    2012-01-24 18:40 (UTC) 0.8.5.2

    0.8.5.2

    Fixed in this release:

    • Added missing numbers to “delta E too high” message when trying to upload a profile with low self-fit accuracy.
    • Decoding of numerical manufacturer ID from EDID when adding metadata to a profile was done in the wrong byte order.
    • Fixed missing terminating NUL character for copyright tag when creating a profile from EDID.
    • Fixed missing underscore in EDID colorimetric metadata key names as per the ICC meta Tag for Monitor Profiles specification.
    • Linux: Display measurements couldn't be started if ${APPNAME} was installed via the 0install feed.
    • Mac OS X: The file which maps Plug'n'Play device IDs to manufacturer names was not found when running from the application bundle, resulting in manufacturer entries in profiles always being equivalent to the three-letter PnP ID instead of the full manufacturer name.

    Changed in this release:

    • Measurements for colorimeter corrections can now be started directly from the dialog, and the previous testchart is restored afterwards.
    • Add more metadata to generated profiles to allow better automatic selection/ranking on systems that support it and standardized a few previously ${APPNAME}-only keys (ICC meta Tag for Monitor Profiles / GCM metadata specification).
    • Use product code as fallback for make/model when creating profiles from EDID.
    • Windows: In case of an ArgyllCMS 'config 1 failed' error upon trying to use an instrument, inform the user its driver may not be installed.

    Added in this release:

    • Added ability to specify the display technology for created colorimeter corrections.
    • Enabled overriding of default gamut mapping intents for LUT profiles. “Luminance matched appearance” is the default override for perceptual intent, which provides an effect similar to black point compensation.
    • The colorimeter corrections database now has a public web interface and API.
    2011-12-08 13:33 (UTC) 0.8.1.9

    0.8.1.9

    Fixed in this release:

    • Ignore 'unknown' (not required) fields when verifying CGATS (fixes bug 'invalid testchart' after profiling with spectrometer, introduced in r780).
    • Force a default testchart if the selected one is invalid.
    • Linux (autopackage): Set PYTHONDONTWRITEBYTECODE= (empty string) to fix installation on Mandriva 2011.

    Changed in this release:

    • Default profile type should be 3x shaper + matrix, not single shaper + matrix.
    • Some of the advanced calibration options (gamma type relative/absolute, ambient adjustment, black point correction and offset) are now hidden by default and can be shown via the corresponding menu item in the options menu.

    Added in this release:

    • Option to share profiles via the openSUSE ICC Profile Taxi service.
    • Option to create profiles from extended display identification data (EDID).
    • Linux (GNOME 3): colord compatibility (query current profile, install & set profile).
    2011-10-06 21:44 (UTC) 0.7.8.9

    0.7.8.9

    Fixed in this release:

    • Additional commandline arguments were ignored when doing profile verification measurements.
    • Windows: If the startup folder in the start menu was deliberately deleted, the profile loader shortcut wasn't created when installing a profile.
    • Windows: Profile loader correctly verifies if the calibration was sucessfully loaded.

    Changed in this release:

    • Skip legacy serial ports by default when detecting instruments (serial instruments like the DTP92 or Spectrolino will no longer be selectable unless you manually set skip_legacy_serial_ports = 0 in ${APPNAME}.ini or use a serial to USB adapter).
    • Windows: The profile loader shortcut in the startup folder inside the start menu is now created at installation time (and removed when uninstalling).
    • When checking for program updates, show the changelog for the new version if an update is available.
    • Confirm enabling of debugging output.

    Added in this release:

    • Support for ArgyllCMS 1.3.4 features: i1 Display Pro and Colormunki Display, Colorimeter Calibration Spectral Sample (.ccss) files.
    • Ability to import colorimeter corrections from other display profiling softwares. Currently iColor Display, i1 Profiler and ColorMunki Display are supported.
    • Ability to create correction matrices and Calibration Spectral Sample files, with the option to share them via an online database.
    • Option to automatically check for program updates on startup.
    • Added information how to fix instrument not working correctly/constantly disconnecting under Linux due to a conflict with libmtp (thanks to Pascal Obry who notified me of the issue back in May 2011).
    2011-08-05 01:06 (UTC) 0.7.3.7

    0.7.3.7

    Fixed in this release:

    • Linux: Fixed multi-display support when not using separate X screens.
    • Mac OS X: Fixed not being able to run under a standard user account, and Mac OS X 10.7 compatibility.
    • Mac OS X 10.4.x: Fixed functionality requiring elevated privileges, e.g. installing profiles system wide or enabling the Spyder 2 using Argyll 1.1.x (regression of a change introduced in r706 / 0.7.0.7)
    • Windows: Fixed several problems with special characters in paths which are not representable through the file system encoding.
    • Windows: Worked around OS localtime() bug. If the system's clock was set to a date far into the future, ${APPNAME} failed to launch on subsequent runs because of the logfile's timestamp which could not be processed by localtime().
    • Windows Vista/7: Querying the user display profile resulted in a “not found” error if the checkbox “Use my settings for this device” was never ticked in Windows' color management control panel, failing the fallback of querying the system display profile in case of no user display profile.

    Changed in this release:

    • All presets now use curves + matrix as profile type (for better overall application compatibility).
    • Better feedback when trying to open broken/invalid files (display an error dialog instead of just logging the error).
    • Icons in the task switcher on Windows Vista/7 (and presumably Linux) should now be crisp and not pixelated.
    2011-06-02 21:45 (UTC) 0.7.0.7

    0.7.0.7

    Fixed in this release:

    • wxPython 2.8.12 compatibility.
    • Linux: Preserve environment when installing a profile system-wide so $DISPLAY is available for dispwin.
    • Linux (Source): Changed highest supported Python version to “lower than 3.0” because openSUSE Build Service would choke on “lower than or equal to 2.7” when building for Ubuntu 11.04.
    • Linux (Source): Fixed setup.py bdist_deb as far as possible (see notes under installing from source, additional setup commands, bdist_deb)
    • Windows: Fixed error when the display profile cannot be determined (e.g. when running remotely).
    2011-04-20 21:08 (UTC) 0.7.0.0

    0.7.0.0

    Fixed in this release:

    • Updating profile verification reports created in versions prior to revision 672 should not strip calibration and gray balance information anymore (regression of a change in r672).
    • If the Spyder 2 was enabled using ArgyllCMS 1.2 or newer, this should now be reflected correctly in the “Tools” menu by a checkmark next to the “Enable Spyder 2” menu item.
    • Linux (Autopackage, DEB and RPM installs) and source: Fixed missing application icons in sizes other than 16x16 and 32x32 if the source archive was created with setup.py under Mac OS X or Windows (regression of a change in r501).
    • Linux/Windows: The location of the Argyll binaries was not stored in the system-wide configuration, which could prevent the profile loader from finding the Argyll binaries if they were not on the PATH environment variable and a profile was installed system-wide.
    • Windows: Fixed program termination if EnumDisplayDevices fails (e.g. when running remotely).
    • Windows: Fixed program termination if a display device has no driver entry in the registry (the very generic Windows error message is misleading in that case: It pretends a file was not found).
    • Windows XP: Correctly enumerate display device names and EDID.

    Changed in this release:

    • When doing verification measurements of a (non-Argyll) profile containing a chromatic adaptation 'chad' tag, ${APPNAME} now tries to use the same chromatic adaptation transform to calculate adapted values from the measurements instead of using a hardcoded Bradford transform.
    • The default delta E formula for “RGB + gray balance” evaluation is now DE 2000.
    • The delta E formula is now locked for the Fogra MediaWedge and IDEAlliance Control Strip evaluation criteria.
    • The “Update calibration” and “Update profile” checkboxes were combined into one. This removes the ambiguity about what “Update profile” functionality actually was: Only updating the calibration inside the profile. Both updating stand-alone calibration '.cal' files and calibrations embedded in profiles are now handled with the single “Update calibration” checkbox. The slightly different workflow of only updating the calibration, and then creating an actual new profile on top of it in one go, is still possible by explicitly loading a calibration '.cal' file under “Settings”.
    • Made the GUI a bit nicer towards low screen resolutions by moving more controls into the scrollable area and also removing the graphical banner and allowing horizontal scrollbars if things get really cramped.
    • Windows Vista/7 and later: To be able to install a profile system-wide, you now need to run ${APPNAME} explicitly as administrator (right-click the ${APPNAME} icon, then select “Run as administrator”) to show the appropriate controls in the profile installation dialog.

    Added in this release:

    2011-01-24 03:56 (UTC) 0.6.7.7

    0.6.7.7

    Fixed in this release:

    • Fixed measurements hanging at the start if using the black background option.
    • wxPython 2.9 compatibility.
    • Windows: Potential COM error caused by obsolete code.
    • Windows Vista/7: Potential WMI errors when trying to read a display's EDID are now suppressed (the EDID can not be read on systems where WMI has errors, which may prevent more accurate display descriptions, but will not impede functionality otherwise).

    Added in this release:

    • Profiles can now be dragged and dropped onto the curve viewer.
    • When using the profile verification feature, it is now possible to first select a simulation profile before choosing a testchart.
    2010-11-05 03:12 (UTC) 0.6.6.7

    0.6.6.7

    Fixed in this release:

    • Re-enabled warning message from the profile loader if the calibration in the video card does not match the requested calibration after loading.
    • Fixed “Show curves” checkbox in the profile installation dialog not doing anything if the curve viewer was not shown before (regression of a change in version 0.6.2.2).
    • Fixed a small visual glitch where the message “Calibration complete” was not cleared from the progress window after instrument calibration.
    • Fixed possibility of unprintable characters from EDID strings (e.g. display name) causing errors.
    • Fixed ArgyllCMS diagnostic output not working for dispwin when using ArgyllCMS 1.3.1
    • Linux: Fixed Autopackage install not working with Python 2.7

    Added in this release:

    • Linux: Added a “Load profile and calibration on login” checkbox to the profile installation dialog. Normally, you want to keep this checked, so that ${APPNAME}'s profile loader can setup the configured display(s). But if you use another solution for loading profiles, like Oyranos with the CompICC plugin, you should uncheck it, so that display profiles are solely handled by CompICC.
    • Mac OS X: Like on the other platforms, EDID is now used if available.
    2010-10-24 04:36 (UTC) 0.6.5.3

    0.6.5.3

    Fixed in this release:

    • Fixed a bug where the wrong correction matrix setting was stored in a profile or calibration file when changing the correction matrix, and creating a profile with a previous settings file selected which used a different correction matrix. Note this didn't affect measurements when creating the new profile or calibration file, but when loading it in ${APPNAME}, the correction matrix used for the previously selected settings file was set instead of the one actually used when creating the new file.
    • Fixed missing XYZ values for the assumed whitepoint in profile verification reports.
    • Fixed crash when the manufacturer ID from a display's EDID contains invalid data.
    • Honor the selected display when loading calibration curves from a settings file.
    • Linux: Installing profiles under multi-display configurations using separate X screens should now work better when Oyranos is installed (previously, when the profile for the second screen was installed after the profile for the first screen, it would override the first profile in the Oyranos configuration. Profiles can be re-installed with this version of ${APPNAME} to fix this).
    • Linux: Profile loader: When Oyranos is installed, but not xcalib, the fallback to dispwin to load the calibration curves was not working.

    Changed in this release:

    • Reset additional commandline arguments too when restoring defaults.
    • The profile loader will no longer show an error message when unable to determine a display's current ICC profile, as there may just not be any profile installed for the respective display. Instead, such errors are now silently logged.
    • Improved error messages from the profile loader by adding some information about the affected display for easier troubleshooting of multi-display configurations.
    • Windows: Profile installation: When a system-wide autostart entry for the calibration loader already exists, do not create a per-user entry.
    • Linux: The autopackage can now be installed just for the current user. Note this will not setup instrument access though, as that requires root privileges.

    Added in this release:

    • Save the device model and manufacturer description to measurement data (.ti3) files and use that information when creating a profile.
    • Log all output from the profile loader.
    • Ability to just measure a testchart and create a measurement data file (menu “Options”, “Measure testchart”).
    • Approximate gamma for grayscales is shown in profile verification reports.
    • Build system: Added --skip-postinstall option.
    2010-09-19 17:53 (UTC) 0.6.2.2

    0.6.2.2

    Fixed in this release:

    • Trying to verify or view curves of a (non-Argyll) profile with a 'formula' type vcgt tag no longer fails with a 'NameError'.
    • When the measurement window was moved to the leftmost and/or topmost coordinates of the screen, the calculated relative position could become negative and prevent starting measurements.
    • Trying to profile a display which provides an empty model description via EDID no longer fails.
    • Profile name placeholder %im (instrument measurement mode) now inserts the correct string.
    • Profiling did not finish if “Show actual calibration curves from video card gamma table” was checked and the curves window shown.
    • Fixed black point correction rate not being restored correctly when loading settings.
    • Fixed conversion of the color temperature to xy chromaticity coordinates (the input fields in the GUI) which was erroneously being calculated with the formula for daylight even if a blackbody locus was chosen.
    • Fixed assumed whitepoint in profile verification reports erroneously being calculated with the formula for daylight even if a blackbody locus was originally chosen when creating the profile.
    • Fixed profile verification reports not working in Internet Explorer 5.x-6.0 and Opera 7.x.
    • Fixed profile verification reports showing “missing data” for some fields if using the Fogra Media Wedge V3 criteria and the reference file contained both XYZ and Lab data.
    • Mac OS X: A double extension (.icc.icm) is no longer added when creating a profile from an existing one (menu “Options”, “Create profile from measurement data...”).

    Changed in this release:

    • When loading settings from calibration (.cal) files, the actual parameters chosen when calibrating are now set instead of stored measured values (e.g. whitepoint, black- and white level. Will only work for .cal files created in this version and up).
    • “Allow skipping of spectrometer self-calibration” (in the “Options” menu) for characterization readings after calibration is now disabled by default to help sensor stability (especially for the ColorMunki).
    • Black point correction rate now uses a floating-point control with the range 0.05...20.0 (consistent with the ArgyllCMS dispcal commandline tool) instead of the previous integer control with the range 5...2000.
    • The default evaluation criteria for RGB testcharts in profile verification reports is now RGB only.
    • The default Delta E formula used for results in profile verification reports is now Delta E 2000 (except for standardised criteria like the Fogra Media Wedge V3).
    • Additional statistics in profile verification reports are now hidden by default.
    • Selecting “CMYK” or “RGB” in profile verification reports now actually makes a difference (shows the corresponding device values in the overview).
    • “Evaluate gray balance through calibration only” in profile verification reports is now disabled by default.
    • Windows: Installing a profile system-wide removes an existing user autostart entry for the profile loader to avoid having two entries.
    • Windows: EDID info will be used if available instead of generic device strings ('PnP-Monitor' et al).

    Added in this release:

    • Ability to enable ArgyllCMS diagnostic (debugging) output for measurements via menu “Options”.
    • Option to choose blackbody whitepoint reference instead of daylight in profile verification reports.
    • Original profile whitepoint is now shown in profile verification reports.
    • Instrument black level and display white level drift compensation options when using ArgyllCMS >= 1.3.0
    • Ability to choose a correction matrix for colorimeters when using ArgyllCMS >= 1.3.0
    • Allow setting of additional commandline arguments for dispcal, dispread, spotread and colprof via a new menu item in the “Options” menu.
    • IDEAlliance Control Strip 2009 aim values for profile verification with CMYK test charts.
    • Profile verification report shows instrument measurement mode and correction matrix (if any).
    • Menu option to update existing profile verification reports with the current templates.
    2010-08-01 03:19 (UTC) 0.5.8.1

    0.5.8.1

    Fixed in this release:

    • ArgyllCMS 1.2.0 compatibility
    2010-07-25 13:19 (UTC) 0.5.8.0

    0.5.8.0

    Fixed in this release:

    • The timeout of 10 seconds for the startup of Argyll tools and instrument initialization was too short for some instruments and is now increased to 30 seconds. If the timeout is ever exceeded, ${APPNAME} should now also abort automatically and no longer hang.
    • When previewing the calibration upon profile installation, use a linear calibration if no display profile is present when toggling the preview on and off (fixes the curve viewer not updating).
    • Fixed closing the log window not re-enabling the “show log automatically” menuitem.
    • Linux (Autopackage install): Fixed menu entry sometimes disappearing permanently after logging out under GNOME.
    • Linux: Fixed ${APPNAME} not working if libX11 or libXrandr do not expose certain functions (e.g. under Mandriva 2009).
    • Linux: Fixed not being able to install a profile using GNOME Color Manager when the profile was not writable.
    • Linux: Fixed not being able to install a profile using Oyranos when the profile was not located in ~/.color/icc/devices/display.
    • Linux/Mac OS X: Saving a log file from the log window now works correctly.
    • Mac OS X: The terminal should no longer lose its focus when the measurement area is shown. This should also make the mouse cursor reappear which is otherwise hidden by dispcal/dispread.
    • Mac OS X 10.6: The current display profile should now be determined correctly (e.g. for the curve viewer) when loading its calibration curves or selecting the “<Current>” settings.
    • Windows (installer): An unused console window is no longer shown when launching ${APPNAME} via the installed shortcuts.
    • Windows: Fixed executable not working under Windows 2000.

    Changed in this release:

    • Do not pass through the “hit any key to retry” message from ArgyllCMS tools to the progress dialog in case of misreads/port communication problems (retries happen automatically, so there is no need and also no possibility for keyboard interaction).
    • Enabling the Spyder 2 is now less cumbersome if the original installation CD is not available (especially on Mac OS X, where the firmware couldn't be found if a recent version of the Spyder 2 software was installed) and should work with the downloadable Spyder 2 software installers (but they need to be run to install the software first because the firmware can't be extracted from the installer binaries directly). Messages are now hopefully more informative to give a better idea of what to do. If the firmware can't be extracted from the Spyder 2 software installer, you are asked to install the software and try again. If that can't be done because of platform incompatibility (Linux), the last choice is to locate the Spyder.lib/CVSpyder.dll file manually (it must be copied from a Mac OS X or Windows system in that case).
    • Linux: Allow installation of profiles using GNOME Color Manager even if XRandR is not working/available.
    • Linux: Installation now checks for existing udev rules/hotplug scripts for instruments and only installs its own rules if none exist yet.
    • Linux/Windows: The profile loader will now show a warning dialog if a profile couldn't be loaded.
    • Linux/Windows: Device model and manufacturer are added to profiles if EDID[10] info is available.

    + Numerous other small fixes and changes.

    2010-06-29 19:23 (UTC) 0.4.9.2

    0.4.9.2

    Fixed in this release:

    • Spectrometer sensor calibration sometimes accidentally occured when the instrument was still attached to the screen, leading to erroneous subsequent readings.
    • Immediately close a profile after reading to avoid locking it (fixes not being able to delete files from within the GUI).
    • Fixed quirks in “update calibration” and “update profile” operation.
    • The system-wide installation option in the profile install dialog is no longer hidden just because a profile has no embedded calibration curves (vcgt tag).
    • If the calibration curves of the current display profile couldn't be loaded for some reason (broken video card gamma table access, or no profile set), the curve viewer was not yet shown, and then a profile under “Settings” was selected, and then deleted, and then the curve viewer called up, an unhandled exception was raised.
    • Fixed ambient measurement via the “Measure” buttons timing out with the ColorMunki and various error handling issues regardless of instrument which could lead to an un-cancelable, forever looping progress bar.
    • Fixed ambient color temperature measurement via the “Measure” button not updating the kelvin field if selected.
    • Linux (only if the detected filesystem encoding is not UTF-8), Mac OS X and Windows: When installing a profile with “special” characters in the filename (everything not representable as 7-bit ASCII), it is now given an unique name containing the display number and MD5 hash, which fixes a few problems with filename encoding under Linux and Mac OS (under Linux the profile couldn't be successfully installed, under Mac OS X system-wide installation partly broke). This also fixes an issue under Windows where a profile whose name starts with the same first few characters (but has not the same name) as an already existing file in the system profile directory could accidentally overwrite that file, because I had not considered that filenames returned by win32api.GetShortPathName are only unique for the directory where a given file resides—and upon installation, that is the profile storage directory, not the system profile directory.
    • Linux, Mac OS X: When installing a profile, interaction with the curves window works now while the installation dialog is shown.
    • Windows (standalone executable): Fixed ambient measurement via the “Measure” buttons reproducably hanging (regardless of instrument) if the MS Visual C++ 2008 Redistributable Package (x86) was not installed.

    Added in this release:

    • Linux: Oyranos support. If it is available, profiles are imported to the Oyranos database using oyranos-monitor upon installation, and an appropriate autostart entry is created to load calibration curves and setup the X _ICC_PROFILE atoms on login.
    • Linux: Rudimentary support for GNOME Color Manager. If it is available and XRandR is working, profiles are imported to GCM upon installation. Any calibration loaders created previously by ${APPNAME} will be removed (except the possible oyranos-monitor entry). You then still have to manually assign the profile to a display in the GCM preferences by selecting it and then choosing the profile from the dropdown menu (in the future, this process will be made obsolete by using GCM library functions). Loading of calibration curves and setting up the X _ICC_PROFILE atom and XRandR output properties is then handled by GCM.
    • Menu option to automatically show the log window after certain operations (measurements, profile creation).

    Changed in this release:

    • The terminal window is now only shown when required (e.g. keyboard interaction during interactive display adjustment). Also, the terminal used is no longer an external application, but a minimal emulator that just passes keyboard input to the ArgyllCMS tools.
    • All measurements which do not require keyboard interaction with ArgyllCMS tools now show a progress dialog with the option to cancel the measurements. All output that was previously visible through the terminal is still available via the log window (“Tools” menu) and -file.
    • Always load calibration curves before installing a profile, even if the profile has no vcgt tag (resets calibration to linear).
    • Automatically scroll to bottom when messages are added to the log window.
    • Store calibration and profiling settings in extra sections inside the TI3 file instead of the profile copyright tag. Use “generic” copyright information (“Created with ${APPNAME} <version> and ArgyllCMS <version>”), overridable by adding a line copyright = My copyright information in ${APPNAME}'s configuration file.
    • Made sure that only 7-bit ASCII gets written to a profile's copyright, ASCII description, and ASCII device model description. ICC v2 Unicode and Mac ScriptCode descriptions are now also written by default.
    • Presets default to high profile quality.
    • Remember visible state of curves, log window and testchart editor.
    • Updated french translation (thanks).
    • Linux: Unattended calibration & profiling no longer depends on xautomation.
    • Linux: EDID[10] is now used (if available) when generating descriptive identifiers for displays.
    • Linux: When determining a display's associated profile, check XrandR _ICC_PROFILE output properties first if available.
    • Linux: The option to install a profile system-wide is not offered if using GNOME Color Manager to install profiles (GCM has its own way to set profiles as system default).
    • Linux (only when GCM is not installed or XRandR is not working), Mac OS X, Windows: Installing a profile system-wide now also sets it as default for the current user.
    • Windows Vista and later: The option to install a profile system-wide is no longer offered if using ArgyllCMS <= 1.1.1 (system scope in Argyll releases up to 1.1.1 acts like user scope on those systems).

    + Numerous other small fixes and changes. There is now also a mailing list for discussion and support as well as announcements (see at the top of this document).

    2010-05-07 22:36 (UTC) 0.3.9.9

    0.3.9.9

    Fixed in this release:

    • Fixed unreliable (hanging occasionally) profile install when using system scope under Linux and Mac OS X (regression of a change in SVN r391 / 0.3.9.3).
    • Fixed ICC profile truncation if actual tag data is not in the same order as the tag table (regression of a change in SVN r274 / 0.3.0.7. Argyll profiles were not affected).
    • Fixed potential invalid profile name being generated if some unicode characters can't be conveyed in the file system encoding (Windows, Linux).
    • Fixed possible backslash in profile name due to wrong escaping when replacing invalid characters.
    • Fixed support for codepages 65000 (UTF-7) and 65001 (UTF-8) in the main application under Windows. This is actually a fix for shortcomings of Python.
    2010-05-03 18:45 (UTC) 0.3.9.3

    0.3.9.3

    Added in this release:

    • Show percentage and amount of tone values per channel (+ grayscales) for calibration curves in the curve viewer and profile verification reports.
    • Profile verification: Enabled gray balance evaluation for all RGB charts containing grayscales (R=G=B). Added option to verify graybalance through calibration only (sets the target L* of each grayscale patch to the measured L* and target a*=b*=0).
    • Added documentation for the interactive display adjustment part of calibration.
    • Added further documentation of the profile verification feature with detailed information about underlying technical aspects.

    Fixed in this release:

    • Fixed an unicode error after creating a profile verification report in a path containing unicode characters and a few other unrelated (potential) unicode errors.
    • Fixed potential unhandled exception if a JSON language file is malformed.
    • Fixed unhandled exception (local variable referenced before assignment) if trying to view calibration curves of an output with no video card gamma table access.
    • Fixed rare unhandled exception (local variable referenced before assignment) if logfile couldn't be renamed or removed during rollover.
    • Fail more gracefully (omit traceback from error message) if temp directory couldn't be created.
    • Fixed handling of XDG_CONFIG_DIRS and the system-wide autostart directory if the preferred configuration directory does not exist under Linux when installing a profile in local system scope, which prevented the system-wide autostart entry to be created.
    • Correctly determine system display profile under Windows Vista and 7 if no user profile is set. Fall back to sRGB if no display profile is set.

    Changed in this release:

    • Changed default gamma from 2.4 to 2.2 in an attempt to increase the amount of available gamma table tone values after calibration for LCD screens, which often have a native response that is closer to a gamma of 2.2 than 2.4.
    • Changed default profile type to single curve + matrix.
    • Profile verification: Only evaluate grayscales (R=G=B) if their luminance is atleast 1% of the white luminance. Also evaluate combined Δa and Δb range.
    • Moved instrument feature details to separate JSON configuration file.
    • Made compatible with wxPython 2.8.6.0.
    2010-03-31 15:24 (UTC) 0.3.8.0

    0.3.8.0

    Added in this release:

    • “Very large” testchart with 912 patches.
    • Profile verification: Support (non-Argyll) profiles which use chromatic adaption.

    Fixed in this release:

    • Improved error message when Argyll binaries are not found (only files not found are now shown, together with alternatives). Automatically fall back to xicclu if icclu is not found (eg. Ubuntu's Argyll 1.0.3 package doesn't contain icclu).
    • Fixed 'invalid syntax' error when running under Python 2.5.
    • Profile verification report: Fixed a parsing error when reference or measurement data contained numbers in exponential notation.
    • Linux: Unhandled exception if DISPLAY environment variable is in the format [host]:displaynumber instead of [host]:displaynumber.screennumber (eg. :0 instead of :0.0).
    • Mac OS X: Fixed values entered in combo boxes not updating the configuration correctly under some circumstances.

    Changed in this release:

    • Profile verification: Lookup device values relative colorimetrically and adapt the measured values to D50 before comparison (using Bradford matrix), so that the measured whitepoint corresponds to L*a*b* 100 0 0. Please note that verification results obtained with reference files measured in earlier versions of ${APPNAME} should not be compared to those obtained via this new approach if the display whitepoint is not D50, as the results are likely to be different as an effect of the relative lookup and the chromatic adaption.
    • Profile verification: Improved support for non-Argyll CGATS text files. Handling is as follows:
      • If the file contains RGB_R RGB_G RGB_B fields, it is handled like a Argyll *.ti1 (testchart) file—any XYZ or Lab data is ignored and the RGB numbers are sent to the display and measured. Afterwards, the measured values are compared to the expected values, which are obtained by sending the RGB numbers through the profile. If RGB values above 100 are found, a range of 0-255 is assumed. Otherwise, a range of 0-100 (like Argyll *.ti1) is assumed.
      • If the file doesn't contain RGB_R RGB_G RGB_B fields, but XYZ_X XYZ_Y XYZ_Z or LAB_L LAB_A LAB_B, it is handled like a Argyll measurement data (*.ti3) file—the values are used to lookup corresponding RGB numbers through the profile and these are then sent to the display and measured. Afterwards, the measured values are compared to the original XYZ or Lab values.
    • Profile verification report: Show measured whitepoint and assumed target color temperature (based on closest daylight temperature), and use them to calculate the Delta E for the whitepoint. A few performance improvements when processing large datasets with several hundred or thousand measurements.
    • GUI and ReadMe: Changed all occurences of the term “LUT curves” to “calibration curves” and also changed all occurences of the term “video LUT” to “video card gamma table” to better distinguish from “LUT profile”. Also renamed the “LUT viewer” to curve viewer as a more accurate description of its functionality.
    2010-03-17 18:50 (UTC) 0.3.6.4

    0.3.6.4

    Added in this release:

    • Profile verification: CGATS-compatible text files (*.txt) containing measurement data can now be selected in addition to Argyll testchart (*.ti1) and measurement data (*.ti3) files.
    • Profile verification report: Depending on the chart used, you can now choose among different evaluation criteria from within the report. Also added Fogra Media Wedge V3 tolerance values for CMYK testcharts.

    Fixed in this release:

    • Profile verification: Error 'Unknown color representation Lab' when trying to verify a L*a*b* LUT profile.
    • Profile verification: Wrong XYZ scaling when reading from *.ti3 files containing XYZ, but no L*a*b* values.
    • Profile verification: When measuring a display other than the first one, the calibration curves were erroneously still loaded to the 1st display.

    Changed in this release:

    • Profile verification report: Show nominal and actual measured values as L*a*b* instead of XYZ. Reduced visible decimals in report to increase readability.
    • Split the cramped “Extra” menu into “Options” and “Tools”.
    2010-03-13 06:31 (UTC) 0.3.6.2

    0.3.6.2

    Added in this release:

    • Profile verification by measurements. Argyll testchart (*.ti1) and measurement data (*.ti3) files can be measured.

    Fixed in this release:

    • Testchart editor: Do not automatically select a saved testchart (regression of a change in 0.3.3.5). Do not show empty rows when creating a testchart using an algorythm that does not create the expected number of rows.
    • Bumped wxPython version check to 2.8.8.0 so a proper error message is displayed if wxPython is too old.
    • Linux: When using TwinView or Xinerama, the size of the measurement window was sometimes not correct.
    • Linux: Failure in get_argyll_version if Argyll utilities have alternate names (eg. argyll-targen instead of targen), which could prevent being able to open the testchart editor (regression of a change in 0.3.3.5).
    • Mac OS X 10.4: Fall back to ColorSyncScripting if Image Events does not return a display profile.

    Changed in this release:

    • Linux: Info window no longer stays always on top.
    • Linux: When getting the current profile for a display, also look at the _ICC_DEVICE_PROFILE atom (see draft ICC Profiles in X Specification 0.4).
    2010-03-02 20:12 (UTC) 0.3.3.6

    0.3.3.6

    Fixed in this release:

    • Linux/Mac OS X: 'tcgetattr failed' when trying to calibrate or profile.

    Changed in this release:

    • Linux: Updated udev rules.
    2010-03-01 06:27 (UTC) 0.3.3.5

    0.3.3.5

    Added in this release:

    • Capability to set whitepoint or ambient light level for viewing condition adjustment by measuring ambient light.
    • Profile name %tpa placeholder (test patch amount).
    • Documentation for ambient light level viewing conditions adjustment, advanced profiling options (gamut mapping) and testchart editor in the ReadMe. Also a few additions to the existing whitepoint/white level and tone curve documentation (mostly taken from the ArgyllCMS documentation).
    • Two entries to the known issues & solutions section in the ReadMe (swapped colors and Photoshop “Monitor profile appears to be defective”).

    Changed in this release:

    • New improved testcharts and presets, with lower patch counts: 12 patches default for gamma+matrix profiles, 48 patches default for curves+matrix profiles (former chart had 91 patches), 124 patches default for LUT profiles which should actually be usable this time around when coupled with a profile quality setting of “high”, unlike its predecessor with 127 patches which yielded mediocre results at best (but for increased accuracy, the new 238-patch “extended” testchart is recommended). 396 and 2386-patch charts (the new “large” and “massive” quantity) are also included.
    • Default to high profile quality (and force for gamma+matrix profiles, as there is no processing penalty like for curves+matrix or LUT profiles).
    • Removed limit for remembered settings files.
    • When calibration or profiling measurements fail, first show the main application window, then the error message (small dialog boxes are sometimes hard to spot on big screens if the application context is missing).
    • Moved profile quality, type and advanced settings above testchart selector (this order is more logical, as profile quality and type influences testchart selection).
    • Testchart editor: Default to adaption of 10% for testchart creation using optimized farthest point sampling (OFPS). Support both device and L*a*b* diagnostic VRML files when creating testcharts using Argyll >= 1.1.0. No longer calculate the amount of white/gray/single color patches or multidimensional cube steps if info is missing in testchart file (calculations take way too long for little added benefit).
    • Cleaned up the known issues & solutions section in the ReadMe.

    Fixed in this release:

    • Wrong value for adaption settings in testchart editor being stored.
    • Linux (cosmetic): Incorrect special characters in console window when using non-english locale under certain configurations (regression of a change introduced in 0.3.0.7).
    • Non-critical: File information in Argyll CGATS TI1 to TI3 conversion.
    • Testchart editor: Do not allow overwriting of predefined testcharts when saving. Correctly remember last used filename when “saving as...”.
    • Log window: Correctly remember last used filename when saving.
    • Typo in the ReadMe (the second “Report on calibrated display device” entry under “Menu commands” should have been “Report on uncalibrated display device”).
    2010-02-17 15:53 (UTC) 0.3.1.0

    0.3.1.0

    Fixed in this release:

    • Running “Calibrate & profile” several times in succession no longer fails on the 2nd and subsequent runs.
    • Linux: Missing wxPython version check for the measurement window subprocess.
    2010-02-15 17:27 (UTC) 0.3.0.9

    0.3.0.9

    Added in this release:

    • Test chart editor: Support for Argyll 1.1.0 perceptual space-filling quasi-random test patch distribution.
    2010-02-13 16:36 (UTC) 0.3.0.8

    0.3.0.8

    Fixed in this release:

    • #2951168 Windows: Critical bug with win32 API calls to get the display name returning 8-bit characters where only ASCII was expected.
    2010-02-12 20:13 (UTC) 0.3.0.7

    0.3.0.7

    Added in this release:

    • Support for Argyll >= 1.1.0 adaptive emissive measurement mode with the i1 Pro spectrometer.
    • All of Argyll's profile types are now available (XYZ LUT on Windows only if using Argyll >= 1.1.0).
    • Support for “very low” calibration quality.
    • Optionally create a fast matrix/shaper profile when just calibrating.
    • “Reset video card gamma table” checkbox in the dialog shown when just profiling.
    • Information how to install Argyll >= 1.1.0 USB drivers on Windows Vista/7 64-bit to the “known issues and solutions” section in the ReadMe.
    • ReadMe, license, bug tracker and support forum can now be accessed from the “Help” menu.
    • “Check for update...” in the help menu (launches a web browser and displays the ${APPNAME} homepage if a new version is found).
    • Curve viewer: Capability to show the actual curves from the video card.
    • Curve viewer: Capability to show a matrix profile's rTRC/gTRC/bTRC curves.

    Changed in this release:

    • When restoring defaults, selected display/instrument/measurement mode, language and profile name are retained.
    • The display/instrument selector is only enabled if more than one device detected respectively.
    • Changed i1 Pro highres measurement mode from implicit to user choice.
    • Gamut mapping: When selecting a source profile, pre-select a source viewing condition based on profile class (monitor or printer).
    • Updated defaults and presets to Argyll 1.1.0 values (i.e. black output offset).
    • Short display name placeholder (%dns) for profile name should not yield single numbers or model name without model number any more (or atleast less likely).
    • Log messages from most informational and all error dialogs.
    • Show file paths in most dialogs involving file processing.
    • Documentation in the ReadMe has been updated and is now more or less complete for the main application (testchart editor docs are still to be done). Setup instructions have also been streamlined.
    • Moved information how to fix video card gamma table access under Linux/X11 to the “known issues and solutions” section in the ReadMe.
    • Linux: Updated udev rules to those provided with Argyll 1.1.0. Removed obsolete permissions and policy files.
    • Linux: In multi-display setups using separate X screens, it should no longer be necessary to launch ${APPNAME} on the display you want to measure.
    • Windows: Get names of displays via additional Windows API calls (should yield more descriptive names than “DISPLAY1”, “DISPLAY2” etc.)
    • Windows (cosmetic): Use default command prompt text color, and a darker variant only when doing measurements.
    • ${APPNAME} version now corresponds to SVN revision number, split into its digit components. Build system (setup.py) uses SVN to generate version information.

    Fixed in this release:

    • Curve viewer: When no display is selected (i.e. when Argyll binaries are not found), it will now try to show the vcgt of the 1st display's profile.
    • Curve viewer: When hiding the viewer and loading different calibration curves, those changes were not reflected when showing the viewer again.
    • Curve viewer: If a profile does not contain a 'vcgt' tag, clear canvas and disable R/G/B checkboxes.
    • Selection of display used for video card gamma table access not working correctly.
    • Loading of calibration upon initial preview in profile installation dialog if profile does not contain ${APPNAME} settings.
    • Do not show failure message if user cancels profile installation via the password dialog when installing in system scope.
    • In some cases, values read from the configuration file were not correctly validated (would only show with deliberately altered or broken config file).
    • colprof output is no longer swallowed when creating a matrix profile with Argyll versions <= 1.0.4.
    • Linux: Fall back to ASCII if detected encoding is not UTF-8 to fix profile install issues.
    • Linux/Mac OS X: Enabling the Spyder 2 colorimeter might need elevated privileges.
    • Linux/Mac OS X: When installing a profile in local system scope, the necessary password was not accepted under newer Linux distros and also Mac OS X > 10.4.11
    • Mac OS X (cosmetic): Suppress spurious AppleScript messages.
    • Windows: Get display profile via registry instead of Windows API because the latter does not reflect runtime changes to profile associations (you still need to refresh the curve viewer when changing profile associations outside of ${APPNAME} while it is running).

    Known issues in this release:

    • Linux: You can't interact with the drop-down menu or the checkboxes in the curve viewer while a profile installation dialog is shown.
    2009-07-16
    • Fixed a glitch in the Linux Autopackage installer where it would install even if required libraries were missing.
    2009-06-30 0.2.6b3 (SVN r239)
    • fix (Windows): Fixed a critical bug in the Windows codepath which tried to access non-existent paths when certain settings were used.
    2009-06-26 0.2.6b2
    • fix: Only look at <major>.<minor> during the Python version check (fixes a critical error on Ubuntu 9.10 Beta, where the Python revision number has an unexpected value).
    • fix: The curve viewer is now also able to plot calibration curves from *.cal files.
    • fix (Linux): If launched on an X display which is not the first display, the measurement window's location no longer determines the display which is used for measurements. This allows non-Xinerama multiscreen configurations to work with ${APPNAME}. Note: You need to launch ${APPNAME} on the display you want to measure, e.g. `DISPLAY=:0.1 ${APPNAME}`.
    • fix (Linux): Get the profile from the correct display when loading a display's calibration curves into the curve viewer.
    • fix (Linux, cosmetic): Suppress CUPS warnings encountered on some systems when using the curve viewer.
    • fix (Mac OS X): Do not offer 'Network' scope during profile installation if /Network/Library/ColorSync/Profiles does not exist.
    • fix (Windows, cosmetic): Made sure the message "Debug: src/helpers.cpp(140): 'CreateActCtx' failed with error 0x0000007b (the filename, directory name, or volume label syntax is incorrect.)" is not shown when launching the standalone Windows executable, by changing the way *.pyd files are bundled (they are now copied to the executable's directory and are no longer part of the executable itself).
    • chg: The curve viewer resets to linear if a display without associated profile is selected.
    2009-06-22 0.2.6b
    • fix: calibration preview checkbox in the “install profile” dialog should now correctly toggle between previous and new calibration.
    • fix: profiling failed when creating a profile on top of an existing calibration.
    • fix: correctly decode environment variables (should fix a failure when trying to create a profile and the username contains non-ASCII characters).
    • fix: automatic restoration of defaults before loading settings from a profile or cal file should no longer restore “do not show again” dialogs.
    • fix (Windows): several errors related to character encoding.
    • chg: unattended calibration and profiling: wait 10 seconds instead of 5 after calibration before trying to start profiling measurements (some instruments seem to need longer to initialize than others, e.g. Spyder 2).
    • chg (Python packages and source): instead of requiring wxPython 2.8.x specifically, only ensure a minimal version of 2.8.
    • add: Curve viewer.
    2009-06-11 21:33 (UTC)
    • Added Linux Autopackage download.
    • Renamed 55-Argyll.rules to 92-Argyll.rules, so it can work on Debian too.
    • Removed “Creating a standalone executable from source” section from the ReadMe (the topic is still handled under “Installing from source” / “Additional setup.py commands”).
    2009-06-07 0.2.5b4
    • fix: “TypeError: coercing to Unicode: need string or buffer, instance found” when calling any of the get*Description() methods of an ICCProfile instance, which caused profile creation from existing profile to fail.
    • fix: (Windows Vista) application exit on launch if autostart directory did not exist.
    • fix: (source, Debian and RPM packages) use the correct wxPython version
    • fix: tab-key traversal of calibration settings controls.
    • fix: automatically scroll into view focused calibration settings controls if scrollbars are shown.
    • fix: properly clean & remove temporary directory.
    • fix: (cosmetic) added some padding to calibration settings right-hand side so scrollbar won't overlap if shown.
    • chg: (cosmetic) enable auto-sizing (fit to contents) for colortemp locus, trc type and profile type selectors.
    • chg: (cosmetic) do not show vendor name in instrument select dropdown (conserve some space).
    • chg: (cosmetic) made the instrument selector a little narrower (needs less space now to display instrument name because the vendor name is stripped) and the measure mode selector a bit wider (to accommodate for projector mode).
    • chg: only try to re-start within terminal if running as standalone executable.
    • chg: show application restart request in the chosen language after changing it.
    • chg: allow resizing/maximizing of main window (a minimal size is forced to prevent layout glitches).
    • chg: (Linux) install from source or package will try to automatically setup access to your instrument. Some services (PolicyKit/HAL or udev) may need to be restarted to get the updated configuration recognized. If in doubt, a reboot should work in all cases.
    • add: french translation (by Loïc Guégant, thanks!)
    • add: bdist_deb command and --cfg option for setup.py
    2009-05-16 0.2.5b3
    • Fixed calibration loader autostart entry creation (“access denied” error) under Windows Vista and later with User Account Control enabled.
    2009-05-07 0.2.5b2
    • Fixed “error: nothing to repeat” when using a spectrometer.
    2009-05-05 0.2.5b
    • fix: encoding-related issues on all platforms and strange Unicode-related problems with AppleScript and Terminal on Mac OS X 10.4 (Details).
    • fix: (Windows) several actions unexpectedly failing under Windows 7 (${APPNAME} created temporary files via system calls on several occasions, but on Windows, this does not create the file in the user's temp directory as one would expect, but in the ROOT directory e.g. C:\—a sane method is now being used instead).
    • fix: bug in sorting function caused leading and trailing zeroes of numbers in testchart filenames to get lost, thus failing to load such files.
    • fix: (Linux) “No module named _md5” error with the standalone executable on some Linux distros (apparently an OpenSSL-related issue, because normally it wouldn't fall back to the legacy _md5 module which is not even built by default in recent Python versions). The fallback _md5 module is now included.
    • fix: calibration was not automatically added & selected in the dropdown menu when only calibrating.
    • fix: dropping a profile which was not created in ${APPNAME} onto the application window no longer results in an unhandled error.
    • fix: when trying to load calibration curves from a profile which actually does not contain any, an error message is now shown instead of resetting the video card gamma table to linear and erroneously stating the curves were succesfully loaded.
    • fix: add display device name as device model description when profiling.
    • fix: when creating a new profile from an existing profile, use that profile's device model description if present.
    • fix: also create .app/.sh/.cmd files when creating a new profile from existing measurement data.
    • fix: restore advanced gamut mapping options to default if selecting a profile which does not contain those settings.
    • fix: allow free selection of source and target viewing conditions in advanced gamut mapping options for LUT[7] profiles regardless of source profile type.
    • fix: if the screen or instrument that was selected in a previous session is not available, select an available one.
    • fix: (Mac) the “enable spyder 2” menu item would not allow to select files other than “setup.exe”.
    • fix: [src] (Mac) if ${APPNAME} was installed as application and then run from (separate) source, multiple copies were launched at certain occasions.
    • fix: selecting a different Argyll binary directory than the previous one now actually works.
    • chg: the previously empty entry at the top of the settings dropdown (settings which are not associated to a profile or .cal file) is now named “<current settings>”.
    • chg: changed settings which are associated to a profile or .cal file are now marked with a leading asterisk in the settings dropdown.
    • chg: default to a gamma of 2.4 (Argyll default).
    • chg: warn before changed settings are discarded.
    • chg: new default profile naming scheme.
    • chg: new default file locations on all platforms.
      - On Linux, ${APPNAME} now adheres to the XDG Base Directory Specification—the configuration file is saved as $XDG_CONFIG_HOME/${APPNAME}/${APPNAME}.ini ($XDG_CONFIG_HOME defaults to ~/.config if not set), all files created during calibration/profiling go into $XDG_DATA_HOME/${APPNAME}/storage/ ($XDG_DATA_HOME defaults to ~/.local/share if not set) by default, and logfiles into $XDG_DATA_HOME/${APPNAME}/logs/
      Any old (pre v0.2.5b) configuration data is retained in the file ~/.${APPNAME} and may be safely deleted after using v0.2.5b or newer for the first time.
      - On Mac OS, the configuration is saved as ~/Library/Preferences/${APPNAME}/${APPNAME}.ini, all files created during calibration/profiling go into ~/Library/Application Support/${APPNAME}/storage/ by default, and logfiles into ~/Library/Logs/${APPNAME}/
      Any old (pre v0.2.5b) configuration data is retained in the file ~/Library/Preferences/${APPNAME} Preferences and may be safely deleted after using v0.2.5b or newer for the first time.
      - On Windows, the configuration file is saved as %APPDATA%\${APPNAME}\${APPNAME}.ini, all files created during calibration/profiling go into %APPDATA%\${APPNAME}\storage\ by default, and logfiles into %APPDATA%\${APPNAME}\logs\
      Any old (pre v0.2.5b) configuration data is retained in the registry key HKEY_CURRENT_USER\Software\${APPNAME}.
    • chg: [build/src] (Windows) removed MS Visual C++ 2008 Redistributable DLLs from the source package. Users who build under Windows will have them anyway as they are installed with Python 2.6, so they are now copied directly from %SystemRoot%\WinSxS (Windows side-by-side assemblies) if possible.
    • chg: [build/src] SendKeys is now a dependency on Windows when running or building from source.
    • chg: [build/src] made ${APPNAME} a distutils package, so it can be built/installed via setup.py.
    • chg: default locations are now also searched for resource files ($XDG_DATA_HOME/${APPNAME}, $XDG_DATA_DIRS/${APPNAME} on Linux, ~/Library/Application Support/${APPNAME}, /Library/Application Support/${APPNAME} on Mac OS X, %APPDATA%\${APPNAME}, %COMMONAPPDATA%\${APPNAME} and %COMMONPROGRAMFILES%\${APPNAME} on Windows) in addition to the current working directory (which is always searched first if it differs from the executable directory) and the executable directory (which is always searched last).
    • chg: better error handling. For unhandled exceptions, a message box is shown and an entry is written to the logfile.
    • chg: (Linux) the calibration loader will no longer try and handle gnome-screensaver quirks—it was working too unreliably, and should really be fixed in gnome-screensaver. The current recommendation is to not use a screensaver at all if possible, and instead rely on the system's energy saving options.
    • chg: (Linux) there's no longer an installer for the Linux version.
    • chg: cancelling of certain operations like profile calculation and testchart generation is now also supported when using Python 2.5
    • chg: when searching for Argyll executables, also search for files with “argyll-” prefix or “-argyll” suffix (thanks to Mark Whitis for report).
    • chg: disable measurement mode selection when using a spectrometer.
    • add: logging (also see the change related to file-storage). Logfiles are created per-date. A maximum of 5 old ones is being kept as backup.
    • add: placeholders like display name, measurement device, whitepoint etc. can now be used in the profile name.
    • add: unattended calibration and profiling for some instruments, meaning it is no longer necessary to press a key after calibration to start the measurements for profiling (needs xautomation under Linux).
    • add: settings and related files can be deleted.
    • add: (Linux, Mac, Vista) profile install scope can be selected (note: local system scope install is broken with current Argyll versions under Linux).
    • add: version and translation information in the about window.
    • add: projector mode when using Argyll 1.1.0 Beta or newer with the X-Rite ColorMunki.
    2009-01-01
    Linux and sourcecode bugfix update: Creation of the autostart entry failed when the autostart directory did not yet exist.
    2008-12-24 0.2.1b
    • fix: video card gamma table access check always returned false when no display profile was set.
    • chg: (Linux) ${APPNAME} now uses the autostart specification from freedesktop.org for the profile loader under Linux when installing profiles. NOTE for users: This also means you should manually remove any autostarts from previous versions, e.g.
      rm ~/.gnome2/dispwin-*.sh
      rm ~/.kde/Autostart/dispwin-*.sh

      and then re-install your current profile so the new loader is created. The new loader will be created in $XDG_CONFIG_HOME/autostart/ (if set) or ~/.config/autostart/ (if not set), with the filename ${APPNAME}-Calibration-Loader-Display-x.desktop, where x is the display number.
    • chg: the calibration loader will check if gnome-screensaver is running and if so, exit it before loading the calibration, then start it again to prevent resetting the calibration when activated.
    • chg: .sh/.cmd file in profile folder is no longer created when just installing a profile.
    • add: message box when selecting LUT[7] as profile type with recommendation to use more samples for higher quality profiles.
    • add: default to english locale if translation doesn't exist.
    2008-12-18 0.2b
    • fix: no longer possible to introduce invalid value types through a malformed config file (which could lead to ${APPNAME} not launching).
    • fix: windows can no longer be moved permanently out of the visible screen area.
    • fix: spaces and special chars in the profile name should work now (should have from the start, but I had some superfluous code which broke it).
    • fix: spaces in the path to ${APPNAME} should work now under Linux and Mac OS X too (Windows had no problem)
    • fix: measurement file no longer gets deleted after successful measurement if profile generation fails (was a simple oversight on my side).
    • fix: [cosmetic] logo header now always spans the whole width of the window.
    • fix: [cosmetic] (Mac OS X) on first launch, a second, unused, terminal window is no longer opened.
    • fix: windows will now try to adjust its height to fit on small screens (scrollbars might appear).
    • chg: “Calibration file” renamed to “Settings” and moved to the top, is now a dropdown box remembering the last 10 used files. Settings are stored in and loaded from profiles.
    • chg: renamed “Display type” to “Measurement mode” and moved over to measurement device selector.
    • chg: default to “LCD” for measurement mode.
    • chg: default testchart file names are now localized.
    • chg: new default testcharts, four flavours: matrix default (91 patches), LUT[7] default (127 patches), large (512 patches) and massive (3012 patches).
    • chg: testchart selector is now a dropdown box, shows all testchart files in chosen directory plus the default testcharts.
    • chg: [build/src] new and improved build system.
    • chg: [build/src] Python 2.6 is now the recommended version to run and/or build ${APPNAME}. Python 2.5 is still supported, but you will not be able to cancel profile or testchart creation through the GUI[4].
    • chg: (Linux) externally installed wxGTK is no longer a dependency for executables.
    • chg: [build] Executables are now completely self-contained. The following paths are searched for additional language files: <user home directory>/${APPNAME}/lang, <${APPNAME} root directory>/lang
    • add: all settings now stored in profile whenever possible.
    • add: “Install” button next to settings dropdown to install selected profile.
    • add: dropdown to choose the display to use for video card gamma table access if all of the following applies:
      - more than one display connected
      - one of those displays seems to have non-working video card gamma table access (detected on startup)
      - one of those displays seems to have working video card gamma table access (detected on startup)
    • add: show patch count of selected testchart next to dropdown.
    • add: ability to select an icc profile (if it contains appropriate data) or measurement data file (.ti3) as testchart (converted on-the-fly).
    • add: testchart generator with editing cabability (experimental)
      - to select patches, click and drag the mouse over table cells, or hold SHIFT (select range) or CTRL/CMD (add/remove single cells/rows to/from selection)
      - to add a patch, double-click a row label
      - to delete patches, select them, then hold CTRL or CMD and hit DEL or BACKSPACE (will always delete whole rows even if only single cells selected)
      - CTRL-C/CTRL-V/CTRL-A = copy/paste/select all
    • add: advanced gamut mapping options for LUT[7]-type profiles, can also be used to overcome an apparent Photoshop CS3 bug under Mac OS X where the brush cursor shows strange artifacts when using LUT[7]-profiles with only one intent (thanks to Klaus Karcher for reporting this).
    • add: ability to generate profile from existing measurement data, even from an existing profile (if it contains appropriate data).
    • add: drag and drop calibration files (.cal), profiles (.icc/.icm), testcharts (.ti1) and measurement data files (.ti3) to the main window to process/select them (does not work very reliably on Mac OS X depending on where you drop the files, and you also get no optical feedback during the drag operation like the changed mouse cursor on Linux/Windows. Your best bet when dropping any files is perhaps the unoccupied area below “Settings”).
    • add: fully movable/resizable measurement window.
    • add: profile and testchart creation can be aborted (when running from source only if using Python >= 2.6).
    • add: “Before” / “After” switch when calibration / profiling complete.
    • add: menu item to enable Spyder 2 from within ${APPNAME}.
    • add: italian and spanish GUI[4] translations (thanks contributors!)
    • Numerous other small fixes/changes.
    2008-08-21
    Executable-only update for Linux (thanks to Patrice Vetsel for bug report): ${APPNAME} is now built against wxGTK 2.8.7.1, which becomes a dependency.
    2008-08-18 0.1b
    First public release.

    DisplayCAL-3.5.0.0/misc/Info.plist0000644000076500000000000000224612025152313016377 0ustar devwheel00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable %(CFBundleExecutable)s CFBundleGetInfoString %(CFBundleGetInfoString)s CFBundleIdentifier %(CFBundleIdentifier)s CFBundleInfoDictionaryVersion 6.0 CFBundleName %(CFBundleName)s CFBundlePackageType APPL CFBundleShortVersionString %(CFBundleShortVersionString)s CFBundleLongVersionString %(CFBundleLongVersionString)s CFBundleSignature %(CFBundleSignature)s CFBundleVersion %(CFBundleVersion)s NSHumanReadableCopyright %(NSHumanReadableCopyright)s CFBundleLocalizations en de es fr it DisplayCAL-3.5.0.0/misc/InnoSetup/0000755000076500000000000000000013242313606016355 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/InnoSetup/v5/0000755000076500000000000000000013242313606016707 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/InnoSetup/v5/Default.isl0000644000076500000000000004205012665102065021010 0ustar devwheel00000000000000; *** Inno Setup version 5.1.11+ English messages *** ; ; To download user-contributed translations of this file, go to: ; http://www.jrsoftware.org/files/istrans/ ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno ; Setup adds the periods automatically (appending a period would result in ; two periods being displayed). [LangOptions] ; The following three entries are very important. Be sure to read and ; understand the '[LangOptions] section' topic in the help file. LanguageName=English LanguageID=$0409 LanguageCodePage=0 ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. ;DialogFontName= ;DialogFontSize=8 ;WelcomeFontName=Verdana ;WelcomeFontSize=12 ;TitleFontName=Arial ;TitleFontSize=29 ;CopyrightFontName=Arial ;CopyrightFontSize=8 [Messages] ; *** Application titles SetupAppTitle=Setup SetupWindowTitle=Setup - %1 UninstallAppTitle=Uninstall UninstallAppFullTitle=%1 Uninstall ; *** Misc. common InformationTitle=Information ConfirmTitle=Confirm ErrorTitle=Error ; *** SetupLdr messages SetupLdrStartupMessage=This will install %1. Do you wish to continue? LdrCannotCreateTemp=Unable to create a temporary file. Setup aborted LdrCannotExecTemp=Unable to execute file in the temporary directory. Setup aborted ; *** Startup error messages LastErrorMessage=%1.%n%nError %2: %3 SetupFileMissing=The file %1 is missing from the installation directory. Please correct the problem or obtain a new copy of the program. SetupFileCorrupt=The setup files are corrupted. Please obtain a new copy of the program. SetupFileCorruptOrWrongVer=The setup files are corrupted, or are incompatible with this version of Setup. Please correct the problem or obtain a new copy of the program. NotOnThisPlatform=This program will not run on %1. OnlyOnThisPlatform=This program must be run on %1. OnlyOnTheseArchitectures=This program can only be installed on versions of Windows designed for the following processor architectures:%n%n%1 MissingWOW64APIs=The version of Windows you are running does not include functionality required by Setup to perform a 64-bit installation. To correct this problem, please install Service Pack %1. WinVersionTooLowError=This program requires %1 version %2 or later. WinVersionTooHighError=This program cannot be installed on %1 version %2 or later. AdminPrivilegesRequired=You must be logged in as an administrator when installing this program. PowerUserPrivilegesRequired=You must be logged in as an administrator or as a member of the Power Users group when installing this program. SetupAppRunningError=Setup has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. UninstallAppRunningError=Uninstall has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. ; *** Misc. errors ErrorCreatingDir=Setup was unable to create the directory "%1" ErrorTooManyFilesInDir=Unable to create a file in the directory "%1" because it contains too many files ; *** Setup common messages ExitSetupTitle=Exit Setup ExitSetupMessage=Setup is not complete. If you exit now, the program will not be installed.%n%nYou may run Setup again at another time to complete the installation.%n%nExit Setup? AboutSetupMenuItem=&About Setup... AboutSetupTitle=About Setup AboutSetupMessage=%1 version %2%n%3%n%n%1 home page:%n%4 AboutSetupNote= TranslatorNote= ; *** Buttons ButtonBack=< &Back ButtonNext=&Next > ButtonInstall=&Install ButtonOK=OK ButtonCancel=Cancel ButtonYes=&Yes ButtonYesToAll=Yes to &All ButtonNo=&No ButtonNoToAll=N&o to All ButtonFinish=&Finish ButtonBrowse=&Browse... ButtonWizardBrowse=B&rowse... ButtonNewFolder=&Make New Folder ; *** "Select Language" dialog messages SelectLanguageTitle=Select Setup Language SelectLanguageLabel=Select the language to use during the installation: ; *** Common wizard text ClickNext=Click Next to continue, or Cancel to exit Setup. BeveledLabel= BrowseDialogTitle=Browse For Folder BrowseDialogLabel=Select a folder in the list below, then click OK. NewFolderName=New Folder ; *** "Welcome" wizard page WelcomeLabel1=Welcome to the [name] Setup Wizard WelcomeLabel2=This will install [name/ver] on your computer.%n%nIt is recommended that you close all other applications before continuing. ; *** "Password" wizard page WizardPassword=Password PasswordLabel1=This installation is password protected. PasswordLabel3=Please provide the password, then click Next to continue. Passwords are case-sensitive. PasswordEditLabel=&Password: IncorrectPassword=The password you entered is not correct. Please try again. ; *** "License Agreement" wizard page WizardLicense=License Agreement LicenseLabel=Please read the following important information before continuing. LicenseLabel3=Please read the following License Agreement. You must accept the terms of this agreement before continuing with the installation. LicenseAccepted=I &accept the agreement LicenseNotAccepted=I &do not accept the agreement ; *** "Information" wizard pages WizardInfoBefore=Information InfoBeforeLabel=Please read the following important information before continuing. InfoBeforeClickLabel=When you are ready to continue with Setup, click Next. WizardInfoAfter=Information InfoAfterLabel=Please read the following important information before continuing. InfoAfterClickLabel=When you are ready to continue with Setup, click Next. ; *** "User Information" wizard page WizardUserInfo=User Information UserInfoDesc=Please enter your information. UserInfoName=&User Name: UserInfoOrg=&Organization: UserInfoSerial=&Serial Number: UserInfoNameRequired=You must enter a name. ; *** "Select Destination Location" wizard page WizardSelectDir=Select Destination Location SelectDirDesc=Where should [name] be installed? SelectDirLabel3=Setup will install [name] into the following folder. SelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. DiskSpaceMBLabel=At least [mb] MB of free disk space is required. ToUNCPathname=Setup cannot install to a UNC pathname. If you are trying to install to a network, you will need to map a network drive. InvalidPath=You must enter a full path with drive letter; for example:%n%nC:\APP%n%nor a UNC path in the form:%n%n\\server\share InvalidDrive=The drive or UNC share you selected does not exist or is not accessible. Please select another. DiskSpaceWarningTitle=Not Enough Disk Space DiskSpaceWarning=Setup requires at least %1 KB of free space to install, but the selected drive only has %2 KB available.%n%nDo you want to continue anyway? DirNameTooLong=The folder name or path is too long. InvalidDirName=The folder name is not valid. BadDirName32=Folder names cannot include any of the following characters:%n%n%1 DirExistsTitle=Folder Exists DirExists=The folder:%n%n%1%n%nalready exists. Would you like to install to that folder anyway? DirDoesntExistTitle=Folder Does Not Exist DirDoesntExist=The folder:%n%n%1%n%ndoes not exist. Would you like the folder to be created? ; *** "Select Components" wizard page WizardSelectComponents=Select Components SelectComponentsDesc=Which components should be installed? SelectComponentsLabel2=Select the components you want to install; clear the components you do not want to install. Click Next when you are ready to continue. FullInstallation=Full installation ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Compact installation CustomInstallation=Custom installation NoUninstallWarningTitle=Components Exist NoUninstallWarning=Setup has detected that the following components are already installed on your computer:%n%n%1%n%nDeselecting these components will not uninstall them.%n%nWould you like to continue anyway? ComponentSize1=%1 KB ComponentSize2=%1 MB ComponentsDiskSpaceMBLabel=Current selection requires at least [mb] MB of disk space. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Select Additional Tasks SelectTasksDesc=Which additional tasks should be performed? SelectTasksLabel2=Select the additional tasks you would like Setup to perform while installing [name], then click Next. ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Select Start Menu Folder SelectStartMenuFolderDesc=Where should Setup place the program's shortcuts? SelectStartMenuFolderLabel3=Setup will create the program's shortcuts in the following Start Menu folder. SelectStartMenuFolderBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. MustEnterGroupName=You must enter a folder name. GroupNameTooLong=The folder name or path is too long. InvalidGroupName=The folder name is not valid. BadGroupName=The folder name cannot include any of the following characters:%n%n%1 NoProgramGroupCheck2=&Don't create a Start Menu folder ; *** "Ready to Install" wizard page WizardReady=Ready to Install ReadyLabel1=Setup is now ready to begin installing [name] on your computer. ReadyLabel2a=Click Install to continue with the installation, or click Back if you want to review or change any settings. ReadyLabel2b=Click Install to continue with the installation. ReadyMemoUserInfo=User information: ReadyMemoDir=Destination location: ReadyMemoType=Setup type: ReadyMemoComponents=Selected components: ReadyMemoGroup=Start Menu folder: ReadyMemoTasks=Additional tasks: ; *** "Preparing to Install" wizard page WizardPreparing=Preparing to Install PreparingDesc=Setup is preparing to install [name] on your computer. PreviousInstallNotCompleted=The installation/removal of a previous program was not completed. You will need to restart your computer to complete that installation.%n%nAfter restarting your computer, run Setup again to complete the installation of [name]. CannotContinue=Setup cannot continue. Please click Cancel to exit. ; *** "Installing" wizard page WizardInstalling=Installing InstallingLabel=Please wait while Setup installs [name] on your computer. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Completing the [name] Setup Wizard FinishedLabelNoIcons=Setup has finished installing [name] on your computer. FinishedLabel=Setup has finished installing [name] on your computer. The application may be launched by selecting the installed icons. ClickFinish=Click Finish to exit Setup. FinishedRestartLabel=To complete the installation of [name], Setup must restart your computer. Would you like to restart now? FinishedRestartMessage=To complete the installation of [name], Setup must restart your computer.%n%nWould you like to restart now? ShowReadmeCheck=Yes, I would like to view the README file YesRadio=&Yes, restart the computer now NoRadio=&No, I will restart the computer later ; used for example as 'Run MyProg.exe' RunEntryExec=Run %1 ; used for example as 'View Readme.txt' RunEntryShellExec=View %1 ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=Setup Needs the Next Disk SelectDiskLabel2=Please insert Disk %1 and click OK.%n%nIf the files on this disk can be found in a folder other than the one displayed below, enter the correct path or click Browse. PathLabel=&Path: FileNotInDir2=The file "%1" could not be located in "%2". Please insert the correct disk or select another folder. SelectDirectoryLabel=Please specify the location of the next disk. ; *** Installation phase messages SetupAborted=Setup was not completed.%n%nPlease correct the problem and run Setup again. EntryAbortRetryIgnore=Click Retry to try again, Ignore to proceed anyway, or Abort to cancel installation. ; *** Installation status messages StatusCreateDirs=Creating directories... StatusExtractFiles=Extracting files... StatusCreateIcons=Creating shortcuts... StatusCreateIniEntries=Creating INI entries... StatusCreateRegistryEntries=Creating registry entries... StatusRegisterFiles=Registering files... StatusSavingUninstall=Saving uninstall information... StatusRunProgram=Finishing installation... StatusRollback=Rolling back changes... ; *** Misc. errors ErrorInternal2=Internal error: %1 ErrorFunctionFailedNoCode=%1 failed ErrorFunctionFailed=%1 failed; code %2 ErrorFunctionFailedWithMessage=%1 failed; code %2.%n%3 ErrorExecutingProgram=Unable to execute file:%n%1 ; *** Registry errors ErrorRegOpenKey=Error opening registry key:%n%1\%2 ErrorRegCreateKey=Error creating registry key:%n%1\%2 ErrorRegWriteKey=Error writing to registry key:%n%1\%2 ; *** INI errors ErrorIniEntry=Error creating INI entry in file "%1". ; *** File copying errors FileAbortRetryIgnore=Click Retry to try again, Ignore to skip this file (not recommended), or Abort to cancel installation. FileAbortRetryIgnore2=Click Retry to try again, Ignore to proceed anyway (not recommended), or Abort to cancel installation. SourceIsCorrupted=The source file is corrupted SourceDoesntExist=The source file "%1" does not exist ExistingFileReadOnly=The existing file is marked as read-only.%n%nClick Retry to remove the read-only attribute and try again, Ignore to skip this file, or Abort to cancel installation. ErrorReadingExistingDest=An error occurred while trying to read the existing file: FileExists=The file already exists.%n%nWould you like Setup to overwrite it? ExistingFileNewer=The existing file is newer than the one Setup is trying to install. It is recommended that you keep the existing file.%n%nDo you want to keep the existing file? ErrorChangingAttr=An error occurred while trying to change the attributes of the existing file: ErrorCreatingTemp=An error occurred while trying to create a file in the destination directory: ErrorReadingSource=An error occurred while trying to read the source file: ErrorCopying=An error occurred while trying to copy a file: ErrorReplacingExistingFile=An error occurred while trying to replace the existing file: ErrorRestartReplace=RestartReplace failed: ErrorRenamingTemp=An error occurred while trying to rename a file in the destination directory: ErrorRegisterServer=Unable to register the DLL/OCX: %1 ErrorRegSvr32Failed=RegSvr32 failed with exit code %1 ErrorRegisterTypeLib=Unable to register the type library: %1 ; *** Post-installation errors ErrorOpeningReadme=An error occurred while trying to open the README file. ErrorRestartingComputer=Setup was unable to restart the computer. Please do this manually. ; *** Uninstaller messages UninstallNotFound=File "%1" does not exist. Cannot uninstall. UninstallOpenError=File "%1" could not be opened. Cannot uninstall UninstallUnsupportedVer=The uninstall log file "%1" is in a format not recognized by this version of the uninstaller. Cannot uninstall UninstallUnknownEntry=An unknown entry (%1) was encountered in the uninstall log ConfirmUninstall=Are you sure you want to completely remove %1 and all of its components? UninstallOnlyOnWin64=This installation can only be uninstalled on 64-bit Windows. OnlyAdminCanUninstall=This installation can only be uninstalled by a user with administrative privileges. UninstallStatusLabel=Please wait while %1 is removed from your computer. UninstalledAll=%1 was successfully removed from your computer. UninstalledMost=%1 uninstall complete.%n%nSome elements could not be removed. These can be removed manually. UninstalledAndNeedsRestart=To complete the uninstallation of %1, your computer must be restarted.%n%nWould you like to restart now? UninstallDataCorrupted="%1" file is corrupted. Cannot uninstall ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Remove Shared File? ConfirmDeleteSharedFile2=The system indicates that the following shared file is no longer in use by any programs. Would you like for Uninstall to remove this shared file?%n%nIf any programs are still using this file and it is removed, those programs may not function properly. If you are unsure, choose No. Leaving the file on your system will not cause any harm. SharedFileNameLabel=File name: SharedFileLocationLabel=Location: WizardUninstalling=Uninstall Status StatusUninstalling=Uninstalling %1... ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. [CustomMessages] NameAndVersion=%1 version %2 AdditionalIcons=Additional icons: CreateDesktopIcon=Create a &desktop icon CreateQuickLaunchIcon=Create a &Quick Launch icon ProgramOnTheWeb=%1 on the Web UninstallProgram=Uninstall %1 LaunchProgram=Launch %1 AssocFileExtension=&Associate %1 with the %2 file extension AssocingFileExtension=Associating %1 with the %2 file extension... AskRemove=Do you want to remove %1? SelectVersion=Select version ChangeIntegration=Change desktop integration CalibrationLoading=Calibration loading on login: CalibrationLoadingHandledByDisplayCAL=Let DisplayCAL handle calibration loading (high precision and reliability) CalibrationLoadingHandledByOS=Let the operating system handle calibration loading (low precision and reliability)DisplayCAL-3.5.0.0/misc/InnoSetup/v5/Languages/0000755000076500000000000000000013242313606020615 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/InnoSetup/v5/Languages/French.isl0000644000076500000000000005067512665102065022553 0ustar devwheel00000000000000; *** Inno Setup version 5.1.11+ French messages *** ; ; To download user-contributed translations of this file, go to: ; http://www.jrsoftware.org/is3rdparty.php ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno ; Setup adds the periods automatically (appending a period would result in ; two periods being displayed). ; ; Maintained by Pierre Yager (pierre@levosgien.net) ; ; Contributors : Frdric Bonduelle, Francis Pallini, Lumina, Pascal Peyrot ; ; Changes : ; + Accents on uppercase letters ; http://www.academie-francaise.fr/langue/questions.html#accentuation (lumina) ; + Typography quotes [see ISBN: 978-2-7433-0482-9] ; http://fr.wikipedia.org/wiki/Guillemet (lumina) ; + Binary units (Kio, Mio) [IEC 80000-13:2008] ; http://fr.wikipedia.org/wiki/Octet (lumina) ; + Reverted to standard units (Ko, Mo) to follow Windows Explorer Standard ; http://blogs.msdn.com/b/oldnewthing/archive/2009/06/11/9725386.aspx ; ; $jrsoftware: issrc/Files/Languages/French.isl,v 1.18 2011/02/15 14:52:59 mlaan Exp $ [LangOptions] LanguageName=Fran<00E7>ais LanguageID=$040C LanguageCodePage=1252 [Messages] ; *** Application titles SetupAppTitle=Installation SetupWindowTitle=Installation - %1 UninstallAppTitle=Dsinstallation UninstallAppFullTitle=Dsinstallation - %1 ; *** Misc. common InformationTitle=Information ConfirmTitle=Confirmation ErrorTitle=Erreur ; *** SetupLdr messages SetupLdrStartupMessage=Cet assistant va installer %1. Voulez-vous continuer ? LdrCannotCreateTemp=Impossible de crer un fichier temporaire. Abandon de l'installation LdrCannotExecTemp=Impossible d'excuter un fichier depuis le dossier temporaire. Abandon de l'installation ; *** Startup error messages LastErrorMessage=%1.%n%nErreur %2 : %3 SetupFileMissing=Le fichier %1 est absent du dossier d'installation. Veuillez corriger le problme ou vous procurer une nouvelle copie du programme. SetupFileCorrupt=Les fichiers d'installation sont altrs. Veuillez vous procurer une nouvelle copie du programme. SetupFileCorruptOrWrongVer=Les fichiers d'installation sont altrs ou ne sont pas compatibles avec cette version de l'assistant d'installation. Veuillez corriger le problme ou vous procurer une nouvelle copie du programme. NotOnThisPlatform=Ce programme ne fonctionne pas sous %1. OnlyOnThisPlatform=Ce programme ne peut fonctionner que sous %1. OnlyOnTheseArchitectures=Ce programme ne peut tre install que sur des versions de Windows qui supportent ces architectures : %n%n%1 MissingWOW64APIs=La version de Windows que vous utilisez ne dispose pas des fonctionnalits ncessaires pour que l'assistant puisse raliser une installation 64 bits. Pour corriger ce problme vous devez installer le Service Pack %1. WinVersionTooLowError=Ce programme requiert la version %2 ou suprieure de %1. WinVersionTooHighError=Ce programme ne peut pas tre install sous %1 version %2 ou suprieure. AdminPrivilegesRequired=Vous devez disposer des droits d'administration de cet ordinateur pour installer ce programme. PowerUserPrivilegesRequired=Vous devez disposer des droits d'administration ou faire partie du groupe Utilisateurs avec pouvoir de cet ordinateur pour installer ce programme. SetupAppRunningError=L'assistant d'installation a dtect que %1 est actuellement en cours d'excution.%n%nVeuillez fermer toutes les instances de cette application puis appuyer sur OK pour continuer, ou bien appuyer sur Annuler pour abandonner l'installation. UninstallAppRunningError=La procdure de dsinstallation a dtect que %1 est actuellement en cours d'excution.%n%nVeuillez fermer toutes les instances de cette application puis appuyer sur OK pour continuer, ou bien appuyer sur Annuler pour abandonner la dsinstallation. ; *** Misc. errors ErrorCreatingDir=L'assistant d'installation n'a pas pu crer le dossier "%1" ErrorTooManyFilesInDir=L'assistant d'installation n'a pas pu crer un fichier dans le dossier "%1" car celui-ci contient trop de fichiers ; *** Setup common messages ExitSetupTitle=Quitter l'installation ExitSetupMessage=L'installation n'est pas termine. Si vous abandonnez maintenant, le programme ne sera pas install.%n%nVous devrez relancer cet assistant pour finir l'installation.%n%nVoulez-vous quand mme quitter l'assistant d'installation ? AboutSetupMenuItem=& propos... AboutSetupTitle= Propos de l'assistant d'installation AboutSetupMessage=%1 version %2%n%3%n%nPage d'accueil de %1 :%n%4 AboutSetupNote= TranslatorNote=Traduction franaise maintenue par Pierre Yager (pierre@levosgien.net) ; *** Buttons ButtonBack=< &Prcdent ButtonNext=&Suivant > ButtonInstall=&Installer ButtonOK=OK ButtonCancel=Annuler ButtonYes=&Oui ButtonYesToAll=Oui pour &tout ButtonNo=&Non ButtonNoToAll=N&on pour tout ButtonFinish=&Terminer ButtonBrowse=Pa&rcourir... ButtonWizardBrowse=Pa&rcourir... ButtonNewFolder=Nouveau &dossier ; *** "Select Language" dialog messages SelectLanguageTitle=Langue de l'assistant d'installation SelectLanguageLabel=Veuillez slectionner la langue qui sera utilise par l'assistant d'installation : ; *** Common wizard text ClickNext=Appuyez sur Suivant pour continuer ou sur Annuler pour abandonner l'installation. BeveledLabel= BrowseDialogTitle=Parcourir les dossiers BrowseDialogLabel=Veuillez choisir un dossier de destination, puis appuyez sur OK. NewFolderName=Nouveau dossier ; *** "Welcome" wizard page WelcomeLabel1=Bienvenue dans l'assistant d'installation de [name] WelcomeLabel2=Cet assistant va vous guider dans l'installation de [name/ver] sur votre ordinateur.%n%nIl est recommand de fermer toutes les applications actives avant de continuer. ; *** "Password" wizard page WizardPassword=Mot de passe PasswordLabel1=Cette installation est protge par un mot de passe. PasswordLabel3=Veuillez saisir le mot de passe (attention la distinction entre majuscules et minuscules) puis appuyez sur Suivant pour continuer. PasswordEditLabel=&Mot de passe : IncorrectPassword=Le mot de passe saisi n'est pas valide. Veuillez essayer nouveau. ; *** "License Agreement" wizard page WizardLicense=Accord de licence LicenseLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. LicenseLabel3=Veuillez lire le contrat de licence suivant. Vous devez en accepter tous les termes avant de continuer l'installation. LicenseAccepted=Je comprends et j'&accepte les termes du contrat de licence LicenseNotAccepted=Je &refuse les termes du contrat de licence ; *** "Information" wizard pages WizardInfoBefore=Information InfoBeforeLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. InfoBeforeClickLabel=Lorsque vous tes prt continuer, appuyez sur Suivant. WizardInfoAfter=Information InfoAfterLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. InfoAfterClickLabel=Lorsque vous tes prt continuer, appuyez sur Suivant. ; *** "User Information" wizard page WizardUserInfo=Informations sur l'Utilisateur UserInfoDesc=Veuillez saisir les informations qui vous concernent. UserInfoName=&Nom d'utilisateur : UserInfoOrg=&Organisation : UserInfoSerial=Numro de &srie : UserInfoNameRequired=Vous devez au moins saisir un nom. ; *** "Select Destination Location" wizard page WizardSelectDir=Dossier de destination SelectDirDesc=O [name] doit-il tre install ? SelectDirLabel3=L'assistant va installer [name] dans le dossier suivant. SelectDirBrowseLabel=Pour continuer, appuyez sur Suivant. Si vous souhaitez choisir un dossier diffrent, appuyez sur Parcourir. DiskSpaceMBLabel=Le programme requiert au moins [mb] Mo d'espace disque disponible. ToUNCPathname=L'assistant d'installation ne supporte pas les chemins rseau. Si vous souhaitez effectuer cette installation sur un rseau, vous devez d'abord connecter un lecteur rseau. InvalidPath=Vous devez saisir un chemin complet avec sa lettre de lecteur ; par exemple :%n%nC:\APP%n%nou un chemin rseau de la forme :%n%n\\serveur\partage InvalidDrive=L'unit ou l'emplacement rseau que vous avez slectionn n'existe pas ou n'est pas accessible. Veuillez choisir une autre destination. DiskSpaceWarningTitle=Espace disponible insuffisant DiskSpaceWarning=L'assistant a besoin d'au moins %1 Ko d'espace disponible pour effectuer l'installation, mais l'unit que vous avez slectionne ne dispose que de %2 Ko d'espace disponible.%n%nSouhaitez-vous continuer malgr tout ? DirNameTooLong=Le nom ou le chemin du dossier est trop long. InvalidDirName=Le nom du dossier est invalide. BadDirName32=Le nom du dossier ne doit contenir aucun des caractres suivants :%n%n%1 DirExistsTitle=Dossier existant DirExists=Le dossier :%n%n%1%n%nexiste dj. Souhaitez-vous installer dans ce dossier malgr tout ? DirDoesntExistTitle=Le dossier n'existe pas DirDoesntExist=Le dossier %n%n%1%n%nn'existe pas. Souhaitez-vous que ce dossier soit cr ? ; *** "Select Components" wizard page WizardSelectComponents=Composants installer SelectComponentsDesc=Quels composants de l'application souhaitez-vous installer ? SelectComponentsLabel2=Slectionnez les composants que vous dsirez installer ; dcochez les composants que vous ne dsirez pas installer. Appuyez ensuite sur Suivant pour continuer l'installation. FullInstallation=Installation complte ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Installation compacte CustomInstallation=Installation personnalise NoUninstallWarningTitle=Composants existants NoUninstallWarning=L'assistant d'installation a dtect que les composants suivants sont dj installs sur votre systme :%n%n%1%n%nDslectionner ces composants ne les dsinstallera pas pour autant.%n%nVoulez-vous continuer malgr tout ? ComponentSize1=%1 Ko ComponentSize2=%1 Mo ComponentsDiskSpaceMBLabel=Les composants slectionns ncessitent au moins [mb] Mo d'espace disponible. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Tches supplmentaires SelectTasksDesc=Quelles sont les tches supplmentaires qui doivent tre effectues ? SelectTasksLabel2=Slectionnez les tches supplmentaires que l'assistant d'installation doit effectuer pendant l'installation de [name], puis appuyez sur Suivant. ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Slection du dossier du menu Dmarrer SelectStartMenuFolderDesc=O l'assistant d'installation doit-il placer les raccourcis du programme ? SelectStartMenuFolderLabel3=L'assistant va crer les raccourcis du programme dans le dossier du menu Dmarrer indiqu ci-dessous. SelectStartMenuFolderBrowseLabel=Appuyez sur Suivant pour continuer. Appuyez sur Parcourir si vous souhaitez slectionner un autre dossier du menu Dmarrer. MustEnterGroupName=Vous devez saisir un nom de dossier du menu Dmarrer. GroupNameTooLong=Le nom ou le chemin du dossier est trop long. InvalidGroupName=Le nom du dossier n'est pas valide. BadGroupName=Le nom du dossier ne doit contenir aucun des caractres suivants :%n%n%1 NoProgramGroupCheck2=Ne pas crer de &dossier dans le menu Dmarrer ; *** "Ready to Install" wizard page WizardReady=Prt installer ReadyLabel1=L'assistant dispose prsent de toutes les informations pour installer [name] sur votre ordinateur. ReadyLabel2a=Appuyez sur Installer pour procder l'installation ou sur Prcdent pour revoir ou modifier une option d'installation. ReadyLabel2b=Appuyez sur Installer pour procder l'installation. ReadyMemoUserInfo=Informations sur l'utilisateur : ReadyMemoDir=Dossier de destination : ReadyMemoType=Type d'installation : ReadyMemoComponents=Composants slectionns : ReadyMemoGroup=Dossier du menu Dmarrer : ReadyMemoTasks=Tches supplmentaires : ; *** "Preparing to Install" wizard page WizardPreparing=Prparation de l'installation PreparingDesc=L'assistant d'installation prpare l'installation de [name] sur votre ordinateur. PreviousInstallNotCompleted=L'installation ou la suppression d'un programme prcdent n'est pas totalement acheve. Veuillez redmarrer votre ordinateur pour achever cette installation ou suppression.%n%nUne fois votre ordinateur redmarr, veuillez relancer cet assistant pour reprendre l'installation de [name]. CannotContinue=L'assistant ne peut pas continuer. Veuillez appuyer sur Annuler pour abandonner l'installation. ; *** "Installing" wizard page WizardInstalling=Installation en cours InstallingLabel=Veuillez patienter pendant que l'assistant installe [name] sur votre ordinateur. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Fin de l'installation de [name] FinishedLabelNoIcons=L'assistant a termin l'installation de [name] sur votre ordinateur. FinishedLabel=L'assistant a termin l'installation de [name] sur votre ordinateur. L'application peut tre lance l'aide des icnes cres sur le Bureau par l'installation. ClickFinish=Veuillez appuyer sur Terminer pour quitter l'assistant d'installation. FinishedRestartLabel=L'assistant doit redmarrer votre ordinateur pour terminer l'installation de [name].%n%nVoulez-vous redmarrer maintenant ? FinishedRestartMessage=L'assistant doit redmarrer votre ordinateur pour terminer l'installation de [name].%n%nVoulez-vous redmarrer maintenant ? ShowReadmeCheck=Oui, je souhaite lire le fichier LISEZMOI YesRadio=&Oui, redmarrer mon ordinateur maintenant NoRadio=&Non, je prfre redmarrer mon ordinateur plus tard ; used for example as 'Run MyProg.exe' RunEntryExec=Excuter %1 ; used for example as 'View Readme.txt' RunEntryShellExec=Voir %1 ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=L'assistant a besoin du disque suivant SelectDiskLabel2=Veuillez insrer le disque %1 et appuyer sur OK.%n%nSi les fichiers de ce disque se trouvent un emplacement diffrent de celui indiqu ci-dessous, veuillez saisir le chemin correspondant ou appuyez sur Parcourir. PathLabel=&Chemin : FileNotInDir2=Le fichier "%1" ne peut pas tre trouv dans "%2". Veuillez insrer le bon disque ou slectionner un autre dossier. SelectDirectoryLabel=Veuillez indiquer l'emplacement du disque suivant. ; *** Installation phase messages SetupAborted=L'installation n'est pas termine.%n%nVeuillez corriger le problme et relancer l'installation. EntryAbortRetryIgnore=Appuyez sur Ressayer pour essayer nouveau, Ignorer pour continuer malgr tout, ou Abandonner pour annuler l'installation. ; *** Installation status messages StatusCreateDirs=Cration des dossiers... StatusExtractFiles=Extraction des fichiers... StatusCreateIcons=Cration des raccourcis... StatusCreateIniEntries=Cration des entres du fichier INI... StatusCreateRegistryEntries=Cration des entres de registre... StatusRegisterFiles=Enregistrement des fichiers... StatusSavingUninstall=Sauvegarde des informations de dsinstallation... StatusRunProgram=Finalisation de l'installation... StatusRollback=Annulation des modifications... ; *** Misc. errors ErrorInternal2=Erreur interne : %1 ErrorFunctionFailedNoCode=%1 a chou ErrorFunctionFailed=%1 a chou ; code %2 ErrorFunctionFailedWithMessage=%1 a chou ; code %2.%n%3 ErrorExecutingProgram=Impossible d'excuter le fichier :%n%1 ; *** Registry errors ErrorRegOpenKey=Erreur lors de l'ouverture de la cl de registre :%n%1\%2 ErrorRegCreateKey=Erreur lors de la cration de la cl de registre :%n%1\%2 ErrorRegWriteKey=Erreur lors de l'criture de la cl de registre :%n%1\%2 ; *** INI errors ErrorIniEntry=Erreur d'criture d'une entre dans le fichier INI "%1". ; *** File copying errors FileAbortRetryIgnore=Appuyez sur Ressayer pour essayer nouveau, Ignorer pour passer ce fichier (dconseill), ou Abandonner pour annuler l'installation. FileAbortRetryIgnore2=Appuyez sur Ressayer pour essayer nouveau, Ignorer pour continuer malgr tout (dconseill), ou Abandonner pour annuler l'installation. SourceIsCorrupted=Le fichier source est altr SourceDoesntExist=Le fichier source "%1" n'existe pas ExistingFileReadOnly=Le fichier existant est protg en lecture seule.%n%nAppuyez sur Ressayer pour enlever la protection et essayer nouveau, Ignorer pour passer ce fichier, ou Abandonner pour annuler l'installation. ErrorReadingExistingDest=Une erreur s'est produite lors de la tentative de lecture du fichier existant : FileExists=Le fichier existe dj.%n%nSouhaitez-vous que l'installation le remplace ? ExistingFileNewer=Le fichier existant est plus rcent que celui que l'assistant essaie d'installer. Il est recommand de conserver le fichier existant.%n%nSouhaitez-vous conserver le fichier existant ? ErrorChangingAttr=Une erreur est survenue en essayant de modifier les attributs du fichier existant : ErrorCreatingTemp=Une erreur est survenue en essayant de crer un fichier dans le dossier de destination : ErrorReadingSource=Une erreur est survenue lors de la lecture du fichier source : ErrorCopying=Une erreur est survenue lors de la copie d'un fichier : ErrorReplacingExistingFile=Une erreur est survenue lors du remplacement d'un fichier existant : ErrorRestartReplace=Le marquage d'un fichier pour remplacement au redmarrage de l'ordinateur a chou : ErrorRenamingTemp=Une erreur est survenue en essayant de renommer un fichier dans le dossier de destination : ErrorRegisterServer=Impossible d'enregistrer la bibliothque DLL/OCX : %1 ErrorRegSvr32Failed=RegSvr32 a chou et a retourn le code d'erreur %1 ErrorRegisterTypeLib=Impossible d'enregistrer la bibliothque de type : %1 ; *** Post-installation errors ErrorOpeningReadme=Une erreur est survenue l'ouverture du fichier LISEZMOI. ErrorRestartingComputer=L'installation n'a pas pu redmarrer l'ordinateur. Merci de bien vouloir le faire vous-mme. ; *** Uninstaller messages UninstallNotFound=Le fichier "%1" n'existe pas. Impossible de dsinstaller. UninstallOpenError=Le fichier "%1" n'a pas pu tre ouvert. Impossible de dsinstaller UninstallUnsupportedVer=Le format du fichier journal de dsinstallation "%1" n'est pas reconnu par cette version de la procdure de dsinstallation. Impossible de dsinstaller UninstallUnknownEntry=Une entre inconnue (%1) a t rencontre dans le fichier journal de dsinstallation ConfirmUninstall=Voulez-vous vraiment dsinstaller compltement %1 ainsi que tous ses composants ? UninstallOnlyOnWin64=La dsinstallation de ce programme ne fonctionne qu'avec une version 64 bits de Windows. OnlyAdminCanUninstall=Ce programme ne peut tre dsinstall que par un utilisateur disposant des droits d'administration. UninstallStatusLabel=Veuillez patienter pendant que %1 est retir de votre ordinateur. UninstalledAll=%1 a t correctement dsinstall de cet ordinateur. UninstalledMost=La dsinstallation de %1 est termine.%n%nCertains lments n'ont pas pu tre supprims automatiquement. Vous pouvez les supprimer manuellement. UninstalledAndNeedsRestart=Vous devez redmarrer l'ordinateur pour terminer la dsinstallation de %1.%n%nVoulez-vous redmarrer maintenant ? UninstallDataCorrupted=Le ficher "%1" est altr. Impossible de dsinstaller ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Supprimer les fichiers partags ? ConfirmDeleteSharedFile2=Le systme indique que le fichier partag suivant n'est plus utilis par aucun programme. Souhaitez-vous que la dsinstallation supprime ce fichier partag ?%n%nSi des programmes utilisent encore ce fichier et qu'il est supprim, ces programmes ne pourront plus fonctionner correctement. Si vous n'tes pas sr, choisissez Non. Laisser ce fichier dans votre systme ne posera pas de problme. SharedFileNameLabel=Nom du fichier : SharedFileLocationLabel=Emplacement : WizardUninstalling=tat de la dsinstallation StatusUninstalling=Dsinstallation de %1... ; Les messages personnaliss suivants ne sont pas utilis par l'installation ; elle-mme, mais si vous les utilisez dans vos scripts, vous devez les ; traduire [CustomMessages] NameAndVersion=%1 version %2 AdditionalIcons=Icnes supplmentaires : CreateDesktopIcon=Crer une icne sur le &Bureau CreateQuickLaunchIcon=Crer une icne dans la barre de &Lancement rapide ProgramOnTheWeb=Page d'accueil de %1 UninstallProgram=Dsinstaller %1 LaunchProgram=Excuter %1 AssocFileExtension=&Associer %1 avec l'extension de fichier %2 AssocingFileExtension=Associe %1 avec l'extension de fichier %2... CalibrationLoading=Chargement d'talonnage lors de la connexion: CalibrationLoadingHandledByDisplayCAL=DisplayCAL Profile Loader (haute prcision et de la fiabilit) CalibrationLoadingHandledByOS=Systme d'exploitation (faible prcision et de la fiabilit)DisplayCAL-3.5.0.0/misc/InnoSetup/v5/Languages/German.isl0000644000076500000000000004572512665102065022557 0ustar devwheel00000000000000; ****************************************************** ; *** *** ; *** Inno Setup version 5.1.11+ German messages *** ; *** *** ; *** Original Author: *** ; *** *** ; *** Michael Reitz (innosetup@assimilate.de) *** ; *** *** ; *** Contributors: *** ; *** *** ; *** Roland Ruder (info@rr4u.de) *** ; *** LaughingMan (puma.d@web.de) *** ; *** *** ; ****************************************************** ; ; Diese bersetzung hlt sich an die neue deutsche Rechtschreibung. [LangOptions] LanguageName=Deutsch LanguageID=$0407 LanguageCodePage=1252 [Messages] ; *** Application titles SetupAppTitle=Setup SetupWindowTitle=Setup - %1 UninstallAppTitle=Entfernen UninstallAppFullTitle=%1 entfernen ; *** Misc. common InformationTitle=Information ConfirmTitle=Besttigen ErrorTitle=Fehler ; *** SetupLdr messages SetupLdrStartupMessage=%1 wird jetzt installiert. Mchten Sie fortfahren? LdrCannotCreateTemp=Es konnte keine temporre Datei erstellt werden. Das Setup wurde abgebrochen LdrCannotExecTemp=Die Datei konnte nicht im temporren Ordner ausgefhrt werden. Das Setup wurde abgebrochen ; *** Startup error messages LastErrorMessage=%1.%n%nFehler %2: %3 SetupFileMissing=Die Datei %1 fehlt im Installations-Ordner. Bitte beheben Sie das Problem, oder besorgen Sie sich eine neue Kopie des Programms. SetupFileCorrupt=Die Setup-Dateien sind beschdigt. Besorgen Sie sich bitte eine neue Kopie des Programms. SetupFileCorruptOrWrongVer=Die Setup-Dateien sind beschdigt oder inkompatibel zu dieser Version des Setups. Bitte beheben Sie das Problem, oder besorgen Sie sich eine neue Kopie des Programms. NotOnThisPlatform=Dieses Programm kann nicht unter %1 ausgefhrt werden. OnlyOnThisPlatform=Dieses Programm muss unter %1 ausgefhrt werden. OnlyOnTheseArchitectures=Dieses Programm kann nur auf Windows-Versionen installiert werden, die folgende Prozessor-Architekturen untersttzen:%n%n%1 MissingWOW64APIs=Ihre Windows-Version enthlt nicht die Funktionen, die vom Setup fr eine 64-bit Installation bentigt werden. Installieren Sie bitte Service Pack %1, um dieses Problem zu beheben. WinVersionTooLowError=Dieses Programm bentigt %1 Version %2 oder hher. WinVersionTooHighError=Dieses Programm kann nicht unter %1 Version %2 oder hher installiert werden. AdminPrivilegesRequired=Sie mssen als Administrator angemeldet sein, um dieses Programm installieren zu knnen. PowerUserPrivilegesRequired=Sie mssen als Administrator oder als Mitglied der Hauptbenutzer-Gruppe angemeldet sein, um dieses Programm installieren zu knnen. SetupAppRunningError=Das Setup hat entdeckt, dass %1 zur Zeit ausgefhrt wird.%n%nBitte schlieen Sie jetzt alle laufenden Instanzen, und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden. UninstallAppRunningError=Die Deinstallation hat entdeckt, dass %1 zur Zeit ausgefhrt wird.%n%nBitte schlieen Sie jetzt alle laufenden Instanzen, und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden. ; *** Misc. errors ErrorCreatingDir=Das Setup konnte den Ordner "%1" nicht erstellen ErrorTooManyFilesInDir=Das Setup konnte eine Datei im Ordner "%1" nicht erstellen, weil er zu viele Dateien enthlt ; *** Setup common messages ExitSetupTitle=Setup verlassen ExitSetupMessage=Das Setup ist noch nicht abgeschlossen. Wenn Sie jetzt beenden, wird das Programm nicht installiert.%n%nSie knnen das Setup zu einem spteren Zeitpunkt nochmals ausfhren, um die Installation zu vervollstndigen.%n%nSetup verlassen? AboutSetupMenuItem=&ber das Setup ... AboutSetupTitle=ber das Setup AboutSetupMessage=%1 Version %2%n%3%n%n%1 Internet-Seite:%n%4 AboutSetupNote= TranslatorNote=German translation maintained by Michael Reitz (innosetup@assimilate.de) ; *** Buttons ButtonBack=< &Zurck ButtonNext=&Weiter > ButtonInstall=&Installieren ButtonOK=OK ButtonCancel=Abbrechen ButtonYes=&Ja ButtonYesToAll=J&a fr Alle ButtonNo=&Nein ButtonNoToAll=N&ein fr Alle ButtonFinish=&Fertigstellen ButtonBrowse=&Durchsuchen ... ButtonWizardBrowse=Du&rchsuchen ... ButtonNewFolder=&Neuen Ordner erstellen ; *** "Select Language" dialog messages SelectLanguageTitle=Setup-Sprache auswhlen SelectLanguageLabel=Whlen Sie die Sprache aus, die whrend der Installation benutzt werden soll: ; *** Common wizard text ClickNext="Weiter" zum Fortfahren, "Abbrechen" zum Verlassen. BeveledLabel= BrowseDialogTitle=Ordner suchen BrowseDialogLabel=Whlen Sie einen Ordner aus, und klicken Sie danach auf "OK". NewFolderName=Neuer Ordner ; *** "Welcome" wizard page WelcomeLabel1=Willkommen zum [name] Setup-Assistenten WelcomeLabel2=Dieser Assistent wird jetzt [name/ver] auf Ihrem Computer installieren.%n%nSie sollten alle anderen Anwendungen beenden, bevor Sie mit dem Setup fortfahren. ; *** "Password" wizard page WizardPassword=Passwort PasswordLabel1=Diese Installation wird durch ein Passwort geschtzt. PasswordLabel3=Bitte geben Sie das Passwort ein, und klicken Sie danach auf "Weiter". Achten Sie auf korrekte Gro-/Kleinschreibung. PasswordEditLabel=&Passwort: IncorrectPassword=Das eingegebene Passwort ist nicht korrekt. Bitte versuchen Sie es noch einmal. ; *** "License Agreement" wizard page WizardLicense=Lizenzvereinbarung LicenseLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren. LicenseLabel3=Lesen Sie bitte die folgenden Lizenzvereinbarungen. Benutzen Sie bei Bedarf die Bildlaufleiste oder drcken Sie die "Bild Ab"-Taste. LicenseAccepted=Ich &akzeptiere die Vereinbarung LicenseNotAccepted=Ich &lehne die Vereinbarung ab ; *** "Information" wizard pages WizardInfoBefore=Information InfoBeforeLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren. InfoBeforeClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind mit dem Setup fortzufahren. WizardInfoAfter=Information InfoAfterLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren. InfoAfterClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind mit dem Setup fortzufahren. ; *** "User Information" wizard page WizardUserInfo=Benutzerinformationen UserInfoDesc=Bitte tragen Sie Ihre Daten ein. UserInfoName=&Name: UserInfoOrg=&Organisation: UserInfoSerial=&Seriennummer: UserInfoNameRequired=Sie mssen einen Namen eintragen. ; *** "Select Destination Location" wizard page WizardSelectDir=Ziel-Ordner whlen SelectDirDesc=Wohin soll [name] installiert werden? SelectDirLabel3=Das Setup wird [name] in den folgenden Ordner installieren. SelectDirBrowseLabel=Klicken Sie auf "Weiter", um fortzufahren. Klicken Sie auf "Durchsuchen", falls Sie einen anderen Ordner auswhlen mchten. DiskSpaceMBLabel=Mindestens [mb] MB freier Speicherplatz ist erforderlich. ToUNCPathname=Das Setup kann nicht in einen UNC-Pfad installieren. Wenn Sie auf ein Netzlaufwerk installieren mchten, mssen Sie dem Netzwerkpfad einen Laufwerksbuchstaben zuordnen. InvalidPath=Sie mssen einen vollstndigen Pfad mit einem Laufwerksbuchstaben angeben; z.B.:%n%nC:\Beispiel%n%noder einen UNC-Pfad in der Form:%n%n\\Server\Freigabe InvalidDrive=Das angegebene Laufwerk bzw. der UNC-Pfad existiert nicht oder es kann nicht darauf zugegriffen werden. Whlen Sie bitte einen anderen Ordner. DiskSpaceWarningTitle=Nicht genug freier Speicherplatz DiskSpaceWarning=Das Setup bentigt mindestens %1 KB freien Speicherplatz zum Installieren, aber auf dem ausgewhlten Laufwerk sind nur %2 KB verfgbar.%n%nMchten Sie trotzdem fortfahren? DirNameTooLong=Der Ordnername/Pfad ist zu lang. InvalidDirName=Der Ordnername ist nicht gltig. BadDirName32=Ordnernamen drfen keine der folgenden Zeichen enthalten:%n%n%1 DirExistsTitle=Ordner existiert bereits DirExists=Der Ordner:%n%n%1%n%n existiert bereits. Mchten Sie trotzdem in diesen Ordner installieren? DirDoesntExistTitle=Ordner ist nicht vorhanden DirDoesntExist=Der Ordner:%n%n%1%n%nist nicht vorhanden. Soll der Ordner erstellt werden? ; *** "Select Components" wizard page WizardSelectComponents=Komponenten auswhlen SelectComponentsDesc=Welche Komponenten sollen installiert werden? SelectComponentsLabel2=Whlen Sie die Komponenten aus, die Sie installieren mchten. Klicken Sie auf "Weiter", wenn sie bereit sind fortzufahren. FullInstallation=Vollstndige Installation CompactInstallation=Kompakte Installation CustomInstallation=Benutzerdefinierte Installation NoUninstallWarningTitle=Komponenten vorhanden NoUninstallWarning=Das Setup hat festgestellt, dass die folgenden Komponenten bereits auf Ihrem Computer installiert sind:%n%n%1%n%nDiese nicht mehr ausgewhlten Komponenten werden nicht vom Computer entfernt.%n%nMchten Sie trotzdem fortfahren? ComponentSize1=%1 KB ComponentSize2=%1 MB ComponentsDiskSpaceMBLabel=Die aktuelle Auswahl erfordert min. [mb] MB Speicherplatz. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Zustzliche Aufgaben auswhlen SelectTasksDesc=Welche zustzlichen Aufgaben sollen ausgefhrt werden? SelectTasksLabel2=Whlen Sie die zustzlichen Aufgaben aus, die das Setup whrend der Installation von [name] ausfhren soll, und klicken Sie danach auf "Weiter". ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Startmen-Ordner auswhlen SelectStartMenuFolderDesc=Wo soll das Setup die Programm-Verknpfungen erstellen? SelectStartMenuFolderLabel3=Das Setup wird die Programm-Verknpfungen im folgenden Startmen-Ordner erstellen. SelectStartMenuFolderBrowseLabel=Klicken Sie auf "Weiter", um fortzufahren. Klicken Sie auf "Durchsuchen", falls Sie einen anderen Ordner auswhlen mchten. MustEnterGroupName=Sie mssen einen Ordnernamen eingeben. GroupNameTooLong=Der Ordnername/Pfad ist zu lang. InvalidGroupName=Der Ordnername ist nicht gltig. BadGroupName=Der Ordnername darf keine der folgenden Zeichen enthalten:%n%n%1 NoProgramGroupCheck2=&Keinen Ordner im Startmen erstellen ; *** "Ready to Install" wizard page WizardReady=Installation durchfhren ReadyLabel1=Das Setup ist jetzt bereit, [name] auf Ihrem Computer zu installieren. ReadyLabel2a=Klicken Sie auf "Installieren", um mit der Installation zu beginnen, oder auf "Zurck", um Ihre Einstellungen zu berprfen oder zu ndern. ReadyLabel2b=Klicken Sie auf "Installieren", um mit der Installation zu beginnen. ReadyMemoUserInfo=Benutzerinformationen: ReadyMemoDir=Ziel-Ordner: ReadyMemoType=Setup-Typ: ReadyMemoComponents=Ausgewhlte Komponenten: ReadyMemoGroup=Startmen-Ordner: ReadyMemoTasks=Zustzliche Aufgaben: ; *** "Preparing to Install" wizard page WizardPreparing=Vorbereitung der Installation PreparingDesc=Das Setup bereitet die Installation von [name] auf diesen Computer vor. PreviousInstallNotCompleted=Eine vorherige Installation/Deinstallation eines Programms wurde nicht abgeschlossen. Der Computer muss neu gestartet werden, um die Installation/Deinstallation zu beenden.%n%nStarten Sie das Setup nach dem Neustart Ihres Computers erneut, um die Installation von [name] durchzufhren. CannotContinue=Das Setup kann nicht fortfahren. Bitte klicken Sie auf "Abbrechen" zum Verlassen. ; *** "Installing" wizard page WizardInstalling=Installiere ... InstallingLabel=Warten Sie bitte whrend [name] auf Ihrem Computer installiert wird. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Beenden des [name] Setup-Assistenten FinishedLabelNoIcons=Das Setup hat die Installation von [name] auf Ihrem Computer abgeschlossen. FinishedLabel=Das Setup hat die Installation von [name] auf Ihrem Computer abgeschlossen. Die Anwendung kann ber die installierten Programm-Verknpfungen gestartet werden. ClickFinish=Klicken Sie auf "Fertigstellen", um das Setup zu beenden. FinishedRestartLabel=Um die Installation von [name] abzuschlieen, muss das Setup Ihren Computer neu starten. Mchten Sie jetzt neu starten? FinishedRestartMessage=Um die Installation von [name] abzuschlieen, muss das Setup Ihren Computer neu starten.%n%nMchten Sie jetzt neu starten? ShowReadmeCheck=Ja, ich mchte die LIESMICH-Datei sehen YesRadio=&Ja, Computer jetzt neu starten NoRadio=&Nein, ich werde den Computer spter neu starten RunEntryExec=%1 starten RunEntryShellExec=%1 anzeigen ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=Nchste Diskette einlegen SelectDiskLabel2=Legen Sie bitte Diskette %1 ein, und klicken Sie auf "OK".%n%nWenn sich die Dateien von dieser Diskette in einem anderen als dem angezeigten Ordner befinden, dann geben Sie bitte den korrekten Pfad ein oder klicken auf "Durchsuchen". PathLabel=&Pfad: FileNotInDir2=Die Datei "%1" befindet sich nicht in "%2". Bitte Ordner ndern oder richtige Diskette einlegen. SelectDirectoryLabel=Geben Sie bitte an, wo die nchste Diskette eingelegt wird. ; *** Installation phase messages SetupAborted=Das Setup konnte nicht abgeschlossen werden.%n%nBeheben Sie bitte das Problem, und starten Sie das Setup erneut. EntryAbortRetryIgnore=Klicken Sie auf "Wiederholen" fr einen weiteren Versuch, "Ignorieren", um trotzdem fortzufahren, oder "Abbrechen", um die Installation abzubrechen. ; *** Installation status messages StatusCreateDirs=Ordner werden erstellt ... StatusExtractFiles=Dateien werden entpackt ... StatusCreateIcons=Verknpfungen werden erstellt ... StatusCreateIniEntries=INI-Eintrge werden erstellt ... StatusCreateRegistryEntries=Registry-Eintrge werden erstellt ... StatusRegisterFiles=Dateien werden registriert ... StatusSavingUninstall=Deinstallations-Informationen werden gespeichert ... StatusRunProgram=Installation wird beendet ... StatusRollback=nderungen werden rckgngig gemacht ... ; *** Misc. errors ErrorInternal2=Interner Fehler: %1 ErrorFunctionFailedNoCode=%1 schlug fehl ErrorFunctionFailed=%1 schlug fehl; Code %2 ErrorFunctionFailedWithMessage=%1 schlug fehl; Code %2.%n%3 ErrorExecutingProgram=Datei kann nicht ausgefhrt werden:%n%1 ; *** Registry errors ErrorRegOpenKey=Registry-Schlssel konnte nicht geffnet werden:%n%1\%2 ErrorRegCreateKey=Registry-Schlssel konnte nicht erstellt werden:%n%1\%2 ErrorRegWriteKey=Fehler beim Schreiben des Registry-Schlssels:%n%1\%2 ; *** INI errors ErrorIniEntry=Fehler beim Erstellen eines INI-Eintrages in der Datei "%1". ; *** File copying errors FileAbortRetryIgnore=Klicken Sie auf "Wiederholen" fr einen weiteren Versuch, "Ignorieren", um diese Datei zu berspringen (nicht empfohlen), oder "Abbrechen", um die Installation abzubrechen. FileAbortRetryIgnore2=Klicken Sie auf "Wiederholen" fr einen weiteren Versuch, "Ignorieren", um trotzdem fortzufahren (nicht empfohlen), oder "Abbrechen", um die Installation abzubrechen. SourceIsCorrupted=Die Quelldatei ist beschdigt SourceDoesntExist=Die Quelldatei "%1" existiert nicht ExistingFileReadOnly=Die vorhandene Datei ist schreibgeschtzt.%n%nKlicken Sie auf "Wiederholen", um den Schreibschutz zu entfernen, "Ignorieren", um die Datei zu berspringen, oder "Abbrechen", um die Installation abzubrechen. ErrorReadingExistingDest=Lesefehler in Datei: FileExists=Die Datei ist bereits vorhanden.%n%nSoll sie berschrieben werden? ExistingFileNewer=Die vorhandene Datei ist neuer als die Datei, die installiert werden soll. Es wird empfohlen die vorhandene Datei beizubehalten.%n%n Mchten Sie die vorhandene Datei beibehalten? ErrorChangingAttr=Fehler beim ndern der Datei-Attribute: ErrorCreatingTemp=Fehler beim Erstellen einer Datei im Ziel-Ordner: ErrorReadingSource=Fehler beim Lesen der Quelldatei: ErrorCopying=Fehler beim Kopieren einer Datei: ErrorReplacingExistingFile=Fehler beim Ersetzen einer vorhandenen Datei: ErrorRestartReplace="Ersetzen nach Neustart" fehlgeschlagen: ErrorRenamingTemp=Fehler beim Umbenennen einer Datei im Ziel-Ordner: ErrorRegisterServer=DLL/OCX konnte nicht registriert werden: %1 ErrorRegSvr32Failed=RegSvr32-Aufruf scheiterte mit Exit-Code %1 ErrorRegisterTypeLib=Typen-Bibliothek konnte nicht registriert werden: %1 ; *** Post-installation errors ErrorOpeningReadme=Fehler beim ffnen der LIESMICH-Datei. ErrorRestartingComputer=Das Setup konnte den Computer nicht neu starten. Bitte fhren Sie den Neustart manuell durch. ; *** Uninstaller messages UninstallNotFound=Die Datei "%1" existiert nicht. Entfernen der Anwendung fehlgeschlagen. UninstallOpenError=Die Datei "%1" konnte nicht geffnet werden. Entfernen der Anwendung fehlgeschlagen. UninstallUnsupportedVer=Das Format der Deinstallations-Datei "%1" konnte nicht erkannt werden. Entfernen der Anwendung fehlgeschlagen UninstallUnknownEntry=In der Deinstallations-Datei wurde ein unbekannter Eintrag (%1) gefunden ConfirmUninstall=Sind Sie sicher, dass Sie %1 und alle zugehrigen Komponenten entfernen mchten? UninstallOnlyOnWin64=Diese Installation kann nur unter 64-bit Windows-Versionen entfernt werden. OnlyAdminCanUninstall=Diese Installation kann nur von einem Benutzer mit Administrator-Rechten entfernt werden. UninstallStatusLabel=Warten Sie bitte whrend %1 von Ihrem Computer entfernt wird. UninstalledAll=%1 wurde erfolgreich von Ihrem Computer entfernt. UninstalledMost=Entfernen von %1 beendet.%n%nEinige Komponenten konnten nicht entfernt werden. Diese knnen von Ihnen manuell gelscht werden. UninstalledAndNeedsRestart=Um die Deinstallation von %1 abzuschlieen, muss Ihr Computer neu gestartet werden.%n%nMchten Sie jetzt neu starten? UninstallDataCorrupted="%1"-Datei ist beschdigt. Entfernen der Anwendung fehlgeschlagen. ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Gemeinsame Datei entfernen? ConfirmDeleteSharedFile2=Das System zeigt an, dass die folgende gemeinsame Datei von keinem anderen Programm mehr benutzt wird. Mchten Sie diese Datei entfernen lassen?%nSollte es doch noch Programme geben, die diese Datei benutzen, und sie wird entfernt, funktionieren diese Programme vielleicht nicht mehr richtig. Wenn Sie unsicher sind, whlen Sie "Nein" um die Datei im System zu belassen. Es schadet Ihrem System nicht, wenn Sie die Datei behalten. SharedFileNameLabel=Dateiname: SharedFileLocationLabel=Ordner: WizardUninstalling=Entfernen (Status) StatusUninstalling=Entferne %1 ... [CustomMessages] NameAndVersion=%1 Version %2 AdditionalIcons=Zustzliche Symbole: CreateDesktopIcon=&Desktop-Symbol erstellen CreateQuickLaunchIcon=Symbol in der Schnellstartleiste erstellen ProgramOnTheWeb=%1 im Internet UninstallProgram=%1 entfernen LaunchProgram=%1 starten AssocFileExtension=&Registriere %1 mit der %2-Dateierweiterung AssocingFileExtension=%1 wird mit der %2-Dateierweiterung registriert... AskRemove=Mchten Sie %1 entfernen? SelectVersion=Version auswhlen ChangeIntegration=Desktopintegration ndern CalibrationLoading=Kalibrierung bei Anmeldung laden: CalibrationLoadingHandledByDisplayCAL=DisplayCAL Profil-Lader (hohe Przision und Zuverlssigkeit) CalibrationLoadingHandledByOS=Betriebssystem (niedrige Przision und Zuverlssigkeit)DisplayCAL-3.5.0.0/misc/InnoSetup/v5/Languages/Italian.isl0000644000076500000000000004454112665102065022722 0ustar devwheel00000000000000; *** Inno Setup versione 5.1.11+ lingua Italiana *** ; ; To download user-contributed translations of this file, go to: ; http://www.jrsoftware.org/is3rdparty.php ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno ; Setup adds the periods automatically (appending a period would result in ; two periods being displayed). ; ; Italian.isl revisione 30b - 2007/02/28 (Basato su Default.isl 1.69) ; ; Tradotto da ale5000 ; E-mail: ale5000 AT tiscali DOT it ; Segnalatemi via e-mail eventuali errori o suggerimenti. [LangOptions] ; The following three entries are very important. Be sure to read and ; understand the '[LangOptions] section' topic in the help file. LanguageName=Italiano LanguageID=$0410 LanguageCodePage=1252 ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. ;DialogFontName= ;DialogFontSize=8 ;WelcomeFontName=Verdana ;WelcomeFontSize=12 ;TitleFontName=Arial ;TitleFontSize=29 ;CopyrightFontName=Arial ;CopyrightFontSize=8 [Messages] ; *** Application titles SetupAppTitle=Installazione SetupWindowTitle=Installazione di %1 UninstallAppTitle=Disinstallazione UninstallAppFullTitle=Disinstallazione di %1 ; *** Misc. common InformationTitle=Informazioni ConfirmTitle=Conferma ErrorTitle=Errore ; *** SetupLdr messages SetupLdrStartupMessage=Questa l'installazione di %1. Si desidera continuare? LdrCannotCreateTemp=Impossibile creare un file temporaneo. Installazione annullata LdrCannotExecTemp=Impossibile eseguire un file nella cartella temporanea. Installazione annullata ; *** Startup error messages LastErrorMessage=%1.%n%nErrore %2: %3 SetupFileMissing=File %1 non trovato nella cartella di installazione. Correggere il problema o richiedere una nuova copia del software. SetupFileCorrupt=I file di installazione sono danneggiati. Richiedere una nuova copia del software. SetupFileCorruptOrWrongVer=I file di installazione sono danneggiati, o sono incompatibili con questa versione del programma di installazione. Correggere il problema o richiedere una nuova copia del software. NotOnThisPlatform=Questo programma non compatibile con %1. OnlyOnThisPlatform=Questo programma richiede %1. OnlyOnTheseArchitectures=Questo programma pu essere installato solo su versioni di Windows progettate per le seguenti architetture del processore:%n%n%1 MissingWOW64APIs=La versione di Windows utilizzata non include la funzionalit richiesta dal programma di installazione per realizzare un'installazione a 64-bit. Per correggere questo problema, installare il Service Pack %1. WinVersionTooLowError=Questo programma richiede %1 versione %2 o successiva. WinVersionTooHighError=Questo programma non pu essere installato su %1 versione %2 o successiva. AdminPrivilegesRequired=Sono richiesti privilegi di amministratore per installare questo programma. PowerUserPrivilegesRequired=Sono richiesti privilegi di amministratore o di Power Users per poter installare questo programma. SetupAppRunningError=%1 attualmente in esecuzione.%n%nChiudere adesso tutte le istanze del programma e poi premere OK, oppure premere Annulla per uscire. UninstallAppRunningError=%1 attualmente in esecuzione.%n%nChiudere adesso tutte le istanze del programma e poi premere OK, oppure premere Annulla per uscire. ; *** Misc. errors ErrorCreatingDir=Impossibile creare la cartella "%1" ErrorTooManyFilesInDir=Impossibile creare i file nella cartella "%1" perch contiene troppi file ; *** Setup common messages ExitSetupTitle=Uscita dall'installazione ExitSetupMessage=L'installazione non completa. Uscendo dall'installazione in questo momento, il programma non sar installato.%n%n possibile eseguire l'installazione in un secondo tempo.%n%nUscire dall'installazione? AboutSetupMenuItem=&Informazioni sull'installazione... AboutSetupTitle=Informazioni sull'installazione AboutSetupMessage=%1 versione %2%n%3%n%n%1 sito web:%n%4 AboutSetupNote= TranslatorNote= ; *** Buttons ButtonBack=< &Indietro ButtonNext=&Avanti > ButtonInstall=&Installa ButtonOK=OK ButtonCancel=Annulla ButtonYes=&Si ButtonYesToAll=Si a &tutto ButtonNo=&No ButtonNoToAll=N&o a tutto ButtonFinish=&Fine ButtonBrowse=&Sfoglia... ButtonWizardBrowse=S&foglia... ButtonNewFolder=&Crea nuova cartella ; *** "Select Language" dialog messages SelectLanguageTitle=Selezionare la lingua dell'installazione SelectLanguageLabel=Selezionare la lingua da utilizzare durante l'installazione: ; *** Common wizard text ClickNext=Premere Avanti per continuare, o Annulla per uscire. BeveledLabel= BrowseDialogTitle=Sfoglia per cartelle BrowseDialogLabel=Selezionare una cartella dalla lista, poi premere OK. NewFolderName=Nuova cartella ; *** "Welcome" wizard page WelcomeLabel1=Benvenuti nel programma di installazione di [name] WelcomeLabel2=[name/ver] sar installato sul computer.%n%nSi consiglia di chiudere tutte le applicazioni attive prima di procedere. ; *** "Password" wizard page WizardPassword=Password PasswordLabel1=Questa installazione protetta da password. PasswordLabel3=Inserire la password, poi premere Avanti per continuare. Le password sono sensibili alle maiuscole/minuscole. PasswordEditLabel=&Password: IncorrectPassword=La password inserita non corretta, riprovare. ; *** "License Agreement" wizard page WizardLicense=Contratto di licenza LicenseLabel=Leggere con attenzione le informazioni che seguono prima di procedere. LicenseLabel3=Leggere il seguente contratto di licenza. necessario accettare tutti i termini del contratto per procedere con l'installazione. LicenseAccepted=&Accetto i termini del contratto di licenza LicenseNotAccepted=&Non accetto i termini del contratto di licenza ; *** "Information" wizard pages WizardInfoBefore=Informazioni InfoBeforeLabel=Leggere le importanti informazioni che seguono prima di procedere. InfoBeforeClickLabel=Quando si pronti per proseguire, premere Avanti. WizardInfoAfter=Informazioni InfoAfterLabel=Leggere le importanti informazioni che seguono prima di procedere. InfoAfterClickLabel=Quando si pronti per proseguire, premere Avanti. ; *** "User Information" wizard page WizardUserInfo=Informazioni utente UserInfoDesc=Inserire le seguenti informazioni. UserInfoName=&Nome: UserInfoOrg=&Societ: UserInfoSerial=&Numero di serie: UserInfoNameRequired= necessario inserire un nome. ; *** "Select Destination Location" wizard page WizardSelectDir=Selezione della cartella di installazione SelectDirDesc=Dove si vuole installare [name]? SelectDirLabel3=[name] sar installato nella seguente cartella. SelectDirBrowseLabel=Per continuare, premere Avanti. Per scegliere un'altra cartella, premere Sfoglia. DiskSpaceMBLabel=Sono richiesti almeno [mb] MB di spazio sul disco. ToUNCPathname=Non possiblie installare su un percorso di rete. Se si sta installando attraverso una rete, si deve connettere la risorsa come una unit di rete. InvalidPath=Si deve inserire un percorso completo di lettera di unit; per esempio:%n%nC:\APP%n%no un percorso di rete nella forma:%n%n\\server\condivisione InvalidDrive=L'unit o il percorso di rete selezionato non esiste o non accessibile. Selezionarne un'altro. DiskSpaceWarningTitle=Spazio su disco insufficiente DiskSpaceWarning=L'installazione richiede almeno %1 KB di spazio libero per eseguire l'installazione, ma l'unit selezionata ha solo %2 KB disponibili.%n%nSi desidera continuare comunque? DirNameTooLong=Il nome della cartella o il percorso sono troppo lunghi. InvalidDirName=Il nome della cartella non valido. BadDirName32=Il nome della cartella non pu includere nessuno dei caratteri seguenti:%n%n%1 DirExistsTitle=Cartella gi esistente DirExists=La cartella:%n%n%1 esiste gi.%n%nSi desidera utilizzarla comunque? DirDoesntExistTitle=Cartella inesistente DirDoesntExist=La cartella:%n%n%1 non esiste.%n%nSi desidera crearla? ; *** "Select Components" wizard page WizardSelectComponents=Selezione componenti SelectComponentsDesc=Quali componenti devono essere installati? SelectComponentsLabel2=Selezionare i componenti da installare, deselezionare quelli che non si desidera installare. Premere Avanti per continuare. FullInstallation=Installazione completa ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Installazione compatta CustomInstallation=Installazione personalizzata NoUninstallWarningTitle=Componente esistente NoUninstallWarning=I seguenti componenti sono gi installati sul computer:%n%n%1%n%nDeselezionando questi componenti non verranno disinstallati.%n%nSi desidera continuare comunque? ComponentSize1=%1 KB ComponentSize2=%1 MB ComponentsDiskSpaceMBLabel=La selezione corrente richiede almeno [mb] MB di spazio su disco. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Selezione processi addizionali SelectTasksDesc=Quali processi aggiuntivi si vogliono avviare? SelectTasksLabel2=Selezionare i processi aggiuntivi che verranno eseguiti durante l'installazione di [name], poi premere Avanti. ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Selezione della cartella nel Menu Avvio/Start SelectStartMenuFolderDesc=Dove si vuole inserire i collegamenti al programma? SelectStartMenuFolderLabel3=Saranno creati i collegamenti al programma nella seguente cartella del Menu Avvio/Start. SelectStartMenuFolderBrowseLabel=Per continuare, premere Avanti. Per selezionare un'altra cartella, premere Sfoglia. MustEnterGroupName=Si deve inserire il nome della cartella. GroupNameTooLong=Il nome della cartella o il percorso sono troppo lunghi. InvalidGroupName=Il nome della cartella non valido. BadGroupName=Il nome della cartella non pu includere nessuno dei caratteri seguenti:%n%n%1 NoProgramGroupCheck2=&Non creare una cartella nel Menu Avvio/Start ; *** "Ready to Install" wizard page WizardReady=Pronto per l'installazione ReadyLabel1=Il programma di installazione pronto per iniziare l'installazione di [name] sul computer. ReadyLabel2a=Premere Installa per continuare con l'installazione, o Indietro per rivedere o modificare le impostazioni. ReadyLabel2b=Premere Installa per procedere con l'installazione. ReadyMemoUserInfo=Informazioni utente: ReadyMemoDir=Cartella di installazione: ReadyMemoType=Tipo di installazione: ReadyMemoComponents=Componenti selezionati: ReadyMemoGroup=Cartella del menu Avvio/Start: ReadyMemoTasks=Processi addizionali: ; *** "Preparing to Install" wizard page WizardPreparing=Preparazione all'installazione PreparingDesc=Preparazione all'installazione di [name] sul computer. PreviousInstallNotCompleted=L'installazione/disinstallazione precedente del programma non stata completata. necessario riavviare il sistema per completare l'installazione.%n%nAl successivo riavvio del sistema eseguire di nuovo l'installazione di [name]. CannotContinue=L'installazione non pu continuare. Premere Annulla per uscire. ; *** "Installing" wizard page WizardInstalling=Installazione in corso InstallingLabel=Attendere il completamento dell'installazione di [name] sul computer. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Completamento dell'installazione di [name] FinishedLabelNoIcons=L'installazione di [name] stata completata con successo. FinishedLabel=L'installazione di [name] stata completata con successo. L'applicazione pu essere eseguita selezionando le relative icone. ClickFinish=Premere Fine per uscire dall'installazione. FinishedRestartLabel=Per completare l'installazione di [name], necessario riavviare il sistema. Si desidera riavviare adesso? FinishedRestartMessage=Per completare l'installazione di [name], necessario riavviare il sistema.%n%nSi desidera riavviare adesso? ShowReadmeCheck=Si, desidero vedere il file LEGGIMI adesso YesRadio=&Si, riavvia il sistema adesso NoRadio=&No, riavvia il sistema pi tardi ; used for example as 'Run MyProg.exe' RunEntryExec=Avvia %1 ; used for example as 'View Readme.txt' RunEntryShellExec=Visualizza %1 ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=L'installazione necessita del disco successivo SelectDiskLabel2=Inserire il disco %1 e premere OK.%n%nSe i file su questo disco si trovano in una cartella diversa da quella visualizzata sotto, inserire il percorso corretto o premere Sfoglia. PathLabel=&Percorso: FileNotInDir2=Il file "%1" non stato trovato in "%2". Inserire il disco corretto o selezionare un'altra cartella. SelectDirectoryLabel=Specificare il percorso del prossimo disco. ; *** Installation phase messages SetupAborted=L'installazione non stata completata.%n%nCorreggere il problema e rieseguire nuovamente l'installazione. EntryAbortRetryIgnore=Premere Riprova per ritentare nuovamente, Ignora per procedere in ogni caso, o Interrompi per terminare l'installazione. ; *** Installation status messages StatusCreateDirs=Creazione cartelle... StatusExtractFiles=Estrazione file... StatusCreateIcons=Creazione icone... StatusCreateIniEntries=Creazione voci nei file INI... StatusCreateRegistryEntries=Creazione voci di registro... StatusRegisterFiles=Registrazione file... StatusSavingUninstall=Salvataggio delle informazioni di disinstallazione... StatusRunProgram=Termine dell'installazione... StatusRollback=Recupero delle modifiche... ; *** Misc. errors ErrorInternal2=Errore Interno %1 ErrorFunctionFailedNoCode=%1 fallito ErrorFunctionFailed=%1 fallito; codice %2 ErrorFunctionFailedWithMessage=%1 fallito; codice %2.%n%3 ErrorExecutingProgram=Impossibile eseguire il file:%n%1 ; *** Registry errors ErrorRegOpenKey=Errore di apertura della chiave di registro:%n%1\%2 ErrorRegCreateKey=Errore di creazione della chiave di registro:%n%1\%2 ErrorRegWriteKey=Errore di scrittura della chiave di registro:%n%1\%2 ; *** INI errors ErrorIniEntry=Errore nella creazione delle voci INI nel file "%1". ; *** File copying errors FileAbortRetryIgnore=Premere Riprova per tentare di nuovo, Ignora per saltare questo file (sconsigliato), o Interrompi per terminare l'installazione. FileAbortRetryIgnore2=Premere Riprova per tentare di nuovo, Ignora per proseguire comunque (sconsigliato), o Interrompi per terminare l'installazione. SourceIsCorrupted=Il file sorgente danneggiato SourceDoesntExist=Il file sorgente "%1" non esiste ExistingFileReadOnly=Il file esistente ha l'attributo di sola lettura.%n%nPremere Riprova per rimuovere l'attributo di sola lettura e ritentare, Ignora per saltare questo file, o Interrompi per terminare l'installazione. ErrorReadingExistingDest=Si verificato un errore durante la lettura del file esistente: FileExists=Il file esiste gi.%n%nDesideri sovrascriverlo? ExistingFileNewer=Il file esistente pi recente di quello che si st installando. Si raccomanda di mantenere il file esistente.%n%nSi desidera mantenere il file esistente? ErrorChangingAttr=Si verificato un errore durante il tentativo di modifica dell'attributo del file esistente: ErrorCreatingTemp=Si verificato un errore durante la creazione di un file nella cartella di installazione: ErrorReadingSource=Si verificato un errore durante la lettura del file sorgente: ErrorCopying=Si verificato un errore durante la copia di un file: ErrorReplacingExistingFile=Si verificato un errore durante la sovrascrittura del file esistente: ErrorRestartReplace=Errore durante Riavvio-Sostituzione: ErrorRenamingTemp=Si verificato un errore durante il tentativo di rinominare un file nella cartella di installazione: ErrorRegisterServer=Impossibile registrare la DLL/OCX: %1 ErrorRegSvr32Failed=RegSvr32 fallito con codice di uscita %1 ErrorRegisterTypeLib=Impossibile registrare la libreria di tipo: %1 ; *** Post-installation errors ErrorOpeningReadme=Si verificato un errore durante l'apertura del file LEGGIMI. ErrorRestartingComputer=Impossibile riavviare il sistema. Riavviare manualmente. ; *** Uninstaller messages UninstallNotFound=Il file "%1" non esiste. Impossibile disinstallare. UninstallOpenError=Il file "%1" non pu essere aperto. Impossibile disinstallare UninstallUnsupportedVer=Il file log di disinstallazione "%1" in un formato non riconosciuto da questa versione del programma di disinstallazione. Impossibile disinstallare UninstallUnknownEntry=Trovata una voce sconosciuta (%1) nel file di log della disinstallazione ConfirmUninstall=Si desidera rimuovere completamente %1 e tutti i suoi componenti? UninstallOnlyOnWin64=Questo programma pu essere disinstallato solo su Windows a 64-bit. OnlyAdminCanUninstall=Questa applicazione pu essere disinstallata solo da un utente con privilegi di amministratore. UninstallStatusLabel=Attendere fino a che %1 stato rimosso dal computer. UninstalledAll=%1 stato rimosso con successo dal computer. UninstalledMost=Disinstallazione di %1 completata.%n%nAlcuni elementi non possono essere rimossi. Dovranno essere rimossi manualmente. UninstalledAndNeedsRestart=Per completare la disinstallazione di %1, necessario riavviare il sistema.%n%nSi desidera riavviare adesso? UninstallDataCorrupted=Il file "%1" danneggiato. Impossibile disinstallare ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Rimuovere il file condiviso? ConfirmDeleteSharedFile2=Il sistema indica che il seguente file condiviso non pi usato da nessun programma. Rimuovere questo file condiviso?%n%nSe qualche programma usasse questo file, potrebbe non funzionare pi correttamente. Se non si sicuri, scegliere No. Lasciare il file nel sistema non pu causare danni. SharedFileNameLabel=Nome del file: SharedFileLocationLabel=Percorso: WizardUninstalling=Stato della disinstallazione StatusUninstalling=Disinstallazione di %1 in corso... ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. [CustomMessages] NameAndVersion=%1 versione %2 AdditionalIcons=Icone aggiuntive: CreateDesktopIcon=Crea un'icona sul &desktop CreateQuickLaunchIcon=Crea un'icona nella barra &Avvio veloce ProgramOnTheWeb=%1 sul Web UninstallProgram=Disinstalla %1 LaunchProgram=Avvia %1 AssocFileExtension=&Associa l'estensione %2 a %1 AssocingFileExtension=Associazione dell'estensione %2 a %1 in corso... CalibrationLoading=Caricamento di calibrazione su login: CalibrationLoadingHandledByDisplayCAL=DisplayCAL Profile Loader (alta precisione ed affidabilit) CalibrationLoadingHandledByOS=Sistema operativo (bassa precisione ed affidabilit)DisplayCAL-3.5.0.0/misc/InnoSetup/v5/Languages/Spanish.isl0000644000076500000000000004500212665102065022737 0ustar devwheel00000000000000; *** Inno Setup version 5.1.11+ Spanish messages *** ; ; Maintained by Jorge Andres Brugger (jbrugger@gmx.net) ; Spanish.isl version 0.9 (20100922) ; Default.isl version 1.72 ; ; Thanks to Germn Giraldo, Jordi Latorre, Ximo Tamarit, Emiliano Llano, ; Ramn Verduzco, Graciela Garca and Carles Millan [LangOptions] ; The following three entries are very important. Be sure to read and ; understand the '[LangOptions] section' topic in the help file. LanguageName=Espa<00F1>ol LanguageID=$0c0a LanguageCodePage=1252 ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. ;DialogFontName= ;DialogFontSize=8 ;WelcomeFontName=Verdana ;WelcomeFontSize=12 ;TitleFontName=Arial ;TitleFontSize=29 ;CopyrightFontName=Arial ;CopyrightFontSize=8 [Messages] ; *** Application titles SetupAppTitle=Instalar SetupWindowTitle=Instalar - %1 UninstallAppTitle=Desinstalar UninstallAppFullTitle=Desinstalar - %1 ; *** Misc. common InformationTitle=Informacin ConfirmTitle=Confirmar ErrorTitle=Error ; *** SetupLdr messages SetupLdrStartupMessage=Este programa instalar %1. Desea continuar? LdrCannotCreateTemp=Imposible crear archivo temporal. Instalacin interrumpida LdrCannotExecTemp=Imposible ejecutar archivo en la carpeta temporal. Instalacin interrumpida ; *** Startup error messages LastErrorMessage=%1.%n%nError %2: %3 SetupFileMissing=El archivo %1 no se encuentra en la carpeta de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. SetupFileCorrupt=Los archivos de instalacin estn daados. Por favor, obtenga una copia nueva del programa. SetupFileCorruptOrWrongVer=Los archivos de instalacin estn daados, o son incompatibles con esta versin del programa de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. NotOnThisPlatform=Este programa no se ejecutar en %1. OnlyOnThisPlatform=Este programa debe ejecutarse en %1. OnlyOnTheseArchitectures=Este programa slo puede instalarse en versiones de Windows diseadas para las siguientes arquitecturas de procesadores:%n%n%1 MissingWOW64APIs=La versin de Windows que est utilizando no cuenta con la funcionalidad requerida por el instalador para realizar una instalacin de 64-bits. Para solucionar este problema, por favor instale el Service Pack %1. WinVersionTooLowError=Este programa requiere %1 versin %2 o posterior. WinVersionTooHighError=Este programa no puede instalarse en %1 versin %2 o posterior. AdminPrivilegesRequired=Debe iniciar la sesin como administrador para instalar este programa. PowerUserPrivilegesRequired=Debe iniciar la sesin como administrador o como un miembro del grupo Usuarios Avanzados para instalar este programa. SetupAppRunningError=El programa de instalacin ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar, o en Cancelar para salir. UninstallAppRunningError=El desinstalador ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar, o en Cancelar para salir. ; *** Misc. errors ErrorCreatingDir=El programa de instalacin no pudo crear la carpeta "%1" ErrorTooManyFilesInDir=Imposible crear un archivo en la carpeta "%1" porque contiene demasiados archivos ; *** Setup common messages ExitSetupTitle=Salir de la Instalacin ExitSetupMessage=La instalacin no se ha completado an. Si cancela ahora, el programa no ser instalado.%n%nPuede ejecutar nuevamente el programa de instalacin en otra ocasin para completarla.%n%nSalir de la instalacin? AboutSetupMenuItem=&Acerca de Instalar... AboutSetupTitle=Acerca de Instalar AboutSetupMessage=%1 versin %2%n%3%n%n%1 sitio Web:%n%4 AboutSetupNote= TranslatorNote=Spanish translation maintained by Jorge Andres Brugger (jbrugger@gmx.net) ; *** Buttons ButtonBack=< &Atrs ButtonNext=&Siguiente > ButtonInstall=&Instalar ButtonOK=Aceptar ButtonCancel=Cancelar ButtonYes=&S ButtonYesToAll=S a &Todo ButtonNo=&No ButtonNoToAll=N&o a Todo ButtonFinish=&Finalizar ButtonBrowse=&Examinar... ButtonWizardBrowse=&Examinar... ButtonNewFolder=&Crear Nueva Carpeta ; *** "Select Language" dialog messages SelectLanguageTitle=Seleccione el Idioma de la Instalacin SelectLanguageLabel=Seleccione el idioma a utilizar durante la instalacin: ; *** Common wizard text ClickNext=Haga clic en Siguiente para continuar, o en Cancelar para salir de la instalacin. BeveledLabel= BrowseDialogTitle=Buscar Carpeta BrowseDialogLabel=Seleccione una carpeta, y luego haga clic en Aceptar. NewFolderName=Nueva Carpeta ; *** "Welcome" wizard page WelcomeLabel1=Bienvenido al asistente de instalacin de [name] WelcomeLabel2=Este programa instalar [name/ver] en su sistema.%n%nSe recomienda que cierre todas las dems aplicaciones antes de continuar. ; *** "Password" wizard page WizardPassword=Contrasea PasswordLabel1=Esta instalacin est protegida por contrasea. PasswordLabel3=Por favor, ingrese la contrasea, y haga clic en Siguiente para continuar. En las contraseas se hace diferencia entre maysculas y minsculas. PasswordEditLabel=&Contrasea: IncorrectPassword=La contrasea ingresada no es correcta. Por favor, intntelo nuevamente. ; *** "License Agreement" wizard page WizardLicense=Acuerdo de Licencia LicenseLabel=Por favor, lea la siguiente informacin de importancia antes de continuar. LicenseLabel3=Por favor, lea el siguiente acuerdo de licencia. Debe aceptar los trminos de este acuerdo antes de continuar con la instalacin. LicenseAccepted=A&cepto el acuerdo LicenseNotAccepted=&No acepto el acuerdo ; *** "Information" wizard pages WizardInfoBefore=Informacin InfoBeforeLabel=Por favor, lea la siguiente informacin de importancia antes de continuar. InfoBeforeClickLabel=Cuando est listo para continuar con la instalacin, haga clic en Siguiente. WizardInfoAfter=Informacin InfoAfterLabel=Por favor, lea la siguiente informacin de importancia antes de continuar. InfoAfterClickLabel=Cuando est listo para continuar, haga clic en Siguiente. ; *** "User Information" wizard page WizardUserInfo=Informacin de Usuario UserInfoDesc=Por favor, introduzca su informacin. UserInfoName=Nombre de &Usuario: UserInfoOrg=&Organizacin: UserInfoSerial=Nmero de &Serie: UserInfoNameRequired=Debe ingresar un nombre. ; *** "Select Destination Location" wizard page WizardSelectDir=Seleccione la Carpeta de Destino SelectDirDesc=Dnde debe instalarse [name]? SelectDirLabel3=El programa instalar [name] en la siguiente carpeta. SelectDirBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta diferente, haga clic en Examinar. DiskSpaceMBLabel=Se requieren al menos [mb] MB de espacio libre en el disco. ToUNCPathname=No es posible realizar la instalacin en una ruta de acceso UNC. Si est intentando instalar en una red, necesitar mapear una unidad de la red. InvalidPath=Debe ingresar una ruta completa con la letra de la unidad; por ejemplo:%n%nC:\APP%n%no una ruta de acceso UNC de la siguiente forma:%n%n\\servidor\compartido InvalidDrive=La unidad o ruta de acceso UNC que seleccion no existe o no es accesible. Por favor, seleccione otra. DiskSpaceWarningTitle=Espacio Insuficiente en Disco DiskSpaceWarning=La instalacin requiere al menos %1 KB de espacio libre, pero la unidad seleccionada slo cuenta con %2 KB disponibles.%n%nDesea continuar de todas formas? DirNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. InvalidDirName=El nombre de la carpeta no es vlido. BadDirName32=Los nombres de carpetas no pueden incluir los siguientes caracteres:%n%n%1 DirExistsTitle=La Carpeta Ya Existe DirExists=La carpeta:%n%n%1%n%nya existe. Desea realizar la instalacin en esa carpeta de todas formas? DirDoesntExistTitle=La Carpeta No Existe DirDoesntExist=La carpeta:%n%n%1%n%nno existe. Desea crear esa carpeta? ; *** "Select Components" wizard page WizardSelectComponents=Seleccione los Componentes SelectComponentsDesc=Qu componentes deben instalarse? SelectComponentsLabel2=Seleccione los componentes que desea instalar; desactive los componentes que no desea instalar. Haga clic en Siguiente cuando est listo para continuar. FullInstallation=Instalacin Completa ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Instalacin Compacta CustomInstallation=Instalacin Personalizada NoUninstallWarningTitle=Componentes Existentes NoUninstallWarning=El programa de instalacin ha detectado que los siguientes componentes ya estn instalados en su sistema:%n%n%1%n%nQuitar la seleccin a estos componentes no los desinstalar.%n%nDesea continuar de todos modos? ComponentSize1=%1 KB ComponentSize2=%1 MB ComponentsDiskSpaceMBLabel=La seleccin actual requiere al menos [mb] MB de espacio en disco. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Seleccione las Tareas Adicionales SelectTasksDesc=Qu tareas adicionales deben realizarse? SelectTasksLabel2=Seleccione las tareas adicionales que desea que se realicen durante la instalacin de [name] y haga clic en Siguiente. ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Seleccione la Carpeta del Men Inicio SelectStartMenuFolderDesc=Dnde deben colocarse los accesos directos del programa? SelectStartMenuFolderLabel3=El programa de instalacin crear los accesos directos del programa en la siguiente carpeta del Men Inicio. SelectStartMenuFolderBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta distinta, haga clic en Examinar. MustEnterGroupName=Debe proporcionar un nombre de carpeta. GroupNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. InvalidGroupName=El nombre de la carpeta no es vlido. BadGroupName=El nombre de la carpeta no puede incluir ninguno de los siguientes caracteres:%n%n%1 NoProgramGroupCheck2=&No crear una carpeta en el Men Inicio ; *** "Ready to Install" wizard page WizardReady=Listo para Instalar ReadyLabel1=Ahora el programa est listo para iniciar la instalacin de [name] en su sistema. ReadyLabel2a=Haga clic en Instalar para continuar con el proceso, o haga clic en Atrs si desea revisar o cambiar alguna configuracin. ReadyLabel2b=Haga clic en Instalar para continuar con el proceso. ReadyMemoUserInfo=Informacin del usuario: ReadyMemoDir=Carpeta de Destino: ReadyMemoType=Tipo de Instalacin: ReadyMemoComponents=Componentes Seleccionados: ReadyMemoGroup=Carpeta del Men Inicio: ReadyMemoTasks=Tareas Adicionales: ; *** "Preparing to Install" wizard page WizardPreparing=Preparndose para Instalar PreparingDesc=El programa de instalacin est preparndose para instalar [name] en su sistema. PreviousInstallNotCompleted=La instalacin/desinstalacin previa de un programa no se complet. Deber reiniciar el sistema para completar esa instalacin.%n%nUna vez reiniciado el sistema, ejecute el programa de instalacin nuevamente para completar la instalacin de [name]. CannotContinue=El programa de instalacin no puede continuar. Por favor, presione Cancelar para salir. ; *** "Installing" wizard page WizardInstalling=Instalando InstallingLabel=Por favor, espere mientras se instala [name] en su sistema. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Completando la instalacin de [name] FinishedLabelNoIcons=El programa complet la instalacin de [name] en su sistema. FinishedLabel=El programa complet la instalacin de [name] en su sistema. Puede ejecutar la aplicacin haciendo clic sobre el icono instalado. ClickFinish=Haga clic en Finalizar para salir del programa de instalacin. FinishedRestartLabel=Para completar la instalacin de [name], su sistema debe reiniciarse. Desea reiniciarlo ahora? FinishedRestartMessage=Para completar la instalacin de [name], su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? ShowReadmeCheck=S, deseo ver el archivo LAME YesRadio=&S, deseo reiniciar el sistema ahora NoRadio=&No, reiniciar el sistema ms tarde ; used for example as 'Run MyProg.exe' RunEntryExec=Ejecutar %1 ; used for example as 'View Readme.txt' RunEntryShellExec=Ver %1 ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=El Programa de Instalacin Necesita el Siguiente Disco SelectDiskLabel2=Por favor, inserte el Disco %1 y haga clic en Aceptar.%n%nSi los archivos pueden ser hallados en una carpeta diferente a la indicada abajo, introduzca la ruta correcta o haga clic en Examinar. PathLabel=&Ruta: FileNotInDir2=El archivo "%1" no se ha podido hallar en "%2". Por favor, inserte el disco correcto o seleccione otra carpeta. SelectDirectoryLabel=Por favor, especifique la ubicacin del siguiente disco. ; *** Installation phase messages SetupAborted=La instalacin no se ha completado.%n%nPor favor solucione el problema y ejecute nuevamente el programa de instalacin. EntryAbortRetryIgnore=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para continuar de todas formas, o en Anular para cancelar la instalacin. ; *** Installation status messages StatusCreateDirs=Creando carpetas... StatusExtractFiles=Extrayendo archivos... StatusCreateIcons=Creando accesos directos... StatusCreateIniEntries=Creando entradas INI... StatusCreateRegistryEntries=Creando entradas de registro... StatusRegisterFiles=Registrando archivos... StatusSavingUninstall=Guardando informacin para desinstalar... StatusRunProgram=Terminando la instalacin... StatusRollback=Deshaciendo cambios... ; *** Misc. errors ErrorInternal2=Error interno: %1 ErrorFunctionFailedNoCode=%1 fall ErrorFunctionFailed=%1 fall; cdigo %2 ErrorFunctionFailedWithMessage=%1 fall; cdigo %2.%n%3 ErrorExecutingProgram=Imposible ejecutar el archivo:%n%1 ; *** Registry errors ErrorRegOpenKey=Error al abrir la clave del registro:%n%1\%2 ErrorRegCreateKey=Error al crear la clave del registro:%n%1\%2 ErrorRegWriteKey=Error al escribir la clave del registro:%n%1\%2 ; *** INI errors ErrorIniEntry=Error al crear entrada INI en el archivo "%1". ; *** File copying errors FileAbortRetryIgnore=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para excluir este archivo (no recomendado), o en Anular para cancelar la instalacin. FileAbortRetryIgnore2=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para continuar de todas formas (no recomendado), o en Anular para cancelar la instalacin. SourceIsCorrupted=El archivo de origen est daado SourceDoesntExist=El archivo de origen "%1" no existe ExistingFileReadOnly=El archivo existente est marcado como slo-lectura.%n%nHaga clic en Reintentar para quitar el atributo de slo-lectura e intentarlo de nuevo, en Omitir para excluir este archivo, o en Anular para cancelar la instalacin. ErrorReadingExistingDest=Ocurri un error mientras se intentaba leer el archivo: FileExists=El archivo ya existe.%n%nDesea sobreescribirlo? ExistingFileNewer=El archivo existente es ms reciente que el que est tratando de instalar. Se recomienda que mantenga el archivo existente.%n%nDesea mantener el archivo existente? ErrorChangingAttr=Ocurri un error al intentar cambiar los atributos del archivo: ErrorCreatingTemp=Ocurri un error al intentar crear un archivo en la carpeta de destino: ErrorReadingSource=Ocurri un error al intentar leer el archivo de origen: ErrorCopying=Ocurri un error al intentar copiar el archivo: ErrorReplacingExistingFile=Ocurri un error al intentar reemplazar el archivo existente: ErrorRestartReplace=Fall reintento de reemplazar: ErrorRenamingTemp=Ocurri un error al intentar renombrar un archivo en la carpeta de destino: ErrorRegisterServer=Imposible registrar el DLL/OCX: %1 ErrorRegSvr32Failed=RegSvr32 fall con el cdigo de salida %1 ErrorRegisterTypeLib=Imposible registrar la librera de tipos: %1 ; *** Post-installation errors ErrorOpeningReadme=Ocurri un error al intentar abrir el archivo LAME. ErrorRestartingComputer=El programa de instalacin no pudo reiniciar el equipo. Por favor, hgalo manualmente. ; *** Uninstaller messages UninstallNotFound=El archivo "%1" no existe. Imposible desinstalar. UninstallOpenError=El archivo "%1" no pudo ser abierto. Imposible desinstalar UninstallUnsupportedVer=El archivo de registro para desinstalar "%1" est en un formato no reconocido por esta versin del desinstalador. Imposible desinstalar UninstallUnknownEntry=Una entrada desconocida (%1) fue encontrada en el registro de desinstalacin ConfirmUninstall=Est seguro que desea desinstalar completamente %1 y todos sus componentes? UninstallOnlyOnWin64=Este programa slo puede ser desinstalado en Windows de 64-bits. OnlyAdminCanUninstall=Este programa slo puede ser desinstalado por un usuario con privilegios administrativos. UninstallStatusLabel=Por favor, espere mientras %1 es desinstalado de su sistema. UninstalledAll=%1 fue desinstalado satisfactoriamente de su sistema. UninstalledMost=La desinstalacin de %1 ha sido completada.%n%nAlgunos elementos no pudieron eliminarse. Estos pueden ser eliminados manualmente. UninstalledAndNeedsRestart=Para completar la desinstalacin de %1, su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? UninstallDataCorrupted=El archivo "%1" est daado. No puede desinstalarse ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Eliminar Archivo Compartido? ConfirmDeleteSharedFile2=El sistema indica que el siguiente archivo compartido no es usado por ningn otro programa. Desea eliminar este archivo compartido?%n%nSi hay programas que usan este archivo y el mismo es eliminado, esos programas pueden dejar de funcionar correctamente. Si no est seguro, elija No. Dejar el archivo en su sistema no producir ningn dao. SharedFileNameLabel=Archivo: SharedFileLocationLabel=Ubicacin: WizardUninstalling=Estado de la Desinstalacin StatusUninstalling=Desinstalando %1... ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. [CustomMessages] NameAndVersion=%1 versin %2 AdditionalIcons=Iconos adicionales: CreateDesktopIcon=Crear un icono en el &escritorio CreateQuickLaunchIcon=Crear un icono de &Inicio Rpido ProgramOnTheWeb=%1 en la Web UninstallProgram=Desinstalar %1 LaunchProgram=Ejecutar %1 AssocFileExtension=&Asociar %1 con la extensin de archivo %2 AssocingFileExtension=Asociando %1 con la extensin de archivo %2... CalibrationLoading=Calibracin de la carga en inicio de sesin: CalibrationLoadingHandledByDisplayCAL=DisplayCAL Profile Loader (alta precisin y fiabilidad) CalibrationLoadingHandledByOS=Sistema operativo (baja precisin y fiabilidad)DisplayCAL-3.5.0.0/misc/low_contrast.icc0000644000076500000000000004172412025152313017631 0ustar devwheel00000000000000Cargl mntrRGB XYZ  */acspMSFT????????-argldesc8gcprtYdmddcwtpt`bkpttclrt~vcgtrXYZ gXYZ 0bXYZ DrTRC X gTRC d bTRC p DevD|4XCIED|4Xdesc low_contrasttext(c) 2009 Id. Created with dispcalGUI and Argyll CMS: dispcal colprof -v -qh -asdesc DISPLAY1XYZ omXYZ clrtRed8Green2\< FBlue[vcgt3334h556667j88999:n;;<<<=p> >???@sAABBBCvDDEEEFyGGHHHI|JJKKKLMMNNNOPPQQQRS STTTUV#VWWWXY&YZZZ[\)\]]]^_+_```ab/bcccde1effggh5hiijjk7kllmmn;noop pq=qrrs stAtuuvvwCwxxyyzGz{{||}I}~~M灁PꄄS퇇!V$Y󍍎'\*Ē^-ȕb0ʘd3Λh6Оj9ԡn<֤p ?٧tBܪvE߭zH|K峀O鶃Q빆 T)#W&Z)]ő,`ȕ/c˗23334h556667j88999:n;;<<<=p> >???@sAABBBCvDDEEEFyGGHHHI|JJKKKLMMNNNOPPQQQRS STTTUV#VWWWXY&YZZZ[\)\]]]^_+_```ab/bcccde1effggh5hiijjk7kllmmn;noop pq=qrrs stAtuuvvwCwxxyyzGz{{||}I}~~M灁PꄄS퇇!V$Y󍍎'\*Ē^-ȕb0ʘd3Λh6Оj9ԡn<֤p ?٧tBܪvE߭zH|K峀O鶃Q빆 T)#W&Z)]ő,`ȕ/c˗23334h556667j88999:n;;<<<=p> >???@sAABBBCvDDEEEFyGGHHHI|JJKKKLMMNNNOPPQQQRS STTTUV#VWWWXY&YZZZ[\)\]]]^_+_```ab/bcccde1effggh5hiijjk7kllmmn;noop pq=qrrs stAtuuvvwCwxxyyzGz{{||}I}~~M灁PꄄS퇇!V$Y󍍎'\*Ē^-ȕb0ʘd3Λh6Оj9ԡn<֤p ?٧tBܪvE߭zH|K峀O鶃Q빆 T)#W&Z)]ő,`ȕ/c˗2XYZ o9xXYZ bfXYZ $gcurvDDFHLQW_hs8Ut*T @u[] 2 }  g a  k $ FvH oVA2)&*4F`D{  !`""#]$ $%s&*&'(b)$)*+{,G--./0c1;223456q7U8;9#: :;<=>?@ABCDEFGHIKLM7NSOqPQRTU(VQW|XY[ \A]x^_a4bycef`gijskm:npqrtpuwhxzk{}z+Z3ԍxĒnɗw'؜Cq0򨻪^2ճuHʾzU4͵Ϧіӆyl`VNF?==?EMXfucurv-D\w;bAsOH^ A 3 5 E  c )]1 yZ?* +Fi/k !Y""#a$$%&D''()U**+,-^.2//012q3O4.5 56789:o;\0?'@ ABCD$E-F:GJH\IqJKLMNP!QERjSTUW X4YbZ[\^4_r`ac?deg:hikcln9oqrtuw xz {}~,P憀^MQY r)⤞^%˭zN!̸[6ŹǡɉwkaVLB91)$ )4CTh|curv{{})B]y"Ir)\8s1tG + z  r  x / M yHfG. ~~ 9]$_  !M!"#U$ $%y&6&'(})E**+,}-P.%./012j3I4)5 56789:w;e8322331j0uFѼۻꐵv[UNHB;6443445o4j2fʯ}~bZULE@:655667ހ7t7n5sEȽªiaYRKE>8888889y9w9o7n=æriaYPIB<99:99:;y;x;r:l:оѥ|ri`XPG@><;<;<<|=z=x>r=o?ц|rh_UME@?>>=>??}@{AzAs>xLВȈ|sg]SJEBB@A@@ڄAπBB}C{Ds@qѡĵϞƓ{peZQHFECBBCCтCʀE~E}EzEsA³ʽطάƟymaWNJHFEDEߋEӄF˃FŁGH}HzEWբ˸Ĭuk_TMKJGGF݊GӆH̄HƃIIJ~IwFϼɪĸseZROLJIIۊJӉJ͇JDžK„LLL}Jczl`VRNLKKڍLӊL͉MȇM…MNNNzKܸtg[VRPMM؍MҋN̉NLjOˆOPQQNǮym`YUQNݏN׍NыOˉPljPÇPQRRPlre\WTQۑPՍPόQʌRƊRÊSSTTTR諺vj_YVݑT׏RюS͌SɌSŋT‰UVVWWR뫯о׻Īzmb[XْUԐTώTˎUȌUŌUÌVVWWXUǶ¶ǴͲҰدЪÎpd_ܖY֒XӑV͏VʍVǍVČXŒXXYYZWëȩΨӦ٦ަ߱†ofߠaڛ\֗ZДX̒XȏXƎYÏZŽZ[[\\YҼĢɠΟӠןܠޥѲ͑hߨaۢ^՞[ЙY̔XȓZƐZď[Î[Ž[\]]ZӽÚƙʙΙљՙٜܡ޾wޭ_ئ]ӡ[Μ[˘[ǔ\œ]Ñ]‘]^Ð^‘_\ïÔƕɔ͕ЕӖ֛ڣ߸ᾊو׆ٴeت\Ӥ\Р\˛]ȗ^ŕ^ē^Ò_‘_Ò`^ͼ’Ƒȑ˓ΓѕԚݼعttٯ^Ԫ^Ѥ_͞_ɛ`ȗ`Ŕ`ēaēb^ÎƏȏ˒̔Ηћվ~l}׻iذaժaУb͟bɛcǘbǗdaâÍŏƏɑ˓˗ӪϹŲht}yoٶcخcӨcϤd̟dʛeȣ{ԼߺÎĎƏǓɕ̚ϲίԷз΅ei{ytoje۵e֯fөf͡f뼑消ďÐőǓȖ͠˳ֱӬ̭Ӊcdppkfa]պb۴hѩeƣżÐőŔǗșζɴ޲ͥȧøՏefigb]YTXӷy麉‘ÓēŕǘȜɶⲟɞÞۓggf]ZUQKȢּ‘’“ÔĖƘș˨Ŵʸ鵖ÖjihZPNYÚٽ’ÓÓÓĔŕŘțɝȺ˴ʽ️mjk\HӷؓӔÔÔĔŕŗǘȚȝͤ͵onnڊ˧ꓓÔĕĔĕŖŗƖƗǘȚʛ˟ȱηȓ~}r{ʡř’““ÔÔĕĖĖŖŗƗǗȘǚ}ɛ˝̢̟͹˔xvx|ˢƚÔĕĔĖĖŕŖƖƗƘƘǘǘ~șzɚyɛy˝̟Ρά˳ϻΕvuțȝŗŖŖƗƘƘƘǙșȚ~ț|țyɛwɚuʛu˜y˟ΡХ㷸ѶѽӘxѭˡȚƗǘȘșșȚ}Ț{ɛzɛwɜuʜs˝r˜r˞t̟{ΠУҪӹƟۿΦ̠ɚ|șzɚzɚyɛwʛwʛu˜u˜s˜s˝q̞q̞r͟vΡ~ϢҦŭұճЦ͡˜wɛuʜt˜t˜r˝q˝q̝q̞p̞q̟p͟tΠ{УѤҩٷҪϦ΢y͞t̝r̝q͞p͞q͞p͟p͟rΠr΢wХԪ֮ϺٻԬӬӪҩҨ~Ҩ~ө~өӫխܻDisplayCAL-3.5.0.0/misc/media/install-py.bmp0000644000076500000000000035044013230230667020314 0ustar devwheel00000000000000BM 6(  f3f3f3f3f3f3f3f3f3f3f3f3f3g3f3f3f4g3f4g3g4g4g3g4f4f4f4g3g4g4g4g4g4g4h4g4g4g4h4h5h5h5g5h4g5g5h5h5h5h5g5h5h5h5i6h5i5h5h5i5h5h6i6h6i6i6i6i6i6i6i7i7i6i6j6i7j6j6i6j7j7i7j7j7j7j7j7j7k7k7j7j7j7j7k8j8j8k7k8k8k8k8k8k8k8k8l8l8k8l8k9k9l9l9l9l9l9m9l9l9l9m9l:m:m:m:m:m:m:m:m:m:m:n:m:n:n:n;n:n;n;n;n;n;n;n;n;o;n;op=g4g3f4g4f3g3g3g3g4g4g4g4g4g4g4g4h4g4h4g4h5h5g4h5g4h4h5h5h5h5h5h5h5h5h5i5h5h6h5i6h6h6i6i6i6i6h6i6i6i6j6i6i6i6j6j6j7j7i7i7j6j6j7j7j7j7j7j7k7j7j7j7j7k8j8k8k8k8k8k8k8k8k8k8k9k8l9k8l8l9k9l8l9l9l9l9l9l:l:l9m:l:l9m:m:m:m:m:m:m:m:m:m:m:n:m;n;n;n:n;n;n;n;n;n;n;n;np=p=q>q=q>p>p=g4g4f4g4g4g4g4g4g4g5h4h4g4g5h5g4h5h5g4h5h5h5h4h5h5h5h5h5i5h5h6i5h6h5i5i5i6h6i6h6i6i6i5i6i6i6i6i7i6j7j7i6i7j7i7j7j7j7j7j7j7j8j7j7k7j8j7j7k8k8j8k8k8k8k8k8k8k8k9k8l8k9l9k8k9l8l9l9l9l9l9m:l9l9l:l9l9m9m:m:m:m:m:m:m;m:m:n;m;m:n:m:n;n;n;n:n;n;n;o;np=p>p>p=p=q=q>q>q=g3g4g4g4h4g5g4g4g4g5h4g4g4h4h5g5g4h5h5h5h5h5h5h5h5i6h5h6h5h5h5h6i5h5i6h6i6i6h6i6i6i6i6i6i7i6i7i7i6i6j6j7j6j6j7j7j7j7j7j7j7k7j7k7k8j8j7k8k8k8k8k8k8k8k8k8l8k8k8l8l8l9k8l9k9l9l9l9l9m9l9l:l:m9m:l9l9m:m9m:m:m:m;m:n:m;m;m;m:n;n;n;n;n;n;n;o;n;nq>q=q=q>q>r>g4g4g4g4g4g4g4g4h4g5g4g5h5h5h5h4g4h4h5h5g4h5h5h5h6h5h5h5i6h5h6h6h5h5i6h6i6i6i6i6i6i6i7j6i7j7j6i7j7i7j7i6i7j7j7j7j7j7j7j8j7j7j8k7k8k7k7j8k8k7k8k8k8k8k8l9l8k9l9k9l8l8l9l9l9l9l9l9l9l9l9l:m9l:m:m:l:m:m:m:m:m:m:n:n:m:m;n;n;m;n;n;n;nq=q>q>q>q>q>q>q>g4h4g4g5g4g4h4h4g4h5h4g5h4h4h5g5h5h5h5h5h5h5h5i5h5h6h5i5i5h5h6i6h6i5i6i6i6i6i6i6i6i6i6j6j6i7i7i7j6i7i7i7j7j7j7j7k7k7k7j7k7k8k8j7j8j7k8k8k8k8k8k8k8l8l8k8k8k8l8l9l9l9l9l9l9l9l9l:m:m9m9m:m:m9m:m9m:m:m:m:m:n;m;m:m:n;n;n;n;n;n;n;n;n;np=p>q>q=q>q>q>q>r>r?r>g4g5h4g4g4h5h4h4g4h5h5h5h5h5h5h5h4h5h5h5h5h5h5i5h5h5i5h5h6i6i6h6i6i6i6i6i6i6i7i6i6j6i7i6j6j7j7i6j7j7j7j7j8j8j7j7k8j8j8j8j7k7j8j7k8k8k8k8k8k8k8k9k9l8k8l8l8l8k9l9k9l9l:l9l9l9m9m:m:m:m:m9l:m:m:m:m;m:m:n;m:n;n:m;n;n;n;n;n;n;o;o;n;op=p=q>q>q>q>q>r>q>q>q>q?q>r?g5h5h4g4g4h4h4g5h4h5h4h5h5h5h5h5h6h5h5i5h6h6h5h5h5h6i6i6h6i6i6i6i6i6i6i7i6i6j6i6j7i6j6j6i7i6j6j7j7j7j7j7j7j7k7j7j7k7k8j8k8k8k8k7k8k8l8k8k9k8l8k8k9k9k9l9l9l9l9l9l9l9l9l9l9m:m9l9m:l9m:m:m:m:n:n;n:m:n;m;n:n:n:n:n;n;n;n;n;n;o;n;np=p>p=q>q>q>q>q>q>q>q?r>r?h4g4h5g5g5h5h4g5h5h5h5h5h5h5h5h5i5i5h6h5i5i5i5h6h6h6i6i6i6i5i6i6i6i6i6j6i6i6i6i6j7j7j7j7j7j7j7j7j7j7j7j7j7j7k8k8k8k7k8j8k8k8k8k8k8k8k8k9l8k9l8k8k8l9l9l8l9l9l9l9m:m:l9m9m:l:m:m:l:m:m:m:m:n:m:n:n:n;n;n;n;n;n;n;n;n;np>q=q=p=q>q>p>q>q>q>q>r?r?r>q>r?q?r?r?h5h4h4h4h5h5h5h5h5h5h5h5h5h5h5h5h6h5h6i6i5i6i5i6i6i6i6i6i6i6i7i6i6i6j7i6i7j6i7j6i6j7j7j7j7j7j7k7d4[/\/f5j8j7k7k7k7k8j8k8k8k8k8k9k9k8k8k9l8k9l9l9l8l8k9l9l9l9m9l:g7\1]1g7m:l:m:m:m:m:m:m:m:m:m:m:m:n;n;n;n;n;n;n;n;o;n;oq>q>q>q>q>q>q>r>q>r?r>r>r>r?r?r?g5h5g4h5g5h5h5g5h5h5h5h5h5i5i5i6h5h6h6h6i6i6h6i6i6i6i6i6i7i6i6i6i6i7i6j6j7j6j7j7j7i7j7j7j7j7k7h6uY\0k7j8k8k8j8k8k8k8l8k9k8l8k8l9l8k9k9k9l9l9l9l:l9l:l9l9l:l9y[hFi7m9m:m:m:m:n:m:n:m:m;n;m;n;n:n;n;n;n;o;n;oq>p=q=q>q>q>q>q>r>q>q>r>q?q?r>r?q?r?r?r?r?g5g5h5h5h4h4h4h5h5h5h5h5h5h6i6i6h5i6h6i5i6h6i6i6i6i6i7i6i6i6i6i7j7j7j7j6j7j7j7j7i7j6j7j7j7j7j7h6qWV-k8j7j8k8k8k8l8k8l8l8k9k8k8l9l8k8l9l9l8l9l9m9m9l9m9l:l:l9^1c5m:m;n;n;m:m;n;n;n;n;n;m;n;n;n;n;n;o;np=q>q>q>p=q>p=q>q>q>q>q>q?q?r?q?r?q?r?r?r?r?s@s@s?h5h5h5h5h5h5h5i5h5h5i6h5h5h6h6i5i6h5i5h5i6i5i6i6i7i6i6j6i6i7i7j6j7i7j6j6i6j7j7j7j8j7j7j7k8j8j8g6qXW-k8k8k8k9k8k8k9k9k9k8l8k9k8l8l9l9l9l9l9l9l:l:l9m9l:m9m:l:g7yY0k9m:m:m:n;m;m;n;n;n;n;n;n;o;n;o;n;n;n;oq=p=p>q=p>q>q=q>q>q>q>q>q>r?q?q?r?r?r?r?r?r?r@r?r?s@s@r@h5h5h5h5h5h5h5h6h5i6h5h5i5f5_0Y.U+~U,T,U,U,U,V,Z.`1e4i6j6i6j7j6j7e4\0Z/b3i6i6e4^1Y.W-X.^0d5i6j7g6qW|T,a2Y/W-Y/_3g6k9l9k8h7^2\1d5k8l9j8c5[0X/Z/_3g7h8a4_3g7l:m:k9\1g7n:n:n;m:m:n:n;n;n;m:f7_3[1Z0Y1Z0_3e7k:or?q?q?r?r?r?r?r?r?r@r?s@r@s@h5h5h5h5h5h5h5i6i6h5i6h6i6c3߷pV]1g5j7j7j7i6]0zd4^1yȠy_1i6h6qXpU>¼rXd5k8k8^2{h7j8_2ȠyW-øw[k9n:m;d5Ԋ]2n:n:m;m;m;n;n;m:g7Z0߸sYb6c5ùe6pk:zrYrXj:r?r?r?r?r@r@r?r@r@s@s@s?s@sAh5h5h6h5h6h6i5i6h5h6h6i6i6a2gR|T+U,U,V,V-wQ*ԃY.g5j7j7Y.x`2jꤔ|T+V-zR+fEf6qXԀ`BV.W._BgFi7[0yg6^1xR+X/W-~isXj9n:m;^2¼b4n;n;np=p>p=e7¼Ԉ^4tZlr?r@s?s?s@s@s@s@s@s@s@s@s@t@i5i6i5i5i6h6i6i5i6i6i6i6i6a3qVf5j6i6j7i7j7i6_1ye4k7Z/xf4k8j8k8j8g6a3|]Ayd4qXW-l9l9k9l9_2Ԋ^2[0yg7d4ꮠ|T-X0W.hTrYj9n;a3¼ſſe6np=p=q>m;hHuf}W0\2\2xT.Ԍa6r?o=u[{l=s?s@r@r?s?s@s@s@s@s@s@s@t@t@sAtAtAtAtAtAtAi6i6i6i6i6i6i6i7j7j7i6j6j7a2qWg5j7j7j7j7j7j7j8e5x~ig6Z/ya3wZ/c4i7k9l9l9i6rXV-k9l9l9m9a3߉]1[1yh7m:m:n;m;m;n:m;k9rXtYd5gGl9l:hGrYk:`4ԋ`4p=p=p=p=p=p=p=p=p=p>q=q>q=e7e9r>q?_5j:r?o=u[{lp=p=p>q>q>l;k[2p=m;kiIo=r?o=u[{m=r@s@s@t@tAs@t@s@t@t@t@sAtAtAtAtBtAtBuAtBuBi6i7j6i6j6i6i7i6j7j7j6i6j7b3qWg5j7k7j8j8k8j7k8c4rXi7Z/yc4jxfV-W.{S,e5i7rXy}V-X/{T-zg8[1yh7m;nI꜉yW/Y0vQ+ȇ\2yrYj:op>q>q=p=q>q>q>p>`5j:e8e8r?r?p>u[{l=s@s@s@s@s@s@t@t@tAsAtAtAtAuAtAtAtBuBtAuBuBj7j6i7i7j7i6i6j7i6i6i7j7j7b3qWg5k7j7k8k7k7k8j7_2X.k8Z0ye5_3b3j8rX격a3l:\2yh8n;a5sYZ1ԋ_3op=p=q=q=q=q>q>p=q>q>q>j9Ԋ_5\3kmu[{m=s@tAs@sAt@t@tAsAsAs@tAtAtAuAtAuAuAtBuAuBuAi6j6i6i7j6i7j6j7j7i7j7j7j7b3qWg5j8k7k8k8k8k8i6V-`2l9^2zg7i6]1Z/h8k9w[}U-y갢^2j9m:\2yg8n:k9_3z¼Țke6z]zh8p=op>q=p>p>q>q>q>q>q>q>r>q>nsAs@s@sAsAsAsAtAtAtAtAtBuAuAtBtBuBtBuBuBuBi7j7i7i6j7i7j7j7j7j7j7j7j7c3qWh6k7j8j8k8j8j8`2yf5k8g6]1[1d5j8k9j8d5]1Y0X.[0c5k8m:m9g7^2a3h7g7_2Z0Z0^2d5l9m:n;[2yh8n;np>q>q>q>l;g8h9o>q>q?q>q>e8ýj;r?s@r@p>u[{m>s@t@tAt@t@tAtAtAtAtAtBuBtAtAuBuBuBuBvBuBuBj7i6i7j6j7j7j7j7j7j7j7k7j7c3qWg6k7j8k7k8h6_2zg^2j7k8k9l9l9l8l8l9l9l9l9l:l9l:m9l:m9m:m:m:m:m:n:m;m:m;m:n:m:m;n:\2yh9n;nr>r?r?ms@s@s@p>u[{n>tAtAtAtAtAtAtAtBtAuAtBtBuBuBtBuBuBuBvCvBvCj7i6j7j7j7j7j7j7j7k7j7j7j7c3hT~U-W-W-W-W-yQ+ԄY/i6l9l8g7^2\1c4j8l:m9l9l9l:m:m9l:m9m:m:m:m:m:m:m:n:n:n;m:n;n;n;n;\2yh9n;n;o;oi:kȷ|nr?r?q?a5ýf8s@s@s@s@q>u[{m>tAtAtAtAtBuAuAtAuAtAuAuBuBuBvBuBuCuCuBvCvCj6j7j7j7j7j8j8k8j7j8j7j8k8b4Y0h7l9l9i7iFd5m:l:m9m9m9m:m9m:m:m:m:m:n;m:m:n:m:n:n:n;m:m;m;n;\2zh9n;o;oi9tZߢnn=r?r?r?s?h:ln=s@s@t@sAp?u[{n>tAuAtAtAtAtBtBuAuBuBuBuBuBuBuBuBvBvCvBvBvCj7j7j7j7j8j7j7j7j7j8k8k8k7e5߷rX`2i7l9l8l9g7ԏa3l9l9m:l9m:m:m:m:m:m:m:m:n:m;m:m;n:n;m;n;n;n;o;o<]2yi9o;o;op>q=q=p>q>l;a5k`5ltAuAtAtBtAtBuBuBuBuBuBuBuCuBuBuBuCvBvCvCvCj8k7j7j7j7j8k7j7k8j8k8k8k8i7b3Z/W-W-W-X-W-W.Y/\0b4h7l9l9l9l9l9i7iFe6l:l:m:l9m9m:m:m:m:m:n:n;n:m:n;m:m:n;n;n;n;n;n;n;a4{j:oq>p=q>p>q=q>q>q>p>mr?r@r@r@s?s@s@mp>p=p=q>p>q>q>q>q>q>q>q>r>q>r?r>q?q>r?q?r?r?r@s?r?r?s?s@r@s@r@s@s@s@t@s@s@t@tAtAsAtAtAtAtBtAtAuAuAtBtAuBtAuBuBuBvCuBvBuCuCvCvBuCvCvCvCvCvDwDj7j7j7j7k8j8k8k8k8k8k8k8k8k8l9k8k9k8k8k9l9l9k9l9l9l9l:l9l9l9m9m:l:m:l9m:l:m9m:m:m:m:n;m:m:n:n:m:n;m;n;n;n;n;nq>p>q=p=q>p=q>q>q>q>q>q>q?q?q>r>r?r?r?r?r@s?s@r?r@s@r?r@s@s@s@s@s@s@s@s@t@s@tAsAtAtAtAtAtAtAuBtAtBuAuBuBuBuBuBuBuCvCvCvCvCvCvCvCvCvCvCwDvDwCl8l8k7l7l8l8l8k8l8l8m8l9k8l8l8k8l9l9l9l8l9l9l9l9l9l9l:l9l:m9m9l9m:m:m:m:m:m:m:n:m:n:m;m;m:m;n;n;n;n:n;n;nq=q=q>q>q=q>q>q>q>q>q>q>q>q>q?q?q?r?r?r?r?s@s@r@s?r@s?r@s@r@s@s@s@s@s@s@tAt@sAs@tAt@tAtAtAtAuAtBuAuAuAtBtBuBuBuBuBuBuBuCvCuCvCuCvCvCwDvDwCvCvDwDwDl7k8l7l8l8l8l8l8m8m8l8l8m9m9m9m8m9m9m9m9l9l9m9l:m9l9l9m9l:m:l9m9l:m:m:m:m:m;n:m:n:n:n:m:n;n;n;n;n;n;n;n;np=q>q>q>q>q>q>q>q>q>q?q>q?r>q?q?r?r?r?r?s?s?r?r?r@s?r@s@s@s@s@s@s@s@sAt@t@t@tAtAtAtAtAuAtAtAtBtAuAuAuBuBvBuCvCuBvCvBuCvCvCuCvCvCwCvCvCvDwDwDwDwDwDk8l7l7l8l8l8l8l8l8l8l8l8l8l9l8m9m9m9m9m9n9m9m:m9m:m:m:l:m9m:m9m:m:m:n:m:n:m;m;m;n;n:n:m;n;n;n;n;np=q=p>q>q=q>q>q>r?q>r>q>q?r>r?r?r?q?r?r?r?r?r@r?r?r@s@s@s@s@s@s@s@t@sAs@t@sAtAsAtAtAtAtAtAtAtBuAuAuAuAuBuBuBuCuBuBuBuBvCuCvCvCvCvCvCvCvCvDvCvCwDwCwDwDwDl8k8l8l8l8l8l8m8m9l8m8l8l9l9m9m9m9m9m9m9m9n:m9m:m9n9m:n:n:n:n:m:m:m:m;m:m:m:n;m;m;n;n;n;n;n;n;oq=q=q>q=q=p>p>p>q>q>q>q>q?q>r>q?r?q?q>q?r?r?r?r?r?s@r?r@s@s@s@s@s@s@sAs@sAt@t@tAtAtAtAtAtAtAtBuAuAuBtBuAtBuBtBuBuBvBuBvBvBvCvBvCvBvCvCvCvCvCvCwDvDwDwDvDwDwDxDwEm7n7l8l8l8l8l9l8m8m9m9l9m8m9m9m9m9m9n:m9n:n9n:m9n9n:n:n:n:n:n:n:n:o:n;n;n:m:n;n;n:n;n;n;n;np=p=p=p=p=q>q=q>p>q>q=q>q>q>r>q?q>q>r?q>r>q?r?r?r@r?r?r@r@r@s?r@s@s@s@s@sAtAt@sAs@tAtAtAtAtAtAtBtAtBtBtBtBuBtBuBuBuBuCvBvBuCuCvCvCvCuCvCvCvCvDvDvDvDvDwDwDwDwDwDwDwDwExEm7m7m7m7n8n8m8m7n8n8l9m9m9m9m9m9m9n9n:m:m:m:n:n:n:n:n:n:n:n:n:n:o;n:n;o:n;n;o:n:n;n;n;n;o;o;n;o;nq>q>q>q>q>q>q?q>q?r?q?r?r?r?r?r?s?s?r@s@s?s@s@s@s@s@s@s@s@tAtAsAsAsAtAsAuAtAtAtBtAuAtAtAuBuBuBuBuBuBuCuBuBvBvCuBvCvCvCvDvCwCwDwDwDvCwCwCwDwDwExDxDxExDxEm7m7n7n7m7n8n8m8n7n8n8n8n9n8n8n8m9n9m:m9n9m:m:n:n:n:n:n:o;n;n:n;o:o;o;n:o:o;o;o;oq=p=p=p>q>q>p>q>q>q>q>r?r>q>r>q?r?r?q?r?r?r?r?r@r?s?s?r@s@s?r@s@s@t@s@t@t@s@sAsAtAsAtAtAtAuAuBtBtBtBuAuBuBuBuBvBvBvBuBvCvCvBvCvCvCvCvCvCvCwDwCwDwDvDwDwDwDxEwDxDxDxExExEwEm7n7n8n7n8n8m8n8n8n8n9n8n8n8o8n8o9n9n9n9o8n9n:n:n:n;o:n;n:o:o;o:o:o:n;o;o;o;o;o;o;op=q>q>q>q=q>q>q>q>q>q>q?r?r>r>r?r?q?r?r?r?r?r?r?s@s@r?s@s@s@s@s@s@s@s@s@s@sAtAt@tAtAtAtBtAuAtAtAtBuAuBuBuBuBuBuBuCvBvBvCvBvCuCvCvCvCvCvCvDvDvDvCvDwDwDwDwDxDxDwEwExExExEwExExEn8n8o7n7n8o8n8n8n8n8n9o8n9n8o8o8o8n9o9o9o9o9o9p9o9n:o;n;n:n;n;o:o;o;o;o;pq>q>q>q>q>q>r?q>q>q>r>q?r>r?r?r?s?r?r?s?r@s?r?s@s@s@s@t@sAs@s@tAtAtAsAtAtAtAtAtBuAtBuBtBtBuBuBuBuBuBuBuBuBvBuCvCvCvCvCvDvCvCwDwCvDwCvDwDwDwDwDwDxDxDxEwDwDxExExExEyFxEo8o8o8o8o7o8o8o9o9o8p9p9o8o8o9o8o9o9o9o9o9o:o:o:o9p:p9o:p:o:o;o;o;o;o;p;oq=q>p>p>q>q>q>q>q>q>q>r?q>r>q?r>r?r?r?r?r?r?r?s?r?r@s?s@s?s@s@s@s@tAt@s@s@t@tAt@t@tAtAtAtAtAtAtAuBuBuBtBuBuBuBuBuBvBuBvCuBvCuCvCvCvCvCvCwDwCwCvDwCwDwDwDwDwEwDxDxExDxExDxExExExEyEyFxEp8p8o8o8o8p9o8o8o8p8p9o8p9p9p9p9p9o9o9o9o9p:p9o9o9o9p:p:o:p:p:p:o;p;o;oq=p=p=q=q=q>q>q>q>q>q>q>q>r?q?r?q>r?r?r?s?r?r?r?r@s?s@s@r@s@s@s@s@s@s@t@sAtAs@tAsAtAtAtBtBtAuBtAtAuAuBuBuBuBuBuBuBuBuBuBvCvCvCvCvCvCwCvDwCvCvCvCvDwDwDwDwDwDwDwEwDwEwDwExExExExExFxEyEyFxFq8q8q8p8p8p8p8q8p9p8p9o8p9p9p9p9p9q9q9q:q:o:p:p:p9o9p:o:p:p:p;p:p:q:q;op>p>q>p=q>q>q>q?r>q?q>q?r>r>r?r?r?r@r?s?s?s@r?s?s@s@s@s@s@s@tAtAsAtAsAtAtAtAtAtAtAuAtAtAuAtBuAuBuBuBuBuBvBvCvBvCuCuBvCvCvCvCvCwCwDvDwCwCvDwDwDwDwDwEwDxEwEwExExExEwExExExEyFxEyFyFyEyFr8q8q8r8r9q9q8r9q8q8q9q9q9p9p9p:p9q:p9p9q:q:q:p:p:p:p:p:p;q:q:p;p;q:q;p;p;q;pq=p>p=p>p>q=q=q>q>q>q>q?q>r>q>q>q?r>r>r>r?r?r?r?r@r@r@s?r@s@s@s?s@s@sAs@t@s@t@tAtAtAtAtAtAtAuBtBtAtBuAuBuAuAuAuBuBuCvCvBvBuCvCvCvCvCvCvCvCvDwCvCvCwDwDwDwDwDxEwEwDwDwDwExEwDxExExEyExExEyEyFxFyFyFyFr7r7r7q8q7r7r8r8r9r9r9r9r9r9q9r9r:p9p9p9q:q:q:q:q:q:q:p;p;q;p:q:q;q;q;q;q;q;q;q;qq=r>r=r>q>q>q>q>q>q>q>q>q>r?r?r>r>r?r?r?r@r?r@s?r?r@r?s?s@s@s@s@s@sAt@s@tAt@t@sAt@tAtAtAtAtBtAtAtBuAuBtBuBuBuBuBuCvBuCuCvCvBvCvCvCvCvCvCvDwCwDvDvCvDvDwDwDwDwDwExExDxEwExDxExExExEyExExEyFyFyFyFyFyFyFr8r8r8s7s8r8r8s8r8r8r8s9r9s:r:s:r:q9r:r9q:q:q:q:q:q:q:q;r;r:p;q;q;p;q;q;r;q;r;q;qq=q=r>r=r>q=r>q>q>q>r>q>q?r?q>r>r?r?r?r@r?r?s?r@r@s?s?s@r@s?s@s@s@s@tAs@tAsAtAtAsAtAtAuAtAuBtAtAtBuBuAuBuBuBuBuCuCuBuCvBvBvCvCvCvDvDvDvCvDwCwDwDwDwDwDxDwExDwDxDxExDxDxExExExExExEyFxFyEyFyFxEyFyFyFyFzGs8t8t8s7s8s8s8s8s8s8s8s8r9s9s8s:s:s:s:s:s:r:r;r:r;q:r:r;q;r:r;r;r;q;q;qq=q>q>r=q>r>r>r>r>r>r>s>q>q?q?r?r?r?r?r?r?r?r@s?s?s?r?s@s@s@s@s@s@s@s@sAsAtAtAt@t@tAtAtAtAtAtAtBtBtBuBuBuAuBuCuBvBuCuBuCuCvBuCvCvCvCvDvCwDvDwDwDvDvDvDwDwDwDwExDxDxDxExExExExExExExExFxExFxFyFyFyFyFyFyFyFzGyGt8t8t7t8t8t8u8t8s8s9t8t8s9t8t8s9s9s9s9s:s:t:t:t;s;r;q;r;r;r;q;r;r;sr=r>r=r=r>r>r>r?r>r>r?s>s>r>r?r?r?r?r?r?r@r?r?r@s@s@s?s@s@s@s@t@tAsAsAsAtAtAt@sAtAtAtAtBuAtAtAuAuAuBuBuBvBuBuBuBuBvCuBvCuCvCvCvCvCvCwCvCwCwCwDwDwDwDwDxDxDwDxEwExExExExExEyExFxExEyExFyFyFyFyFyFyFzGyGyGyGzFzFu7v7u8u8u8u8t8t8t9t9u8t8t8s9t9t9t9t9t9s9s9s:s;s;t;s;s;s;s:r;r;rr=r=r=r=r>r>r?s>s>r?s>r>s?s?s?r?r?r?r?r?r?r?r@s@r?s@s@s@s@s@s@sAs@s@sAsAtAtAtAtAuAtBtAuAtAtAuBuBuBuBuBuBuBvBvBvBvCuBvCvCvCvCvCwCwCwDwDvDwDwDwDwDwDwDwExDwEwDwDxExExExExEyExFxExExEyFyEyFyFyFyFyFyGzGzFzFzFzFzGv7v7v7v7v7v7w8v8u8v8u9u9u8u9u9u:t:t9t:u9t9t:s9t:t:t;t;t;t;sr>r?r>r?r?r>s>s?s>s?s?s?s?s?r?s?r@r?r@r?r@r?s@s@sAsAs@sAs@s@tAt@t@tAtAtAtAuAuBtBtAuBuBuBuBuBuBuBvBuCuBuCuBvBvCvCvCvDvCvDvCwDwDwDwDwDwDwDwDwDwDwDxExExExExExExExFxExExExFxEyFyFyFyFyGyFyFyFzGyGzFyFzGzGzHzGw7w7w7w8w7w8w7v8w8v8w7v8v8u9u:u9u9v9u:u:u9u:u:t:u9t:t:t;t;t;t;ts=r>r>s>s>s?s?r?s?s?s?s?s@t?t@r?s@s@s@s@s@s@s@s@sAs@t@tAtAtAtAs@tAtAtAuAtBtBtAtBtBuBuBuBuBuBuBuCuBvBvBvBvCvCvCvCvDwCvCwCwDvDvDvCwDwDwDwDwExDxDwEwExExExExExEyEyEyFyFyFxEyEyFyFyFyFzGyFzFzGzFzFzGzGzGzGzG{Gy7y7x7x7w7w8x8x8x8w8w8w8w8w8w9w8w9v:u:v:v:v:u:u:u:u:u:u;t;u;t;t;t;t;ts>s>r?s>r>s?r?s?t?s?t@t@s@s@s@t@s@s@s@s@t@s@sAt@tAtAtAsAtAtAtAtAtBtAuBtAuAuAtBtBuBuCuBuCuCuCvBvCuCuCvCvCvCvCwCvCwDwDwDwDvDwDwDwEwDxDwExEwEwExExExExExExFxExExFyFyEyFyFyFyGyFyFyFyFzFyFyGzGzFzGzGzGzHzG{Hy6x6x7y6y7y6y8x8x8x9x8x8x9w9w8w9w9w9w8w9v:v:v:w:w;u;u;u;v:v;u:t;t;t;t;ts=t>s>t>t>r>s>s>s>s?s?t?t@t?t@t@t@t@t@s@sAs@tAsAsAtAtAtAtAtAtAtAtBuBtBtAtBuBuBuBuBuCuBvBuBuCuCvBvBvCvCvCvCvCvCvCvDvDwDwDwDwDwDwDwDwEwDxExExExExExExFxEyFxFyExFyExFyFyFyFyGyFyFzGzGyGzFzFzFzGzGzGzGzGzH{H{H{G{7z7{7z7y7z7y7y7y7z7y8x9x9y9x8y9x9w9w9w9w9x9v;v:w:v;v;v;v;v;v;v;u;u;v;v;vs>s=t=s=t>s>t>t?s>s>t>s>s?t?s@t@t@t@t@t@t@u@sAt@sAsAtAtAtAtAtAtAtAtAtBuBuBtBuAuBuBuBuBuBuCvBvCvCvCvBvCvCvCwDvCvCvDwCwDvDwDwCwDwDwDxDwEwExDxExExExExExExEyExFxFyFyFyFxFyFyFyFyFyFyGzGzGzGzGyGzGzG{G{GzGzG{H{G{G{H|7{7|7z7{7{7{7{7z7{8z7z7z8y9x9y9y9y9y9x9w9x9x:x:w:w:v:w:w;v;v;v;w;vu=u>u>s=s>t>t>t>t>t>t?u>t>s?s?t>t@s?t@t@t@tAu@t@t@t@tAtAt@tAtAtAtAuBtBtBuBuBtBuBuBuBuBuBuCuBuCvCvCvCvCvCvCvCwCvCvCwCvDvCwDwDwDwDwDxEwDwDxEwExExExEyExEyEyFyExExEyExFyFyEyFyGyGyFzGyGzFzGzGzGzGzGzGzH{GzGzH{G{H{G{H{H}6}6}6|7|7|7}7{7{7{8{7{8{7z7z8z8z9y9z9z9z:y9y:x:x:x:x:w:x:x:wu=t=u>t>t>t>u>u?t>u>u>u?s>t>t?t?t@u?t@t?u?u?u@t@u@sAtAtAtAtAtAtAtBtBtAuBuBuBuBuCuBuBvCvCuCvCvCvCvCvCvCvCvCvCwDvDvDwDwDwDwDwDwDwDwEwDxEwExExExExExFxEyEyEyFyFyFyFyFyFyFyFzGyGyFzGzFzGzGzGzGzGzHzG{GzG{H{H{H{H{I{H{H~6~6}7}6}6~7}7}7}7|7}8|7|8|8|8{9{9z8z8z9z9z9z9z9y:x:x:x:y:w;x;w:x;w;vu>u>t>t>t>u>t>u?u?u?u?t?t?t?t@t?t?t@t@u@u@u@u@tBtAtAtBuBtAuBuBuBuBuBvCuBuBuBvCuCvBvCvCvCvCvCwCwCvDvCwDwDwDwDwDwDwExEwDxDxDxExExExExExExExFxFyFxFyFyExFyFyFyGyFyFzFzFzGzGzFzGzG{GzHzHzHzG{H{H{H{H{H{H{H|I{H{I77~6~7~7~7~7~7~7~7|7}7}7}7}9|8|9|9|8{8z9{9z9z9z:z:y:x:y:y:y:x;x;x;x;wu>t>u>t>u?u?u?u?u?v@t?t@t@t?t?t@t@t@t@t@t@u@t@tAuAtAuAu@uAuAuAvBuBuCuCvCvBvCvCuCvCvCvCvDwCwDwCwCvDwDwDwDwDwDwEwDxExDwExEwExExExFxEyFxEyFyExFxEyFyFyFyGzFzFyGzFzFzGzGzGzG{G{GzGzH{H{H{H{H{H{H{I|H|H|H|H|H5566567~777~7~7~8}7}7~8~8|9|9|9|8{9{9{9|9{:{9z9z:y;y;y;y;x;y;x;xu=u=v>u=v=v>v>t>u>u>u>u>u?v?u?t@u@t@u@t@t@t@t@tAt@t@uAu@uAu@uAuAuAuAuBuBuBuBvBvBvBvBvBvBvCwCwCwDvCvDvCwDwDwDwDwDxDxDxExDxEwExExExExExFxFyExExExFxFyFyFzFyGyGzFzGyFzGzGzGzGzG{GzHzGzGzH{G{H{H{H|H{I{H{H{I|H{I{I|I6656666667777~77~8}7}8~7}8|9|9|9}9{9{:{9{:{:{:y:z;z;z;yw=w>w>w=u>u>v>v>v>v>u>u>u>v>u>u@v@v@t@u@u@uAu@tAt@tAtAuAuAuAuAuAuAuAuAvAvBvAvBvBvBvBvBwBvCvCvCvBwBvCvBwCwDwDxDwDwDxDwEwExExExExExExExFxExFxFyFyFyEyFzFyFzGzGyFyGzGyGzGzGzGzGzHzG{H{GzH{H{H{H{H{H{H|H|H{H|I{I{I|I|I|I4456666676777777888~8~8~8}8}8}9}9|:|:|9{:{;|:z:z;z;z;z;y;y;yw>w>w>w>w?v>v>u>u?v?v?u?v?v?v?u@u@uAuAt@t@uAuAuAuAuAuAuAuAuAvBvBvBvBvBvBvBvBvBvBwBwCvCwCwCwCwCwCwDxCxCwDxCxDwExExExExFxExEyEyExFyFyFyFyFyFyFyFyFyFyGzGzFzGzGzHzGzG{GzH{G{G{G{G{H{H|H{H{H{H|I{H{I|I|I|I|I|I|I555555566676767777778899~9~9~9}9|9|9|:|;{:|:{;z;{;z;yw>w>w>v?v?u?v?v?v?v?v?w@v?u@u@v?v?u@uAu@uAuAuAuAuBuBuAvAvBvBvBvBvBvBvCvCwCwBwCvCwCwDwCwCxCwCwCwDxCwDxDxDxDxDxEyEyEyFxExFyFyFyFyFyFyGzFzGyFzGyGyGzG{GzGzGzG{H{H{H{H{H{H{H{H{H{I{H{I|I{H|I|I|I|J|I|I}I|J45565566556667777788888999~9~9~9}9}:}:{:|;|;|;{;{;{x=w>w=w>w?w?w?v?v?v?v@w@v?v?v@v@v@v@u@u@u@v@v@uAvAvAuBuBuBvBvBvBvCvBvBwBwBwCvCwCwCwCxDwDwDwCxDxDxDxDyDxDxDxDxDxEyDyDyFyFyFyFyFyFzGyGzGzGzGzGzGzGzGzGzGzGzG{H{H{H{H{H{H{I{H|I|H|I|I|I|I|I|I}I|J|J|J}I}I4444546656666666777888888999~:~9~:~:~:}:|:|:|:{;{;{;zx>x>x>x>v>w>w>w>w>w>v@w?v@w@v?w@v@v?v@v@v@u@vAu@vAvAuAv@vAuBuBuBuBuCvBuCvCvCvCvCvCvCwCwDwCxCxDxDxCxDxDxDxEyEyDxExEyExEyDyEyEyEyFzGzFyFyFzGzGzGzG{GzG{GzGzH{HzH{H{G{H{H{H{H|H{I|I{I|H|I|I}I|J|I|I|I|J}I}I}J454555455555677676777888888999::~:~:~:~:|:|:|:|;|<|;{x>x=x>x>x>w>x?w>w?w?x>v?w?v?w?w?v?v?wAvAw@wAuAv@vAvAvAvAvAwBvAvBuAuAvCuBuCvCvCwCwCvCwCwCwDvDwDxDxDxDyDxEyDxDyDyEyEyEyDyEyEyEzEyEzEzEyGzGzGzGzHzGzH{HzH{H{H{HzH{H{H{H{H{I|I|I{H|I|I|I|I|J|I|J|J|J}J}J}J}J}J3434544555556656777777788988999:::~:~;~;|;};|;|:|;|;{<{<{<{=z=zx>x>x>w?w>w>x>w>x?w?w?w?w?x?w?v?wAvAw@wAuAvAvAvAvBvBvBuAuBvBvBvBvBvBwCvBvBvDvDwDwDwCvDwDwDxDwDwDxDyDyDyExEyEyEyEzEzFyEyEzFzFyFzFzFzGzGzG{HzGzH{H{H{H{H{H{H|H{H|H{I{H{H|I|H|I}I}J}I|J|J|I|J}J}J}J}J~J3444444445556656666677887788999::9~::~:~:};};};};};|;|;|;zy=x=x=y=y>y=x=x>w>x?x?w?w?w?w@w?w@w?w@v?w@x@vAwAvAvAvAvBvAuAvBvBvBvBvBvBvCwCvCwCvCwCwDwDxExEwEwDwExDxExExEzEyFyFyFzFyFyEyEyFzFzFzFzG{F{F{FzGzG{G{H{H{H|H{H{H{I|H{I|I|I|I|I|I|I}I}J}I}I}I}J}J}J}J}J}K}K2333343545445556666676678888888999::::::~<}<};|<{<}<|<|<|<{z=x>x>y=y>y>x>x>x?y?x>w@w@x?x?x@v@w@w@w@w@w@wAwAw@w@wAwAwAvBwCvBvCvBvBwBvBwCwCwCwCwCwDwDwCxEwDxExExExExExEyEyFzFzFzFzFzFzFzFzGzGzG{F{FzGzGzG{H|H{H{I{H|H{I|I|H|I|I|I|I}I|J}I}I|I|J}I}J}J}J}J~J~J}J~K2333333344445555556777767778788889999:::~;~;~:~;|<}<}<|<|<|<|=z<{={<{x>x>y?y>y>y?x?x>x?x?w?w?w@w@w@wAv@wAvAwAwAwAwAxBwAvBwCwCvCwCwCwCwCxCwDwDwDxCxDxDxDxDxDxEyExExExEyEyEyFyFzFzFzF{FzGzG{F{F{G{F{G{G{G{G|H{H{I{H|H|I|I}I|I|I|I|I|J}J|I}J}J}J}J}J}J~J~K}J~K~K22222333444444445656656777787878889999:9:~:~;~;~;~;};};};|;{={<{={<{=z=z=y=y>y>y=z>y>y?x>w?x?x?x?x?x?w?x@x?v?v@w@wAwAwAwAwAwAwAvBwAvBwBwBwBwDwDwDxCwCxCwDwDxDxDxDxEyDyDxEyDyExExEyEzEyGzFzGzG{F{FzG{G{F{G{G{H{H{G|H{G{H|I|I|I|I}J|I|I}J}J}J|I}J}J}J}K}J}K}J~K~K}K~J~K~K1122322333333444555566766668888888989999::::~;~;~<~;}<};};|;|<|<{<{<{={>z>y>z>y>y=y>y>y>x>x>x?x@x?x@w?w?x@w@w@w@xAwAwBxBxBxBwBvBwBwBwCwBwBwBxCxCxDwDwDxDxDxDxDyDyDxDxExEyEyEyEyEyFyEzFzEzFzFzG{G{G{G{G|H|H{H{G|G|H|H|H}H|I|J|I|J|J}J}J}J}J}J}J}J}J}J}J~J}K}K~K~K~LK11111212233333444455555666776788889889::9:::::;;}:|;};}<|<|<|={={<{<{={=y=z>z>z>y>y?y?x?y>y>y?x?y?x@x@x@w@w@x@vAvAvAvAvAxAxBwBwBwBwCxBxCxCxCxCxCxCxCxEyDxDxEyEyDyEyEyEyEzEyFyEyFzFzEzFzFzGzGzH|G{G{H{H|G|H|H|H|H|H|I|H|H}J|J}J}I}I}J}J}J}J~J~K~K~K~K~K~K~K~L~K~K01111212223223434444555566656788778899899999;;;~;;~;};};};|;};|<{<{<{={={=z=z>y=y=y>y>y>y?y?x?x?x?x@x?y@wAw@xAxAwAv@wAwAwAwAxAxAxAwBxBxCxCxCxCxCxCxDxCyCxCyEyEyEyEzEzEzEyFzEzFzFzEzFzFzFzF{FzH{H{G{H|H{H|H|H|H|H}I|I|I}I}I}H}J}J}K~J}J}K}J}K~J~K~K~K~K~LL~L~L~L01111111112322333345545555666676778888899999:::::;~;};~;}<}<|<|<|;|z=z=y>z=y=y>x>x>y>x?x@y@x?x@x@x@wAwAwAwBwBwBxAxBxAxBxAxBxBxCyCxCyCxDyDyCyDyDyDyDzFzEyEyEzEzFyFzFzFzFzFzG{F{G{G{G{H{H{H|H}H}H|H|H}H}I}H}I}I}I}I}K}K~J}K~J~K~K~K~L~L~K~K~L~K~LKL000101112122222233444444555556677767888889999::::;:~;};~;};}<}<|<{<{<{<{<{<{=zx>y>y>y?y>y>y>x>x?x?x?y?x@x@x@xAx@w@wAwAxBxBxBxBxBxBxBxBxByByDxDyDyDyDyDyDzDyDyEyFyFzFzFzFzFzGzG{F{F{GzF{F{GzG{G{I{I{I}H|I}H}I}I}I}I}I~I~I~J}I~K~J~K~K~K~K~K~KK~LLKKLL//0101011111132333333344444556556677778888999999:::;:;~;~;};}<|;|<|<|<{=z<{<{=z=y=y>y=y>y>y>y>x?y?x?x?x?x?y@y?wAxAx@xAxAxAwBwBwBxBwCyBxCxCyCyCyCzDyDyDyEzDzEzEzEzDzEzFzF{GzGzF{F{G{G{G{G{H{G{G{H|G|H|I}H|I}I}I}J}I}I~I~I}J}J}J~K~K~KLK~K~LKKLKLLL//0/0/0/1111111223333334445545666677677788888899999:9:;~;~;}<~;|;{<{;{<{<{={={=z>z>z=z>y>z>x>y?y?y?y?x?x?y@y@w@x@xAxAxAxAxAwAxBxBwBwCxCxCyCyCyDzDzDyCzEyEzEzEzEzE{EzE{EzFzFzG{G{G{G{G|G{G|H{G{H{H|H|H|I|I}I}I~I}I~I}I~I~J~J~J~JJ~K~K~KKLLLLLLLL...////000100022122222333444446556666667778888989999::;:~;}:~;};|<|<|<|<{<{<{<{y>y>x>y>y>z?x>x?x?y@x@x@x@x@x@xAyBwBwAxBxBxAxBxByCxDxCyCyDyDzDzDzDzEzEzE{E{F{F{F{F{F{F{G|G{H{G{H|G|G{G|H|H|H|H}J}J}J~J~I}I~J~J~J~J~K~JJ~KK~L~KLLLLLLLM....////////0011111223323334445455656566777877888999::99~:;~;};~;};|;};|<{<{=z={<{=z=z=z=y=x>x>y>y>y?x?y?x?x@x@x@x@yAyAyAyAxBxByCxBxByBxByBxCxCyDyCyDyDzDzEzD{F{F{FzE{F{F{F{F{G{F{H|H|H|G{H{H|H|H}H|H|H}H|I}J~J}J~J~J~K~J~JK~K~KKLLLLLLLLML..-...//.0000000111112123333343455555666666677888888999:::~:~:}:};};};};{<|;{<{<{<{z>y>y>z?z?y>y?y?x@x@x?x@x?x?yAyAyAxAxByAxBxByBxCyCxCyCyCyCyDzEzDzDzDzD{E{F{F{F|F{F{G{F|F|F|G{G|H|H|H|H}H|H}I}H|I}I}I}J}J~KK~JJ~JKKKKKKLLLMMMMM---....//.//0000010102122222344344455665566767788889999899~::~:~:~;};};};|:{;{<{y>y>y>y>y>z>x@x@y?x@x@x@x@x@zAxBxBxAyAyByCyCyCyCyCzDzDzDyEzEyEzEzEzF|E{F{G{F|G|F|F|G|G|G|H}I}I}H}H}I}I}H}I}I}I}J}J~KJ~JKKKKKKLKLMLMLMMM,--.----..////0/0/000111112233233344455555666666777878989:9:9~:}:~:};};|;|<{;|;|<{y>z?x>y?y?x@x@x@x@x@y@xAxByAyByByByByCyCyDzCzCzCzDzDzDzEzEzEzF|F|E|G{G|G|G|G|G|G|H|H}I}H}I}I}I}I}I}I~I~I}J}J~K~K~JKKKKKKLKLMMMNNN,,,,--..-..//////0//0100112222122333335455555567667778888899:~:~:~:}:}:}:}:{;{;{<{<{<{<{<{<{=y>z=z>z=y>y>y?y?y?x?y?y@x@yAyAyAyAyByByByByCyByBzBzDzDzDzDzDzD{EzF{F{F{F|F|F|G|G|G}G}H|G}H}G}H}I}I}I}I}I~I}I}J~J}J~I~K~KKLKKKLKLLLMNMNM++,,,----....-./////0/00101111222223444454556666666687778888999~:~:}9};~;|;{;{;{;|z>z>y>y>y>y>z>x?y?x?y@x?x@yAyAyByAyAyCyCyCzBzCzCzC{D{E{D{EzDzE{D{F{F{F{F|F|F|G}H|G}G}H}H}H}H}I}I~J~I}J}I~J~I~J~J~J~K~LLLKLLLLLLLNMNM+,++,,,,,----..../../0/00011111122223333444554555666667778888989~9:~9}:}:}:|;|;|y?y>y?y>y?x@y@y@y@z@yAyByByByAyByAzCzDzDzCzDzCzD{E{E{E{E{E{F|F{G{F|F}G}G}H}H}H}H}H~H}I~I~I~J~J}I~J~J~JKKJKKLLLLLMLMLLNMN+*+++++,+,,-----../..////000001122222233344444555555667777877999~899~9}:}:|;|;|:|:{;z<{x=y>y?y?y?y?y@y@x@x@y@yAyByByByByBzCzC{C{D{DzD{D{E{E{E{F{F{F{G{G{G|G}G}H}H}I}I}H}I~H~H~J~J~J~JJ~JK~J~JKJLMLMLMMLLMMNN****+++,++,,,----...././/////01111121222332344544555565767788878899~:}9}9}:};{;|;{;{;{;{y=x>y>y?y>y?y@z?z@x@yAyAyAyAyAzBzByCyBzBzCzC{D{D{E|D|D{E{E|E|F|F|F|G|G|G|G}G}H}H~I~I}I~I~I~JJ~K~J~K~JJJKKKLLMMMMMMMMMN******++++++++,,,,---...////0/0000111222233333344545555666777778988~89}9~9|:}:|9|:{<{;{;|;{;yy>z>y>z>z?z?y@y@y@y@zAyAzByBzBzCzCzCzC{C{D{E{D|D{E{E|E|F|F|F|F|G|G|G}G}H~H~H~I~I~I~J~I~I~JKKJKKLKKLLMMMMMMMMMM))))***+**,++,,,,+,,----././//00/000011112223333344446566566677777888~9}9}9}9|:}:{;{;{:{;{;{z>z>z>z>y?y?z?z?z?z?z@z@yAyAyBzAzBzB{B{C{CzCzC|D{C{D|E|D|E}F|G}F|G}G|G|H}G}H}H}H~H~H~J~JJJ~JJKKLKKKKLLMMMMMMNMNM()())***+*++*++*,+---,-.-...../.0/0/0112122123333344444455666676678888~8~8}9}9}:|9{:{;{;{;{;z;zz>z>y>y>y>y?y?z?y?zAyAz@z@zAzBzBzB{CzB{CzC{C{D|D|E|E|E}F}F}F|F}G}F}G}H}I}H}H~H~I~IJJJJJJJKLKLLLKLMMMNMMMNN'')(()))))****++,++,,,,,---.-...//.//000010212223334333544666566776778~8}8~9~9}9|9|:|:|;|;{;|<{;zz>z>y>z@y?y@y@zAzAzAzAzAzBzB{B{B{C{D{D{D{E|D}E}F|E}E}G}G}G}G}G}G}H}I~I}IIHJJJJJKKLLKLLLLMMMNNNNNN'(((()()()))***++++,,,,,,---..-././/////11001112222233444445566656787778}9}9}9|9|9|:|:|:};{:{;z<{<{z=y=z>y>y>y>y?y@y@y@y@zAzAzAzBzB{C{C{D{C|C{E{E|D|E|E|F}F}F}F}G}H}H}G}G}I~H~I~I~IIKJJKKKKLLMLMLLMNNNNNNO#%%('(')))())))****+++,,,,,---.......//00000101211223333345355555667767~8~8~7~8~9|9|9|:|:|9{:|;{;{;|;zz>z>z>z?y?{?y@yA{AzAzA{B{A{B{B|C{D{C|C{C{E|E|E|E}G}F}F}F}G~G}H}H~H~H~I~I~I~JJIKKJJKKMLMLMMMMNNONOO###$%'(((')()()))****++,+,,,-,---..../////0//01111222322344444454656567€67~7~7}8|8}8}8{9|9|:{:{:{;{;z;z;zz?z>z?y@y@{@z@z@zA{A{A{B|B|B|C{C|D|D|C|E|E|E}E}E}F}F~G}G~G~H~HHH~IJIJJJKKKKKLMMMMMMMMNOONN##$$##%&''(((())))*)**+**++,+,--,,.--...///0/000001112123332334ƒ45ƒ555€55À67À7~8~7}8}8}7}9}9|9|9{9{:{:|;|;{<{z=z>z?y?z@z@{@{@zA{A{B{A{B|B|C|C|D|D|D|D|F}E|E}F}G~G~G~G~I~HHH~IJI~JJJJKKKKLLMMMMMMNNOONO#$####$#$&'((((()))))*****++,,,-+-,-,---//././0000011001222233†3…4…4„3Ã4Á5ā5Â5ā5ā566~7~6}7}7}8}8|8|9|9{:{:{:|;{;z;zz?z?z?{?{@{@{@z@{B{B{A{B|C|C|C|D}D}D|E|E}F}F}F~G}GHH~H~IIIIJJJJJJLLKLLLNMMMMNMNOOO$$$$#$#$#$&''((()((*))****+++,+,,-,,,--..-..//////01111121123†2Æ3Å3Å3Å4ă4Ń5Ń5ł5Ɓ5ŀ55ƀ666~7}7}8}8}8}8}8|9|:{9|:|:z;{;{<{;{z>z>z?z?{@z?{A{A{A{A{B|B|B|C|C}C|C}D}E}E}E}F}F}F~F}HG~GIHIIIJJJKKKLLLLLMMNNNNNNNOO#$##$#$#$&'()('(')()())))***+*++,,,,,,,,--....././0000011‹1‹2Š1Ĉ2Ĉ2ć2Ć3ņ3Ą3Ņ3Ń3Ƅ3ƃ4ǁ4ǁ5ǀ5Ȁ5~5666}8}7|8{7{8|8|9|9|9{9|:{;{;zz>{>{?{?{?{@{A{A|A{B|B|C}C}D}C|D}E}E~E}E}G~F~F~F~HHHHIIIIIKJJKKLLLLLMNNNNNNNNO$$$$$%$%&'(*+,*('(((()(()))****++++,,,,-,----...////‘/Ð//Ž0Ì0Č0‹0Ë1ĉ1Ĉ1ň2Ƈ2ņ2ƅ2ƅ2ǃ3ǃ3ȃ4ȃ4ȁ4ȁ4ɀ5Ȁ55~6~66~7~7}7|8|8|8{9|9|9|9|:z:{;{;{;zz>{?{?{?{@{@{A|A{A|A{B}C|C|C}D}D}E~E~F~F}E~G~G~G~HHHHIJIJJKKLLKMLLMMMNNNNOONN$%$$%$%&'(*+,./.((''((')((()))*****+++,,,,,---.....“.Ó/Ò/Ð/Ï0č0Č0Ō/Ƌ0NJ0lj0Lj1LJ2LJ1dž1ȅ1ȅ3Ƀ3Ʉ3Ƀ3Ɂ3ʁ4ˀ4ʀ44555}6}6}7}7}8}7}8|8|8|9|:|9{:{:{;{<{{={>{>{?{?{?{@|@|@|A|B|B|B|C}C}C~E}D~D~E~F~F~F~G~GHHIIIIJJJKKKKKKMLMMMMNNONOON%$%$$%&((*+,//013-'''''((()(())*)****+++,+,,,--™-—-–-•-Ô-Ē.Ē/Ð.Ő/Ŏ/Ǝ/ƍ0ƌ0nj0NJ1Ȋ1Ȉ0Ȉ2Ɇ1ʆ1˅2ʄ2ʄ3ʃ3ʂ3˂3́4ˁ4ˁ5ʀ4~4~5~5}6}6~6|7~7|7|8|8|9|9|9{:{:{:{;{;{<{<{={=|>{>{>{?{?|?|?|@{A|A|A|B|C|C}C}D}D~E~D~E~F~G~FG~GGHIIIIJJKKLLKLLMMMMNNOOOOOP$%$$%&((*+,./014562(''('((((()())*)*****+++++,š,Ú,ė,ė,ĕ-Ŕ-Ŕ-œ.Ƒ.ǐ/Ə.ǎ/ǎ/Ǎ/ȋ0ɋ0ʊ0ʉ0Ɉ0ʇ1ʆ1˅1ˆ2̅2̄2˃2̂2͂3́4́4̀44̀55~56}6~6~7|7|7|8|8|9|9{9{9{:{:z;{;{<{<|>{={={>|?|?|?|@|@|@|A|A|B|B}B}C}C}D}D~E~EE~FGFG~HGHIIIJJJKJLLLLLMNMNNNOOOOO&$$%&((*,,./014578:8*&''((''(()))(*)*)*)++* +ž+Þ+ĝ,ě-ƚ,Ř-ŗ,Ɩ-ǖ,ǔ.ǒ.ɑ.ɑ.ɏ/ʎ.ʍ/ʍ/ʌ/ˊ0ˊ0ˉ0̈0͆0͆1ͅ1̅2̈́1΄2΄3΂3͂3΁3΁3̀4̀44~4~55~5~6~6|7|7|8}8|8{8{9|:{:{;{;{;{<{<{<{=|>|>{?|?|?|?|@|A}@}A}B|B}B}C}C~D}DE~EF~FGGHHHHIJIJKKKKLLLMMMNMNNOOPPP$%&'((*,-//114578:;<=-&''''(((()()))))¨**¦+ä*â+â*Ġ+ğ+Ş,ƛ,ƚ,Ǚ,ǘ,Ǘ-Ȗ-ȕ-ʔ-ɑ.ɑ-ː.ˏ.ˎ.̍.̌.̋/͊/͈0Έ0·0͇0΅0΅0΅0τ2τ2σ2ς2ρ2ρ4π4ρ3΁3Ѐ4~5~5~5~6~6}7}7}7|7|8|9{9{9{:{:{:{;{;z<|<{<{=|>|>|>|?|?|@}A}A}A}B}B}B}C}C}D}EEFEEFGGGHHIJJJJKLLKLMLMMMNNNNPPPP%&'((*,-//124578:;=>@A0&&&''''(((±)))()©*é*ħ*Ħ*ť+ţ*š*Ɵ+ǟ+ǜ+ț+ǚ,ș,ɘ,ʗ,ʖ,˕,˔-̒-̐.͏-Ύ.Ύ.Ύ.͌.΋/΋/Њ/Љ/Љ0χ/х0ц0х1Є1Є1Ђ2Ђ2т3с3Ѐ3π3Ѐ4р45~5~5~5~6}6|6}7}8|8|8}8{9|9|:|:|:{;{<{<|={=|>|>|?}?}?|@|@}A}A~B}C}C}D}D~D~DD~EFFFHGGHHHJJJJKKKLMLMMMNNNNNOOP&'((*,-//124578;;=>@ADF5&&&&''·'·(ö'ó(²(±(į(Į)ī)ƪ)ƨ)Ʀ)Ʀ)Ȥ)Ȣ*ȡ*Ƞ*ȟ*ɝ+ɛ+ʛ+˙+̘,̗,͖,͕+͓-͒,Α,ϐ-Ϗ-ώ-Ѝ.Ѝ.Ѝ.ъ/ш/ъ.ш0҆0҆0҅0҅0ӄ0ӄ0҃1у2ӂ1҂2с3Ӏ3Ҁ4~4~4~5~5~6~5~7}7}7}7}7{9{8|9|9|:|:{;|;{={<|<|=|>|>|?|>}?|@~@}A}A~B}C}C~D~D~D~D~EEF€FGHHGIIIJJKKKLLLMMNMMONONNPP'()*,./0124578;;=>@ADEFH:%&þ&ü&ü&ú'ĸ'Ķ'ŵ'ų'Ų(Ű(ů(ƭ(Ǭ(ǩ)Ǩ)Ȧ)ɥ)ɢ)ʢ*ɡ)ʠ*ʞ*˜+͜*̚+͘+Θ,Η+Ε,ϔ,Г,Б,В-Б-я-я.Ҍ.ӌ.Ҋ.Ӊ.҉/҉/ӈ0Ӈ0Ӆ0ӆ1ԅ0ӄ1Ӄ1Ӄ1ԃ2ԃ2ԁ3ԁ2Ӂ2343}5~5~5~5~6~6|7~7|8|9{8|9|9|9|:{;{;|<{={=|<|=|>|>|?}?}@~A~A}B~B}C~C~C~D~D~DEFFGGHHIIJIJJKJLLLMMNNNNOOOOOP()*,./0134579;;>>@BDEFHJL<&&ÿ&Ľ'ļ&ź&ƹ&ƶ'Ƶ'ƴ'Ʋ'Ȱ'ȭ(Ȭ(ɫ(ɪ(ɨ(ʦ(ʥ(ʤ)ˢ)ʡ*͠*Ξ)͝*Λ*К+ϙ+Ϙ+і+є+є,ѓ,Ӓ,ӑ-Ԑ,ӏ-ӏ-ԍ-Ԍ-ԋ.Պ.Ջ.Ո/ԇ0Շ0Յ/Յ0Յ/Մ1Ԅ1փ1փ2Ղ1ց2Ձ3Ձ3Հ3Հ34~55~5~6~6~6}7|7|8|8|9|9|9{;{:{:|;|;|;{=|=|=}>}>}@}?}@}A~A~B~B~CCC~E~EEFEG€GGHHIIJJJKKKLMMMMNNMOOOOOP)*-./0234579;<=?@ADEGHKLNP=&%ſ&Ƽ&ǻ&ƻ&Ǹ&ȶ&ȵ&ɳ(ɲ(ʮ'ʭ(ʬ'ʫ'˪(˧(̥)̤)Τ*΢)Π*Ϟ*М*ќ*К*Й*љ*җ+Җ+ӕ,Ҕ+ӓ,ӑ+Ց,Ր,Տ-Վ.Վ-֍-֌.׊.֊.։/׈/և/և/؅0օ0ׄ0ׄ1փ2փ2ׂ2ׁ2ׁ3ց3ր3ր44Հ4~5}556}6}7}7}7}9}8}9{9|:|:|:|;|<|=}=|=|=|?~?~?}@~?}A~A~B~BC~DD~DDDFF€GG€HHHIJJJKKKKLMMMNNNNPPOPO*,.00145679;<>?ABDEGIKLNORT;&%ɿ&ȼ&ȼ&Ȼ'ɸ'ɶ'ʵ'˳(ʲ(˰(ˮ(̬(̪(ͩ(Ψ(ϥ(ϣ)ϣ)Ѣ)џ)ў)Ҝ)Ӝ)қ*ә*Ә*Ֆ*Ֆ,Փ+Ք+֒+֒,֑,א-؏-؍-،.؍.ً.ً.؊.؊.؈/ه/؇/ن/؅1؅0؅1؄1؂1؂2؂3ׂ3ׁ34؀34~45~55~5~6}7}8}8}8}9|9|:|:|;|;|<|;}=|=}=}=|>}?~?~@~A~A~A~A~B~BCDEEEFF€GÀHHIIIJKJKLKKLMMNNNNOOOOP-.00245679;}>~?}?~?~@AA~BBCCDDŀEƀEFÀGÀG€HÁHHÁIIIJJJLKLLMMMNONOPPPP.01245679;}=}>}>~?~@~A@ABBDCǀDƀDFŀFEÀGĀGÀHÁHÁHÁJIJKKKLLLMMMNNNOOPPP/1245689;=<:9987654432210//0000000/00߆1݅0݃0݄2݃1ۃ2݂2݁2܀2܀3ہ3ڀ4ـ4ـ45~56~6~7~8~8}9~9~:}:|;};};}<}<}<}=}=}>}>~@~@~AAAɀBCȀCCǀDǀEƀFƀEŀFĀGĀGÀHÂH‚IÂI‚JJKKKMLLMNNNNOOOPQ235679:<=?@BDFGIKLMORSUVXY[]_`U'%%н&ѻ&к&Ӹ&Ҷ'Ӵ&Բ'Ա(߲.8ACC@??>=<;:998755432210/000/00000011010ރ1ރ1ނ1ނ3ހ3݂2݀2܀4ۀ4ځ4555}666~7}8}8~9~9~:}:};}<}=}<}<~>~>~>~?~@A~@~AACɀCȀDȀCǀDǀEƀFŀFƁFāGŀHÂIÂIÂH‚J‚JJLKLMMLMMNOPPPPP45779:<=?ACDFGIJLNPQTUVXZ\^_`cdG%&Ӿ&Ҽ&Լ'Ӻ&չ&۸*8DFFDCCBA@?=<;;998665442211/000000010111101111߃1߂2߁2ހ3ހ3܀3܁4܀5ۀ65ـ6~7~66~8~8}89~9~:}:;~<~<~<~=~=~?~?~?@~@~ABBʀBɀCɀDȀDǁEǀEƁFƁGƁGŁHāGĂHÂIÂIƒJƒJJKƒLLMMMONNOPOPP5779:<=@ACDFGIJLNPRTVVYZ]__`cdgi5&&־'׽(3BJIIGGEDCBA@?>=<:9987765442210000000010111111111122߂2߁3ށ3ށ3܀4܁5܀5ۀ667~7~7~7~7~8~9~9~:~;};<~;~<~>~=~>~?~@@~AABBʀCCɀDȀDȁEǁFǁFŀGƁGŁHŁIĂIĂIăIÃJ‚J‚K‚LLMMMMNNOPPOP779;<>@ACDFGJKMNPRTVVZ[]^`adegikc*)9JMMKJJHHGEDCCA?>><;:99876554221000010001111122122222112߂3߁3ށ3݁5݁5܁5݀66687~8~8999~:~:;<~=~===??@@AABˀCˀDɀDɀEɁEǁEǁFǁFƁGƁGƂIĂHĂIÃIÃJÃKÃKƒKƒLƒLMMNNOOPPPP8;<=?ABDFHHKLMOQRTUXY[]_abeghjlmp_PONMMLJIIHHFEECBA@>><;:9977655432100000101121111222222221333ހ4ށ4݁5ށ5݀5܀67~7~779~9:9:;<Ӏ;<=>>??@΀@ÀABˀBʀDʁDɀEȁFȁFǁFƁGǂHŁGłIłIăIÃJÃKÃKƒLƒLƒMƒLMMMOOOPPP<<>@BCDFHIKMMOQTUWY[\^`acefhllnv~^PPNMMLJIHHGFDCBB@@>=<<;9877655321111111111111222222222333334߁4߁4߀5߀5ށ6݀7767ڀ8899::<<<<=>р>?π?@ÀB̀BˀBˀCˁDʁDɁFɁFȂFȁGƁHƂGŁHƂHŃIăJăJÄKÃLÄLÃL„M„M„NNNPOOQQ=>@BCDFHIKMNPQTUWY[\_`bdefikmr||SQONMLKJHHHFEDCBA@?><<;:98875533211111121121222222223233333335545߁6ހ6݀778ۀ8899:;<<Ԁ<=>>р?@Ѐ?@΀@̀B̀B̀CˀCˁEʁDʁFɂFȂGǂFǂHƁHƂIłIŃIŃJĄJĄKÄK„LƒM…M…NNONOPQQ?@BCFGHJLNNQRTVWY[\_`cdfhjlpyiRQPNLKJIHHGEECBA@@?>=<;:98875432111112112111222333333333334345456߀6ހ6݀7܀7܀78ڀ99؀::;<Հ<Ԁ<>>?р>р@@πA΀ÀĆB́C̀CˁEʂEʁEɂFȂGȂGǂHƂHƂIłJƃJŃKĄKĄL„LÄL„M„M…ON…NPOOPACEGHJLMNPRSVWXZ[]aabdfijmt|WQPONMLKIHGFEDCBA@?>=<<;:98876521111121212233323323333434434444555߁6ށ7ހ8݀8܀8ۀ89ـ9ـ::׀;<<Հ=Ӏ=Ӏ>Ҁ?р?р@Ё@πBρB΁ĆĆD́D˂EʂEɂFɂFȂGȂGǂIǂIƃIŃIńJńKĄKąLÄLąM„N…MN†OOPPPCDGHJLMOQRTVXY\]]abdehjlnx}vRPONMLLKJHGEDCBA@@?>=;;:9887654331221122223323222333443343444455557߁7ހ7݀8܀8܀8ۀ9ڀ:ـ;؀;׀;׀<ր=Հ=Ԁ>Ӏ>Ҁ?с?рAЁAЁAπB́ĆD́D˂EˁEʁFʃFɃGɂHȂHǃHǃIƃIƃJńLńKĄLÅLĄLÅN…N…N…O†OOPPEGHJLNOQSUXXZ\^_bcdfhilr|ZQPONNLKJIHGFEDBA@@>==<;;9876543333232222332323343334434444454454667߁7ހ7ށ7݀8ۀ8ہ9ڀ9ـ;;׀<ր<ր=Հ=Ԁ>Ӏ?ҁ@ҁ?рAЀAρB΁B΁ĆD̂E˂E˂F˃GʃGɃGɃHȃIǃIǃIDŽKƅJńLńLŅMąMąMÅNÅN…O†O†PPQIJKMOPSTUXY[\^_bcegikmu}zRRPONMLKJHGFEDCCA??>=<;::9876543323432333333333343443444455455455677߁8ހ7݀7݁8܀9ۀ9ځ:ـ;؀;׀<ր=ց=Ձ>Ԁ>ԁ>Ӂ@ҁ@с@ЁBρB΁B΂D͂D͂ÊF˂EʃGɂGɃHɃHȃJǃIƃKDŽJƅKƅLąLŅMąMąNÅO†OÆOÆP†P‡QJLNPRTVWXY[]_`cdegjlnyYSRPONLKJIHGFDDDBA@?==<;:987654333344333333334343334444445545555556677߀8݂7݁8܁9ہ9ځ:ـ;؁<׀=ׁ=ց=Հ>ԁ?Ӏ?Ӂ@тAсAЂAρCςC΁D͂ÊE˃F˃FʃGʃHɄHɃIȃIȄJƄKƅKƅKŅLŅMąMąNÆNÆN†O†PÆP‡QMOPRTVWXZ\^`acdgikmp{xTRQPNMMKIHHFFDDCA@??=<;;:976653454434553333443444444564555455555567778߂8ނ8݁9݁:ہ9ځ;ځ;ف<؀=ׁ=ց>Ձ?ԁ?Ӂ@ҁAтBтBЂBρCςD΂D͂ẼF˂F˃GʄHʄGɃHɃJȄIȄIDŽKƅKƅLƅLŅNŅMąOÆOąNÆOÇP‡PQRTUWXZ[]`bbefijlmq}WTRQOONLKJIHGDDDCBA@>>=;:9876653335555545444545555556666566656666667778߂9ނ9ށ9܁:܁:ځ;ف<ف<؁=ׁ=ւ?Ձ?ԁ?Ӂ@ӁAҁBтBЂCςC΂D͂D̓F̓F̂F˄GʄGʃHɄIɄJȄJDŽKDžKƅKDžMŅMŅNņNĆOĆN†PÇPÇPRTVXY\]_`bdfgijlnr~pTSRQPNMMKIIGGEDCBAA@>><<;9776555555555566445555665565666666666666677788߂8ނ9݂:܁:ۂ;ځ;ف<ف=؁>ց>Ղ>Ղ@Ԃ@ӂAҁA҂BтCЂCσCςD͂ÊẼF̄G˄HʄHʄIʅJȄJȅJȅKDžLƅMŅMƅMĆMņNĆOĆPÇQÇQUWY[]^`aceghjkmorUTSRPONMLKIIGFEDCBBA?>>=;:9766545556666666655655565666666666666666778889߂9ނ9݂:܂:܂;ڂ;ق<؁<؂>ׂ>Ղ?Ղ@Ԃ@ӂA҂BуBЂDςCςE΃D΃ẼF̂G˄H˄HʄIɅJʄJɅJȄLȅLdžLdžMƆMņNņOćOĆOĆPÈQXZ[]^abdfhiklnpsaUTRQQNMLKJIIHFEDCBA@?>><;:8765556665666666655666666666666666667667778889߃9ރ:݂:܂;ۂ<ڂ<ف<؂>ׂ=ׂ>փ?ՃAԂ@ӂA҃B҂BтCЃDςE΂E̓F̓G̃G˄HʄIʄJʅIɄJɅJȅLƅLdžMƆNƇMŇOņOņOņPćQ[]^_bcegijlmoqs~WUTRQOOMLJJJHGGEDBA@?>>=<;88765556666666677666566666666666677876767777989߃:ނ:݃;܃;ۂ<ڃ=ق=ق>؂>փ?փ@Ԃ@ӂAӃA҂BЃCЃDЃEσE΄F̈́ḠH̄G˅H˄IʄJɅJɅKȅKȅLLJLLJNdžNƆNņNŇOņOćP^``cdfhijmnpruWVUSRQOONMKJHHGFEDBB@@>=<;:88776666666666667676667676666777787878888788899߃:ނ;݃;܃<ۂ<ڃ=ك>؃>؂?փ?ւAՂ@ԃB҃B҃C҃DуDτE΄F΄F΄H̄G˅IʄIʅJʅJɅKɆKȅLdžMȆNdžMƇNƇOƇOŇPŇP`adefhjkooqsudWVTSRPOOMLKJIHGFDDBA@?>=<;;9777767666676777777777667677878887888888897899:߃:ބ;݃<܃<ۃ<ڃ=ل>׃>׃?փ@ՃAԃAӃB҄BфCуEЃEσF΄F΄G̈́HͅH̅I̅IʅJʅJʅKɅKȆMȇLLJNLJNƇOƇOŇPňPcefhkmmpprtvXXVURRQOONKKJIGFEECBA@>=<;:99777776667677778887877777877777888889998978999:߃;ބ;݄<܄=ۃ>ڃ>؃>؂?׃@փAՃAԃBӄBӃD҃DЄEЄFτF΄G΄H΅HͅIˆI˅IʅJɆKɅLɅMȆMȇNȈNLJOƇOƈPŇPfgjlmnqrsuw|YYVUUTRQPNMLJJHHFECDBA@==<<:98887887777777788888877777788888889999998988899߄:ރ;݄<݄<ۄ=ڃ>ل?؃?׃@փ@փAՄBԄB҄B҃D҄DЄEЄFτF΄Ḧ́HͅI͆IˆJˆKʅKʆLɆLɇMȇMLJNLjOLjOLJPƈQiklnprstvx|_ZYWUTTRQPNLKKJIGFDDDB@?><<;:988878897877787998989778888888888899:9999989:9:߅;ބ;݄<܄=܄=ڄ>ك@؃@ׄ@ք@ՄAՄBԃCӄD҄DфEЄFυFτH΄H΅H͆I̅IˆJˆKʆKɆLɇMȇMȇOLjNLjOLjOƈQmnpqsvwyz|p[ZYWUTSRQPNNLJIHGFEDCAA?=<;;:99:9:98:998899899:9998999899999:999::9::::89::;߅;ބ<݅=܄>ۄ>ڄ?ل@؃@׃AքAՄBԄCӄD҄D҄EфFЄGτG΄H΅I͆I͆J̆J̇KʆKʆLɇMȈMɇNLjNLjOLjPƈPoqruvyz{~\[ZXWVSSRPPNMLJHHGFDCBA@?=<::::9::::99999999999:::999999999::9::::::::::99:;;߅;ބ<݄=ۄ=ۄ?ڄ?ل@؄AׄAՄBՄBԅCԅD҄E҄EхFτGυGΆHΆI͆ĬJˆK̆LʆLʇLʇMɇNLjOȈOLjPLjPsuwxzz}~^]ZZXVUUTRQONLKJHGGFEBB@??<<;:::::::::::9999::::::::99:999:9:::::::::::::9::;߅<ޅ=ބ=݄>ۅ>ڄ?ل@ل@ׄAׅBքBԄCӄDӅD҅FхEЅGЅGυIΆI͆I͆J̆KˇLˇLʆMʇMɈNɈNȈOȈOLjPvxy|~_]\ZYXXUSSRPONMKJHGFEDBA@??>;::::::::::::9:9:::9:::::99:::9::::::::::::;:99:;<߅<ޅ=݅>܅>܄?څ?ل@؄@ׅAՄCՅCԅCԅE҅E҅FцGЅGЅIφIΆJ͆J̇K̇KˇLˇMʇMʇOɇOȈOȈOȈQy{}e`^[ZZXXVTSQPOMMKKIFEDCC@@?>=<::::;::;::;;99;:;:::::::9;;::;:::;::::::;:;;::;;<߅<ޅ=݅?܄?ۄ?څ@ل@؅AׅBօBՅDԅEӅE҅FцFЅGЅGυIΆJ͇İK͇K̇LˈLʇNʈNʇNȈOɉOȉP}~va]^\[ZYWVTSRQOMMKJHGEDDC@?>>=<;;;:;:;;:;:;:::;:;;;:;;;:;;;::;;;;::;:;<;<<;;;<<<߅=݅>܅>ۅ?څ@مA؅BׅBօCՅDԅDԅF҅EхFхHцHІIφIΆJΆJ͈K̇LˇLʈMʇNɈNʉNɉOȉPb`_^][YXWUSRQQONKJIHFDECBA?>===<<;;;;<<<;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<<<<:;;<=߅<ޅ>݆?܄?ۅ@څAمB؅B׆CօCՆEԅEԅF҅G҆GцHІHφIχJ·J͇L̈K̇LˇNˇMˈNʈOɉPɉPcb``^\[YYVUURQPNMLJIHGECDC@>>===<<;<;;<<<<;<;;;;;;;;;;;<;;;;;;;<;<;;<<<<<<::;;=߅>ކ=ޅ>܅?ۅ@څ@مA؅C؆CօDֆDՅDӆFӆF҆GцHцHЇIЇI·K͈K͈L͈ṀLˈNˈNʉOɉPɉPddb`_^\[ZWWUTSPPOLKIHGFDDCB@@==>==<=<<<<<==<<<;;;;;;<;;<<;;;;;;;<;;<<<<<<<=;;<<=߆>ކ>݆?܆@ۆ@څA؅B؆C׆DօDՆEԆEӆF҆G҇GцHЇIχJ·KΈK·K͈M̈MˈNˈNʊOʊOʉPffdc`^^][ZYXUTRPONMKIGGGDCBB@?>===>===<=<<=><<<<<;<<<;=;<<;<<;==<<=<<<<==<=;;;<=>߇>ކ?܅@܆AۆAڅBنC׆D׆DֆEՆEԆFӆFӆG҆IЇHІJχJψK·L͈L̉M͈MˉNˈOˉOʊQigedca_^^[ZXWUTSQOMLKIGGFECB@@>>>>>>>>>=>======>==;;<<==========<==>==><==<=:;<<=߇>އ?݇@܆@ۅBچBنC؆C׆DֆDֆEՆFӆFӇG҇HчIчJЇJψKΈL͈L͉M̈NˈNˉOˉPʊQkhgeeba`^][YWVVSRPOLLJIGFFDCBA@?>>>?>>>=>>>>>>==========>==<=========>=>>>>><=<<=߆>߆>ކ?݆@܆AۆBنC؆C׆DֆDՆEԆFԆGӇH҇HчIчJЇJЇLΈLΈLΉM̈NˈỎOˊPʊPljigeeb`_^\[YXUTSQPNMLKIGFFDBA@A@@?>?>?>>>>>>>>>>=======>>=>=====>>>>=>>>>>?>;<=>>߇?އ?݆@܆AۇBچBنD؇DׇEֆEՇFԆFԇGӇH҈IчJчJЇJψKψLΉL͈N̉ỎOˉPˉPnlkhgfdca^]\[YWUTSQOMLLJIGFEDCAAA@@@?@@?????>>??>>====>=>=>>>=======>=>?>??>><<=>>>߆@އ@܇A܆BۆCڇCنD؆DׇEևFՇGԇGӈH҈IшJчJЈLЈLωL͉L͉N͉N̉OˉOˊPomljifecb`_]\ZYWUTRPPNLLJIGFDDBABAAA@@@@@?>?????>>?>=>=>>>>>?>>=>>=>>>>>?????=<==>?߇@އ?݈@܇BۆCڇC؇D؇DׇEևFՇFԈHӇHӇH҈IшKшKЈLψLΉMΉN͉O͊OˉO̊Pqnmljigedb`_]\ZXWUTSQONLKIHHFEECBABBA@@AA@?>???@??>>>>=>???>>>=>=>>>>?>>?>???><<=>?߈?߈@ކA܈AۆBڇCهD؈DׇEևEՇFԇGԈHӈH҇JшJшKЉLωLΉMΉM͉O͉P̊P̊Qrpomkihfeda`_\[ZWVUSRQPMLJIHGEEDCBCBBA@AAA@@????@@>??>>>????>>?>>>>>??>>??>???=>=>??߈@ވA݈B܇BۇCڇCوE؇E׈EֈGՈGՇGԈIӈJ҈JшKЉLωLωMΊM͉O͉O̊P̊Qtrqpnkjhgdca`^][YYVUSRPOMMJIHGEDDDBBCBBAAAAAA@?@@@@?????>>?>?????>>?>?>????????=>=??@ވA݈A܈BۈCڈCوD؇D׈EֈGֈGՈHԈHӈJ҉JщKщLщMЉMωN͊OΉO͊O̊Putsrpmkjhfeba_]\\ZXVURQOOMLKHHFEDDDBCCCBAAAB@@?@@@@@????????????>>?>??????????@<>>>?@߉AވA܈B܉CڇCوDوE؈F׈GֈGՈHԉIӈIӉJшLщKЉMЉMϊMΉNΊO͊P̊Qyvusqpnmihfdca`]][YXUUSRQNMKJIGEEDDDCCCCBBBBBAA@@@@@A????????@??????????@?????@=>>??A߉AވA݈C܉BۈDڈD؈E؈F׈FֈGՈHՉHԉIӉJ҉K҈LЉMЉMϊNΊNΊO͊P͊Q{ywtsqpnliggeca`^\[YXVUSQPOLKJIGEEEEDDCDDBBBBBAA@@AAA@@??@???@?@@???????@??@?@@?>>??@A߉B݈C܈CۈDڈDوE؈F؈FֈGֈHՈHԈJӉKӉKщLщLЊMϊNϊOΊO͊Q͋P|zyvusqpmkjhgeda_]\ZYWUTSRONKJIHGFEEEDDDDBCBBBCA@AAA@A@@@??@???@@?????@??@@?@@@@>>>?AAމBމB݉C܈DډDڈE؉F׈G׉H։HՈIԉJӉKӉK҉LъMЊMЋNϊN΋P͋O͊P~|{yvvtqpolkhgdca_^\ZXXVTRQONMKIGGFFFFECDDCCBCCCBAAAAAA@@@@?@@@@@@@???@@?@@@@@@@>>?@@A߉BމB݉C܈DۉDډEىF؈G׉G։H։IՊJԉJӉKҋLҋMъNЊNЋOϊPΊP΋Qс|{yxvsqqnljhfeba_]\[YVUSRPNNLKIHHGFFFEDDDCCBCCBBAAAAAB@A@?@@@@@AA???@@@@@A@@@A??@?@AߊBމBމC݉C܉DۉEډEىF؉G׉H։IՉIԊJӊK҉LъMъNЋNЋOϋP΋P΋Qޚуς|{ywvtrqnliifdba_]]ZXWUTQPNMLJIHGFFFFEEEDDCCCCBBABBBBAAAA@AAAAAAA@@@AA@@BA@B@@>?@AAAߊBފD݉D܉EډEډF؉F؉G׉H։I֊IՉKԊKҋK҉MъMыNЊOϋP΋P΋Q׋фς΀̀~{{yusrpmkkhfeca^]\ZWVTRQONMJJHHHGGFFFEEEDCCCCBBBBBBBBB@AAAAAAABAA@AAAA@ABABA??@@AAߊCމB݉D܉DۉEډFىG؉G׊H։I֊IԊKӋKӊK҉MҋMыNЋOϋP΋PϋR҈цυ΂́~|zwvsronljhfdc`^][YWVTSRPMLJJIHHHFGGFEEFEDCDDCBBBBBBBBABABBABBCAAABABABBBBC?@A@BBߊBފC݉C܉DۉFډFىG؉G؉H֊I֊IՉJԋKӊLҋMҋNыNЋPϋPϋPϋQҋщ·̈́̃˂}{zwvtrpmligfda`^][ZVVTRQOMLKJIHIHFGFFEFEEDEDCDBBCBCBCAABABBBBBAABABBBBBCBB@?AA@BBފC݉D܉D܉EۉFيFىG׉I׉I֊JՊJԋKӊLӋMҋNыNЌOЋPόQΌQҍыΊ͆˅Ƀȁ~|yxvtrpmkigeca`^]ZYWVSQPNLKKJIIIHGHFFFFEEDEEDDCCDCCCCBABBBBCBCBBABBBBBBBC?@@AABCߊCމC܊D܉EڊFيFيH׊I׊IՊJՊKԋLԊLӋMҌMыOьOЌPόQΌQҏЍΌ͉ˈʅɃƁĀ}{zxvtqpmkjgecb_^\ZYVUSPONLKKKIIJHHGFFGFFEEEEDCCDDDCCCCBCCBCCCBBCBBCCBCCC?@@AABCߊDފD݊E܉EۉFڊGيH؊I׊I֊JՊKԊKӋMӋMҋNыOЌOЌOЌQΌQטђАΎ̋ˊʈȆƂŁ}{ywusrpnjjgec``^[YXVTRPOMLKKJJJJIIHGFGGFFEEEECDDDDCDCCCCCCCCACCCCCCCCCCA@@AAACߋCދD݊E܉FۉGډFيHًH׊I֋KՊKԊKԋLӋMҌNҋOьOЌPЌQόQҗѕГΐ̎ˌɊLjƆŃÂ}|xwusqomkigeba_][YWUTRONLLLKKJJJIHHGGGFGFFFDEDDDECCCCCDCCCCDCCCCCCCCCCB@@BABCߋDދDދD܋FۊFڋGيH؊H׊J֋J֊KՊKԊMӋMӌNҋOьOьPЌQόQәҗϕ͒ˑʏɍNJŇņƒ}{yvusqolkigeb`^]ZXWURQONLNKLKJJJIIHGGHGFGGGFEDFEFCEDDDDDECCDCCDCDDCCCC@@ABACDދDދE܋FۊGڋHيH؋H׊I׋K֋KՊLԋLԋMӌNҋOҌOьQЍQόQܫӛЙϗ͕˓ʐɏnjƋň†„~}zxvtsqokjigdb`^\ZXVTRPONMMMLLJJIIIIGGHGGGGFFFFEEEEEDDDDEEEDDDDDDDDEDC@@ABBCDދEދE܋F܊FۋGيH؋I؋J֋K֊KՋLՋMԌMӌNҍOҌPэQЍQύQԟҞЛϙ̗˖ʔɒǏŌŋ‰}zxvtrpnkigfda_][ZWVTRPONNNLLKJKIIIHHHGGGGGGEEFFFEEDDEDDEEEDDDDDDDEEDAA@BBCDߋDދF݌G܊FڋGڋHًI؋J׋K֋K֌LՋMԌNԍOӌPьPьPэRЌQӣҠО̙͜˗ʖɓƒŐčŠ~}{xvsqomjigeca^]ZXVTSROPONMLLKKKKJJHHIHHGHFGEFFFEFEDDEEEDEDEDDEDEDDCAAABBCDߋEދF݋F܋HۋHڋIًI؋J׋K֋L֋LՋNԌNԌOҌOҌPэQэRύR߸ӥУР͟˝˚ɗȕƓŒď}zxvsqnljhfcb`_\YXVURRPQNNNMNKKKJJKIIIIGHHGFFFFFEFDDEFEEEEDEDEEEEEEAAABBCEߌEތE݌G܋HۋHڋIٌI؋J׌K֋L֋MՌMԌOԌOҌPҍPэPэRЍRժӨЦϣ΢ˠʝɚșǖœ’|yxvrqnljhfca_^[ZWUTSRQPNPNMMKKKJJIIIIHHHHGFGFGGEFEEFFFFFFDEFFFFFEABABCDDߋEތF݌G܋HیHڋIٍI؋J׌K׌L֋LՋNԍOԍOӌPҍPэQэRЍRӬҪѩΧͥˡʠɝǛƙĕ”~{yxvspoligeca_][YWVTSQPPPPNNMLLKKJJIIIHHIHGGGHHGGFFFGFFFEFEEFFFGDAAACCCEߌEތF݌G܋HیHڋIڌJ،J،K׌L֌LՍNԍOԍOӍPҍPэQюRЍRٹӯҬϪΨͧ˥ɣȠǞƛę–{ywtrpmljhec`_]ZYVTTRQRQPPONLLLLKKIIJJIHJHGHHHGGGFFGFFFFFFFFGFFEABBBDDEߌFތF݌G܍H܌HیJٌJًK׌K׋M֌MՍNԍOԍOԍPҍPҍQэRЍSմҲѯϭΪ˩ʧɥȣƠƞۙ~|xutromkhfdb`^\ZWVVTTRSPPPOMMLLLLKJJKIIJIHHHHHGGFFGFGGGFGFGFFFEBBCCDDEߌFތF݌H܌HۍHیJڍJًK،L׌L֌MՍNԍOԍOӍQҍQэQюRЎSշӴѳαͯˬʩɧǥƣƟݜ}{wuuroljhfca_^\YWVUUSRQQQPPNMNLLLKJJJIJIIHHHHGGGGGFGGGFGFGFFGDBCCDDDEFތF݌H܍H܍HڌJڍKٍL،L׍M֍MՍNԎOԎOӎQӍQҎRҍRюSּӹѸжδͱ˯ɬȪǧƥģß}{xvrqnliheca_\[YVVUTTRRQQPPNMLMLKKKKJJJIIHHIHHGFGGGGGHGGFFGGEACCDDDEGތGݍHݍHۍJڌJڍKٍL،M׍M׍N֍NՎPԎPԍPҎPюRҎRюS־ԼѹθͶ̴ʱɯȬƪŧťã |zxtrpmlhfdb`^\ZYWVUTSTQRPPONNNMMKKKJJJIIHIHIHHGGGGHGGFFGGGGDCCCDDEFߍFލGݍHݍIۍJڍJڎKٍL؍L׍M֎M֍OՎPԍOԎPӍQҎRюSюSӾѼκθ̶ʵȲǯƬŪĨå|zwuqonkhfdb__][XXWVUTSRRQQNONLMLKKLKJJIHIIIIHHIIHGGIHGHGHHECCCDEFFߌGލHݍH܍IۍJۍJٍK؍L؍M׎N֍N֍OՎPԎPԎQӎRҎSюSяTϽ̻˹ʷȴdzưĭëè~{zwurolkifdb`][YXXWVUTSRQQPOONMMMKLKKKJIJJIJIIIIHIIIHHHHHHEDDEEFGGߎGލHݍI܎JۍKۍJٍKٍL؍L׎N֎N֍OՎPԎQӎQӏRҎRяSяTξͻʹɶƴƲİĮë§}zxvtromjhfc``\[ZXWVUUTRSRRQPONOMMLLLKKKJJJJJIIIIIIIIIIIHHDDDEEFFGߎHލHގI܍IۍKڎJڎLَL؎M׎N֎O֎OՎQԎQӎRӎSҏSҎTЏU˾˼ɺǷƴIJð®}zwvsqnlifdb`^\ZYZXXVVUTSRRPQOONMLNLKKLKJJKKJJJJJJJJIIJJIDDEEFFFGߎHލHݎJ܎JێKێKڎLَM؎N׎N֎O֏PՎPՎQӎRӏRӎSяTяU˿ɼȺǷƵı°~zwuqpnkifdba^\[[YXWVVTTRRQQPNNNMNNLMLLKKLKKKKKJJKJJJIKHDDEEFFGGߏHގIݏJ܎KۏJڎKڎLَM؎N׎N֎OՎPՎPԏRԏSҐRҐTҏTЏUȿǼǺƸôñ¯{zvuroljhfcb`_^[[YYXWVUTTRRRQPPONONMLMLMLLKLKKKKKLJKKKHDDFFFGHHߏIޏIݏI܏KۏKڎLُMُM؎N؎O֎PՎPՏQԏQӏSҐRҐSѐUѐUƿƽĻĸ}{xvtromjhfca__]\[[XWWUUTSTSRQQQPOONNNMMMMLLKKKLLLKKKKFDEFFGHGHߏHޏJݏJ܏KۏLڏLُM؎O؎O׏P׏PՏQԏQԏRӐSӐSҐTҐUѐUſĽĻ÷~|yvrpnljgdcb`_^\\ZZYXWVUTTSQRRPPPONNNMNMNLKLLLLLKKKKEEEFGGHHߏIߎJޏJݏK܏KۏLڏMُMُN؏O׏P֏QՏQՐRԏRԐSӐSӐTҐUґVĿüº}{xuspmligdbb`_]\\ZYXWVUUSSRQQPPPONNONMMMMMLLLMLMLLKEEFGGHHHߏIޏJޏK܏KܐLۏMڎMڏMُO؏P׏P֏P֏QՐRԐSԐSӐTҐTѐVҐU¼~{ywtqomkhecba__\[[ZYXWWVTUTRQQPPPOOOONNNNMMMMMMMMMJEGFGHHIIߐJޏKݏKݏL܏LڏNڎMُOُN؏P֏P֐PՐRՐRՐSӐTӐTӑTѐUѐV¿~|ywspnkigedbb`^]][YXXWWVUTTSSQQRQOQPPOPPONNNNNMNMIFFGGHHIIߐJޏJޑLܐLܐMۏMڏNُO؏O؏P׏P֑QՐSՐRՑSӑSҐUґVҐUёV¿}zxvspnkjgedb``^]\\[YXXWVUVTTTRSRPPPPPPPOONNNNONNFFGGHHIIJߑKސKݐKܐLܐLېMڐNِOؐOאPאQ֑RՐRԐSԐSԐTӐTҐVҐVАW|zwtqomjhfddca``^\\[YYXWVVUTURSRQRQPQQQPPPOOOPPLFGGHHIIIJߐKޑLܑLܑLېMڐNڐNِOؑPבP֑Q֐R֑RՑSԑTԐUӑUҐVёVёW|ywtqoljhfecbb__^]\[ZXWXWVVUUSSRRRRQQQQQOPPPPPJGGHIHHJKJߑKޑKܑLܑMېNڐNِOِOؐPבQבRՑRՑSՑTԑTԑUӑUґVґWђW¿~{xvspoliggedba`^^]\[ZZYWWVVUSTSRRRRQRRPOOPPPPHGHHHHJJKߑJޑLސLݑMܑMېOڐOِOؐPؐQאQאR֑SՑTՑTԑUӑUӒVҒVђWђW¿|zwtrpmkihfecca__^\[ZZYXWWVVTTTRSSRRSRPQQQQQOGHGHHIJKKߑKޑLݑLܑMېNۑNڐOِPؐPؐQבR֐S֑SՑTԑTԑUӑVҒVҒWҒXѓX}{xvtqnljhgfecaa`^]\\[ZYXXWWVTUTTTRRRSRQQQQQKGHIHIJJKKߑLޑMݑNܑMܑOۑPْPِPّQؑQ֐R֒SՑSՑTԑUԒUӒVҒVӒWҒXГY|zwtrpljihfecba_^^^]\ZZYXWWWVVUSTTSRSRRQQQPIHHIIIJKKߒLޑMޑMݑNܑOےNۑOڑOؑPؑRؑRבS֒SՑTՒTԒUӒUӒVҒWҒWђWѓX~|ywtqolkihfedca`_^]\[ZYYYXXWWVUUTTTTSTSSRNIIHIJJKKLߒLޒMޑMܒNۑOےOڒOڒQْQؒRגRגS֒TՒTԒUՒUӒVғWҒXѓXғXђX}{yvsqoklhgfdcca``_^]\\ZZZXVVWUUVTTTUSSRTJIIJJJJKLLߒMޒMݒMܑOےPےPْQْQؑQؒRגS֒S֒TՒUԒVՒVӒVӓWғXѓXѓXѓY|zwtrpmljhggecab``__\\\ZZYYXXWVVUUUUUTSPJIJJKKLLLߓMߒNޓMݒNܒNےOۑPڒQْQؒRؒSגS֓SՓTՒTՓVԒUԓVҒVғXҒWѓYѓZ~|xvsqpnkjjgfecc`a_^]]\[ZZYXXWVVWUUUTTTKJJKKKKLKLߒMޓNޓNݒOےOےPڒPڒQْQؒRגRדS֓T֓UՓVՒVԒWӓWӓWғXѓYѓYѓZ}{xuspnmljhgfecba``^^][[ZZXXXWWWUUUUUQJJKKKJLKLߓMޓNޓNݒOܒOܓPےPڒQْQؒSؒSؒSגS֒U֓TԒVՓVԓWӓWӓXғXѓYѓZД[}{xvsqomljihgecda``_^]\\ZZYXYWWWVVVVVMJJKLKKKLMߔMߔNޓOݓOܓPےPڒQڒQٓRؒSؓSגSדT֒UՒVՓVԓWԓWԓWғXғXѓYѓZѓ[}zwuspnlljhffdcaa``_^]\[[ZZYXXXWVVWRKKKKKKLLMMߔNޓNݓOݓOܓPܓPۓQْQْSؒRؓSדT֓T֓UՓVՓVԓWӓXӓXӔXғYѓZѓZѓ[|yvtqpomkiihfedca`__^\\\[YZXXXWWWWNKLKKLLMMMNߔNޔOݓPܔPܓPۓQڒQړSؓSؒTؓTגU֓U֓VՓVԓWԓWӓXӓXҔYғYѓYєZѓ[ý}zxtrqonmkiifeecbbaa__]]\[[ZYYYWXQMLLLLKMMNMߔNޔOޔPݔQܔPܓQۓRٓSٓRٓTؓTדU֓U֓UՓWՓWՔWӓWӓXӓXӓYѓYѓZЕ[є\¿»¸|ywuspnmlkihgfddcb`_`^]][[[YYYYVOMMNMLMMMNNߔOޕOޔOܔP۔PۓRړRٓSٓSؓTؓTדU֓U֔VՓWՓWՓWԓXӓYҔZєYҕYєZДZД\ýû}{xurppolkjihfdeccba`_^]]\\Z[[YPONMNMMNMNNߕNޕPޔPݔPܔQۓQۓRٓRٔSٓTؔTהU֓U֓V֔VՔWՓXӔXԓXӔXӔZҔZҕZѕ[ѕ[Е\ÿ¼¸´|zwtrqpolkkigfedcba`_^]]\][[ZTOOONNNNOMOOߕOޔPޔQܔQ۔R۔RڔSڔSٓSؔTؔTؔU֔U֔W֔VՓXԔWԔXӓYӕZӔZҕZѕ[ѕ[ѕ\Е\ýúµ}zxusrpnmljigffddbc`_`_]]][[XOOPNOONNNOOߕPޔPޔPݔQܔQܔR۔RڔSٔSٓTؔTؔUהUדWՔWՔWԓWԔXԓYӓXӔZҔZҕ[ѕ[ѕ[ѕ\Е\ƾĻĸµ²­~|yvtrpommjjigfedbcbaa^]^][YQPOOOOONOOOߕPߕPޕPޕQݕQܔR۔RڔSڔSٕSٔUؔTהV֕V֔V֕WՔWՓXԕXԔYҕZӕZҔZѕ[ѕ[ѕ\Ж]Е]ƼĹĵóï~|zwvrronnljjhgfedcbaa`^^^]TSQPQOPPOOPOOߕPޔQݕQܕQܔS۔RڔSڕSٔUٔUוVהVוV֔WՔWՔXԔXԕYӔYӕZҕZӕ[ѕ[ѕ[Е]Ж\Ж]ƽźĶĴıĭë}{xuurrpnmljhggedecab`__^XTSSQRSPPOPPߕQߕPޕQݕQܕSܕRەR۔TڔSٕTٕTؔUהV֕V֕W֔WՕXՕXԕYԕYӕZӕ[ҕZѕ[ѕ[і\Е]Ж\ϕ]ƼǹƵŲïëŨ¦|zwvusppnmkkhheedcbaa``ZTSTSSRRPPPPߕQߕQޕPޕQݕRݕRܕS۔SڕSٔTؕUؕVؕVוVוW֕WՕWՕWԕXԕYԕYӕZӖ[ӕ[ҕ[Җ\ѕ\Ж\Е^Ж^ȽǺƶƳůŭĩ§¤¡ž›˜~{xwusrpnmljjhgffedcba^VUUTTSRSQQQߖQߖRޕRޕQݕQܕSܖRەRەTٖTٕUٔTؔVؔV֕W֕V֕XՕXՕYԕZӕYӕZӕZҕZѕ[ѕ\ѕ]ѕ]і]ϖ^Е]ʿɺɹȵDZŮūħŤĢßܙ”~}ywutsqpnllkiigffdcb_WVVTTTSSSRQQߖQޕRޕSݕRݕRܕSەSۖSږUڕUٕUؔVؕUוWוW֕XՕXՕYԕYԕYӖZӕ[ӕ\Ӗ[і[Җ\Ж]і]Ж^Ж^Ж^ۿۿۿݿ޾ʾɺȶdzȯǭƨƦǢƟܚה}{xvutrponmkjhhffedaYVWVTTUTRSߕSRRޖQޖSܖSޕSܕSܖSەTۖSڕUٕUٕVؕVוVוW֕W֕XՕXՕYԕYԕZӕ[Ӗ[ҕ\ҕ\ѕ\і]Ж]і]Ж^ϖ]Ж_տտվ׽ؽھ۽۽ݽݽݽ̻ʹɴȰɭȪǧǣǢŜÚהяÌÉ}{xwvtsppnmkjihffebZYUVVUTUTSߖSߖSߖSߖTޕRݕSܖSݕSܖSܖTۖTٖTٕUؕUؔVؕWוWוW֕YՕYՕYՕYԕZԖZԖ[Җ\Ӗ[ҕ\Җ\і\і]Ж^Ж]Ж^ϖ_ҾӿӿԾ־׾־ؼڻںۼܼܼ޽Կ˶ɳɮɬȨȥƢǟǛŘŕŒďČÊÇ|zwwusqpnmkjihgfc]ZXYXWVUUߖTߖTߗTޖTߘSߖRޖSܖS۔TܖSܖSۖTږUٕUٖVؕVؕVוWוW֕XՖYՕYԕYՖZԖZԕ[Ӗ\ӕ[Җ\Җ]і]ѕ]і^Ж^Ж^Ж_ϖ_ϿпϾѾѽӽӽԽԼּ׻ؼټڹڸۺܺ޻޺ϸʰʭʩȥǣǠǝǙƗŔŐŎĊĈƃ}zywutsqonlljhgd\[[WXXXߘWUߗUߗTߖTߗTޗTߖRޗTܕSەUږUܖTۖTۖUږTٖVؖVؕVؕXוWוX֖XՕXՕZՖYԕZԕ[ӕZӖ\Җ\Җ\Җ]і]і]Ж^Ж^З^Ж_ϗ_νϼϻѼѼѻԻԻԺչֺֹ׺ظٸڸ۷۸޹޹ݽ̰ʪʨʤɡȟǛǘƕƒŏŌĉÆÄÀ|ywvtsqpnnlkic]^[[YYWߘXޘXߘVߗVߘVߗUޗTݗUޗTܖTۗTۖTږUۖSۖUږUږVٖVؕVؕXؖWוW֖Y֖XՖYՖZԖZӖ[ԖZҖ\Ӗ\Җ\Җ]і]і]Ж^Ж^і_З_ϖ`З_ͻͻϻлкѺҺӺԺӹչոָطٷ۷۶۷ݸ޸޷յʩʥʡɟɜșȖǔƑƌŊĈĄÁ|yywusqpnnljc_]^\[ZYߚXߘXߙWޘVޘUݘUޙUܘUܗVܖTܘUۗSږTږUۗTڗTږUڗVؖWؖWזWזWזX֗YՕYԖZՕZԕ[Ԗ[ӕ[Ӗ\Җ\Җ]і]і]і^Ж^З^З_Ж_ϖ`ϖaͺκιϹиѹѸҸӸԷշֶַ׶صڵ۵۴ܷݵ޵ߵЭ̤̠ɝəʖɕǑƎƋʼnŅăĀ}zywvttqoomc`_^^\\ߚ[ߙZߚXޙZߚWޙWݗWܗWݘVܗWۗVۘWۘUۗTڗUٖUژTڗU٘VؗWؖVؖWؖX֖Y֗XՖYՖZՕZԗ[Ԗ[Ԗ[Ӗ\Ӗ\Җ\Җ]і]і^З^З^З_З_ϖ_ϗ`ϖa͸θθηϸзѷӶҵӶԶԵֵֵششٴڳܳܵݵ޴ߴܳΥ̞˛˙ʕʒȐȌljdžńŁ~|ywwtsrqmdbaa_^\ߛ\Zߚ[ߛYݚZޛYݙWܙXܚUܙUܗWۘWۘWۘUڗU٘UٗUڗUٗUؗVؗWחXؗXחX֗X՗Y՗ZՖZԗ[Ԗ[Ԗ[Ӗ\ӗ\Җ\Җ]ї^җ]Җ^Ж^і_З`Ж_Ж`ϗaϗa̷Ͷͷηжϵ϶ѵѵӵԵԵֳִس׳سڳ۱۲ܳݳ޲֪̝˙˖ʓʐȎȋȈDžǂ}{zwvttkddba`^]]ޜ\ޜZޛZݚZޜZޛWݚXܙXܚWܘVۙVۙVژVڗVڗUڗUژVٗVٗVؘWؗWחXחX֗Y֗Y֗Y՗ZՖZӖ[Ԗ[Ӗ\Ӗ\Ӗ]Җ^Җ]җ]Җ_З^Ж_ї_Ж_ϗ`З`ϗaϘa̵̵̵εϵдгдҴӲӲԲճֲձײױٱڱ۱۲ܲݱݱѢ̗˓ʑʎɋȉȆȃ}{yxwpifddba_ߟ_^ߞ]ߞ\ߝZݜYݜYݛYܚZݛWۛXۙXܚVۙWۙVژVژVڙVؘVٗW٘V٘VؘWؗXחXזY֖Y֗YԗZ՗ZԖ[Ԗ[ӗ\Ӗ\ӗ]Ӗ]Җ^Җ]җ_ї^ї_З_ї`З`З_ϗaϘaϗa˵̴ͳͳδϴгвѳҳҲӲԱղղֱׯدٰگۯܰݰޱ߰߰ݪΗ̑̎̌ˉʆʃɁ~|zwnihfdcbaߡ`ߡ^ޟ_ޟ\ޟ[ޞ[ܝ[ݜZݜYܜYܜXܛWۚXۛWڙWۚVٚWۚVٙVؘVؘWؙWؘWؗWטXטX՘XՖYՖZ՗Zԗ[Ԗ[Ԗ[Ӗ]ӗ\Җ\Ӗ]җ]і^җ_З_ї_ї`З`З`ϗaΘ`Ϙaϗa˳̳ͳͳͲγϳбѲѲҲұԱ԰հկׯׯٯٮگۯܯݰݯޯ߯נ͏͌̉̆ʃʁ~{tmligffcbaߣ`ߢ]ߡ^ޠ]ޠ\ݟYܞZܞZܞZ۝ZܝXۜXڛXښWښWۚWٚWٚVٙVؙWؘWٙWؙXؙXטX֘X֘Y՘Z՘Zԗ[՗[ԗ\ӗ\ԗ\җ\Ӗ^җ^җ_Җ^З_і^ї`З`Ж`Ж_ϗaϘaϗaϘa˲˲̱̱ͱͰαϰϱаѰӰӰԯկԮ׮ح٭٬ٮڮۮܮܮݮ߭Ж͇͊̈́̂ypnmkigfecb``_ߣ^ݡ]ޡ]ݡZݠ\ܟ[ܞY۟Y۞X۞XڜYڜWٛWٛYٛXٚWٛWךWךXؚWיXיXטX֘Y՘Z՘[՘ZԘ[ԗ\ӗ\Ә\ӗ\ӗ]Ӗ]җ]Җ^ї_З^ї`З`З`З`ϗaϘaϘaϗaΘbʱ˱˰̰̯ϰΰίϮϮҮҮҮӮխծ֭׭׬ججڭۭܭܬݬެ߫ܢϊ~urqmljihffcbaߦ_ߤ^ݢ_ݣ\ݣ\ݢ[ܡ[ݡY۠ZܠYܟX۟YڝXڝWٜXٛYٜXٜW؛V؛XؚXכVךXךX֙YՙYՙZՙ[Ԙ[Ԙ[Ә[Ԙ\ӗ]Ә\җ^ї]җ_ї_ј_З`ї`З`З`ϘaИaϘaϘaϘbΙb˰ˮ˰̰ͰͮͯϰϮЯѮҭҬӭӭխի֬֬جج٫ڭڭ۬۬ݬު߫Ծ޾Ȍtrqnlkhgfddީaߨ_ާ`ަ_ަ_ޥ]ݤ^ܤ\ܣZܢYۢYۢZ۠X۠XڞXڟWٝXٝYٝXٜW؛W؛XכXכWכX֚X֚Y՚Y՚ZՙZԙ\Ԙ[ԙ\Ә]Ә]Ҙ]җ]ї^ј_ј_ї_ї`З`З`ЗaϘaϘaϘaϙaΘbϘbˮˮ̯̭ͮͮήέϭЭѭѭѭҬӫӬիի֫׫تث٫٫ڬ۬ܪݫީߪԿԽعܠ~onmjgiffb߬`ޫ`ު_ߨ^ާ^ަ\ݥ]ݥ\ܤ[ܤZۢZڣYۡWڡY٠XڠXٞX؞X؞X؞W؝X؜XלXלW֛X֛Y֛Y՚ZԚZԚ[ԙ[ә\Ә\Ә\ә]Ҙ]љ]ї^ј_ј_ј_З`ИaИaϘaϘaИaϘaΘbϘbΙbʯʮ˭̭̮ͭέάϬϬЬѬЬҬҫӫԪԫթ֪֪ةت٩ڪڪ۪۫ީߩߪԽԹֶҒpmji߰f߯ff߮cb߬`߬_ު^ߩ^ީ\ݧ\ݧ\ݦ[ܦZܤYܣYڣWڢXڢXڡW١WؠX؟X؟W؞WמXמXםX֜X֜Y֛Z֛Yԛ[՚Zԙ\Ԛ\ә\ә]ә]ҙ^ҙ^љ_љ_ј_И`И`Й`ϘaИaϘbϙaϘbΘbΙcΘcɭʭˮ˭̬ͬάͬάϬЫЫЫѫҫӪԪԩԩ֩֩ששة٪٩ک۩ܩݩުߪսԺշԳŀ߲kige߰dba߯`߭_ެ^ެ]ު\ީ\ި\ݧ\ܨZܧYۦYۤYۤYڢXڣWڢX١Y٠WؠWؠW؟XמX֞W֞Y֞Y֜Z֜YԛZԛ\ӛ[Ӛ\Ӛ]Ӛ]ҙ^ҙ^љ^љ_љ_Й_И`И`И`ИaЙaИaИaϘbϙbϘcϘcʬʬʫ˫˫˫̫ͫͪΪϫϪЪЪѪҪөөԨը֧֨ררب٨کڨۨݧݨݨߪԼʹǬ޼ʞݘsifdba߯a߯_߮^ޭ_ެ]ޫ\ު\ީ[ݩZݩYܧZܦXۥYۥWۤWڣX٣X٢W٢XءWסXנYןW֟Y֞Y֝Y՝Z՝[Ԝ[Ԝ\ӛ\ӛ]Қ]Қ^Қ^љ^љ`љ_Й_Й`Й`ИbИaϙaϙbϙcϙcϙcϙcϙcɪɫʪʪ˪˪˪̪ͩΪϩϩϩШѩҨҧӧԨԧէ֦֦צקئبڧڨۨܦݨާߩߧߨ׽ֺֻ׻׻ػعЈߵjdcc`߰^߯]߯]ޮ]ݭ\߫[ޫ[ޫYݩZݩYܨXܧXۦYڦWڥW٤X٣WأW٣VסX֡YסWןX՟X֞Z՞Y՝[ԝ[Ӝ\Ҝ\ӛ]қ]қ^Қ^њ_њ_ћ`Й`К`Й`ϙaЙaϘaϙaΘcϙcϙcϙcϙcɪɩɪʩ˩˩̨̩ͨͨΨΨϨЧЧѧҦҧӦԦԥԦե֥֦ץئ٦٦ڦܦܧަݥާߧߩߨսԺֺպպֺ׺׻ڦz޴eba_߰^߯]߯[ޮ\ޮZ߭ZެYܫYݪXܩWܨYܨXۧWڦWڥXڥX٤WؤWأXآYעXסXՠY֟Z՟Z՞ZԞ[ԝ\ӝ\ӝ]Ҝ]ӛ_ћ_Қ_њ_њ`Й`К`ϙaϙ`ϙbϚaΚbϙcϙcΙbϘcΙdȩɨɨɨʨ˨˨̧̨ͧͧϧΧϧЦЦѦҥҥӥӥԥդդգץץإإڥۥܤܥܥݧަߦߧҿӻѺҺҺԹչչΛ܎ma_]]߱\߰\ޯZޮZ߭YެXݬWݫWܪXܪWۨVۧWڧW٦V٦X٤V٤VأXآXעW֡Y֡YՠZ՟Zԟ[ԟ[Ӟ]ӝ]ҝ]Ӝ^ћ^Ҝ^ќ_ћ`њ`ЛaЛ`КbϚaϚbϙaϚcϙcϙbΙcΙdɧȦɦɧʧ˧̦˦̧̦̦ΥΦϥХХѥҤҥҤӣԤ֣գդ֤ؤؤأ٤ڤۤۤܤݤݥݥݥާߦߨèѻѺѺҺѹҺԹĐ߶e]\߱\[߱Y߰YޯXޭXޭXޭVܫWݫWݪV۩V۩UۨVڧWڦVإWפXأW֣WעX֢YաZաZԟ[ԟ\Ӟ\Ԟ]Ҟ^ҝ]ќ^ѝ^қ_Л`ЛaКaЛ`КbϚbϚbΚaΚcϚcϚcΙcΙdȧʦʦʦ˦˥˦̥̥ͥͤΥΤУϤѤФѤѣӣӣԣգ֢բ֢֣עأ٢ڣۣۣܤݣݣޤݥޤߥߦɨѺѹϹѺѺҹԹռt^[߲ZY߱Y߱XްXްWޮVݮVܭUݫUܪWܪVکVڨV٧U٧W٦VإWؤWףX֣Y֢Yա[աZԠ[ӟ\ԟ]ӟ]ҝ]Ҟ^ќ^ѝ_ѝ`Л`ϛaКaЛbКbϛbϚbϚbϚcϚcΚcΚdȥɥʥʦʥˤ̥̦ͥͥͥΣΣϤФУУҢѤӢӣԣӡԢա֢֢עءءأڣڢۢۢܢݢݥݤޣߥߦߨΫκλϻкѻҹԻӺԗ݇h[YY߳X߲X޲VޱVޯWޯVݮUݭVݬVܫWڪWکVڨV٧W٧VئWץXפXףY֢ZաZԢ\ԡ\ԡ]Ӡ]ҟ]Ӟ^Ҟ^Ҟ_ќ`М`ќaМ`МbЛbϛbϛcϛcϚcΚcΚcΚdȥʥʥʤʥʤ˥̥̤̤ͤͤΤϣУТѣѢҢҢӢӢӢԡԡա֢֡עءءڣڢڣۣۢܢݣݤޤߥޥާߨԯͺλλκλϻҺӺ}Ȉ|_Z޴XߴXW߲VޱVݱUްUݯVݭVܭVܬV۫V۪WکX٨W٧WئWץXץY֥ZգZբ[բ[Ӡ\ԡ]Ӡ]ӟ^ҟ^џ_ѝ`ў`НaНaМaМbϜbϛbϛcϛcΚcΚcΚdȤɣʤɤʣˣʤ̤̣̣ͣͣͣ΢ϢϢϡСТѢҡҡӡԡԠա֠֠֡֡ءؠ١٢ۢۡۡܢܣݣݣݤޥߦڴ˻̼̻ͻͻϺϻ|к{ӿp߶WߵWVV߳W޲UޱTݰUݯUݮVݭVܬUܫV۪WڪV٩X٨WبXاX֥Yץ[֤Zգ\գ\ԡ\ԡ]Ӡ^Ӡ^ҟ_џ_ў`ў`НaНaНaϜbϜbϛbϛcϛcΚcΛcȢȣɣʣɢˣʣˢ̢̢̣͢͢͢ΡϡϡСѡСҡҠҠӠӠԠ՟ՠ֡֠ןןٟ٠ڡڡۡۡܢܢܢݣݥޣޥߥڵĬ˻˻˻˹̻λ|ϻzлxһx؏܁d߶WVVU߳U޲TޱTްTݯVݮUܭU۬V۬UګWڪW٩W٨XקYצZץZ֤[֤[Ԣ\Ԣ]ԡ^ӡ^Ӡ^ҟ_ҟ_ў`ў`НaНaМbϜbϜbϜcϛcΛcΛcDisplayCAL-3.5.0.0/misc/media/install.bmp0000644000076500000000000045566013230230667017700 0ustar devwheel00000000000000BM[6(:z[  f3f3f3f3f3f3f3f3f3g3f3f3g4f3g4f3f4g4f3f3g3g4f3g4f3f4f4f4g4g4g4g4h4g4h5g4g4g5h4g4h4h5h5g4h5h4h4h5g5h5h5h5h5h5h5h5h5h5i5h5h5h5h6i6h6h5i6i5i5i6h6i6i6i6i6i6i6i7i6j7i6j6i6i7j6i6i7j7j7j6j7i7i7i7j7j7j7j7j7j7k8j7k8j7k7k7k7k7k8j8j8k8k8k8l8k8k9l8l8k9k9l8l8l9l8l9l9l9l9l9l9l9l9l:l9m9l9m:m:l:l9m9l9m9m:m:m:m:m:m:m:m;m;m;n:m;n;n;n:n;n;n;n;n;f3g3f3f4f3f3f3f3f3f3f3f3f3f3f4f4g4g4g4f3g4g4g3f4g4f4g4g4g4g4g4g4g4h4g4g5g5g4g4g5h4g5h5g5h5h5h5h5h4h5h5h5h5h5h5h5h5h6h5i5h6h5h6i5i5h6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6j7j7j7i7j7j6j7j7j7j7j7j7j7j7j7j8j7k7j8k7j8k8j8k7k7k8k8j8k8k8k8k8k8k8k8l8k9l8k8l9l9l9l9l9l9l9l9l9l9l9l:m9m9m:l:m9l9m9l:m9m:m:m:m:m:m;m:m:m;m:n;n;n;n;n;n;n;n;n;n;n;n;f3f3f3f4f3g3f3f3g3g3g3g3g4g3f4f4f4g3f3g4g4g4g4f3g4g4g4g4g4g4h4g4h5g4g5h4g4g5g4g4h4g4h4h5h4g5h5g5h5h5h5h5h5h5h5h5i5h5h5h6i6i5i5i6i6i5i6h5i6i6i6i6i6i6i7j6i6j6j7j6i7j7j7j7j7j7j6j7j7j7j7j7j7j7j7k7j8j7k7k7k7j7j8k8k7k8k7k8k8k8k8l8l8k8k8k8k9l8l8l9l9l9l8l9l8l9l9l9m:l:l9l9m:m9m9m9m:m9l:m:m:m:m:m:m:n:n;n:n:m;n;m:m:n;n:n;n:n;n;n;n;n;nq>p=p=p=h5g4g5h5g4g5g5h5g5h4h4g5h5h5h5h5h5h5h5i6h5h5h5h5h5h6h6i6i6h5i6i5i6i6i6i6i6i6i6i6j6j7i7j7j7i6i6j7i6j7j7j7j7j7j7j7j7j7j7j7k8j7j7j7k8k7k7j8k8k7j7k8k8k8k8k8k8k8l8k8k8k8l9l8k8l8l8l9l8l9l9l9l9l9l9l9l:l9l9m:l9l9l9l:m:m:m:m:m:m:m:m:m;m:m:n;n:m;m;n;m;n;m;n:n;n;n;o;n;n;n;n;op=p=p=q>q=p>g5h5g4g5g4h5g5h5g5h5h5h5h5h5h5h5h5h5i5i5h6h5i6i5h5i5i6i6i6i6i6i6i6i6i6i6i7i7i6i6i7j7i7i6i7i6j7j7j6j7j7j7j7j7j7j7j7j7j8k7j8j8k8j8k8j8k8k7j8j8k7k8k8k8k8k9k9k8k8k9l8l9k9k9l9l9l9l9l9l9l9l:m9l9l:l9l9l:l:m9l:m:l:m9m9m:m:m:m:m:m:m:m:n;n:n:m:n;n;n:n;n;n;n;n;n;n;n;op=p=q>q=p>q=h5h5g5g5g5h5h4h5h5h5h5h5h5h5h5h6i6i6h5h5i5h5h5i5i5i6h6h6i6h6i6i6i6i6i6i6i7j6j6i6i6i7j6i7i6j7j7j7j7j7j7j6j7j7j7j7j7j8j7j8k8j7j7k8k8k8j8k8k8k8k8k8k8k8k8k8l8l8l9l9l8k8k9l8l8l9l8l9l9l:l9l9m9l9m9l:m:l:l9l:m:l:m:m:m:m:m:n:m:m:m;m;m:n:m;n:m;n;n;n;n;n;op=q=q=q=q>q>h4g5g5h5h5h5h5h5h5h5h5h5i5h5i6i5h5h5h5h6h6h5i6i6i6i6i6i6i6i6i6i6i6i6i6i6j6i6j7i7j7j6i6j7i7j6i7j7j7j7j7j7j7j8j7k7j8j7j7j8k7j7k8k8k8j8k8k8k8k8k8k8k8l9l8k8l8k9k9l9l9l8l9l9l9l9l9l9l9l9m9m9m9l:m:m9l9m9m9m:m9m:m:m:n:m;m:m:n;m:n;m;n:m;n:n;m;n;n;o;np=q>p=q>q>q>q>q>h5g5h5h5h5h4h5h5h5h5h5h5i6h5h6i6h5i5i5h5i6i5h6i5h6i6i6i6i6i6i6i6i6i6i6i7j7j6i7j6i6i7j6j6j7j7j7j7j7j7j7j7j8j7j7j7k7k7j7j8j8k7k8j7k8k8k8k8k9k8k9l8k9l8l8k9l9l9l9l9l9l9l9l9m9l9l9l9l9l9l:l9l9m9l:l9l:m:m:m9m:m:m:m:m:n;m:m:n;n:n;m:n;n;n;n:n;n;n;n;nq>q=q=q=q>q>q>q>q>q>q>q>q>h5h5h5h5h5h5h5h5h5h5i5h5i6h5h5h6h6i5i5i5i6i6h6i6i6i6i6i6i6i6i6i7i7i7i6i7i6j7j7j7j7j7i7j7j7j7j7j7j7j7j8j7k8j7d4[0\0f5k7k8k8k7k8k8k8k8k8k8k8k8k9k8l8k8l8l8l8l8l8l9l9l9l9l9m9l9f6\1]2f7m9m:m9m9m:m:l:m:m:m:m:m:m:m:m:m:n:n:n:n;m:n;n;n;n;n;o;o;n;np=p=q>q>q=q>q>q>q>q>q>q?q>h5h5h5h5h5h5h5h5h5i5h5h6i6h6h5h5i5i6i5i6i6i5i6i6i6i6i7i6i6j7i7i6i6i7j6j7j7j6j7j6i6j7j7j7j7k7j7j8j8j7j8k7j8i6vY\0k8k8k8k8k8k8k8k8k8k8k9k8k9k8l8l8l9l9l9l9l9l9l:l9l9m9l:l8y[gFj7l9m:m:m:m:m:m;m:m;m:n:n;m;m;n;n;n;m;n;n;n;n;n;nq>p>p=p>q>q>q>q>q>r>q>q>q?r?q>h5h5h6h5h5h6h5h5i6h6i5h6h6i6h5h6i6h6i6h5i6i6i6i6i6i6i6i6i6i7j6i7i7j6j6j6i6j7j7j7j7j7j7j7j7j7j7k7j7j8k8j7k8h5qWW-k8k8k8k8k8k8k8k8l9k8k9l9l9k9k9l9l9l9l9l9l9l9l:l9m9l9l9l:]2d4m:m:l:m:m:m:n:m:m:m:m:m;m;n;n;n;n;m;n;n;n;n;np=p=q=q>q>q>q>p>q>q>q>q>q>r>r>r?r>r?q?h5h5h5h5h5i5i5i5h5i6h5h6h5i6i5h6i6i5i6i6i6i6i6j6i6i7i6i7i6i6i7j6j6j7j7j7j7j7j7j7j7j7j7j7j7j7k7k7k7j7j7k7j8g6qWW-k8k8k9k8k8k9k8l9k8l8k9l8k9l9l9l9l9l9l9l9l9l9l9l9l:l:l9l9g6yY0k9m:m:m:m:m;m;n:n:m;n;n;m;n;m:n;n;n;n;n;n;nq>p>p>q>q>q>q>q>q>q>q>q>q>q>q?q>r?r?q?i5i5h5h5h6h6h5h5i6h6i6i5i5i6i6i6i5h6i6g5`1Y.U,U-U-U,V,U,V,[/`1e4j7j7j7j7j6j7f5\0[/c3i7i7e4_2Y/V-Y.]0e5j7j7h6qX|T,a3Y0W-Y/`2h6l8k9l8g7^2\0d5k8l9j8c4[0X.[/_2f7h8b3_3g6l:l:l8\1f6m:m:m:n:n:m:m:n;n;k:e7_3[1Y0Y0Z0^2e6j9o;j9a5[1]1c5l:o;op=q>q>q=q>q>q>q>q>q>q>r>q?r>r?r>q>r?h6i5h5i5h6h6h6i6h5i5h6i5i6i6i6i6i6j6i6c3߷pW^1g5j7j7j7j7]0zd4^1yȠy^2i7h6qXpU>¼rXd5j9l8^2{h7j8_2ȠyW-øwZk9m:m:d5ԉ]2m:m:n;m;n:m;m:m9g6Y0߸sYb5b5ùd6oq>q>q>q>q>q?q>q>q>r?r?q?r?r?r?r?r?r?i6i5i6i6h6h5i5h6i6i6i6i6i6i6i6i6i6j6i7a2Y.f5j7j8j7Z/x`1b3h6qX~ie4k9[/yf6d5rXj8m:m:d5rXi9n:n;m;m;n;k9a4yýY0gFl:oq>q>q>q>q>r?r?q>r>q>r?r?r>q?r?r?r?r?r?h5i6i5i6h5i5i6h5i5i6i6i6i6i6j6j6j6i6i7b3~gS}T,V-U-V,V-wQ*ԃY.h5j7j7Y/xa3jꤔ|T,W-zR+gEg6qXԀ`BW.V.`CgFi7[0yf6^2wR+X/W-~irXj8m:l:]2¼a5n:n;n;m;m;c5~W/h8o=o=oq>q>r>q?q>q>q?q>r?q>q>r?r?r?r?r?s?r?r?i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i7i6i6i6b2qWg5j6j7i7j7g5^1zg]0j6j8Y/ye5e5_1c4i7k8i7}U,yd5qXvP*h7k8l8f5bCd4[0yg6^1^1j9k9e6mVrXj8m:h8~jeFj9n;n;n;h8jߍqX_4d7e7c5]3ya5b5ԂY0f7e7f8e8e8e6|U.f7tYw~W0\2\2\2\2_4g9o=q>r>q>q?r>q>q?r?q?q?r?r?r?r?r?r?r?s?s?s@h6i6i5i5i6i6h5h6i6i6i6j7i6j6j6i6i6i6j6a3pWf5j7i7j7j7j7i7_1ye5j7Y.yf5k8j8k7k8g6a3|]Ayd4rXX.k8k9l9l9^2Ԋ^2[0yg7d4ꮠ|T-X/W.hTrXj8n;a3¼ſſe6n;n;m;^2qXh7nq>q>q>q>q>q>q?q?q>q?r?q?r>r?r?r?r?r?r?r?r@s?s?r?r@r?h6i5i6i6h6i6i6i6i6i7j6j6j6i6j6j6j6j7j7b3qWf5j7j7j7j7j7j7h6V,_2k8Z/yf5j8i7b3Z/qW[/h6rXW.l9l9l9l9c4Z0[0yg7k8^2¸sXj9j9eFx{hZ0l:n;j9jc6o;o;o;oq>q>q>q>q>r>r>q>r>r?r?r?r?r?r?r?r?r?r?r?s@r@r@r?s@s@i6h6i6i6i6i6i6i6j6j6i6i6i6i7j6i7i6j7j7b3qWg5j7j7j7j7k7j7k7_1W.k7Y/yf5g6[/ȒsYf6h7qXX.l9l9l9l9d5Y0[0yg6l:j7b3eDsYj8d6߄[1\1g7n;e6eEl:oq>q>q?q>q>r?q>r>q>r?r?r?r?r?r?r?r?s@s?r@r?r?s@s@s@h6i6i6i6i6i6i6i6i6j6j6i7j6j7j7i7j6i7j7b3qWh5k7j7j7j7j7k8k8b4rXi6Y/yd4[0ӸcC^2g7k8i7rXX.l9l:l:m9d5[0[0yg7m:l:m:j8d5^2[0X.iTrYi7Y0e6f7Ԋ^2n;b5¼߈]2onr>q>r>r>q?r?r>r>r>r?r?r?r?r?r?r?r?s?s?r?s@s@s@s@r@s@i6i6i7i6i7i6i7j6i7i7j7j7j7j6i6j7i7i7j7b3qWg5j7k7j8k8k7k7j7e5x~ig6Z/ya3wZ0c3i6l9l9k9i7rXV-k9l9l9l9b3߉\2[1yg7m:m:m:m:m:m:m:k8rXtYd5gFk:k9gGrXk:`4Ԋ_4onq>q>q>r?r?r>q?r?r?r?r?r?s?r?r?r?s?r?s@r?s@s@s@s@s@s@i6i6i6i6j7j6i6i7i6j7i7i6j7j6j7i7j7j6j7b3qXg5k7k8k8j8k8j8j8e5x~ig6Z/y_2~V-i8k9j8f6f6j8i6rXzgc4k8l9k8X.b4[1yg7m:g7^3^2f6l:n;f6yX/[1b6n;o;b6¼b5`4ԋ_4onq>r>r?q?r?r?r?r?r?r?r?r?s?s?s@s@s@r@s@s@s@s@s@s@tAsAi6i6i6i6i6j6j6j7i7j7j6i7j7j7j7i7j7k7j7b3qXg6j8k8k7j7k7k8j8c4rXj8[/yc4jxfV-X.{S,d5i8rXx}U-X.zS-yg7[1yg7m:nI꜉y~V.Y/vQ+Ȇ[1yrXk9nq>n=tZzlr?r?r?r?s?r?s@r?s@s?r?s@s@s@s@s@s@s@tAsAs@sAi6i6i6j7i6j7j6j7j7j7j7j7j7j7j7j8k7j7k7c3qXh6j7k7j8k8k8j8k8_2X.k8Z0ye5`2a3i7rX격`3l9[1yg7m;b5sYZ0Ԋ^4n;o;n;n<_3]2eFl:pp=p=h9Ԋ^3[2kl;q>q>nq>q>n=tZ{lp=q=q=d7¼i:q>q>q?o=u[{lp=q>l;khHnr>q>o=uZ{lp=q>p>_4ýd8q>r>q?q?oq>r>g9kmr?o=u[{lq>r>q>q>nz]|n=s@s@s@s?s@s@s@sAs@s@s@tAtAsAs@sAsAsAtAtAtAtAtAuAtAtBuBj7j7j7j7k7j7j8k7j7j8k7j8k7k8k8j8k8k8k8i7b3Z/W-W.W-X.W-X.X.\1c4h7l9l9l8l9l9i7iFd6l9l:m:l9l:l:m:m:m:m:m:m:m;m;n:m:m:m:n;n;m:n:n;n;a4{j9olq>q>q>q?q>r>kr?s?s@r@s@s@sAtAs@sAt@t@tAtAt@tAtAtAtAuBtAtBtBtAuAuBtBj8j7j7j7k7k7j8k7j7k8k7j8j8k8k8k8k8k8k8k8k8l8k8k8k8l8k9l8l8k9l8k9l9l9l9l9l:l9g7^2]1d5j9m:l:m9l:m:m:m9m:m:m:m:n:m:n;n:n;n;n;m:m:n;n;n;n;j9`3^2f7m:n;o;n;nq=q>q>q>q>q>q>q?q>q?q>r>r?q>r?r?q?r?r>r?r?r?r?r?r?s@s?s?s@s@s@r@s@s@s@s@s@sAs@s@tAtAtAtAtAtAtAtAtAtAtAtAuAtAtAtBuBuBuBj7k7k7j7j7k7k7j8k8k8k7k8k7k8k8k8k8k8k8k8l8l9l8l8l8l8l9l9l9l9l9l9l9l9l9l9l9l9l9m9m:m9l:l:m:m:l:m9m:m:n:m:n:m:m:n:n:m:n:m;n:n;m;n;n;n;n;n;n;n;n;o;nq>p=q=p=p>q>q=q>q>p>q>q>q>q>q>q>q>r>q?r?r?q?r?r?r>r?r?s?r?r?s?r?r?r@s@s@s@s@s@sAs@s@s@s@s@tAt@tAt@tAtAsAtAtAuAuAtBuAtAtBuBuBuBuBuBuBk7j7j8k7j8k7k8k8k8k8k8k8k8k8k9k8l8k9k8k8l8k8l9l8l8l9l9l9k9l9l9l9l9l:l9l:m:l9m:m9l9m:m:m:m:m9m:m;m:m:n;m:m:m:n:n;n:n;n;n:m;n;n;n;n;n;nq>p=p=p=p=q=p>q>p>q>q>q>q>q>q>q>q?q>r>q?q>r?q?r?r?r?r?r?r?r?r?s@r?s@s@s@s@r@s@s@s@s@s@sAtAs@sAs@t@tAtAtAtAtAtAtAtAtAuBuBtBuAuBuBuBuBuBuBuBk7j8j8k8k7k8k8k8k8k8k8k8k8l8k8k8l8k9l8k8l8l8l9l9l9l9l9l9l9l9l:m:m:m9l9m:l:l9l9m9m:l:m:m:m:m:n:m;n;m:m:m:n;m;n;n;n;n;n;n;n;n;n;o;n;n;nq>q=q>p>q>q>q>q?q?q>q>r>q>r?q>q?q?r?r?r>r?r?r@r?s?r?s@s?s?s@s@r@s@s@s@s@s@s@s@s@sAtAs@sAtAtAtAtAtAtAtAtAtBuBuAuBtBuBtBuBuBuBuBuBuBk8k8k8j8j8k8k8k8k8k8k8k8k8k8l8k8l9l9k9k9l8l9l9k8l9l9l9l9l9l9l9m9m:l9l:m:m9m:l:m:m:m:m:m:m:m:m:n:n:n;m:m;n:n;m;n;n;m;n;n;o;nq=q>q>p=q>q>q>q>q>q>q>r>q?q?q?r?q?q?r?r?r?s?r?r?r?s?s@s?s@s@s?s@s@s@s@s@s@s@t@s@sAtAtAtAt@tAtAtAuAtAtAtAuAuBuBtAuBuAuBuBuBuBuBuBvBvBvCk8k8k8k8k8k8k8k8k8k8k8k9l8k8l8k8l9l9l9l8k8l9l9l9l9l9l9l9l9l9l9l9l9l:m:m:m:m9m:m:m:m:m:m:m:m:n;m;m;n;n;n;n;n:n;n;n;n;o;o;n;n;np=p=p=p=p=p>p>q>q>q>p>q>q>q>q>q>r?q>r>r>q?r?r?q?q?r?r?r?s?r?r?r?s?s@s?r?s@s@r@s@s@s@s@sAs@sAs@tAsAtAtAsAtAtAtAtAtAtAtAtBuBtBuBuAtAuBuBuBuBuBuBvBvBvCuBvCk8k7k8k8k8k8k8k8k8l8l9l8l8l8k8k9l9l8l9k9l9l9l9m9l9l9m9l9l9m9m:m9l:m9m:m:l:m:m:m:m:m:m:m:m;n;m:n:m:n:m;n:m;n;n;n;n;n;n;np=q=p=p=q>p=p>q>q>p>p>q>q>q>q>q>r?r>r>r>r?r?r?q>q?r?r?r?r?r?s?r?r?r?s?s@s?r@s@s?s@s@s@s@s@s@s@t@tAtAtAsAtAtAtAtAtAtAtAuBtBuBuAuBuBtBuBuBvBuBuBuCuBuCuCvCvBuCk7k8k8k8k8k8k8k8k8l9k8k9k9k9l8l9l9l9k8l9l9l9l9l9l9m:l9l9m9l9m:m:m:l:m:m:m:m:m:n:m:m:n:m;n:m;m;n;n;n;n;n;n;n;n;n;nq>p>q>q>p>q>q>q=q>q>q>q>q?r?q?q>r?q?q?q?r?r>r?r?r?s@r?r@r?r?s?s@r@s@s@s@s@sAs@s@s@s@s@sAt@tAtAtAtAt@tAtAtBtAuAtAtAuAuBtBuBtAuBuBuBuBuBuBuBuCuBvCvCvCvCvCk8k8k8l8k8k8k8k8k8l8k8l9l9l8l9l9l9l9l9l9l9l9l9l9l9m:l:m:l:m:m:l:m9l:m:n:m:m:m;n:n:m;m:n:n;n:n;n;n;n;n;n;n;n;n;o;n;oq=q>p>q=q=q>q>q>q>r>q>q?r>r>r>q>q?r?r?r?r?r?r?r?s?s?s?s?r?r?s@r@s@s@s@s@s@s@s@t@tAs@t@sAtAtAsAsAtAtAtBtAuBtAtAuAtAtBuBuBuBuBuBuBuCuCuBuCuBuCvBvCvCvCvCvDk8k8k8k9k8k8k9k8l8l8l9l9l8l9k9l9l9l9l9l9l9l:l9m9l:m:m:m9m9m:m:m:m:m:m:m;m:m:m:n:m:n;n:m;n;m;n;n;n;n;o;o;n;oq>p=q>q>q>q=q=q>q>q>q?q>q>q>q?r?r?r?r>r?r?q>r?r?r?r?r?r?r?s@s@s?s@s?s@s@s@s@s@s@s@sAsAt@s@sAt@s@tAtAtAtAuAuAtAtAuAtAuAuAuBuBtBuBuBuBvBvCuBuBuCvBuBvCvCvCvCvCvCwCk8k8k8k9k8k8l8k9l9l9k9l9l9l9l9l9m9l9l9l9l9m9m:m9l:l:m:m:m:m9m:m:m:m:n:m:n;n;n:n;n;n;n:n;n;n;n;n;n;n;n;n;n;nq=p>q>q>q>q>q>q>q>q>q>q>q?q>q>r?r?r?r?r?r?r?r?r?r?r?r@s?r?s?r@r@r?r@s@s@s@s@sAtAsAs@t@sAtAtAtAtAtAtAtAtAuBuBtBtAtBtAuBuAuBtBuBuBuBvBvCvBuCuBvCvCvBvCvCvCvCvCvCvDvCk8k8l9l9k8l9l9l9k9l9l9l8l9l:m9l9l:m9l9l:m:m:l:m:m:m:m:m:m:n:m:n:m;m:m;m;m:m:m;n;m;n;n;n;n;n;n;n;o;n;np>p=q>q=q=q>q=p=p>q>q>q>q>q?q>q>r>q?r?q>r?r>q?r>r?r>r?r?r?s?r?r@r@s?s?r@r?s@s@s@s@s@s@s@s@sAsAsAs@s@sAtAtAtAtAtAtBtAuBuBtBtAuAuBuBuBuBuBuBuBuBuBvBuBvBuBuBvBvCuCvCvCvCvCwCvCwCvDl9k8l8l9l8l9l9k9l8l9l9m9l9l9l9l:m9l:l9m:m9l9m:m9m:m:m:m:m:n:m:m:n:m;m;n:n:n:n;m;n;n;n;n;n;n;o;n;np>q>q=q>q>p=q>q>q>q>q>r>r?r>r>q>r?r?r>r>r?r?r?r?r?r?r?s@s?r?r?r?s@s?s@s@sAt@s@s@t@tAtAs@t@tAtAtAtAtAtAuAtAuAuAuBtAtBtAuAuBuBuBuBuBuCvBuCuBuCvBvCvBuCvBvCvCvCvCvDwCvCwDvDvDl9k8l9l9l9l9l9l9l9l9l9l:l9l9m9l:m:m9m:m9m9m:l:m:m:m:m:m:m:m:m;n:n;n:m:n;m;n;n;n;n;n;np=p=p=p>p>q>p>p=q>q>q>q>q>q>q>q?r>q>r>q?q?q>r>r>r?r?r?s@r?r@s?r?r@r@s@r?r@s@s@s@s@sAt@sAs@tAsAtAt@tAt@tAtAtAtAtAtAtAtBtAuBuAtBuBtBuBuBuBvCuBuBuBvCuBuCuBvBuBvCvCvDvCvDwDvDvCvDvDwCwDwDl9l8l9l9k9l9l9l9l9l9l9l:l9m9m:l9m9m:l:m:m9m:m:m:m:m:m;n:n:m;m:n:n;n;n;n:n;n;n;n;o;nq>p=q=q>p=p>q>q=q=q>q>q?q>q>q?q?r?r?q>r?r>q?q>r?r?r?s?r?r?s@s@r?s@r@s@s@s@s@s@s@s@sAs@sAsAs@s@tAtAsAtAtAtAtAtAuBuAtAuAtBtAuAuBuBuBuBuBuBuBuBvCvBuBvBuCuCvCvCvCvCvCvCwCvDwDwCvDvDvDwDwDwCl9l9l9l9l9l9l9m9l9m9m9m9l9l:m:m9m:m:m:m:m:m:m:m:n:m:m;m:m;m;m:n:n;m;n;n;n;n;n;o;o;n;nq>q=q>q>q=q>q>q>r>r?q>q>r?r?r>r?r>r?r?r?r?r?r?r?s@r?s?s@s?r?s@s@s@s@s@s@sAs@tAsAs@tAt@tAtAtAtAtAtAuAtAtAuAuBtBuBuBuAuAtBuBuBuBuBuBuCvCuCvCvBvCvBvCvCvCwCvCvCwCwCvDwDwCwDwDwDwDwDxDk9l9l9l9l9l9m9l9m:l9m:m9l:l:m:m9m:m:m:m:n:m:n;n:n:m;m;m:m:n:m;n;n;n;n;o;n;n;np>p>q>p>q>q>q>p>q>q>q>q?q>r>r>r?q?r?q?r?r?r?r?r?r?r?s?s?r?r@s?r?s@r@s@s@s@s@s@s@sAs@t@sAsAtAtAtAtAsAtAtAtAtAtBuAtAuBuAuBuBuBuBuBuBuBuCuBvBvCvCvBvCuCvCvCvCvCvCvDvCvDvCvDwCwDwCwDwDwDwDwDwDxEl9l9l9l9l9l9m:m:l:m:l:m9m9m:m:m:m:m:m:n:m:n;m:m:m;n;n;n:m;n;n:n;n;n;o;n;n;o;n;np=q=q=p=q>p>q>q>q>q=q>q>q>q>q>q>q>r?q?q?r>r?r>r?r>r?r?r?r?s?r?s?r?r@r?s?s@s@s@s@s@s@tAs@tAs@tAt@sAtAtAtAsAtAtAtAtAtAuAuBuBtBuBtBuBuBuBuBuBvBuBuBuCvBuBvCvCvCvCvCwCwCvCwCvDwDvDvDwCwDwDwCwDwDwDwDxEwDwDl9l:l9l9m:l:m9m:m9m:l9m:m:m:m:m:m:m:m:m:n;n:m:m;n:m:n;n;n;n;n;n;n;np=p>q=q>q>q>q>q>q>q>q>q>q>q?q?q?q?r>r>r?r?r?r?r?r?r?r@r@s@r?r@r@s?s@s@s@s@s@t@s@s@s@tAtAtAtAtAt@tAtAtAtAtAuBuAuAuAuBuAuBtBuBuBuBvCuCvBuCuBvCuBvCvCvCuCvCvCvCvCvCvDwCvCvCwDvCwDwDwDwDwDxDxDwExExDwDm9m:l9m9m9l9m:m:m9m:m:m:m:m:m:n;m;m:m:m;m:n:n;n:n:m:n;m;n;n;n;n;n;n;oq>q=p=p=p=q>p=q=p>q>q>q>q>q>q?q>q>q>r?r?r>r>r>q?r?r?r?s?s?r@s?s?s?s@s@s@s@s@s@s@s@tAs@s@sAsAsAsAtAtAtAtAtAtAtBtBtAtBtAuAuBuAuBuBuBuBuBuBvBuCuBuBuCvBuBvCvCuCvCvCvCwCwDwDvCvDvDwCvDwDwDwDwDwDwDwDxDxExDwEwExDl9l:m:l9l9m:m:m:m:m:m:m:m;m:m:m:m;m;n:n:n;n;n;n;n;n;n;n;op>p=p=q=q=q=q=p=q>q>q>q>q>q>q>q>q>r?q?r>q?r?r?q?q?r?r?r?r?r?s?r@r?s@s?s?s@s?s@r@s@s@sAt@sAt@s@t@t@tAtAtAtAtAtAtAtAtAtBuAuAuAuAuBuAuBuBuBuBuBuBuCuCuCvBvBuBuCuBvCvCvCvCwCvCwCvDwDwDwCwCwDwDwDwDxDwExDxDxEwDwEwDwExDwEl:m9m9m9m:m:m:m:m:m:m:m;n:m:m;n;n;n;n;n;n;n:n;n;n;o;o;n;n;n;np=p=p>p=q>q=q>q>q>q>q>q>q>r>q>q?q>r>r?r?q?q?r?r?r?r?r?s?s@s@r@r@r@s@s@s@s@s@s@s@t@s@s@t@tAsAsAsAsAtAtAtAtAtAtAtAuAtBuAtBtBuAuAuAuBuBuBuBuCvBuCvBuCvCvCvCvCvCvCvCvDvDvDwDwDwCwCvCwCwDwDwDwDwDwEwExDwDxDwExExExExExEm:l:m:m:m:l:m:n:m:m:n:m;n;n:n;m;n:m;n;n;n;n;n;n;n;n;n;n;n;n;op=p=q=p>q>q>q>q>q>q>q>q>q>r?r?r?q>r>r>q?r?r?r?r?r?r?r@s?s@r@s@s?s?s?s?s@sAs@s@s@t@s@tAt@tAtAsAtAtAtAtAtAuBtAuAuBuAuBuAtBuBuBuBuBuBvBuBvBuBvCvCvCvCvCvCvCvDvCvCwCvCvDwDwDvDwCwDwDwDxEwDxDwDxEwDwDxExDxExDxExExEyExFm:m9m:m:m:m;m:m:m:m:m;m:n;n:n:m:n;n;m;n;n;n;n;o;o;o;n;np=p=p>q=q>q>q>p>q>q>q=q>q>r>q>r?q>q>q?q?r?r?r?r?r?r?r?r?r@r?r?s@s@s@s@s@s@s@s@s@s@s@t@sAt@sAsAtAsAtAtAtAtAtAtAuAtBtAuBtAuBuBuBuBuBuBuBuBvCvBuCuBvBvCvCvCvCvCvCvCvDvCvDwCwDvDvDwDwDwDwDwDwDwDwEwDwDxEwEwEwEwExExExExEyEyEyFyEm:m9m:m:m:m:m;m:m:m;m;n;n;n;m;n;n;n;n;n;n;n;np=q>q=p>p>q=p>q>q>q>q>q>q>q>q>r>q>q>q>r?r?r?r?q?r?r?r?r?r@r?r@r?s@s?s@s@r?s@s@s@s@s@s@sAs@t@tAt@sAtAtAtAtAtAtAtAtBtBtAuAuBuBuBuBuBuBuBuBuCuCvBuCvCuBvBvCvCvCvCwCvCwCwCwCvCvDwCwCwCwDwDwDwDwDwEwEwEwExDxDxExExExDxExFyExEyFyEyFyFm:m:m:m:m:m:m;n;n;n:m;m;m;m;n;n;n;n;n;n;op=q=q=q>q>q>q>q>q>r>q>q?r>q>q>r?r?q?r?q?r?r?r?s?r?r@r?s?s?r@s@r@s@s@s@s@s@s@s@s@t@s@t@tAtAtAtAtAtAtAtAtAtAtAtBuAuBtAuBtBuBuBuBuCuBvCuCvCuBvBvCvCuCvCvCvCvCvCwCvCvCwCwDvDwDwDwDwDwDwDwEwDwExExExExEwExExExExExExExExEyEyFyFxFm:m:m:m:m;m:n:m:m:n;m:n;n;n;n;o;n;nq>q>q>p>q>q?r>q>q>r?r>q?r?r?r?r?r?r?r?r?r@r?r?r?r?s@s?r@s@s@s?s?s@s@sAt@sAt@sAsAs@sAtAtAtAtAtAtAtAuAuBuBuBtAuBuAuBuAuBuBuBuBuBvBvBvBvBvBvBuCvCvCvCvCvCvCwCwDwCwCwDwDvCwDwDwDwDwDwDwDwEwDxDxEwDxExDxExExExExExExExFyExEyEyEyFm:m;n;m;n:m:m;n;n:m;n;n;n;n;o;np=q>p>p>p=p>q>p>q>q>q?q>q>q>q>r>q>r>r?r?r?r?r?r?s@r?r?r?s@r?r@r@s?s?s?s@s@s@s@s@s@sAtAsAtAsAt@sAtAsAtAtAtBtAtAuAuBtBtBuBuBuBuAuBuBuBuBuBuCvCuCvCvCvCvCvBvCvCvCvCvCwCvCwCvCwDwDwCwDwDwDwDwDxDwExDxDxDxEwExExExExExExFxEyExFxEyFyEyFyEyFyFyFm;m:n;m:m:n;n:m;n;n;n;n;n;np=q>p=p=p>q=p>q>q>q>q>r>q?r?q>q>q?r?q?q?r?r?r?r?r?r?s@r?s@r?r?r@s@s@s?s@s?s@s@s@s@s@sAs@sAtAsAt@tAsAtAtAtAtAtAtAuAtBtBuBuBuBuBuBuBuBvBuBuBuBvCvBvCuBvCvCvCvCvCvCvCvCwDwCwDvDvDwDwCwDwDwDxDwDwDxDwExDxDxExEwExExExExExExExExEyEyExFyFyEyFyEyFyFyGm;n;n;m:n;m;n;n;n;n;np=q>q=p=q=p>q>q=q>q>q>q>q>q>q?q?q?r>q>r?r?q?q?r?r?r?r?r?r?r?r?r?r?r@r?s@s@s?s@s@s@s@s@t@sAs@tAsAtAtAtAtAtAtAtBtAtAtAuBuBuBtAuBtBuBuBuBuBuBvBuCvCvCvBvCvCvCvCvCvCvDvCvDvDvCvDvDwDwDvCwDwDwDwDwDxDwDwDwEwEwDwExExExExExEyEyExEyFyEyFxFyExFyFyFyFyFzFyGn;n:n;m:n;n;n;n;nq=q>q>q>q>q=q>q>q>q?q>q>r>q>r>r>r>q>r?r?r?r?r?r?r?r?s?r@r?s?r@s?s@r@s@s@sAs@s@t@t@t@tAsAtAt@tAsAtAtAtAtAtAtBtAuBtBtBuBtBtBuBuBuBvBuBvCuBvBuBvBvCvCuCvCvCvCvDwCvDwCvCvDwCvCwDvDwDwDwDwDwEwExDxExExExDxExExExExExExFxEyEyExFyFyEyFyFyFyFyFyFyFzFyFm:m;n;n;n;np>p=p=q=p>p=p>q>q>q>q>q>r>q>q>r>r>q>q?q>r?q?r>r?r?r?r?r?r?s?s?s@s@s@r@r?s@s@s@s@t@s@t@t@tAs@t@tAt@t@tAtAtAtAtAtAuBuAuBuAtBtAuBuBuBuBuCuBuBvBuCuBvCuBvBvCvCvCvCvCvCwCvCvCwCvDwDwDvDwDwDwDwEwExDwDwDwDxExEwDxExExExExExExExExExFxExEyFxFyEyFyFyFyFyGyFzFyGzFzFn;n;n;n;n;nq>q=q>q>q=q=q=q>q>q>q>q>q>q>q?q>q?r?r?q?q?q>r?r?r?r?s?r@r?s@r@s@r?s@s@r@s@s@s@t@s@s@s@tAsAsAsAt@tAtAtAtAtAtBtAuAuBuAuAuBtAuBuBuBuBuBuBuBuCuBuBuCuBvCvCvBvCvCvCvCwCvDvCvDwCvDwDwCwDwDwDxDwDwDwDwDwDwDwDxExExDxExExExExExEyEyFyEyFyFyFxFyFyFyFyFyFyFzFyGzFzFzGyFn;n;o;n;n;o;n;op=q>q>q=q=q>q>q>q>q=q>q>q>q>q?r?q?r?r?r?q>r?r?r?r?r?r?r@s?r?r?s@s@r?r@s@r@s@s@s@s@t@t@tAsAsAsAtAt@tAsAtAuAtAtAtAuAtAuAtBtAuBuBuBuBuBuBuBuCvCuBuCvCvCvCuCvCvCvCvDvCwCvCwCvCvCwDwDwDwDwDwDwDwEwDwDxExExEwExExExDxExExFxExExExFxEyFxFyFyEyFyFyFyFzFyFyFyGyFzFzGzGzGzGn;n;n;n;op>p=q>p=p>p>q>q>q>q?q>q>q>q?r>r?r>r>q?r?r?r>r?r?r@s?r?s?r@r@r@s?s?s?s@s@s@s@s@tAs@sAt@sAt@sAt@tAtAtAtAtAtAuAuAuAtBtAuBuBuBuBuAuBuBuBuCuBuCvBvCvBuBvCvCvCvCvCvCvCvCvCwCvDvDvDwCwDwDwDwDwDwDwDxDxDxDxExExDxExExEyExExExFxExEyEyEyFxFyFyFyFyFyGyFyGyFyFzGzGyGyGzGzGzHzGo;n;o;oq>p>p>p=q>q>q>q>q>q>q?q>r?q>q>q?r?r?r?r?r?r?s@r?s@s?s?s@r?s@s?s@s@s@s@s@t@s@sAtAtAs@sAtAtAtAtAtAtAtAuAtAtBtAtBuBuBuAtBuBuBuBuBuBuBvCuBvCuBvBuBvCvCvCvCvCvCvCvCvDwDwDwDwDwDwDwDwDwEwDxDxDxDxDxExExExDxExExExExEyExExExEyFxFyFxEyFyFyFzFyGyFzGyFyGzGzGzGzGzGzGzGzGzGn;np=q=p=p=q=q=q=p>q=q=q=q>q>q>q>r>q>q?r>q?q?r?r?r>r?r?r?r?r?r@s?r@r?r?r@s@s?s?s@s@s@s@s@s@t@tAtAt@t@s@tAsAtAtAtAtAtAtAtAtAtBuAtBtBtBuAuBuBuBuBuBuBvBvBvBuCvCvCvCvCvCvCvCwCwCvDwDvDwDwDwDwDwDwDwDwDwDxDwEwDwEwDwEwDxExDxExExExFxExEyFyEyEyFyFyFyFyFyFyFyFzFzFyFyFyGzGzGyGzGzGzGzHzHzHzGo;op=p=q>q=p=q>q=q=q>q>q>q>q>q>q>q>q>r?r>q>r>r>r?r?r?r?r?s?r?s?r?r@r@s@s@s@s?s@s?s@s@s@s@s@s@s@tAt@tAs@sAtAsAtAuAtAuAtAtAuBtBtBtBtBuBuBuBvBuBuBuCuCvBuCuBuCvCvCvCvCvCvDvCvCvDvCwCvCwDwCwCwDwDwDwDxEwDxDxExExEwExEwExExExExExExEyFyFyEyEyEyFyFyEyFyFyFzFyFzFyFyGyFzGzGzGzGzGzGzGzGzG{H{GzHo;oq>p>p>q>p>q>q>q>q>q>q?q>r?r>q>r?r?q?q?r?r?r?s?r?r?s?s?s?r?s@s@r@r?r?s@t@s@sAs@sAt@s@sAt@s@t@t@tAtAuAuBuAuAtAuAtBuAtAtAuBuBuBuBuBvBuBvBuBvBvCvBvCvCvCvCvCvCvCvDvCwDwDwDwDwDwDwCwDwEwDxDwDwEwExExExExExExExExExExExFyExFxEyEyEyFyFyFyFyFyFzFyFyFyGzGzFzGzGzGzGzGzGzG{GzHzH{G{G{HzHnp>q=p>q>q>q>q>q?q?q?r>q>q?q?q?q>q?q?r?r>r?r?r@r?r@s?r@s@s@s?s@s@r@s@s@s@sAsAtAsAt@tAt@tAsAtAtAtAtAtAtAtBtAtBtAuBuBtBuBuBuBuBuBvBuBvBuBuCuCvCvCvCvCvCvCvCvCwDwCvCvCwDwDwDvDwDwDwDwDxDwEwDxEwDwDxExExExExExExExExFyEyEyExFyFyFyFyFyFzFyFzFyGzFyFyGzGzGzFzGzGzGzGzGzG{G{GzHzG{H{HzH{Hoq=p>q=q=p=q=q>q>q>q?r>q>q>r>r>r>r?r>q?r?r?r?r?r?r?r?s?r?r@r@s?r@s@s@s@s?s@s@s@s@sAs@tAt@s@tAtAtAtAtAtAtAtAtAtBtAtBuAuAuAuBuBuBuBuBuBuBuBvCuCvBvBuCvCvCvBvCvCvCvCvDvCwCvDvCwDwDwDwDwDwDxDwDwDwDwExEwExDxExExExExEyFxExFxExFyExEyFyFyFyFyFzFyFyFyFzGzGzFyGyGzGzFzGzGzHzG{H{H{GzH{H{H{H{G{H{I{Hoq=q>q>p>p>q>q>p=q>q>r?r>q>q>q?q?r>q>r>q?r?q?r?r?r?r?r?s@r?r?r?s@r@s@r@s@r@s@s@tAs@t@s@s@s@t@sAtAtAsAtAtAtAtAtAtBtAuBuAuBuBuAuBuBuBvBuBuBuBvBvBuCvBuCuCvCvCvCvCvCwDwCwCwCvCvDwCwDwDvDwDwDxDwEwDwDxDwEwExDxExExExExExFyExEyEyFyFxFyFyEyFyFyFyFyFzFzGzGzGzGzGzGyGzGzGzGzGzGzG{H{GzHzG{H{H{G{G{H{H{H{Hop>q>p=q=p=p=p>p=q>q=q>q>q>q>q>q?q>r?r>q>r>r?q?r?r?r?r?s?r?r@r?s@r@s?s?r@s@s@s@s@s@sAs@s@t@s@s@sAtAtAtAtAtAtAtAtBtAtAtAuBuBuAuBuBtAuBuBuCuBuBuCuCuCvCuBvCvCvCvCvBvCvCvDwCvCvCvDvCwCwDwDwDwDwDwDwDxExEwExEwExExExExExExExExExFxFxFxFxFyFyFyEyFyFzFyFyFzFyGzGyFyFzGzGzGzGzGzGzGzGzHzG{G{H{H{H{HzH{H{H|I{H{H|Ipq>q=q>p>q>q>q>q?q?r?r?q>q>r?q>r?r?r?r?r?s?r?r?r@s?r?s@s?r?r?s@s@s@s@s@s@s@s@t@s@t@tAtAtAtAtAtAtAtAuAtAuAuAuAtAuBuBuBuBuBuBuBuCuBuBuCuBuBuBuCvCvCvCvCvCvCvCvCwDvDvDwDwDvDvDwDwDwDwDwDwDwDwDxDwDwExExExEwExEyFxEyExFxEyFyEyEyFyFyFyFyFyFyFyGyFzFzGyGzGzGzGzFzGzGzHzGzGzH{HzH{H{H{H{H{H{H{H|H{H|I{I|Ipq>p=q>q>q=q=q>q=q>q>q>q>q>q?q?q?q>q?q>r?r?r>r?r?r?r?r?r?r@r?s@r@s?s@s@s@s@s@r@s@s@s@sAs@tAsAtAt@sAtAtAtAtAtAtAtAtAtAtBtAtAtAuAuBuBuBuBuBuBuBuCuCvBuCvCuCvBvBvCvCvCvCvDvCwCvCwDwCwCwDwDwDwDwDwExDwExDxDwEwExEwExExExExExEyEyEyEyFxFyEyFyFyFyFyFyFzFzGyFzFyGzFzGzGzGzGzGzGzG{HzGzHzG{H{G{H{H{H{H{H|H{H{H{H{H|I|I|Ip=p=p=p=p=p=p=p=q=p=q=p=p>q>p=p=p>q>q>q>q>q>r>q>q>q>q>r>q?q>r?r?r?r?r?r?r?r?r?r?r?r?s@r?r@s@s@s@s@s@s@sAt@s@s@tAs@s@t@tAsAtAtAtAtAtAtAtAuAtAuBtAuBuAuBuBuBuBuBuBuBvBuCuBuCvCvCvCvCvCvCvCwCvDvCvDvDvCwCvDwCwDwDwDxDwDwExEwExExDwExExExExExExExFyFyEyFxExFyFxFyFyFzFyFzFyGzGzFzFzGzGzGzGzG{GzG{HzGzGzGzGzH{HzH{H{H{H{H{I{H|H{H|H|H{H|H|I|Ipp>q=q=q=q>q=q=p>q>q>q>q>q>q>q?q>r>r>q>r?q?r?q?r?r?s?s?r?s?r@r?s?r@r@s@s@s@s@s@s@s@s@t@t@s@sAs@sAsAtAtAtAuAtAtBuAtBuAuBuAuAtAuBuBuBuBuBvBvBuCvBuBuBvBvBvCvBvCvCvCwCvDvCvCwDvCwDwDwCvDwDwDwDwDwDxDwEwExEwDxDxExDxExExFxExFxExFyFyFxFyFyFyFyFyGyFyGzFzFzFzFzFzGzFzGzG{GzGzGzG{HzG{HzHzG{H{H{H{H{H{H{I|I|H|H|I{I|H{I{I{I|Ip=p=p=p=p=p=q=p>p=p>p=q>q>q=q>q>q>q>q>q>q?r?r>q?r>q>q?r>r>r?r?r?r?r?s@r@s?r@s@s@s?s?s?s?s@sAs@sAs@t@sAt@tAsAtAtAtAtAtAtAtAtBtBtBuAuBtBtBuBuBuBuBuBuBuBuCuBuBvBuCuBuCvCvCvCvDvCwCwCvDwDvCvCwDwCwDwDwDwDwDwDwDwDxEwDwEwExDxEwExExExExExExFxFyFyFxFyFyFyFyFyGyFyFyFzGzFyGyFzFzGzGzGzGzG{G{GzH{H{H{H{GzH{H{G{H{H{H{I|I{H{H|I{I{H|I|I|I|I|I}Jp=p=p=p=q=q=q>p>p>q>q>q=q>q>q>q>q?q?q?q>q?q>r?r?r?r?r?q?r?s?r?r?r@r?s?s@r?s@r@r?s@s@s@s@s@s@t@t@sAt@sAtAtAt@tAtAtAtAtAtAuAuAuAtAuBuAtAuBuBuBuBuBuBuCuCvBvCvBvBvCvCvCvCvCvCvCvCvDvDvDvDwCwCwDwDwCxDwDxDwDwExDxDxExExDxExExExFxExExEyEyFxFyEyFyFyFyFyFyFyFyGyGzFzGyGzGyGzFzGzGzGzHzGzG{HzG{GzH{G{G{H{H{H{H{H|I{I{H{H|I|H{I|I|I|I|I|I}J|I|Jp=q=p=p=q=q=q=q=q>p>q>q>q>q>r?q?q>q>q?r>r?r?r>r?r>q?r?r@r?r?s?r@r@r@r@r@s@s@s@s@s@s@s@s@t@s@sAsAtAt@tAtAs@sAtAtBtAtAtAuAuBuBuBuBuBuBuBuBvBuBuBvCuCvBuBuBuBvCvCvCvCvCvDvCwDwCwDwDvDvDwDwDwDwDwDwDwEwDwDwExExDxExExExExExExExEyExEyFyFyEyFyFyFyFyFyFyFyFzFyGzFzGyGzGzGyGzGzGzGzGzHzGzG{HzH{H{H{H{H{H{H{H|I{H{H{I{I|I|I|I|I|I|I|I}I|I}J|I}Jq>q=q=q>p=q>p>q>q>q>q>q>q>q>q?r>q?q?r>r>r>q>r?r?r?r?r?r?r?s?r@r?s@s@s@s@s@s@s@s@s@s@s@t@t@sAsAtAsAsAtAtAtAtAtBuAtBtBtAuBuAtBuAuBuBuBuBvBuBuBuCuCvCuCvBvBvCvCuCvCvCvCwCvCvCvCvDvDwDwDwDwDwDwDwDxDxEwDwExExExExExEwExEyFxEyEyFxEyFxFyEyFyFyEyFyFyFyFzFzFyFzGzGzGzGzGzGzGzGzGzHzG{G{GzG{H{H{H{H{H|H|H{I{H{I{I{I|I{I|I{I|I|I|I|I}I|I|J}J|J}Jq=r>q=r>r>q>r>r=r>r>r>r>r>r>r>r?s>s>r?r?r?r?r?r?r?r?r?r?s?r@r@s?s?s@s@r@s@s@s@s@sAtAt@s@t@tAtAt@tAtAtAtAtAtBuAtAuAuAuBuAuBuBtBuBuBuBuBuCuCuBuBvBvBvBvCvCvCvCwCwCvCvDvDwDwCvDwDwDwDwDwDwDwEwDwEwEwDwExDxExExExExExExExEyFyFyExFyFyFyFyFyFyFyFyFyGyGyGyGzFyGzGyGzGzGzH{HzGzH{G{G{GzH{G{H{H{H{H{H{H{I{H|I|I{H|I|H|I|I|I|J|I|J}J|J}I|J|J}J}Iq>r=q>r>r>r>r>r>r?r?r>s>r>r>s?r>s>s?s?s?s?s?s?t?s?s?r?s@s@r@s@s@r@s@s@s@t@s@sAs@tAs@sAsAsAsAtAtAtAtAtAuAtAtAtAtAuAuBuBtBuBuBuBuBuCuCvBvCvBuCuCvBvCvCvCvCvCvDvCvCwCwDvCwCwDwDwDwDwEwDwDwDwDxExExExDwEwExExExEyEyEyEyExExExExFyEyFyFyFyFyFzGzFyFzGzGzGzGzGzGzGzGzGzGzGzGzG{H{H{G{H{H{H{H{H{H{H|H{I|H|I|H{H|I{I|H|I|I|I}I}I}I|J}J}J}J}J}J}Jq>r=r>r>r>r>r>r>r>r?s>r>s>r?r?s?s?s?s?s?s?s?s@s?s?s?s@s?s@s?t?t@s@sAs@t@s@tAt@sAs@t@sAsAtAt@tAtAtAuAtAuAtBtBtBtAtAtBuBuBuBuBuBuCuBuBuCvCuBvCvCvCvCvCvCvCvCvCvCwDvDwDvDwCwCwDwEwDwEwExExEwDxDxDxDxExExExEyFyExFyFxEyFxFyFyFyFyFyFyFyFyFzGzFzFzGzGzGzGzGzGzGzGzG{GzHzGzH{H{HzG{H{H{H{H{H{H{I|I{I|H|I|I|I|I|I|I|I|I|I|J|J}I|J}J}J}J}J}J}J~Jr>r>r>r>r>r>r?r>r>s>r?r>s>s>s?s?s?s?s?s?s?s@s?t@t@t@s?t@t?t?t@t@t@t@tAuAt@tAt@tAs@t@t@t@tAtBtAuAtAtAuAtBuAuBuAuBuBuBuBuBvBvBuBvBvBvCvBuCvBvCvCvCvCvCvCvCwDvDwCwDvDwDwDwDwDwDxEwEwDwExDxEwDxExExExEyExEyExEyFyFxFxFxFyFyFxFyFyFyFzFyGyFyFzFyGzGzGzGzGzGzG{GzGzG{HzGzH{H{H{H{H{H|H|I{H|H{H|H|I|H{I|I|I|I|I|I|J}I|I}I|J|J}J}J|I}J}J}J}J}J~Js=s=s=s=s=t=t=t=r?r?s?r?s>s?s?s?s?s?s?t?t?s@s?s@s@s@t?t@t@t@u@t@t@tAt@uAuAu@uAtAuAtAtAtAuBtBuBuBtBuBtBuBuBuBuBuBuBuBuBuBuBvBvCvBvCvCvBvCvCvCvCvCvDwCvDvCvDvDwCwDwDwDwDwEwDxEwEwEwEwDxDxDxExExExExExExFxEyEyEyFyEyFyFyFyFyFyFyGyFyFyGzFyFzGzGzGzGzGzH{HzG{H{GzHzHzH{G{H{H{H{H{H{H{I{H|I{H{H|I{I|H{I|I}I|I|I}J}I}J}J}J|I}J}J}J}J}J}J}J}J}Js>s=s=s=t=s>s>t=t>t=t=t>t>t>t>t?s@s@s?s?t?t@t@s@t@t@t@t@tAt@tAt@uAuAu@uAu@uAtAtAuAuBuAuAuAtAtAtBuBtBuBuBuBuBuBvCuBuBvCvCuCuBuCuBvCvCvCvCvCvCvCvDwCwCwDvCvDvDwDwDwDwDwDwDxDwEwExExExEwExExExExExExExEyExEyFxExFyFyFyFyFyFyGzFyGyGyGzFzFyGzGzGzHzGzG{GzG{G{H{G{G{HzH{H{H{H{I{H{H{I|I{I{I|I|I|I|I|I|I|I}I}I}I|I}J}I}J}J}J}J}J}J}J}J}J~J}K~Js=s=s=t=s>t>t>t>s>s=t>t>t>t>t?t>u>u>t?t?t?u?t@t@t@t@t@t@u@tAt@tAt@u@tAu@uAuAuAuAuAvBuBuAuBvBvAuAuAuAuBuBvBvBuBuBvBvBuCvCuCvBvCvCvCvCvCvCvCvDwDwCwCwDwDwDwCwDwDwDxDwDwDxDxExDxEwDxExExExExExExExFxEyFxEyFyFyEyFyFzFzFyFyGyFzGyGyGyGyGyFzGzG{GzGzH{G{GzHzG{G{H{HzH{H{H{H{H{I|I{I|H|I|I|I{I|I|I|I|J}I}I|I|J|I}J}J}J}J}J}J}K}J}K~J~J}K}J~K~Ku=t=u>u>s>t=s>t>t>t>t>t>t>t?u?u>t>t>u?u?u?u?u?u?u?u?u?tAu@u@t@uAtAu@uAuAuAuAuBuBuAvAuBuBvBuBvAvBvBvBvBvBuBuBuBuCuCuCuCvCvCvCvCvCwDvCvDvCwCwDwDwDwDwDwDwDwDwDwDwDwDxDxDwEwDxExExExExExFxFxEyExExFyEyEyEyEyFyFyFyGyFyFyGyGyFzFzGyGzGzGzGzGzGzGzGzH{G{HzH{H{H{H{H{H{H|H{I{I{H|H|H|I{I|I|I|I|I|I|I}I|J|J|I}I}J}J}J}J}J}J~J}J}J}K}K~J~K~K~K~Ku>t>t=u=u>t>u>u>u>u>u>v>t>u?u?u?u?u?u>u?u?u?u?u?v?u?v?v@u@v?v@tAuAuAuAuAuAuBvAvBvAuAvAvAuAvBvBvBvBvBwCvBvBvCuCuCuCvCvCvCvCvCvCvCvCvCwCwDwDwDwCwDwDvDwDwDwDwDxEwEwEwDxExExExExExExExFyExEyExExEyFyFyFyFyFyFyFzFyFyFyFzGzGyFzGzGzGzGzGzG{H{G{G{GzHzH{H{G{H{H{H{H{H{H{I{H|H|H|I|I|I|I|I|I}I|J|I}I|I|I}J}J}J}J}J}J}J~J~K~J}K~K~K~J~J~K~K~K~Ku>t>u>u>u>u>u?v>u>u>v?u>u?u?u>v?v?v>u?u?u?v?v@v?u@v@v@u?v@v@v?v@v@v@w@vAuBvAuAvBvAvAvBuBvBvBvBvBvBvCvCvBwCvCwCvCvCvCvCvCvCvCvCvCwDvCwCvCwDwDwDwDwDwDwDwDxExDwEwDwDxExExEwExExExExFxExExFyFyFyEyFyFyFyFyFyFzGyGzGyGzFyFzGyGzGzG{GzGzGzG{G{G{HzH{H{H{H{H{H{H{I|I{H{I{H|H|I|I|I|I|I|I}I}J|J}J|I}J|J}J}J}J}J}J}J}K}J~K~K}J~K~J~K~K~K~K~K~KKv=v>v>v>v>v>w>v?v?v?v>v?v?u>u?v?v?v?w@v?v@v@w?v@v@v@v@u@u@v@v@vAv@wAw@v@w@v@uBuAvBuBvBvBwBvBvBvBvBwBwCvBwCwBvCwCwCwCwCvCwCwCvDvDwCwCwCwDwDwDwDwDwDwDwDxDxDwDxExExExEwExExFxExExFxExFxExFyEyFyFyFyFyGzFyFyFzGzGzGzFzGzGzGzG{GzGzG{H{GzG{G{HzH{H{H{H{H{H{I{I{H{I{H|I|H|I|I|I|I|I|I|I|I|J|J}I}J}J}J}J}J}J}J~J~K}K}J~J~K}K~J~K~KK~K~K~L~KLv=v=v=v=v>v>v=v=w>w?w?w?w?v>v?v?v?v?v?v@v@w?w@v?v?w?w@v@v@v@wAv@v@w@v@wAwAw@wAwAw@vBvBvCvCvBvCwCvBwCwCwCwCwCwCwCwCwCwCwCvCwDvDwCvDwDwDwDwDwDxDwDwDwDxDwDxEwDxExExExExExExFxEyExFyFyFyFyFyFyFyFyGzFzGzGyGzFyGzGzGzGzGzGzG{G{G{GzGzG{G{H{HzH{H{H{H{I{H{H{H|H|H|I|I{I|I|I|I|I|I|J}J|I}I|J|J}I}J}J}J}K~J}J}J}J~K~K}J~K~K~K~K~K~K~K~K~L~KKKx=w=w=w>w=w=v>w>v>w=w>w>w>w>w>w?x@w@x?v@w?v@w@w@w@v@w@w@w@w@v@v@v@vAw@wAwAwAwAwAwAwAwAxAvBwBvBwCwCvCwBwCwCwCxCxCwDwCwCxCxDvDwDwDwDwDwDwDwDwDxDxDxExDxEwExExExExExFxEyFxFyFxExFyEyFyFyFyFyFyFzGzGyGzFyFyGyGyGzGzGzGzGzG{G{GzG{HzH{H{H{HzH{H{H{H|H|H|I{H{I|H|H|I|I|I|I|I|J|I|I|I}J|J|I}J}J}J}J}J}J}J}J~J~J}K~K}K}K}K~K~K~K~L~K~L~L~L~LLKx=y=y>y=x>x=x>x=x>w>x>x>w>x>w?x>w>x?x>x?w@x@x@w@w@w@w@w@wAwAw@xAxAwAvAw@wAwAwAwAwBxBwAxAwAxBvCwBwCwCwCwCwCwCwCwCxDxDxDxDwDxCxDwDwDwDwDwDxEwDxExDwDxExExExExExExEyFxFxEyFxEyEyExEyFyFyFyFyFyGyGyFzGyFzGyGzGzFzGzGzGzH{H{HzG{G{H{H{H{H{H{H{H|H|H{H{H|I|H|I|I|I|I|I|I|I|I|I|J}J|I}J|I|I}I}J~J}J}J}J}J~J~J~J}K~K~K~K~K~K~K~K~K~KLL~LLLLy=z>z=x>y>y>y=y>y>y>y>x>y>x>y>y>y>x?x?x?x>x?x?x@x@x@w@wAw@xAxAxAw@xAxAxAwAwAwAwAxAwAxBxBwBwBxAxBwCwCwCxCxDwCxDxCwDwDxDxDxDxDxDxDxDwDwEwDwDxExDxExExExExExEyExEyFyExExFyFyFyEyFyFyFyFyFzFyGzGzFyGzGzGzGzGzG{GzGzHzHzG{G{H{HzH{H{H{H|H{H{H{I{H{H|I{H|I|I|H|I|I|J|I|I|I|I}J|J|J|J|J}J}J}J~J}K}J~J}K}K}K~J~K~K~K~K~KK~K~KK~LLK~LLLLMz>z=z=z>z=z>z>z?z>y>y?y>z>y>z?z?y>y?y?y?y?x?x@x@y@x@x@xAy@xAxAxAxAxAyAxAxAxByAxAxBxAwBxAxBxAxByBxBxBxCxDxCwCxCwDwCxCxDxDxDxDxDyEyExDyExDxExEwExExExExFyExFyExExEyFyFyFyFyFyFzFyFyGyFzFzGyFzGyFzGzGzGzGzGzGzGzHzHzHzG{H{H{H{H{H{H{H{H{H|H{I|H|I|I|I|H|I|I|I|I|I|J|I|J|I}J}I}J}J}J}J}J~K}J}J}J}J~K~K~K~K~K~K~L~K~L~L~KKL~KKLLLLLL{=z=z<{={=z>{>z>{?{>z>z>{>{>z?z?z?z?z?z?y?y?y?z?z@y?y@y@y@y@yAyAxAxAxAxAxByAyByAyBwAxBxBxByBxByBxBxBxCxBwCxCxDwDxDxDxDxDxDyDxDxDyDyDyEyExExExExExExExFyFxFyFyExFxFyFyFyFyGzFyGyFzFzGyGyFyFzGzGzGzGzGzG{GzH{H{G{G{G{H{H{H{H{H{H{H{H|H{I|I|H|I|I|I|I|I|I|I|I|I|J}I}I|J}J}J}J}J}K~J}J~J}J}J}K~K~K~K~K~K~K~K~LK~KKK~L~K~LKLLLLLLL|=|={={=|={={=|=|={={>{>{?{?{?{?{?{?{?z?{?z?z?y@z@y@y?z@y@y@y@y@yAzByAyBxAyByAyByByByBxBxBxBxByCyByBxCyCyCyCxDxDxDxDxDxExDyDyExEyDyEyExEyEyExExFxEyEyEyExFyFyFyFyFyFyFzFyFyGyGyGzGyGyFyGzFzGzGzGzG{G{GzGzH{G{H{G{H{H{H{I|H|I{H{H|I{I{I|I|I{I|I|I}I|I}I|I}J}J}J|J}I}J}J}J}J}J}K}K}J~J}K~J~K}K~K~K~K~KL~LL~LKKL~L~LLLLLLMLLL}=}=|=|=|=|=}=|>{>|>|>|>|>|>|>|>|@|?{?|?{?{?z?{@{@{@z@z@z@z@z@y@zAy@yAyByAyBxByByByByByByBzCyByByCxCyCyByCyCyCyCyDxDxEyDxExEyEyEyEyEyEzFyEyFzExExEyFxFyFyFxFyFyFyFyFyFyFyFyFzGyGzGzFzFzGzGzG{HzG{HzG{GzH{GzH{G{H{H{H{H{I{H{H|H{H|I|I|H{H|I|I|I}I}I|I|I|I}I|I}J}J}J}J~J}K}J~J}J~K~J~K~K}K~K~K~KK~L~L~KKKL~LLLLLLLLMMLMMM}=}<}=}=}=~=}=}>~>}=}>|>}>|>|>|>|?|?|?|@{?|@|@{@{@{@{@{A{@{@zAzA{AyAyAz@yAzBzBzByCyCyBzCzByBzCzByCyCyCyByCyCzCzCyDyCxDxEyDyDxEyEyEyFyEyEyFyFyFzExFyFyEyEyEyFyGyFyFyFyGzGzFyFzGzGzGzGzG{GzHzHzHzHzG{H{GzH{H{H{H{H{H|H{H|I{H{I{H|I|I|I|I|I|I|I}I}I}J|J}I}J}J}J}J}J}J}J}J}J}K~K~J}J}J}K~K~K~K~KKK~LKL~LLK~LLLLLLLLLMMLMM<<~<~=~===}=~=~>~>~>~>}>~>~>}>|?}?}?}>}?}?|@|@|@{@{@{@{@|@{@z@zA{A{AzAzAzAzA{BzBzByByBzCzCzCyCyCyCyCyCyCyCzCyCzCzCyDxExEyEyEyEyEyEyEyEyFyFyFzFzFyFyFyFyFzFyFzGzFyGzGzGzGzFyGzGzG{G{HzG{H{GzGzHzH{H{H{H{H{H{H{H|I|H|I|H|H|I|I|I|I|I|I|I|I|I}J}J}I|I}J}J}J}J}J}J~J}J}K~K~J~K~J~K~K~K~K~KK~K~LKLLLLKLLLLMMMMLMMMMM<<===<===>==~=>~>~?~>~>~?}?}?}?}?}?}?~@}@|@|@{@|A{A|@|@{A{A{A{BzA{BzB{A{C{BzCzCyCzCzCzCzDyDyCyDyDyCyDyCzDzDzDyDyDyEyDyEyEyFzEyFyFzFzFzF{FyGyFzFzFyGzGyGyGzGzGzGzG{HzGzG{GzH{HzG{H{H{H{H{H{H{H|H{H{I|I|I{I{I|I|H|I|I|I|I|I}J}I}I}J}J}J|J}J}J}J}J}K}K}K}K~J~K~K~K~K~KK~K~L~L~K~LK~KL~LLLLLLLLMMMLMMMMMMM<;;<===>===>=>>>>~???~?~?~?}?}?~?~@}@|@}@}@{A|A|A|B}A{B|A{A{B{A{A{A{BzB{B{CzCzC{CzDzCzDyCzDyCzDzDzDzDzDzEzDzDyDzEzDzFzEzFzEzFzF{GzFzGyGyFyFyGzFzGyGzGzGzHzHzGzGzGzG{HzH{H{H{H{H{H{I{I{H{H|H|I{I{H|I|I|I|I}I|J|I}I|J|J|J}J}I}J}J}J}J}J}J~K}K~K~J~J~K~K~K~K~K~K~KKK~KLL~LLLLLLLMLLLMMMMMNMMMNN;<;<<<<=<=>=>=>=>>>??????~?~@~@~@~@~@}@}@}A}@}A|A|A{B|B|B|B{B{B{B{B|B|BzDzCzD{D{C{D{DzDzDzDzDzDzDzEzDzEyEzDzEzEzFzFzFzG{FzFzG{F{FyFzGzGzGzGzGzGzG{GzG{GzG{H{H{H{H{H{H{H{H{H{H{H{H|H{H|I|I|I|I|I|I|I|J}I|I}J}I}I}J|J}J}J~J}K}J}J~K}J}K~K~K~K~K~K~L~K~K~K~K~KKL~KLKLLLMMMMLLMMMMMMNMNMMM<<<<<<<=<<<<=>>>>>>?>>>?>>~?@@~@~@@~@~@}A}A}A}A}B}A|B|B|B|B{B{B{B{C|BzD{D{D{D{C{D{DzD{D{EzD{E{E{D{D{EzEzEzE{EzEzE{FzFzE{FzFzF{FzGzGzGzGzGzH{G{H{HzHzG{HzH{H{H{H{H{H{H|H{H{I{I|I|I|H|I|J|I|I}J|I}J}J}J}I}J|J}J}J}J}K}J}J~J}K}J~J}J~K~K~K~K~K~K~K~K~LKLLK~LLLLMMMLLLLMMMMMMNMNMNNN;;<<<<<=<==<=====>??>>???????@A~AA@A}A}@~A}A}B}B}A}B}B|B}B|B|C|C|C|C{C{C{C|C|D{D{EzDzEzE{EzE{E{E{E{EzEzE{EzEzFyEzF{F{F{F{F{FzGzHzG{GzG{HzH{GzG{H{H{H{H{I{H{H{H{H|H{H{I|H|I|I|J|I|I|I}I}I}J}J}J}I}J}J}J}J}J}K}K~J}J}K~K~K~K~K~K~KKL~LK~KLLLLLLLLLMMMMMMLMLMMMMNNMMNNMN<;;;;<<<=======>>>>>>???????@???@~AAAA~A~A~A~A}A}B~A}B}C}C|C|C|C|C|C|C{C|C{C{C{D|C{DzE{E{E{E{E|E{E{FzEzEzF{FzFzFyFzFzFzFzFzF{F{F{FzG{GzG{G{G{G|G{H{H{I{I|I|H{I{H|I|H|I|I|I|I|I}J}I}J|J}J}I|I}J}J}J}J}J}K}K}K~J}J~K~J}K~K~K~K~K~LK~K~KLLLLKLLLLMMMMLMMMMMMMNNMNMNNNNN;;;<;;<;<<<<=<====>=>>>>??@?@@@?@@@AAAA~A~B~BA}B~A~B}A}C}C}D}D}C}C|C{C|D{C|C|D|D|D{D{D{E{D|D{F{F|F{E{E{E{EzFzGzFzGzF{FzGzFzG{G{GzG{G{G|G|G{G|H{H|H|G{H{H|H|H|I|I|I}I|I|I|J}J}I}J|J}J}J}J}J}J~K}J}J}K~K~K~J~K~K~KL~K~KK~K~KK~KLLLLLLLLLLLLMMMMMMMNNNMMMNMNNNNN;:;;;;<;;<<==<<====>>>>>>>?>??@@@@@@AA@AAA~BB~B~B~B~B~B~C}B}D}C}D}D|D|D|D|D|D|D|D|D|D{E|D{E|F|E|F{F{F{F{FzFzF{FzG{F{G{G{G{G{G{G{G|G{G{G|G{G{G{G|H|G|H|H|H|H|H|H|H|I}I}I|J}I}I}J}J}J}J}J}K}K}J}K~K~K~K~K~K~K~K~K~K~LK~LLKKLLLLLLMLMLLMMMMNMMMNNNNNNNNNNNNN;::;;;;;;;<;<<==========>????>????@@@AAAAA@BBBB~B~B~CC}B~C~B~B}D|D|D|D}D|E|E}E|E|E{D|E|E|E|E|E{F{F{F|FzGzG{G{FzGzG{G{G{G{H|G{G|G{G{H|H|H|H|H|H|H|H}H|I}H}I|I|H}H|H}I}I}I}I}K}J}K~J~K}J~K}K~K~K~K~K~K~K~LKLK~LL~L~KLLLMLLLLLLMMLMMMNMMMMMNNNNNNNNNOO::::::::;<;<<<<<<<<>>>>>=>>?>?????@@@AAA@AAAABAB~BB~B~C~C~C~C~C~C}C|D}E}D|E|E}E{E|E|E|E|E|E|E}E{F{E{F|FzG{G{G{G{G{G{G{G{G{H{H{G|H|H{H|G|H|H|H|H|H|H}H}I}I}I}I}I}H}I}J}I}I}I}I}I~I~J}J~K~K~K~L~KLLKL~LLLLLLLLLMLMMLMLMMMMNMMNNNMMMNNNNNONNNOO9:::::::;:;:;<<<<<<<=<=>>>>>>>>??@@@?@@@AAAABAABBBBBC~C~C~C~CC}D~D|C}C}D}E}E}E|E|E}E|F}F}E}E|E|F|F|F{F{F{F{F{F{G|F{F{G{G{G|H|H|H|H|H|H|H}H|I}I|H|I|I|I}I}I}I}J~I~I}I}I~J}J~J~I~J~J~J~L~L~KKLK~L~LKLLLMLLLLLMMMMMMMNNMMMNNNNNNNNNNOOOOOOO9:999:;;;;;;;;;;=;==<=====>>>>>???@@@@@@@@@AAABBBBBBBCB~C~D~D~D~D~D|D|D}D}D~D}D|F|E|E}E}E}F}F|F|F|F|F{F|F{F|G|G{F{F|F{G{G{G{H|G{H{H{H|H|H|I|H|I|I}H}I}I}I}I~I}J}J}I}I~J}I~J~JJ~J~K~K~KJK~KLLLLLLLLLLLMLLMMMMMMMMMNMMNNNNNNONONNOOOOO9:999::9::::;;<;;;<<<=<=====>>>>??????@@@@AA@AA@BBBCBBBC~B~C~C~B~C~C}E}D}D~D}E~D}E|D}D}E}E|E|E|F|E}F}F{F|F|G{G|G{F|G|G{G{H{G{G|G|H{H{G{H|H|H|H|H|I}I|I|I~I~I~I}I~J~J~J~J~JJ~JK~JKKK~KJKLLLMLMMLMMMMMMMMMNMMNNNMNNNNNNNNOOONOOOOO8989889:::::::;:;<<;<<<==>====>=>>???????@@@@AAAAACBCCCBCBB~C~D~C~C~E}D}C~D~D~E}D}D}E}E}E}F|E}F|F|F|F|G|F|G{F|G}G|G{H|G{G{G{G|G{H{H|H|H|H|H|H}I|H|H}H|I}J}J}J~J~J~JJJ~JJK~K~KKJKKKKKLLMLLMMMMMNMNNMMMNNMNNNNONNNNNOOOOOOOOO88899999999::::;:;;<<<<<<<<===>>>>?>>?@@@?@@@AAAAABABBBBCCCCC~C~D~C~D~D~C~D~D~D}E}F}E~F}F|F}F}F|F|F}F|F|F|F|G|F}H}G{G|G{G|H|G|H|H|H|H|H}H|H|H}I|H|I}I}I}I}I}J~J~J}JKJ~KK~KKJKKLLKKKKLMMLMMMNMMMMNNNNNNNNOONOOOONOOOOOOPPO78888888:999:9:::;;;<;<;<<<======>??>>>>?@@@AA@@@ABBBBBBBCBCCDDC~DC}D~D~D~D~E}D}D}D~D~D}F}F}F}F}F}F|F|F}G|F}F}G}G{H|H|H|H|H|H|H|H|I}I|H|I}I}H}I}I}I}I}J}I~I}I}J~K~K~KKKKKKKKKKLKLLLLMMMMMNMNMNNNNNNNNONNOOOOOOOOOOOPPO77888888899889:::::::;;<;<<<<<=====>>?>?????@@@AAAAAAABBBBCBCB~BCCDD~D~DDE~E}D}E~E~E}D}E}E|F|G|F}F|F|F}G|F}G|G}G|G|G|G|G|G|H|H}I|I|I}H}H}I}I}I}I~I}I~I}I~I~J~I~J~J~K~KKKLKLKKLLLLMLLLNMMMNNNNNNONNONOONNOOOOOPOPPPPPP777778778899999999::;;;::;<<<<<=====>>>>>??@????@@@AAABABAABCCBCCC~CD~D~DD~E~E~E~E~E~E}E}E~E|E}E|E|E|G}G}G}G}G}G|H|G}G|H}G|H}H}G|H}I}I}I}I}I}I}I}I}I~I~I~I~I~J~J~K~J~K~K~KLLLLKLLLLLLLMMLMNNNNNONNNNNONOOOOOOOPOPPPPPOP66677788888888899::9::;;;;;;;==<<=====>>>>??????@@@@@@AABBABBBBCCCC~C~D~C~D~C~C~D~D~D~D~D}F}F~E|E|F|F}F}F}F}F}F}F~G|G|G|G}G}G}H}H}H}H}I}H~I}I}J~I~J~J~J~J~I~J~J~J~KKJJK~K~LLLLLLLLMLLLLLMMNNNNNNNOOOONOPOOOPPPPPPPPPPP676776777778789989999:::::;;<<<<<<=====>>>?>??>????A@AAA@ABABBBBCCCC~CC~DDD~DD~D~D~D~E~E~E~E}E}E}F|F|G}F}F}G~G}F|G}H|H}G}G}H}H~H}H~H}H}H~I}I~J~J~J~J~J~JJ~JJKK~K~J~KKKLLLLLLLLMMMMMMMNNNNOONOOOOPPOOOOPPPPPPPPPQ655666777877778989999999:;::::;<<<<<====>>=>>>>@?@@?@@@AAAAABABABCBCCCCCDC~C~C~C~D~E~E~D~E}E}E}E}F}F}F}G}F}F}G}G}F}F}H}H}H}H}H}I~I~H~H~I~I~I~I~I~K~KK~J~K~KK~KKKKKKKKMLMLMLMMMMMNNMNNOONOOOPOOPOPPPOPOPPPQPQQ555566666666778888889:9:::::::;;;<<<<======>>>>>???????@@@@BAAAABBBBCCCCDDC~D}D~C~D~D~D~E~F}E~E}F}E}E}F|F|G|G|G}G}H}G}G}G}G}H~H~I~I~I~I~I~I~J~J~III~JK~KKKKKKKKKKLLMMMMMMMMMMMMMNMOOOOOOOOPOPOPPPPQQPPQPQ5544555555666777778888899::::::;<;;<<<<<=====>?>?>????@??@@@A@AABBBBBBBD~C~CDDD~D~D~D~D}E~D~D~E~F~E}F}E}F}F}F}F}G}G}G~G}G}G~G~G~H~I~I~I~I~II~JJ~IJJJJKKLKLKLLLLLLLMMNMNMMNMMMNNNNOOOOPOPPPPPPPPPPQQPQQ4454455556656667777778889999:::;:;:;;;<<<<<>==>==>>???@??@@A@AAAAABBBCCCBCCCCD~D~D~DD~E~D}D~E~E}E}F}F}F}F}G}F}F|F}G~H}G~H~G}G~H~H~H~I~III~J~JJJJJJJLKKLKLLLLLLLMMNMMNNNNNNNNOOPOOPPPPPPPPPQPPPQQQQ3444435455455566777778887899:9:9:;;:;;;;<<<=<<=>>>>>>>>@@@@@@@@AAAAAAAABBCCCCCD~D~C~DD~D~D~E~E~E}E}E}F}E}E}F~G|G}F}F}G}G}G~H~H~II~H~HH~II~IJJJJJJKKKLLLLLMMLLLLMNNNMNNNONNNOOOOOPPQPPPQQPPQPQQQQ33434334445555556667777778888999:::::::;;;;<=======>>>??>???@@@@@@AA@ABABBBBCC~CD~CDCC~D~D}D~E~F}E~F}E~F~F~F}G|G}G}G~G}G}G}G}G~I~II~HIIIIIJJJKJKKKLLLLLMLMMLMLNNNOONNOOONOOOPPPPQPPQPPQQQQRQR2333433443444455565667667788888999:9::;;;;;<<;<<<===>>>>>???????@@A@AAAAAABCBBC~CCC~DD~E~DD}D}D}E}F}E~F}F~F}F}F~G~G}G~G~G}H~H}H}H~H~IIIIIIIJJKKKKKKKLLMLMMLMMMMMNNNNOONOOOOOOPQQPPQQQQQQQRQQQ33323233333334445555656677777888898::9::;;;;;;<<<<======>>?>>?>??@@@@@AAAAAAAAACBCCCDCC}D}E~E}E}D}E~E}F~F}F}F~F~F}G}H~G~G~H~H~H~H~H~IIJIJIJJJKKLLKKKLLMMMMMMMMMMONOOOOOOOOPOOQPQQQQQQQRRQQR211222234333444444545566576777778889899:9:::;;<;<<;<<======>>>>?>????AA@A@AABBBBBBCC~C~D~C~D~D~E~D}E}E~E~E}EF~F~F~G~G~G}G~GH~H~I~H~HI~HJJIJJJJJJKKLKKLLLMMMMMNNMNNOOOOOOPPOPPOOQQQQQQQRRQRRR121112222323333344444555666667777878989999:::::;;<<<<<<<==>>=>>>>???@@@?A@AAAABBBC~BCBCC~D~D~D~D}D}F}F}E~EF~E~F~F~G~G~G~G~G~GH~HI~IIH~IIJJJKKJKKLLLKLLMMNNNMNNNNNOOOOOPPOOPPPPQQQQQQQRRRRR1011212112122334343444455566666666778888999::::;;;;;<;<<<<<<=>>>>>>>>@@?@@@AAAAABAB~B~B~CC~C~C~C~D~D~D}E}E}E}E}F~F~F~F~F~G~G~G~G~GHH~I~HIIJIIJJKJKKKKLLMLMMMNNMNNNNNNNOOOOOPPPPPPPRQQQQRRRRRR1000111011122222232334444556556577777788998889::::;;;;;<<<<<=====>>???????@@@@@@@BABBBB~C~C~C~DC~D~E}E~E}E~E}F~F~F~F~F~FF~HH~H~HHHIIIJJJIJJKKKKLLLMLMMMMNNNNNNNNOOPPOPPPPPQPPRQRRRRRRRR//00011111112211223223334444556656667787888899999::::;:;;<<<<=<>====>>>>?????@@AAAAABBBC~BB~CCD~D~D~D~E~E~E}F}E~F~F~F~F~GGHHIHHHIIIJJJKKKKKKKLLMMLLMMNNONONONOPPPPPPPPPQQQRQRRRRRRS//0//0000101111222222232333444555566676678888899999:::::;;;<<;<<<====>>>?>??@@?@@@AAAABAC~CBBC~D~D~D~DE~D}F~E~F}F~F~G~G~G~GGHHIIIHJJJJJJKKKLKLKMMMMMMMNNNNONOOOOPPPPQQQQQQQRRRRSSRR//.////0000001111121223323333444455565667777888889999:::::;;;<<<;<<====>>>>>>>??@@@@@@ABBBB}B~C~C~C~D~CD~D~D}E~E~F~E~F~F~FGGGGGHIHIIJJJKKJKLKLKLLMNMMNNMONOOOOOOOPQQPQPQQQQQRRSRRSS..//../0///0001101112222223323344445555666677778887999999::;:;;;;<<<<<===>>>>?>???@@@@~A@ABBB~B~B~C~D~C~D~CE~E~E~E~EF~F~F~F~FGHGHHIIIIJJJKJKLLLLLMLMMMMNMNOOPOOOPOOPQQQQQQQQQQSRSSSR.........////0000100112121222324333445555566666777889888999:::::;<<;<<=<=====>>>>€??@@@@AAAAA~C~BC~C~CDD~DD~F~E~EFE~E~GG~GGHHHHIIIJIJJKKKKLLMLLLMMNNNNNPOOOPPPPPQQQQQRQQRRRSSSSS---.--./-..0///0/10/0011112121223333344555556566677778888899999:;::;;<;<<<====>>>>>À?€??€?€@@@AAAA~B~C~C~C~C~DDD~D~D~FE~FFFGGGGIIHIHIJJJKKKLKLLLLMLLNNNNNNNPPOPPPPPQQQQRQRQQRRSSST*+,--.-.-.././/..///000100201222223333344444555666667777888899:9:::;;;;;;;<„=ƒ<Ã=ƒ=‚=>Â>Â=Á>Ā?Ā?Ā?À@@@ÀAĀAA~BBA~B~CC~C~C~DDE~E~EFFFFFGHHHIIHIIJJKKKLLLLMLMMMMNNNNOOOPOOPPPQPQQQQRRQRRRRSSS*++*++,----.-.///../0/0//10011111222233344445556665676677788889999:9::::†;…;…<ą<Ä;ă=Ã=Ă=Ă>Ă>Ă>ā>ŀ>ŀ>ŀ>ŀ?@Ā?ĀA@AAAB~B~B~B~B~DD~D~DDEEEGFGGFHGGGIIIIJJJJKLKLKMMMMMMONNOOOOPPPPPQPQRRRRQRRRSSSSS*,******,---....././/////0/0/01111122233333344444555666667778888899Š9‰9ˆ:È:†:‡:Æ;ą;ą;ą;ń<Ń<Ń<ă=ł=ł=Ă=Ł>Ɓ?ŀ>ŀ?ŀ?ƀ?ŀ?ŀ@AA~AAACCBCC~DC~D~DDE€F€FFFGGGHGHIIIIJKKKKKLLLLNMMMMNOOOOOOPPQQPQQQQRRRRRRSRRSS+**+++*++++,----....../////0/000000022222223334344555555677667878Œ8Ê8Ê9Ê9Ċ9Ĉ:ć9ć:ć;Ć;Ć;ń;ń;Ƅ<ƃ<ƃ<Ƃ<Ƃ=Ł<Ƃ>Ɓ=ǁ?Ɓ?ƀ?ƀ?ƀ?ǀ?ƀ@@~AƀAǀAA~B~BCC~CC~EDDEDFÀEÀE€G€G€GGGHHHJIJJKKKKKLMLLMMNNNNOOOOOPQPQPQQQQRRRRRSRSSSS+*++++,++**++,----.-...//./0//0//00111112132223334444445565567778Œ8Ì7Ê8Ċ9ʼn8Ĉ8Ň9Ň:Ň9ņ:Ɔ:ƅ;DŽ;DŽ;ǃ;Ȅ;Ƃ<ǂ<Ȃ=ǁ<ǁ=ǁ>ǁ>Ȁ>ǀ?ǀ?ȁ>ǀ@ǀ?ǀA~AȀ@BABBCC~D~CD~DEEĀEEÀEÀFÀF€GÀGGGIIHJJIJJKLKKLLLMMNNNNNOPOOOPQQQQQQQQRRRSSRSSSS++,,+,,+*+++++++,---..-......////0//0101021222323333344556656Ð5ď6Î8Î7Ď8Ō7Ō8Ċ8Ŋ8Ɗ8Ŋ9ƈ9LJ9ȇ9LJ9Ȇ:ȅ:ȅ;Ȅ;Ȅ<Ȅ<ǃ<Ɂ<ɂ<ɂ<ȁ=ȁ=ȁ>Ɂ>Ȁ>ɀ?ǀ?ɀ@Ȁ@AAȀAAABAB~B~CD~DDEEŀEĀEĀEÀFÁFÁGÁHÀGHHIHIJJJJKKLKKLLMMNNNOOOPPPPPQQQQQQQRRRSSSSSSS++,+,,+*+++,****+,------.....//.////0/001001222322433334–5–5”5Ò5Ò5đ5đ6ď6Ŏ6ō6ƍ7Ƌ8Ƌ8Nj7lj8lj8Lj8ȉ9Ȉ9ɇ9Ɇ9Ɇ:Ʉ9Ʌ:ʄ;Ʌ;ɂ;Ƀ<ʂ<ʂ<ʁ=Ɂ=Ɂ=ʁ=ɀ>>Ɂ>ȁ?ʀ?ɀ@@@AAȀBȀAB~BBCƀDDƀDDEŀFŀEĀFāGāFāGÁGÁH€HHIIIKKJJLLLLLMMMMNOONNOPPPPPQRQQQRRRSSSSSSSS++,,+++++++***+*+,,,-,-.----..-////0///00010112222233š3Ø2Ø3—4Õ4Õ5Ŕ4Ó4Œ4ő5Ƒ5Ɛ5ǎ5ǎ7ȍ7ȍ7Ȋ7ȋ8ɉ7ɉ8Ɉ7Ȉ8Ɉ8ʆ9Ɇ9˅:˅9˄9˃:˄:ʃ;˂<˂<ˁ=ˁ<ˁ=ˁ=ˁ=ˀ>ʀ>ɀ=ˀ>ʀ??@@@AAɀBBBCCCǀDǀDDǀEƀFŁFŀFŀFĀGāFÁHÁHÁHIÁIIJKJKJLLKLLMMMMOOOOOOPQPPPQQRRRRRRSSSSTST+,,+*+++++*+*+++,-./.,,,-------././//0//00000011111ž22Ü2Ú3Ù3Ę4Ė3ŕ3ƕ3Ŕ3œ4Œ4ǐ4ǐ4Ȑ5Ȏ6Ȏ6ɍ6ɋ6ɋ6Ɋ7ʉ7ʈ7ʉ8ˈ8ˇ8ˇ8ˆ9̅9̅9˄:˄:̓:˄;̂;˂;̂<́<ˁ=́<̀=ˀ=ˀ=ˁ>̀>>?@??AɀAABBBCCȀDȀDǀEEƀEƀEƁEŁFŁGāGāGÁIÂH‚H‚HÁJJIKKKKLLMLNMNMOOOOOPQPPQQRRRRRRSRSSSSTT,,+++++,++++*++,-//122.,-------..-./..///0//0¦00¤0£10¡0ß1Þ2Ĝ2Ĝ2Ś2ę3Ɨ4ǖ3ǖ3Ɣ3Ǔ4Ǒ4Ǒ4ɑ4ɐ5ʏ5ʎ5ʍ5ʌ6ʋ6ʋ6ˊ7̊7̉8̉8̇8͆8΅9͆9ͅ9ͅ9̈́9̈́:̈́;̓;̃;͂<͂<͂<́<́<̀=̀>̀=̀?́>>̀>?@@@ʀAAACBɀCCɀDCǀEǀEǀEƀEƁFŁFŀFāGāGÂHÂIÂH‚IÂJJ‚JKKƒLLMLLMMNNMOPOOOPQQQPQRRRRRSRSSTSTT++++++,*++++*+,.//134571,,,---------.-.....0©/¨/0å0â0¢0á1ğ1ş1Ş2ŝ1Ś2ǚ2ǘ2ȗ3Ȗ3ȕ3ɕ2ȓ4ʒ4ʒ4ʐ4ˑ4ˏ5ˏ5̌6ˍ5̌5͊6͊6͉7͉7Έ8·8·8·8Ά8΅9ͅ9΅:σ:σ:΃;̓;΂;΂;͂<΁<π<΂<΀=΁>̀>̀>̀?>??̀@@ˀAAABBBCɀCǀDȀDǀEǀEǀEƁGƁFƁFŁGŁHāGÂIĂIÂIÂI‚JÂJ‚KƒKKLLLMLNNOOOPOPPQPQPQQRRSRRRRSTTTT+++++++++++*+,.//134589;6,,,,,,,--....--.®//«.ë.é/ħ/Ħ0ĥ0ţ0Ţ0š1Ơ0Ɵ2ǜ1Ȝ1Ǜ2ə2ə2ɗ2ʖ2˕3ʔ3ʓ4˓4ˑ4̑5͑5͎5͎5͍5͌6Ό6Ί6Ί6ω6Љ6Ј7χ7φ7χ8χ8΅9Є8υ9τ9Ѓ:Ѓ:Ѓ:Ђ;΃<ς;ρ<ρ<ρ=΂=π=π>΀=>???̀@ÀB̀BˀBˀBʀCʀCʀCɀCɁDɁDȀEǀFǁEǁEƂGƁGƁGŁGłHĂIĂJÂIĂJƒJÃK‚KƒK„LKMMMMONNOOOOPPPQQQQQRSSSRRSTTTT++,+,+++++++,.0/235589;<=π>΀?>>@@ÀÀB̀B̀BˀCʀDʁDʁCɀCȀDȀDȁEȁEǁEƂGŁGƂGłHłIĂHłIăIăIÃKƒKƒKƒKƒL„LMNMMOONOPOPPPRQQQQSSSSSSSSUTT,,+,+++++++,./1235689;<=>AA2+++,,½,¼,º,¹-·-ö-ô-ó,IJ-ű.Ů.ŭ/ū.ƪ.ƨ.Ǧ/Ǧ/Ȥ/ȣ0ɢ0ɟ0ʞ1ʞ1˜1˜1˚1̚1͙1͖2̖2Ε2͕2Β3ϒ2ϑ3ϑ3я3Ѝ4Ѝ5Ѝ5Ќ5Ҋ4Ҋ5ӊ6҉5҈6҇6҇7҆7҆8҆8҆8ц8҄8҃8Ӄ:҃:т;т;҂;҂;ҁ<ҁ<с<т=р=Ѐ=π>>π?π?>@΀@AÀB̀CˀBˀBʀCʁDɁCɁEɀEȁEȁFǁFǁGƂGƂHłGłIăHĂIĂJăJÃKÃKÃKƒKƒL„MM„MMMONNOPPPPPRQQQRSSSSTSTTTU++,+++++++,./1335689;<>?ABDE5++++ÿ,½,ļ,Ĺ,Ĺ-Ÿ-Ƶ,ƴ-Ƴ-Ʋ-ǯ-Ǯ.Ǭ-ȫ.Ǫ.Ȩ/Ȧ/ɥ/ʤ/ɣ/ˢ.˟0˟0̞0̝0͜1͛1Κ1Η1Η2ϕ2ϔ2Г1ѓ3ѓ3Б3я4я4ҍ4ҍ5ҍ4Ӌ4Ӌ5ӊ4Ӊ6Ӊ6Ӊ6ӈ7ӈ7Ӈ7Ӈ7ӆ7ӆ7ӄ8Ӆ8ӄ9Ӄ9ӂ9҂:Ӄ;҂;ӂ;҂<҂<ҁ<ҁ=с=р=с>Ѐ>Ѐ>΁??@@΀AB́B̀B̀B́CʁCʁDʀDʁEɁEȁFȁFǁGȁFƂGƂHƂGŃIŃHłJăJăJÃKÃKÃKƒKÄL„L„M„NNNOOOOPQQPPRRQRRSSTSSSSTT+,+++++++-./1235689;<>?ABEEHI:+,,,+ľ+Ƽ+Ź,Ź,Ʒ-ƶ,Ǵ-Dz-ȱ-ɰ-ɮ-ɬ-ɫ.ʪ.ʨ.˧.˥.̤/ˢ/̡0͠/Ξ/Ξ/Ν0Ϝ/Л0К1И1И1ї2ѕ1ғ2ӓ2ӑ3ӑ3Ӓ3ӏ3Ԏ4Ӎ3Ռ4Ռ3Ջ4Պ5Ԋ6ԉ6Ԉ6Ո6Շ6Ն6Ն8Ԇ7Ԇ8Ԇ8Մ9ԃ9ԃ9Ղ:Ԃ:Ԃ:Ԃ;Ԃ;Ӄ;ӂ;҂<Ҁ<ҁ=ҁ=р=с>Ѐ>Ѐ?Ѐ?Ѐ@π@A΀A΀B́B́CˀCˁCˁDʁEˁDɂEɁEȁEȁGǁFƂGǂHƂHłIŃIŃIŃJŃJÃKÃKÄL„LƒM„L„M…NNNOOOPPPPQQRRRRRSSSTSTTU,+++++++,.01345689;=>?ACDEHIJL?*,+++ƽ,ȼ,Ⱥ,ȸ,ȸ,ɷ,ɳ,ɲ,ɱ-ɯ-˭-ʬ.̫.˩.˨-ͧ.ͦ.ͤ.΢.ϡ/Ϡ0Ϟ0Н/ќ0ћ0њ1ә0җ1ӗ1ӕ1ӕ2Ԕ2ӓ3Ԓ2Ր3Ԑ2Տ3֎4֎4֌4֌4֊5֊5։5։6ֈ6ֈ5ׇ7ֈ6ׅ6ׅ7Ն8ք8ք8ք8փ:Ճ:Ղ:Ճ:Ղ:Ԃ;Ԃ;ӂ;Ӂ<Ӂ=Ӏ=Ӏ=ҁ=ҁ>>?@Ѐ?Ѐ@πAρA΀B̀B́B́DˁĆD˂DˁDʂFɂEɂFȂGȁGǂHǂHƂHǂIŃIŃJńKńKăKÄLÄL„LÄM„M…M…NN…NOOPPQQQQRRRRSRTTTSTTU++,,+++,./1345689;=>?ACEEHIJLNPA++*+ɾ,ɾ,ɼ,ɺ,ɸ,ɷ-ʴ-˳-ʱ,˰-̰,̭-̬.ͪ.ͩ.Ψ.ϧ.ϥ/У/Т/С/Ѡ/ҟ/ҝ0ҝ0Ԛ0ԙ0ә0ԗ1Ֆ1֔1Օ2Փ1Փ2Փ2ב2׏3؏3؏3׍3׌4׌4׊4׉4؉4؈5׉5׈5؈6ׇ6؆7׆7ׅ8؄8ׄ8ׄ8ׄ9փ:փ:փ:փ:Ղ:Ղ;Ձ<ԁ<ԁ<ԁ=Ҁ=Ҁ=Ӂ?Ҁ?Ҁ??Ѐ@Ѐ@πAπAπB΀ĆĆĈDˁDˁD˂DʂEʂFɂFɂFȂGȂGȂHƂIƂIƃJƄJńKŃKĄLĄLÄLÄLÄM„M…M…O…N…OOPOOPQQQRRRRSSSSTTTT-,+++,-.02345699;=?@ACEEHJJMOPRSA)+++˾+ʽ+˼+˻,͸,Ͷ,͵,̴-̲,ͱ-ή-ϭ-Ы-Щ.Ш-Ѩ.Ѧ/ѥ/ѣ.Ӣ.ӡ/ӟ.Ӟ/՞/Ԝ/՛/՚0՚0ז0ו1֕1ו0ؔ1ّ1ْ1ْ2ِ2َ3َ3؍3ٌ3ڋ4ي4ڊ5؋4و5ى5؈6و6ه6ن7م7م7م8م8؃8׃9׃9׃:׃:փ:ք:ց;Ձ;Ձ<Ղ<ԁ<Ӂ=>Ӂ>Ӏ?Ҁ?ҁ@р@р@ЁAρBρA΁B́B́ĆCˁD́E˂E˂EʂFɂFɂGȃGȂHǃHǃIƃIƄJƄJńKńKĄLĄLÄLĄLÄMÄN…M†O†OOPPPPQQQQRSSRSTTTTTU,-++,,.02345789;=??BCEFIJJMOPRSVWA***+̾+̽+ͼ+ͺ+͹,͵,δ,ϳ,ϲ,а,ѯ-ѭ-ѫ-ҩ-ҧ.ҧ-Ӧ-Ԥ.ԣ.Ԣ.֡/՟/ן/ם/כ/כ0י0ؙ0ؘ0ٖ1ؖ1ٔ1ڔ1ۓ1ۑ1ڐ2ڏ3ۏ3ێ3ۍ3ۋ3ڌ3ڊ4ۋ4ۊ5ډ5ډ5ى5ڇ6ڇ7ن6ڇ6م7م8م8ل8؃9ك9؃9؃9ׂ:ׂ;փ;ւ<ց;Ձ<Ձ=ӂ=ԁ>ԁ>Ӂ?ҁ?Ӂ?р@сAс@ρBЁBρB΀B΂ĆD̂D́E˂E˂E˂FɃFɂFɃGȃHȃIƃIDŽIƃJƄJńKńLĄLąLÅLÅMÄNÄM…N†O†O†OPPPQQQRQSRSSSTTUUT,+,,-.02345799;=?@BCEGIJLMOPRSVWY[<****ξ+ν*κ,к,з+ж+д+г+ұ,Ұ,Ү,Ӭ-ӫ-ӫ-ը-ԧ.դ.դ.ף.ء.֠.ٞ.ܟ0222233212222ߓ2ݎ2܏2܏2܍3܍3ی3܌4܌4ۊ4ۉ6܉5ۈ5ۇ6܇5ۆ7ۆ6چ7څ8ڃ8م8څ8ك9ك9؄:؃9؃:ׂ;ׁ;ց;ւ<Ԃ=ց=Ձ=ԁ>ԁ>Ӂ?Ӂ?ҁ@сAсAЁBЁBρB΁CσC͂D͂D͂E˃E˃FʃGʃGɃFȃHȃHȃIǃIDŽIƄKƄKŅKńKąLąLąMĄM„NÅN†O†O†O†OP‡P†PRRRRRSSSSTTTTU,,,-.0234679:<=?@BCEGIJLMOQSSWWY\]]7*++Ͽ+о,Ѽ+л+Ѹ+ѷ+Ѷ+Ӵ,Ӳ-ӱ-Ԯ-խ,֬-֫-֪.է.ܧ1389<==;;:9876544456455434ލ3݌3ފ4݉5߉5މ5ވ6܇6݇6݆7݆7݇7܅8ۅ8ۅ8ۃ8ڃ8ڄ9ك9ك:ك;ׂ;ׂ;ׂ<ׂ<ׁ=ւ=Ձ=Ձ=ԁ?Ԃ?ҁ@ҁ@с@с@с@ЁBЂBςC΂C͂ĈD͂D̃F˃E˃GɃFʃGɃHȃIȃIǃIDŽIDŽJƄKńKƅKąLŅLąMąMÆNÆN†OÆOÆOP‡Q‡PQRRRRSSSTSTTUT,,-.02346799;=?@CCFGIJLMOQSTWWY[]_a^0*+**ҽ+ҽ+Ӻ+Թ+Ӷ,Ե,Գ,ֳ,ְ,֯,ݯ17=<;::98775566665567765454ߊ5߈5߈6߈6݇6߆6ކ7ކ7݆8܅8܅8ۃ9ۅ9ۃ9ڃ:ڄ:ل;ق;؂;׃=؂<ׁ<ׂ=ւ=ւ>Ԃ?ԁ?Ԃ@Ӂ@ҁ@тAсAЁBЂCρCσC͂C͂D͂ẼF˂F˃GʃHʃGɃIɃIȄJDŽJȄJDžKƅKƅKƅLŅLŅMąMĆMÆNÆOÆPÆO†P‡P‡Q‡QPRRRRSSSTSUUU-./234578:;=>@ADEFHJJMNPRTUXYZ\]_acdY+***ҿ+վ+ռ,պ+Ը+׷,׶-2=FHFFFECBA?>>=<;::97766566666666767766455߇55߆7߅7އ7ކ7݅7݅8܅9܄9ۄ9ۄ:ۂ:ڃ;ق;ق;ف<؁=؁<ׂ=ׁ=ց>Ղ?Ԃ?Ԃ@ӁAӁ@ҁAсBЂBЁCςCρC΂D͂D̓E̓F̃F˄G˃GʃGʄHɃIȄJDŽJȄKDžKƅKƅLƅLŅMŅMņMĆNÆOĆNÇPÇPÇP‡P†Q‡QRRRRSSTSSUTU//235578:;=>@ADEFHJJMNPRTUXYZ\^aabdhiL**++־,־*ؼ*ݻ/=IJJIHGFFDCBA@?>=<<;::8775666666676667777776555677߆7ކ7ޅ8݄8݅9܄9ۄ:܂:ۂ:ڄ;ځ;ف<ف<؂=ׂ=ׂ>ւ>Ղ?Ղ?Ղ?ԁ@ӃAҁA҂BтBЂCЃCςDςD̓E̓F̃F̃F˄G˄HʃHʄIȄIɄJȄJȄKDžLƅKDžLņMŅNŅNŅMĆOĆNÆOÇOÇPÇP‡RÇQ‡RSSSSSSTTTUU0135589:;=>@ADEFHJJNOPRTUXY[]_abdehikm:+++-8FOONLKJIGGFEDCBA@>=<<;::9866776776677777787778877666777߅8ބ9݅9݄9ރ9݃:܂;ۂ;ۂ<ڂ<ق<ق=؂=׃>ւ>փ?Ղ@Ԃ?ӂ@ӃAӂA҃BуBЂCЃCςD΂D΃F̓E̓F˃F˄GʄHʄGʄIɄIɄJȄJȅKȆLƅLƅLŅLƅNņNņNĆOćOÇPÇPÈP‡PÇQÇQ‡QRRSSTTTTUU235589:;=>@BDEFHJKNOPRTUXY[]_abdehikmog/->PRQPONMLKJIHGFDCBB@?>=<<::98767676676677777777788888866777߅9߅9݅8߄:ރ:݃:݃;܂;ۂ<ڃ<ق<ق=؂=ׂ=ׂ>ւ?ւ@Ղ@ԂAӃAӂB҃BуCЂCЄDЄDσE̓Ë́F̓F̄ḠG˄IʄHʄIɄIɅJȅKȅLȆKƅLDžMņNņNņNņNćOĈOÇPÇPÈQÇQÇQ‡Q‡RˆSRSTTTTUU4569:;<>?ACEFGIKLOPQTUUYY\]_acefijlnpqudUTSRQPPONLLKIIGGFEDCA?>=<<;::987767668678888887778888889876788߅99߄:ބ:ބ:݃;܂;ۂ<ۃ=ڃ=ڃ>؂>؃>׃?׃?փ@Ղ@ԃAԃAӄB҃B҃CЃDЃDσE΄D̈́E΄F̈́G̅ḠG̅HʅHʄJʅJɅJȅKȅLdžLDžMdžMƆNņNņNņNŇOĈOćQÈQÈPÈRÈR‡QˆSˆSSSTUTTT77::<=?@BDFFHIKLOPRSUXYZ]^`bcegiklnpszbVTSRQPONMLKKIGGGEDCB@??><;;:987888878888888888888888889989888999߄9߄:ރ;ނ;܃;܄<܂<ۃ<ڃ=ق=؃>׃?ׂ?փ?Ճ@ԄAӃBӂB҄CуBуDЄDЃEτE΄EͅF̈́ḠḠH˄H˄IʅJɅKȅKɅKȆLdžLdžNdžMƇNņNņOņPŇPĈPĈQÈQÇQÈRÈRˆRÈSÈSTT‰TTUU8::<=?@BDFFHJKMOPRTVXZZ]^`bdfhikmoqvWUTSRPPONLKKJIHGEEDBA@??>=<::988888888888888888888898899989888999::߃:ބ:݃;܄<܃<ۃ=ڃ=ك=ك>ׄ?׃@փ@Մ@ԃBӄBӄB҄C҃CуDЄDЃEτF΄F΄F̈́G̅H̅I˅I˅JʅJʅKɅKȅLȆLLJLdžMdžMƇOŇOƆOŇPňPĈQĈQÈQÈQĈR‰RˆTˆS‰SSTŠTUU::==@ABDFGJKLNQQRTVXZZ^^`cdfhklnps}nWVTSQPPONLKJJHGFEDCBB??>><<:98788888888888888898:999:99:99998899::߄:߄;ބ;݃;݃<܄<ۄ=ۃ=ك=؄>؄?׃@փ@քAՄBԄBӄB҄C҃D҃DфEЄEτEυF΅FͅHͅH˅I˅I˅JʅJɅKʅKȆLȆLdžLdžMdžNdžOƇOƇOŇPňPĈQňRÉRÈSÈSˆRÈS‰TTTŠUUU;=>@BCEGHKLNPQQTUWYZ[_`bddfhklnpw[VUTSRQPNMLKJIHGEDCCBA@?>==;;:9888999898898:998:9899:899:;9;;:98999:;߄;ބ<݃<܄=܄>ۃ>ڃ?ل?ׄ@׃@ք@քAՄBԄBӄB҄D҄DфDфDτE΄FυG΅FͅHͅH̅I˅IˆK˅JɅKɆLȇLȇLȇNLJNLJNƇOƇOňPƇQʼnPĉRĉRÈRÉRÈSÉRÈTT‰TŠUŠUU>@BCDEGHKLNPQRUVXZ\]``bdfhjlmpq|zVUTSRQQPOMLJIHGFEDCBA@?>==<;;:9999999999999999:99:::::;:::::::9999::;߄;ބ<݃=݄<ۄ=ۄ>ڄ?ل?؄?ׄ@ք@քAՄBՄCԄC҄D҄CфEфEЅFυF΅G΅HΆĬĬJ̅IʅKʇKʆLɆKɇMȇMȇNLJNLJOLJOƈOňQƈPʼnQĈRĉQÉRĉSÉRÉTÉT‰TŠTŠUV@BCDEGHKMNPQSVVY[\]`acffhjlnpv_VUSSQQPONMLKIHGFDCCAA@?>=<;;:::99989999:9:9:99:::::;:::;;::::;9999::;߅;ބ<݃=݄=܄=ۄ>ڄ?ل?؄@ׄAׄAքAՄBՄCԄCӅD҄DхEЅEЅFЅGυGΆH͆H̅ĬJ˅JˆKʆKʇLɇLɇMȇMLJNLJNLJOƈPƈOƈQňPĈRĉRĈQĈSĉSÉSÉUŠTŠTŠUŠVCCFGIJMMOQSUWXY[]^`acegilmnqy~XWUTRRPONMLKJIGGFDCBA@??==;;:9::::::99:9:::9::::;::;::;;;;;;;;;:99:;;;߅;ޅ<ޅ=݄=܄=ۄ>ڄ?ڄ@؄@؄AׄAքBՄBԄCԄCӅD҄EхEЅFЅFЅG΅GͅHΆH͆J̆JˆKˆKʆLʇLɇMȈMȇNȇOLJOLJPLJOƈPƈQĉRʼnRĉRĉRĉSÉSÊTĉTŠUÊUÊVEFGIJMNPRTUXY[[]^abdfhilnor|^WWUTSQPONLLKIHGGFEDA@@?>=<;;::::;;::::::::::;::;::::;;:;;;;;;;;;99::;;߅<ޅ<ޅ=݄>܅=ۅ?ڄ?ل?ل@؄@ׄAքBՄBԄCӄDӅE҄D҅EЄFυGυHφH΅H͆I͆J̆JˆKʇLˆLɇMʇMɈMȈNȇNLjOLjPƇPƈQƉQʼnRʼnRĉRĉTĉSÉSÉTÊUËTÊUGHJKNOQSTUXY[\__bdeghjmopt~|YWVUSRQQNMLKJHHGFEDCB@@>==<;::::::::;:;::::::::;::;:;;;;;;;;;;;<;:::;<;߅=ޅ=ޅ>݄=܅>ۄ?ڄ?ل@لA؄AׅBքBՄCՄCӅD҅E҄FфFцGЅGφHΆIΆI͆ĬJ̆J̇LˇLʇMɇMɇMɈNȇNLJOLjOLjPƈQƈRʼnRŊRŊSʼnRĊSÉSĊUĊTÊUÊUJKMOQRTVWYZ\^`acefhjmnpqt[XWVTSRPOOMKJIHGGFFDCB@@>><<;;;::;:;;;;;;:::;;::;:;;;;;;;;;<;;;<<<::::;;=߅<ޅ=݅>܅>ۄ?ڄ?ل@؄A؄AׅBՄCՅDՅDӅEӅE҅FхEЅGЅGφHΆIΆI͇J͆K̇LˇKˇMʇLʈNɈNɇOLjNLjPLjPLjPƈQljQŊRƊSʼnRĉSŊTĊSĉUŠTËULMPQRTVXZ[]_abdfhjjmnprvtYXVVTSRQONMLJHGGGFEDCB@?>=<;:::;;;;;:;;;<:;:::;:;;;;;;;;<<<<<;<<<<:;:;<<=߅=ޅ>݅>܅?ۄ?څ@لA؅BׄAׅCՄCՄDԅDԅEӅE҅FхFЅGφHφHΆJΆI͇K͇K̇KˇLˇMʇMɈNɈNȈPȈOLjPLjPƉPƉQʼnQŊSĉRŊSŊTĊTĊUĊUËUPQSUUWY[]_abdefikknoqsvZXXWUSSQPONMKKHGGGEDDCBA?>>;::;;;;;;;;;;;;<:;;;;;;;;;;;;<<<<<=<<=<=:;:;<<=߅>ކ>݅?܆?ۄAۅ@ن@؄B؄BׅCօCՅDԅEӆF҅G҅FцHхGІHΆIΆJΆJ̆K̇KˇLˇLʇMʈNʈNɈOɉPȉPȉPLjPƈRljQƊSƊSŊSŊTŊTĊTŊUËUQSUVXZ\]_`befhjlloprsweZYWVUSRQPNMMLJHGFFEDDBBA?>=<;;;;;;;<<;<<;<<;;;<;<;;;<<;<<<<<=<=<===;;;<<=߆=ޅ=݆>݅?܆@چ@څ@نA؅BׅCօCֆCՆEԆEԆF҅F҅GцHЅHІHχI·I·K͇K̇L̇L̈MʇMʈOɈOȉPɉOȉPȉQljQljRƉRƊSŊSŊSŊTĊTĊUċUTVXY[]_aacfgikmmpqstw[YYWUTSRPONMLKKIGFEDDCBA@?=<<<;<;;;<<<;<<<<<<;<<<;<<<<<<<<<<<<<==<==<;<=<>߆=ކ>ކ?݆?ۆ@ۆ@چAنA؆BׅCׅCՆDԆDԆE҆F҅G҅HцHφIφIχJ·J·K͇L̇L̈LˇMʈMʈOʈOɈOɉPȉQȉQljRNJRƊSƊSƊSŊTŋUċTŋUWYZ\^`bcdfhjlmnqrsuw[ZYXWVTRQQOMLLKJIGEEECBAA@?=<=<<<<;<<<<<<<<<==<<;<;<<<==<<==<========;;<=<>߇=߇>ކ?݆?܆@ۆ@چAمC؆B׆CֆDՅDՆEԆEӆF҆FцHцHЇIχJ·KΈK͇K̈L̈LˈNˈNˈOɈOɈPɉPȉQȉQljQljRƊSƊTŊSŊTŋUŋUŋUZ[]_`bdegijlnorstvxi\ZXWVUTSQQPNLKJIHHGDECBA@?>=<===;<<<<<=<<<==<<<<<<<<<<==<=======>=>==;<<<==߇>ކ?݇@܆@ۆAۆBچBمB؆C׆DֆDՆEԆEӆFӆG҆GцHцIχIЈJ·K͈L͇L͈L̈NˈNˈNʉOʉPɉPɉPȉQȉQNJRNjRƋSƋTŋSƋUŋUŋV\_`bdfghjlnppstuxz\[ZYWUUSRRPONMKIIHGFEDCBA@>>=><===<<<<<<<====<==<<<=<===<======>==>==<;;<==>߇>އ?݇@܆AۆAۆBنBنC׆DׅDֆEՆEԆFӆF҆G҇IцIЇIЇJψKΈLΈL̇M̈M̈NˈNˉOʉOɉPɊPȉQȊRljQȊRNjTNJTŋTƋUŊUŋU_acdfgjkmopqtuwy{]\ZYXWWTSRRPONLKIHHGFEDCA@?>>>>><==<<<=<<<<======<======<<<=====>>==>=<<<==>>߇@އ?݆A܆@ۆBهBنC؇C׆DևDՆEԆEԇFԆG҇HцHцIЈJЈJψK·L͈L͈M̈NˈOˈOʉPʉPɉQɊQɊQȊRȊSNjRNjTƋTƋTŋUŋUbdeghkmnprtvwxz|b]\\ZWXVTTSQOONMJJHGFFEDBA@>=>>>>=====<<======>=>=<<==========>>=>>>>>>==<=>>߇?߇?݇?݆A܇AۆBڇBنC؇CׇD׆DևEԈGԆF҆GчIчIЈJЇJψKΈLΈM͈M̉M̈N̈OˉOʉOʉPʊQɊQȉRȊSȊSȋTNjTNjTƋVŌVegijmnqrtuwxz{~t^]\\ZYWVUTRQONMMLIIFFEECB?>=>>>>?>=>><=<=====>>>==========>==>>>>>>?>>><<===>߇>އ@݇@܇@ۇAڇBهC؈C׆DֆDՆEՈFԇFӇH҇HчIчIЈJЈKψKωL͉L͈M͉N̉OˊOˊPʉPɊQɊRɊRȊRȊSNjSnjTƌUƋUƌVijmnorsuvxy|}`^\\[ZXWVUTRQONMLKJHGFFECA@????????=>>=>==>=>>>>>>>>=====?>=>=>>?>>????><<>>>?߇@އ@݇A܇BۇBڇCنD؇DׇE׈EֆFԈGԇGӈH҇IчIшJЈJЈKΉLΈM͈M͉N̉ỎOˊPˊOʊQɊQɊRȊRȊSNjSȌTƌUNjUƌVknppstvyz{|~a`_^][ZYWUTSSQONMKJIIGEEDCA???????????>?>==>>?=??>??>??>>>???=??>???>>??===>>??߇@ވ@݇A܇BۇCچCهD؇EևEևFՈGԇGԇHԈH҇IчJЉJЈKωLΉM͈L͈N̊NˉOˊPˊPʊPʊQɊRʋRȋRȋSNjTȌUƌUNjUoqquuxz{|cba_]\[YXWVSSRQONLKIIHFEDCBA?????????????>>>>????????>??>????????????????===>?@@߉A݈A܈AۇBڇCڇC؈DׇE׈FևFՈGԇGӈIӈI҈JшKЉLЈLωMΈM͉N͊N̉O̊OˊPˋPʊQʊQɊSȋRɋSȋTȋUnjTnjUsswvy{|}jcb`_^[[YWWUSSRQNMLJIIHGDDCB@@@????@@@????>???????????????????????????????=?>???߇@ވA݇AۇAۈCڇCوD؇E؇EևFֈGԇHԈHӉIӉIшJщKψLωLωMΉM͉N͉O̊P̋QˊQˊQʊQʋRɋSȋTȌTȌUnjUnjUuxy{|~ydba`^]\[ZYWVTSQPONLLIHGFDCBAAA@@@??@?@???????????????????????????????????=>>??@AމA݈A݈AۈBڈDڈCىDׇE׈FևGՉHԉHӇI҉J҉JщKщLЉLωMΉMΉO͊N̊P̊P̋QʊQˋQʊRʊSɋSɋTȌTȌUnjUyz|fdda`^]\[YXWUTRQONNMJIHGEDBAAAA@@@???@?@????????????????????????????????@?=>???@߈@މA݈A܈CۉDډCوD؉E׉E׈G։GՈHԈIӈI҉J҉KщKЉLϊLωMΉN͊N̊P͊P̋QˊQˋRʋRʋSɋSɋTȌTɍUnjU{~feecaa^]\ZYXVUTSPONMLKIGFFDBBBBB@A?@@@@@@?@A??@??@@@?@?A????@@?@@?@A??@@?@?>?>?@A߉B݈A܈B܈CڈDوEوE؉F׈F։GՉGԉIԉIӉJ҉JщKщMЊMЉMϊNΉO͊O͊PˋQˋQˋRʋRʋSɋSɋTɌTȍUǍVigfdca`_]\[XWVTSSPONMLJHGGECCBBBBBB@AAAAAABAA@????@@@@?A@@?@@@??@@A@@@?A@?@=>??@@߉@ވA݈B܈CۈCڈEوD؉F׉E։G։GՉHԉIӉIӉJщLщLщMЊNωMΊO΋O͊P̊P̋QˋRˋSʋSʌSɋSɌUȌUȍVjigfdcb`^]\ZXWUTTRQONLKJHFEDBCBBBBBBBABABBABAAA@@@A@A@AAAA@@@@@@@A@A@@A@@@A?>???@A߉BމA݉C܉DۉDډEىF؉F׉G։GՉHՉIԉJӉKӉJъKЊMЊMωNϊNΊO͊P͋P̌RˋQˋRˋRˋTɌSɍTȌUɍVlkigfdca`_][ZYVVTSQPNMKJIHFECDDBBCBBBBBAABBBBAAA@@@@A@@AAAA@@@@AA@A@@AAAAABA>?@@@@ߊBމB݈C܉CۉCډEىEىF؉F։H։HՉIԉIӉJӉKъLщLЊMЊNϊNΊO΋P͋P̋QˋQ̋RʋSˌSʌSɌTɍUɍVmlkigedba`^^\ZZWVTSQPNMLIIGEEEDDBCCDBBBBABBBBBAAA@@@AA@AAAA@AA@@@@AAAAAAAABA?>@@A@߉@߉BވB݉C܉DډEډEىF؉G։G։H։IՉIԉKҊKҊLъMъMЊNϊOϊO΋P͋Q͋P̌Q̋RˋSˋSʌSɌTɍUɍVomljhgfcbb_^]\ZYWUTRRONMKIIGFEEEDDCDCDBCBBBCCBCAB@@AAAAAAAAAAA@AA@AAAAABBAABB??@@@A߉BމBމC܉D܉DۉEډFىF؉G։IՉIԉJԉJӊKӉKҊLыNЊNЊNϊP΋O͊P͌Q͋Q̌ŘSˌSʌTʌTɍUʍUqpmkkjhgdca__][ZXWUTRPNNLJIIFFFFFDECCDDCCCCCBCBBABBAABBBBCCAB@BA@AABAABABABBA???@AAA߉C݊D܉CۉDۉEډFىG؉G׉H։IՉIԉJԊKӊKҊLъMъMЊOϋOϋP͋P΋P̌R̋ŘRˌSˌTʌTɍUɍUrqpmmkjhfcba`^]ZYXVTSRPOMLJHGHFEFEDEDDDDDCBCCCCCCACBBBBCCBABBAABABABBBBBCBCBBB?@?@AAߊBފC݊C܉DۉEډFىF؉G׉H։I։IՊJԉKӊKҊMҊMъNыOЋOϋP΋P΋Q͌R͌R̍SˌS̍SʌTʌUʎVusqommkihfeca`]\[YWVTRQONLKJIHGGFFFFEDDDDDDCCCCCCCCCCBBCCCBBCCBBBBBBCCBCCCCCCB@@@@ABBߊC݊D܊E܉EۉFډFىG؉H׉I։J։JՉKԊLҋLҊMҋNыOЋN΋P΋P΋Q͌Q͌R͍ŘS̍SˌTˌUɍVvtsqpnljihedc`_^\ZYWVTSQOMLLJHGHGFGGGGDDFECDCDCCCDCCCCBCCCCCBCCCBCCCBCCCCCCCCC?@?@AABߊBފD݊D܉EۊEڊGىG؉H؊H׉J֊IՊKԋKӊLӊMҋMыNЋOϋPϋP΋Q͌R͌S̍R̍S̍TʍTˍUɍVwvtrqonlkhgfdba_]\ZXWUTRPONKJJHHHGGGFFEDFEEEDDDCEDECCCBCCCCCCCCCCCCCBCCCCCCCCCB?@@ABCߊBފD݊D܊EۊFڊFيG؊H׊I׉J֋JՊKӊLӋLӊMҋNыNЋOЋOϋP΋Q΋Q͌R̍S̍S̍TˍUʍTʍVywvurqomljiffdb`^][YXUTRRPONKJJHHHHGGGGFFFFFEEDDDEEECCBDCCCDCCDCCCCDDCCCCDCCDCC@@AAACCފD݊D܊E܋FڊFيHيH׊H׋J֋JՊKՊKԋLӋMҋNыNыOЋOϋPϋQόQΌŘS̍SˍSˍUˍUʍV{zwvtsqommjhfeca`^][XWVTSPPOMJKJHHIGGGGGGFFFGFFEDDDEEDDCDDCDCDCDDCCDCDCDDCCDCDDA@AAABCߊCފE݋E܊EۊGڊGيH؋I׉I֋J֊KՋKԋLӋMҋMҋNыOЌPЌQΌQόQ͌Q͍R̍S̍ŤTˍUˍV~{ywvtrqomkjhfdca`^\[YWUTSQONMKKKJJIHHHHHGFFGFFFEDEEEDDDDCDDDDCDDDDDDCDDDDDDDDDB@@AABCDފD݋E݋FۊFۋGيH؋I؊I׋J֊KՋKԋLԋLӋMҋNҌNЋOЌPόQόR΍RΌS͌R̍T̍UˍUˍV}|zxutrpnmkihgdba_][ZXWUURQNNLKKKJIJIHIHHGGGFFEEEEEEEDEDDDDDDDDDEDDDDDDDDDEDDDD@@@ABCߋCދD݋E܋F܊GۋGڊHًH؊I׋J֋KՋKԌLԋMӌNӋOҋNьOЌOЌQόQΌR΍S͎S̍T̍TˎUˍUӁ}|zwvusqomkigfdba_^\YXWUTRPOLLLKKJJJIIIHHHHHHGFFEEFFFEFDDDDDDDDFDDDDDDDDDDDDDE@AABCBDߋDދE݋F܋GۋGڋIيH؋I׋J֋JՋKՋMӋMӋMӋNьNьPЌOЌQόQόR΍T͎S͎T͍U̍VˍUӃҁ~}|{xvtsqomkiheca`_^\YYVUSQPOMLLKKJJJJIIIHHFHHGGGFEFFFFFEEDEDEEFEDDDEEEEEDEDEFB@ABCCDߌDދE݋F܋GۋGڋHًHٌI؋J֋K֋KՋKԌMӌNҌOьOьPьPЌQόQόR΍S͍S͍T͎T̍U̎UߜӅ҄ς~|{yvusqnljhheca__][YXVTTQPNMMMKKKJJJJIIHHHHHGHFGGGGFFFEEEEEFFFFDEEEEEEEEEFEBAABBCCEދEދE܋F܋HۋHًI؋I؋J׌K֋LՌKՋMԌNӌNҌOьPьPЌQύRόSώSΎT͎U͎T̎V̎V׏ӈцτ΂}}{xvusqnlkigeda`^]ZYWUTRPPNNMMLKJJKKIIJIHHIHHGGFGGGFFFEEEEFFFEDEEEEEEEEFEECABBBCDEߋDދF݌F܋GیGڋHٌI؋J׌K֋L֌LՌMԌMӌNҌOҌPьQЌQύQώRύRΎS͍U͍T̎U̍VՌӉщυ΄˂~{{xvtrpoljhheca`^\ZXWUTRPONNNLLLLKJKIJJJHHHIHGGGGGFGFEEEFFEFFFEEEEFEEEFFEF@BBBCDDߌDތF݋F܋GیHڋIٌI؋J׌K׋K֌M֌MԌMӌNӌOҌPьPЍPЌQЍSώSΎSΎT̎U̎U̎VՎҌъω͇˄ʂɀ~|{xvtrpnljifec`_][ZYVUTRPPNNNLLMLKKKJJJJHHIHHGGGGHFGFFEFFFEFFEEEEFEFEEFFFAABBCDDߌEތF݌F܌GیGۋIًJ؋J،K׌L֌M֌MՍNӌOӌOӍOэQьQύRЍSώSΎTΎT͎U͎U̎VԏҎьΊ͉̆ʄɃȁ~|yxuusonlihfdb`_\[YWVTSQOQONNLMLKKLKJJIIIIIHGGGGGGGGEFFFFFFFFEEEFFFFFFFFCBBBCDDEߌFދG܌HیHیIڌIًJ،K׍L֌M֌MԌNԌNӌOӍPҌPэQЍRЍRώSΎTΎTΎU͎U̎VԑӐюЌ͊̉ʅȄȃƀ~|yyvtromligedb`_]ZXXVSRQQQPOOMNLLLLKJJJIIIIIHGHHGGGGFFFFFFGFFFFFEFFFFFFDABCDEDFތF݌G݌H܌HیIڌJٌJ،K׍K֌LՍMԌMӌNӍOҍPҌQЍQЍRЍSώSϏTώT͏U͎V͎VךԕӓАΎ͍̋ʉȆDŽƃƁ}zxvtrpnkihfdb`_\[XWVTRQQPOONNNMLLLKJJJIJIIHHGGHHGGFFGFFFFGFEFFFFFFFGFCBBBDCEEߌFތG݌H܌HیJڍJٌK،K׌L׍L֌MԍMӌNӍOҍPэPЍQЍRЍSώSώTΎT͎V͎V̎VՙԗӔѓϑ͏ʎɊɈȇƅŃā|zyvtsomkjgedba^\[YXUTSRQQOOONNMKLLJJKIJJJIHIHHIHHHGFGHHGHGGGFGGGGGGHEBBCDDEFߌGލH݌G܌HیIڍJٌJ،L،K׍L֌LՍNԍOԍOӍPҍQэQюSЎSώTώUϏT͎UΏV͏WԜԚҘϖΔ̑ˏˎȊljƈĄÂ~}zxvtrpmkjgddb`^\[YWTSTRRQOPNNNMMMMKKLJJKJIIIIIIIIGHHGHHHHGGGGGHGGHHECCDDEEFߌGލGݍHݍHیIڍJٌKٌL׍L֍M֍MՍNԍOԍPӍPҍRҎRюRЎSώTώUώU͏UΏV̏Wޭ՞ӜқИϖ͔˒ʏȍnjʼnĈąÂ€~|zxvtronljhedb_][ZXVTSSRRQQPNONMNNMKKLKJKJJIIIJHIIGHGHHHHHGGGHGHHHHFBCDDEEFߍHߍGݍHݍI܍IڍJڍJ؍K؍L׍M֍MՍNԍOԎPӍPҍRҏQюRЎSЎTϏUϏUΏV͏V͏W֣ԡӟҜϚΙ͖˔ʒǏǎƋʼndž~{zwvtromkigeca_]ZYXVVTTRRQQPPPOMMMLLLKKKKJJJJJJIIHIHIIHHIGHHHIGHHIGCDDEEEGGߍGݎH݌IۍIۍJٍKٍK؍L׍N׍M֍NԍOԍPӎPҍQҍQюRЎSЎTϏTϏUΏUΏV͏WեԣҡҠНϛ̙˗ɕɒǐĎċˇ~|zxvsqnmkhfdba_]ZYVVUUTSRQQPOONNNMLMMLLLLKJJJKJJJIIIIIIIHIIIIIIIIHDDDDEEFߎGߍHݍH܎H܌JۍIڍKٍL؍L׍M֍M֍OԍPԍPԎQӎRҏQюSЎTЏTϏUϏUΏVΏW͏WըӦҥѣРϞ̛˙ɗȕǓƑĎˊ~|yxuspmlkhgdca^\ZYWWUUSUTSRQPQNOONNMMLLLKKKKKKKJIJJJKIJJJIJIIIJJIDDDEEEGߎGߍHގIݎI܎JێJڎKٍM؎L؍M֍N֍OԍOԏQԎQӏRҏRҏRяTЏTϏUϐVΏVΏW͐W׭ԫөҨѥϣΠ̞˜ʙȗǕƓđ΍~{zxvtqnljgedba^]ZZXWWVUTSSRQQPOOONNNMLMMMLKKLKKKKJKJJKKJJJJJJJJHDDDDFFGGߎHގIݎI܎KۏJڎKٍM؍L؎M׍O֍OՍPԏPӎPӏQҏRҏSяTЏTϐUЏVΏWΐWΐW֯ԮӬѪШϦ̡̣ʞʜǚƘŖĒ‘}|zwusqomjgfdaa^\ZYYXVVTUTSTQQQQOPNNOMMMMLLLMLLLJJJJKJKJJJJJKKKHDDEDFGGGߎHގIݎJ܎KێKڎLَL؍L؍N׏N֎OՎPԏQԏQӏRҏRҐSяTяTϏUϏVϏVΐW͐WݼմԱҮѬϪϨ̤ͦʡɟȜƛŘĖÒ~}ywvrpnljhfcb_^][YYXXVUTTTRRRPPQOOONMMMMLMLLKLJKKJKJKKJJKJKJKJDDEFFGGHߎIގJݏJ܎JۏKڎLَLَM؎N׏OՎPՏPԏQԏQӏRҏSҏSяTЏTЏUϐVϐVΐWΐWطյԲӱѯϭΪ̦ͨ˥ɢȟǝśėՓ~{ywuronjihedb_\\[ZYWWVVVTSRSQQQPOOONMMMMLLMLLLLLLLKLLKKKLLLLHDEEFGGGHߎIގIݎJ܎JۏLڏLَMُN؎O׏O֎PՏPԏQԏQӐRҏSҏTѐTАUЏVϏVϐWΑXΐX׺չԷѴвϯέͬ˩ɦȤǢƟŞÚ˜}zywtqonkhgdba^]\[ZYXXVVTUSSSQQQPPPONNONNMMNLMLLLLLLMKKLLLLLJEEFGGHHIߐIݎJݐK܎KڏLڎLَM؎N؎O׏O֏PՏPՏQԏQӏRҐSҏTяUяUАUАVϐWΑW͑Xؾ׼ԻӹҷеϲͰ̮˫ʨɦǤơşĝ›|zwusqomkhfdb`^]\[ZYYWWUTURTSQRQPPPPONNNNNNNMLMMMMMMLLMMLLLIEFFGGGHIߏIݏJݐK܏KۏKڏMُM؏N؏O׏O֏PՏPՏRԐQԐRӏSҐTѐTѐUАVАVΐWΑXΑXռһѹзεͲ̰ˮʫȩƧŤĢŸ~}ywurqmkigedb`_]\\[XXWWVVUTTSRRRQQPNPOPONOOOMNNNMMMMMMMMMMIFFFGGGHߐJߏJސJݐKܐLېLڏMُM؏N؏O׏O֏PՐQԏRԐQӏSӏSҐTѐUѐTАUАWϑWΑXΒXҾѻкͷ̶˴ʲɮȬǪƦĤ¡Ÿ~|zwurplkjgdcb`^]][[ZYXVVVUTSRSSQQQQPPPOPOONONNNNMNNNMMMMMHFGGGGIHJߐJސKݐKܐLېLڏMڏN؏O׏OאP֐P֏QՐRԏRӐSӐSҏTѐUѐVАVАXϑWΑYΑXоϼͺ̸˶ʳɱȯǬƪĦä¢~|ywsqonkigeca`__\]YZXYYWVVVTTSRRRRQQPPPOPPNPNNNNNONNONNNGFGGHHIIIߐJސKݐKܐLۏLڏMڏNِN׏PאP֐Q֏QՐQԏSӏSҐTҐTѐUёVБVБWϑWϑXΑXϾμ̺ʸɵȳDZƯƭĪæ}{ywsromjgfebaa_^]\[ZYXXWVUVUTTRRRRQRQQQQPPPNOOOOOONNONNFGGHHHIIJސJސKݐKܑLېMڐMِNِOאOאQ֏P֐RԐRԐSӐSӏTҐUѐVёVБVϑWϒXΒXΑYο;̺ʸȶdzƱůì©æ|zxvsqnligeddba__^\\[ZYYWWVVUUTSSSQRQQPQPPPOOOOOOPNNNONGGGHHHIIߑJސJݐKܐLܑLېNڐNِO؏OؐP֐Q֐QՐRՐRԐSӐTӑUҐUёUёVБVϒWϑWΒXΒZͿʾʺȸǶŴŰįì}{wurpoligedcb``^]\\[ZYXXWVUUTSTSRRQQQQQQPOOOOOOONNNOMGGGHHIJJߑJޑKޑLܐLۑMڐMڐNِOِOؐPאQ֐RՐRՐSՑSӐUӑUґUёUёWБXБXБYϑXΒZʽȻǸƵƳðî¬~|ywuromkhfedbaa_^]\[[ZYXWWVUUSTSSSSRQRQRQQPOPPPQOPOPKGFGHIIJKߑKޑLݑLݑLܐMڐMِOِOؐPؐPאQ֐RՐRԐTԐTӐUҐUґVђVёVђXϒXБYϑYΒZǾǺƸŵijð}{xvsqoljhfddcaa_^\[[ZYXXWVUVUTTSSRSRRRRQQPPPQQQOPPPJGGHHIIJJߒJޑLݑMܑMܑNۑNڐOّPؐPאQאQ֐R֑SԐSԐTԑTҐUҒUђVВVБWБWϒYϒYΒZƾƺĸĶó°®|zwurpokigfdcba`^^]]\Z[YXXWVWTUUTSSSRRSRQPPQQPQQPPPHGHHIIJJJߒKޑLݐLܐMܑNېNڑOّPؐPؑQ֐R֑R֑SԑSԑTӑUӑUҒUґWђVВXВXϒXϒYΒZŽŻķö³~|xvurpmkgggfbaa__^]\\[YYXYXVWVVUSTURSRSSSQPRQRRQQPGGHIIJJKߒLߑKޒLݑMܑMۑNڑOڑOّPّQבQ֑S֑R֑TԒTӑUԑUґVёUђWВWВXВXϒYϒZΒZſŽĺĸ}{xvsqolihgfedbaa_^^]]ZZYYXXWVVVTTTTSSSRSRRRRRRRQNHIJIJJJJߒLߒLޒMݑMܑNۑOڑOّPّPؑRגR֑S֒SՒTԑTԑTӒUӒVҒWґWђWВXВYϒYϒYΒZĿļºø´~zxvtpmkiiggecba`_^]\\[ZZZYXWWWUTUVUTUTTSRRSSRRRKIIJJKKKKLߒMޒMݑOܒNۑOڑOّPؒPؒRבQ֒R֑SՒTՒTԒTӒVҒUҒWђWђXГXВYϒYΒ[ΒZľļ¹~|zwtrpnkjhhgedca`___]\\ZZYYYWXVVUUTTUUTSSSSSSRRIHJIKJKKLߓMޒNݒMܒNܒNےOڑOْQؑPؑQבRגS֒TՒTԒUԒUҒVҒVҒWђWѓXВXГZϒYϒ[ϓZýû¸~{xusqnmjjigfecbb``_^]\[ZZYZWXXUUUUUUUTTSTSSTSOJIJJIKKLLߒMޓMݒMܒOےNۑPڑPْQْQבQ֒S֒SՒTԒTԒUԒUӒVҒWҒWђWђXГYϒYГYΓ[ΓZ¾º}{xvspnmkjigfedbaa`_]\\[ZYZYXXVVVVUUUUUTSTTTSNIIJJKKKLLߒLޒMݓNݒNܒOڒOڒPْQؒRؒRגS֒SՒTՒUԒUԒVӒWӒWғXѓXГXВYϒZГZΓ[ϓ[»~{ywtromkkihffebba`_^^\[[ZYYXXWVVVUVUUTSUSTTUKIJJKKLKMLޓNޓMݒNܒNۓPۑPڑPْQؒRגSגS֒TՒTՒUՒUԓVӒVғXѓWҒXВXВYГZϓZϓZϓ[ľ¼}{xvspomkjhgfeccaa_`]^\[\ZZXXXVVVVVVVUTUUUTRJJJJKLLLLߓMޓNݒOܒNܒPۑPړPڒPْQؒRגS֒S֒TՒTԒUՒUӒVӒVғXѓXђYВYВZГZϓ[ϓ[Δ\ý¼~{yxtqonkkjhfeeccaaa`_^\[Z[ZYYXXWVVVVWTUUUVNJKJJKKLLNߔMޓNݓOݒOܓOۓPړPْQْRؓRגS֒T֒UՒUԒVԓVӒWҒWҒWѓYѓYѓYГZГ[Γ[ϔ\Δ\¾~{xvtqommkihgfedba``^^\\[[ZYYXXXXWWWWWVVVULJJJLLLLLMߔNޓNݓOܓPܓPۓQڒQٓRؒRؒSגSדUՒTՓUՒUԓVӓWӒXғWғYВYѓYϓZГ[ϔ[ϔ\Δ]Ŀý|zwtrpnmkjjgfedccba`_^]]\[[[ZXXYWWWWVVVVQJKKLKKLMLNߔNޔOݓNܓPۓPړRړQٓSٓRדSדS֒T֒UԓVՓVӒVӓXӓXғXғYєYѓZДZД[ϔ[ϔ\Δ\¼¸|ywuqpomljihgfedbba`_^]\\ZZZXYYXXXWXWXWMKJKLKMMMNߔNޔOݔOݔPܔPۓQړQٓRٓRؓSؓS֓U֓T֓UՓVԓWӓVӓWғXѓYѓYєZГZєZϔ[ϕ[Δ\Δ\º}zwusqonlkkhgffdccba`__^]][[[ZZXXXXXXXRKLKLLLMNNNߔOޔOݔOܔPۓPۓRڔRړSٓSؔTדTהUՓUՔVՔVԓWԓWӓWғXҔYєYєZє[Д[Д[ϔ\Δ]ϕ\ÿ½|xvtsqpolkjihgdecba``^^^\[\[ZZZZXXXWWLLKLMLMMMMNޔOޔPݔOܓPܓRړQړSٔSؓSؓSהU֓U֓VՓVԓWԓWҔXӔXҔYҔYєYєZДZЕ[ϕ[Е]Ε]ϕ\¾»~{xvtrqonlkjhggfccbb`_^^][\[ZZZYXYXXSKLMLLMMMNNߔOޔPݔPܔPܔQۓQۓRٓSؓRؓSהT֔U֓U֓VՔVՓWԓWӔXӓXҔYҔYє[ѕZДZϕ[Д\Д]Ε]ϕ]~{yvtsqpnmljhggeddbb``_]]\\\ZZ[ZXYXYOLKMNMMNNNOߔPޔOݔPܔPܔQڔQړRړSؓTؔSהUדT֓VՔVՔWԓWԔXӓXғYҔYєZѕZЕZД[ϔ\ϕ]Ε]Ε\ϕ]¾»}zwvsrpommjihgeedcca`_^]^]^\[[YYZYTMMMMMMNNNOߕOߕPޔPݔPܔQܔR۔RٔRٔSؔTהT֔U֓U֔VՔVՓWԓWӔXӔXҔZҔYҕZєZЕZЕ[Е[ϕ\ϔ\ϕ]Ε]~{xwtsqqnlljhggeddcba`_`^]]\\\[ZZYPNNMNNNNNNOߕOޔPݔPݔQ۔Q۔QڔSٔRٓRؔTؔUהU֔U֔VՔVՕWԕXԔXӔXҔZєZҔ[Е[є[ϕ[ϔ\Д]ϕ]ϕ\Δ^ľû}zwutrqpnmkjhhfdeccba`_^]^\[\\ZZTONNMMMNNNOOޔPݔPݕQܕQܔR۔RڔSٔSٔTؔTהU֕U֔VՔWՔWՔWԔXԔXӔYӕYҕZѕZѕ[ѕ\ϕ\Е]ϕ]ϕ]ϕ^Ε^ýù¶~{ywutrpomlkjhgfeddcc``__^]]]]\XPONONNNNOOOߖOޕPݔQܔRܕRەRڔSڔSٔTؔTؔUהU֔V֔VՔWՕXԕWӔYӔXӔZҕZҕZє[ѕ[Е\ϕ\Е]ϕ]ϕ]ϕ^Ε^žż¸}zxuusrpmmlkihgffecbaa__^_]]][RPONONNOONPߖOߕPޕQݕQܕQܕRەRڔSٔSٔTٔTהU֔UוV֕WՔXԕXӕXӔYӕYӔZҔZҕ[ѕ[є[Е\Е\ϕ]ϕ]ϕ^Ε^Ε_ýĹĶó~|xvtssqommkijhffdebcb_``_^]^WQPPOPONNNOPߕPޖPޕQݕRܕRەRڔSڕSڔTؔTؔUהU֔V֕V֕WՔWՕXԕXӕYӕZӕZҕZѕ[ѕ\ѕ\Е\Е]ϕ]ϕ]ϕ^Ε^Ζ_žŻŷĴ²­«|zxvutrqomkkiifhefdcbaa``_^[QPPPPOOOPNPPޖQݖQݕRܕRܕRەSڕTٕTٔTؔUוUוU֔VՕWՕXՕXԔXӕYӕYӕZҕ[ѕ[ѕ[ѕ\Е\Е\Е]ϕ]Е]Ε^ϖ^ϖ_ƽźŶŲᬩ¦~{yxvtsqpnnljiihffedcaa``_\RQQPPPOOPPPPߖPޖQޕRݕRܕSەSڕSڕTٕTؔUؔUؔV֕V֕V֔WՔXՕXԕYԕYӕZӕZҕ[ѕ[ѕ\ѕ\Е]Ж]Ж]Е^ϕ^Ε_Ε`Ζ`ȾƻƷƳİĮ먤{yxvtsqponljjigffedbba``_UTSPQQPPPPQPQߖQޕQޖRܕRܕSەSږTٕUٔUٔUהU֕V֕W֕WՔXԕWԕYԕYӕYӕZҕ[ҕ[ѕ[ѕ\Е\ѕ]Е]ϖ]Ж_Ζ^Ζ^ϖ_Ε`ȿǼǸƵƲŮŬĩæâŸÜ}zxwuurponljjiggfedcbb``XTUTQRSRQPQߖQߖQߖQޖQޖRܖRܕSەTڕSڕUٕUٕUؔUוV֔V֔X֕XՕXՕYӕYԕZӕZӕZӖ[і\Җ\ѕ\Ж]Ж]ϕ]ϖ]ϕ^ϕ^Ε_ϖ`Ζ`ɾȺȷƴưƭƩħĤáݙ×}{ywvtrrpnmljihgfedcbaa[UUUTTTTRQQQߖRߖRޗQޖRݖRܖTەSەSږTږUٔUؖVהV֕WהW֕XՕXՕYԕYԕYӕZӕ[ҕ[ҕ[і\ѕ\Ж]Е]Ж^ϖ^Е^ϖ^ϖ_Ε`Ζ_Ζ`ɿȼɷȵDZǯƫƩĥġßÜٖ“|zywusspomlliihfeedba^XVVUUTTTSQRߖRߖRޖRޖRݖRܖTܖTܕSۖUڕTڕVٕVؕUؕW֕W֖X֕XՔXՕYԕYӕZӕZӕZҕ[і[і]ѕ\ѕ\ѕ^Ж]Ж]Ж^ϖ^ϖ_ϖ`Ζ`Ζ`ɼɺɶȲƯǭƩƦŤšĝÚÖԑŽ~zyxvtsrponljjiggeddbXXVUVTTTUTRRߖSޖSޖSޖRݖSܖSܕTۖTڕTٖTٕVؕVוV֕W֕W֖XՕXՕYԕYԕYӕZԕZҕ[ҕ[ѕ\ѕ]і\Ж]Ж^Е^Е^ϖ_ϕ_Ζ`Ζ_Ζ_Ζ_˿ɻʸʵȱǯǪƧǤơŞÛÙÕÓ΍~|ywvutrponlkjighfebZXXWUVUUTTߖTRSޗRޗSܕTݖSܗSۗSەSۖUٕUٖUٖVؖVזWזW֖X֖XՖXՕYԖYӕZԕZӖ[ҕ\ѕ[ҕ]і\ѕ]ѕ^Е^Е^Ж_ϖ_ϕ_ϖ`Ζ`Ζ`Η`ؿۿܿ۾޾޿޾μ̹ɶɲɯȬȩǦǢƞŜřĖēÑÎË~}zzxussrpomlkjiige[ZXWXWVVUTߘTߗTߗSߗTޗSݖSܖTݖSܖTۖTڕUږUږVٕUؖUؖWזWזW֖XՖXՕYԕYԕZԕZԕZҕ\ҕ\і\ѕ\ѕ]і]Е^Е]ϖ^ϖ_ϖ_ϖ`Η`Ζ`Ζ`Ζ`տ׿׿پھڽܽܽݽ޼޽տ̷˳ʰˬɪȦǤȡǝŚŗŕđĎÌÉ}|zywussqommlkjhd^\ZYYXWVWߘUߗTߗTߘUߘSߘSݗSݖSܕTܗSۖTۖTڕUڕUٖVؖVؖVזWזW֖XՖXՕYԖYՖYӖZӕZӖ\Җ[ҕ[ҕ]і\Ж\ѕ]ϖ]Е_Ж_ϖ_ϖ_ϖ`Η`Ζ`Ηa͗aпѿҿҿԾԾ־ֽ׽׽ؼټڼۼۻݺ޻߼߼и˱ˮ˪ʧɤɢȞțǙƕŒŎčĉDŽ|zzwvtrppnnlkif]]\ZZXXߙWVߘVߘUߗTߘUޘUߗSޘSܗSܖTۖTۗSۖTۗUږVٖVؖVؖVזXזW֖X֖X֖XՖZԖZԖZӖ[ӕZӕ\ѕ\ҕ\і]Ж]Ж^Ж^Ж^Ж_ϖ_ϖ_ϖ`Η`Η`Ζ`Ηb͗aͿͿοοϾϽнѽѽӽԼռռֻ׻ػٻںںۺܹܸݺߺߺݽΰ̫˩˥ʢɠɝșǗǔƑƎŋĈąÂ}{zxvusspoolle__]\[YXYޙXߙWߘVߙVߘUߘUݘVޘTݗTܗTۗTڗUۗTۗUڗTږVٖVؖVؖWחWזW֗X՗Y՗YԖZՖZӖ[ԕZҕ[ӗ[Җ\Җ]і]і]З^З^Ж_ϖ_ϗ_ϖ_ϗ`Η`Η`ΗaΘa͘b̿̾νϾ;ϾϽмнѽѼӼӻպպֻ׺׺ظٸڷ۸ܹݸݸ޸߹״˪˦ˢʠʝɚɗȔǑǎƌňņăā}{zyvusrpoold`^^\\ZZߚYߙYߚXޙVߘVޙUݙUݗVܗVݗUܘUۘTڗTڗUۗTڗUڗUٖWٖVؖWזXחX֗X֗X֖YՖY՗ZӖZӕZӖ\Ӗ\Җ[Җ]і]і]ѕ^З^Ж^Ж_ϖ`ϖ_ϗ`Η`ϗ`ΗaΘbΘb͗b˽˽̼̽νμммϻѻѻӺӺԺԺֹֹ׹׸طٷ۶۶ܷܷ߶߷Ѯ̣̠ʞ˚ʗʕȒǏnjƉƆƃŁ~{{ywvusqpnda`^^]\ߜ[ߚZߚXޙZߚXޙWݘWܙWݙVܘWܘVۘWܘVڗUڗUڗUڗUڗVٗUؖVٖXזXؗYחX֖YՖY՗YՖZԗ[Ԗ[ӖZҖ\ӗ\і]Җ]ѕ]і^З^З^і`ϖ_ϗ_ϗ_ϗ`ΗaΗaΗa͗b͘a͘a˻̻ͻͻͺκϹϺϺѹѺҹҸӸԷԷշַ׷׶ٷٶ۵ܴݵݷ޶ߵݴϥ̛̘͞˕˒ɐɍȊȇƄƁ}{yxvusrnebaa_^\ߜ\[ߛZߛXݚYޛXݚXܘXݙWܙWܘWۘWۘWۘVڗUڗUٗWڗU٘VٗVؗVؗWؗX֗X֗Y֖YՖYՖYԖ[Ԗ[Ӗ[Ӗ\ӗ\Җ\Җ]і]і]і^З^і`Ж_ϖ_ϖ_ϗ`ΘaΗ`ϘaΘaΗbΘb͘a˹̺̹̹̹͹ιθϸϸиѸҷӷӷԶն׶׵״ٵٵڴ۴ݳݴ޵޴߳׫̒̚̕͞ːʎʊɈȅȂ|{zxwuskddba`^^]ߝ\ߝZߜZݛ[ޜZޜXݚXܚWܚWܙWۙWۙVژWۘVڗUژVٗVٙVٗWؗXؗWחWחX֖Y֖Y֗ZԖZՖ[Ԗ[Ԗ[Ӗ\Ӗ\Җ\Җ]Җ]Җ^і_З^Ж^Ж_ϖ_ϗ_ϖ_ϗaΘaϗaϗa͘a͘b͘a͘b˹ʸ˹̸̸͸͸ηηϷϷѵӶҵӶӵԵִִ״شٳٳ۲۲ܴܴ޵߲߳Ѣ͖̓ˑˎʊʉʆɂɀ}{zxwrigeeba`ߠ_ߟ_ߞ\ߟ\ߝ[ݝZݜ[ݜZܛZݛXۛWۘXܛWۚVۙVڙWۘVڙV٘VٗVٙWؗWؗWטWחYחY՗Y֗Y՗Z՗Zԕ[ӗ[Ӗ\Ӗ\ӗ\Җ]Җ]ї]ї^З_З^ї`З_З_Ж`ϗ`Η`ϗaϘ`Θb͗bΗaΘbΘbɸʸ˷˷̷̷ͷͶζζ϶϶ҵҵӴԴԴմֲֲײزرڱڱ۰ܲݱ޲߲߱ݫΘ͒̏̍̉ʇʄʂ~}{xojigeecbߢa_ޠ^ߠ]ߠ\ޟ[ܝ\ݞ[ݝYܝYܜXܛWۛXۛWښXښWٙWڙVٙW٘WؘWؘWٗVؗWטYטY֘X֗Z՗Z՗Zԗ[ԗ[ԗ\ӗ\ӗ\җ\җ]җ]ї^ї^З^З_ї_З_З_ϗ`ϘaϘ`ϘaΗaΗbΘaΘbΗa͘cʶʶ˶˶˵̶̵ε͵εδдѴѳҴӲԲղղֲֳرٰٰٰڰۯܰݰݱޱ߰߰עΏ͍͇͊˄˂|tnljhfeccaߣaߢ^ߢ^ޡ^ݡ\ܟ[ܞ[ܟ[ܞZ۝ZܝX۝XڜXڛWڜXڛXٚWښWٙVٚVؙWٙWטXؘWטW֘Y֘Y՗Z՘Yԗ[ԗ[ԗ[ӗ\ӗ\җ\җ]ї]ї_ї_З^ї_ї_З_ϗ_ϗ_ϗ`Η`Ϙaϗ`ΘbΘbΘaΘcΘb̘bʴʴʵ˴ʹ̴ʹδͳγгввѲѲҲӱԱձհհװװذٯٯۯۯܯݰݯް߯җ΋Έ΅͂zromkihgedba`_ߤ^ޣ^ޢ\ݡ[ݟ\ܠ[ܟZ۞ZܞXڝYڝYڜWٜXٜXٛXښWٛWؚWؙXؚVיWיXטX֘Y՘Z՘Z՘ZԘ[ԗ[ӗ\Ә\җ\җ]җ]җ^ї^И^З^ї`ї`З_ϗ`ϗ`Θ`ΘaϗaΘbΗbΘaΘbΘc͘c͘cɳʳ˳̳˲˳̲̲ͲααϲббѰѰҰӰӰհկ֮֮خ׮ٮخگۯܮܮݯޮ߭ܢЋvsrnmkihgfcߦcbߧ_ߥ_ݣ_ݤ^ݣ]ݣ\ܡ\ݡ[۠ZܠY۟Y۟XڝYڞWٜXٜYڜXٜWٜW؛W؛YؚXךWךX֙YՙYՙZ՘ZԘ[Ԙ[Ә\Ә\Ә\җ]җ^Ҙ]ј^ї_З_З_ї`Ϙ`Ϙ`ϘaϘaϘ`Ϙ`Ϙ`ΘbΘbΗaΘcΘc͘c͘cɲɲʱ˲˳̲̱̲ͱͱΰαϰаЯѯүҮүԭԮծ֭׮׬جٮڭگۭܬܭޭޭԿ޿ȍusqonkihfe߫dުbaߧaߧ_ަ_ޤ]ݤ^ܤ\ܤ[ܣYܢYۢZۡX۠XڞYٞXٞYٝX؝XٜV؝XכX֛XלWכX֚Y֚Y՚YՙZԙ[ԙ[Ә\Ә\ә]Ә]Ҙ]җ]Ҙ]ї^И^ї_И_З`И`ИaϘaϘaΘaϘaΘbΘbΘbΘcΘc͘cΘc͘cɱɱɱɱ˱ʱ˱̰ͰͰͰίϰϯϰЯүѮҮԮԭԭծ֭֭׬جج٬٭ڭܭݬެެԿԼغܠ~pnmkihffb߭a߬`ު_ߩ^ި^ާ\ݦ]ݦ\ܥ\ܤZܣZڣYۣX١X٠Y۠WٟYٞY؟XٟW؝X؜XלXלX֜X֛Y֛Y՚ZԚZԙ[ԙ[ә\Ә\Ҙ]Ҙ]ј^љ]ј^И_И^ј_И`И`З`ϘaϘaϘ`ϘaΘbΘbΘbϘbΘc͘c͘c͘c͘cȰȰɰɰʯ˯˯˯̯̯ίήίϭϭѭЮѭѭҭҬӬխլլ֫׫ت٫٫ڬ۬۫ܫޫߪ߬տԽԺַғqmjhg߰gf߮db߬`߬`ު^ߩ^ߨ\ݨ\ݧ\ܦ[ܦ[ܤZܤZڣXڣY٢XڢW١WؠXٟW؟V؟VםXםXםX֝X֜Y՛Y՛ZԚ[ԚZԙ\ԙ\ҙ]ҙ\ҙ]ҙ^ј]ј^И_З_И`З`З_Ϙaϗ`ϘaϘaϘaΘbΘbΘbΘcΘc͘c͘d͙cΙdȮɯɮɮʮʯˮˮˮ̮̮ͭέέϭЬЫЬѬҫӫӫԫժժ֪֩تةت٫٪ڪܪݪݪުսպַԳŁ߳lihf߰eca߮`߭`ެ^ޫ^ߪ\ީ\ި[ݧ\ݨYݧYܦZܤYۣYۢXڣWڢX١Y٠WؠVؠW؟XמX֞W֝X֝X՜Z՜YԛZԚ\Ԛ[ә]Қ\Қ\ҙ]ҙ^Й^љ^љ_Й_Й`И`И`ИaϘaϘaϘaΘbϘbΘbΘcϙc͘c͙cΘc͘c͙cȮɭɭɭʭʭ˭˭˭ˬ̬̬ͬΫͫЫЫЫѫѪҪҪԩԩԪը֨רةة٩٩ک۩ۨިިީߪԼʹǬ£޼ʞݘsigebaa߮_ޮ^ޭ^ެ\ߪ\ީ\ݩZݨZݨXܦZܥWۤYۥWۤWڣX٣X٢W٢WآWנWןXנW֟X՞Y֝ZԜYԝ[ԛ[ӛ[ӛ[қ]Қ\Қ^ҙ^љ^Й_љ_И_Й_Й`ИaϘaϘaϘaΘbΘbϘbΘcΘcΘcΘd͙c͙c͘dΙcȬȬɬɭɫɬɫʫʫ̫˪̪ͪΫΪϪϪЪЩѩѩҩӧԨԨթը֧֧קا٧٨ڨۨܨݧިާߩߨؽֺֻ׻ػػغЈߵjdcba߰_]߮]߮\ޭ\߫[ޫZުZݩZݩYܨXܧXۦXڥWڥW٤X٣WأWآVءWנXנW֟Y՟X՞ZԝYԝ[ԜZӛ[Ҝ\қ\қ]Қ^њ^њ_њ_њ_И`Й`Й`ϙaϙaϘaΘaΘbϘbΘbΙcΙc͘c͙dΙd͘cΙd͘cǪȪȫȪɫɫʫʫʫ˪˪̪ͪͪͩΩϩϩϨѨѨҨҨӧӧԦէէ֦ץائ٦٧ڧڦܦݨާަߧߧߩսԺֺպպֺ׺׻ڦz޴eba`ޱ^\߯\ޯ\ޮZެZޫYܫXݪXܨWۨXܨWۧVڦWڥXڥWؤWأVآWءYעX֡X֠X֟Y՞ZԝZӞ[Ԝ\ҝ\Ӝ\Ҝ\қ]Л^К_њ_К_Й`К`ϙaЙ`ϙaϙaΙaΘbΘcΘbΘcΙdΘdΘc͘cΙdΙd͙dȩȩȩɩȩɪʪʩʩ˩˩̨̨ͩͨϨΨϧϧШѧЧҦҥӦԥԥեץ֥֤ץץإڥܦܥܥݥݦݧަާߨӿӻӺҺҺӹչչΚݎma_^]߰\߰\ޮZޮY߭YެXݬWݫVܪXܪWۨVۧVڦW٦V٥WؤVؤVףXעXעXաYաY՟Y՟YԟZԞ\Ҟ\ҝ\ҝ]қ^ћ^ћ^Л_К_К`К`ϛ`ϙaϙaϚbΙbΙbΘbϙbΘc͙c͘d͘c͙dΙc̘d̙dǨǩȩȧʨʨ˨˨ʨ˨̨̧̨̧ͦϧΦЦϦЦХҥҦӥӥԥԤդդգ֤פؤ٥ڣڤۥܤݤݥޤަޥߦߨèѻѺҺҺҹӺչŐр߶e]߲]߱\[߱X߰YޯXޭXݭXݭVݫWݫWܪV۩V۩UڧWڧWڦVإVפXؤW֣XעWաYՠZԠYԟ[ԟ\Ӟ\Ӟ\ҝ\ҝ]ќ^ќ^ћ_Л_МaϚ`ϛ`ϚaϚaΙaΚbΙbϚcΚcΘcΙdΘdΘdΘcΙd͙d͙eǨȩȧȧɧɧʨʧʧ˦̨̦ͦͥͦΦϦХХХѦѥѥҤӣԣԤԣդ֢ףפץأ٣ڢڣۤܣܤݤޣޤޥޥɩлѻϹкѺҹӹռu_\߲ZY߱Z߱XްXޯWݮVݭVܭUݫUܫV۪VۨVڨW٧U٦V٦VإVפW֣X֣YբYԠZաZԠ[ӟ\ӟ\Ҟ]ҝ]ҝ^ѝ^Ҝ_ѝ_Л`ϛaϚaЛbϛaϛaϚbΚbΙcΙc͚c͚dΙdΘc͙d͙d͘e͙eȧȧɧɦȥɧɦ˦˧˧˧̦̦̦ͥͥΤϦϤϤХѤѤңҤӣԤԢԤգգ֡עףآ٣٢ڣۣۤܣݢݣݥޥޤߧߦϫκλлмлӺԻӺԖ݈h[YY߳Y߲W޲VޱVݯWݯUݮTܭVݫV۪W۪VڨV٨V٧WاWצWפWפX֣Y֣ZբZԡ[Ԡ[Ӡ\ӟ]Ҟ]Ҟ^ѝ^ѝ_ќ_ќ`Л`ϛ`ϛbϛaΛbϚcΛbϙc͚c͚cΙdΙcΘd̘d͙d͙d͙eȥȥȦȦɦʦɦ˥ʦ˥˥˥˦ͥͥͤΤΤϤϤФУѣңңӣӣԣԢԢա֡ףעآآ٢ڣڢۣۢܤܣݣݥޥޥަާߨԯͻλλκϻϻҺӺ}Ȉ|_Y޴XߴX߲W߲U߱VݰVޯUܯUݭVܭVܬV۪V۩W٩VاW٧WئVץXץY֣YգZբ[Ԣ[ӡ]Ӡ\ӟ]ҟ]ў^Ҟ^ѝ_ѝ_МaϜ`ϛ`ϜbϜbϚaΛcϚc͚cΚbΚdΚdΙdΚd͙d͙e̙eȥȥȥȥɦɤɤʤʤʥʤ̥̤̤̤ͤͣΣΤΣϣУТѢҢҢӣӡԡԡՠա֡֡ססءؠڡ٢ۣۡܢܢܤݣޣޤޥߦ۴˻̼̻ͻͻϺϻ|кzӿpߵWߵWVV߲V޲UޱUݰUݯUݭVܭVܬU۫UڪWڪV٩W٨VاXצX֥Y֥ZգZգ[գ[ӡ\ӡ]Ҡ]ӟ^ҟ_Ҟ^ѝ_О_М`ϜaМaϛaϜbϛbϚbΛc͚cΛcΚdΚdΚdΚd͚d͙eǤȤȤɤȤɤɤʣʤʤˤˤˣ̣̣̣ͣ͢΢ϢϢϢϢѢѢѡҡҡӡӡԠՠ՟֡֡סןןٟڡڢڡۡۡܢܣݣݣޥޤޥڵŬ˻˻˻˹̻κ|λyлxѻx؏܁d߶VUߴVߴU߳U޲TްTްTݯVݭUܭT۬V۫UڪV٩W٨WاXקX֦Y֤Z֤Zգ[Ԣ[Ӣ]ӡ^ҡ]ӟ^ҟ_ў_Н`О_МaМ`ϜaϜbϛbϜcϛc͚cΛc͚dΚdΚdΚd͚e͚eDisplayCAL-3.5.0.0/misc/PKGBUILD0000644000076500000000000000355713016042574015571 0ustar devwheel00000000000000# Maintainer: ${MAINTAINER} <${MAINTAINER_EMAIL}> pkgname=${APPNAME_LOWER} _pkgname=${PACKAGE} pkgver=${VERSION} pkgrel=1 pkgdesc="${SUMMARY}" arch=('i686' 'x86_64') url="${URL}" license=('GPL3') makedepends=('libx11' 'libxinerama' 'libxrandr' 'libxxf86vm') depends=('python2>=${PY_MINVERSION}' 'wxpython>=${WX_MINVERSION}' 'python2-numpy' 'python2-pygame' 'desktop-file-utils' 'hicolor-icon-theme' 'xdg-utils') optdepends=('argyllcms: calibration & profiling support') conflicts=('dispcalgui' 'dispcalgui-0install' '${APPNAME_LOWER}-0install') install=${pkgname}.install source=("${HTTPURL}download/${_pkgname}-${pkgver}.tar.gz") md5sums=('${MD5}') build() { cd "${srcdir}/${_pkgname}-${pkgver}" # Convert line endings in LICENSE.txt python2 -c "f = open('LICENSE.txt', 'rb') d = f.read().replace('\r\n', '\n').replace('\r', '\n') f.close() f = open('LICENSE.txt', 'wb') f.write(d) f.close()" python2 setup.py build --use-distutils } package() { cd "${srcdir}/${_pkgname}-${pkgver}" python2 setup.py install --root="${pkgdir}" --optimize=1 --skip-instrument-configuration-files --skip-postinstall # udev/hotplug mkdir -p "${pkgdir}/usr/share/${_pkgname}/usb" # USB and serial instruments using udev, where udev already creates /dev/bus/usb/00X/00X devices cp -f "misc/55-Argyll.rules" "${pkgdir}/usr/share/${_pkgname}/usb/55-Argyll.rules" # USB using udev, where there are NOT /dev/bus/usb/00X/00X devices cp -f "misc/45-Argyll.rules" "${pkgdir}/usr/share/${_pkgname}/usb/45-Argyll.rules" # USB using hotplug and Serial using udev (older versions of Linux) cp -f "misc/Argyll" "${pkgdir}/usr/share/${_pkgname}/usb/Argyll" cp -f "misc/Argyll.usermap" "${pkgdir}/usr/share/${_pkgname}/usb/Argyll.usermap" # Fix permissions - read for all, eXecute for directories and scripts chmod -R +rX "${pkgdir}" } # vim:set ts=2 sw=2 et: DisplayCAL-3.5.0.0/misc/py2exe/0000755000076500000000000000000013242313606015645 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/py2exe/boot_common.py0000644000076500000000000000604212325612267020542 0ustar devwheel00000000000000# Common py2exe boot script - executed for all target types. # When we are a windows_exe we have no console, and writing to # sys.stderr or sys.stdout will sooner or later raise an exception, # and tracebacks will be lost anyway (see explanation below). # # We assume that output to sys.stdout can go to the bitsink, but we # *want* to see tracebacks. So we redirect sys.stdout into an object # with a write method doing nothing, and sys.stderr into a logfile # having the same name as the executable, with '.log' appended. # # We only open the logfile if something is written to sys.stderr. # # If the logfile cannot be opened for *any* reason, we have no choice # but silently ignore the error. # # More elaborate explanation on why this is needed: # # The sys.stdout and sys.stderr that GUI programs get (from Windows) are # more than useless. This is not a py2exe problem, pythonw.exe behaves # in the same way. # # To demonstrate, run this program with pythonw.exe: # # import sys # sys.stderr = open("out.log", "w") # for i in range(10000): # print i # # and open the 'out.log' file. It contains this: # # Traceback (most recent call last): # File "out.py", line 6, in ? # print i # IOError: [Errno 9] Bad file descriptor # # In other words, after printing a certain number of bytes to the # system-supplied sys.stdout (or sys.stderr) an exception will be raised. # import sys if sys.frozen == "windows_exe": class Stderr(object): encoding = None softspace = 0 _file = None _error = None def write(self, text, alert=sys._MessageBox, fname=sys.executable + '.log'): if self._file is None and self._error is None: try: self._file = open(fname, 'w') except Exception, details: self._error = details if self._file is not None: self._file.write(text) self._file.flush() def flush(self): if self._file is not None: self._file.flush() def isatty(self): return False sys.stderr = Stderr() del sys._MessageBox del Stderr class Blackhole(object): encoding = None softspace = 0 def write(self, text): pass def flush(self): pass def isatty(self): return False sys.stdout = Blackhole() del Blackhole del sys # Disable linecache.getline() which is called by # traceback.extract_stack() when an exception occurs to try and read # the filenames embedded in the packaged python code. This is really # annoying on windows when the d: or e: on our build box refers to # someone elses removable or network drive so the getline() call # causes it to ask them to insert a disk in that drive. import linecache def fake_getline(filename, lineno, module_globals=None): return '' linecache.orig_getline = linecache.getline linecache.getline = fake_getline del linecache, fake_getline DisplayCAL-3.5.0.0/misc/py2exe/build_exe.py.patch0000644000076500000000000000107012520305571021253 0ustar devwheel00000000000000--- build_exe.py.bak Sat Aug 30 18:56:46 2008 +++ build_exe.py Sun Jan 26 03:56:21 2014 @@ -790,7 +790,8 @@ # Build an executable for the target # template is the exe-stub to use, and arcname is the zipfile # containing the python modules. - from py2exe_util import add_resource, add_icon + from py2exe_util import add_resource + from icon import add_icon ext = os.path.splitext(template)[1] exe_base = target.get_dest_base() exe_path = os.path.join(self.dist_dir, exe_base + ext) DisplayCAL-3.5.0.0/misc/py2exe/icon.py0000644000076500000000000001425412277575132017170 0ustar devwheel00000000000000#----------------------------------------------------------------------------- # Copyright (c) 2013, PyInstaller Development Team. # # Distributed under the terms of the GNU General Public License with exception # for distributing bootloader. # # The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- RT_ICON = 3 RT_GROUP_ICON = 14 LOAD_LIBRARY_AS_DATAFILE = 2 import struct import types try: StringTypes = types.StringTypes except AttributeError: StringTypes = [ type("") ] import logging logger = logging.getLogger() class Structure: def __init__(self): size = self._sizeInBytes = struct.calcsize(self._format_) self._fields_ = list(struct.unpack(self._format_, '\000' * size)) indexes = self._indexes_ = {} for i, nm in enumerate(self._names_): indexes[nm] = i def dump(self): logger.info("DUMP of %s", self) for name in self._names_: if not name.startswith('_'): logger.info("%20s = %s", name, getattr(self, name)) logger.info("") def __getattr__(self, name): if name in self._names_: index = self._indexes_[name] return self._fields_[index] try: return self.__dict__[name] except KeyError: raise AttributeError, name def __setattr__(self, name, value): if name in self._names_: index = self._indexes_[name] self._fields_[index] = value else: self.__dict__[name] = value def tostring(self): return apply(struct.pack, [self._format_,] + self._fields_) def fromfile(self, file): data = file.read(self._sizeInBytes) self._fields_ = list(struct.unpack(self._format_, data)) class ICONDIRHEADER(Structure): _names_ = "idReserved", "idType", "idCount" _format_ = "hhh" class ICONDIRENTRY(Structure): _names_ = ("bWidth", "bHeight", "bColorCount", "bReserved", "wPlanes", "wBitCount", "dwBytesInRes", "dwImageOffset") _format_ = "bbbbhhii" class GRPICONDIR(Structure): _names_ = "idReserved", "idType", "idCount" _format_ = "hhh" class GRPICONDIRENTRY(Structure): _names_ = ("bWidth", "bHeight", "bColorCount", "bReserved", "wPlanes", "wBitCount", "dwBytesInRes", "nID") _format_ = "bbbbhhih" class IconFile: def __init__(self, path): self.path = path file = open(path, "rb") self.entries = [] self.images = [] header = self.header = ICONDIRHEADER() header.fromfile(file) for i in range(header.idCount): entry = ICONDIRENTRY() entry.fromfile(file) self.entries.append(entry) for e in self.entries: file.seek(e.dwImageOffset, 0) self.images.append(file.read(e.dwBytesInRes)) def grp_icon_dir(self): return self.header.tostring() def grp_icondir_entries(self, id=1): data = "" for entry in self.entries: e = GRPICONDIRENTRY() for n in e._names_[:-1]: setattr(e, n, getattr(entry, n)) e.nID = id id = id + 1 data = data + e.tostring() return data def CopyIcons_FromIco(dstpath, srcpath, id=1): import win32api #, win32con icons = map(IconFile, srcpath) logger.info("Updating icons from %s to %s", srcpath, dstpath) hdst = win32api.BeginUpdateResource(dstpath, 0) iconid = 1 for i, f in enumerate(icons): data = f.grp_icon_dir() data = data + f.grp_icondir_entries(iconid) win32api.UpdateResource(hdst, RT_GROUP_ICON, i, data) logger.info("Writing RT_GROUP_ICON %d resource with %d bytes", i, len(data)) for data in f.images: win32api.UpdateResource(hdst, RT_ICON, iconid, data) logger.info("Writing RT_ICON %d resource with %d bytes", iconid, len(data)) iconid = iconid + 1 win32api.EndUpdateResource(hdst, 0) def CopyIcons(dstpath, srcpath): import os.path if type(srcpath) in StringTypes: srcpath = [ srcpath ] def splitter(s): try: srcpath, index = s.split(',') return srcpath.strip(), int(index) except ValueError: return s, None srcpath = map(splitter, srcpath) logger.info("SRCPATH %s", srcpath) if len(srcpath) > 1: # At the moment, we support multiple icons only from .ico files srcs = [] for s in srcpath: e = os.path.splitext(s[0])[1] if e.lower() != '.ico': raise ValueError, "multiple icons supported only from .ico files" if s[1] is not None: raise ValueError, "index not allowed for .ico files" srcs.append(s[0]) return CopyIcons_FromIco(dstpath, srcs) srcpath,index = srcpath[0] srcext = os.path.splitext(srcpath)[1] if srcext.lower() == '.ico': return CopyIcons_FromIco(dstpath, [srcpath]) if index is not None: logger.info("Updating icons from %s, %d to %s", srcpath, index, dstpath) else: logger.info("Updating icons from %s to %s", srcpath, dstpath) import win32api #, win32con hdst = win32api.BeginUpdateResource(dstpath, 0) hsrc = win32api.LoadLibraryEx(srcpath, 0, LOAD_LIBRARY_AS_DATAFILE) if index is None: grpname = win32api.EnumResourceNames(hsrc, RT_GROUP_ICON)[0] elif index >= 0: grpname = win32api.EnumResourceNames(hsrc, RT_GROUP_ICON)[index] else: grpname = -index data = win32api.LoadResource(hsrc, RT_GROUP_ICON, grpname) win32api.UpdateResource(hdst, RT_GROUP_ICON, grpname, data) for iconname in win32api.EnumResourceNames(hsrc, RT_ICON): data = win32api.LoadResource(hsrc, RT_ICON, iconname) win32api.UpdateResource(hdst, RT_ICON, iconname, data) win32api.FreeLibrary(hsrc) win32api.EndUpdateResource(hdst, 0) def add_icon(exe_path, ico_filename, ico_id): CopyIcons(exe_path, "%s,%i" % (ico_filename, ico_id)) if __name__ == "__main__": import sys dstpath = sys.argv[1] srcpath = sys.argv[2:] CopyIcons(dstpath, srcpath) DisplayCAL-3.5.0.0/misc/py2exe/README.txt0000644000076500000000000000123712277575132017361 0ustar devwheel00000000000000Patches for py2exe 0.6.9 Copy these files into the py2exe directory, overwriting existing files. boot_common.py The original stdout and stderr redirection does not implement the 'isatty' method. The patched file adds it. build_exe.py The add_icon method is faulty. When adding icons to an exe, it begins counting at index 0, which is wrong (it should start at 1). Also, it does not reset the index for additional targets, so if the first target got 7 icons (index 0..6) then the next target's icon index will begin at 7. The patched file works around those problems by not using the faulty implementation, but a tried-and-tested one from PyInstaller (icon.py) instead. DisplayCAL-3.5.0.0/misc/README-fr.template.html0000644000076500000000000131077113242313541020503 0ustar devwheel00000000000000 ${APPNAME} — Logiciel d’étalonnage et caractérisation d’écran à sources ouvertes, animé par ArgyllCMS

    Si vous désirez mesurer la couleur n’importe quand, vous pourriez aussi être intéressé par ArgyllPRO ColorMeter de Graeme Gill, auteur d’ArgyllCMS. Disponible pour Android depuis « Google Play store ». Parcourez l’aperçu et la visite guidée en vidéo.

    À propos de ${APPNAME}

    ${APPNAME} (anciennement dispcalGUI) est une interface graphique développée par Florian Höch pour les outils d’étalonnage et de caractérisation des systèmes d’affichage d’ArgyllCMS, un système de gestion de la couleur à sources ouvertes développé par Graeme Gill.

    Il permet d’étalonner et de caractériser vos périphériques d’affichage en utilisant l’une des nombreuses sondes de mesure prises en compte. Il prend en charge les configurations multi-écrans et de nombreux paramètres définissables par l’utilisateur comme le point blanc, la luminance, la courbe de réponse de tonalité ainsi que la possibilité de créer des profils ICC à matrice ou à table de correspondance, avec transposition optionnelle du gamut, ainsi que certains formats propriétaires de LUT 3D. On trouvera, parmi d’autres fonctionnalités :

    • Prise en charge de la correction du colorimètre pour différents écrans à l’aide de matrices de correction ou de fichiers d’échantillon spectral d’étalonnage (« colorimeter spectral sample set » = csss) (ces derniers uniquement pour certains colorimètres spécifiques, c’est-à-dire l’i1 Display Pro, le ColorMunki Display et les Spyder 4/5) ;
    • Vérification du profil et rapport de mesure : vérification de la qualité des profils et des LUT 3D par des mesures. Prise en charge également de fichiers CGATS personnalisés (par ex. FOGRA, GRACoL/IDEAlliance, SWOP) et utilisation de profils de référence pour obtenir des valeurs de test ;
    • Éditeur de mire de test : crée des mires avec un nombre quelconque d’échantillons de couleur, copié-collé facile depuis des fichiers CGATS, CSV (uniquement délimité par des tabulations) et applications de feuilles de calculs ;
    • Création de profils ICC synthétiques (à matrice) avec les primaires, le point noir et le point blanc ainsi que la réponse tonale personnalisés.

    Captures d’écran


    Paramètres d’écran et de sonde de mesure

    Paramètres d’étalonnage

    Paramètres de caractérisation


    Paramètres de LUT 3D

    Paramètres de vérification

    Éditeur de mire de test


    Réglages de l’écran

    Informations du profil

    Courbes d’étalonnage


    KDE5

    Mac OS X

    Windows 7

    Clause de responsabilité

    Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier librement selon les termes de la Licence publique générale GNU telle que publiée par la Free Software Foundation ; soit à la version 3 de la Licence, soit (à votre choix) toute version ultérieure.

    Ce programme est distribué dans l’espoir qu’il sera utile, mais SANS AUCUNE GARANTIE ; sans même la garantie implicite d’une QUELCONQUE VALEUR MARCHANDE ou de l’ADÉQUATION À UN BESOIN PARTICULIER. Voir la Licence Publique Générale GNU pour davantage d’informations.

    ${APPNAME} est écrit en Python et utilise les paquets tiers NumPy, demjson (bibliothèque JSON[6]) et wxPython (kit de développement d’interface graphique (GUI)[4]). Il fait aussi une utilisation intensive de certains des utilitaires d’ArgyllCMS. Le système de construction permettant d’obtenir des exécutables autonomes utilise en outre setuptools et py2app sous Mac OS X ou py2exe sous Windows. Tous ces logiciels sont © par leurs auteurs respectifs.

    Obtenir ${APPNAME} en version autonome

    • Pour Linux

      Des paquets natifs pour plusieurs distributions sont disponibles via openSUSE Build Service :

      Les paquets réalisés pour des distributions plus anciennes peuvent fonctionner sur les plus récentes tant qu’il n’y a rien eu de substantiel de modifié (c’est-à-dire la version de Python). Il existe aussi certaines distributions qui sont basées sur celles de la liste ci-dessus (par exemple, Linux Mint qui est basée sur Ubuntu). Ceci signifie que les paquets de cette distribution de base devraient aussi fonctionner avec ses dérivées, vous devez simplement connaître la version sur laquelle la dérivée est basée et faire votre téléchargement en conséquence.

    • Pour Mac OS X (10.6 ou plus récent)

      Image disque

      Note that due to Mac OS X App Translocation (since 10.12 Sierra), you may need to remove the “quarantine” flag from the non-main standalone application bundles after you have copied them to your computer before you can successfully run them. E.g. if you copied them to /Applications/${APPNAME}-${VERSION}/, open Terminal and run the following command: xattr -dr com.apple.quarantine /Applications/${APPNAME}-${VERSION}/*.app

    • Pour Windows (XP ou plus récent)

    • Code source

      Il vous faut une installation Python fonctionnelle et tous ses prérequis.

      Archive tar des sources

      Vous pouvez aussi, si cela ne vous pose pas de problème d’utiliser le code de développement, parcourir le dépôt SVN[8] de la dernière version de développement (ou effectuer une récupération complète — « checkout» — à l’aide de svn checkout svn://svn.code.sf.net/p/dispcalgui/code/trunk ${APPNAME_LOWER}). Mais soyez attentif au fait que le code de développement peut contenir des bogues ou même ne pas fonctionner du toute, ou uniquement sur certaines plateformes). Utilisez-le à vos propres risques.

    Veuillez poursuivre avec le Guide de démarrage rapide.

    Obtenir ${APPNAME} via Zero Install

    • Rapide introduction à Zero Install

      (Note : vous n’avez habituellement pas à installer séparément Zero Install, cela est géré automatiquement lors des téléchargements de ${APPNAME} dont vous trouverez les liens ci-dessous. Ce paragraphe n’est là que pour information).

      Zero Install st un système d’installation décentralisé et multi-plate-formes. Les avantages que vous tirez de l’utilisation de Zero Install sont :

      • Être toujours à jour. Zero Install maintient automatiquement à jour l’ensemble du logiciel ;
      • Basculer facilement entre différentes versions du logiciel depuis Zero Install si vous le désirez ;
      • Pas de nécessité de droits d’administration pour ajouter ou mettre à jour un logiciel (*).

      * Note : l’installation et la mise à jour de Zero Install lui-même et de ses dépendances logicielles au travers de mécanismes du système d’exploitation peut demander des privilèges d’administration.

    • Pour Linux

      Des paquets natifs de plusieurs distributions sont disponibles via openSUSE Build Service:

      Veuillez noter :

      • Le numéro de version du paquet ne reflète pas nécessairement la version de ${APPNAME}.

      Les paquets réalisés pour des distributions plus anciennes peuvent fonctionner sur les plus récentes tant qu’il n’y a rien eu de substantiel de modifié (c’est-à-dire la version de Python). Il existe aussi certaines distributions qui sont basées sur celles de la liste ci-dessus (par exemple, Linux Mint qui est basée sur Ubuntu). Ceci signifie que les paquets de cette distribution de base devraient aussi fonctionner avec ses dérivées, vous devez simplement connaître la version sur laquelle la dérivée est basée et faire votre téléchargement en conséquence. Dans tous les autres cas, veuillez essayer les instructions ci-dessous ou l’une des installations autonomes.

      Autre méthode d’installation

      Si votre distributions fait pas partie de celles indiquées ci-dessus, veuillez suivre ces instructions :

      1. Installez le paquet 0install ou zeroinstall-injector de votre distribution. Au cas où il ne serait pas disponible, il existe des binaires génériques précompilés. Téléchargez l’archive appropriée correspondant à votre système, décompressez-la. Depuis un terminal, cd vers le dossier extrait, et lancez sudo ./install.sh local pour effectuer l’installation vers /usr/local, ou ./install.sh home pour effectuer l’installation dans votre répertoire personnel (il vous faudra peut-être ajouter ~/bin à votre variable PATH dans ce cas). Vous aurez besoin que libcurl soit installée (la plupart des systèmes l’ont par défaut).
      2. Choisissez l’entrée 0install à partir du menu des applications (les anciennes versions de Zero Install ont une entrée « Ajouter un nouveau programme » — Add New Program — à la place).
      3. Glissez le lien du feed Zero Install de ${APPNAME} vers la fenêtre de Zero Install.

      Note concernant les outils autonomes de ${APPNAME} sous Linux (créateur de LUT 3D, afficheur de courbe, informations du profil, créateur de profil synthétique, éditeur de mire de test, convertisseur de VRML vers X3D) : si vous utilisez l’autre méthode d’installation, il ne sera créé d’icône d’application que pour ${APPNAME} elle-même. Ceci est une limitation actuelle de Zero Install sous Linux. Vous pouvez installer vous-même les entrées d’icônes pour les outils autonomes à l’aide des commandes suivantes lancées depuis un terminal :

      0launch --command=install-standalone-tools-icons \
      ${HTTPURL}0install/${APPNAME}.xml

      Et vous pourrez les désinstaller de nouveau par :

      0launch --command=uninstall-standalone-tools-icons \
      ${HTTPURL}0install/${APPNAME}.xml
    • Pour Mac OS X (10.5 ou plus récent)

      Téléchargez l’image disque du lanceur Zero Install de ${APPNAME} et lancez l’une quelconque des applications incluses.

    • Pour Windows (XP ou plus récent)

      Téléchargez le configurateur Zero Install de ${APPNAME} : Installation par l’Administrateur | Installation par l’utilisateur.

    • Mise à jour manuelle ou basculement entre les versions du logiciel

      Les mises à jour sont normalement appliquées automatiquement. Si vous désirez effectuer une mise à jour manuelle ou basculer entre les versions du logiciel, veuillez suivre les instructions ci-dessous.

      • Linux

        Choisissez l’entrée 0install depuis le menu de l’application (les anciennes versions de Zero Install ont une entrée « Gérer les programmes — « Manage Programs » — en remplacement). Dans la fenêtre qui s’ouvre, faites un clic-droit sur l’icône de ${APPNAME} et sélectionner « Choisir les versions » (avec les anciennes versions de Zero Install, vous devez cliquer la petite icône « Mettre à jour ou changer de version » qui se trouve sous le bouton « Run »). Vous pouvez alors cliquer le bouton « Tout rafraîchir » pour mettre à jour, ou cliquer le petit bouton sur la droite de l’entrée et sélectionner « Afficher les versions ».

        Pour sélectionner une version spécifique du logiciel, cliquez sur l’entrée de la version et définissez le rang à « préféré » (« prefered ») (notez que cela interdira le téléchargement des mises à jour du logiciel sélectionné jusqu’à ce que vous changiez vous-même la version ou que vous réinitialisiez le rang).

      • Mac OS X

        Lancez 0install Launcher. Dans la fenêtre qui s’ouvre, cliquez sur le bouton « Tout rafraîchir » (« Refresh all ») pour effectuer la mise à jour, ou cliquez le petit bouton situé à la droite d’une entrée et sélectionnez « Afficher les versions » (« Show versions »).

        Pour sélectionner une version spécifique du logiciel, cliquez sur l’entrée de la version et définissez le rang à « préféré » (« prefered ») (notez que cela interdira le téléchargement des mises à jour du logiciel sélectionné jusqu’à ce que vous changiez vous-même la version ou que vous réinitialisiez le rang).

      • Windows

        Choisir l’entrée Zero Install depuis la page de démarrage sous Windows 8, ou le sous-répertoire respectif du répertoire des programmes dans le menu démarrer sous Windows 10, Windows 7 et plus récents. Passez ensuite à l’onglet « Mes applications » (« My Applications ») sur la fenêtre qui s’ouvre. Cliquez la petite flèche « vers le bas » à l’intérieur du bouton « Démarrer » situé à la droite de l’entrée de ${APPNAME} et choisissez « Mettre à jour » (« Update ») ou « Sélectionner une version » (« Select version »).

        Pour sélectionner une version spécifique du logiciel, cliquez sur l’entrée de la version et définissez le rang à « préféré » (« prefered ») (notez que cela interdira le téléchargement des mises à jour du logiciel sélectionné jusqu’à ce que vous changiez vous-même la version ou que vous réinitialisiez le rang).

    Veuillez poursuivre avec le démarrage rapide.

    Guide de démarrage rapide

    Ce court guide est destiné à vous permettre de vous lancer rapidement, mais si vous avez des problèmes, référez-vous aux sections complètes des prérequis et d’installation.

    1. Lancez ${APPNAME}. S’il ne peut pas déterminer le chemin vers les binaires d’ArgyllCMS, il va, lors du premier lancement, vous demander d’en télécharger automatiquement la dernière version ou d’en sélectionner vous-même l’emplacement.

    2. Windows uniquement : si votre sonde de mesure n’est pas un ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval ou K-10, vous devrez installer un pilote spécifique à Argyll avant de poursuivre. Sélectionnez « Installer les pilotes des sondes de mesure d’ArgyllCMS… » depuis le menu « Outils ». Voir aussi « Installation du pilote de sonde de mesure sous Windows ».

      Mac OS X uniquement : si vous désirez utiliser le colorimètre HCFR, suivez les instructions de la section « Colorimètre HCFR » dans « Installing ArgyllCMS on Mac OS X » [en] (« Installer ArgyllCMS sous Mac OS X ») dans la documentation d’ArgyllCMS avant de poursuivre.

      Connectez votre sonde de mesure à votre ordinateur.

    3. Cliquez la petite icône avec les flèches enroulées située entre les contrôles « Périphérique d’affichage » et « Sonde de mesure » afin de détecter les périphériques d’affichage et les sondes. Les sondes détectées devraient s’afficher dans la liste déroulante « Sondes de mesure ».

      Si votre sonde de mesure est une Spyder 2, une fenêtre de dialogue apparaîtra qui vous permet d’activer l’appareil. Ceci est nécessaire pour pouvoir utiliser la Spyder 2 avec ArgyllCMS et ${APPNAME}.

      Si votre sonde de mesure est une i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, une fenêtre apparaîtra depuis la quelle vous pourrez importer les corrections génériques du colorimètre à partir du logiciel du fournisseur, ce qui peut améliorer la précision des mesures sur le type de périphérique d’affichage que vous utilisez. Après les avoir importées, elles seront disponibles sous la fenêtre déroulante « Correction », où vous pourrez choisir l’une des entrées qui convient au type de périphérique d’affichage que vous avez, ou, si rien ne correspond, laissez-la sur « Automatique ». Note : l’importation des corrections depuis le logiciel des Spyder 4/5 active des options de mesure supplémentaires pour cette sonde.

    4. Cliquez « Étalonner et caractériser. C’est tout !

      Vous trouverez sur le Wiki des guides et des tutoriels. Et vous pouvez vous référer à la documentation pour des informations d’utilisation avancées (optionnel).

      Linux uniquement : si vous ne pouvez pas accéder à votre sonde de mesure, choisissez « Installer les fichiers de configuration des sondes de mesure d’ArgyllCMS…. » depuis le menu « Outils » (si ce menu est grisé, alors la version d’ArgyllCMS que vous utilisez actuellement a probablement été installée depuis le dépôt d’une distribution et la configuration devrait déjà avoir été faite correctement pour l’accès à la sonde de mesure).
      Si vous ne pouvez pas accéder à votre sonde de mesure, essayez d’abord de la débrancher et de la reconnecter, ou redémarrez votre ordinateur. Si ceci ne résout pas le problème, lisez Installing ArgyllCMS on Linux: Setting up instrument access [en] (« Installer ArgyllCMS sous Linux : Configurer l’accès à la sonde de mesure » dans la documentation d’ArgyllCMS.

    Exigences du système et autres prérequis

    Exigences générales du système

    • Une version récente du système d’exploitation Linux, Mac OS X (10.6 ou plus récent) ou Windows (XP/Server 2003 ou plus récent) ;
    • Une carte graphique avec prise en charge d’au moins 24 bits par pixel (vraies couleurs) et un bureau configuré pour utiliser cette profondeur des couleurs.

    ArgyllCMS

    Pour utiliser ${APPNAME}, vous devez télécharger et installer ArgyllCMS (1.0 ou plus récent).

    Sondes de mesure prises en charge

    Vous avez besoin d’une des sondes prises en charge. Toutes les sondes de mesure prises en charge par ArgyllCMS le sont aussi par ${APPNAME}. Pour les lectures d’écran, ce sont actuellement :

    Colorimètres

    • CalMAN X2 (traité comme i1 Display 2)
    • Datacolor/ColorVision Spyder 2
    • Datacolor Spyder 3 (depuis ArgyllCMS 1.1.0)
    • Datacolor Spyder 4 (depuis ArgyllCMS 1.3.6)
    • Datacolor Spyder 5 (depuis ArgyllCMS 1.7.0)
    • HP Advanced Profiling Solution (traité comme i1 Display 2)
    • HP DreamColor (traité comme i1 Display 2)
    • Hughski ColorHug (pris en charge sous Linux depuis ArgyllCMS 1.3.6, pris en charge sous Windows avec le nouveau micrologiciel de ColorHug depuis ArgyllCMS 1.5.0, pris en charge de manière entièrement fonctionnelle sous Mac OS X depuis ArgyllCMS 1.6.2)
    • Hughski ColorHug2 (depuis ArgyllCMS 1.7.0)
    • Image Engineering EX1 (depuis ArgyllCMS 1.8.0 Beta)
    • Klein K10-A (depuis ArgyllCMS 1.7.0)
    • Lacie Blue Eye (traité comme i1 Display 2)
    • Sencore ColorPro III, IV & V (traité comme i1 Display 1)
    • Sequel Imaging MonacoOPTIX/Chroma 4 (traité comme i1 Display 1)
    • X-Rite Chroma 5 (traité comme i1 Display 1)
    • X-Rite ColorMunki Create (traité comme i1 Display 2)
    • X-Rite ColorMunki Smile (depuis ArgyllCMS 1.5.0)
    • X-Rite DTP92
    • X-Rite DTP94
    • X-Rite/GretagMacbeth/Pantone Huey
    • X-Rite/GretagMacbeth i1 Display 1
    • X-Rite/GretagMacbeth i1 Display 2/LT
    • X-Rite i1 Display Pro, ColorMunki Display (depuis ArgyllCMS 1.3.4)

    Spectromètres

    • JETI specbos 1211/1201 (depuis ArgyllCMS 1.6.0)
    • JETI spectraval 1511/1501 (depuis ArgyllCMS 1.9.0)
    • X-Rite ColorMunki Design, ColorMunki Photo (depuis ArgyllCMS 1.1.0)
    • X-Rite/GretagMacbeth i1 Monitor (depuis ArgyllCMS 1.0.3)
    • X-Rite/GretagMacbeth i1 Pro/EFI ES-1000
    • X-Rite i1 Pro 2 (depuis ArgyllCMS 1.5.0)
    • X-Rite/GretagMacbeth Spectrolino

    Si vous avez décidé d’acheter une sonde de mesure de la couleur parce qu’ArgyllCMS la prend en charge, veuillez faire savoir au vendeur et au constructeur que « vous l’avez achetée parce qu’ArgyllCMS la prend en charge » – merci.

    Remarquez que l’i1 Display Pro et l’i1 Pro sont des sondes de mesure très différentes en dépit de la similarité de leur nom.

    Il y a actuellement (2014-05-20) cinq sondes de mesure (ou plutôt, paquets) sous la marque ColorMunki, deux d’entre elles sont des spectromètres, et trois sont des colorimètres (toutes ne sont pas des offres récentes, mais vous devriez pouvoir les trouver d’occasion dans le cas où ils ne seraient plus commercialisés neufs) :

    • Les spectromètres ColorMunki Design et ColorMunki Photo ne diffèrent que par les fonctionnalités du logiciel fourni par le fabricant. Il n’y a pas de différence entre ces sondes de mesure lorsqu’elles sont utilisées avec ArgyllCMS et ${APPNAME} ;
    • Le colorimètre ColorMunki Display est une version plus économique du colorimètre i1 Display Pro. Le logiciel fourni est plus simple et les temps de mesure plus longs comparés à ceux de l’i1 Display Pro. À part cela, ils semblent virtuellement identiques ;
    • Les colorimètres ColorMunki Create et ColorMunki Smile sont constitués du même matériel que l’i1 Display 2 (le ColorMunki Smile n’a maintenant plus de correction intégrée pour les CRT mais, en remplacement, pour le rétroéclairage blanc à LED des LCD).

    Exigences supplémentaires pour l’étalonnage et la caractérisation sans intervention

    Lors de l’utilisation d’un spectromètre pour lequel la fonctionnalité de fonctionnement sans intervention est prise en charge (voir ci-dessous), on peut éviter d’avoir à enlever l’appareil de l’écran pour effectuer de nouveau son auto-étalonnage après l’étalonnage de l’écran et avant de lancer les mesures pour la caractérisation si, dans le menu « Options », on a coché l’élément de menu « Permettre de sauter l’auto-étalonnage du spectromètre » (les mesures des colorimètres se font toujours sans intervention parce que, généralement, ils ne demandent pas d’étalonnage de leur capteur en étant hors écran, à l’exception de l’i1 Display 1).

    L’étalonnage et la caractérisation sans intervention sont actuellement pris en charge pour les spectromètres suivants ainsi que pour la plupart des colorimètres :

    • X-Rite ColorMunki ;
    • X-Rite/GretagMacbeth i1 Monitor & Pro ;
    • X-Rite/GretagMacbeth Spectrolino ;
    • X-Rite i1 Pro 2.

    Soyez attentif au fait que vous pourrez quand même être obligé d’effectuer un étalonnage de la sonde de mesure si elle l’exige. Veuillez aussi consulter les problèmes possibles.

    Exigences supplémentaires pour utiliser le code source

    Vous pouvez sauter cette section si vous avez téléchargé un paquet, un installateur, une archive zip ou une image disque de ${APPNAME} pour votre système d’exploitation et que vous ne désirez pas le faire tourner à partir des sources.

    Sur toutes les plate-formes :

    • Python >= v2.5 <= v2.7.x (la version 2.7.x est recommandée. Utilisateurs de Mac OS X : si vous désirez compiler le module C d’extension de ${APPNAME}, il est conseillé d’installer d’abord XCode et ensuite la version officielle de Python de python.org) ;
    • NumPy ;
    • Kit de développement de GUI[4] wxPython.

    Windows :

    Exigences supplémentaires pour compiler le module d’extension en C

    Vous pouvez normalement sauter cette section, car le code source contient des versions pré-compilées du module d’extension en C qu’utilise ${APPNAME}.

    Linux :

    • GCC et les en-têtes de développement pour Python + X11 + Xrandr + Xinerama + Xxf86vm s’ils ne sont pas déjà installés, ils devraient être disponibles depuis le système de paquets de votre distribution.

    Mac OS X :

    • XCode ;
    • py2app si vous désirez construire un exécutable autonome. Sur une version de Mac OS X antérieure à 10.5, installez d’abord setuptools : sudo python util/ez_setup.py setuptools

    Windows :

    • Un compilateur C (par ex. MS Visual C++ Express ou MinGW. Si vous utilisez la version officielle Python 2.6 ou plus récente de python.org, je recommande d’utiliser Visual C++ Express, car il fonctionne directement) ;
    • py2exe si vous désirez construire un exécutable autonome.

    Fonctionnement direct depuis les sources

    Une fois satisfaites toutes les exigences supplémentaires pour utiliser le code source, vous pouvez simplement lancer depuis un terminal l’un quelconque des fichiers .pyw inclus, par ex. python2 ${APPNAME}.pyw, ou installer le logiciel afin d’y avoir accès depuis le menu des applications de votre gestionnaire de bureau avec python2 setup.py install. Lancez python2 setup.py --help pour voir les options disponibles.

    Instructions d en une seule fois à partir du code source provenant de SVN :

    Lancez python2 setup.py pour créer le fichier de version afin de ne pas avoir de fenêtre de mise à jour au démarrage.

    Si le module d’extension pré-compilé qui fait partie des sources ne fonctionne pas pour vous, (dans ce cas, vous remarquerez que les dimensions de la fenêtre mobile ne correspondent pas exactement aux dimensions de la fenêtre sans marges générée par ArgyllCMS lors des mesures de l’écran) ou que vous désirez absolument le reconstruire, lancez python2 setup.py build_ext -i pour le reconstruire en partant de zéro (vous devez d’abord satisfaire aux exigences supplémentaires pour compiler le module d’extension en C).

    Installation

    Il est recommandé de tout d’abord supprimer toutes les versions précédentes à moins que vous n’ayez utilisé « Zero Install » pour l’obtenir.

    Installation du pilote de sonde de mesure sous Windows

    Vous n’avez besoin d’installer le pilote spécifique à Argyll que si votre sonde de mesure n’est pas un ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval ou K-10.

    Si vous utilisez Windows 8, 8.1, ou 10, vous devrez désactiver la vérification de signature du pilote avant de pouvoir l’installer. Si Secure Boot est activé dans la configuration de l’UEFI[12], vous devrez d’abord le désactiver. Référez-vous au manuel de votre carte-mère ou du micrologiciel (« firmware ») sur la manière de procéder. Il faut en général presser la touche Suppr lors du démarrage du système pour modifier la configuration du micrologiciel.

    Méthode 1 : Désactiver temporairement le contrôle de signature

    1. Windows 8/8.1 : Allez à « Paramètres» (survolez le coin en bas et à droite de l’écran, cliquez ensuite l’icône en forme d’engrenage) et sélectionnez « Arrêter » (l’icône de marche/arrêt).
      Windows 10 : Ouvrez le menu en survolant de la souris le coin en bas et à gauche de l’écran et en cliquant l’icône en forme de fenêtre)
    2. Sélectionner « Arrêter » (l’icône de marche/arrêt)
    3. Maintenez la touche MAJUSCULE enfoncée et cliquez « Redémarrer ».
    4. Sélectionner « Dépannage » → «  Options avancées » → « Paramètres » → « Redémarrer »
    5. Après le redémarrage, sélectionnez « Désactivez le contrôle obligatoire des signatures du pilotes » (numéro 7 de la liste ; il faut presser soit la touche 7 du pavé numérique, soit la touche de fonction F7)

    Méthode 2 : désactivez de manière permanente la vérification de signature du pilote

    1. Ouvrez une invite de commandes d’administrateur. Recherchez « Invite de commande » dans le menu démarrer de Windows, faites un clic-droit et sélectionner « Lancer en tant qu’administrateur »
    2. Lancez la commande suivante : bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS
    3. Lancez la commande suivante : bcdedit /set TESTSIGNING ON
    4. Redémarrez

    Pour installer le pilote spécifique à Argyll et qui est nécessaire pour certains instruments de mesure, lancez ${APPNAME} et sélectionnez « Installer les pilotes de sonde de mesure d’ArgyllCMS… » depuis le menu « Outils ».

    Pour passer des pilotes d’ArgyllCMS à ceux du fabricant, lancez le gestionnaire de périphériques de Windows et recherchez la sonde de mesure dans la liste des périphériques. Elle peut se trouver sous l’une des entrées de niveau supérieur. Faites un clic-droit sur la sonde de mesure et sélectionnez « Mettre le pilote à jour… », choisissez ensuite « Rechercher un pilote logiciel sur mon ordinateur », « Laissez-moi choisir depuis une liste de pilotes sur mon ordinateur » et enfin sélectionnez dans la liste le pilote d’Argyll correspondant à votre sonde de mesure.

    Paquet Linux (.deb/.rpm)

    De nombreuses distributions permettent une installation facile des paquets par l’intermédiaire d’une application graphique de bureau, c’est-à-dire en faisant un double-clic sur l’icône du fichier du paquet. Veuillez consulter la documentation de votre distribution si vous n’êtes pas certain de la manière d’installer des paquets.

    Si vous ne pouvez pas accéder à votre sonde de mesure, essayez d’abord de la débrancher et de la reconnecter, ou redémarrez votre ordinateur. Si ceci ne résout pas le problème, lisez Installing ArgyllCMS on Linux: Setting up instrument access [en] (« Installer ArgyllCMS sous Linux : configurer l’accès à la sonde de mesure ».

    Mac OS X

    Montez l’image disque et option-glisser son icône vers votre dossier « Applications ». Ouvrez ensuite le dossier « ${APPNAME} » de votre dossier « Applications » et glissez l’icône de ${APPNAME} sur le dock si vous désirez y accéder facilement.

    Si vous désirez utiliser le colorimètre HCFR sous Mac OS X, suivez les instruction se trouvant sous « installing ArgyllCMS on Mac OS X [en] » (« Installer ArgyllCMS sous Mac OS X ») dans la documentation d’ArgyllCMS.

    Windows (Installateur)

    Lancez l’installateur qui vous guidera dans les différentes étapes nécessaires à la configuration.

    Si votre sonde de mesure n’est pas un ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval ni K-10, vous devrez installer un pilote spécifique à Argyll. Voir « Installation d’un pilote de sonde de mesure sous Windows ».

    Windows (archive ZIP)

    Décompressez l’archive et lancez simplement ${APPNAME} depuis le dossier qui a été créé.

    Si votre sonde de mesure n’est pas un ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval ni un K-10, vous devrez installer un pilote spécifique à Argyll. Voir « Installation d’un pilote de sonde de mesure sous Windows ».

    Code source (toutes plateformes)

    Voir la section des « Prérequis » pour un fonctionnement direct depuis les sources.

    À partir de la version 0.2.5b de ${APPNAME}, vous pouvez utiliser les commandes standard distutils/setuptools avec setup.py pour construire, installer et créer des paquets. sudo python setup.py install compilera les modules d’extension et effectuera une installation standard. Lancez python setup.py --help ou python setup.py --help-commands pour davantage d’informations. Quelques commandes et options supplémentaires ne faisant pas partie de distutils ni de setuptools (et qui n’apparaissent donc pas dans l’aide) sont aussi disponibles :

    Commandes de configuration supplémentaires

    0install
    Crée/met à jour des « feeds » 0install et crée des paquets d’applications Mac OS X pour faire tourner ces feeds.
    appdata
    Crée/met à jour le fichier AppData.
    bdist_appdmg (Mac OS X uniquement)
    Crée un DMG à partir des paquets d’applications précédemment créés (par les commandes py2app ou bdist_standalone), ou si utilisé conjointement à la commande 0install.
    bdist_deb (Linux/basé sur Debian)
    Crée un paquet Debian (.deb) pouvant être installé, un peu comme le fait la commande standard distutils bdist_rpm pour les paquets RPM. Prérequis : vous devez d’abord installer alien et rpmdb, créer une base de données RPM virtuelle via sudo rpmdb --initdb, éditer ensuite (ou créer initialement) le fichier setup.cfg (vous pouvez vous inspirer de misc/setup.ubuntu9.cfg comme exemple fonctionnel). Sous Ubuntu, exécuter utils/dist_ubuntu.sh va automatiquement utiliser le fichier setup.cfg correct. Si vous utilisez Ubuntu 11.04 ou toute autre distribution basée sur debian ayant Python 2.7 par défaut, vous devrez éditer /usr/lib/python2.7/distutils/command/bdist_rpm.py, et modifier la ligne install_cmd = ('%s install -O1 --root=$RPM_BUILD_ROOT ' en install_cmd = ('%s install --root=$RPM_BUILD_ROOT ' en supprimant l’indicateur -O1. Vous devrez aussi modifier /usr/lib/rpm/brp-compress afin qu’il n’ait aucune action (par ex. changez le contenu du fichier en exit 0, mais n’oubliez pas d’en créer une copie de sauvegarde auparavant) sinon, vous aurez des erreurs lors de la construction.
    bdist_pyi
    Peut remplacer bdist_standalone, et utilise PyInstaller plutôt que bbfreeze/py2app/py2exe.
    bdist_standalone
    Crée une application autonome qui n’exige pas d’installation de Python. Utilise bbfreeze sous Linux, py2app sous Mac OS X et py2exe sous Windows. setup.py essaiera de télécharger et d’installer automatiquement ces paquets pour vous — s’ils ne sont pas déjà installés — en utilisant le commutateur --use-distutils. Note : sous Mac OS X, les anciennes versions de py2app (avant 0.4) ne peuvent pas accéder aux fichiers situés à l’intérieur des fichiers « œufs» (« eggs ») de python (qui, de base, sont des dossiers compressé en ZIP). Setuptools, qui est nécessaire pour py2app, sera normalement installé sous la forme « d’œuf », ce qui empêche les anciennes versions des py2app d’accéder à son contenu. Afin de corriger ceci, vous devrez supprimer tous les fichiers setuptools-<version>-py<python-version>.egg déjà installés du répertoire site-packages de votre installation de Python (on le trouve en général sous /Library/Frameworks/Python.framework/Versions/Current/lib). Exécutez ensuite sudo python util/ez_setup.py -Z setuptools qui va installer setuptools « dépaqueté », permettant ainsi à py2app d’accéder à tous ses fichiers. Ceci n’est plus un problème avec py2app 0.4 ou plus récent.
    buildservice
    Crée des fichiers de contrôle pour openSUSE Build Service (ceci est aussi effectué implicitement lors de l’appel à sdist).
    finalize_msi (Windows uniquement)
    Ajoute les icônes et un raccourci dans le menu démarrer pour l’installateur MSI précédemment créé par bdist_msi. Le succès de la création de MSI nécessite une msilib patchée (information additionnelles).
    inno (Windows uniquement )
    Crée les scripts Inno Setup qui peuvent être utilisés pour compiler les exécutables de configuration pour les applications autonomes générées par les commandes py2exe ou bdist_standalone pour 0install.
    purge
    Supprime les répertoires ainsi que leur contenu build et ${APPNAME}.egg-info.
    purge_dist
    Supprime le répertoire dist ainsi que son contenu.
    readme
    Crée README.html en analysant misc/README.template.html et en remplaçant les variables de substitution comme la date et les numéros de version.
    uninstall
    Désinstalle le paquet. Vous pouvez indiquer les mêmes options que pour la commande install.

    Options de configuration supplémentaires

    --cfg=<name>
    Utiliser un fichier setup.cfg de remplacement, par ex. adapté à une distribution de Linux donnée. Le fichier setup.cfg d’origine est préservé et il sera restauré ensuite. Le fichier de remplacement doit exister sous misc/setup.<name>.cfg
    -n, --dry-run
    N’effectue aucune action. Utile en combinaison avec la commande uninstall afin de voir les fichiers qui seraient supprimés.
    --skip-instrument-configuration-files
    Passer outre l’installation des règles udev et des scripts hotplug.
    --skip-postinstall
    Passer outre la post-installation sous Linux (une entrée sera cependant créée dans le menu des applications de votre bureau, mais elle pourra n’être visible qu’après que vous vous soyez déconnecté et reconnecté ou après que vous ayez redémarré l’ordinateur) et sous Windows (il ne sera créé aucun raccourci dans le menu Démarrer).
    --stability=stable | testing | developer | buggy | insecure
    Définir la stabilité de l’implémentation qui est ajoutée/mise à jour par la commande 0install.
    --use-distutils
    Forcer setup à utiliser distutils (par défaut) plutôt que setuptools pour la configuration. Ceci est utile en combinaison avec les commandes bdist*, parce que cela évite une dépendance artificielle sur setuptools. C’est en fait un commutateur, utilisez-le une fois et le choix sera mémorisé jusqu’à ce que vous utilisiez le commutateur --use-setuptools (voir paragraphe suivant).
    --use-setuptools
    Forcer setup à essayer d’utiliser setuptools plutôt que de distutils pour la configuration. Ceci est en fait un commutateur, utilisez-le une fois et le choix sera mémorisé jusqu’à ce que vous utilisiez le commutateur --use-distutils (voir ci-dessus).

    Paramétrage spécifique à la sonde de mesure

    Si votre appareil de mesure est un i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, vous pourrez importer les corrections du colorimètre qui font partie du paquet logiciel du fabricant. Ces corrections peuvent être utilisées pour obtenir une meilleure correspondance entre la sonde de mesure et un type particulier d’écran. Note : l’ensemble des modes de mesure de la Spyder 4/5 n’est disponible que si les corrections sont importées depuis le logiciel de la Spyder 4/5.

    Choisissez « Importer les corrections du colorimètre depuis un autre logiciel de caractérisation… » depuis le menu « Outils » de ${APPNAME}.

    Si votre sonde de mesure est une Spyder 2, il vous faudra l’activer afin de profiter de son utilisation par ArgyllCMS et ${APPNAME}. Choisissez « Activer le colorimètre Spyder 2… » depuis le menu « Outils » de ${APPNAME}.

    Concepts de base de l’étalonnage et de la caractérisation d’un écran

    Si vous avez une expérience préalable de l’étalonnage et de la caractérisation, voyez plus loin. Si vous découvrez l’étalonnage d’écran, voici un aperçu rapide de ses concepts de base.

    Le comportement de l’écran est d’abord mesuré et ajusté pour correspondre à des caractéristiques-cibles définissables par l’utilisateur comme la luminosité, le gamma et le point blanc. Cette étape est en général appelée étalonnage (ou encore calibrage). L’étalonnage est effectué en agissant sur les commandes du moniteur et sur la sortie de la carte graphique (via des courbes d’étalonnage, qu’on appelle encore parfois courbes LUT[7] vidéo – faites attention à ne pas les confondre avec les profils basés sur des LUT, les différences sont expliquées ici) afin de s’approcher le plus possible de la cible choisie.
    Afin de satisfaire aux caractéristiques de la cible définie par l’utilisateur, il est généralement conseillé d’aller aussi loin que possible à l’aide des commandes du moniteur, et ensuite seulement, de manipuler la sortie de la carte vidéo par l’intermédiaire des courbes d’étalonnage qui seront chargées dans la table de gamma de la carte vidéo. Ceci permet d’obtenir les meilleurs résultats.

    On mesure ensuite la réponse de l’écran étalonné et un profil ICC[5] la décrivant est créé.

    De manière optionnelle et pour des raisons de commodité, l’étalonnage est enregistré dans le profil, mais il faut quand même les utiliser tous les deux pour obtenir des résultats corrects. Ceci peut conduire à certaines ambiguïtés, car le chargement des courbes d’étalonnage depuis le profil est généralement de la responsabilité d’un utilitaire tiers ou du système d’exploitation, alors que les applications qui utilisent le profil pour effectuer des transformations de couleur ne sont généralement pas au courant de l’étalonnage ou ne s’en préoccupent pas (et elles n’ont pas besoin de le faire). Actuellement, le seul système d’exploitation qui applique directement les courbes d’étalonnage est Mac OS X (sous Windows 7, vous pouvez l’activer, mais ceci est désactivé par défaut) – pour d’autres systèmes d’exploitation, ${APPNAME} s’occupe de créer l’outil de chargement approprié.

    Même les applications non gérées en couleur tireront bénéfice de l’étalonnage une fois celui-ci chargé, car il est stocké dans la carte graphique – il est donc « global ». Mais l’étalonnage seul ne donnera pas des couleurs exactes – seules les applications entièrement gérées en couleur utiliseront les profils d’écran et les transformées de couleurs nécessaires.

    Il est regrettable que certaines applications de visualisation et d’édition d’images mettent en œuvre une gestion de la couleur boiteuse en n’utilisant pas le profil d’écran du système (ou en n’utilisant aucun profil d’écran du tout), mais un espace colorimétrique interne « par défaut » qu’il est parfois impossible de changer tel que sRGB. Elles envoient à l’écran la sortie non modifiée après conversion vers cet espace colorimétrique par défaut. Si la réponse réelle de l’écran est proche de sRGB, vous pourrez obtenir des résultats plaisants (même s’ils ne sont pas exacts), mais sur les écrans qui se comportent différemment, par exemple les écrans à gamut étendu, même les couleurs ternes peuvent avoir une forte tendance à devenir des néons.

    Note concernant les colorimètres, les écrans et ${APPNAME}

    Les colorimètres ont besoin d’une correction matérielle ou logicielle afin qu’on puisse obtenir des résultats de mesures corrects depuis différents types de périphériques d’affichage (veuillez voir aussi “Wide Gamut Displays and Colorimeters” [en] (« Les colorimètres et les écrans à gamut large ») sur le site Web d’ArgyllCMS pour davantage d’informations). Ces derniers sont pris en charge si vous utilisez ArgyllCMS >= 1.3.0. Donc, si vous avez donc un écran et un colorimètre qui n’a pas été spécifiquement adapté à cet écran (c’est-à-dire ne comportant pas de correction matérielle), vous pouvez appliquer une correction calculée à partir de mesures d’un spectromètre afin d’obtenir de meilleurs résultats de mesures avec un tel écran.
    Il vous faut tout d’abord un spectromètre pour effectuer les mesures nécessaires à une telle correction. Vous pouvez aussi faire une recherche dans la base de données des corrections de colorimètres de ${APPNAME}. Il y a aussi une liste de fichiers de correction de colorimètre sur le site web d’ArgyllCMS – veuillez remarquer cependant qu’une matrice créée pour une combinaison particulière d’une sonde de mesure et d’un écran peut ne pas bien fonctionner avec d’autres exemplaires de la même combinaison en raison de la dispersion entre sondes de mesure que l’on rencontre avec les colorimètres les plus anciens (à l’exception du DTP94). Des appareils plus récents, tels que l’i1 Display Pro/ColorMunki Display et peut-être le Spyder 4/5 semblent en être moins affectés.
    À partir de ${APPNAME} 0.6.8, vous pouvez aussi importer des corrections génériques depuis certains logiciels de caractérisation en choisissant l’élément correspondant dans le menu « Outils ».

    Si vous achetez un écran fourni avec un colorimètre, la sonde de mesure devrait déjà avoir été, d’une manière ou d’une autre, adaptée à l’écran. Dans ce cas, vous n’avez donc pas besoin de correction logicielle.

    Note spéciale concernant les colorimètres X-Rite i1 Display Pro, ColorMunki Display et Spyder 4/5

    Ces sondes de mesure réduisent considérablement la somme de travail nécessaire pour les adapter à un écran, car elles intègrent dans le matériel la valeur des sensibilités spectrales de leurs filtres. Une simple lecture de l’écran à l’aide d’un spectromètre suffit donc pour créer la correction (à comparer à l’adaptation d’autres colorimètres à un écran, qui nécessite deux lectures, l’une effectuée avec un spectromètre et l’autre avec le colorimètre).
    Ceci signifie que n’importe qui ayant un écran particulier et un spectromètre peut créer le fichier spécial Colorimeter Calibration Spectral Set (.ccss) (« Ensemble spectral d’étalonnage de colorimètre ») de cet écran afin de l’utiliser avec ces colorimètres, sans qu’il soit nécessaire d’avoir un accès physique au colorimètre lui-même.

    Utilisation

    Vous pouvez choisir vos paramètres depuis la fenêtre principale. Lors des mesures d’étalonnage, une autre fenêtre vous guidera pour la partie interactive des réglages.

    Fichier de configuration

    Ici, vous pouvez charger un fichier de préréglage ou d’étalonnage (.cal) ou de profil ICC (.icc / .icm) obtenu lors d’une session précédente. Ceci positionnera les valeurs des options à celles enregistrées dans le fichier. Si le fichier ne contient qu’un sous-ensemble de paramètres, les autres options seront automatiquement réinitialisées à leurs valeurs par défaut (à l’exception des paramètres de la LUT 3D, qui ne seront pas réinitialisés si le fichier de paramètres ne comporte pas de paramètre de LUT 3D, et des paramètres de vérification, qui ne seront jamais réinitialisés automatiquement).

    Si on charge de cette manière un fichier d’étalonnage ou un profil, son nom sera affiché ici pour indiquer que les paramètres actuels reflètent ceux de ce fichier. De même, si un étalonnage est présent, on peut l’utiliser en tant que base lorsqu’on ne fait que « Caractériser uniquement ».
    Le fichier de paramètres choisi restera sélectionné tant que vous ne changez aucun des paramètres d’étalonnage ou de caractérisation, à une exception près : lorsqu’un fichier .cal ayant le même nom de base que le fichier des paramètres est présent dans le même répertoire, l’ajustement des contrôles de qualité et de caractérisation n’entraînera pas le déchargement du fichier des paramètres. Ceci vous permet d’utiliser un étalonnage déjà existant avec de nouveaux paramètres de caractérisation pour « Caractériser uniquement », ou pour mettre à jour un étalonnage existant avec des paramètres de qualité ou de caractérisation différents. Si vous modifiez les paramètres dans d’autres situations, le fichier sera déchargé (mais les paramètres actuels seront maintenus – le déchargement n’a lieu que pour vous rappeler que vous avez des paramètres qui ne correspondent plus à ceux de ce fichier), et les courbes d’étalonnage du profil actuel de l’écran seront restaurées (si elles existent, sinon, elles seront réinitialisées à linéaire).

    Lorsqu’un fichier d’étalonnage est sélectionné, la case à cocher « Mettre à jour l’étalonnage » devient disponible, ce qui prend moins de temps que de refaire un étalonnage à partir de zéro. Si un profil ICC[5] est détecté, et qu’un fichier d’étalonnage ayant le même nom de base est présent dans le même répertoire, le profil sera mis à jour avec le nouvel étalonnage. Si vous activez la case à cocher « Mettre à jour l’étalonnage », toutes les options ainsi que les boutons « Étalonner et caractériser » et « Caractériser uniquement » seront grisés, seul le niveau de qualité pourra être modifié.

    Paramètres prédéfinis (préréglages)

    À partir de ${APPNAME} v0.2.5b, des paramètres prédéfinis correspondant à certains cas d’utilisation peuvent être sélectionnés depuis la fenêtre déroulante des paramètres. Je vous recommande fortement de ne PAS considérer ces préréglages comme les paramètres isolément « corrects » que vous devez absolument utiliser sans les modifier si votre cas d’utilisation correspond à leur description. Voyez-les plutôt comme un point de départ, à partir duquel vous pourrez travailler vos propres paramètres, optimisés (en ce qui concerne vos exigences, votre matériel, votre environnement et vos préférences personnelles).

    Pourquoi un gamma par défaut de 2.2 a-t-il été choisi pour certaine préréglages ?

    De nombreux écrans, que ce soient des CRT, LCD, Plasma ou OLED, ont une caractéristique de réponse proche d’un gamma approximatif de 2.2-2.4 (c’est le comportement natif réel des CRT, et les autres technologies tentent typiquement d’imiter les CRT). Une courbe de réponse-cible d’étalonnage qui soit raisonnablement proche de la réponse native d’un écran devrait aider à minimiser les artefacts d’étalonnage comme l’effet de bandes (« banding »), car les ajustements nécessaires des tables de gamma des cartes vidéo par les courbes d’étalonnage ne seront pas aussi forts que si l’on a choisi une réponse-cible éloignée de la réponse par défaut du moniteur.

    Bien sûr, vous pouvez et vous devriez modifier la courbe de réponse d’étalonnage pour une valeur adaptée à vos propres exigences. Par exemple, vous pouvez avoir un écran proposant un étalonnage et des contrôles de gamma matériels, et qui a été étalonné/ajusté de manière interne pour une courbe de réponse différente, ou la réponse de votre moniteur n’est simplement pas proche d’un gamma de 2.2 pour d’autres raisons. Vous pouvez lancer « Établir un rapport sur le périphérique d’affichage non étalonné » depuis le menu « Outils » afin de mesurer, parmi d’autres informations, le gamma général approximatif.

    Onglets

    L’interface utilisateur principale est divisée en onglets, chaque onglet donnant accès à un sous-ensemble de paramètres. Les onglets ne sont pas tous visibles à un moment donné. Les onglets non disponibles sont grisés.

    Choisir l’écran à étalonner et l’appareil de mesure

    Après avoir connecté la sonde de mesure, cliquez la petite icône avec les flèches enroulées qui se trouve entre les contrôles « Périphérique d’affichage » et « Sonde de mesure » afin de détecter les périphériques d’affichage et les sondes de mesure actuellement connectés.

    Choisir le périphérique d’affichage

    Les écrans directement connectés apparaîtront en tête de liste sous la forme « Display Name/Model @ x, y, w, h » avec x, y, w et h étant les coordonnées virtuelles de l’écran selon ses paramètres de résolution et de DPI. En plus des écrans directement connectés, quelques options supplémentaires sont disponibles :

    Web @ localhost

    Démarre un serveur autonome sur votre machine, qui permet alors à un navigateur local ou distant d’afficher des échantillons de couleur, par exemple pour étalonner/caractériser un smartphone ou une tablette.

    Notez que si vous utilisez cette méthode pour afficher des échantillons de couleurs, les couleurs seront affichées avec une précision de 8 bits par composante, et que tout économiseur d’écran ou économiseur d’énergie ne sera pas automatiquement désactivé. Vous serez aussi à la merci de toute gestion de la couleur appliquée par le navigateur web. Il est donc conseillé d’examiner et de configurer soigneusement une telle gestion de la couleur.

    madVR

    Fait afficher les échantillons de test en utilisant l’application de génération de motifs de test de madVR (« Test Pattern Generator — madTPG ») qui est fournir avec l’outil de rendu vidéo madVR (uniquement disponible sous Windows, mais vous pouvez vous connecter par le réseau local depuis Linux et Mac OS X). Notez qu’alors que vous pouvez ajuster les contrôles de configuration des motifs de test dans madTPG lui-même, vous ne devriez normalement pas modifier les contrôles « disable videoLUT » (« désactiver la LUT vidéo ») et « disable 3D LUT » (« désactiver la LUT 3D »), car ils seront automatiquement définis de manière appropriée lorsque vous ferez les mesures.

    Notez que si vous voulez créer une LUT 3D pour l’utiliser avec madVR, il y a un préréglage « LUT vidéo 3D pour madVR » disponible sous « Paramètres » qui configurera non seulement ${APPNAME} afin qu’il utilise madTPG, mais aussi le format correct de LUT 3D et l’encodage pour madVR.

    Prisma

    Q, Inc./Murideo Prisma est un boîtier contenant un processeur vidéo et un générateur de motifs/3D LUT combinés qui est accessible par le réseau.

    Notez que si vous désirez créer une LUT 3D pour l’utiliser avec un Prisma, il y a un préréglage « LUT vidéo 3D pour Prisma » disponible sous « Paramètres », qui configurera non seulement ${APPNAME} afin qu’il utilise Prisma, mais aussi le format correct de LUT 3D et d’encodage.

    Remarquez aussi que le Prisma a 1 Mo de mémoire interne pour enregistrer des LUT personnalisées, ce qui est suffisant pour environ 15 LUT 17x17x17. Vous devrez occasionnellement utiliser l’interface d’administration de Prisma à l’aide d’un navigateur web pour supprimer les anciennes LUT et faire de la place pour de nouvelles.

    Resolve

    Vous permet d’utiliser le générateur de motifs intégré du logiciel de montage vidéo et d’étalonnage colorimétrique DaVinci Resolve, qui est accessible par le réseau ou sur la machine locale. Voici la manière dont ceci fonctionne, vous démarrez une session d’étalonnage ou de caractérisation dans ${APPNAME}, vous placer la fenêtre de mesures et cliquez « Démarrez les mesures ». Un message « En attente de connexion sur IP:PORT » doit apparaître. Notez les numéros d’IP et de port. Sous Resolve, passez à l’onglet « Color » (« Couleur ») et choisissez ensuite « Monitor Calibration » (« Étalonnage de l’écran »), « CalMAN » depuis le menu « Color » (avec Resolve version 11 et plus ancienne) ou le menu « Workspace » (« Espace de travail ») (avec Resolve 12).
    Entrez l’adresse IP dans la fenêtre qui s’ouvre (le numéro de port devrait être déjà rempli et cliquez « Connect » (« Connecter ») (si Resolve tourne sur la même machine que ${APPNAME}, entrez localhost ou 127.0.0.1 à la place). La position de la fenêtre de mesure que vous avez placée précédemment sera reproduite sur l’écran que vous avez connecté via Resolve.

    Notez que si vous désirez créer une LUT 3D pour l’utiliser avec Resolve, il y a un préréglage « LUT vidéo 3D pour Resolve » disponible depuis « Paramètres » qui ne fera pas que configurer ${APPNAME} pour utiliser Resolve, mais configurera aussi le format de LUT 3D et l’encodage corrects.

    Notez que si vous désirez créer une LUT 3D pour un écran directement connecté (par ex. pour le visualiseur de l’interface utilisateur graphique de Resolve), vous ne devrez pas utiliser le générateur de motifs de Resolve, mais plutôt sélectionner le périphérique d’affichage réel ce qui permet des mesures plus rapides (le générateur de motifs de Resolve apporte un délai supplémentaire).

    Non connecté

    Voir mesures d’écran non connecté. Veuillez remarquer que le mode non connecté ne devrait généralement être utilisé que si vous avez épuisé toutes les autres options.

    Choisir un mode de mesure

    Certaines sondes de mesure peuvent prendre en charge différents modes de mesure pour différents types de périphériques d’affichage. Il y a en général trois modes de mesure de base : « LCD », « à rafraîchissement » (par ex. les CRT et Plasma sont des écrans à rafraîchissement) et « Projecteur » (ce dernier n’est disponible que s’il est pris en charge par la sonde de mesure). Certaines sondes, comme la Spyder 4/5 et le ColorHug prennent en charge des modes de mesure supplémentaires, où un mode est couplé avec une correction prédéfinie du colorimètre (dans ce cas, la fenêtre déroulante de correction du colorimètre sera automatiquement définie à « aucune »).
    Des variantes de ces modes de mesures peuvent être disponibles en fonction de la sonde de mesure utilisée : le mode de mesure « adaptatif » des spectromètres utilise des temps d’intégration variables (ce qui est toujours le cas avec les colorimètres) afin d’accroître la précision des lectures des zones sombres. « HiRes » active le mode de haute résolution spectrale de spectromètres comme l’i1 Pro, ce qui peut accroître la précision des mesures.

    Compensation de la dérive lors de la mesure (uniquement disponible lors de l’utilisation d’ArgyllCMS >= 1.3.0)

    La compensation de la dérive du niveau de blanc tente de compenser les changements de luminance d’un écran au cours de son échauffement. Dans ce but, un échantillon blanc est mesuré périodiquement, ce qui augmente le temps total nécessaire aux mesures.

    La compensation de la dérive du niveau de noir tente de compenser les écarts de mesure causées par la dérive de l’étalonnage du noir lors de l’échauffement de la sonde de mesure. Dans ce but, un échantillon noir est périodiquement mesuré, ce qui accroît le temps total nécessaire aux mesures. De nombreux colorimètres sont stabilisés en température, dans ce cas, la compensation de la dérive du niveau de noir ne devrait pas être nécessaire, mais des spectromètres comme l’i1 Pro ou les ColorMunki Design/Photo ne sont pas compensés en température.

    Modifier le délai de mise à jour de l’écran (uniquement disponible avec ArgyllCMS >= 1.5.0, n’est visible que si « Afficher les options avancées » est activé dans le menu « Options »)

    Normalement, un délai de 200 ms est accordé entre l’instant du changement de la couleur des échantillons dans le logiciel, et l’instant où ce changement apparaît sur la couleur affichée elle-même. Avec certaines sondes de mesure (par ex. l’i1d3, l’i1pro, le ColorMunki, le Klein K10-A), ArgyllCMS mesurera et définira automatiquement un délai de mise à jour approprié lors de son étalonnage. Dans de rares situations, ce délai peut ne pas être suffisant (par ex. avec certains téléviseurs ayant des fonctions intensives de traitement de l’image activées), et un délai plus important peut être défini ici.

    Modifier le multiplicateur de temps d’établissement (uniquement disponible avec ArgyllCMS >= 1.7.0, n’est visible que si « Afficher les options avancées » est activé dans le menu « Options »)

    Normalement, le type de technologie de l’écran détermine le temps disponible entre l’instant d’apparition du changement de couleur d’un échantillon sur l’écran et l’instant où ce changement s’est stabilisé, et est considéré comme effectivement terminé à l’intérieur de la tolérance de mesure. Un écran CRT ou Plasma par exemple, peut avoir un temps d’établissement assez long en raison de la caractéristique de persistance du phosphore utilisé, alors qu’un LCD peut aussi avoir un temps d’établissement assez important en raison du temps de réponse des cristaux liquides et des temps de réponse des circuits d’amélioration (les sonde de mesure ne permettant pas de sélectionner le type de technologie de l’écran, comme les spectromètres, supposent le cas le plus pénalisant).
    Le multiplicateur de temps d’établissement permet aussi aux temps de montée et de descente du modèle d’être modifiés proportionnellement afin d’augmenter ou de réduire le temps d’établissement. Par exemple, un multiplicateur de 2.0 doublera le temps d’établissement, alors qu’un multiplicateur de 0.5 le diminuera de moitié.

    Choisir une correction de colorimètre pour un écran particulier

    Ceci peut améliorer la précision des colorimètres pour un type particulier d’écran, veuillez aussi consulter la note concernant les colorimètres, les écrans et ${APPNAME}. Vous pouvez importer des matrices génériques provenant d’un autre logiciel de caractérisation d’écran ou rechercher dans la base de données en ligne des corrections de colorimètre une correspondance avec votre combinaison d’écran et de sonde de mesure (cliquez le petit globe près de la fenêtre déroulante de correction). On trouve aussi une liste participative de matrices de correction sur le site Web d’ArgyllCMS.

    Veuillez noter que cette option n’est disponible qu’avec ArgyllCMS >= 1.3.0 et un colorimètre.

    Paramètres d’étalonnage

    Réglage interactif de l’écran

    Désactiver ceci permet de passer directement aux mesures d’étalonnage et de caractérisation plutôt que de vous donner l’opportunité de toucher d’abord aux commandes de l’écran. Normalement, vous devriez laisser cette case cochée afin de pouvoir utiliser ces commandes pour amener l’écran au plus près des caractéristiques de la cible choisie.

    Observateur

    Pour voir ce réglage, vous devez avoir une sonde de mesure qui prenne en charge les lectures de spectre (c’est-à-dire un spectromètre) ou l’étalonnage d’échantillon spectral (par ex. l’i1 DisplayPro, le ColorMunki Display et les Spyder4/5), et aller dans le menu « Options » et y activer « Afficher les options avancées ».

    Cette option vous permet de sélectionner différents observateurs colorimétriques, qu’on appelle aussi fonction de correspondance de la couleur (CMF = « Color Matching Function »), pour les sondes de mesure qui le prennent en charge. La valeur par défaut est l’observateur standard 2° CIE 1931.

    Notez que si vous sélectionnez n’importe quoi d’autre que l’observateur standard 2° CIE 1931, alors les valeurs de Y ne seront pas en cd/m², parce que la courbe Y n’est pas la fonction de luminosité photopique V(λ) CIE 1924.

    Point blanc

    Permet de donner au locus du point blanc-cible la valeur de l’équivalent d’un spectre de lumière du jour ou du corps noir ayant la température donnée en kelvins, ou sous forme de coordonnées de chromaticité. Par défaut, la cible du point blanc sera le blanc natif de l’écran, et sa température de couleur et son delta E dans le « spectrum locus » de la lumière du jour seront affichés lors du réglage du moniteur. Il est recommandé d’effectuer les réglages afin de placer le point blanc de l’écran directement sur le locus de la lumière du jour. Si on indique une température de couleur de la lumière du jour, elle deviendra alors la cible de réglage, et les réglages recommandés sont ceux qui feront correspondre le point blanc du moniteur à celui de la cible. Des valeurs typiques peuvent être de 5000 K afin de correspondre à des sorties imprimées, ou de 6500 K, ce qui donne un aspect plus lumineux, plus bleu. Une température de point blanc différente de la température native du moniteur pourra limiter la luminosité maximum possible.

    Si vous désirez connaître le point blanc actuel de votre écran avant étalonnage, vous pouvez lancer « Établir un rapport sur le périphérique d’affichage non étalonné » depuis le menu « Outils » afin de le mesurer.

    Si vous désirez ajuster le point blanc aux chromaticités de votre éclairage ambiant, ou à celles d’une cabine de visualisation telle que celles utilisées en prépresse ou en photographie, et que votre sonde de mesure possède la fonction de mesure de la lumière ambiante (comme l’i1 Pro ou l’i1 Display, par exemple, avec leurs têtes de lecture respectives de la mesure de lumière ambiante), vous pouvez utiliser le bouton « Mesurer » (icône en forme de pipette) situé près des paramètres du point blanc. Si vous désirez mesurer la lumière ambiante, placez la sonde de mesure vers le haut, à côté du l’écran. Ou si vous désirez mesurer une cabine de visualisation, placez une carte sans métamérisme dans la cabine et pointez la sonde de mesure dans sa direction. Des renseignements supplémentaires sur la manière de mesurer la lumière ambiante se trouvent dans la documentation de votre sonde de mesure.

    Niveau de blanc

    Définissez la cible de luminosité du blanc en cd/m2. Si cette valeur ne peut être atteinte, la sortie la plus lumineuse possible sera choisie, tout en restant en adéquation avec la cible de point blanc. Remarquez que de nombreuses sondes de mesure ne sont pas particulièrement précises dans l’évaluation de la luminosité absolue de l’écran en cd/m2. Notez que certains écrans LCD se comportent de manière un peu étrange au voisinage de leur point blanc absolu, et peuvent donc présenter un comportement curieux pour des valeurs juste en dessous du blanc. Dans de tels cas, il peut être souhaitable, de régler la luminosité un peu en dessous du maximum dont est capable cet écran.

    Si vous désirez connaître le niveau de blanc actuel de votre écran non étalonné, lancez « Établir un rapport sur le périphérique d’affichage non étalonné » depuis le menu « Outils » afin de le mesurer.

    Niveau de noir

    (Pour afficher ce paramètre, allez dans le menu « Options » et activez « Afficher les options avancées »)

    Il peut être utilisé pour définir la luminosité-cible du noir en cd/m2 et est utile pour, par exemple, apparier deux écrans différents ayant des noirs natifs différents, en mesurant le niveau de noir de chacun d’eux (choisissez « Établir un rapport sur le périphérique d’affichage non étalonné » depuis le menu « Outils ») et en entrant la plus élevée des valeurs mesurées. Normalement, vous devriez cependant utiliser le niveau natif de noir afin de maximiser le rapport de contraste. Fixer une valeur trop élevée peut aussi conduire à des effets étranges, car elle interagit avec l’essai d’obtention de la cible « annoncée » de la forme de la courbe de tonalité. Utiliser un décalage du noir en sortie de 100% tente de minimiser de tels problèmes.

    Courbe de tonalité / gamma

    La courbe de réponse-cible est normalement une courbe exponentielle (sortie = entréegamma), et la valeur par défaut de gamma est de 2.2 (qui est proche de la réponse réelle d’un écran CRT typique). Quatre courbes prédéfinies peuvent aussi être utilisées : la courbe de réponse de l’espace colorimétrique sRGB, qui est une courbe exponentielle avec un segment rectiligne du côté des noirs et une réponse globale ayant un gamma approximativement égal à 2.2, la courbe L*, qui est la réponse de l’espace colorimétrique perceptuel CIE L*a*b*, la courbe de réponse vidéo normalisée Rec. 709 et la courbe de réponse vidéo normalisée SMPTE 240M.
    Un autre choix possible est « tel que mesuré » qui va omettre l’étalonnage de la table de gamma (LUT 1D) de la carte vidéo.

    Remarquez qu’un écran réel ne peut habituellement reproduire aucune de ces courbes idéales prédéfinies, car il a un point noir non nul, alors que les courbes idéales supposent que la luminosité est nulle pour une entrée de zéro.

    Pour les valeurs de gamma, vous pouvez aussi indiquer si elles doivent être interprétées comme relatives, ce qui signifie que la valeur de gamma fournie est utilisée pour définir une courbe de réponse réelle à la lumière du noir non nul de l’écran réel qui aurait la même sortie relative à une entrée de 50 % que la courbe de puissance gamma idéale, ou absolue, qui permet plutôt d’indiquer la valeur réelle de la puissance, ce qui signifie qu’après avoir pris en compte le noir non nul de l’écran réel, la réponse à une entrée de 50 % ne correspondra probablement pas à celle de la courbe de puissance idéale ayant cette valeur de gamma (Pour que ce paramètre soit visible, vous devez aller dans le menu « Options » et activer « Afficher les options avancées »).

    Afin de permettre d’avoir le niveau de noir non nul d’un écran réel, les valeurs de la courbe-cible seront, par défaut, décalées de manière à ce que cette entrée nulle donne le niveau de noir réel de cet écran (décalage de sortie). Ceci garantit que la courbe-cible correspondra mieux au comportement naturel typique des écrans, mais elle peut ne pas fournir une progression visuelle la plus régulière possible en partant du minimum de l’écran. Ce comportement peut être modifié en utilisant l’option de décalage du noir en sortie (voir ci-dessous pour davantage d’informations).

    Remarquez aussi que de nombreux espaces colorimétriques sont encodés avec un gamma approximatif de 2.2 et sont étiquetés comme tels (c’est-à-dire sRGB, REC 709, SMPTE 240M, Macintosh OS X 10.6), mais ils sont en fait prévus pour être affichés sur écrans CRT typiques ayant un gamma de 2.4, consultés dans un environnement sombre.
    Ceci parce que ce gamma de 2.2 gamma est un gamma-source dans des conditions d’observation claires telles que celles d’un studio de télévision, alors que les conditions d’observation typiques d’un écran sont comparativement plutôt sombres, et qu’une expansion du contraste d’un gamma de (approximativement) 1.1 est souhaitable pour que l’aspect des images soit semblable à ce qui était prévu.
    Si donc vous examinez des images encodées avec la norme sRGB, ou si vous visualisez des vidéos en utilisant l’étalonnage, simplement définir la courbe de gamma à sRGB ou REC 709 (respectivement) n’est probablement pas ce qu’il faut faire ! Il vous faudra probablement définir la courbe de gamma aux alentours de 2.4, de manière à ce que la plage de contraste soit dilatée de manière appropriée, ou alors utiliser plutôt sRGB ou REC 709 ou un gamma de 2.2 mais aussi indiquer les conditions de visualisation ambiantes réelles par un niveau d’éclairement en Lux. De cette manière, le contraste peut être amélioré de manière appropriée lors de l’étalonnage. Si votre sonde de mesure est capable de mesurer les niveaux de luminosité ambiante, vous pouvez alors le faire.
    (Vous trouverez des informations techniques détaillée concernant sRGB sur « A Standard Default Color Space for the Internet: sRGB [en] (« Un espace colorimétrique standard par défaut pour l’Internet : sRGB ») sur le site web de l’ICC[5] afin de comprendre la manière dont il est prévu de l’utiliser).

    Si vous vous demandez quelle valeur de gamma vous devriez utiliser, vous pouvez lancer « Établir un rapport sur le périphérique d’affichage non étalonné » depuis le menu « Outils » afin de mesurer menu, entre autres informations, le gamma global approximatif. Définir le gamma à la valeur indiquée peut alors vous aider à réduire les artefacts d’étalonnage, car les ajustements nécessaires de la table de gamma de la carte vidéo ne devraient alors pas être aussi importants que si l’on avait choisi un gamma plus éloigné de la réponse native de l’écran.

    Niveau de luminosité ambiante

    (Pour que ce paramètre soit visible, allez dans le menu « Options » et activez « Afficher les options avancées »)

    Comme il a été expliqué pour les paramètres de la courbe de tonalité, les couleurs sont souvent encodées dans une situation où les conditions de visualisation sont assez différentes de celles d’un écran typique, en espérant que cette différence de conditions d’observation sera prise en compte dans la manière dont l’écran est étalonné. L’option de niveau de luminosité ambiante est une manière de le faire. Par défaut, l’étalonnage ne fera aucune supposition en ce qui concerne les conditions de visualisation, mais l’étalonnage sera effectué pour la courbe de réponse indiquée. Mais si on entre, ou si on mesure le niveau de luminosité ambiante, un ajustement approprié des conditions de visualisation sera effectué. Avec une valeur de gamma ou pour sRGB, les conditions de visualisation d’origine seront supposées être celles des conditions de visualisation de la norme sRGB, alors qu’avec REC 709 et SMPTE 240M, il sera supposé que ce sont des conditions de visualisation d’un studio de télévision.
    Si vous indiquez ou si vous mesurez l’éclairage ambiant pour votre écran, un ajustement des conditions de visualisation basé sur le modèle d’apparence des couleurs CIECAM02 sera effectué pour la luminosité de votre écran et le contraste qu’il présente avec votre niveau d’éclairage ambiant.

    Veuillez noter que pour pouvoir mesurer le niveau de lumière ambiante, votre appareil de mesure doit être pourvu de la possibilité de mesurer la lumière ambiante (comme l’i1 Pro ou l’i1 Display, par exemple, avec leur tête respective de mesure de la lumière ambiante).

    Décalage du noir de sortie

    (Pour que ce paramètre soit visible, allez dans le menu « Options » et activez « Afficher les options avancées »)

    Contrairement à la courbe de réponse-cible, la réponse des écrans réels n’est pas nulle pour le noir. Il faut donc pouvoir le faire d’une manière ou d’une autre.

    La manière par défaut de le gérer (équivalent à un décalage de 100% du noir en sortie) est de le faire à la sortie de la courbe de réponse idéale en décalant et en redimensionnant proportionnellement les valeurs de sortie. Ceci définit une courbe qui correspondra aux réponses que procurent de nombreux autres systèmes et peut mieux correspondre à la réponse naturelle de l’écran, mais elle donnera une réponse visuellement moins uniforme depuis le noir.

    L’autre possibilité est de décaler et de redimensionner proportionnellement les valeurs d’entrée de la courbe de réponse idéale de manière à ce qu’une entrée nulle donne la réponse non nulle de l’écran réel. Ceci procure une progression visuellement plus régulière depuis le minimum de l’écran, mais cela peut être difficile à obtenir car c’est différent de la réponse naturelle de l’écran.

    Une subtilité est de fournir une répartition entre la proportion de décalage dont on tient compte en entrée de la courbe de réponse idéale, et la proportion prise en compte à la sortie, lorsque la taux est de 0.0, on prend l’ensemble comme décalage d’entrée et lorsqu’il est de 100% on prend l’ensemble comme décalage de sortie.

    Correction du point noir

    (Pour que ce paramètre soit visible, allez dans le menu « Options » et activez « Afficher les options avancées »)

    Normalement, dispcal va essayer que toutes les couleurs de l’axe neutre (R=V=B) aient la même teinte que le point blanc choisi. Aux alentours du point noir, les rouge, vert et bleu ne peuvent être qu’additionnés, non soustraits de zéro, donc essayer d’obtenir que les couleurs proches du noir aient la teinte désirée va les éclaircir jusqu’à un certain point. Avec un appareil ayant un bon rapport de contraste ou un point noir qui a sensiblement la même teinte que le point blanc, ce n’est pas un problème. Si le rapport de contraste de l’appareil n’est pas très bon, et que la teinte du noir est sensiblement différente de celle du point blanc choisi (ce qui est souvent le cas avec les écrans de type LCD), ceci peut avoir un effet fortement préjudiciable sur le rapport de contraste déjà limité. On peut contrôler ici le niveau de correction de la teinte du point noir.
    Par défaut, un facteur de 100 % est utilisé, ce qui est généralement correct pour les écrans « à rafraîchissement » tels que les CRT ou Plasma et un facteur de 0 % est utilisé pour les écrans de type LCD, mais vous pouvez passer outre ces valeurs avec des valeurs comprises entre 0 % (pas de correction) et 100 % (correction complète) ou activer le paramétrage automatique basé sur le niveau mesuré du noir de l’écran.

    Si vous choisissez une correction autre que totale, alors le point blanc sera presque toujours sous les courbes d’étalonnage résultantes, mais il va ensuite traverser vers le point noir natif ou de compromis.

    Taux de correction du point noir (uniquement disponible avec ArgyllCMS >= 1.0.4)

    (Pour que ce paramètre soit visible, allez dans le menu « Options » et sélectionnez « Afficher les options avancées »)

    Si le point noir n’est pas défini à une teinte exactement identique à celle du point blanc (parce que, par exemple, le facteur est inférieur à 100%), alors les courbes d’étalonnage résultantes auront le point blanc-cible qui sera la plupart du temps sous la courbe, mais il va ensuite se fondre avec le point noir natif ou de compromis qui est plus noir mais pas de la même teinte. Le taux de cette fusion peut être contrôlé. La valeur par défaut est de 4.0, ce qui donne une cible qui passe du point blanc-cible au noir, assez proche du point noir. Alors que ceci donne typiquement un bon résultat visuel, la teinte neutre de la cible étant maintenue au point pour lequel croisement vers la teinte noire n’est pas visible, cela peut être trop exigeant pour certains écrans (typiquement les écrans de type LCD), et il peut y avoir certains effets visuels en raison de l’incohérence de la couleur selon l’ange de vue. Dans cette situation, une valeur plus faible peut donner un meilleur résultat visuel (essayez, par exemple, des valeurs de 3.0 ou 2.0). Une valeur de 1.0 va définir une fusion entièrement linéaire du point blanc vers le point noir). S’il y a trop de coloration près du point noir, essayez des valeurs plus élevées comme 6.0 ou 8.0, par exemple.

    Vitesse d’étalonnage

    (Ce paramètre ne s’applique pas et est masqué si la courbe de tonalité est définie à « Telle que mesurée »)

    Détermine combien de temps et d’efforts sont nécessaires à l’étalonnage de l’écran. Plus la vitesse est faible, plus le nombre de tests de lecture effectués sera élevé, plus le nombre de passes d’affinage sera élevé, plus la tolérance de précision sera serrée et plus l’étalonnage de l’écran sera détaillé. Le résultat sera au final limité par la précision de la sonde de mesure, la répétabilité de l’écran et de la sonde, et par la résolution des entrées de la table de gamma de la carte vidéo et de ses entrées numériques ou analogiques (RAMDAC).

    Paramètres de caractérisation

    Qualité du profil

    Elle définit le niveau d’efforts et/ou de détails du profil résultant. Pour les profils basés sur des tables (LUT[7] = tables de correspondance), elle définit la taille de la table de correspondance principale, et en conséquence, la qualité du profil résultant. Pour les profils basés sur une matrice, elle définit le niveau de détail des courbes par canal et l’« effort » de correspondance.

    Compensation du point noir (activez « afficher les options avancées » dans le menu « Options »)

    (Note : cette option n’a pas d’effet si vous n’effectuez que l’étalonnage et la création d’un profil simple de courbes + matrice directement à partir des données d’étalonnage, sans mesures supplémentaires de caractérisation).

    Ceci évite de manière efficace l’écrasement du noir lors de l’utilisation du profil mais aux dépens de la précision. Il est généralement préférable de n’utiliser cette option que s’il n’est pas certain que les applications que vous allez utiliser ont une implémentation de haute qualité de la gestion de la couleur. Pour les profils basés sur des LUT, il existe des options plus évoluées (par exemple, les options avancées de transposition du gamut et l’utilisation soit de « Améliorer la résolution effective des tables colorimétriques PCS[11]-vers-périphérique », qui est activée par défaut, soit de « Transposition du gamut pour une intention perceptuelle », qui peut être utilisée pour créer une table perceptuelle qui transpose le point noir).

    Type de profil (activez « Afficher les options avancées » dans le menu « Options »)

    On distingue en général deux types de profils : basé sur des LUT[7] et basé sur une matrice.

    Les profils basés sur une matrice sont plus petits en taille de fichiers, un peu moins précis (bien que plus réguliers dans la plupart des cas) comparés aux types basés sur une LUT[7], et habituellement, ils présentent la meilleure compatibilité entre les CMM[2], les applications et les systèmes – mais ils ne prennent en charge que l’intention colorimétrique pour les transformées de couleur. Pour les profils basés sur une matrice, le PCS[11] (Profile Connection Space = espace de connexion du profil) est toujours XYZ. Vous pouvez choisir entre l’utilisation de courbes séparées pour chaque canal (rouge, vert et bleu), une courbe unique pour tous les canaux, des valeurs de gamma séparées pour chaque canal ou un seul gamma pour tous les canaux. Les courbes sont plus précises que les valeurs de gamma. Une courbe unique ou un gamma unique peuvent être utilisés si des courbes ou des valeurs de gamma individuelles dégradent l’équilibre des gris d’un étalonnage par ailleurs bon.

    Les profils basés sur des LUT[7] sont plus gros en taille de fichiers, plus précis (mais ce peut être au détriment de la régularité), dans certains cas, ils sont moins compatibles (les applications peuvent ne pas être à même de les utiliser ou présenter des bizarreries avec les profils de type LUT[7] ou certaines de leurs variantes). Lors du choix d’un type de profil basé sur les LUT[7], les options avancées de transposition du gamut sont rendues disponibles ce qui vous permet de les utiliser pour créer des tables perceptuelles ou de saturation à l’intérieur du profil en plus des tables colorimétriques par défaut qui sont toujours créées.
    L*a*b* ou XYZ peuvent être utilisés comme PCS[11], XYZ étant recommandé spécialement pour les écrans à gamut large parce que leurs primaires peuvent excéder la plage d’encodage de L*a*b* de l’ICC[5] (Note : sous Windows, les LUT[7] de type XYZ ne sont disponibles que si ${APPNAME} utilise ArgyllCMS >= 1.1.0 en raison d’une exigence de balises de matrice dans le profil, qui ne sont pas créées par les versions antérieures d’ArgyllCMS).
    Comme il est difficile de vérifier si la LUT[7] d’un profil combiné LUT[7] XYZ + matrice est réellement utilisée, vous pouvez choisir de créer un profil avec une matrice inversée, c’est-à-dire bleu-rouge-vert à la place de rouge-vert-bleu, il sera ainsi évident de voir si une application utilise la matrice (délibérément fausse) à la place de la LUT (correcte) car les couleurs seront alors complètement fausses (par ex. tout ce qui devrait être rouge sera bleu, le vert sera rouge, le bleu sera vert, le jaune sera violet, etc.).

    Note : on pourrait confondre les profils basés sur des LUT[7] (qui contiennent des LUT tri-dimensionnelles) et les courbes LUT[7] (d’étalonnage) de la carte vidéo (LUT à une dimension), mais ce sont deux choses différentes. Les profils basés sur une LUT[7] comme ceux basés sur une matrice peuvent inclure des courbes d’étalonnage qui peuvent être chargées dans la table de gamma matérielle de la carte vidéo.

    Options avancées de transposition du gamut (activez « Afficher les options avancées » dans le menu « Options »)

    Vous pouvez choisir l’une quelconque des options suivantes après avoir sélectionné un profil de type LUT et avoir cliqué « Avancé… ». Note : les options « Tables PCS[11]-vers-périphérique de basse qualité » et « Améliorer la résolution effective de la table colorimétrique PCS[11]-vers-périphérique » sont mutuellement exclusives.

    Tables PCS[11]-vers-périphérique de basse qualité

    Choisissez cette option si le profil ne doit être utilisé qu’avec une transposition inverse de gamut périphérique-vers-PCS[11] afin de créer un lien de périphérique (« DeviceLink») ou une LUT 3D (${APPNAME} utilise toujours une transposition inverse périphérique-vers-PCS[11] du gamut lors de la création de Lien de périphérique/LUT 3D). Ceci réduit le temps de traitement nécessaire pour créer les tables PCS[11]-vers-périphérique. Ne choisissez pas cette option si vous désirez installer ou utiliser ce profil par ailleurs.

    Améliorer la résolution effective de la table colorimétrique PCS[11]-vers-périphérique

    Pour utiliser cette option, vous devez sélectionner un profil de type LUT XYZ. Cette option accroît la résolution effective de la table de correspondance couleur colorimétrique PCS[11] vers périphérique en utilisant une matrice afin de limiter l’espace XYZ et de remplir l’ensemble de la mire avec les valeurs obtenues en inversant la table périphérique-vers-PCS[11], tout en appliquant, de manière optionnelle, un lissage. Si aucune transposition du gamut CIECAM02 n’a été activée pour l’intention de rendu perceptuelle, une table perceptuelle simple mais efficace (qui est à peu près identique à la table colorimétrique, mais qui transpose le point noir à zéro) sera aussi générée.

    Vous pouvez aussi définir les dimensions de la table de correspondance interpolée. La valeur « Auto » par défaut utilise une résolution de base de 33x33x33 qui est augmentée au besoin et procure un bon équilibre entre la régularité et la précision. Abaisser la résolution peut améliorer la régularité (potentiellement aux dépens d’un peu de précision), alors que l’accroissement de la résolution peut potentiellement rendre le profil moins précis (aux dépens d’un peu de régularité). Notez que les calculs demanderont beaucoup de mémoire (>= 4 Go de RAM sont recommandés afin d’éviter les échanges sur disque) spécialement pour les résolutions les plus élevées.

    Voyez sur les images d’exemples ci-dessous les résultat auxquels vous pouvez vous attendre, où l’image d’origine a été convertie depuis sRGB ver le profil de l’écran. Notez cependant que l’image synthétique particulière choisie, un arc-en-ciel (« granger rainbow »), exagère l’effet de bandes, un matériau du monde réel aura moins tendance à le montrer. Notez aussi que le bleu sRGB de l’image se trouve hors gamut pour l’écran spécifique utilisé, et que les limites visibles dans le dégradé de bleu du rendu sont une conséquence du fait que la couleur soit hors gamut, et que la transposition du gamut atteint donc les limites moins régulières du gamut.

    Image Granger Rainbow d’origine

    Image originale « granger rainbow »

    Granger Rainbow - rendu colorimétrique par défaut

    Rendu colorimétrique par défaut (profil LUT XYZ 2500 OFPS)

    Granger Rainbow - rendu colorimétrique « lisse »

    Rendu colorimétrique « lisse » (profil LUT XYZ 2500 OFPS, A2B inversé)

    Granger Rainbow - rendu perceptuel « lisse »

    Rendu perceptuel « lisse » (profil LUT XYZ 2500 OFPS, A2B inversé)

    Intention de rendu par défaut du profil

    Elle définit l’intention de rendu par défaut. En théorie, les applications pourraient l’utiliser, en pratique, elles ne le font pas. Modifier ce paramètre n’aura probablement aucun effet quoi qu’il en soit.

    Transposition de gamut CIECAM02

    Note : lorsque l’on active l’une des options de transposition de gamut CIECAM02, et que le profil source est un profil à matrice, l’activation ensuite de l’amélioration de la résolution effective va aussi influencer la transposition de gamut CIECAM02, en la rendant plus douce, avec comme effet secondaire une génération plus rapide.

    Normalement, les profils créés par ${APPNAME} n’incorporent que l’intention de rendu colorimétrique, ce qui signifie que les couleurs se trouvant hors du gamut de l’écran seront écrêtées à la couleur la plus proche comprise dans le gamut. Les profils de type LUT peuvent aussi avoir une transposition de gamut en implémentant des intentions de rendu perceptuelle et/ou de saturation (compression ou expansion du gamut). Vous pouvez choisir si vous désirez en utiliser une et laquelle de celles-ci en indiquant un profil source et en marquant les cases à cocher appropriées. Notez qu’un profil d’entrée, de sortie, d’écran ou d’espace de couleur de périphérique doit être indiqué comme source, et non un espace colorimétrique non associé à un périphérique, un lien de périphérique, un profil de couleur nommé ou abstrait. Vous pouvez aussi choisir les conditions d’observation qui décrivent l’utilisation prévue à la fois de la source et du profil et du profil d’affichage qui est sur le point d’être créé. Une condition d’observation appropriée de la source est automatiquement choisie en se basant sur le type du profil source.

    Une explication des intentions de rendu disponibles se trouve dans la section des LUT 3D « Intention de rendu ».

    Pour davantage d’informations sur la justification d’un gamut source, voir « About ICC profiles and Gamut Mapping [en] » (« À propos des profils ICC et de la transposition du gamut ») dans la documentation d’ArgyllCMS.

    Une stratégie pour obtenir les meilleurs résultats perceptuels avec des profils d’écran est la suivante : sélectionnez un profil CMJN comme source pour la transposition de gamut. Ensuite, lors de la conversion depuis un autre profil RVB vers le profil d’affichage, utilisez une intention de rendu de colorimétrie relative, et si vous faites la conversion depuis un profil CMJN, utilisez l’intention perceptuelle..
    Une autre approche particulièrement utile les écrans à gamut limité est de choisir un des profils source les plus larges (en ce qui concerne le gamut) avec lequel vous travaillez habituellement pour la transposition de gamut, et ensuite de toujours utiliser l’intention perceptuelle lors de la conversion vers le profil d’affichage.

    Veuillez noter que toutes les applications ne prennent pas en charge une intention de rendu pour les profils d’affichage et peuvent, par défaut, utiliser colorimétrique (par ex. Photoshop utilise normalement la colorimétrie relative avec une compensation du point noir, mais il peut utiliser différentes intentions par l’intermédiaire de paramètres personnalisés d’épreuvage à l’écran).

    Fichier de mire de test
    Vous pouvez choisir ici les échantillons de test utilisés lors de la caractérisation de l’écran. Le paramètre par défaut optimisé « Auto » prend en compte les caractéristiques réelles de l’écran. Vous pouvez encore augmenter la précision potentielle de votre profil en accroissant le nombre d’échantillons à l’aide du curseur.
    Éditeur de mire de test

    Les mires de test fournies par défaut devraient fonctionner correctement dans la plupart des situations, mais vous permettre de créer des mires personnalisées vous assure un maximum de flexibilité lors de la caractérisation d’un écran et peut améliorer la précision et l’efficacité de la caractérisation. Voir aussi optimisation des mires de test.

    Options de génération des mires de test

    Vous pouvez entrer le nombre d’échantillons qui seront générés pour chaque type d’échantillon (blanc, noir, gris, canal unique, itératif et étapes cubiques multidimensionnelles). L’algorithme d’itération peut être ajusté si on doit générer plus que zéro échantillons. Ce qui suit est une rapide description des différents algorithmes itératifs disponibles, « espace du périphérique » signifie dans ce cas coordonnées RVB, et « espace perceptuel » signifie les nombres XYZ (supposés) de ces coordonnées RVB. Les nombres XYZ supposés peuvent être influencés en fournissant un profil précédant, ce qui permet donc le placement optimisé du point de test.

    • Optimized Farthest Point Sampling (OFPS) (« Échantillonnage optimisé du point le plus éloigné ») optimisera les emplacements des points pour minimiser la distance depuis n’importe quel point de l’espace du périphérique vers le point d’échantillonnage le plus proche ;
    • Incremental Far Point Distribution (« Distribution incrémentale du point éloigné») va rechercher de manière incrémentale les points de test que se trouvent aussi éloignés que possible d’un quelconque point existant ;
    • Device space random (« Aléatoire dans l’espace du périphérique ») choisit les points de test avec une distribution aléatoire régulière dans l’espace du périphérique ;
    • Perceptual space random (« Aléatoire dans l’espace perceptuel ») choisit les points de test avec une distribution aléatoire régulière dans l’espace perceptuel ;
    • Device space filling quasi-random (« Remplissage quasi-aléatoire de l’espace du périphérique ») choisit les points de test avec une distribution quasi-aléatoire de remplissage de l’espace, dans l’espace du périphérique ;
    • Perceptual space filling quasi-random (« Remplissage quasi-aléatoire de l’espace perceptuel ») choisit des points de tests avec une distribution quasi-aléatoire de remplissage de l’espace dans l’espace perceptuel ;
    • Device space body centered cubic grid (« grille cubique centrée dans le corps de l’espace du périphérique ») choisit les points de tests avec une distribution cubique centrée dans le corps dans l’espace du périphérique ;
    • Perceptual space body centered cubic grid (« grille cubique centrée dans le corps de l’espace perceptuel ») choisit les points de test avec une distribution cubique centrée dans le corps dans l’espace perceptuel.

    Vous pouvez définir le niveau d’adaptation aux caractéristiques connues du périphérique utilisées par l’algorithme par défaut de dispersion complète (OFPS). Un profil de préconditionnement devrait être fourni si l’adaptation est définie au-dessus d’un niveau bas. Par défaut, l’adaptation est de 10 % (basse), et devrait être définie à 100 % (maximum) si un profil est fourni. Mais si, par exemple, le profil de préconditionnement ne représente pas très bien le comportement du périphérique, une adaptation plus basse que 100 % peut être appropriée.

    Pour les distributions de grille centrée sur le corps, le paramètre d’angle définit l’angle global de la distribution de mire.

    Le paramètre « Gamma » définit une valeur de fonction semblable à une puissance (afin d’éviter une compression excessive qu’une vraie fonction puissance apporterait) qui sera appliquée à toutes les valeurs du périphérique après qu’elles ont été générées. Une valeur supérieure à 1.0 va entraîner un espacement plus serré des valeurs de test situées près de la valeur 0.0, alors que des valeurs inférieures à 1.0 créeront un espacement plus serré près de la valeur 1.0. Notez que le modèle de périphérique utilisé pour créer les valeurs d’échantillons attendues ne prend pas en compte la puissance appliquée, les algorithmes plus complexes de distribution complète ne prendront pas davantage en compte la puissance.

    Le paramètre d’accentuation de l’axe neutre permet de changer le niveau avec lequel la distribution des échantillons doit accentuer l’axe neutre. Comme l’axe neutre est regardé comme la zone visuellement la plus critique de l’espace colorimétrique, placer davantage d’échantillons de mesure dans cette zone peut aider à maximiser la qualité du profil résultant. Cette accentuation n’est efficace que pour les distributions d’échantillons perceptuelles, et pour la distribution OFPS par défaut si le paramètre d’adaptation est défini à une valeur trop élevée. C’est aussi le plus efficace lorsqu’un profil de préconditionnement est fourni, car c’est la seule manière de détermination du neutre. La valeur par défaut de 50 % procure un effet d’environ deux fois l’accentuation de la formule Delta E CIE94.

    Le paramètre d’accentuation de la région sombre permet de changer le niveau avec lequel la distribution d’échantillons doit accentuer la région sombre de la réponse du périphérique. Les périphériques d’affichage utilisé pour la vidéo ou la reproduction de film sont typiquement visualisés dans des environnements de visualisation sombres sans référence blanche forte, et ils emploient typiquement une plage de niveaux de luminosité dans les différentes scènes. Ceci signifie souvent que la réponse des périphériques dans les régions sombres a une importance particulière, donc augmenter le nombre relatif de points d’échantillonnage dans la région sombre peut améliorer l’équilibre de la précision du profil résultant pour la vidéo ou la reproduction de film. Cette accentuation n’est efficace qu’avec les distributions perceptuelles des échantillons pour lesquelles un profil de préconditionnement est fourni. La valeur par défaut de 0 % n’apporte aucune accentuation des régions sombres. Une valeur autour de 15 %-30 % est un bon point de départ pour l’utilisation vidéo d’un profil. Une version réduite de ce paramètre sera passée au profileur. Notez que l’accroissement de la proportion d’échantillons sombres va typiquement allonger le temps que la sonde de mesure prendra pour lire l’ensemble de la mire. Accentuer la caractérisation de la région sombre réduira la précision des mesures et de la modélisation des régions plus claires, pour un nombre donné de points de test et une qualité de profil/résolution de mire donnée. Le paramètre sera aussi utilisé d’une manière analogue à la valeur « Gamma » pour modifier la distribution d’un seul canal, de l’échelle de gris et des étapes multidimensionnelles.

    L’option « Limiter les échantillons à la sphère » est utilisée pour définir une sphère L*a*b* permettant filtrer les points de test. Seuls les points de test compris à l’intérieur de la sphère (définie par son centre et son rayon) feront partie de la mire de test. Ceci peut être bien pour cibler des points de test supplémentaires sur un zone à problème d’un périphérique. La précision de la cible L*a*b* sera meilleure lorsqu’un profil de préconditionnement raisonnablement précis est choisi pour le périphérique. Notez que le nombre réel de points généré peut être difficile à prévoir, et il dépendra du type de génération utilisé. Si les méthodes OFPS, aléatoire dans l’espace du périphérique et l’espace perceptuel et remplissage semi-aléatoire de l’espace du périphérique sont utilisées, alors le nombre de points cible sera obtenu. Toutes les autres méthodes de génération de points vont générer un nombre de points plus faible qu’attendu. Pour cette raison, la méthode de remplissage quasi-aléatoire de l’espace du périphérique est probablement la plus facile à utiliser.

    Génération de vues 3D de diagnostic des mires de test

    Vous pouvez générer des vues 3D de différents formats. Le format par défaut est HTML, il peut être visualisé dans un navigateur ayant la fonctionnalité WebGL active. Vous pouvez choisir le ou les espaces colorimétriques dans lequel vous désirez que s’affichent les résultats et aussi contrôler si vous désirez utiliser le décalage RVB du noir (qui va éclaircir les couleurs sombres afin qu’elles soient mieux visibles) et si vous désirez que le blanc soit neutre. Toutes ces options sont purement visuelles et n’influencent pas les échantillons de test réels.

    Autres fonctions

    Si vous générez un nombre quelconque d’échantillons itératifs ainsi que des échantillons d’un canal isolé, gris ou multidimensionnels, vous pouvez ajouter les échantillons de canal isolé, gris ou multidimensionnels lors d’une étape séparée en maintenant la touche majuscule tout en cliquant « Créer la mire de test ». Ceci évite que ces échantillons n’affectent la distribution itérative des échantillons, avec l’inconvénient de rendre la distribution moins régulière. Ceci est une fonctionnalité expérimentale.

    Vous pouvez aussi :

    • Exporter les échantillons sous forme de fichiers CSV, TIFF, PNG ou DPX, et définir le nombre de fois que l’échantillon doit être répété lors de l’exportation sous forme d’images après avoir cliqué le bouton « Exporter » (les échantillons noirs seront répétés selon la valeur « Max », et les échantillons blancs selon la valeur « Min », et les échantillons se trouvant entre les deux, selon leur clarté dans L* redimensionnée proportionnellement à une valeur comprise entre « Min » et « Max ») ;
    • Ajouter des balayages de saturation qui sont souvent utilisés dans un contexte vidéo ou de film pour vérifier la saturation des couleurs. Un profil de préconditionnement doit être utilisé pour l’activer ;
    • Ajouter des échantillons de référence depuis des fichiers de mesure au format CGATS, à partir de profils de couleur ICC nommés, ou en analysant des images TIFF, JPEG ou PNG. Un profil de préconditionnement doit être utilisé pour activer ceci ;
    • Trier les échantillons selon divers critères de couleur (attention : ceci va interférer avec l’optimisation de l’ordre des échantillons d’ArgyllCMS 1.6.0 ou plus récent qui minimise les temps de mesure, donc le tri manuel ne devrait être utilisé que pour l’inspection visuelle de mires de test, ou s’il est nécessaire pour optimiser l’ordre des échantillons pour les mesures non connectées en mode automatique où il est utile de maximiser la différence de clarté d’un échantillon à l’autre de manière à ce que ce soit plus facile pour l’automatisme de détecter les changements).

    Éditeur d’échantillons

    Les commandes de l’éditeur d’échantillons ayant un comportement de feuille de calculs sont les suivantes :

    • Pour sélectionner les échantillons, cliquez et glisser la souris sur les cellules de la table, ou maintenez la touche Majuscules (sélection de plage) ou Ctrl/Cmd (pour ajouter ou supprimer une seule cellule ou ligne à ou de la sélection) ;
    • Pour ajouter un échantillon sous un de ceux qui existent, faites un double-clic sur l’étiquette d’une ligne ;
    • Pour supprimer des échantillons, sélectionnez-les, ensuite maintenez la touche Ctrl (Linux, Windows) ou Cmd (Mac OS X) et pressez la touche Suppr ou retour arrière (qui supprimera toujours l’ensemble de la ligne même si une seule cellule est sélectionnée) ;
    • Ctrl-c/Ctrl-v/Ctrl-a = copier/coller/tout sélectionner.

    Si vous désirez insérer un certain nombre d’échantillons générés dans une application de feuille de calculs (en tant que coordonnées RVB dans la plage 0.0-100.0 par canal), la manière la plus simple de le faire et de les enregistrer en tant que fichier CSV et de les glisser-déposer sur la fenêtre de l’éditeur de mire de test pour l’importer.

    Nom du profil

    Tant que vous n’entrez pas votre propre texte ici, le nom du profil est généré automatiquement à partir des options d’étalonnage et de caractérisation choisies. Le mécanisme de nommage automatique crée des noms assez longs qui ne sont pas nécessairement agréables à lire, mais ils peuvent vous aider à identifier le profil.
    Notez aussi que le nom du profil n’est pas seulement utilisé pour le profil résultant mais aussi pour tous les fichiers intermédiaires (les extensions de nom de fichier sont automatiquement ajoutées) et tous les fichiers sont stockés dans un répertoire portant ce nom. Vous pouvez choisir l’emplacement où sera créé ce dossier en cliquant l’icône en forme de disque située près du champ (sa valeur par défaut est l’emplacement par défaut des données de l’utilisateur).

    Voici un exemple sous Linux, sur d’autres plate-formes, certaines extensions de fichiers et l’emplacement du répertoire personnel seront différents. Voir emplacements des données de l’utilisateur et du fichier de configuration. Vous pouvez placer le curseur de la souris sur les noms de fichiers afin d’obtenir une bulle d’aide contenant une courte description du rôle de ce fichier :

    Chemin d’enregistrement du profil choisi :~/.local/share/${APPNAME}/storage

    Nom du profil : mydisplay

    Le répertoire suivant sera créé : ~/.local/share/${APPNAME}/storage/mydisplay

    Lors de l’étalonnage et de la caractérisation, les fichiers suivants seront créés :

    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs ClayRGB1998.log
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs ClayRGB1998.wrz
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs sRGB.log
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs sRGB.wrz
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.cal
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.gam.gz
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.icc
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.log
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.ti1
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.ti3
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.wrz

    Tous les fichiers de correction du colorimètre seront aussi copiés dans le dossier du profil.

    Étalonnage / caractérisation

    Si la différence entre étalonnage et caractérisation n’est pas claire pour vous, voir « Calibration vs. Characterization [en] (« Étalonnage comparé à Caractérisation ») dans la documentation d’ArgyllCMS.

    Veuillez laisser l’écran se stabiliser pendant au moins une demi-heure après l’avoir allumé avant de commencer les mesures ou d’estimer ses propriétés de couleur. Pendant ce temps, vous pouvez utiliser normalement l’écran avec d’autres applications.

    Après avoir défini vos options, cliquez le bouton en bas pour démarrer le processus réel d’étalonnage et de caractérisation. La fenêtre principale sera masquée pendant les mesures, et devrait revenir une fois qu’elles sont terminées (ou après une erreur). Vous pouvez toujours annuler une mesure en cours en utilisant le bouton « Annuler » dans le dialogue d’avancement, ou en pressant Échap ou Q. L’examen de la fenêtre du journal d’information (depuis le menu « Outils ») après les mesures vous donnera accès aux données brutes de sortie des outils en ligne de commandes d’ArgyllCMS et d’autres informations « bavardes ».

    Régler l’écran avant l’étalonnage

    Si vous cliquez « Étalonner » ou « Étalonner et Caractériser » et que vous n’avez pas décoché « Réglage interactif de l’écran », une fenêtre interactive d’ajustement de l’écran vous sera présentée dont certaines options sont destinées à vous aider à amener les caractéristiques de l’écran au plus proche des valeurs-cibles choisies. Selon que vous avez un écran de type « À rafraîchissement » ou de type LCD, je vais tenter de vous donner ici quelques recommandations concernant les options à ajuster et celle que vous pouvez passer.

    Régler un écran LCD

    Pour les écrans LCD, dans la plupart des cas, vous ne pourrez ajuster que le point blanc (si l’écran a un gain RVB ou d’autres contrôles du point blanc) et le niveau de blanc (le niveau de blanc affecte aussi celui de noir à moins que vous n’ayez un modèle avec une atténuation locale des LED), comme il manque à de nombreux LCD le « décalage » nécessaire pour ajuster le point noir (et même s’ils l’ont, il modifie souvent la température de couleur globale et pas uniquement le point noir). Remarquez aussi que sur la plupart des écrans LCD vous devriez laisser la commande de « contraste » à sa valeur par défaut (d’usine).

    Point blanc
    Si votre écran possède des commandes de gain RVB, de température de couleur ou de point blanc, la première étape doit être d’ajuster le point blanc. Notez que vous pouvez aussi tirer profit de ces réglages si vous avez défini le point blanc-cible à « natif ». Ceci vous permet de le rapprocher davantage du locus de la lumière du jour ou du corps noir, ce qui peut aider le système visuel humain à mieux s’adapter au point blanc. Regardez les barres affichées lors des mesures pour ajuster les gains RVB et minimiser le delta E avec le point blanc-cible.
    Niveau du blanc
    Poursuivez avec le réglage du niveau du blanc. Si vous avez défini un point blanc-cible, vous pouvez réduire la luminosité de votre écran (idéalement en n’utilisant que le rétroéclairage) jusqu’à ce que la valeur désirée soit atteinte (c’est-à-dire que la barre se termine à la position centrale indiquée). Si vous n’avez pas défini de cible, réglez simplement l’écran pour obtenir une luminosité visuellement agréable qui ne fatigue pas l’œil.
    Régler un écran « à rafraîchissement » tel qu’un CRT ou un Plasma
    Niveau du noir
    Sur les écrans de type « à rafraîchissement », ce réglage est habituellement effectué à l’aide de la commande de « luminosité ». Vous pouvez augmenter ou réduire la luminosité de l’écran jusqu’à ce que le niveau de noir désiré soit atteint (c’est-à-dire que la barre se termine à la position centrale indiquée).
    Point blanc
    L’étape suivante est le réglage du point blanc, en utilisant les commandes de gain RVB de l’écran ou d’autres moyens d’ajuster le point blanc. Notez que vous pouvez aussi tirer profit de ces réglages si vous avez défini le point blanc-cible à « natif ». Ceci vous permet de le rapprocher davantage du locus de la lumière du jour ou du corps noir, ce qui peut aider le système visuel humain à mieux s’adapter au point blanc. Regardez les barres affichées lors des mesures pour ajuster les gains RVB et minimiser le delta E avec le point blanc-cible.
    Niveau du blanc
    Poursuivre avec le réglage du niveau du blanc. Sur les écrans de type « à rafraîchissement », ceci est généralement effectué à l’aide de la commande de « contraste ». Si vous avez défini un point blanc-cible, vous pouvez réduire ou augmenter le contraste jusqu’à ce que la valeur désirée soit atteinte (c’est-à-dire que la barre atteigne la position centrale indiquée). Si vous n’avez pas défini de cible, ajustez simplement l’écran à un niveau visuellement agréable qui ne provoque pas de fatigue oculaire.
    Point noir
    Si votre écran possède des réglages de décalage RVB, vous pouvez aussi régler le point noir à peu près de la même manière que vous avez réglé le point blanc.
    Terminer les réglages et démarrer l’étalonnage et la caractérisation

    Enfin, sélectionner « Poursuivre avec l’étalonnage et la caractérisation » pour lancer la partie non interactive. Vous pouvez aller prendre un café ou deux, car le processus prend pas mal de temps, particulièrement si vous avez sélectionné un niveau de qualité élevé. Si vous ne désiriez qu’avoir une aide pour régler l’écran et ne désirez pas ou n’avez pas besoin de créer les courbes d’étalonnage, vous pouvez choisir de quitter en fermant la fenêtre des réglages interactifs et en sélectionnant « Caractériser uniquement » depuis la fenêtre principale.
    Si vous aviez initialement choisi « Étalonner et caractériser » et que vous satisfaisiez aux exigences de l’étalonnage et de la caractérisation sans intervention, les mesures de caractérisation du processus de caractérisation devraient démarrer automatiquement une fois l’étalonnage terminé. Sinon, vous serez obligé d’enlever la sonde de mesure de l’écran afin de réaliser un auto-étalonnage du capteur de la sonde avant de lancer les mesures de caractérisation.

    Optimisation des mires de test pour améliorer la précision et l’efficacité de la caractérisation

    La manière la plus facile d’utiliser une mire de test optimisée pour la caractérisation est de définir la mire de test à « Auto » et d’ajuster le curseur du nombre d’échantillons au nombre d’échantillons désiré. L’optimisation sera effectuée automatiquement lors des mesures de caractérisation (ceci augmentera d’une certaine valeur les temps de mesure et de traitement).
    Vous pouvez aussi, si vous le désirez, générer vous-même une mire optimisée avant un nouveau processus de caractérisation, ce qui peut se faire de la manière suivante :

    • Prendre un profil d’écran précédent et le sélectionner depuis « Paramètres » ;
    • Sélectionner l’une des mires optimisées (« optimisée pour… ») de la dimension désirée afin de l’utiliser comme base et appeler l’éditeur de mire de test ;
    • Près de « Profil de préconditionnement », cliquer sur « profil actuel ». Il devrait automatiquement choisir le profil que vous aviez choisi précédemment. Placer alors une marque dans la case à cocher. S’assurer que l’adaptation est définie à un niveau élevé (par ex. 100 %) ;
    • Si désiré, ajuster le nombre d’échantillons et s’assurer que le nombre d’échantillons itératifs n’est pas nul ;
    • Créer la mire et la sauvegarder. Cliquer « oui » lorsqu’il vous est demandé de sélectionner la mire venant d’être générée ;
    • Lancer les mesures de caractérisation (par ex ., cliquez « Étalonner et caractériser » ou « Caractériser uniquement »).

    Installer le profil

    Lors de l’installation d’un profil après l’avoir créé ou mis à jour, un élément de démarrage permettant de charger ses courbes d’étalonnage à la connexion sera créé (sous Windows et Linux, Mac OS X n’a pas besoin d’un chargeur). Vous pouvez aussi empêcher ce chargeur de faire quoi que ce soit en supprimant la coche dans la case « Charger les courbes d’étalonnage à la connexion » dans la fenêtre d’installation du profil, et si vous utilisez Windows 7 ou ultérieur, vous pouvez laisser le système d’exploitation gérer le chargement de l’étalonnage (notez que le chargeur interne d’étalonnage de Windows 7 n’offre pas la même qualité que le chargeur de ${APPNAME}/ArgyllCMS en raison d’un redimensionnement proportionnel et d’une quantification erronées).

    Créer des LUT 3D

    Vous pouvez créer, en tant qu’élément du processus de caractérisation, des LUT 3D de correction RGB-in/RGB-out (afin de les utiliser pour la reproduction de vidéo ou avec des applications de retouche ou des appareils qui ne prennent pas ICC en charge).

    Paramètres des LUT 3D

    Créer une LUT 3D après la caractérisation
    Après la caractérisation, il vous sera normalement proposé d’installer le profil pour le rendre disponible aux applications bénéficiant d’une gestion ICC de la couleur. Si cette case est cochée, vous aurez plutôt la possibilité de créer une LUT 3D (avec les paramètres choisis), et les paramètres de la LUT 3D seront aussi enregistrés dans le profil de manière à ce qu’ils puissent être facilement restaurés, si nécessaire, en sélectionnant le profil depuis « Paramètres ». Si cette case n’est pas cochée, vous pouvez créer une LUT 3D depuis un profil existant.
    Espace colorimétrique source / profil source
    Ceci définit l’espace colorimétrique source de la LUT 3D. C’est généralement un espace colorimétrique standard destiné à la vidéo tel que celui définir par Rec. 709 ou Rec. 2020.
    Courbe de tonalité
    Ceci permet de prédéfinir une courbe de réponse de tonalité prédéfinie ou personnalisée pour la LUT 3D. Les paramètres prédéfinis sont Rec. 1886 (décalage d’entrée) et Gamma 2.2 (décalage de sortie, fonction puissance pure).
    Appliquer l’étalonnage (vcgt) (n’est visible que si « Afficher les options avancées » dans le menu « Options » est activé)
    Appliquer la LUT 1D d’étalonnage du profil (si elle existe) à la LUT 3D. Normalement, ceci devrait toujours être activé si le profil comporte une LUT 1D non linéaire de l’étalonnage sinon, vous devez vous assurer que l’étalonnage 1D est chargé même si la LUT 3D est utilisée.
    Mode de transposition du gamut (uniquement visible si « Afficher les options avancées » du menu « Options » est activé)
    Le mode par défaut de transposition du gamut est « périphérique-vers-PCS inverse » ce qui donne les résultats les plus précis. Dans le cas où l’on utilise un profil ayant des tables PCS-vers-périphérique assez hautes, l’option « PCS-vers-périphérique » est aussi sélectionnable, ce qui permet la génération plus rapide de la LUT 3D, mais ceci est parfois moins précis.
    Intention de rendu
    • « Colorimétrie absolue » est prévue pour reproduire les couleurs de manière exacte. Les couleurs hors gamut seront écrêtées à la valeur correspondante la plus proche possible. Le point blanc de destination sera modifié afin de correspondre si possible au point blanc source, ce qui peut avoir pour conséquence de l’écrêter s’il se trouve hors gamut ;
    • « Apparence absolue » transpose les couleurs de la source vers la destination en essayant de faire correspondre le plus exactement possible l’apparence des couleurs, mais elle peut ne pas transposer exactement le point blanc. Les couleurs hors gamut seront écrêtées à la valeur correspondante la plus proche possible ;
    • « Colorimétrie absolue avec adaptation du point blanc » se comporte presque exactement comme « Colorimétrie absolue » mais réduit proportionnellement l’espace colorimétrique de la source afin de s’assurer que le point blanc n’est pas écrêté ;
    • « Apparence avec correspondance de luminance » compresse linéairement ou étend l’axe de luminance du blanc au noir afin de faire correspondre la source à l’espace colorimétrique de destination, sans altérer autrement le gamut, les couleurs hors gamut sont écrêtées à la valeur de plus proche correspondance. Le point blanc de destination n’est pas modifié afin de correspondre au point blanc source ;
    • « Perceptuelle » utilise une compression en trois dimensions afin que le gamut source s’ajuste au gamut de destination. Autant que possible, l’écrêtage est évité, les teintes et l’apparence globale sont conservées. Le point blanc de destination n’est pas modifié afin de correspondre au point blanc source. Cette intention est utile si le gamut de destination est moins étendu que le gamut source ;
    • « Apparence perceptuelle » utilise une compression en trois dimensions afin que le gamut source s’ajuste au gamut de destination. Autant que possible, l’écrêtage est évité, les teintes et l’apparence globale sont conservées. Le point blanc de destination est modifié afin de correspondre au point blanc source. Cette intention est utile si le gamut de destination est moins étendu que le gamut source ;
    • « Perceptuelle préservant la luminance » (ArgyllCMS 1.8.3+) utilise une compression pour que le gamut source s’ajuste au gamut de destination, mais pondère très fortement la préservation de la valeur de la luminance de la source, ce qui compromet la préservation de la saturation. Aucune accentuation su contraste n’est utilisée si la plage dynamique est réduite. Cette intention peut être utilisée lorsque la préservation des distinctions de tonalité dans les images est plus importante que de conserver la couleur (« colorfulness ») ou le contraste global.
    • « Préserver la saturation » utilise une compression et une expansion en trois dimensions afin d’essayer de faire correspondre le gamut de la source au gamut de destination, et aussi de favoriser les saturations les plus élevées par rapport à la conservation de la teinte ou de la clarté. Le point blanc de destination n’est pas modifié afin de correspondre au point blanc source ;
    • « Colorimétrie relative » est prévue pour reproduire exactement les couleurs, mais par rapport au point blanc de destination qui ne sera pas modifié afin de correspondre au point blanc source. Les couleurs hors gamut seront écrêtées à la valeur correspondante la plus proche. Cette intention est utile si vous avez un écran étalonné pour un point blanc personnalisé que vous désirez conserver ;
    • « Saturation » utilise la même transposition du gamut que « Préserver la saturation », mais elle augmente légèrement la saturation dans les zones du gamut fortement saturées.
    Format de fichier des tables de correspondance 3D
    Définit le format de sortie de la LUT 3D. Les formats actuellement pris en charge sont Autodesk/Kodak (.3dl), Iridas (.cube), eeColor (.txt), madVR (.3dlut), Pandora (.mga), Portable Network Graphic (.png), ReShade (.png, .fx) et Sony Imageworks (.spi3d). Notez qu’un profil ICC de lien de périphérique (l’équivalent ICC d’une LUT 3D RGB-in/RGB-out) est toujours conjointement créé.
    Encodage d’entrée/sortie
    Certains formats de LUT 3D vous permettent de définir l’encodage d’entrée/sortie. Notez que dans la plupart des cas, des valeurs par défaut raisonnables seront choisies en fonction du format de LUT 3D sélectionné, mais que cela peut être spécifique à une application ou à un flux de production.
    Profondeur des couleurs d’entrée/sortie
    Certains formats de LUT 3D vous permettent de définir l’encodage d’entrée/sortie. Notez que dans la plupart des cas, des valeurs par défaut raisonnables seront choisies en fonction du format de LUT 3D sélectionné, mais que cela peut être spécifique à une application ou à un flux de production.

    Installer les LUT 3D

    Selon format de fichier de la LUT 3D, il peut être nécessaire de l’installer ou de l’enregistrer vers un emplacement spécifique avant qu’elle ne puisse être utilisée. Il vous sera demandé d’installer ou d’enregistrer la LUT 3D juste après qu’elle a été créée. Si, plus tard, vous devez de nouveau installer ou enregistrer la LUT 3D, allez à l’onglet « LUT 3D » et cliquez le petit bouton « Installer la LUT 3D » situé à côté de la fenêtre déroulante « Paramètres » (c’est le même bouton que celui qui installe les profils d’écrans lorsque vous êtes sur l’onglet « Écran et sonde de mesure » et qu’un écran directement connecté est sélectionné).

    Installer des LUT 3D pour ReShade injector

    D’abord, vous devez installer ReShade. Suivez les instructions d’installation dans le fichier README de ReShade. Installez ensuite la LUT 3D depuis ${APPNAME} vers le même dossier où vous avez préalablement installé/copié ReShade et les fichiers associés. La touche permettant de basculer la LUT 3D d’active à inactive est la touche HOME. Vous pouvez changer cette touche ou désactiver complètement la LUT 3D LUT en éditant (avec un éditeur de texte) le fichier ColorLookUpTable.fx. Pour supprimer complètement la LUT 3D, supprimez ColorLookUpTable.png et ColorLookUpTable.fx, éditez aussi ReShade.fx et supprimez la ligne #include "ColorLookupTable.fx" qui se trouve près de la fin.

    Vérification et rapport de mesures

    Vous pouvez faire des mesures de vérification afin d’évaluer l’adaptation de la chaîne d’affichage (profil d’écran – carte vidéo et les courbes d’étalonnage chargées dans sa table de gamma – écran) aux données mesurées, ou pour évaluer les capacités d’épreuvage à l’écran de la chaîne d’affichage.

    Pour effectuer ce qui précède, vous devez sélectionner une mire de test CGATS[1] contenant les nombres du périphérique (RVB). Les valeurs mesurées sont alors comparées aux valeurs obtenues en fournissant les nombres RVB du périphérique par l’intermédiaire du profil d’écran (valeurs mesurées par rapport aux valeurs attendues). La mire de vérification par défaut comporte 26 échantillons et peut être utilisée, par exemple, pour vérifier si un écran a besoin d’être re-caractérisé . Si vous mesurez une mire de test avec des échantillons gris (R=V=B), comme c’est le cas de la mire par défaut et des mires de vérification étendues, vous avez aussi la possibilité, en plaçant une coche dans la case correspondante du rapport, d’évaluer l’équilibre du gris au travers du seul étalonnage.

    Pour effectuer la vérification des possibilités d’épreuvage à l’écran, vous devez fournir un fichier de référence CGATS contenant des données XYZ ou L*a*b*, ou une combinaison de profil de simulation et de mire de test, qui sera passée au profil de l’écran afin de rechercher les valeurs (RVB) correspondantes du périphérique, et ensuite envoyées à l’écran et mesurées. Ensuite, les valeurs mesurées sont comparées aux valeurs originales XYZ ou L*a*b*, ce qui peut donner une information sur l’adaptation (ou l’inadaptation) de l’écran pour l’épreuvage vers l’espace colorimétrique indiqué par la référence.

    Le profil destiné à être évalué peut être librement choisi. Vous pouvez le choisir dans la fenêtre principale de ${APPNAME} dans « Paramètres ». Les fichiers de rapport générés après les mesures de vérification sont en pur HTML avec une intégration de JavaScript et sont autonomes. Ils comportent aussi la référence et les données de mesures qui sont les valeurs RVB de l’appareil, les valeurs XYZ d’origine mesurées, et les valeurs L*a*b* adaptées à D50 à partir des valeurs XYZ. Ils peuvent être examinés sous forme de texte pur directement depuis le rapport en cliquant un bouton.

    Comment faire – Scénarios courants

    Sélectionnez le profil que vous désirez évaluer dans « Paramètres » (pour l’évaluation de profils à LUT 3D et les profils de lien de périphérique, ce paramètre est important pour une courbe de réponse de tonalité Rec. 1886 ou de gamma personnalisé, parce qu’ils dépendent du niveau de noir).

    Il existe deux jeux de mires de vérification par défaut, de tailles différentes, l’un pour une utilisation générale et l’autre pour la vidéo Rec. 709. Les versions « small » et « étendue » peuvent être utilisées pour une vérification rapide à modérée afin de voir si un écran doit être re-caractérisé, ou si les profils/LUT 3D utilisés sont suffisamment bon pour commencer. Les versions « large » et « xl » peuvent être utilisées pour une vérification plus approfondie. Vous pouvez aussi créer vos propres mires de vérification personnalisées à l’aide de l’éditeur de mires de test.

    Vérification de la précision d’un profil d’écran (évaluation de la bonne aptitude du profil à caractériser l’écran)

    Dans ce cas, vous utiliserez une mire de test avec les valeurs RVB du périphérique sans profil de simulation. Sélectionnez un fichier adapté dans « mire de test ou référence » et désactivez « profil de simulation ». Les autres paramètres, qui ne s’appliquent pas dans ce cas, sont grisés.

    Vérification du niveau d’aptitude d’un écran à simuler un autre espace colorimétrique (évaluation des possibilités d’épreuvage à l’écran, des performances des LUT 3D, des profils de lien de périphérique (« DeviceLink ») ou natives de l’écran)

    Il y a deux manières de le faire :

    • Utiliser un fichier de référence avec les valeurs cibles XYZ ou L*a*b* ;
    • ou utiliser une combinaison d’une mire de test avec les valeurs RVB ou CMJN du périphérique et d’un profil de simulation RVB ou CMJN (pour une mire de test RVB, ceci ne vous permettra uniquement d’utiliser un profil de simulation RVB et inversement. De même, une mire de test CMJN doit être utilisée avec un profil de simulation CMJN).

    Vous avez alors quelques options qui influencent la simulation :

    • Simulation du point blanc. Si vous utilisez un fichier de référence qui contient le blanc du périphérique (RVB 100 % ou CMJN 0%), ou si vous utilisez une combinaison d’une mire de test et d’un profil de simulation, alors vous pouvez choisir si vous désirez une simulation du point blanc de la référence ou du profil de simulation, et dans ce cas, si vous désirez que le point blanc simulé soit relatif au point blanc du profil-cible. Pour expliquer cette dernière option : supposons qu’une référence possède un point blanc qui soit légèrement bleuâtre (comparé à D50), et que le profil-cible ait un point blanc qui soit davantage bleuâtre (par rapport à D50). Si vous ne choisissez pas de simuler le blanc de référence par rapport au point blanc du profil-cible et que le gamut du profil est suffisamment large et précis pour accepter le blanc de référence, alors c’est exactement ce que vous obtiendrez. En fonction du niveau d’adaptation de vos yeux cependant, il peut être raisonnable de supposer que vous êtes dans une large mesure adapté au point blanc du profil-cible (en supposant qu’il soit valable pour un périphérique), et le point blanc simulé semblera un peu jaunâtre comparé au point blanc du profil-cible. Dans ce cas, choisir de simuler le point blanc par rapport à celui du profil-cible peut vous procurer une meilleure correspondance visuelle par exemple lors d’un scénario d’épreuvage à l’écran comparé à une épreuve imprimée sous un certain illuminant, qui est proche mais pas tout à fait D50, et que le point blanc de l’écran a été accordé à cet illuminant. Il va « ajouter » le point blanc simulé « en haut » du point blanc du profil-cible. Donc, dans notre exemple, le point blanc simulé sera encore plus bleuâtre que celui du profil-cible seul.
    • L’utilisation du profil de simulation comme profil-cible va remplacer le profil défini dans « Paramètres ». La simulation du point blanc ne s’applique pas ici parce que la gestion des couleurs ne sera pas utilisée et que le périphérique d’affichage est supposé être dans l’état décrit par le profil de simulation. Ceci peut être effectué de plusieurs façons, par exemple, l’écran peut être étalonné de manière interne ou externe, par une LUT 3D ou par un profil de lien de périphérique. Si ce paramètre est activé, quelques autres options seront disponibles :
      • Activer la LUT 3D (si vous utilisez le périphérique d’affichage madVR/madTPG sous Windows). Ceci vous permet de vérifier l’efficacité avec laquelle une LUT 3D de madVR transforme l’espace colorimétrique de simulation vers l’espace colorimétrique de l’écran. Notez que ce paramètre ne peut pas être utilisé conjointement à un profil ce liens de périphérique (« DeviceLink »).
      • Profil de lien de périphérique (« DeviceLink »). Ceci vous permet de vérifier la qualité de la transformation par un lien de périphérique de la simulation de l’espace colorimétrique vers l’espace colorimétrique de l’écran. Remarquez que ce paramètre ne peut pas être utilisé conjointement avec le paramètre « Activer la LUT 3D de madVR ».
    • Courbe de réponse de tonalité. Si vous évaluez une LUT 3D ou un profil de lien de périphérique (« DeviceLink »), choisissez ici les mêmes paramètres que lors de la création de la LUT 3D / lien de périphérique (et assurez-vous aussi que le même profil-cible soit défini, parce qu’il est utilisé pour transposer le point noir).
      Pour vérifier un écran qui n’a pas de profil associé (par ex. « Non connecté »), définissez la courbe de tonalité à « Non modifiée ». Au cas où vous voudriez plutôt faire la vérification en comparaison avec une courbe de réponse de tonalité différente, vous devrez créer un profil synthétique spécifique à cette utilisation (menu « Outils »).

    Comment les valeurs nominales et les valeurs-cibles recommandées sont-elles choisies ?

    Les tolérances nominales, avec les valeurs-cibles du point blanc, de la valeur moyenne, du maximum et du Delta E de l’équilibre du gris de la CIE 1976 qui découlent d’UGRA/Fogra Media Wedge et d’UDACT, sont assez généreuses, j’ai donc inclus des valeurs « recommandées » un peu plus strictes que j’ai choisies plus ou moins arbitrairement afin de procurer un peu de « marge de sécurité supplémentaire ».

    Pour les rapports générés depuis les fichiers de référence qui contiennent des valeurs CMJN en plus des valeurs L*a*b* ou XYZ, vous pouvez aussi sélectionner les valeurs-cibles officielles de Fogra Media Wedge V3 ou IDEAlliance Control Strip pour du papier blanc, CMJN solides et CMJ gris, si la mire contient les bonnes combinaisons CMJN.

    Comment les résultats du rapport de vérification du profil doivent-ils être interprétés ?

    Ceci dépend de la mire qui a été mesurée. L’explication dans le sommaire du premier paragraphe est assez bonne : si vous avez étalonné et caractérisé votre écran, et que vous désirez vérifier l’adaptation du profil à un ensemble de mesures (précision du profil), ou si vous désirez savoir si votre écran a dérivé et a besoin d’être ré-étalonné/re-caractérisé, vous sélectionnez une mire qui contient les nombres RVB pour la vérification. Remarquez que, juste après la caractérisation, on peut s’attendre à avoir une précision élevée si le profil caractérise bien l’écran, ce qui est habituellement le cas si l’écran ne manque pas trop de linéarité. Dans ce cas, il peut être intéressant de créer un profil basé sur une LUT plutôt qu’avec « courbes et matrice », ou d’augmenter le nombre d’échantillons mesurées pour les profils basés sur une LUT.

    Si vous désirez connaître l’adéquation de votre profil à simuler un autre espace colorimétrique (épreuvage à l’écran), sélectionnez un fichier de référence avec des valeurs L*a*b* ou XYZ, comme l’un des sous-ensembles de Fogra Media Wedge, ou une combinaison d’un profil de simulation et d’une mire de test. Faites attention cependant, seuls les écrans à gamut large pourront suffisamment bien prendre en charge un espace colorimétrique large destiné à l’impression offset tel que FOGRA39 ou similaire.

    Dans les deux cas, vous devriez au moins vérifier que les tolérances nominales ne sont pas dépassées. Pour avoir un peu de « marge de sécurité supplémentaire », voyez plutôt les valeurs recommandées.

    Remarquez que les deux tests sont en « boucle fermée » et ne vous donneront pas la vérité « absolue » en termes de « qualité de la couleur » ou de « précision de la couleur » car ils ne peuvent pas vous indiquer si votre sonde est défectueuse ou si les mesures sont erronées (un profil créé avec des mesures répétitivement fausses donnera une vérification correcte avec d’autres mesures erronées provenant de la même sonde si elles ne fluctuent pas trop) ou si elles ne correspondent pas bien à votre écran (ce qui est particulièrement vrai pour les colorimètres avec les écrans à gamut large, car de telles combinaisons demandent une correction matérielle ou logicielle afin d’obtenir des résultats précis – ce problème n’existe pas avec les spectromètres, qui n’ont pas besoin de correction pour les gamuts larges. Mais on a récemment découvert qu’ils avaient des problèmes pour mesurer correctement la luminosité de certains rétroéclairages à LED d’écrans utilisant des LED blanches), ou si les couleurs de votre écran correspondent à un objet réel situé à proximité (comme un tirage photographique). Il est parfaitement possible d’obtenir de bons résultats de vérification mais avec des performances visuelles réelles déficientes. Il est toujours sage de combiner de telles mesures avec un test de l’apparence visuelle d’une référence « reconnue comme étant bonne », comme un tirage ou une épreuve (bien qu’on ne doive pas oublier que celles-ci ont aussi des tolérances, et l’éclairement joue aussi un rôle important lorsqu’on évalue des résultats visuels). Gardez cela en mémoire lorsque vous admirez les résultats de la vérification (ou que vous vous arrachez les cheveux) :)

    Comment les profils sont-ils évalués au regard des valeurs mesurées ?

    Différents logiciels utilisent différentes méthodes (qui ne sont pas toujours divulguées en détail) pour comparer et vérifier les mesures. Cette section a pour but de donner aux utilisateurs intéressés une meilleure appréciation de la manière de fonctionner « sous le capot » de la vérification des profils de ${APPNAME}.

    Comment une mire de test ou un fichier de référence est-il utilisé ?

    Il y a actuellement deux voies légèrement différentes selon qu’on utilise la mire de test ou le fichier de référence pour les mesures de vérification, comme cela est précisé ci-dessus. L’utilitaire xicclu d’Argyll tourne en coulisses et les valeurs de la mire de test ou du fichier de référence sont passées au travers du profil en cours de test soit colorimétrie relative (si aucune simulation de point blanc n’est utilisée), soit en colorimétrie absolue (si une simulation de point blanc est utilisée) afin d’obtenir les valeurs L*a*b* (dans le cas de mires de test RVB) ou les valeurs RVB de périphérique (dans le cas de fichiers de référence XYZ ou L*a*b*, ou d’une combinaison d’un profil de simulation et d’une mire de test). Si on utilise comme référence une combinaison d’un profil de simulation et d’une mire de référence, les valeurs de référence L*a*b* sont calculées en injectant les valeurs de l’appareil depuis la mire de test au travers du profil de simulation soit en colorimétrie absolue si la simulation du point blanc est activée (ce qui est le cas par défaut si le profil de simulation est un profil d’imprimante), soit en colorimétrie relative si la simulation du point blanc désactivée (ce qui est le cas par défaut si le profil de simulation est un profil d’écran, comme avec la plupart des espaces de travail RVB). Les valeurs RVB d’origine venant de la mire de test, ou les valeurs RVB extraites dans le cas d’une référence sont ensuite envoyées à l’écran au travers des courbes d’étalonnage du profil en cours d’évaluation. Si on utilise « simuler le point blanc en fonction du point du profil-cible », on suppose un blanc de référence D50 (valeur par défaut d’ICC) et que l’observateur est complètement adapté chromatiquement au point blanc de l’écran. Les valeurs XYZ mesurées sont donc adaptées à D50 (avec le point blanc mesuré comme blanc de référence de la source) en utilisant la transformée de Bradford (voir Chromatic Adaption sur le site web de Bruce pour la formule et la matrice utilisées par ${APPNAME}) ou la matrice d’adaptation du profil dans le cas de profils possédant la balise d’adaptation chromatique 'chad', et converties en L*a*b*. Les valeurs L*a*b* sont alors comparées par le rapport dynamique généré, avec un critère sélectionnable par l’utilisateur et une formule de ΔE (delta E).

    Comment le ΔE entre le point blanc supposé et celui qui est mesuré est-il calculé ?

    Dans un rapport, la température de couleur corrélée et le point blanc-cible supposé, ainsi que le ΔE du point blanc, demandent des explications supplémentaires : le ΔE du point blanc est calculé comme étant la différence entre le point blanc mesuré et les valeurs XYZ normalisées du point blanc-cible supposé, qui sont d’abord converties en L*a*b*. La température de couleur affichée du point blanc-cible supposé est simplement la température de couleur corrélée arrondie (seuil de 100K) calculée à partir des valeurs XYZ mesurées. Les valeurs XYZ du point blanc-cible supposé sont obtenues en calculant les coordonnées de chromaticité (xy) d’un illuminant CIE D (lumière du jour) ou du corps noir ayant cette température de couleur et en les convertissant vers XYZ. Vous trouverez toutes les formules utilisées sur le site web de Bruce Lindbloom et sur Wikipédia [en].

    Comment la « plage » d’équilibre du gris est-elle évaluée ?

    La « plage » d’équilibre du gris utilise l’écart absolu combiné entre Δa et Δb (par ex. si max Δa = -0.5 et max Δ = 0.7, la plage est de 1.2). Comme les résultats dans les valeurs sombres extrêmes peuvent être problématiques en raison du manque de précision de la sonde de mesure et d’autres effets comme un point noir ayant une chromaticité différente de celle du point blanc, la vérification de l’équilibre du gris dans ${APPNAME} ne prend en compte que les échantillons gris ayant une luminance minimum de 1 % (c’est-à-dire que si la luminance du blanc = 120 cd/m², alors, seuls les échantillons d’au moins 1.2 cd/m² seront pris en compte).

    Quelle est l’action réelle de la case à cocher « Evaluate gray balance through calibration only » (« Évaluer l’équilibre du gris uniquement au travers de l’étalonnage ») sur un rapport ?

    Elle définit la valeur nominale (cible) de L* à la valeur de L* mesurée, et a*=b*=0, de manière à ce que le profil soit effectivement ignoré et que seul l’étalonnage (s’il existe) influence les résultats des vérifications de l’équilibre du gris. Notez que cette option ne fera pas de différence pour un profil à « courbe unique » ou « courbe unique + matrice », cas la courbe unique réalise effectivement quelque chose de similaire (les valeurs de L* peuvent être différentes, mais elles sont ignorées pour les vérifications de l’équilibre du gris et n’influencent que le résultat final).

    Fonctionnalité spéciale

    Mesures et caractérisation à distance

    En utilisant ArgyllCMS 1.4.0 et plus récent, il est possible de faire des mesures à distance sur un périphérique qui n’est pas directement connecté à la machine sur laquelle tourne ${APPNAME} (par ex., un smartphone ou une tablette). Le périphérique distant doit être capable de faire tourner un navigateur Web (Firefox est recommandé), et la machine locale sur laquelle tourne ${APPNAME} peut avoir besoin qu’on ajoute ou qu’on modifie des règles de pare-feu afin de permettre les connexions entrantes. Pour configurer la caractérisation à distance, sélectionnez « Web @ localhost » depuis la fenêtre déroulante des périphériques d’affichage, choisissez ensuite l’action désirée (par ex. « Caractérisation uniquement »). Lorsque le message « Serveur Web en attente sur http://<IP>:<Port> » apparaît, ouvrez l’adresse affichée sur le navigateur distant et fixez la sonde de mesure.
    NOTE: si vous utilisez cette méthode pour afficher des échantillons de test, il n’y a pas d’accès aux LUT[7] vidéo de l’écran et un étalonnage matériel n’est pas possible. Les couleurs seront affichées avec une précision de 8 bits par composante, les économiseurs d’écran et d’énergie ne seront pas désactivés automatiquement. Vous serez aussi à la merci de toute gestion de la couleur appliquée par le navigateur internet, et vous devrez soigneusement vérifier et configurer une telle gestion de la couleur
    Note : fermez la fenêtre ou l’onglet du navigateur internet après chaque exécution, sinon la reconnexion pourra échouer lors des exécutions ultérieures.

    Générateur de motifs de test de madVR

    ${APPNAME} depuis la version 1.5.2.5, prend en charge, lorsqu’il est utilisé avec ArgyllCMS 1.6.0 ou plus récent, le générateur de motifs de test de madVR (madTPG) et les formats de LUT 3D de madVR.

    Resolve (10.1+) comme générateur de motifs

    Depuis sa version 2.5, ${APPNAME} peut utiliser Resolve (10.1+) comme générateur de motifs. Sélectionnez l’entrée « Resolve » depuis la fenêtre déroulante des périphériques d’affichage de ${APPNAME} et, dans Resolve lui-même, choisissez « Étalonnage de moniteur », « CalMAN » dans le menu « Couleur ».

    Mesures d’écran non connecté

    Veuillez noter que le mode non connecté ne devrait normalement être utilisé qu’une fois épuisées toutes les autres options.

    Le mode non connecté est une autre option pour mesurer et caractériser un écran distant qui n’est pas connecté par un moyen standard (l’étalonnage n’est pas pris en charge). Pour utiliser le mode non connecté, la mire de test utilisée doit être optimisée. Elle est ensuite exportée sous forme de fichiers image (à l’aide de l’éditeur de mire de test) et ces fichiers d’image doivent être affichés sur le périphérique en cours de mesure dans un ordre successif. La procédure est la suivante :

    • Sélectionnez la mire de test désirée, ouvrez ensuite la mire de test choisie et ouvrez l’éditeur de mire de test ;
    • Sélectionnez « Optimiser pour non connecté en mode automatique » depuis la fenêtre déroulante des options de tri, cliquez « Appliquer » et exportez la mire de test ;
    • Gravez les images sur un DVD, copiez-les sur une clé USB ou n’importe quel autre support disponible afin de les fournir à l’écran devant être mesuré ;
    • Sur la fenêtre déroulante des écrans de ${APPNAME}, sélectionnez « Non connecté » (la dernière option) ;
    • Affichez la première image sur l’écran distant et disposez la sonde. Sélectionnez ensuite « Caractériser uniquement ».

    Les mesures vont commencer et les changements des images affichées devraient être automatiquement détectés si le mode « Auto » est actif. Utilisez un moyen quelconque à votre disposition pour parcourir les images de la première à la dernière, en surveillant soigneusement le processus de mesure et en ne passant à l’image suivante que lorsque l’image en cours a été mesurée avec succès (ce qui sera affiché sur la fenêtre de mesure en mode non connecté). Notez que le mode non connecté sera (au moins) deux fois plus lent que lors des mesures sur un écran normal.

    Fonctionnalité hors de l’interface utilisateur

    Il y a un élément de fonctionnalité qui n’est pas disponible depuis l’interface utilisateur et doivent être lancées depuis l’invite de la ligne de commandes ou dans un terminal. L’utilisation de cette fonctionnalité nécessite actuellement soit 0install, soit de tourner depuis les sources.

    Changer le profil d’affichage et le point blanc d’étalonnage

    Notez que ceci réduit le gamut et la précision du profil.

    Par 0install :

    0install run --command=change-display-profile-cal-whitepoint -- \
      ${HTTPURL}0install/${APPNAME}.xml \
      [-t temp | -T temp | -w x,y] [--cal-only] [profil_entrée] nom_fichier_sortie

    À partir des sources :

    python util/change_display_profile_cal_whitepoint.py- \
      ${HTTPURL}0install/${APPNAME}.xml \
      [-t temp | -T temp | -w x,y] [--cal-only] [profil_entrée] nom_fichier_sortie
    -t temp
    Utiliser la température de couleur de lumière du jour temp comme point blanc-cible.
    -T temp
    Utiliser la température du corps noir temp comme point blanc-cible.
    -w x,y
    Utiliser la chromaticité x,y comme point blanc-cible.
    --cal-only (optionnel)
    Ne modifier que l’étalonnage intégré au profil, pas le profil lui-même.
    profil_entrée (optionnel)
    Utiliser le profil profil_entrée plutôt que le profil de l’écran actuel.
    nom_fichier_sortie
    Nom de fichier du profil en sortie. Le profil modifié sera écrit dans ce fichier.
    Activer le chargement/déchargement de l’étalonnage par Windows 7 ou ultérieur

    Notez que le chargement de l’étalonnage par Windows est de plus basse qualité qu’avec ArgyllCMS parce que Windows effectue toujours une quantification de l’étalonnage sur 8 bits et le redimensionne de manière erronée. Ceci n’est pas le cas en utilisant le chargeur d’étalonnage de ${APPNAME} qui utilise ArgyllCMS.

    Par 0install :

    0install run --command=set-calibration-loading -- \
      ${HTTPURL}0install/${APPNAME}.xml [--os]

    À partir des sources :

    python -c "import sys; from ${APPNAME} import util_win; \
      util_win.calibration_management_isenabled() or \
      util_win.enable_calibration_management() \
      if '--os' in sys.argv[1:] else \
      not util_win.calibration_management_isenabled() or \
      util_win.disable_calibration_management();" [--os]

    L’option --os détermine si la fonctionnalité de chargement de l’étalonnage par Windows doit être activée ou pas.

    « Écriture de scripts »

    ${APPNAME} prend en charge l’écriture de scripts (« scripting ») soit localement, soit par le réseau (ce dernier devant être explicitement activé en définissant app.allow_network_clients = 1 dans ${APPNAME}.ini) via des sockets. ${APPNAME} doit être prêt et en cours de fonctionnement sur la machine-cible pour que ceci fonctionne. Vous trouverez ci-dessous un exemple de connexion à une instance en cours de fonctionnement sur le port par défaut 15411 et le lancement des mesures d’étalonnage (le port peut être configuré dans ${APPNAME}.ini sous app.port, cependant, si le port choisi n’est pas disponible, un port inutilisé sera automatiquement choisi. Vous pouvez lire le port actuellement utilisé dans le fichier ${APPNAME}.lock qui se trouve dans le dossier du fichier de configuration de ${APPNAME} pendant qu’il tourne). L’exemple est écrit en Python et s’occupe aussi de quelques affaires complexes de sockets.

    #!/usr/bin/env python2
    
    import socket
    
    class DCGScriptingClientSocket(socket.socket):
    
    	def __enter__(self):
    		return self
    
    	def __exit__(self, etype, value, tb):
    		# Disconnect
    		try:
    			# Will fail if the socket isn't connected, i.e. if there was an
    			# error during the call to connect()
    			self.shutdown(socket.SHUT_RDWR)
    		except socket.error:
    			pass
    		self.close()
    
    	def __init__(self):
    		socket.socket.__init__(self)
    		self.recv_buffer = ''
    
    	def get_single_response(self):
    		# Buffer received data until EOT (response end marker) and return
    		# single response (additional data will still be in the buffer)
    		while not '\4' in self.recv_buffer:
    			incoming = self.recv(4096)
    			if incoming == '':
    				raise socket.error("Connection broken")
    			self.recv_buffer += incoming
    		end = self.recv_buffer.find('\4')
    		single_response = self.recv_buffer[:end]
    		self.recv_buffer = self.recv_buffer[end + 1:]
    		return single_response
    
    	def send_and_check(self, command, expected_response="ok"):
    		""" Send command, get & check response """
    		self.send_command(command)
    		single_response = self.get_single_response()
    		if single_response != expected_response:
    			# Check application state. If a modal dialog is displayed, choose
    			# the OK option. Note that this is just an example and normally you
    			# should be very careful with this, as it could mean confirming a
    			# potentially destructive operation (e.g. discarding current
    			# settings, overwriting existing files etc).
    			self.send_command('getstate')
    			state = self.get_single_response()
    			if 'Dialog' in state.split()[0]:
    				self.send_command('ok')
    				if self.get_single_response() == expected_response:
    					return
    			raise RuntimeError('%r got unexpected response: %r != %r' %
    							   (command, single_response, expected_response))
    
    	def send_command(self, command):
    		# Automatically append newline (command end marker)
    		self.sendall(command + '\n')
    
    # Generate a list of commands we want to execute in order
    commands = []
    
    # Load “Laptop” preset
    commands.append('load presets/laptop.icc')
    
    # Setup calibration & profiling measurements
    commands.append('calibrate-profile')
    
    # Start actual measurements
    commands.append('measure')
    
    # Create socket & send commands
    with DCGScriptingClientSocket() as client:
    	client.settimeout(3)  # Set a timeout of 3 seconds
    
    	# Open connection
    	client.connect(('127.0.0.1', 15411))  # Default port
    
    	for command in commands:
    		client.send_and_check(command)
    
    

    Chaque commande nécessite d’être terminée par un caractère de fin de ligne (après chaque paramètre pris en compte par la commande). Notez que ces données doivent être envoyées encodées en UTF-8 et que si des paramètres contiennent des espaces, ils doivent être encadrés par des apostrophes simples ou doubles. Vous devriez vérifier la réponse à chacune des commandes envoyées (le marqueur de fin de réponse est ASCII 0x4 EOT, et le format de réponse est un format de texte brut, mais JSON et XML sont aussi disponibles). Les valeurs courantes retournées par les commandes dont soit ok dans le cas où la commande a été comprise (notez que ceci n’indique pas que le traitement de cette commande est terminé), busy ou blocked dans le cas ou la commande a été ignorée parce qu’une autre opération était en cours ou parce qu’une fenêtre modale bloque l’interface utilisateur, failed dans les cas où la commande ou un paramètre de la commande ne peut pas être traité avec succès, forbidden dans le cas où la commande n’était pas autorisée (il peut s’agir d’une condition temporaire selon les circonstances, par ex. lorsqu’on essaie d’interagir avec un élément de l’interface utilisateur qui est actuellement désactivé). invalid dans le cas où la commande (ou l’un de ses paramètres) est invalide, ou error suivi d’un message d’erreur dans le cas d’une exception non gérée. D’autres valeurs de retour sont possibles en fonction de la commande. Toutes les valeurs retournées sont encodées en UTF-8. Si la valeur de retour est blocked (par ex. parce qu’une fenêtre modale est affichée), vous devriez vérifier l’état de l’application avec la commande getstate pour déterminer l’évolution future de cette action.

    Liste des commandes prises en charge

    Vous trouverez ci-dessous une liste des commandes actuellement prises en charge (la liste contient toutes les commandes valable pour l’application principale, les outils autonomes n’en accepteront typiquement qu’un sous-ensemble réduit. Vous pouvez utiliser l’outil autonome « client d’écriture de scripts de ${APPNAME} » pour l’apprendre et expérimenter les commandes). Notez que les paramètres de nom de fichier doivent se référer à des fichiers présents sur la machine-cible sur laquelle tourne ${APPNAME}.

    3DLUT-maker [create nom_fichier]
    Afficher l’onglet de création de LUT 3D, ou créer la LUT 3D nom_fichier.
    abort
    Tenter d’interrompre l’opération en cours d’exécution.
    activate [ID fenêtre ID | nom | étiquette]
    Activer la fenêtre fenêtre ou la fenêtre principale de l’application (qui est ramenée à l’avant). Si elle est minimisée, la restaurer.
    alt | cancel | ok [nom_fichier]
    Si une fenêtre modale est affichée, appeler l’action par défaut (ok), l’action de remplacement (si elle existe), ou interrompez-la. Si une fenêtre de choix de fichier est affichée, utiliser ok nom_fichier permet de choisir ce fichier.
    calibrate
    Configurer les mesure d’étalonnage (notez que ceci ne donnera pas le choix de créer aussi un profil rapide courbes + matrice, si c’est ce que vous désirez, utilisez plutôt interact mainframe calibrate_btn). Pour les écrans autre que virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour commencer les mesures.
    calibrate-profile
    Configurer les mesures d’étalonnage et de caractérisation. Pour les écrans autres que virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour commencer les mesures.
    close [ID fenêtre | nom | étiquette]
    Fermer la fenêtre fenêtre ou la fenêtre actuellement active (si la fenêtre est la fenêtre principale, ceci quitte l’application). Notez que ceci tente d’abord d’interrompre toutes les applications en cours de fonctionnement, vous deviez donc vérifier l’état de l’application à l’aide de la commande getstate.
    create-colorimeter-correction
    create-colorimeter-correction
    Créer une correction de colorimètre.
    create-profile [nom_fichier]
    Créer un profil depuis des mesures existantes (profil ou fichier de mesures).
    curve-viewer [nom_fichier]
    Afficher les courbes, en chargeant de manière optionnelle nom_fichier. Des chemins relatifs sont possibles, par ex. pour les préréglages : curve-viewer presets/photo.icc
    ${APPNAME} [nom_fichier]
    Amener la fenêtre principale à l’avant. Si elle est minimisée, la restaurer. Optionnellement, charger nom_fichier.
    enable-spyder2
    Activer la Spyder 2.
    getactivewindow
    Obtenir la fenêtre actuellement active. Le format retourné est nom_classe ID nom étiquette état. état est soit enabled soit disabled.
    getcellvalues [ID fenêtre | nom | étiquette] <ID mire | nom | étiquette>
    Obtenir les valeurs des cellules de la mire mire de la fenêtre fenêtre ou de la fenêtre actuellement active.
    getappname
    Obtenir le nom de l’application à laquelle vous êtes connecté.
    getcfg [option]
    Obtenir l’option de configuration, ou l’ensemble de la configuration (paires clé-valeur dans le format INI).
    getcommands
    Obtenir la liste des commandes acceptées par cette application.
    getdefault <option>
    Obtenir l’option par défaut (paire clé-valeur dans le format INI).
    getdefaults
    Obtenir toutes les valeurs par défaut (paires clé-valeur dans le format INI).
    getmenus
    Obtenir les menus disponibles dans le format ID "étiquette" état. état est soit enabled soit disabled.
    getmenuitems [position_menu | étiquette]
    Obtenir les éléments de menu disponibles dans le format position_menu "étiquette_menu" ID_élément_menu "étiquette_élément_menu" état [checkable] [checked]. stateposition_menu "étiquette_menu" ID_élément_menu "étiquette_élément_menu" état [checkable] [checked]. état est soit enabled soit disabled.
    getstate
    Obtenir l’état de l’application. La valeur de retour sera soit ide, busy, nom_classe_dialogue ID nom_dialogue [étiquette_dialogue] état "texte_message" [path "chemin"] [buttons "étiquette_bouton"...] si une fenêtre modale est affichée ou blocked dans le cas ou l’interface utilisateur est actuellement bloquée. La plupart des commandes ne fonctionnent pas si l’interface utilisateur est bloquée – la seule manière de résoudre le blocage est d’interagir autrement que par programmation avec les éléments réels de l’interface utilisateur de l’application ou de la fermer. Notez qu’un état blocked ne devrait normalement se produire que si une fenêtre réelle de choix de fichier est affiché. Si on utilise exclusivement l’interface d’écriture de scripts, ceci ne devrait jamais arriver parce qu’il utilise une fenêtre de choix fichier de remplacement qui prend en charge les mêmes actions que qu’une fenêtre réelle de choix de fichier, mais ne bloque pas. Remarquez aussi qu’une valeur de retour de blocked pour toute autre commande signifie uniquement qu’une fenêtre modale est actuellement en attente d’une interaction, ce n’est que si getstate retourne aussi blocked que vous ne pouvez pas résoudre cette situation uniquement par script.
    getuielement [ID fenêtre | nom | étiquette] <ID_élément | nom | étiquette>
    getuielements [ID fenêtre | nom | étiquette]
    Obtenir un simple élément de l’UI ou un liste d’éléments visibles de l’UI de la fenêtre fenêtre ou de la fenêtre actuellement active. Chaque ligne retournée représente un élément d’UI et a le format nom_classe ID nom ["étiquette"] état [checked] [value "valeur"] [items "élément"...]. nom_classe. nom_classe est le nom interne de la classe de la bibliothèque UI. Ceci peut vous aider à déterminer de quel type d’élément il s’agit, et qu’elles sont les interactions qu’il prend en compte. ID est un identifiant numérique. nom est le nom de l’élément de l’UI. "étiquette" (s‘il existe) est une étiquette qui vous apportera une aide supplémentaire dans l’identification de l’élément de l’UI. Vous pouvez utilisez ces trois derniers avec la commande interact. état est soit enabled soit disabled. items "élément"… (s’il existe) est une liste d’éléments connectés à l’élément de l’UI (c’est-à-dire des choix de sélection).
    getvalid
    Obtenir des valeurs valides pour les options ayant des contraintes (paires clé-valeur du format INI). Il y a deux sections, ranges et values. ranges sont les plages valables pour les options qui acceptent des valeurs numériques (notez que les options integer non couvertes par ranges sont typiquement de type boolean). Les values sont des valeurs valables pour les options qui n’acceptent que certaines valeurs. Les options non couvertes par ranges ni values sont limitées à leur type de donnée (vous ne pouvez pas affecter une option numérique à une chaîne de caractères ni l’inverse).
    getwindows
    Obtenir une liste des fenêtres visibles. Le format retourné est une liste de nom_classe ID nom étiquette état. état est soit enabled soit disabled.
    import-colorimeter-corrections [nom_fichier...]
    Importer les corrections du colorimètre.
    install-profile [nom_fichier]
    Installer un profil.
    interact [ID fenêtre | nom | étiquette] <ID élément | nom | étiquette> [setvalue valeur]
    Interagir avec l’élément de l’UI élément de la fenêtre fenêtre ou de la fenêtre actuellement active, par exemple, invoquer un bouton ou définir un contrôle à une valeur.
    invokemenu <position_menu | étiquette_menu> <ID_élément_menu | étiquette_élement_menu>
    Invoquer un élément de menu.
    load <nom_fichier>
    Charger les chemins relatifs sont possibles, par exemple pour les pré-réglages : load presets/photo.icc.
    measure
    Démarrer les mesures (la configuration doit avoir été préalablement faite !).
    measure-uniformity
    Mesurer l’uniformité de l’écran.
    measurement-report [nom_fichier]
    Si aucun nom de fichier n’est indiqué, afficher l’onglet du rapport de mesures. Sinon, configurer les mesures pour créer le rapport HTML nom_fichier. Pour les écrans non virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure ensuite pour commencer les mesures.
    profile
    Définir les mesures de caractérisation (notez que ceci utilisera toujours l’étalonnage en cours, si applicable, si vous désirez plutôt utiliser un étalonnage linéaire, appelez load linear.cal avant d’appeler profile). Pour les écrans non virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour commencer les mesures.
    profile-info [nom_fichier]
    Afficher les informations » du profil, en chargeant optionnellement le profil nom_fichier. Les chemins relatifs sont possibles, par exemple pour les préréglages : profile-info presets/photo.icc
    refresh
    Mettre l’interface graphique à jour après des modifications de configuration par setcfg ou restore-defaults.
    report-calibrated
    Établir un rapport sur l’écran étalonné. Pour les écrans non virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour commencer les mesures.
    report-uncalibrated
    Établir un rapport sur l’écran non étalonné. Pour les écrans non virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour commencer les mesures.
    restore-defaults [catégorie...]
    Restaurer les valeurs par défaut globalement ou uniquement pour catégorie. Appeler refresh après avoir modifié la configuration afin de mettre à jour l’interface graphique.
    setlanguage <code_langue>
    Définir la langue
    setcfg <option> <valeur>
    Définir l’option à valeur. La valeur spéciale null efface une option de configuration. Appeler refresh après avoir modifié la configuration afin de mettre à jour l’interface graphique. Voir aussi getdefaults et getvalid.
    setresponseformat <format>
    Définir le format des réponses. La valeur par défaut plain est un format de texte facile à lire, mais ce n’est pas forcément le meilleur à analyser informatiquement. Les autres formats possibles sont json, json.pretty, xml et xml.pretty. Les formats *.pretty utilisent des sauts de ligne et une indentation ce qui les rend plus faciles à lire.
    synthprofile [nom_fichier]
    Affichez la fenêtre de création d’un profil synthétique, de manière optionnelle, charger le profil nom_fichier.
    testchart-editor [nom_fichier | create nom_fichier]
    Afficher la fenêtre de l’éditeur de mire de test, de manière optionnelle, charger ou créer la mire de test nom_fichier. Des chemins relatifs son possible par exemple, pour charger une mire de test par défaut : testchart-editor ti1/d3-e4-s17-g49-m5-b5-f0.ti1.
    verify-calibration
    Vérifier l’étalonnage. Pour les écrans non virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour lancer les mesures.

    Interagir avec des éléments de l’interface utilisateur

    • Appeler un bouton : interact [fenêtre] <bouton> par ex. afficher les informations des variables de substitution (« placeholders ») du nom de profil : interact mainframe profile_name_info_btn
    • Définir une valeur sur une liste déroulante, un champ de texte ou un curseur : interact [fenêtre] <element> setvalue "valeur" par ex. définir le gamma d’étalonnage à 2.4 : interact mainframe trc_textctrl setvalue 2.4 (remarquez que pour modifier plusieurs options en même temps, il est généralement préférable d’appeler plutôt setcfg <option> <valeur> pour chacune des options que vous désirez suivie d’un simple refresh)
    • Définir une valeur de cellule sur une mire : interact [fenêtre] <mire> setvalue "ligne,colonne,valeur" par ex. alors que l’éditeur de mire de test est affiché, définir la cellule de la seconde colonne de la première rangée à 33 : interact tcgen grid setvalue "0,1,33"

    Mises en garde et limitations

    Il faut être conscient de certaines choses lorsque l’on utilise des commandes qui interagissent directement avec l’interface utilisateur (c’est-à-dire activate, alt | cancel | ok, close, interact et invokemenu).

    Faire référence aux fenêtres et aux éléments de l’UI : vous pouvez faire référence aux fenêtres et aux éléments de l’interface graphique par leur ID (identifiant), nom ou étiquette (vous obtiendrez des informations sur les fenêtres et les éléments de l’UI avec les commandes getmenus/getmenuitems, getuielement/getuielements, et getwindows). Si l’ID d’un objet est négatif, ceci signifie qu’il a été automatiquement assigné à la création de l’objet et qu’il n’est valable que pour la durée de vie de l’objet (c’est-à-dire pour les fenêtres modales, uniquement lorsque la fenêtre est affichée). Pour cette raison, il est plus facile d’utiliser un nom d’objet, mais les noms (ainsi que les ID non assignés automatiquement) ne sont pas garantis d’être uniques, même pour les objets qui partagent la même fenêtre parente (cependant, la plupart des commandes « importantes » ainsi que les fenêtres d’application ont des noms uniques). Une autre possibilité est d’utiliser une étiquette d’objet, qui, bien qu’il n’y ait pas non plus de garantie qu’elle soit unique, a de fortes chances d’être unique pour les contrôles qui partagent la même fenêtre parente, mais il y a un inconvénient est qu’elle est traduite (bien que vous pouvez forcer une langue d’UI spécifique en appelant setlanguage) et elle est sujette à modification lorsque la traduction est mise à jour.

    Opérations séquentielles : appeler des commandes qui interagissent en succession rapide avec l’interface utilisateur peut nécessiter d’utiliser un délai supplémentaires entre l’envoi des commandes afin de laisser le temps à l’interface graphique de réagir (afin que getstate retourner l’état actuel de l’interface graphique après une commande spécifique), il y a cependant un délai par défaut d’au moins 55 ms pour les commandes qui interagissent avec l’interface graphique. Une bonne règle approximative pour lancer les commandes est de faire un cycle « envoyer la commande » → « lire la réponse » → « attendre optionnellement quelques ms de plus » → « demander l’état de l’application (envoyer la commande getstate) » → « lire la réponse ».

    Définir des valeurs : si la définition d’une valeur pour un élément de l’UI retourne ok, ceci n’est pas toujours l’indication que cette valeur a vraiment été changée, mais uniquement que la tentative pour changer cette valeur n’a pas échoué, c’est-à-dire que le gestionnaire d’événements de l’élément peut quand même faire une erreur de vérification et changer la valeur en quelque chose de sensé si ce n’était pas valable. Si vous désirez être certain que la valeur attendue est bien définie, utilisez getuielement sur l’élément affecté et vérifiez la valeur (ou mieux encore si vous utilisez un format de réponse JSON ou XML, vous pouvez plutôt vérifier l’object propriété/élément de la réponse ce qui va refléter l’état actuel de l’objet et vous économiser une requête). En général, il est préférable de n’utiliser interact <nom_element> setvalue <valeur> que pour les dialogues, et dans les autres cas d’utiliser une séquence de setcfg <option> <valeur> (répétée autant que nécessaire, appelez, de manière optionnelle, load <nom_fichier> or restore-defaults d’abord pour minimiser le nombre d’options de configuration que vous avez besoin de modifier) suivie par un appel à refresh pour mettre à jour l’interface utilisateur.

    De plus, tous les contrôles ne proposent pas une interface d’écriture de scripts complète. Je suis cependant ouvert à toutes les suggestions.

    Emplacements des données de l’utilisateur et du fichier de configuration

    ${APPNAME} utilise les dossiers suivants pour la configuration, les fichiers journaux et le stockage (le répertoire de stockage est configurable).

    Configuration

    • Linux : /home/Votre_Nom_Utilisateur/.config/${APPNAME}
    • Mac OS X : /Users/Votre_Nom_Utilisateur/Library/Preferences/${APPNAME}
    • Windows Vista et plus récent : C:\Users\Votre_Nom_Utilisateur\AppData\Roaming\${APPNAME}
    • Windows XP : C:\Documents and Settings\Votre_Nom_Utilisateur\Application Data\${APPNAME}

    Journaux

    • Linux : /home/Votre_Nom_Utilisateur/.local/share/${APPNAME}/logs
    • Mac OS X : /Users/Votre_Nom_Utilisateur/Library/Logs/${APPNAME} et
      /Users/Votre_Nom_Utilisateur/Library/Logs/0install
    • Windows Vista et plus récent : C:\Users\Votre_Nom_Utilisateur\AppData\Roaming\${APPNAME}\logs
    • Windows XP : C:\Documents and Settings\Votre_Nom_Utilisateur\Application Data\${APPNAME}\logs

    Stockage

    • Linux : /home/Votre_Nom_Utilisateur/.local/share/${APPNAME}/storage
    • Mac OS X : /Users/Votre_Nom_Utilisateur/Library/Application Support/${APPNAME}/storage
    • Windows Vista et plus récent : C:\Users\Votre_Nom_Utilisateur\AppData\Roaming\${APPNAME}\storage
    • Windows XP : C:\Documents and Settings\Votre_Nom_Utilisateur\Application Data\${APPNAME}\storage

    Sessions incomplètes ou ayant échoué (utile pour la résolution de problèmes)

    • Linux : /home/Votre_Nom_Utilisateur/.local/share/${APPNAME}/incomplete
    • Mac OS X : /Users/Votre_Nom_Utilisateur/Library/Application Support/${APPNAME}/incomplete
    • Windows Vista et plus récent : C:\Users\Votre_Nom_Utilisateur\AppData\Roaming\${APPNAME}\incomplete
    • Windows XP : C:\Documents and Settings\Votre_Nom_Utilisateur\Application Data\${APPNAME}\incomplete

    Problèmes connus et solutions

    General: Wacky image colors (swapped colors)
    Solution: This happens when you created a “XYZ LUT + swapped matrix” profile and is a way to alert you that the software you're using does not support XYZ LUT profiles and falls back to the included matrix (which generally means you'd loose accuracy). If you're having this situation only in some applications, creating a “XYZ LUT + matrix” profile will remedy it (but please keep in mind that those applications not supporting XYZ LUT will still fall back to the matrix, so results can be different from applications that support XYZ LUT correctly). If all colormanaged applications you use show swapped colors, you should create a matrix profile instead. Note that you do not have to re-run any measurements: In ${APPNAME}, choose a profile type as suggested previously (you need to enable advanced options in the “Options” menu to show profile type choices on the “Profiling” tab), adjust quality and profile name if you want, then choose “Create profile from measurement data...” in the “File” menu and select the profile you had the issue with.
    General: Measurements are failing (“Sample read failed”) if using the “Allow skipping of spectrometer self-calibration” option and/or highres/adaptive mode
    Solution: Disable either or all of the above options. The problem seems to mainly occur with the ColorMunki Design/Photo.
    USB 3.0 connectivity issues (instrument not found, access failing, or not working properly)
    Such issues would usually manifest themselves through instruments not being found, or randomly disconnecting even if seemingly working fine for some time. From all information that is known about these issues, they seem to be related to USB 3.0, not related to software as the vendor software is also affected, and they seem to occur irrespective of operating system or device drivers.
    The underlying issue seems to be that while USB 3.0 has been designed to be backwards compatible with USB 2.0, some USB 2 devices do not seem to work reliably when connected over USB 3. As currently available instruments with USB connectivity are usually USB 2 devices, they may be affected.
    Solution: A potential solution to such USB 3.0 connectivity issues is to connect the instrument to a USB 2.0 port (if available) or the use of an externally powered USB 2.0 hub.
    Windows: “The process <dispcal.exe|dispread.exe|coloprof.exe|...> could not be started.”
    Solution: If you downloaded ArgyllCMS manually, go to your Argyll_VX.X.X\bin directory, and right-click the exe file from the error message. Select “Properties”, and then if there is a text on the “General” tab under security “This file came from another computer and might be blocked”, click “Unblock”. Sometimes also over-zealous Antivirus or 3rd-party Firewall solutions cause such errors, and you may have to add exceptions for all involved programs (which may include all the ArgyllCMS executables and if you're using Zero Install also python.exe which you'll find in a subdirectory under C:\ProgramData\0install.net\implementations) or (temporarily) disable the Antivirus/Firewall.
    Photoshop: “The monitor profile […] appears to be defective. Please rerun your monitor calibration software.”
    Solution: Adobe ACE, Adobe's color conversion engine, contains monitor profile validation functionality which attempts to filter out bad profiles. With XYZ LUT profiles created in ArgyllCMS versions up to 1.3.2, the B2A white point mapping is sometimes not particularly accurate, just enough so that ACE will see it as a problem, but in actual use it may only have little impact that the whitepoint is a bit off. So if you get a similar message when launching Photoshop, with the options “Use profile regardless” and “Ignore profile”, you may choose “Use profile regardless” and check visually or with the pipette in Photoshop if the inaccurate whitepoint poses a problem. This issue is fixed in ArgyllCMS 1.3.3 and newer.
    MS Windows Vista: The calibration gets unloaded when a User Access Control prompt is shown
    Solution: (Intel and Intel/AMD hybrid graphics users please see “The Calibration gets unloaded after login/resume/User Access Control prompt” first) This Windows Vista bug seems to have been fixed under Windows 7 (and later), and can be remedied under Vista by either manually reloading calibration, or disabling UAC—but please note that you sacrifice security by doing this. To manually reload the calibration, either open ${APPNAME} and select “Load calibration curves from current display profile” under the “Video card gamma table” sub-menu in the “Tools” menu, or (quicker) open the Windows start menu and select “${APPNAME} Profile Loader” in the “Startup” subfolder. To disable UAC[9] (not recommended!), open the Windows start menu and enter “msconfig” in the search box. Click on the Tools tab. Select the line “Disable UAC” and click the “Launch” button. Close msconfig. You need to reboot your system for changes to apply.
    MS Windows with Intel graphics (also Intel/AMD hybrid): The Calibration gets unloaded after login/resume/User Access Control prompt
    Solution: The Intel graphics drivers contain several utilities that interfere with correct calibration loading. A workaround is to rename, move or disable (e.g. using a tool like AutoRuns) the following files:
    C:\Windows\system32\igfxtray.exe
    C:\Windows\system32\igfxpph.dll
    C:\Windows\system32\igfxpers.exe
    MS Windows Vista and later: The display profile isn't used if it was installed for the current user
    Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select “Classic View” under Vista and anything other than “Category View” under Windows 7 and later to see it). Under the “Devices” tab, select your display device, then tick “Use my settings for this device”.
    MS Windows 7 or later: Calibration does not load automatically on login when not using the ${APPNAME} Profile Loader
    Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select something other than “Category View” to see it). Select the “Advanced” tab, then “Change system defaults...”, and finally tick the “Use Windows display calibration” checkbox. Note that the precision of Windows' built-in calibration loading is inferior compared to the ${APPNAME} profile loader and may introduce inaccuracies and artifacts.
    MS Windows XP, multiple displays: One profile is used by all displays connected to a graphics card
    Solution: The underlying issue is that Windows XP assigns color profiles per (logical) graphics card, not per output. Most XP graphics drivers present only one logical card to the OS even if the card itself has multiple outputs. There are several possible solutions to this problem:
    • Use different graphics cards and connect only one display to each (this is probably the preferable solution in terms of ease of use and is least prone to configuration error)
    • Install and use the Windows XP color control applet (note that the original MS download link is no longer available)
    • Some graphics cards, like the Matrox Parhelia APV (no longer produced), will expose two logical cards to the OS when using a specific vendor driver (some older ATI drivers also had this feature, but it seems to have been removed from newer ones)
    Mac OS X 10.08 “Mountain Lion” or newer: Black crush and posterization in applications using ColorSync (e.g. Preview)
    Solution: Due to what appear to be bugs in Mac OS X, applications using ColorSync may show artifacts like black crush and posterization with certain types of display profiles (i.e. cLUT-based ones). Applications from 3rd parties which use their own color management engine (like Adobe products) are not affected. Also not affected seems Apple ColorSync Utility as well as Screenshot Utility, which could be used as a replacement for Apple Preview. Another work-around is to create a simpler single curve + matrix profile with included black point compensation, but a drawback is a potential loss of color accuracy due to the inherent limitiations of this simpler profile type (most other profiling solutions create the same type of simple profile though). The easiest way to create a simple single curve + matrix pofile in ${APPNAME} is to make sure calkibration tone curve is set to a value other than “As measured”, then setting testchart to “Auto” on the “Profiling” tab and moving the patch amount slider all the way to the left (minimum amount of patches). You should see “1xCurve+MTX” in the default profile name.
    Mac OS X 10.11 “El Capitan”: If running via 0install, ${APPNAME} won't launch anymore after updating to El Capitan from a previous version of OS X
    Solution:
    1. Run the “0install Launcher” application from the ${APPNAME}-0install.dmg disk image.
    2. Click “Refresh”, then “Run”. An updated library will be downloaded, and ${APPNAME} should launch.
    3. From now on, you can start ${APPNAME} normally as usual.
    Mac OS X 10.12 “Sierra”: Standalone tools silently fail to start
    Solution: Remove the quarantine flag from the application bundles (and contained files) by opening Terminal and running the following command (adjust the path /Applications/DisplayCAL/ as needed):
    xattr -dr com.apple.quarantine /Applications/DisplayCAL/*.app
    Mac OS X: ${APPNAME}.app is damaged and can't be opened.
    Solution: Go to the “Security & Privacy” settings in System Preferences and set “Allow applications downloaded from” (under the “General” tab) to the “Anywhere” setting. After you have successfully launched ${APPNAME}, you can change the setting back to a more secure option and ${APPNAME} will continue to run properly.
    Linux/Windows: No video card gamma table access (“Calibrate only” and “Calibrate & profile” buttons grayed, “Profile only” button available)
    Solution: Make sure you have not selected a display that doesn't support calibration (i.e. “Web @ localhost” or “Untethered”) and that you have enabled “Interactive display adjustment” or set the tone curve to a different value than “As measured”. Under Linux, please refer to the ArgyllCMS documentation, “Installing the software on Linux with X11” and “Note on X11 multi-monitor setups” / “Fixing access to Video LUTs” therein. Under Windows, please also see the solution posted under “The display profile isn't used if it was installed for the current user” if you are using Windows and make sure you have a recent driver for your video card installed.

    Obtenir de l’aide

    Veuillez remarquer que cette assistance ne peut être fournie qu’en anglais. et que les signalements de bogues devront toujours être écrits en anglais. Je vous remercie.

    Vous avez besoin d’aide pour une tâche spécifique ou vous rencontrez un problème ? Ce peut être une bonne idée de consulter d’abord les problèmes connus et solutions si le sujet a déjà été traité. Si vous désirez signaler un bogue, veuillez consulter les lignes directrices pour le signalement de bogues. Sinon, utilisez l’un des canaux suivants :

    • forum d’entraide ;
    • Me contacter directement (mais gardez à l’esprit que d’autres utilisateurs pourraient aussi profiter des échanges, j’encourage donc, si possible, l’utilisation de l’une des méthodes ci-dessus)

    Signaler un bogue

    Veuillez remarquer que cette assistance ne peut être fournie qu’en anglais. et que les signalements de bogues devront toujours être écrits en anglais. Je vous remercie.

    Vous avez trouvé un bogue ? Si c’est le cas, veuillez d’abord vérifier sur le système de suivi des bogues que ce problème n’a pas déjà été signalé auparavant. Sinon, suivez ces lignes directrices pour signaler les bogues :

    • Essayez de donner un résumé court mais précis du problème ;
    • Essayez d’indiquer quelques étapes permettant de reproduire le problème ;
    • Si possible joignez toujours les fichiers des journaux. Ils sont habituellement créés automatiquement par ${APPNAME} en tant qu’élément de fonctionnement normal du programme. Vous pouvez les trouver ici :
      • Linux : /home/Votre_Nom_Utilisateur/.local/share/${APPNAME}/logs
      • Mac OS X : /Users/Votre_Nom_Utilisateur/Library/Logs/${APPNAME} and
        /Users/Votre_Nom_Utilisateur/Library/Logs/0install
      • Windows Vista et plus récent : C:\Users\Votre_Nom_Utilisateur\AppData\Roaming\${APPNAME}\logs
      • Windows XP : C:\Documents and Settings\Votre_Nom_Utilisateur\Application Data\${APPNAME}\logs

      Comme le dossier peut contenir plusieurs fichiers de journaux, une bonne idée est de compresser l’ensemble du dossier sous forme d’une archive ZIP ou tar.gz que vous pourrez facilement joindre au signalement de bogue.

      Attention, les fichiers de journaux peuvent contenir votre nom d’utilisateur ainsi que les chemins des fichiers que vous avez utilisés avec ${APPNAME}. Je respecterai toujours votre vie privée, mais vous devez en avoir conscience lorsque vous joignez des fichiers de journaux vers un endroit public tel que le système de suivi des problèmes.

    Créez un nouveau ticket (ou, si le bogue a déjà été signalé, utilisez le ticket existant) sur le système de suivi des problèmes, en suivant les lignes directrices ci-dessus et joignez l’archive des fichiers de journaux.

    Si vous ne voulez pas ou ne pouvez pas utiliser le système de suivi des bogues, vous pouvez utiliser l’un des autres canaux d’assistance.

    Discussion

    Veuillez remarquer que cette assistance ne peut être fournie qu’en anglais. et que les signalements de bogues devront toujours être écrits en anglais. Je vous remercie.

    Désirez-vous entrer en rapport avec moi ou avec d’autres utilisateurs en ce qui concerne ${APPNAME} ou des sujets en rapport ? Le forum de discussions générales est un bon emplacement où le faire. Vous pouvez aussi me contacter directement.

    Remerciements

    Je voudrais remercier les personnes suivantes :

    Graeme Gill, pour avoir créé ArgyllCMS

    Les traducteurs : Loïc Guégant, François Leclerc, Jean-Luc Coulon (traduction française), Roberto Quintero (traduction espagnole), Tommaso Schiavinotto (traduction italienne), 楊添明 (traduction chinois traditionnel), 김환(Howard Kim) (traduction coréenne)

    Les donateurs récents : Nigel Smith, Marcin Koscielecki, Philip Kerschbaum, Shih-Hsiang Lin, Alberto Alessandro Pozzo, John Mackey, Serge Stauffer, Juraj Hatina, Dudley Mcfadden, Tihomir Lazarov, Kari Hrafnkelsson, Michael Gerstgrasser, Sergio Pirovano, Borko Augustin, Greg Hill, Marco Signorini, Hanno Ritzerfeld, Lensvisions Studio, Ute Bauer, Ori Sagiv, Bálint Hajagos, Vesa Karhila, Сергей Кудрин, Sheila Mayo, Lensvisions Studio, Dmitry Ostroglyadov, Lippai Ádám, Aliaksandr Sirazh, Dirk Driesen, Andre Schipper, Jay Benach, Gafyn Jones, Fritz Schütte, Kevin Pinkerton, Truls Aagedal, Eakphan Intajak, Herbert Moers, Jordan Szuch, Clemens Rendl, Nirut Tamchoo, James Barres, Ronald Nowakowski, Stefano Aliffi, Miriana Marusic, Robert Howard, Alessandro Marotta, Björn Stresing, Evgenij Popov, Rodrigo Valim, Robert Smith, Jens Windmüller, 信宏 郭, Swen Heinrich, Matthieu Moy, Sebastian Hoffmann, Ruslan Nedielkov, Fred Wither, Richard Tafel, Chester Chua, Arreat.De, Duane Middlebrook, Stephan Eitel, autres…

    Et tous ceux qui m’ont envoyé des retours ou signalé des bogues, suggéré des fonctionnalités ou qui, simplement, utilisent ${APPNAME}.

    Remerciements :

    Une partie de la documentation très complète d’ArgyllCMS a été utilisée dans ce document. Elle n’a que légèrement été modifiée afin de mieux correspondre au comportement et à la terminologie de ${APPNAME}.

    Journaux des modifications

    ${ISODATE} ${ISOTIME} (UTC) ${VERSION_SHORT} ${STABILITY}

    ${APPNAME} ${VERSION_SHORT} ${STABILITY}

    Added in this release:

    • [Feature] Support the madVR HDR 3D LUT installation API (madVR >= 0.92.13).

    Changed in this release:

    • [Enhancement] In case of a download problem (e.g. automatic updates), offer to visit the download URL manually.
    • [Enhancement] Security: Check file hashes of application setup and portable archive downloads when updating ${APPNAME} or ArgyllCMS.
    • [Enhancement] Security: Use HTTPS for ArgyllCMS download as well.
    • [UI] New application icons and slightly refreshed theme.
    • [UI] Improved HiDPI support by adjusting relative dialog button spacing, margins, and interactive display adjustment window gauge sizes to match proportionally regardless of DPI.
    • [UI] Improved visual consistency of tab buttons (don't lose “selected” state if clicking on a button and then moving the mouse outside of it, “hover” state does no longer override “selected” state, keyboard navigation skips over selected button).
    • [Cosmetic] Measurement report: Make patch preview take into account the “Use absolute values” option again.
    • [Cosmetic] Measurement report: Colorize CCT graph points according to change in hue and chroma.
    • [Cosmetic] Measurement report: Colorize gamma graph points according to change in gamma.
    • [Cosmetic] Measurement report: Dynamically adjust gamma graph vertical axis to prevent cut-off.
    • [Cosmetic] Measurement report: Make RGB balance graph match HCFR (Rec. 709 only). Note that new and old balance graphs are only comparable to a limited extent (use “Update measurement or uniformity report” in the “Tools” menu to update existing reports).
    • [Cosmetic] Profile loader (Windows): Unset non belonging profile when resetting a profile association.
    • Mac OS X: Set default profile type to single curve + matrix with black point compensation due to long-standing Mac OS X bugs with any other profile type.

    Fixed in this release:

    • [Moderate] Unhandled exception and UI freeze when the 3D LUT format was set to madVR and there never was a prior version of ArgyllCMS on the system or the previous version was older than or equal to 1.6.3 during that same ${APPNAME} session, due to a missing capability check.
    • [Moderate] Division by zero when trying to create a SMPTE 2084 HDR 3D LUT if the profile black level was zero (regression of a change in ${APPNAME} 3.4, SVN revision r4896).
    • [Minor] If using the alternate forward profiler and the profile type was XYZ LUT + swapped matrix, the swapped matrix was overwritten with an accurate one (regression introduced in ${APPNAME} 3.3.4, SVN revision r4736).
    • [Minor] It was not possible to run a measurement report with a simulation profile set as display profile, but no profile assigned to the actual display.
    • [Minor] Rec. 1886 measurement report with originally non Rec. 709 tone response profile: Make sure to override the original tone response of the profile so Rec. 1886 gives the expected result.
    • [Minor] If a measurement report HTML file was mangled by another application that removed the XML self-closing tags forward slashes, it was not possible to correctly update the report using “Update measurement or uniformity report” from the “Tools” menu.
    • [Minor] If using a pattern generator, check it is valid before binding a disconnect-on-close event when using the visual whitepoint editor. Prevents an attribute error when using the visual whitepoint editor and the madTPG network implementation (i.e. under Mac OS X).
    • [Minor] Windows: Always use the active display device directly when querying or setting profiles instead of mimicking applications using the Windows GetICMProfile API (fixes getting the correct profile with display configurations consisting of three or more displays where some of them are deactivated).
    • [Minor] Profile loader (Windows): Check whether or not a display device is attached to multiple adapters and disable fixing profile associations in that case.
    • [Minor] Profile loader (Windows): Work-around hitching caused by Windows WcsGetDefaultColorProfile API call on some systems.
    • [UI] Measurement window: Make sure focus stays on the last focused control when the window itself gains focus again after losing focus.
    • [UI] Synthetic ICC Profile Creator: Update HDR SMPTE 2084 diffuse white info text when changing luminance.
    • [Trivial] HDR SMPTE 2084 3D LUT: Interpolate the last two segments before the clipping point of the intermediate input LUT shaper curves (prevents potential slight banding in highlights).
    • [Trivial] Windows: Make sure the profile loader is launched directly after installing a profile when using a portable version of ${APPNAME} (parity with installer version).
    • [Trivial] Profile loader (Windows): Re-introduce --skip command line option.
    • [Cosmetic] Profile loader (Windows): When disassociating a profile from a device, suppress ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE error sometimes (in some cases always?) resulting from the WcsDisassociateColorProfileFromDevice Windows API call, even though the profile was successfully disassociated.
    2017-12-30 14:16 (UTC) 3.4

    DisplayCAL 3.4

    Added in this release:

    • [Feature] HDR Hybrid Log-Gamma transfer function option for 3D LUTs.
    • [Feature] HDR verification testcharts.
    • [UI] Simplified chinese translation thanks to 林泽帆(Xpesir).
    • [Enhancement] Linux: wxPython Phoenix 4.0.0b/rc1 compatibility.
    • [Enhancement] Profile loader (Windows): Notifications (for 3rd party calibration/profiling software and user-defined exceptions) can be turned off.

    Changed in this release:

    • [Enhancement] HDR 3D LUTs: SMPTE 2084 with roll-off now allows specifying the mastering display minimum and peak luminance which are used to adjust the roll-off start and clipping points (BT.2390-3).
    • [Enhancement] HDR 3D LUTs: Chroma compression is now done in Lpt color space, providing improved preservation of detail in compressed highlights.
    • [Enhancement] Do not disable the measurement report button if the selected setting is a preset and a simulation profile is used as display profile with tone curve set to “Unchanged” (i.e. do not require selecting “<Current>” under settings to allow verifying the native device response against a selected simulation profile).
    • [Enhancement] Limit profile name length taking into account the full path of the final storage directory.
    • [Enhancement] Disable automatic output levels detection for colorimeter correction creation measurements.
    • Changed the “Softproof” and “Video” presets to no longer intentionally swap red and green for the fallback matrix.
    • [UI] [Cosmetic] Minor UI consistency changes.
    • [Enhancement] Linux: X11 root window _ICC_PROFILE_xxx atom enumeration for Xrandr now matches the Xinerama order, so that _ICC_PROFILE_xxx atoms match irrespective of which extension applications are using. This improves conformance to the ICC Profiles in X Specification and matches the respective change in ArgyllCMS 2.0.
    • Mac OS X (standalone application): No longer support OS X versions prior to 10.6. This streamlines and slims the application bundle and allows using more recent 3rd party dependencies which are not available for older Mac OS X releases. If you still need support for Mac OS X 10.5, use the 0install version of ${APPNAME}.

    Fixed in this release:

    • [Critical] Ensure alternate forward profiler device to PCS table input curves are strictly monotonically increasing to prevent clipping resulting in peaks in the response in case of bad underlying (non-monotonic) device behavior (regression of a change in ${APPNAME} 3.3.5, SVN revision r4838).
    • [Minor] Always force the first entry in PCS to device table input curves to zero when generating high resolution PCS to device tables (fixes potential unexpected non-zero RGB output for zero input to perceptual PCS to device table).
    • [UI] [Cosmetic] When not confirming a manual ${APPNAME} update but ArgyllCMS is up to date, reflect this in the final dialog message.
    • [Trivial] ReShade 3D LUT: If ReShade 3.x default shaders are installed, write the different parts of the 3D LUT to the correct respective sub-directories and no longer write the superfluous ReShade.fx.
    • [UI] [Cosmetic] Linux: Prevent flickering of tab buttons on some systems when switching tabs.
    • [Moderate] Linux: The way display device enumeration was performed was not always guaranteed to give consistent results across the different available external device to profile mapping APIs, which could lead to wrong profile associations in multi-display configurations (this fix is required to match how ArgyllCMS 2.0 enumerates displays).
    • [Minor] Mac OS X (standalone application): Bundle certificate authority certificates to enable verifying server certificates (fixes not being able to automatically download updates).
    • [Minor] Windows: When creating a colorimeter correction from measurement file(s) stored in a path where one or more components(s) started with a number from 1-9 or the lowercase letter g, the operation failed and the created colorimeter correction had to be retrieved from the temporary directory manually.
    • [Minor] Profile loader (Windows): When manually disabling calibration loading via the pop-up menu, and then starting ${APPNAME} (or another application detected by the profile loader) and closing it again, the profile loader would stay disabled, including the calibration loading related menu items, requiring a profile loader restart.
    2017-10-18 17:34 (UTC) 3.3.5

    DisplayCAL 3.3.5

    Changed in this release:

    • [Enhancement] Updated french localization (thanks to Jean-Luc Coulon).
    • [Enhancement] When generating high resolution PCS to device tables for XYZ LUT profiles, round PCS candidate “fit” so a good match is not potentially needlessly discarded in favor of a match with lower effective usage of the available lookup table grid points (may speed up the process as well).
    • [Enhancement] Use single curve detection based on calibration accuracy for shaper tags of XYZ LUT profiles as well.

    Fixed in this release:

    • [Minor] When enabling the Spyder2, check if the spyd2PLD.bin firmware has actually been successfully extracted (taking into account the install scope) and fall back to alternate methods when using automatic mode if the firmware cannot be extracted from the vendor software present in the local filesystem (fixes inability to enable the Spyder2 under Mac OS X if the vendor software is installed).
    • [Minor] Windows: Make measurement report filename safe for filesystem encoding (works around encoding quirks with certain locales).
    • [Minor] Windows: Windows silently strips any combination of trailing spaces and dots in file and folder names, so do the same for the profile name.
    • [Minor] Profile loader (Windows): WCS can return no profile without error in some situations, but the no error case wasn't accounted for, resulting in an unhandled exception in that case.
    • [Minor] Profile loader (Windows): Get the process identifier before enumerating windows to prevent an unhandled exception if a madVR instance is already running before starting the profile loader.
    • [Cosmetic] Profile loader (Windows): Detect if the current display profile video card gamma table tag contains linear calibration when checking if madVR did reset the video card gamma table to linear to prevent the profile loader alternating between enabled and disabled state if using windowed overlay in madVR.
    2017-09-13 12:09 (UTC) 3.3.4.1

    DisplayCAL 3.3.4.1

    Fixed in this release:

    • [Moderate] Linux (profile installation and profile loading): Getting the fallback XrandR display device ID could unexpectedly return no result in some cases due to incorrect parsing, leading to potential application of a stale device to profile mapping or no profile at all (regression of SVN revision r4800).
    • [Minor] Linux, Mac OS X: The visual whitepoint editor was failing to update the test pattern area of a connected madTPG instance when madVR was selected as display device, due to an implementation bug related to setting the background color.
    2017-09-09 15:53 (UTC) 3.3.4

    DisplayCAL 3.3.4

    Added in this release:

    • Verification charts for ISO 14861:2015 soft proofing evaluation.

    Changed in this release:

    • [Enhancement] More even and consistent CPU utilization on multi CPU/multi core systems during high resolution device-to-PCS table generation.
    • [Enhancement] Multi-threaded gamut view calculation.
    • [Enhancement] Use an alternate way to generate the matrix for profiles created from the small testchart for matrix profiles (may improve accuracy on very linear displays) and use an optimized tone response curve if using a single curve and the measured response is a good match to an idealized parametric or standardized tone response curve.
    • [Enhancement] Uniformity report: No longer include (meaningless) correlated/closest color temperature. Use “traffic light” visual indicators in conjunction with unambiguous pass/fail messages to allow easy at-a-glance assessment of the results, and also include contrast ratio deviation to fully conform to ISO 12646:2015 and 14861:2015. You can update old reports via “Update measurement or uniformity report...” in the “Report” sub-menu of the “Tools” menu.
    • [Enhancement] Measurement report: Use the display profile whitepoint as reference white for the measured vs. profile white delta E calculation and use the assumed target whitepoint as reference white for the measured vs. assumed white delta E calculation to make the reported delta E more meaningful.
    • [Enhancement] Measurement report: Allow to use the display profile whitepoint as reference white when using absolute (not D50 adapted) values.
    • [Enhancement] Profile installation (Linux): Always do fallback colord profile installation using colormgr if available unless the ARGYLL_USE_COLORD environment variable is set.
    • [Enhancement] Profile loader (Linux): Include the profile source (colord or Argyll's UCMM) in diagnostic output and use the XrandR device ID as fallback when no EDID is available.
    • [Enhancement] Profile loader (Windows): Slightly improve encoding accuracy of quantizing to 8 < n < 16 bits.
    • [Trivial] Offer the complete range of input encodings for the eeColor 3D LUT format and do not force an identical output encoding.
    • [Trivial] Do not store calibration settings in a profile if calibration is disabled.
    • [Trivial] Revert the default profile type for the 79 patches auto-optimized testchart slider step to XYZ LUT + matrix.
    • [Trivial] Iridas cube 3D LUTs: Increase compatibility by stripping leading whitespace from text lines and adding DOMAIN_MIN/MAX keywords if missing.
    • [Trivial] Measurement report: Calculate true combined a*b* range for grayscale instead of summing separate ranges.
    • [Trivial] Measurement report: Automatically enable “Use absolute values” if using full whitepoint simulation (i.e. not relative to display profile whitepoint).

    Fixed in this release:

    • [Moderate] When cancelling profiling measurements with the testchart set to “Auto”, the testchart UI and the internal test chart setting were no longer in sync until changing the profile type or restarting the application.
    • [Moderate] Synthetic ICC profile creator: Unhandled exception when trying to create DICOM (regression of a change in DisplayCAL 3.1.5, SVN revision r4020) or SMPTE 2084 profiles (regression of multiprocessing changes in DisplayCAL 3.3).
    • [Minor] Protect against potentially clipping slightly above black values during high resolution device-to-PCS table generation (regression of a change in DisplayCAL 3.3.3, SVN revision r4705).
    • [Minor] Protect against enumerating displays and ports in response to a DISPLAY_CHANGED event when the main window isn't shown or isn't enabled which could lead to a hang due to a race condition.
    • [Minor] Verification using a simulation profile that defines an identity matrix in its 'chad' tag (e.g. ISOnewspaperv4) did not work correctly due to the matrix being mapped to “None” insatead of “XYZ scaling”.
    • [Minor] Verification using a CMYK simulation profile failed with a “Profile invalid” error if previously “Use simulation profile as display profile” and “Device link profile” were enabled but no device link profile selected.
    • [Minor] Remove separate videoLUT access support under Windows and Mac OS X (separate videoLUT access is only supported under X11).
    • [Minor] Downloaded files were not renamed from their temporary name if the server did not return a Content-Length header (this typically only happens for text files, not binary files). Fixes not being able to import colorimeter corrections from iColor Display.
    • [Trivial] Do not reflect the black point hue in tone response curves of single curve + matrix profiles when not using black point compensation.
    • [Trivial] Measurement report: Additional stats median calculation index was off by n+1.
    • [Cosmetic] Display model name and manufacturer description tags were missing from profiles created using the alternate forward profiler.
    • [Cosmetic] Measurement report: Eliminate “Use absolute values” having a side-effect on the RGB patches preview.
    • [Cosmetic] Windows: When closing some of the standalone tools when minimized, e.g. by right-clicking the taskbar button and choosing “Close” from the menu, or by using the taskbar preview close button, the application did not close until restored from its minified state (i.e. by clicking on the taskbar button or switching to it with the task switcher).
    2017-08-08 18:40 (UTC) 3.3.3

    DisplayCAL 3.3.3

    Added in this release:

    • Intermediate auto-optimized testchart step with 115 patches.

    Changed in this release:

    • [UI] [Cosmetic] Verification tab: Always show advanced tone response curve options when “Show advanced options” is enabled in the “Options” menu.
    • [UI] [Trivial] Verification tab: Don't reset the simulation profile tone response curve choice unless changing the simulation profile.
    • [Enhancement] [Trivial] When encountering an invalid peak white reading during output levels detection, advise to check if the instrument sensor is blocked.
    • [Enhancement] Visual whitepoint editor: Use whitepoint of currently selected profile (unless it's a preset or “<Current>”) instead of associated display profile.
    • [Enhancement] Blend profile black point to a*b* = 0 by default. This makes the visual appearance of black and near black response in Photoshop (which uses relative colorimetric intent with black point compensation for display by default) match the DisplayCAL perceptual table of XYZ LUT profiles (which means neutral hues gradually blend over to the display black point hue relatively close to black. The rate of this blend and black point hue correction are influenced by the respective calibration settings, which is another added benefit of this change).
    • [Enhancement] Measurement & uniformity report: Change average delta a, b, L, C, and H to be calculated from absolute values.
    • [Enhancement] Profile loader (Windows): Don't implicitly reset the video card gamma table to linear if no profile is assigned or couldn't be determined. Show an orange-red error icon in the latter case and display details in the left-click notification popup.
    • [Cosmetic] Windows: Log errors when trying to determine the active display device during profile installation.

    Fixed in this release:

    • [UI] [Cosmetic] Verification tab: Don't accidentally enable the simulation profile tone response curve black output offset (100%) radio button when switching tabs.
    • [Trivial] Show error dialog if not able to connect to instrument for single reading.
    • [Minor] Strip the “firmware missing” message from the Spyder2 instrument name if it was not yet enabled (makes the automatic popup to enable the Spyder2 work).
    • [Minor] Prisma 3D LUT upload with 1.07 firmware.
    • [Minor] More accurately encode the black point in the colorimetric PCS to device table by explicitly clipping below black values to zero.
    2017-06-29 15:10 (UTC) 3.3.2

    DisplayCAL 3.3.2

    Added in this release:

    • IPT and Lpt color spaces (profile information 2D and 3D gamut view, testchart editor 3D view).
    • ACEScg and DCDM X'Y'Z' source profiles.

    Changed in this release:

    • [Enhancement] Changed HDR 3D LUT SMPTE 2084 roll-off colorimetric rendering to do gamut mapping in ICtCp (slightly improved hue and saturation preservation of bright saturated colors).
    • [Trivial] Include output levels detection related files in session archives.

    Fixed in this release:

    • [Moderate] Unhandled exception when trying to set a white or black level target on the calibration tab via the newly introduced measurement buttons (regression of a change in ${APPNAME} 3.3.x, SVN revision r4557).
    • [Moderate] Black point compensation for cLUT-type profiles in the advanced options did not work correctly (regression of a change in ${APPNAME} 3.3.x, SVN revision r4538).
    • [Moderate] Unhandled exception when creating L*a*b* LUT profiles (regression of multiprocessing changes in ${APPNAME} 3.3.x, SVN revision r4433). Note that creating L*a*b* LUT profiles is not recommended due to the limited ICC encoding range (not suitable for wide-gamut) and lower accuracy and smoothness compared to XYZ LUT.
    • [Minor] Output levels detection and alternate forward profiler were not working when using output levels quantization via additional dispread command line option -Z nbits.
    • [Minor] Do not create shaper curves for gamma + matrix profiles.
    • [Minor] Don't fall back to colorimetric rendering for HDR 3D LUT SMPTE 2084 roll-off when using luminance matched appearance or luminance preserving perceptual appearance rendering intents.
    • [Trivial] DIN99c and DIN99d white point misalignment (profile information 2D and 3D gamut view, testchart editor 3D view).
    • [UI] [Cosmetic] Change info panel text to use system text color instead of defaulting to black.
    • [Minor] Linux (0install): Prevent system-installed protobuf package shadowing 0install implementation.
    2017-06-04 16:04 (UTC) 3.3.1

    DisplayCAL 3.3.1

    Fixed in this release:

    • Unhandled exception if using CIECAM02 gamut mapping when creating XYZ LUT profiles from regularly spaced grid patch sets with the alternate forward profiling method introduced in ${APPNAME} 3.3.
    2017-05-30 17:48 (UTC) 3.3

    DisplayCAL 3.3

    Added in this release:

    • Profiling engine enhancements:
      • [Feature] Better multi CPU/multi core support. Generating high resolution PCS-to-device tables is now taking more advantage of multiple (physical or logical) processors (typical 2x speedup on a i7 6700K CPU).
      • [Enhancement] Generating a simple high resolution perceptual table is now done by copying the colorimetric table and only generating new input curves. This markedly reduces the processing time needed to create the perceptual table (6x speedup on a i7 6700K CPU).
      • [Enhancement] Black point compensation now tries to maintain the whitepoint hue until closer to the black point. This makes curves + matrix profiles in the default configuration (slightly) more accurate as well as the default simple perceptual table of cLUT profiles provide a result that is closer to the colorimetric table.
      • [Enhancement] The curves tags of XYZ LUT + matrix profiles will now more closely match the device-to-PCS table response (improves grayscale accuracy of the curves tags and profile generation speed slightly).
      • [Enhancement] The curves tags of matrix profiles are further optimized for improved grayscale accuracy (possibly slightly reduced overall accuracy if a display device is not very linear).
      • [Enhancement] XYZ LUT profiles created from small patch sets (79 and 175 patches) with regularly spaced grids (3x3x3+49 and 5x5x5+49) now have improved accuracy due to an alternate forward profiling method that works better for very sparsely sampled data. Most presets now use 5x5x5+49 grid-based patch sets by default that provide a reduction in measurement time at about the same or in some cases even slightly better accuracy than the previously used small patch sets.
      • [Enhancement] Additional PCS candidate based on the actual measured primaries of the display device for generating high resolution PCS-to-device tables. This may further reduce PCS-to-device table generation time in some cases and lead to better utilization of the available cLUT grid points.
    • [Feature] Calibration whitepoint targets other than “As measured” will now also be used as 3D LUT whitepoint target, allowing the use of the visual whitepoint editor to set a custom whitepoint target for 3D LUTs.
    • [Feature] Automatically offer to change the 3D LUT rendering intent to relative colorimetric when setting the calibration whitepoint to “As measured”.
    • [Feature] Support for madVR's ability to send HDR metadata to the display via nVidia or Windows 10 APIs (i.e. switch a HDR capable display to HDR mode) when creating SMPTE 2084 3D LUTs. Note that you need to have profiled the display in HDR mode as well (currently only possible by manually enabling a display's HDR mode).
    • [Feature] Output levels selection as advanced option and automatic output levels detection. Note that this cannot detect if you're driving a display that expects full range (0..255) in limited range (16..235), but it can detect if you're driving a display that expects limited range in full range and will adjust the output levels accordingly.
    • [Feature] New experimental profiling patch sequence advanced options. “Minimize display response delay” is the ArgyllCMS default (same as in previous versions of ${APPNAME}). “Maximize lightness difference”, “Maximize luma difference”, “Maximize RGB difference” and “Vary RGB difference” are alternate choices which are aimed at potentially dealing better with displays employing ASBL (automatic static brightness limiting) leading to distorted measurements, and should be used together with display white level drift compensation.
    • [Feature] Optional alternate method for creating colorimeter correction matrices that minimizes xy chromaticity difference (four color matrix method).
    • [Feature] The curve viewer and profile information now have the ability to plot tone response curves of RGB device link profiles.
    • [Feature] The white and black level calibration target can now be set by measurement.
    • [Enhancement] The visual whitepoint editor is now compatible with Chromecast, Web @ localhost, madVR, Prisma and Resolve pattern generators.
    • [Enhancement] 3D LUT generator ReShade 3.0 compatibility.
    • [Feature] Support calibration from WCS profiles embedded in ICC profiles (like the ones created by the Windows Display Color Calibration Tool).
    • [Feature] Profile loader (Windows): Detect the Windows Display Color Calibration Tool.
    • [Feature] Profile loader (Windows): The quantization bitdepth can now be selected.

    Changed in this release:

    • [Enhancement] The visual whitepoint editor now uses the calibration of the currently active display profile as the initial whitepoint.
    • [Enhancement] Temporary files will no longer be removed if moving the files to the final location failed, and a non-empty temporary directory will no longer be removed on exit.
    • [Enhancement] Incomplete runs are now always saved to a folder named 'incomplete' in the parent directory of the 'storage' directory (previously when creating a profile from existing measurement data, a failed run could overwrite existing files in a source folder that did not reside in the 'storage' directory).
    • [Enhancement] Use a different (numbered) logfile name when starting additional instances of the standalone tools.
    • [Enhancement] When creating colorimeter correction matrices from existing spectral reference data, use the selected observer.
    • [UI] Hide the observer selector in the colorimeter correction creation dialog when creating a spectral colorimeter correction as observer isn't applicable in that case.
    • [UI] Remove the single “Browse...” button from the colorimeter correction creation dialog and add individual file pickers for reference and colorimeter measurement data files.
    • [UI] When creating colorimeter corrections for “virtual” display devices like madVR or Resolve, offer to specify the actual display model and manufacturer.
    • [UI] Use smaller increments when paging up/down the black point rate or testchart patches amount sliders.
    • [Cosmetic] Default whitepoint color temperature and chromaticity to 6500K and D65 respectively.
    • [Cosmetic] If you explicitly pause measurements prior to attempting to cancel them, and then dismiss the confirmation dialog, the measurements will no longer automatically resume (unpause) anymore.
    • [Enhancement] Linux: When installing instrument udev rules, backup existing rules to a timestamped backup directory ~/.local/share/${APPNAME}/backup/YYYYMMDDTHHMMSS instead of overwriting existing backups in ~/.local/share/${APPNAME}/backup, and automatically add the current user to the 'colord' group (which will be created if nonexistent) if not yet a member.
    • [Cosmetic] Mac OS X: Don't include ID in profile header (stops ColorSync utility from complaining).
    • [Enhancement] Profile loader (Windows): The selected calibration state will not be implicitly (re-)applied every three seconds, but only if a change in the running processes or video card gamma tables is detected. This has been reported to stop hitching on some systems using Intel integrated graphics, and works around an issue with the Windows 10 Creators Update and fullscreen applications (e.g. games) where the calibration state would not be restored automatically when returning to the desktop.
    • [Enhancement] Profile loader (Windows): The profile loader will check whether or not madVR resets the videoLUT and preserve calibration state if not.
    • [UI] [Cosmetic] Profile loader (Windows): Renamed “Preserve calibration state” menu item to “Load calibration on login & preserve calibration state” to reduce ambiguity.
    • [UI] [Cosmetic] Profile loader (Windows): The tray icon will animate when calibration is reloaded.
    • [UI] [Cosmetic] Windows 7 and newer: Show progress in the taskbar.

    Fixed in this release:

    • [Minor] Prevent ArgyllCMS from removing measurements with one or two zero CIE components by fudging them to be non-zero.
    • [Minor] In some cases the high resolution colorimetric PCS-to-device table of XYZ LUT profiles would clip slightly more near black than expected.
    • [Trivial] Save and restore SMPTE 2084 content colorspace 3D LUT settings with profile.
    • [UI] [Minor] Changing the application language for the second time in the same session when a progress dialog had been shown at any point before changing the language for the first time, resulted in an unhandled exception. This error had the follow-up effect of preventing any standalone tools to be notified of the second language change.
    • [UI] [Trivial] The “Install Argyll instrument drivers” menu item in the “Tools” menu is now always enabled (previously, you would need to select the location of the ArgyllCMS executables first, which was counter-intuitive as the driver installer is separate since ${APPNAME} 3.1.7).
    • [UI] [Cosmetic] When showing the main window (e.g. after measurements), the progress dialog (if present) could become overlapped by the main window instead of staying in front of it. Clicking on the progress dialog would not bring it back into the foreground.
    • [UI] [Minor] 3D LUT tab: When selecting a source colorspace with a custom gamma tone response curve, the gamma controls should be shown regardless of whether advanced options are enabled or not.
    • [Trivial] Testchart editor: Pasting values did not enable the “Save” button.
    • [UI] [Minor] Untethered measurement window: The “Measure” button visual state is now correctly updated when cancelling a confirmation to abort automatic measurements.
    • [Minor] Windows: Suppress errors related to WMI (note that this will prevent getting the display name from EDID and individual ArgyllCMS instrument driver installation).
    • [UI] [Cosmetic] Profile loader (Windows): Changing the scaling in Windows display settings would prevent further profile loader tray icon updates (this did not affect functionality).
    • [Minor] Profile loader (Windows): Undefined variable if launched without an active display (i.e. if launched under a user account that is currently not the active session).
    • [Minor] Profile loader (Windows): Original profile loader instance did not close after elevation if the current user is not an administrator.
    2017-02-18 15:52 (UTC) 3.2.4

    3.2.4

    Added in this release:

    • Korean translation thanks to 김환(Howard Kim).

    Changed in this release:

    • Disable observer selection if observer is set by a colorimeter correction.
    • 3D LUT maker: Enable black output offset choice for 16-bit table-based source profiles.
    • Profile loader (Windows): “Automatically fix profile associations” is now enabled by default.
    • Build system: Filter out “build”, “dist” as well as entries starting with a dot (“.”) to speed up traversing the source directory tree (distutils/setuptools hack).

    Fixed in this release:

    • Could not create colorimeter correction from existing measurements for instruments that don't support alternative standard observers.
    • ColorHug / ColorHug2 “Auto” measurement mode threw an error if the extended display identification data did not contain a model name.
    • [Trivial/cosmetic] Testchart editor: When adding reference patches, resize row labels if needed.
    • Profile loader (Linux): When errors occured during calibration loading, there was no longer any message popup.
    • Profile loader (Windows): Filter non-existing profiles (e.g. ones that have been deleted via Windows Explorer without first disassociating them from the display device) from the list of associated profiles (same behavior as Windows color management settings).
    • Profile loader (Windows): When changing the language on-the-fly via ${APPNAME}, update primary display device identfier string.
    2017-01-04 14:10 (UTC) 3.2.3

    3.2.3

    Changed in this release:

    • Updated traditional chinese translation (thanks to 楊添明).
    • Profile loader (Windows): When creating the profile loader launcher task, set it to stop existing instance of the task when launching to circumvent a possible Windows bug where a task would not start even if no previous instance was running.

    Fixed in this release:

    • When querying the online colorimeter corrections database for matching corrections, only query for corrections with a matching manufacturer ID in addition to a matching display model name (fixes corrections being offered for displays from different manufacturers, but matching model names).
    • Profile loader (Windows): Fix unhandled exception if no profile is assigned to a display (regression of a change to show the profile description instead of just the file name in ${APPNAME} 3.2.1).
    2016-12-13 22:27 (UTC) 3.2.2

    3.2.2

    Changed in this release:

    • Importing colorimeter corrections from other display profiling software now only imports from the explicitly selected entries in automatic mode.
    • Profile loader launcher (Windows): Pass through --oneshot argument to profile loader.

    Fixed in this release:

    • Visual whitepoint editor: Opening a second editor on the same display without first dragging the previously opened editor to another display would overwrite the cached profile association for the current display with the visual whitepoint editor temporary profile, thus preventing the correct profile association being restored when the editor was closed.
    • Mac OS X: Fall back to HTTP when downloading X3D viewer components to work around broken Python TLS support.
    • Windows: When installing instrument drivers, catch WMI errors while trying to query device hardware IDs for instruments.
    • Profile loader (Windows): Possibility of unhandled exception when resuming from sleep if the graphics chipset is an Intel integrated HD graphics with more than one attached display device (may affect other graphics chipsets as well).
    2016-11-25 13:35 (UTC) 3.2.1

    3.2.1

    Changed in this release:

    • Profile loader (Windows Vista and later): The profile loader process now auto-starts with the highest available privileges if installed as administrator. This allows changing system default profile associations whenever logged in with administrative privileges.
    • Profile loader (Windows Vista and later): If running under a restricted user account and using system defaults, clicking any of the “Add...”, “Remove” and “Set as default” buttons will allow to restart the profile loader with elevated privileges.
    • Profile loader (Windows): Show profile description in addition to profile file name in profile associations dialog.

    Fixed in this release:

    • Linux, Windows: Visual whitepoint editor was not working in HiDPI mode.
    • Windows: Irritating “File not found” error after installing a profile with special characters in the profile name (note that the profile was installed regardless).
    • [Cosmetic] Standalone executables (Windows): In HiDPI mode, taskbar and task switcher icons could be showing placeholders due to missing icon files.
    • [Minor] Profile loader (Windows): Enable the profile associations dialog “Add...” button irrespective of the current list of profiles being empty.
    • [Minor] Profile loader (Windows): Suppress error message when trying to remove a profile from the active display device if the profile is the system default for said device (and thus cannot be removed unless running as administrator) but not for the current one.
    • Profile loader (Windows): Do not fail to close profile information windows if the profile associations dialog has already been closed.
    • >
    • Profile loader (Windows): If logging into another user account with different DPI settings while keeping the original session running, then logging out of the other account and returning to the original session, the profile loader could deadlock.
    2016-11-19 11:01 (UTC) 3.2

    3.2

    Added in this release:

    • Visual whitepoint editor. This allows visually adjusting the whitepoint on display devices that lack hardware controls as well as match several displays to one another (or a reference). To use it, set the whitepoint to “Chromaticity” on the “Calibration” tab and click the visual whitepoint editor button (you can open as many visual whitepoint editors simultaneously as you like, so that e.g. one can be left unchanged as reference, while the other can be adjusted to match said reference). The editor window can be put into a distraction-free fullscreen mode by maximizing it (press ESC to leave fullscreen again). Adjust the whitepoint using the controls on the editor tool pane until you have achieved a visual match. Then, place your instrument on the measurement area and click “Measure”. The measured whitepoint will be set as calibration target.
    • Another “Auto” testchart slider step with 154 patches (equal to small testchart for LUT profiles) for XYZ LUT + matrix profile type.

    Changed in this release:

    • Menu overhaul. Menus are now better organized using categorized sub-menus and some menu items have been moved to more appropriate locations:
      • The “Options” menu no longer contains any functionality besides actual options. Advanced options have been moved to a sub-menu.
      • Profile creation from existing measurement files or EDID, profile installation as well as profile upload (sharing) functionality can now be found in the “File” menu.
      • Most functionality available in the “Tools” menu has been grouped into categorized sub-menus, with some of the less-used functionality now available under a separate “Advanced” sub-menu.
      • Measuring the selected testchart, enhancing the effective resolution of a colorimetric PCS-to-device table, loading calibration and resetting the video card gamma tables, detecting displays & instruments, as well as user-initiated spectrometer self-calibration functionality has been moved to the “Tools” menu and respective sub-menus where applicable.
    • Changed default curves + matrix profile testchart as well as first “Auto” testchart slider step back to pre-3.1.7 chart with 73 patches.
    • Better curves + matrix profiles as well as faster computation of XYZ LUT + matrix profiles. The matrix and shaper curves of gamma + matrix, curves + matrix as well as XYZ LUT + matrix profiles are now generated in separate steps which improves the shape and grayscale neutrality of the curves on less well-behaved displays. XYZ LUT + matrix profiles will compute faster, because the curves and matrix are created from a sub-set of the profiling patches, and take around the same time as XYZ LUT + swapped matrix profiles, resulting in a typical overall computation speed increase of around +33% (+100% if just looking at the time needed when not creating PCS-to-device tables) for a XYZ LUT + matrix profile computed from 1148 patches. XYZ LUT + matrix profiles computed from more patches should see a larger computation speed increase of up to +100% depending on patch count.
    • Resolve pattern generator and non-native madVR network implementation: Determine the computer's local network IP address in a way that is hopefully more reliable across platforms.
    • Profile loader (Windows): Detect and work-around buggy Intel video drivers which, despite reverting to linear gamma tables at certain points (e.g. UAC prompts), will effectively ignore attempts to restore the gamma table calibration if it is considered to be already loaded by the driver.
    • Profile loader (Windows): Replaced “Open Windows color management settings...” pop-up menu item with own “Profile associations...” implementation. This should work better with multi-display configurations in contrast to Windows' braindead built-in counterpart, i.e. display devices will be listed under their EDID name (if available) as well as their viewport position and size on the virtual desktop and not only their often meaningless generic driver name like “PnP-Monitor”. Also, there won't be multiple entries for the same display device or ambiguous “1|2” identifications if there are display devices that are currently not part of the desktop due to being disabled in Windows display settings. Changing profile associations around is of course still using Windows color management functionality, but the custom UI will look and act more sane than what Windows color management settings has to offer.
    • Profile loader (Windows): Clicking the task bar tray icon will now always show up-to-date (at the time of clicking) information in the notification popup even if the profile loader is disabled.
    • Profile loader (Windows): Starting a new instance of the profile loader will now always attempt to close an already running instance instead of just notifying it, allowing for easy re-starting.
    • Windows (Vista and later): Installing a profile as system default will now automatically turn off “Use my settings for this device” for the current user, so that if the system default profile is changed by another user, the change is propagated to all users that have opted to use the system default profile (which is the whole point of installing a profile as system default).

    Fixed in this release:

    • Spectrometer self-calibration using an i1 Pro or i1 Pro 2 with Argyll >= 1.9 always presented the emissive dark calibration dialog irrespective of measurement mode (but still correctly did a reflective calibration if the measurement mode was one of the high resolution spectrum modes).
    • User-initiated spectrometer self-calibration was not performed if “Allow skipping of spectrometer self-calibration” was enabled in the “Options” menu and the most recent self-calibration was still fresh.
    • Cosmetic: If an update check, colorimeter correction query or profile sharing upload returned a HTTP status code equal to or greater than 400 (server-side error), an unhandled exception was raised instead of presenting a nicer, formatted error dialog (regression of ${APPNAME} 3.1.7 instrument driver installer download related changes).
    • Profile loader (Windows, cosmetic): Reflect changed display resolution and position in UI (doesn't influence functionality).
    • Resolve pattern generator: Unhandled exception if the system hostname could not be resolved to an IP address.
    2016-10-24 10:13 (UTC) 3.1.7.3

    3.1.7.3

    Fixed in this release:

    • 0install (Linux): (un)install-standalone-tools-icons command was broken with 3.1 release.
    • Profile loader (Linux): Unhandled exception if oyranos-monitor is present (regression of late initialization change made in 3.1.7).
    2016-10-21 12:26 (UTC) 3.1.7.2

    3.1.7.2

    Changed in this release:

    • Windows: Toggling the “Load calibration on login” checkbox in the profile installation dialog now also toggles preserving calibration state in the profile loader and vice versa, thus actually affecting if calibration is loaded on login or not (this restores functionality that was lost with the initial ${APPNAME} 3.1 release).
    • Windows: The application, setup and Argyll USB driver installer executables are now digitally signed (starting from October 18, 2016 with SHA-1 digest for 3.1.7.1 and dual SHA-1 and SHA-256 digests for 3.1.7.2 from October 21, 2016).

    Fixed in this release:

    • Profile loader (Windows): User-defined exceptions could be lost if exiting the profile loader followed by (re-)loading settings or restoring defaults in ${APPNAME}.
    2016-10-18 10:00 (UTC) 3.1.7.1

    3.1.7.1

    Fixed in this release:

    • Profile loader (Windows): Setting calibration state to reset video card gamma tables overwrote cached gamma ramps for the 2nd display in a multi-display configuration.
    2016-10-04 20:49 (UTC) 3.1.7

    3.1.7

    Added in this release:

    • 3D LUT sizes 5x5x5 and 9x9x9.
    • JETI spectraval 1511/1501 support (requires ArgyllCMS >= 1.9).
    • Profile loader (Windows): User-definable exceptions.
    • Profile loader (Windows): Added reset-vcgt scripting command (equivalent to selecting “Reset video card gamma table” from the popup menu).

    Changed in this release:

    • “Auto” resolution of PCS-to-device tables is now limited to 45x45x45 to prevent excessive processing times with profiles from “funky” measurements (i.e. due to bad/inaccurate instrument).
    • Automatically optimized testcharts now use curves + matrix profiles for preconditioning to prevent a possible hang while creating the preconditioned testchart with LUT-type profiles from sufficiently “badly behaved” displays.
    • 2nd auto-optimized testchart slider step now defaults to XYZ LUT profile type as well, and the previous patch count was increased from 97 to 271 (necessary for baseline LUT profile accuracy).
    • Adjusted curves + matrix testcharts to only include fully saturated RGB and grayscale to prevent tinted neutrals and/or “rollercoaster” curves on not-so-well behaved displays (also reduces testchart patch count and measurement time, but may worsen the resulting profile's overall accuracy).
    • Removed near-black and near-white 1% grayscale increments from “video” verification charts.
    • Use a 20 second timeout for unresponsive downloads.
    • Windows: Much easier ArgyllCMS instrument driver installation (for instruments that require it). No need to disable driver signature enforcement under Windows 8/10 anymore. Select “Install ArgyllCMS instrument drivers...” from the “Tools” menu, click “Download & install”, wait briefly for the download to finish (400 KB), confirm the User Access Control popup, done. Note that the driver installer executable is currently not digitally signed (obtaining a suitable certificate from a trusted authority is in progress), but the driver itself is signed as usual. The installer is based on libwdi.
    • Profile loader (Windows): Changed apply-profiles scripting command to behave excatly like selecting “Load calibration from current display device profile(s)” from the popup menu, i.e. not only load calibration, but also change the setting.
    • Profile loader (Windows): Also count calibration state being (re)applied when the profile loader state or profile association(s) changes.

    Fixed in this release:

    • Update measurement modes after importing colorimeter corrections. Fixes additional measurement modes for the Spyder4/5 not appearing until the program is restarted or a different instrument is selected first.
    • Trivial: Instrument setup was unnecessarily being called twice after downloading ArgyllCMS when the latter wasn't previously detected.
    • Mac OS X: Work around a wxPython bug which prevents launching the application from a path containing non-ASCII characters.
    • Mac OS X: Work around a configuration problem affecting ArgyllCMS 1.9 and 1.9.1 (fixes Spyder2 firmware, additional Spyder4/5 measurement modes, and imported colorimeter corrections not being seen by DisplayCAL if imported via ArgyllCMS 1.9 or 1.9.1).
    2016-08-24 21:33 (UTC) 3.1.6

    3.1.6

    Added in this release:

    • HDR/SMPTE 2084: Advanced options to specify maximum content light level for roll-off (use with care!) as well as content colorspace (affects perceptual intent gamut mapping, less so colorimetric).

    Changed in this release:

    • Increased timeout to launch ArgyllCMS tools to 20 seconds.
    • Show failed items when otherwise successfully importing colorimeter corrections, and detect updated CCSS files.
    • HDR/SMPTE 2084: Improve overall saturation preservation.
    • Linux/colord: When checking for a valid colord device ID, also try with manufacturer omitted.
    • Windows Vista and later: Use “known folders” API to determine path to “Downloads” directory.

    Fixed in this release:

    • HDR/SMPTE 2084: Slightly too light near-black tones when black output offset was set to below 100%.
    • Synthetic ICC Profile Creator: Undefined variable when creating synthetic profile with custom gamma or BT.1886 and non-zero black level (regression of HDR-related changes made in 3.1.5).
    • When loading settings from a profile created with ${APPNAME} prior to 3.1.5 and custom 3D LUT tone curve gamma in ${APPNAME} 3.1.5, the gamma and output offset controls wouldn't be shown if advanced options weren't enabled until re-selecting the tone curve choice.
    • Cosmetic (Windows 10): Banner would go blank under some Windows 10 configurations when showing the profile or 3D LUT installation dialog.
    • Cosmetic (Linux): Missing backgrounds and wrongly sized combo boxes when wxGTK is built against GTK3.
    • Linux: Profile loader autostart entry was installed under wrong (mixed-case) name if installing for the current user, which lead to the loader unnecesarily being run twice if ${APPNAME} was installed from a RPM or DEB package. The superfluous loader entry will be automatically removed the next time you install a profile, or you can remove it manually by running rm ~/.config/autostart/z-DisplayCAL-apply-profiles.desktop in a terminal.
    • Linux/colord: Don't cache device IDs that are not the result of a successful query.
    • Windows: Make elevated subprocess calls synchronous. Fixes importing colorimeter corrections system-wide not listing all succesfully imported items on the first use.
    2016-08-02 22:28 (UTC) 3.1.5

    3.1.5

    Added in this release:

    • HDR: Allow specifying of black output offset for SMPTE 2084.

    Changed in this release:

    • HDR: Implemented SMPTE 2084 rolloff according to ITU-R BT.2390.
    • HDR: Implemented SMPTE 2084 3D LUT tone mapping (preserve hue and saturation with rolloff).
    • HDR: Improved SMPTE 2084 3D LUT perceptual intent rendering (better preserve saturation). Note that colorimetric intent is recommended and will also do tone mapping.
    • Linux/colord: Increase timeout when querying for newly installed profiles to 20 seconnds.

    Fixed in this release:

    • Minor: HDR peak luminance textbox was sometimes not able to receive focus.
    • Minor (Mac OS X): Don't omit ICC files from compressed archives (regression of adding device link profiles as possible 3D LUT output format in DisplayCAL 3.1.3).
    2016-07-10 23:35 (UTC) 3.1.4

    3.1.4

    Added in this release:

    • A fourth Rec. 709 encompassing color space variant as a profile connection space candidate for XYZ LUT profiles. May lead to better utilization of PCS-to-device color lookup table grid points in some cases (and thus potentially smaller profiles when the effective resolution is set to the default of “Auto”).
    • An option to include legacy serial ports (if any) in detected instruments.
    • SMPTE 2084 (HDR) as 3D LUT tone curve choice.

    Changed in this release:

    • Don't preserve shaper curves in ICC device link profiles if selected as 3D LUT output format (effectively matching other 3D LUT formats).
    • Removed “Prepress” preset due to large overlap with “Softproof”.
    • Changed “Softproof” preset to use 5800K whitepoint target (in line with Fogra softproof handbook typical photography workflow suggested starting point value) and automatic black point hue correction.
    • Synthetic ICC profile creator: Changed SMPTE 2084 to always clip (optionally with roll-off) if peak white is below 10000 cd/m².
    • Synthetic ICC profile creator: Changed transition to specified black point of generated profiles to be consistent with BT.1886 black point blending (less gradual transition, blend over to specified black point considerably closer to black).
    • Profile loader (Windows): If no profile assigned, load implicit linear calibration.

    Fixed in this release:

    • When loading settings from an existing profile, some CIECAM02 advanced profiling options were not recognized correctly.
    • Don't accidentally remove the current display profile if ArgyllCMS is older than version 1.1 or the ArgyllCMS version is not included in the first line of output due to interference with QuickKeys under Mac OS X.
    • Make sure the ArgyllCMS version is detected even if it isn't contained in the first line of output (fixes ArgyllCMS version not being detected if QuickKeys Input Manager is installed under Mac OS X).
    • When loading settings, add 3D LUT input profile to selector if not yet present.
    • Curve viewer/profile information: Fix potential division by zero error when graphing unusual curves (e.g. non-monotonic or with very harsh bends).
    • Profile information: Reset right pane row background color on each profile load (fixes “named color” profile color swatches sticking even after loading a different profile).
    2016-04-11 10:50 (UTC) 3.1.3.1

    3.1.3.1

    Changed in this release:

    • Updated traditional chinese localization (work-in-progress, thanks to 楊添明).
    • Windows: If madTPG is set to fullscreen and there's more than one display connected, don't temporarily override fullscreen if interactive display adjustment is enabled.

    Fixed in this release:

    • Windows: If interactive display adjustment is disabled and madTPG is set to fullscreen, show instrument placement countdown messages in madTPG OSD.
    • Windows: Restore madTPG fullscreen button state on disconnect if it was temporarily overridden.
    • Profile loader (Windows): Error message when right-clicking the profile loader task tray icon while ${APPNAME} is running.
    2016-04-09 12:16 (UTC) 3.1.3

    3.1.3

    Si vous faites la mise à jour depuis ${APPNAME} 3.1/3.1.1/3.1.2 autonome sous Windows en utilisant l’installateur , veuillez fermer vous-même le chargeur de profil (s’il est en cours de fonctionnement) avant de lancer la configuration – en raison d’un bogue malencontreux, l’installateur peut ne pas pouvoir se fermer et redémarrer automatiquement le chargeur de profil, ce qui peut alors demander l’utilisation du gestionnaire de tâches pour arrêter le chargeur de profil. Désolé pour la gêne.

    Added in this release:

    • Device link profile as possible 3D LUT output format.
    • French ReadMe (thanks to Jean-Luc Coulon).
    • Partial traditional chinese localization (work-in-progress, thanks to 楊添明).
    • When you change the language in ${APPNAME}, the Windows Profile Loader will follow on-the-fly if running.
    • Synthetic ICC profile creator: Capability to specify profile class, technology and colorimetric image state.
    • Windows: When the display configuration is changed while ${APPNAME} is running, automatically re-enumerate displays, and load calibration if using the profile loader.
    • Profile loader (Windows): Starting the loader with the --oneshot argument will make it exit after launching.

    Changed in this release:

    • Updated ReShade 3D LUT installation instructions in the ReadMe.
    • Improved “Enhance effective resolution of PCS to device tables” smoothing accuracy slightly.
    • Profile loader (Windows):
      • Detect CPKeeper (Color Profile Keeper) and HCFR.
      • Show any calibration loading errors on startup or display/profile change in a notification popup, and also reflect this with a different icon.

    Fixed in this release:

    • Added semicolon (“;”) to disallowed profile name characters.
    • ICC profile objects were leaking memory.
    • Windows: Made sure that the virtual console size is not larger than the maximum allowed size (fixes possible inability to launch ArgyllCMS tools on some systems if the Windows scaling factor was equal to or above 175%).
    • Windows (Vista and newer): Use system-wide profiles if per-user profiles are disabled.
    • Profile loader (Windows):
      • If Windows calibration management is enabled (not recommended!), correctly reflect the disabled state of the profile loader in the task tray icon and don't load calibration when launching the profile loader (but keep track of profile assignment changes).
      • Prevent a race condition when “Fix profile associations automatically” is enabled and changing the display configuration, which could lead to wrong profile associations not being fixed.
      • Sometimes the loader did not exit cleanly if using taskkill or similar external methods.
      • Prevent a race condition where the loader could try to access a no longer available display device right after a display configuration change, which resulted in no longer being able to influence the calibration state (requiring a loader restart to fix).
      • Profile loader not reacting to display changes under Windows XP.
    2016-03-03 22:33 (UTC) 3.1.2

    3.1.2

    Fixed in this release:

    • Profile loader (Windows): Pop-up wouldn't work if task bar was set to auto-hide.
    2016-02-29 17:42 (UTC) 3.1.1

    3.1.1

    Added in this release:

    • Profile loader (Windows): Right-click menu items to open Windows color management and display settings.

    Changed in this release:

    • Profile loader (Windows):
      • Detect f.lux and dispcal/dispread when running outside ${APPNAME}.
      • Don't notify on launch or when detecting DisplayCAL or madVR.
      • Detect madVR through window enumeration instead of via madHcNet (so madVR can be updated without having to close and restart the profile loader).
      • Enforce calibration state periodically regardless of video card gamma table state.
      • Don't use Windows native notifications to overcome their limitations (maximum number of lines, text wrapping).
      • Show profile associations and video card gamma table state in notification popup.

    Fixed in this release:

    • Error after measurements when doing verification with “Untethered” selected as display device and using a simulation profile (not as target).
    • Windows: Sporadic application errors on logout/reboot/shutdown on some systems when ${APPNAME} or one of the other applications was still running.
    • Standalone installer (Windows): Remove dispcalGUI program group entries on upgrade.
    • Profile loader (Windows):
      • Error when trying to enable “Fix profile associations automatically” when one or more display devices don't have a profile assigned.
      • Sporadic errors related to taskbar icon redraw on some systems when showing a notification after changing the display configuration (possibly a wxPython/wxWidgets bug).
    • Mac OS X: Application hang when trying to quit while the testchart editor had unsaved changes.
    2016-02-01 00:32 (UTC) 3.1

    3.1

    dispcalGUI has been renamed to ${APPNAME}.

    If you upgrade using 0install under Linux: It is recommended that you download the respective ${APPNAME}-0install package for your distribution and install it so that the applications accessible via the menu of your desktop environment are updated properly.

    If you upgrade using 0install under Mac OS X: It is recommended that you delete existing dispcalGUI application icons, then download the ${APPNAME}-0install.dmg disk image to get updated applications.

    Added in this release:

    • Better HiDPI support. All text should now be crisp on HiDPI displays (with the exception of axis labels on curve and gamut graphs under Mac OS X). Icons will be scaled according to the scaling factor or DPI set in the display settings under Windows, or the respective (font) scaling or DPI system setting under Linux. Icons will be scaled down or up from their 2x version if a matching size is not available. Note that support for crisp icons in HiDPI mode is currently not available in the GTK3 and Mac OS X port of wxPython/wxWidgets. Also note that if you run a multi-monitor configuration, the application is system-DPI aware but not per-monitor-DPI aware, which is a limitation of wxPython/wxWidgets (under Windows, you will need to log out and back in after changing DPI settings for changes to take effect in ${APPNAME}).
    • When having created a compressed archive of a profile and related files, it can now also be imported back in via drag'n'drop or the “Load settings...” menu entry and respective button.
    • ArgyllCMS can be automatically downloaded and updated.
    • A compressed logs archive can be created from the log window.
    • Windows: New profile loader. It will stay in the taskbar tray and automatically reload calibration if the display configuration changes or if the calibration is lost (although fullscreen Direct3D applications can still override the calibration). It can also automatically fix profile associations when switching from a multi-monitor configuration to a single display and vice versa (only under Vista and later). In addition, the profile loader is madVR-aware and will disable calibration loading if it detects e.g. madTPG or madVR being used by a video player.

    Changed in this release:

    • Changed default calibration speed from “Medium” to “Fast”. Typically this cuts calibration time in half, while the accuracy difference is negligible at below 0.2 delta E.
    • Enabled “Enhance effective resolution of PCS to device tables” and smoothing for L*a*b* LUT profiles.

    Fixed in this release:

    • In some cases, importing colorimeter corrections from the vendor software CD could fail (falling back to downloading them from the web).
    • Moving the auto testchart patches slider to a value that changed the profile type did not update BPC accordingly (shaper+matrix defaults to BPC on).
    • Minor: Safari/IE messed up positioning of CCT graph vertical axis labels in measurement reports.
    • Minor: When clicking the “Install profile” button while not on the 3D LUT tab, and “Create 3D LUT after profiling” is enabled, don't create a 3D LUT.
    • Minor: When changing profile type, only change the selected testchart if needed, and default to “Auto” for all profile types.
    • Minor: 1st launch defaults were slightly different from what was intended (testchart should be “Auto”).
    • Minor: Use OS line separator when writing configuration files.
    • Linux: Text and icon sizes should be more consistent accross the application when the system text scaling or DPI has been adjusted (application restart required).
    • Linux: Fall back to use the XrandR display name for colord device IDs if EDID is not available.
    • Linux/Mac OS X: madVR test pattern generator interface was prone to connection failures due to a race condition. Also, verifying a madVR 3D LUT didn't work.

    View changelog entries for older versions

    Definitions

    [1] CGATS
    Graphic Arts Technologies Standards, CGATS.5 Data Exchange Format (ANSI CGATS.5-1993 Annex J) = Normes des technologies des arts graphiques, CGATS.5 Format d’échange de données
    [2] CMM / CMS
    Color Management Module / Color Management System = Module de correspondance des couleurs / Système de Gestion de la Couleur — fr.wikipedia.org/wiki/Gestion_de_la_couleur
    [3] GPL
    GNU General Public License = Licence Publique Générale — gnu.org/licenses/gpl-3.0.fr.html
    [4] GUI
    Graphical User Interface = Interface utilisateur graphique
    [5] ICC
    International Color Consortium = Consortium International de la Couleur — color.org
    [6] JSON
    JavaScript Object Notation = Notation Object issue de Javascript. Format léger d’échange de données — json.org
    [7] LUT
    Look Up Table = Table de correspondance — fr.wikipedia.org/wiki/Table_de_correspondance
    [8] SVN
    Subversion, Système de gestion de versions — subversion.tigris.org ; fr.wikipedia.org/wiki/Apache_Subversion
    [9] UAC
    User Account Control = Contrôle de compte de l’utilisateur — fr.wikipedia.org/wiki/User_Account_Control
    [10] EDID
    Extended Display Identification Data = Données étendues d’identification d’écran — fr.wikipedia.org/wiki/Extended_Display_Identification_Data
    [11] PCS
    Profile Connection Space = Espace de connexion des profils — fr.wikipedia.org/wiki/Gestion_de_la_couleur
    [12] UEFI
    Unified Extensible Firmware Interface = Interface extensible de micrologiciel unifiée — fr.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface

    DisplayCAL-3.5.0.0/misc/README.template.html0000644000076500000000000124053113242313541020072 0ustar devwheel00000000000000 ${APPNAME}—Open Source Display Calibration and Characterization powered by ArgyllCMS

    If you'd like to measure color on the go, you may also be interested in ArgyllPRO ColorMeter by Graeme Gill, author of ArgyllCMS. Available for Android from the Google Play store. Check out the 2 Minute Overview + Guided Tour Video.

    About ${APPNAME}

    ${APPNAME} (formerly known as dispcalGUI) is a display calibration and profiling solution with a focus on accuracy and versatility (in fact, the author is of the honest opinion it may be the most accurate and versatile ICC compatible display profiling solution available anywhere). At its core it relies on ArgyllCMS, an open source color management system, to take measurements, create calibrations and profiles, and for a variety of other advanced color related tasks.

    Calibrate and characterize your display devices using one of many supported measurement instruments, with support for multi-display setups and a variety of available options for advanced users, such as verification and reporting functionality to evaluate ICC profiles and display devices, creating video 3D LUTs, as well as optional CIECAM02 gamut mapping to take into account varying viewing conditions. Other features include:

    • Support of colorimeter corrections for different display device types to increase the absolute accuracy of colorimeters. Corrections can be imported from vendor software or created from measurements if a spectrometer is available.
    • Check display device uniformity via measurements.
    • Test chart editor: Create charts with any amount and composition of color patches, easy copy & paste from CGATS, CSV files (only tab-delimited) and spreadsheet applications, for profile verification and evaluation.
    • Create synthetic ICC profiles with custom primaries, white- and blackpoint as well as tone response for use as working spaces or source profiles in device linking (3D LUT) transforms.
    ${APPNAME} is developed and maintained by Florian Höch, and would not be possible without ArgyllCMS, which is developed and maintained by Graeme W. Gill.

    Screenshots


    Display & instrument settings

    Calibration settings

    Profiling settings


    3D LUT settings

    Verification settings

    Testchart editor


    Display adjustment

    Profile information

    Calibration curves


    KDE5

    Mac OS X

    Windows 10

    Disclaimer

    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.

    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.

    ${APPNAME} is written in Python and uses the 3rd-party packages NumPy, demjson (JSON[6] library), wxPython (GUI[4] toolkit), as well as Python extensions for Windows and the Python WMI module to provide Windows-specific functionality. Other minor dependencies include PyChromecast, comtypes and pyglet. It makes extensive use of and depends on functionality provided by ArgyllCMS. The build system to create standalone executables additionally uses setuptools and py2app on Mac OS X or py2exe on Windows. All of these software packages are © by their respective authors.

    Get ${APPNAME} standalone

    • For Linux

      Native packages for several distributions are available via openSUSE Build Service:

      Packages made for older distributions may work on newer distributions as long as nothing substantial has changed (i.e. Python version). Also there are several distributions out there that are based on one in the above list (e.g. Linux Mint which is based on Ubuntu). This means that packages for that base distribution should also work on derivatives, you just need to know which version the derivative is based upon and pick your download accordingly.

    • For Mac OS X (10.6 or newer)

      Disk image

      Note that due to Mac OS X App Translocation (since 10.12 Sierra), you may need to remove the “quarantine” flag from the non-main standalone application bundles after you have copied them to your computer before you can successfully run them. E.g. if you copied them to /Applications/${APPNAME}-${VERSION}/, open Terminal and run the following command: xattr -dr com.apple.quarantine /Applications/${APPNAME}-${VERSION}/*.app

      To verify the integrity of the downloaded file, compare its SHA-256 checksum to that of the respective entry in the SHA-256 checksum list. To obtain the checksum of the downloaded file, run the following command in Terminal: shasum -a 256 /Users/Your Username/Downloads/${APPNAME}-${VERSION}.dmg

    • For Windows (XP or newer)

      Installer (recommended) or ZIP archive

      To verify the integrity of the downloaded file, compare its SHA-256 checksum to that of the respective entry in the SHA-256 checksum list (case does not matter). To obtain the checksum of the downloaded file, run the following command in a Windows PowerShell command prompt: get-filehash -a sha256 C:\Users\Your Username\Downloads\${APPNAME}-${VERSION}-[Setup.exe|win32.zip]

    • Source code

      You need to have a working Python installation and all requirements.

      Source Tarball

      To verify the integrity of the downloaded file, compare its SHA-256 checksum to that of the respective entry in the SHA-256 checksum list. To obtain the checksum of the downloaded file, run the following command:
      Linux: sha256sum /home/Your Username/Downloads/${APPNAME}-${VERSION}.tar.gz
      macOS: shasum -a 256 /Users/Your Username/Downloads/${APPNAME}-${VERSION}.tar.gz
      Windows (PowerShell command prompt): get-filehash -a sha256 C:\Users\Your Username\Downloads\${APPNAME}-${VERSION}.tar.gz

      Alternatively, if you don't mind trying out development code, browse the SVN[8] repository of the latest development version (or do a full checkout using svn checkout svn://svn.code.sf.net/p/dispcalgui/code/trunk ${APPNAME_LOWER}). But please note that the development code might contain bugs or not run at all, or only on some platform(s). Use at your own risk.

    Please continue with the Quickstart Guide.

    Get ${APPNAME} via Zero Install

    • Brief introduction to Zero Install

      (Note: Usually you do not have to install Zero Install separately, it is handled automatically by the ${APPNAME} downloads linked below. The following paragraph is only informational.)

      Zero Install is a decentralised cross-platform software installation system. The benefits you get from Zero Install are:

      • Always up-to-date. Zero Install automatically keeps all software updated.
      • Easily switch between software versions from within Zero Install if desired.
      • No administrator rights needed to add or update software (*).

      * Note: Installing/updating Zero Install itself or software dependencies through the operating system's mechanisms may require administrative privileges.

    • For Linux

      Native packages for several distributions are available via openSUSE Build Service:

      Please note:

      • The version number in the package name does not necessarily reflect the ${APPNAME} version.

      Packages made for older distributions may work on newer distributions as long as nothing substantial has changed (i.e. Python version). Also there are several distributions out there that are based on one in the above list (e.g. Linux Mint which is based on Ubuntu). This means that packages for that base distribution should also work on derivatives, you just need to know which version the derivative is based upon and pick your download accordingly. In all other cases, please try the instructions below or one of the standalone installations.

      Alternate installation method

      If your distribution is not listed above, please follow these instructions:

      1. Install the 0install or zeroinstall-injector package from your distribution. In case it is not available, there are pre-compiled generic binaries. Download the appropriate archive for your system, unpack it, cd to the extracted folder in a terminal, and run sudo ./install.sh local to install to /usr/local, or ./install.sh home to install to your home directory (you may have to add ~/bin to your PATH variable in that case). You'll need libcurl installed (most systems have it by default).
      2. Choose the 0install entry from the applications menu (older versions of Zero Install will have an “Add New Program” entry instead).
      3. Drag ${APPNAME}'s Zero Install feed link to the Zero Install window.

      Note on ${APPNAME}'s standalone tools under Linux (3D LUT maker, curve viewer, profile information, synthetic profile creator, testchart editor, VRML to X3D converter): If using the alternate installation method, an application icon entry will only be created for ${APPNAME} itself. This is currently a limitation of Zero Install under Linux. You can manually install icon entries for the standalone tools by running the following in a terminal:

      0launch --command=install-standalone-tools-icons \
      ${HTTPURL}0install/${APPNAME}.xml

      And you may uninstall them again with:

      0launch --command=uninstall-standalone-tools-icons \
      ${HTTPURL}0install/${APPNAME}.xml
    • For Mac OS X (10.5 or newer)

      Download the ${APPNAME} Zero Install Launcher disk image and run any of the included applications.

      To verify the integrity of the downloaded file, compare its SHA-256 checksum to that of the respective entry in the SHA-256 checksum list. To obtain the checksum of the downloaded file, run the following command in Terminal: shasum -a 256 /Users/Your Username/Downloads/${APPNAME}-0install.dmg

    • For Windows (XP or newer)

      Download and install the ${APPNAME} Zero Install Setup: Administrator install | Per-user install.

      To verify the integrity of the downloaded file, compare its SHA-256 checksum to that of the respective entry in the SHA-256 checksum list (case does not matter). To obtain the checksum of the downloaded file, run the following command in a Windows PowerShell command prompt: get-filehash -a sha256 C:\Users\Your Username\Downloads\${APPNAME}-0install-Setup[-per-user].exe

    • Manually updating or switching between software versions

      Updates are normally applied automatically. If you want to manually update or switch between software versions, please follow the instructions below.

      • Linux

        Choose the 0install entry from the applications menu (older versions of Zero Install will have a “Manage Programs” entry instead). In the window that opens, right-click the ${APPNAME} icon and select “Choose versions” (with older versions of Zero Install, you have to click the small “Update or change version” icon below the “Run” button instead). You can then click the “Refresh all” button to update, or click the small button to the right of an entry and select “Show versions”.

        To select a specific software version, click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

      • Mac OS X

        Run the 0install Launcher. In the window that opens, click the “Refresh all” button to update, or click the small button to the right of an entry and select “Show versions”.

        To select a specific software version, click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

      • Windows

        Choose the Zero Install entry from the start page under Windows 8, or the respective subfolder of the programs folder in the start menu under Windows 10, Windows 7 and earlier, and switch to the “My Applications” tab in the window that opens. Click the small “down” arrow inside the “Start” button to the right of the ${APPNAME} entry and choose “Update” or “Select version”.

        To select a specific software version, click on the “change” link next to an item, then click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

    Please continue with the Quickstart Guide.

    Quickstart guide

    This short guide intends to get you up and running quickly, but if you run into a problem, please refer to the full prerequisites and installation sections.

    1. Launch ${APPNAME}. If it cannot find ArgyllCMS on your computer, it will prompt you to automatically download the latest version or select the location manually.

    2. Windows only: If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10, you need to install an Argyll-specific driver before continuing (the specbos, spectraval and K-10 may require the FTDI virtual COM port driver instead). Select “Install ArgyllCMS instrument drivers...” from the “Tools” menu. See also “Instrument driver installation under Windows”.

      Mac OS X only: If you want to use the HCFR colorimeter, follow the instructions in the “HCFR Colorimeter” section under “Installing ArgyllCMS on Mac OS X” in the ArgyllCMS documentation before continuing.

      Connect your measurement device to your computer.

    3. Click the small icon with the swirling arrow in between the “Display device” and “Instrument” controls to detect connected display devices and instruments. The detected instrument(s) should show up in the “Instrument” dropdown.

      If your measurement device is a Spyder 2, a popup dialog will show which will let you enable the device. This is required to be able to use the Spyder 2 with ArgyllCMS and ${APPNAME}.

      If your measurement device is a i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, a popup dialog will show and allow you to import generic colorimeter corrections from the vendor software which may help measurement accuracy on the type of display you're using. After importing, they are available under the “Correction” dropdown, where you can choose one that fits the type of display you have, or leave it at “Auto” if there is no match. Note: Importing from the Spyder 4/5 software enables additional measurement modes for that instrument.

    4. Click “Calibrate & profile”. That's it!

      Feel free to check out the Wiki for guides and tutorials, and refer to the documentation for advanced usage instructions (optional).

      Linux only: If you can't access your instrument, choose “Install ArgyllCMS instrument configuration files...” from the “Tools” menu (if that menu item is grayed out, the ArgyllCMS version you're currently using has probably been installed from the distribution's repository and should already be setup correctly for instrument access). If you still cannot access the instrument, try unplugging and reconnecting it, or a reboot. If all else fails, read “Installing ArgyllCMS on Linux: Setting up instrument access” in the ArgyllCMS documentation.

    System requirements and other prerequisites

    General system requirements

    • A recent Linux, Mac OS X (10.6 or newer for the standalone version, 10.5 or newer for the 0install version) or Windows (XP/Server 2003 or newer) operating system.
    • A graphics card with at least 24 bits per pixel (true color) support and the desktop set up to use this color depth.

    ArgyllCMS

    To use ${APPNAME}, you need to download and install ArgyllCMS (1.0 or newer).

    Supported instruments

    You need one of the supported instruments to make measurements. All instruments supported by ArgyllCMS are also supported by ${APPNAME}. For display readings, these currently are:

    Colorimeters

    • CalMAN X2 (treated as i1 Display 2)
    • Datacolor/ColorVision Spyder 2
    • Datacolor Spyder 3 (since ArgyllCMS 1.1.0)
    • Datacolor Spyder 4 (since ArgyllCMS 1.3.6)
    • Datacolor Spyder 5 (since ArgyllCMS 1.7.0)
    • Hughski ColorHug (Linux support since ArgyllCMS 1.3.6, Windows support with newest ColorHug firmware since ArgyllCMS 1.5.0, fully functional Mac OS X support since ArgyllCMS 1.6.2)
    • Hughski ColorHug2 (since ArgyllCMS 1.7.0)
    • Image Engineering EX1 (since ArgyllCMS 1.8.0)
    • Klein K10-A (since ArgyllCMS 1.7.0. The K-1, K-8 and K-10 are also reported to work)
    • Lacie Blue Eye (treated as i1 Display 2)
    • Sencore ColorPro III, IV & V (treated as i1 Display 1)
    • Sequel Imaging MonacoOPTIX/Chroma 4 (treated as i1 Display 1)
    • X-Rite Chroma 5 (treated as i1 Display 1)
    • X-Rite ColorMunki Create (treated as i1 Display 2)
    • X-Rite ColorMunki Smile (since ArgyllCMS 1.5.0)
    • X-Rite DTP92
    • X-Rite DTP94
    • X-Rite/GretagMacbeth/Pantone Huey
    • X-Rite/GretagMacbeth i1 Display 1
    • X-Rite/GretagMacbeth i1 Display 2/LT (the HP DreamColor/Advanced Profiling Solution versions of the instrument are also reported to work)
    • X-Rite i1 Display Pro, ColorMunki Display (since ArgyllCMS 1.3.4. The HP DreamColor, NEC SpectraSensor Pro and SpectraCal C6 versions of the instrument are also reported to work)

    Spectrometers

    • JETI specbos 1211/1201 (since ArgyllCMS 1.6.0)
    • JETI spectraval 1511/1501 (since ArgyllCMS 1.9.0)
    • X-Rite ColorMunki Design/Photo (since ArgyllCMS 1.1.0)
    • X-Rite/GretagMacbeth i1 Monitor (since ArgyllCMS 1.0.3)
    • X-Rite/GretagMacbeth i1 Pro (the EFI ES-1000 version of the instrument is also reported to work)
    • X-Rite i1 Pro 2 (since ArgyllCMS 1.5.0)
    • X-Rite/GretagMacbeth Spectrolino
    • X-Rite i1Studio (since ArgyllCMS 2.0)

    If you've decided to buy a color instrument because ArgyllCMS supports it, please let the dealer and manufacturer know that “You bought it because ArgyllCMS supports it”—thanks.

    Note that the i1 Display Pro and i1 Pro are very different instruments despite their naming similarities.

    Also there are currently (2014-05-20) five instruments (or rather, packages) under the ColorMunki brand, two of which are spectrometers, and three are colorimeters (not all of them being recent offerings, but you should be able to find them used in case they are no longer sold new):

    • The ColorMunki Design and ColorMunki Photo spectrometers differ only in the functionality of the bundled vendor software. There are no differences between the instruments when used with ArgyllCMS and ${APPNAME}.
    • The ColorMunki Display colorimeter is a less expensive version of the i1 Display Pro colorimeter. It comes bundled with a simpler vendor software and has longer measurement times compared to the i1 Display Pro. Apart from that, the instrument appears to be virtually identical.
    • The ColorMunki Create and ColorMunki Smile colorimeters are similar hardware as the i1 Display 2 (with the ColorMunki Smile no longer having a built-in correction for CRT but for white LED backlit LCD instead).

    Additional requirements for unattended calibration and profiling

    When using a spectrometer that is supported by the unattended feature (see below), having to take the instrument off the screen to do a sensor self-calibration again after display calibration before starting the measurements for profiling may be avoided if the menu item “Allow skipping of spectrometer self-calibration” under the “Advanced” sub-menu in the “Options” menu is checked (colorimeter measurements are always unattended because they generally do not require a sensor calibration away from the screen, with the exception of the i1 Display 1).

    Unattended calibration and profiling currently supports the following spectrometers in addition to most colorimeters:

    • X-Rite ColorMunki Design/Photo
    • X-Rite/GretagMacbeth i1 Monitor & Pro
    • X-Rite/GretagMacbeth Spectrolino
    • X-Rite i1 Pro 2
    • X-Rite i1Studio

    Be aware you may still be forced to do a sensor calibration if the instrument requires it. Also, please look at the possible caveats.

    Additional requirements for using the source code

    You can skip this section if you downloaded a package, installer, ZIP archive or disk image of ${APPNAME} for your operating system and do not want to run from source.

    All platforms:

    • Python >= v2.6 <= v2.7.x (2.7.x is the recommended version. Mac OS X users: If you want to compile ${APPNAME}'s C extension module, it is advisable to first install XCode and then the official python.org Python)
    • NumPy
    • wxPython GUI[4] toolkit

    Windows:

    Additional requirements for compiling the C extension module

    Normally you can skip this section as the source code contains pre-compiled versions of the C extension module that ${APPNAME} uses.

    Linux:

    • GCC and development headers for Python + X11 + Xrandr + Xinerama + Xxf86vm if not already installed, they should be available through your distribution's packaging system

    Mac OS X:

    • XCode
    • py2app if you want to build a standalone executable. On Mac OS X before 10.5, install setuptools first: sudo python util/ez_setup.py setuptools

    Windows:

    • a C-compiler (e.g. MS Visual C++ Express or MinGW. If you're using the official python.org Python 2.6 or later I'd recommend Visual C++ Express as it works out of the box)
    • py2exe if you want to build a standalone executable

    Running directly from source

    After satisfying all additional requirements for using the source code, you can simply run any of the included .pyw files from a terminal, e.g. python2 ${APPNAME}.pyw, or install the software so you can access it via your desktop's application menu with python2 setup.py install. Run python2 setup.py --help to view available options.

    One-time setup instructions for source code checked out from SVN:

    Run python2 setup.py to create the version file so you don't see the update popup at launch.

    If the pre-compiled extension module that is included in the sources does not work for you (in that case you'll notice that the movable measurement window's size does not closely match the size of the borderless window generated by ArgyllCMS during display measurements) or you want to re-build it unconditionally, run python2 setup.py build_ext -i to re-build it from scratch (you need to satisfy the requirements for compiling the C extension module first).

    Installation

    It is recommended to first remove all previous versions unless you used Zero Install to get them.

    Instrument driver installation under Windows

    You only need to install the Argyll-specific driver if your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10 (the latter two may require the FTDI virtual COM port driver instead).

    To automatically install the Argyll-specific driver that is needed to use some instruments, launch ${APPNAME} and select “Install ArgyllCMS instrument drivers...” from the “Tools” menu. Alternatively, follow the manual instructions below.

    If you are using Windows 8, 8.1, or 10, you need to disable driver signature enforcement before you can install the driver. If Secure Boot is enabled in the UEFI[12] setup, you need to disable it first. Refer to your mainboard or firmware manual how to go about this. Usually entering the firmware setup requires holding the DEL key when the system starts booting.

    Method 1: Disable driver signature enforcement temporarily

    1. Windows 8/8.1: Go to “Settings” (hover the lower right corner of the screen, then click the gear icon) and select “Power” (the on/off icon).
      Windows 10: Click the “Power” button in the start menu.
    2. Hold the SHIFT key down and click “Restart”.
    3. Select “Troubleshoot” → “Advanced Options” → “Startup Settings” → “Restart”
    4. After reboot, select “Disable Driver Signature Enforcement” (number 7 on the list)

    Method 2: Disable driver signature enforcement permanently

    1. Open an elevated command prompt. Search for “Command Prompt” in the Windows start menu, right-click and select “Run as administrator”
    2. Run the following command: bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS
    3. Run the following command: bcdedit /set TESTSIGNING ON
    4. Reboot

    To install the Argyll-specific driver that is needed to use some instruments, launch Windows' Device Manager and locate the instrument in the device list. It may be underneath one of the top level items. Right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer”, “Have Disk...”, browse to the Argyll_VX.X.X\usb folder, open the ArgyllCMS.inf file, click OK, and finally confirm the Argyll driver for your instrument from the list.

    To switch between the ArgyllCMS and vendor drivers, launch Windows' Device Manager and locate the instrument in the device list. It may be underneath one of the top level items. Right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the Argyll driver for your instrument from the list.

    Linux package (.deb/.rpm)

    A lot of distributions allow easy installation of packages via the graphical desktop, i.e. by double-clicking the package file's icon. Please consult your distribution's documentation if you are unsure how to install packages.

    If you cannot access your instrument, first try unplugging and reconnecting it, or a reboot. If that doesn't help, read “Installing ArgyllCMS on Linux: Setting up instrument access”.

    Mac OS X

    Mount the disk image and option-drag its icon to your “Applications” folder. Afterwards open the “${APPNAME}” folder in your “Applications” folder and drag ${APPNAME}'s icon to the dock if you want easy access.

    If you want to use the HCFR colorimeter under Mac OS X, follow the instructions under “installing ArgyllCMS on Mac OS X” in the ArgyllCMS documentation.

    Windows (Installer)

    Launch the installer which will guide you trough the required setup steps.

    If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10, you need to install an Argyll-specific driver (the specbos, spectraval and K-10 may require the FTDI virtual COM port driver instead). See “Instrument driver installation under Windows”.

    Windows (ZIP archive)

    Unpack and then simply run ${APPNAME} from the created folder.

    If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10, you need to install an Argyll-specific driver (the specbos, spectraval and K-10 may require the FTDI virtual COM port driver instead). See “Instrument driver installation under Windows”.

    Source code (all platforms)

    See the “Prerequisites” section to run directly from source.

    Starting with ${APPNAME} 0.2.5b, you can use standard distutils/setuptools commands with setup.py to build, install, and create packages. sudo python setup.py install will compile the extension modules and do a standard installation. Run python setup.py --help or python setup.py --help-commands for more information. A few additional commands and options which are not part of distutils or setuptools (and thus do not appear in the help) are also available:

    Additional setup commands

    0install
    Create/update 0install feeds and create Mac OS X application bundles to run those feeds.
    appdata
    Create/update AppData file.
    bdist_appdmg (Mac OS X only)
    Creates a DMG of previously created (by the py2app or bdist_standalone commands) application bundles, or if used together with the 0install command.
    bdist_deb (Linux/Debian-based)
    Create an installable Debian (.deb) package, much like the standard distutils command bdist_rpm for RPM packages. Prerequisites: You first need to install alien and rpmdb, create a dummy RPM database via sudo rpmdb --initdb, then edit (or create from scratch) the setup.cfg (you can have a look at misc/setup.ubuntu9.cfg for a working example). Under Ubuntu, running utils/dist_ubuntu.sh will automatically use the correct setup.cfg. If you are using Ubuntu 11.04 or any other debian-based distribution which has Python 2.7 as default, you need to edit /usr/lib/python2.7/distutils/command/bdist_rpm.py, and change the line install_cmd = ('%s install -O1 --root=$RPM_BUILD_ROOT ' to install_cmd = ('%s install --root=$RPM_BUILD_ROOT ' by removing the -O1 flag. Also, you need to change /usr/lib/rpm/brp-compress to do nothing (e.g. change the file contents to exit 0, but don't forget to create a backup copy first) otherwise you will get errors when building.
    bdist_pyi
    An alternative to bdist_standalone, which uses PyInstaller instead of bbfreeze/py2app/py2exe.
    bdist_standalone
    Creates a standalone application that does not require a Python installation. Uses bbfreeze on Linux, py2app on Mac OS X and py2exe on Windows. setup.py will try and automatically download/install these packages for you if they are not yet installed and if not using the --use-distutils switch. Note: On Mac OS X, older versions of py2app (before 0.4) are not able to access files inside python “egg” files (which are basically ZIP-compressed folders). Setuptools, which is needed by py2app, will normally be installed in “egg” form, thus preventing those older py2app versions from accessing its contents. To fix this, you need to remove any installed setuptools-<version>-py<python-version>.egg files from your Python installation's site-packages directory (normally found under /Library/Frameworks/Python.framework/Versions/Current/lib). Then, run sudo python util/ez_setup.py -Z setuptools which will install setuptools unpacked, thus allowing py2app to acces all its files. This is no longer an issue with py2app 0.4 and later.
    buildservice
    Creates control files for openSUSE Build Service (also happens implicitly when invoking sdist).
    finalize_msi (Windows only)
    Adds icons and start menu shortcuts to the MSI installer previously created with bdist_msi. Successful MSI creation needs a patched msilib (additional information).
    inno (Windows only)
    Creates Inno Setup scripts which can be used to compile setup executables for standalone applications generated by the py2exe or bdist_standalone commands and for 0install.
    purge
    Removes the build and ${APPNAME}.egg-info directories including their contents.
    purge_dist
    Removes the dist directory and its contents.
    readme
    Creates README.html by parsing misc/README.template.html and substituting placeholders like date and version numbers.
    uninstall
    Uninstalls the package. You can specify the same options as for the install command.

    Additional setup options

    --cfg=<name>
    Use an alternate setup.cfg, e.g. tailored for a given Linux distribution. The original setup.cfg is backed up and restored afterwards. The alternate file must exist as misc/setup.<name>.cfg
    -n, --dry-run
    Don't actually do anything. Useful in combination with the uninstall command to see which files would be removed.
    --skip-instrument-configuration-files
    Skip installation of udev rules and hotplug scripts.
    --skip-postinstall
    Skip post-installation on Linux (an entry in the desktop menu will still be created, but may not become visible until logging out and back in or rebooting) and Windows (no shortcuts in the start menu will be created at all).
    --stability=stable | testing | developer | buggy | insecure
    Set the stability for the implementation that is added/updated via the 0install command.
    --use-distutils
    Force setup to use distutils (default) instead of setuptools. This is useful in combination with the bdist* commands, because it will avoid an artificial dependency on setuptools. This is actually a switch, use it once and the choice is remembered until you specify the --use-setuptools switch (see next paragraph).
    --use-setuptools
    Force setup to try and use setuptools instead of distutils. This is actually a switch, use it once and the choice is remembered until you specify the --use-distutils switch (see above).

    Instrument-specific setup

    If your measurement device is a i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, you'll want to import the colorimeter corrections that are part of the vendor software packages, which can be used to better match the instrument to a particular type of display. Note: The full range of measurement modes for the Spyder 4/5 are also only available if they are imported from the Spyder 4/5 software.

    Choose “Import colorimeter corrections from other display profiling software...” from ${APPNAME}'s “Tools” menu.

    If your measurement device is a Spyder 2, you need to enable it to be able to use it with ArgyllCMS and ${APPNAME}. Choose “Enable Spyder 2 colorimeter...” from ${APPNAME}'s “Tools” menu.

    Basic concept of display calibration and profiling

    If you have previous experience, skip ahead. If you are new to display calibration, here is a quick outline of the basic concept.

    First, the display behavior is measured and adjusted to meet user-definable target characteristics, like brightness, gamma and white point. This step is generally referred to as calibration. Calibration is done by adjusting the monitor controls, and the output of the graphics card (via calibration curves, also sometimes called video LUT[7] curves—please don't confuse these with LUT profiles, the differences are explained here) to get as close as possible to the chosen target.
    To meet the user-defined target characteristics, it is generally advisable to get as far as possible by using the monitor controls, and only thereafter by manipulating the output of the video card via calibration curves, which are loaded into the video card gamma table, to get the best results.

    Second, the calibrated displays response is measured and an ICC[5] profile describing it is created.

    Optionally and for convenience purposes, the calibration is stored in the profile, but both still need to be used together to get correct results. This can lead to some ambiguity, because loading the calibration curves from the profile is generally the responsibility of a third party utility or the OS, while applications using the profile to do color transforms usually don't know or care about the calibration (they don't need to). Currently, the only OS that applies calibration curves out-of-the-box is Mac OS X (under Windows 7 or later you can enable it, but it's off by default and doesn't offer the same high precision as the ${APPNAME} profile loader)—for other OS's, ${APPNAME} takes care of creating an appropriate loader.

    Even non-color-managed applications will benefit from a loaded calibration because it is stored in the graphics card—it is “global”. But the calibration alone will not yield accurate colors—only fully color-managed applications will make use of display profiles and the necessary color transforms.

    Regrettably there are several image viewing and editing applications that only implement half-baked color management by not using the system's display profile (or any display profile at all), but an internal and often unchangeable “default” color space like sRGB, and sending output unaltered to the display after converting to that default colorspace. If the display's actual response is close to sRGB, you might get pleasing (albeit not accurate) results, but on displays which behave differently, for example wide-color-gamut displays, even mundane colors can get a strong tendency towards neon.

    A note about colorimeters, displays and ${APPNAME}

    Colorimeters need a correction in hardware or software to obtain correct measurements from different types of displays (please also see “Wide Gamut Displays and Colorimeters” on the ArgyllCMS website for more information). The latter is supported when using ArgyllCMS >= 1.3.0, so if you own a display and colorimeter which has not been specifically tuned for this display (i.e. does not contain a correction in hardware), you can apply a correction that has been calculated from spectrometer measurements to help better measure such a screen.
    You need a spectrometer in the first place to do the necessary measurements to create such a correction, or you may query ${APPNAME}'s Colorimeter Corrections Database, and there's also a list of contributed colorimeter correction files on the ArgyllCMS websiteplease note though that a matrix created for one particular instrument/display combination may not work well for different instances of the same combination because of display manufacturing variations and generally low inter-instrument agreement of most older colorimeters (with the exception of the DTP94), newer devices like the i1 Display Pro/ColorMunki Display and possibly the Spyder 4/5 seem to be less affected by this.
    Starting with ${APPNAME} 0.6.8, you can also import generic corrections from some profiling softwares by choosing the corresponding item in the “Tools” menu.

    If you buy a screen bundled with a colorimeter, the instrument may have been matched to the screen in some way already, so you may not need a software correction in that case.

    Special note about the X-Rite i1 Display Pro, ColorMunki Display and Spyder 4/5 colorimeters

    These instruments greatly reduce the amount of work needed to match them to a display because they contain the spectral sensitivities of their filters in hardware, so only a spectrometer reading of the display is needed to create the correction (in contrast to matching other colorimeters to a display, which needs two readings: One with a spectrometer and one with the colorimeter).
    That means anyone with a particular screen and a spectrometer can create a special Colorimeter Calibration Spectral Set (.ccss) file of that screen for use with those colorimeters, without needing to actually have access to the colorimeter itself.

    Usage

    Through the main window, you can choose your settings. When running calibration measurements, another window will guide you through the interactive part of display adjustment.

    Settings file

    Here, you can load a preset, or a calibration (.cal) or ICC profile (.icc / .icm) file from a previous run. This will set options to those stored in the file. If the file contains only a subset of settings, the other options will automatically be reset to defaults (except the 3D LUT settings, which won't be reset if the settings file doesn't contain 3D LUT settings, and the verification settings which will never be reset automatically).

    If a calibration file or profile is loaded in this way, its name will show up here to indicate that the settings reflect those in the file. Also, if a calibration is present it can be used as the base when “Just Profiling”.
    The chosen settings file will stay selected as long as you do not change any of the calibration or profiling settings, with one exception: When a .cal file with the same base name as the settings file exists in the same directory, adjusting the quality and profiling controls will not cause unloading of the settings file. This allows you to use an existing calibration with new profiling settings for “Just Profiling”, or to update an existing calibration with different quality and/or profiling settings. If you change settings in other situations, the file will get unloaded (but current settings will be retained—unloading just happens to remind you that the settings no longer match those in the file), and current display profile's calibration curves will be restored (if present, otherwise they will reset to linear).

    When a calibration file is selected, the “Update calibration” checkbox will become available, which takes less time than a calibration from scratch. If a ICC[5] profile is selected, and a calibration file with the same base name exists in the same directory, the profile will be updated with the new calibration. Ticking the “Update calibration” checkbox will gray out all options as well as the “Calibrate & profile” and “Just profile” buttons, only the quality level will be changeable.

    Predefined settings (presets)

    Starting with ${APPNAME} v0.2.5b, predefined settings for several use cases are selectable in the settings dropdown. I strongly recommend to NOT view these presets as the solitary “correct” settings you absolutely should use unmodified if your use case matches their description. Rather view them as starting points, from where you can work towards your own, optimized (in terms of your requirements, hardware, surroundings, and personal preference) settings.

    Why has a default gamma of 2.2 been chosen for some presets?

    Many displays, be it CRT, LCD, Plasma or OLED, have a default response characteristic close to a gamma of approx. 2.2-2.4 (for CRTs, this is the actual native behaviour; and other technologies typically try to mimic CRTs). A target response curve for calibration that is reasonably close to the native response of a display should help to minimize calibration artifacts like banding, because the adjustments needed to the video card's gamma tables via calibration curves will not be as strong as if a target response farther away from the display's native response had been chosen.

    Of course, you can and should change the calibration response curve to a value suitable for your own requirements. For example, you might have a display that offers hardware calibration or gamma controls, that has been internally calibrated/adjusted to a different response curve, or your display's response is simply not close to a gamma of 2.2 for other reasons. You can run “Report on uncalibrated display device” from the “Tools” menu to measure the approximated overall gamma among other info.

    Tabs

    The main user interface is divided into tabs, with each tab containing a sub-set of settings. Not all tabs may be available at any given time. Unavailable tabs will be grayed out.

    Choosing the display to calibrate and the measurement device

    After connecting the instrument, click the small icon with the swirling arrow in between the “Display device” and “Instrument” controls to detect connected display devices and instruments.

    Choosing a display device

    Directly connected displays will appear at the top of the list as entries in the form “Display Name/Model @ x, y, w, h” with x, y, w and h being virtual screen coordinates depending on resolution and DPI settings. Apart from those directly connected displays, a few additional options are also available:

    Web @ localhost

    Starts a standalone web server on your machine, which then allows a local or remote web browser to display the color test patches, e.g. to calibrate/profile a smartphone or tablet computer.

    Note that if you use this method of displaying test patches, then colors will be displayed with 8 bit per component precision, and any screen-saver or power-saver will not be automatically disabled. You will also be at the mercy of any color management applied by the web browser, and may have to carefully review and configure such color management.

    madVR

    Causes test patches to be displayed using the madVR Test Pattern Generator (madTPG) application which comes with the madVR video renderer (only available for Windows, but you can connect via local network from Linux and Mac OS X). Note that while you can adjust the test pattern configuration controls in madTPG itself, you should not normally alter the “disable videoLUT” and “disable 3D LUT” controls, as these will be set appropriately automatically when doing measurements.

    Note that if you want to create a 3D LUT for use with madVR, there is a “Video 3D LUT for madVR” preset available under “Settings” that will not only configure ${APPNAME} to use madTPG, but also setup the correct 3D LUT format and encoding for madVR.

    Prisma

    The Q, Inc./Murideo Prisma is a video processor and combined pattern generator/3D LUT holder accessible over the network.

    Note that if you want to create a 3D LUT for use with a Prisma, there is a “Video 3D LUT for Prisma” preset available under “Settings” that will not only configure ${APPNAME} to use a Prisma, but also setup the correct 3D LUT format and encoding.

    Also note that the Prisma has 1 MB of internal memory for custom LUT storage, which is enough for around 15 17x17x17 LUTs. You may occasionally need to enter the Prisma's administrative interface via a web browser to delete old LUTs to make space for new ones.

    Resolve

    Allows you to use the built-in pattern generator of DaVinci Resolve video editing and grading software, which is accessible over the network or on the local machine. The way this works is that you start a calibration or profiling run in ${APPNAME}, position the measurement window and click “Start measurement”. A message “Waiting for connection on IP:PORT” should appear. Note the IP and port numbers. In Resolve, switch to the “Color” tab and then choose “Monitor calibration”, “CalMAN” in the “Color” menu (Resolve version 11 and earlier) or the “Workspace” menu (Resolve 12).
    Enter the IP address in the window that opens (port should already be filled) and click “Connect” (if Resolve is running on the same machine as ${APPNAME}, enter localhost or 127.0.0.1 instead). The position of the measurement window you placed earlier will be mimicked on the display you have connected via Resolve.

    Note that if you want to create a 3D LUT for use with Resolve, there is a “Video 3D LUT for Resolve” preset available under “Settings” that will not only configure ${APPNAME} to use Resolve, but also setup the correct 3D LUT format and encoding.

    Note that if you want to create a 3D LUT for a display that is directly connected (e.g. for Resolve's GUI viewer), you should not use the Resolve pattern generator, and select the actual display device instead which will allow for quicker measurements (Resolve's pattern generator has additional delay).

    Untethered

    See untethered display measurements. Please note that the untethered mode should generally only be used if you've exhausted all other options.

    Choosing a measurement mode

    Some instruments may support different measurement modes for different types of display devices. In general, there are two base measurement modes: “LCD” and “Refresh” (e.g. CRT and Plasma are refresh-type displays). Some instruments like the Spyder 4/5 and ColorHug support additional measurement modes, where a mode is coupled with a predefined colorimeter correction (in that case, the colorimeter correction dropdown will automatically be set to “None”).
    Variations of these measurement modes may be available depending on the instrument: “Adaptive” measurement mode for spectrometers uses varying integration times (always used by colorimeters) to increase accuracy of dark readings. “HiRes” turns on high resolution spectral mode for spectrometers like the i1 Pro, which may increase the accuracy of measurements.

    Drift compensation during measurements (only available if using ArgyllCMS >= 1.3.0)

    White level drift compensation tries to counter luminance changes of a warming up display device. For this purpose, a white test patch is measured periodically, which increases the overall time needed for measurements.

    Black level drift compensation tries to counter measurement deviations caused by black calibration drift of a warming up measurement device. For this purpose, a black test patch is measured periodically, which increases the overall time needed for measurements. Many colorimeters are temperature stabilised, in which case black level drift compensation should not be needed, but spectrometers like the i1 Pro or ColorMunki Design/Photo/i1Studio are not temperature compensated.

    Override display update delay (only available if using ArgyllCMS >= 1.5.0, only visible if “Show advanced options” in the “Options” menu is enabled)

    Normally a delay of 200 msec is allowed between changing a patch color in software, and that change appearing in the displayed color itself. For some instuments (i.e. i1 Display Pro, ColorMunki Display, i1 Pro, ColorMunki Design/Photo/i1Studio, Klein K10-A) ArgyllCMS will automatically measure and set an appropriate update delay during instrument calibration. In rare situations this delay may not be sufficient (ie. some TV's with extensive image processing features turned on), and a larger delay can be set here.

    Override display settle time multiplier (only available if using ArgyllCMS >= 1.7.0, only visible if “Show advanced options” in the “Options” menu is enabled)

    Normally the display technology type determines how long is allowed between when a patch color change appears on the display, and when that change has settled down, and as actually complete within measurement tolerance. A CRT or Plasma display for instance, can have quite a long settling delay due to the decay characteristics of the phosphor used, while an LCD can also have a noticeable settling delay due to the liquid crystal response time and any response time enhancement circuit (instruments without a display technology type selection such as spectrometers assume a worst case).
    The display settle time multiplier allows the rise and fall times of the model to be scaled to extend or reduce the settling time. For instance, a multiplier of 2.0 would double the settling time, while a multiplier of 0.5 would halve it.

    Choosing a colorimeter correction for a particular display

    This can improve a colorimeters accuracy for a particular type of display, please also see “A note about colorimeters, displays and ${APPNAME}”. You can import generic matrices from some other display profiling softwares as well as check the online Colorimeter Corrections Database for a match of your display/instrument combination (click the small globe next to the correction dropdown)—please note though that all colorimeter corrections in the online database have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate: They may or may not improve the absolute accuracy of your colorimeter with your display. A list of contributed correction matrices can also be found on the ArgyllCMS website.

    Please note this option is only available if using ArgyllCMS >= 1.3.0 and a colorimeter.

    Calibration settings

    Interactive display adjustment
    Turning this off skips straight to calibration or profiling measurements instead of giving you the opportunity to alter the display's controls first. You will normally want to keep this checked, to be able to use the controls to get closer to the chosen target characteristics.
    Observer

    To see this setting, you need to have an instrument that supports spectral readings (i.e. a spectrometer) or spectral sample calibration (e.g. i1 DisplayPro, ColorMunki Display and Spyder4/5), and go into the “Options” menu, and enable “Show advanced options”.

    This can be used to select a different colorimetric observer, also known as color matching function (CMF), for instruments that support it. The default is the CIE 1931 standard 2° observer.

    Note that if you select anything other than the default 1931 2 degree observer, then the Y values will not be cd/m², due to the Y curve not being the CIE 1924 photopic V(λ) luminosity function.

    White point

    Allows setting the target white point locus to the equivalent of a daylight or black body spectrum of the given temperature in degrees Kelvin, or as chromaticity co-ordinates. By default the white point target will be the native white of the display, and it's color temperature and delta E to the daylight spectrum locus will be shown during monitor adjustment, and adjustments will be recommended to put the display white point directly on the Daylight locus. If a daylight color temperature is given, then this will become the target of the adjustment, and the recommended adjustments will be those needed to make the monitor white point meet the target. Typical values might be 5000 for matching printed output, or 6500, which gives a brighter, bluer look. A white point temperature different to that native to the display may limit the maximum brightness possible.

    A whitepoint other than “As measured” will also be used as the target whitepoint when creating 3D LUTs.

    If you want to find out the current uncalibrated whitepoint of your display, you can run “Report on uncalibrated display device” from the “Tools” menu to measure it.

    If you want to adjust the whitepoint to the chromaticities of your ambient lighting, or those of a viewing booth as used in prepress and photography, and your measurement device has ambient measuring capability (e.g. like the i1 Pro or i1 Display with their respective ambient measurement heads), you can use the “Measure ambient” button next to the whitepoint settings. If you want to measure ambient lighting, place the instrument upwards, beside the display. Or if you want to measure a viewing booth, put a metamerism-free gray card inside the booth and point the instrument towards it. Further instructions how to measure ambient may be available in your instrument's documentation.

    Visual whitepoint editor

    The visual whitepoint editor allows visually adjusting the whitepoint on display devices that lack hardware controls as well as match several displays to one another (or a reference). To use it, set the whitepoint to “Chromaticity” and click the visual whitepoint editor button (you can open as many visual whitepoint editors simultaneously as you like, so that e.g. one can be left unchanged as reference, while the other can be adjusted to match said reference). The editor window can be put into a distraction-free fullscreen mode by maximizing it (press ESC to leave fullscreen again). Adjust the whitepoint using the controls on the editor tool pane until you have achieved a visual match. Then, place your instrument on the measurement area and click “Measure”. The measured whitepoint will be set as calibration target.

    White level

    Set the target brightness of white in cd/m2. If this number cannot be reached, the brightest output possible is chosen, consistent with matching the white point target. Note that many of the instruments are not particularly accurate when assessing the absolute display brightness in cd/m2. Note that some LCD screens behave a little strangely near their absolute white point, and may therefore exhibit odd behavior at values just below white. It may be advisable in such cases to set a brightness slightly less than the maximum such a display is capable of.

    If you want to find out the current uncalibrated white level of your display, you can run “Report on uncalibrated display device” from the “Tools” menu to measure it.

    Black level

    (To see this setting, go into the “Options” menu, and enable “Show advanced options”)

    Can be used to set the target brightness of black in cd/m2 and is useful for e.g. matching two different screens with different native blacks to one another, by measuring the black levels on both (i.e. in the “Tools” menu, choose “Report on uncalibrated display”) and then entering the highest measured value. Normally you may want to use native black level though, to maximize contrast ratio. Setting too high a value may also give strange results as it interacts with trying to achieve the target “advertised” tone curve shape. Using a black output offset of 100% tries to minimize such problems.

    Tone curve / gamma

    The target response curve is normally an exponential curve (output = inputgamma), and defaults to 2.2 (which is close to a typical CRT displays real response). Four pre-defined curves can be used as well: the sRGB colorspace response curve, which is an exponent curve with a straight segment at the dark end and an overall response of approximately gamma 2.2, the L* curve, which is the response of the CIE L*a*b* perceptual colorspace, the Rec. 709 video standard response curve and the SMPTE 240M video standard response curve.
    Another possible choice is “As measured”, which will skip video card gamma table (1D LUT) calibration.

    Note that a real display usually can't reproduce any of the ideal pre-defined curves, since it will have a non-zero black point, whereas all the ideal curves assume zero light at zero input.

    For gamma values, you can also specify whether it should be interpreted relative, meaning the gamma value provided is used to set an actual response curve in light of the non-zero black of the actual display that has the same relative output at 50% input as the ideal gamma power curve, or absolute, which allows the actual power to be specified instead, meaning that after the actual displays non-zero black is accounted for, the response at 50% input will probably not match that of the ideal power curve with that gamma value (to see this setting, you have to go into the “Options” menu, and enable “Show advanced options”).

    To allow for the non-zero black level of a real display, by default the target curve values will be offset so that zero input gives the actual black level of the display (output offset). This ensures that the target curve better corresponds to the typical natural behavior of displays, but it may not be the most visually even progression from display minimum. This behavior can be changed using the black output offset option (see further below).

    Also note that many color spaces are encoded with, and labelled as having a gamma of approximately 2.2 (ie. sRGB, REC 709, SMPTE 240M, Macintosh OS X 10.6), but are actually intended to be displayed on a display with a typical CRT gamma of 2.4 viewed in a darkened environment.
    This is because this 2.2 gamma is a source gamma encoding in bright viewing conditions such as a television studio, while typical display viewing conditions are quite dark by comparison, and a contrast expansion of (approx.) gamma 1.1 is desirable to make the images look as intended.
    So if you are displaying images encoded to the sRGB standard, or displaying video through the calibration, just setting the gamma curve to sRGB or REC 709 (respectively) is probably not what you want! What you probably want to do, is to set the gamma curve to about gamma 2.4, so that the contrast range is expanded appropriately, or alternatively use sRGB or REC 709 or a gamma of 2.2 but also specify the actual ambient viewing conditions via a light level in Lux, so that an appropriate contrast enhancement can be made during calibration. If your instrument is capable of measuring ambient light levels, then you can do so.
    (For in-depth technical information about sRGB, see “A Standard Default Color Space for the Internet: sRGB” at the ICC[5] website for details of how it is intended to be used)

    If you're wondering what gamma value you should use, you can run “Report on uncalibrated display device” from the “Tools” menu to measure the approximated overall gamma among other info. Setting the gamma to the reported value can then help to reduce calibration artifacts like banding, because the adjustments needed for the video card's gamma table should not be as strong as if a gamma further away from the display's native response was chosen.

    Ambient light level

    (To see this setting, go into the “Options” menu, and enable “Show advanced options”)

    As explained for the tone curve settings, often colors are encoded in a situation with viewing conditions that are quite different to the viewing conditions of a typical display, with the expectation that this difference in viewing conditions will be allowed for in the way the display is calibrated. The ambient light level option is a way of doing this. By default calibration will not make any allowances for viewing conditions, but will calibrate to the specified response curve, but if the ambient light level is entered or measured, an appropriate viewing conditions adjustment will be performed. For a gamma value or sRGB, the original viewing conditions will be assumed to be that of the sRGB standard viewing conditions, while for REC 709 and SMPTE 240M they will be assumed to be television studio viewing conditions.
    By specifying or measuring the ambient lighting for your display, a viewing conditions adjustment based on the CIECAM02 color appearance model will be made for the brightness of your display and the contrast it makes with your ambient light levels.

    Please note your measurement device needs ambient measuring capability (e.g. like the i1 Pro or i1 Display with their respective ambient measurement heads) to measure the ambient light level.

    Black output offset

    (To see this setting, go into the “Options” menu, and enable “Show advanced options”)

    Real displays do not have a zero black response, while all the target response curves do, so this has to be allowed for in some way.

    The default way of handling this (equivalent to 100% black output offset) is to allow for this at the output of the ideal response curve, by offsetting and scaling the output values. This defined a curve that will match the responses that many other systems provide and may be a better match to the natural response of the display, but will give a less visually even response from black.

    The other alternative is to offset and scale the input values into the ideal response curve so that zero input gives the actual non-zero display response. This ensures the most visually even progression from display minimum, but might be hard to achieve since it is different to the natural response of a display.

    A subtlety is to provide a split between how much of the offset is accounted for as input to the ideal response curve, and how much is accounted for at the output, where the degree is 0.0 accounts for it all as input offset, and 100% accounts for all of it as output offset.

    Black point correction

    (To see this setting, go into the “Options” menu, and enable “Show advanced options”)

    Normally dispcal will attempt to make all colors down the neutral axis (R=G=B) have the same hue as the chosen white point. Near the black point, red, green or blue can only be added, not subtracted from zero, so the process of making the near black colors have the desired hue, will lighten them to some extent. For a device with a good contrast ratio or a black point that has nearly the same hue as the white, this is not a problem. If the device contrast ratio is not so good, and the black hue is noticeably different to that of the chosen white point (which is often the case for LCD type displays), this could have a noticeably detrimental effect on an already limited contrast ratio. Here the amount of black point hue correction can be controlled.
    By default a factor of 100% will be used, which is usually good for “Refresh”-type displays like CRT or Plasma and also by default a factor of 0% is used for LCD type displays, but you can override these with a custom value between 0% (no correction) to 100% (full correction), or enable automatically setting it based on the measured black level of the display.

    If less than full correction is chosen, then the resulting calibration curves will have the target white point down most of the curve, but will then cross over to the native or compromise black point.

    Black point correction rate (only available if using ArgyllCMS >= 1.0.4)

    (To see this setting, go into the “Options” menu, and enable “Show advanced options”)

    If the black point is not being set completely to the same hue as the white point (ie. because the factor is less than 100%), then the resulting calibration curves will have the target white point down most of the curve, but will then blend over to the native or compromise black point that is blacker, but not of the right hue. The rate of this blend can be controlled. The default value is 4.0, which results in a target that switches from the white point target to the black, moderately close to the black point. While this typically gives a good visual result with the target neutral hue being maintained to the point where the crossover to the black hue is not visible, it may be asking too much of some displays (typically LCD type displays), and there may be some visual effects due to inconsistent color with viewing angle. For this situation a smaller value may give a better visual result (e.g. try values of 3.0 or 2.0. A value of 1.0 will set a pure linear blend from white point to black point). If there is too much coloration near black, try a larger value, e.g. 6.0 or 8.0.

    Calibration speed

    (This setting will not apply and be hidden when the tone curve is set to “As measured”)

    Determines how much time and effort to go to in calibrating the display. The lower the speed, the more test readings will be done, the more refinement passes will be done, the tighter will be the accuracy tolerance, and the more detailed will be the calibration of the display. The result will ultimately be limited by the accuracy of the instrument, the repeatability of the display and instrument, and the resolution of the video card gamma table entries and digital or analogue output (RAMDAC).

    Profiling settings

    Profile quality
    Sets the level of effort and/or detail in the resulting profile. For table based profiles (LUT[7]), it sets the main lookup table size, and hence quality in the resulting profile. For matrix profiles it sets the per channel curve detail level and fitting “effort”.
    Black point compensation (enable “Show advanced options” in the “Options” menu)

    (Note: This option has no effect if just calibrating and creating a simple curves + matrix profile directly from the calibration data without additional profiling measurements)

    This effectively prevents black crush when using the profile, but at the expense of accuracy. It is generally best to only use this option when it is not certain that the applications you are going to use have a high quality color management implementation. For LUT profiles, more sophisticated options exist (i.e. advanced gamut mapping options and use either “Enhance effective resolution of colorimetric PCS[11]-to-device tables”, which is enabled by default, or “Gamut mapping for perceptual intent”, which can be used to create a perceptual table that maps the black point).

    Profile type (enable “Show advanced options” in the “Options” menu)

    Generally you can differentiate between two types of profiles: LUT[7] based and matrix based.

    Matrix based profiles are smaller in filesize, somewhat less accurate (though in most cases smoother) compared to LUT[7] based types, and usually have the best compatibility across CMM[2]s, applications and systems — but only support the colorimetric intent for color transforms. For matrix based profiles, the PCS[11] is always XYZ. You can choose between using individual curves for each channel (red, green and blue), a single curve for all channels, individual gamma values for each channel or a single gamma for all channels. Curves are more accurate than gamma values. A single curve or gamma can be used if individual curves or gamma values degrade the gray balance of an otherwise good calibration.

    LUT[7] based profiles are larger in filesize, more accurate (but may sacrifice smoothness), in some cases less compatible (applications might not be able to use or show bugs/quirks with LUT[7] type profiles, or certain variations of them). When choosing a LUT[7] based profile type, advanced gamut mapping options become available which you can use to create perceptual and/or saturation tables inside the profile in addition to the default colorimetric tables which are always created.
    L*a*b* or XYZ can be used as PCS[11], with XYZ being recommended especially for wide-gamut displays bacause their primaries might exceed the ICC[5] L*a*b* encoding range (Note: Under Windows, XYZ LUT[7] types are only available in ${APPNAME} if using ArgyllCMS >= 1.1.0 because of a requirement for matrix tags in the profile, which are not created by prior ArgyllCMS versions).
    As it is hard to verify if the LUT[7] of an combined XYZ LUT[7] + matrix profile is actually used, you may choose to create a profile with a swapped matrix, ie. blue-red-green instead of red-green-blue, so it will be obvious if an application uses the (deliberately wrong) matrix instead of the (correct) LUT because the colors will look very wrong (e.g. everything that should be red will be blue, green will be red, blue will be green, yellow will be purple etc).

    Note: LUT[7]-based profiles (which contain three-dimensional LUTs) might be confused with video card LUT[7] (calibration) curves (one-dimensional LUTs), but they're two different things. Both LUT[7]-based and matrix-based profiles may include calibration curves which can be loaded into a video card's gamma table hardware.

    Advanced gamut mapping options (enable “Show advanced options” in the “Options” menu)

    You can choose any of the following options after selecting a LUT profile type and clicking “Advanced...”. Note: The options “Low quality PCS[11]-to-device tables” and “Enhance effective resolution of colorimetric PCS[11]-to-device table” are mutually exclusive.

    Low quality PCS[11]-to-device tables

    Choose this option if the profile is only going to be used with inverse device-to-PCS[11] gamut mapping to create a DeviceLink or 3D LUT (${APPNAME} always uses inverse device-to-PCS[11] gamut mapping when creating a DeviceLink/3D LUT). This will reduce the processing time needed to create the PCS[11]-to-device tables. Don't choose this option if you want to install or otherwise use the profile.

    Enhance effective resolution of colorimetric PCS[11]-to-device table

    To use this option, you have to select a XYZ or L*a*b* LUT profile type (XYZ will be more effective). This option increases the effective resolution of the PCS[11] to device colorimetric color lookup table by using a matrix to limit the XYZ space and fill the whole grid with the values obtained by inverting the device-to-PCS[11] table, as well as optionally applies smoothing. If no CIECAM02 gamut mapping has been enabled for the perceptual intent, a simple but effective perceptual table (which is almost identical to the colorimetric table, but maps the black point to zero) will also be generated.

    You can also set the interpolated lookup table size. The default “Auto” will use a base 33x33x33 resulution that is increased if needed and provide a good balance between smoothness and accuracy. Lowering the resolution can increase smoothness (at the potential expense of some accuracy), while increasing resolution may make the resulting profile potentially more accurate (at the expense of some smoothness). Note that computation will need a lot of memory (>= 4 GB of RAM recommended to prevent swapping to harddisk) especially at higher resolutions.

    See below example images for the result you can expect, where the original image has been converted from sRGB to the display profile. Note though that the particular synthetic image chosen, a “granger rainbow”, exaggerates banding, real-world material is much less likely to show this. Also note that the sRGB blue in the image is actually out of gamut for the specific display used, and the edges visible in the blue gradient for the rendering are a result of the color being out of gamut, and the gamut mapping thus hitting the less smooth gamut boundaries.

    Original Granger Rainbow image

    Original “granger rainbow” image

    Granger Rainbow - default colorimetric rendering

    Default colorimetric rendering (2500 OFPS XYZ LUT profile)

    Granger Rainbow - “smooth” colorimetric rendering

    “Smooth” colorimetric rendering (2500 OFPS XYZ LUT profile, inverted A2B)

    Granger Rainbow - “smooth” perceptual rendering

    “Smooth” perceptual rendering (2500 OFPS XYZ LUT profile, inverted A2B)

    Default rendering intent for profile

    Sets the default rendering intent. In theory applications could use this, in practice they don't, so changing this setting probably won't have any effect whatsoever.

    CIECAM02 gamut mapping

    Note: When enabling one of the CIECAM02 gamut mapping options, and the source profile is a matrix profile, then enabling effective resolution enhancement will also influence the CIECAM02 gamut mapping, making it smoother, more accurate and also generated faster as a side-effect.

    Normally, profiles created by ${APPNAME} only incorporate the colorimetric rendering intent, which means colors outside the display's gamut will be clipped to the next in-gamut color. LUT-type profiles can also have gamut mapping by implementing perceptual and/or saturation rendering intents (gamut compression/expansion). You can choose if and which of those you want by specifying a source profile and marking the appropriate checkboxes. Note that a input, output, display or device colororspace profile should be specified as source, not a non-device colorspace, device link, abstract or named color profile. You can also choose viewing conditions which describe the intended use of both the source and the display profile that is to be generated. An appropriate source viewing condition is chosen automatically based on the source profile type.

    An explanation of the available rendering intents can be found in the 3D LUT section “Rendering intent”.

    For more information on why a source gamut is needed, see “About ICC profiles and Gamut Mapping” in the ArgyllCMS documentation.

    One strategy for getting the best perceptual results with display profiles is as follows: Select a CMYK profile as source for gamut mapping. Then, when converting from another RGB profile to the display profile, use relative colorimetric intent, and if converting from a CMYK profile, use the perceptual intent.
    Another approach which especially helps limited-gamut displays is to choose one of the larger (gamut-wise) source profiles you usually work with for gamut mapping, and then always use perceptual intent when converting to the display profile.

    Please note that not all applications support setting a rendering intent for display profiles and might default to colorimetric (e.g. Photoshop normally uses relative colorimetric with black point compensation, but can use different intents via custom soft proofing settings).

    Testchart file
    You can choose the test patches used when profiling the display here. The default “Auto” optimized setting takes the actual display characteristics into account. You can further increase potential profile accuracy by increasing the number of patches using the slider.
    Patch sequence (enable “Show advanced options” in the “Options” menu)

    Controls the order in which the patches of a testchart are measured. “Minimize display response delay” is the ArgyllCMS test patch generator default, which should lead to the lowest overall measurement time. The other choices (detailed below) are aimed at potentially dealing better with displays employing ASBL (automatic static brightness limiting) leading to distorted measurements, and should be used together with display white level drift compensation (although overall measurement time will increase somewhat by using either option). If your display doesn't have ASBL issues, there is no need to change this settting.

    • Maximize lightness difference will order the patches in such a way that there is the highest possible difference in terms of lightness between patches, while keeping the overall light output relatively constant (but increasing) over time. The lightness of a patch is calculated using sRGB-like relative luminance. This is the recommended setting for dealing with ASBL if you're unsure which choice to make.
    • Maximize luma difference will order the patches in such a way that there is the highest possible difference in terms of luma between patches, while keeping the overall luma relatively constant (but increasing) over time. The luma of a patch is calculated from Rec. 709 luma coefficients. The order of the patches will in most cases be quite similar to “Maximize lightness difference”.
    • Maximize RGB difference will order the patches in such a way that there is the highest possible difference in terms of the red, green and blue components between patches.
    • Vary RGB difference will order the patches in such a way that there is some difference in terms of the red, green and blue components between patches.

    Which of the choices works best on your ASBL display depends on how the display detects wether it should reduce light output. If it looks at the (assumed) relative luminance (or luma), then “Maximize lightness difference” or “Maximize luma difference” should work best. If your display is using an RGB instead of YCbCr signal path, then “Maximize RGB difference” or “Vary RGB difference” may produce desired results.

    Testchart editor

    The provided default testcharts should work well in most situations, but allowing you to create custom charts ensures maximum flexibility when characterizing a display and can improve profiling accuracy and efficiency. See also optimizing testcharts.

    Testchart generation options

    You can enter the amount of patches to be generated for each patch type (white, black, gray, single channel, iterative and multidimensional cube steps). The iterative algorythm can be tuned if more than zero patches are to be generated. What follows is a quick description of the several available iterative algorythms, with “device space” meaning in this case RGB coordinates, and “perceptual space” meaning the (assumed) XYZ numbers of those RGB coordinates. The assumed XYZ numbers can be influenced by providing a previous profile, thus allowing optimized test point placement.

    • Optimized Farthest Point Sampling (OFPS) will optimize the point locations to minimize the distance from any point in device space to the nearest sample point
    • Incremental Far Point Distribution incrementally searches for test points that are as far away as possible from any existing points
    • Device space random chooses test points with an even random distribution in device space
    • Perceptual space random chooses test points with an even random distribution in perceptual space
    • Device space filling quasi-random chooses test points with a quasi-random, space filling distribution in device space
    • Perceptual space filling quasi-random chooses test points with a quasi-random, space filling distribution in perceptual space
    • Device space body centered cubic grid chooses test points with body centered cubic distribution in device space
    • Perceptual space body centered cubic grid chooses test points with body centered cubic distribution in perceptual space

    You can set the degree of adaptation to the known device characteristics used by the default full spread OFPS algorithm. A preconditioning profile should be provided if adaptation is set above a low level. By default the adaptation is 10% (low), and should be set to 100% (maximum) if a profile is provided. But, if for instance, the preconditioning profile doesn't represent the device behavior very well, a lower adaption than 100% might be appropriate.

    For the body centered grid distributions, the angle parameter sets the overall angle that the grid distribution has.

    The “Gamma” parameter sets a power-like (to avoid the excessive compression that a real power function would apply) value applied to all of the device values after they are generated. A value greater than 1.0 will cause a tighter spacing of test values near device value 0.0, while a value less than 1.0 will cause a tighter spacing near device value 1.0. Note that the device model used to create the expected patch values will not take into account the applied power, nor will the more complex full spread algorithms correctly take into account the power.

    The neutral axis emphasis parameter allows changing the degree to which the patch distribution should emphasise the neutral axis. Since the neutral axis is regarded as the most visually critical area of the color space, it can help maximize the quality of the resulting profile to place more measurement patches in this region. This emphasis is only effective for perceptual patch distributions, and for the default OFPS distribution if the adaptation parameter is set to a high value. It is also most effective when a preconditioning profile is provided, since this is the only way that neutral can be determined. The default value of 50% provides an effect about twice the emphasis of the CIE94 Delta E formula.

    The dark region emphasis parameter allows changing the degree to which the patch distribution should emphasis dark region of the device response. Display devices used for video or film reproduction are typically viewed in dark viewing environments with no strong white reference, and typically employ a range of brightness levels in different scenes. This often means that the devices dark region response is of particular importance, so increasing the relative number of sample points in the dark region may improve the balance of accuracy of the resulting profile for video or film reproduction. This emphasis is only effective for perceptual patch distributions where a preconditioning profile is provided. The default value of 0% provides no emphasis of the dark regions. A value somewhere around 15% - 30% is a good place to start for video profile use. A scaled down version of this parameter will be passed on to the profiler. Note that increasing the proportion of dark patches will typically lengthen the time that an instrument takes to read the whole chart. Emphasizing the dark region characterization will reduce the accuracy of measuring and modelling the lighter regions, given a fixed number of test points and profile quality/grid resolution. The parameter will also be used in an analogous way to the “Gamma” value in changing the distribution of single channel, grayscale and multidimensional steps.

    The “Limit samples to sphere” option is used to define an L*a*b* sphere to filter the test points through. Only test points within the sphere (defined by it's center and radius) will be in the generated testchart. This can be good for targeting supplemental test points at a troublesome area of a device. The accuracy of the L*a*b* target will be best when a reasonably accurate preconditioning profile for the device is chosen. Note that the actual number of points generated can be hard to predict, and will depend on the type of generation used. If the OFPS, device and perceptual space random and device space filling quasi-random methods are used, then the target number of points will be achieved. All other means of generating points will generate a smaller number of test points than expected. For this reason, the device space filling quasi-random method is probably the easiest to use.

    Generating diagnostic 3D views of testcharts

    You can generate 3D views in several formats. The default HTML format should be viewable in a modern WebGL-enabled browser. You can choose the colorspace(s) you want to view the results in and also control whether to use RGB black offset (which will lighten up dark colors so they are better visible) and whether you want white to be neutral. All of these options are purely visual and will not influence the actual test patches.

    Other functions

    If generating any number of iterative patches as well as single channel, gray or multidimensional patches, you can add the single channel, gray and multidimensional patches in a separate step by holding the shift key while clicking on “Create testchart”. This prevents those patches affecting the iterative patch distribution, with the drawback of making the patch distribution less even. This is an experimental feature.

    You are also able to:

    • Export patches as CSV, TIFF, PNG or DPX files, and set how often each patch should be repeated when exporting as images after you click the “Export” button (black patches will be repeated according to the “Max” value, and white patches according to the “Min” value, and patches in between according to their lightness in L* scaled to a value between “Min” and “Max”).
    • Add saturation sweeps which are often used in a video or film context to check color saturation. A preconditioning profile needs to be used to enable this.
    • Add reference patches from measurement files in CGATS format, from named color ICC profiles, or by analyzing TIFF, JPEG or PNG images. A preconditioning profile needs to be used to enable this.
    • Sort patches by various color criteria (warning: this will interfere with the ArgyllCMS 1.6.0 or newer patch order optimisation which minimizes measurement times, so manual sorting should only be used for visual inspection of testcharts, or if required to optimize the patch order for untethered measurements in automatic mode where it is useful to maximize the lightness difference from patch to patch so the automatism has an easier time detecting changes).

    Patch editor

    Controls for the spreadsheet-like patch editor are as follows:

    • To select patches, click and drag the mouse over table cells, or hold SHIFT (select range) or CTRL/CMD (add/remove single cells/rows to/from selection)
    • To add a patch below an existing one, double-click a row label
    • To delete patches, select them, then hold CTRL (Linux, Windows) or CMD (Mac OS X) and hit DEL or BACKSPACE (will always delete whole rows even if only single cells are selected)
    • CTRL-C/CTRL-V/CTRL-A = copy/paste/select all

    If you want to insert a certain amount of patches generated in a spreadsheet application (as RGB coordinates in the range 0.0-100.0 per channel), the easiest way to do this is to save them as CSV file and drag & drop it on the testchart editor window to import it.

    Profile name

    As long as you do not enter your own text here, the profile name is auto generated from the chosen calibration and profiling options. The current auto naming mechanism creates quite verbose names which are not necessarily nice to read, but they can help in identifying the profile.
    Also note that the profile name is not only used for the resulting profile, but for all intermediate files as well (filename extensions are added automatically) and all files are stored in a folder of that name. You can choose where this folder is created by clicking the disk icon next to the field (it defaults to your system's default location for user data).

    Here's an example under Linux, on other platforms some file extensions and the location of the home directory will differ. See User data and configuration file locations. You can mouse over the filenames to get a tooltip with a short description what the file is for:

    Chosen profile save path: ~/.local/share/${APPNAME}/storage

    Profile name: mydisplay

    The following folder will be created: ~/.local/share/${APPNAME}/storage/mydisplay

    During calibration & profiling the following files will be created:

    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs ClayRGB1998.log
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs ClayRGB1998.wrz
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs sRGB.log
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay vs sRGB.wrz
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.cal
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.gam.gz
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.icc
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.log
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.ti1
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.ti3
    ~/.local/share/${APPNAME}/storage/mydisplay/mydisplay.wrz

    Any used colorimeter correction file will also be copied to the profile folder.

    Calibrating / profiling

    If you are unclear about the difference between calibration and profiling (also called characterization), see “Calibration vs. Characterization” in the ArgyllCMS documentation.

    Please let the screen stabilize for at least half an hour after powering it up before doing any measurements or assessing its color properties. The screen can be used normally with other applications during that time.

    After you have set your options, click on the button at the bottom to start the actual calibration/profiling process. The main window will hide during measurements, and should pop up again after they are completed (or after an error). You can always cancel out of running measurements using the “Cancel” button in the progress dialog, or by pressing ESC or Q. Viewing the informational log window (from the “Tools” menu) after measurements will give you access to the raw output of the ArgyllCMS commandline tools and other verbose information.

    Adjusting a display before calibration

    If you clicked “Calibrate” or “Calibrate & profile” and have not turned off “Interactive display adjustment”, you will be presented with the interactive display adjustment window which contains several options to help you bring a display's characteristics closer to the chosen target values. Depending on whether you have a “Refresh”- or LCD-type display, I will try to give some recommendations here which options to adjust, and which to skip.

    Adjusting a LCD display

    For LCD displays, you will in most cases only want to adjust white point (if the screen has RGB gain or other whitepoint controls) and white level (with the white level also affecting the black level unless you have a local dimming LED model), as many LCDs lack the necessary “offset” controls to adjust the black point (and even if they happen to have them, they often change the overall color temperature, not only the black point). Also note that for most LCD screens, you should leave the “contrast” control at (factory) default.

    White point
    If your screen has RGB gain, colortemperature or other whitepoint controls, the first step should be adjusting the whitepoint. Note that you may also benefit from this adjustment if you have set the target whitepoint to “native”, as it will allow you to bring it closer to the daylight or blackbody locus, which can help the human visual system to better adapt to the whitepoint. Look at the bars shown during the measurements to adjust RGB gains and minimize the delta E to the target whitepoint.
    White level
    Continue with the white level adjustment. If you have set a target white level, you may reduce or increase the brightness of your screen (ideally using only the backlight) until the desired value is reached (i.e. the bar ends at the marked center position). If you haven't set a target, simply adjust the screen to a visually pleasing brightness that doesn't cause eye strain.
    Adjusting a “Refresh”-type display like CRT or Plasma
    Black level
    On “Refresh”-type displays, this adjustment is usually done using the “brightness” control. You may reduce or increase the brightness of your screen until the desired black level is reached (i.e. the bar ends at the marked center position).
    White point
    The next step should be adjusting the whitepoint, using the display's RGB gain controls or other means of adjusting the whitepoint. Note that you may also benefit from this adjustment if you have set the target whitepoint to “native”, as it will allow you to bring it closer to the daylight or blackbody locus, which can help the human visual system to better adapt to the whitepoint. Look at the bars shown during the measurements to adjust RGB gains and minimize the delta E to the target whitepoint.
    White level
    Continue with the white level adjustment. On “Refresh”-type displays this is usually done using the “contrast” control. If you have set a target white level, you may reduce or increase contrast until the desired value is reached (i.e. the bar ends at the marked center position). If you haven't set a target, simply adjust the screen to a visually pleasing level that doesn't cause eye strain.
    Black point
    If your display has RGB offset controls, you can adjust the black point as well, in much the same way that you adjusted the whitepoint.
    Finishing adjustments and starting calibration/characterization

    After the adjustments, you can run a check on all the settings by choosing the last option from the left-hand menu to verify the achieved values. If adjusting one setting adversely affected another, you can then simply repeat the respective option as necessary until the target parameters are met.

    Finally, select “Continue on to calibration/profiling” to start the non-interactive part. You may want to get a coffee or two as the process can take a fair amount of time, especially if you selected a high quality level. If you only wanted help to adjust the display and don't want/need calibration curves to be created, you can also choose to exit by closing the interactive display adjustment window and then select “Profile only” from the main window.
    If you originally selected “Calibrate & profile” and fulfil the requirements for unattended calibration & profiling, the characterization measurements for the profiling process should start automatically after calibration is finished. Otherwise, you may be forced to take the instrument off the screen to do a sensor self-calibration before starting the profiling measurements.

    Optimizing testcharts for improved profiling accuracy and efficiency

    The easiest way to use an optimized testchart for profiling is to set the testchart to “Auto” and adjusting the patch amount slider to the desired number of test patches. Optimization will happen automatically as part of the profiling measurements (this will increase measurement and processing times by a certain degree).
    Alternatively, if you want to do generate an optimized chart manually prior to a new profiling run, you could go about this in the following way:

    • Have a previous display profile and select it under “Settings”.
    • Select one of the pre-baked testcharts to use as base and bring up the testchart editor.
    • Next to “Preconditioning profile” click on “current profile”. It should automatically select the previous profile you've chosen. Then place a check in the checkbox. Make sure adaptation is set to a high level (e.g. 100%)
    • If desired, adjust the number of patches and make sure the iterative patches amount is not zero.
    • Create the chart and save it. Click “yes” when asked to select the newly generated chart.
    • Start the profiling measurements (e.g. click “calibrate & profile” or “profile only”).

    Profile installation

    When installing a profile after creating or updating it, a startup item to load its calibration curves automatically on login will be created (on Windows and Linux, Mac OS X does not need a loader). You may also prevent this loader from doing anything by removing the check in the “Load calibration curves on Login” checkbox in the profile installation dialog, and in case you are using Windows 7 or later, you may let the operating system handle calibration loading instead (note that the Windows internal calibration loader does not offer the same high precision as the ${APPNAME} profile loader, due to wrong scaling and 8-bit quantization).

    Profile loader (Windows)

    Under Windows, the profile loader will stay in the taskbar tray and keep the calibration loaded (unless started with the --oneshot argument, which will make the loader exit after loading calibration). In addition, the profile loader is madVR-aware and will disable calibration loading if it detects e.g. madTPG or madVR being used by a video player. You can double-click the profile loader system tray icon to instantly re-apply the currently selected calibration state (see below). A single click will show a popup with currently associated profiles and calibration information. A right-click menu allows you to set the desired calibration state and a few other options:

    • Load calibration from current display device profile(s). Selecting this (re)loads the calibration instantly, and also sets the desired calibration state (see “Preserve calibration state” below).
    • Reset video card gamma table. Selecting this resets the video card gamma tables instantly, and also sets the desired calibration state (see “Preserve calibration state” below).
    • Load calibration on login & preserve calibration state. This periodically checks if the video card gamma tables match the desired calibration state. It may take up to three seconds until the selected calibration state is automatically re-applied.
    • Fix profile associations automatically when only one display is active in a multi-display setup. This is a work-around for applications (and Windows itself) querying the display profile in a way that does not take into account the active display, which can lead to a wrong profile being used. A pre-requisite for this working correctly is that the profile loader has to be running before you switch from a multi-display to a single-display configuration in Windows, and the profile associations have to be correct at this point. Note that quitting the profile loader will restore profile associations to what they were (honoring any changes to profile associations during its runtime). Also note that profile associations cannot be fixed (and the respective option will be disabled) in display configurations with three or more displays where some of them are deactivated.
    • Show notifications when detecting a 3rd party calibration/profiling software or a user-defined exception (see below).
    • Bitdepth. Some graphics drivers may internally quantize the video card gamma table values to a lower bitdepth than the nominal 16 bits per channel that are encoded in the video card gamma table tag of ${APPNAME}-generated profiles. If this quantization is done using integer truncating instead of rounding, this may pronounce banding. In that case, you can let the profile loader quantize to the target bitdepth by using rounding, which may produce a smoother result.
    • Exceptions. You can override the global profile loader state on a per application basis.
    • Profile associations. Brings up a dialog where you can associate profiles to your display devices.
    • Open Windows display settings.

    Creating 3D LUTs

    You can create display correction RGB-in/RGB-out 3D LUTs (for use in video playback or editing applications/devices that don't have ICC support) as part of the profiling process.

    3D LUT settings

    Create 3D LUT after profiling
    Normally after profiling, you'll be given the option to install the profile to make it available for ICC color managed applications. If this box is checked, you'll have the option to generate a 3D LUT (with the chosen settings) instead, and the 3D LUT settings will also be stored inside the profile, so that they can be easily restored by selecting the profile under “Settings” if needed. If this box is unchecked, you can create a 3D LUT from an existing profile.
    Source colorspace/source profile
    This sets the source colorspace for the 3D LUT, which is normally a video standard space like defined by Rec. 709 or Rec. 2020.
    Tone curve
    This allows to set a predefined or custom tone response curve for the 3D LUT. Predefined settings are Rec. 1886 (input offset), Gamma 2.2 (output offset, pure power), SMPTE 2084 hard clip, SMPTE 2084 with roll-off (BT.2390-3) and Hybrid Log-Gamma (HLG).
    Tone curve parameters
    • “Absolute” vs. “Relative” gamma (not available for SMPTE 2084) To accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly.
      “Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero).
      “Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve.
    • Black output offset To accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly. A black output offset of 0% (= all input offset) scales and offsets the input values (this matches BT.1886), while an offset of 100% scales and offsets the output values (this matches the overall curve shape of a pure power curve). A split between input and output offset is also possible.
    • Display peak luminance (only available for SMPTE 2084) This allows you to adjust the clipping point (when not using roll-off) or roll-off to your display's capabilities.
    • HDR processing (convert HDR to SDR or pass through HDR) (only available for SMPTE 2084 when the 3D LUT format is set to madVR) Whether the 3D LUT will tell madVR to switch the display to HDR mode or not (HDR mode 3D LUTs will need to be set in the “process HDR content by an external 3D LUT” slot, HDR to SDR mode 3D LUTs in the “convert HDR content to SDR by using an external 3D LUT” slot in madVR's HDR options). Note that you need to have profiled the display in the respective mode (SDR or HDR) as well, and that ${APPNAME} currently cannot switch a display into HDR mode.
    • Mastering display black and peak luminance (only available for SMPTE 2084 roll-off when advanced options are enabled in the “Options” menu) HDR video content may not have been mastered on a display capable of showing the full range of HDR luminance levels, and so altering the roll-off and specifying clipping points may be desirable to make better use of a target display's luminance capabilities. A way to do this is to specify the mastering display black and peak luminance levels. Note that setting unsuitable values may clip visually relevant information, and therefore you should leave the mastering display black and peak luminance at their default values of 0 cd/m² and 10000 cd/m², respectively, if they cannot be reasonably assumed.
    • Ambient luminance (only available for Hybrid Log-Gamma when advanced options are enabled in the “Options” menu) The default HLG system gamma of 1.2 (for a display with peak nominal luminance of 1000 cd/m² in a reference environment with 5 cd/m² ambient luminance) should be adjusted in non reference viewing environments. This is achieved by taking into account the ambient luminance (as per BT.2390-3).
    • Content colorspace (only available for SMPTE 2084 roll-off when advanced options are enabled in the “Options” menu) HDR video content may not encode the full source gamut, and so compressing the actual encoded gamut (instead of the full source gamut) into the display gamut may be desirable. Note that there is usually no need to change this from the default (DCI P3), and that this setting has most impact on non-colorimetric rendering intents.
    Apply calibration (vcgt) (only visible if “Show advanced options” in the “Options” menu is enabled)
    Apply the profile's 1D LUT calibration (if any) to the 3D LUT. Normally, this should always be enabled if the profile contains a non-linear 1D LUT calibration, otherwise you have to make sure the 1D calibration is loaded whenever the 3D LUT is used.
    Gamut mapping mode (only visible if “Show advanced options” in the “Options” menu is enabled)
    The default gamut mapping mode is “Inverse device to PCS” and gives the most accurate results. In case a profile with high enough PCS-to-device table resolution is used, the option “PCS-to-device” is selectable as well, which allows for quicker generation of a 3D LUT, but is somewhat less accurate.
    Rendering intent
    • “Absolute colorimetric” is intended to reproduce colors exactly. Out of gamut colors will be clipped to the closest possible match. The destination whitepoint will be altered to match the source whitepoint if possible, which may get clipped if it is out of gamut.
    • “Absolute appearance” maps colors from source to destination, trying to match the appearance of colors as closely as possible, but may not exactly map the whitepoint. Out of gamut colors will be clipped to the closest possible match.
    • “Absolute colorimetric with white point scaling” behaves almost exactly like “Absolute colorimetric”, but will scale the source colorspace down to make sure the source whitepoint isn't clipped.
    • “Luminance matched appearance” linearly compresses or expands the luminance axis from white to black to match the source to the destination space, while not otherwise altering the gamut, clipping any out of gamut colors to the closest match. The destination whitepoint is not altered to match the source whitepoint.
    • “Perceptual” uses three-dimensional compression to make the source gamut fit within the destination gamut. As much as possible, clipping is avoided, hues and the overall appearance is maintained. The destination whitepoint is not altered to match the source whitepoint. This intent is useful if the destination gamut is smaller than the source gamut.
    • “Perceptual appearance” uses three-dimensional compression to make the source gamut fit within the destination gamut. As much as possible, clipping is avoided, hues and the overall appearance is maintained. The destination whitepoint is altered to match the source whitepoint. This intent is useful if the destination gamut is smaller than the source gamut.
    • “Luminance preserving perceptual” (ArgyllCMS 1.8.3+) uses compression to make the source gamut fit within the destination gamut, but very heavily weights the preservation of the luminance value of the source, which will compromise the preservation of saturation. No contrast enhancement is used if the dynamic range is reduced. This intent may be of use where preserving the tonal distinctions in images is more important than maintaining overall colorfulness or contrast.
    • “Preserve saturation” uses three-dimensional compression and expansion to try and make the source gamut match the destination gamut, and also favours higher saturation over hue or lightness preservation. The destination whitepoint is not altered to match the source whitepoint.
    • “Relative colorimetric” is intended to reproduce colors exactly, but relative to the destination whitepoint which will not be altered to match the source whitepoint. Out of gamut colors will be clipped to the closest possible match. This intent is useful if you have calibrated a display to a custom whitepoint that you want to keep.
    • “Saturation” uses the same basic gamut mapping as “Preserve saturation”, but increases saturation slightly in highly saturated areas of the gamut.
    3D LUT file format
    Sets the output format for the 3D LUT. Currently supported are Autodesk/Kodak (.3dl), Iridas (.cube), eeColor (.txt), madVR (.3dlut), Pandora (.mga), Portable Network Graphic (.png), ReShade (.png, .fx) and Sony Imageworks (.spi3d). Note that an ICC device link profile (the ICC equivalent of an RGB-in/RGB-out 3D LUT) is always created as well.
    Input/output encoding
    Some 3D LUT formats allow you to set the input/output encoding. Note that in most cases, sensible defaults will be chosen depending on selected 3D LUT format, but may be application- or workflow-specific.
    Input/output bit depth
    Some 3D LUT formats allow you to set the input/output bit depth. Note that in most cases, sensible defaults will be chosen depending on selected 3D LUT format, but may be application- or workflow-specific.

    Installing 3D LUTs

    Depending on the 3D LUT file format, installing or saving the 3D LUT to a specific location may be required before it can be used. You will be asked to install or save the 3D LUT directly after it was created. If you need to install or save the 3D LUT again at a later point, switch to the “3D LUT” tab and click the small “Install 3D LUT” button next to the “Settings” dropdown (the same button that installs display profiles when on the “Display & instrument” tab and a directly connected, desktop-accessible display is selected).

    Installing 3D LUTs for the ReShade injector

    First, you need to download the latest version of ReShade and extract the ZIP file. This should result in a folder “ReShade <version>”. Then, install the 3D LUT from within ${APPNAME} to the “ReShade <version>” folder (select the folder when prompted). This will activate the 3D LUT for all applications/games that you're going to use ReShade with, which you can configure using the “ReShade Assistant” application that should come with ReShade (refer to the instructions available on the ReShade website on how to configure ReShade). The default toggle key to turn the 3D LUT on and off is the HOME key. You can change this key or disable the 3D LUT altogether by editing ColorLookUpTable.fx (with a text editor) inside the “ReShade <version>” folder where you installed the 3D LUT. To remove the 3D LUT from ReShade completely, delete ColorLookUpTable.png and ColorLookUpTable.fx in the ReShade folder, as well as edit ReShade.fx and remove the line #include "ColorLookupTable.fx" near the end.

    Verification / measurement report

    You can do verification measurements to assess the display chain's (display profile - video card and the calibration curves in its gamma table - monitor) fit to the measured data, or to find out about the soft proofing capabilities of the display chain.

    To do the former, you have to select a CGATS[1] testchart file containing device values (RGB). The measured values are then compared to the values obtained by feeding the device RGB numbers through the display profile (measured vs expected values). The default verification chart contains 26 patches and can be used, for example, to check if a display needs to be re-profiled. If a RGB testchart with gray patches (R=G=B) is measured, like the default and extended verification charts, you also have the option to evaluate the graybalance through the calibration only, by placing a check in the corresponding box on the report.

    To perform a check on the soft proofing capabilities, you have to provide a CGATS reference file containing XYZ or L*a*b* data, or a combination of simulation profile and testchart file, which will be fed through the display profile to lookup corresponding device (RGB) values, and then be sent to the display and measured. Afterwards, the measured values are compared to the original XYZ or L*a*b* values, which can give a hint how suitable (or unsuitable) the display is for softproofing to the colorspace indicated by the reference.

    The profile that is to be evaluated can be chosen freely. You can select it in ${APPNAME}'s main window under “settings”. The report files generated after the verification measurements are plain HTML with some embedded JavaScript, and are fully self-contained. They also contain the reference and measurement data, which consists of device RGB numbers, original measured XYZ values, and D50-adapted L*a*b* values computed from the XYZ numbers, and which can be examined as plain text directly from the report at the click of a button.

    HowTo—Common scenarios

    Select the profile you want to evaluate under “Settings” (for evaluating 3D LUTs and DeviceLink profiles, this setting has significance for a Rec. 1886 or custom gamma tone response curve, because they depend on the black level).

    There are two sets of default verification charts in different sizes, one for general use and one for Rec. 709 video. The “small” and “extended” versions can be used for a quick to moderate check to see if a display should be re-profiled, or if the used profile/3D LUT is any good to begin with. The “large” and “xl” versions can be used for a more thorough check. Also, you can create your own customized verification charts with the testchart editor.

    Checking the accuracy of a display profile (evaluating how well the profile characterizes the display)

    In this case, you want to use a testchart with RGB device values and no simulation profile. Select a suitable file under “testchart or reference” and disable “simulation profile”. Other settings that do not apply in this case will be grayed out.

    Checking how well a display can simulate another colorspace (evaluating softproofing capabilities, 3D LUTs, DeviceLink profiles, or native display performance)

    There are two ways of doing this:

    • Use a reference file with XYZ or L*a*b* aim values,
    • or use a combination of testchart with RGB or CMYK device values and an RGB or CMYK simulation profile (for an RGB testchart, it will only allow you to use an RGB simulation profile and vice versa, and equally a CMYK testchart needs to be used with a CMYK simulation profile)

    Then, you have a few options that influence the simulation.

    • Whitepoint simulation. If you are using a reference file that contains device white (100% RGB or 0% CMYK), or if you use a combination of testchart and simulation profile, you can choose if you want whitepoint simulation of the reference or simulation profile, and if so, if you want the whitepoint simulated relative to the display profile whitepoint. To explain the latter option: Let's assume a reference has a whitepoint that is slightly blueish (compared to D50), and a display profile has a whitepoint that is more blueish (compared to D50). If you do not choose to simulate the reference white relative to the display profile whitepoint, and the display profile's gamut is large and accurate enough to accomodate the reference white, then that is exactly what you will get. Depending on the adaptation state of your eyes though, it may be reasonable to assume that you are to a large extent adapted to the display profile whitepoint (assuming it is valid for the device), and the simulated whitepoint will look a little yellowish compared to the display profile whitepoint. In this case, choosing to simulate the whitepoint relative to that of the display profile may give you a better visual match e.g. in a softproofing scenario where you compare to a hardcopy proof under a certain illuminant, that is close to but not quite D50, and the display whitepoint has been matched to that illuminant. It will “add” the simulated whitepoint “on top” of the display profile whitepoint, so in our example the simulated whitepoint will be even more blueish than that of the display profile alone.
    • Using the simulation profile as display profile will override the profile set under “Settings”. Whitepoint simulation does not apply here because color management will not be used and the display device is expected to be in the state described by the simulation profile. This may be accomplished in several ways, for example the display may be calibrated internally or externally, by a 3D LUT or device link profile. If this setting is enabled, a few other options will be available:
      • Enable 3D LUT (if using the madVR display device/madTPG under Windows, or a Prisma video processor). This allows you to check how well the 3D LUT transforms the simulation colorspace to the display colorspace. Note this setting can not be used together with a DeviceLink profile.
      • DeviceLink profile. This allows you to check how well the DeviceLink transforms the simulation colorspace to the display colorspace. Note this setting can not be used together with the “Enable 3D LUT” setting.
    • Tone response curve. If you are evaluating a 3D LUT or DeviceLink profile, choose the same settings here as during 3D LUT/DeviceLink creation (and also make sure the same display profile is set, because it is used to map the blackpoint).
      To check a display that does not have an associated profile (e.g. “Untethered”), set the verification tone curve to “Unmodified”. In case you want to verify against a different tone response curve instead, you need to create a synthetic profile for this purpose (“Tools” menu).

    How were the nominal and recommended aim values chosen?

    The nominal tolerances, with the whitepoint, average, maximum and gray balance Delta E CIE 1976 aim values stemming from UGRA/Fogra Media Wedge and UDACT, are pretty generous, so I've included somewhat stricter “recommended” numbers which I've chosen more or less arbitrarily to provide a bit “extra safety margin”.

    For reports generated from reference files that contain CMYK numbers in addition to L*a*b* or XYZ values, you can also select the official Fogra Media Wedge V3 or IDEAlliance Control Strip aim values for paper white, CMYK solids and CMY grey, if the chart contains the right CMYK combinations.

    How are the results of the profile verification report to be interpreted?

    This depends on the chart that was measured. The explanation in the first paragraph sums it up pretty well: If you have calibrated and profiled your display, and want to check how well the profile fits a set of measurements (profile accuracy), or if you want to know if your display has drifted and needs to be re-calibrated/re-profiled, you select a chart containing RGB numbers for the verification. Note that directly after profiling, accuracy can be expected to be high if the profile characterizes the display well, which will usually be the case if the display behaviour is not very non-linear, in which case creating a LUT profile instead of a “Curves + matrix” one, or increasing the number of measured patches for LUT profiles, can help.

    If you want to know how well your profile can simulate another colorspace (softproofing), select a reference file containing L*a*b* or XYZ values, like one of the Fogra Media Wedge subsets, or a combination of a simulation profile and testchart. Be warned though, only wide-gamut displays will handle a larger offset printing colorspace like FOGRA39 or similar well enough.

    In both cases, you should check that atleast the nominal tolerances are not exceeded. For a bit “extra safety margin”, look at the recommended values instead.

    Note that both tests are “closed-loop” and will not tell you an “absolute” truth in terms of “color quality” or “color accuracy” as they may not show if your instrument is faulty/measures wrong (a profile created from repeatable wrong measurements will usually still verify well against other wrong measurements from the same instrument if they don't fluctuate too much) or does not cope with your display well (which is especially true for colorimeters and wide-gamut screens, as such combinations need a correction in hardware or software to obtain accurate results—this problem does not exist with spectrometers, which do not need a correction for wide-gamut, but have lately been discovered to have issues measuring the correct brightness of some LED backlit displays which use white LEDs), or if colors on your screen match an actual colored object next to it (like a print). It is perfectly possible to obtain good verification results but the actual visual performance being sub-par. It is always wise to combine such measurements with a test of the actual visual appearance via a “known good” reference, like a print or proof (although it should not be forgotten that those also have tolerances, and illumination also plays a big role when assessing visual results). Keep all that in mind when admiring (or pulling your hair out over) verification results :)

    How are profiles evaluated against the measured values?

    Different softwares use different methods (which are not always disclosed in detail) to compare and evaluate measurements. This section aims to give interested users a better insight how ${APPNAME}'s profile verification feature works “under the hood”.

    How is a testchart or reference file used?

    There are currently two slightly different paths depending if a testchart or reference file is used for the verification measurements, as outlined above. In both cases, Argyll's xicclu utility is run behind the scenes and the values of the testchart or reference file are fed relative colorimetrically (if no whitepoint simualtion is used) or absolute colorimetrically (if whitepoint simulation is used) through the profile that is tested to obtain corresponding L*a*b* (in the case of RGB testcharts) or device RGB numbers (in the case of XYZ or L*a*b* reference files or a combination of simulation profile and testchart). If a combination of simulation profile and testchart is used as reference, the reference L*a*b* values are calculated by feeding the device numbers from the testchart through the simulation profile absolute colorimetrically if whitepoint simulation is enabled (which will be the default if the simulation profile is a printer profile) and relative colorimetrically if whitepoint simulation is disabled (which will be the default if the simulation profile is a display profile, like most RGB working spaces). Then, the original RGB values from the testchart, or the looked up RGB values for a reference are sent to the display through the calibration curves of the profile that is going to be evaluated. A reference white of D50 (ICC default) and complete chromatic adaption of the viewer to the display's whitepoint is assumed if “simulate whitepoint relative to display profile whitepoint” is used, so the measured XYZ values are adapted to D50 (with the measured whitepoint as source reference white) using the Bradford transform (see Chromatic Adaption on Bruce Lindbloom's website for the formula and matrix that is used by ${APPNAME}) or with the adaption matrix from the profile in the case of profiles with 'chad' chromatic adaption tag, and converted to L*a*b*. The L*a*b* values are then compared by the generated dynamic report, with user-selectable critera and ΔE (delta E) formula.

    How is the assumed vs. measured whitepoint ΔE calculated?

    In a report, the correlated color temperature and assumed target whitepoint, as well as the whitepoint ΔE, do warrant some further explanations: The whitepoint ΔE is calculated as difference between the measured whitepoint's and the assumed target whitepoint's normalized XYZ values, which are first converted to L*a*b*. The assumed target whitepoint color temperature shown is simply the rounded correlated color temparature (100K threshold) calculated from the measured XYZ values. The XYZ values for the assumed target whitepoint are obtained by calculating the chromaticity (xy) coordinates of a CIE D (daylight) or blackbody illuminant of that color temperature and converting them to XYZ. You can find all the used formulas on Bruce Lindbloom's website and on Wikipedia.

    How is the gray balance “range” evaluated?

    The gray balance “range” uses a combined delta a/delta b absolute deviation (e.g. if max delta a = -0.5 and max delta b = 0.7, the range is 1.2). Because results in the extreme darks can be problematic due to lack of instrument accuracy and other effects like a black point which has a different chromaticity than the whitepoint, the gray balance check in ${APPNAME} only takes into account gray patches with a minimum measured luminance of 1% (i.e. if the white luminance = 120 cd/m², then only patches with at least 1.2 cd/m² will be taken into account).

    What does the “Evaluate gray balance through calibration only” checkbox on a report actually do?

    It sets the nominal (target) L* value to the measured L* value and a*=b*=0, so the profile is effectively ignored and only the calibration (if any) will influence the results of the gray balance checks. Note that this option will not make a difference for a “Single curve + matrix” profile, as the single curve effectively already achieves a similar thing (the L* values can be different, but they are ignored for the gray balance checks and only influence the overall result).

    What do the “Use absolute values” and “Use display profile whitepoint as reference white” checkboxes on a report do?

    If you enable “Use absolute values” on a report, the chromatic adaptation to D50 is undone (but the refrence white for the XYZ to L*a*b* conversion stays D50). This mode is useful when checking softproofing results using a CMYK simulation profile, and will be automatically enabled if you used whitepoint simulation during verification setup without enabling whitepoint simulation relative to the profile whitepoint (true absolute colorimetric mode). If you enable “Use display profile whitepoint as reference white”, then the reference white used for the XYZ to L*a*b* conversion will be that of the display profile, which is useful when verifying video calibrations where the target is usually some standard color space like Rec. 709 with a D65 equivalent whitepoint.

    Special functionality

    Remote measurements and profiling

    When using ArgyllCMS 1.4.0 and newer, remote measurements on a device not directly connected to the machine that is running ${APPNAME} is possible (e.g. a smartphone or tablet). The remote device needs to be able to run a web browser (Firefox recommended), and the local machine running ${APPNAME} may need firewall rules added or altered to allow incoming connections. To set up remote profiling, select “Web @ localhost” from the display device dropdown menu, then choose the desired action (e.g. “Profile only”). When the message “Webserver waiting at http://<IP>:<Port>” appears, open the shown address in the remote browser and attach the measurement device.
    NOTE: If you use this method of displaying test patches, there is no access to the display video LUT[7]s and hardware calibration is not possible. The colors will be displayed with 8 bit per component precision, and any screen-saver or power-saver will not be automatically disabled. You will also be at the mercy of any color management applied by the web browser, and may have to carefully review and configure such color management.
    Note: Close the web browser window or tab after each run, otherwise reconnection may fail upon further runs.

    madVR test pattern generator

    ${APPNAME} supports the madVR test pattern generator (madTPG) and madVR 3D LUT formats since version 1.5.2.5 when used together with ArgyllCMS 1.6.0 or newer.

    Resolve (10.1+) as pattern generator

    Since version 2.5, ${APPNAME} can use Resolve (10.1+) as pattern generator. Select the “Resolve” entry from the display devices dropdown in ${APPNAME} and in Resolve itself choose “Monitor calibration”, “CalMAN” in the “Color” menu.

    Untethered display measurements

    Please note that the untethered mode should generally only be used if you've exhausted all other options.

    Untethered mode is another option to measure and profile a remote display that is not connected via standard means (calibration is not supported). To use untethered mode, the testchart that should be used needs to be optimized, then exported as image files (via the testchart editor) and those image files need to be displayed on the device that should be measured, in successive order. The procedure is as follows:

    • Select the desired testchart, then open the testchart editor.
    • Select “Maximize lightness difference” from the sorting options dropdown, click “Apply”, then export the testchart.
    • Burn the images to a DVD, copy them on an USB stick or use any other available means to get them to display onto the device that should be measured.
    • In ${APPNAME}'s display dropdown, select “Untethered” (the last option).
    • Show the first image on the remote display, and attach the instrument. Then select “Profile only”.

    Measurements will commence, and changes in the displayed image should be automatically detected if “auto” mode is enabled. Use whatever means available to you to cycle through the images from first to last, carefully monitoring the measurement process and only changing to the next image if the current one has been successfully measured (as will be shown in the untethered measurement window). Note that untethered mode will be (atleast) twice as slow as normal display measurements.

    Non-UI functionality

    There is a bit of functionality that is not available via the UI and needs to be run from a command prompt or ternminal. Use of this functionality currently requires 0install, or running from source.

    Change display profile and calibration whitepoint

    Note that this reduces the profile gamut and accuracy.

    Via 0install:

    0install run --command=change-display-profile-cal-whitepoint -- \
      ${HTTPURL}0install/${APPNAME}.xml \
      [-t temp | -T temp | -w x,y] [--cal-only] [inprofile] outfilename

    From source:

    python util/change_display_profile_cal_whitepoint.py- \
      ${HTTPURL}0install/${APPNAME}.xml \
      [-t temp | -T temp | -w x,y] [--cal-only] [inprofile] outfilename
    -t temp
    Use daylight color temperature temp as whitepoint target.
    -T temp
    Use blackbody color temperature temp as whitepoint target.
    -w x,y
    Use x,y chromaticity as whitepoint target.
    --cal-only (optional)
    Only alter the calibration embedded in the profile, not the profile itself.
    inprofile (optional)
    Use profile inprofile instead of the current display profile.
    outfilename
    Output profile filename. The changed profile will be written to this file.
    Enable/disable Windows 7 and later calibration loading

    Note that Windows calibration loading is of lower quality than using ArgyllCMS because Windows always quantizes the calibration to 8 bit and scales it wrongly. This is not the case when using the ${APPNAME} calibration loader which uses ArgyllCMS.

    Via 0install:

    0install run --command=set-calibration-loading -- \
      ${HTTPURL}0install/${APPNAME}.xml [--os]

    From source:

    python -c "import sys; from ${APPNAME} import util_win; \
      util_win.calibration_management_isenabled() or \
      util_win.enable_calibration_management() \
      if '--os' in sys.argv[1:] else \
      not util_win.calibration_management_isenabled() or \
      util_win.disable_calibration_management();" [--os]

    The --os option determines wether Windows calibration loading functionality should be enbaled or disabled.

    Scripting

    ${APPNAME} supports scripting locally and over the network (the latter must be explicitly enabled by setting app.allow_network_clients = 1 in ${APPNAME}.ini) via sockets. ${APPNAME} must be already running on the target machine for this to work. Below is an example connecting to a running instance on the default port 15411 and starting calibration measurements (the port is configurable in ${APPNAME}.ini as app.port, although if the desired port is not available an unused one will be chosen automatically. You can read the actual used port from the file ${APPNAME}.lock in the configuration file folder of ${APPNAME} while it is running). The example is written in Python and deals with some of the intricacies of sockets as well.

    #!/usr/bin/env python2
    
    import socket
    
    class DCGScriptingClientSocket(socket.socket):
    
    	def __enter__(self):
    		return self
    
    	def __exit__(self, etype, value, tb):
    		# Disconnect
    		try:
    			# Will fail if the socket isn't connected, i.e. if there was an
    			# error during the call to connect()
    			self.shutdown(socket.SHUT_RDWR)
    		except socket.error:
    			pass
    		self.close()
    
    	def __init__(self):
    		socket.socket.__init__(self)
    		self.recv_buffer = ''
    
    	def get_single_response(self):
    		# Buffer received data until EOT (response end marker) and return
    		# single response (additional data will still be in the buffer)
    		while not '\4' in self.recv_buffer:
    			incoming = self.recv(4096)
    			if incoming == '':
    				raise socket.error("Connection broken")
    			self.recv_buffer += incoming
    		end = self.recv_buffer.find('\4')
    		single_response = self.recv_buffer[:end]
    		self.recv_buffer = self.recv_buffer[end + 1:]
    		return single_response
    
    	def send_and_check(self, command, expected_response="ok"):
    		""" Send command, get & check response """
    		self.send_command(command)
    		single_response = self.get_single_response()
    		if single_response != expected_response:
    			# Check application state. If a modal dialog is displayed, choose
    			# the OK option. Note that this is just an example and normally you
    			# should be very careful with this, as it could mean confirming a
    			# potentially destructive operation (e.g. discarding current
    			# settings, overwriting existing files etc).
    			self.send_command('getstate')
    			state = self.get_single_response()
    			if 'Dialog' in state.split()[0]:
    				self.send_command('ok')
    				if self.get_single_response() == expected_response:
    					return
    			raise RuntimeError('%r got unexpected response: %r != %r' %
    							   (command, single_response, expected_response))
    
    	def send_command(self, command):
    		# Automatically append newline (command end marker)
    		self.sendall(command + '\n')
    
    # Generate a list of commands we want to execute in order
    commands = []
    
    # Load “Laptop” preset
    commands.append('load presets/laptop.icc')
    
    # Setup calibration & profiling measurements
    commands.append('calibrate-profile')
    
    # Start actual measurements
    commands.append('measure')
    
    # Create socket & send commands
    with DCGScriptingClientSocket() as client:
    	client.settimeout(3)  # Set a timeout of 3 seconds
    
    	# Open connection
    	client.connect(('127.0.0.1', 15411))  # Default port
    
    	for command in commands:
    		client.send_and_check(command)
    
    

    Each command needs to be terminated with a newline character (after any arguments the command may accept). Note that data sent must be UTF-8 encoded, and if arguments contain spaces they should be encased in double or single quotes. You should check the response for each command sent (the response end marker is ASCII 0x4 EOT, and the default response format is a plain text format, but JSON and XML are also available). The common return values for commands are either ok in case the command was understood (note that this does not indicate if the command finished processing), busy or blocked in case the command was ignored because another operation was running or a modal dialog blocks the UI, failed in case the command or an argument could not be processed successfully, forbidden in case the command was not allowed (this may be a temporary condition depending on the circumstances, e.g. when trying to interact with an UI element that is currently disabled), invalid in case the command (or one of its arguments) was invalid, or error followed by an error message in case of an unhandled exception. Other return values are possible depending on the command. All values returned are UTF-8 encoded. If the return value is blocked (e.g. because a modal dialog is displayed) you should check the application state with the getstate command to determine the further course of action.

    List of supported commands

    Below is a list of the currently supported commands (the list contains all valid commands for the main application, the standalone tools will typically just support a smaller subset. You can use the “${APPNAME} Scripting Client” standalone tool to learn about and experiment with commands). Note that filename arguments must refer to files present on the target machine running ${APPNAME}.

    3DLUT-maker [create filename]
    Show 3D LUT creation tab, or create 3D LUT filename.
    abort
    Try to abort a currently running operation.
    activate [window ID | name | label]
    Activate window window or the main application window (bring it to the front). If it is minimized, restore it.
    alt | cancel | ok [filename]
    If a modal dialog is shown, call the default action (ok), the alternate action (if applicable), or cancel it. If a file dialog is shown, using ok filename chooses that file.
    calibrate
    Setup calibration measurements (note that this won't give a choice whether to create a fast curves + matrix profile as well, if you want that use interact mainframe calibrate_btn instead). For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    calibrate-profile
    Setup calibration & profiling measurements. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    close [window ID | name | label]
    Close window window or the current active window (if the window is the main window, this quits the application). Note that this tries to abort any running operations first, so you may want to check application state via the getstate command.
    create-colorimeter-correction
    Create colorimeter correction.
    create-profile [filename]
    Create profile from existing measurements (profile or measurement file).
    curve-viewer [filename]
    Show curves, optionally loading filename. Relative paths are possible e.g. for presets: curve-viewer presets/photo.icc
    ${APPNAME} [filename]
    Bring the main window to the front. If it is minimized, restore it. Optionally, load filename.
    enable-spyder2
    Enable the spyder 2.
    getactivewindow
    Get the current active window. The returned format is classname ID name label state. state is either enabled or disabled.
    getcellvalues [window ID | name | label] <grid ID | name | label>
    Get cell values from grid grid of window window or the current active window.
    getappname
    Get the name of the application you're connected to.
    getcfg [option]
    Get configuration option, or whole configuration (key-value pairs in INI format).
    getcommands
    Get list of commands supported by this application.
    getdefault <option>
    Get default option (key-value pair in INI format).
    getdefaults
    Get all defaults (key-value pairs in INI format).
    getmenus
    Get available menus in the format ID "label" state. state is either enabled or disabled.
    getmenuitems [menuposition | label]
    Get available menu items in the format menuposition "menulabel" menuitemID "menuitemlabel" state [checkable] [checked]. state is either enabled or disabled.
    getstate
    Get application state. Return value will be either idle, busy, dialogclassname ID dialogname [dialoglabel] state "messagetext" [path "path"] [buttons "buttonlabel"...] if a modal dialog is shown or blocked in case the UI is currently blocked. Most commands will not work if the UI is blocked—the only way to resolve the block is to non-programmatically interact with the actual UI elements of the application or closing it. Note that a state of blocked should normally only occur if an actual file dialog is shown. If using the scripting interface exclusively, this should never happen because it uses a replacement file dialog that supports the same actions as a real file dialog, but doesn't block. Also note that a return value of blocked for any of the other commands just means that a modal dialog is currently waiting to be interacted with, only if getstate also returns blocked you cannot resolve the situation with scripting alone.
    getuielement [window ID | name | label] <element ID | name | label>
    getuielements [window ID | name | label]
    Get a single UI element or a list of the visible UI elements of window window or the current active window. Each returned line represents an UI element and has the format classname ID name ["label"] state [checked] [value "value"] [items "item"...]. classname is the internal UI library class name. It can help you determine what type of UI element it is, and which interactions it supports. ID is a numeric identifier. name is the name of the UI element. "label" (if present) is a label which further helps in identifying the UI element. You can use the latter three with the interact command. state is either enabled or disabled. items "item"... (if present) is a list of items connected to the UI element (i.e. selection choices).
    getvalid
    Get valid values for options that have constraints (key-value pairs in INI format). There are two sections, ranges and values. ranges are the valid ranges for options that accept numeric values (note that integer options not covered by ranges are typically boolean types). values are the valid values for options that only accept certain values. Options not covered by ranges and values are limited to their data type (you can't set a numeric option to a string and vice versa).
    getwindows
    Get a list of visible windows. The returned format is a list of classname ID name label state. state is either enabled or disabled.
    import-colorimeter-corrections [filename...]
    Import colorimeter corrections.
    install-profile [filename]
    Install a profile.
    interact [window ID | name | label] <element ID | name | label> [setvalue value]
    Interact with the UI element element of window window or the current active window, e.g. invoke a button or set a control to a value.
    invokemenu <menuposition | menulabel> <menuitemID | menuitemlabel>
    Invoke a menu item.
    load <filename>
    Load filename. Relative paths are possible e.g. for presets: load presets/photo.icc
    measure
    Start measurements (must be setup first!).
    measure-uniformity
    Measure screen uniformity.
    measurement-report [filename]
    If no filename given, show measurement report tab. Otherwise, setup measurement to create the HTML report filename. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    profile
    Setup profiling measurements (note that this will always use the current calibration if applicable, if you want to use linear calibration instead call load linear.cal prior to calling profile). For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    profile-info [filename]
    Show profile information, optionally loading profile filename. Relative paths are possible e.g. for presets: profile-info presets/photo.icc
    refresh
    Update the GUI after configuration changes via setcfg or restore-defaults.
    report-calibrated
    Report on calibrated display. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    report-uncalibrated
    Report on uncalibrated display. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    restore-defaults [category...]
    Restore defaults globally or just for category. Call refresh after changing the configuration to update the GUI.
    setlanguage <languagecode>
    Set language.
    setcfg <option> <value>
    Set configuration option to value. The special value null clears a configuration option. Call refresh after changing the configuration to update the GUI. Also see getdefaults and getvalid.
    setresponseformat <format>
    Set the format for responses. The default plain is a text format that is easy to read, but not necessarily the best for parsing programmatically. The other possible formats are json, json.pretty, xml and xml.pretty. The *.pretty formats use newlines and indentation to make them easier to read.
    synthprofile [filename]
    Show synthetic profile creation window, optionally loading profile filename.
    testchart-editor [filename | create filename]
    Show testchart editor window, optionally loading or creating testchart filename. Relative paths are possible e.g. for loading a default testchart: testchart-editor ti1/d3-e4-s17-g49-m5-b5-f0.ti1
    verify-calibration
    Verify calibration. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.

    Interacting with UI elements

    • Invoking a button: interact [window] <button> e.g. show profile name placeholders information: interact mainframe profile_name_info_btn
    • Setting a value on a dropdown, text field, or slider: interact [window] <element> setvalue "value" e.g. set calibration gamma to 2.4: interact mainframe trc_textctrl setvalue 2.4 (note that for changing multiple options at once it is generally preferable to call setcfg <option> <value> for each option you want to set followed by a single refresh instead)
    • Setting a cell value on a grid: interact [window] <grid> setvalue "row,col,value" e.g. while the testchart editor is shown, set the cell at the second column of the first row to 33: interact tcgen grid setvalue "0,1,33"

    Caveats and limitations

    There are a few things to be aware of when using commands that interact with the UI directly (i.e. activate, alt | cancel | ok, close, interact and invokemenu).

    Referring to windows and UI elements: You can refer to windows and UI elements by their ID, name or label (you can find out about windows and UI elements with the getmenus/getmenuitems, getuielement/getuielements, and getwindows commands). If an object's ID is negative, it means that it has been automatically assigned at object creation time and is only valid during the lifetime of the object (i.e. for modal dialogs, only while the dialog is displayed). For this reason, using an object's name instead is easier, but names (aswell as non automatically assigned IDs) are not guaranteed to be unique, even for objects which share the same parent window (although most of the “important” controls as well as application windows will have unique names). Another possibility is to use an object's label, which while also not guaranteed to be unique, still has a fairly high likelihood of being unique for controls that share the same parent window, but has the drawback that it is localized (although you can ensure a specific UI language by calling setlanguage) and is subject to change when the localization is updated.

    Sequential operations: Calling commands that interact with the UI in rapid succession may require the use of additional delays between sending commands to allow the GUI to react (so getstate will return the actual UI state after a specific command), although there is a default delay for commands that interact with the UI of atleast 55 ms. A good rule of thumb for sending commands is to use a “send command” → “read response” → “optionally wait a few extra ms” → “get application state (send getstate command)” → “read response” cycle.

    Setting values: If setting a value on an UI element returns ok, this is not always an indication that the value was actually changed, but only that the attempt to set the value has not failed, i.e. the event handler of the element may still do error checking and change the value to something sane if it was not valid. If you want to make sure that the intended value is set, use getuielement on the affected element(s) and check the value (or even better, if you use JSON or XML response format, you can check the object property/element of the response instead which will reflect the object's current state and saves you one request). In general it is preferable to use interact <elementname> setvalue <value> only on dialogs, and in all other cases use a sequence of setcfg <option> <value> (repeat as necessary, optionally call load <filename> or restore-defaults first to minimize the amount of configuration options that you need to change) followed by a call to refresh to update the UI.

    Also, not all controls may offer a comprehensive scripting interface. I'm open to suggestions though.

    User data and configuration file locations

    ${APPNAME} uses the following folders for configuration, logfiles and storage (the storage directory is configurable). Note that if you have upgraded to ${APPNAME} from dispcalGUI, that ${APPNAME} will continue to use the existing dispcalGUI directories and configuration file names (so replace ${APPNAME} with dispcalGUI in the lists below).

    Configuration

    • Linux: /home/Your Username/.config/${APPNAME}
    • Mac OS X: /Users/Your Username/Library/Preferences/${APPNAME}
    • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\${APPNAME}
    • Windows XP: C:\Documents and Settings\Your Username\Application Data\${APPNAME}

    Logs

    • Linux: /home/Your Username/.local/share/${APPNAME}/logs
    • Mac OS X: /Users/Your Username/Library/Logs/${APPNAME} and
      /Users/Your Username/Library/Logs/0install
    • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\${APPNAME}\logs
    • Windows XP: C:\Documents and Settings\Your Username\Application Data\${APPNAME}\logs

    Storage

    • Linux: /home/Your Username/.local/share/${APPNAME}/storage
    • Mac OS X: /Users/Your Username/Library/Application Support/${APPNAME}/storage
    • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\${APPNAME}\storage
    • Windows XP: C:\Documents and Settings\Your Username\Application Data\${APPNAME}\storage

    Incomplete/failed runs (useful for troubleshooting)

    • Linux: /home/Your Username/.local/share/${APPNAME}/incomplete
    • Mac OS X: /Users/Your Username/Library/Application Support/${APPNAME}/incomplete
    • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\${APPNAME}\incomplete
    • Windows XP: C:\Documents and Settings\Your Username\Application Data\${APPNAME}\incomplete

    Known issues and solutions

    General: Wacky image colors (swapped colors)
    Solution: This happens when you created a “XYZ LUT + swapped matrix” profile and is a way to alert you that the software you're using does not support XYZ LUT profiles and falls back to the included matrix (which generally means you'd loose accuracy). If you're having this situation only in some applications, creating a “XYZ LUT + matrix” profile will remedy it (but please keep in mind that those applications not supporting XYZ LUT will still fall back to the matrix, so results can be different from applications that support XYZ LUT correctly). If all colormanaged applications you use show swapped colors, you should create a matrix profile instead. Note that you do not have to re-run any measurements: In ${APPNAME}, choose a profile type as suggested previously (you need to enable advanced options in the “Options” menu to show profile type choices on the “Profiling” tab), adjust quality and profile name if you want, then choose “Create profile from measurement data...” in the “File” menu and select the profile you had the issue with.
    General: Measurements are failing (“Sample read failed”) if using the “Allow skipping of spectrometer self-calibration” option and/or highres/adaptive mode
    Solution: Disable either or all of the above options. The problem seems to mainly occur with the ColorMunki Design/Photo.
    USB 3.0 connectivity issues (instrument not found, access failing, or not working properly)
    Such issues would usually manifest themselves through instruments not being found, or randomly disconnecting even if seemingly working fine for some time. From all information that is known about these issues, they seem to be related to USB 3.0, not related to software as the vendor software is also affected, and they seem to occur irrespective of operating system or device drivers.
    The underlying issue seems to be that while USB 3.0 has been designed to be backwards compatible with USB 2.0, some USB 2 devices do not seem to work reliably when connected over USB 3. As currently available instruments with USB connectivity are usually USB 2 devices, they may be affected.
    Solution: A potential solution to such USB 3.0 connectivity issues is to connect the instrument to a USB 2.0 port (if available) or the use of an externally powered USB 2.0 hub.
    Windows: “The process <dispcal.exe|dispread.exe|coloprof.exe|...> could not be started.”
    Solution: If you downloaded ArgyllCMS manually, go to your Argyll_VX.X.X\bin directory, and right-click the exe file from the error message. Select “Properties”, and then if there is a text on the “General” tab under security “This file came from another computer and might be blocked”, click “Unblock”. Sometimes also over-zealous Antivirus or 3rd-party Firewall solutions cause such errors, and you may have to add exceptions for all involved programs (which may include all the ArgyllCMS executables and if you're using Zero Install also python.exe which you'll find in a subdirectory under C:\ProgramData\0install.net\implementations) or (temporarily) disable the Antivirus/Firewall.
    Photoshop: “The monitor profile […] appears to be defective. Please rerun your monitor calibration software.”
    Solution: Adobe ACE, Adobe's color conversion engine, contains monitor profile validation functionality which attempts to filter out bad profiles. With XYZ LUT profiles created in ArgyllCMS versions up to 1.3.2, the B2A white point mapping is sometimes not particularly accurate, just enough so that ACE will see it as a problem, but in actual use it may only have little impact that the whitepoint is a bit off. So if you get a similar message when launching Photoshop, with the options “Use profile regardless” and “Ignore profile”, you may choose “Use profile regardless” and check visually or with the pipette in Photoshop if the inaccurate whitepoint poses a problem. This issue is fixed in ArgyllCMS 1.3.3 and newer.
    MS Windows Vista: The calibration gets unloaded when a User Access Control prompt is shown
    Solution: (Intel and Intel/AMD hybrid graphics users please see “The Calibration gets unloaded after login/resume/User Access Control prompt” first) This Windows Vista bug seems to have been fixed under Windows 7 (and later), and can be remedied under Vista by either manually reloading calibration, or disabling UAC—but please note that you sacrifice security by doing this. To manually reload the calibration, either open ${APPNAME} and select “Load calibration curves from current display profile” under the “Video card gamma table” sub-menu in the “Tools” menu, or (quicker) open the Windows start menu and select “${APPNAME} Profile Loader” in the “Startup” subfolder. To disable UAC[9] (not recommended!), open the Windows start menu and enter “msconfig” in the search box. Click on the Tools tab. Select the line “Disable UAC” and click the “Launch” button. Close msconfig. You need to reboot your system for changes to apply.
    MS Windows with Intel graphics (also Intel/AMD hybrid): The Calibration gets unloaded after login/resume/User Access Control prompt
    Solution: The Intel graphics drivers contain several utilities that interfere with correct calibration loading. A workaround is to rename, move or disable (e.g. using a tool like AutoRuns) the following files:
    C:\Windows\system32\igfxtray.exe
    C:\Windows\system32\igfxpph.dll
    C:\Windows\system32\igfxpers.exe
    MS Windows Vista and later: The display profile isn't used if it was installed for the current user
    Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select “Classic View” under Vista and anything other than “Category View” under Windows 7 and later to see it). Under the “Devices” tab, select your display device, then tick “Use my settings for this device”.
    MS Windows 7 or later: Calibration does not load automatically on login when not using the ${APPNAME} Profile Loader
    Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select something other than “Category View” to see it). Select the “Advanced” tab, then “Change system defaults...”, and finally tick the “Use Windows display calibration” checkbox. Note that the precision of Windows' built-in calibration loading is inferior compared to the ${APPNAME} profile loader and may introduce inaccuracies and artifacts.
    MS Windows XP, multiple displays: One profile is used by all displays connected to a graphics card
    Solution: The underlying issue is that Windows XP assigns color profiles per (logical) graphics card, not per output. Most XP graphics drivers present only one logical card to the OS even if the card itself has multiple outputs. There are several possible solutions to this problem:
    • Use different graphics cards and connect only one display to each (this is probably the preferable solution in terms of ease of use and is least prone to configuration error)
    • Install and use the Windows XP color control applet (note that the original MS download link is no longer available)
    • Some graphics cards, like the Matrox Parhelia APV (no longer produced), will expose two logical cards to the OS when using a specific vendor driver (some older ATI drivers also had this feature, but it seems to have been removed from newer ones)
    Mac OS X 10.08 “Mountain Lion” or newer: Black crush and posterization in applications using ColorSync (e.g. Preview)
    Solution: Due to what appear to be bugs in Mac OS X, applications using ColorSync may show artifacts like black crush and posterization with certain types of display profiles (i.e. cLUT-based ones). Applications from 3rd parties which use their own color management engine (like Adobe products) are not affected. Also not affected seems Apple ColorSync Utility as well as Screenshot Utility, which could be used as a replacement for Apple Preview. Another work-around is to create a simpler single curve + matrix profile with included black point compensation, but a drawback is a potential loss of color accuracy due to the inherent limitiations of this simpler profile type (most other profiling solutions create the same type of simple profile though). The easiest way to create a simple single curve + matrix pofile in ${APPNAME} is to make sure calkibration tone curve is set to a value other than “As measured”, then setting testchart to “Auto” on the “Profiling” tab and moving the patch amount slider all the way to the left (minimum amount of patches). You should see “1xCurve+MTX” in the default profile name.
    Mac OS X 10.11 “El Capitan”: If running via 0install, ${APPNAME} won't launch anymore after updating to El Capitan from a previous version of OS X
    Solution:
    1. Run the “0install Launcher” application from the ${APPNAME}-0install.dmg disk image.
    2. Click “Refresh”, then “Run”. An updated library will be downloaded, and ${APPNAME} should launch.
    3. From now on, you can start ${APPNAME} normally as usual.
    Mac OS X 10.12 “Sierra”: Standalone tools silently fail to start
    Solution: Remove the quarantine flag from the application bundles (and contained files) by opening Terminal and running the following command (adjust the path /Applications/DisplayCAL/ as needed):
    xattr -dr com.apple.quarantine /Applications/DisplayCAL/*.app
    Mac OS X: ${APPNAME}.app is damaged and can't be opened.
    Solution: Go to the “Security & Privacy” settings in System Preferences and set “Allow applications downloaded from” (under the “General” tab) to the “Anywhere” setting. After you have successfully launched ${APPNAME}, you can change the setting back to a more secure option and ${APPNAME} will continue to run properly.
    Linux/Windows: No video card gamma table access (“Calibrate only” and “Calibrate & profile” buttons grayed, “Profile only” button available)
    Solution: Make sure you have not selected a display that doesn't support calibration (i.e. “Web @ localhost” or “Untethered”) and that you have enabled “Interactive display adjustment” or set the tone curve to a different value than “As measured”. Under Linux, please refer to the ArgyllCMS documentation, “Installing the software on Linux with X11” and “Note on X11 multi-monitor setups” / “Fixing access to Video LUTs” therein. Under Windows, please also see the solution posted under “The display profile isn't used if it was installed for the current user” if you are using Windows and make sure you have a recent driver for your video card installed.

    Get help

    Need help with a specific task or problem? It may be a good idea to first check the known issues & solutions if the topic has been covered. If you want to report a bug, please see the guidelines on bug reporting. Otherwise, feel free to use one of the following channels:

    • Help & support forum
    • Contact me directly (but keep in mind other users may also benefit from exchanges, so I'm encouraging the use one of the above channels if possible)

    Report a bug

    Found a bug? If so, please first check the issue tracker, it may have been reported already. Otherwise, please follow these guidelines for reporting bugs:

    • Try to give a short, but concise summary of the problem.
    • Try to give some steps to reproduce the problem.
    • Always attach logfiles if possible. They are usually automatically created by ${APPNAME} as part of normal program operation. If you're having a problem with a particular instrument, it would be great if you could do a run with ArgyllCMS debug output enabled in the “Advanced” sub-menu under the “Options” menu to generate a more verbose debug log - note that you have to enable advanced options first.
      The easiest way to get a complete set of logfiles is to choose “Show log” from the “Tools” menu and then click the “Create compressed archive...” button on the log window (not the “Save as...” button as this will only save the session log). You can also find the logfiles here:
      • Linux: /home/Your Username/.local/share/${APPNAME}/logs
      • Mac OS X: /Users/Your Username/Library/Logs/${APPNAME} and
        /Users/Your Username/Library/Logs/0install
      • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\${APPNAME}\logs
      • Windows XP: C:\Documents and Settings\Your Username\Application Data\${APPNAME}\logs

      Note that if you have upgraded to ${APPNAME} from dispcalGUI, that ${APPNAME} will continue to use the existing dispcalGUI directories (so replace ${APPNAME} with dispcalGUI in the locations above).

      As the folder may contain several logfiles, it is a good idea to compress the whole folder to a ZIP or tar.gz archive that you can easily attach to a bug report.

      Please note the logfiles may contain your username as well as paths of files you may have used in ${APPNAME}. I will respect your privacy at all times, but you may want to consider this when attaching logfiles to public places like the issue tracker.

    Create a new ticket (or if the bug has been reported already, use the existing ticket) at the issue tracker, following the guidelines above, and attach the logfiles archive.

    If you don't want to or can't use the bug tracker, feel free to use one of the other support channels.

    Discussion

    Do you want to get in touch with me or other users regarding ${APPNAME} or related topics? The general discussion forum is a good place to do so. You can also contact me directly.

    To-Do / planned features (in no particular order)

    • Add SMPTE 2084 to simulation profile tone response curve choices and add verification testcharts suitable for HDR display evaluation.
    • Refactor 3D LUT, verification and synthetic ICC profile creator tone response curve selection UI implementation to share more code.
    • On first launch, guide user through basic setup using a wizard (postpone ${APPNAME} update check until after wizard has run?):
      • Check ArgyllCMS availability, if not available or outdated, offer automatic download & installation (consider 0install/native Linux distribution packages?) (implemented)
      • Windows only: Install instrument drivers if necessary (probably need to check if already installed)
      • Check available instruments and instrument capabilities
      • Do instrument specific first launch stuff:
        • Import OEM files (implemented)
        • Choose/create colorimeter correction if applicable
    • When an instrument is first selected:
      • Check if OEM files from the vendor software have already been imported (if applicable); if not, offer to do it. (implemented in v2.1.1.3 Beta and newer, after detecting instruments)
      • Check colorimeter corrections if applicable (from respective vendor software and online database, skip the latter if a spectro is available), in case of no usable specific or generic correction, offer to create one if possible, preferably using spectro measurements as reference, EDID as user-selectable fallback? (Need to sanity-check EDID red/green/blue/white xy coordinates in that case! Possibly against sRGB and AdobeRGB as the most commonly cited gamuts for standard gamut and wide-gamut displays? As some cheaper panels and many of those found in Laptops/Notebooks are sometimes very limited in gamut, additionally a special “low-gamut RGB” may be needed)
      • Users need to be made aware of the implications their colorimeter correction choice has, e.g.
        • When using a correction created from spectral reference measurements of the specific display (user needs a spectro): Usually very good accuracy/match to user's specific display/instrument combination
        • When using a vendor-supplied generic correction: Good (?) (e.g. i1 DisplayPro, ColorMunki Display) to poor (?) (e.g. i1 Display 1/2/LT, Huey, ColorHug) accuracy/match to user's specific display/instrument combination, in case of CCSS considered preferable to corrections supplied by other users because of lab-grade equipment (high spectral resolution) used by vendor.
        • When using a correction supplied by another user for the same display/instrument combination: Good (?) (e.g. i1 DisplayPro, ColorMunki Display, DTP94) to poor (?) (e.g. i1 Display 1/2/LT, Huey, ColorHug) accuracy/match to user's specific display/instrument combination
        • When using EDID of the specific display as reference: Moderate (?) to poor (?) accuracy/match to user's specific display/instrument combination (could be ok match, could be awful, but should in most cases still be able to fix problems like e.g. ColorHug red sensitivity so may be ok as last resort)
    • When trying to import colorimeter corrections or enable the Spyder 2, have automatic mode download the vendor software if needed. (implemented in v2.1.1.2 Beta and newer)
    • (Long-term) improve UI.
    • Better interface to GNOME Color Manager (implemented in v0.8.1.0+)
    • Measure and report on screen homogenity / evenness of illumination
    • Get rid of the terminal and implement a proper GUI for the interactive part of calibration (implemented in v0.8.5.6+)
    • Better user interface for profile verification: If a test set contains multiple value formats (CMYK, RGB, XYZ, L*a*b*), allow selection which one(s) should be used in a “setup” window (“setup” window implemented in v1.5.6.9+, value format selection added in v1.6.3.5)
    • Add gamut coverage percentages to the profile verification report if the test set contains reference values (not *.ti1): Calculate profiles from test set and verification measurements on-the-fly and create gamut volumes from test set profile, evaluated profile, and verification measurements profile using Argyll's iccgamut tool. Compare gamut volumes using Argyll's viewgam tool with -i option and include the results in the report (coverage calculation for test set reference and profile to be evaluated could be done before the actual measurements and also shown in the yet-to-be-implemented profile verification “setup” window).
    • Complete the documentation in the README
    • German language README (postponed)
    • Profile verification (feed XYZ or L*a*b* to display profile, display corresponding RGB values, measure, output Delta E) (implemented in v0.3.6+)
    • “Before” / “After” switch when calibration / profiling complete (implemented in v0.2+)
    • Store all settings in profile, allow loading of settings from profile in addition to .cal file (implemented in v0.2+)
    • Document the code (code documentation could still be enhanced, for now it'll do)
    • Code cleanup (mostly done)

    Thanks and acknowledgements

    I would like to thank the following people:

    Graeme Gill, for creating ArgyllCMS

    Translators: Loïc Guégant, François Leclerc, Jean-Luc Coulon (french translation), Roberto Quintero (spanish translation), Tommaso Schiavinotto (italian translation), 楊添明 (traditional chinese translation), 김환(Howard Kim) (korean translation), 林泽帆(Xpesir) (simplified chinese translation)

    Recent contributors: Nigel Smith, Marcin Koscielecki, Philip Kerschbaum, Shih-Hsiang Lin, Alberto Alessandro Pozzo, John Mackey, Serge Stauffer, Juraj Hatina, Dudley Mcfadden, Tihomir Lazarov, Kari Hrafnkelsson, Michael Gerstgrasser, Sergio Pirovano, Borko Augustin, Greg Hill, Marco Signorini, Hanno Ritzerfeld, Lensvisions Studio, Ute Bauer, Ori Sagiv, Bálint Hajagos, Vesa Karhila, Сергей Кудрин, Sheila Mayo, Lensvisions Studio, Dmitry Ostroglyadov, Lippai Ádám, Aliaksandr Sirazh, Dirk Driesen, Andre Schipper, Jay Benach, Gafyn Jones, Fritz Schütte, Kevin Pinkerton, Truls Aagedal, Eakphan Intajak, Herbert Moers, Jordan Szuch, Clemens Rendl, Nirut Tamchoo, James Barres, Ronald Nowakowski, Stefano Aliffi, Miriana Marusic, Robert Howard, Alessandro Marotta, Björn Stresing, Evgenij Popov, Rodrigo Valim, Robert Smith, Jens Windmüller, 信宏 郭, Swen Heinrich, Matthieu Moy, Sebastian Hoffmann, Ruslan Nedielkov, Fred Wither, Richard Tafel, Chester Chua, Arreat.De, Duane Middlebrook, Stephan Eitel, more...

    And everyone who sent me feedback or bug reports, suggested features, or simply uses ${APPNAME}.

    Acknowledgements

    Part of the comprehensive ArgyllCMS documentation has been used in this document, and was only slightly altered to better fit ${APPNAME}'s behavior and notations.

    Changelog

    ${ISODATE} ${ISOTIME} (UTC) ${VERSION_SHORT} ${STABILITY}

    ${APPNAME} ${VERSION_SHORT} ${STABILITY}

    Added in this release:

    • [Feature] Support the madVR HDR 3D LUT installation API (madVR >= 0.92.13).

    Changed in this release:

    • [Enhancement] In case of a download problem (e.g. automatic updates), offer to visit the download URL manually.
    • [Enhancement] Security: Check file hashes of application setup and portable archive downloads when updating ${APPNAME} or ArgyllCMS.
    • [Enhancement] Security: Use HTTPS for ArgyllCMS download as well.
    • [UI] New application icons and slightly refreshed theme.
    • [UI] Improved HiDPI support by adjusting relative dialog button spacing, margins, and interactive display adjustment window gauge sizes to match proportionally regardless of DPI.
    • [UI] Improved visual consistency of tab buttons (don't lose “selected” state if clicking on a button and then moving the mouse outside of it, “hover” state does no longer override “selected” state, keyboard navigation skips over selected button).
    • [Cosmetic] Measurement report: Make patch preview take into account the “Use absolute values” option again.
    • [Cosmetic] Measurement report: Colorize CCT graph points according to change in hue and chroma.
    • [Cosmetic] Measurement report: Colorize gamma graph points according to change in gamma.
    • [Cosmetic] Measurement report: Dynamically adjust gamma graph vertical axis to prevent cut-off.
    • [Cosmetic] Measurement report: Make RGB balance graph match HCFR (Rec. 709 only). Note that new and old balance graphs are only comparable to a limited extent (use “Update measurement or uniformity report” in the “Tools” menu to update existing reports).
    • [Cosmetic] Profile loader (Windows): Unset non belonging profile when resetting a profile association.
    • Mac OS X: Set default profile type to single curve + matrix with black point compensation due to long-standing Mac OS X bugs with any other profile type.

    Fixed in this release:

    • [Moderate] Unhandled exception and UI freeze when the 3D LUT format was set to madVR and there never was a prior version of ArgyllCMS on the system or the previous version was older than or equal to 1.6.3 during that same ${APPNAME} session, due to a missing capability check.
    • [Moderate] Division by zero when trying to create a SMPTE 2084 HDR 3D LUT if the profile black level was zero (regression of a change in ${APPNAME} 3.4, SVN revision r4896).
    • [Minor] If using the alternate forward profiler and the profile type was XYZ LUT + swapped matrix, the swapped matrix was overwritten with an accurate one (regression introduced in ${APPNAME} 3.3.4, SVN revision r4736).
    • [Minor] It was not possible to run a measurement report with a simulation profile set as display profile, but no profile assigned to the actual display.
    • [Minor] Rec. 1886 measurement report with originally non Rec. 709 tone response profile: Make sure to override the original tone response of the profile so Rec. 1886 gives the expected result.
    • [Minor] If a measurement report HTML file was mangled by another application that removed the XML self-closing tags forward slashes, it was not possible to correctly update the report using “Update measurement or uniformity report” from the “Tools” menu.
    • [Minor] If using a pattern generator, check it is valid before binding a disconnect-on-close event when using the visual whitepoint editor. Prevents an attribute error when using the visual whitepoint editor and the madTPG network implementation (i.e. under Mac OS X).
    • [Minor] Windows: Always use the active display device directly when querying or setting profiles instead of mimicking applications using the Windows GetICMProfile API (fixes getting the correct profile with display configurations consisting of three or more displays where some of them are deactivated).
    • [Minor] Profile loader (Windows): Check whether or not a display device is attached to multiple adapters and disable fixing profile associations in that case.
    • [Minor] Profile loader (Windows): Work-around hitching caused by Windows WcsGetDefaultColorProfile API call on some systems.
    • [UI] Measurement window: Make sure focus stays on the last focused control when the window itself gains focus again after losing focus.
    • [UI] Synthetic ICC Profile Creator: Update HDR SMPTE 2084 diffuse white info text when changing luminance.
    • [Trivial] HDR SMPTE 2084 3D LUT: Interpolate the last two segments before the clipping point of the intermediate input LUT shaper curves (prevents potential slight banding in highlights).
    • [Trivial] Windows: Make sure the profile loader is launched directly after installing a profile when using a portable version of ${APPNAME} (parity with installer version).
    • [Trivial] Profile loader (Windows): Re-introduce --skip command line option.
    • [Cosmetic] Profile loader (Windows): When disassociating a profile from a device, suppress ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE error sometimes (in some cases always?) resulting from the WcsDisassociateColorProfileFromDevice Windows API call, even though the profile was successfully disassociated.
    2017-12-30 14:16 (UTC) 3.4

    DisplayCAL 3.4

    Added in this release:

    • [Feature] HDR Hybrid Log-Gamma transfer function option for 3D LUTs.
    • [Feature] HDR verification testcharts.
    • [UI] Simplified chinese translation thanks to 林泽帆(Xpesir).
    • [Enhancement] Linux: wxPython Phoenix 4.0.0b/rc1 compatibility.
    • [Enhancement] Profile loader (Windows): Notifications (for 3rd party calibration/profiling software and user-defined exceptions) can be turned off.

    Changed in this release:

    • [Enhancement] HDR 3D LUTs: SMPTE 2084 with roll-off now allows specifying the mastering display minimum and peak luminance which are used to adjust the roll-off start and clipping points (BT.2390-3).
    • [Enhancement] HDR 3D LUTs: Chroma compression is now done in Lpt color space, providing improved preservation of detail in compressed highlights.
    • [Enhancement] Do not disable the measurement report button if the selected setting is a preset and a simulation profile is used as display profile with tone curve set to “Unchanged” (i.e. do not require selecting “<Current>” under settings to allow verifying the native device response against a selected simulation profile).
    • [Enhancement] Limit profile name length taking into account the full path of the final storage directory.
    • [Enhancement] Disable automatic output levels detection for colorimeter correction creation measurements.
    • Changed the “Softproof” and “Video” presets to no longer intentionally swap red and green for the fallback matrix.
    • [UI] [Cosmetic] Minor UI consistency changes.
    • [Enhancement] Linux: X11 root window _ICC_PROFILE_xxx atom enumeration for Xrandr now matches the Xinerama order, so that _ICC_PROFILE_xxx atoms match irrespective of which extension applications are using. This improves conformance to the ICC Profiles in X Specification and matches the respective change in ArgyllCMS 2.0.
    • Mac OS X (standalone application): No longer support OS X versions prior to 10.6. This streamlines and slims the application bundle and allows using more recent 3rd party dependencies which are not available for older Mac OS X releases. If you still need support for Mac OS X 10.5, use the 0install version of DisplayCAL.

    Fixed in this release:

    • [Critical] Ensure alternate forward profiler device to PCS table input curves are strictly monotonically increasing to prevent clipping resulting in peaks in the response in case of bad underlying (non-monotonic) device behavior (regression of a change in DisplayCAL 3.3.5, SVN revision r4838).
    • [Minor] Always force the first entry in PCS to device table input curves to zero when generating high resolution PCS to device tables (fixes potential unexpected non-zero RGB output for zero input to perceptual PCS to device table).
    • [UI] [Cosmetic] When not confirming a manual DisplayCAL update but ArgyllCMS is up to date, reflect this in the final dialog message.
    • [Trivial] ReShade 3D LUT: If ReShade 3.x default shaders are installed, write the different parts of the 3D LUT to the correct respective sub-directories and no longer write the superfluous ReShade.fx.
    • [UI] [Cosmetic] Linux: Prevent flickering of tab buttons on some systems when switching tabs.
    • [Moderate] Linux: The way display device enumeration was performed was not always guaranteed to give consistent results across the different available external device to profile mapping APIs, which could lead to wrong profile associations in multi-display configurations (this fix is required to match how ArgyllCMS 2.0 enumerates displays).
    • [Minor] Mac OS X (standalone application): Bundle certificate authority certificates to enable verifying server certificates (fixes not being able to automatically download updates).
    • [Minor] Windows: When creating a colorimeter correction from measurement file(s) stored in a path where one or more components(s) started with a number from 1-9 or the lowercase letter g, the operation failed and the created colorimeter correction had to be retrieved from the temporary directory manually.
    • [Minor] Profile loader (Windows): When manually disabling calibration loading via the pop-up menu, and then starting DisplayCAL (or another application detected by the profile loader) and closing it again, the profile loader would stay disabled, including the calibration loading related menu items, requiring a profile loader restart.
    2017-10-18 17:34 (UTC) 3.3.5

    DisplayCAL 3.3.5

    Changed in this release:

    • [Enhancement] Updated french localization (thanks to Jean-Luc Coulon).
    • [Enhancement] When generating high resolution PCS to device tables for XYZ LUT profiles, round PCS candidate “fit” so a good match is not potentially needlessly discarded in favor of a match with lower effective usage of the available lookup table grid points (may speed up the process as well).
    • [Enhancement] Use single curve detection based on calibration accuracy for shaper tags of XYZ LUT profiles as well.

    Fixed in this release:

    • [Minor] When enabling the Spyder2, check if the spyd2PLD.bin firmware has actually been successfully extracted (taking into account the install scope) and fall back to alternate methods when using automatic mode if the firmware cannot be extracted from the vendor software present in the local filesystem (fixes inability to enable the Spyder2 under Mac OS X if the vendor software is installed).
    • [Minor] Windows: Make measurement report filename safe for filesystem encoding (works around encoding quirks with certain locales).
    • [Minor] Windows: Windows silently strips any combination of trailing spaces and dots in file and folder names, so do the same for the profile name.
    • [Minor] Profile loader (Windows): WCS can return no profile without error in some situations, but the no error case wasn't accounted for, resulting in an unhandled exception in that case.
    • [Minor] Profile loader (Windows): Get the process identifier before enumerating windows to prevent an unhandled exception if a madVR instance is already running before starting the profile loader.
    • [Cosmetic] Profile loader (Windows): Detect if the current display profile video card gamma table tag contains linear calibration when checking if madVR did reset the video card gamma table to linear to prevent the profile loader alternating between enabled and disabled state if using windowed overlay in madVR.
    2017-09-13 12:09 (UTC) 3.3.4.1

    DisplayCAL 3.3.4.1

    Fixed in this release:

    • [Moderate] Linux (profile installation and profile loading): Getting the fallback XrandR display device ID could unexpectedly return no result in some cases due to incorrect parsing, leading to potential application of a stale device to profile mapping or no profile at all (regression of a change in ${APPNAME} 3.3.4, SVN revision r4800).
    • [Minor] Linux, Mac OS X: The visual whitepoint editor was failing to update the test pattern area of a connected madTPG instance when madVR was selected as display device, due to an implementation bug related to setting the background color.
    2017-09-09 15:53 (UTC) 3.3.4

    DisplayCAL 3.3.4

    Added in this release:

    • Verification charts for ISO 14861:2015 soft proofing evaluation.

    Changed in this release:

    • [Enhancement] More even and consistent CPU utilization on multi CPU/multi core systems during high resolution device-to-PCS table generation.
    • [Enhancement] Multi-threaded gamut view calculation.
    • [Enhancement] Use an alternate way to generate the matrix for profiles created from the small testchart for matrix profiles (may improve accuracy on very linear displays) and use an optimized tone response curve if using a single curve and the measured response is a good match to an idealized parametric or standardized tone response curve.
    • [Enhancement] Uniformity report: No longer include (meaningless) correlated/closest color temperature. Use “traffic light” visual indicators in conjunction with unambiguous pass/fail messages to allow easy at-a-glance assessment of the results, and also include contrast ratio deviation to fully conform to ISO 12646:2015 and 14861:2015. You can update old reports via “Update measurement or uniformity report...” in the “Report” sub-menu of the “Tools” menu.
    • [Enhancement] Measurement report: Use the display profile whitepoint as reference white for the measured vs. profile white delta E calculation and use the assumed target whitepoint as reference white for the measured vs. assumed white delta E calculation to make the reported delta E more meaningful.
    • [Enhancement] Measurement report: Allow to use the display profile whitepoint as reference white when using absolute (not D50 adapted) values.
    • [Enhancement] Profile installation (Linux): Always do fallback colord profile installation using colormgr if available unless the ARGYLL_USE_COLORD environment variable is set.
    • [Enhancement] Profile loader (Linux): Include the profile source (colord or Argyll's UCMM) in diagnostic output and use the XrandR device ID as fallback when no EDID is available.
    • [Enhancement] Profile loader (Windows): Slightly improve encoding accuracy of quantizing to 8 < n < 16 bits.
    • [Trivial] Offer the complete range of input encodings for the eeColor 3D LUT format and do not force an identical output encoding.
    • [Trivial] Do not store calibration settings in a profile if calibration is disabled.
    • [Trivial] Revert the default profile type for the 79 patches auto-optimized testchart slider step to XYZ LUT + matrix.
    • [Trivial] Iridas cube 3D LUTs: Increase compatibility by stripping leading whitespace from text lines and adding DOMAIN_MIN/MAX keywords if missing.
    • [Trivial] Measurement report: Calculate true combined a*b* range for grayscale instead of summing separate ranges.
    • [Trivial] Measurement report: Automatically enable “Use absolute values” if using full whitepoint simulation (i.e. not relative to display profile whitepoint).

    Fixed in this release:

    • [Moderate] When cancelling profiling measurements with the testchart set to “Auto”, the testchart UI and the internal test chart setting were no longer in sync until changing the profile type or restarting the application.
    • [Moderate] Synthetic ICC profile creator: Unhandled exception when trying to create DICOM (regression of a change in DisplayCAL 3.1.5, SVN revision r4020) or SMPTE 2084 profiles (regression of multiprocessing changes in DisplayCAL 3.3).
    • [Minor] Protect against potentially clipping slightly above black values during high resolution device-to-PCS table generation (regression of a change in DisplayCAL 3.3.3, SVN revision r4705).
    • [Minor] Protect against enumerating displays and ports in response to a DISPLAY_CHANGED event when the main window isn't shown or isn't enabled which could lead to a hang due to a race condition.
    • [Minor] Verification using a simulation profile that defines an identity matrix in its 'chad' tag (e.g. ISOnewspaperv4) did not work correctly due to the matrix being mapped to “None” insatead of “XYZ scaling”.
    • [Minor] Verification using a CMYK simulation profile failed with a “Profile invalid” error if previously “Use simulation profile as display profile” and “Device link profile” were enabled but no device link profile selected.
    • [Minor] Remove separate videoLUT access support under Windows and Mac OS X (separate videoLUT access is only supported under X11).
    • [Minor] Downloaded files were not renamed from their temporary name if the server did not return a Content-Length header (this typically only happens for text files, not binary files). Fixes not being able to import colorimeter corrections from iColor Display.
    • [Trivial] Do not reflect the black point hue in tone response curves of single curve + matrix profiles when not using black point compensation.
    • [Trivial] Measurement report: Additional stats median calculation index was off by n+1.
    • [Cosmetic] Display model name and manufacturer description tags were missing from profiles created using the alternate forward profiler.
    • [Cosmetic] Measurement report: Eliminate “Use absolute values” having a side-effect on the RGB patches preview.
    • [Cosmetic] Windows: When closing some of the standalone tools when minimized, e.g. by right-clicking the taskbar button and choosing “Close” from the menu, or by using the taskbar preview close button, the application did not close until restored from its minified state (i.e. by clicking on the taskbar button or switching to it with the task switcher).
    2017-08-08 18:40 (UTC) 3.3.3

    DisplayCAL 3.3.3

    Added in this release:

    • Intermediate auto-optimized testchart step with 115 patches.

    Changed in this release:

    • [UI] [Cosmetic] Verification tab: Always show advanced tone response curve options when “Show advanced options” is enabled in the “Options” menu.
    • [UI] [Trivial] Verification tab: Don't reset the simulation profile tone response curve choice unless changing the simulation profile.
    • [Enhancement] [Trivial] When encountering an invalid peak white reading during output levels detection, advise to check if the instrument sensor is blocked.
    • [Enhancement] Visual whitepoint editor: Use whitepoint of currently selected profile (unless it's a preset or “<Current>”) instead of associated display profile.
    • [Enhancement] Blend profile black point to a*b* = 0 by default. This makes the visual appearance of black and near black response in Photoshop (which uses relative colorimetric intent with black point compensation for display by default) match the DisplayCAL perceptual table of XYZ LUT profiles (which means neutral hues gradually blend over to the display black point hue relatively close to black. The rate of this blend and black point hue correction are influenced by the respective calibration settings, which is another added benefit of this change).
    • [Enhancement] Measurement & uniformity report: Change average delta a, b, L, C, and H to be calculated from absolute values.
    • [Enhancement] Profile loader (Windows): Don't implicitly reset the video card gamma table to linear if no profile is assigned or couldn't be determined. Show an orange-red error icon in the latter case and display details in the left-click notification popup.
    • [Cosmetic] Windows: Log errors when trying to determine the active display device during profile installation.

    Fixed in this release:

    • [UI] [Cosmetic] Verification tab: Don't accidentally enable the simulation profile tone response curve black output offset (100%) radio button when switching tabs.
    • [Trivial] Show error dialog if not able to connect to instrument for single reading.
    • [Minor] Strip the “firmware missing” message from the Spyder2 instrument name if it was not yet enabled (makes the automatic popup to enable the Spyder2 work).
    • [Minor] Prisma 3D LUT upload with 1.07 firmware.
    • [Minor] More accurately encode the black point in the colorimetric PCS to device table by explicitly clipping below black values to zero.
    2017-06-29 15:10 (UTC) 3.3.2

    DisplayCAL 3.3.2

    Added in this release:

    • IPT and Lpt color spaces (profile information 2D and 3D gamut view, testchart editor 3D view).
    • ACEScg and DCDM X'Y'Z' source profiles.

    Changed in this release:

    • [Enhancement] Changed HDR 3D LUT SMPTE 2084 roll-off colorimetric rendering to do gamut mapping in ICtCp (slightly improved hue and saturation preservation of bright saturated colors).
    • [Trivial] Include output levels detection related files in session archives.

    Fixed in this release:

    • [Moderate] Unhandled exception when trying to set a white or black level target on the calibration tab via the newly introduced measurement buttons (regression of a change in ${APPNAME} 3.3.x, SVN revision r4557).
    • [Moderate] Black point compensation for cLUT-type profiles in the advanced options did not work correctly (regression of a change in ${APPNAME} 3.3.x, SVN revision r4538).
    • [Moderate] Unhandled exception when creating L*a*b* LUT profiles (regression of multiprocessing changes in ${APPNAME} 3.3.x, SVN revision r4433). Note that creating L*a*b* LUT profiles is not recommended due to the limited ICC encoding range (not suitable for wide-gamut) and lower accuracy and smoothness compared to XYZ LUT.
    • [Minor] Output levels detection and alternate forward profiler were not working when using output levels quantization via additional dispread command line option -Z nbits.
    • [Minor] Do not create shaper curves for gamma + matrix profiles.
    • [Minor] Don't fall back to colorimetric rendering for HDR 3D LUT SMPTE 2084 roll-off when using luminance matched appearance or luminance preserving perceptual appearance rendering intents.
    • [Trivial] DIN99c and DIN99d white point misalignment (profile information 2D and 3D gamut view, testchart editor 3D view).
    • [UI] [Cosmetic] Change info panel text to use system text color instead of defaulting to black.
    • [Minor] Linux (0install): Prevent system-installed protobuf package shadowing 0install implementation.
    2017-06-04 16:04 (UTC) 3.3.1

    DisplayCAL 3.3.1

    Fixed in this release:

    • Unhandled exception if using CIECAM02 gamut mapping when creating XYZ LUT profiles from regularly spaced grid patch sets with the alternate forward profiling method introduced in ${APPNAME} 3.3.
    2017-05-30 17:48 (UTC) 3.3

    DisplayCAL 3.3

    Added in this release:

    • Profiling engine enhancements:
      • [Feature] Better multi CPU/multi core support. Generating high resolution PCS-to-device tables is now taking more advantage of multiple (physical or logical) processors (typical 2x speedup on a i7 6700K CPU).
      • [Enhancement] Generating a simple high resolution perceptual table is now done by copying the colorimetric table and only generating new input curves. This markedly reduces the processing time needed to create the perceptual table (6x speedup on a i7 6700K CPU).
      • [Enhancement] Black point compensation now tries to maintain the whitepoint hue until closer to the black point. This makes curves + matrix profiles in the default configuration (slightly) more accurate as well as the default simple perceptual table of cLUT profiles provide a result that is closer to the colorimetric table.
      • [Enhancement] The curves tags of XYZ LUT + matrix profiles will now more closely match the device-to-PCS table response (improves grayscale accuracy of the curves tags and profile generation speed slightly).
      • [Enhancement] The curves tags of matrix profiles are further optimized for improved grayscale accuracy (possibly slightly reduced overall accuracy if a display device is not very linear).
      • [Enhancement] XYZ LUT profiles created from small patch sets (79 and 175 patches) with regularly spaced grids (3x3x3+49 and 5x5x5+49) now have improved accuracy due to an alternate forward profiling method that works better for very sparsely sampled data. Most presets now use 5x5x5+49 grid-based patch sets by default that provide a reduction in measurement time at about the same or in some cases even slightly better accuracy than the previously used small patch sets.
      • [Enhancement] Additional PCS candidate based on the actual measured primaries of the display device for generating high resolution PCS-to-device tables. This may further reduce PCS-to-device table generation time in some cases and lead to better utilization of the available cLUT grid points.
    • [Feature] Calibration whitepoint targets other than “As measured” will now also be used as 3D LUT whitepoint target, allowing the use of the visual whitepoint editor to set a custom whitepoint target for 3D LUTs.
    • [Feature] Automatically offer to change the 3D LUT rendering intent to relative colorimetric when setting the calibration whitepoint to “As measured”.
    • [Feature] Support for madVR's ability to send HDR metadata to the display via nVidia or Windows 10 APIs (i.e. switch a HDR capable display to HDR mode) when creating SMPTE 2084 3D LUTs. Note that you need to have profiled the display in HDR mode as well (currently only possible by manually enabling a display's HDR mode).
    • [Feature] Output levels selection as advanced option and automatic output levels detection. Note that this cannot detect if you're driving a display that expects full range (0..255) in limited range (16..235), but it can detect if you're driving a display that expects limited range in full range and will adjust the output levels accordingly.
    • [Feature] New experimental profiling patch sequence advanced options. “Minimize display response delay” is the ArgyllCMS default (same as in previous versions of ${APPNAME}). “Maximize lightness difference”, “Maximize luma difference”, “Maximize RGB difference” and “Vary RGB difference” are alternate choices which are aimed at potentially dealing better with displays employing ASBL (automatic static brightness limiting) leading to distorted measurements, and should be used together with display white level drift compensation.
    • [Feature] Optional alternate method for creating colorimeter correction matrices that minimizes xy chromaticity difference (four color matrix method).
    • [Feature] The curve viewer and profile information now have the ability to plot tone response curves of RGB device link profiles.
    • [Feature] The white and black level calibration target can now be set by measurement.
    • [Enhancement] The visual whitepoint editor is now compatible with Chromecast, Web @ localhost, madVR, Prisma and Resolve pattern generators.
    • [Enhancement] 3D LUT generator ReShade 3.0 compatibility.
    • [Feature] Support calibration from WCS profiles embedded in ICC profiles (like the ones created by the Windows Display Color Calibration Tool).
    • [Feature] Profile loader (Windows): Detect the Windows Display Color Calibration Tool.
    • [Feature] Profile loader (Windows): The quantization bitdepth can now be selected.

    Changed in this release:

    • [Enhancement] The visual whitepoint editor now uses the calibration of the currently active display profile as the initial whitepoint.
    • [Enhancement] Temporary files will no longer be removed if moving the files to the final location failed, and a non-empty temporary directory will no longer be removed on exit.
    • [Enhancement] Incomplete runs are now always saved to a folder named 'incomplete' in the parent directory of the 'storage' directory (previously when creating a profile from existing measurement data, a failed run could overwrite existing files in a source folder that did not reside in the 'storage' directory).
    • [Enhancement] Use a different (numbered) logfile name when starting additional instances of the standalone tools.
    • [Enhancement] When creating colorimeter correction matrices from existing spectral reference data, use the selected observer.
    • [UI] Hide the observer selector in the colorimeter correction creation dialog when creating a spectral colorimeter correction as observer isn't applicable in that case.
    • [UI] Remove the single “Browse...” button from the colorimeter correction creation dialog and add individual file pickers for reference and colorimeter measurement data files.
    • [UI] When creating colorimeter corrections for “virtual” display devices like madVR or Resolve, offer to specify the actual display model and manufacturer.
    • [UI] Use smaller increments when paging up/down the black point rate or testchart patches amount sliders.
    • [Cosmetic] Default whitepoint color temperature and chromaticity to 6500K and D65 respectively.
    • [Cosmetic] If you explicitly pause measurements prior to attempting to cancel them, and then dismiss the confirmation dialog, the measurements will no longer automatically resume (unpause) anymore.
    • [Enhancement] Linux: When installing instrument udev rules, backup existing rules to a timestamped backup directory ~/.local/share/${APPNAME}/backup/YYYYMMDDTHHMMSS instead of overwriting existing backups in ~/.local/share/${APPNAME}/backup, and automatically add the current user to the 'colord' group (which will be created if nonexistent) if not yet a member.
    • [Cosmetic] Mac OS X: Don't include ID in profile header (stops ColorSync utility from complaining).
    • [Enhancement] Profile loader (Windows): The selected calibration state will not be implicitly (re-)applied every three seconds, but only if a change in the running processes or video card gamma tables is detected. This has been reported to stop hitching on some systems using Intel integrated graphics, and works around an issue with the Windows 10 Creators Update and fullscreen applications (e.g. games) where the calibration state would not be restored automatically when returning to the desktop.
    • [Enhancement] Profile loader (Windows): The profile loader will check whether or not madVR resets the videoLUT and preserve calibration state if not.
    • [UI] [Cosmetic] Profile loader (Windows): Renamed “Preserve calibration state” menu item to “Load calibration on login & preserve calibration state” to reduce ambiguity.
    • [UI] [Cosmetic] Profile loader (Windows): The tray icon will animate when calibration is reloaded.
    • [UI] [Cosmetic] Windows 7 and newer: Show progress in the taskbar.

    Fixed in this release:

    • [Minor] Prevent ArgyllCMS from removing measurements with one or two zero CIE components by fudging them to be non-zero.
    • [Minor] In some cases the high resolution colorimetric PCS-to-device table of XYZ LUT profiles would clip slightly more near black than expected.
    • [Trivial] Save and restore SMPTE 2084 content colorspace 3D LUT settings with profile.
    • [UI] [Minor] Changing the application language for the second time in the same session when a progress dialog had been shown at any point before changing the language for the first time, resulted in an unhandled exception. This error had the follow-up effect of preventing any standalone tools to be notified of the second language change.
    • [UI] [Trivial] The “Install Argyll instrument drivers” menu item in the “Tools” menu is now always enabled (previously, you would need to select the location of the ArgyllCMS executables first, which was counter-intuitive as the driver installer is separate since ${APPNAME} 3.1.7).
    • [UI] [Cosmetic] When showing the main window (e.g. after measurements), the progress dialog (if present) could become overlapped by the main window instead of staying in front of it. Clicking on the progress dialog would not bring it back into the foreground.
    • [UI] [Minor] 3D LUT tab: When selecting a source colorspace with a custom gamma tone response curve, the gamma controls should be shown regardless of whether advanced options are enabled or not.
    • [Trivial] Testchart editor: Pasting values did not enable the “Save” button.
    • [UI] [Minor] Untethered measurement window: The “Measure” button visual state is now correctly updated when cancelling a confirmation to abort automatic measurements.
    • [Minor] Windows: Suppress errors related to WMI (note that this will prevent getting the display name from EDID and individual ArgyllCMS instrument driver installation).
    • [UI] [Cosmetic] Profile loader (Windows): Changing the scaling in Windows display settings would prevent further profile loader tray icon updates (this did not affect functionality).
    • [Minor] Profile loader (Windows): Undefined variable if launched without an active display (i.e. if launched under a user account that is currently not the active session).
    • [Minor] Profile loader (Windows): Original profile loader instance did not close after elevation if the current user is not an administrator.
    2017-02-18 15:52 (UTC) 3.2.4

    3.2.4

    Added in this release:

    • Korean translation thanks to 김환(Howard Kim).

    Changed in this release:

    • Disable observer selection if observer is set by a colorimeter correction.
    • 3D LUT maker: Enable black output offset choice for 16-bit table-based source profiles.
    • Profile loader (Windows): “Automatically fix profile associations” is now enabled by default.
    • Build system: Filter out “build”, “dist” as well as entries starting with a dot (“.”) to speed up traversing the source directory tree (distutils/setuptools hack).

    Fixed in this release:

    • Could not create colorimeter correction from existing measurements for instruments that don't support alternative standard observers.
    • ColorHug / ColorHug2 “Auto” measurement mode threw an error if the extended display identification data did not contain a model name.
    • [Trivial] [Cosmetic] Testchart editor: When adding reference patches, resize row labels if needed.
    • Profile loader (Linux): When errors occured during calibration loading, there was no longer any message popup.
    • Profile loader (Windows): Filter non-existing profiles (e.g. ones that have been deleted via Windows Explorer without first disassociating them from the display device) from the list of associated profiles (same behavior as Windows color management settings).
    • Profile loader (Windows): When changing the language on-the-fly via ${APPNAME}, update primary display device identfier string.
    2017-01-04 14:10 (UTC) 3.2.3

    3.2.3

    Changed in this release:

    • Updated traditional chinese translation (thanks to 楊添明).
    • Profile loader (Windows): When creating the profile loader launcher task, set it to stop existing instance of the task when launching to circumvent a possible Windows bug where a task would not start even if no previous instance was running.

    Fixed in this release:

    • When querying the online colorimeter corrections database for matching corrections, only query for corrections with a matching manufacturer ID in addition to a matching display model name (fixes corrections being offered for displays from different manufacturers, but matching model names).
    • Profile loader (Windows): Fix unhandled exception if no profile is assigned to a display (regression of a change to show the profile description instead of just the file name in ${APPNAME} 3.2.1).

    2016-12-13 22:27 (UTC) 3.2.2

    3.2.2

    Changed in this release:

    • Importing colorimeter corrections from other display profiling software now only imports from the explicitly selected entries in automatic mode.
    • Profile loader launcher (Windows): Pass through --oneshot argument to profile loader.

    Fixed in this release:

    • Visual whitepoint editor: Opening a second editor on the same display without first dragging the previously opened editor to another display would overwrite the cached profile association for the current display with the visual whitepoint editor temporary profile, thus preventing the correct profile association being restored when the editor was closed.
    • Mac OS X: Fall back to HTTP when downloading X3D viewer components to work around broken Python TLS support.
    • Windows: When installing instrument drivers, catch WMI errors while trying to query device hardware IDs for instruments.
    • Profile loader (Windows): Possibility of unhandled exception when resuming from sleep if the graphics chipset is an Intel integrated HD graphics with more than one attached display device (may affect other graphics chipsets as well).
    2016-11-25 13:35 (UTC) 3.2.1

    3.2.1

    Changed in this release:

    • Profile loader (Windows Vista and later): The profile loader process now auto-starts with the highest available privileges if installed as administrator. This allows changing system default profile associations whenever logged in with administrative privileges.
    • Profile loader (Windows Vista and later): If running under a restricted user account and using system defaults, clicking any of the “Add...”, “Remove” and “Set as default” buttons will allow to restart the profile loader with elevated privileges.
    • Profile loader (Windows): Show profile description in addition to profile file name in profile associations dialog.

    Fixed in this release:

    • Linux, Windows: Visual whitepoint editor was not working in HiDPI mode.
    • Windows: Irritating “File not found” error after installing a profile with special characters in the profile name (note that the profile was installed regardless).
    • [Cosmetic] Standalone executables (Windows): In HiDPI mode, taskbar and task switcher icons could be showing placeholders due to missing icon files.
    • [Minor] Profile loader (Windows): Enable the profile associations dialog “Add...” button irrespective of the current list of profiles being empty.
    • [Minor] Profile loader (Windows): Suppress error message when trying to remove a profile from the active display device if the profile is the system default for said device (and thus cannot be removed unless running as administrator) but not for the current one.
    • Profile loader (Windows): Do not fail to close profile information windows if the profile associations dialog has already been closed.
    • Profile loader (Windows): If logging into another user account with different DPI settings while keeping the original session running, then logging out of the other account and returning to the original session, the profile loader could deadlock.
    2016-11-19 11:01 (UTC) 3.2

    3.2

    Added in this release:

    • Visual whitepoint editor. This allows visually adjusting the whitepoint on display devices that lack hardware controls as well as match several displays to one another (or a reference). To use it, set the whitepoint to “Chromaticity” on the “Calibration” tab and click the visual whitepoint editor button (you can open as many visual whitepoint editors simultaneously as you like, so that e.g. one can be left unchanged as reference, while the other can be adjusted to match said reference). The editor window can be put into a distraction-free fullscreen mode by maximizing it (press ESC to leave fullscreen again). Adjust the whitepoint using the controls on the editor tool pane until you have achieved a visual match. Then, place your instrument on the measurement area and click “Measure”. The measured whitepoint will be set as calibration target.
    • Another “Auto” testchart slider step with 154 patches (equal to small testchart for LUT profiles) for XYZ LUT + matrix profile type.

    Changed in this release:

    • Menu overhaul. Menus are now better organized using categorized sub-menus and some menu items have been moved to more appropriate locations:
      • The “Options” menu no longer contains any functionality besides actual options. Advanced options have been moved to a sub-menu.
      • Profile creation from existing measurement files or EDID, profile installation as well as profile upload (sharing) functionality can now be found in the “File” menu.
      • Most functionality available in the “Tools” menu has been grouped into categorized sub-menus, with some of the less-used functionality now available under a separate “Advanced” sub-menu.
      • Measuring the selected testchart, enhancing the effective resolution of a colorimetric PCS-to-device table, loading calibration and resetting the video card gamma tables, detecting displays & instruments, as well as user-initiated spectrometer self-calibration functionality has been moved to the “Tools” menu and respective sub-menus where applicable.
    • Changed default curves + matrix profile testchart as well as first “Auto” testchart slider step back to pre-3.1.7 chart with 73 patches.
    • Better curves + matrix profiles as well as faster computation of XYZ LUT + matrix profiles. The matrix and shaper curves of gamma + matrix, curves + matrix as well as XYZ LUT + matrix profiles are now generated in separate steps which improves the shape and grayscale neutrality of the curves on less well-behaved displays. XYZ LUT + matrix profiles will compute faster, because the curves and matrix are created from a sub-set of the profiling patches, and take around the same time as XYZ LUT + swapped matrix profiles, resulting in a typical overall computation speed increase of around +33% (+100% if just looking at the time needed when not creating PCS-to-device tables) for a XYZ LUT + matrix profile computed from 1148 patches. XYZ LUT + matrix profiles computed from more patches should see a larger computation speed increase of up to +100% depending on patch count.
    • Resolve pattern generator and non-native madVR network implementation: Determine the computer's local network IP address in a way that is hopefully more reliable across platforms.
    • Profile loader (Windows): Detect and work-around buggy Intel video drivers which, despite reverting to linear gamma tables at certain points (e.g. UAC prompts), will effectively ignore attempts to restore the gamma table calibration if it is considered to be already loaded by the driver.
    • Profile loader (Windows): Replaced “Open Windows color management settings...” pop-up menu item with own “Profile associations...” implementation. This should work better with multi-display configurations in contrast to Windows' braindead built-in counterpart, i.e. display devices will be listed under their EDID name (if available) as well as their viewport position and size on the virtual desktop and not only their often meaningless generic driver name like “PnP-Monitor”. Also, there won't be multiple entries for the same display device or ambiguous “1|2” identifications if there are display devices that are currently not part of the desktop due to being disabled in Windows display settings. Changing profile associations around is of course still using Windows color management functionality, but the custom UI will look and act more sane than what Windows color management settings has to offer.
    • Profile loader (Windows): Clicking the task bar tray icon will now always show up-to-date (at the time of clicking) information in the notification popup even if the profile loader is disabled.
    • Profile loader (Windows): Starting a new instance of the profile loader will now always attempt to close an already running instance instead of just notifying it, allowing for easy re-starting.
    • Windows (Vista and later): Installing a profile as system default will now automatically turn off “Use my settings for this device” for the current user, so that if the system default profile is changed by another user, the change is propagated to all users that have opted to use the system default profile (which is the whole point of installing a profile as system default).

    Fixed in this release:

    • Spectrometer self-calibration using an i1 Pro or i1 Pro 2 with Argyll >= 1.9 always presented the emissive dark calibration dialog irrespective of measurement mode (but still correctly did a reflective calibration if the measurement mode was one of the high resolution spectrum modes).
    • User-initiated spectrometer self-calibration was not performed if “Allow skipping of spectrometer self-calibration” was enabled in the “Options” menu and the most recent self-calibration was still fresh.
    • Cosmetic: If an update check, colorimeter correction query or profile sharing upload returned a HTTP status code equal to or greater than 400 (server-side error), an unhandled exception was raised instead of presenting a nicer, formatted error dialog (regression of ${APPNAME} 3.1.7 instrument driver installer download related changes).
    • Profile loader (Windows, cosmetic): Reflect changed display resolution and position in UI (doesn't influence functionality).
    • Resolve pattern generator: Unhandled exception if the system hostname could not be resolved to an IP address.
    2016-10-24 10:13 (UTC) 3.1.7.3

    3.1.7.3

    Fixed in this release:

    • 0install (Linux): (un)install-standalone-tools-icons command was broken with 3.1 release.
    • Profile loader (Linux): Unhandled exception if oyranos-monitor is present (regression of late initialization change made in 3.1.7).
    2016-10-21 12:26 (UTC) 3.1.7.2

    3.1.7.2

    Changed in this release:

    • Windows: Toggling the “Load calibration on login” checkbox in the profile installation dialog now also toggles preserving calibration state in the profile loader and vice versa, thus actually affecting if calibration is loaded on login or not (this restores functionality that was lost with the initial DisplayCAL 3.1 release).
    • Windows: The application, setup and Argyll USB driver installer executables are now digitally signed (starting from October 18, 2016 with SHA-1 digest for 3.1.7.1 and dual SHA-1 and SHA-256 digests for 3.1.7.2 from October 21, 2016).

    Fixed in this release:

    • Profile loader (Windows): User-defined exceptions could be lost if exiting the profile loader followed by (re-)loading settings or restoring defaults in DisplayCAL.
    2016-10-18 10:00 (UTC) 3.1.7.1

    3.1.7.1

    Fixed in this release:

    • Profile loader (Windows): Setting calibration state to reset video card gamma tables overwrote cached gamma ramps for the 2nd display in a multi-display configuration.
    2016-10-04 20:49 (UTC) 3.1.7

    3.1.7

    Added in this release:

    • 3D LUT sizes 5x5x5 and 9x9x9.
    • JETI spectraval 1511/1501 support (requires ArgyllCMS >= 1.9).
    • Profile loader (Windows): User-definable exceptions.
    • Profile loader (Windows): Added reset-vcgt scripting command (equivalent to selecting “Reset video card gamma table” from the popup menu).

    Changed in this release:

    • “Auto” resolution of PCS-to-device tables is now limited to 45x45x45 to prevent excessive processing times with profiles from “funky” measurements (i.e. due to bad/inaccurate instrument).
    • Automatically optimized testcharts now use curves + matrix profiles for preconditioning to prevent a possible hang while creating the preconditioned testchart with LUT-type profiles from sufficiently “badly behaved” displays.
    • 2nd auto-optimized testchart slider step now defaults to XYZ LUT profile type as well, and the previous patch count was increased from 97 to 271 (necessary for baseline LUT profile accuracy).
    • Adjusted curves + matrix testcharts to only include fully saturated RGB and grayscale to prevent tinted neutrals and/or “rollercoaster” curves on not-so-well behaved displays (also reduces testchart patch count and measurement time, but may worsen the resulting profile's overall accuracy).
    • Removed near-black and near-white 1% grayscale increments from “video” verification charts.
    • Use a 20 second timeout for unresponsive downloads.
    • Windows: Much easier ArgyllCMS instrument driver installation (for instruments that require it). No need to disable driver signature enforcement under Windows 8/10 anymore. Select “Install ArgyllCMS instrument drivers...” from the “Tools” menu, click “Download & install”, wait briefly for the download to finish (400 KB), confirm the User Access Control popup, done. Note that the driver installer executable is currently not digitally signed (obtaining a suitable certificate from a trusted authority is in progress), but the driver itself is signed as usual. The installer is based on libwdi.
    • Profile loader (Windows): Changed apply-profiles scripting command to behave excatly like selecting “Load calibration from current display device profile(s)” from the popup menu, i.e. not only load calibration, but also change the setting.
    • Profile loader (Windows): Also count calibration state being (re)applied when the profile loader state or profile association(s) changes.

    Fixed in this release:

    • Update measurement modes after importing colorimeter corrections. Fixes additional measurement modes for the Spyder4/5 not appearing until the program is restarted or a different instrument is selected first.
    • Trivial: Instrument setup was unnecessarily being called twice after downloading ArgyllCMS when the latter wasn't previously detected.
    • Mac OS X: Work around a wxPython bug which prevents launching the application from a path containing non-ASCII characters.
    • Mac OS X: Work around a configuration problem affecting ArgyllCMS 1.9 and 1.9.1 (fixes Spyder2 firmware, additional Spyder4/5 measurement modes, and imported colorimeter corrections not being seen by DisplayCAL if imported via ArgyllCMS 1.9 or 1.9.1).
    2016-08-24 21:33 (UTC) 3.1.6

    3.1.6

    Added in this release:

    • HDR/SMPTE 2084: Advanced options to specify maximum content light level for roll-off (use with care!) as well as content colorspace (affects perceptual intent gamut mapping, less so colorimetric).

    Changed in this release:

    • Increased timeout to launch ArgyllCMS tools to 20 seconds.
    • Show failed items when otherwise successfully importing colorimeter corrections, and detect updated CCSS files.
    • HDR/SMPTE 2084: Improve overall saturation preservation.
    • Linux/colord: When checking for a valid colord device ID, also try with manufacturer omitted.
    • Windows Vista and later: Use “known folders” API to determine path to “Downloads” directory.

    Fixed in this release:

    • HDR/SMPTE 2084: Slightly too light near-black tones when black output offset was set to below 100%.
    • Synthetic ICC Profile Creator: Undefined variable when creating synthetic profile with custom gamma or BT.1886 and non-zero black level (regression of HDR-related changes made in 3.1.5).
    • When loading settings from a profile created with ${APPNAME} prior to 3.1.5 and custom 3D LUT tone curve gamma in ${APPNAME} 3.1.5, the gamma and output offset controls wouldn't be shown if advanced options weren't enabled until re-selecting the tone curve choice.
    • Cosmetic (Windows 10): Banner would go blank under some Windows 10 configurations when showing the profile or 3D LUT installation dialog.
    • Cosmetic (Linux): Missing backgrounds and wrongly sized combo boxes when wxGTK is built against GTK3.
    • Linux: Profile loader autostart entry was installed under wrong (mixed-case) name if installing for the current user, which lead to the loader unnecesarily being run twice if ${APPNAME} was installed from a RPM or DEB package. The superfluous loader entry will be automatically removed the next time you install a profile, or you can remove it manually by running rm ~/.config/autostart/z-DisplayCAL-apply-profiles.desktop in a terminal.
    • Linux/colord: Don't cache device IDs that are not the result of a successful query.
    • Windows: Make elevated subprocess calls synchronous. Fixes importing colorimeter corrections system-wide not listing all succesfully imported items on the first use.
    2016-08-02 22:28 (UTC) 3.1.5

    3.1.5

    Added in this release:

    • HDR: Allow specifying of black output offset for SMPTE 2084.

    Changed in this release:

    • HDR: Implemented SMPTE 2084 rolloff according to ITU-R BT.2390.
    • HDR: Implemented SMPTE 2084 3D LUT tone mapping (preserve hue and saturation with rolloff).
    • HDR: Improved SMPTE 2084 3D LUT perceptual intent rendering (better preserve saturation). Note that colorimetric intent is recommended and will also do tone mapping.
    • Linux/colord: Increase timeout when querying for newly installed profiles to 20 seconnds.

    Fixed in this release:

    • Minor: HDR peak luminance textbox was sometimes not able to receive focus.
    • Minor (Mac OS X): Don't omit ICC files from compressed archives (regression of adding device link profiles as possible 3D LUT output format in DisplayCAL 3.1.3).
    2016-07-10 23:35 (UTC) 3.1.4

    3.1.4

    Added in this release:

    • A fourth Rec. 709 encompassing color space variant as a profile connection space candidate for XYZ LUT profiles. May lead to better utilization of PCS-to-device color lookup table grid points in some cases (and thus potentially smaller profiles when the effective resolution is set to the default of “Auto”).
    • An option to include legacy serial ports (if any) in detected instruments.
    • SMPTE 2084 (HDR) as 3D LUT tone curve choice.

    Changed in this release:

    • Don't preserve shaper curves in ICC device link profiles if selected as 3D LUT output format (effectively matching other 3D LUT formats).
    • Removed “Prepress” preset due to large overlap with “Softproof”.
    • Changed “Softproof” preset to use 5800K whitepoint target (in line with Fogra softproof handbook typical photography workflow suggested starting point value) and automatic black point hue correction.
    • Synthetic ICC profile creator: Changed SMPTE 2084 to always clip (optionally with roll-off) if peak white is below 10000 cd/m².
    • Synthetic ICC profile creator: Changed transition to specified black point of generated profiles to be consistent with BT.1886 black point blending (less gradual transition, blend over to specified black point considerably closer to black).
    • Profile loader (Windows): If no profile assigned, load implicit linear calibration.

    Fixed in this release:

    • When loading settings from an existing profile, some CIECAM02 advanced profiling options were not recognized correctly.
    • Don't accidentally remove the current display profile if ArgyllCMS is older than version 1.1 or the ArgyllCMS version is not included in the first line of output due to interference with QuickKeys under Mac OS X.
    • Make sure the ArgyllCMS version is detected even if it isn't contained in the first line of output (fixes ArgyllCMS version not being detected if QuickKeys Input Manager is installed under Mac OS X).
    • When loading settings, add 3D LUT input profile to selector if not yet present.
    • Curve viewer/profile information: Fix potential division by zero error when graphing unusual curves (e.g. non-monotonic or with very harsh bends).
    • Profile information: Reset right pane row background color on each profile load (fixes “named color” profile color swatches sticking even after loading a different profile).
    2016-04-11 10:50 (UTC) 3.1.3.1

    3.1.3.1

    Changed in this release:

    • Updated traditional chinese localization (work-in-progress, thanks to 楊添明).
    • Windows: If madTPG is set to fullscreen and there's more than one display connected, don't temporarily override fullscreen if interactive display adjustment is enabled.

    Fixed in this release:

    • Windows: If interactive display adjustment is disabled and madTPG is set to fullscreen, show instrument placement countdown messages in madTPG OSD.
    • Windows: Restore madTPG fullscreen button state on disconnect if it was temporarily overridden.
    • Profile loader (Windows): Error message when right-clicking the profile loader task tray icon while ${APPNAME} is running.
    2016-04-09 12:16 (UTC) 3.1.3

    3.1.3

    If you update from ${APPNAME} 3.1/3.1.1/3.1.2 standalone under Windows using the installer, please close the profile loader manually (if it is running) before running setup - due to an unfortunate bug, the installer may not be able to close and restart the profile loader automatically, which may then require using the task manager to end the profile loader process. Apologies for the inconvenience.

    Added in this release:

    • Device link profile as possible 3D LUT output format.
    • French ReadMe (thanks to Jean-Luc Coulon).
    • Partial traditional chinese localization (work-in-progress, thanks to 楊添明).
    • When you change the language in ${APPNAME}, the Windows Profile Loader will follow on-the-fly if running.
    • Synthetic ICC profile creator: Capability to specify profile class, technology and colorimetric image state.
    • Windows: When the display configuration is changed while ${APPNAME} is running, automatically re-enumerate displays, and load calibration if using the profile loader.
    • Profile loader (Windows): Starting the loader with the --oneshot argument will make it exit after launching.

    Changed in this release:

    • Updated ReShade 3D LUT installation instructions in the ReadMe.
    • Improved “Enhance effective resolution of PCS to device tables” smoothing accuracy slightly.
    • Profile loader (Windows):
      • Detect CPKeeper (Color Profile Keeper) and HCFR.
      • Show any calibration loading errors on startup or display/profile change in a notification popup, and also reflect this with a different icon.

    Fixed in this release:

    • Added semicolon (“;”) to disallowed profile name characters.
    • ICC profile objects were leaking memory.
    • Windows: Made sure that the virtual console size is not larger than the maximum allowed size (fixes possible inability to launch ArgyllCMS tools on some systems if the Windows scaling factor was equal to or above 175%).
    • Windows (Vista and newer): Use system-wide profiles if per-user profiles are disabled.
    • Profile loader (Windows):
      • If Windows calibration management is enabled (not recommended!), correctly reflect the disabled state of the profile loader in the task tray icon and don't load calibration when launching the profile loader (but keep track of profile assignment changes).
      • Prevent a race condition when “Fix profile associations automatically” is enabled and changing the display configuration, which could lead to wrong profile associations not being fixed.
      • Sometimes the loader did not exit cleanly if using taskkill or similar external methods.
      • Prevent a race condition where the loader could try to access a no longer available display device right after a display configuration change, which resulted in no longer being able to influence the calibration state (requiring a loader restart to fix).
      • Profile loader not reacting to display changes under Windows XP.
    2016-03-03 22:33 (UTC) 3.1.2

    3.1.2

    Fixed in this release:

    • Profile loader (Windows): Pop-up wouldn't work if task bar was set to auto-hide.
    2016-02-29 17:42 (UTC) 3.1.1

    3.1.1

    Added in this release:

    • Profile loader (Windows): Right-click menu items to open Windows color management and display settings.

    Changed in this release:

    • Profile loader (Windows):
      • Detect f.lux and dispcal/dispread when running outside ${APPNAME}.
      • Don't notify on launch or when detecting ${APPNAME} or madVR.
      • Detect madVR through window enumeration instead of via madHcNet (so madVR can be updated without having to close and restart the profile loader).
      • Enforce calibration state periodically regardless of video card gamma table state.
      • Don't use Windows native notifications to overcome their limitations (maximum number of lines, text wrapping).
      • Show profile associations and video card gamma table state in notification popup.

    Fixed in this release:

    • Error after measurements when doing verification with “Untethered” selected as display device and using a simulation profile (not as target).
    • Windows: Sporadic application errors on logout/reboot/shutdown on some systems when ${APPNAME} or one of the other applications was still running.
    • Standalone installer (Windows): Remove dispcalGUI program group entries on upgrade.
    • Profile loader (Windows):
      • Error when trying to enable “Fix profile associations automatically” when one or more display devices don't have a profile assigned.
      • Sporadic errors related to taskbar icon redraw on some systems when showing a notification after changing the display configuration (possibly a wxPython/wxWidgets bug).
    • Mac OS X: Application hang when trying to quit while the testchart editor had unsaved changes.
    2016-02-01 00:32 (UTC) 3.1

    3.1

    dispcalGUI has been renamed to ${APPNAME}.

    If you upgrade using 0install under Linux: It is recommended that you download the respective ${APPNAME}-0install package for your distribution and install it so that the applications accessible via the menu of your desktop environment are updated properly.

    If you upgrade using 0install under Mac OS X: It is recommended that you delete existing dispcalGUI application icons, then download the ${APPNAME}-0install.dmg disk image to get updated applications.

    Added in this release:

    • Better HiDPI support. All text should now be crisp on HiDPI displays (with the exception of axis labels on curve and gamut graphs under Mac OS X). Icons will be scaled according to the scaling factor or DPI set in the display settings under Windows, or the respective (font) scaling or DPI system setting under Linux. Icons will be scaled down or up from their 2x version if a matching size is not available. Note that support for crisp icons in HiDPI mode is currently not available in the GTK3 and Mac OS X port of wxPython/wxWidgets. Also note that if you run a multi-monitor configuration, the application is system-DPI aware but not per-monitor-DPI aware, which is a limitation of wxPython/wxWidgets (under Windows, you will need to log out and back in after changing DPI settings for changes to take effect in ${APPNAME}).
    • When having created a compressed archive of a profile and related files, it can now also be imported back in via drag'n'drop or the “Load settings...” menu entry and respective button.
    • ArgyllCMS can be automatically downloaded and updated.
    • A compressed logs archive can be created from the log window.
    • Windows: New profile loader. It will stay in the taskbar tray and automatically reload calibration if the display configuration changes or if the calibration is lost (although fullscreen Direct3D applications can still override the calibration). It can also automatically fix profile associations when switching from a multi-monitor configuration to a single display and vice versa (only under Vista and later). In addition, the profile loader is madVR-aware and will disable calibration loading if it detects e.g. madTPG or madVR being used by a video player.

    Changed in this release:

    • Changed default calibration speed from “Medium” to “Fast”. Typically this cuts calibration time in half, while the accuracy difference is negligible at below 0.2 delta E.
    • Enabled “Enhance effective resolution of PCS to device tables” and smoothing for L*a*b* LUT profiles.

    Fixed in this release:

    • In some cases, importing colorimeter corrections from the vendor software CD could fail (falling back to downloading them from the web).
    • Moving the auto testchart patches slider to a value that changed the profile type did not update BPC accordingly (shaper+matrix defaults to BPC on).
    • Minor: Safari/IE messed up positioning of CCT graph vertical axis labels in measurement reports.
    • Minor: When clicking the “Install profile” button while not on the 3D LUT tab, and “Create 3D LUT after profiling” is enabled, don't create a 3D LUT.
    • Minor: When changing profile type, only change the selected testchart if needed, and default to “Auto” for all profile types.
    • Minor: 1st launch defaults were slightly different from what was intended (testchart should be “Auto”).
    • Minor: Use OS line separator when writing configuration files.
    • Linux: Text and icon sizes should be more consistent accross the application when the system text scaling or DPI has been adjusted (application restart required).
    • Linux: Fall back to use the XrandR display name for colord device IDs if EDID is not available.
    • Linux/Mac OS X: madVR test pattern generator interface was prone to connection failures due to a race condition. Also, verifying a madVR 3D LUT didn't work.

    View changelog entries for older versions

    Definitions

    [1] CGATS
    Graphic Arts Technologies Standards, CGATS.5 Data Exchange Format (ANSI CGATS.5-1993 Annex J)
    [2] CMM / CMS
    Color Management Module / Color Management System
    [3] GPL
    GNU General Public License — gnu.org/licenses/gpl.html
    [4] GUI
    Graphical User Interface
    [5] ICC
    International Color Consortium — color.org
    [6] JSON
    JavaScript Object Notation, a lightweight data-interchange format — json.org
    [7] LUT
    Look Up Table — en.wikipedia.org/wiki/Lookup_table
    [8] SVN
    Subversion, a version-control system — subversion.tigris.org
    [9] UAC
    User Account Control — en.wikipedia.org/wiki/User_Account_Control
    [10] EDID
    Extended Display Identification Data — en.wikipedia.org/wiki/EDID
    [11] PCS
    Profile Connection Space — en.wikipedia.org/wiki/ICC_profile
    [12] UEFI
    Unified Extensible Firmware Interface — en.wikipedia.org/wiki/UEFI

    DisplayCAL-3.5.0.0/misc/setup.debian.cfg0000644000076500000000000000115013170403143017464 0ustar devwheel00000000000000[bdist_rpm] # IMPORTANT: # install all packages listed under build_requires below # then run sudo rpmdb --initdb before running setup.py bdist_rpm release = 1 distribution_name = Debian packager = Florian Höch group = graphics python = /usr/bin/python requires = argyll, python-wxgtk3.0, python-numpy # build_requires = alien, build-essential, libxinerama-dev, libxrandr-dev, libxxf86vm-dev, python >= 2.5, python <= 2.7, python-all-dev post_install = misc/debian.postinst post_uninstall = misc/debian.postrm # keep_temp = 1 [install] compile = 0 prefix = /usr record = INSTALLED_FILES DisplayCAL-3.5.0.0/misc/setup.fedora.cfg0000644000076500000000000000106013170403143017502 0ustar devwheel00000000000000[bdist_rpm] release = 1 distribution_name = Fedora packager = Florian Höch group = Applications/Multimedia python = /usr/bin/python requires = argyllcms, wxPython, numpy build_requires = gcc, libX11-devel, libXinerama-devel, libXrandr-devel, libXxf86vm-devel, python >= 2.5, python <= 2.7, python-devel, rpm-build post_install = util/rpm_postinstall.sh post_uninstall = util/rpm_postuninstall.sh doc_files = LICENSE.txt README.html screenshots/ theme/ # keep_temp = 1 [install] optimize = 2 prefix = /usr record = INSTALLED_FILES DisplayCAL-3.5.0.0/misc/setup.mandriva.cfg0000644000076500000000000000076213170403143020053 0ustar devwheel00000000000000[bdist_rpm] release = 1 distribution_name = Mandriva packager = Florian Höch group = Graphics python = /usr/bin/python requires = argyllcms, wxPythonGTK, python-numpy build_requires = gcc, python >= 2.5, python <= 2.7, libpython-devel, rpm-build, libxorg-x11-devel post_install = util/rpm_postinstall.sh post_uninstall = util/rpm_postuninstall.sh doc_files = LICENSE.txt README.html screenshots/ theme/ # keep_temp = 1 [install] prefix = /usr record = INSTALLED_FILES DisplayCAL-3.5.0.0/misc/setup.mandriva64.cfg0000644000076500000000000000076413170403143020227 0ustar devwheel00000000000000[bdist_rpm] release = 1 distribution_name = Mandriva packager = Florian Höch group = Graphics python = /usr/bin/python requires = argyllcms, wxPythonGTK, python-numpy build_requires = gcc, python >= 2.5, python <= 2.7, libpython-devel, rpm-build, lib64xorg-x11-devel post_install = util/rpm_postinstall.sh post_uninstall = util/rpm_postuninstall.sh doc_files = LICENSE.txt README.html screenshots/ theme/ # keep_temp = 1 [install] prefix = /usr record = INSTALLED_FILES DisplayCAL-3.5.0.0/misc/setup.openSUSE.cfg0000644000076500000000000000077213170403143017714 0ustar devwheel00000000000000[bdist_rpm] release = 1 distribution_name = openSUSE packager = Florian Höch group = Productivity/Graphics/Other python = /usr/bin/python requires = argyllcms, python-wxGTK, python-numpy build_requires = gcc, python >= 2.5, python <= 2.7, python-devel, rpm, xorg-x11-devel post_install = util/rpm_postinstall.sh post_uninstall = util/rpm_postuninstall.sh doc_files = LICENSE.txt README.html screenshots/ theme/ # keep_temp = 1 [install] prefix = /usr record = INSTALLED_FILES DisplayCAL-3.5.0.0/misc/setup.ubuntu.cfg0000644000076500000000000000117513170403143017573 0ustar devwheel00000000000000[bdist_rpm] # IMPORTANT: # install all packages listed under build_requires below # then run sudo rpmdb --initdb before running setup.py bdist_rpm release = 1 distribution_name = Ubuntu packager = Florian Höch group = graphics python = /usr/bin/python requires = argyll, python-wxgtk3.0, python-numpy # build_requires = alien, build-essential, libxinerama-dev, libxrandr-dev, libxxf86vm-dev, python >= 2.5, python <= 2.7, python-all-dev post_install = misc/debian.postinst post_uninstall = misc/debian.postrm # keep_temp = 1 [install] compile = 0 install-layout = deb prefix = /usr record = INSTALLED_FILES DisplayCAL-3.5.0.0/misc/tests/0000755000076500000000000000000013242313606015573 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/tests/fakecgats.txt0000644000076500000000000000002012027572512020257 0ustar devwheel00000000000000CC BEGIN_DATADisplayCAL-3.5.0.0/misc/tests/junk.cal0000644000076500000000000000014012027572512017221 0ustar devwheel00000000000000 DisplayCAL-3.5.0.0/misc/tests/junk.icc0000644000076500000000000000000112027572512017214 0ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/tests/junk.icm0000644000076500000000000000000112027572512017226 0ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/tests/junk.ti10000644000076500000000000000000112027572512017153 0ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/tests/junk.ti20000644000076500000000000000000112027572512017154 0ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/tests/junk.ti30000644000076500000000000000000112027572512017155 0ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/ti3/0000755000076500000000000000000013242313606015130 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/ti3/default.ti30000644000076500000000000004220213154615410017175 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" AUTO_OPTIMIZE "4" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -ql -t -g2.2 -f1 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/laptop.ti30000644000076500000000000004124613154615410017057 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" AUTO_OPTIMIZE "4" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -ql -t -g2.2 -f1 -k0 -m END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/office_web.ti30000644000076500000000000004124713154615410017651 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" AUTO_OPTIMIZE "4" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -ql -t6500 -g2.2 -f1 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/photo.ti30000644000076500000000000004124713154615410016712 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Tue Feb 23 08:46:43 2010" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" AUTO_OPTIMIZE "4" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -t5000 -g2.2 -f1 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/softproof.ti30000644000076500000000000004225413221317445017603 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Tue Feb 23 08:46:43 2010" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" AUTO_OPTIMIZE "4" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -t5800 -b160 -gl -f1 -k END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/sRGB.ti30000644000076500000000000004221513154615410016352 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" AUTO_OPTIMIZE "4" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -ql -w0.3127,0.3290 -gs -f1 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/video.ti30000644000076500000000000004126013242301254016656 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" AUTO_OPTIMIZE "4" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -G2.4 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/video_eeColor.ti30000644000076500000000000024241213221317445020336 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "eeColor" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX -M "SII REPEATER" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/video_madVR.ti30000644000076500000000000024237613221317445017770 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "madVR" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -dmadvr -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/video_madVR_ST2084.ti30000644000076500000000000004342713242301254020702 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "49" SINGLE_DIM_STEPS "17" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" AUTO_OPTIMIZE "4" 3DLUT_SOURCE_PROFILE "ref/Rec2020.icm" 3DLUT_TRC "smpte2084.rolloffclip" 3DLUT_HDR_PEAK_LUMINANCE "400" 3DLUT_HDR_MAXCLL "10000" 3DLUT_CONTENT_COLORSPACE_WHITE_X "0.314" 3DLUT_CONTENT_COLORSPACE_WHITE_Y "0.351" 3DLUT_CONTENT_COLORSPACE_RED_X "0.68" 3DLUT_CONTENT_COLORSPACE_RED_Y "0.32" 3DLUT_CONTENT_COLORSPACE_GREEN_X "0.265" 3DLUT_CONTENT_COLORSPACE_GREEN_Y "0.69" 3DLUT_CONTENT_COLORSPACE_BLUE_X "0.15" 3DLUT_CONTENT_COLORSPACE_BLUE_Y "0.06" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "madVR" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -dmadvr -qm -w0.3127,0.3290 -f0 -k0 -Iw END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/video_Prisma.ti30000644000076500000000000024246713221317445020213 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "t" 3DLUT_OUTPUT_ENCODING "t" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "3dl" 3DLUT_SIZE "17" 3DLUT_INPUT_BITDEPTH "10" 3DLUT_OUTPUT_BITDEPTH "12" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX -M "Prisma" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/video_ReShade.ti30000644000076500000000000004271213221317445020262 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.106486 100.000000 108.844025" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "1" COMP_GREY_STEPS "52" MULTI_DIM_BCC_STEPS "0" MULTI_DIM_STEPS "5" SINGLE_DIM_STEPS "5" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" AUTO_OPTIMIZE "4" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "n" 3DLUT_OUTPUT_ENCODING "n" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "ReShade" 3DLUT_SIZE "64" 3DLUT_OUTPUT_BITDEPTH "8" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 175 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 100.00 100.00 75.000 86.573 96.587 63.899 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 25.000 0.0000 0.0000 3.0773 2.0711 1.0973 7 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 8 75.000 0.0000 0.0000 22.335 12.000 1.9997 9 100.00 0.0000 0.0000 41.830 22.052 2.9132 10 100.00 0.0000 25.000 42.739 22.416 7.7021 11 100.00 25.000 25.000 44.541 26.018 8.3026 12 100.00 50.000 25.000 50.318 37.570 10.228 13 100.00 75.000 25.000 61.239 59.411 13.869 14 0.0000 0.0000 25.000 1.9092 1.3636 5.7889 15 25.000 0.0000 25.000 3.9865 2.4347 5.8863 16 75.000 0.0000 100.00 40.206 19.148 96.129 17 100.00 0.0000 100.00 59.701 29.199 97.042 18 1.9608 1.9608 1.9608 1.1428 1.1502 1.1637 19 3.9216 3.9216 3.9216 1.2856 1.3005 1.3273 20 5.8824 5.8824 5.8824 1.4495 1.4729 1.5152 21 7.8431 7.8431 7.8431 1.6583 1.6925 1.7544 22 9.8039 9.8039 9.8039 1.9148 1.9624 2.0484 23 11.765 11.765 11.765 2.2218 2.2853 2.4001 24 13.726 13.726 13.726 2.5817 2.6639 2.8126 25 15.686 15.686 15.686 2.9968 3.1007 3.2883 26 17.647 17.647 17.647 3.4695 3.5979 3.8300 27 19.608 19.608 19.608 4.0016 4.1577 4.4398 28 21.569 21.569 21.569 4.5953 4.7822 5.1201 29 23.529 23.529 23.529 5.2523 5.4734 5.8731 30 27.451 27.451 27.451 6.7637 7.0634 7.6050 31 29.412 29.412 29.412 7.6213 7.9656 8.5879 32 31.373 31.373 31.373 8.5492 8.9418 9.6512 33 33.333 33.333 33.333 9.5488 9.9933 10.797 34 35.294 35.294 35.294 10.622 11.122 12.026 35 37.255 37.255 37.255 11.769 12.329 13.341 36 39.216 39.216 39.216 12.993 13.616 14.743 37 41.176 41.176 41.176 14.294 14.985 16.234 38 43.137 43.137 43.137 15.674 16.437 17.816 39 45.098 45.098 45.098 17.134 17.973 19.489 40 47.059 47.059 47.059 18.675 19.594 21.255 41 49.020 49.020 49.020 20.299 21.303 23.117 42 50.980 50.980 50.980 22.007 23.100 25.074 43 52.941 52.941 52.941 23.800 24.986 27.129 44 54.902 54.902 54.902 25.679 26.963 29.282 45 56.863 56.863 56.863 27.646 29.032 31.536 46 58.824 58.824 58.824 29.701 31.194 33.891 47 60.784 60.784 60.784 31.846 33.450 36.349 48 62.745 62.745 62.745 34.081 35.802 38.911 49 64.706 64.706 64.706 36.409 38.250 41.578 50 66.667 66.667 66.667 38.829 40.796 44.351 51 68.627 68.627 68.627 41.343 43.440 47.232 52 70.588 70.588 70.588 43.951 46.185 50.221 53 72.549 72.549 72.549 46.656 49.030 53.321 54 76.471 76.471 76.471 52.356 55.027 59.853 55 78.431 78.431 78.431 55.354 58.180 63.289 56 80.392 80.392 80.392 58.452 61.439 66.838 57 82.353 82.353 82.353 61.650 64.803 70.503 58 84.314 84.314 84.314 64.949 68.275 74.285 59 86.275 86.275 86.275 68.351 71.854 78.183 60 88.235 88.235 88.235 71.857 75.541 82.200 61 90.196 90.196 90.196 75.466 79.338 86.337 62 92.157 92.157 92.157 79.181 83.246 90.594 63 94.118 94.118 94.118 83.001 87.265 94.972 64 96.078 96.078 96.078 86.929 91.397 99.472 65 98.039 98.039 98.039 90.963 95.641 104.10 66 25.000 25.000 0.0000 4.8786 5.6731 1.6978 67 50.000 25.000 0.0000 11.541 9.1081 2.0099 68 75.000 25.000 0.0000 24.136 15.602 2.6001 69 100.00 25.000 0.0000 43.631 25.654 3.5137 70 100.00 50.000 0.0000 49.408 37.206 5.4393 71 50.000 50.000 0.0000 17.318 20.660 3.9356 72 75.000 50.000 0.0000 29.913 27.154 4.5258 73 25.000 50.000 0.0000 10.655 17.225 3.6234 74 25.000 75.000 0.0000 21.577 39.066 7.2641 75 50.000 75.000 0.0000 28.239 42.501 7.5762 76 75.000 75.000 0.0000 40.835 48.995 8.1664 77 100.00 75.000 0.0000 60.330 59.047 9.0799 78 25.000 100.00 0.0000 38.482 72.872 12.899 79 50.000 100.00 0.0000 45.145 76.307 13.211 80 75.000 100.00 0.0000 57.740 82.801 13.802 81 100.00 100.00 0.0000 77.235 92.853 14.715 82 100.00 100.00 25.000 78.145 93.216 19.504 83 50.000 0.0000 25.000 10.649 5.8697 6.1984 84 50.000 25.000 50.000 15.366 10.638 22.157 85 0.0000 25.000 0.0000 2.8013 4.6021 1.6004 86 0.0000 25.000 25.000 3.7105 4.9657 6.3893 87 25.490 25.490 25.490 5.9745 6.2332 6.7007 88 50.000 25.000 25.000 12.450 9.4717 6.7989 89 75.000 25.000 25.000 25.045 15.966 7.3890 90 0.0000 50.000 0.0000 8.5782 16.154 3.5261 91 0.0000 50.000 25.000 9.4874 16.518 8.3150 92 25.000 50.000 25.000 11.565 17.589 8.4123 93 50.000 50.000 25.000 18.227 21.024 8.7245 94 75.000 50.000 25.000 30.822 27.518 9.3147 95 0.0000 75.000 0.0000 19.500 37.995 7.1667 96 0.0000 75.000 25.000 20.409 38.358 11.956 97 25.000 75.000 25.000 22.486 39.429 12.053 98 50.000 75.000 25.000 29.149 42.864 12.365 99 75.000 75.000 25.000 41.744 49.359 12.955 100 0.0000 100.00 0.0000 36.405 71.801 12.802 101 0.0000 100.00 25.000 37.314 72.164 17.591 102 25.000 100.00 25.000 39.392 73.235 17.688 103 50.000 100.00 25.000 46.054 76.670 18.000 104 75.000 100.00 25.000 58.649 83.164 18.590 105 0.0000 0.0000 50.000 4.8252 2.5298 21.147 106 25.000 0.0000 50.000 6.9024 3.6009 21.245 107 50.000 0.0000 50.000 13.564 7.0358 21.557 108 75.000 0.0000 50.000 26.160 13.530 22.147 109 100.00 0.0000 50.000 45.655 23.582 23.061 110 100.00 0.0000 75.000 51.168 25.787 52.098 111 100.00 25.000 75.000 52.969 29.389 52.698 112 75.000 0.0000 25.000 23.244 12.364 6.7886 113 75.000 25.000 50.000 27.961 17.132 22.748 114 100.00 25.000 50.000 47.457 27.184 23.661 115 25.000 25.000 50.000 8.7037 7.2029 21.845 116 25.000 50.000 50.000 14.481 18.755 23.771 117 75.000 50.000 50.000 33.738 28.684 24.673 118 100.00 50.000 50.000 53.233 38.736 25.587 119 100.00 50.000 75.000 58.746 40.941 54.624 120 25.000 75.000 50.000 25.402 40.596 27.412 121 50.000 75.000 50.000 32.064 44.031 27.724 122 75.000 75.000 50.000 44.660 50.525 28.314 123 100.00 75.000 50.000 64.155 60.577 29.227 124 100.00 75.000 75.000 69.668 62.782 58.264 125 25.000 100.00 50.000 42.308 74.401 33.047 126 50.000 100.00 50.000 48.970 77.836 33.359 127 75.000 100.00 50.000 61.565 84.331 33.949 128 100.00 100.00 50.000 81.061 94.383 34.863 129 25.000 0.0000 75.000 12.415 5.8057 50.282 130 50.000 0.0000 75.000 19.077 9.2407 50.594 131 75.000 0.0000 75.000 31.673 15.735 51.184 132 75.000 25.000 75.000 33.474 19.337 51.785 133 75.000 50.000 100.00 47.784 34.302 98.655 134 25.000 25.000 75.000 14.217 9.4077 50.882 135 25.000 50.000 100.00 28.527 24.373 97.752 136 0.0000 25.000 50.000 6.6264 6.1319 21.748 137 0.0000 25.000 75.000 12.139 8.3367 50.785 138 0.0000 50.000 75.000 17.916 19.889 52.710 139 25.000 50.000 75.000 19.993 20.960 52.808 140 50.000 50.000 75.000 26.656 24.395 53.120 141 75.000 50.000 75.000 39.251 30.889 53.710 142 74.510 74.510 74.510 49.457 51.977 56.531 143 0.0000 75.000 75.000 28.838 41.729 56.351 144 25.000 75.000 75.000 30.915 42.800 56.448 145 50.000 75.000 75.000 37.577 46.235 56.761 146 0.0000 75.000 50.000 23.325 39.525 27.314 147 0.0000 100.00 50.000 40.230 73.330 32.949 148 0.0000 100.00 75.000 45.743 75.535 61.986 149 25.000 100.00 75.000 47.821 76.606 62.084 150 50.000 100.00 75.000 54.483 80.041 62.396 151 75.000 100.00 75.000 67.078 86.535 62.986 152 75.000 100.00 100.00 75.611 89.948 107.93 153 25.000 0.0000 100.00 20.948 9.2184 95.226 154 50.000 0.0000 100.00 27.610 12.653 95.538 155 0.0000 0.0000 75.000 10.338 4.7346 50.184 156 0.0000 0.0000 100.00 18.871 8.1473 95.129 157 0.0000 25.000 100.00 20.672 11.749 95.729 158 25.000 25.000 100.00 22.750 12.820 95.827 159 50.000 25.000 100.00 29.412 16.255 96.139 160 75.000 25.000 100.00 42.007 22.750 96.729 161 100.00 25.000 100.00 61.503 32.802 97.643 162 100.00 50.000 100.00 67.279 44.354 99.568 163 50.000 25.000 75.000 20.879 12.843 51.194 164 50.000 50.000 100.00 35.189 27.808 98.065 165 0.0000 50.000 50.000 12.403 17.684 23.674 166 0.0000 50.000 100.00 26.449 23.302 97.655 167 0.0000 75.000 100.00 37.371 45.142 101.30 168 25.000 75.000 100.00 39.448 46.213 101.39 169 50.000 75.000 100.00 46.110 49.648 101.71 170 75.000 75.000 100.00 58.706 56.142 102.30 171 100.00 75.000 100.00 78.201 66.194 103.21 172 0.0000 100.00 100.00 54.276 78.948 106.93 173 25.000 100.00 100.00 56.354 80.019 107.03 174 50.000 100.00 100.00 63.016 83.454 107.34 175 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/ti3/video_resolve.ti30000644000076500000000000024244513221317445020433 0ustar devwheel00000000000000CTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Sat Mar 14 19:00:55 2009" DEVICE_CLASS "DISPLAY" APPROX_WHITE_POINT "95.045781 100.000003 108.905751" DARK_REGION_EMPHASIS "1.6" ACCURATE_EXPECTED_VALUES "true" COLOR_REP "RGB_XYZ" BLACK_COLOR_PATCHES "4" COMP_GREY_STEPS "97" SINGLE_DIM_STEPS "33" WHITE_COLOR_PATCHES "4" USE_BLACK_POINT_COMPENSATION "NO" MIN_DISPLAY_UPDATE_DELAY_MS "600" HIRES_B2A "NO" AUTO_OPTIMIZE "9" 3DLUT_SOURCE_PROFILE "ref/Rec709.icm" 3DLUT_GAMMA "-2.4" 3DLUT_DEGREE_OF_BLACK_OUTPUT_OFFSET "0.0" 3DLUT_INPUT_ENCODING "n" 3DLUT_OUTPUT_ENCODING "n" 3DLUT_GAMUT_MAPPING_MODE "G" 3DLUT_RENDERING_INTENT "aw" 3DLUT_FORMAT "cube" 3DLUT_SIZE "65" BEGIN_ARGYLL_COLPROF_ARGS -qh -bl -aX -M "Resolve" END_ARGYLL_COLPROF_ARGS NUMBER_OF_FIELDS 7 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT NUMBER_OF_SETS 1553 BEGIN_DATA 1 100.00 100.00 100.00 95.106 100.00 108.84 2 97.737 97.737 97.737 90.334 94.979 103.37 3 100.00 100.00 100.00 95.106 100.00 108.84 4 100.00 100.00 100.00 95.106 100.00 108.84 5 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 6 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 7 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 8 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 9 1.4451 0.0000 0.0000 1.0457 1.0235 1.0021 10 2.9412 0.0000 0.0000 1.0929 1.0479 1.0044 11 4.4910 0.0000 0.0000 1.1426 1.0735 1.0067 12 6.0976 0.0000 0.0000 1.2040 1.1052 1.0096 13 7.7640 0.0000 0.0000 1.2816 1.1452 1.0132 14 9.4937 0.0000 0.0000 1.3779 1.1948 1.0177 15 11.290 0.0000 0.0000 1.4958 1.2556 1.0232 16 13.158 0.0000 0.0000 1.6386 1.3293 1.0299 17 15.101 0.0000 0.0000 1.8100 1.4176 1.0380 18 17.123 0.0000 0.0000 2.0142 1.5229 1.0475 19 19.231 0.0000 0.0000 2.2559 1.6475 1.0588 20 21.429 0.0000 0.0000 2.5406 1.7943 1.0722 21 23.723 0.0000 0.0000 2.8746 1.9665 1.0878 22 26.119 0.0000 0.0000 3.2650 2.1678 1.1061 23 28.626 0.0000 0.0000 3.7201 2.4025 1.1275 24 31.250 0.0000 0.0000 4.2493 2.6754 1.1523 25 34.000 0.0000 0.0000 4.8637 2.9922 1.1810 26 36.885 0.0000 0.0000 5.5760 3.3594 1.2144 27 39.916 0.0000 0.0000 6.4010 3.7848 1.2531 28 43.103 0.0000 0.0000 7.3559 4.2771 1.2978 29 46.460 0.0000 0.0000 8.4608 4.8468 1.3496 30 50.000 0.0000 0.0000 9.7393 5.5060 1.4095 31 53.738 0.0000 0.0000 11.219 6.2691 1.4789 32 57.692 0.0000 0.0000 12.934 7.1530 1.5592 33 61.881 0.0000 0.0000 14.921 8.1777 1.6523 34 66.326 0.0000 0.0000 17.228 9.3671 1.7604 35 71.053 0.0000 0.0000 19.909 10.750 1.8861 36 76.087 0.0000 0.0000 23.033 12.360 2.0324 37 81.461 0.0000 0.0000 26.677 14.239 2.2032 38 87.209 0.0000 0.0000 30.941 16.438 2.4030 39 93.374 0.0000 0.0000 35.944 19.017 2.6374 40 100.00 0.0000 0.0000 41.830 22.052 2.9132 41 100.00 0.0000 54.000 46.351 23.860 26.723 42 0.0000 79.849 33.598 23.938 44.230 16.787 43 0.0000 87.082 47.158 30.249 54.097 27.385 44 50.964 92.292 49.013 43.283 66.176 30.562 45 59.245 100.00 64.127 55.646 80.959 48.115 46 69.412 100.00 71.061 62.635 84.367 57.249 47 67.159 65.381 0.0000 31.314 36.860 6.3255 48 73.106 76.690 0.0000 40.595 50.275 8.4262 49 100.00 88.036 0.0000 68.353 75.090 11.754 50 0.0000 17.123 0.0000 1.8794 2.7586 1.2931 51 0.0000 19.231 0.0000 2.0890 3.1777 1.3630 52 0.0000 21.429 0.0000 2.3359 3.6714 1.4453 53 0.0000 23.723 0.0000 2.6255 4.2505 1.5418 54 0.0000 26.119 0.0000 2.9640 4.9275 1.6547 55 0.0000 28.626 0.0000 3.3587 5.7167 1.7862 56 0.0000 31.250 0.0000 3.8176 6.6344 1.9392 57 0.0000 34.000 0.0000 4.3504 7.6998 2.1168 58 0.0000 36.885 0.0000 4.9680 8.9350 2.3227 59 0.0000 39.916 0.0000 5.6834 10.366 2.5611 60 0.0000 43.103 0.0000 6.5114 12.021 2.8371 61 0.0000 46.460 0.0000 7.4695 13.937 3.1565 62 0.0000 50.000 0.0000 8.5782 16.154 3.5261 63 0.0000 53.738 0.0000 9.8615 18.721 3.9539 64 0.0000 57.692 0.0000 11.348 21.693 4.4494 65 0.0000 66.326 0.0000 15.072 29.139 5.6906 66 0.0000 68.747 0.0000 16.237 31.469 6.0789 67 0.0000 71.053 0.0000 17.397 33.789 6.4657 68 0.0000 76.087 0.0000 20.105 39.205 7.3684 69 0.0000 81.461 0.0000 23.266 45.525 8.4220 70 0.0000 87.209 0.0000 26.963 52.919 9.6545 71 20.140 98.659 35.329 38.535 71.098 22.153 72 25.338 100.00 40.094 40.925 73.855 25.471 73 42.371 100.00 48.477 46.112 76.391 31.935 74 48.283 100.00 60.407 50.288 78.290 43.616 75 0.0000 0.0000 1.4451 1.0200 1.0080 1.1053 76 0.0000 0.0000 2.9412 1.0407 1.0163 1.2143 77 0.0000 0.0000 7.7640 1.1232 1.0493 1.6491 78 0.0000 0.0000 9.4937 1.1654 1.0661 1.8712 79 0.0000 0.0000 11.290 1.2170 1.0868 2.1430 80 0.0000 0.0000 13.158 1.2795 1.1118 2.4723 81 0.0000 0.0000 15.101 1.3545 1.1418 2.8674 82 0.0000 0.0000 17.123 1.4439 1.1775 3.3380 83 0.0000 0.0000 19.231 1.5497 1.2198 3.8953 84 0.0000 0.0000 21.429 1.6743 1.2697 4.5516 85 0.0000 0.0000 23.723 1.8205 1.3281 5.3216 86 0.0000 0.0000 26.119 1.9914 1.3965 6.2216 87 0.0000 0.0000 28.626 2.1906 1.4761 7.2708 88 0.0000 0.0000 31.250 2.4222 1.5688 8.4909 89 0.0000 0.0000 34.000 2.6911 1.6763 9.9074 90 0.0000 0.0000 36.885 3.0029 1.8010 11.550 91 0.0000 0.0000 39.916 3.3640 1.9454 13.451 92 0.0000 0.0000 46.460 4.2655 2.3060 18.200 93 0.0000 0.0000 50.000 4.8252 2.5298 21.147 94 0.0000 0.0000 51.906 5.1480 2.6589 22.848 95 0.0000 0.0000 53.738 5.4729 2.7889 24.559 96 0.0000 0.0000 61.881 7.0931 3.4369 33.093 97 0.0000 0.0000 66.326 8.1028 3.8407 38.411 98 0.0000 0.0000 68.635 8.6632 4.0648 41.363 99 0.0000 0.0000 71.053 9.2766 4.3101 44.593 100 0.0000 0.0000 76.087 10.644 4.8568 51.793 101 0.0000 0.0000 81.461 12.239 5.4948 60.196 102 0.0000 0.0000 87.209 14.105 6.2412 70.026 103 3.5135 36.539 92.279 19.893 14.793 80.737 104 25.484 42.809 100.00 26.460 20.121 97.041 105 60.970 64.057 100.00 45.373 41.147 100.10 106 0.9579 0.9579 0.9579 1.0698 1.0734 1.0800 107 1.4451 1.4451 1.4451 1.1053 1.1107 1.1206 108 1.9380 1.9380 1.9380 1.1412 1.1485 1.1618 109 2.4366 2.4366 2.4366 1.1775 1.1867 1.2034 110 2.9412 2.9412 2.9412 1.2142 1.2254 1.2455 111 3.4517 3.4517 3.4517 1.2514 1.2645 1.2881 112 3.9683 3.9683 3.9683 1.2890 1.3040 1.3312 113 4.4910 4.4910 4.4910 1.3288 1.3459 1.3767 114 5.0201 5.0201 5.0201 1.3721 1.3914 1.4264 115 5.5556 5.5556 5.5556 1.4192 1.4410 1.4804 116 6.0976 6.0976 6.0976 1.4702 1.4947 1.5389 117 6.6462 6.6462 6.6462 1.5254 1.5527 1.6021 118 7.2016 7.2016 7.2016 1.5849 1.6153 1.6703 119 7.7640 7.7640 7.7640 1.6490 1.6827 1.7437 120 8.3333 8.3333 8.3333 1.7179 1.7552 1.8226 121 8.9099 8.9099 8.9099 1.7918 1.8329 1.9073 122 9.4937 9.4937 9.4937 1.8709 1.9162 1.9981 123 10.085 10.085 10.085 1.9557 2.0054 2.0952 124 10.684 10.684 10.684 2.0462 2.1006 2.1989 125 11.290 11.290 11.290 2.1428 2.2022 2.3096 126 11.905 11.905 11.905 2.2457 2.3105 2.4276 127 12.527 12.527 12.527 2.3553 2.4258 2.5532 128 13.158 13.158 13.158 2.4719 2.5485 2.6868 129 13.797 13.797 13.797 2.5958 2.6788 2.8288 130 14.444 14.444 14.444 2.7274 2.8172 2.9795 131 15.101 15.101 15.101 2.8669 2.9640 3.1395 132 15.766 15.766 15.766 3.0149 3.1196 3.3090 133 16.440 16.440 16.440 3.1716 3.2845 3.4886 134 17.123 17.123 17.123 3.3375 3.4590 3.6787 135 17.816 17.816 17.816 3.5130 3.6436 3.8798 136 18.518 18.518 18.518 3.6985 3.8388 4.0924 137 19.231 19.231 19.231 3.8946 4.0451 4.3171 138 19.953 19.953 19.953 4.1016 4.2629 4.5544 139 20.686 20.686 20.686 4.3202 4.4928 4.8049 140 21.429 21.429 21.429 4.5508 4.7354 5.0691 141 22.182 22.182 22.182 4.7940 4.9913 5.3478 142 22.947 22.947 22.947 5.0504 5.2610 5.6417 143 23.723 23.723 23.723 5.3206 5.5452 5.9513 144 24.510 24.510 24.510 5.6052 5.8446 6.2774 145 25.309 25.309 25.309 5.9049 6.1599 6.6209 146 26.119 26.119 26.119 6.2204 6.4918 6.9824 147 26.942 26.942 26.942 6.5524 6.8412 7.3630 148 27.778 27.778 27.778 6.9018 7.2087 7.7633 149 28.626 28.626 28.626 7.2693 7.5953 8.1845 150 29.487 29.487 29.487 7.6557 8.0018 8.6273 151 30.362 30.362 30.362 8.0620 8.4293 9.0929 152 31.250 31.250 31.250 8.4891 8.8786 9.5824 153 32.152 32.152 32.152 8.9380 9.3508 10.097 154 33.069 33.069 33.069 9.4097 9.8470 10.637 155 34.000 34.000 34.000 9.9053 10.368 11.205 156 34.946 34.946 34.946 10.426 10.916 11.802 157 35.908 35.908 35.908 10.973 11.491 12.428 158 36.885 36.885 36.885 11.547 12.095 13.087 159 37.879 37.879 37.879 12.150 12.730 13.778 160 38.889 38.889 38.889 12.783 13.396 14.504 161 39.916 39.916 39.916 13.448 14.096 15.266 162 40.961 40.961 40.961 14.147 14.830 16.066 163 42.023 42.023 42.023 14.880 15.601 16.906 164 43.103 43.103 43.103 15.649 16.411 17.788 165 44.203 44.203 44.203 16.457 17.261 18.714 166 45.322 45.322 45.322 17.305 18.153 19.686 167 46.460 46.460 46.460 18.196 19.090 20.706 168 47.619 47.619 47.619 19.131 20.073 21.777 169 48.799 48.799 48.799 20.112 21.106 22.902 170 50.000 50.000 50.000 21.143 22.190 24.083 171 51.223 51.223 51.223 22.225 23.328 25.323 172 52.469 52.469 52.469 23.361 24.523 26.625 173 53.738 53.738 53.738 24.554 25.779 27.992 174 55.031 55.031 55.031 25.807 27.097 29.428 175 56.349 56.349 56.349 27.123 28.481 30.936 176 57.692 57.692 57.692 28.505 29.935 32.520 177 59.062 59.062 59.062 29.957 31.463 34.184 178 60.458 60.458 60.458 31.482 33.067 35.932 179 61.881 61.881 61.881 33.085 34.754 37.769 180 63.333 63.333 63.333 34.770 36.526 39.700 181 64.815 64.815 64.815 36.541 38.389 41.729 182 66.326 66.326 66.326 38.402 40.347 43.862 183 67.869 67.869 67.869 40.360 42.406 46.105 184 69.444 69.444 69.444 42.418 44.572 48.464 185 71.053 71.053 71.053 44.583 46.849 50.945 186 72.695 72.695 72.695 46.861 49.246 53.556 187 74.373 74.373 74.373 49.258 51.768 56.303 188 76.087 76.087 76.087 51.781 54.422 59.194 189 77.839 77.839 77.839 54.438 57.216 62.238 190 79.630 79.630 79.630 57.235 60.159 65.444 191 81.461 81.461 81.461 60.182 63.259 68.821 192 83.333 83.333 83.333 63.287 66.526 72.379 193 85.249 85.249 85.249 66.559 69.968 76.130 194 87.209 87.209 87.209 70.010 73.598 80.084 195 89.216 89.216 89.216 73.648 77.426 84.254 196 91.270 91.270 91.270 77.487 81.465 88.653 197 93.374 93.374 93.374 81.539 85.727 93.296 198 95.528 95.528 95.528 85.816 90.227 98.198 199 59.504 0.0000 56.217 18.706 9.5586 27.594 200 67.552 0.0000 67.769 25.350 12.693 41.031 201 80.176 0.0000 76.442 35.521 17.672 53.486 202 40.879 0.0000 67.169 13.984 6.8499 39.740 203 47.465 0.0000 78.478 19.148 9.1614 55.806 204 71.456 41.891 84.306 37.478 26.102 67.578 205 91.264 100.00 48.681 73.197 90.353 33.374 206 100.00 100.00 58.509 82.622 95.007 43.087 207 61.049 27.215 16.074 17.039 12.387 4.4297 208 81.852 45.980 45.854 36.457 28.305 21.047 209 89.741 50.368 48.176 44.171 34.277 23.658 210 0.0000 93.374 0.0000 31.301 61.593 11.100 211 0.0000 100.00 0.0000 36.405 71.801 12.802 212 13.989 100.00 0.0000 37.114 72.166 12.835 213 73.233 100.00 0.0000 56.633 82.230 13.750 214 100.00 100.00 27.085 78.301 93.279 20.328 215 100.00 89.749 30.022 70.844 77.975 19.052 216 0.0000 0.0000 43.103 3.7819 2.1126 15.653 217 0.0000 0.0000 100.00 18.871 8.1473 95.129 218 0.0000 11.906 100.00 19.340 9.0846 95.285 219 0.0000 25.702 100.00 20.773 11.952 95.763 220 0.0000 38.806 100.00 23.285 16.973 96.600 221 74.717 39.483 100.00 44.603 28.207 97.646 222 100.00 23.416 89.038 57.149 30.714 75.781 223 100.00 38.564 88.740 59.816 36.214 76.159 224 100.00 50.967 88.648 63.327 43.286 77.171 225 100.00 0.0000 89.627 55.770 27.627 76.338 226 100.00 13.590 100.00 60.286 30.369 97.237 227 100.00 0.0000 65.823 48.814 24.845 39.699 228 100.00 34.660 67.715 52.753 31.998 43.246 229 100.00 0.0000 40.247 44.236 23.014 15.584 230 100.00 44.309 46.395 50.931 35.043 22.010 231 100.00 53.871 51.081 54.746 41.471 26.985 232 100.00 62.017 60.273 59.710 48.608 37.241 233 100.00 38.387 0.0000 46.144 30.679 4.3512 234 100.00 39.267 23.421 47.155 31.420 8.6368 235 100.00 61.585 32.788 55.344 46.565 15.160 236 100.00 61.657 44.941 56.846 47.215 22.922 237 70.612 60.789 71.118 39.550 37.143 49.425 238 82.746 70.977 76.345 53.673 51.312 58.879 239 37.159 0.0000 92.897 20.765 9.4424 80.846 240 44.549 0.0000 100.00 25.690 11.663 95.448 241 49.873 43.420 100.00 33.160 23.823 97.402 242 54.356 54.213 100.00 38.381 31.612 98.631 243 42.774 77.433 86.139 39.868 49.056 75.045 244 41.988 83.517 100.00 48.433 58.341 103.26 245 52.053 92.031 100.00 57.729 71.701 105.35 246 58.448 100.00 100.00 66.555 85.279 107.51 247 73.520 100.00 100.00 74.682 89.469 107.89 248 13.164 0.0000 100.00 19.510 8.4768 95.159 249 29.856 0.0000 100.00 21.833 9.6742 95.268 250 59.755 0.0000 100.00 31.761 14.793 95.733 251 0.0000 100.00 100.00 54.276 78.948 106.93 252 13.909 100.00 100.00 54.978 79.310 106.96 253 0.0000 48.379 62.832 14.359 17.634 36.543 254 48.854 48.853 89.594 30.449 25.270 77.157 255 36.041 24.250 100.00 24.928 13.789 95.899 256 37.996 39.502 100.00 28.322 19.820 96.884 257 35.871 91.089 100.00 51.837 67.661 104.88 258 43.133 100.00 100.00 60.641 82.230 107.23 259 33.122 75.630 36.246 25.442 41.354 17.626 260 49.161 100.00 37.410 46.894 76.970 24.062 261 75.404 100.00 38.431 60.181 83.807 25.310 262 88.450 100.00 36.802 69.311 88.536 24.750 263 100.00 100.00 42.152 79.888 93.914 28.689 264 100.00 100.00 72.268 85.831 96.290 59.988 265 77.569 27.675 0.0000 26.209 17.269 2.8126 266 87.096 45.943 0.0000 37.170 29.023 4.5043 267 75.356 40.398 0.0000 27.365 21.723 3.6116 268 80.697 67.351 42.794 43.437 44.170 21.460 269 80.870 76.700 48.942 49.365 54.383 27.905 270 37.559 89.857 0.0000 33.531 58.999 10.482 271 58.407 100.00 0.0000 48.665 78.122 13.376 272 100.00 100.00 0.0000 77.235 92.853 14.715 273 100.00 100.00 13.014 77.510 92.962 16.160 274 72.947 0.0000 100.00 38.923 18.486 96.069 275 100.00 0.0000 100.00 59.701 29.199 97.042 276 0.0000 0.0000 57.692 6.2232 3.0890 28.511 277 0.0000 0.0000 93.374 16.295 7.1169 81.558 278 0.0000 0.0000 96.671 17.547 7.6179 88.157 279 0.0000 51.625 100.00 26.993 24.388 97.836 280 34.136 63.394 100.00 35.499 35.616 99.556 281 42.019 73.566 100.00 42.611 46.684 101.32 282 100.00 73.324 100.00 77.290 64.373 102.91 283 87.006 36.008 100.00 52.429 31.051 97.783 284 89.310 47.667 100.00 57.303 38.108 98.888 285 0.0000 63.831 43.078 16.705 27.961 19.943 286 0.0000 100.00 78.250 46.674 75.907 66.887 287 27.387 100.00 100.00 56.765 80.231 107.05 288 100.00 0.0000 11.873 42.066 22.146 4.1538 289 100.00 0.0000 26.126 42.822 22.449 8.1373 290 28.717 40.030 0.0000 8.4491 11.833 2.6988 291 39.819 43.478 0.0000 11.987 14.997 3.1231 292 40.043 84.835 91.288 45.365 58.401 85.927 293 0.0000 72.895 73.752 27.354 39.312 54.161 294 0.0000 78.791 100.00 39.531 49.462 102.02 295 0.0000 89.514 100.00 46.411 63.218 104.31 296 0.0000 2.9412 0.0000 1.0806 1.1612 1.0269 297 0.0000 4.4910 0.0000 1.1237 1.2473 1.0412 298 50.168 0.0000 89.805 23.806 11.139 75.169 299 100.00 29.834 100.00 62.265 34.327 97.897 300 100.00 44.012 100.00 65.463 40.721 98.963 301 0.0000 1.4451 0.0000 1.0396 1.0792 1.0132 302 0.0000 6.0976 0.0000 1.1769 1.3538 1.0590 303 0.0000 7.7640 0.0000 1.2442 1.4883 1.0814 304 0.0000 9.4937 0.0000 1.3277 1.6553 1.1092 305 0.0000 35.661 63.890 11.237 11.011 36.670 306 0.0000 55.374 89.593 24.389 25.488 77.517 307 0.0000 65.546 100.00 32.579 35.559 99.698 308 30.939 75.816 100.00 41.008 47.690 101.60 309 0.0000 69.908 32.694 18.375 33.249 14.488 310 42.780 70.475 40.429 25.785 37.395 19.452 311 45.907 75.256 77.506 36.964 46.047 60.494 312 0.0000 25.720 44.342 5.8601 5.9913 17.200 313 0.0000 32.934 76.572 13.919 11.186 53.567 314 0.0000 41.602 87.165 19.202 16.457 71.651 315 0.0000 100.00 89.347 50.247 77.336 85.709 316 100.00 73.512 36.877 61.522 58.228 19.355 317 100.00 84.618 40.989 68.586 71.557 24.167 318 100.00 91.624 50.752 74.811 81.684 33.399 319 44.515 57.797 0.0000 18.197 25.286 4.7821 320 56.862 59.670 0.0000 23.703 29.242 5.2559 321 60.222 36.306 100.00 35.822 22.585 97.023 322 64.666 47.430 100.00 40.976 29.582 98.102 323 29.790 33.275 67.351 14.501 11.867 40.911 324 35.550 38.667 72.526 18.282 15.409 48.292 325 67.852 72.800 100.00 53.248 51.562 101.70 326 79.616 79.971 100.00 64.622 63.439 103.39 327 27.420 100.00 0.0000 38.900 73.087 12.919 328 42.216 100.00 0.0000 42.486 74.936 13.087 329 56.013 100.00 24.628 48.475 77.921 17.976 330 100.00 51.360 0.0000 49.862 38.113 5.5905 331 100.00 64.150 0.0000 54.900 48.188 7.2699 332 100.00 75.616 0.0000 60.672 59.730 9.1939 333 49.611 0.0000 32.514 11.135 6.0474 9.5270 334 51.018 0.0000 45.444 13.243 6.9524 17.831 335 66.335 100.00 46.179 55.861 81.459 30.540 336 0.0000 90.323 0.0000 29.105 57.202 10.368 337 0.0000 100.00 39.587 38.728 72.730 25.038 338 0.0000 100.00 52.833 40.716 73.524 35.506 339 36.275 100.00 62.282 47.005 76.551 45.561 340 0.0000 13.158 0.0000 1.5538 2.1074 1.1846 341 0.0000 15.101 0.0000 1.7024 2.4046 1.2341 342 41.273 31.357 0.0000 9.6336 9.6623 2.2174 343 63.197 38.697 0.0000 19.970 17.292 3.1458 344 0.0000 0.0000 4.4910 1.0624 1.0250 1.3288 345 0.0000 0.0000 6.0976 1.0893 1.0357 1.4703 346 0.0000 38.732 51.710 9.5098 11.436 24.135 347 0.4762 0.4762 0.4762 1.0347 1.0365 1.0397 348 0.0000 11.290 0.0000 1.4299 1.8598 1.1433 349 4.8849 53.605 9.1225 10.126 18.768 4.7656 350 0.0000 100.00 11.802 36.638 71.894 14.030 351 0.0000 100.00 26.442 37.421 72.207 18.152 352 37.053 100.00 36.026 42.932 74.945 23.062 353 55.087 100.00 50.577 51.113 78.930 33.961 354 82.078 100.00 77.755 72.646 89.315 67.348 355 38.714 0.0000 27.945 7.1986 4.0648 7.2120 356 37.496 0.0000 41.767 8.3376 4.4824 14.926 357 44.566 0.0000 55.621 12.646 6.4471 26.717 358 44.077 44.146 79.010 23.959 20.231 58.516 359 83.607 48.219 80.462 46.164 33.422 62.190 360 80.270 0.0000 25.777 26.807 14.195 7.2511 361 89.787 0.0000 46.880 36.308 18.820 20.034 362 71.695 0.0000 32.236 21.808 11.553 9.8861 363 77.374 0.0000 43.548 26.719 13.932 17.048 364 100.00 40.719 57.941 51.988 33.929 32.314 365 100.00 43.258 75.836 56.956 36.986 55.184 366 100.00 59.130 100.00 70.623 51.041 100.68 367 0.0000 50.729 43.014 11.589 17.744 18.195 368 0.0000 52.694 53.615 13.942 19.760 27.272 369 0.0000 60.083 67.327 19.655 26.558 43.445 370 100.00 24.892 0.0000 43.616 25.624 3.5086 371 100.00 38.297 35.688 47.993 31.384 14.192 372 100.00 73.248 63.580 65.847 59.730 42.832 373 100.00 81.243 74.408 73.136 69.979 58.612 374 50.398 38.391 0.0000 14.205 14.213 2.8549 375 52.374 49.213 0.0000 17.987 20.626 3.8938 376 52.149 89.960 0.0000 38.425 61.630 10.732 377 0.0000 75.200 48.425 23.180 39.644 26.006 378 0.0000 100.00 65.969 43.423 74.607 49.767 379 36.272 100.00 73.992 49.884 77.702 60.728 380 40.034 100.00 85.768 54.461 79.651 79.535 381 0.0000 38.634 24.220 6.2267 10.085 6.9576 382 0.0000 39.830 40.300 8.0745 11.288 15.260 383 67.368 38.105 41.590 24.625 19.187 16.785 384 70.870 84.698 46.158 47.329 60.589 26.944 385 0.0000 61.881 0.0000 13.071 25.139 5.0238 386 38.600 67.977 0.0000 20.893 33.311 6.1892 387 46.571 79.530 0.0000 29.596 47.056 8.3839 388 43.609 78.609 44.678 31.072 46.662 23.974 389 43.023 86.259 74.745 41.927 58.621 58.551 390 0.0000 16.984 78.155 12.107 6.8282 55.227 391 0.0000 27.618 87.753 16.485 10.705 71.733 392 44.251 25.965 92.682 24.702 14.362 81.174 393 47.148 30.773 100.00 29.302 17.578 96.400 394 36.361 0.0000 81.313 16.635 7.7666 60.164 395 58.835 29.078 80.444 26.818 16.661 59.944 396 72.421 30.645 91.078 37.895 22.369 78.969 397 25.876 66.085 0.0000 17.182 30.059 5.7571 398 23.518 89.586 0.0000 30.433 57.122 10.283 399 27.269 100.00 26.823 39.918 73.491 18.422 400 13.805 100.00 30.394 38.442 72.695 19.913 401 12.940 100.00 45.766 40.188 73.385 29.484 402 0.0000 88.220 22.679 28.400 54.589 13.843 403 0.0000 90.229 35.521 30.891 57.810 20.099 404 86.717 0.0000 56.883 35.625 18.267 29.059 405 100.00 13.680 62.728 48.700 25.746 36.180 406 100.00 21.906 73.748 52.217 28.436 50.747 407 100.00 76.200 12.463 61.254 60.487 10.647 408 100.00 88.314 14.391 68.868 75.598 13.534 409 100.00 88.029 65.212 75.189 77.816 47.785 410 64.582 50.465 0.0000 24.029 24.348 4.2940 411 75.924 54.534 0.0000 32.077 30.603 5.0774 412 87.601 57.141 0.0000 41.379 36.858 5.7949 413 86.549 61.177 37.377 44.262 40.537 17.149 414 86.225 71.472 57.085 51.901 51.310 34.787 415 0.0000 53.559 78.335 20.091 22.709 58.149 416 0.0000 64.010 79.619 24.683 31.280 61.568 417 28.247 63.573 94.862 32.313 34.325 88.895 418 74.306 44.236 67.520 35.110 26.377 42.841 419 77.180 53.236 67.161 39.732 33.012 43.423 420 100.00 66.107 72.219 64.381 53.418 52.774 421 50.638 70.139 34.324 27.638 38.179 15.815 422 62.859 73.182 36.427 34.875 44.232 17.791 423 62.804 77.700 54.173 39.959 50.279 32.326 424 25.882 74.670 56.688 26.569 40.789 33.684 425 32.553 77.893 63.589 31.139 45.676 41.957 426 67.461 89.497 69.496 53.255 67.885 52.462 427 75.155 93.811 72.650 61.754 76.768 58.021 428 20.800 0.0000 60.576 8.2694 4.0757 31.690 429 20.660 28.532 93.832 20.245 12.611 83.306 430 26.312 32.105 100.00 24.147 15.286 96.229 431 25.620 0.0000 33.016 4.7718 2.7606 9.4863 432 60.795 0.0000 32.340 15.914 8.5132 9.6628 433 60.659 23.035 55.111 20.584 12.829 27.027 434 62.202 34.123 56.069 23.363 16.973 28.630 435 92.692 75.731 70.003 62.280 59.728 51.085 436 100.00 89.709 87.834 82.823 82.721 82.286 437 0.0000 89.637 87.925 41.974 61.581 80.520 438 20.343 94.123 94.561 48.990 69.715 94.250 439 72.838 17.733 23.172 22.706 13.492 6.3776 440 76.074 18.445 31.675 25.494 14.956 10.069 441 85.688 26.997 33.537 33.517 20.689 11.706 442 88.334 34.475 0.0000 35.269 23.786 3.5935 443 87.347 78.894 0.0000 51.769 57.930 9.3151 444 88.140 84.764 30.900 57.408 66.061 17.874 445 92.738 100.00 79.334 81.402 93.776 70.194 446 100.00 100.00 87.773 90.533 98.171 84.753 447 0.0000 69.882 88.957 30.508 38.081 78.459 448 9.6025 74.639 100.00 37.557 44.944 101.25 449 19.753 77.982 100.00 40.379 49.197 101.92 450 58.895 84.760 100.00 55.705 63.273 103.83 451 69.456 91.603 100.00 65.863 75.438 105.64 452 0.0000 23.240 67.538 9.9556 7.0802 40.465 453 20.669 31.453 70.272 13.369 10.681 44.553 454 31.540 50.791 70.793 20.361 21.669 47.008 455 31.826 65.987 87.510 31.493 35.842 75.360 456 36.840 72.784 91.088 37.325 43.734 83.143 457 53.742 75.139 100.00 47.669 50.565 101.80 458 27.339 50.470 55.303 15.975 19.647 28.775 459 30.240 54.837 63.338 19.714 23.652 38.013 460 0.0000 25.164 23.701 3.6436 4.9763 5.9220 461 25.015 27.909 41.428 7.8785 7.5775 15.314 462 43.796 31.555 54.893 15.134 12.011 26.943 463 43.291 31.978 71.664 18.805 13.588 46.719 464 51.055 34.047 77.911 23.673 16.500 56.110 465 23.326 0.0000 45.712 5.9678 3.1966 17.696 466 28.639 0.0000 68.858 11.441 5.4907 41.782 467 28.498 24.191 72.358 14.004 9.2140 47.088 468 53.144 26.199 93.308 28.221 16.201 82.556 469 67.520 27.149 100.00 37.875 21.094 96.627 470 32.146 0.0000 54.824 9.1150 4.6437 25.771 471 88.474 58.539 74.879 51.919 42.034 55.018 472 100.00 60.916 82.508 65.057 49.996 67.722 473 52.867 69.919 0.0000 26.683 37.721 6.7356 474 61.107 71.626 18.673 31.754 41.572 9.9400 475 71.520 79.603 38.460 43.515 54.044 20.461 476 38.933 23.286 21.378 8.3640 7.0462 5.2986 477 45.117 29.787 25.863 11.534 10.112 7.3007 478 53.992 29.571 49.146 17.528 12.833 21.735 479 56.215 33.597 68.561 23.189 16.408 42.884 480 75.787 44.570 76.386 38.486 27.987 55.237 481 100.00 66.376 91.572 70.559 56.091 84.692 482 17.194 38.225 20.294 6.9058 10.320 5.6762 483 29.418 49.395 24.740 12.146 17.599 8.2866 484 27.768 84.448 24.516 28.579 50.954 13.777 485 48.296 88.665 25.217 36.987 59.449 15.235 486 64.354 91.781 24.279 46.180 67.447 15.947 487 92.653 94.001 32.160 67.609 80.827 20.808 488 93.774 94.298 68.916 75.002 84.247 53.712 489 69.270 27.899 41.492 23.675 15.719 16.098 490 70.531 28.820 50.483 25.898 16.934 23.239 491 68.398 33.323 70.534 29.730 19.642 45.773 492 75.384 33.574 79.628 36.522 22.925 59.345 493 85.075 33.609 83.633 44.510 26.909 66.225 494 89.628 34.215 93.267 51.500 30.311 83.973 495 94.151 62.228 94.277 64.460 50.049 89.078 496 37.472 59.971 38.030 19.131 26.822 16.223 497 62.084 80.395 62.951 42.966 53.987 42.192 498 71.939 81.537 66.042 49.788 58.456 46.405 499 84.438 11.701 0.0000 29.294 16.265 2.4563 500 87.365 22.063 0.0000 32.475 19.325 2.8796 501 89.829 31.836 22.084 36.653 23.644 7.2382 502 93.941 32.569 30.243 40.824 25.931 10.690 503 50.466 100.00 10.814 45.524 76.479 14.286 504 63.678 100.00 12.075 51.476 79.543 14.772 505 75.902 100.00 13.109 58.596 83.210 15.292 506 80.597 100.00 27.052 62.538 85.151 19.576 507 100.00 46.929 11.784 48.673 35.364 6.3421 508 100.00 53.224 22.839 51.270 39.710 9.8205 509 48.501 17.335 0.0000 10.083 7.0178 1.6832 510 53.850 27.267 0.0000 13.405 10.571 2.1942 511 65.653 26.936 0.0000 18.953 13.356 2.4394 512 64.962 25.880 23.784 19.251 13.177 6.7123 513 73.860 33.888 25.064 25.858 18.650 7.8885 514 84.611 36.703 31.430 34.333 23.849 11.199 515 91.986 58.783 30.959 46.955 40.535 13.526 516 92.789 71.991 30.343 53.673 53.060 15.297 517 100.00 80.942 54.832 68.452 67.812 34.846 518 78.593 66.821 0.0000 38.997 41.822 6.8786 519 89.392 68.251 0.0000 47.655 47.307 7.4814 520 89.059 89.757 0.0000 60.104 72.597 11.707 521 61.443 78.342 0.0000 35.102 48.855 8.4413 522 74.655 80.182 29.760 44.892 55.372 15.935 523 0.0000 11.625 41.144 3.9711 2.9094 14.425 524 0.0000 13.133 88.516 15.105 7.5241 72.568 525 20.893 21.619 100.00 21.698 11.621 95.651 526 19.058 9.5169 100.00 20.435 9.4417 95.296 527 44.845 15.219 100.00 26.499 13.137 95.690 528 67.437 13.577 100.00 36.292 17.996 96.113 529 78.793 12.410 100.00 43.200 21.437 96.413 530 79.085 25.104 100.00 44.713 24.167 96.860 531 90.921 22.925 100.00 53.292 28.152 97.178 532 76.673 0.0000 90.024 37.494 18.188 76.213 533 87.475 0.0000 100.00 49.019 23.692 96.542 534 89.756 11.114 100.00 51.244 25.461 96.766 535 0.0000 65.341 22.324 15.342 28.514 9.3793 536 24.611 72.636 28.708 21.434 36.958 13.142 537 26.096 80.942 33.130 26.812 46.697 16.866 538 39.559 82.511 37.604 31.302 50.393 19.871 539 66.150 83.543 75.972 50.310 60.288 60.234 540 16.981 15.361 54.115 7.2643 4.7789 25.209 541 20.655 19.384 61.617 9.5778 6.3650 33.227 542 34.270 25.531 65.061 13.611 9.5015 37.659 543 72.555 0.0000 54.975 25.513 13.095 26.685 544 80.402 0.0000 65.285 32.792 16.599 38.290 545 100.00 11.543 75.439 51.737 26.727 52.893 546 100.00 29.686 80.755 55.390 31.536 61.809 547 44.923 62.908 30.123 21.779 30.139 12.449 548 43.948 90.347 33.383 37.375 61.304 19.262 549 60.805 100.00 36.406 51.748 79.486 23.695 550 19.382 100.00 24.117 38.527 72.796 17.325 551 43.056 100.00 24.418 43.614 75.417 17.672 552 68.400 100.00 26.500 54.800 81.167 18.990 553 78.288 100.00 63.968 66.447 86.532 48.432 554 34.706 80.820 81.075 38.025 51.268 67.049 555 65.498 82.289 90.448 53.791 60.379 84.287 556 14.416 22.753 0.0000 3.2459 4.3827 1.5347 557 34.725 22.499 0.0000 6.5031 6.0146 1.6781 558 64.860 30.936 34.020 20.897 15.160 11.562 559 76.236 38.963 40.965 30.077 22.309 16.673 560 30.630 76.238 48.831 26.944 42.437 26.686 561 28.829 92.305 72.930 42.052 64.964 57.173 562 51.433 100.00 88.279 59.167 81.979 84.191 563 62.810 100.00 90.707 65.114 84.946 88.919 564 28.446 65.853 78.758 27.955 34.248 60.619 565 63.282 72.390 81.167 43.866 47.180 66.100 566 70.989 75.628 91.113 53.188 54.208 84.375 567 71.048 83.114 100.00 61.073 64.480 103.78 568 0.0000 14.109 53.837 6.1147 4.0437 24.861 569 0.0000 26.476 55.846 7.8819 6.9800 27.294 570 31.242 29.419 56.395 11.710 9.6462 28.158 571 43.543 37.215 64.540 18.223 15.106 37.868 572 59.992 55.777 81.120 34.747 31.376 63.453 573 23.761 26.177 79.973 15.636 10.227 58.540 574 31.529 32.382 79.568 18.000 13.030 58.316 575 38.359 35.270 92.507 24.557 16.779 81.311 576 39.217 51.688 100.00 32.218 27.115 98.087 577 78.999 64.433 70.414 46.277 42.994 49.248 578 91.427 67.090 71.314 57.093 50.377 51.323 579 97.230 71.412 76.610 65.679 57.826 59.901 580 100.00 75.951 82.735 72.497 64.759 70.555 581 66.138 70.651 28.078 34.463 42.151 13.185 582 72.912 70.667 41.329 39.774 44.739 20.740 583 78.126 70.975 61.605 46.768 48.177 39.326 584 74.621 68.677 82.365 48.818 46.885 67.741 585 75.008 68.823 93.246 52.861 48.645 87.401 586 52.084 53.641 40.619 21.827 24.555 17.309 587 66.079 64.927 42.794 33.256 37.235 20.658 588 85.179 71.188 67.065 53.138 51.479 46.161 589 91.219 85.671 100.00 76.956 75.111 105.00 590 100.00 88.360 100.00 86.445 82.679 105.96 591 49.502 36.195 44.410 16.332 14.224 18.289 592 73.056 36.083 58.551 30.304 21.110 31.624 593 21.354 64.460 24.489 16.613 28.554 10.074 594 34.466 64.448 30.297 19.514 29.989 12.621 595 33.659 69.583 42.666 23.158 35.339 20.733 596 33.452 80.531 94.396 42.112 52.587 90.981 597 63.559 92.994 94.260 61.415 74.899 94.001 598 22.495 71.453 67.325 26.637 38.011 45.286 599 27.149 76.443 74.039 31.825 44.496 55.337 600 100.00 12.014 0.0000 42.306 23.004 3.0718 601 100.00 15.357 11.950 42.792 23.594 4.4083 602 100.00 26.381 21.678 44.523 26.334 7.2122 603 22.517 53.959 0.0000 11.635 19.753 4.0597 604 33.720 53.876 0.0000 13.709 20.778 4.1484 605 31.504 93.140 20.193 35.035 63.194 14.371 606 29.863 100.00 49.945 43.184 74.854 33.040 607 88.399 100.00 100.00 85.148 94.865 108.38 608 34.985 59.811 70.135 24.340 28.726 47.275 609 43.958 65.082 70.938 29.368 34.698 49.245 610 12.377 0.0000 69.045 9.3416 4.4028 41.927 611 22.723 0.0000 78.736 13.136 6.0533 55.922 612 31.589 41.870 83.399 21.353 17.813 65.295 613 30.805 44.746 94.660 25.901 20.873 86.234 614 78.491 50.289 100.00 50.167 35.672 98.794 615 88.983 61.761 100.00 62.226 48.340 100.60 616 0.0000 41.654 12.937 6.3969 11.358 4.1392 617 0.0000 53.220 16.635 10.098 18.519 6.1109 618 10.395 59.275 100.00 30.287 30.330 98.810 619 20.578 65.644 100.00 34.050 36.385 99.780 620 88.540 72.875 100.00 67.204 58.816 102.36 621 57.642 31.387 27.422 16.846 13.263 8.2588 622 57.818 34.807 38.486 18.697 15.091 14.265 623 62.165 34.701 47.355 21.959 16.600 20.743 624 66.069 35.411 79.293 31.311 20.815 58.684 625 23.321 38.778 58.914 12.689 12.934 31.359 626 34.023 45.878 63.230 17.556 18.143 36.936 627 52.624 57.888 30.864 22.576 27.436 12.236 628 61.997 62.483 32.575 28.858 33.486 13.921 629 71.830 62.901 35.235 34.709 36.743 15.670 630 61.160 61.364 22.081 27.131 31.978 9.3474 631 100.00 67.383 22.733 57.159 51.498 11.750 632 100.00 79.238 25.716 63.715 64.279 14.951 633 100.00 91.106 77.622 80.574 83.396 65.583 634 90.058 27.256 50.707 39.278 23.453 23.990 635 100.00 50.160 64.267 56.085 39.961 40.346 636 100.00 12.442 23.329 43.128 23.378 7.2644 637 100.00 21.305 45.155 46.224 25.923 19.535 638 100.00 32.752 47.339 48.332 29.615 21.854 639 88.255 0.0000 34.761 33.529 17.567 11.766 640 100.00 11.201 50.219 46.116 24.445 23.393 641 100.00 25.715 58.604 49.140 28.022 32.022 642 100.00 54.611 73.859 60.032 44.015 53.500 643 35.916 24.780 48.081 10.614 8.1779 20.308 644 35.184 36.712 60.643 14.905 13.327 33.200 645 34.390 84.923 70.310 37.494 55.172 51.922 646 0.0000 74.444 62.463 25.415 39.872 39.827 647 0.0000 79.349 86.086 34.717 48.064 75.033 648 29.467 84.823 88.171 41.706 56.629 80.022 649 32.452 93.569 93.569 50.322 69.837 92.254 650 14.063 100.00 89.152 50.895 77.678 85.384 651 29.582 100.00 90.275 53.481 78.966 87.569 652 73.390 100.00 91.081 71.187 88.062 89.901 653 23.681 94.200 51.030 37.778 65.377 32.448 654 28.508 94.012 63.449 40.909 66.502 45.298 655 58.773 12.181 0.0000 13.916 8.3818 1.7447 656 71.820 15.517 0.0000 21.105 12.460 2.1532 657 83.105 38.527 21.003 32.854 23.800 7.1259 658 25.604 14.447 0.0000 3.8275 3.4227 1.3187 659 25.942 29.172 0.0000 5.6849 7.0521 1.9215 660 31.171 66.760 53.537 22.946 32.990 29.278 661 32.778 68.708 62.324 25.990 35.753 38.842 662 45.509 72.686 65.775 32.359 41.963 43.809 663 76.609 87.938 0.0000 49.828 65.439 10.867 664 85.766 100.00 0.0000 65.240 86.668 14.153 665 87.854 100.00 10.451 67.041 87.574 15.239 666 89.643 100.00 21.782 68.964 88.507 17.959 667 26.120 65.251 16.358 17.245 29.470 7.7826 668 34.878 71.129 23.809 22.336 36.298 11.022 669 36.751 81.100 28.266 28.746 47.888 14.674 670 72.488 91.458 35.115 51.490 69.731 21.087 671 78.953 100.00 49.809 64.135 85.659 33.904 672 56.715 73.801 27.610 31.448 43.056 13.319 673 58.750 82.373 33.628 37.902 53.719 17.899 674 63.404 90.803 37.211 46.172 66.270 21.915 675 15.004 45.646 0.0000 8.0297 13.869 3.1138 676 29.381 51.308 43.841 14.765 19.657 18.998 677 36.514 57.898 52.869 20.226 25.892 27.424 678 63.455 64.263 76.626 38.632 38.743 57.666 679 90.185 0.0000 71.588 41.716 21.020 46.842 680 100.00 0.0000 77.898 51.996 26.118 56.455 681 12.800 71.476 0.0000 18.225 34.540 6.5671 682 22.935 78.274 0.0000 23.113 42.614 7.8681 683 34.047 79.241 0.0000 25.801 44.844 8.1569 684 40.383 93.889 41.763 39.818 66.249 25.188 685 28.953 0.0000 21.546 4.4645 2.7075 4.7192 686 30.859 18.824 21.776 5.9088 5.0037 5.1597 687 24.039 33.330 22.110 6.8551 8.7083 5.9332 688 27.533 39.957 42.045 10.848 12.738 16.581 689 28.387 56.361 78.421 23.826 26.168 58.753 690 37.157 60.228 79.719 27.726 30.420 61.399 691 47.125 63.342 100.00 39.272 37.528 99.726 692 78.281 65.213 100.00 55.907 47.359 100.75 693 0.0000 28.295 12.918 3.5751 5.7160 3.1954 694 0.0000 30.202 34.494 5.3710 6.9533 11.053 695 19.300 46.826 51.010 12.838 16.406 24.291 696 27.759 61.226 59.022 20.839 28.094 33.971 697 55.362 73.630 64.270 36.282 44.773 42.321 698 0.0000 47.595 30.199 9.1405 15.156 10.258 699 0.0000 58.338 30.996 13.002 22.763 11.902 700 0.0000 64.236 55.112 18.835 29.104 30.261 701 38.914 76.772 71.518 34.010 45.977 51.969 702 46.603 22.121 30.726 11.304 8.2610 9.0623 703 71.548 26.263 29.926 23.492 15.393 9.4214 704 79.753 31.119 48.306 31.828 20.630 21.781 705 83.759 35.234 60.985 37.844 24.668 34.561 706 0.0000 11.374 23.161 2.2182 2.1833 5.2699 707 0.0000 16.454 32.382 3.3479 3.2481 9.3292 708 21.006 23.005 33.261 5.6307 5.4734 10.092 709 62.003 35.745 87.401 31.868 20.908 72.262 710 69.065 39.008 92.709 38.263 25.094 82.584 711 58.788 0.0000 78.075 23.653 11.498 55.398 712 62.408 0.0000 89.178 28.967 13.825 74.260 713 97.376 20.288 95.542 56.751 29.669 88.065 714 26.276 41.737 28.993 9.6603 12.962 9.2567 715 30.807 53.800 33.568 14.687 21.051 12.785 716 68.800 52.072 32.824 28.449 27.252 12.867 717 78.797 56.857 32.745 36.418 33.955 13.701 718 82.767 67.022 32.453 43.550 44.134 15.140 719 83.675 76.011 33.373 48.964 53.833 17.204 720 88.753 100.00 59.157 73.076 90.070 43.328 721 89.838 100.00 69.418 76.283 91.453 55.695 722 33.548 0.0000 11.559 4.9839 3.0280 2.3636 723 45.235 0.0000 17.067 8.4868 4.8092 3.6543 724 69.845 0.0000 16.320 19.609 10.548 3.9966 725 93.931 20.212 30.316 38.951 22.187 10.100 726 100.00 26.100 33.211 45.402 26.618 12.053 727 100.00 71.469 49.264 62.146 56.753 27.962 728 65.031 89.692 0.0000 44.197 64.328 10.949 729 0.0000 84.328 11.303 25.286 49.217 10.168 730 11.455 100.00 15.303 37.276 72.207 14.737 731 23.291 100.00 15.209 38.573 72.877 14.778 732 21.756 100.00 57.415 43.160 74.685 40.099 733 22.597 100.00 69.359 45.955 75.817 54.196 734 25.122 100.00 80.994 49.597 77.319 71.337 735 0.0000 86.843 60.465 32.508 54.743 40.070 736 0.0000 86.790 73.803 35.691 55.960 57.008 737 25.226 87.700 100.00 47.280 61.819 103.99 738 54.584 38.211 61.009 21.751 17.357 34.025 739 63.503 40.139 67.203 27.790 21.000 41.786 740 64.510 67.604 88.609 44.525 43.657 78.162 741 0.0000 44.631 72.238 15.524 16.305 48.210 742 13.134 45.762 100.00 25.770 20.999 97.246 743 24.789 53.953 100.00 29.853 27.076 98.204 744 81.684 26.607 56.373 33.839 20.381 29.043 745 84.943 29.698 71.300 40.096 23.963 47.101 746 92.204 35.395 71.501 46.994 29.148 48.013 747 17.145 0.0000 12.175 2.2620 1.6223 2.3406 748 56.385 0.0000 11.193 12.564 6.9374 2.6589 749 58.818 0.0000 21.998 14.159 7.7028 5.3178 750 66.841 25.037 77.126 29.256 17.100 54.735 751 53.181 0.0000 66.655 18.171 9.0229 39.291 752 69.910 0.0000 80.745 30.257 14.811 59.887 753 88.576 0.0000 87.064 45.068 22.211 71.221 754 91.471 25.543 91.967 51.008 27.864 81.024 755 12.948 0.0000 23.499 2.4270 1.6426 5.2717 756 36.947 34.999 25.733 10.112 10.866 7.4706 757 37.168 44.641 26.204 12.586 15.673 8.4527 758 58.413 50.651 29.767 22.344 23.422 10.958 759 66.578 50.602 23.042 25.917 25.299 8.4432 760 76.037 50.321 24.337 31.547 28.054 9.1349 761 100.00 50.265 35.287 51.322 38.111 15.088 762 82.809 0.0000 10.733 27.843 14.817 3.3026 763 90.625 0.0000 18.640 34.176 18.046 5.2623 764 94.934 23.840 39.052 41.181 23.892 15.137 765 62.835 0.0000 43.629 18.253 9.5656 16.710 766 73.046 24.934 58.363 28.262 17.096 30.757 767 77.143 34.372 67.546 34.546 22.526 42.161 768 23.647 0.0000 90.577 17.140 7.6704 76.285 769 26.834 20.823 90.157 18.782 10.412 75.945 770 55.734 22.556 100.00 31.410 16.800 96.139 771 15.863 94.195 66.748 39.996 66.145 49.285 772 12.575 100.00 77.263 46.978 76.097 65.398 773 59.150 100.00 78.219 59.269 82.403 67.430 774 72.509 100.00 81.340 67.391 86.481 72.728 775 90.899 100.00 89.243 83.092 94.276 87.058 776 0.0000 75.547 17.469 20.263 38.785 9.6923 777 15.318 76.105 33.328 22.569 40.303 15.959 778 66.058 82.601 27.078 41.121 55.657 15.021 779 36.303 62.101 18.847 18.122 27.823 8.0513 780 46.714 71.129 20.128 25.584 38.000 9.9863 781 55.743 93.624 28.449 43.730 68.139 17.873 782 8.2489 93.966 31.368 33.479 63.200 18.809 783 5.6787 95.144 70.141 40.848 67.543 53.906 784 93.518 20.351 21.808 37.975 21.781 6.7197 785 93.072 12.119 17.750 36.645 20.040 5.2827 786 93.745 41.350 18.745 41.830 29.481 7.0949 787 92.014 59.131 16.050 46.119 40.428 8.3054 788 91.766 71.870 18.913 51.949 52.171 10.988 789 32.856 68.122 71.053 27.808 36.024 49.740 790 35.439 72.015 79.382 32.711 41.199 62.686 791 81.055 23.451 65.291 34.840 20.013 38.849 792 80.374 32.179 95.021 44.819 26.193 86.983 793 49.299 43.501 70.399 23.205 19.852 45.976 794 59.072 47.731 69.972 28.423 24.389 46.005 795 7.7135 69.242 61.482 22.767 34.505 37.813 796 16.137 80.966 72.687 32.581 48.872 54.224 797 52.066 82.939 73.519 42.657 55.855 56.216 798 71.710 22.248 10.850 21.941 13.904 3.4554 799 79.871 21.903 19.826 27.540 16.685 5.6807 800 83.101 27.947 25.238 31.029 19.712 7.8867 801 66.637 39.302 24.717 22.818 18.874 7.9623 802 68.847 47.739 42.370 28.169 24.876 18.240 803 70.535 58.245 44.177 33.103 32.895 20.835 804 93.673 63.064 51.132 52.799 45.923 27.992 805 75.652 43.370 17.923 28.818 23.575 6.4219 806 83.688 48.483 18.130 35.867 29.444 7.2374 807 92.186 50.618 19.492 43.291 34.290 8.1539 808 42.608 14.656 19.724 8.4443 5.7608 4.5487 809 65.085 17.113 48.515 21.025 12.214 20.900 810 95.741 20.702 52.329 43.458 24.260 25.387 811 6.7065 83.797 42.765 27.695 49.663 23.329 812 24.452 84.603 49.557 30.987 52.011 28.939 813 39.615 84.548 62.486 36.751 54.644 42.108 814 25.473 14.258 31.016 5.1914 3.9421 8.6899 815 29.427 20.209 37.912 7.1924 5.7213 12.707 816 37.946 24.614 39.581 9.9250 7.9260 14.042 817 60.034 70.066 47.600 33.357 40.874 25.028 818 67.891 100.00 57.254 58.631 82.666 40.658 819 11.938 85.904 0.0000 26.638 51.462 9.3904 820 24.509 90.516 15.497 31.611 58.654 12.462 821 37.255 92.230 27.441 36.232 62.771 16.802 822 68.710 57.100 6.2603 28.760 30.317 5.6810 823 80.931 63.118 23.526 39.721 39.586 10.641 824 91.689 64.108 24.222 48.438 44.730 11.423 825 50.038 25.221 80.335 22.479 13.535 59.394 826 62.236 27.869 91.835 32.062 18.629 79.988 827 69.590 58.172 100.00 47.462 38.528 99.487 828 7.7191 52.442 73.796 18.689 21.550 51.252 829 22.619 65.624 90.197 30.594 35.021 80.147 830 56.851 84.970 91.841 51.771 61.810 87.296 831 0.0000 11.477 67.940 8.9332 4.8790 40.607 832 60.940 8.1010 92.742 29.779 14.482 81.046 833 69.228 6.0505 94.859 34.873 16.891 85.388 834 70.226 20.404 96.940 37.292 19.593 89.979 835 87.076 17.998 95.757 47.996 24.788 88.018 836 45.002 10.367 81.930 19.728 9.8967 61.416 837 48.837 18.485 89.682 24.278 12.889 75.254 838 75.954 8.6380 89.694 37.195 18.470 75.673 839 85.025 14.716 89.243 43.754 22.443 75.265 840 95.125 11.540 93.066 53.074 26.755 82.814 841 12.012 44.805 56.470 12.519 15.246 29.272 842 14.777 57.631 70.828 20.322 25.333 47.765 843 19.218 63.239 79.428 25.536 31.217 61.209 844 8.1975 28.000 91.027 17.998 11.443 77.812 845 16.275 38.890 99.523 24.036 17.413 95.631 846 20.935 27.993 60.899 10.611 8.6215 32.802 847 68.046 44.764 60.975 30.048 24.162 34.863 848 90.062 53.538 66.408 49.112 38.028 42.952 849 93.121 54.995 83.975 57.083 42.356 69.120 850 45.551 25.398 46.532 13.286 9.7136 19.211 851 61.695 52.102 48.885 26.758 26.156 23.599 852 71.194 53.401 50.817 32.696 29.857 25.670 853 76.599 55.229 58.449 38.147 33.491 33.492 854 87.058 55.049 58.430 45.534 37.202 33.799 855 95.075 60.893 67.035 56.327 45.977 44.892 856 64.680 30.580 8.4281 19.184 14.361 3.3478 857 85.301 64.141 11.032 42.758 41.897 7.7912 858 96.214 69.050 11.111 53.999 51.137 8.9952 859 63.718 17.297 18.597 17.261 10.654 4.7148 860 64.431 17.776 29.304 18.409 11.229 8.6010 861 75.718 33.548 33.674 27.711 19.418 11.839 862 82.892 61.369 63.117 45.921 41.015 39.726 863 0.0000 65.719 11.112 14.999 28.656 6.7101 864 12.704 68.974 19.646 17.523 32.233 9.1578 865 16.285 84.222 19.024 26.465 49.687 11.881 866 73.953 86.550 18.457 47.706 62.901 13.159 867 78.750 88.527 29.058 52.883 67.469 17.531 868 85.093 88.930 58.473 61.841 72.018 39.706 869 92.046 94.213 58.517 71.138 82.431 41.274 870 21.497 45.836 18.963 9.3699 14.580 5.9882 871 25.629 65.170 34.027 18.410 29.867 14.536 872 30.598 90.630 34.246 34.151 59.927 19.627 873 23.350 91.621 41.200 34.373 60.996 24.074 874 32.544 92.178 45.858 37.135 62.940 27.701 875 20.904 53.968 25.714 12.375 20.028 9.1129 876 39.787 54.972 26.710 16.712 22.799 9.8140 877 54.301 63.183 39.547 26.410 32.590 17.913 878 73.399 63.172 60.975 39.862 39.105 37.231 879 43.249 40.007 18.525 12.620 13.917 5.5697 880 58.995 44.169 21.502 20.017 19.343 7.0974 881 79.487 44.165 29.709 32.388 25.650 10.832 882 85.060 49.080 90.204 50.727 35.808 79.253 883 94.654 52.889 95.135 61.556 43.081 89.588 884 44.524 28.049 63.159 16.449 11.588 35.647 885 65.473 28.785 62.636 25.412 16.403 35.496 886 68.449 52.322 73.112 35.586 30.222 51.064 887 78.016 56.928 94.247 49.974 39.360 87.718 888 14.554 14.992 26.990 3.5111 3.2017 6.8400 889 14.175 24.870 40.654 5.9656 5.9222 14.571 890 40.212 57.641 62.828 23.114 27.001 37.886 891 53.770 63.181 76.383 33.598 35.439 56.929 892 16.597 33.342 40.916 7.6674 8.9256 15.237 893 18.424 43.513 42.234 10.447 13.909 16.961 894 22.160 55.938 50.936 16.297 22.781 25.273 895 61.669 87.299 84.537 53.056 65.049 74.668 896 71.086 90.333 89.557 61.957 72.542 84.554 897 82.371 100.00 91.914 77.491 91.277 91.769 898 15.513 39.095 29.433 7.5914 10.906 9.1667 899 17.604 47.971 30.786 10.376 15.960 10.626 900 16.016 56.382 60.700 17.579 23.477 35.081 901 19.537 72.621 92.528 34.491 42.084 85.714 902 18.976 81.051 93.651 39.638 51.814 89.498 903 85.363 91.999 100.00 76.701 81.449 106.23 904 30.242 39.528 18.519 9.1401 11.947 5.3711 905 45.071 61.873 19.685 20.633 28.967 8.3749 906 53.056 64.730 24.129 25.120 33.126 10.377 907 53.887 69.551 83.469 38.788 42.316 69.223 908 29.973 7.5284 92.832 19.313 9.0434 80.720 909 35.276 27.558 92.367 22.279 13.489 80.527 910 13.237 23.438 96.094 19.557 11.036 87.541 911 12.342 32.236 100.00 22.447 14.447 96.157 912 12.218 0.0000 84.744 13.848 6.2038 65.728 913 16.823 23.097 86.865 16.514 9.7870 69.973 914 82.828 26.453 87.799 42.978 24.094 73.006 915 40.522 14.713 28.634 8.4379 5.6932 7.7595 916 43.892 41.449 31.114 14.088 15.112 10.425 917 19.154 74.644 15.960 20.942 38.402 9.2197 918 27.731 76.014 20.239 23.221 40.681 10.661 919 44.722 80.031 22.683 30.025 47.635 12.417 920 41.365 93.070 68.242 44.468 67.177 51.149 921 48.298 100.00 73.249 53.373 79.525 59.838 922 45.822 60.326 43.198 22.451 28.676 19.865 923 68.601 62.407 52.141 34.976 36.286 27.982 924 76.740 66.954 52.842 42.138 43.037 29.555 925 60.256 49.992 9.6607 21.874 22.986 5.0350 926 65.803 56.546 15.584 27.223 29.175 7.0224 927 69.714 59.296 25.969 31.095 32.714 10.675 928 41.617 26.202 83.924 20.894 12.800 65.236 929 52.903 33.719 90.599 28.455 18.392 77.799 930 7.2006 59.046 57.966 17.419 25.015 32.439 931 43.520 67.064 80.221 32.766 37.525 63.302 932 47.147 75.120 93.225 42.505 48.192 87.818 933 61.652 74.688 94.204 48.740 51.011 89.947 934 6.6661 35.247 30.152 6.1610 8.8655 9.1790 935 90.246 44.113 29.571 40.411 29.767 11.141 936 93.730 66.938 40.211 53.009 48.851 20.085 937 29.191 7.6134 50.837 8.0320 4.5197 22.096 938 29.612 18.233 57.283 10.041 6.5311 28.551 939 67.857 17.223 57.548 24.154 13.656 29.457 940 91.561 19.286 68.708 43.202 23.496 43.388 941 92.746 24.738 76.441 46.922 26.169 54.525 942 88.892 7.2229 25.116 33.401 17.928 7.3713 943 88.291 17.034 35.637 34.522 19.361 12.552 944 90.219 16.146 44.466 37.092 20.439 18.436 945 54.988 21.567 26.717 14.134 9.6593 7.4161 946 57.773 23.107 35.417 16.355 10.997 11.769 947 77.879 22.154 47.818 29.110 17.205 20.861 948 13.976 34.359 0.0000 5.1318 8.2119 2.1745 949 13.188 35.455 12.386 5.5479 8.7391 3.5784 950 22.177 36.312 34.714 8.2512 10.234 11.656 951 69.625 59.612 81.617 41.480 37.068 65.004 952 81.379 63.879 89.128 53.333 45.607 79.021 953 27.192 73.173 9.8443 21.137 37.347 7.8720 954 48.796 87.383 13.645 35.669 57.547 11.648 955 70.531 93.058 11.862 49.906 70.815 13.133 956 72.408 94.939 20.836 52.827 74.346 15.780 957 11.968 58.490 0.0000 12.209 22.606 4.5803 958 46.626 59.332 52.534 23.780 28.584 27.446 959 55.923 64.962 68.154 33.131 36.639 45.739 960 62.264 75.544 71.106 42.204 49.190 51.595 961 77.595 7.9016 68.998 32.026 16.472 43.000 962 100.00 12.296 86.397 55.156 28.172 70.662 963 41.273 76.876 13.768 26.650 43.207 9.3793 964 57.562 84.243 23.010 37.662 55.453 13.634 965 84.487 93.149 23.934 59.845 75.969 16.749 966 94.977 95.180 49.946 72.781 84.536 33.351 967 5.9784 12.225 61.092 7.6119 4.4506 32.371 968 6.7498 27.274 72.603 12.058 8.8739 47.467 969 11.321 66.838 95.660 31.969 36.342 90.896 970 79.676 19.419 6.3105 26.633 15.852 3.0058 971 90.924 29.128 5.8805 36.430 22.883 3.8055 972 93.527 32.834 40.535 41.634 26.296 16.545 973 86.662 11.508 67.721 38.401 20.082 41.709 974 92.620 13.665 78.259 46.170 23.978 56.905 975 95.876 19.150 84.343 51.338 27.152 67.114 976 26.980 9.4132 22.944 4.5083 3.2000 5.2714 977 32.846 51.781 84.456 24.964 24.078 68.101 978 53.780 94.262 92.746 57.258 74.211 91.135 979 9.3080 87.544 71.366 35.914 56.903 53.769 980 10.129 88.042 87.790 41.247 59.581 79.931 981 12.824 89.002 100.00 46.667 62.823 104.22 982 69.220 48.296 14.033 26.185 24.386 5.8235 983 69.113 66.597 18.943 33.514 38.776 9.3812 984 75.038 71.022 30.578 40.101 45.315 14.628 985 63.082 64.197 8.2566 28.749 34.721 6.7528 986 78.096 69.009 17.208 40.171 43.950 9.5756 987 84.092 72.411 23.498 46.491 49.747 12.236 988 89.811 81.249 21.645 55.820 62.038 13.499 989 41.335 71.391 30.648 24.753 37.684 13.996 990 48.934 79.353 31.371 31.767 47.853 15.939 991 7.8055 68.039 27.471 17.270 31.361 11.750 992 21.881 74.390 42.787 23.508 39.248 21.555 993 26.005 84.304 79.823 38.036 54.552 65.678 994 24.983 93.135 86.140 45.946 67.410 78.271 995 32.260 14.077 76.935 14.975 7.9845 53.439 996 43.830 17.759 76.386 18.255 10.166 52.863 997 15.801 76.910 24.203 22.302 40.930 12.059 998 22.663 92.270 27.774 33.331 61.315 16.814 999 19.018 92.849 74.799 41.428 65.170 59.920 1000 48.493 93.380 78.176 49.733 69.919 65.456 1001 22.554 58.904 39.403 15.830 24.454 16.806 1002 31.357 60.588 45.528 18.921 26.980 21.463 1003 46.624 32.111 8.3254 11.632 10.887 3.0622 1004 52.378 34.197 20.092 14.653 13.002 5.7263 1005 70.532 43.041 32.838 26.671 22.209 11.995 1006 86.723 51.804 31.892 40.231 33.201 12.922 1007 95.261 5.4359 31.099 39.128 20.724 10.182 1008 100.00 12.501 35.596 44.198 23.812 12.878 1009 51.807 15.864 19.770 11.783 7.6304 4.7467 1010 51.284 41.004 53.171 19.561 17.422 26.106 1011 57.349 40.462 75.008 26.939 20.447 52.355 1012 88.776 22.908 60.965 39.585 22.467 34.022 1013 95.159 27.158 66.438 46.729 26.903 40.968 1014 94.175 73.027 88.023 67.440 59.578 78.968 1015 100.00 80.919 92.418 78.706 71.890 88.926 1016 30.767 22.360 9.9359 5.7747 5.5926 2.5648 1017 38.765 30.902 17.816 9.3096 9.3165 4.6694 1018 47.985 50.655 24.493 17.665 21.060 8.5729 1019 50.687 70.613 48.269 29.718 39.398 25.484 1020 23.669 67.412 48.166 20.982 32.544 24.536 1021 49.349 76.932 56.054 33.983 46.503 33.756 1022 8.0348 54.353 39.813 12.731 20.258 16.426 1023 48.775 54.805 66.686 25.721 26.642 42.333 1024 56.105 55.810 71.666 30.287 29.407 49.170 1025 14.001 11.556 0.0000 2.1565 2.2589 1.1821 1026 38.831 11.887 0.0000 6.5641 4.5627 1.3947 1027 48.672 24.752 18.676 11.533 8.9918 4.7170 1028 68.641 43.045 52.013 28.174 22.685 25.598 1029 81.956 57.106 51.761 41.272 36.306 27.309 1030 94.912 70.295 55.896 58.147 53.662 33.707 1031 94.246 78.091 62.085 63.076 62.351 41.749 1032 48.987 48.053 60.676 22.152 21.554 34.443 1033 58.198 49.886 61.123 26.635 24.723 35.316 1034 63.526 55.529 66.992 32.530 30.543 43.112 1035 16.634 72.059 53.247 23.266 37.083 29.778 1036 18.832 81.094 55.447 29.038 47.614 33.627 1037 30.401 85.870 57.972 34.423 54.832 37.305 1038 16.996 77.297 63.556 28.256 43.680 41.686 1039 23.316 85.191 66.681 34.627 54.057 47.150 1040 52.162 93.968 67.295 48.653 70.343 50.329 1041 30.581 99.272 7.3243 39.044 72.282 13.352 1042 36.200 100.00 13.464 41.096 74.186 14.539 1043 6.5770 84.986 27.212 26.794 50.527 14.840 1044 16.217 90.580 47.083 33.566 59.384 28.171 1045 16.727 90.187 82.230 41.461 62.104 70.844 1046 23.096 14.387 94.309 19.069 9.4648 83.698 1047 33.421 12.002 100.00 23.075 11.020 95.462 1048 11.832 0.0000 53.264 5.9225 3.0306 24.134 1049 29.523 16.253 68.081 12.221 7.1031 41.044 1050 37.492 25.702 75.474 17.108 11.033 51.738 1051 75.757 28.384 16.683 25.562 17.056 5.0256 1052 82.142 94.003 14.906 58.275 76.151 14.307 1053 93.739 94.284 16.730 67.654 81.288 15.218 1054 14.445 58.354 21.534 13.040 22.875 8.1569 1055 15.824 64.245 43.416 17.818 28.805 20.292 1056 19.472 64.980 61.058 21.648 30.918 36.702 1057 90.622 64.697 60.587 52.789 46.795 37.603 1058 92.877 64.654 82.052 60.245 49.962 67.217 1059 24.353 17.287 45.845 7.0414 5.0758 18.106 1060 33.303 45.654 48.019 14.439 16.772 21.715 1061 41.796 51.028 55.884 19.744 21.855 29.579 1062 96.743 23.396 9.3510 40.614 23.755 4.1533 1063 100.00 31.572 10.817 44.910 27.887 4.9395 1064 100.00 62.306 11.724 54.315 46.650 8.2133 1065 11.888 35.364 89.897 19.210 14.160 76.164 1066 20.065 39.461 90.377 21.137 16.524 77.411 1067 91.327 42.513 91.614 54.234 34.696 81.502 1068 51.562 8.9470 52.471 14.888 8.1142 23.905 1069 51.355 11.310 70.833 18.911 9.9241 44.872 1070 57.817 17.051 74.342 23.019 12.589 50.078 1071 64.752 16.017 82.296 28.667 15.092 62.551 1072 14.865 38.351 49.371 9.8152 11.504 22.076 1073 17.231 48.291 63.419 15.488 18.160 37.271 1074 17.521 55.546 93.977 27.101 26.798 85.967 1075 29.992 55.127 92.865 28.463 27.316 83.829 1076 13.167 0.0000 37.959 3.7662 2.1803 12.232 1077 40.469 15.512 38.008 9.4292 6.1925 12.739 1078 50.207 18.922 40.012 13.251 8.6098 14.280 1079 60.887 25.001 44.649 19.233 12.728 18.026 1080 72.496 24.956 68.764 30.267 17.864 43.055 1081 80.710 26.120 78.672 38.506 22.051 57.576 1082 54.155 77.667 16.375 31.808 46.528 10.312 1083 64.226 85.377 15.992 41.253 58.439 12.025 1084 93.069 85.841 53.671 65.200 70.767 34.472 1085 93.510 87.581 72.420 70.908 74.950 56.866 1086 40.505 11.983 57.881 12.305 6.9236 29.128 1087 52.856 28.204 58.291 18.490 12.797 30.366 1088 50.788 67.827 56.856 29.887 37.256 32.999 1089 60.164 69.250 56.757 34.610 40.729 33.320 1090 85.692 47.531 70.798 44.784 32.708 47.860 1091 93.664 49.335 76.444 53.297 37.764 56.431 1092 68.143 6.2071 27.462 19.507 10.684 7.6372 1093 84.254 17.101 27.734 30.696 17.484 8.4751 1094 94.734 89.016 23.210 65.089 74.312 15.899 1095 61.536 72.854 7.9291 32.216 42.812 8.0925 1096 70.608 77.004 19.643 39.843 50.087 11.428 1097 80.462 13.800 42.532 29.280 16.160 16.613 1098 87.201 25.498 42.732 35.539 21.272 17.412 1099 87.765 36.342 52.861 39.537 26.080 26.436 1100 62.051 7.8340 50.643 19.185 10.288 22.451 1101 65.608 17.499 67.952 25.250 13.995 41.523 1102 73.928 17.597 74.669 31.829 17.198 50.977 1103 79.695 20.566 93.156 41.893 22.159 82.692 1104 55.508 18.328 82.996 24.684 13.334 63.581 1105 68.114 24.153 86.017 32.602 18.323 69.282 1106 86.854 57.388 92.502 55.868 42.739 84.664 1107 87.409 69.621 92.000 61.556 53.769 85.531 1108 89.447 89.294 8.8670 60.241 72.172 12.401 1109 96.548 94.134 5.9569 69.646 82.188 13.511 1110 50.475 41.783 24.792 15.973 16.273 7.8486 1111 60.209 41.843 31.759 20.750 18.693 11.081 1112 67.809 53.149 59.331 32.249 29.309 33.937 1113 16.528 23.657 72.046 12.105 8.1377 46.546 1114 16.396 32.218 81.335 16.136 11.960 61.034 1115 42.226 35.383 82.235 22.203 16.005 62.968 1116 15.918 29.266 53.250 8.7403 8.1438 24.959 1117 25.099 45.203 66.192 16.265 17.106 40.375 1118 83.392 90.923 67.965 64.095 75.006 51.270 1119 17.453 93.095 20.112 32.744 61.965 14.230 1120 10.788 100.00 61.903 42.964 74.477 44.941 1121 10.199 15.989 100.00 20.070 9.9193 95.408 1122 55.763 10.508 100.00 30.332 14.626 95.776 1123 82.171 30.580 10.135 30.062 19.964 4.0888 1124 83.567 39.985 10.293 33.083 24.497 4.8280 1125 98.517 47.339 27.752 48.320 35.265 10.987 1126 88.405 19.136 84.347 45.110 23.939 66.828 1127 92.606 28.957 84.395 49.881 28.378 67.516 1128 21.956 25.740 14.496 4.8519 5.7795 3.4501 1129 22.545 39.976 72.361 16.017 14.718 48.048 1130 45.602 66.696 89.341 36.254 38.719 78.982 1131 53.620 66.971 94.600 41.300 41.293 89.245 1132 34.339 15.903 48.998 9.3750 6.0372 20.727 1133 73.815 14.176 49.776 26.006 14.389 22.127 1134 76.863 15.206 61.966 30.361 16.487 34.484 1135 68.382 72.871 60.713 41.555 46.980 38.370 1136 68.222 93.055 62.014 54.463 72.480 44.077 1137 97.210 93.080 62.547 75.610 83.398 45.682 1138 28.840 53.024 14.681 12.706 19.771 5.7759 1139 28.535 58.608 22.919 15.182 24.121 8.7390 1140 41.478 65.711 60.198 26.376 33.878 36.072 1141 10.562 20.694 79.424 13.313 7.9759 57.360 1142 27.897 28.913 87.734 19.273 12.457 71.890 1143 29.183 36.765 91.400 22.341 16.167 79.199 1144 22.854 17.209 78.477 13.966 7.8072 55.815 1145 22.846 38.934 81.237 18.356 15.252 61.394 1146 21.025 47.442 77.260 19.232 19.289 55.888 1147 21.737 48.008 89.444 23.401 21.247 76.474 1148 84.647 9.9508 59.456 34.925 18.369 31.819 1149 93.059 14.993 58.047 41.665 22.384 30.740 1150 94.002 33.211 58.793 45.115 27.854 32.402 1151 35.697 22.534 30.179 8.0703 6.6759 8.6682 1152 39.000 23.373 56.605 12.733 8.8136 28.156 1153 49.799 22.809 70.183 19.223 11.700 44.323 1154 59.799 25.403 70.466 23.895 14.624 45.020 1155 61.322 92.044 75.142 53.355 70.443 60.810 1156 6.1336 53.417 65.966 16.969 21.403 40.887 1157 22.733 53.599 69.301 19.367 22.642 45.256 1158 22.991 63.010 70.421 23.440 30.276 48.006 1159 22.678 72.514 81.005 30.974 40.636 65.254 1160 10.303 74.001 89.517 33.284 42.683 80.227 1161 6.3893 81.537 90.865 37.909 51.481 84.188 1162 0.0000 14.793 12.337 1.9284 2.4552 2.5474 1163 15.100 21.127 48.100 6.6285 5.4248 20.003 1164 24.265 26.145 50.591 8.8507 7.5146 22.414 1165 41.759 48.637 67.887 21.560 21.331 43.049 1166 31.091 42.508 55.253 14.319 15.258 27.965 1167 42.097 42.225 56.362 17.283 16.651 29.183 1168 52.456 49.664 79.159 28.703 25.149 59.449 1169 8.1074 17.261 87.187 15.289 8.1771 70.298 1170 9.6623 6.7829 89.919 15.634 7.2226 75.053 1171 18.391 5.0481 93.441 17.616 8.0046 81.791 1172 33.376 18.312 94.897 21.580 11.252 85.076 1173 55.352 59.136 9.6415 22.994 28.534 6.0443 1174 54.197 76.613 4.3241 30.872 45.190 8.2710 1175 81.063 92.681 38.703 58.405 74.560 23.789 1176 86.002 92.813 46.298 63.145 77.027 29.395 1177 67.144 8.7105 37.212 20.003 10.990 12.623 1178 68.879 18.419 39.287 21.938 13.023 14.203 1179 76.429 39.346 49.785 31.588 23.076 23.518 1180 92.718 43.086 65.674 47.845 32.522 41.047 1181 69.374 9.1257 72.220 27.821 14.294 47.149 1182 71.108 8.6098 82.652 31.837 15.977 63.143 1183 76.357 20.648 84.425 36.633 19.811 66.610 1184 80.556 40.718 85.441 43.438 28.683 69.709 1185 50.126 6.6341 23.314 10.777 6.2422 5.6556 1186 58.239 10.129 29.984 14.852 8.5282 8.5778 1187 86.778 6.5945 75.385 40.250 20.435 52.204 1188 94.203 4.8878 80.796 47.821 24.066 60.832 1189 70.494 7.8614 60.076 25.537 13.360 32.022 1190 72.689 51.386 85.231 41.379 32.313 70.156 1191 7.6160 7.6448 98.164 18.647 8.4716 91.339 1192 2.0319 20.371 92.900 17.397 9.5063 81.042 1193 6.6279 44.200 92.889 22.157 18.790 82.563 1194 6.9231 94.129 95.032 48.017 69.200 95.136 1195 75.298 2.8062 12.286 22.851 12.352 3.3468 1196 78.918 7.9764 22.110 25.882 14.123 5.9762 1197 86.076 8.7141 33.007 31.949 17.201 10.837 1198 6.6944 7.3581 28.858 2.6668 2.0558 7.4600 1199 8.6653 8.9628 38.027 3.7650 2.6247 12.360 1200 6.6390 42.592 46.478 9.8691 13.169 20.016 1201 8.5637 49.975 51.589 12.987 17.942 25.098 1202 7.8051 64.552 68.191 22.089 30.667 45.215 1203 7.8707 71.112 80.462 28.646 38.371 64.067 1204 16.987 79.299 81.207 34.120 47.894 66.816 1205 18.623 85.467 88.266 40.457 56.604 80.254 1206 7.0075 5.6908 73.133 10.234 4.9809 47.556 1207 10.719 39.072 79.779 16.658 14.477 58.999 1208 70.102 78.704 82.341 51.474 56.280 69.374 1209 76.111 84.077 89.999 61.027 65.804 84.119 1210 34.376 33.869 6.9990 8.3833 9.7274 2.8560 1211 40.996 41.048 9.5935 11.851 13.949 3.8091 1212 38.145 54.074 8.8864 15.042 21.554 5.0131 1213 34.736 62.846 7.7665 17.652 28.109 6.0022 1214 36.753 69.892 14.615 21.683 35.084 8.2452 1215 35.598 82.708 18.657 28.809 49.472 11.616 1216 42.223 91.770 18.059 36.707 62.593 13.573 1217 54.891 93.706 17.889 42.730 67.794 14.216 1218 7.6168 43.713 4.3489 7.0132 12.521 3.2235 1219 17.825 61.772 13.262 14.399 25.721 6.5513 1220 12.780 71.746 9.0793 18.519 34.882 7.4283 1221 35.567 73.791 6.6526 23.182 38.902 7.6716 1222 18.748 44.187 9.3762 8.1711 13.303 3.8480 1223 52.187 44.775 36.599 18.537 18.685 13.821 1224 78.927 50.173 39.007 34.806 29.501 16.528 1225 93.053 51.034 40.166 45.989 35.676 17.882 1226 49.881 7.6599 61.603 15.967 8.3747 33.263 1227 53.708 7.0872 79.339 22.014 10.929 57.339 1228 63.159 7.6825 78.876 26.257 13.171 56.823 1229 69.092 14.027 90.753 33.726 17.132 77.567 1230 10.112 89.390 53.345 33.272 57.874 33.357 1231 17.912 92.355 57.347 36.813 62.735 38.056 1232 76.998 91.566 60.831 58.483 72.981 42.629 1233 44.859 6.9531 11.165 8.3439 5.0733 2.5170 1234 55.141 11.863 11.671 12.505 7.5970 2.8681 1235 50.343 9.5890 4.0894 10.259 6.2610 1.8245 1236 79.828 8.1576 6.3170 25.890 14.212 2.7289 1237 92.838 6.3535 5.5432 35.757 19.188 3.0965 1238 93.881 4.1481 12.637 36.751 19.572 4.0712 1239 99.195 5.9949 18.461 41.769 22.219 5.6197 1240 96.046 13.346 5.9399 38.908 21.377 3.3899 1241 95.054 78.937 5.7773 58.216 61.281 10.060 1242 15.700 15.311 67.890 10.067 5.8780 40.676 1243 35.295 19.263 84.425 18.448 10.208 65.716 1244 40.274 43.675 90.048 26.261 20.807 77.356 1245 5.4724 79.495 57.317 27.405 45.299 35.155 1246 4.8731 93.310 59.018 36.900 63.776 40.009 1247 42.476 94.621 92.633 53.408 72.629 90.815 1248 13.160 28.529 19.756 4.5595 6.2452 4.8559 1249 49.719 35.257 32.317 14.769 13.284 10.632 1250 58.791 43.748 43.614 21.978 19.929 18.504 1251 77.195 47.632 53.252 34.968 28.136 27.439 1252 50.841 44.327 13.467 16.202 17.487 4.9062 1253 77.052 56.163 16.550 33.838 32.364 7.5128 1254 82.993 55.215 8.4581 37.317 33.661 6.1220 1255 86.707 56.443 23.414 41.217 36.282 9.8854 1256 96.341 53.722 8.4590 47.508 38.106 6.4435 1257 71.069 35.531 16.570 24.008 18.262 5.3133 1258 80.819 79.702 66.292 54.520 59.238 46.617 1259 86.208 80.433 73.859 60.834 62.922 57.108 1260 34.080 7.3816 63.175 11.488 6.0077 34.849 1261 35.416 5.6570 73.793 14.371 7.0918 48.684 1262 83.170 2.3835 82.703 39.599 19.653 63.529 1263 89.032 8.5180 85.744 45.266 22.779 69.000 1264 8.5810 4.2971 18.339 1.9463 1.6048 3.7056 1265 18.543 5.4506 29.976 3.6346 2.4360 7.9892 1266 25.171 6.9333 39.919 5.6788 3.4492 13.622 1267 34.231 9.0071 41.342 7.7670 4.6439 14.695 1268 60.360 6.5591 68.615 22.031 11.246 42.018 1269 79.609 11.217 79.421 36.427 18.670 58.203 1270 70.579 8.5704 5.5854 19.991 11.200 2.3888 1271 75.448 13.575 13.781 23.507 13.436 3.8009 1272 78.156 25.548 39.278 28.562 17.737 14.759 1273 84.338 34.933 41.903 34.928 23.449 17.281 1274 88.398 17.714 9.9711 32.985 18.860 3.6976 1275 87.805 25.135 16.160 33.625 20.477 5.1378 1276 92.369 39.704 46.608 43.017 29.157 21.459 1277 44.622 51.264 34.195 17.553 21.208 13.000 1278 44.315 54.394 75.347 26.277 26.445 54.044 1279 49.071 59.107 82.740 31.945 31.805 66.338 1280 56.597 60.937 88.084 37.516 35.596 76.026 1281 5.1345 11.197 16.808 2.0191 2.1055 3.4099 1282 8.6884 19.576 34.858 4.2375 4.1342 10.770 1283 11.055 29.462 61.569 10.005 8.6557 33.593 1284 13.768 38.181 61.835 12.038 12.318 34.495 1285 81.205 45.221 61.254 38.560 28.738 35.610 1286 6.0921 94.955 6.8100 32.784 64.092 12.045 1287 18.966 94.996 6.7017 33.833 64.678 12.091 1288 43.201 96.073 8.0701 39.841 68.985 12.760 1289 53.706 95.811 4.9802 43.401 70.531 12.555 1290 5.9693 61.702 89.776 27.186 30.684 78.709 1291 27.451 75.213 89.144 35.889 45.027 79.857 1292 48.287 83.409 93.682 47.997 58.300 90.369 1293 47.226 77.989 7.9987 29.048 45.413 8.7697 1294 57.001 84.868 8.5820 37.182 55.877 10.433 1295 63.346 93.310 7.6859 46.034 69.106 12.412 1296 8.4030 78.563 4.4235 21.903 42.234 8.1805 1297 17.854 81.593 7.1394 24.552 46.297 9.0786 1298 25.573 81.729 12.348 25.855 47.076 9.9025 1299 12.021 88.573 8.7456 28.585 55.112 10.759 1300 27.454 88.406 7.4239 30.392 55.877 10.652 1301 34.773 92.386 8.3757 34.764 62.292 11.773 1302 37.176 93.606 55.495 40.922 66.254 36.647 1303 7.2149 30.015 7.2374 3.9620 6.3667 2.4662 1304 23.034 35.992 7.6797 6.6618 9.5007 2.9790 1305 56.916 41.282 6.2084 17.705 17.066 3.7003 1306 67.618 41.200 7.9600 23.072 19.797 4.1352 1307 93.975 40.538 6.2873 41.387 28.995 4.7634 1308 93.258 62.089 5.4899 48.085 43.316 7.0998 1309 11.286 80.390 49.879 26.914 45.998 28.270 1310 11.143 85.761 62.548 32.725 53.739 42.217 1311 7.8630 20.864 62.999 8.8948 6.2218 34.822 1312 9.5114 35.894 70.525 13.268 11.948 45.144 1313 11.308 46.919 86.104 20.838 19.562 70.293 1314 11.693 55.615 86.428 23.917 25.505 71.846 1315 3.6277 8.4669 80.894 12.455 6.0366 59.372 1316 6.2129 28.854 81.392 14.823 10.387 60.893 1317 42.057 54.151 86.219 28.814 27.236 71.556 1318 48.920 10.784 32.488 11.276 6.7132 9.6345 1319 59.201 14.901 39.187 16.589 9.7931 13.798 1320 28.774 12.199 14.429 4.5638 3.5237 3.0160 1321 42.202 30.808 36.045 11.723 10.370 12.252 1322 49.130 82.062 64.468 38.721 53.273 44.070 1323 57.957 87.112 67.769 46.402 61.983 49.438 1324 23.980 56.512 86.358 25.623 26.891 71.900 1325 38.481 62.167 92.121 33.029 33.896 83.430 1326 6.0206 18.924 44.457 5.2290 4.4053 17.013 1327 8.1625 21.901 54.147 7.2425 5.7597 25.430 1328 36.059 49.945 93.324 28.201 24.478 84.186 1329 47.032 56.367 94.459 34.195 30.895 87.334 1330 16.362 6.4072 72.564 10.797 5.3276 46.794 1331 21.041 8.0952 79.052 13.253 6.4870 56.493 1332 38.036 6.5636 86.984 19.103 9.1157 69.918 1333 42.112 12.548 92.042 22.365 11.062 79.433 1334 58.514 53.067 91.449 36.522 30.424 81.296 1335 69.019 60.678 91.322 44.831 39.074 82.289 1336 17.453 13.828 39.288 4.9390 3.6611 13.293 1337 89.188 44.644 55.999 43.332 31.076 30.231 1338 94.877 51.355 57.342 50.416 37.800 32.521 1339 46.207 18.649 9.7271 9.5742 6.9275 2.5924 1340 53.814 24.047 10.774 13.121 9.7036 3.0971 1341 78.630 72.220 7.6639 41.841 47.279 8.4167 1342 87.367 75.107 10.708 49.822 53.693 9.6452 1343 93.470 79.160 36.918 58.910 61.612 20.170 1344 79.710 79.790 20.591 47.332 56.359 12.523 1345 80.894 81.678 40.147 51.070 59.782 22.255 1346 88.775 83.479 45.093 58.759 65.342 26.436 1347 18.509 27.636 6.8316 4.4709 6.0393 2.3324 1348 30.198 30.815 15.332 7.1331 8.1840 3.9728 1349 33.246 44.990 35.367 12.563 15.712 12.851 1350 57.675 60.604 48.204 27.990 31.618 24.020 1351 85.250 65.374 50.269 46.943 44.467 27.258 1352 23.494 5.6813 8.6541 3.1457 2.3302 1.8989 1353 38.283 7.0327 22.019 6.8702 4.2608 5.0442 1354 45.015 6.2207 39.688 10.489 5.8919 13.689 1355 45.155 14.593 47.008 12.029 7.2811 19.187 1356 54.346 17.777 49.245 16.116 9.7632 21.300 1357 39.700 5.9338 50.262 10.379 5.6422 21.684 1358 47.552 19.156 58.353 15.279 9.3474 29.935 1359 56.418 19.005 62.663 19.693 11.495 34.881 1360 77.912 57.432 75.733 44.024 37.285 55.770 1361 84.551 65.429 81.737 53.900 47.229 66.508 1362 82.748 5.6951 94.807 43.593 21.371 85.689 1363 93.613 3.1016 94.315 51.879 25.550 85.087 1364 97.001 36.261 95.254 58.932 34.702 88.347 1365 59.039 20.876 3.6831 14.875 10.035 2.2802 1366 62.350 37.718 16.456 19.725 16.777 5.2252 1367 61.761 53.132 39.347 25.801 26.353 16.612 1368 49.578 61.238 62.084 27.515 31.469 37.659 1369 53.927 71.978 74.421 37.352 43.729 55.447 1370 58.346 80.231 79.214 45.304 54.557 64.337 1371 84.980 7.3720 14.765 29.810 16.152 4.1943 1372 85.221 15.265 18.922 30.672 17.300 5.3799 1373 88.414 42.901 38.448 39.525 28.709 15.773 1374 89.918 75.407 80.805 62.846 59.402 66.876 1375 7.2174 9.9233 51.657 5.7102 3.4742 22.750 1376 7.6459 14.882 72.525 10.624 5.9762 46.874 1377 84.145 39.093 73.108 41.923 27.732 50.244 1378 92.290 44.630 83.428 52.826 35.160 67.035 1379 34.035 8.1360 31.445 6.5732 4.0942 8.8550 1380 50.726 28.909 37.570 14.504 11.292 13.187 1381 50.056 85.149 39.178 36.633 55.619 21.582 1382 51.809 93.242 34.960 42.434 66.983 20.946 1383 55.618 96.468 43.152 47.430 73.039 27.080 1384 64.877 95.159 82.891 59.771 76.895 73.827 1385 8.6523 62.069 77.079 23.409 29.441 57.354 1386 13.021 65.981 86.152 28.286 34.238 72.818 1387 55.741 76.953 88.253 45.126 51.277 78.956 1388 79.211 57.925 43.807 38.431 35.461 20.777 1389 90.976 58.330 43.785 47.422 40.335 21.228 1390 44.908 65.332 7.4918 21.663 31.837 6.4789 1391 53.310 68.134 12.731 26.244 36.153 7.8422 1392 71.523 73.692 50.383 41.865 48.018 28.311 1393 75.680 78.667 57.953 48.632 55.503 36.667 1394 7.9113 47.889 20.607 8.8197 15.207 6.6121 1395 8.8177 48.339 28.960 9.6023 15.750 9.7836 1396 22.648 49.758 37.898 12.332 17.727 14.745 1397 31.233 82.628 41.971 29.864 49.698 22.662 1398 44.567 86.455 49.600 37.043 56.933 29.607 1399 45.738 89.463 57.825 40.968 61.819 38.157 1400 54.612 88.951 59.053 44.231 62.947 39.501 1401 59.287 84.577 43.544 40.741 57.120 24.643 1402 63.970 91.048 47.594 48.037 67.328 29.356 1403 62.348 90.278 55.934 48.108 66.389 36.731 1404 5.3917 46.280 79.366 18.191 18.159 58.978 1405 8.6506 51.662 96.415 25.911 24.014 90.361 1406 8.0599 82.289 98.538 41.357 53.614 99.635 1407 56.380 6.7793 42.430 15.241 8.3325 15.770 1408 61.053 10.668 59.880 20.575 11.020 31.617 1409 83.226 18.296 73.496 37.864 20.448 49.601 1410 14.084 5.0920 9.5704 2.0271 1.7214 1.9629 1411 18.279 6.7060 19.863 2.9270 2.2228 4.1962 1412 42.883 9.1411 68.240 15.162 7.8860 41.245 1413 47.232 7.2520 96.250 25.336 11.982 87.734 1414 5.1634 97.927 20.240 35.531 68.836 15.448 1415 37.390 99.691 20.305 41.474 73.975 16.146 1416 4.9734 72.334 11.939 18.461 35.299 7.9472 1417 70.287 75.285 10.196 38.301 47.901 9.0565 1418 93.635 82.746 13.196 59.510 65.364 11.815 1419 93.346 90.370 40.574 66.506 76.252 24.905 1420 26.865 48.691 5.8661 10.637 16.580 3.9458 1421 38.698 49.571 17.772 13.973 18.674 6.2187 1422 56.606 53.141 20.237 21.700 24.439 7.6054 1423 32.288 43.189 10.118 10.191 13.932 3.9684 1424 33.965 82.482 9.3695 27.916 48.844 9.6676 1425 66.585 83.007 6.9218 40.701 55.930 10.064 1426 78.844 93.921 6.1589 55.657 74.740 12.829 1427 81.070 94.160 84.453 69.473 80.728 76.687 1428 100.00 95.159 83.940 85.484 90.113 76.784 1429 21.475 17.960 7.5055 3.6241 3.7634 2.0115 1430 40.879 18.357 66.508 14.825 8.7842 39.237 1431 55.546 42.015 84.378 29.369 21.967 67.329 1432 63.352 48.362 84.924 35.057 27.599 69.050 1433 6.4927 21.077 17.722 2.9881 3.8915 3.9312 1434 7.7710 21.883 26.709 3.7089 4.3407 6.9353 1435 13.198 58.114 33.058 13.752 22.995 12.941 1436 15.980 67.043 32.779 17.875 30.907 14.107 1437 9.3714 64.431 6.2305 14.659 27.618 5.8997 1438 19.971 68.076 5.5025 17.335 31.539 6.4471 1439 18.000 85.062 30.108 27.973 51.180 16.178 1440 10.060 84.051 34.953 27.095 49.704 18.415 1441 14.201 93.257 37.578 34.025 62.630 22.074 1442 72.542 93.749 48.223 54.920 73.773 30.755 1443 83.138 96.118 54.814 64.911 81.437 37.645 1444 31.549 9.5018 5.4711 4.7194 3.3956 1.6763 1445 38.171 14.068 10.948 6.7437 4.8590 2.5253 1446 46.482 50.271 7.5247 16.254 20.230 4.5271 1447 49.341 55.377 15.589 19.329 24.449 6.5272 1448 55.638 82.623 51.913 39.160 54.310 31.034 1449 12.357 10.432 79.367 12.554 6.2938 56.986 1450 16.758 13.124 87.492 15.728 7.8850 70.762 1451 54.270 9.9794 87.520 25.005 12.374 71.190 1452 59.903 18.393 92.131 29.800 15.621 80.091 1453 67.589 51.357 93.024 41.116 31.848 84.346 1454 6.8847 30.900 41.089 6.5055 7.6346 15.166 1455 6.5282 31.822 50.572 8.0671 8.5298 22.635 1456 82.958 4.5314 39.605 30.201 15.973 14.543 1457 95.819 7.8666 42.747 41.036 21.696 17.215 1458 58.411 8.6328 19.170 14.093 8.1094 4.5475 1459 69.626 8.7478 19.829 19.946 11.132 5.0097 1460 76.423 9.6059 34.564 25.334 13.840 11.369 1461 89.783 8.8997 50.121 37.118 19.619 22.851 1462 93.512 4.8440 59.425 41.769 21.575 32.045 1463 93.595 6.4125 67.509 43.707 22.446 41.616 1464 93.855 36.507 80.083 51.053 31.320 60.921 1465 63.645 5.3332 10.013 16.141 9.0091 2.6894 1466 64.821 16.181 8.9382 17.368 10.601 2.7831 1467 78.575 44.158 93.590 45.858 30.962 85.026 1468 83.055 83.738 94.699 67.304 68.519 93.328 1469 12.918 6.5300 45.540 4.9407 2.9566 17.571 1470 12.660 5.7885 61.906 7.8628 4.0791 33.205 1471 23.505 10.107 70.798 11.413 5.9545 44.452 1472 29.082 8.1468 84.009 16.115 7.7881 64.664 1473 47.418 39.548 90.246 27.547 19.866 77.474 1474 57.860 43.471 93.841 34.090 24.601 84.909 1475 9.5419 41.902 37.446 8.6379 12.402 13.636 1476 6.0636 67.499 38.342 18.004 31.228 17.326 1477 11.276 72.207 44.484 21.467 36.433 22.360 1478 84.721 80.727 58.099 56.171 61.212 37.526 1479 89.939 83.546 65.698 63.624 67.464 46.991 1480 94.152 83.557 81.671 71.488 71.025 70.067 1481 14.085 28.804 30.902 5.4957 6.7016 9.1514 1482 32.455 32.645 46.209 10.820 10.262 19.193 1483 40.794 36.476 48.501 14.114 13.100 21.423 1484 60.037 43.600 54.605 24.303 20.861 27.888 1485 65.832 44.524 76.701 32.685 24.967 55.432 1486 24.504 36.734 49.658 10.700 11.404 22.256 1487 38.936 76.149 55.319 30.030 43.823 32.716 1488 42.626 89.471 84.815 47.024 64.134 75.286 1489 53.188 90.211 84.563 51.245 67.087 75.202 1490 15.917 51.913 44.102 13.030 19.065 19.167 1491 39.862 52.545 43.359 17.642 21.780 18.904 1492 40.830 67.563 49.757 25.111 34.751 26.089 1493 70.128 85.380 56.264 49.061 61.941 36.153 1494 76.864 85.349 73.078 57.081 65.599 56.712 1495 85.454 90.831 77.168 68.016 76.647 64.252 1496 40.824 24.871 6.8604 8.5509 7.5275 2.4078 1497 55.379 33.859 10.737 15.434 13.349 3.6732 1498 92.829 34.527 14.129 39.258 25.822 5.4316 1499 4.7424 40.874 58.967 11.555 13.116 31.510 1500 11.322 44.677 69.348 15.289 16.290 44.306 1501 16.067 54.161 78.745 21.333 23.657 58.902 1502 89.612 47.579 8.9995 39.799 31.093 5.5654 1503 88.869 73.419 43.526 52.724 53.521 23.304 1504 93.802 77.085 49.955 59.796 60.068 29.320 1505 7.5491 44.540 12.515 7.4382 13.062 4.3363 1506 5.3017 55.957 23.674 11.668 20.771 8.5388 1507 5.5929 76.922 24.311 21.622 40.589 12.068 1508 17.914 82.710 41.568 27.718 48.673 22.298 1509 36.026 84.026 50.050 33.065 52.522 29.354 1510 6.0617 75.984 38.366 22.425 40.064 18.815 1511 53.627 76.483 41.580 33.079 45.928 21.494 1512 64.336 78.027 45.252 39.469 50.477 24.704 1513 17.907 52.830 14.610 10.974 18.776 5.6602 1514 80.769 56.082 84.231 48.034 38.285 69.247 1515 80.644 75.270 89.665 58.705 56.816 81.888 1516 91.297 80.133 92.593 70.673 67.035 88.749 1517 72.903 89.922 80.531 59.802 71.345 68.902 1518 78.126 91.428 95.019 69.179 77.188 95.539 1519 6.8318 36.850 19.122 5.7404 9.2585 5.1959 1520 6.7742 60.678 48.124 16.316 25.647 23.416 1521 14.885 61.457 53.456 18.101 26.952 28.291 1522 13.647 71.127 72.166 26.683 37.644 51.641 1523 49.566 82.094 82.788 43.888 55.391 70.342 1524 74.658 34.577 6.3996 25.682 18.864 3.6462 1525 76.154 47.711 6.4264 30.021 26.118 4.8206 1526 75.474 63.481 9.2169 35.566 37.757 7.1038 1527 77.700 82.578 7.2254 47.163 58.861 10.323 1528 84.100 84.379 13.664 52.987 63.540 11.897 1529 19.927 6.7437 51.686 6.6538 3.7388 22.778 1530 24.432 9.6186 60.711 9.1620 5.0287 31.975 1531 34.937 46.426 76.974 21.444 19.983 55.473 1532 35.016 93.020 80.451 46.076 67.562 68.766 1533 9.2152 80.764 13.750 23.502 44.980 9.8838 1534 5.3649 89.112 15.943 28.825 55.759 12.151 1535 9.8316 91.640 23.229 31.227 59.595 14.847 1536 6.2386 94.535 41.181 34.897 64.434 24.697 1537 7.9585 96.974 50.868 38.279 68.763 32.931 1538 7.4511 60.322 15.437 13.046 24.105 6.7577 1539 6.8221 70.198 52.556 21.459 34.744 28.778 1540 6.7457 78.781 68.183 29.438 45.443 47.669 1541 6.4525 79.835 78.318 32.788 47.781 62.295 1542 5.9025 88.598 80.272 38.976 59.255 67.251 1543 6.5350 96.807 83.276 45.921 71.605 74.179 1544 8.8093 20.027 8.0073 2.6416 3.5754 2.0856 1545 13.404 52.363 6.0609 10.123 18.124 4.2896 1546 24.805 60.264 6.9751 14.540 24.870 5.4521 1547 43.292 85.967 6.4051 32.646 54.610 10.180 1548 79.400 86.716 50.434 54.771 66.316 31.208 1549 70.211 5.9960 45.534 22.715 12.092 18.394 1550 79.343 5.6553 53.104 29.722 15.544 25.146 1551 83.106 16.383 52.923 32.997 18.202 25.318 1552 92.454 93.900 82.758 77.503 84.645 74.169 1553 100.00 100.00 100.00 95.106 100.00 108.84 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispcal" CREATED "Sat Mar 14 19:07:36 2009" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" BEGIN_ARGYLL_DISPCAL_ARGS -qm -w0.3127,0.3290 -f0 -k0 END_ARGYLL_DISPCAL_ARGS NUMBER_OF_FIELDS 4 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT NUMBER_OF_SETS 256 BEGIN_DATA 0.00000 0.00000 0.00000 0.00000 0.00392 0.00392 0.00392 0.00392 0.00784 0.00784 0.00784 0.00784 0.01176 0.01176 0.01176 0.01176 0.01569 0.01569 0.01569 0.01569 0.01961 0.01961 0.01961 0.01961 0.02353 0.02353 0.02353 0.02353 0.02745 0.02745 0.02745 0.02745 0.03137 0.03137 0.03137 0.03137 0.03529 0.03529 0.03529 0.03529 0.03922 0.03922 0.03922 0.03922 0.04314 0.04314 0.04314 0.04314 0.04706 0.04706 0.04706 0.04706 0.05098 0.05098 0.05098 0.05098 0.05490 0.05490 0.05490 0.05490 0.05882 0.05882 0.05882 0.05882 0.06275 0.06275 0.06275 0.06275 0.06667 0.06667 0.06667 0.06667 0.07059 0.07059 0.07059 0.07059 0.07451 0.07451 0.07451 0.07451 0.07843 0.07843 0.07843 0.07843 0.08235 0.08235 0.08235 0.08235 0.08627 0.08627 0.08627 0.08627 0.09020 0.09020 0.09020 0.09020 0.09412 0.09412 0.09412 0.09412 0.09804 0.09804 0.09804 0.09804 0.10196 0.10196 0.10196 0.10196 0.10588 0.10588 0.10588 0.10588 0.10980 0.10980 0.10980 0.10980 0.11373 0.11373 0.11373 0.11373 0.11765 0.11765 0.11765 0.11765 0.12157 0.12157 0.12157 0.12157 0.12549 0.12549 0.12549 0.12549 0.12941 0.12941 0.12941 0.12941 0.13333 0.13333 0.13333 0.13333 0.13725 0.13725 0.13725 0.13725 0.14118 0.14118 0.14118 0.14118 0.14510 0.14510 0.14510 0.14510 0.14902 0.14902 0.14902 0.14902 0.15294 0.15294 0.15294 0.15294 0.15686 0.15686 0.15686 0.15686 0.16078 0.16078 0.16078 0.16078 0.16471 0.16471 0.16471 0.16471 0.16863 0.16863 0.16863 0.16863 0.17255 0.17255 0.17255 0.17255 0.17647 0.17647 0.17647 0.17647 0.18039 0.18039 0.18039 0.18039 0.18431 0.18431 0.18431 0.18431 0.18824 0.18824 0.18824 0.18824 0.19216 0.19216 0.19216 0.19216 0.19608 0.19608 0.19608 0.19608 0.20000 0.20000 0.20000 0.20000 0.20392 0.20392 0.20392 0.20392 0.20784 0.20784 0.20784 0.20784 0.21176 0.21176 0.21176 0.21176 0.21569 0.21569 0.21569 0.21569 0.21961 0.21961 0.21961 0.21961 0.22353 0.22353 0.22353 0.22353 0.22745 0.22745 0.22745 0.22745 0.23137 0.23137 0.23137 0.23137 0.23529 0.23529 0.23529 0.23529 0.23922 0.23922 0.23922 0.23922 0.24314 0.24314 0.24314 0.24314 0.24706 0.24706 0.24706 0.24706 0.25098 0.25098 0.25098 0.25098 0.25490 0.25490 0.25490 0.25490 0.25882 0.25882 0.25882 0.25882 0.26275 0.26275 0.26275 0.26275 0.26667 0.26667 0.26667 0.26667 0.27059 0.27059 0.27059 0.27059 0.27451 0.27451 0.27451 0.27451 0.27843 0.27843 0.27843 0.27843 0.28235 0.28235 0.28235 0.28235 0.28627 0.28627 0.28627 0.28627 0.29020 0.29020 0.29020 0.29020 0.29412 0.29412 0.29412 0.29412 0.29804 0.29804 0.29804 0.29804 0.30196 0.30196 0.30196 0.30196 0.30588 0.30588 0.30588 0.30588 0.30980 0.30980 0.30980 0.30980 0.31373 0.31373 0.31373 0.31373 0.31765 0.31765 0.31765 0.31765 0.32157 0.32157 0.32157 0.32157 0.32549 0.32549 0.32549 0.32549 0.32941 0.32941 0.32941 0.32941 0.33333 0.33333 0.33333 0.33333 0.33725 0.33725 0.33725 0.33725 0.34118 0.34118 0.34118 0.34118 0.34510 0.34510 0.34510 0.34510 0.34902 0.34902 0.34902 0.34902 0.35294 0.35294 0.35294 0.35294 0.35686 0.35686 0.35686 0.35686 0.36078 0.36078 0.36078 0.36078 0.36471 0.36471 0.36471 0.36471 0.36863 0.36863 0.36863 0.36863 0.37255 0.37255 0.37255 0.37255 0.37647 0.37647 0.37647 0.37647 0.38039 0.38039 0.38039 0.38039 0.38431 0.38431 0.38431 0.38431 0.38824 0.38824 0.38824 0.38824 0.39216 0.39216 0.39216 0.39216 0.39608 0.39608 0.39608 0.39608 0.40000 0.40000 0.40000 0.40000 0.40392 0.40392 0.40392 0.40392 0.40784 0.40784 0.40784 0.40784 0.41176 0.41176 0.41176 0.41176 0.41569 0.41569 0.41569 0.41569 0.41961 0.41961 0.41961 0.41961 0.42353 0.42353 0.42353 0.42353 0.42745 0.42745 0.42745 0.42745 0.43137 0.43137 0.43137 0.43137 0.43529 0.43529 0.43529 0.43529 0.43922 0.43922 0.43922 0.43922 0.44314 0.44314 0.44314 0.44314 0.44706 0.44706 0.44706 0.44706 0.45098 0.45098 0.45098 0.45098 0.45490 0.45490 0.45490 0.45490 0.45882 0.45882 0.45882 0.45882 0.46275 0.46275 0.46275 0.46275 0.46667 0.46667 0.46667 0.46667 0.47059 0.47059 0.47059 0.47059 0.47451 0.47451 0.47451 0.47451 0.47843 0.47843 0.47843 0.47843 0.48235 0.48235 0.48235 0.48235 0.48627 0.48627 0.48627 0.48627 0.49020 0.49020 0.49020 0.49020 0.49412 0.49412 0.49412 0.49412 0.49804 0.49804 0.49804 0.49804 0.50196 0.50196 0.50196 0.50196 0.50588 0.50588 0.50588 0.50588 0.50980 0.50980 0.50980 0.50980 0.51373 0.51373 0.51373 0.51373 0.51765 0.51765 0.51765 0.51765 0.52157 0.52157 0.52157 0.52157 0.52549 0.52549 0.52549 0.52549 0.52941 0.52941 0.52941 0.52941 0.53333 0.53333 0.53333 0.53333 0.53725 0.53725 0.53725 0.53725 0.54118 0.54118 0.54118 0.54118 0.54510 0.54510 0.54510 0.54510 0.54902 0.54902 0.54902 0.54902 0.55294 0.55294 0.55294 0.55294 0.55686 0.55686 0.55686 0.55686 0.56078 0.56078 0.56078 0.56078 0.56471 0.56471 0.56471 0.56471 0.56863 0.56863 0.56863 0.56863 0.57255 0.57255 0.57255 0.57255 0.57647 0.57647 0.57647 0.57647 0.58039 0.58039 0.58039 0.58039 0.58431 0.58431 0.58431 0.58431 0.58824 0.58824 0.58824 0.58824 0.59216 0.59216 0.59216 0.59216 0.59608 0.59608 0.59608 0.59608 0.60000 0.60000 0.60000 0.60000 0.60392 0.60392 0.60392 0.60392 0.60784 0.60784 0.60784 0.60784 0.61176 0.61176 0.61176 0.61176 0.61569 0.61569 0.61569 0.61569 0.61961 0.61961 0.61961 0.61961 0.62353 0.62353 0.62353 0.62353 0.62745 0.62745 0.62745 0.62745 0.63137 0.63137 0.63137 0.63137 0.63529 0.63529 0.63529 0.63529 0.63922 0.63922 0.63922 0.63922 0.64314 0.64314 0.64314 0.64314 0.64706 0.64706 0.64706 0.64706 0.65098 0.65098 0.65098 0.65098 0.65490 0.65490 0.65490 0.65490 0.65882 0.65882 0.65882 0.65882 0.66275 0.66275 0.66275 0.66275 0.66667 0.66667 0.66667 0.66667 0.67059 0.67059 0.67059 0.67059 0.67451 0.67451 0.67451 0.67451 0.67843 0.67843 0.67843 0.67843 0.68235 0.68235 0.68235 0.68235 0.68627 0.68627 0.68627 0.68627 0.69020 0.69020 0.69020 0.69020 0.69412 0.69412 0.69412 0.69412 0.69804 0.69804 0.69804 0.69804 0.70196 0.70196 0.70196 0.70196 0.70588 0.70588 0.70588 0.70588 0.70980 0.70980 0.70980 0.70980 0.71373 0.71373 0.71373 0.71373 0.71765 0.71765 0.71765 0.71765 0.72157 0.72157 0.72157 0.72157 0.72549 0.72549 0.72549 0.72549 0.72941 0.72941 0.72941 0.72941 0.73333 0.73333 0.73333 0.73333 0.73725 0.73725 0.73725 0.73725 0.74118 0.74118 0.74118 0.74118 0.74510 0.74510 0.74510 0.74510 0.74902 0.74902 0.74902 0.74902 0.75294 0.75294 0.75294 0.75294 0.75686 0.75686 0.75686 0.75686 0.76078 0.76078 0.76078 0.76078 0.76471 0.76471 0.76471 0.76471 0.76863 0.76863 0.76863 0.76863 0.77255 0.77255 0.77255 0.77255 0.77647 0.77647 0.77647 0.77647 0.78039 0.78039 0.78039 0.78039 0.78431 0.78431 0.78431 0.78431 0.78824 0.78824 0.78824 0.78824 0.79216 0.79216 0.79216 0.79216 0.79608 0.79608 0.79608 0.79608 0.80000 0.80000 0.80000 0.80000 0.80392 0.80392 0.80392 0.80392 0.80784 0.80784 0.80784 0.80784 0.81176 0.81176 0.81176 0.81176 0.81569 0.81569 0.81569 0.81569 0.81961 0.81961 0.81961 0.81961 0.82353 0.82353 0.82353 0.82353 0.82745 0.82745 0.82745 0.82745 0.83137 0.83137 0.83137 0.83137 0.83529 0.83529 0.83529 0.83529 0.83922 0.83922 0.83922 0.83922 0.84314 0.84314 0.84314 0.84314 0.84706 0.84706 0.84706 0.84706 0.85098 0.85098 0.85098 0.85098 0.85490 0.85490 0.85490 0.85490 0.85882 0.85882 0.85882 0.85882 0.86275 0.86275 0.86275 0.86275 0.86667 0.86667 0.86667 0.86667 0.87059 0.87059 0.87059 0.87059 0.87451 0.87451 0.87451 0.87451 0.87843 0.87843 0.87843 0.87843 0.88235 0.88235 0.88235 0.88235 0.88627 0.88627 0.88627 0.88627 0.89020 0.89020 0.89020 0.89020 0.89412 0.89412 0.89412 0.89412 0.89804 0.89804 0.89804 0.89804 0.90196 0.90196 0.90196 0.90196 0.90588 0.90588 0.90588 0.90588 0.90980 0.90980 0.90980 0.90980 0.91373 0.91373 0.91373 0.91373 0.91765 0.91765 0.91765 0.91765 0.92157 0.92157 0.92157 0.92157 0.92549 0.92549 0.92549 0.92549 0.92941 0.92941 0.92941 0.92941 0.93333 0.93333 0.93333 0.93333 0.93725 0.93725 0.93725 0.93725 0.94118 0.94118 0.94118 0.94118 0.94510 0.94510 0.94510 0.94510 0.94902 0.94902 0.94902 0.94902 0.95294 0.95294 0.95294 0.95294 0.95686 0.95686 0.95686 0.95686 0.96078 0.96078 0.96078 0.96078 0.96471 0.96471 0.96471 0.96471 0.96863 0.96863 0.96863 0.96863 0.97255 0.97255 0.97255 0.97255 0.97647 0.97647 0.97647 0.97647 0.98039 0.98039 0.98039 0.98039 0.98431 0.98431 0.98431 0.98431 0.98824 0.98824 0.98824 0.98824 0.99216 0.99216 0.99216 0.99216 0.99608 0.99608 0.99608 0.99608 1.00000 1.00000 1.00000 1.00000 END_DATA DisplayCAL-3.5.0.0/misc/winversion.txt0000644000076500000000000000276712277575132017424 0ustar devwheel00000000000000# UTF-8 # # For more details about fixed file info 'ffi' see: # http://msdn.microsoft.com/en-us/library/ms646997.aspx VSVersionInfo( ffi=FixedFileInfo( # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) # Set not needed items to zero 0. filevers=%(filevers)s, prodvers=%(prodvers)s, # Contains a bitmask that specifies the valid bits 'flags'r mask=0x0, # Contains a bitmask that specifies the Boolean attributes of the file. flags=0x0, # The operating system for which this file was designed. # 0x4 - NT and there is no need to change it. OS=0x4, # The general type of file. # 0x1 - the file is an application. fileType=0x1, # The function of the file. # 0x0 - the function is not defined for this fileType subtype=0x0, # Creation date and time stamp. date=(0, 0) ), kids=[ StringFileInfo( [ StringTable( u'040904b0', [StringStruct(u'CompanyName', u'%(CompanyName)s'), StringStruct(u'FileDescription', u'%(FileDescription)s'), StringStruct(u'FileVersion', u'%(FileVersion)s'), StringStruct(u'InternalName', u'%(InternalName)s'), StringStruct(u'LegalCopyright', u'%(LegalCopyright)s'), StringStruct(u'OriginalFilename', u'%(OriginalFilename)s'), StringStruct(u'ProductName', u'%(ProductName)s'), StringStruct(u'ProductVersion', u'%(ProductVersion)s')]) ]), VarFileInfo([VarStruct(u'Translation', [1033, 1200])]) ] ) DisplayCAL-3.5.0.0/misc/xrced_plugins/0000755000076500000000000000000013242313606017277 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/misc/xrced_plugins/fancytext.crx0000644000076500000000000000104612461303002022012 0ustar devwheel00000000000000 control pos size label 1 xh_fancytext StaticFancyTextCtrlXmlHandler control This class works similar to StaticText except it interprets its text as FancyText. DisplayCAL-3.5.0.0/misc/xrced_plugins/filebrowsebutton.crx0000644000076500000000000000321012277575132023421 0ustar devwheel00000000000000 control pos size labelText buttonText toolTip dialogTitle startDirectory initialValue fileMask fileMode labelWidth 1 xh_filebrowsebutton FileBrowseButtonXmlHandler gizmo A control to allow the user to type in a filename or browse with the standard file dialog to select file 10 control pos size labelText buttonText toolTip dialogTitle startDirectory initialValue fileMask fileMode labelWidth 1 xh_filebrowsebutton FileBrowseButtonWithHistoryXmlHandler gizmo A control to allow the user to type in a filename or browse with the standard file dialog to select file 10 DisplayCAL-3.5.0.0/misc/xrced_plugins/floatspin.crx0000644000076500000000000000144412025152312022010 0ustar devwheel00000000000000 control pos size value min_val max_val increment digits 1 FS_LEFT FS_RIGHT FS_CENTRE FS_READONLY EVT_FLOATSPIN xh_floatspin FloatSpinCtrlXmlHandler gizmo Floating Point SpinCtrl 10 DisplayCAL-3.5.0.0/misc/xrced_plugins/hstretchstatbmp.crx0000644000076500000000000000105412461303002023223 0ustar devwheel00000000000000 control pos size bitmap:BitmapAttribute 1 xh_hstretchstatbmp HStretchStaticBitmapXmlHandler control An automatically horizontally stretching StaticBitmap. DisplayCAL-3.5.0.0/misc/xrced_plugins/xh_floatspin.py0000644000076500000000000000255112025152312022343 0ustar devwheel00000000000000# -*- coding: utf-8 -*- import wx import wx.xrc as xrc try: import wx.lib.agw.floatspin as floatspin except ImportError: import floatspin class FloatSpinCtrlXmlHandler(xrc.XmlResourceHandler): def __init__(self): xrc.XmlResourceHandler.__init__(self) # Standard styles self.AddWindowStyles() # Custom styles self.AddStyle('FS_LEFT', floatspin.FS_LEFT) self.AddStyle('FS_RIGHT', floatspin.FS_RIGHT) self.AddStyle('FS_CENTRE', floatspin.FS_CENTRE) self.AddStyle('FS_READONLY', floatspin.FS_READONLY) def CanHandle(self,node): return self.IsOfClass(node, 'FloatSpin') # Process XML parameters and create the object def DoCreateResource(self): try: min_val = float(self.GetText('min_val')) except: min_val = None try: max_val = float(self.GetText('max_val')) except: max_val = None try: increment = float(self.GetText('increment')) except: increment = 1.0 w = floatspin.FloatSpin(parent=self.GetParentAsWindow(), id=self.GetID(), pos=self.GetPosition(), size=self.GetSize(), style=self.GetStyle(), min_val=min_val, max_val=max_val, increment=increment, name=self.GetName()) try: w.SetValue(float(self.GetText('value'))) except: w.SetValue(0.0) try: w.SetDigits(int(self.GetText('digits'))) except: pass self.SetupWindow(w) return w DisplayCAL-3.5.0.0/misc/z-displaycal-apply-profiles.desktop0000644000076500000000000000072412665102101023361 0ustar devwheel00000000000000[Desktop Entry] Version=1.0 Encoding=UTF-8 Type=Application Name=Profile Loader Name[de]=Profil-Lader GenericName=Calibration and ICC Profile Loader GenericName[de]=Kalibrierungs- und ICC-Profil-Lader Icon=displaycal-apply-profiles Exec=displaycal-apply-profiles Terminal=false Comment[de]=Setzt ICC-Profile und lädt Kalibrierungskurven für alle konfigurierten Anzeigegeräte Comment=Sets ICC profiles and loads calibration curves for all configured display devices DisplayCAL-3.5.0.0/PKG-INFO0000644000076500000000000000262113242313606014574 0ustar devwheel00000000000000Metadata-Version: 1.1 Name: DisplayCAL Version: 3.5.0.0 Summary: Display calibration and profiling with a focus on accuracy and versatility Home-page: https://displaycal.net/ Author: Florian Hoech Author-email: florian_at_displaycal.net License: GPL v3 Download-URL: https://displaycal.net/download/DisplayCAL-3.5.0.0.tar.gz Description: Calibrate and characterize your display devices using one of many supported measurement instruments, with support for multi-display setups and a variety of available options for advanced users, such as verification and reporting functionality to evaluate ICC profiles and display devices, creating video 3D LUTs, as well as optional CIECAM02 gamut mapping to take into account varying viewing conditions. Platform: Python >= 2.6 <= 2.7 Platform: Linux/Unix with X11 Platform: Mac OS X >= 10.4 Platform: Windows 2000 and newer Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: MacOS X Classifier: Environment :: Win32 (MS Windows) Classifier: Environment :: X11 Applications Classifier: Intended Audience :: End Users/Desktop Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Topic :: Multimedia :: Graphics Requires: wxPython (>= 2.8.8) Provides: DisplayCAL DisplayCAL-3.5.0.0/README-fr.html0000644000076500000000000131464513242313541015742 0ustar devwheel00000000000000 DisplayCAL — Logiciel d’étalonnage et caractérisation d’écran à sources ouvertes, animé par ArgyllCMS

    Si vous désirez mesurer la couleur n’importe quand, vous pourriez aussi être intéressé par ArgyllPRO ColorMeter de Graeme Gill, auteur d’ArgyllCMS. Disponible pour Android depuis « Google Play store ». Parcourez l’aperçu et la visite guidée en vidéo.

    À propos de DisplayCAL

    DisplayCAL (anciennement dispcalGUI) est une interface graphique développée par Florian Höch pour les outils d’étalonnage et de caractérisation des systèmes d’affichage d’ArgyllCMS, un système de gestion de la couleur à sources ouvertes développé par Graeme Gill.

    Il permet d’étalonner et de caractériser vos périphériques d’affichage en utilisant l’une des nombreuses sondes de mesure prises en compte. Il prend en charge les configurations multi-écrans et de nombreux paramètres définissables par l’utilisateur comme le point blanc, la luminance, la courbe de réponse de tonalité ainsi que la possibilité de créer des profils ICC à matrice ou à table de correspondance, avec transposition optionnelle du gamut, ainsi que certains formats propriétaires de LUT 3D. On trouvera, parmi d’autres fonctionnalités :

    • Prise en charge de la correction du colorimètre pour différents écrans à l’aide de matrices de correction ou de fichiers d’échantillon spectral d’étalonnage (« colorimeter spectral sample set » = csss) (ces derniers uniquement pour certains colorimètres spécifiques, c’est-à-dire l’i1 Display Pro, le ColorMunki Display et les Spyder 4/5) ;
    • Vérification du profil et rapport de mesure : vérification de la qualité des profils et des LUT 3D par des mesures. Prise en charge également de fichiers CGATS personnalisés (par ex. FOGRA, GRACoL/IDEAlliance, SWOP) et utilisation de profils de référence pour obtenir des valeurs de test ;
    • Éditeur de mire de test : crée des mires avec un nombre quelconque d’échantillons de couleur, copié-collé facile depuis des fichiers CGATS, CSV (uniquement délimité par des tabulations) et applications de feuilles de calculs ;
    • Création de profils ICC synthétiques (à matrice) avec les primaires, le point noir et le point blanc ainsi que la réponse tonale personnalisés.

    Captures d’écran


    Paramètres d’écran et de sonde de mesure

    Paramètres d’étalonnage

    Paramètres de caractérisation


    Paramètres de LUT 3D

    Paramètres de vérification

    Éditeur de mire de test


    Réglages de l’écran

    Informations du profil

    Courbes d’étalonnage


    KDE5

    Mac OS X

    Windows 7

    Clause de responsabilité

    Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier librement selon les termes de la Licence publique générale GNU telle que publiée par la Free Software Foundation ; soit à la version 3 de la Licence, soit (à votre choix) toute version ultérieure.

    Ce programme est distribué dans l’espoir qu’il sera utile, mais SANS AUCUNE GARANTIE ; sans même la garantie implicite d’une QUELCONQUE VALEUR MARCHANDE ou de l’ADÉQUATION À UN BESOIN PARTICULIER. Voir la Licence Publique Générale GNU pour davantage d’informations.

    DisplayCAL est écrit en Python et utilise les paquets tiers NumPy, demjson (bibliothèque JSON[6]) et wxPython (kit de développement d’interface graphique (GUI)[4]). Il fait aussi une utilisation intensive de certains des utilitaires d’ArgyllCMS. Le système de construction permettant d’obtenir des exécutables autonomes utilise en outre setuptools et py2app sous Mac OS X ou py2exe sous Windows. Tous ces logiciels sont © par leurs auteurs respectifs.

    Obtenir DisplayCAL en version autonome

    • Pour Linux

      Des paquets natifs pour plusieurs distributions sont disponibles via openSUSE Build Service :

      Les paquets réalisés pour des distributions plus anciennes peuvent fonctionner sur les plus récentes tant qu’il n’y a rien eu de substantiel de modifié (c’est-à-dire la version de Python). Il existe aussi certaines distributions qui sont basées sur celles de la liste ci-dessus (par exemple, Linux Mint qui est basée sur Ubuntu). Ceci signifie que les paquets de cette distribution de base devraient aussi fonctionner avec ses dérivées, vous devez simplement connaître la version sur laquelle la dérivée est basée et faire votre téléchargement en conséquence.

    • Pour Mac OS X (10.6 ou plus récent)

      Image disque

      Note that due to Mac OS X App Translocation (since 10.12 Sierra), you may need to remove the “quarantine” flag from the non-main standalone application bundles after you have copied them to your computer before you can successfully run them. E.g. if you copied them to /Applications/DisplayCAL-3.5.0.0/, open Terminal and run the following command: xattr -dr com.apple.quarantine /Applications/DisplayCAL-3.5.0.0/*.app

    • Pour Windows (XP ou plus récent)

    • Code source

      Il vous faut une installation Python fonctionnelle et tous ses prérequis.

      Archive tar des sources

      Vous pouvez aussi, si cela ne vous pose pas de problème d’utiliser le code de développement, parcourir le dépôt SVN[8] de la dernière version de développement (ou effectuer une récupération complète — « checkout» — à l’aide de svn checkout svn://svn.code.sf.net/p/dispcalgui/code/trunk displaycal). Mais soyez attentif au fait que le code de développement peut contenir des bogues ou même ne pas fonctionner du toute, ou uniquement sur certaines plateformes). Utilisez-le à vos propres risques.

    Veuillez poursuivre avec le Guide de démarrage rapide.

    Obtenir DisplayCAL via Zero Install

    • Rapide introduction à Zero Install

      (Note : vous n’avez habituellement pas à installer séparément Zero Install, cela est géré automatiquement lors des téléchargements de DisplayCAL dont vous trouverez les liens ci-dessous. Ce paragraphe n’est là que pour information).

      Zero Install st un système d’installation décentralisé et multi-plate-formes. Les avantages que vous tirez de l’utilisation de Zero Install sont :

      • Être toujours à jour. Zero Install maintient automatiquement à jour l’ensemble du logiciel ;
      • Basculer facilement entre différentes versions du logiciel depuis Zero Install si vous le désirez ;
      • Pas de nécessité de droits d’administration pour ajouter ou mettre à jour un logiciel (*).

      * Note : l’installation et la mise à jour de Zero Install lui-même et de ses dépendances logicielles au travers de mécanismes du système d’exploitation peut demander des privilèges d’administration.

    • Pour Linux

      Des paquets natifs de plusieurs distributions sont disponibles via openSUSE Build Service:

      Veuillez noter :

      • Le numéro de version du paquet ne reflète pas nécessairement la version de DisplayCAL.

      Les paquets réalisés pour des distributions plus anciennes peuvent fonctionner sur les plus récentes tant qu’il n’y a rien eu de substantiel de modifié (c’est-à-dire la version de Python). Il existe aussi certaines distributions qui sont basées sur celles de la liste ci-dessus (par exemple, Linux Mint qui est basée sur Ubuntu). Ceci signifie que les paquets de cette distribution de base devraient aussi fonctionner avec ses dérivées, vous devez simplement connaître la version sur laquelle la dérivée est basée et faire votre téléchargement en conséquence. Dans tous les autres cas, veuillez essayer les instructions ci-dessous ou l’une des installations autonomes.

      Autre méthode d’installation

      Si votre distributions fait pas partie de celles indiquées ci-dessus, veuillez suivre ces instructions :

      1. Installez le paquet 0install ou zeroinstall-injector de votre distribution. Au cas où il ne serait pas disponible, il existe des binaires génériques précompilés. Téléchargez l’archive appropriée correspondant à votre système, décompressez-la. Depuis un terminal, cd vers le dossier extrait, et lancez sudo ./install.sh local pour effectuer l’installation vers /usr/local, ou ./install.sh home pour effectuer l’installation dans votre répertoire personnel (il vous faudra peut-être ajouter ~/bin à votre variable PATH dans ce cas). Vous aurez besoin que libcurl soit installée (la plupart des systèmes l’ont par défaut).
      2. Choisissez l’entrée 0install à partir du menu des applications (les anciennes versions de Zero Install ont une entrée « Ajouter un nouveau programme » — Add New Program — à la place).
      3. Glissez le lien du feed Zero Install de DisplayCAL vers la fenêtre de Zero Install.

      Note concernant les outils autonomes de DisplayCAL sous Linux (créateur de LUT 3D, afficheur de courbe, informations du profil, créateur de profil synthétique, éditeur de mire de test, convertisseur de VRML vers X3D) : si vous utilisez l’autre méthode d’installation, il ne sera créé d’icône d’application que pour DisplayCAL elle-même. Ceci est une limitation actuelle de Zero Install sous Linux. Vous pouvez installer vous-même les entrées d’icônes pour les outils autonomes à l’aide des commandes suivantes lancées depuis un terminal :

      0launch --command=install-standalone-tools-icons \
      http://displaycal.net/0install/DisplayCAL.xml

      Et vous pourrez les désinstaller de nouveau par :

      0launch --command=uninstall-standalone-tools-icons \
      http://displaycal.net/0install/DisplayCAL.xml
    • Pour Mac OS X (10.5 ou plus récent)

      Téléchargez l’image disque du lanceur Zero Install de DisplayCAL et lancez l’une quelconque des applications incluses.

    • Pour Windows (XP ou plus récent)

      Téléchargez le configurateur Zero Install de DisplayCAL : Installation par l’Administrateur | Installation par l’utilisateur.

    • Mise à jour manuelle ou basculement entre les versions du logiciel

      Les mises à jour sont normalement appliquées automatiquement. Si vous désirez effectuer une mise à jour manuelle ou basculer entre les versions du logiciel, veuillez suivre les instructions ci-dessous.

      • Linux

        Choisissez l’entrée 0install depuis le menu de l’application (les anciennes versions de Zero Install ont une entrée « Gérer les programmes — « Manage Programs » — en remplacement). Dans la fenêtre qui s’ouvre, faites un clic-droit sur l’icône de DisplayCAL et sélectionner « Choisir les versions » (avec les anciennes versions de Zero Install, vous devez cliquer la petite icône « Mettre à jour ou changer de version » qui se trouve sous le bouton « Run »). Vous pouvez alors cliquer le bouton « Tout rafraîchir » pour mettre à jour, ou cliquer le petit bouton sur la droite de l’entrée et sélectionner « Afficher les versions ».

        Pour sélectionner une version spécifique du logiciel, cliquez sur l’entrée de la version et définissez le rang à « préféré » (« prefered ») (notez que cela interdira le téléchargement des mises à jour du logiciel sélectionné jusqu’à ce que vous changiez vous-même la version ou que vous réinitialisiez le rang).

      • Mac OS X

        Lancez 0install Launcher. Dans la fenêtre qui s’ouvre, cliquez sur le bouton « Tout rafraîchir » (« Refresh all ») pour effectuer la mise à jour, ou cliquez le petit bouton situé à la droite d’une entrée et sélectionnez « Afficher les versions » (« Show versions »).

        Pour sélectionner une version spécifique du logiciel, cliquez sur l’entrée de la version et définissez le rang à « préféré » (« prefered ») (notez que cela interdira le téléchargement des mises à jour du logiciel sélectionné jusqu’à ce que vous changiez vous-même la version ou que vous réinitialisiez le rang).

      • Windows

        Choisir l’entrée Zero Install depuis la page de démarrage sous Windows 8, ou le sous-répertoire respectif du répertoire des programmes dans le menu démarrer sous Windows 10, Windows 7 et plus récents. Passez ensuite à l’onglet « Mes applications » (« My Applications ») sur la fenêtre qui s’ouvre. Cliquez la petite flèche « vers le bas » à l’intérieur du bouton « Démarrer » situé à la droite de l’entrée de DisplayCAL et choisissez « Mettre à jour » (« Update ») ou « Sélectionner une version » (« Select version »).

        Pour sélectionner une version spécifique du logiciel, cliquez sur l’entrée de la version et définissez le rang à « préféré » (« prefered ») (notez que cela interdira le téléchargement des mises à jour du logiciel sélectionné jusqu’à ce que vous changiez vous-même la version ou que vous réinitialisiez le rang).

    Veuillez poursuivre avec le démarrage rapide.

    Guide de démarrage rapide

    Ce court guide est destiné à vous permettre de vous lancer rapidement, mais si vous avez des problèmes, référez-vous aux sections complètes des prérequis et d’installation.

    1. Lancez DisplayCAL. S’il ne peut pas déterminer le chemin vers les binaires d’ArgyllCMS, il va, lors du premier lancement, vous demander d’en télécharger automatiquement la dernière version ou d’en sélectionner vous-même l’emplacement.

    2. Windows uniquement : si votre sonde de mesure n’est pas un ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval ou K-10, vous devrez installer un pilote spécifique à Argyll avant de poursuivre. Sélectionnez « Installer les pilotes des sondes de mesure d’ArgyllCMS… » depuis le menu « Outils ». Voir aussi « Installation du pilote de sonde de mesure sous Windows ».

      Mac OS X uniquement : si vous désirez utiliser le colorimètre HCFR, suivez les instructions de la section « Colorimètre HCFR » dans « Installing ArgyllCMS on Mac OS X » [en] (« Installer ArgyllCMS sous Mac OS X ») dans la documentation d’ArgyllCMS avant de poursuivre.

      Connectez votre sonde de mesure à votre ordinateur.

    3. Cliquez la petite icône avec les flèches enroulées située entre les contrôles « Périphérique d’affichage » et « Sonde de mesure » afin de détecter les périphériques d’affichage et les sondes. Les sondes détectées devraient s’afficher dans la liste déroulante « Sondes de mesure ».

      Si votre sonde de mesure est une Spyder 2, une fenêtre de dialogue apparaîtra qui vous permet d’activer l’appareil. Ceci est nécessaire pour pouvoir utiliser la Spyder 2 avec ArgyllCMS et DisplayCAL.

      Si votre sonde de mesure est une i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, une fenêtre apparaîtra depuis la quelle vous pourrez importer les corrections génériques du colorimètre à partir du logiciel du fournisseur, ce qui peut améliorer la précision des mesures sur le type de périphérique d’affichage que vous utilisez. Après les avoir importées, elles seront disponibles sous la fenêtre déroulante « Correction », où vous pourrez choisir l’une des entrées qui convient au type de périphérique d’affichage que vous avez, ou, si rien ne correspond, laissez-la sur « Automatique ». Note : l’importation des corrections depuis le logiciel des Spyder 4/5 active des options de mesure supplémentaires pour cette sonde.

    4. Cliquez « Étalonner et caractériser. C’est tout !

      Vous trouverez sur le Wiki des guides et des tutoriels. Et vous pouvez vous référer à la documentation pour des informations d’utilisation avancées (optionnel).

      Linux uniquement : si vous ne pouvez pas accéder à votre sonde de mesure, choisissez « Installer les fichiers de configuration des sondes de mesure d’ArgyllCMS…. » depuis le menu « Outils » (si ce menu est grisé, alors la version d’ArgyllCMS que vous utilisez actuellement a probablement été installée depuis le dépôt d’une distribution et la configuration devrait déjà avoir été faite correctement pour l’accès à la sonde de mesure).
      Si vous ne pouvez pas accéder à votre sonde de mesure, essayez d’abord de la débrancher et de la reconnecter, ou redémarrez votre ordinateur. Si ceci ne résout pas le problème, lisez Installing ArgyllCMS on Linux: Setting up instrument access [en] (« Installer ArgyllCMS sous Linux : Configurer l’accès à la sonde de mesure » dans la documentation d’ArgyllCMS.

    Exigences du système et autres prérequis

    Exigences générales du système

    • Une version récente du système d’exploitation Linux, Mac OS X (10.6 ou plus récent) ou Windows (XP/Server 2003 ou plus récent) ;
    • Une carte graphique avec prise en charge d’au moins 24 bits par pixel (vraies couleurs) et un bureau configuré pour utiliser cette profondeur des couleurs.

    ArgyllCMS

    Pour utiliser DisplayCAL, vous devez télécharger et installer ArgyllCMS (1.0 ou plus récent).

    Sondes de mesure prises en charge

    Vous avez besoin d’une des sondes prises en charge. Toutes les sondes de mesure prises en charge par ArgyllCMS le sont aussi par DisplayCAL. Pour les lectures d’écran, ce sont actuellement :

    Colorimètres

    • CalMAN X2 (traité comme i1 Display 2)
    • Datacolor/ColorVision Spyder 2
    • Datacolor Spyder 3 (depuis ArgyllCMS 1.1.0)
    • Datacolor Spyder 4 (depuis ArgyllCMS 1.3.6)
    • Datacolor Spyder 5 (depuis ArgyllCMS 1.7.0)
    • HP Advanced Profiling Solution (traité comme i1 Display 2)
    • HP DreamColor (traité comme i1 Display 2)
    • Hughski ColorHug (pris en charge sous Linux depuis ArgyllCMS 1.3.6, pris en charge sous Windows avec le nouveau micrologiciel de ColorHug depuis ArgyllCMS 1.5.0, pris en charge de manière entièrement fonctionnelle sous Mac OS X depuis ArgyllCMS 1.6.2)
    • Hughski ColorHug2 (depuis ArgyllCMS 1.7.0)
    • Image Engineering EX1 (depuis ArgyllCMS 1.8.0 Beta)
    • Klein K10-A (depuis ArgyllCMS 1.7.0)
    • Lacie Blue Eye (traité comme i1 Display 2)
    • Sencore ColorPro III, IV & V (traité comme i1 Display 1)
    • Sequel Imaging MonacoOPTIX/Chroma 4 (traité comme i1 Display 1)
    • X-Rite Chroma 5 (traité comme i1 Display 1)
    • X-Rite ColorMunki Create (traité comme i1 Display 2)
    • X-Rite ColorMunki Smile (depuis ArgyllCMS 1.5.0)
    • X-Rite DTP92
    • X-Rite DTP94
    • X-Rite/GretagMacbeth/Pantone Huey
    • X-Rite/GretagMacbeth i1 Display 1
    • X-Rite/GretagMacbeth i1 Display 2/LT
    • X-Rite i1 Display Pro, ColorMunki Display (depuis ArgyllCMS 1.3.4)

    Spectromètres

    • JETI specbos 1211/1201 (depuis ArgyllCMS 1.6.0)
    • JETI spectraval 1511/1501 (depuis ArgyllCMS 1.9.0)
    • X-Rite ColorMunki Design, ColorMunki Photo (depuis ArgyllCMS 1.1.0)
    • X-Rite/GretagMacbeth i1 Monitor (depuis ArgyllCMS 1.0.3)
    • X-Rite/GretagMacbeth i1 Pro/EFI ES-1000
    • X-Rite i1 Pro 2 (depuis ArgyllCMS 1.5.0)
    • X-Rite/GretagMacbeth Spectrolino

    Si vous avez décidé d’acheter une sonde de mesure de la couleur parce qu’ArgyllCMS la prend en charge, veuillez faire savoir au vendeur et au constructeur que « vous l’avez achetée parce qu’ArgyllCMS la prend en charge » – merci.

    Remarquez que l’i1 Display Pro et l’i1 Pro sont des sondes de mesure très différentes en dépit de la similarité de leur nom.

    Il y a actuellement (2014-05-20) cinq sondes de mesure (ou plutôt, paquets) sous la marque ColorMunki, deux d’entre elles sont des spectromètres, et trois sont des colorimètres (toutes ne sont pas des offres récentes, mais vous devriez pouvoir les trouver d’occasion dans le cas où ils ne seraient plus commercialisés neufs) :

    • Les spectromètres ColorMunki Design et ColorMunki Photo ne diffèrent que par les fonctionnalités du logiciel fourni par le fabricant. Il n’y a pas de différence entre ces sondes de mesure lorsqu’elles sont utilisées avec ArgyllCMS et DisplayCAL ;
    • Le colorimètre ColorMunki Display est une version plus économique du colorimètre i1 Display Pro. Le logiciel fourni est plus simple et les temps de mesure plus longs comparés à ceux de l’i1 Display Pro. À part cela, ils semblent virtuellement identiques ;
    • Les colorimètres ColorMunki Create et ColorMunki Smile sont constitués du même matériel que l’i1 Display 2 (le ColorMunki Smile n’a maintenant plus de correction intégrée pour les CRT mais, en remplacement, pour le rétroéclairage blanc à LED des LCD).

    Exigences supplémentaires pour l’étalonnage et la caractérisation sans intervention

    Lors de l’utilisation d’un spectromètre pour lequel la fonctionnalité de fonctionnement sans intervention est prise en charge (voir ci-dessous), on peut éviter d’avoir à enlever l’appareil de l’écran pour effectuer de nouveau son auto-étalonnage après l’étalonnage de l’écran et avant de lancer les mesures pour la caractérisation si, dans le menu « Options », on a coché l’élément de menu « Permettre de sauter l’auto-étalonnage du spectromètre » (les mesures des colorimètres se font toujours sans intervention parce que, généralement, ils ne demandent pas d’étalonnage de leur capteur en étant hors écran, à l’exception de l’i1 Display 1).

    L’étalonnage et la caractérisation sans intervention sont actuellement pris en charge pour les spectromètres suivants ainsi que pour la plupart des colorimètres :

    • X-Rite ColorMunki ;
    • X-Rite/GretagMacbeth i1 Monitor & Pro ;
    • X-Rite/GretagMacbeth Spectrolino ;
    • X-Rite i1 Pro 2.

    Soyez attentif au fait que vous pourrez quand même être obligé d’effectuer un étalonnage de la sonde de mesure si elle l’exige. Veuillez aussi consulter les problèmes possibles.

    Exigences supplémentaires pour utiliser le code source

    Vous pouvez sauter cette section si vous avez téléchargé un paquet, un installateur, une archive zip ou une image disque de DisplayCAL pour votre système d’exploitation et que vous ne désirez pas le faire tourner à partir des sources.

    Sur toutes les plate-formes :

    • Python >= v2.5 <= v2.7.x (la version 2.7.x est recommandée. Utilisateurs de Mac OS X : si vous désirez compiler le module C d’extension de DisplayCAL, il est conseillé d’installer d’abord XCode et ensuite la version officielle de Python de python.org) ;
    • NumPy ;
    • Kit de développement de GUI[4] wxPython.

    Windows :

    Exigences supplémentaires pour compiler le module d’extension en C

    Vous pouvez normalement sauter cette section, car le code source contient des versions pré-compilées du module d’extension en C qu’utilise DisplayCAL.

    Linux :

    • GCC et les en-têtes de développement pour Python + X11 + Xrandr + Xinerama + Xxf86vm s’ils ne sont pas déjà installés, ils devraient être disponibles depuis le système de paquets de votre distribution.

    Mac OS X :

    • XCode ;
    • py2app si vous désirez construire un exécutable autonome. Sur une version de Mac OS X antérieure à 10.5, installez d’abord setuptools : sudo python util/ez_setup.py setuptools

    Windows :

    • Un compilateur C (par ex. MS Visual C++ Express ou MinGW. Si vous utilisez la version officielle Python 2.6 ou plus récente de python.org, je recommande d’utiliser Visual C++ Express, car il fonctionne directement) ;
    • py2exe si vous désirez construire un exécutable autonome.

    Fonctionnement direct depuis les sources

    Une fois satisfaites toutes les exigences supplémentaires pour utiliser le code source, vous pouvez simplement lancer depuis un terminal l’un quelconque des fichiers .pyw inclus, par ex. python2 DisplayCAL.pyw, ou installer le logiciel afin d’y avoir accès depuis le menu des applications de votre gestionnaire de bureau avec python2 setup.py install. Lancez python2 setup.py --help pour voir les options disponibles.

    Instructions d en une seule fois à partir du code source provenant de SVN :

    Lancez python2 setup.py pour créer le fichier de version afin de ne pas avoir de fenêtre de mise à jour au démarrage.

    Si le module d’extension pré-compilé qui fait partie des sources ne fonctionne pas pour vous, (dans ce cas, vous remarquerez que les dimensions de la fenêtre mobile ne correspondent pas exactement aux dimensions de la fenêtre sans marges générée par ArgyllCMS lors des mesures de l’écran) ou que vous désirez absolument le reconstruire, lancez python2 setup.py build_ext -i pour le reconstruire en partant de zéro (vous devez d’abord satisfaire aux exigences supplémentaires pour compiler le module d’extension en C).

    Installation

    Il est recommandé de tout d’abord supprimer toutes les versions précédentes à moins que vous n’ayez utilisé « Zero Install » pour l’obtenir.

    Installation du pilote de sonde de mesure sous Windows

    Vous n’avez besoin d’installer le pilote spécifique à Argyll que si votre sonde de mesure n’est pas un ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval ou K-10.

    Si vous utilisez Windows 8, 8.1, ou 10, vous devrez désactiver la vérification de signature du pilote avant de pouvoir l’installer. Si Secure Boot est activé dans la configuration de l’UEFI[12], vous devrez d’abord le désactiver. Référez-vous au manuel de votre carte-mère ou du micrologiciel (« firmware ») sur la manière de procéder. Il faut en général presser la touche Suppr lors du démarrage du système pour modifier la configuration du micrologiciel.

    Méthode 1 : Désactiver temporairement le contrôle de signature

    1. Windows 8/8.1 : Allez à « Paramètres» (survolez le coin en bas et à droite de l’écran, cliquez ensuite l’icône en forme d’engrenage) et sélectionnez « Arrêter » (l’icône de marche/arrêt).
      Windows 10 : Ouvrez le menu en survolant de la souris le coin en bas et à gauche de l’écran et en cliquant l’icône en forme de fenêtre)
    2. Sélectionner « Arrêter » (l’icône de marche/arrêt)
    3. Maintenez la touche MAJUSCULE enfoncée et cliquez « Redémarrer ».
    4. Sélectionner « Dépannage » → «  Options avancées » → « Paramètres » → « Redémarrer »
    5. Après le redémarrage, sélectionnez « Désactivez le contrôle obligatoire des signatures du pilotes » (numéro 7 de la liste ; il faut presser soit la touche 7 du pavé numérique, soit la touche de fonction F7)

    Méthode 2 : désactivez de manière permanente la vérification de signature du pilote

    1. Ouvrez une invite de commandes d’administrateur. Recherchez « Invite de commande » dans le menu démarrer de Windows, faites un clic-droit et sélectionner « Lancer en tant qu’administrateur »
    2. Lancez la commande suivante : bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS
    3. Lancez la commande suivante : bcdedit /set TESTSIGNING ON
    4. Redémarrez

    Pour installer le pilote spécifique à Argyll et qui est nécessaire pour certains instruments de mesure, lancez DisplayCAL et sélectionnez « Installer les pilotes de sonde de mesure d’ArgyllCMS… » depuis le menu « Outils ».

    Pour passer des pilotes d’ArgyllCMS à ceux du fabricant, lancez le gestionnaire de périphériques de Windows et recherchez la sonde de mesure dans la liste des périphériques. Elle peut se trouver sous l’une des entrées de niveau supérieur. Faites un clic-droit sur la sonde de mesure et sélectionnez « Mettre le pilote à jour… », choisissez ensuite « Rechercher un pilote logiciel sur mon ordinateur », « Laissez-moi choisir depuis une liste de pilotes sur mon ordinateur » et enfin sélectionnez dans la liste le pilote d’Argyll correspondant à votre sonde de mesure.

    Paquet Linux (.deb/.rpm)

    De nombreuses distributions permettent une installation facile des paquets par l’intermédiaire d’une application graphique de bureau, c’est-à-dire en faisant un double-clic sur l’icône du fichier du paquet. Veuillez consulter la documentation de votre distribution si vous n’êtes pas certain de la manière d’installer des paquets.

    Si vous ne pouvez pas accéder à votre sonde de mesure, essayez d’abord de la débrancher et de la reconnecter, ou redémarrez votre ordinateur. Si ceci ne résout pas le problème, lisez Installing ArgyllCMS on Linux: Setting up instrument access [en] (« Installer ArgyllCMS sous Linux : configurer l’accès à la sonde de mesure ».

    Mac OS X

    Montez l’image disque et option-glisser son icône vers votre dossier « Applications ». Ouvrez ensuite le dossier « DisplayCAL » de votre dossier « Applications » et glissez l’icône de DisplayCAL sur le dock si vous désirez y accéder facilement.

    Si vous désirez utiliser le colorimètre HCFR sous Mac OS X, suivez les instruction se trouvant sous « installing ArgyllCMS on Mac OS X [en] » (« Installer ArgyllCMS sous Mac OS X ») dans la documentation d’ArgyllCMS.

    Windows (Installateur)

    Lancez l’installateur qui vous guidera dans les différentes étapes nécessaires à la configuration.

    Si votre sonde de mesure n’est pas un ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval ni K-10, vous devrez installer un pilote spécifique à Argyll. Voir « Installation d’un pilote de sonde de mesure sous Windows ».

    Windows (archive ZIP)

    Décompressez l’archive et lancez simplement DisplayCAL depuis le dossier qui a été créé.

    Si votre sonde de mesure n’est pas un ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval ni un K-10, vous devrez installer un pilote spécifique à Argyll. Voir « Installation d’un pilote de sonde de mesure sous Windows ».

    Code source (toutes plateformes)

    Voir la section des « Prérequis » pour un fonctionnement direct depuis les sources.

    À partir de la version 0.2.5b de DisplayCAL, vous pouvez utiliser les commandes standard distutils/setuptools avec setup.py pour construire, installer et créer des paquets. sudo python setup.py install compilera les modules d’extension et effectuera une installation standard. Lancez python setup.py --help ou python setup.py --help-commands pour davantage d’informations. Quelques commandes et options supplémentaires ne faisant pas partie de distutils ni de setuptools (et qui n’apparaissent donc pas dans l’aide) sont aussi disponibles :

    Commandes de configuration supplémentaires

    0install
    Crée/met à jour des « feeds » 0install et crée des paquets d’applications Mac OS X pour faire tourner ces feeds.
    appdata
    Crée/met à jour le fichier AppData.
    bdist_appdmg (Mac OS X uniquement)
    Crée un DMG à partir des paquets d’applications précédemment créés (par les commandes py2app ou bdist_standalone), ou si utilisé conjointement à la commande 0install.
    bdist_deb (Linux/basé sur Debian)
    Crée un paquet Debian (.deb) pouvant être installé, un peu comme le fait la commande standard distutils bdist_rpm pour les paquets RPM. Prérequis : vous devez d’abord installer alien et rpmdb, créer une base de données RPM virtuelle via sudo rpmdb --initdb, éditer ensuite (ou créer initialement) le fichier setup.cfg (vous pouvez vous inspirer de misc/setup.ubuntu9.cfg comme exemple fonctionnel). Sous Ubuntu, exécuter utils/dist_ubuntu.sh va automatiquement utiliser le fichier setup.cfg correct. Si vous utilisez Ubuntu 11.04 ou toute autre distribution basée sur debian ayant Python 2.7 par défaut, vous devrez éditer /usr/lib/python2.7/distutils/command/bdist_rpm.py, et modifier la ligne install_cmd = ('%s install -O1 --root=$RPM_BUILD_ROOT ' en install_cmd = ('%s install --root=$RPM_BUILD_ROOT ' en supprimant l’indicateur -O1. Vous devrez aussi modifier /usr/lib/rpm/brp-compress afin qu’il n’ait aucune action (par ex. changez le contenu du fichier en exit 0, mais n’oubliez pas d’en créer une copie de sauvegarde auparavant) sinon, vous aurez des erreurs lors de la construction.
    bdist_pyi
    Peut remplacer bdist_standalone, et utilise PyInstaller plutôt que bbfreeze/py2app/py2exe.
    bdist_standalone
    Crée une application autonome qui n’exige pas d’installation de Python. Utilise bbfreeze sous Linux, py2app sous Mac OS X et py2exe sous Windows. setup.py essaiera de télécharger et d’installer automatiquement ces paquets pour vous — s’ils ne sont pas déjà installés — en utilisant le commutateur --use-distutils. Note : sous Mac OS X, les anciennes versions de py2app (avant 0.4) ne peuvent pas accéder aux fichiers situés à l’intérieur des fichiers « œufs» (« eggs ») de python (qui, de base, sont des dossiers compressé en ZIP). Setuptools, qui est nécessaire pour py2app, sera normalement installé sous la forme « d’œuf », ce qui empêche les anciennes versions des py2app d’accéder à son contenu. Afin de corriger ceci, vous devrez supprimer tous les fichiers setuptools-<version>-py<python-version>.egg déjà installés du répertoire site-packages de votre installation de Python (on le trouve en général sous /Library/Frameworks/Python.framework/Versions/Current/lib). Exécutez ensuite sudo python util/ez_setup.py -Z setuptools qui va installer setuptools « dépaqueté », permettant ainsi à py2app d’accéder à tous ses fichiers. Ceci n’est plus un problème avec py2app 0.4 ou plus récent.
    buildservice
    Crée des fichiers de contrôle pour openSUSE Build Service (ceci est aussi effectué implicitement lors de l’appel à sdist).
    finalize_msi (Windows uniquement)
    Ajoute les icônes et un raccourci dans le menu démarrer pour l’installateur MSI précédemment créé par bdist_msi. Le succès de la création de MSI nécessite une msilib patchée (information additionnelles).
    inno (Windows uniquement )
    Crée les scripts Inno Setup qui peuvent être utilisés pour compiler les exécutables de configuration pour les applications autonomes générées par les commandes py2exe ou bdist_standalone pour 0install.
    purge
    Supprime les répertoires ainsi que leur contenu build et DisplayCAL.egg-info.
    purge_dist
    Supprime le répertoire dist ainsi que son contenu.
    readme
    Crée README.html en analysant misc/README.template.html et en remplaçant les variables de substitution comme la date et les numéros de version.
    uninstall
    Désinstalle le paquet. Vous pouvez indiquer les mêmes options que pour la commande install.

    Options de configuration supplémentaires

    --cfg=<name>
    Utiliser un fichier setup.cfg de remplacement, par ex. adapté à une distribution de Linux donnée. Le fichier setup.cfg d’origine est préservé et il sera restauré ensuite. Le fichier de remplacement doit exister sous misc/setup.<name>.cfg
    -n, --dry-run
    N’effectue aucune action. Utile en combinaison avec la commande uninstall afin de voir les fichiers qui seraient supprimés.
    --skip-instrument-configuration-files
    Passer outre l’installation des règles udev et des scripts hotplug.
    --skip-postinstall
    Passer outre la post-installation sous Linux (une entrée sera cependant créée dans le menu des applications de votre bureau, mais elle pourra n’être visible qu’après que vous vous soyez déconnecté et reconnecté ou après que vous ayez redémarré l’ordinateur) et sous Windows (il ne sera créé aucun raccourci dans le menu Démarrer).
    --stability=stable | testing | developer | buggy | insecure
    Définir la stabilité de l’implémentation qui est ajoutée/mise à jour par la commande 0install.
    --use-distutils
    Forcer setup à utiliser distutils (par défaut) plutôt que setuptools pour la configuration. Ceci est utile en combinaison avec les commandes bdist*, parce que cela évite une dépendance artificielle sur setuptools. C’est en fait un commutateur, utilisez-le une fois et le choix sera mémorisé jusqu’à ce que vous utilisiez le commutateur --use-setuptools (voir paragraphe suivant).
    --use-setuptools
    Forcer setup à essayer d’utiliser setuptools plutôt que de distutils pour la configuration. Ceci est en fait un commutateur, utilisez-le une fois et le choix sera mémorisé jusqu’à ce que vous utilisiez le commutateur --use-distutils (voir ci-dessus).

    Paramétrage spécifique à la sonde de mesure

    Si votre appareil de mesure est un i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, vous pourrez importer les corrections du colorimètre qui font partie du paquet logiciel du fabricant. Ces corrections peuvent être utilisées pour obtenir une meilleure correspondance entre la sonde de mesure et un type particulier d’écran. Note : l’ensemble des modes de mesure de la Spyder 4/5 n’est disponible que si les corrections sont importées depuis le logiciel de la Spyder 4/5.

    Choisissez « Importer les corrections du colorimètre depuis un autre logiciel de caractérisation… » depuis le menu « Outils » de DisplayCAL.

    Si votre sonde de mesure est une Spyder 2, il vous faudra l’activer afin de profiter de son utilisation par ArgyllCMS et DisplayCAL. Choisissez « Activer le colorimètre Spyder 2… » depuis le menu « Outils » de DisplayCAL.

    Concepts de base de l’étalonnage et de la caractérisation d’un écran

    Si vous avez une expérience préalable de l’étalonnage et de la caractérisation, voyez plus loin. Si vous découvrez l’étalonnage d’écran, voici un aperçu rapide de ses concepts de base.

    Le comportement de l’écran est d’abord mesuré et ajusté pour correspondre à des caractéristiques-cibles définissables par l’utilisateur comme la luminosité, le gamma et le point blanc. Cette étape est en général appelée étalonnage (ou encore calibrage). L’étalonnage est effectué en agissant sur les commandes du moniteur et sur la sortie de la carte graphique (via des courbes d’étalonnage, qu’on appelle encore parfois courbes LUT[7] vidéo – faites attention à ne pas les confondre avec les profils basés sur des LUT, les différences sont expliquées ici) afin de s’approcher le plus possible de la cible choisie.
    Afin de satisfaire aux caractéristiques de la cible définie par l’utilisateur, il est généralement conseillé d’aller aussi loin que possible à l’aide des commandes du moniteur, et ensuite seulement, de manipuler la sortie de la carte vidéo par l’intermédiaire des courbes d’étalonnage qui seront chargées dans la table de gamma de la carte vidéo. Ceci permet d’obtenir les meilleurs résultats.

    On mesure ensuite la réponse de l’écran étalonné et un profil ICC[5] la décrivant est créé.

    De manière optionnelle et pour des raisons de commodité, l’étalonnage est enregistré dans le profil, mais il faut quand même les utiliser tous les deux pour obtenir des résultats corrects. Ceci peut conduire à certaines ambiguïtés, car le chargement des courbes d’étalonnage depuis le profil est généralement de la responsabilité d’un utilitaire tiers ou du système d’exploitation, alors que les applications qui utilisent le profil pour effectuer des transformations de couleur ne sont généralement pas au courant de l’étalonnage ou ne s’en préoccupent pas (et elles n’ont pas besoin de le faire). Actuellement, le seul système d’exploitation qui applique directement les courbes d’étalonnage est Mac OS X (sous Windows 7, vous pouvez l’activer, mais ceci est désactivé par défaut) – pour d’autres systèmes d’exploitation, DisplayCAL s’occupe de créer l’outil de chargement approprié.

    Même les applications non gérées en couleur tireront bénéfice de l’étalonnage une fois celui-ci chargé, car il est stocké dans la carte graphique – il est donc « global ». Mais l’étalonnage seul ne donnera pas des couleurs exactes – seules les applications entièrement gérées en couleur utiliseront les profils d’écran et les transformées de couleurs nécessaires.

    Il est regrettable que certaines applications de visualisation et d’édition d’images mettent en œuvre une gestion de la couleur boiteuse en n’utilisant pas le profil d’écran du système (ou en n’utilisant aucun profil d’écran du tout), mais un espace colorimétrique interne « par défaut » qu’il est parfois impossible de changer tel que sRGB. Elles envoient à l’écran la sortie non modifiée après conversion vers cet espace colorimétrique par défaut. Si la réponse réelle de l’écran est proche de sRGB, vous pourrez obtenir des résultats plaisants (même s’ils ne sont pas exacts), mais sur les écrans qui se comportent différemment, par exemple les écrans à gamut étendu, même les couleurs ternes peuvent avoir une forte tendance à devenir des néons.

    Note concernant les colorimètres, les écrans et DisplayCAL

    Les colorimètres ont besoin d’une correction matérielle ou logicielle afin qu’on puisse obtenir des résultats de mesures corrects depuis différents types de périphériques d’affichage (veuillez voir aussi “Wide Gamut Displays and Colorimeters” [en] (« Les colorimètres et les écrans à gamut large ») sur le site Web d’ArgyllCMS pour davantage d’informations). Ces derniers sont pris en charge si vous utilisez ArgyllCMS >= 1.3.0. Donc, si vous avez donc un écran et un colorimètre qui n’a pas été spécifiquement adapté à cet écran (c’est-à-dire ne comportant pas de correction matérielle), vous pouvez appliquer une correction calculée à partir de mesures d’un spectromètre afin d’obtenir de meilleurs résultats de mesures avec un tel écran.
    Il vous faut tout d’abord un spectromètre pour effectuer les mesures nécessaires à une telle correction. Vous pouvez aussi faire une recherche dans la base de données des corrections de colorimètres de DisplayCAL. Il y a aussi une liste de fichiers de correction de colorimètre sur le site web d’ArgyllCMS – veuillez remarquer cependant qu’une matrice créée pour une combinaison particulière d’une sonde de mesure et d’un écran peut ne pas bien fonctionner avec d’autres exemplaires de la même combinaison en raison de la dispersion entre sondes de mesure que l’on rencontre avec les colorimètres les plus anciens (à l’exception du DTP94). Des appareils plus récents, tels que l’i1 Display Pro/ColorMunki Display et peut-être le Spyder 4/5 semblent en être moins affectés.
    À partir de DisplayCAL 0.6.8, vous pouvez aussi importer des corrections génériques depuis certains logiciels de caractérisation en choisissant l’élément correspondant dans le menu « Outils ».

    Si vous achetez un écran fourni avec un colorimètre, la sonde de mesure devrait déjà avoir été, d’une manière ou d’une autre, adaptée à l’écran. Dans ce cas, vous n’avez donc pas besoin de correction logicielle.

    Note spéciale concernant les colorimètres X-Rite i1 Display Pro, ColorMunki Display et Spyder 4/5

    Ces sondes de mesure réduisent considérablement la somme de travail nécessaire pour les adapter à un écran, car elles intègrent dans le matériel la valeur des sensibilités spectrales de leurs filtres. Une simple lecture de l’écran à l’aide d’un spectromètre suffit donc pour créer la correction (à comparer à l’adaptation d’autres colorimètres à un écran, qui nécessite deux lectures, l’une effectuée avec un spectromètre et l’autre avec le colorimètre).
    Ceci signifie que n’importe qui ayant un écran particulier et un spectromètre peut créer le fichier spécial Colorimeter Calibration Spectral Set (.ccss) (« Ensemble spectral d’étalonnage de colorimètre ») de cet écran afin de l’utiliser avec ces colorimètres, sans qu’il soit nécessaire d’avoir un accès physique au colorimètre lui-même.

    Utilisation

    Vous pouvez choisir vos paramètres depuis la fenêtre principale. Lors des mesures d’étalonnage, une autre fenêtre vous guidera pour la partie interactive des réglages.

    Fichier de configuration

    Ici, vous pouvez charger un fichier de préréglage ou d’étalonnage (.cal) ou de profil ICC (.icc / .icm) obtenu lors d’une session précédente. Ceci positionnera les valeurs des options à celles enregistrées dans le fichier. Si le fichier ne contient qu’un sous-ensemble de paramètres, les autres options seront automatiquement réinitialisées à leurs valeurs par défaut (à l’exception des paramètres de la LUT 3D, qui ne seront pas réinitialisés si le fichier de paramètres ne comporte pas de paramètre de LUT 3D, et des paramètres de vérification, qui ne seront jamais réinitialisés automatiquement).

    Si on charge de cette manière un fichier d’étalonnage ou un profil, son nom sera affiché ici pour indiquer que les paramètres actuels reflètent ceux de ce fichier. De même, si un étalonnage est présent, on peut l’utiliser en tant que base lorsqu’on ne fait que « Caractériser uniquement ».
    Le fichier de paramètres choisi restera sélectionné tant que vous ne changez aucun des paramètres d’étalonnage ou de caractérisation, à une exception près : lorsqu’un fichier .cal ayant le même nom de base que le fichier des paramètres est présent dans le même répertoire, l’ajustement des contrôles de qualité et de caractérisation n’entraînera pas le déchargement du fichier des paramètres. Ceci vous permet d’utiliser un étalonnage déjà existant avec de nouveaux paramètres de caractérisation pour « Caractériser uniquement », ou pour mettre à jour un étalonnage existant avec des paramètres de qualité ou de caractérisation différents. Si vous modifiez les paramètres dans d’autres situations, le fichier sera déchargé (mais les paramètres actuels seront maintenus – le déchargement n’a lieu que pour vous rappeler que vous avez des paramètres qui ne correspondent plus à ceux de ce fichier), et les courbes d’étalonnage du profil actuel de l’écran seront restaurées (si elles existent, sinon, elles seront réinitialisées à linéaire).

    Lorsqu’un fichier d’étalonnage est sélectionné, la case à cocher « Mettre à jour l’étalonnage » devient disponible, ce qui prend moins de temps que de refaire un étalonnage à partir de zéro. Si un profil ICC[5] est détecté, et qu’un fichier d’étalonnage ayant le même nom de base est présent dans le même répertoire, le profil sera mis à jour avec le nouvel étalonnage. Si vous activez la case à cocher « Mettre à jour l’étalonnage », toutes les options ainsi que les boutons « Étalonner et caractériser » et « Caractériser uniquement » seront grisés, seul le niveau de qualité pourra être modifié.

    Paramètres prédéfinis (préréglages)

    À partir de DisplayCAL v0.2.5b, des paramètres prédéfinis correspondant à certains cas d’utilisation peuvent être sélectionnés depuis la fenêtre déroulante des paramètres. Je vous recommande fortement de ne PAS considérer ces préréglages comme les paramètres isolément « corrects » que vous devez absolument utiliser sans les modifier si votre cas d’utilisation correspond à leur description. Voyez-les plutôt comme un point de départ, à partir duquel vous pourrez travailler vos propres paramètres, optimisés (en ce qui concerne vos exigences, votre matériel, votre environnement et vos préférences personnelles).

    Pourquoi un gamma par défaut de 2.2 a-t-il été choisi pour certaine préréglages ?

    De nombreux écrans, que ce soient des CRT, LCD, Plasma ou OLED, ont une caractéristique de réponse proche d’un gamma approximatif de 2.2-2.4 (c’est le comportement natif réel des CRT, et les autres technologies tentent typiquement d’imiter les CRT). Une courbe de réponse-cible d’étalonnage qui soit raisonnablement proche de la réponse native d’un écran devrait aider à minimiser les artefacts d’étalonnage comme l’effet de bandes (« banding »), car les ajustements nécessaires des tables de gamma des cartes vidéo par les courbes d’étalonnage ne seront pas aussi forts que si l’on a choisi une réponse-cible éloignée de la réponse par défaut du moniteur.

    Bien sûr, vous pouvez et vous devriez modifier la courbe de réponse d’étalonnage pour une valeur adaptée à vos propres exigences. Par exemple, vous pouvez avoir un écran proposant un étalonnage et des contrôles de gamma matériels, et qui a été étalonné/ajusté de manière interne pour une courbe de réponse différente, ou la réponse de votre moniteur n’est simplement pas proche d’un gamma de 2.2 pour d’autres raisons. Vous pouvez lancer « Établir un rapport sur le périphérique d’affichage non étalonné » depuis le menu « Outils » afin de mesurer, parmi d’autres informations, le gamma général approximatif.

    Onglets

    L’interface utilisateur principale est divisée en onglets, chaque onglet donnant accès à un sous-ensemble de paramètres. Les onglets ne sont pas tous visibles à un moment donné. Les onglets non disponibles sont grisés.

    Choisir l’écran à étalonner et l’appareil de mesure

    Après avoir connecté la sonde de mesure, cliquez la petite icône avec les flèches enroulées qui se trouve entre les contrôles « Périphérique d’affichage » et « Sonde de mesure » afin de détecter les périphériques d’affichage et les sondes de mesure actuellement connectés.

    Choisir le périphérique d’affichage

    Les écrans directement connectés apparaîtront en tête de liste sous la forme « Display Name/Model @ x, y, w, h » avec x, y, w et h étant les coordonnées virtuelles de l’écran selon ses paramètres de résolution et de DPI. En plus des écrans directement connectés, quelques options supplémentaires sont disponibles :

    Web @ localhost

    Démarre un serveur autonome sur votre machine, qui permet alors à un navigateur local ou distant d’afficher des échantillons de couleur, par exemple pour étalonner/caractériser un smartphone ou une tablette.

    Notez que si vous utilisez cette méthode pour afficher des échantillons de couleurs, les couleurs seront affichées avec une précision de 8 bits par composante, et que tout économiseur d’écran ou économiseur d’énergie ne sera pas automatiquement désactivé. Vous serez aussi à la merci de toute gestion de la couleur appliquée par le navigateur web. Il est donc conseillé d’examiner et de configurer soigneusement une telle gestion de la couleur.

    madVR

    Fait afficher les échantillons de test en utilisant l’application de génération de motifs de test de madVR (« Test Pattern Generator — madTPG ») qui est fournir avec l’outil de rendu vidéo madVR (uniquement disponible sous Windows, mais vous pouvez vous connecter par le réseau local depuis Linux et Mac OS X). Notez qu’alors que vous pouvez ajuster les contrôles de configuration des motifs de test dans madTPG lui-même, vous ne devriez normalement pas modifier les contrôles « disable videoLUT » (« désactiver la LUT vidéo ») et « disable 3D LUT » (« désactiver la LUT 3D »), car ils seront automatiquement définis de manière appropriée lorsque vous ferez les mesures.

    Notez que si vous voulez créer une LUT 3D pour l’utiliser avec madVR, il y a un préréglage « LUT vidéo 3D pour madVR » disponible sous « Paramètres » qui configurera non seulement DisplayCAL afin qu’il utilise madTPG, mais aussi le format correct de LUT 3D et l’encodage pour madVR.

    Prisma

    Q, Inc./Murideo Prisma est un boîtier contenant un processeur vidéo et un générateur de motifs/3D LUT combinés qui est accessible par le réseau.

    Notez que si vous désirez créer une LUT 3D pour l’utiliser avec un Prisma, il y a un préréglage « LUT vidéo 3D pour Prisma » disponible sous « Paramètres », qui configurera non seulement DisplayCAL afin qu’il utilise Prisma, mais aussi le format correct de LUT 3D et d’encodage.

    Remarquez aussi que le Prisma a 1 Mo de mémoire interne pour enregistrer des LUT personnalisées, ce qui est suffisant pour environ 15 LUT 17x17x17. Vous devrez occasionnellement utiliser l’interface d’administration de Prisma à l’aide d’un navigateur web pour supprimer les anciennes LUT et faire de la place pour de nouvelles.

    Resolve

    Vous permet d’utiliser le générateur de motifs intégré du logiciel de montage vidéo et d’étalonnage colorimétrique DaVinci Resolve, qui est accessible par le réseau ou sur la machine locale. Voici la manière dont ceci fonctionne, vous démarrez une session d’étalonnage ou de caractérisation dans DisplayCAL, vous placer la fenêtre de mesures et cliquez « Démarrez les mesures ». Un message « En attente de connexion sur IP:PORT » doit apparaître. Notez les numéros d’IP et de port. Sous Resolve, passez à l’onglet « Color » (« Couleur ») et choisissez ensuite « Monitor Calibration » (« Étalonnage de l’écran »), « CalMAN » depuis le menu « Color » (avec Resolve version 11 et plus ancienne) ou le menu « Workspace » (« Espace de travail ») (avec Resolve 12).
    Entrez l’adresse IP dans la fenêtre qui s’ouvre (le numéro de port devrait être déjà rempli et cliquez « Connect » (« Connecter ») (si Resolve tourne sur la même machine que DisplayCAL, entrez localhost ou 127.0.0.1 à la place). La position de la fenêtre de mesure que vous avez placée précédemment sera reproduite sur l’écran que vous avez connecté via Resolve.

    Notez que si vous désirez créer une LUT 3D pour l’utiliser avec Resolve, il y a un préréglage « LUT vidéo 3D pour Resolve » disponible depuis « Paramètres » qui ne fera pas que configurer DisplayCAL pour utiliser Resolve, mais configurera aussi le format de LUT 3D et l’encodage corrects.

    Notez que si vous désirez créer une LUT 3D pour un écran directement connecté (par ex. pour le visualiseur de l’interface utilisateur graphique de Resolve), vous ne devrez pas utiliser le générateur de motifs de Resolve, mais plutôt sélectionner le périphérique d’affichage réel ce qui permet des mesures plus rapides (le générateur de motifs de Resolve apporte un délai supplémentaire).

    Non connecté

    Voir mesures d’écran non connecté. Veuillez remarquer que le mode non connecté ne devrait généralement être utilisé que si vous avez épuisé toutes les autres options.

    Choisir un mode de mesure

    Certaines sondes de mesure peuvent prendre en charge différents modes de mesure pour différents types de périphériques d’affichage. Il y a en général trois modes de mesure de base : « LCD », « à rafraîchissement » (par ex. les CRT et Plasma sont des écrans à rafraîchissement) et « Projecteur » (ce dernier n’est disponible que s’il est pris en charge par la sonde de mesure). Certaines sondes, comme la Spyder 4/5 et le ColorHug prennent en charge des modes de mesure supplémentaires, où un mode est couplé avec une correction prédéfinie du colorimètre (dans ce cas, la fenêtre déroulante de correction du colorimètre sera automatiquement définie à « aucune »).
    Des variantes de ces modes de mesures peuvent être disponibles en fonction de la sonde de mesure utilisée : le mode de mesure « adaptatif » des spectromètres utilise des temps d’intégration variables (ce qui est toujours le cas avec les colorimètres) afin d’accroître la précision des lectures des zones sombres. « HiRes » active le mode de haute résolution spectrale de spectromètres comme l’i1 Pro, ce qui peut accroître la précision des mesures.

    Compensation de la dérive lors de la mesure (uniquement disponible lors de l’utilisation d’ArgyllCMS >= 1.3.0)

    La compensation de la dérive du niveau de blanc tente de compenser les changements de luminance d’un écran au cours de son échauffement. Dans ce but, un échantillon blanc est mesuré périodiquement, ce qui augmente le temps total nécessaire aux mesures.

    La compensation de la dérive du niveau de noir tente de compenser les écarts de mesure causées par la dérive de l’étalonnage du noir lors de l’échauffement de la sonde de mesure. Dans ce but, un échantillon noir est périodiquement mesuré, ce qui accroît le temps total nécessaire aux mesures. De nombreux colorimètres sont stabilisés en température, dans ce cas, la compensation de la dérive du niveau de noir ne devrait pas être nécessaire, mais des spectromètres comme l’i1 Pro ou les ColorMunki Design/Photo ne sont pas compensés en température.

    Modifier le délai de mise à jour de l’écran (uniquement disponible avec ArgyllCMS >= 1.5.0, n’est visible que si « Afficher les options avancées » est activé dans le menu « Options »)

    Normalement, un délai de 200 ms est accordé entre l’instant du changement de la couleur des échantillons dans le logiciel, et l’instant où ce changement apparaît sur la couleur affichée elle-même. Avec certaines sondes de mesure (par ex. l’i1d3, l’i1pro, le ColorMunki, le Klein K10-A), ArgyllCMS mesurera et définira automatiquement un délai de mise à jour approprié lors de son étalonnage. Dans de rares situations, ce délai peut ne pas être suffisant (par ex. avec certains téléviseurs ayant des fonctions intensives de traitement de l’image activées), et un délai plus important peut être défini ici.

    Modifier le multiplicateur de temps d’établissement (uniquement disponible avec ArgyllCMS >= 1.7.0, n’est visible que si « Afficher les options avancées » est activé dans le menu « Options »)

    Normalement, le type de technologie de l’écran détermine le temps disponible entre l’instant d’apparition du changement de couleur d’un échantillon sur l’écran et l’instant où ce changement s’est stabilisé, et est considéré comme effectivement terminé à l’intérieur de la tolérance de mesure. Un écran CRT ou Plasma par exemple, peut avoir un temps d’établissement assez long en raison de la caractéristique de persistance du phosphore utilisé, alors qu’un LCD peut aussi avoir un temps d’établissement assez important en raison du temps de réponse des cristaux liquides et des temps de réponse des circuits d’amélioration (les sonde de mesure ne permettant pas de sélectionner le type de technologie de l’écran, comme les spectromètres, supposent le cas le plus pénalisant).
    Le multiplicateur de temps d’établissement permet aussi aux temps de montée et de descente du modèle d’être modifiés proportionnellement afin d’augmenter ou de réduire le temps d’établissement. Par exemple, un multiplicateur de 2.0 doublera le temps d’établissement, alors qu’un multiplicateur de 0.5 le diminuera de moitié.

    Choisir une correction de colorimètre pour un écran particulier

    Ceci peut améliorer la précision des colorimètres pour un type particulier d’écran, veuillez aussi consulter la note concernant les colorimètres, les écrans et DisplayCAL. Vous pouvez importer des matrices génériques provenant d’un autre logiciel de caractérisation d’écran ou rechercher dans la base de données en ligne des corrections de colorimètre une correspondance avec votre combinaison d’écran et de sonde de mesure (cliquez le petit globe près de la fenêtre déroulante de correction). On trouve aussi une liste participative de matrices de correction sur le site Web d’ArgyllCMS.

    Veuillez noter que cette option n’est disponible qu’avec ArgyllCMS >= 1.3.0 et un colorimètre.

    Paramètres d’étalonnage

    Réglage interactif de l’écran

    Désactiver ceci permet de passer directement aux mesures d’étalonnage et de caractérisation plutôt que de vous donner l’opportunité de toucher d’abord aux commandes de l’écran. Normalement, vous devriez laisser cette case cochée afin de pouvoir utiliser ces commandes pour amener l’écran au plus près des caractéristiques de la cible choisie.

    Observateur

    Pour voir ce réglage, vous devez avoir une sonde de mesure qui prenne en charge les lectures de spectre (c’est-à-dire un spectromètre) ou l’étalonnage d’échantillon spectral (par ex. l’i1 DisplayPro, le ColorMunki Display et les Spyder4/5), et aller dans le menu « Options » et y activer « Afficher les options avancées ».

    Cette option vous permet de sélectionner différents observateurs colorimétriques, qu’on appelle aussi fonction de correspondance de la couleur (CMF = « Color Matching Function »), pour les sondes de mesure qui le prennent en charge. La valeur par défaut est l’observateur standard 2° CIE 1931.

    Notez que si vous sélectionnez n’importe quoi d’autre que l’observateur standard 2° CIE 1931, alors les valeurs de Y ne seront pas en cd/m², parce que la courbe Y n’est pas la fonction de luminosité photopique V(λ) CIE 1924.

    Point blanc

    Permet de donner au locus du point blanc-cible la valeur de l’équivalent d’un spectre de lumière du jour ou du corps noir ayant la température donnée en kelvins, ou sous forme de coordonnées de chromaticité. Par défaut, la cible du point blanc sera le blanc natif de l’écran, et sa température de couleur et son delta E dans le « spectrum locus » de la lumière du jour seront affichés lors du réglage du moniteur. Il est recommandé d’effectuer les réglages afin de placer le point blanc de l’écran directement sur le locus de la lumière du jour. Si on indique une température de couleur de la lumière du jour, elle deviendra alors la cible de réglage, et les réglages recommandés sont ceux qui feront correspondre le point blanc du moniteur à celui de la cible. Des valeurs typiques peuvent être de 5000 K afin de correspondre à des sorties imprimées, ou de 6500 K, ce qui donne un aspect plus lumineux, plus bleu. Une température de point blanc différente de la température native du moniteur pourra limiter la luminosité maximum possible.

    Si vous désirez connaître le point blanc actuel de votre écran avant étalonnage, vous pouvez lancer « Établir un rapport sur le périphérique d’affichage non étalonné » depuis le menu « Outils » afin de le mesurer.

    Si vous désirez ajuster le point blanc aux chromaticités de votre éclairage ambiant, ou à celles d’une cabine de visualisation telle que celles utilisées en prépresse ou en photographie, et que votre sonde de mesure possède la fonction de mesure de la lumière ambiante (comme l’i1 Pro ou l’i1 Display, par exemple, avec leurs têtes de lecture respectives de la mesure de lumière ambiante), vous pouvez utiliser le bouton « Mesurer » (icône en forme de pipette) situé près des paramètres du point blanc. Si vous désirez mesurer la lumière ambiante, placez la sonde de mesure vers le haut, à côté du l’écran. Ou si vous désirez mesurer une cabine de visualisation, placez une carte sans métamérisme dans la cabine et pointez la sonde de mesure dans sa direction. Des renseignements supplémentaires sur la manière de mesurer la lumière ambiante se trouvent dans la documentation de votre sonde de mesure.

    Niveau de blanc

    Définissez la cible de luminosité du blanc en cd/m2. Si cette valeur ne peut être atteinte, la sortie la plus lumineuse possible sera choisie, tout en restant en adéquation avec la cible de point blanc. Remarquez que de nombreuses sondes de mesure ne sont pas particulièrement précises dans l’évaluation de la luminosité absolue de l’écran en cd/m2. Notez que certains écrans LCD se comportent de manière un peu étrange au voisinage de leur point blanc absolu, et peuvent donc présenter un comportement curieux pour des valeurs juste en dessous du blanc. Dans de tels cas, il peut être souhaitable, de régler la luminosité un peu en dessous du maximum dont est capable cet écran.

    Si vous désirez connaître le niveau de blanc actuel de votre écran non étalonné, lancez « Établir un rapport sur le périphérique d’affichage non étalonné » depuis le menu « Outils » afin de le mesurer.

    Niveau de noir

    (Pour afficher ce paramètre, allez dans le menu « Options » et activez « Afficher les options avancées »)

    Il peut être utilisé pour définir la luminosité-cible du noir en cd/m2 et est utile pour, par exemple, apparier deux écrans différents ayant des noirs natifs différents, en mesurant le niveau de noir de chacun d’eux (choisissez « Établir un rapport sur le périphérique d’affichage non étalonné » depuis le menu « Outils ») et en entrant la plus élevée des valeurs mesurées. Normalement, vous devriez cependant utiliser le niveau natif de noir afin de maximiser le rapport de contraste. Fixer une valeur trop élevée peut aussi conduire à des effets étranges, car elle interagit avec l’essai d’obtention de la cible « annoncée » de la forme de la courbe de tonalité. Utiliser un décalage du noir en sortie de 100% tente de minimiser de tels problèmes.

    Courbe de tonalité / gamma

    La courbe de réponse-cible est normalement une courbe exponentielle (sortie = entréegamma), et la valeur par défaut de gamma est de 2.2 (qui est proche de la réponse réelle d’un écran CRT typique). Quatre courbes prédéfinies peuvent aussi être utilisées : la courbe de réponse de l’espace colorimétrique sRGB, qui est une courbe exponentielle avec un segment rectiligne du côté des noirs et une réponse globale ayant un gamma approximativement égal à 2.2, la courbe L*, qui est la réponse de l’espace colorimétrique perceptuel CIE L*a*b*, la courbe de réponse vidéo normalisée Rec. 709 et la courbe de réponse vidéo normalisée SMPTE 240M.
    Un autre choix possible est « tel que mesuré » qui va omettre l’étalonnage de la table de gamma (LUT 1D) de la carte vidéo.

    Remarquez qu’un écran réel ne peut habituellement reproduire aucune de ces courbes idéales prédéfinies, car il a un point noir non nul, alors que les courbes idéales supposent que la luminosité est nulle pour une entrée de zéro.

    Pour les valeurs de gamma, vous pouvez aussi indiquer si elles doivent être interprétées comme relatives, ce qui signifie que la valeur de gamma fournie est utilisée pour définir une courbe de réponse réelle à la lumière du noir non nul de l’écran réel qui aurait la même sortie relative à une entrée de 50 % que la courbe de puissance gamma idéale, ou absolue, qui permet plutôt d’indiquer la valeur réelle de la puissance, ce qui signifie qu’après avoir pris en compte le noir non nul de l’écran réel, la réponse à une entrée de 50 % ne correspondra probablement pas à celle de la courbe de puissance idéale ayant cette valeur de gamma (Pour que ce paramètre soit visible, vous devez aller dans le menu « Options » et activer « Afficher les options avancées »).

    Afin de permettre d’avoir le niveau de noir non nul d’un écran réel, les valeurs de la courbe-cible seront, par défaut, décalées de manière à ce que cette entrée nulle donne le niveau de noir réel de cet écran (décalage de sortie). Ceci garantit que la courbe-cible correspondra mieux au comportement naturel typique des écrans, mais elle peut ne pas fournir une progression visuelle la plus régulière possible en partant du minimum de l’écran. Ce comportement peut être modifié en utilisant l’option de décalage du noir en sortie (voir ci-dessous pour davantage d’informations).

    Remarquez aussi que de nombreux espaces colorimétriques sont encodés avec un gamma approximatif de 2.2 et sont étiquetés comme tels (c’est-à-dire sRGB, REC 709, SMPTE 240M, Macintosh OS X 10.6), mais ils sont en fait prévus pour être affichés sur écrans CRT typiques ayant un gamma de 2.4, consultés dans un environnement sombre.
    Ceci parce que ce gamma de 2.2 gamma est un gamma-source dans des conditions d’observation claires telles que celles d’un studio de télévision, alors que les conditions d’observation typiques d’un écran sont comparativement plutôt sombres, et qu’une expansion du contraste d’un gamma de (approximativement) 1.1 est souhaitable pour que l’aspect des images soit semblable à ce qui était prévu.
    Si donc vous examinez des images encodées avec la norme sRGB, ou si vous visualisez des vidéos en utilisant l’étalonnage, simplement définir la courbe de gamma à sRGB ou REC 709 (respectivement) n’est probablement pas ce qu’il faut faire ! Il vous faudra probablement définir la courbe de gamma aux alentours de 2.4, de manière à ce que la plage de contraste soit dilatée de manière appropriée, ou alors utiliser plutôt sRGB ou REC 709 ou un gamma de 2.2 mais aussi indiquer les conditions de visualisation ambiantes réelles par un niveau d’éclairement en Lux. De cette manière, le contraste peut être amélioré de manière appropriée lors de l’étalonnage. Si votre sonde de mesure est capable de mesurer les niveaux de luminosité ambiante, vous pouvez alors le faire.
    (Vous trouverez des informations techniques détaillée concernant sRGB sur « A Standard Default Color Space for the Internet: sRGB [en] (« Un espace colorimétrique standard par défaut pour l’Internet : sRGB ») sur le site web de l’ICC[5] afin de comprendre la manière dont il est prévu de l’utiliser).

    Si vous vous demandez quelle valeur de gamma vous devriez utiliser, vous pouvez lancer « Établir un rapport sur le périphérique d’affichage non étalonné » depuis le menu « Outils » afin de mesurer menu, entre autres informations, le gamma global approximatif. Définir le gamma à la valeur indiquée peut alors vous aider à réduire les artefacts d’étalonnage, car les ajustements nécessaires de la table de gamma de la carte vidéo ne devraient alors pas être aussi importants que si l’on avait choisi un gamma plus éloigné de la réponse native de l’écran.

    Niveau de luminosité ambiante

    (Pour que ce paramètre soit visible, allez dans le menu « Options » et activez « Afficher les options avancées »)

    Comme il a été expliqué pour les paramètres de la courbe de tonalité, les couleurs sont souvent encodées dans une situation où les conditions de visualisation sont assez différentes de celles d’un écran typique, en espérant que cette différence de conditions d’observation sera prise en compte dans la manière dont l’écran est étalonné. L’option de niveau de luminosité ambiante est une manière de le faire. Par défaut, l’étalonnage ne fera aucune supposition en ce qui concerne les conditions de visualisation, mais l’étalonnage sera effectué pour la courbe de réponse indiquée. Mais si on entre, ou si on mesure le niveau de luminosité ambiante, un ajustement approprié des conditions de visualisation sera effectué. Avec une valeur de gamma ou pour sRGB, les conditions de visualisation d’origine seront supposées être celles des conditions de visualisation de la norme sRGB, alors qu’avec REC 709 et SMPTE 240M, il sera supposé que ce sont des conditions de visualisation d’un studio de télévision.
    Si vous indiquez ou si vous mesurez l’éclairage ambiant pour votre écran, un ajustement des conditions de visualisation basé sur le modèle d’apparence des couleurs CIECAM02 sera effectué pour la luminosité de votre écran et le contraste qu’il présente avec votre niveau d’éclairage ambiant.

    Veuillez noter que pour pouvoir mesurer le niveau de lumière ambiante, votre appareil de mesure doit être pourvu de la possibilité de mesurer la lumière ambiante (comme l’i1 Pro ou l’i1 Display, par exemple, avec leur tête respective de mesure de la lumière ambiante).

    Décalage du noir de sortie

    (Pour que ce paramètre soit visible, allez dans le menu « Options » et activez « Afficher les options avancées »)

    Contrairement à la courbe de réponse-cible, la réponse des écrans réels n’est pas nulle pour le noir. Il faut donc pouvoir le faire d’une manière ou d’une autre.

    La manière par défaut de le gérer (équivalent à un décalage de 100% du noir en sortie) est de le faire à la sortie de la courbe de réponse idéale en décalant et en redimensionnant proportionnellement les valeurs de sortie. Ceci définit une courbe qui correspondra aux réponses que procurent de nombreux autres systèmes et peut mieux correspondre à la réponse naturelle de l’écran, mais elle donnera une réponse visuellement moins uniforme depuis le noir.

    L’autre possibilité est de décaler et de redimensionner proportionnellement les valeurs d’entrée de la courbe de réponse idéale de manière à ce qu’une entrée nulle donne la réponse non nulle de l’écran réel. Ceci procure une progression visuellement plus régulière depuis le minimum de l’écran, mais cela peut être difficile à obtenir car c’est différent de la réponse naturelle de l’écran.

    Une subtilité est de fournir une répartition entre la proportion de décalage dont on tient compte en entrée de la courbe de réponse idéale, et la proportion prise en compte à la sortie, lorsque la taux est de 0.0, on prend l’ensemble comme décalage d’entrée et lorsqu’il est de 100% on prend l’ensemble comme décalage de sortie.

    Correction du point noir

    (Pour que ce paramètre soit visible, allez dans le menu « Options » et activez « Afficher les options avancées »)

    Normalement, dispcal va essayer que toutes les couleurs de l’axe neutre (R=V=B) aient la même teinte que le point blanc choisi. Aux alentours du point noir, les rouge, vert et bleu ne peuvent être qu’additionnés, non soustraits de zéro, donc essayer d’obtenir que les couleurs proches du noir aient la teinte désirée va les éclaircir jusqu’à un certain point. Avec un appareil ayant un bon rapport de contraste ou un point noir qui a sensiblement la même teinte que le point blanc, ce n’est pas un problème. Si le rapport de contraste de l’appareil n’est pas très bon, et que la teinte du noir est sensiblement différente de celle du point blanc choisi (ce qui est souvent le cas avec les écrans de type LCD), ceci peut avoir un effet fortement préjudiciable sur le rapport de contraste déjà limité. On peut contrôler ici le niveau de correction de la teinte du point noir.
    Par défaut, un facteur de 100 % est utilisé, ce qui est généralement correct pour les écrans « à rafraîchissement » tels que les CRT ou Plasma et un facteur de 0 % est utilisé pour les écrans de type LCD, mais vous pouvez passer outre ces valeurs avec des valeurs comprises entre 0 % (pas de correction) et 100 % (correction complète) ou activer le paramétrage automatique basé sur le niveau mesuré du noir de l’écran.

    Si vous choisissez une correction autre que totale, alors le point blanc sera presque toujours sous les courbes d’étalonnage résultantes, mais il va ensuite traverser vers le point noir natif ou de compromis.

    Taux de correction du point noir (uniquement disponible avec ArgyllCMS >= 1.0.4)

    (Pour que ce paramètre soit visible, allez dans le menu « Options » et sélectionnez « Afficher les options avancées »)

    Si le point noir n’est pas défini à une teinte exactement identique à celle du point blanc (parce que, par exemple, le facteur est inférieur à 100%), alors les courbes d’étalonnage résultantes auront le point blanc-cible qui sera la plupart du temps sous la courbe, mais il va ensuite se fondre avec le point noir natif ou de compromis qui est plus noir mais pas de la même teinte. Le taux de cette fusion peut être contrôlé. La valeur par défaut est de 4.0, ce qui donne une cible qui passe du point blanc-cible au noir, assez proche du point noir. Alors que ceci donne typiquement un bon résultat visuel, la teinte neutre de la cible étant maintenue au point pour lequel croisement vers la teinte noire n’est pas visible, cela peut être trop exigeant pour certains écrans (typiquement les écrans de type LCD), et il peut y avoir certains effets visuels en raison de l’incohérence de la couleur selon l’ange de vue. Dans cette situation, une valeur plus faible peut donner un meilleur résultat visuel (essayez, par exemple, des valeurs de 3.0 ou 2.0). Une valeur de 1.0 va définir une fusion entièrement linéaire du point blanc vers le point noir). S’il y a trop de coloration près du point noir, essayez des valeurs plus élevées comme 6.0 ou 8.0, par exemple.

    Vitesse d’étalonnage

    (Ce paramètre ne s’applique pas et est masqué si la courbe de tonalité est définie à « Telle que mesurée »)

    Détermine combien de temps et d’efforts sont nécessaires à l’étalonnage de l’écran. Plus la vitesse est faible, plus le nombre de tests de lecture effectués sera élevé, plus le nombre de passes d’affinage sera élevé, plus la tolérance de précision sera serrée et plus l’étalonnage de l’écran sera détaillé. Le résultat sera au final limité par la précision de la sonde de mesure, la répétabilité de l’écran et de la sonde, et par la résolution des entrées de la table de gamma de la carte vidéo et de ses entrées numériques ou analogiques (RAMDAC).

    Paramètres de caractérisation

    Qualité du profil

    Elle définit le niveau d’efforts et/ou de détails du profil résultant. Pour les profils basés sur des tables (LUT[7] = tables de correspondance), elle définit la taille de la table de correspondance principale, et en conséquence, la qualité du profil résultant. Pour les profils basés sur une matrice, elle définit le niveau de détail des courbes par canal et l’« effort » de correspondance.

    Compensation du point noir (activez « afficher les options avancées » dans le menu « Options »)

    (Note : cette option n’a pas d’effet si vous n’effectuez que l’étalonnage et la création d’un profil simple de courbes + matrice directement à partir des données d’étalonnage, sans mesures supplémentaires de caractérisation).

    Ceci évite de manière efficace l’écrasement du noir lors de l’utilisation du profil mais aux dépens de la précision. Il est généralement préférable de n’utiliser cette option que s’il n’est pas certain que les applications que vous allez utiliser ont une implémentation de haute qualité de la gestion de la couleur. Pour les profils basés sur des LUT, il existe des options plus évoluées (par exemple, les options avancées de transposition du gamut et l’utilisation soit de « Améliorer la résolution effective des tables colorimétriques PCS[11]-vers-périphérique », qui est activée par défaut, soit de « Transposition du gamut pour une intention perceptuelle », qui peut être utilisée pour créer une table perceptuelle qui transpose le point noir).

    Type de profil (activez « Afficher les options avancées » dans le menu « Options »)

    On distingue en général deux types de profils : basé sur des LUT[7] et basé sur une matrice.

    Les profils basés sur une matrice sont plus petits en taille de fichiers, un peu moins précis (bien que plus réguliers dans la plupart des cas) comparés aux types basés sur une LUT[7], et habituellement, ils présentent la meilleure compatibilité entre les CMM[2], les applications et les systèmes – mais ils ne prennent en charge que l’intention colorimétrique pour les transformées de couleur. Pour les profils basés sur une matrice, le PCS[11] (Profile Connection Space = espace de connexion du profil) est toujours XYZ. Vous pouvez choisir entre l’utilisation de courbes séparées pour chaque canal (rouge, vert et bleu), une courbe unique pour tous les canaux, des valeurs de gamma séparées pour chaque canal ou un seul gamma pour tous les canaux. Les courbes sont plus précises que les valeurs de gamma. Une courbe unique ou un gamma unique peuvent être utilisés si des courbes ou des valeurs de gamma individuelles dégradent l’équilibre des gris d’un étalonnage par ailleurs bon.

    Les profils basés sur des LUT[7] sont plus gros en taille de fichiers, plus précis (mais ce peut être au détriment de la régularité), dans certains cas, ils sont moins compatibles (les applications peuvent ne pas être à même de les utiliser ou présenter des bizarreries avec les profils de type LUT[7] ou certaines de leurs variantes). Lors du choix d’un type de profil basé sur les LUT[7], les options avancées de transposition du gamut sont rendues disponibles ce qui vous permet de les utiliser pour créer des tables perceptuelles ou de saturation à l’intérieur du profil en plus des tables colorimétriques par défaut qui sont toujours créées.
    L*a*b* ou XYZ peuvent être utilisés comme PCS[11], XYZ étant recommandé spécialement pour les écrans à gamut large parce que leurs primaires peuvent excéder la plage d’encodage de L*a*b* de l’ICC[5] (Note : sous Windows, les LUT[7] de type XYZ ne sont disponibles que si DisplayCAL utilise ArgyllCMS >= 1.1.0 en raison d’une exigence de balises de matrice dans le profil, qui ne sont pas créées par les versions antérieures d’ArgyllCMS).
    Comme il est difficile de vérifier si la LUT[7] d’un profil combiné LUT[7] XYZ + matrice est réellement utilisée, vous pouvez choisir de créer un profil avec une matrice inversée, c’est-à-dire bleu-rouge-vert à la place de rouge-vert-bleu, il sera ainsi évident de voir si une application utilise la matrice (délibérément fausse) à la place de la LUT (correcte) car les couleurs seront alors complètement fausses (par ex. tout ce qui devrait être rouge sera bleu, le vert sera rouge, le bleu sera vert, le jaune sera violet, etc.).

    Note : on pourrait confondre les profils basés sur des LUT[7] (qui contiennent des LUT tri-dimensionnelles) et les courbes LUT[7] (d’étalonnage) de la carte vidéo (LUT à une dimension), mais ce sont deux choses différentes. Les profils basés sur une LUT[7] comme ceux basés sur une matrice peuvent inclure des courbes d’étalonnage qui peuvent être chargées dans la table de gamma matérielle de la carte vidéo.

    Options avancées de transposition du gamut (activez « Afficher les options avancées » dans le menu « Options »)

    Vous pouvez choisir l’une quelconque des options suivantes après avoir sélectionné un profil de type LUT et avoir cliqué « Avancé… ». Note : les options « Tables PCS[11]-vers-périphérique de basse qualité » et « Améliorer la résolution effective de la table colorimétrique PCS[11]-vers-périphérique » sont mutuellement exclusives.

    Tables PCS[11]-vers-périphérique de basse qualité

    Choisissez cette option si le profil ne doit être utilisé qu’avec une transposition inverse de gamut périphérique-vers-PCS[11] afin de créer un lien de périphérique (« DeviceLink») ou une LUT 3D (DisplayCAL utilise toujours une transposition inverse périphérique-vers-PCS[11] du gamut lors de la création de Lien de périphérique/LUT 3D). Ceci réduit le temps de traitement nécessaire pour créer les tables PCS[11]-vers-périphérique. Ne choisissez pas cette option si vous désirez installer ou utiliser ce profil par ailleurs.

    Améliorer la résolution effective de la table colorimétrique PCS[11]-vers-périphérique

    Pour utiliser cette option, vous devez sélectionner un profil de type LUT XYZ. Cette option accroît la résolution effective de la table de correspondance couleur colorimétrique PCS[11] vers périphérique en utilisant une matrice afin de limiter l’espace XYZ et de remplir l’ensemble de la mire avec les valeurs obtenues en inversant la table périphérique-vers-PCS[11], tout en appliquant, de manière optionnelle, un lissage. Si aucune transposition du gamut CIECAM02 n’a été activée pour l’intention de rendu perceptuelle, une table perceptuelle simple mais efficace (qui est à peu près identique à la table colorimétrique, mais qui transpose le point noir à zéro) sera aussi générée.

    Vous pouvez aussi définir les dimensions de la table de correspondance interpolée. La valeur « Auto » par défaut utilise une résolution de base de 33x33x33 qui est augmentée au besoin et procure un bon équilibre entre la régularité et la précision. Abaisser la résolution peut améliorer la régularité (potentiellement aux dépens d’un peu de précision), alors que l’accroissement de la résolution peut potentiellement rendre le profil moins précis (aux dépens d’un peu de régularité). Notez que les calculs demanderont beaucoup de mémoire (>= 4 Go de RAM sont recommandés afin d’éviter les échanges sur disque) spécialement pour les résolutions les plus élevées.

    Voyez sur les images d’exemples ci-dessous les résultat auxquels vous pouvez vous attendre, où l’image d’origine a été convertie depuis sRGB ver le profil de l’écran. Notez cependant que l’image synthétique particulière choisie, un arc-en-ciel (« granger rainbow »), exagère l’effet de bandes, un matériau du monde réel aura moins tendance à le montrer. Notez aussi que le bleu sRGB de l’image se trouve hors gamut pour l’écran spécifique utilisé, et que les limites visibles dans le dégradé de bleu du rendu sont une conséquence du fait que la couleur soit hors gamut, et que la transposition du gamut atteint donc les limites moins régulières du gamut.

    Image Granger Rainbow d’origine

    Image originale « granger rainbow »

    Granger Rainbow - rendu colorimétrique par défaut

    Rendu colorimétrique par défaut (profil LUT XYZ 2500 OFPS)

    Granger Rainbow - rendu colorimétrique « lisse »

    Rendu colorimétrique « lisse » (profil LUT XYZ 2500 OFPS, A2B inversé)

    Granger Rainbow - rendu perceptuel « lisse »

    Rendu perceptuel « lisse » (profil LUT XYZ 2500 OFPS, A2B inversé)

    Intention de rendu par défaut du profil

    Elle définit l’intention de rendu par défaut. En théorie, les applications pourraient l’utiliser, en pratique, elles ne le font pas. Modifier ce paramètre n’aura probablement aucun effet quoi qu’il en soit.

    Transposition de gamut CIECAM02

    Note : lorsque l’on active l’une des options de transposition de gamut CIECAM02, et que le profil source est un profil à matrice, l’activation ensuite de l’amélioration de la résolution effective va aussi influencer la transposition de gamut CIECAM02, en la rendant plus douce, avec comme effet secondaire une génération plus rapide.

    Normalement, les profils créés par DisplayCAL n’incorporent que l’intention de rendu colorimétrique, ce qui signifie que les couleurs se trouvant hors du gamut de l’écran seront écrêtées à la couleur la plus proche comprise dans le gamut. Les profils de type LUT peuvent aussi avoir une transposition de gamut en implémentant des intentions de rendu perceptuelle et/ou de saturation (compression ou expansion du gamut). Vous pouvez choisir si vous désirez en utiliser une et laquelle de celles-ci en indiquant un profil source et en marquant les cases à cocher appropriées. Notez qu’un profil d’entrée, de sortie, d’écran ou d’espace de couleur de périphérique doit être indiqué comme source, et non un espace colorimétrique non associé à un périphérique, un lien de périphérique, un profil de couleur nommé ou abstrait. Vous pouvez aussi choisir les conditions d’observation qui décrivent l’utilisation prévue à la fois de la source et du profil et du profil d’affichage qui est sur le point d’être créé. Une condition d’observation appropriée de la source est automatiquement choisie en se basant sur le type du profil source.

    Une explication des intentions de rendu disponibles se trouve dans la section des LUT 3D « Intention de rendu ».

    Pour davantage d’informations sur la justification d’un gamut source, voir « About ICC profiles and Gamut Mapping [en] » (« À propos des profils ICC et de la transposition du gamut ») dans la documentation d’ArgyllCMS.

    Une stratégie pour obtenir les meilleurs résultats perceptuels avec des profils d’écran est la suivante : sélectionnez un profil CMJN comme source pour la transposition de gamut. Ensuite, lors de la conversion depuis un autre profil RVB vers le profil d’affichage, utilisez une intention de rendu de colorimétrie relative, et si vous faites la conversion depuis un profil CMJN, utilisez l’intention perceptuelle..
    Une autre approche particulièrement utile les écrans à gamut limité est de choisir un des profils source les plus larges (en ce qui concerne le gamut) avec lequel vous travaillez habituellement pour la transposition de gamut, et ensuite de toujours utiliser l’intention perceptuelle lors de la conversion vers le profil d’affichage.

    Veuillez noter que toutes les applications ne prennent pas en charge une intention de rendu pour les profils d’affichage et peuvent, par défaut, utiliser colorimétrique (par ex. Photoshop utilise normalement la colorimétrie relative avec une compensation du point noir, mais il peut utiliser différentes intentions par l’intermédiaire de paramètres personnalisés d’épreuvage à l’écran).

    Fichier de mire de test
    Vous pouvez choisir ici les échantillons de test utilisés lors de la caractérisation de l’écran. Le paramètre par défaut optimisé « Auto » prend en compte les caractéristiques réelles de l’écran. Vous pouvez encore augmenter la précision potentielle de votre profil en accroissant le nombre d’échantillons à l’aide du curseur.
    Éditeur de mire de test

    Les mires de test fournies par défaut devraient fonctionner correctement dans la plupart des situations, mais vous permettre de créer des mires personnalisées vous assure un maximum de flexibilité lors de la caractérisation d’un écran et peut améliorer la précision et l’efficacité de la caractérisation. Voir aussi optimisation des mires de test.

    Options de génération des mires de test

    Vous pouvez entrer le nombre d’échantillons qui seront générés pour chaque type d’échantillon (blanc, noir, gris, canal unique, itératif et étapes cubiques multidimensionnelles). L’algorithme d’itération peut être ajusté si on doit générer plus que zéro échantillons. Ce qui suit est une rapide description des différents algorithmes itératifs disponibles, « espace du périphérique » signifie dans ce cas coordonnées RVB, et « espace perceptuel » signifie les nombres XYZ (supposés) de ces coordonnées RVB. Les nombres XYZ supposés peuvent être influencés en fournissant un profil précédant, ce qui permet donc le placement optimisé du point de test.

    • Optimized Farthest Point Sampling (OFPS) (« Échantillonnage optimisé du point le plus éloigné ») optimisera les emplacements des points pour minimiser la distance depuis n’importe quel point de l’espace du périphérique vers le point d’échantillonnage le plus proche ;
    • Incremental Far Point Distribution (« Distribution incrémentale du point éloigné») va rechercher de manière incrémentale les points de test que se trouvent aussi éloignés que possible d’un quelconque point existant ;
    • Device space random (« Aléatoire dans l’espace du périphérique ») choisit les points de test avec une distribution aléatoire régulière dans l’espace du périphérique ;
    • Perceptual space random (« Aléatoire dans l’espace perceptuel ») choisit les points de test avec une distribution aléatoire régulière dans l’espace perceptuel ;
    • Device space filling quasi-random (« Remplissage quasi-aléatoire de l’espace du périphérique ») choisit les points de test avec une distribution quasi-aléatoire de remplissage de l’espace, dans l’espace du périphérique ;
    • Perceptual space filling quasi-random (« Remplissage quasi-aléatoire de l’espace perceptuel ») choisit des points de tests avec une distribution quasi-aléatoire de remplissage de l’espace dans l’espace perceptuel ;
    • Device space body centered cubic grid (« grille cubique centrée dans le corps de l’espace du périphérique ») choisit les points de tests avec une distribution cubique centrée dans le corps dans l’espace du périphérique ;
    • Perceptual space body centered cubic grid (« grille cubique centrée dans le corps de l’espace perceptuel ») choisit les points de test avec une distribution cubique centrée dans le corps dans l’espace perceptuel.

    Vous pouvez définir le niveau d’adaptation aux caractéristiques connues du périphérique utilisées par l’algorithme par défaut de dispersion complète (OFPS). Un profil de préconditionnement devrait être fourni si l’adaptation est définie au-dessus d’un niveau bas. Par défaut, l’adaptation est de 10 % (basse), et devrait être définie à 100 % (maximum) si un profil est fourni. Mais si, par exemple, le profil de préconditionnement ne représente pas très bien le comportement du périphérique, une adaptation plus basse que 100 % peut être appropriée.

    Pour les distributions de grille centrée sur le corps, le paramètre d’angle définit l’angle global de la distribution de mire.

    Le paramètre « Gamma » définit une valeur de fonction semblable à une puissance (afin d’éviter une compression excessive qu’une vraie fonction puissance apporterait) qui sera appliquée à toutes les valeurs du périphérique après qu’elles ont été générées. Une valeur supérieure à 1.0 va entraîner un espacement plus serré des valeurs de test situées près de la valeur 0.0, alors que des valeurs inférieures à 1.0 créeront un espacement plus serré près de la valeur 1.0. Notez que le modèle de périphérique utilisé pour créer les valeurs d’échantillons attendues ne prend pas en compte la puissance appliquée, les algorithmes plus complexes de distribution complète ne prendront pas davantage en compte la puissance.

    Le paramètre d’accentuation de l’axe neutre permet de changer le niveau avec lequel la distribution des échantillons doit accentuer l’axe neutre. Comme l’axe neutre est regardé comme la zone visuellement la plus critique de l’espace colorimétrique, placer davantage d’échantillons de mesure dans cette zone peut aider à maximiser la qualité du profil résultant. Cette accentuation n’est efficace que pour les distributions d’échantillons perceptuelles, et pour la distribution OFPS par défaut si le paramètre d’adaptation est défini à une valeur trop élevée. C’est aussi le plus efficace lorsqu’un profil de préconditionnement est fourni, car c’est la seule manière de détermination du neutre. La valeur par défaut de 50 % procure un effet d’environ deux fois l’accentuation de la formule Delta E CIE94.

    Le paramètre d’accentuation de la région sombre permet de changer le niveau avec lequel la distribution d’échantillons doit accentuer la région sombre de la réponse du périphérique. Les périphériques d’affichage utilisé pour la vidéo ou la reproduction de film sont typiquement visualisés dans des environnements de visualisation sombres sans référence blanche forte, et ils emploient typiquement une plage de niveaux de luminosité dans les différentes scènes. Ceci signifie souvent que la réponse des périphériques dans les régions sombres a une importance particulière, donc augmenter le nombre relatif de points d’échantillonnage dans la région sombre peut améliorer l’équilibre de la précision du profil résultant pour la vidéo ou la reproduction de film. Cette accentuation n’est efficace qu’avec les distributions perceptuelles des échantillons pour lesquelles un profil de préconditionnement est fourni. La valeur par défaut de 0 % n’apporte aucune accentuation des régions sombres. Une valeur autour de 15 %-30 % est un bon point de départ pour l’utilisation vidéo d’un profil. Une version réduite de ce paramètre sera passée au profileur. Notez que l’accroissement de la proportion d’échantillons sombres va typiquement allonger le temps que la sonde de mesure prendra pour lire l’ensemble de la mire. Accentuer la caractérisation de la région sombre réduira la précision des mesures et de la modélisation des régions plus claires, pour un nombre donné de points de test et une qualité de profil/résolution de mire donnée. Le paramètre sera aussi utilisé d’une manière analogue à la valeur « Gamma » pour modifier la distribution d’un seul canal, de l’échelle de gris et des étapes multidimensionnelles.

    L’option « Limiter les échantillons à la sphère » est utilisée pour définir une sphère L*a*b* permettant filtrer les points de test. Seuls les points de test compris à l’intérieur de la sphère (définie par son centre et son rayon) feront partie de la mire de test. Ceci peut être bien pour cibler des points de test supplémentaires sur un zone à problème d’un périphérique. La précision de la cible L*a*b* sera meilleure lorsqu’un profil de préconditionnement raisonnablement précis est choisi pour le périphérique. Notez que le nombre réel de points généré peut être difficile à prévoir, et il dépendra du type de génération utilisé. Si les méthodes OFPS, aléatoire dans l’espace du périphérique et l’espace perceptuel et remplissage semi-aléatoire de l’espace du périphérique sont utilisées, alors le nombre de points cible sera obtenu. Toutes les autres méthodes de génération de points vont générer un nombre de points plus faible qu’attendu. Pour cette raison, la méthode de remplissage quasi-aléatoire de l’espace du périphérique est probablement la plus facile à utiliser.

    Génération de vues 3D de diagnostic des mires de test

    Vous pouvez générer des vues 3D de différents formats. Le format par défaut est HTML, il peut être visualisé dans un navigateur ayant la fonctionnalité WebGL active. Vous pouvez choisir le ou les espaces colorimétriques dans lequel vous désirez que s’affichent les résultats et aussi contrôler si vous désirez utiliser le décalage RVB du noir (qui va éclaircir les couleurs sombres afin qu’elles soient mieux visibles) et si vous désirez que le blanc soit neutre. Toutes ces options sont purement visuelles et n’influencent pas les échantillons de test réels.

    Autres fonctions

    Si vous générez un nombre quelconque d’échantillons itératifs ainsi que des échantillons d’un canal isolé, gris ou multidimensionnels, vous pouvez ajouter les échantillons de canal isolé, gris ou multidimensionnels lors d’une étape séparée en maintenant la touche majuscule tout en cliquant « Créer la mire de test ». Ceci évite que ces échantillons n’affectent la distribution itérative des échantillons, avec l’inconvénient de rendre la distribution moins régulière. Ceci est une fonctionnalité expérimentale.

    Vous pouvez aussi :

    • Exporter les échantillons sous forme de fichiers CSV, TIFF, PNG ou DPX, et définir le nombre de fois que l’échantillon doit être répété lors de l’exportation sous forme d’images après avoir cliqué le bouton « Exporter » (les échantillons noirs seront répétés selon la valeur « Max », et les échantillons blancs selon la valeur « Min », et les échantillons se trouvant entre les deux, selon leur clarté dans L* redimensionnée proportionnellement à une valeur comprise entre « Min » et « Max ») ;
    • Ajouter des balayages de saturation qui sont souvent utilisés dans un contexte vidéo ou de film pour vérifier la saturation des couleurs. Un profil de préconditionnement doit être utilisé pour l’activer ;
    • Ajouter des échantillons de référence depuis des fichiers de mesure au format CGATS, à partir de profils de couleur ICC nommés, ou en analysant des images TIFF, JPEG ou PNG. Un profil de préconditionnement doit être utilisé pour activer ceci ;
    • Trier les échantillons selon divers critères de couleur (attention : ceci va interférer avec l’optimisation de l’ordre des échantillons d’ArgyllCMS 1.6.0 ou plus récent qui minimise les temps de mesure, donc le tri manuel ne devrait être utilisé que pour l’inspection visuelle de mires de test, ou s’il est nécessaire pour optimiser l’ordre des échantillons pour les mesures non connectées en mode automatique où il est utile de maximiser la différence de clarté d’un échantillon à l’autre de manière à ce que ce soit plus facile pour l’automatisme de détecter les changements).

    Éditeur d’échantillons

    Les commandes de l’éditeur d’échantillons ayant un comportement de feuille de calculs sont les suivantes :

    • Pour sélectionner les échantillons, cliquez et glisser la souris sur les cellules de la table, ou maintenez la touche Majuscules (sélection de plage) ou Ctrl/Cmd (pour ajouter ou supprimer une seule cellule ou ligne à ou de la sélection) ;
    • Pour ajouter un échantillon sous un de ceux qui existent, faites un double-clic sur l’étiquette d’une ligne ;
    • Pour supprimer des échantillons, sélectionnez-les, ensuite maintenez la touche Ctrl (Linux, Windows) ou Cmd (Mac OS X) et pressez la touche Suppr ou retour arrière (qui supprimera toujours l’ensemble de la ligne même si une seule cellule est sélectionnée) ;
    • Ctrl-c/Ctrl-v/Ctrl-a = copier/coller/tout sélectionner.

    Si vous désirez insérer un certain nombre d’échantillons générés dans une application de feuille de calculs (en tant que coordonnées RVB dans la plage 0.0-100.0 par canal), la manière la plus simple de le faire et de les enregistrer en tant que fichier CSV et de les glisser-déposer sur la fenêtre de l’éditeur de mire de test pour l’importer.

    Nom du profil

    Tant que vous n’entrez pas votre propre texte ici, le nom du profil est généré automatiquement à partir des options d’étalonnage et de caractérisation choisies. Le mécanisme de nommage automatique crée des noms assez longs qui ne sont pas nécessairement agréables à lire, mais ils peuvent vous aider à identifier le profil.
    Notez aussi que le nom du profil n’est pas seulement utilisé pour le profil résultant mais aussi pour tous les fichiers intermédiaires (les extensions de nom de fichier sont automatiquement ajoutées) et tous les fichiers sont stockés dans un répertoire portant ce nom. Vous pouvez choisir l’emplacement où sera créé ce dossier en cliquant l’icône en forme de disque située près du champ (sa valeur par défaut est l’emplacement par défaut des données de l’utilisateur).

    Voici un exemple sous Linux, sur d’autres plate-formes, certaines extensions de fichiers et l’emplacement du répertoire personnel seront différents. Voir emplacements des données de l’utilisateur et du fichier de configuration. Vous pouvez placer le curseur de la souris sur les noms de fichiers afin d’obtenir une bulle d’aide contenant une courte description du rôle de ce fichier :

    Chemin d’enregistrement du profil choisi :~/.local/share/DisplayCAL/storage

    Nom du profil : mydisplay

    Le répertoire suivant sera créé : ~/.local/share/DisplayCAL/storage/mydisplay

    Lors de l’étalonnage et de la caractérisation, les fichiers suivants seront créés :

    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs ClayRGB1998.log
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs ClayRGB1998.wrz
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs sRGB.log
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs sRGB.wrz
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.cal
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.gam.gz
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.icc
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.log
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.ti1
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.ti3
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.wrz

    Tous les fichiers de correction du colorimètre seront aussi copiés dans le dossier du profil.

    Étalonnage / caractérisation

    Si la différence entre étalonnage et caractérisation n’est pas claire pour vous, voir « Calibration vs. Characterization [en] (« Étalonnage comparé à Caractérisation ») dans la documentation d’ArgyllCMS.

    Veuillez laisser l’écran se stabiliser pendant au moins une demi-heure après l’avoir allumé avant de commencer les mesures ou d’estimer ses propriétés de couleur. Pendant ce temps, vous pouvez utiliser normalement l’écran avec d’autres applications.

    Après avoir défini vos options, cliquez le bouton en bas pour démarrer le processus réel d’étalonnage et de caractérisation. La fenêtre principale sera masquée pendant les mesures, et devrait revenir une fois qu’elles sont terminées (ou après une erreur). Vous pouvez toujours annuler une mesure en cours en utilisant le bouton « Annuler » dans le dialogue d’avancement, ou en pressant Échap ou Q. L’examen de la fenêtre du journal d’information (depuis le menu « Outils ») après les mesures vous donnera accès aux données brutes de sortie des outils en ligne de commandes d’ArgyllCMS et d’autres informations « bavardes ».

    Régler l’écran avant l’étalonnage

    Si vous cliquez « Étalonner » ou « Étalonner et Caractériser » et que vous n’avez pas décoché « Réglage interactif de l’écran », une fenêtre interactive d’ajustement de l’écran vous sera présentée dont certaines options sont destinées à vous aider à amener les caractéristiques de l’écran au plus proche des valeurs-cibles choisies. Selon que vous avez un écran de type « À rafraîchissement » ou de type LCD, je vais tenter de vous donner ici quelques recommandations concernant les options à ajuster et celle que vous pouvez passer.

    Régler un écran LCD

    Pour les écrans LCD, dans la plupart des cas, vous ne pourrez ajuster que le point blanc (si l’écran a un gain RVB ou d’autres contrôles du point blanc) et le niveau de blanc (le niveau de blanc affecte aussi celui de noir à moins que vous n’ayez un modèle avec une atténuation locale des LED), comme il manque à de nombreux LCD le « décalage » nécessaire pour ajuster le point noir (et même s’ils l’ont, il modifie souvent la température de couleur globale et pas uniquement le point noir). Remarquez aussi que sur la plupart des écrans LCD vous devriez laisser la commande de « contraste » à sa valeur par défaut (d’usine).

    Point blanc
    Si votre écran possède des commandes de gain RVB, de température de couleur ou de point blanc, la première étape doit être d’ajuster le point blanc. Notez que vous pouvez aussi tirer profit de ces réglages si vous avez défini le point blanc-cible à « natif ». Ceci vous permet de le rapprocher davantage du locus de la lumière du jour ou du corps noir, ce qui peut aider le système visuel humain à mieux s’adapter au point blanc. Regardez les barres affichées lors des mesures pour ajuster les gains RVB et minimiser le delta E avec le point blanc-cible.
    Niveau du blanc
    Poursuivez avec le réglage du niveau du blanc. Si vous avez défini un point blanc-cible, vous pouvez réduire la luminosité de votre écran (idéalement en n’utilisant que le rétroéclairage) jusqu’à ce que la valeur désirée soit atteinte (c’est-à-dire que la barre se termine à la position centrale indiquée). Si vous n’avez pas défini de cible, réglez simplement l’écran pour obtenir une luminosité visuellement agréable qui ne fatigue pas l’œil.
    Régler un écran « à rafraîchissement » tel qu’un CRT ou un Plasma
    Niveau du noir
    Sur les écrans de type « à rafraîchissement », ce réglage est habituellement effectué à l’aide de la commande de « luminosité ». Vous pouvez augmenter ou réduire la luminosité de l’écran jusqu’à ce que le niveau de noir désiré soit atteint (c’est-à-dire que la barre se termine à la position centrale indiquée).
    Point blanc
    L’étape suivante est le réglage du point blanc, en utilisant les commandes de gain RVB de l’écran ou d’autres moyens d’ajuster le point blanc. Notez que vous pouvez aussi tirer profit de ces réglages si vous avez défini le point blanc-cible à « natif ». Ceci vous permet de le rapprocher davantage du locus de la lumière du jour ou du corps noir, ce qui peut aider le système visuel humain à mieux s’adapter au point blanc. Regardez les barres affichées lors des mesures pour ajuster les gains RVB et minimiser le delta E avec le point blanc-cible.
    Niveau du blanc
    Poursuivre avec le réglage du niveau du blanc. Sur les écrans de type « à rafraîchissement », ceci est généralement effectué à l’aide de la commande de « contraste ». Si vous avez défini un point blanc-cible, vous pouvez réduire ou augmenter le contraste jusqu’à ce que la valeur désirée soit atteinte (c’est-à-dire que la barre atteigne la position centrale indiquée). Si vous n’avez pas défini de cible, ajustez simplement l’écran à un niveau visuellement agréable qui ne provoque pas de fatigue oculaire.
    Point noir
    Si votre écran possède des réglages de décalage RVB, vous pouvez aussi régler le point noir à peu près de la même manière que vous avez réglé le point blanc.
    Terminer les réglages et démarrer l’étalonnage et la caractérisation

    Enfin, sélectionner « Poursuivre avec l’étalonnage et la caractérisation » pour lancer la partie non interactive. Vous pouvez aller prendre un café ou deux, car le processus prend pas mal de temps, particulièrement si vous avez sélectionné un niveau de qualité élevé. Si vous ne désiriez qu’avoir une aide pour régler l’écran et ne désirez pas ou n’avez pas besoin de créer les courbes d’étalonnage, vous pouvez choisir de quitter en fermant la fenêtre des réglages interactifs et en sélectionnant « Caractériser uniquement » depuis la fenêtre principale.
    Si vous aviez initialement choisi « Étalonner et caractériser » et que vous satisfaisiez aux exigences de l’étalonnage et de la caractérisation sans intervention, les mesures de caractérisation du processus de caractérisation devraient démarrer automatiquement une fois l’étalonnage terminé. Sinon, vous serez obligé d’enlever la sonde de mesure de l’écran afin de réaliser un auto-étalonnage du capteur de la sonde avant de lancer les mesures de caractérisation.

    Optimisation des mires de test pour améliorer la précision et l’efficacité de la caractérisation

    La manière la plus facile d’utiliser une mire de test optimisée pour la caractérisation est de définir la mire de test à « Auto » et d’ajuster le curseur du nombre d’échantillons au nombre d’échantillons désiré. L’optimisation sera effectuée automatiquement lors des mesures de caractérisation (ceci augmentera d’une certaine valeur les temps de mesure et de traitement).
    Vous pouvez aussi, si vous le désirez, générer vous-même une mire optimisée avant un nouveau processus de caractérisation, ce qui peut se faire de la manière suivante :

    • Prendre un profil d’écran précédent et le sélectionner depuis « Paramètres » ;
    • Sélectionner l’une des mires optimisées (« optimisée pour… ») de la dimension désirée afin de l’utiliser comme base et appeler l’éditeur de mire de test ;
    • Près de « Profil de préconditionnement », cliquer sur « profil actuel ». Il devrait automatiquement choisir le profil que vous aviez choisi précédemment. Placer alors une marque dans la case à cocher. S’assurer que l’adaptation est définie à un niveau élevé (par ex. 100 %) ;
    • Si désiré, ajuster le nombre d’échantillons et s’assurer que le nombre d’échantillons itératifs n’est pas nul ;
    • Créer la mire et la sauvegarder. Cliquer « oui » lorsqu’il vous est demandé de sélectionner la mire venant d’être générée ;
    • Lancer les mesures de caractérisation (par ex ., cliquez « Étalonner et caractériser » ou « Caractériser uniquement »).

    Installer le profil

    Lors de l’installation d’un profil après l’avoir créé ou mis à jour, un élément de démarrage permettant de charger ses courbes d’étalonnage à la connexion sera créé (sous Windows et Linux, Mac OS X n’a pas besoin d’un chargeur). Vous pouvez aussi empêcher ce chargeur de faire quoi que ce soit en supprimant la coche dans la case « Charger les courbes d’étalonnage à la connexion » dans la fenêtre d’installation du profil, et si vous utilisez Windows 7 ou ultérieur, vous pouvez laisser le système d’exploitation gérer le chargement de l’étalonnage (notez que le chargeur interne d’étalonnage de Windows 7 n’offre pas la même qualité que le chargeur de DisplayCAL/ArgyllCMS en raison d’un redimensionnement proportionnel et d’une quantification erronées).

    Créer des LUT 3D

    Vous pouvez créer, en tant qu’élément du processus de caractérisation, des LUT 3D de correction RGB-in/RGB-out (afin de les utiliser pour la reproduction de vidéo ou avec des applications de retouche ou des appareils qui ne prennent pas ICC en charge).

    Paramètres des LUT 3D

    Créer une LUT 3D après la caractérisation
    Après la caractérisation, il vous sera normalement proposé d’installer le profil pour le rendre disponible aux applications bénéficiant d’une gestion ICC de la couleur. Si cette case est cochée, vous aurez plutôt la possibilité de créer une LUT 3D (avec les paramètres choisis), et les paramètres de la LUT 3D seront aussi enregistrés dans le profil de manière à ce qu’ils puissent être facilement restaurés, si nécessaire, en sélectionnant le profil depuis « Paramètres ». Si cette case n’est pas cochée, vous pouvez créer une LUT 3D depuis un profil existant.
    Espace colorimétrique source / profil source
    Ceci définit l’espace colorimétrique source de la LUT 3D. C’est généralement un espace colorimétrique standard destiné à la vidéo tel que celui définir par Rec. 709 ou Rec. 2020.
    Courbe de tonalité
    Ceci permet de prédéfinir une courbe de réponse de tonalité prédéfinie ou personnalisée pour la LUT 3D. Les paramètres prédéfinis sont Rec. 1886 (décalage d’entrée) et Gamma 2.2 (décalage de sortie, fonction puissance pure).
    Appliquer l’étalonnage (vcgt) (n’est visible que si « Afficher les options avancées » dans le menu « Options » est activé)
    Appliquer la LUT 1D d’étalonnage du profil (si elle existe) à la LUT 3D. Normalement, ceci devrait toujours être activé si le profil comporte une LUT 1D non linéaire de l’étalonnage sinon, vous devez vous assurer que l’étalonnage 1D est chargé même si la LUT 3D est utilisée.
    Mode de transposition du gamut (uniquement visible si « Afficher les options avancées » du menu « Options » est activé)
    Le mode par défaut de transposition du gamut est « périphérique-vers-PCS inverse » ce qui donne les résultats les plus précis. Dans le cas où l’on utilise un profil ayant des tables PCS-vers-périphérique assez hautes, l’option « PCS-vers-périphérique » est aussi sélectionnable, ce qui permet la génération plus rapide de la LUT 3D, mais ceci est parfois moins précis.
    Intention de rendu
    • « Colorimétrie absolue » est prévue pour reproduire les couleurs de manière exacte. Les couleurs hors gamut seront écrêtées à la valeur correspondante la plus proche possible. Le point blanc de destination sera modifié afin de correspondre si possible au point blanc source, ce qui peut avoir pour conséquence de l’écrêter s’il se trouve hors gamut ;
    • « Apparence absolue » transpose les couleurs de la source vers la destination en essayant de faire correspondre le plus exactement possible l’apparence des couleurs, mais elle peut ne pas transposer exactement le point blanc. Les couleurs hors gamut seront écrêtées à la valeur correspondante la plus proche possible ;
    • « Colorimétrie absolue avec adaptation du point blanc » se comporte presque exactement comme « Colorimétrie absolue » mais réduit proportionnellement l’espace colorimétrique de la source afin de s’assurer que le point blanc n’est pas écrêté ;
    • « Apparence avec correspondance de luminance » compresse linéairement ou étend l’axe de luminance du blanc au noir afin de faire correspondre la source à l’espace colorimétrique de destination, sans altérer autrement le gamut, les couleurs hors gamut sont écrêtées à la valeur de plus proche correspondance. Le point blanc de destination n’est pas modifié afin de correspondre au point blanc source ;
    • « Perceptuelle » utilise une compression en trois dimensions afin que le gamut source s’ajuste au gamut de destination. Autant que possible, l’écrêtage est évité, les teintes et l’apparence globale sont conservées. Le point blanc de destination n’est pas modifié afin de correspondre au point blanc source. Cette intention est utile si le gamut de destination est moins étendu que le gamut source ;
    • « Apparence perceptuelle » utilise une compression en trois dimensions afin que le gamut source s’ajuste au gamut de destination. Autant que possible, l’écrêtage est évité, les teintes et l’apparence globale sont conservées. Le point blanc de destination est modifié afin de correspondre au point blanc source. Cette intention est utile si le gamut de destination est moins étendu que le gamut source ;
    • « Perceptuelle préservant la luminance » (ArgyllCMS 1.8.3+) utilise une compression pour que le gamut source s’ajuste au gamut de destination, mais pondère très fortement la préservation de la valeur de la luminance de la source, ce qui compromet la préservation de la saturation. Aucune accentuation su contraste n’est utilisée si la plage dynamique est réduite. Cette intention peut être utilisée lorsque la préservation des distinctions de tonalité dans les images est plus importante que de conserver la couleur (« colorfulness ») ou le contraste global.
    • « Préserver la saturation » utilise une compression et une expansion en trois dimensions afin d’essayer de faire correspondre le gamut de la source au gamut de destination, et aussi de favoriser les saturations les plus élevées par rapport à la conservation de la teinte ou de la clarté. Le point blanc de destination n’est pas modifié afin de correspondre au point blanc source ;
    • « Colorimétrie relative » est prévue pour reproduire exactement les couleurs, mais par rapport au point blanc de destination qui ne sera pas modifié afin de correspondre au point blanc source. Les couleurs hors gamut seront écrêtées à la valeur correspondante la plus proche. Cette intention est utile si vous avez un écran étalonné pour un point blanc personnalisé que vous désirez conserver ;
    • « Saturation » utilise la même transposition du gamut que « Préserver la saturation », mais elle augmente légèrement la saturation dans les zones du gamut fortement saturées.
    Format de fichier des tables de correspondance 3D
    Définit le format de sortie de la LUT 3D. Les formats actuellement pris en charge sont Autodesk/Kodak (.3dl), Iridas (.cube), eeColor (.txt), madVR (.3dlut), Pandora (.mga), Portable Network Graphic (.png), ReShade (.png, .fx) et Sony Imageworks (.spi3d). Notez qu’un profil ICC de lien de périphérique (l’équivalent ICC d’une LUT 3D RGB-in/RGB-out) est toujours conjointement créé.
    Encodage d’entrée/sortie
    Certains formats de LUT 3D vous permettent de définir l’encodage d’entrée/sortie. Notez que dans la plupart des cas, des valeurs par défaut raisonnables seront choisies en fonction du format de LUT 3D sélectionné, mais que cela peut être spécifique à une application ou à un flux de production.
    Profondeur des couleurs d’entrée/sortie
    Certains formats de LUT 3D vous permettent de définir l’encodage d’entrée/sortie. Notez que dans la plupart des cas, des valeurs par défaut raisonnables seront choisies en fonction du format de LUT 3D sélectionné, mais que cela peut être spécifique à une application ou à un flux de production.

    Installer les LUT 3D

    Selon format de fichier de la LUT 3D, il peut être nécessaire de l’installer ou de l’enregistrer vers un emplacement spécifique avant qu’elle ne puisse être utilisée. Il vous sera demandé d’installer ou d’enregistrer la LUT 3D juste après qu’elle a été créée. Si, plus tard, vous devez de nouveau installer ou enregistrer la LUT 3D, allez à l’onglet « LUT 3D » et cliquez le petit bouton « Installer la LUT 3D » situé à côté de la fenêtre déroulante « Paramètres » (c’est le même bouton que celui qui installe les profils d’écrans lorsque vous êtes sur l’onglet « Écran et sonde de mesure » et qu’un écran directement connecté est sélectionné).

    Installer des LUT 3D pour ReShade injector

    D’abord, vous devez installer ReShade. Suivez les instructions d’installation dans le fichier README de ReShade. Installez ensuite la LUT 3D depuis DisplayCAL vers le même dossier où vous avez préalablement installé/copié ReShade et les fichiers associés. La touche permettant de basculer la LUT 3D d’active à inactive est la touche HOME. Vous pouvez changer cette touche ou désactiver complètement la LUT 3D LUT en éditant (avec un éditeur de texte) le fichier ColorLookUpTable.fx. Pour supprimer complètement la LUT 3D, supprimez ColorLookUpTable.png et ColorLookUpTable.fx, éditez aussi ReShade.fx et supprimez la ligne #include "ColorLookupTable.fx" qui se trouve près de la fin.

    Vérification et rapport de mesures

    Vous pouvez faire des mesures de vérification afin d’évaluer l’adaptation de la chaîne d’affichage (profil d’écran – carte vidéo et les courbes d’étalonnage chargées dans sa table de gamma – écran) aux données mesurées, ou pour évaluer les capacités d’épreuvage à l’écran de la chaîne d’affichage.

    Pour effectuer ce qui précède, vous devez sélectionner une mire de test CGATS[1] contenant les nombres du périphérique (RVB). Les valeurs mesurées sont alors comparées aux valeurs obtenues en fournissant les nombres RVB du périphérique par l’intermédiaire du profil d’écran (valeurs mesurées par rapport aux valeurs attendues). La mire de vérification par défaut comporte 26 échantillons et peut être utilisée, par exemple, pour vérifier si un écran a besoin d’être re-caractérisé . Si vous mesurez une mire de test avec des échantillons gris (R=V=B), comme c’est le cas de la mire par défaut et des mires de vérification étendues, vous avez aussi la possibilité, en plaçant une coche dans la case correspondante du rapport, d’évaluer l’équilibre du gris au travers du seul étalonnage.

    Pour effectuer la vérification des possibilités d’épreuvage à l’écran, vous devez fournir un fichier de référence CGATS contenant des données XYZ ou L*a*b*, ou une combinaison de profil de simulation et de mire de test, qui sera passée au profil de l’écran afin de rechercher les valeurs (RVB) correspondantes du périphérique, et ensuite envoyées à l’écran et mesurées. Ensuite, les valeurs mesurées sont comparées aux valeurs originales XYZ ou L*a*b*, ce qui peut donner une information sur l’adaptation (ou l’inadaptation) de l’écran pour l’épreuvage vers l’espace colorimétrique indiqué par la référence.

    Le profil destiné à être évalué peut être librement choisi. Vous pouvez le choisir dans la fenêtre principale de DisplayCAL dans « Paramètres ». Les fichiers de rapport générés après les mesures de vérification sont en pur HTML avec une intégration de JavaScript et sont autonomes. Ils comportent aussi la référence et les données de mesures qui sont les valeurs RVB de l’appareil, les valeurs XYZ d’origine mesurées, et les valeurs L*a*b* adaptées à D50 à partir des valeurs XYZ. Ils peuvent être examinés sous forme de texte pur directement depuis le rapport en cliquant un bouton.

    Comment faire – Scénarios courants

    Sélectionnez le profil que vous désirez évaluer dans « Paramètres » (pour l’évaluation de profils à LUT 3D et les profils de lien de périphérique, ce paramètre est important pour une courbe de réponse de tonalité Rec. 1886 ou de gamma personnalisé, parce qu’ils dépendent du niveau de noir).

    Il existe deux jeux de mires de vérification par défaut, de tailles différentes, l’un pour une utilisation générale et l’autre pour la vidéo Rec. 709. Les versions « small » et « étendue » peuvent être utilisées pour une vérification rapide à modérée afin de voir si un écran doit être re-caractérisé, ou si les profils/LUT 3D utilisés sont suffisamment bon pour commencer. Les versions « large » et « xl » peuvent être utilisées pour une vérification plus approfondie. Vous pouvez aussi créer vos propres mires de vérification personnalisées à l’aide de l’éditeur de mires de test.

    Vérification de la précision d’un profil d’écran (évaluation de la bonne aptitude du profil à caractériser l’écran)

    Dans ce cas, vous utiliserez une mire de test avec les valeurs RVB du périphérique sans profil de simulation. Sélectionnez un fichier adapté dans « mire de test ou référence » et désactivez « profil de simulation ». Les autres paramètres, qui ne s’appliquent pas dans ce cas, sont grisés.

    Vérification du niveau d’aptitude d’un écran à simuler un autre espace colorimétrique (évaluation des possibilités d’épreuvage à l’écran, des performances des LUT 3D, des profils de lien de périphérique (« DeviceLink ») ou natives de l’écran)

    Il y a deux manières de le faire :

    • Utiliser un fichier de référence avec les valeurs cibles XYZ ou L*a*b* ;
    • ou utiliser une combinaison d’une mire de test avec les valeurs RVB ou CMJN du périphérique et d’un profil de simulation RVB ou CMJN (pour une mire de test RVB, ceci ne vous permettra uniquement d’utiliser un profil de simulation RVB et inversement. De même, une mire de test CMJN doit être utilisée avec un profil de simulation CMJN).

    Vous avez alors quelques options qui influencent la simulation :

    • Simulation du point blanc. Si vous utilisez un fichier de référence qui contient le blanc du périphérique (RVB 100 % ou CMJN 0%), ou si vous utilisez une combinaison d’une mire de test et d’un profil de simulation, alors vous pouvez choisir si vous désirez une simulation du point blanc de la référence ou du profil de simulation, et dans ce cas, si vous désirez que le point blanc simulé soit relatif au point blanc du profil-cible. Pour expliquer cette dernière option : supposons qu’une référence possède un point blanc qui soit légèrement bleuâtre (comparé à D50), et que le profil-cible ait un point blanc qui soit davantage bleuâtre (par rapport à D50). Si vous ne choisissez pas de simuler le blanc de référence par rapport au point blanc du profil-cible et que le gamut du profil est suffisamment large et précis pour accepter le blanc de référence, alors c’est exactement ce que vous obtiendrez. En fonction du niveau d’adaptation de vos yeux cependant, il peut être raisonnable de supposer que vous êtes dans une large mesure adapté au point blanc du profil-cible (en supposant qu’il soit valable pour un périphérique), et le point blanc simulé semblera un peu jaunâtre comparé au point blanc du profil-cible. Dans ce cas, choisir de simuler le point blanc par rapport à celui du profil-cible peut vous procurer une meilleure correspondance visuelle par exemple lors d’un scénario d’épreuvage à l’écran comparé à une épreuve imprimée sous un certain illuminant, qui est proche mais pas tout à fait D50, et que le point blanc de l’écran a été accordé à cet illuminant. Il va « ajouter » le point blanc simulé « en haut » du point blanc du profil-cible. Donc, dans notre exemple, le point blanc simulé sera encore plus bleuâtre que celui du profil-cible seul.
    • L’utilisation du profil de simulation comme profil-cible va remplacer le profil défini dans « Paramètres ». La simulation du point blanc ne s’applique pas ici parce que la gestion des couleurs ne sera pas utilisée et que le périphérique d’affichage est supposé être dans l’état décrit par le profil de simulation. Ceci peut être effectué de plusieurs façons, par exemple, l’écran peut être étalonné de manière interne ou externe, par une LUT 3D ou par un profil de lien de périphérique. Si ce paramètre est activé, quelques autres options seront disponibles :
      • Activer la LUT 3D (si vous utilisez le périphérique d’affichage madVR/madTPG sous Windows). Ceci vous permet de vérifier l’efficacité avec laquelle une LUT 3D de madVR transforme l’espace colorimétrique de simulation vers l’espace colorimétrique de l’écran. Notez que ce paramètre ne peut pas être utilisé conjointement à un profil ce liens de périphérique (« DeviceLink »).
      • Profil de lien de périphérique (« DeviceLink »). Ceci vous permet de vérifier la qualité de la transformation par un lien de périphérique de la simulation de l’espace colorimétrique vers l’espace colorimétrique de l’écran. Remarquez que ce paramètre ne peut pas être utilisé conjointement avec le paramètre « Activer la LUT 3D de madVR ».
    • Courbe de réponse de tonalité. Si vous évaluez une LUT 3D ou un profil de lien de périphérique (« DeviceLink »), choisissez ici les mêmes paramètres que lors de la création de la LUT 3D / lien de périphérique (et assurez-vous aussi que le même profil-cible soit défini, parce qu’il est utilisé pour transposer le point noir).
      Pour vérifier un écran qui n’a pas de profil associé (par ex. « Non connecté »), définissez la courbe de tonalité à « Non modifiée ». Au cas où vous voudriez plutôt faire la vérification en comparaison avec une courbe de réponse de tonalité différente, vous devrez créer un profil synthétique spécifique à cette utilisation (menu « Outils »).

    Comment les valeurs nominales et les valeurs-cibles recommandées sont-elles choisies ?

    Les tolérances nominales, avec les valeurs-cibles du point blanc, de la valeur moyenne, du maximum et du Delta E de l’équilibre du gris de la CIE 1976 qui découlent d’UGRA/Fogra Media Wedge et d’UDACT, sont assez généreuses, j’ai donc inclus des valeurs « recommandées » un peu plus strictes que j’ai choisies plus ou moins arbitrairement afin de procurer un peu de « marge de sécurité supplémentaire ».

    Pour les rapports générés depuis les fichiers de référence qui contiennent des valeurs CMJN en plus des valeurs L*a*b* ou XYZ, vous pouvez aussi sélectionner les valeurs-cibles officielles de Fogra Media Wedge V3 ou IDEAlliance Control Strip pour du papier blanc, CMJN solides et CMJ gris, si la mire contient les bonnes combinaisons CMJN.

    Comment les résultats du rapport de vérification du profil doivent-ils être interprétés ?

    Ceci dépend de la mire qui a été mesurée. L’explication dans le sommaire du premier paragraphe est assez bonne : si vous avez étalonné et caractérisé votre écran, et que vous désirez vérifier l’adaptation du profil à un ensemble de mesures (précision du profil), ou si vous désirez savoir si votre écran a dérivé et a besoin d’être ré-étalonné/re-caractérisé, vous sélectionnez une mire qui contient les nombres RVB pour la vérification. Remarquez que, juste après la caractérisation, on peut s’attendre à avoir une précision élevée si le profil caractérise bien l’écran, ce qui est habituellement le cas si l’écran ne manque pas trop de linéarité. Dans ce cas, il peut être intéressant de créer un profil basé sur une LUT plutôt qu’avec « courbes et matrice », ou d’augmenter le nombre d’échantillons mesurées pour les profils basés sur une LUT.

    Si vous désirez connaître l’adéquation de votre profil à simuler un autre espace colorimétrique (épreuvage à l’écran), sélectionnez un fichier de référence avec des valeurs L*a*b* ou XYZ, comme l’un des sous-ensembles de Fogra Media Wedge, ou une combinaison d’un profil de simulation et d’une mire de test. Faites attention cependant, seuls les écrans à gamut large pourront suffisamment bien prendre en charge un espace colorimétrique large destiné à l’impression offset tel que FOGRA39 ou similaire.

    Dans les deux cas, vous devriez au moins vérifier que les tolérances nominales ne sont pas dépassées. Pour avoir un peu de « marge de sécurité supplémentaire », voyez plutôt les valeurs recommandées.

    Remarquez que les deux tests sont en « boucle fermée » et ne vous donneront pas la vérité « absolue » en termes de « qualité de la couleur » ou de « précision de la couleur » car ils ne peuvent pas vous indiquer si votre sonde est défectueuse ou si les mesures sont erronées (un profil créé avec des mesures répétitivement fausses donnera une vérification correcte avec d’autres mesures erronées provenant de la même sonde si elles ne fluctuent pas trop) ou si elles ne correspondent pas bien à votre écran (ce qui est particulièrement vrai pour les colorimètres avec les écrans à gamut large, car de telles combinaisons demandent une correction matérielle ou logicielle afin d’obtenir des résultats précis – ce problème n’existe pas avec les spectromètres, qui n’ont pas besoin de correction pour les gamuts larges. Mais on a récemment découvert qu’ils avaient des problèmes pour mesurer correctement la luminosité de certains rétroéclairages à LED d’écrans utilisant des LED blanches), ou si les couleurs de votre écran correspondent à un objet réel situé à proximité (comme un tirage photographique). Il est parfaitement possible d’obtenir de bons résultats de vérification mais avec des performances visuelles réelles déficientes. Il est toujours sage de combiner de telles mesures avec un test de l’apparence visuelle d’une référence « reconnue comme étant bonne », comme un tirage ou une épreuve (bien qu’on ne doive pas oublier que celles-ci ont aussi des tolérances, et l’éclairement joue aussi un rôle important lorsqu’on évalue des résultats visuels). Gardez cela en mémoire lorsque vous admirez les résultats de la vérification (ou que vous vous arrachez les cheveux) :)

    Comment les profils sont-ils évalués au regard des valeurs mesurées ?

    Différents logiciels utilisent différentes méthodes (qui ne sont pas toujours divulguées en détail) pour comparer et vérifier les mesures. Cette section a pour but de donner aux utilisateurs intéressés une meilleure appréciation de la manière de fonctionner « sous le capot » de la vérification des profils de DisplayCAL.

    Comment une mire de test ou un fichier de référence est-il utilisé ?

    Il y a actuellement deux voies légèrement différentes selon qu’on utilise la mire de test ou le fichier de référence pour les mesures de vérification, comme cela est précisé ci-dessus. L’utilitaire xicclu d’Argyll tourne en coulisses et les valeurs de la mire de test ou du fichier de référence sont passées au travers du profil en cours de test soit colorimétrie relative (si aucune simulation de point blanc n’est utilisée), soit en colorimétrie absolue (si une simulation de point blanc est utilisée) afin d’obtenir les valeurs L*a*b* (dans le cas de mires de test RVB) ou les valeurs RVB de périphérique (dans le cas de fichiers de référence XYZ ou L*a*b*, ou d’une combinaison d’un profil de simulation et d’une mire de test). Si on utilise comme référence une combinaison d’un profil de simulation et d’une mire de référence, les valeurs de référence L*a*b* sont calculées en injectant les valeurs de l’appareil depuis la mire de test au travers du profil de simulation soit en colorimétrie absolue si la simulation du point blanc est activée (ce qui est le cas par défaut si le profil de simulation est un profil d’imprimante), soit en colorimétrie relative si la simulation du point blanc désactivée (ce qui est le cas par défaut si le profil de simulation est un profil d’écran, comme avec la plupart des espaces de travail RVB). Les valeurs RVB d’origine venant de la mire de test, ou les valeurs RVB extraites dans le cas d’une référence sont ensuite envoyées à l’écran au travers des courbes d’étalonnage du profil en cours d’évaluation. Si on utilise « simuler le point blanc en fonction du point du profil-cible », on suppose un blanc de référence D50 (valeur par défaut d’ICC) et que l’observateur est complètement adapté chromatiquement au point blanc de l’écran. Les valeurs XYZ mesurées sont donc adaptées à D50 (avec le point blanc mesuré comme blanc de référence de la source) en utilisant la transformée de Bradford (voir Chromatic Adaption sur le site web de Bruce pour la formule et la matrice utilisées par DisplayCAL) ou la matrice d’adaptation du profil dans le cas de profils possédant la balise d’adaptation chromatique 'chad', et converties en L*a*b*. Les valeurs L*a*b* sont alors comparées par le rapport dynamique généré, avec un critère sélectionnable par l’utilisateur et une formule de ΔE (delta E).

    Comment le ΔE entre le point blanc supposé et celui qui est mesuré est-il calculé ?

    Dans un rapport, la température de couleur corrélée et le point blanc-cible supposé, ainsi que le ΔE du point blanc, demandent des explications supplémentaires : le ΔE du point blanc est calculé comme étant la différence entre le point blanc mesuré et les valeurs XYZ normalisées du point blanc-cible supposé, qui sont d’abord converties en L*a*b*. La température de couleur affichée du point blanc-cible supposé est simplement la température de couleur corrélée arrondie (seuil de 100K) calculée à partir des valeurs XYZ mesurées. Les valeurs XYZ du point blanc-cible supposé sont obtenues en calculant les coordonnées de chromaticité (xy) d’un illuminant CIE D (lumière du jour) ou du corps noir ayant cette température de couleur et en les convertissant vers XYZ. Vous trouverez toutes les formules utilisées sur le site web de Bruce Lindbloom et sur Wikipédia [en].

    Comment la « plage » d’équilibre du gris est-elle évaluée ?

    La « plage » d’équilibre du gris utilise l’écart absolu combiné entre Δa et Δb (par ex. si max Δa = -0.5 et max Δ = 0.7, la plage est de 1.2). Comme les résultats dans les valeurs sombres extrêmes peuvent être problématiques en raison du manque de précision de la sonde de mesure et d’autres effets comme un point noir ayant une chromaticité différente de celle du point blanc, la vérification de l’équilibre du gris dans DisplayCAL ne prend en compte que les échantillons gris ayant une luminance minimum de 1 % (c’est-à-dire que si la luminance du blanc = 120 cd/m², alors, seuls les échantillons d’au moins 1.2 cd/m² seront pris en compte).

    Quelle est l’action réelle de la case à cocher « Evaluate gray balance through calibration only » (« Évaluer l’équilibre du gris uniquement au travers de l’étalonnage ») sur un rapport ?

    Elle définit la valeur nominale (cible) de L* à la valeur de L* mesurée, et a*=b*=0, de manière à ce que le profil soit effectivement ignoré et que seul l’étalonnage (s’il existe) influence les résultats des vérifications de l’équilibre du gris. Notez que cette option ne fera pas de différence pour un profil à « courbe unique » ou « courbe unique + matrice », cas la courbe unique réalise effectivement quelque chose de similaire (les valeurs de L* peuvent être différentes, mais elles sont ignorées pour les vérifications de l’équilibre du gris et n’influencent que le résultat final).

    Fonctionnalité spéciale

    Mesures et caractérisation à distance

    En utilisant ArgyllCMS 1.4.0 et plus récent, il est possible de faire des mesures à distance sur un périphérique qui n’est pas directement connecté à la machine sur laquelle tourne DisplayCAL (par ex., un smartphone ou une tablette). Le périphérique distant doit être capable de faire tourner un navigateur Web (Firefox est recommandé), et la machine locale sur laquelle tourne DisplayCAL peut avoir besoin qu’on ajoute ou qu’on modifie des règles de pare-feu afin de permettre les connexions entrantes. Pour configurer la caractérisation à distance, sélectionnez « Web @ localhost » depuis la fenêtre déroulante des périphériques d’affichage, choisissez ensuite l’action désirée (par ex. « Caractérisation uniquement »). Lorsque le message « Serveur Web en attente sur http://<IP>:<Port> » apparaît, ouvrez l’adresse affichée sur le navigateur distant et fixez la sonde de mesure.
    NOTE: si vous utilisez cette méthode pour afficher des échantillons de test, il n’y a pas d’accès aux LUT[7] vidéo de l’écran et un étalonnage matériel n’est pas possible. Les couleurs seront affichées avec une précision de 8 bits par composante, les économiseurs d’écran et d’énergie ne seront pas désactivés automatiquement. Vous serez aussi à la merci de toute gestion de la couleur appliquée par le navigateur internet, et vous devrez soigneusement vérifier et configurer une telle gestion de la couleur
    Note : fermez la fenêtre ou l’onglet du navigateur internet après chaque exécution, sinon la reconnexion pourra échouer lors des exécutions ultérieures.

    Générateur de motifs de test de madVR

    DisplayCAL depuis la version 1.5.2.5, prend en charge, lorsqu’il est utilisé avec ArgyllCMS 1.6.0 ou plus récent, le générateur de motifs de test de madVR (madTPG) et les formats de LUT 3D de madVR.

    Resolve (10.1+) comme générateur de motifs

    Depuis sa version 2.5, DisplayCAL peut utiliser Resolve (10.1+) comme générateur de motifs. Sélectionnez l’entrée « Resolve » depuis la fenêtre déroulante des périphériques d’affichage de DisplayCAL et, dans Resolve lui-même, choisissez « Étalonnage de moniteur », « CalMAN » dans le menu « Couleur ».

    Mesures d’écran non connecté

    Veuillez noter que le mode non connecté ne devrait normalement être utilisé qu’une fois épuisées toutes les autres options.

    Le mode non connecté est une autre option pour mesurer et caractériser un écran distant qui n’est pas connecté par un moyen standard (l’étalonnage n’est pas pris en charge). Pour utiliser le mode non connecté, la mire de test utilisée doit être optimisée. Elle est ensuite exportée sous forme de fichiers image (à l’aide de l’éditeur de mire de test) et ces fichiers d’image doivent être affichés sur le périphérique en cours de mesure dans un ordre successif. La procédure est la suivante :

    • Sélectionnez la mire de test désirée, ouvrez ensuite la mire de test choisie et ouvrez l’éditeur de mire de test ;
    • Sélectionnez « Optimiser pour non connecté en mode automatique » depuis la fenêtre déroulante des options de tri, cliquez « Appliquer » et exportez la mire de test ;
    • Gravez les images sur un DVD, copiez-les sur une clé USB ou n’importe quel autre support disponible afin de les fournir à l’écran devant être mesuré ;
    • Sur la fenêtre déroulante des écrans de DisplayCAL, sélectionnez « Non connecté » (la dernière option) ;
    • Affichez la première image sur l’écran distant et disposez la sonde. Sélectionnez ensuite « Caractériser uniquement ».

    Les mesures vont commencer et les changements des images affichées devraient être automatiquement détectés si le mode « Auto » est actif. Utilisez un moyen quelconque à votre disposition pour parcourir les images de la première à la dernière, en surveillant soigneusement le processus de mesure et en ne passant à l’image suivante que lorsque l’image en cours a été mesurée avec succès (ce qui sera affiché sur la fenêtre de mesure en mode non connecté). Notez que le mode non connecté sera (au moins) deux fois plus lent que lors des mesures sur un écran normal.

    Fonctionnalité hors de l’interface utilisateur

    Il y a un élément de fonctionnalité qui n’est pas disponible depuis l’interface utilisateur et doivent être lancées depuis l’invite de la ligne de commandes ou dans un terminal. L’utilisation de cette fonctionnalité nécessite actuellement soit 0install, soit de tourner depuis les sources.

    Changer le profil d’affichage et le point blanc d’étalonnage

    Notez que ceci réduit le gamut et la précision du profil.

    Par 0install :

    0install run --command=change-display-profile-cal-whitepoint -- \
      http://displaycal.net/0install/DisplayCAL.xml \
      [-t temp | -T temp | -w x,y] [--cal-only] [profil_entrée] nom_fichier_sortie

    À partir des sources :

    python util/change_display_profile_cal_whitepoint.py- \
      http://displaycal.net/0install/DisplayCAL.xml \
      [-t temp | -T temp | -w x,y] [--cal-only] [profil_entrée] nom_fichier_sortie
    -t temp
    Utiliser la température de couleur de lumière du jour temp comme point blanc-cible.
    -T temp
    Utiliser la température du corps noir temp comme point blanc-cible.
    -w x,y
    Utiliser la chromaticité x,y comme point blanc-cible.
    --cal-only (optionnel)
    Ne modifier que l’étalonnage intégré au profil, pas le profil lui-même.
    profil_entrée (optionnel)
    Utiliser le profil profil_entrée plutôt que le profil de l’écran actuel.
    nom_fichier_sortie
    Nom de fichier du profil en sortie. Le profil modifié sera écrit dans ce fichier.
    Activer le chargement/déchargement de l’étalonnage par Windows 7 ou ultérieur

    Notez que le chargement de l’étalonnage par Windows est de plus basse qualité qu’avec ArgyllCMS parce que Windows effectue toujours une quantification de l’étalonnage sur 8 bits et le redimensionne de manière erronée. Ceci n’est pas le cas en utilisant le chargeur d’étalonnage de DisplayCAL qui utilise ArgyllCMS.

    Par 0install :

    0install run --command=set-calibration-loading -- \
      http://displaycal.net/0install/DisplayCAL.xml [--os]

    À partir des sources :

    python -c "import sys; from DisplayCAL import util_win; \
      util_win.calibration_management_isenabled() or \
      util_win.enable_calibration_management() \
      if '--os' in sys.argv[1:] else \
      not util_win.calibration_management_isenabled() or \
      util_win.disable_calibration_management();" [--os]

    L’option --os détermine si la fonctionnalité de chargement de l’étalonnage par Windows doit être activée ou pas.

    « Écriture de scripts »

    DisplayCAL prend en charge l’écriture de scripts (« scripting ») soit localement, soit par le réseau (ce dernier devant être explicitement activé en définissant app.allow_network_clients = 1 dans DisplayCAL.ini) via des sockets. DisplayCAL doit être prêt et en cours de fonctionnement sur la machine-cible pour que ceci fonctionne. Vous trouverez ci-dessous un exemple de connexion à une instance en cours de fonctionnement sur le port par défaut 15411 et le lancement des mesures d’étalonnage (le port peut être configuré dans DisplayCAL.ini sous app.port, cependant, si le port choisi n’est pas disponible, un port inutilisé sera automatiquement choisi. Vous pouvez lire le port actuellement utilisé dans le fichier DisplayCAL.lock qui se trouve dans le dossier du fichier de configuration de DisplayCAL pendant qu’il tourne). L’exemple est écrit en Python et s’occupe aussi de quelques affaires complexes de sockets.

    #!/usr/bin/env python2
    
    import socket
    
    class DCGScriptingClientSocket(socket.socket):
    
    	def __enter__(self):
    		return self
    
    	def __exit__(self, etype, value, tb):
    		# Disconnect
    		try:
    			# Will fail if the socket isn't connected, i.e. if there was an
    			# error during the call to connect()
    			self.shutdown(socket.SHUT_RDWR)
    		except socket.error:
    			pass
    		self.close()
    
    	def __init__(self):
    		socket.socket.__init__(self)
    		self.recv_buffer = ''
    
    	def get_single_response(self):
    		# Buffer received data until EOT (response end marker) and return
    		# single response (additional data will still be in the buffer)
    		while not '\4' in self.recv_buffer:
    			incoming = self.recv(4096)
    			if incoming == '':
    				raise socket.error("Connection broken")
    			self.recv_buffer += incoming
    		end = self.recv_buffer.find('\4')
    		single_response = self.recv_buffer[:end]
    		self.recv_buffer = self.recv_buffer[end + 1:]
    		return single_response
    
    	def send_and_check(self, command, expected_response="ok"):
    		""" Send command, get & check response """
    		self.send_command(command)
    		single_response = self.get_single_response()
    		if single_response != expected_response:
    			# Check application state. If a modal dialog is displayed, choose
    			# the OK option. Note that this is just an example and normally you
    			# should be very careful with this, as it could mean confirming a
    			# potentially destructive operation (e.g. discarding current
    			# settings, overwriting existing files etc).
    			self.send_command('getstate')
    			state = self.get_single_response()
    			if 'Dialog' in state.split()[0]:
    				self.send_command('ok')
    				if self.get_single_response() == expected_response:
    					return
    			raise RuntimeError('%r got unexpected response: %r != %r' %
    							   (command, single_response, expected_response))
    
    	def send_command(self, command):
    		# Automatically append newline (command end marker)
    		self.sendall(command + '\n')
    
    # Generate a list of commands we want to execute in order
    commands = []
    
    # Load “Laptop” preset
    commands.append('load presets/laptop.icc')
    
    # Setup calibration & profiling measurements
    commands.append('calibrate-profile')
    
    # Start actual measurements
    commands.append('measure')
    
    # Create socket & send commands
    with DCGScriptingClientSocket() as client:
    	client.settimeout(3)  # Set a timeout of 3 seconds
    
    	# Open connection
    	client.connect(('127.0.0.1', 15411))  # Default port
    
    	for command in commands:
    		client.send_and_check(command)
    
    

    Chaque commande nécessite d’être terminée par un caractère de fin de ligne (après chaque paramètre pris en compte par la commande). Notez que ces données doivent être envoyées encodées en UTF-8 et que si des paramètres contiennent des espaces, ils doivent être encadrés par des apostrophes simples ou doubles. Vous devriez vérifier la réponse à chacune des commandes envoyées (le marqueur de fin de réponse est ASCII 0x4 EOT, et le format de réponse est un format de texte brut, mais JSON et XML sont aussi disponibles). Les valeurs courantes retournées par les commandes dont soit ok dans le cas où la commande a été comprise (notez que ceci n’indique pas que le traitement de cette commande est terminé), busy ou blocked dans le cas ou la commande a été ignorée parce qu’une autre opération était en cours ou parce qu’une fenêtre modale bloque l’interface utilisateur, failed dans les cas où la commande ou un paramètre de la commande ne peut pas être traité avec succès, forbidden dans le cas où la commande n’était pas autorisée (il peut s’agir d’une condition temporaire selon les circonstances, par ex. lorsqu’on essaie d’interagir avec un élément de l’interface utilisateur qui est actuellement désactivé). invalid dans le cas où la commande (ou l’un de ses paramètres) est invalide, ou error suivi d’un message d’erreur dans le cas d’une exception non gérée. D’autres valeurs de retour sont possibles en fonction de la commande. Toutes les valeurs retournées sont encodées en UTF-8. Si la valeur de retour est blocked (par ex. parce qu’une fenêtre modale est affichée), vous devriez vérifier l’état de l’application avec la commande getstate pour déterminer l’évolution future de cette action.

    Liste des commandes prises en charge

    Vous trouverez ci-dessous une liste des commandes actuellement prises en charge (la liste contient toutes les commandes valable pour l’application principale, les outils autonomes n’en accepteront typiquement qu’un sous-ensemble réduit. Vous pouvez utiliser l’outil autonome « client d’écriture de scripts de DisplayCAL » pour l’apprendre et expérimenter les commandes). Notez que les paramètres de nom de fichier doivent se référer à des fichiers présents sur la machine-cible sur laquelle tourne DisplayCAL.

    3DLUT-maker [create nom_fichier]
    Afficher l’onglet de création de LUT 3D, ou créer la LUT 3D nom_fichier.
    abort
    Tenter d’interrompre l’opération en cours d’exécution.
    activate [ID fenêtre ID | nom | étiquette]
    Activer la fenêtre fenêtre ou la fenêtre principale de l’application (qui est ramenée à l’avant). Si elle est minimisée, la restaurer.
    alt | cancel | ok [nom_fichier]
    Si une fenêtre modale est affichée, appeler l’action par défaut (ok), l’action de remplacement (si elle existe), ou interrompez-la. Si une fenêtre de choix de fichier est affichée, utiliser ok nom_fichier permet de choisir ce fichier.
    calibrate
    Configurer les mesure d’étalonnage (notez que ceci ne donnera pas le choix de créer aussi un profil rapide courbes + matrice, si c’est ce que vous désirez, utilisez plutôt interact mainframe calibrate_btn). Pour les écrans autre que virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour commencer les mesures.
    calibrate-profile
    Configurer les mesures d’étalonnage et de caractérisation. Pour les écrans autres que virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour commencer les mesures.
    close [ID fenêtre | nom | étiquette]
    Fermer la fenêtre fenêtre ou la fenêtre actuellement active (si la fenêtre est la fenêtre principale, ceci quitte l’application). Notez que ceci tente d’abord d’interrompre toutes les applications en cours de fonctionnement, vous deviez donc vérifier l’état de l’application à l’aide de la commande getstate.
    create-colorimeter-correction
    create-colorimeter-correction
    Créer une correction de colorimètre.
    create-profile [nom_fichier]
    Créer un profil depuis des mesures existantes (profil ou fichier de mesures).
    curve-viewer [nom_fichier]
    Afficher les courbes, en chargeant de manière optionnelle nom_fichier. Des chemins relatifs sont possibles, par ex. pour les préréglages : curve-viewer presets/photo.icc
    DisplayCAL [nom_fichier]
    Amener la fenêtre principale à l’avant. Si elle est minimisée, la restaurer. Optionnellement, charger nom_fichier.
    enable-spyder2
    Activer la Spyder 2.
    getactivewindow
    Obtenir la fenêtre actuellement active. Le format retourné est nom_classe ID nom étiquette état. état est soit enabled soit disabled.
    getcellvalues [ID fenêtre | nom | étiquette] <ID mire | nom | étiquette>
    Obtenir les valeurs des cellules de la mire mire de la fenêtre fenêtre ou de la fenêtre actuellement active.
    getappname
    Obtenir le nom de l’application à laquelle vous êtes connecté.
    getcfg [option]
    Obtenir l’option de configuration, ou l’ensemble de la configuration (paires clé-valeur dans le format INI).
    getcommands
    Obtenir la liste des commandes acceptées par cette application.
    getdefault <option>
    Obtenir l’option par défaut (paire clé-valeur dans le format INI).
    getdefaults
    Obtenir toutes les valeurs par défaut (paires clé-valeur dans le format INI).
    getmenus
    Obtenir les menus disponibles dans le format ID "étiquette" état. état est soit enabled soit disabled.
    getmenuitems [position_menu | étiquette]
    Obtenir les éléments de menu disponibles dans le format position_menu "étiquette_menu" ID_élément_menu "étiquette_élément_menu" état [checkable] [checked]. stateposition_menu "étiquette_menu" ID_élément_menu "étiquette_élément_menu" état [checkable] [checked]. état est soit enabled soit disabled.
    getstate
    Obtenir l’état de l’application. La valeur de retour sera soit ide, busy, nom_classe_dialogue ID nom_dialogue [étiquette_dialogue] état "texte_message" [path "chemin"] [buttons "étiquette_bouton"...] si une fenêtre modale est affichée ou blocked dans le cas ou l’interface utilisateur est actuellement bloquée. La plupart des commandes ne fonctionnent pas si l’interface utilisateur est bloquée – la seule manière de résoudre le blocage est d’interagir autrement que par programmation avec les éléments réels de l’interface utilisateur de l’application ou de la fermer. Notez qu’un état blocked ne devrait normalement se produire que si une fenêtre réelle de choix de fichier est affiché. Si on utilise exclusivement l’interface d’écriture de scripts, ceci ne devrait jamais arriver parce qu’il utilise une fenêtre de choix fichier de remplacement qui prend en charge les mêmes actions que qu’une fenêtre réelle de choix de fichier, mais ne bloque pas. Remarquez aussi qu’une valeur de retour de blocked pour toute autre commande signifie uniquement qu’une fenêtre modale est actuellement en attente d’une interaction, ce n’est que si getstate retourne aussi blocked que vous ne pouvez pas résoudre cette situation uniquement par script.
    getuielement [ID fenêtre | nom | étiquette] <ID_élément | nom | étiquette>
    getuielements [ID fenêtre | nom | étiquette]
    Obtenir un simple élément de l’UI ou un liste d’éléments visibles de l’UI de la fenêtre fenêtre ou de la fenêtre actuellement active. Chaque ligne retournée représente un élément d’UI et a le format nom_classe ID nom ["étiquette"] état [checked] [value "valeur"] [items "élément"...]. nom_classe. nom_classe est le nom interne de la classe de la bibliothèque UI. Ceci peut vous aider à déterminer de quel type d’élément il s’agit, et qu’elles sont les interactions qu’il prend en compte. ID est un identifiant numérique. nom est le nom de l’élément de l’UI. "étiquette" (s‘il existe) est une étiquette qui vous apportera une aide supplémentaire dans l’identification de l’élément de l’UI. Vous pouvez utilisez ces trois derniers avec la commande interact. état est soit enabled soit disabled. items "élément"… (s’il existe) est une liste d’éléments connectés à l’élément de l’UI (c’est-à-dire des choix de sélection).
    getvalid
    Obtenir des valeurs valides pour les options ayant des contraintes (paires clé-valeur du format INI). Il y a deux sections, ranges et values. ranges sont les plages valables pour les options qui acceptent des valeurs numériques (notez que les options integer non couvertes par ranges sont typiquement de type boolean). Les values sont des valeurs valables pour les options qui n’acceptent que certaines valeurs. Les options non couvertes par ranges ni values sont limitées à leur type de donnée (vous ne pouvez pas affecter une option numérique à une chaîne de caractères ni l’inverse).
    getwindows
    Obtenir une liste des fenêtres visibles. Le format retourné est une liste de nom_classe ID nom étiquette état. état est soit enabled soit disabled.
    import-colorimeter-corrections [nom_fichier...]
    Importer les corrections du colorimètre.
    install-profile [nom_fichier]
    Installer un profil.
    interact [ID fenêtre | nom | étiquette] <ID élément | nom | étiquette> [setvalue valeur]
    Interagir avec l’élément de l’UI élément de la fenêtre fenêtre ou de la fenêtre actuellement active, par exemple, invoquer un bouton ou définir un contrôle à une valeur.
    invokemenu <position_menu | étiquette_menu> <ID_élément_menu | étiquette_élement_menu>
    Invoquer un élément de menu.
    load <nom_fichier>
    Charger les chemins relatifs sont possibles, par exemple pour les pré-réglages : load presets/photo.icc.
    measure
    Démarrer les mesures (la configuration doit avoir été préalablement faite !).
    measure-uniformity
    Mesurer l’uniformité de l’écran.
    measurement-report [nom_fichier]
    Si aucun nom de fichier n’est indiqué, afficher l’onglet du rapport de mesures. Sinon, configurer les mesures pour créer le rapport HTML nom_fichier. Pour les écrans non virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure ensuite pour commencer les mesures.
    profile
    Définir les mesures de caractérisation (notez que ceci utilisera toujours l’étalonnage en cours, si applicable, si vous désirez plutôt utiliser un étalonnage linéaire, appelez load linear.cal avant d’appeler profile). Pour les écrans non virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour commencer les mesures.
    profile-info [nom_fichier]
    Afficher les informations » du profil, en chargeant optionnellement le profil nom_fichier. Les chemins relatifs sont possibles, par exemple pour les préréglages : profile-info presets/photo.icc
    refresh
    Mettre l’interface graphique à jour après des modifications de configuration par setcfg ou restore-defaults.
    report-calibrated
    Établir un rapport sur l’écran étalonné. Pour les écrans non virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour commencer les mesures.
    report-uncalibrated
    Établir un rapport sur l’écran non étalonné. Pour les écrans non virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour commencer les mesures.
    restore-defaults [catégorie...]
    Restaurer les valeurs par défaut globalement ou uniquement pour catégorie. Appeler refresh après avoir modifié la configuration afin de mettre à jour l’interface graphique.
    setlanguage <code_langue>
    Définir la langue
    setcfg <option> <valeur>
    Définir l’option à valeur. La valeur spéciale null efface une option de configuration. Appeler refresh après avoir modifié la configuration afin de mettre à jour l’interface graphique. Voir aussi getdefaults et getvalid.
    setresponseformat <format>
    Définir le format des réponses. La valeur par défaut plain est un format de texte facile à lire, mais ce n’est pas forcément le meilleur à analyser informatiquement. Les autres formats possibles sont json, json.pretty, xml et xml.pretty. Les formats *.pretty utilisent des sauts de ligne et une indentation ce qui les rend plus faciles à lire.
    synthprofile [nom_fichier]
    Affichez la fenêtre de création d’un profil synthétique, de manière optionnelle, charger le profil nom_fichier.
    testchart-editor [nom_fichier | create nom_fichier]
    Afficher la fenêtre de l’éditeur de mire de test, de manière optionnelle, charger ou créer la mire de test nom_fichier. Des chemins relatifs son possible par exemple, pour charger une mire de test par défaut : testchart-editor ti1/d3-e4-s17-g49-m5-b5-f0.ti1.
    verify-calibration
    Vérifier l’étalonnage. Pour les écrans non virtuels ainsi que pour les générateurs de motifs (à l’exception de madVR), appelez ensuite la commande measure pour lancer les mesures.

    Interagir avec des éléments de l’interface utilisateur

    • Appeler un bouton : interact [fenêtre] <bouton> par ex. afficher les informations des variables de substitution (« placeholders ») du nom de profil : interact mainframe profile_name_info_btn
    • Définir une valeur sur une liste déroulante, un champ de texte ou un curseur : interact [fenêtre] <element> setvalue "valeur" par ex. définir le gamma d’étalonnage à 2.4 : interact mainframe trc_textctrl setvalue 2.4 (remarquez que pour modifier plusieurs options en même temps, il est généralement préférable d’appeler plutôt setcfg <option> <valeur> pour chacune des options que vous désirez suivie d’un simple refresh)
    • Définir une valeur de cellule sur une mire : interact [fenêtre] <mire> setvalue "ligne,colonne,valeur" par ex. alors que l’éditeur de mire de test est affiché, définir la cellule de la seconde colonne de la première rangée à 33 : interact tcgen grid setvalue "0,1,33"

    Mises en garde et limitations

    Il faut être conscient de certaines choses lorsque l’on utilise des commandes qui interagissent directement avec l’interface utilisateur (c’est-à-dire activate, alt | cancel | ok, close, interact et invokemenu).

    Faire référence aux fenêtres et aux éléments de l’UI : vous pouvez faire référence aux fenêtres et aux éléments de l’interface graphique par leur ID (identifiant), nom ou étiquette (vous obtiendrez des informations sur les fenêtres et les éléments de l’UI avec les commandes getmenus/getmenuitems, getuielement/getuielements, et getwindows). Si l’ID d’un objet est négatif, ceci signifie qu’il a été automatiquement assigné à la création de l’objet et qu’il n’est valable que pour la durée de vie de l’objet (c’est-à-dire pour les fenêtres modales, uniquement lorsque la fenêtre est affichée). Pour cette raison, il est plus facile d’utiliser un nom d’objet, mais les noms (ainsi que les ID non assignés automatiquement) ne sont pas garantis d’être uniques, même pour les objets qui partagent la même fenêtre parente (cependant, la plupart des commandes « importantes » ainsi que les fenêtres d’application ont des noms uniques). Une autre possibilité est d’utiliser une étiquette d’objet, qui, bien qu’il n’y ait pas non plus de garantie qu’elle soit unique, a de fortes chances d’être unique pour les contrôles qui partagent la même fenêtre parente, mais il y a un inconvénient est qu’elle est traduite (bien que vous pouvez forcer une langue d’UI spécifique en appelant setlanguage) et elle est sujette à modification lorsque la traduction est mise à jour.

    Opérations séquentielles : appeler des commandes qui interagissent en succession rapide avec l’interface utilisateur peut nécessiter d’utiliser un délai supplémentaires entre l’envoi des commandes afin de laisser le temps à l’interface graphique de réagir (afin que getstate retourner l’état actuel de l’interface graphique après une commande spécifique), il y a cependant un délai par défaut d’au moins 55 ms pour les commandes qui interagissent avec l’interface graphique. Une bonne règle approximative pour lancer les commandes est de faire un cycle « envoyer la commande » → « lire la réponse » → « attendre optionnellement quelques ms de plus » → « demander l’état de l’application (envoyer la commande getstate) » → « lire la réponse ».

    Définir des valeurs : si la définition d’une valeur pour un élément de l’UI retourne ok, ceci n’est pas toujours l’indication que cette valeur a vraiment été changée, mais uniquement que la tentative pour changer cette valeur n’a pas échoué, c’est-à-dire que le gestionnaire d’événements de l’élément peut quand même faire une erreur de vérification et changer la valeur en quelque chose de sensé si ce n’était pas valable. Si vous désirez être certain que la valeur attendue est bien définie, utilisez getuielement sur l’élément affecté et vérifiez la valeur (ou mieux encore si vous utilisez un format de réponse JSON ou XML, vous pouvez plutôt vérifier l’object propriété/élément de la réponse ce qui va refléter l’état actuel de l’objet et vous économiser une requête). En général, il est préférable de n’utiliser interact <nom_element> setvalue <valeur> que pour les dialogues, et dans les autres cas d’utiliser une séquence de setcfg <option> <valeur> (répétée autant que nécessaire, appelez, de manière optionnelle, load <nom_fichier> or restore-defaults d’abord pour minimiser le nombre d’options de configuration que vous avez besoin de modifier) suivie par un appel à refresh pour mettre à jour l’interface utilisateur.

    De plus, tous les contrôles ne proposent pas une interface d’écriture de scripts complète. Je suis cependant ouvert à toutes les suggestions.

    Emplacements des données de l’utilisateur et du fichier de configuration

    DisplayCAL utilise les dossiers suivants pour la configuration, les fichiers journaux et le stockage (le répertoire de stockage est configurable).

    Configuration

    • Linux : /home/Votre_Nom_Utilisateur/.config/DisplayCAL
    • Mac OS X : /Users/Votre_Nom_Utilisateur/Library/Preferences/DisplayCAL
    • Windows Vista et plus récent : C:\Users\Votre_Nom_Utilisateur\AppData\Roaming\DisplayCAL
    • Windows XP : C:\Documents and Settings\Votre_Nom_Utilisateur\Application Data\DisplayCAL

    Journaux

    • Linux : /home/Votre_Nom_Utilisateur/.local/share/DisplayCAL/logs
    • Mac OS X : /Users/Votre_Nom_Utilisateur/Library/Logs/DisplayCAL et
      /Users/Votre_Nom_Utilisateur/Library/Logs/0install
    • Windows Vista et plus récent : C:\Users\Votre_Nom_Utilisateur\AppData\Roaming\DisplayCAL\logs
    • Windows XP : C:\Documents and Settings\Votre_Nom_Utilisateur\Application Data\DisplayCAL\logs

    Stockage

    • Linux : /home/Votre_Nom_Utilisateur/.local/share/DisplayCAL/storage
    • Mac OS X : /Users/Votre_Nom_Utilisateur/Library/Application Support/DisplayCAL/storage
    • Windows Vista et plus récent : C:\Users\Votre_Nom_Utilisateur\AppData\Roaming\DisplayCAL\storage
    • Windows XP : C:\Documents and Settings\Votre_Nom_Utilisateur\Application Data\DisplayCAL\storage

    Sessions incomplètes ou ayant échoué (utile pour la résolution de problèmes)

    • Linux : /home/Votre_Nom_Utilisateur/.local/share/DisplayCAL/incomplete
    • Mac OS X : /Users/Votre_Nom_Utilisateur/Library/Application Support/DisplayCAL/incomplete
    • Windows Vista et plus récent : C:\Users\Votre_Nom_Utilisateur\AppData\Roaming\DisplayCAL\incomplete
    • Windows XP : C:\Documents and Settings\Votre_Nom_Utilisateur\Application Data\DisplayCAL\incomplete

    Problèmes connus et solutions

    General: Wacky image colors (swapped colors)
    Solution: This happens when you created a “XYZ LUT + swapped matrix” profile and is a way to alert you that the software you're using does not support XYZ LUT profiles and falls back to the included matrix (which generally means you'd loose accuracy). If you're having this situation only in some applications, creating a “XYZ LUT + matrix” profile will remedy it (but please keep in mind that those applications not supporting XYZ LUT will still fall back to the matrix, so results can be different from applications that support XYZ LUT correctly). If all colormanaged applications you use show swapped colors, you should create a matrix profile instead. Note that you do not have to re-run any measurements: In DisplayCAL, choose a profile type as suggested previously (you need to enable advanced options in the “Options” menu to show profile type choices on the “Profiling” tab), adjust quality and profile name if you want, then choose “Create profile from measurement data...” in the “File” menu and select the profile you had the issue with.
    General: Measurements are failing (“Sample read failed”) if using the “Allow skipping of spectrometer self-calibration” option and/or highres/adaptive mode
    Solution: Disable either or all of the above options. The problem seems to mainly occur with the ColorMunki Design/Photo.
    USB 3.0 connectivity issues (instrument not found, access failing, or not working properly)
    Such issues would usually manifest themselves through instruments not being found, or randomly disconnecting even if seemingly working fine for some time. From all information that is known about these issues, they seem to be related to USB 3.0, not related to software as the vendor software is also affected, and they seem to occur irrespective of operating system or device drivers.
    The underlying issue seems to be that while USB 3.0 has been designed to be backwards compatible with USB 2.0, some USB 2 devices do not seem to work reliably when connected over USB 3. As currently available instruments with USB connectivity are usually USB 2 devices, they may be affected.
    Solution: A potential solution to such USB 3.0 connectivity issues is to connect the instrument to a USB 2.0 port (if available) or the use of an externally powered USB 2.0 hub.
    Windows: “The process <dispcal.exe|dispread.exe|coloprof.exe|...> could not be started.”
    Solution: If you downloaded ArgyllCMS manually, go to your Argyll_VX.X.X\bin directory, and right-click the exe file from the error message. Select “Properties”, and then if there is a text on the “General” tab under security “This file came from another computer and might be blocked”, click “Unblock”. Sometimes also over-zealous Antivirus or 3rd-party Firewall solutions cause such errors, and you may have to add exceptions for all involved programs (which may include all the ArgyllCMS executables and if you're using Zero Install also python.exe which you'll find in a subdirectory under C:\ProgramData\0install.net\implementations) or (temporarily) disable the Antivirus/Firewall.
    Photoshop: “The monitor profile […] appears to be defective. Please rerun your monitor calibration software.”
    Solution: Adobe ACE, Adobe's color conversion engine, contains monitor profile validation functionality which attempts to filter out bad profiles. With XYZ LUT profiles created in ArgyllCMS versions up to 1.3.2, the B2A white point mapping is sometimes not particularly accurate, just enough so that ACE will see it as a problem, but in actual use it may only have little impact that the whitepoint is a bit off. So if you get a similar message when launching Photoshop, with the options “Use profile regardless” and “Ignore profile”, you may choose “Use profile regardless” and check visually or with the pipette in Photoshop if the inaccurate whitepoint poses a problem. This issue is fixed in ArgyllCMS 1.3.3 and newer.
    MS Windows Vista: The calibration gets unloaded when a User Access Control prompt is shown
    Solution: (Intel and Intel/AMD hybrid graphics users please see “The Calibration gets unloaded after login/resume/User Access Control prompt” first) This Windows Vista bug seems to have been fixed under Windows 7 (and later), and can be remedied under Vista by either manually reloading calibration, or disabling UAC—but please note that you sacrifice security by doing this. To manually reload the calibration, either open DisplayCAL and select “Load calibration curves from current display profile” under the “Video card gamma table” sub-menu in the “Tools” menu, or (quicker) open the Windows start menu and select “DisplayCAL Profile Loader” in the “Startup” subfolder. To disable UAC[9] (not recommended!), open the Windows start menu and enter “msconfig” in the search box. Click on the Tools tab. Select the line “Disable UAC” and click the “Launch” button. Close msconfig. You need to reboot your system for changes to apply.
    MS Windows with Intel graphics (also Intel/AMD hybrid): The Calibration gets unloaded after login/resume/User Access Control prompt
    Solution: The Intel graphics drivers contain several utilities that interfere with correct calibration loading. A workaround is to rename, move or disable (e.g. using a tool like AutoRuns) the following files:
    C:\Windows\system32\igfxtray.exe
    C:\Windows\system32\igfxpph.dll
    C:\Windows\system32\igfxpers.exe
    MS Windows Vista and later: The display profile isn't used if it was installed for the current user
    Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select “Classic View” under Vista and anything other than “Category View” under Windows 7 and later to see it). Under the “Devices” tab, select your display device, then tick “Use my settings for this device”.
    MS Windows 7 or later: Calibration does not load automatically on login when not using the DisplayCAL Profile Loader
    Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select something other than “Category View” to see it). Select the “Advanced” tab, then “Change system defaults...”, and finally tick the “Use Windows display calibration” checkbox. Note that the precision of Windows' built-in calibration loading is inferior compared to the DisplayCAL profile loader and may introduce inaccuracies and artifacts.
    MS Windows XP, multiple displays: One profile is used by all displays connected to a graphics card
    Solution: The underlying issue is that Windows XP assigns color profiles per (logical) graphics card, not per output. Most XP graphics drivers present only one logical card to the OS even if the card itself has multiple outputs. There are several possible solutions to this problem:
    • Use different graphics cards and connect only one display to each (this is probably the preferable solution in terms of ease of use and is least prone to configuration error)
    • Install and use the Windows XP color control applet (note that the original MS download link is no longer available)
    • Some graphics cards, like the Matrox Parhelia APV (no longer produced), will expose two logical cards to the OS when using a specific vendor driver (some older ATI drivers also had this feature, but it seems to have been removed from newer ones)
    Mac OS X 10.08 “Mountain Lion” or newer: Black crush and posterization in applications using ColorSync (e.g. Preview)
    Solution: Due to what appear to be bugs in Mac OS X, applications using ColorSync may show artifacts like black crush and posterization with certain types of display profiles (i.e. cLUT-based ones). Applications from 3rd parties which use their own color management engine (like Adobe products) are not affected. Also not affected seems Apple ColorSync Utility as well as Screenshot Utility, which could be used as a replacement for Apple Preview. Another work-around is to create a simpler single curve + matrix profile with included black point compensation, but a drawback is a potential loss of color accuracy due to the inherent limitiations of this simpler profile type (most other profiling solutions create the same type of simple profile though). The easiest way to create a simple single curve + matrix pofile in DisplayCAL is to make sure calkibration tone curve is set to a value other than “As measured”, then setting testchart to “Auto” on the “Profiling” tab and moving the patch amount slider all the way to the left (minimum amount of patches). You should see “1xCurve+MTX” in the default profile name.
    Mac OS X 10.11 “El Capitan”: If running via 0install, DisplayCAL won't launch anymore after updating to El Capitan from a previous version of OS X
    Solution:
    1. Run the “0install Launcher” application from the DisplayCAL-0install.dmg disk image.
    2. Click “Refresh”, then “Run”. An updated library will be downloaded, and DisplayCAL should launch.
    3. From now on, you can start DisplayCAL normally as usual.
    Mac OS X 10.12 “Sierra”: Standalone tools silently fail to start
    Solution: Remove the quarantine flag from the application bundles (and contained files) by opening Terminal and running the following command (adjust the path /Applications/DisplayCAL/ as needed):
    xattr -dr com.apple.quarantine /Applications/DisplayCAL/*.app
    Mac OS X: DisplayCAL.app is damaged and can't be opened.
    Solution: Go to the “Security & Privacy” settings in System Preferences and set “Allow applications downloaded from” (under the “General” tab) to the “Anywhere” setting. After you have successfully launched DisplayCAL, you can change the setting back to a more secure option and DisplayCAL will continue to run properly.
    Linux/Windows: No video card gamma table access (“Calibrate only” and “Calibrate & profile” buttons grayed, “Profile only” button available)
    Solution: Make sure you have not selected a display that doesn't support calibration (i.e. “Web @ localhost” or “Untethered”) and that you have enabled “Interactive display adjustment” or set the tone curve to a different value than “As measured”. Under Linux, please refer to the ArgyllCMS documentation, “Installing the software on Linux with X11” and “Note on X11 multi-monitor setups” / “Fixing access to Video LUTs” therein. Under Windows, please also see the solution posted under “The display profile isn't used if it was installed for the current user” if you are using Windows and make sure you have a recent driver for your video card installed.

    Obtenir de l’aide

    Veuillez remarquer que cette assistance ne peut être fournie qu’en anglais. et que les signalements de bogues devront toujours être écrits en anglais. Je vous remercie.

    Vous avez besoin d’aide pour une tâche spécifique ou vous rencontrez un problème ? Ce peut être une bonne idée de consulter d’abord les problèmes connus et solutions si le sujet a déjà été traité. Si vous désirez signaler un bogue, veuillez consulter les lignes directrices pour le signalement de bogues. Sinon, utilisez l’un des canaux suivants :

    • forum d’entraide ;
    • Me contacter directement (mais gardez à l’esprit que d’autres utilisateurs pourraient aussi profiter des échanges, j’encourage donc, si possible, l’utilisation de l’une des méthodes ci-dessus)

    Signaler un bogue

    Veuillez remarquer que cette assistance ne peut être fournie qu’en anglais. et que les signalements de bogues devront toujours être écrits en anglais. Je vous remercie.

    Vous avez trouvé un bogue ? Si c’est le cas, veuillez d’abord vérifier sur le système de suivi des bogues que ce problème n’a pas déjà été signalé auparavant. Sinon, suivez ces lignes directrices pour signaler les bogues :

    • Essayez de donner un résumé court mais précis du problème ;
    • Essayez d’indiquer quelques étapes permettant de reproduire le problème ;
    • Si possible joignez toujours les fichiers des journaux. Ils sont habituellement créés automatiquement par DisplayCAL en tant qu’élément de fonctionnement normal du programme. Vous pouvez les trouver ici :
      • Linux : /home/Votre_Nom_Utilisateur/.local/share/DisplayCAL/logs
      • Mac OS X : /Users/Votre_Nom_Utilisateur/Library/Logs/DisplayCAL and
        /Users/Votre_Nom_Utilisateur/Library/Logs/0install
      • Windows Vista et plus récent : C:\Users\Votre_Nom_Utilisateur\AppData\Roaming\DisplayCAL\logs
      • Windows XP : C:\Documents and Settings\Votre_Nom_Utilisateur\Application Data\DisplayCAL\logs

      Comme le dossier peut contenir plusieurs fichiers de journaux, une bonne idée est de compresser l’ensemble du dossier sous forme d’une archive ZIP ou tar.gz que vous pourrez facilement joindre au signalement de bogue.

      Attention, les fichiers de journaux peuvent contenir votre nom d’utilisateur ainsi que les chemins des fichiers que vous avez utilisés avec DisplayCAL. Je respecterai toujours votre vie privée, mais vous devez en avoir conscience lorsque vous joignez des fichiers de journaux vers un endroit public tel que le système de suivi des problèmes.

    Créez un nouveau ticket (ou, si le bogue a déjà été signalé, utilisez le ticket existant) sur le système de suivi des problèmes, en suivant les lignes directrices ci-dessus et joignez l’archive des fichiers de journaux.

    Si vous ne voulez pas ou ne pouvez pas utiliser le système de suivi des bogues, vous pouvez utiliser l’un des autres canaux d’assistance.

    Discussion

    Veuillez remarquer que cette assistance ne peut être fournie qu’en anglais. et que les signalements de bogues devront toujours être écrits en anglais. Je vous remercie.

    Désirez-vous entrer en rapport avec moi ou avec d’autres utilisateurs en ce qui concerne DisplayCAL ou des sujets en rapport ? Le forum de discussions générales est un bon emplacement où le faire. Vous pouvez aussi me contacter directement.

    Remerciements

    Je voudrais remercier les personnes suivantes :

    Graeme Gill, pour avoir créé ArgyllCMS

    Les traducteurs : Loïc Guégant, François Leclerc, Jean-Luc Coulon (traduction française), Roberto Quintero (traduction espagnole), Tommaso Schiavinotto (traduction italienne), 楊添明 (traduction chinois traditionnel), 김환(Howard Kim) (traduction coréenne)

    Les donateurs récents : Nigel Smith, Marcin Koscielecki, Philip Kerschbaum, Shih-Hsiang Lin, Alberto Alessandro Pozzo, John Mackey, Serge Stauffer, Juraj Hatina, Dudley Mcfadden, Tihomir Lazarov, Kari Hrafnkelsson, Michael Gerstgrasser, Sergio Pirovano, Borko Augustin, Greg Hill, Marco Signorini, Hanno Ritzerfeld, Lensvisions Studio, Ute Bauer, Ori Sagiv, Bálint Hajagos, Vesa Karhila, Сергей Кудрин, Sheila Mayo, Lensvisions Studio, Dmitry Ostroglyadov, Lippai Ádám, Aliaksandr Sirazh, Dirk Driesen, Andre Schipper, Jay Benach, Gafyn Jones, Fritz Schütte, Kevin Pinkerton, Truls Aagedal, Eakphan Intajak, Herbert Moers, Jordan Szuch, Clemens Rendl, Nirut Tamchoo, James Barres, Ronald Nowakowski, Stefano Aliffi, Miriana Marusic, Robert Howard, Alessandro Marotta, Björn Stresing, Evgenij Popov, Rodrigo Valim, Robert Smith, Jens Windmüller, 信宏 郭, Swen Heinrich, Matthieu Moy, Sebastian Hoffmann, Ruslan Nedielkov, Fred Wither, Richard Tafel, Chester Chua, Arreat.De, Duane Middlebrook, Stephan Eitel, autres…

    Et tous ceux qui m’ont envoyé des retours ou signalé des bogues, suggéré des fonctionnalités ou qui, simplement, utilisent DisplayCAL.

    Remerciements :

    Une partie de la documentation très complète d’ArgyllCMS a été utilisée dans ce document. Elle n’a que légèrement été modifiée afin de mieux correspondre au comportement et à la terminologie de DisplayCAL.

    Journaux des modifications

    2018-02-18 14:47 (UTC) 3.5

    DisplayCAL 3.5

    Added in this release:

    • [Feature] Support the madVR HDR 3D LUT installation API (madVR >= 0.92.13).

    Changed in this release:

    • [Enhancement] In case of a download problem (e.g. automatic updates), offer to visit the download URL manually.
    • [Enhancement] Security: Check file hashes of application setup and portable archive downloads when updating DisplayCAL or ArgyllCMS.
    • [Enhancement] Security: Use HTTPS for ArgyllCMS download as well.
    • [UI] New application icons and slightly refreshed theme.
    • [UI] Improved HiDPI support by adjusting relative dialog button spacing, margins, and interactive display adjustment window gauge sizes to match proportionally regardless of DPI.
    • [UI] Improved visual consistency of tab buttons (don't lose “selected” state if clicking on a button and then moving the mouse outside of it, “hover” state does no longer override “selected” state, keyboard navigation skips over selected button).
    • [Cosmetic] Measurement report: Make patch preview take into account the “Use absolute values” option again.
    • [Cosmetic] Measurement report: Colorize CCT graph points according to change in hue and chroma.
    • [Cosmetic] Measurement report: Colorize gamma graph points according to change in gamma.
    • [Cosmetic] Measurement report: Dynamically adjust gamma graph vertical axis to prevent cut-off.
    • [Cosmetic] Measurement report: Make RGB balance graph match HCFR (Rec. 709 only). Note that new and old balance graphs are only comparable to a limited extent (use “Update measurement or uniformity report” in the “Tools” menu to update existing reports).
    • [Cosmetic] Profile loader (Windows): Unset non belonging profile when resetting a profile association.
    • Mac OS X: Set default profile type to single curve + matrix with black point compensation due to long-standing Mac OS X bugs with any other profile type.

    Fixed in this release:

    • [Moderate] Unhandled exception and UI freeze when the 3D LUT format was set to madVR and there never was a prior version of ArgyllCMS on the system or the previous version was older than or equal to 1.6.3 during that same DisplayCAL session, due to a missing capability check.
    • [Moderate] Division by zero when trying to create a SMPTE 2084 HDR 3D LUT if the profile black level was zero (regression of a change in DisplayCAL 3.4, SVN revision r4896).
    • [Minor] If using the alternate forward profiler and the profile type was XYZ LUT + swapped matrix, the swapped matrix was overwritten with an accurate one (regression introduced in DisplayCAL 3.3.4, SVN revision r4736).
    • [Minor] It was not possible to run a measurement report with a simulation profile set as display profile, but no profile assigned to the actual display.
    • [Minor] Rec. 1886 measurement report with originally non Rec. 709 tone response profile: Make sure to override the original tone response of the profile so Rec. 1886 gives the expected result.
    • [Minor] If a measurement report HTML file was mangled by another application that removed the XML self-closing tags forward slashes, it was not possible to correctly update the report using “Update measurement or uniformity report” from the “Tools” menu.
    • [Minor] If using a pattern generator, check it is valid before binding a disconnect-on-close event when using the visual whitepoint editor. Prevents an attribute error when using the visual whitepoint editor and the madTPG network implementation (i.e. under Mac OS X).
    • [Minor] Windows: Always use the active display device directly when querying or setting profiles instead of mimicking applications using the Windows GetICMProfile API (fixes getting the correct profile with display configurations consisting of three or more displays where some of them are deactivated).
    • [Minor] Profile loader (Windows): Check whether or not a display device is attached to multiple adapters and disable fixing profile associations in that case.
    • [Minor] Profile loader (Windows): Work-around hitching caused by Windows WcsGetDefaultColorProfile API call on some systems.
    • [UI] Measurement window: Make sure focus stays on the last focused control when the window itself gains focus again after losing focus.
    • [UI] Synthetic ICC Profile Creator: Update HDR SMPTE 2084 diffuse white info text when changing luminance.
    • [Trivial] HDR SMPTE 2084 3D LUT: Interpolate the last two segments before the clipping point of the intermediate input LUT shaper curves (prevents potential slight banding in highlights).
    • [Trivial] Windows: Make sure the profile loader is launched directly after installing a profile when using a portable version of DisplayCAL (parity with installer version).
    • [Trivial] Profile loader (Windows): Re-introduce --skip command line option.
    • [Cosmetic] Profile loader (Windows): When disassociating a profile from a device, suppress ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE error sometimes (in some cases always?) resulting from the WcsDisassociateColorProfileFromDevice Windows API call, even though the profile was successfully disassociated.
    2017-12-30 14:16 (UTC) 3.4

    DisplayCAL 3.4

    Added in this release:

    • [Feature] HDR Hybrid Log-Gamma transfer function option for 3D LUTs.
    • [Feature] HDR verification testcharts.
    • [UI] Simplified chinese translation thanks to 林泽帆(Xpesir).
    • [Enhancement] Linux: wxPython Phoenix 4.0.0b/rc1 compatibility.
    • [Enhancement] Profile loader (Windows): Notifications (for 3rd party calibration/profiling software and user-defined exceptions) can be turned off.

    Changed in this release:

    • [Enhancement] HDR 3D LUTs: SMPTE 2084 with roll-off now allows specifying the mastering display minimum and peak luminance which are used to adjust the roll-off start and clipping points (BT.2390-3).
    • [Enhancement] HDR 3D LUTs: Chroma compression is now done in Lpt color space, providing improved preservation of detail in compressed highlights.
    • [Enhancement] Do not disable the measurement report button if the selected setting is a preset and a simulation profile is used as display profile with tone curve set to “Unchanged” (i.e. do not require selecting “<Current>” under settings to allow verifying the native device response against a selected simulation profile).
    • [Enhancement] Limit profile name length taking into account the full path of the final storage directory.
    • [Enhancement] Disable automatic output levels detection for colorimeter correction creation measurements.
    • Changed the “Softproof” and “Video” presets to no longer intentionally swap red and green for the fallback matrix.
    • [UI] [Cosmetic] Minor UI consistency changes.
    • [Enhancement] Linux: X11 root window _ICC_PROFILE_xxx atom enumeration for Xrandr now matches the Xinerama order, so that _ICC_PROFILE_xxx atoms match irrespective of which extension applications are using. This improves conformance to the ICC Profiles in X Specification and matches the respective change in ArgyllCMS 2.0.
    • Mac OS X (standalone application): No longer support OS X versions prior to 10.6. This streamlines and slims the application bundle and allows using more recent 3rd party dependencies which are not available for older Mac OS X releases. If you still need support for Mac OS X 10.5, use the 0install version of DisplayCAL.

    Fixed in this release:

    • [Critical] Ensure alternate forward profiler device to PCS table input curves are strictly monotonically increasing to prevent clipping resulting in peaks in the response in case of bad underlying (non-monotonic) device behavior (regression of a change in DisplayCAL 3.3.5, SVN revision r4838).
    • [Minor] Always force the first entry in PCS to device table input curves to zero when generating high resolution PCS to device tables (fixes potential unexpected non-zero RGB output for zero input to perceptual PCS to device table).
    • [UI] [Cosmetic] When not confirming a manual DisplayCAL update but ArgyllCMS is up to date, reflect this in the final dialog message.
    • [Trivial] ReShade 3D LUT: If ReShade 3.x default shaders are installed, write the different parts of the 3D LUT to the correct respective sub-directories and no longer write the superfluous ReShade.fx.
    • [UI] [Cosmetic] Linux: Prevent flickering of tab buttons on some systems when switching tabs.
    • [Moderate] Linux: The way display device enumeration was performed was not always guaranteed to give consistent results across the different available external device to profile mapping APIs, which could lead to wrong profile associations in multi-display configurations (this fix is required to match how ArgyllCMS 2.0 enumerates displays).
    • [Minor] Mac OS X (standalone application): Bundle certificate authority certificates to enable verifying server certificates (fixes not being able to automatically download updates).
    • [Minor] Windows: When creating a colorimeter correction from measurement file(s) stored in a path where one or more components(s) started with a number from 1-9 or the lowercase letter g, the operation failed and the created colorimeter correction had to be retrieved from the temporary directory manually.
    • [Minor] Profile loader (Windows): When manually disabling calibration loading via the pop-up menu, and then starting DisplayCAL (or another application detected by the profile loader) and closing it again, the profile loader would stay disabled, including the calibration loading related menu items, requiring a profile loader restart.
    2017-10-18 17:34 (UTC) 3.3.5

    DisplayCAL 3.3.5

    Changed in this release:

    • [Enhancement] Updated french localization (thanks to Jean-Luc Coulon).
    • [Enhancement] When generating high resolution PCS to device tables for XYZ LUT profiles, round PCS candidate “fit” so a good match is not potentially needlessly discarded in favor of a match with lower effective usage of the available lookup table grid points (may speed up the process as well).
    • [Enhancement] Use single curve detection based on calibration accuracy for shaper tags of XYZ LUT profiles as well.

    Fixed in this release:

    • [Minor] When enabling the Spyder2, check if the spyd2PLD.bin firmware has actually been successfully extracted (taking into account the install scope) and fall back to alternate methods when using automatic mode if the firmware cannot be extracted from the vendor software present in the local filesystem (fixes inability to enable the Spyder2 under Mac OS X if the vendor software is installed).
    • [Minor] Windows: Make measurement report filename safe for filesystem encoding (works around encoding quirks with certain locales).
    • [Minor] Windows: Windows silently strips any combination of trailing spaces and dots in file and folder names, so do the same for the profile name.
    • [Minor] Profile loader (Windows): WCS can return no profile without error in some situations, but the no error case wasn't accounted for, resulting in an unhandled exception in that case.
    • [Minor] Profile loader (Windows): Get the process identifier before enumerating windows to prevent an unhandled exception if a madVR instance is already running before starting the profile loader.
    • [Cosmetic] Profile loader (Windows): Detect if the current display profile video card gamma table tag contains linear calibration when checking if madVR did reset the video card gamma table to linear to prevent the profile loader alternating between enabled and disabled state if using windowed overlay in madVR.
    2017-09-13 12:09 (UTC) 3.3.4.1

    DisplayCAL 3.3.4.1

    Fixed in this release:

    • [Moderate] Linux (profile installation and profile loading): Getting the fallback XrandR display device ID could unexpectedly return no result in some cases due to incorrect parsing, leading to potential application of a stale device to profile mapping or no profile at all (regression of SVN revision r4800).
    • [Minor] Linux, Mac OS X: The visual whitepoint editor was failing to update the test pattern area of a connected madTPG instance when madVR was selected as display device, due to an implementation bug related to setting the background color.
    2017-09-09 15:53 (UTC) 3.3.4

    DisplayCAL 3.3.4

    Added in this release:

    • Verification charts for ISO 14861:2015 soft proofing evaluation.

    Changed in this release:

    • [Enhancement] More even and consistent CPU utilization on multi CPU/multi core systems during high resolution device-to-PCS table generation.
    • [Enhancement] Multi-threaded gamut view calculation.
    • [Enhancement] Use an alternate way to generate the matrix for profiles created from the small testchart for matrix profiles (may improve accuracy on very linear displays) and use an optimized tone response curve if using a single curve and the measured response is a good match to an idealized parametric or standardized tone response curve.
    • [Enhancement] Uniformity report: No longer include (meaningless) correlated/closest color temperature. Use “traffic light” visual indicators in conjunction with unambiguous pass/fail messages to allow easy at-a-glance assessment of the results, and also include contrast ratio deviation to fully conform to ISO 12646:2015 and 14861:2015. You can update old reports via “Update measurement or uniformity report...” in the “Report” sub-menu of the “Tools” menu.
    • [Enhancement] Measurement report: Use the display profile whitepoint as reference white for the measured vs. profile white delta E calculation and use the assumed target whitepoint as reference white for the measured vs. assumed white delta E calculation to make the reported delta E more meaningful.
    • [Enhancement] Measurement report: Allow to use the display profile whitepoint as reference white when using absolute (not D50 adapted) values.
    • [Enhancement] Profile installation (Linux): Always do fallback colord profile installation using colormgr if available unless the ARGYLL_USE_COLORD environment variable is set.
    • [Enhancement] Profile loader (Linux): Include the profile source (colord or Argyll's UCMM) in diagnostic output and use the XrandR device ID as fallback when no EDID is available.
    • [Enhancement] Profile loader (Windows): Slightly improve encoding accuracy of quantizing to 8 < n < 16 bits.
    • [Trivial] Offer the complete range of input encodings for the eeColor 3D LUT format and do not force an identical output encoding.
    • [Trivial] Do not store calibration settings in a profile if calibration is disabled.
    • [Trivial] Revert the default profile type for the 79 patches auto-optimized testchart slider step to XYZ LUT + matrix.
    • [Trivial] Iridas cube 3D LUTs: Increase compatibility by stripping leading whitespace from text lines and adding DOMAIN_MIN/MAX keywords if missing.
    • [Trivial] Measurement report: Calculate true combined a*b* range for grayscale instead of summing separate ranges.
    • [Trivial] Measurement report: Automatically enable “Use absolute values” if using full whitepoint simulation (i.e. not relative to display profile whitepoint).

    Fixed in this release:

    • [Moderate] When cancelling profiling measurements with the testchart set to “Auto”, the testchart UI and the internal test chart setting were no longer in sync until changing the profile type or restarting the application.
    • [Moderate] Synthetic ICC profile creator: Unhandled exception when trying to create DICOM (regression of a change in DisplayCAL 3.1.5, SVN revision r4020) or SMPTE 2084 profiles (regression of multiprocessing changes in DisplayCAL 3.3).
    • [Minor] Protect against potentially clipping slightly above black values during high resolution device-to-PCS table generation (regression of a change in DisplayCAL 3.3.3, SVN revision r4705).
    • [Minor] Protect against enumerating displays and ports in response to a DISPLAY_CHANGED event when the main window isn't shown or isn't enabled which could lead to a hang due to a race condition.
    • [Minor] Verification using a simulation profile that defines an identity matrix in its 'chad' tag (e.g. ISOnewspaperv4) did not work correctly due to the matrix being mapped to “None” insatead of “XYZ scaling”.
    • [Minor] Verification using a CMYK simulation profile failed with a “Profile invalid” error if previously “Use simulation profile as display profile” and “Device link profile” were enabled but no device link profile selected.
    • [Minor] Remove separate videoLUT access support under Windows and Mac OS X (separate videoLUT access is only supported under X11).
    • [Minor] Downloaded files were not renamed from their temporary name if the server did not return a Content-Length header (this typically only happens for text files, not binary files). Fixes not being able to import colorimeter corrections from iColor Display.
    • [Trivial] Do not reflect the black point hue in tone response curves of single curve + matrix profiles when not using black point compensation.
    • [Trivial] Measurement report: Additional stats median calculation index was off by n+1.
    • [Cosmetic] Display model name and manufacturer description tags were missing from profiles created using the alternate forward profiler.
    • [Cosmetic] Measurement report: Eliminate “Use absolute values” having a side-effect on the RGB patches preview.
    • [Cosmetic] Windows: When closing some of the standalone tools when minimized, e.g. by right-clicking the taskbar button and choosing “Close” from the menu, or by using the taskbar preview close button, the application did not close until restored from its minified state (i.e. by clicking on the taskbar button or switching to it with the task switcher).
    2017-08-08 18:40 (UTC) 3.3.3

    DisplayCAL 3.3.3

    Added in this release:

    • Intermediate auto-optimized testchart step with 115 patches.

    Changed in this release:

    • [UI] [Cosmetic] Verification tab: Always show advanced tone response curve options when “Show advanced options” is enabled in the “Options” menu.
    • [UI] [Trivial] Verification tab: Don't reset the simulation profile tone response curve choice unless changing the simulation profile.
    • [Enhancement] [Trivial] When encountering an invalid peak white reading during output levels detection, advise to check if the instrument sensor is blocked.
    • [Enhancement] Visual whitepoint editor: Use whitepoint of currently selected profile (unless it's a preset or “<Current>”) instead of associated display profile.
    • [Enhancement] Blend profile black point to a*b* = 0 by default. This makes the visual appearance of black and near black response in Photoshop (which uses relative colorimetric intent with black point compensation for display by default) match the DisplayCAL perceptual table of XYZ LUT profiles (which means neutral hues gradually blend over to the display black point hue relatively close to black. The rate of this blend and black point hue correction are influenced by the respective calibration settings, which is another added benefit of this change).
    • [Enhancement] Measurement & uniformity report: Change average delta a, b, L, C, and H to be calculated from absolute values.
    • [Enhancement] Profile loader (Windows): Don't implicitly reset the video card gamma table to linear if no profile is assigned or couldn't be determined. Show an orange-red error icon in the latter case and display details in the left-click notification popup.
    • [Cosmetic] Windows: Log errors when trying to determine the active display device during profile installation.

    Fixed in this release:

    • [UI] [Cosmetic] Verification tab: Don't accidentally enable the simulation profile tone response curve black output offset (100%) radio button when switching tabs.
    • [Trivial] Show error dialog if not able to connect to instrument for single reading.
    • [Minor] Strip the “firmware missing” message from the Spyder2 instrument name if it was not yet enabled (makes the automatic popup to enable the Spyder2 work).
    • [Minor] Prisma 3D LUT upload with 1.07 firmware.
    • [Minor] More accurately encode the black point in the colorimetric PCS to device table by explicitly clipping below black values to zero.
    2017-06-29 15:10 (UTC) 3.3.2

    DisplayCAL 3.3.2

    Added in this release:

    • IPT and Lpt color spaces (profile information 2D and 3D gamut view, testchart editor 3D view).
    • ACEScg and DCDM X'Y'Z' source profiles.

    Changed in this release:

    • [Enhancement] Changed HDR 3D LUT SMPTE 2084 roll-off colorimetric rendering to do gamut mapping in ICtCp (slightly improved hue and saturation preservation of bright saturated colors).
    • [Trivial] Include output levels detection related files in session archives.

    Fixed in this release:

    • [Moderate] Unhandled exception when trying to set a white or black level target on the calibration tab via the newly introduced measurement buttons (regression of a change in DisplayCAL 3.3.x, SVN revision r4557).
    • [Moderate] Black point compensation for cLUT-type profiles in the advanced options did not work correctly (regression of a change in DisplayCAL 3.3.x, SVN revision r4538).
    • [Moderate] Unhandled exception when creating L*a*b* LUT profiles (regression of multiprocessing changes in DisplayCAL 3.3.x, SVN revision r4433). Note that creating L*a*b* LUT profiles is not recommended due to the limited ICC encoding range (not suitable for wide-gamut) and lower accuracy and smoothness compared to XYZ LUT.
    • [Minor] Output levels detection and alternate forward profiler were not working when using output levels quantization via additional dispread command line option -Z nbits.
    • [Minor] Do not create shaper curves for gamma + matrix profiles.
    • [Minor] Don't fall back to colorimetric rendering for HDR 3D LUT SMPTE 2084 roll-off when using luminance matched appearance or luminance preserving perceptual appearance rendering intents.
    • [Trivial] DIN99c and DIN99d white point misalignment (profile information 2D and 3D gamut view, testchart editor 3D view).
    • [UI] [Cosmetic] Change info panel text to use system text color instead of defaulting to black.
    • [Minor] Linux (0install): Prevent system-installed protobuf package shadowing 0install implementation.
    2017-06-04 16:04 (UTC) 3.3.1

    DisplayCAL 3.3.1

    Fixed in this release:

    • Unhandled exception if using CIECAM02 gamut mapping when creating XYZ LUT profiles from regularly spaced grid patch sets with the alternate forward profiling method introduced in DisplayCAL 3.3.
    2017-05-30 17:48 (UTC) 3.3

    DisplayCAL 3.3

    Added in this release:

    • Profiling engine enhancements:
      • [Feature] Better multi CPU/multi core support. Generating high resolution PCS-to-device tables is now taking more advantage of multiple (physical or logical) processors (typical 2x speedup on a i7 6700K CPU).
      • [Enhancement] Generating a simple high resolution perceptual table is now done by copying the colorimetric table and only generating new input curves. This markedly reduces the processing time needed to create the perceptual table (6x speedup on a i7 6700K CPU).
      • [Enhancement] Black point compensation now tries to maintain the whitepoint hue until closer to the black point. This makes curves + matrix profiles in the default configuration (slightly) more accurate as well as the default simple perceptual table of cLUT profiles provide a result that is closer to the colorimetric table.
      • [Enhancement] The curves tags of XYZ LUT + matrix profiles will now more closely match the device-to-PCS table response (improves grayscale accuracy of the curves tags and profile generation speed slightly).
      • [Enhancement] The curves tags of matrix profiles are further optimized for improved grayscale accuracy (possibly slightly reduced overall accuracy if a display device is not very linear).
      • [Enhancement] XYZ LUT profiles created from small patch sets (79 and 175 patches) with regularly spaced grids (3x3x3+49 and 5x5x5+49) now have improved accuracy due to an alternate forward profiling method that works better for very sparsely sampled data. Most presets now use 5x5x5+49 grid-based patch sets by default that provide a reduction in measurement time at about the same or in some cases even slightly better accuracy than the previously used small patch sets.
      • [Enhancement] Additional PCS candidate based on the actual measured primaries of the display device for generating high resolution PCS-to-device tables. This may further reduce PCS-to-device table generation time in some cases and lead to better utilization of the available cLUT grid points.
    • [Feature] Calibration whitepoint targets other than “As measured” will now also be used as 3D LUT whitepoint target, allowing the use of the visual whitepoint editor to set a custom whitepoint target for 3D LUTs.
    • [Feature] Automatically offer to change the 3D LUT rendering intent to relative colorimetric when setting the calibration whitepoint to “As measured”.
    • [Feature] Support for madVR's ability to send HDR metadata to the display via nVidia or Windows 10 APIs (i.e. switch a HDR capable display to HDR mode) when creating SMPTE 2084 3D LUTs. Note that you need to have profiled the display in HDR mode as well (currently only possible by manually enabling a display's HDR mode).
    • [Feature] Output levels selection as advanced option and automatic output levels detection. Note that this cannot detect if you're driving a display that expects full range (0..255) in limited range (16..235), but it can detect if you're driving a display that expects limited range in full range and will adjust the output levels accordingly.
    • [Feature] New experimental profiling patch sequence advanced options. “Minimize display response delay” is the ArgyllCMS default (same as in previous versions of DisplayCAL). “Maximize lightness difference”, “Maximize luma difference”, “Maximize RGB difference” and “Vary RGB difference” are alternate choices which are aimed at potentially dealing better with displays employing ASBL (automatic static brightness limiting) leading to distorted measurements, and should be used together with display white level drift compensation.
    • [Feature] Optional alternate method for creating colorimeter correction matrices that minimizes xy chromaticity difference (four color matrix method).
    • [Feature] The curve viewer and profile information now have the ability to plot tone response curves of RGB device link profiles.
    • [Feature] The white and black level calibration target can now be set by measurement.
    • [Enhancement] The visual whitepoint editor is now compatible with Chromecast, Web @ localhost, madVR, Prisma and Resolve pattern generators.
    • [Enhancement] 3D LUT generator ReShade 3.0 compatibility.
    • [Feature] Support calibration from WCS profiles embedded in ICC profiles (like the ones created by the Windows Display Color Calibration Tool).
    • [Feature] Profile loader (Windows): Detect the Windows Display Color Calibration Tool.
    • [Feature] Profile loader (Windows): The quantization bitdepth can now be selected.

    Changed in this release:

    • [Enhancement] The visual whitepoint editor now uses the calibration of the currently active display profile as the initial whitepoint.
    • [Enhancement] Temporary files will no longer be removed if moving the files to the final location failed, and a non-empty temporary directory will no longer be removed on exit.
    • [Enhancement] Incomplete runs are now always saved to a folder named 'incomplete' in the parent directory of the 'storage' directory (previously when creating a profile from existing measurement data, a failed run could overwrite existing files in a source folder that did not reside in the 'storage' directory).
    • [Enhancement] Use a different (numbered) logfile name when starting additional instances of the standalone tools.
    • [Enhancement] When creating colorimeter correction matrices from existing spectral reference data, use the selected observer.
    • [UI] Hide the observer selector in the colorimeter correction creation dialog when creating a spectral colorimeter correction as observer isn't applicable in that case.
    • [UI] Remove the single “Browse...” button from the colorimeter correction creation dialog and add individual file pickers for reference and colorimeter measurement data files.
    • [UI] When creating colorimeter corrections for “virtual” display devices like madVR or Resolve, offer to specify the actual display model and manufacturer.
    • [UI] Use smaller increments when paging up/down the black point rate or testchart patches amount sliders.
    • [Cosmetic] Default whitepoint color temperature and chromaticity to 6500K and D65 respectively.
    • [Cosmetic] If you explicitly pause measurements prior to attempting to cancel them, and then dismiss the confirmation dialog, the measurements will no longer automatically resume (unpause) anymore.
    • [Enhancement] Linux: When installing instrument udev rules, backup existing rules to a timestamped backup directory ~/.local/share/DisplayCAL/backup/YYYYMMDDTHHMMSS instead of overwriting existing backups in ~/.local/share/DisplayCAL/backup, and automatically add the current user to the 'colord' group (which will be created if nonexistent) if not yet a member.
    • [Cosmetic] Mac OS X: Don't include ID in profile header (stops ColorSync utility from complaining).
    • [Enhancement] Profile loader (Windows): The selected calibration state will not be implicitly (re-)applied every three seconds, but only if a change in the running processes or video card gamma tables is detected. This has been reported to stop hitching on some systems using Intel integrated graphics, and works around an issue with the Windows 10 Creators Update and fullscreen applications (e.g. games) where the calibration state would not be restored automatically when returning to the desktop.
    • [Enhancement] Profile loader (Windows): The profile loader will check whether or not madVR resets the videoLUT and preserve calibration state if not.
    • [UI] [Cosmetic] Profile loader (Windows): Renamed “Preserve calibration state” menu item to “Load calibration on login & preserve calibration state” to reduce ambiguity.
    • [UI] [Cosmetic] Profile loader (Windows): The tray icon will animate when calibration is reloaded.
    • [UI] [Cosmetic] Windows 7 and newer: Show progress in the taskbar.

    Fixed in this release:

    • [Minor] Prevent ArgyllCMS from removing measurements with one or two zero CIE components by fudging them to be non-zero.
    • [Minor] In some cases the high resolution colorimetric PCS-to-device table of XYZ LUT profiles would clip slightly more near black than expected.
    • [Trivial] Save and restore SMPTE 2084 content colorspace 3D LUT settings with profile.
    • [UI] [Minor] Changing the application language for the second time in the same session when a progress dialog had been shown at any point before changing the language for the first time, resulted in an unhandled exception. This error had the follow-up effect of preventing any standalone tools to be notified of the second language change.
    • [UI] [Trivial] The “Install Argyll instrument drivers” menu item in the “Tools” menu is now always enabled (previously, you would need to select the location of the ArgyllCMS executables first, which was counter-intuitive as the driver installer is separate since DisplayCAL 3.1.7).
    • [UI] [Cosmetic] When showing the main window (e.g. after measurements), the progress dialog (if present) could become overlapped by the main window instead of staying in front of it. Clicking on the progress dialog would not bring it back into the foreground.
    • [UI] [Minor] 3D LUT tab: When selecting a source colorspace with a custom gamma tone response curve, the gamma controls should be shown regardless of whether advanced options are enabled or not.
    • [Trivial] Testchart editor: Pasting values did not enable the “Save” button.
    • [UI] [Minor] Untethered measurement window: The “Measure” button visual state is now correctly updated when cancelling a confirmation to abort automatic measurements.
    • [Minor] Windows: Suppress errors related to WMI (note that this will prevent getting the display name from EDID and individual ArgyllCMS instrument driver installation).
    • [UI] [Cosmetic] Profile loader (Windows): Changing the scaling in Windows display settings would prevent further profile loader tray icon updates (this did not affect functionality).
    • [Minor] Profile loader (Windows): Undefined variable if launched without an active display (i.e. if launched under a user account that is currently not the active session).
    • [Minor] Profile loader (Windows): Original profile loader instance did not close after elevation if the current user is not an administrator.
    2017-02-18 15:52 (UTC) 3.2.4

    3.2.4

    Added in this release:

    • Korean translation thanks to 김환(Howard Kim).

    Changed in this release:

    • Disable observer selection if observer is set by a colorimeter correction.
    • 3D LUT maker: Enable black output offset choice for 16-bit table-based source profiles.
    • Profile loader (Windows): “Automatically fix profile associations” is now enabled by default.
    • Build system: Filter out “build”, “dist” as well as entries starting with a dot (“.”) to speed up traversing the source directory tree (distutils/setuptools hack).

    Fixed in this release:

    • Could not create colorimeter correction from existing measurements for instruments that don't support alternative standard observers.
    • ColorHug / ColorHug2 “Auto” measurement mode threw an error if the extended display identification data did not contain a model name.
    • [Trivial/cosmetic] Testchart editor: When adding reference patches, resize row labels if needed.
    • Profile loader (Linux): When errors occured during calibration loading, there was no longer any message popup.
    • Profile loader (Windows): Filter non-existing profiles (e.g. ones that have been deleted via Windows Explorer without first disassociating them from the display device) from the list of associated profiles (same behavior as Windows color management settings).
    • Profile loader (Windows): When changing the language on-the-fly via DisplayCAL, update primary display device identfier string.
    2017-01-04 14:10 (UTC) 3.2.3

    3.2.3

    Changed in this release:

    • Updated traditional chinese translation (thanks to 楊添明).
    • Profile loader (Windows): When creating the profile loader launcher task, set it to stop existing instance of the task when launching to circumvent a possible Windows bug where a task would not start even if no previous instance was running.

    Fixed in this release:

    • When querying the online colorimeter corrections database for matching corrections, only query for corrections with a matching manufacturer ID in addition to a matching display model name (fixes corrections being offered for displays from different manufacturers, but matching model names).
    • Profile loader (Windows): Fix unhandled exception if no profile is assigned to a display (regression of a change to show the profile description instead of just the file name in DisplayCAL 3.2.1).
    2016-12-13 22:27 (UTC) 3.2.2

    3.2.2

    Changed in this release:

    • Importing colorimeter corrections from other display profiling software now only imports from the explicitly selected entries in automatic mode.
    • Profile loader launcher (Windows): Pass through --oneshot argument to profile loader.

    Fixed in this release:

    • Visual whitepoint editor: Opening a second editor on the same display without first dragging the previously opened editor to another display would overwrite the cached profile association for the current display with the visual whitepoint editor temporary profile, thus preventing the correct profile association being restored when the editor was closed.
    • Mac OS X: Fall back to HTTP when downloading X3D viewer components to work around broken Python TLS support.
    • Windows: When installing instrument drivers, catch WMI errors while trying to query device hardware IDs for instruments.
    • Profile loader (Windows): Possibility of unhandled exception when resuming from sleep if the graphics chipset is an Intel integrated HD graphics with more than one attached display device (may affect other graphics chipsets as well).
    2016-11-25 13:35 (UTC) 3.2.1

    3.2.1

    Changed in this release:

    • Profile loader (Windows Vista and later): The profile loader process now auto-starts with the highest available privileges if installed as administrator. This allows changing system default profile associations whenever logged in with administrative privileges.
    • Profile loader (Windows Vista and later): If running under a restricted user account and using system defaults, clicking any of the “Add...”, “Remove” and “Set as default” buttons will allow to restart the profile loader with elevated privileges.
    • Profile loader (Windows): Show profile description in addition to profile file name in profile associations dialog.

    Fixed in this release:

    • Linux, Windows: Visual whitepoint editor was not working in HiDPI mode.
    • Windows: Irritating “File not found” error after installing a profile with special characters in the profile name (note that the profile was installed regardless).
    • [Cosmetic] Standalone executables (Windows): In HiDPI mode, taskbar and task switcher icons could be showing placeholders due to missing icon files.
    • [Minor] Profile loader (Windows): Enable the profile associations dialog “Add...” button irrespective of the current list of profiles being empty.
    • [Minor] Profile loader (Windows): Suppress error message when trying to remove a profile from the active display device if the profile is the system default for said device (and thus cannot be removed unless running as administrator) but not for the current one.
    • Profile loader (Windows): Do not fail to close profile information windows if the profile associations dialog has already been closed.
    • >
    • Profile loader (Windows): If logging into another user account with different DPI settings while keeping the original session running, then logging out of the other account and returning to the original session, the profile loader could deadlock.
    2016-11-19 11:01 (UTC) 3.2

    3.2

    Added in this release:

    • Visual whitepoint editor. This allows visually adjusting the whitepoint on display devices that lack hardware controls as well as match several displays to one another (or a reference). To use it, set the whitepoint to “Chromaticity” on the “Calibration” tab and click the visual whitepoint editor button (you can open as many visual whitepoint editors simultaneously as you like, so that e.g. one can be left unchanged as reference, while the other can be adjusted to match said reference). The editor window can be put into a distraction-free fullscreen mode by maximizing it (press ESC to leave fullscreen again). Adjust the whitepoint using the controls on the editor tool pane until you have achieved a visual match. Then, place your instrument on the measurement area and click “Measure”. The measured whitepoint will be set as calibration target.
    • Another “Auto” testchart slider step with 154 patches (equal to small testchart for LUT profiles) for XYZ LUT + matrix profile type.

    Changed in this release:

    • Menu overhaul. Menus are now better organized using categorized sub-menus and some menu items have been moved to more appropriate locations:
      • The “Options” menu no longer contains any functionality besides actual options. Advanced options have been moved to a sub-menu.
      • Profile creation from existing measurement files or EDID, profile installation as well as profile upload (sharing) functionality can now be found in the “File” menu.
      • Most functionality available in the “Tools” menu has been grouped into categorized sub-menus, with some of the less-used functionality now available under a separate “Advanced” sub-menu.
      • Measuring the selected testchart, enhancing the effective resolution of a colorimetric PCS-to-device table, loading calibration and resetting the video card gamma tables, detecting displays & instruments, as well as user-initiated spectrometer self-calibration functionality has been moved to the “Tools” menu and respective sub-menus where applicable.
    • Changed default curves + matrix profile testchart as well as first “Auto” testchart slider step back to pre-3.1.7 chart with 73 patches.
    • Better curves + matrix profiles as well as faster computation of XYZ LUT + matrix profiles. The matrix and shaper curves of gamma + matrix, curves + matrix as well as XYZ LUT + matrix profiles are now generated in separate steps which improves the shape and grayscale neutrality of the curves on less well-behaved displays. XYZ LUT + matrix profiles will compute faster, because the curves and matrix are created from a sub-set of the profiling patches, and take around the same time as XYZ LUT + swapped matrix profiles, resulting in a typical overall computation speed increase of around +33% (+100% if just looking at the time needed when not creating PCS-to-device tables) for a XYZ LUT + matrix profile computed from 1148 patches. XYZ LUT + matrix profiles computed from more patches should see a larger computation speed increase of up to +100% depending on patch count.
    • Resolve pattern generator and non-native madVR network implementation: Determine the computer's local network IP address in a way that is hopefully more reliable across platforms.
    • Profile loader (Windows): Detect and work-around buggy Intel video drivers which, despite reverting to linear gamma tables at certain points (e.g. UAC prompts), will effectively ignore attempts to restore the gamma table calibration if it is considered to be already loaded by the driver.
    • Profile loader (Windows): Replaced “Open Windows color management settings...” pop-up menu item with own “Profile associations...” implementation. This should work better with multi-display configurations in contrast to Windows' braindead built-in counterpart, i.e. display devices will be listed under their EDID name (if available) as well as their viewport position and size on the virtual desktop and not only their often meaningless generic driver name like “PnP-Monitor”. Also, there won't be multiple entries for the same display device or ambiguous “1|2” identifications if there are display devices that are currently not part of the desktop due to being disabled in Windows display settings. Changing profile associations around is of course still using Windows color management functionality, but the custom UI will look and act more sane than what Windows color management settings has to offer.
    • Profile loader (Windows): Clicking the task bar tray icon will now always show up-to-date (at the time of clicking) information in the notification popup even if the profile loader is disabled.
    • Profile loader (Windows): Starting a new instance of the profile loader will now always attempt to close an already running instance instead of just notifying it, allowing for easy re-starting.
    • Windows (Vista and later): Installing a profile as system default will now automatically turn off “Use my settings for this device” for the current user, so that if the system default profile is changed by another user, the change is propagated to all users that have opted to use the system default profile (which is the whole point of installing a profile as system default).

    Fixed in this release:

    • Spectrometer self-calibration using an i1 Pro or i1 Pro 2 with Argyll >= 1.9 always presented the emissive dark calibration dialog irrespective of measurement mode (but still correctly did a reflective calibration if the measurement mode was one of the high resolution spectrum modes).
    • User-initiated spectrometer self-calibration was not performed if “Allow skipping of spectrometer self-calibration” was enabled in the “Options” menu and the most recent self-calibration was still fresh.
    • Cosmetic: If an update check, colorimeter correction query or profile sharing upload returned a HTTP status code equal to or greater than 400 (server-side error), an unhandled exception was raised instead of presenting a nicer, formatted error dialog (regression of DisplayCAL 3.1.7 instrument driver installer download related changes).
    • Profile loader (Windows, cosmetic): Reflect changed display resolution and position in UI (doesn't influence functionality).
    • Resolve pattern generator: Unhandled exception if the system hostname could not be resolved to an IP address.
    2016-10-24 10:13 (UTC) 3.1.7.3

    3.1.7.3

    Fixed in this release:

    • 0install (Linux): (un)install-standalone-tools-icons command was broken with 3.1 release.
    • Profile loader (Linux): Unhandled exception if oyranos-monitor is present (regression of late initialization change made in 3.1.7).
    2016-10-21 12:26 (UTC) 3.1.7.2

    3.1.7.2

    Changed in this release:

    • Windows: Toggling the “Load calibration on login” checkbox in the profile installation dialog now also toggles preserving calibration state in the profile loader and vice versa, thus actually affecting if calibration is loaded on login or not (this restores functionality that was lost with the initial DisplayCAL 3.1 release).
    • Windows: The application, setup and Argyll USB driver installer executables are now digitally signed (starting from October 18, 2016 with SHA-1 digest for 3.1.7.1 and dual SHA-1 and SHA-256 digests for 3.1.7.2 from October 21, 2016).

    Fixed in this release:

    • Profile loader (Windows): User-defined exceptions could be lost if exiting the profile loader followed by (re-)loading settings or restoring defaults in DisplayCAL.
    2016-10-18 10:00 (UTC) 3.1.7.1

    3.1.7.1

    Fixed in this release:

    • Profile loader (Windows): Setting calibration state to reset video card gamma tables overwrote cached gamma ramps for the 2nd display in a multi-display configuration.
    2016-10-04 20:49 (UTC) 3.1.7

    3.1.7

    Added in this release:

    • 3D LUT sizes 5x5x5 and 9x9x9.
    • JETI spectraval 1511/1501 support (requires ArgyllCMS >= 1.9).
    • Profile loader (Windows): User-definable exceptions.
    • Profile loader (Windows): Added reset-vcgt scripting command (equivalent to selecting “Reset video card gamma table” from the popup menu).

    Changed in this release:

    • “Auto” resolution of PCS-to-device tables is now limited to 45x45x45 to prevent excessive processing times with profiles from “funky” measurements (i.e. due to bad/inaccurate instrument).
    • Automatically optimized testcharts now use curves + matrix profiles for preconditioning to prevent a possible hang while creating the preconditioned testchart with LUT-type profiles from sufficiently “badly behaved” displays.
    • 2nd auto-optimized testchart slider step now defaults to XYZ LUT profile type as well, and the previous patch count was increased from 97 to 271 (necessary for baseline LUT profile accuracy).
    • Adjusted curves + matrix testcharts to only include fully saturated RGB and grayscale to prevent tinted neutrals and/or “rollercoaster” curves on not-so-well behaved displays (also reduces testchart patch count and measurement time, but may worsen the resulting profile's overall accuracy).
    • Removed near-black and near-white 1% grayscale increments from “video” verification charts.
    • Use a 20 second timeout for unresponsive downloads.
    • Windows: Much easier ArgyllCMS instrument driver installation (for instruments that require it). No need to disable driver signature enforcement under Windows 8/10 anymore. Select “Install ArgyllCMS instrument drivers...” from the “Tools” menu, click “Download & install”, wait briefly for the download to finish (400 KB), confirm the User Access Control popup, done. Note that the driver installer executable is currently not digitally signed (obtaining a suitable certificate from a trusted authority is in progress), but the driver itself is signed as usual. The installer is based on libwdi.
    • Profile loader (Windows): Changed apply-profiles scripting command to behave excatly like selecting “Load calibration from current display device profile(s)” from the popup menu, i.e. not only load calibration, but also change the setting.
    • Profile loader (Windows): Also count calibration state being (re)applied when the profile loader state or profile association(s) changes.

    Fixed in this release:

    • Update measurement modes after importing colorimeter corrections. Fixes additional measurement modes for the Spyder4/5 not appearing until the program is restarted or a different instrument is selected first.
    • Trivial: Instrument setup was unnecessarily being called twice after downloading ArgyllCMS when the latter wasn't previously detected.
    • Mac OS X: Work around a wxPython bug which prevents launching the application from a path containing non-ASCII characters.
    • Mac OS X: Work around a configuration problem affecting ArgyllCMS 1.9 and 1.9.1 (fixes Spyder2 firmware, additional Spyder4/5 measurement modes, and imported colorimeter corrections not being seen by DisplayCAL if imported via ArgyllCMS 1.9 or 1.9.1).
    2016-08-24 21:33 (UTC) 3.1.6

    3.1.6

    Added in this release:

    • HDR/SMPTE 2084: Advanced options to specify maximum content light level for roll-off (use with care!) as well as content colorspace (affects perceptual intent gamut mapping, less so colorimetric).

    Changed in this release:

    • Increased timeout to launch ArgyllCMS tools to 20 seconds.
    • Show failed items when otherwise successfully importing colorimeter corrections, and detect updated CCSS files.
    • HDR/SMPTE 2084: Improve overall saturation preservation.
    • Linux/colord: When checking for a valid colord device ID, also try with manufacturer omitted.
    • Windows Vista and later: Use “known folders” API to determine path to “Downloads” directory.

    Fixed in this release:

    • HDR/SMPTE 2084: Slightly too light near-black tones when black output offset was set to below 100%.
    • Synthetic ICC Profile Creator: Undefined variable when creating synthetic profile with custom gamma or BT.1886 and non-zero black level (regression of HDR-related changes made in 3.1.5).
    • When loading settings from a profile created with DisplayCAL prior to 3.1.5 and custom 3D LUT tone curve gamma in DisplayCAL 3.1.5, the gamma and output offset controls wouldn't be shown if advanced options weren't enabled until re-selecting the tone curve choice.
    • Cosmetic (Windows 10): Banner would go blank under some Windows 10 configurations when showing the profile or 3D LUT installation dialog.
    • Cosmetic (Linux): Missing backgrounds and wrongly sized combo boxes when wxGTK is built against GTK3.
    • Linux: Profile loader autostart entry was installed under wrong (mixed-case) name if installing for the current user, which lead to the loader unnecesarily being run twice if DisplayCAL was installed from a RPM or DEB package. The superfluous loader entry will be automatically removed the next time you install a profile, or you can remove it manually by running rm ~/.config/autostart/z-DisplayCAL-apply-profiles.desktop in a terminal.
    • Linux/colord: Don't cache device IDs that are not the result of a successful query.
    • Windows: Make elevated subprocess calls synchronous. Fixes importing colorimeter corrections system-wide not listing all succesfully imported items on the first use.
    2016-08-02 22:28 (UTC) 3.1.5

    3.1.5

    Added in this release:

    • HDR: Allow specifying of black output offset for SMPTE 2084.

    Changed in this release:

    • HDR: Implemented SMPTE 2084 rolloff according to ITU-R BT.2390.
    • HDR: Implemented SMPTE 2084 3D LUT tone mapping (preserve hue and saturation with rolloff).
    • HDR: Improved SMPTE 2084 3D LUT perceptual intent rendering (better preserve saturation). Note that colorimetric intent is recommended and will also do tone mapping.
    • Linux/colord: Increase timeout when querying for newly installed profiles to 20 seconnds.

    Fixed in this release:

    • Minor: HDR peak luminance textbox was sometimes not able to receive focus.
    • Minor (Mac OS X): Don't omit ICC files from compressed archives (regression of adding device link profiles as possible 3D LUT output format in DisplayCAL 3.1.3).
    2016-07-10 23:35 (UTC) 3.1.4

    3.1.4

    Added in this release:

    • A fourth Rec. 709 encompassing color space variant as a profile connection space candidate for XYZ LUT profiles. May lead to better utilization of PCS-to-device color lookup table grid points in some cases (and thus potentially smaller profiles when the effective resolution is set to the default of “Auto”).
    • An option to include legacy serial ports (if any) in detected instruments.
    • SMPTE 2084 (HDR) as 3D LUT tone curve choice.

    Changed in this release:

    • Don't preserve shaper curves in ICC device link profiles if selected as 3D LUT output format (effectively matching other 3D LUT formats).
    • Removed “Prepress” preset due to large overlap with “Softproof”.
    • Changed “Softproof” preset to use 5800K whitepoint target (in line with Fogra softproof handbook typical photography workflow suggested starting point value) and automatic black point hue correction.
    • Synthetic ICC profile creator: Changed SMPTE 2084 to always clip (optionally with roll-off) if peak white is below 10000 cd/m².
    • Synthetic ICC profile creator: Changed transition to specified black point of generated profiles to be consistent with BT.1886 black point blending (less gradual transition, blend over to specified black point considerably closer to black).
    • Profile loader (Windows): If no profile assigned, load implicit linear calibration.

    Fixed in this release:

    • When loading settings from an existing profile, some CIECAM02 advanced profiling options were not recognized correctly.
    • Don't accidentally remove the current display profile if ArgyllCMS is older than version 1.1 or the ArgyllCMS version is not included in the first line of output due to interference with QuickKeys under Mac OS X.
    • Make sure the ArgyllCMS version is detected even if it isn't contained in the first line of output (fixes ArgyllCMS version not being detected if QuickKeys Input Manager is installed under Mac OS X).
    • When loading settings, add 3D LUT input profile to selector if not yet present.
    • Curve viewer/profile information: Fix potential division by zero error when graphing unusual curves (e.g. non-monotonic or with very harsh bends).
    • Profile information: Reset right pane row background color on each profile load (fixes “named color” profile color swatches sticking even after loading a different profile).
    2016-04-11 10:50 (UTC) 3.1.3.1

    3.1.3.1

    Changed in this release:

    • Updated traditional chinese localization (work-in-progress, thanks to 楊添明).
    • Windows: If madTPG is set to fullscreen and there's more than one display connected, don't temporarily override fullscreen if interactive display adjustment is enabled.

    Fixed in this release:

    • Windows: If interactive display adjustment is disabled and madTPG is set to fullscreen, show instrument placement countdown messages in madTPG OSD.
    • Windows: Restore madTPG fullscreen button state on disconnect if it was temporarily overridden.
    • Profile loader (Windows): Error message when right-clicking the profile loader task tray icon while DisplayCAL is running.
    2016-04-09 12:16 (UTC) 3.1.3

    3.1.3

    Si vous faites la mise à jour depuis DisplayCAL 3.1/3.1.1/3.1.2 autonome sous Windows en utilisant l’installateur , veuillez fermer vous-même le chargeur de profil (s’il est en cours de fonctionnement) avant de lancer la configuration – en raison d’un bogue malencontreux, l’installateur peut ne pas pouvoir se fermer et redémarrer automatiquement le chargeur de profil, ce qui peut alors demander l’utilisation du gestionnaire de tâches pour arrêter le chargeur de profil. Désolé pour la gêne.

    Added in this release:

    • Device link profile as possible 3D LUT output format.
    • French ReadMe (thanks to Jean-Luc Coulon).
    • Partial traditional chinese localization (work-in-progress, thanks to 楊添明).
    • When you change the language in DisplayCAL, the Windows Profile Loader will follow on-the-fly if running.
    • Synthetic ICC profile creator: Capability to specify profile class, technology and colorimetric image state.
    • Windows: When the display configuration is changed while DisplayCAL is running, automatically re-enumerate displays, and load calibration if using the profile loader.
    • Profile loader (Windows): Starting the loader with the --oneshot argument will make it exit after launching.

    Changed in this release:

    • Updated ReShade 3D LUT installation instructions in the ReadMe.
    • Improved “Enhance effective resolution of PCS to device tables” smoothing accuracy slightly.
    • Profile loader (Windows):
      • Detect CPKeeper (Color Profile Keeper) and HCFR.
      • Show any calibration loading errors on startup or display/profile change in a notification popup, and also reflect this with a different icon.

    Fixed in this release:

    • Added semicolon (“;”) to disallowed profile name characters.
    • ICC profile objects were leaking memory.
    • Windows: Made sure that the virtual console size is not larger than the maximum allowed size (fixes possible inability to launch ArgyllCMS tools on some systems if the Windows scaling factor was equal to or above 175%).
    • Windows (Vista and newer): Use system-wide profiles if per-user profiles are disabled.
    • Profile loader (Windows):
      • If Windows calibration management is enabled (not recommended!), correctly reflect the disabled state of the profile loader in the task tray icon and don't load calibration when launching the profile loader (but keep track of profile assignment changes).
      • Prevent a race condition when “Fix profile associations automatically” is enabled and changing the display configuration, which could lead to wrong profile associations not being fixed.
      • Sometimes the loader did not exit cleanly if using taskkill or similar external methods.
      • Prevent a race condition where the loader could try to access a no longer available display device right after a display configuration change, which resulted in no longer being able to influence the calibration state (requiring a loader restart to fix).
      • Profile loader not reacting to display changes under Windows XP.
    2016-03-03 22:33 (UTC) 3.1.2

    3.1.2

    Fixed in this release:

    • Profile loader (Windows): Pop-up wouldn't work if task bar was set to auto-hide.
    2016-02-29 17:42 (UTC) 3.1.1

    3.1.1

    Added in this release:

    • Profile loader (Windows): Right-click menu items to open Windows color management and display settings.

    Changed in this release:

    • Profile loader (Windows):
      • Detect f.lux and dispcal/dispread when running outside DisplayCAL.
      • Don't notify on launch or when detecting DisplayCAL or madVR.
      • Detect madVR through window enumeration instead of via madHcNet (so madVR can be updated without having to close and restart the profile loader).
      • Enforce calibration state periodically regardless of video card gamma table state.
      • Don't use Windows native notifications to overcome their limitations (maximum number of lines, text wrapping).
      • Show profile associations and video card gamma table state in notification popup.

    Fixed in this release:

    • Error after measurements when doing verification with “Untethered” selected as display device and using a simulation profile (not as target).
    • Windows: Sporadic application errors on logout/reboot/shutdown on some systems when DisplayCAL or one of the other applications was still running.
    • Standalone installer (Windows): Remove dispcalGUI program group entries on upgrade.
    • Profile loader (Windows):
      • Error when trying to enable “Fix profile associations automatically” when one or more display devices don't have a profile assigned.
      • Sporadic errors related to taskbar icon redraw on some systems when showing a notification after changing the display configuration (possibly a wxPython/wxWidgets bug).
    • Mac OS X: Application hang when trying to quit while the testchart editor had unsaved changes.
    2016-02-01 00:32 (UTC) 3.1

    3.1

    dispcalGUI has been renamed to DisplayCAL.

    If you upgrade using 0install under Linux: It is recommended that you download the respective DisplayCAL-0install package for your distribution and install it so that the applications accessible via the menu of your desktop environment are updated properly.

    If you upgrade using 0install under Mac OS X: It is recommended that you delete existing dispcalGUI application icons, then download the DisplayCAL-0install.dmg disk image to get updated applications.

    Added in this release:

    • Better HiDPI support. All text should now be crisp on HiDPI displays (with the exception of axis labels on curve and gamut graphs under Mac OS X). Icons will be scaled according to the scaling factor or DPI set in the display settings under Windows, or the respective (font) scaling or DPI system setting under Linux. Icons will be scaled down or up from their 2x version if a matching size is not available. Note that support for crisp icons in HiDPI mode is currently not available in the GTK3 and Mac OS X port of wxPython/wxWidgets. Also note that if you run a multi-monitor configuration, the application is system-DPI aware but not per-monitor-DPI aware, which is a limitation of wxPython/wxWidgets (under Windows, you will need to log out and back in after changing DPI settings for changes to take effect in DisplayCAL).
    • When having created a compressed archive of a profile and related files, it can now also be imported back in via drag'n'drop or the “Load settings...” menu entry and respective button.
    • ArgyllCMS can be automatically downloaded and updated.
    • A compressed logs archive can be created from the log window.
    • Windows: New profile loader. It will stay in the taskbar tray and automatically reload calibration if the display configuration changes or if the calibration is lost (although fullscreen Direct3D applications can still override the calibration). It can also automatically fix profile associations when switching from a multi-monitor configuration to a single display and vice versa (only under Vista and later). In addition, the profile loader is madVR-aware and will disable calibration loading if it detects e.g. madTPG or madVR being used by a video player.

    Changed in this release:

    • Changed default calibration speed from “Medium” to “Fast”. Typically this cuts calibration time in half, while the accuracy difference is negligible at below 0.2 delta E.
    • Enabled “Enhance effective resolution of PCS to device tables” and smoothing for L*a*b* LUT profiles.

    Fixed in this release:

    • In some cases, importing colorimeter corrections from the vendor software CD could fail (falling back to downloading them from the web).
    • Moving the auto testchart patches slider to a value that changed the profile type did not update BPC accordingly (shaper+matrix defaults to BPC on).
    • Minor: Safari/IE messed up positioning of CCT graph vertical axis labels in measurement reports.
    • Minor: When clicking the “Install profile” button while not on the 3D LUT tab, and “Create 3D LUT after profiling” is enabled, don't create a 3D LUT.
    • Minor: When changing profile type, only change the selected testchart if needed, and default to “Auto” for all profile types.
    • Minor: 1st launch defaults were slightly different from what was intended (testchart should be “Auto”).
    • Minor: Use OS line separator when writing configuration files.
    • Linux: Text and icon sizes should be more consistent accross the application when the system text scaling or DPI has been adjusted (application restart required).
    • Linux: Fall back to use the XrandR display name for colord device IDs if EDID is not available.
    • Linux/Mac OS X: madVR test pattern generator interface was prone to connection failures due to a race condition. Also, verifying a madVR 3D LUT didn't work.

    View changelog entries for older versions

    Definitions

    [1] CGATS
    Graphic Arts Technologies Standards, CGATS.5 Data Exchange Format (ANSI CGATS.5-1993 Annex J) = Normes des technologies des arts graphiques, CGATS.5 Format d’échange de données
    [2] CMM / CMS
    Color Management Module / Color Management System = Module de correspondance des couleurs / Système de Gestion de la Couleur — fr.wikipedia.org/wiki/Gestion_de_la_couleur
    [3] GPL
    GNU General Public License = Licence Publique Générale — gnu.org/licenses/gpl-3.0.fr.html
    [4] GUI
    Graphical User Interface = Interface utilisateur graphique
    [5] ICC
    International Color Consortium = Consortium International de la Couleur — color.org
    [6] JSON
    JavaScript Object Notation = Notation Object issue de Javascript. Format léger d’échange de données — json.org
    [7] LUT
    Look Up Table = Table de correspondance — fr.wikipedia.org/wiki/Table_de_correspondance
    [8] SVN
    Subversion, Système de gestion de versions — subversion.tigris.org ; fr.wikipedia.org/wiki/Apache_Subversion
    [9] UAC
    User Account Control = Contrôle de compte de l’utilisateur — fr.wikipedia.org/wiki/User_Account_Control
    [10] EDID
    Extended Display Identification Data = Données étendues d’identification d’écran — fr.wikipedia.org/wiki/Extended_Display_Identification_Data
    [11] PCS
    Profile Connection Space = Espace de connexion des profils — fr.wikipedia.org/wiki/Gestion_de_la_couleur
    [12] UEFI
    Unified Extensible Firmware Interface = Interface extensible de micrologiciel unifiée — fr.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface

    DisplayCAL-3.5.0.0/README.html0000644000076500000000000124451313242313541015331 0ustar devwheel00000000000000 DisplayCAL—Open Source Display Calibration and Characterization powered by ArgyllCMS

    If you'd like to measure color on the go, you may also be interested in ArgyllPRO ColorMeter by Graeme Gill, author of ArgyllCMS. Available for Android from the Google Play store. Check out the 2 Minute Overview + Guided Tour Video.

    About DisplayCAL

    DisplayCAL (formerly known as dispcalGUI) is a display calibration and profiling solution with a focus on accuracy and versatility (in fact, the author is of the honest opinion it may be the most accurate and versatile ICC compatible display profiling solution available anywhere). At its core it relies on ArgyllCMS, an open source color management system, to take measurements, create calibrations and profiles, and for a variety of other advanced color related tasks.

    Calibrate and characterize your display devices using one of many supported measurement instruments, with support for multi-display setups and a variety of available options for advanced users, such as verification and reporting functionality to evaluate ICC profiles and display devices, creating video 3D LUTs, as well as optional CIECAM02 gamut mapping to take into account varying viewing conditions. Other features include:

    • Support of colorimeter corrections for different display device types to increase the absolute accuracy of colorimeters. Corrections can be imported from vendor software or created from measurements if a spectrometer is available.
    • Check display device uniformity via measurements.
    • Test chart editor: Create charts with any amount and composition of color patches, easy copy & paste from CGATS, CSV files (only tab-delimited) and spreadsheet applications, for profile verification and evaluation.
    • Create synthetic ICC profiles with custom primaries, white- and blackpoint as well as tone response for use as working spaces or source profiles in device linking (3D LUT) transforms.
    DisplayCAL is developed and maintained by Florian Höch, and would not be possible without ArgyllCMS, which is developed and maintained by Graeme W. Gill.

    Screenshots


    Display & instrument settings

    Calibration settings

    Profiling settings


    3D LUT settings

    Verification settings

    Testchart editor


    Display adjustment

    Profile information

    Calibration curves


    KDE5

    Mac OS X

    Windows 10

    Disclaimer

    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.

    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.

    DisplayCAL is written in Python and uses the 3rd-party packages NumPy, demjson (JSON[6] library), wxPython (GUI[4] toolkit), as well as Python extensions for Windows and the Python WMI module to provide Windows-specific functionality. Other minor dependencies include PyChromecast, comtypes and pyglet. It makes extensive use of and depends on functionality provided by ArgyllCMS. The build system to create standalone executables additionally uses setuptools and py2app on Mac OS X or py2exe on Windows. All of these software packages are © by their respective authors.

    Get DisplayCAL standalone

    • For Linux

      Native packages for several distributions are available via openSUSE Build Service:

      Packages made for older distributions may work on newer distributions as long as nothing substantial has changed (i.e. Python version). Also there are several distributions out there that are based on one in the above list (e.g. Linux Mint which is based on Ubuntu). This means that packages for that base distribution should also work on derivatives, you just need to know which version the derivative is based upon and pick your download accordingly.

    • For Mac OS X (10.6 or newer)

      Disk image

      Note that due to Mac OS X App Translocation (since 10.12 Sierra), you may need to remove the “quarantine” flag from the non-main standalone application bundles after you have copied them to your computer before you can successfully run them. E.g. if you copied them to /Applications/DisplayCAL-3.5.0.0/, open Terminal and run the following command: xattr -dr com.apple.quarantine /Applications/DisplayCAL-3.5.0.0/*.app

      To verify the integrity of the downloaded file, compare its SHA-256 checksum to that of the respective entry in the SHA-256 checksum list. To obtain the checksum of the downloaded file, run the following command in Terminal: shasum -a 256 /Users/Your Username/Downloads/DisplayCAL-3.5.0.0.dmg

    • For Windows (XP or newer)

      Installer (recommended) or ZIP archive

      To verify the integrity of the downloaded file, compare its SHA-256 checksum to that of the respective entry in the SHA-256 checksum list (case does not matter). To obtain the checksum of the downloaded file, run the following command in a Windows PowerShell command prompt: get-filehash -a sha256 C:\Users\Your Username\Downloads\DisplayCAL-3.5.0.0-[Setup.exe|win32.zip]

    • Source code

      You need to have a working Python installation and all requirements.

      Source Tarball

      To verify the integrity of the downloaded file, compare its SHA-256 checksum to that of the respective entry in the SHA-256 checksum list. To obtain the checksum of the downloaded file, run the following command:
      Linux: sha256sum /home/Your Username/Downloads/DisplayCAL-3.5.0.0.tar.gz
      macOS: shasum -a 256 /Users/Your Username/Downloads/DisplayCAL-3.5.0.0.tar.gz
      Windows (PowerShell command prompt): get-filehash -a sha256 C:\Users\Your Username\Downloads\DisplayCAL-3.5.0.0.tar.gz

      Alternatively, if you don't mind trying out development code, browse the SVN[8] repository of the latest development version (or do a full checkout using svn checkout svn://svn.code.sf.net/p/dispcalgui/code/trunk displaycal). But please note that the development code might contain bugs or not run at all, or only on some platform(s). Use at your own risk.

    Please continue with the Quickstart Guide.

    Get DisplayCAL via Zero Install

    • Brief introduction to Zero Install

      (Note: Usually you do not have to install Zero Install separately, it is handled automatically by the DisplayCAL downloads linked below. The following paragraph is only informational.)

      Zero Install is a decentralised cross-platform software installation system. The benefits you get from Zero Install are:

      • Always up-to-date. Zero Install automatically keeps all software updated.
      • Easily switch between software versions from within Zero Install if desired.
      • No administrator rights needed to add or update software (*).

      * Note: Installing/updating Zero Install itself or software dependencies through the operating system's mechanisms may require administrative privileges.

    • For Linux

      Native packages for several distributions are available via openSUSE Build Service:

      Please note:

      • The version number in the package name does not necessarily reflect the DisplayCAL version.

      Packages made for older distributions may work on newer distributions as long as nothing substantial has changed (i.e. Python version). Also there are several distributions out there that are based on one in the above list (e.g. Linux Mint which is based on Ubuntu). This means that packages for that base distribution should also work on derivatives, you just need to know which version the derivative is based upon and pick your download accordingly. In all other cases, please try the instructions below or one of the standalone installations.

      Alternate installation method

      If your distribution is not listed above, please follow these instructions:

      1. Install the 0install or zeroinstall-injector package from your distribution. In case it is not available, there are pre-compiled generic binaries. Download the appropriate archive for your system, unpack it, cd to the extracted folder in a terminal, and run sudo ./install.sh local to install to /usr/local, or ./install.sh home to install to your home directory (you may have to add ~/bin to your PATH variable in that case). You'll need libcurl installed (most systems have it by default).
      2. Choose the 0install entry from the applications menu (older versions of Zero Install will have an “Add New Program” entry instead).
      3. Drag DisplayCAL's Zero Install feed link to the Zero Install window.

      Note on DisplayCAL's standalone tools under Linux (3D LUT maker, curve viewer, profile information, synthetic profile creator, testchart editor, VRML to X3D converter): If using the alternate installation method, an application icon entry will only be created for DisplayCAL itself. This is currently a limitation of Zero Install under Linux. You can manually install icon entries for the standalone tools by running the following in a terminal:

      0launch --command=install-standalone-tools-icons \
      http://displaycal.net/0install/DisplayCAL.xml

      And you may uninstall them again with:

      0launch --command=uninstall-standalone-tools-icons \
      http://displaycal.net/0install/DisplayCAL.xml
    • For Mac OS X (10.5 or newer)

      Download the DisplayCAL Zero Install Launcher disk image and run any of the included applications.

      To verify the integrity of the downloaded file, compare its SHA-256 checksum to that of the respective entry in the SHA-256 checksum list. To obtain the checksum of the downloaded file, run the following command in Terminal: shasum -a 256 /Users/Your Username/Downloads/DisplayCAL-0install.dmg

    • For Windows (XP or newer)

      Download and install the DisplayCAL Zero Install Setup: Administrator install | Per-user install.

      To verify the integrity of the downloaded file, compare its SHA-256 checksum to that of the respective entry in the SHA-256 checksum list (case does not matter). To obtain the checksum of the downloaded file, run the following command in a Windows PowerShell command prompt: get-filehash -a sha256 C:\Users\Your Username\Downloads\DisplayCAL-0install-Setup[-per-user].exe

    • Manually updating or switching between software versions

      Updates are normally applied automatically. If you want to manually update or switch between software versions, please follow the instructions below.

      • Linux

        Choose the 0install entry from the applications menu (older versions of Zero Install will have a “Manage Programs” entry instead). In the window that opens, right-click the DisplayCAL icon and select “Choose versions” (with older versions of Zero Install, you have to click the small “Update or change version” icon below the “Run” button instead). You can then click the “Refresh all” button to update, or click the small button to the right of an entry and select “Show versions”.

        To select a specific software version, click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

      • Mac OS X

        Run the 0install Launcher. In the window that opens, click the “Refresh all” button to update, or click the small button to the right of an entry and select “Show versions”.

        To select a specific software version, click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

      • Windows

        Choose the Zero Install entry from the start page under Windows 8, or the respective subfolder of the programs folder in the start menu under Windows 10, Windows 7 and earlier, and switch to the “My Applications” tab in the window that opens. Click the small “down” arrow inside the “Start” button to the right of the DisplayCAL entry and choose “Update” or “Select version”.

        To select a specific software version, click on the “change” link next to an item, then click on the version entry and set the rating to “preferred” (note that this will prevent updates being downloaded for the selected software until you manually change to a different version or reset the rating).

    Please continue with the Quickstart Guide.

    Quickstart guide

    This short guide intends to get you up and running quickly, but if you run into a problem, please refer to the full prerequisites and installation sections.

    1. Launch DisplayCAL. If it cannot find ArgyllCMS on your computer, it will prompt you to automatically download the latest version or select the location manually.

    2. Windows only: If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10, you need to install an Argyll-specific driver before continuing (the specbos, spectraval and K-10 may require the FTDI virtual COM port driver instead). Select “Install ArgyllCMS instrument drivers...” from the “Tools” menu. See also “Instrument driver installation under Windows”.

      Mac OS X only: If you want to use the HCFR colorimeter, follow the instructions in the “HCFR Colorimeter” section under “Installing ArgyllCMS on Mac OS X” in the ArgyllCMS documentation before continuing.

      Connect your measurement device to your computer.

    3. Click the small icon with the swirling arrow in between the “Display device” and “Instrument” controls to detect connected display devices and instruments. The detected instrument(s) should show up in the “Instrument” dropdown.

      If your measurement device is a Spyder 2, a popup dialog will show which will let you enable the device. This is required to be able to use the Spyder 2 with ArgyllCMS and DisplayCAL.

      If your measurement device is a i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, a popup dialog will show and allow you to import generic colorimeter corrections from the vendor software which may help measurement accuracy on the type of display you're using. After importing, they are available under the “Correction” dropdown, where you can choose one that fits the type of display you have, or leave it at “Auto” if there is no match. Note: Importing from the Spyder 4/5 software enables additional measurement modes for that instrument.

    4. Click “Calibrate & profile”. That's it!

      Feel free to check out the Wiki for guides and tutorials, and refer to the documentation for advanced usage instructions (optional).

      Linux only: If you can't access your instrument, choose “Install ArgyllCMS instrument configuration files...” from the “Tools” menu (if that menu item is grayed out, the ArgyllCMS version you're currently using has probably been installed from the distribution's repository and should already be setup correctly for instrument access). If you still cannot access the instrument, try unplugging and reconnecting it, or a reboot. If all else fails, read “Installing ArgyllCMS on Linux: Setting up instrument access” in the ArgyllCMS documentation.

    System requirements and other prerequisites

    General system requirements

    • A recent Linux, Mac OS X (10.6 or newer for the standalone version, 10.5 or newer for the 0install version) or Windows (XP/Server 2003 or newer) operating system.
    • A graphics card with at least 24 bits per pixel (true color) support and the desktop set up to use this color depth.

    ArgyllCMS

    To use DisplayCAL, you need to download and install ArgyllCMS (1.0 or newer).

    Supported instruments

    You need one of the supported instruments to make measurements. All instruments supported by ArgyllCMS are also supported by DisplayCAL. For display readings, these currently are:

    Colorimeters

    • CalMAN X2 (treated as i1 Display 2)
    • Datacolor/ColorVision Spyder 2
    • Datacolor Spyder 3 (since ArgyllCMS 1.1.0)
    • Datacolor Spyder 4 (since ArgyllCMS 1.3.6)
    • Datacolor Spyder 5 (since ArgyllCMS 1.7.0)
    • Hughski ColorHug (Linux support since ArgyllCMS 1.3.6, Windows support with newest ColorHug firmware since ArgyllCMS 1.5.0, fully functional Mac OS X support since ArgyllCMS 1.6.2)
    • Hughski ColorHug2 (since ArgyllCMS 1.7.0)
    • Image Engineering EX1 (since ArgyllCMS 1.8.0)
    • Klein K10-A (since ArgyllCMS 1.7.0. The K-1, K-8 and K-10 are also reported to work)
    • Lacie Blue Eye (treated as i1 Display 2)
    • Sencore ColorPro III, IV & V (treated as i1 Display 1)
    • Sequel Imaging MonacoOPTIX/Chroma 4 (treated as i1 Display 1)
    • X-Rite Chroma 5 (treated as i1 Display 1)
    • X-Rite ColorMunki Create (treated as i1 Display 2)
    • X-Rite ColorMunki Smile (since ArgyllCMS 1.5.0)
    • X-Rite DTP92
    • X-Rite DTP94
    • X-Rite/GretagMacbeth/Pantone Huey
    • X-Rite/GretagMacbeth i1 Display 1
    • X-Rite/GretagMacbeth i1 Display 2/LT (the HP DreamColor/Advanced Profiling Solution versions of the instrument are also reported to work)
    • X-Rite i1 Display Pro, ColorMunki Display (since ArgyllCMS 1.3.4. The HP DreamColor, NEC SpectraSensor Pro and SpectraCal C6 versions of the instrument are also reported to work)

    Spectrometers

    • JETI specbos 1211/1201 (since ArgyllCMS 1.6.0)
    • JETI spectraval 1511/1501 (since ArgyllCMS 1.9.0)
    • X-Rite ColorMunki Design/Photo (since ArgyllCMS 1.1.0)
    • X-Rite/GretagMacbeth i1 Monitor (since ArgyllCMS 1.0.3)
    • X-Rite/GretagMacbeth i1 Pro (the EFI ES-1000 version of the instrument is also reported to work)
    • X-Rite i1 Pro 2 (since ArgyllCMS 1.5.0)
    • X-Rite/GretagMacbeth Spectrolino
    • X-Rite i1Studio (since ArgyllCMS 2.0)

    If you've decided to buy a color instrument because ArgyllCMS supports it, please let the dealer and manufacturer know that “You bought it because ArgyllCMS supports it”—thanks.

    Note that the i1 Display Pro and i1 Pro are very different instruments despite their naming similarities.

    Also there are currently (2014-05-20) five instruments (or rather, packages) under the ColorMunki brand, two of which are spectrometers, and three are colorimeters (not all of them being recent offerings, but you should be able to find them used in case they are no longer sold new):

    • The ColorMunki Design and ColorMunki Photo spectrometers differ only in the functionality of the bundled vendor software. There are no differences between the instruments when used with ArgyllCMS and DisplayCAL.
    • The ColorMunki Display colorimeter is a less expensive version of the i1 Display Pro colorimeter. It comes bundled with a simpler vendor software and has longer measurement times compared to the i1 Display Pro. Apart from that, the instrument appears to be virtually identical.
    • The ColorMunki Create and ColorMunki Smile colorimeters are similar hardware as the i1 Display 2 (with the ColorMunki Smile no longer having a built-in correction for CRT but for white LED backlit LCD instead).

    Additional requirements for unattended calibration and profiling

    When using a spectrometer that is supported by the unattended feature (see below), having to take the instrument off the screen to do a sensor self-calibration again after display calibration before starting the measurements for profiling may be avoided if the menu item “Allow skipping of spectrometer self-calibration” under the “Advanced” sub-menu in the “Options” menu is checked (colorimeter measurements are always unattended because they generally do not require a sensor calibration away from the screen, with the exception of the i1 Display 1).

    Unattended calibration and profiling currently supports the following spectrometers in addition to most colorimeters:

    • X-Rite ColorMunki Design/Photo
    • X-Rite/GretagMacbeth i1 Monitor & Pro
    • X-Rite/GretagMacbeth Spectrolino
    • X-Rite i1 Pro 2
    • X-Rite i1Studio

    Be aware you may still be forced to do a sensor calibration if the instrument requires it. Also, please look at the possible caveats.

    Additional requirements for using the source code

    You can skip this section if you downloaded a package, installer, ZIP archive or disk image of DisplayCAL for your operating system and do not want to run from source.

    All platforms:

    • Python >= v2.6 <= v2.7.x (2.7.x is the recommended version. Mac OS X users: If you want to compile DisplayCAL's C extension module, it is advisable to first install XCode and then the official python.org Python)
    • NumPy
    • wxPython GUI[4] toolkit

    Windows:

    Additional requirements for compiling the C extension module

    Normally you can skip this section as the source code contains pre-compiled versions of the C extension module that DisplayCAL uses.

    Linux:

    • GCC and development headers for Python + X11 + Xrandr + Xinerama + Xxf86vm if not already installed, they should be available through your distribution's packaging system

    Mac OS X:

    • XCode
    • py2app if you want to build a standalone executable. On Mac OS X before 10.5, install setuptools first: sudo python util/ez_setup.py setuptools

    Windows:

    • a C-compiler (e.g. MS Visual C++ Express or MinGW. If you're using the official python.org Python 2.6 or later I'd recommend Visual C++ Express as it works out of the box)
    • py2exe if you want to build a standalone executable

    Running directly from source

    After satisfying all additional requirements for using the source code, you can simply run any of the included .pyw files from a terminal, e.g. python2 DisplayCAL.pyw, or install the software so you can access it via your desktop's application menu with python2 setup.py install. Run python2 setup.py --help to view available options.

    One-time setup instructions for source code checked out from SVN:

    Run python2 setup.py to create the version file so you don't see the update popup at launch.

    If the pre-compiled extension module that is included in the sources does not work for you (in that case you'll notice that the movable measurement window's size does not closely match the size of the borderless window generated by ArgyllCMS during display measurements) or you want to re-build it unconditionally, run python2 setup.py build_ext -i to re-build it from scratch (you need to satisfy the requirements for compiling the C extension module first).

    Installation

    It is recommended to first remove all previous versions unless you used Zero Install to get them.

    Instrument driver installation under Windows

    You only need to install the Argyll-specific driver if your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10 (the latter two may require the FTDI virtual COM port driver instead).

    To automatically install the Argyll-specific driver that is needed to use some instruments, launch DisplayCAL and select “Install ArgyllCMS instrument drivers...” from the “Tools” menu. Alternatively, follow the manual instructions below.

    If you are using Windows 8, 8.1, or 10, you need to disable driver signature enforcement before you can install the driver. If Secure Boot is enabled in the UEFI[12] setup, you need to disable it first. Refer to your mainboard or firmware manual how to go about this. Usually entering the firmware setup requires holding the DEL key when the system starts booting.

    Method 1: Disable driver signature enforcement temporarily

    1. Windows 8/8.1: Go to “Settings” (hover the lower right corner of the screen, then click the gear icon) and select “Power” (the on/off icon).
      Windows 10: Click the “Power” button in the start menu.
    2. Hold the SHIFT key down and click “Restart”.
    3. Select “Troubleshoot” → “Advanced Options” → “Startup Settings” → “Restart”
    4. After reboot, select “Disable Driver Signature Enforcement” (number 7 on the list)

    Method 2: Disable driver signature enforcement permanently

    1. Open an elevated command prompt. Search for “Command Prompt” in the Windows start menu, right-click and select “Run as administrator”
    2. Run the following command: bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS
    3. Run the following command: bcdedit /set TESTSIGNING ON
    4. Reboot

    To install the Argyll-specific driver that is needed to use some instruments, launch Windows' Device Manager and locate the instrument in the device list. It may be underneath one of the top level items. Right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer”, “Have Disk...”, browse to the Argyll_VX.X.X\usb folder, open the ArgyllCMS.inf file, click OK, and finally confirm the Argyll driver for your instrument from the list.

    To switch between the ArgyllCMS and vendor drivers, launch Windows' Device Manager and locate the instrument in the device list. It may be underneath one of the top level items. Right click on the instrument and select “Update Driver Software...”, then choose “Browse my computer for driver software”, “Let me pick from a list of device drivers on my computer” and finally select the Argyll driver for your instrument from the list.

    Linux package (.deb/.rpm)

    A lot of distributions allow easy installation of packages via the graphical desktop, i.e. by double-clicking the package file's icon. Please consult your distribution's documentation if you are unsure how to install packages.

    If you cannot access your instrument, first try unplugging and reconnecting it, or a reboot. If that doesn't help, read “Installing ArgyllCMS on Linux: Setting up instrument access”.

    Mac OS X

    Mount the disk image and option-drag its icon to your “Applications” folder. Afterwards open the “DisplayCAL” folder in your “Applications” folder and drag DisplayCAL's icon to the dock if you want easy access.

    If you want to use the HCFR colorimeter under Mac OS X, follow the instructions under “installing ArgyllCMS on Mac OS X” in the ArgyllCMS documentation.

    Windows (Installer)

    Launch the installer which will guide you trough the required setup steps.

    If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10, you need to install an Argyll-specific driver (the specbos, spectraval and K-10 may require the FTDI virtual COM port driver instead). See “Instrument driver installation under Windows”.

    Windows (ZIP archive)

    Unpack and then simply run DisplayCAL from the created folder.

    If your measurement device is not a ColorMunki Display, i1 Display Pro, Huey, ColorHug, specbos, spectraval or K-10, you need to install an Argyll-specific driver (the specbos, spectraval and K-10 may require the FTDI virtual COM port driver instead). See “Instrument driver installation under Windows”.

    Source code (all platforms)

    See the “Prerequisites” section to run directly from source.

    Starting with DisplayCAL 0.2.5b, you can use standard distutils/setuptools commands with setup.py to build, install, and create packages. sudo python setup.py install will compile the extension modules and do a standard installation. Run python setup.py --help or python setup.py --help-commands for more information. A few additional commands and options which are not part of distutils or setuptools (and thus do not appear in the help) are also available:

    Additional setup commands

    0install
    Create/update 0install feeds and create Mac OS X application bundles to run those feeds.
    appdata
    Create/update AppData file.
    bdist_appdmg (Mac OS X only)
    Creates a DMG of previously created (by the py2app or bdist_standalone commands) application bundles, or if used together with the 0install command.
    bdist_deb (Linux/Debian-based)
    Create an installable Debian (.deb) package, much like the standard distutils command bdist_rpm for RPM packages. Prerequisites: You first need to install alien and rpmdb, create a dummy RPM database via sudo rpmdb --initdb, then edit (or create from scratch) the setup.cfg (you can have a look at misc/setup.ubuntu9.cfg for a working example). Under Ubuntu, running utils/dist_ubuntu.sh will automatically use the correct setup.cfg. If you are using Ubuntu 11.04 or any other debian-based distribution which has Python 2.7 as default, you need to edit /usr/lib/python2.7/distutils/command/bdist_rpm.py, and change the line install_cmd = ('%s install -O1 --root=$RPM_BUILD_ROOT ' to install_cmd = ('%s install --root=$RPM_BUILD_ROOT ' by removing the -O1 flag. Also, you need to change /usr/lib/rpm/brp-compress to do nothing (e.g. change the file contents to exit 0, but don't forget to create a backup copy first) otherwise you will get errors when building.
    bdist_pyi
    An alternative to bdist_standalone, which uses PyInstaller instead of bbfreeze/py2app/py2exe.
    bdist_standalone
    Creates a standalone application that does not require a Python installation. Uses bbfreeze on Linux, py2app on Mac OS X and py2exe on Windows. setup.py will try and automatically download/install these packages for you if they are not yet installed and if not using the --use-distutils switch. Note: On Mac OS X, older versions of py2app (before 0.4) are not able to access files inside python “egg” files (which are basically ZIP-compressed folders). Setuptools, which is needed by py2app, will normally be installed in “egg” form, thus preventing those older py2app versions from accessing its contents. To fix this, you need to remove any installed setuptools-<version>-py<python-version>.egg files from your Python installation's site-packages directory (normally found under /Library/Frameworks/Python.framework/Versions/Current/lib). Then, run sudo python util/ez_setup.py -Z setuptools which will install setuptools unpacked, thus allowing py2app to acces all its files. This is no longer an issue with py2app 0.4 and later.
    buildservice
    Creates control files for openSUSE Build Service (also happens implicitly when invoking sdist).
    finalize_msi (Windows only)
    Adds icons and start menu shortcuts to the MSI installer previously created with bdist_msi. Successful MSI creation needs a patched msilib (additional information).
    inno (Windows only)
    Creates Inno Setup scripts which can be used to compile setup executables for standalone applications generated by the py2exe or bdist_standalone commands and for 0install.
    purge
    Removes the build and DisplayCAL.egg-info directories including their contents.
    purge_dist
    Removes the dist directory and its contents.
    readme
    Creates README.html by parsing misc/README.template.html and substituting placeholders like date and version numbers.
    uninstall
    Uninstalls the package. You can specify the same options as for the install command.

    Additional setup options

    --cfg=<name>
    Use an alternate setup.cfg, e.g. tailored for a given Linux distribution. The original setup.cfg is backed up and restored afterwards. The alternate file must exist as misc/setup.<name>.cfg
    -n, --dry-run
    Don't actually do anything. Useful in combination with the uninstall command to see which files would be removed.
    --skip-instrument-configuration-files
    Skip installation of udev rules and hotplug scripts.
    --skip-postinstall
    Skip post-installation on Linux (an entry in the desktop menu will still be created, but may not become visible until logging out and back in or rebooting) and Windows (no shortcuts in the start menu will be created at all).
    --stability=stable | testing | developer | buggy | insecure
    Set the stability for the implementation that is added/updated via the 0install command.
    --use-distutils
    Force setup to use distutils (default) instead of setuptools. This is useful in combination with the bdist* commands, because it will avoid an artificial dependency on setuptools. This is actually a switch, use it once and the choice is remembered until you specify the --use-setuptools switch (see next paragraph).
    --use-setuptools
    Force setup to try and use setuptools instead of distutils. This is actually a switch, use it once and the choice is remembered until you specify the --use-distutils switch (see above).

    Instrument-specific setup

    If your measurement device is a i1 Display 2, i1 Display Pro, ColorMunki Display, DTP94, Spyder 2/3/4/5, you'll want to import the colorimeter corrections that are part of the vendor software packages, which can be used to better match the instrument to a particular type of display. Note: The full range of measurement modes for the Spyder 4/5 are also only available if they are imported from the Spyder 4/5 software.

    Choose “Import colorimeter corrections from other display profiling software...” from DisplayCAL's “Tools” menu.

    If your measurement device is a Spyder 2, you need to enable it to be able to use it with ArgyllCMS and DisplayCAL. Choose “Enable Spyder 2 colorimeter...” from DisplayCAL's “Tools” menu.

    Basic concept of display calibration and profiling

    If you have previous experience, skip ahead. If you are new to display calibration, here is a quick outline of the basic concept.

    First, the display behavior is measured and adjusted to meet user-definable target characteristics, like brightness, gamma and white point. This step is generally referred to as calibration. Calibration is done by adjusting the monitor controls, and the output of the graphics card (via calibration curves, also sometimes called video LUT[7] curves—please don't confuse these with LUT profiles, the differences are explained here) to get as close as possible to the chosen target.
    To meet the user-defined target characteristics, it is generally advisable to get as far as possible by using the monitor controls, and only thereafter by manipulating the output of the video card via calibration curves, which are loaded into the video card gamma table, to get the best results.

    Second, the calibrated displays response is measured and an ICC[5] profile describing it is created.

    Optionally and for convenience purposes, the calibration is stored in the profile, but both still need to be used together to get correct results. This can lead to some ambiguity, because loading the calibration curves from the profile is generally the responsibility of a third party utility or the OS, while applications using the profile to do color transforms usually don't know or care about the calibration (they don't need to). Currently, the only OS that applies calibration curves out-of-the-box is Mac OS X (under Windows 7 or later you can enable it, but it's off by default and doesn't offer the same high precision as the DisplayCAL profile loader)—for other OS's, DisplayCAL takes care of creating an appropriate loader.

    Even non-color-managed applications will benefit from a loaded calibration because it is stored in the graphics card—it is “global”. But the calibration alone will not yield accurate colors—only fully color-managed applications will make use of display profiles and the necessary color transforms.

    Regrettably there are several image viewing and editing applications that only implement half-baked color management by not using the system's display profile (or any display profile at all), but an internal and often unchangeable “default” color space like sRGB, and sending output unaltered to the display after converting to that default colorspace. If the display's actual response is close to sRGB, you might get pleasing (albeit not accurate) results, but on displays which behave differently, for example wide-color-gamut displays, even mundane colors can get a strong tendency towards neon.

    A note about colorimeters, displays and DisplayCAL

    Colorimeters need a correction in hardware or software to obtain correct measurements from different types of displays (please also see “Wide Gamut Displays and Colorimeters” on the ArgyllCMS website for more information). The latter is supported when using ArgyllCMS >= 1.3.0, so if you own a display and colorimeter which has not been specifically tuned for this display (i.e. does not contain a correction in hardware), you can apply a correction that has been calculated from spectrometer measurements to help better measure such a screen.
    You need a spectrometer in the first place to do the necessary measurements to create such a correction, or you may query DisplayCAL's Colorimeter Corrections Database, and there's also a list of contributed colorimeter correction files on the ArgyllCMS websiteplease note though that a matrix created for one particular instrument/display combination may not work well for different instances of the same combination because of display manufacturing variations and generally low inter-instrument agreement of most older colorimeters (with the exception of the DTP94), newer devices like the i1 Display Pro/ColorMunki Display and possibly the Spyder 4/5 seem to be less affected by this.
    Starting with DisplayCAL 0.6.8, you can also import generic corrections from some profiling softwares by choosing the corresponding item in the “Tools” menu.

    If you buy a screen bundled with a colorimeter, the instrument may have been matched to the screen in some way already, so you may not need a software correction in that case.

    Special note about the X-Rite i1 Display Pro, ColorMunki Display and Spyder 4/5 colorimeters

    These instruments greatly reduce the amount of work needed to match them to a display because they contain the spectral sensitivities of their filters in hardware, so only a spectrometer reading of the display is needed to create the correction (in contrast to matching other colorimeters to a display, which needs two readings: One with a spectrometer and one with the colorimeter).
    That means anyone with a particular screen and a spectrometer can create a special Colorimeter Calibration Spectral Set (.ccss) file of that screen for use with those colorimeters, without needing to actually have access to the colorimeter itself.

    Usage

    Through the main window, you can choose your settings. When running calibration measurements, another window will guide you through the interactive part of display adjustment.

    Settings file

    Here, you can load a preset, or a calibration (.cal) or ICC profile (.icc / .icm) file from a previous run. This will set options to those stored in the file. If the file contains only a subset of settings, the other options will automatically be reset to defaults (except the 3D LUT settings, which won't be reset if the settings file doesn't contain 3D LUT settings, and the verification settings which will never be reset automatically).

    If a calibration file or profile is loaded in this way, its name will show up here to indicate that the settings reflect those in the file. Also, if a calibration is present it can be used as the base when “Just Profiling”.
    The chosen settings file will stay selected as long as you do not change any of the calibration or profiling settings, with one exception: When a .cal file with the same base name as the settings file exists in the same directory, adjusting the quality and profiling controls will not cause unloading of the settings file. This allows you to use an existing calibration with new profiling settings for “Just Profiling”, or to update an existing calibration with different quality and/or profiling settings. If you change settings in other situations, the file will get unloaded (but current settings will be retained—unloading just happens to remind you that the settings no longer match those in the file), and current display profile's calibration curves will be restored (if present, otherwise they will reset to linear).

    When a calibration file is selected, the “Update calibration” checkbox will become available, which takes less time than a calibration from scratch. If a ICC[5] profile is selected, and a calibration file with the same base name exists in the same directory, the profile will be updated with the new calibration. Ticking the “Update calibration” checkbox will gray out all options as well as the “Calibrate & profile” and “Just profile” buttons, only the quality level will be changeable.

    Predefined settings (presets)

    Starting with DisplayCAL v0.2.5b, predefined settings for several use cases are selectable in the settings dropdown. I strongly recommend to NOT view these presets as the solitary “correct” settings you absolutely should use unmodified if your use case matches their description. Rather view them as starting points, from where you can work towards your own, optimized (in terms of your requirements, hardware, surroundings, and personal preference) settings.

    Why has a default gamma of 2.2 been chosen for some presets?

    Many displays, be it CRT, LCD, Plasma or OLED, have a default response characteristic close to a gamma of approx. 2.2-2.4 (for CRTs, this is the actual native behaviour; and other technologies typically try to mimic CRTs). A target response curve for calibration that is reasonably close to the native response of a display should help to minimize calibration artifacts like banding, because the adjustments needed to the video card's gamma tables via calibration curves will not be as strong as if a target response farther away from the display's native response had been chosen.

    Of course, you can and should change the calibration response curve to a value suitable for your own requirements. For example, you might have a display that offers hardware calibration or gamma controls, that has been internally calibrated/adjusted to a different response curve, or your display's response is simply not close to a gamma of 2.2 for other reasons. You can run “Report on uncalibrated display device” from the “Tools” menu to measure the approximated overall gamma among other info.

    Tabs

    The main user interface is divided into tabs, with each tab containing a sub-set of settings. Not all tabs may be available at any given time. Unavailable tabs will be grayed out.

    Choosing the display to calibrate and the measurement device

    After connecting the instrument, click the small icon with the swirling arrow in between the “Display device” and “Instrument” controls to detect connected display devices and instruments.

    Choosing a display device

    Directly connected displays will appear at the top of the list as entries in the form “Display Name/Model @ x, y, w, h” with x, y, w and h being virtual screen coordinates depending on resolution and DPI settings. Apart from those directly connected displays, a few additional options are also available:

    Web @ localhost

    Starts a standalone web server on your machine, which then allows a local or remote web browser to display the color test patches, e.g. to calibrate/profile a smartphone or tablet computer.

    Note that if you use this method of displaying test patches, then colors will be displayed with 8 bit per component precision, and any screen-saver or power-saver will not be automatically disabled. You will also be at the mercy of any color management applied by the web browser, and may have to carefully review and configure such color management.

    madVR

    Causes test patches to be displayed using the madVR Test Pattern Generator (madTPG) application which comes with the madVR video renderer (only available for Windows, but you can connect via local network from Linux and Mac OS X). Note that while you can adjust the test pattern configuration controls in madTPG itself, you should not normally alter the “disable videoLUT” and “disable 3D LUT” controls, as these will be set appropriately automatically when doing measurements.

    Note that if you want to create a 3D LUT for use with madVR, there is a “Video 3D LUT for madVR” preset available under “Settings” that will not only configure DisplayCAL to use madTPG, but also setup the correct 3D LUT format and encoding for madVR.

    Prisma

    The Q, Inc./Murideo Prisma is a video processor and combined pattern generator/3D LUT holder accessible over the network.

    Note that if you want to create a 3D LUT for use with a Prisma, there is a “Video 3D LUT for Prisma” preset available under “Settings” that will not only configure DisplayCAL to use a Prisma, but also setup the correct 3D LUT format and encoding.

    Also note that the Prisma has 1 MB of internal memory for custom LUT storage, which is enough for around 15 17x17x17 LUTs. You may occasionally need to enter the Prisma's administrative interface via a web browser to delete old LUTs to make space for new ones.

    Resolve

    Allows you to use the built-in pattern generator of DaVinci Resolve video editing and grading software, which is accessible over the network or on the local machine. The way this works is that you start a calibration or profiling run in DisplayCAL, position the measurement window and click “Start measurement”. A message “Waiting for connection on IP:PORT” should appear. Note the IP and port numbers. In Resolve, switch to the “Color” tab and then choose “Monitor calibration”, “CalMAN” in the “Color” menu (Resolve version 11 and earlier) or the “Workspace” menu (Resolve 12).
    Enter the IP address in the window that opens (port should already be filled) and click “Connect” (if Resolve is running on the same machine as DisplayCAL, enter localhost or 127.0.0.1 instead). The position of the measurement window you placed earlier will be mimicked on the display you have connected via Resolve.

    Note that if you want to create a 3D LUT for use with Resolve, there is a “Video 3D LUT for Resolve” preset available under “Settings” that will not only configure DisplayCAL to use Resolve, but also setup the correct 3D LUT format and encoding.

    Note that if you want to create a 3D LUT for a display that is directly connected (e.g. for Resolve's GUI viewer), you should not use the Resolve pattern generator, and select the actual display device instead which will allow for quicker measurements (Resolve's pattern generator has additional delay).

    Untethered

    See untethered display measurements. Please note that the untethered mode should generally only be used if you've exhausted all other options.

    Choosing a measurement mode

    Some instruments may support different measurement modes for different types of display devices. In general, there are two base measurement modes: “LCD” and “Refresh” (e.g. CRT and Plasma are refresh-type displays). Some instruments like the Spyder 4/5 and ColorHug support additional measurement modes, where a mode is coupled with a predefined colorimeter correction (in that case, the colorimeter correction dropdown will automatically be set to “None”).
    Variations of these measurement modes may be available depending on the instrument: “Adaptive” measurement mode for spectrometers uses varying integration times (always used by colorimeters) to increase accuracy of dark readings. “HiRes” turns on high resolution spectral mode for spectrometers like the i1 Pro, which may increase the accuracy of measurements.

    Drift compensation during measurements (only available if using ArgyllCMS >= 1.3.0)

    White level drift compensation tries to counter luminance changes of a warming up display device. For this purpose, a white test patch is measured periodically, which increases the overall time needed for measurements.

    Black level drift compensation tries to counter measurement deviations caused by black calibration drift of a warming up measurement device. For this purpose, a black test patch is measured periodically, which increases the overall time needed for measurements. Many colorimeters are temperature stabilised, in which case black level drift compensation should not be needed, but spectrometers like the i1 Pro or ColorMunki Design/Photo/i1Studio are not temperature compensated.

    Override display update delay (only available if using ArgyllCMS >= 1.5.0, only visible if “Show advanced options” in the “Options” menu is enabled)

    Normally a delay of 200 msec is allowed between changing a patch color in software, and that change appearing in the displayed color itself. For some instuments (i.e. i1 Display Pro, ColorMunki Display, i1 Pro, ColorMunki Design/Photo/i1Studio, Klein K10-A) ArgyllCMS will automatically measure and set an appropriate update delay during instrument calibration. In rare situations this delay may not be sufficient (ie. some TV's with extensive image processing features turned on), and a larger delay can be set here.

    Override display settle time multiplier (only available if using ArgyllCMS >= 1.7.0, only visible if “Show advanced options” in the “Options” menu is enabled)

    Normally the display technology type determines how long is allowed between when a patch color change appears on the display, and when that change has settled down, and as actually complete within measurement tolerance. A CRT or Plasma display for instance, can have quite a long settling delay due to the decay characteristics of the phosphor used, while an LCD can also have a noticeable settling delay due to the liquid crystal response time and any response time enhancement circuit (instruments without a display technology type selection such as spectrometers assume a worst case).
    The display settle time multiplier allows the rise and fall times of the model to be scaled to extend or reduce the settling time. For instance, a multiplier of 2.0 would double the settling time, while a multiplier of 0.5 would halve it.

    Choosing a colorimeter correction for a particular display

    This can improve a colorimeters accuracy for a particular type of display, please also see “A note about colorimeters, displays and DisplayCAL”. You can import generic matrices from some other display profiling softwares as well as check the online Colorimeter Corrections Database for a match of your display/instrument combination (click the small globe next to the correction dropdown)—please note though that all colorimeter corrections in the online database have been contributed by various users, and their usefulness to your particular situation is up to you to evaluate: They may or may not improve the absolute accuracy of your colorimeter with your display. A list of contributed correction matrices can also be found on the ArgyllCMS website.

    Please note this option is only available if using ArgyllCMS >= 1.3.0 and a colorimeter.

    Calibration settings

    Interactive display adjustment
    Turning this off skips straight to calibration or profiling measurements instead of giving you the opportunity to alter the display's controls first. You will normally want to keep this checked, to be able to use the controls to get closer to the chosen target characteristics.
    Observer

    To see this setting, you need to have an instrument that supports spectral readings (i.e. a spectrometer) or spectral sample calibration (e.g. i1 DisplayPro, ColorMunki Display and Spyder4/5), and go into the “Options” menu, and enable “Show advanced options”.

    This can be used to select a different colorimetric observer, also known as color matching function (CMF), for instruments that support it. The default is the CIE 1931 standard 2° observer.

    Note that if you select anything other than the default 1931 2 degree observer, then the Y values will not be cd/m², due to the Y curve not being the CIE 1924 photopic V(λ) luminosity function.

    White point

    Allows setting the target white point locus to the equivalent of a daylight or black body spectrum of the given temperature in degrees Kelvin, or as chromaticity co-ordinates. By default the white point target will be the native white of the display, and it's color temperature and delta E to the daylight spectrum locus will be shown during monitor adjustment, and adjustments will be recommended to put the display white point directly on the Daylight locus. If a daylight color temperature is given, then this will become the target of the adjustment, and the recommended adjustments will be those needed to make the monitor white point meet the target. Typical values might be 5000 for matching printed output, or 6500, which gives a brighter, bluer look. A white point temperature different to that native to the display may limit the maximum brightness possible.

    A whitepoint other than “As measured” will also be used as the target whitepoint when creating 3D LUTs.

    If you want to find out the current uncalibrated whitepoint of your display, you can run “Report on uncalibrated display device” from the “Tools” menu to measure it.

    If you want to adjust the whitepoint to the chromaticities of your ambient lighting, or those of a viewing booth as used in prepress and photography, and your measurement device has ambient measuring capability (e.g. like the i1 Pro or i1 Display with their respective ambient measurement heads), you can use the “Measure ambient” button next to the whitepoint settings. If you want to measure ambient lighting, place the instrument upwards, beside the display. Or if you want to measure a viewing booth, put a metamerism-free gray card inside the booth and point the instrument towards it. Further instructions how to measure ambient may be available in your instrument's documentation.

    Visual whitepoint editor

    The visual whitepoint editor allows visually adjusting the whitepoint on display devices that lack hardware controls as well as match several displays to one another (or a reference). To use it, set the whitepoint to “Chromaticity” and click the visual whitepoint editor button (you can open as many visual whitepoint editors simultaneously as you like, so that e.g. one can be left unchanged as reference, while the other can be adjusted to match said reference). The editor window can be put into a distraction-free fullscreen mode by maximizing it (press ESC to leave fullscreen again). Adjust the whitepoint using the controls on the editor tool pane until you have achieved a visual match. Then, place your instrument on the measurement area and click “Measure”. The measured whitepoint will be set as calibration target.

    White level

    Set the target brightness of white in cd/m2. If this number cannot be reached, the brightest output possible is chosen, consistent with matching the white point target. Note that many of the instruments are not particularly accurate when assessing the absolute display brightness in cd/m2. Note that some LCD screens behave a little strangely near their absolute white point, and may therefore exhibit odd behavior at values just below white. It may be advisable in such cases to set a brightness slightly less than the maximum such a display is capable of.

    If you want to find out the current uncalibrated white level of your display, you can run “Report on uncalibrated display device” from the “Tools” menu to measure it.

    Black level

    (To see this setting, go into the “Options” menu, and enable “Show advanced options”)

    Can be used to set the target brightness of black in cd/m2 and is useful for e.g. matching two different screens with different native blacks to one another, by measuring the black levels on both (i.e. in the “Tools” menu, choose “Report on uncalibrated display”) and then entering the highest measured value. Normally you may want to use native black level though, to maximize contrast ratio. Setting too high a value may also give strange results as it interacts with trying to achieve the target “advertised” tone curve shape. Using a black output offset of 100% tries to minimize such problems.

    Tone curve / gamma

    The target response curve is normally an exponential curve (output = inputgamma), and defaults to 2.2 (which is close to a typical CRT displays real response). Four pre-defined curves can be used as well: the sRGB colorspace response curve, which is an exponent curve with a straight segment at the dark end and an overall response of approximately gamma 2.2, the L* curve, which is the response of the CIE L*a*b* perceptual colorspace, the Rec. 709 video standard response curve and the SMPTE 240M video standard response curve.
    Another possible choice is “As measured”, which will skip video card gamma table (1D LUT) calibration.

    Note that a real display usually can't reproduce any of the ideal pre-defined curves, since it will have a non-zero black point, whereas all the ideal curves assume zero light at zero input.

    For gamma values, you can also specify whether it should be interpreted relative, meaning the gamma value provided is used to set an actual response curve in light of the non-zero black of the actual display that has the same relative output at 50% input as the ideal gamma power curve, or absolute, which allows the actual power to be specified instead, meaning that after the actual displays non-zero black is accounted for, the response at 50% input will probably not match that of the ideal power curve with that gamma value (to see this setting, you have to go into the “Options” menu, and enable “Show advanced options”).

    To allow for the non-zero black level of a real display, by default the target curve values will be offset so that zero input gives the actual black level of the display (output offset). This ensures that the target curve better corresponds to the typical natural behavior of displays, but it may not be the most visually even progression from display minimum. This behavior can be changed using the black output offset option (see further below).

    Also note that many color spaces are encoded with, and labelled as having a gamma of approximately 2.2 (ie. sRGB, REC 709, SMPTE 240M, Macintosh OS X 10.6), but are actually intended to be displayed on a display with a typical CRT gamma of 2.4 viewed in a darkened environment.
    This is because this 2.2 gamma is a source gamma encoding in bright viewing conditions such as a television studio, while typical display viewing conditions are quite dark by comparison, and a contrast expansion of (approx.) gamma 1.1 is desirable to make the images look as intended.
    So if you are displaying images encoded to the sRGB standard, or displaying video through the calibration, just setting the gamma curve to sRGB or REC 709 (respectively) is probably not what you want! What you probably want to do, is to set the gamma curve to about gamma 2.4, so that the contrast range is expanded appropriately, or alternatively use sRGB or REC 709 or a gamma of 2.2 but also specify the actual ambient viewing conditions via a light level in Lux, so that an appropriate contrast enhancement can be made during calibration. If your instrument is capable of measuring ambient light levels, then you can do so.
    (For in-depth technical information about sRGB, see “A Standard Default Color Space for the Internet: sRGB” at the ICC[5] website for details of how it is intended to be used)

    If you're wondering what gamma value you should use, you can run “Report on uncalibrated display device” from the “Tools” menu to measure the approximated overall gamma among other info. Setting the gamma to the reported value can then help to reduce calibration artifacts like banding, because the adjustments needed for the video card's gamma table should not be as strong as if a gamma further away from the display's native response was chosen.

    Ambient light level

    (To see this setting, go into the “Options” menu, and enable “Show advanced options”)

    As explained for the tone curve settings, often colors are encoded in a situation with viewing conditions that are quite different to the viewing conditions of a typical display, with the expectation that this difference in viewing conditions will be allowed for in the way the display is calibrated. The ambient light level option is a way of doing this. By default calibration will not make any allowances for viewing conditions, but will calibrate to the specified response curve, but if the ambient light level is entered or measured, an appropriate viewing conditions adjustment will be performed. For a gamma value or sRGB, the original viewing conditions will be assumed to be that of the sRGB standard viewing conditions, while for REC 709 and SMPTE 240M they will be assumed to be television studio viewing conditions.
    By specifying or measuring the ambient lighting for your display, a viewing conditions adjustment based on the CIECAM02 color appearance model will be made for the brightness of your display and the contrast it makes with your ambient light levels.

    Please note your measurement device needs ambient measuring capability (e.g. like the i1 Pro or i1 Display with their respective ambient measurement heads) to measure the ambient light level.

    Black output offset

    (To see this setting, go into the “Options” menu, and enable “Show advanced options”)

    Real displays do not have a zero black response, while all the target response curves do, so this has to be allowed for in some way.

    The default way of handling this (equivalent to 100% black output offset) is to allow for this at the output of the ideal response curve, by offsetting and scaling the output values. This defined a curve that will match the responses that many other systems provide and may be a better match to the natural response of the display, but will give a less visually even response from black.

    The other alternative is to offset and scale the input values into the ideal response curve so that zero input gives the actual non-zero display response. This ensures the most visually even progression from display minimum, but might be hard to achieve since it is different to the natural response of a display.

    A subtlety is to provide a split between how much of the offset is accounted for as input to the ideal response curve, and how much is accounted for at the output, where the degree is 0.0 accounts for it all as input offset, and 100% accounts for all of it as output offset.

    Black point correction

    (To see this setting, go into the “Options” menu, and enable “Show advanced options”)

    Normally dispcal will attempt to make all colors down the neutral axis (R=G=B) have the same hue as the chosen white point. Near the black point, red, green or blue can only be added, not subtracted from zero, so the process of making the near black colors have the desired hue, will lighten them to some extent. For a device with a good contrast ratio or a black point that has nearly the same hue as the white, this is not a problem. If the device contrast ratio is not so good, and the black hue is noticeably different to that of the chosen white point (which is often the case for LCD type displays), this could have a noticeably detrimental effect on an already limited contrast ratio. Here the amount of black point hue correction can be controlled.
    By default a factor of 100% will be used, which is usually good for “Refresh”-type displays like CRT or Plasma and also by default a factor of 0% is used for LCD type displays, but you can override these with a custom value between 0% (no correction) to 100% (full correction), or enable automatically setting it based on the measured black level of the display.

    If less than full correction is chosen, then the resulting calibration curves will have the target white point down most of the curve, but will then cross over to the native or compromise black point.

    Black point correction rate (only available if using ArgyllCMS >= 1.0.4)

    (To see this setting, go into the “Options” menu, and enable “Show advanced options”)

    If the black point is not being set completely to the same hue as the white point (ie. because the factor is less than 100%), then the resulting calibration curves will have the target white point down most of the curve, but will then blend over to the native or compromise black point that is blacker, but not of the right hue. The rate of this blend can be controlled. The default value is 4.0, which results in a target that switches from the white point target to the black, moderately close to the black point. While this typically gives a good visual result with the target neutral hue being maintained to the point where the crossover to the black hue is not visible, it may be asking too much of some displays (typically LCD type displays), and there may be some visual effects due to inconsistent color with viewing angle. For this situation a smaller value may give a better visual result (e.g. try values of 3.0 or 2.0. A value of 1.0 will set a pure linear blend from white point to black point). If there is too much coloration near black, try a larger value, e.g. 6.0 or 8.0.

    Calibration speed

    (This setting will not apply and be hidden when the tone curve is set to “As measured”)

    Determines how much time and effort to go to in calibrating the display. The lower the speed, the more test readings will be done, the more refinement passes will be done, the tighter will be the accuracy tolerance, and the more detailed will be the calibration of the display. The result will ultimately be limited by the accuracy of the instrument, the repeatability of the display and instrument, and the resolution of the video card gamma table entries and digital or analogue output (RAMDAC).

    Profiling settings

    Profile quality
    Sets the level of effort and/or detail in the resulting profile. For table based profiles (LUT[7]), it sets the main lookup table size, and hence quality in the resulting profile. For matrix profiles it sets the per channel curve detail level and fitting “effort”.
    Black point compensation (enable “Show advanced options” in the “Options” menu)

    (Note: This option has no effect if just calibrating and creating a simple curves + matrix profile directly from the calibration data without additional profiling measurements)

    This effectively prevents black crush when using the profile, but at the expense of accuracy. It is generally best to only use this option when it is not certain that the applications you are going to use have a high quality color management implementation. For LUT profiles, more sophisticated options exist (i.e. advanced gamut mapping options and use either “Enhance effective resolution of colorimetric PCS[11]-to-device tables”, which is enabled by default, or “Gamut mapping for perceptual intent”, which can be used to create a perceptual table that maps the black point).

    Profile type (enable “Show advanced options” in the “Options” menu)

    Generally you can differentiate between two types of profiles: LUT[7] based and matrix based.

    Matrix based profiles are smaller in filesize, somewhat less accurate (though in most cases smoother) compared to LUT[7] based types, and usually have the best compatibility across CMM[2]s, applications and systems — but only support the colorimetric intent for color transforms. For matrix based profiles, the PCS[11] is always XYZ. You can choose between using individual curves for each channel (red, green and blue), a single curve for all channels, individual gamma values for each channel or a single gamma for all channels. Curves are more accurate than gamma values. A single curve or gamma can be used if individual curves or gamma values degrade the gray balance of an otherwise good calibration.

    LUT[7] based profiles are larger in filesize, more accurate (but may sacrifice smoothness), in some cases less compatible (applications might not be able to use or show bugs/quirks with LUT[7] type profiles, or certain variations of them). When choosing a LUT[7] based profile type, advanced gamut mapping options become available which you can use to create perceptual and/or saturation tables inside the profile in addition to the default colorimetric tables which are always created.
    L*a*b* or XYZ can be used as PCS[11], with XYZ being recommended especially for wide-gamut displays bacause their primaries might exceed the ICC[5] L*a*b* encoding range (Note: Under Windows, XYZ LUT[7] types are only available in DisplayCAL if using ArgyllCMS >= 1.1.0 because of a requirement for matrix tags in the profile, which are not created by prior ArgyllCMS versions).
    As it is hard to verify if the LUT[7] of an combined XYZ LUT[7] + matrix profile is actually used, you may choose to create a profile with a swapped matrix, ie. blue-red-green instead of red-green-blue, so it will be obvious if an application uses the (deliberately wrong) matrix instead of the (correct) LUT because the colors will look very wrong (e.g. everything that should be red will be blue, green will be red, blue will be green, yellow will be purple etc).

    Note: LUT[7]-based profiles (which contain three-dimensional LUTs) might be confused with video card LUT[7] (calibration) curves (one-dimensional LUTs), but they're two different things. Both LUT[7]-based and matrix-based profiles may include calibration curves which can be loaded into a video card's gamma table hardware.

    Advanced gamut mapping options (enable “Show advanced options” in the “Options” menu)

    You can choose any of the following options after selecting a LUT profile type and clicking “Advanced...”. Note: The options “Low quality PCS[11]-to-device tables” and “Enhance effective resolution of colorimetric PCS[11]-to-device table” are mutually exclusive.

    Low quality PCS[11]-to-device tables

    Choose this option if the profile is only going to be used with inverse device-to-PCS[11] gamut mapping to create a DeviceLink or 3D LUT (DisplayCAL always uses inverse device-to-PCS[11] gamut mapping when creating a DeviceLink/3D LUT). This will reduce the processing time needed to create the PCS[11]-to-device tables. Don't choose this option if you want to install or otherwise use the profile.

    Enhance effective resolution of colorimetric PCS[11]-to-device table

    To use this option, you have to select a XYZ or L*a*b* LUT profile type (XYZ will be more effective). This option increases the effective resolution of the PCS[11] to device colorimetric color lookup table by using a matrix to limit the XYZ space and fill the whole grid with the values obtained by inverting the device-to-PCS[11] table, as well as optionally applies smoothing. If no CIECAM02 gamut mapping has been enabled for the perceptual intent, a simple but effective perceptual table (which is almost identical to the colorimetric table, but maps the black point to zero) will also be generated.

    You can also set the interpolated lookup table size. The default “Auto” will use a base 33x33x33 resulution that is increased if needed and provide a good balance between smoothness and accuracy. Lowering the resolution can increase smoothness (at the potential expense of some accuracy), while increasing resolution may make the resulting profile potentially more accurate (at the expense of some smoothness). Note that computation will need a lot of memory (>= 4 GB of RAM recommended to prevent swapping to harddisk) especially at higher resolutions.

    See below example images for the result you can expect, where the original image has been converted from sRGB to the display profile. Note though that the particular synthetic image chosen, a “granger rainbow”, exaggerates banding, real-world material is much less likely to show this. Also note that the sRGB blue in the image is actually out of gamut for the specific display used, and the edges visible in the blue gradient for the rendering are a result of the color being out of gamut, and the gamut mapping thus hitting the less smooth gamut boundaries.

    Original Granger Rainbow image

    Original “granger rainbow” image

    Granger Rainbow - default colorimetric rendering

    Default colorimetric rendering (2500 OFPS XYZ LUT profile)

    Granger Rainbow - “smooth” colorimetric rendering

    “Smooth” colorimetric rendering (2500 OFPS XYZ LUT profile, inverted A2B)

    Granger Rainbow - “smooth” perceptual rendering

    “Smooth” perceptual rendering (2500 OFPS XYZ LUT profile, inverted A2B)

    Default rendering intent for profile

    Sets the default rendering intent. In theory applications could use this, in practice they don't, so changing this setting probably won't have any effect whatsoever.

    CIECAM02 gamut mapping

    Note: When enabling one of the CIECAM02 gamut mapping options, and the source profile is a matrix profile, then enabling effective resolution enhancement will also influence the CIECAM02 gamut mapping, making it smoother, more accurate and also generated faster as a side-effect.

    Normally, profiles created by DisplayCAL only incorporate the colorimetric rendering intent, which means colors outside the display's gamut will be clipped to the next in-gamut color. LUT-type profiles can also have gamut mapping by implementing perceptual and/or saturation rendering intents (gamut compression/expansion). You can choose if and which of those you want by specifying a source profile and marking the appropriate checkboxes. Note that a input, output, display or device colororspace profile should be specified as source, not a non-device colorspace, device link, abstract or named color profile. You can also choose viewing conditions which describe the intended use of both the source and the display profile that is to be generated. An appropriate source viewing condition is chosen automatically based on the source profile type.

    An explanation of the available rendering intents can be found in the 3D LUT section “Rendering intent”.

    For more information on why a source gamut is needed, see “About ICC profiles and Gamut Mapping” in the ArgyllCMS documentation.

    One strategy for getting the best perceptual results with display profiles is as follows: Select a CMYK profile as source for gamut mapping. Then, when converting from another RGB profile to the display profile, use relative colorimetric intent, and if converting from a CMYK profile, use the perceptual intent.
    Another approach which especially helps limited-gamut displays is to choose one of the larger (gamut-wise) source profiles you usually work with for gamut mapping, and then always use perceptual intent when converting to the display profile.

    Please note that not all applications support setting a rendering intent for display profiles and might default to colorimetric (e.g. Photoshop normally uses relative colorimetric with black point compensation, but can use different intents via custom soft proofing settings).

    Testchart file
    You can choose the test patches used when profiling the display here. The default “Auto” optimized setting takes the actual display characteristics into account. You can further increase potential profile accuracy by increasing the number of patches using the slider.
    Patch sequence (enable “Show advanced options” in the “Options” menu)

    Controls the order in which the patches of a testchart are measured. “Minimize display response delay” is the ArgyllCMS test patch generator default, which should lead to the lowest overall measurement time. The other choices (detailed below) are aimed at potentially dealing better with displays employing ASBL (automatic static brightness limiting) leading to distorted measurements, and should be used together with display white level drift compensation (although overall measurement time will increase somewhat by using either option). If your display doesn't have ASBL issues, there is no need to change this settting.

    • Maximize lightness difference will order the patches in such a way that there is the highest possible difference in terms of lightness between patches, while keeping the overall light output relatively constant (but increasing) over time. The lightness of a patch is calculated using sRGB-like relative luminance. This is the recommended setting for dealing with ASBL if you're unsure which choice to make.
    • Maximize luma difference will order the patches in such a way that there is the highest possible difference in terms of luma between patches, while keeping the overall luma relatively constant (but increasing) over time. The luma of a patch is calculated from Rec. 709 luma coefficients. The order of the patches will in most cases be quite similar to “Maximize lightness difference”.
    • Maximize RGB difference will order the patches in such a way that there is the highest possible difference in terms of the red, green and blue components between patches.
    • Vary RGB difference will order the patches in such a way that there is some difference in terms of the red, green and blue components between patches.

    Which of the choices works best on your ASBL display depends on how the display detects wether it should reduce light output. If it looks at the (assumed) relative luminance (or luma), then “Maximize lightness difference” or “Maximize luma difference” should work best. If your display is using an RGB instead of YCbCr signal path, then “Maximize RGB difference” or “Vary RGB difference” may produce desired results.

    Testchart editor

    The provided default testcharts should work well in most situations, but allowing you to create custom charts ensures maximum flexibility when characterizing a display and can improve profiling accuracy and efficiency. See also optimizing testcharts.

    Testchart generation options

    You can enter the amount of patches to be generated for each patch type (white, black, gray, single channel, iterative and multidimensional cube steps). The iterative algorythm can be tuned if more than zero patches are to be generated. What follows is a quick description of the several available iterative algorythms, with “device space” meaning in this case RGB coordinates, and “perceptual space” meaning the (assumed) XYZ numbers of those RGB coordinates. The assumed XYZ numbers can be influenced by providing a previous profile, thus allowing optimized test point placement.

    • Optimized Farthest Point Sampling (OFPS) will optimize the point locations to minimize the distance from any point in device space to the nearest sample point
    • Incremental Far Point Distribution incrementally searches for test points that are as far away as possible from any existing points
    • Device space random chooses test points with an even random distribution in device space
    • Perceptual space random chooses test points with an even random distribution in perceptual space
    • Device space filling quasi-random chooses test points with a quasi-random, space filling distribution in device space
    • Perceptual space filling quasi-random chooses test points with a quasi-random, space filling distribution in perceptual space
    • Device space body centered cubic grid chooses test points with body centered cubic distribution in device space
    • Perceptual space body centered cubic grid chooses test points with body centered cubic distribution in perceptual space

    You can set the degree of adaptation to the known device characteristics used by the default full spread OFPS algorithm. A preconditioning profile should be provided if adaptation is set above a low level. By default the adaptation is 10% (low), and should be set to 100% (maximum) if a profile is provided. But, if for instance, the preconditioning profile doesn't represent the device behavior very well, a lower adaption than 100% might be appropriate.

    For the body centered grid distributions, the angle parameter sets the overall angle that the grid distribution has.

    The “Gamma” parameter sets a power-like (to avoid the excessive compression that a real power function would apply) value applied to all of the device values after they are generated. A value greater than 1.0 will cause a tighter spacing of test values near device value 0.0, while a value less than 1.0 will cause a tighter spacing near device value 1.0. Note that the device model used to create the expected patch values will not take into account the applied power, nor will the more complex full spread algorithms correctly take into account the power.

    The neutral axis emphasis parameter allows changing the degree to which the patch distribution should emphasise the neutral axis. Since the neutral axis is regarded as the most visually critical area of the color space, it can help maximize the quality of the resulting profile to place more measurement patches in this region. This emphasis is only effective for perceptual patch distributions, and for the default OFPS distribution if the adaptation parameter is set to a high value. It is also most effective when a preconditioning profile is provided, since this is the only way that neutral can be determined. The default value of 50% provides an effect about twice the emphasis of the CIE94 Delta E formula.

    The dark region emphasis parameter allows changing the degree to which the patch distribution should emphasis dark region of the device response. Display devices used for video or film reproduction are typically viewed in dark viewing environments with no strong white reference, and typically employ a range of brightness levels in different scenes. This often means that the devices dark region response is of particular importance, so increasing the relative number of sample points in the dark region may improve the balance of accuracy of the resulting profile for video or film reproduction. This emphasis is only effective for perceptual patch distributions where a preconditioning profile is provided. The default value of 0% provides no emphasis of the dark regions. A value somewhere around 15% - 30% is a good place to start for video profile use. A scaled down version of this parameter will be passed on to the profiler. Note that increasing the proportion of dark patches will typically lengthen the time that an instrument takes to read the whole chart. Emphasizing the dark region characterization will reduce the accuracy of measuring and modelling the lighter regions, given a fixed number of test points and profile quality/grid resolution. The parameter will also be used in an analogous way to the “Gamma” value in changing the distribution of single channel, grayscale and multidimensional steps.

    The “Limit samples to sphere” option is used to define an L*a*b* sphere to filter the test points through. Only test points within the sphere (defined by it's center and radius) will be in the generated testchart. This can be good for targeting supplemental test points at a troublesome area of a device. The accuracy of the L*a*b* target will be best when a reasonably accurate preconditioning profile for the device is chosen. Note that the actual number of points generated can be hard to predict, and will depend on the type of generation used. If the OFPS, device and perceptual space random and device space filling quasi-random methods are used, then the target number of points will be achieved. All other means of generating points will generate a smaller number of test points than expected. For this reason, the device space filling quasi-random method is probably the easiest to use.

    Generating diagnostic 3D views of testcharts

    You can generate 3D views in several formats. The default HTML format should be viewable in a modern WebGL-enabled browser. You can choose the colorspace(s) you want to view the results in and also control whether to use RGB black offset (which will lighten up dark colors so they are better visible) and whether you want white to be neutral. All of these options are purely visual and will not influence the actual test patches.

    Other functions

    If generating any number of iterative patches as well as single channel, gray or multidimensional patches, you can add the single channel, gray and multidimensional patches in a separate step by holding the shift key while clicking on “Create testchart”. This prevents those patches affecting the iterative patch distribution, with the drawback of making the patch distribution less even. This is an experimental feature.

    You are also able to:

    • Export patches as CSV, TIFF, PNG or DPX files, and set how often each patch should be repeated when exporting as images after you click the “Export” button (black patches will be repeated according to the “Max” value, and white patches according to the “Min” value, and patches in between according to their lightness in L* scaled to a value between “Min” and “Max”).
    • Add saturation sweeps which are often used in a video or film context to check color saturation. A preconditioning profile needs to be used to enable this.
    • Add reference patches from measurement files in CGATS format, from named color ICC profiles, or by analyzing TIFF, JPEG or PNG images. A preconditioning profile needs to be used to enable this.
    • Sort patches by various color criteria (warning: this will interfere with the ArgyllCMS 1.6.0 or newer patch order optimisation which minimizes measurement times, so manual sorting should only be used for visual inspection of testcharts, or if required to optimize the patch order for untethered measurements in automatic mode where it is useful to maximize the lightness difference from patch to patch so the automatism has an easier time detecting changes).

    Patch editor

    Controls for the spreadsheet-like patch editor are as follows:

    • To select patches, click and drag the mouse over table cells, or hold SHIFT (select range) or CTRL/CMD (add/remove single cells/rows to/from selection)
    • To add a patch below an existing one, double-click a row label
    • To delete patches, select them, then hold CTRL (Linux, Windows) or CMD (Mac OS X) and hit DEL or BACKSPACE (will always delete whole rows even if only single cells are selected)
    • CTRL-C/CTRL-V/CTRL-A = copy/paste/select all

    If you want to insert a certain amount of patches generated in a spreadsheet application (as RGB coordinates in the range 0.0-100.0 per channel), the easiest way to do this is to save them as CSV file and drag & drop it on the testchart editor window to import it.

    Profile name

    As long as you do not enter your own text here, the profile name is auto generated from the chosen calibration and profiling options. The current auto naming mechanism creates quite verbose names which are not necessarily nice to read, but they can help in identifying the profile.
    Also note that the profile name is not only used for the resulting profile, but for all intermediate files as well (filename extensions are added automatically) and all files are stored in a folder of that name. You can choose where this folder is created by clicking the disk icon next to the field (it defaults to your system's default location for user data).

    Here's an example under Linux, on other platforms some file extensions and the location of the home directory will differ. See User data and configuration file locations. You can mouse over the filenames to get a tooltip with a short description what the file is for:

    Chosen profile save path: ~/.local/share/DisplayCAL/storage

    Profile name: mydisplay

    The following folder will be created: ~/.local/share/DisplayCAL/storage/mydisplay

    During calibration & profiling the following files will be created:

    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs ClayRGB1998.log
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs ClayRGB1998.wrz
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs sRGB.log
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay vs sRGB.wrz
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.cal
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.gam.gz
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.icc
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.log
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.ti1
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.ti3
    ~/.local/share/DisplayCAL/storage/mydisplay/mydisplay.wrz

    Any used colorimeter correction file will also be copied to the profile folder.

    Calibrating / profiling

    If you are unclear about the difference between calibration and profiling (also called characterization), see “Calibration vs. Characterization” in the ArgyllCMS documentation.

    Please let the screen stabilize for at least half an hour after powering it up before doing any measurements or assessing its color properties. The screen can be used normally with other applications during that time.

    After you have set your options, click on the button at the bottom to start the actual calibration/profiling process. The main window will hide during measurements, and should pop up again after they are completed (or after an error). You can always cancel out of running measurements using the “Cancel” button in the progress dialog, or by pressing ESC or Q. Viewing the informational log window (from the “Tools” menu) after measurements will give you access to the raw output of the ArgyllCMS commandline tools and other verbose information.

    Adjusting a display before calibration

    If you clicked “Calibrate” or “Calibrate & profile” and have not turned off “Interactive display adjustment”, you will be presented with the interactive display adjustment window which contains several options to help you bring a display's characteristics closer to the chosen target values. Depending on whether you have a “Refresh”- or LCD-type display, I will try to give some recommendations here which options to adjust, and which to skip.

    Adjusting a LCD display

    For LCD displays, you will in most cases only want to adjust white point (if the screen has RGB gain or other whitepoint controls) and white level (with the white level also affecting the black level unless you have a local dimming LED model), as many LCDs lack the necessary “offset” controls to adjust the black point (and even if they happen to have them, they often change the overall color temperature, not only the black point). Also note that for most LCD screens, you should leave the “contrast” control at (factory) default.

    White point
    If your screen has RGB gain, colortemperature or other whitepoint controls, the first step should be adjusting the whitepoint. Note that you may also benefit from this adjustment if you have set the target whitepoint to “native”, as it will allow you to bring it closer to the daylight or blackbody locus, which can help the human visual system to better adapt to the whitepoint. Look at the bars shown during the measurements to adjust RGB gains and minimize the delta E to the target whitepoint.
    White level
    Continue with the white level adjustment. If you have set a target white level, you may reduce or increase the brightness of your screen (ideally using only the backlight) until the desired value is reached (i.e. the bar ends at the marked center position). If you haven't set a target, simply adjust the screen to a visually pleasing brightness that doesn't cause eye strain.
    Adjusting a “Refresh”-type display like CRT or Plasma
    Black level
    On “Refresh”-type displays, this adjustment is usually done using the “brightness” control. You may reduce or increase the brightness of your screen until the desired black level is reached (i.e. the bar ends at the marked center position).
    White point
    The next step should be adjusting the whitepoint, using the display's RGB gain controls or other means of adjusting the whitepoint. Note that you may also benefit from this adjustment if you have set the target whitepoint to “native”, as it will allow you to bring it closer to the daylight or blackbody locus, which can help the human visual system to better adapt to the whitepoint. Look at the bars shown during the measurements to adjust RGB gains and minimize the delta E to the target whitepoint.
    White level
    Continue with the white level adjustment. On “Refresh”-type displays this is usually done using the “contrast” control. If you have set a target white level, you may reduce or increase contrast until the desired value is reached (i.e. the bar ends at the marked center position). If you haven't set a target, simply adjust the screen to a visually pleasing level that doesn't cause eye strain.
    Black point
    If your display has RGB offset controls, you can adjust the black point as well, in much the same way that you adjusted the whitepoint.
    Finishing adjustments and starting calibration/characterization

    After the adjustments, you can run a check on all the settings by choosing the last option from the left-hand menu to verify the achieved values. If adjusting one setting adversely affected another, you can then simply repeat the respective option as necessary until the target parameters are met.

    Finally, select “Continue on to calibration/profiling” to start the non-interactive part. You may want to get a coffee or two as the process can take a fair amount of time, especially if you selected a high quality level. If you only wanted help to adjust the display and don't want/need calibration curves to be created, you can also choose to exit by closing the interactive display adjustment window and then select “Profile only” from the main window.
    If you originally selected “Calibrate & profile” and fulfil the requirements for unattended calibration & profiling, the characterization measurements for the profiling process should start automatically after calibration is finished. Otherwise, you may be forced to take the instrument off the screen to do a sensor self-calibration before starting the profiling measurements.

    Optimizing testcharts for improved profiling accuracy and efficiency

    The easiest way to use an optimized testchart for profiling is to set the testchart to “Auto” and adjusting the patch amount slider to the desired number of test patches. Optimization will happen automatically as part of the profiling measurements (this will increase measurement and processing times by a certain degree).
    Alternatively, if you want to do generate an optimized chart manually prior to a new profiling run, you could go about this in the following way:

    • Have a previous display profile and select it under “Settings”.
    • Select one of the pre-baked testcharts to use as base and bring up the testchart editor.
    • Next to “Preconditioning profile” click on “current profile”. It should automatically select the previous profile you've chosen. Then place a check in the checkbox. Make sure adaptation is set to a high level (e.g. 100%)
    • If desired, adjust the number of patches and make sure the iterative patches amount is not zero.
    • Create the chart and save it. Click “yes” when asked to select the newly generated chart.
    • Start the profiling measurements (e.g. click “calibrate & profile” or “profile only”).

    Profile installation

    When installing a profile after creating or updating it, a startup item to load its calibration curves automatically on login will be created (on Windows and Linux, Mac OS X does not need a loader). You may also prevent this loader from doing anything by removing the check in the “Load calibration curves on Login” checkbox in the profile installation dialog, and in case you are using Windows 7 or later, you may let the operating system handle calibration loading instead (note that the Windows internal calibration loader does not offer the same high precision as the DisplayCAL profile loader, due to wrong scaling and 8-bit quantization).

    Profile loader (Windows)

    Under Windows, the profile loader will stay in the taskbar tray and keep the calibration loaded (unless started with the --oneshot argument, which will make the loader exit after loading calibration). In addition, the profile loader is madVR-aware and will disable calibration loading if it detects e.g. madTPG or madVR being used by a video player. You can double-click the profile loader system tray icon to instantly re-apply the currently selected calibration state (see below). A single click will show a popup with currently associated profiles and calibration information. A right-click menu allows you to set the desired calibration state and a few other options:

    • Load calibration from current display device profile(s). Selecting this (re)loads the calibration instantly, and also sets the desired calibration state (see “Preserve calibration state” below).
    • Reset video card gamma table. Selecting this resets the video card gamma tables instantly, and also sets the desired calibration state (see “Preserve calibration state” below).
    • Load calibration on login & preserve calibration state. This periodically checks if the video card gamma tables match the desired calibration state. It may take up to three seconds until the selected calibration state is automatically re-applied.
    • Fix profile associations automatically when only one display is active in a multi-display setup. This is a work-around for applications (and Windows itself) querying the display profile in a way that does not take into account the active display, which can lead to a wrong profile being used. A pre-requisite for this working correctly is that the profile loader has to be running before you switch from a multi-display to a single-display configuration in Windows, and the profile associations have to be correct at this point. Note that quitting the profile loader will restore profile associations to what they were (honoring any changes to profile associations during its runtime). Also note that profile associations cannot be fixed (and the respective option will be disabled) in display configurations with three or more displays where some of them are deactivated.
    • Show notifications when detecting a 3rd party calibration/profiling software or a user-defined exception (see below).
    • Bitdepth. Some graphics drivers may internally quantize the video card gamma table values to a lower bitdepth than the nominal 16 bits per channel that are encoded in the video card gamma table tag of DisplayCAL-generated profiles. If this quantization is done using integer truncating instead of rounding, this may pronounce banding. In that case, you can let the profile loader quantize to the target bitdepth by using rounding, which may produce a smoother result.
    • Exceptions. You can override the global profile loader state on a per application basis.
    • Profile associations. Brings up a dialog where you can associate profiles to your display devices.
    • Open Windows display settings.

    Creating 3D LUTs

    You can create display correction RGB-in/RGB-out 3D LUTs (for use in video playback or editing applications/devices that don't have ICC support) as part of the profiling process.

    3D LUT settings

    Create 3D LUT after profiling
    Normally after profiling, you'll be given the option to install the profile to make it available for ICC color managed applications. If this box is checked, you'll have the option to generate a 3D LUT (with the chosen settings) instead, and the 3D LUT settings will also be stored inside the profile, so that they can be easily restored by selecting the profile under “Settings” if needed. If this box is unchecked, you can create a 3D LUT from an existing profile.
    Source colorspace/source profile
    This sets the source colorspace for the 3D LUT, which is normally a video standard space like defined by Rec. 709 or Rec. 2020.
    Tone curve
    This allows to set a predefined or custom tone response curve for the 3D LUT. Predefined settings are Rec. 1886 (input offset), Gamma 2.2 (output offset, pure power), SMPTE 2084 hard clip, SMPTE 2084 with roll-off (BT.2390-3) and Hybrid Log-Gamma (HLG).
    Tone curve parameters
    • “Absolute” vs. “Relative” gamma (not available for SMPTE 2084) To accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly.
      “Absolute” gamma results in an actual output at 50% input which doesn't match that of an idealized power curve (unless the black level is zero).
      “Relative” gamma results in an actual output at 50% input which matches that of an idealized power curve.
    • Black output offset To accomodate a non-zero black level of a real display, the tone response curve needs to be offset and scaled accordingly. A black output offset of 0% (= all input offset) scales and offsets the input values (this matches BT.1886), while an offset of 100% scales and offsets the output values (this matches the overall curve shape of a pure power curve). A split between input and output offset is also possible.
    • Display peak luminance (only available for SMPTE 2084) This allows you to adjust the clipping point (when not using roll-off) or roll-off to your display's capabilities.
    • HDR processing (convert HDR to SDR or pass through HDR) (only available for SMPTE 2084 when the 3D LUT format is set to madVR) Whether the 3D LUT will tell madVR to switch the display to HDR mode or not (HDR mode 3D LUTs will need to be set in the “process HDR content by an external 3D LUT” slot, HDR to SDR mode 3D LUTs in the “convert HDR content to SDR by using an external 3D LUT” slot in madVR's HDR options). Note that you need to have profiled the display in the respective mode (SDR or HDR) as well, and that DisplayCAL currently cannot switch a display into HDR mode.
    • Mastering display black and peak luminance (only available for SMPTE 2084 roll-off when advanced options are enabled in the “Options” menu) HDR video content may not have been mastered on a display capable of showing the full range of HDR luminance levels, and so altering the roll-off and specifying clipping points may be desirable to make better use of a target display's luminance capabilities. A way to do this is to specify the mastering display black and peak luminance levels. Note that setting unsuitable values may clip visually relevant information, and therefore you should leave the mastering display black and peak luminance at their default values of 0 cd/m² and 10000 cd/m², respectively, if they cannot be reasonably assumed.
    • Ambient luminance (only available for Hybrid Log-Gamma when advanced options are enabled in the “Options” menu) The default HLG system gamma of 1.2 (for a display with peak nominal luminance of 1000 cd/m² in a reference environment with 5 cd/m² ambient luminance) should be adjusted in non reference viewing environments. This is achieved by taking into account the ambient luminance (as per BT.2390-3).
    • Content colorspace (only available for SMPTE 2084 roll-off when advanced options are enabled in the “Options” menu) HDR video content may not encode the full source gamut, and so compressing the actual encoded gamut (instead of the full source gamut) into the display gamut may be desirable. Note that there is usually no need to change this from the default (DCI P3), and that this setting has most impact on non-colorimetric rendering intents.
    Apply calibration (vcgt) (only visible if “Show advanced options” in the “Options” menu is enabled)
    Apply the profile's 1D LUT calibration (if any) to the 3D LUT. Normally, this should always be enabled if the profile contains a non-linear 1D LUT calibration, otherwise you have to make sure the 1D calibration is loaded whenever the 3D LUT is used.
    Gamut mapping mode (only visible if “Show advanced options” in the “Options” menu is enabled)
    The default gamut mapping mode is “Inverse device to PCS” and gives the most accurate results. In case a profile with high enough PCS-to-device table resolution is used, the option “PCS-to-device” is selectable as well, which allows for quicker generation of a 3D LUT, but is somewhat less accurate.
    Rendering intent
    • “Absolute colorimetric” is intended to reproduce colors exactly. Out of gamut colors will be clipped to the closest possible match. The destination whitepoint will be altered to match the source whitepoint if possible, which may get clipped if it is out of gamut.
    • “Absolute appearance” maps colors from source to destination, trying to match the appearance of colors as closely as possible, but may not exactly map the whitepoint. Out of gamut colors will be clipped to the closest possible match.
    • “Absolute colorimetric with white point scaling” behaves almost exactly like “Absolute colorimetric”, but will scale the source colorspace down to make sure the source whitepoint isn't clipped.
    • “Luminance matched appearance” linearly compresses or expands the luminance axis from white to black to match the source to the destination space, while not otherwise altering the gamut, clipping any out of gamut colors to the closest match. The destination whitepoint is not altered to match the source whitepoint.
    • “Perceptual” uses three-dimensional compression to make the source gamut fit within the destination gamut. As much as possible, clipping is avoided, hues and the overall appearance is maintained. The destination whitepoint is not altered to match the source whitepoint. This intent is useful if the destination gamut is smaller than the source gamut.
    • “Perceptual appearance” uses three-dimensional compression to make the source gamut fit within the destination gamut. As much as possible, clipping is avoided, hues and the overall appearance is maintained. The destination whitepoint is altered to match the source whitepoint. This intent is useful if the destination gamut is smaller than the source gamut.
    • “Luminance preserving perceptual” (ArgyllCMS 1.8.3+) uses compression to make the source gamut fit within the destination gamut, but very heavily weights the preservation of the luminance value of the source, which will compromise the preservation of saturation. No contrast enhancement is used if the dynamic range is reduced. This intent may be of use where preserving the tonal distinctions in images is more important than maintaining overall colorfulness or contrast.
    • “Preserve saturation” uses three-dimensional compression and expansion to try and make the source gamut match the destination gamut, and also favours higher saturation over hue or lightness preservation. The destination whitepoint is not altered to match the source whitepoint.
    • “Relative colorimetric” is intended to reproduce colors exactly, but relative to the destination whitepoint which will not be altered to match the source whitepoint. Out of gamut colors will be clipped to the closest possible match. This intent is useful if you have calibrated a display to a custom whitepoint that you want to keep.
    • “Saturation” uses the same basic gamut mapping as “Preserve saturation”, but increases saturation slightly in highly saturated areas of the gamut.
    3D LUT file format
    Sets the output format for the 3D LUT. Currently supported are Autodesk/Kodak (.3dl), Iridas (.cube), eeColor (.txt), madVR (.3dlut), Pandora (.mga), Portable Network Graphic (.png), ReShade (.png, .fx) and Sony Imageworks (.spi3d). Note that an ICC device link profile (the ICC equivalent of an RGB-in/RGB-out 3D LUT) is always created as well.
    Input/output encoding
    Some 3D LUT formats allow you to set the input/output encoding. Note that in most cases, sensible defaults will be chosen depending on selected 3D LUT format, but may be application- or workflow-specific.
    Input/output bit depth
    Some 3D LUT formats allow you to set the input/output bit depth. Note that in most cases, sensible defaults will be chosen depending on selected 3D LUT format, but may be application- or workflow-specific.

    Installing 3D LUTs

    Depending on the 3D LUT file format, installing or saving the 3D LUT to a specific location may be required before it can be used. You will be asked to install or save the 3D LUT directly after it was created. If you need to install or save the 3D LUT again at a later point, switch to the “3D LUT” tab and click the small “Install 3D LUT” button next to the “Settings” dropdown (the same button that installs display profiles when on the “Display & instrument” tab and a directly connected, desktop-accessible display is selected).

    Installing 3D LUTs for the ReShade injector

    First, you need to download the latest version of ReShade and extract the ZIP file. This should result in a folder “ReShade <version>”. Then, install the 3D LUT from within DisplayCAL to the “ReShade <version>” folder (select the folder when prompted). This will activate the 3D LUT for all applications/games that you're going to use ReShade with, which you can configure using the “ReShade Assistant” application that should come with ReShade (refer to the instructions available on the ReShade website on how to configure ReShade). The default toggle key to turn the 3D LUT on and off is the HOME key. You can change this key or disable the 3D LUT altogether by editing ColorLookUpTable.fx (with a text editor) inside the “ReShade <version>” folder where you installed the 3D LUT. To remove the 3D LUT from ReShade completely, delete ColorLookUpTable.png and ColorLookUpTable.fx in the ReShade folder, as well as edit ReShade.fx and remove the line #include "ColorLookupTable.fx" near the end.

    Verification / measurement report

    You can do verification measurements to assess the display chain's (display profile - video card and the calibration curves in its gamma table - monitor) fit to the measured data, or to find out about the soft proofing capabilities of the display chain.

    To do the former, you have to select a CGATS[1] testchart file containing device values (RGB). The measured values are then compared to the values obtained by feeding the device RGB numbers through the display profile (measured vs expected values). The default verification chart contains 26 patches and can be used, for example, to check if a display needs to be re-profiled. If a RGB testchart with gray patches (R=G=B) is measured, like the default and extended verification charts, you also have the option to evaluate the graybalance through the calibration only, by placing a check in the corresponding box on the report.

    To perform a check on the soft proofing capabilities, you have to provide a CGATS reference file containing XYZ or L*a*b* data, or a combination of simulation profile and testchart file, which will be fed through the display profile to lookup corresponding device (RGB) values, and then be sent to the display and measured. Afterwards, the measured values are compared to the original XYZ or L*a*b* values, which can give a hint how suitable (or unsuitable) the display is for softproofing to the colorspace indicated by the reference.

    The profile that is to be evaluated can be chosen freely. You can select it in DisplayCAL's main window under “settings”. The report files generated after the verification measurements are plain HTML with some embedded JavaScript, and are fully self-contained. They also contain the reference and measurement data, which consists of device RGB numbers, original measured XYZ values, and D50-adapted L*a*b* values computed from the XYZ numbers, and which can be examined as plain text directly from the report at the click of a button.

    HowTo—Common scenarios

    Select the profile you want to evaluate under “Settings” (for evaluating 3D LUTs and DeviceLink profiles, this setting has significance for a Rec. 1886 or custom gamma tone response curve, because they depend on the black level).

    There are two sets of default verification charts in different sizes, one for general use and one for Rec. 709 video. The “small” and “extended” versions can be used for a quick to moderate check to see if a display should be re-profiled, or if the used profile/3D LUT is any good to begin with. The “large” and “xl” versions can be used for a more thorough check. Also, you can create your own customized verification charts with the testchart editor.

    Checking the accuracy of a display profile (evaluating how well the profile characterizes the display)

    In this case, you want to use a testchart with RGB device values and no simulation profile. Select a suitable file under “testchart or reference” and disable “simulation profile”. Other settings that do not apply in this case will be grayed out.

    Checking how well a display can simulate another colorspace (evaluating softproofing capabilities, 3D LUTs, DeviceLink profiles, or native display performance)

    There are two ways of doing this:

    • Use a reference file with XYZ or L*a*b* aim values,
    • or use a combination of testchart with RGB or CMYK device values and an RGB or CMYK simulation profile (for an RGB testchart, it will only allow you to use an RGB simulation profile and vice versa, and equally a CMYK testchart needs to be used with a CMYK simulation profile)

    Then, you have a few options that influence the simulation.

    • Whitepoint simulation. If you are using a reference file that contains device white (100% RGB or 0% CMYK), or if you use a combination of testchart and simulation profile, you can choose if you want whitepoint simulation of the reference or simulation profile, and if so, if you want the whitepoint simulated relative to the display profile whitepoint. To explain the latter option: Let's assume a reference has a whitepoint that is slightly blueish (compared to D50), and a display profile has a whitepoint that is more blueish (compared to D50). If you do not choose to simulate the reference white relative to the display profile whitepoint, and the display profile's gamut is large and accurate enough to accomodate the reference white, then that is exactly what you will get. Depending on the adaptation state of your eyes though, it may be reasonable to assume that you are to a large extent adapted to the display profile whitepoint (assuming it is valid for the device), and the simulated whitepoint will look a little yellowish compared to the display profile whitepoint. In this case, choosing to simulate the whitepoint relative to that of the display profile may give you a better visual match e.g. in a softproofing scenario where you compare to a hardcopy proof under a certain illuminant, that is close to but not quite D50, and the display whitepoint has been matched to that illuminant. It will “add” the simulated whitepoint “on top” of the display profile whitepoint, so in our example the simulated whitepoint will be even more blueish than that of the display profile alone.
    • Using the simulation profile as display profile will override the profile set under “Settings”. Whitepoint simulation does not apply here because color management will not be used and the display device is expected to be in the state described by the simulation profile. This may be accomplished in several ways, for example the display may be calibrated internally or externally, by a 3D LUT or device link profile. If this setting is enabled, a few other options will be available:
      • Enable 3D LUT (if using the madVR display device/madTPG under Windows, or a Prisma video processor). This allows you to check how well the 3D LUT transforms the simulation colorspace to the display colorspace. Note this setting can not be used together with a DeviceLink profile.
      • DeviceLink profile. This allows you to check how well the DeviceLink transforms the simulation colorspace to the display colorspace. Note this setting can not be used together with the “Enable 3D LUT” setting.
    • Tone response curve. If you are evaluating a 3D LUT or DeviceLink profile, choose the same settings here as during 3D LUT/DeviceLink creation (and also make sure the same display profile is set, because it is used to map the blackpoint).
      To check a display that does not have an associated profile (e.g. “Untethered”), set the verification tone curve to “Unmodified”. In case you want to verify against a different tone response curve instead, you need to create a synthetic profile for this purpose (“Tools” menu).

    How were the nominal and recommended aim values chosen?

    The nominal tolerances, with the whitepoint, average, maximum and gray balance Delta E CIE 1976 aim values stemming from UGRA/Fogra Media Wedge and UDACT, are pretty generous, so I've included somewhat stricter “recommended” numbers which I've chosen more or less arbitrarily to provide a bit “extra safety margin”.

    For reports generated from reference files that contain CMYK numbers in addition to L*a*b* or XYZ values, you can also select the official Fogra Media Wedge V3 or IDEAlliance Control Strip aim values for paper white, CMYK solids and CMY grey, if the chart contains the right CMYK combinations.

    How are the results of the profile verification report to be interpreted?

    This depends on the chart that was measured. The explanation in the first paragraph sums it up pretty well: If you have calibrated and profiled your display, and want to check how well the profile fits a set of measurements (profile accuracy), or if you want to know if your display has drifted and needs to be re-calibrated/re-profiled, you select a chart containing RGB numbers for the verification. Note that directly after profiling, accuracy can be expected to be high if the profile characterizes the display well, which will usually be the case if the display behaviour is not very non-linear, in which case creating a LUT profile instead of a “Curves + matrix” one, or increasing the number of measured patches for LUT profiles, can help.

    If you want to know how well your profile can simulate another colorspace (softproofing), select a reference file containing L*a*b* or XYZ values, like one of the Fogra Media Wedge subsets, or a combination of a simulation profile and testchart. Be warned though, only wide-gamut displays will handle a larger offset printing colorspace like FOGRA39 or similar well enough.

    In both cases, you should check that atleast the nominal tolerances are not exceeded. For a bit “extra safety margin”, look at the recommended values instead.

    Note that both tests are “closed-loop” and will not tell you an “absolute” truth in terms of “color quality” or “color accuracy” as they may not show if your instrument is faulty/measures wrong (a profile created from repeatable wrong measurements will usually still verify well against other wrong measurements from the same instrument if they don't fluctuate too much) or does not cope with your display well (which is especially true for colorimeters and wide-gamut screens, as such combinations need a correction in hardware or software to obtain accurate results—this problem does not exist with spectrometers, which do not need a correction for wide-gamut, but have lately been discovered to have issues measuring the correct brightness of some LED backlit displays which use white LEDs), or if colors on your screen match an actual colored object next to it (like a print). It is perfectly possible to obtain good verification results but the actual visual performance being sub-par. It is always wise to combine such measurements with a test of the actual visual appearance via a “known good” reference, like a print or proof (although it should not be forgotten that those also have tolerances, and illumination also plays a big role when assessing visual results). Keep all that in mind when admiring (or pulling your hair out over) verification results :)

    How are profiles evaluated against the measured values?

    Different softwares use different methods (which are not always disclosed in detail) to compare and evaluate measurements. This section aims to give interested users a better insight how DisplayCAL's profile verification feature works “under the hood”.

    How is a testchart or reference file used?

    There are currently two slightly different paths depending if a testchart or reference file is used for the verification measurements, as outlined above. In both cases, Argyll's xicclu utility is run behind the scenes and the values of the testchart or reference file are fed relative colorimetrically (if no whitepoint simualtion is used) or absolute colorimetrically (if whitepoint simulation is used) through the profile that is tested to obtain corresponding L*a*b* (in the case of RGB testcharts) or device RGB numbers (in the case of XYZ or L*a*b* reference files or a combination of simulation profile and testchart). If a combination of simulation profile and testchart is used as reference, the reference L*a*b* values are calculated by feeding the device numbers from the testchart through the simulation profile absolute colorimetrically if whitepoint simulation is enabled (which will be the default if the simulation profile is a printer profile) and relative colorimetrically if whitepoint simulation is disabled (which will be the default if the simulation profile is a display profile, like most RGB working spaces). Then, the original RGB values from the testchart, or the looked up RGB values for a reference are sent to the display through the calibration curves of the profile that is going to be evaluated. A reference white of D50 (ICC default) and complete chromatic adaption of the viewer to the display's whitepoint is assumed if “simulate whitepoint relative to display profile whitepoint” is used, so the measured XYZ values are adapted to D50 (with the measured whitepoint as source reference white) using the Bradford transform (see Chromatic Adaption on Bruce Lindbloom's website for the formula and matrix that is used by DisplayCAL) or with the adaption matrix from the profile in the case of profiles with 'chad' chromatic adaption tag, and converted to L*a*b*. The L*a*b* values are then compared by the generated dynamic report, with user-selectable critera and ΔE (delta E) formula.

    How is the assumed vs. measured whitepoint ΔE calculated?

    In a report, the correlated color temperature and assumed target whitepoint, as well as the whitepoint ΔE, do warrant some further explanations: The whitepoint ΔE is calculated as difference between the measured whitepoint's and the assumed target whitepoint's normalized XYZ values, which are first converted to L*a*b*. The assumed target whitepoint color temperature shown is simply the rounded correlated color temparature (100K threshold) calculated from the measured XYZ values. The XYZ values for the assumed target whitepoint are obtained by calculating the chromaticity (xy) coordinates of a CIE D (daylight) or blackbody illuminant of that color temperature and converting them to XYZ. You can find all the used formulas on Bruce Lindbloom's website and on Wikipedia.

    How is the gray balance “range” evaluated?

    The gray balance “range” uses a combined delta a/delta b absolute deviation (e.g. if max delta a = -0.5 and max delta b = 0.7, the range is 1.2). Because results in the extreme darks can be problematic due to lack of instrument accuracy and other effects like a black point which has a different chromaticity than the whitepoint, the gray balance check in DisplayCAL only takes into account gray patches with a minimum measured luminance of 1% (i.e. if the white luminance = 120 cd/m², then only patches with at least 1.2 cd/m² will be taken into account).

    What does the “Evaluate gray balance through calibration only” checkbox on a report actually do?

    It sets the nominal (target) L* value to the measured L* value and a*=b*=0, so the profile is effectively ignored and only the calibration (if any) will influence the results of the gray balance checks. Note that this option will not make a difference for a “Single curve + matrix” profile, as the single curve effectively already achieves a similar thing (the L* values can be different, but they are ignored for the gray balance checks and only influence the overall result).

    What do the “Use absolute values” and “Use display profile whitepoint as reference white” checkboxes on a report do?

    If you enable “Use absolute values” on a report, the chromatic adaptation to D50 is undone (but the refrence white for the XYZ to L*a*b* conversion stays D50). This mode is useful when checking softproofing results using a CMYK simulation profile, and will be automatically enabled if you used whitepoint simulation during verification setup without enabling whitepoint simulation relative to the profile whitepoint (true absolute colorimetric mode). If you enable “Use display profile whitepoint as reference white”, then the reference white used for the XYZ to L*a*b* conversion will be that of the display profile, which is useful when verifying video calibrations where the target is usually some standard color space like Rec. 709 with a D65 equivalent whitepoint.

    Special functionality

    Remote measurements and profiling

    When using ArgyllCMS 1.4.0 and newer, remote measurements on a device not directly connected to the machine that is running DisplayCAL is possible (e.g. a smartphone or tablet). The remote device needs to be able to run a web browser (Firefox recommended), and the local machine running DisplayCAL may need firewall rules added or altered to allow incoming connections. To set up remote profiling, select “Web @ localhost” from the display device dropdown menu, then choose the desired action (e.g. “Profile only”). When the message “Webserver waiting at http://<IP>:<Port>” appears, open the shown address in the remote browser and attach the measurement device.
    NOTE: If you use this method of displaying test patches, there is no access to the display video LUT[7]s and hardware calibration is not possible. The colors will be displayed with 8 bit per component precision, and any screen-saver or power-saver will not be automatically disabled. You will also be at the mercy of any color management applied by the web browser, and may have to carefully review and configure such color management.
    Note: Close the web browser window or tab after each run, otherwise reconnection may fail upon further runs.

    madVR test pattern generator

    DisplayCAL supports the madVR test pattern generator (madTPG) and madVR 3D LUT formats since version 1.5.2.5 when used together with ArgyllCMS 1.6.0 or newer.

    Resolve (10.1+) as pattern generator

    Since version 2.5, DisplayCAL can use Resolve (10.1+) as pattern generator. Select the “Resolve” entry from the display devices dropdown in DisplayCAL and in Resolve itself choose “Monitor calibration”, “CalMAN” in the “Color” menu.

    Untethered display measurements

    Please note that the untethered mode should generally only be used if you've exhausted all other options.

    Untethered mode is another option to measure and profile a remote display that is not connected via standard means (calibration is not supported). To use untethered mode, the testchart that should be used needs to be optimized, then exported as image files (via the testchart editor) and those image files need to be displayed on the device that should be measured, in successive order. The procedure is as follows:

    • Select the desired testchart, then open the testchart editor.
    • Select “Maximize lightness difference” from the sorting options dropdown, click “Apply”, then export the testchart.
    • Burn the images to a DVD, copy them on an USB stick or use any other available means to get them to display onto the device that should be measured.
    • In DisplayCAL's display dropdown, select “Untethered” (the last option).
    • Show the first image on the remote display, and attach the instrument. Then select “Profile only”.

    Measurements will commence, and changes in the displayed image should be automatically detected if “auto” mode is enabled. Use whatever means available to you to cycle through the images from first to last, carefully monitoring the measurement process and only changing to the next image if the current one has been successfully measured (as will be shown in the untethered measurement window). Note that untethered mode will be (atleast) twice as slow as normal display measurements.

    Non-UI functionality

    There is a bit of functionality that is not available via the UI and needs to be run from a command prompt or ternminal. Use of this functionality currently requires 0install, or running from source.

    Change display profile and calibration whitepoint

    Note that this reduces the profile gamut and accuracy.

    Via 0install:

    0install run --command=change-display-profile-cal-whitepoint -- \
      http://displaycal.net/0install/DisplayCAL.xml \
      [-t temp | -T temp | -w x,y] [--cal-only] [inprofile] outfilename

    From source:

    python util/change_display_profile_cal_whitepoint.py- \
      http://displaycal.net/0install/DisplayCAL.xml \
      [-t temp | -T temp | -w x,y] [--cal-only] [inprofile] outfilename
    -t temp
    Use daylight color temperature temp as whitepoint target.
    -T temp
    Use blackbody color temperature temp as whitepoint target.
    -w x,y
    Use x,y chromaticity as whitepoint target.
    --cal-only (optional)
    Only alter the calibration embedded in the profile, not the profile itself.
    inprofile (optional)
    Use profile inprofile instead of the current display profile.
    outfilename
    Output profile filename. The changed profile will be written to this file.
    Enable/disable Windows 7 and later calibration loading

    Note that Windows calibration loading is of lower quality than using ArgyllCMS because Windows always quantizes the calibration to 8 bit and scales it wrongly. This is not the case when using the DisplayCAL calibration loader which uses ArgyllCMS.

    Via 0install:

    0install run --command=set-calibration-loading -- \
      http://displaycal.net/0install/DisplayCAL.xml [--os]

    From source:

    python -c "import sys; from DisplayCAL import util_win; \
      util_win.calibration_management_isenabled() or \
      util_win.enable_calibration_management() \
      if '--os' in sys.argv[1:] else \
      not util_win.calibration_management_isenabled() or \
      util_win.disable_calibration_management();" [--os]

    The --os option determines wether Windows calibration loading functionality should be enbaled or disabled.

    Scripting

    DisplayCAL supports scripting locally and over the network (the latter must be explicitly enabled by setting app.allow_network_clients = 1 in DisplayCAL.ini) via sockets. DisplayCAL must be already running on the target machine for this to work. Below is an example connecting to a running instance on the default port 15411 and starting calibration measurements (the port is configurable in DisplayCAL.ini as app.port, although if the desired port is not available an unused one will be chosen automatically. You can read the actual used port from the file DisplayCAL.lock in the configuration file folder of DisplayCAL while it is running). The example is written in Python and deals with some of the intricacies of sockets as well.

    #!/usr/bin/env python2
    
    import socket
    
    class DCGScriptingClientSocket(socket.socket):
    
    	def __enter__(self):
    		return self
    
    	def __exit__(self, etype, value, tb):
    		# Disconnect
    		try:
    			# Will fail if the socket isn't connected, i.e. if there was an
    			# error during the call to connect()
    			self.shutdown(socket.SHUT_RDWR)
    		except socket.error:
    			pass
    		self.close()
    
    	def __init__(self):
    		socket.socket.__init__(self)
    		self.recv_buffer = ''
    
    	def get_single_response(self):
    		# Buffer received data until EOT (response end marker) and return
    		# single response (additional data will still be in the buffer)
    		while not '\4' in self.recv_buffer:
    			incoming = self.recv(4096)
    			if incoming == '':
    				raise socket.error("Connection broken")
    			self.recv_buffer += incoming
    		end = self.recv_buffer.find('\4')
    		single_response = self.recv_buffer[:end]
    		self.recv_buffer = self.recv_buffer[end + 1:]
    		return single_response
    
    	def send_and_check(self, command, expected_response="ok"):
    		""" Send command, get & check response """
    		self.send_command(command)
    		single_response = self.get_single_response()
    		if single_response != expected_response:
    			# Check application state. If a modal dialog is displayed, choose
    			# the OK option. Note that this is just an example and normally you
    			# should be very careful with this, as it could mean confirming a
    			# potentially destructive operation (e.g. discarding current
    			# settings, overwriting existing files etc).
    			self.send_command('getstate')
    			state = self.get_single_response()
    			if 'Dialog' in state.split()[0]:
    				self.send_command('ok')
    				if self.get_single_response() == expected_response:
    					return
    			raise RuntimeError('%r got unexpected response: %r != %r' %
    							   (command, single_response, expected_response))
    
    	def send_command(self, command):
    		# Automatically append newline (command end marker)
    		self.sendall(command + '\n')
    
    # Generate a list of commands we want to execute in order
    commands = []
    
    # Load “Laptop” preset
    commands.append('load presets/laptop.icc')
    
    # Setup calibration & profiling measurements
    commands.append('calibrate-profile')
    
    # Start actual measurements
    commands.append('measure')
    
    # Create socket & send commands
    with DCGScriptingClientSocket() as client:
    	client.settimeout(3)  # Set a timeout of 3 seconds
    
    	# Open connection
    	client.connect(('127.0.0.1', 15411))  # Default port
    
    	for command in commands:
    		client.send_and_check(command)
    
    

    Each command needs to be terminated with a newline character (after any arguments the command may accept). Note that data sent must be UTF-8 encoded, and if arguments contain spaces they should be encased in double or single quotes. You should check the response for each command sent (the response end marker is ASCII 0x4 EOT, and the default response format is a plain text format, but JSON and XML are also available). The common return values for commands are either ok in case the command was understood (note that this does not indicate if the command finished processing), busy or blocked in case the command was ignored because another operation was running or a modal dialog blocks the UI, failed in case the command or an argument could not be processed successfully, forbidden in case the command was not allowed (this may be a temporary condition depending on the circumstances, e.g. when trying to interact with an UI element that is currently disabled), invalid in case the command (or one of its arguments) was invalid, or error followed by an error message in case of an unhandled exception. Other return values are possible depending on the command. All values returned are UTF-8 encoded. If the return value is blocked (e.g. because a modal dialog is displayed) you should check the application state with the getstate command to determine the further course of action.

    List of supported commands

    Below is a list of the currently supported commands (the list contains all valid commands for the main application, the standalone tools will typically just support a smaller subset. You can use the “DisplayCAL Scripting Client” standalone tool to learn about and experiment with commands). Note that filename arguments must refer to files present on the target machine running DisplayCAL.

    3DLUT-maker [create filename]
    Show 3D LUT creation tab, or create 3D LUT filename.
    abort
    Try to abort a currently running operation.
    activate [window ID | name | label]
    Activate window window or the main application window (bring it to the front). If it is minimized, restore it.
    alt | cancel | ok [filename]
    If a modal dialog is shown, call the default action (ok), the alternate action (if applicable), or cancel it. If a file dialog is shown, using ok filename chooses that file.
    calibrate
    Setup calibration measurements (note that this won't give a choice whether to create a fast curves + matrix profile as well, if you want that use interact mainframe calibrate_btn instead). For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    calibrate-profile
    Setup calibration & profiling measurements. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    close [window ID | name | label]
    Close window window or the current active window (if the window is the main window, this quits the application). Note that this tries to abort any running operations first, so you may want to check application state via the getstate command.
    create-colorimeter-correction
    Create colorimeter correction.
    create-profile [filename]
    Create profile from existing measurements (profile or measurement file).
    curve-viewer [filename]
    Show curves, optionally loading filename. Relative paths are possible e.g. for presets: curve-viewer presets/photo.icc
    DisplayCAL [filename]
    Bring the main window to the front. If it is minimized, restore it. Optionally, load filename.
    enable-spyder2
    Enable the spyder 2.
    getactivewindow
    Get the current active window. The returned format is classname ID name label state. state is either enabled or disabled.
    getcellvalues [window ID | name | label] <grid ID | name | label>
    Get cell values from grid grid of window window or the current active window.
    getappname
    Get the name of the application you're connected to.
    getcfg [option]
    Get configuration option, or whole configuration (key-value pairs in INI format).
    getcommands
    Get list of commands supported by this application.
    getdefault <option>
    Get default option (key-value pair in INI format).
    getdefaults
    Get all defaults (key-value pairs in INI format).
    getmenus
    Get available menus in the format ID "label" state. state is either enabled or disabled.
    getmenuitems [menuposition | label]
    Get available menu items in the format menuposition "menulabel" menuitemID "menuitemlabel" state [checkable] [checked]. state is either enabled or disabled.
    getstate
    Get application state. Return value will be either idle, busy, dialogclassname ID dialogname [dialoglabel] state "messagetext" [path "path"] [buttons "buttonlabel"...] if a modal dialog is shown or blocked in case the UI is currently blocked. Most commands will not work if the UI is blocked—the only way to resolve the block is to non-programmatically interact with the actual UI elements of the application or closing it. Note that a state of blocked should normally only occur if an actual file dialog is shown. If using the scripting interface exclusively, this should never happen because it uses a replacement file dialog that supports the same actions as a real file dialog, but doesn't block. Also note that a return value of blocked for any of the other commands just means that a modal dialog is currently waiting to be interacted with, only if getstate also returns blocked you cannot resolve the situation with scripting alone.
    getuielement [window ID | name | label] <element ID | name | label>
    getuielements [window ID | name | label]
    Get a single UI element or a list of the visible UI elements of window window or the current active window. Each returned line represents an UI element and has the format classname ID name ["label"] state [checked] [value "value"] [items "item"...]. classname is the internal UI library class name. It can help you determine what type of UI element it is, and which interactions it supports. ID is a numeric identifier. name is the name of the UI element. "label" (if present) is a label which further helps in identifying the UI element. You can use the latter three with the interact command. state is either enabled or disabled. items "item"... (if present) is a list of items connected to the UI element (i.e. selection choices).
    getvalid
    Get valid values for options that have constraints (key-value pairs in INI format). There are two sections, ranges and values. ranges are the valid ranges for options that accept numeric values (note that integer options not covered by ranges are typically boolean types). values are the valid values for options that only accept certain values. Options not covered by ranges and values are limited to their data type (you can't set a numeric option to a string and vice versa).
    getwindows
    Get a list of visible windows. The returned format is a list of classname ID name label state. state is either enabled or disabled.
    import-colorimeter-corrections [filename...]
    Import colorimeter corrections.
    install-profile [filename]
    Install a profile.
    interact [window ID | name | label] <element ID | name | label> [setvalue value]
    Interact with the UI element element of window window or the current active window, e.g. invoke a button or set a control to a value.
    invokemenu <menuposition | menulabel> <menuitemID | menuitemlabel>
    Invoke a menu item.
    load <filename>
    Load filename. Relative paths are possible e.g. for presets: load presets/photo.icc
    measure
    Start measurements (must be setup first!).
    measure-uniformity
    Measure screen uniformity.
    measurement-report [filename]
    If no filename given, show measurement report tab. Otherwise, setup measurement to create the HTML report filename. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    profile
    Setup profiling measurements (note that this will always use the current calibration if applicable, if you want to use linear calibration instead call load linear.cal prior to calling profile). For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    profile-info [filename]
    Show profile information, optionally loading profile filename. Relative paths are possible e.g. for presets: profile-info presets/photo.icc
    refresh
    Update the GUI after configuration changes via setcfg or restore-defaults.
    report-calibrated
    Report on calibrated display. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    report-uncalibrated
    Report on uncalibrated display. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.
    restore-defaults [category...]
    Restore defaults globally or just for category. Call refresh after changing the configuration to update the GUI.
    setlanguage <languagecode>
    Set language.
    setcfg <option> <value>
    Set configuration option to value. The special value null clears a configuration option. Call refresh after changing the configuration to update the GUI. Also see getdefaults and getvalid.
    setresponseformat <format>
    Set the format for responses. The default plain is a text format that is easy to read, but not necessarily the best for parsing programmatically. The other possible formats are json, json.pretty, xml and xml.pretty. The *.pretty formats use newlines and indentation to make them easier to read.
    synthprofile [filename]
    Show synthetic profile creation window, optionally loading profile filename.
    testchart-editor [filename | create filename]
    Show testchart editor window, optionally loading or creating testchart filename. Relative paths are possible e.g. for loading a default testchart: testchart-editor ti1/d3-e4-s17-g49-m5-b5-f0.ti1
    verify-calibration
    Verify calibration. For non-virtual displays as well as pattern generators (except madVR), call the measure command afterwards to commence measurements.

    Interacting with UI elements

    • Invoking a button: interact [window] <button> e.g. show profile name placeholders information: interact mainframe profile_name_info_btn
    • Setting a value on a dropdown, text field, or slider: interact [window] <element> setvalue "value" e.g. set calibration gamma to 2.4: interact mainframe trc_textctrl setvalue 2.4 (note that for changing multiple options at once it is generally preferable to call setcfg <option> <value> for each option you want to set followed by a single refresh instead)
    • Setting a cell value on a grid: interact [window] <grid> setvalue "row,col,value" e.g. while the testchart editor is shown, set the cell at the second column of the first row to 33: interact tcgen grid setvalue "0,1,33"

    Caveats and limitations

    There are a few things to be aware of when using commands that interact with the UI directly (i.e. activate, alt | cancel | ok, close, interact and invokemenu).

    Referring to windows and UI elements: You can refer to windows and UI elements by their ID, name or label (you can find out about windows and UI elements with the getmenus/getmenuitems, getuielement/getuielements, and getwindows commands). If an object's ID is negative, it means that it has been automatically assigned at object creation time and is only valid during the lifetime of the object (i.e. for modal dialogs, only while the dialog is displayed). For this reason, using an object's name instead is easier, but names (aswell as non automatically assigned IDs) are not guaranteed to be unique, even for objects which share the same parent window (although most of the “important” controls as well as application windows will have unique names). Another possibility is to use an object's label, which while also not guaranteed to be unique, still has a fairly high likelihood of being unique for controls that share the same parent window, but has the drawback that it is localized (although you can ensure a specific UI language by calling setlanguage) and is subject to change when the localization is updated.

    Sequential operations: Calling commands that interact with the UI in rapid succession may require the use of additional delays between sending commands to allow the GUI to react (so getstate will return the actual UI state after a specific command), although there is a default delay for commands that interact with the UI of atleast 55 ms. A good rule of thumb for sending commands is to use a “send command” → “read response” → “optionally wait a few extra ms” → “get application state (send getstate command)” → “read response” cycle.

    Setting values: If setting a value on an UI element returns ok, this is not always an indication that the value was actually changed, but only that the attempt to set the value has not failed, i.e. the event handler of the element may still do error checking and change the value to something sane if it was not valid. If you want to make sure that the intended value is set, use getuielement on the affected element(s) and check the value (or even better, if you use JSON or XML response format, you can check the object property/element of the response instead which will reflect the object's current state and saves you one request). In general it is preferable to use interact <elementname> setvalue <value> only on dialogs, and in all other cases use a sequence of setcfg <option> <value> (repeat as necessary, optionally call load <filename> or restore-defaults first to minimize the amount of configuration options that you need to change) followed by a call to refresh to update the UI.

    Also, not all controls may offer a comprehensive scripting interface. I'm open to suggestions though.

    User data and configuration file locations

    DisplayCAL uses the following folders for configuration, logfiles and storage (the storage directory is configurable). Note that if you have upgraded to DisplayCAL from dispcalGUI, that DisplayCAL will continue to use the existing dispcalGUI directories and configuration file names (so replace DisplayCAL with dispcalGUI in the lists below).

    Configuration

    • Linux: /home/Your Username/.config/DisplayCAL
    • Mac OS X: /Users/Your Username/Library/Preferences/DisplayCAL
    • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\DisplayCAL
    • Windows XP: C:\Documents and Settings\Your Username\Application Data\DisplayCAL

    Logs

    • Linux: /home/Your Username/.local/share/DisplayCAL/logs
    • Mac OS X: /Users/Your Username/Library/Logs/DisplayCAL and
      /Users/Your Username/Library/Logs/0install
    • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\DisplayCAL\logs
    • Windows XP: C:\Documents and Settings\Your Username\Application Data\DisplayCAL\logs

    Storage

    • Linux: /home/Your Username/.local/share/DisplayCAL/storage
    • Mac OS X: /Users/Your Username/Library/Application Support/DisplayCAL/storage
    • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\DisplayCAL\storage
    • Windows XP: C:\Documents and Settings\Your Username\Application Data\DisplayCAL\storage

    Incomplete/failed runs (useful for troubleshooting)

    • Linux: /home/Your Username/.local/share/DisplayCAL/incomplete
    • Mac OS X: /Users/Your Username/Library/Application Support/DisplayCAL/incomplete
    • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\DisplayCAL\incomplete
    • Windows XP: C:\Documents and Settings\Your Username\Application Data\DisplayCAL\incomplete

    Known issues and solutions

    General: Wacky image colors (swapped colors)
    Solution: This happens when you created a “XYZ LUT + swapped matrix” profile and is a way to alert you that the software you're using does not support XYZ LUT profiles and falls back to the included matrix (which generally means you'd loose accuracy). If you're having this situation only in some applications, creating a “XYZ LUT + matrix” profile will remedy it (but please keep in mind that those applications not supporting XYZ LUT will still fall back to the matrix, so results can be different from applications that support XYZ LUT correctly). If all colormanaged applications you use show swapped colors, you should create a matrix profile instead. Note that you do not have to re-run any measurements: In DisplayCAL, choose a profile type as suggested previously (you need to enable advanced options in the “Options” menu to show profile type choices on the “Profiling” tab), adjust quality and profile name if you want, then choose “Create profile from measurement data...” in the “File” menu and select the profile you had the issue with.
    General: Measurements are failing (“Sample read failed”) if using the “Allow skipping of spectrometer self-calibration” option and/or highres/adaptive mode
    Solution: Disable either or all of the above options. The problem seems to mainly occur with the ColorMunki Design/Photo.
    USB 3.0 connectivity issues (instrument not found, access failing, or not working properly)
    Such issues would usually manifest themselves through instruments not being found, or randomly disconnecting even if seemingly working fine for some time. From all information that is known about these issues, they seem to be related to USB 3.0, not related to software as the vendor software is also affected, and they seem to occur irrespective of operating system or device drivers.
    The underlying issue seems to be that while USB 3.0 has been designed to be backwards compatible with USB 2.0, some USB 2 devices do not seem to work reliably when connected over USB 3. As currently available instruments with USB connectivity are usually USB 2 devices, they may be affected.
    Solution: A potential solution to such USB 3.0 connectivity issues is to connect the instrument to a USB 2.0 port (if available) or the use of an externally powered USB 2.0 hub.
    Windows: “The process <dispcal.exe|dispread.exe|coloprof.exe|...> could not be started.”
    Solution: If you downloaded ArgyllCMS manually, go to your Argyll_VX.X.X\bin directory, and right-click the exe file from the error message. Select “Properties”, and then if there is a text on the “General” tab under security “This file came from another computer and might be blocked”, click “Unblock”. Sometimes also over-zealous Antivirus or 3rd-party Firewall solutions cause such errors, and you may have to add exceptions for all involved programs (which may include all the ArgyllCMS executables and if you're using Zero Install also python.exe which you'll find in a subdirectory under C:\ProgramData\0install.net\implementations) or (temporarily) disable the Antivirus/Firewall.
    Photoshop: “The monitor profile […] appears to be defective. Please rerun your monitor calibration software.”
    Solution: Adobe ACE, Adobe's color conversion engine, contains monitor profile validation functionality which attempts to filter out bad profiles. With XYZ LUT profiles created in ArgyllCMS versions up to 1.3.2, the B2A white point mapping is sometimes not particularly accurate, just enough so that ACE will see it as a problem, but in actual use it may only have little impact that the whitepoint is a bit off. So if you get a similar message when launching Photoshop, with the options “Use profile regardless” and “Ignore profile”, you may choose “Use profile regardless” and check visually or with the pipette in Photoshop if the inaccurate whitepoint poses a problem. This issue is fixed in ArgyllCMS 1.3.3 and newer.
    MS Windows Vista: The calibration gets unloaded when a User Access Control prompt is shown
    Solution: (Intel and Intel/AMD hybrid graphics users please see “The Calibration gets unloaded after login/resume/User Access Control prompt” first) This Windows Vista bug seems to have been fixed under Windows 7 (and later), and can be remedied under Vista by either manually reloading calibration, or disabling UAC—but please note that you sacrifice security by doing this. To manually reload the calibration, either open DisplayCAL and select “Load calibration curves from current display profile” under the “Video card gamma table” sub-menu in the “Tools” menu, or (quicker) open the Windows start menu and select “DisplayCAL Profile Loader” in the “Startup” subfolder. To disable UAC[9] (not recommended!), open the Windows start menu and enter “msconfig” in the search box. Click on the Tools tab. Select the line “Disable UAC” and click the “Launch” button. Close msconfig. You need to reboot your system for changes to apply.
    MS Windows with Intel graphics (also Intel/AMD hybrid): The Calibration gets unloaded after login/resume/User Access Control prompt
    Solution: The Intel graphics drivers contain several utilities that interfere with correct calibration loading. A workaround is to rename, move or disable (e.g. using a tool like AutoRuns) the following files:
    C:\Windows\system32\igfxtray.exe
    C:\Windows\system32\igfxpph.dll
    C:\Windows\system32\igfxpers.exe
    MS Windows Vista and later: The display profile isn't used if it was installed for the current user
    Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select “Classic View” under Vista and anything other than “Category View” under Windows 7 and later to see it). Under the “Devices” tab, select your display device, then tick “Use my settings for this device”.
    MS Windows 7 or later: Calibration does not load automatically on login when not using the DisplayCAL Profile Loader
    Solution: Open the Windows start menu, select “Control Panel”, then “Color Management” (you may have to select something other than “Category View” to see it). Select the “Advanced” tab, then “Change system defaults...”, and finally tick the “Use Windows display calibration” checkbox. Note that the precision of Windows' built-in calibration loading is inferior compared to the DisplayCAL profile loader and may introduce inaccuracies and artifacts.
    MS Windows XP, multiple displays: One profile is used by all displays connected to a graphics card
    Solution: The underlying issue is that Windows XP assigns color profiles per (logical) graphics card, not per output. Most XP graphics drivers present only one logical card to the OS even if the card itself has multiple outputs. There are several possible solutions to this problem:
    • Use different graphics cards and connect only one display to each (this is probably the preferable solution in terms of ease of use and is least prone to configuration error)
    • Install and use the Windows XP color control applet (note that the original MS download link is no longer available)
    • Some graphics cards, like the Matrox Parhelia APV (no longer produced), will expose two logical cards to the OS when using a specific vendor driver (some older ATI drivers also had this feature, but it seems to have been removed from newer ones)
    Mac OS X 10.08 “Mountain Lion” or newer: Black crush and posterization in applications using ColorSync (e.g. Preview)
    Solution: Due to what appear to be bugs in Mac OS X, applications using ColorSync may show artifacts like black crush and posterization with certain types of display profiles (i.e. cLUT-based ones). Applications from 3rd parties which use their own color management engine (like Adobe products) are not affected. Also not affected seems Apple ColorSync Utility as well as Screenshot Utility, which could be used as a replacement for Apple Preview. Another work-around is to create a simpler single curve + matrix profile with included black point compensation, but a drawback is a potential loss of color accuracy due to the inherent limitiations of this simpler profile type (most other profiling solutions create the same type of simple profile though). The easiest way to create a simple single curve + matrix pofile in DisplayCAL is to make sure calkibration tone curve is set to a value other than “As measured”, then setting testchart to “Auto” on the “Profiling” tab and moving the patch amount slider all the way to the left (minimum amount of patches). You should see “1xCurve+MTX” in the default profile name.
    Mac OS X 10.11 “El Capitan”: If running via 0install, DisplayCAL won't launch anymore after updating to El Capitan from a previous version of OS X
    Solution:
    1. Run the “0install Launcher” application from the DisplayCAL-0install.dmg disk image.
    2. Click “Refresh”, then “Run”. An updated library will be downloaded, and DisplayCAL should launch.
    3. From now on, you can start DisplayCAL normally as usual.
    Mac OS X 10.12 “Sierra”: Standalone tools silently fail to start
    Solution: Remove the quarantine flag from the application bundles (and contained files) by opening Terminal and running the following command (adjust the path /Applications/DisplayCAL/ as needed):
    xattr -dr com.apple.quarantine /Applications/DisplayCAL/*.app
    Mac OS X: DisplayCAL.app is damaged and can't be opened.
    Solution: Go to the “Security & Privacy” settings in System Preferences and set “Allow applications downloaded from” (under the “General” tab) to the “Anywhere” setting. After you have successfully launched DisplayCAL, you can change the setting back to a more secure option and DisplayCAL will continue to run properly.
    Linux/Windows: No video card gamma table access (“Calibrate only” and “Calibrate & profile” buttons grayed, “Profile only” button available)
    Solution: Make sure you have not selected a display that doesn't support calibration (i.e. “Web @ localhost” or “Untethered”) and that you have enabled “Interactive display adjustment” or set the tone curve to a different value than “As measured”. Under Linux, please refer to the ArgyllCMS documentation, “Installing the software on Linux with X11” and “Note on X11 multi-monitor setups” / “Fixing access to Video LUTs” therein. Under Windows, please also see the solution posted under “The display profile isn't used if it was installed for the current user” if you are using Windows and make sure you have a recent driver for your video card installed.

    Get help

    Need help with a specific task or problem? It may be a good idea to first check the known issues & solutions if the topic has been covered. If you want to report a bug, please see the guidelines on bug reporting. Otherwise, feel free to use one of the following channels:

    • Help & support forum
    • Contact me directly (but keep in mind other users may also benefit from exchanges, so I'm encouraging the use one of the above channels if possible)

    Report a bug

    Found a bug? If so, please first check the issue tracker, it may have been reported already. Otherwise, please follow these guidelines for reporting bugs:

    • Try to give a short, but concise summary of the problem.
    • Try to give some steps to reproduce the problem.
    • Always attach logfiles if possible. They are usually automatically created by DisplayCAL as part of normal program operation. If you're having a problem with a particular instrument, it would be great if you could do a run with ArgyllCMS debug output enabled in the “Advanced” sub-menu under the “Options” menu to generate a more verbose debug log - note that you have to enable advanced options first.
      The easiest way to get a complete set of logfiles is to choose “Show log” from the “Tools” menu and then click the “Create compressed archive...” button on the log window (not the “Save as...” button as this will only save the session log). You can also find the logfiles here:
      • Linux: /home/Your Username/.local/share/DisplayCAL/logs
      • Mac OS X: /Users/Your Username/Library/Logs/DisplayCAL and
        /Users/Your Username/Library/Logs/0install
      • Windows Vista and newer: C:\Users\Your Username\AppData\Roaming\DisplayCAL\logs
      • Windows XP: C:\Documents and Settings\Your Username\Application Data\DisplayCAL\logs

      Note that if you have upgraded to DisplayCAL from dispcalGUI, that DisplayCAL will continue to use the existing dispcalGUI directories (so replace DisplayCAL with dispcalGUI in the locations above).

      As the folder may contain several logfiles, it is a good idea to compress the whole folder to a ZIP or tar.gz archive that you can easily attach to a bug report.

      Please note the logfiles may contain your username as well as paths of files you may have used in DisplayCAL. I will respect your privacy at all times, but you may want to consider this when attaching logfiles to public places like the issue tracker.

    Create a new ticket (or if the bug has been reported already, use the existing ticket) at the issue tracker, following the guidelines above, and attach the logfiles archive.

    If you don't want to or can't use the bug tracker, feel free to use one of the other support channels.

    Discussion

    Do you want to get in touch with me or other users regarding DisplayCAL or related topics? The general discussion forum is a good place to do so. You can also contact me directly.

    To-Do / planned features (in no particular order)

    • Add SMPTE 2084 to simulation profile tone response curve choices and add verification testcharts suitable for HDR display evaluation.
    • Refactor 3D LUT, verification and synthetic ICC profile creator tone response curve selection UI implementation to share more code.
    • On first launch, guide user through basic setup using a wizard (postpone DisplayCAL update check until after wizard has run?):
      • Check ArgyllCMS availability, if not available or outdated, offer automatic download & installation (consider 0install/native Linux distribution packages?) (implemented)
      • Windows only: Install instrument drivers if necessary (probably need to check if already installed)
      • Check available instruments and instrument capabilities
      • Do instrument specific first launch stuff:
        • Import OEM files (implemented)
        • Choose/create colorimeter correction if applicable
    • When an instrument is first selected:
      • Check if OEM files from the vendor software have already been imported (if applicable); if not, offer to do it. (implemented in v2.1.1.3 Beta and newer, after detecting instruments)
      • Check colorimeter corrections if applicable (from respective vendor software and online database, skip the latter if a spectro is available), in case of no usable specific or generic correction, offer to create one if possible, preferably using spectro measurements as reference, EDID as user-selectable fallback? (Need to sanity-check EDID red/green/blue/white xy coordinates in that case! Possibly against sRGB and AdobeRGB as the most commonly cited gamuts for standard gamut and wide-gamut displays? As some cheaper panels and many of those found in Laptops/Notebooks are sometimes very limited in gamut, additionally a special “low-gamut RGB” may be needed)
      • Users need to be made aware of the implications their colorimeter correction choice has, e.g.
        • When using a correction created from spectral reference measurements of the specific display (user needs a spectro): Usually very good accuracy/match to user's specific display/instrument combination
        • When using a vendor-supplied generic correction: Good (?) (e.g. i1 DisplayPro, ColorMunki Display) to poor (?) (e.g. i1 Display 1/2/LT, Huey, ColorHug) accuracy/match to user's specific display/instrument combination, in case of CCSS considered preferable to corrections supplied by other users because of lab-grade equipment (high spectral resolution) used by vendor.
        • When using a correction supplied by another user for the same display/instrument combination: Good (?) (e.g. i1 DisplayPro, ColorMunki Display, DTP94) to poor (?) (e.g. i1 Display 1/2/LT, Huey, ColorHug) accuracy/match to user's specific display/instrument combination
        • When using EDID of the specific display as reference: Moderate (?) to poor (?) accuracy/match to user's specific display/instrument combination (could be ok match, could be awful, but should in most cases still be able to fix problems like e.g. ColorHug red sensitivity so may be ok as last resort)
    • When trying to import colorimeter corrections or enable the Spyder 2, have automatic mode download the vendor software if needed. (implemented in v2.1.1.2 Beta and newer)
    • (Long-term) improve UI.
    • Better interface to GNOME Color Manager (implemented in v0.8.1.0+)
    • Measure and report on screen homogenity / evenness of illumination
    • Get rid of the terminal and implement a proper GUI for the interactive part of calibration (implemented in v0.8.5.6+)
    • Better user interface for profile verification: If a test set contains multiple value formats (CMYK, RGB, XYZ, L*a*b*), allow selection which one(s) should be used in a “setup” window (“setup” window implemented in v1.5.6.9+, value format selection added in v1.6.3.5)
    • Add gamut coverage percentages to the profile verification report if the test set contains reference values (not *.ti1): Calculate profiles from test set and verification measurements on-the-fly and create gamut volumes from test set profile, evaluated profile, and verification measurements profile using Argyll's iccgamut tool. Compare gamut volumes using Argyll's viewgam tool with -i option and include the results in the report (coverage calculation for test set reference and profile to be evaluated could be done before the actual measurements and also shown in the yet-to-be-implemented profile verification “setup” window).
    • Complete the documentation in the README
    • German language README (postponed)
    • Profile verification (feed XYZ or L*a*b* to display profile, display corresponding RGB values, measure, output Delta E) (implemented in v0.3.6+)
    • “Before” / “After” switch when calibration / profiling complete (implemented in v0.2+)
    • Store all settings in profile, allow loading of settings from profile in addition to .cal file (implemented in v0.2+)
    • Document the code (code documentation could still be enhanced, for now it'll do)
    • Code cleanup (mostly done)

    Thanks and acknowledgements

    I would like to thank the following people:

    Graeme Gill, for creating ArgyllCMS

    Translators: Loïc Guégant, François Leclerc, Jean-Luc Coulon (french translation), Roberto Quintero (spanish translation), Tommaso Schiavinotto (italian translation), 楊添明 (traditional chinese translation), 김환(Howard Kim) (korean translation), 林泽帆(Xpesir) (simplified chinese translation)

    Recent contributors: Nigel Smith, Marcin Koscielecki, Philip Kerschbaum, Shih-Hsiang Lin, Alberto Alessandro Pozzo, John Mackey, Serge Stauffer, Juraj Hatina, Dudley Mcfadden, Tihomir Lazarov, Kari Hrafnkelsson, Michael Gerstgrasser, Sergio Pirovano, Borko Augustin, Greg Hill, Marco Signorini, Hanno Ritzerfeld, Lensvisions Studio, Ute Bauer, Ori Sagiv, Bálint Hajagos, Vesa Karhila, Сергей Кудрин, Sheila Mayo, Lensvisions Studio, Dmitry Ostroglyadov, Lippai Ádám, Aliaksandr Sirazh, Dirk Driesen, Andre Schipper, Jay Benach, Gafyn Jones, Fritz Schütte, Kevin Pinkerton, Truls Aagedal, Eakphan Intajak, Herbert Moers, Jordan Szuch, Clemens Rendl, Nirut Tamchoo, James Barres, Ronald Nowakowski, Stefano Aliffi, Miriana Marusic, Robert Howard, Alessandro Marotta, Björn Stresing, Evgenij Popov, Rodrigo Valim, Robert Smith, Jens Windmüller, 信宏 郭, Swen Heinrich, Matthieu Moy, Sebastian Hoffmann, Ruslan Nedielkov, Fred Wither, Richard Tafel, Chester Chua, Arreat.De, Duane Middlebrook, Stephan Eitel, more...

    And everyone who sent me feedback or bug reports, suggested features, or simply uses DisplayCAL.

    Acknowledgements

    Part of the comprehensive ArgyllCMS documentation has been used in this document, and was only slightly altered to better fit DisplayCAL's behavior and notations.

    Changelog

    2018-02-18 14:47 (UTC) 3.5

    DisplayCAL 3.5

    Added in this release:

    • [Feature] Support the madVR HDR 3D LUT installation API (madVR >= 0.92.13).

    Changed in this release:

    • [Enhancement] In case of a download problem (e.g. automatic updates), offer to visit the download URL manually.
    • [Enhancement] Security: Check file hashes of application setup and portable archive downloads when updating DisplayCAL or ArgyllCMS.
    • [Enhancement] Security: Use HTTPS for ArgyllCMS download as well.
    • [UI] New application icons and slightly refreshed theme.
    • [UI] Improved HiDPI support by adjusting relative dialog button spacing, margins, and interactive display adjustment window gauge sizes to match proportionally regardless of DPI.
    • [UI] Improved visual consistency of tab buttons (don't lose “selected” state if clicking on a button and then moving the mouse outside of it, “hover” state does no longer override “selected” state, keyboard navigation skips over selected button).
    • [Cosmetic] Measurement report: Make patch preview take into account the “Use absolute values” option again.
    • [Cosmetic] Measurement report: Colorize CCT graph points according to change in hue and chroma.
    • [Cosmetic] Measurement report: Colorize gamma graph points according to change in gamma.
    • [Cosmetic] Measurement report: Dynamically adjust gamma graph vertical axis to prevent cut-off.
    • [Cosmetic] Measurement report: Make RGB balance graph match HCFR (Rec. 709 only). Note that new and old balance graphs are only comparable to a limited extent (use “Update measurement or uniformity report” in the “Tools” menu to update existing reports).
    • [Cosmetic] Profile loader (Windows): Unset non belonging profile when resetting a profile association.
    • Mac OS X: Set default profile type to single curve + matrix with black point compensation due to long-standing Mac OS X bugs with any other profile type.

    Fixed in this release:

    • [Moderate] Unhandled exception and UI freeze when the 3D LUT format was set to madVR and there never was a prior version of ArgyllCMS on the system or the previous version was older than or equal to 1.6.3 during that same DisplayCAL session, due to a missing capability check.
    • [Moderate] Division by zero when trying to create a SMPTE 2084 HDR 3D LUT if the profile black level was zero (regression of a change in DisplayCAL 3.4, SVN revision r4896).
    • [Minor] If using the alternate forward profiler and the profile type was XYZ LUT + swapped matrix, the swapped matrix was overwritten with an accurate one (regression introduced in DisplayCAL 3.3.4, SVN revision r4736).
    • [Minor] It was not possible to run a measurement report with a simulation profile set as display profile, but no profile assigned to the actual display.
    • [Minor] Rec. 1886 measurement report with originally non Rec. 709 tone response profile: Make sure to override the original tone response of the profile so Rec. 1886 gives the expected result.
    • [Minor] If a measurement report HTML file was mangled by another application that removed the XML self-closing tags forward slashes, it was not possible to correctly update the report using “Update measurement or uniformity report” from the “Tools” menu.
    • [Minor] If using a pattern generator, check it is valid before binding a disconnect-on-close event when using the visual whitepoint editor. Prevents an attribute error when using the visual whitepoint editor and the madTPG network implementation (i.e. under Mac OS X).
    • [Minor] Windows: Always use the active display device directly when querying or setting profiles instead of mimicking applications using the Windows GetICMProfile API (fixes getting the correct profile with display configurations consisting of three or more displays where some of them are deactivated).
    • [Minor] Profile loader (Windows): Check whether or not a display device is attached to multiple adapters and disable fixing profile associations in that case.
    • [Minor] Profile loader (Windows): Work-around hitching caused by Windows WcsGetDefaultColorProfile API call on some systems.
    • [UI] Measurement window: Make sure focus stays on the last focused control when the window itself gains focus again after losing focus.
    • [UI] Synthetic ICC Profile Creator: Update HDR SMPTE 2084 diffuse white info text when changing luminance.
    • [Trivial] HDR SMPTE 2084 3D LUT: Interpolate the last two segments before the clipping point of the intermediate input LUT shaper curves (prevents potential slight banding in highlights).
    • [Trivial] Windows: Make sure the profile loader is launched directly after installing a profile when using a portable version of DisplayCAL (parity with installer version).
    • [Trivial] Profile loader (Windows): Re-introduce --skip command line option.
    • [Cosmetic] Profile loader (Windows): When disassociating a profile from a device, suppress ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE error sometimes (in some cases always?) resulting from the WcsDisassociateColorProfileFromDevice Windows API call, even though the profile was successfully disassociated.
    2017-12-30 14:16 (UTC) 3.4

    DisplayCAL 3.4

    Added in this release:

    • [Feature] HDR Hybrid Log-Gamma transfer function option for 3D LUTs.
    • [Feature] HDR verification testcharts.
    • [UI] Simplified chinese translation thanks to 林泽帆(Xpesir).
    • [Enhancement] Linux: wxPython Phoenix 4.0.0b/rc1 compatibility.
    • [Enhancement] Profile loader (Windows): Notifications (for 3rd party calibration/profiling software and user-defined exceptions) can be turned off.

    Changed in this release:

    • [Enhancement] HDR 3D LUTs: SMPTE 2084 with roll-off now allows specifying the mastering display minimum and peak luminance which are used to adjust the roll-off start and clipping points (BT.2390-3).
    • [Enhancement] HDR 3D LUTs: Chroma compression is now done in Lpt color space, providing improved preservation of detail in compressed highlights.
    • [Enhancement] Do not disable the measurement report button if the selected setting is a preset and a simulation profile is used as display profile with tone curve set to “Unchanged” (i.e. do not require selecting “<Current>” under settings to allow verifying the native device response against a selected simulation profile).
    • [Enhancement] Limit profile name length taking into account the full path of the final storage directory.
    • [Enhancement] Disable automatic output levels detection for colorimeter correction creation measurements.
    • Changed the “Softproof” and “Video” presets to no longer intentionally swap red and green for the fallback matrix.
    • [UI] [Cosmetic] Minor UI consistency changes.
    • [Enhancement] Linux: X11 root window _ICC_PROFILE_xxx atom enumeration for Xrandr now matches the Xinerama order, so that _ICC_PROFILE_xxx atoms match irrespective of which extension applications are using. This improves conformance to the ICC Profiles in X Specification and matches the respective change in ArgyllCMS 2.0.
    • Mac OS X (standalone application): No longer support OS X versions prior to 10.6. This streamlines and slims the application bundle and allows using more recent 3rd party dependencies which are not available for older Mac OS X releases. If you still need support for Mac OS X 10.5, use the 0install version of DisplayCAL.

    Fixed in this release:

    • [Critical] Ensure alternate forward profiler device to PCS table input curves are strictly monotonically increasing to prevent clipping resulting in peaks in the response in case of bad underlying (non-monotonic) device behavior (regression of a change in DisplayCAL 3.3.5, SVN revision r4838).
    • [Minor] Always force the first entry in PCS to device table input curves to zero when generating high resolution PCS to device tables (fixes potential unexpected non-zero RGB output for zero input to perceptual PCS to device table).
    • [UI] [Cosmetic] When not confirming a manual DisplayCAL update but ArgyllCMS is up to date, reflect this in the final dialog message.
    • [Trivial] ReShade 3D LUT: If ReShade 3.x default shaders are installed, write the different parts of the 3D LUT to the correct respective sub-directories and no longer write the superfluous ReShade.fx.
    • [UI] [Cosmetic] Linux: Prevent flickering of tab buttons on some systems when switching tabs.
    • [Moderate] Linux: The way display device enumeration was performed was not always guaranteed to give consistent results across the different available external device to profile mapping APIs, which could lead to wrong profile associations in multi-display configurations (this fix is required to match how ArgyllCMS 2.0 enumerates displays).
    • [Minor] Mac OS X (standalone application): Bundle certificate authority certificates to enable verifying server certificates (fixes not being able to automatically download updates).
    • [Minor] Windows: When creating a colorimeter correction from measurement file(s) stored in a path where one or more components(s) started with a number from 1-9 or the lowercase letter g, the operation failed and the created colorimeter correction had to be retrieved from the temporary directory manually.
    • [Minor] Profile loader (Windows): When manually disabling calibration loading via the pop-up menu, and then starting DisplayCAL (or another application detected by the profile loader) and closing it again, the profile loader would stay disabled, including the calibration loading related menu items, requiring a profile loader restart.
    2017-10-18 17:34 (UTC) 3.3.5

    DisplayCAL 3.3.5

    Changed in this release:

    • [Enhancement] Updated french localization (thanks to Jean-Luc Coulon).
    • [Enhancement] When generating high resolution PCS to device tables for XYZ LUT profiles, round PCS candidate “fit” so a good match is not potentially needlessly discarded in favor of a match with lower effective usage of the available lookup table grid points (may speed up the process as well).
    • [Enhancement] Use single curve detection based on calibration accuracy for shaper tags of XYZ LUT profiles as well.

    Fixed in this release:

    • [Minor] When enabling the Spyder2, check if the spyd2PLD.bin firmware has actually been successfully extracted (taking into account the install scope) and fall back to alternate methods when using automatic mode if the firmware cannot be extracted from the vendor software present in the local filesystem (fixes inability to enable the Spyder2 under Mac OS X if the vendor software is installed).
    • [Minor] Windows: Make measurement report filename safe for filesystem encoding (works around encoding quirks with certain locales).
    • [Minor] Windows: Windows silently strips any combination of trailing spaces and dots in file and folder names, so do the same for the profile name.
    • [Minor] Profile loader (Windows): WCS can return no profile without error in some situations, but the no error case wasn't accounted for, resulting in an unhandled exception in that case.
    • [Minor] Profile loader (Windows): Get the process identifier before enumerating windows to prevent an unhandled exception if a madVR instance is already running before starting the profile loader.
    • [Cosmetic] Profile loader (Windows): Detect if the current display profile video card gamma table tag contains linear calibration when checking if madVR did reset the video card gamma table to linear to prevent the profile loader alternating between enabled and disabled state if using windowed overlay in madVR.
    2017-09-13 12:09 (UTC) 3.3.4.1

    DisplayCAL 3.3.4.1

    Fixed in this release:

    • [Moderate] Linux (profile installation and profile loading): Getting the fallback XrandR display device ID could unexpectedly return no result in some cases due to incorrect parsing, leading to potential application of a stale device to profile mapping or no profile at all (regression of a change in DisplayCAL 3.3.4, SVN revision r4800).
    • [Minor] Linux, Mac OS X: The visual whitepoint editor was failing to update the test pattern area of a connected madTPG instance when madVR was selected as display device, due to an implementation bug related to setting the background color.
    2017-09-09 15:53 (UTC) 3.3.4

    DisplayCAL 3.3.4

    Added in this release:

    • Verification charts for ISO 14861:2015 soft proofing evaluation.

    Changed in this release:

    • [Enhancement] More even and consistent CPU utilization on multi CPU/multi core systems during high resolution device-to-PCS table generation.
    • [Enhancement] Multi-threaded gamut view calculation.
    • [Enhancement] Use an alternate way to generate the matrix for profiles created from the small testchart for matrix profiles (may improve accuracy on very linear displays) and use an optimized tone response curve if using a single curve and the measured response is a good match to an idealized parametric or standardized tone response curve.
    • [Enhancement] Uniformity report: No longer include (meaningless) correlated/closest color temperature. Use “traffic light” visual indicators in conjunction with unambiguous pass/fail messages to allow easy at-a-glance assessment of the results, and also include contrast ratio deviation to fully conform to ISO 12646:2015 and 14861:2015. You can update old reports via “Update measurement or uniformity report...” in the “Report” sub-menu of the “Tools” menu.
    • [Enhancement] Measurement report: Use the display profile whitepoint as reference white for the measured vs. profile white delta E calculation and use the assumed target whitepoint as reference white for the measured vs. assumed white delta E calculation to make the reported delta E more meaningful.
    • [Enhancement] Measurement report: Allow to use the display profile whitepoint as reference white when using absolute (not D50 adapted) values.
    • [Enhancement] Profile installation (Linux): Always do fallback colord profile installation using colormgr if available unless the ARGYLL_USE_COLORD environment variable is set.
    • [Enhancement] Profile loader (Linux): Include the profile source (colord or Argyll's UCMM) in diagnostic output and use the XrandR device ID as fallback when no EDID is available.
    • [Enhancement] Profile loader (Windows): Slightly improve encoding accuracy of quantizing to 8 < n < 16 bits.
    • [Trivial] Offer the complete range of input encodings for the eeColor 3D LUT format and do not force an identical output encoding.
    • [Trivial] Do not store calibration settings in a profile if calibration is disabled.
    • [Trivial] Revert the default profile type for the 79 patches auto-optimized testchart slider step to XYZ LUT + matrix.
    • [Trivial] Iridas cube 3D LUTs: Increase compatibility by stripping leading whitespace from text lines and adding DOMAIN_MIN/MAX keywords if missing.
    • [Trivial] Measurement report: Calculate true combined a*b* range for grayscale instead of summing separate ranges.
    • [Trivial] Measurement report: Automatically enable “Use absolute values” if using full whitepoint simulation (i.e. not relative to display profile whitepoint).

    Fixed in this release:

    • [Moderate] When cancelling profiling measurements with the testchart set to “Auto”, the testchart UI and the internal test chart setting were no longer in sync until changing the profile type or restarting the application.
    • [Moderate] Synthetic ICC profile creator: Unhandled exception when trying to create DICOM (regression of a change in DisplayCAL 3.1.5, SVN revision r4020) or SMPTE 2084 profiles (regression of multiprocessing changes in DisplayCAL 3.3).
    • [Minor] Protect against potentially clipping slightly above black values during high resolution device-to-PCS table generation (regression of a change in DisplayCAL 3.3.3, SVN revision r4705).
    • [Minor] Protect against enumerating displays and ports in response to a DISPLAY_CHANGED event when the main window isn't shown or isn't enabled which could lead to a hang due to a race condition.
    • [Minor] Verification using a simulation profile that defines an identity matrix in its 'chad' tag (e.g. ISOnewspaperv4) did not work correctly due to the matrix being mapped to “None” insatead of “XYZ scaling”.
    • [Minor] Verification using a CMYK simulation profile failed with a “Profile invalid” error if previously “Use simulation profile as display profile” and “Device link profile” were enabled but no device link profile selected.
    • [Minor] Remove separate videoLUT access support under Windows and Mac OS X (separate videoLUT access is only supported under X11).
    • [Minor] Downloaded files were not renamed from their temporary name if the server did not return a Content-Length header (this typically only happens for text files, not binary files). Fixes not being able to import colorimeter corrections from iColor Display.
    • [Trivial] Do not reflect the black point hue in tone response curves of single curve + matrix profiles when not using black point compensation.
    • [Trivial] Measurement report: Additional stats median calculation index was off by n+1.
    • [Cosmetic] Display model name and manufacturer description tags were missing from profiles created using the alternate forward profiler.
    • [Cosmetic] Measurement report: Eliminate “Use absolute values” having a side-effect on the RGB patches preview.
    • [Cosmetic] Windows: When closing some of the standalone tools when minimized, e.g. by right-clicking the taskbar button and choosing “Close” from the menu, or by using the taskbar preview close button, the application did not close until restored from its minified state (i.e. by clicking on the taskbar button or switching to it with the task switcher).
    2017-08-08 18:40 (UTC) 3.3.3

    DisplayCAL 3.3.3

    Added in this release:

    • Intermediate auto-optimized testchart step with 115 patches.

    Changed in this release:

    • [UI] [Cosmetic] Verification tab: Always show advanced tone response curve options when “Show advanced options” is enabled in the “Options” menu.
    • [UI] [Trivial] Verification tab: Don't reset the simulation profile tone response curve choice unless changing the simulation profile.
    • [Enhancement] [Trivial] When encountering an invalid peak white reading during output levels detection, advise to check if the instrument sensor is blocked.
    • [Enhancement] Visual whitepoint editor: Use whitepoint of currently selected profile (unless it's a preset or “<Current>”) instead of associated display profile.
    • [Enhancement] Blend profile black point to a*b* = 0 by default. This makes the visual appearance of black and near black response in Photoshop (which uses relative colorimetric intent with black point compensation for display by default) match the DisplayCAL perceptual table of XYZ LUT profiles (which means neutral hues gradually blend over to the display black point hue relatively close to black. The rate of this blend and black point hue correction are influenced by the respective calibration settings, which is another added benefit of this change).
    • [Enhancement] Measurement & uniformity report: Change average delta a, b, L, C, and H to be calculated from absolute values.
    • [Enhancement] Profile loader (Windows): Don't implicitly reset the video card gamma table to linear if no profile is assigned or couldn't be determined. Show an orange-red error icon in the latter case and display details in the left-click notification popup.
    • [Cosmetic] Windows: Log errors when trying to determine the active display device during profile installation.

    Fixed in this release:

    • [UI] [Cosmetic] Verification tab: Don't accidentally enable the simulation profile tone response curve black output offset (100%) radio button when switching tabs.
    • [Trivial] Show error dialog if not able to connect to instrument for single reading.
    • [Minor] Strip the “firmware missing” message from the Spyder2 instrument name if it was not yet enabled (makes the automatic popup to enable the Spyder2 work).
    • [Minor] Prisma 3D LUT upload with 1.07 firmware.
    • [Minor] More accurately encode the black point in the colorimetric PCS to device table by explicitly clipping below black values to zero.
    2017-06-29 15:10 (UTC) 3.3.2

    DisplayCAL 3.3.2

    Added in this release:

    • IPT and Lpt color spaces (profile information 2D and 3D gamut view, testchart editor 3D view).
    • ACEScg and DCDM X'Y'Z' source profiles.

    Changed in this release:

    • [Enhancement] Changed HDR 3D LUT SMPTE 2084 roll-off colorimetric rendering to do gamut mapping in ICtCp (slightly improved hue and saturation preservation of bright saturated colors).
    • [Trivial] Include output levels detection related files in session archives.

    Fixed in this release:

    • [Moderate] Unhandled exception when trying to set a white or black level target on the calibration tab via the newly introduced measurement buttons (regression of a change in DisplayCAL 3.3.x, SVN revision r4557).
    • [Moderate] Black point compensation for cLUT-type profiles in the advanced options did not work correctly (regression of a change in DisplayCAL 3.3.x, SVN revision r4538).
    • [Moderate] Unhandled exception when creating L*a*b* LUT profiles (regression of multiprocessing changes in DisplayCAL 3.3.x, SVN revision r4433). Note that creating L*a*b* LUT profiles is not recommended due to the limited ICC encoding range (not suitable for wide-gamut) and lower accuracy and smoothness compared to XYZ LUT.
    • [Minor] Output levels detection and alternate forward profiler were not working when using output levels quantization via additional dispread command line option -Z nbits.
    • [Minor] Do not create shaper curves for gamma + matrix profiles.
    • [Minor] Don't fall back to colorimetric rendering for HDR 3D LUT SMPTE 2084 roll-off when using luminance matched appearance or luminance preserving perceptual appearance rendering intents.
    • [Trivial] DIN99c and DIN99d white point misalignment (profile information 2D and 3D gamut view, testchart editor 3D view).
    • [UI] [Cosmetic] Change info panel text to use system text color instead of defaulting to black.
    • [Minor] Linux (0install): Prevent system-installed protobuf package shadowing 0install implementation.
    2017-06-04 16:04 (UTC) 3.3.1

    DisplayCAL 3.3.1

    Fixed in this release:

    • Unhandled exception if using CIECAM02 gamut mapping when creating XYZ LUT profiles from regularly spaced grid patch sets with the alternate forward profiling method introduced in DisplayCAL 3.3.
    2017-05-30 17:48 (UTC) 3.3

    DisplayCAL 3.3

    Added in this release:

    • Profiling engine enhancements:
      • [Feature] Better multi CPU/multi core support. Generating high resolution PCS-to-device tables is now taking more advantage of multiple (physical or logical) processors (typical 2x speedup on a i7 6700K CPU).
      • [Enhancement] Generating a simple high resolution perceptual table is now done by copying the colorimetric table and only generating new input curves. This markedly reduces the processing time needed to create the perceptual table (6x speedup on a i7 6700K CPU).
      • [Enhancement] Black point compensation now tries to maintain the whitepoint hue until closer to the black point. This makes curves + matrix profiles in the default configuration (slightly) more accurate as well as the default simple perceptual table of cLUT profiles provide a result that is closer to the colorimetric table.
      • [Enhancement] The curves tags of XYZ LUT + matrix profiles will now more closely match the device-to-PCS table response (improves grayscale accuracy of the curves tags and profile generation speed slightly).
      • [Enhancement] The curves tags of matrix profiles are further optimized for improved grayscale accuracy (possibly slightly reduced overall accuracy if a display device is not very linear).
      • [Enhancement] XYZ LUT profiles created from small patch sets (79 and 175 patches) with regularly spaced grids (3x3x3+49 and 5x5x5+49) now have improved accuracy due to an alternate forward profiling method that works better for very sparsely sampled data. Most presets now use 5x5x5+49 grid-based patch sets by default that provide a reduction in measurement time at about the same or in some cases even slightly better accuracy than the previously used small patch sets.
      • [Enhancement] Additional PCS candidate based on the actual measured primaries of the display device for generating high resolution PCS-to-device tables. This may further reduce PCS-to-device table generation time in some cases and lead to better utilization of the available cLUT grid points.
    • [Feature] Calibration whitepoint targets other than “As measured” will now also be used as 3D LUT whitepoint target, allowing the use of the visual whitepoint editor to set a custom whitepoint target for 3D LUTs.
    • [Feature] Automatically offer to change the 3D LUT rendering intent to relative colorimetric when setting the calibration whitepoint to “As measured”.
    • [Feature] Support for madVR's ability to send HDR metadata to the display via nVidia or Windows 10 APIs (i.e. switch a HDR capable display to HDR mode) when creating SMPTE 2084 3D LUTs. Note that you need to have profiled the display in HDR mode as well (currently only possible by manually enabling a display's HDR mode).
    • [Feature] Output levels selection as advanced option and automatic output levels detection. Note that this cannot detect if you're driving a display that expects full range (0..255) in limited range (16..235), but it can detect if you're driving a display that expects limited range in full range and will adjust the output levels accordingly.
    • [Feature] New experimental profiling patch sequence advanced options. “Minimize display response delay” is the ArgyllCMS default (same as in previous versions of DisplayCAL). “Maximize lightness difference”, “Maximize luma difference”, “Maximize RGB difference” and “Vary RGB difference” are alternate choices which are aimed at potentially dealing better with displays employing ASBL (automatic static brightness limiting) leading to distorted measurements, and should be used together with display white level drift compensation.
    • [Feature] Optional alternate method for creating colorimeter correction matrices that minimizes xy chromaticity difference (four color matrix method).
    • [Feature] The curve viewer and profile information now have the ability to plot tone response curves of RGB device link profiles.
    • [Feature] The white and black level calibration target can now be set by measurement.
    • [Enhancement] The visual whitepoint editor is now compatible with Chromecast, Web @ localhost, madVR, Prisma and Resolve pattern generators.
    • [Enhancement] 3D LUT generator ReShade 3.0 compatibility.
    • [Feature] Support calibration from WCS profiles embedded in ICC profiles (like the ones created by the Windows Display Color Calibration Tool).
    • [Feature] Profile loader (Windows): Detect the Windows Display Color Calibration Tool.
    • [Feature] Profile loader (Windows): The quantization bitdepth can now be selected.

    Changed in this release:

    • [Enhancement] The visual whitepoint editor now uses the calibration of the currently active display profile as the initial whitepoint.
    • [Enhancement] Temporary files will no longer be removed if moving the files to the final location failed, and a non-empty temporary directory will no longer be removed on exit.
    • [Enhancement] Incomplete runs are now always saved to a folder named 'incomplete' in the parent directory of the 'storage' directory (previously when creating a profile from existing measurement data, a failed run could overwrite existing files in a source folder that did not reside in the 'storage' directory).
    • [Enhancement] Use a different (numbered) logfile name when starting additional instances of the standalone tools.
    • [Enhancement] When creating colorimeter correction matrices from existing spectral reference data, use the selected observer.
    • [UI] Hide the observer selector in the colorimeter correction creation dialog when creating a spectral colorimeter correction as observer isn't applicable in that case.
    • [UI] Remove the single “Browse...” button from the colorimeter correction creation dialog and add individual file pickers for reference and colorimeter measurement data files.
    • [UI] When creating colorimeter corrections for “virtual” display devices like madVR or Resolve, offer to specify the actual display model and manufacturer.
    • [UI] Use smaller increments when paging up/down the black point rate or testchart patches amount sliders.
    • [Cosmetic] Default whitepoint color temperature and chromaticity to 6500K and D65 respectively.
    • [Cosmetic] If you explicitly pause measurements prior to attempting to cancel them, and then dismiss the confirmation dialog, the measurements will no longer automatically resume (unpause) anymore.
    • [Enhancement] Linux: When installing instrument udev rules, backup existing rules to a timestamped backup directory ~/.local/share/DisplayCAL/backup/YYYYMMDDTHHMMSS instead of overwriting existing backups in ~/.local/share/DisplayCAL/backup, and automatically add the current user to the 'colord' group (which will be created if nonexistent) if not yet a member.
    • [Cosmetic] Mac OS X: Don't include ID in profile header (stops ColorSync utility from complaining).
    • [Enhancement] Profile loader (Windows): The selected calibration state will not be implicitly (re-)applied every three seconds, but only if a change in the running processes or video card gamma tables is detected. This has been reported to stop hitching on some systems using Intel integrated graphics, and works around an issue with the Windows 10 Creators Update and fullscreen applications (e.g. games) where the calibration state would not be restored automatically when returning to the desktop.
    • [Enhancement] Profile loader (Windows): The profile loader will check whether or not madVR resets the videoLUT and preserve calibration state if not.
    • [UI] [Cosmetic] Profile loader (Windows): Renamed “Preserve calibration state” menu item to “Load calibration on login & preserve calibration state” to reduce ambiguity.
    • [UI] [Cosmetic] Profile loader (Windows): The tray icon will animate when calibration is reloaded.
    • [UI] [Cosmetic] Windows 7 and newer: Show progress in the taskbar.

    Fixed in this release:

    • [Minor] Prevent ArgyllCMS from removing measurements with one or two zero CIE components by fudging them to be non-zero.
    • [Minor] In some cases the high resolution colorimetric PCS-to-device table of XYZ LUT profiles would clip slightly more near black than expected.
    • [Trivial] Save and restore SMPTE 2084 content colorspace 3D LUT settings with profile.
    • [UI] [Minor] Changing the application language for the second time in the same session when a progress dialog had been shown at any point before changing the language for the first time, resulted in an unhandled exception. This error had the follow-up effect of preventing any standalone tools to be notified of the second language change.
    • [UI] [Trivial] The “Install Argyll instrument drivers” menu item in the “Tools” menu is now always enabled (previously, you would need to select the location of the ArgyllCMS executables first, which was counter-intuitive as the driver installer is separate since DisplayCAL 3.1.7).
    • [UI] [Cosmetic] When showing the main window (e.g. after measurements), the progress dialog (if present) could become overlapped by the main window instead of staying in front of it. Clicking on the progress dialog would not bring it back into the foreground.
    • [UI] [Minor] 3D LUT tab: When selecting a source colorspace with a custom gamma tone response curve, the gamma controls should be shown regardless of whether advanced options are enabled or not.
    • [Trivial] Testchart editor: Pasting values did not enable the “Save” button.
    • [UI] [Minor] Untethered measurement window: The “Measure” button visual state is now correctly updated when cancelling a confirmation to abort automatic measurements.
    • [Minor] Windows: Suppress errors related to WMI (note that this will prevent getting the display name from EDID and individual ArgyllCMS instrument driver installation).
    • [UI] [Cosmetic] Profile loader (Windows): Changing the scaling in Windows display settings would prevent further profile loader tray icon updates (this did not affect functionality).
    • [Minor] Profile loader (Windows): Undefined variable if launched without an active display (i.e. if launched under a user account that is currently not the active session).
    • [Minor] Profile loader (Windows): Original profile loader instance did not close after elevation if the current user is not an administrator.
    2017-02-18 15:52 (UTC) 3.2.4

    3.2.4

    Added in this release:

    • Korean translation thanks to 김환(Howard Kim).

    Changed in this release:

    • Disable observer selection if observer is set by a colorimeter correction.
    • 3D LUT maker: Enable black output offset choice for 16-bit table-based source profiles.
    • Profile loader (Windows): “Automatically fix profile associations” is now enabled by default.
    • Build system: Filter out “build”, “dist” as well as entries starting with a dot (“.”) to speed up traversing the source directory tree (distutils/setuptools hack).

    Fixed in this release:

    • Could not create colorimeter correction from existing measurements for instruments that don't support alternative standard observers.
    • ColorHug / ColorHug2 “Auto” measurement mode threw an error if the extended display identification data did not contain a model name.
    • [Trivial] [Cosmetic] Testchart editor: When adding reference patches, resize row labels if needed.
    • Profile loader (Linux): When errors occured during calibration loading, there was no longer any message popup.
    • Profile loader (Windows): Filter non-existing profiles (e.g. ones that have been deleted via Windows Explorer without first disassociating them from the display device) from the list of associated profiles (same behavior as Windows color management settings).
    • Profile loader (Windows): When changing the language on-the-fly via DisplayCAL, update primary display device identfier string.
    2017-01-04 14:10 (UTC) 3.2.3

    3.2.3

    Changed in this release:

    • Updated traditional chinese translation (thanks to 楊添明).
    • Profile loader (Windows): When creating the profile loader launcher task, set it to stop existing instance of the task when launching to circumvent a possible Windows bug where a task would not start even if no previous instance was running.

    Fixed in this release:

    • When querying the online colorimeter corrections database for matching corrections, only query for corrections with a matching manufacturer ID in addition to a matching display model name (fixes corrections being offered for displays from different manufacturers, but matching model names).
    • Profile loader (Windows): Fix unhandled exception if no profile is assigned to a display (regression of a change to show the profile description instead of just the file name in DisplayCAL 3.2.1).

    2016-12-13 22:27 (UTC) 3.2.2

    3.2.2

    Changed in this release:

    • Importing colorimeter corrections from other display profiling software now only imports from the explicitly selected entries in automatic mode.
    • Profile loader launcher (Windows): Pass through --oneshot argument to profile loader.

    Fixed in this release:

    • Visual whitepoint editor: Opening a second editor on the same display without first dragging the previously opened editor to another display would overwrite the cached profile association for the current display with the visual whitepoint editor temporary profile, thus preventing the correct profile association being restored when the editor was closed.
    • Mac OS X: Fall back to HTTP when downloading X3D viewer components to work around broken Python TLS support.
    • Windows: When installing instrument drivers, catch WMI errors while trying to query device hardware IDs for instruments.
    • Profile loader (Windows): Possibility of unhandled exception when resuming from sleep if the graphics chipset is an Intel integrated HD graphics with more than one attached display device (may affect other graphics chipsets as well).
    2016-11-25 13:35 (UTC) 3.2.1

    3.2.1

    Changed in this release:

    • Profile loader (Windows Vista and later): The profile loader process now auto-starts with the highest available privileges if installed as administrator. This allows changing system default profile associations whenever logged in with administrative privileges.
    • Profile loader (Windows Vista and later): If running under a restricted user account and using system defaults, clicking any of the “Add...”, “Remove” and “Set as default” buttons will allow to restart the profile loader with elevated privileges.
    • Profile loader (Windows): Show profile description in addition to profile file name in profile associations dialog.

    Fixed in this release:

    • Linux, Windows: Visual whitepoint editor was not working in HiDPI mode.
    • Windows: Irritating “File not found” error after installing a profile with special characters in the profile name (note that the profile was installed regardless).
    • [Cosmetic] Standalone executables (Windows): In HiDPI mode, taskbar and task switcher icons could be showing placeholders due to missing icon files.
    • [Minor] Profile loader (Windows): Enable the profile associations dialog “Add...” button irrespective of the current list of profiles being empty.
    • [Minor] Profile loader (Windows): Suppress error message when trying to remove a profile from the active display device if the profile is the system default for said device (and thus cannot be removed unless running as administrator) but not for the current one.
    • Profile loader (Windows): Do not fail to close profile information windows if the profile associations dialog has already been closed.
    • Profile loader (Windows): If logging into another user account with different DPI settings while keeping the original session running, then logging out of the other account and returning to the original session, the profile loader could deadlock.
    2016-11-19 11:01 (UTC) 3.2

    3.2

    Added in this release:

    • Visual whitepoint editor. This allows visually adjusting the whitepoint on display devices that lack hardware controls as well as match several displays to one another (or a reference). To use it, set the whitepoint to “Chromaticity” on the “Calibration” tab and click the visual whitepoint editor button (you can open as many visual whitepoint editors simultaneously as you like, so that e.g. one can be left unchanged as reference, while the other can be adjusted to match said reference). The editor window can be put into a distraction-free fullscreen mode by maximizing it (press ESC to leave fullscreen again). Adjust the whitepoint using the controls on the editor tool pane until you have achieved a visual match. Then, place your instrument on the measurement area and click “Measure”. The measured whitepoint will be set as calibration target.
    • Another “Auto” testchart slider step with 154 patches (equal to small testchart for LUT profiles) for XYZ LUT + matrix profile type.

    Changed in this release:

    • Menu overhaul. Menus are now better organized using categorized sub-menus and some menu items have been moved to more appropriate locations:
      • The “Options” menu no longer contains any functionality besides actual options. Advanced options have been moved to a sub-menu.
      • Profile creation from existing measurement files or EDID, profile installation as well as profile upload (sharing) functionality can now be found in the “File” menu.
      • Most functionality available in the “Tools” menu has been grouped into categorized sub-menus, with some of the less-used functionality now available under a separate “Advanced” sub-menu.
      • Measuring the selected testchart, enhancing the effective resolution of a colorimetric PCS-to-device table, loading calibration and resetting the video card gamma tables, detecting displays & instruments, as well as user-initiated spectrometer self-calibration functionality has been moved to the “Tools” menu and respective sub-menus where applicable.
    • Changed default curves + matrix profile testchart as well as first “Auto” testchart slider step back to pre-3.1.7 chart with 73 patches.
    • Better curves + matrix profiles as well as faster computation of XYZ LUT + matrix profiles. The matrix and shaper curves of gamma + matrix, curves + matrix as well as XYZ LUT + matrix profiles are now generated in separate steps which improves the shape and grayscale neutrality of the curves on less well-behaved displays. XYZ LUT + matrix profiles will compute faster, because the curves and matrix are created from a sub-set of the profiling patches, and take around the same time as XYZ LUT + swapped matrix profiles, resulting in a typical overall computation speed increase of around +33% (+100% if just looking at the time needed when not creating PCS-to-device tables) for a XYZ LUT + matrix profile computed from 1148 patches. XYZ LUT + matrix profiles computed from more patches should see a larger computation speed increase of up to +100% depending on patch count.
    • Resolve pattern generator and non-native madVR network implementation: Determine the computer's local network IP address in a way that is hopefully more reliable across platforms.
    • Profile loader (Windows): Detect and work-around buggy Intel video drivers which, despite reverting to linear gamma tables at certain points (e.g. UAC prompts), will effectively ignore attempts to restore the gamma table calibration if it is considered to be already loaded by the driver.
    • Profile loader (Windows): Replaced “Open Windows color management settings...” pop-up menu item with own “Profile associations...” implementation. This should work better with multi-display configurations in contrast to Windows' braindead built-in counterpart, i.e. display devices will be listed under their EDID name (if available) as well as their viewport position and size on the virtual desktop and not only their often meaningless generic driver name like “PnP-Monitor”. Also, there won't be multiple entries for the same display device or ambiguous “1|2” identifications if there are display devices that are currently not part of the desktop due to being disabled in Windows display settings. Changing profile associations around is of course still using Windows color management functionality, but the custom UI will look and act more sane than what Windows color management settings has to offer.
    • Profile loader (Windows): Clicking the task bar tray icon will now always show up-to-date (at the time of clicking) information in the notification popup even if the profile loader is disabled.
    • Profile loader (Windows): Starting a new instance of the profile loader will now always attempt to close an already running instance instead of just notifying it, allowing for easy re-starting.
    • Windows (Vista and later): Installing a profile as system default will now automatically turn off “Use my settings for this device” for the current user, so that if the system default profile is changed by another user, the change is propagated to all users that have opted to use the system default profile (which is the whole point of installing a profile as system default).

    Fixed in this release:

    • Spectrometer self-calibration using an i1 Pro or i1 Pro 2 with Argyll >= 1.9 always presented the emissive dark calibration dialog irrespective of measurement mode (but still correctly did a reflective calibration if the measurement mode was one of the high resolution spectrum modes).
    • User-initiated spectrometer self-calibration was not performed if “Allow skipping of spectrometer self-calibration” was enabled in the “Options” menu and the most recent self-calibration was still fresh.
    • Cosmetic: If an update check, colorimeter correction query or profile sharing upload returned a HTTP status code equal to or greater than 400 (server-side error), an unhandled exception was raised instead of presenting a nicer, formatted error dialog (regression of DisplayCAL 3.1.7 instrument driver installer download related changes).
    • Profile loader (Windows, cosmetic): Reflect changed display resolution and position in UI (doesn't influence functionality).
    • Resolve pattern generator: Unhandled exception if the system hostname could not be resolved to an IP address.
    2016-10-24 10:13 (UTC) 3.1.7.3

    3.1.7.3

    Fixed in this release:

    • 0install (Linux): (un)install-standalone-tools-icons command was broken with 3.1 release.
    • Profile loader (Linux): Unhandled exception if oyranos-monitor is present (regression of late initialization change made in 3.1.7).
    2016-10-21 12:26 (UTC) 3.1.7.2

    3.1.7.2

    Changed in this release:

    • Windows: Toggling the “Load calibration on login” checkbox in the profile installation dialog now also toggles preserving calibration state in the profile loader and vice versa, thus actually affecting if calibration is loaded on login or not (this restores functionality that was lost with the initial DisplayCAL 3.1 release).
    • Windows: The application, setup and Argyll USB driver installer executables are now digitally signed (starting from October 18, 2016 with SHA-1 digest for 3.1.7.1 and dual SHA-1 and SHA-256 digests for 3.1.7.2 from October 21, 2016).

    Fixed in this release:

    • Profile loader (Windows): User-defined exceptions could be lost if exiting the profile loader followed by (re-)loading settings or restoring defaults in DisplayCAL.
    2016-10-18 10:00 (UTC) 3.1.7.1

    3.1.7.1

    Fixed in this release:

    • Profile loader (Windows): Setting calibration state to reset video card gamma tables overwrote cached gamma ramps for the 2nd display in a multi-display configuration.
    2016-10-04 20:49 (UTC) 3.1.7

    3.1.7

    Added in this release:

    • 3D LUT sizes 5x5x5 and 9x9x9.
    • JETI spectraval 1511/1501 support (requires ArgyllCMS >= 1.9).
    • Profile loader (Windows): User-definable exceptions.
    • Profile loader (Windows): Added reset-vcgt scripting command (equivalent to selecting “Reset video card gamma table” from the popup menu).

    Changed in this release:

    • “Auto” resolution of PCS-to-device tables is now limited to 45x45x45 to prevent excessive processing times with profiles from “funky” measurements (i.e. due to bad/inaccurate instrument).
    • Automatically optimized testcharts now use curves + matrix profiles for preconditioning to prevent a possible hang while creating the preconditioned testchart with LUT-type profiles from sufficiently “badly behaved” displays.
    • 2nd auto-optimized testchart slider step now defaults to XYZ LUT profile type as well, and the previous patch count was increased from 97 to 271 (necessary for baseline LUT profile accuracy).
    • Adjusted curves + matrix testcharts to only include fully saturated RGB and grayscale to prevent tinted neutrals and/or “rollercoaster” curves on not-so-well behaved displays (also reduces testchart patch count and measurement time, but may worsen the resulting profile's overall accuracy).
    • Removed near-black and near-white 1% grayscale increments from “video” verification charts.
    • Use a 20 second timeout for unresponsive downloads.
    • Windows: Much easier ArgyllCMS instrument driver installation (for instruments that require it). No need to disable driver signature enforcement under Windows 8/10 anymore. Select “Install ArgyllCMS instrument drivers...” from the “Tools” menu, click “Download & install”, wait briefly for the download to finish (400 KB), confirm the User Access Control popup, done. Note that the driver installer executable is currently not digitally signed (obtaining a suitable certificate from a trusted authority is in progress), but the driver itself is signed as usual. The installer is based on libwdi.
    • Profile loader (Windows): Changed apply-profiles scripting command to behave excatly like selecting “Load calibration from current display device profile(s)” from the popup menu, i.e. not only load calibration, but also change the setting.
    • Profile loader (Windows): Also count calibration state being (re)applied when the profile loader state or profile association(s) changes.

    Fixed in this release:

    • Update measurement modes after importing colorimeter corrections. Fixes additional measurement modes for the Spyder4/5 not appearing until the program is restarted or a different instrument is selected first.
    • Trivial: Instrument setup was unnecessarily being called twice after downloading ArgyllCMS when the latter wasn't previously detected.
    • Mac OS X: Work around a wxPython bug which prevents launching the application from a path containing non-ASCII characters.
    • Mac OS X: Work around a configuration problem affecting ArgyllCMS 1.9 and 1.9.1 (fixes Spyder2 firmware, additional Spyder4/5 measurement modes, and imported colorimeter corrections not being seen by DisplayCAL if imported via ArgyllCMS 1.9 or 1.9.1).
    2016-08-24 21:33 (UTC) 3.1.6

    3.1.6

    Added in this release:

    • HDR/SMPTE 2084: Advanced options to specify maximum content light level for roll-off (use with care!) as well as content colorspace (affects perceptual intent gamut mapping, less so colorimetric).

    Changed in this release:

    • Increased timeout to launch ArgyllCMS tools to 20 seconds.
    • Show failed items when otherwise successfully importing colorimeter corrections, and detect updated CCSS files.
    • HDR/SMPTE 2084: Improve overall saturation preservation.
    • Linux/colord: When checking for a valid colord device ID, also try with manufacturer omitted.
    • Windows Vista and later: Use “known folders” API to determine path to “Downloads” directory.

    Fixed in this release:

    • HDR/SMPTE 2084: Slightly too light near-black tones when black output offset was set to below 100%.
    • Synthetic ICC Profile Creator: Undefined variable when creating synthetic profile with custom gamma or BT.1886 and non-zero black level (regression of HDR-related changes made in 3.1.5).
    • When loading settings from a profile created with DisplayCAL prior to 3.1.5 and custom 3D LUT tone curve gamma in DisplayCAL 3.1.5, the gamma and output offset controls wouldn't be shown if advanced options weren't enabled until re-selecting the tone curve choice.
    • Cosmetic (Windows 10): Banner would go blank under some Windows 10 configurations when showing the profile or 3D LUT installation dialog.
    • Cosmetic (Linux): Missing backgrounds and wrongly sized combo boxes when wxGTK is built against GTK3.
    • Linux: Profile loader autostart entry was installed under wrong (mixed-case) name if installing for the current user, which lead to the loader unnecesarily being run twice if DisplayCAL was installed from a RPM or DEB package. The superfluous loader entry will be automatically removed the next time you install a profile, or you can remove it manually by running rm ~/.config/autostart/z-DisplayCAL-apply-profiles.desktop in a terminal.
    • Linux/colord: Don't cache device IDs that are not the result of a successful query.
    • Windows: Make elevated subprocess calls synchronous. Fixes importing colorimeter corrections system-wide not listing all succesfully imported items on the first use.
    2016-08-02 22:28 (UTC) 3.1.5

    3.1.5

    Added in this release:

    • HDR: Allow specifying of black output offset for SMPTE 2084.

    Changed in this release:

    • HDR: Implemented SMPTE 2084 rolloff according to ITU-R BT.2390.
    • HDR: Implemented SMPTE 2084 3D LUT tone mapping (preserve hue and saturation with rolloff).
    • HDR: Improved SMPTE 2084 3D LUT perceptual intent rendering (better preserve saturation). Note that colorimetric intent is recommended and will also do tone mapping.
    • Linux/colord: Increase timeout when querying for newly installed profiles to 20 seconnds.

    Fixed in this release:

    • Minor: HDR peak luminance textbox was sometimes not able to receive focus.
    • Minor (Mac OS X): Don't omit ICC files from compressed archives (regression of adding device link profiles as possible 3D LUT output format in DisplayCAL 3.1.3).
    2016-07-10 23:35 (UTC) 3.1.4

    3.1.4

    Added in this release:

    • A fourth Rec. 709 encompassing color space variant as a profile connection space candidate for XYZ LUT profiles. May lead to better utilization of PCS-to-device color lookup table grid points in some cases (and thus potentially smaller profiles when the effective resolution is set to the default of “Auto”).
    • An option to include legacy serial ports (if any) in detected instruments.
    • SMPTE 2084 (HDR) as 3D LUT tone curve choice.

    Changed in this release:

    • Don't preserve shaper curves in ICC device link profiles if selected as 3D LUT output format (effectively matching other 3D LUT formats).
    • Removed “Prepress” preset due to large overlap with “Softproof”.
    • Changed “Softproof” preset to use 5800K whitepoint target (in line with Fogra softproof handbook typical photography workflow suggested starting point value) and automatic black point hue correction.
    • Synthetic ICC profile creator: Changed SMPTE 2084 to always clip (optionally with roll-off) if peak white is below 10000 cd/m².
    • Synthetic ICC profile creator: Changed transition to specified black point of generated profiles to be consistent with BT.1886 black point blending (less gradual transition, blend over to specified black point considerably closer to black).
    • Profile loader (Windows): If no profile assigned, load implicit linear calibration.

    Fixed in this release:

    • When loading settings from an existing profile, some CIECAM02 advanced profiling options were not recognized correctly.
    • Don't accidentally remove the current display profile if ArgyllCMS is older than version 1.1 or the ArgyllCMS version is not included in the first line of output due to interference with QuickKeys under Mac OS X.
    • Make sure the ArgyllCMS version is detected even if it isn't contained in the first line of output (fixes ArgyllCMS version not being detected if QuickKeys Input Manager is installed under Mac OS X).
    • When loading settings, add 3D LUT input profile to selector if not yet present.
    • Curve viewer/profile information: Fix potential division by zero error when graphing unusual curves (e.g. non-monotonic or with very harsh bends).
    • Profile information: Reset right pane row background color on each profile load (fixes “named color” profile color swatches sticking even after loading a different profile).
    2016-04-11 10:50 (UTC) 3.1.3.1

    3.1.3.1

    Changed in this release:

    • Updated traditional chinese localization (work-in-progress, thanks to 楊添明).
    • Windows: If madTPG is set to fullscreen and there's more than one display connected, don't temporarily override fullscreen if interactive display adjustment is enabled.

    Fixed in this release:

    • Windows: If interactive display adjustment is disabled and madTPG is set to fullscreen, show instrument placement countdown messages in madTPG OSD.
    • Windows: Restore madTPG fullscreen button state on disconnect if it was temporarily overridden.
    • Profile loader (Windows): Error message when right-clicking the profile loader task tray icon while DisplayCAL is running.
    2016-04-09 12:16 (UTC) 3.1.3

    3.1.3

    If you update from DisplayCAL 3.1/3.1.1/3.1.2 standalone under Windows using the installer, please close the profile loader manually (if it is running) before running setup - due to an unfortunate bug, the installer may not be able to close and restart the profile loader automatically, which may then require using the task manager to end the profile loader process. Apologies for the inconvenience.

    Added in this release:

    • Device link profile as possible 3D LUT output format.
    • French ReadMe (thanks to Jean-Luc Coulon).
    • Partial traditional chinese localization (work-in-progress, thanks to 楊添明).
    • When you change the language in DisplayCAL, the Windows Profile Loader will follow on-the-fly if running.
    • Synthetic ICC profile creator: Capability to specify profile class, technology and colorimetric image state.
    • Windows: When the display configuration is changed while DisplayCAL is running, automatically re-enumerate displays, and load calibration if using the profile loader.
    • Profile loader (Windows): Starting the loader with the --oneshot argument will make it exit after launching.

    Changed in this release:

    • Updated ReShade 3D LUT installation instructions in the ReadMe.
    • Improved “Enhance effective resolution of PCS to device tables” smoothing accuracy slightly.
    • Profile loader (Windows):
      • Detect CPKeeper (Color Profile Keeper) and HCFR.
      • Show any calibration loading errors on startup or display/profile change in a notification popup, and also reflect this with a different icon.

    Fixed in this release:

    • Added semicolon (“;”) to disallowed profile name characters.
    • ICC profile objects were leaking memory.
    • Windows: Made sure that the virtual console size is not larger than the maximum allowed size (fixes possible inability to launch ArgyllCMS tools on some systems if the Windows scaling factor was equal to or above 175%).
    • Windows (Vista and newer): Use system-wide profiles if per-user profiles are disabled.
    • Profile loader (Windows):
      • If Windows calibration management is enabled (not recommended!), correctly reflect the disabled state of the profile loader in the task tray icon and don't load calibration when launching the profile loader (but keep track of profile assignment changes).
      • Prevent a race condition when “Fix profile associations automatically” is enabled and changing the display configuration, which could lead to wrong profile associations not being fixed.
      • Sometimes the loader did not exit cleanly if using taskkill or similar external methods.
      • Prevent a race condition where the loader could try to access a no longer available display device right after a display configuration change, which resulted in no longer being able to influence the calibration state (requiring a loader restart to fix).
      • Profile loader not reacting to display changes under Windows XP.
    2016-03-03 22:33 (UTC) 3.1.2

    3.1.2

    Fixed in this release:

    • Profile loader (Windows): Pop-up wouldn't work if task bar was set to auto-hide.
    2016-02-29 17:42 (UTC) 3.1.1

    3.1.1

    Added in this release:

    • Profile loader (Windows): Right-click menu items to open Windows color management and display settings.

    Changed in this release:

    • Profile loader (Windows):
      • Detect f.lux and dispcal/dispread when running outside DisplayCAL.
      • Don't notify on launch or when detecting DisplayCAL or madVR.
      • Detect madVR through window enumeration instead of via madHcNet (so madVR can be updated without having to close and restart the profile loader).
      • Enforce calibration state periodically regardless of video card gamma table state.
      • Don't use Windows native notifications to overcome their limitations (maximum number of lines, text wrapping).
      • Show profile associations and video card gamma table state in notification popup.

    Fixed in this release:

    • Error after measurements when doing verification with “Untethered” selected as display device and using a simulation profile (not as target).
    • Windows: Sporadic application errors on logout/reboot/shutdown on some systems when DisplayCAL or one of the other applications was still running.
    • Standalone installer (Windows): Remove dispcalGUI program group entries on upgrade.
    • Profile loader (Windows):
      • Error when trying to enable “Fix profile associations automatically” when one or more display devices don't have a profile assigned.
      • Sporadic errors related to taskbar icon redraw on some systems when showing a notification after changing the display configuration (possibly a wxPython/wxWidgets bug).
    • Mac OS X: Application hang when trying to quit while the testchart editor had unsaved changes.
    2016-02-01 00:32 (UTC) 3.1

    3.1

    dispcalGUI has been renamed to DisplayCAL.

    If you upgrade using 0install under Linux: It is recommended that you download the respective DisplayCAL-0install package for your distribution and install it so that the applications accessible via the menu of your desktop environment are updated properly.

    If you upgrade using 0install under Mac OS X: It is recommended that you delete existing dispcalGUI application icons, then download the DisplayCAL-0install.dmg disk image to get updated applications.

    Added in this release:

    • Better HiDPI support. All text should now be crisp on HiDPI displays (with the exception of axis labels on curve and gamut graphs under Mac OS X). Icons will be scaled according to the scaling factor or DPI set in the display settings under Windows, or the respective (font) scaling or DPI system setting under Linux. Icons will be scaled down or up from their 2x version if a matching size is not available. Note that support for crisp icons in HiDPI mode is currently not available in the GTK3 and Mac OS X port of wxPython/wxWidgets. Also note that if you run a multi-monitor configuration, the application is system-DPI aware but not per-monitor-DPI aware, which is a limitation of wxPython/wxWidgets (under Windows, you will need to log out and back in after changing DPI settings for changes to take effect in DisplayCAL).
    • When having created a compressed archive of a profile and related files, it can now also be imported back in via drag'n'drop or the “Load settings...” menu entry and respective button.
    • ArgyllCMS can be automatically downloaded and updated.
    • A compressed logs archive can be created from the log window.
    • Windows: New profile loader. It will stay in the taskbar tray and automatically reload calibration if the display configuration changes or if the calibration is lost (although fullscreen Direct3D applications can still override the calibration). It can also automatically fix profile associations when switching from a multi-monitor configuration to a single display and vice versa (only under Vista and later). In addition, the profile loader is madVR-aware and will disable calibration loading if it detects e.g. madTPG or madVR being used by a video player.

    Changed in this release:

    • Changed default calibration speed from “Medium” to “Fast”. Typically this cuts calibration time in half, while the accuracy difference is negligible at below 0.2 delta E.
    • Enabled “Enhance effective resolution of PCS to device tables” and smoothing for L*a*b* LUT profiles.

    Fixed in this release:

    • In some cases, importing colorimeter corrections from the vendor software CD could fail (falling back to downloading them from the web).
    • Moving the auto testchart patches slider to a value that changed the profile type did not update BPC accordingly (shaper+matrix defaults to BPC on).
    • Minor: Safari/IE messed up positioning of CCT graph vertical axis labels in measurement reports.
    • Minor: When clicking the “Install profile” button while not on the 3D LUT tab, and “Create 3D LUT after profiling” is enabled, don't create a 3D LUT.
    • Minor: When changing profile type, only change the selected testchart if needed, and default to “Auto” for all profile types.
    • Minor: 1st launch defaults were slightly different from what was intended (testchart should be “Auto”).
    • Minor: Use OS line separator when writing configuration files.
    • Linux: Text and icon sizes should be more consistent accross the application when the system text scaling or DPI has been adjusted (application restart required).
    • Linux: Fall back to use the XrandR display name for colord device IDs if EDID is not available.
    • Linux/Mac OS X: madVR test pattern generator interface was prone to connection failures due to a race condition. Also, verifying a madVR 3D LUT didn't work.

    View changelog entries for older versions

    Definitions

    [1] CGATS
    Graphic Arts Technologies Standards, CGATS.5 Data Exchange Format (ANSI CGATS.5-1993 Annex J)
    [2] CMM / CMS
    Color Management Module / Color Management System
    [3] GPL
    GNU General Public License — gnu.org/licenses/gpl.html
    [4] GUI
    Graphical User Interface
    [5] ICC
    International Color Consortium — color.org
    [6] JSON
    JavaScript Object Notation, a lightweight data-interchange format — json.org
    [7] LUT
    Look Up Table — en.wikipedia.org/wiki/Lookup_table
    [8] SVN
    Subversion, a version-control system — subversion.tigris.org
    [9] UAC
    User Account Control — en.wikipedia.org/wiki/User_Account_Control
    [10] EDID
    Extended Display Identification Data — en.wikipedia.org/wiki/EDID
    [11] PCS
    Profile Connection Space — en.wikipedia.org/wiki/ICC_profile
    [12] UEFI
    Unified Extensible Firmware Interface — en.wikipedia.org/wiki/UEFI

    DisplayCAL-3.5.0.0/screenshots/0000755000076500000000000000000013242313606016036 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-1024x576.png0000644000076500000000000023754713242301265024545 0ustar devwheel00000000000000PNG  IHDR@tEXtSoftwareAdobe ImageReadyqe<? IDATxEƿ9,`N bg<#<ÙE(HAs\fw_U=3;}rf:TUW,z(zqP-y^i B!BȉiM6mꪫ]t yܥ|%\r8aB!B! ]Uz'_}kz+,,č7ݺtw,..AkuXx 6m bp! ;ByPVM|u̘4m0!B!!!!{P]wcE`s۽ߏ{ ==1wbmJwEEEؼe ^6估:Mfd/WIB!4B!|>qf#ѧwO 8LO?F||q_{]k7^7*4/./,G\\\XmƬHje BȉB3ΪpӎZ?t zĿ B2-[4}ܭ;~W|+:>p0~!ndffc^| g7#/~G[=0p GЀ wǽUu-X(t|nnrӿO7aFc֭1ccbлWϰ/Xo?Ϙ@ N!T͚aUλlvJ0CB! r_zDcx畘CRSSB|=y2|>F\0)N.)a{7fϝ ?_3er W

    WB.+ GxԶ<+`ђ=O>Yy! %Ծ5j`9w㹱/n y!H5kU>x%*WsO?[&.zH W; BԣڟV8eV%_,+֛4B!#<ڽ[M{͚6zy1{<4nPoj{zZj֭dz/UIw+36ƿΑuGraj>k*< P'}5~Y>x}"\1)X&KJOtlߞD!B .6)eG|<{1 ;hmHHHPԯݺG?7xC  ڪJRRb}xrSdEEؽg:uu6AbǎhӺ5L\v˟Qf-=B཮wn=j}X~{[o+Aͨ[ƾ:^yxg)D?w~+Geڍws,h#]^Bϓ{ >3/sP,veuA$/RӔB!B ^zE5yVR3h ,\|X:?czYN|Q#{ m;Ӕ[MRVYSi[999Tez =*7Wڜzeʕhܨ!~J[@ߏ͛;n;j7W}_etR75 9W'&&APvjo[K8|koiвys8{(B'WveuD,6oقݘB!RmϞʘm~R׮;w¨ďGrR S7!B! :<O !B!B*`mqCaa&}5V8uB!B! +f̚ ヒ"_~}݄B!r8@!B!B!B!B!B!@!B!޽{9 B!Bmb0 !B!!B!B B!BB!B!4B!B!B!B!%4󎗎*YE@Pɞi:t 5Di]#"xciEk?`}Q$m * -b.8q$ && 5T3,jנ0~Vlm̂H?(.((:ٴoɅ!B!^֎!S7 B'G}֥~*>'J${<uiXbYVc8U1w13%:449ڶo8T- #3>܁qbKB!B@Ge4z*zE7:6LgS ͏!}B'*Р]CNiOg`݊u{3D+ sR-tnް[b(*C 6N|Qxm }Z2Ns)A3`o Q|Fl߰ΞwK9oQƦτB!Ba1@69*:N"i nJJtM^!k8 +\rvd`%$]!CCخPV`=y~'_M©zu֬#ݴ޿-~YYY/gQf 4ntg !B!qaht-d,WnWT!)J^W^1 vl|i||Q^!>=S'5O@}ѼB~Uk;0wZ&r G|qĠ=Q3!ņ-qR(_vvov)g3*aB!B!HѯD#xD!vJ 6vfD#=4ԡԢ42ȞldyJ }E7N;V̿.d,[`8n;vQ3rfp{"VNݵX@^/ʍv%0@O!B!P ng^OiV _hSy#N[3,Leҿ7|I7dl3V#7\3yzZ͛Ymr NsEr-2vv ݿ؎IlwljB!B@&z]b?l%(571xX/LvM[뗯][ג=?'k(>NM~So rȓKyзT;fNJ J;IA7UkaAsf%Wq];"( !B!Ge,OG$ |kX4feؓвa ݗغ)hѯm`nߏI+(E]P;*_ -'_ E<{# LjG%cxno﹗smǴekq |daK 0+I$@!B!=r,gC#cR륾ǃNjΰ^(O.gH4tk7Taۿ#u,×6bwyFiuahvy(%k~P*òhYB!B!P[]B>l\9]0*|{F$4B[0yldk~q: n[bM{_٘VdQnmǀ,|}٘t- 2slﷅ \d!kIO!B!2xʊGYѯ1 (^Z"ۃ)qoS}`ųaGA6ũѵU{+*V?yƶd oĪx3;uIuP"=vf˿,E||36mn;.Nv$O??!B!`kZiz؇Vvf?2_[r; 5\0IX^oX{xGnJ{x= "ߌ+N q*TtDi_mskQ_/.]/ 3o0ΟB!BmaYh,WA@_/oZ *뿝@O(0gj ΃ӿ8M;awl2Q cQfC\ܥ=Q(`%m.ٝ[O]{Kw\A[;.G!B!7_^f=Eoz F| | R1wRq>$4GﳻCi)7b *_0UCR%ۥ$`0ců0 "׌q{fX?B!B!x6xY/Rć~0я!!C28utnO(@ ػb#11umhW1 &ވūtEz)b%5g?4`ѯ8+/ wA7 N@ ZN+G@>A!B!}@y? b?-\;]yۇ]' ࣅ[j<3$\߭#&X/Jǫw`]q%.;v0~qKb$o,)Y8& /r_bW&cz2dxlA#!B!x38ӘaB3!@aeY͞W/PB$֌CہuĿwCZ5qmHj^/3-Z\haqId(IFGa5>KX{e\+xq.>` :L_O->Ȋqqm{ݛ~sQw00b,b,Ks& xhܔ8O Pxc+6j6K fк?ɢ2G'JHh[u3'+IMWy-B! a2hu뮌z(C=yCJs0K-/N56Y\feaxtiZ#[RJR( bXy-e3lU7[cA޷ i-ڌIǦ ڿYBk m#+ŶQ7=Gh},?u7/=z7m7ZBM{RU+](9g/JLxP1[J'IWy1Vԑ(k oBˀ5^(9_vH+Kpͽobn]\{Vnj .:XSh{G qK@ry0n׶@ϜmBI\ oUˏmV^[v& U<ŴB!B7e@9.ݲ"BBp%j&. (K}2,B(I3PTHN-䉟|m xB $y_b^/RϏl! Y]d̷;^@3]2T'm/Myŧ*wt.gotj5 OƔK0B&꛸1Pms>%q2\߷>p-^|O\Dl}|9|VܖtˈpA]{:.=2X8\o}6 g ޾?F2BKjo(s8y}gGX9c%$ pi>6=b SohЩB[] ߯6삖)_:’/Q;8cUu r8Nl ́xߨROv%vB7PbB!BqcpreG~aFwz,NR%x؄F~5DY2_BzT~(˿(K3bB\ZډIHc,d\QAW.Ռiri1-S4!La)䫜Яco* OZYƎ?[ukB^Žp!RqL<]g7#w\^d_z5_Oَ|>OԪk%D~oS??Uݏ-ټu==hVmL+6$`΂*djC^ yHOn鋻 =]lEg_?n O|먶B!B9ʌҵ~k'ZAN4$A&iA5m Z8QgMY ,>eP )d8I<>lݓإij+)/]䯾E$ƾλ]a3-5Q7ӑxH<sj^2sЯ_b[zq稏]/zDE= 1jۈ=a\7_/>IA)ߧn~׎CM.]>"4Kt}ml̕|;kUhErz8_> LLd{⭟9Ѥno5 @!B9*!?#@s%21B֪%^g5+DyP"ICa=V;#~^X~!}('g] ̀-Ulű 5n;8h"lݰ;!/<tA =Ň;2Ckĉ cne^k|kf_~~ʯDŽc웟၉Io<2dӻT{`Ke`ckRb0iE&z]/6/{G⋵EBhŠ3(9?g`")sβff1K <>ƥګ<%ZLjAWY? /.t%QN @Y8+3-&F@QYkT7 [s6_B!Bq3{# (g)Blkk+3Մnn3/Q4c3:#%MK+xw6{PXd嶓A]bip<u7@\jMk8Yd-J 5 lT3Iy1 KhKo[a8K;Lc?[y+K{›u}72AH"(8aBԹo|l. DRMa:JU@JR:NZsO mfL\2};'Ԡ9h'ԢY?? IVXn2ؖ+2D#ڛD{c=U ,;fwZa=11th*FA:|9r@?r\145?jP[<\9͛6T3M^=U'PH( -.ynPU*b̈qYJSO|nģ-.'-G6`L_S6ŽtQ,B!Ba^_|Z iЌ;K9uӬYG;.C<-YMt_G2+}D]uC/Q_~kudѷkE@epf ^7nMJZ䵚JSt9IlijdzQN(f} ؘAO#B(ŵP[',EdcFvWڏT1C&Tvj_躗S Y/j17^Gz.t|;u2Nl\=un{+AcM!\s[i0/3oZhvL@8~8KDNo %%ʼnH86bS[ [R\B!r֋.zy^ cI/=pdaZ}[e Q }O6Q["qy:n_[K`*$W+9rQ as ) "kk 9,A{o(^H¡._)gM wVGlO,.wV ;'cF_k/&pkP2mˆӆ-; {|D~Ӱc_J'C|J&)k~(W/kbŶ_p"l-ZO RE|\[ 2B]w䍖 0<ڒ}_毎WOGif,۩$2AB!B3@h-ūtOj&7.U8ܚur4ԅ75 _ rks4K͚jƆL!īt%A`خݕmu$ԯmťF`W2\y>W G_O17\6[퇞XSe|ˮ<d?"[:0o-T\`/w -4o]~ͮLeݥ% ׾< zR]iMT܅&EC12}7H )Oر 31j9-1acK")0bS`!`h( Z_JM]('B!Dm2Úq-QZ qR_J˓>X:+?dNZux M!ЌbKKo8#i?Lb[6.#]:K b =P#{^Ha0_7=v*qQXLB!BNTK5[<Оeڵ(rYlGٯ~b\-LK; VS\e2 d U%`X;"ގ/DIj[:Q6 2 DV&YPt&ɃZ΍WMʥ6pʝ0*~H=^r 6Xwѕ8eO^CJț 盕G&LKB{ŸYH _M)'NY&u  “OZ|_45뉵qasQWѧSuZo[s%O ۼua :/#ofc%զ+.8|VHPUXz5+$B!4eE^e7zmpV'Y1ԻKz^"''`7 FA@y8q׎NwUiDy5*W}7Bqr{ `Q@tj]¨#,ϊEŝGF@ԓ(!.JhWQ/(\ &Q?u'UU%92nB*IZ؇%EVq\}]Ev~x!Um PKj/higoRK_<|yF&+)PN"=DThD꛼'ߕ y;`<9r})P,t|@!B9h@Hcdj˲KOzi(҄݅YL9/Ya?v@L諑<!5)VVB(]_Ps \%gcTH#A|zYiyUl]vOtU*#Bd KkeECON[d/筊FMUCej7y>T.B!B9ѣ;Gs< kBMFI Ȁ/ zbۖ2j2z23#"+;o_U쑡zbZN)XhBKqַ"G@Jg-aB!BbC?}COlmȱKdyWA85/Sk0]4?$}JYٓb ]ʍ9cqMW!/aQo,ZM*B!Bq"MsYWϝ-~>_s _l4Jnπb#m( ¿mP(c <2`%!*f?2ĥ%;*X\a\6!!B!c7f'@aXmPξOY lαCQ4rruOÔ_j @{lT 5e*?*xd B! 08$wYEp5c?V Dvd@,]ϰ @[i.H7h뉉pWy40!B!oYѯGpW&ԏS?W`> ״ Z/fnsPqD2sI]9d1(FB!B!3hC%VA ߯REdڀb[\IYV'Q r+ע-PB!B9 фny9Iw z`_e(-_X*^eB f0sEEhjpסyt̠k_s !B!H|xgM.[B _[B[;qŦ+ӿ,rB\> b+ go P1a?B!B!Iyq@YS%D~5/E8ߵ70DYgD' yB'B!r"@zM O4b[;Jл3 noeE} tY8ڧ{" "z9G"+Beax~hZ'9ti}XKK@aU+޾w9\ݟޥߡkp.k%Nj Ϗ{v"= 'x$O_{jh<ˑߙCW__u!&w&۞h(-jSy]o}BO\_޻ ^qg? ˱.z{(@=h  +_Uֵ</֭׀f.zğ—Ctf\jDA#|NJMq e_^>=~IwJx4>T,]N?d/CZ2|2(spӿcJY1rv3&;CIħsJFoxBuAS]-ЅumgNu,ʾ_/OVoJzְfV2oyjϣWxNuNJ"VW :OI-kg!5xu:NT[1zUއR:^r/خw&I\ ѼnzqeM5{B!ǧ@?]|xի!^_~N> J{=ߐ:KԻ;-ökmY% (i "+*l_ J>4HŪ١dn鋿@ޡTm!pe,sXb:X/낉;=5cVע'þB\uF }0|vc$3a) D)>WB5(^[ggb[Ա!De ?'^UL_CJ`m]ϙxD qX_4<7'K5 A?r6 AQFԽz~+?FډB -JD_%7tǰcy|y(o%uwH{N␰־s584ofۙ[sw,ʾҝ̖x~"Ƨ ^_eحVlӫ=ֿscKT>DQFRחxXe/Eֵh72{xvTwIūUUB! =_H<W8rL/?w";q7";͒{O錿;D $#ȸ}3|aI#|w$L=~{2РF|69;(Egُ5 |:grDy mW;j8j*gS?U@nV;INiWKW#)VDU$Rbq٩p뛋5Zڨ 3Ⱥsb,~H ev?fj qv1fu %j6td&a^tlVthVnx߫1Xүەwm*_2q6%>d }ƩUgUǸ*p#.u7h7G㴎uq p{˪|]GY{YY{-٥\Y  /]{Ĩm򒝇4S籲nuHIB&iYLY["q_Sݴ8 X+W ޛ^!칭ﰽk*cGFޟ \Cz4T֕9n TuzvJiB![ Dn(Հ@Gl3ⱋ3=g>P6>q@M}t-~ߴWG=}UNjrSu#ݷ]3$D&>2Ǹ.(V?[KV?#?o'x+\lKwMyW2YYkgECymT̼b-jȃaiK4L,PjL״xCؗRºw]r<%+dUi\*H|c\~Ha'Ժ7Qulڛ Vύ::p= }/e'競en雅0kUSU{pF*lPƴsn^}YK+ #BYc*ާ1>=5ȸkkhZrZ[6]z?K[U},˪%z]29꓉J_W[n9z}mY{Y[0gmcX5K3եCV.UwL+}kݭɐTq#· Ѿ˵'k:yѿ3EAo:ʮ]ÎB:)?l@%sï}ƪ}z>TpkB!]Da)yv>_ ~;0]נKhLEoFqw/i0]F[X8?md(vzkevP1Y[ ß>XC6z{vcɩy7u[H8P*ioQ{Tֆ?!z׈ǚgêҖ^N[y?޵Yz`9eMݑSWUBsӴ*_~Vt|U,[C#ԠF#$x{*^V=}b_;U&ԭ>&/ucZ9}ݭߧm-OHPuX0oE}ܟFcJI-j_UJf?^ʾUiO.PPCe_[`jۡieTyw[d^ YU)2/̹٢?Uw)glV!ӟ67JUu4 /2Aw֢36!B 2_J]t.(yTӐ< YmwVs&^[&wBtl$y];~EGPْa \ @%[VRfT#=PZأŏ—XHb,aI1sSkJ_ܬe>]\5yx 3 ;?oR MV(}zxꚓ0Ɂ}7Q$݋2{B'8PQqP{o…ZA-? *${Iwu4].=w,i*v3~^/Iu1晥unYSҶ/gUJ'UɡמRFnuu;Kpgߌ'!8q&WMw- T% XX(/oOaX.X=N%Vw,<הx,w4-oJ}+ʓą4nߓSI,~4 }J)~\\Lj~㾜|%q}w;H 25 ""speKugT|F{lpgp4`&-s M-1K{6hף&mЮ`6K`]S5 |A ,r slTK̀uӫ0qj-*N/Kp&#GY&_/K*{YdzҮI06Ͻ/QlUKf[mP1H?r U=tϽ_p=nҶ̷xXVF5} ͨKWheOaOx<ۿ-#7߬j&-fPB~P`Rhokϵ?g=(U7_c}3l $@)WwBH[~pXSRoDDDD]`+V7cAB&rU)xv-w7?%m/_Y\bn !a e$.L]#CUGjz'")-FW @I}lQ9.,`PO/G!8ps8{?ks={_]"'U]B 0umsmքL """"""Ȼ@6ֻXKQ HEMӼPgru~pyeRa nfW'""""""%\C!= 84D +uv Ƚ\޶. ʿK}i[\n"j+9c+/ ];dODDDDDD5?oot %`/pyq6ґ ko]og_$NYg'JQ>;6U`n^ل /Kw`v=DDDDDDT&Go/7]k刪 SF9}MY 3uXڂxnNIāF]y$irm nz*$"""""" iokx`vIHXdDDښcjڛ-tsӗ'@IJ vHyjSd+뷖[~/ ARP4)>\eSu63L]~[:DDDDDDD$P4]zX2#|Q7 bM"} CrSB]%%+zA= jA꾵b>N)W%=VTN[:uo`ޠ[yoNJ%=K."""""" QK;JTW  } SZ2ah@a ~JϜ)Z.챷Mj71PKNs?Q-LM [лHVIzh?;HRaaM.w۳ߞͶ-EAkkKm """""ZЇJ;xksH!"hoĉD 1k;7p5wf'Z^SDDDDDDTKX;.I9p%hi!~ص?3Xcn-M,8lAAz& Ғu9 0HDDDDDDD- MlvhP^qGFḗ- 9XqF~ /ѩ={{%/,ӳP-;~}Oη!`ODDDDDDu%`y9pm`q ?7Hlf\? /~0N5;UjY9(΂);KE:p?Օ@a֒}5Tv$IK&{XjsX򑙑mom􆗷0ЗjZo2`/)/9Z|c %Ҿɀ]RfA#` oMkK@Akw7_ 8:e#b{ m~η6NAk&跷;A}Tz`x[o0pAr+(0sYM`k{Kl`n \ 68mJ)h5Z_  -F_Y}R~w]0(o>G~t$~0:@.dÒ[/I5 c=`}ݮ*fĀ?*'2%$,$eV92#\d`,[ɿ koX/KC1"m-Ek?JX]pOZ:e/m_RÒMȵA]$7J-q%m_ג~g}LDDDDDT(0{`?_o>̩. mCm(eL b @I_,.Cr$쁿= HH D YwK.=WXKR43ЯX%} r&mͺ`5\:ykc܀׾9X/}2*m=r{/EtJN?y vqx0~DVv6wo*n` DDDD.w-Cq[k+=h -U/Z"Am@ek};5RDjx{kgyЖxT.댻?ڀVA MO$ t O<o[SlE"7|,7 r8'Rok f?{gx ڷ/r~W$$&bQ BNNVj")oo/2~'N_]k s/"5- 7O.;]w#9%Ֆg&6?2[?>x/˫Li;wƎЭk8EƯۗZZ6G2+6yEexh)o@si Gw Rvq7>{0 ,iJNdt}@_&).\. Ɗj3٪@>/S\-wYZ/y֤E#^G}{THIME=>άZݘ¶JRBn]U2YYQPu\ :FYYY5꘾eL&"?/u'\1GccѦU2߶uk<ե3DDDDgѠ*z{طUS/5w2\ki&%i}4wW$m;:woջq&#Y.Exz)#=5cz;>x妾Wcxvvu~pT͗Xz:WVWVmkNhՃ#ѡi=7`!k>#؈nqT&e]IDRdָh|*KփEfna"&NG233~6oݪ80L@J`ZzRo֭3OϿ5kFIaؐ!*Yp!<ײ8f "'%֛lU׬[>zGvLFD̏?bi۟<zULa ?^3ݳ6}"_#6nޢ1eupn Ѩye_ec/88!"""!%+W/IUϯ*R;$9Nr-]ck^ng%&r\xw<=Á| sA/{UW3Yy_}; gsO{T`=Uuv8ˀO6ᘶ7n9Qxk_ ^?(*6 ^=)"  D&Mp)ns^ W_jt0BBBp+Ьߺ}k̙3`Hw}|ѡ};}g| """N/ZP<'\ T6\ޮQ.WtE6 .QM\_S \7vuێ${c7ۑ`C\г ZԬ|U.\ֿJT l scT׹w3 }w?e#M;,GU+Y;^ё!6VUj 6XK/1Uɱ^q%X|J:Jh߶ CjˊGae U;{ 4@`@ m:D1ꅄxV-#|^-ۺ;999^#Ǜ'N>/,$dUbdG>X7M Cov ]kGV&h@ e~mo!z]_$!ޝ2N`kmsm8R߫72/BKwoY`Kp|TR(F#Ulڶځ"v^I ~~4XvחVYkI)TIOP]{}a0-7/:;v ǟo0 ^]Ž7O &#Tmͭ?'ĉz~JVՆ>_>bccmMHz?35k{9BګǗ/O󇆅رc}$X؏r5 ^*ۘ]>U MQtgDZ P ^Q.Z(;bg0wEgLo*M~E:eԤVc:`kc[ᳶ}g$84oTw:$$$?sw{Шa#D[,Kl'M 7 [-^mu <yz:|ч ?7'[5 """ɤ'$=HK "%#dZW͒k:ٷIYl\ _U؎g[˲T>tr+oEl?M5g^{郞MvXΌvh='wdut{M}6I5@@uk\pR*,={|*;NU= >D Oݻ=.S:;t؉3%8XrXnUɽ~XZl '<^|a4ُ>M 1) bc*;F- .n[ZYם_{]U}6NmݶT&} ""ZPejzع kqI!jh V}&j `m& dۏR/5iLVܪ kLGAtʱ36S\t[Ym{# 'd;c.I)7/Uuqe1xej_,n4 wª1x~Ǝ?^vI=;`j|ΝټJeyw>6ϼ3ѰAC t]m椊$}A\l9ڶnSvͪҩːϿ`[.xxEIPP dlۆ GT7_]occ S={ (v[ۣUu?gҬ[ow߫fy}ea֛oˆðkk߽[_5J%DѫG27DDDD՗ M'a4컽Vy4ݮ-H!6b?[Wv!E[GH)tNzu`7CN?<<~~TЯ_ڷ 442UfѝRn'v`` ,e> ϜIRWe@=00˿^󇇇k?^JWRRv|wNrH~jdoIڼy C*Y~5k$IE=L'MyĀ=.'d՛>X_M8{@c"WW OÐv}i~NR6`6צ!{.>3^ܹDLQcT🞖E_Cv#9czVV0-fr1X k;cлw 1+jE`t-ZnȎ\u %ЖD,NKΪ+DŽ-I;{ɿ~>}@{R4> >>#W֭{plm66n/tӣ>}0gU@~<\Zꛐτ#iozk۱"OYH9˝LQ 8BV533\g#WӵQ'5rҸżQ% Ya6U;+ ?e]47Mz樦lS> *@kigB!#=ö`~TaЦ0ecb{"?ȼI98/k;ۀgi]1n2 w\|ZW8yf@ mU=[MoMUBWv6];S@iɨ&i'J ,{<}p rsJ*|ƝNQ:okG4& 2s_҆j/_/\ h|^b'Tܗ7?Ƽw0|@s|:B07F" ϓ`~}иqciT=L<xD|[;E?>ETn?t6}m?>^̜lM99Xثw9 u:]u U$7 + wN5Nj0#wQ˵#2Ok.ukLWfƘus_ZHn'IYYY6v˿$\qr@;՟@_42nEj5cb"5L<co<ϩnSa $$CioXsJ wu]_mg5dҥj(GWB/O?y^^}|r/WzϣO>8~8n&L0w&8}n\e F j'z)cm۶ׯ_?HIγֻ|ݻc~9رN8qe˖=xgrJ\pf͚1c~@ddm.=|hsA*qU7xY0D46+06?|M/2m޼y8t萺>tIuU{M6SϽ9c'Ӫ믿}D>~'SM ԩSѾ}jd۽ qV>;w.5x5 08ɰ׻kģWhYr~Ui̙3eu,E@@&Np]wW^9k#$RW 7/o_^UW3^v999l[F`D:O*2 ~䳒M>NHZ //:Wڵk7 G}2HYDɆEOnW%) ? m2,h10_>|8 H.$iZ:D@5MEPPdL{d&V ))aΜ9*}תrR݅R)}DV- &'}AuVMd`?$8ߔG`7EpsM8o~9/ALCZ6E8\ZR6p@uQfݻwyYR=]jT笿8Kڌ.vU_8`ACKvơkg l<118:߸q`#ڵ ~ &f,_m3LqWW^ŖG'RLg[?4Wdq6=eznz6t[ ƍ>Z@h >% P5Hkur=ۏ !SO=ӦM}k /((phǮ Vv!k.AžVLRdD 6 ظqcZ:D@5@#nTgTiRu^=Q;KB jT*?0RzѲeKyGTA%K/T*sR' z\?JVNJ5y߫6Ki,k׮]}1.0=PſjVH5KYÇ;nU}v|СJȅ?I&9;w\uvZ}qvW'm..qm(q;;?ӷ=v!g6t]ӟ1o}MzvX ChSm*OU*D']޽㹔K3IlI5M:]pq+NJl<뭷RE#GTǐr.cZVH>)͛6S "*TX4jH5\4IɧR8N0ċ/ m~7wM-W_U%XUf''_~6Kr@kyH+/ 9˅$&$su.KTߔ4'HSm*YlCfTwZK$%9s-C~eCRe+sO1O2EHlcu4gZ mQàŃ>}=f-+k6}j5 6=akCm6m0h6z^0aa ʹrmo*.S}ɓjhݺu& nfmX=[AQ_ o]WHR-Kz9IЮ:/vIirGjwIqi-xm-5I pHNĤKRRR%I;NUrI'A:$ TXcZ -g-͸S,4L)) jI,N\KTU~K%i(5#8MߏB@u|.2>j0z{orfH a'$JC:asAa]"@ 7=CJT}LJ?;־mudoPn+Ij u@{,R/ !=Ғ$ % )paU|z 33CM;ۤM뭯_J"Px}'[PJP*)JJsbK:8%k.'.9L^'%R5SorA2$K >/CR#_$lOy޻$+B֡?JAz*xr߷rA+yOûC-K.h~ߦgiWZPWOUkRm=KJ;<]Jܛ~ NIHwVy%˔Dib'O%]W[ U &sxz\: T~3Tsd[;G!"Z+#>+{֦M;@BDk{ӧ^/jmZ?9xhC}fkN:*N!R$Slc^s9%gZ2zLJ}N!,|wx|MI$`үXBCH^ra'w\5\E@ީ3UVx ~tUf(MQg\Am/ILInI_H$WIdU\,zjNSuٗ{Z\QYPbM[PW^R&࿺}6;c͸B˸WarT#Wӵ2N4&OrjXU,gIJ)IR"\I0w$cq)vՠAr%ΥL11 +>tIr8qKBu־f- jhrZwiH=Fjs;IZ:4h_YU9V@LUcOPO*5cwIid{9O'9ܾʵ'c b'~9H/zr&U.tP%kC%ri,UIO^]4i*A,CI3}u՚"p$1c Ű$@6nL|11&$iU2>3Omyg͚m9WԄ[V|6ێm .F`D :O.['5ҤCNz*DWɹS2\&}0t!$  O~fϞIo5əC{;yd`ȃ$I@ 2 ﺯo_W7ْf\%RcOz痎^W,Ja[ҧԬ&+(ȇ8d?+\RTiAHYuEJ\IIbO:šһ\HGrc'$,C.P&t''K xb߃ER+rwHZlg}UcI]޳LM}ɅS.BЯ|IO?su--wnq "D!r腈]g_t c'=.X7vݴ%!\&R D뮻NH|=(ӂD}r+%Y.xu]\}el~RҺMVit0%pzqr (nݪJWkj(ɞh5j8W*wf4JK/֪JZn&xMrkM2V_511$JK^+~Β;迣\!2FܕuvR\J|9$?#5^~$AY2[ D¿_-Շom> G1-[~6փ[+uw)`|'%.5:Wr= Ǚ\oԮk2n@gӻ|zόHNN:+ߠ!|'iɸIg=Ki/g+:I`*3g2>![᪯!79lUL}7p=ڴQݲ%N7Wzr}{~,>%$]%9 x Zc6`Uyj"֣7vK:w=zVñcǪ+Q^M Fqc¹nb j(;_0X}_Lкx6lAғ޵D=צ ƷovN݌ۘvא㚡h.H[}>f`[ql_r[i$~Rk;5֘1jznz66}m9!KZc胨ɝ;pvgq U ϭ)XdxK`k_ῂ`YoLjY$ȲdG]oV^ne؇Rn 0[Ѡe /Gu0Zz۩ | o kmcڡ]z$$18^7WMף`v*1PIqˊTW(R%]ڭ[,տRT{r[25[7=t#|l"ao^~β Ca6jD&u.9c@yn)߀ Cj0nW{ :}Y[ jEcǎs:v2CIv`ik㑕v\jE?`|+:s; غ=B~nL% v,BLm@eiOl٢0;wFD}~|V&i;' "6=ETmz/mt[xmz̹wnɼajUfBþXi"qo [ʝ^ 0I`7XQ;hgڦ/ 0xtML 0h%6YUֿ-hnAN?6@D57 WS %bN2i,w(Y܏׼f͆b{ؾ}߆?ԯ>n9:OVXV>+ <.BpS`)( @Ձk:5wgmTRV? r cvc\I4훃1o#UoB10xU?z1"&_@#//;ꬼt`*x :ވnCp؟8v7$%AZVmΈj5D^>Ad|y,%S{3E~$Jp^$n9&W#Re-`oƊg‘߷\k)?z q[-4M i(y"""p8+Sf6`p`b0Z6.Dmnd Z0j9;ΌC@PcI8|qh,svJFHI8_]梞_qǙ 険iz.r?OoQ$q\6$/ OT ~iGi)h=*S}OoÑLTKx=@QXFn44o޲BBcN#y8x{>3Ztw mS}FD!׹PC-)zkDXd}t3hǜĩm@9v #޻kNNЦЦz;ݶ!Nt?oGM_s;*5ПA05:&,(1jϷitG-oÚW"#]}êm3&%m/T.`ῂ0dij0Qmo6Qnꖬ3^X36CTaԸ@Oz@?Nn5d?Q&d """"""ڏ)>"""""""& """""""b """""""& """""""b """"""b """""""&.me Tc9;j$ """"""b """""""& """"""":K Gp7n@DDDDDD1@DDDDDDDLDDDDDDD1@DDDDDDDLDDDDDDDLDDDDDDD1@DDDDDDDLDDDDDDD1@DDDDDDTGyWB_7&Y=2""<͚6嗎A޽`#[iZg~~>8:v'IDDTɵFW+Ĥ3HIIA_#GmxDDtUZ < ??_l_<܋x!.>O'""s_~ƾNE7w=p֭"q'+WT۟x4{322q-M֘<j{3Ç#LF ݵW{}b֭jǟ6!^_;뫖/a kTaIIOjX{#""J;ڥq,;|,-`p`4 $$1ooo\:"F,f1kY7M Ƙ.ĝ݂P:hq."5߫V9oy@+׬K]#-|?pKy{^؋q0vh2.`. ,öV<ÇABb}vهA#QCX^^ҿWb#0l`WW{ ""Ļ*n0T vzl/aҞ3Lom㏪ǃ=+Y4p޻4iGxvƔ&aX56}_~J6GQ ԩc{ư!{ڽn; H{a4zqYY֒v[N&RO.[? ПGQ-T&^Cd k~4611xdH7))ݻvuBi=UZ $yMիm\|:Ji'n_qf߸ ͛6Ann8Ƈ8摞oߛv"ozW^vv3""<'OT4jP_MlFjE j$ lm숈(""E8r*bCxչClj^x5tiSf=Ln?|""*V 5kg>Lþ{_xd`Xb|>kN}HOwK~DP`P^[(?3 n(D&{o^=8"B=fDDDSI#Ç!-- 9Rv)Ǵ yϽVG.V RV/({ ""#GWd{Js^xR-sm~.Su둑Ç1'""""""&j!0r~DDDDDD@mtiع [EjCK~DDDDDDTT>!<DDDDDDD1@DDDDDDDLDDDDDDD1@DDDDDDDL1@DDDDDDDLDDDDDDD1@DDDDDDDϻ X,HHCJwQ]! %{E:SDz RDDET;"M HUzKH NfwlB=ܙo;wfJpp0%J!GK|||7xxxĩA׸qܻwOOYX$'I#3fsm$h?s<ƍkBHb%$Yd,B!$c9rxzzILTڮ_.!/_fa 3gNJDq.H\죣V2%0vHwu]}pԩÒ;wnٻwn\F(~rx睷2e:|=zʕ+qg:#SBH8~,XP}ߗgɿ+ڵExZ<$T۝֭ȐGd7c$g&N˴%K.?t{̟5]|Ҥռ 6\V(͛6{͚ueO>#I$OܪnE ;n6kR@Ծdʘ1X)_#嗕NW$/EsL:\lرSk:tTRY)…ozT|}36m'\2~QlY0ʝ;w؉JU^kP|3dfML .7H-fæMrUXԨVU(\t)u:OU' w nEx ~{Jkӆҍ7{|;a9zLz&%PCٺ}=gҲ㓧O~~ G Ş>>vˣtMsłÙ'ߵ{Ѹ@~HBwNxٳg5Dȿ2@H$k% ww$M4h!He$gw|f%J={c 44|#CV2@}0h1"_V-}?@̔)R8C/*e?#3gΔ)SJ֬YUVJi--W8ϟpN˰aän:vr8BpPJYyU>ok!?L_'ӳgOYtԮ][ɣeiYG)5R *8p+"׮]%GqW:+SBk]l6@W/2eJ}ߪW_ رcOh#A{ '4tƯ5_)I~cuͲ}Ni 4 J)=crM18s\rEhL%Mj>!}XaSyVU!U 4zV\~+_<㋖,6_V/a۾gr!Y)O>ɓ8 ; ΰ'tɈaCe7Ɍ9Q}Q;mɒeKpa2Ha~,1pH [ +WidΜY6mY\Wdj@c0,|GwLyo>[͛7#T@Cqݓ͛i'1_K˖-%[kcƝ޽,]'Oa :P0JJϣ cLgə3qEaE@B Ů]*c/ɓ:raɛ7?:WfժߴQCU}GA]z[Pbi2eʔ7dl m}'uorz!5kH~Uee8|}ןRx u.;?2%e˨A8?S*}яjwQLYƺ"8}<І0FxK=kgQ^tY;-1[Fu7E߱kUu`PRKվ͓GY^=u*X<<<$} t8vܹ{W:oٻOΪ>}o_Vp,]T8Vp]o+aRPVaF+7(Z@#"Z Li0=(35UjUG_NF:jKd=>q`Ϫ얀zW.5Kgu"H̘!T}Nms9Oq5Bɒ孎@Z`a;D<ؾSzn;ӂ{tѬ;< Aea@d݆M2gI2m3TS jIZl!lӎ,3I>|Coө.ۙs:~I~5]4l$ڼ:Dž?r}l <=w^7j8@D@ {:v(Çskq+]tyh[ɝ;2›F3ߧO!P&`09Se4v`~H9s~U3͛7m۶0adʔlFgewc0ڬ ^pt UEw+GZ{(^L{~s(1,!l3oD]BGX'.!vx1 #l7A,y2e ʨ6~ez(2Xߧ9עz5][n۶M#T9my!lʖSobV-KɉlҥҼ$ԙ3%2x1IdÔ)r9Blܼ%c;o _~-R͚8]\lp-\$)Ur+qIS7Z=mJJ::k 4iR˒?j]Cɐ {ȰJ3VΘ-eջΜ)W??FMWV{&ٷ6q 8pSk$> `ٲeu5ż{pxǨ^>}pBʠ&u Rre8958Vv-m,#31ؼ< thuS<[F)ڊX1P H7~;.mرزe3c 0`4:0g)<:Q"Gz8tz)ׯrY9s\'!wDVK:w]eM`B#Z \<EC1k;ɓ[u !wPRJEfHHp /1:9s2ǔ?tG5WL˔D۽ѵccmRn"QuTT"`V֊9hb$I!g=R?_>=sehg:mK)h=6Q\?O\i7{<=[bpUTIP!jU%mZ^U}?:y0W{gGx#', `}w<MT(G0V}њJoLubRI/E]/yܽGn(#]$ѻWmb产j1y6m;vJUٲIu$`?p@ǽpկ[GG&7oiGQN,u'lq%Iiy߾OmDr䩪;IKƯhKD˖5ܫSz]ɗ'RC߸YG{a,^| =KG##`+ո1qXW_}R={NFBZc[o%gxyy-yaAMgfo=B-ϴ|ftwN6c(` Z?3wؖOuX8B@:|qq իK?h'B7~HFQ0R_hza8zxp {uYZSPA=y˖QyX_21b_/+98,駟I<V>?4;u$|0P{O:tW7Þ\wʔhlTri6-4j1W8AP)pnFs@?ۥ7~z+CDXeJ)\289{\GGB\tŽrȮw4}(AgLU4/(asmz{XOuk3f{E* j/w8}ǺL gNk}3~X^tW.A.]Jްa#@`:>̠ k}TlF|['OƵe \Z5+ Q# JZ(\X \RJFbZ%nY+bM1GL7;qv;ڢ ]g㗜ieΖ۠^]=҄U/[C ,h?Bjf`MH"nM_'ʠm5xjl ۨS3L u|+ % B Lf˚U? lv@}yoD ظp SdztT{$ [FTA1h21g^&x NId*_og P ">Fvޞ̕}g~&Mu:9G=߈^@Ų0`6[a=vLŶga7ts mp.dٳ DhTA,m,ʈ=M;WNpZa,hKWuqA{Q}]Jlpɒ%~s5 ӧkCP+V d\ ͚5ݻ[weqyW!a`7(P߶F?&{OzDsJ>0"zVVaaA9Zs[dIuX9 `81 ![m+[;rF»xo޺UHއQ5 /{AaeBe*9 VqϙwGo$zԳ~y 'O_By9$',j#eĹoa)gȕu_T%6g̞0zŔa.XSgʑcb,A* Q,@Tˠau ^bc܏i8ulؼEoX i觯֯'d|ԧ53grrR+2c<Q }dc˩2pKYL7uXz#xxa$7PS5X#rq5jh!Cעݷ켭g:f|/P1?~[oߡ;FzX{O6M.]fh!~5۩90TMP,L~cKĞ=3!i2 Lm 9}38 ,b1Wu80l).0y?tI/>!GQ̚5[z'|#FN:WZM+({8?@>}xa\v0iiezj,Ç2ScƌP>HFQml+4NJɓ31o޽bG7qW:)! 5LbN:hD]AV؝#7n[p"7ߌx[LdVm1ҁpZ(ؽwiE3UJM،Zt/goڲUZN5U_f "[@̻~o.ܽKl("Ji5҇8ʖljTC[`a/z#w`7ojzu-  ^d+oGGv; 8>ts(~;0J(%lz_ӫ>rO5S:~[tWGITTQ%`Ы{W`5ZO@E5bN.n튝iϒe?mÆ6lڱgKlkXhg ?"Jߝ3}$Wy1JڵwH`G+Y񋶴9s_)"IM"t(%.Y=.H[/A֬1c;B#}?vz} {fނ`"G?Aq饕GK ƒ肭0iXH#YY9s VlFG|^Hp|SH)_|ޙ᭷:T;5)`cZEd!;Z k#@cv|A2lcZV1% Wu)YYGM~mz,dJe S8ƥtzLHB~ڵ 'O ~uľ"]ЮukNҌ^^z HkoH %gl.ۑ/ nr0a>/PS{ߪUK-.n8H\>wu!B\X![O)ҨAЍU{K%I*QB#А8B hG ۸e @MpOqeG.N!BC|>6$ 1B!B^,Hup9!B!N"/-B!BD{b'#B3!!qrw ;$IDHɓ 'Nx$h?G\$2dIY2BH<$00Hn޼.\ҤI+O J$5IhS'MРDbm@ Ubnʁ{B$MLrȩ 83 ٿ?ea? e_ߌ .oH\=qb !B!IDB!B!tB!B!B!B!@!B!:!B!B!B!B B!BB!BB!BB!B!tB!B!B!B!@!B!:!B!B!B!B\ cǎȥK%0S$MLr) D Bu B!x3G@[UI*SIױ[Yhq<nAq'n;Io0҈y{{ +_,Y<19sȟ|БRHaI4tyHڴieϋ+^ʊ`-W%oܐI')Te䥗XZB▮aЮu+yag:uF}?^r)իVЩ[P `Qyg;f[T(WFϚ-/\\9scKdɤLgp#GJZ"}_Ie濃CB%88䥭uvdH2rk9Y˖BH5 z'ϦT(_VU,Nu B`]!Sƌ=[6f8;xHJ,!e˔ݻ//]K_n̚;_^.ٲf}{ko>@#FKc[2JɈaCtsdKj֨&۵aQ_>>|;^ҤN%w?)3f>/RDpv*,2?stScun&}ݶ;%O\J))#k<}*?.\$;vǁ@*=tgT[gپs< Kn]$k,aѡhTo,Qi.F~7!ZW3_JFR@~9SHozY2gw{ViΫoܼE,E=zQCiޤ>7{ٺms$Cҡm ~6+r2ZAFg(]Bܫk#ɪt{ "-LJÆԩ u -!a&>xԯ[WJ,)c ߗԩS4iR+?^t.}zL2w?LsɨO>|4Tre@q<;E2ou_~-R͚8nGWREQ]F,{퓏v˻2EQ#Gp,y3gh唉J^o2%#k&O;+=vL= M:s>}FCUNidKd2c!!!rM8|43H:.:O;PuF[X"qxMwzIu+SF+!?oP @}ٵmJ*9t<+*T&SzkKHBAU-UhI<~T3CtHj4`!#;r9'{"3<6qFߌC4X̙C:oG݂u BHbӣ Z{}#nFp-[BayLJ*%<K>߿|2b*s\R z%N4x]ZJ|*=k{QY-^  J>?Gy7wDWxGɮ={*UծGtY:wh´zGȁB :Ծw~aYzkgܽ{OL:CO^u bS6EpA9x`8#ah$_~]%rVș2͠kpJ+kdMڃ4WmOd<ϞU+KLzgӔU+y'Os%mATϚg#θ_>vɞ-ZWf=Y9ņ!p_װm-׬^G}РGVRbpu -!tXRLiݐaܢ ;i''(ے2e a Ϡ9u9v3$Ս/]g5XA?1kyѝˌsChljz!۷HR8aa̩tuy̙@{W4~:)3fꕁ$$$Tܩ\rMR=*M4VXY9Ŕ!"t߁moޒŊE{CkF{%NnA݂!$~:X:Yt p-qAMa[UeÜe'X0TXQϗ޻LU=9X8gnT3ڷm-U-Xhl^wYf=Cel_HϾ}ĩSҿ;j <;+!lĄa,^ &'Q>| ="kF8-AƯ[PnAi<ιuC*U*Yd//С]WȮ]W_g9q>abB! -[BHp"Yfcǎ#gWGךּ7;K$B u B w|r9xp:uB3gΦ%BA!@ʔ)%={H{{B!P B܏ B!BH#E@!B!@!B!:!B!B!B!B B!BB!BB!B!tB!B!B!B!B!B!@!B!:!B!B!B!Bb/ v0L]޽+!B!$a^^#ÃppTTU%KFB!B$?#Gɍ7$SL//S>GR B!ID`Bo:x9AhhRB!ap3/5!!!!B!y!pB!B!%v B!B^ B!B^0B!BȋB!BK#bFB!BHDL"gϞpF3fǮd۶r1s>6)RTV")R7Ȧ[ԙDr%l.E UKWM(?.Z,۶;w" Kvm$Krٮ 2XJ, *JM^fzٸi<}Fױk}|'v뼣:?eǮr$Pi*ujՒF %vN>-MB![?ج+WJǎb߿,[\|([o7UZxCBU;yw |p)?gRqAwCG$8$DN9#@,]$Ma=Tu/)/EcwK:nRFuTdcN#{6=}?kaL{m$Gޢ]WmJ&e"ddcIڑ /Uו{KNHB=z2ٕnWbrT-BBQȑF8[}ֳ8(*W,UVCɚ5k= ҃P%Jp{ ;vLp`d¸1:uj|ʰK+988w2e0̞69flv-_\yb"9goGcDQ]y7n*ԇ`,m=}DR$OGO>}[>'AӆΘos+yFl4ʗ--MAΟ\9scMwRrwɯxCk jQz'K*+-ņ<-ni8:l"Ӥ=O3hF3m$?qB|3dr#!sLRXQɜ9SILsr]ޥ.oW믳HJMQmS`jTC;.+Y YB!$a1 tR'iZʕ+Zʦ.t2ɛ7oK˛͛3Q;wK=֫[ɚ%>߶sWx`5o\tYϜ&]zp JsdKj֨&۵ xE:,qc)/yL6Ckn+eJRiݱ|>b,?4YZB6oݦ# d(ޑ׭!Ydr ɝ+>|#}jI@GZ\~C 'wN: jTl3򉊃Ҙut<8l{tQ)e"ds^RB9βBuJ?AȀ+hFӢy3YqܾsGJ,_~]%{h׺4|6a-xr>!k y]]{쩓7eي_eʄjݲlb_wt;ʄSU8O '6l9ӧ)$hgQ]nn !B,ٲeIYcm1`cIe&M-Ve 6hPu@`PlZ2ul9}|BfLA>Uԙ3Wnw a)R$I~ג*Uji,l, }8 F W",2ÁQJ#wnK^=iΘ%|ƇY}?AK59#6܇dΘIgjE|wT>R˒?*C|0xU* YMWewMdTۿ_|3~yr^<_2R0UWFn QKڵKz~s˖. o#aʨ-]2,'\ >Orp]6@lV"@qg57.1gDL^v%MOX7`=(o}{̑á3#튣o{|5sI$~  zfr Rf [P^cDGxx$22ƻΑ=3VeܗoU@]^;lHĉ@|qB!/;V rxMV-K#?:UlpQoɒaI0o.k׮^`*v𿩕 3ؽ 7ף>ӊٵRJ2F׭u{+~1 awF 62SLlTJJj2~RL!W*XP+н' ֖mhђx9"Fl-G;FXL;Rޤk~&o,sO4ʐz0@J/P1k7߻/Omͫ}ԨZE|*+g cNoI:Jѕ>}:jT([V~]J_CGa?pP9z\*U`ahԪYC՗RfM `-y.;*0g3H7_l94yT)S{am g%.^Irmt$e3gtP6Ry:$I12 cTڕȾz-LGbF[jԐ'k|._O1s1@-k=e~9vl7uٻO_TLaC/x6p /BIS|$]  ݼy3?1&@mI,k._9 btcC-]v]B+JQ͒9˳\6>4Z%ؕ^W"Pe02k\{A3GvuX1H%mMa#ZUdϖMr횖- /C!"} ղlgz԰U'o80 ǎVeoߑ׮Dr ʨs0ęQM[ϧ$xh|,|-^*]H5p5>s #2QXO3 Bs`}!k'ac'I2e:ҥKN7,Syw8L;oԨٳGGΘAb=vhբ,ZLVdsEDυv9߶̝:s窲(骛ca1Fdc\_By㯿铧ҥsG3e,I e ˛7\zļF|<3:.֣dl,3nuvzkM#nߎ92=aB8?gM&|9fؽ[5iru{hӲNW%I21]w|mK`@DE:#X-3gϕ^Da:zn3^tEu B~sQص؎(7KKNWf֭hD8@ѢEuehF*_>2Tn)7F;b)gұ`bz.xRy-cԙWU 1è*iEz[=]itXo_1yYJiؠAkOYhzmdIF ,feusYal횯Ȍ9̲VYBnݾm3p2C-%sARz0|'N(Q [ʦ H zŪyƈ+޹az#Lr)\?7W]3gd|읳LoTeEp;$6eg>=&s&_y\1U~꯳j::~G#T_gtuƨ37 ]y9,jiV`m;v8l8Q^_Of͝ByB!pŦA*UXs6ի\Ҽ-MժUe(?@ZA)\5}z?.#?'OHBQꕟ]W2oB9j^ 7V6 קTFCR=Kԩ QC/4:R2<ϿG s%?TbĿ깺eK/?iV9g|6+%JVy&:_H$e|0#-+ƶPV(~Cze;t=.%-5![pn\C= C0$ڶn)GyHhq{!&-,Yӏz2vrXe麎a5eXߏ"J^X(,y2o{s΍=iTec2e$Ct뭵1#mRvhIh}R+!pa7:Y/ozetůr"fN,ɓێ|"{uc?Y+Բdj]At`WZ}?߅=a~aJ@}p\qCPU!2'8qҥi @mٲ,\0\CzWKe7]kxcld,pa)P)SQ=(=#oFTn=OFP̃E8/BS eǐ4i2appHpFXX 5o73-[v2'O߉⃸}V4i|ILQD8~ҥpi%q$#`Dx`!D_v?BDc=hq˼g͚M8E0ʕ`K+w2!B9#,zgW--K/o2:Il(} z޽.fͪ#s,뻣Yp|}m/ލl]@fiӦk xd;cS]le$I7ttK y ~N>O!s )ZSמEa۶r1EU/V#f2q+(o֭[)vF˕-#^^zJHgkB\Sv %glgB!;4hP_2tĪP=9oCQz `XiR z$J)4DgB!:^ޑ͵Wp+S_\{B%WΜ2f(BDZz(l !Bx`ujwrJy)Ahk(B!:&L!B!B!Bx  B!B@'A!BIЄkR#W\ 2IҤ!B!$A$7o^_/'2dTM9p`/#B!$X&M&9r___ #w !B!N"B!BB!B!tB!B!B!B!@!B!:!B!B!B!B B!BB!BB!BB!B!tB!B!B!B!@!B!:!B!:^^!B!ٳg!B!B!B!tB!B!B!B!@!B!:!B!B!B!B B!BB!BB!BB!B!tB!B!B!B!@!B!:!B!B!B!B B!BB!BB!BB!B!tB!B!B!B!{O*WldJJϋ\~/cOرcիq>/oߖFi*UJ?~'W900P&M$իWiJLe˖rp׍?^ʗ//3fVZC)QmϼtݻWMf$|51I@@r1Xr99zlݺUmqƕ'88X>9u63g,˖-W_}U_~_._,y֭+nrK=zn˷صk&a|~w/7ؗ!݄8Wl#W'OgϊܻwOBBB9OOO 2hPB#g}&Cf͚IĉeذaҦMTkD4h_`$… ,8F1#G8UgJZRL)6l… WXݢE _Ò/_>=zΝ[8 SNϑ#GeN.'uf' ƥ>eH7!NaanܸaRʩiԨQ&:õ+V0HGm*^i۷"k||``iyҦMkzWM'N]9&???s5).\h*R)iҤ&Ǝk>wkTdISMeʔ1)mi׮]k:ҧOoʕ+k׮x-s玩cǎ3ef4hɓ'kf?e迭wMdrp^[DOoǎJ(_Nә3g>0̙S?@ŋM65;\MfUV+eGU)>'O!3|O`XVt}3ed6)#4fsuPwAhj߾8_^=S4it0a{&lcm۶5=zȦ׸qcÇc7wɓ'BCC#3u>_JFzg i4lPg\{=]/<m 3f+L L5k4]~ݦ om?uk;;릫mǏM بQ#R̝z?oPB\PW9bz뭷t{9sfԩS|}dykݞ]G;{nfFG۷ox -o\ӫW/Sd7a w3*߻3wTOl6Qƍ$՝3;ʻ+~L˙~ӕo~Ы"Ks\ۄ$bdZzO?50ׯ_?t(ihpqlݺuz(ӧnO߿J*F\nLJ wyG7 HkT: 4 g6ݽ{W߷k׮p l=#ע鮴X.0+VcǎqgP۴ir9L52dna{,FL3k<2G晌$IePȘDTH}5tSJ$.E*t HI)E%xn۶mRfYc aČ3s?b5~sKŠNYfɵczKC1|pc2ýyE'g`pѱ!/0`o\]1h Icv~p ưaD8kN|t9Cǽl2cΝ1ݍ/ek=[y ;wc&MMoB2ex)yI5tr?w-'(x_4sZbHc!gZYjY.]$yVږ[2qWvDL6l`lڴIh `G;|3&^w pK|7@hTti1ăv^5`M?D:K)د8#{O5Šވwd2'Fޚ6m*q-nA7|SD&fr-E݌L\ӢFm+HZŠ3nTt뀹>%Q ^[<"ٛXꫯԨQĎ 8rHas{u]A nܸQa YYd\é_X ^?]+&cڦڶ)~2SooWM;p*2[fv)n^ }V<Y߃Da}jPְPA^:r7u<FmB p\o!DU\YW*_ !&DN>],&&|O 2̙^u~zi(! Ɉ>| &!q>$RWOÉuZ&%ޢE .]wyGNe;v(EhfV($t .?Tݺukر29gϦ/2h>u|Q%_ mwc`Dlذ!] CZx6 㧜ADf`_bEG0 cPF?m)Ht)n~m+DÎdITW*yW vT3gJe@Gǵ:5>N <*`` tDOUNJID۶mG}F)'$3,fg=FG(~c6믉x&㰌k]m2Ǵn%xs >&N#йbpy ?,^XqE޽du\ՙ$~7]VPn[u끎N),@cMg3m 0m׮*X P%28#r,ab/ڷk&|)S^"~}Zڵk]n]m߲՟jժ`Dԍ I3ݸy ^鷾KMD3K5'ۯU $P baJ!18Hb%kŊ K%Kݻj!PB|į\rm|A5+hqDCQw;Dad1 EQ0;a}a`_|! 0Ƀ9*:X׊xVܑd 0@5h@>A~(6t8 C=Gp 8P&馺v,0AƠ?:PF'׊ 3([|>\d:†4Ɩ:1cƜjo /:K=pϭ{ 1@[*mm&c 5|3Pvz!N915}Q9a酁ѣհadU |rvZuj 2Tf/rm߲- V{ `nO oh@Y $-~ױDimS1!Ö%s[Ϲ=^:Y J~o}Hv&tn+~ڰ)\zuBL8Q͚5 h4Le 1^zI*T^T駟V?e &O,VHG w:/(06m>=V>رyƎvt㩓?`H͛3}0C|yXM+]vDgnwkbjX08իbb/\2m]cUc0o逼$ @[p-_tʣz[ys ܄0UVm۶Ɋ%}I/a?8R f1m„ 3fO4@[ m5&&=ϗ/z*1&s-^>h!샠AfqgCh ,!EDw/c^ΎB4IZ/}+Eɲ@XwPkž(6BRiӦe16BɊ`[ Vx/IS' !8`Y02&$3M|p^.!pml_Af"lI!Ke`7vHp$oByZyvڶLB#T=ɪ}kv3BG` Cɷy.s20B!BIvA8 'O2 !B!d,YR_uBB!B!$Qs,zO>L2jϞ=jʔ)L !B!`@"EMʽ |Ϟ=E~qȑ#3~ !B!$ J*%߿LL !B!`@ʕ{ӦM*02&B!BH5jPyQ;wT $޽`1ۻwڽ{Yzu !B! @ZZ[OU@ջwoպukuW|fɒ%]^=7o^ !B! hԨʙ3 Mm&rR7>-=zh,[ 9rxͷNi0#?N0j9JtZYJi<Z3"ߓ]B!))(^+;C~z >7N})?ܹsʹ -~JZv3sˊi˺y옯BQ*wX]wu_U;vPf~ ?S9tgӧjՒtT1z8;v4)"z]w7ۧfA)AC7[b}~׶m[_~ҥ1p@_k -ԭ[7~믵.V;TVt'n֬O?xyxM7 HƉ'M6~|>k]tQ?+  K?J\:iksjOtgq=XBޘD<F{y'B"*lwm^xYX*\|Ç~AElo wnWfO2eʨӧOǼW„# 84h 7o/L,5YF9rD;NY0AT?\r%1޲eX.]t=ժUKxErD߾}/qv"|)-͂an:A‡r{׫s窫J͙3GuQ“rvK5^ʙ׺THUR%#2ҮkjӦz{ORJ '?a~Qa2@_|Z`ӧ?8cҥybĈB!Lfc6h u饗 e˖iӦgyF>k˗/g,ssk6wٳr>1l)ȷ ?"0آE dɒtG,:%A"㇁4JNɣ?.DTɰ@0b믫$fԩ<^ /Y4u"h~xMC|"@̛7Or-I)h5^ʙd#)<ҥ*p͞=; $1^;AcF1{-Sm۶U~駟t Zj-ZVX!aØ##B!$[ LӮ];5dաCC-se˖{xfС"`j X90WT^]_~e/V;ԩI`.HOGZ%[Aq_5d\,*W,׭[@ 8~GjȑS@7^,h:4?C[I\ İʡS RֽO9өK`޽bi޺:n[bRwQpZ~Ÿ7o^NԤ٭#Ou꣎{a ^˘Nud>вeKpBxK킣$B!YB`/_>U~}վ}{`?|pw!LZZZJ&0tIp!V0`ٷo*Y޽߿BU?7ߨ~M `#Xn-~^V򋬶`fRhQջwoy+0^|27yweOZ9 6p3^۹ Tni4MjʮA &Θ NJ#&n9 Rhu?qRt&b7& P 4=06%J.P>}/-ani^}2~/3VlE3fjݺ\kԨofTFky B٘)S Z `'^f͚UD 6t~\` |c"=PiPVXn[&O,mt+=/hbT=1OhI+'0|饗Dk釽TL⏕yh?` F<î]J&lT˖-矯.b￧|A["Gސ=Zܹ3HhnIsԩSjĈꪫR ߮mۖ] ͸q֭[Nʕ+!L M>[B+R=S~ 'D %K<Q_snZ,ZHI}vCRo fСjȐ!lb㏫Ν;g2!8UհÕ4OY>zd|e'm?̙3e {=dP0[,@:?zMLap|2!Y_}~aa͕uI`[I|܃~[7|nk-Z.]h}ذaꦛn۷oW]ty Hz`LMv7+coR)S] ;\HDc뉊KVWBHaĂ 'xx'N>q/~7Wn݌ 0.R믿yAgϞFɒ%eJ8}vnFʕ%/ZliDZaF9r\}ٵkj.=cǎ2o۷S}G{t" iomVڶmk/ݵ.]tmObk.^M@]wu|{^X}k-⥹:é/~-K갗~-r൭vώŒKv1VCycNmuwqӍ5#@BHF֬Y#Mj&LPn#tn{աm bU^iٳkX5կ"KG_UNB @BH"k5f?FOGP ;c{D,wTNSXtL/9Vq2قDc[Dd"jv[-|>‚}$XoHcʿu6m$o_ESux衇;k,[J ʺIda4iD][h[v & W覓}w)q52FR߷m&nرC{イMm/hW歝CYw"y,nI2` ۻּL0o:+ͽI>N'_}_7:Fv%^үS;@\E{CycNa #~t# ?3 $Vvk6f͚wZIO4X-mӦMt{'+J=VIa| "5Yɦ$ݨYH Ye N)RDl6~j:RgN ݝ$؉OժU'`X;hCs9;0ح[7Yŀd8Zd4o\A믗8EzģFmaOd"ݺTêO(+f9jIʞTvEEM&tr{fV/\rbxU煟h}ߊNy-^˚NϏx}Q7uM|p cvKrF[ 5Nbvk8)wNc~ftH Fp$9;je;NDžid޼yb4b#9F `<>D:9> 5~s X#`8tr؍m߾]A8`>tz:t GFz+r w #n$@q 6̈L@O}d8OdrߵktHjժL+W<'L3'r2h?" Ɛz%}4BL5jHY6/55Fn;[])nn 8o PXRoOҦf͚rp`QDExP޿+0駟JM'{]v{dB‹͈n}0$ |0 hdKQb󓷱.^:E~o[+:ۯn7H[m/VVָ8ks SдwqiB%p3<#PXmudY<|tG.0nu,_o:/v`o{BU$yX7nd5eh{ͷT$(f_Or$kB;a ,Lg7ABVHTm68m4&T@7--M5Y3wewRLFX8 x/_>;Y`d5XžT#P8 9N}dj=sa9 kBHha'z2%0~,L !Y l9s NR&L`}FX!+)i?/dLGeVd4!(8 o١/aLrҊB;5p'شiSmeM!B! `e{vnݻի3 !B!d`eO>Ix,Y"t !B!B@@5jr̩;}gPC?W\q=B!B!DF0Zp2~TC 'ԤIԡCDмys!B!IΰT2eլYٳgC $+WN5mڔ9G!B!d wܪG?SǏvرc^+u&~B!B!$j]vU Vp:_vءL"nMB!B!$; +X*qJ/D7+Ν; 0!B!L TzR^{ߪ_|QM8Q-]TmݺU8p@߸I?CQSN9r*};p$נn:uф8F?\'OVW\quXlY(閝^қB!BG5iD]vejɒ%oQv풏k"Sk N'dɒk?3fZxGJ>@qzjȐ!LjرcnUb7!B!$T`ryvکnAj˖-j޽2YX/R*QRYJKK xJ,Igsϩ֭[3X !B!f4n6$I?Gƞ={W_}%:wlV(:tHE&貒 -~è1̇UD_wd*&@6m"t9iF(cQF ޳g|WZUUcG^xa`1(d4fJ{]0pd ڻnBÕ0T'm~TXQ#FPgVV3geVZ ؏(bcسVDz%o{asԩS)S/,vO?TO=^+YiB!B %.P H>P3e_p!xGՆ d%Fp+u¨ &0JwN-pt" a> ahUuu|7_V6l׿ӧwjD5=l⥛ѿ2F0F~o0sLa<A<+W-m$k׮8ίlٲy[zAW\(M& BB!yə]#nNoM=t]&[^0a~z>c u}d [l7:5&j*T}XyAƍUҥ޵eg޼y6&PGB0nvZ ^{MV[G54vDM6QF… ˄[,8˗O4.5p@*5 4q'B!dnrKrhA^ B!BɴdB!B!B!B!B!B!dr3 OZZ B!BHVB!BB!BB!B!B!B!B!B!P@!B! !B!B!B!B( B!B( B!BB!BB!B!B!B!B!B! 0#fIENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-3DLUT-settings-thumb.png0000644000076500000000000003140513242301265027314 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<2IDATx}ygv߯s{%E&{vmFb$v p0G$8Al 1 $m'uб:VZ&3{gzzC"dSjMu|U~߻lۆ7፽A0777|ӻdկ~A^ַ0|#ƀ GرcLA;оK&VG諎Muzq{,5M-T?`޸'Thm7eX,_ _8o$):ePHR>h jH{,ˢW[!蚍fhm y0PTזV؃_Huz-:|=\:'B[O-'t,D)>uF/huF":N>U޸x@؅ǐ;_3,{ic#v6y*f6JwNLQ,P)W1>>%XņM#@F`X k<nâE8lTM U h[ l`PP=(}Dq FxkD"MׂofD.M go t:}t]75mJ6?P@wV< P a]i9J*+-ʽ.؎٭u[tMƟ]wGZSneIF&Dz'}VÆt\:4_OONM"6)>l7PkiM`H$[X\\ArèÄC+oe" pMl*MF0,Z_pۊ@4o4>06CX `q~ D*hƇb`,p((DkBGDba$;鬞mj O"=h.ͭ9,ԛݏx$އժjڨXMئ䩸ѢiwĤ#aV$Ye/M!ٺb&ldX*b^nLs;Ѳ?!_ۨkðT0LFiM×8x +#F5` y!,[EKMQOc." ڼS/:`&F^a>M7c֒LwD|g$ZyIDrs5KD# 񠃈_M3ĉj >MBQ~#|mMhꍾX!7~],ش(] ? y9[ø8^…|Q*?Sl^nJ&N`ޱz- a!lyԇ&@A|Z)?6-Zn5iEC/NaHo^Xˇr882ꆅ-dԏgx4G@bWx ?z~GR8}x]|/ sǑV2A2 ň{$p< T Ңu"f5= ";6٣: r(j6 (~to#@up޿/f10ãR (@4/ӀFR f??J>ܡϣ:CaC.$ d"&sLJq}}#1R;86DaıT41"7^_~a8q zjXV x4Zx ;EMDh ]!E_^+AЬ [B(5!y$>dA,mt~Oo/%|h0w}aE܃=crT7veD{0kxӴϣ:qwX  \!@BHq py !La&D׷):+%5u>1N_Z._§#@ۘOL4]y[{i#$CouoSrR-GHLSe~ٯe*el 8}IxCS~\ UhF⊘$$("qb_GHI7M|bjFt7dMDt9Htي"WS,9 \ojB,AoZ}ۑk\ݡ+w?e8{%U,W^bс:¹A,n TKr@uԚޯ-e|,,8z7uϓN :>/ rbަ(YH ;{W]\BeOH>(M:Azjo{na=Vvs6w͞#08,0wvr}._a>.~;J0mu<{%o›$BkVmᨑo{i|`c1ᾼpHΖ·&Wh}[hgAWĂsA|V>Koe! MḪz˂ChN&!yAՀ]&R&,+|77l> j ?D xfלbp<"r̓u2,.btDV)\%/VWlH:0LlWY`~{Y =>3qYBW Wh'o/osyDEbϏD,Fzw?[sǒh0MXTRZ8ᘘc`F[ez9#n*7{ЪѳX1ů1׏ 눆;x`а =_ij;g/~j~N{Vs_"=]y%+krBOSa})XnYr1H f4PDT:F#C D9z\~&2mt2 FD_Z +}l/tJM?L<|)ӴTNWYIXE q/_ƾ\ pa r%Ϋs/7SCnw?+˜ OMtٵ .XPFWl%frov@d],Jo$LBLIXZW7>ZX^V6qnn ~?W!D*ZzSh^.#X@ǵ2~w}9`>n([:nWTL2>;W`In^WKD$pb[9uݟka-r~V rݏܥ]VHlN䍾D)_գF Z@x5ȶ{xa4a@ZԞ|ǀgZZ\~HaWBwC; RGDzaCz_+6kvh4@ಯGG ޗ15j% >=p@%HP? bq9mCGiu$8 j"l˄Y Obq2}']b'I1&~+#va/=ߤE(˟{ pRFwddFF^mq]%qiJ! 7oo HЊfZ(H`uyAb(BVFiT]f{%\lwhPol4Ca:GCEv\Pܥv Q- aopUd*~5ĝX!, J8)Yv(qDzo{q fk˰UlnK`G F7_GX~ y⑵pg+1Yh>[b>/. "?kt%6v~rO@xUd]cz?'8y ~6._ V>+^x+*Xp|쒉ouu{|Y H[ }%GFkq` è9.wze;v"Co Vq-34\n`a*='N-Աx  K p p'%tQ7t kXzkW/]FFv̍k!L8Vއߋ!J@ٸvRWnCī(k}}RĞM5 ׯ_~psH ʪKv,[H]J} ֊$Z|~ 5[+.羏s$Zc[B6zm_ap͝]xǰ?P Y?|~y{/4zXy?fϝ`?% $).K?ýε;-C5,rᚘLo;ݿ0U{9{΃WӐͱh~L-*NUrP04_gM{}eYe;|wk;2!y&f?<~7~CLX}7]K^vOQw/ `c~k>zݨA:I:ƩN)Gacx#ם(/ jW_,0K~+[aIoN;VN/Jiɽ^y!u8O̯z*J`,LaUg;8Y5W*#G}YDQV8nb 2o‹gPs!|_{\Bސ&~O]LFKi_:2Ѡ{ZDKB<ab0>6qlE KNvei)L$aMZXC%N󲚼qzʊM@isgnti__R:(OLϝ~!)7Cq2رVn4;:kO)@Tȷ԰2ڧ{;܄_n8G 1PKؓ9ꍧ Llakv$FXaP:bRek U"9`@M#UeLOOm4I~UqGՕ)͑'DH$Q8s*ڤ={Vd% .ãSDhuqn̂C^&IS o @u};L8w+ts$13≄}/cG^8sk17̊u{TE-cuw}U5ݓ7nzzn`&1.Mt ך7NRMq 'Nve8INDEM}h_^CV"M῜S9n~,nqv`8#KA7RКE@0V*O@BޞsGZ8F+ěf[IdcXTY xpbma~i:uWŒGҒX 6leBd(mJ ><{YN|lN" '.JGb a!NrAWZ361d*z{4jn6./KkALjp[h- "{鷠իSllR\m+r'9/OyQ snA-<}{ݩ{翻^ٞW`;) ,l9z5jwuEUOzRp\bq2lebG+Y\&:Թ:ot͹^rVHWr[ 9Gj֡ FOGiDcjcq~SmH Ƨ L(/EdEx}R|p$,%ι [h4 w.6$2x^@pP(B"^*WN$crcb1*h8:LyYy~d- Kc>V E噍d*d,$V8E## gܔ9r 9t`MI+$Q0hB?b @"w"5xs=WH3UT""ae[rqn"89C2 9{H6߈-8J9!"lbwѷX#ƳaPV\qJn0EJĵ8ѠZJ!HV6:2,``[10 (DPY܈R.| BƱ^̥-!) , >618A''#`ֈRqZ"*ܙھW 8* wU:yĎ- i)`նTpn*[dk>vz-Ԫ%'E8x)SҕXvʏb$<mcj1iK>lv)nwn @=Mrc9PHIlD,e6%ke#H bswՃ+~Giܭ-}nv߳bDEƎlҵUZV iJwU-Tx:n;eX DtǽSw+o<6{&~ ʗH=$+qCnu ]eh|AFGBȐX84N%ߐ6lԫxshmaR GqQry.6G/2͵'FauuYY^YA8uA4K'-DCH`X]oefy=D"Ь:(T2ܬםNXl+ }5n8l)3Zw [ 7Je{v |Ξ}VN?ݩ@.-]hhe+rVGJ4`'#V#YYPm^+%8֫V7yóbQarX-}7iX,9͵4bs) a;]W~:kP)"z=t9x1YOQM5jޕk5h' (pFV@GFpo"fis|JBvb>t,͂~+ˋ* dik-fS,I\ veeˎ)wEr[j ]&ISfʎ!֍ZFFFa6khIFaiD:ͯ$! 6sGH PK%r0&bjR*1 Dj[[yJaIwVIٌYbdl&lJ %1:JnZ@$@^ siiI!|6 Ax>G/ti MLcbjrHv8cݼ6nln!VGL~LNL9UJKFVt@.kIKWs`1k5jCyp7>J:=>mM~^MЪ؝ZxVXL낏 ^;_;ϢKQ~Cs5yB+^w7B}F -o<=qöH ŪךB5ˍ GacH,hG.6uRr8 6TGMuYb=ijb=aϯbym9*eBaI\"R , E &VYI^Z^A*V\"\n PŹsqA,ϒC*EsM,G0G&EE0փUKжR5L+t[0 Jl6Ķena#k;pcJ*fG4'bӍ#Zk :/K,7z9ڥ`H ?^[a4k,"76ɑ4676pc1H r4_@*@GzƂV%9Yq bVXsTB<9sxb[VVץ*o{~:t҉؊m jc#Ϧa~ DzS-Z:?k} +c8caoD]buZ&zQnͥ.lY})qJ;dgu%@w[x+_~ih*Ã)N[aܭ = 85x ݂ ۸uBQ|ǭP.naay>/mϸ sRaKI#DuNC)¡mR7ggaB?JO,U`7=\O훙l$Pc zHjZ^ZFc+8޸!J7Ēƍ9C^7 R-+zHM7@)s`j*.|?xNV)7Dbfk6^7 b=sUDJMIu< |SòiձU3̾:P)YgG:=$\y1L#MKGs;!UxNAUEZ70'TrF:g}}]ro.MDijԏbu*KҤ߹g3)1aSSה9Fc kf2P%M(1O,/̫3 C:@ƍYHG&6NGs8p6Y?S̋/AkWGD#Œ)G!Ha"k70J`6'|so,[^> f]F R%0v횀yfj M9Dkkkǎ`~vV|F'P-q@5>hU07.Qs<;U L¥+%A/;F#|ݹ,x0Hnۆy=R#c>I48ck5Єgv19t~ &nAxk#.{lA=p 6V簺GBWbiiDs# ҕk&ԜzGGHʪ鴬9HG_ou4$aO ƣǏK4-+uܔhV\nù[/ Z /(YH'XzVݜT[#Ff(.we{8ӹ=3~GAT)1@>MuRۃ w !!vþsg#QsYtLx _Y ATX78X cZ; s~G#Zu>܇"'|흨{0o9;~snzo}Z8[Z$+M~xASu̱P#fppA u{ ZooxyAV(nYh@\>-"y*#U_X5ī' 5W=~uW{4+l NSXn>  /}2IkO,0V6EӡQ^2OLRQ}!w~zw賒́_Vh.muM8O(uA;ֆ,>؄ׯ}vnan}}=TV M\|/1cl!.#l]۰z|dE9QDb <*xw<b:_\xơʝX;xmvFPo?1jQTC8qƌOߏ,! g!0sY[Dc9->UA#Q]d{_/0rH5r(T?a{os=)4Ը9qK?D%E8N>6.ĬYZ Vybf5D FAQ^% bfKPr9 e̓pCZP5 +v#7SGs!?} \D<9](><_q~_WɈFF~sqeDB5}:N[q_8}2B@:lJPIDDD e[R3 zw N*C&!)IXM;pE 6j7jPr'_V6Er:핖@d^b밽Κ~Z`f{DDD:LX~_;]g^az_?xu?pf]}}x@!ߛq}sP}el o9C{PT FQc,ys^YU<}A<3rP +F#ڰ9^b 'FQێR'IcG O1N*ba \g-kNݲ15| 5ī P~Y ثV/3$""N]һ :Xe02Nr&@M0X C?%e7X݃zaG9l FvE{>b@tU:l`f{DDD:{uPqK+C/mJQ& n?sP^j5xWw/[=qb1z_AOoO,\?'|y9杄Q۫Wck|F%0~q5F{Ao1.k7ȁSN7.Dg4bڹcE >|#mۍE5qɯT}$"":^ԢVuQ `0$ }qոudWZ9u=˲5;xk:F{:߲eɓ'%禟^z٥>vx{DDD:Iub-.e)e=뱪r:5-[7^{2e5옻[.1\cmU5 {9}$Jr뙻ۭC9 K\QK咠X?z,Oi{G/űÏPtBBT鍱c Bp8I1^oTqˈ4 45^{i#bZwؑw9w2vRYp(xI V7QMO[ݠl#Ѯ^[[@NꚚN0=""cx }=`#jx|s,/vr<Xॾ澟0i|^N29GPr b\Z !}؅cRdѣw fJ#x֌h^+?7 ߊKkupk G0񥰘d jKyj*h K3kU}1j@e0 > ""cs^(u2w.`ޗ2m`lʖb!hR9֗_´1ctcY9գo#~!xի״N p)tJ(cd8WGިBOAsSsce?>jԴ8QOLBFn(4iTT5'\rUЇq0knkCP8z<$TzkZza |KQ;Wm?I^9pE zƝy2j<}oYNJ4 n|^ 姞_n ApCJ-K\/C@""cqi@]Cj)qu^|;6<s;joԨQѱ*֢W1r88 5ؿcX8o# 'gWQZPcPI5X`62 %E&*]4OJ {PXഺ8#صt]r)3Ɵ7ˆ!SOdtY ɉt7ʀyEΔe/w\(amJ`s nRoSz(|l3^Y^(T{ud,`;3-D+TF|XqA5N}>dIn=^SSF 6!lt>瘶GDDԅ?thRr=*99מ+Comn@w7Ȼ˹L]ؙb X ]%өGxo띝l zT~tD!uqQODDD=e̠cC2Q6 ?=/3e̠cCȪ@@ {DDDDDDDD=C@DDDDDDDD}1$""""""""uc *{KDDDDDDD]@jjjPh&0ws{uiFc#^wY{X,6Nop{{r1rd6G%F4j\% v1ѻe/H{}񨺺= í6VXEQ%Dw BVd.>H# {:) 1љ@ +r*E8;v*"yvqc1,r6.Ǜ/{BkL|_\MnWӎH.#>kl5pou>o_ ?a vgk&``i.\-C/:L /?F\i: ݅9܍9¬]g1t~m6h_}Tb[ήs1n/OƘYk#,R"0Ԍ隱N>c\t/'7DEضYqJq[*" xb:"+QB(15ZOV5`~su%܊ ۀ'.WXkFUeS[8l>]t#>{+Ofg_wXN3!Usnqq)hWRRd^6#k䷻}X>{9^6st|˷+;6[YLZS%vl߁xZL?|?׳wCmhkgbYc1PFCrSX|P F2&~kl;Ӈ0`Xj|no+RL۸a)Ʌ[ r g\ɀK͙_ck_SpiD v<mڊ8u杘qR.ʅa\W [79f|S0Xy + Vn6IF85wZmm3:2)I0e. _\w81沯⦋N/Pن0D|u(eG/߁}8zQ>Pw|;[WaŹdHDDDDDDbH6 MhIܒ4100?ϨƜ{cGԉ -whٳ>.U`}ʫOļݐ 28P+Ɗ&˱ŻfsM[7'Ixk ظGE8q;'5뱶B׳Nuf[\'uuPpl_uz%lN€F6WƱ_g<Cx.T5CQFSIU8 'lY[~?o,ӄ@Q\ ^g1~PXE޸+kNbAĽm;z{{aٺGoWUsKDDDDDDLZAٽ'} NLIC~:5it|Biƾ#B]!ޫ?⨬

    l>NyRl/o\O>u_+;wu1o??ձRo`Jc/_x!XS"IbTs-XhǾ?"""""":"2 )Qn'IFcPbW,Cc[݇{bkN6¥o;jQ8U)hp+f_kCX!zM-9;];Q#)&in]gnTD0fl/4aE[͹0m8(uwf(h7xnYڹ#8_+Ĩ%5Fe% e!bXn5h/<:AZ5+>0jPv4 ZW}_u';kuܿ|Y"g-|^VB돓ϻ cUGXA)WKVFiWځ1oe8Q;ck1b.vE}Uӷmm.`93pMxi-{8w4.'a:D]8a`hGHV{ҙ}:)]%Guy0|d#bAhzuסzKgvnԫ(IV^gEd^_Ԅ{onU|:r /ۋt`fh#fu;j[Tf>K]` u>! U8Z^|l̼p ~Z v~ ן%\KÆ5UhKnل~ *.M;Ca0끷hW(תh, 3Jh޻s<찪$4c[ƍ߿JK%V=iÃkpUw<~j~OzLN_6_{n#֌+SOtnfGnYut^8vQW_ro ߯*͗߄_~?TW{^[^`g| ؿNT7F < ށ32uڲZxڗQ><h DDDDDDt$VgFY3 $d()Hd)X܉eSvc_Ӗ߇_3JPϳ`ŜXWU .ģ? /}V- "D!5Z1DDmATᔫ/Cxoh`H݂A|ijj?{!aoa.DQLDDDDDDDG wo2Q=>A """"""6-:Ǡ;c Q7cHDDDDDDDDԍ1$""""""""uc߿=m SzzE+ƥC%(2 eXa~pM]c]]p ~ z@ȋbȨC'5Ywf݃A僫gOœM,ƦTRKO\혦a]z--@(l, "(+ŁhODDDDDDDDžtc {ou{)vѼ-ϸ 8ū3EM2ьhR{KV`Oh# }1b(!+us ߋ4Ǹ EY8gxN3S3_fԥkׯA $/bVW/"&hTď% {YT,5j1%g.Ũ C.IS7?<}F[mʉ4lYT7 'ckcPo!nTňacqʰt+42+Eq^=۶)U"ˬӴ,ǦDDDDDDDDGAVpǤKhKޙ%TH1(}1Y$p(2e_:9=34kV"48̓/z?kVrY`ԇAD@spVRfU?9v`ٛVwb[_خdӴ~z1`}FJAЗ>YJwq[7,O+g:>^8އ { 5%jU}k/̯Cc܇fxvz'CTvKN)񊃑(mڂʝ;S?{U"8/9|;_*PN >A`I +;e芨pt.ƚՖaEWb{{9pe%1d>+7G˛ѨE ?3NbV>-e|?%ՊMzzăVWDgv1V]J(B?M>,s?"""""""1 #IN\ftM @ԁ%ZBuL.p{Sq ern*&(TpڕSsO+4떮aG;a}MqtCA{kziuP2%Kt$vw䡳_.1#""""""@R:ґ])a_Z_J𗺞:eڠ2{[tM('hΪۺf+eRNBIvѢ6Tl#{V|8mI[Rޚ%Y$ n&h-aHH 2q$P+ {l`ˮ{F:Hf(Y3l>ɾT$ )/ĦAr1遙qОj^XXNzAx  pĉ(y7%1Ǯfhkj+"}OSlMw0 g`O /z6D'e.?ﭤ(;h\['0DZ%| Grs=o"~q(ī+PY@Ps_~i_\:f$N쥫dv0=/mv]gMYGDDDDDDD)=BGzA^ZɜvrI@2ZU(. _Bh8ޜ RG1߰]'Pf{j].ApVތ%n8؀y6"vOOL6 pFؗR.~8< ePʬDv_;xN>R ?ޖ'c1a(k]s&PE}ȅ6;{DP詫-]~5;}/71o,cO`u {{?Ij65txe_Y*,ϕu]n=oV +׉8yD3{RPS@S܍f[O>9Ttތؒݵjb-)}EOtլ'h?vQGPZ00/>y,[ vUdDmkO!hU6spԓq݄?ػ o/CCu׍WkvX'6S?VmU/7j/qltDDDDDDD%1 >d̾=Z)j^#O¿xcKq7Ћ)h+ZVY~4-7K"5+yg,BᔊhfwԪ?{7& """""""zw9KٗRӺVe84)`⺌ظ~p}jm:2?&^:.ejq] X>jV$.?{YdIzjCxnf5C?)K+ԔOgML"!u~Adka&?ڋDDDDDDԅ0 $j&BJԙ։?q >ypʵzګWC6s0a9Oqls9q 丬?5#3戎o؋7W?179/ޱ5mF 7 cacA-v 9=`D^62^źT!43!cVq! u {DSZW!c?p0c?)u?žtH]8F0ZW(#/7ÿDTغ߉f݋"4nN,m+]/oD R8|,|dӵMf?pZclg Ɇ6qY1e!yqT8M[Oo޼諏`= =nx81kfsd78i<^豐n?ی+tz9v\*>Nc*1"Tp54ʰ%ƭęQ'P2uEc]~e'+'FHN :T8"NFz>E؁z!c1{NLb xj.۱X/OKRovOyZ/? Īh-hV%*  @Ih_J m -܀]8wv>oծseV?2jURߓ 3Ygoxc)50kqcVsW!ǻ+Ƣ 7 +p5; $*YQ'Hdev :#ۯWTt@]b=f5SPy|ѵROfq5-N_CLS1wXUV%1<|?**k}ebX>or΄`|u!յb<.:֬l)X7/ޟ=n*Ar_.[f%n!G} 44-\}$|Ezʸ | OPtqޘÞsyS[ ɕ1kO6z5¹S6߯:͹ E[Sm^nBk}q`O gC792&HtUMC+ P|fu~Ć:'*t. RC(?FGmЃ5[SGiRf4!gw"{fS^pцhF,a*K{z]񧥌g9OzuyЛs0x0h@9pݯBɓgqnaϿG_\ 1$ Dj|2D7p#]o¸PZRgëGaoU*}c)-E?.}P3F`(rJeO~(erDq.s2x<9u,VUv&ΈXPqODqu^l d(W1H1xrC}k[hQqiGXbb14čK^t$:QA')>3|A=&>&n8ux̜ ǽV`r`Ok1׃XVv$cgMpDqZKk%\.E7՚dI5DWYsцGLwn 4sv]㹃`u-'R6^{))]~*uREJC֬`Qo 5{+$z4v'D5LE\%9Aob`\ǫ{U,r WH v՟W1[jaɮ30 d9c1? $oUtKi\w&ZHn9?:y澷]Hyuz$\s֖,_?}!ll4{+I4Wý/m2ޖ+DL8k>2f3 ,m܊'_ZYԘqŧ`! !J3X 5/7=w~1~+X\#-3>GӉ1=}]p=ڈ[2qڤF+r Ȫżč# ^uq==g2"&m 0A0m_C$ W%,n[S vVAZѣ:Nh%]BNF/PDŽ:r݊9\_r_cYUbNu!H1 %r/RgO⛑Ƙnj צ#C;]ZŘvCr%UfHO^:^~&X&{i#t-b_V?6ybb";o y/%&䡭 @Qa/Ac?Gs^YjŅCj&u_sK?5|?F \gǮxj~9}C=i6->,p9p'[nD9`WC|sQۂ ÷6c@˚-d!YUK9 <rcJ~{q(uuqq@^9Ч5D[aTom[.។jhV4xd+xhxaf$b2^^EE(-IO*%x$PZ+$4$ogZϟnϾ~G|;v*o/.g~sŅ_Y'|Å8\gc!y ͛/΄3bA=]y5'A2 mWN2o@n{|'u[3&w~ލӠkseAv5Ar-DDDDDD%'0+$/q]J XD_bqb6%័y:d{Av  qЯ'65-A[;OE)C)O3i-b\8nfd: r}38'*v3oZxNC[dYws ٗ#9ݐ}XZ 5Q\,rխY;dV# nsO-ڟ0ʓX5Gax|Hb|;SfNk{{mY8v.9cqӍ9[֡z#|CڻS7.f5q… .\p…qPxz1QԊ?T[YU-->]}j:E$#_I?9ރN3keOlVѰp&1n D'?vϊ%)!cÍvГ'tf<@)ztxi4 [eVc6ݶӇ\ ŵƏĻKїV"@r@rz+S78UyhUi3Q)wqasXf3[~vD"W?\WY8̱U= 3.C4Yn o,7X <vd R3' D?6b͖f1OJ kqPn}ŽťDDDDDDD9=Ab/9GJ_[/1qE@q^Jp`E]uP'#VAsYPU ⊎Pfb n;(#bq+%`/к;t]B~wF+$~ZMZF $ z'od"3lGr+~͜KΛd'ًY݀;܇~~'Nk9t<b{_XfV|6\5yrnվ{P0+Cw~@$|WK{$|oCrv3?sc|v{|:՘8| 0wI_ BLǴ"`Op"Lk6.[D]F3':|^̙zqU]ZFL浒%&U%#n^sydƾEcƥDşיY^21h0.^n4bܿԙO2vb̺pcr̺uI3'%פr3ӫ0$GÝמhV:Csv^9^q@h#z۝Y [7-3+ΟY/^r DŊۓ}񽋆5V0wXnU#dwyGq?Աg4'j_|6#lXGx" .μAhSsI}zW2B0P@0m KuDWz[w5Pg+;keDst<5^xZX'(c8DZfwML+*)rP+Mtɤj?楔JGV4&Ǭ{򥅐܁QHJ.$Ov/ϬECcw~:tT<,c”%h1߈!m;+{ ǝ3/3z{0{̜XCt9d")|xPz߿lN2+kNjے\^ոinwv5*=9$,Y_40n23l3^rg7+0Cm}9f}9tDu+xn4xGs'*j["""""" !Fƥ&%xU**t zc4guU%ȍx%YxF;nblc[6.E_QSPjvvg)x3K}d޽m?,'FX>q=8zF<wryj⶟*f:6cٙbEZv)b mGH mN?ȼ?M]9P9Zhd#+hqa₳6.f'$/>n1ݼK/G_^z%&Wi3rPοU̜Z REпvB) 5C\sYKS.2cwA V}34tCsBwy$U+&Ք TVQWH RLE" qif.Od0"_][jXQ)QljFWPJVm6?QUZ2٥}P[R+̗<wa "jJh7*<˼hkx f\j1uh\pd'JDجoIkxy}MnsU+Iۏ9~>3OlKG/XAC}IQlfGRA[{D1ƒE1KERpwqpm^ϟ߰33s3Ͼel)L_ U5Zt:7yş3't %$OWZƧ[ FPVtF?XOltNm0{Nn6yy)3s GUȮ U>a]Q8Qk0*{ @}HVjf;~ˬJ? U- rn_Ϗl TשWܒ@_Q``B3F,UcڦSU Ic, >-H2J J@c庞yV}?W%aタ~玔᚟nHUJM'V{5|Cv G d_^Gᚳj_RU{UaUpuKY)UDK,Ӳ1A[J_z=ul? :W|zK#[ԯ}fKna_ -hYcrA|s-^vgp|+8bUĄ# y3Ǩ=^}{Y Y/q =#0OVߟlǺ#J"6[HU`t H{\}:0Ϸ#?/v/?!>U]OXk%o?؊.i㇆N~XM}x i9%e<&4Z\s,u V{$n*u_lCDDDDDDt $N7J F`P!iPXc#k|F/6}QaraҀn}J/%LӧC*%J;SZ璗fP^NO{F:&v@P- hftEanX'6FF9n4YT{U:PNjȻΩ'js$'/Zm/P A@P^OVQ cAƵbWJGjQM+A$@PFs ^y8uu:umk NZvUJ) v7靉ce| ?_ya@"""""2U^=E7% ~Yn $K'7 ?p[S?+%{QJ*!ܛOD>\ԤUB07aM6P?*<6~CBohU}ͯ:-\'!ζmίE+`tbtbiQP)YGM ԏ^2D,%dڨCsKb^RWI\5wӕ84bl:46\uڿs"""""""jEl@j`0%m?%#4$z( Ck/P0ִR`ajh =釩_szZ` ZVjhzTJ K}5r :PfT5S;TmWe TWB B K>oصERv ö(MDDDDDDta`[f=IDشI~b7WQJsJ @%znZ$VL{| oKLԃ?K_@lZ ϜYi&C]9:izo_U*z @%MkhJ￰cbN@Lm*dI/Z QZX8CADIڠl7G*+%?L~(z5n#}f|_qK a-2#""""""V`T" ƴcP\i lZ(httܪnHavĘ3uqҽmw$<==Yt&!{%<|RI9#pȸ}w¬ܿt3Yw2~5zm^N J%%5֮u݂)J?%SJO .G2gk D`Gj1/ im{;i&k1u@\'oD1e~Bc3ui~R3ޱ'1}9Z1s3;?UB5)U|P c6@ax&w`jJ,vpCt5u= l_¿h:N"`8B_+[wX}wAML<6q" mYi7/ *pmpa<,,t&MڱM| BxNFL49WMIBѷ~_mSc!܎+ bJ=#،KOGTtLWROen,5i+jxBAH_Y));W=UH6w lC"ءIPOӎC;6]e^W0%w-׷{CᎽCXᆳHLv7e[&GEH[L_RO^ك6m~Jn年`M|['4)k،ωl py!||4LĞՅ(x wcӊfM hgdf'[5.mYx|:+:{,%tqai -$v4 ~ۤ_YpEȁ$u?iqӰ?93ʳp*̝ Op/Y4,j26Vk9IDDDD u/ٔBJ?F:A(î.2]^$=X\E8IE? k4$?ݍ1 LnW/~Щwwco>YnGWwoS{aU9nm <v$4/hcCmR/|%xAx㜞xbo-nVS$Ge?ހw`OMKU) 1HoJ%XVr)||I&¿p}F(&Ny8V1>IRhI@s`W955a#$d+1._|S|1;@*u'IRDm ^?_mM)Ekn'|a8;6yk4NC{InԒV%QK`~_zjה5M^»/~eUW+HM?~;!opu d=fĿF&`xpZgHpbf*|T &R>4m3ɟU6b.şB9W َoI 6;珰 mG#o 9n{߭p݀&u>{vgUn*)$w-֯%{ySp˖x@""""jQN T^'ʥ: p%2O0J{5:,D Um$:jO,nJu`K`G..yi1ޞn+g}02Q^[2+TO gbPjeYR2ʾƇ5Sph;*?n;S* \ U[+>yb_hnyB3&}4Jig شkztMuS;ね(> *%{lՖ_7vحuǞBхKR^'RԹj=񯭃$lYFq 1&jĞmEȻ?do'5DDDD«գ):jӫ+GHT׊F?vhxͥiO0w+YZ+J.%h ̧<.P_8[r & ΀@Ft̞tq=^-t~{θfkQH.1jeXt9m 9rK=j[QL(3;Vce~~xtO\0X1w,z&T`PS?%L‹NބD$bycl/d!v81uP־Op _Oփ~4inN!*aI³Wk;'`ȔkjoӔP-o3+Ix;Zڡo\e4mmmy n˾Cs?w"wac0(o)Q&mLK4 GNcIM\H ɗ nîKv ,ҫVlK=o?Y2M,_*Ķb)dUߕ {bnJ.ExqRe^n޸`<ډ@Q!o4Ϻ#^,{?H^f`,|5= 9'.n51+uK%:|GgڱaWr*9}SsXRCj+))}#T*3C?}Mb(g'nua>k>” r%M)QY`(.qYXv8|-gjtAߋ`?1vXގ,|{xx!|kn|58aPV.oGǴ"v܋UY?pLJoe#pcb;|UXkdmz%/v*Biob{ye+ś1W]ᨫŠwKauI~l|w5.ăa<x&쿟FQ~lzo.{(,:?vG !oRi ?g[^t6k\˫F7F @]-vߊ >38p^8 \ܧC\>X+8v-[#ql9|/.8+N#TYKY㒿 Y#nm?)vu.df1$"""$'Z_Qki-֭QZrm;E/a]_# yqJ*~/_֨)=D]c壽@L""""?"߸M4U!ɍ%jmjjҀ~!QCh3JK}s!ַl껨ƟZy5Ii]?L_TX8JSje-HEF}Xޭ;ED'ڱnMNgAbP2Ą3?ǽlvg&E QF~6yE6o ~Ԩ'%%锸̉`_c=p9,gڢ^E~B`ZƦ״`U`s' !xM",5c^ebQn'|`#""""""(0 ~ZI=-[? JTzƳ 1X.R u4*,*<5 #"""""""jFn5DQ HFf׎"pT< fXR BL`cZ`=IW2O%Jhkܚg)z-[M:Py f~1XRL {%""""""0 %}7(`U8%v!mK*<}E`h m/s.J@Ў@$bQ)Ěry.-SRcЈN|#s[B˩F,7ԓ0>\֯ K)@#{9&`^CWT U{U%"""""""jF+8V zR%C b;aTUa*|p6[^熯X[dDDDDDDDFsgl1y.w`s@F26*Kٮ 2CDžC+'[V"ޟQWREQ@zHjpJ+ ՂpXBZe`׾d#h6៑!\XFu_U |e:\ꭱ~}(J0J`ޝn#A-gt@׻xku,U _oCMG3v- ߍKm(vj᫮>sg 1?"""""""b _/g2GA :M oTÁ]Z? ](t"$$@m!5pˮxTuWW ])(lP+٧D}zXShT  K*+زʇ'NH/j]˳8댇yp;ly=6!)z"~?^nDK}J~z#bRh 4- 4JjK0Jj _VW!ȷ^<ȇ_ܞ:%\8WoVTj>~]Rzk?SRUW Ҁ!b|!R¿\CwHLLJ&DDDDtjښjtL? p[G_(z0F`CMh? K)#jJ[#^_ïگ Cz8PO S/\g~ Ƥ`P66tpIqp'5ߚG1|;p,TIDQ`h,4eQMjJZ|ozu_kg nXd+j Nyѧw'_,$҂DDDDt<;`o_T (+ =cU+pJGI h_҂?IoKPTm(vTd`_x 11VKy,a`pѱbY;5_Jl$j". B@yDP׃pB?iP?%) S?TO2gkZo%D`+g>$++kڹ(ZƯR (0 _m!KO~lB@h৆~%S;C:I/д-"}iK"bm6Wӭ㉈5}jCR8y+^*X -!` TjKeKd!"C?kgzZROjN5P~'TV7Z2} vD@djZ? 9m²}?iiRsڛt~񉨨tI-X[ǴM'~eƅ<.p$[X\7/fnqE5X}>^^J71Oy zB |˭5S"LCS1B* $K V=6\*w^/ÍgvYOv!sd8)[6gDDDtNFs4+!mK 7aSqߞi5)~+[X&)FݦH0}J0EU{ؽxRw<1H gPpt܁\Qa/?QX'_0UE0nq>sЯI_ѯ=zcU7"G'coqƢBԝ$'TmC:F3JYXe,ِRSn;Gb927 n:cx*Oxu<{x3~ ~#F'2$""tʭOq#&&&<1qx6U3ypu^-?l&3Ypz7!%%kۮDz $|1b 6h93J_Ъ9okHR{.퇹!=Kmo;a[!A_ԣ o{\ºgsk 31sl5]qbp*x(+ӓeǟ`XׄWU?Ci7aZ+뗾OnCva%$g W qEᦥXd%/'1}x Œeb]Yꒈe233 /oF߾}qk6XzYK5=J mmK7j[v6'8v4 KIұ0T~`ga93ZKYFH醧4(jús:F^T-V`+$|+pbZÖ>^w=Ƶm<{W1'ކs0}0lsǖWX#gq,RW⚝xOwq@{ԕqVT#ۉ^_pCk W{'쾉D7GޏKjM;r~G)(žCg^.ʹo^4QQ ~R aPc_?V\~ oRƍM= qqc_y]qɟKOdfW*w$csd`eg{ŊJ1Dy<=\ez5oxfREd+wnwÚش {ʀYyh#X?z='. ߇ۧϷ!]7>碇vHx kod{jܽ=ݷ: ^. w]M州û5 hsvT>v% Z_}Eff97}O><aۖR*UuIz;|~"6A@J Iv K; 7 )IE-.9+wbcR@'JFu IoPDfW=#AּCVeˇpxw^`mak1r\ڭ+3 ݇cL2>|c|#N1p.ƷW@|6:on;s+D?;W?=? l-yNcq}_>t: 6K4k|_PԖ_4DDDCX2:oRCK՝rwqPYEZbLUuGh#uj9^E7<Q{l ;1nL\1} ޚ3>W}Xi@zJsOjb$s[ òW/ OG~;/7חIZP*EI-(ݭF|8E?o/(O@liv/OͥarIpsk'n6e 3%!&ơ-C/_y~,4>| ؛יֶ w*]cjjВ4¾p|qco=f_rBr5>"""m2F mj} @%<պ~52ooJqN{!:1Bbr 1{Z}b o>H8IZ_[Sp˖ ᄌeQ]O8"-"'/vy݂;Ǒ~V'>C{s㟏 MKKQI}}SICJY|2%Dv :g@Pj6`M!'gi rJK#~? W㖟Bp+^xP9|ˏm´,I2-Wy,h'Xbbx\nu)^+ѦP:`gVsy/P|򹴱NO77;TCR &=ۋwq?S=X ( g]URxv?Rj@C㛻5`\2#t!=ݞWg¸OKŐbHI@u}V Əc`stE{%.>x@I`}0\w$ NR8tHd E-vD,LU0x_ q55ɏß"bx~Zl`L8-}+gYWot{üNo:4-yʵmF;\=2U]^CcJPXOl X3p )(-HK&L``5 ωA JI߱RͯnS\>=)'^ys.L/puع~>R@Ƀ`Mp]]ᨫƊwKB^g]&яZo yT̟d ŁUhJj>s @IaGxGJzg:w4;cecEx:yT[tw)*`{.럼>hCbZG0z[qcx F#1 }gM>kI `˫_aW1첾w;xMg`ą}pzHhCQu؜s)>&?E>_uuȯ] ilѬ"+ǃxhy!q킥*2%nٌԑb0JfggW_7E^^ G_7ơSf=O o~qq'JۚhWdp}.g9 wۿ7yç"Hfo1#8(NӠ4Qk )w `twꇗ̣R"g[ףU; D2<(KaIxHbg[MكE{ 6""":odTUU+.G^ū6~>WkMiaod*SKk+oSbqݬ=uMUΫ,P)к5ȡ4(i4h%E/X<'`и'T#1!돁qcQPRz@`Vi m0!bP<6mF@"""gk/~q5zzJ @AY<;kXe)${:/ NuvŭS-Uݻ˗va1M)@Z{tFUOp@T>maճ1,oDDDtp:I]) (`D#:q NqJ*Rz @  S+}f]>9R ЅN4|@fi6Dq6+J"2 Q~h 09)0C-RTiFԛEDԨr7PXRԤDIOiTY>ђ *ɖz¥W~e [Z+M4?biݐ zh @"j9gMUOz*6A;zg:)c """":Ƭ?0ksP$`E@8Nߴ+5EDԨϲܾ,cGDnjZOj/mOW1?&"""":Vk{* awgr'QTaHD~ȝ~>v x%2Bٳ۶=M/O!OOӧW?ҧ.ORO//?wO}/1Jڸ1&cQWbLƏt?:pZjU=Kea5$"S컀ryaӎbbR2ڷѣO'H'qP#/555xH4#4i:uT8%4pBLcx1 2:]3@sN+Rz1Bg/+i<4Žx|/ϧ<9/DP7V.v\"S@":*ӦQÿ Wee鵵5EfcUV.L`jZ[?Z9Ϙ_/@yA##ۡ[6Ϭ{ː}1ZUY3zgF@Q< 2N^K̀әGaڴq}@p}8yzymMgFa9MozmubCQ/Y˨sbMns_j3^4_ym!VYo_}otOV C_4³?Ba MA8)Al]y0݋#M_^XWOWȕT $S GJXo$ҕߟ(""B=777᥯Ż!`~G)}Pn'˸ͮt?\w(|_i˅bCk;O[.<]=yR:ZL̐j>' 7ѠtV<QD9:`K2#lXpn bdҷPpآOoߪ:&1kێp>9WG`< E^._Z+.>oŸ-;WnGˠ:*GFc۾gm@"Z]ONİØ^-d./aAt$b!:u^O|./Tk<.;yO‰koX0czxNQJB?1.a >+>D?/ÊfǤWGCHfY~= x5 @w7| ,ߴGO"kա?._zi :[3Fcw:b'0vx|%$D߸LׇZQcjp!:}̀5=:%Vsî]hZؠwA_9t6`K!t(w/&os{ ]zSiZ {[>'D^ 3o!}}D),l &/ B[c`s2s2OJ Æpl3>Պw~z >~AooAjydѼmNpz#Rqq h1 n-=;QK.adǦ 7sĦռUĢ#&/cܬna}:O+asL? QC>CK%^Ty|5^Av|0N7n1K1kYdJ-Nʽ7-WagWj?®D0P,8+ؘo"|V͟o#ng8_ST0uL~{NFVOW~S1oњ] M}-NꐊNl}Ϫf A 3 ,?;oGSyS_YFh",|Io~F_*Kr:uG'y,K!8 `r1]TNuXAJ4f5I>ZFh9q~mÿŴ8?Ek'aԺ0|mWDnN^0d%`:&&o%B|r _'X3Ʀoזdn"e6fW'QI-;‹}[ Ks 7x.:7޽n/ϫ;qb-,]BG jyر'N px7bPX~Uʿww_᧐,[!+VݦqBD j3w\O 괨bj ]< ŝ7CFӧp1Tuz\?#!AǮBJ53s"(v_e5 }}0(gGk%VhB?]mrNϵ1ױs쟸F1$<[toaҪ 91?SV2A8|"WռPnYGS167CxLq;o (zeҵ?C8떉x\=^P<1Mkk1喏1q<|L a=^*D\ 敯k(FUustd +ûcɩ=F뜠:]:<1ý|X30]Q{`]wieZ4j!`y_U.x*I `dh9yu7ç,6Y\'i1;!WjVIpYujfvKb늗֋}xڮarrrk`-,N6 [XǾyR%wnVVE]BH x 7Ѯ'Vc졩J[W6Yj?f#9aYujgčaCѷ9Pt8bGg/g_,Wݷ1#|!lC>#ǹ?!"DDq*lwusre1 hkڰC*PU?Q@9!ܞ<0Rd@a&b 0}=|ЫlnCfhgNZJb?!t7KȅPS'Q&Xi`m%H R!)1I8xxJAB hy4CcS|/\@&WެE;u!:II)a^u= r'dBL,q}Xy_mn_{VX GC!e-,O^U8}6a_P5Mm_-CڅF`Q(qKq ke-j& 8 E=OiiQKt Ċ+۵Ɯ7uqyP((.o'ʋ(QCkMe훍![X?OZI54Q$^h6L+ߏ򲇪۱5d4& ;a7Ź%hf?_aVhfRf )DP~xm]kJߺPE Uw^úh>ecF.~oՓFC3 s猀:|22aoNǑg\|#XMČWXp*֧R݂C4oXNT?Jגj{M~k@V*JCȤ%ɄA"_P음fOƊݙU#79Sx]Wyx4K"A jyֳ*)y25$ kVXlU볫%:ȼk]k* u~WYX3K£Q!3nU,]SCRH|.[aɷ?mܿP>|O[.<Oͩi%[8]8#Ƣ߂Xuw[P!*"f4  2#SSmάYL̄(DQ# *dޔv 5},/}lZ *wu/ՠ#M09< |WvIkm'Do"zĠOWh; wǀI$6K*`A XL^V/_EЮ= "]YͰI Jbm@DeDq@ 2\N ѯ .GTt=gcʔU= +Ǒw_l+wM>60ޏYMRR%pҹy=RE#Ra2܌BTij5lwm-j `ȱnddU9qwԶ5FlV!WvՖOEg_`jߏj1lG;!'J-\j.Ս\-pD:q@ȿrw>HI}nCS$&MǷbYrBS\VHK.#$, r:yGڶs?uÿs(ξb?LO<mݑK rO yggj -г#jܪWԾ^UA}AšC3w%13 ͞ huʰiʊn RmD` A:!kFJܟ|~S\EB܆И"7lHD ylw*6Ϝ]w^&sv5x%R8<>F…x$?RtM2$pzk+Fp1/-X9cZDbw+.ÉO0>8h?bTvhi *J'<ڣV^{hR鼫z/}#.kgX¡?-|tۯf.Mkaјj9buT;* ua`pX87*Uc/ۿU# aqX8|%4_ GB+k3??EV~ 7g䪽h0,h7(껦:Ŷ?mtM纺Jb> !w+Xn(qxq ~ i R#oQǶ?_,+lS-s&9w'*_Di5S_qlF Ou}t~)> sr츘 LoaO mJrdrTGryѵW|iP?*.}jEnERJLp#G^NfƌT7+ȕr~;D K<:n9!I7X|x|8jp9߯¬wp9?^0yG:.{ 'G_m|j^ 0+qN"4hsbk¯xvMp!uɧ½sow{ 1Uhߪ3?۹_s 7Vnٓq VJ܋O$c ӊL$^k b}/X[h "W0G Uy 6\d,sRJ:iqQ҉A\fTyyyf ҃ӒuۓP> \̌4ȇ?2_L=67,˲Tp pYzbȺ(HK{@W!b#eA\†U?.&84d&x9Nce=]X90][w|P7]@H9Z;w^$?& rPtg5JB@1oqA7WĩD]W[{%WD M100`hWdȫ8RB{pE^ Zy< qUQ}EW.Ŀ*t:q?s^\RDtOo\G6~hٲ |(ٺu{zRpif3z= ^{5tY7o x[uAAo_iz@X;hy gAj9Vv>EQ,>7+-p=d oo @kYm=mLDdB@,.nـjW'_D &eBe'Ƽߛ0/LYv] 0W/%a:&By'|rq|NP 3􁱩cڲLpzR\gm~|:|ҨcnQ6*w]gVɉCǑ^C'ffSa0.q F<^?8HOʼo2r:g-N- ,5Z>9y|mՖ/B6WX gkpBƭ7>Ӂbb (`WmL"v>`AXmoz ,\+~|<:éqBV<@z7:˥k` 0! j=s`߼ϵw$shU=WZ+V<Q]߳f=YP<A>FG{{Q+ŕN/B!'!; Fnf|bMi˥?թ_Y LWh>F~u>2vϲ}r?tJm `Zt}\ ضkaBuqyP(%& CT"/>w,OoRjx&2o`.(ȬG"U`eFV* Xr J\\c7!7${"ns,] ~%31 8KD 3C'<7q'z䳬P;8f:..rj.[ʯgedNƸa$vS._/}&Akǒo-ۅ2n ϡ;dRm~s pDqp 8i0Q3oʱG)DDT1$Ȥa QX"QkƢSϙhtZ#ѻ̜8f.hl=I'a'7FƯWbΩ/Ұl;#((9 C@jx*LnQG~䀧NC)]܈?syN Ywů 5;Bhj+Ic!`nvBp 99p43+7L(F(+!&冀Y <.,(]Jfest3r2MMMIO INJ@nn.l LV0R; Js HBB<ܽ U~7Tk[;d@""""""""= [[+ʻCQXJs ZRRR{cHDDDDDDDg~ÿSO'O#Ǜ=DDDDDDDDzJ OJBvv1(8 XDDDDDDDDT"O-<רլ >A)DDDDDDDDDz )DDDDDDDDzV\,oD!//O{*L*<щ@0$"""""""3jgN#??޾ppvrss+m۳DDDDDDDDz Уg/@"JRR)]˗.sd9^Hh4C.T}-Hm4o aI1$ja&cRXPld^2bD""""""*5||}E ZxT5GF WdffO78c' CLJ.`b]Kϣc#aRcwsRj@*ܛmЧGSTci,lLgoq$].ƛȋ+/b[!G)ߢX|y{W/#ͥ8ƈ99i)Wq!*y\g!jFDDDDDDxUCGq5bF}#Ʋ@Zn=(%̑k(I/g?W(B5&0QI BxAhjb.L(Ԉ56b dEi` !Ti45.˜1yJ@G}>\:SST*iI?m+@1+׆FFPU4=$u~ oF60h{r /<$m2xmŇd\_!>l mn9/5L)Mݴ8x=G'cٛ*LR`_qfTFs팗D(NǥqD`=<`)#X'~Zwm%evkسv;;@Һ}naq )-:Ox47U?aH -`{} YQQr?s^Tņ Uk5)ā%a_l%wģ/CKq R=Z<3#DµEZ4iG-8[ +rT9&r !%^6/0VUK{{ f`gv)̕P'\ M`a[$a\k#abq~՗X?*9\!K[7Bv%꾍""""""jPo=ݷ(Sn'jJ&=1Qt 4IiӸVN>0ܝx$i¢Q$*͠aK ATB#|+4GyO&xR/~Ӂ'ӷ[eXIY$x꽯_˩8s2[,(IRbo}:!f,|wt懈uQ@HJ\5LcW?b*EΕQu4j48ken$ .wU5D*`a8/Ɣ'^/%)2 _N 32 ,-{mЭe l~9$h5?56lD5 5<}m;7R M㊆Ep( ƵبH `(rMhӤANX.+fxiGp۹<##ܜ1Sm %xO{8DRm#>Ym5]*.S^,P%%H*4W2?C˹50Ǚ(95-7i e.ƫ ll 4(̌iPKk7\*~J\ٷ PswBEVSf#SGLŜ?P_h bpB"np Ce& ^/`p^ݫ-ĀOn f!)+x-*/Cdǁf!%U2?jDDDDDD l#; UA31HLaaX\ [ C^PgX"7~q4P(E^=Xلt6T0lj:v@bN|=u2==jc+bo[%cBMKH{$^!^_oI>rrZ;9 oMq|&~P+Cw_j1R_|"~~j8?ܜ50w\Z.n(a뿆 UIe&鈈MBz&`df~O`Ч+jCX5e|2 P `b gfhi<'̫L4Ew&HE͑`ֻذ.D&![mF^h}U--N.fd|剡BL6ȤlHMarEѩtnXW)ԍ!bs;Jj3kt}}w8dK`ˆT5?\ [sVkJě ioXPvb7N'rNJ̌ìzFnJV0v}1~T>CJ"""""""ѧ@(P7^ £Ǐs{o- ţON2J+Hq|nc @@f෫F4&7¶ר)s pэ5m`HThah[qHH.ڢGi{M@n9[5 zL """"""2, F U@DDDDDDDD1DDDDDDDDDz cHDDDDDDDD1DDDDDDDDDz cHDDDDDDDD1DDDDDDDDDz cHDDDDDDDD1DDDDDDDDDz cHDDDDDDDD1DDDDDDDDDz̀U@5VP(V5T*\nL#"""""""0jÿBrR"TC@G'g,VYThRprZ\pWpfi""""""wR)8y"n6|dĀ0ag &IWoL bc`۩H+;5rqSJþƵ@4 pl-N~ _\-cH&xK:W& ӥkgH$UB8}+v],pnAlL~@ԳsUh2ol9pW㳠6sDGbԈp!M6%APz >A>OQTa4Ku]Cob_q|[/ Q} !wꊲ閷ńC/֬[~ 4 \`"{LyB89;Nj Gg8ۚ5  FPOVAau%Mn(6Ymx@mce:bCSXׯ(Ba>cY_ *d@dGx|x&I,ipۭ{ l1lZXU>:};6PyBLGӲgK]ԏ47DDDDDDTO0fUac{;Μ޷ۻ=ҥwM: 3SzXCL-kp41ijXzw<q+pll%hkkf(l:$h3p4ڔnᅂSX+̙'JI͝ѴYӢ|ڣ=X|6a[<@rIu)DA ;fc͇ψ9l-밲eZ2I4\ ƭa|;EU6u:.nCtVԈв8p`>y<|o;([M14m;F4L,sHLBm<:ߨ[h2puذ,VprEQNj7!"""""  /$XvFBęHtI4*2gKHP =WlqqJ8v&XK)vyVm\?N%AO=˅~UyQ!4E`\鷯4p3LCglU$hdLȺV:4h.l\4ס00,H}sn4r>J m$ /@ᬏ1a|5O56MbCÐ&ݾ.4|a>{>QC`4IAX1'jD*S''䕏 &nײ1J"M) LC۱31sQ0Wp~fA;?9L=ڢc(< [[9ݱ4|x9\z7WIiŸx`!%ը+ ,V JNq-7].-׺h6m< 3"}CqZκs;܂Ǡ/1mV;;vC)aZrG rAX>l]~9cyw^ĀV&5ni&*\x^UdؒRSVxM kaTŻ ;=k'm_g~xݑS%6YYkw@kVBt.^5\6lC8A*g imxNiѕNd:u:2zF%]fF1 yrvvЬe*C@1r"RСcP*\T3l y#C/us f<}}w"""""܏>BTBQkG%)B[fllG=C"owET:xQ%MI|n'UMDDU޹ŀ۴ZbRBɽW; ܛ8}n6ꉱуǣO61333_N(jX5/b'A!)$vErf>4pk '<&""""""zRAjov7Bz'AzH""U,]b{JQEz"R-CK =$;l I(gݙ3g sΡ%96hjuSYV*$""""F@"5c hol6mq'e2HDDDDD DTkV]1疙cr?/,Ɲ44TvKDDDDD1He6>wAbIm6Զú3`5d 9Bc;P \!vR9gYkARӓ&qvvj3 ".[_~YmPV30ɝ`ԀeOFOʤk49|1eZ@rN;@w$.R{~^vmqFg.`ǜ\;"G! 4|?˷B`eӰiֱ L2cǎEBB~mtkc%"""""j j[ӱ'+~Z; w3GͤpFQ~!4IVpU >1;' |< ).W_W.xR’og\^v۷R[Ǽby'OŒxs'=ESPTPdUgygaL(oo;,I/\קNk/#(N 1c_Is @"""""j\ji2q?^)&Ӳ-Z~HKfbp@OT t<S0Oq⾏N^ 2D9F7-y3 .DmGte8,}U Hrm"v.tޱm{ptsG8CU۩T11uqu?apR)!h=eouUy` 쀦!׸NB||<&NXanϪ5d R;ؘIxig4Zu wi!.r&_v,}G g%$ ,[ =iw[D3L)1?X "u~W85h> h/gŌC#ѢEʷsw;I};"!qe3;wⷽolkwj6Əxo#giUUZ:V4T*EkI@DQMY rǚkp5&+-،%sw1\.`s)} Z&oâ9SxDمϯj򘄚<~^'y$#m9 p2\:P\E홂E|棷^/?/6W.i=%\-'Y3y_c؃\?kz0.e:,','Q-QC 9]ȶsR|b?&q,G&a8iܳ1(m6М?S%)dZs^)ӧ\EN%iUww?xt'vFa(4oe1rdm_nőy(uS:D9 g3ʶN J&݅_"GȞN.KN13M B$kMkW#÷+"rMhvi>3#I{+\녦iطtlZqci?oR)|H~V8uyUu&Z R5nAi9ڰs' !F7w7u[UJ i Ї mDDDDD80HN; S_,ϝG?w%ߌƪ ^*-E_EXվ\|=Qv*]|)Z߀U-XCQ yӿ˯WAm 7^uVЊXM.96o= ΥX4uDr&+:?96er6SNg+ ia jJs^>ArԺu+ANo/}ʷ0=y .e>ƫ)،mh 0g3 tWز+%P֛k[˗KJn3 >PhPgoh X=ufY.&M m( Ɂ?VC1׫Nje ə =J!1@*Q`P͹ Y82,98mh. P.b*tq`O(DmgAc=e!N"8<%  ǷH ]Nk 4|UⰺjpH#nyqd> E 2&a:Ze]^Z;T?[ "xw/'P@@eN 04%~RH4Qn.]} ZDxwu%{uuxoSPQ+:3 >%[|Z#ZdUXϋ>zuG=Hl$vυI "C"/a4upU9~//AqRޫױNkhtGZ]4?c4GM]UDDDDD80U Sc m\qo G; /߹D7E9<"6?(5F{YQX=- &a2?(QmڠGŘ+|ۓ*3E!K"ǷS}!s>-CNe ;G/@f1OSyٱ BoEb pv,<;oWPq,T"X: ch,^tܒX5 owa’/ )NY+Sy}?Y9k/Q$~qV^Q 3e bZwkfmBY-eipiͺCBVh_`S8[e p @1Zeթe!ӽ9By8a V CԢB$=z{ cyЫ8xJu+.?wwNxU,܆oGZ?F4gVuZKҘ~2 Xy@cg}3$""""Ƃ@.'< bA97ŵ]͵3\fœI!}_>I%4,&cK/SU+~/zePx4GڐxA޼?K7D]tOkj/scZZ ItS?KWbfV!JŶ{"Z  N"[]*{X~z86uk27+/CrO(= ]x'gR+X,i^#pזh&t|+Ruez^W¤2=vRp<21 _5xhu~mRY_ ̞%6#eFDtty2&24 331|[7 X! DTkRLcq,3=@ XLTx5899ςMcS)evKDDDDH\\ Z Ƈ@">7YY>Ds?JS w7V+A@Ve6*5";mS ՞ۯ9,BX P}Cy|Iyjs'1WfQ#.DT 3sjGXp&_!y?)(Hϥl,SІȣڐB01Pȳ ƶgV5YDT[M"qp> ;a6 f !g.'e8mK4 FTt + vn$ZKHLy!?Pq՘8lj^2צr/]V#.>HDDDD7n Q)JtG3`())a G J!&6 zNDDDD 7n Q 8""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""L* "rssPFMtSRP(V9"-)ؗy$]77'ts8{&SצO 2*mnz Q\ ɦu @Q XfZT)H6xg--ۢ;Rp`:rs.? IDDDDD75rsr{,@q3Y9h60 M@"R{XHז@:`l,ڜP!HjeeD"""""1HDf]o~nh̴bQ}ۥVk4ʿVeM@"5cho5m]+cSd KXSs<1u3f)=3He$$blJCcjDDDDDD73do1` NfK@B'i,v{M@PFAೱ+:; v6͊@Srɜ @lJS)wyػh& D@C;? we"+p_Tk0Mposl,tsmÇ{;*uۿl6~Y5pŽOqG0Oq⾏N9,{}e^aXwNg\僶#_Gw#J.0rSơekN!,C+ #5Oiggg6j;193!`js'ೕ:=4# O?Cٛoa`&[,FCȏ|O=Օ ع̜Bاk)ψ1ڿ{MǏBn;6"&.נ݀G`'yv)8c'B`dk BsS8o9y/Fl-[%eIY5Ltuisjc.ʴB$tG⚔(}p2޺/ǚf`*uAPҭ7atս/ ?c#~[8`edd`ʔ);v,l{_6͎@x;~Q>3ҒCP-ۅϴ|K װ4OHlĮj4܆70>3:_XDN^ށ R'zCiY#%V-Zƙ+:Bbv)wxC(=]5H|0 5([cnmhQ I7Gg=YxaHqriN⯥`m8wE[L>84x}4󸄿~qhV]MGssԽ;}AaT0kFqSNEPPq̘1HHiGHDDDDD T+sqmÔ Aj:OV E DhΟĩ\Y|#Q p+=s2e[ÉRy::9:)0m.c_i2h m ֘YeIY &HIN*Zb\wRgcۼ0w>;={]*:Jѣ?Ivv2Ъ9 @"""""jZ*!(PB p _tzU7):&V?AuOX޿;P/]u7JSn kP DE-\QRMA7<P= ? h^9ࣥt4CP[PU5mO?}tBؖM`8ףTZ\:KIH SB}1[,e(~IgTk0zxm`1q*dvVmf Պ2,οPz6 ar9*R^5(D(Wy-;GT(UI˂& ".r<[݆6.`Æ ٩AQm-EjPL5N5u 'E 4e%9kf`3EGr7.`s)} Z&oâ9S7랩/P9#GFx蘬ž%ؓ^]q=MRC˾nj+!E6JS&"""""1AuhwE_;ׁ!_(3=G6W6ڠGŘ+|ۓ*3E!K"϶EnKI~-lw@Pj dF# ; xa1D9 g3ʶN ?Iw׆c8y2'?SL[wv)FYAPhW׻đ."._jh jO!rRj>Ɉq[ YPUE8"5(vOT!#sǮ?c7qks柡c 2DS͜Q%'~:3x~`Vz =[AK|%HݬTz !s,߈5( ~{[HވfpZTchgAZ+aE]a土*W`HZt}`eɄq'1|DDDDD0HD&gIIR !DlkGX4{:Cy٘'LZ`fI@Co}7?ዹnCb9` O@b̞ gS7Z3} gB鏘 ]_\GP{0!9C{-SK\]MyZ,ebQKXLg|F @"5ci"sQ~ t}Dc!>}Fh50L!e 2֤?mXgź@V]1QQxd N 6 RQ (6M@"5}֟iќns?tmQRZKZ 0d-3V`jW!@?4+UzUy JyjsA'1ifQ B쌼\+ib(.\ʴ2d<ʟ)8 ~_ E>sss#""""U@D$CP^^XSrEP~rROe9ϼL@ӈPp`nDEǰ ZBb6oވ͛6 %5 lƬ+X'X|MT3:{Nz/%8ju9YDDDDDtcjMTs8q[7oDII +nJR 1qOHdt"""""j$:! $$&"""""""q(XDDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD DDDDDDDDD U@DuAE /ZKJoo@X!DDDDTdQmI'Dy@x3KDTur1Ξ]?O 2*M""""7 Q\ V7G2#&D,}=W7w$$t\@ +DTk99HLiZM퍯׸Y/DPX^,}m8 JQ&|+^[눈nf!_`q}*dIϲ2V"Nn|eY/?"jkVk4]+ZUHDDDD@"5㍫XXۮ'"jhlA5 7nt/,D11955bTÅ:JDDDDTayؿrq78ts ㍭:kQ,@% ug|.6x`ŏy󅺭.\2m{Q"""""daTI#X43u>zM-^A؛YRAڮͷI=J1{V,ƺ|u;Cֿ~ı}u>]\e2Wbs#ZOi]22UKhAm],r-V5t)&HzE,_ƨG`11}HMp_HtۚcX嗘nQ_ub6O|4 }{֟/ݺ^P}3`§^TejUޚٵ(>*c}[]륦u.չr-V5ˑ#?5cuG5DDDDT8 9]BqA1 0~pshJw.k]Bl{ wl۾XgXwl s2R5} ';|w블W,S}^[@W>@gLC>~jpǵjQvz:u*cƌABB|%DDDDT$EhX'nLהsl,tsmÇ{;1[DVn!Ju[j#ƽ O95'ې W\bѺV<7 B|vLB,xmlj& ґH_3މ㗮>H@po\i̯鶡ƑY/b,3?<ѹWv{%۪shпf{e6O^彰;[N #i6x  }P,݂q Tah;_x[|\^0V|1pQOδèO'(Z7o5uzhSx`\_W:u6séoF06{q"O׀x|M Jqy:<[| Q|o+a][~_wą"]rGHj76aUGdߦߪc+N%+îÇO#VR.L~\ iɂ5ixz8o㮤m0Ixf%\_L[z%Y5՞ĜW(_Mڝzo0o oB;!Cq_յ e3S)X*l՝ǕJ]>y7ʡjfGɇZ_a\i KĬpb 7_F&+NxQL2E<;;[(;v, c 1H7h JQZ*МO1iK xwt,Ox-\y#S@uv.3'e97qx8Be}莝 q)2L-.XMY\qlާdY)Z >7EuVuVɧ]Ld]:վ*!*"YoKBo̝/vD pYY0?P֧ ,mmYP?~uس Z7>~ Ψ,fz gIuGn|m Bѯр"-N_E+w#BƜR : !^(-G*w|dlۆS GH,©t bTt˧oCF๡+~MSFVͱ;WRgyTe}9#!-H3uˑs(J{K8z(b g*~WK[P[/dc1c;6؋ײ݉8o?.E w h勵/,_FEsos\R<-J""(F~vu-E,%,\RoKA D4OmW,ڊ+ zxG}RZJ.~KoC;C4rZӍib|CtujmX:-};ʿUcؔ>-[[^+׸>MmRNaˬu8tMZ_[X2nI> s}a$uoROb 8~M VsיoTE}YvtK Kн r#¡}8^IK/Aiv2zķCrS|aXn֡ըۈ4Eg70 ,]=mWے6ӤC~Y/ñ$URUеhk\;'72U%eކO!Gx_|ݏ8>$8gSJu"MdD(t]m&cMG^~h2NTi .~,F}giӨ8ٟV E t; g4hPiJspUYÉRݍsx F#۽faaQC4,s1\u"p1PJAe<=+֭C߳Sk)A6ҽqƏh>[$Pfh}!iugΕG< 0l^R%j]8y2'?S+bW],ՙGp\. ]E`.Ա:P+RF Hc_gߊ˫/+޷u ,}em)$ % }ؗ-utq;XF!0Thtu *_MڝVEEID^M[WGPث[ ʪ*r\63gP +(K es~נ}]1k=W ? '>gf2S kxK8үg`[$R")|W7Vau~!Bwgl3E*Fjo,"j5gJ(uGguc9k3Dhq.áqN>:q>X8?Cp k_8:('ܲBx ޭpkb-z^@chxg#)N;R(ncX6O~^;% d}WZ,o[,u kj$2K؟Yxx㔹B!ԆXF>^".ehZiKf㻨2tOPkoOANWl^w"JSV=„%_+ATz źߪs,+ܣ5}?&By9A&jwlm[k YGu^I;X*fF=s\BX7DhEQn&eZ!t]Wvgh9ۗbaHG$g7/ĂSAcHs};qqXKe7_UU-C TߎR"Xj @s%fe=1i7 Su1g lHOx4LbftqB\͸H2/xƼ?K7D]@p _^`|A1*O&]n+ۇ@Oqƚ"g@!(P^m<At7MjwlnQ}Д- ;QZș/"nίظ5u@DJw,WQx"(5:ȓOaҕ8UA0ҧ 9#ၗ7e|RxG@war!ik1{mk2$QE?`ޢ)R,BT(:}HWy: F!1yo5O[=vR ƪf\t4|1 0QWUjSܪ>,W]_VmY[`|%gC8튮ϕZw\u3\UUEط{,TTp<8sݷJnU}Ww'Gᇥ3٪*]`y C.Wqc\fcϐ'}YQ`!2dG18 gn$"""""""j h08Hc Q# ( ?ƀ@"""""""E@ɕ x?)PE\)B*k$"""""""j@l l֚*%rs.ݍP(8qFc%X0(({3Kl 9h!/I=u)˘o)YsgbȇxUm ތtHT}="""""a`r +aѺ8|Z$u YzMr-trW`ڢ۽wUms1N ,|_X~ECį g=q1#]mNؗ/GMO"G (j)v@K8nSs K'"tRVe_SBêwOcp iszStmEJR;@w$(Z|g;_trWP$w@^mk'>yK{ VDq9s>r'Rn{ j s2\Ÿ#͓ts2Kj댘>#ph1 s)S0vX$$$76kDDDDDD5 9 *$;BQxl_G⃁PBbha[R#1s)>ן}xnW FGeXӫ0;ߙ'-9%:x G6+ƽU~Ey*~gddݡQ"h.A}XkOo;Cvt)}'Ya-T~y`[xE"s2RR,?|'Nv2.3;x|"=xnz}6"%@@+ ( "HUv]W^EP\E,"-)* PBM @H%!fwٚ z73=sy9e' GP7g>-V/u@pzwlۻfjsUb̙3fy9r$HDDDDD]EjkzߏklPg+f˃ 77 ij6_ݗG -o.ROt[~6B\ 14|\2`Ʃ/jO^zzbQxfŢ{[lb;2ݒ]3s{GA4`٘v; еFAѫ50*`ǂOE6퇽G3cg`\*. nػ~3v-'mz Ǩ^𵜐;QPn7Ȼ[#%3'qgwd>~W%+S/ =- ܽm&-{үAݸ/yZ|3ZM'Gh7W.|:-y|_,ߊ)Ϻtl7TƧ]ͭM`FGX|o[ 7F$?F\%`_pϐd߇ƾwNwF^ Bs3`sws'n4t=li,b]8V$L>=>1EDefB7o-~>8R٬_ rd) ,ΙP_DDDDDtQS\SC޸f5s.c?-rk0 a#!m9SO5"rrJ`N W%''c翧Po^#"""""j,*~G߆jI.c0KÁ1"f2,7aDv< C6n b3]aіi̛˷G3᭖b[M$T<#SѲ~*BN_ŠpRz {ThK[ lHAO'`꠷_HE\`,كYLuH$`2Tn308Mt p8qYw.mkڑwF)Z֯ڎ_Bs ַk+fatkD7sgǶ$7{pMgݲ0Tp7dE\PǵSh!"Ý{se-ca{ WٟͯtM1Z~;u0S|l6r z@.`6W4$:j]Q&ձM "FDDDDD{Hq?^~v9 V,|+c: Qę_d^̢`͔G h,1N&ӂpa4e"Q8A!p`5;g~Ɓ%v[ bJVNPud`y:nwhz |v02}Ymgֺ/6[gΰn3 C|VoGEwwc v]&-_Tt8_ S$k(gU٘wBоyj9HG7mBNnt!:` :QT!FuV-#1 %gHDDDDDwtIʒT<*4=zs! eZjvw%TA۟>EGo#Kh,4V+sﮆxP!k7~q3\b2۲l>5cIlSQn-ma8%o߼Y1[;3^w_spR!oz>#ߋ.߷~ԶNM#]rzdM _K۾ N5UCC+6I\afV7&Ѳh-+ˡ%DZSF B@_-:譖 XˈS3DQ6ۂCDDDDD{0HU;dxOaj1~_IFl7jvhil&)&&?cDYc'{Q7&*`_v(5 t K@=.aĦ&04wZ*H^u^ 8WQi.fL@Z.=+:]ܥz^8-:hm?>N/Wi7|c1},~9k߆:Z'JKyD_y+ Pz zg"]O&9Vy"OB|T#-6;rk`Gv)<!E"FS&vS-Bc!N!˚mQP2~f#XfE`f%9HC]fѯ@ʽhĚˎ#;;n*bq?0t> >wr 74;\OpgVД`%Xq" 7io#̞HlnZI5wPhxy.^8zukY#.VB;gX7ut"Xx#;WSNMunXR߂8emqmE'2mJG%s=b)xލzƫfaEg35(f>l.ݻ.ׯR~;Kᡡ6@[d>Po"c/X-%ѹ`)ؾ[仧GX+ I1CG(Jg>GЖ7ESo/9W갎h@v1Xt.>p(Y##R)=ؾ ^_]^w%@(6wyr좷A8Tx>|leU%huI@c^]"""""X"UCёMM.*Hd oA%3Eo?-$'m<{l,L~#7.n}x˯bGߡBDHBk}jt*K۱m淘m7-i  .s_'بCi<1_,youmpS;?ȬË1y9YrZf/2 C0V"к:5!f%)I`nRoyRX&\xZbK+Z_=8kZ7څe"i1bA X!AH0bSmޙT0}=3&uq lutP0_٤_5wAxVFDRb#P4[ @"""""p$1Pjڈm>i[(cqRVZ%Ho׬`}ly2׬?%@N*ºaHLסG {sSpKxΘzSG0{ٳr`$&&B@EKn~ڴ I]h}="Z*Z(SO8- `&EMe"Dd @IfZq?l}U_p]ߛX5O/+;S'|:(HDDDDDtq$&S`OY._G Jj(zcx0a=p\,ܔiϭ\ <>Q%FDDDDD{,"j*K֟m<&8Wd;ߍd7+s?\vE&~,+o%` E`دg8]T c:&:sg b4z1.D%΋l ^(J$AmYKCl@:Qz/ GEQE/Ep`ﷳbcw.dvꌚK 8u@3QPr:+V5>" Z7ٹ"n QSRiشqқ@Hp:{- c 1͜׉ mŅسg$%wcLh庮8s?o,K@ {zy!!1 >.ODDDDD@"$A>%ͲCd]$""""""""1HDDDDDDDDtc* U@""""""""DDDDDDDDDW1b ]Ŵ,"$IBqqJJa2-DDϛV @5,"j*%ؗ{HNMR"?x?J 6>-cܲ`:ڮd8?kJ%Xʃnxy8]|@.w =bl!C~Y>׷í{e1߲d3B`%^r螞j'qgwd>z.35k.m܃b3ۡא!薤Go.s_qD Y\:nDZ26h0z5rdyX!<{丱̹X8Ell5%AӘsJ ̓paX=nz$\iS.(t2'iԠ 5pixH^ Bs3`ZǼPO*/?MpY9j"1/vty 4~1hm(ʅ yJ΢J>=bzدeaʭ8xW "RmxL[|wX\3gpf8Z[!=-Rhm*⻽ _X |E ;Gz)Xi)X'0j>;iFxӚX o}coO\Ñ=G&-[0vJgkj] h)┩CKBD1C?EAA9P1@ ݇ҸxxTU/1{QoFkrFqxhD"ܫ {"̞x /N@xFWτ1kZ{jCLjr̚ϦA$<<8OZ8WСh H,|•ۢ9'a*A@ކ[S`xOrvΞ6ykp#tKj9-x o.FFaTs Θ/$9:ۍ&PהZ1:j0("gV=oS4^Zw A@,wۘ.w Xv6JtIpųd7DO^|^[RvF@H7l~ܑTٯa0w)o >I"|7=m?k}} %Hջv)uz \%ՠ|^B;Y:Q}8PVɖll iwf}HDZ5Z,(*1#2 Au2Ո.)D[0]v"rHNNɓ/xsia!(<ѪE4hgӬۣMKe;p5:/_2zljʷuh5|e # ؼoZj6fD 7st &C%p?D swN$fT7`COn{{]L4s  WB^q1 U1گ<|<0Ě0p~#|Z~|oA\m:?چv"jܿП-6) h/х0H0e鈸Ъ?9 $\i:yǪ+q0#ۻLF%|p:횅v8”G 6C4O c8n FLsj{MusZJ:sҶuJ3116+{:'a Rg[ Nm]Yx |VeRm=fפc A|M4}AH:` zQT! G ?Oǐӭ}{ SoF|R ( V—1qkK<@$건kV2,6,#Zy;,n GY6Çwj_'?Nإyk럝DG'Wh?/1U^`:?૙c$-Z_kND Զv .$"""1H"|᡽,=ɩS&Gj{.LQ D]ˎK/|L LM$wØwIn&MD "ŵrYB҇J ]2. I1Uc¾Pp<HK=?l :~V]NuV}r4}ODϙaQ5)0%Ğ3#b)|B;ԩ؂v!QKgez<=?am\W_=0;Kv"#+Y]dv<lZ1fQ#0H3-GVH NlZp6̉ Fm,Z3kp:gmMunXR߂8emqm=#m7-eߚpCj(gp<_Pk;nZ= 0wD;];ײGq] _!+/w PO{3ڒix}qsdgcѭBL[<zAhX~݌\rZfG%#5{`O viK#zP5h|$GZ^ -VH]b) \l7w\O<"zM)Dn äoA!p.D^\%KQwぞYXYDڽ#݌ !4#'?P-޽PQ߭w%sN-~L|>Nbݜ04ⅺ3kP]Kpp?* ASزl *+\n]5 6\>/c3HR-gYhmNyKHDDDD c0nrZ j Af\? {>g?cO - =_da0yEu$tr ^hq?\,sL[X) ]  O4 cL? [ C }l|=y׵]O Fdۤngg*`"82 ..{OÞ(9X]+wGdrDATNB(Wi|c?łzZBѥmm7ֺFL ce1e95 DrO㮑<sr|M*j_/4r=ZsL_dlNARX&\DWwĘd)[;K*hZf$#PT!Pxo^.R셗o(b21Yfs翍ݦ/v+c.1b.^\Ѹ10Ƿcժ8]n/I=ND̏g>jH$%&:!XdDDDDpCS/?B)ETmZEölSO֜^V0iPobq֣so>vj޻jj .HN]1krb)^z~= ܛ̿ѥq̞3~~~8{,7 k۩EnnXt1nv+ \i-}/%B}="Z*Z̪XAMN ې/]s%e #ql]veJ5 d+q+ߺ95 ^m_B^XW ӀѥŬY`awLJ YTfQ0Ht9*Qp` 1gʪ y"Mx~2}?u<=쯀#x\s8}8 kb @l 7N$kkOD4 :&Y"j4!4J64)0H~D?' re%>чWpt^%\a3m=#/md.u 驱.aEѩ`km+5Dt~-?)0cT'UN.&ves @""""j ;JJiQU;f1C _:ʟ}lQQL>Ep`Qv5UlLޅNQSScZ^% jVրS_X?Ymm hZ]|  5>%6M7 y 3U2Z:`y诨^}m{X"5@"j2QA`TVVPW%ͲCd]$""""""""1HDDDDDDDDtc* U@""""""""DDDDDDDDDW1b ]Ŵ,"$IBqqJJa2-DDϛV @5,"j*%ؗ{HNMR"?ݒOXg<7lx'0 ;ᎁ}1ڣ UmgD~7bĈ}"P[0w:l;\g({cX=,^W;.&n1>5 o'rrr0c 7z^l! R1ÊHt9߯Wq0&3c} ~%  'mxnp+6( ZǔWaJ燶%'va͂o! ~{y" ~"݇c$Y eg P|7^ns(9-Z/bwql[O`ͧstoL~V׾y+wcѧߣCo_|D᝱Z:J1}{]XYl`;93g",,:rHi9 5سXYA/<^qn3NH2f͚降ǿe{g:CJ==#R@ā9O9|?߱[|mǐ_x5p뀁j.4cwrw:35k.m܃b3ۡא! A*ϟ}p=CGz^>_JMNDϠ_eΥ1ov+knW G6!qa:WHќ^V0iP49'+<V㦡Gj咁R;N'}L 9OR } Te,?76u lCߴN-&z bN@݆b=m\gw, Nh#Fg|w/ sVn3n#ƣg\l])߅cErJD(CzZ<Т ڄU׿w{Az+ywSʱRR-U˱O`Դ}wҌN95{rA2ޞ.N#au-R;%ϳ5FM?h֚ٮ4{q ʡrTOKBOECۉ!AK柢 (HDDDD 5̰7"(jjPn{~y5VWzخ!rEw)@l܍F$½.Pwktsl7-L1>ؙ5 MIڣy{4nm)K̞E[vZ8WСh H,|•[9'a*A@ކ[S`xOr9=mBX GA7ԈsZ\^~W`3w1)@Irt@͓M&EQ#/)gbu` P*E֭8y{0ަ h,d:7]Yܷ1+]A{DzQM[U>.O&!z82 ڒ*0ϤB:g{GR g)g1:-3'}i8' Uyz=/+s9T3{a fD@7[%[ꚲͳY+ic߁!u2x5Z,(*1#2 Au2Ո.)D[0]v"rHNNɓ/xsi-!jD%ţ06. Z#(@c!np,; n6-FW띸}\ ,\)Fѯ'N%>p #&oP㻱v:4\ >% c﫨< j)kePS۞f1M%(?nW\ Cj+ 8?__Ǯ=5}qꏶ!j76#6) h/х0H%Ъ?9 $\CNűJ1 q&g"&\!Ff0Q&ӂpa;dBw!%I%:zNmЖF-!nR F`d=+*l} 䴽κIVS[bvf?^j7_U T[Yw?A.p|KL0d嫱nc B*uh97g) k;5gy:nkz |v02}c_$GY5 G[[W"YTmu^5 eطa1O~ۑ%d9wk,8̲р>+WZwØwIn@MD "ŵrYB҇Ofb6d]2-E*I1Uc¾Pp<H5?l :~V]NuV}r4}ODϙaQrbg)̈Xhp4߄1u)]t8bC'xo+pkv,oz(rjY#a5шj~ص0[-Wg~c&'2p9s{OOaXW̎o}4!Het׿[bvDDDD R#xŀ:!b+At;K$ڶ%_:#sq?D!QU?.j- Q&mˑy-RBa08 ,(y_{0HknZI5wPhxy.^ wܴM{A+ `vv= e샎r&ٟՁlJG%3k5m. G:״@j H8'l?6#Ƒ]bd "ovv+seֳ#o;q!/7>LkSWn äoAS!p.D^\%KQwぞYXYDڽ#݌ !4#'?P-޽PQ߭w%sN-~L|>Nbݜ04ⅺ3kP]Kpp¹?* ASزl *+\n]5 6\>/c3HR-gYmhmN,xKHDDDD cAk/%f<Ȫش]):=س`~{B'H?!"s0d?o+'S{ܴص#dl~yl Oł?Ǵ[eB`P 6 cL? [ C }l|=y׵]O FdDngg*`"82 ..{OÞ(9X]+wGdrDAğTNB(Wi|c?łkzMCѥmm7ֺFL ce1e95 DrOROb\\ oEBsN=.׉?E:u:(z E/6'"8#Ƽ%K9XR)C#2#z?{L|u2e/|CFt:}\7';mP6}^_Asqs]/q(=V-r~Hj=OX%5v"2uJ.Kod.Ç`9ٳg1HLLm \XN(ZƂussNJqS[YxDDDMl{)ehֲuWyjeVEǢ nrZL؆g|rƞ+τ-kp ep V|r=~ƍڃ5MN |nnn?MeH (9MJDDDDDt ACgK|vyߝ%>чWpt^%\a3m=#/md.u 驱.aEѩ`km+5Dt~-?)0cT'UN.&ves @""""j ;JJiQU;f1C _:ʟ}lQQL>Ep`Qv5UlLޅNQSScZ^% jVրS_X?Ymm hZ]|  5>%6M7 y 3U2Z:`y诨^}m{X"5@"j2QA`TVVPW%ͲCd]$""""""""1HDDDDDDDDtc* U@""""""""DDDDDDDDDW1b ]Ŵ,"$IBqqJJa2-5Z-QX DDDDDDt~$J SSA``*s8qlsBP|0-mg²垏`gc(7t\t -”)S%KbODDDDDDT&J*8`< +j/֯_Zx>Ch⍑-P =! 'ބ={O7|bMAqo+Wʄhpm7X'~bVp0:s2yseIVh;b7kSܯ(\$+E~.d~sP; m&?U嗹t2/^ gggSO=b[ka hhY/TXoˬ\Ԛy[׳Z|.a B^B7>p?WC:_w_hSWJGeXQD qA= ha;3;7x]H/[9a[1n:dm%6?kiZc-*Bbut #?}]e׸+i- >!,DdDیuq7=~ MSBʷ\~.._ַ$%%˷ʗYc @""""""T;<$ {,rt̪]hl}k#MCnkrL{m [r ßЦ#Ѷy ZJhk"݇ξRfQ?ƒNxhT<鐍3@yϠW-D, U!'f!w_s/ZXycP>LdeP Sk5"As{}|Οxs?L*] w"پ,'eadv2_[0'(jŢҊ-D 2A,hE}D= eB0Cf_p=/.QQ`n\: =ߥ8%geA5)*[\i埬(%IUGP]HQ ԉػv'FK t@aYD{NO MҺJ0K~-.o. v)7rWoxʳEwwnp77)mZ ݜB4q}!9ڢ5IDF?^š8yAa 3##;.WO]W/˗d\+-__@ssXZ,Z,cIKK-[Q jVp ~/8Ȏ?6G[̘6:áT#3ѥ;K9wl|2x^fj!ZE~ǖ8gZ6&pގ0S|l`e JQlƲ)үZ Gw8ZǼM_+*׳]У[&%-K?B}uկqqntm-!hq#qnEƟ΍P;m3XAX M3ݭZo'7ǶRfE:G6mr^BW8ǂ>&  Մ @5j7o 7}D9,-!;;>wȔqx幾hfZe0oQ/1%>CXf'~arD38ưWjΈM۰FrK8IV!OEҩVzxc}&hx9?^^u/Â;(u=HQ+4Xp_7~2wӯFK3x|d\?m6F &o==:r5b )J{xljho)WTKYV ܾ3QQoO??!Aؔ-f(] ҩ %rv%CfF^FCCQXXP@1EoiK[QEWDcFVVƎ ???]uLA7(&Fw?GDDDDD _w Ǫ23дEU6rt-M%J. ҝ$z+i(ŭbD-w:>=q}||ʮ'P-JɍVj.DToR7A[k#Pz;6T9_oo֛PJ.ΟpSd\j (ǞLQ[oVQ|/ܢ.Vr4J.2Y$Hk̞j _I_sKVlWVUDzE7Q?n KuYWk""""""0HDߑ =# f@'ɊD x[rY}KjVIIS) 7NɊ.*W,_ZZ*LLMYv ΝE]PXXO\ݨ(i%d2Eq¯nN~+{$>E-KBgNǗ [`P0؇"Ys8:8VPB5ʿWU*?ju!XZLQrt/Eȁ}cPX537?}j 5A!0(D?ѝC/&DDDDDDDDDF @"""""""""# cȈ1HDDDDDDDDdĘ$""""""""2bL1&DDDDDDDDDF @"""""""""# cȈ1HDDDDDDDDdĘ$""""""""2b edf1DDDDDDDD(& =ٓ U.DDDDDDDDDF @"""""""""# cȈ1HDDDDDDDDdĘ$""""""""2bL1&DDDDDDDDDF @"""""""""# cȈ1HDDDDDDDDdĘ$""""""""2bL1&DDDDDDDDDFLPCGDD h4r9ԔA#"""""""jdLRIɾ}PUׯԩSP(h޼9uO Q``lٲ-ӧ?WWWƍÔ)S0m4 =ѣ~i\)(}v֭&y6GdCd08l3ڻr3u)VHz$\2_u݀eT?+d1MsVu}Nz/q?w}Ws_MDD IJJ {9r(Ex1ydKͷI&s޽{ǑƕZjZ>|?FP/ދ\(=FS;^S[6bwdfMGC8o2 (;_9F$oas,}a x 97Nb%l^:5C KbPxe @UFsշI}Y1CbQ6V#"DZ 0Zbb".]Gynnn*C܈#ХK]qqq1c;Jߍ9S>ɀg{DZ:I93|ZģC'fcdhfVp EPfpjkFשS< %>Q1^x{sYY|s_>9ҕg">;Rayfؔ_F1{-!:)|of5~E??ЮB^Ĵ]޷pe$|wVvxYV ~nˁ1nZfo*&᏷)ubol2mGx5ޯCUc1_?LM ݇ ?!<,Wj:B/:0uv\w8[)$n>r(¯g@k厦F-]W¾OǂiBJ 4FppCYnsݫri"ùZ{[^52&VRSSK~~~xGann^1qD^X|UCdnpm8x2TY9gA\laoo\ܷ M`B2SBfbK-n T"NŶ]cԢe ʢGEjAB^4MBvˉ6vA;C~?/ v2=[iX_Q` Ku14kA|}6\ bY,9G1% s4U N~1yh,ie Z`/^oI nȺ+-}`?井McxP -.vÜw߫1cßAZp?w/Q` VXXUV;v,dK D,)xU4ƏQHƦqh9f:X_1o| N0DAfb2F%z :΃iװ.ULS#c5\)jʎqF@Qkҭp%]_{<8i oPvh8Nc;)}xԥ)8s9rד2Q kHg 5)9[S u.,?ĬBm< xnt{8-$2/y-wDϭ:ª=q5E 3x0R72w  h}4wWu1PڣxC5VT8 9X`Y;=(\ܤ:-+vE|)\B`-VMP§1'j0>l|[cR;L~*_B*K 棸S :*k{uu]j=\n:ҵ_UǮ"1%0_G<:S7-K1mJm >oJGI'6kV"ut?~- sƳ~tme4wuPc*Y}\m^X< CKMxk|%Өi۬y_$*k.ܸq9rdɿ\7mU+eJ݀cccw^ND-؇xW`؛+culčkqTahcݚ44k_ qxDž֮+h1> ? pq,O]˰tlØ )WS c퓏Y63_P䟾,\=})^cʔ@qz˯X< r>& +.t&:@n٧Xu);((֝t?N" 罋 0Y/&x䙷SNY ^@{)s AկH|q3yFb l=?V_ac2}g8o *&y+k.?1>ڷ?q.1:IKs.AtfM\.McQ +WAq7e#9ë 2?G-ZWi-!i6&kxaHM] ˫~ex9~jc%ګnk`n{9u:oC5Lܐz_e3Eva~;1ca1Vyً\ğ܄]hT3TG@^c_Rkm>~ΨsO~{ >V0h?.s11HKg:nם_$*%CD_M~7|,['>'%ŋСCݻس8zAK3vlP*\DDTѵYn\OA*'d0ݔ8hasJhSm3'P؈[r^ g,F~{my1/aÆzWX0eI$g,NiAzw` am~n+1N0E9Щee M NEj^0ee,mhյW)7_h;ȗ9p<18W >m*ȠM\|SqYcӮr-:on+;!xkpD&j:59b࣋K<+,Aqml[R|[ xm7Ff׆[קuAuOg[oU51ԼT[~ũ~[huLGh6-Z"_Jv5J~ʪ~Zwmȉ <BA$_!t|SVRZp5S{ܲF?K-N;N9#5~}mձ!z;κi{w/u6;U_$*g;6k 5ܹDz.V缼 .蓆 jK|@Q%W__oc'.> Uv,*Ũ1"?GVqwOUs.j/'@~FD_70}AojkXsЩkYW^Z6sc ? .*g x2:7BLt'Xvp:R7N0xa pxۏ iP)@Zͽd qk!E!:?7>G($Шu!MO0^R)Au XT2Ne5 uشGV2|s88jn~Oձ/.qGE,*};K]My][5\NJ`xX}W724ȱK},4޶YT=eK:(""B777899͛ں\zpqqO3223; dXpa= ¡ps#15d@]|sNitGpp0DDAF4_JVP·w%.S억8 UN<'T"< Iɺ Ci 'q|Wh? \k9+RI?yWFFr@&IJ>M<ΞO_再Sri^{K_?ن8uD RaW\b3 uU޵ {jоoݴo)J)6 g~˹T}Rz׆ ļNOmܴjlao+Fl}W72fYl7ǜ.fW"{[R\J߳>[& 5]7вD.#WjQP.qTP))L_/ar!sxo 0 Fùpqɫ9hu4-7sڌIrx`~&h5x0Of 1i߹źgCm/qX.U_' 䉷×c[DeXㅇXt+)P /_~G|.s `c_>-RqbaL:JOmn8v<94@޵] v|}zd6tz?ǹ#̽3ܿЯ3$doPXAKYhx,Z8Kt7=~MD 0'iׇ1AY7x{\_Cx u!w*TP]Y3V>!$B Ni5i}]s{}mP:jH ~j~[:@uگī,>ֳZx:L31ـ5Y}Mja//zqEl[sp2{W}?.B}3g`CzEݹ {٢ѳ;W~]]cC5S:W3Ŧ+&!ö#7Y @bR"N]IIi>>>]GwE~tr%]/ؽ?}]7GmTD$"-0sA1r@HGZS5qm d@<CA߀:@X=93\l,6.h:֡1bekPprf]śygtX<,qU]RG`ӗdNߡɵacbAD#Iu~]K!ѱcG:t֭ĉann^gfΜYib;wՈX=?ةPzF390=Eލ&|Ú@b>FxX?L틘a7nU`Ch42^zս01 %)+yco L}i~+;$Q Vd """""j1HWcǎhO5j,--Unvv6VZX888`iՙ@ a؆j#pssSyRkµk"-- kZl._@{nj{,z> {Ww-ٳ;cL1G m4^ l=*i=UY) h1>og23ةYHUm.]Xj͗9RKkoSLa$GƆ"2cW;d7Rh [gs%꿛y9<E(BӸi@YΝ@Ӱ6%pb&Y{&͛5LUIȑYA!w0k(MB'eDe}#t &G+makd <UMGŶJ?OǻcVڠ)2tenZ8ʅxvU3OMa{Cly]㤫'GNTO,`c\sm̸$""""" 1H֤I5.RN`ۮt@C(|9k9 u%= [7x-I{X'Z5wG^Kذ(EmeiVA'R( xm?oD;ΚgX#w{x#U1Xi+3:!d]1px:4L;. 8h/|bwXL!32~_ߏ8wS!a8qlٹxA/i6ĢPpBWaj[$9}/"6AK%7S9[r(d47OG<^ԿkP+CuV yl8RcZ$+,*W*^q8S7sd9ImZK.s9O<뇳gWWWzR>idddpDD*BozU\+*'tjZ֊N%i"⨉55(~BY*n0v]ǐGBWJ>'X!tP_l3ٗE{J &҅f)$ew+V!_ZnMƹ38r,ݏJ<3:ݺ>՗`{LZ09,@ᩋTm{9yfp%\ՠJ7O ,U%{D߅,)Iy SuNEVz4 """""+\L.Gh׮vڅ3g{%ɽj+BQj$I%))DԿoi:5ԆδisL;Gqar\8xϙ}+[ J(׭U>K`IdYb 6 ͤ?9bidv+AҴ 'Llg?tҡBd6,y⺭'NJt^EJ2 C aÆupww׷A?H=<<ƙ6m~0=gg˺jq| L.d {[7bQ],Q}-QG!@<{om@Vu2d7-|gCu@Fø3Ox7Lri f!99OJ)!=>}0rpo'*Kt֕|q=~ٛ (Cѳ{;rFN r*tqNjf Q7o|:R%|3P!$T?O0nIkx}W6F""""""; 5333jJ?܉N>o/Ǡ]˰& ?:{׵?kB"$&q<an7v(m%}6 8sD`Ui57 NqU+ML[eji8췕#;% ]{^Zx;.fcg/+E;E 9ɾ9`O#9yF&77ưcޞd[0G6faxt8:? G)Q5L0x8:V1χBWa}篰uҵFsw$7/b/6c3K;mк97{?~gM2w?!7O˱a_<_:>!3@O0sG& P~_; b'xWWOA MMh^"8m~ͯ%X#9xgl/4s:+j38xuk_T_je”\Nc6e?S8B XCS1cB$,7w6vJ7鋦 dD3אo토-eUR zARbt}UM;ty~V@^&ra[9`Oc{ | ][ӳ T1 ;%آss1>hn* &p %_u$8s`x{/UH/ +SLIjDDDDDDwt(mUAJ RKNeA:7-tx/#x+u`899#%9$΂5u` ɆFѿ/]0/7i0S~ArAbbRRA@4 <=}`na@#$"""""""2RRO.DDDDDDDDDF @"""""""""# 5˗wI#HII>)gjj g''0wbȈX\JM?Iɘ0aB_x 0dPaff^{`bbRa\Z A4c 0DZj-ߜfCYd\$"""""""2"..FvDDDdT\|hт?})%kG&h\~ZMjK7zπQ`t,FTd]KȥkI7 ^D%գdEDDDt7czIIIzͿXDDD //*)~͘$""t43]^/^Y"P$dY1TEDDDt7ձ讖333%k׮K?ԥJs} WS[QnK BcC' VMC,@ZL$bsGh;H8gUhr9L̬` O/8[+)׎A%uTpզ=zp*7ZdFYFxjw9E0x4lH կlXYYq#""DDDtWnP2<NE㸒c&^hnoZTjek( Z[f𱐡0#/)5 w),,6aNiP#9. ³U4BS0K.^Ȋ9 h )aH3&n դNN RV$5HtV-w' ɗRB: ¥}ha AG lV*GDε8<2fVvb"VJ<ﭟ;ɜx *(3.Dk/pM]=~J[w߯ygA7F5hc[==N~ޮG"\޴ K5=`J\k6rj42qߨӑ31\ףՒɄժ[;ix4]LUm^,h>;xdr|fey]c~eN&ʷN t~\Vog~΀wMEte]~qUFI[[i5ښ{q*o$q N(6`-@`5+Ͽ( ^M~t/{q^S)y~M{;:̼=*꽹U}u[}缯FE׵QtN)Zx'|Uӡ^ Mi}c7g,=WhUz4)myͺ*zzCC[H3i9f{kr)O.^TQI%]PƩUPnM>,2//hKڙ~0.E岲,EV(CΞo'{IOg)Jy[* ^Bl^f>DR+\񚊭_/=zI׫m}VzJeU$F ium/G+< #Mz]]UǦ+/L*/uJ0~Y/lh){\MnιrG/' ݹ Քpn\߼ݲ/:zPۚPcXzN3s@3w@3$OuZZ++s/ׯݹs?uop1JTEͬ4_Mȗ6FSիW:Ƅ}׮]#C_`3Kl799~N@7 'ӯL u;s*Jj\1ӏL23 e.Hݻwl6 85L?2+ؘ繺}:'f?@0 \tḬ~& `b? bgvvʊFFFڋ~i. :<Ojii}\y,p5vgFRX K LS,555ݵmU*U5 E:}q\)e*f g ̳T`9@1F_QYBLƿH)\OL\!])T0O`Q_S''*GA#W[&/X0~-r.J@p 0֭(-S YB8S }حz=SQFZn~Dn0A0`!@# YBЏ0" O1 "80*$PK`%SlO5JoɣwyG l .5e5[V |Tπ%/` !a^0f [0 :g ;6;K}?8: 9Ͷ  UE|Ow۴?@^3 E뜲Ax>ء@#c}2<%1@ #b (NpIENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-adjust-thumb.png0000644000076500000000000001422213242301265026113 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<4IDATx][WV>k;Q&8F!0Q2"(AEgAo$FBH8(L2HL;Ub]uWRz:շk>g} BP( BPz(N{rK/Wjէ(e%IBIe儶G2'?5u<$w{{ =֗__bT<[5'׿_[VJRy]yَCB|o/-CE9`tѐX6ٶş\=!q)Ƅ׏( #.oKyr9P)OZ@=7{G]ˏ~rye"r!0?ߴ~N-4˔/hqi nʋ9jх OpYp7 X ժeX=o@r~=q"-+tgQLjF{l |Z SV^@ KA4QJ}Hڠ 6f(H %>nw(}>3/m!/?6(aMATfU2Y9GM! ~F}*2+^5r!5WhuynߺA5ިשyǦ[[}:{,ɹ4bAD JB&O%Xk{w/  ^:Ƭ+"f\łmb% e4W3RE(sA*5rTԘs!k"_T)&>Ӽhld|?^{G GםE[,?u)Ico3K2 ~ۡףf+¯8A3LV#fnL '8\祅u˖V7IvvVR&kg>w4ΗNv} >۽iEI1aɄZlAu:=*e3!91z>*To,IGߌ)F^IhcS{iyMm=BNzN;Aؑa_7R;#GA+#ݖ$K|EPZF{GLvfÀLGz{ M?G" /H# iSd_|FO dǷsL?#?7DSĂjCg? t^bآU\2b.1F\hPI1沎畨Z)RY\D%vPGt|gh#_,XKt),.Ѐh(3="P<@{xLo=AcڬT- nDDIXH}٤F:smHnh˗?]9l)ק˘i.T9h}ほv@{Hw+u__&;4}oЌ IkHQ(;8KQf\.ɾH A#a3DHӞ%6P!E5%ZM5ʤ&F]Gk'ۣ,}!DO/$:"}kl^> OZB7_sgdW,|Q*^"6-/3FVeb0b ]|\XYOlmsl0\V(ddy1z<l9-54!/6? SXb pУfKz'6$׈/'3,آ,]f+det%"@`}uy v[Hm%#Yǀ=.s9&'YZe~C?J07-|nȚL?V:C eQ*CI~D߈)+t.Rz/Yejhsjf THQU`A٬āR(zhbYb~AfCXua5B 񂠟 @4WXV dE?IR[Mt66a-7BZ*Jlѐ1atW+N0A ^:omSѵsTXȊҭVg>&#zD~f|Ac;9Y B恐smln20ɘS͞1@&LBMH̥H4~7UbʟVj0<ϟ;U&j]aswH}N "X*RX iE\g>?i-pd(w҃9ytҒ ;zl-+ $u-=q>&ÐM8h")|_"D\jCke皛B`N Ix{ƴ}VEvKXBm7'WzOhQTHdɼB|WX[[cS B룑/xҚ˽.-qT-:7aTbY`.mmnYR-H7V?A98d=68NѰ?%Y㔸8LV+Ә3eC4/23 򽾼}<=yfs^N`!b uQ`ϭtA祓(D iw>fº?H?B]1Bzla?09c;>%Yπr3/r3e-zE{r{ ^=.j8d,C۰ C؏pX[Ehat5w\[Ȇ<>= SgސU,FISb#^+:  ;)u}.ӝ+׷J #,QRٳ|Mx H\^YD"f9#SqjՒfDBC HF-&X?%VYb:ݸqCoLj;OѫP3~5iɁ-.I?usJĮub|X;O )j!Fݧ>bš"NdQjtkn0׭BJω'aliObl 饗^eM߿W š ~f:0ց08}7Q!gW9R( AF,zR_=$- tdks2NJQ`R84WZc&z0H6f3?x<{!2wQ(9AL|]qDJ~raGybB}=¾vYݛuknay.}P"w䀉81Q^.#ܝlԎܜ"I G]Jo%V(~ ArLf=9,bV &s_[M,21mnDQ͞?}착Ԧ\ `<ZD8<&Sk?pnxrSIPU_g 1[ !"H.\+To3ϼy_5,3GCX B쏒Ɇ:f2 };tk+0 SOou<:S a/k5Qx rvT. B|̤لmYf_Gfbl볓8{9"S^y#y㏕ IzfUdTEo2&N*t:ZV6<XW>K&xzݐd^6uԋ{oF!%D ur:,9cj?)5lrYSlX#? %|tШO`w@JUfzqDP0CCḮ?*L2 ۺPht ̄n ѢGuҬ"vi%2osݑǞDc!A& `$Nb9꘵!S|:d(,YD I f r=ɧ zo %ʘ #E ֕$ Kh2#kIB2Xrs9b%ws5O UyF: EZ]- A`-Q<@g=4=JY! (10OD0oj},Kz ?Х"yżf ƬY-ZY]́VXK+c,V*7wɗ@:˄X6M1iSW(A`$)TxLhV+5,p$m)L+Kfv$C݃~wD3e7ץ$'H8[%C#"x^2jU7FfN:S~/_,7ޜIV8Z6՚̉fCoKWfzNlmyϟs6;zA2ܘXe7>ɴ2?}͛;̱CC^~%5ELjl{>z-:']q(5,#7y}}>wйp 8A{M=hU礋[SNҒXAf {/yv%t!ϓ}:~ GW^ׯЮP+ ~`!ML؎' ױNFm$\Ȣxty$cB֨"-"$z^,lJtm0hզbHK~n=! Yt,L'hZA#8v:X 5eZ7 ~BV朆( AQ(VR,_Γ5>$P,*CoL+j\ГԲ$<΂(yv`%n$R}}5Ib8]ZZZ,YUtf_JerOTix{,=(Τ|6;Njv]Xvp&,7C |o5N55=Y6k#ᬉA8 YfĮ|”H֮Mib)JB P(A DP(JB P(A %BQ( DP( %BQ( DP(JB rHdw?\ EmY%:̍ t>rVA ꫓z%鞮y(?X % BtB P(A %BQ( DP(A %BQ( DP(JB P(A %BP(JB P(A %Bqi1fj$I|? 0|J_{Nݾ}[f㼩ec|Gy87'}npvLjvx+3%=3-纔 'H{TUz?a>}Z! #*T*ʭ:Z:-BjT+c2$\x/7ɑYP݀bb m5 h1eG=LZyká=cq|fä&Yb08_`5g}arwwt:;1 ǸL/jDO~lq&V۝=Jeߴe̝Yh֔kOSq^1;~'csM>5R r{˜arc;oluQ$0 (ggyԍO?ddE i}G؇z޴:,?}|f[~tfBq.Ĝ3i?ݰ,Xz{*c\(6|ނHާBq52D٦VBP( Bxb7$IENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-adjust.png0000644000076500000000000015511313242301265025003 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<IDATx`}'l/HS(*(YnV-q|T[vO|c'vbٱ$FdZ4)Q$EQ  ^eޛł `wQ @O[0Yhz( QNlr A""""""""*ĸB,(r֍fcϏwi\R =B+` c-}}Nw'<Zѧ(-b)úZέC].6%(2-l?L"#[v۠)QD^7ܖkDDDD9G1 fP * "Y3C\$x,>>z8Q]݆zPZZ{vϟ׭5r"7Ʀ+#СX-(3LF~VTPdeA/N 1I0*IJy^z.98L.ɸwY)9R |L" -%+Y/[;gT ]}U(z F*wREGm+'v+4Ag&5kVbҥH<̝ʪJE~Mp\f$]h !8౏3HEٙ{2B-_2CK4mMqp?|v}zxdÈw.>g []}?ǛQ4T{3\DDDym8y?ah`/W/WoZ<3av)#~V+m1Xn{ϋ_vxD~s֢TrLm~?Zۧp?_GwCg` ~? 5^HPlƪ*S"Xb\ kxM)e b#d#עj4TOug7EDDDN$Geǯ2SհȐ``z w@ODǵ9D4fOx._:jhmi5_q{fN"B0DJ7 YQ@1?U)։>sʝuDCu z ?D"gZՉ @z}Wb W D1ZC`wD29P؇߁JQd7{>Ũ)eJ֗1ZrEۉz"q C> C)HDB! bGINMCDJSY-p~(v~uB>kCtGe݋Dmf]^P^Ԉ҆S&VoO Y_U Ym!cHmSj˴[J8~!SE\.4h8D_zO8ZOt7}ĺE@r|k`$æq"{ysﯩbx_Ot+ n#3(N`Z󫬨>ƑzUTwnu{׿CF Ϗh8I?ܾEB 8OC(dN[_ogswǯ wBPY>TDN,صv!UV7=o3~u(vBKkx'F́"(KO>ڀsP]8)7^FX7;:ay~ `C/%!vpf| glWϛ#Ý>6>Fsx#![~XZ+ha?ހyV~ g q_Ǘ3t\J-q3a82O$HN yU>ɢ:XT_;sѼ?|[9`2ʊqːQ+GDD4΀=S|Xa9 $菺P\w<0:]ʺ@@F8j>?{j`IGQ*[sQz;.>`cÎMX唣(qG; scxBUAp#m#e2/v:)ʯnħ^l~ -q*K4D)$~3\(~v}#N =d68~V·| P¦*3M<kڈk.(Y +s9:]N>j~c Ϗh8ɺх=x?<[U|zM 6lcp}+OWD D@j >zXgЗǚ(۟YM;6G#4N> Xn{?Ƨ~` g|/ÚXQ$Mm]&~o+ :^r9wh*\c}p T#^G"p\ѕ"Tr+\熪c_+_κ AںU6F$~s=9TΎ~8~o=N|x{X~2Yܸ KgÙ *Óvhy9 (}-\ W[]ag")ÞJ!mlPCcky~Auݿl/Jw_{Ɋ_Z7֬]3Hn|̎}Q^,ʌ>#;<5m3o@@0" dJ<5⾑L&| $E~r_az`e6o4x_6'~-w##""1?9N娰8}ƚ9(dcYOyiXƂEX`Sgb6Af(7RۇcNiX?w.G]\CC|W.b=p {^쀳C$W~acZlXWga]|n=DkGB@ :il8t*aN 9_pUZ;Q[ ob}X"F>ۏcg>8>tDЀqO+Va <Ӳ+D]GZΒ@H>ѡTޣijoc}š<ӗtl/Vta zom \^'8ǜ?cv< 0GDD4s΀ʣr]pFkjȁE@TUùh Cj'"q|bXW q X[if|@?}Wݰa}Bg GokƓь: 3\d6Z&#~?us^!1oG[V,Ea_#Flow߻Y 8;?u'VX3gt/,+y˔N-#APyvIs5t[䯃~yZkYFҍњVvh=`ux~/8J&!װ\l"[l6l8˓j,ܴۛW$Pf\.dS&U,ZI<|m <16G&*hƁdVM}x ѵzk[a~l[fh[ hhx_gUOtڑ>͗ov/f|nx kL58*l[?%yv;' qېK./EX؋Xc`6)#_۔ѧ׹OSR&|̎}Q\l5O$""gGa)4 ؼ[8N Q"N9t`*UcIѠ2̯׏ںqW@u!wyLΕ :O֩(nZōM'`+[ʱ"NjsZΒ MPcW75B[ܯsO܉%7bg ޏٿ=LF)x*X-:zbVQ`A-tGx_މ?Y6=gKHT_pvw+lE\U<A{G@@U]6ܰ))VԚč B/PdZdz wU0=vҗ\D?zv>v[ {kP=YӋ+m4%2 GD/@gu*h΀/Ư0ަ#1WPHu Łq;bTG&֎+K.%-+V'30W~DDD3 hCc9Ł50n]Q y3wZ[WcaTϣ;e#ZwÂQ.:p$ZV] 77B}h/.tmA2g0iqj}X5ctxߦ! R Ns'%_(r;rCm1;GmcZ'DDD4Ofb(Ӹ}dH8mY.c[I!r\0'}S!xP WU]oLhom":B ))GY% fp{E z#b#ך> I%c dJ@lF9GbRHt3in'\V%>2QD4P4iN?5gcݼ]:pl`y6E.+4=OH!!Ncn,Cۦ`gv!k6;N8qZ7bH&o68.oaOϤ/m E҂aYg"7ܖmp[F# x7}v w'm"ہ?'J~+x[K!"ב'x*^yƩ" qrX\/h~u}f/)d@Je%Vs5ӯ8ȽOpKd.'oOvж)\홻l+wҢ"[M:-HYu׆`~[x` q&^ډpwbXgveN)OZײY<'p̎}ADDDm 8oy9_Ck ہW"*^V`=a,ϥlsX̆AUԂE~qxa^~C!3Hr9h~DDDDLG>U @7L+(r`z_+O;HDX H+BIY|zS?x V\ Ѵf= Ӏg`kVL5ӎo7rHTʼ^S5= j<;M"CP(r5)bjiaۡMIe!Q.gZpBxDDD4}_<_NeLwuY``69N&[wTLϏ(řve6'.SxUb$"""nWUxGDDDDDDDDjKDDDDDDDDD#P#3HDDDDDDDDӁ+ t` 5r*FDDDDDDDD4W]0I׈He^ b b b b b b b b b b b6J&u}V&I1(PULVռ%RHktDDDDDDDc]Ax'r;v`]mo=GlOƁ d.;x7YygFf f@x?^冒j>7 IRlЇLE>dO*Q[ t7*Z,W ,\<#P\]b(]t{|Z398N*.@8\@#>Q(*+.1-:'""""""IdHwKD">@i=]= 74b(pӒ"wB95M rEF '.FGK'*uulN98ZE 0$}BDDDDDDtap 2#d.sM(Cfd \.3 8E{\(64P옳h'tnC&%A*aqpfF@WjBЅ 5QxPȼIe7 |@]q%vRT#UJ9Rj 4&Ji0Jɧx]N48F9rM–ދ#]MC͍7oyFqjϏEُ*ܵky ̫pÒ )} \ [ "Vz$8vm\ ek`T]ͧqбt\e4queA~(GP|EEłz{ɘ'lŒ]ĭ0:_ã^s<;iGuy]*㒳ȩ@`Fр}}}f9gT:tP`+-W#j0Ǟh(6̩+ =`6tcuXn8*4eaLh7lƒ"5 U7b{o@MC(njKPb+۰ȭ\Ϋ~;-X6NˋEc5}ԣ\"ꭘs=&T+P?0߫O&#kMm yiTuwJo䔇hff⨿Bd ӂ0::Z_9, xB&/j7KӁdG;z S/c]p, ρt1AggD뫻ɰBG2!SڭKU O>֌g)nk+-Gr~NϽG:l߶ؼ.lEJu[Ho_k n:Ti]ﻈ}óf\W k[*P<Ԋ>9}&tuVb^ 'QRWkAf4uFګ%gX #*G]YP^Z:w\PP+@TwX(#AO_/ZNE D).>H'e(y:rmy\xƊ>dJFm}g?]<5Ɂkۢh8r:zy^;4s֢t d$`3u7n둛5B鿳OK>5A$=bB+LYdOR+NX,d2 3c w#-T/X\ῄfmI,/że \֟w TUw F;w Us;TMrPDvC4pGBP&ئ#}9H/;&nWk7敧GLo4GLj>Ff&Ȍt3bJkCkU*WK/ψ#z :TX]]@wbrlzgѲszk)*EvcG""""""S!9Yu N;-sZfhn\"z rڥE.a ނwȪA8>K,AMesPV`5,:pm~AJJJQQ3V5es*QY\p"9.!mFs ׂ y.z)}ݼ)H*֧ehԬ퓴U֣mƘMqs+D˥q zc+3HDDDDDD35?PN~'BAu[9ni:G,鄢LW@Os Jp3.t7c+jhP [qXÏF?/)jO)~[Ǧ;Dʼ,~??}+p/_uoٜ^#Ձ7ƂK-_X5X_#҄Gz U`Agpo>dx<3%[ОcLjɳ.\{'.gj,ɵS """"""q2` :9b(jm==~|+ߋ"OooGئ]@t龶a -|XFg:FM]_u%w_:ŋo_B_4%B"G8y?s."Szv!9 Оgq{߇'δ!&T c{qߘz U.@'}- ;>H{ʙvRc'r'R2??PhfRq$ZVYstڰaþ*"+G "ׇO 0"H5">-nZNHZ-Gvcn؎97| ]xW)DDDDDDD459re%Zd"+ɀS*+oFVrDxroKK o7i3'jrM\0DDDDDDDtoc'#(nyRUӣ(?9/`&hMm"ɋ|UUf n:p:0p 'N|<;'{N`| &@XX.+RWW׸2tp8w,,w3W^/:w2O?a?{& \H_PN[kf"ݟJgBNmՉh]S@r;ߏ͖MrGY-#Gɀ_V&Gvp (k.4!l?Mk*8@8G3O Q6۰@e3; 7!=Ϝ+''Rƻ"2]=UePMǪr4\J/YHrD`fu@9k"}Bk`jtueqюre`#]ADDDDDDD4\3{rp%Xr2:f5^,61yw2)Aii S@GGDDDDDDDD5LqI,<XCyF dYx83r$`HKEHDAiiEESӀeP8$"""""""ʀXd@әVXG^ܽvcq8{q؍"含=@g'  N&Ć:|ݟE( *+D}rU&KDDDDDDDDWk"8.AVH̊rߜr,>qkv^KE(gP^{0fG mm@O,+s?Ŝ9s}rQ\TU"""""""ܬʑ C^!G f=gENusE^"ZGZ+Q@*)GSr̢B̚H ~x<$?Iom+Qu=6PD39#=Liwq~6W-B,P9s _I:#A__ߔ6=S&gIS kMIqz N;ϵގW5[^"""""f}p<d8tG &ѼDZ7W$HrɁ$u#d PۺY q,({5]J&s} X_|=>PgyyNFhRԲw<m7ݏYa^gs 5]KR&/ž?v,rB&)$=QKq9S9Y2_g{;iЭVa|XaOls?"uro~L(A@3ӃރT6GPRR2%'^|ofܰ~P]qh7^oFx8؞cm.n{.%K:(es2EҦ 2==W_ՌdO1U^I+K =)>W 爈<+8\.4'䃮 `&ৈSĭ*Úkxތ@,ߊ3CXψ7SAU<.l2* PJ["r%P"CF#""""ˬNt \g~?N<9 9Kh6 iH RqkIqԁe@>>2%#}r؟(a `j!(C<pn4hVuBE%(FzYq w-߶jJqA;ڌpFmHݺ82n=5GI*%z'eK*ڶ畊> 1W*-Cor<+8u}tqG6PYm#eS]?mm灓g%2gI L$(9&@riX.2>2e@ Q~m{#bP~$]>qVD_G-;n6#Ņ~ l`Ꝼ&u/==I+\ZTi(@?|߄uƻ,JT'|=UnY8bΛR35{_Or㦥:=NkKZUP?NR]ٍ,Íuۺ[pzj65` d)@F}(T˰nmX| ?ZoCkQƓOaZ~{%yHAU/wVSNM{koݎn⑗1RA9ٿ{ωj>7o'˹ʘ? BtY)ː[y6MGژy*U^Tv;3ī/w5/V7@p+iHrt`H׈NN^o@@./MZ,7GN%DhD"cG%eʋ-^ #4ñ @Rh[KR,cD942t BeF< E uɋPUX(p4c,W"F$Bh I4PsC+؆%eT](9&"C?d8N4*:VCۧR}]8~-\ !ۊ`i3|FM~>3a\;Q9P[іSW.C>W^= ,XqR;=yorP˯4@[lʸP[,fm8t},l֮Z|'"=="UY<5En^J&SZI)Gʩ ]DzՉʥ[q{PG.>il¸-7tʿ#~ +/X`mX >!߈I⚑0.h"O9e4x€*hA݆^ó7`{-h8*^}ݜqPX :b$,w'l\}7teNaz3|FZ%:]KЃyuvdLVW x|zAW9J/0cf3~>(¬2 ŘʒUL 4jx'"""""QX A;c2&敻p9g  q t`k$ЮLEq_ʡA4ՂC ɿRCT_Eg,W4$ad-u#tǡ݄(w2GFv.ؑ\F=g^A񼍸]ԜDR1]F^m222 7o !֡#JgLx?(_GkO@Wb;.ŘYtjO L?Tu{#GbLeiL }o4jloODDDDD4;Ҭ:*kBAA\L*R̆22gO`G򿓞 c](WިYv U\eKq-QypfK(ݾ;?QI^*Cp2Z>lD6Z^Y[7c{#d4#{ g|s=##T G}ӛ'X'Z0+Ï~sXmƭhNh8=4Lw `;mUkp[Vn:ClaO G;1JY#6]M}> """""*Lf*iY){9]@T͞I6l7Oh yfooW+:sQď.iHkE/R(]܊ˢQn|1`cq KV. aq+R$b5먥/'m@uuF荩>+gRވwU8=Vf^oޖج/OήZn!ۂ#G s$% Fjd+j֏`0tO?+OTU!mr1HnD_EY~΋s@cP9-xv{TŇ rl?ky/I1<µb[,5rD尻ŏďUH=Hr<`\$HAs2٠tB<aqO^ I 8"=HkN65 ȩ6+}O~pdVfe[1 )q-lK?.E bC^=5c S[9O [q6S~]Hi6c #/sO#.dn>81dШ5c M4m اSY?gӣpKrqEW}VÛ@9@QO^.E_ 霚rᏩYHDDDDDDDDW:+`J!WE;433U3#%!nz3+|יe2 =*(++vZff ӎ\ō밨Ae4~ﵙ'""""kʬi e].!~@r/: Uۧ_:E:+RenT Fǜ x2 ʅ?23P7رNР͆xU[Ek}58-ÖMkb_;9̦K݅uylZ-}ZN,~ksl`&*i y{s`4}?3O_+ˁd`lT)Rؗr*cy2ɠAB@[+ՙ=@EgJK^olqf49k&SU;ӎM"""""`fp"2u`)?6XF1Areh"B v ylW"Hb?|:htlIa?5{9W-߶jJqA;,Z kv݂Up;4^4l@t!Ch;u/ڈvXSۊr>ށ;~JX[W xmM}{qR,:ݍ8Nt&#q^t`d;~ ۢ{_BWr:y4$aΦ18kɠXr]#R FďSXFy>6 x[bOo7K^yDzE:#қPշtjzp}dtC|A}GpCFdfX} {m@ķ U#xWfe-G@Zy3_jƾ'J};8{w\ŵ yEҽZІXb_y\./o_ꏉ?'bf*:;f#&:z罪W.71a U`YB+]Mwɜ+W]6Hkɛyi'3OF}a8ߎ嘑\Tەm?k@SYi:i(>]e{kX# 9JZ! . Ñ"N8>kCT{.b9u=֊т4M=sK ǕR 6qӰkrP/^oXkK) y%((LG۵ɿ؃RKa tvgԹ 7Wױ=|i Z SxN+sSl`xEQƌd%fL?W`wG`2k9Fc#_lG> [pН387#YF^8uE}#>9)cGPD ՗ ~>^&&^2osܿe)|r Vpjn;P,z< }nn'Z-kĨӉюFH? i逭_ix= 8Quys+=#c|t#N7<45vk"oGy2qiuQcHW=:eCX /FרN[ѭDI!+x^Y6e:t816Ԃ+W2QvjfN+O3◿ĻlA &$)G55$vj=_Th?[K;43k%`C6'18ƥ~P9L5N#X1F@^F5eY=}&X>7FmcSwˉMCxO6maL-YF^8uEO}9DϱODDDDDϥfJJJ > 0 o> ף[?y?9'gjo/z>bQ)i&3LbKT> r:%S}Pߒ@/NeOtɦ KjTdj"ϵx0wmWvgS ?>m(/H/C힘+*$9`wA+ qB(a4:a,ރ8 :eI.IlOR:?|kbu'qIEÔ;]>1%A"S`Ghsf<ߣ89?~ˈ:~,G꽎//nxw WqN_g>,'i41`Dw"}iPic-~4)!zScO穱㐤!ۀ- ar &+|ODпɿ[=+f$Y/g4#$&$@7Iܝ~aɟMx4[GSA L.*Z&R+܎E8y![WUIm.r.e*#5Yh2$*ɇiBɛd+x]p:pܾky?Ž|;{7:(]3Trs96kFR7t` J, )cS0Rx|<";>7,XZxM!Bfjc[DfY,o5zïB6^_pyrKԛo zdC #PD5Y NM iQDwMXi1)7 q)Z]~ V(#Y)#)Ft`(DJZ[x}4_Ա2bl*}6hŻQAMُwmL RS`I5bj^FFkPƥ+ _}lC= vlDneD.8Ep Fs#V] ,?233/'Y j\'Whրxs]2N{_Y+cDgpבx8v?̂CoGo*VKy{wC/ 9rwvݎ7+?ڞOHQ2c'j]bfl}K;r$ǁ1L%uzLXy *2xa%Ҏ{d{#-ѝ[}}/ӓ6T {_IOnͰG?<./ҷW)K3z[Μ5Í3:oQZ+1jU$ũSw.~׉0Or?wPE v })v[4ׁpalxPygqѧ;,Z7 -F}%,b: Dh'zju O[. }}lTL}oO/ 6CAxPrO> eyXހoQ YǞwCw8בͯҮq M"))=+:5[C&X""""""9rƍ=ʷE}*/dQ?| dQg!˂>Byu\Ί~n(}oʕ|9DOQ=+MQ}n_ (Y]ɿGKҍ564ydB 2?cMgq?"""""")ЋXd?sL9844g?XYbl4k+W$T\L6p3D VX㋻:s0;;nvuCޮl[\,"jSq>Fo6-xTKDDDDDDDDϗ:hUj"M]ԗx`x(d52iQ۩փ?"""""""V #ޙ7KJJʒmSKMI.4H A{z(eM.X>{WNۂ!x6([NSg!䟚7X;VBR1N&\ގ;yk:;qholD۰~&ŭGϪ7_{&S&gЎ23VF;o9^h!xB t8l&E?DEE=5Yظ9O%ໞ{p=/a5>[v,t"#tCx%""""y4ꬹT8E{clRzOpP>e沗VY>C-dޫj+OfޯŅ-ݠǞwCw8ۥ.bfGvǏbش/VWa]^.Ω 4!kbsf=:\m#\Wt$ÐoZ=ڭ|d6fY})>_ϡ =IQjhnTڈu&|g Z;qu&5]v 4ǩ3ɢ#"TDi^*tJۆ<pdžVҋQgUD8wNYmGqpc:LZ v]pjPc /M@23vEUiR~p ̌mب+^;2`j˗no\A_ )ygevE-֨}1g (iذ/ӑ~-.LUqscxp\ݦ~µ5'E58mp`|՞So{ qy%t~#"""""&`2MMnx<%__5[z W SYZ,! m`oqCbwT{Bc֯^JʗuC+2;t#GeHϱb8κI~|;a=~tvMʕ vypu}, lYu5X0l5݃ԑ X_zb}FA 7Wױ=? jGB9u=֊т w8'mLU8q(GN\0t7A2zW:?aUl9 y .PwhLf-<3}pl\شg/q[hwL QS}6-gY?Ҕ1nrrD32aWZ<), 3~qo=/OUa71!89Ѣ{b$7 hrz˯ [Wf91lO\ VHA^^2:_69.+3" RJS gikn 6ᆽumʂۏ;p8u+G^^Y6_C׈cC-r(*C!|}n.'F9S5gU~/0`ZS %ؐcoo s qc#5(*ok }HQsv;1҈n^ FվhDMtR!88 _A:tؔ800$qxyw~ƨm 3$e촡oġk[!*E=VSBqEMJibu.Zb.ccnp'vYя$$t^5?0sU"u~#""""EER7lR݁(ͷ⦘\}\j+lz*}$i3.=~h QdI¶7W".tʵp ʕt&e?fe?vǓ 1>+ɍD)mc7Ob$җ3OBmJmӜƛ1{琹=Ѣ8!8N][ES_TLWvA?PYvpmT~/LFW/`LaI21SRot?]gb}^$7\e?rѝdytb?br*%8\B4ᥟuhE])Mz.+ ^+^)GqFM_׋qBߍiq)a||JH<ر5-p$uW\4d–MO3h4ò")>me!-f$ga۶b#CƁ4l.bl*#?u=Uv^O_U"C?nǎ{|ŸYiS/A%,lڱ)Frh3V;boFc{+Q;)FEw 8&"p:wotdd`G`@2>gdvIzqJzs2F݀; ڈv00Ekw"GPq(}&`ɴB/=qK0Fe3GM+؄ 1Ʃ4~&l !:DDDDDKg&\93E zzf\Sh|XhV#Ŏ]hlu%~-Zr wq˨;}J} f_0ٛqp~K5#WVWa[*[/ԕvx99;rrmS'xxwSq޿-?D,]{2@n9s jwvI@u9V;b/!ŽWˑZmť=;ءW9rwhZkLZ:=:uؽo=ҌZ^\S`In۱;"Q6/?z]vT BIHCQ/ZIW߅C5!.M= 1xM?g)+Zh<y) w~u ;q7H߻]9GTB-=:<#-\";/4!ԅ,e,&[^XUsՇO~WC|/P1My9$4M>{ ٶ3F5~ƕOփa0~"9hݸqcmLp1\W3e=~tvMK<8M;XۯT0t η!ZJfz=d͇c:nk:cǻfY`=O$pd_97NE;Qe]!a<>opdUA2t~=FE32a1>k@RƣBvmz4:р({`–#P⸎Z1"ZP\y0qU꟞cŨR6tըؽ?L8ƈ?K%ԝ=Y b1O6/F_>q|.mvU1v5F;́z| u0i<"mq}F}/iLJP)@@]K>ˆKuqblW6Ee(41Lθ69.+3ZXu+l}}7ukVd> nC-xbToG#Zmz[RG0t@Sc+,!;w16ƣ x0څNǃ3QQ?mXFרN[Qu8u+G^#βhjsc663%*!ξpGC瓾%gLoaS2fcuvLıp㋈(H N4a;1;bՙnD(a01Ee_%*'?" @ Ҵ3Hj @My!$cue5*JaU emdBiؓ[Dd zp%8Ɗ{_^܊GvZ>x/j}ٍ9GL폈(1L$@ԄKCjN$VT$K.8\'4=#qO3D1aʎ۱'?!/xP''U|X KpQ'd*ɟD$7\%q}_4߀MgO/\$mɏ^pD#""""""J(_мuW\ 4q ˱bFrF1WmwcnoQ<Ԍ&[ToB~FH=͑"BIYjfⰉ+_U"D߂(HV%#Ũ2PDBdXmۊ!vC%P8 d+'i0^-Բb?V5j?7[*]S 22R}1q>sໄ(HKDõTxܧq7*^©+협3 eJC;}J} f_o]RVKy{wC/ 9rw0a>w 9oMVp̗wTaǫH~Ccތk,x0&N_l;̑(q(}fB:0.>،y$\16Wcds*`ptԩ;w{Td(cRzy!"""""E,wrQSiB5) Yʒ4lݺ[C{ ٶADDDDDD@nܸG634|!:'C[1L tq """"""8hchchchchchchchchchchch2D4rss~}EDDDDDD8f͛s"""""""_LѬtuuH`f.:#""""""Z$Y4 &詄DDDDDDDKDT?"""""" @"zj9hi2D&gDDDDDDDK D4'D4'8󏈈hi31 v;ZԦ@^1&i8Nhmſz爈(>L҂wyw%&iA\OI;ϝ5,"""""""9 -,N#Qa﷤qV~'+% a1DDDDDDDD1H &%%ׯG}}p @(|r2Ƴa1gZZKDDDDDDD\Q~o"""""""yg-cL-cL-cL-cL-cL-cL-cL-cZŀ4{U~hHWRRDDDDDDDD4ǘp8j+|R&U\.fETTh1H Br矹Vl l .Qiii 1H ?_~&?{DV@""nxM1'2ǗЂ&i!EDDDDDDD4+@A""""""""CL҂vw!IDDDDDDD4mr1cr""""""""CL҂Ȗ?q0XDDDDDDDDsoR6m"|G(5?jLxo%""""""" @Z0V:S c0YM 3--%""""""" @ZPFM[ablHDDDDDDDD1HDDDDDDDD1HDDDDDDDD1HDDDDDDDD1HDDDDDDDD1HDDDDDDDD1HDDDDDDDD1HDDDDDDDDiZH>>m_ ))a z""""""""cL҂q8xexf m|p:QX!RSS("""""""9 -׋m^ !)))l6(4WQ?// sYADDDDDDZv{OCOi06v""""""""CL҂\ """"""""CL҂jb7EDDDDDDD4r^sf bDVV~F3 [iA hk#䭲D?cɒ𾋋&""""""" @Z0Vk*֭{8C|٣J1DDDDDDDDQ0H h40tfCDDDDDDD4 @""""""""e3a,3D A`QLќ ~a0YD4_&&-Lќ~ y2={uDDܛ d" =5uʕ+?߻9.7{&'ߧ'#"" @"zjT[lah&"
    """Zژ$Y4ogŷ:3h!Mw?!=LѬD7F|⛈\CDDD4% D4+9@HD I=DDD&$""zFDsDDDE8ADDD/& nξ!8; 3z o"ZsP-mL=&"(^L-cL-cL-cL-cL͊ƴ4&"${#;Ae}$>i!/UVhhKmLhAjPݷrdg5iW܈O]ǀlފdhnᔗF4+w`v}wYIXS6დw]W}o 8ѠEױ-KA)n߻ )|-ք>4[mZXmc8R6_DW E3˫P+E%ƽh E84u8Nڞv%n˴L\߾j?[!፭">7ib.OoaL^f?^׉O܁Co<=1L%07&~։E!&fO ՇMdUfo *qoZAraA=՟3GƆ=ٽO~hVFHªlIdo rhrnc_s.:?|VG I++R|&h@` qgIu+נ@ۃm%5:!&%#=o-8s8qcG:ITDū56|͞0ihmsn^|Ez# m/ґ 1bjzO=ŔHn '#%bS `-ux|%š7uR/@y##/_ڧ/8xM_" ۘnA6FDDDDDD޿Hˋ?xoo~_JNNc`?͟V"C^m~+׿{rWbR(%K %6e=#0gV'hmTǖe\4C HχՍ Ҧeuߙȷ&؄-NǺmh(S~7N4ww-@*6 %I|=C#ˉz4tXaˀ49[J1>:;Xaun]*n\¥0tJ~Cf~ :.#>;~?rSOC~e%͗Pl/;r#oG,>ڤ|Rgυݎ^OԄd-T\|o+ub%gf49^y.4|-}Sץ)CD%'l^89a-CmnȲa*]<uTY5"uE*oMV Ix=; @Z${f1ԅdFEI6 zFC/J˴h~hV[nxjׅ{-TZc0 } yl >}wc'VK0dwxK(E{LtWg$nDn(/|3^h< PZCɈJªub"ת ;vcݪkz0Y_ u_LqsM҇[g1فl5g3^LҲ1q"I:  ]v_/pw 17:!݊vI(ݱkzϠy-0ۏ} |ٌ7B:p?r5$\GIGy~_Pk<>x%"""""ZʘÀXF Y/ I‰~dVA22wMURk% J)4Պ ,Gfx2+%ρJO)/n؊F{GUX<F??ٷ~Ziljc17)+ FbFO /Lg8Eބ2xBg7] 0!e2]62>jYAsPO hvFg(AL2!-o-^غImq'7'jn/XiFHOzWӏ2ߒ<F)=* \>G-oۉ˂8p kD]ɍÝwA<O{HU3` =A4\k@NAw.ΝxVKy{wC/ 9rw"!&^}U`k7 |'J=uq,8R-־QmM{L9ٍ ggY{ߞAmߣt>Y99 8-XUV]{R$WPo3͔}{لgS0n賣 \V#%EhopKOХ"Ra%Fzzj{5n*n~8e~xdn݊}ýxxSiHb)W9:X'ǝѺ0IluQ'z?>xҷPoZ pڣk@Aq.f~ކ0ɇ_Ddo^?/k""""""Z"E,wr1EMJB\nzFXD4#lA`V /",Eċ&Ě5kh/(>^A.DDDϋ7nQ,qEYԙCrȲ8'bmu8{?""""""% @"<7 """"""g-_L-cL-cL-A _G$aJDDDDD_BX y0$ .`|R-¡:!.IORC.^Sͫк\{ۂBdg5^(́xh[\?24lin'Ǯc@g{ƕ[{F[ 9z\ĕљ_iV/<ё jYUXWɢ^4)` SzPHšW  gX`5H!N4hQ~ul)aFۨoB 6} ;53#oqmj$bq[Hξ]9^XmoEN8qk,{e6±nH WoEIN24Qt+ڇS;Vu}CW#65軌>19d~x{-vj!g]v%^yy#ĶE=,dk=K"Dq FSrm|a?ė\{H P^fȈWiK)4:$p%ǡQpJ2v"3c)GH@C:1G#RB㕈hq1H4!hlffd~c|Fw2P:ouC+2;t#6#Yjv?ti밫fzXp1\W;>a_&fFczd[=׷$?!ɯJTROTzDZ}eye]$#@X: 0[?âaGHpzNM/stS\+9yG՝Y|Jd[n0UOҁlkrg#{$~ Zwfkȇ>F>~s4?3f魫0KCcc92(~tyOsVܓ)u;QWrLzH-]j1=_]<$'5gsS?V)#MoF} wY2z9QCeδ}vyGeEi1)|hten['wkj[rDsSr휞C\eMm\{ַ]9f޽shk9q6[.;srv+sf;eF=kn#z{8wR}C#?o9ݚΎ:Ց+\;+7D6%uulܝL>›yNˁMٲ w$}NCF#~3{G/7H&|+o®uuIϠJݕI7?O{r3OJTuZSSFx;[9adoڐ6PÄm#z{ٞ3OCC99{Hy<1tn˩r'7t4gޮ̝_ 6eSnHm[[ں!IOW*}8=ɶgٺ5=?MӏfΎ֫ćou3̨->m;;xO u X;~mGy'+[?*eG܊9o΁3Zߪߞfpt;9>\Wֿ֙O=bX?{G6u4mVzHҍno/Ĥ4\?Ϗ?hM݄bƢ__)8oF*_ڿL{gG29׬/G76n?,sO鶼O{N\o,+DVim֦̝;-\auNߐё/KEZ3uэפ|Q7yI656eG2ſ7p7-soJƍɇ!ϸq<~<7Pk*VC)#ɿWg>xM^ɸfFѬzpԛl}3~_<ݼu]s ϝ*&G弽A:l,Y~ofi˼GUǯj˼]y ,v_yn7X߯Smo 2H8{D#dix#g= ѱrfvK;=?=]vTn^o+IV9nϬs=쪤aL&6]G|e fj˶I}uO0vdY|ANߕc8,}-Gsz妯-'3c:y$!9s'YX79M|%׿[r|QiߕkM 8egGi37=dљ9.'/갌46ͦgGǝ_>O_4?[#x۟/5C0r|]#ڗGu{ep;JkMy;K3/wAlY%?+yog~5k۹1/m=50m[-C{tdǚUi\7d4jOz3~?_辭e_f#6][|7_ˡVgύ.ؠ6gk#ҧݚûɪuR}ϚuԝY}{L9w=O?Zxn#/qOIS5J Tsiɒ%klp(nh@0,Y^BU*tBg;wZIb٩0 ST/{キϙASu_ASutE:f2hB:Yo1=9{c^[[/:yſ{|iV&@ P` &@ P` &@ P`VY|ɓ9_/gaÆ2pk grju=lƍW?=gvQFC>+4n \: ?6xp{ (rlf@স/]Rttti/p#_./DR|mmmoihh||> \___x̜9stU5UO>?iҤ<n[T*O{(z*gΜ8=u׿8_A@Aoǎ{ؘCfذa9uT||N8aU3J@QSS3|1?2jԨO? D/k.Ǘs={n3v斪巫4bĈ.Ŀ]뮁뫻W::0!rK=yw[oe„ =?я臨v5kdٲelݺ5W{g3f p  \u4_Ⱦƿ麺1f`۷ck|1ڹ{ӓϫ^/\ _с~n1)&O<0)/^<0ܪ#Nzan h"+n# wQp{Jg >@3tyFC>k(@=grL5<Wko~+F@ P` &@ P` &@ dؘ U_\Rm ڿ.|x-Xcjl"pR:3Oyj RMjJ׸jjd鷟͢ oRF>3spJ*]}66MZJ g֟:ufϞ[S:ޕJ<åiy˯mhZtߒ~f<<.y3CپͬTg1s%315]'Ӽum\7/{R (,?FM_ۡ迯wvLjFdY0Lٝ~b#ΈCQ{o3YlfזҾsu~@Tlpe=]wt]9rf \5LkuH\ʹS#wM?Y9!/P='ھۓoɖ#8dtx=/u .rf_ֽ?fTcrtƎ8CcK`dCWyܔL*7g#._l>4?g#GgM&|,\VKV߰Yϸ +uu=iG2wc)w]|ۚs2k{&^T:Od]i;+N}vxwON9qtn|-{n*b)艣rb՞ԍ\^6zn@ߩejuo+s|fK{:Ә˟_1'$*9f\tvݘy/#ݗƺm]-Y1?]Q2$}{.Oal֟wVeS>=˞y2O->xE4vnؒM?ݘ}gt d8U={>nKA793oHEC{::zӱsk.֣9yuL=:y|4ϭ68ȷIiZ0=kК e'EKd\oN|P73OɌ:r"55o򞴝8矓y|e4gpg+d?򰆁]vۮq`޽y3TՕ_.]ꮤk?wRV)[UU_ok|u݌|O{}g:o3*nCy9y{Ż&'ʬ#pGHt ʘpXq/̌ڣٹ}vN{I?ӛKj#4^ }QWy=gZz>ڑCW*} Sy-'򗫯-'3e><'ɰJI\g*B]'=u5~t|ڊUOY5NwTi=s]^Wg#quKCO?'h>fj=l]22{3[ tώܳ諙2.Cޛ6]{vIۑf#r kqFGeM9a1B+Ȝٵڪc`rUf-p_)]?ݻ)+dِRz:s僁ٶ@Z2K?škKC'fغLhɅ'_OI~mDYt𰔻[sx;Y@`+ &kw]L?BFNOFU:Ui:fTu!Ӓ%KxvBx)/n8p T*{aڹӏh_ٳgkT./LRi`ފ?gM]S's~ Pv>Y=Dvl6e`3c^?Zp3 L[TaÆˇgڂE=A@(R/Ȭ)c3/gNkfO[;3Opi_i44w-z:ok?~3z]^i fXNWl_f}t*f̜<|ILjLM4/zL}$ ?*/r_qsfgġMr÷vҬ\63kKi߹:[w׸46 M禗 @~rby{tj;d5y#^s3uQYvC׿wv<{}idf?D>"5'ײ~G*˓C(|asx~yl)pLenb RwWS)~/ov_w2lUۙۡ)K\f!iں<32*gǖġWK|`U^|9ݣ>?ﶵUp#֥{_mL˹wGfbfjH=ש[KkV znzƬ?Cܾn߰;on=4,W!?ݞΉѕij}1~-5ɣ+xKKʓ癕+Yw/5S҉2Sޗ6Y65^}a+'>.S5 M"rg+΂ 3|7v\L9z"'f}(m/VO,|%4&=hNrzN)Ì}^\æK3oʘ ;[Κ ӞqyrQ^j͡gͻ;za<R =ؠ25dtx=/u .^ʙ}Y +Qg:;LnN[wݙǖfȆ+/y_oRjS<^'̕Me{eX+WoIO4=ҔSF}Ϯo[3qNf ݟ{ϤRkR<=[w}̚2:}shy=9}Tsҹ\>0&fܓgsì̛֕m/1O߸m]6AΝh͸)Tn-GQal>4?g#GRj.e Gd旳ܕY'#@sFNόgg S)icӺjggjMm\^zYetx׹.aW:FcO=-??G==3/__"ˏdT]ߩejKEϵλjfοgiޜ-P4dY_)GޱGc~yp|u<֜ŭ˞ʨ,XLݔbUԥ3]qYӶ.lWZʣ2鉌og[s~,ݗiKc ޫɸYٿN؟7o,KßW嵏N]aȌX[Jˣfl%Or&Ǐ~4dp޼m-i)όYGkz76#=)4?Ǿ7=s4ޚ˲xμe=CeR DVottEִw&C4~AM8?ے*Il=?ONynߔ-#wKy[~Y{}4V9k7fKs.m[Weg {Ƽ՘gycs~9xԥssĖlk={ȜG90Pڳ4t㺩3#Ɓ ўtܚKghN}kv/Gϐ! pBcN7=-nUծ!}io_5g?vgP}4r8=o^Ә募߮MO63dH[ߤ|Mɡ?gH壬]6{OWR^m9p擑oҴrazt5\,Zn|q/̌ڣY]Kÿd[=evrtGZCGSԗ}H}˝9 MS Uf3<>aLFqgSw4͇K`ajȰ贺0vdY|A?3jkɶL5=8Nݟͫ+嚚T;KK̹ 3r8~|aw硧ʃ\wޔFd̩7rx}Ӽ岠5NG0"ƍHm[G2s\3bXxW9S;kǹ%;VZsX_ƌsJl?$sDs4eCguX>fj=l]22{3[. ޴8vMz֖ :8.}N {,G[7*f~4=8?+,}joǻ6dﮣgg Mio}TX6*5,ھt߭m{GeLZD^_}7Х3il]&Ln~>dTNoF䑥OK5wU!#3qҤtK^g޺6yM9[fW`:YrOښWͫ~Yi1ٖcNRfӻ֓=S4#j^>ʰґkVq Sq4;*?>7U9}yK i}:-go䃃/f,v$_l>',HZ?ۯ_52C=U\8?xpgb~Wb^?,1#x@Ϳ_IƿoF30Ÿ7/嗪~!. F^ @vi@|\w?s p|)Kw5"YZ}fʷ)jjX.W_z{ @XU".\^xAwu U£mxݭ@k:4U"r,om]> q TXOOy<66'Nhppp?O>_}]f>Ӈh,RG=b. +lze9d<^|E;vL;vP__.]Thhhph4Z4+wEqշ^BS&vy嶖M勚+qrW  P!fB8ymhhj{7֑Ws=ϯKX1{R~? fݶ1=rfi(4rV#!Vzi=e:Z#|ZAG"!uhn5UTN/SpЦfyb:~}" pjo롭l)<sq^}omj zz BZ>oyzZJḾWgʸ75#SNy7yF^Aw~RUw[PTHJ>L2-G=yGZ)'+m]:Vgtc˖-׽? xis=NnF={ٿZ+Z tU/4ٸXFR*&"ɫCӚuh1K3>##vbO6eL+ulsF]Rgo6֮Y LmVbʚ~rt4Zz u̔q`{KdTSfm.se&WxzL#s$NΗإ&,,a͌h<~k -W&eVLssAT '̈_>z)==tnzZ/t*^>zb3II2:7hF]_s4~PoRӦܥ^X+߯^ԇ#9'շA[J7{Cz},ͻѮw/ji~_N(vct6z# EM;ўOEeu=جС_; qRVP=7m^I1Wsߖ(Srp1Tס;՞IۯKk.mݺ5k&3ߓO>_裏C9;wY -^g4+է6)46%K:uƢ/76a0{ѥn%k.=&/kG&I'2y)h6'41zY ]5y~-_9Onk},[~'L[ݽN]s eҚx”CvY.]H8$ObLC,Hyrr; (TK2Suǿ2NLSBTxBcSWh7:5_OƝ.Nھ}>)Ů|]Йo:w~D;=v}|ML f:}|5 m/ԃh}/ꏧGk?ޭٳ)FÏК'EOSA_SŶbcU൶)UPυc_R mws@XiT͛ߧrgKnVE߭w_f͆X4VS|_CSp$.˷IMzoTM&49=8r}ΠWFc>\csx@U+6B:%5[?{t};ڥCkhzvhwF/M^ԅ!}ks:Sʻ$JrX}Sڭ3./2ޠۣB I)}jd2J5bj-}{]ZiFD_2=p\S{ϟ:5tyLMj:Ӡ@CIW\3:A\oKNYQ~WeJ\ߕ\8+$$ϚU4a2Ʉ[bc첺Yw\.fYz-<>7ޒC] x=rIuX]hR`VȽ\ܕO [>fEZIh'_1{bsȰs+T:)VN>\wxLݡ~S {vgJW'FuֹM3C>xI/}8d&턛-k15.Q˟_~UƍmAKK3wcܜ{oo3:b1gD_<_nL(nw߄…l溂.jG@q$8qI)t2<*1XEg]4=RZy7/S* asL65OmkEZmhu9#9mrG\eƇ5l3EvmkRbxHծMJij f}e&G4 ݥq'L&4Kcie]>SИMN78yKbIQLQ+/ԡCW^qfk>fjWYi۸_3*荎:XW~sXPZ]!Xڣ@{I˫@t<%Y\9t?y'-ON{\-Cʨbc갰n-V~O(EOgrh%eDn%]5^vU*dpp Jji`ý~ףKÚ6S]ڼ~' ;3Ѥg Өժ}q>::+=@Zwvvgpk ]:CkuB~R:޾Wϥ>ԉ|OO^Vb|Tڦڪ/I7묫mhittZ W6uX|\g׮a>Hm XV2Գ1 ^H,xo:!w<6!߮g}Vp1؄@f%j#nVhlDuoؠ)bI-|6PT߯ >[S5z5^Js#_OÃ٫˚zAmPGщ :o! Iӷۣ> Ŧ5tc#wm~ EB_$حvB_QYEgj'OsX|Ǭj s+Y8+Sb^S-U} ܌->.̺ n6ثՀ58>-eS!*)C5_Dg=IENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-calibration-settings-thumb.png0000644000076500000000000003573413242301265030761 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<;~IDATxyeuݷ[ի^lReɎ,'cM H%c 毙AA`Q$bHذ=xhdej!EHvڵW}ss߭zU]Q~}w=wv4M8Y:zyvKKKx7;R~~vB 47C#q YGܹsOMOA^}BS3ku.[>.\.گa?Kð쿷n+ loZp8NM|7^LE b~`BnPrIHñ{</:_ah*A"\Z #.ۍRz< Qw]ndNxJhL `w'$nHW.]AVGɿ¡ۀۈ+g;hvCXB((63.kas{^ۙ,"0ַD!"ճO 0QnuR >Uln`WivrX8|PDAqb{F0D^W{'^o2TD:y"=ЅND[Bj6Qn$zDzU$4ڭ_j=#Qbjܻ@]U =Öwn {W\OWլsRP# {hd0 Q E֔K66aG_U%f]-^lZx g&0C4E}:=jx<.7Å. G$oB0 Jē|w] }/C'¦9^EFF^.o&%0r#/!) n(注먔:Iώlf^>/!9pz;9 uP7<}6:2:uNf#䘸e4 d3Xo3Va%Ckbwev[+ ^`P\r&.\]E\-wvQ5a)5k00maXc}A:ϧby]m !0_.b3tL%JBk:Ό&iKp{مW}[ XKڐmtT~۰bNgΚ2Mey8퍽I0H@OBO!ڟA)ľ HED\wE)|b{?݁:Gs H?QtS^YLpcDg+~sc^p2m~Eyi|h6ܨ5}j=F]l .х2Ǐg@,q+D#'_D)TAQ޸7_3_̥1;FfwwjLuB\[0z<5|3{8;{w6wO?˞R=hO+(z9 XE{8ZbjV׶UZ]T\^<7Tq~2~'G|lB)AoE<ػzޫ c'vt}. j; su{i3Ae8I}wrRNho~Q A 0V犏—7K^Sd̝LKQfiNE rK[ˈV ~= x԰o,.xewT4kVc{~mI^Fe#Fyn?}EGMl)~L 2y7Pw[JcQ!eXst 3zy ^\|¼qsu'dN5?SE 6-|ƶ G):֘ױ1HMTocbcZ>.+cYMv"QzU1.L`B+$?/lƮ!5mZ y,eZߨcA&,JEcx-4]+)`Q/W(G7*M[6v&]L7>l|ۯf HOg0t}"FT\؋[0bEcpxg~0YMkC$5O*%"1uLԓH;!L'p;O/ \]2L]HhhY'D/)4vض{oߗѻWj;mc%D=۳j_nVib +߸duTPƶo/.<=㬓/.A\(r{׮qba,dݾ!or{ x.q@yO?F)vjo[$e70ٰ4{aWْ^Mt+冻Uni$~~<`fk`9E8V YU}.}:cFORpQ01\%F{xW:.WGxKbAUUhV=?0[Aᶚ}X.\9 >D:bW;g24|Ԛx,Ƣ6]ƛwvل Jk{2^I(7@Nn؟jyD<}x7R|U a?o0!ڂ_/fG <.[5o0 L!E66L1t6n8a,-ݥ]xD?{vQH Rk6Bl߯ey]Qį7ed3Pz:5LZ ǏXqnSsQҿuiW40?lx68Xr}yv]b;_w g;n+VeO&߃o;Y7oz|hֶ:y @x3NxyɅXG aaXC{u;&:.<~ױvllBOu }t`v9j'ݖ!]+ƨ'QLM+~2!p83C&Х`yN/cR^ۿ_p܏_VNN`'ۨT[V]ej_~ȉH)m:>1P2c3:a{>n?N} h|koy<'p1ptS1,VZNGύQ$/p( f1ƍׄN!)ŀ6 5{#(Rm9D {i M|>~aM{0^Aė~ߊBǢZ :mK[a6x\x_/Ynk XFF {0X^$/r> ̝>W?jE!+/H(R1@UE̞!4 "RIRJwoKB ~W_0163Z .3/%"ת5 |e>y,JIƂv߯T ;*Ƈ^֙$dBO !ʕt_sˏ&7F^ 3?+"ʵD@4o` XAղ">/5ac"LM"V5J(Vdj%16:5BJE!ٌl1HfB!6T"H^Ԅh܇]a"(*x7ᭇQm.SaM$!o \>PzULͩ&`CU6߶ Y]ZM(+e6%pɃlӻ<> RE4% e,1hNL+$&:rPO}ϗ?m- 0.2|v~a6Eyz0S<Xմp41,m⥫jOùܸQ]懵Cxyyeφ?4o5m!(ceqA{Ǟ?!aM?ww`S#; NxzkԱOkkœuyP tQm޺Q qM\9V݁1wn1aFH%_1ϲ= ›l6q0_gX\-R9D:{-ڄ@1R@HE~f"(å%(b{5+|O4MMN ٔg iMdt +z٦+v`?-A~LbwՓZQ:y#Cb6+2}sw@Qxm@7Zh{“=^UCUr,a'.iX|$'yP{hcGcH 2pϛv13u8jip-AHNA>ݸfCN *vѫĦ mAEc. bczیAcNˡAr/6n]$bMv ab $1d/x3@"DDob cpwXZjS0+9I Jy|!|UCq5O\FZE*t4 dzHChn0%`R0VA`{O ]$LCP$S~gg2aֈDMoXF]mvNkAeUO(>nvNHhdf ]8ѠGZ豝006c>Ǖ$'oNaA׋eZ1=W|qPId N'j&F?;;mBj0{^^Gã28Y1Qʟ>sv3zh7fcjk!)$FZix511a!xAȢT7k`+v t7laQS\4QGaZ:"~xdZaܽN^!| ^{Tl'!t9L?&m Qfi"jh;|=}f'ް&?)2Վ'Rh8ήL5OJ.|h l Vͺ1lwwShXBgP>X͸Z)H\)Oa|$0 6n~pS ]]E"9m+VHV: i-d C+>=W +Ȓ}lPXrֳcĩiIil&>535v% =^W~ ]T 闵Ƥ[*`ceQˤf)/_Ufs0620h\'fy=0h5cb5b3ɀq@ٹ3m{"1Н̍U~B?j mlwVdo v H|[m&}P;}Տ3rLlY]ibkz'f]c O&iigV r`#>1d|d+N<%1i_^!0:h:bSk֞>Z [`N#9rBQ vvv0iX lk7׭ ֨ef]G=ZȞ6]D"Vk$NaA60=b@@& ?фMoe45"afuLGnx]&B^dw oI*Νō76G2fvf.{"BnaM+kqiI`.ۇx$(۬!58,RC]٬ʤK.ZŮ]ξpƇtt> bdvl 0vd܆#>!S3{u)D1ڗ^,F;|Mc:xW 6.MkP(EC]神3S[〰axxr>WkX ;6*`j(-3sǡ&5[qU?w Wslp wFwn82Ď9D#_oFٟ%{l,B/u9!&dmز 5/?!>-8 Ҝ11m.pz/[]CN(< !gSZ?r>A&n޼*FXbl>cZ^{Z}_~+:蒭{9D9#|jcX˜!omS*ic:?Zу>`#lyu˹{V| [LF4^i̺70alEFC(0 ]"A4]ך>-FѾ7N a}E !uEV4a>26> I <~b+?m"(i0hW˽y_b3?kttTG]IR{wq/i5ݠE!;5B Ob&P"6xWѨ4]~{+##_UE):u@1 %0x:; \l kٙΒҮWSjmgftPFv'Wr/^8/&;@ݍ-tK{̘H ݨfbmoѵJ4RJ4ώ|^m騑7H&+!ZY#㱰@Jw2&Ș³\Ac8s1( ُ6'c BM_ c8"}!TaZ_~Ch2pUicnc+HJ)clm<~Mɴ2W6uU~,evha1kBvb(6w06:rס2,C*qG]aPZ8鼪!s.4J9 !DqdO-gGmQh}1'+ެRU`$=[V,*LѠ`CCCXzJpj0Jx:<ЎhP&bHsfcj +ZF/0ŜcSa]#C[vhKG](v87;5R2#]yM^~ғN Zb\Ӣ7%1`ks]a@DЦQ:@UP7)Bj0¬Y%FQ-l"lW8:'L⯬,+iu{vQvХɰӧ(J S6S!#B#{_)s|lD]p d)t256. ȸ2ifkKy]=cEdf8%Hx&Z.ŒE>vd7"=}ebgG'OFf:-kOxy\C,M6m FȋJħJj/:nEk` 5>1iӠnk[jߥO#㠻Xd{h"675U&ݿvmӬtvZȹ@*CyE^+{k"Uf`؄t&49-kՒp^$9u-'Ium &H"jp0K  ktbpdl$gkbk3 WK]QQ1PEc-Ss`0U3_\ ayi^4TLWT3so?+E(/8)}}.+[!rVH,cZ岬DGN3==E}@Ԑ%A^1Qh0Vf._B9#D4DI؄C~WmXM̡٨t /+]W04OԩId3Y0~T1 +* cuI/қ Z+ M:=$ !t@XRӖ!nnnhn}zhL~CqAN;MBmL/+ˋPappYE-y~+*X,u}_03bk"D|Hu7M1V|>59MW+ua 'e7<ڇ?G>aOQx^~==plюG:??'hoT 0Kb="bGQCQo P__EM%0]PyL&NDПO޸geLG bzPBSj&zDZR3&*=Zl07qj)W0Ux'hޭ9Zͮg \bK,5+cATrLo(`G g^Si-f0[:^,MQc7fĈ7۫g|N 5شp1:#Z>5eħՏ5uZt RB۷Tј#^y.b=Z]Yd@>Hk 83wF! ն6Hm5!0%=4d ;=w,9C]ZD@#C#@@ *Euj!KG'q눦ѬqKu;xR HX\W>rUc2>.a<vr+_Ĕ&(*vj`>FayVrHd3gN L͕ f #(€3i .FS!b4Z|w\esn`ҧ^7.>+!ڻ?h &.r`2030 {6BwT͛.RbW^j]M`g_9X,q)=bp 榴:-Қ W*KfT,~wI(~*15]C1FAIE9>_XGF'Zyn:]9jJGy:=(fKmI6ZvFˤJ~}p{GFA! kD{jifבφ I meaXvd:jm7JʏHXUDvMxYv=XNvuM! h|OMMqc4f舦A~U~QpIxsdwJpd$MeY Vwwc}U`h&H!!$͵2DAZzEO[F3|(jB;jX^Z4~èm'Q8xjT!-fq1ܨhBHtT Lkd><|~5ĵ;w.Hk&Vu\| wn#L@N!6V( ^0b$ؚTQOo̥8EoE~\veuM۰z}"Srn2KE"1rt4KnP)h0Wm6!J"'؞ɍ `fgiijg/۩F @4'+RÐs_XİhU=RbwwG@?coFu!鳘hX &QU|t12mjfN {X F(K +4X(", &t3ٷ3ssS#Y$9 ~H'6G/n`+ᡡ72K@bdI1Yuzi-7aͭtn|:V)\-G&]JD.&D T,jn;>qJ AaI =yOIÌjhlNl^ gx׸tՎtAv멙uQ )CTfâzg)y0k>>`Z4H2 spI' 틾 |q ?xDa:~HDDDtГ""5%OH ZA'X x$ ]兲gA/u_8KQy4h$# 8o@=7){4<=<ۨK7pL8RiF{o={k{DDD'ޯwy->#ȊE8ꃏ! Cyo7_aM/S'ILZ)h atbK`Iv*[㪊# mt9g|y|gd1xrkK P?2iϸ㐛78GDDtX݀ 1 W ϋMb.muM8O.*sA;\,=܄Vvnan}}=UVMG\r/0k\r\=G4ЀC{v`xc>8sUuy&R 9O8Ny7| 1QI3ŅSGcHyHnlhb9vFPoy6&H}Eq?E ;?y?\DDD;3,`H;D1  |x‘(.W=5zT{5z4*갽 f{DDD'4Ը%uK?94My>5.Ɯ9^ybf5D߁ FaqJ#4G5T~8s@ʞ? ơjVF^~#5~(<)t?$u8E" ⏿ R~Q2p Ίo77]f9@)^3fdM3.(R[ 9DDDzٖL]A` P(Ʌn_JR;l.\էsx`5=8T/"p9JKuR/SiY u9Lw}?J0="":嗰/z#Ͼ_dy%r3AȱK.8r^o|w˃nBUx9T3o "Q5EyxyMֿu ^mpz?{ĚPJ{vVvowD;GoƏu_ׯ?;n\C{3፵QzP+;q#GbhTGAڏ 1a\z~/z|Hi(1$""l~Tv6.`"ee fFc1L]#i_]^o݉,띝 ,'핔u_Uw^{>~ӕ[_}=?O!|Oʧ+ߺU4Ue 1#O^c`#t+>Z\UEEcms _%a 'AۉRN ǎ6#s .<5QsGPhs\p͍ \ $D-ğ_}>c^yx >.]Ss2vmp~8ljEqϠrt^,0ޣ#pCD]ў]մlq MRIؼ 䗣Gǎpze(F⹟=Gt(N/D~]b{0ؤ'g=\xO{Bk=>czäҹWI0uF{Ao1.v66 lp\pZs,‹ >|#؋%/}S_6pXHDDtBzSXE1҂쓀U3ɮszNP>b_ qM%%.Dv딗'0W1PfGX8c%7v,^^ 4mc3څ7܁/$ Pw T؈5۪UGӋ}PFcg 8kZ?j5ܭQ*](,Ϳf_/R'sBv]}(N+ԍ7AKε>kܗm@75 .#ٮhH]=wiz[v]$gk8Ne SdhW/tzTU:.?MA44޸f{IQK)CJch !Kve<'c|/Fk&{O_Oۃ\# "q 6 $۞h M G4A Є@s|QBo}Ф|yT8ss!5>?ߩ!u܀7v*/wv'ϛ3a$Uf.Kfw%S1/ƉQuG!.ÓS O G? KDH.+{کL%23=""G?uup򏈈Խ1dp """""""ʊAG|uDDDDDDD3` LDDDDDDD032?DDDDDDD 3` ADDDDDDD1\2OQcHDDDDDDDDԍ1hl '-u ]"C}C9p\߉;եϛ/8_㾗a)k\]0F4j\% v1}wp DUf}"mqq>rsVk~+**(vBss. 99>H灈# {:)ϸs3V=~]G]T6!p,vvMUU4D1/3ahy.p-l^7^x Ky;ט2|~8 ݮNH.U#>kl-~uo_ _: gƝNĠ<‡O_/:LM/>F\i: ݃yރy풒]g bTUCQt~m6h_~VbsΞsb_sGY6+D`5c}>2A7A_n^$DEضYqJq[*" 8VnbQJ C#cFK<^P*x.?ò֚Qw>'i{Ǖͧz|Ewl>lb~mv܋~q цsMMsbѸ1QSTX;j_tDvbܕx3/߁ڄ߯mf%""""""j @2iMصsi]2eWޏ{^ كSYà" +Oba'RʘOÉv6ckw~3VXaSOiZV_RԾG,3Eƻ| wkV`Ȥ1(~J1+qOGX**^z^6Pv#Q#>U:QvU{zcи(~3Gl .s c^RWOFsO?6NPn/xEtl>nX\qG>ԅ$]~N|qa6tx7Dd uڍUC垄[< XPm?oб<$45E뼋1EڀWׂLӾ_f%`gϋ'a"ýˢ&i\L7Ob{'ܡU{ĥ,o;+V;tm¦kKشzXAf*v[jk"/vp7Ylea3gN;\(om>.)GԌ6n ^^8֙}NqPx|o#6'}Ua[Ziܯ7^^xc0v֧"lWQvΝMnaI&""""" ~V.z8\p^0A]O_J)Cvh9½OEQk>WzCƘsZQqe8:~+7aa I0]6˧"Uc#i0kєe{Ruk<ۖ&֟=/k+5!'MЉ}{ uiݷXqVg{!#XA`~$ka#?2Q1$|K=(b }oU""OR(M8R0n0˷At?{ @WGmzĊHtsjDimB7x EQh(kwc)8Ecyr~]g>!V~!R~{%cey[νde@6DĨ6[;jX}/?"""""":*2O )Qn'IFcPcO,CkG?c{n6¥o;KjQ4ZS)`p+f_kқ.@UX)zM\UȞݨR X47ZmYb bvXVs&-BbKO onGՆxy q.3:ϝY'm>3MYb8o<>64Kw`vjE=n$RPmP>?"yŌ[¼Qcye/amSQa đF 'MLjwx߇5w;<QgՕPO1KR 5p/P .X`M8VPrU2loL\70}3² 'j}w WsfTn9u`b0̓xp{t,\?^j jKKػQW N4#$+5>wfڮctr@ՈoG >Ex٨]j!|Uיsـז4/c^姞A.\+ƙ7, dreݬ:~Gc| {"<=< $"""""9<']kq"c+oaW싗G`?qy_o5ؽYlZW`PqŸd,uR69%{B)VuDc981̉17a.MB367̿u&n޽PXN9šbk@xX[wNkmͱ9qƏ:V<:[?%FSAl %νx=[8+g}Dqp[5DnjyɟgeDPm#xڗ1<<h DDDDDDt4VgBY3 $d()Hd)X܉eڙSws᚟Wޏ{^3J|Pϳ@ hV,㋫*…Ɵ܍zN>+K~xqIY-HMYr| @"6TUG)c0*kr㴙W`@Bq*Ebq8mhj͉MwqJxvV`ߎmv_J՟24-˹i61G=1R*ڒwf 2k2ǎp q_L 2 q'ǃ /rjuOB|fE+9SyިF CD "{9rp֤)^ZfU?9v`ٛVb[_خdӴ~z9`}FJAЗ>YJMෛoq[7,gk/%Cf_`5%jU}g?-Cc܇fxvz㢓'CTvKN)qāH+lC)??sDS{ @̝Љ/Q(_D 4υ u2tETJ8iL? >iHKcjK0w+1Ľ ܽ83rxqe{֘q՛w㣕hTs/xPP:C1+De2qo*]@7}@LUFhO[`GDDDDDDD1=|4)ԉˌaVh]>Cen^{=N=lU-Y;uPŤE θz*|;?ͺkX.lAS܇&݃!c0m k^;34AqzjxL }8=ɇ7yc%DDDDDDDt`HJgV:K9%KK R׳@L\拓1)YU}mǒ{OU0(~u{=Ɏ#Z?؁~tŠg?J [rD_3kDUu| 6l-Ĭ/OI  '&޽mTɩd5ÆKEоEr8wy92=03WBi3'4 qs? W\a{(hԼ)WMrתKCJYk6/4=|tz }N1ޭWn#L}R:"[JqJPvue C!/3n$Lb5ٳ&7G54cGT^zJf')i,wivU?={hʪ?""""""":A1:k_O JOLZ @qY~e@%h"<'?T0{PB@u~Gfȕ.w,XF;_<=3?j0&t~DDDDDDDtc#.a_RJLVu vUY-?v'W/71o,cO`u {{?Ij65Ժ/s?s,~RR:ɮv7`IvPҞHC÷f;UB:qi)nk )F-M'MBoOO~}h7c4lo-قXs0e?.-Qgr?"""""""JK&S՗%G;e SԮY 4${jt&pL.Nv499_u>T7 rfgub3MQs68X2Ο]~SvFXGDDDDDDD]@NCƘ~mcDjI>UZKF_|8`1ۙ2q!&| \tw}mH08ix7/XzHϲǁB22e̚|9  N/$iobI+ڐ'W]O'R*Td+f't-gcS|^g9܅!ҫt  .=S"a[⦸+v!:>#S&ҫ xr~H|HZz:HƏ*VP#-YZSM{H^Ouq1^nJ4o|{Nf+GfW`""""""}Vh⋖j?)#Z胫O^qhQCG0>-Q1<0ʠ!ͫfKϞ㵝xq6!o/fb=ï4%Kjo_]f,Eb^/*`|K4 %{ǾP2ڗǚB 7ݷ ϛuk8\nݼw?/,ZU8 ¬Fa_7ءa'^Xmͪ>rm2ގCn*<~j B8]׌=sʰx Bu {LA_f`>ϑ[*kAa-N1cfO[?5nH9E@tԓY\MЉ+}9pT|ulVf~pWc Xy5l21G,WO79ogBuuo{ӺZ w_5MgV]tTlW/Nt7 p/AM3[^cEj/or nN=e|CgOPtuVϹ삩[ɕ1۱f?~^{pf'BshH >qbӫ[M6C@"""""":1 l{Hٻ&'@Ƅ)|HvşӬۏ0'DŝeDcD xn|b Sˍ&NdzOoik!2͈%Y%QqiO+,q IN5<0~cf?p;?} \x+|r@Gt9ރ׏i=xYC `OTP yo)Ot#7↫K޵a7eŘ}@Yh]5x[样?>:rQOPxoC(bqpb0DDDDDDD@S*Rk5 }ru-$ԩGDMVŚ8# b*B%a$?UyƒqoŊS8XV=DťQcX[L7.5{e;R£~D@ris0{ Y0[Yukl>1N^,hY&*nkqI)]~*uRJC֬`Qb½Ѝ=qs|p"Yb@71G *VT9+DمqOً-dWyfG3m1^^7*ʴ[?O.'$לM>[k.$Gyuvd\{֖\?c1mn4g6o?ҙ^ƞbOߊK?\o(uݩ3[ s?goxw1q̼`+c "щH)UÞ!<$b_WZ/ )j xX*[z8uFOJ^x4+ =\}DS4Ϫ{U3*U1Q00ýo1qos_2{YJ $C|?瞻7g@=`ߡMzi?[K``O`VIv_⺔RlK[?!%[u Z9*#<0]?*_COniBjIÛOE)C)O3i-b\8nfd: |38'*v0oZ8NQaAr!y D2Ƭ5HN7d_|Ìsis%Kxejx 4|eg5_=ѿ~z48b;xVoFH7bW>4.\p… .\ uhp-}{H˨CJ1@q\ cQǪӃ&*tnNv]S,Exbjpd4pcV'?1Tn6{V-On?3JYГm0_qY (a+vNxb^; ]q>N0 .߀^\ɕ iVoVqb!ЪӲgSt'\ f3-Xɬ~CvD"W]8\WY8̱Uy9{,ƣVg]2=yk߇i2BS__[nf;إړH쯟(mVuv!o[w>U(+#XmF,j)]Bn4̳%)҃Et"CX_ چRWt $č66hxw8[E_-]I zθ3ҘX)%Rh2Z('ػ ys&4Ahf;Ít_kvT\vds ?sO]G}>twgD<&;-x9qy}=7]5ݬƻ墑f|!kV=vy}voY}/М9JW>kO71$w^_?] 7[awqg+> WI#H]5~`tLky/'aN+´f2(2dE=v9aGЙXUfΤ\s"g24(1*Q_6wÌ_k4,"޸7-3.&*4μ9q%uFqq҈qRgN<PFUG116lށ& _x<"\r7Zd'w2߸ƶsC)ez'T6Cq׭z_HB`N^ud|5VgU%J/Vߙ ^2,VxUh,][L@r 'Aڬl;m}xoFG9~~Kk4 GVs#(ާZ&"""""",1 da6Tف`5^Ya9&k;DϚW6wʈydk>O@Ɗ}2"qX @U@WTh%?)=KS$-G4Qe& RJ+YMgNXрoCrw֎@R yr8o< q5sRkPex|#5oؽx\ v}y׋. y?2'IOc/}d"#q fW^^g<^ܖ WNOv8}\o\ dxøƓ+̰Q{SGƯߨ Z2%m>Qh?խ9eΡ"z΋3޺fH(m?N0 {DP DT5D >"{!r $L՝Vi 7JAd9pƎ: l\0Z!fw Szfzd޽m?,'FX>q=8zF>w:Ӽ{ xry5dIO3DͱJ@1"-;QJY1}߆ Z닇Ldww̄zS' 6wpoC)\0w-I4T]蜩㖙f6SW-fwuyx7KQQoDYʳuF .Dž&T2>n(v![ ?ĵc޾l<k[:?ejk6VIۏy}==OlG/N`3[788zH" b4ƨ1ƒEX"(4t;o7uwvnE}ݝ۝y-ZVX\?Nvͯdž-\T:雼 Y/WřfKYb߫`F{-|-Pʅ #Upo{u+th#,ɧTm6:c6=s [aҙ[rpIㆣO*d׆]tu}ӿH(L5`꽆HA>˃C+ X 5SeVROV7ׯG6|U*mԫRnGUUU00Hk#Kq1mS੪1$v%r]O?x ndo+%.xsΈ)#m: 2yG z}Z:d<}E))wޅ%ݔGf7Κ6zv \4fc|lߵOmOij zlvo_eg=RR7>| } Qٗae㻻Fd^""""""jUF#ܲvDaRVJv!P?(PO/v˴DLV娒ע^O r7Pz]Obixz}tUղo،prޭ0mv50k}bVn9vUÖY~ oG jpx8oG]+o-Kw!˓:`}¹gƽ*XwXX$Qf iOϟXVio$""""(SS~cPi`nKbtrc `# W׸5R4*ͽ)DJMZ% }deJ?#jQ7/6Zuljy[,}n)F Fg e1IpԔ0MhIp)CdRBF!:4L;T!V:iu)U}ǑUs'>]Q^K#ƦCc*Uݬ<',""""""V] QPhhQS2B#OR+ي@1jM)n?VDShaN?L Z5ؖK?%RC+ԣRZOX꫑΂ڡSK0*D*#gL3/{Rf5jb*RΚj.ߥ~Ju_ILl/jD<|y'Cj׫C{vS&Kx̉>9uw!6VzLDDDDDDD'7xQG`U}maf`Ji?* s7@|F^mG/S;CK6u:L% G*m*mOMmJ RC:8!Զ6 wtBDDDDDDwbޣBϪ%h/njw+>UM%Ԏ>,}%~~UCHB;!)ZO/do &,DcaKٕ6 ۲4)U`[oMq$!aj$"V^E>(?!(?%R>_}?S^I +Z`ߖj; 6,9LJc۴*{@ЪU~%ܰ)_ MyB\ @e,%Q+0*XK G((( "Z}P@@@_SmLܚ 1`?!LEDDDDDDD0 Bv j+:`> i˦n)jrv! R6՚+5!mٝ9 Z0؄] (6miv<_C@Q4332 _*0cG?S'ۖyOSӓ>Omb1{\ɳ'd<Θ3׼ayN5;N㷵|X?Nc""""f`Uo7+p)^dڵN^[RJ觔\dnT2c8_|v ?&oY,F ;O|ҺM,cꬁOf;cZW8$9g Ӽ/gEcOc"r2cT9~gOYw2~5GH%Mk:%S*%mҁ|yʃW?;0 T=ꉡA ` 4e9)7mLE8x$^Wb\Y&)E_P}%^ }NcI6ߜa~y{{܏mw$<&"/-u,Vu̜*9FԞX3N>J'5{B\ ;7Npz]>%'!vDdy3f:Ο/|狴ڻ/tY훌vN?J+~~Hm3U~f־ OýsrQ&OtHwVjTBv^1^3/vܹo;&\8w_ gS>Ym*w/׻cņUȎEd[-kH>y*CDDDD 1eKX-C)_!^tm|=ӁÕZ?]MDA…yq}K^5x,)  e#VGڻ ܭ NX KM3{Ӑx;)4mwc}6}_pTwb-zm ~[ ߎAy[pGږؐӻo^8q >Yi7/ ~M16U[vyXX,M>n/ϵcp>v=0ōlǙhs.#o7ڦB<Š;˯sF,Ω 9xLݲ9 1&RUPoE֏xlj! jgGVړ9X{PP|!^xo`96LH.$4{ya[!=!R.xrw!6(C-ˑPuoWJ brHv<0=Oslà qE86rG>NÜqxkt%abԚ;+n].-Vgy .XBަ=x+d՗;*e:J}#XԴsMg !Q~}g`~R=BR9}n&?: @RawHÔNY]Byy`7>j۔π~ViKfvBѺXݖw˧iix@RB&|뗖BJ2n{jNۑgM %H؝UW_HOr[]#67ۋc0< gy8$ WMƦʰ|M6^2_9k@jjK6ROѮF(0Ű냵 p}F3Io3WxR}83 fzȼy^i#?T{Ԏx޳1L,<- r i>CZoz?qg]{ U`h<9ڭڏ8= wCK[ ŧlKh!nhz⇈جѹ-h/P_u{jmמ-a_TR|~e^c8j4ղߟ lwKak6C6@ÑMoWIRhI@s`W955a#$d+1._xS|1;@*u'IRDm ^?_m-Ekn'|]zCwzv@\|YRE ]G VBܤu7mjI+% GO/KcukܦH/Kr߳C˕O?pu7ۺ@u3hwOj ?3F$81_| C3.\@} yy^}@$K' CpU|#BDӫRRؑ.yK^ZL$?gsYxv Dԟזq+~%9SY@l$rZCVa\>ڎJ!S }=평ZunS>ǡ: Y벅NeGP!)/`W'c,CfТB2gT+K"EVغZ=m(Ű6-_<ށEP$L&S1/셋ώǔ#x U[+>yb_hnyB3&}4Jig شkvt_N,;R,ߓ`ˬڼn<⽍.,4?_^$8/W;ǿ‹SeFSQ $'hh{!!D@ V O # ^S§_+ۡU5kK# LOC?!Zdk"(Y>s10CR@~ul)48.1{j\ŅןۂzY:vE#Ĩ#b崁Al,OoR,Q\ t gv d p=m``tᕯbXL/TڡT}5K.xk_ H,a٦ _'wCq&bꬡ}9x _Oփ~8iN!*aI3Wk;0dPյz%_۷i~o(d$xuw-q7.2z6`e!9; ho ܱ T7֔m6ELxdV~h bpW^YR'1Ӥ&8Kr KK7a%qPUcZƞɟMJ&o_b[Jqۅ=17%"82/}7_0u|7 kg^,{?H^f`,|5= Hj?Pᥚ|zEԺ%HTSذ 9~{g>) 9,GDDDD {ڕ~*CZ̡tk~~d i1ZgL:0Ɖf5 saJXrRAQr?t0`}^Ubݸ,,+_F˙bC=&. 7w">=3R G>xh!|snx%8aPV.oiEX3~{^k\˪G3`v*tQ!>[:K^U '6g%W|9ۃ7cMqoQW,j\ǥ)@<x:쿟FQ~lzo.{(,:?v !oRi ?g[^t6kX˫FwF @]-vߊ >38p^8 \ܧC\]c#p_L""""?"߸M4U!ɍ%jmjjҀ~!QCh3JK}s!ַl껨ƟZy5Ii]?L_TX8JSje-HEF}Xޭ;ED'ڱnMNgAbP2Ą3?lvg&E QF~6yE6o ~Ԩ'%%锸̉`_c=p9,g m 0RY*m ]HRʰ3O_?Z{B C!#XT \^K ԶrqD^ilIeR ެe# ߐCrUpUZ?Q! dP)X(}mUEs_ ߅,9v5׹+Vz56D'Y6! EQ#/e.cCg\-A9 $< =k3wkl#qJCgT-AdGDDDDDDDх`P.^G ܅J*@2ЬA9b}ص/ZE @sgp,Q(WU_e'ğzklz!""""""" RخwDPKh8!1i](K3bӑLo sw#$1RDZ+e{vC(K;kNBU%p`|֏#.cLFrlbc e׿o<TUֺ૫Z zZzeGDDDDDDDQ`S>R)4 ` ~lYj'$5.xYuE<8l6 j~~~~^ ץyF>}?A1\g)`4Ä_Bm%%u/x[Wʯ nOܒQP$y~Al:SP ? @hZg8%4;v[–ϫ:"O.9nQCʧOiʲM!dwPÔ#;vb\MFdRQTg;Ɔ }N 0 h>\8WoVTj>~]Rzk?SRUW Ҁ!b|!R¿^CwHLLJ&DDDDtjښjtL? p㛇_(z0F`CMh? K)#jJ[#^_ïگ Cz8PO S/\g~ Ƥ`P66tpIqp'5ߚG1|;p,TIDQ`h,4eq:H?%#^$cݰZW |P%OO'XI1x0wI͏`>=0 EQ@W_{x%VD7j3>~+%AЂ?ޖdPT>~z 6@bbR X8""""cvj64(ٴID]F×#…F' P;1ϵ>r{!)?~nӠJRdnהZKYӉ8 W|2%I[WV?"""":ִsSQ_/y=ADQ`0BC@ XO Jvȫt^0 gi[*EOEŐpm[kKԆpqV:1̗T :F#3Z3B@-˖CE03~>:t!Ԝj&8YOoȷdlщ&祁>~Br~R?7e7~\Ӥ$87QQ= 5!1[౶~iNH y\XI޷)嬾=OT`xiE+㦣0J?偤VK %ʏky,O0"w N &ܓ,Zdp-z w 7f=مeKg>fK̦p#o؜2G$sщ;XD0-.S4uO|{C֤z<;naeu"Q)QV퉺cI̯ !64QB}ĭو% (_':KV.t뵌Yc~M @~ѫ]i=?23$92hk1jQ/aɆ,Hz;~H< ˑa=vOXuv#աǝ(H l&3Ypz7!%%kۮDz $|1b 6h93J_Ъ9okHR{Ɵ.퇹!]KHc$ 2 "|/¾RO/暿q 랾Ϯ-G>.$~O̹1s\wteߏ;+⥣>] مړо{3\qf/ĝGbزv;fl 54 zλ 3V>tmfK"""?n }UY[1'cJg-Msj(% *P .%]?^7-o蒞8vyX](,%IhP9Ϩkk-g ZZ!08O{-zQq<^XO“hBj~}EpzkQ[v%fq?׶H*]Hx+;t;X [ނC_adX 5;wa@{ԕ8X+yByx뭅qxPYݱbq5o""":23/}^}D8'<6mv yNs6jr~HwzюS^~Σ=3 T>M$Ty9OV-kxv~8 `!m?_/g%]u쇸jcp_f_a[ 8=*=">?_ۂg0oVgjTBv^ ^{;;ǎaG]1:oU>{k-_] iߖR"ihL>s^_ 1ݘ*8X*"8,/0o" G⒥GS+?}k+ 'wЙWKGrہo|?Gw*u~?z)zy\?(̱/{ .r?|7)jqxF䦞k8縱a^W\?ᒾ٦}!"J-pZ^j: sOwb==eBфK'%1`4s޽ _xaMZ؉Ǜ14=nu/9;F`o7aˎNsX\ЮƤ ;#Z[j2RJМSICpo}HƧwߕbىxr]{,jl{?xאM87j5ijpF+۱/-~zwO i/\&-!\@zͿMOoCbq!ko.l}E y57C핪qpnw ,|"gQo̺*qy7| V6i~SS۱6kml~CM|cg DDDtOQ6x$ WMĦʰ|~|}ħD$u-gWֻq^I̿Ƃ[m9uU؝[ ŸTaŎRP8 +tmS \Qq.xrw!6(u˚D)pdTUN@ix%=Dl;oe>^Qzzul=}-FT+]u=pb&!p |]܃~̃~p)NHm l>3uhT "HmKrWkG~i #h[ 6 cgp'bǰgw֒4އ/qყ# b#mD_HCvG򋆈~~=KFvPJuHcSN>*kHK ;{?msN-hFbQRǑB? ;Bca'ƍ+ěs`Q1 Cb~<%uҜǥ'cl{%U>S;o$Ǎk/cQRK1JFwks_~6jQp[Z˓DsőMKP9$8]~7y]}DӲ写uЖ/\G^?vEG/9tvXV6t65ej]^t7%8=ODǏ}s{OL19=Y>\?oj1 7~[Dx$w-֯-)X~iyx\qхw_X.'mEnfHbz+ዡ=q9wWk@>$!%լJU~e"Ά3 (5mm0شy9R{Zs??Zیq{!U(F}>%8TN>c0-KLU y=/ցX[]:O dĈ1ӆ [o]%**A^c+{__C679Rcދ!Sx"^bTj#]#.=PC#""":^VϦ?Pk!`h)?K*AhS(N03]pTFG(>\W'§*!j)׌_vȻdo,u~)<o)N5 !Rݚ#`\2#t!=ߞWg¸OKŐbHI@u}0VrG1i9 h7K1PR/4sF4`')AW:$HBjCp S`= W4b@Mu |?Ho+V#1NKw,pV'h0S~"(hMeKmtr~ OWLUۨ&@""":֌&\BD J Ғ 1XXscP}wpa!%!-QW"|nS'H*hweȩÖsz/'Us'` ~;6TUzЏ'Y)$]e>dF/<~xյ K% C5t{θf;5xLTQ֌(hTUbe.v܅* 2LjLHU;sc?g0:t">(u삎rd{ k%:`i]X݃3\y%D ; =;웏 tJP< %JƠg.DthaW`žBΜ3qb52s^vit{SKP0OJ -%+P6Li[ t R:uBksB}+j(Si7s``V&""Okywh5rԦ?J~i6[9TR{BUR/#Ez'҉̭/n«O9rFV{Q񓀨N)]q{b هǶ"5oU񻩣N;oGJ(ytLq+uXn)>W~|3@537_8$U -7ϙ8?# RI-g.(!#؜HICg`tgx wMb,YOP'j.X%^{sqx7qHL>FOvt{ n~ /}Hp$!`Lgx0ily+,j4]._|? N m0j4:}s.EǤt@[c|XW^'ozu}fk_.r/RK /QcPzMMVRI3NyqB5<RpμXw86%%I/W T oϟ/}+Ń`S|[gt T!""":z/ _WGNw$(3㭼UVBiOwT'8ѽoW21R\uؽ;zq6єRGghPňz Tp=^ d;|/YMv_=FDDD'L{Z*m!ەҀ~~ vMNDI>'yͯB-Ի>A ؐ9jjjIT"77(r(y )>}_~HKK>A-//Ǿ}>8q"&OΝ;<k׮źu ,矯.,++ |>CSa+}bϞEضYm|y yz>\R>6y }z<}qzD:cFp%TIЩSzW) 8eS9S(qFh}e?u|_Ջ?{d^NC\v<ז CX ԖڹsN! L>G *+[ ;s7JkkkԋƄ\&$Դ .ٵ9r,&1 ^7G2=FCm^{!b|4H;fR y>9 5e,3ۏ´iϫ{q>[鯙ϐ'GR@s H'^ķ"׉Gɾf-"ωUv 7P/@yN w2) q.Z"].[9r!%+'ӟA_y<}"yMPr/zB apW3cM1υ4ʅY;%N tKݳs []ںz7a&ba)þ/rU*r*QSMRЭW &OYcҤΘxx/YY4)Qc}eG>O.ߟ1C~>O.ߟqy;ȋ0"3-qXqw;V/e#8ܥV-^~GG ": h'h~Tj}I}GQaB$@`@`T ~ !4K@);$Bz׾KG$Вy3 @wc+ Xqp0(L[] y8-?|t Og:Ihai3XB ]8jf=Fi /UuUB#WuUABp/ӭ&~XPr6j 6L.*PpQ9ݐej{m\9&϶,t"&@"*խ ((œ0x88 =%H>?I_X}7}J@N#U]|^iii\N|cepvvֻ,1^xpjQU=xևpj'ҫsXHj!Z%3fͪn2ڕ}/x?lu]~kS/ÁZ. KA8)f]]0c0]o>ڣ8[G58+|FۊbutOwLJ^G{?>$vW0w?7P\\6XoII bbbo5l,=<̮L)FfR" ;F6h&o؋شmb1Vq>c!soX8{,zca0oc2THNJBZ@&42{7“C1tl;oLwݺp $vx> _c!YN!³Bkno\`:N[@c<,'O?|MާFd#?<*E"{ʆנ+eA^ñ^EU3 Gw{b8oDdkDDШ1aaq;qbڢ%JaeoYO(&VptG&aGqt|'*Uֿ 7Ã=!1{Tڗxk9o#r6Vm]ҫrspN7퉘8vX.5a~IY<գ=x%.6Uĺ^[ {bǚ0B}`chxJߦo:dýc@`lߠ3|8ڍ]5]^\br}1bD{BwqqyƆ 1 ;OYBܻ}0cg8Rxt+usEyX7W^/}˱;YP^kkU.-j5ҫώ!3A@8 (qfb)lⓂX<$ *C795EXI1S(>`ąX4ړt ¥0)O7aVڣ {-ؾ8ApXN1 לhI#5[Cr=}5MlHDT.?{K@\M^N}z>8lチBU择kBrzF"X(n?VyҔ:aЬj9w%bLW:N2x<><((Xva.ٕ}A@^.녶F1I$%cOh26ְm5&ח`/}ؼ#<Ū _W޵ǵ-B0~SaBE-VB%'ܫ/m=CÛAF:S[B`31ilF>Cb@y]~wБwNWҥ.x`*l{ᑱ ݬd>#cSuR2^ |u ĴhWz810tn"q oYKnᱞuc۩z>)~r!!OtO+Ib3)'Q1Mn \sz]yS;=7Aѣ8g **j?8.m/*'| 遁ڮWq^]ŎO'oźG?F#|:A>0m5@FI?~\N"24~1R6mk]R]\;l?i?yW;a_^+ W=8rBƮ-8YVu5r2M+7!{Oո{:'j!)][ѝIy[صS0|Fg<ޛKŔYB-,ӳ*rHN1H"艩C{X=,EV#'o|*dI4M3;p:$*݅?#.C&%姗!FBp' Ïb>?LПwᢡM'^38ՑCob?i8 $mh# P'^K"<65J$oPSKDZB |y>z +6xYH}*;䡉i-P9Rvכ>xH|o/&mWx FoVƘw~>S[+ 5N3!@>S0կVZ`` A Lpp[.U^ƬEa2|R0x0<bcȗ@ ,[ǫja)ge5狙ؚNI ֮1tݿ<8*?YɈKL<ш+ݯ |PI)ay>=BX8 xktSP N8sX+O{+l}CGZضcc؉cIz~kxV*DE cGTձ'@ k(¥Kp_8L| ufVU bDG'؇u6aD~ 5N;#GaaLe/oZ BG}lZ;:7/W߸kSj^R9L1D+x)??OG>HchO,%j; ՘0V ;+sSoB[EWJT_L다0h.}kS?,b]JtNt#9: S E~p?fR%.l/{~ŗh՜=^_8BSOaU Z_6R\l40+p-Hzq m# =MlR %uVbX ~Kx]n:tϺZ1' "b?ׯD'kX\\MZnŠ0o~D\h9 wuB[^=!3c^t:D 3`4xk=_끮fhխ$-Yڌ£5|(<ռg5:R56ByyTjv{/hU6ҳṾڙm82:rz7n : J2NaY=+zǧ@R{X#ad~Zah2nTgC^@wo'VR)5pTLOf˖ywAGKteW% h70^׷]H-lྦqkd_むf@^~NUZ$ұ픬Wl"nRqWdgP4kb 8W(êX~h{׎ŅpJw ˫һ UW 7+7CkNoퟏI~{},ykDb@t{&]ʯN~ 63ξ{:ބ"&bʃv[qzVKc {Ysn_OyjN.D<0HD%f3/ҥgΜV [.2Y 5NWPG0z8<%<uըյV>d>٧cC<`@ppaTw?ߊ3 ӯ|Xp dzoXa0:BF#"uBpuĀ7_X,rvB%,2ȄA"V=PO̪Q%vt; -Wd-5,Ā A-ԈldgUz"KdSa+;Y)IPLxcܗbVl}@,6A6hKUɬךj} $ 6!+JQy rJ Ã|t+xSCl'j?Yh ӯUn]]q8R7l7C~؃^!Q!\cLk;R;ouFxxh+: 2W4H ]/չ3uiA׮(AJ͸]GJNEhD"!9_sd}0z!n^$ר\ iHL.&bJ\/uG~Nw]S2aіVjr#7\'Ur h.D$V(2 l?W]o"s_;]:"o=X MacX𶹀6ް<7yc`/_$%^O+k/9?w|;Vb Qyسk!_ k%Km.x/c(/@ڦh䨜J'Ag}̡п)JLg0{mo۸w7 y08!#F]zi:ルg;;_՞O _.88F&`ggsbڭ)؇_%b鳟'Cw<~@s &w/|#Zv&jЦ0-kL}gAO ]=FFE3F<gc!ƗmލQS ?Um5]}7z٥y'Uc!;5~R6/؍^5?u* =3Fő+gNxcf%Rd%7*j7=C_ B^CbZm^޳y /<ZIQQԳG1+x0yn0 1Ů-b%hJ:~ =w5k_n=1zd|/z ĩF:m ^_1o+*{{W@sG̚^x& ie#,*Ȫ aGO'w`cbB!h5H>N3ekr똹x(EU՜S)N} _X69?L?5Uڡ>Vizvpf+Q> /O91|<׀~5ًMἲWQ,3ٷdvU(K/>u3-TrgĢ42Ĭ t^ߒ\Vb=(ßcAY3qۘ0n,<+f'b럯#S岰nƥY\(NLy_iZo|aPuP ڍǡP1gO3.BBHS̿A@1'𿥃{U$ô+VpEķ;r 6Llz@Avh(`HwZ'L5gP˃W ^T:gꇋ0Դ ]w DN]q[ΝiMJo!h ްXxh-`NWx1 iGB]?Sk;ݯ+>z#5uš00mó8TEoan#!bp//UGpl,6W{;wC6pyĽqE3.A+1"I…|0`ғ/R6/p<=1}@%c_:fBz>*}>_'JHWÿ+]^ND]Vݞy^~]RA"¢] 5q7K>yx{b7WȊM+s#k:zҍ0kd0ZŃ;jm-_X}/?k[Gɿ\W<QS޳f3PLMsor;p%(wa()Hk|,\Ko,;CO6|G+6,ȑWFW?|pBo^x??8W>/"#VZ 0~n['һ ed"xެ;~ocZG_tCyA>.w&بKrUjz5oܲ ]$8}2TPrE8όK8),3Gwk?Fѝ0vSţwǵ76= g L>N,gމkTTݦl sb2̱MitDgqӦ qh6],>^nݩu֭^݁ I 0S8gӿز>;vϯ֙>XDWU8z<nn`#+pJ9u?L3~a"=y=;t_Be_Qgܕ M^L38jZtsf_qL.vm,`lg<804~ eu0SaG-gm`""j$[ĬiMQQQ"QQV'#9~:OAGߧېTnà0}0,QPir6wU(@ ճ5HwE ӻaA4b83Թ|BvqСfj[ɵ6k15 -تipB2 Zн!̟-xFGM0U`YXC'̉`!Jaf7XR^=]zq1-,ӫ'*L/ `a:6e61f\b!ݢFzNzn]#~Dclꊁd¹k^8Vۂ6m|&pS}e,`"f@"%l1rԄzZ#rXhDzdg`cc Ҳ6="F#>oDj!T))2X&AҢtme uMP W?.#ܮ iӨZ:T8:}>CuP W ;T*vm@ݶWyl>+bmH3EqL*NJXҵ mz]嫬ng ʷ Q·7 ŷS3U3g V/ba^*> !71(vY l-2~%[[6Z "px#`{J/m&6*42m/?Mq9*?"f__`l($""""""-[6)cccccccccccHB ӡ n+$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$6@j2A|`, &,A"""""""m?rB:RT:Z4Ɨ6$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j,e4;z r')󈹐Ar#"""""""lH2ۖ :_]9,Mó/Ƕ0MZ%nl _MEғS]Q#z4a桅䏈n,$iJ. Mu4 ( l]sx$S"P]nW/j/=<&}=-֕?"""""""$hNOîTU";أm &M*EHA)*MCp R4]6#0iLo i4;㐜R1݇yBWcV<:N Ch/\Dl]vB\ڡ'0z/,*;žK/BI|Sxj'FT>ùPXuO9ݭpvZ$T0wj?<`;?=yoH|.6 C\f `lVw,^ CDDDDDDDHH7j-aa툶U-df!Gi k[ K }윦9ypf_}ebN9 (ZLbl._ȇu+W @S՟5p>L%b/Qg!dr2iصk9W?[8\Ckv(G #sp~ݧ be7GKҐ<\ն<?C]S sjصvQ12"p|懈z."Mdߡrt?WeLZ$4iBQ 8{ 9ƷATA.å{VN߸y5iraîT($3m^m`0mلSCѕua=|Xy.'abN`td(4w9>{4J%4„a;R4j1Gȑg9'vCCӓ _:]uf@)qĽ|{X w_凈Vө~:?M]өspzR5WL֐ dˤ]ԱGxzgSq1S^rteb,uWr(F8QTzvq\* ֗6]Wg`PrCTL&kg?{4;Ko6ֳ$kˠ j-A!""""""tNR T8m,=K6EE; 3̒cVDo5ױ*T%RH$?w˱L O#{ʍ)Z;9͖Moi 1N✹xTX)1&1CYԪ=d!3`% e^kqԑǽx5| KbvFh*~VFZ~ JKO@5Q}}ѻOC"Q99e5%y*qm#smd#%T|mwU=s0; K RlgnRO;.ʡ)O Hx]&,SY ǻȨQ=zF A ; ɟ!dnh-OAyWϯy5 lH8aQ8jDa`n<^"̛ W\,֙P.rHbmskY&;DEP ~=- }?¾ys{S +@w3icr{'O·fс*N" Jݼ2.98L bd NN֐9ţ}w`LX6^Xg3IKLo|WЀBzfp׀5 lH1x0K!7z[ƝFIq|*,ݱ#Z[H!N?gXH`e',u@@?me YyrdsaϽl]gĺKpְVPk&1GqoQ` U N~?M7Yj%\,ȽĔ,h}{+t$ktz^] (Bvp4RTuǭ# ɟ!$»5f:c@/lgm`\3?a_3hyy`|ic`"O#KghZBS|oe`ӔnR n4b4f`没nvn""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""L"PP)Fc$rH55cZBmAӋDz12 ` RPsQ~!aG;!/-NmY7&oGx-$7|8n ]\ooᛝ;+.*DJJ21 oiiv03AIND'ڶ2iёȶh6zַyc/gsDDDDDt1HS)Z6R5|OV} Ν@/p 0uѪP.Cfysm]1XW8|2#oɭ!zp?<(n?yQACsw›_` ERR 76K;H$u/I d!>>]vbd&& ϣ6X?%JssP"U 3 yҪ?s{82drd'% Yj{u%EcL209]zBE (bUi p~h2vDbq<8Z*Әa"3 J-"5+\oAv;ݜL ޱH^5EH8e1k9ء:Ia'Uqڂ4%Mn~u """"ێ-zF P*P+++T:%3 h:aRa9= 9%m!3bȝlDbPg]%ܻDDDDDt0HӨPj$ДBcbo7(#ʲ+-Kftu7#::^6׀&G[ / #0Gw<8a"^~>1_Ÿgc|y fm,©k|()jX{>ow<H,Bn&Y#m", 2ZXieA 3`7$ckO% 82qNY7d2$]C|v9d>uLQ(\[6LƥlL$pGƐVzԸTkyUԏB^c!SŜ=~x (7d>̫2̘>{9k_>xc3<^OwT^WfpÂ?grQaaycq F^p$dB#af v*FZl.fD%5 AIIBic ط񃟯L%WɏڃQg E&CȊ?lk`,mn(>{0 ӟ,6:9tW  G2w+Z?q#fi"ٸ}N_3*'O!y$=b\'=;s fs ~\`/492Nue];H"^J"l$'DX5unٔ_f4Ll#Cn~lz0Sb0؍|v:Jl*EH9w 8+ys0J}]e`r^Ww1BF¨px $kx^݇*ڶc ^"EرjVĠQchڀ,Ap/0On}ƻ@*FU{tTYܔD/Wox[/%#%# D{K . !_&xDAyv<"cc=] nTOS!/R.t4@VYDy8\Q{ pcWO1wL5(ذcPu@^FJ- eeZvh\ޯ9:saIK@/F!qhma#na{u@a{IshVBOŽByADDDDD R'KLqy?|i5l4w2٥UØGkL] :}μwڮr #;Wo4EDZew.&ȞSַf0T@5)c Ae @Mau鎈h\ Y5Y  A8fB})7D*LGuhDsAj>Sg1/ݖ(؊-ZW|SC:p%{7 X!wgH X Cya+8,a}ҥC__s}V8g3zo= :zO?d~o;6=`/i|WC;Zfq-\&juR$2wM#E@"ބH!oW8v4P UZ4heZa< iN~60™S4(3&p^6׵:g,۱lwĻZuQPyzlHSC77mрǠV)ѨodBݼmdHNSIX/ FEg6p􆫥su>*EO-E8pR!4le^hksg/]}l`%ΝÄ7>[ n>D6ubb`N2XƠ@mqET\ ,Uj [k RӡhpY-}Ս܄SXZA|݃F]rH,`V[1h}GQlI6DTDEA<ԻaNCTR "N()Bzٝf7! װmv wDII Do_x(#V}!Ct󁷏 BDeFej/ZWWwh]e*WwgkC'}U\ -f|>[hu|VZ,;LWlNIJH^ɨٲJԢG1. &kn@W6/n3WnðnAלʼn  } tE?߄#^۸C V6z6#d W~zNiNx ^0z*b6>QY(N\8Y72"Ln. 1[-$\">8y>&􆧖 Kك[t(z_c"|Wy-7:mhY!"_8LjE_m˖2-0Ҝ," SGo;Y9kpDWx <1ԩTFuA_J=eOeE)۳v`\J^(}z '2O=us_2 /TP"<+k 袞jR뉰AvtΌ؏8ts*!y!ݪS(BP se $Jm2㕾ٹSm7vdB.2*NVI!""""+ZM="$Rq>j%<=ׯWOZX=Ѭ.*16~2_Gzp$ Y%}K@ƣ`\0tEƴ)h'xu ^~ ->idhdDan,CGģ 6 ngJ[eJ{]F\Zye09:H5U A_+Zx%co'b\w7[a`o1>xޖ%ջ8{+u:D[L++d(?wƲ%:[>/~(1T+A[qHGdυY9&|;#O""NY{qZRƫJFl=>C9=uEܼe>o,z$Up>nV^Ao􂟧F'@} k̼ۘ؛aVȅwh":wQ f[7g?T[z!$1Aa-_Dhl4 Hn5@3w{vOKDoB{?yH>GvTN`D}w&Zt}^ ұђ})=Wb0 v:U#%,:[ @d *K![B}EH :p ;)Kgw&EHTޣ8{<FڏH<{%*+95z#%6_;nB3[\_G7ODEAX؁DDDDDDWjnI 5-- Fh參6O,գsP~KSrkfĺ@t׸}jHቸV_ PW=5$HDDDDDt)W@uS5`Ƴ戈\@"""""""""ȅ1$""""""""ra \@"""""""""ȅ1$""""""""ra \@"""""""""ȅ1$""""""""ra \@"""""""""ȅ1$""""""""razv,(..Bi9X,f1U^__?v( """"" ԰//8F7va{QUY'1t5E{ADDDDD@"j³ O^ުsEsJAR4m[qqP: )IDDDDD@"j"'vo򵦂{8bUQt%q>~mǍ.8:Df5j\`D},;:X+Wh~?jjىDDDDD!0$6s?^+A`Q~w*J.$"""" =ذ6u4?Ot%j|KQGڬ}?JZ v|~L;]h=!"""""Dv]2r Ku0ŹIR~цsꩿNbw'XXO.Xl4=!"""""ҥ#5؜UGOy./W.˫ʱ'd7 3ѱ\澅E;LQ2Ip`&;VZ.Hݱ}s/ߏ"xMS(l_ɵҧ{_^O8zi"PlmߴBŒ[?;X0rPkGԗu{k$6/O7j7GX!À&~Q3gv@U?#M }]F EB@4bel̅ehrX}'RvN*%$حKݜW-#앇!utLIZgWA3q<X}?ǯGLe;n=;070T<7wDۨC♘F{ o"|,Dc :s]cS>]>Sگ_>Yv2Jf C!,~+pvnlMFUxx>5RIT%#'=%Qģ0g?;`体0};J/{Ģno$uP>E?G<ԩ{3?BG)7a$&MOxr |ʶɍnr۷t=ÉT@OkQ=7z](<KZ2VW_M 'DDDDDD@jQbB|e@JB|?m;qO/X% bAWceUDxEŀTk_y6WBӻ3k/bLi֊ Wn.Iú=M|/P&H뎞C/^ MS#m2`͏+6t Qꛊk+0s՛6 }Y(^s5^ e<3zm?=2 /. ﺏay^ko{]0^h?WV*0$Dڒ`k0x\KKcH?$!k' q \#oxiaӎՅNuTc>Mꃛ댙+zty2(p_㛥? >bW[|fۆ+]S-\I-; ?7;0>>(++& ::V@EZ_G#"""+iU: U틵2K3_XHDmfe[ӂm%@WHLp/>CL2o`Cd۱ @"""""8QU-V{q 8@v]L&xO0 A&Qe`HW>+s.Ʋ'~1Z՟6Pڟ?rqhviQt ؿ_`HDmg?Wasirz=K}-['Ѿ$"""" шsp d2YV1`ʟr̊B5-E:`ڏ"yDDDDD1~gQ[Ewš6` 0D;vQ4Q%~rRR4UDz 8oLQD"""""Qw?`HLJF J)4`.cc\SǰZqa!1D"""""Q: ̌غTUUS誧Al\l@st5Z}ΫSdzHDDDDDQ9}wo|k6c]:1A`\ʺ$ \@"j3{Pdmsί7~~hT @""""""ڬ}?JZ=#1p.m +]@\>ÒBl-ԥ/ƹRLR$~ѺsꩿNbw'XX;ڳcS_hij\u0KG.k9+bSҡM= W.˫j9d܁5~_r_mheG|ú8g,3ضb%6mCNkDDDDDDjR $,}O}[jZ^f[:y>ӊ AD@H=% x;Q!I w~,&݉ }|:\ZX;?z4<'ƌDDDDDD. xFfSӖl2 fǓ8u,u>&DujpW<}/M[,7/FO1h1j{xH0iqo^ 돢gׅ5k|!9U~|zg|z;>NSue?!l5awߟ1}x*⧹oa8STx"$i8F_c Xj= uCv[wؾ#,~?rqMS(ǝ} 'KA~yt>1bݓ@^Df㟿 Nr 3o9"<'cg`/CiS_Ɠ(mMړؼ`.>p c ddfbΜ9V}# ..6) M+ "! 12f24I9h,ݾe)l;v'bcCɒcBE~Y8[49 B!vZyG+C26? 5ᅯ0fx _v%obQ7@#^ĬMqCʱw;;#~|Fb1/{ oa/ȭl/琱};Nރ?OKt]6lM?0{'UC5l*cmNll,^} +L-ӛG,8~vCزz\ceUY1C1~+݇ ]#%<b3 cӺ!:dA^Im6YYFr}Y:&ó p_φٶ"#>* wα <SY79m9z+HCJr {'xP)X-X HPǾ׿B7M5i o̽YyZZl.rcɉHJ鋄 &l+Pon鏞=Rq_T{͵ckSD{UTw̝hݎ}{^y['@dց jƐDDDDDD dtlJoن^S!r z~ 6H&s  3z菁?ۢ+{7-+}mmݺ5Iwճ-U{DA#O# =>m1 R]n~5=֮^Y/~= άwjS:X95 ,,jU#`дgpGѸyr|^''º9obmRsml%Nml^c&3iaϿ6#SJDx)?${,DDDDDDZR“%n[=n ^1(cwj!85 Awc] 9-!xPDZlywPu76n]gh齖H *%G%`~l\޶u [澊uv`Bx N#m_šoqhT4z8wMٶ=Pj2uB"+f~޸d!WNԱ6DvGX ʹM􆟏P#j߁S%G^B(_j}B{5خ'WtT: j~ZYHDDDDDR+僯7|7aF4_wn|Rnqi Cɀ5?ڸU.Do*Uoߺ0[5gq<C9p}%{:C[^d W>O{ۗU33~lUauI%֠ &(ǐ=XHBxNp7@^9 /-rڑЩNj,j[Mꃛ댙+:n`)D^2n` G5Y"+F~>gv_mAXr5b (E$ۂ۫iM}ppckxC׫3pFnS=}C[@鴖nNRb%cv {ov0c`\-FqH H?]ůo#`@|8}O,>UG Lior60[sm7U>an,CGsP=oZPm ɹP*ŎP{'RdBfCEakD`58_ѩ(tuHRqeܖ~ ^_f{_ "Gc|jfs(bh|`1#,Y>?V{#86 Q~bK+ ឭYY>uꃈvT $"""""rUx9P"z}Qs'ӢFXn\F ]L߮[[܎Z멯 &qLTEdgüヲ2Loa lQ,_G#"""" QnjZesZ̰^ ˾X+C`D<󥎌Df @YUN?-vk_CTT$&L|!LHd-MV mXHDDDDDQU-V{q 8@v/.dŒgP C8EmJDDDDDD. VgM{mGQAՏv:(:(Z%1$݇SذϹԌ'4kF!['lƓDDDDDD. шspJ2YV1k0ub-Mqqnn<""""""W=]@DmGڀ%t`ED<9IA.ﭕW^o}{`b' Dfqݰyؼi#)0: 'خ3.\S}V\XlCLl<;1$6u: <Gub\Q1DDDDDD.  O"""""""DvbHDDDDDDDD0DDDDDDDDD.  cHDDDDDDDD0DDDDDDDDD.  ӳ =dYFqqJKb1k K@;Av+. Rþ0-^GW8VUVl@st5Z}ΫSdzHDDDDDQ9}wo|k6c]:1A`\ʺ$ \@"j3{Pdmsί7~~hT @""""""ڬ}?JZ=#1p.m +DfΕbR(Ne ^aBJDDDDDD 5.'fEu`|O b @""""""'b?ć_7o}yzDs>qn$Ua%X^d嗢NΦn3rFf5\@jۡ2':!:;btU[> ٍR~^1~F'@"l|wP7`ԤqS5z0Ů lAK'bD'΋XۅsFiOclQ?e뉍_?سC,ے܂2ow>6/xLB?ϋwǹ;]&pr,A#&a=T@.Os¢q\٪'Bc5ذ ֳ RG?iug0u^o7uXRs׿223?UAAv\ `G @""""""~:d,Yk 6.gB_q1F@@ޡ8.<65 3ص3{]WB/^ ^1c&=˱opYK_ū_ZC+2xPːsCi.3"a STlGҶmCAQo |>1j ]PoHL>@xo -LA.GNz:J&Ga(ėw>{'awl_濉EI=-Quz,(*1-4 Bӟ_,xW/<~h2k0DDDDDD:"WOt?Ѝ]Tջ1wi萄;یbLi>Z@<9~:<z;܉UkO:Ƙ[b=;)1ؽ #PsYW2*ж$'OUo\!2>F5O+=VӔ~<^{LU*6c]DRԟ\|?O=b{R;.f\?,Ύ_oHhٶ4CXO梫W""""""r- g@3u!HJ8mICLɊCY,Gi ȩw~)P7 0TAj}Y8Vcݟ"}'Es/ʇ ۡ_;S!mWRLH(X (%k.H8xy{ᅻÙK1oO8r5o-kIjojΡZyʂrU=A h"ϏOf`tWQ[ں"X>qu !ZgCV"3:QE` X?D |i|a4n 6 ڌɂk.6`wYn݃_6juI۪`Q+' [BAPWUsUH0kxdqc^YWjNy59Yȕ0u $y;BEm:P{] $[%=u-N>:^{ikn?tl+[PBntʱ8XmDDDDDD.y,W_wap܍< FMc_ 鋛Uoߺ0[5gq<C9QWem܎q+ P| B/V|Lf sQ֚L=! Sm3mW{`=`@&a`/ ' ͭޫkbh8Bҍ]1+m<Ŏj>V.*Շy>4l{ZlG]CqX ,AioX㝿}~&P>s\Gڃ?{ا='|`w`*@ƣ`Ug>i ]-enlOۮJ1Ys4o[æ*H:v A>WB9&U0km;CVݦvsy tm' \hE< L}^:ADG; @VV*AYqE Ǿ558-j|f_Jϕlde^`2;} χ0 ZNkr F|s q#;*?DqZji1+iV~xK+llS%pyDEEb„{bʔɈEW]Pmc @""""""WLmlګ[~qQ&f<' `Vh4uj5lW""""""r9 ʹ?[mZ k˴?8?F2:~ӱէE)`E՚DDDDDD. _>"Υf.8YhY/4 mFdx%1$0Qry@I\B @XNZWC)TWSX(֙>6E0󈈈\xvUDxW:iN Ӂmk$z[x/'t֪?V_z)2HDDDDDQw?`HLJF 댲34`ΜccsMZqa!1D""""""L0hdf?rRC[wDE 6.f(D. ".>A[DDDDDDDDD  cHDDDDDDDD0DDDDDDDDD.  cHDDDDDDDD0DDDDDDDDD.  cHDDDDDDDD0DDDDDDDDD.  cHDDDDDDDD"XdHY(f!ڀ udAEyegӨ,p@HH(cbQԱZ ug`׮HHLB^}V^^cYawHM틠t Z$N=已vlÐaÑ3^eI[vځ =DDDDDDD2ː ӷކSh2pd",V:rJp`BS#5Kq Y\lCpxgX5'""""""bHvkd>zOKGX.u_̲L(8 nq|+lɩX$SX:ur|zA5؜Uޡƙ.^ZM9mV`O_0+ms CXO-YX8vqy@[Jxxxxjz:puU+7~>>nN/:O%& FX%"""""cH"W—fa@~  ws DEm;&c1r_1r~І+ZWWWsm6@Qu*a6uEŞ* jqxXu+4v)z= ֿY ' ׍ǃwB`S%KR.xRf`l(83, C;,`ϒlKr PCt6'q|i9 R FN?S/?Wr~?|;eL}0j)γa\c>+!:xlh濃;spP,ƻn>bX r%F1"ƶ^=%q cM0V勯U&/-F/R;o IfVZ1С)>>/;IISҿ Bva5Ј8 (n2YOE (B)<ԲC|F]`%~qq (>.Eo>p5{ǘ?Ǣ^E3/n;w!?d,}  |mfzD:ӆt 24:d,Yk 6.gB_q1F ;tޅǦFA_}V}yCؚ% Tr Uˑ{ w*%ƚf潜fH}58cLzck IH <}IRɞ葘H7 2>s=gO>؇[b}1R4kU`dĵzNXػC7[?wG.q!I=CP]V= G&X$kӫueV%Ѯ(CuuUo/~C.^.ǣcL1.KasWt_ H_gS""""""r}-Zf Zfꐿc9>]GOCbϸF85.-q6};&ZЅ )!Kwg% 1MAb9JR1:y ^FCH_\pFRb,e_}q8rjpcʻY _ K * {/R^c1%M,1M31n[4ر7PPv"ys;{:S};_< {k(uV\QB]3ssn^>DRTCg4 ol^! W UWq-=\PI;%""""" @IlGQ(AS*YFy}+cXXkޏ8QiO=U^҇PJ$CNJU|C}cm7} x ܸg۠񘏸X@֩eR1)؋5KٱQ#$#::2O8 eI\rFg:ye5:O V@IY3!PSD]/Qj Ugww % *?'>ԃbt刱3uGLHFS?<.ؽ {B2>%UHٛ.u  o\وb b:lMcϵg([ O)ބ~=Hl[a50+> Gg_n0խOt "U𴇉< y%,܄0ltơGFe~¬s1tkT$:kgz߼>_1C#Px07j0u6]%ŚYII,:q.R^9ZWug,6y܀SGp]]G,"""""" @ҋȮ|d w ,Jb[w_-a ,޴_oχ.u2/=;INC=X?Y!'2GPX؄9_A!_+<ΓIe[q k?3B7F{ߊ$71x'|XyiOgX+G3yʜI(5ccZ1\1tBPS4{nk-u¯v$ZwV}>om˕Xs['v.hfZ%pqup4 n3ɿ '.hU!-j4L-Ƕu?`w . qt@""""""xYoOlk,oI:+-Rb+;+s?#X(c8b:fl > *ȑ())AӠ{+[BDDdR)ڷS3SmR /1ڏ!"""""XYۨTTU S77lWy)Qzz͋GDT`jfI>t.G&w_T%H[?x?J8ۚC#+{rX'"""""xHD& ر3##ѐkcO*@J1l=BLl/Nz 2%ˆ%IjolbŒ?""""":K61C@D:סcW(JK3DDDDDDDK^237CϞ}LDDDDDDD [f Q `"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @""C2qa*l> A`~ߛeK;WbmxrݕS\ikpxxDDDDDUbA{!RN\|AUy4VyL[)粫CѸpׇS_XCS2 WOD8t%֊_ABHr%7Ocop6_0JmDDDDaafY\=ÉѣUeAq_ fuvYU6|miR3=p n-b츁ճ6̖bh33T];Dƚ]}QJ*;/?#O~=7,Dp&"""uLQxkD0e~gP?;zz3TW3 9o[ ne=+۟=Xr3I@كcPqvLĎ9b}~<3m")ur̚g_ { Q?gZ{.ho qmR,AbVO::Eo`r2}6 1kdcHT_+6\N]ѯ=(;5A ,J$o֜CJbKW4{d$;݃{n/~SW`\P' ƌAƷκ)Nđ5Kv$ YZu:X7m1GWҜI@gR̷LP.ά]G/zJJzGxY-uHAкl=[aاϬކdK˽}Lw۝$ ;w׻ЧMncWL7l,9C1moҊ`S=jzժt$B1TU 0xۇF"L8}>/Lx2^:cfcRE_&l:?DDDDL muClD[92W1;$<˓a{,]+cHL}Y6`_2ۯ;z?l̀ [h/X 0"\Z?GǾgrqnB,n9fMDI>-?2E/i 2+U%Swu0վn*1B+'O!y(^x&fLdE)k=}1K^TJpy,|]O>@X7(~ o,UQv:~c~4 {ab;j22_J"#8ى4qu&qLlS4ise`,obxB{\^MtǸ&ڕx|HU_ zEX?r,G w}ƞpQD P.X\E[ڗuOQ mSj01HDt??MwXw;s& (79fp`Sy^|VjFUML\ 81$hp{AsD tX}a?mGǾP3U,[{[wgڶ*gRp 8riZ6&u*\9bAT1"u j]7s0FhSu}KH:XMRq8#GuNe[w{wkҸ7o 3s|+L%//[Ibb7hQ?[ƀLd6Ǣ{?߳a~B}mE~ːdڬ ql6z=b QU\IM) +ZIxIm`cBBfL 7}оeilmpfFi{lyBw)LNS*NRm`II&x&5GwE*+Azr:!\\E[їu1]4t,$"""bY'ޘ;"%W#}b:@ & DE]Kb;+b~J|b#(CZؿD7+n"oV\Yf7㐠CjEJuP/e" =TyϷ::Qܺ~hm_ZT=<" ["⦢E\Fc[l 3bmUd ?M;[[2Yt*FY;;V{+-HUbdmJg?X}\i|r%,ĵ]-e]Bҩ.?DDDD DT-"3xyy{@i#}^؏[a->-opda5 p*9JU闈$4$goŜv@},kQ"v'Um۠񘏸6(]HA몃&5""JT_W\UYwb]y7ɠ v*wɥ>Һ ߫ T%fTyC)p%'KV%B;Ѽ#8~. ݣ-Zؕr5l)BLd`mc!F"L{'")d2KklUDXXVi=Zs#;-R  n}CU*חKuڅJ{ :1{a[qe>D5GIʯȬīkhg7@#p-wfKeK\ltF;;P,ZvG{H;nu\+\?\.G~~+NW/u!;5S eé逃]gdrpM =!Og\j.ň?gQ(snbd$q RO{XX>)R O)ބ~=Hl[ [#v`k ITe+/? YGcFEHuF05oA7㓿fc.G~a4n%"KuX7e)2.h{HedZ;܆eξ]Yt!ltơGFw>TRW0ݺⓍ?`ptP[i>ʿKbgkp_(^;OM~) 8{.ѣ3fl/>\+ zƿ"`8h zv>1nL+w@#\RRj-}l*v*^ǍT_ G=}$3]qf0N#""""& $_~5 3Ɖqlv,K΁\bG3y4h;r"šCaꌐѾ3A2>7-42 |KEUfO-W`0gۑhYR  o[Ě<-`6ntISuбn8-1kTLY5<m ש.SgƥmX&(6fHu(\k>6̵zOA/g{Ʉv&/ß/s+P<6mU{Uw}a溵8v2Lq9Ӑ8`iO #xfG@trW:i4eZW"s{ά+5b8ۺ8~m$J$8֡SN՟b)c8y#dx ?YT]HƈMTZ}P"rp%F͋nSxiV7Ʒ_YA"zDy1kd/g*8 Kߝ!NxORc׬w|"z؊/b;c|̝w!""j"ST~XI2//7!VثE_!OeXOXXZQmbrĎ*KHau#8ts wǤBRJaȄ~1raP/nxQ Q Q Q Q Q Q Q Q Q Qf4|Y9  /&""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j$""""""""j-իW,( {666ppp@ƍccc1H5N8pU.9sFFFh֬:wI QT*FaP?^K%e^DK&om.T\\]vرcݎ\\\4gyzz߫՜%xMb1ڴi^zi*Ql\1Cs }(bc48y3.=!aQRe#rFyڟ؜8{\ХW0lk]T##pIl[BjC d#bz';xi㼡ȉ[cpjeJh<۝۱޷ ۋۏ6]ʼWIER30z1Tq|jIKKopM/88SNs=GyDs&~V{e˪T*8z(M^Ga?c]T|8&M[[[ܸqCPLNN9y^,M}# Þ³+#Hs8uN'=tXL~}(=fws9^۶|`Ǭ}=DۯDZ>)ϱDװü~L¾AoCݨ2q aB`0""$cɒ%Kz}||0bVIZ ׮]òe4W_>\QWzQ\\=}F!B[Woǁ dYP(UbO , `ylwô{cjݗ>vҏ@Ikbʶ@DDd&Io%%%Xr&1chWSԉE=e7Te4?5F 18FHh7M qfL3 Y=>4{Tغp-@nsbOJ2 ѴS<+a?n+˸*~+")-[Z&i&=GK˔'ت?rYĦ)aC'NDJ Jd\]Etr ݛIUW͞baw#%.]>ڎfdUʶfۤXw8+`NÞ=|`*aR zr,t2wF@}W0<Ë`o&*K뫧ŗ! _8)uC%t1{/߫@WڊXHZMguYU^4D!nJ͍JUg=a8Ǹ_cMi!JQ*rl~]g 7cxh#6V8a)V<< v9 /ߏ}݉w il+=>v _5b=!HTeZbs7ӲP4m`t~l4F>sO,F@ Zu1=^ 뚰.9b^ALL6x ^ڴt|g<9UQwXN]oT&c2g/}m&FQzO)݁ԏ0b|3{4\rs7 U!{x7^?RzUܗjVZ럆 `ux RQ,K@{ 4Yݭ޳o'.ږ OBRN $Vhg<^{s} 6"am47w>$Nj}zU Y"##5?̬e%;՗cV+qۏdA%!x̻x%,BSVb kGSf"fI1coPHM̀P~Nm3~JLqMam\<lFHR"vr[-nny0L@c%P}f1 L4BZNTv"_K>ǛD ^%3gY/S_׈ 5o ia"]_HK3-D~' 8_g ~%ͭç [e>B٘M[5l9\H^%q)2'm4$n_>> Ng S=*ĸmߨ2sK;l_Vhٶ)dN"(BDsgbn& "=֡׊:gu^+B'| P:H賒TCr4F͝k Un*+nyHN+)Ro>>mE'X8$\=4PhKjJ"MEȸ>X(0S`%I.Cc5Bl" Z [!Q<Ǐ5b¢MVk<=AXg1eWV3o,]92~Y苾ccXd|?cb3#M"Sx}YUugJ{t¨-`'Jcjň^>ި@^KgHrtY~HG=MtSnP&! D]0# M%h[/ct?g!hdEI8O, y_~'K oekUqӶD o<;s :[,h+uT'/uaϼ2%s&z'5"w%w i j?үC~R?cC6Vmԟ @Q?C5t]N/߾}x~N :t(,XÇk\K7pC$2Q~Ŋ%FA!}wq*P g皋x㸹ox:o^E.O$\nZ*P}fR) U^1 uFҖڰ0CGtl"IE(Lmu@Pfg"[ehvV^ؼ; MG]J1;#ΜW8'` M E37Ľ:֤#BgM@sdzsN\l؞SNg?>ā)k]A vC1wBPr%zwYH[4SY[80(Fe1AyIT-U¶zri S |Rċ?퇐e P6d7\h3sտLȗ@,˶u{IOtI>VqR TFhFƩ_2r,' {c4|mL\SiPIg}KŶ9PI0@X)PpxʴD,VAdc?$P+8V`oJ; Įx . vƣ5! [29G  D6Xac(okq,)"r2.Y3^FqlpSmz=ǫԭ0^ǛpH<({}h^@OqfhZB+;X &_{tiS:>6Mĉik±nsX2ģ|ZW9޺le?ðV)aw;Yp(` _,Bȸ$S .Uy;bq."^=ZV,׺^aMz׿Q --eK^ m8IڪӶD0nv4bpkne{p+JH>r`xS 3Pn_hŰ~.64BI\|:[9 =燆+#~- NQ""&?'6m:p䟚gZ~F!00/^$ XTQQ}*/l>Be PXh$02kS8N#.Ix;\ެ|nm#z Kk0tC|e\WcUG&GNf~r >]5\;C`WEe9]sb+7NJqC rp +G%s HڞBX_t .眑9gZm@Sy$=N^5Jڊe\nõ[XlGO_$4e+"XGD8{7s3|52UwҚQ,dh%yy:+ugǻ%vrS5Zy|4Jbh9Y~:1*O)l[|l8v>86M 8D%",Uu/e>hF ij[KJpJ,Z{3P$@q`^e3o( M> ˶OVڧ-b_j돆͡C!JucG-yS""&?ϟ\r ѣGM̙3ݻ7d2aԚɏɊx='<+GE4r,1hj6B̡l\ ' B$X\Sgۇ*輿5'R魿*WYGgC3e|:l>=uQ'}Z!%„LYKln|~r0ꄱfYZ? FGxf7/իZ9jWmRXF}bH8< $VM^5y5ЭִEѽmFev]Cp\= R4IS_yuA$ukNʡy9nɿCTѧjI!/z[Q7?k1\ܳ SHWW7nK=s{Az;QwL}_UÎǧ+Ha$U*VL8jX<'$F{ɭPo0# + 3MIx'ү/5֪ Ur􉳖Xg=3SʽVmxq\+ɋh5Lϭ¾Int1SzQ[i^[mҸh75k3}'I~%_ሾe5oI<WvT2U=a\n Tzv8Zg=Я._[OD)STT ppp3͚5VNpvv֔m;5: Rܒ/1oWnd!?/DZ53d&&"_k0.?hn&o<\ڶX|RU]Hf30S z_;5Uv?aYU < { *ߣ)2kLpf>f BbG=_U28trAE"GnzTW O,Pw^p0ch+0mw<,Egع,ó}{(m[yK"l;y`ؘ;v,F~}Z6$iOwgǎoor/ulF;+a Xu,0 Eu֡$mh+ Kx0D.nt/{ MsU5lOPĥK_*Aƿ9è# D ԱDg#%PjXjZK]!p44Q\x:I*iCz1r6ƫgǻX+q:V7 >wU8W>ؽCxcƃ8kP{ B̑P:tDjvV ŋ0򁋤ڪvS{T{nbyzxbڢsSY;IH5lUHOD1UK4U=懆+}W1i\YODSLL齧ԗK}?)S{.+))ISû;q<G/(l6}۶B^A/lėv!.< ܌ ߽M~ЪfID"=H>-AWRYDȤ;> IzvÈdYa"m ACּzO(W&SW,oŢ={?,<!-e.YgµK:Ҷ{U(Ǫ=Y}%OWPNQ r\ѳ{`%O Uy<[bW`xհW[_/WL07s=1e+mûo;p1fPBx%LZ6$v!]¬809oe>Cn_%="LQ"~p "}֡Dh mп3lLºZ+r=67qd ř_1Q :RqJs(%WVwf%HUgbܰ8J;uᛃ)dUאixN7o 4)X 7-G86[S {d]fѳI#æ`s@xRe]k>^x<~u/s&OU4V² b$zA"h祣= C:ip_.W`TR$%Na|7r[S%ҎjpU1LvhQmU%j3.^!)O?3o2xP nk Rnh6=皅ɧ},Xd+q8ZW=ԯt˵3ӻ}R""&S'<== : V2ʕm(m#l^ NF!!= SS]تl*Z;`S8\=H,W{7G# &a1)HʦDqR2cyAGGcT/OLg"{tu$;'"+Ds^Y9B&|l'p5.h7p,K18/,b+CsѾ ?‡Vl||g.RK85CF'd23Xl|Zc05Cg>{V`|W4Mast fȅ\b v?sJ >#䯹8d(yIڶ5ھ9>p[U;OrRr񇣴g ݆lqg{1)7[5h@mJonEzCI"\RX}NUw}-zgXI\IIG vUdv6]L-#HNς!(A+-p%{4&tr԰8j+v0]{m`/fAddTyBmYhZs-OOB)Z&+iC2?m6&SqSp~b,0fxULUֽLeX+l31]Xv"H=U!'!䊮=r&:u)MltD'%@ } f嫾JH-섹C ޟ jW-A WƼ+gT'"zȉtoɆilqyHʼ8iL3#W_i;uT>g̘gSSS?ӦMc8)F=b?-+|^t\sELل&s*o=Oy׷;a ,5OME>0oL^o~=.x 6FT'ko`o/8 U>e"";t)*R K}K;}zPIkVVV ~r$_C> 72;3W p)DQF T>OUc<#%# r5zIuz=Gq/Ga?c]̼u(ZpK|Mra Xg:HU~S(Bb5Uxb=H՘`?E Ɲgp9<lۀ=Uߠ_DZ|bS6>?ңU-N8l .qr~sITI߸cC@G۶mq]&M̘1à2n:۷OVDc?"fws93>rZ^HAVzXv& 9J.RX;=®Qy ]_ w/_p|;7AwaZ{魪L):흄«N}J^aUej$N]BN]. Q=ULki f*.ۂ6/sT{Ƴ,{LױꍗWVev \Y2 | Xi+LJc]-~>1=^轞)nŰZdhx5˷ Fk}KCYO"""z1Hzٳ'p Z cǎ՜X+NB󝙙#өn*%JՃGߍm'%)"t15g)pm˷X^w0/9CC` ;є>""",NIbd1c~õk`ȑ077bʕF)fG8w,8b2E Cq0]4^0cb\c10ȪLB &c2t|k9)?DRqx,ҲQcãByJ$%>Yv I9%XyExaTuXpl|3 /J^ 3+Ţ x1d(`G_8: DҕA1i > MǜOPKX` rUjMgK}DDLRW[|&aN6 >لk֬AFF5߭b݊qiهxݞ~ e$@sHk4?YQn >Aޗ_;]ZÓ"dz/BZckaRLE o<;s :oZ?IMw餥-!.A* "*Re EȆR6eMW/I Mތ*_~=yγΓw|?sbCgTcń-TvQMLS'.c[7UlzfLXso?yp~Hʙ{II5T(ܴcgs|8>QaW:|̉L(Ev z4# 1ne6 cL;JVoitooEc'c&n"Ո+R뛼q4c&ruz>ʴK˝lN-KSrnflg]fd߾Au|@1yښln\v/vCk?gʕij⠺_vr4KekwMn--"ŵ7Zx;SjoI1v%wTy0f\'Lz6:'qV+.ܾo>B ֲ7Q(m _4zUTEԯUWPˎT|MKr[kg 3>]¾l|<שȫ)->{;dkw~a6F=)/X5m$n}[96oVK |:D\Mj"kdK=G> +.ǖحKNUeijKOWNW!+5|ydiW8~KC)ԔW-'iG~m 5ivBu7 ?_WP`z+~ys7\&OE•'w8j9Crt#?}` ԟgq]Dq8 /=aCcFnlbK+xዏxZṱiPZAHߩ|\eVَ㬮Q̮"6>GU/+xհϴ/N`. 3rO*z.5S]TOըUC'{5năhԱ uFA9~<u@dFdidn-w79WiD~ M` z5!9NezKK!Mk4&pc-=IļZmzVgMk%զ$='։3(]ec5q0e}1u[nNjѾ/SR]͓rUՔv !ԉvcegJ.O㇏>n|nE^џwW#EU;ҫnb-:ҩK{2GGk1E"VeI[a6,Y+mJZXf:=Ioc{8S 6{s]Xi,n)lt< 6Zk$% sI2 F~/Hҫy8RLQ~^i#VLx&Q9o̫i 1Ef"2kzVEk%զd~/=`Lviz4*_%k&ˌ-7Q˔nC9RH %yoX>pN5ҝ}DHyZPTҮb'Ton>y\Fllx܈WQoН΍Ƥ"Uɩ [8~5p߲jlpTjGL¥,4>o&$*ʭI;]Dp#ivs %Sh犛ᛖȩSQĵQ{eU,QhPv- nnBvz7N)KN7姓*ҮoO]σtIM2O=rwP٘y8w J1ϔ/CYyhwOvLh$ H;ϡBQU< *eMJϒmi6"$h$ZW1U2{jufp64}=É1&ڔӧE(CO5hڔwW /_#@MS귥glݲ}*+| L~Tei,(x䱷'&&F'97W@t2_;u [b%֠}ܳ-_WEa!}";QYLkG;^(׬cx6Eq";O vr?J̮1jW$fuxOj4KyD>m"=Pd&ӌeS[ )zӮ7ʜd.ѶuvdGژN2if:i $8lkQqfp]&7/D ^^bӡFs^"2:f7i٫5OB♕x7Eg5Lv?̾\WgSU7;# )EO%d2pZe50a02GAM]>T 32R[lWut0ط/_$LK鰆cgC7CI^#k/8%}1x /,vBvK!ʗ/ãUG6emxLڜĞo l22h='ެ$6p/<'躮h:P%M߂ETzQ:\l9A %kWBw,b8Ow6'~[>tSoui%e'!g>3ϗ3wX$D#!WHh/1Υx`{PBV%[u / g]YtT`ӿey^3ӍGc){7?FeYWM1^MPeo9 \OR6*ISi1֓ Ek%զB(E~⛐|٤1C6H ,dCuX'ZƭJ,qCk<]ZÞ@4aGdg79˦06B{x*PLүXS@ BOZUaOÂIwnE?^uwSvmpv ׹2ӃlM bdO ؝k".-K}Ȃ5.?`7L5&/դAGb^wnɤYEHӁ4nQ٥XX/kv^0Gx(rN)6V׫I#W-o݅.ClʢbW/=Q0&˼%9x6t0j~fnq(syw.˶|rYv*P< !v^:wdsr#r4e`׆qeR.p{UN]$f z\&ѷ]akl|'_}+fs5RS-ykcKӉ>}n[]g`p~a@wv^w&e՟g~+;~*Q5 -[[vB 8LuoLd4xucMJ'CgH8\eju+9sEnw$-cPsW! __Kޒoὶ(C{3vsg׿v;.}@Qk%3CMV#=o:+OOhq 6E'sXLPjY+*ِ5_Q3jTŦԸZj|dq^57"˔HcL6K!?U0͞(Lx-?[acHOj)~ly-g2`S![i߲`~PtƊFT~!m;mgcred2` xWqrecxMfҊ~'32F#(,L8/9Wg}wR_J]B%P_`шl1[&8'5#|ͻ/-a[ /E3478u;7JhV "'oD bEO ʧ\WAyW{K3;jDFGHw8n&9veBDZ⮟9yE,_Ev"BTyѦo'֍£(n:.(<._T-OJ'@/GG~=Elގ7Gdtr7v$r57Q .l#{8m{פkORY@ K @ @ ('%7@ @ 1F4@ @ @ @ cDP @ @ x @h8q.w%j1={2b1Y3שqkmok|HqydBs]9>JyR Ɉ@P z&͏:3{xR6(itb/f?ﲎۈmZ[l'F?^uT,ײβ~hE2dKիy>˲/E]RNkaYG5^X#KI?Y2wKc?9G-?5\;9RS(!I0T)l|)zωۅ|-P|CFBuObT 6\V8Ǖ;@Sap+]F瓏p"|IyL7Y:>*i;.|J\y(ش"z>ziX TM:L=ӽ{wz>ՇoWJZO}R?Ē=AŔ_^Kw{ҭ[_KF؟@ 36B24d^|?mU7eAt~w2&ǒjF<2]A[ t*tnR%Pg\`_rb"#5UTo>x6ʼLn_=˙fڍ+<䔹d*,Vqω=S?An0Yd @&?1w^&A_P$O E4,$!)\;^mܸ><.<1WSþx+SC2Rh#~R7I;81qzNѴ7P̱J- ^wX?idcgH2"ЗTĭe}ޫ FOUDٷGo#*5x0 keh ǿc@&Ԏ^VUzf1w~ΧpKQdPmK x2rzm rl=vWC 4Ӗ7cG¸f' }FR<qI;7y[3ظl[ѲoMNdw,{+Z;و._KU2򑡵1%w[!E:厑-86Ĥv$@^Ro cб!5nK)$mIOMZZAV>۷槣.=݌SZB*h7a5 Wm@ @`6Y0q+gc"\O_oTn!ٻDJ5T(ܴ  '}NljH:ձqcz%,ԉVMR<)7~g4\ھ? wTD-Cc2y#%yF2&c%߼A]N~*?+w+ g_3OvTc%2sb,>ӵߕp"##2fg|)2\NDŽ2Z6 a<OΤ B{aD[/18yۚ!ci(.)}!Kf:-ԑ5)e#ç;y2X v>ś L)io$Clyb3KOi,u#YM;1;l  O6Csؔu`FyXFvR|Cz XbCJDDGa4g5P]>i&ɳvĎ<Ξ8&99ʰ$)ei`+q^@j}fR]Է^̝XhB5cI'!(7+uls۰ϓUc-̳82|zywƎ@SC譜mX-gXYaJdꡝi~IЪ_įnҪ|<@  @'s+%sF>7rMj"kdۋHsl*ס?^ ᏷|2&8l@uŷ=J"2 ʉPհϴ/8~]ze7X6lp^C` X1cΡwr|eź?%o ,6gMt>Oӂ3^΁0֓}Zo0/cOFȻu/{ʟ/5?w.ʕ1V/mwX&9UѼ~TwƁQ:a#iM8ظLi?rknM"nǭ9ab)N]?+ۦ!Ơ}cy"aoH[CmFjsQ2}8INs.!Ue =Epeڭ%q-JO>SLֹiqVh"Cu?sn, o͉_]J1ԫU [!͚UvCL̏seyNiO&6`GjISVa3w?*9´) >"3y' #I͡WQ%6@ Ïe{Qv% <=|''/&G yTd.h#gƟHk s-7ㅖܗHr皪U2URGNjB4}`T]=Dž,9Wʗaw[ K|ݔ'sMXu4y CK SدA5ʣGݺ~Z,k)UyMՎ_ltҞơrEc)֜yT(^M!?$e XSk$5 hܘ{پz'qIW6:W&Xפe1DU2{juf/ʉ|n<_HfJJ$jc-C=e^z~fYstaP2l;·oP'eOUS\60O,=Ú#sL$['xC̓@'rOynaS)?8P!smL x 34 |Ofoųy0.$e([jбV}EbF]EpR>Ww3J ٷã26Wg q;9x՟Rd3Fxb)/M$r|0ݵ[ )zӮ7ʜd.Ѷu/9?|>V*j5;dڞZsCzu K'C?ZieK/Va m ,Ė/c]d'*kIum@(2:ʊUѥ#°F׿L*XtF̹V/AY:6ƫ }~2G/f@* k# ֜yW'gK[ /byڿXȏlWii5QP>3ϗ3wXgJIlH>1z,,s S/(wHz}mb%Wڏ|e<XÇ؟נxӵ+;1e;Oq-ee:nx@ @P> 4x}^el̰?L+O1b-_fq=_bO] ؝k".-Uqը۞eLA> 8~]ÔƒUUf?njHfj \~do8/k M^I/b^{ 7d,p"@FlhL4EE!?avD{vl cS-ϼ7"l]È:vG~4dPF_1llIYU\[^>`l2P++_ƕ hJK{֮bsCcZhM!!^H)cbV^B hѶ ΦдYHdMh>0!W>i #J? iMSγkbS8SI^}=˜b[}*l~*^Ksq ;Cm_mZ'w[l&Bb,o=󦳢dT.eHoVȓ&ن|bYjB(SprRƏY\鈫w%k=Ř`_7O,a{KZߚ{mQfx'[ϲ!CwX]7^5aiv?PZ FlDK;S_Zȷ6=^{Y?"׼M5;O|O/z{p.hH­vSo"\9E^Kt7Py~{wV/=܈+x QqqϜT<"{O;^1s~"Yؕ W |Go"Y&DOcW #|EOخ'@ vDӋ^[NDخ'@ v%BK@ @ q@ @ @#@ @ ch @ @ 1(@ @ <ƈ@ g"nVcwXMfD]qG Օ]|T+WTE{ٓc68ŻD ~#VOcwTy@ P!W|փI'qb?WPKMk~6r] ~ǢIb] Ş =EoyPbO =C™=r<)P'F?^uTB] >a[ϤY?nk%eM $P9?]覗uSG3O/z|A_&Ӛ:6%&1+۾@26B+ϰI1A .=T] ٛ^Qn6S2/86:SQ&Toٺe%MFw>WTHzL 3ѽ`4Lq\5(T "fc։tR8%fڽ1-yK,95u*7Q[j2Ở(ǗTk9O|@~U|O%J1ncW G "DP A= W3#W)sB 5~YAwSy1J)fqNkҳ3WF]uݍ7صzWjbHMG՛^2/WOr&v#J#Ooen42ʙ ~35yyU : :;b> 2'1h=gKhVx%: e'IHJ#WN?wt+_|ч][c\7FEcu-HƵJ#z Lp'd;[3ظl[B9:2U;f`h#~RC~f1w~ΧpKQˏ3<ט"X?idcgH2" 70G)^y3Y%kw 6CC|N{߶4wi`dŊc#7&sY2iz6W~Ar ƺR|3F@okn;K=ϕd1F6KRb;xHcK9bw>^ٽIV8mJtq4>ȦJu7ӵXIo;8r&N>zU|Op!P@^[OٌRNK{R\3/h3=I¹)ߓRڞB UU+8f}oGOGWQ-]Z{X3أEojD01WWU^sE#FLPOig3f9\) з_ˌin\5:viqڃ2X#F[C_i?+$#'=_'pݏGWaOM}V3~If65nظ2%N<)&\5VCϕۮ_ȍچk=n!T7ѵ͹Y#[B,v@ Ǚ\, U4~ W Vξ]ʙ{IۯTI" h~حTҕ'Y;ryաTdGE ՘oi1| I'!(7+ 9ImXDcz*2I؁'҂{6yU$MXzv$7sux2õ~ͷ?ѡ@F=oOʾE|7 G`pu $-G nŭy=8I0'[fR}PzRTrY=d3MrC]X;|I^\mh=ʝWZOγ^.m_;~*C LRr5be8,m%膋 86~2oxNwYc\"O {G%WaIΥ¤gCo0dVYlQV3 - ̪ed1Ok-EFY)7lPǒs,۾bW$(xˊu ~KXؔtou9~TW`4:wE}*9OVmEaӧia\Eq|5mSH8QF4B6L 2k6Ў-{ҩ=rT.c+Lvw ZSݟ;d}''!ujCuS'Dy?b$x^[PVw0u'8L:lk \V2Hur4y;~n=ua>(G)nkCZǬ];ۣY nYSmC[k'6IlpVaS-=7D?CVjN𺶓}˃hԱ uIoQWD&a*סÇ@oeTM"!͜8lkY;_!Nj] 4OZ 5j؋gY]ze7Y?R.=s[=ub}I瞍y7 c_#7ػ4CkŠ.'ɌhJy^}]ޡ(1= c鱰uy>~ߏ;$FiX9Btl<ѐ}ŮH DPx 粽hJǔԥYo$]kpN56@}@^Ʉ*_,:ҫnb-:ҩK{MR1gyvmqω0:rCu,s xV]͓rUՔp ,GNjv.Fh \qEgHwT-[d(Q\I.d$9m!ԉvcelyԳa-V Q%l巳Ay=pPFҮm?oS Ұkxxy N%-2Q23h\$Y;9y69JgwTȣrQy$XO/Q>5U3(1^-Ev {xce'gF$}ZUa-ImJ;eqݐ.׬cx6EqL$07Vʬj6m7_%'χ*X>"Gb&v\rȗiYu߉;|Y:r\aKL׮XĔq2\?mN՗}81.2zF vr?|K"w.s0.\݃*1gߪkPJccK2+.ugK鰆cgC7CI^#k/& fU~?ʎOnK}k>E"mL\+Sb(Xi6ĴWo{ǔ9R~ jKe@ qǁ?Y&AHj ċ^y+[,jDnTZT^wgaGb^x 7d,Ҏt [k,U0͞~#7O{Y!cwj^wm;"=YY6RgSwn Zst4V2` xWq%R.e@È:vG~4$a7{c2)C`YTׅry _Q*9+$CwOGn!-hطuّh]Se4jJ9ly框l)Ft#?0am&jua07VZ9T8T@~d),EtջᵞbN/WN,a{Kèk27c;1gz} jheDVV}zM!ؗTn{1yl lfbeE};+h+@'j~do vy /yշl6_#5<ؒƌ2%Nge>]~` 0Jϋ%*A4}be@ (v{ , ġ?_AlU(|ixÉ&c+~`x2U{Y?"׼JX#Vcڃ5@ 򾨗kk/Kw7"/"/]k5p#AΝW ǔlpEu3ͱ+bF @ @ h  1C EIOT]acXtx!Lx@ @ e@ 0q P`@ @ 儸F!U @ @ x @@ @ 1F4@ @ @ @ cDP (&ݳ'3+; gk[;n#n,g%_I jR8[̮k"eli_?;<0IK ch %QpfϟO6e4wH: $s+%U{Wfm5x1'j?-gٽ;|\hηjVApvY| yǜiD n?<2gbۆ%sݽ9b&'2gD.i7nFn눓;ĹlߛZrkըWku*FQ0FLWǹ:D  @6q+c~oBSU}bORN+ƣ_}Gs e'IHJ#WN?ct0K*k25vu-HƵJ#z Lpʒ'\sdPmK x5ɶ:3}@8 IX?i3ő?1^ٻ(كP<43òK3￟W_M;fwUjGVަx&(}v]b|sg|f&5z  㗷} ,xXT_ X|6~f5@Oi6-K?p<3jf<SGjlsWr.]GJޑ'* }?y.]AR0yh+/’ 4A!]hmpE((RkGE{ım;#H9Z{Lڅ1yʹ'K?k/s}olnYWR<屩Կe}~G1xnR|o9]g#WCq]8r`燵7ϏbƩ;޼М(+'KF֙xK'LX0Wm=&;c4d@⎀41 jQ-K֩U#Hm;48D]b>ֹyc"f+o[,8Fٞ$jʑt:f~D_ĨVMPq%2g}7 3  og@~G})R#x6pSB7pcC}ȾKqb4ßq~83|9+ >~S=D7ےּ)q-QLz>ҋؿz!ޖ#1. m:Ӯ8~! _'3!^lmY K4Kj:~#'PNnʿL uD9UW4>n5^^s!j(涫nKa8=סn;U ;4Eel4|78ë (,o`{3cSqMxA䅎]i!\?zi\#PQ'd-ח?I\k2ow)bsp^1促6L}[~Qq'<\%hT{wvHOق9`ͺ-į?߇_xfؿ<'L!=Ȑ88kx,ϝ#|4& ,gDb1xQg\ۿ /|n9wEii%@q *w*w'Sn0ڈL1YSHO>#vNeHiLCќP\i<#?m>Gu>Vm ʻ.}l3D[>paDŽB %#^n@ CqmPr~֮ݏ{V\H q mt؇{nt6Fm982vb[O5@ښ7\BڡS{M뛃?_ݎg*o Yk.h+ wH ftk(l(KK.Smذ-Qf{;ҶI)/밉zgsIíE'$l'1ʀ{K[]ݲd(#R Hc{IW++~:X4wO{:4Axn4XTcpy Sje_H-WC>Bݺ{ J'bpy?Mx^,R9szt;Yc \­H`;bGT-!~ʦjĆkj}oCg""3[mÉ]]?zOdc0r`fB VT,x O'>؅}z#\Ni?W-ٷ&TjNiR[cB=چ22sU;w$⥱-%dbӼw\lW+aT{q' G䣗`hSIt=ţy V"ԙR h6RCpv6sŐm=WަX9!l؟E#9dBL5҆гx sFkV|w6ŋC"=x jmv!94#3u% JVBB{+sSliOWL Gau`53h5Pdi.x)T&n,dbCVMѩsm=3E%8t*Fy8}eCuj[S}bsel:,J51QlXMƱ]>VuLD@8Ù4(8qRkgipK+4e߼DyNA UmwtY-*,BBrc dz4)QoQa]5hGM:@Ocغ#g kWh&FYo'=ɸ:+sismzs|8pXٶc-OOE >[!,Ḩvu߇㛀n1e G翜@ֵ"]Ŕe9TX^YX$ċu~lq:T^G/ (}Q2w٩U]@XabnHXm_/UJAjQjrEXI65ވeh)פ +~;vfVkZXR prLfWT3{gzW8(5ʯÞ%s<9ZVU_% QVt?53?b}ZdueI+8#xj|̸ 7cxܭ.GgtE08 n!oV]©SW GԺuMl=48H}c5F[:6wڒcl홈qp 9+޹o.1} -FYH OİA!sH Uܶo|s;KճK$tW#7w BB;eC> 7m+}, ѿo \ME0"ÝU=-Թ^Vbbsf||NIwW}K<>/[]Cl7$}݁t&?M~ULo(xڊBVU2.Mֻ0ێU l^!Cvڂ#Ȋ>X<= {^O8?بh?-]Oo~-b/(ʯiInxZ!c) ;L~kG';J>}B7/:I`_q{xYU6! gB/|{JQW ^Do 5X7oį>QQTJ(9xn B  cOBuS/Ըw!} NȿZb:4Mn<\ByEe$A'03,񻋞}uSN@a}-ӞZ_umOWuq?6S!?+sq|!CM}`A?U>BA=+b)aslIb7-^5` 2p/oʠd\ip :m:? G`b>Gm>gޜj2u꡼ccnDD 5Z.h7f^K~-3ݟh.~9o(¢Uau+<$GU_ MgPd3ޜǘߑ.""o/1{i+?n}5NOpl",a[]!^< 4ƽ𻆠"9jzHط&ϰd{PE![Ris'11c!qf-+J~Amѭښ.V湉rX#c+b\_ p:i7G: a~slX;F"(5o lNm᭬'a,tVl=3WP&uOp ZoOtyn6 V\ R P(qox+o)֍փO_ᄪ dEBfᵀXrQA%t_'srċ tƍ3 | oz}6+p hAbΙ 8d~ %vxҏVzF"! NUqξahp'|nDk6R?K-k-'ڟG0o%УgxGHUGn/oW~p ݯ[arhg?m<48t}{Hm>g Nec:w]ڂcl홈AV=Y$dRhrI{^2J]}< Y +W>^mDb-l/ з?^"r\sX6qvtz66lK!79bܡO΢y@΢yRg7y"ƍ#}"ggSp6!y7|_\cfO Ƨ*!,;'Cc{챈[x 05nt""""""""" cȁ1HDDDDDDDD$/|q!~I$Tcؽp.>9pMl,M$_5f941ũqd<9b Ed܏o\m;S l3]kHٻ'KH),~q$\:xu؞_uXOÿ,eGݾzȐ0ayT+EP2_gczI[#H5O%Nx 6Ǩ3 (S4k]Х`۳qvhZn:s?I(}K̸¥r £i(wÝ D`g;װiR1MZk.`Ť! |b'S3ߎ+c!ͧűJÉw‹_OÝBgAskgZe>  ?Y_V'3C=S"T>a4뉈 9u.Nυ_0$1܁ !T[Pxʘ0Wjiغ^ڊ']}NB3ѢHMù#)='5; Mh PCxyNfMr? ;na72Riӈc#e(+WWqڪj5#s0$+8+,tixc'1,Χ"J}|忝Bzv>̻Go&J%N%=!I}C y;ó[.#T.w3'M DvA!s {$9_RrK! BǦbR_cdٲ+=rKJ~?{_k&!hݦM̗ɘh[]~ҽr?"Ţء\E$,q?Ү*Lòxt+H)BL,Rr*#nbJMq/dR?{\u2,?|{K[4V. hw;t/p$-n2k&SuۖtXMShzLQkS}ٲ1WuS]7|:oI`[Ѹs+'RzKcYLX.(,:NꪶW+?5Din|v^7fOs>ͦ10wn$j\4UL7L Px7-_Mz?2F۾3P6{.Frבo.>m7e!^2D7ItEH<2$>B.Io'!"+fL 7J|HtXnyғ"H1}-T䟖!4yE-9Fy m>U1;G.DmeщE0gWS j $4X#wCIx[j>k>ae<_Ĕ#et^nQJ>cuĂ=T4A_~j\ع͝06DY}|Y!?kab󑐗^ Ŷ"n+ }`ゅH 5 *}6jec>YP6kc.g4L[[#aJ9G;WJ/h ۗsj:~#'PNnʿo | ؖ↎O 4lCXڦ̔n. ]1H2@Az:qn@_]C'[u5ZAjbNA ԙW]]ѫswz_WJķE'$֬{ [Oe@=Fc]< ѱc8'u0DX6>7p*v.k6אvCvYԉ'WqѣjQ982vb\& MHgFg;}X<(;ʞhi4g߶3I@4V,/%/> J/*2^M̴3utަ|oZ5ӹcs <ַ[u*-ߪ~̭x{sf/_^/û/u74lCXsbU{04!"""{ z«;A"/TP;Vܹ 0/m /!潃=6lS؈[(Jm[gH8 ׭`@+H4_x孷9{7i*3g% ,q#Y2@yiޤ5JKJTxZTGl*'~F[4lݗT&uT"L&h-ƘWO ۬um>ooP*kK%V[w䂛?Z,m%O~{ا9df²t>[ 완Y@W\Ɖ7/|qD* *XN!SnCVal&:oK8u aޞjd\Dy]3Mowi1^/3NVjPueK0;mt׺ 7:%Vá+5skaP8B4t=6v#$Ӝk6xbi3}̹H>J jPVOs>sE0s= @1lPo\|2}C8[<b97G w_WaC@Pg25yHyv 4EjۍџB5Xt˰"x<$5V}O+7NGEWfmA.Ǧc*se./xhj*xtŐ;Wbښ9xWnoyY.T;獫DZGTYkYa/' zy[;ɇ~3-}7x0"v-{w'J/+}F3T7xX9mQCڂB #1Նۖ]n .>o A'ڣKosu)}lכq"B۵U;&b'b̌)o@̒ }YuզmFʬK6jm:oAtyM3{p"j+Oa#WGQ=+8:lOɯ^3'?]WSxr0 r&,?xeX|j|'yt5V2f5V/V&7`̘1%,,^ҥ.kV`#8s)N^j^Fx_lL ߠ`5_f)Xl1ڇaCٽ~3^!Twhs8mdPAZ惠`ˬ++xzzMf`??_6Z"""j$""F,iT7fbux4KU?2VP\mG墾} îR_0 } ߼^?\8 /aHb?^ӿ|Lj^R 5V Qu5k׼^U?2X!dY3PKtT4o}' * Aܝc#54Ou&NŽNoѭ FYT-8G#cK>N!=;rot}]L,ĩ1$IO^z)_`|G2TlÞz [՚=ʹp ^′CU5 y؝4+!3WL]1hcڣjF  7@58I 5.CY ׾V qF9`ʳf5.+ͳ -*))[nNd==:[ 1GL5^ny` :SntϘ~בo.>m7e!^-ٷ M~%pwWaή+YIh׻[X<m[# mFz ='E^bz[©,?-Cқi(68r4\/c/ct([,1ebd+W10(ARb*;fS4Q 5ZeeepqqimT]@Fa"dt-n-:!濑!Tݣ-|I8 Q5#S0T\x~fub-R]US uUXwʸ2;%JHbmO$1>(;ʞh)ユYgq9`7J7{ pb $ǀغȺXJ1kxr{S8:zamr 4rLT!16KRm㋥R@+;h1[t """g1HDDD+JKK!e[hѣGkgi~7*< J_s7@2`,^^B&6{{`Je2hѧ980޲w[J_W]mX yaZ /gO~֡!FPāABV9 RG DDDhin-,,D&MmnPġwWOsk}SnM@튠&#bVlHßǮ%%4* 'X4Be둖B@0DeEd1 HMI:f!n'8[rLK8u a0qLWlPEWT^ıyPGCjݚc6Gwww6X"""j$""Fyyy !cq۱?HgORx44 A ؼ|;|{C"`j&CYAH0#5J.á28k^.Eaꉈ3#2 ] B]++ܹ҇p{krq Ug:U<:~ K~EǺ"Pz *ȾTZSTۻ+nC?sV5'k^D [9DP5m+7ǽW{l˹e%""F@"""j|ڵy!K"f*kz*;|G! b8&/V/Eg.pFT{mBS1>ٌ7'hr;B۵U;&h13FcpLf=FñydnT"~dz4G31k,%f/-\c MW/f!z <174k~/~ƴVËkF+"nqձkn# WX=Lx'7('+ N/@\\{6X"""jTUdEsTgr:v\b=ҌS6n܈o}gڷw@u&NŽNoѷ]~[E DDd ^?e:-b:K(uC85 KgQ DEBrr2ziw0uToqh2bb#""F@"""j"#[b˖-AӦMͮ rrqJDDDԨ`{)(LDDb8v8s 3qeeeزe""{رIDDD $$J%3Q:k.mdDDDdڶm \۷kg_4uoǎprrI""""{ ٍDho<͛7]&2Cn% DDDd74̺ž=qq̡#~!(}ak8s ~y  `E! ot T*mڷfddQڷJRf^ o&""2H3˻, BTTTh9D5sss/W ň8&0]6CDDDDDDDD$""""""""r` :,Xb).c,`б')YJ7IF@o0(8Sqs1jt0q`|1xPS?s :F YC?X@}3(U:`"""""""~,A?@cFg5 C?s3 7*MDDDDDDDd&~4bM^?DDDDDDDd Xv@;g%tg 2gf%z,REVRDߚm싈GMGy~J5KR^ jR&c}֝WӝW\7ODDDDDDD/0tc wcn P ?Y纳jBDDDDDDD/Џq,@Ϳ5A?sA@Co&;}5`Fk~g1HDDDDDDd_?Ov` }ͽA;6d AA_o 6tۯv~b4PS3?v`c5l@ 4L?S2HDDDDDDd_qx@@ cN1 \ߚXc悀@C3s wcvMpOed}~$""""""o@v@~U~ϗ8! FnPa46돷w@gKf0=A@;5nۀug :~?@"""""""Ljzt@~v@kƂznO 3#""""""rjۥF@ŏ>C?#""""""r|w1hW0{ƟDDDDDDDImwhw`aq[47?"""""""6;SMLv@mĂF,i3GDDDDDD) V6Bc N18VQs ѿo5 ;FLDDDDDDD&0>d#&""""""""P#""""""""IDDDDDDDDD@""""""""" cȁ1HDDDDDDDDiYtIENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-edit-testchart-thumb.png0000644000076500000000000004206113242301265027547 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<CIDATx%uxYYYkwWol.Hs1%Yi˦h!`aQ 7I3cö<A6fZ֬߾1;x^Lv|Ȯx/"nDsXhmm=6F2F3mO{G|~}7ڞ`,Kgg ;C_k, F` ذglij[D"==5o}ұymwDV|~9R.2d6cslK}>ڼ}`%Ļt~'3‡s3akeԱ1v--Gg=o̅{?> |KB }/KGW~{OWMJ=JZ으 ɻď')Q֤l:MJJEAVD2Ir2IjJT( Q*ufgfYZa/|9&%bL$ڕrA &i*(Z8괴@;Toy_hac_b7Zt^t U:AvW]'&nl6ŶZMY8KW5d(ߦgQX,R^m GTcCN9*:E3gV; -)S^6xF0fks)*Pf]pYmk&&i<|QgZ/hg/O^nh:oN Vi&V>Xt٢2G؏acȽZ55QZREg hQ,meԌlķnٙյę{.#!pHOL@~WAu9Fh;0ῦ;]bVOD\~Сѧm<{}!01LP1fBהpz/@DÌ3Uaˋ`;M smZ{{ѐzoQ(S x9Rc9o;bnu:vX{-yLg&b=I\3yO6|b(t:EMv(S^ &LXuIx30;/ʼپH giwoO^>Bjr;1"jɤ)xNx0x87Tx) \mK EaD"2&&{nDQ\7+UJ&׀ÎsBxpcikgN\nO|D1J+sd[J'(/+r;455ITOS=ϬBSkDi{{ rߢ~#M!~azV,$m2*u3cϼA4d&|G_~TRQ vA7_ GՔO'f"If_2KeFϭ͍uYYke6xr6%S)gdSQܣ8::wx MO/]D{;[T(kPTRgt]e1!ݻ:cD~W?xgit /|.IrH@~ΛeʫS'X($$2Bc%gH΁Fmaeg,|U*2iCA]x‘(Y,7nݦEE#c㏪,x\:76mT*!XCЎ->FL,kbQxhR(0?93s411.J&)ʋJj Xɩ4M:mZ:FK*b ڡ\5Wh%3-~tSwzL}TАІc  萨S]0Q?J -UՆPԫ |Oi[㮍sc/|!ǰU)ZfbUy"d!Kap{8ZȤA\Tl;1!d⡎s@Ȍ@ԅyZD{ wes~*bDkgٜhZPܔ=N9^&@G o#>CׁvIYۃ7K߳t(>6Fr<Nd'H`l4Ze1zM`f;l9He""YvG$8`-Єxʬel؏s~xL8tK {dܧIV6lCh/[8C1;y ?) ̤S-ǵݤrAӓ3[}BoDpP(ggk6wlYD/-JIZ.WzMZ9{*=XR?*`&$nTTiP0 q6E|Ux?"|1f6kyޒ(cb%CGʱB|W^yzad  tyr! LzU*K$uX ljF,4,HP_lUʎ,df2ZsE48O KR]J0UW - *fpN =.,K4GR#ĭ"[m0,/(?JPagCi#T]q)E{MMdy$xCBY;?۝ ) P5J{,Uc bD\;wv[+˲2W|d h<g/alb@$W%ZV,$oNEyb2m]>dDt=xA*kz$< bA)A T߹מwZXVL#)YH֚Xήs5L@@}g+6)[.f4 }#븷b;pdX(םy8 tvmyƗ {CKd҅UԎ*t=x$F%H3.G \z?dIX1z"r挼L2LD#KV#C/ήe.Opf&\$EtƇUy樗$x-LxD' xLJW~lI9UYGA0Oފ5Nˆs |\*Sf_7-j6uo,"'yZ]iːT-7+~*Ģn\>ðv`%v-ϻYaůVcgT,SOΝYI]vݱ !n6S,^v XtWqISRɐȳ8/[0 C ,_' B?mQh7c~'Q B pnXbE4i'rM1[ /Dt!7mωSʫ& |&&&IlK J!/RT%̂#o=)]Pm_ej;N quUWq^X`!_I~_x"S/{ݣ!Zf X Q<&TFPgnщdJgN3Ԇ;E=6~S--I>xzQN~g?;fU(:Լ2 I~&|V?fv4<4'HM?qu?:-L־*(Dҽ/ }H<>zyBCޡV2 ui ENE=ǝCNGE8TQ AMJDa K=]zc2v#< ͣ - 0JbO! ̶ ^#؎[, 95r€׫/ˉ)̂E\N/DdjHϑoH"3QTfR څwS2^ēXz(̓v! Y" B"(BhłæxŢ0}th"`D>\8mendϯ*5<EXa)ӹvi \@k33Ӵ#grX>vksSXQ EWj0ܤ(hQ& =1)A~"i`$-aYhڱT(5-K?S/^R;)gcG Yj\&`eZ'3+V@-K}5*p.O-orablHGͼԹyjG,A3gӪ0Zs4zXত4Y^^vP0\r/jMm)oU@uªX傔?/E޷-l^޿#<\$u%6r(RPVb}}H@Hx GdUBa(Y;dnۗC$fB*ʢwbU^@Z*~ۿKۿ%!slEcIyKӼhsUA[26.3|LDjT1GAJb ti I4 /H΢ae)6C-j{"a~`}iR)uTݽP933g 9` 7>b}>~5WC9 ]GD4p,&wo|Di;=u)6'0C! UA :JҡVDбh/snC;5r%s8&ҋU"t3ў:>1Rbi^-RFJ}(b WlTp}@<|zTxX`8*k*Q7HE )f;Y3 g zXۍIq{8ektMlLv:al@ f} xgu|`ǰ!|c)z!|cS!CEbQ,M:J[n?;wp{y[.S.+?@ px8l7>zJ-?KBPH鍇ֽ >'yGG/| Z[NQu~_Qf|R`"Lf˗.t|-aŷ&t@D,e*tz~4&ۋM_)ū*YN>^ސ I4bhJ+oΟtv%Xe `=;a&I^1Ţ1A 0ܞ[j|q B?Ȋkԓy!:ႴR@e\Bhlʓ>v =Ch\AKE4G/"+  GdD:ϯdzS3Bȹ琖k'@893M[#w#$,pbe7}`MLʱ9-HSU*%&y, :ӌ㬞~Z0&; FhmB%g2wnN39τF[o;z+g׃N :78@C3~7o@*trZlAmB=Ղ݊ǃ"jqRcci1U~PwbW>I=4tr0?}Ѱ' UvGv_Mmi0IIæRHȯi\IDq Sĺc,٥Mi|_m:R{m̃E7'l 2eB(+* $ܦT9΍SdxixZKߔzCݨi./Q{'>B nb K8:mW{" , ޶} 'ttDO D*%c;h9$lJWm7*G%;Eun|r6?5];k5.N򲃚k ݻwOz?wVsǶ___]^f D|h;oEi{IG4F3tu4l}hSIiPw( K{Rgd?9PѷzfطljkJX=#cDW~(eg(B=w x f, 732vsZiݪ0OOJPRǏnSȄj*? ԈI%$}9I4l*.vA €?]q-^)J> &  9aM #7(üDXܡD`pKRc縛$J;F© *պЌGoQ+bfXrUi ݝ]AH;vjF"Up_fJ "%9*DE]n߼![7*T(Uc+7Vy*h  $>Y11@ 2MfX3c{kK )][.ΫݚuP`MwmV<9xaMwU!ABk'{CW^}U·$+mNN>H%XEq/_lw K|J4)ِd,ejZd(ISI[cYE;2iEl謾+ |h! j юϤ>{/rhd T,bs28@oR,mWXm,I`.GTFζh7.4ޑ,eYLL件晙e 4Tk+:}$ /N`LxpjE4Qmnc0x|С`dU3.ۇWD9D/$Ew1!֥sG}QP˂v]%UB&HlLD8U;>1 zHsMK 4!HFEc98 v5:c8t!Hp?5}hѦ^^sA<~ȡDŞ  ,MAP~:`\&G="a<W{AHU09=$jj%6 r%}tT]$=}].뫺A4 hP $e52f *"-:[.Nx0>Z#"(R\i6*m Wr$?͛[ۙY(63ƞ bBNܼqҔ#$ K>e\4;67P"1AJMDߤHPkPSP!w9 bb 8ߍ #BA8]f+8ܠP"CقI w-p&QU& =uy_r6aaޖr0ǽl$@Gmh&úmA;MLNX,81TZtzg?h*KsVl҇^@7/yƶ3PmK/CfA5B[^>i; Gt?ZYBDd\B5VO!EƂ115% 1@ #͂Ձi69[h֑ ;՘hbXQ W>(8-ُjoKoF58#G Čf!dA4C0d螺Jx j6;A769B@ev@4ڰkAЛOGzkc8BYmm0p wn=mducNհ_e@:ŠޒDlnСnYQ4T[qe26DA'<, hbqގ> 9)290NMxEORBE B=C|~Ь~U!&Ԩ۴(8t|m4_OO׃+$7",>E6Ll_̲sL֦T4;(G^z fo|Na 3BXMg񾄠*QjSZ+,VHSG@ ڗțl\tq$- VOaDǥKD 0,% x!lk@0HMMS5кBOPWuN]ԋuA^,,G ׃@#HR5z,͎F(<R01G axCltQ\/P=N=&lXk3 +8`?džmUck暡%ƃ/IJkv1tc' $t6mbD$"*) #~7 N@#aY#YL-?E'ۉjsSob^@wHEr'ڪa~6=9Ni Kk,},('& Ϛ+O8i"-#+cXuڊHA(IP 1}1޶D"Hq f ܉wuhG!8Dpx=')kSҤț8ixcSܹ}qe4mity:}WX1X@ue!I ;zl<~I|9C*/'#, ,)]6 G?{tMMz>"%?}k71TGBn(S:; }s.1J1V;\|?ZqOsq⼿oЯw˧W@ /D mFhE<`wkuJ?R7WVVڣM.sC@3g١<-g<-!jY|H"yuTmkoEQ^<͡Anqa`&qAF0͕֐y5rkyjH݆a8,mq|àJj =0bD77==GߖXk,|aږϬϐ ٵs}GY$y6}{?o|W)$Α·pk[DM}3Rp5I]cVS=Cwwhz"Cos,r˫>:?C_|%w1+ztTR |%Q( 9 95`-h I357(z 3+xaqǢ>ի+"axC'G!PÃR/fqI2ϼ!i$7=p ndǖIeljFx~ޏ2,:z6ۤ$֌Z@LDQ !P4Ӌwҥ}>HAìJg)hgNVY8b- bWʆCTV>c9._w-Jèիh۴L7}HuvW_84⁲?IK stunm]8}`f'tmQIV_sgt~P@.ї~?qIxlX3orzFlgP4 FD|n~޵qLjhK(44|3pXstSkHrC@Wd?da(?֦%KC?VJٟ8!lclJFY@#qb"!Tԭ$Q ~@`CdS8d㔴/KeoR#+LFM`@ H3t囿J?jj~ű`decnnڶ#ePc&d 0L{GEMrn~n]WyihfO>FK\gD:$]{W. 87;.y5}؉8}k_hxc{KTfG¥tNI-sgW+jv{GK41g_'q$F%83aa/.R 2hBRɸT90պ QþDuB@/nTMd2-s{'(S!_9F6w@VH,AjKl 3"Xwvhl|ꥢ5؏AݡfD|F4ήc[ϰ_Ex%}F4N,B>ȷM<~Y,v , ۗiҍdhnq޻ѦbDLV kzb8-.dX&Ejˎu JҗKFбz}3o0aBXљӨҝ= UX0*6:>O7viiiQbKo,$e0[| ɥ D+GEZ=" Qu3a7vhcUs% F^SgXmQ𾦒 dk2;N Q qIX>:R&PD4GP&*RPO=\T.G?&$W^RD>\œd)9 laL-2~DᰘJ);١X4ǩ̸bYOwci4=}Br ]b(,U#G!Vt>5jHw7 +{WZO0TAw^1>ːov03P\$QYa_gZ/K=/Mc͐vnD"n h{B Χ]Yi}YJhz6ڞxy:~Yai ?hmô z2}IENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-edit-testchart.png0000644000076500000000000036417213242301265026444 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<IDATxxelz!! I%"(* DO@PQT]z)wVl`9DP E)"kBK/ef3R% !3OBvyg;3( """"""""$r/DDDDDDDDDa@""""""""0 Qc(1HDDDDDDDD$"""""""" c 1DDDDDDDDDa@""""""""0 Qc(1HDDDDDDDD$"""""""" c 1DDDDDDDDDaL]@D(Q{t"PZ9^cDNH ҉F8#""""":vzJqt`NC( A@ QR|ϔ& D$ ҉ XB"ёQB{À_JZ(,0H.P/>oM { 5)riw!!"""""??(_)l1H'@ p08Jˆ `[DBL""""""j=_B //t"hzɮl;9 uc6~ph֟_%X g#Xaa{ # 5\tl $""""" EB@\74` D/0WtH23+}LLLTW^g#""""":~yɪ2?>:!rNaTo;__`xSMH1|=냈/ $I-!߯v6X>O d̄^:pon<{st}Ieq?( Eo |E hd/L_}NWhoq׈ m EC||lόNvΛh|1Ga@ Wa?uýGDDDDDNic:^Nicv{h|? B ȈlI9śvQQ]QhxyD(1H. R𶾺ƉԸܐJfVEil7,`0X{MƇcF(l1HFOf)7a %eNMXtx_TZrl_1vW}zڄԎ1-1QJJ˰77y{zlQv=q-a +psefX 8rWRʝϳʡxh@PF^^HaUkt?`1_{rQT\[duceSH̶OStd5{izDa-!1:Fbï{ P_r1Iш4e-C0,ђu[qoi N bL2RP}-<_T n@"U0u[hMڊ%%f.-5&E_Z͎ *˫ríݒBa0c=zALEZ ȆdZUOE)O K,]\]r']dA`Ddvь0 %j{r#6kN)TGQ_;6 *%eVx"ƞ):T VU߲_ZQ ڀ낀JVF4Cf5p,K HKK*pVJ4BvՄAں[X_f饥uDjj*$)'k떖xzDxPo9ON_:+7OïQJ>;*}37CWݯ]0ާ(_3d' {Pm֦zoކoS/<:bEଓ"=Tco?a_cb=]R`Ā[-b왃{D -rOEC6Hz6;F{+5x˜ػ~q*U߱_| sTS_NvVyX7t0;qpr|\"YSAMi5:vT\pUV7ʋd(BZʮg6`zVQR}׋ДQm6#`bڑ&@? +GDD.q{Ep:Ptd4JOuꞓMo ΈGDk DAvBw؊ ʫ]l/A[x-3(X(@)& j[WFME%J}z,6emQIwƛNoBL>*(SvzduuL63C%¡=JYJM\t E]βU<FtUϧ551pi-걑nӥxF QmSюp]&6 V\Q@KΪmӎeK{`Voe+6Ň5˫Z*D&zL0 K=ȺA9"\* xإojrcԠDҗǿWfE-uՌFm`P.t׌Ø鰫 5  ~ƈ Ǐl@0(X]Ġ:itwO) eWs2%zRT8a49ęzM%$ƣ$hzg9/,Q ) ?;f~~A7ֈD; U8mpp_,z{J]@ҙ+tQu fKCo -q&n G`|kDU >Jud?dE< ?>\]HJHOGHj*Pg.`&Ԕ{%t@$!TbW1}wsFvaأtp;qT$DyrW`U3s.9 WY>YH Foަg+{4yrrni( t,`@k^w* KP- /9D+ɊK%T[<2݀I䬁dn08j>Q{l>fI@ xzIT?G;loKDd @I~l~6XZgt#aٹ}^ )<&߁ ]t\ȇϲBDt| @$i/7:͂.ô'Ecʦs*zo"ϡtZ<;x hzoZ]p!Ma*Dt0r HLy>=MU(/,ã[T -wcݚR'R=.H@A )=qލi|1j(I1$^sYCCneՈ<:&fL 8M)pR`1)(QïJCxwV 5qzʋj`CZqk>9 8bzZYp(saP*&uo.Q5y0rB8<&v8;Վc_ał4 i3%Ě(&@Tj:G5OŊDP2C})!9W_?52G$B8)#R2rW|wz"el? тX3 zSV̛{v,.9  ,&"j@?/,@b.$#KW9Ff${Գ3;YYzR-=j^,PM#;\kuȾi|| >?!,Q>/~oe_-D<|{Ph >$RQ|=gWP!KG&CنLŧyč?^4b {T%"(@qmO ƨU'! ͣ2`VSp FDD`Db 1xw[ }IL'e-Gِ;^\(;,QqǣwȉV>XjaQ74#'?{`Y[}%ՠ2̠Bk%1YȮ"ې %e(>7[ϫʎb,~]48Βblh6B߱1C,!:ZAУؿcȎ\0 L_UTx;&0B,*{^~h;d rDڵKuZT5sWPgXTlRkB1C?C_N}y EJXxjgncC>p }hF<77*Hq;^IC@7awl7)LaPv.:nsb,zi2^;zMP]҂Aj|:(imA|9N MڇtOM"c,D iO3]uCҪQWͣCDz47 tx]Y %32>e^^rx(xg߰zر'T [ki˙]mRU_.·%! -eJ#&S)n++H jJȾnL:;LឿdVoދD RDI}=i34 *n5?i! E= Hp1 d_0W<羂WZWcɋyE,qp8?T@9ې}+I7Lsl5 ~{)Lnat t=wMQ>se:cK;a6x)`O`~EAߌ ̨#ÞFJALÕ~Ktl&զi)h=`Y$v .i] N ҉"P q0Qa:`iPڅgrqjB1}lo龭FQ{Ey?yw7=G#hzMӒuhykxh^VMg!$~=:A>tp4|}dY𻮢Pv1{gfnxW\.E݆5xoKјW»/0akQ9=Ec?ʊ},M7 sB~,`x?QaB q (A^%hDw|1v_Se{6jyeA{>2bQF\l7X)-EZV* A)7!*?WP_/h<'tB`NT͞ k^Ò _;$Gv>э[0{ӨOWVmtAaaHl\Y#}1r<$=rVJ фʟKQm"*4 [Q?FF/{$0oF@=*x#l, JŸ4 Oa_^m>1d>C!J%_JJUDi2|O(Օ՞Ucמ}K0knH==tU ~,p﹥W͙g_Q;()ĺoť4ɘ0&U:Յyؽ;n b[K Nfm6oPױ7,(D]\'dDUWWbk>3.y)gt">Rdx$#z:!8IGĿA-\\قo6\Ft+l5]ztwcG!`)pz|'OHصi3._Zy֋pm v8s0f\}yܮ~+r `K1H>!`/UncTߗl'zETVvAjU(]-RtLMmqF%{Kv:_+="j?w C%c7־ ^^? Op"''4KYN;Gex꡹(4z6FߺsG31ڿͰ[]X]U'ʀ4-R ~Y t6SoN@`i;&{iڃR3b{O>9H "37,}+B h<ر@3LTm= KܻM"""#aoYMIÌM a S`ؿb0Yw J.{lBJxO~qI FYyKV#${4ņ]gQ变Huz .|P,@.^9 tEs"m_)O}p6*|w ꢂ1Q; "H3@% +ӋL%5eWJ "34{Aǎ[޽{[,fM4a56>Ml~xpƝ 1Tx.σӠNHz)׎Ù9a mUE Wo]ӟSbܙh]BQNIFV۰*[)mp;~\)EFv,?0XvXkJ[..a6Ͻk!3;՝PS{6aI_u_߰}\%FXr-QNK@vui~_>,1q)"~V϶x(j5L@A$nwl~vUm[zE0,ak\& _WٮsqVduQn]=-bt%BT4wq˘[l!M>5i5" O b ٌ.)HR^4(ݳ?-,/ED[<^ N$ׯwf7!4&|EKkQy4b_ $0 2GYODaSU 'p^b[Lb>3~Ӕ6SQYˣ1i;UG`fE[4:t@LttH镔$="j/dT:P%#"e빪rz^g4]x*S DE>@N[]_g=W\ܒ t:mX .xS"οQ\˄sĽsinSqh!Φ󑑦[Aue!5)hE(Z5nE=v@TIgVS%TeQt -WyW|Aq `Dt6DzKK=[ j_wJU3!#h_F`vluu NpS?rZE VTk6wv0O棼옦GDDt(q0gq}7Jʪ!آcUO5[ OIDDtio^ :, O|\\OaZĪ30T:?8X4BtZ1`z65 W#fCDFQGeT3􈈈 p$DB)G_؄'2#Z ՟,VwjLay_k/2t0ͪ vUWWhdl􈈈FK)~,~Ȑ1^;/a3 <'6#Z ՟lHm-F?wiL{zDDDGN>CnV$%#9Z[aKm|lwObg4I0m48Nxjo6ÖaIWʉÿ>@ib{\:rװI:'1݁o܃&] Ąp`ʴX5G Q!Ct<;{3tu}{5¬ 'a\9Ȉ NbGN7DWelɻ=\ZU+o 5BF.Zaժ@a^3P˦܏4]OH(,DUEx`|oU(=?/=S^^|}}b(1g#V`*(vCԤ=?v@* NFjuޗ݋P#:}F]yͶBs1{Xg2B8Ѓ33ߍ|q)jS5s?KGń=aβ6~RU3_{n8?cdW{ݺ2oX^ykCMr@ #mĦX \н$ _i]ek6%p„I)c,,Q萚؈Pw{Z[΃ԭ` %-ۆg切I]l-gp l;NX;t6ipĿэS8֭ D{ dg郾rPFu0>lpX㧦bIxHֳ=$LdE+X=Ұj咐jT9Uơsg֛]2:C_Rz Z(y`Ƌ3uk]u3.7 S;oNlYS<.pM羍^ĩj:FLn؈p50: O1=|t2t}.|X άbFmP@vcsxnAcåYVxWs<.XY71a?k |[py vn@KޣD-NDަ(KNʀ H-OO?;1`DɎR [ eԡ#*AV|;H>#Plڐ\^rga 4 M l){ l_Ic4*UB8i y?QUK~9n%A:|~>|7F<rV@"W%Kv@de7*CK;pIĮ +$U]"lqJ~ݣbݣ?bNvqHKK:ԡU?J;k os|Dgh60@^ٻw:GǗ_7Y뤧3l]0liPƣvj5}iOѕkrI rT(VٝL@ `׬ECEiC[4_w ÈC3`খS+O=#;`yH8n0[fX ,hA:r7GB n_Vz$6SDdL<+ۑ9d njkJ0C}j?Ӓ zdgºnz^w.)#= qϠPYUo~qۃ*=$""(4fto W+Hػ +qyxH92l vn! ge$w@@O؍=j~~p'P0jO3ۘ>9 CF/sἕغN j bw.Dp۪Fy i1*x~'^-'Du`?6 W2BZZτ/?_-ei-IAV-EP=-CGR΃׭#lCj`mCC$$- `IAZ%,Ѧ3 vڅlk͂k! ޷}7ԠKL$E!WŚa lJ< g2k'k#Wy툴)(}%~=:^{˹>X:ҡczdiǞmCDbɌE#ET9,$8u,g(e^H7V=w7o^AeQ./YEeIyz7ŊFP.4pA<9e3|̐c{51HD>mP?D}=CNGØ_HpRT=!OW?ƬdIBKpJy|}kv5`E8tx[5'F6jF㦫K㹯 ͰEu@D[m3v䌿w1kt?d '˜%`te{jW_Άp(tMpMꉘ9p/z(HW棰 䬁pϥM[^WL3`aDqޫx6|~kf.ޗuiA2[G,p=ȷmqFɮ5]-݇܈7\L][Fв'wհgxOaǣcɸ qvl>}Y|M/M~Yoa^G0}(L l) wW/Z`1z{uKyY'̎s1{Xg2C4Ji)q"#նj9z*5M޽&^u%:uuՆ7r};O=w`lX?C1$BIQS}f  p: жe#kOyX?Y?= j+ %DDǸs- DDDDDDDDDa@""""""""0 Qc(1HDDDDDDDD$"""""""" cz"cCQxA"OO"""":x"c48t8wB;%%%%f6~~Q8 @"cIk.Xx$#ϰ$vC`ӱ($ . F# JJrrSIꐌDdTtywJ믱9o4!""c@"R$EX8\sfqoE1y..Ml߾L[o;w>֯W~f=c#\A+Խ7ؾ?=;+.,) ^uݢ"B!܋Os8M/>]WrSځy/Yvgq XBx&ZzcZŒOD NO}ZLzli1qoN bea\:rװ{zO2G /!YF}6L6 Nޟ7\=rz^u'Waѭ1IH~rn{i/8߾vUt-( %LTmO> qm`HU.?0Ω܅J(X3~n\}xѠ/~˯8\y!W)Yߠ%[tپ3"cx!Y̖x 0핡z\Z"}(9^c]P˦܏Cn4,VW㴿+;@ٵ&R1A0-݇eu{.zW#aɇ_.Fz3R>.%#(Vr#FF9kO8V<#{\< ۗqØLӡWN2jB>];rKdDf pvRf9k_R'LIQW^suAHμ W̬ ( ctKwm-[&}lY6` aTN\ >kp)gk6r8`r|2] vszA+ JM5N}85n"|}?`F;N{` ""'1u9EztHEleN=a;xiN2  lv9L€?߃[Ň}cGHBvbku0:m uMoYG7 tTZ;cQVRv@oq{ ϱΖ$g+v4bGdL](9{@rq,H> 2`lܫ1itWDG!5>6b3k\@Tz_=rS;K0h'& /]D d;s:gO56{a&^JmڌKq kbͼ0E=U_v}3.7 S˒k!t+}'-jJ%G>sxӖY0[pU%[!Z |;e,y3;Ʈi0so\SJ\oۂr/ZpUBһf z"Yd\{#,lBSD%yxtP@6$&-&bʋvƣa`NsA!lp-#Flwf32m;685LT>:c:iJ]n[ apiV<%nL)qy=-aԁځ9>]1co}c>~TEME8 PnGqjWFQ掩cZ{7PAEb8LH [ wRsU`+k(*siW}h)(u3w7?K?Pfi*[R6k*JS}%Yy1A{R?Ex#þj;t3}k9``9;=#kwzзKm:HKK:TVBKW% d>WJpݹ͆KaK^&|s[UbtxixW7jJ<0&u@l 7G9jráA}'vmσy:5e!`?6;AɎ@$jK"MmMoNŰbzIM17Di>HX``2l]0liPv :J~j;#/uBHVƼ")F[[@ҿsGĺGkr}ÞrT(VٝL@""#6`ڵYَ!cpWfף;xgK7\ʙ ڃV(N{FEXu>-/;׫E >,{=O,fNNēc!}1gW&<<,eKݺ3+ޔmH7O}cu'VE.A~nq-?~`y\O !Y""ښYވl|￶]J8*# j2[J4` vq2{i2tK߳ov9c10' 'ۇӆctUypyuD.6.[ >\UV/nriN!@Hr?n$ropI%PBb l:c˶lVd.mofv%Jejw9gyϾGĽS!3n|뷸X|V?+s9TpUuHbcN%'ģy1x*_Y&7 l@Ks1pB<xc Uxv闏RT1 Ipoғ!ӧDmT{`"۳kǿ} PIBYC>EJcN]4K&hX QTU9oH4r6 6Ey5f^;~w*Joq8ge?Ubmw  Xm hlő=㵿G57]l a?,L< B1ҺR{՗ zHΆXI]t%@<:r]"r||4Έߧӥ 3)B#7X\8G0gZy]<}*g7v,'R];nى}uFvwK~D9'dž4@U`gc=2NONR?"  9wFmO wHmi0QŔ6 ˁ 1ga~Lj(Ft > s{0aHJGa +d$ڻ;h`VO۪]mWQw,d` =XI!3yr{6GaRzVz?3gY~nTf`GspacOC1""u,aO7{S W ћ# biV p!ʥxB"};1-=Re {ũQlHvwJÜt<pcOA%ܔ!E Zz'ԂOl̘@OqO[s1X^7d$ ]`LҪl>|:Ο O|Zo݌iaUmmmQMמ+k8`$R(RmM+OZ쩃9=I7,Xid`ܫIO&d*7P!*5gCoO.`tW9۠HFV x krFRF\7 XV8k}{!*!{j$PC<cm ݵ!4qg+ᚿuc0& ]Ğr=K< &aIxcx6݇M NLN? =% I|:Ĝ -A)1.ڡ۵_U$aNתs[VaEIȋ,;N\x[“ FCl'aRr+>,P J[gDתR+ç>FSdLrh)ٌ7_7TC-@qAb- ӌ ZrG%| 948=)sBRkc5w'/O?bp)@Ko@ӯb6A%bU81o0;XzLȽg+,`}щ)8!ez9`Fyj{!j׾!\qP``ȤD`К5!m;ͼbEV$(G$L67msσ1?U9S!P$di18A?4qяpk XI|v($#3R߉駃eȸXOauXLBN# r/>Ƌkz_|+j<'cɏYB<N״wj9,yd⺧O1,0o/r^_ n7`v -2gZ-P[:D ^{Ńqto+:ȬNaYW>W\zǵ$'%GĞex,ۧ&EEGcϮ1eAE@z;w 6..뉑[=̾6 Ws"3vt n_ݎ]}{yv2zB}v`_1Ez{pc~f ۰7Q,9W~H3)æK19ר?Z>i7oFI|;n,! YCdЂ63 :6+1mFݣ4ұ56ԯe 录{ǺYࡥn1LZ[p o޸gUCO:pu_!lx=}{= n50R8FqXs>ϙ Z|X='ao.4uD*x]mڨz)hVJF̈́ ! EVs⮟>$P8Bip81g JsR#dbʳwk3qt E/c$sR(B0H!$4]ܿ2ڧv6!se~4r-C7G!Á !d`>"C+JQ [y a [a2(ad$|3#} [zHeK&aCBF'E **:?jH s(0ad$B! 2 2`'v;]=s, uڜq $+ad$B! LW*d ;蚷P)lҞ6vшX%$pI!7 0!~H!M[l\]NKI/$0$Bv''!B9P$Qvֵ-ܐ%7}}B!0EdB!B!2~H!B!B8 !B!B! B!B!c(B!B!2H!B!B8 !B!B! B!B!c,B!@QYY Xm!Ld(B( >$A  "LF$lCU?~ =nw !dBBFI߾{05cb!Id\?ĐlAYi)**3YϿ9!c1NHL#tuS~w8w[M9t|ǩ_?Y+B{ͮEEŠ !L`(B(zQR|g 3;7<!x6ySp**M$d"|-]wǕ?7!?7t9p?0j|B$ 'f"贫=fDN|:lɄn~ԧB4Aө %B?~1¯ dC!LhH!H a9!6>{"Bb^kJ߬tFisw:jAHNLd#P^V&!̩8!dbCBHH8x<>E:$w@눠Ϸt݆~B= A|"B^BDc!a7a YXJ}pwC_ѿƪqYQ }I#́ )9PJ7jBayqLL+* 6ޯcJQoG&wE23B(B7َ[mt~ozBe4HΏVf=mxgj·z[m_.iw,ګNO#jdk,4g`wGPT; |#|6a{o}O{ YOo맜6*BE4FlbŴFÑrԵ0hXqujvmdRqPT3! 2bc>|vxNE*ۏ=3Rm]O#:11vy—/\ m<*`vT9ǓO=_|I ''t}gz?~W+~[}R$!:990~h92͙0ZP_QmG)Nnܴ liCRn {7n¡V' #ׄ}(X sNDkhBFGQr-"J;>p"m)0!*>p!3vvWV״9)P$ Z|mʩ5Gx~ͱ`jT6uc\G' (عv;wlr_ǂc=*`BP$ ./~Q{ohV?/uPR'Õ5;8'ۮ:J x}(j7?^BG#w1"g,wq-<f݃\߫W#?݆[_+Vl)FyN8ob2ʇfz\^`+$Xbpޭw\yk=;>Aۈyq^n o;~Or#j01w⇧ō(Wx=1y ԏfۿVL3 lj1dL2z_\tiϼ)9Fl}E}۞SFmW𻍇PT=y:N;D^ Wl|7M^ڂo-ënCq8g鵸xz?JPņVʺ&RiB~rj(L>e1D$Eⓓ3zc ^lEp-̰E'"-o*Ң͝ k|8\Njס"$<%JUG z/Z5F\HPWVv&2g`zvܕnPjڍp7Cgbf6T4;]IȜ@PjAEN߷Jآ\J{4oEOVк_pM9 h+ތ!Ii Í};PT^6D MP+%O(?-ˇ](_vIM욲3&ٴfrmT~QPX\f4N؀P^u %mM=u0R}6J^b#uvP|`-" !515om֖uǶ-1{.\nSBw;G! !4̋nǭc%qZg֍=>?}K/ӌ+<"f[VT&^n]g.@۹ /, e>u`̘2{_ːՆ_0zLi{iTQuTә ;?|~_&94{Qw%ppu&8L%e!::l{%,ӋH~XMuY.툾V;;r}9b#'$N쪳c)Y oXj OKwpqLKыƚaZԊwFHNBfD䜄9v=& 5W &mج׃Z#17[=D!uj>fG,νq Er爜`!(޺%b:Rcj[oE v؆0EuvR6P[%.7!e|Ls;[[4Q􅘟fEQSIިm_NJ7J? i1%{6ou횎9Y0pgWӦ4 74}N} wOP-h*܀$$L#^J1uQ|и"#H?=O-"K|A?fa!P$;LIHKK@ynW,GeT?y܀ٳDRg`hX> ;t{iaH'v6Lm\LǶ Is·e tΜwṽ04nkʐvpE)8qS`ƶ>J8F4)v̘: #sEBltgE 8TS JybCkM+Lde8\uo[ч.¥g o/mj"؇i{^KiٌU#];7EMSVzVچ 0p-%OUӡg:Tcǯ6a:8J{3Z%Q0JtZI81ٟ3qhD; "sflqk3dMP<]Skt!.&BυI}]Q]uڹznЄ (iƔe TPIg)L||Eէ{pq6be(9kʩAP|D#!Qg{`?."+L*[v;taJgD"b]9|r鷜 %10624g-0_9<0!>!NE=]_YRJe{Q˶gaVzԲO 2f :o<Hc3;~~OQd!P$C(vW$s@rzQy^~{ mr&AB,/-_Saٽ_ʹQMiH9s:fMsaծ"THi^}p`EKB،fe5r.߈eN> g/9'dBx@fPȲ<1}?F ˍb!kemAlH)x},DvUZOD|& v.t $m`G`ФIV,h3գUէt>rs h@uqM3bڪn)A+zkwcgQ;fLF4h.nܒ_#Z+b'=]O5[[JOdUCr44!f>BO=jC(-6X7<^Ab:PiȈ/>D}rRSS2w5P46$9<4kEdRM=DX﷖/K _M oCèow)hЩJ!7Q"1[Ms*ZRۣ^pSWBHI~v1 '.\%vToTr;x5ϼ\H>6v 4_b[ pmob l`i b44+CF wyw>9;b;{Va?Ͽ 8bt,Q:I HAZT7ѱ_ cD$$wN!} J qŌ mX\M8ʺ*Z7CJvͲӡ~O"QjN+gcB/51OH}5ؿ| 0#2)X2dDA 0j*OC*jHi>BHY3b`[Pu*2(_ i@BCJa"8bnQ }c;g@BkP#~&> D}ʷv}%`O M-EOg2!Ll(r0l&gnCCR:R kP\!#ލJ)bSې^_E0֮]ȭ8<ڃmPE0#04ed|{ *! )3OlQLVl޲y۾ڄR Ο;N,IЄl|Gv(-'hmK|^}՞alAd`O陁kLv-tO6D+AY|$YH%h5%"/ѤGk‰&X(-sCp] y<>bPdu=;%wG #:Ƌ¯Q`ҢѼ~QV'-2 mUjdC<&xf]E@Zעӫ͈i\f0`>ϓ [lH(\Mehr!kv7jeWWnԓ͛[W ;>=P$%+oa܇׷{ BO{![9󴣾V+K,e%Z1P ۹Њ͞u/rD! !d$1$#+݄_5g#MAk.Nʛ\30\'FYs"N;5kJ5u91NC*[ɬ8Dgj'}1X#b -"$?okrIMs\x[“ FCl'a)$ʭ@Ajz,*mpNU@Lp 9x#\208=[nߢE t8G 0X[>"pm7h&Cލvy`Taׇ#Y0w$e< NTIqdPRR4`4\+FC`SzP)x$_JNZvMGfXLJ?׌@̀X=&=ݩFsgSZ^DƬd n!O2@ތý!ԷB0b[MR3љPmM}zfوU;ImF[8>~U_U ! !ҜX<*i$["f_&!񓈗ڧ_ol1H_ NE!bzc?խV8" yz}:fL9t}´α!dl+X*NZFӖޅXx_d,6R+`h(ƷWcYe|;߿b@#-~x^'߄HdVO022aZގN:I}o8b`p@ܹn%D IȞq1~r٘PlE_́i-<` $щyoLSg3.nmzW4ˠWՕh+\;y6f'.,>,݅|4D]T^9}8P ; PD,$Faǫi^;("`8i77C(nRͨ:xj~lLMWwo;=6e7y[K@ւȋ}s| 60x},`Gbv&jvy|Oƽ()܆( ,_>Lx644`9gv{tEgL&-Q9#BDGulm 4ұ56ԯe s?ͺ-͞0h |:~p"*7Yhm=̴lŋa1v_nw`ί?s6+/܃3fn qr;isM&Js( JlXʄX<5R? ϿFg,`Im3Z~{O}8Y,0n3v[Ӗ̰x݁}F+,&F&~e5T8hhs z No7F~!0e^z YjڴbΗhlLC퇋NkpXNM)Pvu$:Ρ=G9@iO9pކzo ,Z&5]y|+>j3mOhދuk!椳1VĴY-SS}Z{юYsf{]ycX믐7L8\QwЦuJAd7s=52>` !A˲m8ŪSfЅ#$<=( ).*y!x (st"{]J{) ]2o-->]~ӆzs]D|KGz;=5?.r ׭`Hzo5{ vܾM~ i,oCַBtIygTQj1A5>4[1%@ab j^N'LǮ1w"=?Qv('Bă !đV`>y~GHO4YϥϬ Z8r#E{W4íEo,pƤc֜i%x&#F ~Q`9P-o*`}H! !~W$B/2Q [Al p [a_wA% J|YE@3 SiZYE An+8x„ؼn VVNS!BO4vBȄ !gw8PW[Kp@Ն#̡$ B;t=@t _hf0(>11,BB>)BFqz_8\$I_wH(@$ bq@$'&pb࠾cN!ǎY"$ @BE41M 9 LPDlTЁ5!]F D &6SB !BHYK7B!B"B!B! @B!B!B1 !B!BP$B!B!dCB!B!q @B!B!B1 !B!BP$B!B!dcdB( |>/$I": B40MDD}'B !svקXm!#΢dl`TGR`% >ӎB!8ABFIeSC.L+܈̜!xPWWv8#"7B.ЎB! !>---s 9P |!-QUyDw<y$gqB!> ! ׃45]RF8""4~.m~)479CѨ@=:Om638!B !Dž֖f.C|B"'NY_H!9ew+St'yǙVaNEm638!B !ER^V\vc"Ksb0ӉCE3"uTз(]NBm6'BDd2عU~BtkkͮG#iiT~ ϭ݇5xr, lB;N!HX@Ėw×m#VQw+v8cY<)M"hFSc#ǘ͛t:i&ڇ~#Qmٌ=Un-lB;N!!!NvÿOcG x x̛# ~E;c?n|},c4!I^Va kQ^R9v2ҢLEKaTյ#`v 1)6CcQذq_hn_ׯ'.Z.gxPx(Ec7oLSk?azWdʝ,$x^y/BǛDXYA[k˘(d2C4k:MusXz8x GPVf@zzZ#qEHT?zY ߨԮ?@xg2pmu_?~K'G s=YPI5:fe(7XgU=_;N! @BF.Ӯ|Wo7r:c⵵8nA|N:-JPQџjAHFK+g#F SſbŖbkB@B|{7drDC?ŷ_ޛ {ǺYࡥ!;ZW?܆FqkqhR ?uMpÂyq^}@Cs۫J-?;םC4m9ty}1#ȝ<6c(cW_f'a݊6ݷ7֠-6a0ϱ'꟡)TR 59)w#0pフW?؊55I8p^ZUc늗ƺ](ʚmt>Mѵcaa҈ʶvd4Xj !2vH 0?zcҊ'?aUT~@g.@˯۹ /, e>:J3Jvnҕ,UXb.0u6̋nǭc{\_8^[Y-oKSҵ+?ϽlރÛ3al?oe2"aѢ O ̀ (8T,:yqcZ?s}oT dN>Sl&cպ4g2=hmNhw†zi,vBф6#e#brD!V:`ġw_qo0[EkUn̻\ j=^zsV}nya8\rᦘfX7z>)>ބ>YmAcDGi7B!dBWa݇_!_bEq֙89uem4ouȹ.|1ŁCn !Ǟ> ;t{iaH'kt̙93}{?M.ᤇlƪˑ~sSt"J"JUp" %OŬ|z1=;~ol;i"k9Dv;f]߇+1 p}I=%|jq=Zw{~ph31v,e*>/h#,|skXnْX)]:eR%>͛Guu=b?9*lɛXՖ i#lt1;3%{+UB OLW|m'W;_}XxۛPW]r)N!X8!B,1:xНnH=>y5̱t̤>`'\.y=)ç*i37$_vx]{mpA5-N4.TGR3cMʯ>c'^`TफKWA'Vd0L6=Խ{%^ݖoz2*rN;3#{dxw7ȓ1I +7-Q4I /1 '.\\X>MXd &XlM6 qB{P$dpgk{q Π/GgpEp$g!ü;.//F-=Re {ũؐ͞D+QXXx%h!>&-2M_TAOSP97(A:3xS&i6VmcgtM_j~窃=IYE]Ԇnu4AW[P@Ëf;FYPyf)f?FaKx]8+I.u)A铆s$NBjj& 8$]?)5(pJ;5}'қpc>+ho` !2HԒ+Θ8[w۾( ^767. p?ϸgMn1% I|:Ĝ -=2jŠ Y3㟳ϐtV䞍48)Y|5=x`xzNMUP_XQ o׵Q9]/5+>P_xXFh+pĜуz(dD[;{j]]=nkE w;n8r/㝺p0kqh %H`_ٿAk9uͧweXTn]Lv#r(޵_U$aN|JYj5'S`aH_M6;jCCu+&QnA}M`KS;ߏ;N!@BF߄s% _ٯoiKb{pW+X2_>owKlgqB(m wЦ3oЦ͐-m23Aj&d4!dќCI<:eHJIr(T.h?߸wHӉ<~y=>#$t$nr[˰(? 7BMh !2\؛&72Cu؏Ç#))IBuBё O/I}&u$Cgm*܈w(Euc;kRǥolB;N!aCpDLeff(BEy(6B=|(ek%|GBBBk$N̽ucQf>ӎB!dDe!:]9 YM{/9yFw L&475fwBML;N!# !c¡˛~<͏p8Phj2[ aV σF}DD$|>/+:!ٴϴB9NP$r\[ FuׅMڭ6+*+PU$ͦ}'Bq!de-Dݬ6;&Et-H9$T?QeH>:gqB!o(B(;aR?+-e0L3!LL;N!P" B!B!c(B!B!2H!B!B8 !B!B! B!B!c(B!B!2H!B!B8" AQ|^HEu^Aha2 ''Bmm!xBBFQ[[ҒChmi&ДԴ?\F8fW;+!c>n韅VuLjCl2Y $X6'Bc2!H!$羽{05cbu'4(S'8v[[ JKQYUzEP d"'Mkjh)҂pq3cgD$!샱FP$Q ܰP:6ySphl\%M+V5 s@n_DQ@||"*AD&=;:Ű%>`? !d:n-͈PNII}v>Y-MMT{ rDD &&F'A6aj`1>DFGz )ȲAZp~ݮ͆$dep@ 샱FP$QD ɘpv|x, d@Z[Q~Lw'h41iQ"$LRoqOk6SHb6[UX}"M쮮<[7c9{NinnO1w|ĩv`0۲`2ѡH!$h_x<Ց63dE"#;vۑ,邕d%$:⇊!#+Guӣ-;6WbX| Á1N9t&\9}0Bȸ֝BH(=>_gbS 683M+xmC-ĪfyhiT ?@]]}ņeh&St!&O(}W+`q @B!ߏg}wJ;nŎҶI܀-=y՟w,+',*M=v~5OزhnjDttLh456}7oĦMPW_k +-(ݹj/fƑSdG*/CZryydN>!d!C]oƁ&Dr1+ XXDdh1O"WO܄Ҷd|k0;J+wWWr|UUUO>~e#j^lwu&ۃ݊'o{ u|XsHExpcFmlWюd$]чj쌙͐$oZ; T#=+V1+^FU] <fg atJ.ذqY]Kh!zաA'6߄[1N-azWdʝ< i)럺YZM &"Rgw6&[^i8UE[k+l6۠vH!ǒ1;F62Hƫު/͹0HI!J0MɫWס]g<(7lIv{!Qz⩈ lg=lwzzlg9ųr(*vE@:$=ݙnI6$;e{k:]c߻jqm᷑.Fn*viJO=o.FMF8{8-.E[%e{MZչԊzMKa0!H2LOGQ0ڍ|(}*a;pZ8,, .P4יY~u^8+t%^}' ּG?etblCMe KpC֠>lcOWqQ@D+E5?wRv(3cp%j6ٺϱ}G K;eݹdzP;.c[)!< {)<&#n֥og"`Grl69BsA}OP3w0f[ tq7#gmoE5$ƾ"/h';;>BTZ:3t`N?S|Rlr-Y8N |`ԱT,W=]E;I:E~Ie%JU9a.gE 28XR2; #e;AuO q-cxt< NJU|u]?{ep[ZϾĘVݔC=V{7ؿ7ިDB vLk?䖪+Q%3h2; ω9v G'[q1aAǰy;<_Wlg6f]4E⽏awa9 0 fZ:,"B!4(_Յ"\ vvP䜮M[RНVO&nDEGΫ_"OQ-߮qů׿ޜKUV{\!x z8= ό |Zz,?q*<4MFAD]Qw|z0lp0؇QHi'bd,"jTVnizl"QY\XWy$[[{T;dVkTd0 ObfR[cGQxX@rrT敒]7v< iKաNPuspxn{$ON-{H(51k s·X @C8F(϶#q1]{1IN#P$/" (!` iQPQɲ:Ϙ[g"D8^y $OjkS :s`XP25HtT KQ\ O jIo??HCʱ܇S][jCvUM&x z=OJOΕkp0L&`:T4gtЂoHĹ<WO>+scϿj ٭*s;=+S+uXӌ~T4 sK9H.N7!r\|BRT9yVLF+1؉q ]8et0֮ߞs,Q čOE:lB\/A}%ċe|6bO`1Sl!лW &t9/FNlœy˰_ä;>&!A9=)m&#4XFq1XB" jO:=~o ݟ+z󻘷&̆᝿y_c}g# br¬AT[:و` c=~Yaj$|IyzǰrW7 ǭc`ٓ2[P˩x<4{*b=!rĊ_) hm*T$@^qHqv ye0& V5DɝV–a4cPѱ#M~Bꛞ羂.h>G9)P$k3F]q-N2c8xTJT=͕:}|"bU@]jN|1+ =x+?nOza ̆adz> MgEࣹ_a䝸hR[w\7js܍7\N*~lt24睱 O~/eEBP1rj&Lb,F7vQ%5Dd53(2x$NI{#!8@Fuh,F6/h\v;>xG^ OIxX"{FɷcU[K BEڨaKcOAf$PC,9gp3izls*j(/iZjDUilFjP^R?FA+CCQY|nj179&wS\VVM79nq08;7d{l,nhCffY99ػz72Ft0rssa֣7pN:L  {EM-?G[a%) vC ܒK0>^q~DXnz18W=y𙔔믿 @TUUc̫]|ƶeciI#q8k1cW|PkK`p0  6n6#Jo$QVz Ag` DE/< qR!Ra ƀ0;2BC0fhl޲)6y]?c }c h~5p]T- œ: n_[`BpL]wqKe_pe0g<|yWEtX>6e܀h;ᤌ#CTRS;TR\Ȩ>71ڰ6qONV:*X!ڰGHv` `2~_cjIq~FvOpH:eS bqI2m. ZqN̈́BGBikp߽wk;>#䗈*q0b\*2;_Oh3_P` q:t-v#_b85'qLf&Yo߆M"*ڕFgP f6pi5^#c0BHkX*B x:5h/OM ~ "SSq`^"66VѣʻcG `|o-RDdM+!"a#}Mx*֬;sw ##S|Ϟ0i(Luf`H!'uh]_ : >;]mÜtZ#T/%%#7IS|FSg軯=Tf5j",SO@9G|ٌS&MDݻwikc0BL!'(4O]ٌF?GXX$$C!p!wɩiʻ`6wGS^oo'm`tiS-HD~1h"))eR?`rbO)ݮQѱ}j}5 ؆z*6ţ ~~%T++ʵ[ JQKk(~F] S,FTWVjj$fy9M3c FŢ\цHB`ݓʪ>Į@dt}.CC'U++-EcZ-sDQ T*O0c *a@B9hڴEDFi-CklJ.ѵh>j&B71 1>H!'8u"/#4B!>BpB!B!B1 !B!BP$B!B!CB!B!~ @B!B!B1 !B!BP$B!B!CB!B!~ @B!B!B1 !B!BP$B!B!CB!B!~& dYFYY)*+`Y !ҏ*z=CQhB鋾& ]T F?ged b@! 2RtYφK߆b3!~BKiI9E`V\k nB!Zs-]&32a\ <"O]O~AgOCl?>.6kP$mJK9hp֕gE:B!Z&׮ggnՆK^5\:/IRM\E<#5}Zl&H!466l0SȲ5kB!'֍q.eFq>Rd9.Z"Z?͉؝K/BBH▁^#BNfцx x;P *BMMGBG``32a2頪kf 20Ip|xzu(ޓ!4ًTaDKplI0B!7q~Kql=O>]v_]/677Lp%dq엚g;u훟- H9 2KhDZl۠A-JKo^ >$֠x>"%Ҩ l 00Ԁ2"kB6yAkH(عV :cݏwjGΊCywEeM0!1{ lݻb )D0*yGb $k@7kmyMF^ E9 c plIu?] [DvH!ًy!**Jy7"##[sp_e˦\MS5۱?2:0 ۊiy&c㈜{\86 tw=m6ש`K*>O좠~B@Bz텽Z1iEVY#*6` f.O)BPg= m7hn#ܻY#@uf *s7@;kݏӐljԔ!h `=۱s6\_CI:l;bD|( P~{Z9!ٞ76#}FIcj>NBZ_v{m/)P?FE@eZŨ\+v"o]9ljLj͎[ۼqsQ3Co tlӮyOYɂBg^ǵ=[j"ʈ{fjV- W=7\״pلWo{(Z3PR$? n\ᅫWбJ40'pd[|JoPqpNY~){tE%?"RofG:+޺n)w{Nq˰nKX +-"6kο70qO> ?/oāra)p0t%nhpd}|]ZȚ<?u#C$y Am=ܨ; /BHHH/Ы*RlJ[S#JcX}P#õᬢ`P̙8?LGG",V!0s*FdjjNRw}Ag`hjVa{"ide(}` E (o 6 $k"æ^?LCǔstA0()ijltZ8}3"+iNwʍ0pӜm鸖$ fk_6M:XXmUu_J'ո _~{ !oEF%j^)@ .Ƿ]ׯDZث[#P.>T9`uعQ<*p?n^OQݎQ8c*`? 6 yeAn=R/3pF70G,Wm(MZtux~QH+ } Grf%Y??+ M1nY%A.r+ɨG^{~b&ų&q0!^ !@o c'0"c0$X I5xQUk*QmvgX%hQbQ_9*mfDG5OUjS[*II'iftuB\n+M0 hlT[PQ-M"RPŬM ;}{C@̈́m{p?/)GSǨKyӂ&;ubڪΟPϟ_I*5]esBHEm_չ !<9ĽE*GA6-._}spNq,uyZ, #n~ ]+Kcuo0r 5%dcxz^6r"oi#_m CBB#óe5bP91"=6;GQa駇2㟸Gm]Xl#.=Cb1 a\5leTQu|NU|ҵzoBիz1beiC'0UV8NGH]!3m6):$s/$oBdD)s=,5M<-x=o٬RǗ;01[x-z#BEJQ-7/(-\z`e ϝSs4K?.*J g+6lͱ?Z7jnӧY4|s=OAX*o/j%qF`8b4;n]#38oܣ;+Msn4ߵJ&:^z!P$7B\0ȖF(|%(6F)>mEYq r.`~m5(+ \cJ(BThtzW{Kk wc5eC`$}[t˞=],<$նcE !lgD{ݒS=%$$'^l[oa6JwS8'URNc Y3匇 ;{9?׌,a`zrD) -i<:%0ynYc":qM`akrynaԔ)w>"ߪq9ydbE ,X<:Ԥ۳? XPk pݽۄ6@@6@d`,R5 Aن;*)Cc!c[zkݳV!H5BI. $X(OYV+X$][?f uEGPd'JD#2 c罼`4u%( BԤ?6tͭJAn9B!'ҵ#ZC5KB4)B-~& ƚs91`EAGnNnsxptڰu1IH6iU){=IaSF#PS]rB @BzF!zdN:Gf A|M}`6 `=2b~'v^ c66aXd3c_v߂My:"ׁiDHؒ~P@D B\XҺ㐣u8dQfGB9-Qk#)O@G à(#,R32QvLC< -Ze{0z(0C B!x1<.r8rM s.^Yaaؾm{Dܞ -)%~5L?0\0#aPrp7NUb0z\-y&J P%!-[,yh\xf _O(Lia04pM&OLxn}GSEZ!>O; Ir1*CFc|b-&t2,pX| S I#qyۇ ?%$>>i7\%[SaTh\05Z3o΍(ǔIil,q0!^V!^Ed@uU%Z:E m96L&l],zv2 cRѳM߭WbWalp@$%8}"2.ƻK@HH\zu0Y]Oܦj*aʌiXd_kNQ=fR:-#C̥IzsS?˦ ͨj|7Ҡ ;raպO&3RR!D3jB-"XP'5&aiChkls*X ѧbҠPVk7_~/D{Ւ[,r!H! *\{L9,ِEm3O?Z3:O/V_] Kc}xjS=:^ǝ ZOAV]C`0@uMs \__tv?w[c=.9R>OnxuZð==}(r9[(Ēª㙙iЫIt#,}*Sis.ѹ3WmP>W+QT_WהoQgocE[P>W ʵ?Y!}n{pHdG˦[\6 6ѷ955?`@BdFAZ XʏJ7Z!#"DP_P(;Z-R`OsN!!%%3g^ޚ믿 z* qL׹]{{=\u hx:KF^dms8,l5, ֔>Ɇ =ai',}MU(I]@T֑Hަ}t,s0!^ !\Hż~'lQ[O@k :@ p$p\~:P!$%a_r6 l59{k9w}:)~qNY}>niqӚ'513vt R(tJQtPyC&īP$n`ZaƆ~kk@4.kȔ!CtM١~*I}Gy3ni#4Xɷq:ګiNhDY֦a B @B!=e"FS$B|,2ιEu8=^e0Z#fILIZ'5ӣ;-be6\vW[o{z w6XHKϠ gFpD)6a\6U6ljr?VYQ$k ViѨni1iB!eQFWVR;ji)޽{v[u9LHIMCzFNV~4l2M+msE:fB;ƇB ! !WDBN !BzX19P!B!l!B!B!CB!B!~ @B!B!B1 !B!BP$B!B!CB!B!~ @B!B!B1 !B!BP$B!B!CB!B!~ @B!B!B1 !B!BiB!,˰Z-l%_UD:(δ5=!BN& !de؀RDmM >RiOHza#00AAA7 @;#;'gBi !6U,ٕA9 Gz$pA!==K˿9?L[X[ӟB!- !V`RYNIyJd @F@ٝbUiagښB!mB|YS]_TPVV|z"~hk3{B!= $ dx586u:VF_wgțlժ vvx !rHQſ[6E]1qU qJQ]}к?O=f0޸\sq<9 ӈ/U`O7vZ{ 6K盵e֊{⥹s;@zzz߲\]|AQ\/?Ӫs=e4/bZN3B!aB**A񄉓=ҫS9E9IDW? f!.5l /`іJXڃtζg^~w1;ao/gV> kӣ6vvܽ |u+qu׮EqI ! !*0*G8g~gkO~7?N/'t)46X\Y[0H}X?1w!e ~E%5嗵ߏ?;w.{MҠik+`"I9td{ f' ykw?Nw >z5x㩋F9p~qLhgډ 552.W Grm#W 3ƮMX TO xssK߭?s{/X;1&B| 'Elנ`g*oNzxxL*y*6-[f>Y gHCRxuM  T~u!H@Hfʶ/EƂgpXUFjoEـp 06>ĂBCspi<4 H\4돸![]';˃'`Ϣ' W%+?z<iFmօŏÌ T(ł"`W?mBQt;l..X~7߻*WW1̀V;-?cogd DE7W//>ů罏غM?4Av˵غi]mw :Kz;o:AAPRj8:u<Bb,A}|`DEBhDUׅ"<Y[@]9Ӳc?Sq٧alrCThR:.,G!:LwhL°XcF!nу8P~_oجuM,ُZy`0,޼_I8<k&F"RFe6y~7 ADpv̽qzʥ}TVr""E@<,)SiWnD)QX˾،Ƿiں:ىo=G,^WV,C7F}n vun]k$},_O5~t'}B!7HH/:: dEA^;:ǐsy#|W,NJş}'x!1 JU*)G+/aӨSx܇S `0F!wM@fO-@ɞwEEՀe[[sxYHLҽ\ww.,KC*.mU423BѸ#UG[{֍k:܏g{ so;zm5F^>;yxWB!ĻzM@щrNcQ[ԡ_CLYu!weUiQ YOENZS nG*0&$#MB JG|i<..Rov ye0& Vͺ%OKQ[Oߞﱪ@0n7T\pVu,9ԋp}?ب';rI]O }ֆ!Wo? L`soL+6~c橻.DRxeνxt>4;hA]/`'EȷϺߗ3B!x $7^(Um\&<` Cz##qHM2`ŚyƙHKP<d6mW2"o- 0H[WXs|d'$ PWoT$KcOAf$PC,9g x:|4#bG3ɏt㴬Hq:SN̈́_Qy18# \@k!xU @TH\{HV#$Omח?WB# $=5cWc۲ױl}絘ᜌ_ĤKOoFaՙȾ~.;xnq` GҸ0F9of!ںntat9npYV s c0/\"ߍ C1F|T9DcX(vΏ)ݥ ܽ'B׫,Izu\65otk~έ|7P_Cr܊jP}+J0jX-N sªasUi1\7~bp]m ֮Y<!N,h.2No#t?Ot2r~{q8x @TUUc̫Ɍ۶ {pX 0lo>ڀ}ǝ{Ͻqmx)BN. !xU Ĉca#ݣ (Oeusf%&&{A&yv =!B @Bz x1y0uoδ5'BHo@BO*̝QW_ AopB;+;gB9P$ⓕes@JK0Pt("!sgښB!mH!*:SfQѱnW sPP6ף9#aYi~dgښB>jmlM@B (MAz۵|ذ+AtI$-3ߔ-ͦ l?a3gf}=U *m`` ZDzRFEysQmTK ٙ2킶 BL~ 3R@p)  T+\wAF\~LvE[S{FyO!@ AH` M;v^aLv&[))  AAAAB AAAAA0$AAAA C AAAAA0$AAAA C AAAAA0$AAAA C AAAAA0$AAAA C AAAAA0$AAAA C AAAAA0*2AW"ǡe0 {J_B`()_  peL@'Zz+UltIh4Z$$' CbIsWS]3y;@Ttc?W+9_m+ =߯y BZ/AA_!\@K޲yMղMoZV^Vgk8K'h*ℐfIE(s6n[|!t:R::/>m\7h+xgpV&Z ()_¦uu(..E*Y j1]^^A_AKl^(ۄ3oED+R\tjHHJ'yga/JȝG"wiIJNC().ӑ(}O$άn[wHR;:Αb3Wu)%G2))_!\FjZ:HA'U=zmVݫ™ӧQPXd2  v ъ!9S=MQ8yVS~{Y4t2:](^:{^\ d :+)SAG蘖65!*^l/,@`P(AA7H$VD(' I,*ɑhl"Q0蝞%Pm8lW,y-XoH~_ /!ԛJqXW <<9G   њ+E'K}B VvPP[t>W`Ay.4!«B~~^G$MKCFVkP*[v>ӽ_E7ʿ=8WmJI8h0>J⡄Wr_|!BMѬ˷h\> h_H&:(RIA(ñmP{z Cɲ';Q4G2/l؟!":絻&G69*))ŽU&a0haB&rR[~֝l8YeME뺂\~4Nk Y/@syowy \`p 4N];}a7!pEN\>Cq}6sO% $Dk>S9#oIh3 rugPy.<,WeY}tpxN`C^I7Nk4AxݶOlQc'A60&4m5{ Bp^Ols`0](5lrGYY޷m#](_.c}q{ v\ZS@cW2kغȉ `5=ӽ? fΟ?[` t|пjQx$~,=Kј  2zcb+ &h4ڴG 8qS /`n B܊/?j#?N{ʗXX6wz_|q\YjǺ꿏D=,X9Q笹@tVӅۑƓ>!go{KKmqK~Ŀ;vmߎ>}[R>.ZƕabQ]pbּ.NzE,k7s*2@rW`2cuCc3عf5~v +`Px"(*]ހCbsryTxj^yXpeC;C%S|~iTu;#ݰF{>yGW@ǘ놣? oR"H,#sX|xC/[qSu" }~-}ຏe>GC4?!zS!K$pD*N Jv ?;>|̠qWZGG}{In3geg= kЉ^\J/|kðY#2K+}63U舸+()=Ñ+szl.DExjN}1 m2NeC|cHpgs㯰{,f :B}[ގ5UPyo(͘i|"G2~#훿ЅI vT\<,] :QFoxw~-ćog߄~MĿ-[WVV7oƀGCMJi VbDUy x|jg3ʯxrHBuV @ϫ`kK{5fĈ >oS;CF#o}v+ҵ61iϐOmk0}?+?p޳x[ţMVA ؚ20>'LՙYP{{ӣ%egx\TׁK +V׀SxG:l5I={y@Rczv69Y `4/_~%Yf!11{2c Ueb Y;CmNxZ>|qH4ހʲ 'ᩛ3fיXs<Ͼ2Z!` = DqWJ0458{29(?_̌P3 /Ǽ0;խ8ᗥ/BvV܉k{$YҿEסoKuD0 7K1&!p_ov)#EǑQ3rI8x}g7t6ZǾ{O}_!w?bG=AѴZ 0(Ǐ%$[c1耧nHDUp7Bn ;c{1W_gDŽJa?c"ѷp[d#Eǘݧ{˷Ena*_9gmxo,ݏJ6d*fMTc]?HNgͷkD`'01^~W;H+I0I!-ϳ#8"=|A:a~tpbF7p-TlzF޾^](X:c3qM"oS6<]൩P8ϛ6ӧfsP'Zu8F= P֤ecscӁХ]fKqpwX*3Bk~ wW/Ē{potW : c;K?S>|)VE~I%WIk{68Yg]s+n /2`ϰr)-9㉐9FH6[@]뗓jqbXj'A7;G~%//A A\zlњ cаzp!-?;.?::)ȂWq􄏭`9'_3PnDnB9 7SאPcx(C7)cIT-zG OЩ0Om]# WyXg@wV Sb{pU`nu{xyGG>r Hf*.hȹWy"Evꊌ*ؘ5]\Vč=*5irRZ)Iɒ

    Ǣks­bb$ãC' an@bq1!1΁>%/M~a`ӨCE0s0e's5&8dv߽g|x뙀8/F/ z"W(CjeHIt~ӫ+ a >X r9Ve]~ݤU[\Mac=E!{xgk n [ڿеI cfA| tx1ӣ6ul`/ :%BWUre`<{9|?_|8=8~=R܁Qޘtm'1Eس;,|g:TD67mOm`{xMxvr*иAðǖü5_Ci ؋FydzAlX>1-EcQ.NW+;A@Emoa䷬[4}h"xh9.N\N'$ "9R]"?$V:192vp*88qa.Flv~=d'o]TN;QVGP Q38QQңP^SEzͽOJ`eV3b+૵xX?EπKa1I0YvVR!_&i,*Km22q\F7 ݅)s9s'q?~n@SZs&У`J|f䕢N u$}S!nz+4?:6:L۾ X"ؕROųӻupUX tkD"b9F֡H3ڵp,Du&A|Iȫ_:Dye-xި%_>k͕^O7Lot>]}b2pd{!NG8Te(:cٞ8gx~SǷ:WCߎdUW7\74kXe0 cvb+xazU#ޛ**}p(Yf H$V X8eXG? ݎEPWgpIZ0V7o Ź:D&#L-.a)9E>]BGS!bz p 󳠣t۲(ާxc=+EDreVE&eXr/kǦN@c`JG|/D}LW'E3LJ9bdtC<9YjG[p:&BgIǀ(yfLzx&_;ޞ~e y'hsxtb3ѽE$Zd5kцA4EDP"5 Z _&t/, |W/eH-+GWoI:[ S8Fy=2)l=*Tc#k]66=rĻ Лqqeb'`W3nGFߌn` = ծPhXd?93F*Fzvv+UG@'sCjVw Y  ";=(<4 LUUz.g/x794V/*˪qͿy=Ջ U:t2aq*g,D)KrQ`Ǚ>}Mf]aޙcSؗ6$2 8B5ӲUd"̤iHbdϖ惁?M6a<-_ybfH noP{\9:m*;GݯD3%B+C :vuCdUS.:A:aNHi10 ~n:;=irY3N♖\cވ;|T̆ ܰh0X[¨0Mn ~;_?xzKj3밽$ghǗe7%(.aERRqNMsKԿ)c0U8nK)âαYy|]w_@uU dn8ͥ`āHVQK,{2A% {Ͻ>1sEAIC>ؾu56^kQ]ARډL tq;C5 ڄ L{N78ayVԦڜĞbf(M|QxZ56h/o,16[!1B5#3X)[o =ȑRh"շY'X2ZgxM8<:*'UKzAH& Vt{Xs4*8)}Pى:6Z`@ VoD-;JssӊQ~= qP;GMa`I0p0,$@sֹo=dRPCC]Y6Q`M4k LbdCdryItl%r^|՟2"iQl~fCMEt08acY>1xetJIi۾FP} P{=Q#;yxpM"挍ZItmY $ɜ I,6 bx5Oa~/m,_.HQ8Y|}9fQM9 00%pps MedP~w/-b (8?s>eq,yyd^ :WcM#kp\)i&-ึݿ107?|:ܖkkk*98SCF,_=6`P'P R/|]5jDqE(@(qbÊ /e dSxǓC;\;lNƝca7@/a-[k݊3> Tb{Y(F LW'a/f9)B1O#J@ѣ'~X5\͈mY=jȆI FTi6^U nTG0'pȦ B\x衫w!&`p?UЅA;^X>>wr+OcLѬŻbeX?$y[cũ` i=m?X!2:n":]xy W< H$䰛 I@ܹMPj%tُW.8 LPN )-Bi Tj(f$쫼@OM([N)496 ?ޱ696jOžpIwv ,0E%Ƥ/b2tfL8O(`MCq}0Sgb :}0伱?/IsA]dC NPnUcLqideBib36`Ā$(P.W\n'\ڼ,;C/]]΍NH<wޟ^Dx̙kN3QѦAAA> q 6ef۸I #5, A|Tc |U .01?/xoEށၧPqƥ('N_ͯ߬nElll=AMoL< 3/Hq<[== *3>]KW~|Qy!$1 12[,}oCuR<6 *c[Ko1j*7x!!ĴP׏/Ǣ߻MI8jď_﷠Cw?珤qBl.toPһ'O45oc*r BD|Llwt("b2-!'7ƠK6Lh$oN4js#CyEuxk.epCǩa^K}~A{t'=G j q nԪJX9V! #IYt^es/XXPqqhLzA6 hq HM%>Z77Ԛ?/㮇NWg9t?PQ#gPJoga€pKP'8*?^aïwN=N ͑Wa2XxUkm*u5<`tJoI1~{ksٸ7;zX)tl)ֿ:_s@2|V5X!(y/ ܍W~O\I /'vLjI7bd7cǎ9to}l)L1sӚ2lDWT~UJxC(94`K ,{ c mFs>~X2;o缌?fe~/; x'h19A>ANL;?/BgO/~y3կYQT:_IށOoUwK#vba_ik !mq ;>_nBt»( _v| V::4rYPo wy/ӿW(8<8o-4n؋S%fQշ <]൩¢#Y,5`ܳOcl 杬u{krOᝬ4)2LU3>ӥ4hy2oԌ1"4'"{~*:@~ùXl9Vj#lf˘6`Osku xD ۷nUW5N,|z}g|0tl!}&>Z7rk<2}7܇ڹ i]QSSm'hwBEE%M 11؋]Rf7r9T6h u&tz&eT< i& Ac_:I&^ }́6֡7`~X2 u"F+ڝs(:Jâ h9]+٤g+ᩫEΑ(+-it|>>*Es9W7zNi Ml?~ -ao'L&ad 0\{?^G@ٜ,d}rO4)#bzC萐 [K/ ckc{;>(,|k8|;>kᶪJ`.͞'Ob7#Nġ%^h\>!0A AH`h 14D1h`؍X.cZ[!*9^DCi4ٰC4PJ]|cdEԚ,aj>W{"66F~?n,"B$(c]4y/8a)xU)hS>~-vTԼBLp5~}/3fvrof$~M2"Mc}ocoɪڗ#/O% $Dz&8L3}%I~l(.Wow`ٚIcOlY`+IL4M2&^We_b^@㒙eͿǙW0j<ј#l;#%/`ōm :h'@؂>0 ~-zF$UHkN#7OuyQҗH ! ZB}ii)- I› vEP{e_NϬkC88gtN 3`ҵ߳{sۖ#,=p|Nph! Y-3'h, -z%yE q1")Hl᱑'#3_6ۚLtFMm5j@Պ  vL@GDD4 0$8b I>oBԂo{tU,TT8b=$4Z+ga!])m!mӘ~C&===m9K4(LB܆,weE]yB"gxxz5%*FBz  -HHbRn [7Ni,*q0XtOHl9%%E ۦ.e%HK6qqXmg]ama\K+r󪕲&CRS GQQ<5 %O|i g\  % 0Z2,9,rc9i{烉GBblJmY@-|NE\r<{Ql?kRyN[Rc?ėd{/VVV/٨(:TZ Bو 3R GplKPz EZ呖 \+ѽɣ?/D:t b"oOB.JfzYMCg^ aI0.UIl7ve;'Wl+/AAm oPa&\@HAAA  $(     \    …!     \    …!     \    …!     \    …!     \    …!     \    …!     \    …!     \    …!     \    …!     \    …!     \    …!     \    …!     \ h PRR2=qv*|||iv9F]M X%c6B;<<0TrN6' C,R]+&D*e xeߴ歼O A8vrsOB"<2AƕU;suumr^ ǖ~~Pk{v,`dPZZ_vͱ9սK_dsW9A7||/uM'tϲoFƚsNn.JpM A:E !)pլWB\6Cho{y^( :V&шP (5 꿚0W*+oOd@E 6WpJ<<_?X:X(f&k?>Y=3&DNTUQklN6o6' '4 AaĒ1 <)fYtE<|ͅ`#B &h0Cz8sp0ugv:pjcY, F#ս6\d`s }B Adq2 10Xc,q066{ 癐_fQ7eJ1|V3(Np9:t=YD@E84/rޥ/dsy{9A>! hD0 d% x$iɶyGums9ټ]AD@ )lXt4Yj"5ͳ+G/o$& y%a^ߛ1mӝtMt`#]5 Tng]28*H2qkv սK[dKkb' ~6?\LAZ hs guQ7[h i2(V㏣r#h"S&Qܚ- eLs^9'J ;g_0iƺPk#7` ).gVj\,,zgAJYf s*l=QS/. EAM~8X̎[il_k7Cιr4~Of`RFE1`k9*iʣ]dHw0eSmd5!r)5-"[ks䞯@Q /:WZ4vrB9*GT&3xauϼlgT÷߮gQW;$ M7vK4LJ6+osć{g']_/F[wmn@ :yP=×.}1|5A+] f6L ASk g}bs/cY^ wMWҫ/֡`-?Gkir6wlXE͊'aֺ2ٙe-m;7Yx ? P[QbZlgfJ1vW/O˷>ࡘt D{(;sG^T8fܲ @6O C,u9Kjus2e0L37wZ_#ص~9^}x=~wk8Pђow  Ȟn/AG.i>W jpb|||B?J=J-Ł_۟Ɖ#܂0gpch)mz v*¸YctRSlQ^Dkj9mEEB&/+D{S/GF ,J%XA*uF(4>M@szK12$k5=0`,E^^:Yj- {d ާlo(a;Y=gl';={ Ubc`|),*L6tR:n|l4>Ѧ˥ '2iu2]ȳ6M WSRfנbx xUܒi$V߃y W >ҿO /%ƨoM[ ݅ c`|a؄^t岹ㅅޑH1Az ~5stL|CNaÏaS8(+ ۓbߧlɱPWrPE9AA AAԃ%X18 NrٹaSVASE/`\+{~_5߾ RGbx |,q7 <04 F Y5kU4{FBCu6Ҭű^K;^LK􆡤^aj)c;#9]`<5:_[chƹk=,H6yϼezC=q3o?6n! 60 jU2k >aJCy jI= GR=`)/t1W lxd؈ V5C$x2zeɫ++=(;.Sz={u p~uruB(y#F]7xTVlmКKA Vg23w~aَIVnX2w 65HQ,X(O/$*i ڥ.F*=6pg8UsTNʢv25D!}X%jڙ6' H$ z,څ"^aѰ>v )-s Ӱ`^?&+dNn@[?C16x1goa'q$^iD۹I5X2Mij|JN.n i^xeE26RBrb5mxřH!yd"oqVK1N?S?" ~ٷ9jG$tGߞApG9n,tΥAXt(;O!_ ՙs0tAP`74뛱Pi5`YW.dP9=4$p/I#ehZ", k e[..m:zz-iq[`[2MŚm {(r FNˢv2`g[D?s>v~lNAOd ©ò&g4lJPu >(c65HQ<δeX)¼1шTD1mV=S\ FN 1^ k:  PUYC3ҕ_CK9t:A'_Scp 8l4c.B|`و`B~,XV Z̟Yc, d`r-ҜwyDGr# ؒMHGoTRW2#k"}/ cseX 8~NF􃏲%|^^pwl*N/5ٮ+|ϒ-ʰ?/E@랩ٗ#y>uu "vD sM)KM]?Fd جy!öڗsJ6pBTQ BU]Og8gl8c>@ oCڐK@f11qaۆڥ&om>&$Y>ןæſ"=z΃&Egvey_ y{:Y{/T6' 'HA85GBVݧ݆łÉ-:E' ?l,nc+zX1W⥕o}f"JZW3U0<<"ߖnoJ_eZyVH C|?G4w=?ynyZXwEdT"<] x V4f?>ͱB#n"%BY]]h?o#s1[@v&EZVׄ })L7_ݜwῶ*%Z0Xr{OAש+ǹ#9P"O^Q?m_P3$pLb}?Phc1(\  Ex/)BWl 'vp`QcJ1栥-qyWmCRXUa됧I¨XTՍ%# `<͍OXh׭,ko|63d|OO{.NK;c2-.ͱ i42}? AlsX<+ŵP1۟_ 3ʲ(޹ B"18uưpD 6. _ho-M[ oohlm ~{m^oi\d yAY~lZg|0[❔EY݌vY[w>#yxa)spX~lX6' H$ ɢ3Q_=qK +\RV鉀DtmCt" ix}㭥5{ b@~#?˕ O`Un뀤PO }ߎo=S3.isĢeiUb6z^C{_:Nz~o.A>3!#g#k׈-,+y`tCe~xs;-aȘ^n`9Lyt⒊jٜC*޼Eˆ)UZhjN LT!AN@^u.}_463ߑL`a0D@@ ]r? /&1 j( Ya&,0/run5a1"H X` `!wq\l_Ke$NbNB %B /@%@ (yB)8q۱lIlKۦ|vwVZIBZ9N9sΝss=$jL,U,*ڂv>c3S}Nj.}Jk&9rϵrUUTh]x+mA+ Bu'O`]8<=krSK_ŗģ;~ÀS*q}y(!|]0U]13r_+nJǟ4X )(~7XaTb'h SgW/ #{pQ< Hɬ{!N/ss ixb1@TX|ɂI_CɃ1W_z׽}y!]Ԇtq` lprAԖa2mЙeFL2S7n38sQgY&IyW ϫ5ޮlCe AiN76_H$&Oa6C|$/'_>d5/L >Vl~c6ЕIʠ|'gDTN7ciU_vVJ Q/:½/O8_hTA0 +%fSeWhɿ}ymȄMn@?bAm;()+(wZre?Lו75"|M `|$oO^Y}6> 8+g[Σ񹨕E:ve{~ZmY w702LqZYC²{XLW랉6Lsy 50䦿̩|'H.zm3m\ׇ\t{@'7S3>'gf*ֽϧ{.{ z,fB,( A ϤPnY]v3EF'|S5w8OyMiXpkNv~tyL.F'u<2˭De(V,g d3F8Wam"ggyO)3gr^~:}Ny'}(^1?7$ ڤm_d"M/Y]י閙隍t?qqS~ExH9ȄN2r"lS4"{CHuĺdzI$_?[ηbl}}$癘ӕ΅WzM 8! ^fT6e"b:l7* B?)=DzA b`MjDD'x]H{qELΈEr9σz| 8! -]0tI 3wg`ƍNTPSNSƛ2cDkJbtm;610&# Fd?UfEE1:í?#nt\ <.*S9' .RH$ Eiph6-F@>g=1l'5Lg߀ofYhg`mt k e ]֩ >LlXAyJ$)YqI3*cѵPy}.~7s*s @ bZrrQwoܤL"HP[#eOIcb?1 39"yA^AQr:!SN؄25o/Eu3ƺȍwɌp&'ӵ9|~1 H8#Ycf&9FL}{Y +*!99UttV1 B z.]CevM^q3ٰ9] hzL,ws))s((,tž bf&BXT@(tcΞ9 EpHXm6LFYD`O!"󹜡䔴t흏rN>'/~ ;0,"   P  TQAAAAA,bH$    E AAAA!     1$AAAA"@    XĐHAAAA    bC AAAAA,b b#"8! ‚aX& F}.8<.9>Vdj'".P.z| k ) $sTBhK t/Y6^fe񿆇w b!ߧ|^<8eY^p"Ju/R Z闝{z18ا)m"Ȯ ϮP^(u271gfͣ{yjX{ Z-Ŋ4b%TEUI$E5>!8Fx,aDܰUi ccx^Z']y4lR-F/- +yJh4v{\DCv]d±k1ԫJLMpXB AP` bA|RC|L 䝰Z ?_OnE$g`5H?|: 6TDF(AHTdEv- Kz! k ɐHA"Gh4NG1( $_!ba6o03jD=L(Ev] ."vu2A&_a !vĉsG"Y N<׏^zS.nD!A- 11m$-+ЖYFqʢ̈́".kaEĮN&k $1xfH$*prou&j\3GjiƈÇp8p! LZ&2/,(>0ڈcn.F#ʘb.hcB.Zv 7 u&b`dh~tqxmH]gOzU?֎,d%IBGKc;u2cIC~Q !ߏ)*#11qB(ŵ؇a0CH o]L0S"$m25c+ &.5GR_ zf%! ՅN.7Ì0HLGEU2XՉ/)(Xfe Xم׽(z#֤MԨ ׽1`{Sq8jK%7^,^_plRJb͸Xsol77{1vg: *݀uYf*s\  b^߉wֿW2e&lױ<aCr^6Z1<=!C')) 7\=eL0A *A 6 yRc.4ī]z ,x%}͙]}N! S0l4BSxƤXr%x_#h:q_ucοJa]&΅.h`q1K/'*ċiǛqdx=.5dleBV2d6ȭ|yq 带Xy{^1vP^|jXx;jڎwjzz?̛N"߂>!Pw O9y³X{ՍxiLt45 _9av2IqmEԴ )5C:۔>J@トķ}7cts[ mds4S?<6{qdǣxzI H(Zۊ}r.o7O5cxt3 fc[b^'{Q⹶t=X>]5RU$v\>PϒAHL ~%u/^ƛ}X ?Cr o,>k7N܋dB !Ok+ v [Ͼ RL'>]Ɍ( e%{jN}7-!+AYnC?C/2m@'؃b)ZW[//݅#=G~bDփ k$>2=qfTDрӣ>74-I }hj86}?y37h(?#>w(ZNb foE0{zp╧^41^&"4B],&_T:٨_h^X^e0Jg' jb5Q?'2R. gύfx=@ns̩ڥ/ {M=!?Ta&%MXɳ="`XX='1 q5w jO{f-,GcAm9,V.s,7$H#y< ^˄y ~p+l@x<'q96-Pvl-)E6żN{\_l};]{NAHY |=_&@ =;p^X$=Ww`JV86^=[O\:q8N72! avTUT@ u2K T85jh4PL\$,kUXYeij<ıx;J߲ Zu[v|֬ T/mDer/c6qXlU(mbZ3mPj,aZqޅ͕pï#j^G{p>+5+J`-Ϭq"-)0i:N,XR@ f;,#"{j0jƊ4/TDY"Kp`"19 4pF. |><`WMc"7W!Orb/D0p%Zl\ZuW`M3 hX!Jv)&7O^M8MƚIA ,O_6_0a2ƎbxTGLr,|9 ߚ|ԝlE7~Pjt\u4{\<<ݹinQ4ϟ<#jN{>c AQ|<|CD{4XٳgQQ,@DlP [i%XwJEB@Jvgf=viy"AT[YHnё˷W#玭]> +p={gO捗 ^q V]1!ܠ]TM-XZxoԞŲˬh<328H۰kZuW +Od#ؚj0܄fbmV#3UxlQwXC?p 'w`_M6%e%>#Zi".W"6,m Mex0e:[W̦ddcmTXWg3.WTSYN^C4%!# crtُ6]-F= E*|Y\rRIc]~8HL Nl@AD/aBꍘGk&y_RPͅv0L&tպW<6"=;Ʀqd)0:A-^1`! &Ρa~^~(n_qYE(0ĉpeya+CL-Ȩچ6cßw©QڄV2Tcw6d9” f:>Rz̳ HL%و'o 냗P_4KP[?s~!2h>2ZOq2 ץ'"ޅWHY嬨|vS@΍8am0sn> 3zyX &Ff3ّ 7co͓\j-|%m[h`Btv l:-h>W3(&pϞ윉]vB ls.x99#]\ )Wx0.O &%M"N!yz18#.IǯyO!qI]clW;ع!lD xi!ߜ٥ٞ|^/7[pϘ~PFa|.ь1^d2lZ|_Wgu{*x7=" FX5A A=áRte% SCS{pxx=p ۟?"Fw:u3q3/u+"rS`pu p+3)īۋ䍹p=&6, ybVaSY&V簹 n ۬W2!X[# 9~khvf㺏|4;3cSx>d]uk"񜘉Ժuǯ[~axX"O/F3peeﮦq;PZ&;<إG_R3 R9øU9Ve2%lV3,Ze9e 9bAKDWx "Q8x]m_R~05 w*n'?oxqyؑdpoH0z1=ўDyVS~Mmp v1N_;W㷿sڊՅ)hlu@c}-86헕_"5A$A(3{&H[ŏ?=qe|%1<#c$gc];)epC8܋x{!iEp'CԦa n?2}Ovsf$=N>_?'r-+n)2 W|zaEHmf`xi7 }6?&rl/hò~_O~WQcKF۰2י~W1GQo {2l;qRKd g=R#`ՑiZ!]rXf ; ۍM6fB׋JproALʬ,F(P g 5G"|N7 .[ 3vRCg-HÙ#8 FX I Π;sIrtm`LŪ++Paʅ<%3x&؜)veFcc3Y!)?>ט8{Fy11_z_&pbGΙ}|MƄ?mo};򀅁%9YB;z{Z0,0;ґӬv{ 7PY./{] 68S3Q|޳.6 o?tŧ"xʍضJòM C3@/jL˨D<M$h5^y5>dn+ X3<(*b $*)LgC.S#8NCtbH K] _w^K+'N4.Ϗ7>_y ]LA,&H$ F2FM,1i5avcfe{i 5ѿnp4n}]duaEĮN&k $AM=n(sD> =8ޫ13ڸcD"uNlDho$[Q`$Ev] ®Q^u27 b X7*h9Ḉ^& ##wn8N2JB2&W%k"9"\>C"ȮbbW/:}|- b*( XаR8..CRl)gߋw|h=3+(B& AA0L LHuI !ݔ&3NÙ]dٵpZ4P'/<}  X\f&E=▃ځ~xcմUov5@D0f+8''AqobPKA(֔flo_}2Zc9oAXT"L/ĬR%9@_.͌Fcc7>;fG127aɨg1S1 Ku3x>O #Ydk0 #b _}}A.npT Le ق`ܶXk}!& 7<=&9@HS‡ EMP C=~& =3du\)o?4EJ(zzv#jl6d`4rjBoc=+Qcx10(E~I>Qwl^ 6Z⌋|^|5g,nqRZ6 oPP 0J/z`~}L ! <¤>gC p.EyYm6i]e9G.(m)%52Au`%wofCaIUFQކx()]2oHw '58)@78!toD0s&M9|tE(L5KEl!Z. !֝!9 *lHoÁ琰j+*|96у&t$3~&3H q>KH)3w "E\i'r +gjAFWΕ}n!Ce1Ы]ָZ)6"xyrAc87,E蛧 :R 9n7?y> ?4-{5R (X~I:oa4iKzm"Xm=ȩ 3PX׽ؐmYX'%r;Ăկ|xJ?G+FDpV„If.F/i;jWP&P3UddOnYֈN\q'~67@Rr26))6/vuCKt2q5L{/F"lUV!+#8Ћq/e(I%PE | /6 k N=ё~9.-ce*SS6ܾ) zFlӤKkl-1, UT ?ӵhjž֧w={cHHk-t`%e*,]ci8!l-@08ևpg"ś-ذm%|n-wϼo81qi˷`Y;7poY$VnÆvz7^ g}pq =u`M o?]fToP2f=m 7jp9pSOM{2$ўSr{kBF)Jhqblï5m͟yC 8Ljsv7ctx[Vʹ0^-{xTX'o>;R4]8Wq&e<{{0Vr3sLq v9{º siii>1Q`eo?X^~GI|/4lŇG1FDO' @  |#qq[ն\xݍAc9ۃ$o#eY{'[08ڐZl3I tԽ18Xst*'0J`KڝshN]}!Ƨ^o]h{ Nal\nXaKA5(Md+5>5c@j(d+*$?KᩏEڏɶ c9ly5R\=ogcOMFa#zY:lH@V\8amLT7󱓏OƯGHm+9ڂ e=}>p)I}wP3m#!1I_Y9l3 k8 G}AIe(<'?Bˍq=7Ew1UH TS QP'y R@_+ @Ni35l[7Q@W5fd/YxfpSu7Gpd7lKbcw&+Zl;~)VT'\?[|a}kDvgrd)EЋQ切 l$b qN`,(a&ɻŚR2!㿔"R*w>Wc pKׅ!?5X$THecIIpuk"mWD.DS!2btEO㉠S+\|`H}Ӊs589+xOzc~"0aǞmbX *Iϋx}hה_L|R$[xS^E[+} }T]zLڶ˖ߖq=;(C8^["2`GFוNt|1tJ׾mwXdփC? ~p]nE>ޟ2~y)cQ?3|2x_Cg+# xoǻ*;q,ſӧ?] Ȅlzp-MxjT}XxCx_`\z@Ryזk2:~|Cފ/SS֭"ف[\0@t}cL'K6\UQeQ%/+Cku\'6.Z78G@[(uH3Ml{q/{gv?ƍ5~_Y{/߻qWuS 7B*ف=SF;*V.yo N ܂F\k'7"yӬ#vrofOYmRd@:F?e;U/aBߩE`6"^\/^^%I}pM9Tގנ?7uKq[g1qK1e *aޣ^s]s S@] @XQhS?ӯ03ݰnEQBn4@ae2(5fOs!JlpTϴ;ͼdgr2S䆳nAi72nCUUi &YjܻNjdkOHPrr9iVKFm;ϡ}HstTˮ%qK6<6Y1:ӑڗ|um(ېVڶ!>ٚ;qgNFx7:mJ}>51 ?'MޚnENjgKk<HC_uM0t7PEՆIKfdNB_O/RRϽ==p]И" LO`I.IJːaWC|3~xy,+<@0pDa򬛲 4E`/Ґʠ |n.0؅^!KF)y.CHO)dS$% t "d)F2㔲 a ,<uW0S\: 2Nx[;8%[77 ޷tdDMG'<0#Qf".})F7=%#Sќt3Ra$p @Џ>iiqqm3^x0?MK2X^"u|827ŹBzCE(?貭33:A|`!\۶],:<6 >um`oYE[g9}#=9V-+ßȩº| PP+x^NG^EWj^΂kAe0O1a~[?H&7"V}c ~* 11a28.i#jo8+x܆2ؖRp 9,ܹ$~1|>ge]eX\>e.{3oϯ S%t>Y= B/1$F</o,b6'};_=nSy˓EwUXg]E2'֪4 a` 8)]swU$D?VS2 @X_p_5 P~9|gP.IilMFq0P I"'MYFekELHhJ/eڑ I돽G0 'MkGl_xH~ pv9AXv:28öM'a@V]GK zohC ,LQw27f;TfWGa J`.b&G'`ղ)ξ r8xWv+))0 MY ˳`xzN:-yVd%INa`v;΂UI0ch9rQ)Y@M:!T""4"No 3(8$;! "W!} gQ+.8S -(ٷӆ_>F̙n߳[TH)cCJz<[:1&]۽.˃m=cBFmX FF>gp:٧sYQjTV?ok?қF`mteұ<OiDo=J^tED;y)[~k\Os;Ivi;18oCUG nX} E׀/Β˷6ɝ˳a&gHԿ;_Ȏ86[Q[K1[oc+`?{"\S#yp0Aܞv;cVT:L9RCՉhױU= Q ?~Ҷ^=+?SF)y[W_ũ|F1#Z̫_6+q*,} 5W7`he?wub\u,;%*Soo5)YkSa0܋G!CĈp6ۯYVԞ&3#J6 9=-jb+XPzBV30V7$k))) 2 0-jyWcdMòUV 5`MԐz0<&PԠQL)1* dLz`y$VCZ.2٣hmi[@Ԉts3$θ?D c`Z=~Xg"3hu,q-kfg.nEv.ojHJ8 8`5"|dݣR2 f#v}Oیe)GuNX32hhE{} Y'ژAX3:e$:L%`:2s;~CӢm@{ MXr{QvɵzUM Oήc ('0x&ʍ0gtf*Pcm]+a3?xǖ*h%#,9x\~s ch//(%Zؒ-T v:۫n"J2~Ҏ7q -G?حg?T'Ӂ3ԖWpp`ީA_T'"9h;QP~?Ubu\A Ā)D@yو'7ğ>w+rxd18a@ero!2 @%܆56qoh&"dٕdDʢ6ԏAH V L,zBjͳ7Se ZƩ3X ֑Dc#:;Q-Ä,#XFY/Wi%JF ]k'5 yA<|v8hh@w(9"ض.e}RøCbr7j|Kg%r6W7YYa|߈lf68{My7qpu4prfҷ$ٱm7XVN(ۺr;('65ǖdΔΩl5 PF\pHeKˀgx/Knj)KFb t|7 !d !ABB3#K*WK o~u'd_'`.(D& }Q)cc -y l;#sڍ0+iMہW)YF 1K v}y0a0ɜ2aN_vi>RTLVd8ؠ&-c_5z kV#C7 &0v)DZ&/iE[m3C`hZ$z X *aSWxmo?n:>^?x0Ү#`$75Dbf+DV&g\Bzeb[qI܃x}O-!o:d1.2pQ H$X@78۽ W(@z@(R`1F$ID bXQAQw~\[濳{wȕu57;o,Z6a庂w{*?uRգsoB_zCJ W|;4SE .5#M5B-1{}@ބvJkV+%Z٨MM:*)ڣokCV:]=2.ioDM,PAiB>$6\OS;W%16o7{gFrά(5i(Of'8zӊϗ+p"]}d{[MS=%I*=fJf*,('>-yWѦNaWں~RSiCܨͻWi&sTdx5]]m5G7 Su[WivBiWTt%;/[v臨6h/|u jѣҒLm.vm7r{jX'wc~^J RFFmܲDߕn΃z+=!wiI:2 ޤӡ7doVM,mەUP\oCZF27/Ӷ"SQ) d|je&uUE:uA5}=~Rv-$eڮ䔨UZLF3:UiIm]g/ծDʴַESg\UsbuQ-kζI/v/|]oi WW<حJ @#U;4o;>FL6]*cVN@Yg.е7Imbush@fo +~lޜ=ڸ1Qvw |5 iANK;kDr@f+n_a{ZQ+c}B% m&,,0QiTu0,RPsre#ԡ;]B.{gUt3 IQRyZ<fEWwo̐u<݉(ZtE{m;仵QܰzZ%79co*;[h k|DMM^V~-sF}B j i'W됕oծ׆aaV P@`͟a1%ڿkMỨrke*:RVՎ]jɩ݇iTڼ\_+];BfF9~yvf2-Zk]@*uHw m#^5¹N,՗M6j~nQajo+GJ6@Z9.)EjeJآmfMOStMyZZ8_#Ai}[}cQ;J-:_*PBrk CM"Y/˺/~zIY˫f)6.VS4DGQp{PC1ZNQ^#IGOQaTZ4kOnγU)4dl/}ֽ5}7h#0W@JUocX4Ӭ,\3F۳,ֽutAp3M2:%_N8<!NQ>>Q䫰~3QVqn%i=Pt˞ګyi]\}{OliSBCF6=rϮ]ܕʡr;5mYzw;movT,))';OlvB}ujs5xKW<鲫q]\_J&y7Zx+.\uD|.ߋ4:?\pnuW}wӔ[/k$h%WjSi̥ĶT 5$4xLu|>"q LQwՂO_җEcմyz$[yIJs}MYMcMvǹ:{Qw5oΣV|d;Lϯs_Ԍ }VJo~5o֧OҰֶ('W浰GT־3Kog*UOq.M%oo߾My\s:wTQ7wG ɶ4+ztrcZc/rtXeQ^o4bLٺFEj[O.ť__ 5j?Zzi~z]Wڏ=u]c_FkҀcx fOs +.A} z,l4;hڴ?R:th?c&9cTKE)a=rnxbuUs?-^֞}*jg/iA9xJWhӨ;P96]P3@@ [)d@2FFcH~5v5`bY/|/o⇿:2\u VF٠LX?p|fATq]"9b P,Sfn1jGuQe%gFyٍ=U?Վ ۷םmY93zf:=X\0:f'P6s;WsvGeQ)jcX}:8b0Fy6[ U ]EiV<{#p[0ʓáOB^7U =V (u,G(o20N_2l;I>J3qߌzlPx eѤxT?`P*JeݦC(pM$<h3}n-| BO~ u3/o]|`9Ћ2dJVo_3 Ԫ`_^Ԇ\)>գDaT9 R 'jUؘتdR1ijYPSZ- ?=S ~+ Q y]3,,# vjQbbߧv:Lj+?Y1̭<g%}*E+8+V˫-QvئĔjr`tho/pwk@(QzTdTE*55MNgLi\O.A9G2>@ @ x LxB KK3:kfb 2D)))[ AP P,Vkc fka x`}v[ldR (OGKe @ ea~ˍPy@Y}PYy*5m}4tMZ1cz_C. ןN֛/N mn:#Q%HboEk`V#cο`:Ky㳿߯TN~J<㓕ڱNPSށ|ϯ樖ʐ*N[ ;0tP@V2 vrk2ߴk~yv+٪Y骗52O)ghzv*X^]Y>iЦ2؟I\#4 k񞒐-k\4}XbIw޳G(ڼfv.Zyǫ.QKKP>Z+ӈQKoҕ?jtse 1b zG0"$?SYnY f| "yR 4)7 fxU==>ݼTaae} 1 6̣vA?֔6赗ԭffX^}xJ2tE}*-ǫ9'r*{mI{zL-foVIԦA,zK.|b{F:KWEv @bx`Bq^y,)uTI>nKՈG8FE\1]uݏjm:Pwhq^N~=_D%G~覛4[r%zhz{ICCnۆEK@,!+E*]gz.VKz'ۻGwTQQ+fSl|:t쬖0@$ cla&]={V՞X[Vǽsl'[Kn~O>3X !R[Ra>]m]*X۟XbIw$߂H_mm 4xoOKBRYܾ2yUh "-r5k @Sbɾ`_`+@+|3:ZBN&\ @@,@/߿WtڭO) FϽ>?1a%KCϓsNH.Hh\_@Cx|JoWQQy`Zd4VV?SxeZ64bZD @5柿/’5P}PUA UlhQc̿i *+pٓi-֑s?R=8*/\kMVOٕ*&bB1/ƷU.0Ol~Uz`fwӎp;-P]4/ϫu$_xhkO酏h_q^3ET ^/"G4P3饽„]0RZP@%3߲$ = rIH PɁ]1fɻ_NrK ?9V QSq# ^{K6?Qܥe3NdxyX}5;,P]<ߥE<?[Kxukw7_NVW̏u< ^/"]]UBZ- :r+WUq~d_LebgB_=:C/~SQٹ=U<;4xeܠn*}rUDsXWTѢ^Slcy~UءpUoOg_׊`^՚U;d;P'V~f*%`0(UB4Jϛp5DW;*ٚyɔ'ȽuKEg ydoR^^V@xWZMt^fG=I[rԽoT=6oɖf/x{\ evkՁ~ny]>g~[o,tђnu4P)' lT0O!Jg PuٸJT}3!dVS!IH!92C3e5Iy~]/@NodJfS9Yr0[@ ^D0G?C˖jըӽBٯWYGԜזWv/ItF~@Z?#4i"c} Oq~]/CMH< D 9v*e~d.A\0J/M/Jk}ڢ [`@?+OrKe@ @7G|D !!:*EF)o^vzy~d%)Wٹ!mi\Y*0xyċN55F\l}LTڔ|:+ -r\hd!m;t@W+[ڢ:rXql : geO..`_ @ OD̵.Eq8a~N ,E1 H H H,"B.~W_~HS M~9 ;׌?V%Os+7S^~B~J{nйwqb K 7u&w9N %vD̬yǴU1"=􏟨-PߺW*ui}MI5xN}⽺8[e[޸__ߦ|Zm}Q'2_u<b k#ꁇ6}4PE:̙3~7YuPѽ.Е?Y=Ӑ^kvy(ȿdׁOe1 PNkoMQ7NӇ__;J5okVO KgڟMݺM%ҧR+oiefA #];wOڦyj< ^42%z睊z*akV1]PH H˯Ѥ^*jS<ò1޴)֬ޢ5wFmΎS~]۫hӦ,yjoK%%/u-&iCy9ʳTuXySg齃+}k/U5A SsаuMzj˦#.ИawGoNrĐ}&aXB,~u/zdu sPZjSMzWK./I|!^4Ǟ QvYhXfh^zAh@ެz{MEjgn 11|U|'ygXB,~VҠƪbA 0Ӓ ~vD.^Rݩ-Yu<b ݳL&FQU]5./#C)'z+49uNS2@}gJȗ)J?c~?^ܕ1sIdW\}~jIFܯ-h;+XB,"UwRӢ9_mZ51T*}B/אֶڏċ)ڞQNlmc';KVӣ*(c+"4oJg}>+WVF:Ω-XDD T+ojUuow/ջJyn9kƕ^xXK@c>|.FD>𫈠3=dގtJJws:̂kZٚst'ct7?7ٔiIdpLnYTCor& uD;WPYŏ>NG1#PHޭ_w^mW5u:@ @P7NJhP D0@#D0\.W!^Q@ @ " @ " @ " @ EQ@lwj6PmvԔiSђò1)5O3/|\wOQъמ Ѿ88I?fz%'6XB, G4P3饽„]0RZPF +]@C(ܢ/>^9|gƒzd{K4]ZʃHՍP omy"U@,! Ǯ*xVnv sRB+תy? hGzKa@CxiuG5G>SM Su`cznEκZ Or۵Q~M))ryj_Um/X/Fti tݫ,ӧϾ5vwz;(7N4ťEAwVsjeՋ"G_>͎{`ĩ{tA=6oɖf/X/vkn\:ϭ5oLӸo65Zҭ*@ 4vاR_5ǝO`:^Ǜ5UrӐLVrlk Kr1:lvZ:+ڜ{5}AymJ}e2-?Agt@#4^zWc^ֻ[;I KIА3Ikiqo^GtTүƞP)hH~:]f=T{`NLVrrەCIaXB, Ԕjh;j닥9*p5)uVz#ZbfP̬mZ+Wecߚ*ܱTy$#Vsj7uM,Ԇ5;ʟVq6[괮I0ߨ K59V2͇4-CSUu#yO6ά5gAd&?&)^NF\8K](k@g1I5v:{Bg-x)j5MSn՚o~x\2nU).X/8i:wB =ך?"60%L'=܉5k9\):SWSnm%Oւ8=b~x5Ϸf:<b @ ^̩3j~te\ĎBtxJuOҔP +PCX?Ր2Y oGdS~~pnA鬿OUuo~o)7'K=zӒz+dFfLsLiD0@#D0@#D0@2#tI H H H (kǿɔ%zԁ|Q}l_>'YFp7S^~B~J{nйwqb K? Tƌnzi﫺0w̹T}/ԭ\u hHfV=w&S^hL;ŋ۟Lonz~~_|~yjEeƇ:`|K%x㱫뀾J(^!2=0!CܿT}eʵ*nOڑGp0#7;ն?Ӛ,FA#l|zV5pn9_.lFJP|б:-1Ij6Y1w`n]%jOH+^Rݩ-Yu<b @ ^&Q=jtZfehJ'jdSzXsT@fc"[^sZ?]ZSܯ-h;+XB, 4`; kD~r&ГS}HL 04w87M?̿g%jq~sʨy5isj@,! N^Μ:QO=MWbN+tIW$M9AQ51;#0Y!vL)(:8/ t20.ysձsulǛlRF$d@ =!5869D: H H ( 54HJttti4phD0@#D0@#D0@#D(h}pn~nܕȞj:AE:x)+SہkW_K%xHuvifj1%_tկh}ctvCIu@0UTPTfS:ϭo?=ޤ;~9Y^у3?A KšNfk?Nעѵ$zA @AxUXP w1و6)et*~\}mw;.db  ^/Ptl}x]VR(@ ɓi*9USn);?I[rԽokWyK̓|gb @ ^E㧭8MI% PoH SVGY sݿU7[=>7'P V*iHv&+9TNV'~wb  ^/pgޫy=5\ &|u]-7\IirY靝̓]z>b  ^/pj{ЇK4tT@=SmuZ~ɺ45=J{o̢B71YIUvnmW %&'kzTDK%xSn>TWKխoG&<P@Up**ڕ;sve*@]єOnX kvxxjmri]z LM|PK%x`oֿ:J>kWiƸlo`w_8OٱM$ƫ~n\~qv;צ[5}[e|b @ ^xյ?׳/#&뱍.ciCX?2Y oG(ֳd{zϵۃ)(IKu3R]tn] b @ ^*FZ$MN_=[g}Һ{>znSzUڕc(y8E| NSԽϮRq-fQlu3gn:؏3i+S//3>6Iu+%xcRBfg>Ltß994m|A=;EkP?JlbG@GK 6,WB{s| smU =ñG?m:NWvԒ]zaOu?j'Ph43{ޘ\JPZ9Ez}Plʓ"_YnEV@QݦҬ+~ߨqѯm_iS<8} vpoNrĐLVJSYr|/  TxJmt[dOq>aZ;cc ^/Pm}6g\_K3Tu-}5!.4秚v^Yɗ4~銥"sH_@GzNڱ=ué6mO|jPw J\CZd~GnyDߡ^_8)]LB#Sٟtvo8@xدXA, XeX C|L;FmpS,@3LFUJx;B&oN%% E^xA-٪CE%uq~Rtj%OѧU⯽.~n?IrhuOrYp3qo7nO=J-Wsu/P=S hX/$D-˼h=wz15iB.}A~R")!qZ"F9=?_-|^T1tSA(.R)QC3{{D7_Udhs4`oW 0Z |}ݻV2?m=c7e~YF vgM` .^3Z,Z*ۧ²#^ ڻcbnŒøm@` XA, ԅm~)R~2gL}.s˳4V4&̬z箛u鎧}U?)_u xG͓K+9>b ^/If{<~dhCml~V[8ETDYl^P?zP=hQ_-_S b @ ^St1 T)c}Z4:Ǒ}b-^!Yi)-D&V=/MNu-˲f*P^-6).Q!ρ/q+%x_l_?7իݤ_2 Vi/ X8^ YR;m&WftmpӜEh[T^:wjvTzΧf%.b ^/n6^R߽qUt3yg/qph9aRN"ׄس隷xV^_Ni'kP#,viܟˏ7p hQX/ZUZ${>hX/C Ҍg7(yK܍+/lU!dQ$~jJ>P*JWW*4^r*3mEm1SI1 k^׸xA@mhiȷT_e2 . ·29ޡ.1LEE Zʓaa W-y 3Pj 6'=ik*o3ǧ'iҤi5q/*kP9M&O\9=S}$[ܥqZmǟƱ 0յ6t < QH2-UN+. | c[h޽2 _qQc(zw.wJtYҏZr^)xY9ݳ5\a\Q\bS QiQ~W>Q/|BVك[ }qm_@@*cmXA, wAm1^IM_־Dڲyvgg)6"#Rymr*|bbKP@5zǁ)*VfU6lSE>;g(]" )1tZbƝ00_rOZn} W]-n]l@`ױ6t T/MDmdRZNܥ{0}*';Kyy2-j۶Z&%W.0zǁjzbj}(֬)ymhUф:#%"Nzԁuc5 _yW\Rx%t|| SnC b @ ^gB2t%?~"dhH1ڡp<*_2Yz7siS }k66m7W԰bHF|^~m48휮'H[=^#Ky}ЃInC b @ ^Ga 1:$WZG}n՞Q E4Ϸ0M|q<=QE|DQ`۬oRS[?[{nTY,]G_fWn˼\/2Y|3s> @ձ6t |OI9L X@97$5LVS!qjhƗSNz :anUЯ6ڊ$u/K=3$/qul +%xhJ}֏3Q;{ I1g -&ܺHmb(+s*LQsr 0T~vX:iT[(gSqێjcҁ+5*xNjmQ^|料a;_֫W]Q[U&?mc ^/P gV /̳kٴi^}ԱcGpC8L-4uJ_K[ mKC.<%z6 6eg= we??j+B4Z=tJ9zu+}E~)}U_o@Lb>@6~ jDOI;/ԧ)g[*m $3o+6&F?~ݓ];dIG*ycbIm"|G) ӦMz"T1|8 @  @ OKޘ%{lS}>Z8԰XEkg~ܮ<2Vɠ5: XqP{/;JXkO˴nOi$d~v9D_F׏9[+e:F<-Ol9iZ$x-u@B͙8^o<3煻uVm2^xA[/|J=F 4KT^fr}g=Sd_џOJOM\~xz1Jx~/#om=hF>(_v6T \uTyչ\|nF.>Sbk[],Lغ_eձsiӾA]ۉQSK3fj΢_eO*QJLIWFkH(%o<7ثRGXRyРdk@1p| >p)s+L%WG+9D15{qH^Rz3ǟꬃhٕMzu qiS)4V^O X=u æbG꾱f+Q^:-\&^{x|Yk_GǨ9;P_\ڵH}=onI7Lkui'Ɓ43;AϹH7P\ܠ̒Z~hmp^pKuh͘*нόWϰ*cX"xv]Pw,egsupO {~1E[&ťѹcԈ.+a_tT5BՋzßBd8sG :Z:_ve+T)J-hhFZvY+?Y˵=ߦ:{5*jOJC,]}OzߊZ>c2s0@#ƍӹiAmt6+%6IܭNO kK߮tqgמh];*pmWێg<|ndNV뀩R;WZzG/[^}oWw <4:˲w5}0L-:Zl:  Y;wTճ[oOнӂ_~ރCOe.SϟOb2i={'PHHr˲e^ܸ^=jjNʴוFMQ]9ߡ5eZe), Zۮ^P7ٻvCzg8HGUOA6~cҩWAcJ;W?|HY5[4_dbhqg^xI`YzW4sA E\FmF:ZGMה sZvkǓ4iMFݨӢUWCEXjfڧ4eT%?{jj;t]B~y~Z>sz홭^Q>ey\l6lYIޯ9b^Y6Z'Z|vZChbVY~+껷ooR=h9$e^\~?A>8XѦڵڶ]UbQJz|Lm> ~Q̎rvLNj+{Ϩy!@8~o -VZkIR.xe+˕lX T̝'wXu}巭bfm-L95'RHEl۴D{Gp1*L5RMy>m9l3 jcwkӶo֦fjL#1׳u룷C.Q9ZxTWٍN?2ph:m۵ӖA7lzW/4);+mNٲWuu}L!NFg'~sO?~|Y]r糨YtWhPITn]^aqI.^_hiXjHAۉQ&6uznYhmi=oWVaSiQ>kaR}sWu5;ND?]msE9ǃSHѺwloE+:>QaǥcZIx[?GkۈͶ6Sf~P_ԓShm~^@oNHRK]PN%/(QX|hE4WN]ZpbZ]ٳm/uد!F-9!p [%Yк5{dOOJDvkͺ\YS۫7GEҁ7Qcv]t9v̈PrCneц yMUKKmy,R6rdKo]ylZb SRsuu!:iC8wKScVjo`^v^Xۣ _]9z+ۑ_>}kvVN) w0EEc:4G%)=<]uxc^dj.RtíYzizΚpQTk>fϭZoZ?=tʀX-aY%{E@!KEc{Gqc˹DM @4Eޒuo Јɚ8z=2PjƎ6,9(ا~:Epr[E[rSr1(6_hUv+mqG4K3ZNҮ-t}+o^N5쬙zjd:==^=*kyS1tYꙌ9Q!{(IIa95o^Opc*U;ۥE6j9M#ڹ5n-Xf%٫E*o?ZZ%]YZxb} "گ~?RC?訷.]nPˍ&?8::I]/Mգ9pieNO,жm 6*UkŇiui'H3Nyqmlo\a"mQrx6״ZnBlU/S?/4. k.xmد! @ Ϊ]aSާ/B)6.J]Աz )Z^5~'([D\[?3դ9d WT\+ulU3%w^ZS^tTc )/CCw.V7lW66^%f>ze2&k=o2$B=~t8JPxckiM)T%J-:Ӹ]u+C1dSήlQ-U'))$&I^/?_mݺ{w.ՒqpU"9|Asy{ ^u:=7}:ŎV]4DsG;>uNeѹЌ)w=<|6m-SqT=ҵ`h#OhLvPQvRY 'GiLwԣJdD(.zOW3g>+YmE1çz("&QmNU^s9SU;o~ {IDb2`UW.*mVeW=-=!>=SOxXgƦcV=Mw?ip‹k6Pꘜ+~plJLL,s`OޮWє2diV:? 8FDFovs?oC.  @4``6[-Ji\0ek>_@Pc0BW SG\VOւU ظfuxsr[3vb0=܇nl^{CP BW/@מnBj7<֬ &yz=?ˣsrG矷T'9 .urpWsW395:/hs;O#\'O|o H) Ln DM!]{$Mna  Xt` hD0L8P.iaH@ßIG65 iDP!`?885<^>4Ӱ_:n:'#DSs.-+GM @[R[wM=}5I{D!rtMyJoO @>^5ÿZ,~$=ޞNJ${!?h:_o DL^ &?$ po'<h*S8qWk;8DS;~あ{:C3q`&s4$ DP1 rxHA HA HA HA HA HA`@cv6IENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-profile-information-thumb.png0000644000076500000000000003333713242301265030614 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<6IDATx}I$uދתfϐr\D&efX ABۺͰ6O2#E@:P AԀgHz8"g8KwOWVeE##2Yhhh Fc4F 21bhd4Fc 1#1hƈAFc4F 21#1hQޢoۣ#_WwwO<|ͯHb! _u~X,: ԸG><9;F6bAͯe~o&q,60_4îsļ\9wϗ\WwDxA=sXOFɇ:&SPr]42-kzk.?'={{ kzqxa}7 NҴ ={7<{6n_VIdijr 1&&ik+OzX'nQR/lXVۦD"R:;NNAۥ2jv +DxMZ 7.Dsb\.GV GbT.qL\"nGqJ%"M\3|>Mk(1Sa~jb|/ѰEMXؤ<3E j}Vksf2zZv*m=1/7Kj^+EoD„Q CQڬlj;|JB!ˤg]g9hJr0m44mon0KI߯%Q ;u|:^ġH$ Yt:EUfh4L>K{d|_Suzjrcfo,㴲DmפIZYYD*C3i8ߣ" a%!B̸Uzo]&n=7nL'^ޢ~3 mw"׍y4< |S~LҖLm*lD#CVb3 {y'nRwT"A[EywN0lLDyʯ/))gP;wd]\\ m~բRq!ymjfy*6XiP&kF2Ei^}U1f6=ʥmR R'Q׊x0p8A"EڎAW,`jR׷V-S~֗ePQ#ϕN&DùjQRֆh fߕ4k ^|&ފŲ0ˏY\Zw5" We% q`%޽{ޱ.LyV1MQ*kcC!KvFlI[Zav]F"@F(, QsK# uq7oXzw595sB< JIQCL;\yp <~eӱse9 H_Ed y4Za o|v3Ȯ$<4M[Y)]Q#\O*=9 lGIEQaX,>b / šs `_cfqS:m.Kq/ 7ex>hsHM0\kM `J=e睂+u 6ZAElz gbX1ֿlYwMiu}&f) Xˆڢd*M/5m6o|Ν;G0kl7<[/=ᄊJ{srQͧ3[UzXt(w?B0eݤoSf/-LCdu"xvVFD 66CR^'#+D35VӓN=t zDtCX"Ybc`[>?eRceUŕt ֤RSl{%6H+s1$8gy~N F<5s]HA)b,!֒x%+Ryk#x =n.<whɱ3\NM׮_UFd11Ay0k, I%D -,,{' E{τ]Bu\WlGJ}ګktH$џÇbgnHV 2 %H Ob8kX0i *ߝ-R M4d"$`f89lLk(3Ic#hS֤,YJtAvXv ot&]tIZmrs,dF쏍A:'^~O f P4 ^_Vi5ȎS3ቩ*T<Ѡ.K4AN}OHqO5 bc,Ks JWw׆Ö`DH@EfӐY7kZ]ǨWHM~I mY6<6@h`$Go^d_-D2j#F*eCc P HmRJLZh@`ba aWQ]RЉC 3X$K!L X-sCL}Ypљs:yl5I\Z 0$,K|L]d:SP#]Aȋ{R%xԨD؎ȲTTibz=s޺I[*e3IZ[[KnTwolϕd{p֖G#/@cā3A@@-0cA"u/ 23-q]%uڂx~ܳŌ06>.~xyBi jeg)"~Cȱat4)L XAdQD44?;̾!R 2CG)Ʉ6o7L%isc*uΝ_^ZٞO kzWWM 7"=0&r} Fz^\Aq} ez>;wDOD}}3]07yl|Y?̟$Qg&&EO}HZ>Ks^u݊^/ٜ}L^,k?LMŽ!ED( A/2hXl/ ZaO? (S0GĎO5N"(jaڸOӝ g#AUca _qs!*Ak#HEQKfށsgX]]Lڐ"h+p'S4Ɔ\ ZDw,tV7K<9 ܫ3c7m۶WzɎ3!$-XޢBߒA AWFL\Rnĭ 潞.5!|WoN؃=<qlVvT-,"1W~VLlИWp𑍳 =؅a&*[ _c 6dA]mHưDE̝7fnȃ0vS0qpLTOT:FvD^&t)yw]qmk7n` uk7ٮ{bRCJp 8)7R԰hká0+$y@Z^-2E尽X;p%];ņ '0 [*$-.iAX_Wb(DkT&Kc,2HL3gtƁ~CfRea!-ZE Ptwnƥ+s yeZBul2ǣU/0v(mmmJ}>ܻ͗nM&R /@R *ðC>{RIaXŸ-qNOݻ-Ԕ".*Yuef4U+5J~LrOl&bu GPR.T^4[YK;AcI֥6]ٔȱ&Uj.&=rߵ195m-)$Ҍ|-d_>QPgҥ+RdiRk<|x&@W$%bQjͻ@6-0Qf(yun#,kK;i#ӿ&S7|XxngkF۞ ~xV3s;995o{J㓝ySMiۻV:zh'm򃻘$w2–5ؘ_cƒô 1! PCڠsv{8Aj5es4)'I8s`#I 7 GCi0fۦYaW87؍+%QI|D{bގ5In7kY?2i@r;0tXɇ)6[u^"Q(>zfγ 7]Iiec 0޼6ٯN{ްșd)Zo LcUR͛rFW IQ`7sV2z+X t3&~ˡ |kjV"Bfg,(ԗ~qxR,zܙn6Ƞ b0_.n Z'GëC8n *J5o4;#Ҵx#]D(wauAW(iU ª ]N/֕ťۤͪgM0`*p@|؎:i+Ѷw|GmHe^u~sK$n1cXt܂> yDgJeXfo952qo.H 0v:(6ȺChn3!E12ݲ<^oY?F6}|d"-jD҈K!% ^C- 9*IKU#|?(WÿH-I-Uqc -}Hyy޿y&r֐Gzn/#FjZ @z ]rTZKꎵ 0҃OWÕNM-\O d< b,k|%A XR ˟BҽBAoRN1h"Im6&ȼ\ϭ:55Eַ{;}kYm(bo~j/Tn_cWƋ~MEdX\p)HђN hT0Ifp2`d;]i_  L TC^_"祏y2XF4ACHHH6ѣ5j|D_;Z6)Z7w!j\PȖ2SdzVıJyĬ~τ,+#M$%oX:c4KӃʌJUm|^M t}S0xRl"J wPP AP?BXd%j~7)̩bwmҌ=FhU\ԡAmf3bo'c1X\r 7!Љ\2q08'?rLaQ0HUi&iqBoFA_=Y-0f9 נM*&]5[MGQc' U BPhz\:0= $8 ͓0*Qԋ!n#٬?ʒOb݊ghtضc "A&xP; A@ѡ$7t pPG7Vh=)8Xʐ q2)zC(9ƇV3 xHԘzmj\"YI /)D; nB$/`vg3'vKY9M3p'YX*okT~Zgz֚0p>O"oP w 2"ۥdݶ=nM'}H_`nv?`Ň!H(ȍXViY$ OͻDgܢPo)Jȩ.RDEI7OM]{y٥}s]vXT&Z `#UId8v!iB-]`0G;:#YE.5Բ>Kȯ(n!gfVvS+ŚVsDqSQr`|(>Qp-r}*3݅&(8lQ۔aԉNi٦!T"ݏ}~?U/Wy؛bҧA>X`q5yΈ(,P,rM*AO'v RY\m ZmhXTiKݣP[ :i G'dJ  ^q*ݻPڧ!… Rm Zt1rEOm&BEQ9'"֏ 3еj?k44>J+Rfi M[HTM]W(RFRCrS5_+{Gnׅ#z}],9 S"|@_Gᆐf (o ^ӽ-mTkRND)!A!UN&h .q:~C> !'!ST134"NWBa*Q=! 06Diq<+`GGH(rqgWlߓsE 6_ =uǹTvvƩw]X>ǽpx*S66ֻ^v VMZ*hyy#񬯭vm.4'xu0i-@.xPYƹ _Rp1u~"w,w;w H܄>}{-Kɉ qU~U`6j$tɬPl1G8Qv/^gT(]q]zήJl/[nh 1$_]Pu,%ӪxW>{gؐ}# X +KxZZ.z:%Ugs=°%I4raV7>]rEj@WV…rX$VmUݳ+zn7\mX6-hP3p|h𹪵 50 )uؖYJLɜ }Rnjp {RХym:OH 6H_`hKkW`r a*(~;-. %RAT0yzgCtmnP*l aQއiu1d3=w 6Znrf+NHL3Hf  SuQDtgvߧ^ԥ{lKNxAގPFSKUe$dophОs~? rH7C4&?8/(`-[^9a2Q5zwڏŗ^e*Mg)OӍWj(G2]tɓ&{S`yT^2lX蝛HsQ`Gw_P=}ӟto3R(=tʸCW.n'"3XT-Y]m\y΃V<ϼ2E͍IkWkfn^?bGʼn֛D?b.XHnDkIa~AgD=@T`>|RW#+ 3cICd7Y%Q8AQ: A"x߼.~FZxkwEVcUEQړB^O%۔IF[6m 4? zG{ISj=H4wX<*H;xmᴁӣ{|[ PPY Fd;?9^ST&r9dUi(L᫟ӿWɭ4?TEI hl j1ӠOy}G>jٛBE]ʲ "RiJ!^:|?ӣS4>9MxE3n휑-!퐽z s{h ( ۥݬ?p|׮bۇ<\S0܃yr=z߶AVK'`*m,c@Qd_U]''%bi0&E՞:Zl_9ӹXvwtd׿[su|TĈ`jFP~sO 5Z^LxXgӵ+gb=9<$DHf5$i8: ؝;;իCǴw'4NIt&3y 8M,`Fq?(=]we0 rDnP0Xb̚q fescVxޝdCM2|Nt@$/]Bx`IGŋŝnw )IܺnggfQ0șN5鵚[ 'ær,x4B .X1&䪤nHJ]9sYaGZ gRD:X& c#|Ho6 6:l yV#4@KmT".NXr6G wg~T,P۵K_"ExwqX0pۯjwo@V=5괸$Fa2@_,aN"̣7yX${\x~^ݰi{^'+{M|+Ч_~ٻI 9=kЍTCկڡU'}`RPrł(XlU3'Dpl[Խv-Q.l x' |?x|<+->L|asƧf)sXl= d&Ɂs9-n^yRֶ<+Vl G1 s(sj?R| uGA-^`Z-Cz- JR0ʭ7vB {UaϻDەEYekd4K ܩq[ĖuadߐN5D`nVJݕH[x ?-y^RzУMk yDwl}Ew5ګ % ́ۂ]뎹ܸqݗN;Br 78sm ҦL<^@&>xJuP}6OUn#O ==Tg8fCяB'HjN5uҬ- Um`W@޷EoݝLP!s*D캮vY=R0vhm5" s&_gj 穊l^VxW\3 sb+B_8'N>7==C.kY$k| ڮ׀ԥY{ވ D1`N|தY/OQAb!ܠJfYeE,T۴YeI|V+Rn</Anj9̇ӆjkۃ"BMC㯭A$ j}"b*ǃHMa--߁a@0S> Ӈ><_sשb*$k fzz*|, ]&N|_r':v-Hm#HC6`8]v.\Ch!gC5;3-.]O\Kҕ Uxt# z8\,/p9C#}?s붤t$ǘХezPWĤH,K\b U tnr2,-^٪D޻y>J (l!HJ&&rƶܻ$"Dcc|*D<'B> ;]Sm;l2>TDo޼%K{dWtMrRqjv&Zx] Hy _މ~4-&APQ8(A ve!}pKFvBf8ʶ%;=ZեieLd7e 5X`Yڒ2iV D, vtBaQJ&%6 4lEyJgs4 M>U r#QX-½04=đ W /lĶЅkm3&.jeR~2c,-2R.y&FErS1m )OXBE%CujY# rc ?%`S|G5 &g5G#aIm!ɖRcMx uJT7177?ﻄWGq:A4AA{ {x`:ʮstۡyBۋGyyڽjMbcB7\E@ۻb#jEF rƽlPY*jnAjjMۑ ꍺʉ<27b>PU$]v!ey}&0ZC1֏A$7v ]"$j n;ٯ  pX I^8@A3sslބdo 8N+![{Z*~^\5FތW_}U\@ق:Yfk刣ҋ^użiSkm6[jV8 #Νo{TV5 uxơ 3%~Oy[=8$ͤQ _{/c\G㐙D /ptJj8h2Zhd4Fc 1#1hƈAFc4F 21bhƈAFc46i -+7IENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-profile-information.png0000644000076500000000000040173113242301265027474 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<{IDATxelw;zA iX^D,@ %!$!_m;J\Xޖٙgyy<e @fr@"d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0@#d0I=eF.dWfY(v@m^}v,=57{:?'U@ꦽK0} F!ؓ׌n>G /Ҵ[v $6+=6z^yՃS~͏. BWw{+Vϵ:{ z@ 5<6x4S?*n/A@*K]3zxY]wwknצ6L} zSwC;@у2} J!:I+ .g6]Sl'/t/]@`w7uK @ A@:- ,zs `j0P"g*}P@5-}` z@΂_pyvAAǝE>iD}EEʵk7>z톿OÉvo5 g "oa3,_z}C0p۝Z|XJ$Lc mQR,۬`Ls{7癨`[ 9gnD SG',ːJKKw|‹iРAt@ Fߕx5E#1R }KupQÿn{ۼm/u(>:M.b{wv\F 8m]ǭѣFnsiN3iJڷX-tK*so-~B_jpހ=;bDB;˫Ƀt\X"wbƄRv]S4jdەiӧ)'7[K.S^XQpB,BVRnЭ=jg9 ,kh[u궟ޤ/OswܪGW׹_HGvhλ{ Aݻ]t~S IoEu/]G~{}&`%c;HXbFnwzGR.y>ʵ5>+=o:⪫WM}TѸiS]^Ps}m+oQiɝa>ڥQrUM~9-]{NMŝane@oo{PJОl;ݛ/`9k]; VV蘡9:kOf4ܣ/rqU^1bDgWv[YYm[K|yDT[ׁߺYVl"HM6H^\UaWݫ~)\٠ag_o2.W1J'0@Yb4}Z١]5U$o+Q5Iv%l%[:)+2KX`Fz}ץ:гNz9_*&MD:zjںe[{ŗ\qtln*ǯQC MuQeê Khr,THM"8CsBy%H:{];~؍DW9Ayxګ[d^6`ce*l/6i7,=^C*y:<V=thX˵euƕ?oo7etR<{՝l_SúntHb&KkSݺ:2'WD{[ }M=oFuU*rz )\rH*P?[Cm.i 0Ֆw6}qr g=vFO/i븣/n}AYi/P ۪ t;夽iieە1i{-,W}tr5LhuUer4Pex.:a/%B*5EGƗ}lKv34hI'P(<$ԝZIg], b)ZW*yҲ?E:۾4T>_%5jT%3y;;&dU1XvW^Ýn;4 ӎŽYP%[ݭKWfՕڒ8lckR?PlHEJc+?]z  y]Seu} OT 0]@#]fJcͰ?ZЌT-;%-qzZTmYd^{}SG+֦`H۬jbjc?׵sJ]05Wx\Q}^'rT%~? jԸ"v[zB߮P:ll;uM;WGYOjΎ57rzH#OHW0Sc]+]sCmۈb:f}C=aR;nmon#ͱXǴ| !AM:is okŗ 40[YvyW/-C~#sz6)hoK.Oz9jhwԃOѺ%7B'у◯֚?yj tjA_"mڧom2Śxy 5dƙt[Mh}m+{){Gh\5*۲Pq-kÓ5N{GSTVh+gt[:Kv^U̽UWc\aec=rp߿Oջ_}6h_IGLP{vSub>n\zoEfLSWY<'`diͯ+suɳ4yHZܽMvgӻGF5PN-iٿ={_qUivWy'ߣp'ǼS7sbY_tI좼˶:O_ӀԯoEU9 .o˥ڮޮ<)9hLdOˤџ~wRj_MmiZn- __M=)A@|Я_.:uF;eJ(\S):1*ɹY?{pJWmNUFbyur+n*#zu洡k<ܡSuF(ΟO*ri$75qd Zר&u%ߒGfwknv3tl_lTSYgOi:{0p}vk T`9oVRQ`>8+-ܭ?)OO!1>2murOtD4pmB1eժT8zyDMi^E~2t?xF,^)ʟ4YckS'{CzwjgsnLy3덫~z!+ep|C EIw==L?r)My!m2H*h)Rՠ3W?9DdOE Y5vv}f#m㩳!ʕ?X|~UW?VfbTҌ`r=;Wa yyAo6ߚ#UyXlFvϘyA|8%yٝqmpu.M#*'sTò,Hw,4.A`t@3aj;,3>=H?x]d1d/e򲂁:P'L4~y:zENקazh;.WޡZzΛ75+tki--wP]m^T]͈j' 5Mq?i},ݿM֞#KکY| ͚=Z^'Wutr{}ic5{oVhg9Z:IS^~@v']{dM2M32W+}-htslid/HؐVV<=Sk)n/0Z{;]Any|mZߗ^k@Ao>|ʫfMFϥlT1zz K |-4qCw6g6?V%vc0_ߕz 93LY).WjrYӇ(7?W_1qsu*ߍs&UeeZQyAJYc 0M+}wtI4j&zpWvAڅx2؍uO6-k-W;AfceܻR.dlY[OҰaSuonQo?{UgVϿQSl8uw͕iuk4Mv)3QmYvzxD 1㽲jk(7OVf̒VvhuJxU̮&dTb |51gN[~$4vyQ1ʾI-ʚ]ygV-'BsDq/yE߶A]9,mh.eq~?m͋VN@@:?D&.Jw˭ -kE/6jFUaWruTg:OW[SfW%ӌ+neڴf|?zy] =TuX # ъnm#V.`7r͔$=8 .oA^n]tPz}+ % gFaG0:DD/ԷNP*/kE4\7l;hZ|n{I^8!W[w'CkKjܚ=)sKdYnmOpct.F|~vyFrwgF<6)>@L-xzƭ}mkqO״@c3ylY^@ru);'{VzΝ=Z^Of58yk; XcذJcjFt{`xZO;nf(-@;ۧʈƺ@6mto"ktUPޙEƝ Ge?ּ7%z㘦LiE@62Q1ڿZW*-!ڲɹӚEV@G#kΜwH*mmzeTPiML w?y;U)9>v}F4hvSyTWmhykfzi 6x+17+4>fwˤNȮ&uWSіWJ=m{xt-^;A»XM)w&Qd}uC^dx'۞dma(*@3zL{ZTSԥ\!9M`ԀKSNVZC,OrWTjỼ!i34.yp؀otxͅ52 ×NԔ+~Y_ ITk{N=hu*5+ YC:Uw۵qߣ5+?=UPNVT껺wG>uNSeo-uTiUu >KC6j銰ÿ}TM>vſkֽ]_=\s<wcŠۭ݇ :^? zp.ѠlZlN6\c*;?$^{W>WFtˣz2ze,ߛ7 Vi9%:kuJyrnCtPKV={Wg4MC%A71X=Dc|B4ٛgSX?_Zl <[>_s<^(aK5 וz 1x;vF<9뜣_-oݤB8B~ŻۖGtِXWc %7˕2!c^gI'~ڑ:@u' "nKq"xgEPWU2O <dž 4lذ]Z͛k&Or{[qXi{5r\Zts*)tyq=u?{JͽotpIL5U yC }t/tOMӘ9IԫlZ%| Ǻ>Foo_c:( tLLR۵zrm 7h=ЯOM,gve19q.ƺKܮzpry {{vjZ8E=Tݰ8]4a0 njۢhkƊl{|ER]>xI5 d厷o 7vp痺3:ȩ]p6V:ۨwWhT|ET}'JeX|$_Yzn󸓼c 5 vwU̮to3a(O#.cS>mǞo{ݖڝ/(-wۺ@g.\%mX]?ÝLS H!=DB 7'Mn=00'S^odz z",_f  Tm{ey:Ude 昱bhPr)2|sd+V}$ep톼_@sϒ>\Pm}D`nH!O 5D9şAeyuhp8}𼥆dpěRΉl Un.G>/L2I2NZc'7zwH>{z\^F:Rd3뢊Ǜ_.|g9vouzD\9'ڃc~<E X9bG?Ri(6Yь!H,DJY۹WYAi\m;d6QEU$\0'c܂`tufo{f7Ct8~j +̦mk_Y~wtz kN0r#^P.ۥP@ \z'<@3QXw4O"Yz/Sp++'ry!{y555Vv(|әG֨.oVV`.'O* i)77'GFF-Wݵ>xpD|ھ@ <A=b^O:-H$TI~q؇N}}yLU[Qr)TV,EjBj~_r)=;}ŗ^ =ѿuNsnNfTՂp__ ӸRk=|`򗵔=;} 'BPTd@s!hK ۾@"~/)@{!HA/П D"ABW qЯ]LII !כ{SKyNU)0$@ e哀7vQ<5+ G4dTS]Sr]$9`8=֬Z.ϜA'{9A¢b g~G`QzM2Mn;{\ÆP4UC}~E`nvw=V~ajI4+^E;^2X4J_o\YYy"͜Ew.lLMNﭷV"Pmmm~[ou 'I{tiez9Le$ K ؇1`@и ]. 3"SՐ`RbT^6ҁE>9c&W~ 1vZQ҂a0? n٤ ש!9r) i18h0 }@݆fu0TǞЈ2\ǾũoZ/>Q>__WJ#zȴԋpA%%4pP<i۶-Zчڲef؟B# >eE5<|%(H2H<+vSZ}j> З\MiЦZR#1XynοԠKXv;5VD\e~5,qj6s_j}ROkNڲi~EASo6͖zު4ߧtgzBKǏ(7'RGֺU'R >)ܓka;~%~E#FX_vkye: aS~kޗ2dSF-,,Թ瞫#8BN>m6͛7O=***9p~6t>/o(GF`r+'7 kw8om颽}@V4=]@ٰ}kf6Ho'뮻N`NPpʔ)袋t 74?͚5k>_jQ!SߞVR`DY[ M0HEm1_n^c#i2; ? _ԣ1g{ᄚ ھCm MьYO>'ER6 {'/y߹*~;+:,]zҍ7ިx<^z`W'ߩuبuzZ[R MZ];uK T,mN&*rjRf w }436魧?_@kW+րt ՅǕ(+_'o֞yb'fUV.r7~&oX*IAA~<[3ϴ~]w+_J={-Z~K;CO=>l]q{oLWnvHFVbf\T2 +]nͨ:G4ȣ9?/ _ߖ%S?Xz$'n֓[tЉeWhPo  OUV{рNmܸi2iJev\P(T /$}ӟTWWJO?tr}9998GX__G}t4er6Q-NPV7XV$&GdceiW d<2zazi 7m|ת~/ÁͿ9)y<46@/Omi}Ԧ:g?)󴝔QS[U7?i__ ]{ʴ;*-AS{+ohɺrEj/Ϛg7h홷37?^F]G]6޸VMsاCO?YzucǎԞmF1r+%G}tc'_;h8v ]V%%%ms.TC۫1Ye@Q,x_^~_g}jAYpiɌdy,ٶ=&,̅*gЖkm-/8zIB 7cSzY_ZK⫥9: ܉',b?}%w;dXG]ykWMTQ wS~;v~_w?zc_6,NꫯN>>ۼ6|.=\r6o;yFxêY``h'Qw>ڬrz64五J$L7s늠XjYeZWm.t4Â}@gLܛeޭQ缦+w5(k G~zy&/O򳆂C&jrk עFhisT7khG[l:5/$FcKt5Ni܏7os. mjƍ}܃ N {n}߾WZƭ 5` z?Z9>Ic>|TC!KP@6iyk뱴Χtv"=YJ ]n&6)W?x=A@2hZ-?H}V]5U^a5TAф9m/_,QUs;c fkodp9HN,k4Kn!^^){xTfsoe'e"S{%~rX `xW; ?g]]].,yw'8|G^;ϯhΥ+8;y:@g?>0S~ajuۢ^?u/k[ĥuQصѦ rzpc/@:X`@ec@'o=0W xJ/4^'t2N.G_dm&)N0/Aٮ\s05Xg6(Ln4Z{ci歊Wg+7sd/T555]Reee+MSuu}}f 4_㞙W]oT6t[4H|uJ=uky7ԛu<| ;E/5u_Gw=o_Dp;g& s4V-֬Y{\))i8=ͦ^X5;w<:dosQ^zOdҥ6m.}fɒ%{e-K~v 4H ,b}kYK[j0.гBJE R5he#^]|M4ԃ߿Y f|Oxj.f(u[FzQ2U>ǙkObm9Afo9of͚Iiq.=p>bm.kPdѻ֮]?rrrlphP-C. TuzvsW֡P{83&ܚ5k4o<=cނ Y*zƺYѲ6L0agzVA)XMSd\kTV0I3F$O2UL=xYז)(ָOt5orȟhk8Kg/9KS}EB;^?}.M791SX5ZoPm8nW> Ҩ)C]oj|߶~wo4ƫeÕ P'|U qjAv}dM鸆gtݕhe+>rս|OI#J_uHI[_~|z͸! z?ɗ{ӓ}^YNn:{8zSP<oW];c},Z [oSZz>xS[,M T 3թr SUm_Ռ@&=aA-?v<zv]j3ܢzp]z52R~tg@ 7nVBޥ?Yz}kqm]5tOta{Nޥ}0E0Rߛ;W+θXCuV넯Ms5ާCDo=r~x5z-g]fs~t;-r!3*T hȌUܺ-Zy-m-:PϓULoV461Mr>osJVڈQ&jD.UC`O_Iʽz~rJXF'L_;ebrDf]q˳z~¸n>+u~5[__iYǺ[~\4aSgjfh.mV6(6盺e)-idMmxj}dV-{ZJ-zz%Pn)wlu:i\Hՠs_|Kv/VW3]/BS.ƼYx/߫-i~R/fnzC/kc:[T˾B߼yh5]9_F/hm)l^^_V' v띉kL%X>fpc\G^sq-?/vLͰwfk#/5_ Lđ ~VWٵZk7kZ,.+v>s{-9,9yJԚOÇt KY-*۶Cἁ t3>˕7V7$N.c%%T`[@'Ԥ@Lkk{+uQ;F'@ʸ_BW5i5gh{V~\)k\QO3w>SE3z4{NZ1\_]D<(S{C-8W#sVV.,ߤs4^vc*vBXa}u/_Kjw[Р.~;X__ rӬWXkVnkiݒ$. >'b'z[Y ZQc4ZҐ. hVyL.>ݽ"ީ_ߵ"ء4t4ABi*{N(fp ${;Y 3_vj{u(3cWN>6eU 2!3#4yR@olՀ!C5|`;ʹvJj-Ǫy{l6lhҁ3ɘ3)7Vr k?뱵ctʉǫT<˾d[TQ)SE)Ntܦޥgt~vf|ƪ6hܦ ϻQ#uwԀ3dZ^N:.OFtqi…צȑsZ5ok w:Мc.ۡw/T}UB1e&8cǤO>BLN*n{ Y=|g[o{ GU^Znx*==?uJJ篷7hgoq}WKgb@zQԴ*[D#&O/'ZhL20)5Omz@:c'6_ߞqלSt]ltnxVBᚭZx\ŵ6ޫe[nMCLI ! A@R  yI%z`b nIV{vV-l2gfV>Sw7L<-xma)ƎtΙxl8%vwRs}h06u[p&~}#Es0'qh~'N07mWpo| ngٙheϻ[gs^1iQyt|J=ȷ Mt9bQM]nR?I_݁{ajz3Z7D&GqO[=FD7lr_!3XRH.YE%vu=n/;qH9;4Mh(2W2{r݌}׸640ZhnU!/wMBzCmmlldíWr|/G5%7g=XHNIͲK'gb ~+qUL/(@I|r6o!e.;o#ˁmLi3ua64L߼^| zϹ⬃2L\N55D̸Zqm8W>A&=1hg_Կ6o9_wp,*|:ry 1FS6늫H( ]t ѹӃM5Y#usw;Ԙ7м\ /#)Ĩ2:ԑCME;ős@bǪ+OHM?>X6v١Ois i{&vzbX3kwMd+?s/h rCt gpv]u$ϞM9xTG{'SIֿJI)oj5 Oū,_YNtzG8֘S_,&˙aUn`c=Prxc }ӝA_|[CivB x>yƳ~S3wj_jbQ]ѻ|:vX\79Q|-%lw`1fԅ8k+cWGZo#'Ǔk'vj/-=qYh͍oc7㯲Z$3/!N<> 'EfYgPv-;,"{՘U!Vu>k *rNjPABBbՅf;YXoHa0YpDđ@XrnBzTB6ddyx;//n7~{81)Doí";\wYu%gdGQl# kd3˷Js 8Kkч{۱ /wŽ?J?sa,\_s?q+PڈIƌgi yغoVJ>yy^p {jB˘̼ _FQޠ?Y;=>6_ß~vT?+_.NnJ!^ 䦧\q֢wxY{/=$&̿k/Jj8f6/'O㡭rklGkalN}6CS+߃ !8!M` H%?3σlj oFGT殮St.IQ̞O7Si&2!GZΖ&<>Mo ԛӅ?7VW0=k?U˞@B0m#FzSҟn^m^;>ɟ3EO6x1˾v QD|e|=/j_szMBu+摍k)!Z?S6O}Lޕ?fIZۃC>Mx=Eo )!?*O*֛8ôY,9>Q$3 w)w'CrUQzBqNjdw0C?aDCO穣\ҢC;"s85`vr-$FI\j2wu`Du>M'%YEE7JLDb.G'V;5 OKs >Y_ٝo?bU_fnx)bYk?䖟ѻyxV3T>0s٤6C;=\|iop?TIU4n ̜Cff3/)NvU׌Ic\& ':^tnˉ_]nNim3(ŜW=Ide7BmjY!'/g:^iksEL6mFe/MaY:'Zۂkb_w~ݏc8$P#:RO)&L!zҖ}VZL?kf5A 'N=‚.Zpع\Zfp37~Cm0߿s踩YU8 V ]^كO,=I,zz Y,Zě+VQxї`8hrڍ-Zl;5Ee6 q ~yX"h#Ykkɻ,2.[|6n%^>+y;M8p,V!=KK{Szv3~ g9ؓ2 ʨP}T9Ԭ礖AⳫ@~9/u&q GXO o$vB>)kkЙFqhץmxOk[ t{^%,1 4hcc 4b] =#6B#PZ{&O4BB{%Kq@.4z:p7Fe`6V$úS{Khu QuH0Jeoco+ }?m78 W W T}e퐷8_lp{;kx/7&Vl<,;OEGk9-[iLH͐`pIGJU213H5O()|h::8EΩ ,r OWAc%@!k4\ﳦ2yTcdCBBb|օ!!vXj]w1Z vG] |ǩхed!ƒǻ?đ^n :Hxa!NmL6]lZ +8sfv{Y}ãz#'$4%wuV$u9UPޢ%6.jcD>zSҨw>\E pM_0?éE=7,U^L]zyϲ?xеM$^v7ώa}voe&.β{5[+7𥂹؎,l3v'+J*f l}.羟M__7~Lfsϸ8'%]QG_'q vwtq~*&s|5kkHPc&@!냍} cw<2E1I/cS6kR 5:t8x$Y|+I#>LB׀ɧ:"ӳiN'%i3{jo;$})v_橁 -b^ {F2qB uVc?){Yȇ&}:y.%祧||<4~$ .K2yǸ- dzslwgXꧽp7U Ԥ3oє{) Z(-CXc$4>pp?*dÿs0--ڒ]ƞ3$$ϾGļd&j;کng{37j֯,pV:pX4l]ç{2`:7}'Y\h2iњ=dn:/?sXd?ʲ(,Y-ڎ$F|Ͻr\n;!Lj\esYzZ|a4/ϕN'jVɆޡژ9⸴ B7ޛZԃWToo2aO}j9kBFVXf>y=-d[I7a *v@nwpo(fOe![K=zL!aDYm(kLN3ZZFuu!No6V*4S|Jk L8Xkx*wH`qpK]aBb%%j<_V\3KpY\yJ~Ӭ fZ$]~|>w'i};eFmZjCM/9uãg×̺QQC9d<i`GY(uɹf^ _eRάC=TtMK-T'`e <n4{|L/pFd84 GI3lߢg0E}-SԷ̘1㽱PK tnkt[[[OjyUԸb'{ȨTPu]]jN*#=xm g 99/~]l6NI۰|IOO!U>oZ[ĕW.;|~g:L}-5>oi78bX={{=n;špޅN 취,wE=0{-o8( ,`.$$$&Կ*`յ/@ӷÆ T[T`1,,,Ͼ`<!blRaCQ_"z!_IՏx+)n x\ 1HP!Ƹ\_Я[KETOuUuvvsSwlw|lkk .B!Ęv'n|0'-o.#8ʢgD.߻bOA.u!cT\lSh l<ݧzo*np8zB!+o ,#,i\X1! !3izwpDS݋cک@Tـߖ` P!B!'@![ϊ .FZ7[*৲UPe /B!b,B}Y~jQY~}Tfbۗ~ T`R *TR-B!B!bS>?ySv߱Nq@5Xe 2Q_B!BtBDuO,}T^SI3TbCCCoS@UY!B!ёB*/*** u/p*>8AZGKf!B!I$('ޫfUo*\ J !"" ՍzB!B#%@!8n}3>R_enjjjeU&,B!'@!>}A?fU?RKo`*PՏ&̞TcJ`!B!⳸ &Pc٩E qA@AkkkT!B!Q PwTW_ޫ~i"ϊ _xx8c_P'-~ȩ G B!HP! {=111n+L"W )4NnX:F^MOPm8,Sg,Gk?KQPO<~?s71B!$ !POꫨ.j24qb,@59"A@1>xi*FIIw{KF"#R8.Ҋlsl #<̂} euNળNOk~' 1>z<'K=x/8xϥTFBq*O4S]KnԌjL@ީq&Ęucv5JG\G/S&N{ڶ6i8TDzx-֯5.$bf;h]c%DHB ,F2 qZ>oc7㯲cs9mo[!W?kblP3Ȇbق?www (E냙ݻWb ޴"6RSP-ڣ[ ƨx[T'*7bǪ+OH`MKD2"1+iIu2&p NI?:hjq;JO}?>X#w !t#8⦩h-lRpăZ/û,9c)gήe{M*uLPE~*b7hnnu] BG 5makiKM"nBwLWH*!Z@>8v5S;1 K7ENBI+(]uT4ͦ뤩=i0b8\MZu{6]Iګ(i2!JZwaճ7i<)!Cn*x.bd?= 1n\44l]2٪ K!PG䂆]_J*UJRѨ #8*CL(TmѸogc&BK^NFTwHKXbb| I?2LXHQN6y7Q3,b :۩-)ewVO# R{&8V#4s]zQL -T'o}ЁFc""} 68 )" nx)np99Gx.bD= `52Jʘzf6 TOe566JoRz5)B!BG"F7֧ذxiw}M.v= 1⪪dq@*S}!B!x"]7S^BN^rU;ki4XrQL gϚ*dDօ:OTFCTj]*Ýw,_xx8Nsq5r"B#YB!Bp㈎.c~ Se_a#=‚.Z~lkOGoAq9\P&!F=i!F K'666kkk7jOsq)ݤdvvnK -c,˭߿ :MzqW_&1g_v69|VT LR!D?6v怜Ǐ5}&#iYDi%:8گg7O|k|?|ycݟk1g)#uƮ% 9XǻN3KW1o?/~.?_Xm}o릞D1RB@---e,2Y|gvEd\Fl6 /.EyL֯AmUgl3SS`Jzl5i~?w>gV.]esIM@#։7huLq$$f:kOkv -N%ԨAk A7bbBv>sf\3!{TYy83oYOBD\< 6jCsD>?7F\|6dF !#M+3ju~B\fv%>O WN¨"c:Z*S/^ZN= TW:M[[+;ݻ+))6d.Ԛ).K19ga1[ li:_@eFhjǯ;RόDlaoy1;țCı^,W?kpdbZt#?):e.9akvPZDiM3.pY$s/h./J qR>iCVj+Kv,gIOBv֭^!2c ́Rcɞ McȻ?dB9-gnʟD^Ky^z':G3. 7, #ºRpkd/\Y9o;D]'XWpݥDh;Uz6$k{/gn.7j&oɇyjvjDgbls@򱧎JyGL^ugdJwch{#Mo> \Hm!Xf(f/ ι&.1 rˁ0:7xvnØym|wA8__x'oECXjg\q%K'd*[垦{6DW'mn# Ψ~UV{{{0oĶc]X\XX"}DfziIĺIce[l42'o~fWѡ #>t֯N3I ӱ'E/Vg0cZm,詣Ң{鶬n?.9~ח*CEG gk5(k6=u҉?n7n 㰩cK!5!ml*=0e$T`A[k0'Nbڔ,4?%󮟁iLefߏSͬUwv!y376rh\,֐sEqƪ&2p3_;'ktFv[^YD9=uֱ{юk:iZX6q_6l㉲5!ƍ%,G~#O93ZĬ4aLeP^ZDw!Bu\9{q qh]=תyyZ_E mc3pMz˩F0;;rk[]Jz4 pc{ݧ/: ㎵lvr> z*(qF0sR!PQ9OVVS)þ;.yfCq`9dō/$(qT_DDD0E.'mab݄łFWr uxh نYCz:D:*x]|Y5Fyg_OaBRs>!;ԤNrs^㼼r6QInjb]˩doJcFjsezIΩ))6f)S#6Ʊf#ɗ330_% u Qz/$(Y7%>8*di<8 &36xpjGӪûŽƏ%v׽ˣenm E 139E?d[M"Ե(mO=Xuև茥OQ!lŨc8`bêEe8z;iju9YKԿoVZ]~̱V!2 __J %'=p5 O$+3n{c.$pׇ]0&n:}:Wy1 \wiT-x[iM[<۝x+H9KH':[7WI9lULҽ>b'v4V"tkg8MB vnś}`gPaͪ u{ lN 7_1RBB}{ 466;Lfjf۫LMhh3srdR#Igzl1_O7.=VΧe”|TA'n*tlPj;?esNIJOKKN:jPa%9+ 'Ggs-]"CI/cS6kR 5:twPBCﺥ[ٮFuиe=p!TPUSEW^j5.:<1 1Z*ضmFO7-{w~;tp_p!$_o֊ٱ>|4}N!; >xJ9Kzƣ:pX4l]ç{OH&˟}yuMvm3MdɢXnyv$q7@cҳ wqxb޿/}.~?]Ƣ uTDZlB`c<}QtalP:?=w,GQ3f.3Sqku::#7'!qZUO|E"_3}mp{2-H/WRBBe ڂlB#]v~S`.MJf%ޯ!h4'm\h^lZV/˭#-eu;ulkPi{'_t8Ҧ-bO66h$%/jĦ%Qh"2egCBxO&D:i,CϺŔTfp"m7YNvҋ_`yl:++ۃO[&A^b,]V _@kH攥3/,=-y5mí>y5k?x%~g}j.Ի?M/9uãg kxpfadZ.9W 85pF/)??ƓoFd|n9o&f~`/Ϭ| *Թ_d lg’Iy< 0imLM0߾tu$0lkd/?:?6 ;|eo)'v`Vw|la8eVq[ٻ8ro޻UŶ,w:jB Ip Bhvp!HBzH8%Nl].יoHkE*ǒvwvs}9cF'6otP !dαE?XߏT`u¥;>FU3[pbV;!Jr%e||2Ÿ17;φ>9:jTpJ1B at =+ʹ!! BrsxF*TyA;,YވtLx")>lH PN.VcHt,|-Tl3Q[a= ~ò?h0!2\U_YbyBȜ0!dNl6)8<<, L5mN%f3ҦQ%Ax5M@8ĦAT` bP^lA7~O_+W#5FJ/Lة8. @B!} ?OEQBHʠ !dt:iD/ 16rxG, ޘ<is{kEToaʌ(PD(wC/X`ɂC=Z} J5.mkqI@B!Bș0+o\E0bR\ 7tҾk.F{] l1`0( MUvYLXng6;xY0W`o m-A rjF:;p X 2ȆRB!r& ! |?v2j'8;j.F|Njx5p~< Q*] ܼV@~0 ;"Ts-()p1U$½j@/}EgX!!B!; 2 Re;໾6tƩ| B/ Mu`M;x)a]OT˱{2l+/ >,LR*TB!dޠ ! 2;^s mAnGE J0h4҂,8P^T)85w3;L'߇)B!rF !v.?ۋ6Irz9C].4|=3! P7d2\!ˀSYd P}B!B a(n4ֵaŹ0qmyp:t1|Q Ll2 htbwɇs+x[0Uh*U8PeZ߂'gJl>@B!BIW4!"NiY\<(C vGQoWQQCG(^0%l?шX,yw>EG.#*P8\3'ǠU8G]"GB!BҾONE@H嗯@Fx֖$ݴY[Ζ!i ǯlBxj;f;Vg9M&|,g0]YdPݣGQ /eӷrL7:|e%3u.LE^|HY ?N2Sٜ\t`Dh!B!Bf  zlG{; ̶VeiV`08;^6 wVN4 asDzP퍁_ U!B wb3Qn3]!F dea/"l4\~pRT0/gpuã+@]5kHL!2~9!?"vhY'y",%4dA:^7 %s5F{D+jkOjgjh2@i6!Vb/"Z>3 kyRẍ́B!C@BȌbYLl/ yZB1g O[̌Z [bP,Fȼ󣯵me*68QdWSv!gw~Uv^Rhapr/AܶB^|nه>/r=2 *ҏKj-Y(\xi-QSyBH !dF~l?wXdGQo]G|Q@/ >>4B@2D]hص- 2rQeBGw!(G#߰۷/:^|?x+Ԁ?}xێ՗}̀*BOkڂRO?%/"ꇻ060էPCkBHZ !dFzgYW'ieyeu/{aC[ΕHHw]MУtr\9s,1Rx#ʘ Z'+o 6BIYjdT1>GӀpTV7Ut|q(ZOi0(шq[l~Ƃ|ZtNcVC:3l6v3> 葙;!WAVyH?ڻ0ynޮ } }h ^%Y#ƪ4]IH΃x7kZ*: +vӯطcōʯ݈E4B !3e1P(m^mU6ToHz5r.>! T*RjbE`BR7~Mxka qzX-j4 xX nڏI@b("lMT`rI?Ic֌x>r&qXPD9p8"n{GK̷nY&odeNv;'g߫7~x3F5w.R#}AU9F !$ P2cT*j$6ɰw*8+3@NA  Y_bh:N픤NV!ϵ΋9\X`C ǖAELeADsHS!{rƆ)8(tKҗV|P/}B,, s6'2<E~A/y_q: FW߇u⎚U=BD:Bf*vX0{]`̇]*P_ûAP~|zI$$mpfmFg av?\aȍ&Ƅ~>Mq O<o@VtP+^3!isM@Qq.g|5o_jɦ^Wjx0_- D!󢋯¢jZQp \G>a.]z44.2:PE6i]RCȄlŇ`!u y<9򤕪Ӷ,R] r˔SQQABuካP^ZPEWo(?*ݦh-ֈw Vtƾ!QLM@DU P` _ LVp#~S' 5`B!BH:!dfN.t Z+"k@ԑ_O!apV7Évq B!BeBf t#W!cy0T)fX!`ys+.JB!B<BfD"T׵x`ᵫ WZSȰ>=8 )ǟJ,B!B eBfLORkЉRs&C̬JO!^E Eಬ/d B!r:])T@@B|q\U]>4pL4;5T)ī?xת0tm5U~">-{V&B!_AOlXr:^ngqxq:zV߯{@N^/!Z̐vkGi6q1E!a LU9i4; IHR1C[==؇-;f7Ύ"zYl+AaA?6h4 =]PT) *^w}]%nݣB~x9i9Žۅoo ׆]p [P' C3` 叟pA{[э8Vno B& Ũ !sg|"4 IHRu->ddB ?@Re;m໾6tN"W&Iۜ\gP N'v;z{{`Kڕ:hYj|f_=@sRZbg2VU*LDz0Qځ03!Cds" t;<֡j *2VL֋~VâɡS+['҉Vk!72ȼHȜ I}qF~n. e  E JD'rinYtb8deeIAt, n:FޅPy(dċфa)R6`ya<L)C ^QtCPgT!aHqb2gqo=r!JB]nsoctD5FZ4¤L 0B=>ǐƉŠbDx9aGWiJ'ZHϢ@ !iA ihp*,  OZ=bg%y`v1e1,ATc"@/?dCX]1T:M&HlB 6G Ch/eRa/_N58! W[#ወ18SR|jC#l߅#UX1=AlTXN@BlmDk 79Sd Ŏ\eBdRل'>P!?xr vϕ曛du3Fbc#YPBΝ-8Ni7ăSja/YNTM&~~8%F;rKJcR֩X]PB(5EvMN[Udɷ L[УhofHt1SYV|sp>:2oƀD|3{B {3|5߾ '!Bv[姰{pi .5(fZeJ+5ֽ?[pBNg\B&CATꑅ>dؠ a4b\-A&w[$@y$u4juJ\y^ :{37}^tFub>G!F C6 Nh6@ [Yd<+P\k*Ԑ“Ù.f,\( A!]rŤ@YLL(S"ϳϤ(<Ci %?X)OK-w% QiASm-%F=`J,J)Si V1T}U\7@6,Ok-jy8*QlTDp#Mz|15aa xmMh<{.$';։ol ըb77T:V𷣮aXjWbD6ˍXk]hܻeP(89(YPB@Վ:4Bb:Jz y0Ȧ^nt*GԝbNFP BFcQ"x}hҜ96\󙛰O=!q;+c|[ zV7UbN<'Trw#$ ,ۯcJG'ȕ)VB#sfhZ"h:'^4#v[nG{4R GE m{aʢŎRV\U({Ԍ +:Ї+PۘGGq]:Mb`:I7#zr ~1cz 36;L,D{g…ȵ^r+@GG X(5ҦUNGGW*ea4ّ_St:1,BU~+왙0v|26z(-φ6ƽ}c-SND:&&[lD3.nSR:ڇ>\ojh#8Ák d u+ *Uq fq\TgAw۷.Bxg@{^v&|,PM> ﷏}ոU8)QRJKM)"$EP!?7: 'Iy]]]DFs |*QUb&tAl/Jma{7k△eyiCc=<AbH\ر\ / `NNH KY`GߠD\!.. []TY4`D:4~݉eŞY[Y{@lK&z+ƝOxpXǂV  .:.6>Wçv Voe̻g] }'34LE>CGV\.ytXN\{MY"Ԕ!gY, ł Y5(8nPݪ'N8i%qd;-5asu;a(AMq1e-;pP8g9ʍ ԭx44!W\mxX\Sf!m/v7ףþESe3l_#^,G?O|g- Ʈxy%TqR9 x/@q=@2E߇7m@Qq)2҂r`=]hm%=qS9E@mDZy+T)05bli:l\}ǎ7e l80-2glf,`n /ePn9@"vq9/ üC@9XJLHva0hht(0S]:0B0FD< &i۩%ݯzYM~t_c': \0ؗY+3\Yl܉=]q$-!aoe~uhFEVv/ȡLN[pjhb#Nʭt׆|rEusⱁħJ>NK(퇸 S7`wï,,H'cR!+ˉP0.47A,BޠG~QtC_T@@X&Oglaip8̂]S[G~}π*|IYݥQ],8ņ>W{v鰷 fŎIm D%c݇vm۰ qp5Dp:M'Fz פ !.a8]7ѡOrF=6tsGQ*+ ], 19:]#E:Ъ̈́IZ eܱ[uhс3"Ɠ)ԭxtFB~!/+ Çаk|y9* #GGzx-FhU, `G23rG30[MQ}d__AOKGV^O^ [}əŅ_A5 51 uK2!ItGp2TRټ,²3u[? -(9 y4 ʞv(B,0r&tfR2+9I`c>Ԍ{]ia+6"4C8EokGc(^FWYe G3 QЙE XPƑv!4JVT$_4v;t-=dJɂLUT0}av &r*(]hhG(*@iMxwqWѽw/zcatK|ZsZ|立TNgPBI !nD#_k$6FF$6tErlc3ۊ+6CyXO7n4slYX& +Oyf,|+1xeZkv1K]xiSkL&)?ju:E* 6 >S_)?.hٹX]b7!Тª ;j1\z2+#E6E%~Sfd z1ʈ1]AHl!A _lsdʰ#B%9Py xUW[Nzbs#Y%eB9،lMшn!E#B&CC !)}ņ 6#c렻pV.^ ^,E=_5ڊNtc !$Gn*De/7{)ƊŠ|ةGC!L2 !) {*v}^fys7qh v5b1^p/olq-^?:9瞃5k 77W[\" P} 2d' i4z#B!B= BR[z Eۋr[ΛaWTT,w…R0:TR ;b*h0!B!$P2/\.iH0ɆUZː`6qANȪ?ݱnCaGZVJoiqԗyaNHB!t@SB`0( f?Vli6T8e<:,6۰EsykOKK?iuɑVbN']*?6/]7 I e2Vb=!B! !  ٌL KrF `Cя^{ zlh[dSq͵HK# {lIEw }(&p8,eI,@|&B!yXЏe+X RO-"0z,a[iV ;; /Uί^a CW(׏B!tA@Bȼ4lH0ؐࡡ*:twT7Y=_|QӉr\~8?ؽ{wZjxp.3ъ &MH!BhBȼƲPU1,#m!&/AasƅϽeq$,ŲیFA2) cWNYNw>22ee!F!B(HI ,eV"PVq*<>>$j݇V.bvY/c ~y6bgg4쵪*Hƃ^sG:z @`*%B!BI !iǂXlA6w]VV4?`eZ^~{/>!A7dV ft~[[[t42lw7!?lI1Yf$!4p7u0Z[B!d[ nI tkruxw[^ U_?6k2^wmmm~gY鈏ĠTǑ$]VldbՠaAb8/v-!B, !$- ̂,Ȇ\Y :tqg?+/ɱ$aCYfV. \I?eL6T*FEV̏f3,.G]w=hݷsa5(Q-2ǢO<[<Ɓ⎏_2;k!oոXd>j]_1>q 7lnM~9|O4' [/BF9Xbؒ<o%LSN u:o ;TH7O=?=WrTmc? $+o}k#wT.yϢ ^~?}bع)Va#QXȐlA6\rv_ r~CҡvCW!ࡗk&UVn^/$#q%G(6sF FFj,QBhGS|Oe@aE%tÞ!qȔzXs˱Υwx]=@aL_0\2hLFc4 5!Ӣ]O>4߱d"wukPúך`|J(ŻT*;񥟾7~q{/xt |Sh>)‡/=Kt)Q[qLp(EmMxwq+, /}N|m;{~+?lF`AsV|Y~/bw7;~߭6ΦrF` !,Ær&K\$MhZ4s_osg p<Ǘ?~mIB dNŇYxzJ,BM%vpٍ}q8ʖbES ~O=c*K/Ǫ+Q]u?9 s9眅J`Owagj,[6Ǝ zyl?r6t>ΪkT&1t0i.شpa=f4&Ce ;Ď. ǒ5X{85~Խ'<@нD(&Nʧ|p`j<{ Tĕ81#o}MVVl>n &]=g^WᎻ?ev9y(׽w_{|#BX7sk&!L/DE@9$aL&dffJs9 xŒ;'F_`ă#gP06l@ 9>2xHIGZzsJpq23? /f OHȌcozuc\pd_u)^VtGPŦ`i&~h6\|^4/=Ni p%ˑ۰m^\Vu2w}Mu?_~zO=~Sэ(4j|sZE7bQ6禼?B !g$6A;,#844$mV(/I?FӣKDorK۹9a `J\Y8)x ɬ:h\pi*d/\"PZׂ}mr*Q]i@ǁZOss-!caWVXef ,sn4u%'VˤNŷh_t Q~7ű{c6Sbn_ӗ} |;𧻓?VcPLz8o?]?;o@a w{ߌ7"*?cCeۓ7Bg\Bxcb6籵{$3Bi_5T#C Ľ xw.tGp`2r+x *\kbЮv$<-DZ1c$Mn3CftK> fN} F E #`k/ 6|-Fxyro_;1?FUrWۂrinP>er\d:vQmrdeg”k1|SaQ5E P{=}>gcIB>ݲ8585Yn/[pޒ$G! ! |?v2j'|sv\TTk xfc($R 2f3ÂE?yݟ Nd7{J~ !ij YXt$a-`r`Pj#,2 K6GY%8}ypՐ Qn(wPU stZbX4G1C7B6t6uCCɅ=9`2ӂvs> "̀2~}ٲlN+݅[O.r<.%'VU#q~ۺѷ]t'.+M"kL^/+kO<14oԟSN?Ytٟ'ҏA֏#o[K(Xu|='w.Š4:Q6 _zN5 +#7.]kN!|$ c"nD4#ybc_}l plS:Xbsj6:,PbvĶmk5e/T {ȋqUǿp84a+*Jiri\!Ǝr1T. ֤!6vd+|Y/܅?'e-|ZJ iZu57a[ x7v'eEdt ):Ic***B9mzs=JJkD?&g؅Kր7ulcX1Uƣ)~C?}A οSspa,eyYV)Ȳ!l.ْ#Umۢ y< uOUtHՉn Y B) bmf-B!Bt| |-p.חP ".hkCܑ!"&:r:t1|Q%ݱΞ)Ȃ>NS6emߌK@ߍ B>zZȎXW(gN,l@B!B/( X8NiI'#, AKPAOk2:vlg__B233zao*nl>*ԝ{= -_vR%MQx,kEUʒʂh4ihB!B(HW W#d Fi"Yp6rŊKB;a:Rs {)Bg`Ux!jI; oRi@B!B  zlG{;HkY HȲ} Ik }7}gm{hKP d$)*3 a&BLl4!BĆ1!Rf 0##CrX oK?[\ܳQ*gGx7𽛞XcƤˆ²O$B!$ibY,eiZ)e4.AɟWXݸd ^Jb& ]X/Y]@/}L!B(H![ npH%^:Zq_3 !FlV cl@Z=xY܂/,k [s;ξ*e N\[*OFB!BtQBN3cA@ d;Ni4oG_ *w ;uKL2^U29U 1cS^2|O6J$B!< B `Ң& 31n@կ?U$žZ8Ƶ7=D3F*} tP̛Y*YYNh0IQ0%y8!SEW.l}{6nڌ&d?iICMXOށnBߍB/! r!H? V X9<܎> WоAdl,oQňjeqנU}:<>Dz A*L2âx}.wH UU)KVs"lȎr%q>;)۹nc˖df%&A}|{ $3ς3;3g)?d+)Pk 8rPPHSw -i?&êIUDKHl߿ڈm>'c5}|~w# .DDd6>(b߿0;e jo'uW*Dcv?srЊlBoe`n$E3`'g9Ru+Pp+ᘯ>Hs){ \H|%y02E"9]"nY}/&|=3͈ɹEn-KІpa7U)&x։.K-DD\+˙Ƙn^v vwۗ`a ¡uջE/<et='mx3 ޮ> stizgn29 R Bh4X-d:S FApwy 疡ĉ3eko\UנڝJ_u=G̗`)ی EHrގf !K'B^ 4cB9F CpVl@U60Ԁ ±8R#P7EJi+|@%V ~p~{|~T>ac.#̦:otϐu| }IhexE#<$<lo R^}QChK?,#hS}hBi5׏"KGgNJ߸C@_f> ?ğ]n8fWDDEv`` ͂k^^^f`17@3ܿy+oZspu~Xj2PR CQ4!Ćע9x5RtA^N_%AcC"hU2^lފ*{LXΕ:XS`Wh$FڎX'UV2`oZEjX0"BJ@2`qSYzf(~t6d eX]D| '[ͺV68&ё^?;tnWSO`C?>|ZaB; SVDЃ+aL̵N/Hp~D쑿Wh<0Ae=yϟ|_~o!sNg?ß\LUR "Z.!/hv3$4X4#eIEo>΢;N=c+w7aSv_#"Xf"sI H[ǂr-*lȝ"`4:2m68^򄦽JF*Q2臧+c&T2mV=t Yۦ`=3mdrp[_1}VM)(&qVz/݁֨y݈ښOm#Hx~xN;p7Y-ذfer^nmymYpxC [cT6`mU*JwfaJK6 ϤT`-| "yh L?t\5yu[N!kQW㎦`U[BJm!|?I6<ޑƛ-`ܽol@w܂UMVN!<؊[GՀE զ?S [5H 89%hϷdHY WD3܌A1 kk [Q1@pQs]h:* +݂: lYiG=[WUyW s[m#GDDpXh$QO lZ35orss3A1|Љ`o P+7|1S0(;hf(a84uEM,6Ť`]J*:bʚ0r;!T`UP ֹL3.d'h:r0ՋZf|gVT]u==C f\G]_.6ۍ{g‡gE&wQw7]s$hiL@dmT!ZBA3: `2$n))sQZƋ{K7HˆWUX1h$"ZD`1@b9MbTy:{ W?m`7=:7o,o:ͲqE rzsY7cI FsX]Ɏ&JBV(֤?GjVT"x+ZMpLYd-hǑ19QT]" D&E$}iugzқϞ^ y 1#bPXcX8ՎƟk/no=1U>o?E\iѝ(Vn?LO+ F͇V`DDTd."k6>)2%3*S83i27@ fth"x#jo]J" "h$j]*̋ ϋĺ{ " aI_¶Hogr}cp>,X.~z |=8y Gޝu!evuu kѴ}>X?Nii)@] JVd%IquI_^5:aX hz0& ] HDt1x`` AGQU: iPoڌNVm#鯐X]~;QBp>l[=^wb @"""""M.Sp83ABD@*&Qjtt4( _bw%l[dLϓ 9]о#/<̉áP8бNk,-eHDtA@1XH?"t:\.2-/v{^~4pq~+>Yh|Kuühah?Ό,s8(((f_=?!eP*En+Nl/Dm~D( ٻ~>ߙEDDDDDDӕC2P[oyivu۫V&u]ayeDK\axx>/3j(^4>`\`8^%b+,(>wpt/7 ܃=B:_F`?‹%+HkhHrb H| =8va̰.#ZRT&(FA#C2Υy&{`+݆ @\u=c?4a=HDDDDDKkҕC( 3cO$يP-O$Si @ee]If+],gIDM@OerZ~^K9 5l|ޓo>ʒϓ>9M OhW*?%"q#M0F1"XR`RK.#܈Cӓ)X#g jڎa+>`WC8j/+hZ%]wiň<|k^ADDDDDk 5G4z0 ~E`F|VhF<E*C`-DR@H8nYsP nmajY\G?hc) 5bZ;$9=O`g(B3^`!@ .Or'|"(4D,FSn=t<7š=*15XKi+WV!LX!_DR4&"""""ZeJ%ny߄BzۓpUy-'V`(DmZbb`&HPz j 'q@g+~R gh5P횗& -e D>kU(#:__ĻauwH4aj-PWTi-NHxT Dn&¢FHrD2} F:Ѭgc5ބޞ'sށok$ׅ"[Q&txtu]ڒ|\RdhtH_}:Dݜ={ Ryy!FSOow慨(@& <'C>*>V4>=`0kE'PE. 0rkp)3BJ'3Y|y#jzViZ_zQ wOfs`\vwwg^ELt:χnI#~dGXM_! -o!t.xq7te {J4wvkʼnŠxݞDtxߏ{~ՋCO-DD4DDtADW1(H__022o6/ -.5q`:""6&"6>h4͂E`lZ"X?n4? <TaSw߂q`D뼦M e,C_.6y=nQ P4&Z8$ WE &O`-Dōʕ(2yOC`hޞ,|= 4Y KlN 5@hz) XY3.O_!B_ 4w{N)Ll3! Ko7PToLyqɟ/D_dn'pwDD4oDn"'ZU(#D8סPl<eU  =Z c:$R)X1ՖA@Z{-ЎPy$Z$=yGp`5(P p#2m|Kn&l\[S')GU`ZGLi(BMZ"w-;)oB=׿9U;<c&]A$"1D? zs"Prٍ"CCFw !k0MٞCMeE6cp@_6Fz")ZD&O50-9s4Mre6Xn*-=w& 4Xp`*FEdDV~6v'rW K`u4? Ng6֢Fgp™' uX]޷ypMc6]$Xj|> ~5p~d[_B?}37%[ O@HDt``""Zphf76TX1t?7V)(j_5O eVWPH_x\) R49i@A8bb)JY4׶dբAj8 gدE0۪xgM{?}?[ub3?)sflAO*+DDWhQ3$jуE0ШOa?0胨BE8d;)gN6 |@\RDbdۍ^dZx  ksԿϊZl(ଲ,i[UV<FߴB^PO4eJ&4i]%|x89w&/""{#""D 46Em/#ľOXuУS$1Zo߆d>5'8DSgq,vhJ08 v+6itN @`QhH^OOhUX'.5ao*i&Eo-B=OT'q rf2 %!4oGDt|W0 h)ax` ϱSV!؆Cv)fWgHY6Zdʌ|L<]G0j 4nl?c=z1< OLC"Ő`A{Ă"X7K іޱ yx6- ?U"[i3ޑ'￸uuOx ޻6]9V`C7.}VQf;*M;oN]'.֤х+4c+@{ n1I__rrr`XN{H I4v 'RfG={e-j4Mh:# @)Y |TdA;І#P+)aM5'i- Jz;}=eBrOݏ31n-*?5< ~ĿoGkI-{]Q_^!"/")IeͫYSB7UAbfMjchz+}Okze燈  Cvru5V,A1DJb0k$#7a,~^T'/tKy<":o7y@DDQ1 $m'2f=3r#whx {n*JЊh`SچGHp&' +P`01܊ۑSRLL`}>c24& ˛>!EG,؂B]&8!;q붢&#݄FDpꜱθTMh!R@k6An92 l?]hIBbzeeȳkfbskD-,VUu g_C o.Pa;^+mѩ"G=cuWp[B3~wT-n/uxSnx70v?zzZPZr_gh9ch( TRJ$pLARy`^\y!'&=}h+PpnpLBcC"hU2^lފ*8 ~M%@ cu0lY yJa/ZbP;ZAJ6-GQ߯Cay5* x;NXtnojrЃ!hWƩb!$Spӻ8ާFvjT$D=hmSe6۟!^R4Abbs}HcיNgsOV RXs##a(,%0"\{?[&~|+m|Z^ʼn_u{#~GbH !?"eADBz;-dZg\  KRҘ#9B(!h2a8٤Bpz!.½Bo.oM~ pW-KUܱuv#RhB- :#pT֠ĭάa*`x_|p86GjvX20e32̥5?UcЦBo#s֧,?SΏ T~:Bg]3c9>,CcѨPs Ԉ8r5@r2 燮}zsfX'E^bݧ jΜO [ DƏQـUU(ъO"+D e&""5mƒhH8B EB2uUG PGj@` H9OIQbg,y( }C~~.\ ˃.vj0M̗l_1/&0nMkyiy52Kj'́*?eF]{x> `XuOuα3iG{4<~x<'0ބUGhfr \,r R/k)eʵMZ? )* z Ma9j>=)4>~ &NA?4Ϙ01HFSD儞-Dr)d][8yO"{-x`vl{/vf鐈hG<%&ͨpIbM?FKNlzX"4E'VX3s ^ эOr {wDWXt̰yKdDU74 v]?88 cB `"N,rw=u8r?‰zZg2bhgK~:9瞟 > 0%tw˜#"]ȲUTc8>6pӈHҀ2X_͸Ƨ+]q/nX::@Cx>"'!u& ""h!1pl'"bw↚>NrxG (xh(J#ܥxD1;$"bAk#c[!,gEjD2¡&*F]MGj}u[1r ts#tbtHy~K:X"Ē|s"bmz|)o%6W6dv3FɢpOO3%HG4+ ȪX&[X[.|?ւU)M&ɗl4ѫ)L8!؇BtΚjGj+ ,[͟ÏD}OO,_=<"+ DK)΍J)+pw|R]xz De(&B>CT0RIy^1ݾ4/A^̋Kpz>^2R˧@DKD@'hIun-ADDt1HT(ztSFPүp(FJeCmx$i1ݾI\w^qWZ U4ȹ^˧%@DKB_h HYrM f ѥ F `]s+vCxŒo>1rS=e}hnƫݰH"d0Ø._c#5;R)0ebb  uK-g_x4>_hyDX(ѼdE^DR$y('L"Ȭ0N`ƍ_OHS3U[7"_VE {0cڽۯFZHz|Cn_% -BkP! 6tϿXE̋_̋yg[m/c_jR'4uJKK@DDtRՙ;_AI QNOSSM X] S,='L 9>'/y|b. ."b.c l1H+6&""""""""""""""""Z$""""""""Z$""""""""Z$"ZQQȌCDDDDDDWBDI0mEËR&ټ8D r ٱڦR@vqޤq q-[]$v7d Ѳ@۞NBȿNlॆ0,[Qiѓ2Vm)G&$d?:~zlC!"""Z6$"Z&-)AJA2`HY!!ɷ7]ۘǻ[D8E]oIYTA3jF~q\)5aЩO(Ѳ+1eOS#1k]Hfy<.Ȉm+P@486~յXdB(i'"""Zv$"Z4}$d@iEi by<ץLSa.~oͶ|9F#M-#8\y-v(E0@0GB4/\p"IBx/B5|'H%+kJpk7pulN;=^2L:K¶ 6MO[PG YeQnV#Ae2˼'L"""%gDDAru< 2WRJz j0]8WmBY:ܼ*7[ 8(פ?;ʰp@tn^~?./"""%@""",CIws!$H$q!.a`\(}Lٰ"`mb4n8oԃrȏIIs4ȭEebNJʼ:sa0o)[2}ayδ""""ZJFDDD4%_/Fw kP !\Ӥ4\ *74O2 A8l \/2@4<.zZWBF(3`QS"Ϧ"E0GnuOD^OBEK=4nqyVxI}Y쇈 >-yTj5IZgQp앵44'~#LYʵBƧ-? `WNl$='p) ڈY쇈 <5rnOOx:=MSTvLm emkۚ~hi`-DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD˘Y@W~iӦMsIQ<? pW knB閭('3c+֣(r Gym]Oj53.KHWKV5 u5ݺ)llUPf joWC$ g⦷(3]r=Jw o+M)IFwO<|x; "MUTlve(EݾZ DDDDDD5Y~|7te`uMwce`9 voB9s3wǎXvyt}~B#.ː\2{ pވ¨CgHkk>>aՙ{*}EXVcnr*ː4A}Q:3qۦuJ">t77{JznepuPBh{)lҢSù*\SS ITx^GOV7mɫkt fi*U:_ݍOxxw~׻'ynmmXbK @qF?tϛ7ہA C\N(Nt! b:ЙSR`KK " _ FP6f+ݼv3i,w_Ʈ@FN, ,jlށxwҦ [a4-yy0cHȫŶyiJf Yv`G5дo'Mr(y &nntHoI?9T]X9s+ˆce=8:0 I ^DJm[pA4߇զ?=֙1p_y`[7"GVq,f/b)i:ɾ7\]]x#ސڬosf<=kCW̹Nm?uN<ڏHm1@ pp"""""Q'?kA&Qv$uVѽnCK@Bol Mcz]"w19ӯk|l3 ވ7{_ۍtvAn]WcoG"U6 |3>[Wb^v;dB]?yz/ <~N%#,&"A$OϲI;8BқGK ЊNtߊ33eƆ=hO;p݇,־ۈy;Ooc,NFP*{ί17qMEbz'8m3uIT!"}dRcdDO@/*{M9AVR]'uЭ5[ʑN?9pȃhHHN7ε$ŧL(2t%ƺ,Xv \m;!#BmxO+fMO8O@Ӆ>* DX[; IP uЉo-LLL39y5(+a.֚Rd P%Hj6V8w`{?wqם@Px 5y=׭ȋDH_%鋄(OD`єmjl^麈QZa7*DDDDShdWFKPY)o3.vګQ^7C: ")<w-д[&x(i8 K{ӟ<Qh\l=0!x*|e)N-Xϙ)Dݛo^a/vG6Tp#JoF݋3Uq}Qy:xS9@ :L͝DB0`U9E~/@zSW* Ft x\9U/<珆Z"95=if*LH_tXGczZ:q~zFL_˱b%)ӺPbf0hG4g x|~y|ۑkv_r"+kҕc>J~wFf:F:Nqt6 cV+Fq /> 'Q]^z ] -}m8ڰ7/f'N&PV^ +ڎ#u>Y{3'qpTnB݇o#6.X_DGGyE.9c`,8 *б/ރc  "́e\Nɧ+7 ?f/" [KbTÁg")8^4[Zǖ~) V<E"\3OVm yrwHg;zqwh[ 疡 mfqM h"DAy ,Gʔoƫ)ԍm1܉x`\><gڶmƆ"="c/>O3Z jJLcN[xYTFfHKhA0,i؀-$9f2AmMz.LcYIǔ?_nħoWl6Š+Xoj۔TRsYQXλӢOc203-Z%{2eT﨟*SM}`4vXR,(M?kDd\}6Osh9iVQR^q2FTW{;Tf`p\Y Z:IEs7ש`JTҬ~6;n Idy}ƀTt4JNV(&Ձ⾇J{A4l(9TB3'٣6x{ srgq+JڱO,&, X+O-pem8t-#RY!3Y<(8d؎Ǽ/Nl?;+nQTn}U;yq8"Ӻїޱ؞ =O1=cH&~jM|wV> #1\4~//=w37r35v궸<uu_;'Wn☛IKf꜈0h;QLJ"Dխap?@3#3`AųkݍkA 0Èw#̿ 4wjDLrLX,aqhKbWܽ1f٢/3`h$cFKaC Gյ}Ddm1Grf1F>!"B񹛓)`vT%%8KK,XL*cOWD !f" !8B7Gw!,f{]{xF"/#p7Iy@O;~gAR\%I D/aT\@@Xަ J+i0aphBƎ)Abӗq:G{j=tD7[_J{h&mqΜ~*!Kަ~]jy3Q>]!f& !8eΆC!)cJ jW {__ى F?%&b]Mq͆X(6 ,wWs%n6ٳ饶r݅WsE{T&ZS=9y$[}Í FeMiCWesڭQ림[` `wÇ<0~|\!fbzv{|Bg}.;vO>pSUnD'D<uqMv:<-PZ4?0&Z{rRϠ_3-ultj47J_qTbfK J~A9 ӵ|_ 5i>]d!L%-B!͉ӡWw2NAt}  &jj`RlN׫DdR"p]L4\a_ɁL\?g`4QX- XЇELmສP H\\7LLsX&O?ñ7"7 ܏qi m;|Ғ1|z=;}k!_, e(|BPB!vTahkYsF\>; LIds5N49^.*'m?FYE1 c5FpF25R^{Ce*)p""#YHj9mZWu%)w;Kt:QN.i_y߰DbGˈUT(os1_&3 nn_6Iv/,-haBLI'qHQw&m $ջ'?-ZA!󤥥ɎB!f 3J捯}+ho%'wEz~亹'Fr$W}m IFB!B!ӘB!B!$(B!B!4&@!B!B!1 !B!B1.B`0pՕkYbx֭xyëv!B!B !4 ̜MZF&KyA4z&//稪zNld$B!Bin$7/=W`e x}_52[|}^` kV_Ɔ^)B!IP!UthA{ZPie̷Lte !B1uBij vw5}!/#E9`VΕ@B!8HP!a.]}[ n5p@im%&[(w>aeYk_2VWLr =>JAvbm#B3.ltI[v J8+|[M &w]|{>?uP#<-޷4<F+\KCEIo^:!BDZ qJ_v8+x '*>k}B@PVXM-u7~;>u6n&YE87:jo55⧸O{[m}}GS8˟T{W|9y{_9+߸8^x.-BߏRsS[=%9kGMq^qP}B=2_ 3OBIZ 1/r!_)|zQʐbF0!p"?_foнʏ ͦXH_Ҝd"5zZ(ڹ5=cF&ʣh%DX0蕯-ϱFD\Ftjo;7N4}iM",8^/p.yE!4g5W,5FmV=.,LT{wz=Ng%y2f&X)j!sǰVSi=I2Yz'd$0';+vUj__~~i!}%%svs|~>5s%9QO|$㒛eqK\Vr8ycc< S 8,K%˫I'ص/m؈\r~ם6];' 2sU[J޽8-!#5{8tD>OEo7^:';-ews^Kg.0'9w8zOroz7¿kWVL geFJ! h1MV ΖDdǺѹkYWpwndG+^+b|9v7:O1O 1)Ʉa:lGW$ӽg/VvCP(殁@? X ٸ ,* ϳٳ-x/ayl,חc$J3P{36Aw*&▬eufƶWrt>*s& >!A|f+mFQ)̹:ƒs<- z+ʥ&U_CEa`mv+yDiT$ 0~~9紌 qBWe1a͉V[JeK2s#tVW?űA4Tn HEu7i"<,G**If, pM@eMًI:fѼ8mDFv| %<ħݭ9` U`'`ݿOj'xO 2+•IwL*!3$FY X`n{b6wŵD%s2lZW+Ɔ觺f;47MpѼ=m;mPy]ͷYU Jc[uzDz +{x~vsw{ D.0_P_; [sW+*w %,JuY6Ꞧ4|_+$%'<׆sT~k{6E)288Dhw=x#&/|Jv:;P^eXZN9h"(D#mt`DshyhkgMk{?Fkeh֖. ǺmthZ,XS~mT^3pǕ!kv{{p~ן^N\~4.BTgX!&]|snLZ[-\(E7Ӧӷ-D߶]1yuRTZbqny7x;tV̈㬷*mZ!s]#hy /j' %Pƃ8 tAW|[ݭPG 3[nv+hLMvb,ޟWР8pͦhR,.;H_:q`Dy.)?A2J9 T!0͂9PUs=V:Kh.`B\K=+PM;x48w`_m ?Ɗ?AMCQbra8XØ}WMzz``C\"q;-JCk[I=Aʾ#;Go>)\'/I`⽯ }=;<NIb0dE.}vm$4c!ƣbCaF?ЁJk|Ҫb:Ќ~c1yGxV׼ǁ0IL|(~J )4Us:ȬPi#p_6قUp_rb/\·֥y_yq /K?t!&+tJ %W\hѢwλK|n18ikNkEU,$/gd"W3ХJ!0i !tO8דY(\oi2.D3,xуb_ua64P)G}Jgg'v+ii-F~A'+/<~?g|[$(B8H`!DY(?&#AMbI61Ch]q6l*L$b]w Y!i#jM݄g`;yW_;+p}C q$DIk!8$(B1}#t`^MMGC[BN:pf^=衭{j?,yeų+jY|,.\BUB!qVjOGT~jI q~]>5Brx?IKQ:)D^XwSz25vٯN\lR<~V8nᗟΣVoWed 1FwTԷm0G9-XU#}*)H+B1B5wo7GɚF<(ϼsVŬYoS^nS-̼|o(+o9s/>c͉D:kpIwg?[znfW7Ör-/˯'?YOs޷x(_Y7BLB!){s- DB9"u_ +' GGS }dbR(Af}h PU٤k4TPVtմ0$?h۠^z# $e2Ak1Jt}U4㟒C~l=8(Ӟ)؂?{ͺwDtqٿ_>CKUIh #:rm%'K>nIp`u3` (T2dqBɒB`7MMBG}M+s="X>j뺉O v,r{0"BNz79j)"-=T4dC'm>"I6 eg9mjǎpB]͉Rt>QmcoR-sкқ]>>ld>ͻwsCb4x>#Z׮3g/l&k޿ IJ=e@܅bN.D+fostO&)B1IB*ڤ$qzeYDhįL~2*, {:O@Q &m2fv s#,]G]WqsBɒB@xxl?UW|kOܷGSlߴDK,/Kf\RcB4uPW-{=w!/'y>NFO{;]6)llю5uYQ]l4=DM]31)F;\9Tӡv֏1JńYߴޞ^TN΍ JFWF@|a$0<8bf_ :hi[EJj $sOݟ<^'cO"AEJʤ+}O->$WyH#c_?ǻ{ܫ3sU\!w6o&t;s!|UFvB<]Ⱑ9(t7P!g9o5[>0kWan7&=r~/Vkfi'>ΖzVbIE[Q[hOZކJjhm1Sݎ6Zika5+Pl,hu>.C_(o)YTfWzj:Lf;:ЧuyLo)lKj_ }.Оwذ+AEQ9v&\kg~ƾ#E6!i)&=ϫsp3ێvb0 /ߏ˴K=#Bq2#BȪ84?cB;77 ܋xQ3VCD"#s 4+ѡ%fpX(*(CUF ap[sȶϬnӘG;cN'*6*9P z#ɜLŴf&c'|xѭ{n&e};zWM e,h6c -kvK_sׂ @έp>7O0$\D;(Wpƒc3G9]BOex?>BQ5M4 $iUjI~+d֓@Zh;8^>tUfp@~P?νo1Y1,A|?a [qӡg K?U9706[ &9CfFb\Ǻ\(YȱV^xݍN3.֋x j(,%[8Uƺ^>cSOq6rwiubG?Ljs< uvg![7 ?Rr˼Dܲ*RObJEU{uyd !3乵捯}+ho%'wEz~S';}rSHC !Ly+8j6ʂK&K,tyo?b;ys 5x\l.!'gk,ڪرY$GN,F7| oȾprAU@ q/(c0&US"3R[KϦNfٓmV=u'!h"vd?BηSVGc}! 8@!Bqz BP.>s̬_ F#Z T80.ǯt7{YcoLnbRg3'{kr hos$t PP¢뢼ç+r;u=$SMe 1V4NÁ}82HUhPvPU>줖}6@зDȪ۸sc0h8^,B!8eBPlavFE>'>s M(m`tq袾dq8-^ʧ2ʼ:ZՕ-,J"lbV\;K%9JDDW%ZO!do+7Pe6jÏSOB!E !ČГm\Ip HkV p(7:+a!hmM8E %!.GS#d[Y9-d榓SCuG;(:hKiVOaZ=//d`7_OL3}u6IO!Bqz$(3pt:qԣ{" 5at~xcpEHaVb"IX"0GMě_mDfռSR8|}RJOVYNM]eEYI,[k sRVOcVB  .'RB}I 5M9 stle&wv,&T!Bq BD NgxYe9i ߹=*b0絏W/0yX=7+wjh 砾pY)W@oK%^ξF!J :fOَ2Je8Ѽ 6dKsPKs"Rs+/a4 v* (odARV,SN펗xo9+X^ҝ# !B!N (H.Dqj>dIH'E#{PψqN YQDk8kӁ~{kZcuFH41}<_'++KvB1m: DZVrr\gIN(v5PrujoB1(hP3j<†&;B!Bbri:W+Iq3P1ȈB!BqBP~ƂB!Bq^QB!B!$(B!B!4&@!B!n&vWZ0B!f6 !B!tQk'E }2BD!B!7Z_5;{Bt.K#@vBB!B}G3=9ј{[(LB @!B!8oSjLH'տ vq4?]߾\Ʊ7ci EYa9[QKIڦB3BLsVkPZm5gSƔZpD!P,,V?[(NV g!4Xл;OA]w %iTlzfqͧcѳuyJRj5wh%W3}1lfTmeH4N:vo|dʨB!Ҳ PG޴H",8GG}9 wqoh]X\x#j_;RXE6,ekṇz<>o;O:V$-gd ػ8i;DI‡YugM`cɹэ9mcjj}lz]ԋ>úL4SZ. N7eV[<Rrp_f}w{O% -KH]̺;>YF ;On>DeJHR'"S'CkY5/yq~F?y233}2RB!Sh!&y$2gv=%8H⵬+;7g/fk1'dBqk6Ō>Z@Qykl:څlr5d-3ؿ5 ,T9#y'o݄KYl,t\'~µL=OBB6nig%an˯mzLx%,`KX8y97vڇ+"@60ߡ;hUOL >h-=Qr¡?_:m mߨ?xŗٴb181a _%%ǒgc?/+\t$/O9ӬEeQmɷϥc;A᳏L$, [.<;MJx'_⑸\vU\jQfz:dddp}]f57,vH!b2LҐ] (0B*MMnRSY07=OpZ{sz9fckqܖ_vZZ;n/\ [^`Ou^Ӗ`n^DzV>Zv]!$/hjׇ5YQN .Z;=he~,Uc3ZxѴdń7sbq O U?V ?~G'ԕ$ {hx k7Oaơ`d M/l%+}bQRŞ.ú|?ܔ8L|2Ե7Ԑ|vm;Xz rWcq͇B`b r3]6 fXheG[A'Zt'czc<^|$+W2'\~Ҧ7-~G1e!B!HmIVMǩ*aQDuQ^ک 9P3gJ/DȪ۸s'14AQ.SoWI[+fwkHύʯ0oN[ R2mXwˮXb ]w8qԖRC>˭GCU q%e~eW_ώZc*?!yqXq~*64?o.B!B 1IZOv"&.Jvz2xxE^ĝ[>K~2T4%.dǑy#ŭSRU*;I/B !!B:bCPP슂]WuwjWY XQ!t @SIHH! 0{s-wsUdSOtko@v򮶷wvj:W@AAA" B[-d%7_>!;r((Ǫ3Ep66gN 2gq5`NHzkG`X(MBytJwQIMy(c{Nsb=:@Œ5-+Ǐ#$ M$\GκWw\jL*)| '3BǾf2f=zʧqm9\9J6{K=@~E蘆q&.0{>V';CގYFKTܑ>6giuyy۽¦ ~?[۽2tv4-yaFJﲸ(tfAtÎɜ#xz \y)+(ܳ7R8?sϊrʸp#)qY$ *  p(}@?d3jT(&,q4[d-gu*gr/4VeZxfVN1LG*s-ObDtdriT2GO碉Fm\*lq KLi.f5dگrMOgNþV,ִLŖYeČ$@]i1K>[9cI>-Xw~_Ƒ*R'߳b+eθTgw\o@7%ft~cfײ&u/D#_ֲxs/od^RogJ#u"迼uѱL뙤 Ʊ\ñr#::u~^~գyHLl<n/@PAA5]8Jr l /&LXtn^ #Ů*Ƥ?+hZ ` /xPaTU //R!,Ypv+m8}R1]?Pc5/-|L>yWfLML{\,{9/})v p" `o'hcg={vYqz@1pH=NP/Ry,pc[UZ삮D@O͵ BFtCx2YFOqW}fBә&.S[^Y胣p!({w|3a]˧aF&;kXg)bjV}8?+'L)#{">z'Uv'r-0+D"  nyJdᤠ1']3R;V:U@5ӳ BL~;-ڰa-{)D?fA,~7~uIFW`<j9LÐcq>$̻G#qNr".\KPFS3{xFp-vskzg&OΡ ‰D@AANm}=eV8m0bEU\ Tf4ϫ6F(zSƝ\G)">P][+AhZiiik#CYF1kj:>\QLUOr1Nh,z?̥?Z՟RS<14#ENeR3{j}A0JSwHF@F>qwk9H-ϺI09A8(0ٶm03ϽVpMD-y-˥0t]^= 6" >>6nXGv1 q-s`}ɵƅ }o131uhHƎ 8lBRʅ\g1L!35M˛Rw9s~륵H#^s<ȔosE>?] u}.$Eя7>/WO]$M&pBQ;pܕ5z'h^A ^|#q &|-AK^}>ILL zH[[Qt*Ƥ?+8BW:+xtoA'&AAAA    0PAAAA12 N㒹s1}:fs;ԧboAAA(0Ŀ#ILJ& P@@躡ƍK'naAA(0șslI޶33y2Ә0tw*ͺ~&AA>"  sf8=+#x։0x1Y˧h0D   " r~(hvؾNⲫUǔ<=hu888H(  @@AAy}ߝ=Wb?a qC;sz}OTAAA?" r<&x~{{p<u2   A9]j{{(VDqAp[} v}=5g5󷳆Z˚o-8Z:?Ē2q&W]=Q!ߏԦ"/yƁZDĥ9n0_GZ^z[Fm&B#IH%dJ st 1(CÙ||TJALFMyIchir$U|xN2׏1 y嗉pq$''uQն U<Ap8PRB4ξ&0# ވ(}\2%=?fsYkۖwS>c04T{Zjp5gOf_G-#NToP[Vo;B3q!W)cgFv4 !cfqX|؛,盬Bi1| 2GDbv{.}&2¥ U1>zg'能 rom[{Ufy58WW^ukQQMzG^{ z||vw-)[K1o~:UuqZD\2c0*4uZvRT*9+u7 :tA=jN}nl:/Ys=K,.edos5jd FOZ=9bg||)X(ߔn}k|yI\1T ^ dSRYG3D^)vyǐ1{1I;'w~FYYP?Aw'Y}u5wB5KOAJA„ ZiӦ޷jċ`rװK눞0'ݰU6r"/~60GG[Ͽ*;ԩ> ̲XҷY{'&K+)DLj&S/qR6W؜Go,am4xOo&14>lV~{ňZ:vTq8WaA#uZWŗߔa !.}2SgٰMwoRj|*:cg jf%ױuͧi01,}.JQ?M jh ec3n)!< U|sY1iԗ˯r ˜H]qU1s~'>1eYDkU Q>(ؽKMD u#fY%EIyS]ij>9o[. 4Xrh8w\n٫k,4jЄ .VH ~ 6/]ZZ L =?L<ANq$D %h[wJE{iq6\`4_͸qql G(:\u čs"-#|QQA(-m ֪b 9*PŲ|Z5|Of7bq5)CCQRUԖ+ӝ닯ŲV(_,SH# c|%/ceUU{cZgP2˿ d -ӮjxBj,ԨKMed&'8;E6E[akiNxc%%,VQHQ#0OѝV1ޫI5ُ\Q7B_ ?lׄ5t.ѣ.ɱmkشx8fMfig}ۘa2֩{#yfL (,pFӼK q'%vS {|'>V8Ɵrp(X&GVő1DŽ'p 0hу4=FS ٧#5bEHqC QRv:BC]|ծHM_7PXm4v0[Eōͧ\ɔD"C6c3PK&uKv8\Kڹ./~AM uar {qC͎t {#w~u:6kpi %nqOu {?}͹IA8g]p p-kwAOhʅB&8Ҩv {N"y'Ҹ$\ie<>z1>;>οcCˇ#֢}l gbj:{'Ӿڟ0jjZ&C0:g7Ri(䙬UyQtN]oP^YġqItmdC$\,?6&Xt;~7̴dr ©[VZF5#]xtưuw֬9kYBI=& }͌ߦ(&qiwxҲ>eF/>Wi#_]qrֆr @ծުU>9Y^sf{9S~ 3j% eΞ4?֫bFZlڹw6̽_IP|NM؈q yκmӾ55ըXSz#?6OA?UG51]uYA^Jݣ?+?lkg70}cGy;mHOy H/(A-C5萮wr*mDk]wڵ!Dc-/z ۮJ0ت*qc#ˡ*5ŲC;Y|DOR:,x^ܳVW`aQk`i Է⃽]Tsv50t|{$Jؗ9͑۫/ Gԫ8'9}CSi_\G ^N>oOR* mPwnŽx h4Ιo>KG17',ŞaWN%Do6ϣ^}y (}Rjq=%=#K);|V+%YYn\ lY-eiX.|I? =-Zîoj6\әȗ 5-}3Ɣ`_jXj+DND]ufo'~Σh} ?ӦdERGŁ Ӱ޺6O+X-UylXKkHaE7['F̻Y`kv9Š\U_,[K#vC"IL"zd<E0ldF;N^[~ /} ~]p4%3VM=cGyv^,>J}oL~ $drrYaqTj,9i򿷤Ǟ;~dfH|w/vvtTW1&m9^As=%ϐbx 5g"q<yN ,\W_}n jpOy*~ 7Q̹Gn3#tBp{Gu.:1 i 猽I9punmv!P&Cb0hSԺ5o@]AAA3" Zɦ&)^n@Tx+" 'ERO3I\.UQSs*  B@AAf / ە,IAUcNfvtΙ]PAA zK  vp+`*<q)hWm QJ;ӹWn=L " $d_zO}sy֑E(  @@AA YW?C2'N&*25 c)1׼a ^yuUϴmGِ-FAA~   jeћo313ٍ2(0P"h5l߱ͧGM+ ™`#%" h(hSA%  p    E@AAAAAĈ(    AAAAa#  p|MÍd:@ae˩?A8%*v.e[,u//cvAfA8t\2w3OlCQ1pZPekx Z[[ }((ٮ`äQCWԕS1ski҇? DyQ5QĚP`vcʀi(jNel^xXCϰ{xT'+jde3 jvS?X?xt(cw.$BPa+GL@@i4qis@7F?BBB\C "tfXFַJm"?%[TC< -M0 V'x$2h**Z(¢G02!vzU]>)ElXH)t-RT_W-@MP/!Bm2/y57*&GfeB9VfssȫQ"=pbcݯFr&SP N_-JMә<"ؑ^őVu*ن7DLr*Âj=y}M;z:ww* Ga.^M@J%l &Zy2/⃯wRXe'8q"r ]q[ݔ4HXbh;l=;0.Hr;?gFY]P i3p阻rR-ly_²ZZ}Bx#0֩=a'RXg)bjtz_~0٧y[Y6&AI18ۗ[_l&Z!4>Y nⲱa{;[Ψ}sVᵿJhcI>ZUG>vlJ/JWػ*U?h C8a[L~?%MK!;kn#}QŸ;~5S52>rng|r+VWtC5g뼏 -==?n<=7P!V-69fcuo4p ^; !뗚lV BSwHF@}yEYW=tGć+wl=`(7sϧI8G۲i|GqmQgX&^8qFo=9GXW:}{cK Ϥ ߮ay (:ET P[wN6SSӞӮZv]Xw 9PPFMc36UEl?-ʠG 3~jbHpc"N=!/5ڍ 1 i( ÅoE>^Ÿ>RRҮvC]]S'[^/lVBlf& JIwz[h6`hܶWu.8_.S7O4/oJ`b{h֣4ȶ޲lfbУ,[[\HƎ 8lBR[7}(ЫrwcK gȢ֧=x[ '];(ݕC]:]㍵:f~Hqu^7u'kwJHF rHq.*΁gp{tUn_{ř e:}B'}`<4M;؇> !gXo.Q.Ww@8ک/Y{G t3o凷&^$L>>:BFQ9vp\KO 2\;[h{CzSvӟS|G+nu{;JQjG/{\DSe Fy` }kޅv];PCg4k /_X_sb!y>Lع>zwj(]ec&:3#@B]od^ghU8|X{k߾KWTG $q0jdҵ0Z?hb (2aan tȂ[RiuJ-_ʪjTzB.i1Js6i|`{n'lD巯6; yҪcKKsuNpX,X*+(->͛[i :e$C"pPطCGj8VV ~PwZgF[Ōle[TFV/h%6[J"*~(4pܱoJ+c?ІO8q;ٝWk^4Z85y=\Auu%G KܝlsD#MM`2+Lf_p gFxzv5I̝9e_ynvdhԶL䲋c)^'^xkm9i꾲b Gz$` }= ]0*;׳H#>=WMb5KYi';Vfo]ڷoO f;o0 ]NԱo-Y_]c_4]6/hseT>zD6=z*{_MKx B&οݞv+MueJOBCu5u-}ں5ﰴui5󷳆f~KUC=Q6Nik.< /bky>st 1('}ISnn./?INNvSOuϲ.!|| (Ulߒc0GZ0@ӿ2xN8egQL~ x[ y)U_S9 88f8s'{3MW.oacqw{ R~!~Ͻ~f.d9#[/oz>Gf0.Ͻ>r~t{.?Yߗh#XWzț2\¦/&22e[Fl~ObjrW62 =]Hy"2fʱﻟ?݂.8)71!>a_su\ &.Ov78'G_DzI3p"&kpܕR :\|lS &L)c.dVV/Ug?4iĴl%)9uL~QeX?7q ujL'*Ӝg|fn:z_>}W[G-f}:Q)tհ/~ˆi#z>up?Qb_]s*ج_~`jjj;HNN:j)83{7W_}q" ÄO&)X =y$aEQt*Ƥ?+fiV\=WoA<4Y())qu{fL32(R")9G낈˘BFr @<]T%i9LP/ְ%XCH4̑ԕVhCmtcdĬyf +sMd^}ɅKy{CYH+:m h@mm_{~36:"]SJ x[~ݥ{kj;ä]&}>⪑h;޹ͯy䖵3 nD9}F~*`MG3p.^^eѧU+&dpMqeZ)XXuKRK??_Bo^NE=k^62W&2AA\ym\܅GMYl'qOцW崐?yw Jki12'5XY ֽΧvOd̛b`oٞWI ~UvMo]zW_Ŀeeݽ=U˂pz}ԗFd@izHEA! '֦fGd jf%ױuͧi01,}.J۫)0GG[ŗߔa !.}2Sgٰ86[طKXD1{ξ8YZ#jm8SV=s;@~7l.i$Pmc$CvTSVs-u_OY;T,WŹ)$NMTDtl1p?=FpX_oyuf/{bz/zwR^TCٍL=һ<^}#))g}IəV-2 Kin>b̨Bd$nAAN"" BPPZ(FOEpc>J(@7>l&0"[ K1ۋ)n$ QTؑe};k] M9)Wh*r-]7MKaE¨޺U[*%4|tv{{c5U]u{[{cm≧@[+rH5_9aʃ̚#|\53ɹn|Z,-EbMOB1LfLh?f.?D9ÜpcGGPk-b/=|BMN*,{k9'UBOwV%2ܑ]6̫ #ھޫrlwcڎ]~QkBokشx8fMfig}ۘa(=}\6sy:;g=]EV@xR#%AAnP>a&=Ui,O֓hF1>F8AөX]kp55aWA 'TWG^I3i)8FoKP4PPT503"z@84%Ҩ\z-r 5GŲ|*^q Ξv & EFiˆryz_,.s\[O|e(cGygs.['{ǽv k(YRYLmZM|֏<*ҕ-q654WSX<!5Kef]ߣ׷^6>>Yފ   ؊7>CIlTpMMk6c6uڠyu)uO حcE(9c>@=ɀwhb{`m4xébH074{xl8d2H߱O?>?oLB<Ӭ} 7wrmϵ>%جVlvV<2QHUSuajC2w춮֏x{`sC<AA_(Fp_mg3CU='g1ӞMNIvC ag>Vylia^#>u،x]jץk:Ȯ(s&Z9h$NBytJwQIr(9βun=Wu6l\}~*C#9EG9[&q^K0l*ŖM$+> d +s Eu/KgGؒfĪ|.b{k:NoTwgKPң"I0ŵ0#. S"3|R'$N&(#3s~O/{+8/%CsE{v2~"r@&s>s?*IEPFs&'Ͻ<ۮ.m@G^@SٻYR/tL{Ntjggv]&:W`Ǡ  p  6ʶa׈KɘOP#>mJ\4ѨMCKŁ 8g4c>ii\iҦ-y[U)v9S7acLVjꜣw`G7|K8+]k5Y(:un]K]^S+jM_o92TB\^W;|sg;:yzl@"3\AlpJkH঻/!&f$_K"ZOBpxKr(ξrٯ|]c_[kU|BJ6uoe?糰 e5ILCEya2g;ip8x07-"((Znq!xt(`0dby˫8)))rA fH|wv.訩bLsQFvח|# ]~#)Nw^n@x+" 'Gj Z<5.  /tbAf / ە*AIg<]Ms{WF$5:,-jPiYA84M䀘{ B@AANm}=e-5тk=ަ~%H_:]kVt陊Y7Ukk>]ŚUF~hKսC哑FK9uV9 Ҵ~_-2y C rmہ9s/)8\i-8t:GW[\ H=͹֑ ^+%;ֲH36n@Hx4qM^S j[JIB k!+VΙNhTcFcpk^n*۬.|,d`ۆ jN?|⨋z3Iq-s?{Fq=IwN1=$!!$R!@=$$@n 47}~Nw*trgvw훷3o̐>j=t|[ob2Z6IxhY0ݿo%lEXJ6C,_~,%<|s֥C?mi"e)\zL*ۿ}{бyW>ESqE,4NFxt@V>\63[?NWgW]^s" &8x]w6)gq_'5n)z'c`/#K%$PV\]̘5U dkÿ Aî~ۗ554nT h\YȉAwPWYVjd&*!&gRۇ ǧvnAkHلutѥYJSgy_@kdBF+ʶS=0G\х&c&y']e[Cn\4Wc73+_.L_zWk1+X"K!蠩cEBlp"@A#=Ϭ(D)RUٲu;6lT?zk.2p/|QC][^ 3ȴ k%$wiw8ȁPI,e}F},Z~mc皍Y=U_[A،EDhڵ=._7NGhd2iq:hv՚N/0#S?V_4Ѥf:l*mA7Kav >wT;~o qejv؅jdպUDLt5X&&'$,.y:)=6iIф2tHݎj6v6)&y"||EF2䪋w{eM1w2so y1k0>y7vN{A 3s"h')TҴ<1S}5Jv2OZ~|<?GG# 7 6~i's8Mevy?:[):nXjL.>{+gwpIakxw7jU},wUwK?~{[qsO})fySO¹3w l/ݎ]YdP!ȡceٚv&_|'$h@Qeq _΂W DO}#Cj:r YSBL4u64? څ\LqwP]%s}+eGjFN#,ɅV4}Yyu r'g`ԩUt+ELӏ}~ KiLL 8t!phIEelҁMܤ#[4RҢF߾0jqM$;jets1>΍030l3$=Du=H+h&?ai38K8 |ew%=='ESdJβ̹}yw|B4~w=&`x!NvSCdƯ4l^RS/.$t:=:ZGn!_dG~L^r - &"   ߡ@lH#v.pFiA M mf>s6]BkAd\:iL\rI&NKGGϨZjMk$*6LVЅEeb 6=0]Tkdt,9o>eCtb%2j$2Lc8^r"K'Gz8Ki>1tnՋ%&fhPK/c-GLR"LSfQ-aݦe&`}.껸;?qѱA۶4XLE<}5\ve\sll{'qu3쓃} Ⴜ`AA8L6oe=T a1dO- 11 ̍Ϣ 6-Œ5y F_Ckiŀv;XP\NJOs9t8z*zS6(:ގ:mCCAb D%1dk.b[$O'^K|\.{ gp 5=;5^¼e\y[yhcɻGBmk+x iሷ_5=jdurzt%UԯP7t^Ok--4.AllU_rBBbtHbNg&'Mszӗy~i4}[O>m\ kx.w~6zPrGsXȲγ"K( p .Ѣ %DMT:lx#G !"!ӷZu%;GvWp@Voh4S:m4H#jd*|&[0fyUrYwl{%Q2ٽ'*&m}1!{wZ(р&y:9Ѳ0ǾCgK}0zW^"?W'(:c .D8C5le㭗F7ۃ빬g<>KGojbOo劙4OAz_OpnWFF7:eooAO f϶p׿jqo~4Z_` \srq1+8zBޠU(qd|:LwHb5tO u+=r" s\p+]kI3$s<<oF65[23sĺ>]Zdތ  ͺ|ڷutnDptwNu,LF-iơj{Q9iu LLle%v?Ԁ*j I0Wzq K C>a!']XWU)Hk⋊T"5/K{yAEyp]_@DR2]_'gGy"{,'x)'d$eO+7b]0/Sy>I Qc$¹cx2ݍPsSWB{:c-=e>2_1Oig 'pk`O&B+潗waM':DV_\13NA㺽 |'ؓHSpm>Q..VQd÷( ٝuY|ܱDGG @[[\˯J__(d,1sX*)׍a4G1뫡jW=.րG޴yGM38*Y峧;ekXhuD$72nҽ IGz%mn dϼ?a5㍜K|ȁ~Y6A8lۉı _Ոy_]jm@kzh󷇍̙3? ¡#++!$D335wFGوCY3㾞6Hu2 dZ^MTī M qѴ#:pyk֢3 J$-7x>_٭ L5M%#'ȐaXVDem3]=}L Ȋ QIѮ2_:D3!'![s&;:ٶy#S$,\d ԃǪ{ز   8ApNUCw`uTUBdfe|@aNF_PoҡZ:pTlե(Z-x^/}Nz]ב>oq;Pv^;osʮ n) q۱;{tu)LƳk+-+znI"'`gG;;md6m˗L4pGQeAAA q  FMC8xݸ" 9fJe.ّ,#?+r:3I GJaaPߢ!ԾY̌ `N_oJ>']>)s8qZ 8nZO_}dg]';VozlSsihTΦ"vVws0/)iB}v6nۭC骡14IӓVZ=C4^gG[l [6m`X,AU^AAC G:+0Q>}8ѱq󭥒oõet}DU}ΗuŒnL댣RwpSԸikUȉS-}qH?gCKxZ6[k>>hR[GgJa|шj*ma"'F=jfofg *Df|J>lHpxLx;Zh9NTL ~bVYEI] uzf ?IC^TG_TЮ1>m6AS ʡpYu쒀>WV^/n E34'°((  FT pdӿs ;O5SЩTTR^C]^'/` 8tD(= 4x[hnW1:Q1 6K@EU!fU²g2|fN!H(y6[g{`N'L"T_~Zy{n^uU}ԑJ~A]T=DyU7͔ucUPak$Ҷ?aW>]Ƙ9.v`kdGv\nܽ6ln16ɋFhYBUbw\}:uzq]0UOA8ld-|<$" c" Gz{&4*6L.PͻL0SKU"k#Hnb&EmLkc'12&۱ij`g[i%iٸ"c>VK] "K3Q[Aiy'ٓ")bĦ]1PZũWV^,EA5H#n߃${نG+vO@IiR#W&*.52r5eg9lm'WNLәUe⡧JYýte'?|"d[ι_U -A8QqDz["vZStÇ5t{4){*z:kjhjc$#JӞypMLJ;Z>n_1cu4zuZ&LueW9sKgm-vçƆ!K,p&Szqld.;(/}ɼ "C&q1q |>r;9ϙ?ؘxU^oonWagj"ro Q9M>?fJ[y<+k_ sdB!s꣙ ȍ%Wm޷GXc&ܬGǕK]!;n\?~U|&_[kճosBᙤ Sھ^/OMբv}cwͱGs%%KW} >='q -РҠ:hoiAk]56avʴIH-Cw}3NK4ZDbRͼXR4UbX1vt03-_OZ 4nDbIM9F>|a&>;M_ݛ͢c`Tr[kilRp3SCi6la[U'e&TVlisȳw{ћ5r)h}zhk즭.f2!݆G|t^!-t};Ȍ5NOhFvֺbg+6l*jF*Q)hEu{7rɘ6D%G[eM]сFs3!:i,9S1Ő\mZn[*q(zYfDU,եuF̄LVn*[tI.3LR= Ż<1/Pj/oNm}*g|W˛7"'wz^p~q񺽜Nͫߛ8駗SГtm$%'rozv0bRS;ΘlLfL,{⣼^9YY=,އ#.L ~~a367$&=8gwj^'/RLus7.].k;ֳ,{w=NSr8k9)m|sﬨg¹bg8#w.arqoTE_Vp=0j'azEۯɜH|o7]vOvv:8+8 Xgs @Aa  ?,}lTNohn=yI ѡ)CzGvy] 8k ]=.r3c+ 4BjJӦ0A7Ī%"k(GխSPt!X$f2f>|YȞ<8s<ц}9hkj-8"C*ZKr_hYl %at2BCQzVg9_D3~3K{9сhAWU .̘ǟ^ [ϦEgx f[5Euh|2Ũ6D YAu 8:;رm^'Ml ;=7:1>R,6Y{(&#Kg73\gŔl-!dN>QZ 0Tz۫)Ii\& 4R'Q(׆h-lU\* ʶl;u:(2 px) %R˟j?rܛxs _O^j2/C?Ywg:<{K/hOOտmF /1KQ1/pNJ j\XngGX^ʩYqh49Wʜּ9S4AyE 4%Ï챣M;NugZQ??ʥŻp|~wOO!'b./?ᄁq$d;;$5yMqQ3ݗƣ_.s(i9>5MQ'_BpKhcty͗4g$V/ ld`A#8#KK[Mm74փ7EK3;Є=&Zq;477SSUIM@s9,SQn2s Wɜ;(udw MMPه:|j@rf\Q)1D d,*k5Sw'özcNOCGg-7PԉݘccZ /c| iNEMD KVAKKu M4tIj}eBmC ]d3luӨAge:&eX,*1[}nsXc-á5Ga%ħ@>sU@FէhRsRZhω"&BxL;\k0-sR]>h""bH/$dh2 pNi֕GщW0xG_c1/2xKٺ蜅rjl1|-^ߴjj^ͬ3O$}%n?/gr9ȵ?ZcmGCjViy (Ҧ2kry:KiQݰzMCh$O,pLb}eoWxu\{NDh6/.: 6i,,Uկ/B褙jJX+cWBޤ1u6>EŔSO%}oqqTb9#;\{O~ͽϼǖ^W"(p{TI.^a^1&m{SXzބa~d4?{?|EHisY|nnK(s<#=ɳO٣H=c 9}2mQ&grc2/?cHn;M`2`SUÎŹ>5~*h=-U5ӋGGVXcKHLD萣@1i5Pڅ]"%&>fݬXfsSCi}9x=tjH9\闟Ö58qFzX҈E|wvM̺&N N7X3e`h\_}3:՛xR*z1%t=4*M"N_*ys gE|E]J&A{6t>l׭aqKY31˻#AʈPH&4XXA ?@fhH[a]py<.)[TM5@7yb%DmǛC8z3?peu~Z5wԠ$R; 4t/0ݮ`Bgo:):-Zŋf=q @4V<|I#1s擳3w3~|r@;|"5x)VK%XzA֍Yz}e;uUQȳ?gwzY<\%鋦{Sw.$w6R250x ~U002%ܴeO[٠[ AzG_Z-o;_ޚq;fh ٨V2 }zp128.=lݿflHb 6UQݯS[JɄip Ũv"́aƦᯈ_'bt]{Y饳c*ڻЄY$ZCU..lk;UNѻs Xrs"m3c grI+W8PuIʝ ܺ5TwjOw[%_X<=c:W\6#r4Ǚuq" g[h5Vֻ[}eT,9(&eEbZ'iu&ԸemoOcvgbFlWE!l5XY|,PG&XNU%,9@p:=f$eJj#M^  GEZw`1$:2R8T $7u uJY@w:wPa$ hT7=Ndōp>*6WogF5+ SPWр1Ό^gSJ(f*jÓ1ĥ!MZ/+S$rfRsX A8DY4_~şǂV{-}.,-c = aS2\y<\9_.Afrl^,Ogl7^/;, ay*bYGRmᣗޣ餲"bDaam{^l ,1RGX-~xY;zi~ہW9"1J3/W`@Bv Z_JxŰSXk%(KЎ̤e[i,L %gr_o/N324@ؐ˯ZBBvp̝擯B 1{;, *!W5"e2M9 mq`9sGAA8y2e8At˨e(:p'#.`4uv7{zټiփ.տ>'33SSAo+UL\WӿEVy;NI)?=2me#m:)4(f_]5lsCG=yD>T7# G8$iq-WZ8~QÝu%L!߁@_0bU7cVVPT( |MPyI Ccak˩=Ku_#Y<4WT҃wbDn'?A& @A#} )YYX#"=oh6p0grmFUe%ᄋBT( |Mq=4}TA33|dc*rO@o2XF$CkFqQG_Fikkgڵb%^YP 0^dp"~Ao~;l   7 @AAAA\(    G02XAa?GAA$PAAAA`(    G0AAAA#q    8AAAAF  G.ګ)kA=I4mbK-  r( p$^[E}W!H܅YA0D'*AA8Lpi,^Sx dDz?mi"e)\zL*NBu٫/Ǜ)km5߾iy/]{us/ KXJ6CάӸ quOQ3W~O~ɻm >p=}Az)N˒S23)_ ?;7/3Xh[ӣPUf:K>歷Vn{-$s8^᳿?n 5b'}\N9 &dTtcѵWxF=WD^evZЯQw4݌Wq;xS8y[F8 |  ါ pIAD(Zo6\77U?dqqd?7s-'7@o?G3gY|??PWջbw&ߛ~L4=y:ΊڏynܥM䁫u?C!=sxh\($ԜONsv:JذJ?' W',Cc1}X~z%K8@f8F]8 sUկ=})FX;yѱ+o4Oo<$?=:AR/6\a|v8d }*Y:&Nu{LPAkT8dϜAeX.!9؏۰5£I/ .NZʊ(khu`%=/ԁ|iWQ\BwBdY?tP~#\fOMq]SĮ&:4z1Әzٹf# b f, EVbRɤi|ںxf (̈o(DǷZ ;0wnՈD*x^M;sC`]И+, d/!r=뎙і/E;iN!Ijn䐛]ig7qBfС5bjO$O1ޛ#OP{D~|.|xpm̎-;q5{,Nw7}d}[2qu\ynn2%mc&)Ao&䪋w{eM1?}|xw=(fǰeבGyi\Oũ?>}=YGPA뎧 ٤YF5œ0͘G/i ]^͵br1JѵQhpgF6wcJ+diLI!ʴGN͖/VҘ:=mlՌ6y"f ,qF%utɔ鳘990{%JZ%0'GVv؂۸P d :C m9r|o?nyqe ߔ[&,cЉGƘHԞ7jc/#dwLWVqN"ñ(h*gpzg.8:|u+hҶ?ҋ/_?;c/9]؛wxb )׌ÁC5a69BҳHT먬 䵇sєY>,3w[v3(XZHBo<Γw.8۔4NL G=&%\r>Y\D6z}eryQ^4~-*%c?݌CFo8Lmjѯchq  .(RBC x6bpwBliNSovI]@AiO!3 ЕLjj qt)F_E?`R jw*ĂoǺ,s5\J]à "GU V'cߡIK3􂢳sO52[9=}+(8[gU'*د|tmOt)(RWASC%̛Ֆqyla>'ƸuN?^: ]Ϯ养o8fn=+?5͡kPW,tnwa?^MbF1{LG( 5G1թtt&GE`PEj q 2,;N :IhcSD҄:cm}Ul;*8͌f6Z-k$n 4Rp--Cs(mB B 4M /&/[,Yf댤ǓI%zιg͛;o~=mo]K|CI0,ƹ6p5*W# K˂C7;>Dv]Kj{^[2rXKUH[<(*Uj?2>uݟ߭40闿<my>ꑓ-:1aQIy <]>EXL}.YY2KϞG_~tr"ʟu<_~ۇjo(ccO֮- /xv_~F5m(OÏ䫡ҢѧҾV`Š<zw_o}뢏y_Ǘ<ڿTΚB}mꙸ.iNDt~2f[4<4m榍ڵ`&[0Kj"mkG#3j#CWWܠI5hWpnԑ:*R}]㫺)-שбY;iGޏC_gю|LԔwڧƦy:'~LzՋ.y..2>"{FRGqM͏vsĪ‹ﴇ4ʚy1),VԳz{'5jXyɟ/|^9/Aئ?Os˹zIf}XuxՊ+A%Cuh\~ChPÚtVdM UYҞ:hVYn,Ƨ*-QVl~ES{OAU,'[FpJag =IYg66Njc:USO>#y<} hh,ee hoQ7Ro< 4o*pqlڛ#K~_/_yJMҍ묊7'tsM,Vo~CwX(#lzwޭoԎeGFvT}7;gǘEF{|EZOZvV{܍ r(ofFSV[ۙyS"gu8>?4μDdP5s,jg2jkҗǭߩ 7au5랞]ˉב#4>СoD~}"jtzNi~[_]2w'U=Hey34с"^\{eױobmΡ:}L!EYrs_ke)~[sT[C-[Z:UYʟ\]G%,ͭВYsfPϴ6coɐ",9}jX9w3Cު4}Dmt*fWvNvn\Lw?M>|v|?QFH?+tg`uuOt7Symc?xzjhB,AN2 5?'k؃ơ\o=e&$ W89ydwX[ϿFo|ʒ7۶.X9|Y| >:jQ~v/HgO\]ߊ6~׾D&v3(Pqe.}՛T 4EEg*.Z*ԃh mM*זTs$JSSϩAJz/xz*Ϟx\U5fnHbį;XtvdH6o[5TC3I%ے$JhRp @#L01@ˢ .L0 l6*##L01@.P4]DpU jdOOiɻ%рZqU8Zr@\Fi Q2l'#jtPgUvn kh,ե:5Tpn'پEk=)Paqnv^7NtDؾ:O:VQxc?vPdm|z5a.zKFsă{@@V_~vzCBU֫DNʗ+gKYkcĦE=KaEMxX}Sש<9K,Tuy hUZ庮AֈFNlݬ:GHCrE3:q@"W5ڛHcN":yrmx QA B"ÇFFhSW[tG5PmUp]ۚ՞sjsRbN(nPǚZ*,Q_d<6"oVm(%v*^N#=kn['|\޶o|F_UްCzw|~}ޯsUֿ>OoMwoUtW?"uu-V_) *fSyy.+L%:=!#B_**ts:OQ{N뷩pv(vJgi: {\k~ ql4ǚ:Y ۪KL0l˓.(˧~ЙNʏo' 9uM_7'[= =7z z>߬[Z/ {V?oyg?<}=}lhԥ-7K}( p%#ĊK`6p:iQE'5hG#,|Ό#{H$[ko?+SEZ{FEeZT~"G ;R8`Ltΰ+>i8|)w!NGuLMʳ3Z +k;t}ܓ=OigQPG`R_M; 9'e}kW:Wܠk| anXFNe[:;:HiG\x/gڮFUx#rlrS7V+'֚?tJ=]:KF5VzeC|S m%W/3M[7X݌)\#:6-r9]pUFGܸUuXG[v4mm[K^;y]GGͧym?3=}w7}\b TFroWSڄrmdT.\Vcvd?ꆻTT0ݥCͽ`mX,ޯ֡ ̏ZUǩT|)Ukg8TF39j}I Qwe+3P# hhX@յ*iV˞}+/S.K4ɱM9תhM U^ک]lT$'[p@AJJ|&wRb})m,VI=\;=ZejPC'Mkh<Vj->p:扨O\ºɫךjݷWck Nh[Q-ͪ]u[ڧrmߢ2qe1W>/-o ~+;߫@u/`&2pZ[[{?y{nݺG)?%B2BnWNGz{[+jɒS\ϪulkSn吻FbFb WgϞջO)}"X(. 2f(b+YI%t{Rq455=M VTWsLF6=^[tíHԑܥE6o}q@L' PR ϕRB\ Fb^ u bQ 0lϿN(J2?f,t Z$SЙ3/ōO6;=?A .@,Lw2tDR\\vB;h̠n>[hD  KthT`vCH8ޞΙQN^O@`b)E癞1*ůWS>EV)M37hpp@'Z,_P| PG%M@RON1jeeYU[ߠ38ݯޓݲȐ5+K.7N  n#K>εf\$kJɚ+R[N<["HI_81^B)%R)%]087r6ɣ]Dg&X>o3ݒKrkbbB#QLeOJySQ? 0 XRXXDL `~SGV,p`ӁCt.t`A\2@,G#g4ipz;גf;\~ou|K{?q:0 .W*Mk{wv ,v B4Ea+L;va;/PrX& 1lZbAhI hg9z{Jczfgw{f{vhLuuU?3~=ò,Voq0;;_~w'{Эt:__x8?wxC~Kð_}k{끸0fUNZD"~St̗^.4 Qo"\* iׇv-?- 4, e@0CKՆa=6yxP,VWOGXA< Ua}1R݃YdRqnX +lnf5IF( ѨPoH8,1MX$5\<~+++=} v((x7>UFa ?OF(BVS/VeP1EtPD~0ܧ.5 -1m,>PpבxIV'iib8N*wFiso*t:ct:h]ǖ{P{WT'VuNQ hp0 QsgEV?Z|X/[ ~B4[ zP/f蠗270B4հi,.x?\̫ 7;(>WǁLq[A<zG%?r $5Ek|}`KE,!{0[7JWJZo5ԄY~]R1?m>1*F?S׹ |){o32E*[V+709 1ٖru AlUlvĩG6WAAv"lɐH%BbH b1P@j զ>}dB">jE˱6jH c.3,oEM՘VdFyMFC>&VGH~ZăM0CjѱmU 341\m!N6!VZJ~G4|Ţ7Yy^U 7+g\$SR$;S}_Wf^M$>q޲lqLLm}p,oMo+& s- CUD\M9(zM,XX&ʁcf\2Lg]HhRo/-Ǯq}ݽ/wEùW;ۿS۵9>P;_87Vab ӹdukPo.t<<=ú..AL_GusbcgY*lr]~p Qg.z|w2P6 S[x^_4s^/+ݰ7d ̕jЮOpj-,Go_} fýnV/~]?ń,U[QC~6c})8i30D6W^ou;?nzf UoGPЫ(bxȧ7J QmInj݇ S Dy o>߳h_z%ާGbd$KWڭn8fpO ys'sc6dL<$~ru o욭A uh)TcRgo^ΎDU0d!  XŻgP"BX{+kX3`$ZfHXKZ(|c jk\x DCn)oo} !Rmii #g1K}֯|W{噛@a=[r|Af8_$o^߼?3qAĞVOh a3þ'^iXU261%lkTQT:65i!Ep$5YT">z=z Q{R0N &3ao-נ`_u~d 5}p{;ٶk vNP1%Lf"宆9 WtfؒoWȜ `9+Mt۫E\f1i\9 2eu_^sxn&}{=ovLE>pBoZKyX wZqkZv&>^p'gc}\6d1i Lh;[yGc:"T{O|!o:ϜZuxM,!1zB;lPQNBف7`hFeB8X`v#-Ũyah4 صR| :tb)Hp? D"Q8uV2 !ō:fo98+Vp^w_ձsmG87P4!D0&pCkRY;FNDJїJkѱ1~WrGngHgvϱ1WЉQe~M9w=azvA\;@r!1(Xz=KYt9>üacS(̢?3W. M#%ń6 쮍={#$Rm9D ]´Jl>^M{ BW_C2s7&#YߏtR r9*1eq9wϟW+"Jw0ҩ^{̽Lg^]|+o''LVGLz w)cM'A2nrYikcΉA4ra|r{]a^e>k8v.]j,ŧF4DCCL6_9JXmq#* =Y!!A:GX@Iw``ZKK+"&EZvFRM&=90-qܙ%]_j Gu( ! 33B %D[DksH`eiRdr*D|BAw^A^ftM*@yt~zE.rPX`2yZ8 4=+x=XҐ"~%eL&9b" ?yI).ǚע9 d>E!L6VЖomd O!o s#"<8"nA Q(Bh3h!WB3xUWxm=>ǂA8_Kᅦfw~k^zk*hFukn'{l⹹;]}.h7_  k/!(R8y˞h8xW;ܸ@Ā{Y" Eq3=pe18^,k >ם."ٵT/h.+ ҙCa+zşݽ;2׿۵7q7n0|լ3AXeZ@k]k{ m^DY}}\  Mm4u?ܾMG*Nd>6aݧЇ@)Xέi苎]Mh{6C#}(`ONJ9y]N0\֛.[Zb~Z-K+=< ;{'a6dAB^NX:P9>a0!Ƶ)~u#CikXں!ӻ1fvdݶW~lvMz͏_g}o cΡñ4(퇲۝DǑzR{gyFL {U{;|}pqOuw48tawRGE|!gq>V3ą8x25~?~p1O?9J֝>KGY0|\be9쳟YC|ǐ0Np`p/D5ygbs#rLD QiN {xMHmN"`Y]RQ5hÁGIګkoenT"kX0'櫉G'v"No[fMҞQ2 <絪 `0h - (LI5>wAm2d2,cjB$EX )>2uLgzM~:EΜ=ntNj\/ھIg3ج!o[fix>P#)F4rha2(Tu\?$,;utήVЭ n ۑZuφn =jӝa jE00;0' d6Ed2 ^_[QEEs Hoj\>a)}oߪD;n:U/Fr@фGJJ@Fi!_b|t1z1^_[2Cqi6Vꈏijt[P?Ӯ{&?Qݥ,}~iG, n޾ ?F O8[Ia7ñ)L;J@0zX,hͶ`auZXn".f?.D7='癟֌* 1/.0M#Ƣ]m R<Wj)%}X{v񉩮D/084oz|o}bNK|"ctuuB,g0ևoMPI2Bg/gpȚZkwtKy{G,{*BV*H OX>xCbTm(e月B"kvPT qY$׌|2 O̹QЦ|͚^yCijv{ksXRa#Z$l!Q0GY#G(Ȓ\o:5,4IOLMT!9p!+PP$\sԩ3'bu?[_Y_Ad76fcŒ#/7ysNm̰GcV/ Zrcmvnſ__Sk,}.䷰8QeBrL£p .=JtM : #*/%tQ%P89T Ԯ&lCv⿵jM%LzFz;$No sdj0iפ"6`HKI=1 $:Vwu׉t>PcGܾVq580uqoZ^~޺ biCG'ݒu1l6j|קҖESzdB xgӬM*ƺllhWo6 ~f[xr,3-?8Mc0,GƵ_RHG4G(NFK1T'O(CK}Q&ѪBgE%N0>a}E<(V8sgTNwPLi˘ߋǎchh3HhÇ`07l.Dr\S%| zhUrhXuzn2gy5D2Tڼk;Z뷳DCتױr7ga8fUmQzu̽YIw;|_?(zުAہ͔;m+;b6vkv[A3E~3Kv{oPC;SQ=yȋ>;#1V[3 a%C!M$mnN4q~szGAG><%ZldeM 8M$,ېY0%OLK' hUd/VjF1 &P9w$s)hjnڜ;=1cY:#+: V#N_)LsB0CҲ3^ JqTvki!C2GvuBr O׵Eixth"s?)<#ߗĦ=PW/kBhd_6WA.LѩXkDZKKsN9ѡyc$<}bhوP/+q搙QPG ,N~ sꭖ SI7P5~ aOƾ^FK$ka/s,~P0ZccWtDEMvVZoR4HC޴w4bz!fSk{|G׷Xݓ8qt[mN1k; *ϰ+茁'6` #@i l׸ڹ#utރӇ=F Dΰ4F ;Cs4e<̲w#AMm-wKvo5QbSi;cـCQ?Dgcv:~7l8v{$|<}B95ƿsH |k+XahhHMekM gOԮ7iMa6`BކD<~BgxCȤ_\֚j7XZYĄCY@REm\'IBHł*r-ð,Ƨ`miA>E_*&[#V3sw4]]sJQ)Tk#aayr]8n.&dD*tRExwM;w``h^yBA_|<+iB'N/)W_} }k:1ov@߇R0Ui[9HN:Z)2RSW/|16߼Bګ,Σayų~=,// \,>šP~p_}Kff o+B8ޖ]1FP*l=ow py) 翈9ܙ_pb$fJD+9íWXDwc O?%]DP ǹ30}}anD~cg4:{B%tme\znU0/>%BvCY{??7M3o_ɿf|au?;ppҡjJhܞR&) },jAm$TxXç؊Syn։бV%N?|Ƕi9VadclՑcc8M\VƢ&oEX4B6gϩ9j:뛛04|H'c ɋO~Y;K~Jż"U„h}70=o_ҥK7x:Td@⯢NYarNXpF]ö }.¾\Sq.mOw&STșxtPѿ1vS[qR~ÖK[vNuGW/-mY%sl h"L~`EE\$HR] Qmg _v5zyP 2]!` sG4 \sTe>8n};ntj_]ǃ B޺!בy?ʛ9??5Lg~ܸqKLI*ֲN2΋Ha\B2Ɔt_"LZ&PeQk>.YO# /9;*&PELNnʉǎ=8H/V6դ 0DJH~]O?a~Yl6"c0 [M^i#HicqeE!?BrV-Ë hcgjɣLӨTȩɌ0- mCRzcGi^={'Un//;)m<)4o`QYq{ SN1ݑv0ȨINU&jҦ(t=9ɩ#Nw2Tu2Vksm'$.| &5Wt"tg%2aqfSMNvc} ؅`?|ow4V K *dUuuJ8jK:6Y /\3gϠi̤3i) Fk#S I/s(U9f˅-l1zup ;WS,7nE.:R5J%ǀFv]GbS)45h"d]_5uZM-J&z^9!BcNu߸.}o[ul&R66卵eY$F0<4X^{^I<^|j{T>YXXbmxI\^Z (CE7W{ ^ʆ<~-G]Z\ ct ;+ˢuX+}!X V/;W_L w4w1Lߺa"bƫG &ZyD94 ޿zE+:kc}M 5#lפ\S±Ofgn| +hxMmi)`v|]MI 5KeG&> 7g016B#xPkBQޫJ}_b~SE$ǵwߖ{Wo?]}-tP4@"r74`P}I%Ō1"'S'UQ6&/)J0r?6uLs )ܸqǎk) &2#"\Q4]™"c/k?"Uek]։ jF5m=OPkPTS8A1fffx\.([7qJx,| }RQk8z3+:"FQ;oUs jϓ&G1gNBP%=6WmٔG1ʭ`|(jXU\6zxE,ςYM5$ I<^GcN߼aaږ3wg7P$b:[ />TJ+:Ų0^T̹S焱60?@8dVD]eЪ^N|a͍uٷ/|ru= !i_|TrZ 6Xmh0b~pV+T?y,>)襟ޓH p@/>a'`Aʉ=zkl=u$ǏMmKV-)ѧPr{PPM#jQKL& TUl'-#j٭tZu8O͎ H& {&РIb(3EJS!RӁ 1i" y?e3n&V:3FpaDe )++VJnD`;ߎ0}S_՘#"DZtF?BlqD)3P-l If7'zKM;K98bf<%dWt}Ccbv~Φr{;a!L GQSmtxHEX+Ŝq1Q)eΜH{{wܟ;Xʄi;} 17Oo/n Xx2cČfdݔyF'P/eE+Xs<ēb-o bjI0gp:s%|cZGOh_)`yB5OFI4\0)%RPBK D;:VUhSZb$+_[j]NB:rDxWUqM qu8ٯ4aYEq2:+D@_JKtYˊ?n. KbhlJ.K{9Ǐ shɓ'UX#zOkikYbSrԲ^NFA5 ٩]50 s,41iQO!39h3¶p%ۈ2)wODuWbv"fEѸ0K`F'O{W(4Q5ws~?c_1sض>9=@"vב>sK&;cy?ʚ}[ f/<2Ow©2_Z84#/'ORK~7R>vxd`I䙃Sc [k1À6&z)"f +Xn`xdTL1(j*|>{g ?BB+md\oBفb4et~FE ŢGM=|N!dGBMy[y;vLfS0Fbr.b\  S9 |{}~ Ik-,v"tTՐkU[&b1"2(m[)u(ͻy^$S}:18${dt_FlCs?(c]c}z>2gFh VgKҊ uE-!B!=ukmOÕkÖ3-> {hXY¹sgk((g̣G`qaN$77&L1 "LM))T,7psxw4:(f݋Œ Րsnmp'0?}i!m dU$ȖAxswŻ4z߾Bsұ ffT(D"!H$b076Bj$aӷn!K_.#\ k |_ W؝a8c_:sEƷ Mzjʴ鉧F2(~ /NzB$qX觧/#gjRF(фf[M 4hv1YhG=(n :XEԮ=&f 9 ىJE1ȸ4"$f<w$L<(sI=%#ysYnmDeTd"BS ō1s_)Ƒp~XlJn&]E $v(/$fg@UJ@M-WMK:PK?o# "ã]a'-| [xw1D0Tfgn(nssS &D^^O;;(UjE"1m\%%x Mi4Gqg~AdҦog.`/Mc?EE3ud[P%"bǡ/YSa[+"^ue1y8.aCL7**Y1XNL̜24&$JJhI9ypdjB(@臝9y _LBYEaEIfw09>՚>BIz ~㦎*rބ~EQ3'Q(xDLI,ݻ]E\Q>ѨϢ1\p eHBǝRnEbXBg653<}*մ]7"D0b=J F84t:,T&bi>$j5T]):+R!SLLsG+u?G!ШJx!Cv?+(O E񏖄8;Ӵ q<5!줘k4$,ç4jmrss'_"v{sn_j3;<ξjZ` vBrXe8ƞ!ppEB'S;8T/kwM+{R+(qE)n(>z]{Pg0 )QүdX9ȉ]nG_=@4VTrJ@B-};ә߻?M3kX^#q')"*2媬t;q6VP5j^FGI%`?~yf?u4n]j]jZ|՟ fE! MzpΒ8I%y8u%jH}[Nt3NA(vY5X}Ƒh%wLʳ`@$ kiESEIt66H|QQ&sA;+NPcZݻ&&&`ͮ[ن69Ze;ƥ 2ƈZ⥧c<8dJM &'| jES\=N;ûgxy*iކN)5Ќ jd~3G#q $BZF:7Joq%k]š~7X|A\I[شJkUV8`^ buyYKn]&*Z-F3fPM jetUsGb EFD:[XRB67Q}' #%ZoskK1Jme'Ԩ.gl#:†x'z"1)1?""g&RӜ+ \n+ y}BhiJ[6]vmJEnJ?I#7pjVVVUZ))&qC#s#h 'uXM,({x2-yH4v!tȶ3Dw{صE=9 .A)Jp:h6 .]!g?q'022- r!5/pУvSҖ2^$6Eǚ}{\;cp{K.љ:w>w6 "M<*RZB84&փ`w&S{w:0]2Mg6O,0V6EӡQ^2OLRQ}!w~zw賒́_Vh.muM8O(uA;ֆ,>؄ׯ}vnan}}=TV M\|/1cl!.#l]۰z|dE9QDb <*xw<b:_\xơʝX;xmvFPo?1jQTC8qƌOߏ,! g!0sY[Dc9->UA#Q]d{_/0rH5r(T?a{os=)4Ը9qK?D%E8N>6.ĬYZ Vybf5D FAQ^% bfKPr9 e̓pCZP5 +v#7SGs!?} \D<9](><_q~_WɈFF~sqeDB5}:N[q_8}2B@:lJPIDDD e[R3 zw N*C&!)IXM;pE 6j7jPr'_V6Er:핖@d^b밽Κ~Z`f{DDD:LX~_;]g^az_?xu?pf]}}x@!ߛq}sP}el o9C{PT FQc,ys^YU<}A<3rP +F#ڰ9^b 'FQێR'IcG O1N*ba \g-kNݲ15| 5ī P~Y ثV/3$""N]һ :Xe02Nr&@M0X C?%e7X݃zaG9l FvE{>b@tU:l`f{DDD:{uPqK+C/mJQ& n?sP^j5xWw/[=qb1z_AOoO,\?'|y9杄Q۫Wck|F%0~q5F{Ao1.k7ȁSN7.Dg4bڹcE >|#mۍE5qɯT}$"":^ԢVuQ `0$ }qոudWZ9u=˲5;xk:F{:߲eɓ'%禟^z٥>vx{DDD:Iub-.e)e=뱪r:5-[7^{2e5옻[.1\cmU5 {9}$Jr뙻ۭC9 K\QK咠X?z,Oi{G/űÏPtBBT鍱c Bp8I1^oTqˈ4 45^{i#bZwؑw9w2vRYp(xI V7QMO[ݠl#Ѯ^[[@NꚚN0=""cx }=`#jx|s,/vr<Xॾ澟0i|^N29GPr b\Z !}؅cRdѣw fJ#x֌h^+?7 ߊKkupk G0񥰘d jKyj*h K3kU}1j@e0 > ""cs^(u2w.`ޗ2m`lʖb!hR9֗_´1ctcY9գo#~!xի״N p)tJ(cd8WGިBOAsSsce?>jԴ8QOLBFn(4iTT5'\rUЇq0knkCP8z<$TzkZza |KQ;Wm?I^9pE zƝy2j<}oYNJ4 n|^ 姞_n ApCJ-K\/C@""cqi@]Cj)qu^|;6<s;joԨQѱ*֢W1r88 5ؿcX8o# 'gWQZPcPI5X`62 %E&*]4OJ {PXഺ8#صt]r)3Ɵ7ˆ!SOdtY ɉt7ʀyEΔe/w\(amJ`s nRoSz(|l3^Y^(T{ud,`;3-D+TF|XqA5N}>dIn=^SSF 6!lt>瘶GDDԅ?thRr=*99מ+Comn@w7Ȼ˹L]ؙb X ]%өGxo띝l zT~tD!uqQODDD=e̠cC2Q6 ?=/3e̠cCȪ@@ {DDDDDDDD=C@DDDDDDDD}1$""""""""uc *{KDDDDDDD]@jjjPh&0ws{uiFc#^wY{X,6Nop{{r1rd6G%F4j\% v1ѻe/H{}񨺺= í6VXEQ%Dw BVd.>H# {:) 1љ@ +r*E8;v*"yvqc1,r6.Ǜ/{BkL|_\MnWӎH.#>kl5pou>o_ ?a vgk&``i.\-C/:L /?F\i: ݅9܍9¬]g1t~m6h_}Tb[ήs1n/OƘYk#,R"0Ԍ隱N>c\t/'7DEضYqJq[*" xb:"+QB(15ZOV5`~su%܊ ۀ'.WXkFUeS[8l>]t#>{+Ofg_wXN3!Usnqq)hWRRd^6#k䷻}X>{9^6st|˷+;6[YLZS%vl߁xZL?|?׳wCmhkgbYc1PFCrSX|P F2&~kl;Ӈ0`Xj|no+RL۸a)Ʌ[ r g\ɀK͙_ck_SpiD v<mڊ8u杘qR.ʅa\W [79f|S0Xy + Vn6IF85wZmm3:2)I0e. _\w81沯⦋N/Pن0D|u(eG/߁}8zQ>Pw|;[WaŹdHDDDDDDbH6 MhIܒ4100?ϨƜ{cGԉ -whٳ>.U`}ʫOļݐ 28P+Ɗ&˱ŻfsM[7'Ixk ظGE8q;'5뱶B׳Nuf[\'uuPpl_uz%lN€F6WƱ_g<Cx.T5CQFSIU8 'lY[~?o,ӄ@Q\ ^g1~PXE޸+kNbAĽm;z{{aٺGoWUsKDDDDDDLZAٽ'} NLIC~:5it|Biƾ#B]!ޫ?⨬

    l>NyRl/o\O>u_+;wu1o??ձRo`Jc/_x!XS"IbTs-XhǾ?"""""":"2 )Qn'IFcPbW,Cc[݇{bkN6¥o;jQ8U)hp+f_kCX!zM-9;];Q#)&in]gnTD0fl/4aE[͹0m8(uwf(h7xnYڹ#8_+Ĩ%5Fe% e!bXn5h/<:AZ5+>0jPv4 ZW}_u';kuܿ|Y"g-|^VB돓ϻ cUGXA)WKVFiWځ1oe8Q;ck1b.vE}Uӷmm.`93pMxi-{8w4.'a:D]8a`hGHV{ҙ}:)]%Guy0|d#bAhzuסzKgvnԫ(IV^gEd^_Ԅ{onU|:r /ۋt`fh#fu;j[Tf>K]` u>! U8Z^|l̼p ~Z v~ ן%\KÆ5UhKnل~ *.M;Ca0끷hW(תh, 3Jh޻s<찪$4c[ƍ߿JK%V=iÃkpUw<~j~OzLN_6_{n#֌+SOtnfGnYut^8vQW_ro ߯*͗߄_~?TW{^[^`g| ؿNT7F < ށ32uڲZxڗQ><h DDDDDDt$VgFY3 $d()Hd)X܉eSvc_Ӗ߇_3JPϳ`ŜXWU .ģ? /}V- "D!5Z1DDmATᔫ/Cxoh`H݂A|ijj?{!aoa.DQLDDDDDDDG wo2Q=>A """"""6-:Ǡ;c Q7cHDDDDDDDDԍ1$""""""""uc߿=m SzzE+ƥC%(2 eXa~pM]c]]p ~ z@ȋbȨC'5Ywf݃A僫gOœM,ƦTRKO\혦a]z--@(l, "(+ŁhODDDDDDDDžtc {ou{)vѼ-ϸ 8ū3EM2ьhR{KV`Oh# }1b(!+us ߋ4Ǹ EY8gxN3S3_fԥkׯA $/bVW/"&hTď% {YT,5j1%g.Ũ C.IS7?<}F[mʉ4lYT7 'ckcPo!nTňacqʰt+42+Eq^=۶)U"ˬӴ,ǦDDDDDDDDGAVpǤKhKޙ%TH1(}1Y$p(2e_:9=34kV"48̓/z?kVrY`ԇAD@spVRfU?9v`ٛVwb[_خdӴ~z1`}FJAЗ>YJwq[7,O+g:>^8އ { 5%jU}k/̯Cc܇fxvz'CTvKN)񊃑(mڂʝ;S?{U"8/9|;_*PN >A`I +;e芨pt.ƚՖaEWb{{9pe%1d>+7G˛ѨE ?3NbV>-e|?%ՊMzzăVWDgv1V]J(B?M>,s?"""""""1 #IN\ftM @ԁ%ZBuL.p{Sq ern*&(TpڕSsO+4떮aG;a}MqtCA{kziuP2%Kt$vw䡳_.1#""""""@R:ґ])a_Z_J𗺞:eڠ2{[tM('hΪۺf+eRNBIvѢ6Tl#{V|8mI[Rޚ%Y$ n&h-aHH 2q$P+ {l`ˮ{F:Hf(Y3l>ɾT$ )/ĦAr1遙qОj^XXNzAx  pĉ(y7%1Ǯfhkj+"}OSlMw0 g`O /z6D'e.?ﭤ(;h\['0DZ%| Grs=o"~q(ī+PY@Ps_~i_\:f$N쥫dv0=/mv]gMYGDDDDDDD)=BGzA^ZɜvrI@2ZU(. _Bh8ޜ RG1߰]'Pf{j].ApVތ%n8؀y6"vOOL6 pFؗR.~8< ePʬDv_;xN>R ?ޖ'c1a(k]s&PE}ȅ6;{DP詫-]~5;}/71o,cO`u {{?Ij65txe_Y*,ϕu]n=oV +׉8yD3{RPS@S܍f[O>9Ttތؒݵjb-)}EOtլ'h?vQGPZ00/>y,[ vUdDmkO!hU6spԓq݄?ػ o/CCu׍WkvX'6S?VmU/7j/qltDDDDDDD%1 >d̾=Z)j^#O¿xcKq7Ћ)h+ZVY~4-7K"5+yg,BᔊhfwԪ?{7& """""""zw9KٗRӺVe84)`⺌ظ~p}jm:2?&^:.ejq] X>jV$.?{YdIzjCxnf5C?)K+ԔOgML"!u~Adka&?ڋDDDDDDԅ0 $j&BJԙ։?q >ypʵzګWC6s0a9Oqls9q 丬?5#3戎o؋7W?179/ޱ5mF 7 cacA-v 9=`D^62^źT!43!cVq! u {DSZW!c?p0c?)u?žtH]8F0ZW(#/7ÿDTغ߉f݋"4nN,m+]/oD R8|,|dӵMf?pZclg Ɇ6qY1e!yqT8M[Oo޼諏`= =nx81kfsd78i<^豐n?ی+tz9v\*>Nc*1"Tp54ʰ%ƭęQ'P2uEc]~e'+'FHN :T8"NFz>E؁z!c1{NLb xj.۱X/OKRovOyZ/? Īh-hV%*  @Ih_J m -܀]8wv>oծseV?2jURߓ 3Ygoxc)50kqcVsW!ǻ+Ƣ 7 +p5; $*YQ'Hdev :#ۯWTt@]b=f5SPy|ѵROfq5-N_CLS1wXUV%1<|?**k}ebX>or΄`|u!յb<.:֬l)X7/ޟ=n*Ar_.[f%n!G} 44-\}$|Ezʸ | OPtqޘÞsyS[ ɕ1kO6z5¹S6߯:͹ E[Sm^nBk}q`O gC792&HtUMC+ P|fu~Ć:'*t. RC(?FGmЃ5[SGiRf4!gw"{fS^pцhF,a*K{z]񧥌g9OzuyЛs0x0h@9pݯBɓgqnaϿG_\ 1$ Dj|2D7p#]o¸PZRgëGaoU*}c)-E?.}P3F`(rJeO~(erDq.s2x<9u,VUv&ΈXPqODqu^l d(W1H1xrC}k[hQqiGXbb14čK^t$:QA')>3|A=&>&n8ux̜ ǽV`r`Ok1׃XVv$cgMpDqZKk%\.E7՚dI5DWYsцGLwn 4sv]㹃`u-'R6^{))]~*uREJC֬`Qo 5{+$z4v'D5LE\%9Aob`\ǫ{U,r WH v՟W1[jaɮ30 d9c1? $oUtKi\w&ZHn9?:y澷]Hyuz$\s֖,_?}!ll4{+I4Wý/m2ޖ+DL8k>2f3 ,m܊'_ZYԘqŧ`! !J3X 5/7=w~1~+X\#-3>GӉ1=}]p=ڈ[2qڤF+r Ȫżč# ^uq==g2"&m 0A0m_C$ W%,n[S vVAZѣ:Nh%]BNF/PDŽ:r݊9\_r_cYUbNu!H1 %r/RgO⛑Ƙnj צ#C;]ZŘvCr%UfHO^:^~&X&{i#t-b_V?6ybb";o y/%&䡭 @Qa/Ac?Gs^YjŅCj&u_sK?5|?F \gǮxj~9}C=i6->,p9p'[nD9`WC|sQۂ ÷6c@˚-d!YUK9 <rcJ~{q(uuqq@^9Ч5D[aTom[.។jhV4xd+xhxaf$b2^^EE(-IO*%x$PZ+$4$ogZϟnϾ~G|;v*o/.g~sŅ_Y'|Å8\gc!y ͛/΄3bA=]y5'A2 mWN2o@n{|'u[3&w~ލӠkseAv5Ar-DDDDDD%'0+$/q]J XD_bqb6%័y:d{Av  qЯ'65-A[;OE)C)O3i-b\8nfd: r}38'*v3oZxNC[dYws ٗ#9ݐ}XZ 5Q\,rխY;dV# nsO-ڟ0ʓX5Gax|Hb|;SfNk{{mY8v.9cqӍ9[֡z#|CڻS7.f5q… .\p…qPxz1QԊ?T[YU-->]}j:E$#_I?9ރN3keOlVѰp&1n D'?vϊ%)!cÍvГ'tf<@)ztxi4 [eVc6ݶӇ\ ŵƏĻKїV"@r@rz+S78UyhUi3Q)wqasXf3[~vD"W?\WY8̱U= 3.C4Yn o,7X <vd R3' D?6b͖f1OJ kqPn}ŽťDDDDDDD9=Ab/9GJ_[/1qE@q^Jp`E]uP'#VAsYPU ⊎Pfb n;(#bq+%`/к;t]B~wF+$~ZMZF $ z'od"3lGr+~͜KΛd'ًY݀;܇~~'Nk9t<b{_XfV|6\5yrnվ{P0+Cw~@$|WK{$|oCrv3?sc|v{|:՘8| 0wI_ BLǴ"`Op"Lk6.[D]F3':|^̙zqU]ZFL浒%&U%#n^sydƾEcƥDşיY^21h0.^n4bܿԙO2vb̺pcr̺uI3'%פr3ӫ0$GÝמhV:Csv^9^q@h#z۝Y [7-3+ΟY/^r DŊۓ}񽋆5V0wXnU#dwyGq?Աg4'j_|6#lXGx" .μAhSsI}zW2B0P@0m KuDWz[w5Pg+;keDst<5^xZX'(c8DZfwML+*)rP+Mtɤj?楔JGV4&Ǭ{򥅐܁QHJ.$Ov/ϬECcw~:tT<,c”%h1߈!m;+{ ǝ3/3z{0{̜XCt9d")|xPz߿lN2+kNjے\^ոinwv5*=9$,Y_40n23l3^rg7+0Cm}9f}9tDu+xn4xGs'*j["""""" !Fƥ&%xU**t zc4guU%ȍx%YxF;nblc[6.E_QSPjvvg)x3K}d޽m?,'FX>q=8zF<wryj⶟*f:6cٙbEZv)b mGH mN?ȼ?M]9P9Zhd#+hqa₳6.f'$/>n1ݼK/G_^z%&Wi3rPοU̜Z REпvB) 5C\sYKS.2cwA V}34tCsBwy$U+&Ք TVQWH RLE" qif.Od0"_][jXQ)QljFWPJVm6?QUZ2٥}P[R+̗<wa "jJh7*<˼hkx f\j1uh\pd'JDجoIkxy}MnsU+Iۏ9~>3OlKG/XAC}IQlfGRA[{D1ƒE1KERpwqpm^ϟ߰33s3Ͼel)L_ U5Zt:7yş3't %$OWZƧ[ FPVtF?XOltNm0{Nn6yy)3s GUȮ U>a]Q8Qk0*{ @}HVjf;~ˬJ? U- rn_Ϗl TשWܒ@_Q``B3F,UcڦSU Ic, >-H2J J@c庞yV}?W%aタ~玔᚟nHUJM'V{5|Cv G d_^Gᚳj_RU{UaUpuKY)UDK,Ӳ1A[J_z=ul? :W|zK#[ԯ}fKna_ -hYcrA|s-^vgp|+8bUĄ# y3Ǩ=^}{Y Y/q =#0OVߟlǺ#J"6[HU`t H{\}:0Ϸ#?/v/?!>U]OXk%o?؊.i㇆N~XM}x i9%e<&4Z\s,u V{$n*u_lCDDDDDDt $N7J F`P!iPXc#k|F/6}QaraҀn}J/%LӧC*%J;SZ璗fP^NO{F:&v@P- hftEanX'6FF9n4YT{U:PNjȻΩ'js$'/Zm/P A@P^OVQ cAƵbWJGjQM+A$@PFs ^y8uu:umk NZvUJ) v7靉ce| ?_ya@"""""2U^=E7% ~Yn $K'7 ?p[S?+%{QJ*!ܛOD>\ԤUB07aM6P?*<6~CBohU}ͯ:-\'!ζmίE+`tbtbiQP)YGM ԏ^2D,%dڨCsKb^RWI\5wӕ84bl:46\uڿs"""""""jEl@j`0%m?%#4$z( Ck/P0ִR`ajh =釩_szZ` ZVjhzTJ K}5r :PfT5S;TmWe TWB B K>oصERv ö(MDDDDDDta`[f=IDشI~b7WQJsJ @%znZ$VL{| oKLԃ?K_@lZ ϜYi&C]9:izo_U*z @%MkhJ￰cbN@Lm*dI/Z QZX8CADIڠl7G*+%?L~(z5n#}f|_qK a-2#""""""V`T" ƴcP\i lZ(httܪnHavĘ3uqҽmw$<==Yt&!{%<|RI9#pȸ}w¬ܿt3Yw2~5zm^N J%%5֮u݂)J?%SJO .G2gk D`Gj1/ im{;i&k1u@\'oD1e~Bc3ui~R3ޱ'1}9Z1s3;?UB5)U|P c6@ax&w`jJ,vpCt5u= l_¿h:N"`8B_+[wX}wAML<6q" mYi7/ *pmpa<,,t&MڱM| BxNFL49WMIBѷ~_mSc!܎+ bJ=#،KOGTtLWROen,5i+jxBAH_Y));W=UH6w lC"ءIPOӎC;6]e^W0%w-׷{CᎽCXᆳHLv7e[&GEH[L_RO^ك6m~Jn年`M|['4)k،ωl py!||4LĞՅ(x wcӊfM hgdf'[5.mYx|:+:{,%tqai -$v4 ~ۤ_YpEȁ$u?iqӰ?93ʳp*̝ Op/Y4,j26Vk9IDDDD u/ٔBJ?F:A(î.2]^$=X\E8IE? k4$?ݍ1 LnW/~Щwwco>YnGWwoS{aU9nm <v$4/hcCmR/|%xAx㜞xbo-nVS$Ge?ހw`OMKU) 1HoJ%XVr)||I&¿p}F(&Ny8V1>IRhI@s`W955a#$d+1._|S|1;@*u'IRDm ^?_mM)Ekn'|a8;6yk4NC{InԒV%QK`~_zjה5M^»/~eUW+HM?~;!opu d=fĿF&`xpZgHpbf*|T &R>4m3ɟU6b.şB9W َoI 6;珰 mG#o 9n{߭p݀&u>{vgUn*)$w-֯%{ySp˖x@""""jQN T^'ʥ: p%2O0J{5:,D Um$:jO,nJu`K`G..yi1ޞn+g}02Q^[2+TO gbPjeYR2ʾƇ5Sph;*?n;S* \ U[+>yb_hnyB3&}4Jig شkztMuS;ね(> *%{lՖ_7vحuǞBхKR^'RԹj=񯭃$lYFq 1&jĞmEȻ?do'5DDDD«գ):jӫ+GHT׊F?vhxͥiO0w+YZ+J.%h ̧<.P_8[r & ΀@Ft̞tq=^-t~{θfkQH.1jeXt9m 9rK=j[QL(3;Vce~~xtO\0X1w,z&T`PS?%L‹NބD$bycl/d!v81uP־Op _Oփ~4inN!*aI³Wk;'`ȔkjoӔP-o3+Ix;Zڡo\e4mmmy n˾Cs?w"wac0(o)Q&mLK4 GNcIM\H ɗ nîKv ,ҫVlK=o?Y2M,_*Ķb)dUߕ {bnJ.ExqRe^n޸`<ډ@Q!o4Ϻ#^,{?H^f`,|5= 9'.n51+uK%:|GgڱaWr*9}SsXRCj+))}#T*3C?}Mb(g'nua>k>” r%M)QY`(.qYXv8|-gjtAߋ`?1vXގ,|{xx!|kn|58aPV.oGǴ"v܋UY?pLJoe#pcb;|UXkdmz%/v*Biob{ye+ś1W]ᨫŠwKauI~l|w5.ăa<x&쿟FQ~lzo.{(,:?vG !oRi ?g[^t6k\˫F7F @]-vߊ >38p^8 \ܧC\>X+8v-[#ql9|/.8+N#TYKY㒿 Y#nm?)vu.df1$"""$'Z_Qki-֭QZrm;E/a]_# yqJ*~/_֨)=D]c壽@L""""?"߸M4U!ɍ%jmjjҀ~!QCh3JK}s!ַl껨ƟZy5Ii]?L_TX8JSje-HEF}Xޭ;ED'ڱnMNgAbP2Ą3?ǽlvg&E QF~6yE6o ~Ԩ'%%锸̉`_c=p9,gڢ^E~B`ZƦ״`U`s' !xM",5c^ebQn'|`#""""""(0 ~ZI=-[? JTzƳ 1X.R u4*,*<5 #"""""""jFn5DQ HFf׎"pT< fXR BL`cZ`=IW2O%Jhkܚg)z-[M:Py f~1XRL {%""""""0 %}7(`U8%v!mK*<}E`h m/s.J@Ў@$bQ)Ěry.-SRcЈN|#s[B˩F,7ԓ0>\֯ K)@#{9&`^CWT U{U%"""""""jF+8V zR%C b;aTUa*|p6[^熯X[dDDDDDDDFsgl1y.w`s@F26*Kٮ 2CDžC+'[V"ޟQWREQ@zHjpJ+ ՂpXBZe`׾d#h6៑!\XFu_U |e:\ꭱ~}(J0J`ޝn#A-gt@׻xku,U _oCMG3v- ߍKm(vj᫮>sg 1?"""""""b _/g2GA :M oTÁ]Z? ](t"$$@m!5pˮxTuWW ])(lP+٧D}zXShT  K*+زʇ'NH/j]˳8댇yp;ly=6!)z"~?^nDK}J~z#bRh 4- 4JjK0Jj _VW!ȷ^<ȇ_ܞ:%\8WoVTj>~]Rzk?SRUW Ҁ!b|!R¿\CwHLLJ&DDDDtjښjtL? p[G_(z0F`CMh? K)#jJ[#^_ïگ Cz8PO S/\g~ Ƥ`P66tpIqp'5ߚG1|;p,TIDQ`h,4eQMjJZ|ozu_kg nXd+j Nyѧw'_,$҂DDDDt<;`o_T (+ =cU+pJGI h_҂?IoKPTm(vTd`_x 11VKy,a`pѱbY;5_Jl$j". B@yDP׃pB?iP?%) S?TO2gkZo%D`+g>$++kڹ(ZƯR (0 _m!KO~lB@h৆~%S;C:I/д-"}iK"bm6Wӭ㉈5}jCR8y+^*X -!` TjKeKd!"C?kgzZROjN5P~'TV7Z2} vD@djZ? 9m²}?iiRsڛt~񉨨tI-X[ǴM'~eƅ<.p$[X\7/fnqE5X}>^^J71Oy zB |˭5S"LCS1B* $K V=6\*w^/ÍgvYOv!sd8)[6gDDDtNFs4+!mK 7aSqߞi5)~+[X&)FݦH0}J0EU{ؽxRw<1H gPpt܁\Qa/?QX'_0UE0nq>sЯI_ѯ=zcU7"G'coqƢBԝ$'TmC:F3JYXe,ِRSn;Gb927 n:cx*Oxu<{x3~ ~#F'2$""tʭOq#&&&<1qx6U3ypu^-?l&3Ypz7!%%kۮDz $|1b 6h93J_Ъ9okHR{.퇹!=Kmo;a[!A_ԣ o{\ºgsk 31sl5]qbp*x(+ӓeǟ`XׄWU?Ci7aZ+뗾OnCva%$g W qEᦥXd%/'1}x Œeb]Yꒈe233 /oF߾}qk6XzYK5=J mmK7j[v6'8v4 KIұ0T~`ga93ZKYFH醧4(jús:F^T-V`+$|+pbZÖ>^w=Ƶm<{W1'ކs0}0lsǖWX#gq,RW⚝xOwq@{ԕqVT#ۉ^_pCk W{'쾉D7GޏKjM;r~G)(žCg^.ʹo^4QQ ~R aPc_?V\~ oRƍM= qqc_y]qɟKOdfW*w$csd`eg{ŊJ1Dy<=\ez5oxfREd+wnwÚش {ʀYyh#X?z='. ߇ۧϷ!]7>碇vHx kod{jܽ=ݷ: ^. w]M州û5 hsvT>v% Z_}Eff97}O><aۖR*UuIz;|~"6A@J Iv K; 7 )IE-.9+wbcR@'JFu IoPDfW=#AּCVeˇpxw^`mak1r\ڭ+3 ݇cL2>|c|#N1p.ƷW@|6:on;s+D?;W?=? l-yNcq}_>t: 6K4k|_PԖ_4DDDCX2:oRCK՝rwqPYEZbLUuGh#uj9^E7<Q{l ;1nL\1} ޚ3>W}Xi@zJsOjb$s[ òW/ OG~;/7חIZP*EI-(ݭF|8E?o/(O@liv/OͥarIpsk'n6e 3%!&ơ-C/_y~,4>| ؛יֶ w*]cjjВ4¾p|qco=f_rBr5>"""m2F mj} @%<պ~52ooJqN{!:1Bbr 1{Z}b o>H8IZ_[Sp˖ ᄌeQ]O8"-"'/vy݂;Ǒ~V'>C{s㟏 MKKQI}}SICJY|2%Dv :g@Pj6`M!'gi rJK#~? W㖟Bp+^xP9|ˏm´,I2-Wy,h'Xbbx\nu)^+ѦP:`gVsy/P|򹴱NO77;TCR &=ۋwq?S=X ( g]URxv?Rj@C㛻5`\2#t!=ݞWg¸OKŐbHI@u}V Əc`stE{%.>x@I`}0\w$ NR8tHd E-vD,LU0x_ q55ɏß"bx~Zl`L8-}+gYWot{üNo:4-yʵmF;\=2U]^CcJPXOl X3p )(-HK&L``5 ωA JI߱RͯnS\>=)'^ys.L/puع~>R@Ƀ`Mp]]ᨫƊwKB^g]&яZo yT̟d ŁUhJj>s @IaGxGJzg:w4;cecEx:yT[tw)*`{.럼>hCbZG0z[qcx F#1 }gM>kI `˫_aW1첾w;xMg`ą}pzHhCQu؜s)>&?E>_uuȯ] ilѬ"+ǃxhy!q킥*2%nٌԑb0JfggW_7E^^ G_7ơSf=O o~qq'JۚhWdp}.g9 wۿ7yç"Hfo1#8(NӠ4Qk )w `twꇗ̣R"g[ףU; D2<(KaIxHbg[MكE{ 6""":odTUU+.G^ū6~>WkMiaod*SKk+oSbqݬ=uMUΫ,P)к5ȡ4(i4h%E/X<'`и'T#1!돁qcQPRz@`Vi m0!bP<6mF@"""gk/~q5zzJ @AY<;kXe)${:/ NuvŭS-Uݻ˗va1M)@Z{tFUOp@T>maճ1,oDDDtp:I]) (`D#:q NqJ*Rz @  S+}f]>9R ЅN4|@fi6Dq6+J"2 Q~h 09)0C-RTiFԛEDԨr7PXRԤDIOiTY>ђ *ɖz¥W~e [Z+M4?biݐ zh @"j9gMUOz*6A;zg:)c """":Ƭ?0ksP$`E@8Nߴ+5EDԨϲܾ,cGDnjZOj/mOW1?&"""":Vk{* awgr'QTaHD~ȝ~>v x%2Bٳ۶=M/O!OOӧW?ҧ.ORO//?wO}/1Jڸ1&cQWbLƏt?:pZjU=Kea5$"S컀ryaӎbbR2ڷѣO'H'qP#/555xH4#4i:uT8%4pBLcx1 2:]3@sN+Rz1Bg/+i<4Žx|/ϧ<9/DP7V.v\"S@":*ӦQÿ Wee鵵5EfcUV.L`jZ[?Z9Ϙ_/@yA##ۡ[6Ϭ{ː}1ZUY3zgF@Q< 2N^K̀әGaڴq}@p}8yzymMgFa9MozmubCQ/Y˨sbMns_j3^4_ym!VYo_}^X/1QHNa_M^ֶiv4{6SuoY8I< 4.a63  ?~{p}1u #w !6b!GaS0'??Qdd,7''EQ~ `yG)z_jO'լs^O{׊2gy"QGt8С?iԨQE?)]x, ?yRzf/C!+$=y Y&PZzL3c @"z\]=0EϧM&4g֘f1>{]{>{WU3}7%<[wgiFMsh: rswZg1y>l)L"qjt J|>JQ3:=?O;^8~PiȾ}"b/ҼSf #+Oa{b 5tBOxkr?<> @_i s)ed_qD 8FP}8o~yHZxɖj/pre zw}W©ePKJ9ˬY0W3YӋw'~i">x κzBD5kC>;u+'>i=d' BP)8~;7EGtٸy $d74Gia@Ӳfc\)]Qc{AQ˭0R.{|x2~]Exo- oy,ߴGO"ذcLR/WQ##sor9 QQQv'lǢg6/.Xh<;!\/.]}g@HDg@#TiRdIdxξ[f:[ AM-eӔmgbˉ=mq)옂`I%ܛz{"iA"zaC'-Y}~G9l8 . @ @gbڧeT|?M$Ϛ5^if͊7~ ޝyۂҾ֠}ls䥦]e.713b4Z{Jkذv5.X]K/uq- e60Vsq5uB֝`kq7Tաւ!;>v>0[Lel,=2x.Yܐ!:1||a4cJnN0 c??\5tij=}1y8qrOtgaӸ=t__6Dy)c ؚ1qnU"= =CH-^W;R4Lਠ4S/z.˯g0h*{MMޅ!F.}}Sl/>ڌiq%z'wk| U0w3 uýC*ȿGxkgN$r Nܟڹ#a|9pN"uX{U}uiWq<]b-}W/^^i2K4:+>8k>?i]{ۼNı=شt.^hc_IUgbӞ#NX<1HofEQ^gZ5JT#wF}esWca` v*K}f-Ś-qHm'x}-8%|'ͅu:M<9Š:M`'3+G+zs$Vw:* e'c30)|;aض3y_ϊx~+ڿ[D.%oN>60Y@)Lulaa&3c!˖ap+2s}y.6ek}Aw~|7r{%haɮ4y?boFz(ZV{rKEtF@!l[wr^V}  [“b@P k3\^'oh_`c, :SB^nYy] |X\+6=s8[q\BDt4#Ն07NnTER4BօM7<5[˸zG6}lok@0B#"|ZV^⼎;mҀ~cq^ǎBz۶RAqwo|34qƮ b}ex8v^ 7yU]Äy0Fh|>ty$=HRWcP?([¹]s.c#ؿ8VG M.Hܻ*Ηq㻜,7z%NHX=>L!1sg_ᄎc?sQ &1[QDT;cO1bd 7fwCs1Xao!op s"{3~l aӾw)@{qUiN o^=NÌ3peG(gob<!E s?Fژ!ݻr?] T3uڵDSyo*x׷n4ޞ/#mX<߸q_G 艔_/^J4+?xSڂ`:%|u*Wj6Zz{WK:dgkx}04KC *,˩^eXOf0xa0(+ d#Ogs3Ԍu>3Dhd3~q: |!Ca31k09_T&c|j݌κ*;4a_a~}ym{f~ɖطd'A9~ zz5$^xz4b@1TCK/t )7ujaR!}A>#f sKsUJȾTX^0y/FnU&ڦ/ 9I7o^g6kX[O}ƣQ@l۝OCE8Rx`?^g9Tx/oWw~~rtV'ţط# 3g;d^SK4^O@"tb:.n&3 r AYN|ώ>#!ʀc/5s qYHX|X@?^ﯯƿcю*\ 1iO"m 53 y喝8|"vJv?,Ea)|v<]/ &iem9/+cFM`RGS:F[jrbPU'wFk "/ӱyreH8 n֗'#aO KOF(sʼwe`c7@+O~EVcAUtER*wgJKUHn333Lmy'ǩ2v(.^#eX7يɓ{c,.UUVn] ̎ G@B]tk(z4^< ~3~%s35,65߾-TZޙnbnYJf.TH0}Ua!WڎyFK); sG } ]UT wi. 6ZU& v\}Yb#3: >OV:_]VJ} 6=0v"s|"b.m\ [,)e_Xy7fvn†?4~ qT2F?J ؾh]ftМ7ѥƮn?hm,BDjR2k};|5~نz-~[M¢zO*]CvrTq+ n&. ^5HHˌ« [c8>(rR|gRUwC "5:L.u9/kٸ/u~Bf(u3[D_1".鵉ynB*Z^xd euQJͿn5[wL#ݦę;/ws-ĢĹ"2R CuC2ҀZ;>\(Z1WbMĂX4GćG㥟^k+Bʬj˼P F@/$4s~Nj^#;'qwȽ8PtK= ^E`*,ߛL5"RSJ{UDQ/Fx S("*\^G8; ;>!;ENR Е6YLV2S egX\Um_aKOn e@̏_޻R_vW7wꦼ "U7Ad =:'T):rBxF]O.E "8oSotB􅷃RxԨo6u6ϊq \l?O*{MҁDp1,я bMG 9 0QR¾ΡCudK >:#e f㋜rw.$ؾ)g?.;q;wKN~} N N Sפ Cж&hQ~k3m `l\C"z1b = ݯ­.<+1kNiV!wb|\6y~*}!Oxkk}ե"9E7#MLTh\OWJĬJD?JFҔsCVXq-u+j\]渖Y+N)x _Q|TictKp+y5WCv< :qBv. Y$d'ܾa)rnGVr+VL+Z_BN)K ӪҦ;T*'sG^:!yDW8UL+/qE=kėk_i s)ed_qD!탳pM8ˑDy2 ^"d¬ug,~ҩїq}޳;,5e'έ_:; +ɅT97ך8M-+3uKtH޻bؐ^\GdވCiswpDs};*zBDƆ5V9x#[g;|Iw6/Sg;q9<yx-/r1;q.?a#~\tHMc_tW.#F6C' DHidSyi5=6Qëw.Éj?/ُXַ\|:wo!*1\> v],[:Ix"oX?K~4˱l䔼[BdP0{@xwXx[W2K6S S"`ŌEXu1F.ISEB]V.yc֫1I\ڏ'egPaɋx8eC T?徏ӗ%<\9' T7ٰ5c^l!ݪDzAzn["ٯXRCaeŲ%[ӧ0yȐ|,ĔdwwM;K')Ob?(oL>sVp,WflP{ή.4_`jEZ~bPP&:_6eD^AUп!hhw};3ҧgŢ)P^oqh'Dd\d:PMʭI^5\$fvkjРa =(?,](&?tpt·!#=i/^n:6- A#Ӷ~<~~gƳ>ۏ4l|;ԹF6"9:WZа93S_ &z <^ς?QMz_>H>V':u btD'Ͽ[A@1'qAM)}JDxXy'ccg$K Fj2\-}U '\QMvʕ}kyULMc0?su.RDtObFEh޼ P޳ev߫W$Ѥ!dVh, Z2_EVC^AگK]ISer0q4,LCРP9Q,lߛ,=퍡+6hdz:/_(ZN>V]ːsp~Z 4~j ɢq5!xh.<4bTcګ|CXAQHZTH_hn#hkRޣ⟟Ki0rk%l7) )wy^=%D¢ Us螉HSE~_1/= %*vCő53s?1<1x%.Zg~B~~}ٙ9S1)8|}?fZ:[KU Cy,$V [+5xOVbU/JRȾ<\ c:_ݳ]18Coo R'aAOו?13pSSs1 ebϚqc4-&KكHN EFv:4Eѧ^8)jŕXpSht9[k  (,2T4f-3{}HK|<]<}Tw>&9T0+DZweQ =4Nu*\׮0Jj<.߈ޅ{4yIAl ':ŷ>ChJ3NkAjeUj08QfB.l\-J f& hu[3;=ҭJgg%ZJb/G7&~C>+Ya/ *SA9s[y f0Q = hZ$fQ)/`׮& s[sh kkO)fu\J GTR0FmA\&w5_ d07+AJ?:C?jĀ<)/0jҤ((yEMbOW'jR~l[mot})9,pى aZa妁[<F|Yv8Z?0,(L5TE}U}UW㢥ZffQ,5h;1 fĬrb/zήGV"3lx'""2ADDIQBgˑfvitKD)s\;flGDT!5a @ƟrDDDDDDDDDF@"""""""""# cȈ1HDDDDDDDDd$""""""""2b 1DDDDDDDDDF@"""""""""# 3aPfB5ѤISf'XȈ1HDDDDDDDDd$""""""""2b 1GΝ=L "" NFDDNCJrRSQ_ P(07mly2iY[;{fcȨDG /uJ0_̌ &DNv6]ܠP&"""""""2"bͿˡVVm;fRm?1 o ˦$'J˓qcȈ$L@NN4o BQ2ragz(((@nN631HDDDDDDDdDQ^(&+`,fcȈfjyVP0ӌDDDDDDDDFD̬ؼdڽ)))曘=?8-bTPqԩbA@i9b$"""""""2Rb/ h4deeI Ḧ́Y@DDDDDDDd0p@e2 kcV %$"""""""2bbOlȈ1HDDDDDDDDdH݈W+5V尰B %$"""""""22ZO"//޾pq rrKw [cf 01Q{^LF 0r{/\g`gk 3rj]:" q"Cz!//;vrL& dhڼҤeɸ1HCu[NĘ1kq1?{^u!9ЩsJ0 yX? &N[}.@BL, VF >}PA+ju_N Oddd0ӌSz&6OBVpP(an-hAx Li,7)쬠3& SS|RNj8w%ÓY>__ 7F,O{+VS=N' !Q8]Q\q׮1ӌT)I),AnjKy N@ N3{8}`J' S;[KՒeݠ B^^P/{رHB88&FrZ?"""""">dai F#sޚ'@񹩙4Z 31HU`wh3"uBlI׵bosILCϣ<!;㯽LQN#t +G< ew0K8.>r;>.J$e^G\ k|n`~yY):| /="h߱EuѰڿ!wX .^τN0r(VIÅqi\Iҥ1: z#{0jºYcN5orҜU?DDDDDDTOz,=/O%Ge  [_tmW 6-i8B%#On[ "dba\J̃L)C΍ |UL`wwarl6 C:Yv!"""""!{LcVHU?hUȈ;]ǯB$ptӭOF5V@@~퍃J戮S.6[_u۷"t =^_ Xjcqn7R؎Iî/fc>1-Ct[$B-sF7>+i.+iSN1|Λ먀NNT]Ql^]<]_!hII{PW (vC_݌xOUFY|pD,&&&P](1d=;:I.hrq9NN&+8dgkD#FڦVxumv yL8LG.fOA@dal""""""2ntG #ƻ}d (M0qgnf̗\YXuS[2Y7ϴ ^>nߊAđq4ϙ kW |rpRVk<*3A_9lC%:ЕXw6 f ڀ@>4He;4ʣyO&Y[Xw1.u2&_s9lCV቉cxSWX-`cwk=:3_荎-YN kip*:&A.ϿT[?^fn6d![e pV :ۄ0'l()T ?DDDDDDdޭP¾eVhi I) &1fvkHO;,vDNMh\`-v~5_( Q u~0jZOBA#<T*hu鬹W0H 'Aw}C !""""""""2b 1DDDDDDDDDF@"""""""""# cȈ1HDDDDDDDDd$""""""""2b 1DDDDDDDDDF@"""""""""# cȈ1HDDDDDDDDdLDDZ: )|,ȘEDDDDDD1HDthdgeJt$㑟Ns , +YDDDDDDP1HDt4 &MUҲ2q%*GDv A@""""""zx =dg!8$Z:Vybڙ fgK!""""""zXAǯn@tu:D^@VW$6jd3Ou"e1HՂ.7}7&QPyį9iu:a7󡫎;PrXkxK(v07ÃqZn~"!4M}puh5!%\vXT$cT)?Pi=Ӧ+>?35"*^w_|6xqc,x7R^x|&<UbӜ8z:jDy#׈Miwym|s |Pԓ֣E\|=j'T t_Eo"e01$ >u2$eTVt鸴c Ftr`n5z y[џցd$ޫ=~5-@krSsʴ((H DF0Ll(m! 7~E;ekQvx\sṆkS1=ȅfu +~!=g`coY߬˗ЦX+["oA^0˿7#z.tb½η^,ԋ۰jR`^X`  W; `l ](.!4m9ʤ|e!hhN+*/JyrS\jIԹk5/ɤͤD;;W-beM.*D_lGac1X1D$i G'<׿9e8u-v  !s㈈Ty\ƅ{l>MoE䰨mߪ&$!bғRM\{mm;:RZRWԭWk NaT7:HAo6m]1#/j%Ͷ ;/Wktb`D4}+ARڹ^=ע E{4sd(EF05"#c#hwݼJet< 7k;\l6m%G'TW9Z _VJjQ rm5x S˽3;d ʻm6OGp&Z6xy """""2ãJ+^;<;} z;Ė܈Gthr{`+7q3шtBû\$-5WZ4q]eQM N A[n Dĥ!_ieFВٴAr:̞axQ40B(k k5*h4ji^Y%T+-X@L=#Zz|H\;]ʽ ,ddq\`""""""c UHְPζfmT?8}'Tn/3ކ[!6.<gn >FV]rImv|.{+a'~@PU٠ca,ӻE֎(S=D] 5υ@j}d METSܼȭ\[<d%?"BYBeI&,<b(ܽQt7.݄]0$RX*LMlwXn kM)ܼPW 1ZZ֊T$f>ۯp;]}PO v2Ӧw,YONv܈ʀ}GFUCꋻS: #&,~7B@xj""""""U[f`?L֫-y% QV~52g<6)^kGŋ`Zu74t{%Z)f~k8g:>^P։Rj*l#g`beh`'s^W;s51|\5Jn %PYӈl=6~{  Wy!ǰ~hr crD.WN@- ~ŠҲk8̵&2YVU#zI0( &14dnMi%ñS|8Ը+{qsL̎5krsrp* ͛5L^DZ\ Rģ> K ?8[0w!4 ?DDDDD7`OXAl$F4j4O]؅fnnG1b_FS1oObI }R;@L^Ck5Y<:3W`ai);/q&EA@1Ҵ0gKk' BW+s#hN\x'"""""MxH_?u+{ `n8~B/׷4Ii/'fIl?~ IyЙۣn^:42""""""M(6&rrr `~^]ˇ#""""ZM$6@Dt.]{@#\`I|>D>O=&""""""/1HDXZ[3Z``"""""""""# cȈ1HDDDDDDDDd$""""""""2b 1DDDDDDDDDF@"""""""""# cȈ1HDDDDDDDDdLDt: #-ZzNDDDDD%n}FQm~g7) $@ tT#E(zUT+ Ez/!BBzdwM'$!Bx{,SϜ93{sf `iik[;d3*:, nE݀|}`bbA`eh9#= wn֟՝f"t Q x+T+Uj ,XaKA""""zZ [klb o_?\񰵫Ō$J UWO8IDDDDOۂu߂."$J U,%LMW|kr]0?iSm}]-sI,f"U:*>ŵ+X7O=u`h 0%j4f!U:JV\r,Ӌ'"""" >;Wq$ UiEGEf}bLGsQM%[-윊szty};m.^N 6e2<*tSs+Yv@{Ș#V_.5"A]_f<֭؀X"""Jf >; ԣˣdǎu cǎœ7(SqDT9'MKk&e 8ߵ '*jMїzc; G?]L1{XTX8Ywe$ݴt@&<*T^ghhX>\ 8"#{퍏&M"X*~"͞bٸ]퉪Ni!_ -ZMK܃oјY7~bӦZYhlZ=vaiLaTu |qes=(DDDD駟om];$X>ʸʠځӖA{L[} 5D;?]݅8?U^>z <,taJ :XIpIԈ3^ Iw=6) у rY~vᔁ5#j=Ey*&3~M+OQjk~=._ vں#GC` ꨸gu\EhҢpϵXIUPzmOEf^vko!CC}D@^s6#(,=R(`[gǵE<⡺kcJ#= A'OSb&^śjrK48o¥ec2s/-$"x]W[rA9,RUY8!}(F qzb?|Qq)6Ba㝖%e[bJu{41~aǧ%,rɪsX0K\Q)"v &g#> Yo2n</²'p=I{ct2/5ys#K[FËbs/Y2384GW%{pwI  C 7s?Jz6W |~~Yuиh]_'!1S#`jg?bTYwp`B}w3`4 ?"""Jp]?I\\oz*zn3ajZ=zo7)r$b`NI yHZD1`ODm8Vx/cͬZL?`5t f pqŗz6a psr,B amٹq.Ρ 18m5qi_~2` [Sq3"C0M(Rߗ%P;Vesw6F<2߁:TƹwY)orLD,3K#>hTY NxMpzWa)ڇ\ a]⼼w=b%C #/ۯTz^<#So^prDugEj2R2d%G ^ Rł<ǰuWOF ݅}DN߀C` f?#\\'emB5 G0Z4MOũk*7k sw7COyxLgUI UK^̫vc `SjDȃG/k4]\-_pYa=f&I9M݆[ӵ^ң>M0V#3YrK]L=A[vиvA4[6@q`4M# ].zh/l4@hw.DDC]_&:`d'g+HA+`}? j Ly|w$ hTo?/=^`H:cw?S\u򖈈B~,l9FӱV J%,?McF1hKe`z0H{78 5 Jab:gQ,f=wnfn(rsוo\VeQKT27bŖ#t'Jj|y3]J 9nvC.^hލ_ -#r~ ibc!{ԳꓗowĻ*exy#g{y \oMy!&ݾ\Vຬmm (Խ@!4"r1ߘ.N24yc04d߾[*;27Os*'"""%@+d_NZJjO% p9 lbQ(`ht$7fIGL] 3g`g =e Fy+5{}"z{ }Ye 4 ߇[a6C|ي=RA CDmCa( xپ2F,P~,D71^(: uf|fREHRAr֩/"[}yrVmW6hd5S4(]2B~i?K)OS~p-gY̓z֎*2 h#8laӨNBB'KSsҮٖ'9"""/?o'׏WkruފDrR >E~S3;a˗qjq"\X UyWV( :ah6hl ܾ{0^`2t={i7"#bGa%5adh`.QLd^ sijo y$ad3yP /;vǠ0BDh(50B.@Aw1j crҿC`m~iJ[&'ਛ@pOs/jqqEmiuiBeYGnR/#ܾbgVKgpcKgԕ'Fy)/,o"#"""}Ե7Hꊚ/X zвu~2/)}˝8s  Mb Ramh[ {ꀶ}`{;#D8Xs H9ȜyHl>Mѽf|~%,-Y\JGq;vm0' 6 WibΆ+M?/yo{*IRȤj'6C;+4 uW,v5⢐5ܴWGJ̢1Z4FNjbEܷnAa`,ӊ&֤ l-vfm%P? Zםп/F+.s[ YF}3 쌇{ϡM]5 N3kkc٘#HxJӞabDu;>ঢ়yJ-*z$EBNw%T/bQ&[ /W QZ*<W.=݊G418ҝa͸!۽> R Iok,2lyMݲ KcSGc y;tM: WaͬcP8 'ZEЉx_5;~YY:!dP %n[:40rYɁ,%TGR7a|+kкK0k}y2I@|&C m:w,Ҵ9lY]Sy""" mx,}G OdR @MN+@T…HL|.661r3vԈs7*ZV")lkbS0pW1a@8=mX)wݝ =^(wHNJŗZe b i.Ց& >~z8ڵXl,,,!"yN& Cy:tzFCu\St"T*U3ԡƺ4N-M366ѽW6Y,Ho V};K[Qm(9su |Qv'~Qi0h+Xh177!R @A̩W3jgDT%V9 @`!DDDDTVAP,JRk@1MDT$*kZN̏Wȯ<4Y]:QFDDDDTmWn ϫA# T+֚5FIDU@"~uQ X_`:DDDDT]/BʯADT$"1)&&9?Î QзDu!g^%ʟN+y-B_+F `n]8!> yDT" u]p!BZ DT}"""""""z2d""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""@""""""""̀Y@DDOF(3&L&$0Ri4j+{Je&DQ S33drfc UZ{18y8aP릥+w4nZ$"""""j| U ozZ*N?6: a LL!`ff'M;u82tQb&Sc%)Ċ(KGZ5b4ۧ^L#"""""z ODœ8{+bEWq ϟqa1cHk\M>j4 wOo]0 ѷQqDDDDDDU@zC1;pi4bXs:+RyXr/O?c¤ڦ1_D011u-igfd!"""""ŗ#8c` m~(y!_G`))~7l xa@tIѻ`ƚKUAfᄀ/y+zHzi [;NfF2v"z{O`w<.{8q9? ,=stN3q},tW㕐[: xm-(2R/ s(o] `64nt";yHy7 џ*3!f=,-33(*TF"!;e f\+]Lí Hr}^sAUd%-wGx{Nn?c4 _6.<un[g )iXlenf NnY 4}4 Eݽǻ\,k:nwuLȺv~b*#PCewon"Эʻ^ylL0,^3rť7W}TYiUb Oc:!B%l5Uv@mY*S\P%6tE`}K]O˳{|#Vl9KwTA̧U\WXj9VNMe2͝C;^%01V3(~3 מ;C37KT#sLօ3de[Tl*ݸ-SSrJ/!"""*PR*t/JcTٸg?bpc«XQ*{^#bȵw*ht9aҿ15j䬥%d2ȥC*JQtT]IY3VB4vΟw$>Z5{}"z{ m]&@}ؾO̟m>Gf&ر5y9V-w߈;eDD&R4%-Eܻlԁ#oEC)+/w:ʙX\CgWkד}n0ok4ބ"\Vjz厮p6 wGj[V7j`ʹ_0CNڠ //hP-eg@FF:ή\k1*Tf ѳNI/*0HJ?sҼѷ?k 0mxrY<`/7_}VtD=#7V7WڸQH)  l;۽dhcЮL(3 Fǖ9nFAtQq6m g&!Mѽf|~%,-Y\J>[kMe{o-(vڶQIjcU=Mo]-c͎1sudN&ΥLxk,2liJ[ail Tr3h!wL&S;r  şR/xn^i""""""Z0(}A@ =(wHNJ|L4QX7Si`h-"23p~dggÿyhp>< ZhSɞDDDDDTV]{+Kuϙ9푦ޫeAzgvAzз^""J"TؓCR JY'MLQc*.\kBydKA@ }I?""""""z @$sA.D_=LMMѲU[ܿ.]ԍ326֍3eb @"" smht?"""""Ǐ-ʘ_LDDDDDDDDTL͙ DDDDDDO` ` ` ` ` ` ` ` ` ` ` ` =b"·–ӉDO?T6Rc%mJ;+i%\kp:K UL]<2 ߨ.aGo[ǼPğ pWS]XMSKM88e՝R6kYW7aC!8_SX*IkFY5Q U=1 ;AͥQ_Ŗٳtr)ldkZume9OոZE =/5 8{Lzk|7g "aIkFb` =db;ehFް4,rl]Vx&"""*~_|8׮U?Y]t~w :3[1tT fy[dL߉Q[>)هhQ0,KK^\6Z#|f)->BDDDޏ3 SF_f%X(+!t@VZ9-XT} ^&}6D;?ݐ)NƴPO8l8Td~mѵ¹ nQkkf9TdNh`+˿`- X<4F!C3MV4Y"i^0L+(% [Iy:ߝݾg=t#uLkcˈKAﴱ.[Bb?y )PjKkt*x>HǰHjJ/+RY.ODt63{B2͓IKj)L`N2)tt>>w -&Mz3Yu[aV#-`#FU2ON3otW_Lݨ`?~P=Y/bk _;xZ;zʋpO`w<.ZKci{Y" ܶl2\[ep =8v=~9Ghkae!ri[rQDDB',> cI8vVn ]mc'4ܺ$ח15w^KVbrwt!,Z3LP?WS !< 3v܀AqV"rt:X /}#lSqv"1s짍Fq:.M7 b㕇˓R`R򾉥y \9q}z0UAd]4U~e]gf NnY 4];ݠXiǩJ)b*#P6=`CXM}:}ܴi.<;~ٸfflo o5VNO!,Аɘ|,ƺVs"2,U^`=(EBKptr(|_gU{ Mzد|dprDO:!B($'#,5ENL[ȋfhX~18</=yI)aY./P)<٠-p:.jp߱]qw7 WKIӣ燬s4Z. +z-$"""b@|<$(Z[A{j=b7pxs;4sB[R{ss[P)7bŖ#t'Jj|K\ Tf/0ܱ"*Pݽj[4+g+Ӯ)% =df66pG?(1jsVb Tk%K$U~NA&޼k e-Sy,6V2IJf4܈ pNĶE'Y?/qHXQ@?I-!-r,dIhNXH4VVH cY矠mvmPfkg32| 3SNęhu3NRCj|shEE΍Rs Rr,9jzР6h˦{p'wj22PRdߺ[b= ҋ&p2/xX厮poͻطr~B*:yp;ECR%Ҡ<]ھ2KX[w'٨`i*KmU,XX M,.]J+ɏ#UWnFdD4N: 0tu\MI= ZwXV-܅;AVly;س8,vVy){]G4r4`臎響j^szE^pceU:zu$X{u-\CBѴ#!&ZĚK1s}vufuL*٤4o%n=ؔXq00wܭdOSUg@أ2HŹMbc|L!_p{ CmbŦy6tm ‹^R^-Än@~NL]'B^GI5>/ZhէN,iH ֱ+zUYU%r}J3mw#̥qE?5Auqz(| J95=~QV0i/,󈈈**zJ|A}A+ ckr}A"& &1-Գe ˺%|w[Yn%il4Rr+ ߤi L]2""=KR h4ꪵƩٺi&8|p?F; + =iD]`⋹K{DDD½Wqyw5>͟DE~j(eٸ n2HDDD ``"""zb}jk1R#2~ W@f>"Ȍ#"""z rʀ]( """"""""$""""""""$""""""""$""""""""`"""""""#y}3C1 pv y0HDDDDDDDTåARA Q .6J*jF !""""* 00P@`fP`gDT_vq*RSa-, {:fU:v~1HDNV!=\p 6#cC~|<Ϟ1jն!Llc**;ׯ_<}!DDDDD ϜT&9DT.))DDDDDT6u0U pJr33A Q]`허|v6Uv&""""""8s,߿gkk@thUoMŋߩ8`r9c9tqtŏmw4{3Ns',CYɔ 1 g7{x=>{~xqaL6mڌׯ낁 }޸qnڑG4 $;vDJJ cT-װ`k+|8z7^#pqD6 Gc8ۻ+^na[ :OY =\8anC91\;q L~?< ^O :z~7 ѿ__4nD7m߾}ؼy J%,E /8gt!27hDDJT u*{_Cbxcn6D$TƛTq c'>v vfY_ޯ+zw IwXfW ZT쓏61{NkU_] wzRqlIV+9=b2|;tDmѮcg? b!FeVxV]bLS"gԪnѢźdAxakczݻʵH󦦦V_|1HeFZr4/aҔ)d8x+Lzb<"/öyOt \m sh7LK<5&v+fωD n\9K#T۹bb1}O`##X/X{yZ"o-Ę?>c[VGh{3 ? o 0e\ͨ>n}@DTܹ A@HH3]o9[ʛ?==;wb`Le&pB^?M\T8u'{2pzb?|Qq)6Ba648y)V<\)tzbYĄ}W+k|4Q缇cJ#= A'O-8l8u )PjƵ }]y553֜E\JC1_leBLB*`{L {܍d9Q#u Q1YԖCKqZ4nX) Y3YQln)"y+Þ9CWq'6 S9 |=0 Җ9aDdBaVcar"Osǖ}λ%z}ן}3~/uu4ѫΐJ3qnn(͕>gay M onƘ g(CeXݧ _E%ܼ?8)PQ hvXÄWQlUUc{'Vłp)^{?=.,H:<}I[`FèuHão? GĤs/bQ𑞋}w>H&o~7& J%FƠO~O\iQy8£5h)QvglĜzUQ@vziq!&2S;Nj>E_yo{Ah6>V|ה<; R(zJD8uTw(7wPPBQSu-^R&ìfԔ@z04R^9q}z0UAdgiMs/Pg־X9}>_:j 㻺h+7%m]U1`-8=Mٍe6A&qB$\Q0Ȍ-+tk5` 60,^3L!.2ƽ]>*^P=I'7`p4 3x=+ ){p -mKq2?c@-=vGLk?;G K >0z0̸c'sd"]gD1E-o"m+}| V@'cp_`P ꗵ>|kK F6^~}~ZO@؜Hk?#*X|>n|/^=S^3AÂ8` RFVɶ~IX|FX8y=b1WK-_KGS"gEܽ{ŎoBbbc,=қ5 F~푗_x@JT#++ * w.`Ryܛ]L'nӎ hFPGW瀌[v iN.˖Sa! q8=~ECPaN~ {8ٿ8uM0u Dpf: \u3D/ԗ]RM;6CCio bLD^ƯGN3cCbݱH4Kx~;@k߽O'"7z?n[,pyA-r|Myp}iƵq8xQ`Ma Gj[yK߀׫~n5 rFXB?k2揑 <<\MǸ!끽8lduf2U9Y˻ )]i#)X6!D* SO™3w rӞnE/u?VO( LξM(YG`ոc^5E}SxO]SsNᒪ5 Wpl*<4L;fѲYNzB &V8iUGS |}.53F;ƞ;u(?㡥i?cV2{$ U_bv+ 0y.-&**߶tY:\,#ۆL5/'K*I <|ثP(?ذacK%y`A3b~η]߻c-E&G} 7l\>".w=;u w!,GX_awj HKZjR*}1f#Fr$B0"C OÖ5e2Rr"5l- -MW# > !]m3db6}fbjT|ED \\j! nѦ#$$!)YAs{z᥾=HH\V:M7rg4 ]Mu{ByȹY6o6y >: ]e2g>0`_5˵]m;H/ Emtjv[G.97.bF;d[ꎨ' AK9Xy,٭qU ;qp3Z?{wV{N kn9u9馛Ե1;b=n`\{={:q b8kc4)x"ZH^}Uˑ;aWSG,y咾7MUhl/~&mA{A3nO.~^}i͋4-S5"*99f\\VB,YZ3J-?VB0-C %ק̌LaiGk$>ab[4?t- aK5X:Rnn_wBb QvNj:֗Ŕ2(JuI Կ+ 4H.;bf@? 5 S ,^y.zXR ZH*Uկ2kF~5m)؎u+VbX=G4J7+:eF e2 5; 5ӝIhPQL~afY~{WR4') #R)7ä[vOJG.aUKթ_+~kQ\zcQhNk^]'NzW#_'VCd^ >~~UtE깑X ޭ圾MGܷ]$_"zg")^y"Kk^ 'tm,Qj* ?aBߩYfi =O:to, ?owT)H\}m|.$?9IP .Tv<$鸑@%77=~\f8eZlj~eٺ!W!b-x]+]]uwD~rp 6Pҟ8{.}+]C]&xXK_2 qo 7xp.*I>a=+[z[vb ic?}iK9iOs}S" U05-|q_|?9ZlYn%D R&E6W4_8sņ87T:?Jlk %Gdb`-*Ym!9Qahd9뗺yEy{Fԕ~ngAdU< $ioV !!8k$_Î]gaRbo/X%&߉c#p*<7(DEX".Dٓ8}=]5k7{zꢉaaVi8i85⇕~NTxV6FܮXsNچQi%ꞷgQ?/_# xogp6Jd\?> s FC ~e+lظ4D {a9uEVNWXƢ+ 4dyJ$%g##q*/1ڵ^eM_=g̯2ryEvMѽ LƬGy WUyCuSl޼ N:W=e9sy1l>O*6R ZZZK^p.\]"2 ^L}1&K|^xB1}ѥ9q8KA7gm k//k3{xMT?Cwg| 7-Ə;2+YJ"3寢Q>GXX C+z,^P}o~x #~ sĸP[ɣyv)U_ǧ!WjFx7/1DL2tK&IC ~t}'ԟp2v+`lתuh/Q_|hD|7¾: FjEO=yڅ~iȟa:Ɂ W[-1IV izlnhݡ6.Cs{-Kh_Ѝ`b\XyF ahm3GCyT6M%X^Oޟj0uOWOѽy9Gĸ!'1lXw 0*i7 & vTu UհL?+7kl0U+alT\KY*/χ)Au1B}UeLLL:u-o5s%vvxk[H")KQQy O^B רX}𕖚r%HRVf؇:ƖBT00W,|'E>d+\wCYeg18me^ u~gDDDD|s|W R24s_Θf!"""DT.b4s"*a1%lʻ^/ʬ:>Xh_ 9GpLDv" ",b1,,-qn'%|98E@DX$Tƅ$܊_24ˉyc"Jw9 ]\`bjsgOȡ,""""WOQ!caYDdh"HNPU3˄H#%g1GD@"*7r\"""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$"""""""","*o X|95k{$;;'|}}н{w/t2Pn]2ݻwS}[{K.Ŗ-[\ >}K>}!י82cV8|Bߍ_OF/OI%snoӖ"O-DE֕[j~\=k?K+#b<,{YpuBHYؿ|)6Fr1+GoY1іc}8v)Ȟ1'>nh_Y[(S1lS0Ba30SeD浽XbN\IBL KG5=k¹WVa;a{">pDra8 -Œ9}4*P1~VXO\7c],F5Ok!\ LQ`R~8l_(/0`5|>#n| \_F50lha-دsdT fԧroq%3KwjNsЇ?KC1-K""""R`]vv8߳Uϝ;^^ L{(}7Ç S/syuOx[ޮ{ ! տ D|AM}evyXUAw'?EMo[N#1G "6-;:0p(֬^.j0 7/[Р{kV1-$ҒN-B=X;~0z:6-ms}v`@d?j)p`w@u_e-/{blj0*𞅋E@2-sHǦT -*tlؿw=Ŏ_j.bռ=Ȩ1o}9w^G|w4߰n1#:`F{\VJEߛX/"k<3D丹O,AÛU] T"w+5\ C&w*PGrU*]uH3Aʰ9DDDDD =hڴ:h'WlN ym۶U,l?!'aX[[? -/Xhۯ$ Œ"f#Qf,䡉ώR"y",GVV)S >rkW$4f]$E5x/cطo TY/۱;UiNKLvzmk8A_cq)AZ~XD(ŕɻH*B~bJ-"pA@P`Bw3Ѵ[TkEb6Oa5݆_Fƚy؝Y n! };-h(Bnf9iWtPpF t~v1p)k R `])@rRm 5r#k]a8@}U^]`6j[> MpsN:ԝI4! NDMZ;v{™zBN8O_߾P}7{%'O,v.~z柴j_|7s&~T&-0zL̚- 6W/0hl%R>#)N_S `{ѸfgXVq2\IR[Zb8;)6I+,ZVFKш44+kCnP]T@.?~)b88gGN ߸?0gw WgD ,=ضx72뽉^!fEח!M|ػ _ l-qbn~r NnW 4$jժ pI#忂&ke\xQϊ3 DFA^]p½dpXH2$웇}ѣg}X 4vd#[Z* .h=//cfM6ھynW.d!eYAl>*Gm-տ |?1t x*\.sK F30fxX QI9PjȁԽ tD܉Ӹ_5oWLc@3\~M!xͺ(r=e2\_󐞞=w쀠 {m tn +UKOKMi Ho֭Z~֭ԁv>%NކǑh {}oz##07ؾ1?o=ؾ'!(̀peHDDDDD⌚9;;;} ׮^SAppܾ}w]ɢcd*"r)qq0l4 [?B3k}22$읅KQ1'm`%%d`ckTmeI,}oLÐz[}B ]FfAkY!+E@  oT2b '=u@ezs; Q7ի=nWö5/õVe:2N[Qˮ*"KTCwPcUG`SYRDRy;%UA*.alO' J?7f\Baʍ3$$uTxU۷;|5NKct#R`j"BVF@ːKv`ݖ[ AAmK|`a͚5\G &^ė_tCe |- ƴsOgv [FVyqjAm J¥xtKQ;FkHy&$Xd,I΀[ QUrJίX@q+wPƿ>i*+C,_U4kU࠼E/jͽsF`!h.Cv2]|3+q ;f65=<̑ϻ){D[7[L ƪBFf&5pdUj`J)LM,/6HQc]=+w/-HMA@!Xܽ ~W8[PXV8WϞv ۫$<~Yeyi#B۪p6CB}y": Iy^h昆؇ vƁhx6 {h=Z#vF\~,WlWt.iFZӚ_=ח_xp nYms5u>7T߼!Vٟp1"=wEq> ض`+}{ar+y)7κ_̽K÷C0D/|D&AxS'Q k xj6>Mkpv -ׅA(ΆpBq~"k:X>@.DOY! =3l-%A@!N:k g.HCS ܈ˁ[cz=KuD%+gq|,]5s,^'FnJkOށxF,q'ưu6G7oICW}+ dR!%2}{;Y"-[mipk\_+i8m"l.os $\8K7R`W5j:X&~͛qŭ z൮LƑpʭFqyyODKႦ ŞrFDDp@r]̞=_jwA՗VTI^{-ZP/#,+P(p1̛7O |i9ѽ8 p Df@)ͿvB"{YQX4?xk"6'oX ~Y5iB҅8s#ʧVwl+ߧ3`/cvu=2tsX6i2 '/v"!:s R}̳_ϫȓaD-lPZN-sGOBbvN_ME,N_Bgo+ß!6;-72gC/G\^#DQbjQ&xK\`/31h֏x0_ҧn/OS\Q8Wړ3s8q-ՄdѨV$-=\~Xm26}1G456`z)>af|%^Uogđ+`&Afl 7hs^uPץ.ѳ ޽{ݻ7J>777 6 +Wױde&AZbcsXˑ}(}8ZU*CvG$Bk4Oib(UD-w-BE:A(pm_D'gCj'b2\ ah4v)>o^); 9[ {6t _6"{W9t(:XNCyGfbUx Ӑ+KPCt?UɥbšMR-cd-!RÙsh Ĥ`FOPG0,z10uGQ'Hs>5>e-*SX? ?}vG~Y#zR,/ŧAiጠbBG'obkFLѠP  uhsS 7{pc|k Zxx {CL4k|GM( Fva˪ SIȓ"ǒzO `4yIy6; ߔz*(뇟zDCgc($d9OO?ץ@͒HJσ5ƻ}C _Ɣ>/|F T=+N"n %M[Y<~h+Mc~!]R2Q j|,+Y+mAʒ%& ƸҖ!ڧ:Rnq]gi :їT:s?{(Nsp\hlG/#9n Z\xTf(f$y+ps| DՆϯ Ғy}Xi>cj쿉ĻRγt>}<c1(r UGI4辨_6 kw$o?^e@zٳo߆^uL\pAspp0KH")\hnf,.0f>3I62elؗ&Tg폋=M$3U?[&c۸+|,oEbB;ޭe |#r\| w"q-ȋ PH"vfuoP{#өKcFrT}.ӓM<o%Ěy. Pl_8^Cac:ά7慃Zgq׳FqN"-Gd|3RD#ѵj?V\\Z27YE&!g4 e_c9^yB޽4XHA1M}rҽ uɣͧ[U"9?u)Y6.-/WD~ &9ɪ6jTʑ#h~yk Ī6Ařq7Ou@dw{r3f&c(Khb)iTSm1l*9Ra! Q o@fdJ&HU3& h6S<.a=ݑ- `)zVINeO0Kva%e}]cե!mvIw["?!oiduB`|,{ƒhT—.8 Ku]y!{>y2p|U嗛eQ5:-E]B[t"&F>#0.1(qWĮm+ej_ukԁriף]_zmGh*qZ/n[߱eJs 'ci)meHJHPPxn)@q6"r!^(EqO%iߢD cW\;u?G!:L yK=`}Q_$ٛf{b!Ejil9 JxT :OoK wmq9'0 Lkpӧh8Vk:N6|tG=l#1V HnŪ=*g?]6 /-Ƙ4jU ?a2VYvnv-pSKhZ/ 'P(︇#CgkTy'/ǡ#ZרH`̳_WھOo!b{BXT-q}}&>↬aݺ>1,2±v x$bYӸrҵ u2ڸ+WTB67b*v" 2S:;ˤ?v=lU?ʼnc! إ6o,iJ7gn{Jb)4|_!_>=wa֛*xK;;&N؎qi'8<)Oi_E ֥BZկ?UD~ E`IxK~!uJuw~<>Ʈq7 yө"U"FAOk^QyW]Dlyt鵟п|5OS=֒ʭ N^ʃRZ Oy']Canj쯒 —kuh!Bg@C 7)w_e""b^pV?jժpww׺s{uj猧'T/:u*Ce`/(08Qp_)2y.9λv Wلu#'uqo*&fWp)NF~X:BTuRy Tڨrߓ_ѳWGNm roq%7T#5]:иٙ=s0zz<Ņ\&}I6>}Q-EF㖼*< brѠ˓3$^N\Q}1|q-;I"4/t-C]^v.ܺ>:Q ߑ\H0Iͯ 8A|:h'N,?7G 9[O,dg+=xU_r{8LY_֧‚m)9ÌKS^P/!yfU0x^T²ۿʣo]M#^~Wd<$[kb}Y(KqYEbq$Z(\Ȯlʳ[nήp~\nE埧i(C6T ü֫iI\Ye_uiޥ&[rʼӐ. {TUjQ{I дz"NСR8MuEꐞ DN >DB\: 6gS*6/ Ae@zq **J!/-I˖-iƥ"FF0vNѮ=Dy%~32zWa F5*U|e_[֯njQkט;_guL@$P?AxG_LtHxҨaV@Fam4)t.C%  U+XKj35gnYvDUlk=i>=M=j>JyTMփkzU$TL⹽ vh4b zxSS*OOd Z1tLLf˛"cfj2_S|%ME-\<<G E".^o_h(^?|M٤'' ]VDȋ/e_OMCGSB?7D]dVn;@WkäӔ/[\w OFLu>2/RЧk;o[G˝ >+ D=ۼRvd'(g5G+UVE7[f7+J\`Ѫ^;4®}? DYh)Җq(C6T ndU%b~ =ji[KCc:*k9+U!R󸕒̌$Dc'B\9wexK18K(~slAkU5]^3Zhݬ}L9rz]ǎLh$yn@a,Ȥ^mh{Wcg|^!"gV11.Օp?#Fz$N[!^Evqns<80B^Fjhʝ{p!]3b7xI!k'[ tm'c᪗~W$&Q x8T7VO+|ʾt`56u264PKY7D׶0qQZ;('7]ѪE'OZ-h{l-V5C9V8[uét,g'|j~5^J\߳nxۈU奻*/WLO胖Ad$!ǹ jΧibkG]ܵz4݈i/k*2S]}fp\K1~re|}Y 5pd*0Qv1mg xLݕc~ U"2Lb||js{N=K": ϛSk|2Ϋ3'"ˆvq`Dղq+[Y~߉acDrapSnƎ{֒Hx*}jhcB/tнH0HhE_Q~mZ+tf}H<~@u6'JYWڧVM}DX锵?k7?~iaKZúGgrO޹%z܌ow&w1`-LrS,8F.ؿ!y2웷+"y_aHpFwӑoP srվ=ʴ#9z&.~^ f02u fQ1Zv稪t$]Dns]DD J ;JۻP.hodI\3jhiw Rį{#j*Q)dfi%ܻLl ( T'YJ ]aiȓXٿ>~O[dƃF ꗅX:d&Zk5ޚqllL]z§̪YX 0iq&7_1!_^j O—,;,΁D}_Gj(<]PKQ8#=94*ʿ=~bjG_c,:S? n!xӼز:;Q%4 P^5^37e@!5;], /oq"{UOhlzE_Q~mnL°a4l` @'Hte@ c\WZiUPXi?G ?ybM2e@.<UN=>ꎘ/+-Tէp5r$wwOMXhscwmsq^v]\yeLb۷+7j#P+yTJRs&GTY옇2U%/>ĺ,+"BTг>z GY/a?jTe-?|`YO}BO0A޹s,,,0f̘x+ ΋ǦI1LUbzyoo<"+2Ub$*Q}^YDDD],VܳΎ@DDDDDDDT VcccYz6/>4(m""""""""*I@!!!w)N3 @DDDDDDDT V&&&V{{z{Q_zu葆{ܴkOiqd4O</lpa"7ci˸m/CyFXv8]' ׶lkw6(Sp6^&e#=y ;bI$@Mƍ!qyǗ[:7oT_+HФIíX p8&@E,F=ܗmy[D׮=ъȋY1P*R}('eRD/bzN{9˸mOCe.ǙO%I8ٱJZo:H 2`n{#(mr,Ƥ3a0+ oMĦXY7Jv Vƅ42YwT$\GrS}]1RĶ@D$e.P~}=zk֬a`ff;&L+L]VsÆ _'wG,.?bYO5 !R8Ac7ww8YJPCMŵKӋ MmTm0M>’q7qdJl:iͿCc.N}!c ^nw.Td,tb?Q>؋ocr #^ڇ~83F蘚0cs "btתU+ܸqnʕ+1`Yu͛7^4t|fA8.?FU tV}vN/AxY nʈ¢&c-G4l#TY}ܸ9R!Ҿ?|I֯Pġhۘf[W@PGۇyӺ[?""gŤ{cJѿ̞=ׯ_ǼyЧOXXXi<+{{{WVX' Y&p% .#+ažHUƿ!zR6\댟IĶ0l-~ _|}uo >VG0,z10uGQ'HC:'[ʻ86c\%\Sl>N.+]Dlj#;4|GmiάEO &E;Pt6zְ?KJ\}_}7r ƇŔXo,9iU)=ѥ-m98mt/-_>v(IG5h.s]ڛu,k.+Æk1]')4sNQL/Ԇ֦& yڎS WZ˺qXD/q;e7}If/sN2UFڷLq>jבx7]Up]_1B\ wvzVH~mlա]*Sa>m Ǖ,ƠKe1Tשi/?5w R%]ƶaX2s-樀p!!"_Y.jEH> /ޅZɳ >c.v^Td)L`Y MC0/1:E븝5܃[+'Ō90sޭڏcZ I1gb[=ne:w.ŒM\|!& cUݰK<9WA1}ГSB=-[O_{ȔƧNWR:ߵ%/ud{8ޓ%{-}a&Ҝh, Xm8NEڇT{9ɯcی9vtdd{H蘿@H#X"A1J)K:!!!@zf7Be!-w=s=3ss zO&<7߼\YfjXMA@UAqۯzjeNQӧ\]]jOq5ƍC(vk1~%B֕}prrP˧ugrX84!QaK㨘 q D(D$?[mDMFcpʲsa"z(g ԅIIwEI(+gsx$]r ,Bw[.))ŵU1koOP/N+bL̙A'709CPI:ȯQmpG @vfn2~`R3ł.).L4ڴ _ᾈ; (-B7?F_Gwê3P:s>F(<]֒&oKNả]:U$Zcu!09|Q dsqJ*LCg":E|wWiʯo-ch->0COdx4g2qz\>W;-.|t.Ng_<>Vgž|cN'mT᣾C1y ys2,ä!xtj-peU10jKNWcb4? Sl??~yQ$~YoxY4 (2 lPĂL3x0 >}9 HE!.%܅^t2kuܿlVd@` [a;(kj.FUs[NE"3HcV`dM^/BS1ck bkq ksH&Rdz&K e3}ɕs[Xsy{سK0΋am1e?b35 DN˜  +B:u{*nU/(mWW OM ѷo_C8x&>R>iZ"ii\yغ7 G}˯l>Ό\#G!2B?\t`N'<8VL޳,8;Swx&vhq3 ʯjj̄ؾ,zLؿDsxr,6KL/'<xRb˖S99,*ٸ‹iҥkЃ Hр~-2ܸZ *~z;BLXmuj3^}0ަu]=NAuxĀټoTDB8+Ǵ M:5CC 鐇z( KV/8-;{&lIv9"R>1|Tק`~b>?lT[VmF|΂?}& ]Q P'˳Ґ^ʂcQV*Cc]e"\+˧M7pi\4QK#~eEѣcXp%\zD P8{op!S0"ه>[o6h4j&wRS0Ynw*G8[ d\ߺ ~f*uwR "A W8Y ]w soz`L|Y=]PL.GP"FhL Ɵ>’ puleqiX̊W(Y4›%5 HB(n}qQ+!!ArqqAPPOR|)n~:P$R>e˖Omܑ:i_vnai 2<,"\qg׾ $p$+nx(MMĭbGĄTK5`_DbK|"b˲7TR.- ]5opmF]_+uX(>D"*pv 9y<}(pAp=J'!M>r ##qU'tMl}Ԧ>kZG%?8`q;WѥA3Ժ뜗U>&VogMW u}zk(֨_a ߘͧ)*ܜSܒMh[RAA. /U>G'm8_@,7rcfo5B(DmEsyh:z*~X"k;m7.G^＀b}DE(fvʈ}}D_؏?n7cVZQ/7ѯEBa|A.wsD:2뜷I#[g|LMT> ojQW78Kr+[6wxlWCW1ϊ+2VeD(f[˸or0zu>mV/^ל-y7 'RBKB1lxmلNUz<fUɚ"u {U0no:<`ty B̓kV\*%㈦ųy0z#[~4m WU}Ǫ;܎y>qG#5!1&hѣ3:XI]&·Sz/Ȫ|r|qNMk4ZiNM# bii=z`ĉի"""榼JPQHSvwwW~ΤIoX\ׅ$Sm#t(IpP>yG 2ðj18?!]0._L]і)lH}"g Oo!r$plj.kCi $!<-"7+#$Kx3ʾw lXOMό)\t 0 [\7H/ڷr w0'O«I s>;q.s//T{KQ_LކZIѺ m_wߘCI#_կ nL2U. jMs%qZ5"ox`_?/,D`oٴJA&SO̸8ܐ*Ž&A yxHQR£4r_EnmЪuCxH*5V\6cl@-T.B*u^') J B]3w,{ w%Uk~P%#'C/Ǔԩ% !Cz$4 s2A;W*oVu1_^%Gڱ#Hn!&o|A055ExxoX6A^a6b::A\|;ux}o }=;%HsE6O13k-m0uU,mYʓzrm}n6?CXq*IKVflpk ' ZOrFwa1\= s bq{JlHsְdg!ڍ 7v';ްf!,$l| LK*X~;.|3k.pG&^X,-C_K #١<[\%Si&.Vʧi#sߔ.Dzq9>|h ;}M㟍>l&rle_>x]WjQކG7 42|[ܢ7N-r!JB>Dxv\y|;~RH߭7h+iBC+q<śmĜ}[<[s9L1 $h3kg7Ñ`g6U=џ`ogcL3MCc8z4 MsAT$ ˰jR^ nh8y6G;0w+)roah t]k m au3Ca3݋0{e 6hn:8N87,RX'#0(LS$\a7,xk{h_uLֿ'N.ڋƠ;:ȯA`li)f(\dK;wX~ c !ۈ!Z9(fE70An!|{OƸX;/Ҟk3vH%ئMEuc^9_Եo۷SDl_hbSo?7ߩ3CMm~XQHQ"ΕmW&JE 2jc]ʟ9o~#;.g @Dw/+swxlS'87/9>bؓo@'jhό:׸qZͷR?Gguc9]k˭iwSpNAhaki 尌.6(rCbP7th.و7Eä8."b["' ̓,k'^k2k4vآdz lb5QqA O?Vrv>yX7NR(}hq@'eؗGC])+~(e(-c`mW}eCc_~&!*Ok E1xo*|w/O>~)Aqrxq6>L| q0+4~Q}ņ"AKC JA!p}y7ja zhA5 )U;\,!(HAܦHqn})$Qߎ’r8>wy29n~KhW A*U=vQ"Eȸr S  @bYem8B/uK, Fi,=BĿ7'n!1.g#{zr-`"_8tCMA`H[ĻWb)]'ѳW_8 ^NT/i}ǃ1W!ס| B#"RQnY"65z/sOM29.toނO\Br&3wwxk5b,]_NŪ Y+s>-\}٪ -c- pMgļ!_@)Zw&5W,vwa#1M1G=1cZXWpp՟x# >žiWXd`T1:҄$͕c0if-酤GA"1xF6.2uLo P/Lso&VozȪsj_[,g"(x⥷1ǴoƍGnc6} W@nz-m%Q|#>HbsXB`DS޽3Rh!⥅ DC.ERp wMvvVNǵ#07} (El!01yqBn0~g^sH9+B*gD ˏ) P}}Z1N3h6b|WpyMc^bUX݂6|thZ];z㯿jlUKpl>=bkO<4ōZe"u{=]%Ȼ?YXxc ?y2?'~vC u޷ C3A:DK ڇ 8~M ;=b6AɫiKI=DX,u Ie0ug=!_:2=0|80 _ׯ?`dddpm7FA#2L9v `vF``SWEzu㑜%M&=|8:TiOߛ<936c-_Kd1$fCdoOvuvһ8Wޟ" |a>j,aŞHz7 (uǙՋU$gTl&mh\ 5Qp[G2, s"7# QwwʫP|-øwykk!XO57o0xwuo2V|6Ŝv>31 dfrcA` &:mtg]7PsFMcG&Mo9 !APs?̫৐,%/8pgocWʗu;|d`_9Ř hn_ه*bٗhs̹ >Jݳ=#VboTM-hyo<(zYy(9\Gb$0.$eQ=F!bt7sk깨 |ƥao=ry'赥<reVo{|tS,Ӑéi*MgZ:|Ʈqc<{럭x@7G88'p+ ); Zvho&c% m#AT$zMvʅIKffm`\X6'-eR.]#!?i8ib}hDŮK>>F_Gwê3P:s>F)Ҍb\^>_>ç`cί__g'=ڐ'oKNả(tHǬ~%B֕}pMSPKqmt0 H޿+fDɜ-$p!D 4|7fxmpWkA%@ H/(&vnvU=Y)c{yE>yH>2B,b10Yp9ǹOM)Uhp鍷:QFٝظ4y lݛBgC?3#Q濰>B.kXW4'20;g!pL|ݥ\oHwWt3-—6pƃn󁅖|0B^cT+ϼxcDJy̏C1+k1:Z zWZq.7o9B *ˈ45"-Cz:,tWSDl q `H8Y< \dIHϽ[]\ ''dR>( ##qU'tMl}i9mܑ:iAg8ewo \OluEX֜{ʩjUgцڭl D?lƛŏzr5׷ E)V^E:լ_=#.녩۠(p }ח3+-'}4-"2[wguqUV]}#DoJ/!")_$'#Wn9r/}WDErzS]:n&cԵeH|U730Qh.⸳kKq8_!Ҧ5K5FwLqrK*2WlKJ] 7|bA=G[5;1ጩ(fǨ1ya^b4F0Z4o}oaۚ vZZ7A@xі(\sQ] Nh:@%Kr& j8أxNYUFeG2Lj%n݊oƎ30'\e 3[IJVZ&onCFvDye|ZtCMV&S`.RVq;Ȁ1L"?#X&&zlm͘@"aPZR~A#@iqq-Xq(D{xɣ/|uHs9?AÙ @CucH*qKܟ ʢq~Ad#o,w7 p+"8t>mDg^jKcQۖ!Uݪ?ܦ9z%ao#FQ0MZyLtU]InDzP$T?bƉH(fu7-sr< 2Vl'N ᘚ3ces\lo,xYa n|n"n 1A&P/ UmVp._Lg7̆󀶈ܬ8tʒp.M^$ݓO^p4 ٰwS6`o\j?н.|%? \ގBOߗ!r$>šhu.~f'">)B, n{\osۛ]YƉ_c,1|ڴE>pRHؽg3 QR\ F _=ZnAZQ(㝤;WrQ1qg!􆋎(nFwt^cS|}30OGw{qOjdqj6$޾:MW%n=]ǎ< NΎ*R7m 'qhQ4@4F҉u86m?=ƀ>1FVV!FrS2D+66ȣ뜨O嫛S׷gn]%{m1辥l'NpƃtVcX}U+>B{kt(Nf24%4_ ́#⥄$j?Bw`?33|L4Fg&|n6?CX{CKoX Q`ȹIEw| LKt?U7 'KN雿Ʒ~h_ L乢]`W8h k7Eehk d$#"둧ž9|`*Ŕ|ZDFq,wW/L0s1Cϋ^1cv< s bq{JlHW;L-b$nZ"fC󷅘x cakR>,P^g*_ C1F2iqFw1M?-kE%=YecѺwl`- Shb u=!{Ppğ?_ lBkonwx-.p>ĕmTgtnq-Ỗ5=Lm ~UeȊی nZINtjj[kXȌ?}3FBګ\H ܚ, )W,f}+'ƨ\_5hSWBhEWlޯMtՁ7jҍsnUHyh[xy |Gdt[>qJ=c:Z?:dWcQ޹|XƅmyװwUH}h"/?*lZY; .c,U?q1wZ>B+8`̡>s3 S8Ysro9·04m* G!|{OƸX;/Ҟk3vH%ئMEuc^9 teXk)f͇\lGP44wzڙ߰|wF㭩OBZ[]k鋟j-~Djl\OCN~}vAB%r l8}T(;CѨMWtmW}ШZ\ Q V߇72' Ѱ+Q <P/"LAq1%~0m܅?|P0}q &DG^?as_26]t"XY ptd|*#n1uZ8h/~k;rǝmFxTDVcGh·x V{>1F_5ak :!L/Ή4#Vj1>i g9Us˜ƶnj-:)ߩ_ӭ3i Q޹|Xƅ6D<C8r<(da(nBXX[ApafN6NhS&vF#wSAL_ C1YK\>}(gϊgäA jL,GcѤ$HUCѿO6    **[41 >,Clb:2VpAAAA/>T$WK!)N![[-!1"74~{&* AAA/2Lŋxu A?S^d@O&=ǘp#ʁBAAA(U. 2t3WF(-.b@} O[ESz7/0wC"JIAAAċm8T$^=xyXy\.~mφ.B>µA 3߰㊔KAAAh`u~ ^)h@"IA0y6^7Axn;MgfH 6`[3: o k-Pv {q4S+kX)Q=j`0#SAAAϛ[}+>.Ձ DEze=fM]_1[,!i3-|.l/Sw!GI8i;bsQ&s>|+dj   TFY{*]jȗP̓9/ŭJ/E!W\饸M0i    ^ v؊]C*eY%{_&B& qǏK^-Tz)/Rlz%R\T>~Q}ņ$   T\V_jk_HAAAQ[ao} ;ҕ{T$   e}*0Q AAAAD-{Uyt 0AAAAAbHAAAA*AAAAD- AAAAQ AAAAAbHAAAA*AAAAD- AAAAQ AAAAAbHAAAA*AAAAD- AAAAQ AAAAAbHAAAA*l..Z5G!'m t˱C Y#ʞXw,C.L_6?}EkɟH3 j7T$^$){ЍWh!)O)4Xl ?Q"Kvyd8m&*V~R|i >~㲴je36aom8^#$Ɲbt m1Eߚ?맱}_o0v] ʒ6`TXW/mn̪UkF] ^UD^%AM@ѿ #%9'DxА=1xL%O 9hLSU_@Pȸ;9"lońGLUⱺ~Ծ^վ"H ,;,E`y8L{?+!jƸ#jwA APu41 >s2sb#+[gL861PJ|:] %y*VڛNٷ&|ݮXliC; ,,GмB܎u8Շ_R@!@p[d"6#G Tzu㑜%M&=|8:XTIX帻k|2 @(8( ;}Yy(9\Gb$0.$eQ=F!zܸ<7{N#;(tzۗ+ς媔؆p |-a*\UjHU&Ƨ-%*Sl JJH zm))C7o?2p2 w3sQ*KPt6ֳE5+-X`XD fgZ%!1"74~{&kc>ͯ4Ȧ7pfb;r=vh֞/#+ H+9&,Ī"7֎_᧡>ѓTK_7ҮΧꉍ39_lR'CSucM=]K>9r.Ôcx ah7h6uUs֏&?PY=ǟ-%I0-yx+3"#C!1TCgp ]'q#\I/o&i߯[Ɣ6X|fȸRSDZtGpHUs65Wxgo2/3EҎX$3Jl&bhc;c,\Ncw?!HA@x5x4g2qz*F#ʬOׇ)嘇ٱpwİ=aodo/+!LjX#%<c!KğKa8x& 1ţSkdX3*d)Y;~{zWb̙(3Lwq`Gqpj2>ˇ_)ΑNU+`\+ $v.<$_D L.LJ2{-b?OB_XNR$Ydh:`4X,;."64L({n}Nvbl4M)JAɓHw#|mjɬ~%B֕}pU'%j|)WבZ0SFh%6iAf Jˬ͏בŝCj Μa^'hqG< ዸގa׮¤^?@Lgm K5ϓ||阾” [ZJ|V7طȀNLVLB@ `  Ezm)@xϡ$$%װ}Z\Tט8ctGxIK|c AAaxEnlT~F1. g&RDzֽh8+o^~83r-\h3ɌO$b6þ5 ` BРX!pL;%u^hҩ* $/C&?[LorꆢزzNn ^}Q#>}RǨoعUe򖃁^j3 ݰ/ }Y3^zT!oIlޙoNƱ<=0;GRnPK$;+'CT\~DEjWOik[7QT UE<17PoNc`Xjq3~4MIZlDc t` 4o<$5kSA>{ [v&ýr{Y/"l%>k'B]XNMĭrFNq:shg88!F_?yIHAP ʓK䐳܇Kz U򲁁3Ʉm /ǟ[c z+njc-f7jևGlxĤV$_iP|ʘ>üQj4YXAբS?@So$c"!0N>j 9"5쿨1mc+q0's`73(5ƈO59/ 3c=?N!1  AT-޸KIpy[ )Md6hXsY ;{]Jv ȃ*6^!r$pShrٰRxX[#&ʻzˡoW!U+tX!c:dA:]Ό)\tm`o?vkӃz2h5ɠ}c:+K¹G0[dץ4=ǟ!(VV:w09RդIk$׼Hi'9g5]=&y`\t)V/s>f'q^7B?혩Os~zmoԟhT7&@  Q}`=^߀雿Ʒ~h_ L乢]`Wzpcwbph ka2 ;XƠwWw\h6mX޿R<ƨ{Ѩn|HF.^_g#vuh//9`Z! H=드he;2mzT+ol٘hdaAJ[ 0;ž9|`*Ŕ|S|k$Z!O -p)fc.c(yU+fkv<Ht9AAk~Z5ϨfFub'; 8_R`k*M` KGq݌m~3ƟaHI}tjI["= ƸW{pbsbcUrկdi-`κY4Om|iP$n,8LXy#TQh|hߛ;f2V1v fD}SpZƘ>TEܕG $ H*0G;0w+)roah~}0~T6~ٴv@.2;], wDA0Uor[h5= ||#'c\b^ɗClipHy+4: c㐚"jP ZW像:,y8a!g=]>AOӪGz݋0{e 6hn{fgѣ$۴(Z¹nc  cZ!(M8˰jR^ nhi^c0vfqGUzu4Ϩ4)w1n.%6n#NˇTh8fE7:xO\Aw5#Q<z bBFks ?5F_?#I,=&p tP$\FҰ܁+Eae82'y~17%boH@_W+kXzjCꐻAc4T}7U%i Re@)(( ET%*ʺ( [PAY eJRv)-EW9'9͓3*9|\t\WM?ۨXm5Hw 30gPZ;]8z]douxn%ƎڊiX/1>38հu&4hL&ij#54mѲI=Ko*Pۯ%3R1>BM_^ډ| gw}pyC^p{|!r4DjgDDDDHu>g\Ҽ;瓈ξh yb7@P{"*ƽ4X=Dj/v%DDDDDDD$/xT"""""""""' cȉ1HDDDDDDDDĘ$" u"=p Ns XM.o^2we=K)_v/9?]:c>tXe{ ovow]ch)sn>Q Ld&2&e'xMw*{7lNc[ZgM)|?{<޽gQ Ŝ}Ш#mo8YT3,[OaǻQ>pƨ[ŎSyNDŽZgmh$/M펝5:[TT\vǟ%̭#{S""* rG7.P{i'Ҡ[=AMqAabFjk+1p4wNŁ Gol@>=у0 18s}"s\dc I]/) ĸ?4;k_:nm]B޽,ƌh/U>ڿf?grWWt ,D W6Ix'0"]}|+Vij^e1u }P z" #Hx(9OAn q)țCs"[0 3w/M<\9 dH}Aό@ LF` X%&dl wKMж\dIfֳ&]8?,G;(9O7t5Qx*K&aFq %AR:Mg̰)m#^g0^(%U^tg#E]zQ2#흠mS*(p<̉ykXj0i]?b_f+Bm(휑~YsZZ3$ki-?3yYbsFFŚcq{HX fIM Bc%^J[X;yU98(L1HN+ۻxaiu4FwV[Cè0g x?WƢSz5Co!ү I$=u=,88v2#|$"1#Qz`wmzE?'4ͳo`ݺ}3#*Ȩ+Ǥ6)}5ʖph&X#'ѣ׎C7d'tY22pX!O@pFR"<2Pb-rah)D~ذpwv|Ov\qcIPj֣iF[Ɖ [nS}ODCs2ϦڰfKcL,lX=)c̳e[1m.q=$ N7)FKBa1ɜ2yJym#\ )cs%V8gs*C1MڒoZ=fjMSct1 @"vclX.k'rk)FrOBI`n )-(25k(vMq{ƙe"Dy.`#ep(lv/Eo:%1w~G`q3<6ꋧqW>?5LB(>~-w#pއо!.6qI uT"4ZFb?֥*1&Vp mtkE| ,JގhlA!Q?}ψm&f>\6o DH;~jvl(,osnKlW`xg%ŘX{Zח<94ldNTgR[R23emY{L ^gxQ n/Za1ɜ{R^cv071Y1͒~W%I-È$r2:hX4GSL h#~֑/#8}$Ş_rw Kv)Z貍.pq_u:̚ C1jh#.`*r%zIj4?i40J"T*h̩/ 9`n{#Yd#Em@G'~6~wkqdL}1$Z*ur⼙lm S-EQ-S/A=QXu?*O"qPx^3qdiaa+mթ0{uᝃ $Vwׄa1/vdU2X=ޙ9&Vc5jvmueMܷ!vnq;uMG;z:Q,3^9&RbOklz>KAjZ37;5?یKjNI)dh3e(D4FaWtR;./L/d/YH=x^hD^ű×k>$V? ΅nHVƶ}*$uk?n{ rը[K8*SVIcc8'3ux4l0ĺ4-r[?-]Ɖ9PFEBMumw.ȱl(cjV4V|)'}9۷GսرWBzAh~–]'ܾi.[J!^v+U K(muHBeE3&nֶc&B4wHmٱϬzt,58ab PwLNGu{*;vnfZsL2'.ĞHo>6Rʹ1͜c1>.81 @r>%b˪P6i`A|b/ ASp 3XL_c?u!y\#ل-+!s|,톍[M=@~mѹT!3,bۡ#jfh^E'p:dUxg4|?6LtBrt8i嫿gѥ/@G+t쇷@{?զAnoڙxO47Ֆ8 gB8_އGԈlPeY8|6xZs͉sG{j1Kt7z_QI{#Ėדܾaѹ2,Zsf"J!<=/ZM8S)HӲꇫyeԽv @ cT@}U1 Ȝ1bNr|\x]׳2L_>yG8kmOfN=[0 ݒjcak)qlbOp9?^7{W+IUW$.$Şט6b'mljNZ87>67IՏ6:"g|UqNaDDL>\k}W 5pG\ۡ2'eHv;&iXGb粥 U q>sjxkѤwCJ|qpKFg(4A'I 2ٿdorCɘKivApXsidh1x K Ӿ)/^l7rb|5\h9x _n!֝=TLnoyP+v:FtZ-R.TፐFm}-j̚2\ʬx'7bBmMʯhxn'ǛItY]t{?ۂ[8}ԔT߀>NԱR(KO]GN[/)U7@aaS52Ù"-{#_]%@lX&H9s~cw2|75LZc9ugX*8v%5B)qz巟 I?t|Q&'RbOkkゔYpl5+N-x1oW#b&airG0"" RT; #E~Uhx'k.>b{  (&}!(ن p9cGmEb,3Tr_.2CƸ biMh0vV2yOS7io-6Xtw)5XtwMP,*ʫa~ɾq$$";tߋ#3T8;P#4س[ 鎗9]Ÿr, q'7={aj;c\0""gѐ8a<*Bd؍;3u&q?87VOP]O'`47$b\DU""%P$%TU@DDDDDDDD优$""""""""rbL91&Dd[n\-`5YؽptAX"}3[܉S9TsqXek_mnT8y1V4]_bȮ&7y|-(;#`WakLݰLj#mo8YT7{ٯ0d]xcH~) x7 jMkC6غNs zU6]"w˷q*ϲ3x]fκ̎Y19~Xmi|;HJ""VQa8gZFz{'\Y{{ٯ0BA,Zy7J]S7ͺ<$"@vW|ɕa8z tr2߉v6l՟m>.k:6O|o`Ʉ.poԷ!u:&"; @"EfaCCsW̙9 Ox>jܸpir/xd,wq}ymd c:&"" 9lNBV.Jި |4>ߢKb/'}kڽ:Wś# I9h%K*e:eWo؞l5C^B^7D0N /[/a؞8s5Bt7qb.e/ mjI gK@f^)Hxp0^y6 A\Ůya dfndžGcUr|3K>K7[RJ}~Iٞ~zF;,@`Zz/?|4FS&FTUa-C^A/jW 3bx^GҳQjfIZ7(.QҺ7w]ɠO'!4V=̪cS'_bJ !f_ cv%kqظY)5*{Ud 1Q*} R}H{p#<:z 7UX~AsG6|ũy 42Gc1]ܗ&[0< +V'Del<h+&:7hpG 1ai])Wx< gۇoHn? }ds5I-g oS|eLy&hQy& fpis7dAD &z`̈Fp+DˑN: f ]ud!m^\}VfRC%0u ]A@`)(> I[#E0sg]< s1oZ BDwˆ}'`t`UN zf 'jPX'$N<ԵKGzsj \.aߚHtQ?wxc1,Ƿb՟5Nd{")?=X|iq4iD7&y5}FSE0ԓpI2֨)qWQ7у0um 18s}"sO4W-x yMLx,J[2(B?-eu87MƟH| ƶ}Ep$CwO4K47$׵v7\ab\B߯QFtij(5 O1#n-ThH lҜ\x+x,[I \ى?݁?x4F%O3"Ųf).eHn+@$$/Gh 3oRz5<+ddLfϓX}Sx2uL۔~`hn\Ʒf֟1CiXjNYnR7U @)\b+9`IHhemN'(/Ob(dzjUY?P[52'۴tb~{h4d^GL9h$c]j.cb T]8`$ E(aSvDc.ƙB\x0ְ U k?yO%~EׇЯnNz>735k(vMq ' E<7ۻxʂ>mfY3}۠svݻ/íE ;>mWVI୧ݢ#08-cL-Z_~Xvi*5-/aY_O9gB`fYl0j0&RbBa놡 V|NUa{ۼu}Ekcen*+Ϫ1PDڲIX>Mm3~z Dt\RuB#3j !'7-eyy,[V- rL2HTdrW"/X3\<]ޘ'Ndpz$lKl~xthsg|~=>N'pWgìY 166~MvB$*˪Uٞ~k2V?fm&壝{ bըH U].k$cpl҇BҮt5wc~[? ==nO}ٮބ;"[7G2.f-;+J8cmi_BUYķ9eQ6>UE#UWPhb}OZa,mLeM6Xקl5Z3Sh"uk쯖Gymj:8r U1ÜCBOo!O+/Ćc6[ִ٭\بlV\\ʺ @r֌Ū{[8c9Vӭw2=[5 z }:[ ok^CWaڙxO47, Ei:h7ljl,kMSda5"ԁ{Y||~2l׈(i6aˊm_E62 yW$&Yx=kQtLC ?o RЦy*J+G| SCC1n'^?mR' kUkç[zJsa-ã1.fĝmSV2 Ų8KuƇ}ROa"ͩk]麴]63&$fxcOh;+Pd8X~=zv^+<\޷gT@-cMۿO3fvlM"  n;S^{(2OJ*B/9Zoḧ]$Eho 3j (M-Yc<ٯ:ȾzuB&SMy0&k+JFW bLʯhxn'Ǜ~O$0|`yP`DwtP惎EX:}7]OTNp0nnL݅$"""""""r2%W1x*?޻ %#_R7.נa9ki_rq|bؕ3,WJ{, Xc/IJ_/^κuvsx8zݍc33EǙ-c1VV.MtrU.SkWVV玒S LݰZ?*;#`WDr--~ׯ=CC}Ɗ(M_qbξhב7,|) x7 'K[ŎSynk47y|-dND9aI|V=ι>l1M~b/oc`jҔ3*fH rrjͭ j\"s=`/ɠkc1OLam÷DAy~n_E;2pM92 'Wc)he0(:.t@>$a~'26wul˂*}`Æ(B]~͵mx'_&Wk[Ŷ]`:T0DN!!p Ba:Rq='4' ٓH<,<|NE*˯?pݼJp/&&ǎf!(N3|anG۱~"""}¹76W|"'K4PE"!n"<*2l^h}=?9ԨRb:!?AlFj .ӟJsrHΩ~f|n* | \ _SvV.VïQ;{%l&N8_ޅ"1[]g|XlO9CKb/'{=?2mH-Ij\<^2J@ƒʳI-_t"a W{<[1-Xa/Ą]v^6`(mZ" bmhnj;cڛ Yv{^l;<2y<Է|}Bm_aH.C@tz~ gKhQ\ƥuoɠO1~Lx#[7F_({2sQwEcC_ƣć ӽѠbBc:EZ}*\hX7Q5n ~_s82 StvCKVgJEb֩Ht3(6\!"m*!u] }TpnGGOAX l|ʐQ}#}uSUj)fcq}jb()>N_rkZZ#Bݬ0|9Qԑ=7,RxġCxX#s"dh(!׏_RZv=<Tdi WO?`,E Vp"Tc&aκx +b޴W6/#1^@a57w/.>1#KEHRN!q=0xlz9k7  2|` X%&dl wMP;ظ~5yH=nřHa9RIGx@[%0u ]A@`)(> jĄǢPdP@~SDѳfLXeѣ=_k^sA19w\߷_,+>K]̋QSh({sEoBpEgںs7/>Vbx(9O,B=t ]mnʈxweYؿfnRƵ{#S}'`t`my𪣋GbXę\ێbIJ=e1u }P z.نuo9>ߦE*-( ~u[T.uBN&~{銂 'p:o&?ЦFt>. 4j?j\x^9AᢍwOǗɿ%)=;L^9//7njfvȔ c:k,, s5 KgY DDDDDDDDw)>ȉ1HDDDDDDDDĘ$""""""""rbL91&DDDDDDDDDN @"""""""""' cȉ1HDDDDDDDDĘ$""""""""rbL91&DDDDDDDDDN̅U@DDDL ;;/^µk9(..͛7QVV!'..R鎀"882CDDD;a#RT8u先OO/OK8.,,.z5FAA>bc & +L99@C\.V,O8vQV.E;YDDLΟ?O#>>mrssxGxx+RY`). .ʅ%ƯƉa&ǎ'۷uR%;u+W`Ϟp 4k֌C@!{k=Z9]egcQ0HDDDѣ(--E.]T*Y!tGbb>&DDDd.\8/S|q]… """{L]=750ڶMd7tNp]3&Ȯ:uJ_[p!&O !Mv/9?]?:sq|bؕit{ _b]c'OD||9s&MB׮]3=Xf4/;#`WQa=ݦzBۯNJ)|?{<޽gQ Ŝ}TwɓiX%"""W."""WWff2_c%**&+q!u9enkᩤ YAa̪Ұvt3-#=XQ^O GФ "\P0p} =]Eq Qż61<=Ob%""" ٭K."""ªu:)8oOŚhI k8{"LxYx؁Esm~3ON'7~y;Q,;;9` cfv+mM.FuaDDDd_-d]IزO|6O7rv>T/5.l/yPF x$;O}G31}!&:+ GClPϱ\ÁsEkڽ.Éa蝢:_:+}+`Tddרz6q9\,FnP Ò&S>ƪ鸐-bᑁ㑦7OsppWXy?ү_B`Ybqiݛ軮|dЧy?&XwRjrBt?` tL D˧;k5yH=mL)藍` ;3  [_ GRjl>0v ^[]_׻InQ?mZuhƌǷG10O=XyD?1^?/yn}C+CPDj{f777}+&nTZynSL(U{V`_q5z  (@L%U'4v۪qW>?Pɠ{b=M-i]qdn\2m(\ia{[4.5 UɈ1O ^z?$EfAX؂ѝ -OOOOmР ?Oo)AaQqtJ`,@u:̚ C1jh#.`7k QLI)I6z>d#ETy:c#X} N/+SMqxK1o%Uv%l>)))-1JDDDd+L]Ӓ-ti_wƏ6EIS4+܏>2@01l,MGãa#rUj/߶n@A~~i/EXDlDE5u .!SS=”%|Z ĉ6ߘ^'f%]>/ĉ(QO`܄c3 /? Pu GeC#XTֻ9,FooovX"""[L@vv6BCC^UJ2/P{}[8ݻ4 :r\d4e6u">/5J_ Cz6sG{j1KtXQI#kȶሉvƦ؞h \Ikg=޴\p6/p.#lZ?4{Bqb.4 %.Y8GS޳ElX^hǼȼߪYc`xlx[H~DLzb^B``;,-&n"50Zha:l3 Q!njeS77AGKc|f>n,hRϻRY]t{?ۂ[zPdވl {Vc|)|SWe m82{Nߍ2P$ hNqTL]e[aB3}Ͽ3^{' ,ńgPFIl'L5#yk+Jb *;`"V~Et<<͌V/Ig1ϟGBBKvX"""[ڸ6٠,]~Q,D⦟-W,E;YDDtݻ?___Iݸq[^zA DDДJ)bKvQ,ph*$"""K4iԩDEEaĉLQ8|8qqL]cZLL#㏸r ֭+z]⏨6\l$%%2ȮYDDDd go(..f8䌳s_],ٳ %"""]xx"""/@RBΝ;1 !""" 9͛۶m㙀tbompss$#`Frr2[$MYYWef]dV9 >IoemC~$$$ ,cak_~^^ވG:u@R :j2߼VV)Jh6jb5MQ *U:y"> "d`wpSUZ 7^d>x2 v(cso%ӴUk [C]0JjO}ܻVT4@6ym!!>wHútT& 3W!lv zdǏ`scax<Zr|&3Zd2)I[o8C(D1\XrÉ0n/>ޗx~(lZBD!Ïۛ R^ %U%_*M YJ T]O9ҳ+Ǧ^`,3\#Q溨5Zv<>\̽nnBۀ 3 L܏0DhZq'j҉un3RaYQ۸ca#en]Zaǩ icylwsDFjsmJO5c0VVƹ.Ӝ`x/yҳy"T, !!c` k)QRXl ֭ EB-m>kرMyRwE&Yu 0HHυBn2"7A)ľW1ɮt?YCE)J/~SXm#t0D bK$x;ltS~D 'qg>E\#:|Pm/c#;ZA(EAXvQ/bD&'A|AtD0=8nX b! ʑ*C0 |KxaԱ DZVBvDćqz-Q+Gᄉ>}?|w'Sx:7wSXl7;ғ FA" ${pzm15j+^˛2"mU[7 xhN禰}+ u) x=56vB | {T/yDE<%1fWDP|?( Ssi#hc@(G,UO?L BHEެ.>' Q[E]—+fF"JX[*:GGøUSFiuL>;.wR}缛ŖB6Ea3#frMޜj0T2|CIrxV]T2Ih.[70Ia-%Gs @8 B"3;d'_%mP|T 6+3;W"FRaLBB rb&9:R6 Pman<^ׅEmbԏ [$ ;NHȏT؇ke %âyˢQ@*_idcBz[>2VHQ? &G\H cW[oX2ߚcʜ["=X9!\0m`~ּ` m,5pSMTFFÇl JY[-rмBI]ͪvk1.(+[-ߝ*STЕX@sXK&A/Roa6_].!(K 9䦲dua5%Sjyd)r`70Xm&Lp@/ TL2L]Hhl/UlGqm{Ϊ(s8k5DȱLb6վpVeb o\Lc> ]ZWJ:jc aId*9F810m07/˛.Kj?^]hI|Mq Xj8v**_vJ;j8ߡ#XT|xp "nuй| O]xy|8SoE"E!¡u])>-:?,V׼;hl Fy _>m߳]%֧@d19ǟ|(~tio(]7m2- Mu|:*k)\A$B˛xfJl D-PɄr%woXg&c*je HwNe m.ݫh!BX? ,"MhbBF4єD<(X#A^fyp;{T[]]ĨY4̒?'G}  %D>yD] B~ Ѕ-78e3ʟ"׿5{OYǗr=.C1# SuQ]k،CVVB,D&"m:JgX"8;Yd!|{)ѱL %"mha5[נ`(6}*ұ>w8B Ľhw =%=TCԵᄉL߻a/8/A@^?ٞ9c+Kkm͍2. xiB18 -";&LO-Xhۺş0<9jQ2%5:=>@+ײwsnPڻC/NDD*S]FU1Jy7|nI+;u+~A ~kJ6=|w{]Os<*!;ȕ!@6;=Xv$>^`gkǪ>zlؾacl!#x` G͛ZM4Z{jДc<yy*UG  uXCz] ݶ _s{NH䡮nDGZQ |(l!ju>1 H p}$[xYp8D4۫t]$b=͟mZk#Bnb{}oπz#"v~i t4ͷu{B<ϸso: f'3ށ/@ŷ Խxnqcd cU`Юmōݮ΍A00I3(ɌB@$'"hq%N~%ZX+ bUb3`:A{wBFӧ08ZiA;vh0 ;###NPl )ws`ՙ1'c|bRG9uyRlmSpoKjU"1<>x$b1/LQBw"Ff8NNt*Jڠfll V O - \-PEQ9rm;"~Bp.qܹ} ?5}Y({kckl>#lZ$a7n]&PN$}\DC:3U9Xb(=zŶB=Y+F][#Z*;Mn((;] BY°Sz jܵiTKVX9yuNZ~!4ex|D(Uq՝ iNWc{s]{~;+TPOR[d5;\p_*F*Vd>lPBI//!%'juwǻX0"m#q gr=u=wR(l[nlI7o-v(l'_yvWwaހga"<n!aL,! C-zzLK~x>ى6z:;O>VVWq@p+ bFOx{r+?ل?ōW{s52׾571Ʒ1Yٱ^("([_}gի~{~ X0D~0+?>o^GN]RaC8c=֔ºplelBЭ06o}/iwe/cK!}Gv'j-u߂uRiu,d߃ٰcw~іX{+FQNK s}G ~CU 0h<šDym`5]]ﱣev G9T{>|UJN90ñ4(tG2I2 /??S֣J2OTm%ѻGw b݃${s>0"J9ؕ~Ms BIl43b/c  ݟ_>\ B%ksKt{CjU{Rb _ZM3 }~#{{H,ng wnҾ OcN[^3Jc"OļbѰ}O _P8(WB 60>BE3ƃׯ/t,c| AW˨LͺT'BoƯiPr=D SbggFv'#Fv{f]j4&dMݘ5HZPc$Ʈ48A?c'{[Y(RR)D jVATvYL)מ{ꩧv+{`8l ԮS1Л f |kq]0n{P{\C ; oƭ]h wkcOUSkYb1nt ".{vTۘ9='{ʝtv`L.=_?,Z8 mwZvGh&w'}kWV7]Bw\e9Xp,yNVܿvC\E3|d;"V>X,׌fPGSEc u -`?u!Z[X].UUu ;jDF]aqAQ$,hgù~z޾=]~]SȚq^>u89{}^l{Եt:pt; +#gQйbcK4Fe8HWs=^.DrL=u a~]&g v uiwϪUHLt‚j0.ȇ|Qlllɓ|_QY,W:%_cvvVR.Shs"0(91>^] ajjZhNE|W~7oĚ́6ݞ a?pd6a sLLuzBcy-m'TJ Os LfƑ aeY~IڛWGZ"xpDb30sf, vz&L*5FlW'Q\צ%kϜvR\Wת)FKlE=S I(p퟽\d")W$=s9QrYls~VC a[EH1,4亜wm2u"ѹ]O2vy,b9CX\vJp* oٖB* RܐLh)/2FU*h (Je:W,aH4wa"K0!SzM˃ǘ!ayFPwtG2[w#Habi) /$'rtz]9y0ӷdZޟّc`*̱cG412SS0z"XM!GZ'u`9(4 SwA(A2\=߶H~@Zv o~Uyɀ5̮9T:nd2l»%P3q̙r ~ܡk `i`Y"Z]= ?U׽#/G{a9${Bu> ~k9a[F¡~T|葨XE)yv>`>0?+X˽u_>wxXw[u<*4 HT,JZ#ܚʋG +VlMiK cb{@&HH8r?ף[=~qkZthPh;UVkѢ~*a;KꝖ$^iz5 9I!Mh=n%1gy(UjHalτI1Y "bkx'+&FGC>I4r[,cx5TOlZ K%zWp5m5jx[X.aj| ~Y0B8BV^zUNRԫ%k =d-UAX/gkU-4v@o]KC@j[;lQӌ^drjԸ}v*35NcZf6"`p. [wcGYR58쨑|uj> BhT(UjaRv{7X%ɲ#vG5C]tӲ8?Vk^yI9nQ44=]r&^C=/_K\ѭbɆ-(rZӖHD,vNq?ZH[Mc"q9D3EBP*)hgcvC>1ą ߽kCƟPȋo OYu^RBk#Lx3+Xq >P|٭-xpЯĤ8)VH^YZfNN Bt&w p\ƂfqlE_{5|3#qp)2ɉiedDhgsӁ"C؄V<'R]bV' ;Ie$J _ n: `c*9ݼ~*ҝsQ:&رc6;S&WM@t Q0#3M0A#̙QmNz5NL lw A<8֜@~Yvi}]nD`^];Сgnsј sZnk`ux='U+aМF-vA[up]]Sc ܂v\5ʱ1Rylr_ >{^-K d bInSKygi8Ҁ9lfx 7b_Y0 AV` Y@3*`|Gub [00V)n7N?9fSG/v\| j>JU.Z't. Fzlhw]cc|g޵v?+lr]}G#b]v)p-u2۫Z~D a=`0ɪVojTka}3Djc#Ia;&Ҹr6ߤ/\ãm$3Z1+ wNƵj4:~K_dECqNe*z(fװYSǵ ECa>=T؃0<> NǯQ-[3<&fך<>LNϠݨ(ʖIxc/B ssUJ 2mZ,FlzIXbeNGCr_w5;H8[eH ]FS;={<J,V6t3rDDF&gp[)0hv0;3Xy䡨wIaz"n@fPLǵa-?" SrZɸd4 !"o}s &&<-nK+TF]o~ d2|f]ry5ɒc}sC{;o.B`~"5nExMj5BYW'B .Kߏd! `3V9$Ԅ6~U+4a, G"AG*l_smApk"t:FRuksD$-%,M!%چHH'Ĕi2LMO\!켨wZ}S;JQSS}*mo U[Er$3%9w@k\I W,+ODb( Ւ,nN;+]^hrNygȇ'qM 361HIԊ}F\i5mȺ9Q 76ۘGL .f7`LΩ^T0{Kq_4wcѸ\iQ9,3A8HX|`P_t 9^:N w0WϦf|t{9rsS;UsD,~k9F8+ruϥk7Ts> A,wJM'R+RS+ţO3ݐ,߯PvQVWWիEog& mhZsib zwªr1>Ǖe D.AӬWpge]]M&f17nǏT+*&ѻD+TvhC0g7 u=sw"na "s0̘$jȵ*H5U amX,MY:*zabiPu5ʎ΋-0A]>:v/ȵu- ĴCtQkK::iG\l([0Ҥ1Cx"}"dHFfMw,ay65Y@ TxTkk)8:7$\ښ[%=zf7.j!?έ)牧'O=?`{ \K.qiO`SO}z1|A *hl шl]zzF+9/Ng>t?/́׫@sV {;;.S(R =adts]DǝRɮ-`Q<%)ɹr7?z\|PqzfF]cp"7WђG2=1e=#L/fĺnS0?bGu=@Bo ݺ"?9O1 ][ tgeĻn>Q!9 _7Վb^uxuAɴF/vZ hTs^Q&:IMt[H9~;{ݣ;R6T;hBXNZ[{B& #tb.?윟NgEc;k6qoxO[c P}$ 2==ݥA˘Ǜs I1HU!T<&SAտ62c+;5{V _cV얂Dt2_8tG~gQCUH1a-u!UHr. g}s' Vg8bGDêGӀb4V_z{ (*~#IODôRcPÔ0?6kXfɘlg@KrKuqHlϏy*A3%0` S[kXYR{m`0^oj}$6tMrmfQ1_@ۤ.R4QU˕j)ݪk̃ZU78}kA5.g;q^(| xl+}vkSӴuc@hvɄp(}KxL[Um,{5AKt\XY/cu#1]X&''mPP[k|bJB^DOɿd*m& w;U5^-k*׻-pfv^0j9iiЕ%Oj|P\m\.J+Ft,\$XX>ַ4ORlK]mӋgq Qq62C1W5s?@ \@B81+ph$þ?Ĭ$.pR x|vf[BX#Q8O7&`٨h, 7n(F9p.P,FӐ{ BU(oua`K++20ɞ-az+UU%U%L#X+CT4v([ruܺd2y w &r~ *bZl@S/1O@ĿwqqUcP5:!s۸[KjoԫUNrVLe#LhB /?pJƀA>8rp] S!+ûRMjⅈ!-9aW~Ub_xX=39RjwB> +Z#oG L Vbuyf NgTEQ7Ez^]V5LǠҀA>̠_L~z{G|9ɻcX_lV 218*ld,jVoMC\ўV)RR&h'"튺#$c .&LfrMР"*PuŠgQV^̽ᡄ~nMF ivc5bYa>L펮YZk7*YЅFo>ѬI.NFw(T*bxl _XE*LcnnVB|<t3FQeEA"BA12ZDcX]@ftL^ЂreDcq֬7Y+˺RZԞk{p梬>CLmXI\a<(Kbv}Wo.i:-rDN k6"ctc.{h.5䁇Sio.AF&3YK._~O]]a<Včk9DڏSiIMz j۔UKԬH@f :Q-Le7º@dAbq˧X$aT B*Ҫ1" ,fv= -@LV!'ׯqF=[!%IG$yJ]Ph9GcZwJ` cRbQ-qGʼ\fz 1"* SSg`64XVղ<ԣK+~TS {Z5?2RF 2{Qk3R7Q һX:^Xh7019tjb=ȸ}kK[Zz0 -7:̈ҲA d܁~Pa)]Փ02G Qon/*(r3W xHXZ\zc8)ܸqM(IhUDǟ;vjQ* l*Ce 3 rM- 3h^LC4.wB(<L'v"XX㙳Uu̬؟J!b+ZkATKF3#XU9$E0'`]HpT2sxu 0phKKFf8kiEVO:xZAUs<U~װ b20r95\MB$: =[jGۋ{F)YN%.;c!-Ҵ aTtt'p7hWƢ>3sqyݕH̯v BsNܝJ azv hg|![q;jxS^,$k8fƀτǷG ]Tb(=D%qqi1bNt b*G9 ۞68nW/{|r; PҳnU9WUuPn½E*4*ww͊TnP3z| D.V|ݫ%UL8艺נZqW_bn񆽸,øyo!>KWڿp$ ESIFSNcMu7Ed`"{;^>sYZupB<]ͰOѱ8ulaܘꆥt' }t|Jԋ~aAA|uar4mOCI'3wP" ET)c<6k[ Tra4L_|qD-QH0Yމ5ъUczsb1Ơ` v{ 9mC_ʠ @U,zh %c0>rWa}(p|Ukg=DS(!wVC_6===o+mlcH|3,0Bq0 QNkkkۿ[uKb-% 22 td6`ys7ÒIlk 郱cAw BS._^z _կ~n'̰pS @LjGBX^[GR VsU`aq#ik@/s?G0P ySP3^>6qcdߵ9 HA&eQ!PmWd!Uuֈ`b0G$ u}^,L\w_K`jD\8HC {N{jվVAo0>z$K͛KgGuE~wvR'>a: _cW9Z4]}D:,sYg0 QÌ_~MgIENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-verification-settings-thumb.png0000644000076500000000000002732313242301265031147 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<.uIDATx}y߯!gxnǖ,[A6vIx7F '?A dcm`İĖ˒%K$R5p﫪*ェiJ졚d=9}TU}SlۆO>7ov9Ki(3 fO?4#Ǐ4ߴ BބL|9J7LK -˦-*c[szxRQJ^ lv.O7 ENrӆY7m?59MӦ~?' ehSph r@XZX÷{LӤGGBaV[#Q(0A Vk+]]AHV=J*jևP6H$S[w$,D|zXPUA2:2^ݴ|օ'H -XM{q}v (676`k@Z:RVUjݝ T,Z"O`ll ˋ0ɌkVpm}!-Dߐ b]fDw/Maj5($ W1B @0vxmll#VW!0$IX6\YN h4Nbqhm D#;QVD:|*%Yҽ^,¦| Yщѱ!D̯!, T#J x &DkFFzp~]=M:6͕_L!;2<6H3hBt:jS[l`lTl#H`M;Z4mK@IM:*~ j|!sE2#P[:~MV+0n#?ʪP k2T[utJ6z-M`5RM7a<=A~/8>*VHJ5` QE,M6i S*xB<ѱ,V*2̽k )@{'Cޫ2UM6yz:+ݘIK;K/&%bR}61GKT9/|!Rrų^ 7B}ꋊ~`Ħ@T@郿1\X7HDaX=lj /mC(Ė?vGAD w%{4@]łK C s fM$@IGPձBiNO.C84 &Z-T,&xWAb/<>_cuatUl8Z_"ݭeTHIzh@n8A]aJzv ~u1B] >[`v |bL VB*|"_],DM<92( wT~˝!_'rW!ڀDI=9FFYk9G:EmE`]N$$~2cĉ.pp8Nƾ)Ԛ&p%|I >$t[=39߭p>-ĺZghLp$#~h$ F1ߜVY!*G5b312[EltwT$|RfN𷯬sbz*\W.cS[o>H${^&қys{2]n<s)3YnLoPz7>zEE!H" YO  ( pNMA+ǻ+U^j cr̅u^""i WT-K:G&4 aYT^鳶䃩6ɚ\XG $Co3uoS2Fl)~3 $'sK,^pr'S蟪u@ s1 8M43W,!E0&{pFjH8D8 *~[Tdd!(k54t!dpT!&̝NUGG pcI$ Bwٴ6 *q:BN,RFJ`y,K[MhމbK4#ciI_xzsgd%I?La1I"Xc8Ȱ$v\0Y3eHV001ρᤤY(b<!&m%H6ɡ6b0PJuG5%m01JIMj["R\7EBD\E6%LE^_!lVk:G1B^irXc,s& ͽ@co!`u'> )6ͷ!*HLN Ȍ9)>B\"H0 `}HI7 vu`r ĜĉYY(5 hI 6m8jK YM%s1^&o PLؗ]wmy>wǕlb,*3>cI3 M;M<w0gT&IJፋ[ImȚe,4T$JsXOATO7I2$Agp^, rY R( \{̍L}br[zg;tkl_{vP_{Kl6Z̖bu;Iy5l|Įjk4ԿH:QQ~!:] DüC^ހv^w^߻x(3}nLo> P';~ED8yN6nOUo.0oHg~(?.lݕ~{\w̶ۀG8 !fG$jT tqpolV{Lq//s??t.pگPUןF[mHECrQ86:s$?ܽ CQB[S}8@ V 5wF3Ѷ=ۀIvES&SPox '{ϝ^ë6lV#{.o&+db0 1ҚJ&h1tmUp[y} Adžb, k=8~?bZX8  7m]@/"9?ٛ+{{J6WM %B*u}:ťUJ! c("4mzF[TS6ɒL7M'#m= *)cѱ-dS1Vnk=,MR*0^-~xJK;\o!/;a:{o\K {(k?z} ɩ宄\șF."]xDB Նޟ] E {6PPHZk/b'A @]Œ6FtS`[)SܕMw=|-sxsn AU?߼H- ~" tTjF@JQB*/W|U\Qwr}d+M|_ btu|oXd>0% m~RÓye@1N?swUۉ_GcۍC>$JUzlAb,?Un}Vc3Ao<Ԟ4E9VWŲ J^j*bjLa!VZ9Gt:b7\4H[rԂPR-C! VT[*w^'O{&3ðKqscs<+Rp{Ka"5#z !F6f9 Ȟo<'sH|lNJNLN={ C@{:ȁ0Vfi^qs5#G̴N(Ы*^rxQtӭ'̏9A&v$KɩiTe6Pӧ icq@P66͉DUsL7,t ڲbkyAQu$2ɰ$v  IeDBt=6.Y=݇'FFb<YLLL N8c^ r'ïOJX2L&+׍ϗGE<1?H0:OW{PL Z($5_?$[[Ihk Sv(>k8|8y :!~XJ :> x݋ g%huΥ8 Z*0lӀɻa!HxB]b(EqTo~ 9|h5j8xpU(6֤8#ƥ/_߾ (>o򄍉қx?`u<>=,t:h$Vf[gҘ1x񈂰2+ }Mt>&FX]Yդ'I&é^Fޔe0Gt4}E;x㏓ˠ^-Zoatt^ Wz5¤|Q6+|g)b\_D~lchC%""4KAHJl%(Kjt&VVEILDDQ1xWjh l4IiF@l-J"j+Ka$F`7񂽅_Xk竤.I:LW, j$IYv˸}TH~V1C\[Is/nnhӨU1͵M K7q U8I z I֦Ta@,҂5NKU ۫gZXB.?۝ңyݎ1y>P z=v v{:z:.\xʏpi<dUޥ{-C:%CKVoR-~|boo\tv*MVXS=7Iߢs?lےsU5N ݩ7^}uH;d psVch6^Uq/4Z s$ yS<2'N81*&G_{/՟g,裏J `$ ?{:jA-|qZOOG`HIfV% YP\ݐp<o"Ʈ Co F^ɧۗxa2v"wǒo9/thh[X("CȞ?~0h7[xGp r7UFl >v=BF|>wѱqlU2c Ԥf,DaxvGGB"xȈAH$Rm(3^䁃݆j>t[բX*ڂIqH+lGeu()MF{ uL m G8z3GT*ѷG;IU$);*&*]cۓ&Yuˏ`᥈GL%;WxLUl[7Al9z컼胓eCs/K${U^ MƶˀˊVҌ~"zM[SI|]Z-$AR.\ PH;aO*0fE]RN7 .zIt9hM{2Luc{pޏ94Mܛǰ 0ul${율zׂDFNdt7}3ψ;'<|9ZŀN)G=@ z>srrHVIEV kE=`k018p` +Kcg% \ pӤVUa\\TBxWJxHghX#Ͳd3<.7ݱ &F0??/ocsc022Lx3̕1K4_78ӍF"N 0wW=[[[LH^~_˂th!H~T/s W_{>.H9Mb sMG? #B:#I4:joVbС Oe$U[zcЉ'Ȩg #F dox]utHL)G+AHt!"/$UKhQMV/JHCntcY$DJXpDn)7䤤׳.`utZ8wm_z%ҀxOT睮 4gh餶~0͡&^:|>o3@'z[șw[WUf X[_szad9aw9qgwH"!w6W{{GG1ƫ~x*McF𰴀fǁW0 ]"hul)iAOaOMex8nÌ'%b5 8>4|t44ߣѫtw4~#N؆ww >8^Ud!L$ gKdR81-{K"\ei7>@vP\) ЭA 1tHN_P.W&q FU4ۤ.5D"p0TlJ4w\bnC'BՏs>v! ={%: <^ (=:"u3za&1LH CU*W!*ˌELEd pK8i-8 `rвJ lEjqT*|b2o33o-nn 4 6"[T2\%mtڎ'5RRɸߘ,bsm ǹ0*''i֤֬[-4iǔc{Œ#궛]u*8 Lx jI$>2-8{blqV ͳ+]X&8Eɒdu[4Ku; D$|gfqy8v߁W]=z'y{͆lwπ tGԺk+֧;"^ɢʋ?=0Wo H߫^߷eS_4H'n5Y}`78x'%'>U?ؿu֭tѾ666p9yp+kKk}x3-Fs-iJ,xnٴ}G+:v8|=s>5 Cߵm]Rw{crƲImL =ˉ.b~i dR\-H[>9Tjui綵"?q;ԛgFZp ABR.aqi iUea,]Ng,&x_B.-G&;8{aI!3XV)zK3ITjj!U|b:Mw < Rըcd "~{Czݲcȥ47D* h!̡Mnͭ;x,L6wN>0o-#VOQug!WUFrN qiIb@'096K\p#G=QLO4f6Hf8]|8!p'O^%nSv[vr|;ɧ}S|$ȶi];FrZ{ضa㝃r^ކ[*:j^Zvm7N̴s~mF6G-|{t262Jv|V\Z4P@:VUc2aFhHP{\=\VJHż2KP.om`\FXKݡ3dtF37L @ 6N=)61 2٪ #JSJ$N2NC3)mұt=4l6↪W9|pꂤ/Yng#N8身$ˑۮWj}!=w=<2=n"xm瓓ެ{>w{>ON6]A^p>t|O>@|' >'||O>@|O>' >'|O>@|O>' >'f7O> -~4tɧ!i- W'U%RCX$@Xw+K[,Ew3|#dKK]nF1sJ϶|s~Θz\׷񉙓KF1i`~LܫёaE{]XE@^k ϝt1ozd 3@p5JG+݊| ` hZX;AWr8SD"-ncdr{grHfPnokRUz7H pT0%b%F%LM6Z-S$o0@!Qrό̪ WU{qx};_EnslʯK]/5v>GO}a0 |u)^\dcv6z;9|d ?:D*AR'kɧRxvߴ=skT•+W;K9rScpQIENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-verification-settings.png0000644000076500000000000030152613242301265030032 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<IDATx?l{.c1hb|MK㛢cƨ`D@)M:}f w$g˗< """"""""I) """"""""uc 1DDDDDDDDD@""""""""n Q7cHDDDDDDDDԍ1$""""""""<]$Ijs׸tՎtAv멙uQ )CTfâzg)y0k>>`Z4H2 spI' 틾 |q ?xDa:~HDDDtГ""5%OH ZA'X x$ ]兲gA/u_8KQy4h$# 8o@=7){4<=<ۨK7pL8RiF{o={k{DDD'ޯwy->#ȊE8ꃏ! Cyo7_aM/S'ILZ)h atbK`Iv*[㪊# mt9g|y|gd1xrkK P?2iϸ㐛78GDDtX݀ 1 W ϋMb.muM8O.*sA;\,=܄Vvnan}}=UVMG\r/0k\r\=G4ЀC{v`xc>8sUuy&R 9O8Ny7| 1QI3ŅSGcHyHnlhb9vFPoy6&H}Eq?E ;?y?\DDD;3,`H;D1  |x‘(.W=5zT{5z4*갽 f{DDD'4Ը%uK?94My>5.Ɯ9^ybf5D߁ FaqJ#4G5T~8s@ʞ? ơjVF^~#5~(<)t?$u8E" ⏿ R~Q2p Ίo77]f9@)^3fdM3.(R[ 9DDDzٖL]A` P(Ʌn_JR;l.\էsx`5=8T/"p9JKuR/SiY u9Lw}?J0="":嗰/z#Ͼ_dy%r3AȱK.8r^o|w˃nBUx9T3o "Q5EyxyMֿu ^mpz?{ĚPJ{vVvowD;GoƏu_ׯ?;n\C{3፵QzP+;q#GbhTGAڏ 1a\z~/z|Hi(1$""l~Tv6.`"ee fFc1L]#i_]^o݉,띝 ,'핔u_Uw^{>~ӕ[_}=?O!|Oʧ+ߺU4Ue 1#O^c`#t+>Z\UEEcms _%a 'AۉRN ǎ6#s .<5QsGPhs\p͍ \ $D-ğ_}>c^yx >.]Ss2vmp~8ljEqϠrt^,0ޣ#pCD]ў]մlq MRIؼ 䗣Gǎpze(F⹟=Gt(N/D~]b{0ؤ'g=\xO{Bk=>czäҹWI0uF{Ao1.v66 lp\pZs,‹ >|#؋%/}S_6pXHDDtBzSXE1҂쓀U3ɮszNP>b_ qM%%.Dv딗'0W1PfGX8c%7v,^^ 4mc3څ7܁/$ Pw T؈5۪UGӋ}PFcg 8kZ?j5ܭQ*](,Ϳf_/R'sBv]}(N+ԍ7AKε>kܗm@75 .#ٮhH]=wiz[v]$gk8Ne SdhW/tzTU:.?MA44޸f{IQK)CJch !Kve<'c|/Fk&{O_Oۃ\# "q 6 $۞h M G4A Є@s|QBo}Ф|yT8ss!5>?ߩ!u܀7v*/wv'ϛ3a$Uf.Kfw%S1/ƉQuG!.ÓS O G? KDH.+{کL%23=""G?uup򏈈Խ1dp """""""ʊAG|uDDDDDDD3` LDDDDDDD032?DDDDDDD 3` ADDDDDDD1\2OQcHDDDDDDDDԍ1hl '-u ]"C}C9p\߉;եϛ/8_㾗a)k\]0F4j\% v1}wp DUf}"mqq>rsVk~+**(vBss. 99>H灈# {:)ϸs3V=~]G]T6!p,vvMUU4D1/3ahy.p-l^7^x Ky;ט2|~8 ݮNH.U#>kl-~uo_ _: gƝNĠ<‡O_/:LM/>F\i: ݃yރy풒]g bTUCQt~m6h_~VbsΞsb_sGY6+D`5c}>2A7A_n^$DEضYqJq[*" 8VnbQJ C#cFK<^P*x.?ò֚Qw>'i{Ǖͧz|Ewl>lb~mv܋~q цsMMsbѸ1QSTX;j_tDvbܕx3/߁ڄ߯mf%""""""j @2iMصsi]2eWޏ{^ كSYà" +Oba'RʘOÉv6ckw~3VXaSOiZV_RԾG,3Eƻ| wkV`Ȥ1(~J1+qOGX**^z^6Pv#Q#>U:QvU{zcи(~3Gl .s c^RWOFsO?6NPn/xEtl>nX\qG>ԅ$]~N|qa6tx7Dd uڍUC垄[< XPm?oб<$45E뼋1EڀWׂLӾ_f%`gϋ'a"ýˢ&i\L7Ob{'ܡU{ĥ,o;+V;tm¦kKشzXAf*v[jk"/vp7Ylea3gN;\(om>.)GԌ6n ^^8֙}NqPx|o#6'}Ua[Ziܯ7^^xc0v֧"lWQvΝMnaI&""""" ~V.z8\p^0A]O_J)Cvh9½OEQk>WzCƘsZQqe8:~+7aa I0]6˧"Uc#i0kєe{Ruk<ۖ&֟=/k+5!'MЉ}{ uiݷXqVg{!#XA`~$ka#?2Q1$|K=(b }oU""OR(M8R0n0˷At?{ @WGmzĊHtsjDimB7x EQh(kwc)8Ecyr~]g>!V~!R~{%cey[νde@6DĨ6[;jX}/?"""""":*2O )Qn'IFcPcO,CkG?c{n6¥o;KjQ4ZS)`p+f_kқ.@UX)zM\UȞݨR X47ZmYb bvXVs&-BbKO onGՆxy q.3:ϝY'm>3MYb8o<>64Kw`vjE=n$RPmP>?"yŌ[¼Qcye/amSQa đF 'MLjwx߇5w;<QgՕPO1KR 5p/P .X`M8VPrU2loL\70}3² 'j}w WsfTn9u`b0̓xp{t,\?^j jKKػQW N4#$+5>wfڮctr@ՈoG >Ex٨]j!|Uיsـז4/c^姞A.\+ƙ7, dreݬ:~Gc| {"<=< $"""""9<']kq"c+oaW싗G`?qy_o5ؽYlZW`PqŸd,uR69%{B)VuDc981̉17a.MB367̿u&n޽PXN9šbk@xX[wNkmͱ9qƏ:V<:[?%FSAl %νx=[8+g}Dqp[5DnjyɟgeDPm#xڗ1<<h DDDDDDt4VgBY3 $d()Hd)X܉eڙSws᚟Wޏ{^3J|Pϳ@ hV,㋫*…Ɵ܍zN>+K~xqIY-HMYr| @"6TUG)c0*kr㴙W`@Bq*Ebq8mhj͉MwqJxvV`ߎmv_J՟24-˹i61G=1R*ڒwf 2k2ǎp q_L 2 q'ǃ /rjuOB|fE+9SyިF CD "{9rp֤)^ZfU?9v`ٛVb[_خdӴ~z9`}FJAЗ>YJMෛoq[7,gk/%Cf_`5%jU}g?-Cc܇fxvz㢓'CTvKN)qāH+lC)??sDS{ @̝Љ/Q(_D 4υ u2tETJ8iL? >iHKcjK0w+1Ľ ܽ83rxqe{֘q՛w㣕hTs/xPP:C1+De2qo*]@7}@LUFhO[`GDDDDDDD1=|4)ԉˌaVh]>Cen^{=N=lU-Y;uPŤE θz*|;?ͺkX.lAS܇&݃!c0m k^;34AqzjxL }8=ɇ7yc%DDDDDDDt`HJgV:K9%KK R׳@L\拓1)YU}mǒ{OU0(~u{=Ɏ#Z?؁~tŠg?J [rD_3kDUu| 6l-Ĭ/OI  '&޽mTɩd5ÆKEоEr8wy92=03WBi3'4 qs? W\a{(hԼ)WMrתKCJYk6/4=|tz }N1ޭWn#L}R:"[JqJPvue C!/3n$Lb5ٳ&7G54cGT^zJf')i,wivU?={hʪ?""""""":A1:k_O JOLZ @qY~e@%h"<'?T0{PB@u~Gfȕ.w,XF;_<=3?j0&t~DDDDDDDtc#.a_RJLVu vUY-?v'W/71o,cO`u {{?Ij65Ժ/s?s,~RR:ɮv7`IvPҞHC÷f;UB:qi)nk )F-M'MBoOO~}h7c4lo-قXs0e?.-Qgr?"""""""JK&S՗%G;e SԮY 4${jt&pL.Nv499_u>T7 rfgub3MQs68X2Ο]~SvFXGDDDDDDD]@NCƘ~mcDjI>UZKF_|8`1ۙ2q!&| \tw}mH08ix7/XzHϲǁB22e̚|9  N/$iobI+ڐ'W]O'R*Td+f't-gcS|^g9܅!ҫt  .=S"a[⦸+v!:>#S&ҫ xr~H|HZz:HƏ*VP#-YZSM{H^Ouq1^nJ4o|{Nf+GfW`""""""}Vh⋖j?)#Z胫O^qhQCG0>-Q1<0ʠ!ͫfKϞ㵝xq6!o/fb=ï4%Kjo_]f,Eb^/*`|K4 %{ǾP2ڗǚB 7ݷ ϛuk8\nݼw?/,ZU8 ¬Fa_7ءa'^Xmͪ>rm2ގCn*<~j B8]׌=sʰx Bu {LA_f`>ϑ[*kAa-N1cfO[?5nH9E@tԓY\MЉ+}9pT|ulVf~pWc Xy5l21G,WO79ogBuuo{ӺZ w_5MgV]tTlW/Nt7 p/AM3[^cEj/or nN=e|CgOPtuVϹ삩[ɕ1۱f?~^{pf'BshH >qbӫ[M6C@"""""":1 l{Hٻ&'@Ƅ)|HvşӬۏ0'DŝeDcD xn|b Sˍ&NdzOoik!2͈%Y%QqiO+,q IN5<0~cf?p;?} \x+|r@Gt9ރ׏i=xYC `OTP yo)Ot#7↫K޵a7eŘ}@Yh]5x[样?>:rQOPxoC(bqpb0DDDDDDD@S*Rk5 }ru-$ԩGDMVŚ8# b*B%a$?UyƒqoŊS8XV=DťQcX[L7.5{e;R£~D@ris0{ Y0[Yukl>1N^,hY&*nkqI)]~*uRJC֬`Qb½Ѝ=qs|p"Yb@71G *VT9+DمqOً-dWyfG3m1^^7*ʴ[?O.'$לM>[k.$Gyuvd\{֖\?c1mn4g6o?ҙ^ƞbOߊK?\o(uݩ3[ s?goxw1q̼`+c "щH)UÞ!<$b_WZ/ )j xX*[z8uFOJ^x4+ =\}DS4Ϫ{U3*U1Q00ýo1qos_2{YJ $C|?瞻7g@=`ߡMzi?[K``O`VIv_⺔RlK[?!%[u Z9*#<0]?*_COniBjIÛOE)C)O3i-b\8nfd: |38'*v0oZ8NQaAr!y D2Ƭ5HN7d_|Ìsis%Kxejx 4|eg5_=ѿ~z48b;xVoFH7bW>4.\p… .\ uhp-}{H˨CJ1@q\ cQǪӃ&*tnNv]S,Exbjpd4pcV'?1Tn6{V-On?3JYГm0_qY (a+vNxb^; ]q>N0 .߀^\ɕ iVoVqb!ЪӲgSt'\ f3-Xɬ~CvD"W]8\WY8̱Uy9{,ƣVg]2=yk߇i2BS__[nf;إړH쯟(mVuv!o[w>U(+#XmF,j)]Bn4̳%)҃Et"CX_ چRWt $č66hxw8[E_-]I zθ3ҘX)%Rh2Z('ػ ys&4Ahf;Ít_kvT\vds ?sO]G}>twgD<&;-x9qy}=7]5ݬƻ墑f|!kV=vy}voY}/М9JW>kO71$w^_?] 7[awqg+> WI#H]5~`tLky/'aN+´f2(2dE=v9aGЙXUfΤ\s"g24(1*Q_6wÌ_k4,"޸7-3.&*4μ9q%uFqq҈qRgN<PFUG116lށ& _x<"\r7Zd'w2߸ƶsC)ez'T6Cq׭z_HB`N^ud|5VgU%J/Vߙ ^2,VxUh,][L@r 'Aڬl;m}xoFG9~~Kk4 GVs#(ާZ&"""""",1 da6Tف`5^Ya9&k;DϚW6wʈydk>O@Ɗ}2"qX @U@WTh%?)=KS$-G4Qe& RJ+YMgNXрoCrw֎@R yr8o< q5sRkPex|#5oؽx\ v}y׋. y?2'IOc/}d"#q fW^^g<^ܖ WNOv8}\o\ dxøƓ+̰Q{SGƯߨ Z2%m>Qh?խ9eΡ"z΋3޺fH(m?N0 {DP DT5D >"{!r $L՝Vi 7JAd9pƎ: l\0Z!fw Szfzd޽m?,'FX>q=8zF>w:Ӽ{ xry5dIO3DͱJ@1"-;QJY1}߆ Z닇Ldww̄zS' 6wpoC)\0w-I4T]蜩㖙f6SW-fwuyx7KQQoDYʳuF .Dž&T2>n(v![ ?ĵc޾l<k[:?ejk6VIۏy}==OlG/N`3[788zH" b4ƨ1ƒEX"(4t;o7uwvnE}ݝ۝y-ZVX\?Nvͯdž-\T:雼 Y/WřfKYb߫`F{-|-Pʅ #Upo{u+th#,ɧTm6:c6=s [aҙ[rpIㆣO*d׆]tu}ӿH(L5`꽆HA>˃C+ X 5SeVROV7ׯG6|U*mԫRnGUUU00Hk#Kq1mS੪1$v%r]O?x ndo+%.xsΈ)#m: 2yG z}Z:d<}E))wޅ%ݔGf7Κ6zv \4fc|lߵOmOij zlvo_eg=RR7>| } Qٗae㻻Fd^""""""jUF#ܲvDaRVJv!P?(PO/v˴DLV娒ע^O r7Pz]Obixz}tUղo،prޭ0mv50k}bVn9vUÖY~ oG jpx8oG]+o-Kw!˓:`}¹gƽ*XwXX$Qf iOϟXVio$""""(SS~cPi`nKbtrc `# W׸5R4*ͽ)DJMZ% }deJ?#jQ7/6Zuljy[,}n)F Fg e1IpԔ0MhIp)CdRBF!:4L;T!V:iu)U}ǑUs'>]Q^K#ƦCc*Uݬ<',""""""V] QPhhQS2B#OR+ي@1jM)n?VDShaN?L Z5ؖK?%RC+ԣRZOX꫑΂ڡSK0*D*#gL3/{Rf5jb*RΚj.ߥ~Ju_ILl/jD<|y'Cj׫C{vS&Kx̉>9uw!6VzLDDDDDDD'7xQG`U}maf`Ji?* s7@|F^mG/S;CK6u:L% G*m*mOMmJ RC:8!Զ6 wtBDDDDDDwbޣBϪ%h/njw+>UM%Ԏ>,}%~~UCHB;!)ZO/do &,DcaKٕ6 ۲4)U`[oMq$!aj$"V^E>(?!(?%R>_}?S^I +Z`ߖj; 6,9LJc۴*{@ЪU~%ܰ)_ MyB\ @e,%Q+0*XK G((( "Z}P@@@_SmLܚ 1`?!LEDDDDDDD0 Bv j+:`> i˦n)jrv! R6՚+5!mٝ9 Z0؄] (6miv<_C@Q4332 _*0cG?S'ۖyOSӓ>Omb1{\ɳ'd<Θ3׼ayN5;N㷵|X?Nc""""f`Uo7+p)^dڵN^[RJ觔\dnT2c8_|v ?&oY,F ;O|ҺM,cꬁOf;cZW8$9g Ӽ/gEcOc"r2cT9~gOYw2~5GH%Mk:%S*%mҁ|yʃW?;0 T=ꉡA ` 4e9)7mLE8x$^Wb\Y&)E_P}%^ }NcI6ߜa~y{{܏mw$<&"/-u,Vu̜*9FԞX3N>J'5{B\ ;7Npz]>%'!vDdy3f:Ο/|狴ڻ/tY훌vN?J+~~Hm3U~f־ OýsrQ&OtHwVjTBv^1^3/vܹo;&\8w_ gS>Ym*w/׻cņUȎEd[-kH>y*CDDDD 1eKX-C)_!^tm|=ӁÕZ?]MDA…yq}K^5x,)  e#VGڻ ܭ NX KM3{Ӑx;)4mwc}6}_pTwb-zm ~[ ߎAy[pGږؐӻo^8q >Yi7/ ~M16U[vyXX,M>n/ϵcp>v=0ōlǙhs.#o7ڦB<Š;˯sF,Ω 9xLݲ9 1&RUPoE֏xlj! jgGVړ9X{PP|!^xo`96LH.$4{ya[!=!R.xrw!6(C-ˑPuoWJ brHv<0=Oslà qE86rG>NÜqxkt%abԚ;+n].-Vgy .XBަ=x+d՗;*e:J}#XԴsMg !Q~}g`~R=BR9}n&?: @RawHÔNY]Byy`7>j۔π~ViKfvBѺXݖw˧iix@RB&|뗖BJ2n{jNۑgM %H؝UW_HOr[]#67ۋc0< gy8$ WMƦʰ|M6^2_9k@jjK6ROѮF(0Ű냵 p}F3Io3WxR}83 fzȼy^i#?T{Ԏx޳1L,<- r i>CZoz?qg]{ U`h<9ڭڏ8= wCK[ ŧlKh!nhz⇈جѹ-h/P_u{jmמ-a_TR|~e^c8j4ղߟ lwKak6C6@ÑMoWIRhI@s`W955a#$d+1._xS|1;@*u'IRDm ^?_m-Ekn'|]zCwzv@\|YRE ]G VBܤu7mjI+% GO/KcukܦH/Kr߳C˕O?pu7ۺ@u3hwOj ?3F$81_| C3.\@} yy^}@$K' CpU|#BDӫRRؑ.yK^ZL$?gsYxv Dԟזq+~%9SY@l$rZCVa\>ڎJ!S }=평ZunS>ǡ: Y벅NeGP!)/`W'c,CfТB2gT+K"EVغZ=m(Ű6-_<ށEP$L&S1/셋ώǔ#x U[+>yb_hnyB3&}4Jig شkvt_N,;R,ߓ`ˬڼn<⽍.,4?_^$8/W;ǿ‹SeFSQ $'hh{!!D@ V O # ^S§_+ۡU5kK# LOC?!Zdk"(Y>s10CR@~ul)48.1{j\ŅןۂzY:vE#Ĩ#b崁Al,OoR,Q\ t gv d p=m``tᕯbXL/TڡT}5K.xk_ H,a٦ _'wCq&bꬡ}9x _Oփ~8iN!*aI3Wk;0dPյz%_۷i~o(d$xuw-q7.2z6`e!9; ho ܱ T7֔m6ELxdV~h bpW^YR'1Ӥ&8Kr KK7a%qPUcZƞɟMJ&o_b[Jqۅ=17%"82/}7_0u|7 kg^,{?H^f`,|5= Hj?Pᥚ|zEԺ%HTSذ 9~{g>) 9,GDDDD {ڕ~*CZ̡tk~~d i1ZgL:0Ɖf5 saJXrRAQr?t0`}^Ubݸ,,+_F˙bC=&. 7w">=3R G>xh!|snx%8aPV.oiEX3~{^k\˪G3`v*tQ!>[:K^U '6g%W|9ۃ7cMqoQW,j\ǥ)@<x:쿟FQ~lzo.{(,:?v !oRi ?g[^t6kX˫FwF @]-vߊ >38p^8 \ܧC\]c#p_L""""?"߸M4U!ɍ%jmjjҀ~!QCh3JK}s!ַl껨ƟZy5Ii]?L_TX8JSje-HEF}Xޭ;ED'ڱnMNgAbP2Ą3?lvg&E QF~6yE6o ~Ԩ'%%锸̉`_c=p9,g m 0RY*m ]HRʰ3O_?Z{B C!#XT \^K ԶrqD^ilIeR ެe# ߐCrUpUZ?Q! dP)X(}mUEs_ ߅,9v5׹+Vz56D'Y6! EQ#/e.cCg\-A9 $< =k3wkl#qJCgT-AdGDDDDDDDх`P.^G ܅J*@2ЬA9b}ص/ZE @sgp,Q(WU_e'ğzklz!""""""" RخwDPKh8!1i](K3bӑLo sw#$1RDZ+e{vC(K;kNBU%p`|֏#.cLFrlbc e׿o<TUֺ૫Z zZzeGDDDDDDDQ`S>R)4 ` ~lYj'$5.xYuE<8l6 j~~~~^ ץyF>}?A1\g)`4Ä_Bm%%u/x[Wʯ nOܒQP$y~Al:SP ? @hZg8%4;v[–ϫ:"O.9nQCʧOiʲM!dwPÔ#;vb\MFdRQTg;Ɔ }N 0 h>\8WoVTj>~]Rzk?SRUW Ҁ!b|!R¿^CwHLLJ&DDDDtjښjtL? p㛇_(z0F`CMh? K)#jJ[#^_ïگ Cz8PO S/\g~ Ƥ`P66tpIqp'5ߚG1|;p,TIDQ`h,4eq:H?%#^$cݰZW |P%OO'XI1x0wI͏`>=0 EQ@W_{x%VD7j3>~+%AЂ?ޖdPT>~z 6@bbR X8""""cvj64(ٴID]F×#…F' P;1ϵ>r{!)?~nӠJRdnהZKYӉ8 W|2%I[WV?"""":ִsSQ_/y=ADQ`0BC@ XO Jvȫt^0 gi[*EOEŐpm[kKԆpqV:1̗T :F#3Z3B@-˖CE03~>:t!Ԝj&8YOoȷdlщ&祁>~Br~R?7e7~\Ӥ$87QQ= 5!1[౶~iNH y\XI޷)嬾=OT`xiE+㦣0J?偤VK %ʏky,O0"w N &ܓ,Zdp-z w 7f=مeKg>fK̦p#o؜2G$sщ;XD0-.S4uO|{C֤z<;naeu"Q)QV퉺cI̯ !64QB}ĭو% (_':KV.t뵌Yc~M @~ѫ]i=?23$92hk1jQ/aɆ,Hz;~H< ˑa=vOXuv#աǝ(H l&3Ypz7!%%kۮDz $|1b 6h93J_Ъ9okHR{Ɵ.퇹!]KHc$ 2 "|/¾RO/暿q 랾Ϯ-G>.$~O̹1s\wteߏ;+⥣>] مړо{3\qf/ĝGbزv;fl 54 zλ 3V>tmfK"""?n }UY[1'cJg-Msj(% *P .%]?^7-o蒞8vyX](,%IhP9Ϩkk-g ZZ!08O{-zQq<^XO“hBj~}EpzkQ[v%fq?׶H*]Hx+;t;X [ނC_adX 5;wa@{ԕ8X+yByx뭅qxPYݱbq5o""":23/}^}D8'<6mv yNs6jr~HwzюS^~Σ=3 T>M$Ty9OV-kxv~8 `!m?_/g%]u쇸jcp_f_a[ 8=*=">?_ۂg0oVgjTBv^ ^{;;ǎaG]1:oU>{k-_] iߖR"ihL>s^_ 1ݘ*8X*"8,/0o" G⒥GS+?}k+ 'wЙWKGrہo|?Gw*u~?z)zy\?(̱/{ .r?|7)jqxF䦞k8縱a^W\?ᒾ٦}!"J-pZ^j: sOwb==eBфK'%1`4s޽ _xaMZ؉Ǜ14=nu/9;F`o7aˎNsX\ЮƤ ;#Z[j2RJМSICpo}HƧwߕbىxr]{,jl{?xאM87j5ijpF+۱/-~zwO i/\&-!\@zͿMOoCbq!ko.l}E y57C핪qpnw ,|"gQo̺*qy7| V6i~SS۱6kml~CM|cg DDDtOQ6x$ WMĦʰ|~|}ħD$u-gWֻq^I̿Ƃ[m9uU؝[ ŸTaŎRP8 +tmS \Qq.xrw!6(u˚D)pdTUN@ix%=Dl;oe>^Qzzul=}-FT+]u=pb&!p |]܃~̃~p)NHm l>3uhT "HmKrWkG~i #h[ 6 cgp'bǰgw֒4އ/qყ# b#mD_HCvG򋆈~~=KFvPJuHcSN>*kHK ;{?msN-hFbQRǑB? ;Bca'ƍ+ěs`Q1 Cb~<%uҜǥ'cl{%U>S;o$Ǎk/cQRK1JFwks_~6jQp[Z˓DsőMKP9$8]~7y]}DӲ写uЖ/\G^?vEG/9tvXV6t65ej]^t7%8=ODǏ}s{OL19=Y>\?oj1 7~[Dx$w-֯-)X~iyx\qхw_X.'mEnfHbz+ዡ=q9wWk@>$!%լJU~e"Ά3 (5mm0شy9R{Zs??Zیq{!U(F}>%8TN>c0-KLU y=/ցX[]:O dĈ1ӆ [o]%**A^c+{__C679Rcދ!Sx"^bTj#]#.=PC#""":^VϦ?Pk!`h)?K*AhS(N03]pTFG(>\W'§*!j)׌_vȻdo,u~)<o)N5 !Rݚ#`\2#t!=ߞWg¸OKŐbHI@u}0VrG1i9 h7K1PR/4sF4`')AW:$HBjCp S`= W4b@Mu |?Ho+V#1NKw,pV'h0S~"(hMeKmtr~ OWLUۨ&@""":֌&\BD J Ғ 1XXscP}wpa!%!-QW"|nS'H*hweȩÖsz/'Us'` ~;6TUzЏ'Y)$]e>dF/<~xյ K% C5t{θf;5xLTQ֌(hTUbe.v܅* 2LjLHU;sc?g0:t">(u삎rd{ k%:`i]X݃3\y%D ; =;웏 tJP< %JƠg.DthaW`žBΜ3qb52s^vit{SKP0OJ -%+P6Li[ t R:uBksB}+j(Si7s``V&""Okywh5rԦ?J~i6[9TR{BUR/#Ez'҉̭/n«O9rFV{Q񓀨N)]q{b هǶ"5oU񻩣N;oGJ(ytLq+uXn)>W~|3@537_8$U -7ϙ8?# RI-g.(!#؜HICg`tgx wMb,YOP'j.X%^{sqx7qHL>FOvt{ n~ /}Hp$!`Lgx0ily+,j4]._|? N m0j4:}s.EǤt@[c|XW^'ozu}fk_.r/RK /QcPzMMVRI3NyqB5<RpμXw86%%I/W T oϟ/}+Ń`S|[gt T!""":z/ _WGNw$(3㭼UVBiOwT'8ѽoW21R\uؽ;zq6єRGghPňz Tp=^ d;|/YMv_=FDDD'L{Z*m!ەҀ~~ vMNDI>'yͯB-Ի>A ؐ9jjjIT"77(r(y )>}_~HKK>A-//Ǿ}>8q"&OΝ;<k׮źu ,矯.,++ |>CSa+}bϞEضYm|y yz>\R>6y }z<}qzD:cFp%TIЩSzW) 8eS9S(qFh}e?u|_Ջ?{d^NC\v<ז CX ԖڹsN! L>G *+[ ;s7JkkkԋƄ\&$Դ .ٵ9r,&1 ^7G2=FCm^{!b|4H;fR y>9 5e,3ۏ´iϫ{q>[鯙ϐ'GR@s H'^ķ"׉Gɾf-"ωUv 7P/@yN w2) q.Z"].[9r!%+'ӟA_y<}"yMPr/zB apW3cM1υ4ʅY;%N tKݳs []ںz7a&ba)þ/rU*r*QSMRЭW &OYcҤΘxx/YY4)Qc}eG>O.ߟ1C~>O.ߟqy;ȋ0"3-qXqw;V/e#8ܥV-^~GG ": h'h~Tj}I}TUq @LMrTZ)#M-25+fj4D4VA!{{{Y~޻q=s{`hnN+߇Pfg7|Wx#+Ewbq/ bxb3#5FݚV0SX/yO2*{.UZ]߿Θ! .B_z~gt҅K˖%8HrMf rd3x_S=_6BkfCpu c "@Z|~ ͫWUx2C W"^NqC_L6%9 |}wA6հ0xad)TuJr>ںO  {{%Q5$6p_Tj6m][iN/*^H?!RH׵7oƪ)Sۯ2=ۚ7gaC;~yǙzR#K=vHnݍ{A VF~CS1 9qf(ks9)1kOǰ Q+?3ob޸ ̻P6Y_A+ɾ8\ ]V '߬<'*8wMѴu˕xcC;hoEQdxa E l_"Xg'l42-w""QhCdcJn[g \<ƕ Z;Yw? +<پlw;!sƨ8>XDvheX+W GoqF> j6DBسUD8ȷ.)eFiVx#7xE3xu&Nf[0u2"nojM}]wLDHp0O#9޴w>ɿDDe*97`8}x8NLmɼ;õ{1?ÀJt|vGlA5r7e^*mXq z(ꕪiok&,rA}MT{qߪPb W.8w=~ G-j7k R\Pm%Oz;F:}bՠ a_>g޽QOXh׷{AAtsC>z>}  [xiߵ< `[%z+;cORlcsrf';Rm0xd\!,_z^zn/]Ww@6#Kɂ`4X6xcƏʒӟvbq|x6j:aZ#>gJ@HbhO^6vAt-7PQZ#T;uq:.>uVovcMǘ'L1d.i%l^ rͱ(ikMwl\/l.Ƀعn>jX*sހ^׺VkB<?8uk!E MļAqssg,8#[W‘! KqN¥?n'q"lZ͗ըUƏsN2^^^p~PG0\nmjkk7y,peubto;ɳNa*zvCaʫ˔ܸ߱u gv-k&NVb1Fy,k>&_4ab,C1{pܹsՆH;}+ \9Zjb΃VuƍKagP5䕯O!H3}?i"YO\}}sb|{;IU;g3@y_1u"zZ^N8r'n]|~.vFD1 uP)+uZ]J|3&hXL]QFa_A`bbכ,]!|?|gmX8w]V¥l`QMt4w,A4<|>D8iܦ'ީ={p{?㻱a3q/q*ͺvEͻK0m'dP)VvL5~zty:X;~> 0FbBsL{xy~Tm??_)s'7|vk'I`gSj`*~-A0}:dh}u۴FeE2P+F[_t $ODfNE򥳸k,FѲ ˮ=zKز-} C}r4юxPK0AAaeg/~U^'7"Ãqrq׀V-Av5*pkGcxMoZBPXm &>db1Q vԫdvpDu"P^2*DڈuE ށ;`Q$mNPy {İNv ~Pي!C;bǑ\̾tᲢlmTjA~ō{4oK*!ԆPũ?\2bT*Xt-zRąiRfuCݍC͟]jz\nriert 0uVL|ⱗ84L ;4}P:9 lE[TiB6 63{B8y8Isk-XmM$V=18;kUn̪7O}ZƩ3sD9NBǍػ1dzX zxSo&~aK]9G[;~C˭_jWCz5XK>ÆmcNc0OWXهx~ݏ`\Fd s|].z-coOŒ+`Jr(>vS447x\Yv>c=x."zJ<=O hѴkD<\EV1TR"4$*M ɽq?d0nA+?7 mV OBsC8ù?Sܡ asm[>8.D5]VgfőObW:bXn56DC/*EN\]&)A¯VA,\V 2K)2ivd" A"Q(~Cs'bM̪Pc[t7]f\aI$% ($]){=+p/MKl諒vN|^817I޻vҧ4{W.]7%+#xS;WȒkE"S8滏bKǬ,dLR S%K 8wy-m }mj L9..jV3Hb߶4CWTWh{3hOQ0{OJ.U^I ?eà>hE>0GDO 'D܉>icG A ua/i؉ş ĭqh<7Z֥UV͛WFFm)*a݆#Aud=8 ktB]ʪV#"++1iF]fbߎE'ĵBNG0J%^X := )Co#8jp?$!9C(K|< ^oy1lλ_y&2ѲU5+-p}9G4NGb_" QE!8$ FڢicN6U{hO׶0,<_l2gl?!W ;ToQWn \\dHa*y%mmh@7n8Cy3+ AA"P޹Ln[둆F [yxUIp>1(O`_LQS86"/ OlHD/3Z*2妰ݜc8eA+)"nhWk[HȩIa0 = }Ki7N@\Bwq1$3"!^UV`{0d6cGdݸK)s\7\$”] Re:2UѶcCl'hRdU GG`]8*4(30zd 0āD ?n#۰r-{G -}PlAYH|T[anWux7uk6b9k68zX8b!׭A{q/RKTols͜[}kcUO.2-nn9ҧLnssy)[?1yxj멄dw â?೔58FQW8xDڬ,L0N9n005@ͧd0l>#z eo움 W^`=6Zi羺0;v\?w]DXVe45kcWul 3`,ޅ? j=`[{q_Gvה@ᨮ BY #GO' u~VR)dF_LLK\3sTm.炪܅ϩj5ttMݡ(,Y5JoL&ySID:LOÈoB~fo葂rCU둌SὩq_]c J*4е=%ªm^hOTvypqju#G~g7`G@G9C06K|o6VL16pS&? Ř0uX 1A8yͶǷfapsȲR ﻺ q8lY4SWv<9AH_GbLLL}lsX1΋ "zn$jPVOJ Յ 1k7?eNNNgYj;-,DW’XDT< 1W߲|]rbo BJ۴/;(ć ҳhC@v9OWw~[k78oO7 r#5 0b1Scrc2\%Szo4 v!x),$$#w_^ğrn.RDDBA-ШQs?̳I׻w+H)ñ~mIxtLގG{%ݿphM{~){mQ3Ը&ý{jNE'[R\o}ϽѧNXZyhPB/X{mT-% J= .].E'BiN>B`-+{4C6vrΝ5W9{MBD]*!}^flcStqmVj23=GYR9nirt..pȍA10= iD[JKEbf]0t:~4ZŻ)+S!+v4Ks/ L M륛n ۯ)f|ٍmP)%F *7(>[ЃAk̒w% D(v2|xמ|==?BUoDh9)wq&Fj:fU՚'?zcdz8iЗ]мGn#};h^;2î]I:?zNk qz5Y36h;SRSi{5oh.B.=^H?!қ B~QQBf?—nŞ;&ĢqD$ޗH,Gvw`*D#K%zzs|Z"DT pDDă%Uq튇p$AqZ4"0?V,d^^!1VEQfǞF{v8jXety= e<^CGo w`).4H|/;sfi҅3gnk&]x/ |Na:kiGI4*6õ~ 够һ ?q\Nf!ݵ~NP mf2K M&Db vH NJTmRa[W(k[m٤}0/| pyYQ| 0S8' Q,~GogFPȍJv(7+$GQEƧWl<UlADDIZajbU+ f Y*5Hi} w e{L{FhɊb @"""""""zFbO9DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDE@DDDDDT*ccccjByXQE7[ >@o0!1!,K caiQx2!KoPRoP :{`|lc @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @"""""""" @*sqqaB|1qq_mÍHYF7S~٪3,OUh*H0HES'⒱<Cڃedս}z+NZRFD݄ϝt[;Ūq?Q c 3` ƕQHM OTOs㉘:k ?Tp^ ҥf0Q"Ej¶Dl 0z ܳ߯;{ P0#F<2H"Va [+}< `QE7[w unn ?o;[QŸH*؟z+7q'"N( Sqm72 ̞:/$lɱ gIPd8OXVZ T6HAݛ|KыT۱=ǽhO\z$H@2cOap( b_Wu9bN.|p'b_{ٓ/~k= %j߂g-׶pM/YwA,rLLZ Ft)  ,WR5s7j8&" cpdIl~kgK1g7շ'Anޚ.%G~7bq3C4zdSE"*K a#3e#Bذ1|ʯne0sOhCDDDDDDD//˩dr[by>#yPILФs{I@gV#5]NIcDn0rfn!TCbY FbC31Lěbqmjyb2Թ1y:ӅOƏ3m$fk[͎z;˩wDZHf:.GrBb,UoU!/lε=m yY]z2hכ[kNX!""""""WT2;t{o_AsR x!*&P$1׺^3y=؊A9S^.8#! _"Τj;yĊd$J){|PGuF.DAR,*c T'<"+"?*DDDDDDDD/[R5F5qfw22QsF$^bh\50$)F0}>n[I_Goc縲ƪ4dݝ`) Dm3Ѥ1.z'}TY"u|Go>05rAViדnYPjߋyATx"¨W1~00w8٠WO<0X,yW*024B"SțJ MuNh-TVg؞_]6gmH)7EOg@v= ;Q  cA+ju_Y~DDDD/.R K9uM4Sk;jȒN[%9]˟}VȮet㉈l?l,@.XV5RTn'y?eD4Կ_nVۂQ?Yfa]Q{ܴ/~}Tbʖ.z}N ~^[]ѿ_?dgWՅV#7έJoi)OUNP[o{jCO<ϯg~HUbߗx=@*_I?~-:O;HY"/_|Ukip,|DCxӠ2|Kĭcq*i/.-XR@}4 ;{a0n077fyͮfCnʽ_fX^h<X]HzGDb^Y$ѷo!´T7)YC'B.ˋ(;8&uq2XwƼ ӗ_N=CWS b Q70}_ Ͽ_U48|\l9~bu{)Sph1~n} |{ N,¸WJ\)`O;(485|ޮl珈 U:Aoyu gSN{d|:u՗3FeV uv@@4=WTz9b-=$(","KL:QܪJLT0HŜbpxgxKQpA3Y6-Jq) ƁeO UP _7o 42am⯍=so2#ߍkY.ERmBM?p:U.eUiLqpu WGgFU Ͱc5T6kԛz!xڻ3J3M=n 7|ѨI3XXXh~ny?z4Ij1hom`]Rp>tR4LT j{dM-4CWlS¹zڦrj36 ,JFe)\[?{C S^368v J8۸QP+daU7d(oX Hи@9ls:{6#aIȒ[as1]ˢOX.`kMfs5pz6ֶ0+l~*;bY/,3Bs1_2p> /6ƾk :OYT@]6Rny~U!3GMcOFe|I0:  {c,:lq">ب]Mۀ/^7FGk_}:Bc|AÅ2[}r$ sqzt]`3qazl?uF[ )ja[QihdqXp=,\%mVr x\ٱ/#4* Vh3'|F"v}%δK]@lFm믘̙_qe+al&B2Y۽%Ve!7n?-d}NlqvۀG $A+:d%XGy1Jα X[831sMKBYXN/Ťc1x.ueVS~E, iZ5-%J @^vK S"^ uXY0 VV֚:ں2lMpփeeN;I5XEkL(Ġ,,ӂMSp;qBƼq1w}jJ4i9=R[EjI޼>uj R%Y Nl"*Dބ-6>y8BVlB"wgb^߹K/VCbM2|o_nh4>awf5w R[S0&ŐF.¢CJ;jW"> fvc|ؽ$1v`, X:фwa-nWab|Z j%!UDńaLBsx!ˢ/ `a Ձ{gwaȜ56ջv@_]-ξ{¬0>章/06>{``dDM[qK*mWQI@" ۊPӫOS1gMݶhIzDy@#sd%¬\Ɛ)kn2lp^)e Zs&%8x2\ka?"yXG'YG&w;h}]Mx GZe+ }A,|4kZ; 6h\޷IXt,)ԅŖ+E,+0>XZC>@co׭]SZyֻ:!!rȠR)SF~x* vi鞢,"=᱀Lu%:viGvJ BԮ%IvC@ɉHId5*wO~e yU\ܕ@zYpD }ۘkNN#=ma"ԦhҠ2j9=2 ˪Q>7HzGqGit͜[ᵖ5i "=QyC9Lk6C;!cN?{Y;M۵]V-w8!& I 4:9  qrš$'$! m*,YoJ+Y(>7ťcERO:{q97W/ƫ ?jr6y?|=Կ͉>e;2>(xqF>r?u{$Uݎ of}z Vցz{X/ݍ\Wycj|y;06VF^G핾l5JTa>\av`0DQ>cUY~xېeϷ2.oXijiFU??V?J9NʽGoִitxw๗[-o3bۅu#428zPEdĊ(OsB 2Sxgbk~37~tOMDD ?'S ł3o+kqal [0u ^4:!S<9o2#"6쓭"?yy]\NfC=oFdT\n(V'OQ4į>jz䋓ws6xf|.2E}GXSMLLA8A"BgvX/4FhF< ]׶Fu5>ʁ"׈vz W"@RgO׭EP ~ !Mz| 5:gZ|c|8FQ3x#N+Qxtt|7jb>tCP)9r%eZ X_hۖw[]3ۈfq%*{1p&h+w=g>q[S NjEh֖&AF8=)ly]nUS4q:Zcr:ܭuroCnCHFYOCk='@AS?ԟ}!. [L3UsIiD.TJDDxx377УT`I]=/hoo,tL)FF^/b6 Xa,G6R%f8{{VΆ/T,$gjV0lǟ}ޫ dx~x\q[o`>tPqh+^}/xʵ_7)7Q]f7b rC6_/9V ?K~#bf3Y;Szqs,"ƿ  DdegA'o|H*=| z=P.vxJ Ĭ(ޅ+ç {[sʃ#.-aȈCv[ ;{1VzXK~'7^Oi6?{{[O~u?vd190yJK ޙфʄK~/*W_|^]Gvӗ)`G_\~ǩʕh=K7 o Ղ3*J:Zo/$ݽh|* l&]3"N70&|urz `2j3Zu %?(L=,dG酸ud'c %(7o†ǿ_rh(ɎUSWTuS6-Rn\hNSeB^SsU oA8jzA G,sb?EU/;wBO@o0(~(A A mC, c~WCCp˟Epd ]Տm$~R> `R=%YڗqV8 2+ǃ3!E VK[0)e7ߟfИ5J2~ՇʟX?ƚ,w\uJ}iq M?&Cp6TVdvg}418zC>-ƿ&/˕sӭsA4G.4JDDt`=R)Mzjz \ =(LFXV ڙQ|T19& d-:q,ӊtC# ~=xiy]pcMx?R/|?;0P6O8ɩ8SL߈5\y~Ru_ :p޹uU2Be _Ԕ6+Tfi;Ղ"SBe*\.x?zxy6Cp&o:-)ҫxmòIՃ(ت&Rg]s3$4o}϶[Wðe_$ }~asz|W7hAJ_R 蒐҆?.6>֏bw#o$7,dRy6%H= J>Bːs BcjӯƇ/J<{/~!] Ϗ֡m,aQ$2l`|.2ȧq N )oRy[?~^RNx;1)qWVǩ9pJ^yIկ&U.kվcixF>&/q`hBͱ:j/3C-rY|z9]ɘ9bfL?{k?„>]@h2ӥҼl8tМgO)tR_9bBtcwC%Z#ӨABa =DIQp*5޾^\n=6igO¤xN$z0qyvL=/pjFH!p\5)G e߅/?{jD~ˎa ;_x[:V 7}2d[Pww`5yrc4%}_k'-XCVG/go ?}e^u'gn ӥ%aE5w⫺-s%W||$_e_4 ~?eOq\}7jo9{{kē\}x˲}3"Bpž?.Xyu>6Tǿx8))֠;5׶g:i= hqv6ן(цg6W^=l8{a ~|4>8'E:*}|Wcr%ʍ|.Ǥ0zvZ<'sY4뜶|9T~DDtI xGOw܎P+7 no~{fmvF&sw "j"9%Hoہ#[2:m J`mlıj@g-bIA}w)Q:4zGMhbsׇ'}yj _:W(ץ;}xg1M_qy퇐'h8Q`/, {}-K9낯ޭ,Ao*.Gr9.L dg%#"""3<8f3pӍ7 77(7xD7F_\xo}m JW`ll4$KuǡATNØs+*BOGE:]*¢Sbyb$ {9z'6J5`|i1c@"Z2=%)  q Ňh1 7\G-ndgg&yC`%$Hcgx7cX /ៀOBBVBdBQI*Ǫ I_ '8Wg| -&e$c ,6"""E+'+ wh40aM2*8Ʉwi@_O IF pH0XyqG.'/h †IOoVxADDDo* aC»K94>4>V^hiU~>[ a!@7y%E@"ZR7M'Δ6шYjDDDD4|<27p{ = aݎ/!N J4ƻ-*>_痕L){cD0HDK焥բ7pͨ ƿpH TWHh{3Q\T}S]aA=]OO7:ݒͳ(0:2苩 k =MHaLPo_E!U|xϿ9j%Zti-陨>t7 IAwLT߬d1"""3nr gj7 EVvΒͻ6dyp/}4K5R'Aa!cOq==pQѢVhaeؾؾm+Kː`O ޠNDDDDgTfcMq v_d󞐔 #%  3w,pZT_ nv>bȎ|)}Ua/% {i.iőz@b89y/(N_PSy%KӖ`=!C,Qk&X)\a/e hOK9>7#K8Z2'ThA0DQb(1HDDDDDDDD$""""""""a 0bDDDDDDDDD1@"""""""" Q c(1HDDDDDDDD$""""""""a 0bDDKԋC / :`v񛿵`@kğwt,6"CkOC3kh})xp#"""%@"z4Gyx/Llko|_R%7eOӁ=yha{1ԟRbb>.}hس5c w *7^3Xs6<.ZGsÓbhQhIpt˿?񽏤N/8rP/`s"nXoC6-3YbMCh1 mՇp-FEXdnl{]u;*3`isu8?Ibй%-K㩻m+=A%uc/׌=pBp: ~)oC˗[mo܏=ynT}:~JPmoogU K\~M0/نw| Z:$gA;$M}S! 6S+ȗ~Iov#uEdy/n+?O͝pX{ϛΐ:[31vٲV㲛??>Y:u%z_=Mh]0"` .chٿ~y{q-/^w./A[4b]ǍEnK?^ގ|q#lR>.9/ޣ?~p%2Ev6~w( xF/&x ec}/q]jr~ ]cjO3߳ ܜ*"ed<vENqjuUP5uq[,a4rrY6zCDDD Ѽ6]Y|{Mna$R#_g7% 0$j }Yǿ|*?`ӡo3xӅb*7 .6sE=??'_q}}wHX7[~*~OK#A?sޤe>i{q>[ !R-g#I 3Z|yDZ?bHwugXQD*_-{.c8& }n\-9e.=y~?9\l}wpM7wG] ӛS+p6,rBWEм[ޏ".ʥ1h}yauz,+W\Bq; O:ntiq%q}\Ƨro{ ѝ[AC1 >7؅Ӭcc9lS81HDt2pۍ p/@`?$ʋKQsNƚLGQ6R$*,Cr2k7rYTm5;-N4V`M9F4x< O- Ko`ŭw^U9ub5`E~PsEF}k?O[:K! ++43 QD3QQ7rYb\gj1V),E߱эԟ),Df?;r}Vr/_;/[b mCG8ȁp?A`ݍ7cݷ~}ǰam]Ӥ/[bQy~ ՀF/Dxߏ~X`uy#$O&v&5ظ_DZ"kw2S%R0F:E.x0Ím{ŕ^zJyuD8#m(Ӟ깐@" ҏ[7o\ *3rU]Ė݅Ƴ7uNik"l Ɲ3pTn\,Ř͈bk5{ڏil'~/OZkI z.H&̡>jĂ+Ya(Gv)IgTԾF<*XW+6fQq968Lû`h\|rSGbb 12$'N ZmNE<t 96<.~k>.R~b-p,GsCDDD4$%E0$";;15Н?Cšx_+~ <pbj 'J*Ԃw_p%_x͹ mx_bDOVV?u\+NXXop̿$ͽ) 5??sf,sIi6\7j(ʍwo(M37U}2z#յh]`FѪ&@8:\Ĥ21P?.CН+&=*ZJ@X݋!xkIQє?AV m#ҹUØK^L7ݣny?sK'~Ī؈&K(e.BcE@D1CQ~!nK-vZjᡑ<FHEsQ̜eѪ?ڰs_-gr9z1S-HDKw0a3]r{ĹP2qTfi;Ղ"SBeʟhZ&RW3`ߘCRxk}m%<{^T]%B=vwn!Ƶ忏֢}lI3A!o{eUksoؔm:1=4 9> }Z:1,ϡ{ϋx6,&Ƕ?g*Ǝf)j\#TCq [-iվJÇ ӇKs2!~%v~IOb5Ҟچ]Gòu܋ݻlSRPĉ;(=J^rcPXFDDDDp*KiQ2j /A/[RS_}[YDDo3ضns]ԓD M<Ǿy:O|+t/s4~?{9߿"-qk&XKR~R{5"""Ys4ě}o/•xO!ر² jd6\h,\sao(9>LDDD4[6l}xYOȉ*mGzgp`-v|x(>LDDDDDDD 6>ADDDDDDDD$""""""""a 0bDDDDDDDDD1@"""""""" Q c(1HDDDDDDDD$""""""""a 05(BBTXx:JDDDDD; ђV܄AH3&kz7s:W˸ F.N67K VBMD%} Xr܃+Խ  8 OˉvyQ.HO7v$O\CWOL5#iN)I-uFBFfٖ"Cs!9އ17`.܄uصPxs т-)Jpdxx)i+ e=G#.kBFt)ęV$ t q+ۇw?|O2:>.\uqm ^I eªN_[t֙xL p7  x`0S/9h$%G+m4eH 9P N3WV Fs} B&^detӳ uN_˒pwvw`YEߧ {q+尅 }:DDDDKD0vrdM7P}'nYEQޏ#s#NL- ]jH.GI FP_u񭤑F{k.@9`_ 8F3Q\8!L_͛xF "E%ok'p cːi ?{uoחg/YYoH:+ΗFWN]B퍶ǶyDhɾfkN.O.ێяQ'B@fa2lPLy\uMt—f?SzA_N6qC{\ؾm=OXaekћߗ gX?@04M" `$.m+eSw uH.9GNNN{rڸ7*mºNZӚ(Ou9Lc$"!0N =\Ƙ+ʭ\hFMˊ| ΎZTCC(ϥkm| WA0Հ|e̹kQ5Hz[S%:>{*aش g~ z/7n:e9k{ZxyCʧ)(Ị8X{` ]]r.Cy{=͵8 g!"};(RTBIYƪaa^3$&~a.::Q :ND\3V/rFω^VJNSM4q:3FWj L\[74ЈC8H!xtB+[_eLlʼnABL\]4v#By;^Ȋ2 /Jgj1gCDDD 18! 8P;HL@FfՌ:]bCp3!9#P=m; nxOjsX4h߆Ax&a3fqy2ZxjEmr2kACXO7Fj]:/ czt˳#ƦB׻k&@5%6 $$wAӑNdp@iM(f{8؁i.pzH7t?MziP06܍-:P+1[q+mQ,t6tI=j@bQɹ'8r"W7ȍ-aXr8ԇIF`NeTXsH~BΖH*1ٖIIp$+#vt{O48mbwCRQY,$џL$[~R4϶lHIP \fnzL\=r˙3~!"""-hq>#Z rٸ;k)yLQlC|=Q?#h"4ЀkQb+tZEgT!|=r >)LkˍFؗCUKFQ`a76 w*h/šdܽ8TfL(vdZ$&p™ m{'< EH6m}gHkF ՂFzM: g:l2Kx civwa̔8!;ü<,9hD-5g|5L va SMnj!漃}(@ Fp 峸gR`QpbPNhqeDzr908R`;#m&" t4q)0j1 0z{ ,ˋF+z{CMki==r2VGffߊzqqW.ScS$g"YՍc-8Eblv{:3\kYl݄9Z75wL/[̲tر.EGtuwmTnsb9{ђ 6ōxur 9ΣMRِi#&4W,!բo]jnCװ F38Vĥ0[E4գ9>Fu %ށ 6A!i#l8`HEu0RVjkpT2":oN)}F;`LC^.Z4^Ɓ,vE)& CjeL.u6mz5Ny, 9y#MvbϵYH*i)Z쩭X(7, ufV["/_] qȰm`3}0_>ndCAK^g-[_~HO7`06!43o{vL[3}!"""bb8$)bpE冾2{uFAT:)Xf .U(sB0mw)3ꠏOY+(dP7;(奣i8}GrUPk4 E9P}F$Z7^*ԷT:2$L)HJ{R Crſn} {3jkt.4#^ \Y|{aLPB\mNykd)AUjf=XBiK^2EV8VeDTǦ *gd\ )= 61t}}nZ[Jsy@g#8 -XV[PNκl4g~zyH5 3ԩq2)o"1gCDDD4֨$q\%-Kݙ^ʽ&LDDDDDDD 6~LDDDDDDDD$""""""""a 0bDDDDDDDDD1@"""""""" Q c(1HDDDDDDDD$""""""""a 0bDDDDDDDDD1@"""""""" Q c(YDHnq~'"""""ZHjWYDT(ju_VAŗ22l6sмb䆇U*e=G#.kBFt)ęV$ t q3ۇw?|PcZg15.#oM'@3@`4A>ɓzcg(2iL8j'/&O B1T]S/Oz߸Y4g Ҭ0G*}ӦGZنqBb4CǛL\u2ĕc u*zGY?d|CF`3<%nQWW_W> ۲G l4 iV2ZxCZQ9큐SR R H߾ 7⬢x(WǑ 9ᑫޖ,6t«1"1%y6h|B;|=݌4b`^smS%ay՝ Ak=ɈBռjਸ+[l ]kКQT{\'G'/]\xͤd=4vcx /;YX 6hhCr9(Oe!-9zK&K0ٌT;q'p c/=Lmb|$""""٪?$oS+| M.!ZYYg^Cw['F#хn ՋjX˗Eu>4ğ"8ByЩ%u5n?j-rf|sZ}~݁G iYȳSer~%/ {=͵8.e}%Nvt`X(/c`TѤO +Pot9M3;9kQsDAS &9xM9(juN(}`0pGi ʂ Y(-aEbZ223`74]egCp;N4%fzvw4$$h0о m=+jM0 8Ga*؄,:6܃ǑdUB%?v$$(I=nﶢϋʲ HL0LH4テ#^L<"/cLD=>6W[i59_J#3$nD?ft]oעGN8oOBZT?L.+e%x'?5_sc,*W`cj!zXs=55Vۢtq:18ou=ns:iC(<*-DBNޡ> xH #l84taXJe鍈p؈ʂG{9`Dc?=| XE%*C;o/nf { fۊЮ,'#TKNbA__?NivAA\ψzħȯ\d6hJބ":GUpT47m>  P MEDDDDDmFnFH Y+!ƜJM 4SLSÍI!:(3+pڇ: aH  J KRè"DEO4ZagR|Qdi==VB_,͝41& 3oXV4X``PW43psDDDDDm=D{CiWxA@TY1H4Bۀ7gT :6aHeCe8IQejp5otk؈zAk}+RLЈcvE#,fmhφ#piHNڮƁ,vE)& Cj8`Bvc4V+π7oiXV2 ۰|)G2 56'PO@<W`K&6+G}@C@ ӌ@qAh/FH ~* ,[ zafs`Y2!7EK΋F}|"ZA)<Ԅl,Gy(jaQFZ#Mqb-s!H(19PB6Is2rה *~p=BmL@2U>5OiTV"ڀ m[*^[b$Ǹ[`_)ɏ#p>3ul _G!}@37T`Shp9ͩK\"'(!pR^JFR2.:iA[k+Dj} MAQ QhA3P}'nYE)._qW%%N+ZWDh`߅730g&""""mQC\ `m N£מfRC~p\F`Y %@/nDDDDD1/~ 8>" j *GVv h((\۶ D\o0q?!0NGDDDDD6U!Tmo=]]<ۅB"-9 ђ!T8MŎ  NGNn 9-I ((,򽈈(2E@DDDDDDDD$""""""""a 0bDDDDDDDDD1@"""""""" Q c(1HDDDDDDDD$""""""""a 0bDDDDDDDDD1@"""""""" Q c(1HDDDDDDDD$""""""""a 0bEXDDDDDDDDS dddާ0Q c(1HDDDDDDDD$""""""""a 0bDDDDDDDDD1@"""""""" Q c(1HDDDDDDDD$""""""""a 0wM}$MtI-m2 d2*[Y~,EE\(Xd%Ȑ%J)"et%@&9ISxPڜg?93Ȅ1HDDDDDDDDd$""""""""2a 03VKqq1Ξ=#;;d$ @‚FDDDDDDDTSߏdk\/_ɓ'affjJ$"""""""!R('T?*եے**++;FJKKo!!!w>___FwU刻333hڴ):v ҿW$㯌[pjѮ" =9.qɛ <$ '8V7myD'<= c|Sy'"?ZR\ʪ,3~dUj0x$'' .đ#G `̘19r$ڶm̷N:jQ_vکQ:P.Xx:@HIX6i^xeWYr{M냟C0p~Qli.]@v/ƪ31u8-c<㣢s>w2}Pj\gzk2P Ǘ Po!H*w{jQy {Mˠ}1ADD O"eeeaٲe\\\Я_?xzz }YlׯǕ+WŁ5qd+ _MF{ߟ. `7|>woV_??EE=>ԙ,ܼ )q7lDYק_pr.^Y wr@"}_D@Rpݛ<.bı!]|F*;2|,&o 6I-"i p򆷫 |RRq6Vz3452ZMӧl=2 ^nܸq7{VVVo ÇڵkqXBaC5UtrE.݊0#tE3 *?C2Q{yk&3r<걢FlƍCaȇ0 ޝ W\9HIDAu: w<zWR3ޞ?VOl0w` $LCniY!n^9;7`ָ8qFǺ`M䈖g¿P ?~hުDv8È}۳4G2a֔"cs5c@ k֬Q1h =jJ@TmKXT#PƐ!C 'NGLܴ ;;MC:"l?R%Q~'e?E-bmPr8-OCќdzl-6"z oHvSKz9~ח"+ {Du~ *!u\8k#+'ŰK@3<3|$z )r0H *常n.=QX0'(urX}C jc+2l,.d@1P~vaK W|"<@(\۠]#2fbk<ȐrƯJ,NǗbgD54oyu\^X zh{u xLGRf]pm]?}_v~/)Jz/Aac185^h\UW(ǩom9<'M;92$OCw3,HУumE JJ帺-T12 |l{ɍoUUc%? 5/ԻwNYlw9suGp9;b[xƢ^߾"?8rOAzrbG~!2>n}SFo{x=~ kc͞DP/} CjHggώD;G8e(k4Yb;8/)ZwO&c gFrfp^Oik (m'՞w_eJGXxpX^ rW޶{h b P& $wDŽ:1 ˀ܆V.@z4vڅk׮ ?_QQΜ9amDަ2K.a߾}ڭ{|B]\ [ǀhUJ׊iUO_ }r,1%`s=+E阹E/Av([/O gFF|3~I-U;8}^׃ - K_;'WѨY8#I"D|NCܭ iWm$-y7g\j:Ƚ|M-<偋DK8*R֒,Q(*El\;qIʝYY4)p:27iGM{j"s8qJlQVP\"73Y7ԅPj_\t 9eppBH? 3%㯕SΚTA6v(Vփ^@cAyD&:ڷEpO!@L]%YHi5KC@:z2=( oGeIkPgeK}uorlj pV<ܿT֑1ȋp6JAWá-e˘%n%75a_cX6מ"} }s./N1c(r CG,k:i<g wP51l̍TsA%yYa@(8qtbeWΛB)m'|Bg:E!n:F1 9gvb_Uh:ʤgWuAw64m}S𹏈$S=C=t] -X݋ѣGk}*@طo_СC|)e}0#͈Ǽ9nHɊ[@u)Eal1=|ԁ/x6%8Vlܖ?з6/Av\ehʧG!B5n1 :5E}8u/`8WfAh;fEK0Y3qxA׻1+ /Ay fwn*/˼!tU+䔄$Mk H{{szۧ'rpYDCr}2  7o'F 画h:CLV(*/_ ֯ ^*9B̄չ-'|?kAqm519qH @`lU7 MViШQD&kB~ $53mm1?y 4Uy4XɣDj@==bmc|[gQ=`#ǟ@)ɝȦ|N$ENo@_5d> T׫][j0 iHN΄<"m-}BF^$BU =k+Okuay3w򂟟Yh ,k2ʅ潚u۴M+t&ݛ7Oikg3[Ӊ  ض+!f`LOD"mQgL?}CP}_ar}bM>""b'[OSQ_&Mh}_ݺuuа{Xy%hw(EH9yǽ$ wpE`=R*{ `ɆHt%R[Ho L4'Ϳy"h2p 9%A(?Ε*P`ԗfv&TuԗZ UX=N#G38KǢඪȤ >qQ$SRM&Lb8ll;bŽҙF38̳Ⱦw KU+X+,QkRʦ zԹ-+uۇ*^D5[G4tĦTe#HæWgly\(.µ/w Y7UOKt{d<4O>}>-ft\K8zcrN} ZEqwlӇq$.wίA_տ_W F9*/E^Iޓ .ϻBuu5oV+FB{cpMWt -{kk5^ZBR{yFX7^ quS\P&2:+wEPԵ]Vn!mWӱP:ZƒPQ6ʤ#]~:1 I[)dvٳxzzU{"""`ggwwU 4SSS^w=X\G{HJ΁E@Tib89(pUT_j{=4b{D/(^v) =kئ>3IDPԭ5 z /ꂮWsaypj ͔M+k#q SLD6*e#b7r!I[WHYP{<ߣ<>U.l/63+۷%kyMaGSG믛]ݢ%R<)sA}[XDXػ\.3|՞ >ʃ9?|rvE]j#<7E"2ȴ˯bHnN-]͈\cҔHzItO~Z_f<㈳~řr>SmS7sX( GksAƛV>Cvg>24ʔ4~LB?]xZ=i77$?U ߨQ{VJ+++K']7_X D;_.Zuųf{i/V_]-jnDy[3 ?ڇ:CRVh/6X.`/AVa =nm=wUܶ+ZT>B϶c1h=E((@)=[3Qx[˘vhUGC@VX.}2 IN(l_A.AAp)DFA5<ۡO0{u; a)/BIkWk-Т vz~=@wC@0y;u.o 5v/6hpIEy{uA@Weyu 2=>.d֜Ϋ B݀K{Wcm;:DkUgV8~ MbK9/L1> -FF': SZC_ر.!pR l_sD9f )ƭ+!w&SzOU7Vc4}1<%7qur]!_>hwWCb4ZוBG 9I_7XgjxIɺʩsoc-uhav:1d ɻuBj8 H[H#3cKXoUSl.P+ }Xe3@@׉2쫆6ͦڛG@S/Vem/m@x;,]?Ssǀ&xݡrV1.oV :=4 AN~l/;0ky $>hj4=GaBͬ`[2GQ,G^lry Q K@0ܤP=W8R?-_2{vƧkp%ؙtz(S_+HS2GVGSVcm`HԵU]或cfmeX$ҲPd _ nCk<%?RqF.VN[C]N]<)׹-/n >uAub~H-\ꆠI2fByZ>RxG鷆c`!{W;xGs4z% Q弰jB|H9)" eh$Ƀv!\E X*,p ު0c:pp0eb74\Wgbk6[w;Bΰ۱_P [P ;} »tU(5﫵ݯUu_~+ 7c2 $B2P7DDT0*g-f꣱{zrQ񾚤';f~}ԩ{u|嗰IBsDŽ~Cgo|nX ?{/D 8whQReQ}ʢ@_VeQڡ0x! *UW?8(|,G\V8Հe uNDDDDDD5I'FIM~y%(̓q}_Ø-ZXDDDDDDxctT_\PPggGf~~ݴ1!i'YD 8U* ]?lZ2_z/S8]7u)6 ۖ@&..bɸ|rsEZɟ6cwj^u&'24iUc{.`o!H*~|)9E9l;CE>cC(|I&‘-[p vQخfa?ŌU@BYf?a >VVVZ3uT(**ƍ},KƏ>_"u Sk?ŢSu1h D8%uav7l?"""""z @C͛7vZƻM&y-m۶pz2)|:qЫy6@D"""""" @Y0h ,\.\ŋѿhXf .]ggg 0@xş/Q_kb"N%r["8Ġې\9/OCSQdm Satz%ď@xrJVN\Es_# jSL*fO"spÆ[&M$n H)k=?Ku*M[k =+R'Ď;ߟ7meдv"״mC i,7"5f^h6x*&vSM]J%r\lfC|O~>kqp<9z9(5<tDR$'rPj㍘^zp؉Qxgt2/_pC`^7𧻓uGp9[>h0׷C!siְm-?@2&eʕ+;U_~4h{W\g:88bDp 낗' p#q#]Ť$evh<ŽkbtΘᑖW׊iUO_ }r,1%`sC,LW 7sֱÀ^Qpeň(_b$/AaS05'.YpR}W%"ut"C`;ȃE.RALY$ގ*tR6mxk1pyq>qe9UXZ_"wz SSNSk8}` HS%X} z^ĭf&k 0&ǖ"}z.0ȓU!n:F1 9gvb_HO<ԃyIZPGx!P*pmk5["""""bU@SKv322ߪlWu@!rrrO>}w???<6Dow~ 3d-C+;N(k퇲o` Kx~>Qo"p;Mlڔޓ Gs'/e<?"bѺiE#ؤ8w9;nѨ?⬥pljO&UBGq[eyz[bDS{İk&Qy/ 5lC^k[SؠaHAǨ!'|ZO{e>•Rm+W a/bD#@L#| ׽}mc yQjUGƶ]94czzTe-v-sU(4iXNFM6G a%hmyM떈$.{,233+:i[V?e8ʐyx l8K7Q" R-q:DZ9yǽ3$ wpEG\:^#Gn+q濌~ OAV.MՓIsR*W`̀r zӒtA?5ɗY}6]ѭ{'t0DGW%8:CT_Gta:o,-cKh=ծ:T~.EgÙq#6%*۰9$!:ZMVuKDDDDD $ ڴiƍc׮]8u:w'㙙=kNX0{6 Ǹ(~?tQ!D B@JURjW"R&&r:{O9Փܷ1K', m(G/?zNMN7c:h:f> (hƬ=2=Vd" mH_}liGŐ~r]5lX=V!@_Ыm(Q5qVՔ-zΝ;;QsX( WUu&V]ãց, TULB,QP9ewb  z>dY³ְ='~ř>63b k-M(5^ ˓B&[x y&RRn/!sHmmQ"""""𰁌QQQ$bv ~ r}1 K`Yz*l b~ms/v-ǺxfT4.JGޝAzl E6ruX34"X6~O%/c}7HK`-u[3 ?ڇ:CRVh pU ;_B/@glw_MIr<2 ;{O5BG{j k:Ɩz5^ -mM|1e,Ƌ|8W'GXn6^inC9D2jVNLu;#و=@29~?ݰ3Bnf['oxVDm1{j%vpmg A;Q@x;,]?Ssǀ&xݡr; NƸXv~/CjVt7d.1CЪjP:!JiWfbbڹ*Rq/E;<vEc7}|T^}i @ 6?{h_k֚Ks_>a}qDDD&@29^,;e Tl_T_+QjAn&p!ow޲|:qЫy61R!H@߰j||bㇹ!Q]An>da/`F敳8sfۉg`t"G> ugOȱJLdojun#ΙqFDDDzcL0?uqi BvNÕ̃8'!Ҳ  ?wˑgFrfphgDPvP~ kc͞DP/} C`-5GӑbX aP:_ӻRmı f ҳP*uBO1m֌=?—C!QTBM=d<=|si+ʜz< :#魪P&-$m˶Y97OB;XTs?_:N >; CXg1|P?<̔hݩ#?R6nj`ޭ W :W )~ۇi9(FLQxo8Dz֙*d,{gv:f:}o,7"5f^h6x*&vQy":M}&>)^0:2>Y^WiJW-'ۭ-p'e?E-bmPr~8`3e =KS~j8m]}àf N5uBS^FK]蜥e_19~93R:c܁T^v2_?,y;gՅx3~2}7)K' s +0pn2wktye_+w%m @NqV~KDDD = "zv uRvr8Oa8@(,e[ѝ `, QN]ud>[~/aA_E†%K+'8}/ ?tkK'G s&oGNw^uNoa3~+o 0wJ*mE:s _@=e$wLH]9 6iQŵ}+[@Pǰ.xybo877!>[LjA^'aW +3;ꎭcW׃9h9SC0y.S%X} z^ĭf&k 0ӫec.TVK9 'ge9 ?>)<;I}`|Uaf>k4*S'`/k9͘gc`^͠o moߌ71VwXRwоz+1g#$2 "5_@Gdl~rRΡigΝI"E[`iQU1s -^|Pv#f5ۄ ۵*ğMǜh?p"F!N(oJDD # bߩȒG[qDwL:+b`H}H\^J zhݴ86i7]~`h4#80h5G!qO4V? .[ipoYG6Ek3Owr4&6(Bگ!D{~~wSD7SGENT$#lH}@nXlږ゚a ED{ݎc4k`) kZdT20xm<8{!F?/] $Kp4lp^= T L#|A[Au&/G|f3L` W^Rї;dBFH ҳlI}ҿ{??ϻ(8M?^B1/x6%8RNcb`&B~MdjrmujyIx_^sf_19ӺAC`RJ%7O'#$/otJ._(8D} ` )7TFmB;mrv d Q[<35OqQm}"""bY!~ )~q/7+ꠁ, A0; `t'|`T uW@v<.󻇺`q=^+c*J#c;X>%r+ei1u I8SjR&٥T/vEFuL&e<K6@ʥ(Bz[qz4O>}>-ft\K8Jx4ή"r688]XXY!u&_cn~2͜wwECo εn;E$5(>ksH+qEH{J<UG,NU?<"MOHyVyIx_^ǵ1f +2gI"l>qe>`i/*=S<ic$F۬睐ʮ\rWs4Wo@Gy(sp:p%1Zݸ.X]'At,d=ay7Z$++*xxZ:)Y%M48$r07OG m ypS=yUXhjrź+O߄ٳAe8 Ge<--7Էy[P tՒT]$~"3H@iq')P|X9[Aj*1݅\AD<Կ+יq۾^F3!Mu*949 ?nތy7b\0U2*s*>Cӆz&tUK9FoMay53`æ5}%}]9KvI_19STaΣ6x`uj-B;cHwkZJ`Q(hEzSvqrNT(^5["""zlYd$шtéC"ĶV\dm*p䗍8x*Q#pW_\]>wo;Dk-Na]ؓ CLX8mvIđKx"Y^ld<*M?tE8~ DE"D dZV*]˷#ݺ :t/ r JSN v]0ɣLsx7F|4ggEl4M8_qF-v*Jzo QyaA}w=X\G{]ERr,`ɫr#FG4䵦6{;ΰ:5h^I̙bxhGw$:4DC4CbpmfkW|9&2#itlb>FK(7r}>8㑈<LgY~e{aVĝШ}KXNߌus3DymJ^@nd##څZ@f>\PEE>^mرf7\Z^B aǺXJK'} 4uw*@ҩS0/[WBo;:M4CQXs!>\U+^Fv0 0cN߾ "Ңҩ~t>GbH_t։v!\E X* k63v8SQ!'aƔuKV anhm1gbk鸥x-/` ,]r+ŠC7Z12``'iSg*!c܀Kll:[i8gLb z0>PG%;`9@3C$6ΘQ!4w)V~x֞Vau:p*޵K\1 {w(T`y^N#7x󈶼ƞjTZڰ:o^ҞwOvE_ybj#VhӡVV_yD\2u@{qVh ?}YK qAW5>mncؾV@.WZP볺qdxTrY5:?Pky*Ƣ>G}{o1S[TGwec CJ໱ xQV*k1qND cP?0c>ow#v:n,٧BӒbY[AGqÇGOOBRxz+G]]_Ծ5-뵥ԴlԖrӒQm, @~<},N:UlVӧqX^^);WCLƅ ?>{v~,%'W݋JgΜ_,>ٳ`ɮB~u_Pe'N/ &bnn~ݞݻqڵXYYHNc,d` .x8|𮟓]-ի_ m+O ۾l=9Uc͇lu#rž8x'r'}ϏSXod܊?V ħ#qǧ|WL١s٦}\鹅Xf% 3z(>,jT:bاqHw{:Kus`"i|<}z?_ɾg3~Qi?~K+(:wh">>}: wFi?ݼc">G^ jx.{xrF\z1J'z˭g.j,ܻ?SCm^ive5$=%{ncbqOz!bt>9rpw6wţ+=1qls+O|%10/_ah{KQ(EZ}YT|4W[.;m|}#qZzs3}1qd2Ʋ7_b~~9#};d]Յog#w\`tΥob@|/b={+.u+N.~PJm+)ׇ Kj?s5|?oyUn%o!ŕ+#)sbGom6 \xl&CgHǤBvF=({0ϗjQ߯:QyY,TGCq kUbszǎٱUy^<=>3XYZJnsPnmzg=06J/[n_OE z:bp;ա,j/Cػ){H\薖bhhfᯡh'NǑb)&5S.\TK|9݌gNġȗWcq7|@Uoǝ{up RsqI5Okk,FE]Ɂy5`1be!wm;lk}{uzch n1+9 kWcLMPWҏcyo>3D|q_7]ǩX_{b;7oqK1?~ݽ}}}H{Jpܿ ^{o'T-G,Brcu=Su:b㷝ƽ :b`LL~qZ|Jev#B;bbx83WWJQgp<]8/t1}T_gx4;(67]gg<}>\7(Ş8pr(w1nw]eW+p.N|o ]65|_նO8>\xm;[O>^?®,(x^БÇbzz:J« ĉ?8 =,n%P\~=*'{gld`?裏PǕ+Wbccბ߳}>"* ǣ'._sB;={glWމ>nܸ~tww1$eee~륥{S}'LCbnn..]Tm $6zfjLNNѣGwFީ,LNND}Գg'J9ժDۼs|twwE___*WwM 9ѲCx{  a`/%?H \`'[5]!`ڃ v'de0( N`'u90ںT L`;B/50Yv6'uP h B`٠4}u0-)mLl٠ N36!6Kc&`Y?h[-!T5FkK)mDl_ovyv!PkCjտ[[C4}䛖Br),-Ku7^ h|>rlhYJ-Kr˲Y~ ~P7kĻky^vsl^Z_/(9F֫;`{0Zvs,ͳ0ײ Z;A5~`v]6#bP7?f7f^3uF_p}w ș\ˀnZny^d=@4nwmGLk`7d`6k+@{u|(pklͷm6OkS`{ڸ@n v1p`{0Zv#Ux|k_[kujMnw;s[ :gn5͠l ~fw/Wn!k|?h:l]ڜ~x`l}zƟ*nm{NlYl}? } suІM~[o'@{nsv)0١[iƟm{ڐؾ8 0[P}ßw6y-|X^7imJLg^sP>?a A lCHh0MT.o@@H  a $ 0^/j֪IENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-view-curves-thumb.png0000644000076500000000000004515113242301265027105 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<J IDATxyp$&ewP&:f,ͥqn<; k됴c"OÒ#f7ء$vƒH(RIQ$'ݸ },f7 tM_}=4Ml:X`ٍZ-\vMw`^$ sgNv ~$?vwr20]nВ.oqӴ5t=Fom׽~fHVr•}_ٟ`n8rt:px؀G(BA(F\J-ukwoʔFA %|{ Ɨ/.Ϳ7&7z|Qwնk#bh JϏxPpǖx$JO^:<ĹyGc1ys(E0wsn >ru}_V[cINocs6AHB8}Q5%R ӓY.nwylv ZxGg&Y]E[n4n`aaM9>DZ&.GѲZ`M Gac"bA\_R)_/q>fWtۃZ)0X'L!K`8F>_/BSS",u@1EXGPjܖ96/a`8t 9buP7<}xs tet&J:F.ivt|ׂY~K4>0:wm]346nz1BydeL^ :EZj&Z7ڮ6 L0f fƹ$k#5<ɩy(L, ]}dbup~w~ύhc*QMxPG8±y>\B+%m0~1}΢2v.1xa1Z`<|A.b#uuC*gxuH(~O`fa8ۮX~4濊Ko矿2}l/L,KF!` >{?sק87Zl qJ翉spQ(wʶh"/={;_F[AFFPVQ7Hh}MN:Z('32ⓟ}o/t G 8V?=RZ /r?ћ0|HG\Dz aXȃSQrqm W>Xg>2 }y9>{sƁFIjpȷ̌}d>FWs>i\n՘WhM'Q7}tEҒaz}:1j2wm`wQ,DL4H<,C8p2f%7 lVOy_cam2z%/|gXCK-JYu_!| k꧄> XA\^PX.NLPu"X̷04B:w\@tᑙ$q g+yynQwq[kMcT._F8Dkz'LRzj9{|>t V2kH qxjzJI ۔cM>?fB""3DX"ɹrXŌ7{\d D1 ¼0^~ 8uqTB?XL3(˪-FIؼ#1پI"@]-B/x邨ۆü4cxJ 3C!t:7^"p#aqG'cⷞ~zO3E0([!jѦf/ 1ًt}Hm6v>a9VrWk96[ɠ񡳲 B`T6U!6L`}mhHa>f\Z.obJ dRx5$D(7wTMDc dIol*/LѐɁJ0Dmx{n3j=RA۷%t(ӽk ո%qW|.,a X˾wYԶ $2ڰL~aSa%جPTs &KHD$'>I(JF|8&&R!!\M[̶ZWAdUa~\V xzpyxP3zAL: VcA k-j4[4BŒ>L,ѼrW?U 0F4DJuuˊ}Z/74z5m4& q"%yѶL d-3b Ecpŕ 1%\ Մ CUE|rS.]D ]EcϿ N=zJI Z膮-nXΡm}IwyGŊdAL7_/lKpv+-FDN<3x[o?ហw$'z'. (ͳ꘷E6 Yt3E;Dy/9vao̭ayeUJꌓ!mgd7H$4DGzU*2rc#_*='?~XZZ¡Chj_FΝ;Y}ĉ8uv0y饗-x<&vx囯a\ 9oajOysTo07˟>!@jʉ :XOƝZ٨㝟dt}v\ǎ\zU-l Bzh,8Ʉ 'Ѹ%&e H}Vs ܢ"`rO~Pu ˾6HߕlbB\Ւ]1A6<>( WUmt`:j"~hni݇ ۨ[-r)I 7?PYw $@cg)MiۻN #?sv[Zq\Cͅ٫8B׿ B&իWqe˯ &.j.ܦ<ˆGZ NGXDrZ,B[]z9 <C#emq0b!-LA(<`WGߓuήoܒ+~nDZmSN|we܆YϰfXNjcЃy-tej Y\^m/͈%UK6߲?"A`I%Ņ^K륞q)jkq̾W m&&HsxX}.x52S~Gc}0J3kV|/gN?.1 Yw :k&AfkJ܆BA\}9FFF~4,;r gۤ]ieoa?;`v?mosHމt]ym"&M H a1 HD c~n^IOگZak X|~sÍ/#|W)?C`0uqZfGSO=DZA ӿ, 0EWK<+ vu{ ]xh cX,h|lyMqY7gSTSqO᏾>t 2bo+f37<66r82%\aW_}E ؒ';ğ41 4f<=)sVת5 E{iVkRc~c_!XӪxRQ\v}U5 {Q 9|ńHŅ8Q}]0eB"Zo )*Ab*em]vLMߣ(*x㭟[ڨ2PG@t>FU* UQMINh޼Yf~v- ^ S~nm?\GS ˋ py|P(*qΈ mXњyE[u+^1+=e ګwbA(kLN3Oۯwjk?9ojJw7k ^1^i(lu[Ɔms?.FCa%1 m<6Ȧq5,^.d ^D,iҢBƷ mut#nK?D.2sg &_.xG/bnQ% Z0鹓ļY37/";+V5 "sEd澏Ĺ6ߖ{Zk0%i7Mef]̺{Ul*n&(s0ff/¼<'7s5%wijeٹ#8w ng$sV-ulX3{pmjBynpk3HiW~͍L??ш^'"x,%?cvbMXg7vir?U \t(BK/;%6H%8u{ :o[Pz_XَG?^xmqcQO?LާsK}Y*x'Tݎ!zv5;a`ZXj|cWM,g8cBU=hb}[=n9HBmӒ&3HPji+'bne'\9A;He~1bZ ðGC3xz{oΗοw/)=k}>BPjjͮV]jQC7~㓚Nf=aX;15h8*<~ud[=h6C1Y!hc&WH7 F4I \93anrFo>ፕ%fwd| =s!y-a۞`Xݾǽ{ CO:\EtL0JVý:hg~bx<~ϘcOdglN5ێji4 5w.a 4ݴƹmXDGUhǶ.V9ք"yusR'k2E9ڶgCe{2Bv*蠙c b= ²H8th,͉01HV.-fX$ ],VҲ#!? Ar(FbFÑ]okely+Ww;qT(kFlx-D!DXf$^3ם{H3?=s}^ɛ`ŪCd{5q6JŅE{dRfg9s |MjǒLf f8z.Z\Nv<~kSGū0Z E"L 5*>3sΞEPud"~7MM>veC=^fd2cZ)i<tZp[X=\@і:D ZYCÄ wLfuSCk5=8jH c}SBI6=8e [6?a΁RDqY.KX"E+9O- a j^Q)Јʪ`p4WZU|d\> >eǏ!%L~܂hhjn35')"L_mE0kDJ֍`@qx}V׎LCapm)NjD&'ցYu}BCh:H/2&jJhC꟰ iX՚4%.9\"23X؛L~THC4e>[״й'|jQQ ߭ۧLdMLG "Z<cBܯ̱' ‡ʑNuq\x_&^ɂ?y/XǮ= )DwO;}ӎ rYf?DhmW3Jo vv~;Lwd8mLP򭮷iG{_ܾk;pĽjDFGG{?M_K|j#! [1DJ +6sAXIKP0c$be=N~ˏXkZa1h2*d& eXQ~sλNbDg snC],d'xt' B3c#+E\SG9\$!ʼng7ZT a b8|h:M1\dV8/ցs|._}!,ax23S nٺT֛o`yaxeH~w+k9 Ys~9MOM`vw 2ٌ<RmMs9!s-~̷]ggN6%ik3Vبv`!]%[p\ڄ8f->dD[[akeu x WGUũ9kEwQۡ[֔`,yiwƴ)DF{}"pš72@FLeg (MǔSӘ6du76:5Ͷ1l4<2bg4¡C37lWel]ӣOn~061e=Xoo3A:NW7pzܾ7$Z;;0S̶hFǼ{dngwnD6߯!tڂy2Ǿ߇0 ֟|d؝՞W~{ c bXifKCv I?j /t6>3!!;Iح,o+Zcn}w`sNeu_;CQ} BfFY/Xdzb&%J~ΟJ.&eͩu#mլ\j)>0;3,=М2C:…=m' L:qx4ٸ$(NJ^X Xs+iZ C}E2snZTZMh`JJD v\t]a10]KJF{=p~ǟcK⾘!B9NhߡMZyf `9vA>H1i 1Ǯ3+,?m2-f~ͪ=a/FuS1̮;H>̡ks`R<\d}D\i"%ϱ ҿinnN{-imCbFѭġR.k2P?hhҏ5#BzZ6 jvZ.bCDza>rgsnv`a}iD_yϕJ%-$譯߾v#VoZ#5?;0OU,ok`s,-ܮ^[fWpڒ6m`z,Efu!lZdU5x6"Hax0. w] al8.MS5!Hi0=j!W#, |XX\SX~\@Siawj0 e,e8y(.]xWECa;DЅwSG/vdI z061V([vY #a/b!TEbo7ئ5R-EPV_/"侮/hu&} ṋVv~hhkGONa;$6N(p5QyFH /kA!s0Yْϓ8h{΃ YRIM[[rs;66|C#cJ:GQF'Sg)wچG'Zzft#e>rDxh/VE-=ftW<նz›9r6˵nNi2qad=c6`c B6lvvV&ܮ]j6/o Juy`lvFb811( !JZbv1[.ُ'z . [b!VִZÚt m v{PSkrS60>5-&uV_.lj)i>Was;b4 2( 4/!$ڱC}d5(¹Ys?D¢=<!,,m'"ŌxRéǞOf}ǰ9AfmN#v;tJji!Gn$:v;M c$A@NoyPb$АfbĿhz98 |֪3CEf-Qb9p-I%Nu$+LĆk5089 ?RDRO(VjzyRCLL S#umE߄ڶۉ+n>1ش*mS#EQ1brֱW3s!şFvɄ4,l&}c '-nxh/p/kglSe0NԝQ'-MvΥk7xkq<̱ !Y.(%Ʀo`5r)Yb[y'=cEU(ZKKKɭg, oӤ#ct'&t=v=ϗF+Z ,dF*_{]øǎL+*h&iͰmYU5229`M6gj'2iWh>6qc`jwqd`zX[4tЌZu 4r# !#kVGBN=BODI5^7b$ k0w5y._ȱ\4M-ՊC3G5#(0mհx d-`nN>zBCWg#T{>n$|E8>M2ϗ 縙a>2&M132wLCXU!ecڀٳ5N<)s];iE1dSc Ҏζ#r*7;[bbRɴO0{ ɐg^ r֬ ZēO#ZU'8D Y6(}$rqCI8na7ZU){P=&!2}#ϖqmL< Dh3fkg$N/Zm):)/kXR T?hB~4޲ C&oOC65N7%/!Pֲr˸rmѲ%|miņ6b3H߉aa5 !c)ogj=,[d̺Nܒu ݷy5S ޴D&S6Ctxل8]iI2;"l"n`@^|'Yje1_+bֺvȜࠚ.ۧwAtʹ N=4FN$[&(G)@3iftV?8`8G&T+1-sXW1.}L:̿tcm>,z/3fH=iٯݷ6DlgmU󏖑j{y4DIp^8쬝tu}u;ùZT_j{Y{J;աGb 63y'}=9So˧{* RGb66g 1U7#;:Ո5%lv;9T)pfAu8Rw hwz޽yȈ =v{g+@f?:.cqeMf]AyLfV6tGsHB"l7at zXTԀJ1_A2YYF8dClNǨ  5l`ڪHt^@ďլfYS{|E(W^;'LlɆw:2%eBFr0U(*"'Qɭa%vې`?Ds[f}C^N83슩a)^E 0o/7gQvl E@lagS$Os:߾Bh 'O=|JFDRF5E{TNg;0e2@@YAqXc*-RihHOs͸ ;2Z D2N/Gb=ap [﮷kDf.˥Q\0C_Bt!W0Q{0X0pTKU>GgEd,(9Ͷ^/:'EcVo Dz11l% 'T"a͗tmn |0]g.^_IkT7_*HTSguYmY<nbUqb* ՆSFK$-ksW15sK G^]`9|x/\X*ziDԴf';;LB*Qxj šɻ{w3:A6E=DύڛG֬laͽ/ZY͈UҒ Lmp]M pk wiuE\zEX7'OF.[mk xS5-5%˚P{aa#c(dWPmu"L4W!~Cc_FR̠R18Cy99(zaH8G·?axl9PL&Ĥ8]d("}y" o3ÂQ:\Ti]a*ghZ ݎ$ >LAǶW->HzvC7}vn{i͝&on;}#DžEO& DҖ ؠ4Թ[G%`9Zk*~0Us>ó{zPڀC}hڝY701:Njp|$&vYhhO񁊀miL2,w;aכ'q߽[ 4UIjc =>K$*xdMjEFGwkObvZot9> 7l?Pǚ\`Ӎ ۛImpq@;Br%Z tY)6wjB0r|2J:u 0 gNG{BO,AO_~ęc_FqU>>+8#¤MQ+ G>,OXkf?iݚwyMX\4 f|Je l5v e :u~EMdBlĨ<gP:kY4c8l MVb9g1aGtp& l'+pkVܵw36@kw^ǾT*;;o}[VpU"]B8K3a[N q6eh3+"Х֒>QM,e75mEErI5C锶FHZYX&ت3F2lop{׈xƚm Mvv2^9ѾDA<cVQXJD1ph[Ax8aphXK)SatlFa]JIne]?6kve ɀb8 8<}+K be`U(*~?.q!+af2|Uwd| ZY"d#,zqyE%!9 .-.#+j͑d~6>u9zQ:l5y^G/))!Di84}Dw7Ag-k6H3- ص|E[^ojfXͧ塶M7NY,2t*<JwЇFةGl탳зaGFl!`ynoTj2 P*!bR@㱰<%t`1 +_*`,=X[x,ö9jDT0HBR)sSk)H v'SV{'j0BJ⛖Dҧ#3sۢT!ytϟ;L:UJH,[X)qE EU$$ ;%s gtdu_Ovd!+ECeKnoTEf%mCҹl>ԗ9!)fdVIO\6cdleu|']]~'?eyMs*imhZ$;Hkeo KZTu4ZPD =:hԮ{ Ie-ъUck8f߷9wh&ldV՟pL,'+FݭJN7 9ȻǕ-~6C.sѯT%>aGڨ} 7T%F Y3ܢ~N:/˽ރywҥ_{N5wovU;^tݽY=+Ml6o [1q1-[-8YmgM,IxдCÌcX{7q^ >h_w@NlhFt8ĆVlwd-3pupo:->VMH8fؾ1x >A=l1A9aE2 *V_5⡐G.W#nm`%`ju- foWV5J{c]Z{pj"t{'ہكZ3~"?+_ /aUx\U'1$W& OqenB4_ ~C863aMz½da?O}|AT9;mݒmv퇭ƾ``{_8!$vIENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-GNOME-view-curves.png0000644000076500000000000047625713242301265026007 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<|QIDATxgfwPD&ƨFǒhi&j&_,K,4"p;8m̖;t6Nߙ}_A4Qn rDDDDDDDDD9@"""""""" Qc(1HDDDDDDDD$""""""""a 0rDDDDDDDDD9@"""""""" Qc(1HDDDDDDDD$""""""""a 0r 7QHu{DM c0 ]f0g3 c0 ]<2HDDDDDDshύAHy?5sSfp!s|"""""""=lC3!c| tNvƃY'$! 47 !SSFc/l1G6d{' bii)&.VY rEQ!GV\wv"RN@>̕  f'e^#?ϝ/"dYDDDDDDD#Eh` bD0-g⑜N=Aۑo| Gz,#j8 M=K}p[Hjrd TJED"2 8"!/;KyL9ܓ3STDDDDDDDƈmBj sGjiA@n BE(JpحpfD/TFAj9g' @4/446#bj"ۯ#g[XPՀe,(,bzIg$틾Qg~ԌU{g^QQ_#!`itВ|)C"_`/!c}>خh~p 8!;7$A>M>;ɶK7`@0>;q^ކ{w1-Ļꎢ -eY?MYFODްߋⓈ . =+se܆{щ*}r0dxʊf: WC<{#0m[jPT$e-oܸ0`ҕ`(>;2ZjR`a%V N>|*S 3s+VD<nPukA'Gꔨhk 5ADV̼w]/,T"j<[hФb6Y`JBgVNj+JmP#njًZQTס~ҽq樗GDDtl(hmam책<,#o۱v "/Jἡ0H.ĄmP{#{MI3f)0'Bhޅ +ᵅ;ăJ51#~?Uh:ƅf?{7}?2/DDDCvQjnFc@gX<7V mu /$} lD[d/z h  \PnKpxh)oƜ7/mf@5^3fdw,W8mΘgmHBg YDDDt^d<}1 ØT`ߔV;qE7Z3jPrRT`uk65Y^iI nfe*)-FcCA;YhiYKz2*vs~b8s {WAgUv2o8+-;!專Ve>,/^NkW\Zr FfA2#"":'6o>]2-{O//FS;.)v5{/Bi_AT+SFaS/Ђfͅ'oޏ7vb7OjEZCf{&oqk* OP݁'A{Nz!jQl#xryu*#Pka.SBN= [_틟}:_}{TZ$"":qm 9`VHl"Xoԯ99mЋHkr:;h4An0<""cx͞&HpTlމȌ8ˡa{(cRF_7Cw+\y^8N7z ǨkMѽbb$_&*;z>}hP݇uxa5kl.8h bycD++dw2.8yDDD'Z܀r=@x0Ɋ~ǞudUZ;sMfǸR B{~~ Y#[܀r=@ gHxUIֶ1!׷b#?mE~YF\y}}=<^acm]]n0<""cxN߂z/c=?õCa" Os4QrI?BVDS!NY)\Qw漽MR ^wa,hGX1:b\Aކaw؁ X-ѣloK!h-5'`D8"}kђD UX|9V {uԌjbt ] r""c7`93fՊՁ(W)Qoo;j,6!b^ykl.K\&-/?SUwNA[v]$g+ySB"9EUd4|o7])hmQ UaōMĠA#Q_Zr CVSa؊Ff8Z4.oڇ_iO%=زn;Z,.L6^QCxJ|r,{*R+=g$FojOagr""c7&p#Ȇ!֌qo`vJ=F} ?J12m\ĥNzЃgx\,3Q^Y^(VyMML#"":vTZh0j-$IYi!$"^Z-A5<-YD lw<vLw{?`;u[B/ ,sm !+wapCA5xO2~i(y x.jXS#s@0pT'@p9P~DwmNza46?@:}x*ښdkCW?""cv3~Ӱ>Dg4T6f2f{6p:x5oSZukvbZt9f(o~Av9_55|#"":v=ܥS۶[ElYvےeŘAc<( r=@LDDDDDDD0f!(\DDDDDDDD==DDDDDDDD=U@DDDDDDDD$""""""""a 0Ȳ?2m3@oDSsٛaz}vUUD \?ۖ^{hTFSSs}GwGLJS&cLt<|!D(sQ`Hp:l.'w0z>Ei˧ejkܡ)rmVXIxvC[[~ DIj゠DDDDDDD`O'pmD[{Q,C4cc7k9|1CʼCؽy%|e, rv0if= |;H2h/z"n#W/NZ<峳}5:<䌛q۬ X-tׇ\=DDDDDDtP IR{~ n坘...]@TBQTX$ n 6(YK;v7CŸۿ9c3<> !e U{σK[]MDɹk6.Q?66s::j9nT6#c;5ϘOcY| #kήn{,hX!fHDKv_>w$ٌ5'1nX}#XbwЧGU30lQ7?7o6%2^|F0Ղ W߆gL|qZXY7OE>8B5xǢ٬n笛kNð}j|/:03 ew`;2uVƖծ3\A88AQvwq PAiދ}a"nA׽bїSĘ˾/>CJЂ_?b~ɸ홠rHe3Cb/nU]O?;/i(+pgUbU`X A1HqZZHunbB!`?ƏϬ<70nBmD/ ֈ@J™bыpͯgܓXʃG9<>Dl%qNS@/ߏWOaሆ_1Tg窭(= x]'xrcQ1RsΛP/^3?_=u ?D_A^psugЍJ'.Gr~=6A߆/n܊ aCgߍcՋObή ޓpmgbd>a!5^^o """""" {$k'_U/'?~;}"QՏ݅H*#ÜTknBtX1UzhB6m wdM@f# XQ̚^Yfp ze="M/g6oM"r8y< mhFPtTj=zZw9`;˕PplZm hj0q:Ykc%o6R!3֮?j`ҳoïKMDDDDDD;H2ϟ%Q8҄: W t8P?w$!ZT}V3qp(bm!95Q9:+74 C L*Az|TĪ|JB-mluT[,jkp@[up/İʪVx|GÆnsa,/.R7 14[[iianا#?^)(!> _y 'xgȪDDDDDDm Im;ʪ6уdt5cԀp尃Rk-%1򭐜u^1&AFiB$ACA e -SS4 Eul>͸}Rׯl#3χ\z9 Ѳ pfB~ _ըo| Sy׽¬ r.Nb~-|u<l.{W萈\t(D B݃Qa Tًʪ=V mi0oI= ZnW[yӺ 6iscրcG { E( 78mmӵW"\1c{(͇ c ؎;q0okkB͆x᮹~&33's۶ӈ Ѩ k!'lϿ ;}iNkSa]>F 0 GX-CX_Ѩ>]=w|9 j2<۹Xfҡ0Z4ۂqUԹk!bj(Ř!y-_b󰢢J^zL?4ŏkB]XBiW˰^DqX"Ƕ]Q\~5QviE4~5ҧknœyvϝYbeAzCј9N@eU#"b44!(JGetg3EH߶+Ѹ(-7G hܱ{O> +Ѥ%IJ.V}1 W*(; gyX:p:|swA-فAэGx0C0k! fQ9\ NqЄ_} Srnh~Z*<_~t hîbӺ4܏ /g;׸!Q ]>d~CF>QcC}1rh(;<@uN2Yg[O򉈈)'(*7CIBѧtODDDDDDt4n™#W&""""""OUsU@DDDDDDDD$""""""""al """""""ԒSr3rDDDDDDDDD9@"""""""" Qc(q5~<[Մ&y>! "pB}Vŏ{5,6}ԴP2yml Av<*F^<CF 5bhh 'wc> m!с[AΙ4^9I)G5=Q*UF'@0a l  GYETs/2$N*a 1NN+G |-A?1?/`$"O>7-,3QExo*T!2<YFAQY35bs{lt8Y(3NjP4uii53D/ J,"&։QDDDDDDDtL0"A%RO}uc_QqAy1e9d3DX%n3'SȾ2Tl]T?'cWSA5+{t@;@D'F ӆ łjbrƤ7r"u;*P}k.trzp̖SQ/[ .qYK0bSEwW7kᏸΜ8J ?#OLr<`'-?ڍijBp?Um7fq`OpDO e{OBu{͝.&pZD\TؼxxA<}(. rayA,PR~2>ٽ4Ev XEI(rQc%&;Yb8?ފ]R!3~F_"Qm"""""""C 7s7t# S_> +"4pr :ip{c5Vb%h,zT,ݿD^?QOͻ6(3/nj"FfҾFjvFXUDϬ+Q4x*SL0GDDDDDDD=x(Q(S}BgK)ڨMawZ0sv =̹%KWcGGWNx{XNlFB_t`ј6h`xЬ4j-7|})DuH?%GorŗY#""":lW!t1跼=F4؞Ŕ`_Z_J/uxТ5,"f\6"oa۶nmiLBЬ!;lGv-~́q`lI"Z{.Q׌5 Hv(>ع6~ 5 Gc̬??!^f'z'L`8Nv[ d>ftƑxRCa⏒!} ?e> >cD!?oŜ kᴫǣW lOk<\RʽZT'p@QrƲRHJt >-uD/1]&梁1/U GC<9 'ɋ늝BWm!ZI 02I<7b{[A0v`1J/;Y.w 7eP] Gf3{j𛈆.@u~fKq阑[%ԇ@TłO큿}S*?-{ДYDDDD] ]: ]+u>D ~:h=G8Kx~` wb]=ƟR_tQ762DzGէ0Q#2\BC1߰dZ<j͘nԵWlfF!*5rx.QwӁf_1-_8ӃfO&&cFRe'hVq(0G遰\!ֺ~ M;8aģC``fPPg ق#^73W|8N> =f%b1aXFes=ۃ ~nw؉8,Q/Q똳ر*헨7'Lt0돈)2+""#<0%Sٲ5?!=B?Ah65cf_fY2,qUՀ-"n^ +9E:NhԔ7U*Ѧ 8 pI0A?-hCH[VYk>F-_U~D_85'ѡKuɗKKT6XGi?6=%eK@uXĔOG3}g[Mu~4k~A?Q]F3*kx}~ `PJ_$oj_!Q.)5,҃~Z'Y3HDt$A-̖ UqT5wԀ]Q`ZԌN 'bJ0\Dt\?mRNS4Ԭ@HVK'&hbΦ 133O^>XOjANOEzfE!AU5D`_Z&`jϿb{bJH<{]t_-D3Kՙ š?܍5/$7O^[,OC[Xÿ7-)E?w_owջ*CAS&Cc9gZ4O6lfgx]?dRQ7it0w{. ""~GK}-wѡ?&YR 꿹^`@_j/ #4@v⟧3RxO?Ov>[Q]ڪNWѫƈ`+a5W*C?v[KcߑyADD)ud֟1/qoşkZ<+OHODDGXF)yv柊Ġ =Բ3-`O ;IҪ"Kf`*BFo"SzU{$;C54V ԱiY܄'  )6?DOPTĪذsOMŴyf` t[bYVj,lⱕPQ]ͬoxLtMT{Mչ;qϟU!(~px\8mv9Sap9JT7 }~_3en G{Zhj |tʸ_Cnx\uJՇg?w.9 !ؼY2-kOjۍl6}LFASm^jE u '5(&6`PUlL ̳'"Q`ZPVV2S~wYvP'2{1[BN>GjJ'B< UjfFtVSm'!\E0?z붺ͯ,R1L/BLi/3bzoڏhP/(Bj,E0b<ƻjJ{X\}}ҳ497u eW!/u^7Fw=xQ$A3䛁=#O|F5P >Źɷ6lƎBiIn>k\5x]f>2{jvt"\ lqiFu9О!%ge7epnA?Q7"":obUBqqᘁoص{Si#7r! :q`O )}@Z2bzG\߅Dy@:Uu+,hkXB@A8<щ}+x7I?l!b<ч1c449Lt#N X]f07qfIq~sg{/r(Xg AbVJ8;fy.HО p#9IѩQUŮ 0h$;PUwvqjQ_Ry)kq#1ws0>ߚ/Ba'd4̞9O,}-m?j?,QZX׽qȝfV஽}= Q{GY㏁eGDD'4\eH8UvRsmf> `foJߴ?1/m܅@=z]^DUz]HfV/#Iz|e Qaylok&dz}`Z_X[fwX"M埜 :W~cFo ^> .='Yڲ/-f0橥x|Fݧ/+.AH}=f)S}'փL;5 6o^Z'?3{7~i5s*5` SQVjfcܨ!x ^Z;i8}?VԷסC]x;mSomƭ_ Ә:i<^5H|EҾcbdޛ\[6Ghrx*ύSs'c{,F{єu"""Jqͯh-L_z4O5CDDt3YyyRM!f |ܫ3$L)A!Y~3X=(ɏurh z+T.; %>}A6e4j[.%{Շ5 !*Or mxZJ5!rשClC/^yUZ64m)6 >E4;ta'=/mˊ}x0uĴHsU8q)#e;//tXc0<Nfߟ9XP2L\+QL+@?r=F g=xb>^a|_cX4zg *.,]lskN| =grhTw_oo5HDDD  ;BH UfP@HT__JpحpfD/NSj5oxegK%;I1ևXiCz0j^ u*ӏxOx]3:ihl7OW?ni bAUG~/,b'Q1 }orhnljު=سw~%#!`:Q E2@\8-R=>D'_f;.A){uߴ@!s,?!ޟM).ӳkX"&@k GH鈚g]?xuHFp7$ͦ=ir>債_ݏ"d~]_qhTRt"c]+VTiL,9|G4&jzaR@s[{^k_QC_`.Ӿv=WuȒ97}6YK;0~\͌«&a!c3hlJ-@U`΍y}_b Lhn0!zlA7o`=Wcyz<*HCкTkwp9x,O{CMxe~vBo QI;y-yz=r f&ohƹ ݱuU1)ߪe)ÛcAe }wm(o?aKU\TdƏÆ{w1-g׋ -eY?mpADްS0 .'4LdY'RzhcLy>>Y?QՂboq&?"f]ņңw|eO f -` f 1%$K@IAFaAviI Cxw,V0j(пSPvYBPdPg&_#-;f,Ί]{Yza'ۃwF!zv AL7j*vO7T_GM:́5JQoS%uf6H,,%pmf+OVUF7]: m ]OyŖ;`s*> ޘ"%g3#YսEu`mvk_S4Ba}hF~[K1 A-}5E; ʊf: W.nj7V<EHRƍBU.`츱<ظq3VyZDdU_>t]z͚f4 Kaԯ;}vX𧩩 3s+VD<nAukA'ZCuVT '} m–T݀2Szt(gY' -Q̯8.'!;ґuhJuWDxHo/ngHoݞ(]卸z0@F~ӁO:'< 0'Vc9NB|Md!柳(k%LNCg- @l@hfY5OEDc׀VTXWDn4S#ksۛMe+S}C-ԡ; YˬF̎!EWf6:^mu᾿-c)Gb xUKl^VGN(ČdEXa,N>NmHB9 0@}b,6&3hd ͎D`9o2Njuc1Kdp>dШ^\Qjӯ Cݚ1f/hEQQ^r(Jz6mjj#^^a~N1 LFBhޅ +ᵅ; &[M3ގeUyT" ńAsq$& h gD4inoo%X͘P?*QTh߂h:ƅf?{7}?2Qf[x9s[NYo?j[o]|#?ZGGxVe. ^#vqD-s^)l_Tp 0 uR﯉G#Ub"gPױ/dɨIF"}U4$YF,i ̭x^}ETED릨 ) Dx0Q75&@KШn3RZ{..^3Xg~@j,2;PvSp6a%û{cՀ:]ngJ;1O?@3uYqet~~bwӅ#p+qո {m}}cK6ص ̌oOC<JWY}3cwJ`}WZ\\^÷VM;ʱ5~};+$""xױ`Q957*]|UMO)A"Xyyry**;E' "H^&ғu̖$y|&;;;{w~ݨMXn^ G_K(@ ШzTnetƍN |bB[lfbFn߇dn#/jȲ-E|S[r984/lZ *7 rVVSTe, rp<6^2!s43̚pnj=pS;>2SyiVNڙӊS_Kn,zN$^HA>BϽ-MHŜ9 :Uہt2Os%ʳ;^/Z L32Lq}9P9uףGF{z=30k8jP-uM~2U:w۬BIpY7g6iTMxvԓYTj$*c 1&UTXI`HZS_MFqzd'E.jI~T$)/`# @m ۳E6**85F$zw;Xx{V?)^\^B>M@&s8\oh"kWv$g6e)Wg'9[w :wK+$b.NOQ=2F!&jO&&jS٤l[|} zsq4y=TNs@E$DE܂x @˃AYzpuG}j1.kiv,.cY, qk;?ZGlj7 9SGy!~X9>^t-xFOt6TnŇ.A'#ȼ%2GVݧiťP5_" üS~uQ|s][E6h 6| "#ߑ9ރ6܇GE^ql(;>^- M_/᮹%0Mz]]v;nJizѾ` B?зwO\2%V/)F<4/P]:j|vn<,U8]ݮP*brEhthg``T^6GWxwnx2 ی+W'6em_)Yc"QV Y=]spUaW pfb(-^6nEz6f6N&uG\WYc'$>MH\Gϭxq;/=-F ؈E%/5IbLХ* }iU+v!/xQ! ,\²dg(P3$4 m@F6th,s`(Q.H,3#2_Ƶ v*r* hm ^2 *_`Wa /N8")ND+>f[Kϴh_tjpt a1)]FՎ{oCNʖ]TD$_.moGKH锇rýL[%v92{e_v ,E~ ߋɱzڨ]`KЄ?n;czgH6 Jg/*9gyeDki 'JWg? {1T$*{T㏈H93300000#MM澂|}z}>J㗷3o]BC3cMtizy }*S,}oyd1}:l 7]뇳l7vB 3Y{<)2FQ.>^FAdCGsbD mGP_d Ow. )QYEz^vH^@{ϥV~^Ye|[&~3bttL(~6l VC/D?CQzIoVs>! 索,\;ǴۻG31smmN,#ߔjs]3׃G߯'2{*4\г Ucli0a%y{Un'tbh&i]+6xD==> %"!(SB`5mal|/INHԠi UfK?Vj* tvALanIM/ |ԗrw" (u凸i$D?tV-a?BjDC/胔~V24J-{J̹/ y/;QPk[l@xg#Z#l.yw,n=/+% Z0hAEkPάJ"˿߄c.7])n˿ߌ#2i3=2%kp5C_ ~5^ Eu` ޸u$6Z?ϑDq\d@ʴJY ) @> }M<|\tHcP#DMd44Ԋ"Ez %i:֐Jko= im7ju:ѽv= 6Қ _ GA թ.]/`a!scغ efLhEYXXGθ?Ơq5G {sIcv : @讯w˷<1(ZW dPIy0d@KBwy9 L5JkCUaĴq$\~ЦqMkaʰ1?y-<Y;q_z_B|a폾R;PmjjV1E{ dpfcԸ^0‰Mkv8֕61a'qtmƟ.`Ŷf_+tH4 ';I2AHny7.̺/Z6%Y5DE| <KmDkFjx}y³7AK]7T 0qs, Z^'# ";1}Q>lj_Tn_ &QP|,ܓf,o7?kG&˶uѡL Vw|XD]$mH;7dz$({ #5M2 d9F6;dF !y@ҢL9D嗨S H'jDS"7gI w2DQ @o@2C!/" >uj:H`*H0Orχ#wKDMYbxb_/|_F"}/1E2/E܊W_٫ =xi[h?K4d~QFWte5daIӥå;D0?O"6?\\TTN4]h"䣦͡Jh 2gͻIzRkšG1R}żGd!-s }J<9qӁ+z d!QrL W 3>s$Sơ^$n޼%i`M/r2|i0!+q`JCn'~XV=ޅٷ :\W\[\8Gy3=g^l/6mz/¨kt eP۶55NЕx7Wl.0YDGU)K-Qtc_ohv2%YmiY*N.袥܃[mӡf8h쀮dxt>:*Ч3ɚ#J#pij/)'[;KF'F&Ȩ,dm+cf2B~ '/pV}hʵsV<ǐFi$Md(ցS_" S'MAHEd5^\(G&Dl"Nf@mcA/I!mDAyމWS6Ոrrp|pmJV@l#t?r٢ϡdSncW9./TS?g 1^Ӎj~L$Nb§~wW8XxWMZKgaѿqpOA*+MNJ)TkY_7 ;AmGZw֕`f00nx e gn= ~*QQw }./;Q@C&ϝmm;VViҥ6 H$5,س)Ӌ&Yzz,$V+ _vAoъ3W˫`N)rAj78m~?Ě0 [PU_ȡdžw܊QA>yL>G^>j w:i"3}Mx)27e.S*%~m5 uP~M'q:]2ALoM^jm4:9zxl@1nxROy30}J/W/`)X,RE}N;g{R2oxCx~a*t[3(Ye+ w+ǘ!)k* $voJⲣP+ 3$u \>_HPuR%C#|v(B8=fѨڦF]Jrq Do4__V{AL#.ݯF%I%jPz %++JaX@A^W߁߹iPkѲ3gYlp^W <ǬN 5b틑]&azG2t VIyJO8|wפCW ; 7PcE ?^-PDZcռk; ꛍE!hTeef~i$e٭VEˮFgY#8UC<`~TPN(]{s)TB>f)&ȇzF*ހ6NmEL qjcZlu׷׃ڍդ|ڶг y{{1zhCJwZ/#bɒJe!+"WY&5Aiޖ7t)^_[:3ZtHOQ>.NN)+3 G8OऋE}ڵñ.  dֱB$늍VO% dLFfdGPLWPV_'k!k:"C[ < 91o1h;7MЗ sS"eϐHS0>ۜ##B)?.'L>a6 uDL )roGKHA;٘B}m>$7H#M i]^$"sh J;y?IhJȦ2(HTo ]EX Չ/c!ىwy k^R[ZP~\1tcD? = =|л7`# `aTMXr"zNjwrl #˖a_IVHEJ<(+Di5UutDn~5jE?fb ͬ?UYԊ=:u;sp;;8gO?hcNd`"d2V0BI Gݽ8!>e))RE0 kT/ t Fٰ@D&fgSj(SQ F%BAB@bDYK% Y=ӈ薄ފ!&IZ,qK.\l&-5 Cǁ -]?SjT.gh[dJ$*]Eb``````8MXJ i_TkTdFܓamԝ]jD4AMǏM6Jɓһ$M'(GV.<+4mF //]Ԡa|:f `NLGeũ8XTS .թ6Gע+ Lb{sYv%XO:#)e'8utQUum4g$VP_Q k\Xh9?U(->kòX~_ЫՉ썬t/+luM9v[w>;CjVo ;`>/~ōS%VPh/[3Mei.ɑVwijL7|XT<{`ۀ,5ƭ89R-{d}UjAPQ0ZMoc1J\1:Z`rℕP`FI} nMjqhA-2 ƯbuH#kHB0z6yo1-A-﫪}f!F>~_kAl-\e||L lᰧ~`"1)k\9[Qv]4۱J!7^97eY)ΈFMLI!PSD% byUL8.zZ$vAN/'"2(R: ^^K.D 吨-=ZE~r<3O"G5A`^ H;œ}p(@L #'L\ټX#EI;y^ఛ@q 7ԙBSnܡ3/b5>az-T Do2]hoP.tZ#LqikѲ%2re^z./<A RȰZ7^wōJ&xYDķU0f[&A}R 0ga> W f#LY^A"t=Ҍj] n/ŕ4/7jRkԪ"717#A ܍QJ,ǣ\'uihp2v?cf /2" լA.Xɂr#[ {hh4@"`%GuFd[uLڢ#tZ:;JVYƈ pL{;=rPn|tSm:Q].n |lR{AyI(7tRP9V1M)Z^!@-Rc-hIO%^zˠ\GjIA@E:]-o sN&.lR|A6yO4uhY8ro.2Yg?\ѢnAeVDe~dw҇lDQMi aˑPJ/ZjK:yn%I3:9^>dm[SΨf݋SPAQ.dq-pԣƟ,uQQ- \d!i2ƦJT).O Xg7=2'50&ÇL&+C qnkɲu *2u1iF&ta5$H,)avgwAf>&RŊr{,iy[&i dDOBDy @$ޭy,kW~>Wp{}FB&u!Bpe? `,J6pKZ\Wy-p`ON(ն.W.ĐҙѪLCxvfX/dܐ)@7#K" & @H>\AbH__ D)D w4g迈9'RZ@ }s|l?>~ %>ج&`*ʼni}Q1SͿ҄YD L;޼@T e PI[%~>2/d,DsېʍipjTj-L< pbN !s}F20000@sxdBv&_ ?RI+Hye=B0/8o?Aa_{wNJq̘z]?+ۍW:1dls#d4bԤAӤ~/hk!^_;֝1ïl@_ڳF6$wܳҔ,HS-n GMT"xy C<(!whI&]>hNUgGcuah|zMaȦNblb1zBUm塓K|6=c&_CV㍝FԁuUNMs,\G&~α\~e@Q glH[A=jK @Jʙ@VPQJ~ jQE;~ r(z㣉@ 䔏iʎ#&h9!}Pqŝ͡FT>ض>ߔ7̊>R6 wP泘gu(YkJ=SccpAH.M^U/E~ώrCpQ6\a~2*31^mXKFёr,b'^~0ޓϞ㋻GiwxR*TFx0ji^? LA7V4,gpf|zMHI;JQ?V^rIOSI~N p;^/&BH;qay/'_zŕGEV98= oq!cV`vssͱޙL1if$Bc {nExʜ{Z:w?C8tFtYZ#`''{UkpɾX2m>ĘΑBbI͊M*EG-łX}xq@l<Z31c [?EepA> _][W;sFL텸@a=(.} 1[ǚ@yԽR4>Q$hfL9T)lǜ#>Ne3{n;🧾7D^ihNzO5q*>V m+HtӖtrƌƏ7pǝӄ^CINMߤc@#* } :> >[o#_O6*Io/&A\ GJQ ӏd"x(p_@C^=CԱ/^aa_ .#*L.x,=Bl8!Q_lƋ@=v AS{9S(sziȽr5)g}U@]W't#(!}_GԷYDQPP];bOz>K?~`3V%'iRb>lvR@pWGf%k|g e;U^X. n4+5:\t@<@'y֓(/ދ)=-=Na12Ӑ݀{nW\`ԓv\ LSul= I_lh/~pMS;E;5V~04|;+.qܲ [Kazn fW arZlDn­a700$㜾%nʍF?Cv=x;\~ľwX=} 5\d:y᯶hFF#%8cs_p`kY@6ɓP! S#+^C=InYAAOFCğċ:1 #';GPX ؒ(}O\S0ԝ7چ|xIGpȉǚUc H(Ck6c<||q/l]7,DcȐOt)!,)(%AS?@[6ђ肸I2 5]5 ~k(ݰWGA*LE.nYKmNgzV5p%HO]wyڎޯA`MÔ,[_ggÖ-к/["2 =4trfj.ӞA͝~ħŅL_~_CKD#ѽ^GG$c~؀7DԹ*3h`Nyx|Lkob|7l=1ZWU)VB|6ߔc@*}|<g#w&9;Y>R4NƆC:fgk܊!]~9Byc(fMT8.Ħvo]6f ۗa12000000004 lpa`iS5dKA4)i' /iʣ1A@J&)(0/;!1f*4\wu7tMn.8Tt F94 lƇol_ݢ5naq'Fщk#X:-yz|qgރ*;оW;kizqpQU#ڛb&ΞJ+ BGS= 5[ oU\9~']0WT M>Rá5cs^^| $Myov?rfZObAQL'r+\> FmJuxRhWYᘃxoC.H>!_wg:K I>|tބ4;ZM:t &b;gfg˭6:GeA *4 m%wu_GAX[[Hu]#c@ƪpϯ*!*}5kzGLI?Nz+YX\ t$[X*c]yS>,lay :c! ݁ECBP0gTxuh}@|LݼUQ@d{J7@C l6LI?3DS3uҳdJA?Bx(%9Xp{D}<6{⳿DCUo2e-mF&]zn.ñx'aL\6Q_Zٯ}+ŷtScObw5?>GmGWk{WKbTA+U*>^q 56+TקGl>)}=6“xx8h{{x6 /K[h\6bS `kp6פҋ;jQ'eR"Vc{B|tj*OA+-I8;yM}]<s*a+o5~c;k?nڅ/Lrh~kj>Gt7M !in=y;歮Ý XC0Ey ~꣘{<Բ&w) RUGp̏o9ŵD_zᎫ&sEENX N:n܅MwUTnNVc2ԜizR!Dqx+:7y2`|σ.z}ˍ¢x=x M'lBhH.)io֟ޅ?Q &,R_Z>u0<@H1%}ud)x#YQ.jm! ch(b1ǔCjINE6w0c>i*c~~0'R~* A"G⇶b`'פtqux9 }7jbx6!bXJO}E% e?h"ߕt kt\1[{ϯ.vМ*N]ahva#[Oǃld````````hF`&LbU9fph:^6M8">r\ƉHfzBJ cn(uO@DTqI7 %ڵ:u 9 (1tؑ}{ggyV1 F6H 5< ~0iVjeԣ"[=ȾAM\'ȉ?>NS)GDgoB}}$G8 c````````c ҥ+z/'r99ȬXY.kOMf9?YO 8~Y-H#"lj$4a<"FjeiI R)ɸ5^0&(Hg" Dd_" BQmȈ?Q#GJP"bBdLd8I.k`]Ee 8J,b,Q_\0D֡9hB#J#K)V;0;=^!v|tv>(|bt~ܹtRS狐@ `fQ("F黜 c`h,bdI+7.N0*V F6G/) rOLISV鄰gwt08C$=w.B:`a0dW9{ud'7D|A!R ï@ O%lc30 AI c@NlyǑ&&N#04@JQRd]D8>;Z_?kv݊.L;CA2338yd<0Q))سgOp x駱|Z1`F]cd$17}^ }F͎*P j8 nt+A23*dM'5Go|u g= j 2?0?Af t$(u(ܼ ] w{Nk/}a}PE n` Gtڱy`9Qz=)1>ƏzJ$n7^xL2Ez-h4Lxg0vسKQߟ b MliFLw%֞<0A e9QP'hev' !"8}Y׆k!j%/bȿ ʉ *t)¯@.}0pHj ,KKgBvhc'Dt_^@Wѧ)r<6L 7ߎ]JMcyg@0++ =XXp֬Y/¿SPoϡn۶ ?[=kXh u]LpN L ~4%&` NІ2ԣRL#VPcIp'!c{Ě @&|e5x[ I-?o(_мIq‹_2Jpm30N j}O3)I9l97J͙3yyy']τ5\No>j//^>bV+>s6x16`3@ 8pL̯_&ܹ$-2ZI8-jjb$ 7@*n[4'+(20000000004/DiREM=a0!my. ~ vԖ6=vMd&1|ׇSx]#<( +}0\Z:lmp+lj31p ߿ߧ: =u7y^\`ޚ8^#`\cRWB0{(rC ^s!KaQGQI659 MѣTiB^7S:u:F|'1cNl$ "G0'ω~P+h=y~ҽѱ6B&2;ySs.U4گS#e'd +={ ROq!pTdڽ^7psDzy^} sO^~_ͽBG֭8}k[g4tyiw1w$"h(ZEUwPEіjVU͢Ңv=j$FnrD"Bλ([|k3ÄTx \ܺƏGدRmMix$a`uW.SQ}hD- Ѧmb \ȡ`sY}Qӡwʼn--Y`s‰yMz z_0g;C𗯀CFX~t}iTp/Ο4 РR<4kN߇UkcQS-+OOg^K%-euh8_2Uq8Gލ7&c|[wy9_7Dh䐄MGhT`#Ȳ˷\(J췥M(TO*e'D3W;_nԩSrR)ǣzhѢS5mRzOQmndA9>(F>PǯEúPjbcT>~U!9E/˽]:sY |.dׇȵ)h¯{!p8GrW OBV4}f^=u*8&C#h=ǟ脰 E0YLs/xJ-}˗8T\ P)66/ヒLD={6?.6mC@*1TXcEEg*F짲F!Xo,U@K]P^y0aXof@,;)C?eK3#""""2wK><>w9BC ưPYM]uxc@0 {\៱񆎂!`z+m۶ {ɒ%̝ǐ!CGi#G"""0*TOG_rZN ,!<7Wp>V 'ħzB|#\GK^n?7TfdA}f136?wA~)h- Zy`ԥ6TC1p uʳM*?7unpf y?K(gZz='?Un(fe:m;8i ;VSW Bz:]H5U*NJíjT~5o'!խ.6T#U /ĥكh#"mA=nҶM .\գJ;|yoGЯa-_߂SO]7W7SV28[l2 q)޽{[Z6!SJMMe8x'%%%y%o %㨩R \@m TVwmYH܍tbg!G+~f!]+;8;Q2v;W*7蓪 ku@6KI3d`+*(Y)ȲT3v'¼/Ĺ':Y`e8 ?OT6`ӊj[Dħ 5n߃94κt˂Su̐p0Ϙ[]i`u;ºn"Ž9چXϹ9~Z58>5\'V^'6SA`mUϵ|_x4ב-Ь?V^9 \E<*shx`ⲅPw{MՇ=!No1] :}M\JCk1?l>eMo8n43n} w6L5^WK`ZDJ RI;{ |y`20l+k:%c04nJ.Ye @Պ[]vN&sCh<*:E%xVYlA#]WJ`QXo+F` P09buga5%*,n]R+0s{c_!_+_,-HDDTqH騌 ؚj^*+؁irc#(RN^j`cX꾪|!8*Kδsde7QRC0uQe*'u*c֩L!NݻO_20w^%gjs OyeۏgB :*k^0oŪ-DTC`N.֗ rbS5u$*1t,h@+gn?WczAA!-Tog[ ƤPg%2֏%xRς_o\5돈\vGe+5=oCqZ-|.2+7 X9!QѯMԢZBV^5*B@w=>ɩ\yD%BdWiԺ6-Ga- ۴QkciFPKtVVU)66~uʊD؇roJkװ^?w{J$*!DnYuZCEu:|9V\6?% 6=*4D3ؽ`UTXBԺ .n<-l\O{Sw3" uq_wVâ?UrJw77*"%5GX0T  C<@QuV꧳9+RWvIhԪo|6݅#|7uB)ݟQȈٿbh$d|fd Iڻ'aQDMj2ʉZFݹc1?5*:@jXA*QRUDDx23Sv:y*?[s)Zx:U H=ފk+l5u_TMȑWw8I4䩥cNHE䴑#9~wOM6iGV՝8#>CO ۱V5tQ4OC.Ml[I-WcWKv!ZwAL| 7A^BGtOZ_+6๛qڭa]Pfw; [t<늦(fK""W/!"";VRIց2u?T51Ö|<9Si@ha"N,!nruRo$-9ӾMa@╳8%ߌ#?Ðʅ@uZS Ӈ5j~xl/Nw!" n@""K 92#@l@k_f`~ʴ7i\ХGS| +peLh- B^M_ z/ނ$@rFa'*;:\p?;Q&h^Bfb.ļ1;55TcDPuu__zaШ:<M?4k::/?#b!aR*C6s Ze<4zVŵ?#>M ?=^lR;ùS1{Uc#$kW!p oc߇ߥh\|Qob=[bP38dV^^c>GXb]pV+9?` KHе=o qaW1pWg %xoagg:h) WZXn__3DD?""rWfA/.(C9aHy}0:їgv:?t@-0ݦ~lW5;0t{\;޲mWP9~}k&" Otkq#1K=Oa]AʂJM}-U`긲b/> ;1CꝆ#I;u44|y 8z-y} GvC% *{ #ۺ湇L5[ϫZjy}&ꐮ3ǰ)"[m[̯'O")}#iX#8!i2h:H3p)zhUӑcjr[[ZU~uPu`SU7AV!g][T35C\4FaDqmq:c8co[lߑ\ УAl8fOfr*NƦovW>Nr%@xHpE1x {lƶ ܛP p(:tBe~U3Xuѝ벊 Es,`' {~Ǚqq DN艆W@zU/4tCn{M%ueyߑOi(8MNh☉uGSϚl4Ǹhpkg˷w,I y?s@AK1å 3BV4}fPz ƀ4> شۿ WƙIȶw}l ;?g|j'b\x,vqHo߫R V1>B4E_\ ddvIT LO^n37 K~kMu먰 =YYO`w!_?"""*- +%oQ^W <)vgsx࿘,ߧ- fEsyObӒrLTA#yOuPA#N[VC񵡀i1kZlhמðe*E`)g9i_QP>U* _u_Jh?#QY"'Rj`bW㻩<o *6Θ}IJ u:jӼB1.APWz-o/!t.Uʖ)/| 8s7h3S .6|˩҈s-heЋ:ן8>youy*/7,$+,d@QmO$Eh3u? ^HUz \z!!*N%p>25)<Z^,aP@M\ ! u:=bF籪Xx0N"4)hS`<@҉J{ ۖl@sS m] kRpU;,%sc++϶G7)r>.6T#URf{ =-:z» 7n jmK(f^ci^BrW yTK*BW?ͼ+h:|46wn"&ݮ`2$" DDDe`Eq]8]Мu^]$NJՋ1; \:7]`n߃n_XM7GP7Ei@% s؈yc':y7 i5#OkȿS J%3V כrDĊH,璌UV ^Ygqś#8J}3"&z 0Q?¿ K D ɣP2s'InC&cs{=G 9X kOFր]f6.Kʳ)38scdNS\[ r#:::Z/Ξ'wqpkq|i}r @~W *8Bu/L/]=:Eu'ѠGx}1VD,LWeRXt5]1l`YòAW5dA14m]\Aj@U{*yϫdjs,6{  P:%zKC 3?/}Сg'l'O6D`X:Į[xs5&V%" l?$|d\Ź } .]IF[?)#" ѽNe50'jzA'c'W[J' -3ޏ|?eS ^?8/1v:tQ頪\vAcpU =1>hP ^ͽ͞~ T:^>={NzP0""{^?E[MB.g*hjnԙU!7o|9 bZ**:o,Έ* I ;@:;ƕs14X2aB]xT,v[#""1$BEKPDy )OU*S#8k/K!>ATSMBhyaܾDDtcHDJoބkY>TP Uy@F@~DDDtN0uBRrE]°D^@"Sٻ!):WԬ]vIV0""@"*Ԏ*xO=zZνoxޮV>).x8"""TLZ>YURk֏Hau<=Ɗq8QWOaKyÔ*UmMDt5nժUÒ%K2 jm$`MhݢȥKsϐVl`0@[:ijhsPiK~c{`lY~b$11ۜruuD)#e?vtt dddpG"iIIIPhӦ >s|\ Wa.<Pɉ(Ŀ24wz)AZju\yDDT$R7~x|8{,WH11$"TX wDDDDy -Ia` #=`ЋOu#GsxE{e y[B JwH?2ۻw/oplKMMJ(L]^F7RƦ$5W7 J@""""""""*W.DDDDDDDDTn0+} \ cw0$"""""""u֘0aÿ;]բE |裏,HDDDDDDDDwMf0i$| DDDDDDDDtWHߔ)S0vXDFFr! )ÿ; )e e  w@""""""""=v\DDDDDDDDt'ÿ1c`\!e%莑¿o]@]Lhߟ+>f wKQcW~0$"""""""R|aHDDDDDDDD_Jÿ [-Q4oEDDp3 趵l&MbWq ĉ1zhڵ+bHDDDDDDDDֺuk9㏱grUX?Ə/cW1$""""""""kڴرcYD [۷s#Q[0$"""""""[bwocHDDDDDDDDbwcHDDDDDDDD6I21$"""""""|Oj߽ 5;"*9O?}6+JÿWZF:j qJ WWW<  ?@ly];`0p _\dSHHBCCe>3~w;|8I"4|^G3? N+! ;oʔ) C D<$?.X3v\.>,W._NKi @p4V@$b?3WwC-ԩ&|켊ǩ \yj>?uo:/Sɿxl>v}bw^II3$axt`"{9;v,ÿ@"*`e6' @N֟C~uV~3g7"v%$OA,Uj{Cxo_Ww¹'1XYC?O"=z=O.>Y>4|87JS>Xc_v*K! Q8HII)i @# W>'GfџCԛYt& _Oa&2l/1r+ҵ\ $0jEg8ٻ ħ94U;j8I"7U;8\<injKzBmgT]+cW10$DG6[~AG_Hͯ#"}6=Mo>u?tƃa;|=:]HK + 233-QR%Z 6iIèz[W|M%35Um߬.f%|M%jۋgM ~c;` + ڶ-}Qo\!16IDtGet|+ *u_:H/QOqh] jq>L=^}ğ?(::Z ={:22R'۱cuxx͠O' مe'K".~Y?y\Dg seX+nÿ%UGރ,9K&^4^Gxl< tj7J:>7<8ZUl*Wl{Lr2Tiz63^]ki=+ڻlʓD6FM&h*!z*{aܹm\vO;}zcS07o,X@?x0S}TuŠx9#~g胯vOg2O 4vvru"x7 B_E[ql?/G 79xKJec[|f1iYF%7\J,~B{K 1a9 2QI;L0 ~T0,HDeQ=ָI;6]Cb ߏfwx/N| WM]6}xrE&bٶp: Y04Uek^='c в-;{a{<1gt|g~ u48XT`X|/bkA^6q|l݋#u0v{/o2;d+ϝùsSWgq>xsqřY?"}_ |^]s0څ+er˷S84ŵyX &_cw|-C9ܭx!킋.v1A{m8a/v>xcX f39ذ't59sB!b`Pf .?a˺uGnSqO xn2Vl܁"rRL}=| *̥!w#Fvo[{O$6,kRUOo+{g?evh*?xǝlσaLc=<U#ĢU{ކ>}!POJ Vʷza 5yG(#o.l o Vτ9b{a;FsW{1@0svoOe[+E1Jg-`鯓л~ ~s_hVGO|.kݺ|(wJJ@P$׏C/7lOza7uTMB*$IUOT_ 꼂c:ڴwҶxԂxcU0'k O!۹;ՇG^x7,#gZ U۽x#צb=3 rj!kt>j7&ųź a-bZWа֨rz F? 1~5nƕ {^ H%3My!Y ùɯcz5E?o*F[ŗ֦]C˘5v>ⳟGcak歗o[NP4o&/k6d8nXoҬ;>|k&M_oئ#xN(T5z<폄_cd@OSuƗyޔZ*89`q} kx}pSg# z5bgӉb8L[g]5[wxsDa1ucTyu9u_'I偐#F?lxh[xg;8X(_TOx4fOL!23`23%Qs]d'/-o} bL L\xhTOD#闞N;3g{gjᝆ˯gFr7|iLqdpwqS1j(8:;SNX3oyXvjS6l Q:v`)=rLENh1$j$֫ʪdسK/]E–G'!_ـtϩ#iYO$ӫ|hBjfՍA*cuc}}"H̙{®QXE|R1S% =zEJ j–Ⱥ~g\ȝxzz6<{A"˹'yYx-Ky[x;hǫb/rpSt6jFz,`zX4q5f i'V FNߢaVӫSPE$MG+Zו'ij-^0sYsˢL;EDGZʼ# /aܒڋX&+Og?{y؇׫oOC};<+_;9yU꭪"?wJmGn jnoBH!_bʻUy;c喐͟U ֧;`KqogG=,U۵S^ػnbcM~=}=ͩANj:.a2"^zr70QshаYvo݁ECՋ`?Pp#':^k 6"3<F }-j)' 9nvr4^&lƚ;H-c~ͼTh5bfWͫ] {q9Ĭ7 M . m)沗*=CpFeVtk70wcN]Qcnڒ@co@M\s'I7m/{6I%r=pn[?97nU5~#>&UMUQp 8o&B}_cH^I9MᾦI?3&Q F7Cھ[ȱ4)6m\!@"*SW 1hxϿG`ْvr΋& q>< {3s;ck0W0yk@( ,* ^j꼆x\G-=,8DlY 9*p};T=WO1`OaLT}sLH?n#tZYUaًs-' HQVA ΋9BVM(zcՇQ,~We(sV& xV0y͝z,.ejЬnmqNVwMHL S㸁 n4"mmck嵉[=ʻUX<3Hk3r*&d]ߢr[4q> KIRKGʯ' ~#M'py~5tj Hʜ~kdgz[|u ;˱UX4E("me _d= T-JX1S#2I@T\!Et'<ߣ*u pWS=5TW,3{ŠAlGTTв Y=ȁ7U #KeNl 3Kv.C*?>-5k){߅TtR/\O.K)xp`^ےǞƒ #@:VcObr`Q$uЦ7O7Vi?Knn 'p&E4o Jſ3'pQ_}K0.3+#..~~6c=ie|qs0.cǎ#8ǃRN'XC/4iZ c̔៭~V?e짱E[ӋNجcx͞ ~nu]ĊW'G捊WE{d"ӾFݰoҿJP24c^B(\v9?A_6bႮi5l:'uQ#1g;Le ǹB.}|^2L*WNoMx׶ǜ_)t+ҰX+/ 8 '6C cL.^BWFhqAue!*Tk(\ DNtG`i',Idkፉ]X0b,mVNGǽ7 b,)f6IcpB:\ChwgeF~x>x$EN!ǶaG]1<>yoN0ˎDgޙvipX|[t ;%ۅ7nLv! >O#݁+8k[/`S;7BͰΨQnݘo?~ 0ߵh;al(C_0| ~e|=L{MSn\K)pkY>y#݊]3SD8aקmXz2M[Hb̛6c96S⭗S;0o{x jԂrWSadǕ$D|=EaGxl&ՍA(oR蚯y8jxbx8jگTRm?3OPÆ w1|T1}!uVԦhB vH9cPPP,)?x{x?$&,iVi?,@Jr"|O/.F l')ȱFw+oG?ىI˴]r˟ߗd|\*S~m{ΈxtGȕMt'*_kợEZ<~u;[B@)[pz3{C@)zQ?&JȟnÈyIG< A/`aG^9߆'=RJy;GM4I&xgms'RUt ^I? 殬8$x6n "2rsLQ 1ZtFpS\\ _Ezڍj @Cqh67ox+a˩"fW끠="ݥ&F#x8ΝX)k#3MdGEaeۨGu4Y!8T#pt v5yE4V])лၽQjL:+ws;r| ۣuPw$ÝMg'+ß ¨Slf͚aʔ)7nnB0$ٻ'B xu$]jUNN:r='׍c"]Oؽ0pL}3Wq!r=./{/Bobp &^OxT 16,mjC~=CBajI,!J9l_䷉L#q QIg\ΈG7_p$}q۩sobobj؛z:C-?'5`egw H'@zGlXO])ꝧy+z';`Q8; ɦmo;fHIx~܆)[γ`Ϝ=|bzOc{Mv$Ox>#vr׮w8FQ 8.TӯFUOD|zlo,3ewԲ|bF\ G _?q$5:!C`i 5x @"QrݭNwյjo%%[dӉXs+\rAwrT{?uN=KnaGUE^wWyZѯ(_Un˼CZME5긃,N]~{]?oy=]Z-uJaBg/ǁC'"S_݅5jmd^Rorؿ'F 5QŎD 03f`G'w.;wNk5$jgzV: N+z`x|B7ZeX` eUL8,v!qd *[`Mq.].]SNNy<3oXyVc@""n\ "`@CҡZשR' ȽX+XQr/?:Y RG1b?""'c8{լku8 GZ@CHBlf@HB"b3qCC\y)ZM^¿ŋ@1$""""cc}_Z~JY! _r/a6خyДr 0^ =1$""""n?E l\usCPæ?cw9r @B.p^˰NDÿBBB`07' u ՘F[n7nkz&|,{7MKVgdp8XDtJ0k3\H+1$"""""j!B S_`Zw&""""""":ѩ4bG@"""""""ӄuDDDDDDDD?( :?H :?h :?:ut-vBn,;t: )N7DDDDDDDD? cG@"""""""v֧O S`HDDDDDDDԎ߫_|u `,:ejkjXL"3(pnm6V+M}X,UKm-jk-ӟ$n%++K;Ǘ_~N Q;~H7c N??x 0I?%KX ) I`G]@"""""""VbG] @"""""""VbG] @"""""""^`G] @"""""""~QWue :DDDDDDDD`G@""""""""x?.yÿg}uy <ߟu+~,ԔطfT +1:5:}K/3f0ni Taq{ ~O8XDDD&E(p +ZW_@`@jxk)V`G`hbYI؜WjvlέEa0B|:Q|x⊞mZ\zG:n_pe[xw&"%==] fΜ @[aH-`EEI*,@EUXjwW_^qXUcQ'(Iꫯb֬Y?>  &OyBǰk*f/m{beM< G~8oVޣqooflA@^Y{ɵrN MkuxgE!^qIno1G "kaG'00 D2$""zz{j0JNQe1 $F]vnj;m{ ;ÇoÇξb(GÏ}((.C#=/}%bQps`KJ6aSS4{m8od$ V}-@x/ fuez{.yevǧ mb!"j=} %#@'Wqc}/Iq0*6*q?t%x3+)7z|E8]a2X` b_WM0Vq0D`˟c=fߠ|vCȮG0Ё`ckR7lGR ATَoxlm3G\O106,[JPc E`;*4lv6 Xg+ 6~FԖcG/uf8`ǜ_sVb "CP}x+'f*sNӂmrY LKQS~E åE(*0ih <`=[bع` 1ٷNPY^.{-^?rd'vGQ\غ`hLDDIaЧ Kyoo; kᶁ904Йq^:~λ 6n~ n|_w=ߟk>7T`\G C OW&dtߛ~Z{!bZl$ mWl >5S Mn='`cLgEߋ#\lþ"$X86Ν7lCIUojPS6{ĘbBlX`E)cF$QLDDm'm`>QT@kM2'su=Ch2T[cz 㖃6TbUm({#wi%(.lb{MDD'iRTa=Pۮj6=b5ޭ?#iB||#{nid_ y$Ht8&w9p+̡}q p) K uv>رykWae6ժ1j$uƬ9(DcJ\g(p03 0jm+Ɓ& 8tEuKR0a(~m-^C뷉L^3: ,XKx}E) _q͌rcλpMB\5z[arƮ!zǪ-_&ǏH'PN6?h:{zk#ryy2?Md'""h{(!`^CZz B~tc헶KJAɠ.رp1ip2DDtӧ?:# ?TjA?WLSߠ&&6r;'r`3bM fX9%?CCd\"z'g !mi0mVgHVz5Cjq1j 2cby?""ɶ 6c˿Έ?lGaDZ͇1u^6lqrX֟ppjPYq_ oٌ3&_fGg$v@D\ zfn@pDO:EH J# Ba-=cP3qucna@(D Wxh1&Ÿݎ Y 5#<97Gx?PlNB"nȉka¸Cz#hAy!6٭/Cn~wLBB X"r=]QC saaQi @TJb-Oj< Lgh:kvAA1{l,\`NXYKR47iϭ@i%x7? ѩ /}p8Glk(`S- jR[Z ?w6"""PVVN]ZTTJKKϨm?=_~P1X1|v0}<'P7Sկ3Q#QfbG DDDDDDDԥxg5 u Z u N: $ uj+ N@"""""""@"""""""^ZLQGy 6DDD x~~#10 ]Q]]j8N<&Ul`b"Ƥ3#j!Zڨ;P@0 ,""N]]UCyHNIٲ-'Nq W!y>HPA Vm%u&`xzc0z8cġՇ`e[Cxg3"zD㽟'""} ^^]=.+穽ht{ɣlzHtj;f%p鳖a8;= (\G5.ri:baV&S.55Uٳ" U}Vw–uX.}RFN n+17Kb 8VRc?n茈{(館;W/zX=:=(A1"93 ~e`qQ ı(@gG^YN$߿ơ7Bt0=੽Dt mݺ۲tRL4;Ur˨||Ֆ-[0slԸN`=X !m[2ruAsu =*܎caIvg(_DW; ø@!0d#} A=1dTމeA.hEΤjֲ>n'*|T@wX,P"j {| @jE+u-\m zuoJ(JdݽUʶԑbm-?'[2LvfnݦcIl>{YDQݾWb{yԮ-3g@Y1z7jS< .7ĉ&=t`nRqni0$ƴGv ed45xԓO֟Fݯ>܌ ^7mڣZ3[[0`VlIO?<}&O_z ۶m|HH&^r Y^K%hZ[kd[\mԭ^O?L^ 6<-[V>HYɲ=69^]_֔v ,ѣ^uNB;cvz^~}7mbHg޽xp= 33LԿo;f3y]-ꪟ ~{ѣ?=/ZmVl޼?oC8vZC1!(4 ~4βev>j˱P F uˀ !+kȣZ=/i!؟߽o%: r\L$lmodZţ7LOk4N$3ϸN/jo>Q>W334~lgP៧K/yΚ5#Ghv3܉ag!KvcoT9 wK`OX-(Q}1LvjJqp6(D^d})+jچHuRUcr 7o+5kkF\r&ra\z VFϵWQ`H-kfz˚LzjäAnۦ2icF%7/O;HAB^2g%.["xGO uNJqםw7l蜽j_3Ow?/-{09Zh?ezX!-35sfu\P7\}^z^:;--] %[#IRB&y BT/@};}.'t,U-~ezg]}-[sQ\RzȲ$/뮿޽^ N @>e>eȼd/rE$-Ж*#qj<\֖0QYF( [K'OgeI-4TW^mNIwLw{ELAޓ2?y󑲔݁Ly<')c6i={4ڥ`dd$~zMNs1_Ϣ\>}ږAr~%ČYQiUb`$M`i*g^savE;O퍉GBdDo۶lGD P8{.Æر0k0"h  R❛[\ @pTf!9*ozYc8!:9 ٙ2ql7XgEk+0#܆ن(6D!&Lqhbl8w .YzsR׷%cOA1 0<IsԂkQ[֊p;=NKL3G(ٷ {2E!N.H 3՝ ̷5?"0F8|qK&E%@LBU&=ށB9I99{y9nH=rڭXAK~[keY2O9薃y_Ϝ9B"끍8Y'YlRNz<y ZmݪN~| {*ܾu{=קke+ѳ=ヒo4V>r*+_}Vy+ɲe}-u<`mu]M5߷zI8k] g4NzH*H+%]O}wd3A]}߯qve,y_U=}Եޭ)3+:}xNꠔl{A헺%/Rg,%21/C3~^/xsƵ=r4G-TK) aڳ>`C>=Ojٯbcc?QEFZ>mlx2ԝ4)qYC^>}xC03Sf+¡#p(uwBغ~C01|P&z[Q^Rt 1CG(v]'u덺?#Swh;RQ#vYqFDFXy kkQVj1* &upN_TT 9ÇH(v^a#"5׭2[e8x ="5tvػsKAC!)ԌMPPnkPDtfHMM?i3#xH-p(ԿRqw୷seΗi]N>=z:29h~W^yE;yΝ;999bzpE;5oՃ(-nuK9gR9QnsrzyoC+QFzIޯo8߆I^+eJ9A=^e8C:"믿^V&7|S[ <ؾ}rԺQ[ouumMyiݯkMz1ꧥ{W2{N.UZp%x≿4k[OI94 `<祿Ͻ?++3)7sd鯗O #]L>+<772OVaal[+B/喛q %%md85`hu !᧠\=ҬXᏘXDh"Dj "upϛ?z8\f#! ~1 V΂@1Vr"FKIņqޝ1 IQu Eltd]X#N Ӟ ͼyHڳ6"{4ޓZJeE`m6 .3o[3X%m_w%bHv !9s˱h"-`{j`䗞 )90GvVV/SNTӒӤ$rAqA>^z--3}҃{;/d$|7Rc{L^ s}N]E~XvYzs;==jZ8> `P"+!u\EisoWn"=fl݊߫111&11/ڡQwM1ߓׅ@yu= >G)U_!"1gw83I롟[Z1Q?^JGxI-xe{yNEqQ:<~hU/C7Gyj=*F޻Ϳd=Chїxw`YԱ|-@q #Fj*$>5 dҩ =d1C=ò NHH_ N?s,DDFɓk9˱aqSUr!GÑ<|bJ@^.ڏQwkE s.lʃ!9G P[6=Eb{0BԆ'"ƨ~/&q`0L85"بv4DDៜ5Ez:Cppv,wXKsf=vL;hfdW@p8}yzjl. ,Kw/"}xRVzܼ\urv]>>H$wTvV;l5T)WMowesjkj~iXnSzm߾C}FH+m ]?%=^Ole0# {!2<!taMBq:t GCR BX AA[z _ 3Vx%u5ưp ш@}8h eD28qB-PJ4!{uH-k;w#"_~+W)e[BF5\3U[5uתϜ57Z:U}<:x9 O]ˬ7?y68.O-e{U]ތr_P"2,>S~TNy3}:2NL_'ȼw$@wzzWSqdL\=M]ezyʶɺh׻e2w@\X} )K _e_}X.l_y`?NsW :4 (CLC66Ew۪ EP ^Ӵ˟4HIÆM嗉u7Uޣk*wYaGbz !ZFgS5QԄ8$'b}1!:Ўq2Ln0O=TMNÿ>B fwGVLv:*Çkz\>mb^lY6q @uDGᆱJ[2&}|d>h}O;?bLjLru駟G)}L$"םy-7߬.((ӟ{5:_^6}rVe-pQ$#S?ܐ0c)j{z!a쏋'_XzH\{_%''⋝^lL2H$<5^qŮ8ν.zy:^=V2; R[]rQUYF^һΓu75kv۶kSh:i}2xqg6nջΡ*.x6}%i~~ Ct [)5hnT[#}#c9F[__H4f#=5? !# vbOa}]ڌVuYj[ Xiuv벲2~QS2o q +V?JϗZAe$4{ tlۅ=emOW@Q7<Rr;=۩ χ~kعS;S.wKOC-kCUUV93lxS NZHP0j-(P߃zO}%j~fu/+Vjoۨpnx뭷;˩^bP̠L^=u]z%pߏi?kFIYw VmvTaS8R1$!6a.CU`O$GZL>> N!D@jYNtr k_ꏫI.(#|w6v?6] zvX16n_ 3閖fbG0IꝌ۶bس73~7\ }EDDtҼgU= TW?oلԴ.8r0mY-ڏv='A#t CynooNc!j=&:풓ka٘?> `H-ٷ~a%~~r &:yA72翉|}}Uƕ`٬ӷn{L\s w{!$4 Mw>&4v=jd$?$[ cz-Qgob޼y,. d9c=XJTWWP:!.(8iٷK+랪nݧ@ P& 6MۏVyZ7\>3B!Yy'ៜ{aܹ,. nDf@DDD1bb㵁:/_=G O@bV,m"tcwbocz$ @VAD3X D] @"""""|+*KKQTq3B& F{u D]E@DDDDD]! Qa&^ݑ1#:S2ΙrMF[qh8DQ:![6pZS ¢! DDDDDGFH C,0;=wCt1#~x @"""""TF+Bvly8fLYW^ , SQDDDDDyT:-}ޝY0W݋;D{Q':BFlA;i܋AQ QcGԽ u"6X A:FdW$j_z?duC팈:{1aĘt<7#}pCD^:+{?<KaA zFxd^zH?3@"""""Tk16}5cX`^uGJDљ uBvTDn Kyљ$"""""":C$&&nDg $"""""jpuYz³>9s`…DgDDDDDԹ2t w?d *`è’M(B]_\FbT#`8Na{?":s1c0废:Ygǿg]/iEOYczgtl~,|E]̜6UdE jyay^cAk3 c0 $"Yp՗cTOFLmko#*>Q=v-~@+*@߯7!($臀 or㯒D-<1VFӑzm4#SShEa;Ƥm;+2\Վyg#--?co\crQJkg GPeANmil8ǎ*JAV\/>]Gy| 0?<]֘U9J1 6ZV~#?.gx!0Q76k ~Jzc5 k v{:ؚ#ki,j1R$kZ8kݷ%(Cdp\zm83G!>8< 1εafW}L<06@}~~; K>r .ia\ޅ_FKA7Os#p S1ʯ ˵ƪ'+v&q}RPԽ2lm[G+`۟T`g(Z( cύ4Q^Ze(8aG`t:.L篍۲?F2x.ωr!;7 u.&Vak~),z&b 8\n!#pu~6Q@qij(Ϻ k ~øXu^G6{bq5CF5-.F֓IDG_c SJcHa.r``T}/f֟RsO, >0 =kwFAq~c{l>{I0a<$9wWko[~.wL{.ˊORwjґ`;BQ+6bg=]>}Ԫj?}y$PF94`GC|Wc!s5_xh3|}}SOg6CYvResk. nCVXnSg)UgTܖdB>ym S0WԳ&܋''è>6R^xK;FM9~ڸp F`G<p^i.HE0q8|LOܚ姝UmJ{_nW:jb7 P4\ڂ}Znugrk9jΠ/1Mr7FuL ɀ̉Kno<IFR͕ZW> ~&ŊXr71?=uK_} 5NNl>퍫1~VAgE %0L}w? !v$D ~:^ D  *F_㗂~:o?:rSǪ'01Q|z?\U oO5MÜ="ؘkÐ~1&Vhi)1 SF;{yUnǐya2+p0ƝvnB+Y& X}{?8޹-C|v/}' М2y-tT7wyS DUï.C-r=a~~Q/Gۀ >0 _|?!e%lY~)ZI0H>2?]~^9:й]ؓj\rp6O3 *ڠܼʽUzG8X׾n}E`VP.IW"GKlo}w@ߋG Cx5|.=Crart8`5EBbB3טK0l Vg#Gq1S8 $Dx"85oW Xm"۞7?틌=(0d`bzぜ16F3-U~$8qjՀj/FOixsf뱵? Gmj pQ}cNiCWùȷ8ǹL }GQmI@h!.b(];=YPOPQD"=t)^B %!޳e3dR6~_?㒝̾;3wWpS N.K6rKP G8󫎉xcg/ob+w[IQFжwp@??ؗl )GVc񺃸x#Ef60+@UIDGQ'uRР(&.^?O^"mC?|Q}s +={ lT7p"f^7 ٳ#<  Nmᭉ+p~{"nȉ:m}V[wPӱ]n~FwF =K"O Tȕ~B˭`bL:fViQQE=ۏХO;HWl"ѻ1q06m"Z̀rWc*s;nVE~o7* 7+i yHOF2s{ [1GDbjטn_h 8b} Z}߮8']wF(_9/Bgq.콘 uƃqcj7=vcӮ7.vpAY`ڴmѿ=-_Cʮ/RYMVXl``X3 GƉs8s.U-:ߘ!"bv.޷_|-+|c0urşO;EKG{b]12@yo7*K#187pFOlg y!7{DTS&5NAJ7ZJ] Xdge^ke\!<]p{23յ* O{ +{:+enl 9a=X)}UP_(..F)EV1W\6ρ`!?J[ؚ l)$"Q}y1 Dt߃ d?p@{c'%_jPROwXhBDM @"""""issom<\J|r;{ b?!'DDM @""""" pMV~ Ba O;Qظ'$rnңL5W`"""""K(w [J&"286l<,N<~}G`|9qtRZ9K7'Xs';;;x999 9U?ccc_=0HDDDDDw w-F|cUgu&T;gAtCVVL&Q1ɉ%N'f͚K1GDDDDDDDD ?#u&.]v-͛ǀQ Q=yxx&~&AJ͞=?"j$""""""#&%P2DMGdd#;3 Z71kZnh4WVKJU Ūb+QKL5a8Z<-* VV6d `HҤ_P\\ҁ2o͚5LQ QIO !aˆW)h#89ȞDDDԜULf j# @&m*gH~ƗcoA"""j 6Km?"j$j"E)qOzm'QTL5U(WW|5\Qsn} j)# @&bǍb2yODDD\Д1$V^s2 D0HԄ cLoAfԈ}q4tjݏ]aL5}J{By ~1 x~olnZ`L/gBm\f +GvKDwkH-Dt9,ݥB^8SXX7* eMݲzqM>H9w'IkRi3wb f~eqj:켔]vaO￞V#.VyƃU,|C@%&{1GD-{ 8n 6?+)9И3-z G;:5^Xwhke򶆓<-4ҥß`:,lЦ8P;+=zѝ̰o~O&~5؅uA As"~ɛo˛iY/ c/FT]2k8{y2i|CĵC{cv_TL!{!WZQ0bԃh( /rZWU4Odv~c[!~u+O'7ʹiBI\NɆJa 7V<0M-ˤE3G3,8GM;N4_>Z >6LisX7X{]3nTg"Y+ZΆ}014+E^t6N )gE֍$)[ +PUY! }\mHL w* O; rs L3U>2.ȶhL}se=Q2@X. 5z]%|6DLF5Hbv5axr1hV?e۱xwbmOe,q+q;}8=}"*W:WE^ߎMîpZ2"qzW::ya 7e/<0/2/HGRy$ 00t\Mxxh?lٌßFnDKu 5?L݈Md2A1ίu70꽷XE.=gڅX8epA'bhZĉ!@@t@'?+}2-[ŵ -:ccP猸3-ǐs6FK#ո LZ$^vK>a`(LZtVODJF`'(<< 6cw5q69#"Щ_f`᫸q+rxuC&eW߱|i$ GzJ\GXZn<XWXeM[ ptX<R9۳_|RrUPݠxq\'8oo 08 L}u/BYXu>ƄoCC7[jDo3M?ߨ0|WAOsbN\B2<aL>⯤@8 ۥExeKn*Þ~cҷO0P(*ۢ2)>e67lOUir[6]xvb2۝#;ty9t!f*Ail؜vE}`x,'d}1}xKT:&2Fqˎ#9=W\kxD f8>Go+[aN~* ]&WOŲφ{vj; Sf,/)9(Kx*ϬEҭȬ ~+խnKѦ7DՍ f͚k2GDLҽ;ݩ1JBf ƽ@eX7(l.6rp1xߞ& /d_^)_a>W vũ0Ep:ZpyO |cḿz>*^"KkW:wϝGl 8n NW+q=,Ml Jn^g.1a]fV-,-?(6-o\Eާ`t]])G~ Ϲ䊟1wp:Y#n: } BȆdYJ  b%7w0nzZ_.zOهW8W{O˷h4hU+:;S`9 ;!cOG߇\kqb_\ډ[AȎb SJ\`.QqCY#㷯t1r*keeb|3TqVq2 +4(.@z{Z!.]yP(KW2>uh7^ N=lF6/$îjڼj.c! |-f ` 0NDeeX;<6a~wr6 \+uay/ì0 W-/3e%Ö|Ov+G){0]pKyea qqжr@#SĖ-[0g{6n논#XW/{@׶(H|ït>!o;DF-ذ-z#t*N ?b#(w!Zb ??Am][KVZD8©w5:xV+& ^=1mWǡ@t7C/^/Z!b|ڢSqmѡCd'ukteݒ}= z>G{bAdaF~ 1A5=XyJ|_gk6\u.YM@޷|"àʚ]72r5M|9zWq:y"Zסv  5æKp{l[l6콈qP^lk\Wfx؄tE(}aҨie0~uOeT(.*Tȸqx%6/uxQá߇x?:}]aRվ@@X0Mģ2~?.9x}T᜴GVn $L3;\l4m|ĺl" ,Pe$gt,1~O<6.DuJwKXgG|<+7 d)s+p,9U,3g6p:(FP{Z5/&&3gd@ @'[t%)Sh ۸/K၈p'<~75\H(*%4j3 qWˬ]r7s+"Z], cwe8p'o[֯@Wְ1tsڒ:F8`8$:OE|a>Rg"=ċR.nk+$BYr2em%Q!J,\gfÊ3|*Oz%ug ֿ8 żpK܅}90 "m1gNĎ Epy$CpBJ!sՃl^UU]CYiFuW}FMOD2㲨E|*.C3%1%l:cO~sb6 uxPRʊ,er'#mB\E)PH!/6' F b*CD4JomBZӎDյ47c {nZ\O F7/k-irG6F߆_ G[ȮװLi zrv'ƮlhB({83Z~a~NaY$[Y⿥e{Z+'~<+khݖJlmņeGirrŷŷ6B>I 8Ȓe8dXҧʤGtsOzwr]W*<،Z xhB+\ 3W[lU=c-P[lpYIɲOYϠcM\ ?d{Qd#>I^>>M8w&T!bUbԋBb(2 xvdoDJIKxK?pRnR@PA.ؿg5 ŐJ]ӫc_f8H58qp ]^ns3VѻeJ6ܣ"KU Zn|q?,g|u8Mrw6bVkk\eȺu ڰҞu*;ӈٗБ]lfsƖG1CwؚRM]Wezvw5xjUˤH]~|{}zQ_[}mɦ8pm`' zzTz p3޿d{ǽThB5lpNCJ鶤?ݙ`U?ÿtǓ~"bHwfnNc&g,D8RHqzw^tc9}|\۵ SQb:k0u\,' Vv]"z:fQ u. e@?"M ,͹cIsy<Xl,YU=ػ noBM S~eR\`V<1VCa%He!'vpnb=Wġ.`Ys~UmK4s?y=8]tkek+$k*y^ q%]òd% :nc9-|uSLb.`c i@dg\ z 9* `1tRGhcH&$_\'%D"(THOd@b򏈈 @jF9@x#'^m`of |B9Dx:xb!/s{Hxs"qVh;nVXi+ ķmKeI;S+Pɿ+Jؘ#{DM0nUr~J[ % 3't|3cJ5OȄh>R.#-ZK]wnOA{k>ݩݴ`ـ^Dtϟ1DMC믴P3_qOƈ1Dws k2G %;L@Ը#"b łѓa,ϸ!&1f?""=&jg37GfV,ZʐA& d_#dZ =nJy Qca򏈨 DMΜFtOe۾r>'+K~Fj 3 P2u ݫLzLwWFQyL5аVػw7مm'@Ov.KzU92~ЇVF)TRPH?Aп50&n Q+ݧ/.]QPP]pq0hAmTZJQb򏈨rL5!Lаp@DDDtUzJI?񵸸EP\TbH ?"=h#"DDDDDDb`زe DDU`Z$)7k,`̙ Q$"""""ǐ۱cf̘U @""""""jQ ɿ;w2GDd&Ő?? @""""""j ?_&L 5{LDDDDDDԬ1GDT?LQQ1HDDDDDDDD CQscH`ƌ Q= 5+L5,&`򏈨1HDDDDDDDD @""""""#"j<|= +;A """F#BAV ZT*@$gۙ#"jL|}}""""j4?)gHJ!g_QQQ@Yf᯿ҽQcWWWe6l?̀5tٯoL52&Ic^KD$"""""&c"& 5 & &1GDt0HDDDDDD?"; @""""""j4LyJz2t5mJoҶhO҈l>D2{o@l5ggg&&ޠMUp*brOK "Ga={6DD/&""""{Pdd䫠e4DD {ѽAGƣLgqYR߆fH`ƌ Q3 qv-V>C@,ݑ`#"jx 0s fҹh\`/chL5?L]Off%t> B}LG.C ɿ;w2GD `"""""Yz!r-aPcVJ>6iDZad"P&Z999+'"j,vvvُ$""""sW\b#A7~ҿ?"j:yyy6CcDR?cxm9wj?"=… |2RSSFP(WWW#<<wPl3'`\oɸ 8= / |B:N[8axdģlX]/s8i`DD-ۻToR/::|ĉq|))( ҿ_'}믿ƪUp֭3'74]bx`?&V M2^=Wo)ӗۦ$?_g;S}_~9⦊5mWɏÆio#ccwd 7N7eٛ>Aiq{CW7lt*R|U~1^qu8OMt-D3pߧ-)wf򏈨a@blݺ* w?lmmacc{_J">>^K͛dSеkW 4JeTǃӞgZoCY0%xh=>zȽ{+4qo]45\}j_;<.,sN>F[GͩN7}Ly_ >5vC@8t(9?T`϶as߯az_koإ,kNX\5qUݎ>-hB_cuxhu}Sz1-5k;!"jA:IKKŋK{kw\\\*tww];`۷oǙ3gp\v &L% q',[w &+}K"o8b91MH3p*wo/&SG̟pI'';K05Ӿ?Y>ٔ <$]o?ȅCwC0|*h Ptn E!m:/7ƕL:'ꓘ쇺8Sҝ ɫߢh py^S tF'>Z|6BjA00,F?Ҷ _YM#<L :%1'Ch|9<VP)>W9z[WQ%mBļW\r.\ڡψI_+W(BQIcVOF@^!dȢd9'f/|:YuTM}kQexܨ~}>}`K} ;9 )Z6,ݚ#> ;|8t%zKIe}-6[E³9b_Gjfdh=ѕ)GQߋMφMZ&'aƃg4+]4H=~Z'_nu;{Y n/ane@0_G 7 {W|wVL줧&0fXYYy~xtR\z .]Jxx~ݍa˜?5L(]U ?'kex߶?EOŤ0Z-Mg˄ygg:?·7&gY*s Uî%~Io`i[켩 BC|{/gs1C\gs}{*n6n敖CU:5,ۺ~YmY 9?y i~K0/J?cW\\epl=O(mJe0u g!U{DPWfQaP9[.(;+~h}. 9vDT~By~ TppBa-YR;}2„DܼRrE!pD 6?6 %v+ƊiwT(}gP^]=X['#.@q1+|2¯/<k NCL?,\ֻr2$TLӵO_PqQ}6&d# dyR@^)\R DbBXϜC^U( qO"N#q$6/d3HZcw7؊Ef[,V%@mfwW d]?u?@tI 6j)*`o<69*ڎ%X8#< Ϸ-8(. *=JӾ\$9̠'?B`s`Oɖ<%gṶʺMScK0o,γ0 V&~7~WVMעat!;BHمy?Tm`#lk }ױNY6v["_ˈ4õسW ,:Z3pqҭ>=_1HͅJ’%Ktɿ@<˫G}{@%%{Jx'wO@6 x.szz>Ac߇zAth덂Ct!%&K @H8x=soU1rH̝;=^-S~W I,F}e@ `6؆Vak+ɘ0TvLZqRzn/>֤aL܌-J.3%bbV\S|xP8ʮc㴯tZ{t/ p0?Oވr?uIJ8u32=NkѰ<'YvCki+#Ƕ5~aDX_٫pFUZ|(HACdV򵠭nJ%&ѪP”f-J+x$\c9բ˫_fMuAi>Cw,|;;I,-"V2<޹;ַnT˙V]0 /ඪ"#A3+rIEl>+f!۾ϦbB 7B%dCL Ǥ9 -nPT%TkqF ;KVK!ck껭;6Բ=`rh픾K GiUC]Ջ! SٳGliF[Znxǎ O(,nF& Ϧ"(R;V')I0^#qa_U7ayDk•Zx·tt09omg*GˮogJ{Υ" cUx!Ma ɕ]!c{[bNDێ !.C۷#~k EX 6,;Fgݝ׵LJB ʐ;t_&:X8Qz҂3j(_x*J wE&L'5/XqJVIwi?Ј󴆳l!H!؏ ^ĞIĺ6 ͤe*{.r{AKPgح/F=>'OCQ9Ȓ`SwspWhR#; P]1nA7sF{q4e;k.^~𖧊Tw`[ulmۤ84P_l~1{l=#"{ ըO~fb1x`7e1_{T`5 \ݶ0n{"}е?/A* ]٣66? TJ˞"ԓ{p7xw}!m`Vx7 hbW2Õ_k8 j#N_/?5󀫺{A6P592,S\e˲߰Ҵ0Ḿf?Õ{2DDde;Q@{/C9 x -=tD^ڏS C oaN>v37u]M+i1]Stb6^v3 \߅l2AS9aDR$ tv|:NmLǕ+W{Bncǎ񃏠 >L4=$l!~&yC*c/5v?<{ -uȯ[& Oݎ?1ŗTX⎍*~rWEEä?)mXXX //Zܥ#AdǍҥK5^)5^!/+U;GB#J<77ǖ{ ɣ )(A)_&ñ%yN@t ۵)  Z4!4R-c˳:/fxr瘷qtlM1"KϢ*AV=R(0g ?ADˁF D)3ϲ2Rx%0V_=wrK4lݏȪhn0f2e"Q ZؔD@h1[j\~=$  ⟅A- 12˭HN<NNNFXX }  h<#hPЈ%Sh&\W_僀J@!?}  h<\AD F:}^ `u^yAA;˗/lj'(G gllihΫ:o BumK"i4?> Q$ YbǖSM#ǩ'G5 |m.]ҥKI A- T*EFFܹs:\p \ƍ>,>Oooo3b(T4C)_ՔM<"Ơ}p*Q婫K!umoj >TsgUּ41: ,uFq\_m)}MSY6[uWo!AP(HhGmTZ&&&4i z @63mM+nbWR~Nx:R-t{|ZeܒASYH =C:''ŋ@ Z0!PDDD &&o߆iqA_X={8)s,PRS0A-Yd$_ɀK}(GAԄ lllgb׮]>}:GII vޭ[7oV&aq,+4b^.&#+e0G5!rO6{ ٶscl[)]\ݹ<VA2i*FuZ!(/9b^Lj0wx3K|/6]AVa%.055.6" n(MÇuzP$d&pݥ$"sQaꌠ3v0rT߿hdE*HkT a۱H$*aѦFM!_.! ;OfN$N8oU'ofD}`)clG7_ >yN_U'FGK4!uUe,Dž%S0a8~,ZW5T=)o쵳]*>uG!zG՗gh oy9eXMCvnig\ ;'vN*D28vð 1y>@N`u8?:uU=ufWuGbyHȗG~kZ]7 qiJl;YlV>ئm_o4ZBګ7V-v.|{4cÓqe,%2_Y/ڰϪPpd6{aF/C+AA@iHIIAzz:o_!g#B˃ 飿r_Ňo{AZ #+)Zq 9S+b*@ ߻i`+6ΟE1@s^ҪfoN&D0l7}8֦Xw\=Ir5#2𘄏g*׬_0xk.l6^h}qe I{vܨ`*C̆yd+63l quJ^Xhֵn!y|6|EAP޻;z&rԱ0oO9Pe/ˎF+4NoUgЏ6riH?ꪖƕ]P ODݗږ+q ECu7b^dz4t Ÿ`ulaТ`wjۙɑQul,DڊQWxٳTdSwNܸ/quytǖLE;[%,в7zг*ć xF~E@}]T||`*xZ2P]G\a%rcQ1DPyv&! A$ZH$0aV^$[cǎi-**¶mېkkk7K00vG`GnNdGGqA5)pG ĵ:4x3܅_ӡJSÞ=0Pj &*ѵH}M/$jyi>"vϕl3NS7t{:s"`} dBÁ\Lwsʻ G.z b<+ Zf6.@PTkmjkDA Tliޠ|@2G}_Sgb?s\Ijzҏ`4mz4&]^`@ 0ep1Z !+j}G <+HE^]V'Ui Jv@pu惏e+l&CX+2LMċ7- lĽ;x?J-~Cmi3g+BګZލWvNFDǖcp7Cܻ,ch$Ȼ-K|i,HP  BrA͛7;.8zh8::pΝw,,,ީ#E/}o<&l5ub(n#Ŏhg-㑮7#FD{(m4 ( nT5Yc WCujsL+vqdž#qc8GmY+d`Ɩ'^SiH4[(GAhNp~'NSNh___>ǭ^:*H~{ꥷnʄ·V[sxreA\G\zx{X)3+㑬j^野I*84- z7D^MܯuEnߐCF:PLa/xchA:9It9P:<2W.WKҐ~Bg6/#.p4< eQ?~m@v53e&~\%u=r:/pX$/[78tV*de.0jEЇ5MHMӧhk|έLt[}y脑60 r/gâ8vOձӺ (GAPx*ݻ7N^upOI$V V y7m[0|!.B}OtQ\x<+v!t^N֪[;TpxQr8Y*aj] XxAZe}1-LyR ѿLG8 ~)2V­9J)HyԒEw }cd^8$vr Xvz6^?ZȥahvD氐y ӝ줇2w€^tSI 4'8{d EuGoZOFΔ=;zH;1prp 輳w)20|#7J ]a_ܣ}=d@V2 z_4 }YCu[h+5EoU^[a8bqv1zWUߣ|u}ce/|z' (GAPxd1b įKHH@NN⯤kii [[[xzz uzm>>1_͇c[ǔp-6sK`t*FK1Ca6/:#ј5.VZC)1>27Fٵ|y,Z N~&0yerd5mam{_WU%**[ 8k!ۆaطy1(2ČUN_U\׏vmi>cGXw+:OC n@>"PFۣa<5gvIc)TԹ~4йJtܿ>H6 Ǩ~Jl-N)!Y޷2]h51!6 AjP^tDОUz {#ѯXXSZ H A-<%dᆸڭv̇}:N% UQ|99 ZOl=Gp9w+q$aq,+4[[JQqkg~>E7~R=x)J\\.GeeWEE'e\B?1XYY0qtR/Gyw[YeUTƫOV=x6 GLޘI )rw*h#8vGAn rd'; ǂOBAA.Ј cRO7R + LFN^)p3_ m]6[$o?{ A~ =@? BWh ӢHLAACই-ٱ~xҶl   /fff#    )2 ˗/A((HAA 155ŲeoBA    \oҥHLL_|: h $  hFpgq~0| AFB"   hpXQQQ)GA AAA4|  m&  AєP   ADSC@    A AAAP x\% (++C\\|( =X KKK044$AA-_DD/^L!   ߈\.obܾ}H$o={䃂AARA 3믿pT*}nnnd055 !99_%xХK 0 uPEwz/Y{98a.;ǛLf<ĝ:Ȥ82+@̡=C{~~kC a_yIm;OC?IP '1Xz5Ο?;7@>}mZ܋}pr+J%Ν;u&cQK? Vd}8X>*w (T#}en;X/\S->)F ?(GA=h=w (ĥ+X$gBjno>g]RCzHi*q,+4bU)\w͜2H,2q.> *g~Ď󉸝)Mam8H|/6]AVa%.055.6"rPNkNY`aoQ]\a\SVbmx2/x6=zGWV3m^eو9KN"=f~ ?N{3 yȔkd.~i=y cUxJ00sP<}ݍȹ~=Ȕ|ȍaSLC,,]?cS[!ltÀVHNRz9ٕ0u@1cBM5:>X.g9!l)M}eY?5uk#^ihZFu)x!l~gTeK׎+xƭū)GA$Ά^z%\~m۶01i8#4miii8y$^``?#yޝ00y(\2m>tz ھ6 8 ~c0 HG-`&;y<2vb(ٲNU+k?ǷMoxMGㆪɡ2y|6|EAP޻w!#:ͳ ʳyh+>KD_eOir> kSnn;y&f.=U;?A"`F_exK 98eLܳɶ|Z{x7=s~D`Pgl]ܰ%:+\SE%ȭ41A1.K^Epf;.a'bdV21g#pxSKDȾ6MDu1$.+XyTw:dv"I,<_Ymϋ`jb܈frpq:}"ȸ 1듭0z̰-+zab7R֐Inn )w1 w sh.aR]Cm/H2paz}z rf˼y)C30eqȑ `?f iWXxT !*&Tޯ1p[5h|9[sD ECu7b Vs|WE:^U!6lZ9*F۔6F.j)Uڮ#ԟ L[~XRVMihhFڏGH`^_~WHyY^AX;5۸w3$Ss*AAPh.p~p~ppgiV\BǏ7T9.@8j(̙3 @b7wwyϤcڋW| N*n"&^ImaXt{~OK?.|C{'={.`ǡ0*{'w g|CՄ G.zC<L?둺v@p<;wؿ2F|´u V5#iPU/'55\NatX˹zH\Щ$d<= J`[#n h8lذR?<:% Ӥh\/NP܎Gb-8<\5(vD@;ltE(PEzRg#Ig1}{?!EÁ XbOM] U"6u iP.AZȯBS}LBLiEtZH`RleUTY1`#]l(H\ܸ+D LjR݂iWbt1#F?PGȼ*Ʊ<%JKjDWRQ¶W.)ѐ_M j'&jVB6dF/}h 9{SSH(Xr#륃̄|~tvw 0V{ơ#h9JJ툠 G,:!1Aɖs(jy; vksFtDFDd(z6BA`S]͑DvYߧ7//_N? ēCyy9-~#""0p@Ӿ}{=?!ޞ͛ ̺ FOY4 ip l ;De=*2 C/8qcw,TN@%'W תFp4["p Cw8ԘsTO"*㑬j!CGow{yL$HN(k$gىQ.S\¬8[JC%AMv7 O_cix.s6Z{Rر]EaṴE1 A!)t@ *W?4/z?.5Z /€|q]a% GWC;4cCDzZMt%\\ [SaykJ[7)WL(lȾ Ng40DpwSN6ijq޿GW( DZ _tQNT&Jt=ԯ#쵡f]fZۡƾR }~X'?RE:ԥ4뜮==w- A ZHh$11mf3cƌZh:7&\^YYY|BpKY3uŨa.Xf<}TH ;R\3D [w!QŌucqÜ `p{;Hb^P\qD+FDf0qpRv@؞h2r"Or:IuM/wsU&'u4B*$Borw8q}7렷0)m ^XQӾnomq;E\e~ƿzHcLEJyբF)gcUc'efVW' E8Ld{yRtчٴ(n}v5Dv- -mډv 3< ۉ8;U9ȷA/ iwÈA;0o?Жmc9H)tD~ !m6m[0|!.B}Otuo$:m=Ig,cH-X[6P I$f?9luΣkwo܀*gUQ׏` zYMa'V>G Q45#aT] {3=AU=# 6UӱCKJDF}Z}ktLV462^Gt׫tV %%%a^IA$+\ MAPPPNyq5gGg\?ņbn>`1Nh bxDR5};J"czl: A)5S{tw5wZ[3 @YsiJͿ,⹬CW6{Iԑ`{IFQ.u[WjзL״kAH?,̏/kc}!:n#O`'8%i^a6KEa<ۥS37| A:D 퀈Wv:NmL| ;k=w\s?255ٳ +c/5vDzQk(uև8l[UQ|99 Z$@ cӦ˖؟F\zqq1Vr9K?c&ji}8,Ms(SPp hu/99hXYY޽{$츑\tƋ[FRYŝ֡TNz$4 8jԘ?G "je2 z$8*n"Ŷ7fv@t ۵) ]P `,&M2~Vh%Nm5)GA<)ШS?Qes5I޿Zɩtx+* &O/AV=R(0g ?q?x:ti@!F8D2NUIJ$.Iv TX۩l2 AO4\'4bddo.**cɳAM//?u#dƒ11 xrae"Uߛ]ڼlDLdx3{CCC~{7QR)O/| 9vD\ KKKguPqPPPAADS,*DكLE(T=2!q~P!\P$e}pA'N>ģpkW7"rp>.Λ   U^*R+]jR,-u366~~ ' Ј\XU7AAA4);8޽n" q98o&E%KKhKgmp#)((6Wn[sZ8/xd7ͩ< n1'ͣB VdddΝ;mrrrM   ʜkk(o@wQ'EG섓KsMeee ^L'Vz5:ȏD@hߟ_xQ3I < Tȸ)y *q 2NǠ*LEd ;X2V x>  4h$!P~mLL n߾de={|<_Ö 8{^<%WPGFbrq)<zcGǼ+ @4}RPkc? LUW-X.   ZH!!!8{,vڅӧ cܹZQRRݻww֭YsWnD+ns_=)`Ë.K,;w\~؟c b)d8icQm6Յh&AAA )))HOOꫯN\ .ͼͪ"x}B̀J%J:s@1k8s&rG+1gUJULa|D$- M{;);-Ǚcq0< G?Kq+|f(Lѽ=Z($7 oȮ7ty mM EQ8w4U-C6jmv{ p 34_?bp1 C6V6jF{O9$D &`HJJºu0vXPTTm۶!-- 7n\=+aWX1-Dۿ l0->/_g+1ū:p}9ah]GNô!0$Xe:S\F~|9U ."Mǭ :EɘD]ԥ|4,9_gc۝ ;fcx0ӱ-O+~ʢ*Ckðlr*dpUD L߿l+qHʼ!,Z_p MmSBQs;/2}@fl4.gbv0`o6:;0C곾0?ş)-jۦtBcXӐxkLXTf T3(U=}<`t-Yæs9y(.g`j/LA^Q "S!72kOL3 !8“W 9ۆbnP>ɱOm˶3\^ h9}ۓ zCrx[4\{Qu w"£L-P0jƮrv" >\6T-A6jm*q"*F ax6i%>EQ#C0:e#lSjFvὧcGh YXX;.+j°0>-.M.mM[51F;qWB$+TE'V eGz4(+g 3fP#?/DR @X;ٙ} ?"V&(}ŏ'iQkH1Gv0`Tȏ@""`K%ʢaY,Yݚ" <d0QXdˆ #}9ZQ'ӺOp)%J#S Q *]3K!2`PЊOPv3ȤȾ6ę"H(M_cՙg\jsC9$ÞS!{6#>msc% #/KDYc7q61b;7JQ[ >-$2ɗ;pS6U4  ZLϒ헥K-cu9rQVbdpJ`Rd 1rIEadjtMu U%J_/|9IlPƹZD3КVZgr[v-Vo rg !77Qڵkx饗`bo&l;8񉱈/ èSPݻ 9pO@1~%_{羍Wsq\An(bwW5՝cv0r&~%^tx8w4r{ c mWp52. ot%^ae Se T Cdl Sۊ!+ Q]n`m-Z- ={Q tq%r#0P*[p1f@ ϗw. = ug1{kK_+Em̧lp}çdW<܃gg"pyseY{9Ο:u@&6W~!brVUn*lVkBcc1d@y#! Z "SLJPNUR dRvpmUBAacQx; dڡ ɗ3ZVUM1V,:ڙ@Z?ոun$p YQ+n# uvBN8N_|@[ǽ8u8..U(Ko  7Sp-Hb Yh iI bb2` c]aT;"x{At5(l(PAG[0-'Eö=cq).cHVΖקz: $ uR%!|0Vÿ8TS%Mo]G  #@bc":WYa@;^w}A8Wi SR7|]8DiI9o^mXmoXGT-TC4y!i/R`Ō8cF~ܖ;q V@NᗜRCeU_y#! Z }ކ+EPJ,Ѧ` VEv%3%CE6UeS[%2cPt pDtT>mOjFj!8z*m" uvrۙX޽{#00ሊ{='2}o[z#$T t&:4EPlwrzz?<γ "RCBT˶nH6P3̼y2ŏܵoͳ3ѡ fn%l %[ ھ!2J]{;-O=§Rْxl3<]pգ烺`3?B!X.8 t s#'B@xe&g؏C TQZaFy5}%4-W7Gu+7gOi\VAAEJ&Sޖb7 ='O9؛a)IVFLL};va ^Ɨt WeG"5xDr!~=YP}\qͳAca[ַ֏|TS^piC ѣ9T?no'qGlLf 3įrgоqst18f/Ö綏p5/n1SiGs_[w}pVR~<}97[Y{SEf\rm/>ku}uaTѐ1%[ 0uUAxKރ =Dy t 8پubnG_%)/toe:Bf35^#e`-d֯[9!&8:i6+I٘ZwU72<Ww=B]n?%DRQW}[PehhZ{ ] xlJ)Kƌ#vFP]p hK/vu|(6FG<նIP.OS 0: C岓]n\1Їsz=o|}ٔC.l}B>as(z>*@Qj2omdQ=>~v\9i=Wk$&rfeihgכ3T$r4Ok<QLC}̗kw_J?:]3}>>cE&܃0hm99s.+A;na1I/M ھV7!a^$Ohr:wUsl豽 &:/a^qK+6ymNDhH 9m%v m!\mϳ*^|ۋBQjbXN-ftj1ԜZfΜ)BqIHHb z rqZi2!B!B!.I !B!Bц=lB C<.\Σ !B!I !B!]OpS%&h%ݶmi/d3Kl<1al5SĎICYWѠ՘9;2P(X-+BB!B!.<ےs5)#\GՋQo~IA$Gw< ܢ5e0R3ٞ/>!:I !B!N"0hx_lY S',dO5:Zj]D3nT//+dWI qqB!BqgV Y5 .axS`v6kn˅=?Ts/ۄ!rn ;HdHP!B!XLr)aʣ)z\.!z,f1$~Sw k0/gHgߟ1̼ڟ(Cs!!B!B!.$b}9w=2:0(̯uSֱlS& A!8ڟbvߺ?hHP!B!(5s7w$2xh4\Rt\97'$ȅ X!B!YOG:=& y~Zu@?;7R7:eUY)K<2^m_,[!$(.dVwMu]nVHsi:9W܃ٕ^y(:S֌o9SRɯ7\}5S*/cbocͣmY[bl_/VΎ1[2K.;߽jk6޹S`1S@U!$(fMa 먮= ^_&=28'77=h҉N>0-Gy|Pr :Q֌o;[nG_e]U+|s1絅yb폗*BH/!mρ A=~^Di1i׊ŪHyů?vd2xB!EKSj1Z^8/Sݕ5l.\F-|G~͜w]_ XC8&qSbkaÛw=ñ^ghl޿r_2>{EH-hh?'?kgMe#6E^#R¢iR?rMwO4J~xđj!>ǮPM3I e۟]gʆ12, X&1ǟٝRѳqg^x9g=Z:)ẅ́h[_cuK۞brjEwt'e&t>\u'G.?sd5{K06?o6x)gG_&>Z>>kTǬyԜ"*-FN[{Vmp =:Vn߽},|Ztu;)?eWj ]c ͩKc8AN3}x ~Gv+GR`8kCL&>h̝6;-oΌ< hvRNXp 5aZO5&bXo\NT976U_g>՞͙CKsr ^m)WǴ^ṳ[ogROdy!jd0'*t:)97۫V(] ;O91Ɔp7|;3&~ȓq$τg\1nx߻ߵ+vμ-)3!Ar^B!LC+k# :ֻȅ^qy/~GDPC3q;F?'|SҪƵ& $qC ^?jO&-la#{}uVOSO1{y&u n*}z3cegM1ʾ~xi;#TwsCGy16}2}j\r6]יX4V'm3گV_<31 Sxp5_j(xfpǛsM>y㭩9* G>羶0?qk7R*-/uGr"&-3}9 1vo\]ϕ20l=\ZȂY)TE~1@hb2tsLFrDaR2ƉqUgGPocøer |v,y_w\K@]1y)@!c">,9/sO_p{w: ^L1k*gCy|| GSxҿO_ww9;u.zW6Re ϶^/7' ?l3Iطy;M}_e3^dڰګ2ܗG½ p`qף:8J6ueɿv 3Yeh&Fka69Fk ͝ńٌb悘գ=SKRvز,ZЃ7'& GLu|,Y=ey<1! 7kf7j_Ep3.Q3{0-N21i|Ksy/[I3ԥ^gBX[b w}7v'1Ye 25P^ʼn^koņoeOtu^T۷z{z>45~s[SsT\z#b_H'Bׇ6*Nǰeþ\'Ŧc̹щz5Gޭٌ9T)kxsv.WÀc]'X,ɏ½s1^o+}ӍٗTø\w/4I8fDOM{T1&vZsc{٫`F Ov$;1Pw|0h 7^Y~2ė+wpKga$6NV]5a5DYWL%$B!$(L `D7$P: ^N ~q-UdmdFP~t:@bJͫ4^D"x]n^{%:]SE<Ի%ؓQuRI qIxpYv%3 ƛ 8`~:bز7W|ę:Guh։q`[syC搔TkDAaO&'?ci"Ⱥ۟[ J-/M)W{箵}x6N^dʜe([o⸱ >F9Y_.mڰ~+ky:C׌cÝHtGNGds=+՞lcv1fuK2_BHϡCJyZK[,3"o AgoôzHPKkƏ ^#<;IĔI}:R/øvF|q88_~Q&FGyAnW\kvg%<27s>{ۧ-jyD/Y}J>%ؗV_3W}3_~؞jI/ =h}FУ+ƤCh! _#"[ 寫 "D^Ŗ#(vkXNݎY166^Q 38OGpo:o=ĭࡩ•ѳ?8\?b9?]ܬO_Ow'?f_;jF쫿{co97[Y{SEf\rmԂ6 j./3;9q`uLs͌$_~hⳎxcNӺ㭹ujf-KLcLwttΠ('bbh}a"OL4'hs۩}6Cs`K[s­_EHB溅,NȕP7|R߳Ĭ.s3h0Fti߉iB҉wuiZVT[)Te#qO nFKU>gYNgnW<39 ᾗVĘQx#T?課ٷz) ¸^귒||D ~9mj5w"rِA9WTPR~RJ{%~_ -crkW] zsqK_^_BBp?~_cO)\~t>]/`+j7>}SIGԔ'Y-˭=.ϯ)lZ9t^t_Oϛaw`ټ͘=ލ፞h{x}>__}^SQdhNjo1WSydF,y義wǫ]'ym՛0/s4OW`wF^9F9=+AЇ-̸#$HK W'[F֓Qރ1_|v7)TJӞ?7>dlJ}WL{i'zY~ +2ԇAnnkMXߙ\O3گa.~g|>ӕ2wa9V7!6.9qϝsxJ-g`'5|C~G8+u~bLq6]=-oy]2`(c8߈g&>~OVӁQӮcΔ1~9i0#g U{]PEL DGƀJ>%gcy sWw14 w0^ݶ ƃ1Ly1~NAρ-9M-Qjk6r -? 8Q/|Oڜ`f^"u VM*}IZz&6dڻ>l][=W8C"$A{r'Ϧmϳ*^V~"⼲X"ݺ?zn-nzr1͘LSh2sL `K?͸{{7ۡ!NÙ6!c.bsv?qS'ƭ*' ۲}5ڞ0=wW,>n{Q73c˖ж.\OBo{ieuq'$f0{TQ5+I̵s,Z]LVV6~&7L&2k^RWY-C>^ZYޱ)uNl{Vk~:R}:1|Dzyz=)?~^&cW! M=3R~fq"^Aj^} W-dcKuɌ 8ү(-='2->7 Ⲯ!{iOe716о"Km߱\ڟe_lgzl4+}VuS{/tb2ndjN+opWю:_ Jlt0>.f 1a%v=R VgۺɱXVL=.a #[lba'ۤ\.t>NVPiޱt*<7\2?!c\߶\:ֲʔv ;/FLg.>F,*/bA/^OIG.zƣk-gbH7 U Ꟶxv@B=c1M^9#0vb&gG5uʨMbO{TO=B1th,⧔'tjvgWue hW~l[AOI"?mqZRizV w 6;UA j[|kfcBG"E쑁@96خ*]8CLZLF "q-+{RH2KײC?Þ"{U77fĭp`u@ / i6~a=z*a%f=ng)+W4hחS/ѥSIlx|5)Wf^0N iGޞ]c!Bw)bUp EG?,.ZsxRJnn%NjxT[eNŮK?Nǫ!X At琐V_-SBU0{$dWV$'@уªs.[PY^ϻᦧJ* vqiV3Ӫ-onMJL;6HP!B!.B'XK1S]x&N%$5YŊf$r2ӋFРR2%c k70t̴a(IY)J5j dMm%@۾ gw@u[f&Hjғ3L[*՝gm'JݚJ%W~vJݓRҍ^1}|J?Xɷ; M[JDkjqӜ}v¯qsUߏt>Ɔ3@!B!.>:c(3r7~>M>*Yt/!A )SR)k΄T'Ҟ N@*RQxƣꔒBmOwx NUP O]{B땻aM[1c6K+yeKhUVo3 RI?L9nݺ5\CTYWIYq1ŧ*uWLU_ro%ztotj5ލShFn*VͭS댍C\\ @!B!+u1ʪh\?s ~yRƞ\;.n߮N=L)9ƱXtrloLO(~ 1gKgMNeOR&^M"s+z/;Fzq%GlWʏZ|[5νB:[LFi7 !,DIM^qx6:ڷRLA>]'ExX^b,GJ+,&=~ /rqsfæL%W3)n#|Qu{.cB&[E;R󹘽# EE嘵^SfTzn㠵zUTv_jʱtWz8u:X\H !B!EHoct6Ng&5hT fh nzS%%lY2ʼn ̃?nPUή7KRgαc $@{E VLdo]Ճ9Vslqғf'C e|4V5k=#mgj(ʡ*WLpETSƖ8PU}אm#2`lZS ;J:;9WaVu8.CWWu5eQXTFBNR:@em־CjuFJr.Vw"a:R[ZsBz+YUπ^C*j*KsH)6:+Stcs3En ߘo}u]6ΐ==>WqЎ ߏI }Wv{$>~8U9q3{RK Fc)~-ieD\}:9.C۲}+e{ F탟FB\t_9ŖdX,ٌd:FjjjN-3gΔ-=0'$&av~}{[!h`7Ŗ5[libKŖ]WN.:'W6xZEn>={/܃l.A)be C;6rV̑[80tjZ~]&܇b,! !lY\Tq]l ìϛz71Gys .C۲}w}œvN+$5=OV˘ߘб8B%>[ތԦtD3B!.-r.zqǮ{ݞTY h LsJ*kxҕ;^'7^#:]Z}څ?˳h\B0庎nv=㣵!-S\RoK@MЬ}BK$hl8UZ\bG:]J}ڼ͛s0kR#k]hE!DH2O!$((3I e۟]gW(]_ XC8&qSb~9g=Z:)ẅ́hO4J v[XJ5n{5՟cwOw[fBJUwr-q?3+c3٩/WL[HstX혚C[&^y' 1?a_ByI/C`p Z>M }坹d჏Y09ETZ\O䮗١D]AdeԊBzޒwIqiv]%F wq1K?qȂgPOM=uMAh('ڃϣڵ#.{IhoҪfsxT򊫰Щ0vFGԽgM)7ų#ݯ~Sl V+,ýt;ݜE ?>7l9@Y&bl^[-7z`?apz|_OwB?OsoQuK]׮Z/\:#>[&;`[m|wYmWugPeu]X_;i~雭5MxSo_cR!B! @!ڝG @[vȡOo4\~i?}sP3o>ӣ]Js$3ص-;w_qnOqm<@ l_! ^4 _qu{BўԓX>M5v<,ŊWfSlx'FCD}OiNf)>Ḵʌ~7y\ tDi +x5ߝWn#Z_͡fԢ#jjxZK]$ծ/2tW079k2^~\ 퉔M?ݴ'ػ; n8sgxkk)h3]fHk?ixtG~jӮTwS^Im 7jWı3Zml[ǫ>TPpl+K#kԽNw8]3>cR!B! @!.SI \=6^CɆ!T?ҥ۹ax?-²lƋLcNHw! .~f{hbE'1mאpL\= :.a&2 ^7 WFOcE`_-}V4t`4ALwu+m>̽cfcTиpYLС(g ]=sm_:f u7\yy-1̾;Kٓ2tkY2nSx=op$Ι:IہIs}~3AH O}y6Q^RJU&^{ρ"u|,j|8cOLZEM9u0|~ܨֹf<}?C\Jq"^ a'rI̸vH8dR۾ ||fgUB.jgmnD+@x?WQ{ 5M*Ĥ `cyd/8l '=P_}ZiZ/{CĖNw<ΏpmbHyD!BI qN,ǓI `Pߠ_4ӷW{>ߑLe.md#WdkNs5lڎtԖQRfpF2OPcPeA DJ!2+p.ҵ[3)+.5<!ɛ3aЫ<5 z=-y +a:[]EhwfPYVf/rdAI|TBC'kQOҩuڧvVgn1W;>~V&Z%&*տsrFAϤ+p5/o x3fhV#.`wB:wd16wNZ -yC03 Zvڧqzީt*|vu6?c@fQkA"[+9iah_ٝdHt}KZǪAB!k,ҼZ.Yn;mnlgVCsiK?q0i`K4V&<C]"jko7KXz;Ik>%iVn;i'ê4Z-ZJVFkjcԕnֵ׶D1|@]E-4f'i~Nz0+6ʭ]y`ʷTמuuox0Æ^1"ou&^v ُqlOM%zf1otxZ̵;Ovu=Ήj殴^w0-ho6'-|~YB!Bm .PQ^i?>&uJ ڽSUl(5 !g\ $\ )YVFE=Xx1-4<~'+x71s_1֖6(Ε\(vacT>JeKb6YeTy7sW_lo+(СXZg "B#:!SI.w2qiANR*8'mBt֞DٚX) OTOe 7]={>K4,p.I;a}=LESL2?|yg^W4]*ufW2gk/cN@ƎP{3h`gQхZn绵\3@sQݣհݥ ޔOߑ~]Ƴ3ѡs,6oJٖ %[qFQc%B!8h hst7dE D*3 L o_?'|Ƶ3zޞg0g;=1^{D1 (+~ڏGWHnř׸(Te#qO n\e9if\wZ|l$1+!Mߢi>*0f_}IO(;v.ԸWOFg o}'ҢsG4F˼չl}!nG{59y!:56;*zn6h)*S3ka!z4xM?! wmg #3m^#ZIMYW_ѓ[΁gOϲ˘{CI`expXu6&Qq> {/vtÍcV9ly~nWcVK5]˹qr87 *0Jo4dk>+fF_ۋB02fqn>'qt3d։RW}ҽsB!@9o1ټYyK6+FQODOS;忘=%sӳK ](X_z9u tSydP'屿ĺNtzFEx^~O2wΙM]N55:Orej2a&$ Sa:GSQ3ֿ>h4}L GWCIO/L 1>{)TPchGpth%y̺} }B|ՔQnt}T4 IH}荮*<}]xm"Nfpe`tp}=ˮT{ݷ/a^{,\oz}R-};apMq/y Դ28/zNDO }$&vf 9`\u<0QjvÿS4Ei90yf:-a]sxh\ιb)SGwyYw&Z;ӮMıbeYnB!S%'o-yCM." ypU8C"$mt 8b!ٓujbZf3&b49̜9S(⢓0B_MOSnKtrqrB!B!m$B!B!h#!B2<*B!B\ rB!B!m$B!B!h$(B!B!D& @!B!B!0I !B!BцIP!B!B6LB!B!BaB!B! B!B!m$B!B!h$(B!B!D& @!B!B!0I !B!Bц%B!B!~kZ- M&XK>6o=w_--P)Q>qB!B\|||馛3f AAAԐɆ )..%|}}())l;v8 Uʡh4k 4(<f&HgBDz*b 'z{;]e'.NElKEؙ)iC^NZPPY`Ҙ]ύ$"A{ds0גDQ=֝I?3y2'>@g{'&@ i'fK-,ǞxtI[07t)Scd^-$ip ̰,]s$h -7ٹ&''7 =z47o&\a-Lʫ{yLZ D>$;|$?^vcQ9o2Ԧ^ϲX翄B:)$ _}GȺݩKWNܥﶀB覵8YwM܁Nȫ74 YÞK9"(m||0+毯G @CKcҹPBR9[mӶm[r_տkH_]?e5;wdڵ>?Y;#gy*,Yllt4,N=\Ѱ3ӂij2=a6Lhbf VŅldS M3Սl 288K(,4G0TRSI ɖNe' ,B_؋Mc#30]sO8p'VX;o /W;+?Ţo=RmJG/|s,1Ǐc+_#I\]S'|vSt+aKlf9[CiP&**J?O~ݷ2f͚Ŵi$7"&]7ʟn}/_NooY7yG!h2 X\Kd&:8K ZMLVIJr2 v`:r>2 pP_݈sBPو.&qT=F1kġMoV0ټ=؞["{bS1îXEC=mGkAi zt+-A~&55U PTɓ{;?Uwk㞼Ȍ3P_UTXYYh4hRL&d[+icGmR(+_CYGa!vOǵcZ;)nl|Bqw4«QMu;KGjDv҇;F;g| ĭz;oC^%|~9C-K^ͭ)Qpl<n<ĥ4N2~"#Qgp=£x퇄5*7frx'2!3'5<?~tWW,=IBryXۅᓟ\.nˏr.)']xiܳS6_ۜfϜA|r1k `X73N㗒)Ӱ<;v*J_X=d-̓9iCd2VtfL'W/$f|( 8gKEEtۼEr*&{cZaMĚXwgb 53n5=T봱u!%">MclurQlfãUnN\ڵcЈC&Á8ʤI_Y1 )l[cԓ<rcY {N)4K]_Ѻ–&a`6j+ZӛFP ݿ'˵,i0s ϐoVW4udy_?m 1-=^-{0'RI߷N= ?oMr+C:?yk9d^|GԆlUaD*t߿1$eƭF'61![<]ϯ3S)6gJa/9; iky}[j=iQM~ҟ߫idz>TΆmNKuvؖW&)5C_rmJA0W._UoӧO/n~ Mځ@͛ӧ Byc=Fn3>#222DU_ug999Y_Y7Ǐh"oތݐo7yU WR5%uMMпG:CJa RI]kU~ tХ6![wkde_`,:ǿe7ۘFLd"9[;-yY4m:fv%}qZ"{_፥ '2sZulJyƮ &g¢1oY8)W[g?k6cMHBs.$xxVhPy9Ϻ,N"8= 8XOy:H~<ˣ00Đ=4/w>Sb@SWF/w<_d<_s0f z|$~\?$}'ӿ] 5-frl~9u2 Hc:f0Am %t%?īoLqf{s;,Vڢpbۼ2RKk3c\YV1:M4!p"G҂yoZxcE9'}[e&a(L*;kYl?Hgprr;:"3{Z.#+v**s6VRuے*_0UU <6,gEV"b۴dYT{9:}>aMӘ&9l $XMjJ٢BeN"Ʌ84"/ u_yV~2橰s"BIl&*UI_VWey֎[e?F=ϴ4⣵'LS+l %E$e7qlHt_%cFRQ|ۤFe6fSumՐLU%Cg|&~0I}ji%Zx 6abcdwEHvv6o&{39l ,'{ @dJ7( ('Cf2gΜ[>>SS5*Ŧ <4/ ũs) )RQ$јd5X\6#\9}VvUN$Mw\ڱT:D @ON9qt<(2zS ~˜z=)K}z*:._J`(a\'eiґm_bKx4F]>/ ZG d9MSi;p&:'C%#gRBnmRPT5>Wvt1՗t$<ƢYm=v_ [uI\&kM%Iҭ4(_6| HؑnZؾ};ÇsM6'"""M,]Tp]"}VVů˳Jg˛'uv١Cu]PP]!"$%]ae_\5Zޭ DP ӃA Td MI1#\wk2"WvKx>]G(&8hmL*,fYIn7گ3͛<MVzfT|*D^VV"i|; %噚&^#{PCYA>H {>Q{?~+{Q3!*PJFC0UL ~n&<ޏ_W+Y|TU˯RˣB#VrB- D_݁^=/UHc:)fE?TPo3n'yLIdIG}d@p;g<e{( K Z%h8y: fx;89Ho,oؖxʤ1o?4F4Y9љ"ڗ_:.jqӸ|1F`L'e(:onj+6dQ`#)tGb= [d62/y峆g7󕺲EfpT!/6m7^6Dy;Ÿ6pպHtckQ]Ņ-\OR)&Ro} h-.º[Ǜ3[EA>|Yޚڜ_ưg%'Ҽm5n7 kߦ vm*vq_U$!@$n7=W{c1ߖ{LdTґ ߑy)c},-fθIY']b̏ϠPe[.LzqQ=O䗿x>=4=[Tm |C޲?̬?r\1n}1TTR @:)Sڦxyj ?ˇѪu򢅻m{+Lt_ǹA3>*r`/,t)X}0UR'CJ̏wA~f]Żla'd׏f{e*.}b_qKss ڄ+m*{'JssРM|ׂ, !oM]dtaE2sIZ3;\=[ӭu2|þ`oVWƤ| $IY{פ-lhsldKxL6cثxNĔtVNx4jDKW5?2thԍ MASgvߤBR *kNt{O/FC.g̿aOt‹r GѸ?]+J @ .@a۷o$B[4! S *C@p =q%? @pW!^S*R,@ EW@pqU&@ @ ܹ@ @ @p#@ @ H @ @ w0"(;Х7VNN%ol'FgE7,=u'ͷ]J6ΆYEz}%3l3K&O:vP [H 4 YÞK9Тp>?oSci; yvcQ98` ֲ|fuJJgnW e5;A}R w3bM}FܔsYw[.0(^ʉa@ JDPpZ5.^xo'Мc'Xt8]3iQ<"²oŘnQƺӝ`}FtWؾ/R;?Σl(.w #so}ɷ#n8kF)7GS/$\ӧC#yx US"bɄQSJgBEl'❍7̞&sxG<Ìzx/^tSʩ#F~xYƏ#F3WUKC/2b+gwv2SvXwG cذa >u_\9M=]'f @p Q J> }s6C&7oMe|;wЈw}ž>Ped;"֕At@C S %+ܵz=Ɋ_AyDdgcY+-{6(fEwb !6OI GOVc<_mKwцiI99 6 I?2G/':Znr[gْm\?&"$ @pK @IA [Ok/Y:̮#X4wrq\~\sIy<{L.}ϐK$eP?ZSq^KOhQ2 Q{8p< e>KXY%/|ڨϟ°t7{YH'rp/,Jd4!~%kor)Uksx^yz8vax_Vw?C$$g' \ʞ_±X8vb t|Ɣ)8Wn|R. +'<|8yM~ag*QdfBӹ̚yGf/fchMo5#È}m#]gfJhəc{ fwqR26^t6gGNQ+T9^<ÉLl̉>czhLc5*7ۦ~M ˠ5Rk0.QW97nc3?׼!*BGZ8߳( Q@,{zA. ۢ:gˆ׶qH5|{O}+=*jI3OsH+{4:ː<{K}ߡY4Sga{Wyj"Op*ە~aD_FX„>HǨWR>Aa1&'9; ikY"[JhjCբh܃^##iS.k*@ @P t>ﰦiLQ?9.;\W?Wmj 9 L"COh,<B^w/'<Ҵ*p Ąil)+/'^nM1% RB™h[>Bsuy7m:-^*UMsO6Ow5dԤɱesy|ܾ{N}>\ۣ)غ_w"C+~a'^"SHk\'^aԑ; ?Yg^QFքk$`ƪ<:[w;8_tfLVcc:7n*L{ܝf}Ə ]+Hʙ؅)e> vi7Sʯ+QLAs5ws~mƠ'8K.DžciLkP:>!Py*ч.s!!{<&\+l4Y}m$A-YeF.5RRp& ej~(lKS<ؼTx]z%(q% ⢡X5r5WbiEXxxb̹BbO' W1#=@Qtnćs6͚_ުu{T9s&k}T 8|r19`B{ K* CI}ƆWd2T))HBeeڬtt>70W]ҍ#+š@PߚL?܋;ma%3оM[fzV jH[DV|c+_ $7EV:ȃ{`S.ga5Y>_0!_}pҥdzVC/OuftuliLAf&XIwM;UCWյ dFڠm+fzl%Cq{8‡ 'h[{qUGznܞ@k>ZIvTeh|*.CQr5+ZZR&_&:GIcW묣XC%/Yeyڙez1`<<,`{gBGgWPג/  *Ud$?UG7js@AAR[YH8.S4ѓݹӖk`ƒ(AC!#NȢ{gwM|%bikF v0Ԋ wSxдMG:6A%̒au]G3Q85c ԦlWLDΐ4s @s.l@#]ط3v^]YwTNS"DP I(J:*Do&<ޏ_W+Y|_0P(nDٳף4&7Q/k(tD.Bq4AGWE%)76?My/[: ^J4hעUv^U|uFƯi5/HTTΪr}EulDUJ'9<]xV.È}mSkߔxRyuhF* PV+v⇢jLR~,ּF|ALBAA~պUxf%bԱ$M1:kt'J*62 ]/̿ټ3?W?dJg%vwȚ>Ouv"wٿX G|~N8Njo莽WI.u/$vN QiA6䄭g)YH5--] I1r>Ԩɯ WNr.U#b3F, IB[:6r3 Ⱥ{9_.)Е=qU}KM Z`P7vRL>tl}ckEN= gl"valt" *4T^H"XOJ%2i|0ܑ!h Ouv "kŐGί1i!<'ٲ=U#ggPv%giΥX-x_=pQJ}1D~{'\IX6ó}rʣ$II4X5әW\t^pL $zٟ̫~g0mVoU*m-ןzV:#1:zye7PSҙJғ\{o=X›kjs2\Gcrs􊜸sV'UaEߗgf[>}y2nImi+m]݉Ң1ӡlcT5xb&)*oLT<||5_Ǘrev }}z2+Ԧp%\\R/ٓȄ/'QB kO ;Ž#4,'U8Uaz5T TQNUp&O槷?&`V7e!1W I& u vRδgw,SCٶ/6l !t[? ΃`Ftf֯NX7Ƅpls`_XiE>اb|p2>G$6֟3ͣ jpb*ڸl<ŧI,8%57veҒ|`%zƿDX²KndPIJ{lu$H'[Ϧp{U2 7E/xhkκY?&$+ adOLZJeO"*Ӄ}AKgc*;|tm\Sv9oGG3çvPA&\Ѝ!`j =!."mԱa[eW&|1}Bl„=/Ձ鷺v0AO- Kmf̶ 3ձ[*覊*Y~`,} k dhkn<_az8`,Ŋ-t޴{ :L378lAM]fp1xLSGƉ.u04Ykl x__t}Gn֋dWۖMJ KӮqV[9w"h<_3<>}5ku1αl$Ϩ3PgV<6meDE4SjLT6x5M.vnx9[^fϞK8OuA+7sb6C,m"h+-njB%FN@s# IТtam/u$^ɪ8K6dA@Dԏ) eʳ,ICgo+p0Mټ0IFS6k]HfVR[ҁNɯFBCS~ 'r_hJ%МOϯH5<{VM9^F')Г+}Gͭ:!#,-TptYm}5J=N.qGuQ>s%D1ZPG?UZ'MP+xp%ŋȣ+3}/QMKu|Yhh#X4wa{c|˛}omcTUy^Bۙ󟒤AuVuY@m\aXd<߿jwb,{k?9B7L(k[[dJ{SZ"xW 9h]AuZV9Wgs7!B ϿzK"NޔC#E!+uk6nʰ̗cv/-RРh5b}$hMp;s} pZ_"+Nq Y\f'CfK֍,]MU`-5¥:- p#ےy;.1kƽ2d Ŷ`O]MВt463lxvuwꮒW p5os?M_ٖәhF nA9ش]>M$GZG 'mET>K'!UX'jZW77 @ওO()rvk}??9Fp.(8b-QnxW#R t&t.A+ljLP,SS~(޼x% Vz^i"س7衐 ٦γ=QJ [NA&)Rs=Ç'0S}34mޞ JFM}|sFVU_#u{#ˮ#NǛ]%m᥍{2ܺtDtEux 3wo*39y et#@Z+w1y:Qw]z2i68+<\.>5rřxv:K><G$މa۷o$B[4(9$cHrZ9Ӹ ^}T,΄[#XyW@ @ hblB~Y 3@ @ 5ˤ LDP RK cO<⁙+upXX @ H  sM̥}cv6^1QǞtm剃ԨJ\^/76}N=䋣2ؓ~,xPp$p؃ h* ͗ʡ'ؠ*"IOT2WXdcR֦e$]SV ӦM |]9I/SLU5:8?'>fxQnEϺ @V`Jw?C$$g%.]>))[D) /mNyt-ɷCOddsYj\.nˏr.)']xi{]3Lƽu3俻8~)/: ʳ#[aWС(~aP"84fI )?5٨ h[#VyP C$o7_!)Oz6$kzK9,NdBfN?9_+WLKOhQ2&ޛxN(sQ(?Lc5*7fV^&C2E9k5տ)~Uf֓R7_̳t\7`@  ֭C~1ɹM?Fgg8i H?c(,\hڦ#H{-םU8\ ʁG1o+#SgfY-ޭ! `s^S M?9æygFXbI}-=9>}ñ]0:(ѱSwjXKsԺd9%BkrI* 2 u̬t+Mq/Xfuq K% ׈u+v[,N"8= 8XOy:BorW)(i`tY4)W[g?k6c۬\W?Wmj 9 J &ܫTNLA3]_1 :ΒKqXZf鮆S]39l?ϜwRٮ{w(p5X҄ ' ^ɭH_Xxa8+8IleDV-s!!{<+OFMLc &L{gH ]O?jwt٘-VV&crZV/jS|!;)>jö癲 @XzM%..N?@5)Bŕظk06xuKKt\&,dcJքvCFZJDYW8/'򋿣çCW:4Vju"8oaIefQu=ͪI)96-2K.[o#ycgBFlvLvE9J= ğ ®-$%KaK@7zmn!vƵطFWlNmٍs/ݢUWrֳ<{'x#mKKpBROpFwg>fF]B2ET#Q=8N;;k?$]m'▍ iY4!PAB )y# h$9睑r{~*mlvj̄05}fnYC~C]dQb[*z;T-{rLIUR pyICQtHꥺbC[>o%0EiL(YR+%:tA5WvY-uKtɤI>e,*ZmjmoՌw%+;;d@h٠߬PWߐ 'ġꦇ*3ljT#ZS'M\#둓w^L\>]hq:u#O̔yxA>7ֵc「5hгZ4eegD˫{_bu٥\P?.}t_K1+*{f._fc=VjwlsK~&Gsfs\7hʿq}K˞Ue6%\ pY2:]7IgZ9&%Y^'ˊjsqaĴTEۤkd SY*ʦ%pWR/NW賵jm[2kzݽ,TT˖-jpzf':Oujvk%js^0FOќ U|U_qT_Z0'K[>C)@X΋o9,utlR"t;]uiTJVZO[f_sT45"GHUjlmJ\ QrJGKtżk%aQWqϮ""n+$*Z6uN)Wu_WqYti?>1թC%U:Ou4ת}Re]U6-uKzÀyTFu?e}*HVS-,icQ }x vqqߏ0[5`dc_efY08Lc4eB,G;]#UM K\,mG܍7U:TY|Oby8e%U05+ ~ÇO]vU>OY*iJ5vS: *wJ]|Ef1ƶ[J["ԡ*;/k>3cz[ND"uBm 6t|TTK>׆,]u.|?)D{>8˾+R[V[Pw"SbcGZ{nhQ\Q5LZv3&W)fk5IcۯY-uKtlq9~_>Ϧv2:F_z4o,׊3:Ue 8WKv{8Bbr^ED]~c530)"af94hw1ͧʹuk9ʗj2_{;OJj}?9(kv~lrΪl}8v9CS/8?kJ i#M;UuMӳRg*S659/ar#9PοM4w5>u}G{TId*|^YSrDۺoh=]ESs4*>J!œgx6طK۪ƨ_Ts՟8s99>;:tdJe[BMVu"p+7$e;UR|Nރ  j%\r+Uo#=^sN2+.-Okz㍭:VYuw>feGrFhLnmU<.WV:ڹ&ꖺn]Nä֖6W/Vw`SNJn}| j(WxXjJdP/ꮩWhW]7Sae?%}BVʮ~hˠ:uk=7ScWh1j#J#)8%9T[QNe*͹~*V!kuo>je>uhӾPW[vW!\8,T}'2%ꪫ&ʱ{>X[6k‚+4וwlrzNhKT t)-X6F**XOZ>_Nj6UnҶQeTNUշ;htŚjtJ\X[S󸘏+J_,^z8:tjlLQUcM m6׹LxvuU-R|q*Slrګ|v[pBRmpc=K愩ZDm>,i*{m~Fm߾A+~X/ퟏi3ux~΋~&٨c&%`LPb]M[\o:5\.(97U-ͭ[ꖺu;0;юg^KO5*M3n׼#I_'-gv"6i#MhT,uq м/JyB>WAO|*Y9s:}4Z+0u({e+ZeTLBSc\ ٢E%G/ИD_ \68^8n0{ӣ//oQO"{%OQ=}!~D_?\%;u4ߺI{Шkٟy8//LJWطhw&}F]_]u"|Xt\T0=O->ݹB1רuQӧҼzwH#Ok#5!Mjhhyds`V鎣ʟ>Os6@[ RV:uSD<_Wk~Wf0LaRmMWbeRR^S3TW(%)J4kTSsyudD*1)ҽq:ب6{r* Єi2ݤ6՞]8kNTIYӧ+>{q9^j;^C\"Ѫ꺁D-uK^vч{,aTjzF꺊v^m;0%! nw=YVuuu:;;qr]3oK?^heL-֬ YJN4Ү봭Պ)Q3ݬӒuυӵߚ/e+CsFO)L%8O;[T`[_>.L tӢl{]6\*ٚ3%G)#dwY;>лۍ9R]9Ex[6nآyh mj9vD|F9?՞2M-Q;TwP;֭Si]ga1(fKzke8z<_۵vmO8|$r#He*j2ywb OԅirZ:jJf&Up,EUr68ϒ_pA:iKi}&\>G2aIvkmc9*jk'yCW THxF7F}eBZNzR-uur˜OvxLDdUwkdģ;;wGH\8|\rݭj!Zf,MU}5-$MoR78z&Pm+ﵢɤ_^ڳTٳ4#-TCփT{^oQ"kSis[ꖺ κuz{R~VUn0)6ULIʉk63RkAR[_ ]礊. |u6ɻ ޮ ;7o'c].g>-h^^ 'LΌ`V}: p@u%0z o\C{@@2t s.v  3y>aWW  `ghL W66@.?Z9WwA@q *?Z9hB},Fp8k]?.Y&暌)At-|圬W@j;y??ǣL<. @(?@;sw!g~g9y0h:u*tC(mng^;yG`P[hg?CCg@{mlh(B@__pΉgՐ[][zwoX{;g؟n-"0( VwӮ`(GbssyAːkpo-jGCWwvց~w+@s^Z:aW¿ 79  A5\_ *&e3yC`Hz>DF|~nRZ hk p@ b2 of^@#  k UUUcѡ'NjR8qH"##)99j>ǡpdٴo>ݻWtN휢\A0PFpZuho߮cdX($09H*FnԸ uNa)0%&`&99Y'*66BijjRII:ȤPA'<L4B]}uFL9JIHjϞҁ~)YQ0#j׽_?vڕnZz,}nqMQtY:1!STTkd$Z@Rff9c@G'OhYUU(.QKYZ[/zqP~]lѧ|R8MՊ7]S:%Ͻ_7x^!M@EVcc&M=( C/Z+'"NR<|i_KL^s3䫉^y`;3-/Kumw뛳jc8/N٭&u&WU˶jӍ?iC/. w>]O̎flWۜ뛧=2>3}-76u<'VtYR??:Zƅ,QWX9۹U&'6ctQommEFFɼ&VEYrL3]E_~[kתϓ/֫[N?ҷ6雓)=QS5j[ִayxA>E{k{hM=1~QSt 壵p2$,G'il/dܧdMN=5H%M'$Mqgqms?'.,@ޮ]v̘1;\-ÜQv:P.lh/]ڻuy7UgSuv#eJk>gl\.1ݚg9 #N|g1Wkr''#]?Wס/&PφkH"ls_:;;d, `[ZZ4bĈA'8}RKtCƙOg>;&_q0I(83PƮ2mѨ<Y^vä֖6,ܱ%}BVʮ~OmuժqԵ2²n#D'COe++?d?ݻT?dSNJn}|Fw+@[v+sb+D[53ׂ:qxt(0eq$W_14e[246'L+>Z㿠1: u5O疯KF*NtEy4 7CS~/} .VQ䰄+WAO&E%+g_E=gf֨_ӣ\KFڬmZK:Q/n6#I_R|LTWܗ Nt>nPw6za`׸B0Ί;:SB8Oy7uUW+66_y\vs`?W>3G-?U 7@ a-< x1 pp ֌`&9958}c F1@ Ab@#  F1@ /9B# ރh8@3O@! >+=׸tՎtAv멙uQ )CTfâzg)y0k>>`Z4H2 spI' 틾 |q ?xDa:~HDDDtГ""5%OH ZA'X x$ ]兲gA/u_8KQy4h$# 8o@=7){4<=<ۨK7pL8RiF{o={k{DDD'ޯwy->#ȊE8ꃏ! Cyo7_aM/S'ILZ)h atbK`Iv*[㪊# mt9g|y|gd1xrkK P?2iϸ㐛78GDDtX݀ 1 W ϋMb.muM8O.*sA;\,=܄Vvnan}}=UVMG\r/0k\r\=G4ЀC{v`xc>8sUuy&R 9O8Ny7| 1QI3ŅSGcHyHnlhb9vFPoy6&H}Eq?E ;?y?\DDD;3,`H;D1  |x‘(.W=5zT{5z4*갽 f{DDD'4Ը%uK?94My>5.Ɯ9^ybf5D߁ FaqJ#4G5T~8s@ʞ? ơjVF^~#5~(<)t?$u8E" ⏿ R~Q2p Ίo77]f9@)^3fdM3.(R[ 9DDDzٖL]A` P(Ʌn_JR;l.\էsx`5=8T/"p9JKuR/SiY u9Lw}?J0="":嗰/z#Ͼ_dy%r3AȱK.8r^o|w˃nBUx9T3o "Q5EyxyMֿu ^mpz?{ĚPJ{vVvowD;GoƏu_ׯ?;n\C{3፵QzP+;q#GbhTGAڏ 1a\z~/z|Hi(1$""l~Tv6.`"ee fFc1L]#i_]^o݉,띝 ,'핔u_Uw^{>~ӕ[_}=?O!|Oʧ+ߺU4Ue 1#O^c`#t+>Z\UEEcms _%a 'AۉRN ǎ6#s .<5QsGPhs\p͍ \ $D-ğ_}>c^yx >.]Ss2vmp~8ljEqϠrt^,0ޣ#pCD]ў]մlq MRIؼ 䗣Gǎpze(F⹟=Gt(N/D~]b{0ؤ'g=\xO{Bk=>czäҹWI0uF{Ao1.v66 lp\pZs,‹ >|#؋%/}S_6pXHDDtBzSXE1҂쓀U3ɮszNP>b_ qM%%.Dv딗'0W1PfGX8c%7v,^^ 4mc3څ7܁/$ Pw T؈5۪UGӋ}PFcg 8kZ?j5ܭQ*](,Ϳf_/R'sBv]}(N+ԍ7AKε>kܗm@75 .#ٮhH]=wiz[v]$gk8Ne SdhW/tzTU:.?MA44޸f{IQK)CJch !Kve<'c|/Fk&{O_Oۃ\# "q 6 $۞h M G4A Є@s|QBo}Ф|yT8ss!5>?ߩ!u܀7v*/wv'ϛ3a$Uf.Kfw%S1/ƉQuG!.ÓS O G? KDH.+{کL%23=""G?uup򏈈Խ1dp """""""ʊAG|uDDDDDDD3` LDDDDDDD032?DDDDDDD 3` ADDDDDDD1\2OQcHDDDDDDDDԍ1hl '-u ]"C}C9p\߉;եϛ/8_㾗a)k\]0F4j\% v1}wp DUf}"mqq>rsVk~+**(vBss. 99>H灈# {:)ϸs3V=~]G]T6!p,vvMUU4D1/3ahy.p-l^7^x Ky;ט2|~8 ݮNH.U#>kl-~uo_ _: gƝNĠ<‡O_/:LM/>F\i: ݃yރy풒]g bTUCQt~m6h_~VbsΞsb_sGY6+D`5c}>2A7A_n^$DEضYqJq[*" 8VnbQJ C#cFK<^P*x.?ò֚Qw>'i{Ǖͧz|Ewl>lb~mv܋~q цsMMsbѸ1QSTX;j_tDvbܕx3/߁ڄ߯mf%""""""j @2iMصsi]2eWޏ{^ كSYà" +Oba'RʘOÉv6ckw~3VXaSOiZV_RԾG,3Eƻ| wkV`Ȥ1(~J1+qOGX**^z^6Pv#Q#>U:QvU{zcи(~3Gl .s c^RWOFsO?6NPn/xEtl>nX\qG>ԅ$]~N|qa6tx7Dd uڍUC垄[< XPm?oб<$45E뼋1EڀWׂLӾ_f%`gϋ'a"ýˢ&i\L7Ob{'ܡU{ĥ,o;+V;tm¦kKشzXAf*v[jk"/vp7Ylea3gN;\(om>.)GԌ6n ^^8֙}NqPx|o#6'}Ua[Ziܯ7^^xc0v֧"lWQvΝMnaI&""""" ~V.z8\p^0A]O_J)Cvh9½OEQk>WzCƘsZQqe8:~+7aa I0]6˧"Uc#i0kєe{Ruk<ۖ&֟=/k+5!'MЉ}{ uiݷXqVg{!#XA`~$ka#?2Q1$|K=(b }oU""OR(M8R0n0˷At?{ @WGmzĊHtsjDimB7x EQh(kwc)8Ecyr~]g>!V~!R~{%cey[νde@6DĨ6[;jX}/?"""""":*2O )Qn'IFcPcO,CkG?c{n6¥o;KjQ4ZS)`p+f_kқ.@UX)zM\UȞݨR X47ZmYb bvXVs&-BbKO onGՆxy q.3:ϝY'm>3MYb8o<>64Kw`vjE=n$RPmP>?"yŌ[¼Qcye/amSQa đF 'MLjwx߇5w;<QgՕPO1KR 5p/P .X`M8VPrU2loL\70}3² 'j}w WsfTn9u`b0̓xp{t,\?^j jKKػQW N4#$+5>wfڮctr@ՈoG >Ex٨]j!|Uיsـז4/c^姞A.\+ƙ7, dreݬ:~Gc| {"<=< $"""""9<']kq"c+oaW싗G`?qy_o5ؽYlZW`PqŸd,uR69%{B)VuDc981̉17a.MB367̿u&n޽PXN9šbk@xX[wNkmͱ9qƏ:V<:[?%FSAl %νx=[8+g}Dqp[5DnjyɟgeDPm#xڗ1<<h DDDDDDt4VgBY3 $d()Hd)X܉eڙSws᚟Wޏ{^3J|Pϳ@ hV,㋫*…Ɵ܍zN>+K~xqIY-HMYr| @"6TUG)c0*kr㴙W`@Bq*Ebq8mhj͉MwqJxvV`ߎmv_J՟24-˹i61G=1R*ڒwf 2k2ǎp q_L 2 q'ǃ /rjuOB|fE+9SyިF CD "{9rp֤)^ZfU?9v`ٛVb[_خdӴ~z9`}FJAЗ>YJMෛoq[7,gk/%Cf_`5%jU}g?-Cc܇fxvz㢓'CTvKN)qāH+lC)??sDS{ @̝Љ/Q(_D 4υ u2tETJ8iL? >iHKcjK0w+1Ľ ܽ83rxqe{֘q՛w㣕hTs/xPP:C1+De2qo*]@7}@LUFhO[`GDDDDDDD1=|4)ԉˌaVh]>Cen^{=N=lU-Y;uPŤE θz*|;?ͺkX.lAS܇&݃!c0m k^;34AqzjxL }8=ɇ7yc%DDDDDDDt`HJgV:K9%KK R׳@L\拓1)YU}mǒ{OU0(~u{=Ɏ#Z?؁~tŠg?J [rD_3kDUu| 6l-Ĭ/OI  '&޽mTɩd5ÆKEоEr8wy92=03WBi3'4 qs? W\a{(hԼ)WMrתKCJYk6/4=|tz }N1ޭWn#L}R:"[JqJPvue C!/3n$Lb5ٳ&7G54cGT^zJf')i,wivU?={hʪ?""""""":A1:k_O JOLZ @qY~e@%h"<'?T0{PB@u~Gfȕ.w,XF;_<=3?j0&t~DDDDDDDtc#.a_RJLVu vUY-?v'W/71o,cO`u {{?Ij65Ժ/s?s,~RR:ɮv7`IvPҞHC÷f;UB:qi)nk )F-M'MBoOO~}h7c4lo-قXs0e?.-Qgr?"""""""JK&S՗%G;e SԮY 4${jt&pL.Nv499_u>T7 rfgub3MQs68X2Ο]~SvFXGDDDDDDD]@NCƘ~mcDjI>UZKF_|8`1ۙ2q!&| \tw}mH08ix7/XzHϲǁB22e̚|9  N/$iobI+ڐ'W]O'R*Td+f't-gcS|^g9܅!ҫt  .=S"a[⦸+v!:>#S&ҫ xr~H|HZz:HƏ*VP#-YZSM{H^Ouq1^nJ4o|{Nf+GfW`""""""}Vh⋖j?)#Z胫O^qhQCG0>-Q1<0ʠ!ͫfKϞ㵝xq6!o/fb=ï4%Kjo_]f,Eb^/*`|K4 %{ǾP2ڗǚB 7ݷ ϛuk8\nݼw?/,ZU8 ¬Fa_7ءa'^Xmͪ>rm2ގCn*<~j B8]׌=sʰx Bu {LA_f`>ϑ[*kAa-N1cfO[?5nH9E@tԓY\MЉ+}9pT|ulVf~pWc Xy5l21G,WO79ogBuuo{ӺZ w_5MgV]tTlW/Nt7 p/AM3[^cEj/or nN=e|CgOPtuVϹ삩[ɕ1۱f?~^{pf'BshH >qbӫ[M6C@"""""":1 l{Hٻ&'@Ƅ)|HvşӬۏ0'DŝeDcD xn|b Sˍ&NdzOoik!2͈%Y%QqiO+,q IN5<0~cf?p;?} \x+|r@Gt9ރ׏i=xYC `OTP yo)Ot#7↫K޵a7eŘ}@Yh]5x[样?>:rQOPxoC(bqpb0DDDDDDD@S*Rk5 }ru-$ԩGDMVŚ8# b*B%a$?UyƒqoŊS8XV=DťQcX[L7.5{e;R£~D@ris0{ Y0[Yukl>1N^,hY&*nkqI)]~*uRJC֬`Qb½Ѝ=qs|p"Yb@71G *VT9+DمqOً-dWyfG3m1^^7*ʴ[?O.'$לM>[k.$Gyuvd\{֖\?c1mn4g6o?ҙ^ƞbOߊK?\o(uݩ3[ s?goxw1q̼`+c "щH)UÞ!<$b_WZ/ )j xX*[z8uFOJ^x4+ =\}DS4Ϫ{U3*U1Q00ýo1qos_2{YJ $C|?瞻7g@=`ߡMzi?[K``O`VIv_⺔RlK[?!%[u Z9*#<0]?*_COniBjIÛOE)C)O3i-b\8nfd: |38'*v0oZ8NQaAr!y D2Ƭ5HN7d_|Ìsis%Kxejx 4|eg5_=ѿ~z48b;xVoFH7bW>4.\p… .\ uhp-}{H˨CJ1@q\ cQǪӃ&*tnNv]S,Exbjpd4pcV'?1Tn6{V-On?3JYГm0_qY (a+vNxb^; ]q>N0 .߀^\ɕ iVoVqb!ЪӲgSt'\ f3-Xɬ~CvD"W]8\WY8̱Uy9{,ƣVg]2=yk߇i2BS__[nf;إړH쯟(mVuv!o[w>U(+#XmF,j)]Bn4̳%)҃Et"CX_ چRWt $č66hxw8[E_-]I zθ3ҘX)%Rh2Z('ػ ys&4Ahf;Ít_kvT\vds ?sO]G}>twgD<&;-x9qy}=7]5ݬƻ墑f|!kV=vy}voY}/М9JW>kO71$w^_?] 7[awqg+> WI#H]5~`tLky/'aN+´f2(2dE=v9aGЙXUfΤ\s"g24(1*Q_6wÌ_k4,"޸7-3.&*4μ9q%uFqq҈qRgN<PFUG116lށ& _x<"\r7Zd'w2߸ƶsC)ez'T6Cq׭z_HB`N^ud|5VgU%J/Vߙ ^2,VxUh,][L@r 'Aڬl;m}xoFG9~~Kk4 GVs#(ާZ&"""""",1 da6Tف`5^Ya9&k;DϚW6wʈydk>O@Ɗ}2"qX @U@WTh%?)=KS$-G4Qe& RJ+YMgNXрoCrw֎@R yr8o< q5sRkPex|#5oؽx\ v}y׋. y?2'IOc/}d"#q fW^^g<^ܖ WNOv8}\o\ dxøƓ+̰Q{SGƯߨ Z2%m>Qh?խ9eΡ"z΋3޺fH(m?N0 {DP DT5D >"{!r $L՝Vi 7JAd9pƎ: l\0Z!fw Szfzd޽m?,'FX>q=8zF>w:Ӽ{ xry5dIO3DͱJ@1"-;QJY1}߆ Z닇Ldww̄zS' 6wpoC)\0w-I4T]蜩㖙f6SW-fwuyx7KQQoDYʳuF .Dž&T2>n(v![ ?ĵc޾l<k[:?ejk6VIۏy}==OlG/N`3[788zH" b4ƨ1ƒEX"(4t;o7uwvnE}ݝ۝y-ZVX\?Nvͯdž-\T:雼 Y/WřfKYb߫`F{-|-Pʅ #Upo{u+th#,ɧTm6:c6=s [aҙ[rpIㆣO*d׆]tu}ӿH(L5`꽆HA>˃C+ X 5SeVROV7ׯG6|U*mԫRnGUUU00Hk#Kq1mS੪1$v%r]O?x ndo+%.xsΈ)#m: 2yG z}Z:d<}E))wޅ%ݔGf7Κ6zv \4fc|lߵOmOij zlvo_eg=RR7>| } Qٗae㻻Fd^""""""jUF#ܲvDaRVJv!P?(PO/v˴DLV娒ע^O r7Pz]Obixz}tUղo،prޭ0mv50k}bVn9vUÖY~ oG jpx8oG]+o-Kw!˓:`}¹gƽ*XwXX$Qf iOϟXVio$""""(SS~cPi`nKbtrc `# W׸5R4*ͽ)DJMZ% }deJ?#jQ7/6Zuljy[,}n)F Fg e1IpԔ0MhIp)CdRBF!:4L;T!V:iu)U}ǑUs'>]Q^K#ƦCc*Uݬ<',""""""V] QPhhQS2B#OR+ي@1jM)n?VDShaN?L Z5ؖK?%RC+ԣRZOX꫑΂ڡSK0*D*#gL3/{Rf5jb*RΚj.ߥ~Ju_ILl/jD<|y'Cj׫C{vS&Kx̉>9uw!6VzLDDDDDDD'7xQG`U}maf`Ji?* s7@|F^mG/S;CK6u:L% G*m*mOMmJ RC:8!Զ6 wtBDDDDDDwbޣBϪ%h/njw+>UM%Ԏ>,}%~~UCHB;!)ZO/do &,DcaKٕ6 ۲4)U`[oMq$!aj$"V^E>(?!(?%R>_}?S^I +Z`ߖj; 6,9LJc۴*{@ЪU~%ܰ)_ MyB\ @e,%Q+0*XK G((( "Z}P@@@_SmLܚ 1`?!LEDDDDDDD0 Bv j+:`> i˦n)jrv! R6՚+5!mٝ9 Z0؄] (6miv<_C@Q4332 _*0cG?S'ۖyOSӓ>Omb1{\ɳ'd<Θ3׼ayN5;N㷵|X?Nc""""f`Uo7+p)^dڵN^[RJ觔\dnT2c8_|v ?&oY,F ;O|ҺM,cꬁOf;cZW8$9g Ӽ/gEcOc"r2cT9~gOYw2~5GH%Mk:%S*%mҁ|yʃW?;0 T=ꉡA ` 4e9)7mLE8x$^Wb\Y&)E_P}%^ }NcI6ߜa~y{{܏mw$<&"/-u,Vu̜*9FԞX3N>J'5{B\ ;7Npz]>%'!vDdy3f:Ο/|狴ڻ/tY훌vN?J+~~Hm3U~f־ OýsrQ&OtHwVjTBv^1^3/vܹo;&\8w_ gS>Ym*w/׻cņUȎEd[-kH>y*CDDDD 1eKX-C)_!^tm|=ӁÕZ?]MDA…yq}K^5x,)  e#VGڻ ܭ NX KM3{Ӑx;)4mwc}6}_pTwb-zm ~[ ߎAy[pGږؐӻo^8q >Yi7/ ~M16U[vyXX,M>n/ϵcp>v=0ōlǙhs.#o7ڦB<Š;˯sF,Ω 9xLݲ9 1&RUPoE֏xlj! jgGVړ9X{PP|!^xo`96LH.$4{ya[!=!R.xrw!6(C-ˑPuoWJ brHv<0=Oslà qE86rG>NÜqxkt%abԚ;+n].-Vgy .XBަ=x+d՗;*e:J}#XԴsMg !Q~}g`~R=BR9}n&?: @RawHÔNY]Byy`7>j۔π~ViKfvBѺXݖw˧iix@RB&|뗖BJ2n{jNۑgM %H؝UW_HOr[]#67ۋc0< gy8$ WMƦʰ|M6^2_9k@jjK6ROѮF(0Ű냵 p}F3Io3WxR}83 fzȼy^i#?T{Ԏx޳1L,<- r i>CZoz?qg]{ U`h<9ڭڏ8= wCK[ ŧlKh!nhz⇈جѹ-h/P_u{jmמ-a_TR|~e^c8j4ղߟ lwKak6C6@ÑMoWIRhI@s`W955a#$d+1._xS|1;@*u'IRDm ^?_m-Ekn'|]zCwzv@\|YRE ]G VBܤu7mjI+% GO/KcukܦH/Kr߳C˕O?pu7ۺ@u3hwOj ?3F$81_| C3.\@} yy^}@$K' CpU|#BDӫRRؑ.yK^ZL$?gsYxv Dԟזq+~%9SY@l$rZCVa\>ڎJ!S }=평ZunS>ǡ: Y벅NeGP!)/`W'c,CfТB2gT+K"EVغZ=m(Ű6-_<ށEP$L&S1/셋ώǔ#x U[+>yb_hnyB3&}4Jig شkvt_N,;R,ߓ`ˬڼn<⽍.,4?_^$8/W;ǿ‹SeFSQ $'hh{!!D@ V O # ^S§_+ۡU5kK# LOC?!Zdk"(Y>s10CR@~ul)48.1{j\ŅןۂzY:vE#Ĩ#b崁Al,OoR,Q\ t gv d p=m``tᕯbXL/TڡT}5K.xk_ H,a٦ _'wCq&bꬡ}9x _Oփ~8iN!*aI3Wk;0dPյz%_۷i~o(d$xuw-q7.2z6`e!9; ho ܱ T7֔m6ELxdV~h bpW^YR'1Ӥ&8Kr KK7a%qPUcZƞɟMJ&o_b[Jqۅ=17%"82/}7_0u|7 kg^,{?H^f`,|5= Hj?Pᥚ|zEԺ%HTSذ 9~{g>) 9,GDDDD {ڕ~*CZ̡tk~~d i1ZgL:0Ɖf5 saJXrRAQr?t0`}^Ubݸ,,+_F˙bC=&. 7w">=3R G>xh!|snx%8aPV.oiEX3~{^k\˪G3`v*tQ!>[:K^U '6g%W|9ۃ7cMqoQW,j\ǥ)@<x:쿟FQ~lzo.{(,:?v !oRi ?g[^t6kX˫FwF @]-vߊ >38p^8 \ܧC\]c#p_L""""?"߸M4U!ɍ%jmjjҀ~!QCh3JK}s!ַl껨ƟZy5Ii]?L_TX8JSje-HEF}Xޭ;ED'ڱnMNgAbP2Ą3?lvg&E QF~6yE6o ~Ԩ'%%锸̉`_c=p9,g m 0RY*m ]HRʰ3O_?Z{B C!#XT \^K ԶrqD^ilIeR ެe# ߐCrUpUZ?Q! dP)X(}mUEs_ ߅,9v5׹+Vz56D'Y6! EQ#/e.cCg\-A9 $< =k3wkl#qJCgT-AdGDDDDDDDх`P.^G ܅J*@2ЬA9b}ص/ZE @sgp,Q(WU_e'ğzklz!""""""" RخwDPKh8!1i](K3bӑLo sw#$1RDZ+e{vC(K;kNBU%p`|֏#.cLFrlbc e׿o<TUֺ૫Z zZzeGDDDDDDDQ`S>R)4 ` ~lYj'$5.xYuE<8l6 j~~~~^ ץyF>}?A1\g)`4Ä_Bm%%u/x[Wʯ nOܒQP$y~Al:SP ? @hZg8%4;v[–ϫ:"O.9nQCʧOiʲM!dwPÔ#;vb\MFdRQTg;Ɔ }N 0 h>\8WoVTj>~]Rzk?SRUW Ҁ!b|!R¿^CwHLLJ&DDDDtjښjtL? p㛇_(z0F`CMh? K)#jJ[#^_ïگ Cz8PO S/\g~ Ƥ`P66tpIqp'5ߚG1|;p,TIDQ`h,4eq:H?%#^$cݰZW |P%OO'XI1x0wI͏`>=0 EQ@W_{x%VD7j3>~+%AЂ?ޖdPT>~z 6@bbR X8""""cvj64(ٴID]F×#…F' P;1ϵ>r{!)?~nӠJRdnהZKYӉ8 W|2%I[WV?"""":ִsSQ_/y=ADQ`0BC@ XO Jvȫt^0 gi[*EOEŐpm[kKԆpqV:1̗T :F#3Z3B@-˖CE03~>:t!Ԝj&8YOoȷdlщ&祁>~Br~R?7e7~\Ӥ$87QQ= 5!1[౶~iNH y\XI޷)嬾=OT`xiE+㦣0J?偤VK %ʏky,O0"w N &ܓ,Zdp-z w 7f=مeKg>fK̦p#o؜2G$sщ;XD0-.S4uO|{C֤z<;naeu"Q)QV퉺cI̯ !64QB}ĭو% (_':KV.t뵌Yc~M @~ѫ]i=?23$92hk1jQ/aɆ,Hz;~H< ˑa=vOXuv#աǝ(H l&3Ypz7!%%kۮDz $|1b 6h93J_Ъ9okHR{Ɵ.퇹!]KHc$ 2 "|/¾RO/暿q 랾Ϯ-G>.$~O̹1s\wteߏ;+⥣>] مړо{3\qf/ĝGbزv;fl 54 zλ 3V>tmfK"""?n }UY[1'cJg-Msj(% *P .%]?^7-o蒞8vyX](,%IhP9Ϩkk-g ZZ!08O{-zQq<^XO“hBj~}EpzkQ[v%fq?׶H*]Hx+;t;X [ނC_adX 5;wa@{ԕ8X+yByx뭅qxPYݱbq5o""":23/}^}D8'<6mv yNs6jr~HwzюS^~Σ=3 T>M$Ty9OV-kxv~8 `!m?_/g%]u쇸jcp_f_a[ 8=*=">?_ۂg0oVgjTBv^ ^{;;ǎaG]1:oU>{k-_] iߖR"ihL>s^_ 1ݘ*8X*"8,/0o" G⒥GS+?}k+ 'wЙWKGrہo|?Gw*u~?z)zy\?(̱/{ .r?|7)jqxF䦞k8縱a^W\?ᒾ٦}!"J-pZ^j: sOwb==eBфK'%1`4s޽ _xaMZ؉Ǜ14=nu/9;F`o7aˎNsX\ЮƤ ;#Z[j2RJМSICpo}HƧwߕbىxr]{,jl{?xאM87j5ijpF+۱/-~zwO i/\&-!\@zͿMOoCbq!ko.l}E y57C핪qpnw ,|"gQo̺*qy7| V6i~SS۱6kml~CM|cg DDDtOQ6x$ WMĦʰ|~|}ħD$u-gWֻq^I̿Ƃ[m9uU؝[ ŸTaŎRP8 +tmS \Qq.xrw!6(u˚D)pdTUN@ix%=Dl;oe>^Qzzul=}-FT+]u=pb&!p |]܃~̃~p)NHm l>3uhT "HmKrWkG~i #h[ 6 cgp'bǰgw֒4އ/qყ# b#mD_HCvG򋆈~~=KFvPJuHcSN>*kHK ;{?msN-hFbQRǑB? ;Bca'ƍ+ěs`Q1 Cb~<%uҜǥ'cl{%U>S;o$Ǎk/cQRK1JFwks_~6jQp[Z˓DsőMKP9$8]~7y]}DӲ写uЖ/\G^?vEG/9tvXV6t65ej]^t7%8=ODǏ}s{OL19=Y>\?oj1 7~[Dx$w-֯-)X~iyx\qхw_X.'mEnfHbz+ዡ=q9wWk@>$!%լJU~e"Ά3 (5mm0شy9R{Zs??Zیq{!U(F}>%8TN>c0-KLU y=/ցX[]:O dĈ1ӆ [o]%**A^c+{__C679Rcދ!Sx"^bTj#]#.=PC#""":^VϦ?Pk!`h)?K*AhS(N03]pTFG(>\W'§*!j)׌_vȻdo,u~)<o)N5 !Rݚ#`\2#t!=ߞWg¸OKŐbHI@u}0VrG1i9 h7K1PR/4sF4`')AW:$HBjCp S`= W4b@Mu |?Ho+V#1NKw,pV'h0S~"(hMeKmtr~ OWLUۨ&@""":֌&\BD J Ғ 1XXscP}wpa!%!-QW"|nS'H*hweȩÖsz/'Us'` ~;6TUzЏ'Y)$]e>dF/<~xյ K% C5t{θf;5xLTQ֌(hTUbe.v܅* 2LjLHU;sc?g0:t">(u삎rd{ k%:`i]X݃3\y%D ; =;웏 tJP< %JƠg.DthaW`žBΜ3qb52s^vit{SKP0OJ -%+P6Li[ t R:uBksB}+j(Si7s``V&""Okywh5rԦ?J~i6[9TR{BUR/#Ez'҉̭/n«O9rFV{Q񓀨N)]q{b هǶ"5oU񻩣N;oGJ(ytLq+uXn)>W~|3@537_8$U -7ϙ8?# RI-g.(!#؜HICg`tgx wMb,YOP'j.X%^{sqx7qHL>FOvt{ n~ /}Hp$!`Lgx0ily+,j4]._|? N m0j4:}s.EǤt@[c|XW^'ozu}fk_.r/RK /QcPzMMVRI3NyqB5<RpμXw86%%I/W T oϟ/}+Ń`S|[gt T!""":z/ _WGNw$(3㭼UVBiOwT'8ѽoW21R\uؽ;zq6єRGghPňz Tp=^ d;|/YMv_=FDDD'L{Z*m!ەҀ~~ vMNDI>'yͯB-Ի>A ؐ9jjjIT"77(r(y )>}_~HKK>A-//Ǿ}>8q"&OΝ;<k׮źu ,矯.,++ |>CSa+}bϞEضYm|y yz>\R>6y }z<}qzD:cFp%TIЩSzW) 8eS9S(qFh}e?u|_Ջ?{d^NC\v<ז CX ԖڹsN! L>G *+[ ;s7JkkkԋƄ\&$Դ .ٵ9r,&1 ^7G2=FCm^{!b|4H;fR y>9 5e,3ۏ´iϫ{q>[鯙ϐ'GR@s H'^ķ"׉Gɾf-"ωUv 7P/@yN w2) q.Z"].[9r!%+'ӟA_y<}"yMPr/zB apW3cM1υ4ʅY;%N tKݳs []ںz7a&ba)þ/rU*r*QSMRЭW &OYcҤΘxx/YY4)Qc}eG>O.ߟ1C~>O.ߟqy;ȋ0"3-qXqw;V/e#8ܥV-^~GG ": h'h~Tj}I}xq]^D[P5ZUZ(mСtTf6]$D <% $y{==<X06E%Q:Pe#Z|w}6=11a)8woN¤-0~lKxַGϕ2{qT3LfhOB!kOBPhcմ J~ڍO{n7ΕQpZ6[kL*iǕNDT1HDv1@Z|x\ؘj<V˓߉>HIw33sU,_tt_zc}/t7S+ egg {{{Өz]j6 ږY*mߧ6Œ_|+k>DH׶ҽtTvU`]6\ُЎCӥ~u-MnǿnŰTX DDU8E pw8Lpy 2cs # .:`ڸ'Q=ߛ_o١x+J)KvBxxxS~ `ωN8Q@8NL^rF?'ߋ㎅oQ=Gt8ر 0jԨ.Dž9#nTWS!Wq%BLܹbX#5&+c @"z\\b ~wظ/x ; 'c~yy,zcb3{Zb31C_l/ƿ>#qz#hѭ;ZG0e|rr't|y {Y󶀫W{fLdf/ 5" -INe 6 c{4Gm+9–׏uÊ%kr/ lɾ8=o_.B^Rwre 5<u4웁Qۗ8n=?@91QDPծo[ߋĴ/ڣ~BTT$¯\X6s"z[}N8!=*6 *PgXsBÂp|waR+3oFm0%#Q6 r%8  Kğ냡ȕ2wG7[ߋMK]pĝp-.ydVꐄ_Oco@}7_GlZ%?'SvF Y;vh6=Lϱh^03SGo_yhyw&0*THl6 >kms`zxhs)A6 jLOm hP) N"n0;SPMAvuwk=Gw.zXr\L!ݲDz^znS"]Ww SMG V<cknfö@Lz+זBWW`B?Zɭ%4?{ۿ9+鋝 xe7,T\MޮKSYň9tB#p9ik @xY{6ƴ/㤪kKp%az|z/;jK33Gy]4Q}ɻzt*Sܵ1܍`ߖӈ}'Ang f^2o;F`H"B._1 _V%Fx#zW`sa%|_X' :EC\J`|-~_6BNaSzrAҲ0pn,~In䊞S#|mZ[k*}`O"mJKۋv.̉3a2s C-kOL4 }NzvGC)dfh;Kmeo(݊?_%A-iփ'w4N؈si1i|m˻X0Ox ۺ8wwcZ~Vy8+ü /:N5v::˝kR~QZ^U`VċƋA10X/Q;aV8_ R'_ŋp,'_lRG2wr^6?57N##d\>Ym-wfbva=}ލWW zz qt@[?mii86hjoqX ӧ(yVW8zQrW`b, $lHDhlu ^^y6Dݯ̛ >Ĉ;5xMW-v _k^O|9lǢˆ *$[S@l LWOct=܁OS.{r.DPJ2SGbȰ{%>S'AtE<ٱBo^o~3p^y׬<xm%S#PRՇW^}>> RP]M=*,W闐oo΄Sʹn@o|{FXO¢7l$|kSf#8]v敒*VR^5>)RE|?~\Cx'r_ }s\Zw/.noy#>Co15%|~(-e03IG,ШD=7Ly ?͖>zH@u#IsE]5bkMhB,xU oQ2x_7ai#lD[8FAY=<;]|0\2 fU}XO 2mP?Wl"zOLMel l'>ysۧuXn--%Q޶6EI h <~_zTK ' :а"Rۢnn.LѦ/[ :`00CQ=cN)-7-Ra  ev.-=K6b{7=]/j Y xtM{ :Ut[(h?vC~8ݰO<ر+y0GwbnX=C̍E 3/Y8Sc_8v'l~N-c s'D }P=eQ^4y4I pℿ_K]gDR+P膿>8Lc8kp*߁a PyCk=ww'$V ϴ8f}33ceGH=).)C-ѣN;s*®S)d￁Eݯ+,W wEϷ±ni Y3P=7^_$K_ۑѯW8r (%Ug3)m0}1Ncw&V^'wvGC+%"/qcsqDWph?Bq(k(Bܑs[?I 7+=b]*2܄.{acpMl<DW 3% rVVa?ߕ6RO|H6hbY;vx)+Pst|laWhdcgJ*!InN*_J<!߬vWq^O@"yjhfffHiSJaZ,=o/ZX5rR 1; Bf&ܻf_<fy)ȳ2:;>  Y'75'YVbyXVtzXG~wltx=*:bTv=R)#^b-b6֚r{ 43D20r 9V7~ׯEjȺhsog,44IKs_7RՎW'"Re1NMP_8Ƃy+Y)7p|<&um),!ˠ[j[V}M]wA46~3GJ1,x.|nJv ZѰp^1(Wk^/bTpдԌJw/V\)ݦf=v!WH_Mo#ҵҽ}1oUFwyxJ4,%UBPJ>]}VD#&[M Kz:+ 6_]/JfVUe>RP^YA{n)YpHs+Ã|LCeA>⸅JϛR҅z SR~Ԩ]7~]2-Jn[?uSsLl队h'a~޸̸  MUYɊ+V/N/.'ڴ{ӢqeF!BNOgD!ZU^mTµ~8q+S)/8apx`#1/3QY0vÀqݹ*Qa m-sX W#S[NR'#/O vߕwŢkMf.4JUѶ%j$ ̶2 q,EsPGT)p5\+n >r7F"sHzBD5 [cA:wF%ۢǰ0#>;^hu#mdAgO= S[NjaJhl}RQY\n Xd(b;3 IJԳ.Q\ǺM79pGU<s1z@q?+nyA6r^R2JyW]+{2W8$΋z#q@}k:6+)[S?@ Y+7LƪI`6<:𴻁>)$^JRT+vv{c]vW+Vc9+i+@hʭ8xoʼn8dmڴ-GElq"}W"9U:zK8QJҽ=t0C+: 1e3o aĥMՁ]Q\2up 'K;R'c|(=xYsҥX..;>Q>Gc`Xk'"|>.= 0Tv>Yy6 ?>\Ԩ -gkm~N>v>00FQ0b0i RmxyR7 p>*:'gduPqO¶/~ľ?}#tرX+sKř $|H6Btڼ8#֟}> )Ns╃؋? 8`^ڮ/hbgwШWfߙ w%J2fmk7hU3nuac~1f.hdv"2!¼ğ |뺰yy=!" 1ʇs#ccM[Od(Lk@ěxb)&7|%95GIi;"!|7m9( Mu87]'WSE{vzl[z}*>}^r7o}?^"? )wpz^=W@v6өX{'XR}()iñj||>M`VyG2v Q5"v_,}_Yw~@p 8hLJ_ Zig.nCiu)yHAU>yu {#3ڵ};DZ`_z;lzl.Nx/ >V!%\guj|9i q)&M_na o<Lrf-!y$v9aL͠?7lRvgH~' c{x=!EVÆI rmB7\cAT74l8 W~_6x($''>y;8b"o&㝷_{V4{lKG+7hd$>߳ n3ڵ?l~dy39 5]cs Odž|[Sct2\Dť}V{&ůAU ӞQM{w/$EJ:v ?! GnBs{邀bO|Gxa R*U!)÷FTmc\m\NAbaRҪv 1hMg˰apk׮=͝uk ^Дz3WE_ȍWѲu[h'O>yjNz~=Esk +%ڌC3Va.w7#| ~1A*VagV'o]d1Ӡ 4l1_{ӓ#uWIrwƍak[쑢(͹ՠ\z!12>1v1Z xzes' Jkt*܁C " W!ccthSz^zmK7;SKyzBz,sT3X$妱Ô%CR+vo׵XWUPA"¢#"x&r7l>ZVRJV )N[1bxҸUfŎfcb\E٥?@B^o~^kGOLh * pև+1Ӡ`{Hy50m-krp{xƦ(:%`4U I{|ȬQ׫'F,}S|%;ɋw[H7Xrb/;Cvy-TJ< f` =D|/=s\2_u\DDUz&dC 0UJ|'P{I͕*QWDn]?FVZ}Meml\zKㇳr>f;!5ӕ((jmyWĐ!E#K n${u=ĕ^EQ͚Bs,xbzmcTO!N" )6B(!]{x!;chrxnauV~]w`*jކu9CEzc-聈'eKƅ̌t E8l<qvq ,MjIQS<.u΁>p7aι\>jm1dK@{ȒwMuiTuD{qܱpiI{qܱcҠ҅⸰3qߙȝ WLaZC(u./'7RǷw_eS\ˎ+=聉JCyvOc^JTB‰%[i<7p] K[=lMo6 <}L%hi7[qE>&}U7Q d%Qբ34N?gh'Fr)n\A [D^X /(f`[ ""*OVsp{:Kz@]|XV)}&7U!RY3kL돈&-?5!""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$""""""""$"""""""" Ap%PҴi3"""""Qccccj갡v A|`" !-58 %Wo|@zJԺ񥪍-j0j0j0j0j0j0j0j0j0j0j0j0j0j0j0#ԩ<}o/ cDDDDDDDD\9!dLxwE< UXq~聨w#y=>ʧŁ_`dd1L-mQ^OFg^'x- `^nVq =?/:1b6f\3Ow#fVkb1H 71  v`| 41A^Ǝ͆_J}U!j5<@ )݀k˷W=a\vD3d:`T`|3JSk8vF Z7GD|R:r& Ðüa..m ;;i9P[NNptc?e`ko c(q}bk ^0cdQFropʓ: uo-;(K-{5+ic^, 7_?Gu,oH܈OA6nᝏjcenmaBdXEoxHXCeL!}==i~'XE#1ѕC){=6 %,W10U4e"""b ͟=kA.@)?D:V.ڎ7ҡpt2 `l!HU  [ڤIkwiM~A H* v0W!~,_hն1ej#F A"Wbm+ز0LDDT= e`\MF,`mBzl0._БæVԩ# 6FpL"r䖰1W"Sn;yŖ+XIE,v02#7:NoZg3i+fcކOUٷ/a/E <i =cx4x".[f%qWCfÿP@-y3z4 ﹊kSMmT%ke$Qx~'s=BD#B<BhFޅb""Ca_4Q&R( FFF,'SUpww<&32T_@TPQcR]yb<( _"""d!b8P:jJM/>G;؂3Wf o HT"w X2,=+ރϰ:tiuWqNԻ aWoI0GDDT G2C\ =\T6G~AEÁ (dԆԚ/e@ r͞ƌ^ERK˞=IB_0ɜŮ0[` sY2Luoxq&dܨobڈ'"&Ef.&-^Ag#]KWn!7nh\O4YaQWfCfƀ6!--&/Y9ڌ{4Y)3Kh+ޏ~Tf'}itE֐e 38=ndg؆I bYS7 b8T7?œgR|^L-J X/~=djk4~DDDDDDDd3Kސ'JAzn`|jcar4U!75 9jt#""""""T#G~z:TVnl%""""""W UQ.5BDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDT1HDDDDDDDDTqPEj$''!-%Je7Ullla\VYΆJ%r9Lafa ;Z8_!3\T RLu£'ŋ2O2DDDU񚝝[7ck5oXmb^RSJ1jԆP!A<+ q!%%)Ilk|x/ dCif vV b Xo0SݐrA矘pyٳis'q%1""*z-y͕ SS88:U˼gffBTYzA|!.ZNDe 7S-}J<}.)]u-*z\!OaP *,Ǫ-B٬y''$݁_#UwBz!T kPRJ1'I@ 3Э#]lGv҅(<.jܥ=>556Zy/vvYעZOT!yyw].п@#"" ղʲbUHvUۼ+ `jbk=\ =6/:HP^j?eb+7o ٰ0VA ݲ nqxGC\WR^u)+G'>Vt/~/<Jn8O1]taҴ==ߕ^/Z>kx²յj6bXkt^o8|Hw Gy[F~_*jnMBh`H n_oNTC1Ol)s7cnJ?#l+>ӻ'og´iܕ.NK\Ӭ>"-_.xe*KbR֬Y#}G\=z(s;ֹ~PI_EK%Q:}M -B;F/*Ϛ90Pw10˅u..C/?J&I2g][{Ygb`V + Æ-ULaC/XYŧ{)?iy",Xd ~m4nܸ? O8OA^ؠIOl۶;v>_ 1aT"jbK!j,`in$u#usLB`x“ L Uk{(.ʁR-\ac3+9Ձ{CԲԆYdE@%wF|AXT6аq؛=ʭ2qQa~3iyP`aШ=F*c*cp8 u;vG 'y~arxv{ ,d .OMኪ}III jVօTSj夸/8;ZV%->߬ NU/c%IY;X5X/oߌ]'[h_aqjT,<<0pɺflD])֖,U(E]GK`GXw 9 Qi:i!}N0Td#,,Lj)T!.X1+'EE-n)Gj-5lP)bl*LKdegIAu%$1)骋n^3j-q: ۣGց&`tSZ7bmƌR}DLCb߿BA J͙3W 5RX6R9q4%7o,ߓ^|͖a֬Yk||:"{>-[V(,.s,p̤dҤR#Ҵ.^, ;q}yoo3}Eܦq| -G%׬StLt>曓x\>rX r:'nqү 趕 Q<Ƥys-5h;cƌX)[}S%U"rJԪUKz?~P1­ז2ZHKM+_?}Xl9l߾rRP+[^wO$U^:⯅!j,T28@]JA<=Ѿi-(JƝH\8 ׶E `Y.pHDyL̓f0R /+7#qNum _gp5󐙒Y=F^v0l BxoRSRpr,,-q9"Z~8~n%_?w.c 8~z3u)l"y*azVppk捝a&S"!.sOXi'q~hS1<8Ԃ];-R DNAFLrS8x]̈́AbT0o##0vF-Ѭ-Hn F/R~Qʛ]"-%O*0˸ȸmRlKcKX(󐛧 lB%.]Д33נ hզlll_xjrp Ԇ'7tݳ.ve#-]Yq v.F ۠0}Q@,66{c+1E-0TD$u9dlcPȢ-a ֵJƴ+`xex٣5_ǧ~6U͚5Zu{<-ԡ~ /C^Vl}ƞ9ha硷 Ӻs =ȄlPۭ zn6IzA>y[n >)9’84|M@&QlXF|:q|l6}2~k%q=k)J9z߻_bx3c7󀯪Hskz! $@iRQT]UWwuQWQAAzN$z9rӨsssOw朙y;3?aIHkg]O(⶝,6wd!;'x ":A;yEt9- =slm!J<쳊"D;[Nel[B\犎-:D=igLt]ONIQnU,Q%]v!@"ضO8o Q!D{x qB\uc'hڵ N乚o#j"ݎe61:R?c (+|§[oU~?J^)ҋ|MEڶmb?ΩS*⤆!#*lڦpuqsw9]eMuBl7œTL[YQxo۷+ ܃"1V8^z7Wwޱ̉*f"N`l'v.>","=/{A#l!".ʷAplQ-\2(qLjs:Z˶x4+Ж֜rBHS1_nD,s'pφZ|ǸшhP/ObXj2\8))3q,eD1,Bc.NU>p:9K mqhM6;U`Ǯ"x$g{' <8-?OڡCFu(ƾ Q*$kx)z 'g+ @B=z'Q:%O#]:}&N(>)r7B#kBzL_^dok@Q8| Qhmfj*zh9 Q'?dhU}k>m3\kb[ z/<՘*p"w/m GmF&]2c᭑Nvr:`so5k6bgkJ-,{#n^7n#Vu ]o߯S.p-rWh1A V}Y/qFeє3_ko=F}+1oX_ ŨIcrp99gLAWsufrwx?,)FwԿ>nE~מD!beˇ6i$sj3yr<^XhB$?ԖOR"!k.wȥ @B8d{Ifcoٳ1sg ˔G3a+ZF{r+CĄҜF#ɒ.1Tgʔ)oʕyr7f19 Naۦˉۚ_ք;(BU[1Z e/+S^;Mꫯ?/W1Q6|A9<\xy"zYʠ*INiqFlWA!oUCEÊ-sZqw8N<6PK _ W1Pxٟ11<ouMLv >'`0#IՕ5-lu"bXMп_?=J/g<̟qqq穳4ܙx_/BtRm ja@HP(zAh+$O6#qv_l*eGW C"8~1WKRJ _KLHu*?}P BL'P;xP^9|!-%䍺_p0q HU7п9jjyo齃v+802.܃}gѱG WXl&BSOgN};UCrݞb.1 d|1zFaB2M&,qc)CʂXh+S7cɪ$4 S[L؆}j7e%ttͲ.?8=2kށΆskI/;,m'>\3Z% cNFģed'8Vl`u+6b|"R aW+ͱ[䙸.~!5fL __cQ|1Н=y(?D0onb l΁)VUV19ױeL!!v5f !8xH2Z͕s?`XL&3xϏ)C"22R :בYrYFꗓ.l̀X )Dƕ8:CpN?/VY샅8U^ mW&K a`ϱ"TI &Ġx)yR ?y- H1.N"S(3{!,R>F¿ulkxΩfb.MbE :?Q9a$ϫDPJ['(E!p9l]װ<ᩑê߆rLGyJqm5eP:*bX_un>Z0trWV㆔`|82nC5vEBVPM0ۅl]S0{k.w4MҠ`l:zyՕ8ރ}{&40V6[lvײdC[)jA6*YW[vYT* F^4lVkh,aKSwUwq"NYӣ @N|4XZ==LY^ VWUշ^ 8퍓\xzx(^=wWB[&('//F* ء[=Nxs9uy|KR:AWbo }BV«"W8\. :Q_dR@G"{_ÄH \%O;&(0P\*$Y=z(y||' IXRFVXƌq n( r"Rn+sW4 OP˘;<=mye+NXZ:mTkNI.S6 ?ض[lX9Sa&Ҩ0,)44UBh9_lB\_=Qsm/ZEE~:O{{LxCrܹs%Ge(l "uJļFb;џ !xh-dё6Glg܁26x1"֟.[9SrS,TANb@Haε]=6UB58}+lG%wbwxu4N/!+jڡKP*^4.6J`B~)ԡNDuj_s'ȌPʌ^gD -?J硯(FlwOE*-}fPaV~k @O1W҇_6ӗ˙آGz R AeERgMGM E}4\u:#зvT.[ @ьz@ -"":}FV5U05@fh!ao8sM }>u.v9iM%>:6R."iCN*T@7]q !g[)sR+ItW'N+«Mt DII xE (._?ζwdAOLLPĸ+W)b(1{TVV)r=ma jWWp`2 @!#s*^7J_SijmPswۄ]96 !mظ^hj %V\΄̙2rMS1,'CCUy:"BxEnӘͿK6t\=Èr:WVӡ1QV+O0a2WU|m<̞3Wɓ<aOmU%6߮o˞8Y*0fl c 2<2:(eZx [g8Q\SlHUs& wul,s~+@{/cǎ)C|_@ѣFUW=W0u4zJV׎fD> ij[xVϠ$E!llGI5J(-J]c>]r!5!bM _^8Ѕ ̰G@MQ9i3xWuppqJ|Qz&R\TAg~c}`qp? @flMi MEkAL:\ +yLZ}% F uf/ņ6^Xj= c.7m*6bVS[ _8>+lNg}n 8:/CRnKK0zy(F]ǑtHS1OxzcJ@[ػ8Q/@1[c\<"SY; Q㬋Cn)';ZQWVcGemCaehXo{"ÊY? ߫3 ` NܜFHm1;Se8B.o1h;C&nS'xV;vmD,`ΣM/,z' q;n1+a,&߸qw5Bxw˯(C@B$3z3lP|9k{5m!Cxmaگzt!51k\޶NlsV;vHDGEcq-1Rx-Y'KwZ2@|iK_ 6~IIʵ(4曕#ZVWvnttr9s; wd,xyE8՞Bq;"/q]g;JJLj|bj9lX_⡡R q6[*عC,裏w_߾9|qZ^> 7%;w:yK,Uʦ(/zYmذwTWUU!el l߾C<8FSWC/O~yHiW~>|DE^*b^mE(<H3`[%S!`hԑty xK=7;b…~되x8p@~>;wBoϹ?,azmi!G&wF?5(-9 58qEFDwLCiJ 5M X_l݆dDTQ-iᖸU׬Ea`WuOF%!{zAI-JPĨfb@4&B){F%Ca1ʹЊE(jak5> OBrϝr@xG}lٸKVZҸ!Kd*(@=t3C|}`5/t }a(f! >lvxu1cxKw=n'S}#пo i+}-Ut0X"<]ڤMpwఁ6R܇"糱 `˪~@>?@r?Έ6`MO(và ȒKE["O҄aƂ7F!bTv /ivms]:*ޒn@@GuXOt3|,ʃоn @BJ)o+=TPp"2Q`cpw(U+-BJ7gu릸wxf L=fȐJBaC\)\=\qP]둇¼y!B$bC!;KNq\b庁?~1)-0w",9GV#}7~ / B X\#:-wg~LG|%@ CHTq$*2ʭb}^LD/>B|T`NwNj4ȩES2ȍ7j>DC( ݉yZZք*".]˝j9Nb|Y_l,D>qkd(6S)>rXSls--skJNaGVʢZE9a2 IzzS9mf/[YU߆՞]oqsBۧ2W;w섧\iTU]ޣ;6n؈m!_J.WCr'^>"B}J-\X=pu?<{}ڽ["|qߋ>)6q#IR jAp5ntlxO_$S8x/)¯.܃Ȯ1? ) sGEI2+GtHCBzFDbub3pGPi(M uVPc.itu 3eƷm&jv!7w< ?}XR'"=rv /}h9leϮSNaϮwJj`.jTW>?wNqNENF$3/翍qqc1*I3jC`ڝ ?eK.gruxk%MlQsVc.Y/]xwy|7U"?{P4\90{gx}jCxMZ\ϷBH0͒?}׾? Ydk\ 6oB~@gLLг'W$\7H9|J-`C>U\_R55q܈9TZ+B{o߾=~A3O>;wRPKu>oF?mi['iO2!N%{ޞ9"żgrt/,<+wŰ~???['Z|[*Zh`s1pxeV Hdffk)q;_ދ}#* 8./TkQ;9k2/:F/Nzj /{`Cu.~e{w5UԹ;! H9l bʷ$/{Q~Gwoġrf订 JCV/Jm2(9~IAVʼH"} X+tRMf3 pM}:eoQ| fĴ5Iz &8 ޗGٺzrH&JH-Z߲;NDj.[z+G O)+_.e_|C_Ss\FUNor~stSkl܉͆..kKu+P Q/zF׋xwjJIZgTBBɬqU跌n8Wh_˒ 9rp^4FKu0M}P_6Mhs E ivܾ:8 ytYUBX'[:Ku <ɲRw_^y#T?6qch;B,.B.ͣ~#+>hQ] 6KkźA4(=ULkq,o5b%>ۋ:˃Jc}=o##B9δ^K.×7ڽvpII=<.4k:TU{<( 1Z*+XD$kuKֹ:-؟eʈ"]r{Y}-r%">khbb;rVom1#B!g߉vY-vxf ^oP&܏k٦= G"VNCXSqayil}#-@9E8=lUam3f_}-W@]O.b9y X}䕏xs!1sTs l2a͚_`4>=!x 8GV쎿 !rէԯb_Iq1vڡfWzvrGhx񤸎bKjAoG++ѿTWgZR>5#V19|pX KF]b7cN6؏Jf !l3 HJN_KJGGxBZKx3#8$ʾ=[ya]67% !B!:غB!B!^(B!B!ҊH!B!BH+ !B!B! B!B!b(B!B!ҊH!B!BH+ !B!B! B!B!b(B!B!ҊH!B!BH+ !B!B! B!B!b(B!B!ҊH!B!BH+ !B!B!=M@ZdBmm-fSj0t4!B BP$-j|c8q&SӍ(?r|~#$aOa@ܐ~qYbl~D]0[TK"7r( EB8t?'!mB9P$ͦ֯CX?ɷꢁv**Fs@l t1Ye㫧;<ޚTٻqԻ=:x]| 6o#!]O 2a~])+s>ł(!T8*^W" 37v';oz_@ΝU7}-7B34}(7O8^5kHN>*hjΙ7/78To7XtMT7"m)Xf+w lNz o/hnN!ҵ?drϘzdv$vݸ'gcCa BZ$-B4u-OG4Ed8xP =6b+bWd<6*ZPM(!l9Zh$'[JuBO!+ѡͨ$ه9+'⩇!V9loA! $JX?r4!fuٛHJyu<|4xDgatjuzi 2|uaj1wh9{z Qrl1>}sϐX?753 _waOHWbώ\hݎ_4ncHg}x{{Po%wla-(&T]2w#c冠awIrfcܔ苺2}9+K4}^z5O ũ=З_cM8e.>]IIʐQF9] 0VΟ`yxz:nhی<{pn1lY8K.;zt,Z~ Ac \ʐkXn8'-@7Ps>]̌6Zfg!vT3}0@jm}xX,{MشloBH.&ZCJ?3b{ 7!P$ ) ak#&v E) }{ǥ 17yD LhXӆF"T[_3t+qqLuK+ }h\uB ->ʯ =:7v ps#%˨;r--l*š>[L ޚ,$֋A!rEnXP@{Μi&8E튘6,aֲ<#36`O \3jhoMc-6× #H) >0TMm>$?} xNK&Tž_c>;ɅՋ:S=[܎ͫ`{ B! @;hkh؛{6&NtOzǟaqs0k jFᆛS@wO:xs5tֲ_ M4O4L.IQTk__j8g;^./Rf:F4Z%>SnNˎ! :\-/’Ǔo{)'I M-9)9 Ah0?ڃiNǚf!,h:>1loB9W:Q6y]nZ l1sn4?\wn]TsG\<Ͻj;I]To%bqcؽƸxDcTE.1&ẳ-_DtIO+O6vmA. T c(_mvC!l4STKuZ7U4V/1fyj^{96RB$-kL_7Dt?aD~=b,3b18v. q,u&_Xઔn>p>f,|oB>7^>NZߎFsd3ս7˧c75qnl/z5>1rB7]f+mՈqL!j\7aSo@1oq&^Su~i^â=6a͏կkB t g<1_*:&bTᜣgЗc1Q0.ͣymua,*Ca ]p۽ע\5mGb%߂3=p][R2!C!l4/$޿Nj͑6=qQ&>p_:z19tјzLC,7mg{ 7!\04|Nr~2JLbC|J+-4ǨXӧJW8TWUb Cjz&{vk^eFsǜӟN1cB"8rBZ7l7!OTTRGar$C} =I1=Ю}:g7yhC.0L4 !B BP$F4}||ѹ[XFo6B!B!_.;L!B! n4!B!B! B!B!b(B!B!ҊH!B!BH+ !B!B! B!B!b(B!B!ҊH!B!BH+ !B!B! B!B!b(B!B!ҊH!B!BH+ !B!B! B!B!b(B!B!ҊH!B!BH+ !B!B! B!B!b(B!B!ҊH!B!BH+ !B!B! B!B!b(B!B!ҊH!B!BH+ !B!B!=M@C$S0߄B!r@`pZ BHkiB.B+?IR+!B!U*TrqʠHEd $:U귨`=+\z B!Bxpvkxzy#]{۳%'JCҊHEIOkvՊX7pB!اpo8vcbg7@BZ HTۧ^lohF!B!ML`_O",554"! \J؝ckV~B!bwͮBf&$AZpﺝB!B׹UyR$uB\j,c}'Rթsr?B!BBcs@g8=n8]Ζ͘}m<&tKjӧOc?߶ɓʶ`dfvBZ H8E3$AP{9&T:[o}DCZ2P:K7wDI% 9FNh KnrT`l3X!wMY:k]wBA~Nl֭ǟ55yi2Q%;գ iUP$8bºl|a}[`ȕ.Uϱ꽈ҟT;Q蓎Ny6"g:jV4|Y:Kbe^; 510o2jrſ?^'G ܐspއ>!WDC,Jh4 _i݋~d<Ĵ j 7?Pp8p 6mބ؎" vSQ?x=\r^HT}ǒ;[T 5f } X88EEFPD/x8^J}TaH3Aڰu93%~cCASѦT݇O􃧻C n7Xv8vuD%uD'a\~}!5f@glN=1azE3z ?x Wy6`7iq.7>ڔ}Z[ўrkx?m}܄)a5zO k\pdlexE2,iP(6;zЗ]Dq 7[=xӴv ?7}/|+_7(:Z/ڡ sZ'5FďA/̱1%B\;#_ڔDor)x!)++wuzJ_owLjcS۵/ iP$!W/G}(ܕϺRdBEI <7 6\=oN;{oEdc>:\?V؉ϟ}s C5d,M Wm ;OÔ:Oݚ CfcӲ92 ެ`1@Ķݏ#u*ZvM1`gxrlhBanj2ڌtic0` Η]>c<:G^!r+[hwaZmNƤ.}_)_cn>'_uש pNe|x9Cgz @nizu\JQ"lkB,7ZX~}򵌕'Qxh/H0#+-ɓt\'#B!FN~| S.$''5~??seB^񯴴Zzs.6&^O˖ѣYHMd jwXx$7N[Rꒅ+8K>y n<#'PADJOe"Fw|Yy'e[%ea̝wqjO0M8XjgHSlO?ت#ޕ<=|f/p ȺE<: K_ _nCQy-t~ma$L u2:5m(f ^ i==} 7% UU!<\GvD86?D.ÝƮMU3s.{54^0jL1AZ 7Lˇ6i$;<Gڰko^ˉ^nfmp ~'cTrt4qK۽`(ߏ}>KĐ[&ᡉ(5>M| LNÜ`?w *CjMCU!6Ν)_%?f=WMS0] UwŒkuDy5rrJany7 !$ˍ?N}E,!DuNp!;~Aеk=,EQ 2$++*yԐ}\sN@B\p'H1ImP^؄E?"n?0ee׌TLǢE[qퟲ`5V;%ۥnY :9c,+;O>mڽw f,\zr] u/C@$bc#A[Ϩ!◎/ؚ[f53%[eV.w!KxpC<Suq.3ЩS[h7{lX)Ǹ^[%s V S7b|Ď} j`+ RY "U9X] ︎蒑d9q]D-8f-@]%{Bi8eOuE4;\3Zĉrz^3Dģ N ?tqhl8fJGt0 dTǁHjg{$@{(Ė5^ ɽ]ͧȫfqp덯0s2uga0R-jJم3#C<*!Wcg}\cf9Er1\A}5w,+eYEmSalεMI颼"p 6͍EY$ bΕ3gw!Lim]Ӓ:!%^w v,SYM M2;$YAEWv#/C/1J~H1XYe&c< fBi?_g뻜 8u&jL ^wX/׿`uסKlÏ 4Oa*š`tK ϗ@zjfoQS[a:zyՕ8ރ}`eXZ#pBxֆE L[R hVl)Y?-atWqػ~%/}ccGus\EfzAam7ʶ8Tu߾q d#*à5jnvpjqll̜ C ڔjqs/zH2zd2[˝fo>k lك슑+X_:aReWbd$E6 $,ự&4R)Nm.k]ye6; n,} nӷw Qc^>aZlx 'em/ kBqrw^̺6R 2xP]%h UYɥHB | W:OWƾoG{C3oKL88Yx$霫~y NWɿ%r.>("+:BpUg}umrdL`XذZn7!BpOiWճ *򟵟r<x&aa/(3 !!!bco5kP\\{8"<ճ 䒡 Dь} Ptz翳%. D{S &4/F;-`ΪEO,KjzC01tދx?1>9#:ٖd Һl BODa.NqA:r@/z@r98PEDt84.]sn;߅<:DޝEQ%}xUyYjfSտҬ'˧RԼ2-ϼƋD "~ޯ 3{faW &j<(WQ`\US}NLGMʧgl5fqtFS[.h^BԆm6[&Z%U2C]\jT'w|Q!1? SFcIvl)^nH5/8T. s3\T٪ q.Sȥ"7@2Mktu%O?~ ߿|\;PIKxqg/6ЖacjɸC~r큈t3t7V֊הok '\.kn4uvF~bP! 1Hkk@rB`|Ri p[0tMqUzSkyGcՊ+m&Cݢ%0̜\iUtWESnL@T|ʖ9i\KN=n *=1\BT&'<Hsw;˪<[s: +F)UvV6Y<XpIICF Xt9MrųY+t}}@ U$^'.Y0;f[ڀ@˭`..cqX$g%5@QQ!ޯ\UTS>y˭],j,fڰƻl+ 7n@P:Fur7'4vCa6eVCacӾ l iUBu_, j~ڱ|wwMɌ;}O kҦƵKÇ[w"fm`D+אqQ%UllIJMƽ]t-dx(JEpᎠ?BALwuBn_,L0ж]ܯ__mt K-@m۶#77ty% Gɚ>0{7Nh e \j^=`$ l'_{ Fg Bm6MEmGt kӧ{Kqm¼]yh ;4Wp\8ifOv7nºf] "B=;m<ܻ)foIJrY~*.g e%AP XV#Ֆſ/Ųj]K.U0?}wD-$gy+ X7‰.>yGl+w’bkp*:&9l=aX|vf#%FuW~̙30/C8߳ 4/ N{=LѱCs3R9߱]ϸ$h*)2 j*/\ԕ/y2Ί/GUS433|1mmas _ʼn6#0=.(}XkM.Oɽ8!\)]|ۚp8- Yo.w\]U^uE3u=}18RmM:gǕw]1lKVӖTXZ\!8k7.|R.!SSEп6e- UCH>~jUI2)cKpŁ`ʔG}w[p~AW=Μ>S@ٺ >d„駹&`=v Q`ǎO\V4@v ]Xv,\hpGB›%X{| z7qnmF7,Úݿb\O< a=w-jam myLx;8JԖaxstHwt;?۴35(*~[ 72 !k}k8~`2 7rm_aTeZ()BYW$FT*.+,/e5F e5w%Heſ|(| Ӱh|G4 XۻE`Ȝ>a[vcgT|Ɇ21CԞ] Gle]s?T$;+X5F|F,amŔ[UO6C˰` 6Wf$4nλYPZ 25]O]Q>=J_]_~pgaچQomحyІs9r4}8?-[(k]'V>L{-!ԩbdhWިd;a'K mCa/7Ndzq '"jV&gHn~1𖦿*x>k֬PZſ5|Sj;L.ǎ]0І…;ޟ44=P)8q~@Zq;8c3\:AV㗅PPP M|GY*J ܕ:/=[QpJ^rj-y)/q䕑%xy|0 /,0mn_t}%YO'D &v|6 k'/vEB\݈V^qu9y@!""*ub<,]*̀ĸcQ<=P8˥{ЧCL222s.DGիWCӻTV#[;2/1JZXUHct\JRƯɉdxV[< ҷ˂~$x~g9ҽ=F6RԸrd;4pq< mފM{)/-.uW׭%"""1/ m=JH3e!OĠAҋ~ Q=nX_|~JSzOv 䟒ĖΧxfpAY~SH$QW< І8  lODDD.J'ʜ~{*ـ2"s" ҬY|qew|r<1'< {h{9k2OxUG`["""f_ (=t!ryݧ %g*~F0HT_J.->G,? ,wDDDDDds=ƵF '⭊4,H0HT_i`iQWig+xWke]&M\0 rYm2rd%K?nݺ sG0HTO<=s4:wBi+]\|LS˕2;nN'"""""Uz۸m>ސ4q9q6& qb:ͨU9նKጻ~}4}^6<QTcؾ};> VKsuufy{{`VVYׯ_NBNп(iQs&Ax0u F$Lȭgk~Ѱp~g D{ _ԦXӤϵ$VM0]WyX4ڦ7F>2k͍s8O:rԧp<.41ɸډN-00SζKc 4l ^Òi}qɆ_@DT#X|y mۢwprrty1"]ۧO;wę3gp!\t GiHt886c[6VnD sꍁ@DæM3)pqd쿱Gf&Ⱥy]Ix2qt|k X)q|9= s^Cڏrx凇›n\jhv, (N3EKnϊ*Y&܀лm#)S+|7>J_cUE\I@]踧h+*\)>ZrIPzCҘP8qx$||1r|O?`VlFt9s9RfO|mյx_M^ޅN \1LPN.;⑜ - 4OEdn> ξ1m`/k32~jPW|D!`CR~/>bh~8U_dKk+R*<5R/_!:1EhL{hd[i/ 6odv{3jn!:26[jX8SfbT+3 V=k ɋ(@h"gc:$BiӢ;?续wTjv׸>1C*qYON['"bBXB bܸq˫| >}zˈDq]b`QG0rr>on7i֊6" '+yJ۸#75DFamA[F2nųA KaӢ+zv N`8\7w?E5mZtqCش#-+#8gb֛'b2>{ϾLwU{w2=gafʧҫ=‚ui7Ɔu0.7]J4m1F#ӂX#h|+ʬ98ӈPZq9VqK#M0`Ne"+=iWM-JVf|I(*RC=Vg<㋗faWB^ uƋx yXܢ5q8:'~;Rio`ڬ=9|>*N'% oVMm' 8ARoB-!2rtvuE8JE𞍬:m1]7:p~ +6_BYč3wph~|p] 㩏# h4r8wNH^Vo>1zJ_=ҶJeGaDymg5|_'{(5N^(YpzG8{:4m<(}Ff`9Zz@\g{sJtPۯ^aDnJ/0utclwA$cCjЦBBU>:WʾW>:g5=4|L<';hj?T":ԠرpppO>7gyB!S سgtY?G.!9媯b3sM Z;aّ8\U#Na pᅡ^GDvU]"gjM)Wq݂ C}r "TLrwvyI>+!="cR!i!Zk!-,W yw20l/"?Xǟƹ< .m= Kxʳ[[,'Q8 PˬСS[H47pdWqIio׉2yyOĀza K]i qLM ~\SY >A_}=N٦mQ_4\Zي~A=*3AP8eKgO^FfZE-RſW ym  *e֥.^W^5Lzj_:5~6juq|VcƄ'C2 1H Ў(w*VVV:t("""pX[C3!]\5 %TҲ՞.?!n}G 2a hǽRzn-}2ďk`D E[8_gH\0d۵ɧuU@a3oCٳ7A>`2^+28xaCj@ɓ F0WO©@$CqD"F8*tZ9kN &Vu8SX\FJ9hԺ"2+-h*ob}ŏh QPhƔf6qٰ+!*~t\' m^,Lhkm| N[L^ nvt /mQ: İqOᩧ¨AC!bEH_bLR<<*`ټԾLvm&n:uL߭a9Owy0@{ZcݬqT5CU6!VoʺdҪrnHmq 镟ӧOK\W80ɓ'ܴl`裞r,xkWJ/tDN]|/ޯ}ldT\;-5m J~rX]En ;-RUwwi>lƀ6MayUTAŒ3Ho%|>?n'V c_)jSn=| ]2-mʖ44H={!)pyr N +eMغb'zV Wop=Q7/Jpts[՗B"]Z1 [ZN9a/'୩{a 1+BN E<HkRN|Dp0{Gjm¾j3}dH6lڶ(ח-nZ?DCf[dFzsr~s#>ٕu~(ܹu{~С%:={̑o|=}1o- ~| BU3jVM]lU]`յk{4Eâ@|2O秾1ڮQ㠰`aW|/0 }NB~gcn Ѡ|nx2Z9YB'p ͤ]=䵶c&,:Ygn] Vm|׈`Z&>VԷlun̘Py2:U[/wAD 5ϟf乹ٹη״iS4k IIIE6mLN{h瘞a{0eIQot+K3G4 lEiD\@ZtƳ U "sAQV,' 3lbxy4fMݼ<ب'~i l +3LX Vڣ=5cYTQV0兛f>>ܘ 6hjSu~B PBYEt-VK2]P,̻#0'mԓAm~gնEOO?‚n|bn b6a1(4ʿz5܃{anr~dNBl;} iS s}Ti/b嶣KDN~hjVM{ J"IV¦i z=8zVTm[j̞"Ea\ 31Ijlm'e=>5 ;Ot:9kV;?>^VE`ؒeM_^y`i˿YŸٯfavfUh+[z7+OQaǓui=$@VQV;HH߇Aw/5+2/f6lǥz2곆<2v. c=@uOSbW'n|io>]p?_$o|Q⩏3?BVbL ǫNcGoDdʸCOG~xE}axKnZƗ6^Lp"K!F7'ȳqh$6xX}4DDDtH4g&Mm%ۺu+s+4,WYxKDtwiss$ %-KG7_ s5^^x G}Zw}r\[o`֬YP(@DDDDDDTx p&g>...υ "''IDDDDDDDT$,,tO@2'N;L>W\ɶf$xO=LMMf 駃+$5k&LHHk,Vɶf$1115^Aml!ڛ޸ko^m ,"U ) ݼ]2vSu~/Qu]d\;XEDDDI-[ ׮]Í7j18vX bt$%%I 0~CE1XxS#C.Ɖӝx:kC S. kC._CnIC졃8װ45iUbPkˬTl7gYu9U=fZ5i u""""JB۶mwYuYYYaxGV2;v~k5hVprukXdMol0#T4$ 뻼Ccc-GU=ުaӔ,2Dxx8NGK#) [Oh^ 'tTN<+S3+Apzkz/m&%/+<,qrUh,-ʖiQ2\]x$.a@^\\c>~Z)yPڹ1KmkAY4^ oB\J.dpC T[]yպ~,ǐVi& /GWQq0y=Mt33}֤=RƎQm3\׆Sw}<%+Ø~ϴ85VE]ĕ m{b Ss:u#-| 3>J#R&a7)=ڤxHNebo 9XaF߸Qz6f+*FW nzb^M̘h.q1|q}\|4IXVmyx-TpEDDD 5Cbb"^+WJMs!Z֙OOOt f!(O@Ž_xLϚev͇LÔ~ɄMu9 h ܌^~sfw񤣺tU;o<~UHWf,~?&ͧ,vx9~Z%Vgl| }NsJۆU 0t =; /8g14N(+㇭jZ1_tNPGhn]ANSJNdzB;Y:3"i hmnNd[]7ES.UՏyV:TE͑uS3' oX^P=`ܰ4|*pY@XGD:5hw3m&O!k,xrDٟ~+[kuuj!m`T>bj30o5-˝(QQ6FHkXRaF߸0A=_ C XFcEkn`> ,Q`mm]feeaŊ|21fi[%g[tgG;dk'SвSEvS"| ܹ!Dv~{<)i!20k} *>%qp[kt)H:\{ դ EU2pobZ>]bi;#={6_Cش#-+rM Ӧ_nۊʷڸr~ ;Uvij m? |38rZq`UY]{4ɸV#Hi=;f'qocx>5hw? ֥cG?xà7hաP?"x:yX#h|+'an#5~Տ-=,C!chۮ~ŨAmVmq:&pY$Y@s,o{ Oե#@OAKJ;18l0h}lիW֭[mK+=kfLgn_X\sFv8C}%u{T]k',;p Vy~hه˷of\5AzU#dy/ pdgKO3_TnAMn*)\SGJQCڊʷ:jԏ ,*aHQTڥQf1dՙC8c:;BSn =.0k g%%?GdtP]* Tea)"?Xǟƹ< /fu-)5 SԳ1XV~ŨV}^ ms2u'ΣNG'a܃+©d7A{=#"""b#...=KvKΝ+=%XlWW!RSS' 9sF|I!A&W' h*kkktǶ*9 $DbM' שB)&i &@R)54,)%w}->l3_<>'܁֭WSbSeQ 5*ԫ\Vb&6\mNkF-zC^}Gitq\)3A=3Fdruk g(m:W{O p8jЇdf!ފB[Ԡz?nԾ du0_1͋mN悐N>Xű7Vb$QEB0<-'N_yHDDD,F~~i۷Oz>}Zz"00P 3ė(==]z?ׯ_5@RzoϞ=Mv?PlΞu`Km-K&C7G} ϦBwqa-C%dgH ! xit_t{Aj. [f#O\FQoʍxU>tjW܂x' @2WwfĤ@zǹeW_KUcPߩ,tV}ehҩ>;`XNZO4F1~VYs\M|*fB]GNGض+/ûkWxkH| E]_gfzfbl;4hL6`lg&zt۱{}1 V>*?n\i@*ӊc() !!!!T:uJ mxJe aC +>Pd'!Yt낡z߫f[˱E_* O Q?slk56>_m :ܵuN8"IZ[:{5L*,i>lƀ6May>HH3Ho%,L7+M-l ~y5AIa|^5ci }¢(&HYLO+nx2Z9YB'p ' .;ӔouXQQ.U׏}Gn ;-RUw -¶/V@}SVhP[0.[6[ ͧN? Zr˱b3<81LW꼣!ujuz7{'J:uտ{B1Eϸaz;2pۆc mb.U{8z6_EkncQ >a&=WqlrsԈ`РAx衇}.\@JJ4/''GZFh޼4KPjӳD 3X|(<g,Z9~a$ kineM>Kg@BǶD0兛f>>ܘ 6hjS|RV}*]g-ٵ53lbxy4fMݼo?4!˶ìeBr_t#-DA k&EiD\@ZtƳ _i-|::?>^VE`ؒeMɡϐ3UVcdT^?^ zb.81i4Gw2{J=u{T~0dz3vWm?+eĪo21΢:7N{x:l-Oy ~C?bWf6h&wܨ}= i5nc0ˋc.^bi\{f5vGxbĩ°Nn6 QC$e HE +CwUNK 䚕yKg/f'F0=ͥ6{<Vnwx,2B>wLzI) WQwA7z ?˼ħoyAwSUo/5l<$B,{RO!F7'ȳqh$68խ|$_HDrq~''' 6 nnnFCѽ{w^W^cǎ;`HÖ`5,,P+?S^7e&*/X݋/<vө͎Ǟukh\H@\; % 4X>e \Z^+, /|aÒ,4|k kdd 3X6qgax4UKUb'pawmul~PqhbS.s{x.Ә뺮}}@2͛7K~~~1b,--k>wwwL<+WD||<,Y"_|d)8{&cP{˽1tV~6[. ;~|b>|&F] %feN1PJ(@ƍ@nnks 2qd.D#JrCXx=j_{ μ9xC!qW94Qa VXX+VH?___7N_mDq]b`QGǛ|hp-- 53qx$||1r|?j| 3>8g,rdp #'ah{G:ä7I&;/Ew|.G{c3t}3ױ}z `ti\UY̳ҍ%, 6VGlJvtL6"ƪ"lSnxtxmʖOђH,ƄIn@9)kN_^3Rx1,3/`ߊ\ |;ms.y˴ qvB|WϮ+Ġug[%Ѥ`5: Gۍ=|*Y>'HN˅1tc6)a" [4g=6 #&S3VEW怋{vD|:`G&a'3d{GO?2[1aP9*)uxHSѯ3<m(W.]HHN(>G M_e~Rn!:26wQTk~WH $!!j(7XE lد{ ׂ1J* *RD)gw %@; {g991g&zGۑۜ/&0ws2F+ǥJgj v53~HbjwjEsga|Pȶφ1&Vh u-O-'ͩVfɣ_T/ J:t*r)qD,}a3 s󉛳[:ǩ]&N㕵HH)3)c@Z {>Um6m9;#wħ͕9m_9{s0߫bQ|Uw~H,'WCC%͉9"ڢB}`ySA p+V?_nn.ްaC<@=}!g44 31f 30JfMs& 7r^PB<Ѕ]aۗoj |az-g~sSwL|3|qՔ5qr?ۜM]Y\ q';ƕ]k|Մ۟IF>ʚ_HNl˷֭MxgNNqbR1Tm2K0ܧ'2S67"W|?F%|NZeS0]sHI/Sь)wx^lR,%D5:7=tK?ڙчNRvQQYvDMi. wPx)]C;2O 4l^q2b;}4ﮩA0" N拱qLM|mmBi3 L^AzrȞ=dŧ"1dӂiR3G<{4Ӻ^Ü?]T=T7mˊ$dxlD {UǕ"%`zFp\7hwZc\HDp84lr}6˩UXM{3GWe7(ÚYSd[4/Ч]Kӫqj>SٶrYPM_iٜj_Y9ܜmFϛ RX^ay3m&OLvv߫W'y@طo_XnX޷ạY&q[&=oQ{ Mࡆq<}Gp8#ϱh&~#JEx7ULT2XֿX"A% ^$-̾ kYd=iޤ)u- ȫ^;VKl" /y-e³NK^gam[O6Fn_NuNXG8Qly~^2ˋ4P7 dΡ8F bL]. Rw# u)2Np2LMdƏ'Y_^m)ɰ)ZĹ,|/~b{ϘySf41 :=t1[WtAAz}"n'DZ*@˧2{?~۲ع5Qw 7EДT'vxs&<%ۛJ׎έKo-#W`1-׳3;UD [{GҾ|ӷ9N 7p•q=wOmۑ;XmBfchZ=m/Ws*=lbђdB~FXϜy5ҹIs3Ε{r Mn&]{s XTޣikEIlV|-hyѠs 3KK@۾wKI;-StM;]m#{>ʠ~ iKsTlP]{moG3m;8۵KKms|pqMPNj|Q[%sо96rjq9.vnP,ڐR9s\TOn) @ʟi}coF ={\,Yn[VlWvm4h@||hػw2>O+:h~ Y=yx7#D h4]Z4mT99aHT%`v嗌Ke~^5/ 9y[]bAm>UTo?@QvL=p[MDv+Y:mt񉥓" [=^Јm,[9D; DW`{'OU=Wֱkgo>6Sy YÝh㲘wb`78#9l+s4r {X%׵ԛ>umb;o HPGRPPݻW֭ܲcn\\P5>% kؘqJiii.v֬0#h4bW* "lv`!fÝ>Վx1_FkV)y/A{05~,=֫S%iRjאZtm;Zyؾ3UѦ-+mZ{;e?\rص%BBF5:= >Զִa-NWz E#$~|1{:]q-Z7r6(5xN^Yj'7#];Bх#5N_!O{o:[Z_}ͤ;IR(bsʾ0"> JWKVɉ$n4 '<2`o*=U/\h,9/O$-'y,8TY[[rb00g'+1i g.6F ya旟0?C4f %٤Ytdafɼ#kDhCh.oĈ"FxdbxS ycσ8C~<'_Nnbnauq+Neבsw'oXȼ.D±mRMnyy}2OEh8%cwz4Tb #ٵ޵Bqy}7Ӷ[t5t9)ى U9Xos`VGZ\znqG*+_N6uVF>/7)έ\RJЛsFff9kΩyA \g!,,̡,EX ~_n pJQ%ϨLh}=F62ʚos& ^ըC;hii*c9M@pc(sBqFk|Oܩ,t^Ԭ׆C[^ loS Kxin6N~nKG3LY07w?A^/OOcSϺj/uЉ߯I enRQl!nS֗7KMQFc20n0PPdٺ_@|O_D΀_!iݵ7;׽T4+iwy3`z=5gA=>~\ ?C a#"UçQuRK)כ^?=^te uAmg.12"NTUC#tf[GG-b֧ݢ1+>_1g)Ӿ+ ݠi^U>t"cg ãh^ܥFgWzUzn<wdz i\%2hkѥ{f'fбSDɳ:1jtsLfv u~Cqi\)^;/š4o|ƏR[𘇸#PT>v/J;99ecP3#eh.r|}!:_~N(έm*7 'ۭgk-S1? ?ME"\'Ciph+KZtXWgk*{g}O?MUo\QF>7--> OOOFy]/}?7b:7ϿȪy?\O󹕼H>ʳ\E!Bt[^rȣzU͖,#UHg :+? J"JOKN. tǘ+jE#A' [.?3TVMyΧ~z   ?\ vξn}feeYAAAA*ԬY399y }    !@.֟׭ }][AAAAp) v_>'OvKMM>    @ ]\]]iҤ+W^VXaٴiS\\ë9ܻU~eG_RsXsY{ۜ}kïɐg    UtV޽{9~5ѣ:N:]aΘ7y<6Nnfb̅L:LjAep%Nbڼؗq N]}&cM n`(!q8-~:j\)WeBAAAEWN6mX~= ,`ذa_p*=*k@vhOҚUl? i1/ LP9pT9'<+鮁9 og鄩J;I&@gQ5|;FR7a0,,tLb}.wX;|݄gϞ%<<ÇXaI$q`~ `:'I9p& ^ZѠK5s4͜ȈfnhLlpJЅsL)fd73{Wm4ʘH@ScV}`6\.kוL}4֢Y˧2s$h9[1^1^}ɴY_nzr3; QqL1c,u%fJ?)K5c?O>N^0e\&;+'٦o^GGuU   l²wȐ!c#((hkArG尐i=,[8SJPsΕ(-qsCtCso,=:ZmrM4ʆD3ҡzE][Ǫ yVfg/NDv;H)1)N[W8FvF/װXZ/mL1nO;nٲdKwqW7r\We+   \ Nҥ -[dŊڵZػPܳxz=M4B M >ͮ~A{ZC{ܼpkCf6aP2&P.4ss,[c5.tӚZZFTCM;viƗ[7rh VA.wh~6TUhb{:lݠѢՔ%Pהm2^J XOcI} ͵1Gآ||+gn]ihvkH/y$Sd1=:AAAnh(T///íjСCZ͵~???[.AWWk$ZC+W&;t۴&K#ο@≇A9?/䣹k{Aq>,p*gRؙ~=X_PBK VEg)IKÌv4>Yu`1[ӣKԴQFW$\YX$1ԪtjG+>k3~݂p#3dGMi?NZ˝nu UPR#FUL $*"jϬY8 'UGv;RίԣJAAAPic=rǎHZ̈.$06eV yX+RCLּ7.u协!:vqOa &s9t5nOL`=gmORَG n9ߝXCo_4jd)Wlٍ-_N'< J+J[+t47S.$ٳ8o8&(ɣW"KK+-ٔʒ󧯎s*i4[Ob=-@'l_,%/0"R F_$~^S+T] |09AAAn(% BD7h l՚: Ec}n\>T:]|Q EyrF`tٜ+tzD²Ljni\ /;>~qa4M_X^:qANmUՈ:fyP}b7DѬY|4`3[:~txz,ߙA^E.>Óf냺Jq&xl o *%J@/\1%E/gl_&7(J?é2?<טghw<]MqP+,ہAAAnP46o`(Je9,[]ranwp(6^# Rʼ ~g"5AAA:h4ʏRG!%{.'K /    P     Tad PXAAAkl    P     Ta(    U)    BF    P     Ta(    U)    BF    P     Ta(    U)    BF    P     Ta(    U)    BF    P     Ta(    U)    BF    P  ϰ,rhC{Ŝʺinx]di_#e3tWD׺JccߏGu=䓂 BE ?)7>z{籏בs Yόgė(8oۏ}/Ռ2uv#0II-yl;Lg{]wѪW}˔A†=JmY?ꬿ*X YW}^Gv 1~[OnG_Tu B% @ N,{/^M~*|}u.=BHgӘw1kKQ*Sg7;[3Yjykov-r^UȣWƘ H| \CcNeT:>mܸN K,&:MMfWcGr \EA-R> M\,*q}{ӠM=ؤ;[h"yƌ2&3l%3m&)CD,=z1J(ɤFsO-4nO\DQSyi6[fOf$΢OݪYktoU-᳇YcnNtzQ= w {;=ј8T>|28f1qg݅/濝r˖1&۔?,9h̃&=ְ#)Bb੾06}sW$9݄ov:Q팯1tvd۫tfO'Owyk6Ng %ևyr@,կH9LG2)v!v'}e(mY6K~9pTK&y&Wk7]s:5aǢl# jH~0[c&a-{gaIz L`w1M3eO3i:C:yy`+>^iEl@>|{t}Y"{E,}z'i*4O#c)O^M6ƤWi?5Ux?f~9J\Ι1\@C~)5%E}V]WĎS&Ky&q ǝϏCE&;:t:_zyrEE̍ƫG[Mӑb,rs:>f$*֋v4 }]yUĸ5D 0 %hɣos)իҷo.<7?_UcKK_>OFjjݙy_M (gm+kRgHSƀȉN훜+9{h?ʸ{W>K ?S4Yf1ˑ78sS9/|. @A*hyKrW8_6#l˚]9C;K/dѼCab&3ƌ`xF(Bfq#j 'i<.={̋OEb?ɦӈ{@gh,&|jZ8SWx{7-q̎exUdNǩӘu$ z &1ZgѼˆl;/Qgu=XC9c)ٞN._xŻ gv.d;._Ϭ`{߲)_wP9|˔ލ;HUrH;E&!=޼2Ыbx./9ir*?J҂ϥ9."{&eoڧtsCǹC9}$E/ފǂ-y袼1i؉uaۗoj |az-g !?8msv{XQUHo~g0(ʛ3Yx魟eGfX% 8ՌW:bJбs9TXss6;w^{2å4;~CI5(_^;1~)oH6SO}."=>^qU2nQHqb5#PM_)zJ8gb༇yާ?s5 |İne\X y+:O>z6?;jwZOeώD M9+:Q]gsS9/' nXS HP@o-".̣Y&q[&=oCSD- j ,wZ 1;m;J-iU ڄ,дz ^Zɖ43eeyD׵,#^F^]QRFJpOeqF;’IUow)LCdggh1w,+# ? 6(g #Yura,uZ?#ǿX c)$ h\c|{ߴg[Z;^\zz8^Y7Snh_ 2nQcCFtgacix[8xzDR>GC7XiSSսG?mYܚ4c SUPΘZGWo 4 *^$-̾,?,qke@QMJERF.9B ,Uй|aWlu!/׉Qx=#9ԜH劜chռdk" /y-|1^&ͩ vp[;Wiw/49Tܖdv%[ bu1v~^׎έK$[F^w5s1p~}ж/Rf}?mf@NW0sc/[q{ѳT~5q04썫e֊Lb2/M66`P3I 990_O ά)A(U<ӊ1Z&BVx;Hz5x<6 tנMUgDN;u֬EMm6fnouĽ4]ng[h_ׁb$Z@5eIVLɱatsIa}rqyXٲVz|N%juRĩ sO⏝!ψԅ*x1ǎnc҈ap+}I2ҧƋ8]pDL~ ͘L{uK"qazR7T率F] z=E>|c!joQV6$u=:VeUNd@ێb$cnCb3&gWoOhq-7ڍ9k~S^ KP~GU:8/l-YnT1>ꈽ+_cxs,_zEвv&(ci[FY̶b(jԿnְh.v"6{Q`jwdDDjlO⤱*{δ_5|TH:ϳ7.|b [=^Јm919쯉 jV7D?a 3n"z;ҲuYMVYFwEFS&X0Qj ~\ /Ao}Q˯[SEL5Kֽ7=]֗e;Y EɅKEmװziX_Vyx8-囈_9uxpxSVV5>TOP N}ZSԝlZFEh5W̨~SXb?k?&c: 秈 6U3[9_ݨٯ,*Glqݘ~c'/^ғseqWvvB'vsQ]I:v&7rZTΰQÙ|3s_݄oY4][Hl0]I$2ȉyߙ|Y2JhN[UF<%b y[ui?؜?7Stm-{:I۬I尿"L *6W'wG+*Uw䵛vq1ڵ#D]H="\ػŝ%O{o:[yZ_}ͤ;IuۍZ{1tnjˏK~e₫r5s.63A˯ C>&BC x&88:Dar"F|͢ "ػF2 Z90뷞,%QYhի H,JX uřvߠ <}n[[bYjGfNf~yS`y@u;Sђ[m"gkS8j5{,wz%*Թ{ԌEcC^5!֘Necv_xbxS7Xt cC'=_%׵҉QG]9:v.7Rgp HWlV)o1~9}{6?ۜAiN_ywƘS(m3p[2߸ vگXܖ%v^zZf, S?.t.VXMFb$KNo5_O'wA 6N gϿ%ث-}{@9b&mJ u05#ɺ M,m"N nũ:r}JЦgItOSmC*_~O;: 0CA*Gkѽk쾏@WwMNy ?]I9S<QDJr (ȲSY`8#[Yp ֓XOWqo4&?ˠ>xh9JQ_\m{ƯJ㏏gTL4zWӬ;od{CB[W}ٳ8o8&(S.]/m,N[MCT9_دqxSb:We<r[c79oq1xs4ܭܱ|@EWCshBNv|Ŧ\uN4j|F:boU}:#1L&7,d^po6&<|e&ul=L 5WhpG:םi}ڶ 1=YZ\I~U2wt7[wVhy-ylhqR*y3%,bA̸ܛӣ/͊CӍW[x'KU~6jפ 4' @AC}h'ߗ.聣xKQъ^{~/,%uD}eMf9jԌ!h[w*"5asato:>4Mgu{"v`}:{q- 7y+,qsr?aw~PSl,lhg`*oIjd&Ǐp0EW`4]nc}\@J@/))i~F<Sra͓x=x&.Bli=E{05?:<=`$fZ0_yt}O'̀\(-Ow4{-^Y?oЙ"܃ж`cc ] y*Ww~eƬ2s 7}mrڸ^wmxbΉxs w<GX䛶<"%2A p pΤOU%Anhd PXAAAklhE    Pu     Ta(    U)    BF Wab߲]{ԲʺiGN2p[sXsY{,fNcײL+VW^em>ʎdsAAA*) Usmb\nZ ;.feBVr2HذKnf0II-BvL{X>-irs%NbڼؗQ ŷCtY*۫l׹ d̸ -S,˧ zhrݏ#⧣*7T|\"  µC BØw1kK?Z }l;In.%Uj> f :j܏XvxL3^s x^"  µE/*66?g#7 WLMU2*{XɌTX)vQEAAk*J1qg݅/濝]tdƲ$ehC7Zٷۯj'&|뵣СDcNc9YF65qV>e֬m.BJ̭X_Di )Ex4a h_ CC!eߋ积2/Mb9>0^]荇YɗS-(cޟ5~8|kӼc˟<]kPB]3X>;faʊädat!aG>2n&a-{gaI2ߕ?ʒ1aʶl12$lL~{k(6>\?Gh c&;:W[WI`q,^B/LX6^ 巣O!;l}P;yHZ7E3{F^ bx3rGs23_ H#.fx1Ʒo+KC5ӕAAA Ƶ w@@KuFnA3qrUfѼˆl;/Qgu;Ǒ={̋OEb?ɦӈ{@Ds ݯmp%vLEa/wGb)kLVI;y_E_gceˆfҋ\ t'l[q;gQ:7AVс73]V_mFW;vG6pٴ];H26,v$cTQu,:WUKcŇ! nsd%7ݥ+ϟ4zj⣄GjC\vŽʨRX@2楓9.9^Cڡ ,p7 Y]*mƴ߬H|ԕAAA `k],J)?#yPk!q0yGcѢMrGg<8?+^& bMlEcM,o,%hl1E(*( ;W(W yInwg杙w޹-scxƮv5.gڥB8?T|]Exzh. UWWGW@9."ADDK4[o<\,gq Lc):Mht#y>Fw${CiNg`>l_.mp/J%\z8^Wy[4vA_+tB#\ʿT=}kUh(︲iϤ@H; -<|2wv@D/@{~>n:q7N([?>>51`Skg+RQBAA$ !{tvhJ##}m]-}NZI,c/hq1:׸Eu[Hl,PkK'xs{=\tpY}s wv sv h¬N.CLOjcZoUko+eRQBAADDiծ!|>}~ʂNr $,$1%J,MU1U\-ep,sa Hyh] l[?Z,qf>2 |Mbnܐg.P5 HMٵ$%|Xi@tȃ~[_ULZbJ:=*M'=Ǝ:>AAAT $!04rsdBgOɐ{;\(KDT{N*ڋr8V>X(xc>n@Y8khHbq9*uΨͦ Ӳ Z4E.mxڸ;{cmìGGh_0 N> ?Vn"9k\X?¥k0*JƵ;~Trf,RƥNv Sߢ) S:|{ؙH$^V|)La8 Pho͚Oqyh 7<+W0ma0H2ί,8 k63A|w8 疌V0,(Wo-"-U>č}#\ In>0D4*r[<f iKŋBQčS2U~|\uLJo1i[YgxbD7G6.d   -B{4,ގS3r Q3133Ʈ3}&>k@&d.#co0痍8q)x!F5*̝2yΨ`Vr cێЙ0c,93ףtqzn!9 ʤ!7S-3HR^\ X;o>meE1+,($j4AаèьEnZ& p@ D11cp[w09EuQ d -_ڍ}. 56vԟW<AAVɳ[ *>P(yʒbSMe6EA\fS m$ AT$oq,=,{b  /a2 2)Բ2aF ]HAAAAjAAAAD5n~Sn&   [7t AAAAATcHAAAAjAAAAD5AAAAQ AAAAATcHAAAAjAAAAD5AAAAQ AAAAATcHAAAAjAAAAD5AAAAQ AAAAATcHAAAAjAAAAD5AAAAQ AAAAATcHAAAAjAAAAD5AAAAQ AAAAATcHQsoǙD9,ܿO'FMٵX#`pm:LKB)W޿QUWm,Ⱦu{"BV[#L#ow1! joGwN~Уg_ [|UMHi4֏ѫ #V<{s|tЧ*m\`߯˱v?4? 'GxiAQ&cR.Xw+/~97 TC {tl57&Fl 5s᫰f R9_zs^j']._=bT'oheǞ A5jXf^ TGn3yw_Th43L+\0#3࢑-\|7 ^6?#'.Ɖ] TG1;_jcrNUyCj7% FD& e7R` toSu^._ L.1t. a^XK?Q-06i}5 A)"ؼ Epjt4 beҘs$SƊ,|WoG$#2 8k^ F7#m8k2!5}ߴh,89C"!K~ć.r\_9K{ǸFUFl3wVGHFn!ӚuѬ{0͍a}Rd'Fї܃os|Ħ[0 :m6]|^yCO.h :ftUKh/;i mWS>֔'\WEX>Mٰv!Rs k= huD/izA$ ĴܸIu26븑A߾zSTga^ !@ X?g b&d&b.\@cL SYV 6n@ LqA""vE1CC0["l?A6?BucP4LhgMS{NN6Q /}dɎ_b8p(&2BF\ }cxq7'kie+[Wyat$VZ&+:lLk;ۆV7Lnj771 ``jro0χp ,1o>pi\`l K&z""xrli)49qfC(D.9Wp#jtRj";E3!^)˘5a ެtqy3C=6L .XfXoslԟ,]\^=?0A0U[G6zᩳ~bDX$_d=A(H}Xb Eu؊!\d'NF᪚Q髜lht{5U ƹH| }2i`!F'))2 +g#XXI]0g9 scXbSmS @Ey6*dpHW_U'6G~mWFY'I׎:EsbhKUբ*R0{6׮#0(LƵ[6#/GuJ}lN/u2  HIPdW77%-&˙܁bp>C0~K<-\ҩ9*2u[ܼ s}( G-@%z~ȑ[p(5R_ 5=4.z F/p$:/%F66˕ht#y>F`R @$ZO ń֖Hk\;w hfSߏqaX=!RxB%t scxƮv5.gڥ~ !|ʝCn|"9:V]aB7rr屿T/P_'f!hո$N97֯,%w4ugJ G.. @5b3XST/1"6 '3 gdj\y|7XLDR 0@g;!X+*L+s\39ᯙcS\8{#JbT䑧B2ŁlB'tdyGrz]xFN^6?;%OΝmao]|c[|yCUWmU$r-__vR"n(4vM{Oqmqؾ",׵˥kQ6|jԱcǞZnPrΆ L?w_BM}JV.ADts=şb!F16L&+s/WX1ҀNY*c\ v(ZwDK(9~ "g.BΞp7|דY"nNO` kKOQZ6c.>k1|`;ƭⅣ )7'j3:Ն(ppqv|R:h "E" n^p2W.;\ ج8oR}-bg8r& &u",.Tӧ~"tuB'i&[A4huN5*10 '#d)Xrfm<#␇( =lTr\w*&6E92ǙI}o4K{xUlA]JV7 ȓpvV\_UzyJ7;8x ?Vn"9WY=[OqjᧈXe#y } l;O8Ős!<& ;e<-glI1pL? ,b/3ƿ8pDYШ f/|W.֏|OB)RC,X\;KӶC(>FG?.^ )f16b|VH_N:g\(y S:|{ؙH$^V`DvhG~Gcp)YidLEuW]꡺cl5)Ƥ-݇'ܒ1 EK9ƌG,XX E=-cOD>Vo%B[53Z'*jE(\V" '6cwR"YsJ6\Z cyŞswbSkx '`klMt$TǤ!qVe jD N\ <!tX'܃g0l {)"k6m !6AMxXW΅ҌX'’ g '܋W]h1dæg!5qDЀhYWe7A's1b 67q{h 4ۤuzc¨4cͅ\d 3kgu0+l ?cMB \-Jabl<i;GӮ0{+'t; Vn{"XXָ_eXɘ[Dnr6ru1-ڌGHT"23[OHUU܊Zճ^O =z²CXs)~s6fY0oKbs9Y-%R|?6JEAjx!^ב^Qˌ<N=; V%ńaQU;tW\v́ThΝ)=JDIޮPOuX,ƕmK5 xVrc'Se ADՁ9 7PeX(q٦hl3WƍI OnaW|_؜c0XL]Af&+Ï~ '-&xX:Do٥: Zq),) ))nҗzF =' wc>涤b * J `$/A(8$?N#;":DVA)EAAAQI-     /$    j 5    C @    Px;`pm:LGj^}M $R73Lvbs|l̤1{m-荏&oĭW@ _/L)R:V3?T{C)o @S<qfOz`>ϦEBN OG^@[a/|8S|x?b4(ahT+v O>\='OEo1np3_@T&=Yc1oO>.!Ȑrg_J,wla0.AL ݺzYct ͩ5H5:Ao "2V"pECх,AU4lłE~j;8" Gq6?67 Ŏv}jXאS'o]c141}쁄iJ:a0`R$X+ޘo1}<'gl=@W߹ vŐd;+X:{9.h\Gw#0)x!2/!1d~vncJq_/^3}+8+:a}tÇ!pxYLTOԆ߱h Q9,+8l0 -!^xVn?,dLLjW aB,dH`t8]Y@y=/ǣۍ- ŘA"b0̋} 7AL~Ha7@)u+COu _C|!5|8:{^]#Oǵ]aX?2yۄ9]r?aH)ƽ >)ysOqE,p.۲+Wc``CW_rf jX171{GVfk>rWF:c ͕ wު쫣_@oj}[lYM!)50CLNjl*L}9bB>2V T49[#1uV ="cl|5fj\םO+AA0y| !;i Zmx^"(@&MF7u. 1rDɼ?w#z PeBR$:vJ]9H[t: e?¶<}^qPOQz eq#mAO37COSMFkq4ƼnkSuTz Qɰz6~:a&a`W%B,ZyO y<{bFH5G{ 0lA،X~QvTV>1tRppڵm&77o#? i͎)~X[ 0 qe >/ 5CIb6=24xzC37ti`ä5[eܾ9xp2aX c-s"8 s2xgD qn9sP8? udyɼif*@~0 쓓"B Ƭحq5\k ;a@L#VzM|_- aηએ1ϖLhv Z+@ǁC1y2"`_Ë?V}L4LV {pI9,?$ho+AAgx~gZx KeOSU+r Y6FD͍r\}-_gHa[WI/X,7y_ E,z&HƝ  |_t^v*;A#nSxU5A8kq4żV3k&u dآ, ũۦ,6;Bҟ"[l s-$pmtkt|aVyq.Fψ5|>skXRYU *5*S%G'±1t6,#=-:FA @_y;n%Eb\-U dhPuEGq7(aCw0ݗ}bS+in1Ț{$ +pr&:wܼ+ϐzP_<7+vJCQ ЯEj r9 A.`ptyWKy3gyO R}]Q>/K>oTt/NNlfdNSa?Siyw2 }Ӗ.E}Z[Jd|HoTgן/'_ }ax["Ss4TD7o&A:&j;5@p@+ Gzսz| ҬwiH~*-'WuVR ۗ>B 轰@@~\ˋ@xtx9y-^\ɪuq1N~z'+C}^B0*x nVlƜ .|8vƸq|PmN"Ѩ7j;5+敌5g.n|zr>(@<9wM/fߢ",LocR\O!Ȯ[԰.%? J 5^,<y,t` .F30f9; $TxuRjN9rj״t(ѥQ$a߲\uA5 =CE:WY w[wBЬho]bXTɲWX4Q(68_Oɻ` `HdoӸ(*@Vd=<w GwcQT|f|j 5GC#E0LٗpT ̛|2?2n,7N`0̟'Ə?EmER` a}P/y2,m<"-8 y\)E&6Z;Vu5>bkN\AX$Z“LAP LijQk̕zލEvb٘KU`k"߅}t/FxŠy (E'q!x_n-ȎQO Wg/Y[0W!gU}.,. #rw<FUb6fecZ"t .O\_~]:Co9x8}Y N 1f=~Ƅh8sC&kuO*7nϠ lPP[eo<[9Fu_~Fg3Hc.Sz/Ò2y.F6Ѯ1_F9 _)ick|8IKlXUC+2L4f$Ha`em뭥=ӗۺ0urijoWT+Zs2UO#WR*nATd!ta ]Iw7I `ŘT@46gyQ]ijq[z N悗*, G_Å\Dr gV{n Smnr8 ;Spur)n^OR~8v d Cw8)}$H욢|5\[= @m(־?;Goy[8ְ 3)$fwB,vb;?\SIiejxV% hqgS8̈́#+0sWlk=JU|P*77 ZZZvl'y+>5n1ϝ8,YK/bŶp2:8  HB3k-}7'xiWg<:=2+y۹6 ?Vn"9G{ r\x3< dZ6A+tof? ?Bz)xvm|`b3gC[osQX%UԾM9Wh"l{P jN#Tp2!7ߨx8ƼeAsNd˚p1#ӧca2 ^J84r]8*c:̲;m ?O\4%W7@V1 B&Z;Sf|UxuNʙY?¥k0*Rlg3v'A/Jj4mWz Q{l̲XWaޖsCZ&J'eiF,W,Hf? w!?X,ƕmK5 x1šCMޘ0* X{s!u^z3{s w\9Z iYHM4.ZB's1b 67&vpo1p˕67,ü Zĭ5; Wc03rFл {M>aس)s TBFwUfLjǘ:+ImF ĉjnV;ih hmo| hkg!{MY+iO7G jzZbLU7c8wo(ymK|-|n߇ߴ<Ο`[.I\Sa4\JP$a`ao]qs99aY%T[ʋS?{Sf;;/|uWplX1cBfxY^!6s:`j;>5N;38o|^~.bHʖBl!1;\% ϤgC\ķfy ۱j iN7>;ϋUTxv&ל<@=\v́Th墦:g6*ɫ s҈nJl46E5%.Ϥ7'ɂ@-&xX:K/Cr_VT0[llŤ/2iPa)ۿ2ǘ }>FqX6[]c.$$ SWa|!Ws*9VeV!YoT G/0]1~ Yg>, m̦UIRfSۨT+ S' wc>涤T1<8p5 jǧ2fٜ jmwƾizC0. 5EUn+Kdq8}&v!A=బ5v4A2H~cNÖ8j_E"!9,vGJF>6p?0ٜ s ?¸!YVT].S\0˗ |r&h*dJW8!c\< Gc?@kjќOAJ[ߔ[   $ꍀL@AAAAjAAAAD5AAAAQ AAAAATcH~`psZl>T$XЯuz0AAAvP~H~^}Ea|+WQcAaؿp =bc/EП8q7[7;j;nD%;B Y2.كӱAAA"" llgʯ-qRƓz- 0~V@a-{i;nDBqAAAQm QסB67o&7   HT?q2a7ZC d~1ɩY(lݛ)❤a7@)u+CXi}5 A9 Ebk|#yWLGǷ/#9[ 1`+0kX>lVUs=d1P{*V:*CϊEE'Ԇ߱h Q9,/:4#AAA[57n m& ;"l!H\ uzNÄvv` ga^ !@ X?g bKaD<K ˫g&h;`Fz.T_''   j5.( B .y )7؜W.g7sSZYbMѠ?(Y?,NN'_ 9}ax;\ҩ9*5y3 r?0PZ~-,e#Q $nn y^%3{g%vnAF"[xE63Mc0O}# 5Ԍ3?f󱍞l[\T<$<ME݁sY7s!Ei@AAAD[#j }Gw[h/:/cY xJuB];Y&c`cg Y*p#7MW'gI+ޖjq s '(Lz9lfX4Q(68_Oqm=u ۟?CثlžZ{8փ>炊)ڊDŊ $&@Hf 0s/93̝;s_KVk98XIQa]gEuW.UV s >lۦJ%ҙk:I=Kscez="wUiQWPIg뿖ן&k|?vKOFn-UڰNJJ|jKؾeK.լA5:i:o|}zpu1W_ymIZH#0q{~tZM>CU~uurծ#w>ͣ~?T #lI3e6>P/ݷV-19Oc *LxZ =ܑꞛtEޑ[mׇE ԪٞރF.WgC _n巟}/7JW:cB.:++X qk+Oiz9#Ky}=WlWu{ziCzΩT/Qǹn:vER'W >uo3[Ӌ}J̡:o~~A<Ë]d>αȹPnjȓ4|_ 7Ƨz}jfs?4cffbLSN]K9 #,0@ #,0@ #,0@ #,0@ #,0@ oI ++J8I10@ #,0@ #,0@ #,0@¢`f.K*/߭{kبAǿGG+..NG7CJOOfryPZ[[uVmٲE vB'K':ܥ^~[ 6Ny8pv;Lf&PmvcݧÉ)CkAyt)99J1S[[| M,6Sܥ٧+Z}]\B80 M<g^zQ)8挀yرԺui߾2dÂi0#[nݫ /@θ{s/ 0/B:sp8ƽ7~x'̀D]T^^cDZN84CwEG"oIUL?D ^,.YĸG" h[n=fϞ7_Y:kk_DZ`ܓiiiڶm+ " X_} ~ώ;4k,s9:i˺\-u9}״zKm]ZU'Z}w릟Nĉ;ռ}~}4=I\E{󫯶xUHMHJHHTrrr }YM:Srrr\KbڶV-)TqiudgQJRVz±l->}}c/;jQڅzUҩyg[i|v SZՒԆ9-GLS&н{w'xVNOOD">:to+=*RKq{ssUT?wc]ߑzt]<5O?=X{Rl'‪*] |;8c8MqHE"־}4lX.WZ^5}ONz@*p~yܡEwܥwO_M,}~f|T6+!PMȐkZfVԪ)FA}nC~v6/&.0~ՙwߍs'KwKTZTA5u#z9+QyK.;oR_(OԋktХZk<o׮*F%Oh]| {N9k~zO}M=rG)7iRQj[IWotm_qIT3nyE]( p\8`ׯ' D,@<.gZ]gB?dSJM2dxZ0 $ztuK߼X/Ο9kZs]㏵':y%ɞw8祻RBXsi,=y%y [5oo$M.՘mZF_3F}:Ғ ;}X-҂{ù Ԥ8KsWt wjJ?9jo&{_͸4}V69zV`5ܱs^__ODF}MFe Q<@neSBUu *vLg+Jœtm=Oonղ~ *69jd`p>;G\3 #]>k+kt1m=R|>4]#F?\]ީ_+DiS\"#9,j֞u+沽jITVE4FQA~oֱdn-Z;5򑩺NV-69+w>skӢ9f&\{6VhujE\^WKX9][1]Ņ}_$Ş!izӭࣘwCE"V||:_]2es82ԗ_YE{:K_+j4>mRl:{.2 s'oqI?xtw^5\Ёa);of6ZW?mx@lQ߅AN\$9tLQB"1NIII]ϣ (٣-[?9Ed4nUk~yd\L:2P}0HFV Yώ#Vk{3_ m/w99A VV&d:deI&kn7![W?]9'm\#GN9'{ :^צ rglݭ>{G9cD,X bPuu222:N^gtƇo'N<Ԟ>grz]+Vڸ%۫UQE%{KU%g'tQݚ3^k{G(،1!>۞Z2(+.լA5:i:o|}ES_z_Cn >}S^+!Gt>xX#9UnfR{d{o]pH[ŖXIg뿖ן&k|?vKRK{fʷV)55 " X*)٠aÆ>$aKLSeZ_ gtiOW5z╧4wE8%R^Ķa^:秗?3+urD6D)i:ؓ;XSL%3$2]^[ }Ut\H~F/{AOW:cGK_[gyI3a5D%:ևۄU5A=9t돎Fs@>%UMJ*ҏ3M Ct(LxZ =ܑꞛtE^l._X9RVV4XlcbmtjY[/vb1>%mpil<=7_3{l];莻)?\߯^K.@pt~h)*b>]Z}1 [ȗ"=@2*))رczONNfΜIbÆF"[oRz Ceejj5b*D4B1p۵L7~ / Akll[oOEL!EHl}jmmBpB5k<$0@` CULLV^}ƽ'̀FqqR=C/9㩪R+WT]L``ƔF}чJMMSQp%''S98fjkkURg"ef2  0c޵>}h۶mZ-%$$*;;K={B!QQ t@9N0xV-+ۥzyVT0V6˅b`2TWרCN͞ (#86KHHPZZ222=۾`]lmf3iH,0@YEZp@(e @hI#dd!o (i `9B Z Կ8i 9Lz5PL&Gh tEhQ:} %g &Fhѵ7( #@$xn+B0"4W?zpg B?@!4/?zp ⺙By<\|ݯD.1~%گxyYFi+~|_  z>|)ESoԾo?og{o[ -!*0sͯaj?>o?oxh+\yN{/Th` -FM8а_=Z@ې 6}>F0Of?`Cp?1tհ}@h|`C 0WN}@#3)@k4Pѻ@H8 Ba`&Ghlkp_a(Zy@6d[;7oؾ=_̝No@@Х= Mz[~5`6G{` aB??#4_#n/k1}.h/  \AGh( ~ +{`Blؾ9~+sl@$ 4@4@C! \ށ~ iĶu>NNyD(@7Z[h\6#C0)@4ZQ6jzprp!BF#AX Fh.:.*0@ #,C [IENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-KDE5-thumb.png0000644000076500000000000003604413242301265024454 0ustar devwheel00000000000000PNG  IHDR}_,XtEXtSoftwareAdobe ImageReadyqe<;IDATxi]}f;9II^r/ݤSH)HI1_~pAhТE֎&,/7(Jo3}{}=Ν7")sF;ws=oǫT*T*/, sxyIo!,Ix<.t|L&s/Dc[zRc)KV򈣉,yvͬbÁѹD27bIɤKEIr{}njW]M6=$V=}_::u=IGOtOo-$X<&Muc^LɄ\X4XRh7pJ3SO/|7LMOO|}ƒXKb6W.93&Ùb/%QȚG?Xٶy(E p_>95-]J1O9kD#w}31#W+ vWcՁ 1#{U>Oi/>X01s]SV7pm~&'&u ꒘IcAlkűz[תʚ{ |e?ʅ ,/@P  !X㓾ez, K"Jb-b9멏u<0TcǺoV;U7\-H,rɯ|i9U&M{TtJ=qZϜX6_f>* j9J28PG %6JB*Ñ_V'!.frq"7%e.W rO:E)VcuH"V1&&[C3"-A4H%dd;ʒ鑩ɤ׿;&=#\A)zb@ndLej$ [rE>KN\l s!/b46$/yQ~37L?Ŏפ]}I:dm3ϋ>}_e1iYI{v}YE~$S㽒ߐBrVZ[94_57i ܚbԞN9=4-ijc>;"?I d" hX'9~OVJ"#|@1!ݻx(2,*Njʉy{lnƔ\ F8MJoG|ܔ|Q~G=?}mH77VYv+{^FJVDb!i7A1 HCΊyFk-C%t]RF_91-I9y9I޺:o/ϬCn2FN޼vYzdn SeE-i2b׍NW[8:~=Z?z.IS=S459h/yکY?:gA#1IVFDe:[b `Lfr2I'c71XL*)^DH6 \et6&"^\G]Y"f'(d_M|9y%MM1@ K:7{Y FJ 4m} 6>ٖu/ ,S 6>iPgu\1_ o>BTb O6V6:I=d5GbUo[u1rK\4"~L⬕˞ET&ρ 67.zzg|bbI\,EX5u/D;,'zM܁|{K ui1뭔B@^G_ϔ<3$㒓&oֈQ_$NǍXbD1/,^ɤN- q#գr?Gu$kiӞi$-FK_4nE% %_="9gb@Z[ur|δJ`r,XUgӺZa|\ ([#\/b։[k箯>\`ouͼFT**,."I*|Š%x\T"r~ɷǒ!hNV)ݠFii1kT*)?id"Ĭ- S&);$ެ~YXE ʧvKY96lt95$mI٢YW+~"mHz{$ Kj+ŗvf/!7xk_7/Р( y@"p )[(dHձy' YqUmll98x@nܼ"sZ_ *6\O2oˁ9ZԘ]kߦV9 n|^LP@{Z1mfKC\{4ĉ[uMw$er(6cI~tiR͑0h}sғߛ[À0+Vo[ZȻEOoO4;x`^vn{{I%[czJtv"s}7xM$d!g?~ 8bgygˡxe_,Ka!0#JzAWfT rNWXY !e KӧJtvtSMޕω''2Uٺ rWb μͩ'y3P$-XD89w+kA˒.Q0dԈ N(ԨڎU yd4 >V~U|iĂ_Cdb4>PG)/͍/l߾ޕiyr̽5bkI*S27ޫ\V#7'c|wr77DQfwe/!klkFʃ+eA9{|U5׮Et0J=rҴZ?f<N0.\x=q~.K%!YYy~ٓC9i-wdݴF0dmtu';blٺCf➽c Ie7cȢQg `kTP }iH Ҹ0/vl~Ex\0ErM5sU?wK{;Zk؍׍-E3,_?C5j9O$eI6Ud닋2z@r~Fz륭;a ?_7^[90xXzzzvH&NLLȡCԩS߯u~9B]6y~;_G*jՎrNgcٰ?ҒlHeRm1g$5#GsBPIĉ!b++,T|x^Ĥ.-lVm۴7n8s\LOO;$YھݽOe_'>Pٽ{|[o) swOMM'^v+uIƛ>._,E%쓽@nܲe"xV8bi8ofA~~ZܜEᆱc_>)JtZbѕjIrbJ4glooWE_ m9$9UKf|9sRzrۍMw֭:VOd U9t|'?c&}B\|^)}B6 eʼnN4% L?!'_ycnvw jJJ7 ooGy0hω|^zUm(h4įI,X 'c%r@\WXB:vw%HC[YG2R̍\ˉw5uY$_zPC76't@wWTFPI}MJ󋲣kPs2DP9-:SrˈR잎i"DƯqlo7=1q2/;Zkww"OcwAJ#Yñ-[G}cC uddHO- XV I.?!eDT?{*?{]YKxw%ĵAԋFı%UlA".dݎU,h$VQҐԶgM^}ِK1*+sAx,͛d seڈHM3?i/j#r9a揹b+tn[.|7ht~AjO?9F 4Я2:6foZ(7椷G^s!ro"qruY&aIKVfwiGբ1T:N9pu bVL@VBQ;K~! FIkR1VZlly^a,P-]Jd?Z@h<}0N+jӊR$UcOty.壪oEBh׽ԥ (+jt n҈N\u b~NDkPW;jd-,,.[ a%Py:\<;h$jY΄SC׮޳GIYteXsQ%":,ӧBT۱`KݨhY"K]S9Bՙc'jD_޳9nc緸t` gΜa߆2.9̌l߾]FFelNf>EA*FϙOh,8-- ?VW$ˊh;33BdƂ|OHyvqь$O<_ME`71|}XC֝o^Nf)Ƅ4vhYڪAl<s2sRd2Y> %ljqE %*û0#lO%f:U#L"ܔ>yWy]?58򼁁~ٲy5Y2d7mؘJ:L2}5 L>TruzjJ1QL$ȶm[SH-iMMdGG3ȵL4_xde|fvxn.l{A5y36c5| ZZWRR`%ic$%2\1qoT?qWqA޵p#zӞ{CyYIne-j$$cU *)'Y2|⮅cDNc=BqN-#[yb݆(֭%8OC/uhJI:F3֢ n$Ƽer[$Wݕ ]"\$|%w=Rnj*MMPmѹAt{ntY+L\x%ć;etޣ뎸U߻pܵ!BB-DZ61nڪ~6Vш;;n<rsR(?&`\yZf޹yN<:2.Jbݳ|q/ [%3bz0k+4+2h@:GY<,ac58s}r@^Dm"q9T:YX>ЩiMG8ץ"׆˞ݻca^3c }_A|n7zql1!o|Gͦ73kJ2?s@ONJ-:k4M94 ,By(]h[-D-8Msr*;>$?"V"޻o|عSsFg|p3 uP>c\\]33/ԡ7 嘓E6w1ْNض[#N:9QN3uxB:JNKa8\HRT-<γ: 97^{N t6-Q1iFRW6u<մ #&xuʌK9:a9.56Ҿ,z 6Og6X{>Ɋs1쎸T/SoѼ5]qâ8oh4*7Z%*Vok\+^(zE{56}k?Λ^seQ:zw#xhku[j~kMk^ h:(YurjJ}Quy-n9$ ݾ|XH^R"p5㙠ZԴ L`FGB9O%jɉI媐oQPF|]ͯxAu8jP457m59͘1y7-Z!J)p /8%]/TiwcLjH0q/Ho^b.NKmm/nr8H4C'?ϢlFhƼ'u6L 5W{BMFjTQU ;vͬ2مxd#7nh+WZ58d]2 wIl?<<2CÅd8s#,`Ff׾qFp^Qm'E3CС lV'3=vMymp2Hs)B~i-iS!>tPOM~:ڕӁ̄4f p&Ą:LqVwDPB MOw&]˳oƘ/,NLB͵ Ν5xq~SLNO+AfNSd5Td~6'cG/5`"hw 7oԢnOlsBcZ,0Z5 ޕM$[3J b\ 09يPiӟ)f6/ۖtZA2QD=!/8RtO p z~(.rqYaD'X2g]O8Ʒo kD*B7Ai!+1ی^Gzt$'*YT1(IKR+MFp[ƴL)-T r F0ܹYeP\3bVwW_DIvj;^G B#VGk,?g?|[+߯H^G칸*VDpqZ/bJ[2T t'L!b=cVZ8^`kG,C@gj5 "-Wg2*1(BQ}g,sRgCE`~V_"cÔL(qPv꽲YӂIuA(߮Y(DFJfHE;D'bJh1Mūݻvޞ؎7 5Lj2 Uw[R*A}Zu9]"z@բKDNϰ==";F+|A+EU|x7Z9<P;P(PH}2AyҨ O>߇p=.xۈ4# [= +W5cSԣʶ{$PxW]95Ӑ}#U;\bZs\*^rn_@9(¹X$LnJ.%/k5w:NmƧfLnDnf3FDgA{1U~ٷw,dRTDt@ z2k/~䯾TsNJ_t?.\T]0H~tG|3` B8;V'ƎOHK>ߌ_>[aUQѯ00@=*9  |3kqr2 q@/7"ЩYdRPҽ#s/ocF1rS63O?eI*D݁~`⣀Υz"cbܳg.( ,֮Qʍ__1E)OiPlsjTHnTr6k2g'/1ݸ'LaaВ$@>9F̓\exjm `?sNPI(u>I&BlDi7 3(2>y EmAuFމcЀi0}ε; pXy ,TZ aR ܖ.,~&["bK'A&m hԤJbk$ˁo4$I< c^IN>6}]M$ʉb>6`!C wIu|===/V'E-|da %!Hˇz9{:*A xٲ `q*{2reH m蒠9/[$4 ǩ hVZޙJ$Aj D2TyYh\!;Hdbh=<_Tk&l"֪(X, ?މ[L~Ar$Oj[H,aP\W7Z48މhvT]}.IhE;׬ZOt=ޮhpVB]l.,#Wt|sU5|o6 %zᙧ*qs(f$M>m \D ; vMjR4%; qiXl"~ N8bzpԐ588D468p1MQ`d(E<ⶨ򤭕VԷ`\(OC~}ĒWXR\4!b qct"t 3hlV g07mu(X#Y=Wy~=2fwU1W'>H/18/[JYq@?NFR"RumuTgRM$J=4D#@eN(g儓@5/v[Erg+e4]~cU=<}3Lt}E|Sxhnn4sY < MTwueyg @WmZAy"Ju#nm}nuJA 7äZ{8%xXɗ]?R_Z T?g{g!|. L\G}/*XsZ(u]]zZQ92tnP (T/ڭ(ȏ,RY#q`#BDeB}QUD "$(᮴H2B J9QޣXxAlPL`yHd w>9f楔R3qo؍Bpӕ)ܯIut~Q.05'!2N8Bg؀ W)u )X5p*8f9h *cc[*1T0u{i@j7XЪ[sd;;c~a]YZCjA3 $,4EԕrfX.f +XqPrAN T*.(ݩTZL %*#X/q\9PPx0.wYcE/T\5{D"P/wgGÐi G<ޡ\ 3!.]sh< Zʈyd"icVgrc]$; %jk^wt FCFz(tb(V$S1NkE0"b*"v9rH&'T/@؟zI+W)`:;A{Y7o*Vs*[4~HLi bb»F$93+:EA~={x8Ȯf-")oƊC! c,uu r'?q[,۪rKp\XScEBur-XO51Z.ʙ#{~YCV%VԒ9)ZHP7n 47nd8e8cfpEm @4 v Pݻv)>xށB+V rb4?܂ *#O潙x0X$ƉNњ|GEQ9GqfW(S`a`kQSc-Ψ߸HǕr6\UB-> XԢqh0`V7Zè6g:CP|/nn#ߨ :'H$!ty5Ϯu"PY #6k8zERg,Ȧ/.ps'> ̕ٱC}-Ň"BJťDJ٠ V!S}%% =_QTtc14DQ]׽("}uWV\Eȅ\+\` գ||88fŊ-?gS>AXTQfQu#UF*;q iC9lmHG=~ToOwMdr]*(׽rh&XI]Zf\\»k 縷s=`VOj+@S?p&}q`CFeՄu1{cHACg_""""""ߡ}F"q`b`G H}[,wH}zA[64ƪ051Q+䳚`O'gH h3cP(*90{/\B :=ç!T@[x'&"""""ҫ(ЯF z"M|qI ֬߀ cw>PK h1fy\4dw̮C0SJ 3~Ű=\owݙ€â(/݈ PyEÕLu^k/QcAs/]{ ui0@Pq404PmqpgwjBXkPmz8-vDlŒgaHDDDDDDL~7^7IqMxɧe=y p@P(Cuh *+t] k^|t.ZLl;[6SDDD?vt?4%@*--òD.SZVߘ_߁RU?;b"`m}۰mN<&aŪ5 2X.\{`ۻWq=cOIWcġ;<)?'+ֱlj~aHͦPӲPЯOGG h5|PVC f`]E qB5< t"":~CbɲxO<$yPjhs/<,q_s%:o^ 6mA?ˌW{ݽzt|H~TVV"":0q7 _mk֭߯ :Xvyr .pa!Ad'>ghÇaUMc`!͍*aV"7D.רGG4bX?o("cY vҷ9'"cH8۶O=z9]<܅ƗEJo$ֱGu?< t O^Ǎ.^rC`՗'_;z&^G"u6իs"sBr $ጿM?tōpi1 ep*؋Nxz QnN;nQ?TL,~,'7g2z]/۷OO9>Ԅо]>+k{HuQ\R>z_݀E@|K:1ٗ^3~Fk&)/3gˮ}fvmۢGl|:봓ezIotءC+Iҋѧ3 [b%< yxm_1\ې쬔!#O<%t)?{=H?$|_p3hvn7zuxqDfN__ʊ;[X,?z|1+ܵ'aU [Rxͺظi O?i[dye+0Qᒟݻa3z$[\Eϊ嗯\2Ģƪ5HXew㤉8ԓޗKdgIXW~^[Xڱs;w_~TN2rGQ;Yn̯kb.Yrd}zǯS9Q5݆ +*jL&""2{/߲Jo#L;V8mUk ~؁_AA!1ؿn+WG[?\QwSuh)VL #xq`"+`|kV(͂sNDD/H(OCq"#=М-9r]1iGIi)E={rQ#ЩC{7<ٯHtE#njFD|}lٺ]v\9T &8cqMċM[¥dqG˗Q_v*BUTݵ驉@4OEE0VYۤ4&k.<ȱ M9'lu@j/8 yRr >K`ռH2}z `QCS BA߶AċO=Md,O='~ǨMV"(֮ۀw(̯yg={<9E%0᲋p)'0O>ZTګg^?gIW& P7ncO>#/g:||Β&*>/""‚Elj^No+x=:Mr%:XH?$ 4@O͍GtܣvX># 1`ՕS;2hD4Ħt-h5r1#"Iw@'wxn&Ux'{~h 4CHӰ (UJfdXHjv?~O뷷K/1wBT""VY; pಢSϾ?.t..'}榾W\1t?""""""&)f.DDDDDDDDD@""""""""V Q+cHDDDDDDDDԊ1$""""""""jb Z1DDDDDDDDD@:LvyK7kSrnDDDDDDD7OλĀԓO­܄@~}[t/Y^~+WA8Fq 'ŸUmZnb1'q,M!{|큿ޏÆQ_;_q%Ԁ>1ڎ;߯W^CDDDDD 1- qF8Ecoqןå]o?ddf`5xc݆ 7i=O}  H[X>/Ǎ7\qcEيmֵ {oxH>zOQ+::T>,)'ǥ?zyqΙK/?7wba30p_wf %yM Aoc3g¼W_^38-XJ<0"@1lߤ_ ;';~W\~ >3#EqUW`Nu<‹xՄ'\c>Y>m-.Xg{w(8cq/n {<+V!SU՗^@zzy{1h@|iiι" k۶m7渶uiԱ:?`Z!jW^xۑO={[look]tFe%@Y_/k'bɲe8y8S})PUhwg<20{xo# .7=5X~ /.5߹nx_r,R㜴~-7߈^={`=x$qh 2v.:akEMM}aTUWm7渶N{E%8rX !"""""j8 h=K8n3]VTP48G%'x"9sL|=77eeǧ4^±% 6={ `wtD~|i`uXac|N=ES݇EHTPyyƻ("6Գ}m-߂m{)CۡgϞعsgwX|zӐ.lu7׵m?mMv\׶ BO>7^ ubHB~~ \ʮF̙?iޭ۶cMş+S/ѥ57'|5Ynn[9CrlWeeϫ Կ{&ǞC'St]_r,-+V_, ~yc2_QF>fe]av]&5iۍm?c`j.?DEزu~'b;+!n[t:r\|?>xkFv|-7;[vUg;l0gP]Sp8O>{q#KU(dffkj\7r,͵X p8DV\Z"+ŵ"|=,|elO~3gAx#154jTnʺ[XCUU/""""""jqdNZCqI_|镸qQ~D5݀ߝ֤Dzn"""""nuq#ThF]v"FMt't9͒@Vk%r\CAtm~/5纉 VZ?0x~bnՏ~DDDDDDDLbw&""""""LͅˈZ1DDDDDDDDD@""""""""V Q+sPK}]OoKyEcHDDDDDDDDԊ1$""""""""jb Z1L-/=mxyk Jb U) ŠqǸu*  +V35"QX[Ѡ=]CS!}fO7ʫ3m 5!o\;rr2f4ьMŬ[񜸍Y#[6ceЫha 1QbF7 -s@- S۵AyxwW|ϸ xw2Z˅ keb5J_~5[CP:t=3rbС r˺l-.ǴW 3CwѮc77l<ŒClʰdbT-"?_ 13SDOQxYr *`gPv35 '֭mQfUT%CQqO#zcN:U{{b9 k7;7B /ŠCk]Fd(%>D|h }zBP7'6eht9l"UOw 4k.-{ ݲ%_UJQiu9`O@j9$xj$KB}:6F*n;ތ56^x5xeLKKq#̭7oW3Q >x|ps1~Hknvb=G\ c5عi#ZĪ_Rw D[B?*Pu_Dvʼn]bDTKT*8t@g8gmc\`Q w!c'1T؄EV,.ÿ*m℁qd埨Vܱ-YhEdw(,#J E觩uL0#""""""bH-GݗJimR_gاGtڒjDbUi~7N=kBk_լ=g6#&&qa٣[fUi#]E|Yu*Tzq=Zkz[YKWbY|X}:f]aGDDDDDDD ),o#Ksmz'vCw8Qf8̪b2S2\wHdsd_ZN"oa: e *tj\|e#tv_5*Of,]ZU /1?9Οb9 ZN u^Sg-:'Is QݧX.:` Dϱ3~L[?w2#)P*Zfǖ.i~T%=g vYCq4{ŕh%&V}OK5 H~RQTOZ7 nj=A)IEU\. g 7eBUxsWƃgENr=ۯ( WsWm;q^#Stn*aXz]m0o̪S#""""""$ 5֭׺ Jԏ)&Ik6Pܶ;fsP;`l*!h>NC[.ŴO6co1ۯ!8WgKoR\.ⳅ+QU\f!+&2DԏZٷ6^釺a`r(ZUJr &Zx>郿oG۪͟JGvއfN!ޱ>݆j/*49߱vm=uc.DذiUgwg$M I>VQR Sja}eST))ޫ*ĻZ݀*vG[Dbkx~gca2{?݉>ۅh*u/6~~0tP}֡ڌb•TV9/jw7hv՟U;qh0M<{y4Z@9TEך@CQs.|.dFoS݄ٶ*F#N`!PQ=ZYa0XwO~v_gwߘ١}ntDDDDDDDORQ}Hӯ}zY%֭+1^xwlѲσ@w?F0XmU;}z^PJ- 'ܣ?NIf"S53yg$㽵{UЪ1jΪ?k7& """""""j:ԂWKYJ:+2UGhWi^W|>=c1 bCUVg.5L[e_éCbTL53Sb=Ecea5^vO E#ӭ~B8'ka/qyĬG85@j9n5_C|`/9Z;ϥ 1 i3P8>xOQ:o3mRPg[׬%F xm6]1_ 쾱.}a5kǚkv_- =\ =2>4(ޠq~G=RclP<>0LM~"/O3]BSL0Sm\651~TcHDDDDDD cH-.cJ?$g&8[u}HGk} {୮F0ׇ~'C៝UĢWvmsqH`O9Xx(+0_$b|ӵ-N}~g1q|E:OcFapCAqƱƇOI><`.=-=jhq.#tsC1<~(.yx,HlNk8یTz|2x,*.iO c7UG-5a+6{P5eHDDDDDD `H-2o0//RTگ%wVfU8Ww h#RQoQ qC@ZB_q8g`K j+_Xs3VX7cmV'~ʿUل?]b| =Exӯ1ۍjZfbua\, v`.kSmCq_w56SCzut1&,2p JZu=Z_?r1kW;Vp紷=O(~_eЊe88Jo|_GF`#+05 UM=H? tEmvguu1^9p ]7>_;D)a XY;`L{ Z"9;P7AMU׮A/b+?M W=y9piF>.`Y3䛽LV7W4$_IVS[O&;8ٮ^3lV:Ţ՗ s^Xj#ǚY}e5.>q8(Y}+|ljQ􏈈ZN|&/Kd{n.g_9ޠm6<5coΨFuѵRgq{)_nKBkv7HV?v4쌳o}j Lϡ (<i5%x0S\^>eL E OX=07k(ތ5[W6WnWoOCpqȃуWa@XUS%ӼQ=RQSMI~]U|(Vş %1}H "OЮ+ vT 6QX5AF3V:;=-߅Hj4D0,n遣Vşؿ1:Mg{ocدȟ&GNoJ :Wn(,㨳~.ݻu¿g_y_%Q ٫ Dk\OI|qM~vq.[A~^.& |[QjpKf m330^Yc;[AQ$""""" @j9.Q'pWg<@%)T'Pդƥzd gYA9uiWE]\dPݶv'b?VxЩM s]2:Kxx^vVAq~XZL5n5)f)>U5NqAd7%p8bL7̫0^1+|bH\˜Bוf.c\''qyV[ p[$CL!ʉ[Ҍu}L37fr1ޞ6SPTcχeM՞(<~s쏷WT[ՑGCC]._f/pᩣwPٷ"9I뎇/xmC8FYi{:k=Zjs!PO_G߄?qߺ9@nP, UԍH 5k =q3JakCLW|^{w0oYl*(,̾ĘoŠU'0 e5i<*ʴ/8O4Mx/༿ŝ.A5gy_W.+d8qL>&q) '|,:q$zt,Η͕ǒmnyǤnlG7H+bʛ7{8:{ŏCIOjC)ד/Cza_G>͗H'œ4( 8:R<l4>χf2afE4Ag>jhZnc!\G+jsDdb^2Ň~S-G|]Ͼ= ; Fu 0PLP0ibJbşDim6ԩUdhPvwZpb]AF1^tdp}Y~87(vE( #%*&&1-/x`굏cY|٥Ui+SFQ(Cʨ|(ƶ1u:dPK|;\] ۵'^1%,/&"sǍbR _>uA#wA?^Cӷ?o}-9xhFYehՋ:{dWYU??<_fmxzzCZKŚcHs`g]"\n>n|q%15%U_* 瞰 ^Ol(!&)V*@VvnkZ~jnuUbt 16D[e%_m =MGM ;+WFKn@O5++ ixvW׸PV)D@Lƫ[ͣ!7y(A~>2QM6'&'pyyWinYfJ \2Veށ1)oaXjGBE\]e7/<7wN꯲rOpI5b^Yn\>szΝz篿$ϿϝwH 8fRU6Tz?t`&.]5D ,\xֲ?ط27v'.Nz1FZ1fŋNĔ9ѵNջQ OJ7"PqLOfmUYȥ+ЋzFsQu!iB>ULCT][](ɡGOg޾Ʋ@.]Q}1Lɬy]5kxVx`c*VYݠ}dUx [>zw(\m7a?&?&^"s0Yl|ײ5g'$2 W fz1mI1Դv GFV3^YgcՁoNA Pgz 'gV|*,eCAYˡx ((*ģՎ@??<<_/%8-x˞X!@^lݵ\.׹]ˡu""""""j4U jO*20@n@f!6يCnJa5ݢ]U" |EPCy@]r ntƜBTB1ԟxؿ.278C6ĸpn&6Ԓٙԯ,΃ˇu*3STiP҂Pm DƬ sٗQePxI6|;8Gu 9|zVsg)?iG4_5~yTV1Z\vRd@`2(ۖabv o4{ۏT$S@-ƣq+K֘< 7|o blQѬӫ*]cݺeǿ#C, aUExb(0wYUp#f'?1Tn=-jvόtG5eVГS]OjMPI1]w :j@q&^ OS>ԁq!K1X_̀3s%n]fY}OStFkdh ת >j~=_#Q9Y'Mx\Μ -곫3}XV3_xQgޛ>Zx Muc_}&\d6,ħ&QR??Q Z byuo,^AMz6uES=E'H*.%""""""@j9v^|G_8B@rOFBż*BQ D`,f6kO+* %dvjhK&1Xm((oZRؗONXQ{/nʛ'vM +/%(-^+?xX(^/׫|n6.4y7ߝm{*ɉ5DMo%'q `E2o臱ȮZlߖ}yTmSdX]3 W7_07<=ObFӎz| h(~ܖط:E}9_Ρ"z΋kOT X} ;(rFƭ& ]xˀ"Yɕov!u!v ,;RZ ,Yg[m+j[WTFbfY]}5+!oP~Σ?th-ê]Fh.ec*\"Քas_O]5ضN•r,;Y (&]UJʫ &[6 xwyK6:f­CzoS\,*]+bTTWy1h\?\Mb6Tz\ nwgb…'ɧIJ/>t}CLK KLGgg-ߣN;8S,]9^!TsJǻM}&Er3Ep0~x'Dz# Ubɓ|xཕr{W_~\lb1rE_jm{זAy<*+pQL:;Kkd$?꿤o:^| `B% .7<eVƸ>vss-1֗Y0s&wp!Bq\Uswۧ\/)С)ĉ@jAv^[}AղFsEavbI?QHUyVSb͍Y6.21M+whf_1ZL MOYOzU؛pytXTfdW @cu]x-*ν:`>ȽsCz_]leDwϋdu`қ]WQ)뿽%kcJ71Vb1#ѣ{g,vOϾVۄ<{]idX+cN[Z*+P]P8o_]ŘpI^jr3.w1>={fm7ET#Bk/ `[Q$7JdWF0Z*zhm5ى07.7B:JB@uԜu5bu7EAZ~jX50)U #? `ڊ &5wyj3n<87pq #䌺g_ÙO .bwQ禾%R%& ˫jBW`q_:8gl|"̛:}!` hqj4qCgdÍ/iqCq<x^Ljx#mܼ~ jz~C}Ƅ(7WJ+U;DDDDDDD@u/t1)s%=C>{q}HOaV&Q%B6FK7@Q16su5z[1S5̉CZm (+qαJ-ŭk[wB6 Ve6I Q;F{59BW`:9s$-jB(819m+mRGzq!\uh wC EP)B?oDjϦe㪱2w4-41ʵϟKËLž"I3쬯kn4'Tc UT8%Vϋ1 徉DƂ_wy""""""":Tj9zfW* _bl?y 0 Tu~Sx'AΰZ9B@ H1sގ:뵳&w V,`"U(U_\E0uTbo-,Q@jAٯUE힘Z?eVKp˸Xf'ֈO7[TwZ@Ug|Ms,<܄͕in˪#%*\&KxiQqoW`CUzLDDDDDDD 0 g .؇e-.jX}uEEa+0)*''H/S5 u]D8 F\V9D}b\-S0@BL2OӡG50e$""""""R J/Uh=*D%=_|͊ or`c9هXTFj /lM鵳jV0y䆤׀U)@$ """"""@ja"+k*+e5ƪC)f՟D`1? u?$-7c'SUB#"""""" *St"]|E(B` afUB;2Pz#@ )TR?WB<UL DUǭ%"""""""Tj)q~9NLQhbz_;P؉jFIJpViBvW`]}nPw,3O'k?'^3}pSKہ8ͭcN^l`~95!"""VRȂ@>AS'-dCafTOWI eWO Խ96 R O|io?' h\*|p>u C,\_ت>ݳV,PԪIsC]9wn:?]*#?혉ߜ7G l6A/q33w'_L{4|g\kGcܸ뢡ܭj[)~B,X돈 bʠܸ ^^gh~&o53:@2ƛd1lb6~n0GR^g&h V <(sOM|`rͥ{]9 w^879j-Yq+gIܷNoV`耝f=?IA٦:~V\KUpݦb\xdw<?G>xyFy l[yo/ls &3W$W+וۏ}o,y> #zbsA="""":`R)7Ztx斷qC%"q*ґ!C>ꎊ4[؏!]l`+6sޗM#y%i?%ŘeT_t I}8Hm0}f$r@E.Njv Ϗ@%a%:#/g/۟_oVﭳㆴǝ?.yyތ?w>xۭxU񥟽q ʪ"iʷ k۸a8fP{ܘ\W;ycٸĆ] .wy8g<.~6RH$!@MzP"bņgۻذ {@Ho۝fll`2My3;KWgZ͵z׿߈ͦBܘ>֣sj4eY _U'EF! S3e^e\zd':4Ffn ySWFEu.P.E}xbj6*_u궢r=oZ#B1"ԆOo78DJ+sPid_7ʶՃ-C rvGy6Շ\>O/8TZC8_KUO_K#z5qQ~8cSdWq'㛇N W?}ӖRR>Χ&9[hlHkf\YtCu|.} !BHy)k> 5jЅ@ =,Fs ۬y{m"2?Kfok7w0.)LUPb{pVwŘa(q ij 8yj/8=QkD[z)P_>Gklύ‚q-pSs˕e]UA KӰu!9 R2 Ug'6|cJgT]}NLt{1){*jsczc}'pqgvąqv`:Fԧϕ㻇`L\uB*\;{)xh}cU:u+˘C :΁JqʭOWl:"tזGgTbK]:U]{mkΪ%[b,ݷ9{q8[Ͼ}#˪Auʮ?FtTe&p"u1۟wƶ9tl4 ” eD ߱ɇ w"u)ԶxG/ KB|r-,ۖgVǎB!c ;r1ic ؎<5`EA  %htڥh fٝaw4 v喩 k Zb`vD?9=_Y\]F{ՐD;!(…XIyuPEݝu{26.BYv5k ]:[6 Sd=*e SPdU]$mr J1g!4AE3H%?G8__TGƿvooqE0볪^kPXbU2{}eOzn7(+kUNVU#buz<9s5KmJ4lؗ߾'A|p Lq_r+ږǦʒge!8#8\sWq]V\uUoXisU#u}&rߟqЩ)|5 J}雲V :qѡkeXoJhvQTJgaCSg~!B!h NR ctZj'A(-`nhvki+Lv.[d6KYG E@3J0.>*-u sWlLwkYEߝ 5o^KVnºH!peʧsw1ED`U.-nJtNo<,ɦQ|-xrtϫhNeӎu 1a4{-z Y̲mٔ%Vk;eWju,XrTƑ!ʚX M^Y;DR[Y*_u궪r-u)gFr/mY{\CJ+ǿkmI\%:7/ו^haݛa G\U-'eԩZ!o_(Sx蓕OGY^p]AVRGTR5Yy{\18k^ю9}[[sG܂ !BHb'6jj( ,`1@ B\91K'XVg+0)& -&fzw^QVK?{LOq&x֓ҵ}q%*h$B&s#'ulOq|Y^mcpą&mbg7 Yq+M1ݳVe嗾t JKT*+ڦsE둺dzbM,?+s[;|$lYfDoʯ8kU}C~Z+H벪szszstp+Lłôq>v*/@{/: <1sk2$(@Y]+kQZ)oOn%!GJPB!r hSRW0!?,JȓVς".K@8,PfgEpA (!"jOapt[<|D 0ʋ:(% "-=xq7<0rܩ5\7~؄rs(|0mk> z0AWm~V~CK~n>XjwթD}p i]V\uAoժ"*\<9^/FIPG{ݛUyNH_(jXP֫w=n+0|s/󒦍B]1Ml8kqhP?!B]ϰhS0ؐL \-/aChtKr ""N2(.@0f/s6q5`_Ey+<B!BA(au9,_g/7XPld!QΨҞgm2CTZ3E  F_{!B!Bj gX+ as0C@0"D0V%6`w8,/Lla&v@hG!B! `jL+̓j,"W]Z>=C3eg1l^0 s2ng+ȿB!By([N{_ K0 M4Zʰ>ٹ!k p-C\{-/S[yCS}K?B!B!@]NR"U[WIu. +@]{9O@nX(=xwnK!B!RsP$>ZUjs zVvIJlEWv]mF_lV,yAJI|CE<{" !B!Bj g%=1Ujl\!!;8D6;6c] GuOBu8l(Ȅ-/?!B!B|@3D겕 bW;K@܂!#Dhi6l-ͭe}?]X̦R͎Ҝp] d6g}uw o P\dNJsP2E6ڥ"i[˺d%AQk5U`P>axD$6 !BH$ 0{p{_:B (۳8fRgRl DQsZU\tAs 3n21h 6&Wh~c,>^;\V!BH}E{7MI+Yq{n|#_C 8@{[=D@׻k˰b(M?C+Ebm(~[%! nJ@4_N,l&V~fŸq/( Y,>yXXB!fqhu(\XB#Y!c(RhL7n+BsD;bm(Ѧto[tᵹ F7_ 5w(_~&B,])% !H|#hw=E+u6Wm[2XŸξ.^2|c-!B! [:OPDV do)Fs"8D" (Εg3Xٍ}iޔsi9M!B5τRP${;"E9-vX, ~Js%A?)ٝ.΢oU \NK !B!G* K( zŃ;(f=eBQtK^^ij[B!B!(R&rÖfu;_SS.0P~GQB!r͆XmBS(a[0L+1K[Rk;kέ!55 (,˶hy-Pb~;6Eq^!Mt!W~mTYnˊrbpV$Ɔpv.EG w#үQ-C`QKB!Ln;#zµo.hbJqB3|‚_R#vzy>];`AZz6lH+yӉ uDD۾1> x)](!Q|=;)?iP3hH!Bah8lrQYOΫT"Va@D%>qbtoȮ$a߁Tz57L%]#FH2Pqx LcJJai2/0P$#9V6 !=7OsפW^êիBHH7a<!B;5"ͽl27Hy^[|9wڴl(o|b9}?â[9h!<lLb^LCbV|f"g`38Ŀ'+zGhɦ}x蓕Xp2A+MoŎuSorM4'aUW"*s_عsf~:]>ϓmwfS=qۧJK?|K}KOOGhH(ZJcǠw^͟~}CLL4?#4}BRRSL,ru })zhf1V>^uV )ݚm˨`ܬ-7y#  wfq _xu䥅h;4y^-y Q3K/cF_cF+!m׮ݘqkjѩSc*|,tڵBp_!eKۛyc?-[6oF-yZPX[{Bv~#4)CV{'?/cQB!LjwGB=LYf-yE=6;2EVE"5)zUGY|yKKlu`e( g&U&ǭoލm[Ĭ!x]_II ߁6fѽT_gN׿߈6q$պ7PѯdSڠqdr'x5qSa ָ8cdh/aOjy? [+㣗vhmY)=Zv+❈l>nn&ߝUKipP0>k 0O/W]Ǝ3cيhzRҔOí7ߨwKsϠ{wVV6.b4f&MGl2OÂs}zчϕoeG_9sTք!%Y,׮[B5 ׍=+۶ ➻pnۦ t=W<}B!ćxR{gy( <> d͸F,OQ6,%o !"iLX,\KZk&U_@=Е_EcT8dGJ.mKknw[w Djf!zh0{xlj -؅is1KdܙpHegI;͸(0AئߣaH 6@Y*uwŘb"K[V0Y* bw1SN_ ҟ4AxH>[Y9x ុƣ]HIMͷѫGu6";Tn4[xݛ1u*_!UXN$$4DQU-0m1㳙_(yB3 <W\zw>cz]ʂL܃o~l'pM~ sʿ[ƛotq7,tſW]ZFYs\}ceB!x[ށH+DOo֫ #_ #&"VO]ʊOoYUc}z!B).K}B9 !G?lRCMAvB!B! `B!B!P$B!B!ďH!B!BCB!B!?A@!u !B,Ȋ jc !u=8Ί BwP{ۓa~ J!- !u؃W.kV3`ZY!B!@9lŽW !Z !N_dIa/ʅ$߿v\M!z%@! !uMQ{IT!B!B v@!B!BCB!B!? !B!B!~ @B!B!B B!B!1 !B!Bc(B!B!P$B!B!ďH!B!BCB!B!? !B!B!~ @B!B!B B!B!1 !B!Bc(B!B! hAV!B!lV $B!B!ďH!B!BCB!B!? !B!B!~ @B!B!B B!B!1 !B!Bc(B!B!P$B!B!ďH!B!BCB!B!? !B!B!~ @B!B!B B!B!1 !B!Bc(B!B! !B!? !qH>"u KlWy rӂ;5@0&B(B5Eǎ>AHDŇ! BS۔,>5A k؊.EpV.J,g8͌B`V"!1 !u :Omаa#pe݅.EaXy!WۣcǎvV-5֭[m6{:t(7oQGQFپ};f͚ٳg0={މ.] ,,\OæMIX-GZp-?ڙwߩiZ~[j5߸Lt(-!ػ( kCQ GF+6Y"&\MFb1J$ V!<bxD$bcѷ |xIﱳ kD*;vuAPtpȐ!HHH(0 f iGnc4]4*_4]4*_4 CT {6MYi6v ǪignW] RO}C& C˲׽C@V.! !iV_Nv#ض]yZfn +c.лw =eWu$NZnN1I_C[2c!ߓ: i*P-A3ϛ}0ghiW3_ME+cӱHRud%/mu_4©Dp{qJ&? !9i)j4wL- ټ\o޿oJKJq`)i8h=( Ddm\ZD6 ;5aӆì3Hžwbx1vZeaަ$,^ݻwg{3vZefj!Zd-)eiIIX0aΞ1\ D(8Ŀ+'P}<7ۚ㴧ҐЧ#&ǛPAK@B(BjV۪} jݺcyL'ؐ^?+y `4@bF:%Fh!Cg7j|~c~%|mzp-3c lV/p A@@!~`Bja>l@:@5!8mh>$`5־%yI/DL,m}v)n77\ [E WJ3̄I#ahw8~?1>@o;~?1>8\מg2)osR+ه!1m/;&⟎Ԃ?S [zYP$(Q;ᡤHyH%0$O'6CNr捛M^-[^Z_߉o'CI) ]!{1O"뤦">>t[GwcA/-? I0;wgL9-2yZw-KK0es>faH!? U@!O=tO센"r^F6l<˯{x%|mZ,B cƌq*_-Kyt]@;v/ǡM5CvɊ'?zI||s\~wNx_Hkgウ=Z˵#PR7D~JkJ;_rn8+fwgM6*͛+$|yYQ3K3+iAAJ M{wcSYM4hРr5q~^zI b8x`|UkjJ 1a@ٳgxaq2f8+$.@p;ҷ kotabZMGyP;Z(}7^U]|&B9$;.:!im~8SaZo*8W^yk֬S~g}_~c=~ގ~tUm{ڵel Caa} Xhe&㫙b ?e: [%eL3̪M67nN:$DFFkd-6lPcuعsguۨm#ێĨ>ֺ/Kߞ#GQj!8ܾf¶َFQ:}hW}{&fڂٳz]I&ƻ[ k.|?j~סCs9(..V} rEhڨ\k:O3gkҿ[|n[xˋ:99hРJ^tn2}饗/+̙DD``?yWKq)͛ѧO~z:Ν;ѬY3rW\q eo)g}VMKl˸X,YDu]pۿ%baec󺍨p/94o@.;T)5;vPȶmԱA/"#ýkO.]/V@r@aWΥ)SE=*=܃38ǏW^ve)3Ph→Me犮y:~ us>!;t&;֭]kMv%/8l-PRRkUQ8eyt>=*۷?q$/sUVb=1uTNjK/\YW:yw^x.-cǎW_D]J0Oy:w+k{O>nME&K.DC=D|0(o*뒨(59sf$ ^WE Y_s*qfKߖhSDla'^{y8Q[lAUCI+CW/V .POxꩧ<ʶ%b~:s梋.R&@խz@4(ˈ>gqN&ZH+S\^ V()fǶ#n{9x 5Rq!a~+R0^ÂLt0 (PQnEhQgFǚ Õ n@V,z)* mVCmUO{XͺKL -qEX"Uvxs}sD݇B !#/|d&y$55U's$ZĥH端rԊ("YN^.JB"yʗtd p b1go_ݕh& (A'/U!™._j幪4CHD0woF #/ElsmPELҰz}\s6GdXc5@tZETmKFyu9:˧K!X9-֭[p\uC9b1$r~M%S:m9$"2v2MDMdԩUDdDZs-ٽnI]b-p_Hʹ#BX[UGȝ=/Ē릫ϑϣ[h3M :G`V;OWßkZijM_?c"0k-,^b7.A{EK᪐B5+/4>7d,t<;JttHM[eOwuTC>Y)ϽE?=AQyo'>!zȁx *G>֮]|Z3sMq1/uY,E<דb%eڱcGe!+TbgnӑnD:@'׍X0(j9_ƃV~!fՍ-c=K`g!B]C Q 4RN^u$~B)D B1"/Y\k +C;iE O4^%FF6ōhl?Y# "%ֈ"DsU:e 27nUVzQm;~ծ4ca؜{De+"ZKli\uXꉕ9.V xłC:%8=10)|\-.cY;g)B-RS1k{Yԛm5XΚUes8Oj:>]A[˽T{wL:kY3BX\r/kOaN[ܼ_X`hD06"\b`ro. w8Dηbj (swwHgVƎ)ˤ+ ap)c\o?ݕ[uZn}LUVxOy JL ZB%Kz ' u4dJߞDQCdߋi\4.t = H$I(B޸q} a"K+_mٖ*Q$ҝDK;-V VeBJeTQsXB)U"IWԧW!ȋ+%S=ꖽ68l%O!g`9?Uv.?$XI_dwzb7oV<27;-׉b!/qߕsMqwt6v^"bKkrX <̂Dʶ%׍tF/יL{|KYi9$׍ bZ]mIjMdIIPP+bI-@^%k]$(B˥{lp|}7;[ot+:,EVĥ?[Sx$1MMb.du~Ǖ>d~5<7嘉$ ,V`KD"׳{Lʆt^.OO+>]~ B"lr>)"vȌ#+V';*-ou9c|Q'6""\r.&}ۯA1"rTK?8  M1;h8,'y޽XI\l9"Ectl3qLz; Y>_G^D%h Īq(#__q2J c{\}%ڶT;sǟ^2_oHC, Ʃ߼lB*A>( VP<<%y/C͆'E@=Z~?$.4_:6ei8{*z\[>sfV2uٿe$VK (+Ws0q7jim`a 0C~C-?ޙ?E7Dm8 ‚1|L0gQv/4PsÕ`21JW%7QӞ"`U s#(B;9!o5}-8崳мE+G(cK)>uؙjВ:יs*L?My~vѤ#nz06mjg^'4ĘZ~3?S˟g:{ic|g~iiZ~&, 9~oo?ng#{_~9݁ eS 2kgDaV:!5] !֑gכooX8连qY=S( 2-i nUQSڴ-XU FOkӒe#j~kO,06QRdtwĿ ;=sPiChV8! R'!sPa݆g܋.͇`ӱqXj2*/*4Eh` ,|R>'bK%""r!~ H[7y_!!W$22B߸I7U"ӧLLv\*_kiӪyJ5)*\HΝ?/˿?|9P%I9,2[I [.OtL]|b9|#W:Liċϛ@y7CsϘu|B] ZgyͿ~Kj7mؠ4o?qo.?U+k#n۾S^Ԯ/y˞&}]V-S 7?tL<|X.l]{$3?mlYJe'8: 25ooЯp̎MsDD4mD.ZWzu׋/-[9^ȕ tIիk=6IS~Q7ONw`K/5 d^m7Z[Nx6F噬DFF:ujXx14m Gwk~<{I+-F8yiq&v,!L/uY6߿*XP=&{f>(>%>ټc-WD xҥ̿Z#V4|}ցHԯ'&w ؼك(}7z M5>>0 D̿tTʖ1fϞAkari󾦱ۓcmCk+:;N"LС__~hPgȲ_~o̞~43D]2o:4˱ٿMF*TP^1r4vsͿSm;zիI_ ȿf )P  $[6N,kGߺ\/?k^o۶=i,QRۿ4jPL+V>L8 2 S{Ν77J^=;]vfPJ*H,Y$44p Sdi/̃j֤m*Zύd¤ɚC""聭Z67T͛7mӪw[MzI_ĺnL{O ':u0?G"Ͽ8B ǎJ(i۸q @,xk>pa4@@;A @Q>BCCe5}6txxd???R4jHC&2={?k׮9*AraYүZDïq;}$ׯ_J+Kfͥh.ΝYv)fΔCH5R"O}ʕ+LGg}򉧧-[N&=y@el"}fiڹkeoٺU;4,P߅i˶wU2?4dmdQ.cժUnji߸O}*TXvkˮ18{>8qIgږwV-c_@@̜1RQ>үX,Yʿ2g'1}fy&ߚ̝kOGrsJֵY2ex?3z}"E8-W;=_"wWU׫+ lݼud͚,zuH] _j֨ao'|)-[s3\ =Q.AC4xL'nApϝ3Z48\w2:֩aF&Pq 9a݀& iKv5o~ۺ0@xl]F }{hOa 9v9|8I`FUc/6M0!c]|=cxäS)YWt>3PiSO{ Un۹&H7nk݄$z\q4k6_i@65 D=ڽ'et.˦5|s.xxy} ٔ*]:TVKd=3GN̓'W.URڶi%Z6ڵjJDd޳;Vpq5[z[4o*%+2iN+ZsΝ-[V]_7kf-b]sq͛ξ$YƮpYɝ;9yNt$T2[YK{lMeb:??(%KHѶcb‘#GeZKe%[oHEV|?e2zp9uy v%˾bEe/y;_?3 e˿ G%\tkA54蠵tҠ-@km$}_k9[^k%9׶yc_0׷ i:K*%o{[JqM,cZsd үMu?4lǑqƷM}_ouuQREl܌#ڙX駷MO|ӲIJ5զm[Xի2by=Z1zJ; ;gJUʕ7AKζ[6 YuNn7/\PsvR;ޜ;vZkڙPyVX[\,9Z}ժT=Xk GWRT[$3""\VY+Ml'2~Хtx7AҫA#_vw={k}-O]{Hdϭt#]ߟv߼V)7r/ Z7}>)Y2ӺM{JN_ Sy}Q+g\-=UXAƼ6zhljc߳g}kTV5SL7Ƽ./dKw!c+h{S*dkEgji ֨!m# *9~h9wiײE3iP-R44R:h(eJj*ξnJvk˕f ٳgY={~ŋRxqk9n iGGm;f>+mH֬&5lbm+>r치]E]:7[Z$w\1(okO<־qZ;U70#5Be߾}RT )U?W/oƛ7Ǎ7$_-],8S6w #,֝5cYNV9U9S lam[JֺDn&PwygR{gx/ך@m;XeC-Df7;^'ycV͐S~ĩӥɲşI2o]lie2YEҧW~5\ pgBB.ˀ7oV7Ss(>>˗)SqvAz떭&aT~}ٴqc=иYժU̿1jMf\r6}餔8}ɗGeϖҵtM>`t𸬉S3NYĕ*U6yyPft?WW^I6lh~y,T(YOɺk.{FZZmO~Fltɬ3|4{<իWϝ+7] H/+U1G㧘A{&Ȩ/jg 9vW֯['ƿo)ZҵO'v+ |ٲeۚׯߐgϙWK+h"{FkDkփP{/ZF_aZUZ;PBF6U`s2PX5-&LbEL`1U}xG7PMMdTDL0-$o[&eٸ鏊nSsgXѢ&Ж\@GkWiM*i[mWܺ*Y¤_ϕ+h=:vN_Zˊ+o}mbR4mNԯ99ː泡M5(֯Sa-Ovb__[n}{$U_{)0 _^WCBn{VY)ji}H_s3ibߺmu[6o.}PV&T-&x*CI]CmNZx6z&~ mbg\seh@ncLOy[&OjH(h`[g7 _^5ݞcB%TNҬ7q^jjB&[pM7@\jP=6p oL /1p l2TJ֍5f+6T|Wc%m&MȈ>hOk>HX_ zg5 HFbo.5zpVJcM`34یܺukw`fq-<{kkS+K=vS48d{b ZK&Z}ڜTjN9qy-X+[yP.rO+S=&6X1 п5hziךV Z] &Yܳ8 &.7|}f >jpfɡAݏ-11({MJ "i3M:W+KTlJqk6 Mܽǔ ֮/?tv6dt) UA?X7={GEqؗLFFEɥ$_,_h_09O<1`N`=0F5ՀׯzZqU3Ki͹ ;mOc\/m&'@7B|XI)qi^h8 jPJvPZly2y[9kԦA`U<3gRnRhp` ի,\&NnO: cli.%n΅MÆ|wtsxpTLXi2۶}Zc' 2mٲq=z[$w֭[M B#cpBLr7^_IUYZ:?Y%Ln*)LӚ{Y}Pknܵ<ӚŊVNR&jiIӢ7nڏQkiDo#eD{%nl;IC/; k… Ǥ?c15i=[Qf._m5\,%DHشy?0cok%yl_?ԼC9g 3+ZDV^++3j:iڸ{М=@s:rB))]?s^gJڇw5Ho4F#G&0`J,ip-v_rMA tD[}]o߿V-SOǾ=nc_1%Hhc_[miGk(nV_h ={Ǣ8QV9~mY~?a8g|3:qzZZݜ7 T]vPS;Jg]Fԭ[W+3=شL<]tj-7[f:Us0)%&|q͞=S2y}{2C_~11ז_/t _)q}jGnyW|l_-Mbb>Rj!RI˻ӧ!6"ϴޝ.~dϞ0XocKJ/eQ=LСlM vMBB%zx0Y=3%g|(:ĺ_N)+\׬.?gY h\:=o֦.8xּZ3?moRhSxa ;6ۧX̛f Yk>#FIv|tmzߣA?}}!+[F.Zlå1ǯ%M`G&0/q~Ov;_JOLy<о?u==b1;\ Q.AT#G ր+G_Hf͔N"ky L]Kz=(.]bGtn@B2ud01iI'ʕ?pyOGqzlMFdv5_kȏ?hP3=c/dcw_ ߆ :]vfkz܎??ZQcK}ߵx;thO>|ܹ#m-Ozq7n4DZENkdļKF3x}gio)f_ί)tӷYG3͌׬Yh> `+w֥KWgϖ&-Y}b=xk?:ťID6Ծ4i.?d*ar@CG$2"<9kuy=&p$#)&a>//ɖ=i&_RJ't$]Vi >p}f%e)iըQM{dՌQ#MKt*䭱k#eڻ3Cn7Kt{WdoP2B%K~/~5eiP;F.[nڈ/OOi߾lG-|,^rOBҠA}XMퟩrZnuug-KYYҥS+w.3n=|2S4SNij'&EJW?+ p3k{7rnDj).{T80(8{wf:j⭷4; Zڴi;Ҁ/,w2H)#mBwxi.פΕ3~ ?~]vaL~i(Yk#}<<$JIi6ZXZsF\:۶W5mLuy}-RzW<$5_H:6cs[_݆-mZMhִI֊qL.O`gsfG}Zu:ڦ@ݗKxŷm[m54%gٸI `6ߜlhtXOSM}9ۏU4wvuӽDBiLe)-K #=s_PN>jt<9_֤:;hGw [hU/Ae ܚꍛsL2(mfCK"Cu-}]H i:ׂ/^LExzdodKR$6 30:yiުA,Lڬ@gԾYwdZc-JT,MY6Z]K =OKh?QZr%ie [fPvet{5}}TTvWF"'2(m>}׼;={nK)n%iM\pgAYB?i}a:=SC[WTA^p%Q=qHp>&ML~"qV_&w*+K޼Mդ^L-fe ㉎g$EHo#$*  ݹ"0 @d*tp nz̚yo5͍s ddz+~S\~g5w'J,2|r%Kf r>ʕ3Cl%Zȑ AiL9.~݉ 2{ Nˑ$** @o97+SCΜ9$(8X.M;&22R\b}\s35wi% +ZD$$$$oxnr-H^O/ɜk_JkuJ2kVˬ5ݑ5eT+Ln{T80(@xjosښXS5YS5EZVIM9H&W. . . . . . .,+Yƍc.9v옄]KֺrRJJjݍk<]͛R0Y$VNO>)AAAR^ɕ3W 7Iv-:?a_z] ,(?JO,rɚGk{^smm--KΗ+W䅗<ܶuiMh[ɏ?lX|&3K>7^J(!_}]""#퉓o[fiRk3gX)|Y}gh;;Cɑ#\t)8&t6xSf7tY#'ej&Loj}߿fu<sMYԝAOqfN\8\@\@\@\@\@\@\@\@\@\@\XVp]gΞ@"3 Cy{=  @E{dqwʕ*dD7o{NKEw&.*0 @*WsOq 2…dテ`!R}.*/u)!!!d4A @QP ƍd4A Bpa c0y$9rm7k\:v$YdOweYnٳ[{>>>Rj5iܤ͛!dr΂jUr)0pdۼi,\DDD~ O+SvڜH \5:tH^|/] >"MuV䓹ƍK۶w}k_&<<\k֬3?sRXH'>#[n##R{>q?O?'[Q^v= .0z-{<)EuZ[Qe\‰5:yJ~D%W4_O6$äJ{re/_.Co2orqɒ% _+_>M䆕'$-X=9/GN"[9zՔ3Cu7o&YF+֑]Xy޶QߐŋK~M:]6o&?_(ѿ}4TX(rw ۸9v M$;|8{I*eʄm'{RXQܩ4lP/YQ }y<|_';ϧL{7]ѢKe_R+MrLV9LNy ,3?2\tV>CW!˖Ã& ͝=wN ,e\њ5ڵkR^=_[n}Z8EJ9#vy]; "S9|<Ҫes6qgXA*˿?Rb`Z"maa21ҫg?n 8xغ!)'E#KViӺ jiM?+۬] ukK~믿M[˥kN>bzuΧzv_~Y-A!u#J%Oq[h޴1Щ&m $00X.CUT<ΓkRIe歲t&ʋeS'M e_HΝ?/n͚6A:m"g`iɡC8f+[l&6nhӌ[PL2kg3GNi԰dž[(+O48asoo߷VCn+]b!%%"UjZ8yBdqO&H'05S^ԨQ]F|֌>Z.wlZ0)k׭={Ii> >[$?[c#}?pCBH{=HZ/O 4qA2 &??WM74FM<4T5ə3}]g=a ,Y8_B\^npf8bO} l\tIs޻WZl!yON:51e;;wnٸi_-Yu6HBjJm&{Sr!&njVZSL,Z\zU^|yyݶM<?/,'.=UCmbmRqH_?y&mgϝJzZ*3ԨVprv7cw)G}$ٺZL ., mwJ)uԖuX74YNWY|5s32a/:rY%vw2/|unnƚgێތj?0^+9H<KddlN<]A?oGڵ0` x%&%}snyw$w@bWoiΘ%/Xeo̰!(F VE~Ѐm4}2i[;Pkwc}sâg_{kIS55mW\#>bTbHx5%^-:׺7WZtӺ0yc;f^b2QL_yysS449 ԯkKOC7͆˾@>C||k Ok@ަ) jzվ;wɐM?`ٳg7$5mc|61Շ .Cn=-4YsԪeKSMoҡ54On.2y/l mǶs.Կ=O4v:k:ŊҥK`hBTɒr̹}z \IV9 rHvϟ_.8Wۿin6l,5A#&x%kXVk˪;·,ZTz  M镔N:mqIW>3ݴIcsmڴ2RS:Ҁ*TVH4nd$kټ UW>/yQCۜSֱiaJ,h}wrN<}iq9SSki:<Hפ2 =uu)~1g .j@{:uU~c*"Ok=__`<=}ybɓX}ŗG&ۛ&y:hpRk8if`RiUkIS+^ouj5mذ,+U5{0:I7;i)|Hr)W\MqG>݄CG!_Kw\ڟgV5u2SR:.-M/hj"L|0{s\ݸ~+hoTuQ/^AGUvl io7S05nڴ^4VҥKxRLYz92}H}4Fisȿ1m&5OfgܹRLi)UDr`k>mt+Us?1ڧc<_ooOŭL?,Iӯ@ődR|Y{}Ly_k$~_i=du<ѿ J*Vhǎy>ѣoݮ/>XEk'iU_k8aj]gƬͱ8;N/Mkljl׷O/Y'7Sk板pԖkGppiQC:uxgfR^]5jɓtrqB;?n%v:&b!XZmSbE̯ǚ;tʇ5kK…Zժ>'ҾaRϡB5'Mpҥ3M' yr>rrsˉ'{ZXk^ f^[ص^xχ^lYh=^ q}=Z^ĔSʕ͔RJ[&۷W6M y敞O퇽۷@W_~?]6OR54__Ə{S>_4o  |B=Mm&g:2r~Lu~ H]:?!L]zH.OH9M_ڵL൏北~iips=RX1ἙdӸ2jJӸcdfr)۷Qqϗ%L{ m}kUծooϜߪUyw']b!yL6: >|?dOM0rĨf(|rnayzl0,̘5[lfI*II{jUefq F J '5 s %C.ˤ@G֬RtIy6faCɻ4#6k߰5)@gt.ݟ\sQW]g_fϾ5[<ի̟7O^|ҫw4KWZupG8 5Wf$wwIaY=f*L!TkG%דɰMH/X(G^5@,'~ nVwV+.ŭP$8-"JqŵXqwI7Ivwfv7!̛'nQnhUEQc(SԪy3d8 *a5kVܿgϞn??:}~`iҤ|Sr夵 /u V^GJypb> - "\J ▵<ɿ'OI7|{Lc)P K]Ay߱Je{F͚ 82wLdЅ ii$]sI!'a!lid!paBd@L&pQcƀN ߿9DpQI%h S, Ҥ򢛷nӥW۷P+ŏ(=#Cݸ r5ו>]Z  э.ПrpA8;yxx 3 R bĈAɓ'|0 C!pa0\. @ C!pa0\.,'ܓ&C&@@Lt =L(.. @ C!pa0\. @ C!pa0\. @ C!%Y!Jׯ!r^zEOד/M2&N(/}/9<֬ۈ;IC*]Gt+~hӁ:sM 2*S7n-OYςhY.[YƎD/_}u,WլK /u9/7^sM;)yvEG[EٳgSD(̂tMx"=x@gΜ… S $({t;P(S y Q?_1eyXR{?x*;uINK ΢yrK;!%MN6e.˕׮_K}{ie*VKQ*i¤Q&P^Χׯ^S uf4rO߹`S|y#[Qr]#Ǥ5sƔ mgΔ~].Y&->7G:nQ٢!0랞g" Ŏۘ׮ߐϜOY2g_,'OQnh5fwj>+M" Qyi?bR4_?ze9{׾S79}*Q()iCr./X ?՝R/UgrO6uǹOQ?G sTNZ8ΜX5OV,wTLJ<&LH)R̙3Sٲew>LFI^U:2|Ι6nLIS׎R;w$s׃uDʔrh{hOs$qbjڸz)Mը]>s6ع?(-7uk?k}kmmwO/*]b92M7](yTy`C}{T5O<|DZbqF6rW.ԦCg*_ lĸS"^sŀ̼_'=)'OSx&H&f{y r|,*M=P4u9zvW97M3T[a_hR_r)1zmŁ%6v&߅K$Hs}i͛J^RjUT7ˈr[itʓ;Pz깵X:9_Զc 9vL~/_p,TŌ ~_t._ ޳wTQTIR%IV-4ՇgϞ[*YBRِa#%`\|w>-CǕ|!/_r%r..\=elxVzU|L1KɃ2%y+礱#iv-hR|.߷[L۴>:kM TS޿5-@m5iZZ*5W,Zb|֬yg8[43> ^zUٳ}))@w ]qSW'9(dǮ4mx)nsZ+KGE=A?(^cZҙS'Jk*+.=hCcר!rdϦ{y-jZ5}|_B Ve r_Y[!)cyFߑUeg{Yozvt住gZcWz1@E@d$ L2Q֭uLNڶmK3f%`ݝڷmECGK.V{t,ctq7n2)Sn760}x_Xe:4 wܕoxt s]Uí2P\nSZUyֳM=V5}"+Uu:|$z57iӤ_|!T<=U'em;vI \XSH9Cn)ܜ++:74i!",97o¬WҢ40l?q4 -!dj3gܑr{O3Z7З,Q\VCKze"&uoŎ~e-ueebP 3w;Q\G?F>s]е[6֪X^3ԅE ߯] =>$<$L -ll9gZlqq9N9H>]:/ ]) , _T,_4͐!R.uAyp2_XZ/-z8͆k5ܿ8/QUv\'ґ>ޟ9b_ԮZ5[WﶣC=pVhN[p_~`]ӦMv25jԇ[Le]X1y-Z{L@vߨyrsfC 4?@"<( 935Ylp#2[3q>>wXH^+U߆DbcۍlZg!I$aHF2n|?;vG2]yRGzaBdΒ%w/ZXw5_8ݥSj԰zV2|< x>z68_PS޺g[^w6 88弬w,~Z9קO}lkZ_,g:HR[DVz#/<^ߑiz  {ȇ.<_|; ծap߃:+906}/k1ktqX!`ijs]@ 3rGQې?dzZ>X+tO4uL?`lӖR+kx8+~e}0ŃsCEdeƭx \Ν`n#[6ۍ<5.2CvnvȐc:uEwq-qhjծ#_XIQըֺVmZ6m%y˳~ۥg+A@ ~ԧ߇>|zaƌevNWGԼu{<1nrCGȠ/^KW0KJWƭ΋-ao]uR!Ny\|œ88-e\.@ %ˢdl=^{ב(k<~f,sKG-kimT틽l^P oΜ94tQ٥?i3rkȃ)ThcFь"nԬ<݈ fTZM^<%Jߎ5L&S[.SGf!tjڢ-X:t.r؉<6U#|^}[i~O2He-[Ӥc#t)]B&XװTOe׫M'OZo[pK>^ -x l_ 4jwLi1XԪy(9E| ~I&7͘?F|-xV?8~Q+=uZk9h5kޒ@0 n3RčC[6)i<>p݃KҤ9tt㱧޲߼I+@A/+.k[~9^98Y9^ G?QlUoVF͔tנsq`/[K~i%q%n(Ofg뱭vŸ,3_n pƬ9t];]ttԽڲXoFž땞<Y3 6?E}|y>yzĉڵ~Vsԩԩt{|0`xxΜ9rлwO%_ͺa^[9+|2Hw}~%JYw( Bst=;Z<48]xl])y@ln> w<4.]$T2go/E2o(.KE&ovG֢J[ |?JI@i\8w͍*9r䠇ʶsʅBO.=kSժQٳhĨq3/_<4d@d l N0j lm `kVڽvgT[MW^~~Nӧ3 ɰ'O)!N'a'yO$| 4'`K.pfӈ/|϶jՊRNM=ŋSPP3l N]~^f$O˖-4,4iR8%ixyy7ny[7o mg 8L2 .ؼAχ6AƗ_~IcǦǏm^4i"pŋf>|(̚5+ 4ƍKswm׺$H@-ZjժQB.'?CqASBJ%͍Ν;Gw޵k]}t53&y{{ۼm:CQpC*]۽.=e*i-#ݑjmD{6N$2&|}p~GvY:GeGuܮ[% 8ɓS"Ek˗/`Zn^X1J,ک̙#K f=сiWt+gX\)?#e>sN9ANe@?[wdOU#k_]j3 XpJ+5mڔ,X@7nܠŋSÆ )a„vj*syxxPƍe[DEJ;kMBOһko\R>HSg̢G]ƎFOLB P)yr,mcٴc.ڿ -^+lބ׭Msjԫ{Hev=miVh'R߷7mٶN{^|EՔt^Wۯ؟&s(IԴq0{)MwK=n>Xʌްv%NH5?Ku|ײ>YbkjG5W 2e ӫ:NsLkGv[9q[n]:?gꃖプiڸڽG7nۻ'ϗ',U|2ԲYNk}uL*4cDey'JW&m\R:Hٟtitʓ;smoZ'k볶\>YJwhhW7OnjצשVֿ<}5UR͟C)Sx|}@?VX!%KP:u(UT6fiU.m8ڪkiɔ(Q"ڻ qm߼!BqhE/^\zqF(iÍ͜E}fFnAzujˋЏ|hMKyS_MGt̮'S'-cOoqǏ^f#{60xe" M?޼yCC FC+YPuSWV ec))Za\X6ݿ/Y[S  kիW4lXzl|ײ]K]74ժQod q{žsmcZ=Ǵyڶ֭&OCiRPwl(׳_Z}.>e"%Pα۶@X&fԫC -1˛{Ҽ3lN5F~|yFRuՎo{R>?<}rRݔzv~-Q(c C_dL{jU{wYw>| N+EԶm[J>L? ȿkrW2dvڑg8Q`Y[C=vzuJISx$?|ڙ&H@Ǔ/\KچL3P/J!mt]盪 ,@ɒ%ߞɕNOoT/N wQұƭ7 u X߭sGiÃW*AȒ2eJ ~֬[/S}ҚܽGNVA_n߶U`-?KZu=<{ĭ]AW]nA_d"ȪcuLWn- *+J/=HS]r Ch>~*U(OO='Nrv QpZX%C9=ǙzKr~nʧϞ~.^CV ۳W̧>DWhN6oޜO({K$tiieoVqLkw-%=LJ鹙> S+kRmիt%]f̚Mٳ})5۔Q^hxI>ku}kVan=J6>{|I/-C^)ApkZr4n%uww$ҕ2e-oMQ?g4w x-Y=?bgksnk]7M Xb4sGBZ-uǴ-Wϱ>9>V]/qB/ZXyW2&]re-iΔ1 yrՎo{P-sd-Zίܻ W?LRtIZhΕC~'MDS܅.o޼TfMϏ| {a\fa&$6jFՠ9Q V2ğFkܦU R2cb)]k،תO6v{뱗-Tŧ</`!-iTbUй 2^wڭ;,roYK++\+x)WlDbvj醆@!antǗWLO(!2 ܭ۷q׺.x~i֪=ݵ5RǤj56x9+꾏/,{-\y+*/n> w;wTGqwS`1*p-%/XB-5?`pi=%J$H ϟ͛7ŋ 9s .L*T ',Ga]a\I~ |%t6iժUΝʔ)Cɓ'ݻw'N5j$ACE%u`RyV^!ʋW(9˥K/ԩCRi]ݣ5kP`` %I4iB)R@(S |m8q C!``pJ_Lu6k۶-e̘Q& ߤpdx& FI7ׯ_G~!.KAAEtaYn#ڻ4Yr%@T(Sj7hB3~^GHәYL#o?yDu6i3gS.:J5kEN^:{zs~2ZGjiuL?l?*w8zRk4A`"tBBB/8`״iS?u2d A@ކDlGkէ+P߲m;]r6]E:,];u9s|i`^oО72ݻw,Φ)SFʑ=ҥKὴiнiٯ+MSO:]v&OAk܀/]s/|6u5|tttdZ";#c~Eqd샫#:|*GQdɨ~fǏWpV[ŌS֙4iRs*lJQ)}4{o޺E9rd3>Ŋ{$*f$3ʖ7к?VoKRw6mު{C@KΓW.#%Ν+'ݺ}f͙{{4.=ԮcWPzAw/^+ժטJ$?'Nn|?p^VJ#Fԡsw3S5o/-m%wg]WczGi΍ϑ~ 8z/vތu=[ @p*t-xςx*Uқg&2ty4s^r%Jԝs/R6QӖm)O#FӴ깖zlmgΦ;w9e]Yg;wt۳uS7o"ztYڮzǏVB@Kzy]:wEM[y_- cz|׏ἱmN*WtUz,ӟ|.1%w7twz1okY4kNUk3T۴{ڹ…ԤEIc-'%iVFjyf-k'KWزN=;-ǼicTX˺smO<2s:Khcҹמ:`:n~s&Ɂ gΜ&Myvߠ ;PBV?.]:ʞ=rsVCvkQ:x@ԫC -͚|ܭp͛at<9^b8q}fkn0lX]Oʗg$%H1:`0E4~~2| hŔ8q";VlەS&RA~?H :^T*//C?2}冱5.孚Im |"&LHRy|,g 1g7jҨgj Dkz䘟($䭴d_W`vիQ%h]+Vw LN:2E wq]yx$3e&ѫW![|)u)-\[[Gn'%M` c(MԴqf[6RXuRAWf=eujt|Yڮz8{$KQxqYV^KOAʺoqOԖ8d8e̐6oX#?lX8Zŋ~h)ڦ_|k{jUJ޹'qV-O :~&jܰks%b߹jP;viKrZKI-uO2R3k縵^KSNK[K[;F^KK)Kk Ok;ץWQcҹמ:`:nFsh4ٳZd-[6ҷW\9y) *'m;vQ(Wl:|䘴 K ŏzuB/\1Za&,|dr.;H7k׺LR;k֭ԩRIȠOug+Uu:|$z2e@پ*7iӤVvtX KҤMBv[r 9~M%o߽:\9Y-xcp!}!oФtGx`XEOR~<(: eS~̑]~Ƌ$N, ~=SZ빵zlϱRn-wVrEO V%ߜ8yJqk%KYȗ0*=y#)Pli䟵kh>WyG0)yƀ[5Qi\a|cpA)Jeֺg=0n-=ԮOoZb:\滥{{=zk,GsmrXG䏭ҳNk^t:> NpAg ,XP^m޼F6nV4v$P+%hB4}/-͘5gҤZFyx6d\F߶Ӧ͞;_|pk:sUܵAYw$2XvXw QWh؇w`#Z@W^S KҤe v U|F݆2spZ#|fqr#lxofYs"WA׸tIr]kcza#з[0g偹yp/kZۺ_k94+L^)%85itc7ubL^ޗgK]9hgeE'wP %4q;HU2K҂E(w惤:2… PX1i˗q?+y2kN7]--𺧥]Idi֮%SNk[Jzw98<-uі=eb)=[OK n/:@pQDM[!;t.-0]1&$6jO5hium'-+ 7ol|1XV>QLiɏŊiS=8>TVyR[}ۭ!ry\޺]G^,ڵujiwk鳧\]8k#Su=eb)=-[iEs'3^ &G>R>yzĉڵcJ^Ze E) Z$ 4x58bmfmGoWOja}a gшQٳg26T|yhȀ8gׇ.]}}}޽{ԲeK]g]lMڴiBA`* NK~޸q#ʶy0p6Ȕ)pBma l_RرHޣGÇͬY)!NΝ;{Hߞ̓'ʼnN @p*%J 777:wݽ{7Ҷsmj3fLFӊ,g,YB7o$jܸl !N6lؐΝ;فmu= $xnŎVb*]޼ycPjԬծߘ^~eۍ45v$Yv?-.c._S\olŪ4{|4Y"RH!cOi2. /f.2dvڑg_p`cg{"g[˪kh?{)eeɒyesyf. zCFpj &͛tYyyyyQ%$IiǞ>}JϞ=/^>6/[T)eS}?V(R8qv줹 hB*˕o̘n+|ܺ}G~vډj׬[y/s bƌIK 9sF{ V,ʝ;La:J=؉iY7On`͝&um2-t.ˍ{65gt,UқCǓ+U/_>mk?4sNDHL: O}zu')Um;gʗ7,?mN}[]۾p 9n޺EҥK}>\t)Z2M42f@&/*aMW%O啩'4eLڷ LЏrd&M6C۷?^ezP i+^(P^Χׯ^S uf4rO߹.mؿ/ϗ̙2Qկ+%͛jܰuN, /Re?YP.,^??&~=]~{ho+wy彴J:la~7Z: .#QDC*UK.ѵkѣG/88XI o̙)[l7nHIOB%xߓ{ imv:rx=.{93GLjA2e }.X@Y/_W!iO"/]Bɓy/uTJ]K(ݱk%$qbYft*M;v mwWR\9.=e@fn]DqhӒ{6˔*ISg*A<*+ѕt@w@Gi9ee)߬卵t@B\+OMΙN[OٓK=>9 qKrK]OY? *U(G}{֔5kHZrNd{폐W._vtJ =Rqߞy6jX#$$~䇇GRi}9SF9mz]]/_RIfƎFyrܹrи i-26x6o.ACCy39u-24QժQ]̭XG>;+ 4H5˟/5o${ٳig +w-[6p>-t4Ì1Loż;i4AaϤuoo?n[˄ ]{$ttS'6<}aea.LS&Ӎ}՘6[qWeh/+0!{Ҁ]:uF Q&-dlɧϞIgC1kaLy";o~Bd E|q9n9rdFO>f ӡ#GiԘ2qFfbr2k޺-C~J"K8r_G\A-ey2#q+ Kye]wt[߸̴˓f̝5]rYr`A2/]iS8|9]Ky/oniE"g8C/3/sرcKOk_dqHތ4ʖ)MŊƉܐJL(lj+]Bn(c=x@&6xR^nqTL)]e)O6~H]G&q󖴜=g tսL:wl/?{ˑ8%'y'4ZPISZV5jTW؛7|,=/ݸq' H0Vݕ^n_)=;  ҡ C z !pa0\. @ pa0\. @%C pa0\Q͛0dU&oܜ^~עM:x0 3ɟ4wݿiӃwYI/OP״fFw߁hw<|tm4Ez~>S)p$"~TV}*^u-۶ӕ+hU|/ō7Zk3gqe:wSZ?ɶ;iBy GA9َG+oR,d@TNZ.͞1nQ٢]Ϡxvco+)<3Gv+7;"YWZn==L=t)oۻWbʜ)U-\LZ6nX:uh')iC+V,*X ?՝RД3i&$2e@~G7nޢ2;u'Oŋ6˖.EUT RF3&uM6C[ʟ?1CzcZ9J(sWbԺe39'yJ6 ߗ˫-vXL~[ڇ#Ffz |S>9ZGzYCTַnSG"kr{Fg @=ח޼yM5랢RjUЙʗ+C-51o)Q„0?ӡ#G)}(*TNɓ{Ȳ1e1Sjq* pwCќ 4'w0ieӋJ,!whך6u{vʕ)EzMW8IbڱxvEVM~%m[M?Ŏ-ʶUL;?}&LFNKcŦ>ը]f?K4}li7?%JˇY#4{|սKe;.ATr%rZ*M;v% s^ 69&ێ/۽{iF)S إW3yr:},ʼnGJi摣i?{% 7uN%JH]{.$2e3V mwWJΕSmqzrYZ={f1jmi޻GcDgϝ}oڸ>kS֖TgՎsqeYNj$},4(y許Cn"{z ?-Pd蝻woj t?{CP-BxoڲOhrC_z?<K  !"4];H J1@肄.*ʧtHW*{ $Ԅ}Δ-w\?{ξ73qo,]4oNH^K߭'Jc5"44TO2M߾c}4"kGImvK/\P.d]zMWm?6%BPמ 5ujN횲GNZ]?É1^EP>>22lErguԒmFϩZy[˽oW7WIwd}=뵧^=xB=ui/h{]R[/]=_޼JZ:wǕK na0@<"Erٰige6i40 1S};0P^ѽQ+4PQS%˓./C6hC5Ux/Xt|4g̐KRrO..N7&[L_Fcmẛ6o.O{#^ oϷ_/V@֮!ΟoZeos1^)xVvm,_PBO9⿼|au%Ot:4eh_\mNkX++=y#GSmk=Z[oAO sWދЛWF뷵2`-z>nil{:wղfd9:߂+Zt0c t78Xwbd<)'ɿdN**_PXX>r>ĴdMS9EoG.}z7((jyY=/ˏC~F*2=D>&|lp|{\z`HԚ5iD:v /3hgn<)/_RPP|1Y2g~]/kpݻ/Ԗ_'4<fϣq~~L37ܹwW^l&<޸ ShT >y灊i>{PVͩeێCܸyx.!sNy摿o ʕ qhbO^^p#= ^_ {70I-/ҨsZk#c r^dd{98OEp֓WFZۡ7o{5=GѺv\ w/8=.ku1:=&C<`,)g_%QMg=%]#nPp@l0eit+ֽkgu8]9zk'M| mw#ǕKm90 ^+ISPU%reK_0![Pp'wni.V^k-._gϞn*z`ҡƑiCpc5`\&_dיv!_d|s Gt;v!~&ȄءOd8iߛ?:wE_.F Cop]Х\4$1 r·m:PaV9ܽwҔޮ={n33.ܫeNԮGr :Uۦ}~ki9-zz\r;]Nrϝ]ՖVf7F꺑c YB ={2^2`-n*kF#h1RWko[oKa+Z]o!w>W VD˾-ZbȞra䜪'׮Qz<844ʗ+k9SzmW§~=xif9LR,YR|ussiyc-.=:"{pbނEtMƈ͛ЉS7CUL]""a0N3M6߱Ժ}g޻ 0h7jkD 9v{}Ƿ;'=cGy12Ī]ǏZ-o_~Koնߤr TByjު,sA\2d٧<{_#*Cvx @ނ|?du|*ժY3> *C-"s81 9ȽҧW=7}Drrq>͟`jWK?pNOW]>M'_ͯZmY2kk1R׍ fSz +*V.=e7#uE[y_h;)`CdZ]mWc Ք7իV|P냑s6r)4+TRHѻ^[Ud9#͘e9Ľ~ ؼ|G{%v[\{Υyu5s4.9Zy(3ML҉'^d; Z :w iԬ5} qoby3) Cq Ct`+ pb81N @' C!Aw&-ϑ!6Z.Xlzߑ[M ˮ]q  US򦅋Dı)!H5j֚8h.9J/_rH:y}K~Mo&y(G̽*W@6̙ =G7n"ԩ ޼eTbEyiOԮGRwքɟ?QX|\)Eږx (Goޗp$88XYgE*T 8ں}RS >|*yzxD[K pP?fjO+?>]K=IRt秵S>{Eʘ1# ?nV$QϞGjymy'IWl-{[_-u;lA2f\t K?A ԣMG`ڕ+% ͙M_-Y#?IY6#m\R.{(mڸykӂ3)M4ra7vܶIzeɜYz&qԶcQS{]{ќeD2| K6th%pNeԻg7ʔIz8͛{$@ڥc{s({v4l@ ZNcGSƌ;yr93az:=ynݺ%= 98ֿO/{CNږAːJZu;}Ple|qЅ?ÁZ><+niUzdEMŽ 9u̖}0}\xQ5?֩E_,YJ_"y?vq9Yb֔ԧ`:ǟF'7i# o۾ZhfE^NO-J-L~6~ڶ<.juP-zF-`;Cܫ/ CϜ ܡCP?^yBw9M,X gJ7n?ˁI J)ZgwPhh_\ʖ5chK&O!uwPQzUHa?otiODy[l&ȲaZ+nQ pI.[F^y'>SpDԪjehG!z!q0&|/C%Xg^675"y7h{O{ wV%6qۖa~/^XͫɓT"{^x=\Q6VH8E/`===LPP cܛ2\72o&|=-^ CYǮ=,sWIGdA)pza+NMA[5F#GH,,XgLkׯS9cv1o<[A24d2-?IիV_=8ᨬLv2 4F O|k\\{J|C?ؓujפ9r<̶fjs) SM"9/G}>Ӎ{2~Q%OYR6V[c;o@ iƽu8x]>м eH_|y|⻅̞K`ϳaƦU\9eX))KԱ}K5ESテdΞ;ow+sqRx6C07[{=Fo/;SC{orЗrEHa m:H0s)];SʙC~GTVEnaO~J0߼:5,kӡ |>RS[-v4id96_?YzivDTZeLo#fz,V 3|ktI]\V^2џǾQ&-e.3cd'#:~DjySr=*W 7hު=5hBz5ic~{ICu]`gNj=AD7໗/䇩gcm5='ӧW4b *Q^z) ||WVj֡w[&-<ݻA2G.\-T֫!u.>5SIFyXgE$8ѐӤWÀ+m4~"NF;j#<>e3z5970z踧#w۫Q6V3R.~?NW\$9x.L#6.o<iܐIUUW 8wy<zó *y~UpNıp5ƟoD-tw]{СGY!J/_Xk};JfioewHT@.qu>s1cv|oVqD{(ϓ i,ؐ Y;vĶ{{%iY;…Kyjy2ex{P"Zs˗Tpߴ\\\hÚ"EXv_Q)K8PIJR&߿9b{7njN#QK[#s{vKecW]… ٽ_I%K@;",͚;v)O\TPAyoy *Y8 4riu]jjU*w:Ylʭ|לT=}!}oopsUuԞ&NF=M9g#Qeߧw'K/URKHE.'ϝU %I$AeK/ŋӰ(ͷu6RPpyzxR}ƽ[8qxy~wIYE=e*K:vݏcٞQÇRԩT뜽A8s98Eyȑ=wjm[\ "mi}:i|8[+c=kir|'je16(58uUwb=CKii_dÖۣߵ/-_}FOS07ML RM{Q.NrA6'ɷ`T6ϩi<޴e+Dm:t:_{|*yzxNrss CGWrem]Z=G7n"ԩYE_.+M[~v>EKiOˏH;v Ȫ>%oDG̽I*W@6̙4?g4qQL7dT:eh92 [0Y۵w߯A7kUeKwtc\΃2V ,H;H&NǟdLO&j.v>s1h㠕-FCʢ-O5Zeeמ}4gtٿ2| wtD x;Yk[C{PyEkr;k9Pm-ϭ;'z#k֠;v\9sRҀ}8׋ʕ*| Ij.ύ]b<<, C^^^r!Cq5Kvw6)~)ʐ!=ժQ|!+WN_yB~(yrӠ4>lzZ,_ٳeU92Pf|L+nQs+[|QK־(fLi&I6Stwпȃ/BZ/+#ӛ渨KzAf%֩%rYsd<>zHo.ݺtdm{-#>_Էlۑ*UCՖ`+ʕoҢ-M<<)"E#e86{}VhhMۤ7mZǙo5H_ d혮nrl~=uS|c㝑YOYVYƁiǢ ǻQv{yEk6i`ZvMY#Gu;pt#I I"46l,slٺk37H~(!lh{h`e(M!KP"y䦥K/RZU<"b\w[Js $u!t颼47yIsJY&#qgwG6o Rr!}.~j%O̮9rSRE(rMSD1Юmu*T@s4E]S2 ISY vXIO2p^kۣn)QƸg2OdO(=}#~[Z^;jt#E#e86ꓛczӦ83pXU>zY7~ܼVdev>s1H;v #iS?Վ{h Sٹ#(lx#n9htl3f9PS G;5iD:va=ϜsSixq/je{6!Zi|_C{1o"@m|y҄q~Ry2g,4s+Ychkoqв dH oO/r`ߧd2}pw䉱.;R޼V }P44]=~Xd#\LPW)%5ki{z覫n)Q~Q ׯEi=uS{p~qp{pOkׯS9c+QTuက}b'˦mSx@lnj+yL{u)q^v4r썾A]æ5(Co=hv R8=El;3`x/JWR溫Yy^li @F eɝ[&75V^klU+/<$X"2O>e|W^M<1;]ޑ&9<uիTf5}>g v꒞r`g$AC]&K4ZKmjۣn-Qx[*yTAWCܡ]g.7/I,rz:J/&S0]wo;[plZqsr3;PmӶSO=ꦞu1ݞrÑiV;iD?_k΋~=cΜ>b/?{4r^:4poy'(y}zn-/b#Usk4q[O ;wѢ%hav8y9](Q!݃)ty?ѽ~jٶcm$!AG\lMϩM.t._Bc'wæTzmiڒ̎zd1^?ij#1CDD۰Q)]mC e|ksɷ`0SY%7nޢ.{Scwm7p(U!kԌ^wZu՗֪K5>l@C7A߉SI/)7Sǰ04I'>a҅-q*I$QPK+ԿH$uq69:ObtD]Nuִ(OTliy~Yԭ'M̝E;n9ӨZʉ8Xӧc?Avn3>W]{^˗/i8ȘF}|vG ٳY\'c'P֬Yh 4vZvڣݡOРaSUiuvwԵSʖ5k#w9ymԴqCy|Oա_wE *|PNuw$Ola^έ [b[aTnjҢ kMCKJ iv^UkWԪ]gpБԹ[/۠ y4]{0zx2mF_Hv]nC7AzDK}M^2{0YzTM߻~ㆤzԢM(ۿiV7Hzl)?qoi KaS /vMkדaTgVjҩ=Tַu˨卭\h{keUm}Lh^߆gԼu{yg3u>-&0#rm-ֶ>~j:sJ^^F'NeJo.籱jd)jŋj:jբi3fQ㡃);y5ujʗ7//[ky>P;hI,JG E Sdd-R.]b( \VwKR?rqܼM*5}>g&WDg ]ҕ/;ԢYGZgT߻.Q J劔!Cz9DZۿA|{Zܮ_cZ4id⯷38(iҤGd[6UkYD.´FTPArXLZ5n4|@*QlRR>8z[m}j4=1édb SHpQ ƽv+ٳV{+S6IFOtm{?+Q|5URhsp/1mڼUU+7`9@"Erذi3_$mٺMw3nqÕݘ7_޹+ KkA /L濹)7ƿ>5(( Aj˺s/Wy{Gg?5b2\{8DZy9sZ]ѻ{p:8恵r'Onպn2W.tmMܛ#]ڴ?8ɜb`QӲ/8; m칺fR;IuA4sTCǙd]{.>+{~gϣ+ݺvt_&7{zP;h#?K -TJ%)+&5ڵn)AݴJ}u=&9=cy`jUb>&|l:?9YkG[no{j;Qg:C"g#.:qPW<7ͿZ[ÿ.O'ˏ|ܸZRC/Cxȍ?s#?z k{* HSc{hpDZ揞ZZyk~'#h?}cu |yަ{`˶{j4e>яg\ҳxcjb񟤬͞1]uuޛJ/FիUQǁPǏ]pIoW\֩MGnǭCon޼%sJ;(sϏ U|mcGTV`D XAC1Q{C6.HAjG[ٞSwӒAQ3 9SĒٳQh/aN7%<|{:9vL֮(shEÊVQʕ֘~ /\o)^IwThe!4x؆"{f5_xp4L|4y[Ϟ;o);]iނ< Ȳٔ_bÖYkO+oY >T.R.Zb(s=yFZ]1R^t ^juH>syiٕٜ&Glkk;yrիѤ_^2ӂ/7^PsGʇ# s7`b.C>\'/$<ГORƌA'JW]~=pޛZZxY>NsŨvvjGZw'\m)%WX>*=ʔ.ͽ<7L~sq]:ej\.(ml s=Qq}^Skϩb8CwT/_]?m@7q$D~4<7Jt7jkD ygc~ߧL^Gy;)`sbԼU{YGCVLZ4o"wRkȺv(7Zബ\V^4~ i#+\˻ ogrӬu{% hwՔ<6iI͘6ba$RK|1lLe{~2w[]884)t7jU*ӜsXUIKt!Am9lWRb:ܸytB[62Zb=ZsxOEyGI^?B{(3w_x+FſjDSlY!<m\esl!upގ>C!`0C!pb81N @' C uڃ>",,F:Q6皟iԬ5?p sVF 3 QI,=}{"E ZK*RPɟ;v҅ h?k-O7d(7SYW>%/>0%ᄁE>K-c:29J }IoJ@[}TaZuiެTDqYVSf//ۡ'/mq{Zl߼uN ҥMKڴ}jۣ?iܙ&MA;vnDOPy']\М hՒQz3?q6nVҦMCnߖulٺϞ!N}ЧC(((nO5W… *$AkWңǏw߁^M7*g ۰q l e˚U4O]7Sd OJÇ &kj82dLN磛nSێ]JJ$zh/(?ʟ//L0)C80*/GOP`r#G}}ՕRN%=N9K_=ym(Yu6-~)ʐ!=ժQ]zrI\( 4Y3Rz޴soTf%֩%h$}&T $M2̟+v G{#eܞ*_<ܸO"E I3{@|q{M/yoT(}zw(A$$-]4_V6iцjTJս2wIc<^9^pjOd7| wOwLʥ}̟{Ѧ[%00/]B^MxxvWFʸ]yQӹKgԝ?F@| @R A<==厩<@!<4|y҄q~S)`-XH y"ᐗ._0gϞZ3{]tf5Sɐđ Z}jAp>dyrca·y^8b}F={6{/),,\|zGmL%7H('v(7]\V^2џ{R&-q6r&Ǹ.0F6h܂.^L1&#nuŋ-#Ծr TByjު짃PF>7hݾ3uݏr)u^ػ>[= N׮S]&JR*d@=cmpc+qTp$0#62 !QgH@/Py('ʃyBwޥ7oП9sQB(eT$p*I"C ^+G"W zΜ=K.]SѢE)9ӳgS… ';T`ArA@cһWE)#\y&oY1 poÇ+WNz"449BO>ʣ7 )!` $h?}ܹsSQ5(WΜRxH@H={JRJQbŐ!0ŋRG  |>,s}d8\޼y@2w @HΝ=K]]bUťqyHd^tʗ/̀XW\9p@ $8>M}Ï˗ӄ ʕ+<0o ?_>:s 2$p+rU/^7S"EtU`Eҵ˗ 57$8@rmԩSl| 6j֚8(wڃ>u),,FQZtjݾ|u.o<=(P) M2d$$AAw)[֬v:uΝ;Sܹ\Zr:cʐ!U\>:H:AE;{=HB6};m,ڳU6\\7;v҅ hˆՔ"E wf˖޽KٳgGE= Ayyzz:d]xYԭ'M̝E;n9ӨZʆAr.y$ͻ_I=m_zڭ[|SԿOo*X fܽΚ!;w? +WK3 1Z|{ui(YF5\&4 zBl] N282{yY]&O\(㡪ٳeэ75́:Ld=͕Gr˯UҒ&MjܑEɓ''A=o Yr9:<`^Uu7c\1%|NғV@:rwח\])uT4j}C6j6]|v}kmz@j$KFaaa*U*;O<ҦQ̖MR'$ ѥWt A͘!Ckǜ\;(ZpL9ק`2?ի[̦h2)E(Ҽ]3`A;zx7wt;0PWC[Q ;S AMBBB%g!~3{h7a -[@2OAQS&sls{9fy85|ϞQzuChEԽW?;}D 4Het#mP e9ӧd/q66j;Ia%{: ;v,ܹS73קѷ%t ^l.^{˝j2ɲ|~]l4[a#Rre.]<eNw=-h1*W.Qs1 P  W Ȯ]nݾ-߹UX].+[.<}*7`!*XkhF-3ݸy .l:gI*iNtoi՚u<,2OOmZmZQ ygC89֎umtM :W' e V?pOA3-]#mFB@Kܝsk74枼^is<7s8x9?3L%TO{b{w=~Pɺ 14y\Or^|)>}]_|=ǹ -@5s#m2~1ͬI+3[oUt+5>༗OMs;УQ '[YP;o@f5MOR'(+IMU+ط\pZ%͛;L__|nZY+I20DI-[@kCk|xxoVWh,Xlx`` F3崯\]]ۣqO'NĶ>y@K¥Kq74 sԩ(LNFn, b2Y"v188Aqܹٽ,{gMt)={⟯O M:ɓwhoo @Kvۚw=3˗亲rJMt1%C,]c R*]]k׮Xja^ B닁c֦ahukO#I'u)ԕjMJPOHZB X[,SdA}.U\`ph- }bm7=J!u_5(*FO c|$dt8㭥,^>s%p}?{#V8 Z>ō{;Y>PIȺy|vi*~}P9Џ:ȃr u♳xo3.ɊKoK#Y.II^ ii)rll Au=GEh/P,vby_=sSi ylljBdJRB(/cX%oi`%C.za:&ORZBٰ*B?kT 0:!5'tO ?cO^̓x%{tNIRib3h(ۼX"+H(<~@Nؽ e|m͙TVj*2>}2'Q5@B_jFHƅ"+g W8~D'J,ipPRim.1HܦZI]8W. +C"mkmQWԘ΃^12Kؙ9d |*lA]>⡁R֫U$He;3]ty8Qs{ !Ke~_wи.⫻gdhXЃ@o\0]L>+72֨@U³3U=L,U6v./_ܡi㷖h_V(]c;nʷѰv״f7Br {v,̼ﮃT f;'I:fkBRR~#LUQ&g2+B$[E!`fɘLid[ԡN#aK\ҩDTH[`MTtd1kUtC1wò{k'If 4"NgĮH |Z@$Ya2n8N3~azxtH&qH5H*z~7xuŊ2I<>ެlAMĢF:25$C:3Uj 0XKBTi+5oV`o )& oX΍3`LҋOqgPSYsM$8S#@&.kB2?XEv-ZBrXizs*e 8 } V!D2_!Enj1vS۱,L1V~++T t KV*⭹2*u'#rܦ} Iר'j\'pzg 5k{d]i֮A#(&aPQ7%CcWc+, eԛ:~V?aBtt zE6C ף EhKB*U:b1W j_Ɏ0Vş?"è@ߙ+xW!z7*ȑZy,mx#bzV0ghHzc=Ûr2թNyr$kBT*[s,6(>RDOߺ렗VC 泵6C/eL>wN-ǖ$; WްWZ$1 ˱Yf;ߤlRqg(6.qax9tp΋i#/536J;۲\#4H^#~%i_rѨr8QtBv @z7'꾨ᶝ${׊0\lcf煞c)TM{:;Yr [^pbF5ӬSWJ3 ,ьKl_ ϱlapf&co9VqIUzXNՈ`BV10"BZn,v`z[1A|~sQDzQY?| :b[mGwfVcjgn-ʉ7 ~[>U7/aT"VvCV${N ?t'_AyqclMBk8$4:nfa{߁TY7CSq2Gh9$c@s-}yy>=K$nzH7;Ɯ6Hb}mΟ8^yy:n"w)1AX ٳ&|DP'!`i!@&t}eA#6ҍ>dёjFPTJ|"И@w3DEJK@ \DtϝN1 oJ9Cuu07@(Ev=8 ?[,eBqk&:(~Ii%$/AS2:]3uT}?%ߢޮ6<>kU?#URB 1:‰,--3KC 6 ~p ; ͻ~^)sJÇOܩo_`hxe'&NBzE&ށ:Iucqi׃ E>JFj-s7ڙ"K Q;ƪF+QZI\jؠ>ʖJd!`ͮOuz^-H4_W~xMSX]FT1D&z2%ް 0y/;"ž@A\6KjQ<Ѽ$+$=C B:& e|)mPLDR<2u P]=yXZ[Yٳ⩟§~G3NOjedF㚽*T۲䍒*$Ͻe,/@Vc:ݰ3{YKji쏿m3qpfݠMzR(H8ƑǥU,PoW0 I-ˊmb!yڧxl̝c"jFY/4 x;JM`VJIVݼܮbXtA.VW}g^(Wu071EO{Sm-F{KbjY(TsbyQk@f{B w>&+ i%U}aνn)"mv;lH$~˛3hө~ EU6A-cSx.V,Q tktFe.JƳ>j5HTebF-̖'v1*-jHB)+7Q-7ލf6Y :<ۦͣdK%H$u= *Nktx_Zo". kV.@["ğ~τ^َG";pO]mE4|K/dj/O;J$ |n sUKb#}$d`j*?j5먷+՝K#5%bsQi6;4G5/P`Fbȇ?H/R$R4._ӯCAѬ CTlEz)tFCynWan" |ק:xdc=[ۃ ^ʁcQ-U|d3CZOCrS'@8!sy'p}~&ΓbwINBnWaőHurp1E<7/@ZX iqve\6b@9RC^KmݶTknI{~ UkJtc8[,Kvg[c$vw©pq7GAjIbc’ 6C:C@w?s:ǃ zuG&fs3<. +9ݾ-.\Ͽ:/eQ:13p"Gjߗ:qkO` x.,g~n͢q㣜"5˦x7-Rpj NXk}|Y^O"Kb25 #:>s+y+nC8t!\8 ~SKbbP]-QuQtuqt'S (LUۣa,xي .s6$,5ʓH&]-Q,P7n!!|T" χp+++bq.RDݨ(GAT9 5,t6׾R1Ko\8t*1'U!ÚX8qN;GD)T=Irtg7THO%bi;h^l^8*ϣ-plX`UX,nXb KVh̙%gN [o(xc7P8n%?R^R{jxK/nͣh"=MooUeaznGvgpW]\,}ey#V׋ oWfj1mmbu-K;~mk7vj?w" 6͕ ^LE DLmX£,WuAbJ利|-pNDsn˴ 5>3!ІY&P.G%é<^ ,6=#<@Dp洳jiݤػ8=~%.@v|˙ϟ}_} })5 yCzuz؏Bã11uׇ 92Hȱ &*"j KȆS' zw<󹙠X1\D$DE@6 =X<%DddR)'Ud㜞{g N0Im׋jUt8z2 euY%_|^n8/ W-Q('AzB $#quuz蚠ZTW|빇EH$E IMvZpCc D|~f Æ<{JJ!O')R#(Cp#dC%2m:@ԨV}}X * ;Ox̉-4U, fdkn ~:jj患-%T*p<XY~ް\ܥٮz"9(͗=n(D mm@n Vľ[j܅y.܅nzלJ22#6ڸ=>{ ̅8bK@q'R&uSKJ!TFUf,oj;yBp S87'kVUySnIa gE62J V*ZQlc O 1[˓q-v\pX ===@Mv5@8Wgqx ̋!RT#GǙ/’}d"G\]A_O/2(Rp."P2sL2gРz8?6T‘Cǰ8 GQY?<#I!bl/a=SN=4d`{Ȏ25vLY4t"a"+!]]׿uB!|N^xpQ(\܊qB bpbu[\Aӡ%8r2չUĂ0^(d夹_(O fp Z%+$TIE㢐b7 txM#©!p!WJsGXqGDžHt,FCI"9Oɓ";B%3qͽ+48.p>?q#Ǐ;jK 2cIls"DV#E:8H43zmGizmd,.*)D :bDԬ^FrHbqzJ|.VN\:<8Lo~h T= ?]?;FLx1<Pn'6Y-fU=H]<baeH2x %99f$tYjv *]gd[ba 3B5j&H-!W9 #m~N?0|ED{QŁ{P,s=<|ƖV75t㘞M/HQ/Q1"9 ɮsr;27c<#݁C#cDtDժX#ՙ?z6 գ+tGvH4 }(5x~"_a{i d܈^MSK"be~U"MAm "HtbtC#Bb%ˮeyH$EX+ :H%E"~Q\>H( CKkX]`bT):]rrQo bmmIď9 &2YQsˤmA`PDy'ԣ9!Pļr4V4+Anw3s[@vz"h,IFF*;+0YU-#S(#@?o]T,P=p[D9O`k8r) t혰5B`s5DHHR0+u)h zL$+#"[YEH%JA,B% JR;;;Q&b"n9'R-#{s]k5333"*쬘H$*LMBP` * r} b["^Kl caR_ EA19X/.㰍<.Z$">ҚP$o_[9aq8eVqNs֯\F<֊{P&˗D?HF$`kA(kL/ԩS$uPXϬ`| MN @g,so]D0(: Qn7لmpA=qv-بz^\)2^Xmjo>zǏp 9YQϜuMiI&&pK-{'|qr8J~ƪNg$kBwi۵!k.Gêo P F 27r|asrn+t5Gu3mHy۲G8> =GVA ]CF%T\+\ ##dA;_} < NNb\'?)\8xHdC;.@@cCg-&G|rb 5kdIDi\x %a"*0+fVQ(SGO<9^o"}ya2hXt] 0ztMNۍng8h4p4r[]Ď%;7['dEc7d*;ݽovUc5==-˟[ L\C8Lqp.^8`G:;)RANaŚxW Pe/珅IՆpL<::rnsm]8%"%G>$m;`Omn81}mXh/^6ymRB­Iyuwd0k5g Ti-St D)a7ݢw$1%WMd+:5/SlDϟ9}ţb.WfWVUU,ePvWK )l3)U{z,,CdO| ~MuC?Q +Ry1xW_`EBX;[ ѻ{zH@BHXJD(\D(U h$4'vܔ9cuݣa0# )A!]q %1]Z["WoDUH"J9,M%G?|&B/Z^P,!L;)$,`Pή:,1*Dt>gY~Cp1/k& I檨NUv䇧_@U 0ףX8z,  _'Fj,bz}! =2;X"<Fxm*) ?* $)I"VM,Q!+"Z;r >.\'GlfFx9E6Xɵm| 6{M"hD}[*J*$Iڸ']~lw@zBIJ>O{9 m]8]5ñ)uR>jn}m/I+o] ~@ r] ŢpI1\':_pjɐgurytT)Rz+fE_^\!]AT*:|ͺ ">+WyXd0s2Av&jF1mTgI82}Գ0WWNt7=2VBA w'ŷyd LD :P"^ҒʖFApkd"Q"a U+U^y҉( 9y\{f%bKFl _ ֑F$@@XB7arޚ`W'zi#JvR=j9/&QC%;$[çaPSýX ™YZF#/Fz"ex A6+Z_IxHvwA%bnYA`!< &ļQϖIu} g/E"9h%/c0{ulVT2I026I}dxkdGCHX pKRe2 %- $N_ɀeiOGX'alZFz("#Hz'C2IFP䎶t7Omqf]W9k/w\ mW ns%Mlmii].К .A Wޒ G3 x\۠:+ճ `tDyO׵D~nJ;\6:ewm}b́Ʃ)| _ 3X u1,̡i+M3Hz L+9/<,:]ĕ w`"Wkkze\_ _$ "Չp˫< ><&Vp?KW琌0pG_y|g}էy8AǏǹsp1ݱ{O -؉{E`ppHqTERС"U$m˫ Hd XzxRe/)'rHh` (1) nBH%}D<2D1iR^Dm66K z<EQV &f j;iO\}M%pH%; ; {J_\\\쌙τ.Bب鷯$M^YYY|1qNR78Sf={wmw % \VFlFDW4H;so@$ { V@ eJF{NDܣ}}J= _k|Gm 7&=Wzy)b@׸2@n68rQfIU@mc' oThL;8\jY6Zhul_6i~&QV.@&@Ks;^I DAr?@;* $c (;H}el`&pbH0tiߗ rqvG@rSPŽ ~?m{[Amnysg۸m.@Z#d& IENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-Mac.png0000644000076500000000000052646013242301265023355 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<IDATxչ3V]{{ \liBrI% $77B!=@zrH.ᣓLtJqwo_oΙiX93h0 B!B!Bz'/!B!B!B!B!bhB!B!ҋH!B!BH/ !B!B!B!B!bhB!B!ҋH!B!BH/ !B!B!B!B!bhB!B!ҋH!B!BH/ !B!B!B!B!bhB!B!ҋH!B!BH/ !B!B!B!B!bhB!B!ҋH!B!BH/ !B!B!B!B!bhB!B!ҋH!B!BH/ !B!B!B!B!bhB!B!ҋH!B!BH/ !B!B!B!B!bhB!B!ҋH!B!BH/ !B!B!B!B!bhB!B!ҋH!B!BH/ !B!B!B!B!bhB!B!ҋH!B!BH/ !B!B!B!B!bhB!B!ҋ#!/B%% B!t3/bȄ !?4!B!1BchruB!r$0 !_I!B! !B!B} AB4 9N!BI4CMm'䈁 !=ہcB!BzqN3n !gG{(A!B!4 hV/!B!=CǠHHHHvvS}~B!BȑGOv]?@B @Bޡz!B!ɅM^ @Bc:D/B!``]>hR4 ZgSzqB!һSatC"]5i4 Uf/ B!UEϥHHh;t0j !B!wܓtm2 ,_L5itoG+bB@ÐB!Cw ->щrFm HH7A;jD!B!EgP._B;cd$ @BA/]@!B}ctES& !.hRX'י:х̄%B!#}E"i hRxWhYqw|p#B!ţDe5 ^li> @Ψb ;E}m5$B!Oveٞ$X $}NVHg/kD!B)B"Xeud& !}a#+n(Y.6֗B!BrFی]8FwSabz(r̿|υk`Ŗ%B!P3Ɵn/kɌр$}/r(̿l3LBl{{B!B>F 1=K\b5#i$H]5#O"?0\r|:!ƗB!0 Cb{M^>}CP,#Pw繶!K]$}H7oؕ? 5oX0H$ ~ !B!% -3zeHH@lϋن.K xF#߼HLt\Gۊ10߲uۿ+#_LB!BHc߾}O0Fi+1 Hp0+,ug?MMͼp8WB!>!9֝\-= ]=HH;7[_50:zD!B+{ X56r} ܟo!}/ :Y3_&7k,zb2׭>&9@WWh`Kc4<JU.uyնLm;tN=מ~A|BH1V,V !.=C8E̿B BچN!$rľy Ptbg~,1۷oϟw;Sr{AkG[64? R'L*J4xNef}jk{mmh\cgUyF{ U( Xk 'Ԉi|B<ǮAP7v,Lp~v..|/_ gZ>b/⭍a*p̜S1gh2m؎%waqǠߓҷe[0f1zF >~7tЉu ezh[zۊoPȑ #I_LfB\K<kb?imAV̒QQ`E%澽fק;4o=}(.ה(-ov$ܖ?rOFILl^ K+Q[VGfώ>aİW?w36*g3;wZ0m$?zۜؿ߾kxL9BԬ|?Shy)U ?:|_R;w~oj$EVWgtxN\tF|tH !g{^h_Ǵ.߯Goȿt.r̀V]4e#g<{ȿgdt6OT;Aby[T@E9O$3kuM-k=g|gBMO!k~|xdֶmu-+R&^ILLQԱK*ѱwc|ܑ2jZ\øgcgc[Rx|=7˿>>2EC]D y_'BvcCz x Hx:S("C:柑nLYV^<^:査Ny&g02r~aWO7*i4wW Ceٳ;ҧ1 zB@2*/0h"nq翍'nWOW{=^-4w-?עʟ[3??8[otGǯ~VUx_ \{ص?xKPij[?:9:~F-y&}.22s5=EQj[exSM_? ?x٘^WTd[!> |f_w4I ͝JwY/QJ1b`za8 I4vT" V\ղ@5/vXߛmPV7T ?ۧ퓞C e yxQyڀ ?ow}0w9]ś  W[@ݸ? ۿڻ?g+Bxp5 ϡʬ_hق~n ݼ{厯`cܸ]xo0zVM𢁈ڀ=nLZ{(= F0k 8=cEz4I_tmnh37}>B9ePΚ}O-GԾLSC P+C&? h0-0tqkgr;oͭYS(=*H$P: K< 1iD\2eq _vaΈj $~(-o zOfUC>sh5G @B!YE׻j2 :BtkaP*ᇊ}қ#6TW_U ?!N lG< oV ?TaE9h1C!5r!˿Cae-Bͥ|00|8oag?*;d]F G yvk s~pm@ bŃ?M>ݎ~oFrgݵ5wbZ|ce#Br0h> @[;-}ut>f:BO?ʹ&Sf=Z?mzQSTEz4 mmlGͮ:R~ujnKS?'Ԩ2IE-(ۯ]\֟F"Buٗ ZK_ΩKFtp~[⿯1ycO@Yx%ku#pRk׫f$۫!;z'p)7ÁS?_{48go~һk#H!}aЕq$3.P>v׮V7e"i 3Nh\o8gU_e[iH4m~vTߌT<+M@Q(ͿM,U7}2*=ظu v!b۲@pfX0KDvKޏ,+EYjM-ݎq0%<>hn ӆ7l!q[Bk1+|^~ŷyQnĢ~/Ct:<ŷ8%ϵԽG觎ӊw̃e6B=[1MBNĐ^ @;B#0Wѩe#k!zQ+#piRedYtPȰc//+#pnPetlG?Dl2ռ,#$u2,}8(Qe* %|YG\|0bfޓT{o4=Kpoo ì€WP1D\wq?2OFeWϺ ?WRQCN?//NTo8uh=a L04;pw2ݐv=}N ~)[ }80˵,^37}?;+>:/6ٕ~{i!\ cVc 6}:"3f[_1md|oë- ޴TīOFiW=X6őjlt̬YG!+Db4/|\||/"I@}%nȗe>o>^_<]g%By ?HyB$G}LaDU'gp΂۲{̷9:O0%D'2BͿbBݓH/~9\6RFR-݁4B-Bz ~?cJ$l$Qk#{K>%_QvO(h]B!w_VHlrEv6Q|^#>`Do{2p͚5*B G&TW̫ux+>xD*0~x @Bw&Eܼy38!B!- pdyLd "_ZG 1SH8ާzezꩧzꩧzw}{ ff@ !},&AHGTd;HawWtu"SO=SO=SO=G>< N$a2:گL@A:=nw]Ng‚W6 SO=SO=SO=G_!Ơc# Æ(++iίaaFƯkSO=SO=SO=G>۽2F `kf39_ Sh7_G&(y!1gLuK SO=SO=SO p{D{$ !,+s/d/iH_Oы,SO=SO=SO/~$W!/yI!8fQY|/ofŝ]!<&SdR@#P\&ԕӟ5չ[ ^~J@scш aտԛǩ'w`NlC4?U5W @қ;jIi2]tiRiҪrv'?y &T"n6=nzktEsnЂhlJ~!1%t"ݮ?B!BHwޫ9F&>p\uw5/H KLzy&2;'z2-BBOKkMAMYh.8z _ >sKܧk~MC+pх3- sh[xk1+3P6,cg𨡿L?]'oܳ ՄDG0XO>~tLT0tVso`ۖ)/lQ;/" &RCiB!r(rM_3r4%Y^ @B ruZ:|2yX{=jfv`EE 据K[7 1hPŽ3&xhb5|qLx=~gt{I.UĒ5!4$Jш ̲C vhL>gS >ǎC}UP?W*?j SO=SO=S_hxt!4:Xϖ#p'H*T/_+DuG"e9}"eN9'\fWpҹ*3ی;)Oi8iT W俸Kk`2I&8 k}ET'exKw߷L?~1mOJ K!B@n9#K=4I kNW6[`fLHYND_(?9#=~VuрʂM1<C7l߼ϯ}2SWa-EBx255W>Qj+6^zQZk&ϊGXgl5\)`e9=W^dJnC5zꩧzꩧPF>Bz4I_@tSَ58wvmiY^54WK~}I_QKr8nT Nͣmk ṷC/5&AUu*Ue⏆xx+5xѠ~Kƍ@WSzN䟓7!:<@KB7+XF_(f=:*nE i:);zꩧzꩧz/tG&Q633;j@ҫHH.,_d)̲<<\yuˌh~ې>W` c_Sep]ٔiv_*o]xfyZ~ F2:#ۡ~݅hm ܷv ߹|쨿'#a*RXIzꩧzꩧpyԩu媃IBH !u>D]2ch?TyY#s'mu&}SU;s-1\7{?ko\{y6,\FDGuUCz k>)0Mxh?'GuUI3r\ve^ꩧzꩧzꩧ 5ǟC|E#Ć ySs:-sXoL?G% jmZ!6~ |Tav !"4ꂘx4k:۴ o%|ۯTE:d_܎SƢ^cw܌?9W:sťCO~k`L<]Mwܑ$SO=SO(X"[M@1H 4 o5dQ9 HOx\C'Ѳ {NiHst#P3 &h݉j>Ou):mހz {g7Vnh GR윬˘ ż0;굑F()Az]^#*u*ڷ,TzC6kU%ʇ`cp$ǖzꩧzꩧH}J   b ,szlUд!#H2rPs+:RC~)`z( OS2{cJQ^R"v'-1Fa~`Xt?P9":~f7߼b)/a& Ld8{jn}44agy#WTD>^9n%2V{z"<מ_?FKn?mmI<'>^=olF4{j^!5ť_ "Pjھ(˾خk!Br+HG]w=Q!4 )ʵMѡl6]_2ï{K#+e9۵4^ Fe~:<_!>֟ݞvo,'DZ=\6K~fQ wWoZ#WgM_J\t\d |wPFym،//]|xC+PVDž i2I55 5W^VGۊ" +/텈4Oc(vMLgH3Rv曫rmĥS^ƼS"lUW:0v|QK3G=SO=SO}W[eKᾄ @B:N?_L|wjѕ قݑ~"5 z䜃ejqB֣(H"#DL+E0cK1$FN~8^svI>dbne4./n'qP)> {ķalc1w8v¬)ہ'4Taj.2۶DavW&_Ǘ/ZO~r*.:礂j7z8~KgXW69S, |"KvX8aAkH.c}nҸ1pmx̲jiưm oJ1@@󨑻ydi&O?9[1Ѱ?XA;a(?-S/=go/;m7\!/-kkL?eushWog=̫ޣ+t_\OէMPiZeDI3 g6+i0v(VW[]Kd6cǞ:l/1ހHԪ4C S[FzG=SO=S+&Q=у 9"HHNtN;Jc/z,Vh̙1 o,{'xݫˇySq)UkO/}+xǩp7b'NATyoI=*VH+!w -m֫f⌓ =Tֵ"jqaqoKw߃/]ҌSI?װ}6̛u\k7g OWǐfTɤ7k{˔oZ6uK3u[VyVLGSeMοvB!G}Zy2ak][;bӑ9sz|~~0_`d$W0mnAR淏05` jb(mC4y{ 5P2M~n?~^5W pR] *32R~шZ4c_傑ozyJժnf2!EªA>% s||TsO#57ٵ|Ö%_zf]wY?)7R9e*8XLy>{4t XWCǏ<;6[_M0;6Tci+¢x mM(UX.' i Y; |y NDmUލ(+Jzꩧzꩧ/tdUwܫg`BSkE3Rs K묻qkn ꖑ"snxѺ=tX7y|Qn.BqpOѷ@',̐ UR_C<.#`zk?y=LcŽpw*c$-%p.2Njj=))Bb,MEM;B=/fP;GYs%#, @1ydw :5G~֚g0m!V2Vyno|8c2$r^aCJ,|su8jQb^cGo%zwAηm^S(B E@O=SO=SO}NttULGBHNQwa ׯg"= H2"Ibʓzܦ͖֦!6 1 ?Meڵ鈙Z)D\`ohImV=m KVj7epVv76XIJiv燹Dm"cЪS y\QHEMqoۆSgcQXb=||4_n">˘K+znQfly%aePՅmUeTQˢ 5ϼFSC=5WXQf {2M4ϛܴ@92jI~\tmYS05,5_rBsnO)V&aƧ~Mۦ`ؠ50_FuGECB!r$ܓr(>F> @Bzn-^-h?'pM+E&.wȬ*U 9<-u(@If R.KCVx62KWI~а SUblcvZa32 /񃟑ԛ>2M-fjĒ<#1;g.:Dص? 7>2:lC*_q0PbȑD2ҰO\? A/Np&-WL)s1"1ɏلmIj"g"G(P]3 %%]`ꩧzꩧzꋽkJ`FR4 > b`)0VͰ\(TX=HSpo0J S)+1 m +ђ{5G 0YsE?6 x5:C~]rVöT3\_2<پjx;*9gCZj^2{AWIg^r,1/ZpeqY3pӏRÊkd9 m۾ۚ1#M'KNU^X;z`iޏܠ$W$=V2񽗍)P;|_:m=0O_y:6xiǞQU͗MXe^jR}7>ٚ1z=u,i61o n[)blNQ (`发nkI.ݖB!H*R$4 )l,8F4TuҘ1c5$ThvU]iHU5>-9^ѱFf\.–[Έfu2]kЭஒᾛ hB`r nn/J1nZ7V^򬜠,j`߶epBmjv}~^:wոkWrHȚPFv"ZBrzj;̪CVyIW0eW=˰ax ӏV_xy߳l0+R%!ɂǃ-~t N9t2%*\׃%fg_^Ϟ6ɲ|jktf2ô;s'Ti2vi x-8Ś/p cq۫ˬy3_Ԇyf"Zщ?ºqc︘F-SO=SO=wMߵ{4B-&X749ҤTWi.8DBFhI7͎e0s[1l%sJg2Ѐ?m1iOyՄmh]eCD'kGlUW[ _"eaF*kl/.mDDp`)=ü& 89u|+|Vaph\>\F>zsƩsl̫2GA 臋 3z7_< Ovֹ՛p}@Ix*]p㿶QMZZEg6]pl>_u}dlQ*[hQEꩧzꩧz{?#} Ql9Ҟgn˵xE:? }_7A %w[Mk}e `46iTE?wQ57&7eUL,1{\ž1E]&K`׶zQ%@[ 4} J b٧"Ԕs}1qMZ͆EeI(-i*,/Pj%FY%X@yzJJHAiD"V%r;>}̈U^&}ǓpuNrAgHl4q7.ǁ&j>|f\7~kBGZk3si 't|kS,^w~J=SO=SOԤEpE$o+g[=1s}92n8r[h#FR&dꎏZK19}^2/(ڿ!|cԳZkìfeҪ⮹,5rɼ~֕zꩧzꩧHwފ )N8?F ҷJ{p6BVL`|]k  ~N+Gwժ2tuA^{9e Wd]C {LCwh0TB9OnnQO=SO=S߷ @B D E{ ͙RM:ml5h3΀d(8*Fi C}etO&F`w:Cu'o<2+WY[s5ǿtRoQ{mמVW K[{{SO=SO=B:}*/U٥g4H:^Yo>f*釹=Hᗴ']Rohn= =r?Z{-,*ن X¿+d~χ[lƭ/o]|xC6`_7/K|}9Vzꩧzꩧꋼw"tنNyr7飵 *0lnZeRC#ЙЉ]oܽ&{ZHS_"uT>Hc&$`'9Ǘz{;v<׏zꩧzꩧ=!p0!=O0LT WCVoQvXWo d>rC3Tm:nO6corA2ǎ2i02;LH!\ DIEfc SO=SO=Sh! # 9ddug2['[ 9u+(p&wh '~@5HKz99@똃az/3Ol.XFB !SO=SO=SzBRrΣUKso*,"#ܘ1`E% "#+ls0Aڙy+\2G}SO=SO=SOBzFrHkgG^k5Цm NX֋ْ{MҎt ?R&Zu5o&[~s$N\G9;N3*zꩧzꩧz/=!'a ! ƏDIh1nŠƟ4"34?'1Dvx`,S gk"}a0i嶼H'TcR8~K[>;Ɣ0u 5H⌑x_7A5@z'{?dZjt5x袁8렶O2 环ôr}NvfPW>U.ןzꩧ>'4hrH*نv)͹&?J !g.!a%C~8RnW~ΐ_6";V'=HujG90\ˁ/MG^ag|㚣0藳_tM3eJvC難FD pkne'*\DtJ5߼֓}87]=o-> W5 za?c~+ܵt67_X޽wOv95}$ߒWo7Wu?#B׎?a81?_<ΗVOzWD.ʚ!^SO=Sߛ $ц8"u+sLƛ0^{Z eF4D2I:3 gn@a= Y]`5W!֬mN`yH1}/%Q5BGÁ~sm qpʐc8u~9[?1äi#?[+;gc(FU#LR;: =x,ǘ'ZOȿ E0pF> OX~ ̇'Kϣp+yz| }gH8 ><dqכ]cF8ȃ|\0t Q6D/V>Spw^ōkcؿMԱqI?|G9PZ2r6~;*ƭq{nl*3ߙ acw誧a-_n0K 7Hd+үn&2UUI&_pVWKf[cfXI3u]7C -(j7byWxvk@>=|ucke@Ply4D_z`?^O;KB$=$ZYE{l{|=ފ's2N_rZƭD%Zui?zLNYԛ-7@(~^h"\UO|'F 50*ͦH" )"*6,(rN=)vl]멀REP@A HHfMٝ솄 )ofw~キu3}fȕ`FDRW~YYpx!OD9K'b^Lċgcz{2vǶEoU?ex߿R[{aLּX&>JnuPM?BY \pxڷ _09K!.zf6yH\CB$r)گJoiEy<}Mbt5Y>La ; _كrayzr6 FNmشQogISh"v}C"gW㙤 {DFt5yɓ'yB: 5K-BZG膟X*ޯb?QeL⌎?͈SUXрfԟP:#Bo3e_[,81νQ\HN⧲+)NWwE˟3mƎmۑ>s]h;,fbҔ:faD켒c{IT}Y S;OSxIG{{(FFxk\p|'Өu1}ҋu2|N'~]5qh߽wg3Zk=c9b?b~ .$/7ƿvkѯ:sO^y x40S⸫޺-nV3n_oZsMKDt=ƒguǥ"m^y".PjS /)s⭻OtLY>a>Ǐd~X ǻËrn~t:CO(L_1GЏC?@|ET|J>H7yO6 u,t\ܻa~h41 +0xEfc]ycY7~7rb_9[Λ dɝ3_'>%&[wb#mh3a(VQEZd?%U_PJ@n!lŦ0kr`ZbDmul/gs_tnjx_d|&70VF+ M]ÿ|bb+C^v2k*x\\;ۖѦM13ӁSǵ ' %O<'V&8Amr?SS[@ݐ`} P {62 Rnyp P tW-}~'܃%]^r8 mdf}0ɓ'O%أ+~A|dA7K>%ԴWX9V@kp#4u &(͛SÆsRDkp)q!*J+aSb5eɯhN`e$͘U"~w7)V #Ù+N<~U,#8lᝯ2mOmؙ:_湜+7|e?`|C-8 /~KgnVC"J\eqńEED75/y/zL{gR[bqW(#yPn<x@L?V|쀾ݏ7w$ijĊ l[^2=(6`^89Afb] |^|֊^z7+@"e._t3)8'MPn[z訸8kx*0_KJ湬A=@HB6tzg|$iN؍a8氦~,~wLc."q"i*-wzXh & sSt~_6fDzBX~,0$gjI2=[tꦽZϠH೻mx-[Cމ?> <ؾmgbEIkb~l뵷mb9}vzDOyPHOk/\W܍DYM9>j{, {OZT\ςH9/8bitpUNwG6\ZwB#p^k%}2aHMK9*5$5jyp?$+a(ݽ1y LrEl7HE/t;UZ7zw ;JkO_ƋPs~xvXX:!FO;U σ#+gNǵc;]ܓ/&K, &.x~v&03=;W݉SZa0Ʀ=: 2VC=EVchQez\t<fQW٩=1]?FX8d)RLYFl#7ab62H~qJ'vҔS0ww[#\*~[50cӴyC.)n/wz qzmQ*z4E{f6./Rt_Lb*,'I+o10NQeNsوs9Ĕ&\ibӂ5abcvF? }~׋ 2g~ kRqơq=4IKVbJӤ֟1qKc%j//ՙN`mI ^XީƁW0#ʐ܁Sf I'X@<pdy?aE&vSKm>X]c|$vE~&"gv\8s;KJHvc8FSOOB^Zɓ'O|]E1#&"~kBwyi#:05gOTjmj>m`OG9 ֛=۫} {{9 W L@M ;+?,W|-y{[qݳK,Dz\?ASп>?wb/_L>U׃;ڳN6pga8݉M.kvwWGN2=xu6s{Oh/

    UgVF;^zqG? ӏr5||_Ϗ|*ʒqH3 =~ph.Ǎy@ǮKQ6gtll)xax FGE=׆x%SB _\q]s_لw16~ >2ڋSu2Uv󼞸YcRuv[nvSGm];o=Yܟ,|NjVwZ)s˃Ϻ0oÊBĀjN6w.G /?&/8 >.Bo4~uY pHh(=ރFTnɓ'O|]E1)y>JķrHև[}ІOǎΰuc9FZ=]Kq Fc_n8grh15a3anZlUYnGVO^ͪwxjX ?z-@XHn/izoP+0̓E6k&5V>$,{XI8hÚ ¢lڴG=ݰ?zIj,Fk~|˗{jpNH8OAu4XTE@SM$Ml_3ǷN@j_O&.qsIE<;e 9'l@0qߦ.A+X3w)Z}W~.3vl7zVbQb\`D|~xµ ʿ3}'wO@׍vz…rc.3EQT˧Mz߄ 5X0"ç?$"#FicMUGj⇶SV^ԩWQP.ucԣ: zURE 鴽ۼe67,%XWoOjA#ЊG02s+PFKN@(2{_LS+WD˽: PQUhҎ-x?cqkk+a4QpQͿHoGtpyƥbߖ%_SU3XV9rNQzE53LTj߿iA y Mj=tߟɓ'O):b Uzxcx?nJϩ8h=0J*D#Ov}1ae6S8y{ ;G6m!4P4_kZI:,+/}bM;9Dnj`3N3*2*P*3zC|#kkr\5xyU\Cr8t.R,yɓo+HQu FRTI1%dqz+d0z? .XUoD+f{=k= +)fآ`g3r7鳽1rceR";\1 B,Tmבۄ!O <\xk_`()`'OJ\'| S-ijZpYx?5OM. jPERFk^$#O25Bd#le ՑovkX(JCvbk{_]@XJp T6neFi_v^:IfۯUx柕D2#Z 5&O45 4 &\&n|1kw\crå*&;4,Ì@/k_C4KLgkkO"`LJ#6<퐐'OZQr.|>18؋ǍC+^@44+|e9#'^UW葀F)UT2 :-huaU 7Eg4W/PlIʎUEwW)g [cBQEQT醯|fȜ8lbd53먅|j< )~ڳ()_/SU'HQu`l40U FX.#e`ۏ~)U;LF#2@7SzzVNE9͠SãÌmg#JXj J$[i/ɏEQEQC"heU+ol_xvF\@疍PP (z:RS .'\CEՉhRTeq /njDJ4,3X.s^q 0(=ŨY= 0(mث?5 Ɵ?z~@Ӫh$B5hccnxPEQU'iF>S5kouQ4E9>qm*x ͡ )ɩz ܹIc$>bk_7B(F{>\Vw.(W17f7V3ıRcybo2̼738WjڜDQ1o3Iב ,\'Ff):UPݕ"#Fʨ?iUhU P,7j C}9jLAp(_ v3f־,RՄcyгS+~4((cU}Zxh'ZՂ%r$V16,&o-2sWO_-):U hH0zL}zl¿YJ?sAUoNw*n W iOv&&ADg5.Ďehv%Ee'IbyF1%Ņnh))HM--B߉)IƂ\Rѹss~QEQR^7 Ik:U/'8QcY=Oicy7ہ$kjdTm8ątbZY+ِa5o/~M;l_l0|8\x>!UFo5cZ&c[{dEպLkiwG öL?v.Z گ堘~s̆fNm:lxk?_~"'Gaw][g4-#2tlW ac$c}|3\='bN)S:؀ǚwE׮]ѥK}s2Tu/ǝm*k[n_ݝxң7 9F;fbC9ϻ3LO=9Y%\X  eG.?.R(z)YW̱1= p0'~ئ↯U1NFlxEP x0vZؖ٧5$^oS|tCƸ1ccّ?V>Cuj$LJrjUtĶwnwEպHQDŽ쑀YEׁ|1d OV镾ɧkE3V%ra˻9VrpUߨ>h VW굽A=8nS YZ9lhDB.,֯:cC(ۃ" jKH&"gxWqZ#bǏihu>0Upb~šu44$qeNhe57f`o Mqo|gBlFYNq$S>6|O0~ݛ5`0o0Hَ-cڄSll\X4zW0~QEQNn=?bo?ىTm4 ;?KQT Eթl9wmb^4̶df24`܇?DȆ~!R?^f&dU2Y[aoLd[~L>>L7'"/l;P2' ; FtN\Q FƢ 9вG6 ݐ7^]pg6&a3?ᢜ8u뉸s~9k6śY-Tjc$:iX1|ZclŸj#8|x^86tQ&@Y _]o}|p4ƅ/NBcH~u/.N×{ǖ=|}/?1 gQ/CMnǶ^߰-`әaײt_nr?~J' Szqm\Gm\\s9~p/F4a͓UW<k^.} \(ӳX(uoo=o/=&iS.۰ǣOBpr#A\Wb7L.>c"yUhwaEQU 4gٗgyhzgmӌω\A7zi|QS*Fvsf3iUȿXZ~(:ՈuN)q8`XܕXɎ"H|o4!bڶg>/NgjzQ?EQ/V:"\+U+xbE,<1-J`4h ea f *i5vz,23UUȹsZ*{MwƥQGrU*{g<)[1M/l&s ؄Wcbl bĠQXB(mb# uJx8;m5bL\ه}x=:mJQ5 zmtW:QF0nVl_9Wgw`=/ŋk5[;ipxK8Xҭsm2.qӇPMd"m˦QG8=[Z wTto?'=/5xʧJ<[=l9)x߰y*v_k[:?b峭p}o> fQlQޯVo1Og\}zonjWoC CǟG6frߎWv1ly# ((5OgTu{5}^.-w1/X--rG@]IVba[S"*WBο|)Qr(}ea!kzQ?EQ/UWCNibAV ?WfKMOF ʌ[zg? =#Qѷ/o:"=gֿpf0oHr4?E"i*r|"|^31~`{&2 Ƕ \U;>\N{3tC>f|^O6Y9"q˒1A;؏߷J@5\*/\qrl6JѰirf[oRyJ*8 iq"u$-Y1 8Yȱ9'!WTdn: 3г]^@Ӊ7_';ef&K3.ľ;èVN}#6. jTr*11 zN烘ܿ98nOy'"ǯB7|,Jg@XX<\t 㜮 .REQOdn@*1Зi?-MC;ɪO6n0kK~ 5ks,XV`\f3BCW;;EZ3;0" wnyiDd#j_4)d7£j5"GYUg峚O-4<;<7.5$ %I S~ ﷭A!9dGn-c"mzn5jE66mH|A` ~T]ZLU㦙݆k' e^cjWڰ+ͽ>tHwP?J2t Kg}W{O?b+}ֵhLpZȅ+JxYPU{|JgGC~\d^~ri.cohSrL<*EaQn6VlY~ltn쿠;*PZf: ѐǯ9(#W{{o5Gڦr|Voccmo0b;pfZb0BɊ24{;|ƸeX m[$iWHgV'! *oxkY ;J>#%SViabnVDh$Jr/X?SUb' UWFf(G7`Ӫn̐1nfJ'xs1Pe;p.ρ0pn  uKz@{.c=;Ǔq靻CViFOn=1p5P)b[Q~nh/N3(߱oFhR`yu3@iuocN1/,]{Fu`_,6t0qvRl^{v94NN|rՓ6!ל̴RL}#.7 I=.&ۼZmK0BFb`ÍTvL~5Qo7qcڋAmd?1{Ɓj}GWPR-늃S 6{1zk\oJk|+P<0~0a8oz4 7/V :=Nz߼ӟEgex;<ܓ9() H0&wy[c*p\V(Hxo!Ѝ=̎-j}B;KL4^lF]7 _N4"_УS1o?"7 _/8R>s2݇uUE})SUE( x}0 [0,l}hmTÖ~u߃MqMsV?X")%1爼ޗ^[bNHR9# %o\ ꗛp~>J솅.Ĥ3\S|E9T(9;;$.GC||Ue=~E^..r;~n$$RQ7N'-.E~ΘD4 si\fٔޣyR,'^u ֌_EQTS'4Ěyik|a_ OLT0; oRv,,>r\ַ)Ԭ pC:|)I]#)B&$*/lyǏwFd/6~Өbf;-'ƣF|*sqMxnE֑9˧M3`wi 浰uZqt_SZU4(T}PR0W}?,JGD0_*F+QԴ /&#qW8xKAٺ Hz-`YWo|Hskߕ`e#6JٻpU)(~ţakDCì X'@9Kp?jc1IJe!b\cnFqIT}Af(À+;7wM-еU^$})m8'֣h4 EՅgo}7oèj$ګDxDͰ"* 77Aށ"_;GƣgּEQEպRb4I%| ^fˎn20U'Fhކgm; EՉ EՕ"[ڡ*g,̼P ֛J>Njrx|l# @(D_̶x{XcM'Rs,{dځj| /Rh\}~D4)䏲p_ 5LQLʱ%Ep~ٹ ?+EQE՚R( Ѽb\s "_ڶ!%ao^IEgJ9e)b+-3J4ɓ'OE%-J/MVBf,ɓ'OҴHei o^ɓ'O6YE%h7(ibNc{dy@ƪر,R'ӏ|)HQ JKPh.xIބ^f5(M:gc|ZDK?#O<:w`%1 pF;&z}3; oW,ӟ|)HQ NzBt(y9*engoZ;1}i8ᤑh߾3NHJxϦ?>ە̑qcgF:V._ŋAW"Q}q})b-5)hٲ%F:-җu4:$ Ai J_7bʟӹ.RrX& @?IJ??|Z/x0:~1e!t BeHw!cUG@V}{:$'_/xhRTQކUfY/Y- ?\~30 b̷ 짬4g5_wY 8rq}}ghwpֿ2:,?O)HQ J>֫՞C_|:*߱Qm5O59u\{ql;]1y GlGY^96-JEQe$-;Q0fTG ;=F->>#4Lz[? }f F1f-sTv%^c o=>): 柔7Nn_в'%\<>.6 Gw%`ޙG]T|v{WL~j;&=8I(ՠ!5aV㺑~oSTXPcVY˓y _'SƯcl)-Ǯ-X:w+^Hŵ;WM?]ruL ~7ӿaTbC`D`"Loz{<bЭ7x(yf>! ݻͷ~7דs߇i?~Eľ'?.p/z LOQT$Q&XR{Rh 5(y[;s1c?-~jP/ei gLKfaP6~0=7oޤ~rن %u(Ϳ%KW_&`h/˯?)9-}v8`%`YXLL2%`IilXZ\?KvAqv6ģx? |'ӟ1SUb EՑ̀JCz2r_5Woն]L'>MߛY n{x*Jdo!B\wߓqY9`1f>̿(s1wΜHz(m2>o7&ac7&c7&Dyi Ϛu/܊ _^$=Nb~KGV4W9ySDW1עyo.eAtn\BJL\q+  CCo6?)޺7oIBWݡrERN}`ԍ* _س||_uGp`i}qr,9W2m"qy]'.QۡCukS A]e+NcDőXPCWw*lDѸ>;:t7`ܙvx{xMܜ !/wE;u hH J2$lYBR}ˬ|||<˟Zz\-V6tv|rмo8\<߈Ա R翌]^ tob=?SÖxw%O/P׮mZH޸0R]Ӗo2e@rx('b( EKu*8F"> OQw#x!SfiЉݤ.j llHE}_է_Dg(V ֭.Um:_ڮ JvVjΖ]h׶Ji/mFΝ1dnY-cޘ~l2[]^v$c |zB$&^hVj! p$&'88m?7hE*N@K%i~ ǣR?V@n#WOEwР~=A49Wܡ:wQ/ plB#~3XO{oh z2ctmux 3Ϝ?xhNc"m?YKce,܏itEoähY.:/8D5S۠gK:TĜߝ5Сh2;4Co>) DGG6T:G8t~vϿ6N^$Ş_l%H/"i_Q#«cs@q1Fy,_#un9~{Za0o Gii7&6'?rPz\ĕ[WztG@*.qyUkFc֮ۮqml.M&嬔#1t.HYw&p''%~{r]-K(#>Ė;b O( ?e>FJtV~ն#״XXZ_,-GEc΀b*s!aچ ܏Fs6⟡N(Rl;tH֎l^ao߈[޹h&[Aiߛap)i0!،n8HZ0} Ç&ԯ' EXhE2+.x-EpiQuY_۠C\GDy91#8{3ϜK|n4}TZ?,OScǑe˭\x靪4}p꯹R7*|2˷ =O4Ÿt?~q.E P"67l\/7WuN,ec]J}.ߋ 釣_U?K+A]wTG~K]YwtJ| Ͽy(@*Xk'vCj:h%?݌^s[9@P"< Ⴭ(Mߏ٧Sܩ'⹀xl{ԡu@"|/xرQeɯdp+Z14o4`脑hnڤG(ݪ:*NY|ݰ)>:COa]ǤNmqa+?7/*\^U`@Y)G-5JB~/ҡеVñgVD8K,FFxђo4'y (y!|WgY=u~#RB9?ʖ>=/l׋1x(t,CۺVj:%c:Kcr:0z|L UFH ?xlg`07ܤCmx ^MZ台&Ǎ0kuxkM١ CfA|"luxܟ`vԩ%* cLºN7#ApW"Ex"4h1Gv#8Ĩ<|M L;r11EIN |NOǢ I[7 X!.I@ʅi?̛Bm‹'}&Tvњꆾ |9gJ `x7PrZ}w5nȿ&:3` H2[ 6f5 $ #'ƓoOF?Pj-`𷕟^/lvݤ-MjSL<-[K;+즃9n܈[8x&~_}Rݡ`{Z?c^-M&Jf:}94-sTQ^Պ{{'Q$6_eC5e_TOLju&xYkߢ}iD]e2(L1/؜Af~SҥöF#%8`oDr)k_O¬w`θØ˒ &͜i Aob%=wO/gbt }j,r.KӗϛU(:)fLo$WNgC\ǫ׮^„o?Am }W.(5oЗ(J JmŘYQ-y ׬A3ЯӨ>Z]aO>Wk:r) *5ѨR«ŷF$=dp92>yN\/m_i6d(Gn=?[\tcB̿4u94^k7K xRT(eRS7Аw P:TqF@ v:h!4k`Q(cH+!נ #QW@"6^:gwM$l^ z }B!T넯~ϫX^=!Қ۷-efŊC;!_C$*E)_Q-PN ǝ_ ׏(k 7@K^֦+b|QJ?GFhwӸ[!}-VU(ѵ'[= I.~FzdV_D*9}ޭeX&Ntδny1x\Zt4ځOQyO$X,FxOsJy[p2 OtIvڙ(%oVGo) Z;H46QijB%$5b[L݃;v`ķP9j5FzGf#J4uu"N><{~>^<U:Ԡ6Ře}-qѐ4"''q%X)f8NšB/bQTϬN!/mQWGE ȤƶRWtϞgܙ\TBZ荈_>`W1Ae BpH|0<_Y~S~$]JOa[Tƥ`L; ]]Pa4ZLͷcpX&-{[e:O+t`6ӏ*U-UA u1j_}$ļT}r-7[)2gV,GRtݱiIO^vv [VAtLF籼l39˿ 3_E;hFaz>CtYxyNDJ;>ZϿ"]ɘU\o'Faע(y ߼g2һib0\:o1?T\%]1?G?оøm;$l ݖI2Ĩu9NA2uۓm.Z53#4r2:܇"ݿTt8|p!>~? fC6ey#6J]^ͻ;wpʟ?~$[>a$*kF=TUkFTyJ\Go[zKC`iJ~T лh<6̿`yHDOY+㥉 PV1`/8U{m+p=::"ـ I_\NKS,wXmDs>^ٯZO@HЙ8Su3NVGcG߼S >R؁żv*dڅvs[Nb*,2W a N#'QͰ|?=InD>=0gJLz*㹲"8~n$<ǿG5-:syQ(J"""; K1Ι/[iT4-Z4%PNz0W3\,Rc?|awu@E oq8l 6~K~hL=uc.תUI}9UD $޸KqQJmYkR9bahh ٸ//"""laW$'*s\\G{G5C'ة7#bB$2bPW]Swx,x|ҲdC2jOf__9!) {Qݿo&}'$~*䅰6ah>mU&(jc@pQ$ڈ=[b(<[1XH+Vc%s(?YVO5_6*ZCɘ~_#QLJj͗9[: E<+]/X;oFqUq\L?b(oE-֟8)r]KZ.fEuso7(ެtPTn,=Y>8)e&V۟lۑ_>99PP!ܼy_(J|_$4D˟a., YG6O3?0b!c tႿx`+.iχX?a# _\kVA!n,|޿ N]^ARWdB;=}L;Vڹ'Odg913;~u}||-ބZc“XwlO3g|֟5?ǰQ\k'QV[ >;q oc*xje/RHfߎg)%z/U@Q|pd%\/C܎ME f펹s=-MC+WOay6Mb[?DŽ |7Pz hѥvH65:y=>=Y@UT5}V}%j`M\V_ms}|-,߹}k/?9OvɟœdFVP|NVx~'䅯,`BͶ,ZAi|-ʣr-{8Q*P^3yXGB7m\oబ4}eZ??3ݠ`lg$/8<~o>ND_h˸/<*ս*VQHa1$D C /`˗bS%;YItY~pqflެl[>EoJļM'1me/իx1P4Hfl,:‡S Fhc|wG:/|x #>K~W [>Mh5*A,#;˟|)1rI5GvD-iO߮?^o>)p>DG@Ԙ2ʯ3xksHWRRcn(iLi<&fC9߂;+P:߬\sx})=ma^% ʀj$&jGlU'?sNY6eZ.uɒeѽEUO<߽E5l|7CUl?YkJSY5;.ylr$Iphy. \?˟|)zb E咜̀(޸;%:tk{FyuZlݼֶ>MXt]g+M7 ^SPl>GÁ]S`H}W>л7u {ۜ,ϫ-YaaEu6ԉ%dٲqC8c$uZ#l?ui:4lXtyX9:MB:@girL0R_+QU X>:XJ>˟|^) l#gYFǂ1%Ϋ59FZ~{zyÐ#,[}Z5~QJ'\"#i%\Q̋FbLxS(#%dƟIoxk:RM9} o P#~=ЬDn؝֑a`?T^yA';ovMKMG3,:!IuXI2JV:M:({J_OPX*sXQY-W˟|) ΰg[FS/^9HEŋX~o6q<=T,5F!}?y*Syhƞ1q8qD`>1!~U5 I(kρu'dq'7.&ż,VGd0% 31)~^AyOH4_B :$&:,GDybр`y tzg{gJ?l:OATU8)hB?S;,*_>\> ?]&SW4( A3}{/޷Y? p"ECRez=SHINbϓ|Ru:7N^ CJFw{]N5vOķ`YIfS^_`ixxM2KLFzTsCzUWtr2Q3{4`q?7?|G!-.a&˟Nt1uaH' OO)*<9юe{{&TԄۋ?<>;NL+'ox[G_EHQ(FZ:tAlbF|Qlo05o<;/ Py>-Q3 l=,?(*wcPTj͚y툋fZ\)zb E/ kGp2@{khyɓ'OE 0EPPGRRMY>!˙Uw˝E]ƍy'Ok(:)@j(͚ymX([sp.2|ɧi%+y1_>u("OEHQF9mI?dɓ'OEHQLKdP-yɓ'O4];WN`NƀqF;|$K#nAA 6Kf[%PMZP߹ǒHE? EP&ʜy'O<}(hcΧ:;Xy-II\-MbX]ךg4:-; 3%My3NQ*= {da.)c(Hۤ1ʾC]Mզ4r5nXxs4tӗk= Jj֨5Wt='ٟ3<ɓ'y%v<[T0جb3-K$k%75mhTp4|4`u!JTf/k MJr , }e=~ɓ'=^gۇhjUFYi>ը<Vl>h/يq,@%iembr-":}0*nH0 rbjd\Tr!(\;~mB=uRY򭨐ܤ) Nɓ[B{NZRMk =3ѥG4cp:Xa6};VLBH0iKM"5f<: *&;x:m0Lq(lP~@2?yɓoʿ7DҚy^GwV{$[1Bc+R ~F{:`ڃ1?,uA$7 FuxQ#խ/NE5qd>&i:S#Moʨ:(^d?y5(:)XΣjqˑWF^a#Xpd :֠J kCː4 ak4FѾg8&T'?DQKJGK;Z7k:Sc`56оZ,{ɓ'O>;^x>{cXIӴbxWlOURdc<2|ZVo0ڿ7_R^/jWWQb,2TS2E"BO#yɓ'Oɤ ѨY Fcvni[fm OemϘîɎo]Sٮ98,v:{QrQvcS5''EaRE=d`RN臂4mUcin2&?"" ,TJ… غu+:wJ*g~QI>>>|jNבN}G'O/cY>ߣ_F-VfΝ^z>돢r0MAt(ACɬ,=Pfe7_wMӧOcʠNx'c)n޼;w*̙'z聪Ufm?24\⨍trA|A###O'CBB\ο]=^ߣ_iɕ]k&Ӄ(zұ(*Y'eYrի.ۺG[70"VnCwAbU&* cnIR3x܉Or]τ[8x?TR9)l?NᖔVTUQ(OFk8п7EKouJ?t^&v|rײeKKqʟʟW_3<0Ǐ_uWLzrKO7atNxDLrt$%to HIKC)|Z"n''!.јO2%s~K w/7'V=ϟǎ;PP!e*G #̛q =LtIyb=Fb9l@E\ fe EHQRܗ6l؀+_5a'G[=%EcѵLھcS{jG:U6uJ#1 s EPr(>u9^c!cweY: )UuA0`Sm#Kѵ|UԬW C+n!P_Z:+3d5ʊY7EcQzmԩ]»i!}u6!*v^Td~ ?a4ځxk]-<~{%`UƘr5'%Le HuF&zlܢNLFqtsz$%.?buQҺ}خpJ^%Fc~A83a.?NO:xM8y 4 ҤX+CmV ,=c1sUMPoh9߫vDF*f$sqM/a;1{`#[5D9 s4pKgk7R`<  ^o,87TAjL JĻqьwIQP/1޲԰2ۛudDn]vʹEc寓pT:n2ğg;}yBp,z,[<7nۨQ#yf!Y>iI'Ff-|4ChFǽ ̞?ܗ O'ןľHD|,5|G?ā]۱i|-|ݳ^KuS1Y5sj! OAc&i6]SŮɑ~㏢VNw^k߽{… >}: f?\rʟ0N(ǫ퀯^\4pd@%jS/ ^xF9?GFrQP8s,4~|d16][ȥh}|? ʄ΃! {K}RbT^l( ?yf|ETo&[*լnjvvJs?00Cƍөp:MZ7e n6 ʈJޙWЊ ^ oȿ(@s :Kq݊+dąQJ+C۱pn;,+N !gWFmqЧ^qkquЧP~N2T񅿧7| =Zheܖؾ laʑq8w˾gcE5ʬijҋpxeU {Ko#.FP>Cnլp/@I 6J}#0Sp{_Scg*hR!$=+1\yL9yƨ}`q„oFaL 6"j4sYdĩs>4 -6İobCYG"Pc S$&>–Y`R>mۗeT&E7JϝZKnkpQL:W,{s+yOnOvŐ;׉]$Ň&Qj# VmX{S6)'F$YKQ cy z7Q1bB.Fcxط'8 18Q-}c7Ʈ?qQ[UKÁk4!*DVgѪ盞Dav#+  Dпv0nl 7Ǡ1_XsN."lm:_H\)=?-_ѯcp5 7, a76o[5[p dWaßBy KZSHymF-ܱ#ZU;I϶]7Y bDƅ8SF'|a9HyaN?..]O 8}$⻜D"yՋ8>Sl>6lo?bFl,vM/vMc۵_<- B"H")/agw 9xbO ߻woիc¹g 'NGP*`388ֵhFŇߌ³=G`+UkU$J{@$QmC2λ>;>m]>G>7xm9o-_/![KohZjӳb|'׿cF0+~i08GѰ0圫. UwK@P\~b:W@헿9]E](a/ahqys.9ICD2*xEԭoUQ# ch\IH=4aXj W_Ms;}1{v>VɚH<]i3&B4r|@ *\:~19e(ӶWvEQeZ|9.ٍFVGT,6!~H#*ָ_ZMh;t10U>q}^xlR7AjfQz7\GK"@^a<^1KЬb(X\AUi&yuЬ2-^330t o%j#ը4.>s།PyA-Ŧp<'o'2VҠj1զ i*iuFJT*l72eJӧ\ch,_mrL{V>iuX84L|s M݄GJ%E꣑*ءRO6מfdYǑ}mGߔ H:%=L~ڊ7ǿDGe3āQϋ PÞXc-*a@jn]RzD :@Fn2:ߞ޻&>l_v-ϟUV{tߍp|Ma\y[O'^F ^0$PGcu ~?.z}q[`vle2vrzq;I+oбM+~r +yhUO eU_NWǥ4|q攛 Y8y5Py54)-",qsxV* p hQXrN퇺uCQ1[kuDGZ.{޼;+0EԎ;1xh VϚI749j0霞۽͡eReʕl\ʬnמX)8s$,<7xi'DMϤ࿼&^+)]#LguhR - PVl(]&\wC꼀~Z9zĊNs/[ ||#+4vhkYfɮebLɮK$9I"Sn+cnT1h<˔)#&~뭷Ĝ=P}Qѻ  ImĜN)>獨\yQ{=K-qK4;ٸg߹8·pƢ_z"\ʙKuƻ*=~&3n0wfqYVj1cVH ըaOt%},}}0a 㾭b߸eRܰ}:,_QPJP9kds4~%,ۗW~M"|pz/$eؘっaahS15|mY#_ ćC$]%mQ]+yFgɵZ[, ~1ૌP߼yJ;r 1rymDfeԶPyy3!NW5ǐNqMd2ޗz$c% tM6"{4EPBk;LhRƒ_jڈ-P&(!A;Y] +YdvvTaY卄!&neYʢ EÖ%-OW8ΎR-;R*;GFTV\r<6lq`NZ7eh*6EMt hVβhÑuRxүMI|۶ձ*J~ZuO<|ӵ;u5b3YȮwnۄi/kJ9 \>QJ]2Y >YCŝq*%߀pV :ЬO <Ұ6*EtSy&r!۴?߂-*@+2ڵCll,v-Si#,ͤA˷>~00M|^K8WĬ30bV$aql`th20s,Hu֗@ ohFCX`W›c m cVʬD!C"FLy 4 CVP0$ hkʍʆ]=Q>@W#ȵ]=/mϰ5MNǦ7zf3>L+.H_ ZD˪~8l'nTsE5h\.%tlw6]&zO%G%;Ȋ$K&* n+%Pq/j]=g$JCY@"\J;ob^xA44Wj޼p :tHL4_vm;/^(VoIcƌq9:^{;r=No`/jSŶf!y VZ< S'nÌNǬmm ѪZ,;-{v*IEֆSs{T: S6=7 ,(&th V1Y,욊>FxK 4nȵGسhh-rII˭0œ!x7k| >݆˰pOWt+fD>Y]D5:Ǎ/Vy?c,a븛J9iRl OXXaiXn.ީ"-}1d}j;%?3|]*H feª3R˘Yc[kdu;.Wl7=ߎm UFy>n۶m!% ytY=+!{pn89G 5,o "Zf9˞oL:)GX*JO)e"|0mXRX,0 ejOFX\&Vt(ۡ#̟eK/x%7v\Bi믆ؼ|ӫA./ͼvd9_2_fFKo#(Ǽ YFTFYF˗b˽Pz/Vm&Z:Y j%s [k=fQDݶXބwpb^wd=tXZVY8Jۍ_W3O6ah>Y6 EK^'Pe"|C9Vzh}? Ջku,"mh8JGķ LI-߆*A<[`oZZ`bqjY{vaaayGuaYFҾp: qz1=];%h-Sƍb%֭[nC}N7|̨ ?c{>zl&՚U&*\[NY;i/4@Z1I+{:ao*PiWw[ό4G!$ys7LÈOHx竿ͻ[4kMrM ZWPG i|R")SѾuSuuS`oI԰}?|UU~m,C?VJ _?Q¸-SBcܲ_x/zu܊=;d%߮D^K?Egh\_ٳPWduڵ{oP/@$H*7tR.Yݿ;~\]pe'7GG˪E?-e%Wu,jj #LjCRHX|T阦 b/򽟿df[PkLa\X<͜%ܦ: qfYZ%rҡx/_ӌ0իޮL9OweE}-f_nn|^ƥƟ;۷oJ*y乓(,fd-oVx^Uut6M|cE˩݋"&l9;ʠS AUz=~Vmf&xixL:?X6W ͋]Kx_wHHŻ gYfoO\~;~ݖr  TLJItek>$>$'ހ> ?#S:]: yd\"&:I<=_q?q~ [sŊaVRku<2x2뱥Wu<{`$9=qW#=$uW|觊W>? >-b6>,Zs+=|eud4&m8ߵ૕Za,[ v]a**Jȋo-??N0mF-E۷;*oxCC@ףceeXy4Tv wROr'Ǔ`ή;5ٮ/$R=Tg;=V4+WξPT(*YY0{{rN"?X\>mrm;fy7ŭt~y>d1((>>>FPcC./U٬%Q'>l2qO}+w)T[|\\C\4#-)FI@8dݮG=I-B"t!|2m F1Bc&\L3װ=.܄1M`[9qF_a5]"~/L Œy{9d*p7Uy|_\:&9z ,bF_'!H"Q.+gm0QÄA{EKTo!Y=gꬓFLQm/KZ_T~My64 HO}%h%R C>iL;bE>pC4#gľǠ>o4Z/c*qfᬽb"b?w+ 3B+ Ŭm0`|l}<c3bWsy"4c֢fQ96 {3]l!C69~4_HCZ|\7|)CS{a-^#b{uEuk}^ Ţ3Jcl5G|;׫`m;GׯWE3s|=3~UXbKZ'z~J$YykƏt1C5q>m8V0d'b#=>Q.8֨&%Sy . &+NzZ4"zn|2y iȆJ=7]ϩ8j+ף:pl!+?׈򇇱̷YV)Ǯ0<=Vk6NdEz홬L}edX wD 5j_Ǵ/fD!.6N1f!{%[`ϣ&,޻wc1懯ž aуX<Wyj\߹#N|섵l_?pN9xmt7{ˤiؓlۓwp:KBOPw5d=|vf*,-]t)wc0atU1b(9=I$9ICuKO? ?-H%AX2wL#k=KU_񽻰k0OU7XdBt+?B=suL^ "+ S۱go(X |_5 ˿L\ߺCEX0?sч<;aI23pdÏXwmO8Чhl9x{f?LnEQmB4yx|;s6Z)9+nڳomƌU1o>^^â4{chwu, YJzytoOڜ7bi.$mB'UnލKa_bֻM|0Aéw1_#oAў{bc4CbJbBLi? Mxv(3 5b=_6v$qwh_ڭX}Ȱ+r?n'ᭅ.v˼}v;$s}rv6Ntuv"4]hVeŬ|{;R o<AD>w\&Lz#6yv; ^1h= ]ڹOGu m Gb﬿pc$b~㯙1j߂o%wŃ*"nk Բ|<G##VcqYlOW(&[Q.)^2hz:qκ`?AejUN1OH8y-V<06_%zkx5X JX+?o5WUGٲ`޴VrTtc{}^U],^ dHЩb){H $ْ?Jea`P_/'gد 8ڒ51*f&ЊͿ}ujxnػ4RNZ FJ-4?*: &W$iw?/*t酗3Bj]gk1xAKQ(Cqxט,cZ 0yG/̅Xz#N"6wEq A^j%[Xz+q{yHW OW!CDj-qj%-O"H"9,a w :Wonb1CyրDWnak|ܶ#[6׊``裁/?œƊR-%xLX%9/] BR4.;;F_:|oϏ߄W{=C^q^_9$l=%|^J-irZÝǢFٳ ycEI2;YbB|\"&#* eX/50?G9#bv{4[&;GnƦ"#"ۇr$GbqtٯEtikyT 'x9 ]{tO<'gmǛ Z,Y]И#fQYWvp圏~:5+#%QUz)\cn篼>0fq J!$$eCWd\oўyFa'Z\n'];gfC`.-r_Oqz~YNs62;~M,nC`>E^~tLB8`mv~ua$ۚ%C} pJ:R@%FPslaiR6Y͍߶g"TYiu_º*k2t/4"]Yt|l-O<D@H Oߥܐs?d5tG"L:`d-ZW9v]hYi&H.fTfhְ ;F%6zEGVEM8aъC?^߄bfA5EUɎ̤q[l Ɔ+zH4_L]JPi~ڤ4lf#|q z>@L reUB^ݰ8iMS~C!P4sz+anKI+ig < nX9uP2$ ռ9"EKrsOdlgG}i-1oFBxvhT ZZXSFzR򗥷=],aoT}qVf x/Ig/ar2n&f!;#[سP.B)s/(HmИ#WH&Ϡ©^;moL?HmovG[nKfX; sźhڤ$lW w\+/Jh\DNp"[tͳІO ;.!NekAf b-[czT~rbۉ ơ$n {F=퀺^V;:.mYɲ3ċᵊҁ̾Zqxv{Ae::&6|:|kkQX~`9%]B=4Z-g!H $*Y_>!*s{C Mp둞_w$`, F9 1lr+CϯݥNCzz:*^3FOvfJ{Ɩ>\}:o'ᾼ˞8k*tw'[cDf1c __x7bK8Q?:>Z|l9NtdqC1dk@ .lBvx `5Lrup:j|h:Q9^af;3?oGy9Zϥۈ~ {ضQNY1bpg~k6v/'Nc5Ig8ё7X.=etֆOm//c8: <_V& 뤔#\CNXY,tmyYQ%;nX"3ztF_+"99uMebçgе}̩˿/c}Qx^vbk8_;,X0;6xmm7G^>/ޣ1P}1ǫ= 1 w`te{wbv[% 0; :a'1xw|AX7e,)eL 7n'tC׬vbяOКO6V&ˇ,xL,|,/Dt g=ot4-)[Z^Jr # vYȎX t^?eʆO}ꜹ%#O" A^xR!vy ;~JMUSe'fڌ-~.ds34T(E=IubEmNmPܼy`3>ޓ#88%K|`痗trYA,/^b|įA2 WXNߚ~k<9P&~ɛ5܃d1ǒ;y-kkq\LRƙ.wJ?Dy_l!}}t/./ 7*e]uG?;xT@r^ t:s=K% O<O<OC·P@DH\V t-RΜtO<O<O<'H$f]P*!O<O<O<D"D*2r4P>o'O<O<O|I$9I"&Z0.O<O<O|I$9I"&OУt1y%x'x'xyD@u 7b-rx'x'x'0$$R00z6yͣA<O<O<_XxOJCY@"r̐rq LsnO<O<O͞x{vv6z=22ž[,\+!6q_n'x'x~=/D"a5HCMh*%ecIwle(dd3qH!E"H&ǝMAMԸ.j[/91f]׿|47nOTRp󰜹o?H9IbϰZJ7C:ɮW Y+br(]zfNK~wjLnDn]c_/U64:բ0x>.zv9̼z4 Qknz]2q+G#**jbĤy8H]"ڽXIX׾XsCH?-E'=F땡1{sK穥Np]7k.~yn"{v7d:%[ӟr.Z^ڐNkxN/A#]Ξxi5@v<wp_F">yx>6I{nѻnݺlgjj PV;tҢwaff'AJ?Y'HV4D*@I&uݭ;=kIƲf[x~xcW}DqqG4R݁x腹.aQz#q0h4+%B!cҝ^ǗSᗶ'1[tr|qbɻBd5xs| }݄D[Gps XjU82`h5#OCu@еNBa,`Y V>'ˡw, }G}.iohuX~W~tJ鸥={YqI@=~?ЦƑ0t|$D܏;+4 W_ mUS;f+=$lWm>jlOtD?'׺?^'H\DzV ܥ޽=kƭNj'o^1o|J[`Z G.YuF?DHHk$3^ySwÈw^=￀F{V E+lhWL?vZ2؏+!c<5DSfƸq3t6´Yg1s_|H{<~+%_E6ZARq]/]}@_5,~MVq8sk!7eh&T N2]1g[({ex;b4>7$l > dJm7[òp%ȝb1o۶߾_5j@VDNVGDDxWg]&ύ D" Td%;-޹ږ# }@?<R8z2E_7PiUy3uC}p7;~dǠSI9#o&,ް 6lUp$GH]QIp'Qؘe\rCB7*BcZC,.&F7 ڭO7̳xu[pwOx1ֿ*iVuI^nIte:\ ln\v ;m;f|)?&\<` 峿q&|3s,q;ڥvl'saSyw h nxd^40V8;;"fLL6FUi]):- ^> )|<&9LmM#-EO/?km?ʻ+c%{ŢEo_~)WNu|,}\cNDC tll]~ԟt<`uGNZwtR3ӛ,Ouŷ ^ Ġ$~%KnAhN?zcr;`R O&EF2\f/W)M< O%rI2owRR:J`{56z]2 ʃN;#zA6C'ߡKZi]>R6=ѧq%-7چuPKth9 D' DT2.AxV=d"R4[_cp1]mwt#)"u4螈o䎟睡ȓ!On# &-ߧ5rzХ0$Dy|PMKQ O]]=]5sKvz[P#KōQcA ^s`@Ĭإ:|N %%UKgd ݄ 0#O 93Xs6ϖ-޵By7-V JA iM~ #Ftr>k/Ah A -u8\~;m+ywO4Y >C7cO 0O*e#G>&4>OGP7<=O>Oϒ;A$ SGi,1mҵ21'Z}%'Q|M "5š+q>9 ,1 ?][ 6 U.Oo$&rzh\a+"Ft_8MT cżQar:u=j 20;t`3DZTn)wq$-@.u(> m<ϊ\mk16jDR8kPGGlg$z"쏨{Śc zx#Hȼ!"!)\.~$-;P"NUY5[:VWp,wl쫝ѸԏR,﯐`*{FŢ"U? nFM*޷j +>)I|I\]^6Zq8#a>Srt5>l_A#3dE:Ze»F <՗!Ve$lWvj7*=W,\YsxVŻa@Y|m)ʻ?un?q=Mىq,ܮ,X?:7sYX?[ VFENQŃ 1ry`t]DmrдN(7rV`9j K8\ SuP~Kx=˵hU4OQZL{ꢔj=C6ۥ{Wz+~ >NLE0xTtknL`Ȧ_g?0vσ:㍩HD>᎜iQDow6%a2v2cӟahU1j8tw6C ]wD!E x5^켩EJ|Aa1+a꽃yKdNL!ڠ恲4`/Un~LKo-Ė+-ctRs)0r6\ as򷤋 3gFMuc&/yn'2}f߶EjE?_wFs h,a4YA2jezj6./ȅ5NF?>d G@E̊-ѠNU\k2ۧpeT-A/3)iCmWP1/P!WٌASZ顄ۤng PF KI+T~tꉤ%A'N.59i^_"5S˸\G߁զEOח!)wojtJ?t,可\I8ˎ>) .PY2)1)R!3I*5|l`:3-*7FWT[MQW'hc`Gܚ>Wը&x5QZaTٱ f* au5&yի֏g?>(\hǿO/0 NV Jοr=y"={nk4z0:4:Ɯ|G֟On9QWZH/~qe8nl\W@oU'Vo>u&^>>V%~9̥_q1Y v7hzY9,^]:|, ?S~,ޮH-UC \t DTy#󚍷_pMWj湒d a{۠DA&=*kHj9AKѠXR*XrF ҘQ٫(_#Գ?-Cz`oop8~}=bϿ*UuzNDyM4uOq]^z@K% 4$CR7W<2N Wqv?OO#h @xK@Ea)ڿ!5璼lL7[ GGj!W #?w3Yl=)[$#y'y'y'y'UR;sIpҾz/EYq;k x1 ^Z=S=Ịmvqq)4?߬?Mߜě޵$O$O$O$O$)yi,)Vm?'O9 ?KXN,mEvWl:ב<ɓ<ɓ<ɓ<ɓMZ'y'y'y'y'y'] r}4wL>$O$O$O$O$O$O$O$O$O$O$O$OJzy!J恛Owp)C|Dr?Β1ǣK7m9y[({Nëz |)wAvJhk<ePp 8._`g)wTۣFznMpb"BJvl'R^.e]vTIV}sS5"ݺy4(H=XjҐ2  ^#?~իW 4ٖVu;wFhhx7[l=$$UVH-ZT<",n: b4,D[:TW"|);?N)4MAY9 5ѣGXv-bcc]tA&MEiӦ( x}ZJ#&~cuچ)KPu=4PA, ^ׯV+ڷo/}VѱcG˗IIظi#oE0w8r%b{ێ0 \ޅ|,MU^}"R/=,ϴ١s&|j5Qj6w|޵4>iq\<5 M2f$`g'80حiqoѭdYM7,8}bI{e |K:eu1=o5͕Z|Fᒞ22T]Xp 4Ϧɜ.2:LQϯESU] 7lߍ~D=bF<ju̎7VWU:MybY\~oM{g wPUU6\QgS:zgA/y 4\SYJ=АV;}Zʨ]<ˣŶkF V1r[#k1_7Dȏ#uiɡD\=K31BsFk:ki_QK)R+:MNtCUYV=_U%r1!,Hoy}V5},FYؔs8/V\W5>y^.8Yv"OkaPB$ٶk|OS#̶/0Ivܦmj)S;ZʦŦuޕeҨ,  ^,bB!OP+rH˲%[?e ?~CZ>'- Q G.~HS|G~GQ~GI~G9~Hr+C:?+"RSSٲe،3YZZSeki n:qի^jb53^aMWbqve>oc7'Wa&U`]ۅVKmƿYď[#׳[dp7<I$jH06c~]u,ˬG D)#ҳ]5yUOwbYR~~ wnw D׌I);<S's;dƳ3# .OM'sQ-DzeSy vz_PW*o&Z# ;?j]Ȗi)1Pփ5F^j,ql7&'8In}\kcWBXq;DZR-e֚OSH`;<3r5Ki"z[shLf{>izm$`1O_ͅ\ש_s{Ch4:O}!ZӛL!^uu[oK2,1|V~=9 5oߝ">G=a˪_7ЙRcy~ $ɵľ[q/ln$t([Iq[U:"V߇ձ0aoeٕU=*3QIu4N r=9oDyߦ+Ot[/'DP;ˢH. ߰<ģR \,R9ޛif}>t m"v;זtf(=.&$ c4eu,_k;e0^]J6z,%6]m۩Szׯr[1K{ ޘ}?M/aߞ[fb8E& IG3bq؎r}AKElIOOڵż,U$ˤ}SYD.'Xg^WھHl6ݕ4ۏb,d۱@SӍ_=SC߭۟1c RzR.szdqDXi9bѼho9)'\xys:?5ǚCx*^uDMq<$ԻJRlJ2Ճ =';UikSa4RDՕ9ReeT^CVTŕ9V!e(s`e92VxV>e.hsG9Üt$W~~~][07Ko~>4| oo7ռz ĤNoO"]av.6FJ+)TLlQ#/hۄ?X=0_+x"a;4OiABnxh558£3-ipTHq _axa@yqE~y,\ >Ħa@H6!K``x:p|\="{1壖AoiD+'.h]ف﹮Wt ?M ~LYUTH^'ce_ ;5I{ ܎sͷZ 8!VFMU CB۰U8%=Yo9/2j!C9i+<'^Fiױ 4otý!oˏLތ%R4w=(=wo I9dp3`8ddg_><5-F>Z.¶ l/^قh(nj{C`~pK* h=?jʡaY3W_w銓6zˑ^J>ۭbo˶㞔/6u. XrKF}\jWyr䐌U1Gw]9[1(vWolj[1 rfk; 䓳ď#b^YRgl C{wAJX3ǣQ*;BuO \ nbWNµUwᦑS_q ~a Cņ /tRa{86sup7QzU1u}b@\r4ߚբ}rէ!ىFzahc/ۃ_{3vF~oU슣|&ޫ_ 2xYׯڣow epW+lKJOQQy}P(jb>ǿJv|m?+W`V%;LTlƒu\ CMwky5ѴBK*8v!hoO6O v"{bpXm ?SnW:aWN3˸GV8_Ew|N c?A oxfiBO_۫B _^W FNiko{\^ٞû( kriׯ]x/`"_ږcSy1(u)~ >3i[miXJ~naNTe$Λ6Qt2P٬7%T;E)-qxُ ϛnە9/R8p^@J:SDz\C(6U> dbSdSzb)I~mOǴsA! AH^!gzoVF8N7q.Y'$|fjҜ5Zϑ/j 0_ELj>!5ޛaLNzb><tCe/ Roe<*'ܨL==L ȃ¹r#Wp1/#.ҹ_*lk )b,yR4-sDp[Q)BVX2g49, v8?Mlmd44Mnɬ$Ť .XZ.-5pV\k3Zf0 q?&=))K1~Tl?W;pӘnJ[UPo\&dN`Igw=U Bͬ#D~">4wD*nn^@\4%D ?tdAn_c9rDB\0<չ¬^%Am X8+; e]Bxa=b<_=Qujfb.gq]GB }nB5Ή(pqa+ŭ|aBy5RdʠK1Z\KUr4$u6VȃŻlƆea>_;hf~4P癋 EWhUU.fcէZlNNmEU}9NaK'.U<(5&qe.%E;ŎMfϖJTi ]k@CcߑU΄vr^C^3rѣpQ,m+O%vKgg]Q])[022x[X3gΜ(3% n"栞&on<jLnAXv:RNOr[w{ /f_2E_I!y_Iʞ'7d'YeU'XIwU1K,ͶȋIhl-rВԔ0m2,w1H1Ҡ݄4l6o\]rNLㅪTsIEv/phW~evoUu^}ͧ >2w72'>ZR\)*(9 fNJH>7$]Q]AścFX8 }Qt1$}~'`vyƇq֤ "UL4B}/ZG`v,63g/R ׯ-kq`RѝzNYћb6ϟ0FigQ>47I`>0J[,: hUNT2u Ftj:D,kV$D^Mb~zfڂ2g3H-[ M4@-Z-VU5"(&RLujb=ލʵBQ8QlX8mQ$<ʣ{_Yގ.`>@oۄk 6LkTg';vN8nii1h"]3vaAi~]᷀| e\֡@(;ф$_CbBlx40.”J{BR9:I5['8;>uCU#lUj_4aJ}SK"M */xx,9T?#1ٮNM0X bRFU](xɊ 't0 ~<$EOOJnϦλAgnk>q}d4=-? DIK"՟{D";I/&lrrrE8(ayVi<щ1u A_bq/U8$ބ]{V۔PI_ 2=Hnh_ e~}28. ot`{D3ܟ;CLJz,9c>EQ "?@:N˃>"_y>v/ۺɁJLH\QOY/WU;yr|Q~I=Y܁ը4p)*}Y..6ov:rȮ `᫆*Gg< ŜT%Bbքa̤<~FAcdU /o@zUݢ =y^~yPycI/+ ˣk!by!=묜6O?#4^aiQrK_mJd1Z Sc?(]TLR[d@elSy=pm׃MYK[TQnS|z:A/̮"x{TOnJoD[8~XW'!ry%l߾]SN9S[b>|(VqH|t'5QnO!A㙉(u`~tZjeAz鱏ϓ6tH<%]yIHA /bsW]"RUuUG٤XuAmV8y{ GUsF"2z:tK*jYry/l`I{yjxnOA> xe2zvIϖA:?]mo0)X_ "VOsɋcᏱԴ ?<_2W=SPR>>ñ/RnպMeCyu7>?:^OT awץaK*O7۔'9qJy5*ɧ7V[>黩!' JB[+͛7gB8$[: {Fj hg6J >˅OP2ڝO>Txѿ50M^F#˔n^=wgi'tbS 8w_MwLOjx??jg`J*5 zᎯo&퉯Q=)ߌ?d]4 y:+/ǗSÕ2/IDzg<ץ; R'S ,w_MM:}:)}/sX.O뻟t߻sCAdyB+_ iyرc渉Ax=})p'gr<́ ^Zܫ~uHSkW/Hhf7OQz ߀/o>Ml&.. 4Ҫ@ Wh.r@% O#īE^^^VPBz AAAA$W{6(H~݆ 2$   Ղ"qN"999Ӳ۷o[nWfS\3EuD* r.%=t"Dםͯ{tUOK')uڎ8{YK7ꯟ9 DY$3\>)H8Er}]/AA 9 O|>PriF8cccq 9ħ3MroS_bc17Ʈ?qѿ3)?>8S([&D&t'=Ls\5ʯ+׀_w-y9 XSvګ&kNt&snG,<[j(ҝߍegO3JPJՕЬF'_  r+1۷o?0&&&CN;wĝ)*>4 ܄v!0XæM=B63:L*"MOE6龡s|rݜ 0]\*vhP67TF ܎fΎǟ<#5 r]?cɑݪN {F_vyhH+1-YWc.afGlS{ü2h9.mf~Yx+tǢV=b FX?H{ xIL/a[FRlc0ܖYkmYUk[FE~6DYJrb1p{5*1^W  ^7;t*TbuZjpSi&&5!-JHKV|!=_+=i-?y$?G~GQ~GI~G9~HKo*2?BQѕ=':͙3M>36[׀m^/lBlǢvI ւDZPe_įZ#Y~-qCe9ַ-XknyY,0|;{'ߪNIe&1x Q؛(#tjQbγ9q<'p¡DynWVn$^^*C0%kB7SzG(+z-yxWK~x;Ծ,,2{l*IUnWIo +6sY1^8MNT&) 9]ckby}dfqK`KyhYr/B[lMJ|[¾ GeZ,U])xcα9yMe~ҊvI[SsM;iFJ[?bզ7zv3%P3xQ6meIwFiwghB|\}y1-~o6QvoW/lmغ<l?CbC3%헏wbRWc0(tE08^܌U7 կ/݁#"jo6Y avѝ'mRƀ́jN^~O ņ?y]xAgV/9?i1-(?Wf9vhqZѺәl(Vɋm|XVסIcg.׆ؿp!8&~IzY:']?Q2Ql^D$cʗM-$ B.maP,C}r  -SlY11|2߿AwիWŭnΗBLeDFay;xroŃM6%L+ ^r$|Ys8 ??@<E> =mLϖpW$猻&*)6uJC*xbKAۇ W&#RN|r[S2|a&) 2G'3j0\< FrR`+ilMk IPg>~?azV̔o3a8y] 1YN>)gzju' GU"O_4bQ#K߮#ݣq2\DoֶG¨JŃ]1ܵ/䞮m*)Iс?R::e_a\xj~j@ k~G6AqQΕ0( g$JEՒE+nO#].$c;f:L*AttE*~.c|QsR8hlMc<YT|`EجOy  mac>⁰z GI%p'u} XNUu W0}Ƴܾ1դcs:&bYY7b=&ؽ(+UPIIHsXG ΟOO! [3Y)x 4ĔtÇ{>~9֫QwE@/lƧМeq5Kexp_vj?$f7K'm|}͎@eᖳ2>^'ŽmO¬ШRpIF8?zDAAP ʕ+7>}[nEZZk+;55UٳB P )Y剴;]wI]N`BpQiFy֊5.|ؤ)R=lw^`Ɉљfۅa7x4\9hGL\K eS<;®[QC gAtj*/u1OMöJ扽Zm +l ǵE%>*ƞCGԅ7khѦRtL>s*EfD܀jpAfÜ;sAlXFT32=O<c?,,_Ap5>-N*e S *bKSCZ|2 zT4*EzS`L_IPCE6\3PͿ~(L ~JǸ geŎ)0: *ʴªۥm^^sXNEusmA )gtT }Xd-ߣwQ}K@2]F @}!:֢x1ru1wBYeB}TIE:Ҵh_\ʜ(^R|\H& 懷RoS))EtZs|՘;U!|f`]V:V< ]/I-T8AB75nŗM^=;)r5@R"1طɳ0u.1BDJ-?CT렏UFD_*EPJvosvUaU"VmɎ ƀ BG ZDiٟN9Lt 5,S~26i$=owb  7$-*9g[2nzuv Axٙ텽.Y̿+W 5lnnnTf||EűlI4>.ן8#\=u[CJX#h^SӒb]B.bEp sBl*l98=eAk@ꋔcHTUr^ŗ"%6F>Sc"}T2"ēh6F$f39)I~#OΡgo`7ttLR{8ԿL{ wFaWֽ]_­U.<~.xtM|lw{lx+]NA",i>|I>׭gfkS o$jA@JFa[v-իlٲTy+AAo+HKHHH޹sGdM*T+V |~KE-urA!AAAaGO.8(ܾ'O`3'z Xܾ}7nÇ(Wx//AAAkQ #%3?ÏgEDDAAA"k$$  x8 ?a{|sHܼyO<o}ۃK>͋@rAAw(HdxquuE…BAAAzAAAAAP     b(HAAAAo1$     AAAA[     -AAAAC@    x AAAAAP     b(HAAAAo1jA$''#227oē'O4 B޼yAAAAEP Rxĉr RSSͿKJe~]ܻw.]3PlY   -n&߿K.ŋE/[l(_<5k:K.bi߾=7orʉ}~,/h4-\CDQܞ$T9wr|+ё8x/oO%2CoF=)(/BZR"s=3- NoۄM]G~;'KҿMfx5<0ӽmzm" {wW}H\Ż0~] Vi j_d{'E ơL93A>JY?^_XԽ\}{k G/|q?ze{Z<TG9WbOڨҿa=o;pp^|CP)v3{ %^=-#Aa -Xz߾۶m[ԯ__ )&mڤ Qۊdה?/{4/=wDi6U&d\/[dʿ֣EpE|^cFo|ƎS֢}m-.H'0']L2 4.,oOnf%}jP,h_},!(:ԫ#LrscWF5Vȍuh)yu~A~ܳsdɟ;,ԫd%^Gp Ƭk#_!:ˠ}E]\ژ 'ě[vgt}ޗZBֿܹL@'r8nVgx?eϭInʸSC~?5Lgg{bgҾċ"ix 鄡mCR>s+͗cMdbGIǵ3g5=&n |!f`r"&qZO%rvy+zTvH=>w81?a{z,YwBqᖩt~>Y{ϝ[+E,4)\+n֭czWMDU%N* ~ )66b+ᠱ5{1N>>^?<$0,)2Ya,lXmFO7LY]ًsEdFe`+< 7A=dHUd˺{a)TO*El Lz9ަ2^%Dۺg`GŅjyӝ-m7M3 ɯ˕MIۧrLwFVmaCǨkb{,Yi-L6m,fW~o7ag?9d1'Jf“h2ʺ^0{b jaa7<qLF629] 5 ~TXiR !z:}}f9Bf=гt&D~%cC0pb3v`ne[18hR%ۏZg0l&l_^ %t䣦MVeNzK~\zegv+Ӹ26ϟk9e$lY]GK>A·"6"IŤv)3b=܎-A<,=ٍekdnvUKQ_3 >drf}U>'Z^n. W\Uo_2݇cP%yt aѽq('_}; VgK e~!d-3+[[?zX/TO؍DW_3ۚӈ XNCA''RZhyec8Y-VZY4s.Mʢc O xBNLIMlQcKvdKnaK[R-R-!l)g2l)ǖl–li/&RRRKJӦM֮]+%(YFrJQK\ҦxIJK3p5)1`<"zZ47<;J>ҔSwҶ)EVAp*Z>>ᄹ,q̧᧤{QRrZUE`3V˥8bާy9OeK+%N%Hf4?vWJ!m.q 8/'Q۫]$T OOHرEKtd?NdrXJ]Kb~[Z٪4FU:I "l\_v|WiM.@K?YEa/J .f,&4Zmqڲ0Q&X/XqTէKٶ|<֣ism^mz𠴮WuQl&w핮 zN6)eܹ :M'_.ų[W5K8k+ɏ#PzhӑqScw$=QҟQYiGivNHo [rhu_t_yR4+h$nm-/o +8Kk:ʿ, e =&=M.V[/Iuf&J7Hlj/M"߉XkH"eĭD́qŽb[ͤULL0Ʌ۴Alג(6{! ;%f2Ozldwoxs~SnGfxYFl&L Yoڬ=tlD$ݟXA+R$iOfaltfW5sIO-?=, Iފ/jcvarYݞRl-iq4N—>{h8~>!b6cQd/۟bOX/~Tdf#YzJzj-+AU:iHnN$G1.e9!u*E%I" PKhO}&#ޞc?[Es()~ƮXXz/w.>e7Zgw.~dvWݴs }Hj}ߑҍP{Le'qGmـMQl{Xj2?%qNJ?lƽ=wҵQRAswZ9{6,ө¿>Ǚh]6=8!X#V:=<@°ek#cd_[}Я㿈ĵFgovccc\fMےkHˮٵ/CKQojn9c\;Hk1N USGA2'̑)s*DSRXʜ+2˩9Ze<92Y\i^h'Z4M]( p9G[vNN5®1dl/e= ,;;Hi 9yk/bYh(66>#2 &~4I'2I(rԞ};S6^Bk0<@`|i$ \܌E+q6OJmu9J6`xo]$_WpCv a|މ18T6N3vEm~E>_aV.bXvm>eUVe٨OmáZL͜nM'FYNtGR9VVH :Zqht g"h= \-w}ӥ-]]L*6'v'5_fkn \.uKU]%߹NӣPeHN~}JY|#Yyl-.(|RYݐ3=᷑LV+Zvwhru]oC+RZI.p<*Blz&@W-m-lSدƹoi- эk9|xۀj6D$-!Zn :n>f}b2ҩR &]ٶr+Χ{&_opnŗw& [F/o()$|]Eg9c…XhS ;spC1Bi\ ŗG(! Xk"bq0ՔeA~ I8ê!6$?EO^T#}=c^y }.Mh]jI!2-b~@~<kNpwEJ^W3,j2{R{#;wny~I];86uW/ƒgrj AaStH؉SqqcV--V(vSfL]ΥKEZ'ss 28މ~}H{dLUγL{ 5++fӹ#|~[.LYz&~C J=&59yyVx1MJ~*}nWo@6vڈ]帶rx6.LF_9*`!N٧h K U2|P2jj#MϚ|m!问LcN+D7'[63yVkHĮ \:SY_A@S*E08 >ʹɐĬdH4gp?kmȶcm. ,\. P `ezA>3سgX-c̟YPn]1qX2ǐi8x(8:K,#y08~^ /OpzĦeqxeNpq-h|-Dq"_גo`jD/ ]3l}Ie|䓸4y$\Vhe=/-fgm•뱄M[gq3U)‚&\음 5oALdlP Q9em{Op7IW% ѥoS,ge@)ajȱ (eutJ`gAe X%*kedqP4\4:Y'OlÂx${!Qj5^eWo>&񒍮0 XbKrfqEqzFr8[|tnqn.r ȹ& &{ ɬ8L#f & g͋ٳpxo;x=N/+ʂr*Ҙ昣"~Ӣ>iؤ5MrDLIV,~~:gOfba|Y xmb=PZ,#KpL[(rY؏Uöq46ûȇ|ǒ(ciW=䮺 19Q8_>֘XӹdS]l7 ,7gpQP>gb)o0V/>m{#4=7Up]rYK#R/ *8'߱ Qhy; c5b,{p|i|V'e6A>&CxPP/닋Tcrg9FhVbvQ1-Yt1KN*drZt/K+N VgyMY;UvsqG<ͳbzy8?ęSݸ{aL~.W@`W3]$AZn/qHLg 7_<)oLbko{2KP wq7]U1ͬg7*a1 `W߅6+M8+mBr.鏶<'{N'.Id>4Y AY8qB悂ą곸rx۳ȑM,Gjj*;L::8 TEF Y!]6:˯gc,N~\Ȳ>'r)][Q tFb|(sk9`Y+]} ~#1~C,hR\o~`=l`smVDHV2 n}Tc!n*wDXJxzhN1ܻlnσ%#<)fxW+,YeyD>Q$D/y_5RZfvg(Ŏ>`, %j^ɑ Wdy)FgEq=|dgǦOA9KApb|?t oK,!<,'R=mGpcD487#RиHmlj!:E\^(ߺ*mϐQU}IrF]I;r~aZώV>:yO!I${ pbc>9n<?yj0.Mqب@zgaVFrS^c]lM!nc`-kg:+V*۵7ccujv3e\Oꕭ6w 5ƒ{;0RY(Z0h\ >?^cvyʨa9WѲy#]d>Q{N1?w7fɺzh3ǘb`P|rЀ]'8?Pm{GEJ u&Le>RcIuG=j&cJzV=nSl5MK>|n;d@I䰤Cj*$?lտ^K(>$h A9$''#""B\,VXBr/ƻʕ+ . %%+JV ^9/)[ebr'flZ @Dŵ+6g~a(; {ORcȈѨ߶I`(_)8ԝOz*<ݻӾ}<ѥ];t{N4y! C;6!mh F(U*D` xT{qe}P&86Sڣ_蟴O@XzvP4QZ++Fiky#;ٷ\W.r|)!U+ eAyuՅ,+& (tT$`0Hu o=-<ͪK.f S3yt梸dz >j+dt*F%a6)5GlP,lh#*)s\\ BWES&E7[:f>lx lZuThlfr`QWWt跅ټHcu_ V= 4#^bt(k\m \kM~ű~m~QV UcT!BTrI ~Zs𑏕0pa/ ߡGb[yWǤvzecd]T3Gz0TTY5zct\~,4i&Pzo]N?׵h38/OW[ۂ>% <0w$=6g %LjIRw\%rG貨_jwRaїoĸD_1SQOS7ECe~|8-ߏbZsݩ3:4VffEVclfV*zL&ihVVI\v;m>K㋪3N~ ~SWsfȻh >3׹:֢x YxM/`k=2>O#G+>}UIer&N2GoRfBeV˚mU*gZ^ݐ;c7A\k/d[ _ ~k < X)+ xQ xcWrt֟ ^&bnc|:Ca#;W?m߾]uu`Sڷo[M.AyuxaGX].8fLDA5v286k{h_2#puuc2.m$[?AvH#%6IܞFcvG%7 *bw+;ȌSBB˹L/Ͳ~j~>s㰾/tŞ{ULBl+ό/}?ojOV-\R/py Q|Kvt/{#}{S7#/uzym[Fz L?+EQ|w*Z~Wj  ʃ^^^Ob#0~4(a{ FϷ#}}r`g_a I7սz9`kԎAhݬN%9.0FxnPi{|m!"y_#`갉X}+鿩 7jL+eCAAA J,Y۷ou2Qk? xSjY .Co;?w_x9jbQ'kG2xg ?pc_TWܹ_CUdwDn@c ێcq3j_*cqt8"vl/!H݇ϋl8M~._ǥtفvy1ӚcZ?8)7*'q{v]7lbHWJu(Kg}7_Oݱl; U ̷<B{|< n~gwF\8@h\:9]FO,,9n|SQݹ(|^> ,F/cJ&9ي,]bbyUh1q1fw)"o0ݒ{Fm\8d4tR՛Oކ(e:~}b]sd64w%\m0J Xӱ ۑp+0Yp33 rO R   7 J@@j5߿'OѣGpvvu(&a۝d_pۉy;c4 0$hpL'R8UV l{d6O9hAze1}k$6} (_U=adMġ"OACxVnXf_BI+XSVwFEcֿ\~Ȋ`r*ҏ}#يp&nЇX(¾dX% \̓mdk*P^;P| pE!sQ}^\?^as@ BOǶ#[1 k0ǝQy=} j3GcC8dh6 5X1}9&f y^ 1[s`ܑL  x AqѣG9" . >ޣrCY߷_=8%gZU)vxv ='G#=%)=+Ҷ s'b[\Yυ$9u0]䍇gO\C{V3H4C~'ʩSz_:;|?UgMSN6}&w8Gc%f{e45s6ϏY@j77+^-W!<ઑ\XEuI=Qk9i.SNcos0! ʧ|Ox (ƊMDy!$=\ ¿*66JMf at"K7OQ]",'f>l ]fuip4A-Kf]L! m.e4vJ%  e7J('''l߾II~3l޽mg;vMR^ l3!pp=Nhv 3g<vNi鷔$=u/ ![ Blu2m aXx쨛"Q9W24s"(0 i| 꺳3\NB@(tsOѸT;E+Kwػz"YhI%wVޮJ3=?/{nEl/[^qml9?yrh78  G#2$͒H "t-z,ށIt~9Y#'e`0*'ð~պb"\"횢V٦jXvmTv Мjo2Bɩ꠲GT  x+ AT\~~~x)n݊Vvjj(3&&ٳgG ^,%:t O#He%ʃ5j9E_>sE{%A#VbmjظrgBoڴBJ|G0R|X4/rVjyFArF[~B󫍽~AMP.oNw{B wrޝąQ|ްz9ЧkRk$fNA0R0jjۻq闾ܮ\UEUP]ժ?}/~/de1wApc:?([4Ya,+w|cC6.}Luu.d{C H\UçD{V^w, m0~0.~!} Yf }!|Ecෟо:FNҊH ?莕wȡAAVJJxSm XTe/N֭?|w/<^[r@]Æ Jec˖-w4lٲ%Z^/cc@r'nKCZ O>! 8k=Q=93iB`upڝF>?'٭,B矃IRbW䢃LC21jdQAA?>>j UY|9.m|گd3u5,Q7$kԨ<"`vZ<|{֬Y#eS.>ħ ġg@DPfL7U( m:뢞-y|46?}#[ঽuׅhа TG,(K0o3AFA}5 VgGz.m~ݞqxkc `'Rah\}Tﭭ 73w jg64KԆd6>1o'Nei[V.JShu$׳4vZ9:C 0/vש,çEN=$QA  A/jƗwr-`@hU+MħHֳ%c#>j 5vUi>~_}S.FAw~-&\;_=՘8rn;g#Wn\F 1hYEYmc@;/1=ibPecyhqG^~\x,=خY-BګԳ9`=>(c2'6k5wt\>9AwWQg.S߉l.naΨ\2=o=8uouaM_A08蒱hÿZWY9tݘ?q$B9ϫzG8C4ǨŨ9Ω>xbcG2ڭ1|Xw%oztF}+1 m+GA( {SRqlPK׿R9["ՒZG;*y}GWs]uVw.J>_O1uRcx2J+WY&R΢WK [6,LX mdSqxB7?Eo;.ʽwk{.:oj_nspu3{n2aZ$o[T0$=esk69Di-b^uhv̶{C#o .#f| 1܎s~e12~[NK.)y$qV|}cWo3-gU ~M'J ʣmpI jM < yC^Ħ<P<ex(ǃVAlYʃPs((<ޠH:lopWֳԬD_XU9!I"y2Man|)ה8= ejdAvh`W28cK2tDvI~YN3'{6VkaGySj2L WKR!\uF)kQ(.9vv׳_뱽0rf,38$S)v%VmTb+bYzMcOO|,KiS_Nc:*m=2ߴ έءTHgK 8_zz- ҥƐ}Cnx'O={72؍MualׯC<ֳkͼe~Fd!72x8l <@[7r1ƒCo,`#}kVL\_ŒC!d8pOwulDSQo^Ys_`aj"!R;:MXr@FZִv6!# F^4J=ԷB0eMg~l,!6Lěmݝofo-Ac;%*7b˺Mi SߘRBoH}β9li61BOcZ߯@F"qX3 2#0 -Ǐ-7n{[!&&RuQ2/Iy7Ye};˻"vNbd zI۹x݆b ܊D >g^=/ȹk 72qEGyk\yTuy?XֽPi!]5"S>yWN˶߭u97eW/uDeYʆf`z`C.zrQ[Kžq;ӓR<(l{k!uMTK]#UWLU5ʨk&+ k.˥-}Zд.4-׎klkNZSHċSír3tBpwy0-iL\掲ͺɺʬ OA`^89ٓo59NܟRPll,V6ҥ}Z3l"9+wOYg`o5%k0/0x^?Bxe} k.˨co"4h;bx܏:S?VWOc,XmFf]Dи[5 +-bRdxL7Cr?J]ӵ+zwm+8 |!ܛz&`^љq|~Oy2*^ߧo:ދ!'Qv]?Ћ*>"wȾn ŠNӧRw-C]-vR]ٷBvQPCcET h,%Fsfg};͌ `ж(U;/QbΏWyOms^|r"Z#xݷ{ #p⻭k:O^/ǟ4-Ə=@X\ɞ4$Pރ_9*G - r#f'OC1cET_/ <#o1PculZf&di\z"o}5d4KO:2RyB2yR*u j^2.KCG)X :˼P0^`\ _B ׿kشt ҷ`G(Qg¶o :ܞ- Ro I2]s,lF*J]ac]0N=YbV߬aUELce[gϔ;i<$QjmPy\0\ǶM1sH+|}R÷qhKwC~˹,7~WW/_SWžגs# H/ǜY %Ap̩:Jo\xEiNSZwSN(/bW+g+_$()OӃ|Xú wP^+p1=of*>gW"].u(gwWb=-`+6wmeT'O'2L$bv,[%FWKkZzWSYnJ0N+&ׇ3d>JnyY(Q{2e쎄6 mm䪶#t`Jr5ʢdn 6X :;O(Y(NMr\8 '^&ZN];4ɣr!uF!)bARx.GŢP'^?({]uQ\1-^!a:fU7NOn ?ljt//$[ [[d8ړ=g ;]q]V^nNqp Nr[!M-S+_^>Ǥ I(X7u#Ã4fПtU`_xEX!o~(Sc!]:],2pBIT$?'K"(J$.ڋ{hA.CHʭ;|3=%jVoJ2RVGKB e54`>] J+Sb X腑7cƭұ%ӲEv,,Tq^rKDt`*sE ]!Kձъ)aM. ǽ4+G蓎?rT=i 汧0ku&]:DҼmTWi},>}?o#X'衵~ !1gͲ)N&Þ!v/=mCv`f/ [f$6o\sQeFl\{>Fs~TZqnEĸMje,пLA@ Y.}=}_ ?`?RQ`XzJvwgߋYCx<t>ZHg:3#û~:mx7q({-3e|lFau,mEomX B~t+iڇ 2p65M?﹆4m%Γj7~hѺܽ1wC条nS GtPà8u܆Smx<-TΥ8p k^4hn/vpYv+BƺoRJu|) y"wR5K'y[7MP5l5`Lӊ۟y3f}y.|T0wGJ͏xP/‰*~JjhOǔ_R ;}n|}{[9Bt9sWAfC+ȉS?&^^sIC=ZIm'AHZl]Asr~q\%GF8 /nFa;orг|Q~ۘϏUq6> ѧ~c1[a^|o;Oh&I1/3Es.O 'ĂZѶd+gK.>E0@P Ekͽne t~#w +BLȋΪ:;1FN@ 1NAS3 t`|v*`“ruTe[|{uY_7xg:3˕Dh9uQ90r73vg*gc |VsÖfyo!Wsϱѥ ٛ:(.T/ҹv`Ûg곭g0MV\Ke~zdc;-ono vY4&e]ŹM gC65h7-kc>SIAnl8k,lvxP-*]Jb{1W{rǠg:OYbl0 gkXԧk2(2'"-,˳Xrv`7OytΙDN;+q6?9ܪR4gug+}uXMF c(ISV}5]MטЬg>Vvm>{ZȠvh}dNF5SzƬRkX3آlrF[YjnuX|Mhnqؔbf97Qf36򙥶Y/lK{6E=ЄLLtξGNwEmNcO?^E s;k* P"ˆYtU컚MJ_ fQy%G(옢i縝ȰG|(羊~'K-sZLf'sn4+LwyF:.:5ioʣ`iMǴsp1-{cp=32=>MWj.ƫcr߭v&KItBg5ݔSfLcM &ںome=MHgydrv;TʨYzuELi{f{;9}^Ns At &ߊNgEGݟ\l~ƷYgcuю:rH\[ ]f*\nnv$%?PR{zS{iIFXƍ|NxR{8;1 5zqv;86fbe{x{׮Wmn[ g&Gq~O,mjȲ7gfsk{my莽ϖwm D!@?PU!qf&/|qjOtzY9bz_ܸM|`)wႷ>Kcx1N/^+ߦROB)=#|:toG0+)[Nww'*%ox5-驜91:?X,)#''ǗxO~"Y?|;>qz~$^Ef|^K+0CN df#wzy> OcK7bCѠk;:=6/tؚ|Sٿgs3O31 DӡZ/\?|ί q[BD3c/;L=7@#k.e_Og+6]3dpym=o)8#|~w)oxHx;h_DKoDlP^w<.tQAArB[R-tAJߦwpx+af+r1=wWxέ#/);'cZn&je}mSg{4r/&uhk!3񹚮 oֈ ݴv:2pw<>[cZd2- ]2i+v:t\8)ј^uP8SGZVJ]Xjm)u3貕v,Lh֯lKMAm8ljRQ͑Rcj\Z?"!{^C6(IڂecT{гt"23[HAb4|]W+糅y 86%׍!@йwd'; ; 6vno9nk`4GYIܟ{wLNM yuٳTL蓷dMMa8y|>շͳ.(_ގ])d;j}p7тG2ޘ:|4%󿮨v2苐]Ye}=W:L:;p! 2a֧xk& QX}w]0e;#,SIS'  ";bg ƠmEpNjpV#.MG!7yxC~ PBm %`=^eF-574a`{`]B.4^ u_i6^eNeVʼ5)ku&klK^4.nP]MX}˯|ت-1?e> e_@[X2lqJZlYsqօ4ij c=6)vt^_涛Oxh翄\W>p]^3u^ E,ȶepl0VM\we'23Y6auYz_2N(sMٺl7F-[}㾍SBYOqeg63dG*m Gfcy^V{Wo9uYAa] L)/u2[9{ :l ~ޟMd_$YIJ +zVwX6VeݘTޫ0l)%o \jy3٬J]ݗ2֡?Q1Ѣ d/Ymdiz.Ǚ隞_=ns\vܡԉim~޴_u'&uZhI?`mjz`# ⟏X kZf|5UuUF]sP`E5Y!uV@]Up5].unsUׂuihv\Sf[sZ¿5@ ^ O D.'\sѪ+`a QZ5l z }3.B}~[nEAQ'=+y/ܥn|eu[d\Wއ_D!~-%N~D1_[3uЮmy8rM;}CBnX/4+>"aQ 7xn%ӛ^Pk\MMcWZ+ G/bAO~my)sHpsdz.]eI9N6LEԸw t&ן "ƍ@z%`d{oڋW>p.ejgf *aUVhv}9ԏUuRyk&" +K stAoA]aW}{@l/¼"H'eFf=yEor=wr|z71Yl]]zkzޮ&Y  r`0:uHJΚ%%(VKC"ST,\GNbk .W@S~cV^˫%Ptqvcɯ[GiF~.J*¼B=qԱ=NY|_/f9ʛݑ*k3UQ6 c"WX%^ ;$>3oe) ʿH^)sWSS d>rUμCs3;L՛.n7ioPZ>y ^f/#WPD ts+ﷆQ'ԋw6GŢǼ+x|@`A`=eQWz-ظb=*jUKo^pqR>{Jo,UZT1KPgP!!O1p!*TVS\)_f]!e|>(kɥȳS<.ta+c_kTc`?v 3 s^rWZɃ>zeјYl$w'Yar\Z|neZEqwHs/WnG܆P;. -7;~M|uލ]Sƫ- :Z6q0딼^$En1#MXv+iNmqDI߂FCbZgꇦ޹گqY^m5 3Dw)tէOcc7Q`ALywo[MA^G}WymE*}DFE|\4T1bAY8ϴ|[j~9'Ā0ToȰQ8MQt::&bߍ aBo_[f"ʔYXw(VPY:|s ꥨp]bE;܍3YjYxyQtovL鋵Rz}I ʹ۷oLlӔ,Š0Q*f"1_tIo=[C2AA$5`@BnY]rѱͿׅbw"hŸμ;{070qj{t-y@%V1q/\P^M01ryw}T1)pv5Qg@Q,\uw x,TAӱxK |%Nnyh"BqJGU`Fhr'C>I2mTvtEřr|Q$2br򢱊#H)w N[ `U6 ?oA/~=~e64R\[ЮF |42> 89s)GkIM/X,A>W8(:mcO7)ru-{ߣZ8 ErV°X8C'4h}UZRMiE^cbM`Z4\{źgo7em A\nYh?oItrSVXm+/_8$0QФ?9ܙ/Z!eY]?Ҍzl*''m<=<&ވUe*u2:82~~PgQu^|{h~Sz{g6ȣm>zNje9mq3|Y'ww8&YF޼μnOiJ(:媎`}nr֞T^vS?9 \ݔ2NptsAA/:ΏRL5de3A//s4nNn) LSߺ*.xۭ'\sMuzgxy=?WӷpwwacŁWˮ~>mŵ \:i\yIn t|     KYaI   3AAAAC@    x! AAAAAĐ     ^bHAAAA/1$    rAAAAK 9    %AAAAC@    x! AAAAAĐ     ^bHAAAA/1$    rAAAAK 9    %AMs(N$m5;Gbq_H+[U?m҇8f2\zDNJ <]& rbH ESGؓrto  FؗcZݕ-< #Ԓi= Jer,YvYxZUhi]8<|:\ku])uM9dV:^V%FUl1**q+mvk haꓺݱD}=]އQ:sHMyUuk]"9j +.9e+USIfnCG(uɼ9vĆmX5z:JG~$F#zZ}-<Zf;{Ws :i;xt_p=חaI^ݰ*FY?X ,4닥N[eJ_gv>994ysMMߦwS~Au"Wakde #GFPuOM mK!]ٖlӸK45>+Vdž}kϾe VҾ^{i*}v WR.Vw*1>DW񓰽ODY-gɩ-z-Um&ju2]>ՑvCKBHAr^3 ot-w)Y8d qpm,|L}Н_ ]~}?}Zu? [3˪Bgp s+eZ=st!Nѯ.>iz9/+9Ƕz鼕?FtWGe"| T,fMzli|gi3sR>',?'~>_miPչ_+" Ekr>Po NpI jpA\w#>y2;,aY ʪ4"bk۴bc_[u5I~o@Mg Ͷf:3 dIz!mޒIJPhL[ܫros-lt H[{GuO!ّ4eoٹ#lV#Ew ] U} f,u83gZv)QPW^nsmu@v= <·c"폔6[=r=K< o-eu,rh%:SbܬOcjԥTVƺS\^"u2{؛$o#?t fY:ִdv6wF96Tm2;E7=n͇,{##=1T Qfr/u|*l_zط׳9u9v_/,~Ғݒcb;lRVN(yS%56~Qn(qem Lp[7RcVR6s]y>8=^p"7~u#Ic;b}Vfk1>׿]rc)QlBٯx{[.mU;BWȺI['l|ʫziYi4p%ig> zgvρ~6̍L:eYv?Z/ ч`s>(y1heM;"^9ܚgƲKK(1Z]g+mTVQ7hӍq4G>fH,tMwݘTY]TOC&,=0%-3e]}ڳX\ea.zY8풷/T "ł.WrF]q* N_|u,`i}NS}}``-lʕlՉ%+&=saFdKg鲍ST֛t*MwMcE` ՁV$' g#rR C-ٖmIlcEwz,1TT.|l[me?X,m]Vچ,UTAF).q5>^}6f[4]L69Y}7Lfdempߴ&f[]5E4$󚴧?q'voof1 {::4r8^Zk"ΞㆥE*jr'&ɖ6J[KN"W?-wͰt۳M@Lȇ-+5O~%I~&CÄzq6,˷l~G,F!4?ie1,6ޏdޓcAa_MvYs1/]lT:MډK&&̖? h6ٯK~e ב:ps]*۵9&7(mRRe*v=G@` ^vcnp[b4:*eCW4S}r9L\NPl=6-lSU D}炒WWT(] r:) Dp o˾pQ>>i >:E^ *æQS)L)үbÊ`|SMƘEb|û+()׭Ŵ{{3wߑ%u0&څuwO4EFmYޝ; GPd>fJ:ݗ!uDT3b>T+ xƵ['ǍI2*7+>nskՂi( &"è]K@…Q=N>U6Ҋpyʕ. 1}W))Ԩ .I^ު1J⨷eg<(>Ի4:H@: (RI.`WT+^Qt) =@{%杝ݻ+I(|,wggg);33a;El|; e9S_gDCip)?E^P].@MJ%-uJT6 `ZPS|+,/ ^&*Gi19 -R:Dm ]7EPYWM&w|`7}nmʥ #Xp!UGYy*;,(]:JKqoU,r6CSz"1!MBELRGj%ᓻozw*}f!OE\xVEnqF"E_˶ը9+9g8E_"|&|T/t{,9c^ű*5V'[yM6oN׬C.43 _(#bp6[\=ÜE(e ?htoRsPk8u f֙y@\;t)0sq%GnOgdKiMGժˢ0%pi$)Z $MkUS@˘oZa zŋqiSx7uҖ߱V8fu[AqaO#?OD/Br!?RN1KA g_+lYt0ܓ`Ss .;UB>,_-?Q:<=R"0|6't[V<*գ!ajENܑ?s~*Ū@tZ &Vr;cݸ/g5\5T/dCG;p(@v3j-5ĺ=,ZqcL l6V^pi6>n;w:wêjx<0aPv}{¡T~c)y Х.@LZu.R 7b/sxǦNj`L} >0ƚ13!0j{ *ϓCH.4igcL.0^R1xqMI8t= \o{[^yqf)j< }Z7-&:$ߺ-ڶTӁEO-6N!▧qӤL%֞3w֍ƻ7LG/RV+׬"[ GTb/%P|89 ^}f12P1Tfˈe~3ZDJn =__|idlٹ C;~j|bWOǦ?!Jgr-k8oƭ"'FqpP7:"%qˎGAhf8sXmNf:mq㽗˫; x_mV 30+e]>v{ܿr_*m׈-3 VDvG^ -w (c0o.,,Ϗ)|!p_*ρY?Kaۯ/SSq7Okܫ]1hoYR^ Fl7jDvga/ qoзq9/ɷ, rPF(qn%F{'8#lsvxY\+LHu՟/ms.ri[ .\$12& 4ޝr1L?nu<10z9%AOYZ(}ɍ*>Ց7۔Sʳ|YIkz>c!u^f:Nn~# ah$ߟ=%$/Ĕ=-V:nnﶌ#Q2B@)QYcO]6ӵL{e)$(j<(%6չ_^zh}ԣ}>^ysbZr^k`z6װ<ɴqNY&}S߮3)+kZjee{){گfv/&:}S5y[}Myk/[Y+rmV ='F:e>>aS5{(Qo!I%UTg&o%.~^qizq;ZcA[؎'ŒIr6NoT[Uh6zM/i/n\7'SϦ:-HuoSkv{.^nh_^g||ю`g> lKy.׍-br\SfɭqI{`x[gRҢN{bI+Hn9-]d;죵m3ʫ8b5afRV}z;#luˊ^%3eWƽ,{긤ٟK iXʫ,WKe)or—eS^tˉ4ǹZJ5>6L%)w.yco;[LGyw\b>%/ynr'n6~s0θ/)+_j.VY&Ӵ)vY]ݳOWDמ\b _v<&X䛼ۡ} 73:>z'\IcPi03pfS.m6G{}\STuV]]KgLc2[rs>^>}eWx 7r10)i~ j-aʐ1S0"!4DDȊ,!!b9,I7 y!mO˴[~x6.xyچf_oLYy~fh-/!7=hqߙ?y@7tw2{VS/|=R3sٿ:uBpfn^ ^&- az|uݿ~>o6xê9×P۷'v?o>3Wjۉ;r+ݿd3L(# yv .b"*V5r{;v?=w2wH2 |x#_mA?d;2^{~ ^m\;ȋ.; '] ~?&:j:VnM]~?><t^w{F ,|.o'xyΕMO良u^B6.h^ݝ#_uY9g6>N%m(FPO ֹګ=Hy [vdrwm ͱ-o\/Aٚa~wZ^t*K*ͱps[=Zr?Mgy2IJ`G!Yc??]uRd6Y}AA< @5^"$IuIzG3 @A4Gd/ @  ѴT_ϯf .}' `筻_TEuu(=|j$A5 riMdFσPCmIU}OtgX6aő[NGEZPD$zYw%DDD OR؞}.(( dW?f+KO/oᷩ_8zŀ%% _˵n}WwG;5s滞' %t96,z ׯj:/)DGU|~[M_$&ȧϧY+`rݙj 0Z01^;N^>>l kA+2~j 7#eAԃsCq6ԓbm/)D[l^urOH}$}\gZ5 Tܜ 7^X`4fWcbM&~rTI·r}O9IqX,zVR z:; ?6xR֪1wlGZ 1ˆmAXkIz9Uv\!}w뾎az%~^GN1K=>bU5.GqM+N?7*u ƣdtZ\3ֿVUYծDX`CmN:7?n{\i-ۥ/_(`V"ϛKĊ\?"n`srAUtOQ`g/f9y6b_3.0g5ͱ5:>/1}<Ujx9Pb$+򻸾c ^ tLQc Qgޙ?G1oŊ3Ͳr<|X=VI[v*~׷²VnPG0`{L0p8E|!O(lIiKS}ЖsWS[Qr=CC죒^!(g8^schߋ{[dez#` 2?$2_&[E}VW "8:PR"Kva)~`n.m/wr&Q{)eo53fMz=%|^ e`O/ GP{h~@TK#OʏMyb ?]<~ˌG1~G)~G9~ȏ՟GE~T:?j!?ڲ'p֘YjIez3ݒan%͗{+vxDgÌ%Ű8>Uk ~n;{%zvf17=Cz &GلB`y]?~՞M;(`l3Nx#]ݎT_ЃۭS>v]E>#zHϔŝD0XaGNqN)qߏ9#lElr18À!+ < " I kzl&,Yk{ޞΘ\^.~e tu&ڸKևL<~>aܞfb3pۣ1Q3YLFmKf+/ f[:]Ƿ6m66ml 3J{{0޽'fR/ 3Q~Q|KŷQSؕqM>3gYbqD\fh*{7^a`‡b3oOlkjՉGڰ*}\V%"zf\~Y-MxJy,lɮ˪$Qižn]\'Fyw;ˌH>U[Mybr_љv6rn8]μ`TuKv-Z\ʹjGoOW˹milG-Y'DX7fpU{K)4Xym=T۳bq 8M? Ov9ˏO6J\;}oGߕg;ëx̨ii~v-/ʣTyq-g7Dy\KNZpa'-ol: ɗ]\>xʽ4/xD6}!OTK#UUL>Tڧ*}HVXWhy>[ڇ StjO}A{O}J>'xTH}!~o@Y1AOS!OSE[h1O^~ƮѢjOBtSm̓T9?^ q}LLY@iFo 0~,OWu""x!pk|ne$g5r$[#L|S[y|f}jy+"MWRDov̢uWGP)_.ao~ A@l-bLӮrX:}a4XSNaL/u vy1 g`ƪXngyc֙|ߟ0nqa+>L,[C'/w(y &T߻J iLI3Y`"8fa:/gx5&Ӡ.;ӧ;c$W~㚮4K)U0-FKQXpM74kuY칯䒀?}Wwn_LƉ-8uZW+P]{,g KjuԼLX y^&$tjVˌS>x(3OL<"Oq[v˪JbLv=^}&` /eA3R(j}\Eqɯ_U˹ Qtl^Η<3 CozYk.8loUO'.N~ogVю qBL/vLJ eZf`j?!52"w‘y?~~j# {?osԼhsx`3/¨7h)/ʤ$kGA[? :IA< AzgU퍙51a^m"õH*()p?,͘W2yC<JcM20V X>֝_^ʦbLJŊ@(e -[\J?7΋w Qogp6uAnS47r/\>y7?&audJb]'ؒyǛiޭY4(~W߂gN!g;ꨥ<aMg=(-DJNkB(^0 -[w%P\زk^#&S,]tuND|;FəOVAɧH6C4GHTߥՐr W Jq9GN}n n6 h6Lih}:&}T;x$.Z C-[vI$Ƀ ۵l8qqI:\;zؔt+a_4 t蠔KK}~0n? q;,;wng<֒E{;2Ec]07mغ jh r\tV5=Uҝ~˵l_ô$k.=zgϞhf1(-뤇6z=堵K7o}B>nX ?[TbL|{r[h{׭W^7Q Ê+0}2yTw?h-#{nbPTPIXt:vB:`@nxO1ճu;L3{ ƵtG<5\+JfYh傳wQrprQ/XJO݅̈pm\@|ҷf\/wTyEv'=YoSAL<(Vg7NUF۽ ɤ[|Q(Şn11ؠ+nб-q=fPk*N"cyPᏇOSNu8e!V%^oWQow*ml1?7*>](4Mh z[n>!@ b_Ѣ(TJv6r҅iCC cvl/֓r$Fq9< ?QxY?dwjSZ:탁q$@ x q2}PB (6_Ƽݰ::~64~ًܔ7~kz\P˱u X4Bšto t } J#^Da_c FaS۴ HUC0?S7q+0'>zB 'ŌC5X#1|`L%@Z~q JNaNq@zP/i7y4kj!%z7_)y G.}|5ȌbwQϛOݜ avf8Vψ]*@4m:?~̿?A. 7~3Aƍ0윾 rO)~/[ V8?!7uf[Py|w8_)O>tCXWy>ٺ"J|u=}7ŵ"Gq~o|ߧ+P)ۜN1[յt7d+B]N؇Ġh|"1AC#kNj'ڊjJ"'MIMUF򊿰#߳2WmE/ПquhuM'nDG/>.M~]y@ 4%؈5dyTYGRnlDikq+M^(#&%e]RM_tu<+*[AL7_nTl)!j̛e+RJٛsV){yk]9\1 3QE-\c㢝@ Iq>j9^:M1Kr IoJ\z3(_({o9be[EMhŷ U}A-v|D8:N6Măa1!/5Ț .E=p`,9{IkXN-EPva|_1X,L3áDϷ \{1xg[0Tڵnb%vj)?Jeϴ'cEh4?ZDsN|N :j!?zޝ_%Qs[CyY _~ۂ [6?J D,;jވEtF0EߘPؑlCG,2ʰ-<5KWl9e_r0^b9xqMMw T*AFPVP9TE۝vr0!+Jn*@c^o>gIF(qv9]glb7WGWI:%)oݩJmo|,3gK)oW{Z$(N/CeO!px0;_> 'zrkax i18t>uUq}nfe{*;R{"=fRdսNKlUes1Ywh= lqEuϜvo8ۮr{.;ᆵ5q6$=Zf:tRdzlʗt}:{xZ iu\Vsݕ}#7d]1R&Vگ쉶>s_s,?ez%^v{6[~eJzrs#ð]b ^mg${hpVlTi:W =ȔOpd?g]g+it;Oq^qYV{3\5=yhٗu-^#:,zNCOEiPw.>\<{[ڥl?g}ΤxqEaCZ.Pa}+Lf&=8}Ee"]Smϴ#>ci/aM'f3/m+nOgG q՗Xض}(=j|/Rsؿ-3- d:&շ\3C1Ue9EomZݍ=J\cr [8{ʆpݛN'=黮˿foXeϽwmx5}-~nS`(?͹F~h+Q?׶(ː7wv*4l\"i$Gl^09Ѧfsnzrn{9rܻ~C?dVgꏣ<ٙswȉ]m %^P#G2m^(eF_vQw쥾rl&[Oۧ5ֽWٞI7;q/܏E}^Vvx=L`edW–ܴzV6Qmh_[lxwH!4mQEQSox򷯗HO_)ެ'1߬V< #b,!4D]c܋AqF4`eFmTjH%?h"㒔!!N!]9.6?t, +%FߚE,Q>OaD̬(?rqVmBViuqD$"uk>`O))ЅeR9Urrr$\uYr葩}}賶ێ#qiNp{v Ї޽} "i:!xfK,}E&$_a!c/Key m:x/m]DzֆRnܺE2[a/Ֆ̏DW&7_f'~84>PKˑO$/ ɳ'y .ƼUH)HgH#\7?/X"T37p`gev+?knev7e$8ք!O3F^;[fs/~gL'Vd|⧈1Cu-G!L"F1~u{)3Yn^뗬t^Ii[? e׋ yyc^>ݿ;3IT4B<6A_;:ސ ն6?wVxfȕn?bTÔo\ 9#m7*OjEOm'Ty(N Mt '?Y-90UoVh:uboP_@HHۋ^U~frF;#Oh=ꑩ}"G6c69qrNBC9ٙXq8_@mu}rʦC=|S%qLb6Yq\ϸDM⬙aW`   BANA{f3X~t#V(m~Qzm:x&kuw2Bj< kSɾl]7.f܇Yp    Ca1lNFh)(mƑg ̉|bX-uVuwp{}edY'W~GϢNXjf( BAAAt76FUIxĚ;(&\W?0`ߨ(=qO׵_Fs/ AM|v 3P-Aϊ77ѾESD! ax}z {Gvx3,'ewoG4f} ׷Cߍƻ]ٞU|x{8',Ea-i6pOHgZ8[Q{0σy&lcX۝Xb ֲ& cgLKl`hKw ]=埑X,^ۢ A+~)}Egy\bX{Y:[La2cSUoٮ`pώna:p簸K3KyE.ǦםaF=A\u/3`d2q?h#;v0-x6zkǕNvZ]K0Q!qۄU}W0߅d0D?O0W#~ݔ#a?(m|>?͗H##*1Ú[fO#"F<:o,>O40y4Q5%]y9.ř6Tڧ*}HVXWhy>[ڇ StjO}A{O}J>'xTHzo9ƛWVpH*WZ)N`s@@?Zmz>Wxq|`lwG0, 0%z -a7~S0+ߢoaeGyX a|x"ow #tU4=˷þfaXiQӎb `oXp ª@Mg s#7Gr}n1h ꐧ+hxiz$`2NƀF%4վ $h1%tG%(#dNq}i_`7SaP7D{@Po ^(v˘ץ;VV{)̀_"1 ^cc~UG֬ :ĭ@D<&M0Gť9woJ(f6My$;(yB{*zK:cl(iQ,ihsIc ]gb)h 3s6퓹VL kmkIsF_ۂ cWᘙX=G:6: o҆AAA4H}Oym>9K%w~@#oH(gUDPqfClB$W j *˦q xn+ V 5ۗaMB_\g`3Qʏ??Z$VAotա|7EJ7m~ yZ&!W! yKk%kH)HIĠ m7ch.ӶӥK4GȃZO.#N+g~/6CѶF kXdcu~mX~ HǮ.E .}AAqOHLxWrd])ee"ߵ>^v0˧/g 7r6`鲺fPLH}n)법7$h@k=CDm6_^wA@ׁG~I0- az]f^_MmC&du>fn3^mW2O_w]3xz  !ǵRyyyc^>ݿd363 f#%ኃ   ~ AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc AAAAc%A<:w$IzNX&HIIIII5y 4H… gZajty:Oc.4}4HIIIIIy '~`q!e20YazsIIIIII'@3 9*C7dyc:=ɓ<ɓ<ɓ<ɓ<ɓ<ɓ#&O ēco /j8#y'y'y'y'y'y @xpT^6ur=ɓ<ɓ<ɓ<ɓ<ɓ<ɓ#&O 9 wIIIIII' d,7c15+Z'y'y'y'y'y'GO   7h}7n<ɓ<ɓ|v>>>0͈dfd6={$p ##Ci!wTHIU $'2=3eUɒ<ɓ<ɓ<𗜜,t: .ztL'^V+RSSq% o޼(VP#y'y9y CSo]o_s^>CǏnݚ XLDʬC$O$3\ 1O&qX,9s'Oij>+<ɓ<| @xVz *Ԭ%y'y/e͛"n\r!22Rɓ<ɓ|Aྏ̞IA$O$$~oyO|#Uw@z?wZCII> @xbp}\*FiVh<ɓ8G`ttyW=Ѫl^H3܆qК ([ǻ"3Ds#j@{r@VaY7sed.TWY^L@YfM1~j7։ב<ɓ4/ y!9%\WB1߃8`5Ͻ> w1d2Q#y'yGy h ȁ?GX޾K$O$O$jþݎ_@fّ\X eH4ZعӕsP; DA7| hW, e߳MK!909"AP^< Q]*g,_||+8-C-ϗR8|2(ZPw$x!ؼnNٙ~lOO>ݏ_<^?3~wMU)wٷOL-=0:OkhzՑK=JKJ{^ot%GZ7vkZugx:%Eyt#knH׃?}+uWUGhŚK[.~1X'ى'7Ubml 3r _ߞ|9L]~k}~-=7%:zꩧX=@Le,ifzꩧGGG[;zպt1Ϫmڣ䛝>z夃:7ªRowջ_׫>[ڞ< 0#/9u4{jR[P#kxӝYtJr{:3l:GGU:мOܬOnF' Y>x^s.ׂCǯsxpj՜1Y!x;S! kj^|G=S_ cl3cgղϸE=SO}8Qy?9(9 +ݍl:tkrcسc^اܭ"NY5y/s]-}ZnkC7;~$ڷG֎h{3vٴ:=gcsp_c~z z$7.[#E=SߋLjߥJؓ7h۶mteoןY׭p3[m3a*hBb۴i3z_?3p ƷkˎǴtTƨ}OE?3w߿Omۢ'_9 3/qμ@nݵS/.)Kafmj9ZW{-O/~Hk.?1ku{_g.z`?cz{t'xg:imւ;6OOhl˺y暿ТE+c"!lr ?zXWs`mc+uƟɯq9.Aa`M~j|O5>y[~r.wNW QO=Ц!ppfkELr$}sضY^u?o -kj -SO}/ׇ3>:3;J ,^0}<zڱjܹ} ##kU+ھ uLFwkȾڱ@qީ7wD?5cӗ۩^w5؟}ڳ{Dk9n=qL\U/|A\pˀzWhѢRφMy16<[^m9x(u9m QPI\ mh|r`boWSO}/ϝ3>۝qKC,_B (ߥP}zgs5~vW?uA5|gۋis5uS-_i&z?ꩧ<4溶ٶz{tQG鮻r  yZInѕ<{릛nI'SO}).Ğ5lIUzꩧwhሲGy֦CUN-_h}iVzꩧz@aa/`ͳgӴhPO=nА֬YS- r w=Zv!QO=ԗXOa&T>~d,GMgY>ǗYsؓ8矿f O2O=SO={ז-[m.[L}}裏zJ{.\UViΜ9QO=ԗ\hѢ՞=v_-#,Gёg#D #`R6-[nP/f!M+Ljt'NSO=pm۶駟֎;tGjɒ%7o^= Af"D8/ wڥ͛7kÆ :tG֬YzoA%L 񄰏 `)m`V7mM!u SO=! mݺ{Ào`` ϟ?_/zk?ꩧRSx&~@L?n"!΍2ײhi,3hoK=SO}s}_:ccܟoƽ&n}MyKR_h0_*SO}kOB@ !aڶ65/fekHzO|?0v=?SO=F)pWlxC Q zꩧzꩧzꩧz¾}3Shĩ˔_F=SO=SO=S_\XKd[|ߢFzꩧzꩧzꩧJ|yO '[p3 J ;61/f!zꩧzꩧzꩧ*>~ Уa溶ٶzꩧzꩧzQr >@. YFC)k=2"ϪE=SO=SO=S_z>SV@}@maK666615ͻK=SO=SO=S߉υ}!P Z /5{7PrGeZIoi7XlRM$.ŖmYcnp}ꩧDZ&k;zꩧzꩧzꩧ׮]{}mc&. #-e)8P_<L |@[.O~K_zի[l4}3ѝ8 MƘzꩧzꩧzꩧM ?jd7 ?0<,@&i!`<4^9- C9d.D/>_=A96zYk_=lZA|t 6o\n`Z {9pT 6Gҥ=,2GH@/i}})  Pn_w?{ 8)s@Kpi=yE$7I#ۣ h/¿h<˚Æ(_g,eo\.#vr)pR8` z4%gF5~a6/߬ˁmr2eY. Xt_EΝ@%Pc[ھ/l>)/~ p2`0mv~e3F? 0m%Y In, qhФ@0Zj¿:);~M:). 6:P)+?$@`OtaRҴIC嬰/: G6A@kmZwqݖ&]RrYǕ%R@|=podMB#Gcf 2/+L{/SC:/7 &I ]G9z z߳vpRЗ6+kc*~ۤyu:d 8_AϝtCnnM' P!`ҥI,rkmZqݖˀ. s7(E$O ]F R%IsȽ謾I|&qg`0P7O)=Uo W|dh`/ .\,q 0Э}uygVV!9*|@ni&cl&XF-+h@)?N|G_\C@ /fA^nH &0 kt9ץ~2.GtFu`0~E @ۥY 5 BN>~*Es$ǖ}C P& .s!D/4y$7) qh\/m[|9~~hOw˥3g>˨znʘ1 @`/84(@0k_| =Ytg- } Гѫd P/.60)ʻ@gg|u)pψ>e]6G]@mv_@_Qi?)2`@U<.]&,,#t |C@K:At @IymQ.)迴e9w5<].D Id FKM&><ێ=ݧqş]mE?;'<=m,%P*>20)~] ?Z1~ݯQFN{.=L ]u))P$ ^K`ڲĽn LZO낒'P9/k4d\C/i[~Y!:O֌e{<8xOy<@ڈR.a[?g-+Qʬ-~<Kÿ@~ы qxIKMBCIȿg?#VFI*mFnlLI5ia`N lig;|˾_tH,ASV бѭ)i{֬Э!Rയo;e<ǿm9m `f>yKr^=oq ~Ia֫w)cֹ\Ʋs JFӤsWf5wBYm}3}/SFK'sI{v].r#D77he>2efcsuʪ iʺ7h: Qo^?T.˚Ls3NQƥ~@JطU!`sP>oKPPULʑ4cɺ$X3sqYSd2/Nn:~b k۳ֹ+cd_٣L @;ҭӶ Ӗ}3FdOU:aG9,G쥍3y?lʹz#Qo^5HXt]>磌5Sf`]s=? U@~H@Jgh;޴8'k]QY,z#Qo^= 瞀i|ת@-+<# 5VEՎiԊ} ~XK;od(*@T΢f*+k2S!PCN!`}3sJ"DuyM)Y)i_Ӧu.a&C9@PPUL5c[tB&Hk|'ô(@G:k%Jx_Oǝ563%kڴ>Q@y6_Цy>si U@`A0Jm۳Ƿ>rPN+kY" )qI^6[er4lY%]6&Pr ֌g}=\3>EEek䨑G&%5`e}设M;/}fsG$7EuYm Vޠ/o 7A :XB7yC@9ֺIFI~L3y>?  ր ]ocxT4t1]poPLzyGntV?t9: ߰yʹP )}T\>F۟'r 7W`hxZ ՆX$X,JfAq{|rrrG#۹^ K dۙ w3RR"1!1^"{vDT>&Z-fMߤ v}rxdY{Ǒ\].Z.?=W6;=πM$|0Lk=n$@Fp4Af ZXjr$bS?L*,62)%0DQ8=>,]YSUsv)AoF&@nVҕEB̬.*ښA .Van^Ij(]uM؉z 6NB"Dm>N:gؽHNxdžU `wvK8M]v?/5Ͽ)R.C{ЋI ޾clx7~+[ADAW3]1%R1žDa0cHzUFƼssxw)O9S9)qVUEUQЭ d;I6:0BUbvE5NT'7V-?l^ I=A<dR)*]'@@L %a',1b3V)xF U:!Po`vЏB!4{;UxdƉ9'`č f}z"6ў<.d79k,]bmIUW`iP%WQSBLW<E Sź%*XBR'P:0/kUBd=ׄi5J l ; (U[ږ puj]סvǶ(zIw[*]IT>Kf_f{IXn TA;*( ofhbdZ}Sf<z;KbTw*vⶳ}uY w$#NTOG.Ӱ֪Q$pZJ[4K#d8<xbWD+ã#D[_džwj9nyG3t;^\•LKW3>z-Aɽ2|P6͎fdž [U%ʕʡfTȃpM !@Fqɓ~?ƿ469yLt#ӃkuB(T%#1zJǭ&y?8^8:?u srQ"n J#*see$ye E/_ȭykh!#bN˕Y']#a H\2W(xy}\ľ \'{Z!U84MԦl&)+F~#^[NZ"3 ~[\!\X+DG(f)vZ~c><9"=z7{4.,jtmĪ@"2M{16=o6[8ppNܰ}}$]$xg[k4d{ x}$J7qT_O/U6;4鞩l]JU$SkEr00" $)Ti1r.nA'~[]?W-֐*Teԙ*~Ņ +bw>wO^ݯdMdK*y|Ina]|+LkXY]\mkB['/-6ݴA><ns{l\\撹9lv؝ƀڋs-;^c$.y&@ne8,*͏mLݽkXhV2~\ I2pYٶp!WKVh&Jn8+ed,;棑HzY~li[R4*ФrE9V4Mv[2BD6LbFB0_E|Ԏ] i]VL,ʥ$~%|Rܹs7^x#C AՄύ7 L6jP𭊂շt=tF$N:#?S?=ay]2/0tuJ5aX:R@"I$aPMmrcaXRY< zsIdQ8!Ex.>NNbvr cSxw;YC&§>wVW`;15 ÃX^]攵!\ r97^=pMH(41;|^W'NO̤qy5]GGÝ._opX/c`lT2s_z'4ޏ/~ *׃{:` "kqP%}t@jI V&KQ4n֫@)T*`m#MIsF"o?b˯{Įi >h) "qDm6լIdL VWc/WOGjsMaq1]ԈZN٠paAf}Eqh])2E%>.nqXGǿ}1DvIMbƢlslúSD^lvt$K*iu5?޶'w{+F^TBK"Ijʫ+x7,5 UҚ&ԚdZuRv_z.6j[u^{L|>tfg@VrvC"^:e uèn,_;DG?FQ ƴma~  v{:O]Ȟ6$ng( ם>f{?y kĨW!`^˴7bbŢa7bH:9ۤnYOw\e.{Bpq!,l믓4ԨlNsǯ(Bqn[TRKN[vC+zZHSܽ|($@X5*I_*nK-} /^ 5qrGU&67r/|?!2ke~gONT?/Olnn:u/_6>yaxsۨ%=WUv>?N.؂gtF]ƐZͥ=@.R<O lt}XX&V9 i~J0쌖zw*֭z8&??  "IIN/}M\96|/:ϛm^@Q?_D_#L®˃~ NB(V \E%U0w/Dx WM*nVma֭N9"-shn܋j}ؽoneF;=~m#}(A:ƽNmƪl6lȹiׯ&'zie{ /nQݕi8C63ԭaŢš߯#… 8z(Nulw2Spѱu$r N:Vi݀9wR^"7qKbYɞ1t,\|pɕ%|(V07hX"/N]1ʽ&7z~|wC\SMR) (8Rcmllvrrϟpԛ}vvV1S3p9ZDd_~1eH2c&H[)(sss<  vܷ||~9N[{KfjL\sm ˥"t~j굺ץ:F&u-b^ /o_׳dLNsTJ6UY΂Z< ۋMB|`XrĶ|2&x1gCfnAJ^1sqۘ}ѭag"ىx Lv488UR3Ks2C[U>Aҍbr'Xh)ض$,{gJNUtcjvxB2k>byX_骖֙'JRFcȺ|h4zWi/ϒ`5Ս"b}V su܈Y@- л49q&ߝΆa[6e[g-HSUV1b3~Ð5JN/U$uK3r[6r3 vGj:MO?5wKW{aT~yIn邇Tf֖?(2\5nmTNW6VAi#cb|Hl "gBwiB(T݉j/| FSAhVt:ݘW,K(1RkbYWm=!,d\gb5bvY/u7ppO./|-sqDjz1e(++a'AI@8 w VE'0N\VT <5=tV1{T֭ҩ{5I#Y|.֡5>9'ƺTccCٷVR,㩪)=J7 C隙Y}R{{t1t.z!,]QR{w5\OY v"=-A fZlidts@\rKS~DKkkשYm%N q M6ֵc_zq/qq`WJ4r #eCz ./ApvErb.S%x!Ѵ{YG} ^ZL*p_Ū8}<H&=R.ȕdON#٤\B\D qYbwz$\K-RYC֫S95yLV Y%|ex0>>oX\\W km&@>:6jdH7/H%op *MCo͠VkV,X*?@:UzN@~rY[FY'`p]-ՁJ\k~F|'vx niW 9s.]e[J}]8+U:歹V(F&tYAlp*ퟫ\6ܼzn]"F7'>=\Z>>lxqbr+QǞa x,8;=# ]v^yMl=9pphk(+ƹg049z>Jp'p2Q?jI8PK |ˇb1?XJpdnt~N{"L8=N:<߄aN>1Ffcn g ᰟRYd77P* VeRi0CTE2TF>?~Z ?B^ʲȖ+Y%cb9Xaؔ:<(H={P$|/>8ڊTu4j~^&@p^w|iiI~s!{;vL֌pʷ¹my ї胟cU4*5 TC6Ica5TM JʈHk7h~lM=pRIp?4//JĻc>zr *4bXjl jSgV!QHay='1݃K O3itU0L 4:.#3ȭ^Aα:I;95{ ,dDZpnZ+ӬI{!\'Y J߇R+9W-L?>I8@&׌s&w >HPBT*$)"}Rffn1c[c ذET'ۦopXr䍤4f$km!{TQQ5LU;hͼg"B؎$HNlh$E PHEON`\]׫"'%LMX| C^Qvǩ7S3T%x]LesqvUбC |ݕ980Gr-\ wWm('IXץ8 qHeꆆ{g\6kVknn&db\J*%:FS}_%?z:)T)Jn*7"mw];5+m3Isov]}̾+ܼ,AأeBE֊MCpyA( Qꛈ&( C잙ĕ.*NT uA r>>\$!?{bmctb 5 (jp=Q#tTQkHmAv#Gv.!UPZ'Z|I=VKU֓pمѐ!)7Ât2(` =<<+ Fd*Go!+ ZvO#rFYMZPUO}Q "OvQ[U' O؅j H={VZ1P#xOX`zv7bA}!21h' ˑh&&D ,=ۃH8W1?=RY!DfSG!b,_pB>NA͖y+.0}d|I+s٬js}&֩}ţx9<ܸ'HJRY LL|/Z3<|ܾfw?z[*4uq[mVq;6Q]bcR<44$oM&tͥAQXL IL(4 6V˰RMfOF 8_Ov<`_A&R ]Kx"nFw*A4_znxS_?{3wnn a'A^sg[kn^8H6Q2ZV؃Ԓ{מCֱAI9ϞfZPBbxc#8w^M$=Zn]J{ϨX7b&u8 ;mH$tim4H}E }+pi$>@ҶBlj~$2+p`M ϝ#6zQ;}I ,-.jcxdtt p Vű3g\IʼH졥6GY[E$L6azEm.X61Ղ}&6VsXhyKtc ƕeBa#B.;.mCX~c4<0._ldNjQ,\^m. 4k#{"zn:ƤH18b%"nbQvM-db(>LsK-6 $p#;Naz{JL_;$k12BbP[UrşKFOjIf$ F..pG\_2 N~a(*Rɾ^/1,=qNg% R!8}hhT fz?KH}0WtHIp$&c'HCS)#2\\("J$XJ乍hDZq3{.G4ʊnoJ 8(ebUU0<:01ic4 z{2buap#򰢈}u;-F`WvuXŕ'G}>ӋT 1ebXV}rUë(t4NB*Sf7*ػwKAAsz|dEz ͜Ûh| b Dԓ 2  4i)mpnUݢ+Kq^5r)ҟg>3F Ήܚ++*wMf*LKٶtUDMH;X }İWS:Zk,KC1+҅*Fb#תdU!iQiL2rG.{#H"Ͼ ]N5M eyM2Hoԛ&$oxGشHd'i4nܝ{ֻb V5k.ۺ>r]A"v1H썫7Low:Tz^n_LDqhDn(d7ibUkH$wm\Z 0i'mJY5$fh[S`4oESKHo xdoj#40VWж80HwzJCr;lv:/Ձj& Xm5pxUJXY]ǧ֦e<2NhuC}h68?O ߂A\B? J ' |brMaszd4u:F8p\![vhcCx{)v}|,80H/g~yS{ ͲlȀv M(vW: 6+b}CD {)IptM"ܰ>e܂lVٽ`(-?yٵKp3@4*&1g9-^/)~GHV[3T}HD-cܕb˵]RT8z0318,<ļ, #8.LOZK@dGMNLHIZ=K[J,sȱ3Ҋ:*l0CEc%:LLj ^BfZ+&ьWG%z3O0= Kj[{@r-p.)ǠKύUcnq$=4Qq>$ŒxʕMž8ޏe  l-,1yT$GbhXT-RV++R\'" =@bwQܷV4-:t $4CHKuY1i#jMC\YX'\prv '9#Kf˥ &v wGpa eD@ U̒ϑ{90GMn'/ IC`m+5ZxX][;on9p eUKx޽H]8syŅ /I^ir#ժ)$t ImlA8o. YnR !D+6dJD"g&(L mX^OCRj}5NDM}!rKь%[P 0K:31;<]қHsEL60>Ԇ׉p={;q[#"JcczSQYIqB}%/b4==-ʜRGo!U;k}y6\k):H؄z駤!|UO1ERA)1LMM$I'U?Ģu$SjL5ቄ],V^+JZ;s@f0ls0-R9 5k$C Gy6eOOtw' y♽J?"ۣ.זV6Bu[Si!Qgk6ݯWSؖ#U_;_Lc7gVlvTWp;1bqeZ4jeR7bd]pG|q\i\_ )\ ;+Qe亵X- J-:265,|&D}s8H7gxI ,ݵy='{]S[5zqH7Y=SEBMpy2@a[wWxwowjlUW6oҽMfI&m[pT&ݓ噛c}u/qgݳ!`p$bͥG-Pz >wMu'ۨNp }p*@ģXu^~} b(Q8~8~=fqq"'0"1 p߻#Gc3&A Tt\#Ӌu'TtJw,=:mt&ͮWJ/ TP5E;dI2)$˅X8R$lÔ w=0/l_e)Xxgl8*\ OHSIԔ^h\.  ,)VIEf)mk{7N"_mO #ޤ tpm:[FGL"- pgth@dܫos* :ժt5("{nTI\u^SO=eJm7i_N/.9Rٶ1ט:/* @l7ʤFFFz\ bI7&3PhI&@L2I&1ɤ;I_0CzIENDB`DisplayCAL-3.5.0.0/screenshots/DisplayCAL-screenshot-Win10.png0000644000076500000000000021703413242301265023545 0ustar devwheel00000000000000PNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<IDATx T՝߽{C7;*]@h5N0oq3y&:̨$13D3ƙhMEQEePnz{{RuAIݭnUuws,uo9@Ea@Fa@Fa@Fa@Fa@Fa@Fa@Fa@Fa@Fa@Fa@Fa@Fa@Fa@Fa@Fa@Fa@Fa@Fae,.'8މ@B@g;n~ z8@/E= XݸڋuB[`:@E,]yV O;{B/9Jw^nu U= 3 ]/t"p.tY* *(p=CW~-u? ,RzC¿xH @T(n*8)?"RzkvǤ¡pp)T W#z@(7?upp*uU񗿌  燁RJ@RϊݖUNvP@ҝ?{+wr|Ҷ>q`x5*6 z@g(MPWߨimGs|bmEGBNJj@= p`#~k N(t0C؜G*-%Baz?@>!wYJH@"c3G`=MW]7z*X[:}56uJטqcU[UΫ;EQ `@Rl&(۫]s䭫tL7T2U+]FU'VJ/qJ|!z@d]ݶqkou :RRkޮ6꣊ҮMuQ]:Ļ!z/U]jhnCy[hȖUmiKk^>J)1/k^S;98FNǽdɒq3 =w?ں];vok՚Lj~V%8W745هܧi4>]7soZݧͽa\-zŋi >Yf?|o{ Y"_v5j{;&'q~-z~4颅۠~q*~n[-OBs4yքl6&-p-#ҋsssL\~'azO}_s\=0#vtSU^)=" zp?{EL%[`7moR[{Si?W=M3^Qm]>0ޕ6; j]cQW^`{9wt]X8S(ukOE w= {/S[=t:ikKVS^1~~Yں}Zڵ䣴3(+WuE?ڹwk9ʼuliW vǝ@M鶙zl858:IJ u.0 һE ~NE_W)LS5I&l{ ?Q>C.ל>Q u0Zg͐3pʼ=锆Ui8Uӷ 4 TMGnMmBX]`|=7t7֭QpV8 ~"Yw]u5FOTw-4&`o`"zuUCgշO[:g=;^:bf!{1~0?ZUM;Gw#''qieZ^4|ij͞=0C^;[-rG^N7BY LX؅Ǔ?_A G G5U]4Az}avtY Yr&U?OꜴAka|~oM zT-_U.NQl+0/۞?~ݺ;/7|~^и>gn}NN9lR!г2e+SUү8@ghѼ[ K_Q j"MIwhpMy]lufM4˿>UWi|Lλ355 יT9npƭ}MLScnÓ-9rՓ4;?Ao95=L xf=770̪@_%<餓x~D!Y.,~ +XKZY6⎕+7vti׵cظZݨMMrMfOIjHmuaYYԤ q53Cs'rrĉdR5'X#*>n =J?_%+a3GW©5K~= Ow.G;Z[_m˯֦d:ʎZ韚~սY}&hBx @]xƱfwoM \a`#0@#0@#0@#0@#0@#0@O,KVMFZ3[S2We0n| {#{ٽ!~^O5up!ujWKgiP~g¿Ŏa|bB7C;HDdk45sN<Y?Wn*ɚ1+>0t pP)%fIyAO,Kf?B]y2<7ߠ:"<;X-07;@5=:XcBqtc=g^U*}~>iMxJJM@ nIsuÄ'te]w>~7'jBZ:vwH?6\mkfxf8֛5eNxzΏO6W^>ZUν[7OiDc긣M|Ǚ׍;>yc=?־Jmo?MxD^8K6@;` i;Z P)YR cqȌgR.촞[g\-VNVl_ߏ  hxf 'kثM>v~f" L s&`8]SVn?a88ČOXn+uNl1)}LQغy8sǂϸUfM0}e6DŽv+c]7s>Vt_ޏpL*gYEٱX+7m+Wn^~LwhbR^TMXnb{mm}Dj2lXKǚkn 80챹wߜ*FN͙$>Ƭz{b 3Kgcf-t5nP  K޽DRp@^[kp|Vr ^Y>>>Y^ ˻&X:,wYf۪-O oRUx?r\7l޲t2GKnۦT#gqTJN?7ӂ9ڱE?yx6nJ٭R]U Ϟ|1U:tbtx;8Z~ֿ\nKvݴ#-R^KlvdD@T.^ihwJFmB?ݻnk [^H+TYuE8&m~bmh)F?Kc8TGM\®govn۹[>Q;*TWyT-cUeyxQo.C۶e?E_2R R蜘ϲx[z@m)ʠ³xT1ekChgJÎ&9{DzUU>xpNDŽ?4ۼ}>vV)UYfW uڄ#AhD3 7 uRzݵڰfUX3_~՟87EnCU8/ႏYUe,et_<|6-w_Ҷdٶˑt΅c~7(U#95N>}x"+/cۼEUM5jOTݮSOg& T?;:0s]'oۮ?-Sv_[X^q9 >  g[t҄?L:ۮ*l[eҩ_U5_ziJXeJB`A;6jK;՘QV^:5FNpXvTX7wՕc_ؒa՟ L?_ug p~|EUv, 'u:gPJڶ܄IObrI=ڕH*UP2Mh*ʪq`?ۻ/%+51ZU0t>f~埩sb%)[CJ55]}iea) S)r?A 8P=In\u}V0赺^y9%sVvI@-4?3I5#);t4jTYt8zBf?73=uXt'q]zzanu}fJl 0K~̤!зEV2Sa`~(hUV~&?]W#U_ƖgO &[0Yc}v=Z&ﳓקPM[tsЖ owVE]~}y|(w|h?@CZX6\ٗ?lJ?]&7\f+TYfBp" 3zczնF0P'w9ڶY/fv*VȪ/}xRSF>56pvt-q&KE]~`' kV"%ühyxP ]Q?o8qv-XTIu̸Q7W6/_ީ3GRNT ÿ03ټCO.]6}τ~QxwtE_tn\?@GVvOycٷc@Y/S]G+_] /SUêu'x9^KZ~L9h]8~XvɔV߿pX_G~wx_x9~зkvU`<"]3A 붒SF"M͵j^/ʃ`{3:3h^eKY_8M]s{`[>NZn;V\&],IZV CUn7QGSY響?,}WQVe u\9MZt52i|Z{mMxF]rIsiNU]iYsFʽ^㚖IV_u/ԢIZQ6&ȑ !z+.<H?u:uU ( )=F#뢍HlKTQU ~D!ֶ~R6Ԫ#%/wԒUjki F 4%~M8/ \S'c7o 8u.?f.=kjœ5UV_YUd%Uf&/Kd:vo"77( ZyICUwZGuuZfm-z%~Ik1u:,r/ kL_ۤhd͝73owBen_oB:Iz:wdϞeGKn[ԒUY˾[w-s;/V>{ќ]ׯ뮞ѭULiܗ~䆅Ugi >UdU/PX~;[#SW:Cueur:mMYo..xkC.4UofMuUMa~h~D{/TYrFw+$ Ou@!MUzcUу:ۄ/ Lz-Jz01 J;e8=p*sbI/)]72:uto><-} >v.9*UU=MyŤNߏ{QxUkwPq`TP{識j>ӍQW^]˖Ԕ5l`]zU{ȼe6Uoɪ6NURk{k*F7@Jر>~BA;wλh+T]/S:Uʇ3Uv 'V6E៉֊Ujn֔ ?K0oJ6jm ۞:̥w^K-m&hHyN\; pߺQAg%dïuלO>VOU=^8Tffv8y9ى` DeLeLp$Q,l%\.jI2̤?qKZ+? +8Ffrtu[v}ϲG[+zP 6s&>rG)-x-~O܊ְ:2{n]sLeo_U矢< ={B=gU鞅*YUa[UƋ2]:=*{w{^!TooN培^ϮjIkk)"7)9Qۈ6QO 52QSLMєrƴ^L5\ rSa՟ -_ < =//:'v'!jʴ?zhᓲ*ل_gOy_dvd]vg3[[ڛV4aSim_֢u_4]|:|f"<{JenyvFںs2lj+ٍ믦m;t57,+Qf_)9~Y_>)g̿-Z)V9>zuھ뽉=cr,\bVSO>V3]`|1YѪ[G Oy{܄?zmo0n.SRp> ;%`\KzMRVwUCan#>%7-\N?W+vE\[wm+юKzn6G\3{Imݗ46BtðR"ʂ EE˜JZˆ|_+fLquAH 6a.M_:i#\==9aBGRC?|H~/k֟1f"s߿?'^QuN}5rh?Yl js6a~Ҫz7s;j6[Qɯ,,|.~_+X:O1``{[k[jof10uo_?? .-q-m~Xj?g=h4Fh  , (ea Xf¿~R(i`[\޶Vj~dZ꿽ZUMejN82VXe*CjwU_Pc%C2a+w:d` :RUX5*LL+CD,(Ikݖc_!MLkoWMfn)"h)~OKMw=㺫?i[q! W_o^y/V]vvVA м켓7)6Ѣ_rr6/qLry]t?IfkwN/۞^q~W:t7zO҂_LȒVBk}4BϾSvoez7ծ[~/?\ϭlӋ/Թ=ͯ4x ?wG_X,:Zsnؼ?/{oIf &?܋[*;c53ŭ@_?}L>mПg?^/HMsDm6ly_MY[VH~sz+ +V20Q_%3!CVzWv8w`66%7ᆕj?P»; Wo9^Bm/.+ gKx7lHU{WV43qʃfډ$&{ 8.?c~Wߜ|h94vZY DƬOʮt6]Q+e aQ{*2=:70x}_W#*}<4S뗜(%qm<Yf|ݫ#9\~gqzyC~.85?zGsk;rhn]-em\SlW77UˑCh4F`E2_1S/O?lT=T\0]#j:ŒVǘ2ן#SQwa~m:%q?L >RAA`O15n<ܼ7.UhCϲ:o;q9̙x%vynj=Z[LZM YeWu: K6Q [à)|Qum!LMy'iٞ?Ao)9__. &)ꋪU/' W83s }P>]wu0=Uz/NbJ? ~@9QZU!]xQo?FPmG;UG!(@BVQ^:)WPv3/7z4>)7XIC؄ui+9ʑS#TaBR6 z78Klud*L(h:Q0JÉF|s]KޝBωsPH"{Ȁ7N`?ߎUV[\ nꂳO3ug_}t]kk^x 4)}90gxם{n{f8e;ʯղFOT7W$vAVՀP"_KVʬN_;* 뫏yZc8t?r>1L[|- s&7{]5y)8j+5ܑS$#muT;ꨵo{f]wlI\O`T8auE^a+uÇhynҘq,e+mЌY֘nي5Zے]k筗քkVQ~h?Zqͺf]-S}Fﲦ1x}ܚ7nv=;nGtfMx z^ͫ~8y9'k/_{AUUVo l3cyi[usjDYawm3ɬ+OgN,%~d>(~ŵ_MU jWc_;j1S$!z#+yGsI0 s&Hc ]>*Sb!]6S(Xk{/ndgVksTd S Z t:hN7@The?+7˩KX5\%嘒.?LiŶR ə1~˲*v-DBVNVU=|M546i+/N<-4(nXB7ʿWQ[ˎԬ/z/iGMOaďӪ_@}뢣4cy{|pf_VEwߟttj?sI M:M8YЫ~hfS2< V6Xi͖FKx T4 ->ڼKT&A]}0CX/2smjZߑ?lGeFRF,@K{]e?3^[?}f݋^[m];ff,;LaHڵ5`ֻ-&MLwW|/6n}z~k}_^oc~זD;-?Ϝo^wݫz\VM"gw[:Ͽ,==>W^7g/|_Ç<맏&d/Wba@/Q]gNCςaط<\:UJ9AgY&ӱ TE@"03^<8h4\`Ld=iӃ͜C\FY&+SqrZG t׉./,B@V+Rr9X~ܿ74j@ol%MQȈ5}L.8cRm,. nN;Xm jYp_}luX赢bA`꫽VTN:oQSg Z$wh ~x4}])nR?t5㪥linn}ԱQc Z Hq]/t_gT]dUV^t93?AjjnՔGnk˘0G_V}Nb*nޓjϱsxd+ugN7#=6Gy_&*웛lj|?3 Nl8.[v꺫j&^z_  1C7ÙM#uۓ+bӵAp+"VYjךTՇoڐp;ĩ vUۻEfXY.YWaK],/XR?Թk_fY6Tm`8Kuu/Ut]$nnޏDy>*ږrOˏgϨ}ϯڎ'plIWߥ]v~i3Hmmt6׭2=. i}0yK9tLJ{NNŲ=gv'hoh֥3Mys7l~_˵g{o&}7!1IJ+%mOg$.\v@g. ˆxBg+gL+5ϕcͷ T/Z=sy:T{)˄wz_AQ.ֵy%GvS#N01q Jhܵ(m)pxuf9H‰U1:fǟLHa+y<ks$'m/ &GGPhŠZ3OUۿo]3(X6A *jd1>9H-8~soe\U}˗UiS4.5K9zo裭;tė#;u͞`d\30T8zw7cf^s 渻 D2slΟ)Uz}C R{)rĉ t9ygAA@YotgS hB@3ܛ'>|lWx5`k]NSpuph @v? MR>h75yawYIhBh2MeYE?}l&$9ZL+.w-2ZUVN.ׅL4RyVeެk/z׼ka5beߺZl߲kϷ)SVn*?~&#$=d+Bpncf=-V'gXUޤvtΚ5خ5`5Ag+? M^EEMizg?f`ЫV(Jt)h5Oc'2n 3}L-@';_& 5sbğn^K j"CD$sNJ7>_] Rw=tzx؃,.n:A|›Ҏ0s$$[lPsԹ 0ѯFDf\90 tbOqv>*̄ <cVe @?_f/*L%`4_fݚ o[{dfLX?G^w_-0|<^n󫖛6GV ύ?^Ս-/"[ 3 :J@FkOB?N"ۍJ魭RְM NG:]yXnkk/?%̨z//̄f8&|Gn7 bNXh?7v(+0o;*oUUN47/ DZ@L+[fﮖLl*?b~I@2c3Fł872~ݪ(VY 1@ײ}ߌ&mn~Zhl`ѤfsOnv;5Ƿa%lىrXV@eo+riUj`kEu~8nv_'sbcߔT* )wz|Ҙa;\jV3vRsԒLm ?siLg*SQduu[T2~7VO>%5kc_3u?~s?:?ѯ<=u;}>g-c:zϳ?Ӊ\-鱟u-d *^X`Ǻ{ M(W[) ,}{,3v);G4d蹱P P*|_ ێl3H|?;v.u߾3x_/PgnNz>^5u9?S*:_|R:ݛ^d챺y5v{uVfKwg閖~έU2۹ҍW?Gc|~Tn8xLa*v*#kG *M_ivpʿ(3*^Į E]\+X+ɡ[&'b_z]oiczN:Zzm4cj'zuS]ֽn1Ms_3ehtmjԊ"@FR/i~Mz[;E-jhB;3{K٪ʫa0nl_7/S^؀*0`<>hZNs7AE`5tF M.1ޒ]1ۉOui߅/~B,-du޶YfUn^f?rL<ԍƟӀA _RxJb,t]2?}5dyݺپ9Nb`>,]ؠ% 7H'-Sx^sld#7g]uZOㆷKuS _y#^S/X>.@/(GmJjv{+ Z?5^Wݫ-lܼXh6Xd&MAs :y^Wm _f"\<>њǂ13F_y/zی7F?Ou+*?nyJ;JM^ϡ[0}_lj.=M-Y~:Sm.έOqv{}p4T.w-@_A KZ\2jևJz_6+3]{wx#lo{آÐQJ(SB(xt]}s˻޹/*/7Sr}Z1Z{4-z@eeZw:yhmkflмLwcX}a[c {}qfԯڨp۱chYtS[:zϩfm{p%JO>c]n56nqOsi ~݊Jm|FЉyVDUsJ:{n-GНϩN}2m)wN>s4Lcwr.kt?y4C_Vu{^jygןbՈݨz~`pxZKW~KTʭoإ/ i1_ŊF 3ͭ\cݎxmK5¾97:#N3Nᡩv[2-2UOm⩡ȗѺnonn{]jBD'~1{ߑ~OzrX/rgx{Մ}?[V7Ur3ʄ\rܮ. +[.>]~Nֹy\6Wo==8.#6|Ws}״B6ɞ1%6fӰNk?h*^կsZYxݴDXZeVFe*\7`;6lVv7o!`c7SE:9K;R*vvbKwtZ7u`n<4Q7^c Y;j_h̻Ѻ VKKy_7mԼMm[{7]HW+MwE:leEY pjlToE'~7oRﱆs9;]Z}] ӡ^bĶ{Z^:m?c-u\W 8%vD/е|A~ZϜr,wO7>ˊn^Qv5|+W^q[*E]&(Uz6\,hV2*9_-&۽^seʻ5'pfN%d+jB[v3GwNL;pfvk-5{iaKWD hշf' rOlԾtsjoNƺ0sSs>qNCQǡcQA@/t @SgyfMcUo(.otx=]PO' )4Gt_~il?u29"mk|1\7wpžtX\'iܦAm~.`?!zivI|'/ @05+uuꛩֳ XJsikQ?2! {5!tFj =ɉ4nt{n2o\~[}>fsnV~K-vZFpx_Y캕wwkF%"# .uNۑⱞݰ>X栒yVͤc RTTү3#fdZZ~r҂jlv]؍ݮΫO~n'y"m5[ Ks<ۏBG ڥ Dk?}ǻG4bc=.o75`^BR/[ @#[Ԭv%qZ"5\)^MenwB@mX6羖v5/t&FRO~'`׿v ֈLWLcUa/WeǶ?`W ܆pd/M#E @/>0+uvNk>75lqD JEP^ hKRZnzkۊbj[\ZBк\+(EATTV1UH!̜əL2 $139ۜdNSP9w=@7FW`J  3^`/^[Wp1gk"ꨢ2Xiw` sK }k5m):k@]I$z]@Ծb-_fYg[W{?(p%7v:C:/l0OeGv~PuSBC8xX*w@o*PuT_PRéWX3JuQgo!cT?8>c sn ϻbT@=FQvݿ?a@/@ t@;t:?PTnܯ`i[( $OXvZgsGۅS@@*+_jT(3@:]j[;:-}16JJ QޠRš_LVUgTw-<0"jύaU5RKo[6UeHٻ}=mS lX(W1JW s#TU?uWXu7XWZ+˖NOMVxw4˶HKpvy`uKPЁ`U "X/Zji{-:=⚀*@>Qqi=y=Qb jȁ@ٯgϽ_a"R PGyuYhgq_{-rsXmU$wH*@/{9wMXFS\={(8G :8NU:$EW"#:AM4bYcmx]K]+r*CG~䨊hk HIԵQB@@GzȫARޜREс< ZTgھWڻ/wtb +ѱ9*;Xz?oIԨ%CQu$w35-t B|}BIQ[R*L fnTz @p,=Q]I@ET{Goadş;b}AQ854n@ )n_jx Tg^Jx]o~töP-ߦm&)Qs7sw#[-/+Wζ B?[9 1 !PԈ%JzrmZ5b[G(QKlBiM+ADmwn*:#~:VzEF% a@Uz `eE}N 4K#8܃Z@w~=9S# )p84TFԨQ5v *a8iRYX uhJ<Ϯ`I/J!ꨒWJ`UUzGoVPW,:?s&Eqp:ZxDG^3SRG og8"ԋb~޵Ā< ~ݿq " ~) JB, ^нnTx4U`rTs$:*,s`_Amn?/t/׭8F_I?/9 อXIu{)IBi[TXș_l]tSɫ ]uKJ@5`ϒ"?#( pEVJށb}>Y_J0+p~u:1~ Q nnWĨjFF?V\ t:??V+Yt̹]7}+jO]xK"A7_?Zt9m̟_?RQqֿj׺i;W;Tg_hpVn_Uό0gj}q'=Jk·w_s|Y.@ E rM -SR$n()pi B??K BW_ϛF}\|qV69=ͬ2zkԳƤټ>@3W[mze/۰WW|Ai iփ.{nԦpI4(耭6zmoܟ͛6;/Ա^`/P#(/* Sڿұ~~Q:5c?w@PHUCo[Α<;;Ǽ n:ٽ!ET|Z ^ 5)cf xpL1~s&s-Dvy( xfhЇx'LOXؼ'%w?R{`F:ʹaǡ}{]+Rۮ xz&-˄oJN n=_ݭ y1 PGyw?/ փwo@E_Ty^?/ QK7P6 D:RZ֥V#Wkٟ&Q=,3J֘*wUn{^Fÿtl -p$e9?;SoֈlzMX-3uFXWEʭ[^_unj٬QܿQvNk[ugzJ?p dw@[y ~Fn_'{w1X~svMνSoН+u廿L"0TJ.x+JWhLpt7#tgF{t.~P©T~7@2O߼5BfM! :~:Ok 25xz&TO @LWV>}*Vb.ӽ6މqj7W(;U8z@~k)w*T4DE(Y%*3-pP`P3YOáAqGKgm^]`j2mޮ*msWn~!@=GU?yot՟W]Ž NF lM;r\mYQMUCހo*i+ڱb미^[vAx[sap*' ;ǒ,ػ +-Ha?Xpu"+۟L_8%|nۼbݶ;ZTg|An=Xr Y@r!* ?UE\u^{/8HFnDjeEkprmqGpj[i/ surZ_`cj֓ڨ^\7@rmE U:0mn}Pzh$-ԱԐDi=w+1}ݞI^Xٓ{V6S-n%E+kݶT77Бc /0qP1 0PWy=qrKe q]q?-3{c/if9Kᄃ6"uz%\]|roWBG5t2 3CU>9TCmc4&b1 ƌ[3^8 ;k5= 6kBnn.TkXjȰ9k4{2| ,92& 貯S]a+-?p[6˝ϬЌ^(b bO y\J ,'NM |Sojtkg. *˯j=7g=8p`{zΙPC0kM{P{XB[Q J;MJwO-OwUQF~n1nO77VUOY9پ~Tww&z thҭIG_>г"E_`?`tY @cU8q뗿;sڀ#U 54tRfk&3ݙw~}Kj2A^U;tT-U2ZXY *4-r]q!:+$E` IHb@# $F$1@ IHb@# $֐SM.)' $F$1@ IHb@# $F$1@ IHb@k)ڣqu(_g(PcjޮH ܶjFڱ<:#reԺ]z]^KldIvJ1Au4OqkvJN?ξ Syas}2   zAACtVj,͝1׉00Z~~G[n[サP%%%|jS {7&>[ݺuSzzzwƍ\tE2d<̈wܩ%Kwu_9rvܦM4w\टd}ޥ=:mmCQ~,}N{z=i_ിji봷 vg9O>ɭ/eJ4zحIKU`CSvZ9V zv^yX].ڹ-STt4 HvO+}b-tzv]pPo~NZ-)HjnݺA ¿ۗYY ͳ6?ںmmwn<Ӻ1 ng{bւpzrŮ+IUNcE3w9[߄e\^UGm 7+Сzi:8/+On駜9A};__ -^&Oj͌VLeF?ڳ!GY~[q^U//fbę;w6LS64l4w޲e7qڻ:wk9i?D:kFv)moCJmFZPB+ |S;5'm՘ pHz_gޒպmw8|noߖ"rۏuV8+kqjj3&>Mta?:OZf?'BX!`yˣ]cC9`,-]{yXʿ}|b} rv;f'ٳ95ec7o窦Z:[GdYOi1 ;KW\Q]^z:c~T\Lg,^X៱6.p~mwnO mwn;VM VrKXӀ.w06{۩shޏv] nk@!z)5 v=xyPdZ<8ilaӮS}OWXޱ2W7_4裛'҄z[t>qX[X^P;?w4LS6tg_|~iowuC~{p=iOy8X hS oݬYj{Y m%hmtS;զQwPIz@kUWTt‹£}7 Iڸ.mxoۣo%ncWW뫃.׷xSNJԦ.WZZZ<6*]0Vhm]v]v1em8q{ʿ5k,={y=4힇6T;i_ഇ^|>iUϚ'N}nEݷ/'٠Frx6n^u;z0Ue]NAGKz3kv`wyT7?5k1oh|߳0[lڴ }. ll_ 8p@K, ߟ;wn̠YNg[Ew;|l8s۝6oiرmwnۼ |ϧoJI h;͵w]Ϟ5MtxWC5jPpbhwƙHN^|av}ZtVϛFH #2O7zЄ77im6k׮uTEwZŚbkcd_ڰ Pg-OIJ9<ϭn0^<ȽZ)P_ Qڷ?K tqxݶyv{R?-Ѿ϶>YO~34Oo8 $‚M2Xoy_WξOimcpNL5xwLH {5Oce㕖Vvgmo,4S4ә7s\Umu|,=w L`U=nTUˌjwA(֧OwMzk|b68I񟬧~/NgS[TϻOZU7 ?moy~zKdtׇzKӷBUμ/]CK|;bzkܶJt߫U^}k^^';/7?Fo^n.y))JmPMU}n_xbwyXXvxC뫚/mYV#w+أWۻ6͸}1$sӸQ~oDQJm_[S@۪3FДwfj3o̓|b1SG;3 ;n kcxX[˓y0{Xbkꡛ-VfjLmZvmL?.: 5-JKѵ3ӼU34M2Sb)_T}*no6u㻼_V]5FT]Eӝyn2ڵ֣G]/N&,ѐU uoF9rs,{nVdܶyw>_:s6~ܮnۼ.}JOi‘uWL=pTp{ޝi‹ut׆2i#\_T;S$۵io¿K~7oVZSB.7e|i;+5DKf0{PZ13Z4m͒{eq3/{mY-oCW{yw~rטmo&v iSmƭz_#cA_@V/ct_0صkzRum]M-QU fտWѣU}9#ӝm?}Zjtvpܥo߾x7UonٽE.\ålbjDuۋٟ+FcrY[U{VEr`iμW 1jq*Vw? l^hts ה0<3u\s񺺯]O翆5k,=iokoQC5 uAT7[7kAK/Ӣ *>zswT8ǭQgА^ϽU=Gݮ.iVzpv }B*-a|gL-;ZVSٳ/rZVZsCAܤn'||ev v?A/v@2X_(p}_;n!̿6 ѾDN%J1~۷E@&V>'E7Ft1=|D<9]Te󩽫uzǕ5~;-W:I =stnzq} wZ+stNN{ wZ8i?u-*(쾷kգ-jQToR"w@uPg.{]1朶 YZSݑ"?.`o/^]߶}ޠ?FJ= 5ܱU=0Q+#dmTkuȔp,p8SUbԧ^ָ%CF^'^N,,9K3iɺ$s]fCh^BczʮD#}ؘ}VUWzfcPEMVV\sU4MMf3)ut,(k:0L׍2LLg^ܮ4 f!WWv]C֗E@ bĪ'uB{+|>"sыkS;pM+Ƶ6o4vӞkwnۼŋرNopm6Wott{(YKOXv7Zӊ.;t!ݳOݯ)zK-mϓvzp_nt•QwVό}}{j İs6=/t˄Qdmމ^o+Ufn{XT7D68SYnxJ 3dETƨl,{o Mg2LQ'9tVS-꫌ЖRms샇*֡-;bo玎T*s wJ؆lmTqٚ* jSۮvm!v v.kW^Kl^,SsrYj]b浍1Km f-}O ߠwQ1DHs}׋< vÎZN'Ki!Evn*ok}~J洈WhlF{UBӵUk[= 5j!Zs3uO7$: `EQe|eH*|{e2FLufǮsnHJӽcfƕ}L-Q/u_cns@n_ W}" )Ӆڿ)xv} ]n3DC@ =^¿x~)qvl]{:oeWo@Mi)슊 7lȹ}q&}'rїU]:|nWBiˌso/r+:VTtvbZ5Yf%W(e]h&:<қw[gVnXi۴}J)`d=oh qL$:Xśrx:ҝܳJfop߫V/}KWݯUT˴,jeΫag`:cׄ|Zg~5,J Jޑ~m7k,wȺYܩZN'ԉ|>}=nΪ|jVf^vӞ՞ku[E{~SFJm g'ڈ/[6^@- |uz}}H16SӐ|}TZ)jܢD= VYXt4 ߆W[{ͿN_ >;W5/EZvs~gT{1T{{Ypz{jJJ ,'KojR}SCdl茇׮m8 /e֚x8߿NOTy۷jxo6jͳUy6Jq&5S:+C#B=U;Z;oMevnڗuH/ͬZ6nwnPC^V[țo?r6.o9ɲ VQd݂9>$q~{ܭ:Ju8+C͛pWۖmӶm֘_N-?;Vg#J_)pDNtqo+uνA%s9uH#n@ 6:;2\8Zi٥ד3]7T3$8cVԙ߸5jt؆FgYFj6M 6pÿufF %y:.k`m{uotN֛.'L tPO~W|~_''ܠo=^C'(z7#esf34g.Պ?srk&,ƭTi%ܧ\Q ϻ 6_ !oqO=6wu]^q9wC9i?j㴏uC۽ۺ[+vUf<~kw׹s3Up ;5i]kکoӧpQ- Ŝzk/wضlwԇ3~C~Fg[O;]Xm\"v?.ںR|[ǔ~ Nѕ Fϐb 96mxwns-^ܶy>ϧoOh&jաHC[ R+~x݁+ 4 h{oϚ&tN8k,[[T~_ P =M_˯+קMSArMorns;j UޱP?z* h׽ׁ襄G":yqbMK+w?5m}m^jnn5F}v?P~_jȁԊhvjb:CIT\{@6mV2M4ѣ,z4u%?9=ƩwճlyS{Sn79r95]2֨"y MW*sB뢀/S0^Fn2ndQDw_Vs')moC*mG5tZ m+\Mvڶ-:H/>o8`:quL͝vZ]=nNbxZZgW~EWB@kU  'NnaZE a·|_{*n'\NVczK{ G蚧whpzr%6XYoB2.s߶V7ڨ`*'F!zF}clˍtu`^N}{?՛o~[[eGթy]-Ztpޮ9C-qh '- lY?Wz,9KJGteB]GhM:O68֭s ټp}9?n崏='Z7n'EAN޼zU!Ǩ#_{tv[w8V5i`5`Nv#Xԭ,ZC}_T@Sx6kNTHb@# $F$1@ IHb@# r $>wyqJTIHb@# = p"NNPGQ$1@ IHb@# $F$1@ IHb@# $F[51=]Qӈi_Xv^›?u6>/&:"+nTQ3:H'WDjHjGM]9NrS:ȹ1Q{W<nT8N0@>]tHKk&Eu2l%^ĉ1Me:~1=׍lD0lk}@H1"@ύ5zFpC%џֽ82_LQZ-ߧY2qϨr?? Pi_D}݅s"ܶ|M=BuMB݌s^ZFq_|5νA#P׌xb~ύ+ϑ} /G~(㺢t>Kf^gUB_ê_@챗u zu5ف=Ю˕#.F*0xsAy%D*s#A#U}>Ytv/ԙ1:Xga`l|7W:ءm{u DW]Je_4uUx^)pzbZQmjq=>P?&Y7_Q}RG󾌅Ќts#X|U}| w?M$V8j;@k!.~>zFKFuBtzҰ.Y]u۽/ sc9 r۽n XW0t-`GT1ku# 1zn&puDJ ,'͗M |Sojtk׮}mv^ϺV c$MժyQRгsXh*Mž7| @'ojrPSr ,=xʹ@܋?~HFj]$F$1@ IHb@# $F$1@ IHb@k)꧷~ue]vR$ԯ_?^#N:@8p '+VԊhٲ%OC"P+Hb@ 0@ׂ j*۷O5R۶mէO 2D-Z$IO>3<ƍov@$7$}~跿~򓟨o߾n{}G0चJ8?fF(=}}QVe=@2"^7MeddpGlR]x7ٱZW׹KFۻwoxqVXcjSM>zw|~/BxD^]\&:e,>Ӷ=k׮ ?n{muy}csf!9I۶m6=֏^M>b^>3gX_B֭[UV֭N]s5 |O^Z7Ckn__1Wخ?ﴗNoWٶg]qUu;0}÷7P=cZ=SF5<8ym0H<#'&-EǹP2Fix5}Tg]ƨ^/#spT4}2&-׻q,z)vٳ+ _UDnUQyq:0zamc,3zMymˎ;_FW׏{5a䗿{Nl62- SO=5zlj2~xw}q;4h nUW]^~[\XXX쩫nJ=[M0"u/w4&tM+}Ґ*b{'Zq$-_H8W n5G9}LCmk1Y3tmcm}O^oF%_ l6ޕ~, gxbmz<44~l׮NGYzu*w ɓ#~txS&taJAh{-znZ7k[%vr_~.#Py9hsپEw =j_L*m{k*=FSxu_L2"zFL&j~͚~C1#[] 3Ԁ+ܼ5\_5zSXS# |XQ^uwǴ*6wm T]nQm febACc/V vG,?V{^^*=f;Xu?j [4 άkmǫjʪ\>,Xj˫S ͌fZ@>saAuqbAwg;GU2򶞭m` 9nۼDm۞^VQ{}xm{y]׽ɛu=^]m9=b{yt͛WY-SYǎӳ>]v&M^JMMuuҥ ]GKY@u[Xu4}ԂЪhۮ]*lBR g,cUe^N: =4V caW gQcƌX*&zт,xs=W/R>͂%*eԩSUw]>c7ۧ*|X8ղeK_ͪl1vy yyye*ͯ>[O>d88*Xϱuiא.v-39nvm{v˫`'o}c۵{U_WɫLsgϫZ7bۦyknzu붊J/p@{rhmc{Eͳ#<Ο??˛ݶy]( !/_׿}-co?e:)闇˖V3hpai7lK]&@۷lP>=ղLƶZvY-K>օ`!Ԝ`5Mcy+mZ2&͊gLSw/` ?D8j^fq6\9S=VnTV| PZ1 /8J)o+c^Q$)ulhMՂZpf۵ª׺]::_}]m#V@㱰$;f %m]?ixÚ5kܟyr5 ZlqYWQWy=v=;ߡC"2xlN;RۼyJ9O~^ ҋٹ.Uڊ^ud]C2Z'jzz^-{VhUtySkzmo酮]cD\UǗ/V ֵAn .O[GjjފQVB=էn9{koiC8۵%gz99uU`:{١\WW1Ddh9H۬p9qðރ:XJD>މsEiټd6wgZX_0R#5WoΟGהyc^ U6R6@*J 7giuk(p<.Y74T7~sYm?4lzemx~wż ` m; >GHrYQ횋__Xcy;j[u|i۴]v0駟v[pҸc*W; M%t=Xnd݂4AgkU~9ϊJWUn'_mZBU]aZ۟Cj \]t۽4i$i*1%7iztF"ږOGK֫n~q ~U5F3k&4pHU։'bnH^\Vd]?Ϋ 27ntzY*b:%N K2˺]F^XǚuimlZP/`ysUVhϫUYe{>9pj[ln_}qcAU΁ExkϺ{έεv=oHddi;gkYk^Mv%۴isBBj;WgUvuhݦqrUǗ}whUʁ@ 沯K?Kkeϫ4jP[Kvjz9uugaη͊͟Y-W.ڵZ) YwJlJo-#rWIg$|Bڪtފ{=zCzÿ+~b] =^/ԕ׽k{yf~уiR!s cf]l1CA[otW[UQv}H8?Yڜ{OVf* 8cV(VW9 y5Xb6OVIbXصŌTUUechRͻ.-95·0ZrծUW. ,tκf}9:ۇDX5׽=6  ޷HۿWӂd|O~vW\%;oV}f4 d;6۟+VNm;la]c0^aY圝ۿ~nIy}?gA;xy.[g;&~VYYFPGf[@ NFdcQ;"iS#S:6LSM"`n!ԩ5k@o/ !F1@B b#@ !F1@Bl>Mԧ5k;@{'}{W`; (ˣ Ѽw{ZPJPݲ3%qO[jfzXP[}o㼹0s>4wI%s?} \׾AEdR8d{kRV.wBKo]GwmKkuq6C uvQ96YzVrFJq>|Bs갘~b>FH^[0]YMVUڻSDu=ך8kw;3?]qyeu6hs١f-jG[{퐞sY4z(U?i69*>8G杏ί|_}@}"LKi9orPn^'̑]ˮo!'rٷOIe55W<,7ZSCi}6OW~tvٰɜZ8`f{anL.Vz6z^]!TLƒY%?̴9~Bc֫mxlnzF4T]_W>?9 "#^H9T%t @ePE r,=u ?}L2+P.SˎL|TvNnWۊ%&WNJ<?9~v;931|_P(yGSƟ_KQx ѣGK^9۶I=:}2y7fW[~f8*dJnƕuj*W\{>Ə:Fۻe{S{o/Ic# e[a=]JLU2e4^/]ﬔ?6QQ bPl^,_oM6~]lSG! smƇ= /4iZA-'ؖyem9Q-~zAEYF|I_yc<>Yt |w .ey.3~\>-lqے-B i~ 37@bD@u;% !F1@B b#@ !F1@B b#@ !F1@ͧ ԣ{F5k uW!O)@B)L&We޼yUwߕ\yy뭷{gy\~r5v iAPz@ / xjA'xB~_ʧ~_ctP?A:;;媫b9@;$wB63_&OMhW<,7>Kn[@{u`+zBg*ж 9=j..ȣҽp}|6ut{6ˢEe5;jl^twu}7-pv;rK"{6/{JPQM%SN]):fֵ}vu_wn_5꘿Omwz_Jc6{~O07R@{cIPn袋GuԺ> uQ9Tb#GZFG!jTE$SnjSdw~+d^|*Ǡ]?/e<"Ļ<7CGk&m+[DncAZUF:^Kn#rۗ'9jkr# 1@{n?Gv5O[/֣ ?C @^Se.Ab sϞ=rw|~lr뇏JzjSdf[PN{庢j[u?sE >|S)]' dlS_l}.e`^V* 1GMe̛7>u1=* 역MܼzJ-5Umcf< PY|ܰٵ}1`f*rY 2=/eb{pǩݬQNmզՌ׸Աrگfu̕m:SJG[:ǤHO.kǡm߷y*a{/?/2jJ~+ٵkWg=YfC>?pA?x So|vZzjř/^{-p=VN@;(sPJ&6Bpmi>9`x&}z[sDwv#eGn rs?o׵kNJAe5o-P`/[SOO@s"wTa,Y$vjY<ʹg<~mݶ[ yNm֦~wcK#sޖC~z`"]4˷;L.Ѿɵi龙>h%|g@YN?tٲenӔ+ ukܶil~O=ۻ[^(Mb m/qlҙm gܧrkFsˊ6B'A+CʖըKS]ue*9qz irw_W6-y|D??@]oS/?^׮~g~J&WQƥrۮ~&xo?8l Fcٞjr~~ꩧm@[z:z[ԃ;x]jۣ_n&{^%X"I5z~SxU`,OD͏A̓VoZJmmml|h^3\~lXH -wUje}OVQVl+:i{#F9mSˌxs0ֵiEe ĽMKXI)l+wς_mg↽rڣi>SiK2Sxٶ~۲A2 VN,d6,֯Wmm¸]/>Vke1*P)gq3m1rܶmf#uOnU^1{[=We6vٮIӒ???._|Q~i?|_Z# ϧ~*=/t:;K.DN?t9*ˑ#G(W^yEyꪫ =drʾ}t𯹹Y~H<kFO=suP-wի:j]5O߯0oTaJE ]nU5L/5 -e] e@ys2K\F=>7۴eVu2{Vѹ s,q8bhؽrYgI,~wԺ[o38C^z%P|*._~>[@ %ҿW2p0A.KIW#{-!ǺqZԟNKTҖW۵I"/tR"Lxu?㳹 \[o%կ%Kȏ~# N /Aŋ˻++ h!KHht7p:H*]ݸL%Zݸo*!ÕZuq“pu>7:vrr)lݺU/^T*E a"(ң[g8M,b96lq^̥7]; xߪz=J}ϵl{{dmPwz~:~Յ.+@޽[OUSv;::wZ7oNs… /To` IfFYM2NGd7l";#1NCBi0j͐t$|GDz"2hӢ[]>WaMjjwcePO4JWOLa_jU'JX)i$2ʸE)KzzUϘItlZC;ٟ#!=)[O4,*CˌV+eiGAڴգ{)t鼲tG畻:E_kKUou==Q)c#FZBu4.\~nGc?xs@D:r| m<~*:m9OW^ǒ3\w8˪90GwB5PxUys|_(M=C=CQ+5ztM?On]g!mlNLtqLH8$Dh4f^\&D:F*h.#1?XmJe^%[n?mn֨,`\g/'`<>*䤌GcS5zT6>ho"Nmi/?5/ 6FFY\~F啻d{i խo8bc n_~*خh@fqśi ,Ndq|=_ǻ Ǥ0#s-_9'Ⱥ Kq *ԣJǒ\öP 7&8|_(mllL?I.袚/Y.R=x޽_{vH ߏX#ҵ*MSb,x{@Z,9r+dS! 3xV})Pgk^'ҧ^==.-<1 ڦ t+9}8>$j g)ͲEs#άNwG|8 Z>̵ ֣RUۭ4j=;\Rf0'|"+իWA]c)A zc)w[57ݓ_ʟP JWmTVsR2o@@#~>w9y睧L&UNU)zʝu;g|=tt*ɭ)=wVYs)g~/ܮm n~閈ZsRyW)ӜS3q'fIɌ#k:fP:\f:hðL=#Fr>JűMᖮk27 LOȘ5?^CD܇К}MjԠj!IMv|96?i؈4ɬRf?¹t)<ˬGcLV4 ߳#W X櫍jV2>WWLUWPk3p2϶̷-'8rϥ^׿ַmk=x˖-{+V 7@'KjG4%Ǥk?H^&)~GjXW#] 4Ȥ)P~'; u;.3sܶ-mKڶ1`f0Sy%L[-(Pk}ݹi;0BSG?/L[V^o6;\5@95q$cNOlKاs|O! J%?PN=T_??cv@jtԽPKZ; [T%8s;v uO?? /P^{5󵝵7=@Zp7xgxo 'w}W<3L@:#G}9A@+/+oP{:d+;A@+/+oP{:l29_7xtT__ATꫯ<#HR")]0/7.Y re%ftVζ*WE|ոno>odԂ YgϞ:SS+t\g׾59餓g%c1j-u"ܣbԢγ~0چ~[Fga@ ' /V ͓`Yg%+WԿw>y|C߿oV`)UqihhKP 4d׋Zo)gﻦoKwx`4K!Co4W.JjŹe`9eW,{ʣk[G {vqKym]?*gI^Fn>s\h%i`uǤy&p.90o1ulW>s(YB>|Lz6E~^pkmG;K6/|.&u~VG?N+>dsU:LکC"M ΩL-ܢG>|X~*Nߗ۷ˑ#G3ϔ뼪Ǹxj]2U@24Kcκk쒞ظL&~Fٴ.Sf@rx_}]=ƚznT2tuD$hfdzu/]ܔۖ甏gt&@$A ^<< qP~k_y9siC9}Bש|U)=bstxB:z:Tx噎s*@ r|ߗ/}K / z:p^z%tZ*M#tԯ6=$)ѹPY^sW}35y*lm9 lУR2nV>1s~25<>ol)VzRxr׹|zBvʭ*\r曒H$}~uʽޫ/ZHbs93S)uMOj\&͒a{K~%'e<$W"ߪˣnޞ77n:5vIҸҞ(f+Q׺.^-/,M>j΍Nfq0?ϲv<;[T_m.Σ<mp9=N9G(Q>s4}VVI3QA9p*dvi@V^-'tLLL/~ \yy뭷Ԣ~WٳG}gT_u?z:iiUi[NN**b׷n~閈JsR۾l^7>3>vb+. z}{@xkԯD\^VxsжY,?єD:[.=gsۨ4OvQsgwIOjq#WZ9,ӧ+<z:WoĄ-9 j8 ö`[ٖD^S۽{<3FuOMܠv9t`Pё!^iJIWcH/-@@>'qeƯm9n[ҶEA3c>M駟.wdڵ255%_]y:jt… ϖKe4ޜ2*j,.a_G3SDM[Yx:/ ¨UӳmOJZ"ҝW~W8pTcrl+3u)```! @B b#@ !F1@B bi^>cC믿.;vL6oknn'k|=\T]zjZW<~<rauJ!nzihԬiAUPJ H{%T2x%ےi{si@a48lg:lomTU3<4U,6eXj}̶c /ñ Gꫯo!gub1wK}OnV93䥗^^{%$6X4m쒱t5 tg>m,#1HC|_~I3ێ f{? }{< -A.*:ffSgsxSεQrT@[oɯ~+=wɒ%H.ӻ upʯ*D)¾VM?c#2j:(*&ު]4vhiF$ʞ<:go~S[nEN9唊Ui-Z*UM2.ݑ)hi_j5%`hnii),si LJ#S|G;GԨVqz.C| shuغּ#M*6.C;5TQ;2iN&neF g۪` nKmkaӿNWI[.;Qo9q)߮mM 8wܨܠZ/|_67Y<R^{c|픦y6H:~ǚkljwO4Gn~(>u˚>5=T`fb*,ݶ8V8LO3M[VwL_ҟ5L7L02!=:щ.G?){Wnc Wf[Sr!8"қ)oPHzMM#q굞qi]g[gtX&mU<q}\u,mJg<:[=fJ78 ltXs.Gm|'=UI9}rNRwv+AΟA:<__*w=#<G}ͩ*7ts ^3^ O&sjJ&?'wYT:Bk*ͨNGbNi6I7ac=D(QO7e( yN:W^,Y#fGCQRtHx=:~1G&ⒷcYH픡8˥yG[T}Qǚc9JmvF>_闳<'y8ӷVAc9i@Omjj.>{w^)_K/Ӎ[Zʦ ѩ^hvHȷqRȈnʩg2cKŒ|G-)I=鶊dT=XֵV'E=)-ҟ̌6X~HJ;}["HZ4f㦱]:dHvTPC[II [{cXy -}nqtk娇0ڷe6 [:'D/իW +_GSiwK_?۩`Njo9(imHv,U2'pxh\h=ur4q&%EҼɌ I^ӠʾuIO\^Uv.T4E- ,&7o+q\>n=(U:z=!}jB,͹G~EǯL%}$y~|V=ѥ}5o:~'uw6L/3 P<߳>6_W _B]9#w3T5m9![PU{)+5}qY `HnNpn4wHB_ĄK0Ⱦp<*˺\}_癲H`v+|픦[㧾^Vڼ4='#wuϷsg4\H{FԠmI-'ؖyem9Q-{.(׿Uַ{;u/2}?q=xŊr 7Դ}U`gx ^iJU4rn׳%f55-2)=gЧy6<嘩6 +w"m9n[ҶEA3@zWK.$v*xj S-Zw-/dzK=#$ 'w/@s_wn[=fK{|OG?Szغuk-[߮QR2ТIxK=VLsՃr뵺Y]Olho `6!)%h_Ϗ?F9+ϥzษl t7XL>'Ӗ{w7=@Zpiûᆱq @Nwy#G-O+/+oP{:d瞛<@ԲeO_~Yx㍚˫D"(5 - -l4. g-V:h9U-x~e@Rӿo`Ԃ YgϞ{nk_tI`k-dT-!OJzK Oi~O?-/E]T|͓z*:(`p";e%ߥ`.c P:,Yrw|G%ٲeKRʇ~(=fOL]m̔ 4FnJpZDof*}N^I٦ [SLu*UfzVeeMUK{ܽ qWmgo׵ <ꖝk]~-Z$ϕ;Uxx_y=vf_咎c ӳ 0ܚ5k /~[UKرc:ͣG_,\sMiEehgJ$SĔz=%юvɍm$ƻ :XHZ҃GnH6엨ms~6I,CQok4 XdZbk5i [}FTTe4LKErtǻ#hmo:!=ƺI/bDS޾i}<o3ScO yz:3 unr-y_>}er93e:r5w%M&E2IL\vJJ6>hυy6.P K= ,іѥPlӺNtPoZd]kyyYUc2LP@CP +`X-.oãE-VzKș)Cc+P)x5 r髟4#@N9/_җ^A@trKr}T*mGEۥCE_&d@f&U|&O kXadmZe]&(;GQuzd^9y=KF:a}j;EɎțZT۴n7>!=JSkyY͌2FVqaAk]6y]yti\Ճuݻw3<#mT௹Y_ TvAs]f|n[ٖ%m[03~|G֮]+SSSr!ywޑ?PF-\P>lYt,_\,X@0O/\/`!aB b#@ !F1@B b#@ !F1@B b#@sĨqihhITR": X8BOMpig9^yͿiݶm#B\mKHl$-.ib4vXzLˬì([Eu*eQZy}sJ?G¾K?\{>@sTT"|^ '( E5M2.ݑig RizUCfpئ 70Ϧ+[\|Р RO2 ꣒H 8]Xonu*[ 尷 1GȵrۧzGTT̘[̣0 ]Flhb_s)cYVΒmmr/8~؏ ҇KCxˡ-|cNJC:?s~Rr6CY_r8Fl۹ܶgM*~ٞkLw(5Akus㹶4Ms`ڥiXL f ~h, c9Xd,g˹r\b,_1KفtI$f=O:KμTXh63E3+Z/*Uނ2ny)]&ټl.L,Gyc_qjHf}%[G.E|͕|˂2&Q{Zet*:2cCU?J~֏{]f;czm]~~w6!گlmٗK1rvFmʚ;yCӡ|}ϔ8J^vϝz|]Y[s?_Ku1K.1S5[d^ǜb^לh^`^`a¥uQnU LHLֵ5vIOl\&~JG{7a8<$DȢy0mk[w/m Vڥ~WvDDhNt~RΤcӍt[v߭5cXfM͍71lм,/(˚uv/sXVNmUDž>zϦX*_yJ8R;eh<&=7+1oU.'~Gڦ9wv=_ʫ/;)wb*3xxB:z:DvSbO=u( ڴDPGR[K s)ysLϕ>Ao @aʦ 5.R2$T+i!3Sꥦ wRNIwGJ>955ONfv)c%m9w,٠qWj.)1Gq4K Δ tH{z=)I~-=]ڡM w*>+Oϒ;jOy `G@訑[2'}n\&͒a}zֿG)jWykDVc4bU*Y>ϵ^I6~Vv4h\Lףr#ȼhF#z%.eJ`ÞoVFZߓ6.җ`kߪݱTz~5 NCm~t˷j(W??6~w|ֽ>3ϊQc$?GѫtZzB&Uy~xv}VЦ}>*;dD|t(kn5FVxwԺ}U5ͦ9!"jdL{"Cґst2eP r,.8Ze]*SޢFוmy˞&nu:'9Dm:ml62b#)_jQvU~ןonM {FQhqTjT^M^et*KwU6v#)}fǒz.K~ߩ56"Ͷ3zEcu?[y߫M?<ٙ~+iS>o?U'cԈqnjG1u?-b@%l#0_nm9̳-m{.=dx]Z4Kv u5K@zz)9&j8F8΅~@?E\re~f.ۖcmI! F5&86*^Sg{? p]@9>1`iZlS@S: `a 00w11@B b#JERA?sZ={06GT>i1mhLZzQ{%Hߢ-!`\ 9A#Z*`ؖ'%=%3JO htzGsss4/k_ # 6IȸtGcM4?y%9p qe-?K2C?=Q2S#"ݕ٭TM2}WEXf)2Jտ5 |ƅa[N-l|rZف/\J#yC6TP!, T.}N^ˌ_?3m1rܶmf##|M?cvf1F!F1@B b#@ !F1@B b#@ !F1@B 9bT q˸444HCˀfHiihTPgs߷SJ+Z~Z%Dž:Lavƾs|Ι oTV:m %=%3U.KIWcuH{:"9>oI@ojeNL|oΒ7f-n>M`nJSV@@NVq8Aۢ}O픡k ~97~0.O$& Hᴤ \Pi;zKCf*OQיq56ex6\2_|Ji`4W5=hV^:שlnu.ފ>w*W_e͕s zۧYֳC 3cy͜hm㲾c8}̥ޗ3?)-=r; c}]rL̛_J[im嶡DZn?E=nS49t?Mu 2N!hqqNv+G)}}rn^I,,,3@=PA0 y>  (  zhHeeWdb8#mF6r].Wr3yfߟ4l.k;^ղwg}'h+Mz>靦-7wlzi^Az7^f_6!qLosg:E뵷ݕvmmkvWzU~Vrm9[z19YR)9vy1N^t$Muk]pz\~7sk;MFw KYɲYOף2F5d/>쳎t븖mo{ԗNĵmʴ꾏=nW˴eʮ|槯t22~HiKkS<<k{ ,\e\,_vuc1hں1;6/z,ZL??^jA%hfoQ[>[&eוJ}6f[#&]L礷2-Q4ɘVjOCiX5>z(,';]k'';vF~%V{KgZ+M7اtq=r*I O՗2kXk;4%Ptw]v= UOXSne%H~{)^l mkʶ{>MʶeE*| 7@j /[b]Ѽv=L4uo?FkߛX+ݒeH}>z9t}aԋՙT>71ГEUWOGq~0w+S>)}lUX&9e[#OvJKqi%v;iOd,ӵ#']Zl6%A34p^;{'7_>V$ As6#Vfuvʮ7:5wiDkw12TKa3\\ڹMBNzo#ey8z4odA7gTN{}atm(V9{[jꠕN ǽsw zllwXyukgA{ݤt;w (Qve!!#TO2dr9;:iSg[S}&Vbzs5k<.ls+^ԳCoO=.ԴT$m͈tͅھuGs8 L$%ߛgM@=yGsD zl#]oTxlk1yլ1qc}Olgs%ʮ392`_R#7ּXj9ZK-SKr#7߼=J!1z,FI #q왛qw) qzZ\r>ُGފS_?j-OR˝RO-!"*'NW#p5>hk"n")@u3$Wఘz'w`8L:LS2*L*L*L*L*L8bvL\ju9δvF%?#Q:c16vyX3|{s9s9Zܽsn>X>[尧ٳgcmke۹m`<V4J{Rg!o˽#"~ZZ\8ZyEml̮ݫ4##\Our m\JuN'|=r%յUg#/7ϵsk2vػՈv6b~2Ylkq\[F,^.1.H^Zڌ8z=ߟ!0LZ󋱱PfJr=}ѭ|~.&W jtX/LU*gG't|&j\+Džk/|yj,Ϝ]OňW Z^;Hh先Ũ=9ber>鉌Kk!!&SӪn{\wN_z-Yzu2K?uLJ6c=&RSR֕vg0+_ΙVֱqEuVyqr˫ąy2*L1˪K(moy&不Wu3+_۟=W(}+yJ[vo|7>ʵMUFQEyr>7dkq*$w>JdeQ?(L}:~En1vMܫn^i4˙!^ޭk?&Is>iԟܙgǴA(AQky} !1\ڹ]Bᨪ b |cө yJߌNo<r). +.t2juH~#zmy/Lq+O W3e˦x .n?y>9 *q<(a}Oȥ3|v}3/ HA^V2kba}Zjԍ8{f 5G"4ף\jߒO׭6ޠzb.>j1yΨՌQ(d7b-XmOڽQu#SGR<7j{?rXͬ*E(۾^W^}EtgÒW Ywrd_#e\j~j9|t-Mk3~r̝x~jX@!̂2-8P|&#o0w4'bu=vTXwɸў96s\2آ|m@?v*S̶Lߵݴ$'c|_\RK{.UgK]6u9sEmݼz;u.=F˓oyܱr,ܗZFoy{B,htRFzʙH2M܈TA39pO΁d 1^s:܎e]ҎK#-gnC{m5F# o{_ƯS'NjI?) `PcPvinw*Ӡy?BE%IWb"#Nv鵸鸇ڻ.SG0|mvb׮1pW|љYOTy-+ œ y? QLWXW)blSawة]7 M;98Cj=nzՙXk1K՘Z,n6^_ffb.&ɺq6cڥ\^4?4,D\iaX+]ijog%7[YX؛}uZ<ݬMW$K1UR$ Yn:6TZ{Wb%;MF*OC[Qs1q3+uLk@/zZotԖvFLC-ߛvZĒYgc;eYl:G:ZGmM ʿD>w]am_sjƚQ*@DAwiL;#6$^#c_tճz}3k,amT>|3p6dLr\Moa95Ҫ{ bsɰ>?+ EnkFNGy&[zA7:]K\zv/˧㟼>vni[=YX G P1Sqn&PXjO5Ey{ۭ>abn2+iJHT/:_o:w25u1c.&߈ZQDž5߻S_JF?{ǿn9T99<j,.'?R˱r_j9ZO/}7oϟR=[ןzGIjZ% `&&&&&&&&&&&&&&&&&&&&v\o*SpH !裏*2*L*L*L*L*L*L*L*L*L*L*L*L*L*"> n߾?я?i|DT<gg~gGy(O>$~ǎ__h.Ǐo>O+ fP?n|o5O>dw} 82{⡇~}G@r9 /R3ƩSWP TV{|EK?qĉw_+`QO?Ғ@`20ޜPe@%%#+ 2o??? /ǎ5onn* wP%I+Xs__ߥ@K'Fo,*ӯso,W9Wv.,d*裏D@0xRݹs}%^:tl}VܺZ{'^)A{f3+$wX~+.]O=.{|/{#رxH@qxaˋqje;x7bBX^WRw:P5@eg|ʶ~aA#-s9}i9\4{%mx2^zm'"9=9{p31r*.>f|y7x|D*G)L-w|x+'@8;ӂ_z+ļgVfb:Zfğ6^~f>nF̮4^OxI]3Ǯǥg=x- FKk4t|;]`Gz#o|LO~D*Gd>!I@0Ӊ[vG=}x}=79{\gzg_{1+믷F%t,[NG2 E_O1__f>Ӛa6}9~t\Uq78<{.~~//ǧ?|,Ɵ]ޘgɒv`VJ6X)]Nsa~'^Ӹ1Uc P?q3p7O.9/CrKOt=^~D<>{2OnfggKmn?I-wRK= #x[V{%2P5@e${wݞC2^ߏI#~L*Ixĉ=G&O?x=3+x<<d_2 wn2bP۷o7G%"@rz:| *K߈[nCA$oYWѠU%TRЩjђ܌__ʺA~)ď~O*qFsC=?pǏ:Teq3i%G>A}©d?xGcbbY@HI|>  Wo-ݿ= h_X_}T0@i=uZ *`DC?$w1Fg)ѼFLFbJ_%#JF} p?NF Ŵ?h; 8 wboӟF  d4`@܉aDu߿vO8(>IQ%ݿFqE#%Hu8緕pZF םp 'X3u-rr:c?HG^>Y,# `{!Λ3 0n^0 `w(~0/c]hG ,mGݯȻx@`4` 0@ X2@`t0BۗWDX~~${!NɸPwڿG  fn*0px.A4vݣ"@cYSxE$uqݗ'Y 穿hѸ^zoޓ~~t3z v}@0р `@ Eu$sXLO"Y ! #CF"+f~!ݿ!#KFb;q,z0Hw?`HEѻV( ݷZ}LF;s'u _l k=莹#?F vL@u^7                                   QIENDB`DisplayCAL-3.5.0.0/scripts/0000755000076500000000000000000013242313606015165 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/scripts/displaycal0000755000076500000000000000013112665102060017231 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main() DisplayCAL-3.5.0.0/scripts/displaycal-3dlut-maker0000755000076500000000000000014612665102060021365 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("3DLUT-maker") DisplayCAL-3.5.0.0/scripts/displaycal-apply-profiles0000755000076500000000000000050413016042574022205 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- import sys if sys.platform == "win32" and not ("--help" in sys.argv[1:] or "-V" in sys.argv[1:] or "--version" in sys.argv[1:]): from DisplayCAL.main import main main("apply-profiles") else: # Linux from DisplayCAL.profile_loader import main main() DisplayCAL-3.5.0.0/scripts/displaycal-apply-profiles-launcher0000644000076500000000000000136413021146214023776 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- import sys if sys.platform != "win32": print "This stub is only used on Windows." sys.exit(1) import os import subprocess as sp appname = "DisplayCAL" if getattr(sys, "frozen", False): args = [os.path.join(os.path.dirname(sys.executable), appname + "-apply-profiles.exe")] else: args = [sys.executable] dirname = os.path.dirname(__file__) pyw = os.path.join(dirname, "..", appname + "-apply-profiles.pyw") if os.path.isfile(pyw): args.append(os.path.normpath(pyw)) else: args.append(os.path.join(dirname, appname.lower() + "-apply-profiles")) args.append("--task") if "--oneshot" in sys.argv[1:]: args.append("--oneshot") sp.Popen(args, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.STDOUT) DisplayCAL-3.5.0.0/scripts/displaycal-curve-viewer0000755000076500000000000000014712665102060021661 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("curve-viewer") DisplayCAL-3.5.0.0/scripts/displaycal-profile-info0000755000076500000000000000014712665102060021627 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("profile-info") DisplayCAL-3.5.0.0/scripts/displaycal-scripting-client0000755000076500000000000000015312665102060022511 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("scripting-client") DisplayCAL-3.5.0.0/scripts/displaycal-synthprofile0000755000076500000000000000014712665102060021764 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("synthprofile") DisplayCAL-3.5.0.0/scripts/displaycal-testchart-editor0000755000076500000000000000015312665102060022520 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("testchart-editor") DisplayCAL-3.5.0.0/scripts/displaycal-vrml-to-x3d-converter0000755000076500000000000000016012665102060023332 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from DisplayCAL.main import main main("VRML-to-X3D-converter") DisplayCAL-3.5.0.0/setup.cfg0000644000076500000000000000057113170403143015316 0ustar devwheel00000000000000[bdist_rpm] release = 1 packager = Florian Höch fix_python = 1 post_install = util/rpm_postinstall.sh post_uninstall = util/rpm_postuninstall.sh doc_files = LICENSE.txt README.html screenshots/ theme/ # keep_temp = 1 [bdist_wininst] bitmap = misc\media\install-py.bmp install_script = DisplayCAL_postinstall.py [install] record = INSTALLED_FILES DisplayCAL-3.5.0.0/setup.py0000755000076500000000000011341113221473253015216 0ustar devwheel00000000000000#!/usr/bin/env python2 # -*- coding: utf-8 -*- from __future__ import with_statement from ConfigParser import RawConfigParser from distutils.sysconfig import get_python_lib from distutils.util import change_root, get_platform from hashlib import md5, sha1 from subprocess import call, Popen from time import gmtime, strftime from textwrap import fill import calendar import codecs import glob import math import os import re import shutil import subprocess as sp import sys import time if sys.platform == "win32": import msilib sys.path.insert(0, "DisplayCAL") from util_os import fs_enc, which from util_str import strtr pypath = os.path.abspath(__file__) pydir = os.path.dirname(pypath) def create_appdmg(zeroinstall=False): if zeroinstall: dmgname = name + "-0install" srcdir = "0install" else: dmgname = name + "-" + version srcdir = "py2app.%s-py%s" % (get_platform(), sys.version[:3]) retcode = call(["hdiutil", "create", os.path.join(pydir, "dist", dmgname + ".dmg"), "-volname", dmgname, "-srcfolder", os.path.join(pydir, "dist", srcdir, dmgname)]) if retcode != 0: sys.exit(retcode) def replace_placeholders(tmpl_path, out_path, lastmod_time=0, iterable=None): global longdesc with codecs.open(tmpl_path, "r", "UTF-8") as tmpl: tmpl_data = tmpl.read() if os.path.basename(tmpl_path).startswith("debian"): longdesc_backup = longdesc longdesc = "\n".join([" " + (line if line.strip() else ".") for line in longdesc.splitlines()]) mapping = { "DATE": strftime("%a %b %d %Y", # e.g. Tue Jul 06 2010 gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)), "DATETIME": strftime("%a %b %d %H:%M:%S UTC %Y", # e.g. Wed Jul 07 15:25:00 UTC 2010 gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)), "DEBPACKAGE": name.lower(), "DEBDATETIME": strftime("%a, %d %b %Y %H:%M:%S ", # e.g. Wed, 07 Jul 2010 15:25:00 +0100 gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)) + "+0000", "DOMAIN": domain.lower(), "ISODATE": strftime("%Y-%m-%d", gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)), "ISODATETIME": strftime("%Y-%m-%dT%H:%M:%S", gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)) + "+0000", "ISOTIME": strftime("%H:%M", gmtime(lastmod_time or os.stat(tmpl_path).st_mtime)), "TIMESTAMP": str(int(lastmod_time)), "SUMMARY": description, "DESC": longdesc, "APPDATADESC": "

    \n\t\t\t" + longdesc.replace("\n", "\n\t\t\t").replace(".\n", ".\n\t\t

    \n\t\t

    \n") + "\n\t\t

    ", "APPNAME": name, "APPNAME_HTML": name_html, "APPNAME_LOWER": name.lower(), "AUTHOR": author, "AUTHOR_EMAIL": author_email.replace("@", "_at_"), "MAINTAINER": author, "MAINTAINER_EMAIL": author_email.replace("@", "_at_"), "MAINTAINER_EMAIL_SHA1": sha1(author_email).hexdigest(), "PACKAGE": name, "PY_MAXVERSION": ".".join(str(n) for n in py_maxversion), "PY_MINVERSION": ".".join(str(n) for n in py_minversion), "VERSION": version, "VERSION_SHORT": re.sub("(?:\.0){1,2}$", "", version), "URL": "https://%s/" % domain.lower(), "HTTPURL": "http://%s/" % domain.lower(), # For share counts... "WX_MINVERSION": ".".join(str(n) for n in wx_minversion), "YEAR": strftime("%Y", gmtime(lastmod_time or os.stat(tmpl_path).st_mtime))} mapping.update(iterable or {}) for key, val in mapping.iteritems(): tmpl_data = tmpl_data.replace("${%s}" % key, val) tmpl_data = tmpl_data.replace("%s-%s" % (mapping["YEAR"], mapping["YEAR"]), mapping["YEAR"]) if os.path.basename(tmpl_path).startswith("debian"): longdesc = longdesc_backup if os.path.isfile(out_path): with codecs.open(out_path, "r", "UTF-8") as out: data = out.read() if data == tmpl_data: return elif not os.path.isdir(os.path.dirname(out_path)): os.makedirs(os.path.dirname(out_path)) with codecs.open(out_path, "w", "UTF-8") as out: out.write(tmpl_data) def svnversion_bump(svnversion): print "Bumping version number %s ->" % \ ".".join(svnversion), svnversion = svnversion_parse( str(int("".join(svnversion)) + 1)) print ".".join(svnversion) return svnversion def svnversion_parse(svnversion): svnversion = [n for n in svnversion] if len(svnversion) > 4: svnversion = ["".join(svnversion[:len(svnversion) - 3])] + \ svnversion[len(svnversion) - 3:] # e.g. ["1", "1", "2", "5", "0"] -> ["11", "2", "5", "0"] elif len(svnversion) < 4: svnversion.insert(0, "0") # e.g. ["2", "8", "3"] -> ["0", "2", "8", "3"] return svnversion def setup(): if sys.platform == "darwin": bdist_cmd = "py2app" elif sys.platform == "win32": bdist_cmd = "py2exe" else: bdist_cmd = "bdist_bbfreeze" if "bdist_standalone" in sys.argv[1:]: i = sys.argv.index("bdist_standalone") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if not bdist_cmd in sys.argv[1:i]: sys.argv.insert(i, bdist_cmd) elif "bdist_bbfreeze" in sys.argv[1:]: bdist_cmd = "bdist_bbfreeze" elif "bdist_pyi" in sys.argv[1:]: bdist_cmd = "pyi" elif "py2app" in sys.argv[1:]: bdist_cmd = "py2app" elif "py2exe" in sys.argv[1:]: bdist_cmd = "py2exe" appdata = "appdata" in sys.argv[1:] arch = None bdist_appdmg = "bdist_appdmg" in sys.argv[1:] bdist_deb = "bdist_deb" in sys.argv[1:] bdist_pyi = "bdist_pyi" in sys.argv[1:] buildservice = "buildservice" in sys.argv[1:] setup_cfg = None dry_run = "-n" in sys.argv[1:] or "--dry-run" in sys.argv[1:] help = False inno = "inno" in sys.argv[1:] onefile = "-F" in sys.argv[1:] or "--onefile" in sys.argv[1:] purge = "purge" in sys.argv[1:] purge_dist = "purge_dist" in sys.argv[1:] use_setuptools = "--use-setuptools" in sys.argv[1:] zeroinstall = "0install" in sys.argv[1:] stability = "testing" argv = list(sys.argv[1:]) for i, arg in enumerate(reversed(argv)): n = len(sys.argv) - i - 1 arg = arg.split("=") if len(arg) == 2: if arg[0] == "--force-arch": arch = arg[1] elif arg[0] in ("--cfg", "--stability"): if arg[0] == "--cfg": setup_cfg = arg[1] else: stability = arg[1] sys.argv = sys.argv[:n] + sys.argv[n + 1:] elif arg[0] == "-h" or arg[0].startswith("--help"): help = True lastmod_time = 0 non_build_args = filter(lambda arg: arg in sys.argv[1:], ["bdist_appdmg", "clean", "purge", "purge_dist", "uninstall", "-h", "--help", "--help-commands", "--all", "--name", "--fullname", "--author", "--author-email", "--maintainer", "--maintainer-email", "--contact", "--contact-email", "--url", "--license", "--licence", "--description", "--long-description", "--platforms", "--classifiers", "--keywords", "--provides", "--requires", "--obsoletes", "--quiet", "-q", "register", "--list-classifiers", "upload", "--use-distutils", "--use-setuptools", "--verbose", "-v", "finalize_msi"]) if os.path.isdir(os.path.join(pydir, ".svn")) and (which("svn") or which("svn.exe")) and ( not sys.argv[1:] or (len(non_build_args) < len(sys.argv[1:]) and not help)): print "Trying to get SVN version information..." svnversion = None try: p = Popen(["svnversion"], stdout=sp.PIPE, cwd=pydir) except Exception, exception: print "...failed:", exception else: svnversion = p.communicate()[0] svnversion = strtr(svnversion.strip().split(":")[-1], "MPS") svnbasefilename = os.path.join(pydir, "VERSION_BASE") if os.path.isfile(svnbasefilename): with open(svnbasefilename) as svnbasefile: svnbase = int("".join(svnbasefile.read().strip().split(".")), 10) svnversion = int(svnversion) svnversion += svnbase svnversion = svnversion_parse(str(svnversion)) svnbase = svnversion print "Trying to get SVN information..." mod = False lastmod = "" entries = [] args = ["svn", "status", "--xml"] while not entries: try: p = Popen(args, stdout=sp.PIPE, cwd=pydir) except Exception, exception: print "...failed:", exception break else: from xml.dom import minidom xml = p.communicate()[0] xml = minidom.parseString(xml) entries = xml.getElementsByTagName("entry") if not entries: if "info" in args: break args = ["svn", "info", "-R", "--xml"] timestamp = None for entry in iter(entries): pth = entry.getAttribute("path") mtime = 0 if "status" in args: status = entry.getElementsByTagName("wc-status") item = status[0].getAttribute("item") if item.lower() in ("none", "normal"): item = " " props = status[0].getAttribute("props") if props.lower() in ("none", "normal"): props = " " print item.upper()[0] + props.upper()[0] + " " * 5, pth mod = True if item.upper()[0] != "D" and os.path.exists(pth): mtime = os.stat(pth).st_mtime if mtime > lastmod_time: lastmod_time = mtime timestamp = time.gmtime(mtime) schedule = entry.getElementsByTagName("schedule") if schedule: schedule = schedule[0].firstChild.wholeText.strip() if schedule != "normal": print schedule.upper()[0] + " " * 6, pth mod = True mtime = os.stat(pth).st_mtime if mtime > lastmod_time: lastmod_time = mtime timestamp = time.gmtime(mtime) lmdate = entry.getElementsByTagName("date") if lmdate: lmdate = lmdate[0].firstChild.wholeText.strip() dateparts = lmdate.split(".") # split off milliseconds mtime = calendar.timegm(time.strptime(dateparts[0], "%Y-%m-%dT%H:%M:%S")) mtime += float("." + strtr(dateparts[1], "Z")) if mtime > lastmod_time: lastmod_time = mtime timestamp = time.gmtime(mtime) if timestamp: lastmod = strftime("%Y-%m-%dT%H:%M:%S", timestamp) + \ str(round(mtime - int(mtime), 6))[1:] + \ "Z" ## print lmdate, lastmod, pth if not dry_run: print "Generating __version__.py" versionpy = open(os.path.join(pydir, "DisplayCAL", "__version__.py"), "w") versionpy.write("# generated by setup.py\n\n") buildtime = time.time() versionpy.write("BUILD_DATE = %r\n" % (strftime("%Y-%m-%dT%H:%M:%S", gmtime(buildtime)) + str(round(buildtime - int(buildtime), 6))[1:] + "Z")) if lastmod: versionpy.write("LASTMOD = %r\n" % lastmod) if svnversion: if mod: svnversion = svnversion_bump(svnversion) else: print "Version", ".".join(svnversion) versionpy.write("VERSION = (%s)\n" % ", ".join(svnversion)) versionpy.write("VERSION_BASE = (%s)\n" % ", ".join(svnbase)) versionpy.write("VERSION_STRING = %r\n" % ".".join(svnversion)) versiontxt = open(os.path.join(pydir, "VERSION"), "w") versiontxt.write(".".join(svnversion)) versiontxt.close() versionpy.close() if not help and not dry_run: # Restore setup.cfg.backup if it exists if os.path.isfile(os.path.join(pydir, "setup.cfg.backup")) and \ not os.path.isfile(os.path.join(pydir, "setup.cfg")): shutil.copy2(os.path.join(pydir, "setup.cfg.backup"), os.path.join(pydir, "setup.cfg")) if not sys.argv[1:]: return global name, name_html, author, author_email, description, longdesc global domain, py_maxversion, py_minversion global version, version_lin, version_mac global version_src, version_tuple, version_win global wx_minversion from meta import (name, name_html, author, author_email, description, lastmod, longdesc, domain, py_maxversion, py_minversion, version, version_lin, version_mac, version_src, version_tuple, version_win, wx_minversion, script2pywname) longdesc = fill(longdesc) if not lastmod_time: lastmod_time = calendar.timegm(time.strptime(lastmod, "%Y-%m-%dT%H:%M:%S.%fZ")) msiversion = ".".join((str(version_tuple[0]), str(version_tuple[1]), str(version_tuple[2]) + str(version_tuple[3]))) if not dry_run and not help: if setup_cfg or ("bdist_msi" in sys.argv[1:] and use_setuptools): if not os.path.exists(os.path.join(pydir, "setup.cfg.backup")): shutil.copy2(os.path.join(pydir, "setup.cfg"), os.path.join(pydir, "setup.cfg.backup")) if "bdist_msi" in sys.argv[1:] and use_setuptools: # setuptools parses options globally even if they're not under the # section of the currently run command os.remove(os.path.join(pydir, "setup.cfg")) if setup_cfg: shutil.copy2(os.path.join(pydir, "misc", "setup.%s.cfg" % setup_cfg), os.path.join(pydir, "setup.cfg")) if purge or purge_dist: # remove the "build", "DisplayCAL.egg-info" and # "pyinstaller/bincache*" directories and their contents recursively if dry_run: print "dry run - nothing will be removed" paths = [] if purge: paths += glob.glob(os.path.join(pydir, "build")) + glob.glob( os.path.join(pydir, name + ".egg-info")) + glob.glob( os.path.join(pydir, "pyinstaller", "bincache*")) sys.argv.remove("purge") if purge_dist: paths += glob.glob(os.path.join(pydir, "dist")) sys.argv.remove("purge_dist") for path in paths: if os.path.exists(path): if dry_run: print path continue try: shutil.rmtree(path) except Exception, exception: print exception else: print "removed", path if len(sys.argv) == 1 or (len(sys.argv) == 2 and dry_run): return if "readme" in sys.argv[1:]: if not dry_run: for suffix in ("", "-fr"): replace_placeholders(os.path.join(pydir, "misc", "README%s.template.html" % suffix), os.path.join(pydir, "README%s.html" % suffix), lastmod_time, {"STABILITY": "Beta" if stability != "stable" else ""}) replace_placeholders(os.path.join(pydir, "misc", "history.template.html"), os.path.join(pydir, "history.html"), lastmod_time) sys.argv.remove("readme") if len(sys.argv) == 1 or (len(sys.argv) == 2 and dry_run): return if ((appdata or "install" in sys.argv[1:]) and not help and not dry_run): from setup import get_scripts import localization as lang scripts = get_scripts() provides = ["%s" % name] for script, desc in scripts: provides.append("%s" % script) provides = "\n\t\t".join(provides) lang.init() languages = [] for code, tdict in sorted(lang.ldict.items()): if code == "en": continue untranslated = 0 for key in tdict: if key.startswith("*") and key != "*": untranslated += 1 languages.append('%s' % (round((1 - untranslated / (len(tdict) - 1.0)) * 100), code)) languages = "\n\t\t".join(languages) tmpl_name = name + ".appdata.xml" replace_placeholders(os.path.join(pydir, "misc", tmpl_name), os.path.join(pydir, "dist", tmpl_name), lastmod_time, {"APPDATAPROVIDES": provides, "LANGUAGES": languages}) if appdata: sys.argv.remove("appdata") if (("sdist" in sys.argv[1:] or "install" in sys.argv[1:] or "bdist_deb" in sys.argv[1:]) and not help): buildservice = True if buildservice and not dry_run: replace_placeholders(os.path.join(pydir, "misc", "debian.copyright"), os.path.join(pydir, "dist", "copyright"), lastmod_time) if "buildservice" in sys.argv[1:]: sys.argv.remove("buildservice") if bdist_deb: bdist_args = ["bdist_rpm"] if not arch: arch = get_platform().split("-")[1] bdist_args += ["--force-arch=" + arch] i = sys.argv.index("bdist_deb") sys.argv = sys.argv[:i] + bdist_args + sys.argv[i + 1:] if bdist_pyi: i = sys.argv.index("bdist_pyi") sys.argv = sys.argv[:i] + sys.argv[i + 1:] if not "build_ext" in sys.argv[1:i]: sys.argv.insert(i, "build_ext") if "-F" in sys.argv[1:]: sys.argv.remove("-F") if "--onefile" in sys.argv[1:]: sys.argv.remove("--onefile") if inno and sys.platform == "win32": for tmpl_type in ("pyi" if bdist_pyi else bdist_cmd, "0install", "0install-per-user"): inno_template_path = os.path.join(pydir, "misc", "%s-Setup-%s.iss" % (name, tmpl_type)) inno_template = open(inno_template_path, "r") inno_script = inno_template.read().decode("UTF-8", "replace") % { "AppCopyright": u"© %s %s" % (strftime("%Y"), author), "AppName": name, "AppVerName": version, "AppPublisher": author, "AppPublisherURL": "https://%s/" % domain, "AppSupportURL": "https://%s/" % domain, "AppUpdatesURL": "https://%s/" % domain, "VersionInfoVersion": ".".join(map(str, version_tuple)), "VersionInfoTextVersion": version, "AppVersion": version, "Platform": get_platform(), "PythonVersion": sys.version[:3], "URL": "https://%s/" % domain.lower(), "HTTPURL": "http://%s/" % domain.lower(), } inno_template.close() inno_path = os.path.join("dist", os.path.basename(inno_template_path).replace( bdist_cmd, "%s.%s-py%s" % (bdist_cmd, get_platform(), sys.version[:3]))) if not dry_run: if not os.path.exists("dist"): os.makedirs("dist") inno_file = open(inno_path, "w") inno_file.write(inno_script.encode("MBCS", "replace")) inno_file.close() sys.argv.remove("inno") if len(sys.argv) == 1 or (len(sys.argv) == 2 and dry_run): return if "finalize_msi" in sys.argv[1:]: db = msilib.OpenDatabase(r"dist\%s-%s.win32-py%s.msi" % (name, msiversion, sys.version[:3]), msilib.MSIDBOPEN_TRANSACT) view = db.OpenView("SELECT Value FROM Property WHERE Property = 'ProductCode'") view.Execute(None) record = view.Fetch() productcode = record.GetString(1) view.Close() msilib.add_data(db, "Directory", [("ProgramMenuFolder", # Directory "TARGETDIR", # Parent ".")]) # DefaultDir msilib.add_data(db, "Directory", [("MenuDir", # Directory "ProgramMenuFolder", # Parent name.upper()[:6] + "~1|" + name)]) # DefaultDir msilib.add_data(db, "Icon", [(name + ".ico", # Name msilib.Binary(os.path.join(pydir, name, "theme", "icons", name + ".ico")))]) # Data msilib.add_data(db, "Icon", [("uninstall.ico", # Name msilib.Binary(os.path.join(pydir, name, "theme", "icons", name + "-uninstall.ico")))]) # Data msilib.add_data(db, "RemoveFile", [("MenuDir", # FileKey name, # Component None, # FileName "MenuDir", # DirProperty 2)]) # InstallMode msilib.add_data(db, "Registry", [("DisplayIcon", # Registry -1, # Root r"Software\Microsoft\Windows\CurrentVersion\Uninstall\%s" % productcode, # Key "DisplayIcon", # Name r"[icons]%s.ico" % name, # Value name)]) # Component msilib.add_data(db, "Shortcut", [(name, # Shortcut "MenuDir", # Directory name.upper()[:6] + "~1|" + name, # Name name, # Component r"[TARGETDIR]pythonw.exe", # Target r'"[TARGETDIR]Scripts\%s"' % name, # Arguments None, # Description None, # Hotkey name + ".ico", # Icon None, # IconIndex None, # ShowCmd name)]) # WkDir msilib.add_data(db, "Shortcut", [("LICENSE", # Shortcut "MenuDir", # Directory "LICENSE|LICENSE", # Name name, # Component r"[%s]LICENSE.txt" % name, # Target None, # Arguments None, # Description None, # Hotkey None, # Icon None, # IconIndex None, # ShowCmd name)]) # WkDir msilib.add_data(db, "Shortcut", [("README", # Shortcut "MenuDir", # Directory "README|README", # Name name, # Component r"[%s]README.html" % name, # Target None, # Arguments None, # Description None, # Hotkey None, # Icon None, # IconIndex None, # ShowCmd name)]) # WkDir msilib.add_data(db, "Shortcut", [("Uninstall", # Shortcut "MenuDir", # Directory "UNINST|Uninstall", # Name name, # Component r"[SystemFolder]msiexec", # Target r"/x" + productcode, # Arguments None, # Description None, # Hotkey "uninstall.ico", # Icon None, # IconIndex None, # ShowCmd "SystemFolder")]) # WkDir if not dry_run: db.Commit() sys.argv.remove("finalize_msi") if len(sys.argv) == 1 or (len(sys.argv) == 2 and dry_run): return if zeroinstall: sys.argv.remove("0install") if bdist_appdmg: sys.argv.remove("bdist_appdmg") if (not zeroinstall and not buildservice and not appdata and not bdist_appdmg) or sys.argv[1:]: print sys.argv[1:] from setup import setup setup() if dry_run or help: return if buildservice: # Create control files mapping = {"POST": open(os.path.join(pydir, "util", "rpm_postinstall.sh"), "r").read().strip(), "POSTUN": open(os.path.join(pydir, "util", "rpm_postuninstall.sh"), "r").read().strip()} tgz = os.path.join(pydir, "dist", "%s-%s.tar.gz" % (name, version)) if os.path.isfile(tgz): with open(tgz, "rb") as tgzfile: mapping["MD5"] = md5(tgzfile.read()).hexdigest() for tmpl_name in ("PKGBUILD", "debian.changelog", "debian.control", "debian.copyright", "debian.rules", name + ".changes", name + ".dsc", name + ".spec", "appimage.yml", os.path.join("0install", "PKGBUILD"), os.path.join("0install", "debian.changelog"), os.path.join("0install", "debian.control"), os.path.join("0install", "debian.rules"), os.path.join("0install", name + ".dsc"), os.path.join("0install", name + ".spec")): tmpl_path = os.path.join(pydir, "misc", tmpl_name) replace_placeholders(tmpl_path, os.path.join(pydir, "dist", tmpl_name), lastmod_time, mapping) if bdist_deb: # Read setup.cfg cfg = RawConfigParser() cfg.read(os.path.join(pydir, "setup.cfg")) # Get dependencies dependencies = [val.strip().split(None, 1) for val in cfg.get("bdist_rpm", "Requires").split(",")] # Get group if cfg.has_option("bdist_rpm", "group"): group = cfg.get("bdist_rpm", "group") else: group = None # Get maintainer if cfg.has_option("bdist_rpm", "maintainer"): maintainer = cfg.get("bdist_rpm", "maintainer") else: maintainer = None # Get packager if cfg.has_option("bdist_rpm", "packager"): packager = cfg.get("bdist_rpm", "packager") else: packager = None # Convert dependency format: # 'package >= version' to 'package (>= version)' for i in range(len(dependencies)): if len(dependencies[i]) > 1: dependencies[i][1] = "(%s)" % dependencies[i][1] dependencies[i] = " ".join(dependencies[i]) release = 1 # TODO: parse setup.cfg rpm_filename = os.path.join(pydir, "dist", "%s-%s-%s.%s.rpm" % (name, version, release, arch)) if not dry_run: # remove target directory (and contents) if it already exists target_dir = os.path.join(pydir, "dist", "%s-%s" % (name, version)) if os.path.exists(target_dir): shutil.rmtree(target_dir) if os.path.exists(target_dir + ".orig"): shutil.rmtree(target_dir + ".orig") # use alien to create deb dir from rpm package retcode = call(["alien", "-c", "-g", "-k", os.path.basename(rpm_filename)], cwd=os.path.join(pydir, "dist")) if retcode != 0: sys.exit(retcode) # update changelog shutil.copy2(os.path.join(pydir, "dist", "debian.changelog"), os.path.join(pydir, "dist", "%s-%s" % (name, version), "debian", "changelog")) # update rules shutil.copy2(os.path.join(pydir, "misc", "alien.rules"), os.path.join(pydir, "dist", "%s-%s" % (name, version), "debian", "rules")) # update control control_filename = os.path.join(pydir, "dist", "%s-%s" % (name, version), "debian", "control") shutil.copy2(os.path.join(pydir, "dist", "debian.control"), control_filename) ### read control file from deb dir ##control = open(control_filename, "r") ##lines = [line.rstrip("\n") for line in control.readlines()] ##control.close() ### update control with info from setup.cfg ##for i in range(len(lines)): ##if lines[i].startswith("Depends:"): ### add dependencies ##lines[i] += ", python" ##lines[i] += ", python" + sys.version[:3] ##lines[i] += ", " + ", ".join(dependencies) ##elif lines[i].startswith("Maintainer:") and (maintainer or ##packager): ### set maintainer ##lines[i] = "Maintainer: " + (maintainer or packager) ##elif lines[i].startswith("Section:") and group: ### set section ##lines[i] = "Section: " + group ##elif lines[i].startswith("Description:"): ##lines.pop() ##lines.pop() ##break ### write updated control file ##control = open(control_filename, "w") ##control.write("\n".join(lines)) ##control.close() ### run strip on shared libraries ##sos = os.path.join(change_root(target_dir, get_python_lib(True)), ##name, "*.so") ##for so in glob.glob(sos): ##retcode = call(["strip", "--strip-unneeded", so]) # create deb package retcode = call(["chmod", "+x", "./debian/rules"], cwd=target_dir) retcode = call(["./debian/rules", "binary"], cwd=target_dir) if retcode != 0: sys.exit(retcode) if setup_cfg or ("bdist_msi" in sys.argv[1:] and use_setuptools): shutil.copy2(os.path.join(pydir, "setup.cfg.backup"), os.path.join(pydir, "setup.cfg")) if bdist_pyi: # create an executable using pyinstaller retcode = call([sys.executable, os.path.join(pydir, "pyinstaller", "pyinstaller.py"), "--workpath", os.path.join(pydir, "build", "pyi.%s-%s" % (get_platform(), sys.version[:3])), "--distpath", os.path.join(pydir, "dist", "pyi.%s-py%s" % (get_platform(), sys.version[:3])), os.path.join(pydir, "misc", "%s.pyi.spec" % name)]) if retcode != 0: sys.exit(retcode) if zeroinstall: from xml.dom import minidom # Create/update 0install feeds from setup import get_data, get_scripts scripts = sorted((script2pywname(script), desc) for script, desc in get_scripts()) cmds = [] for script, desc in scripts: cmdname = "run" if script != name: cmdname += "-" + script.replace(name + "-", "") cmds.append((cmdname, script, desc)) ##if script.endswith("-apply-profiles"): ### Add forced calibration loading entry ##cmds.append((cmdname + "-force", script, desc)) # Get archive digest extract = "%s-%s" % (name, version) archive_name = extract + ".tar.gz" archive_path = os.path.join(pydir, "dist", archive_name) p = Popen(["0install", "digest", archive_path.encode(fs_enc), extract], stdout=sp.PIPE, cwd=pydir) stdout, stderr = p.communicate() print stdout hash = re.search("(sha\d+\w+[=_][0-9a-f]+)", stdout.strip()) if not hash: raise SystemExit(p.wait()) hash = hash.groups()[0] for tmpl_name in ("7z.xml", "argyllcms.xml", name + ".xml", name + "-linux.xml", name + "-mac.xml", name + "-win32.xml", "numpy.xml", "pygame.xml", "pyglet.xml", "pywin32.xml", "wmi.xml", "wxpython.xml", "comtypes.xml", "enum34.xml", "faulthandler.xml", "netifaces.xml", "protobuf.xml", "pychromecast.xml", "requests.xml", "six.xml", "zeroconf.xml"): dist_path = os.path.join(pydir, "dist", "0install", tmpl_name) create = not os.path.isfile(dist_path) if create: tmpl_path = os.path.join(pydir, "misc", "0install", tmpl_name) replace_placeholders(tmpl_path, dist_path, lastmod_time) if tmpl_name.startswith(name): with open(dist_path) as dist_file: xml = dist_file.read() domtree = minidom.parseString(xml) # Get interface interface = domtree.getElementsByTagName("interface")[0] # Get languages langs = [os.path.splitext(os.path.basename(lang))[0] for lang in glob.glob(os.path.join(name, "lang", "*.json"))] # Get architecture groups groups = domtree.getElementsByTagName("group") if groups: # Get main group group0 = groups[0] # Add languages group0.setAttribute("langs", " ".join(langs)) # Update groups for i, group in enumerate(groups[-1:]): if create: # Remove dummy implementations for implementation in group.getElementsByTagName("implementation"): if implementation.getAttribute("released") == "0000-00-00": implementation.parentNode.removeChild(implementation) # Add commands runner = domtree.createElement("runner") if group.getAttribute("arch").startswith("Windows-"): runner.setAttribute("command", "run-win") if group.getAttribute("arch").startswith("Linux"): python = "http://repo.roscidus.com/python/python" else: python = "http://%s/0install/python.xml" % domain.lower() runner.setAttribute("interface", python) runner.setAttribute("version", "%i.%i..!3.0" % py_minversion) for cmdname, script, desc in cmds: # Add command to group cmd = domtree.createElement("command") cmd.setAttribute("name", cmdname) cmd.setAttribute("path", script + ".pyw") ##if cmdname.endswith("-apply-profiles"): ### Autostart ##arg = domtree.createElement("suggest-auto-start") ##cmd.appendChild(arg) if cmdname.endswith("-apply-profiles-force"): # Forced calibration loading arg = domtree.createElement("arg") arg.appendChild(domtree.createTextNode("--force")) cmd.appendChild(arg) cmd.appendChild(runner.cloneNode(True)) group.appendChild(cmd) # Add implementation if it does not exist yet, update otherwise match = None for implementation in group.getElementsByTagName("implementation"): match = (implementation.getAttribute("version") == version and implementation.getAttribute("stability") == stability) if match: break if not match: implementation = domtree.createElement("implementation") implementation.setAttribute("version", version) implementation.setAttribute("released", strftime("%Y-%m-%d", gmtime(lastmod_time))) implementation.setAttribute("stability", stability) digest = domtree.createElement("manifest-digest") implementation.appendChild(digest) archive = domtree.createElement("archive") implementation.appendChild(archive) else: digest = implementation.getElementsByTagName("manifest-digest")[0] for attrname, value in digest.attributes.items(): # Remove existing hashes digest.removeAttribute(attrname) archive = implementation.getElementsByTagName("archive")[0] implementation.setAttribute("id", hash) digest.setAttribute(*hash.split("=")) # Update archive if stability == "stable": folder = "" else: folder = "&folder=snapshot" archive.setAttribute("extract", extract) archive.setAttribute("href", "http://%s/download.php?version=%s&suffix=.tar.gz%s" % (domain.lower(), version, folder)) archive.setAttribute("size", "%s" % os.stat(archive_path).st_size) archive.setAttribute("type", "application/x-compressed-tar") group.appendChild(implementation) if create: for cmdname, script, desc in cmds: # Add entry-points to interface entry_point = domtree.createElement("entry-point") entry_point.setAttribute("command", cmdname) binname = script if cmdname.endswith("-force"): binname += "-force" entry_point.setAttribute("binary-name", binname) cfg = RawConfigParser() desktopbasename = "%s.desktop" % script if cmdname.endswith("-apply-profiles"): desktopbasename = "z-" + desktopbasename cfg.read(os.path.join(pydir, "misc", desktopbasename)) for option, tagname in (("Name", "name"), ("GenericName", "summary"), ("Comment", "description")): for lang in [None] + langs: if lang: suffix = "[%s]" % lang else: suffix = "" option = "%s%s" % (option, suffix) if cfg.has_option("Desktop Entry", option): value = cfg.get("Desktop Entry", option).decode("UTF-8") if value: tag = domtree.createElement(tagname) if not lang: lang = "en" tag.setAttribute("xml:lang", lang) tag.appendChild(domtree.createTextNode(value)) entry_point.appendChild(tag) for ext, mime_type in (("ico", "image/vnd.microsoft.icon"), ("png", "image/png")): icon = domtree.createElement("icon") if ext == "ico": subdir = "" filename = script else: subdir = "256x256/" filename = script.lower() icon.setAttribute("href", "http://%s/theme/icons/%s%s.%s" % (domain.lower(), subdir, filename, ext)) icon.setAttribute("type", mime_type) entry_point.appendChild(icon) interface.appendChild(entry_point) # Update feed print "Updating 0install feed", dist_path with open(dist_path, "wb") as dist_file: xml = domtree.toprettyxml(encoding="utf-8") xml = re.sub(r"\n\s+\n", "\n", xml) xml = re.sub(r"\n\s*([^<]+)\n\s*", r"\1", xml) dist_file.write(xml) # Sign feed zeropublish = which("0publish") or which("0publish.exe") args = [] if not zeropublish: zeropublish = which("0install") or which("0install.exe") if zeropublish: args = ["run", "--command", "0publish", "--", "http://0install.de/feeds/ZeroInstall_Tools.xml"] if zeropublish: passphrase_path = os.path.join(pydir, "gpg", "passphrase.txt") print "Signing", dist_path if os.path.isfile(passphrase_path): import wexpect with open(passphrase_path) as passphrase_file: passphrase = passphrase_file.read().strip() p = wexpect.spawn(zeropublish.encode(fs_enc), args + ["-x", dist_path.encode(fs_enc)]) p.expect(":") p.send(passphrase) p.send("\n") try: p.expect(wexpect.EOF, timeout=3) except: p.terminate() else: call([zeropublish] + args + ["-x", dist_path.encode(fs_enc)]) else: print "WARNING: 0publish not found, please sign the feed!" # Create 0install app bundles bundletemplate = os.path.join("0install", "template.app", "Contents") bundletemplatepath = os.path.join(pydir, bundletemplate) if os.path.isdir(bundletemplatepath): p = Popen(["0install", "-V"], stdout=sp.PIPE) stdout, stderr = p.communicate() zeroinstall_version = re.search(r" (\d(?:\.\d+)+)", stdout) if zeroinstall_version: zeroinstall_version = zeroinstall_version.groups()[0] if zeroinstall_version < "2.8": zeroinstall_version = "2.8" feeduri = "http://%s/0install/%s.xml" % (domain.lower(), name) dist_dir = os.path.join(pydir, "dist", "0install", name + "-0install") for script, desc in scripts + [("0install-launcher", "0install Launcher"), ("0install-cache-manager", "0install Cache Manager")]: if script.endswith("-apply-profiles"): continue desc = re.sub("^%s " % name, "", desc).strip() if script == "0install-launcher": bundlename = name else: bundlename = desc bundledistpath = os.path.join(dist_dir, desc + ".app", "Contents") replace_placeholders(os.path.join(bundletemplatepath, "Info.plist"), os.path.join(bundledistpath, "Info.plist"), lastmod_time, {"NAME": bundlename, "EXECUTABLE": script, "ID": ".".join(reversed(domain.split("."))).replace(name, script)}) if script.startswith(name): run = "0launch%s -- %s" % (re.sub("^%s" % name, " --command=run", script), feeduri) else: run = {"0install-launcher": "0launch --gui " + feeduri, "0install-cache-manager": "0store manage"}.get(script) replace_placeholders(os.path.join(bundletemplatepath, "MacOS", "template"), os.path.join(bundledistpath, "MacOS", script), lastmod_time, {"EXEC": run, "ZEROINSTALL_VERSION": zeroinstall_version}) os.chmod(os.path.join(bundledistpath, "MacOS", script), 0755) for binary in os.listdir(os.path.join(bundletemplatepath, "MacOS")): if binary == "template": continue src = os.path.join(bundletemplatepath, "MacOS", binary) dst = os.path.join(bundledistpath, "MacOS", binary) if os.path.islink(src): linkto = os.readlink(src) if os.path.islink(dst) and os.readlink(dst) != linkto: os.remove(dst) if not os.path.islink(dst): os.symlink(linkto, dst) else: shutil.copy2(src, dst) resdir = os.path.join(bundledistpath, "Resources") if not os.path.isdir(resdir): os.mkdir(resdir) if script.startswith(name): iconsrc = os.path.join(pydir, name, "theme", "icons", script + ".icns") else: iconsrc = os.path.join(pydir, "0install", "ZeroInstall.icns") icondst = os.path.join(resdir, script + ".icns") if os.path.isfile(iconsrc) and not os.path.isfile(icondst): shutil.copy2(iconsrc, icondst) # README as .webloc file (link to homepage) with codecs.open(os.path.join(dist_dir, "README.webloc"), "w", "UTF-8") as readme: readme.write(""" URL https://%s/ """ % domain.lower()) # Copy LICENSE.txt shutil.copy2(os.path.join(pydir, "LICENSE.txt"), os.path.join(dist_dir, "LICENSE.txt")) if bdist_appdmg: create_appdmg(zeroinstall) if __name__ == "__main__": setup() DisplayCAL-3.5.0.0/tests/0000755000076500000000000000000013242313606014640 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/tests/vcgt_cm_test_blueish_yellowish.icc0000644000076500000000000000420012025152277023612 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescOVideo card gamma table and color management test profile (blueish - yellowish)XYZ =XYZ o8XYZ $XYZ bcurvcurvLchrmT{L&f\textno copyright, use freelyvcgtJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1J X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1K k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KDisplayCAL-3.5.0.0/tests/vcgt_cm_test_cyanish_reddish.icc0000644000076500000000000000420012025152277023220 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescMVideo card gamma table and color management test profile (cyanish - reddish)XYZ =XYZ o8XYZ $XYZ bcurvcurvLchrmT{L&f\textno copyright, use freelyvcgtJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1K k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KK k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KDisplayCAL-3.5.0.0/tests/vcgt_cm_test_greenish_purplish.icc0000644000076500000000000000420012025152277023612 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescOVideo card gamma table and color management test profile (greenish - purplish)XYZ =XYZ o8XYZ $XYZ bcurvcurvLchrmT{L&f\textno copyright, use freelyvcgtJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1K k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1DisplayCAL-3.5.0.0/tests/vcgt_cm_test_purplish_greenish.icc0000644000076500000000000000420012025152277023612 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescOVideo card gamma table and color management test profile (purplish - greenish)XYZ =XYZ o8XYZ $XYZ bcurvLcurvchrmT{L&f\textno copyright, use freelyvcgtK k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1K k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KDisplayCAL-3.5.0.0/tests/vcgt_cm_test_reddish_cyanish.icc0000644000076500000000000000420012025152277023220 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescMVideo card gamma table and color management test profile (reddish - cyanish)XYZ =XYZ o8XYZ $XYZ bcurvLcurvchrmT{L&f\textno copyright, use freelyvcgtK k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1J X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1DisplayCAL-3.5.0.0/tests/vcgt_cm_test_yellowish_blueish.icc0000644000076500000000000000420012025152277023612 0ustar devwheel00000000000000lcms0mntrRGB XYZ  acspMSFTlcms-lcms descwtptrXYZbXYZgXYZrTRCgTRCbTRCchrm$$cprtH!vcgtldescOVideo card gamma table and color management test profile (yellowish - blueish)XYZ =XYZ o8XYZ $XYZ bcurvLcurvchrmT{L&f\textno copyright, use freelyvcgtK k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KK k T[#!#;$&u()+,./02`35*679;:;=.>y?ABHCDFG8HoIJLM2N^OPQRTU>V]W{XYZ[\^_"`4aEbUccdqe}fghijklmnopqrstuvwxyz{}|r}g~[N@2#ކ̇ycL5БbE( ˙jI'៾uP*ޥg?ënC믿e7 ۴|M츻X&Z&SızC țc*˸~D ϔXҤh+հs4طy9ۺz:޸w5p-d T@o(T }5\7Yy.KJ X_$gOBAJ ] y 4 e?)y$~.Gn)b#m 4 !"#Z$'$%&'h(<))*+,o-J.&//0123f4J5/66789:;<=n>^?O@AA4B'CDE FFGHIJKLMNOPQRSTVW XYZ'[2\?]L^Z_i`yabcdefgij-kFl_mxnopqst%uDvdwxyz|}6~\҂$Nyщ,[OUÛ4mYԧQЬSر`0wO-y^ŬJɚ;͍2х.Ճ0ه7ݐDVm*J p6d1DisplayCAL-3.5.0.0/theme/0000755000076500000000000000000013242313606014600 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/theme/bg.png0000644000076500000000000000116412025152300015666 0ustar devwheel00000000000000PNG  IHDR2 tEXtSoftwareAdobe ImageReadyqe<rPLTEPVIDATxdۖ@C# :(BCxty9au*o`fٜq>ɀ ˟rRt A7|m7,onj6h979<%x2 S(#axF{:)PtɀHS(tJZbV<0v;=p4; ¢PFT%$TV8Z uGa](#5Rl^P͸ɀqS)lgY6g(Hcqzi -#x̌[ 軮HS(A9&Md AMm&4Jd@p4#ɀ }9BɝiN<;#oOWt"mfIENDB`DisplayCAL-3.5.0.0/theme/DisplayCAL-adjust-reflection-GNOME.png0000644000076500000000000016554513242301274023534 0ustar devwheel00000000000000PNG  IHDR:VQ~-tEXtSoftwareAdobe ImageReadyqe<IDATx`}l6J$.]DJT%ۑb'$vK\;4ߗ&7؎e[ji5RXEQ  c=gv\, -`3)hB!, B!B!B!B!B!B!B(t!B(t!B(t!B(t!B(t!B(t!BC!BC!BC!BC!BC!BC! B! B! B! B! B! B! B!PB!PB!PB!PB!PB!PB!BB!BB!BB!BB!BB!BB!:B!:B!:B!:B!:B!:B!:B!B!B!B!B!B!B!B!B!B!B!B!B(t!B(t!B(t!B(t!B(t!B(t!BC!BC!BC!BC!BC!BC!BC! B! B! B! B! B! B!PB!PB!PB!PB!PB!PB!BB!BB!BB!BB!BB!BB!BB!:B!:B!:B!:B!:B!:B!B!B!B!B!B!B!B!B!B!B!B!B(t!B(t!B(t!B(t!B(t!B&1AQ!B:W+B!dk+T B!L /sB(!dĊ2UgBGF#B ekRgBG)M!҉cs߅ e2XS*A\AD!Ң 8MV cqmB) +iEKRL"5YRd2BHil$]- Ŏ'P 7=BՃ5&虨)HzU1"f"bB<"G!~Yh}FML骫bEb&D!R:SĊǟl*EB dz/D3χB!S'x}&\ c3U)r2Rg)4B)^"v,'d)T<ՂB!>N{h%V2bJ%trbdE!rb )tx!"''t(v!W: 7ϪUMĢ3S =B&t2L"'fb`&3DD:AѓȾ2B!;B N6+ BtgdrB!dr&54IԤW =d2r(YO.X+O.CC!L\7DM& 5r[w XpO//Dd6e|mև+!rD}gϞvlO )G -1W4-~(DLb'g9&7zhB!d!!W^{Sp,< 90¨#tYY9ϖ;ڥUPB*P FU<G\b'Vr <}rRE:SuUK`uBvHd2zyۜOznT|']$Zg~HUUBB!d#{рYBi'&n3,9jcXlԤD!+*R NR/ Xv yzRI7dŢ/yj*Ee!2]ф1LI`^:4H޽u&3rϯ#t%GӲ$G\g`qUq/A(*ja4NB?i@j93gR۰sw}2A B8fnA)yH=nBދmtrpѐ{(ݪSUWV\|<?O9:kg L+LH(N^BMMʲXO͙3+[l}mttt^Vȕltrc rI c WĄ*T.Sgat8Α p(QQ`).оq"d )OU\x=}MXo]ӭ>Z>O~U>1Q-:EX$ŀl¡;HZ̵㽨`ߊK0i38W,GyGCe eUQQXkQ?ZX. W5NB8/{7 9P>bGy\q@x i ˆ 'ҏg܎~+WLyw5NjLQNRi:b,D(9s؍ۚ@PcO>7jk+7kL -l&@eߋ .ckd9x U##l*m2ky! dC ށ! d+DzZBa"P,heHS&nG}]n峪*DWH CԿdEE of8*BrCDаqWޥhLV ZcKI+(yEO&ĺjq W}ݳx++##<ݏX6ẕrdop^nus_y1VtȔ{sP }~*α{ ?7 Gy6н)t5f G/R¼Z{o.)Cli0oѰ5_?uF/.hv %q/xOytVTpc~1#nak5$Svha0yo<| ߹ބK=]lA~5I#D+2¢t9ހ?X-/;]Um|G1k͔7?[Y.xleLoD 8Ѻ\7p_[).X+؉z*WM]X9)ҢCwg<끞cQ2 P8r*84VoO(4~9[D3WWP_5'5n&O[t(*,Z>7*·Z_GR&ka4:臼A4ڟK5(eg_{'$*ٲˬݍXն:Cp yCV݁߭ _9M [vB}8!uq̓FhrT-]P;z XE43aG({EQcS ߈xxJ,׈ vFbk֔C64TD֪G!saDzE_w#D$[~9tUKQx ZSXI\X"8i)v.DEjL_m-ߌy#6eȫp5[~ /[$)/{ll@(|uVTI MR*Xub =3QaQYtbB}Yŗ[?Ou)r[VX 5*JlV˄fEꦆ+TGʢ2Co~?8]5|fE5֬kbt\ Wt lEmwt>| aƣ_슠vov9mYwݣa+`Q]@׏ rX+s1hZ%&޽h.ov\DH1!Gm}iq"cyNaEr\?cYD;p͹ph"˥;h[q*zoGz`^ZZ^6,:q4}FZg/ NYc K_Sa58Y3cUxu=Vy=Ga,IӿʧiXtǏ)i?E͚7fZo}? #n8?_5/~J;VlC)Dm7w ŷJg\SdZZtYwuFIYEdsfL"̓ohu! qE`䯦w(R۟31ׯ4"ԡqIxH9nU9q3PQ%:AYZo9u"6mRx]7ߏjzԉN̓ڡKF LECԟ_ :Z_EީB8INƮcU3fU^Xeއݽ"F+!Š%oՂ|bcw"oyR>C̙6ۉ?G۱ȣξ 'k2̭p7b;s }䇱di ֬ ك?h:CY&1(ŧ;y\BG6W*Z`2:.Joe3lV(qMS|-]"LE'] bN D0dd@c18?/(G3k>vR逪W~vܨi͚9j=y+Ƣ"e q,nYi%;/W%^czw}~Fq=)}= %0>\-Cpo޷vil8ៅ>}-@;a 2&ZLLi28]7aRXcd '{LPc Io0 2)ZfyD}[â?EWgv>%Bt}mrik*yh0xhr]DоM ̨R6(L&n9ԧgbɤdhB$ز7d_e["XEBM٘S-6:[Le'8ԼTO/GH96EG>UכǶƧUXnwsnT9Ects ypprDŽ?0P tXt2}繬A?|(Ŭepo!_ytE _]@@a,CaD9 S_gwipa';UyXwWr;]%K*+24?VywZE3vP&J0_fR5JW:#7`:ysW- Nw-+|l,[Y'_3ۯ< =ꇾ2vՙ<+ɓr5wN2l]%r ; [Ǵe"DJ7u #wLT˖75x:fOʄlҤw;|&\)(=/fA-Wg c 365K?}m.lh+v=w`M5oboP(;}|eӗ\Ë{a20U`/7@Γv#*)MZ5z^z{={s!h/9!x:؏ D3sސwQeYk/p$ʡ.F-c oKx$gFG냸z,wcˀK_& b-'gn=u||P)b!އ̒7_pY2aH-]< fXbɧ; TbU"'bK Tg0˰U1Ÿ 9UU}T$eե4K,rGW 74BްZw pEP%X0Lc4٣x?d7x-+G9g15Ðk*6vD_mbY3>y8.L(qo[OxK9lݮf^,@ /DH:څ8*3ȗyi>o r .őD?>"/xa95z;K0."őoWV'v}|p0̝hFS/3scK3qtR&f[tf/@W =gh˘-obe 7Pޘd7Е  ,ϺJ (}Bqndž Ignz-odz֕|x>|ʏY=E9 qpؐgҿƦ&TWU߰Ӊދ=?R b:kTT,V54v؏Z'SF|^ ArIybhDgH4)ʲ]k !`4ٝw,v+lr aZ9x}$zQK &+,3,i FAEWӞ' Y35n|% V!$06v$$jRE"}!x~p*ۍ\\4+V{fC]տoMݎSB*s/K"!@j ۟2<W!7_(*d+SEZ.\#?R }ɰmYԈjqGh܆:[x#An1eed3ct,Xt_a]i05NYSͨ1_:_7Ӑ9?3-i/C"nVO*;.=O.)U)/Ŕ>b"bh\" )\MܙW?PUe!\b^Q;L&R(h?@4G'PL1RB!]؄1b&yhTwTd4uSVV>J9o*}krW’;†:vm+gܸ꺜+G~=*TFW0l}^rB(t.%U錄@@!U?>V̬;3 >>gW,ΟݢS *fT658P8tDӡvn*Eu\hH9Q&D)CEm D 4T 7F47dĩ!jhN DSnJ+}vBDqJ9-m7>ߺQ?«e9\k`vƈO޷p+U6XL*b~:wp*v؛W`]'qxx֌qqø+f4alncֿO<&ul򉻰ȪapwTBuLY9dr*z cP`E"-͘QRi3Z Q`a`v*ܱu5'4:fz,h@CY݀fEN2A6̬j^K6܆yv_{6`ьJXүr4[܎9TaNaVswFD[Zİ{ܰ5\&FWgbzԌ&[d"G4!ТC+NICjR\Y}}n`f:E>D}U܂u5:׋XWX߄gT3?gImxOxC$,Ј]K. q1b!VBK%^|{Uؼi>*s~1sQC۰sk mn:щbݪy0v0p,wjVM HGVӚc.Ey苵`ڀf?BuL]i.tjEB-:R0akE䤊3owLPo/.XJ4T~t> JeskߌSM y042cEG%omo>"!ACaȭN٘OPn 7%:y5uUH_pp/ ΅}US5 tQ@}87sG?6s s(wat=HUiiKOG>e\aP&Y9o'Ed5iv3JZZs.>ZtJ#-9kETp\5swb}]9F!VBs^@`6!{hzzﻢp2 ,qj{A^& ?D֪&Mn\e%`0I8ɴP7j,өLJH˹ll sl4W1.n;ޯ[ # \ ȹ.ײIb(K ` sU-Y\]08߃hk ,ALƑtj9-D)Kg=&8.})~,@@[5?Nܑa`Imԍb$L!O&^σa8{-n uI1֯i˞:g.t2lu8.*;{127֠Ax9t_pqB'bJ.."g;rΕW:n\v9sr:l|'zp ZFdճm+QY;vѡ uOX0wm5oEKfT,U h@U~MB.t~Yy ըo]qZ d皸:p?:m$!I$1MvP?w)V̜U/r.0hg|;ТsU"ypDńI'z䐑݌V)dI?~~Dko/1J.BJ=w[裗4%+?s#HwaAse<>0 oX=E;İ_ ܽo 8<8y3؏S=#go;فnm ӑfihC#>~Ħm$ xT/(|NZD@Tt91O!2QgZpiNMyOuTgL8ٔݴf͚WKy9#-:ߔ726gqq[GApWjwes->3\]0㆏}+E%{ l>D!Ӎޢi"q.}X{RSI}sZt#.ݜ9R8)fr3Ň 5SCCh?{zVUrtDtsZVs "R()p+zzz8_Rm4H3x7?K|W !rj؉FqS6GS9>p,;iٙN:'9l5s "RЕS5G'-9__M(J덴HLB')vLqdNNvz{ӷ uq%0!k ]@rCBGSE1r?2s\$Ō>,8Ew ]K)XW.ʄB5'tY~|gȱ]NY%YsvߤYn'{(ˋABBGB'N'F|S*jŭ4&x 6w,b'!xPZy0wV+'W2|B!BDӡa0>ft+ٜ&n¦̚8IgM -[vFFFr9*Z 4B!5Jb'@9nO46S&'$'MF]|y%)wDX^fK自rҰay+K>pB!:kC?9|Qbh,ng\+ Sp?aNiE@9H_p|A!T c"PZJ,B!:/f(H#UF"X0*t-8Dw@mB́ ,Ai٩np '!=tw;^TTLWR\%B¥݀(j@bVk\9Zq_r}m{m\3U`99Xv@.ʊDŁ_i ? 444NBcl6vBй"YD[ir 1Z ԍXqN&cJ)>;k5VK/ڥ'|W|MMM%ϳ:B{_v>-\ZI6~B-iKGfIYr.OB# WӉ =9ZB}SUQlDf}iT\~0Z]JOemPyj0p6$Vk W?|דl|)t(ُF*?BU']d9NdOu­[rAOH>C2R UkGS玴\|ƶfXU?*$L&L#ZV -Yxq|7qfo>n #c[¦ =̳ByOԹ)H'JBCqw}p]Md#)-h< ؉'6õ=Y>K.9*,w0N{v\3qX\ k̍ `.dzzc:+7n9*!Ng>2a0X{_IڠrY0/owı04Kn݌-5pXTDgs J-Vl*am;|5s1 ='jŀūm7c&#KEuuYڂ snn7;NV/lzx_ ^צX>FcϾfhLaw2/VewlƊ*QV*b~'E8H1ΕqbAʚ%ӺצYri_2( -: ~"~&8{8~XX ZR$ 3% k_<S w>qfh)Jk 1eBGNbGZ>[~F(Ǎh^[Ē~xem|:sn;bE^}z"& "n'[| 1mqY\~~'mbӍK[Qס와lFMy=^rADJ9v5%5=qiI#PXRW/kPvTja~> #^x/דex,{8'595{N\sgAk=a9+װa\pz<7h-bU6lۅ?_ax _xŘmV*\yQL\e6<- 1 X\ a,~{kHSdQcT)y:ȯ↝,lQ2&:['꽀wv ׊q<| aS`hȹW-f[t~2ٔvVoDňhD@fDha}_ C!T=GTZdWg?^صVߏOlFNobǃblL&-n0h%jCoB(Orug{a+0 ݇.fo_.bBCZ]\י1ȈSqnJ ,yQP\TcVkS< aR ↰/|j *"#ڄ)Or͗?Q;.ŒhǁA=5ꨀ#⤀8?Ť?k2({~Ŗ{((.m#õ)of̣'c 䜗㇏CN *.}/ #QN&>[ɻ *Z"99w& >%Gu]5Ldv>[4 (/D}r,hN"qr6-GKVu(7vaD&TUAZʛVaVV[9jkaw@# F#.h\qe&^.xSTّ;qW+W0G[-r|9WȈ28>6>JϦ/(CҒ ie}Xy-jE:Pn5fNQ)?4Iu&RϝDW(S8_dv8jbB.:buf5}zf+8aݺPNS1zܳEqIiM|y:xBD9}p#gDN)TJ4vrI9XVėV/ >Yj}9'6Rܔ<32!1e*+GXV=a.^;2 M/zZl~`=.xaÉ#eX-qloV o?cimxpлx=8=,3Κ2`ٛޏc*ECxM L ^YA|9'՜)^" q-Q-:-AuVܵjA*j6o5:υ@8xJ|L0OYmGwuzl|J8D]<lw '? T%NB(\Z@|8\qҾ^GK7ǭZ37:41k77 n] `^u~=Ү'#W^^'eLwmz'wǷ7_DIjJᢤۤ:5=RS]r!F5Yb"v'4VHE/Eb"Jv R.ZDL/~A|1K 4]˄PA>9A{|]8/YnAqN(߬9>-G45]ťBe+!\+ &3,Mkq&? WS7Vfo gZ!u {;/9%a3H>_@~|X{RSݨ/ozDt<{"G%/9 ,'% wDw W!.Ƙ>KH ,>~V͟i<)éP\: +A.34ERWG0t0^y۱3/Hz3݂:xKr%ub}'$S8!ߤ3 1F'9c&!=Մ[, O)B\Z5#XFSRF#ˋ67|oNy88?qZΫhv?)t&"PW6ſנA!g4hB䤿%GIAtQV!>%>붦Z]I%TOK~vbD"9B(tN`:L-c3 bԇ4]%O45nUmxw d.z9QYRWqja+9y,EBȵ5y:{q5b/}[%g$?~ DpOCVxqrM&!919)7 )t4A1 A\6~%Ŏ0vz`X2l& ?v}2}~)֪?6"eZJX%7N !yOM>\>4[e2ՈqKYFT*5N>Z]L8%,!uMc[–^Ϫaú( ᶇ–yV(ө~wcUzmBaM06T'o痠]9kd)tynJ즙(9gFR3Ӓ^j\@!",fN2@p= =伜Nmz,dkOt]kCyMriRLGL|p ȗxÝxs|\z96k8X%.Jjr{0aMk&j(]ܲ.Xg`妍X>F"/;pb)-7ȱH`pޣpbpv-Ԟ}+x3{F{P BAǏCob梻Q_ow+bz,S!5l_Sy'gɞgv?-O[~ R6HE_C id x)THNZ~]*^N,}'$D?"w#skπBcXS½-Dj56[Ӕ ho?8%7S˖;$;hj)nr69ǯYQ%.b[VuE<Ԯw܌ۊ!rF=΅a7݂{"xscGxĹϞ ` .??&- mڊM7.Eo K:7#Ng)y C&hT7<4x/ASkjmُoSܵ6Θ Oլ;[x24a}c*2SZr(؛cvT&s؀M1u>M.ǛE޾)G;2uPc'Fsrʓia.c+VDaEL!_Ƹv2K՟<_ZV㦅1~Qw6X!m4O8Z+͞S&)k|g^F\YyR`;rr(K٨IJDL1tdd\F]<~U eIG;`1?a3(Q]ϣA7N~6ISy9;FlѨ\qt1zpus *bqtUq<#珣}،*D׃ 7a͊<Gۏ#TYJ5s: SÈdX" #8֥6y_5#ˆ}~i&A R9q{ {h[֔zU "װTcŒ'<\8lÉ9k7aFTYFNyV>(K*M$.1- M.`\2x;qyؔB@ʼDAlǎ^XތWsoK\2Xm4TŚM5xþǎjz&Vp cvrc.8]Y9ct|r{m$,.X~k 60#{޼s2Y&2+< N\$!f[OБ}a`|xWKTlCT;6Ҳ<~N/R-^'TA;ʪȱZSXL+蒘h7y~3rqapSܺXû!-7#[YӁXYԫNδ!5! rEDSisꨀ#‹;st'5׷G W7\kpA twds?|^9Gܑ8$`?P F ;^g6<̖OmDON2_l8Bt z8}۷b'x#N>do"X. [m4_[O StMUndz]a9.d9ݥYց1}ȼPQSSsE/{wՕ 7e}AmHB,B]` ]v6w-LLLz"fEGz/͋~S{݆c d!ɲRR*7:R"WI!.R]ιnشA DGg1P:6mH pD'& R"!ለ®]+&B\ _$JQXZyI9Q2aCVx4 AuAeFh)#eD RXlvdLnkdmD;Zb ope6vг[\JAǽmk{`cB4"#"Ń Ͳ WrAxd 2_8̎Chw[m[)~?6E,$ywPTYqbj# œ柷uk' 1PIi#Y,gab,aAoU L%,=P>}]WxoA<4оo>Am-KУH%ߕNw%&&b?~:H3j^qJ#[؜tzn7'@BB3y_0>X \sm3R*z&/UCSo!\Eߏ/-y;o>p T3Wk"ؤ۞ak\l%V S}kߍPtPѥu8.kIܫBy(r?n1`kF\CH5vΨGϦk 2|=uos qbO1oc.Lt6Z1± v@6~\&Nﴺ}1k: N1'@ۯB~% vp'?o|NQ6 HIvF* +6v.col?>X\>5/M?Y-oWϧ3*mXZ³i/d]?H;<>; NѸ(bFIJl,KPߗz>RS0G3 5}\#^C{f=;sђ8NlgRM/4_8'*9 61h(;HU.A=: z <$MLLi?}=+Đ,gw9ѳIoSXB i#ݢ>W0 nq2qd8?ro0\)/,ȑz;(xk:Бn!:)`fwκ_bJAt`m{փAK0~'`{vHw.IzJ p-O p90xD hrXͳpE\J j/|ɡ9\ItSu[o]r:[U8aAcu4z3mWtC#Bv n9%;6"|?Rìksw0xb.Ao3eK@v\+Y̓,$rdrp?!ɻh˂ܖύ~Kʳ:4^A[b4O9Uwp#q7OQaf}_u:$>R@g R#FC_$)zrVc/\e)H1P )5h I#Ä MIb;AF_kfyڇ!|)bqiԎ= 8r[,wP.c q!TLW4醳8m2fJ*{avZfmU.| zy ^ N-4+ɺ3el>._i] ·ǂ-((LAX)=VʢQx^ןTc̪Df[uOv#x/>v;| SB4K!|8OЦ؁"/|/B/%Nlh>k6dUCBnWi=aɝN] +T_^T9xh Xm0e:r5G`'b۾8τ_uνvWKweJ槜?cGg;qf!o.?‘ 6zqx^ovPWyo!s]P5l]*)YͽOǫTuܧe6$aCd۴,һfFLE > GpoF~$nƈ }# I^5a009pnuA] <$MF#ĭ@V!2}f6h2bj yzsbeX> K hs reqؒǽo;i8ìsqp||rc00mqr=#8llAY1-m˾tM21hvuj7)$Ʀ5m ZDǨ!̘yZXv12e?D.87!cq()rX6[7\VNC[w[Hb̌xY$ ^ T߱*:AcoY T({p:/|Vi*=cKATc;ntg`z27^ ~bB\ IuOQq5R~@ B6"#_!\y$E⼥CYe[Iyy3tܱ(Ԡ{ّpSz 7;0! V1r1NoXa ! &#F'%z|m3@\;]r?=۸}dɋ*WRb#anrv_.\}mE\x%儲-+?!)3MOR/-k8s}֙ꐧ[1YdX3w:HteDQmD*`*~Ό@C\vTkM:ChsJ x` mH;iȍb咆KIl@Hn'"/7 Rա] mwYf+4q=gO?NY0ӗalIHTq@@` !Q߮BtU^a[8|v|{lA-7htPsYBl3?=OG`\+LSziIV *N;Nnyv!O~[}eHNX >C꽑n{|ʑLݝ-BE3T7-(ߙ.Bţii$&1j]&P\ hHb!ለ®]+ &2mEe@X\OF:z;RUKTES8}p gjzaOe5qyO¶H <6ELbqx|ZFQYzG RxxAtU&H]uq(,8q=J6b4˔za*aI-k}3u *sjAtK:4ỜmS 1Pɼ|gGmK)m@iBe!@9ucpTmxl-o&kwEYgj_)I{zISWA!UΦh-.tqMS&tMӮq46#Nn{nR5=VNXݪY0ۀK5ŐҘ)K(*pRѮxSXϫz$ڭ|-`S^^QÒ{ݜ#.JvŨ: NS@4~P^7&f``Í}{([Bԃeۮv-; uxizEW@be5` <]ZӌQ=6;W!apN5"^qALCqpN)fm3(Zp ;ON(o9,m_Ou(=5\Ly_F|:*HwU Y(Pz϶gA xx~Jy#3YxXH}X!Y6[Cᅬ#9crsy}*‘DJ'B҂n./dZz.#,Dkc#W7=1ߕ^sZz.#,D th_bt>ـ3S2v0ш1ÐKPD?eІ+`X&`[.|c26{=8Uq;'ٕ-Aco~v,9ܯp8P42bfnwYݥ/4Bf$fFLE sOߌIܻ݌F4v2Xو||Z5B\L0;=)Z`A gz,f̘-ٸ߫Khz">1b!]k009pnuA] `QC1=9:-mf&#h[tϦ̥o M5efcSf1| g>H˶ _02ʈ{Bq7<{'B=ǃsft 6h8&1j];Zbe@X\j':6mH FD*KoJvL3D4e4EK!@FH@L$1 veCoG ,#Y\~Yt[S K -EUFšD||$ORƼOو]G`G w=:\یC8E{_~ EE]>U3uo౶4$hT aO)Up}?꾐xZYkÍ}{(WZ`z0Z@{0>o&q e(*n1`ku8 eL6RM'dNgTyDZ7њW9D@o:!":D.,ao1!uųW9D9:Dث#{s?""bCDk{rh=5:DDDnGBb`+z= EFBJ """:6FXXɄNL࣬,DEE1-ROΫb_f0qKڇ|;99%!66@@(~%1932lҼ#P2x |9!h#C3ڲn{A~r+x6s'2 wYefZcJ߯WA!%yEDD3PPʂ ݾ+3MkCDD tEę|<22 ε&'#:,sBaaa@Fnߚl5V!^CDDD t1!"""bCDDD@1!"""Z@ jŘs =P (YDaDDD th-2 z `"d_O _Ō""":H=9':a#/Rva˿m ggrrKG@Q(쿵v`06B]s/̒sw""x12EWꨑ#f1СŖe { 3ڢ,0"EDD th """:$;!OrbJafѪ((-O&p{AΦ M+9DDD tAȿxGa9WHI6F<""bCFAW2oh5:DDD@"""":DDDD t""" l603S = "#EbJ """:6 <| ~vmv0 ߑy QQQ(""bCkjEWכ~el(Wa˖krrKG@Qw#####ywuF_p>a>9!hB_[rffZ[l젾plbfZ[ 0""":DF^w^xf1С%)A~#7$'YDDj+ ZFVߣ[£x#faӦ6:ygg53Ћ`4ݞ|ᗑ< !"":jh4df:ߪ2sh5:DDD@I;%%%+ROΆ "":Dnx3C 9 ثCD thv]{uy{sWњ.+"Z|,`1!5+gW:ԓ%g1hc1!"""bCDDD@"""":DDD@BMl"2fACᅬ#9Cr>4yʼnV.&LГ⻮fuRZ>3pˮCOK d:+\,y psT7@aCGuhCh+)V(ڧ<[_}{[;s7<6+v"7%r4[jQS kuOV˥s-n-EȩzUƒiWfUj8 x bCj~b=1Yi:Y$x{^ _.w/]@i\X8V8`B8ҋPAa8}K|~my\BOlwᅡeW/;>sS!vN }t]̸WĻ8u> ceZit7\A{3r4W"=|y TB n,Z&L@QSSrmĽ=˖ȝsn1<yuc؈'b `Ʊ_ KzxշO>/~+g?9Z8c8p(l_I)H_W0&*tQNqGܟ5GtJ6V}R>&01crap,鎀6k/*qUlLA\,aώwwB(Pb-uqcoOZ b17\,_ ͬ@Yff6h NVqsu<^vGEqgk`GhӻfpMNbffG!:K^/GT%\p9`bvV6@l-1eܼ r"F<9fY{~28MZdoلȋbty2Zy%:D/Djɺ3_?V"W=@qg[vԨkN`HEBDt\0v}(,@Tx&+0zt.;$!Nnҹ؛0@eȱq~7^Q[ =;Pgw$گ5` mz0z)-0 n -#{#MHSΧ#) ɎA9iR#WJ^Dh-+p,$qm&$dg#faZU:rӝmϤV_5z \KtĘ184ABT&T>]J~znm(NFSC> 7ar- (?~t ÷@Fѭ- f6h2bj .$&(bm\8u-k] q m-}F :Pw}1exJ ./J(v=*4*(7/>K(8vG=鸉&|ueDgm#&㶢P4sߎng:7JS! ` 'hDM 8V؅T,e?c qMz.nBk-7\ Gi|ji/vbs cp` >㗐4 -Z}FB{me@G yHS,mzRNg?9~. ?{6.Du D%FAԀ1&"Fʃ@e$J/ ^C𬠨"%Ɉw]b]. :z+TΰW vA ݶPJXZ9u9 n=uКuyYhi1(G1!NRڏ=[0^-g- lhx^&4rFz`}BPC}ۆLS'ࣖVf>ƒ +Js$"L݉=z45:'V9Xv9ΙX9CNS u@Q3I|!/<#5.}x}ӋljȎÝiw{B!Fݲ;inؒ=Luf秗>/:LdHjOZAH= YQcpZ0ؐ'#?Ɋ#Y .KO/./9p52N>ǹb@:8J+)o22bQ`hݗ+l?:CyPwüb503㓖WbC ;{ 61ȴ*< R0$, \R 1PO,Wr3ugQ.mٛ/ۗ .SK}5$8Ml`/U2Fq>y߻F] 2$䕡 bMsMM nT’L/O`ʙ܂d Ht^{\6|+ a^yzV(X'.b2J%Alk]V;se‸axrZBi-뾆ڇT '^m[ww]._ Kp`*. Ux}QΣvh A7mN@BZ[ȠA-z%G'tpU C݁VP:a#GO t^W8kRq'`=}mu;_{*V S~(Zp ;OyPpz)MS"1`磀n,>L90rWbO=>{ =&cB:) &F i+52SWx)O6dgs,eOw TFEuA?u1Cs{rΝ_3ۉ^0U(앇+j؉BU__@:um 6]Uٱlpz\?=,\oأCRġ7#]w#._fCDkg "zI9:DDD@5D&!ZŻh4a p7x12* \(ن8+aכ|%Y8~L=”Sʾ ly uq}gSW2SQt} nO=]y,^͆bToEzLaq]jps4'P~gK]z=6,!Ee(@b mb`8nN|E'®$ACS\Ebw'ˣ]6t|Oܽ4'qaX.XS^]'O #;byt>QK_ꭼ=\؉ܔȭ嚺eO^Z>)Q?z~;b0]̸된x7³!Ǡ+1!z G\_ 7>"6IHVX`] >KqL}U(R×`I*A*9Mx؄MWate*wc=[BU(^2m.Wmp6OAH)*?Ɲ1HB D=i#Wt,2^?+36]p.2#Zp8d(p  P!E .m3O 7*_\Z.}.SPFbrܣ/ͧ4JJ-ĎW>=#7 _mwQ|dRqFz/V<~ESU(*`jJwgs-G~ 808>NT,f6=9Xr?qdNitQQu\Yk!N?=;6Dv^-oJ "g1=M(ö(8u!pRkEȍ]t&y)3cؔ-^A<qT^J㜨 d͢v‘ 4Rj⑷ol?r[,wP.c q!TLWĈAd|c26{bbݽpst>z]ƦQYYkH譏ѹ^C0Ibon8hey,rl#/팡o1l@ƞݑh5z;S"3;z8j2pBc =pۄ4eGBRb4xSKxd^)Qazb}AY˒!*=1AMy)duZv6b *N^/>:h-Fif =!7(֛-TV3j[m}=rZ#Q7>! nQZƷPXP/VOc }3!ҍnli[S*^L/6Qk&&Fӓ]2k$e̘a7Gf'Nf7ؐq=hBs ;zd! ˌ5)oV"entyW*pJ/mbPAE?)\oG#(oqRtwWӻ^hKNc(NQI||;7 {0l{银@#jaU! .d!.KM{qTkuy_6L"7am7<[o_mo2=+0ژBd}8'Ft6b2n+*_"UO:\Z+' IuOQ8[qٷ+eDGy tpl Z(¡BkW%b6[h:H4遘Bf\<] ۿg08d{=9Qm˄FP^틗T٭Fffl<<ܬ#io%~AbnH4O|maW%qکQN]*d`K N͍,E[w^ b*_ Z.ޑ({9^Gɕjh5NaZĦm+; jZr(zetU\(3Gu~>A7m3j=<0tʠA-zx0脑d;: )6,><,C@)E:0܅I(ľ7ʡ0Հ^1iqwd)Tc֤P_ s!)p¢Gx`56#Nn{n6RyFmqJtܨ˰+_x|^}{qd qt|S[YUQHJI[ 1 Kw_$d6q-4M"Px$JcGㅫx0d+Es^vC׬CA.]ju a#q~Tz0zkϡmlEL3[3rWbO=>{ =&cb .G(٭`c, djddBīoRlP y.}zOwӾ"1xZ7d\l1^:?=OA1?H+=>+w5h U(앇+C^z}~a*ώe9`B|"s(ĎX;tݍ|A) t78DF9:DDD@"""":DDDD t"""":DDDD t1!"""/$zIHMM!|,"ZأCjhhx*!"bCD{E7j>DZ7њW9D@o:!":D.,ao1!uųW9D9:Dث#{s?""ZxVl6և@!"bCZYPooj~jN۷oGVVFsJJ v L#"":6d2F:u 6G 6V^LA:xw#""aaah4;_=N:If0":q p7{6bHijqI3)auo=DjTI :Op,{ϵKǽװ敭(wZugR:q_qc+3b,1rW"?|_ŮIK2w. qq\ziuV=ow*VAW~li9>ՋhZ= w ۗBؓXZպ 𷿀׶Ɖ~BAtt@F8JXށ-mKP~QXЅ(g$g^'?WiK6!v={/,uObϡx~8h#;{cT'66L@ɏqwO,o A'$vهɌ-fW|y65ލ}F("lb9KD{)~wOT q\`#,)xv;w=JDr,^Fr>?ӗԤXƝEh{\= Ws0f&,7o"Πفʊig2ױ82 BΌDCD3G m-ݿxZɼ+) ,AaWKQp[Z@HL$NtDc+XPU[ њTco|K} &DD\KఘPVkW 8:f"Vl{ n*Dp5c͎J ^:IS n7ŲOaA{-^m`g| zvoF 550o UavaۜH )_:;J@@XX#y&:' "ԇӧ.˦=_a'c3HG!p־i?'>Dij/[3olls|p In#˳ TU+ڕp¨ 8u"|ҋK܋[Zcޚyذj!loF~ =vﻸ07۰HW?nCj؂Ça=\ajڈ8_mއ׶?W1ހzT{:643CAt{S >fL1 )#*]'F\*'V]>,{ldžJ;M=V+,RhXq Blشs/DebhݎMXLӆe=%24uJlV.|qsAþk1[V0c(d پq'AoCvSEO@@@ǘT.rw]LCe{>¹C Vg~Fsx2t 'Dz܏=v]|ŵڃOoC 2MRAWӴ`U:ЇHb3ag|q#Xƭ a9ѩXX1ÃA|(Up06Ư'0n !H˖Hɷ;1.Uae~UGcrC7_Z2m@e;M8tKob;aNrDm7G%Uq{LN1Iz|(ovNzZa}quX =w[YΘN'$ #_þ7~8 ;NX* aԺbJ@@RnG&@qK+avB@h3Rkpaڃu8҃p u:nl%5щ' 8b$p,{ϵKY+.^ÚWbOi 2P'յh؂8egj7^m#~z@נ+T?4t d*x/; ? α'u69omǍ',DW[ZPUe~)`D#LYgnK'n3NtlycF +E&qٓ~҄Qc|y}\"4GK0#؃Cn$v^OE+ϟZF8݃{Z_-ڄー==ףͰa$;Z\dƎgfW|y65ލ}EJ<ҍ ȽO{Z6]=ş]$ٵ1F̜&o*`4ѨF8GIWP56Ś$np4/4 +8gf- 2&xm-5 V7t B>\|(q:ѴWF*#ے2gU=rԂJ'|" !ehmkAq 4ZdIZE9`HB]9B? udrj\&ᛏI9jj"rS`MXnKjvl2[6Fb) k9ʥB&xGG`n\gXZBUU5jWU0#"XaqkCJ.ncs,jQ'.ه _9V.EÁj&w| F"0`!I\KఘPVkW c~ZxѪF޸58*\h^ O3NLFش{3ZNT>5TM{۱͉ yhks8Cxdj]Y tvy`2܎M>ܽ=ȣ./hUc*Ռ5;^ [+1x,nfv͋7б?Ir:yNY=u:׎A ab+oh@cea-hYׁ5J9']&L.뻌O>7Ns;v N9J N\-E }]=0/GՈq 8<o98Nrh?Xĺ^G{C=vX2oa\~/u_-=zཏ'{XдRWg Isbv95ix$_cRU?_[T-[n=-]@`j l|u=waFzW;,qmıՠ؈, W\DMGVU?TW 7oҕr%VՎ%\؋mhYW@ayx # ,Tr[1\^-U5pG1sra>,:b c^4F'<& DG@@@@@@@@AtDG@@@@@@@AtDG@@@@@@@@AtDG@@@@@@@@AtDG@@@@@@ెYAvqaDQPJG@`.A$I0(++dZ4mT眡-/(=R:#):DeAte`oIJp`E[.jUH 7s3R;Nv"Ȣ I ,4pgSNsѵeR劕H@@`~H'<ܒ  {t2f,do-=UH':,D. Ƽ.ƶ%{NE# 0,"#XŜ0,ƶ%{.=9  2bmdaXx(iJAtfȜh-"b1 `4RVX|Y*aF0Ӫ[po ?DowZPE<KBr"άwjdžUr(y:ҙ9]uf9x? ͵LHLx y尲oBF-Nֆ3/_M=j*a 8]ugљ7p%qM1LNXU}w1q /{EƔk:~0E=alLY˭[ N|x|1s5n_,H96t G>\ބ-P9{DXՁ^BG߿㳇V9^]7 >|_ۏ~"|!ly o|Cv~th|>ޛӨ(A׼ѸjO{!o5dB>Sq>֏ՍU;1xq~сue>|K.a׮]w_T6Y<ًpDBym H?F"eii#@n` i Z5!`~91(J< n\֊(F0XG}ߗ*_jdˣt2jF3 ?d߳`/q"&m.56|>M mn~k_@x4mF1<2>)ok0pGt?CY߳Y*\z%2ҍ٫.0w¶+pûd^<{~vzphYZZY'ڞxp򇄕hxVnmwp2Ө_`Cc ,2v&iWw7z4FK?]6Z2=|t'eFd%Vj=$^ +.\ULrO称#2LfRw4 cj+"]O@0b]ˉɩH@bY`_V {?Yr,HXiœ섫 Cx&m%<<r7!Yj3h DpWYf"3E{RoBqX+ftӨoc@ɲiH i]$ǩ'm:rDgcg3>{XOOǑzʕϚF[،glS1Fv|xfU#dݚă.?/k`-7'ee$wVTY (2*ʶgh6)3& ȽU8ߣoa(PЖi6c尕/6u/O+8v0~bztpӼ[FʤE:Bǯ`j#>o;/ۈ-ֳoQY!qDJԝc (%g8)?)(1rPYY,[}{~+kb [hnD"k2N~svRXSPH>R\ Pǣ0<D;09۽N4՜tHe.46! T54eƵfI[~¢#Y܈`CLj$m3hP|ieʼnFsBsZIdž0%a gafLzp t `6i&ey{pwxO?feͬ@U+גi6fƝ;wp9y_ӟK|/?ȱftuu-*3<5Y_o=zBV\dnŊӧO+$?y[pf¤u(/LL`ad҇Z܍X"{0F:B#)M L0>L:2Ĉl `Jc^77U6ZMQV^tY%ȗ<La&,ay EbO@L~[x'v{w_=|I\eX2#4ڍrgXsݟwS=lԘЭ/p w϶A<Ol49zG;u`11p'^0M>t}|d{;^:F։e|j*\p[v~_N}Ə?~|ʲÝ[ ѹ'8B@w QaSsH(QNτFz/סՀJ3?h0FucrdG" @t Qn@Ibc{ `X{AMe=|+o>/2RKO#ӑd{㵨eT#)G}&G1&QnKkؐY:h|z=p,F]y`qM-3?FFzF0[ǥ.G $ \U$P?1s-[^166hְTgo\Ym|rVi͛7q̙˞ ܟ䤡W\٧G(bqx#~7fQMِIr+1Nt##@ ?(EsKz 'q8':#- -/>?WHEfD RNׅޖ o!ozx\Qd,?5C;BBSbld~L@@`a~9D(̼ &uN9\mYK\(&qFt+H IsE {~a2`ZEX4BnZ7ύ@QQB`<"?9NKU@@DP%bh,:)8Ne,blFeϪT(UXNp"OvtWDs-Ueha 6MQ5r19%ElAt5GmᙕiHBPHN"=Đ= 4R"$GEAae1"s,:OȖ/l:)egJ Δ"caɮGN#mF|!R پ7ފ+ ?P/Y7-5nC5.O,dQx6&nL":4eHvl7R I~|$Gḿ3H@@@@@DV#d'Ӫi&*DkSĄe6\jJYt8QOuʪc~&TiyF\=׿[& Z/Ld\lTOe:OJ]{TtJvT'siKNh) FN>3$ɪTxI3$<*N)du)f)U-EsŠkK-bc-[;-e+$[.u9f l[r4IlH $Oocr&( f:gQ/_!G'm rRY*CU'@eC<}hĩUz&)G Zs?)Pb"|mqN21Q)')QMY(kѧ Rlb^&6*RCaQoHFן_DGd#:)ˎ+d,M%_STrLX"9BmlM#-dP5G+6RBKP&Fs%P*YS "Xg Ou]Jw6`JoBH`|+OfБPe IWX#fQRd_I'[=So'_~fM,ԓ"zʤTmfd.V'\}p!VzzWKR铹Rȭw*TL6Sĕm3N.f͏“(TW;d/Oer*\WAcЊ9i4l+6lhcz{x!- b'F)ӛmb..E_K'}6:9,K5_u29[쩡)vIBl6ɶn\&wS&{z<ɒJ9r[H#=2.䴙jħ3.9٨ Mnθ-"=P>(:$% f"#\VǨbN]ZҴ褙kT{q{vRK[HmV Kjz!e(|yiH<|JY:-z}hց3He!qO`#T$ly6n3d7@jʒSJoŖ,D>ZD{AQ]hf1RumϺϲW'AfڂH$BlNFXP"O]%:Z0bɓVj&1k2N=u"OtVnYJ~Qd%u\<r̚'T;al˳ڦTOz8xxn @SGGп}9ws!,]%3LrB|˲W${rg{)++[tmYK\JU@@`ͧ8dٔ<$5zLt^wr%i4MVJɀhJ@d5iޖɞ \) 0HTVlX NϡiJϒ5JtNʐg%,G'sI*ب`祶d4X OEԖ BM9,q\Y&y:_2F3묛sXx)9Qcd#ǐnIۛ|Ʋlxd$7_{ m7/ ":Bod7pbFͼB!9PW5u, 9+hGV3D~,M 4z WpUܹsȓ\9/fs?Vٛѻ x>rͺl-_=ʊT!:nEѯ[™3gpAn\xQG,D&/Q>˦d 4Z$$w](Y<%Xd_uuua|w3//i-9T8,5kcz,oA bl>xJ`ϡX]COɷ%Z KQk#]Y\#劑:Z[-Tŭ gpsb|ɍm?'L;l}C4X`"ɉ[u("^x|O߁Qa> VHr !?o<05㥃OaIu9LÝo"Fcv]{}M#>\?uߍWϐw:/yd",qº/~?w]ʹfXxk׮UNKuvvѣxݍBgNtjjjzŵp~}QF)0x&vW \vXr$ڵc g=plՂ=}bq2V_00A2~#bAEM-\NH# 8//b;YA=#eX):_jdcTG:[n%ƙp?"9qa[r^z%,]t3e瞃nǍ7p1۷o֜WGD;)|9p)Ku B`"L$XH(JB gQFG5p77BX*퉷? >I.R]*ID( B,ӊZ&"/D'$&k`8%fX$!4ʊIG(H'})w7gDE)ⲹаtlbg8mRҌ7(|QYfQfwee + 7j[X]b,yNFڒ:.u4.q-P$:zN.kPe(  ˿֝BfZ&ӾS6'lWIbN8쯷u>M{ ~_$+_-Oac } [Տo8рn*C U =]e\&VH*dRTUHDQ6<WO.OY'z!RS N^RBBh1R=Ƿ7S4:;l,Bk誶:!>䲪i`I6y/ɞO$,N%Τ$da%!Sd=NK W0$r!Fh+㣕ޣo}g)VzͺuSEDfrrR#bR{dKو'2Y2|Jh($(C#!eLM;H@֟h` bfTdYM"HjRO$ 5Gc(QHlRDi0F#"&|d%_)yM5(QQH"5_* gX7kjU&8IISOɟ,|J <`S M)dۙ6Xt:&DTȂ=۷9BjRfBV-z5<Gqp@=㠐evTO=$d"I L&wswj M擨I#8j8-\Q~6nZ1(h=~ڵt͚5Ye> v"7n={^~Gu+]˅K=Wt?) O GSGd+kHҜD\;W>HtWfsb2ɠ fߤ2T@CID\=!4e?; O*29$oi*2MJ3pq a˅%f*!NA]dΞY)KY5%N%m&ߥS>_N'q0_f8АwnND'_ZGFUZW'rLHaNrhwY,{tn%jo@M|v~ψ7Hx4ٙlLNI#cY$7li%dhB1rK qH4^K3|U%5f "b؉Ǒ Tl!o5o9QDyJ5%d͛kE~ɩHFY)yWbhIIwMR&2d´LT O'a*80=N:enŊϭXiyNܤI(}Wѧvء| fhd8 MD$߲0P' ),pSeܞ>|Mf3*8;.C V8et4a1bÙ(.iTڹ)Yu*)eL|-!Ya(M3m-Ly#QĆH7I-.Һݦ;T,_HODUCX:]VL&OM,J4Qc2(1HjC{RR)%ꞯ7qd9SLՋRtq8VImR꒨¤A6IMiJ J+=4KS0ӧ Rg1ǥ<=SR?$5]cwŞV\k#d'i]$p۴s$(؝^z`vV-3#,Cމ;`2&LɄL`2!#("IqV&1 +?KY]`zP-Su+zڠBUؾ}X]]=eIY ʭUu~L/]6kZXpOp勆f(+c Mӱ] X`2J`oCN-nMW%,1a d~JhFT,⡪xH2%gecn\nyc*}d4H~܏<"|qy%_3IFhtH2:c{ j 2s8{PTf$LVAO$4U>|oqPDgpUw$KjF򃨟O KFg?]ݞ,w,w*wZ`g3ٚu19N]_O\3B+{ 7nfc {qO5S5o!p>Sk ha2=wEG~|?|N\z$.; ׋Ps;rc}q/puXrqj4?} XUGgJ]QyU4+D{=,v=3`}N4y%gf߽v6< N '6#{SUΗ_ﳰ>;3lNX9ϔ [ӎWKLq}|I.2&M&C'4 O$d>%qLw tM뱐A={vC:L}WUU-?v8SXrrS@4L2ਏ:<N[ &}qVvuã}@=jkPebcU؇Si/FQ 201l5-dEM뿋I:g#-# 넔3RdeoF-5)!铐E<4@ՋɉK,Σt2˻FT X\ls|Sq<FtjNzd{oRӊFY w`zt*#=5 8]32=6*AԺ9ںuSƱyfe ܉ٵk ɕQ&_:o~SI}+Nbח{/HPb ]rJ/?K.89lHfsF_<<գ|\h˚ؽ{7y*!_z5ߏ?1Ƈ~i0I޽0FsssV%IYMəW$j[/,٬Spþx ڼ ZP6ǢGbߜ#s(#:ObYvPbEuS+|o!n^ aQ(^q NLL(?oG}K`a*Qvi~t /^G5sYۢS@*y}'-:ӻ|Y]BţX7HtаSjl,mb o+FF- SBZe貎6=wttǏ۷oi̐E% :.fҐ(\YQJշ0bYսQ"<CY[GdlV?lU.zm^,)EUDGGY2s{7CK(lEQ| ;)F4AJȕ~r0,Q/Hj qk 'd. SVܲoBcξk5@BN lZ2%zT!4\lGR,]s07_4$81=EME z:]99:8m>PJMs0W_κe;jIHJo IҒqAKPyPhzAK)'9bΈ/Ct\4*'bՈR]fbtG1eX*IK޺Gpnby^HbQ=hP@`1 ߽K -rAQ@@``..Da6 }&e}/g#:ؽ_YCc=SO] s¢3nS ,dp垵Eіd9;eŪS5H@@$G,]':zOGiA)*)+Tē֩ 4+KqW'Қ"eF@gFx@۩VɶLX[.m: NȮ(q+"YFNq#@jkD2'*4*8m=ue},bNjcԵ 8ɈN L]PH\n|ճqRH(UYꑵغۖ)M sXeo]Ոc׳ՐsN#$3>'ϠAwN9O%%xcUod ] Vrʗ|hӻgA^/Yc"c$=>M IOѪ#hi댴-Z&EĈo#uf;rɮc0PFxZV<5S3&cfE40숁5 KYʩ~ZG2eGT#|ʈ#Z$4A"\`WN)#qW:qA5͑qg2-"i,oh|r9J- }|׈FFz&Yz(աSt#OtheDs(-S@u-z#BͭTGZT,RrQZY+ļjP*Q%P!QZ3Lj CtӞYTI9uZ-1_3$NeHsM11sP7F0JTyN!m,A(ߴi ӧ ieD a1!r~Ctl=^o_)fJ穾L-X䘑%*#{sJϧ[)RRէۦi;3Bo\ިBZ\ʶM+twϓ&:tK\Fv G^wD}}^qlZ@@@@@@Q/  IENDB`DisplayCAL-3.5.0.0/theme/DisplayCAL-adjust-reflection-Mac.png0000644000076500000000000030176413242301274023362 0ustar devwheel00000000000000PNG  IHDR:VQ~-tEXtSoftwareAdobe ImageReadyqe<IDATx|Ž{UYE-˽ b[h! %yI^zyy$I0SlSm;꒭.;ݝNW,;;gVQUB!FL,B!PB!PB!PB!PB!PB!PB!BB!BB!BB!BB!BB!BB!:B!:B!:B!:B!:B!:B!B!B!B!B!B!B!B!B!B!B!B!B!B(t!B(t!B(t!B(t!B(t!B(t!BC!BC!BC!BC!BC!BC!BC! B! B! B! B! B! B!PB!PB!PB!PB!PB!PB!BB!BB!BB!BB!BB!BB!:B!:B!:B!:B!:B!:B!:B!B!B!B!B!B!B!B!B!B!B!B!B(t!B(t!B(t!B(t!B(t!B(t!B(t!BC!BC!BC!BC!BC!BC! B! B! B! B! B! B!PB!PB!PB!PB!PB!PB!BB!BB!BB!BB!BB!BB!BB!:B!:B!:B!:B!:B!:B!B!B!B!BI @!S| B!mUY*B!񵥧|*B!Rr2!B(|Ni|NB!$VN"e(2 Bȿ#lԓ!!z,J!BbkAI!BN=!`Ϡ چr B}LF&LTI,؁W@ !ި ȃmπ_PY9Ib9SPBȧ[(D hB&ùN!})}hCAB!d<Ī1+H^+oadJȉ] XL2؂B`& :k,j(x»؉W 7)lbf|6xT_;K"6Og_lpaCC@B!dlvGG峯 -'u?B'Q"'ޮpPSUg!2 Sa p1J+& ر[KU=|$ƖydtedUXVqw~4VXu.%MGk^8>qmNM1$LFi*^tu̓GՅ. 6r$l2 B‰XO,c;H+r'j+pū(h-:;0zpm:L+(hz(;L[gN&J{?^x$upY4dpPUnހM\ޏx7Ut O+5«". g5p'ɠ#!:FDhi-$]PvQ"vEzsE~ ښ`/Eq?VRSF"cQ=;ғʇ-chr*SQ޲PykTώչadF!"o^HKIC߻Zuqygƻ?̿yc2/*_  ~ʯqg)_1E?gJbւ0`"r\bI(>,\1l<,Qo (pucqr<`2G>:7ii&NFܧod %['1h羪6&_yLwsoq n9ze$3Se9~;xr䟗ߊPiًE$X|`%E,crRSSE,w!(dV}z9" [x)=KIoRSӑVHIn Ȟآ&vd;0r/A^>Cq&򶽌{53=B)W] {Zm/w\BDžS\xzF|p|y痵߾ҴOx?*Źq=_ùE?=dlO_{Ϙ܉~p+hpbIo9{o&>Gpp[y!xo߿Q~mס('Y>k~e|x9qO$Isg_} |_`8;'/(˰\͕x鏿ƲUv&^}vByw*i rX1©!\?^(DsӉl}Gi]-sE^dq{]MY݇rLGAڋ</Υ{~%t~zq,QyoaֈL|XG'dK1]LV81;4I$R-L1Ђ :ku%`O?]RP42m\{Dd=I ƈ42m}=My;F=. Zݟ3Orɷ+*q7fknZ_ryϻ?{zt/܃2:8v|x-_ڵOy w><$/ض;zUKqC ;{߹z8cUo:yLI 5dJcx|{dy * v<3<.yjwֺN|ڥ>J>~?w㍇~i8?}.9.?!.񣥸/gC"g4$m; EXpePr{]820[Pǻ{y/E>iuxl[ \yiRy2(B7ѓ(dKS4}9Y8ákA4}c )7yiQe'VhZLt}܋SOe{Rlpj2&G^YUv;:+Ҳ}p|ޝiwy,<7^ h7>\3Q׺eF!KQk? ?cI JlÞj0)HNJ1r4>ݪ7ƶԀʰ1Z q Wv{g1,ĺyk.v]N߆|d˳52;/[>T/Sg(Iү-ŋsFデ_F?D^XՆIo]ݞ*̍=nz?\9lֿWCDec(O5V ᕠՉFzĖ ERyI u])۝m}>-q UDuE[Ɣ}mtޯ2srԛBmHK]%cqU1n$Ҵjimoyx[]%cq5@ I񷥣MǛ֠ XƪQօ/iFV]Ҧhv_ ;ξq>ml[)v>#wt"FESUj*Չ{-,ŏԽ:րo!łaj<33|y~&CjdUғ#EL#"Zו95)cc6,'GF4d,@͛x6*ȟ쮒)rdOgѱx-̬<[GGwq5Rqb⋯,9ş {ݥ|#f}R4;35LO🷿(֥㒋`G4)go૿9Vk?ƒct'nX훓pӰU77Gc9fƜ:_Kښn.@˧8U+ws7g^z;9V;/nMl;RR#d0t=8@#,1u5EeKq:9<RfۃCaчʘcP>]qլ}ٮtݽWAqh%IZأn.|MVJ14Q+TCܑZXR%M"mؗx\Zb%Z'DZmwZwgyqSŶ/n3~nsoqLukpo/\.v =9a P%)T/T|]s>#̣EX*r">Br\mIRZEm ٞ2s0tOch\c hf+Kb|,&jmw-=z/}Y_7ȉ^+wHD=9a P b F7N_' .ZX"9mߣ~󌐡 m:[VR-}BQ80(/.@:pXQP B"s5̉щw_^K?EN,ޛH%%ءSO ;ݯ%'h^21"͈?l,eN\ !2B']%#V1 K:sѫSUUӌB99Ї07!З{F:J;|ޑ芄%'bX\Q*Z)صǤ8قp=iO{>~{_[IDI+D.CJwaA!=iO{Ӟe_mo, ս}r0g<t-TՀJ=iO{Ӟ^i@N,ޛxslL1TޚxGT#]l$FӞ=iOvGpzE hUޞHz KȯBUGcGA=iO{Ӟ}C(Qzmӓ41:QZԘ}>0_cL+==g*Ԁ|O7tzX=i?tQbtzD˨X&Q8G^1w \\ijyļ.{ǫz=G[/ש7Y.fX6]۟7hun=iO!cv&[ >tU$Nv,}8Kpscw=\Y[(zUtu94a 3nŷ.cm&l6&~g?3qv_DiO{~^jϱh~ ;İD XE܄Nn 'nNەD)mvIIIbIɔ0oޠهF[=iOdk9'Sr"5G!^q0=鑪{B\pu-[GG;bikk)==iB ^s=i?d#"ytb:B['KAx(DWBz#zN]}<^ co@JJ*R}v%S{1.4ŁCWawgOR\xG҄kb2\rHk77s3l,(LAxkGu|d~w5vJm Qίk圈s: O+�-?(ih$Yй#W=?}h[M<DD{+yo][ }3j\s -cAKK9%}_c_e/Řգ;+|7\|鿽~qd.׏+N`ݣ`Kg!.~ Q53om¸r@AYI "MevY&>a ꅐ6K"a'k;-}㏶x}y#lG葢>aDHޕ>l9VYDZ<ׄ׎wq!+ZgΘaNy.9" m/x<UQci<q-cvvb'UA?Vu0e(QΪV#ǎֹGc3Z+k`v+phiZ9ۿD9}v]d̜irk)nKXxJ@b6z|]w]m舸z=*Cåf=~ȹp[mD@!É̬9xN(A3D(:OM&N-uQϵuyY^%j6u)q3#nfسryrlCl qtۍr1Þ9_-9$^s0lP>ˊAU6OY6y }2C<-vzF!~\pݍҹ^;GU׉v!bl䧘 F).C'e(ƾ WIzptznd 7ӶΎc8phHr\'`'>S:(gƈ'AY-N_#ʹCs Smӊq_F$;HnmR$ #oFj!nnY@!tX/Ӏ1fid{[/zP?ʾ9J9 0B'!鱤 Jpbs| >GNsފN҂YqDj%ɛhh$*30"d-MhlEhbkh>ݣ-"!KQ֝i2} 8݆Au>MZ-jo(ӆ;\Z~̆udֺBrō-W @V)( GsrYR~4r˹8/WBVrYFrw?U{ȟۼh6g#ZmؾcX/onLFDoQý/#?>H#KZđ.BGIw;[a!kA ߉4*'Jn MM()8xq(,L9̮?/vEm'bFq a.f=;%`Osx]|wjLu;mYi܃_ܠ?ٓfcܰd[:Yae3jx'cXGNTaR!'&L,6kn%X) 篾Ζ"V5pL,ˮ}7`OH98D'4Ua J_j1jpcw,EȂ(g5D9^54LMs TB2l[&a\7-G:%ӊ{c7v>EhlfWޒ (ۋ={r@ѰF/#5 G'u?*Qe"}qxBJs鋓nu{6cxusf/Ŏӈ COU$6e> u{Yۉ1#t/OG8#r[Te5KbXOf3|Tq]_@J̚?jLr4zNjo/|=w>G8AxfTm=Zy| Mֺ7GU  |RgO0'Ϻ1f}mr2؊#By .6Q]F)z*gYWiy8y3qǭcMYrmAoFD[~us dcf2S6cШm43&w6TChOO}õ^ MkOA'_Ŵ{frg<|2XY{Kc`#KQ#5H+Kܱ@}|-OF+rm[@:b#Z[[7GЄ[+#|%x4iAQW#"bѝT[i|s;Tttl}ӌׅٝ|6z*9]y5i[r?_\N+g.2gN<+f 79.Ո+jGB!d͟X~njЄ{#08T/c{ÕsGǫ2t$nfXUZ9+Ir>c(ׯɸ^&.<&wym"Y7m_qx*}dT{q 8E(\hѲ7'13I4ޜ(^qs߷w/H=3AG;nI"",zjGh}ۀ㈑#ۿnؼH(\E\ ^}6Vi3qۍr.lcX!E4Ҟvߔz*g$T5DvǐwĜ'0fEfxmg^ YMbG]|?C:ghp(NWpd2k/KNiu[*kO&с#H2&eGasqhiOBR^w(HN,17Ѧ)"=)W"rXGYmTW\ !Z҅1" h|%J>#ZGxRROؑJUɽxk3#xb8~uuHɿ ChO{ctNk0%X8DN8%}U>kb 8[0f,8b&STd}moX7!&Z:!z柧mrDHRQYYꒂG.2v$^KDڿ2&xx=i?Tm;#F?"!ka'X k!tH z}] xRű]Sn*GzwlWG^cI2uzlOa!0L`v?W'gܬ^}DIfV$jBAjii^j㶏5V'8?=iO{ڟ|{><bf v\E=8bQ~DT8N,ʞ.jлn*{p]e7ql1/NGK#mN= 8qaVid+ŔU1:WйW00JKIk "PNqx_ կhO{ӞCžޜ~ۜXcu*#$P?*ڻb !Vm$Izה+V#ア{:фIN# agF-cgR=],u7 "/G,6%r4Z[[HPH]̴=i?cvd ώeD@tNv|v:zՃW-NJʐw{q,ZOH#cv0O=FKF+L_E^;V hRPPdwBZ_GC[>n@ˑX6II>w &hO{ӞCþ@M`QA5<mc jwvR@q零vwUzq4Yڙb;Wv,fWyVPx:v Yl&Ml# 껄I*&>෱o0ax_m"Vm4V"¿ .=iO{ hmP9Z鶊[PSwat)L id!9r')IU%&U:,VR|=g|ŲX/qvW3BɅ!(y'Ho/`R)2^Gva%kW'?Ӟб.Q]W韋)olCgqfz~[jE|GF{ݴ2߈*F\|K%o^RA(K?k#xKTUфdWAʒQ*}ԥ;$gn_7qjL_iO{H P``ytDNKݣQA\A~#T.D|Ӻ=8ڼ8)_cGƵh^"TRd邧Hd(ݨMBĪj)EE1[5 cm{"4o"`=i?t?oVG_m>WKcU8*9Wj̈M8[9YcLZhk^U3b=mE~ֹXdf͋XΒqE# x?p]E8*biyT9K<|fZ9g{U)kBٴIȱgݞ]nbqyvqXrd*㭸l\)Rp6.8p//>qݔL$UbE4^?C:JB'_)P{%HiP݆ܒ{XQ طfĝ$Ag o49U|N3[ LBH@+mJ֦ٓoX*:axLB| -N;bQ. ٘r}^O6##UeUa7aARSϾ伋8^E3[oEP0|%.LpEƾy>pf z'&<OM{) ϺF}kd,>c&FL0gOp̶morhdT*Q.-èlqiECUZ_կ8ߑ33}ؐ=JgN3oO&C]W1| &wU %# X,] u4 U]QIr& #eܧ-ANT YU6'yJ I:x }ua]l/<U$ߧ-K5oJux-zs g"_(V>:c!kU ^}i;ooK{X)B *&cTGW6ae4|8<(LnTdƄ!['WQQz\Å pk/8 ujl^ >lqt?m5N mBc%BqY&s{t9\O݆xQGˢl$ko FM.V4UB͗"&LA~#XȿLLpV猂nj&TLoŸ|h.='eoa48'GxM&^tvV1c/9W,,yVu7*J%ӑ'p.ކ(3b{uv>heSx3kn<4 u{5>xa ү4QwgsMe<{E액y܈k;,ޗNxeu #/gYգ+mn+oECԮÚ_Μpi#5DC.8Ґ;<m"]qٺCex3EٌHcըxmk-ub\9Oփ*~-د sxqZ[q (/mycIYn٥O\T021b)S5/ Ւ2 y؆x @xsغbSu\Q׎jF4 0UDzgFYZ+a`JR=z $N.t)D>mf=^69 %Mk%zUQ'3}9бM@m,=ظvu?sJ!Z?|؛Z=>9 ;!}ǶP6x7Uf"}q}>M,m_Zv9Țp6edKhވg}ðHwy+n96~i׷*j~f+T`!jE)^// |$?ZOj`*݌/Wym*%Gi.XշI⦗6KCGL8kӪ M 0XK@ɰz}&t]ƾONZ)/8g;[qՅ=붠W)[6B;N?HH] Of|44Ɣ .5xh}(, 9;x;iɞO؏ 9s܊Mx@]X'oOHISKx\d،iD=Æv[E=x:CΏʼnmHx&zMȚMBcŪ{ڳ{\nMtV5y[ E ;^ O` +L^3L0RQoD(zv:5̈́sxv{=\=^81rz. T w$3`VFy5zI];J r3fkƁ.oH$yߎv f'H~St]|\>5e[Kح:ЎC|Qyi%eLELBc;КTb>SoMط M*ľkó[ұE6Mh^4VY1qUv$ GztpT6]s܍$\ۈ n*Aåcn?h:훵1}Uf9~/G(9kY ,ـhI|(Zq'ԊE8ok!~$Ea'հXחOk񇒖}h,,P؎b;+Ga+b9 _;].E~|6l=oHEgg&"CZ"_E˂%n2Cң9زP*Vᕧ}n+c~mRx9_,.c[SGS_8|qb^g괘*N-+{cI4puZkjⴛnFъQFᵶlB4n;AѬq헡Tn;ƥ1aZ+ݎZJr?Nf|m3vwA6cIU,b26M8:p{: BPnjy}&[_}n2.WUMhT-ijibÂ?qg#Em&tfqE3/Ú Б3_v3nY$V6&_߶,s`ۋ jqǷ}߻Do_3 =Ϫǟgӥ=Gnh. Yhtvc^4ir–gll=TM+}_7Y{^&t"[ ?RSQb{^=4hH?fO3ރIސp3?Fn{*f;nr}q!W' ӂ*-œXdAqJX*R=G_z,]=S{dqIID#%%ǻ78]wO٩I;ZMpZ^dؕDUhk>oMlL.H5!Kܬsqmw9y'$4&BϟXz8DJHkj +^~ThCXBBqwë ǣOn~'Ń,_&ݨ"Oh6 |<1l,ی2VWd-uB m^\dĿ#- |[n7]Re8O{|Dƚa(!X-Ƌ8po(-"rA8vK`LPO$ERߍrgH}A!#kġ>5s\|xS&KQ3wnEh2=eF6j^H٢1w:u`4~y qBj7*XNsNw)(_^w"$~wNb%Rt1~W>O  ,L o~o%-=1UU]'r+:QhrYȺ?vI dm`:N-0F\$ȍQLAOK"tnNf@8ݤ듏|!{sdR;!?LluN\ţE*AHiIˆC[]3P'mH6xd_o ʖ NJ$FRDpyc?|儁Z~|4[ ϚOߙ%7xhu&gTϊf;Įz VSK&lF8gDzm''}tSOwhn|{>elDxv*.7a1$ueM6~B?o*u"Nz;j?}YA(;5m]rfUMCgP_pJY'%EU)L9w}~4dFbbRߤ?#TKXc9Ɇ~Zx${;t40^See&9ԫ*2fPDH"=#${Գ($'@&RT0Q=, dΑZ̔VVEWSB][dʜ9.)G&_ǒuNmw.}4x:ɄtTw:ڟaVE7܈`}e(z_=e!a޺1^_mQy/51{I߫]8[GZ!NG/8a")5 ױ>^tF֔#f5Fwx} i=pgR6'6LH!ʎWPUsR#aI,1'9ڪ8I% %ټW2@@O'=#Z된'Ϡ89Y+woMS)ǿԑ@MWboWp/ V8J١JMRI9|wF¤_6BzH ||wh)r#ņ(9v|(9kgBbꗣ OE>*3(qxȐ׀S%I5VB2(vtPJF hv7T"zO"-$%vwD&e% z\ʣjTWW﷛_ R Z`lgvXniA|RQքb+T5U+o߿W9+0T; A}\o /Ji6E,cыqlyq& ʺ`=e\AN.r'Lp=jobnܣ0S"?nT6+i<U7+5G;‹(ܗgrO7Zx.w<$R> T8y\f/>@V(o%OF,敄6>p0u q$?"ޣߦ%TYY&F(w'D< Zwdd7O]~0f/x~q3"#\%/6<ȭi dRR;7|ȻS:ėA{/2y-̲F}7Z<7D-FYɨ]lwWMGn}z8v rF8_ǣI7z9ȣGk>ò!OgvcGy S8 ?&c!_wp۳(z(Gvd/͆8&|~oB^@t=}9\XyOLźeSX(q<%6*vnmb5LӊڀW0$daLeЖ3)H7 vmGykA'u usiA~o5voޅ2<t (\4iᏇnJ8؆ۍWxZôHU:z:h-4f޴Fg"΍ph!\EpJ I Pȡ_,C=}jyaTɻvfX&?tYy&hi|f6ÚXӑZ} sȻFٻ܉wZERyѕ,5^"vfh\[VZ@&eus4Z d8I"Ƈb!Y;"`IJX0XNKs [A=ʿ/ ӦcxLsXa5ص uR7.e^ v(~w(o`o\Oa +\ſYF[ɸcin(-[~^D2H_\58u'Φg#7>N_"}X/k!& µ12eWHh-w&쭴b/C8 ~BY67Olٜ:oFBCɓTz_ԡɜ&~Z*ɤc-˰[6XFl;Tzص*:;p-$?a$Oq*~vSez E::I %6I9l~;u;P뎋Yp1rٲ#9w3 bQjq*9~Bۧ`y憿E) rnxD1FOZj3UrR; ֙9*@h‚ӑy>f\4²Y,$)2%mo1y&A2X\ڽ[mŲ\#Q_?i14|4vNĿ3auZ,&jGTC;ġed0pi0ՠ#Ru g8Ҟ/ 1G'2גv4.Ȅj}\ҬPE."rC^~y:rkbq=/ 亝iؾm;fA5.&nr2@l_;Nf Bտ߿H&g#h-Hx~n`ل>~l.'w_?ߏbɌT;Kb'#GϷTk*N)_/`D9~,clR~ ;1t*7 FgGrokNd0/ ۭehԛa(AK`2c`\h&A՝1O*ÆAi/عwJ[Ӗw-^Ѧ'RRf $5Nc`;Z򇣀a ZbUējzcj ?0|x"S滌o^7pmbTƽl*7 %#4(֌BO6k$8(@KcƵ6қ]Ճl0&+ņ6ؐ.R0nꨰLU—G-X7 -: QxKZE(HH'qz\/qFzT '_X%? U4NN,<&0u' ,;FB8(B!E!aZ~5R"+3A^ҜKup$GI<KBB$ъK'}#s\6ԑڬtU]$μ0P< _\ER6(} OSbÕg^ėI;f:0q4V. ) 1:rz_.c`0U_G UĮ3wY$?f+Mh:Z42T$ ta.-!D#^NQ5=q_ȴ>ډniqzWjJA9*B+ilrzc,:?&E`XɈd$(F~.wHmpgTG1Zм~a Jw;t\? [jOeDmPMa;Ҧ/"ү9hXrI'KqY.񈥬J'&ahZ.[Z`PU)n1)g'pSb W&mՓN)T{J͠К,ܢ;[WȺBBszQ'x:tNmb bjyh֝fiZrAӡD9yGïi$FI;J/,ư@bvɞ8wYvPNԲhd62^u _aӄVv|n\T >7yKn{k5ՔLn]:ch?ẐjZ8#яV+-Ohw||mz+O?Qa;`Ʉ"i)9̤~rM`%>'|7QڽhA_S0>}h1?z(UE3ZeJ[{`OrcTC@Sr Ds1L+% N-у'rʀ$d & SZw&H}u F'n=9Ҫлt-Bq ݴM"śXbG=JOFv^47i$ 쬃\Ir [WP(P: `K*7m QQIN1GNUIA)ts v4Tn}h%%|CW-Diѻ iZ_+Vvv\i1s;x{r&6I;>*h~:riEÀ_}ljң9<a^I:\w=Qr=IyUY+, 8qǩK8Wq:-%U7!)^`[1 De:Y̴ؗ,\gd5W;W/uv %kY]—;!D-<[α7d ȧq(:ה#aРA=Pz&u4( Uq.NH_edN1X blqޗdt$UVfc/*&thjl'- ^u O݅`L.y"=7~ډ`4Jᤢnd2Kd=gHC2kt6HϽZZPuNєOgEYBhm> E'>zo(.0#1or vˁ*TIrQ")fK/Sp Ԣ :` 33]ĹKVOm41{L~fl{cOGN@,\8L#l0t侪Ӏ褂]B#Vea FTK=ԇgL Ih A k2)W֋wzB9xڻy`sAub/J:BEho6:&=Y0I^]{Dxp ^1\/DDjj1͍ExKl_]h%uLs#.Gc2w$S"RG<2VpF3GȀ&DG𴉏xGqi+#+<#W(!jTv-=yu!4KVV t.8A9UQ/N[8whN%+0!hi:z—Ntθ^q+ucTY /Yo:O#<4i zª2h8a|ۯy~3w MaXq {{>i_82-Mp'O2F3+*`2C^TysV൏KpM;x0])'buD=RJ.ņ9a)n\)s;6@#K$QLV4YDC_`|v>|sRh>; D?KLpFW $w-|"оv,«nm4kN\=v_7>/ i? C/Nm/^f9vD53DqVV/ /\ |:%G3)0:"qJKnd-y J:{g _ gRr|qτ@LfSl 4QZR~_]#0d\ V;}O?]É>O̟?S#66ڣ'WSSSV6T>zx#HO+޴mKǩ$`Idu쉫(44Vr$| x.|~F'2f5 ]姥"`^OO] bץ_|`';QFRM>93 opc=o?F{:6؈L?zɆ6x:V$ivq_xFOi"6&3|gvIE)x:Nt8^̿wgl,S5uS/--}xV1Kb'1x~JYUkT)%m FJ9DA;Ȭ!wh!Gy;PORĎ4wJxx^D$"S4+!Օʶ$Iϯdd1m*+ ,Tz<,^UiC-XvWb,?xxv@tUI:Vx = r%'QR295rm+n7BZdFrJ2RakUifXc*9bk,7_ش6+:dQƲ'XK PN[[[e+k=1e6g +3֎ZK`VB(qKGqt Tk4M.ŃBMkdz1xtT~"xI>/899๢+Z4`X8 $HE:D}T`F K'va\<:}ּ8C<;.^-u|Z+3v agŪY5xݓ-&5k-uN?JI+_vӑ&-_Cn{9ބ+&$ Wcw4kVȴ A7s׬hïǿWCaʪu{N9=Ě7 ZvҺY?NZZ:z]զ+:gŘ3g _$>QgL 6>7&vO/[wTW)t2"[x1^PWUN[fh|j LEs^ P|ڮAyȷ=Cr0""RhHO2n,n=X!usG hmmITOmz=S+[Ց'wv;x5hChjpphU#+חLD^S+voڋ{9֪i` *Wwtrƴř]| ^XWD<MY^8v, xp0*3 bܴRJ =>߉w/ąo໯d=h~ˮA$͟?| IF?!VPܚs7K0"@߄k`p*c2l>~mN;d~Ǎ[{.ߵeScoo@Op͆\8 4+z3 dه3iG*?o>џӧB[3I]S~WDmW࿾&s&)mkNÎ.)@#m e4`}x^Rexu` x =kcaTH9uрOE&8k ˄nƑ: MwKݷٻ^'ݜL_Yl,Rr]GjRU1r9\aBy@aEُ;sX"ݖ7P=U,Nh%[NB(_~@*yﮀ8 WcMK=dxH aIn_;/`ۯ9" {)hf[V `=>9O 'U|H(cP䷝?>OL66#a[`L'w~,!iR1s 46-rb=W nh G͙Kvr%į%$* H9_;'fo"wˬ><9ߗW#@µ12@րvG|/oE[t, q|%4VFF;.P+NgJN"ppid })0wDTŖ/M}*U#(} gYxydHjr?,|Nga0Lf~|,|d@#dʇŒUX +aH 'UǏӧb^nJQ;q5t6Jb_A_:$f'K`T$Uc)gm? GЬd_0؄k?m^}dc%Uқ08*`s\u (m#7&!Ŝ [Aa /Y/|фK!͸hKFch:ӭI&>mVW2(b!LiY(E9Pvп]śY 1ސcvb'/QQc`'!ɞU0Y5?g9<[#ae}4w>r>aLNP|[J Zoÿ݀p2h];quw3,dClcge~fqŽ/3 φ*A6DJU8(9f"\܀}<`"ʵ>(Fwh!J{f` [Ƨ?CL+pĎLR9 *9]X㋣ׂi73"zBk7(װA L._KL[k\ kQUlvX|yVn%<[ 8 ʲϟ'NJeŞ&" [_f×8LKo>' g"'XѦZ"[P,(u"7o⹢ @kfd}VLz i:'wPS7V x, $M? |ZvMd}L 4 V >\*=F_=~>| IHMWC'WmJCX]*624w{|8uhnlhe+0'@V:$cYy<<& ǭRifl%ʲNG_Z'Z=hWP, D@,[C=eȣfná?220iPzm7H3bYj‰ZAdp{X N<8njUI“Xt:RiHT@ =xiEM;Ϳ&|j菫bz9xCIdq>+͸8QCȶ6揆l`Y sj^xN'wt;X^ЌSqʼn_c˷dQJ&|Vnݛ&gԻ:o\ eV?r]KY]fd1:c2Z$a^K?=J+@ǎ]7)4^D Rz crqGp! K$f&"2H %=Pj୺jIAɑoPш?\ yjjʁw9yGW-'b l>P= Rwj .zFHb:%RYp$p $"0p  ';pxxg,Ţ+hJ!0tmzs39""7⹢^:RK ;\ȻV~:z?j5'Ğ#Q/Qjj*>uƞ _$a &?9D/@N}7 MlVG$ [+.R~v ?׆Z^=mv WC-kiaBӳGrDJ/?>*1 5S+E? @__I %K8u[X<f7= Lt.u~'$n=sXwM2m#$泌2 mߘ3  NG@});䠄X˘oCZBŶ37Lkۓ5# )$MMLݫ1rrB4HF?{8ѨGddޅ醛&;uPKaLܨ/ ^bR(P,NA%őR &'CE>t ks7< Ay,#,L+`d[S%oxY6ow W.z=U`%BcH׏\饭+Qynp:!l[&rҦj5d O1ޱdX mm/ȦP(jO3shi0Lx 0ftdaɢ0DAh&a#[:%LwSU>ŏ3M*42cL}qIV_BS#ѲoI\w8^3$E%4H$T>j/4&eN~J-ii+j*,$Nr\ᦏV`8Z$dʶg`銭Td\߳{OW 4< ZP^[K(k$lQ~ qMW߯EM~ݻL5t0͘"C~J]M^`jQ#Q!-8Vz{WKG͠Vv8V@}&N_'hPM j# NS8;%IbJS)d@(zKkMșp:]!UJg&IRM>ژt]-?.}~ }Y.D>h OD~&C>\#]V"ej,@"*a۰ zmȢl<;f2oB"Ɵ~gW?OV|ଡ;(Rwk**aqÅ}mj… D{3" H.QD7ur0δJ9 UP #R̓'X=LSKnK4@hm}ۂﮆt _o% *!Z_jOa"FUi&M:~N%mV*IS篾w:aR oTb"^ p$ic)!͛E]tdH.4TNN(.J6L]wa$->Ov'vy}Bh'K|w$?_oq=<:zw!hI:cDe$ S NP=i/Q<-?2Û`BcO}O~յիSZ c 6HЖdx]~P?\Sw=zXgM6>3 OedT3/_I=NFIZauH4Ax=j?[AOy5ʌ+ѱ#ޮǫNIIKiRfsh'V>swL!(h~[\<{yl]EQ;*aSLI~|(ΈbS%EHe ־,;+?`{㽃_ĚIO99msA5B@xH8 k^(`EAg$ugհ IReU/Xtd7Xa#uք,;Obٳ%]ٍO0SJ'ŔZ/<*cD LfU N;^DK] 佢!O)7\&3Vz/!ɤE6z\zF_LV_`#eܵhiAZW ^Eo22UEA@C%؀@nJ3XPU FCn?7y%f/EuϦ$)EɟHVv'#W(H)kiR M,xD)^¾.k3dI@݆%/f7Ϳ.zxR`_0Y`k ];p \|LExi<?R*.[tzg*:UQWt-\= |x-l UC܅nęWһUc '=u-{ ;] hEim+u4>|φoU'D=QnnÊo8~,Ef 'WbRWjU+:t&\o+1g*(YRa/@|N`G6;%Y{^ûbȹ*\kOps)*c-A_1d|yk_وat i2yC1v0pU89y] .F"EZ!x@g|i9ug9V\.ƣ`#ïndirc26>OOz^j[4DkW[\/&; ^Bg~x~6`ڿBWTO@|:<Nu64:rE;I6NgXQw̮*9D;e%ce߽uDiJN_h?sVGYL7\yffXQzxq|l͠99+:bQ݈hۊ[az/0Asīng\靭+a":t_0NF`I{7_z5;jڵӏ99^ٺ*QICseBj⥈h*ܹs]}ӏ9sEה!"8Č {4)qq|WWWCWWWӏ99sE"NkEp'$Sj [pB?ssNXs"'^fHĞY!bM3EP6ZtbYuN?gfщ8aV 3$qoE=}|[}˪pq6fD}_UԨ9~+:bQ݈hۊ[azDq3q|_Pٳg98S|eEuJ]a^Oxq|xI۱y]m{ǫ@y^3usJ2xR60QUDOgoaĖ:LCՑ8ڰE}4 t>Z4N?999Ṣ+ޢ_'WƞՄ/߻G= ت/ⳤilQ]_}t?ް(%"aPgp|A^+_RA*) O 5W=]LQ?Pi:A[:hs( N{:I;0(P| JB=IDMi^~O#U]{ eQjNU!QҖ`te q1\Დ |?oRψf;\g) O#nk#Ѣ@/z*iJ6(1oM8ֱEEBT>RzEuHI+"u/C(uCeEb9}iu\ex9>^b+QICҕI{y Eg\^?)"ZgtgSVIq*I*&ka٠՗:$Dbh-LisHS$VZ "i, W=)t=~r^1Z,Ip</?fĎdycmSb^O_d'9>V,<:c~=U]vx I,hA+ZSKnnDnJ|RF7{=qO<?ux2t"ISKwJPJh.Οx߼A`G<OЉG,DE|+Oa?'xON<:OsLJB|8xVO\^JC4BΥsȎ~W?IޭIOtO<x2t"2t dJ)/D9yx m _GcC}'fU4xYO<OЉ<_g7ygi>&p^w Y!; ݠ6Է,''S]SȻ>y ˄ >T8nہWmh{eLҌrW1No S5HI 18^Y#9NYZEo2?9{Iy&{i>P $x9m[T>+je@oN o6{]zy-~=?'>/:wۣ{+HE`j ~=?'> {p%%t"d p /uS.Ǐe_,^~>j ÆW14>dSv;O0O≗dDģ#ɻk؊0]:I>1&Q?/)տO B1xOEF`q ƓE}j?Љ j]*8]1r5(-')6PQ   e2Gϥm?~G˥Jp"/O9o…K󼷙 9 *qgߓ VF;z~O|4/-^CG9I݋n\G㥇fddb/m0BwRbx كHIҟ(Oxr8!4nЮ1*≿y_'3P#Ǔ;iH,P54ey(B_Ao.\z1(C9$Oɇ'x"e[QsJ;UeVV!@ }ćs J]?'xON$<:/gt&E|kRr#x'~*dD(=7FA)\I!XO<?hڢt/|g%3{ZeDcxev'x O ]qrӵ_:aJ,ĥV-7e.PG<OЉЕ]Q+ߔy!ućhx'“1cJ 1Y9@'xy2t"5tH,JZNaՉ !NJO@x9E:BM%>VO|`^zbb۷wxpN`O=C=ݠ67!x1 :ayt$d%a+0?!ɭ6+^:QLWhi}3y]4?Kvi?B{ sE$sFz91sȏ8EFSQRqW/@@m[./wz[(وwAW?gG2xiT?ݑ+nW̰& x?Ƴ2E]9QHWeeGYSӐT]r !5jwχ8OGI<<:zKNޯI΅)xW mqPY;M1dļԈtST ^uќ7%'mxy@;/g\F Y]VR*)9? - ~=?'^ɓ+GsΚR?9¦NNEq^ $ ^9{CrՆ ` /"f / <w@/bI 󮷇x;.v@ 㘑S👘7^SB@NOm! MeI$%eXr qB囊},`?G HyIN JLP;֕cBV+o= I?O<Olޤ Wde (qސG<OЉЕʜJg[钸@K:P:vyYG<OTЉ) 7WD64}#~yyyͣ#'C'RCW%!*y2oCaՉ !NJG _WW'PO̓oZBućǻgl84)((pSOπ'Cyten5d+JyPG|tu}sROπ'Cyt5njC15Wי ڼ0/G6|?≿y2t"ё,(k؊0y3_*8?ya^rsxu'~mȮ1C^=ŐuE{ [!@ +d?ey7GttSO}œG'B^^$ʁl\85"6PGj}꿶x3 X9򌼜s͛r__LM#ÛSSUXTdDΑ);bń ?UVO]57߽2wn G|mqG:/C ]8)پڟ4y+G;O{}yl d3}w$,C]3O?KB \0ˤC|[W'x≟2UsfpiP^9K~ w7'`n7bK2 7.!m jkЙʵ[bqP5- ->&ƆKq~cL&:16ճbq6'VaZX ;yl%kx{#oű i"_(4w\KjVz,տ 3S:\o6 ݸ&oN[ir1țY&֑p7؂K-b٥ynpRZT$k.8v_wM|tmZS )||go0K())*]6C\t.۱mA ΢yU1L;KpKcFHHCj4T5sSahͰOt,޲թDvVҵC816 ^G-4V"b)m:>_w=|ssGVhuAgo??2#;4+/ 7E6~nv%8VXc>1ҳهp8تCr^z+Ďܲ} hsա=.6GUJ{/sh+._0bJ_-ĚcWWU-,C7}sz//8Y}Wp8^|$鬬 %M]*Q~=N9Yy%ُ.\lKx&q2e/ů4v";NH9flw~oEz "Wm ~8&20?ȆG]9Lm)kXL?ږ]kG OCWs WzewD&^=‹yO!YO kVġk0&#ƀWg{_ cu13/ѽi\XG0bT|s'gXq+29t2!oOk/eOxfY. 뇘#ÚfC9>ÿOqcX3-7zquBz/,i?HGv]7+(,hE!/Aۭ=͈ 2O# =w k|ǹEQoVfM8N"YzvR;V,D!p55q\<nj9d"Ɵ,B/6x-xFvAabgvJxsVM/'3͈C31#iC|9LiĎnB" Ur<3r_=Vo3|=>LIVNxӠiiFov"ZCΎvg#;hF}_⣆-jW] H;UeVViBm E тgwvؕNX&=|Ku7m :2d/Kc>߈Y:hZ7z(ر;p~gǔsny'.)nςK:,Nxʷ0NS~<:8Qrx9BYNxi$NO ^sXx8wP,Wh oЍɶu;8t74.t$gT41TSXbBOGD^9q0. yQȵڀS<mw?d~4>>+YBiiVթ(F'뭠x8i$P /d\9l?:MV),hE?«j fmճQ*bE :ݼ%/<Ә0MŜE{m6?uU%kQUm]WX2hM/[<F4騞?>l Sŗu c L暅mA)dee#;Gб sX8g g[q^(Jf C?mFsŽ| vfe-Kr ,+`݌4'! u zjS,,V#?9 YY0qk N$̞lElRG_`U'kع ӓqIZ -*uh1XRUTWu;3|eق2l&sVW̨ݸu4/&ax dLC`h>c@C;diQTe曨 ̯BUX7~c<:^Yn\x8WOʗaIGxΆn;6*^_Nkşc`΍Xmc5XAl?v`#%w9رYɱā~DSPi`>*2&`sзMO.|Q$~6:+-w3KXe6 -gѓWEPzЛ=qKƒi}8ӝGDx.~G )(~uJdm~b1z{-ؙ׉?|tT̰=Pzq޿ـ`)-~^~aĝqWRL+Z~'ީwe.Ob׻Eb #VN vb]| YKF qt>ȮWS_ sةvqvUU!mL}ŵ3ǑQv >14V ^_;Mm ^kzA(L$&Ea к3m^'5 >bǶ؉q޿fFM:T_LY[v"dƎ,jw[h.DB#;7C|pg0ބs#v&IC?(w6p87-CfN2M7pÝ1S3j (H՘<;ܝlOmk0/(F5ꀧq+:2njBe9mi‘zq;nŮ6?uSzy_[xN9?v+`H&ģJr7>tv.xvW3nrbVA޷4z]ڼWp_ebp?oVXL{yNoHizXQ<]L&m 齰3h)OH?7⯗AbgwIB 4 z|yƂD\[;ɉs1,`an9^ÓZ1ƕ"O|h4Qjcg{uŊyW̫ QZ-ϻ sѱI`0{֊OdKbQ'("%H5byxFDY,:ҏq;WWU3W\~!esV4+h'!T7`Im3CH'i߮a{`Lst\n@[_݉gw91, hƣTa45̸9ΔBZ82bF߱|ona",wɎbymcbɺ'9A(9 f9QۅW1*%R%Y@؍,M&06^B=mUÌ8$ae;Ӈ˓ylDŽz3Xbu:2 1kG'C'gZGM9{WlC9;T( %%iͫ‚L$uς~t`Soz qvXZ/̅k[q(CqitY$l*nʞbl#rpLqș59x*H,ǶmOcmO`e桐oþơTG2>yp.|NH_H%qR*0, ÍbRwmXd:dYȎmrI9ÂK~dލ?]BYP_:-zH[sfbAL^Y//Fqdz+']nF VNCL49Wh8 xW`a ֙E=}.;t{ :g.x}mcHK: !yw 2?.Db\! +|WM:Zl[>3(}oa7FclJ@/\73N1c~C×c޽س||'ZC#?=)ξ07;<31L;JAX'>r<:c^('C'ad*(&`y{U qX`5i)exXTgNR>c4,:-,9iC[ YrƜ hC l.I%qcp]OB-V"Iخ/@QvMss(]b\X_=$8}9X2KgzF\9~a Rt 2Ɔy2ŷzJr7~vMs'3U8'Թx*ؚg HI1Э WEz\;(4cH6On8=z'[%ȻЯd10]avntڪJMlI͐b” ݑpOG2/N ף&cnFO0&ƕ:xxOf6e#}ȮNm)t]-a4uւ*;cȂ}tZlŸ6LB,-5bq-hcPVW"AGID[U=$ć8GG:-Xnjرj)^TnDz]neFY,h\[ύ\6=0vLC8 H ~@#/û9q7+в/f _ۀǪn=n<U%zW:Fa T  }'>=̈́t˟Vpӌc'"| 5L\YN[^s֬Y*2C:( *#}֕a? +h23a , :j |= F[uHM׋>g~KDނODe݃rRRwěΙ:?FfW?C~=r&zLux;2fbIZvN!.MŃ3h< µFF~a}V UV>sNox>:X;zI|RxʿYGzU#5Co&Ië.]?#O$TcsKuA촨'xЉҡ+u}Uա ϻ{9n2#>|E%w#x⽗Ga^Q 3'BćbNVO<<:ؼgsP睴LPX./Iu0)O<?ux2t"QvR+ԣ^x^NxWq YO85+'x≟:<:r97"?G)dO<?ux2t"c]kxbBZwDžCO?E>+^WF{ l;0x^3ggΜ#'C'BCW8"'\I2,&' YOYMio#'C'CWvEm, }%6CS?{TdDAxₛCp"OӐBShG[[7Gx/ H ]Wˆ)jK%CS?w]w'~Љ7G*'sӟB'> mXž!,^?_|'>rJ#'C'B^^dҹp:p_ ]cv|76VGbbLqpxP''xONDyFlιM9/ϱ3`zXd 6,xl!x'Ǔ;GѵO>^Pmͻ{̚5K֭[066&jkڴix뭷`6OZ'S!x'GcXɕX>CoZ466wa޼y8~G$%%!..Fx7[8q11:I~ޭG5]www6hS߲@?<:ޣ!(G8e&4  z{jhjjbF رť&xz~!--:^ҨxY$O -18?q~VcKFo\+))P@QW]~wq5]?վW~'=͙SM{^j?mޞ$ a||Urr2~߸;Ha{WǎWey^1'?&|woi T+-|7>C-B]:~^UƩt:}^&3|b.S0CfQ\@Fm?I<_lQ040$#) S<|ͪuć^dmn~xȑ$''9\NJ^q@#h\2ϒy蜪U!|zl]|hɿ&\(g/h mwk?/ɣ!W|Q^b #NF<6 ;͛`0y+ZF⒮tҡ"9`=:á[:W Kꕲ͋񵹗xWBի8C{i~??'^ΓG'bh;P)'r< qr 裏wPTX$Fҽu[ns%544 &F?防=s^xc]RRo3!pėS>/j&tkΔYn_?@'xiU7Y;Q4iY"&LAA'oo!ܰ0pmկ~˗/FA?f≏^>P $x9ON90WBr:ɬŀop)t1?Ǻusr=vz ŨɗM{t+ff"}Jb:߯sЉGGRs+OBw+]qx&&&}s8\r}u2'x'ѶEddI'ILuǹg6[s9|,x'Ó$}h ya"}.u'%%⫯ӟ/>XO<xGG:ffy:Xjph"dD;'>i*"V< ,5b| YG'((('Љ#StwGh e.yOBչsRO}ʓM;ڣݦ1X,ćK FO}^\^28)O<?ux2t"QvI|'Pĉw5ph#x'~jd3b,+ lECI?5t?'x&O=(\k""b8kx34TO<?5x2t"ё,SD{t5lE^?'xONd٘kc /VL(^ *N?'xON6ixjhrכrx():/}{P*O<?ux2t"}yl d3}w$,C]3?=og)#xЉG)PznY8S;~C Y7\V5 >xpF{yV?kT#W߈W`CbUEL~[~Vl؀uK?[J<--n&6<Y~4x[dع=<:ާgKh+B_XjV._LMmxGX'G1^>R4%xxpJ̊sȟȋزzMr2 -[_@՛72EϾc_a1vv  q:hAG ]nM|xՅ(7=Qׇ=o~w:Eu ig|x7޺!SdfK#M>)LQ4alW=~;l+ӕc(شk <4驈򫦱swʶ 'ɣ+~P6C_^] mi00< $ǾvN#2 glï~4؎-ssa6˯Pc%}׬(^x9_O%5:cݎBIzm5 0Xpq̪t\m|z݌9aHƦYig6C]JOɣy:Dc<GEx8#yCO <:NׯtbtΑy{ vނA۟6!?u6Ț] ktpg<87oGulyEizI6klc>)Ys&ؾ4<5Ͼґ $0ˎ Xx$21 ='Gљ<<ь6j5t]ƾwb__8زz'^[0^>,~ ϼ^%ֳ8%+_mkrq_3ІЃ۱ 6&N3⫎ՕMfutf&#x⣁:>+ KJEzuȼ!ڐ RH`*6kFif";;1llB+I` lBB,]3v[\E br[=U=k&.2n:SI(YYCn=!/Z]Cq|MX׃w)k3 ]93J߸|Y囗!Utϯ[jː;h3UX S0r<_H@'S?z cf'4_"[Wj;lX---P+B_"sp*J ~5M/X^5SxjyR:c/ + ;$NQ7O?%+";Vw<8pYX,Ir;ɝxdV.Y n?T /mYp3yuTh -rTUV2#*kRTךL.5-׎?f{ID|C;iC*>d9عcuA`Da/CMV,~|'60>QlY\CB<|O<)bگNn-r?hڢ4'' z !9yd@^x$$ex ӂ#ozgNLYnU[z1^֊;:+wn>~-˷ce}j2LG?*Q$,,B1x _ 4%UcJX,au&w Y۷"^ *DfaY_~t e$tG|y9V"fL u.h:l\X E:_Krah" qr JR̨o7`29T)/z-:uc nz'`,buA~Sv qgb7 +A%"-8r]}7F hA:Q䈤(C(jFvnn̬h޽ݽwoo߼hz'zO$A{wUg\DʲmQ|`/g|[84u߼ =#q˚0MK7\[k?K \s5<1A{ۍ_vCg݃.jFy3:[➑^#}o qu{j8}yvVcf9Ϳ_Wlt97ܩ deeYW'ĥx76B/He@7܃3@PQj.z5xGqs{zlG뱗 gn@]] ^O|# q!г381S>I=ξ|=ɭ7a6قÛ q/nU݈|$9F` ٗp׿Mxio "} ~DƋ"3x7/c<|r+ _Р1߼5#qX9<۳PۿInkl|AkM\e$ycOFԠU4cz`@52c Jn@  W׌DeU-8i=A)?sbIbd_# ^ItCu `nRbAʑB@K+TW> [$3񑓼~u|PVD.>1tÅ\>ׯ-^)kB&ٕA$kq &7;d.R.?\1)ϯ;`g<(|V݀ۤfעEajz{ڱeeul'<{/C'3ǁlX(#;"6?d<ŗ1^|?͈ 7"aVM7!)7`~: ֞: >3#qTrU<03c͸w`S"N?z'F\ȋj$t\"Pyo?.فuLkP0F'ןti<6_|G؍D&F%B+قWeq5r9pR )|+L'X~Vle;\ۂS RtJ1O%HssQ̇-e8q)X7^|:~ Zɖ~lmH╟O=4~˝л`{9|iȯ/caluۘcvr:u8}x5d%uKLLIDmlCxN + Puu4)@1\h~ߊCxki`K݌Dd0bͷ⪞0+$ӁMrHn.|ik(skJbZ*?=0L`vlny?qyG'.@3kGearkףy$FhIptKrc8@&HaEMpbx+bj aåkK!<9FR6| q{7 El帬Gݯ~pًeZ\dz "a82C]S2m ?WsTW"q4bb#S(Ư\| Ѝx ]w&?ǟڇ\m '.4ءg1|e.A4AǷSrgO}vuhm«WOhwbx⎯f})6{KV?&o+ ‹o_lR#NY {D6tӌf?)#StGq8{ZS1<|[pG^g?k0xiOlk0Ex%{Wp=rv@~I(MA꽇1NTw~~^7f.pWsq,~ x?<|o.=Cy٨z}R8T2~P>EQL&Xum4++?疥c=!$ccQM`lj΅OG7=6&lsQ4ҬMW0f>#}}"3~_6xi6܌сt 57#`|=VW9@}!6Z>wm N/x^ /UvX}>SoBbгtKCP0xSU0y_[>'e?h.9VόO`alk9̛,2~n>m" N*>\Oᕚ =ygnhbxM'1$|ʗI0bf@oڛ0Kx~ h I+ղJȨJe-CPU/GK+?[JH᝝Ë:~^>cڏWJ,DYvSҖO SxWxW3vZr;l!.K} JC"+|yx*`O^^":r?ۋiyH*?WxWx?s,ϱj6X+[?WxWx?s,1r,ԛ]n/cU)++WDg9$:qsUKNI Y _)sDQp\++ŸIxEtAH oގwZhMl B;~ fϦY^n$ 2YA(u!)kںTZHcUA^^,ʓu5rN ^K )|xB\ފO^^":ˡl+_۸3*+++|xEtNԈI q#PxWxWxW,o!$hJv# ":"qb΀M*+++B,Dd+WxWxWx_,":K&EDvI^^^+, rkv,ĉLr$y^^^r":r?$Ϊ UY)UK/ U϶'FOse (fL&N堋hT)&ⳛ& !`d`21KDBa  .3%4=G'˲?^NF._u]gRI~aOeρ~gpH .bff<<?CfGt6 ax*TgDgDBz@_k|N?.7,xkjj NW*PG\/n߹H+5P:DOEC<=JxvX?`}<IN ވkӐ7 WBxNX\s<' _2e⌨|"X,&Z[QF CgR8 ^<MT_,ZSI\Q ڥUF ?euuB.({|Ε|^&S3DU#SZO/nY ժ?EtGuOUBPֲ1tK։Y~v Ph^K0|^r ʙX^/n3P69H~[[bqZ`h 2iZOP];߹ˢ=dҭ>Vx/ol;S?UYq\xG\)T2鸃QqA^GŧR:xs >4YP\Et&?TB}Nh2|H*=@^Yrܞ8hDxWanze#<;W|Vh.?ZW:;;T^JmH'V"'k &+YiP uMFۚS^~/Qx] _o)ʟ݃͛6U]V4#wܺm^ޱ۩~SDg$:7Xm,X<m˛I+|BwʿWv#_|5W+ag:V~_w+4# ?<b ;o [U+9QR+XDo ]3LݶM]@nK5X֮ʶF@mC+zmDoT+~S-Xi36t$idfȕ_hKoZ}d" %hT_>i\ڷ'1`~>y \W!_g璜۷Wl0FF}~yA:Y'fy/WZ:\s f/ǿ+) aס8I.+áxj7+G{ ope!h~lݺW_}=z7nĩS돸$N 4*uLOO?nQ'nqIP:rL!eEG}77 lXي6 ͍Er&;zS3M_~yQc*W\!lU{Sqaz}#Z@x4^Je^X϶LaZqC@ݧx'o}W9Qxxm}(&=!~?WgKٿ&ΏcNWǰd{ ;Ů_\hT?~?SgG7nl}ԃ{#n_8x}pkqR36×ߎ]ۃP4~7݀?uX1_g1aW'N=OIMn]x0L:>]w+q2VQѦ/~E'0b۱񣟽Xq~r |F,>n?xͷcѣѩdJ_yy䨱^oCr.#?81ҝ 'F3ӦJǯZj@t̏Ɖqֆ`֮@j:28>xhYشmC88!qIļofu>`&铣Hry%YNM#ذsf[54AG](Y0KCXm$Բ NڏP VB}Șz"8xo܌V־# ȝ>ӳ|.Fڷ]QCJGؽOX-(2OF\/0}ljYXf,Z^BxU8BPwjn!N$ Y>{)[/\ V`G_Gv#΀@'^ډI3S=/gP'.~h=x a{[߼9|z-B^;bq-nm;jyx0nƶv߹Z <~~ƛV~} =䌼<~K8f\'"~| xg_xc=35m=7OP:|$>z lj7_Wnщ/v.p`׼k"9'OO' 4RU+Y>>n1\|'B9Ex UUf+ M'?FR liy<}N0þaߚh8 0>OQ۱ k"=5QGpj`szM+{bt¸s6>IdYA4b_ Ԡ1Τb~UE>H"}4Rm3#!LrԻ=agmXH0t3C]G5GV`ϔZć081=܀p?}f#3AfƆ18HJ?d>&g"{su]c͚k)Lfe"múUȅZшN:LQÈOgX?c0D0Dj HM ;`Nathӹ0:W1Lab`FWęa '#<^NCFrf=H-Z׬A9Alkl2Td)ղlH''b"kBhVO}l|G}I|W/߉6bj <[a0ynd']Øm?~}QO}5]ԇ?{?cowƿWVǥx[sCauG_4}/D?ݳhf|knn W>b)<҇oo[K:& .lf'?Sx<0z! s6HH8O__6{b=L# WއkϻzFCIU/g kO5f{~GgymߺxEP) 5NOZPx%;]qVoP(TtmܸLWoE<⒘,V}ןq-#g?;CgĄSYYBeyVSlVa&!E=U0~Ox݇ .7^v;v@D>v]éY1> F }^ށ#X = ~')!} 6i׳VsHWi?9K"ލD:-Ykp7ޓ:$h< g]$EL|y{: o݈?-vIcaX‘;S5fBC%R!yT/o}wSիkm݆zR\m"\JJ')vN%@G;pٲu33H(%'(A{mX^oPսdT3)Z6צr9,q,Ms65Nf:oSgכk oe`mtiXiJ2Ԁ쿈Z̬Ara+4ʡ-ۀ K){.<"sX;ffg$Bc&E[}-jwI]Ar3 zX[V9pICsf_(CJGVw!yvriwR{44ʦך%̶GsѥgjV$5?ճH#"wh<ԅQz%;d2e\s!6x]u׮`-CXbҚBy':Yw3Z?}c)?k|{],a+v"7#E]ST{h&n(Nb?0M|{$ղ'Qi3sv.N[G^"tuomB!^,;{qbOⵟ^jknŽ-ዛ[<WLk )ĪopO=0`#mpZ'LdX&S8lzlYZ' ncoF{!^=ϟw7x;py^"CG{;;1rkMjH'l+g˨ECl5lCrYOgD&n_ m_? {4EKCm{{1`Ku h v2C;qCp+6(#_P=Ok=܄rA'M6V?g'\Q!c5DrFrj$wXןl!C'q bΝk.uUf贸M;O!v vb_Wo}Va "6b]p.[Ղ[x3/.Dy`Dgy]ۇ-7Ux]c"QgS$w7N6|-]w >#IRբk6]s'wq=Q;-b g.E(f%O0"wy ֭wc0XHG O;c{D^y;qu;OHlޞ[vլ=/eKў+"F8kWndž--v)?#"V2Ar֭[x166k BpС_A<"t$vX{+'NLM%7Z#OjPєxlG[4p-vQgĊmMZjY~ jk0ShDkD#Kbvϵ iLfV_ꦤ?B؆UhgCc4AUP\WaES5uMXJ >ș3]ю{,z/O:&|Ğ=bdd^x!vtto ,+O,\L㽦o~ M!+pbTρgOhlԗQnc?hn%B\+ʰR)ٴщWOo}4|iVVIicm)֞ށM ~+YY乊揭*05l w3./4V~$;I#{pcǝqu-Xa/әSvoɨfzrG'+hDHeˉD+f;Ś()/$&a0N+Qq22ƣ 0Jo@fn  QĎ@ 'U 5A #x.n6Ug52q C{}&WyIWxvx㍿(m&^=#u[(~Դu{S(]!dgpt,|LN YZNax$XlCcى9T s>vtrkZ=) M%?,ْTbAjnA=7XdZ/,Fp ׇ;>C U_Խm),^C& lmx.\͹lwxwfmŭ5.`0(}_YA :Pd2G n̳kAVw%x<^ /|},wY{g LRdHzGq#뱘b asci>ƠAZlv ~0ƈlF&} Q>By$,6\3M}Loo1;J6*o&sÉB꿐g8`I;~ϳx|Lv=ge!|\/qX*c3+8ApF /jme\)!Ɇc2%@Qkg@pFaׇGjlsմ]cT07Zx.^^JU]:YP'y-#0٨k=NVFn[l :Ոh4n}3 bSd _ ϽB󷦦挭?V|"9}Sޝ /2 $/˪Җ,&OM6Ą[Uc`m8uybr$ShO _ \ ,8o<_M돻sT!!&q(Ÿxd`巫d[l!:w:k=NmcEYL2%*,rkmyi EKVx/؜:UVQ^]dlƓH1!cԓ_JJ] ΫY*es~n2]z8R)Dz~ͨ [w⵿#sPxR^yYgW?75N?qL@=ѕ)ʇf-"ӭ+~%?gHmʽɾ*d?NWCC={׈Sg:FN7y6g VA-<_- $!&+!q%s1%;/vy6TO-<=WiۃKv-NB0 (9?ȭnUIjh': %9e!Ѡc ȏkP`0h46sDlIQ|WbJ/b^_ [b>+2%,9SJXR=7-qq(+++|U 8T|="IG\.rk%$?+++W/w8TgD>DF^N|,=^^^R|!rxi $%*!;DBP: FEqq[*++ŸxnL&x>x컴Itti -1x^PbJ]WL&xaifD4_@"NJ.?2"MKK>ٯr1_Z`ȇ7!,qV rRZMD2G|ؿVꮯo BM:4Q1En!$(Dd&1{K\'Kw$~WP=`kIA%e4dB#7MJaQ js&}k1F]Pd|ᒛh(U8z)~73~>[SW=כw-{y)\s.`mzTLh+ʻG_b~r/O3D .t 5=yf}Z@:MqW7ѭk+ɤcssJHpPrЂ_*$5  _ BKOO5+t}X_c6]\"3QąLl 4*嬱 |Q{h`%xh{jZ u΃$|h6`=T0k Ej/nRWǻ~Ĺgu-N-uO{x/)<燛^?Y/vPwJ_*,/,W uȓs7P| > -H$044>_$&)uR@rqP@=>*xN:;;ugJub|6,1'%I5˘ڒTQ *yinER3$R31.) :bͿj%ں^~$ 1+דJ",I%Jx,cJ\B4*#7;cc#G}R8)5rYpJ$OSH%3BG0r°%tG74KI^\)$1Ez%M`MQc!,q/Ԝ޶JKK,gyxuRB/cpΓ!7.),DxDlAngݮP[]?lmbD'V^d/bJx*)dg GQrcFi>oi555D͜T1Y'cQg5Kz#3{M~p&.:!-=,5)MVҊHcV-q%UΑrIn[RV۟/89SlLu%m/^?{(c"-$K0vޫ}jb(g_ɳ!C8u$921lݼi$<|YQiYE')F|2IO){by]L~ ݇G g9ú#&9CmolbCe%h[*['^ u[,EyxEYKFǿ-XUtMkI^G靖 ~JmKBc*Lc";Md#ͱ) EHw//Eς%:床{ LNr#!> j'YQnhyx4fP\bK,ͣk;!$5?RߐZfP NmɜԴ3 7{lhMI dOxxY!M,2S ҭ]UXܐusSXX_̦>d(XQi0A'ѩ *bD%siW;:kT!5cNPk ɎacHtGexXU,Ɛ8QA@lV$Qj#"GK 7C~eAnYzu!)+ŸxST;)}? -'%8P9AY ,Ta#[-"5t5 ~F~?Z$U-JTWt^)G]㧪<Ksr覔Ɯ'b(ux=ό uǦGKey,$Mҵ9N}v Fܟec \oJK-[v}[@vցO`x9!(meΩyWNf<a'ԟ\FRY.Sue_L,dXUnU’QC$ rz#+t$ZU)rW~5Cvrn9;S欘:f?KRc9r F1EGZCdD:,)mrA\$5}-uto[ Po. dTթ %b̓S0-5Nq% -#  B3H[V-KLyey[uwUzo֝u״G7H#Ϣ2 LiP6ؤij×}}~: <ǻ!u޽}_|4o>hQ9'UB~ _w#w_g~~Ro\SgOOy +em KfNM# aSKzXŌtL7'D^՜}\NK + ,k3񎧗S%qtt/»RgHyxOPЎx)bP|{ ?R|CXf4ϸ2O/.qv#=Jh T ftvСl+;mz8;ô  Ye ?N!R*Cկ`ҘJTVdƫҥ߄{9,7.p-O0#0}J}e9KDZ63᥵FJ%c'fik'?7O&ͼ B%^KO֒/\=#*P^[~RxxUg\@K_R>/kjj $CuI6/szק+"Zu5Dj=SGz! &Ri2#ҩ"!WVk#uBxb }˷˰ݽ߯$F:#g!JNiM|v*c~*Ms"WY#ǍtM%֟^w.2}/{/Z8`Kr~}܈<.P~i`Q?oʧ]BhaVRF>j>g|\2BOBK9 ș$ 8&y'DD~^@;,qKyk0\OIYdHS37\$Z$vjdJӖ%H T"?)j!;X,Jrٔ "(/qVC~R*L$Fj0bp;P;uB,UtRPbiÑg}Wx>,Ɇl,fNjEoJ,)@,%F!=­GFď-e泂ߛ8’SWr4K%jl[Cx?c=-""Ÿ{xC2Rk]du  EI݃[o Lx'BS/^ R<.ۊK֑nHF"NDr>(ݣKZFhQb#}U>GLJuGmGLTZs4kcP YFfR+N4[\ =]{?<,>j)%(Nkܠso+z8%@ @GN9j7l*d#d: G2>d[;b70 w{;TdX9Sm [׽KY9볻@]N%DPhd5B;^:6BY='o:ίu㩐d5caGA$:זu2M)TRB%8 t+֘T2"6---dhnn6X8qSSSðehF D|Xȓ+8oϹ">BGB'Q ޭmHkЩZ 3Cz|8QK7|o= "Kio]D0xX`Z8?}ZC09N}ur2Rz֑t~<~zxekqb^u6D,^#7O"rܲMlޟi7^A6FΝϽs½Ɋڠw3"p<>Fni3r{_ G⶛up%>ԚLWp0YO/0G"MbY&ԜQ}&1wKnj`Xα6L'CWw3St<$M;B)22YYU0Zt'fIMs;z7GI{k# 撈MyRVZcSD }HOfjc, u 3t`2h?0ֵӞFg4Z3!$k4I3q M%5ہڠoi"i*Ǟp-}\BƩf{6hȚS9O#bOCww S#9Nath1b%y* cI oӛbI姣xj%8eWB~"{9ʐۑl|dxs[#"+⦡2hek㒩]7nEWmm-<gVJz]jJ+l">[ 籠:7Cc>Foæ+0یXQ@4tMWaemc!f C%אcOwdIhG܄w+|}OaD#󚥈C!@5@jA.0m7^d`?.چl'[OU4Owc\VBlh=}h ]A.]^}4ym3`^HcՅUlQgC!H dSɭF(>sU/¡N=p>k #qэ&EF?Cdt'5gA0`JٽV!]a G>GԱGUWbNjFc8^E&3)~!e_Lȥ^ZzQ{nmExŗp6="_Ibt#p%B${Ѷ(ڛ146kiqiՑfFʴ,gձ~JcL^WFq־@]E]g;:IFd흠ÈT0|/ c>'495qLsNf|\:5fAq@h]]k;`"tKy]<(wc y $XmhpoIaP(ȮmD9OR^w0C|kl I|tBK47=IRvհ́EX$08]=hFAf]VMqa5C"7A$neFxSDL\m0Hzf)o~z^jh&^ 0=Y!$F?j~E3;qL% 79Fk`R\25o%p jKKF3B_`2 "H%Ҏ 86_3)gIMI^7/]+N&A]s*'4UԪ{Ѷ`jr"{7+'hļ*8ᙟA Q?븪.LD"} <0*W͛FI)3tF*O4mlgt?"l'v9?ȧ_>g8&ȧnq?3L,!!Z(zVQ)2{Lс9\PڠEzp#6oDϻqR+dKJ w.&Q(Hk6}>"coΆP ʼnčRHr/ MԴ4HL:އ b0iA }h\K-/_-d=ikh GĚinC׬c37H1,it:XȧRH 95 $Cdi y9jL{Omnrt˱b28oa8ݻ; HRDJRh8v]e]$U*)MFBRR$"H@-A<{3|V:~uOOLO?a5L(w@yr ԕ9/b8ͬ/=cuG1' 7cS*= LoaR~381d-YuH$}Ťܶ丯O`:0y᥯6@:. {mj=]y{Ys{ƞО@S~fR-j$#5oZj xMTSRnj#+r眙Lpd4Q+x&.x)xs> Xʖo䁓-_@0S2 ?YάuԩSɓkr%G={6~Szcqu99g!`(ӟg8WI [_җ*\ِssB*0"Sǎ'N 9i"%_~3~')T@n#>SF dXt ++ tdz=ѓLm6Cex㟤 MT71!Z94P΍!jJVg{s74g:ѹ +3~k1ͦ˘djS*tdR#AwwnΟV#XlAkۢã\5Tq`o¦%%-9m>LBJt8՜Ԅ1eKh+Z.䛯g 9r4J TtLf4$΄\91M 8QWL&j %K~KaW<2̺FNk KfTp$~e]{UQ-WX\2eݻJuK!^d̢I1'Z>X´\羒1_&әU1:<]Z(ܤEGI^?F_|ir~vOÍkǷ!xIl}|ݠO>.u7N ~6& O࣫T1NÏS V>hG{ֈ?Gx7OO/I.\lGWYƩw}s>6|9ŸK'&i{G6\WS=WjSwg3;JynoJ 5˨qCí] Gᡯ?_twr\ ʠs\/ϩ|wv)xh&7pvixy6ҕY8{7fNÒ/Bu| ?XYu3<>zcm7ϼ8=Ж' QECbmh5 ޫ+ЏcxLg}O=z^,-#&)iwX?`= 3Mn-BKkrX^VUY :$,TVNQ&N>~N۽^(+0{_Yզc]GŌuP,]D.[YScN,t.R-֒ Lva3P7\)$,[B&U1g;|GvWa{݃.Z<܇N'gi2?7;=qlwvA,Nñe9 .(iքF GZ[LLtc YC{@vj[oe2#X`P25vn5t-茫uOF)Xڪj AcdaxY0Їf&XLu75ʅIv[㥏Xo&XpexenEat]>A%1{Yj{_ pNx}8,|ko~p%EÏ7giࣟ3?t`pif-|#~?οy s&fnsx`WK=ALe~3iOHP녎qg'_?яxqx嗕[G_.O3p^Np|kpyO_OxzGke2GLfbH#ۼ,` ޾cCߍ~"\yo]_;Q'Xʕyꩧܹ+d/?յ;_>VchrmLOO'3 c1+&3n.(@21<*[iI](0TnhCuj!U`–8bg#// |/p~U1@튟9 _Yk` I(ln4}N-N'`o::v})lfѯj_SBB,ڵ]ɡ::CoU@PsP- ʪ%S])`R]@`P<˗ܹs`_ŋ޼xh2'|`J&naGQ opfaTJ[/3ᱍMΪmOz}`BFAŁQ* ɢV¦+cA!^JংAEOCxPGE쒉QdQxorEO$ L4ᾓ [T9J nEx$,k&lnl*o޼ .5kD!9u4/O[oǯJtobc"XN҅E.M*뚝͛5s@#-2UrN856`c85C cY&'j ]{c+O8A*KRDEQږ -ql]d{f)f׍+E'8`(0}G|[WQ_A\&w RmBfpd7aIË*ťĞV@*326$ۦ=(/\+++*?/-720XTNsDXP xY$ :kɥ_ۗo)o࿽[bWsI.kҭ+2 ORT:`I}m%]Vv| ?U ؀۷W *b}Pف27J6.52X*n0o2G*V͙߮[7><6'COTjWbցϮu,]2njEg jwڡ3ͪ>(!!~Pzȧ zHXPj[1۱35Uɵ ĖzMjS^j;wuhΰTZ%tˇ݁b-S74j6-3KMLp1>,Z1 :Ўc=z xf?!fj,6&[wVk Icϭ 4i[N1sx^K=>Wnct`sk N>0|߇W_}}>#]W>X߼]h% xdo PC=W_>1 \ uzַQu//cMٞ+gU+Gt;*b(RzSFs$護ޒE6:skeQqi2f㮱ۤ|`&ΐ][v\X&6+qqYML~RSâ>$? "ௌ(< 7o3whigL1'scI}q0Ǘvhg˕W'sw~s[ 33Лo+>m.*Y+?68E̅6Q۬O_û OBVX 1ht( U,"J!.@h6 cv+_`حfۛjY4UDS؛\8].AÓoESiCGOQsrH'(?/SH] ύ G١7xGUכ0[Zm=k|q-1-GiŕS`#tŐDwc8{8#HS9~g2 pFinjl.B's1Oɟ ]u4]x64P^^mwxx%U6|pFYвB*"ߍ 몊( }+#Y6(ʙlƀ2cNZn^+Sn3B8n|^bqc1T)x]yIpcC?1) ZPNCz1K(iм'l]"w&,[+w ][0mkKIT:LaѪ_[A)u۱ՅA]wnpx2ŃSR;5OxdKofvdJyxb^3ΟQ̟+ؖ?S8n+NۉޛŔ%s'(~ b޳9s1<*=V0^a!)LlM1 Jv*@Xylpgíd8"<s{h1Jt CX~oigRyaR#ۑݑG2a}SS x!liaן>$d̈Q`&0R7Ex :LcvSe:?S費(hqDXoExk=}5~}I_LKAk,jsO+sR m+YFse/3vtVbj 6}J Ur#1-ԠO@ܭ\ sjX,v6eF+; GM9\9qz $c֏e9c-).0[◗VnF-_/0hIPr}[[pW-AP}%ſ2x<(PM޶oߗo["wݘ`R9g}LlL.&˘~}7Ş EƿkJ |\ `ק H0ǖ-,\LVIǯBQ܊D.<N.C,x#dZ`'bܘ2S.7SA2>u]Q9<Ʃy:/CD(2(~X!'e|(wJƹ-r3йKeepX(Ȱì_ONofc/sΨn0W[~[^0ݳjUfgq3}^%"I/}[c,bO~܁axM`(p-$SLi,|X:"+p >)ˣH(]:=b irY_M*./5)̕ISl*O?9yЮ~Dэq5\׾ iH6Y2#c?#CD~1?+yЏ8_s=YixihW-{^h;cXʄrZ4R tB)b6x0u7ܙiv*o\a7xu[Y UA)a-H0tzG)TԧܳBJ)gy0R :tOhl)w+G,[ƿ%ʂ_+J[RjL^S`"6vR.\.w!Ɵ?*.Ӝ2ɜiW7%|V[v0VФ EV+FAWCe7&6zY(d$6j&EMUFǏ@!Ixp xU8"fςPg gѵ+Y9<7ϔ/ c?o1狐]յ ORZ2f6~o.~pg{̓>=^>(ޢq_W0 'w ]M>8T+`r_FԙN{—9,߳@ u4ڍ%+l,@Ĕ_}A+2 gɋ@". &\?8#MP.Rٙ=HS2 C?=@T1;2excTܛHJ~>U5YpL!Ri~֭zfj aRX8U}c" )/V=_ωbsYs8[n딯qv ^?QV] )3ڇ~IYُ[2M5heRBkLM^% 0b i~_=-v/_%e+&s4Ggoo/y~x{qg__u~/ˉU icxX?EGjxnj:ɤڂk tQye&e-Xء)nA$?0DDU #QʧcpGs%UR2۪X11N1S xG?e/g}wa8D.S܊e&?WOKOeHSW&w!?.a'ޥ p0ߨo 6Ƣ?@O9>Fʾ|ܠE7tm vzzĺH|g+SJo~G?X=ק299V\ 7V4ɯ7V?A9P<)g'\[7=8~ y^)߮_;LL8\~csgӨ'c?9} Y2Z(?Q-~&??ΟM}it//gM8Cn@_ޙlP _9GL,0i:ǸS00w? bx'OY~~e̚W c~~A| "cj!LHXY0?K<36>U$o_RYt#.̓kIENDB`DisplayCAL-3.5.0.0/theme/DisplayCAL-adjust-reflection.png0000644000076500000000000007476313242301274022672 0ustar devwheel00000000000000PNG  IHDRl$tEXtSoftwareAdobe ImageReadyqe<yIDATx tyo٭_M-?PlɎcYbLٵMОd9sfNf%r;3v&k'ǐ1VK~kd$d+lvH{ztWW׳@7֭[_wo/@!ƠU@!P !B&B(܄BpB!M!P !B&BBpB!M! 7!B&BB!nB!M! 7!B(܄BB!nB!P ! 7!B(܄BpB!nB!P !B&B(܄BpB!M!P !B&BBpB!M! 7!rB!AhrExj!ԃ}QK!d=PU][V(B6uW"ܑ2E7!b.`H"VÈu$iB!J16|ļ*"Ra9RuNa'RVv#0a;'(%^-}a@DZ^"!w 8!l?ل-o?cY{}x 5!z,l m^x!'Bj%^ h xmbU;GX4!:sOw󜃰GX顄; \+BT# ۸~t^BjwEs.svzhpܬc):N&Ros_:9"xBi@rX>|,A[m맛#,BHpnvajSWli|6{m'nrgpB!󱶛K|!?/20K xDaoB!dE׺LZF$ޡ{}̯W]<&'7>(ބBvnGll;`i;!p _hڵ ?!ʹsX.۴sa={q{gmtQh9B!eBa^ԭsZBF ν՝:䩟x;"pBp79w`F-gh&{B٨X߬ ;$x(ӭ N!c93}-n˂w&B;ؠcA7OcVѹwvݴet2~|'v!FMmm綶w=V`Y;/S=,.bqi /uq_ҿ\/B!+62h #aFP %[z?>WƝ-_ж xoEo?wvR H䣝<Օ;[a_{tDq˵hնy|v,`o#|k'}茵r 5 }G]:ISeF-ion˂ti?82skW%jҦ_ٌ닋)~{#x=rųg:'p:wO[帍|+ڇ%UZ&e\yMx2Y'ij,~A7e˦[qC2w+KKx˶V>q![^Ý{Ae֤2mW{03!Cjm&O`_d>B wr!_%~-oSe2n.r?-$쐧wǴPě\>_-MXTVg܌7ڬO݅ian>m݁ ?|W#!-PP,o0wc/ѝ1ekQ8 ؼ-l^sEu<-Dn-'ͷL$Y$@/ZX\fnxeZr: uڏii6U<u- KOb dY?jt,=Vr{nvee]Zpu|R'ywf|Cqnv[ZE\?<z]uÃG}jcvGOowjcm9*>ig˷<8ǟn?ZU}Q~DOqۮ`!iԎ^,{,iP^\}܄?nF=W2RǷٿ:ז;z\z+JUpbАqc{ZlN';Â˓ʞ|όPlaj?' sA<@+yx깳Wbmvj~[)š7]ж8y R7_]?G $bhh4Ǝ>s~X}X0NT>|*YاiݽO|X×XK wCc*w-꩜c'[*VE^A&Bׯ̏7tfq+x37aT7v|x;"m\܏& |)q,Uy~.MV8I޾g~邵,Qny.>)wg{O<֢rA#JZ+={BȺmw9}| "+/| R/?ŵ=܏v\;"2_z ܷ~k? W/ǩo} 9v.ÃZ[w]:=OQ|Wv?N-}e{}s~J(xͿ,*n+?rqt9:V}Q8_XsZ |i)ίonf#]a9O=\ νCơ~˵#)ޒFKO-H%m(֧!f/l1曍yZ-vzܹ`;n݅~1x_9 /+"o҆bW"^SGpT$NWٻk᧭ުQt!BPV5hLKOIW۔|lsxvtu)ҊH>슔sE)b,z'}ǫOc]BqZ]qDžkW_Ŗ]hܦ sx-X^γUh UM:}QjW=XɄIU^t*'B.rlWyBi(܄BB!nB!M! 7!B(܄BF#8p5L!dqZ܄BpB!nB!P ! 7BpB!M!P !B&BBpB!M!Ҳ~qq+++XZZ>e3E"455iSssڪB!! Ut$YEM6Q !P%"Vѭ"f7nЄMq ! wQ1)e])b_~]ۧXg0pp}Q ;5ɴ,>p#BLOB[;ncYFэ;dIg151#UzQf?~syקyjB6,4^DtDrVj["5>X^|=Q}6ڃDXӗeS(G7DFGG1[| q>n4Bi,zArU3[ggg]3"4QQ5m?JYbdDfb>&qdXbLW|n L> !*Y^[vͅ.d 3VBiJo"K333VN eC {&=>G1ot30v$)$!*n1>[\67g~ȻKh_.z`#fu3sl ZVֺx4\lqI׳h[rJy}f$57]Yd+= e9VcV-ڶ@pϭ]x5eAa[))ۉUSYLO6`}ݶДҝd #[\>ZcˊlUB6H,xr"06vL%SO،iۯBS& \}=2mm&0Յ/tu._EhH>F2kOLzv(,gt >i2DIY-1^+{Z5'Qэh4[EӣUM4>`XF;g֙+f6zzv*2jCg=CEvNȆnR׋h 1"iM5M*ܼ®򝩎N#ׇZ:Aw$֣.DwWvN' XgүG n BGCqKr""ҳŋ8<Ν; .Z^K|kO4y&@ *#y\o,revS86/&^z\J()~<Чt*ݸZ\mmi߯dPDD$W"֩l1曍VӜoݵk׋{ZAET* +j@(׮]CBqZvvhy( io֭[9l*^9U'BgΜ"CƴdL11brO * #ڒ6bNYQ󿩖ݣ6m~Tj:a5= :D,˱I!dhUr7={,ޤJx?*҃[:mRKԢ~PM'LF(#F)-3(!y+(򚘴_d=&][ZugSiܹ?SS毽nI$MaՏ]zox˛.!4meFD)~miߴ 6klk\ [-^;;>Qӫ_oZބB^"UǬVvG7Z2m2> k|]o߯e5}FM.]Z^"k@!"NeihwbE7&cRn&-W5/@&R-Gك6Y N-Rjak.Mn!J˻enNf-QB@-BF mq4tvklbmCͩC_'6umF X(D3!ՠ.{%W`Nxs{2Zanִjw'WYfpi< ҩ,M`PÇ9^ L+B(kOk۴cZw][Zw7*-nýHuyqQj[d+ ݦڌ&5e-B^S,nmKKؗnCZSEl7nҧ7{V-D^\Mq!mn2*oB!5C80"6s-mV$AlO[>[ۀMD:W* ΗwJMLV=ر&nmyB!n_K2 "bsjclڨhNVMDE)t^nRӨWT9g4/ )OK6_Oa׮]Y%䡠yBpp9m!ֶwsh:{|j냛1my28 _ĺ֧%c^ؾ] M,%s2åKGsΪי%#BYU&q{S,M冮n*Υen{+Xvq+V!poTx}zpј׫/^%asw4^=x)>0k~/57?k /uV\3P㫤ն_c$+ܡ]j>ԄW ibuIevURӛuK[i7УQT#&$cl6HFLf|]aL bk#2iӫlyCaYׂՌc2]ku=pW@9#w3\,imi.5.qcZZtk/hD016ܤGU7~\qtUkْ4[R{Z+ˡu"ԬѨK0BF^?Z$q|Cq%pN]@G,ngUmȋ^DwxHSO+K %߁hϘ[f Wi/wu{wͣe^oNDUOH'it߫[[t Ym+)k'6 7I)GzrSYD5SSFeXjs\>55߹}.>?>NM=pϨDoAgJ".~\!DM%7 _{g]wcԂ9e$hat>/ n~X_-/c˖DZ}XaP ɫ GHըN5sacgp;w{Kdb/̯+)g4cq_^{tnggnx/jOih!9M3-rM45=[N<F&Ī8 tg3zwj#.hغegPW-˱}{h/57%?T,oPӛxjݛ|D-[TUp]=q{ΰ#Ƨ0ysP5%ޓ^لb+n#U8florfgg{0ˎ; Qty5~jڦz)K׺m1[҅MB. 7iR%ܻjV2M-w!!1z:(sĆ scPWmϏ7+yN mZPsjI396?,'jZ jb|v2B-._v!8܄B{(GMдܫ 1ML/aiGԲWշw+Qn54|‘;|֭[k#6! N["ܹ=J^oѿnnVf!˖?si˩eMƿIkʫRIGB~qA{踢ڸɥCZ;rp+$RVݤd ۸Nchٶ\}p:x]eWi:vP3ٮIiNy%Ky {٘\^s鼚Fxofc˫aׯK'Բ?E<~KMMFHNF@Sw; ㍏7iwxQ$-ji-VBM۔XNT]wXQ̤}Qk}έ0ڼ u"'i/cr#^`-ŋ8x9".BNהh+?.9Yݖp'{mV $CM8yEm !H FaiZ}۹{%(.k,ns M:}MM;ԴS9G IZ2˹V>dʼ{q7\@~һ1y^:.dߒ߁~!oCpW 끇,tM6{Sו7?kG4dKMgсp'ul/@;@]CXY@s|s\Y[jVW2U#cJE/ j4Ԥ_ 1E){q/ԘYvBU3׌-942hwC{ܺvK:O=ŽnletR 1h^s gʤ~ Ii_st3v3AB *J1^\\ ,Mgs6%ιNk΂.Tv+Nwbnr Ϋw*Z֭a۶[TZksqE^i[Zk(>E \CD!Hx̴nhJeFn*4"fE˷gKЇIZokqD޾F29 &paB}0aC| q_AClk R~JnԆ߼ uסZ,Voj/{:=ʘ87qY{嫣cgG:T;=`kq\ҦVrQz6qM}zE[L=z픹}^PfcVkQޠ\պ/x];>ۇo&DSZUt` S w Vnο蕳9nnQU"kniMG'hnJVBRwo9 GG{y+ _:t X)*R򮶸3êGwZSh6nkwc)n\{Q^tT1dk߱\~.ۧ.H×#XxƥzZrk閐zoxkVmֆcZ\f|fl4Fh~S /z8 ҠuDBceXϦz=hycJ鶩6U.ݽMy|!
    4*ϛ4k{FjdȢ- n[BȚQcd0Im0෧o߾g,V-.vm}hӜ\3^VMMj6Jd]^dXGB(b,V0dV_ܕ[^3^kS.=~EV<wҚԁ7nJ  pim}ƍ@2ݹ}'.~" Zy7gn7c> xj4#`*? 7A&R745B!Sr-кu_n_Ǭ{N{ LKț/6sM!"&#ر"o;yjſR_5=Va5wj`oo #aXV"LcVQ8ѣý[V*sկ 2ӫ7zpw=\|/&Yn-tr70ym|Lk^z`neӚa;[ Y&@#*/ýyZ0˼Z!!`ڌF(w}ڵAHUטi_dLq a(W"$Q۴HEDw+ʲcGH&ZQ`3ܟ FuuJ2 Uvi 1@|2*GK0׹%s3@8-BH iyx΢A\0$0:QLP\X[p&0hM!B&&7I#( ] uqxHAv:] iGwQ!F!+ OQga0}χǹ6 .[ײ{zke`kiYfN!!ZJ]Fۉ%x-u#!ZʱBxȪK}ͷQ}M~by# -N-eP?)Q$Gc{%Y !]^SpX~Tֲq/t,ߺj%\a}ϩ˵P6}*R!u?.*!\+ K֏m".s3ܥ8G[&]mFR{MG xX"4YRZI` {N=CL#fK 쳮a W-<"bzSk̕]Bu6/oOͫװ"#ã ZK-^ }IAmz2˴گI`oG-C_BjFz=0S綌}ںXMOqRk/ !j"*b*E%x-9*[_?/ !9ftf3?RancayY&jB!UDdB!PV)6kQU8&YfP Yc+FxUF䲌IoӢuz8ϼ BYװw)#dg!D$tq^!9{tQVXpa6B1J&̐B:} sx f٭ܶ j#TnBtCD0gDБBy;Еe% f3XωPh0f ]š( V1gcܦ-۶ ~] 7!yB)ZBÄٴB%2ik(#,ia6-l3W E^/EYFUАr±µ5tmra.wڄլW~0TD͙hQPuUCu܄y ;J3$clhDqj UZPut0M=~rKH<7!pg+$c'f13#}j ە*4׺`!@,>*,#Tbb{01>YPePu  XZVeWXwa=I0k:JHS˰t- fa0 !$ t6B(ܤq`CB ! 7!B(܄BB!nB!P ! 7!B(܄BpB!nB!P !B&B6& 2B}/n4*򕯰MYkB&gΜ&/kk=!MYeNE),"ev҇Bnʊ" 7KǗJWvKR);BYޙLK ˟PI\Xǖ<,8sU!u(xnNM.X'1!ӈW,+B(dY^ nˬ,BpLWyB9]R_" 7YkvD4{_8ڄ]v!darRn4`_,kъDi­VtD;B8̞фB&U'-v{_z'v^݉hg<*!PI @7m+:Y7VBpB!M!P !B&BBpB!M!X+paWޅףUtuMa&!MYLO?mӖssHOa֭(Bpfaa-j - IP2 +8?ppaYxY^8i.T1pFoJ$z `4R•+oS}R5AV!PZ,f^V!PZr6*+B(dno!M֚;5'i"'s,+BV*'%3i(R6ĭ :;;8 & 76V~q07.,-ͯb+KDBԐtw/dB6nB!M! 7!*޽[!nBH߯M 7!={'BRֶ]w !MwkۄV7!nBHX۴ pBڦM`6nB(܄iuB&4MƂAF<3BhqB!M! 7!B&BB!nB!M! 7!B(܄BB!<%H/GHA+Y|Gz0=1tuEG3ۦfS/-/96#I{bgH{Wˬ\3ύOh-(3W":/趤7KuNeΗE[Y؏1.{L?r:E~\^[ ¾ޒ:+?Ua{:bٯyֵF(܄8ؤvS7VRv!sb cI!bI델fK/bjbLﶯڗ9:<|i? 19QݘIѶ(y`4&b5fԡCsMQ XjL{wx=s=1uR!q^$R~ ērXPƔO(b.-5B )( gRƍ5ؓۥ IΛΔܯԔeKx 4Ri=Mj&f-ʜE&.c2v'4 R Rjđ)[ 8Y=(LW2e:[b{YuQ"YpKNiPO{v]#MHKq 1::M⦛0fײδF]o"C\`}ŕenRӢn NQ;)LIRG,jԭ=;F9l7.u2W>(qjjbXwh [Gܬ8=zK4Fqe֭|.ԔÏ1Z˝*Ak7yp.Q쟾wxPꄥu'uRQ%xB=MC_-tCN]iKyF~1BhqRs:n.)uK"kZxQ7c{ɧtrl cگn3}Q@kmCQYTf]uw#K'Wf{݈˅uFi5uK6q>~eN{5J:uyl Az WyaΞpMm!A|Я[BG/FnCrBtKu)MJQ`z {Kr>_w*XצǐR hX~'s2INyƂܺը`Iztfe7cw<3c1 #S"lʭC.tуOvDؒDZ}Z܄Ԍt _]+fpiU 5e"dX_Wb-Kߴ$SM1qeKf[p,K\o.wsKK[}K|![Z{ 6r&+Лpꢸ~ZF落wLvk! ĠiU1?1{5 Ϯbamid%;nȫft׻wݹƮ,~c=IV;]_ʑijGSQ.,'Vc_@Xkparv+szԚX~zq,6jMxԚ tR.\EU[yz-T~>I}rD"ڼ̰Ol||iηڵ={ 9HB_Μ9sνU.Ӓ1$+mY>a~UNH=# :BtRm SE&!MH]c}B UN!P !R *'k@qI\0gP簙֢4NP 3(Ul +)na&e@z{NW{5C !@6aBz/C"TWUNVEXbQ e,UAX  lfÄL_NJBMVQeXRiAY~燇btT+7,D3ħ5|SPUG!@<cP_6SK܈!@FP022(.eE43,},H!4pɍ79o>4dª3Tnju aY(wu&/̫!@)ܬD-k]\2R|0 ƲvqSNzHTB 9.:LK,fe׎ˌ(U2FƏWa5qHYjy2bz le qy3ZfWsp̘FӃd>a| 7!e@AIʪalXN59U * bj%~z oL5Q!@}BbAv Dmd5[svc^z'&Ki ~'Rҍj9'hq1bMOtC2+ (+CZdMP7֖̀ >:h~nq|-= 6!C-m: 63Q!@?;V4!@ z`PB$l*'!@ pB%d#AW9!B&BBpB!M! 7!B&BB!nB!M! 7!B(܄BƄAF-W_WV! !kTUB(܄U̙3em{'P !ɓ'imB&4Mk 7!nZۄP ! bu&Mi 6!&dZݑH6!nBHY݄Ƃrq퓬/B&\.WO>$:;;=BpUfeeozӛӣ͛-;w=܃eV!PZ!SO oxCު6/*y'zs)d2ZDZyflڴ z*:q%ɰ q!Gss&?A>tÇ|۶m %&zeطo/vBI5cE^iߖ*O6' 7Y~/"^xl߾wvLݭ0tW~WXyJUN|;m^i_&ց|r--!ZܤFH3W\?^fllL L!6Z6!&kg?ig[zBp* ފ__Q+_6ַji~ӟCݫBT]i|kkND|ԩS)ۄ4&F6&ES% y 51hv)MHD3L7,$O=&NH dOF}#%A-nBBZ~SYukK nf*< dmcUl.nh+mC,5:i !DZY܉=`tT+:8LO:X ja҉,;5,J)W4z ώbج8vXB(d, k;imNlVbȘ^xÃ*Ki%CcAZ|H(6VvGUC)[.=JL5JjIp%/@ze?016Vq]B&$4YL7$`?Bwtt 2e yqw8*b]|a{*yb*zPfb\ wwt'O~ fuzfD-|4QâR=4ҕ-!MHU)&;Thk "]QѼ,ddZ"L-Q6} LFH4[ٚZf>Ks$fdo?x?D+H#bۍQNa:ۍ~{F >5OmFM*!1hVXuS#l6lL)~ Fn35Ŵv-4uFYf$Lڶ% b#(B\jc Z$fГ:B6"\.H$͛ KNg1l̷|]^ܳgkpܱw:!8s Ν;V5hLKd/̯+)gI>g-a7!B&BH- CB&4 JÔ+}:`BjÚ+dh! !@r˰nV5@]Y=7)m/ 7!j~q5eʞ[uWW{X,ZCwtBV]I]B[^}jq'ռ*K?,JbGHidu-!](fPidjU  rHCS4RݮN_T]Nʮ*bб1uP sl"PNؾ`ZsCCP5GrR)|hip F'⭷և;<¥?P|'3Q@M(܄Tʿf1]V9ʧ8|(E4T iq% Q+\jÓz::Yݣ%֤)#pMHfDCd*m &TwLS j:fKpZ<({ȡZFVS1yb݃-Z,XZuFe!2M!@ĨۡZ݅XITٺƣaxH,aQ]ՅpևipFd&G0yQ4 nČU,0uئ8dI4РTl-hi`ҷ[džU]\ӸK5P3}PaMKkOKN IȺdBmu9x٤P˰t>]8RkAU ߻ҽ#M*'Tǖ#c`L^M!P !B&B(܄BpB!M!P !B&BBpB!M! 7!B&BB!nB!M! 7!B(܄BB!nB!P ! 7!B(܄B^\XZZʊ6O66hjjBKK6|\[*H$oss6X^^&oV~:DNܜv11v~~^N5ĵU!"ѡKz *-z56ƍz*EZ" wmSv7D!M6rk:_Ϋd eD6mċl8YH(ubAd/+-{Yju]",,,=N~\+bm=N6:fuo8W&!~*|fi&BI{mM*A^YkK:=رcG_"~ ׻]_~Ї7![sy{{Ŷmp B9=]hn98UU# wu|oŋ(4ALt,fN6/X&vC2l|l2p(J$ ,.kwCjw^R3Ӻ/]ay7v:TJu.^26nqk_Ӿ˛bi rKC j7hm NYzonŦ9-wꚊڂvcYS8nluΨIYڰy~ oW9ܨeya\pjg)%io\}\R~]sJ.iӓn2J~O=})$tr)ߧI(>yG">tQU^d}}pimMW߾;"ǵ_u~;oPKXflU&պ:sBZ_V i-^m4yOKeݹsZ{6ù%_*z/?{jpPH޵/aw#H_N#w7rVR.AhWWo}K0wIkw2qxqtLn\Ja^7QuQ[VHG66lb} ?`=ע1Yi0wm ArsfCYy9"=yR{ F܄8.\XXxDGpwÕf9<:O=-9lL2b̯ئg O!]G0h#B66nBMBn1]pz*g9$tJ- :i,z)_?R F9\ p~URUpWE{-˧[[[[rTRxk!;B7[Mvf]ݻhooH>/-!ryߚ TذzXk[+]$ AK^jk+hݐ2'*<:icM+DFMZ#ewC^Ig4-׽ RV̅g/ZlEvs^ֶ:::vIy'+CYbJͰZ_[ 999.ikbd=Z]뼊Y7}t-fEÈyۜ 6',CifS۷s<_B(ܞYV}ͲΡB* wC?F*r3 !Ys>ZZڳlZ܄BHpڲ, ZpB!½R ln.rs"B62VMPB0<B)m'¼d&gxBF-n:I8B!2},TFyk!-n'}j 4g.DB񷸃X%m㎸3gx!lTrĺᶊ6\JdqqS ks;:ؖB!A^D#[e]κ̲es vAWl۷o/nd|Xdqyn'RQ4WH'Twyu;'ŝܬ=_c_%XczSSE߂ϱmou;oߵ w }ϓo©iѩlα5Q˽2s˹7Y-㜃oIWk榮8{^hD?Uu9T+]'h*n~fHqeĭ3CTEn\0/UQpESLh5m#PL"Tig&cTJEU.vL(t M%go7lMc6~T]Psz{`0գ qLU-oL6Q}ݣoq4e8AnKt7-uv+Fkn&|ʈ2[;eRlBN'#L ?I:|J9NI#Qv8nbXqWe @Cx(@Y Jc 3Yl3NҬٴqgE$qiE-" ^][; *$S?ia;a<*r!1hpR9򔺞v;piqCpa0͊,!P)rJ;di??B=v9 YxM汈HUQg,]ΡwSy?î1gLT8q*3pa _|P5m[*34r!ݢs!mh^{ sCB7uB!W9`n>>?N> W_D!6,tk[Xb<u] ?ŦbbyrrR^ٞsi ì۔Q8;1Cw q8MBK=2_9:? EqrqqQ|PvqF_!Y[EՏ5Koۚ]ٯ {? _XX>^u_`iie\~n$8z:z`p~",,{GгoV\o|A<6a:`epQ 㲹 W./CfB[|p_.Ǘ ׋-ȗu77VOAӆUOFmjq֝~'O߳#G;7ZmƕT߷BZ\(itg l8M0΍]y(o\|c筴Qd]\3 833RqbAſsU(fہ*}*"]U"bpWeY/^vѷT].wTv;+Zjn颵PtUvl:7n776tĥ4o_'Jh(kL'P&Ҡ,vP: %^_W,WˍmWvEe;m Өў *Do;mD C8q˭( 7'|;zo.kkNgr]G ӓ~y9g( qY ,xGk^cJ|P!.p'{k}o>ꫯ/~gO?SNwȑ#ҥKQ}`v޵I4#ǥLǤUBAjl2B=yadj|W.Y65߂ė !5<%έvXWi{(+ʆP}Pk4h O7(Limݻv%>dOwȔk(BAqZx\='(!8Oqggg.°gu)f&#Rc~: $Nq@Z.?bce}/{{f@:nL"E0w ,fwM{0`0?'@兜շKg_iUm pEҤ-d cFP*4eoІ'Ư,vg i˰| 0q4֋y R_3ЧnBc[c2_*-W6Eq *ե-,o\Q/4,Ýq(/4Ci NCzS΋ O5R>7o pUjQ:pˎ?4H#&&14`Y hP8s :tH|7ҟB6brk׮a 9Mf}лjv}+B .Yhyz!xg{G᯿eBThav QJK[w! $ ;3!5$k1 uHj=6:d.Sˊ>mBEB`Rm5{w3<a>x饗୷UƇĝJ&׸yBH,2jRm M*mjW,ܞ0حq/ŭS.=w0 7Q&1ٯ :P$"XlIv R 'ݷ:׵ە+W|=F㏃JF$/oxB)}g31>jگ\86f^[el*-qǡ1{am8`\,mrȌiT)=4@B5_q-&-݁,*:ghyoo\ hq=pRS҉ bRNYW@v$aZ2\[Ⱥ]wg\z9P@u?uV{q;Kcc&]8Z vƋ[)lg"wx; 4䐏Vk[&㠥uָUF:vGgg'/L $ OqQp()g3vPh y+ԭGౝ1O[&nB(Pwå-3nr,ϴVO.$wInAL6cʔ?LD۞ۮDMSnɩ:ʟnrطomʼ=VJr7ot!b2r7%b3n2DAЅdƖ2ʅ-26[ i$7BҕoAwtt0i*q-W .-?8x,vJۖLM1WʟqO 'LvMWn׊'Td҉Tz0TXۺzָ}r,堲Dwq qkEd}9&Jr\uτ Vh[6.4p ō\RT!VoX1d;!mBB@-d`H+'.MJ`S. (I 7c{ZuՔC>0-9aV37i)`8Ӧ)/goڔ/Ld7Ң%fQܔ;jTu&T71?y ]%)*-vf9tJ<Ϻ5Nf&cu7`!f̑P{U3177INcm@3Mv!NoԍcǬji#ZJq;HeYsuLmg/hds\ڮ"dBQ%#urj1B&e z7)N0H=Tw,) AnrToT[ۣ8qx-Hr 8Q'!:BWZUƯ\#Wm9yt*SN['[U"Ў]\6=IqP F|QäIf^m0B1?QfDIG']Dˍڷ`1}錚 I۫^R2;4iSƃ[024O 7xgNx)Ӊ7wZr?ҔǤވmiҒO9LAfWFm&7e)ly'+R8!> $]gaᄈ %a˝H+_F4G) %DDDV8,x:' LTZD4] ( )DDD'gJ B=LtT: yB@a8!"":y Hz|yOL;(骜BI`F@a !"":CJGl]/MMk|߅id#BRҢ3wz$NE~8 '‰LOtԨZh@ ':6lvz"YlhMXt#>!QxDu٣v8DS_2""³\U$4E`wUNg^[KL<ONjcfWN X80%'o߾A;ʂTUU Q>`i鑡jf^| 1YH76aeF|n#&!X6؝pcqU4.-N ǣd_N $?3sT-vZj&slpt=\)ʛ[8N(2N-hݻw׳gnx,">{=Aqxle'ʱF A ;◐ IBTrd'x `<8d5\X-VHzbqWZ j#ϼI'cwv&i,<ƒ?{" n"R!-R%(&V3dɂJS ,IzDE`FNNLGVvP◚A.dgg:Tgb Q8$Dϣ$q0d?F' 3&ஹ!b h(-/ֺqX?cb(T/|mss?+;,F^7E Ϭ:H?p4p0} e jJH~{Dt_=ܾ%%nIG%(]%ƒEF1Ɨu?p[Ff)5uՉ ח݁ҠdddϹ|%+~?{/q[^AFrf6l;Nc@|O}'܋ wa۪pgc|qGFO{eF\݂ ٍc&rwxwW4|,^[# G NDtҗ+l^6aɱ4H-.7@?V܄aq @RRR-ss cxTFD䯷!+?" 'crH>]ƃIZpo~1<ç N[kK09߼M(Fb>DcM7^BX?@oٔS@N1#4|NFX;e ZbMڅrR}c[WL6F:gZQQn<˅qx,1!:`{-:-,V^SO8\2>Cnro >0=5Qξ>WBإk̙v=^z ^{]\5/ي !u|4׬[уI-? ﰘt|NPAo؎Ig\=|R4)kW8.cNDSPnX3VҵQEm=J :hƑNd tG=գA<wɨSvٝ KV&bQQ.w+?v1~IGSEt0KLN`oF)e 뜾.}6MB1䤳`˅eX|WZ:l'VA}_m*6~DDDDdW+_mRj (5VIG&(+y./t':ʯ=dXbBDDD~31aaIwk+1+LDDDЅ:%4ݜd.e 1ఔF|n ?XQN'罹NELǣc;In"Hr8.S B&#xS08'A!.6ם>q$.a8uFM=얲ו`M10֭CA9Fc::t^ymq$d3MBzN-q9d 8}ey+0q4L0abgOGzqv}d; wnm׊N@cFc̐\NN4kkעϙ#7yi6 c+P^V|S#kD$Zn\qZ}+WA+ZSן=;:R2HmÕ .mj-o:l]uuuC19;Jܸv_Wё;̙s:6oف!_ 7t1 A3"0yPuCF&JR9]ddJo \DT{Vm,[ ~2&yi8@6v~AFQ }oԿkP{-ò%hnjw2aىUX~zR7ܶRl6-Ϻ ӽSW^~ QQKqpjbp™hTb$W ehhXN_/G_x[7]hl,Vo8qy0"mHk'ipvN*J^I8ur<"Towhsb%cFI,r,[ބ499)iplPrFtoMS3l؄ 4xKL[rC~~NL$aˆ\SWJ"Hӿ귕&IՒk7ԀD\B2jy[z,98sDGD"l˃ {`֝E -)vewle &Z}'#~_Qu#NAlSsR雁d<̎]/L8D(Qm^wyAQ'')j붡h@6H"x%$DDDh.$Z: !P*Zi1pP6Lg R*][0+BNVaA-zd„^yiS&ku}ؽsIr_Ճ69DDDtiCc8=VC7Ƥ܂VAΤ,SCIӎ7.* )ɰJ턵0[mRW VVOhRb cV+^*-qx0$GFD+FŁw}@lD)%Q.v{kӈDBDDt0%$Rp}cV %rR~\Sa i6Z_܌) caQ(|K I9mZv,uģ\6["ݷ'ljI]kI_M[(y;yP4&<5f$ 6 =^js#`/}%j=ʭN_ci֢ \2*yq\r>$[qǯ..C7V^LP 8D%j꛱xM!*Ztޒ%ہ;fCxU,±{ >6?.ǻFiu\91%X[w&i^%MDDt.$ ?(CVFoMz %1a$FxwSzȔRFnħ"Tx}m( 9mJm@qɤRի7iUə3a~KԂѸQب3aRRZg ÂK| _ie]}_7f Jgz6DDtej@h"'ꁤ*=pcxxC8*+CiLB X[ R \V[54moɍVWw љvpTHLŚx)(i#WN *p.RS2q哐-; GFխ vKs׫QxpHal{~7L w.:KWl=x1(̀m5+{a, MaEDDt;CRUB}E)9Glx⸛ CnžGQoǮàL L,j7Ef Z) K/%Z-=VfJK8X0J2+Gv/W!'d^3c@EȼIl/7LV !bp^*e!g?g_K&앓mO6+7{m]٣27؅tp|߽}گ/\/ƃ[1;;5;vرcwܻ$LІW/,E Isѵ5)Mb=RkM DHhP%E8Jxqbz:tzXjJs;ow:G>BEV `,\[=$Ө1῟mP/Zf M˲W,ܳ%5rJOaϷSAJ_Mv so)yŀVm%}olLaV+cXZ!.NYEyHO29%&DDt;` -@B2YqWCrp5_8{%ku%8Jd|\ Pm J$eXk0H/#?7QŽ> Z+&dFWV.@B[T֢W .\9!AsAK I[JaA͵꼔SBzf 3JF5`YuA͟ThੂKq $j⋱N`T[@ ERc]cR4NwbH *"=}7v({Y(d8vJQfviO۱:-yFtl5i‚G`m ,?MƬ1=C:u#@QZw8!NkUb"[9 ƽb1[Z܆M[ɨnj߾mU3| j]HĬ2z'i|φ_>}sɚBl=TQ}ӽW$7ejGo*k_90tm§nMJZ _]:޽c862я$% 6? VO^5wW:TG@?a=J&9%&Rp(QK|EXѕ,~^,^nF йɒXKe0oKyo۔Z^!"":c &_"~NmƠ^ۀjAW/+!Qp+zp"pc1MbkStVd&ZQDaı~VH<Id--QO걆wE2P"'#""m0#T4;jO J%Rp(q&QHW <4htF. |Y:.S0co&$i1O GYQq'~2Eˤ"w'XEo!|~$cy`(<(]jz\Z'2D pU8Jݒ$i=P ,} 9/&fGMkDH S 8fy%#n;'O-D4 wrLIwkٻabzwLFu9\ץԘp=պmOЦC}pvK9Go81%g!+Rc+2}R2 ta|f5/$ٱcw4I_F$#q@sРF:ҟ4d&-bٝWx[x;_MNxo#g:+N;.>{oݎlv"2.s'eVQW =14ɀ=KxWC4bq ++0cb68(~&`rK Rcs1"Q}Y06U//ĦqU(}d8@ @]q%nElrIoq#G[oٕ_S}Sb?$ـ}blPO#*5sFݯ Qj`ĞGl`Y^ cL 8? i7b؀v22ՈOڃ~mUǧ`L+bi_s(qPV6(pqވiݶIb~PqlGBZ:+~!۴9&­Xv G8ml6v/Q/+kji+w}t\ܙĢo!*#M,߂3gaChT@xf8+p[ip h6| hFx~!&#^݅F:s#%W5o"*#O_3w.gB]dDt||*,AE v_ ? :oN+u"$%VKJJ3clOV;>nK֖`leڡgMSRżQj? Ó7 %XWf Zcjx3hŹA۠o=(;[1F{\[؇-:u*{AX/mָAOXuc;tZ:\59d;aZD@,Vs&x/gp.*7luᘩ4nk!غ, MhwiyXh߀{P\{V6X^=vjĐA鈓wG9Ժرc*1Q#Ğ$MVM]k lҴr]@K)޾E_Ž FCxZ(7W׽bKFMcðU}oM~;*5=X;Nh,` ʐLCao!5Ba[K̨[W`Uu1nU,vԵ+JEؖV"o-{|6!aX&C+u룴ڱOl+~.we3u" XyLK+Ոپ:f//>lWˍF|5b~UX[lFض͋!w:=i\v4Fb@ >ڂӇQRN{v: x*cżbQh(W2wZ6R+ 0DwjYֺ4T =\pWiNí6 D|ɉ}^ deeob(}>XVpDtr9jDuBRJ+%QG/7[q`PJJ4muHcX^}]bFsxLB$!cƳț[ 3!vIh@NJ 7-sFa_fD>ȰQi;%˝O+x`E+FmOI:mLlM79OTώF^Rxкl>ЀZlPyO9c0lDžnW( )v kR2Fbl۶wwm҃;Ԁ>Wc.ws:پH AQK5=źJu]l%7!3m1IIh NC輡+ރ$ƚܨ;TBmnĄ//amD+gǎݏZD;o<<8EMHX/ wu$_BWaEwVnT->#~ͣFL4ԎAߞIdĪxk@ Sj2.oۋ 5n\xZ&dU 3**_`Hql|G5NHвsV:5.=h Ǭ!ض JQجE˂2 K0KLe*k`m_Լ4 scsEoJ11]?,@RQGR~7S]mFXiU[=X_}!7bGԣnvea6":oȶJn34 /k]W%&CmU#J]=c"yq((zk|^CQVVjqPU\o4Q(~ w7m[:*w(.9Tn\ۈjlw-u(ۦ.ynoKyy) (V\8:DQwbrJWbn.jfoF^K@ رPM]=Kӆw&PbE@r[mhEL1^Ί'%sˎnu{[x lQYIIF:3Έ,Ua/tMbin'hr>d-WOM b_ޤ#w2LɄkހ6f/ŭ BwwY/G{@6n;-  tq4ȏ%[UMjR7AD1uQ7IL;LbV 0$iG\k01X & bWIX%mX%wLڵ+: V-^9DDDcjk;UZτX1LT*!A]@{+*pY|\m"""1РU ' H *[|9"^BHhsPT_T2-iƇ~ mJS DLN(QP,Ik;&$Jd&=+nÆӉ~DqH'uAD)W /5 m& (nP|ȾSE'Q)>ሎ'y.<L%fr:[w""V $TvdpN>. NZ zMv.wo? tH{FaWM0zyh.sD@99q<6__/_ؙWdRMcסgk?ZO#^} \i]h_&>Q$ġڂ~[6.+atшgڳLc:aq3pp2zu8|XZeq/KD]f?jjjЫW/߿l-}=G>Rwܣr0SvTrjˠuyܧxdПd]-XBʰBۥ뭶4GdfyaO"uȅ]n6L=q(xNtCALѸը Y_%+v %>0,DQ0&daԩ6uX)w\7Eع{)mYEv%1JCtu\%״p6nclq"ZI*S'> v:]=,FaˠFr^4VlZ*ҫkC ".CDMz3.9}M'R@Amnqw'pkUW\ndĴ,{աY2iDcD;|y8pp$ʥXANxy_2 䧇!-'>]YQxDmtݞyzzERZE,Fنo~cRrGvŒs[OQ_GD0bڰj*?-- W+aTdz˅o]:Ka:vQcu0fNb>,>Y %OP0a^|\D}k 4H*i4RWD:)'J{r(--i?]WWYg?lw_Ctj l}dK܊DDGG ~,.*hnqۜ"L~@4Xv3ƍ$"YB+q0БTY$v%F}:  Y+,l*a=7Q}+"""b0!"""b0!""""""""""b0!"""b0!""1c܂DDD| e 0LLLtDDt"HbChѢbIK`r$ "+'4Z-zaw:p(:t;wl,܈?e 2ƀurcddd ..N|ףDff|ii)mۆI&w갽{;%Gdd&z3S =W^yE筏\'b3 y;<~!#шFb/g)/obBqpoi9)ey3Q5]?5c!<^g6&57܈8s~ 1T~u0jDSwՀw7{/of>k#e/1K ;ߍGtuɀ+~nLNō݈[nY.+p!0;_Cfg<~vhxl"" Z_TR&4kޓ&ˏq`x91 p>gj .qN̘_KBΔEg1m=T܌][1>' _ M<<̿Z5_y62_hagOQ 6;a%&X>ڍy Ru!>xqL%φc'{sWp38{1z O>(bOF&ߝV?.GΤͰmtQɤ@]67}:i߽l/~aLn<1z?Y ^X=a(Iڅ}0vX>4RNv/v̩í2c X0fD-b-xpyFUmI;!zP,ukwu]u( BM)$fn;;=ދg>33m|pϜy.uK4Jm ,1>qՔFL)w}ܨ8y^7*[Yu)*/>QٓX֗!53MNK0~ā)F({^Q%G?³mHǿ^|dAM|c-o+vޅ;`.l]<hwⅧ7@ҟQ\V XoY_({Ԧ[M6(2ͲY#1׻k!s >%Mi*p:'͎E?¿_z*ܷTAQv:2OQBrwGZS,WEj0}b NÄ8_X!1٦JL[ B!(Pg⹗ўE8t9'"m<[ e  }:a /N l6 Rzi_}IG#o1=}ѳ7^~i4gZHL)Axz67>ZܲN.d祂(*R½Iٱc@&uǨF. }7 !!v k)Ld=$ o &rB0X0=,~W!hKTx+lpPi:VQؿ9u69#,*Ԇ'h 3Ab/S-t^x7plZ`Xfw:o_bes+r id vKi+N{˱CHY/ojjs/tE[ e{fhu ##A77}RF-1u v፹[3l:m*=_W[?y=[-qj+'DϡˈIqmj5vnp: L<5B1¹{7zHۅ } Wox>xd6!<ZA8c1lCxWQZ#fP?󌕻=yx2nĩx:`#uXs|nb7;}o~M{P_7_ 㳏>/?NeCfX} yp5iǚ5-]8TV֍_mǫ~O`[r&fzjKס$7 o,8Sc}ϣ c1T"[Wj{G<ԳW"!{ rCIlʻ5 6|V*N$o#1HU±#o eqICoB0[3QS} j6`)6CI쭼{EaiI.XvO0e$~/G/~QAfz6w.%%v7Il@u^[;s_{qܓ$kQ#cEg1e^ N~/UEƦS)vp }oc2|Gvm[3^{˯rBG6iEbڤMaH>6(9_.ZOTua~Sw;O=:V.^8!LF'BCip;ӦM kQX^ Qzcg1r|;h4ݍ 03Q}}bʬžvGz:TfJTyN݆U~$BCªQzX%bol߁KEV"z,CkM+%]si5M-Sq= .J ޯ@ANwq}7LWm6iә6i85 \Fڌ_zSxkKK9_ŵ-b ݛPM36luko /KV݊o`맳Ӷ,_=:z%E g!cB괭XD>dek,toސ)$Uw_]"A`Ş>(D1IxĬAaX!Luz?yBsp]-V sio}Rx _ƀ8{ǐj8u* aymwͲ_}//W[·r0كw )LmјrJ[W: $~L'D!,nԋS5e6 oĸ>GfZʟ^*67BCŻM~Ѹ(m@kX1 | .F6NPHxxefuԤp:u|Fbl90Y^+/GކsTQcirtrU*d/Lw__/Zc*]~Iuzݺ&Ňm oV'|]$2P(9fOX:L^aar6H\}{ HF! 耽^Ze|Ice 4WI(rů$L j `  &AA0!  aBA   sA_FNNH ̟?ͧ   HAAtO`^FAJ'gzAA>$L  aBAA„  &AA$L  aBAq }3Dp XgȪ7P*qVZUA5E8A\$sr̹ZCU[OV|puu̻6w1zKs^Q-DŽaرn]0 Iĵ-L :5;2SMaW^-7M Q@lC~D:hzlXo^GJއm %:"A%^ L{^Ñ6HEk^C,!2M]^!NMN ^ zqD]H$hmU[C5$Lr9TiߟZ9®=w j?Oz'7MC뷡W~H߳ R*-T${V-׿l5^.9_q#qaHߌW歅DgqsԔM§| 0k>Dҁ .WׅY?B1R{6c떭e:ЗR  "ׅ~0٥WjicȴG1D AA\W\5#&AA\z+AAW $L  aBAA„  &AA$L f1L&id 5 \.?--͐J}9].ʃ5WQJ<-)PYYdHãGC= i0+syLd%@B^1"JH7`,K.t2&4υ i}17n[s:hjj$~TUUUwď}x)eeg 7 gtc1lܽq߼ܹK8m[gOYZ޽fz]+Rw޽{{P:4 r6󺺢t״^8vFQukG⼸nTJ`i+ވc=k ƷwLs 㢦ayq.m7h%-os ˥<0oC!33666;v,b1-[&6l'Xc,l ,ܭeaO[ٺk.LIAk s6oF^^}nSss3n:US/n~o>ߺupߜ V~q~g⋐Ii7NO>D);}$83322իW xxҊaN899!11^YhaسWp3-I[8هiM/4ZRDn'=NRUiਐB/!W4$ME9~8p(UQ m&F(O$4w~ f#oLǏV 1c<&hq~Q,m7? Lf('̗>\"%::#F8޽{[Av29{1&+'ODllp=ٱh"TWWÕ5fsH` 1^# -wsĉd1c"`qQXXCb̙ڶ}6nOO>bw#,<ߘ;wu0;!,=}Ҝ9~mByAY~>O'mm}\şy'_ aK$BG pTUU .e K/ oiXQaw=}͕F(fVpD#uHMChBAvNrGѣ0A"*6>FUbVG!G@8* Em0ȔۗjK+}*(ݼaS9,vu K}q&~"K2Q̄^HV-v4Vwr\~fAU _Xaq۪֡(.whDRz-B\,kp4) *?rq>A#TGqA \8| b(DC\H0  O4T7AGu Ćz 5!A֩2צne&W.sqq5}g\Gd@{6c|9ȏ߄&{v l|&pm3p n]|jZ˳Dvy{!ַ ttLT@n; /q!{2 43F6s-݌EzG30{3 VfǾxj?e'DX_{ 18zQXaa8y>27CtԙEj _yy垗>,㚟i#Ucǎ n:eCDdx  ?w5>aaؽg7v 73`{P__&&eU wI)e>f***- FQ%kh`hjB$_6M-r?ך0tñ0h@m^r`"l2DEE o0d &7֭[f{1'W"CeUUyC+fywF>sߠe&~xBrDb-$g??_89;P*f/e&&jjk`l:O/O!N0Qͷ qn#ns7.0# zFX|~䑇1OHLLJμfmѪ`Go=1YéS,b~ocڴ[{<`0zB!u7a+gsptG`V∘>!EQYLJ4qmͬӣbe62Ґ7/hY@o3bCcI.ֶTpvqijQd>O9 ,vtq?؁X8) ](GqJָYB tX}}D8Zu"px*m,>]a+-+?: tbxVlt7(89P88Q HU@W3w*΂_+vVS9J<19Z)؝ڂF oO=hTehyQL%}hh={q*`{Yß:ep0plrG" eFOC񌙓%+n[aa 0w77+fʷrOw=~<<, ?,~^aBkNaډk[|O8 kv~Ah|XIMI uYYYhmi|L*OnԩS)nNshǍYkJ37$$5H# //_:v'D'D"˒SNX4cĄ#Z<諯&0N,/SzQY' bhmm9R3qGdjnd?nF4}'/_fA Fb-| ۀK[IpVGǘӗurp5~u{ͣCݹeZ`e7G1x (M[&Z&-nK/bO@}>@_b77KAI' i >a``C]S%\.sͷѵ2HXk*S4CkP<]<\t:`NYA_CFc6g̳zSH:j:@\7k&7-i:.+/aǢȠf"-jYL:HgjD< Cl(ؿBub)ڶ3~x~LS-j<.нc\S9F$"<qqOKXO* £1Ka:t ^t) 1f(&Rx`$;[;3sǟ|N8>fhAw)1=Bdgglh.Jr9|1G?ЖZOa C )K0ax&eVpn9t~>]r*ƹg3y$S&|:lABx?n{>ݲyv>o>x1f3z~ᇱq&2+ăf/\=|0RN[oA~ "ٱs>bF1w- m"#"ç9C;qdǭ0Uғf'T<^;ljc񗛛'StaZc"VL| zv1B>Lj?={_yJSȻg_jF[,̍PeaZ*9"""V~Zhܪ2QRCb`k kp*51JT((/E#Ye^AG}:ZC^:IZ;4x|*fO0$V$%f&PԤbBHQW#%%Y vfetG,`B"w?YCS)auB=|P\}{ 8"po1{xcD%<.N[c@Y^ YBFTk@nkE!/?o>#ʜ`Re%zI> -Qq3}^m {b#OBՉD4ƉϋZ5SłatT}'N˖ K鈾o^.Al̈[V<Lwgc;C|8}%*Oز0;`}9-W8(B!qn7~Daq4Mbp# n쐈/YHdޑ6iwظoWQ4şlDFfd0Ƕm.xmNN06iҤq(+/&NxprvZN㖛o}'E_}%x.$$$ kn6a ̲e?Ae?/g"} Xy2>izQ '' „⋚k2X^ ,}+bl8R~~ :d7!*uEih WU:DvSHjQUY^1DžESJ'GMӄ&cf(1slP%qjRgxQ#OY3YV|>?/缟(^}6P7iә6DiK)Lr3̦i3i]+bZ&L\twSSO 0ԟ0R!6baSqIbҩ#4^ _sVOOs^W^Pܔv: ՆJ\={ umL| #pz/Va'_> d&5PJ[,";w9>r$p\/L ‥$L/0pc/SŖj^Ɗ+rs=o{7XYf.DiYؾSG[tﻒ˳GyQǤ;lU.V/;R:A¯SC.r%ϗZ69]ُK*L}q:"z kp /O!85JTVS;oOWV'ݱ,K[ ː.t*ÿZ\Thy `E"?lm/4!}ꏿN;(sT:]1J={!;WxD%*A ݃"۠hLJ  &AA$L  aBAA„  &AA$L V1៹OOKZju:k)E쥔{⪮?zVUhENA m5@:ٙV/_;?a#F; b¥b/oX;{Vk""IX3|ҠM{r^_(8 w`mBU=`9fes Z*B캂&ę 1L]p r*[mċ2U8^IM+F׀(lQ}$;o_LȫkFEa=SX#)p h&d;B{;P}GO@Se>⏞=M$Bp 54k.ރIP>H9yu1n$߃ܪ&J6z f֣,:F [UXzy {}"bH/}H/m1a(Ƕaq#=l=iwބH\~ΧNʱ&Eチ OXΥىj6!VezE TʂL䒯19Pksa~-a1 1!4,P81X&9IȪh︱78 K۩OK7!&n2.GQ;ve=JCѾ[CԀp5\Qg";jeeB!#ՎzC3vagJ 8Zzt (+~md7{Oc8Rdo+0z`8+ں`Q0d@|vmfۻF"q9|`\NeQm)Nƪ]9wz &W,Q(<#iu;ý)CY-ֳ7}j9tqյ ;8X%QWV^ Yň>ZzV~r[xz .ވ A]}/Č[K"ؽvEt=j$aІnBEǶa M-]l`+!Lz^pB ŤI7!֩GUu lޓF5"vXM> z sɧr$bIɼ!ɛ wI{]Veue{fCr^JP8"SG$ͶqT n pj}O,Xz" IVVKAmmC;B^i}QjQ; 1++ߊӅd@x/LK _8uO,Bʦ(+GUro8;w 0h4v|3waLxdc a ŝl3s6{&09CjV .bPQ.ãSG ]"S<­?!)PPAq%o!;wȔD&5oCQ{G֋GGe,aN/֫ 3J;o:0E yaIFyCFMC.O3n\Q&y FrB* Ķd{[*קwN?VdžA.15f/s b}}t<:[ b3YM&J0)?R{ QD SȬ԰ۦQa~Va8:9ԱйqD!8,6{fsDL3tFD%O!٠$7ezE e)Qu8`UC|a1YB Tow{{EHMiӛ6CMk$EwxkϻsQYQeL&/g&m'To&J'QOiSYXD /ӗ\AA¤„JAU   HAA0!  AA   HAA0!  AA   HAA0! EWM͐Q  mmjCPPd09U*QN  .9$LH\`HeШ Aq-HLJQBa G7rAD$-ANnaa!O]\\0z?NÉ$TUVD"!arУJ-8t4 z^Pfmbhqni롖8!s*xވQNdU4pnF1MXSSppqt] (Z2 Zf?cbPRiXb} BGOh&|t.id4?Oî]ѧo$s{۪5XqFDOuUԄ146+d_1Vw Ǯ!5fV[<ߐ8RAP07a}.)DXaߋ|e^'c(=ܴbC0{ H 8:{JDN^Sw-ٹԜ?!} 7>w[oHׂq31e{f9?)Ө h1hҽ12iŔLvE Z zצ_P2 OL?acムؼ#ܷ5mڎ?[*1*1ɫt)l4 9BVS,GH\0|[&` >) wQcI| ˳*L~pZșjv싗UFR@W Bxx8'6RGk*3[?pt"{dlj'?hc< > )r K*L 5z)wЯv$X=내K,w-Zcǁ!s+Đa Vη7|pxF >LK&|`5ky;|tU: Z-fsb#a;|T :Wb1֬]ۦM0e%],[3VZ}%&~>8QU+p b2C$_X iI3-Ct k:c u]BKa|r c N N[ Ə '@:~\kLk:^{rm+FVG5k8bv302 y2;Qp9jmIGg<|[FY-n!dN,HfVуGahY\C b:3caP+1uޛH"dR{R`m}7 ʱ3UpB޿5 %hb(T5įIl 6(oMܹ^B wzƼOfƦxK$,[YCU'Î_!VD yZgI/),4Zذ̬VrL*0zt0h*<פ8x[lE±T12\S9Qcn?1Wyf EUn:q ^YJG}۟o~^$Mշ- z#m.L+p,mM u' _]0Fķ%sýw S"{cݪP3lnAز7Ț+apCeShu9XaD [| æN!-^F@݈u C_ula#b\qT41%l25wL .N[duɱm+q<ԬJcK&ᡩ;fb'ðoAܯKz ;_<'Eh0$2`ALqeHKK+:(wtp/=`dixg-$4Ƕst~rrrůGlXܚEROk%Mj6zw uz*bb51?:lKQu nqRxI`W`MPtDAuؚdLz69qc0{L(lmY#*T*A~o-q2&J'gsiSæ5mu z𑁷M=ZƟ?o&nA8{u5qH0;"ذ&M8q,";wwKTUqQ$>}^Eb1 |$S-]2EȠ8 Vc|  E9n!}Fp+!<}HׁY6yPWW777ӻ>X)gAPjja:0&HDT/rA##{Q\0p|) *   AA   HAA0!  AA   Y{L V% DTR AqѠ  HAA0!  AA   HAA0!  AA5'LT*N<͏]~t-<;rP\yyg9)h&", IƊ+_"55U#|1~_nۆzw=ȫќAV qK-H,lj?cvo弉[Tju.Z| kl?p^9 ز3|:o>f^PZirco~>4,6 m8k#~߰nKs?ʴ=um2g~^q|Rr},Z=dغ3uLO+L%ؒR}R7W7xC1w\&I:lR}'>}Z}ѷo_ [ll, &gu)g(G>I!5~$e?۟@$G2rZk iVՉ6zx:"7@^.(I; GViCS,"=%8{3f "<'`r.CP|l6f ^aŸP^W 0$nCUvFw2ҶN~qA8uh;vJ7lݾ K;5z0Rl)q. )}p BS~26Gt ؒ0%6eh2l¾#h:]vbPt@MS+ҎDV!A՛xkgwIDe.|:G "MVX¶mkH&Wx Bt4 nV!$m󆟬;E(j"q2dCa_nɄ$6aҐ(پs7R2\WR\3wD6,o*r/|\HfO;J[)`G1\|nŞ-Ql.m! "*EG@R="⁤}ʌ\$v' q}n<EnǾcip`:!*}J3Ԝ2l=b$ Zby$͘G:٨H,dv?#1&Qo0⿓BҡkòVcؾCYq " j8ZyzS]„~g+AUtSᇴֿà2UUzUEg(;fr: _]f4Bat6i3t&#&yyy5kFy|ac#G̙3vZ^7@_+0ޙ߱+ė Aohľ} µى(i4yۊp¾ CF lj߾EF]-,QqQgȨ rvU X#f?uO8Z W7mKqtvA> cFZuԩS(dG5n ?~@z{? Lp:apa V]wA1q.ȁ;$K\[[ 6m9 BJĖUf^NQ|<&VD2|(jr5ݿdw(kj7ieMX-lOoI{xJҰjAV)U{enC(KSSK؎:с݆)^ϖ&R;WVO27a.y;qCg RԬaGbB"4}#2O@Ykӑt=>q ya04##9UX^֢_Ǯ U1N9(K{|tէC[C:yk4l׵ Aofg؞^%zqb݀]̆I=f$ V0r@8H껤{*>b: ?{Oa!ؾ'Uo8F}=/DQ̽==z8ygewO8x2t _|ԹLu:uaP,y[b ʊL/H"T4>TW'Yݵ.cD\/tZ1<qKz:4a~f:Ѳ.5kp׷`[G5ӦMoNw08քbTObء5-3: 0 #܌ KHpVb?bBPG,;<H*debc7FFfJcB+16mY#}xTI6eۦnzi$A&Ei zAWӿڰ!"Et-@BH$'{Ovsf{ s,{͜eX:0666[Yܬ)*0`6Yf^r֝Q*^46[$XtEz-qt26e{.ʊ2am*UPuxY޽G]Zt6 f|nN1=444dTkG\YY.Zm*fijV']In1lurީ*5?y8vUFC3?LfF^袦I}X,]Oo{dge f]xE,^+Kou:v0hA݌bT1olX#`{4BB%Q70_\Nӑt9CXV 6c=fc1dg(~'/g*,IߏpvvV L?T^i*UI]5$7=fEtPұ03aai@$Ŗ}N}S& 4FzN>05fj^<<< !hXS3Y&p6fe@uuƧSmuDuۃ]uUkQkgyyR180^i66i*n˳[>iQ{3J%8vxdc~V_*c3_3g $$/I899 0I@@Сk ),\S,/\<<x"%  zE0 )Y3t -B݌-c =M՛~1uUu?exH,P8٘s~”k.DjVNFcA*pcps|-0ו:"Դbmښ3;Xp,00"Xh1oJ(J%cfTeX:7ҧ|y"&JB|LS{ꢂ"1\x<`FMmm]ami ;~M5.\{ ־0 bF'l=)>39O79ɉg@tWdņJ=ͨo p2ΉfNkp3rMr~ԍ%OGf;Ns+Z`n猠 K{g8룤 d,*ѡ0@Ҳ H/jFꯠucOϰl 6zN),?tt0C:%J_a sxkE@HtMtl&["%9ep0vwT,CJTN 7WW :IMe"5΀P?-Xj 2cTcV__zUUytW 㤖G_AftiL$DG2Sk꠮MJ> T.\`FGG_ݸq#^uQ"(}s~"" ic ) ^NJdAt~/plF e :qh/(O= ݻ=;4Ro勏f\v(',I hMzzzU߼yBlI__'\OouܛvXo'qZŬmxi鞎 *EWWs&L.٣+} }$&w |>ee(U 0?޻wBrr-ڿ*:Qsҿmk=Ѳ]7Hma& F"--Ms9Xgg5>>>kH1 v;nu #R|wTʫ}sDwv;~/J>Qn>-Z%!pt޳Jmz[% qW1UB?3f uuuXhz͝|1g'cIL8+k0v Bt4K#KRϟAam}& GWΞ@GG &\֬SȮFpTY2(*cV?3G7VAh"fj23XZ{χa% :6&Nzoع$p-1-:h43湋)rM8Ge1̬{Xy>\U%}zJP͖y>1 0tJc ]qBp CQ=J' lo/Do8tP6}Π +#Sc R_Dhe#a>.t g>"#FL]6N.[ʱa;ΆJ~S ԮZIgYގ`vc> 11! E\Y֣Gy=͕]f2Ī&@qw;/ 5 m يLJuh@۸>`/q:VE٬S쪎T2K"cs%FSM1kTX!G"\#G,諲*`N=~()Ng2 *Ž# I6wXw01ևjlgv8PڌV ~PdAŸ?*ԡtV<9sJ1+ }>{}aQtP љ4q@@@@VL{{͕~ɕg*Is΅݈gX|&&M%@|NY <Gsb åzE) {0T2K2 EMhRj[S` М +@?bKGG͜-)fImc33Mg4vDʌYkGea~ؓW[˫`x}"!ME6dl2t}?l3_XGQ}PToH{*1o!Ibnfe 7 IP:ۨ =Q؟WpI9eE`o #O6%O޴ZPfdS–5}5V5UʲB31W(fc0} YmsHMoFD%RB!'#=Y1Qgʕ_|ݻw3kAoGWQQquud2Z]JT6p̸XQ\p,횚9[ 4s+eW(=+22٪0Bv$*E^6{,1[m `X>9ԍ}(Suv66$6w̒lgmu(.+G SY=m%<[*l1nŚ:ʲXS_QgCV_5 4xWmډųp= QOjSߑ2! ӠKJw ^9qppi<k` tw9ZR2 0!jfK%EKx4ȘDN u+KRp=9 ]Mp\'X kEEMu UXHUɱJvutQ`457aC3l6fWdUaU#/˖:>쪌,?DCpv3jdk-([#N- Pv GsY0wpV23Jt ϸKdv61vL1"lg c<XkfXS9:&TA6WOᙍ ;22x􆞞!BWOWƦB1- S`R% Ӹo_ Fkp gm$̘%Dtxg1;&' ;J&1!7 ILHbB@@@@@@@G6VUUk׮bm###8;;3<&666#c!+&4<_Ν;D W^a!sѣ ڈ!S?6^*jG 㯎`V㮑;:bD!ؾlقD.q-wTf_K#>wש+G:8꫱>%9Gn{5򱡡q۱wmldTIɎ;ۋQQQ +}Пs]]]L2\rR;KQv2z5+"Eyy D,xz#(ߏ=: ن=~=E˞Ć}̏3O|`gyxU(i\?G?6EPu,|* QTx%uذqD>WԌ[X9Ft6W\mhu* M]#cSsĶ)dž>|/Dž ܎]Hehc௃(ĉgVF"Ϊ`…ػw/N:3f [wKk qՍ'%6GB/9غ=&ŢHs|(8i5Lg=>? /+mc04Eu){"}̱n&hb']p[/ 爅x$jP[VX mXф-r2x B}|럙*NloYtV7gAvfcfa)f5/o$WYo vXH wf̃;o! C87be;K.ʪ%7V7IWM6Y'юXG >P)C<6|OY,|n k+pen@k>^xq!b}4oυ6)$s~:8طSm]#sY\"G`[ׄJ݀}T­^޸@M*Egm%&OFZBrb)/Ͳ>=WZۗpwƓ‖؜mJ9> -#G._~RaK-#b[>{nb!2t.'z`2˦Ĺrv}ixreVb|i9vrtXTVƐ6i#I@VLDuu5o9 N٨t<$%L5(FҏBز^FiatYu?'ba7ªsvG 3 Dw{+y*n=iwrFaU)d\s"B`΃x蠤BUoŋԻ?) ,e2uSA\9;%<,i &C(nlB^I+&?Ka%!h55//sUוHLK85>P)Cn?>/fb /#̼Y8r `զ"[>:Ndn g ).Mc^'#źm WۺXf_~A)Vbc畗0 :cU#]YFg{3J[Ъ sT?G[7^^xNƞcEגV#/X|vdlDgk3Yg1T,ô)먺t$گ6.=G_^QK9u׫ɆZzJ?SSZ>6aU]ѥ//y8xS%.;ڨvWW"CӸрbS{gHC+^]#u8hj]Wd~WK]]#Mjc%[h,+06w:6 HbǏgVCF .c"%%e r,bՁc<Պ]H8=(41GI, K͆bśr'ؔE I04\*K prBaZn5v(ptS ڽ?,-Y] '@̀ g ׇKXB>[|6z3u{w PN(Iu)rª^r/ 1Ͻ1۫.lʧ9>3Zw_H ⺕?@K"!u1[KVcZ|Z<7N<@K8=в{/"6 H>5ѩ$K&hx2i|#:ڐԳ{hrV ><.lJvB6 Ci\P^%kiͱn\uǴEU^69aK#Ew:6 ȣ(..f(~|j*G9oÍ`2 )"&̓ N5oƢ7YA56',>&w2ĹT݆bzs L kW#2)h8G> /}V# M'tFPl-;y.o8>h; Yއi+֬ވ}3h7gw?G \ mpÒW'jU)C͠~Xq6D9|&̜?&֡"`"̘Kg<@ Xh95kXOroPb^?lhqf'oTT1 *_Ckjgr^UP}2EM Ū1s8=Wފet |xǮ1C_ǩM];ev]1+mç?u[h!mÓ)zR6<`C>[kc6VIo~ԇb'1^_9#ݕ7nKn0urqa:qA%Fh*}q/M sDٝƧ_~ X̓cQ k8CQH_'|{db\(7 x{)bzc/zF~ d^B#zNGHnK!t~(Q{cu-zED8#۸q{ᴆJoDy-BCbQMuhr8nUֈ }=gI'߉o セ–lg@7#Hr_I(%$$В,iNu?HƲ1w-+W2ӗ?"Pu3 u0oC}M6O.glT`""b] E,#oZMQ `mm=kG Kwc gEeu4Qf!x3~' =g~?K?˯4+т$&w !!!r C6R0ȡ-Rc˲/;~ ="vuo'K&|GkGPC^>3_)V*өDqDZq4vрLF9׉ C{wC4uϨ07ldʾkC*7 ˞CA07OQ'Ҳ{7١RAI$e(< 'Bu\رZ&Bқ~7iWf~Ϟ=7oFNzU߇~u={m-oT(3߾ސ߿<ǥ_p]+o6|]!`Ju|8 |*Fա*`^2On ?'Doo /O? |iz{Ud50r{~ĭX)YZ/<3ovQV|8xSӜ2v5x_?^{"LƯcl)Q~'A S\ۡX`݊ G}ټfzx"Kwn ]f(Tde"7;\D}'Mz _4ci~ئh+@W8 Z,( SW6_Gz&84`̂iWbUߥgbjv<,^jm?l)v.&-߇߃+m0)0eixm/ \m;8caۺq-(hE=6aٻ?`v!RJ3.ϟ ۷fEM [^x'aWUӧÒ7e lre9n=HJdMH|;'Csx3&7˖- &Lf,R;Y<Gz#dq8bލSĆp@3GF'\ .8@%LB2:V<7 ס9;#: P}A̖:U}Gӕ?JVőD,p,鏌c)P602L2ں\R':/n"=z`x;PBqEA@Zvdd$ٳ׷~9ϳf;%i(Em=z ?q5|G-ڃְ@H ?̤3Zӄb2?_/7Q-5(Rk)SfV?[`V7qhMٍǞ~̊eggW tcKۍeEOp:w?C&"2x[O7|C}z;ԘVFVGz uXzλ߂lA@@@@ ,) Khgɬ}:+t~jyYs߷CbTwMxpGaIԏrBBc3އ^5%23 TgFLٛPֆcg5 k ! N>Ʋ?][D-SN3g΀ SV~R8y1Qqf/03m 9#!Y?D{HƊnjI!^Ɣ0`Fx'lߺwwc%Ql'qx{TE< l &ҩQ@3Pi~O]rqzWģ8Ҕ#X5 I_!ǧo 3[>뵌l9/P)1 Z,5Q3Ɠ~B~S=۸>(pm2xh[toRwz*Q@#~ ƄMDm)č&&.)qZw;IQg󛇌 -}3GO N .].*QCL*ơkc-[R:5 RZ1W@ ;lSz**~Ѡ7lNyFSW:cz;А~䧜Em/Wm%7 xj.8*;~˔X\cC![ EJ hHڅ3M5>8i(?o$ qҽX8&];d&]jkCHWr4w.>#8' r9t `h+V(+ʄ[ =^`u "|b&ߚ}mպͭ>6J>cm+L ,mC-_uam#mn27elX=fU2̼ԋ;US[6d4 J>:7ǬN:8c!fGz#;'YYl@jal h.@VV< c g̚2^ 5}"˟ZLf̙+͌@K}= ]ׅt*2AgBl5i;9A?6|P[Z~kx `c!mcce~7#0@zu~Bn.%ӤPB=~tCtJܤc>7S.}-~Lw^3j79N0Ԣ;OŦTUZ)\oΩQ+,\oXx$@v{1eƆ#z* Uz[N=#WNv}O5. -PQ1D|[庘egmAJrRrdԾSя}jUy;[UC 7ݶC}G✀$&ӓ)L`ߟFHh <` }]IZgQc``n`5"5F|'X*>yW_P=`14, Z$R ǘqpwϢ:PZقhؽ` ӱ &vAp3e9 4, #|j ,X]TRWOg(Y|}5 3b>E{3AblW{ l-9}Qj!1XW8{xTR&*ijhh{@7Ll<=דEze>|hQz{@*~Jhƃ\$=AHr5l1B7j&*w1KWpq= vDXN$_xT!'9Y"$~A|'QG*Fi5#߄YG'W)kBdo|(mbSZ==]d5>N*~eʔ܊x/So:LP΀IF01Ѕ`8[`[3}_5eՅijO< hCZve=()U;XR F\M^k.0binV:sC#E?PJYl>u% WfG(Ňr4źn\mɎ!> b1aIXw0)QNBtz~vK]p?"" icE"Ca١/,z+6nGc͓_f|W-N J,S9 wTzeؑ*aer20+ĄϝׅDJԶ}`DhFyu7a "p3ՔjͲ۔hzPZZJ@@@@?F~9 %Erqa/ o|shxY"˩M@Y k˾>aHX'(VS.-lR{qjXx1qD1x! O s]iN&V<("7ȘXJ0Cq3Sc|1¤°%kiA%ⰿXSPy>1 |gi W}>rx-"L 3]^up K8.DGc=~(YPPLGUZ.&̛ a r\^\7#8j*\, s``IЬ. ,DFMG9ط_):J3FaRL4L"\[-Qԃ G= !n*PE,hW ,39Ρ&X]҅gϠH"Mj yLێ_E7Ǧwu@&?5.^&h 2(L8.8as?BHcu'DOⅥR/Y$ +&:/U'%%cVUDi`/lnlo U((Fc-> f:mNm=ĵeOhQ#DR>dW=U]]yF(X} wDB@E"dߍ&#|)"*u:IijRPtΧ!+k.ƛW^E_䬼DDSW?SiUAƑ GKN޵".MYB(U4^2OwGg hS$&BH/1OYUN^@.ӧ?͌DCM Fjք*rbbT$n$'bR*"##Te;<+yQPJ줰J 1bVWy#fW,7UfbtQSۤ^S{"-h1;; A&M"z Hb'<&U1Q4ԢE9Z #bLJN]Mmcg/L={*LamډcVSJ]ñ* mc}WP_ci&~WtzC`=n7^ͼ>טkyfk7 PܪAQ^F_\;Dɵ -Vp2e[ܪv2:-d~5wpd y P̪1 L|KSTfElhFD30^FJL(--fh,O1, :EkC=~ac=ʳ2e<Rzճ ̯CV\ J@@@@@@HLILHbB@@@@@@@@Ą$&$1! ILHbr_@؅˧cldߏkȫa45U:[#WGxǏ&W^܉ /NK#ǽqO1`)ľJl+V݃?V>6Ɑ?뎎$1c(ۊ(|=vsꁫ&/Æ'"qpgwGh(/DQeIIFUЇQ]ڈ^D5dJJ²P-"lARjq[*5 NKj3Pelu}m̮wh$/:Ѓmcl$ ~*c#Do&}o?--(NIV7Ϟ؜c Ē'`CТ0"xO0,.o"s{L[4Qb[>~֋0oS4^ĉf],7tg`Æ:I XA·mnNXYOZ23`t-qxv$(ǧn~ۄp,6]=u>XfLL1y0?ivg2ub'_"OZ'A Pί ˧PZkMX5,YrQVՌ/aռq8s ]+o;1!&,k_e);`ʒt>|cٸqz?}So֭Ac^}m%Rn>kcgQvb=}VbC>ٔӱva袺tBWS(?۫Kޜ0ڭ^Z)wUfa i߀1<*{`nk O?UG>k6 zsxzN~x8 1%n/x^-8烻j[1vy_j; 6oMekr}"X j @>xfz<eP)t֣G!Ǚ;vij/~#-kBs.m_ultU!C죴3q9jr1}χ"|Yw({ŏ%@sW43BeﹶCѾ3gb}?qƟ%De6y֭]zYRuCa̙+͵8~7L8/lV'{%é~~GX>al.8`sB<a5||,h9V YwoRbr93I cq,HEG1M<~–2JCMޡ0h9++Kֆz:c⛾m`RBoh {'g_|u/]au%~>6nz$Ani=S\kc-aKwF؆=7lּţ~̂iWb~Ķ-JgJb /#̼YXf_~u)&x/ZSoD8r TʪMEzy?SchW;)7o`Pe1څHɪF 0='DHx`8T^9&䕴b#+tZe淿b8G㿎&؄-W/<ؓ?6Q1"MJ 嘺pl?#? <" qt?2P ߫r |E̍.r~B=pL)f||rd)1 ?NkwV0zI^OB5PPCkla}][x< I(9Rp>xˋwKt6c5.IowbǔǶVjL|*n=60Rɐ;'Ӆ$& 8p GKЦrѽg}) >S*5#ֳr3f๷>x{9!v4sQ.򷎁#gVoQ0Buތx{^P2iHEm> y˰9b~I$>& 6t̸S}YOJ;*Y?Sq= 7%Qp}C]|ҟ}/[\N!G}Jx%MisdJ?c>nl`3KSYIB@? FС D#r<$n k> Isa6CS/>b 򛡧=MݍCT=n(dO1[z{.{~84-Q }g!5 l8%Mۃŋb!VGz uxD-({պ?1?|B=@kn<{h0U=/#`jXؑԌ9> CNHMLYqyWX~3t m\^=#Oĸt7aJz2py¸>#\C+L[fFA9o1r&x DYgann0 h٪DŽJLM(2aaDɫm]M,'Z˯q,\KHBpJ̨o1RXQ3p7|2<8}Vc3jFXv`گ waڮn&…?O?YT݆bzJ|4]g!"If,I‘ZCGt郺6~Re8҅g} |Es#B@T0 ,x"(၊?@TKEEd9DAC ; $\]3%z뭣~)ĥ.!A;1m;'Oɍfݳ}MݓioB?*\/i\ǫ^vWȍIҘQx2 T[q6$pC`CfT\@!É41%Q6DjSĄ@ B "&J !bаIH]mY(` r&5~z?'_JMM3$[ oY-JkÒ>GaMPq£hVW[V?n~$ʁ]KrS0SՍ Lx8:miX]68eBn~^-vȗ/| L:L_OoeVV^CO^ʵ]؋S/c~NݪE'7SnV^+/M|v؊k/79_Z#Ҭl%x|ޯU-;g&>wyvF66|Av%Cu[_Um5`װ(JV]^n8l]l9U@/)Am({:a,BDŚPx9R𧞃WXQwS/~ o,cq# GO4Ico)gLQSJ]|qm ^ Uͫ |;1tjЫbiG#U?{ҽ6"Hn u8[1yLJm,7G׆-K?77t5xm![?^ʦw:+DH Ky(]6TL.n~UhYr Ֆ B^(M~} Ɵ;қ:EΟFuEH)(e7rc^{{bGZ^Ͻooѯ.CVz)^VS^%vE<ݪR{]f)~NS֋kV<,NBݗ$~fM~ #/>HkĈň;weUU'CAVW}5wp-~;|ww11PVWȚ3k/~<xz$%-`c[T\(]VP'ܸtq<`E-|wݻ] Ta=2+laYBt2ƏO|*]~*­rTToU[zSb输%>uv(B:s]xO=]`S|/^&%, b{;z82d֙mlj?OS6K~(׷-2m9u'Yb(O;jb/G8[@(=Ϋ[`ִ7ʟam7GUl~Jγ\5Oh֮SeѩS'1}!8,O}y6twBmXEzEb=?~?2Lي3M/[毊턜­B(561(z2e43&7'KU^_PR{5ĸ 7Bhtm pyqSmTMmeWZm/_Tk}MI[AbhMw>rrQѨK`6;:lb:&8U?۶ۆ'JʦxEr08Iifbַ-+1NΧz ay"%)Ex,!z]#M3;0~ݯ~JJZ@Xi?6n؈ UZS4XLw֭8F@jJ[qYwz(߬GANIW{wRVH5nmmn2@C9K](Kٓ5Am 0idN;vKS'wÍX3w zoD.CGү=5SswxugqCߋf71 ^2h H+ ʩR_Tk}G 5]W>r6uo;S)!ǗxCu"2L~ L:;F:-zqƥtF䓘2-~ + Y{o[,ڄxgG8Ue+̇zqbi-᫫cgSڌE2r\6f6uۣoNI[yD^UNOTҪg))gJuj/PU,R*@ (bRp)z*)R2x*RaLIVePISzb,x?UT2b F؏T~jIcאea=gv u}|(JbHwߏJrI@R\8Nu漉mVk)[ 69%*5VKpT\PLHnx_R) 9y&)#Θ>4m^ނ$MCRZfXN[GW:B:J/y&)?_hJ?86nf/䏵eTMZՠ w1!`, @ DL@ 1!@ bB  @ @ DL@ @ bB @Ą@ BAPG @ D1ILL$@0 4C  @ @ DL@ @ bB r0PVV'N8(LLqqq @0  ХKWfr79!;;ѱcGr@]B#++ ZBΝh/o-[xB 1!\4o) "  @ЋsHKK{„ 7o*++ '{XU8[)m^'NW >GXujXPP@@ bB -Z 43n8уem^Ĕ7 ~9VaEՌ8_^Kbֻ_*_Ssx 3uJ\q5HoZy ůBh.C7AB=M™{ ^H7Wi@ 4Rx,Lx@ .T Id @ eqiGrPĄ@ B 9ȉ.bBb'bB Ae ( @ DSgk r░%@<#&*EK@#&jQ1 DNLhҥVVV*+UUUjSUUgMMf 6M`.vqC HNZR9}6LvA0l63,bڣQ([tt̊u&DDrDHDEEKEM,~]4,8AH$"%&'e]`eh 5|zK!xV~=~4֣RzDc(&*wHd23IJVHLm"7BMr"GPZķ-/%HC2TEc%BIJvOozi52I7PzLcCidznH(o^jڀRYr+տgj픅`siM;6-,H 8ڄqNQ{w }}- 3 bZj1qFJlDiڑ0 ՙ9O|ȟF>)yGZk(!\vFbH=RYw379VH$lȈEZGbrگIr#k3310x~]၂wDŽX6 *ɖYJ>y2G(--Ezz:wRjJgyۣҸ&x{||$7>+՟reRFGrcrqDK$%Ψd4>y@eX%+AdZk$#]n;˘ v9rmڴEf:pe(,,ӿᢋ:C^)H r H\H"'WxDJ"(\^=P^"]HY`ۤfΞ=VZ9^A:tA pUb۶On!mOnEljKgY}ȩ5IHܑ}Wt񷴾#ТD ~DT$'rX}#Bii9u~{ȑ# Y%v܇T*!rL(A臛FO~+DI4EL9ʗ5Ւ1_B" ye`T 퐞[n Çc޼y9s&{1|}ٴNYOmCBX[vBߔX65 ga25 Qvo߇;9lhh;ǵqM۹ZNCEE%6mB @*y7Ů{wkHDů& s-C\J ]|2<2)3/Kf: =&CWP=d%}^^^mӥ_Zƒ>iӦ'|R3f ہb/,_<ʙԒw^n[gO195D *w㦮1Iu\{]빙GECbZ6C}b{CDbD6ML) Otti :WZ;wSO=cMm_T0*Ir%9q]v$LaqJ7 &+Ngaȭ㑟s'ca/݃ޛ!ca䃵V)9oXʕ7+lջ8+b+r0s4VbxNl_:OØFgq,!&Vu& y]5oDz3~J PA *j}*tP ƥH%&j|&!ʊE0 GEBӆ?ikeeUŚW_}5~G!ygpm)1ڀ9 ְ8$w-v_ӸJ~̎FtOV7ԞI.ųG|՜)YW*1}қ}Ͻhh#0anIߖ`$?5k֔z 1B_] F#,hEUUM._5oTD`z'vވRB4OL}Ph 5@sQIdϞ=DHƍIHU³ &Ɉ2Q6$FRMZ`cKoIb|Ě?[(-@v(mڵk0Q`413Ѕbp \TWW9v:qgC6xƝ`=ҏzN86W8ߔ 3n!** 4'[%2 Hi '#2`hIۈbXm5y0sj7P)֬,i SB1` :lBƠӟzw Ν;i%9) Ȁ>+-;{FDҴY-;y`㉮ 7 Dxo\[:9ˤV"Փާ#"/<~yZg8>7"bHb~啦m$ݒ3gK.<+wK%O{CH ZL깹<'Φlǡ~")ᙦ{!xxx*Sw|P"Lx RȗVb8Ԣo(9 qcgEkOvJ$#5F}G;vDYY;p"m6SFF;ŅG;ue"u`=! "&@ -1Q`~yl3bK{_y'hZsSep޳"y%fZ9xnVj`I j^b³hYB_ԱqA!nl,0Jy3hlų=bv4!= ;Pm۲k+@ C[@ P1 AMr cÝ~0RHblou6u8#^}SPꇘ tF~!&$Tx#`ʾe,cm-Q?띘DT(RTU- ,hU%s̠('Po0)1X;yȝQw^1u%*k(">0veEևx!5j_H@ mů@ "DL@ 4:b«ɻ7-k徧 ۨ}Zb@cyU;קFYdfo,*JF m.x7a^'jZ"C-Ѣ0j8s:88 ZOX'_i硐rs@ ?]He`QZ_ߵY>u`տ̷?)%2mxi|s69Sg|n^rSX-߶Sb,֧o7Y7n؁K{]ͤ/^]r &:'o~b;zDV11+tɰͅh:#}ͬW{7f;vd XOlRcfRv)Ϧ+g30<(ڵ}p-ۼj+N\23>}cϾV-YZ>1e-*GTLq 1Onwĺ-sn~ϴXlYo752s,]&vE‹٠dжEi{Ƚo]i3k]wY@*#}|;LYe:S(|P/:-kE}EL"jɑ#ڥ pcx(x>7E=?[PU|ks`l׮>$Ux\lw>WMPkϊl6XC8vB{}~1 ={"Uj9l>WQ^QLvwv 23wCp)oe8[a5W~,K]j?DƆic#4 Rʩlnlry,fb_LOթ3<}j+۳o?K9 +Vٺ2ujҋ^d_ƂDk ιp!"Oz3p.n\9>7>M4o]{V/MݓBl -(Q;K ~Pml^ja``7rTF~5OĚu?~7"M/SffIJ e f{m07;=gx}.yԅn{HCUw7 S '0#%յnB{fKDHw#h=&'K:0{-Cx{911#gLL ܾyAn~ WB0JYO"u`(I}h0vt}R=%,:֢բǗzφ=Ӑ{Z&PiӣK݅L7WP]4^kE jmfW̴\]>.ie⇠AtL t,ZG7<Â~ ӏ[ 0J /,:=GM ًh6T۸j7VT7osUvnE[kmy@ rtUIjma{g54> d00rR9d!&Ua˶,<4wNR(LX~#qR`{Kg_=}+7?~3~7>rxͯԤ6%ѩ)xY&Cv꺊ko-?B`ݻk}W3'jmԼ_$xN]wZbK@bu9H[ךᒵlUmdz-DuBFx*ofe]bތI]{~8 7< @pWVA3ν;n.ᰋA(=YG311mTh OCmXMC"uu\Wo;[ArQAnWI1HMU40d _>.7y~,6 :0l;ڹcKW a\s\px,M EPdc6&ի*~wDzCc8,b%;W? TVLnGȉFWZZl߸QqGƂ9X  0PO3i2; g ČkO q^: K:_pv O[Wl䰢LZ ~AkX8KN{uxmJd=,A[ף,9d[>Q.9lW{dL8.FE IpXa[.֍-ɒND^ظr ?xb|pCСKg̛}pIbVy0cYS~]}!TA܀xX@!܁#bԚ?oйht5qɸ+Ǡl쇕Vc"9ܟhQGCs6ք@#e^V ;wgLH8}v7|h#T>Y7ނP?3B޽{Bs^3ٌ&=r=Mm@dUbS}|̄BN}Ed @@cBd ŋK^{s\2|=FtFќcЯJivio _ɋ56{hNzwFShmlD;N;edVЕq FdhgLI'rֺvcks($|z AZ ~z͹ا a#61OVs*)͎R/⢢a6e(K<1ڄ0zk2hvi?K<֭Ԙ7+7SD94%V{ށT5!$ ?.GFN _\FUU?a^MȦ]v@V1TU}EUvu8%D&vlݹOu)PZ*,ve~Bi{,Y{c"TVqSB[K`թF{1FQQ2 d1Ym( bИPp!3"/W닞 5wHEV q5*ӋU[YRFUd=%[]ܐ6K|[˓mXp%}㇔4AHuQ4j5Ct\ ԬaE`5Pzvf>M UkVW[L !wO;΋b׼CXQ#BX\U.N ~ `4cm)I+lMYQQ);2TVRK1gk* ʜke`:+6BڧJh~1 lS"+(ꉪcu 1_ӃUV  bjgjBilsJP-zZܶ~֋2LNOk$q XUh23>lF.UK/_2zYx&KMWq4(1A5(ٸ' qtUz$}<l>Gqe̝6b{$rJ{x/mnٓmd=Y^;[YWeveHQ͊sYf}1:!gpo1f)AY j*7yv4W5K BU9*VHJZ Ph_ЪyY2!PN(Mfu [M%: }Eil<9o?gN/C#0q –=zdatD$EpN.Q,U{6* ]9!s.{c%><qۜ꽉֘ո⾰\JW>#]b[z_5VLK7ǺyxayA\꨺,z2X33QVn@y" !Rdr nLCiZR&aλ#$+cO0;V@j<Ԏb6f :h|1$:A~"BֈjNW6kP˽7~_j[㵹k!])^rfgc'W@̤Y؜^oϼ`K$|y oUV<<^_מ*SFt޴ʬD(f RWԶ+ J |NW/{ ^X\,l` Ija```h+8]ܔ{sýK\V)' vVvrW a ClVa3M&C26 O,2Zt:ZsPXnJwOgqĈ WikYþᓿ ZgyU z\5k=}p-(Y::SXcoM{qͨxhnk|j{cKG/ƾ}^BH.nL{Bm?V\B ,DVSEAXElz.L!r-J٫%@Ʋ $bqV NL1SY(]^˻\ۣc(L*)[%!|_w + %> c_YڿR!CNmH<<RīVn+r`qE_LN_n)Ul"!>)A2=DVZJSk=ÿKƯȡLk"[OT9WLiŭ)#RwLM" (T:PjFMTT`!B4,c]fFKv%ؑ.}J(C*R)C)t;R 1!HJl-uqkCI)㮶q ӯ= ::kXG㲁1 u3"úDpru>Mqo-K0_GUgo˷)#/Dܝ|g.2kWg䳓:_n ߻] [SsxEba!rmYWE ![oJGN%ki_!&=H=|%hl`V D5ȯnjujշ?%(lڝUFH UKÓxc\(f:B2K@nmO, >" Q=q[h"π1$6DQ7q Z ç a"5 ğ/׌[i4aȪ=fd7Mߕ5,8}n/E:W)ewT;pi(+Bi:K_sXwиsQxZ)yݻ:FPD鹪{(m. 4ʪbB1 ow9#l"`;;pR[8wS5UU”wD,+J۫\YNvR`$FTvޛ_۫;o%᜔p2=C+Wï36O򩽱|Ņzgfj6c| BR\8)25 n+Uo_]fvG8O8%&#_vϜ5:-Kwa@@Djw*ǷB?\r"uS2=\GT[Zd.AYw"[zWs3!.ur+,ruvfIX&'Gܖ|Y\*wN[*D\$)Tl[k#!嘾,%Wb+0߱H!^YkU&۵)s_fVV:V ]e:EXrwGsZnp6QJ-[Ah3:y;K!'DZ݉g&⦭m.7Km?'Ց,V5!O~.bW{Y&qR§;*D7BZIhۼȢJJ{ZT)vpXx%BK]^`s [-rM3?锢B!mVdXM,*K.u\GU?չIJG j?.Ǐ7P)HҢwpG=GmZaiړ>'˳L|誷`$>ѢOk?,EFj,G^<VXN7ۋ-8 T-%-t (yUö2ktqؑcGNB+HUiR2aꘫެ""(|,.=Z^JmuGZnf0N 10) v#cpL]{Q1un=$_r[<8αeP111^m"B!.,Xp] fū\+z}aF@sޜcޏRKoGsb}=1fx6_Y.Ov^&᣻z;VV}z@@ǫ'lqMьJʄijuerYlc^\3^+_-؋kf섗#fy:A c?:US@/z8]DO2h 0,6ߏ'vFV!.k`:P)Ĉqz|1w7{~q?ơʦENj=!CX,.+gm\:" kρD eJѾ8;M~ـV#9 ۆuAZan4"Al^<2ek *9#qh |6hs18U*;qXAFE n?7gރΈOe㬾ٌ1"1dd*,csP 5G(.z,d+~I>ixd\ c|*pAx`><5tf*E m9;MS5,} Ey(IŌvb)~6V▮zlχ _AA<15CՈJ ixBM@H>}X l@U-;}Г=z8\Uu MXDe4z)5eJ/D8;HĞ^T5pakښ&;njYVJ (0Aݥ,a""\['/݅Kق m2BS%>_W-G^ٚGTnCO5kė;ʠێ>߃YV`tQc #s( sŶ7 _w9\}C#}羻 ;|!on,AȮ!kzL\Š^Bu@c)&ف[Vfár,TR@?h *Q"^ⵝr\O\Wg ]d 拔dr +BUrM [Q<l=E >f>P[5z| ZvҜJtH Sƫ{X!?7v>[kfxvs{G^P MD̮I.v|s^RV:G0"B蔎³Q|U7uu]|YY<{8aSzP \ƽexid,6b~mo|w?qCB\{!\}M##\݌!!xL\wɊKFbQJ(ͯR/H뾨̿4ḼW(|6d;%%A#BC0]PIOH/rs桟Pkg+FnH7:kEeH*)ĮPq被)K+WgGpqdpp>\V Gֹ]:޿/vpƈU:9( /NܛS#MցlKˏ wC"QJ8/!ӓ# ǧl;5*! A s!B*c+])<ɢ wɣLΆVV %5>5@&;nʡ_E!KX3*wbҼ{/:UTjm*"{"*p#*rL(s $/iuj4F]NOnqz՞GMSJ`eg'6G"CBn4lO;GG#2<$K oaҝN"kXǙil5U!&pߕ;(֖K[FvP^)6ɮb%/YV]^Z]m~_S~A̽ t7r,+`ډү]F)Ȟ8-ZM%$p>w74]8Bؔ]Wu5B*^O-qu3o r(9yf{mUsu)W}sc4}J,)zIKBw:Fc WzZiuw#\==ōnI+; q\dmZJu O4 [ē(kK 4I ף+(< ih=U9}n8_&A>^&~CݟXo}` YNrەuzu<F# JX"gkJ8(sګl1nU<*6=:;Q`拄@=RKk 2v]|P-464Xr t qvh€ף~j9i"Rl ΚQBgjuvfp髗 Tcxn7\!6h#{ Vɘ|xS2s;W|(.,벐7vE7eᢞ1+qqB $[q9FLMv ˟ă af?6z"~ SX?}3Qn t0G&br#7`Uoq.yb@ _<9/ϰn."_ _sKA`a:|p&~ijPfA~ wq, qL$J'3_Q<#"ѵ'.ԷD5$5DV|Sʫϲq͗]JxIla9ٞ龥^dORFg%h]rX[`妆~HX#㻄`QFG]jr6fӋ]Ɖ~3Ҝ3.pnr|P;`=^ܥm_SFS@  ֚l/*ǧi&$!6U۽ 0`l <7k/>\ن&;|+-;ѲklH/2I{1w%`,AffdIg c4UWCҋBu0}J֝8 w= zjS9ψNQ#p-̒ qy+?X{:D"!/= &vH"Q㗐Y ɖ0&YzEyYs}q+( >%_)=Rar vJz5+yӵ/8k* BF4f; .η#E8W2R+g]iӤZ95ZoLꉐxm/'dW[Dz#OOkqgl tg`TX*-8-c ' >(;NO6@"Y S"Bk/מmW!8P@@W^ lM,.tywi-3g0r8oLc`+_]%$= Wpn>9ZB\"fEdcw[l`ǓM N5$̞QQ`RvmSB,sRª>RrHTiN4S%hkw]AI:EKѿn8I\цlHStECqc;㑏"ӡF:<{&u\]Ge%噹,+5h.qoC=`VA@y^mɷ0q%5$xu5j=xH2Ώse PZ^;wBHKzeqGm4VٕV{WBjݖožGK}78hR+alHu_pY3jB*5Y]ճquRժe+/ K;3|a xd&&KRB+W:K䚚|#?O8(bu^(eж('XdO|vW=Z;WE[C;^˾H:~X+|Oe*Wt ' .s/#Y{^Լhv!)9bP?WURWoN;M)BB!YB!Pd !,!8ᵋ#͍ $ivio{aم^r N;NOȞbK&Gviv[~9"뙢5D,\\N;N{+۽JuRu{viֶ: ISLM;N;do"?^}/ sG;N;a?-D֝p[o[ivio- rLrNJviv[~"9iCITWj^}vnm;U:-}QZ`M} 2z-B9bUi>ؿ< ,݋ÒG=1) Ij|Љ٣/S?Md}|ob_ ]%Xj;FkxxS1NĨ#ޭVVA&''cUm.Q2T.ՐwweعO>w%/xm*~]GTGsH_P^n֠|y(Ea,,yЂv_&Y%vz% d\'qT)VUUXYߗ-B.]N1}0Ig?G?{/BrR4{E$FAn?*B:z:c:+F8U,w+LAÎ6N&\(v?⑱!'g7;Ґڀ]&fwE|O=K .N,6+JnߘsGw'_&#%*%%7LeŦd+ULssra6\%[Yffd/Q8ͺ@Aiy=q`d(Ǖ?)XߕNm`ߗݰ >ܼF!!هԶD ַ 8\hʬ_,orvl"`j2oQ}ٲZ;JRL,2l2Mݡ "vU`G̈̾1&*p(+xF|K4B6 tGua?rVD&nt~}ijvͰbO=úc VÔ𾿗_9[| |5.헌}4xa+4z}9#v \q [\;vH-rÓҹv~zc=aǞmc`;KtCm^/fx{hppg]6gȍ^߃~&pđmX1u~+Fvđp/?VſQ1"M'a_> O_~/>L: w_ruB~_E48#;!#ǹL;vtrF|  "x/?4l^}mC'*r?3~];~qdlURO27avcZvèk0c95ҡ (.ɱ1 ^w<3PYldk9w$ho?ovLwAX L1dD5lrGXyנ22 n[UʏLi=풀f~8N[1n;: K5}X{ dd"09ף7%xm*6ap㨡Ho.r?n sv<0pwbۦm_as8fa z/4]W/τ%4|TJzV1qYD1>yp`hpp/8oP;Ց"CxCxn8wF߿tu2Md ZW%'F$'#Q ACrY^+s^|Ga7cSk$D8^8/GSrq_:,t sHx"^4^> yvf"1P]Θ*e**Nii>; =J2roEvO\-`Y`p}ᾳgq=GJX B,$˷? Z.xgz%KGK*[3 ?%wOdM{J)1q$310v){#[TÁ߱%0 Q i ?0Ggᣗ,;9߮Ooɓmo>-},T ) tpo5B7:l=>w-\qg@T?6蟌/@'2;;30Ƃj{׎ޣxWb˫Č/gYZjr>C `1 7c}t4Z;]'Mkߴ9 R)Rcvl$ O|?Mƒ{OnKHՙ:KV/e9xޚ11qx|sX`ǡ㯵H7ʊwG`{03exoZhҫ7xcc?c`7_Si[`)%d|1Aǯ4Wf^ǀ(06zcS獱k\ "=UʌR#~ا1#h_uիGG!?ՠ?oߓ/Ka̠du DdBF(ꐱ/َs лOqA*ar!(t6FkhSJ쎨}H"t6]e5s8sD|XdgvCHiE?n><4*m4M"WB߇ pj ̈.fB`gt lh|rOKp.ƑQzDM}y;mOîQa-cp+CX^njVOvZy_7p:i<'{t\$^T'h<P+\Sk^ >"D$'oSŘtZj/>#nv|o3e&Mn-𔔶&Mǝ~[{7[a07p}_Kק  j?KW\Ƨl¹CaW<>t}l z"Oy}y ?>3 x 0oClBfTa++joCvCs7vO݆f"7[?"׷dLy|Hg(3rKo |hi$F>v3V.|-gàl+#˦ ޠ7cV>0Ԝ?~x9HCxn<9x<pYw̾6|/}0vqNd-"W.hJdXLv>}'XdN(&ީ$IMdǰTuߖ>E`s;? ~d6q`/^XL=s*&Ι֠B#rNP&CNQ4k*u}bl&$EF RF`B|;gZ&l[y>PmGޞJ\>*x=lv6*# @-`_kqca1vf'^ \.&m 'w=/8SY.JYZ3&3 j%%Չ6E`TUY&\U`2Y1] VԮrǯ$%b>RcgT`9Ul/hdOZG>׽g޵9=v|ߋ0`MiHa(K rvX 0;:@O`?͏߇6Nėɦ$χDENq/i h;헜jykMڵ=)VCss}kq8O._v@HN;B-l'K;Nic?ќp;,<N;݋,3vitOgIMHPKN;ފ/:N;N{kO4l'{SϪ㧳}㦍ؼiN;tٶ:)S@|?SdxN{b GخhoN;~ Ovʔ;n'M3pРZYmN;OXDTXX8D!d{|"BN(BEBB!"K!Pd !,!B(B'/̙3һ_ʁԲY_˧I5buVev n9ѝf Fp?KQ-?oؾs!'~۰5 {o?,na_0"/nx4i6<+P1[ >KI6BBK"D>{) tQAzoI 4{$ !@(~}ܹw9s;'glfqwl`+ b5tƦC$ʠ_ ĪOqpkn'obBleH$'an3NbÎ9]ʋMǶ#I,:ލ7H2߷gyxרS0gn~-ZҒ[W:V$+gw\yl7 aYha̼XRHy[W|}O⁛V#]"BvR#0Js5#y`t 2#ʭˡ}&?$[YrK腣#-{?j x~̓XQޜ%^s1:Wg^}nЊ 4+/ 7.}]yx Cк7C%rn Yd훘yw)qD"Hw[I$DY՝D"H$,H$DYD"HH$D"D"H$J$DZh0 j_y*E+elFq500v\/DXZZ^5UUUent{Li]+O)bwᥙp t7B`<==qrr*Vl.Ӡth^gܨfYPz#..4lܸ1]tvvvX[[Ry;Bg2~VVV7T4BBBu薩jxwqSM+# Fr1x.ӫ(*~˪Us)E/~dڴi8몫X#\i8sLm^Jh'UzE̺V.뼮_Cפ.;sN:DTTJNzUoB~>:6ΟE4[3vIEKf6aT`,aدYqͫjr+/妰xmkZFť+X:eoU۷PsI&ռۅsf"ްK(/ڤT2U4uWt{5*r(r|`/{/s>,֭gnØcbIq1VմeU)wfCWT?ɫ|+ʏ4׶ >;ɯ$Us_M^:&:`9';HKKɓWp %XV/[J}X]ϖ-׮u%c(#j7c̸q:yNX&NȄIs8WT= lZO}QޱHn&EFstٳgYܼcdd$c„ όiX2O>#ghz1@m ̜2<ūȯc$xQMOM4%v#$ן㵇3q2\69%p&~,|j]1>7^{إP\Fu'ҍ|y[ӊX+cE<:Oʇ~(:^6vJ-=]g ٽ]ލP~^hL`)Jͅzbm=Y֚R ifOOi*FZǿLDja๎*:G%(2WAf̘qw{uCbc2ްΝ?Ɍ-BWXҳH/060 }&l !k슳=>KڤkVfCUhjshOxBFtZSjJ ЊW[iݚq[J% j^+6>qw7^|N^Y>2Qn]q.Y {nkא}7|؈hM)|Dzȯ_ P'''s M3mWGv39-<1UB tʰԺam`ʧg7OؠΏZ'N?`0Vt֏)!굢0y|icPR<k4Ϫ6,܍fg6 H&XkqrS^A+a_hFyщQF]kvp.=vWʌte6)2m:?T-r'>"%1GIQpM^s=đ,=:sh W[3Α{R0YCMza7{vvl]z60j,x6VԾ)ɂ !]Xx("a-yOۣQ(.t ׎3**D LKŞd0briٲ鵋~9+O^ݻfm<@ckk{}dcoFȀ 9K'-=N];a/Dc!<ڜd2KhKVYsr mk6IO<~>ޤ'ѴțZYF=E.;pʵ^~5'(ȋXax ϖ JIH[a8l[@SOQ+XF@`\:;Z{jٸA=6rkȎ%%_G٧c0zСsb'҅ꇇ7* ?G+"цGfהWk؎mBO7-=sW05rm45~#hjwoɸaQQ;z(f֢w.ZMԑsxZQlON`e[#Lښx-1;7~X5u+vr],k=si"ܹMtkptmuڥ3f<\εvٹl+qMS~ ?jm˲8oCs?˂bO$4ށKr( HUi!_W;nΥ/xh< ˻+Vl5klu5ʓJG 2LB 7dr"!_0֞n7}(Fe񵯿_>>ΤFrf'+Ycbbj1S]72(@zPꪧO[ n(^ʆCYXD޿VAyJz"]3FQWڍd%D"{rD"Hn̆D"HH$DYD"H$J$Drø)#PWV2DoDD"_N`V.;s5U:*5Vh*TJ 8[_jzEeKkE**6UYN =:#%E:9i[߯WZlR\=Jhº?g y8uWQ\Q R$ܔ"|cB_"^(q8}h=;j^Fu"WSlV/leם sDO}i_޲mxQbouΉ 5]2J*umYK6B 3pIu46LODU)HO5dظ-JWm=a gyר.'e$JxN*^ yXwdgC<8f:ms㙔zJ?ncd'8]/<s 3} w0M[CU}|_M½GCg {>y)AE 2722xp"VYW1KOfڑ6\6ͫ9v{]uQ#/ǡ>oGfOAzT5)ӷ/$Esrg66#(s>><yVGWW/UӬiS2OѮC#z/UeHYx.{ lǰaOa̓R+JC5G LR^V##'6y;x^2ڴ7z2;r'.;r^'jSXW>&(SщѫNۻubЉgm1y{muPf}/φ{VZ_?N#Rk+<&;:QUJ0RbԮ"z)sٔލO] #8=_ edcFPtKc> P~`6-,m0,Ӯ%Gccnxa%bObw<ݫQXyŅt{9$%c˯ƼVic,6K4}q'Ӧ;POfGѩFϥ¡L7 ν je1w5KB]!"$s*8'SI/#Dj1HTm;XG/ʔ ˬ@BY瓿YK(kЌ_>/=4'*&R7K?Z:dKnw'N$F'Su(b}>B'Dg8e~mR|W ]94t"^щvDf}57%%%9UTSN$JEFcL5LsZ]Ame^O,eKr).ט)J3Mz,{E>4*;E(dLUw:7Ov~OcyLl_:&7;IxT*)F/ BMycwZs:a *FN) _yB'v[DMR'N'$D"|]"H$4D"H#+H$4D"HH$DYD"HH$D"D"H$J$D"D"H$Zr`0(//k e jR{Ζecw56rjid'xzz$+C"k3r茞pgUtrYQ>Z4_OpR+X?C__.6~i&Psyh4W5k֒`5kFMj/^G^aﺧ- TVWT\*t[BTSRur-Ɣ.VS}Dw ٨Ͽ2H$JWZ ePA*ʫT✊B}yw^>c>F]oz3gÝRVVơC5k駻yf!=I~ZM]VE^> =Kb>]]m]]k~D#Mz;+EfjRˎ,f'#Z ? g\k,WSE0ko4=%?/HsP<dQ#ȒzQ14sc 룯e0#?5덋G$ʋ֔ okjdG7vx+`oxa7Lm9|RxqDwvO&OFs_sTf+Oo0F h,{f-dd͆UnJV=FVqRzYkX[4oM6lhO;|5NdH͠?bUц8nЗ2dbxb>byqZc@8LC9|UXXj޾큽hx z6/GN?.*GxWo~0>o ݎR;ёsJFSEMK"!W˸;?ÌqESIg`YҮ'm-bQϖM͗?e!"g|$22 8°աfjU\LihhɳUiРW`ۻwo"""n:)UhJ#Z Ѓ i|gxd&CgGߧA^!Cj|"$@Ŧyp~7oO𴥺J+(0ȴK5ۗ?!V>r1^s^ΊѸqs70g|ڽ:Miݯ}ҤyOщ"O:;ؖYlP u5`X? |/4ͅIɇ-z_>Pg_ҊJ !ۛ~Pӥe3Jӓj +,bpWVV=Ϙ[ٹbdAfΘ_Ooc9-ϥԹXa>vL˱e3UbĬK9{[*v+fN_zDوV]UN"Sόɦm3 ZpPB=X.ޤJ*D<6 (,UY!0M+Rʒ[ȊxdqG#ɫuSC|RQZq'kooOIIunNNN&((C g Ř*Z1ʡ| M>ѧ96~\5#>ESSeSVd^o}X.=S0J7Jx1gf׹R"/Bġu131z"A~5k:q'Sta4_wX;w`F QTQeSƳYN_V)^_k grw6׏n+;ˆ;a[ELtmf_VҜ˜6,^]NIY`JM>`+d۱!&OVG_BuVʒ[Γ-nW 5B5+#[Q ++~cqQr6+Vcz}Q]U.4iry]v7X%аt۽CQO}w%0{\Ĩ޴F$++SBI4 -᫚G( \Ig: G`˫2Yl=h֦GmmmeeH$-κS~M6edR/e4>Td2\p/W^ѹڒғGBxJD"H$WC#H$4D"H#+H$DYD"HH$ղ%D"SֺD"HbD"HH$DYD"H$J$D"D"H$J$D"FV"H$id%D"'r'IMMt7olED"HO,yfVXa2'0wʕ+ٲe E]GH>昬ٵI wه?=_}5 (NN[Ů;#GU׭Y2%W.wț%,{S]Bv"*T0h t(}}}iѢ 8qƍV_y̠:Iq*VϙȠ1]{Jlq8{s^X"2󱜵kc18̉5 dﲟ%a;x_g&H!]nK}cz6p@haa۰_vMʌcӠ@fٖnU);wTkhtj'_"'3ifŶ[+FkO&\F7{kjՋV[ `cR)[Chӂ]kVWg(P.69͹c;8ecoSGtZQpIc(X,8>y<&N-}RKO`_`u~>H%۶Qٺ I+f8mN֥|VB;%|z?a`QJSx烅<;1OO[G|t̆ykDv$dվ,>뎧оY# O%KkUĦy. mc8oC~q NѶuiIL/OVqr3䨯Av/gV!O횳{NZEO+,OܶI w־-% 99{x7kWFJ+XŢyh5瘶(7e|j/m:Ȗ,i>6qaWߐݘ.89Yt uGaXY[عie^viݾ']ЗclXo7~CQ`s,hJˌl5Mx;tb8&Ηߡ!1#jWdž2{V.fVYIK )$2աMLu;aڲX4>^E}}D1Kڒȸl22儴k&;9m3s f*}DenЮ=*56=c*qQVB~z-RplϽޝYlyFHW9 =QVӦ(q,>DM8p ZcJ.\OH ԏ$F$XZL":KmMرjiiY{~a+k[$k٦,'fbT=+GG|OV \Ftͼ(3mbS^Mi"_KቈM=ddLZ:9 Աѳ5p5KlcqJ,YWx+VN*;a{1_/9¬^&՟kBV 'TԌ}3ʪB&?}kW2y}·0zΡѮMYۅ!SzӖ;̾y9,ucEWxg{\tRRO ‚-*0~;Z[cӚiقw0f^8I{ࡇzs6tI֞%LY|u2?نU~N\be骉l*td7vt76 kb,?^zEV{hD+7ʇvPKZ7O9cPLgˊ)vY޽cfBm1cG~d.Ki>]x7̡1|o>v/XُHK~1WáL\ǝ| *ཉKeRqM^Ĩ1_07)=h~9X+ᭇ"ZxI+1Ajq%(}Lsӆ% D} aI ya|o]n}Noۍm]A㗱-N.еUc5lXD~LE_9vQ?zZS.XX b$"Wa┉۞3ywIdE1K#EnKEĵk}dElDN2eY,b(K.]нkԃl:#5.N<: *o>y {UN!11޽{_=&6//Em wkJA%*g_\ysa^梳FxQ^Y֮ T+-"TBK+qvCkgq`G`޽_KQk;ᰋk;gwl+u,qgj=ZK-Zk,N^5Ӿdyh0U7=jwz%>_Ճ_yG|Ў^4?"tzTX[YS{Fٜ7y?t* QFkD{W pmhl0Vr(䆾 `?܄x9=-}mQ Ev8)nM#ݜ l䊳 J^8V{6>5ޭqo荽7-l1L^uMeh -w!:ȗ_I7K7"IȰ0*gEzWmPܝp6. ҠRck.%%hFF k{::02mXYa!WdӢ ])ŕԶ]yYe9U1aXï_>"N5Ә[M5e.&W跹̎dJ(SsQ&gQ2f j!6jZȐOL5i;Mpr։6ïыP8xJ{*D]iUezX9.%--wq!ҋ@  bܖ";ֵ%|=0W˾'׭ ;Jspנ*[oDI|#Ô%|%zuſ %OxE'U֮ ~V&z23l$@kҭL \ s9YJ3~SkyΖLnhnVni_ {w&@tF_8ws gw M~,^6Ƌcf)(J`yxa )lŵ;׉fZzSҘ`G[ikբIY$ݺQrN^msGXk54c0y[,v54jnZp{pegIuiJ;݆G T s>%&:͞ORWDzlC̞8^S,=GkYsCzg'T0,=x`CT\\[+K+&qS<ݏ׀_"ھMۻX$z//Ÿ|ܬ #ApIsF  jO{<lw.D`!j6= ^A/4srF+g=ˢWn}>F)jФ/ } hewM9}^h؉ &,Z訧/? BwE7*-DM]JmG5,F-L%{xe˴1i.zW+t}q$XeىT{qj}q(Zึo7M#Eoe4Y]OR73ҳ}2v%NׄԥroCFhhhWx/&:}hmQkC^?tvro.V_Red՗W%Eͧew˚C1=Dz˯y晦5 ;v^~=<ȿRp3NvȎ@1 hry5Ya=f'5aˊy}G_?4z~#w<ΚB0q)Ieޢ樮|_r\_%F{''+_Ib垢XxqU;}78#X-E{+[fzVE`` ƿ<7aJ˯:B+s Ue 4+Hܟ-/+*D;t%\9".ug+ʣ\;$W# )_kȯD"錬=R/// `VKaa!W7zf<_ZFUS-bw7s̸rŻ^w͹~"?Y Qe?-w]ƒk٤Y⺮u {kOZt͢S3vW}{YW_DrM++9)Om2k׮eȐ!5))t=, ǖsτ-8Ώh!iY Cc"*ˑOo єgL0rf8f ; Q"Ϧc҅XbKŐӈU#F6*{w<3߆ ²-~%oG<QԖxfj qsY%~"ϜEGy6`G(i6elT$U,1ۑLxB+Fũry~ iSΠw?曯?oCo:Enp?>T\]!Vl`|9#ӿx6GMz#?}?r\թC|>NjZ2^oޜC=㦼 6<Ө3Cjx syu$B}*OCe2 g@$>K䏄<'E l{|~ d=WBOe~_|P>kCېn5Dv#94{N-aȄɚ 'R*h11wSۧ~ Ni/=;Nd$kR4:<8!>Te7oɷc؛S4r8=_ˑ*zoʍ)UYh-me/*zwx";_<gh`)G~L/LY?N[\Mh.Y9F*+Lq?z>nqZWcnS6dcE>ePdvGn>)ܐ&5n5s#2~D }UC/+9CGްwK+c tؕ|**hӺ5)k<\[Oq[Il4ߍ̪ylb܉NWФmkOɻX۶grM.d]XBo=cHuE/,oʇ 8ԫFnӗyxhL֖&A_`nSy^6Ku> 1;nR}|iPCYIZ2%&{y|Uـ*!}Qy6>|FZNwy$sÄV^Iu.ݑ#UcC^ DR(|  8|;";-tOR;섛j]e:$ٶv Mu6i԰:/H$U* aӦMלV>bF}"KF֠И^PO?]{ z7 oΈ<JY*)XGp4k~/G]ޚ0aHYZ-DQm63 cygd ܻ _ Og9wU6nLgQZZξqADA0 U~5~ {E"NaI>>z52/scO^$6rfW|6~v~ݫ-{mԐG3u:`M:ˎpI/|?T3yѿ+;FSݐIkm=5D\sU#N쟿ؼEGxɦG,\[•l jE&F%XMSgswPU=IESH=]ѽ;x؛X4nʂxs=zQ!J;\x+\gڈFx}_I(hUSX8j|;eF8xcOBJ/*`u:K6\oM*՛_XP21h{3z:Wst O+OcMjy9J (dUZw eM9^I#GrjazIFrWٛJ$pӽc VZeZѩO>Tۍ4}u]W]Vj(ت5SLO/Ԩ4@e0*3e zѾ.DOiWm?|>']A[^}|{Uѵfw{H#!@B `EETl "U.MzIB'TB/ RI/ W}_>,w3sΝ#V=RrQGx7fx|`LR|Bs䄇|KJD{J=%<70"'p]JU} qϯ?+ gqHuUYg:Ç3|R1qe/z/Uzl#taf:%!$oYS9:1KsGAV7{ҶGxȸĶ O6$Hy,Tǹ*j2IJVD}ojWO3+-۩~CgӞIOY-T#Fx0'N񤏊_Va%{Y рT*:v숗VVVIw0Ν;',CXwWѰH ~, VJDz@\]ⶕOWqz.eu]˧ϹWnDSK4Ɍ<Z\>sWVFT+y['R.~lZ+1sr#.j9b.P/P~)c'@`9S #z15цWy3wӱYUЧIBs]|Iٹݖ#oPᅓoWSa5~;Ϛơ+Ԭ@:tٳn v"_cTiL J5q1ٸ{P;$Q?$TH[  W:=u9{WElU@;= x\g(*cb;/11۞|-,8_ ,0D+~EI;S6DdvCCQݻȨI3Dw5UZRmfba4ZrN'c_s]G<_8E}ڵ8GpP̔Őbah-X;}9;jZ*.,BfZ(G@z +Td[`œ T V#QI:Zvl^8S73gNDMUvˡ&ޯlEjpI|]=5>mHJ!4Н=I}"^orG1"V ?ę$NZW$LyS:*v[R,̦e}aA,r`2Si 3{Nm\#(a p~j|"\oM=CFoUQTrLjعWPh{h{}?֏'\e) RlJ}0ݥ"4GF%jyk"F "k+KWbTM:k'P gPű.RfUb7{Zq`NF$B(:dY*ǿ9[)!u/x~nS`Lk۶-Zfv hZpW+Ra3ص_gќ۴x1 ټ{YY{2BgN^P^G,&`,'&E[Sظp"^s/|=7 hRȫlZ=eSI3xMEi]y&NUڷeтe?~> 'iwwT(/{6aR%%͞DK;EƏ3hLgg=D+SOZW ޽GbS«_>S#Ng8q,JR+9{X7w#ownUHv~貋4Ւ xocӏ3Ye?[aX wf ѥuS>*B'~)G>XJHQHSU.F}7Qq|Ns29ߗyߏ]|e7 J2l6&.BW`b\O0wu3,ؼs Ӷ"20ok<>ܬ_'g&xZj}.3Vdr6TBG<gǺ'g/MZr|o2ҋy?_O9ғƑ)u5xkǺɝgo>{mR05׳|)>dդ)4w[yz9M{JrԯNvm[?؜X&].U߿Ž=y4d &u.SS#X3CK6M06-]G׸q g:,:sّ&Y̛o+8u6+B3,ie._Qjr5o}Asl*M 9QL6{2YIffݜ 5?Izд1Qm,~t:,̾1t3};x#Ǎ6 r;a?1~t*va-Z@{Qn~_9Ï37нOwN(t6Z7c.aq;|E~t+CǞ=L<ʅЯFO*Qשo,gEJt&U ۢEǮeˤϣֈ͛KmzzP OZUv+߫ 0VhԨͬQ6%+#p i&cTa)lRRf10׊|Zc, ̏@-}%,l`OW/˲u^1-\<eå`V,Y=ksI)eBJ*O|CiLNI9sp$7Cxmi[ӗuJDOٰCA1:{م[䧟BpT;̹ˬI(ԙ "N[8 ^L9_O5Ӵ"QUJx(}*xbl`#]쎕gp+fU4;fϞ#X5"37Ξ|Nx%q_C1k3=̓P ыw#kvol+?_-hV{,YK{_i0ֳ.%~p:9] @be~z} C0S\1 @(MJa!xPHRcvnȺ)1\]\+;[T%e\fSZB ,̥0*I9ƀ RAʬr ܲ48gW4 Y'_W#^n7OS"8ScA r _"YL);HBU .z('Jr۽ova/'NNwiѺgMƮR8aaӴd[!ǦO$ϻ5kTINw;py?QTu7MnQq3YMCV,#WkI suUT[{: SմWykNb[:[K.'撘`؈> Ο`!v#). Q1 oZ!$ר EJ*-_@b1hG܋ي+zwotª Q *c2'EaGZ@_Tv*&!}^\I>2NYgrrA>)"E}%/ʄxc釋4qq۞ԐׅGvD*S+ +lXnnhAk ?|ԇ@G+lbs.}_U$̋Jh֤WtXx4hZ;qʣhкW~.gRy8+غx z|B Uq-oK韴\ `T۵k'Ys<`%}vxg&dt$)bpicѲVX3a~(H 2d-0]Y[IuG|ߜkNp9{\a淹!C ς5.? ++K3(NFSP:w ܟCقCo'=H~ݹ]˹UP̧sOʡ _O '\NH{ 2dA^2䔔d u3|ڋ9ba5X~^Җ;125o)S7cRiџH+Ɍ/S*3U R rEaF^(<؟WwƌS9|rޥo{.![zY6y.X?p'o oSƠQ\:ل3f7bɋܺzA9:L IYz7ݨyn 8w2w,7> oΜϞq%7ֽȴ9gT i̜۰j &oOw.q+<64ȯ&PIWRiUl(8slеa8ׂѸeK2[=v Ů5[ٛlʖIjQ{JT@_PLfx3֎' =E7oO3d0jM:-[J]'ͦ{'2z`befJi]ۆ#'nѵCs:>EINa^+6oۀ5 ^ΖD˕!Cuvvߟ]v"͸I/H> -_}C9,҅uWxJCU]zĆe͎m8vH)ݺXHɅڳ3ύx݂U'B%chN\ѩ;qR*q4h|oW L/€s4d<@VX{/k=ڮ9*c]-Ì:*ؚvX%oKuy;c㰰3V)P˺݌{$^KZmn163oVJ.H㻋VF3i2Ȑ!CooYě6mvvav:tϝ3lN^.).169:&Z?LʘAS/x?}DK#\tЃO"4gZ!7JfSdȐ_ydȐ3a\..a;oSɌĽܧ[!|d֚bjgz/k]Qt>3ʮV_k~o1s_rq|6>,])̺Ȋ d\Ɔkq$v>9K+nѺ_{o?S{VL"o9Xpl!R)!%fҡԹ˗0rxZVbdR@bǾϝMHzȫB0 C˝>MMCQɥdk̚2|w?M n0㏘$rX\A{:PTM)nAMr8KZ _vᇉKi[)LQc@eo?p"1o\e>\r(; b؛#~!fm``ġ C^vmIԼydLo26y7,4Fy Y+1b0*ԗ^l?m9{ CUCЋCp:#nd2^3kף1}Wqmu'_èd9s*ߗ\5Fs+D">mXe5rSo¸k~UCSvLVdhu;&E#ē1yyivbrmZɝtOsF\8Jѡd}2Bm vI *mz >OEp]LmYm__E=܇(~%sKB߶8k|=k=u j[s]Ƹ8'v"_~)_CzrH?C@6G0yA YB̚,5ʥ1f㎂jf!C0{o]b왢Rd?ؾsGs<} &r/HXRC_l<} Y^'BHƣYW2cw0lPل9q]#J9g3 |#}ǟ̈Y(~z-n^/WFwy[.E;T1]vcg:5aԛM~C^Žװ3W6,BNd`QeҶlm TB<\j@N=ow=kB69ڇW|úa31d5.!8uEHy&jGaHF z7vAcnJ} ms{pxʤ3H|<?)XGkc9έ$1Ԝ Z٫ȕΓp\ 3S(; *r'NWpoҀv_$O;񚆰/q!z4m_žY"oӊ#3>'iHx(S2UbTatF9aq!Q} ote&LWM kF %|1d8.1ݩ+u7jVpaךj9 5wfW5]sj=rs{2-چ?67?^:Ι+ח-|R+LJY̝ ]d@BVKv;'YB葷!?ezd:*T#ZQ֨MB£mޱ嫈ݰ1ʄe ~ )Z ? -3<Fcf:A ^\t-҆ĩXy\t_xr(6j(GxH9Iϟ:BBb"Wwc_Y[W'IbV-Ww!SFsCY\T9B.q/cSFqY.K$3sƍ7x#EÓg}& 䚝nf($h)8'dh3]%7؃u;p"(+W(C*&Njuc6=+ĎmNTގk =/6yL f!Y)[7 ' {,V/]>H&P8U!t1P =Ur%ʕ-?8ihҕ=6u R=jth9OyU)UOKJL%zDrSe'5F_o`ߴ"]Uڮb1ƫ%c"!L,j/z穿V_{i `ߺil/ כcew/~g]w =^**LD=jh=~gxK\ԆG%O 1bie ]-]#Ѣ Hy^'J+؏6܍6, =ƻ?ͯ2+&'p?l/XLzOǰ`TUp?w Y>,p#57-|dȲkxP S/љKC 3.mvVOYOͧ$ڕ{>(I|Ɲ7# 3dӷ'cccŮTϻkrSxn3M_Nt{/sp/tE ?yIMxc 2P1 #G'-?V.zyQfX/[g3a*t۷nj3]̛4WXN'^#1 ewca]&#s>+P231g˵0}-WbO8xk/PbyK#Xgv+yj _J!JyݫHؾ̤Szh%׃;[QLfX^YQ Ip1qi m'ilw#YTt̏8bU+LJ58y .AcNX)89aA)۷4>aÂY_Ne-~w9v 7ԏ-FLpRuMk u,6ZɅv"_cZIA쁭\%Ie%!Z~D󌇜W3wDݷ1 MLqUSͷTi6@gy!3e6_6K3ߗyƚ^0k[gr-`߁Ud޸Bرn1B7;IE_Cٸ5vA[,Dpܕ[G 쏦7ûbwM\ՓSDQr2Q2y۔w'_rJ2tnk}¦ ~՜=iH¨70dޖ^6Maٍ<پ4@S+.Ɲ[fۺMaY)s^epؖsO9 Hk3u% fʁwIu,na3ejefkwG#2da{~0SRjԨ5i.Q-pvaP {@.b3Œј[ơH'YAxFf~!aUjU%WgyQ˝ ƭP'?};f&i77a<lOa;OO:2mMѢVURrsH g[Jq󣄝+fsMPGwEڍҘs7(230ԣ{o0{՝<} ^np\Eߠ(s ˲kxvZ~V|*S ?o/ --=v6i)ZhH^f8MUǃvuV-f =b`S)/e[B],ݴEYw@[lJ+M( teZ:Rhlඥnn!U,2dȐ>l+<6!J@KMa-nIb.la\ 5kPF(.%:Ֆ! ش`xVN%oY A-Qv;cӫ_j{u*<ʾTpwf 5lHXjX[П3_^mQK35!QоmkNFzXi(1ܼD@Ǐh_(szAIܸZ]p>kYswTqO59c۾+!qKh۬ 7vn$bׯV_Sxv\=@:кaûb5(]D;aQ q}ؚӠEjy$nZuKjF!z06NeXxd"~,5x_L!w)rQ#!C^.}Wxdàex̅ 2~ׯțes 2YÖL 2dȐ!Y2dȐ!C62dȐ!C ʐ!C !C 2d#+C 2dȐ 2dȐ!?w&Co`N܎ZO䕧?v/ßRRR3x0ÿa'<] 9H9oߦKg玄n9RwMWMy<?B%^_ H}'HDGg1j y=~&浭I.yD"c{hϹZSEs8\}8-l_sbe( n э vӋbR2e$]qIm+72@a`\0ZS7dCCɻts"\^|:\#IJ8$v{$`(+& &Jmr.ijafa{tt`A@afgO&ꁞR˄kZn)vrdʢ(^~"TW]e̅h?{'p+KGQ$?Γ>q*BkX8yGJfPY3Iz+r8z wєZ{/os7 r?ukpI|JynOز雏RV[=^ MZ9IXg%٤ (]}FO 05Iy=q,gsߎLA |YLr_ Vrn`}TT"Wbm(4̋8HhXunXǨVٗ3~|r=+CM"WQQ_G\Svs8$=v7-<ȿBԑc}nf1RQXuj%؃\ȵ)R䦶;`+} cs)UDZ5)13U*KN\N$9+-ud,} '":% gz+?ę$NYP KӃ𽼯Lv`&!:!Re8hҭT?cteu (҈PNFGSSk`ۅ[Uf/#dPY lⶍ'9sn+L9` 'tZ>>F{&}DrУ4i6W[Syhj(snR.SE`jp(_؉~QrV&m~v*Mvr#Ne1gc+Wd4s/z'Wv=0j|QL eٗ%鐣a܀&uhPt[8Ds|={~֟GsnzNfyndH&8>{s3e -jUC/bӞҀuZ_]?._cɌ5 6eX/t&]ᴫ &yx{s}LRz ˋvՌ="[<$p]&^|W7:}-+iLܳ8frh⇜z3⋯5J#*"l64d(7Ma\`fEĦZیz=1yD"Ef Jzd'm=u]Yߏ!Yble#:^}sBYяy,j*#E6mŧҙj\`FېB&7=}\p%BF^FI?rr _:-љZ<#Q=O)r7*ӼwHs+oSSà Qgjbço |dޒxbS,=y^d<˺]cV nw{ru\v[5&C 4eu-dfZ{tfo?P65E̯7OeϊظPacT(TJ\}=qjPgQPK݊.p<266xQ;~ϮRzx= UI4\}Xcgf0-)/6 9%zi0Қc/ LO+{7zd% ,4V[!-Fd%I |~X3OExU).{kJj)TCC}ܛM'雵+ uՎZвf "sܼLu#B9H\<S( ʳk%(J#ڍ<ϖH,R>꒙\Mexh-Ks\53F}ptI_*Vm֋1@WfTԳaD=]<Řq]Iл\I{=r7Xi %^gq:7Ӣ3#K D-"\w#kU~,V_>(HY2 nqЪ5\r۳L_&NFݎѢuC̚M`}jU?O22,p37&\2|aN\.j%7|cꒃ4ԚJ煕JҾ*oamts1"AA(0'j:tipD]iDtcV.mH[y׌{NCb zvȒu{9b8L'RDچځ8+j`aƛ}͝dWucFui\@ZA;*SZ]IFf%1o] M-z>|N[*1 9> ٓNh͊bp}fGR]{zMp;y޼| ,-!N" EH^fZbN?VnTq5msm^?w.7ЩN-xy1^giڠ! Hq֐f!ޘ,Rh8_ 6Ek/6\EPj™ަ%Mu,tC)&UB=Zj֮*&v|{\/W^Fs҈HuxNVYG`OgnN@?yhM/(+!)ɕMjI$;;M6Iޑm՞SV^QeP[@xp6Tkҁw_̥) M횸FGc#ِZ ):܆&U+ ]Uo??ϭIuAXĤ36NlX{: [>m]u>m"Eر! />xU^Z>,g5hߴ1+Xu8!}:{-E2F R25k!=o- alTmG9s:@Z򕢀5EO{gdfvk[;Hcldv(<'#IK+{#cglm%/cӠϺ-#m52Aǚ hC,λC%-k?1q~<ZQGu'C 2d#+sP0ߓ_1\EY E}BZz_֢R((|+/,+/)D5(,,SEr(CKِι9Taҍ0f0 3G>s962Yg^`Eԅ?GH|:V`?sgQfP^7ga'g|&ڰ|x.?DyI ㍾=ky%9t!D}R_wosSȻ=]Kn\cSH#/}:=)۩l|77}nfWi^~o,~<{Z [GߋAIɬ5KR3)wwi*S_KCw.7)J7UΫ''~ME?-DE {tmSpA԰1i,Q!'._ cP_q<:{" =gHyW3_K:v_Iw=zۘ,LZAqsIUCn {҄it3\ R'V Dbf%F>?-M_K/ceEn"B_Ҳh5Z_t8^ ‰xʰy1j8Զ\9-ǒvf }ҧg&I-Rn,6+v68E d&dpPOs|1pj}:7gN(o<'/v(>+t9 O$r*at' {WE!&DDXu]+. +*ʢ" 7ȡ@ IH=IO$ǯtwޫW#=KN\xwnʱHѪE"!O7x r}Q̬1cy.>>k ǺB%]J $M|=ۋ'm'+O LI{Pk菧k.mCOFaX/>Lձ5- <5=8 7?N<nRǪ#}0a(ESث!ZDY H=ZD?r ^Mmgv2ĚQ}4 _~1b1M| =7Rnǯ!{px[@8+59R' Z oE97;y&}@[@iJ{<3qf`Rշ'ԅT xn}&L[S0ci)KN54?S ixs!;e<'x}اqj\&=ɘ{&VD!F%؍1>gAd`0rKhYYd8d AʿJ=j@dHpud<:Yl>baV<O>=6"2tLE3Qjj +ڌ6)Fx<2)%"sy$rNpGa`F 1h-ilpiGR<3a#^ia3]G 1mǐ چ:'Aܿ/xvFSfP~;C;HOaGzHX}|:$K7ecRÑ$J/iѣ:7Ni3 :T#Ioh !O+%H<\\=L9$!R3.Bw%tkWy[LĤ_ǽ{+Qn0 !/gWNv]1Ilz#xҪE[7}YMEv]vH6Uߞx{@M@w0/?Mϵ]ɋv!ڝ/NBбE;H<}[hQVow8_!zyHRE Ia d(]UY1&mCt;oF&Z#Վ\Dms׍\WVh?߼WG,|aO yU}`#-W#-^Ǎ{V|rLⰇ+tXTqeޜ $JI/ؓWom lMu|>gk)Mz)?K,Ŋz !/W\+&M *D&B;IqGO ~Nq‡?;jGު ~ttcD/G&xi5CPx^a\[>!,2UR|4FImCVX[ROXغIBn( vAyHn2?u_e>K-A"Q{&Bŕwj9m7 )Ք1ђ)Y/j$bstˣq-ze[o?57nC { V^ qtU*lDؘ Ԉd8g`U/SFS :vKu"=XEW\pd;v뇸xJɛ/{ø7 ~iSb< &|-aɥ]Ś2 j1~MX0=lI&r̙ʚvxxqVG01ş}0cF zѥ 6Xևdaɼ$r\G]'{ 6̛ǻy,|Bē=/rN_sz6’"OoƖh#h_pKnBJV7_-xI`Ҍ9GX5Ԯ}4c]ؼv%dG~R_-Ɵavakp?oƅ1goCD~? L8} JCýaAܥ{*viO.#H&/[O0N!{O˹zh$~f,؊HfJٻxqf!z]yґqwoNńH QScI>k{wb񌩸{{/cu00w6b݉}+"Usן~w1yw l<5~|u,ƿ:C8X񟭖2'GF=|HZEMyቢGU%N#>&Nxm"*.bmH -+?UQ) 2:Qnxtrڥ!=>eUQ!ҥ)m)-ѿHո-HZH|%⒛I{qK۳p3"2ύ/?GyIq]Bd,"qu hH8OH )5~nxTtǠ5mx" r-Ѣm#4oT}DEF"-*Q1RzcIzԭ9>r~Uy%200&quGh *1 ӑUQ_{]z;-ma#n.,} ʚcоqEUf mXY{w-/ߝ}pΈV@$qDI4|F imU(oFH)\[ pm7w6W 苳ۖa3=2;Sr@ˌ$鈲^={]"vKGyy\zExùhz{~tI_ ":^d"Oh4nrEf C,&w> ŤCѠ`ݒ?|?.X62Ykd``s2000000e``````$H,#YF dG)<2U>uq7E lhpA2000000e```````$H,n&c~E4 }툩ތO?WSGдp?z]W|3e&Ġuw!e՗&o ~?}< эK{M (ɱVAF?yÖcY'\Ccό8@F!zt(+x_2{:7Fveee000MtNxICu4.HOK߭ kPB>1g'`7(.?{Lphe+-O4i~YxTd\{ywR oޝ1v,eJKmxZ\D47݇Z& _8w ?]̌8kmob``,%P+EQF˳*0exNxis?8 ;;  :s {RBnt!*8ErVa/xg vGТkK<4[#"`,$K0{. Xx8{; #' MJ+Y'[d"Š׈b,9V!WCǽ9oMŸ-FWǠ _̶ܿ3.0Zx7c۟cėc%\ S61k;s]ݢ=O>??†xq+xu?pc"\2TD1|0ˤ<^N~ 9 @Ӽ!Fc<L*.5s10\&zŇS}T\n#W$Rbbg5 Y5LKr5os۫p}f: ,!3_oM\UOKT}/(TsNM0HjC 5.`)R'Oā$зЁFllN:``8ɶ9ZΈ%b``iv+dœzI4C*aX$~]D[cM]b✪u guɊ:ګ6#2f````8ڙL8+l amH֎Q{83C}#77O%=6i!m~7r7EaÆM"-Le````{PC?鑮聆9 a=mSg̘,!!!z|>^;&cVtSxߵJULƂ_f}JhCC `.6R YYɨ0gJ RRc0kV1ЌgsfacҢ~N/N腯YCPo/3:)[;4frS58MQyg;qRF.X=k$_zfm:|IY>r2/m+Vլއ/5)cшdUD yXTM; YFkņ[!r bd" -GCȓSrU`U*[lE5k@* TxEia£0IYӌ(òXuݜﲙ|uGKAhK, [32|@K K}m1 $m"U/y:WJINhQ:+_:(z^(SF:vDvk;UkǼсue]A]zjuU7?ԯYυqX}%hʊEP *ciuYmBOSʚ,C/rfhhd Yj.99WL.<b*T;pjc> 00CܖqNGvA+..A}8.uZ?h[dCmذaV8۫wڦicgw҆Ӯ,Vio31-x+_6K-<߰ڙZ95Ό`%픒,ɰ)&,%۠X\)S-N*ĪBʸFC`ct(HOOȕtA5ٸ8I?vtZaG;7Σ0V˄**)RZ&kDŢSC*&ZQεX4]8К5( X)9Ckp8 2YXwVGKc 96&'#4z-ƶ|EӚ(6oޜ6T5yve7li'&ul[lGt@Y혈Q3J9]փ9pk;5d4cSZn3kVI5O$knBCvLbb#֚R`s^j,DMzOYYB}0B52A9)/_ 6Lil,9bHIIALLLЋyyy\F\i.MfݍɭFѨEWEEz|ѥh!#=E.gmWmج/k3^VkXjl`~V1S.Z.ds8sEE7:*H!]:M.哺SfbYxkEhrd!཰uDP[PMJJ={rJ]gѪkOtIƚV“ؤf@!qz.6Gq:4p:"c(FLThFVkQ';y>-!J$eSBM;mR4J`"zKpYkCXw(2AdžC&{v"A"VoڃKqIY}ʍ!q5& OheZU\,*c.؈h(FyW"YTozu@Ru@@@uihlco$RuOlldՂER^hVZZM >CAFO|E`>b/&x?8E{Ӹ66P+*~:aC˙枫q\DӅ RqPúE1d}89tС':j~$˩ 3S \ l6+$G"Ma*D4T;ZILUŠNB OO*q S&:og歜S[0b'.͑BvNd\hm²JYWS˗ 5\QrVq$? l@I.Ze2d#4k )h@<\TR+f>B#YpY,_u ?Rm$cp A#Ұ"6n׉( ։rDNh\LLlH4P"!/E7yp[rl'f5] ]/9Bmh>nN~iTd+lU[yhfj dl^JѪɖ^Պb*db\'W*U \(F\k&|Vft<N49nX'T.%J WD AC;65{OWvuy/ Dsva%(RKBBA@ص <t7.%~6Aq{ zM!20v?<Rheuؓ9 Dӂm=(K;q` "h"HqC6>]Ķ"=ʭ{5MhxEm`}ߺNY>Ѫ G2WajϬX(+a}`><-,,fb,g=#KW[ lDe{~lJm3_OMO=(|9ȿ湠&P8I jO* 6nh PXupL_doĝ]ձ'ъVѭ:]/xAZ]rr>!H_1z44#.>8LkOuZm/ijEe!/5{R---ׂ4BOP}M?'OJ32ҡvv#5Z Y/2O? bX럓\}v Vn ΙWԄŋ6kEVVxT><Ǫ5WZ>@5*Ꙋ$p>i,((` z4m#11 !5YADYecO(T.<;eVmr(fv?h1\J9Tᛙ8~Ouԯ Ei1C'6NTIY 4h}ڪl,4r5kԘi9WzKSt;0=:i۬s j#zk(-Vrn)1F+ LQ=FF6s8ʨF>u)Ѩ yWPҤ`c٘~Fh.$m> M%ZV ĿV'VHŢB2E%6=o2C-Ӑuu]aPkq*k'qUwy ιᐉ3|#_:8֐e|ʧIiHNSGz}4+ZBʱYA@BMvՊ`r]D R(t٘ jJtq%l9e1WJ9>7ZDa%<;0_:yaU-22/`ɺ+yF\vɖ #k g?q#l+V;mCA`Q8mPQG8}Dq;m<[ Y'#hɁ5P5@f=dpY b.KF ]JS*s;tKzLy 0e(>1N<̯ŋN}U6˾PyP6zs]Χeq4Q|kMȪm@vZl($k-Wo )*&b]m6ՐE͡4Ӈ:F̜QezGoRE@g둡&kYY:l毆RgK:)Gk۩ڭkѹ.P<'wZMi wf{$^>Y2Rn\.rz D8H]fFdT J Fm&֣y|S̎;<'FsZ]`їhe.⨃:ZkHUfoϩMǒK?NLuO6T3 eee>X=”=Կ<[cWڱ}<-x`%+3>%@h|y_k*5@̲c#o_y,vHVpcwآE eN6HSU\)jߥ Ld.tZZCv0 _0pE*U0yI>6w:*h.a$b6\s۴ sG#48)sJj#+6Y cm=[n<)n뺳fL;y|ƮE͎u͎V XaQ7n"h~6^cb`YՊ쎖FvFYvFa'UjvF̡X9+Yj vbTE8joN3f,+-ɮ½DvA۪QNjt: yYAһϫ.A]y=wqϻҼmŠ#bU6aO /`d1~wa'cF oO~sJTX4ZZܷ'cߞW(qJ&Y ҝV, OipJmj8vl>~EW_4[IB[󯷅Jici/ʯ8^*,==vpB~?wۏ ׯPqr?5 $ߋH)I½19!$}H=[*H"i|+~P'.xT8z¶SByaر߬ gˏ|~Wd~ԙY_ ?wR:-{ޠވ:W޳YmFSЄxG4ɯ`Pǵ21jIl(,"za 9&3+W]ӫ FY]uVuBI`Qg'Y"l-`#MfіU]5zUoda @ޠuΕ;CKC[g}g[㳅o3 i*~ٗ o,uta[N/_oyzmVIﯚ6kE /dbQb!YB^VBak ;~/)C(/"xy@)zu[q<|ט$BrӋĬ?K הzI.p?~ 7BDQJ>İp2Y~?"!}wWyO k{vq.IH/q0tNa%g o>Nxi{c#/Y,%su[CyBzb޹œ .쐩ɉ Ψ1:ҊyB;yN4xY$^"veDmBF.!&fh0HLXVun&hC~F݁-iW8g-mGעAV[Y)F把X=؋~ś/;{Bܑ4Z@pQJ.e54)݅̋Nsc6roaQq%걌\Q! i"Q|x.n7PD{trSx}E(ڟu awSh_5i4@~30v>&"}Kz*[1n 9DzI'ǣal\}_FtUCJ>)>7-at1 FUMBZL44hN E(޿뾟=Ӈf)|ү!9sqpzd_STۛIENDB`DisplayCAL-3.5.0.0/theme/DisplayCAL-main_window-reflection.png0000644000076500000000000020216713242301274023702 0ustar devwheel00000000000000PNG  IHDR&Ar?~tEXtSoftwareAdobe ImageReadyqe<IDATx|E?ےt I{ HGņ'rXΆwwS<+zY= H* N{i?ϳ}ϛ<;<3ϓ~;3 B!%B!&B!&B0!B0!B !B !B(L!B(L!BaB!BaB! B! B!PB!PB!„B!„B!„B!&B!&B0!B0!B !B !B(L!B(L!BaB!BaB! B! B!PB!PB!„B!„B!„B!&B!&B0!B0!B !B !B(L!B(L!BaB!BaB! B! B!PB!PB!PB!„B!„B!&B!&B0!B0!B !B !B(L!B(L!BaB!BaB! B! B!PB!PB!PB!„B!„B!&B!&B0!B0!B !B !B(L!B(L!BaB!BaB!Kuk*V'eB!V%[ Jq)Bȥ#F6_#L > !r {_k E DBB QşaHiE!B.Q('gb J}>B![pؼĈK9 JNuB!%#-JNG(N"JTέs (P!Rxo$VEʙ1%*gjρ  !r @NqOlD&l"'r%B%J\[GWP_=tJJEkgcsJ!uG<<BH <:".EᰜHeM?_&B!?RmM19-Nu?.gf{B!\DpO{_!B.~bk-YMZdA8bl2`_luEZK!\䌌ruh1)h{A6#opkpcj-҇nEtz!rКS ۹Y=ثŒo Y#01~ғ Mr,DW¡* Z(}1gt_~% !3$Jf̘qN)IHA'׶"~PpQ5 FFZk2d=[2yg]&\4f='=:Vt5!)~}ޘUF9l̾#4RUxVDgA;UQR~f!TC!f ù%HYy[ONC(ZgbKJfшH Zqom :>?Үh5qlh*ѱjs,8V&/G w6 xϞ-UӮz'T_Mz $Ԭ~cG_`؍rGB%(@g|Fs6&MDQY^YgXX\[|jѾ-]kyS/b.S}']m9?4/e!B n>&eoW5R1hW?ƶ/۰ǯD !rq꾙;ws6uC:bM~V#_6TF#?xLz'xôd}o: f"z濂-zAau(޵`zL}ma"Yy#S^7h 'fLj0O_/o6OLrKbkѳo_Dw I2p ڢ~jĘ!xyGt8Y,1qSxxplq/9c! b"1kR>bcs+c8a!wL]s/k xaQ!מFc: Q VЄ rojew|:jKf<8y~ڭOٝvެc30G)]#9/ߚ-JWnq;ϾS=TCkGrA_{M,;gf} ~ݦb`3p(I,G_! b/6?Pi^u<(]4M^ d#"ǵW])%DGǢcǯQrRAɖH% #Yzif E!#alH;qpmmJkPy-j|ʽ{d6rhhCx󕹈 K|ldS{j9`V%B!伷HJoϑ, ܊-z2,ߺ:}{jy*|K,)w1t@>MZjuim1w{rWS,l*ش6go_Su51B54?=k{]va|rV.cT vW=I틔FB9fΜ٪fR)f\A崺H[+\1Cڅx@HL:"4O dftplbxp16`X;+Wp:s& C(2FbݒzCd;-ލrToƵ RYdd˫'uHâ7^AAHalևtN.oL ]W^y]ۆ|`ޞ 7>Ww];~Z!غu0$DG_WɓGCf421%q0nu4} C1W]漍^8csmոbܤSz} 5CR!cX?J͂3X vg@k%ZA0Qy u !H! !/+rQ,b Ut ;UUڟNҲYUuHnaX !Z_GGI%$QP[+6.aB!CW^ϧF!\HmUq,g!rrꁳ/'By !B(L!B9+>&k*ayQ-(ATTP XDZP<I~Վw’`zMXas&8vS0r huWbNlؽk;KD)z ͎l6GZ|L!\yҳ3%4Xq I #ǶEP +q&!J"hԘt . e=Bh؜9+Pow q\kdv@vP0\eh`o!;tZC46#`bL#*/,!iΞ0QFxRP:zN쐄E8`0$XB)?C)lۭ[`NHJ.rB)ҕ8V!4:@v Qdt!0$trl߽ eeB4 ^VC ɂD$BT9KI uBp x>KBDlש-W&q<<4OF#ā &lތ`2fcN(6 10ӡy#6=G®wv4:T9C$Hh%!BarZLDam!(NOi14ňll/&G UڎZU&[J`R4D@B6D%%"e]a ۦmcsXG(H!\DI BeQ!80Z`CQeKԝm~,@|xG $G*rK%MKJ]DT(RRյX .w49m & ,A]6B.qDwG%$B0 b=jdQ_ !C_Jf"v(Ś5E{.Uh LvϢ?F r eakd+ ׫Z#QB*HY{q e#LMn#wЦbȸ J6Y`PblȈJg8VY%[vBm#9C B!& ./n1qVآru_BBaF _|?5@[(`9B^:Ky:Vs1'UL!x IBCwĿGW%uo+jk%g[U6/#"eQ DłІvqU,U*R"YHBk,­P]^-UHD#1$YIh(9 -kJtN1VB![at~U UVze`Q" QPć;reDFʳV7RTcp,z>~;s `GFBⲒfndi|N5ՈG*!VTxBh09*fXamQ9(ANϵBT5 nhZRRMz"qS4t GHЭB)WsQ_ ifn5{Km/!?V@oH[4 JOãۊr{,:۷Ar\,BNo deڠ:l8Xs]t0$@`%L1.$+IƎݸ&Gq,sGa:i`!brn-&PlԍkTNaӈ)ЊFW+ј KJE\Y e<XFmx8pviVJ" έ*/N6 15)V._l[r`93⛍(_sÍ{ཥ{01,*qp $D),W|Qԕ:A6ؕHJ z34=e`6x籫qp!VZTG˅Qb[n{cSѠf!Pț@À}D!J H+~:Ԏͪ`LVib v煢g P<%Hَ4 B4$VℕΣܟCDn}9RbG;v 68c^;۵c|lS~dbNaw^kEhBZR tO7+NP>g:lF/šAD GAw$jI˿eB09DvhTG(t(D$?À`q,pQnCSI^ZyZE"Z7ba3 z_PL"̮[m-׭Ӳ`[J~ y [S-yؐ[`54⾕%cnEP5(GiM.{Z Y-7 -ZW6*I(I(gf wڸp Rct؛ ʎ8Rڀv@Xb{tc,p79kUp.B15Wqݰx:O)Xv6_gDܘ2ҡ0;B.9 UsWi8ʪ *1 G:/NDƎ\!z-+5JD.ρ }s܎ME  jEĢʢCU]epl{ֵeU[+-ޖ>YGo1Q0يsS׽"GF_dK9ˏ;c`DlSvN x_oWq0Bk'+^?YϘ<-^g4b%>[7r{yE{.'OWL$@^Q^[]d]&PG Ϟ! *-v-Ca2T&q<̄Ber-& oK{MDXJ: Z'!8-DDRh %EDHJ XaF+G"f"EEPRʋJa|$Tu#m-Π@@`+}V+BόXGegzS6cb(5=H{tJŢ`NLU;x\b.1:_o:8FO+:}16ÝWt?*nPXm/g\`y0E:qKD!.dzYL\k(\[ Q8nbVR!5 0%ZB԰Y w7K 18(1;jĦ$JFSDi,I6%UkJSKVقȐ`ntu*TU#HF3wy.m?Zq ,Y)bD9(i2ފ}ψFN Eh T*51h%F4;Ln>&[>8WM훏_Wt{Z!&݉6 )KàAGA:L^p„Bȹ&Cb"J -%(Ir8:Փ{RN|R H$)6PFFDŽVI NVLu1XהT/N~&+U#ب0)R{e]79Qov~+LEu MHsMiΖmuzP::D}Z!:,G~i5-nm#p1Bz#b(` ۨnqHRL GT%T *kꐞ1B4-UN<" AqC1kMGǢDF"rQL. a>s:F_/B h,&By&4%RohHQ%TY 5B|[rD,fi`Jbq@fehaX`.貒:@tIA[ѐ>"k_o"QO|^sI](ɣewlǂ7*qxx}g?"?Q vGVx{g|ԙ},Qحrq]咥$`ޓ}AeDG,o=xՋTsIOڵ2?l͈*uPou E9Buɹ&RWN>\(Dg鍢*jL4:>tBiDT$E0hj09z EcuM["9k$.V@HbLFFTs)B 015 `͑f.J/`|dl"Jx޸7qYvk?}*D^ÔXqŠHh=~3;&*MjE#-=dz&BLέ00(io*ⲍB:T"`1Ak8S},tD'p%n[ESMĵP"cdܰZ<aۄ#;]+f]WtEJ|e f j́V]yvG\ta ;`/hgF2Ymh7:!=rL/gLQmc{/@o89/ǘ1_{MVB Rр6Z J(HsGjaN*Xa\=+&I:9>+# yM\m.BOaJ$neYu$biT T4yŖ|(M/Mz^[ڛ { AUX$u^DRGv![.>?䎮_(1 &[gb<<2VVlų_z|jQS׀L\v<'p M03mqQiFVGW$"wkr}S|kve#z!2"uMظ;o-=2UxCΑCOS!0~P&f(_c'oOB!i[g\W(N'YJh 9eB^Zwt㟇k"DNQ9z]W uέw% dP"tD%zqL[0ù&txYJ^ˣ& ".dL6 2;-),v:Q&mJg=VBAdr;ereaiVPǥ단`L& EC= $*-DJL!&#Yɿ,B JHA1}n3HOc_no8@]:*>g4fA$FlAbqΝ?jr ,,5v2rۮдMn? "f1-w$~dƨpUvGE /O~'O[p!r9Kͪnhȭ^g3$6VҀFap[C}KZґp 5#E 3ȁZD*pt뜁n>1zc` rnF%2'i4%q"<@v560dwtH%E]C-w)CB يDy9֗!4 9!JEa-JSNi8iV?9Dg`wtᘼD;w~-  U0S8sdG aٔBŁehA4!NjkB/DDE|Ә‘n'SC&0 vq qēcPx+"Nع(z7c3CmPtD-~7!æcsjTWQᛕk9;&q: Zic|Ĥr{]kÖQ 闀6)@A>VKr %&`ʠxH~:eU繟U盌 --.Wg@gj+O{yjqgV/Hך$1Ag?y- ^Q,1qj uSdĆR{^mߍ[=⤢ZL?:$ĵS!Ű |,./?Byb1b[ |R-Njx<8$T$ˈ4&]|IT"NҢp!ޖ}x9gWxm>W6HHGx kۃ E&9>x]dĊr7N?+Q>2e,H5-!DFg{=}H3{|x+eğHq[gܶRSt }c1O" ̞N/t(}}PWWJO? `hpK쑆}d{=^+'@IG܎r[F]מ0* ߯?.n}(J[b``$LEc_)C("Br2+ip &(18-'[E$VǢo v/Ӊgy'͉ Uot\8+}cVn/KZ#)jז.*M c;/яV 8RwNT2 -CP7 p>XYV _K_GEttYѰ/]~ooUA|<-6oD#,X,O%OMõ^!<>/ooo3؈"YN:jXhþR7 >n;6?w !fNT`]p<ńIݑ"g{-6r'|_u}c02ʂ^u4LfbBf 5˿m3*m^m/2@UV_ވ~]2B~{ab |`BDZ}D,5d&^]+.>1&JiS.gz2ߒ]ZXk2MwnĿVtFL{k'/SBwCZ1V8By:b}dk~\mxtT4p=ku/kA~ gY~i!/tz=BD.| ]~"΋l9ߡS\h ^v Rxq?4=79BhWݖUA!Y5얀b: sk[1&v) `WɊ؋϶xw}ONCu5$Ysmg_#x"^<,3 9YKWfEÿG-Qo%9~%;pJd@S@5sV%5k_B8Ep46ީQ,B(PJI Ek}cA" EBb5;^Encsv~9gws٭6kDagar#1"eQ $&%`E"]kÀ v~[9ZSt&u_[ʑS\J o}9ܳ#P{IʫΑLh#z\U"}CymCmAʽn[!:ee݃C 6q |kQ-몦fَ;+Q`R63chb}^弟uJepG\;ށ:v7DabТ* ;x|}?I%C|Ĉq,'vbp(J!N,&%NQ D!. qB,A2a?pkVX i$NM8ٍ㲘xϼF!F8,&v^`(Zc[q-%V  +lB958 KBb(WuXE BSe%j\7mRp[S1e`r(-(`.*abdV]WP#$@NbpH ek|'c a xH:>^r/~)ScT?afn97 cdZ#u1_٧^+:|_H# !I|޽;***p嗟0iC{lk(@ĝFlL\&iPj\I bM^^Z IFp/,"%Z'k9H]4"T:K!M1/XRU3R/L*ZXFzm-x˽$SL|o@lxH /G .\3* U]5 -ZL>Y1^Y|;8<G/rǯ^رn~Mrsa>9\+iO^k1<̞O7?ĉ g* Lij48ijjEj=h0Iy;jZӛch {"[3Zrו(hD(:'%gy[yґDDip:`?{+lu;aﺡT<zu°*|XV[ms4[磪^,[[JL r_.6O=iQ6>^1S! a櫇E?NϿB6L,*^;“iT2OWN2%]vx믳1;.ZC {߃=>es/D:W_EBl(7/B֝7aJf;ð0zg70!*Jv>fM3%FעBڷvYbCըuUZLUcWGfɻ0n(-4*mHǯGي7;( X]3HF ҏfgڍR$ ϊ{nrNB礣v?v'X9oi7w'u+Too`B)?55U ҈;V7;--Jvm Ϲz>k|$+-dҵi4YZ x[&T>Rw c4Bd3&Ӆ0& B8'L!& Ndް($SI\`G̴Đq-:JHv8D8h8tL GQU#-GF_-arvr\N B.RbqtWɌeۊ<׳'L(F~5uuu(**bEBdP _&'iV"!\2(YB0!B0!B !B !B(L!B(L!BaB!BaB!2{oK!\X~VńB! &B0!B0!B !B !B(L!B(L!rfB9WhBHkBX ӸLhdsD(L Bs{n#S7G◟7BTAgiETRtֲ2Zxw JoZxWt6H-B匳:D(jW ϋ$nBkH6jV(" 6uv BΒ0  9]t~{fcޝس{;D"5-\wc3ab2q7oʊYn] ?233ѿ$2,Y(a:{=7Ϗ? Qj@_t 8,98'vc`[1{aMꆑ$Nd\q 7yc2Ǫa){1fmPE1{X&₂>[IC^Oj;=UCkc- *L<8eI0ԨDaBNhTWU4zLJK_7 RaĜh!O[-%|>w O?mpIQ!#8| h܅݁~Y7ǣcx>hۉE\)/@!N ҟ~Bٶm|=ID ߛ*Q~glע1R ~ k=G(LIRQhtРo|!gd|7][h 1y|Ƶx^xyKЦMwwl^dI\B[=9pk_#55-ZVXq˔.S0tߵ?vDc"n{Ѐ?}bn(.p˒ZgEzJ4Lun[ػ( ÞDM>. rd fLF8EMtMGߍŒϴ(J))kC3G.Ǘ+Xy%YorG&~s^z饋^}Zc 4U,krqy{ߏN<l~ nGrZfeGXʎ1u~7_T&fԴt95xؽk+6m\sJut<9."C&o-SD)/"=UUJr' *8yF\~yd {-Yk`lh-]Gݍ8Mp\9vjoƻ|(M_f/z㞛&aM}uҎņXzL?䅏 ^|s{ Z*r<(-~m6@Kc#:_hbcC܀wp/EZXrzx;vez؄޼s^/hjFlp[L s'꨾D-B@Ҳ {[wg`q!-{Uw[?>VPyO GW%`֭x﫵2F6zl8Ub:12EP}(iCntOϙ<2Nn=îL1RZ[{ON^_&93_\\,JEƝu6/~gsME&5OAvz$:g RO^<"!Ǣil~9YzNX#0)$Hjp_ޝM$P:%a]Wv܌{?IAxGzB[o1_-,-^ CXXvI0Py9r$v㲑'.ĉ{J2_ V;cZf?/Zɯz~RW\˱/jM?wm£>{c6N$LC0Y/4LJc>+k);閂_& Cp|"~Y c{-Կ>Fqn}vFqn":!x4:.E6.2T-q{;&mhjWd1ztZDbƛob0ĥPGuk1rH\_g=pKXz\;#(X@EŎ1[$j4VDWHLFb DcbF RDA@;;wqr;;;3;;7rqTxփrފ)Q]'sx226cn/O-JEd'hb\~psmo*ĕ0eV߳r(pp=0i'FesiEThH,){#{.8yO=rÒd&5frZ9/9`T2 9ZLbc@$*#l}sAu}!y[~8|?v%`:1E]Gp> 2ed'>4zȎYwĄ.w6^ļYʥ!NB"b?>s2°o*bmS f̆.ؖtr'u+)D 8t_DzfQb` -F2*/l4;v{[Ȕ,vt05Gb[arvoF8.:UFu}RoW͛wc܅L`Д?xiD2vӇ|L͛qA Gfz"fdێ,*P倊_[+z!^ȤI`٨բ>4Y0+lktBP|m龎|>8Zf nlAF{U5D*(.-FYyu`:E UVʘ1s3an()*]kMC?U?О=@)L_r(+CzLt,*5[JX>7](U@p4zGP`zzLթ7h![I,Z0ZRR͗YbB<IvvV Gn3 &>tX7'&I CPb]߆뛷` NX4mIM[n. ~.v6^_NjIFEvϸC'2f2aW4ȏn^LJܛٸe'w3Jk m,[HF]ǰ`ה0θ}{MUUɉM- Mٽ%//*-f&ڵETf2 &zrfMZb=K&(\2H(g<7kpHD(z7o^iعY$ҌuYq) W˘PU4R~<#]f7eUgklDf^|>e . M~ <;痈/0ٽ?)q3/d6W/ad8^L*?'ɁAA B#.BUS}NZhnOބbǼ(n0QNd:£:ʗ}[ KLc )wQ]Yo,kJCWːW~ńhp G;yw[АsT@ϯpwJabjĺ0GL[.`>|!$ xʥv竬EIV1зDugBXFrPn͇ҵAA𿧑XC<ձ `@ظ̝[G'g1ᶈr-6!CCdVV [~xik=㫿A؃ʦ?kg*}s߂CprǮSg\~ne?!/sO۔&())ȹyy{zIQ=Zr~cbj+fY߃vgIto|RՐP'sc^Oxl|#m5og WWn>G̟[j&å WOD^\FF&//VɅM JSGq:]b9iܺHT="k~ܞ8u6_.E9HJO9`eɩ'iLXRmFۻ^}||T *ը{OVM~;^=tXD GB³-֣.]du<> _#2*ON: 6CX<+%AEaȎ CTd$Rra8B7}V( !w01h%KIɏGbZ,"iDBÆ8"z_.bx;n@tl+RA>Q o_ƥ*0~8?Bhd$ȸoezF;AyQ G\]z\ݠ/h܏yy󐖙&;ul(.UǑz#h<8G!;bc]xۈlG*ňG܇K$gd!:b1v0gwdr+ a\Q;;+Caf&"v{޻w6F[8.]JUd$#)=_V?~\¡l'2N(Qx*AAYIj|lbf5""l-^f1vudny g1ٰjh w Ni0J5<}~k?ylϕ.Vua̰|AwҼOOj&(=+oa$1TKuCߢ -j7hF}u< UtOrBTD8}עl'Z$U/9儫/w1%8r"앩_esfn<'J[t+nc}ͪ*"!":\(ݴ-F/~u[qcng ǩ <&!3Is_M*~WEr6b~Hmjhkd 5UpŸ8 ,[scnMg XᏃh |mˆ^ M /ެn4*Шi JUdkJZ$%#M膀 %N"NLzQ$5 B pi3i ̌jʩmDo`mmuנ<I%~Ğ:;\tH7(` W\}kͬ`q.f5IKj];Y0&펍D/@UMLM/!y80A1b@C] ̭17c()*.=B׺l#~(+κ_4ŀs\Ƚݕyw( al5~+_/Ugs5~I*U5X~_U{ԉw?d6;J&fn_0m-i7ވ|>yo1++ N3CajLJێɆi714ѓ0!rMn0yܢ֐gǞ_)^12Fo7h ]PR*Y/To^0 ѿ!6[^êT<,u(+*΢(}hUP]PLMfBu OǺgޘ|(UٯM0T-NQZ(8G~{ӫYh7.m80!&&2R[呞rþGu1L\WB0F~i\w~CT"z󫤸 A?&:SZ aIsⅳpEXT ;&'yo\K+g*nb^ȉťiyxӚXM<_Wq(.FMa6Մpbhs`Hصn>W$U<}{rV UXbhyP+-D͟FU5-2!y|q.r3c߭.p_䠄5ӂNM)f+`#7QB5552H`PY273[scm[ܒ[B[Tzx.ھQ2b5 ~2e1ӻtG  NhCYi &7ꉊ r}բ<{@R";  e&ۛW>n(*bn1 n"vQu3o@\Iذa;A/* *$b]=|2"_',8Zh#iv z9'6æ{\/ cyO/'Aj=W9c,t '&3NCAsWx s}8.@/oF_vRv}fumڌ5}7á+NIFh:\mԁm˵Y0vxۄ ->awp8H;cXC[W}}3fOl& ݘ) zx}&FxGk=|@׫cBC aB}c;c?ܽzYH ڌ'm1@ʹD?Gx0=%k[p0"vI ^01j"w6a_`02D? ă{2; )Ǹ|69 ]&׈k: m1 l݀I0hkOVc]EtҬ%nwg"$)yxPw"Q~xx˄k=g"ٗ +D cgxAx Wr2oItYbn8F_Ր2A 88'!6b@l RI#\:WoAnA$$!N*m6xx!B\no7+֘pL`s#$(34H`m5q.zAkdhjd Ap C&LuÁZfz̈́tGyAf*p ;MtY7bVўjkX ѿ$L`įQA/ydpئ&8QNʐlO$^M7'x]͂M>YCv(lIAD<,dщI"m%l+nx։ ,*1AB/X#  AA   HAA0!  AA   HAA0! ᥾޽{t5B E ^JJ 222(cBJKKѾ}{{:Z 333*|TA„ Ǐk.ܚ5kq֖2 :y&&&Ϗӟ)JqaWs}~©ӧ-ևxܾ}.(,A)Jx#`;w!4{YB!{ ,Bjg v< 3;qJڈ֭Caa!ΝիW M4ƍzSSa/HB?ܸq2 JyGx($ KH"*WSz꓆q }? CF„O?7|j~"""/ dO:_~EA~h۶-^必b:K&Arj'޾ ) =Cd9;jk÷Xʽ8~♎d!aں/W9b۾qGx~'0.- pa_A <-Ig͛7nj3ЪU+hii#G5kpZðdqM0* ^DС XS),-SFhת1n=G E9>OC{?SWבJI\~UʻF79_`l')7 _#2G}M}7x隥2Ƿ7MY8, h?giK6 BlҠ׭]{ڨWf*gƌی`HJJ-%M63f _F[AlggǛ9cÆ 311ԩSֆ>?ѭ[7q]t̏cQP($FѣG9{…غu+5j #F+WU;GUUnnnpqm^ĬI#|9Dꣵ(:UBq~ڪ3dZWbD9.1)P~KQ*I7/z04&r ΜS:ul@יgƏk&ޏy@_ @+@%~V^q*t5*2bTnK-\Fۡ/OmTf~b[9|Q^]kp=Y)o?VaR8V6Uk#=05(Emb\N(p7;^Xp K ἕعN=''?bʥG9QxjXڵY9漀K\΢o… p-¬Yx1zh^pTNtpG9ǏbcĬxǥ ,TE(JD C"`u<"g~jЏKf(UfQfY>V9`X8֘T|z^\`&J j(d&TQ 5}+cMǥ+hl)YӬ=, \dnZwmBiɛIbcѦ f%y,1ᅍ,Ց[hݼfY˶Y EhYwF ) 2%A)|{geeU?KY4ξ+A~8O(Rl"w"qZ>\C[3+qjaX򔕉bzi^Ҫ+,t8|`>:5KڶӸvLO-C|JځMb׷E6l6I[i1iڴ)bbbr1vͻsȈe"'B$JKݛ͉ƍ+/Uڋ9? 'HIM&\z*+bnn7ĜXx +\YbqsA*{,sttt VKG3[#cf"¹Cgj{e0,L|~)lRW oWLBQ^ Wy*օq__=L@EiHbLBwr/-TGG(4*y'Ăb|-Iuz/۶ Z +EMHH,p]v@*UEҐ|s# !;88[qziy:mXEhIѸ*ʢ^WTL>kߎ(|4R+AT# &yvm,FR\R#_~%^ʏ8'. YF'6Xz {&K'gř?>6oެ\CCC~JksfvVoKLw"ޡvqB[}@ "o4~3G|@+/dHy8m6Ytd[52S.^AXH`ɪXt\hqkǫ90Ά:Wx֝{+@2[ ClZ kX'S6wBbʼnݻk[5m4<̍8S/O<'N`̙Ϟ0Q& (5BGKmJ?G^Gva_ܐ5 )(~N4Kd9yInm"ՔeT0S P-._^~N0FMmq>?jCmlpR?iPVYR E#6o1Iʍ9 Ji ű!Gw5Q!PahB֮z60㚪83 V!z6]0gl;vd)m{46K̰=Hɚ?]k|%?RAq޴XpZ5A4puE‰zy.ގ'8QVkM{ &B*{ޓk&Gp&:)dG5Zr}~s!aݟ Z=\VHnq;'tͭ,ȌH(3s In ~D6 -t(;w`o/"d68x4Xߓu{xg|' 6:^/a NnSTWl0!VG \gؾ7{_]p]3;^-;6= U.r/oX1s̔|+AG0}I7lH¯ 6&*9t37PlhϧEY,}6_֐? \iɁiQx Ica_, <.LG3YX`D&?# L Š'˯P/iV ^(EEd H'asX1ӦUxb^ CT <G& `>::g""6 O$3AN.=0}kd5^zՂW<~: /7C6꣱V9ѼKҍQ\m1sLci6b :$k.g uk45X?ڽa}⢆+&ućA\s7hHg*U_W̛0Ǯs$[J~qH)IBxTMJ߁~w z793 0 2FoqKʮ$hKXBAD YLe81vtGo8C]y+* L]<>-| Ϩhhjxr-Y#4^}&qС].,.9Ұva/!W+IJ1o_ QY5DDZ!pʍmPRH\ޠtw`oZ1oG 'RDQoӢ /b:՛ksblueeLv"7YLbkЯl{cﲟޭr 9N2WmyS^"-akGFII,-:8Ûo<.E:*DD.Z:ԑD8}pī;(5DrU/OxڲIK|'!U.aC?]/>>>*쏊TTljR Wb5 [\K.VZ@_z:@]hc B.I*갲 l`Ӭ;G)!/8.}TP$4sA u&@w@WqO,Dw$|Itɲ +硰Mm`$/KXAȮ#4t%A2\ s ;Ya{YfiOF,|.*B#@JOкI y=¤!}3w! #GBKk+I˵ckYȧEZ^S%"'iTRnx 7ĖXWV{a_Ѹ_ !ӁСW7jc)+_7S'Kpz珛V*ʤ[tC}_+aVEpBDm J7'/S_p /4Px T׏/a NHm Bbe   HT^IOA+   HAA0!  AA   HAA0!  AA   HAA0!  AAFf.]]]] hѢe %fffASA@„  ^]p|p󓒒ca0! ? mmm3]tᦀTTTj #55wFll,JKKyf͚aĉ%a,$ Ċ̬ :b$g43 h#p3piau/`*TWIСm6.#f]M{O1y\xhç}nRwk%ţGO*׷.&jzX 0~dDTOs۰Ԕ9!qY0qZ +.DGYXw61*HT.-^;GHp o_"R> h8JJJd9!k.~PUUŔ)Sйsgb000… yr=$&&bÆ 7o7o^L:Çǰa^yOdAXGxyyDI EpL&#G1GHp I7y?oJe`&F|eXⸯ :w6m@T_ qGxzzZ(~ˌ??5"Wc߂X 9.w^?c!JN7n W[Crޝ~2ĉXnc~g1r#S~Xq /6vrdwB6"P=k-8״'~? Vغ}7q;O_tRf]EXf[[X@V%.#Зd`.CM (Z~ CH%28u#ðqaXsGK gz%"Mۓ*7o+Wh T0E""E 1YEtۻtptBkp[on+0XN<~6Ahon!5{/`rSj Y:n%22_CRuZFFFFxe$$$Bm۶Վݺu $88999{ǎi;57{.dU k1jC]\ t40pcZ 60k3iGҡC;^М/Ð8xˈY33(Ŧ丳+Dή04A&~Ll>EelDkWpJ?+ׯ"%وyH3؍bZk]!=Y\㼕#DAZ@lx.@۲L\eiS:c 6|:uYLO-cTJpKn>6mX]9",p͑>n00Y%pCԴ>s7GrFt_瑽xXh5Q^m*'Ub5f`me V0LjeRqODN:GԂmė5Aׄz6i#l1mxEqxńcg>KOU[,p{JZVso8phӳkϣNkC֜GYws:~.6|xh>sxŪ,Xp/Ll e /S$`ϭ=/DlVZ;fe WxC?/Y:[Y 9ĢDu]_kǫoYY֡( tOӦMqeR‰ARu%-qtD۴B馽DYt^=gkP#DO?>>r~=ww3'+?>>[6vio뗶t &nܸ~aƌ5jz聎;Æ ôi0rH`HHHwzFp$4§hN=akSr+=˥0(n}t! #>ǮN5%#[O{0b6~u4}إtԿ*gZ8Fic7j'-d[sOMuh(^,ٳ[F*(//7WSS=?}a0773NW;ӇtJ~0[#Q[rҹ|'>w)zY[hˡ+le|"V|KQ +$ !>=?dpF(\;WJ~fQ>5B#*}A!rSGI!8뺨z:◯dw7SSfQ|ΙF_VlmU|o)5.B|gҴo2(׎. =*^}֟q,,nul)?!\&e>%2dc|͸(hgu $>w83q|/ƫB#Wg 5Z"D+8{w 2'`l F˄u}X-Z ~ | )jyd'E㽥kre>ڥޟV_];9"&(;=̓2{~|Avm-ǎ`: jXM7ŏ?w1B[+G ÒW.?A0stÙc=71p YY]~HUˢwwUkz3&N{tvWdyȟc\^S {|1Kn&R fv ]tG\h(܊!ݗnImS$*U.Γse!7OX1MZ`k*tڦjHɞz7_T88YY\4eRW}\#-s=gg<<,ڞ}Q/F3BT'kdKǍ4ϻM̏QjAq@\S+s{8YLpI7'0"D_+箭Ç7C-2QrQt`i0kF,[pST$=53;O϶} CK02;aͲe,~On?Y?no|ll?KN?T7^XX5fO+b:{1"7q/aGK-d XQXVn =`_\@QbvԿ{\sѽy< =퍉nVmbSN#+OwĜ:n>>lز^>}M@wޓ~YSˮz^Ws/ u#}\8~^8Z5"THcQz*(P(wmǷ"(qmg>~gWKowa{s kӂ?c*|y&ν0zӤ#||ud;w )3MUh/Y؎y6'p[V}—J4k}㴭b9Zo2j5)z]Z2ڋjԒW57,uZh^y+1";:%Ի=Sj;k(ObUzEy>E.tӖ8XLy1"8DWWƍ¯C! 3;_T:u$Uͯ{V 1d:4Vtek3jIH}s-ae2J-ӡxD!-^ XV% +C?<`+|l<[);gb̚G]cg_vK1?$J6 f 4j=FU3KFi 棲{"uL}Qz^P2K,l ^aη3 ;qCXX[L#F3(X,?(M'U]kY.0g/S 27ǔnXjo#/J>V/Oe!,*Uej@5}?}Hv^}'gMa4)SVMR jmJMyYh!!UANjnQ1CMв홢{ոk(O:xQ5w\܇-W,DRo0i.\VZɭ?t/|"|ƛU1NhE㓊7 s<&%X8{.7/e t(̙6ڶMe! gʌlتggKF͑Ju\ ‹mʑ!2s$wDy Š>e'K hs+_k1cbOɘWe`ԡݚ|S"T[Xb3l:><=9} DZCִ`GD`KJQ{QS몖Uɜ)]sM[S|4j&?$#PX[ 6S¨X [[`+|z,KH"|?jLĘ FYp[‘SWC^*d͛}j"㲪4NwGJG(5eIZъm;7>y(=eeqOVIb4˨Yܫփu勤.}]ylll~˽#""jƇsr>]-$^~ʿ;e3+G &W^P`o\\~k0NАj n{n:֥ ''SbdNs xYbTۗRL Tނ) _a3 |"h*^ttt- UUU e&} oKM).[F7h0FM]Qoq// R 4iak')'  H<9Kqq1 j&;xuYY .MAA0y*PXXX%C__ r5e$??iii" I[zz7n/N._,w,**w~#U[7uQӷ$^+YY4w~6^ou%^ ݌W!> ܷIA„ܻGn߾:sS?~!+sʽ\~# moEŷ$iVE}ѐYkӔ{xxDIV2mua"S}? '⥿}~FSSVUkųgΜשٳ}1>r>\62.2QAp xIJBJin^ZS(0-1#@˜e9s?sӍ~>Gsy}}sΜ9<8G gg[28~NmfМI֍PŤCaӒxd;1ӫu6/ F;}6U]я1h'l]+t1jpڕaْj2?OJį&B#jGM^E%)4d/]j|{/^g&_ěnoM.}%NkE|`acx]$M?y-f#c!GmX"+qDŽ{{ٲe ̉3\~(++ܹs>0ጞ# m ULVp !pC!u"!1a36 +yvuBBݟ -ծ-LjرmIE&qT0ƛзY-1ipo, 5J6!/ݡaCSc ド'?$&&ψϟ?;vFՆ[gJN8mqD1B-  >I;r-AAmJL Ą    (1! Ą  m eW\V_ċqo֭ܨ ϥKo>8q:R+'}šgϞԃAAСC(**BN0h \2r5\|uuu/xu]h߾=$AAh3Ϙݻ~)T>ྶᒔv 'Gyw}7uVn3p"| Ì)#%m|eˠu¦ZvL!y+_/) JO1S2-l>KbrJM)܁Rm b.u\̱ͣłSmm; jx>(,)ۜ Z&vN9㦏in_[Oj :a1nb(Wm>33өU*ӫ]LGs Ʈ]0j(NIK|\/9ϟgiqeRlۀI)74ܷp^]'FY.*zD HyWau6Øaq<)P X|$bbq]O-ZGy c9T'o@-+Sb09yb: oFƅؓ >tƨ?%EZdNOw++cpӓ6cݿ” 0kdY,lg/?3~Ѩغ}/Db]@87mNu%TvY=p]m+E8󥖕#6m(`HX#?gg@s }J[75[|K*p\{¹0;<*f_˱q^T K}s>\⪋P>gδm!/]?sBB8īy]jAҳ7J>Wr"$2 9`eyĻ;ޱse_ȺM[ꝅvk86ĦLmSzћm0 Nŏ~7*m/wc<&9iNc劕F9׺|6)ջlǯ З|g]DZo{ }6ѩ/;~<+=!Vz s|gv&T] flcsR{1nlڎ|l;X^mÇ%'_݄Oax+oqFc'b0wDɓ'b 9$+ZLH8$˕'KO2uTyBFF:,|]h.(3 kƨi0i伈>xxJku;lF.E^ 3'>Ț'Ëj`6bbzR^j]9Η]fX]|ibojBіơKQx(3I(9rP/5ow?m5sp_V_5hJ=N?(؉tUbeF<(Ô㑵rc1k.Ox|^Q>> eOo${!뽝AԖ`j c}GTs喖ADN|u̮_ɲEuO=^)iMZp پckQTug-ـWnc5jq؊PV 36o[ Ğ/x"8`x?V}_Һzo;#{t1ػ%Z+G[OY '¾o.m oj{e*'QTi^vm7f<*ZѢmfƑWqkMK Nʿ{m"3&}EF={+2ǚ;GaWŘF;*cNp1c9R5iW";WNv=5xgKW@/FW,* 4 mtМ'^UQʝ:k;x{U ]Ak,I+hnTlXq8j߬`;Y詼ǃ qx#3 s@*ck 1E(`G*Ykʐr g5|RPe'>rh8>9ڐFX3E2.Gdd?}R`'j?؇!qiz}[q %oQqq; NO<#v0arl+MMq>űWǽxjU-KkƎJG2\$Iۿ,F O#8ۯs0/+͵[_sV1ۼ۵ݐ=å$Cw!r)\:OrCѾ:{"'O,~X4M 2gn<11W5ip HNʶLú*|a+M]c1gu/T4.93 Tw;To'ݏr m'>0F:/1EaW&HVAiS"<-asD̚ 퇂m[F]z>?Vt& tUGvXztuk7.GwU٫NJ:v)F./)o``6.5/mǻ0>űS~Nʁ?;_qiuzWmkyCaw]e]R/owKu8/}ߚ7t/5Mv-*vF¶s]s9GbVk3ϴtX} m"kD.tpwD_!a}||н{fj3nh)ϯ'p0cGbjش:qSAc્KiIPauVj+:" _/õ}TSMR@Ŋ%9oB#T]l}",p@0! V0|h<ڟx? WS'ņCXh?ʜfXyE)wbfJ\<0,e*"]`Dűc2߿x<$ 㿟aQH; 1cO\/}`O+g;d xJ%|'Lyw-onGNwЈ$“d{`}}zcvJϹrlX /\9GGt Eh(:1j@\`4Ey8d6c1tk b޸3Mx̾㭷.zD+b}4<^:]a#-i5K߉ 7Yx8`3ᾖc8%KW7 aq.Mqd 0aZ}A:_1k3BK4!AlN2Ta Ӊe}ƱqԒmHhCܲ )w<Ӓ&̝2tikn1H6m ;#SB VGG7\zsjL./yEZgx@t WFHHjr Ao#᯾~yaoC_>'!X4tq,vFFl8pcnZvU H5>s~L<#U{yB/๡"[fgĖDEw6.)ِ?Nʙ?O6l-{V  Fb>cp^K駟Z1AAm_51^)Ͻ{ /KnULAAI򂋋 /;KptB=JAJpPP˜_u |(AAPbr 2Z-K틿/kjjpq <U͐ØZ4_Wq7ߠI}f[Ĵtux86IhoAV1Ott ǯ(wTv8Eaka s;i x)ĶZ)I jq^CC[,9s,Ravlc@h<'\iƟ@rG:=C_i,\ ]=i+NM8S_&DѢx68t<1?%\W_ƦmfʔBDzfV̌io­M6ZiXZE\ v)Ťhr\Rӟ@"f,}i*jcmA1Ո 'eeepWE| ֬Yÿ\mN-xw~|<2T݀-_*T%$NFofik]ŏ-9B "k , 2>kcQ~~)3t<ۨΞ3? DmUFF+2V#fuj6k|d5,@Ѧ_YiAPԨcDѧb62OO~:ApZ9_DD G7}6oތuoz}E_U/ư믶0wK1mQȘ4Bg<1rBn1 /,P{NÍ]'OD/m5f8FGo@Ȧ:,K3}wGEϤsW{c&[{1ut;pUG{=p=:1פ~3g)+,!>fx݉N Ad=~?g?^Mܡg/KLx<-NϗH;P_DBf9ٵeh&V9l'裏h}}]#B4B (Km:)*d3 f]wfFghrA+Ҏ\@A%&AAAA AA%&AAPbBAA AAAAPbBA%&AAAA AA%&AAPbBAAC*_0c+eek+[.O[²־b.Zk-0ַ[oڴV`y˖A7gŧta0/HV2 -6 m橕f1vgΛIK6&1qtjGJ%aIɌiiϖ]LGǕKao&M@_^]PsBnvH|zv@›xwU%|XA(Hsg}5$={I5} J/E*^݋(:揿*]z1a , ,Г˰0+/+\jۜ+c(ZAHa\Y9O7:fK.X6Pɷu=wq&<\[f|8pwaףQo ㋗/C+ eܸOC &}%Zeb,Ѧ\.6ΙPCx?..?[XoQ`A?iƾ}p6];5rw2k[{ "~bG|v ǕB+os cwc`˵SO3q&>lURy]j(z6;X Scu>Ͽg^3.׍ 7.p611<qI&N+T3FetlY;h.(3LjIKWcT4̓e:Ԗ`)f YJջe?abƦz/@-w٥ŎJ!=5̆mkf5jp 32QW|"'>Z ]P( }x` Cۈl]j P+7JLWZς+ XPgOC2i3?}y6VYFF+"/梲h#aJaʃXM9ӱ"6鏦 Aۄ}R""(-18fy2d̜o7;7oBM}G̮Ts]>x18KY1osrcGE+l3A֛|5m[.J5}tT7/釯vڠxuacmc^u:nS;N'^TSԷEal-ly&\w}?}]jʋCRux1[m'1q|V})yP;68lg?Ǐ8>ٱj-u^mR23DXv|$J q36 #Sx_D $)W6a_]b~A|AQ]U1j4Ζȯ_acSfkhI6 0ov;ܤC*h4<2cd<X"{9 ^_8$KZecJEp,z-0f6갹жl O$@8fNoD)XL bmmc Eq OOLo~k v.ߺ|3$ȃЯ |^Nw S“ 2h?sǾ}ÕD'll[ˍ'_Aןn/vca3dm)j4'mM@7.g;=Y?[<`D[~55+G܀((puȥ8sʸU6vƻ9awJFnhٕ.4Wo" WƓR/74>!cϦxcD_o"tzLy6n55^;lCшյr7yPҰT ;V28yH 2:RwYvp6}ڡh_ā`X;oaKW:i\n>Kt1|iMXM|Lm0F MvR e $9.Xʾ.GUK="Z P?I;4^n{BoDǾHnb X#9.}װxh`Al2#Hc% C1,3,]Wg-$&voE("cy~MWO-63V,A~#da|{2~4G@j >~xE519hb1"C5^fWo1/.x"G&CR OyOLIɓ{^Aa d~@e,dY;â ⡰p~pw&b˅DꅑN\7$'A!4>in={28b/K&a]ܘƺ{qgm-g!oOo]AVnƥ:xtȻ" ~ڏ}azDZ*?hD]_ڵ[o]^Cpl]m3!vq]Î3ǜ-m؀#?lH`#TȭY]6C5 y T$މ zSUR…["` 7P~DE'6 kMZYnԯ(~)??㦜9!Ƿs˘42 .ƼAl-c.5$'p_nqcsA;nugĖ;(|"CϘA  (1! Ą  JLAպR!LѠDb2-i+[𯃶'fydž@"mٹY?AC5/GJ ]ݫxf'V)JI95D!{N}Nt㒇Ʒjˠ*ÿ8!zWNρC3) R?Μ ?TKaeb JeFਖ਼3>L\'>ۏ̖sŹV:}pZ9.,zKl.m +9]@EW R4(q_XePl3,\0Cj%Mjj8R-ǝrb,Y[k aA Ec>mh'>4կg<s'&I)_jYY(Z4f'$ٜ|X0) Ŷ6~Ml?UEbp5ƆO6KAwL~X`/bBO!WӘ׭pśoVgѡ)ڔ tjlNV3ldFwז\hNUbz(oVºO 9g-VY##'ThAR%,/EP`L\ٞS"u= e|"(7al]SPb\U*ɓh6kW-GhC&g }f}_N_M>EgˡZ E++cWk4Du+U*h:tnQe!e8tNMSkyE#F!)kݙ?r 3I$Gtg!Ub}J~ߨdH͂?!jWFpymŞ"kM3|fecL +{9&̘ifmv9g11: >|#hD6KP4,m^o1YȽ3ٺQc1am`1^LJ+k'_4d,z Ol'6;sJ,y'N㆗Em7%&APbFu/Ҝ>n36:5b3zAf-錶h=۶"":&sZ9sV=oixf蠫P_<<k].87|jc<6okklޫ jm9P͛ HѬ~ݮ Mԣс!f0 ~wrm1}F_Ą&~v3"$fm7!];mSv=q;.,ikmӾzLzGӠ#lL7 a\/$r]|m6'ދcqYQa>{{lcN3gAVpXr6r 7/(QYg'؜<i)zh??<2U(#,qܯiGH{-G!>$Ϣ/OOOO=ЂMF. AۥC'V̪\A z%}r-A85Mn m  Ą    (1! Ą  JL  (1!   JL Ą    (1! Ą  JL  (1hUPk]fLyyŕlmeqi+QXVwW]kmj%+v(նGLa4AWby$^u?1?fj>m4l"|RP0[Lg(ߜZjѶiԎ*JҞ-?>(5 ذI& Sʯ?P/.χoh(Թo!7o;$>l O H&]pUD:;VA2 Rngo8ơ/5pu>Bbb!\ ⥨⁓[_+{SGW%?@#kuP]~>2]>!!X3z| r]Kƾ͹~7* hw0ôk) uxkaCLl8q& mx*W]M_$FOf-S-ƙ͕Xp1v`ŊO-Ε]uQ՘y7N>2[Y+zMI'GP`cX| AطÇ%pehe} +C%J\9Q\1}X&J'չ(ջY'pxafu[Uz V\OoZ[SqC[ Qz|> b9G[tBFF xҸ0~:-|ʦs9W0>dc&NmuaY_6F/6:˼[f_ON\숂W&׶s1<0{޻v0$3ZYkǦ/ϵ4g[[e94rJvXDžr<"gu>Ͽg^3.׍ 7.p611<qIj<Ƚ\Ii/y|^zs22ұeKl:B]Pf kƨi"P[Vdyo7d+Ub|z}cIꕚP匮;*r{R8L~0O0yըE-H.GV_ɂ h)tCi1M6i1K{uix0#$R[UJvf^smY8[Z=.:GZUuofeXh)бq|ۗMk0mKΗcZt "c:d>JSsJP)Ώ'K>;b=}釯mk]W~mDďǫ sZʢx(=P)#kc6Lb_+fux|^&Sµc 6\MIc[՚zr6S$EoC4X}1d~Ԉƅ':+߯b;6U%xX- k?6SrjdFl1jKW*cq4/O;[ bY|wd/@Osa7cc`&+vlrs?4Ӹuim\H)p-}G Qc=&*$&pC ePgTܷ~g?:HA+g=x7mh>~`l9Y W6a_cJMQ h&4Fs_|727n# `1%`IvOnLH[EaLCF'-x}"lOOL5}?l u۱;ܘI*v(b2>q mqv0kSQ]݇!qo|)?>3gAJ~SlYInT|%_dC5^@xm}rSb?B(BSaMAiſ=IgZS/_N|2YG#x<춋1N$^rˉt{9Z ب'-ε[)̸0QڌOyv>ҊA[OAeX|hlwO$F3>ϩ%ƅ`oM[JL~\b#D.řK W%E*s0y e.&(nh.U#JdWcR f&6pٴumotؐ=*Ujh(4^ن7 iݵ<$ Өf|C吺hۨvm{WaUN9kVjn_DG9OL8^h:Uh~/n@(;qN(Z7lۊ4 !cʳp/5xu<{ŲZS,9Xr^żY/ᄃ1D0SѱQp~lyruf\'rj|$M`01|eK?fkyN5fǦ3K8~E!|kB3& <ï'p0cGbjش:qSA6eKe xJ%|G[gށh(]J'K4?J_Ơ b6yˑHwK+n`6ފPDޡ P[l0>pgxXnF $8Fܡg/HKɓ{B‘2~Wd2I&7D)ƶ{ߗ{׹㾯y+xX9s.:2/.x߇lʃ0,tWF#Tȥ2独lSDkĺ -0U֑DX'Os3cu<0e"/ Ƿg/G31=q05 za,LekSV`6Q$&Z27ΝAPh 녁bhۘ1;<&La ~ڹsR''xw-#Ό Stĩr1bGqgLXzq~y#c4Hüԡvե]0O)?pq}`Ls\>Nc8h?4(Z`ێJM;D;#ӆĤUB Wtа^|~~3dv&܃t5.ކx}N 9pvcWa5"~]L<#y/๡"Mg4W^lA AAm)1gL h3PbBA%&AAAAI[#m|DsiJ4#m [X0_*[k2Sw}tbZϬԲ?nMi{zGB6}ŕZԕbc|} 1__:,)1[TiϡD{s+#gNJb;%e;SLm,SK syp!_}Mj=<Zv.g%Eg6ZTluT6:EXCgƢLS Gyd2?6BNsDI!>ݐO8-qC/\wɍv7?`ѴC)\FR%L9-6!9) wb+J#r/ #Urf]QQ?7g[7lPaf'ơ7"y;ꋊf}G AxfvfhwMYId-1>QGDi-+ 33 vԶ@I;'s°]gF{3q4{.2wuPhDc:TIض|9Wm`m'7Xx_{U7 9d𮍎#}epUGtp&Vm7zb-Gs1quXؕ2~Oh/~i$s$,b|m/Gc1'\+ޝ`wC](y <2JD*$o~Zk}~ݼbKis?bk1ڽsڡڒ_QRo^-܏_}z2]}<_g,x}^uzV^@H<~>e._gǂ}oydۧ^?9^-U-&.lv!ꏬ/Yioc_ڢ!l?Te(+5u6SY&VzFZѺS录kGboɊY9ڦk{;/K<} W!y[rR_jwRE6>}Zŷe͂ljMFjo?V2RX=ֈm8ڧZw?ncIz6ˬJk2Slִ.vM~H9yٞ8gcĚo>O/hffOOɴ\Ikg9RcE7VaY^}~l6Ի&d~e`пb:vcN0Le6U_}a7? ʓ1k4ăXĀcź 8l>έdq/1?+1Ssa;y@Oc^'cb$c`#L7dp^sb9R5ig9_%: ٰ5Ζȯ_,ގ "4Q!P}TⓍ P+i|>`і-c*\ 8mn͟|ak~)_(fcgֱ/İtf!^i02yɗg8tcWo?CW';[ΑG÷mo%c(9ޠw;rW1?C^;/5׈Q?+M0^kekƍ鮣u:}i#g2w1Z:X7|2~ÞP`gmLnˋ+:4W][Tp̲:Hڿ+!u$$WԧNvsńIVJwڍྲ=v|^Z{ZT{1 !pzBN/sF8bQl Hzah.9 Mw Ƭ“ @-ɂfʀF0Ĺu!_>P=DQ:5E-M 2&Ԛт܄(fM]ZRTD[„Քh6vaCL$vK"&b'- [.E_CHL/ Gf;w\bRSđ#Q$7zE?u^m|S)mE춨K")Ǻ:Ef (aD͊s#Cɘ]R%QZ>-2nCلW"Z/b4|!1c76U7ASYg'U_Aүb8#\׽qH:꜋a}m˰s[m'?VNp|q 405)`BD8^kUZ*aҜ+КaтpcҦx4MFJID:2Z76cBmy 1hJxxyZρԼmʨH6sֶ)5:`XG|8; G0i@oķ0ȴ:a>Z@z7v>.6rZ#F;Aܖ6w|NHlB|@ďND:ۋ˷I!v%UfMnnXȁ6Ixhyu:ɼ{⯯`Hs2vuI$'t,+laZ/ƞ> oQ9 Ѽ5fy3^^ ?o>cD< KLb~lr?CN:nXDtD4x?Xop8;-*K ꈌ)#<:<9ЦPA= IzC2JZ9;[ȯămG84=-&6.܃xurpB{ӑh+c]hъ2{ktpZ*K8nn՜`~YD҅{@cM! w  h3PbBA%&AAAAI[m?q}itZ#Zȭң! ~[cgo8ơ/5pu>Bbb,!qqf堸o9]KQw o^!7o;$>{8]]3ދR+̚3y%|]2(X;{޻v0$6oc{Q~'&{N7G _Rc=2%ceXv=|BB ,Ӯ N"'7W2EhIjpR˳=mj yX!)}QYhAA! @' w%&AAPbBAA AAAAPbBA%&AAAA AA%&AAPbBAA AA[:܎BP[{KAS~$&]]ѹ wJGoKUAAmJL Ą    (1! Ą  JL  ZKrA6t:\znnnԩr9:t (1!QSSK.'Ywww:ɶ+Wয়~Bee%2Cq3'oݺuC׮]!7w[<<<ϟŋ@!6 =cBmj'V%y]'.# ƍoCθ _>}A#8M6upwMv]F JLh7U#"99yyyKP/ ?_[Guɧn=ś?%U7mkϞ=wQ%&A8[/ϩ;(? /c\YO^cٿΑqy 7)_^ )[9_6qѶ_D%(Ǐٳl2L6 e\ fe;vG@w5KpWiLVx/497U5H CYX :Қc <+CֺpGƘr;{dzz3mgt3u KRy@<x6v?d>]ǫU =9aVk#'}RAᒓ .9= ^3dWߕ݇,^}~>]_;4XY@,ÌFb\KPzgJ,v#$9rA#Hxm! BBU@VɅ1ʩ(IATʰ E\! !C`ʊ.Ю$j?쾯j4~_~z'C×g}ηYe}0l>ym[2x+`QGA/x}rSyb {L F)FoU˗Ê+`ڴicʹG-{᪅EFWo?遻)'HRikHm+\pU/׬ 9MSDYA/Z7@Ōt _s(ĤDHV\g6«n7o_jZXreЙ{z7mw? ͡g?=FP/>5EÌ1=K;}zV x<,zZp766—^G[eMΝz޻rgG~^akk4Ucrr9v3Y2Bj/Ej& ?ɷ>]e04[of&U;q:+!$ՁR\˺Jל9sX ܽ0ܸ<ŗ^0/?_|IIX7e 1UuHߤIBonnիWDeZ'|© 1:t. xb袋Y|DGLR+MxN`d`d 555pg3AqЦT@gg' c`d--->P̘1'+ s#GܹsY A%={ʰo2uTԲg}gyUg1)a00 MXkD%PS;HԋAő(SSd00 +Pq%mmm`0ƵpY.f0 1! E yiϲz5!p/(&rS&ж+}3ukwlʊ CP slC\e6\ Aq"C#XN6zg _m"*VfI&)T݃ !qԭQ,d<~نʩt]iG١0'U$Rouw1YD<퍓{2am@߹\Η:C}.L4oDc" :ӫT00BLQ^FLІ`0 Fz("1%r<&wɀ$HJR+ '&uÍ 33p2ѹ,aY*l: i{`iRصM3gIk^P3it$*UlB9Jͤ:]-("⑒"'%b[I}WNP(ūx{P[;L&"1a0 P{OFQ_S@s>{=&%~.q`0ġX])AHlJ\._\sqYՖTB HtԸٿ? n.eMKrO 0m4hjjbv~O㎭t9>=E,Cjjm̫ 4-VE"KK<!&{7N=m3We#%,EFY1Ǐî]رc0uThkk C.ɦ~3w{ Iԉ>>}:̘1#qL+ SmN :iZ_WjL{Οzp`X#& ' 3?: jYYL}3glq2Գh68WeݟC]Ą0@?ݻ8 E477CccON͛a0lM<[[$HL1kan)W$m? J-+nZhi=dֆ¬/b4V=TVBAĖ-Sbگ뾎ZjWs/. _j9ٹs$T"U.&Jq,5 _9%$[7nt1TxOR(&Di+u.Vux.bҒ#&bl%UaR1%qq=l޼Y\R̜93m]tt!x+rc 2v# JfRzH6ŞZGRQ\ |b ,AG4$>xarJGs zL ٳǏ7aqmdb9b`T OCn=]:XrlHlk\2Axv)pu̡F2b;M<{.vb\;.O'% ڙ@{鷾 ] ݻw+oݺZ4d8w\?-Oc̈́DŽ`h@m}".X1v?)#{p5*չ쮒O7/n؀5Lӵ89t$$-] clQt{씻wg-ǎ1t@WR_()O*ٳTEZ3PwJƈq\04ydWg7:9SH)Kι6FG!N`tt:gPuʧl ĝ`1!YIu5*CرHXFcƟ D=$r۷OVFJt@ySR'aKbLƚ9SPb(2W,a#w{L)ubRQjeTZ5=eDvi))2\?ILbODq BfY;vL uZB{{liiϕ HNEl8@=2EL`[!`֬YÇzLǏg Ȝ"xxJPW]ZϵUo9Zv&JlLSS2W^:u侨)ia;KͼJek;my{UILl]bb3U~5>\JDžʠTf)1d1q1kW1 ʕ_{2 60t:>.$@/yn[l2C)0ɫtڭ0A{ܬ ۺgԸ1II2Jےo{螫]l0tD)Rn3Цݢ;OE [( WM@_LY4 ljL)صRAizx`MLzCѳ-sXO*mstڶWUMLنNb_vyXπij 뇒izv2QnB}hRNn1Qf:zn`kieIC 6-To!.&ն$ ~EۛVGu 57Ժ /ĕ _ L$LD:$r-b%=t:]=tILL&._ $ŔT Ւ>iFؙ5&;k: S'5ZWJ4IgbDY08*q5}ێUH+7Ρ'\[٨IKZqMLt\P؁I{ G} 6fU7uPiv]=l[)K.\K8uHn4]0!aҠmg>o6c0db248XhI( 8IKKK45`0)Zv_FʱLcMMI)gete%Vlv A[[MPlۺ--C'j:ZeϕִƄ0lXݖI!E&T=T^BӁ1c$P"(N$_c36A>pD {q=Vtr %ɘzR2jdMH%&wIcOG9幓dtOcʬ* `0 F&IE`0 #sӆmTtR03bQNL5>u¬ }ItӨ~c`q iq̉ʤMZ҆M}.ÀqL][&IR2t쐺I(I!fSZmJTj`i,L[ySJ^l|ERL%&m:6,$L*eI'nLؙUyt#e\cr 6XN@$5Vݨ* rB!&ʹ6 aIQY,P 4ɈȐ1]6d&2&P!a:$X4j)ȕ:Lin ЖD 1mou<bbJڔʴ k@5&F4+=$ca3Xa3YwPGLɂ1K3cf:ʍ0rm[(-.zz dHj&^S vܧ$K1ʥW@v@:΢N{v Fq=X㡠.~ag5e{c\2`ǐk(Id7Y>xNDMЙMSGdRp=;IHK)o⍁7 MٙA<Զaqq█>ʆG,RLxpBƈdBfz+S[i myMCMV)06-#&D]\HEg-I 8JLr#KH[.d:QceA 0kW6IENDB`DisplayCAL-3.5.0.0/theme/DisplayCAL-main_window-shadow-GNOME.png0000644000076500000000000042140413242301274023675 0ustar devwheel00000000000000PNG  IHDRL'$ǭtEXtSoftwareAdobe ImageReadyqe<"IDATx`՝ofz-mm1Ӌ)&@!!. )‘H Mp7mlݒeIV[mJZɖ |dmM* ZRgRR Jl~1!"""""""1H& C(S؎ҁq(pJp&q>""""""":.^w&6j`"n6Yj'3 BNVWl]la ѱO~(P۸o/@Q3vbvuCy3>Qۺ]Fd(iS@B&B:XvY]#5H KvޟipvOFGAG! """"""yWC҅'] N:t,9 C04!"""""":v5kI~[h/89t&4趽""""""#KBvZ7}qr8δ$m&IgA!""""""#Oq[HGFCI&I&] YhQIHDDDDDDDOgJR'UړQ]0JXN{u6(IM ? =҅, M:d;'+!ɡ'=&""""""հ$~jhfLtJGISgtt04!"""""":t6,(0ɤMGctTear(&] K:Uw‘-鶙ihi L:\3a'SODDDDDDDG^j5I~&%m-JdjN':kjhQX"vqGzڗtjoێ*K4Et7p *d8]GGas:Iw~ѡQy%}DDIb.,qT7vHGaI[1`@il6WG4*رc;vC{*l$S Ag TdR fXb{5KGm6H}ըeш7,ӛ"HZ*NںdIG2 L:3N{]oĄϛN‘(id%ݾїQ`FpRUUù /^% i/4IÒ3#C>iM KTT7R_9ADDDDDDW@[dG;v흉8u$!81LR((=/&"(?DDDDDDDdsMB}صyXP^p;,S eZ*KMl%mNvYQZWd CK@ Jb9CbprX+M2 Lڛ7qKZ-vͣs BD0o%vxnѩ>#""""""Sv݃$]I:J*N:[a4©; OUm{& }؃u 8W!SynsK*j (φ ZzOo7`ߞػo1hK! {^Y$"":AXSzI2m͒ 9NHӮp>I:PpNptOHB▰ 1oAF5G~b츱3%Q֭]]vo)Uգ1jG~irҖ2f"쁇 C~cCzw%m@rcی¤uelm#JqU F[u(hX!zxfs `37Nx{F,_EG=""#'4eb?ޒǍ$aI}}).~A\/o,쮆&j MpmW5}>\(h*Ѩty=q$ّ8PBCY#ctQyÿDDDGKBI,SnSvӞLp%&uM8W6(q@ 39}ݭ X| ӧ {,g6#n}}=WVu{{DDDGLQL],"k]۰z[w e&rUg`Bڏn8$^\0'af34!"":FdtuZL’0i)h/( J$ةU>Ca8x{1 1ܘ˹3ʊ7wv9sl~!(NG X3I8wl< q!ftݘ  4!`T(lNf-E;CsXADg md{AH_ G!+_X69^x*kV: ys+a|7ac+= .H/эVVn ԩ8k#ʨYi'#"":Z &ja5NAnm=#T ˿; YXꛌP !)B-ڠ1fH{E!`rDǏDَBNCŶ7—u?93}ȱG\հA?'S,/G^37_^% t*""IJ$]q:Ix3^sPdw@ V~{/Յa?_1#F=Nj= nyOn6ܹ']1=bD>=Gc|,}uw`m={>R5ʆm#p < _)玂~|۶*eqoOd8=0!"": MR0L9۹ԤGL N=[<ƻhHu̙[U-[L8!~_o^k#"":rI/!VSӌV*lnaʲx筏!oOsa%1*X[mz 1fLbEBvT!X[ňq҉xb4F8(;Vby!I݌H6B8{jr|y"-ً+gMwlm#""":jFhvC!I[%“v0i=(J(8ѝ@l 螃YBشScɃn FvMMk椓Nl+B|MK}Og#"":jDSkGE)S p8_{/9θ&ǫzoIu E^#4書ґ@Le*F&$G-ތG 1ex(9jv5UVTH=1zT>qlFo,p9ED ]|zk%朆<{Z1|?GMDDtO5ڮ*ICf]bP+LÓt&6$Hjfu陇.sZ?۵MKZoekW_[[.\uMMFeGDDtD|zc3@v~mvwwcz~x=_B9'`v_ jE}(*r C[Qa>Xzo Lִh^+6 7uBn¥p@:|5#u)Qr{ X aycO;joĈ0Iё$2ԢG6؅( 5V,VT $?*5ch2 (?W!ſՄQ{ B k3l+ )Z'zr & Q <;np< "[@woFeQas |w-MX6o%r6'U`cUMj/6نF'C"~9>Po7ECصt]r)3s[C%~QEzXUDDDG<0i7c ҟn!]ԁ[ńRbKsk3?Ef?n R/x; X{=z ?//QUGDDt(6Q1k$I2"_}5ƺBwn9h D{\E0|oW5z>cl|E9]⁊>`B(*צ" 9ETdk 1"oMFQxgQuuH#!˪1(3q!|h k:(ȶ' !d;' Yv>gu ]S"O\4 Z#V#q~aC2 Vy0m̒c6n /;C]=';/M,`2ޛ._A%%hU466,oq:Z$2cCv~6!qyj,xc01$%a[zfB(Ff ˆ MXishO Gn8*)+ EH?Ƌ8_08dt;$]Q.y-x,Bw8k$uӀbwqӏARx\v`aȃ!dK(kjjBcS#^dee0!|M57:dE *P\dس!4o hSmC"""~hw] 92쒓nV1euI 'q9ɋ3鞢*kKT* `qz{DDD߷(| !U7> """""""I3pL{y<ץP*L:II"""""""jKJf!<غᘄL Ӊ̠[ƅuuG?pY """""">wXٺq]%DDDDDDD!0!vYQW%ß- e`_Dh l;Q5nw: EQG =gKDDDDDD7۱SH mo8j`uA?D86Ñq; ޲߄}~ ~Iǧhmk}ݥ,!n>XwGƟo=>_?AŧWC8q-ߓCDDDDD=۱s W@Tj/!ޅߋ㢢ջ|~DȲ$nm6(Wb{ѮD0fѓ1_bڐv=),>Unף#uTZ#d焒O{}ƿF^r9sknnl_cU/~`xM_ZEҀ=jUsnwlDc4*0}+zQH9V?}?mfrǩ}&6 ~gW\\h6jC1絻;*B ۱|rR瀩w[;6ϫ[t;@4n/1eB]8~h/P= !uK8,b׿KK_>9blĪOW w~3V~X)`?Wq[V?/wF ޝal~M<&φ&M7Oy@xg6Sg܍'EDUxUQO3ow9C*s5J+XUn6b]گ;؂ ylMNmoksq K81AQzǡ4a~/+z;<6M;N.6n$ *vC amxskNRiTz1xRlxyO7c/ww yg|TC$ )ʁ"""""b`ҽ47p<^OCQx`_w??lEV&"gv_1JLHR濧X" ǏD*vcٗ_=އ9Nd"h\(j\ KU,|xҎSwj*//3`%{oAv+{\y W~q=L928G8?]ॿE]@gw[[_1xxJ'V:v>y0ж){~bBq΅(k+gADDDDDL|ce..1mjV><751éÞ.P~OrعuBSw;v׷r =ZB96'ex\ #{=1ȯ N=\ղN~՞>G )>3#ᤌonp n]~fȱ.9zpT}BO??=)B)؍tg1ޫcU e E_&UOaڸu?q1YO7 $Tca`єf{Bu(\[5p믟O?=M:3.k>M (#wէ`DY>n6MI<9]l]n}0~%;3c?ǜ}"#Ai>=$a>HڀyO</ m]/ ann>.L9޳[wuu+>ZT)W"M>s}vF.G،w_k;PѬt\GRÊh-eR6ɇ} HDn%h/#rZv6V7DDDDDpf`vy X7?܏?Rf5 P݇VVB B;3{ч1Yy-ܾ8q XV E\+/ZL5`޿6"([wFpY`jT U)VU5 ^n~ vϙ;ϚmAn߃9#qAPCQgRL2Lֱ ?H\M!ፈX9FQ}BN? w^Gǜ9sZ5뿏o`n'.Xi76 /Eը>:~G;#*GބU/tDDDDD?Jb |u6f\xg=]ι ?4`aMڿ =/MBaO1hW p$ '\s;Ѽw=%!XX?1i'AWbK۱jt|t#\;Wcc/}bsbn]t]^p5֞YEq|%^xf.#`\(r'uR[Vuq6J+`35sK/ FJpo~)o3}Ec>ߘGO$*_':WE?;fӿDrc9eQn56qA65DLUt.F%NvV |DDDDDD_E LBY9 Ep>(sCgvE:'"""""*^ʱKf("""""""Gm O}ƳODDDDDDDmZt6+LR00!"""""""J(""""""" LRYr_Oʇԣ^ߠ->m ‚vG"ūP'6X[E1?ux}u C[D7 S !ۜ) :ΨR8ŚسmUQPU%U%ܴ񘈈 +Hz9kB{ )BxUJPb[0I{." D6I[NLj {kz# dNDǪ8DnGۣe|/}٣%YgŚG4+3-^: Nr<,+,Q|*XlXBSԃ& #1y@sv+c1Xrzjd&TT&%7ak~?u1"""""" .9R&+uVLGJĦ-SmUPm"^6섢 jd뚭XTKl |o G$1m(ߦ1O:X1'atq>jKcd3⃾ʲOwT`MPAP JRJqJo$օFM$uA$zb′`W֭$`PY6YKTcֺPrʴ()ADO AIhT!+WR۬*Io5q`1MhM( fEM8_9@(DDDDDDDԮl 9~jNbሐN-}aIE(D20&k @h<]6}ˌaBn8Bo+Ge >a%y%qp%׌qjnj?`{m-AI7odDM2K#$CH8v1͠)]qŬ0oK O ((ޝ BKȩ1ϐ%U[/Upjΰ#pf2sĺl8Ѐ6_h%!+(&%5U`<}LIQ L$ GbBmÓEVj juDZy9О -f bo<"0'1sWj1룽8Sx%gJ{Vjr}iFؾsUM&2+W 08&di+GR-1``![NBec=?6L"}wڊ5E81'odJx%ns)D 'GOjD$uh65dw-ڄH?apTX|*jS8N awt+LĔCh 2DHn+5@wőDi̊c *hU6. #q䓵qKbv>ݻ ,_Uv ׎(-Gk%Vo)WWmqJ$'l%$vn8U0Q8zX91Iژ+N yݺ}x/fXm aɢUP\vx1UmVeI˜8scJ?1q2XX$bz>x{|v35FI0$&ͤ^p;z-qpXBL$Vх'̈ I쾈Ș>p:#jm9:R/_:a%jQU X>lT.;{ha:XmuSm/.ߌTaHrDNKTkаǣ![ZDDDDDD_DOVXVHTi2}Ăp\8{=l#lYqxxX QlS!90c(vU%rJX-!ްm.O$b%7rK7ڱFB 7CCڏ Ow,T]#vdA$(==$E+[HP8}ly?04!""""":?'VؑZI NĔ0$O*Ė[Su`jO5BpM#. ;^KbمOKckͪEydE Do#q|xyF $S2ހfPtU%88v3ö'\ƽSqY1g2\y^h6 !E~iPdQ\Fڹ; M[? 50~69mFFPU6>lm;Vilm7QZv}5Rq.{1|Q=Q&&DDDDDDs`"%"I]q$!LI#̆#"y1aF1%'2.[|׈/zet=Τʒp/,nۯ'TdQZXUIm@3+vaݎV@U1UVI@b JT%)>P}|9#FXo')90άNU{n"S0l`/6q\*5ڎg̅`s @T(!>598셷Tj?[=lI}n9L?9a vLŮOcF.ǹlBnV]}C4r26ǁ(UE Z"ܠDH JXPB9GxPe̓]{l֥:¨{ڼbTOm\F+h}{{#^[A y`N$b̀X 'L,Pp|m ~oY13YѨ,U, AHi_H t7El/{n^;jW_vܺq+y?X\6NQLJ KtXg,m"IQݒC8 Q+0hy`h0nh9nf`ga?J)%DDDDDDq`2%I#t4k=bK7);d"n:|OBVo@ڥ{W̐$h/+P^Y~c .uĺߨɳg$4H^O7K]sX\0yQ9qٓn`o\=!@pGC}=# @-1i#h?4%X?~$rEe! w7&9\ѻL?oT\r$K!8TΤ;o}ѣyΝK~h!BvL#{Tbs BfhBDDDDDt&b\]q⃺"eXבA]Nók#pzlP!: !TA /pѪš-^ L*՚+=y~Sްc`KP1KP5}NԪ(I.8+\bNUswgcKCc@2'{߄)Ε +W;ܯ]5 yڑ’g_zO Q#D;cP:=OhF\w9֭߄1G3쇙}R:IT*p B毰%a`NP9@@LR N~#tKto zE{4I$DeD.XB@{P'cLdфX ,kDE_x=[m?mm}@ΨvX*Z!`t" A`3?./ƩbeL[fɉ ,99>GoQ2(ە:=s@`\_[Z*-tɉ/UDUb j4 cfI;`j|0VJw7nl KT⦟+EK c,97Wc1{cio5/ҳnh_<,~ L,gN۶8% AI5(0Nv˂?W߁-!0I E6$tI,Ÿ]8(TKO bTQ`C$OAGPL=cB67hVU1EcV$ԄH1Ó );'be ;w+nLW_zv%^di%xc877+Οz[AǸMڏ% ]a΃qLpKsFO̺[k 1c?W_| BVIJJK1#w4foW;!xɁ9v~ۯÜVڇ3Fǟd=}#n)`l c1(Mv4A =i\}x+{6^ÒggODw4"x)-v!""""":N&I3 yDL莓PQ[ q 8%R@tQ*lv(Y*=C ivF>މq=U8%c,8ڲN"6U(f!Gr:k0ׄr”mצNbuyO.&rBVcG"rPUə6BUBE9㴉֫AP]hD(yex}~CKx|K?x0WmVĂ9ɽFXW3?azٱk/YX1ҏb}ұ{=m9glF߃ş5ƌ} i#`cmvflw?H!i""""""M{hgUhl1S`eўx| ޏŏۮ`<v?nԐ&WۚU(szw玌?ַQޤS9xg;I۷F9Du8i5z(u>?OϿ->}{Tb-( g`BDDDDDtbe)}!a04U%5^C/*nJb=P@JȒQ᮶p*D}8//=B j JI[ぽO_TۏlU)jkAc<NʤJ+4/юu9.ms41Cir[9 )_ރa#:ɿ_)Q&Sx;^+N⿬4m5F7r]GCxOƗb Y }Q}W{,ͱL(fɸㅷWl HSy8/ 1TB># yg,c|U4U_fL鋙+ hONK[Dm98x= J@{o0]gWg/ap+L$v_HPBq`Gpz!cSܸUDv'DO~x1sjs lxs/Z,0]̰ilE ۮ< 4A2uZA#ew¢Ì)0D=6Qe2v.9cvk:SGsqCC~Fxw=&0ޮϞsBtL\p… .\prL.Gѫ0-}b!H(I.ABU 1K@a^ *" xYM"}e6U>`7B\abW/7+G(XOD>YL DDCK J3PЫ}6Z)?q5ed<! U0waQmäv<|>j0\4v8,]'_[r jf` %oV߳߬l1;һ[D}NM`b F^M2bG$j {^`9 k$Veƒoj3)gޞ P2x&vB(O/@j5[onwŀ^U()ŁXe D$l/q*B@@r$X]MbƘָn(7!hH$+j ԉ)P6g"' AmvD@$j$zwQbp$'1XjWy=Q=j( o&&m<ΕzݤB#8JmGw~W1 7D_vڇg-3t-O^wTVYrAۧ#c595)F- olUc1_Qػ[!攙Kl߹XtFK1~؃1ߺJciWVSwO> s>j``jUK`8Y{=>HDDDDDDc`r3zЬ2L#/5m,0yfUIZSLNekwA-U+I)"Q%"VnZ{5 nQݏj3G#f`(Q+( ɡIR)-B`T?Vպ5FKeIMBGS w206Xqʛ^1}Ba]f\* Vp5'U=][xl^>h2hn$,U;jOoA s!eFOg|K3П7Ebx`O}y5fѪC5]EO}݉uh3W9m[?!sV`^EB :s,US3 ߁I/@M%s,\!a5u[=xpDy{pK4TXGD( sBDE&1f]^ aIR$ "P#ɑWŸR#% x17~m!gVrwtH)+;hho_ޝT^D-'2lPhνϑD[᫇O<=}Zf w9౉)8i7hƷ%8sqSr}=_ԛSV%a eF8xsɹJ %P9m^y3yfPUhp7)k*}49DDDDDDu`/Inn^WЯF`Z(,1m\I)K7kvozqC0 ՘!ǯmc[v]q l&F#4IU:IQƟExzow?+Scr1B}4ᙥEmU6laT]D; +&۠,~s}{!}e 3Ŵ椱̰??,U 1JMMGPw`΂pYp-ӌb΂eT‚GJZw{WLj |n&%f;Ť]bzn J[*EFAZQoL]|#-^Vk/siU;q' OW/~m_ݿaq E ԁ9](`-nm&aƵ^]5غ\7QDzwUw1{U85y%M`9Zw$6 tT7ԯ:8zŴG@@ۉg<೨?gd/A⮻ںGֿVZh]-⨢8A!,e! $dgo>'  yu}sw}zFEe5 {/OI>-/>vSHYK%zJ}F}A\?N]%;J|%F˒J6;lr9.۷xH1nzT*g/2ݚ&e񔞙Gn=#!J0^ꪣV"Suإ &zX}V&r_P"l|bVm;%{*`K訥5cwLJj*'?.>J8._A'AzLR/XUtvMOX|(dc啔&eXp:$!nxb`_ +?z D-p8cŶ=lǽ ÔqS;֯=(|'//]7>0<<Aip3IWϛ?|fi(j]lLL!B!x$K AR/lj ;u)wJґ57nڎ[g;]D1]&()BI0.y;omX-(75L:UgB_u\HQ.h<0QxjgV&Z<Sfkp>y;jUP*_uJy͔FT"bNsxMN:"("ID E1+S#rtk;"}Vc<1qUԭγ{^;_js1YJpWoz4#łF.ꤧు:VO>oZ=^_9~~hbB!B9(|M K 7N4ZR24&]a-%Vj.(*}XlQD0Ћ]PXUp rǁĈa` %3l ,ڹV bMb1՗bvǍ"D m 5އV-xLVT+GӃZ\zuz#D^G͞}jJ!nv-lWv~='-B!B!' [ &u u~YWf'뚊VubrZpziE\--Z4& $y5e1i ɒ#d/bԴX4FnUHK:": jW-P!B!Bi$-D0 c oJYP<9rY~*eDƥ%$`"/  zQ͢y(YJ(](q.$vBQ,B&UirDx,up=ȨT]!B!j6_ 5LdDŚDqC 4l2J2yR_a'ģg5qKz:aI}Ka~ T!OTbwTqLxF,nFԘ#Ux)Wh1XCB!B9%)31I81XX(&ĒXwʴWe_ u6,Ԫ3GJP. 4jGxLJX Ǡ!q`Y"&J'YB!B!Y01&q~U݋Iɀ,_8;E0Qž(&~sWSנ¦8F6aČd雇ge,b !B!rRiI8a&DgrrҦ &.&1J_& pCH  !Gkv22oC`;!M%Y<AфB!B9y4s 9#9G\PaӺ*f]b-HL8Mt cZ !SSז9WO Sa?U$Dbܹ80p]sf oG5 X/irZB!4YQW֜!ʖJPeĒjynAJ~P>"C$1e1KL8VDDDe:t  g.!INY$F:[c-qeȦ/D1>OJ=aqQ׈ՓP=.rKKN̩r{@sZB!4} %'(BH.("Fl$*ϑ)yby bpb<$uZizpbScL}7(y>描FMѣeغ+ |eIrr˰+筥[F[ٞ K՜&Y˱ҔfN\Bbw,8L=cY:pY3,D%`΅pۄ ׅ<,'<c& 7m_;!?w:BŸ~ J/fGEGKú]\I!BI)j*4į %JW#_;<#hצ}fY"HDӰ XĈg"X614?`b^+TTsbB$wp]d7y> _Y7W/b?V`tUc>3 ù>*}>K9i_܍U2"C(I~Hn{,/ٍ~I9Ɉ.AP OKiG3;h#?oF^R,!BgrG %G!Z\f#@WJ&,~z9pFH8%Y %0Yc8`*@!S,/{ TUxQذ;|P:o_q2m F&;-/W5h̹v,?z'G"Jt@aX FCgO.U?ᾏs#1>L~x/ol:Ӌ:lQ8㌎dCeQxfT>f9fÆ0 yX6QIixlNQ~GVZ̋I0l6T[YE ]F;VĿ6zmk:iǴ>ة/r6z~9~]n'yd;\cv:OryhJ!nuqSN,ql ǣuˆ6H.dd݄^DccpORx6@=qC_?* _+6u L*GFT$kOUg¢o{+l,;!B(jr_rUp/zP?FU@ *0c%aC01wOi%J2MDA‰iF -A8EՉ` E?2b>x?n{z0 ^ޥ#r>و۫`KL@BaVH w79ɇx6S _ ?"R@A/MlܑLh%`O׾1(#//'d"Q uCIS?rp6Bx7xhOmx<ى[(@=\\/ ٷ_kYz̎QWL3%|1[n=dD? JױE`ގ_/V֜axñw:ʩ\mĴ൉^=<,c'hWdᩯ+ ݹM宯X)yq`U UxL7 One][Y"Χw.}p* q >=FZ5ӐwuQNx`glا5"9jywaK𢡊9O~phJޘCG4ƂR@ lu{|r˖l]tşoQmD,碎\d{\wv 6l+|X#p>ީ|Ǫ%2<0-:/?f3qM86lW¬Qx[d!a󢣨2;3=.Ý_g9 K޲ϯ־ܯUNpߌNxj!˔ea" fUכ<\!V>[>,/S#,3^y)+PXKuEq8+Ri/WZ}{N`91.ܵWi*8?ju4MnHY]uqq1X*M㍽Ao+QKY,Sr?ۥ Iu waCsLʆ35[18-~럂n./0̞Hػ69WD]WVZu2C+ t!tNjL#bh,;,jL= g|}`[K0qP"~]qvG)ԦTCcΓo W({)\Bxwm)n ޺ϫr.YYu#4u=;'ZE^ *>-k?ڏ;ή㌌C~[ ؅1c:?[>-@ UB!P0iZCtŨ>RP^rp"M0bɈ9eooʻS^@i@Tɯ~ 9-MG:k{kaޡ5HQ=! W gÿ}/-Bu-ۓ$Vޥ?޺/@ǍOn,_'1; + j6 &X"Y,Al}Ĝ*Y*sfMCM-OwMK7=UWKZDr;Xz |>|Y5"BcLhKp@QV٥5LP&^!m |Zy6G$͇&H)R}1a@<+Gp먖qg+Lb+e Nʣ4,"Mavkrˣ_˵xLCH T.Խ-<&"bv7O}:ֲַ^e(FbH{2ו~;0Ჳp ~0 ̈́n}7h2izi\~~4.y.o/şG/޲;1w} ~thJrhlY-~d}"DaޯƯ&wģ۳P\y!]-{li-[k9{eܓ70o@\-8-W2sqضh3֫A`t15FȾ/z'B! &MHޔw $>5GL< Y*F;44O4Ir.&n2 $ G,9E ,{|8 CsjSr8>3'%\xmXdg H=TJG &uP׼YqC\0VwE2[t: m_U9H#gC)5.V`S^-5TŗLīnޘXday} N)8wXL1w-ssQQGzw9㶉pKZv hSv-Wy/}]M [Υכ9Z6OC.N.ϋ܉xVjQm;*6:?F.k}YCu>p`J#c0 ~WVj1m8IگGZ5Ӡw?ř}~ lb(BU[oF^ 4^0.-Vcp1;! k98,ow.vci}DWwz˳b?8 CըE[6螿ot .J>.Ow|8^Un X'bgTxq#ԯ>wf>x5%B`xT3h) (8~yL\5(vH0 įK&nN ÎC2y5s*F˔pir$[\cabRkDenćϋeغ+׼emI{a_<.~/8_ݫ?S.Q/V>\3U/<10Vg|(.ˑgNi*bת}Xs(3> w<>{o kX.WهL[]"uO [E 30@_F}ۃbCo;Q]tZ\Õ @\^ҍzӼl|1Xt8ck{@=*!_a,lr(~16ﭨM ૷ý1֏*{}N-{pca\?u8.&MB|@\\`\ׂY钟m"7^7J{kb iv &B9}4^Ԗb60g5{4QZFv1KlD;q>C2:Fa c (}e{2وk,_6e5 9Ep5Ǵp]"b'v XкB!B94`"1KljM 1<DxQRD#Q iڶ!S +M&-B40k0MBE.qUԤ cBB!Bi.DdhRgD!k8Lk9L[Zl!'80e_YVީTT)ֈ%V*%B!BHЬ&5KlT1P(%b5Q!uEi1iˊrL[MJ=G FJF_##uYJ LΚV !B!ri6į7[ty@=!z|(E\4,-M8U+MTMn99+ 92 b-hqQ=^H% J%B!B!'fL%gX8B,N Lb5.;q́ad4MB|s ȇS@.[wɡu !B!4dDE, M,2"zcmaͦV@uy6غXpTK) !B!BfL?$SPmjp<  N#Y#+M/.p*Ԅ83O,,TU*%ɺ怯.!B!Bf0qѬKjB$}Z(2eUhbv1tŰí{C3S %у^iBpˋŐʋ5İ.@̌C!B!g*7`]ˤ6[r䪱P&(Dvg;׈&l9@hZ@0W"HBpWO,(XY"oܥ%jOp WZB!B!M &421D[GLͶC;vS傯 MQxkCXP,!B!BZ4- f9H#I81qJK e~l[Cs Ee y"p:#!wv &#_ua1'уDU B!B!"5)K;İ.6T?^ɇ:nɰm;I^^,l|xD0F$1b^ !B!SfLLQ#Z|=ǡ= %MU0s+ <0cDj,B!X?ޙI}htL,YE[Y͹DpCAyWC.( &~C0oBIƾaٓեF Rn7JN*sĢWn>$dL5 !B9;qһW7-(`BH Y-LA*跖1H=U%"UiJ`W蝤ݲDM(KP"P$ N] #RIrOh 66.T@RE},L#B!~Am!@q/oz$M0l5  #5iee<( I^DS=˯1E,M$9V1!$`HDI G!BTI BZ*7 |jrxw۽K,"yNKԄ5!&C0τT&ǛZs!bP?Ϩyu:!B!'cgDf}o%'s3Mb]r%hO|&&xjb0n !B9 r%n[aǦbB!/ۏ?|i$87QZ=$H@&WL'RK]r&DW3zc6VUPe?8Z>UHIu K+,x,}P XRATƬa"8-R6.|?v єJ!l1z>qn &a3B!>;niaopb`HD҆um KG:&PTx6FEWxθk]үG!&"?f,ސED_/,Db|Soe0ҘDLY1e_,9֧-zTŚloM6ݞǞ9;7n! D[JM_FJctH|~XOmij1KL zO'x7w+]q+FR2!BIzVQx܈zO5O)HE!7;:apjDۇ ej]M|~ )&[Ƽ];YdRĨX\qxx}>ߜMh9DaNoI$gO>'m"q#ȫLĐ- a9_Q%(fO}O*ᑯ 3mб>{&Fuj|?Ʈθ00pGvFtKÒgŁ/bH:+ĚE_pŐ؀K?v # ^{v틑3~k큨S"R,Z G a@9aڪ 1΍!B960|~ݻw@D1f\6't"XZGiӤMB$^eTX2G|tJ \u4֧4i>>T2uBƵ4x$&; C0Llm|vH5~K Atqdøbss?׋oG~N<:vV]x'q` xjn{2 7Ke@k_{'.2qi>ZټYg^N}7R?O;?W6gBDN] WѶ+v±Nv=vf# .xשfW~:k[EF/oC1cÕؔ~bB!(% jli"K/JyRT/a pJgu ֥M =:lXס`T!CF8 7^Pr%jh92=0ubtI?,o9Jz0S áVY;X[RݣJ~ !E۬b"0kP׷żNO7y)/܎Qxro]őI))ZB9h%/w-^[=^bb$1qqd5vl񸐾/ ^KvaV"ws;E؏Vo%B W^xj +ˉw+n56A@oE+EF_9ą>/~G4` Ӣˆ'`@K='bub,_wom7T#5Fp2V_SC>bꟺ68wLD+pg%jb#!!wݴG!Y`Uj>6g*>VōQ oY1>_Qa3.eOqs1֧ބÕu8ڡsΰdbŨ*A9}S <ԴƖʧ/Lj.]&b! E$o X*;}Zm_^a^qC.=} *D>۱S_9j5||'.XAǗ$iW1!B'81G2ǃb.V\NʪH;{ m:) n."I@?}7ƘQpxo lY=(*'aP]oM'\>$ /!)q~:j,YpƀxaW'<}:|s_dјXتJ e^WUCH|98Bnk.(O@dQҷ'fA‹-ҍwng.?l}rƃN_O f[v,Z.]""6~,Oxz`<eo@y-ǙԺw)\bu'$u"ZY DzN}=^ zF\V{շrձ?B!U$S3FMl\"d7ׯ &8ztQ#:".in _A]NƑr &M7!?E0 ?OxmX~YcxV]յWER]x4B}.[`<^J-ū~owſ>Z58e&P%Q 0Qr_Q>iȨ]&.izE&) Xh ~]xaln@_f}9EhQ|~~yܦmIiʸ=0 >X""x\nu2R!猃pO-Z es]_yŐ@[W>xj!]1}b`K%C4~g&^3c,šA&bb&x` +zn3:p0׏6:Ā%H>,~uD S(x s#&]PV"@eE%|xE"[ (=z!g%`KjfLD-oA%fbyeo+}iPDCB!45i=yyyش'?\3"Y (S_3"0{ VUF!Bȩ(|Ċur`BNijG!B!46V!B!BH0L!B!B,P0!B!B@B!B!B!B! L!B!B,P0!B!B@B!B!B!B! L!B!B,P0!B!B@B!B!B!B! L!B!B,P0!B!B@B!B!ĂvzÃ}B!B!JY3&B!B!(B!B!X`B!B!b !B!B &B!B!(B!B!X`B!B!b !B!B &B!B!(B!B!X`B!B!b !B!B &B!B!(B!B!X`B!B!b !B!BB!DĊ2 F͋v>؜:O w9[} ձص(%DB 9ml8iF]#::F!vHb'V*++ITbBEV>!:x_RzB>}ݢA헔`HKKS'LI&cǎAbݺuX~:>o<\|vͤcɒ%OYCލELLܭ޽ ci$}~<<3}k)|yBy/r!-⬛K2ڴ}>y;#Q]hXʏd?s*$ QmA+UD! &ԃ}agظxm#G SsS4!DGbzPĒĚkF{"( dĉСC4EH1pb2MG,((4C01%|yXf&fD/+(4/dj]"쑱2?E\vd[񣼜J}j%^^nz$UEvV.!ɠ`BNKL%e7J>¹(/115IbRkW& >Ι.I g px ' o.}[2Wb *geC(&ey9hbFjyx481hvLN۸њw6͟&ϏqO< &f|Zʏ,'- G4jNA&?V6ܘj.y %dBH@{_5lXIWVVƕÇp`츳)36C`C#m|D)<<_FJ bb{ﱂN^&lšS.;୅?G;bʟa 3t@u1-M!rZҵ[w={}u֓'16~t]6j& YQYʣ.vmbrH1cFWL?ユ~;D*4d9raKaegUXΗM߫XΗ]{->YX05xk(xDy[=퇺TW{!8[r:x-;/DxAD|$̟;Ǝ۱_,[^BlX~zr3ns(ni natM~J/+ $q]t7a}O E,/篒n8'u˒|y…! raѰaf@ :r5'NmKɶ8\ ?/gXBqacr&;b//W_pCsnT_TqoXbfOj+eUbvxƑhiQȠ,Z]l˦p5\v W/MXpW= rO}:vΙNĜqP<@ݻHʖ7(?<BL AqK:X٨[EwNʙa/\KgqlXhfRA_zϐce'J|.vNgo`mhQ\@j?>#YY{Ɩ . />+|6z&m\>y>ʕG(ԞSp3򋵲cmҟjX p9.:"#K84AǚCCӱ}< E86M}mQo . =[ … ;Ca#JhP5+9[tnAmS\lXry{=sqLak߈hR}WaSb )sv$]6ô(6kKt}k,l{SjŇ2OAϯZ`BlvV-Zğ7OY"K^"oW3fo.{9{OqXh֯D39f}jO@#LUNh?{2#׮^e?_>:_; /iLouYd` ǭcX:E]NFs2"r'ǘv6t ]WnqϻÉ z.&F#=.c{.#:&.Blm6}lơ3Л7kk6y* ;^ bbop\D <+;r.? {&5,^:B/a^g/W:|7~~{ 0$`/Z=gq ۵Z[_U* C-}@O0Eq"ՊCk1w\xXxHd)ճp`2D@3FalH` f,݆#gq߽k,v**. Y'/e؉S_CE$>j![E? ?ص tEX*^=pQgy?=a,~X$a|l:rpx]^3Vc8W6/2y p)=&h%Sc̭~4bIcLHyXTy37^©}+1ߠ?`\IzW#DF01u\26אFFb |QZuNZm¨X˳/#"h^VE@f7l6m^$ov}{νM~*x7;E'~FSs=b>_\c56̻y՘=n,]fQ\?@&AU;TyH[E۲bɝ}ˆmӸ{^g3GPfu6xRNA k a_]:v@VK~x,W:L1bԞēFDmBm{G>;;-:}&xn$- Ϧ@lSC+EVhڥ#~ŧB :9, Ê: J^ۆDRN]&a⫐~4Wh@gt“T/6F)"q9k$mOc\(JWӿao^7+FtYRIՑuc*z6"7xK+ȒXAʹ{T/w/oAf~ۗ,'K`c|?c > )^7V HĚy1'] Y8SPyWZFmƟ}п^M(o-v*(o7BzH?C*~DͽHh|1L{ ߜʩ G4; Si◫|i+p_\Gʸtya>M7>Xe#Tw=ZSe08C$ m`9E.xeGt<kW*#{hE(EF4 #en"]*<]B$w5I'ϷDAe0bUimcS_CT5L/Z1eN8p1i1}csxĄKMӸ -8~/aljzC[QvޣyRb\\ZzN'誝}r;۩ ԝԚpޣ4=r[X:EP pD2&a^x =lqpa6->qgXbf_?ý!WXQ}`=sewX:J 5GH쭐 4jOx ,~kO/[ɖG#^c`k[Q.mJ*g>F^ A||كOO Ov'4a B1$G#s[lޙ 7ڷVk;~X! f#јu !;*E%'A~>AxgJԝ T:ZZM\Ǯ{ 8(γ>-:\u k8 {;,sF3_8s kf`}1Uc䰱zȔ,Lmw42W VX% ٩_!a|u+x7T0"V3>?]ް@nsqrH!yvQju>!qG,+q0܊c^Y̔{ ڃwtmn+SJ(>c]*>J024À:v䫲-Utg_ ^+6{x/Va]1f'nooG1RٷNlj*5-n p7.5T3 KN /m}hX[sD,G٘}~u"s$ȍkӟ_-*>nrm*"dd@,גKyqЬ:^!x9.jwU6CdF vT&_ί.&wTA_A+-`pDqubM H0!'ѢernOXAzm+V7nM;pvzBp&un~/;8P\WHU9nݵY:mlK+6^d?^#8ݬ !k!֌NO_lGCT&E6bO?dkVBJR Tved!TL K,-HJ:MRaj;ń,[yգC,=,3=q6Tvq"p> 0eAf&"1>oH͠Tul7ϖ4l/dPqv=pJpOekZT:u#&U %&v _[ȐukX}BN50%ZqR2DCV⏼Ĩf=` ͡X﷞ۧ5OY k{&˹׸p9w$))f_,R'C |=r-ر[РYw`.#ǘ9Vu#FfiIevJg%+lze[OL OAEW7Vׄ5ʵ)fmj4 DS: [, ];6 ~,eCq63/ $u,F *Κ$},;ዹAx(PgQ ?/uSQ_m8̝R `㟊ukOtZ)~D#(*_LO"FRE {3Y\&JdEk 5k)80s,V D^JwEax ˩G*UUA8ysx 4|z&ITC=5Y" yغP,aO+KxwtRw~h=4mm]͂8ф44y#G X2R%Ϯ^C#{07t.*?p,O;u󟊣sa}Hv>?5]jTaQ{B BFp&OoK mFoCwU{a~xƮOϘwЮ)&h #B+旴VΨYk4_{ATiq3}HVG ={x X  "B˿bܸ5('V,΍P#\+ maYETx&GCP)bBQl$٪$TC-z0D 6Avv S=/¼W Ax#ڶs,r<<qW&%vUdBr~%\fn%KsJ*;nFHX4%|:=T,cE#^ou'K%9 ;&1bf_cX0xxIE0loL  &DȻ#ژs:wyL$PyϽ~Gkj >_ժhTux1W^Yքĥ_M1~VνV!n=0ph{؍sCh-Jؒ-)5pDXRn 'd&zcN(޽ z }:yq d &:iqI=ӚcLgܹ50Ċbt( GX4ض+{'.e$et9At~ 1z\Yt3nxWkxYiؕ1}ޜ76#L 8t^BNG|BN&6aQ2c0yW`׵{(6/8*? jIX8wc˹n#aXN(Se{ŅqOuh}/.&#_lmDG"N4&G(.C,oȆw/2Uu' ңo^GB$ݬK9kkXykx.-lMv+#\C4,FFa=w ;1ߣ$^+IUil7.ϊ?qfdƎhl!&Y[g1 @f'p \)$)'3s[*UUɪ<r3xc: \%F՘7 웣5 eYHu ?X ~dDm>ɬuLs6Bv%lx~ODG'pn|6|Y>2D,"ǝmors-ѳ* o~\[gw= 6.wAo+ߌG6+ ;2pdlte>]8MYqY1fK` n\G]/~۳r}G㡪 M/yR^kp}7Ϝ,%h۲K[crmkoʔ367'NGseHmPnw 0ϱl9/eŭluTu׃1}\ZۻDԵH6 VX@FbY,;vީ|pg2qr0C| NֽS!WE~B?ζH.Euߪ"tf~~ӥҩoHL*y f8/|<-~6};<uӗcc@^&h?/ʿVu} ͕hEDK:XEb euya>e,G6+ߎ}Q8WNg7́$DF׵eSitLL5<#' ԞēD@fاHg M" 7~KK5jtcvXXZiDicke+6#;+NyZsoլm"9uF, 1xiedb;/C^8潯1zp7RO1J΍[˖khsG|nE6AMl&M߂k.f0,MX9gҮBT5K Kآg8wj~hgڞWSy (C8pBR)7ji=z>wM84j}݂s_ncS)zjylz$sʌevb&̩W^ MhRX`_aĜ2' ǂjr9~J>h2Mѩn(w/vOvn=^矑~vc  )+qKFy%Z[}v^(>N0KQLܱ-7֔&0!$? r4K#;s^HyYwOG,[V02T>F=KRiywwR4kSX9 6+("4|%ͪ-~_éD,qhYOQDfEOE4%x&36?t6^x}+~cgLQZv$^2ItfNo-uQ>gw0"4(DmW~a҃{v.(&5w=E^K5z}|l  >M0'nq}9L>s׬O¹oʼn)MymtDEUNaQ'%FV >, 4QySrh L2KKp#04%!/7_ `bLI@kV.&xn']> 3C'9:?=C 'ac} dˢ;DPݗUnDA(0ov\D ޝ͎;oBw~cWԟΣi8O ,} ĒˤvzNUb@?<ŒF5E8A aB<0I~m=ZwRD~CWA su#oBQQkX}il $O{9$@j㿔+&nZ`{9ф%K?ZjPN4I.݈0jڴD4ab ;V˹lZ"0+q̹jZ"0d3Mé0ah5< Gfq<~K 7DES$4F^抙fN 8¥s>ԟzb|nmB&Wx jJ\R՚%UAkD~Tɔ A^Lmh3!{zSPs 77X#7ijJ.A# "?]qu-\_n(T0(K #Yww MQGkei AAAA9„dY    H0!   Ё    H0!   Ё    H0!   Ё    H0!   Ё    H0!   Ё    H0!   x H )6mF@AAOaBAAA &AAAA:`BAAA &AAAA:`BAAAHR= ;:Xn^h6[*[y    d&lBBgS M% 7h0!   Ё    H0!   Ё    H0!   Ё    H0!   Ё    H0!   Ё    H0!   Ё    H0!   Ё    H0!   Pe!U܎ˁ+o#NAAA,|X9g*&|?y49,%"   Uq6VLa" BaL‰` ʔX #3+8zsoy l4S#(65Ws( xG<~v<*~p )1|xA, xSrdIDNbCJ(ME A⋁hb"A[L7Hb AA n0ADXDs7<(JEXIav+<'…BZǨ&"]߇vbFs f 8v NG%"%=*CX5hN}bKn0Pm)­ J977F CW"[)\/uYX:%PoH'`&%  x\;GZV.E0Żi m/>c Z>S%. B\J& t}~f!?3`cVLSr}O_k^Fsh{$ƿ~"lSTԡ :1_v$L! H=6zփX%G%DYDqWոHlgt9\ LEXmD'eXj C9˿W"܈ R.:2v0Qf#q]hR ١!HP_86N"xi+<AD݄; &)09I!87l]TuCH zQ>ٙ;i<}! i(D< WU֧B9 ~ĕy00(..ZWsR;;c ȒoEX럩>4LAQGx#GsOAav ThnHFLa s@%CbCmU <۽&G?*^u}nApR(2ۼIͤ!hd}mmiAAuXaw_bt^˜V- E~3+Xk3{7@.W@RxBlp+g._W]4sr3!I z›.H;3 5+H*^IuDA$<TJ[Dz8Ž`gС;^:^{Gcd%|BnFk~ɶ æ7p9r {q%W})$LxQ*.JX}rͼ;$'6E(.٢}v'Wq6roE^BAXKbi_THSTBDb|D9JƟiC~#<:i["h;v=|  *gXw>Jn]_Fc}<F6|:/C< *ǵFB uDF lD"HX̩r^ȺJNFwAx뵮ܥ5C73y;.eROɉAijN%}&LP!^/8u*%K!e "" lw€ưaoc=гwl=J  0Q zWL~vmF Pp v5#*2%DHQLpB\swrzژ27'8;@_h1Ƹ78鷷a7GbN-zuc)/ȧ+:%ASiCjVMqf6W|P+CY?g=8/gϤ#$D]fXzm찀yF:w#ލ+ nP7ª, )D061t\5R4S32 ':1v(]|Ud[-̝Ъ1cNxuXto3 , `m|2e4q0@;u Ѹys8i*EW{1{"=:Ч 9Ҿ]O>ΰ#;fU:l>#hB~f بڰDY1 ŌwŹȓƭ1쥲 2& ]tWI՚"M, 7`/ 4W Jfge1"SŅBF_3AX<\o; Ǿ=]xI)AAA>,A=[fc:Rn*^AGhP0%QD!}Ib AAAAJH0y(3S(,'JsWt?;ـfAAAD턦AAAQ+ySr苶AAAA:`BAAA &AAAA:`BAAA &AAAA:`BAAA &AAAA:`BAAA &AAAA:`BAAA &AAAA:`BAAA &AAAA:`BAAAA]JBFF:3P XZZb? QTPRIK0F&065H|l-ynFhV(ADmp/1kc֨ζ,,YY\PzNr X+ ȊtXY<7Z֗ *&@"A!Ăp@R̳(*0& 0|"u  ½n+zFFa˃RAпcK xڂHbxwVw A$=qEQ[zK+nNmr~++t6`/Tp+iunaf+L\^{R xHnmmύ`B<τ`R\\T* ]z  .8kHMK]ܼZ.R /UiAg Q+,QDD5Mx֍cU[YW [Bm? &oEHDDSNDwt2}"=mk֢X~>:t'MwڷZD~eZ%uaD*ɡ!H5of4cLJwdލ,rkGi҅+%_Q)+3qq8>5l-T*MN!"݋H7˼YEH8,MQ^f[O#wX4oyJ͕&UBB...u*|B? -[bb"/I2~wvvnZ`qUPPU{_<Q]?˫C; 3%+k,̍C7M"sgήYνBEENKKl7AA7+Çȑ#Y011V``i;tЧZN>ݻ) 4@Unq8Š5A`u^EVj^\t q1ܸqWSѶmh?>c"l"XQΤ kN(3~K#C6\CUȮ'?&Oσ;.29$q[s'weFD"W~[ԑHP#`?M0lb>.|_ǵa%_Mp}`V%֓`}0@/ٽ{7N9SN;bu"l ͛ѯ_?rڰbkk1\kH3cpex[XvS}gO䓲pt2pW_}U: Ì3˹{x޳:yk֮ bHKOǦMk0ѣtƹgϫ!a6u-g$)>oafPrq'tg? L~`q$CEaֆI w&ΘD6٥DDeffv xms uT•rq|<]gV&7%[n_e#M_bìa'^T 8/#:9rC+hml:e %RSXpwG/60 pvQdZԮ)l7@;3`FF1$huU5 !Ō;3b οߙ!:sMG|Ko‡{ϞގVX/dU LKO%ʜcbjwxa#3}{^r6v"7L5K(07mbqgW'`Bp5j$W~T;?e|>ckqiͫRb`7X8سpr>ݳg?E_X9e~/񓱱1O&OݧOu3fh,LY7o.UglFŒ=Q6m̧S|B|I2ߟ \>s6u,mX~viF2?ŹBk֬YO3X9%CP* ׯGz㹎ɯ]mMu\=Y!EHII5kbv5Pi>/KpV %61IW` UbB QQQq>m:#3B>VR4aJ9ӐѶkk=Oy"._AL z LL.*Nœ  14n`. EܳLҳ,#+3wn oE+o^h4]u 9\?FpU%<bU}dfsFl-{]+6]}'Yn!X‹EٹP4F@*G\݇E_٘xLˏ*~fl¨#y>Xɘh73Y^lI&CG? ?;r)'pNKM+0,y?ܽ#Gry9+/T<]6W^Td䉶h󤷏/>,߲{g ǟ< R9wӦ--ckc˥a?og:&{ !_&Xnobe,yaF#FYi vN.uڲ⌍aײ{ Y=&(m[{boI'G@EEo<·O"}ydmmÇWzNjj*-/kZ<<< VJlD]@]'tifOO&pm97osQ%6!!5e`GgW޼s!j3.!ɾ34eCȉ.T@dhʙ3l9C=%41)+,aC8ի\m KҦR9?]T+ֵ{:X@j)qG.Anyۢ]7/u Yla;s.Es#523[Il/1BE ".ŀ\@#;j Q # k<>ZcKY߭4|U=\|T皢 d" 2qn,ɰDȊ@ b_bQd7Ѹr>zm1@̃s61ZZ_1.Q DY˃`SWL,|Cݏ7ʧ-,-|\|qFW`{ iknu nՇcQs2|p vl|{xMP|7c;H.4B=7vT\? B{;V{^[KW(wwvD73;Q:ZKi;Yn8?n62t <8C׹{> [LMG\.?=sŃG |=d?~v!%=Ol&z:^bRrP,F +5sεFyK6b˿}5~py FyjI0ISO/)Ą{ʌ9Yk2Ɩ8] v8c?Νόf͝;7pu0f`.ofmQ_vj%%k*0cH|OΨbg#(Tq%"2߫օ`ӊBX8oQix,L4I=ʀs]㯪[MF%&L`iMC};sԊ,<2k(8w Dl K#v>KmY WZ{acUq.=#}xRU/f='KkVYyv Vg4`;,4 .=ihy+Yx9֚1F[~:U'DU0_~D\ۇ*ӆ? 2 o&+<|@|o 3`zF5I=bCEE/b7k iMɹIGZX1rvȢ)Zsi*R!5& !0{vT@ċ"U |lж{#I7?G{f=Í0:N![peY&3NQas-Ҳ4f a13ùf?.XƆ"[~ʋ&xyTq #D "\e1`g鷭pX4>&խzr}u|^r ΥD 0F%p8}q]8韎 ĝBDCh)F?hD|?lZ}Jk,Ý-?b_= 7rg/NA[\ݹLw!-`/R4XƹVq}"^E;xr3rQWNpR)aYF6̜ Թ˱ #b9Xe}`Nt7:&X^,hz,~NA6cX[ŐGe;bv]tGL&Lo\$牘G[9Rcil'CpAF]\My°x (}dlvލ`1Pz[x.9lP,YƦR yw~9gciUBchbi iTGr80׍ C^n "\S?UE-(*O(=n&]g{EXyh$M" e@nE%xލk>U,rR|j `}48Ue83Gt&'619U2t> D(a[4$haCI08(Q!<&Z2Ygee|)NpmzCͯqҵBhq8X 3 } r4<+))dSHĈDbnd7 9-ݓbL މ+6M<8&D՞.}YODmc啇 8z3޴2C6?@2i(0!C0qf2[Á!!^W]]#u3ΗAttt0Ž{R:-ppp4ac7a[a11?{,[k 35 ʓMbe֟pttvF0Ŷܬ+6*>9m Qv컜ec/EZ.{2Ok}fμ+Vd#;uب>P>e9[em}lԨQaE62,nVfsݦqђL#39~|]`m oK-1vNxK[ʿ7n܈5|خCR,7ϫV׵a4aSҘc>&@q7Q8q_A8ogT4σ>)MqG``??08W,;P6;DxoqJrHCO2wm¹p]gCqM4u8qռ?ܬFY-¹z*TMbYy !Ũ Y7y G+~ʤx?6oL ZWD$(J*y'y:C:,Ϝ 6a%c+Olǚj7_b#z'Wgʹ^5:(t>>+nЎ51-;o-qXIGGDժQb΋rp fǟ:^X/i?B7zuO@^}-|n.D}]ymsl-C*b 3Q>0Fd!Q^0FdqN_::uLG` t2'jPVyc~8pBߡ-`8hLgD?if$h6k.kYOɣ)},+hNz/3x퓥trrl7Uy*|b}iaa(3:+&JM钔dq9p|6j``W+6\yIseADieT,GUthXٛA֫T֖7`0'l\[ƍp˸q6;d/IP)^-(nRlh*K'Zl /kbQAA/e)?8Njx07ijTdΎ<;0c^9K>#q?hQ o -ڕ^i(&/h%IJ[WF͆Sr@6 m23@4⻭xyvbDGGI΋M6Kƿ҈[`hIͶ!<6;\Qn$zC73AÎsY,=k-OmMO1ly? fbk ƞ0]EkbyLD=co9)kҚ0ʲYY˻$,>>s1gMɓӬpK2ǟ:0rp5^=c !xe~O}Z35~ҥR]`SvƎsi#{Ҩ{, FCv/%;5(E ZzS|W(bwl+, ZePA2tfkrT Q`krb7~=8y GcXRXWQ͇ͲE>Ejݍ- U⳧*W7c-ݽ( @9mR\'Ar*cX!Z%]*ki454+h-̺J4N *LV`>vEb'/u;[DՂll+Lzn# 0\FVK 99HV ¨nv$O#؋ZHE!BGJFOHFtB-]释fӘS#Tyx g2WF0Ys\ ۶,#c12Hkab"6k{zZ7sg2$p~ATرc ӓ/E} E'Lҡ* !U8~ 1M(.|zY:YO.@I5u۴q4-l]vv/ɸeFǟ|z[`Fոq7pّ#F+Jadz$#5˯4fa*Z ̃NՉm9g|3 Ϸt ÓE'b>XXljjѐ*c54x{Xr %9”>11R̈|m}fآŋ Y,ݿP4vz6* K,O`i;)ό_g,ޕ5q)ˀu[ÔKz+$(edS&X6IӅ_}E _/]ēOJo fKQ*VZEKװ2a1GoժՒn2}iyW溶S4JǶ]f:$酃I" +@c0y22]1|ItI12uqu&azL\CN0Zv˻u`5j6rȲ2Ï?Je¼b6BlX9eʱV;geD8x  yF'|˖I7!:*Jz󘝝-kZiwX\;ʷ7 U1y*%om9Μ,@q]Yg?kqRl\\PV(,ѭԕ %bqV9!4+홺p.pBN朄C+t:6Y[텐`g=$sAX\+y9=9EXLEbZ]oH+ۅh6y@$_J4eTv;w*"nL&,CS$<|r 7nbbj c:8;zdG8`tN]GqG[]:ƶ2!6DזKXg:H$m;zU98Xj88_]%s * /X\3ťx2]|[0/4u8UhsR1j]>RߌAkϠ*mk$ǡ5ʅr GSqݑOK/#w`DxAFI1'x?kuMu8w* {7oB7 zPCZB볐f2{[qibwx6.9e\z`~}|19@[_jQbdr#_v( wp zB]SzH ׁ?*/tpMɹzr'qDj {+%O(aF1QbGjڴii&jy ^oSSStC o@faR̉dCcC߭d17J %aazGxi3q5|ppR3}4;r~uQp==<0i$iDs!.g3VYc%ve׳|r̠x+m`=4`ɩ|Ć~6MI`3c9Zd5edUB߯ƒ9kd-GΧp,"ec,F)zl~{ubSD\بku<"0&l1s̒d&/{x n~r #55Oa|vYX ^ x v2NHi<#~=] ٟ%(F4[7_[C'd)6 [ٺ)jxD#eDb;@ogN6CC=FjTA `wm++zL{w;}u:m Ki(D9,=[(6bV%pBHϧoŴiw'Ml$3ad :DJۅxft:W!eK\wB%rvlCOb=.:"|EmTt ]4G:}T[q$:7ԡ[JO89:IvI뙰)6Y8|b⯉ekYY{9,p?˰EZ\߄g_1W؀9E06._s{ 0?}+~xŧOP|Z-(D2Wiq1"\~?[=.O>`iS-.O,Q!޾/|:!T& z|eJKq!p]WGw:-v +ZΊxel\aJr6}͌ [}iZ:38{?y ]|~燸gڿt*gx! |}6>~_qk\Є?0blT'8:=5;AqŽYwNŝ}NUN<ziqt6:Q@{Fw+P?|{PT*sl*FLCR[)URP %;]Z{zL'1W GѺQR[oMk&NjW &[0bc S!٥|cyt {Xːc?ss tZ)R &^B( J]{P٭/d[#O_<E…&Cp&J'W}~ļ~@Л3] 7=Y|Ɵ ?Řaw.߽8ON8Z>,ѵ8z(\AmiҩP[0`ƒ+TcS{8`<g}5Ab+m&>898xev䥤 [+5~&&F.\֯s*}o{CͿ`oaB0h΅߆G*kĐ$ۻ_)iu~*+ ^C spKDoD1޺ػl;Iw|(B v4bo3P)EzɝN:a%&51>lsQIQSnYB oP rQUM85X>A lyIGy=b:A]JgDR%*}<=Oc b_NmGDXX[.TmO31Q/¶iHNGro Tbb>71 .խ۵K\1s!/.8q?YJN]m͵8hjɶ,كe 6US0]Sz7)Bxn` FR|j `}48v . ,szA!Е՚XȖwq|`|\Dt1kpp7V~7<i7cA-D38Aw T 9@Dû!UccI{Ś*z3Yɽ]+NĵEΏpԏĆY/qX$?͟->Zx.|)v~wCފNέ7A9L.Gu ~9 b{UWL}i+2&!:'y\4Gw`|᫪BEUהן:ZLxV;{ }TjT q>vj-9zo$Nf# .e}QN4Ι${aҧ!YU;zbXkԞvؗ.\,cl1lU~3&eF'ļןFN!:|zE؈݋Ӳ^SM- A oqm@#LZN4z$a͆Q7si7:\u/F DkꯥX;aB)*ܻ㺸Ts}7cP'_hϠ*IQE;pT Rpcqk >Orkfq9^$p.=1z2]|[0xo]&N_veuùčcX/Kb,.ƍ{vǂ{cquNn]Ey~~J!dZ#B}TՀj&8 j[}B.CqкbG.S>AW"0+ q }Kqp ?QUZ< hH_?i<|,sEbUoPA ̄V Rk.]ۦRnܮ(tqzOA#犴p?vA ۟n?ⷍ7&gX>8_r=~X]okýbBڅSȩ{meνlu<ށtaەr#&b~]* MIBpo1ēӒF%11NVSCK>8%aCwbBCdJMs*+D~Qq}7"BTe.b4fM/÷K[jD;#1.ؓ[Ls!:Q/Z_^(!ѽq1qxv{+π;ČŬ[aί_bYa|ߠA,PG6ه՟JS+>Zzk+Εo#C|bV;-r$ JѣW456s^ns0wr4h$)A ?oA\=<:mì]?AiGhu93aKZuhѥkwz=iAA  WÄu@\\\K*k:+mAA? 抟CAAA園"AAAAXB    +aBAAAa9L    AAAA0!   &AAAAVÄ     rAAAAXA    +aBAAAa9L    AAAA0!   &AAAAVÄ     rAAAAXA    +aBAAAa9L    AAAA0!   &AAAAVÄ     rAAAAX! ,*Ao~AAA\vU<}Rq$چ9G O@s@L889!"  *58YX , $[lh4Z[4L'k#N D!  X;;Sik8:9#Sg;zegKK$.0);{q6h֍pKAAD{PJ{CڑGaB\RarPggf byo|   5_ (l f446K 9LѲ9JD@_͟GAAD[1׿ {5$oF.\2~Ç_oA3cA Kcn]޹=\A5`Pt: z!X\hF}fcccӳ/vڅ>B~AkJGxP_˖`նtWBuG`T 㒽^>7.9LL oK>Byi3qm5eqp Cp؂m¹o"g{|pMP/ߏ/u%uؾW, OWI灠wTL_=Zgn!81IsI0I\rV궽Wᅧy/Aq_&O56kn|m풏8JlU8'=[G!Kmytٞ ¤N8+s^>oFk6m a@vqծ '㎡QVLht3C?4  '|x@rLN}"mˑƋIee%two?S~x 6S'ä(~~m,=卞CX?86 0WNFT!0rPAbޞۊO^/ ƭ݁0WNf.ܥ|n= |=& Bu:~xu,,A/Ne8d;=*HEؽn!>CIJ/[a[:4Xӗ}V3< f<JKC`HD %ǏK#K%%%ҧr g_rAF0g{gg翅,gaSSuK Z\wo6Or/Idž?K~]I,Y۫8L 6o :V(gY_ uh ]{b0û sg"٩ [+5~&&F.#ozaqpv0(8sa{";c{)ñmbަm B 62?#ġtN#@WWo^E+/cBW{ooøOaO-}ݝxm'=cXV@1. ÃTpՉ=]p*61Άr ZQxm_١uԇx f -l;;nT 31F46mޯǀo'~mg1#;1^u8~,ш;2aW۹ [ X>ݕLQ^Ní m[XI+XBޑ#(?mq{|}4>NqD_NcF|2|nxOz$j}=m 7+ں"Z4O_ZCr۰%uH8;yB(ނ>݌cgx /*ɗ "  Qآ".%gH=C5v+*)}?]\|Ȟ|_k\IU!4& z7)BW1sagpi0؁*8vAJqtB. ݦ43JEؖ1 ɝ`BqS0,&5> 0wcPgtKbKD|OiBr~`j|#`8M<3cذd\]Ϧ&{1$t9Xdn|+c2$7&1*Яrn&Gg(@y-;sxWtO1fn)u;Nlh`nr- [![\<Ǘ棠Fpw~. <I2W@u8:jx&N,dc6Qn{ ٘5C]rΈTfyByt(g7aOvR:"ؖ+_JYж) ;kλ0HVw@>qʿF4(;y@3F$8~0K:<| t tln8]ý\ϣL.|OcӪ}"hb׿f]MtMۮFD\4tm z\NP<&2}wV^^Ѝ $G8zQQ![b"'92[ScR|! Hchg9c؅%+|kxd\TBhq a09O{OeM+ADX.jvjr>xܹMeMY矘ܳ}Mk_~QRrYU:}QN4x#5<_x/,ؗS4Du g`f_AW^Ɠȭ7UT:n_TU!F޴Ϲ`\] Z ' c&_o. >'wX҄!9Ke1a,Nՠ1KY9FcA&r|3*Ccǭh] 0o6+,G:=TqkgH:f}z'Xo}q"D(2Gï`3솩]}ؔ؄#bb'>Nlg؆lt`v0I[^A5,Th\&aRqok??~;[u[eV1l 9B\aEP؉TNE@Df(EwtWJ\"H9J4!g{ٔ rgC\QuX?n~3ˌCc<뙬oӸ%Zm%+gSfD4 HÇɘW<[!]QSNi7 {ɶ޵p?_ZYLHDpzɪO]8tn_| &Gxa#V#ʪž|9'[XcIg$QWo_;{E{#EÑ| 84CKrGl3mB^i>v;Y4 eX'mk] #RxfL&PSF&xuvPÉ:RQAʡMX|9>~z ~4o雚kU&93/6ݥ`jLmܮuo䌳AAX8K #K lD^v烇;*}&))) 6C~R&dRr.za֥02#OQE!BGJ )i(.<E Gz5NL;aqCk5%ZdTJr1mb oiUuWh\< ?N<uN7Yc%+^#ɪM-F{C+32][1mrߪ[Z=ݱmb12#mNc5wJ==mw,AN?DN) t8WG"|$ڎ\eѢAa>\p4q]*!CWb?=[Uboa=ҭ7\ۢmM&ץam]uR19Lx=-UeRZ=nP#Ӕ;)'T*{%6ƏR}^͜Aq!lFZ5Oɑ|'a73tYVhll?iܵk@mmzX-[ I+NHgt8Uo8U(>bQ_*F+??T@_ 7N̹b%|:BSU?Nn=qx}{00 4FjXµXR0q]U.>!ّk\+eŵ]>fWQG4\y6t1w|ި:QOb*QM:DF@X܆0mfґ2 'vUkTcH,mv W:)֨!#Y5Rܼä2QURmA r\ѡ!t>;#$LL[S) W0,X#>o@p$cUT ,’! "F:{jVڪmuWouQ(2;4DH^BP|I{w_/(@굋H6)1˵ݒCAJʃ#G>&e]ا4דX[V-/okvqVW`}U_Ɖ'*ȏ=Ug S[!:3 =J e Yqp%,\ά)3W7fَ`پ_6pm9 ۱Ѱa&b-r/]mrXm, I}4֞yD+G,h J9f]qv x&φͳ bE\D\0on F⧲jj:#}oa&$LV Yjx2Z {<ʳz`Ll:K̇L` 3+{x+{''d <\wb*{?afVxo 2vwry {)cw0cC~!E&uGޘ> 9TT'6剿a&imN4Ahs(<,R^}vAQ>!7<ĉ!<[m®02AW?BB-9V?a|ɥEIذqc7{UE,+%A/Ewo%O{ox㩄Tʫ!PyU=e@1~Yy\?ѳo꠺\Ź)W<]>'s,zWQ{z ~Mi-`N%@}7gb˜i?s9O! m+,rrr0jH$(3Af"+jǡԵk+lwTT퐩rWxp]ze+LU&2LJʟݮ/+--3'^}n@'oF& )\ 2{Գ6?91EģpJvvx  %n1b86lبX9(]a“G I XX~Q;(_BW +,pR|cGC C8asexށ#5 {BȌ-MOƆ4B=g ' wWW|!^L?X=j$7ŪD*9 aYށG#W#xvOk <3 sTSہp"["  })  !Wnނ|"  &o:ᔍ*q+U3!AAarD:yj逊9 0!^00y YO`b\sb7Zb\a<}‰HSGAA .%<{z*#H>zX9x$Fb1 xe oEe())Q8*壅S:1>_X Qqt$   _lU*yrM u\I &o8 8 |Nuy.C   B#WټIz:"QZZO/"B_ @p'6aϢBAAKklbw<xv &xh8   $    P    B AAAAA    5(`BAAAL    Ԡ AAAA0!   P&AAAAjP    B AAAAA    5(`BAAAL    Ԡ AAAA0!   PC2!AAAQ+yiggg>AAAA%    B AAAAA    5(`BAAAL    Ԡ AAAA0!   P&AAAAjP    B AAAAA    5(`BAAAL    Ԡ AAAA0!   P&AAAAjP    B AAAAA    5{ q]!-- YYYJ`ggx{{C,Zg#Pܰ쁡55¦8Ӻ9U<#ֱ/Y_yh狒5eo;Ҷ>  %ڎHhh(.]xq>| g&tl5,1."*<);p?+ԩ)q=1:^hl஻%kB#fcⰁ?]L\qy/,s6"uϥzw3d@&K{g$uT=]yex*eñ?㿃>Opeۯy6 )DhFEg^ۋNoh.ߩ7v0ɑwS!U8?>]Bw;|  XM<= E ƗT'm4G6{bb$|-HA^f̀ Sw.#x*l6d V/싺l ݀GOfWoLB_`h51)wׇxxk uNl Ph Fz锛,vg`Q 3{7;cD?pyz,ʏdbز( yn>6E31UDZ׀I!6wgaФ9j~Ś! Sf#=.vL=0kT:jyh۴zԨ+y"n"e$fLkD!_#QYְ@]B菑/~ǥCna;n f7>Y CFoa&ͅJܚT>b:Syʵ mҶq6&f#Cd~] {Lx[sΪkL"˦aj <1RFyAIF6:y.oBd,f QN ~_nDQ0k12w?b*Lr,Km4f~Y{72}i_Yu=@imyh1l*x[Az~>;i2I ԵھASM*sןSR>i? <>{,':qsukR只(G['5 `Ν`;F>_݉WΝ;s؀ a8a;vl41n‚,_Z)M16\f{$}# ?Ahh8.\v&fhovv Z} /ŀ:+"ݰeQ/t4Wv8?~9"@1,XsZ*LفQSP-[;Ac'92-pӒwsQ]W_2/Xo Z: yS4A&= ݦ9V5 ȥS AWoU pf@/yt æ_N}*sծ~E;}tg%U'm}nmLPVE9J9:AaĉHMM5}]"M$9sFIu:Iј29~/C';>E|ZRWàvא ~b+CkޖOO=u$BhD Vt%HCt!*gXu vٽH.DWc1wq  D~Hyhڢ eqyrz t",@aA#,Q]8)CA~S[x6 ɁPg]?7sAL AnIi'HѐζXiqǰ00Iaepw*k3iUfآaC;o$!'3KA5M4bGc<GZ2ҘL\q?_êqmwnoo]#i;cҤ* l`,d)Y` [+V^^rw@AS=95eih梇3D]_ov^:5X?]IC]3}'T'mR x&&aaa%չ *LMM1p@… T^l 46 SaJs5N/D;74qߏШz*[pc@垆.ӹ铋to}2C*$ll] $c<]zꨫ2T,!Kd|:xptqh ;B 2߂x@;5\Ѳ=vKͿ?&D\q4ӋD˦u6b1A14G~ۏ[%e2- ;|!I"*YDV2JrI{N {495ADZ5. RIY2N ÓLyXЦik69QٕOFr+ϙ k?)F*q7EceU!ŸE#VD_ `L<^ⓞvurMWS^RNYe(mAAZy|JP=_gI:ouZ=ߠxM=y:O1~bs5ԛE0mp~iND%!Ws1CƍɩqqqӧOH#fʳGJX G-am)Gj#nϐ!&[Xv-Ky@f"'q[{Gw P{gg8?=`gƚL_Jh\ΩDZVIWdDGg@&yY'"A=wFS/7yzBgZE3S Okpz iӚC' 4k-~c`)v!#3Ezvƻ}:[[ŠY͝;OW ZXY"%Ėwk=*뉻rm'd#ψAD|VˑE\{(e4 ̽@"`|/ cp#Hyz?.j`*b=iHzJK^1hh=E ko!S{xvTk0h/]|lW'?('j?w#z\8ߞKk|cɿfS1m6X˹U[7Y:T:˹6:AxeW!22Rzps@&7n@n`ddk o^jGay`!HGJZ&xf ɹSSg08Ǟ$)# ZîUc]"&AeV;H< 'Yl#kpG.d:sEs%5Xkh{>`jI8ļAة\ ]@F6D;U_9 Tsj{QW"Q Ҋa^MH?*d5ӧf`޵PdB[;y%oCӃ?!@\TUݰ=5omDml?TCa'& b^ݯ)&Sy!1Y೏tqA#oqv(NMe?8S0>8\Т'N6c;ђF[ZzO& #c[76wGB4h|jBr:`1hm2hgNq<2F(aۨ-_`+MA. /}FLV.~R0Fbb{ǃڤ1.(aj+[0}d=D#gTb2˰ƺEʰyG׿, {_>GHEDuwap%&xzx7mA<[P>*`KU>Kʫ!WyU=Pye{`v ͭBQԸDw_}u;A\H<;eNp5?/DbxOB꣩NA/WT֩SYד'OrWtL'{3cR\\EA / !   eޒ>VX"P^=ƍOHAAAD^ـ !?tpttDjj*BBBwMAAA+0Rr v5&1'!F{AAonK.HLLÇk.&|aJREpvvFǎ Wpy.oBhG߻!EpZ*}}>> EaWdd^yo@‰-ؼ`-H/#y1`wc_|Uvdf՘Ֆi*Wi>'X)WN ~_nDQ0k12w?b*LZ<\[7KOș*D}GuB^Mݙz4i_faTӮXeEA6=y֕ |yZtf'a^h!Z 9VONH`dЏ.rJ?ꪑꕱqGVP۱%ǭ7_c&ձOmha=Os0F / g)KCvilg$DDH̘FE)cBGw1ԣT5}atBnNٸs; Fzuye!&, #74'+:5z^Pկho7BC?9  (`&-4-:WV4Tu݋D;74qߏШztсjdRF^j؊[',#DeYy9m`y2Ơ5Sj'zGx|4tivV@o i@AX[q݂hӣ ]*ϝrңvQ}=sc\Pk][a'W8-܅SIx uc+SXmK,AAPD;m8cƌsGddⰷ"®a,s]$''+"*Ӿ}{R#f2o}85D~ScE!2*b'ٓer0+N-O8! xxg4ewƓ±SJڲP_9q= >C(}Gj6=3C@/L /4U)6T Gss |z)].US۩,P6ɭ~yӢ Z'`.EְdW-noCvVȒl%u=:vd'uk8 ֖r&=B1a\Sa=ktkO9d]Ԧ v2a0 rÆ1]ص !٩" &>:t@`&!7oTBʃ!!>]RT ,ZjBamA^ C+I+ ^MFNlD3%8"pރ=.OCeKuv0< n#%Oέ\ާN9׼5s+^%u!*Šeǔ}޾`(6b)JCbt,? |47u= H\¸4 7s:ϞPH*Ʋ zߎE;b0;gpLqaY׏XTrEՇhh2k{K|5yW={d E*ϳvƵ<=N{;!>v@_7W@M͸Towu?!9}>vzKwB֮رgVJJIb$ [fE01.>Tϼ\P[]vc;6} MUmބ}r' {O79}63V Ô  76`R9ݻ+V!--M}T0 {X"Md|aX[ tF MRbsx6YY9|9qKWc"r&l[tz Xw->Nhho^6\JӬfps|̳؈Gb\Du`6.eטÔ}5X S;HǡM'歼%hR6v%AA{ g|2WCzU=>B#!$uRD#Z[sqiA$$ f)Bj\"Q/>ݫ,!AAQ4"J0U?I!xZ<)L2 3_x(|HQHs}?oAAT ݒCAAADeޒ'AAAAT&AAAAjP    B AAAAA    5(`BAAAL    Ԡ AAAA0!   P&AAAAjP    B ^Bܽ{qqqHKKCVVR;@+++dAAALٳg*Ãp B]v AAAAo&<\^|OD_!<<uWquu9g%HHHPBINNVEڵ"B!@ÈuAOp¦8Ӻ9}cJ{"eñu hY6 l(_5]3}",cH::~_ն:oZ9 M *Zxo1/%QZv*jLU(UVm8==k֬AXXM4~{;vTvS^=E=:u8=]a"p%_^P1#fcⰁ?]L\qy);pVU1º(6DL\B YnCM. wۙ2G]Ḟ_n ñ8cX{wu':5]j{52umHǔq2&VGGգ|Yv7m~M/6쨶UoQIDY>͛7+VbРAppp) wF۶mg<|P9r"R=s'`lQڛ.5}|" L_EMa';{Ù{ǹĥdTd {Ϧhk0uIe6=>[〆c]x}%Ӎ_#KlbSOͭзscpiGcWr=9EL/-rB0"ab}!/hj&;jk/6t^j27*ㅚ뚪mAP0ddd< H$ 2&&&zɓ'c׮]wnݪcun.Skj+^/A/*RO°j_Bq:#N`|=!:MA`d cʐLh "bd?@v |#SP)8c'˯ IG^Yɸ1W.K19MM {H MASW%%%عs"XQF) .lM İ{y;p{ȋPT,ã0 T+ l"MOvL?}`4gu|23y؉oL4&SD pP;,O9 k1/Wgb5Z=fwxqݲNDQ%0ʕ+6QX1㗱^ Z9 ('kVK`g-\`s;ź ;6rD?>EY4Tq Su|#~ 9Q;bgVy3-y#ˊƾ%%"W~?vn_`{H,N1ptr3{`ZvrY(5@]v0gZ'Ogt"ӳ/îAktmc3p^`邀X.-D[;ЖRDLAކσJJ?|B!l$-LGi*wSHHIӋk*˻Xsڊ=ADh6 G)步8f9v^N@ BV^d:D |$ iX'CS8b\e2Dwe#Ur?MW^L>5&1'k*:.?2tW"27[aֺp=TeSq]2d_݈9Z3'?t9#8T/TUu9 }%\YbSU.W{ouk#^iph:8F<:{=3dVMWSu;tiU@rӣNVoAr `I~~>n߾xߨQ#V=ie;̦ޖ3g(;1<tHfB,d?JmJIy4A}\>zgֹGU[Zڼȵ6R!`kOlWOftie샌MWӤM (`&,%na%+rrrO>iӦiP8p BBBps wk3t|gڴ%|"Zzvc:D3Ĺ{$}_G$~p 3nSkW%e` pD:Z+; _sU"3-7C@?x{su3qGe͚I1_E`R,Ѫ$ǣ mYN.vj-'Ua"2[qR+tF@ӺE*9J)nw6>[4*W+6idd>ģ|9p\VkxzWFL^Ju?k? f2r+@^Z 9+rۣW+19?D`-v)yӰZ6"2n9?z<8vތL2e Z} e֏peI\nXM]aʫRqe@Cys( ''+Aڲs6em*}VV/w}'9#p%'JAi~Sշ7 @ClFdtzɭ(VhKͨ|u5L%biׂ)*\flW7K or>VSM]|ص!ݔ6uCekTs.P.QUӧ =vQu8c?U/j5ڼwU[nK@HBB!z(*E Y,"tTPj@$$oϽ Br[BuM9gfϞ{ΜKs ʌFk+]񭂃c%+kss5|ъ\UNA+ܥu*6pCMA$a6lѦQF<%f?ֺukծ] gIOӚ.Lݼ^=<éx h״ԫ5hڨ: sЉ*p8I:4Amoou~ZIǏ[GUڼ/_ĥL#xnD=TXlGOU KJVEj vŦ1 ~(ޓhSKp晉oPwäBrػ#B9BNWit.Rp{Se!Wtٹ[fd{5!w#?_ĐkcN@%zqki ȃu IZN&FCq7J”mW&3U5;URӼո7͏ wWIY)$s_S5&.J-yy5h&٫s4'qh-SAb`kFiٵd{V|7l9pwM92K{ ߵcT9(Ƴ*(۞q8RZV'ʸ睙/؈#وsh^-uTU8WsUEzSU]Unb=n pivaˆWuMƍg!005kZEk1+r^+Z@Ka;9V:edz*(۞qة8RF" tF*;ԿW􃵘ZA_;9WsU5zsn 1F 8ܴw$$$X>͏؋y?QF]#6וbDKqmB^xqd/q; ѿo(]4O=5sYt6wj[:6fL({$ _^'Wg"r{@tqίxb< MR~oE]ۄh}2g;O24`rV-\K.hI1٧'krK 'ؙ!B۞ewE7pd;ԩy{.yh2ms2F _~[x<ףc`jkQFTFFF>DzWŸx`V|EQDe (D9]nv]~`G9"#\,CS*mRF>w"~^ +HDv-zvo`_b([o,χ Gt549)LJ{Qz`;@. pHPHj`mJx^qam̥UQ3a(#粯touůF ϒ_DF_!iӽ/}+ dR_e(N}MGp7W0ǭ=TE.ZDiJm/\ok{wGj 뭃54^_L~bWv9*o:=2}fM=j3>m.=h[ Vʟ4ݱ/aRQ j(۝&C+0~nP:>֜ᕍ]謬7Km\gBp@4*5ݵog4>KڒCcYNw}e-oy駩^׽曗>fMKK>ӓ_|RA)?:/ջ6Uta-<:`tkWQ-/:yCQCqFw*~6mJF]_ƋX+:῟-glj n*y5wk7%vQyxs1,ɝˑ)z+ߘ7s1]@!?Ndb=j:|\ҏ~HBoo+ܺ:Sbu[esB&0tdbiQ%jx3HܱO&.ޖmWteK^AAA|L5,{-/ܭry9r$/E+(CCBE{ej<g=|F^[ӠKx5k,f͝¨nlr[cj¹gMƧN59?+ h]|3'[)K HY oݞ:4o0iжM*xwVƤ ϛ33kmC0Rqد=~7MH @zEwSy(u:B73YreKؖswg⧲$Z=5sD LYLxKfStK-p匙ɬ9SyغތgH6'\1x|4Y44k4>z]>|1sEz?ΙztTW+  PƘ2d6lAAADGG[ ;ḞLa~$''+E K.U:518r0E{ ".!@"4|IՉ D; YŲ#O8D5#dKM"mS]$v m?M[ٯ,ܵ9D~e&$s:6)BUUEUo9\Ӗ,R]"1h黐nhNs褁uHEtm 2Xl b.T^4ۓep#FuBߚԯ:$\bhI:jk;Fw)MLbXRM%#_ns\Wɫ.  $LJ4vJVXf {$B.&C*CYH7iIJŤJ FA,:~A}ll_[ vkK 0lEu1b5k̏\"ܯ J>{QӮksܹcװZ,hܵ|=ey@zWk_Vk:@7ԨU {j⺍26`%efyB;oNw6f -]vqܝ6&۫w F 2YwLN?r   0///mf{رcZ(1*،~~~Pn]](W+CD-ck*0؃Gi6Nx;[r}^*Ij{) a96,p:3) €>u,ce%%U,5ŵ) ܺ'ԃĄ)l6g(|.}<DzWŸxp₝z,^52emB\KAAԢk&nѪnC] 6h䢲{ѳz:ݟ7cj) 3O/,c 1M}dsЅQ AOƵҸsKCs۴uyыrQFyu_^oZkwQsdݨ,Λ*^-kMWGǧ Ň_ yx|ۼpW]pjBax7uHNW|1dw0-z76+N8d(Gb ïx\ =i%^vM"߻QMRKNW&IAAeyAqT%TZP,}hJ}>%g]uJEPIY=NaXCTAA*1ח ~79>KR.~͏&    e    BAAAAnHAAAAI    A&    e    B$a"   PI    A&    e    B$a"   PI    A&    e    B$a"   PI    A&    e    B$a"   PI    A&    e    B$a"   PI ܨα|<&ц 6zsŔʦYSox]dqY,ؐ|}dU?r 7T\ey˿46~9tvYNn&ANHzGr6?>D΍&>9 /RXrpO޼k{P:UQəW C [ IY߹jļ-ll[ڶٲ)OW9ygWNVgU?v2ɪjE}8'e]K;l̋A&B Vџ'xonj}~k g!T!$b8wN`ގ̛xBmGRg79_X; f?a}QNjļCYcb !`뵂KT:=Gv n܎PqM1ek`4QrAAJH- ((4rfKܻ+?)RMV>;[h$yƌ>&s^%sVn'!CD }FfՊa갱3&[ ڔyɥ3'fc4GbJ:??^QrqyֵzBc~I,ܞHJzQ=-wx=Q8 >_#h}i;d /QR#7 _u-_'fUYh̃&AǾ 6!Bb(Y} !1݈o>>Qfm6tqoЙ-\S+yH.BJۆC1TM0}jDC`~SYXAA/02LK,:T^n6|0刿يQ19M@(oe<:49/5ЉSўcwݹj_[sS6{^{2å =+a .+wP6|XPi\H~*%䰲xKPY*7LQH)|5kF5U*ۗ|}z=9%RMI2oMѧƱU+:ɪgu?Ƽpdv5i{,vRl'?6uÑ4vSʊN^_1ǩvC[e}'攂 H0",a 98u^[K=VXsz]|)Ux곝lY.}~~=+S5_ڌ}jf#WZE p? -[;*7ԠМ+NR y/)?wpx}.dc n''.SGf0g>]Y%4;rQr5q}@mҪmUIxbjEn΄7:SuViRʓr+zzbn:/ڊ.E:q06^l6HWK1Ԕ툿9k7uqeT~߿`̷Jh҂a_\w{1};{ Wq٫^{)nOc3xJ39%v[5(v"9k+ߦ}Yۋ[gRLnˋ f]Qd*ەq[}Qg> n:iiLcc1L}=IB]qߙ9 0J>L;8-0' vM+ES`{< Frk֢:lֽ|3xV:u S)IPM,dUPb8O2` R^}N9YC{uRDZ)y3np4a1^ɤ]L5o߀^Khз'{(G4;{B&S`yDR{SI5у.0)vؖ{'멬?ڥCºXF;a:Uc}Qs,_D(Y?9]9iZ2[:rv]$R-=Dl-bbj)zNrފjS;'% DW`wg W s_>@8m<['ΊL۲^qݿxm5<7c;]ܸ/$LgLhݭI5ccI D+Mv t*e0,^EJQ&F,{jpטi-coQ˯њWE%WVeTyT8Q{W >Lu$Of|CZLټL) dYnB,F(a54h"ר03) €3x`޷<Ԏ |Nv~=7C^T- kh`T"N[~]'u ut{ڢ"=ۃCWmZ|:=O4ڵ[W7b:16tde+Z:ب#]5:v7c_+dAtdx٩\HmeۂAiN_Y0:RW{}qߩxY}׭wm\gwWo%7/ 2Vqڊ.^֮YúmbzlnNKsO'B w6wZl2¸st[tѿo(]4O=5sYt6wj[:6fL({$u6V3V'7}*{O\oy"#\,CS*mREZ˯iO1_j ٵٽ6TІ{eU'ЅlZΪk%M:)9ObGWVDGgʃ %l5oLPC'&Na˴<<U>r\>kѡ՝{uilმ1FO24o;2w;o~(-_~7mSu)W"O[9ѧAۂ.byr^0^]4<̏tZq>Zs4ܣ|@zDWCBAδCNƋ6lŪ\uNT،6HU8Xn$}w, Jt \ &G[^&Rl``Z#oE>^E;ѥf/I#{$3L! YO\E~GD^>v)м%b)oY /Ӽ|$%gނ^]|y}L4>=xuƹl]5O3X5ssRu'U%= LEG&~nY+у^c2/5>/"sYӘ~Ϋ5un.g$qL΢HEzmDX#lO؄ޣ1ӹ‰Ր߃fū>_`LX)NC Um2YI1} 1/y]QMpm/NY-^tuúՖʕ _ ϞUTLn1fA/msvSzDBPx/hŒEk5|5䩪sj,V;CfTBٖtIaoW[cpjB-6ĞXWk{qQ|Mb3:oӡGe\`\6^ sÝ&C"S?o(kNۈ;tdÖXFoit߬yɢOf|ZgH3xi.qEUnaU|-Gފ| ]{6a~|:GԑNQs7Gc6Z*|@EXFmY1kxӎH]l`9U~%6rs?6XBo MSW;KRmaYWwRzQ2SQ:E[p۬ wotA*| k.=U ӅL|3ѭ]($7gB{%gC ec҇g郋e#a)_ǝY A|\cG8Е\f($HFp7ǵl܋g_H-A$> \\ddşAH    7$y    B$a"   PI    A&    ep9,)p?'M&ٯ*>GFéN5UpN\ x z̔ޕW;egyU-C:W);؍}dAAំ$L٢-}"ze:Ge=U ĺ|ے9/>̿ˏ03 I-mg;xwH3Tpa:Y~`F$+,yG,epH^.=q&1sIy6]cyj{zK[*AA់$L#|Gv]G3MˮJ'LCOXئMo|2Mza^*GUAA៍VT \Kԡ3\<mQUzd`-m'ٴ~?6%LJ/MvnүW?<  h$arM7s$fv.`<_2gv2TGaoV[gW,\t#pDy2I,ܞHJzQ=-wxcx{.R춡

    xf^lKfʭ=g3!<ʐQʵ^+mhh:φO6,5it˃|+.uX>s1}qfap!a'?:n%efsq#OeaI3l'|+Lߕ{A=_DE&=I[ =OPHҢ=;ULStRhCs˙,|B/-ʷ߉fUiCvɲ=JwkE{[9V{t0{G]bgۯI5k23_ nfx>ַmVDz_mnAA$a"\=u׽UJYyW7~TqːH$˜q(0AQ.W,t{`Wob.pb~2Sϰm,f#deEvp<ܞEˇ̬;;(,}O@ 7M }̈n.aE%Ƴܺ\p=r;jNnέa߲-_wP9M/S6 5R,ZƲ&;_6W)[k>9jyMXKك1R o ҏqDSݙc߬ys :jyj7'!C7(MI;s_E_OgeҨW`ܳ)@wϧc9:i0Q|k (VtkA?/ -w|vgՓ^ydM}Ѳm#\$so, WgolPM *;tnW$5eږ,P'LeSKR=UdO*-5Q\X]W#jE\|1?$Q􆛇+q,=&m6+e|=s\W+  $LMYc xj_OsYn+Uk>ĥL#xnD=TXlYQ)HUQl:]h,֍kcN@%zqki Zj4Uj5jE" LvV*h(}%}kAA~mUoO#ͪ^m|Xdi(ju2&۫w F 2gI[,eTԁ*4^`Ӭ8-{]|s+6aEXrѸk'z'u^{źJowZӿS{ja^rYK"wٰMG#W+  HD9r- iMH="\s`o L gw ׈Hn CGN ~ex[iabv)0=+,.<S|7_/{6t0mTɷL.? /0"&,w7yҼ;߅ɣDWh ж:Mc'cֹJ }bLó}s!Ǖc;YEUܦ<֔Š 0*и=4w5'т,&]`Gm*###S"=+^zOB*>3.ZJ)-he(K! ! Q?d+ !K2doAe({ȞBt;i $'m Eՙs~},wEQ )m|_tP1lrl66M=樿oꍣt1MT1{l\n\ǘW L<#;47m`<{=H.-{uB0atM;ՊLXk7c1m bmtÈ!!=SƌĨϾL/Tq-|tVb p^b_wvm<=.$JΨ E)dMiJKPy~3{H$.h9l$V,)ɹ5GgX#tak5aBFb r̜@ג  BMO{rҐkߐ1NR7Մ_E;Ȳ%s4|*u)ܸzCj ʬ`h|`kTw#9>w vU lկypD⋞$ d mi/":K{#bjZL;vDus $h۩A1(Ōϰ!SeWnD[K8]hYcUomP{Wߧ9,{M0z崀iD7F`|Mq}c`4&u|yKve~!)z|яZ7W͛LM^tSop ?Q9w {yGCDDDDs ]z`(o̿{cs-uw8N|q/1+vm?uåd,Y|tDl/&Mݨh缄 ߰ZZٍe2"ŸlPؖ-8 zah_1y,Dl+G&ƒ*G,y/=՗cܩ0c3F꾟yEEz:o+e7L^U?;wE#p5յb9t1L;úkxzզEӧaɔxQS|p 3N]*A_#gc<!*wKǨit .#ImX/=՗՚cܩ?/H."D#gW&tjT~B_@cm1LHkMPfP(x Q]8FMD$=aSۊ}y9[g,eYj8X⏯Oٛ)ȷ[؁/݃f*|8pܖ&bze+: c"ziȑb54?ŌQSM?G`󑫈ϵn<=7bCXR%K ,YV%^Kn[#U=eQO_ʿkNu~aL54j>DeJc@GƺcQ/Sj pt.:Vױyo'yI"ɋA~o N59s׫BuוK06sqeDL*AwGW,<9fwMD;{0rh0ly9PUy}b0˾"b G]a!\iP&F1e,Fv~'PN]5PØEEK`?}-||5.kc`q6..onbkN]F_P3uзc(&cP[6@ٍF7־`ƕH;)m` aᖫ2q.KLZZ!i12n}i=d"vĹL! Vpi GT}\< uW5Lg_ʶ@ʪq/;kZ;*IwbǼ!8X&'SD,8 H-aioxic#1RXRƁ+6ˆۢR*;KWɘ$_n)wq,7u=\U V̘31e11f.Օϕ<޶W!9$T-*spՈo*f@1\@D0y6L-&vԐ-S)h0F5)UEQl=~=f׽ Ⱥ16m:cFTz A-8^dlPf-VQ/O_:yCY,:ʑ/, ݃BvQWݻŋ IlޙCgGq_ uwj8&bS>]/B8J܏ i1+R|KH?b'qEQ30~Oph\LJ'~w>qT!?_!$訒;:xæa_}Zaġw*g&ԯ.do%$Ax<9GwBBpyx\/:OT?2G%Q~lơؾ"mp4_8Nj8х}^eӖ0/,<_:!bƨ:.y* B$R۴My\G:PܾW43j`ՉkhgTNiET!%MyX;t}?ĵоhTMR8:CԜ-s#p!#Mwn :;gG9TEIſ{fJ4ȪI]rlrla4lϿ~ Ws1`3杹kyBѦ[A^i!I͸+ 4t9o~B%/ Gn̴4(ԭ%_T.c ~ !^'=qW(9JQ*xBQ,9Aq']($N髟t(RV}U'‚mgz ohD1@MnU=eRq%%ZR%SLꎠ@g䜎]EST}j6f.1ϕ<$mozlPlog}qA7LM;&{Ʊ{Wxg Y4ny3r#DD㯘cff\*hә"Rı}CXR=ѠW 12ͧźQھjLR T= *JW^t-QNo:?q 6dgBԇMAe#OA%ܽW1:c1 FwZv/|iW|d#@zW|dd@f꿝Cop{~BNux vYd_YnW]5C>}ѷo_^Wx 2B[*xPD_)O,cXq{Mb~ƌMcJE%E&+x% oN!E6^rq䟻PZ8Q{r%ɨomDSr_s;- pַ}NXRoƍm1e(Q}J_`D_*K|lt~R|P~SaUmh.uc>WXױ\~r",|^Lngq*v!"3vm<0zK}mCt[7?ZFKu7+! _(Bp^A슫+$xCP?slk=GeU^[Ѧrq3[[|t?j7&̼}چk¥/e -ѥo|Ra no|3ed _ΡD%O9$Wq0r>> q2gsoZiptG֒lgX%Xf] LNȱlIC뢸?Π/Ч'g4bgH`Bك'<Åc`캩wж0^/NDcV_ MIJYEW8J /txd@]G%@;\p?F!]Ѩ vŻklLM )M?7FMqH\ SVjuG C厰M.d%oiVXRQp Fm1]7Lߧ:R 7W*d:2W^$2ΥZO^}l#8_/}gL g8Ȑ%,|`Γ+hر/w*z:> u9 M1x$q@a0W}Ґ._r~?{-yK]$.U͑N"*K#$wg3 "WzvƱy;Ά^pIh+/PճU.&V,F2!}Dl=7!^*B%[ vd˷o}9lЬMCH{)Z9R%TtOI)81j1 tؐ2.z|"rdp@ڕa/1sǒ!qBAZ!fl])׍2I___412?ѕ;t0Я$ ǣ1cB:ev9~xݿ3o*1e+y똸, \xç=&b]q*v!"˙k$)Z7W͛LM^tSop HG| ?T{{l> 8$gLU`B0e@Y<h1 M~&D7-$(|`~MBgMUyï#\˭ܿqm?֯cJSNDe!F$n6G!D)qP,\ÇKDc'"2 .6y?h9*h?Q0s99,q+‡01#汌#|IK%9Xa""""""""-0!""""""" """"""""-0!""""""" I[a$8tymw,RqqR:x"Ń}T6"WM7sa\sOKfI=inN=òqHť˱Pڕ*Qñ-[p0*pο{cs5Ɉ޸б~:/]{#SKޮeԞW_|&/skX ^6a8}VLa1+pI;a;{v_pMQDzӿϚr~7uP=#~STٷphwbѥ3kN&t~J:ڤ6 ~ށq]o2Ϝ 9:4 3ЁgwՁ̫k1};5e燗2v8gW Cn*< w\޶;UU^n^>w|iu~ً1VX2O,:X>„Q}W ez4mY[N!Z87gIx6v-_gڡgTRb8U5z }>vJܾH l$/L/D?0i9YH{h1 ,itZ8Gb/Z'm}kN\<̈EXg q_-63V9YteJX=b՛ SeƮEX"!wDw'`T p8b6TJm}E(>QoՊSK˃!ǰ^p:fY=#vr`tPocVf¯_fY$(P5]DGoI8)˶GTUƈXx}aϖٯ>zC?š1KHEh8~18d BѾt qHq~,~ rO ^4["fa￰ҖhcC17JC-ˇ}ȐruTy]'\@)ќny2r@vDG(ʉ){@G%?Ǖx9Z*fvR鹿, 2vc}G YƷ$BL2? ob*~0#EEK`?}-||5.kc`EK)OLԍWPEcKsQ Cb oePwKcެ:(cCٸ~&U߄ñsCѹ2kT):bZ|>o eJ&/y\m|XxxE33pg>rfɨ6^:})< ;K ܻ֨^[ը >\UMr'ܥ8$Wk 0SdBИhl'V7 Ɓ+6h_4If;'#$uDjD^dJ42*Z -8Oey gAZ}0jX uGڪ1tx몛:EisN9]u5u=\U V̘31.:ԍaRKҎb۞T3^԰Ek$5*ԩY UԓS VBVpn]?HFoA aŬMzhGws E@Xn8v*_H\&EP(n__vw&٤C8pqBm7c6>䮸0Yf S.Nދ\T_W[rS^{,cwARY7?ƦMyLDZi[ ~Qo U=&_PRLS 8 s碦hTX_SFc5z\qE73X8p{PH|ޮ1 .^e oHJ~DmCw} ,D㑫|G&{= * qpvTRp RTν2k#EoҐ{t&zwtj[e1.]zU=gJznɥe"{bD|գtrD禇2%YX p. ]^A ]4 CUAWڠ]Vaq>ND5ik!~x_w$GM}Uꛛ+0Wi xu-:\@bb5I󬒯yֵ 癏RUH/yԆm1DZ8tx:֥R@l׵VՔ?ծ uWycUSdIw&N4n廢QK^>ZvhU43!rĦhXeB]rlrla4%ah"#'ڦ5lR?:qUfŝm$F/ER&c#q# kC[eH+x4 )iſ#*]qr (yV V&ģ +>U\nbKic)@UBr-Y {~ ގ/+ e?Ҏ7Q<:: j Rsf[\ {JFsLÌ?Lu_Rϛ`na8ƪJ$^VsMI>qQ{z&3.Go#)\Y|.vm^5wmĔ} yS|34ѻG*śûG;|d/vڀASY8H؏37"amh:nPdX Ӧ@e 999&22f͓؇pGAZpsѫU_g^9g5I֪쎠@g䜎]EST%7L^ZdGeDcVoLX3{͘5b#)t>QrM 3fl |2*%cq;^q,Ϝ&*Qr9awF'{Uld2.ٓH"R2$4|R!A8Tkǣt13ŵȽpjb-8$Q/A9ao9&-ᅊL.WeA' C.2ui Cĸ L7 T"Z': "vޔ J>j['*Z(qFpc-`NmjOP}[!\e%30."ᣧ`p}g62+4OSW>fޯajHc #:8)HJQ? ^4f򒐘.OXz­^_?-gwe덾*IDS1SɿOj,N~[~ml#8p z(l]ƉGp[\IZq*\7NM14*͚>O:=prjNy_wD2&9%e7G=Vas 1`j?v'fXm[Yjo5+=&UqB5L\<{Q;x+"0k$KԭW=܉S)tWbryMcμ3{6fo3GUw393׆\· ʾxj?G&y,S5Z={ ? ̘v0|՝X/])n |&sT^NOU+zxdyg<#pt胱bAn0˾;ٺSWq^ n̏ǹ逝릕H8<#PiWcmTE^Xk pU!Asu}چk¥/e :EMkћ^^P?slk=GeU?~:ospZW.fءI!8?sVN;|kAvi2kW5F-ofR?a99xjoik!wY,ƲaB [5sq;4x<>3# Hܥzm,DU_̭u0e+ZxTBTJ/D7"ƛI} ~]X;3*I|ꮣMY&<7)Z#E%.Mɷ.Z%f .!{G ک>S4Hl`#}[C- ^qy 3s-n]S(5k>5xt=fLHGN~x߬dm1|گ7-zS7ɣI5jd_5o{3̈́gKA-sK(5z/^qTr>ٍZS?EYYq/6&":vL+lchzo_0 s.ĭTe1f)W9ѫ>`ʂa̾Gy<|".yQgEDdܦD(xEj~MBgMUyï#| =pMd" WY)MC .f f6xO!,1c̉VcXu.XǟLˑl%bHލ-K9]8x(ChTF-KKu6KaBEImq,VGQF|ywwL]> >9 J+gj Y,֔&f9sg6+7Y2( { Cq1Qʴ,tRDۮ`dBԭ6M>- DD/$$ʥ~0ni ni RqqR:x}Lۿqv2l<ADDDD g%2!WԅX.雙S#=s002K}A7쿖V8nT EmقQDDDDD6gEj O/xڈۥRDbiy.jXյbѹJ3b2j89`,elQ """"g&ϊTx!M>AA϶Ӳ݈^J0yVX=b՛ S=ga͉%"pk77m )S>.G Fh ;Iy_fY$(P5]Duӌ2 'W>EMݶZ߷[L ]-vvKɕ eĥ" 1׫Lb7B^aB"5g1ĂgeQPNU|>l*OXtI_ʢq{~+, T y fOtC}30&/=U:n^d߾?̲nyjV˱P48OI&&6&gR_D?N;m{Pd|{k"j \m'"""""KHZiHIy㊆?BZ.Xu( @*^^>ZvhU4PpQ,X/]!NAjNQ9QI!;7ۜG[#PK`4G%+C)\0XV1F5X .&!fY Hr sISԳdDV+ܨ13+o'"""""ɿD*.P>.,LeEYe1a!7cֈgt. U%Ʌ;U )C.*,pOBX:iUKecq 5$E+mT11c6H'Qr;fGD+Rb^J|JR_L?JU9i'"""""*OI9,+W< ?x.wqb,YCKx送gc򛎸O\/\zV<Qwp\mr+C2eY˒r\C*iTT;C'EsMYv6X.qt,KS?]DDDDDD aR^ɼgǶGC4 jfGhB_f%9_{;+S 8w3/dqKbNč[hS f9-` AWϨ mعf/\^ v }zCK?[ .gRS縰+ꇶ`캩wжP˸]?{IzGu`Y&T3aȷ@hjhT '`b,[&~a>nU{IQ87DKE6FKJDDD% ""PtpľgҥK1i$Ĕ qx v?T\ڱkw*Ok/Q)pÄk\ W^-`1qD+sDȣGp1.s/cr *3lTL,]:73MW2a1г+:uꂏD^:3sg@wQͫW#xD"""+LDDd`cc[zqd߿k[8q-}"UCЬk?uQ6+\mE$6N碶u)aΒ?qNZAhmzJ>UBQQ 7Or7[9`mmS9.DDD% """#ݽ{ޥ:7NT|l14pY`3jU~,c1'\㋦b*%ϣ@x!M>AAIWkue6#>~Sbnw/Qw$B$$\rnA mwe]Rl R[/՞."Ѓ]W랮pj xV EVid)=^0K2LHs3׼{Cd2M:h{8Xw_xOQ} 5kjT|úeFQZyca(/_C۾_kx* 0Kv#kα]4Т/~V~ mRMi}vUSiI6oS5H[k?ѧٺΪ/;*  4My›QGچZn} VM/Z]j[+4ҢO;?բ|gkhtx ? GVZZw_>|*++#%r ϟTEeU&Z%msF)ةWlCrmHs9: t(7K/V}}X7Pøl-ZP[~+>`Vikl:9[ {賓No 466*+++eL$(iQ'ҺoHnHաwӄݡ>*:>AT9Ӳ]o٫#F >hH4" khEm *a\B5 #.d{i꾃ErDrӧڶm2+ϦOQ*xI[?إ`I*ϵek2Gڎ{鳓}Qvv+???s%Dw-?/c}rtM1@ ɟEea*nPa:_]b)7UoM3XC;轪&j/^b\v+9\_zUzb ־~_״ɺ]p@5g :R).}C/=^7YQ_!2w>ҕ#K~^+ R@Z}.~5VK/+gܡ!}'!lzIq/pg'n䰥0&t|UU}quoP>wn{0W+Viez}A};d&}EqnG=K-z@kշ=:s=SZ-[[3*{':n^%uğ%R3FO;^;KS*jCOԑ>*5FSKEw2=R*2[8nl{lӚ/SG[ҏ2[vm^VnVfa95ީ%C%'~I'71qq~}>;QY~aHcE0_mᏹ=ǎiMM_c'k֬\ٺՍ DvIuP$?ԫףw9۷O^3f`WI-# /9v@nj*M:ׄ?>A T$#GiݺuӠAJPWK{ԫ L A;wh˖EMWFFnԤuF),,d@'~Vz"iӦMjmme@Э?7nLz.|!@pi)-- 6Dw៽W_ݠ$=He 4Kc J=NEErss"S!k]i:]rrr4yr詒<n G _l>檬l-D߿_UU,ZVVzn]ԑ.]-nD^^>c_N}UTTE“°>g`02! NMNrQĮCK$ fވ} 8}אC%$x܄%vdvɱ*u&=\.gHėƻ.؉l1"DU&v SK|.5/U&T7:Hr` }Uab7(:VW8 r$k}:>̑I*fA#U`bxY6=5LO['3%MIlav8:NDZ.NbgIsn+KdJ`}Ib+YC%'ݴji8)Y55L5RǪĪDbWN$nvZmb6 '>/a%h2)4l[9Jբ^Óؠ$ql(Ce '&nH% IfWB*JP\!'H$)_5zRyi:^j9$!rmuʍ8E lWũ",8c@J$$:\vp]5M8 #5/!Tlg@.4'vpDT$}^JJfqÓH/k O>v4\\)Ribw]ez+¯xmv ^X349Hz=%1Ng G'P k $Q#% pr $_HQg7ND<_c@zNh!ntKQEon_A$vIIENDB`DisplayCAL-3.5.0.0/theme/DisplayCAL-main_window-shadow-Mac.png0000644000076500000000000051277113242301274023540 0ustar devwheel00000000000000PNG  IHDR,tEXtSoftwareAdobe ImageReadyqe<IDATxنYI'zw{` M)bR~B!JBB'p{v맾J+l/%;;]7 4 $D"H$D"+R H$D"H$D K"H$D"H$,D"H$D"H$D"H$D"%H$D"H$@D"H$D"H$YD"H$D"{7cZ)I H$D"H$R3K&45 d PI$D"H$ $D"H$x p'&H$D"H{k'D"H$D"l d ^$D"H$ c 2Ȳ$D"H$(Z ~H$D"H8Z+Zqtr ZI$D"H$҉Z Z1z2H$D"H.ڶ 8-D"H$D"xJ'f*_kI'`IH$D"HQkk:4WB6 m dY+Y3D"H$DjjZ3AKTm30k?. ?V?H$D"H$҉h͑- ȲV6TD"H$ԶڿFIkm,U k}Z&%H$D"5G7TcOK.Me-a$D"H$)\QHM%QY1rY ng-pQH$D"Hk"OSQtւX̞T\D"H$1Kѫ5>ӅVˎS]D"H$R@mS~Ta@9'kh-A.D"H$`51X#IgL@ۚն)mImu\D"H$Dj㹚`ٱ-M€X]zG1cL D"H$D:.Z@ pÇx UlD}Ta7|֨ aS@)QXsu9۶oP(4I$D"H$X`6&zu+G$28@y"pMu[d[bZ}8kӦMOk GW8D"H$D:t:qwY qclC][ bznuLztEH$D"H^}AA,KDhYkјGƿƂu]8'bJL"H$D"N VI,m,-Y}¬= *Rv%_-_Mzm(ƍZT^k;88c d cZŕc9Xtd׭N OIQHXDJVƓH$` 2Al*`Taـ9ȲFloLwd묏b4ؿzFཷ[39d SS/AZb5ضzY ׽:ʶ~ ?{! V'>|=.k_B[L}I"&xe ^nj?;EB׸jEh7lh9D"لn*0cc[dc^B,k+D T})%_݉M)~l(:̊}ٮW&-OmXQbìr,=JȒHdU!UGI]`;wS:c7 w %PwߏރO^|w8}Ǜ^ĤV𿚵;n@\,ߺٴ&spݽp^?\y>{`:Ev^p 5o;>ӻaywdA\гP޴Xyx͑s0CC( D"dl2hmNmq7C4'6bmCweb#)t}*O 0k1`,kL+,oQ dw݉E$VrQ?O(C]t`݅'Hft4&JvtNj>/>WkKꋓŒ{@qq~-}>ngbƵ!㭟  p@tvebX5< yu GΟƷev.ջq߿Y6;e₧_ʷ_G+1f8\&zMH$xY-5'6~. .6b@:#HdEgVا"[hCgOC 4o 4UU>{o,|ûh58CYfW7>POFr 4؉S|8p֊@_~ lJp?AiZYD"%xQVڏBcOc 놺WN2*ښ)/=r* xNz Xtb oCywN2$XSqjԝD"]kc؊Lk_[KAMM,݅7^w7gWMAQFHE,͝y}<3G>7r*^Yuf|;q,NWpM= _%!假_!}vEêbbzݜI$D dɎjwRMl,݈㝰b,lf4<37x;Tp:*fr̢k(roC;/խىUEY #43 /c`QշQ8,tPE?nKWT?+G뫪CX;z8?9*i Aؿ3<7}("K"H ۽7n &4JsyX#Md#Ǡ|:8ى#00Ī(]"m<Ug2;Yk9Ćv }*oTrޭ( ,^1r_B"d9xڰu.p!cϊxoǥtp9E ~!><|M8;+.uuǏ͂_s~]΃Z[IdpӤͽ|uw?; ~s~vTtwv>ٌyd{fDM7qk/Z8"ol7<5G80=?m 4^V g)ax2Ld6mw3À6 tp!| cFa_"u?.9|xIZo?LS?U8S*_Έj?|Og]$tIAd,8l lCY[qKt7%SCcb'-/6lذ<%//sR8Vu^` ߨ:ĦsQ9 jWE柆@љ:ĦA,˫Rjns8Fǘ܉bI$P;XՐw/~q-8`JL}!0$ggEoGVO?8<~qcF'D"HԠAF|ØԲ uxϓ=&{@8%"%t!6zXT?Ddri PRt\H$Rt:0BIj:ڝJ8Cxf178gŇXiv#zH$,dO%66QDd[#J6pDvݺuK&H$Rc$n(BF~>J bǷ;-FnŰ54$D"%֐!C"qD6Yddρ4m "EM&$*R H$RŘ ^= %H$RC8dȒo(:jf`loLe{.H`KD"H$D" nX6K5q`)mpӉ&ܹ.aD"H$tIA#rD♉[ dYҝ^'exbU9ˍ(v0m l݇'?O~'?ۺ?#5j Em6mɈ,Ka]*cb ZO43]xs]b&W"?O~'?Ocb'ݒE#͂lc,&V')̊mj0SwA'?O~'?Oc^5fZ~K%1յ8Hkc5Hڼ;~Gzx'?O~'?Ql5]E##iKimhdaSFż; Nܼ!O80x'?O~'1o c5~ ɧSmlQm {cl0-y8<_('?O~'?RՒ,"]Y+Pc1bGDx+=xkK%#uW2=BcP _q6~)PvnWT{ǫ ;Kl!2U =zB}4M+ ??NǃW݋u^7+N pӈ(rΏ ģ&䨪xdrh=~fWG?{ /B _x]uMO~'?O~;Ai<3Rc!O*݉S鶜26'IN5vE_RrǹHK%;\s殺(L&@!ۡ?ϵqc8"dLX L~Ҳ=J8hj pԠ0k*[;U`n'BN]p>pcai^7+SZ[[vë_X/  *Qji[J-yՑ'?O~'ࡤ !90iHXGltޣ^嘽~XT0jf]Lzb 1gnl?h5,3bCš$w(,oaWOo3c x0y`? jI]@O~'?Oc&-Ci "pjFbl!a$[RCXe1U=+2G 5ߧ-3+'?O~'{7Z̾A3jANP㝪T6’$l簌0lN.']^N ^*Ňߩл}7X kr2 _j3PĨ0k;=qp̥aeFu@yf&b3RGճFBpDּ1D"H$ԆYOVnD$ӏFm%> 5ޕE8ۨOb3֮^k|쭫݉{i]{a59|,ޏ#^Nܸo? +ʒԐ90\*^fV5†.^%Īa%%H$D"ҏƃd 9ehhYreDJZ *EWmE(RxlJ8"YN_bƆ{vr1A+̘ŇQ@O+C֌EV1[΂z8-ȪzxXsLjPֆmH$D"H4*l,koSƚ~l 'LQG^YLԱ)v,GרlKqsyuj6qcܦHHtաhejTCNt-(ezr 7q)쾺^ ݈F2 QX5-R{ Qs& '?O~'?ۊ?Mnj4:hdPGc,kcK6OXc.@$c՚ƢׁEk$yr:`QS)T\]\>n_o3΢ޡXL3o_EFIznŲejsZ*)?;mzL0M5 ]-W-AZbS'?O~oi*ӕj 2^dV/ے ,ĭqfl]8VluEf*uJ зHVc=qu1~p(ٝXO{hs՚5eadQ2D5YfV8RVGaEWbхo ҍZFv"vOu5#?O~? cf,ޢ{47 $G w)Ftx0kNXΩ : k+@ccc}p$9t\bg᲻$g.UPepA5!"Y2ywdXiu(f˸0fNHt?p8Lu|ѐx9i,Kˎ6  `Bekj?'?OO"&گ\ \2d'Npd"uf%(%zYfGV,sZvl=q>TM"pEl>/21 wToZ5זTq휟kvB]aFU{q@Uu؀WsJB0"jt2,t?Y\t8e_<'Ea# |$4.~^+z*\xZV' >灟5deY'rvv73>5^|ϏüQg!oʋ;ɳ +v{TdwVwh]{~'?O~Oӟ+ոH*]e ߌд{0)EDS']q%"jG+kۍ ompYg ]57xyխWV"OP-{jOXV\2d&>^~Z399GЧ.\5mx uGi2pKO~'?OH*GTIedkOgVulLvvkEʹbŠW1&&AVY "}S%c\~F@}2mOo=ϭл3.]kv$>U-t8 +}d˕]ZO~'?i)j Z vdY+dw b!UU3֒̉)16)G | us@qSP / 6u+N|'U1PpJ,,VLvtDJGU >Mw,5b\:N*U== Y~ 3Waѹc1^Y>s.]h]W 2q.}A{-o\凃\\60j?ʨuU81U[@>=QYgwìj-q⶝{[egpyr='?O~Dž?da0oUm 2lwؔF-jF_ f-݈mz#uteqh@sjPp! `N@xEE J3$vKl55N [#^N>~/HP1ȗW^T? Ls(t[voA,P6lp_:kf}YǷvQ4ъzq"n,Ux\SGl]h_@VO$d Y%*aR3]fR苨~.:@:{$Vl\뫕cRexxqw"{7>ߛ(%/7_ڌ1ug>=!~ǜ'?O~?iw1 Aiv=n)m\ԁꏋبDOfIs,C wGuO CrWN'T[ l|?4KU3k]X&=BiZ慭+fPe٨u;V2,b:&¦F($,266ES,ˬ6G0_iϭ@2Rxyc0kzFc_d5_؈S_%^MÍ Ť#578=ݰ~^XL9e:wlob>l}+ty# WM mپo9f.,xΌјt0WVWY=T승 bSp%â>ʌi6Les6̩_~nj r<&\vY9pr3ҭ>4=F-k;^EW>sgːH$D"HcF, &> zwc(6`:般9̀P,q"{P̩J9l*Uhn T9f8PmwP%Kj !y3Wldv89494EtXܛ?E1腙c4F}~VyZ9:߸lUxHrF>%]5|eQ+$;˗30^ 릟X>?W{Azt4efԹ#FAY{oOM(+\<}Q/0KxK ݊ͅe#ƉOLD˺XO`YM&V>g9URϟqFgr`՚غ^|Y|{&c'ɒG~'?OFc 1!hh'ńVQ 3v=N.5 JݎC,I:"_s+4U9_jV;gSѷ#Cn^Щ:]*^aC2/s*GG`Ta f"2U:Gۮ=R:fg μ ĨK2 'q/_TiSO=m88|-;w2e9cnxKSe75rݹd5o(ɗmܷO!7nکC,c _쪀WN~)_w,'UwEg-˩j.ZZUy68eJtq$ڒ'?O~5tmVkqHPC]QoD9c-`)uߦϏl8 e.4jl|58G묲~&Ou#!|OAspt;0$Ěќcr};6,PqcC\Zkw?3?vW90ndN_ttn,KuX%Z W8~q7[ ㇅W}x _Y3-TɺI]0sW uQRqj5~!ƟsZ;u(þErʐS>ZO~'?ɟ.Q%c& #MeJD61։.0=H$֌ڭZٰ?wqp* __X\eP !h&FjJtUquP6P!V†bY=xsΆt^nq]"Hd3Bm )^i쟟Jܑ؞҃>圫2E_\=m@v]FWA}%rȏQ[2:CxV>ѓRyȋ*?ZO:s,1nz']`RG Bb7Xܹhm8SN*M'ۡ@^1;u޷>d=U<{aH'?O~ V:zlSl*}enX&{ GhDPjFDš)/;. O#%)$yL_-k=u{/ 3ؾgv\~J9imU_D"H$R[U:de,N8-~dar}+1{ce4S)?ے+&(P9D_(S8fT(qpe3WLjX]ܱuPˤ&j:wB:u1D=Mլ]4Ks@FK~^n#s~W0͝ Qkw4Pv\?gm:D+]9,A'q3BD~Mcs4@׽O-׿ 3F9sE:9Q_"B[ϡ$amm9 ^3%>^ EǏ}7ٷqkeg5c=7L]^MF~'?ߖ %z:jgmJ/h[?zEX4q18J vE9Z4vdZ2j`UbUhEeQtj|Q¿YCm!"_" +r:+13X4$pլ>}6jiE7|QXo *yQx$UNE#ALe*y9ѡ;v+"bW^\1y!}eq9|OpG+[Nz{~"˗uǵ\ڥ%"Yh]'/EfYºoAVdW~r}؛!rN[c%3X{.g܈oXDxO|&gDcUb5bؘՀXr}k|[.ؼ(PpH/FM.H|]&@/}xLz2ऀ7ol, 0orMt .9{n-S^}\fAzwӧSz@#|C^ry/|orݜK0?˫tOuޘ!F߯8߼^Ȝԥ%>Dv!~ݍ|{ad 8gp]q}Of Tw1j1&Ӌ/i//3qrd~}N}sjQ/4?0f. $Aթ29YsjՐfMʨZI IѮc )»6j@IxZfKyU}RO5f/rZn3f.8&>>XDf.#5~jty!,zMZ\] w]miȆ EyK0%pmayɣKHpUcXn2Vb9*g~%X~؈}xqzG}t)°YsqNo{7о{TDart>v}0s }lI8j"1YD]NxUAD:*hji|H~'?O7ѴfYְ'Y194+j`56 h,c2Be^=7sb"p3"":AwP }l`ͱ̀XYSZ߬Asq08, 6X}Ud}8sƹ9t~ %8zd$ݖ8>1^;.mlǛ5 {ۆ-{dW]f_f~[ߑ+pkPPPh`+K{?H46v3 (AG֧Qáp߿rDi39S<N}e[ى2Í֔Av]a:zE$<7hX5K)%?O~'Scb 6a=Z+YrZlmC՚U f^`Ӡ jèF_J%Du!=+ŘXM+ 6d,5:CAg`~] (r鴬ox.i +{mW% ,m؞#ol u/Jzuk%z~u:y5bD/" d/9s.cًo轏bǮ5Smn,nD_ȭ ^:Q2P5Vkl7\zbT'ϸ^ьa`z)P{CLair,@h42[!:V @&(Cfԕl(RfUcZ3lU^S뀂NܵQWN>:XZcG_W.I @Wx-X?Yc#,X|-,R]|Ώ{U=*|L-؀>؆1 ~G-\ukK0X0ۈ IKާ^90Hqk5FE||25.>$c7ʹzSl囥OH~'?OV7.Ӵ`5+s@}-$"~X5Ynw-p(lT7qk8猭VbE"s K`̐1xؠe]Re!1=@]Ltϗת~-8פXs O D*#σ1Y:ccc.F]z"(̛/9@vr22ȭGg/$ƀ:9]zyLH4'"8\ߋxW)w~owx`^F}h۩'WMose']XS[ZH kܷ-O~'?(9V+=T<>OױA-w-nLd&ܜ +FyLVV/,#+H4[2~}zfm ЯTD4VU&݊>VE Z5&z s82'ZW89%OȰ+F-8g̮Xm9o"(2f7||[_beOD$g~WM!_[gL7o\$X쓙^l#Kx'?O~Ǻ1lf h41~Ӵ8%o\{ˀXɝd7@?!  1͈%SC9;j+GƌJ5ʐs2K1G%~Q$iTXKqLܤOMmO~'?b6 Fm[jC2טY$63|U+CхXDKXImF4]H%|X-bsnVQWKE[znQY֊nyTCy ۱iۚ'?O~'Ms*1w>ɒt5.J.O&d`2_1!1a̶TKE4Fq,kbX-0):l͉|eS8ךpEո X+_!~o/9 ~'?O~?Qilkm uf>wbhzA]YԊh,"]M5Țՠ)Ռr)V&w;F6%Ć"_¡ReHk0X3\Fq|noxۏ'?O~'I uoK= jN8iVj|d&'2e,fFCF4VedOcSC'?O~'? eq_f|g]~{! 5ez$6`Ϝ e z :jFdU#\7zB#MF4SCgf4̍OqS߅Nǐ<4/u4sX vvڿ%xtzOܞ5x8Ut'i:L''rwC<_-Gؔϟ Szf{'?O? "x]i2uеwGDbazb'ѕX3Ix5Ss.4/(E'zJ \qsY#?텫7MkvKt?&}:w^KGqM;~. \~@|BnֿiS;ujOwJ4փ8 w^=/5 ĕgS/̅\77Ӛvʿ7.n[?秙Ͽ_gN(>~)0?-wPv&0s1Gx8 <C0ӥ'? dM505C. V&!?OC5#b<2Q2&6<ՀSXfhlPgq|EC>iay+5c;d/|s9|e+j 0٧ p[,L'tNӟlI qzдɧu0MJ'`/i7_0}h$KfS3Zz( ^j8ﴞá /0ëe~@}?ʦſ O遳®^5k|Ǐ~>?q8GTyOڍ%+D/ΘuiqyO~dzq?FcE~ԇOrH3㰘G rBUe[促>&li#[ ՜rGlUQ̐crXEdE_gf-`1 jBl jdא#>T3h ^?yy$*GK>*XW7WƢ?zϗuw|:bRKo16ysW;SOvSRY)I?}dpo1 qCo=Wy3~mypA)۷7'amspA~(~otk1ե8i\>{:޿k/EOyh$8&G.Td{m_)~:<sCW !c#+p[U&> y5%5-5qx|?+ǂpZ͟Bp0q^#¯EucEץҍ: il=7Fya?%~y̅ékl͏my||~U~ns_@ `ݽ}7Lxoz0`6 EY_cck3~]w? §~3n/Ĭ_³EXxhYO26ݰ[dW'j׷۔um .N|,6=7Egg}qxf'Kp?y4 x~θ$.~N> O.ߵ?{deE>cn➑)a|?znq\(?{/C['z8=$wuƙx"k෧-(;7,Y[fw8 ..,DeXqwNK[5b ?nmk]ni>'dn,k:3,4fC>/l2J!gzBo'?[OcZKԃX:jU/P;UI_WԠ>Ěp!p:ON2"]evrBq^9qXcĦw0`c/72'#e?Atk}=0iR,[Ġ2OrX|Ub4/X\fjOAyvzM5^ݡYF֞]1%ۋ>EUqwOS'5?^`T_| vbw Fh ](/eXս7~MߕD~|uЉsz/a⼏+1{2ddEpS _, ;sĶN]pnQv|'`{2P-0ݏlmwaռm'}$z~}a ^e6xI8v?9#^'Zdv͓e]~6ځ9\\ݽ u8fTvy~#؂Z)/͊s!G%=k? eς,-3YUY#f|Bp^ֵS{E_cg شc!o!9bNlS|8,Ͻ\ u(ǿkpťa7:dŵ/5p~ ->y=p@tAu|by"VW|/`Ox^=~w)s/b}xfwwWDO~o1?lW5s ۦb*L+R0ևʱUAC-#q~_2)jvhvVD^51d r5d ƢFD c1XDLYF-F e[b^ gh!9ש1U,?6"wk ~Ɔ0_%͉4.:u>'w 7)/W. prtLp؄ˆ+BG{.1=/" _}ET |Q| 4.-_مw+X ?"[0385zWķ~~_w/9v?3ݽWm=ws#YQ0ơ8.[w0-sAXq˴ޢ]6?_^'=_Fsqrygۢ`Kd(}qF~y0KnIQu3?>u97RNUAËod;c~E!{yqMc%UUi#ZTò;9k܇_,"?;yFQ}w B M:b( ł!RTT|m/b{{RTTB);Jvmv{{w) ߖٽLJr~xay~: vur0 M[ClƱ1YX;'swR_&ģ]gLxs"v`SsQ1)V`}|]k7siFUĮ7fzS2A Ƶf2].GTfBt"Ku1Y^'!?eY*ax~3a +k> oaJk$^h "jД7W/vci'o^NO<%xmN9x+苸 8$9VNŮ M[zLfjȮyr{[l΄a|,cAt>gA fq*dž3[HL/9'v68O_ _L$`jD:=|wِp}M<ݽĭG׵aI_DE!HN;C04blrIj.> KڸO:/IIti:L] Upy)@8֫!Z9v+~d04nt</ѼS%ELO<ExmyВNJ.9ra]bsILKõoml]^.s'Ta+&:IZᬠǔKj U2T9ncUZ$Ol4^"El+&:ɥeI?enEFհuOnq :r{s(zm7P`^GٴQ]VASȅε(ZMkYu7 ;Tɖ$RLOV)Bѽq p: ?K6e]~s,̯<.vJ \\ X҃2-VDMmC"QW)H)LNSKp'7[v»Ө""G*\!s7:*"nLxQʠ: 2П {8~XGfl\e\L'ZInUɢlcz*ǔ&}.:@PE_/H-S @J0,{喈\m6-rcG^X2x/iq!V&wzup Nؼo8-aBIɛ1})9,?T~Qj~HVIu0(&?vb|Uēv,v?#* NŸ9ec|j n!'BЫi$R3]W_Ǩ亼+)FǮ?%Qi'£l/5qq7'F Pnj+]h15X:;E_;,9]CNݡFoGv>qI?|C_?_Ag!p[s^ZBDvCy'plDWHCܰm&p,ICmKS5|v ~:Ԑn˜wwՔR]VO$KR{q.6tdQA21X#B7c Z,XK=);ITΜ::_,>gNiPsifwx~x*ȋ ,fg'Hҭ xL : Yu3 'tت3^|?l.Lj|9@ S 6c %G$`l"/#%6O ރZ%-4T$C} |D]vg^ڈϷƱsN:B~]ŋ򱸋 ?,wuPoE 8FbvWwnĜwray r;=.`*xnnW{}ynx'@.>SE(⳯ߍcǁ߭uVs>Ff8|,,/!`Y*X6>UpֽHcBГ5]\]cUdtu>Jh 2W$ƯF:ozvQ.#S.:uy.쾰km!&+ ;&Zp}OX[Qwpa>l@N~: ˟A(=߭l"ߊ[Xpw"y6 Fo \K֡ڟ1zbD|$IZw{J?i|/> ፔba aQEBac1'>a4)P}E%:($|}Ih,(B^Jx-+0ZS&S입^[e V}=QM[ -kb⍕e;|XvGoS x%<%>R.:|vyMEݐ$;̸$&?w`GV]!j,&b ]ؐa:FVTA]"s1+b}zŶ1s1qV/oMD=טQr[OLdsUg#aMQѡ˰_T?'xY dm [IE?`ZQn##jTEK,f5oInO]'۸JUtwʤI3Q޷Kݧp7]1]p+,ZT(`2Xp!O*@8 6vث ZQ*K0H8XMAꈡӥL4m;_v1]mcSոfMzD]VǑuȡŒߩz`ɗﹿZz<6ΕT+-O<O<O<Ój VV;s6Kb>TUA<.86_V\/aw\UqX})a.\Y TR#˭!~]O<O<Oeg 7VtxYmX=ea79@<O<O<_9l` Y_b.UK6b6 ˼vSa"xbXvǏ5ՆY֙Dl.XC!R1Ԭ1?,"󃣵%x'x'x<_ƭ̷Hͮ)1Ye.U36Z;bʲ۟ʕp^na.#zc]!G}Ն1[0)ho[6)05 kp2O<O<O#B֟gVz҃0,%>G B>#me='uV-إǎ5 *fz(w" ?mTDR ).A{+y O<O<Ozތe3+CeQ )D(9)e˥X9XrSttDVu=lL(UrÉ]nǘ%1!ղK%'x'x'$d%fgO1 czI,{k8dHx!b vu_0UC?K&6ڡ.ZމfWD6'x'x'xlĬ`cTYD b-zbV}le_*vA f cV#~P>VɥvUsE2tIlv*`aC[Xu]'V`x( ?>G>O<O<Eymn(.׼ Yy`{?rx&Dpa(5f~s؂`xؚ_W+tap.Q:'Qݪ #######RBZn؀~EsJJ9ST@ r*r_,j[G=},<Sdghu֤`D!4JQ[*G@ּr8xVoVh7c ˼6deoǶ,Eqd{ ?ѳY%Ԉ X'3֜@JҖIȖQ1n3[>l <{ax-!*B RÁ% `^Xf,z3{y`K `EvHkmk\+jv$ԫFdddddddVibdnw̕vnÍ9lT%b^ 50e/Urd0*Eb!ҒA *9nE&z3*R?B-pkY*b*pᏣY+?|/NX lǽ A1w=<3g|ҕIȖ+gWYS]NK !iV\ʓx[]jnZT)xG_ӣn!^a艸[ڐ}[/\ż_P222222͸/D\VG| k;FoL:4ZHھ密CeeúyCЄM* pp;q ê*cOKP~TK.IvU֝=hG#Buw 8YYm.MlYq17cM̆Cp +E> jXuҥZ4j\󄡆ŗ՟`X+LĆů&77WvEB)p;4kR%Rp*EXu&C8q6dPZݫ\6dg /򅼍YsYQ|WJBddddd)dJOڵ`G+NgKx SBVe*Io'ن{qKPת;5vV%3Y5з巟3b1W=BfG9Y\0^Ͱ9=+bQMkb:N8.M y]H>)ɞ<ptL=f J8qr$X'u4ec,39+ 仮f̞iD ˦A;NJQ;nG**޾ E_[`/񈏏GZ Զa&Yx-Q!ɛסtۦy> ߢ~&hپ6o&Sfco:3FkڠuCib+ Eki9H⏋5Nک$DFFFFC.A+l"]$ v] ^2Lʨ*֊([$C IpY6a>(V"..jL>=&o{GX1Q(7/ :WHQ~h/y}{GNM*6zc5Ӣ ۑҗIȖ%MƕeDUm]+exiTOP\Gx;E(qÎ]J1 4O sT#qtZOr8I@zFM;{o-QQ;)<>_icaGtH~o O =qai؋*6`bԨX>FSš.{?}5%U""G^1:|6p_ I?;X@TYrs1 %=f,zmgBBHmuK^'pUw827|DlUbTWH|;Y6Ko?cY9]L^+% >lݟA_bL7 {]82 ߌOAȸs&8uY> ]oWv:t_߆8i4ܽY>oM9-7ۧ&zC 艹5dddddd&d"֪-oZT{3V/Aj.moUzs|t(@?+9 .,?mu*$N#ud0]wl!73/a)yR+ <`?R7>Ӷ5Jk̔le?x76_æ?ٴMغlJc0JcYmk3ZꐮEXDW#әRԉ 1صe߼~S c배\]|4.>ވS~Z>?݄6)h1m?$TUߟN$W5Xc"ֵr3*r.˅mѻN;+{V>`xxyaKP+:mPvGu8acet|&sI[~e-xp>* !p(hE;!yןX|eZAfkyR#O|Wn\豴J] 4Gn.l1]1uhij_S³ؔec=oa ៟N{o,|HTp`l8$/}"|X܅3F6v?>󁤵.ܞ^zTUG t'o?u|B>S_ZpRa,P&S6*lsHw/P6{~V3n(G0ϲ!BŝW誏M p)(yKL_ |Br.4_gLEKz~? @&&Q.È5jyUl*^m\ƺJ*bˀDzNZ $a+n=u¼:6ei}c}Pi `d t`0pAGrcRCl}z*Jq"ְ ~ɔ7=ړnY&?KںqF_cb By A;K ", +\>PN鄴5 p:w 2V2F~4K%c+E"VWtwO)zU2Qb ?|lT3xCUv*k! ##### 8!~ &~ ^YG˞aOY0r$ 3qV\)+![hVBQ{Ռi{<ݞӢ,*5^|!dUs͛b9iDZbwE[fVpS'YU ef/-+JJymb^DCu{ E,>PD$ίJ82]@Af߭AC'mA=B"1C U=1fc7߲=qϷP٭HB8Z|LaL'A ٰٙ"#yW{6gp-\ :5E鴪q=Ғ؉x~v8RkGaylaZq}0Xli@8)']<; qo;(4Vy;Nx3ڄ yY4:} 늄p(y\ }jEp 9yGBz5z: ljZڏחʕEsA*|"]/{=! *lWNI Y YZ~\3 77\%4Qmmm6>I9vT)v\~Ҽ~Tbϫ2ܱj$>{tʤu% )eY3Yn< O;t-o:U'[|f>qoe~gOycϢ(ZŢjPJy }}{77nW#u=2&ZwƴWoƯe֝1 (QS?Bz= VF5ϥ^alrpXEDͫlkSH'u2G0$Soou!v_ԝݕAź]cУs]3җqPpy}7Uvm<p X:1[=~&vl,w1\Q`Sy}"r6ʍ=;dl+mvQ:bvd;ߛvݦwoeڠ[sԕspH=|Uۊ31C!&9$ɵUƮwV>O0j QAbxQ-݋[>]sbpư& G[znBz|9Sé0DFFFFx]#)aM췼&P7xf1_.b84aD>?g3m(Vdv&䣳'A_R?&TZoz_ /,y'2rϩͲ]=:yq.A͆3ycmPz>>?ٱ _(9vR+<B#{/(~:p-(:`NJP?!x鴥1䡖{l[&cbjw%4{itIKI",@Mt B6 v[;EER-l#sDc^n|BU~[Y )o.DX`R6͖KV#!Fm+yx#kM0N{yg,ܟ'Bf_-JK>{ͿNKR~ lsPZa D` 1?d^T:Lv> ߜJ|K09ꁟ+ƒc_F= X3HRw(_.Q2[8.Wj< 6Z+BU KVFu)W^]\ Ҧ 7_cL~Z=~^Kş3BJr0~_dddddddgU-8r>@]탔/s9_o}I/eϪ.fx_? 7C&_K1߯9UćF' K1[s&hk/*3.T~+ZD+Sv>,ij~.__YlT\K|QZcsm[s Q1<`? %M/'x'xVa2.l}u.KylgMBEI^FZq57eW#IJIrgZ͖/'x'x(!jU2Z"$dA#om!"6W+,o1~O<O<_)>__ dd%<0!'x'x'IȖQ+Za1Q47N'x'x'x _ -662!҈/Zz] ˊx'x'x≿<a6O<O<OxlZ1~\_ns05Sc͉'x'x'xJ^zՆscaO<O<O< O@j.w>vx'x'x'>x5-= Zv 8s'x'x'@)8=fk=ް +|'x'x'x<nzO_xI.wgx'x'x'>y5ݍ7^Z05O<O<O<Ó-ژJKœ3ax'x'x'>xnj+7_0Xh7B<O<O<< -o~ BQwqx'x'x'>nAFLc@a=zz"x'x'>( VTYMsH;RGGk#> yn傻j]/J\skvkۍڗҏcDy:XJ?'\ώ6wG51*4 -[gAڱJ'![rCxd^픹;_:b B^7Cn];j\l~oe>cqx26oXZ 'g,ׯe?_5oƍ 66ֽ=4۷ޣ'zjժyΞ=W毿v9(;r$-~Ν@#U.';v?g]714;cYط|64K<`|%?=aӻ3)/3!h1 Xz0plC(NA^zr/X-"ƅȊNTo.TgIعXY}8 @O|`$d˂Bpkqq_/Zl]wܿF!Юuԭ^u*$QGU1_4ivĢifطg{"VjժLv_W "6FN\r˅,E,ߌnɖm8KXnsS YE̳ٲޝE:qT U/ =%X,s[p>9ǷŦ/:vt8{՚%㷩Ä/?-0\H3]-[AVV&Ez}?yyԣ-ËȨr9 X2bqhݺ=z ˗F"EUԍʻppwÊ8q~, N=:w! Y_Ij2 wpX8pUC=6V?9on޽~{vaoze/aEoCJ+yPDlv z?{ -9Z= JZlc҅0-"sg ^ bu}{v݆7Jr=\mvl_)nFˑMv.cd]} 3{>O$ѱ{AuѹSmt&ރצ$?x0WЗKUЖY7ByMM Fb']dG7"ܷ/[P?1?ݖTR_Z>8\˝6~]\3-yR<-/ŏv ?W%OB6ཱW5)̍}*/.oQbPTgfe###E{] 8vlsaAp!/`ݒCx/2_w "'F (`M_`FoL(_CxP$To N>_<ևGaö,y_ꆾB6mqϴd!'Ŋ[{($>mj"9?pX|o~̼]1?9Mx _PՄkFF~sΡJ*Qz u}wOs>_6M4¬Iϣb>_>>MKN 9s*cܹpD}{\86k`)?p`,fWl=:f_(z]f~ b+,XHx?evŊspG׳wU+b9r.b|فpnv6eq Hk l?7 g0]G)jyGSI2سG0\ TG[bj1랚|8{*ǧO૶lf^E|S}2ФE05~Y|R_;e/]K/o߱Iӧ"(f5QŬ-1XXPUCa6#%C"E4 ÇعlD|28k?vgGUœG6Mo$ucq_z]+_V=L>w좳"/nqЉxeM; E-Q$ذvo_(m^#+w|,Z9V_(J}MtE.ŋc-md#S0gVcƢc̥K?'b G S}ch {Q#āaC}Jc<ܳ+v؆[|QlxFvطʿ]a .fӱv~ :^F;Ta\h!O>GwA89o/?'l{dao\=\nv SZ܇dXҿHD>7cZQ.y7ܮs3,K>ˆpWEI 3qB JtZޮ r32Ez(1QUE(' ~a6ޘ?ǭީ9ڕ#%5XN,z<:+dVdbO97߃)m1#0h[ ^Y} '<_៭A~Uy/Vᱏ#ru8.oH!l0bwMGҏ`o2d( ظ8;rJ;r-Ğ29 H@\\EMǯ c:C &Q^एqR}Z?3o܎ӻЂCF|\q` CGbd2cATX9ߠ\[[r2B=pbi@Q`bV뱺8xʾ^wbWOcp/p/E.w'>2c Hq;Xԯ/ϻ`C:0tźgƫMA3Wy=w)RM=`O5j>C+ߘeMxC?o-}~^ןT?F0<:pd! r {A/'d6fx=><d 1=['+tp]9y>O|)㦠v"XELg|?+6%nmPwJ 0nۂWGv7-.t&p9Hxs[x{y<[rO JnAmmm`oPAw.4ap:t DӫX56 \n]z14I?l^۶NG؀}ÌJt QN |=n#e;p י'-{/3_sCNAms%:wļs!bXw:bVe͛DBL9~tV?TQֽg܍h>^tHHpH ~/YpMWou 6ʊP}G) Izwڣxrg?EStm.S⋫Gg;x(עܨΈ=ڵp&b7cxg4nwsJ~-0-0=o$d$OAc~G_:%S1Q+E'26!' 6~>uG[0}p,'Ο1oc8twNÇ7b˰-nwP0{$~8إ`^,yP)Pxp" G{ C Txr"m%kc&ڃnt? ;C;qa r>;pa輿߼8Ó(/?9ڼ 7쑯™x?L܍_'ݨLy ?kokviF^jsUl̈́l⓿'Ы~r0{|@ժǀ̽>,޸s)X|,;ɲ ؼe+m݌/v7P7~>I)'P埱f66,~uMbG`r,X;6}v_ l[پW#5^,[q"Υ fZ l·21;|X9g,߶ۆ݂Z p/fXvϷOț6ea㶭rZZ܇>q ZbxYz^OpAߐM)~֊qMvǸ}\~Fst=J!1,X ٻvo\y{\MWc'e+6g* {6ڶo<6uwӥ9o@b9go[08ȷsDx0o?1ϵ/K*R*I~lAxP/JzopKãd=;~D5۽s[EvPgf&-PYt.65(L&laUB_!ZUTя Ac?w|CO/G!㩬fn"vga;=߂&2ҧ˃qSxGPS4yJ|Wf=x쭉޵BwVA1qao.x~yш:woa_ClD9!zE!RFjf?Hj2,=FBӱw <8jˀ~)yvN:4|o4nQizxnOapO~m|= :N|۰BLuHʣ+D'~I"įضʽ5ޅrAP`E{^ {ADT@@DPwPA?(ҤK;$4! .WݽWR ٝٙ潙A}c_xy"VҞo0OYsCR8􀧻;X!~/EæKF=5ʱGR蛌oT7ym]jL%g:lב;\A_mB] 04. 鼛ANpvPNJ^Y/t-%G͑qv ʩX}\ykx~Ô1Bh? G3Eq?WO",o74?6ig1oŲ$彋 M 3޵7{DobXm̪ o.FnQXߧX{@'ֵcٓ17hc p>E6gO72s6CO1vG69|f-CѸ> Tnp?i{uzzMoШ`~WFI-F<)%F5+8S[sf|ۅˑcrrv"o?bsaqL |uvuCb x5N|>BSlVgԶHQ]1ߪNyf VmNk>\߅}O=W!jeS0޶-S>{wF cfcϬdAdrbX shףECZ.$gR6?F )cD1X> rI^d֬(A^41,#OW' Z`η<Jy]W,xCQ[5m3O\IqP?[%f o`eN,zX=ӟA5۽*I9Eg؟Y֟y5ZMs|UO.yřc^$;M)/`uߵR+ǰlNwa;B/|vbS_l#w|NTNvP7(B(q},ެ[8N ^hqqejx@w\1?,^B-w%K{νs=%xpm:PgNN ;:i,\O؟H܎Y0N ĄG#35/F)@~.ޚn5E;pIg&lcB;/7̰g{V yi"˄aczt@E6ן|WƼSv#`NP|8[<4g2׬f^_7z>.f³c"hyuަT :>y'vNJs.SZ\ +RN sq^"RSpnr3L!g 6/Ϟ9\tvyAx,, o^gwC=e;7ko>Қ4܈K15礲$ܟ#U2!E*g,el8w7|<xIEGęko=:,iib~ը#dQ[ǁ+p> K ±fGya#5wvFC?*^l&cax^ jrm=xTX<Jeps/)񜍻*[\O#/]^غU7NbРٝ.`0!:'rQ.j*qzO;ԫ252pXcCr!7}?y7Q92] cD^h~Rq3 zY[76ZHUjmZUQN֒[\yRdK54%5g^Vx/]?GJGP& *kU T[MVXc]|*U2g<:jnQ2X gmV/ gq[6F2)- FpQuFEf\g@Qj> * [mS]yS︙E6NᓖC۠=jilx2nQ^[|Z}H}^+ҳ &ڍ8#Pk|Ԝ}_mrЗǘ3V#1?^.UYL R;l uBhtnh=sj<kE˄X3=s}JgoþyC碑3sF8jҌWL뿤$r[ꠉى&>+ +㐙d.))KʕXI~)M*mZ-+WbΓ 7-23RoDjbFi|[O+ʌC sX# o /=H)Xdj^z 6\k @t-VE!%F8m6nzt [(uwY/yG(ZŔ%+q0 |D#P~<7pR<7/~@%tN5#F"LZa8mCbVAqM32۶")&pml@bm'plֈK6lGb?Kqd9wYpSkY>k +1e9f.5QulX?寞GN(~W.^4< 4./³Y6?f몋p"ҿ?=iV& rڽˇCEh6b ;/^{x^Z>!1 3(֗=ϯ zdd+fGrt|ǗTPf7>qĠlv _ߋ-znmv>) s͹M[9݀ AȬq<he %\pOҗ[[ 'Wczx4>ڀb[m؞E{VoR_' M刨=PdB;y_LϜ}u+d_mtޗov~+)l9(R#x\d\B1f̯Z NJg:Az ;aۡiV'8w.Brc+R˫־mr#**"ȦӐ/νVM5_.^7(P50v?ͫ@τ5 Wϧf 8'9to5t4Z-.^n٭[m;ڍv~^)ٍiܲqm Q)1BLfoU(S-uZ@^5j'6OP#ȾR=-6/T_Nu_s:LMBbfHp|&.o$Ɇϭa<|L|NN|||?}} Cc҉p.C&k4ZKqzƚ7'?4aDw0nɾq-mߟ0rܹ{fo2% q<2""k;Z _7rslC l4 *z2i:^[1~o&@wњ5 H?aKTrOBL Ɵ{'E!B؍AQ`}< A}Wu1Xj>La})txI*kCMiXɤfvn݁hݶt~~ykXj4*?tŁua1x/P 甈ęYcNxAJ ^W 9Υ@\A5 npippn)6k޿ZĪp㤧i"Gy9,z;iI~HdmVSX|I%^5|=^ ٠xvacP1u+7DÆpF-ļO߉? =`W3ݶLG7ϙ\+Y2˗~eћji'-z˽,]­d&blؓ)(/01@z D\6z֪FҾ€uSu#-[îcp1fɫP3SL[bGQǦKo r!7w q/${`Κ5&mۄ`.b5fm^O~} ԧx*S-u.XxMQ,ھw ;[+&N)o~ԱyP[AG|i[cm35 lȅJ<{c=05oNr xy@wf)ܻǏ.O J,.l=uj 9FfZKL a,׿j72wzԩŔR0NblCzM7VѠZzcVf88۷3:Fy(eĺZLrwwz'\k<8fpu]}?G6Vs1YA-(T _ 5OYG\6>>37rBABfЄ 6^G[YƟ;s#򉑗qij46kg*s셕gդXzfJ4? u,|z̃k9WoLzRT1zȐ6mЯa]yIӷfeXzxmZ^Qt>%% k祇Ļԯ!_r?9k_ì!;/ݥqj-Zj\cS]hxX7:rҕǖT40TA{ҡ˴nۤDj3'OYF49XLgm\6@Axo Ņ gxYL(j5ʂpl$&X̝=z' D=xg6T߮j{l*H9|O XoP /[:.j6Zs'AJ+s/Gb@Ӿpvr©0vg/޼4 L' )2F//w!1Q/3Zf9zO+reh+reh-+reV䐛}?a^O BxmOT#/) [VgqgO|qIu`KI}ɌOw36vusgA.?RebwѾgh԰/7uz#>oDGEkHͼ-60e|*Fz:u@i7ή̿NEaxXgZR&ԝ.Yn+]63+ƙaDy۷uTP'[LeSi~˥ G i ^fţ|P mWeʛ~i2Aɓ"Y}ˍ3{9 gYT(|``݌ vMz;^пw}LɨQuBV䤭p̍ Nó~޿CYTe`d|bf6 kr H1&WP JSK)j5<,}fef nj|fTV^V+3nbCx\? ] Z M`UϪ#7M'8%=(g̘Q9G3ۗo|~?" {|pџ !['Η(B*G??\ܜlzK>;.DPfBUÍs7uw}"m7{a_HAy^~).++1!)U>>tq6e+)[îr 3U򄛧̎ʜ^~ ¼jןRaݥ8vxM)OWԪg';b| ?:|ff.' FځkrPek_OGv)LHa9CJJNɣT-CԨ=t#ήqաU'!B0O_?[0=+'*ZVZS Bwi5jŐͮ@ɖˁ'6&b۳3_k1I#ͳ񼭢E|V6Se:7O|1k{|$pwP:y]?ZXq:kĸO<O<O<h<)%k`>vD3},y xy'x'x Iu`p#3[ fm'xq-v%'xx'x'Pْ`˸^Vk"x8k]Qx'TiG<O<_ _CX>kdб,mm1Mom5*O.ϙi~'x'x"8iavk'x'x'xKvϸ[g݌ӻA<O<O<<)[ $k'x'x'x'Eց<  'x'x'xGKf(={* Qpm3޾O:O<O<O|Kz(YY3.LO<O<O<`<)]i;_8Xx'x'x'yRdKa轐}{O<O<O<“"[BXSFۙ>G<O<O<<)=[['x'x'xI-!V|a0'x'x'xI-VY{-g.,O<O<O<ē"[YC^ x'x'xw .d` s<O<O<O:ZH=ӽC<O<O<(<)-\F<O<O<<)n=M&ˎF<O<O<(<)%*k”Vk'x'x'x;Ok?s{SYwNZmU*uX7{!Nϗ/,sH>_X'x:Z-?'x}Y=E/~.0bET4i-)q{1|(._h|~'x*esNb~;yۖ'x/<)n9uoԢWة/ui#<[~L6У'n=|Q+{=-~'x;qƋ:~kt*aJ?O|Iu| ֔3zٻƦ /Jt>VoGX~k=p< 'bCt.cgXz5> 'uEE<FUWSro`䷤k_'+qU#s7h$j<3?O<_T7Y?;+gVNVڊB6ðJ2o;m'I>[9b+kSc pa~ +MlPǿLѫ'il<~Y0Mi} m()-܉{43 u}wY{ulbW7>7E'`[Bm';59DPO<CYGv^:I*x\^=ܸ >8nj5pVà80;9_W܀)_B {۩Q3|V? Dmgf(b<Đ2њ1x:E`hGb3cig._lZ?O<_4ئGƽ0V >{^AX[qX[ms[1>."\ORZm,:7_)]f Cxhq_ 3;&(%38ȝ&7b{ƪZ}X{V[DYcN#iWtGw|+`C:B ^O<Ŕ'EDfy y޷qw9ti&$eY~zCc7pn >~Zyq+42Jܖ?6Dp=H6d\ŒlnĒs@ѣk'x'hުpaJ!܇,LIl mV`mgo qTr8Z !8CϽpNYA<*C dQ1uԨR5_& ĕ]Րn1ըmv'œ"z̒L^u_'^qt6m$ Im[ 9b4g\[bK0M84>k=m[A_cGMTb†ڐL,I{˭XT&0ϟ0XS /O<7*yO';)ץk+&ڊTΠ(.\Gnuj^}Ƕ/@cRjG/Mic2fd?6m&oPyIp =>d<퓒,#OE+֛GO<_xRdKU6gY7!C`½5kC7J891j~5k?\M_7 = 0 ;=Z`9- 3RxÍ؍6VNBrav saTI@ѥ4o _'x/ oh/$,t蝜m֒ڊmY (kf^r1.6icFUƻ@Zu/8n޲NXgTv+Y<76pZaF?4gFoM2L)l>'ȗpeaWB[.X}VaV)(ژqשTP鴀<Ǝ׫bn Nyh 7''y^X;w2mkۣKy:O<B[+XZ?ty:]HA:ßVo7ouMfdۂRH0bv.ļT+LBȰB'N)˓(ܬs|<6w|Ŕ'~'x(Rx=.qqI7q~'x'x'axRd]y4bʻxæx'x'x<),MEDmov0'x'x'xIu`p뙽l2Yv,O<O<O<"[{*Lmg/'x'x'xGIu`gnC_:O<O<O#:p쑰\{~(Ϝx'x'x'Q3Ț}ʹ|\یN<O<O<_JEV3zٻLO<O<O<`<)쬽d;no&uO<O<O<ȓ"[" E@X x'x'xw2L^9'x'x'xIu`o&/ܺO<O<O<;Ol _3O<O<O<;.Ol[o)?ua!x'x'xw$:2׎]n.~!++ 999^((d}]~O777)*7x1KWvcZ}j?r#E(`XW.AI(Q^z5R@ :֢zmqRc p&)*Gh4h!/  sV\ˈ'̻C&)7xAu뒌IZ>mȪ"!?*y*T2+W/ p nUB^jᅞkaf,\) q+sNJ?JolٰVT*:u HMMcԪU ͚5-?Em?`YRPY[O<^^^Ȁ[[Q'Ѯ 8zvMg]P M"[5`,K/ pdiFmySUml ?0NvQQXv8.Mś7oxL]Cyxx)>Ʌw'e'x[^ƒ U{<ɘ%?hboMf.[L\&,Ȗ`RӳaU01O(P@)4zQ/MϙzU>hIJs:3uzukgAٲeskV\nݺ6BY''{=_cbbO&ֿo}EO2k׀vUB5񕿒CnZpEz2|!OBBk :BnF 3@hGlHOOGVS:5R3a/ m6R9#F@zF x>2Sq,hq4"e:3 ([EVA?-ZVT^!~K9ٟ ηuVQܹ3 $*[Xzuر^r7n,ɭPNL߇9? Wpd@?j 5jA+"LM1J6R6|?񸓣sI>;)}oܸcǎW oM&UTּ> q<2(_NڄXe6pHXڵG)l eB[_}aĈY0tPkV߳gcqf,W_*Aֳƥ/^h٤.j.>ȊCаy34ON!])8:m 's b`dźhҤ ‡b=UѷZ]4lCٻ{1_p#4g窇ĶԅtTp{<hCD+jo&1zl~-]8׸e ӹ*5C ѵ!i1 3ΦWS4³=? YZcQBiLgϵN [ 7a6Jcv=*^ k7o 5B СC|vډe֮]+~-M?*֮ ҭCƵ={6Nhmx$^͙3G~;g#L1 3˱vU,r7ÎWF( %GJlLz *..ǏE͚5ꫯ#G֭[6<򹿽Eu w K^¡w- |:};BZ/H,RPaxQfJ$r5ѴiS4WbAlER@,;qx"1eg"%=qۮڵ}kMjN#Pd-+ ΦP~ o^xzWXa- WyXaj wƷ5Zńkؾ}^CŰWMi|7 9/oyN8S8U+9=A'Ø W}XtƻBE&"q^IJsg ̾?#\8'&1w ;w5'ߎ QmF ]X֣߯ r,b/?C b_kΕoT=yҹc11svʄ;Z?2 _qy=ۜ@O4|/}ZsU 5k:8zR{%1=zS픆ki8~O5'Z^v튾}[ ?-\Pg Ra$}V0?*H=8?2/mxkGaCKpx/.6-&cp} &qE-?Se"U/|8z$cHh(~XZeg_ڊǵxeHL4_o |`^DK Y;z 32qce ?HMHZ*s'MelxN[M^눡ؾl.ΨX6ƤWV [gmժ߶Kp\9w'Re\NfԅrV:?@ɟE2aq~Y/ǙD &MG)tr<Ν8saրNug`֞Xڀ"'4Z֮-kGd؞520iْYFr {pi;.֭[gq͒%K0vXUV}cX|pk{jO^w1wUNc?#\G[4Km Ɯ1]ǟ }t(~5 T߮/IE됷qYNRu@qh_ǯ`h}5q[cal^Xz=;5LNtu)Θ9{btk5 =R9\|r W^NF1! [{Mzj(Vϧd^ سcB8Kej٣>ѩTkS._^+uqz5BCYE+:KM.B̟9bwЧj mNaFmspeDS_OH1Տ0oB7TWr~ 糃Pqbw*8 rJw=8$XgBoxv\gTzzގhUk5~NJJ*Ð!CЪu+qI!g-6YphU52M| &g>sw7Yᙲt;X%*A)8Ѣ7uqY\8n.^8usIq:w.YđT(Uwn2HJ=YZޮ-:! *i̽[>v6&Ӥ"bo{8 c\J>ģqnSJXW m^F,2$%NkR=YK6bٸ0$&A(_#Zo.͍qr s"oU{뭈7Ɠp _ոqZ$Y#x~5W~"UٮvðۮI >"/:zk /2vm7i&K!Za'j^+ YTʉ'jvm8grv]W.!1UhzjքǤgڳ&3bމK8;<9/5sz?(\ -' 8&h5ۀszG|WG \ݔ%_Ŝv xkڕlx[OxE+P ( p?虒x qo5aeKo p8hay?&g1iHLT(*k%}TdӚ_V /Ϗ/H~3~` >iOǝrW⇏l <-Όk?Bh\nyb?zmE`ߗ}Mtgedt޺=w?GFW')mPA~3|4p1`3x?}fmGy%ZU6(qqu#:|'z,hq^k.0%L)NދѨ?(t;K#Dϼ #{߸{ q]?"~W? / ^mu5ٮ헝vMjoT7)o-z/M6=6lBc:WN|jFX-,, oDziyx}9487 `JNcpZP =KcXMΪr-JwiB*N Fn>~(jkzwnu1c:xwtZ=4-osn/IRY\m>zU~.k[Yav\q/p(6ZsZ]KY_QgWUaT]\|QÄ/WGA?`nbCH0,4J(-f_΍*zxRHET~F&ZdJ]H= w=W*G8SP>=bd=o>^ _axx!\Nq_fwf.zsF_/zUQ}_r;>>Xx1 ѻwoqق{3s%KYߴ6&w7E[ 77ƙ+ 딆U3ZJklמBl1V`alJ{ǼK.;0SJJ09qBz(B_D\Qz`nt&!tV$kC"~V+mzA#]JuT*U$ LB_"n/ZH)MÆoΙf}-44= |%G|Z3Sp&T!`a`+w 2Z=STӯʟ]e>gox"ΏL/Em*I݉hK)tޟ*\<.iPZfAWϹUX7n]8硋14I8 jxD5;k?^!F@) KC==`NܗVcY۫oG6yXBٵkæ(퇭5*Lky2g \ F^xy~ 'ZEu,9^x)+#vDiV* ĥ&bBceոդ;thg_&j;l$ pG'faVQvgY=8gj-Sғp7=YWI8X/+=TB\J3̉J g9Z:t1 |ʻ+X[kPu* mhddw̻Ba( ɟW l)c˕[Pʅ[Of-HWqaỎqط>=+ X0g+nzLA444rYFu.\)xד7(;ts1HKŁn׺A~իew {͚v7o%ڠ>}[f.Ci6hZQpq2.SS;jzUʕʢl*s' ηC$kOu=ȶW:"/\C'JzZMZ{rP|*05 ֯ߌU<1򮮦}%K ,W ʻ †?g3\q>3{HBW{SjJ.ՖRJP~EEQ{oA"$F^!$7wxZp`O4 Ztj.+ߊh\r=ƭ^Ysu{0֣FWH* Ejx,a絨ՠ*߉3bUEi$zwRL: M4VkIM \qIRIN_u1r\_=vUHd^6DYw^dSIVCifK tBuK{zO{{ٽ1uJd;1LEŊeQ[cgE 6~~2K=7^je MGs|pX H{MG457xhlGM.Foѩͤsbg*u&!6?=rw$Jȉ¹{nԩShl.6BardI@[ʢ.qp$c fQ:hl>דIE㣱M]ajT ֩`SqLQ6'^šV-:NE5@pj`4Kr"!H?}I4j/NT{m;'[;XO ~Ѵ0 >Oݱ:'󚖰iDy5N30k tnYZidTƝ_E=K, p֢ܡ#No@S=;J ^[Kt_`i ˀcڎߖAFe._~l}gǷhт!{OY|nbRop{pW okV=g$1$ޝtgNL^|м J6y-uD]=PՍU^7Sp];ɚT}#N@g᜴!NO+z!C)4R7th}+"ٌKvp&vthrVkyΠb Ҭ@bb:hʕˆ31uS^&X6J>inX  zAF7JR\le=H+jMهJO^ŏ7e/v",{/ _VF8kFjZCI4-pSZ9y3oJfKu5źNʽQiC(KalwɽS EaHp赼ts=c;7<{b0 Y:6ŒWm_w@JpPyyQvm8JG[J͛dɒLt$ŋ{饗ᑧCQ]GJXnGlr>VfZmEC(,V@YQ;f"(TDaI](PZT~>/;Zj7~RAyl#c`:S%g^/%d+jB҅i`?/ (Y.l"e̢BX v ]6v{}B wIVG㊡03cT)i-n4_4>V^iS!bdO\;F1Ŭ'*QJxPzhm2 Uе#u??:JCAjo~1'l H^Zعjѫ/m$ |1T4SnPQMX6(Bq8ZNSָ\^ig~FXҽ{M6e׳.#9o]/I~VjѽAg1;+W¸DW*q-G^' eʾ3:~4xȳW=3w^iOӑ'옅w[vC]2bXҲdէ{F^ 7-'zL9s _U*uӱ8>}&Z6mb̡8fbV^Pqd6ķ'Sb0fLo߀4cͣ_z/| {Ei?ڈT]X>Zgv.:Ե]k;>ǵ]{|yr |w-XG];~*d~+])e>V&8!!aIvƩkEz?:: =s/ƹ =|U *\w\$-) D9.У|}cT XT~`4 &TLn(G߉IO8x_r1 ))33~.GvћNJ9oB: *x!eǡ^0Xb{U14c6XuٍM]n}0;ݗU`0ȟQ֨1TP!O QEFdU٩ yS1L4j.؇Di/k1D K2aFOkT gw=0⣺?& oMB&ͼc!"7sF:bpdY H7\2P r(f#_~y4t'5Hk$2Ù2âžg i_c_y\Q[|yYv6F֢r#}@7U1@XNױ{ms^}>i@J6S{ŚžP̹ZCa3.OCb_dwnav[O1C7A㩅:p&mҟok?xnڵ|\:%$c|Zd~.DO?d3ﶸh>#N=biDxfպ`.83OD \9w__8 ]'8AIਲ>'o'||Ք1يU؆ޛ㑊s^E豧wzke^D\1\QFRJOFHu -ScE8[{)SQQQӒF+Vk@xyyZnF 쭛<.TCpRcJڣOr,o FZv7r:Z6|pc_V;ߒ(flosԸA%Sm*ͦe;S7?3'Ti B[QTZu }5y%<=F?I8 GFDvV֮#wDsVž{^FdsJLo\tmąK8avsg#ÅLDsiqm#fl?< wwwr!721"y`K^!A4*`EzއZa ZZi.z f>>lDdd$[ą .\ UΜ/ÒiYc R mvu?5ti{qQ~<9vynv-vTٌv)nfs{2O \K5eqAԉ+HGg̛֭EW(LӝXy{Wqt -Oy~3=g>3?Auڡk qQDK2N]SLWpr?!Xv+rSTT}'/DJ$ M yw.99jVWsO?rc--JU"An!̏r~44wHO-\h7ng3Wy?9_m//6i>[{w9cqPE6(Z v!P^ GP+s,77l?!F#[=5??/uKfvc⣲<9Gd 稬 8`OSt@?''_a9})Q5枸 ?X{\zɬ<Ɇ+ƿӠf]Ih1 fT{;._#?2)Icٽ{>DΏ4]G*lw\`L=77F!}0tt|ӳ6z^ FT JⅺqVTEzhK{d#ߖoȟt$U|\.s l\}u+^3]\g"ߒ7u|?W3+c%b/4͸iU[L#MeX~nD0W~i`);y#Z<ϧRL51=kuGaR9y6"^!Eb@LRSֈ:܂ϬH]VXæ;C^ꗊV}Gč&91G"9CkHWq:8ԟ[XCXYg"{iٮ74>V5Nj4R6zXT0ުWΞŬjn:5.9D6~m'ir{OXX:Kpؽu`?' 6:DۉsvgvKNXGDEm[#cz@qI*W6M 2̮'L/"&]@)hKQ?>ߌQ?P,lKj/!&ΞK)MQ/9_xn| 6ː|lF^O|[h=K.'B0}LIjcP0ƨ4zl^6G`:%dBr&rxP\6Û=;8V<;A1/fť^}v,~ NCpr7P6}kߠwQ^x[ro|\O}{'ھ .ߌCףrT,LѲ]_AkA _{cxE{E-7{oKݽ;hO?ߐSh{d?'$J&c*N!}l.gƀ`ω\ N1WpvTR)]Am#g`Gp2r+>xۯAsV}pf*ԟV^SG3v,nW R|i[Qm]4jaOp!5-sв{vbŁHv"~[q+\ r/e]M7Ju{F)7D ޶X;DFߜmc<"&Q4!V,\ɫ`xs?mXT(?p?x&MF0&>PZxl]~߿q#X)Bz2=mJxCQ2z]<l,;x ?WʸX%S7cնøbȀYφfxCTJ#WVB/x"1[i{UPI?9Ote/ j UnLņ1n#V=tmdŠ BOڐ0Xޡl%RqOBE$܅ۏai{&]98#o 毪eMq жvb5HS%٫NtxkTQsԐBډY;Ͷs#դgoiJ3ެk$AuGډѿ~@ DWAІ=8kx$ۡʇ.]B_U'FNxi2ۉKiiYMA$[_e(>īuJ@z=FLM%?Ԩ0~ZY }7 %;s_)tEo?iRZHH~xuW4C#FtAiOcrrI/<7d {:.d׿*-u ,cF-CP{vrve& OQ+f"ஂxaN!Y\EP.}` @@`q4X; !KhN#f2hn`Sۗ/ 37ˆ"T&$AJ Klej'I*j캗ZeEtFeN7 Y\h2BPAH"/Ɛҳnv^)=GYXPX=2𮓈)"Et=nҔKe]f&,J<9ߵIܣ#ZuN7oX,չóP#f/VxZWF 3Z3ãVIHa5m.R71CI; [7W4\]tNCВTyFNCEXB ڮbf;ff픛C[AEM3fem?1ɿtN(3/v4tocE:3韧>5:=,,J v"sș iJ2T!t`j)`6&BSxC3!n\ !EM:_uk2xi*tk6F rl3Z.Vi)T lF#%HT'a݊CKm!OV.E[CӏE1a)[b NE1)!Ȓ~AuqKTO2&9[ߕ&I]S#kol@t .^OnXf\J3CH]LZa M1>_"ՋRdEła  C66#"bO|IZYCi OVoxg=.B࣓Qog۪-jjj4d'N̍gvv&Ԏ4Fjr1e{TGAc̀5:WfߗШf Wg* ;`mJ4I;:-kSMp\ _sp]T= h7璋N]Z-t:/uKyQwJ=ܿU4R{hm5Jn"U,5=FRޫo~ϱ1z8Oa. Cܝw=熣K}rSܝ /^X3%Y흟܇x!TL3MK]cA%^M*XuM sQGEe^0NG=t16]x!6ލڇ?/,ؚn(>,>fkU@G?˺"|& ƯjJ 4WT)b{aU+ 5,-?*Xʧh\Z` l485n9vv/I'<ˌ78׎e/=EV?9O^8_p7 < j,Lj6WT4tG c7ѱsS|A `sFDn~/jg/fN6L Xtn.9`/%=uAh9> /W!k;7kdKKNt cvQhkEG}Do:Yo&a^qTpW{N\$atNÀU4X&m7o? 趨T.lxh7i;ᵼ+em'VA5@k:t/}GH:Z[X^hR#|f}#Xm3xнǛ==q%KmmSΡ[s xxw\ _s0bSB㧐oR J{JOFȝٰ[nEWJɽ{QdI< ˋi0BC#Ux!Muhyl-{~^od CZF;dd(*X D!RIe2M]fLC.n$ݴlZ^OØ&*Q8k!*|_$2is?N{J%J<ԭœ<$L9"4yibk~fN{g!큑aqK7+KXZt;<\w%QLOKOmL§Ga"iJlfF_s9&wX]!Yd>-2E{̵̧x?sn\z%\3Scrĉ0 9G{//JYN@_M>Wj=pҐS W V %9o+77l v(|5%Q2)risӺi/:?5βϢ$OG%=e:#(WTj. HZѶͫ WdGkvv2|_dwߴP8KZ`c< Gd iN^I6n8ys<9ys sk5Ұ(n<9ys<9_P,ͮ,evpys<9ysl ?I(p<9ys|A![ŖӜ<9ys<9_xnQY {Flqys<9yslyVٹ<9ys<9sCsK"y<9ys<9_P)*<'9\͚s9ys<9ys YuKMazs<9ys/`<7d Ȝe9L6w<9ys<9_ynYѩ±@~<9ys<9sCKys<9ysl̞v査s<9ys/x<7d ɨl6!C9ys<9y\bTV] 9ys<9y$Șnkp+<9ys<9_Pxn"abi:T p<9ys<9yxͥCn^p<9ys|A![Enȕ_D-;9ys<9y ^lWLvu0s<9ys/(<7d Ѩ|O=] FNn9ys<9ysY![uVٹ<9ys<9VQ=s9Kwi(6|y{FFz=SSN[,l_&x/<9ys>?|m \&XuvQdbl2TZ0?<5b} k֬d sb$`RRRpM߿ݻwG5 Bb35E;E p… .\H+:,8SVRWbq3gwEF_χAvL:5ҥKcذaϜ9+W s X|93pU~>M/Rffr] \OGjb"Ȑ.R5ط>>_/]>vZvgϞֵqUSyR]^y7d Hu~cPvg19֤^-WʕFobaLr'y݉ &vry5wcy[CXxnMP9 ×ÿJg\>{M|u1-g7 AX#{YP5B*i^$HV 0_i"X|\+ClkY6gap3x$ghpV_.M1^wz<.8Ń] {#r5%/ q?dˑwq#fX5I{Ҩ^6jլDlڬNǡ^%;[7aM04U-oSYk-l> .nq{M&?:L0LNדpV8V/^w Ԙ4{~/A=gɡJ"IϾQg% [⹆ȅ .ϼ!+ҧ61ZGF(6XȧBH3['uOgW̏NWȑ#lf͚MdVVT:=xl7--}Nq/*9C9e$b]>; N-Ơ9ȅRxN%;ce ZQP'I8`ԚCxV0gנZלc%4O5OӶ7Es- /U/ r~߅Ϛpy/>n:K£B߶cA"HK78*]Fnѹ_{>Mt*l|I]J×-kƠ'̸ᖥP{"LokBd҃6rtxxG!,G23o"noaSQr6&;%Y!E-Ľߪ6OoOKCK_C~GܙPFFI NO4/ʜ(Mۧ#m܈`Ż8 ƕ?_G!u;(M;Xhe!ILA׸*|;&Q>y4?`hDO\?x"Dވ@t?Ke<`\/`{!˜N:dxx S7Ea@e/袷`hAzirk^Đ"plwU&HSUZ΂r^ȅ .Ϭ̢A&}nāx fSZi3ӵuT6'pݳrShEsb*d*԰j``s{ 3E䪛{33CVmsP @DY'_oHxUZ,w?Ȯ9s_GO?@Kv![3fy` gҗeLQݣbu(V\:ƌ\pzֻvө/0y{v~*6b160qg=$N az W0lHn$_3ѿ\jvУST؃hD!Ƭfegnڝ:PRx!(oڇwty5Ɔ]W/㹃8u;Nc7tXtFoctH\?uHzM#|d8nL*%QH@mqZ$7`} @#sX1P*:5["ޢ3@xe f(N9CCd}He]OH_(b *친+f~lU,դ q- q-⥱}ʇWkqLڽ+L.k02]wڙĈgyj$1nڃj$ur>1bU3-2L;i/e{GH{zZǗӤoG`̯;St -r7ƮK\7[wɽYT7to?,?z$'oߎUI&OVGɒ%넄<ώ&ώHD۝ޅR`O&# !3(am-k}v0ʵXRD]UtdeL9z `)Qh2Th 4(Q D-˖E5m߁H4cϬoD*QLJ |} x(iH5yÔ%$-i8*a+Fl6"xf,K$İD1X^DYMkuMҽ G×pw_6&[GA~"F^?NOFELȶw p2i44@Q@SڈiSJ㋲ۢbdfpH[?tGc*ԙUw~.U-Gì}7!jmK[!ʼnU+N)27/%j`Fd({-lI>rJw՝J}Ҧq&pllӳuXٿ:ꍛQ).ϪLިXWUr@"/Ԭm6W6:bhC[s1C›DUÏ^fкJI>bEyPߏ$_= _+3ٍ:}_q5E.\pyF%C2/emmW@R3AGeub@(ԮU~~~v#m۶8y$F.:1N쨀|xO~)\ZEԮJhmp-F܎…d3[ Xh6΢&Cr:1(9*d oZ`d#7a(]MEYw13[,*-ܭlڹ Cb9&,Ҝ[$qO@-_ 1~'>*@:aCi2AGj!AScʵQʍMT:J-ܬzFp3 (R Jpt{d3V_.N6#Άq&/u.vFĉA'0?S篲iqtZ*2h02%B"5aoQ7˔o4f.97! @`M=wo%;^1kHBܠ_1f.<} !GH+Z/4]E#{j7g5:,4*_ïKEbYV`/QwBr+IU;c*5j< ,+qmjvqc+$j- kqzreF8zMzF߱#.>8(ҳ^>cdzj\0Z*4A! )$Ju e\F*>kUs)X*P^vx{&Z7T5:9Frb qv7*r- .\eCN6 ?:ʺ{J:ڸ&ޡ}FpMƼԘgy*U3>xAYۘßq/Twn>bp~Pj]1˴]>^xjZqoTo̾h4%Č]fX<`pha3Romt%)ײ{M31t!N8,"FIC/< /SBbLRh2cf\`P#rId6"ϓĭƋ b kes6@:,Er* nouTuL$/j5n&UCHtA^*q_Zrqܺ~8=2EC*)W{iPUzi+gLbhh3tRd=D' 6u~⣋X[joÔx- EJ K=*a`|XN6*v?VCpiDXM ..A0o{ smf`KfzѰ Ǩ$M=obkPG\KAgi!_)8l=*).Ti sf]F+!^ g" _6vTMcNԿS IϲYz>d7N\,K@svX9tlT){Y/X¡ B.I·cV"f[,j"t9ۃH?!6"w.Λm#*T9ߜ]7#%f71R0#^\pRp Y;XћDt"`|34s:u#1$!/]p aN-1*ό-K$c͸nZ~߱1/^MQq1uT~tA%iZN_DUwcG[钝/YOZ'lӡS~SNЦlOW 55'$5J~VGٙQcfaa\88ˀF]1f13Lf/b^꠩55KY!:D ^ UFOMERM[zZ?4}Z􈚆E=1zС"K1ǵׄ lfCObQ3O@j3(&oؿ2,)XW}GrY#bbUFBA s1`ԟ.vi_;Gqt;!"_@E `G]AWE?8X+u´{;+)- lez|[/kbY36?7YӴOho&|n/fNo_:kzF t)=xKhQM"HzxZ2{UjX*Yu&jpT@ߣkIR:u \8ƟC ?ZF늞R ١ϙnm-cq|hլ!{fő4bEN!|Z1.\tl~u䟚^mܬuA>\;~   J{JOG%9nokY_ٚt*[>; :nP Yi"Z;e… hԨQz l$IlR9Xw7[4={@`Up3kOQZ;] f&hIz&A/&S:yݠ|̢k!uK?>/$wi$ tiRwI `ADPD@)`G(E.H 'w%7ٽ~}gs}S^vfg]+̞'~׋|^.teQH `JxR'G||vOfGʰ5ܻ4:ʕ+r7aA %J-ɓrC4׈Y[VR%Wã/X`o5JD28POoͧwowK2MTs3s@&dX_9{xhS;~̜_xXd}|ff.7,'p޽+R(D>[vmnnG?wDx٬b߹poD/6)Uˡ !wHGBt(V@ @ @ @ @,@ @ @ Y@ @ (%@ Y@ @ P"K @ %@ @ P"K @ Jd @ @D@ @ Jd @ @,@ @ @ @,@ @ (%@ ᯁX7HIIAdd$n޼hl6<<<|D71@ @ (!֣GHOO𺨨(y\p(Wj֬`b"@ @ P"ɓs BRPHCFIIIu_2R ׯIE\sT0ƠhrY^O@ESm\ D0'۸I3ś}sy3;O·y)FR(IFv VFAeH)X 'KѣpGP:L)zVB^ϟ%cAԬC=yS:*nx#p'.u  =# b2A]ӧz:u燯<0ԭ[W^#-[\z,XjLtsZCh:E~VK8;b]srGg~Cw ߟt=j&8e{cfz~+@xFjϯ{`3=t -5=Y߭ټInS4\y!;5[NQ知S{ʽNwC\111rYpϞ=ѲeK lv!mժLjsò2GEQ{[jcw]( ffSyv Kw0"=3&zHq/ov;)@U]X4|do L!"woC섫q6K;{,fY#t;'*W6G1n*1yb|ъ[*?_|9>C1[sE1#xc3y>zB4'_L8+ڀ5Yɏx0\s#$AngӰS9mn&R߬;kйF$| ;44.YB&3W`3]tˉst ŋGRb֮[G ۍDl vHv4R =3`[0⬛;g- }1,g2Qy>,4]QCזWhu1gJ &Tա_ƂnmcL9Pַ~?@`A|ĿMyV-8OyWǤy~]L0U_fgDlxi6,>ZVGoDI~t'&4*joq|d4gfN|8 {<"ס/悳rGi0'Xۧi0k"$?{OOة_]bZ~3qNbr͠e|S_;l RObl) :OWt{$`{tߖFx"hqyD*MMGt@w^S6Iv1[ExIk+Tf OmM&2h Xuyޥdkvզ>P#: ~Đ.=?ӿ_SXU(9,E/n%bOrC ۿ~*]'hifMw $iGC{G ^:"t<n iP7F5V[2k} 37ʯ5s~H_R#~8:os^EȻ#Mpk>U;3`߈6=<\>Uz #~ɦ[!܏hEVO}|4JGaJ{--ط S[ ZKvӧ]qVGK;5r\ s?A髪L* t\VϨ>ìaI# K׆xm|y|_eK}~k/INuۙqN2r8l߻/5GzMa.K)|[Su(m~gVJ9 o1D(}- qgf[Kce,XڬhFs,> %;%M0RmʹEtZ3߯DY~d{r}jXǺ銎8ȹ\_%8K9#jxD,y9Y$)?pE}8v$);[O}ƪ TuUvrцv:l6:EFRtJ@@JrxvV=CL)4zŽ^~b@ ?I ~ia? ~G?J#eQ*jCXs~GS~byTh"6uTƓY%VY!--ZJ^|rf2|c&3cl,Δ./ Hc ߜPiز^'bʌgEy&vW3TGfك:aI ن)fF-u~]U,,-RGQMDQBtvM^_[Ov v˯=-?=lE֫,مԘpއ-Ѥi^5OlW?e'Ҙg2W^z٩vlK?Fu:W ^~M6o_R#:ѧp1vk|k[YelXYyxWvFTlʉ3.,KXcLd 3-JY,b3^KO|)_%,gU3U>gv.(룄X͙3uۍe& U2y^!owD gw~4;-N)c{l穲5L,q7{$[G8AM Ʊw!j-gru`S~*v%g펊<-g`KRo)}}lث/ʶߟ`.c6uC6ffopk]B7D{_$'ޫ20j }z?Țwџ\rݺP_7R*[~ݯ1j KT.Rưu%o3N3':dcIGOgqK3)nF)6hnWIy&x{zɢ'{R]쾏;7_>do/{y`#Ccm|9"{nL^k ur!)v4w|mæ ,YEFlԵ,'KߒUaWBwwOb%,WH>Z9)?d'd (OQfV'K, 1 pۛ >a;ImGR ߫cvv*Oک#cr>΢nj(h:n싐 ooJ_DO+D`uL0qܬ#7B!лl`nBQG+ LC1 >Z%o}J)?m=qt|Vs,V|y{-˔fڇexu,vMh[^ (#gK;f|+a/􅍘2++5@-7x5B.굁Imr.=}kVqt-hąR̛\2<] ]3/No0d@wY䈯F!0M@~U~s PܢYՏvqsM<_ ΀?VAa?xksvk:4@IѰp!U6vE={\zX+N<嫔X|=]vwp+-+<|=jhjQBٔ?B empI+X:c&ʭ89$H;P(x֏Y99}^{]|;.vLo}=b³H `zt{ys6cdzӔ\>~W]Tf$K<Ѵ%~WeJ:a+ϡ>eǸEX|.Mo#+n:VG!WnWEo ڀ! +i ߊ?ypi7q0z3fo>vN_a(o1C yL]|7J F/o,RUz ¹ AhO«}?h E7Xw3Wws=[!> I]\b-z߫ḧ́eL*8Q8S4{co6o2q=d{ǮpYl?쇩7-kM,(2muݫ0o6k<ܺc/G>Uƾ/W=%_j#kmx1O BP(b( C&ž.4gNIk5XO*X@O_w&cp 2ºkK}n뷎Zc C/XSm7Gv\#4+, UOQ\RM-5vaNQļY//K k#ʓ>NCC KbXZdQ.\>={a|y3\S˰9I#oD"J /R%xEJ=8ֻcakL;Ι-w`l}4BѲ_ -2Ak4)UlV/6뱠z 8R^rv'hkZ#!QXduiۅw6QӥUy&koJu*(Jftj9bʥ4Ӓybgz^]\)\EEcST_S[&y걅L? iJN-2l% 3X缙SwS\M)co>Sq[y-Kނ7:,"vTdyg?9{命%S XefRghh(#/K `%qO Pǜ"ni R#r]vڬ2:s Ưc:9tƞʜ'/9l|3ig^2pYA;<[]f1%5ͮ/Ԕl¡؏#RrVKްBg3ںq?aCmɟuͩVȾb*-u ۹-Gl6!22p*Yԩү:zKw-:@,AƄGZw'%.=eʔ=|5A:u?Vj7?ǿ]C^Q>й+7oWv=u*˻eFxeDܞ݊ϙR4wm>:K6-'~:J~xB~4öȋ @/Z[q*1]>77̀O/>sQeKs7#F)&1Es|ޅFyG-= k-VG/+?ͩMZm w:k `@ɧQᅁ$dI`:(~ʷ}%8bfeݡlhl8_fĽr G/ۺGSMkGuЬv4옹,D:3! TXP&|t9:{SFXxa˶a˄1Z.E= d;oŻy&?xǫ=zT Um4%@f5L%(iިcv:Uox+Y{KLv'me:Oq7ù6ĊfݬTX= s\fKp-abkcHX{ M$<=?E;h 8nhFfe|8U= {g6Ne9Nd~wTƮFn>2#&<%*ix*(QDIcM ى/h;=̕rY<܌]{F&J@&˸_ޣ\+/=q8/t$@.b7({+IY/>![iQ "R|G z{<=q@#6k`!˗WŐϸM֣zBhy(?n`wԵ?6}˄)|Tс~XPWe9t?ؒOf^8: [ǐSɨд6)lS^]?s% ;_)vQt5ƹ2^/~O XcIj,P LFm͛<?Xz-Yn@ղz6 FT J_}Y%[#o2c~\G/ϭ^NQ}Gl",+QVa %|3;-+;bG2nxjl[<,9uuY-|] յ/Nv>u¥NӋBu,):L;?MV٘& l{¼ A/^Ė-[ݻwiS`ݒ%KyW]-`Vwyn$5^`dJ#i.:bf̗jFhs_ v|ܘT)RL&4.9`He߆!LJHI0#@aƀc|Q3`c?*i_^딆딝oM,},@Y* rdǶ@ngN173iJg7euD">DVa`睝@FN~ B:fMڜ.惨s %(8,w7ʴ|.GIt~ vީ'˳fTލN)3ԅuv/n<q!ONneO1eLw)U\Ij? {lC2y8WIum)^&+w-^˕C'v!x vRǂs3Fw.Gp~u^(P.YYB@O,(bb_bŊСCֺ -n@}.Y }LmF@ c]50S<5"'sbX?XN-c4^@ &#'8!w$@ k{ӹ /ᩦ $;6ЃtY|~]fOݔ'`E̚JY 5a*k1əQIvk+/v`ǵQ[ Z,T%E-ֺ6hRNMsXE>L{M fr3o-el-b4{gxtK Jdò<֭[Of޾}ۡHRNİйFח =|+-w>%2t W>،uc%)!Nix{:]S%y&ep=ڐ3=bZ^G?@W oV%hv=MFXz[s#\B*%k Uc(?o׾'卪y54-o/;?i2_Sxދ_(@  2GXXv-% ̬ŋ缲cx땟囏׎DAc^=a pDxzMװ4RCn**=+ms?sWSiak-H }sXнwdǤy~ H֗Z,8@tƐQ}}bx QK=3'jpS[__.%Ƈc+.Ylxi6&'vW^_My6~M罬4ﰛYDvMo;m-};{WxA-2ǘmvz}n=4MYmsg'vy eʷVzf+sAbȾX-Lt;yPB3zn:ƛ'($h:̷|t2/x{^YnDqgkv2G|We?rzT#Mmr?4FՔ;4xA ھ^aಷ_mcL9~3jݧVyy; GNF+Iux6}1m(+߶AB/Zxfy ԎcU%>a<<<%Yt!MVyU9!ħe-.(.^}GF;=eXek&k"mpb_:&UBSfƸ\iZ@ .wfy9vݡU/t!ĭk1 v ~b ?BQEE>'I~G8?|(XJJJ+^Q[1xu`ŰGٛ\ܯu|ԓ՞w=>aY*;؇Go/aFwtP64N̐uomunXҟ1}`Vٞ3 e{vK\ӟA7mRn`yy=d,)lM&a'ix=/d$?1x>Ƕ&-|3nͯzbFޢ;)}V1C_^o*3Z342![\#[.Lnmwsy) kw(;ynfCc{.? ;y~|TVKS<;YP_Lc(2x3 ,ҒC\٩rYgےK_H3 }n0q)կH=8w>Ɲ]a[ Y.E|Y,Δ. ȎNqu4MlG}^g-o۬3\Nؗc }(k+MG,UϺڲ¶\cFma z lJLC.EngOTB7}(V`MY= jdI\˅-s2dG>gg˄m*ysfg= y?dC]"+Pe~$$"oj3 ݢ2ploNj.XR%UT<t9SiF6ʕwB.ZSMlyۅoq 5^<@eJ} junEDt2ތ?~j++WxX|T܌-þDޏ'b{RVV$CBwn7繘u($OB&`|su^[+V~~]Y7ᆘE48-WmJj׆WF֑Y/烠LyU3\۔1֍\6jae3TqxO@;-\yKOo/Ⱦ8lXD uGoٶ ݫ#P^10"9few4bwϋh1o !/U>YP ;Fv;ٳ lby $ 3,x @H0CQPuYQ!lJȬܦR]ݳg!>O/n0=€ kᙻ~H3V]׮ǔ年hѕ2iQbu5(f+W@ҞV+i-mb)J},d@hOӰ_n FNl-'t7,1޾3S#6]+Ax <%Vf'F;|g$n/OmvP_"kmh@AAů0@\ =>Pe&Pܧúb3^nX0F_Uէ?>A_ Z vuz6;|^׾d.aiOgzXYc"&M >jo?FGjtS[v6G"\{ ҆kpKoO5ORn@(j֬)K.ݻf޹sW\KDb]2 [{ 7GkGo41Oy=%Uic"BXå ( J8F|.xFόHTJM\=d|dJᩩM 9F~Mz+ɚR'ϡXr xH7hyw6@MQHLs_>P}Glt--SP\Ey^$%"uN.ebRwy.eSb/R2T58JpRhg*cہ@޷ 6^{V囦MMfL /R%JH"(7`n&YLB%ˣTq["ޞ|W@ҥd9B/ʪ8?.r ̈́6cܜa{!)۞KگH'K,ҼEyYnj$N,|7=CQgz{aО\G=6+oYݎJfe<-}lߤandp3%]WG.f"fI:/mT6q՗5,Llh7/[7 Ҥo.` bBxNGMGvrQ_0K:s--/udmCɒIz`0:L %AAAZ l17"ݺuz۱*[S+e˖hp߯ /T'n^Ec_)v[3uiT:cWD:zqE0.h\WݕW>&gp ], 6YwJdZ%/svMAԺ1ÓAqMʕG^OAv"@w[{֨%Z6{ Vaҷ]ˣ*;݊}G`޶vG6RϥmfTu;p4R4l1Il v;3-}v 3bs[ɛ;˧`R)cpHe̦[@]ץ#2濛-cҹl)6KIsL~9Qs?w3b|g-2\rMᾙ〧|mɖ8xBlkP$O"=mŨ@%)'1:I{} cUнZuҾqXjѱI9Y%^|;EM'yjobߪX;v+>ꘐoЎ˃_z,6}wsQg6FB%X_|X;Pʬˎb,LPd?s o^ZA ZviF F+)ezS_ æ*Pף EhWѷԾIVR >*r=a$espٶЖ0dqh QOЩ /NSfl z+ &!BK a]Q8LtTϧ6/O訖SӷnBG-uqКXW%:劬b\Z/Vdw'< e9_mW+;zO)G,-oCa}cm2h's}0R|# ױ SˡU)u%`Ӏsh_DM@hrR7: gS-{k?b _jrH[o+ʣEOY.qa*10L+g޴;`uɵOHr(_-u+S!e:KvϮ-i) cQ6B-}; xqo4Ea}Y˪LV֩*6uYDg<9EߐOe_mq?x` HI9&5.*J|\Ň-@=7Œt049|:}Ħ&Zq!mbu2\z5ZhB 媼{a21e=I  hEk3 =z+^4>WҺMNT*ףuW>\ڜ'mܐxh9֗Uwe9/pSJ*)rTZ@|Jt:KAPQԧQ߆+xwtmbR7kh @ ӌlΑ,߾}[._<ԩ#bccb(TX1jJnE @ ь,b9qǎq1yTbfTR21G@rG;!!Anq}Z-jժ%w(;@ !:>3bvŋrӦSVZ]@ @ȳDfd ͚5C 7o"::Z@lyMxN,;9(Q&@ B.@l*T@ @ L@ @ P"K @ %@ @ P"K @ Jd @ @D@ @ Jd @ @,@ @ @ @,@ @ (%@ CK, 227oDtt4a6o B|PD ۛF @ IѣGqe[3Ơh߹sQQQp<==Q\9ԬYD@ @hiq.ݻwcѢE8Lb *gy;vD޽ѯ_?y :uBZ5ZA#hEiii vh/\U\LLm;s/YI}=ި[oߐ37cr7Ml4`0#'B,`qb/kH/K7#ڔb@\{iw wp;wARf$eU\oҟI90߁)u[}br̿3XƊwbO϶'xNWp/xD P"!66˗/ɓ'e\|y=z@:uW8Wn]ylٲr(cժUHJʣp -5#Iqgޭub҉ݝ Nm6WגsUν Sʷ W{ =x@rIy`mDo Gc}EW%ު[z<3o ///x74}8>'\ĨV~[6ir~ >==[Q¯'u¦A*65 WaT8hE+킮-7%߹t>L C<:{`md2·J (-W| :?K{~5} }Ybٽ~oq5"f ´ H@ai|#]ؽ{7Ӹ>x_~ D ե1> M`M{8r-_o/a ~N6H=-tLX>ݧ []KEK˔.Q\XG.QYmWT+ɠ\5$*v_,MPTw*>L'p+DbPֽqh_R c m Ot) x˿y5;ё,4BNumRv?Ǧ>f]>zz.9_U5q[tM,*mV7\t9[!#,:Mlj>Ֆcsl큯F#$)Ҩ>J#1mdQQ,Tø$=J:^sgH;ǀbҋR_Ǡ/Hvڢ |<~q@b;GEVw*%gHv!?0 K I_VWkeeHg-N+%ΰw=sjs*ΜfNz23'0VW*:]-r XǺv rO?MJe>NO| =.70ƘLn@8TxvnR+}?W#kϭGlB0[LRp}<ɷ0NzasG07ϟ LI#y.ttv6͆37n7d|:w!XGQNv7X!|5Nt}6b PIrMQgl`6)~_~0ΏntdoBXˉ3z)ǣx@lynCWvv}x!cj1߸}A}\o}{9*?3buj^øn?)ݸaetX66ΦÁlڛ ɝ i-2Ã,2GzGzGazGqzG)zѣ,=شe%zTGuzԢG#zO4i&h"BY&dΝ`^G#*id!ZuYOYVkLӅ'pKsmJӍ3/H9ܟZi$6OqRkzH2ېP"ZQEr--cr718ʉ!#/CI?9CNߣg^yATޞ~!QٴUVؚ|{. M5Ғ][rͻ2<>U=H F;!SMLAfIܕ=-sLe]S_4 }kϏ'fa/'7%k֮!K&Oҍ- 3œYϷ 2}ցG @#z^g8 :wX=a*|~ yxi# m˦ǀ2tVSCs-$߸]6%쾋,Trk\| nc?N&Īw.V~$ IE˗GtjN euW՞"՝bVw#%1emozeigVH2t'';LY֩N^|&ȽQ2}眦}N&w!p[@^k4T&oK|zh_mGCH֖'I4 iZS&k4z++\X~3A9xOΜII!'pW^Y'AIL,\Nm?:S󴈍RY6}JxJM3]2!4?r:-uK| NI$3z,~Ly|w'z̄,5J5*`}uLvTjiR0zj"I+(ΰ5-⎎SKf3=ѴxcNJ+V7X6Nz2`5~v+.OSYچ*j/qJZei;5Gom&"OoGcx\}} bm*pupA7#(-2bߡF.{ hytMo>;hȗq~UeJk`9OZNOFr^we;&G.Y9n*Gu3 BOA-F)n"nBaL㦠ӡøw:V4!'SJ#J m`I;zJLzXh!g~@];;4u~㺵s.[J~~ӎ7@K})[!4[[ڵX*oXœ,<B{-iE/捿Q#l|? ^*+S(aʬ`.4n=`xHG:yqwfEx9šx|'[O F'@ -9y H>:c|,ǽs{T;{X8Ɠ֩qЫfgp/91.\y4 oS(+) !sTH>-:N^zҘ\eo>^>vR4;JDb,;i+Bakk5vp6@ܵXUA__4|bO"}O֨"Ҳ,Ȫ6r2v\4.坕9_Trk^^kT,Oh+4Qpaxyy@Ҟ 3,Ytt] BvvpBM_0Z#|h.Zt!J>jlR]þ?Gܛ=nL}.v( Z`ۚ`~ wŊ2՘҇D#Cg_4jَxa}Xr5 }t~]8-Eh)o 4ȼ44bjoFk>,R6&^?>gT3oTRuGz:b;O^x孂.qHKnFHQ\'WJd^J>Q:.(aaiPL37SCaک ^T1`mkyT&% DJCGO#H5k$)S?.4ܦzQwuLTXm-LF3&Rrq!O(쎕ڌYm^2Ӹ_ RYd̆6jF4_8ذ涖K"RN :&ytMV[%[ΟJ5AI7q@Z\0} z>U6Ce0u},RL È6,r,)/Jm>Op<Z@@4{bY )yO&'ޅyۛʕ+Zb`ȆnFZ(5ۖy}N b {]O aAQz+UK'p:JPx q쩅{0ꤴ';ay~f:,R7C!ؓ_&IҚ@<ٔh?Aϫ#6*|by`/~mKl^[@#ѷibư>h^(T n>'Bi[q>̮^ßUѡ3#ر4XhV\xb 8klAPPwqqr7kBAɖ%9cn?xJ8q"&L5})ręyc NNEѥ0|JyG{ ¡,~VP 6B?v} ;hćoR^Dy-Lšg1:ܤ<J1)et:3քgרil0|%eQF.:Zg^$)z(h |;/Nƞ/{s|{X0{ib$kif1TVg3Q|`/J83`qgWFH$ +{,U+D"b\Ф h=n Dχh`WkhI@z~*"a\LWC@]ޗ6b}MusģPݦh"繜nk+H#J>9n$W nWxeofh=#i=_/ɸwWPY1Mc"ēdNlVz,. *_rZw{QIQ[k ''͵tcw{5.3;Dw_[.VƍtA].B QC P3/lu/TF~=lI2x5m~j?NR D O"55wFZBxB_͚5[j?|&8<ˬ@@ژߓVzA +*oAP:QyD-:f>F%;Ϟ'p2 7MGEz3eSjiw+:p,Sbr9'4Ek-@.mKTAG /soAXY9b!]沒JVCy_fjYύrYFgWp}̞nY7?pfc<; -oo`^R83+mQWB*Zi#hp_~=JV>4_w޽{߀|&q: BPC\ߑʠ$V7_Ɋ+ohAȄͧ%MB)61Y ee|łpj^^Ci(֮:m6Tc8yAAP>_ZoVw5WY 6|^vVjF]G׃ OZL} 5 @YgZkq|{cbLY~CcӔ ^TȝM󠬩$(^-⃞=藱f5<%]nМM@Us#iS+cJ2 g:P8`A|):ݍa jh=[/Zm/7%68B\k{GoVY\hmīt36zSy걡4n 6" :ЗiFf-or;ݸ١s#mQht`̵$f.1(,IwNb+P]^\-GKQو3FvDp3=xCF틕݊l3yU%j`fԩŧӀShidƞlY{{K:l]EbD||rHtp rt@T(џL $ɟ"#Cm6Y22_tOUup(&L[{rpJ^ORACmk-9UK62f1,j|#[(=ĆCAmF i4+{|/G1Ed{8g 7azdr*˯aj>uWܿ%{{r}";A 6קΫ2#^=:?]؞<~Y RSﴳ &|@ON? $gȇ§wbvX4?gv:mj#X=uszCLp3n}IO@%Ewuvy J) p[Sbt1WGJO-_uJ|q㦉Q^ժ^2ǽo"w9*[KQhO@Q/\,qAO eAn(My% .\.Y)~D {.{X~]ݟ;{<&S_YXtΟ*?>?o? ͣ8~6]s OHfIy+6c]Q݋оr! ٿx$&&9rk:qM[ݗ!xktcH~7Ɯ]QFꇕ?Y+)r@ #4=:Dhr^GGWG6ZDFsi'?)S1n$=bQ 7<~+TŬZXJ움ZiХIo0 t VTJРk#ttX5S=A1!0ShBVAk>_ Apht(Tr,&P\`昙o<ƤZhtë*_颽;?OEg  NbЎy݀7i{ Av, w65 k7!#xZ8_c{,ر ?얥[ڿ4D> ։LJ&R t߇S! { a<Ѳ -hׁGQv ~0B1x /m` Γo`g4l1_:Ib|j5AEWfZviIq)_PtYsvbۤn2ιfp?*3X q0&"˗/]t6,Y߹f H?vazS5bV8:[ 7-TVc1C9EhQ kQ7q#\c_<4o)PmUvZ失c(£^+W"a_u܀q&c,ո/U/i,=D+lQA2xnO9X?mgR/v>3tA]QHU О_(UФ_MFֽm\8y"ς=x |zOCsezK]3X, V!oz*,OD-_RZFȴ|}-Ũ.}0-_{ SHYߒxey=lr#ydx?b|1]jAVO3Y}ڣӤǮ]`s?K^g˜|2+W۷q]TX^^^I=/^j,YC_ΙAasPVɋq^R~D3N66u+eViE3Q'#d$8q+bhZy!_ љcxc`,V?/ܖP<<@/4pgG'в vJi.t*39jy7t*؎lgF4sOv֝y-lB"] xK$(Prfg[i 南D])-(-w4WK%xgT:Gܵy4,>AF@=Ӕ1YxjuAdʇ}~ԘwnS, !Vd9sDr`ee#G %O4h.j=z!*T'+r=fUC{ߩhP'AJy@"mVF(ץCp/>Z[߸Crqw|t;J$5>hhKUE88w*V)Px %O;  "SPjMNp91C/;P R7A8c 8ht4NOi[}VdWӥ ɧq&*Wx<l]9U? :lU[^s[Vv/>k`iUŰ~}cB|rKT~z.|5X;n#0m&mڽ6lopj?U oI5_8^ZuT>FX9pfbo4vCZ"Z>)]ɉ|bf ?`^_4vߴw&>Y~|ZObya#Z^uh64ɡ1wT?;a)5 [I#a8 (Ѳfw,2[Pښ1Ή:*y/ Wop+OMA\%(ZvI4ceWZ7bFWxw%̪[A ~5L=ԏ1??OE@@@@@@@@OAa& ,UsOEra~nieỵ5k `#<?Jlpp0fY٢E 8::2pADGGߎ;_/8*hp2]bcWўJk9*#kJ?AZWbz:윝KVCtcuv !ME>g;ؚgOu@;*U g*j88|Ͳ*S@@@@@@@@# ZZN̮ Y|7\76P+`l.<ܵk^~z ;we2Y`_b\\+ҀXNqz7H 3 6:Vw5V dGv,} VG bo)t 62@]~8Vϟծ%Jz|E}ǟNɃYf<ӁYNܶm[\~, eGܹQH:*ǠROѣGU\~*U'I G.Vd=lu'==wӲU\]+ ="+иqcԩSQQQx bbbuamm: ⫶vvvx~"dɒ ndD + Y @V@@@@@@@@@@@@@"dD + B_.åqX;\:sѩDW=SHCTqo/R x}>^e?$p4Lw ywL{w3yu_;>m6呆4M}vb>9"&}jG_ /d7| _x2Pd |TQ^C JĩPw{ܾSxjipg35i-7Aǝ]6 G J.7 *Aupmi{$B"Z x;:amͿXݟntǒ\ːUVQUp%4o1ߝSY;[|rS8ËI}ɉø6}ݞe_)J :Dio)iYOy26IJO *SͫF&CB@@ٌ^@rF-JC rFGi*|\ǻѾƊPMCnUMj>/=i%^(V̜ m1\a7 .Du0e`yi v>@)]-}~zO>လՋ_~'-O ,ʵ_}T5kw?qXLǥ05ݻ\y΢^dᇢvNVƣ4mHA=me AT<;^D +(1U]љV>ņߞ̥4/@԰q‰N-9T(8Z~=16 p,7yIuaR61몼},ʿ7~ cpɩ05j oIޮ"RpF!{He締ܯ+ȫ)}~) =zn 0iobS@}{Z ޫ49h 4֥1@mT3lV7b*Z5"ҵJW[0[ŧW_^~Kp!@ )"hn@3E Y<Y7(mc+eubTCmQ\X.׶-VD֨΁dԆC 1\;̻e|C{W6c^ ^_)19J&.We1^i3J6j-nOH&~lAa;EIIn}l9Wf4gY.E6y_ZYk "FtbćG' y&[_;G3, zY8>r sc%Z; "bu&_Tm{b ]6%to3W03-~EKBdc.c=Eoy;>` ?p+Yo3_M%#G,}*P1v#˘nyݞ=<}o:@@ey 6Yş坶j| -Q }a~SaaP . {*~oO, {caB2PROWrYzmL1FO6}?T?Y*g|`w5Ÿ0:hQoW}B+FJe$Rid2T8Utކ1VLaetX6.<|8ЃM ;H6II6IAGzGzGazGqzRGYz%J`FuzԢG#z5$_#ѐK$D")[}@LӅ'pKs#2A3EmgL' NR ${hI=!e<7CDbVy69iu拿Fz0:4y&w!p[@^4S OXq瓂ݷ%9ړ!^Hr8L+*dD_$ttC۪N&wַU8dXјu67<'ZOB:=!/@L=MHlCΤ%:ӷn)F2ke##׭#4^= o?OWg<{248$<ۜD#}'y{1Ll7y! yb=M!O$I"'Kg_ $݊dRuMJݶ$C6S ˆ۝pi;МaoCAH2+gXr}'=G`Ҽr=.#0t7a/on0aocHR2[I^ΩN0^ʷtJ:ِ-JM6I!W:t2yvjt{g$s[2`ίMU1و;iy5ysBQGRl~n$5q Ɉn5jȽ sNYs?ڗ׸vc"m۸#䕚Z[Z=ɚ6kO4Ps J!ң$nʲ3}[nN&q} qқ1d}Y0c[6$E {cI2*c3u2Fwj=#*4$:X܌yg|FӭMJ2j$-.UB}Y+Ye? yΟ0&hy T~bP9jnςeKOc/dƠvOF6z\IK/ɱ^}Ĭ?밣r_XGÇI>f[6T7‰؊|rGo%F@K6IdQY&XHj1R9f*/P~rLUB1WA9'dr!l9U(cA]\cG2S8U@.e=n$fN}FQ;Ko0 LJS4E} B =,sm@- s/=N YL'q`)X!9P,>ݚ\յ/(7' 6h:ີ+A@wij-94|>lpquZjP9M- Q(<;y1=y,(Np2/ L$9㯮DI4/K^ߺA~Xr+;s~B7. ]* :I&Gͪ.<ZY $1*9ڟtC>zoC^z˔EFc y}81yk঵$`,vP$gc&Chy%U o]aZmHvlo>]bw}uQe@ h©l:#7R~Lr^ȚEϮfDs{7qݜYMTH<[3jU*IL=u}X,MumYf}q,w rG,ԖTXP`j Yv c&|dϮ&KqOiM;Y2 o,،'#5g6Y췮&6#)D-ۭZI;Nfn3]rۑcp LcH}+} }5odTmd?] +B-g%o)JUJ[2ˇKc˸}=7|XʴX*7HR&s(^QIo R-\E^3+[dwVޅ\[ 8]ͣ ¶iK+;tQOi9vhBեm(M(߫ζ_ `/x)gntu;6hO,ߒWv.q}#Õ(Xg \dѢ֙vl돸k櫂x8/hX^߅@N6PW<

    " + "" + "
    "; container = document.createElement("div"); container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; body.insertBefore( container, body.firstChild ); // Construct the test element div = document.createElement("div"); container.appendChild( div ); // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when // determining if an element has been hidden directly using // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) div.innerHTML = "
    t
    "; tds = div.getElementsByTagName( "td" ); isSupported = ( tds[ 0 ].offsetHeight === 0 ); tds[ 0 ].style.display = ""; tds[ 1 ].style.display = "none"; // Check if empty table cells still have offsetWidth/Height // (IE <= 8 fail this test) support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); // Check if div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container. For more // info see bug #3333 // Fails in WebKit before Feb 2011 nightlies // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right if ( window.getComputedStyle ) { div.innerHTML = ""; marginDiv = document.createElement( "div" ); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.style.width = "2px"; div.appendChild( marginDiv ); support.reliableMarginRight = ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } if ( typeof div.style.zoom !== "undefined" ) { // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout // (IE < 8 does this) div.innerHTML = ""; div.style.width = div.style.padding = "1px"; div.style.border = 0; div.style.overflow = "hidden"; div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); // Check if elements with layout shrink-wrap their children // (IE 6 does this) div.style.display = "block"; div.style.overflow = "visible"; div.innerHTML = "
    "; support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); } div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; div.innerHTML = html; outer = div.firstChild; inner = outer.firstChild; td = outer.nextSibling.firstChild.firstChild; offsetSupport = { doesNotAddBorder: ( inner.offsetTop !== 5 ), doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) }; inner.style.position = "fixed"; inner.style.top = "20px"; // safari subtracts parent border width here which is 5px offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); inner.style.position = inner.style.top = ""; outer.style.overflow = "hidden"; outer.style.position = "relative"; offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); if ( window.getComputedStyle ) { div.style.marginTop = "1%"; support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; } if ( typeof container.style.zoom !== "undefined" ) { container.style.zoom = 1; } body.removeChild( container ); marginDiv = div = container = null; jQuery.extend( support, offsetSupport ); }); return support; })(); var rbrace = /^(?:\{.*\}|\[.*\])$/, rmultiDash = /([A-Z])/g; jQuery.extend({ cache: {}, // Please use with caution uuid: 0, // Unique for each copy of jQuery on the page // Non-digits removed to match rinlinejQuery expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. noData: { "embed": true, // Ban all objects except for Flash (which handle expandos) "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", "applet": true }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var privateCache, thisCache, ret, internalKey = jQuery.expando, getByName = typeof name === "string", // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, isEvents = name === "events"; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { elem[ internalKey ] = id = ++jQuery.uuid; } else { id = internalKey; } } if ( !cache[ id ] ) { cache[ id ] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify if ( !isNode ) { cache[ id ].toJSON = jQuery.noop; } } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } privateCache = thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Users should not attempt to inspect the internal events object using jQuery.data, // it is undocumented and subject to change. But does anyone listen? No. if ( isEvents && !thisCache[ name ] ) { return privateCache.events; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( getByName ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; }, removeData: function( elem, name, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, l, // Reference to internal data cache key internalKey = jQuery.expando, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, // See jQuery.data for more information id = isNode ? elem[ internalKey ] : internalKey; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } for ( i = 0, l = name.length; i < l; i++ ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject(cache[ id ]) ) { return; } } // Browsers that fail expando deletion also refuse to delete expandos on // the window, but it will allow it on all other JS objects; other browsers // don't care // Ensure that `cache` is not a window object #10080 if ( jQuery.support.deleteExpando || !cache.setInterval ) { delete cache[ id ]; } else { cache[ id ] = null; } // We destroyed the cache and need to eliminate the expando on the node to avoid // false lookups in the cache for entries that no longer exist if ( isNode ) { // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( jQuery.support.deleteExpando ) { delete elem[ internalKey ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } } }, // For internal use only. _data: function( elem, name, data ) { return jQuery.data( elem, name, data, true ); }, // A method for determining if a DOM node can handle the data expando acceptData: function( elem ) { if ( elem.nodeName ) { var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; if ( match ) { return !(match === true || elem.getAttribute("classid") !== match); } } return true; } }); jQuery.fn.extend({ data: function( key, value ) { var parts, part, attr, name, l, elem = this[0], i = 0, data = null; // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { attr = elem.attributes; for ( l = attr.length; i < l; i++ ) { name = attr[i].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.substring(5) ); dataAttr( elem, name, data[ name ] ); } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } parts = key.split( ".", 2 ); parts[1] = parts[1] ? "." + parts[1] : ""; part = parts[1] + "!"; return jQuery.access( this, function( value ) { if ( value === undefined ) { data = this.triggerHandler( "getData" + part, [ parts[0] ] ); // Try to fetch any internally stored data first if ( data === undefined && elem ) { data = jQuery.data( elem, key ); data = dataAttr( elem, key, data ); } return data === undefined && parts[1] ? this.data( parts[0] ) : data; } parts[1] = value; this.each(function() { var self = jQuery( this ); self.triggerHandler( "setData" + part, parts ); jQuery.data( this, key, value ); self.triggerHandler( "changeData" + part, parts ); }); }, null, value, arguments.length > 1, null, false ); }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : jQuery.isNumeric( data ) ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { for ( var name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function handleQueueMarkDefer( elem, type, src ) { var deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", defer = jQuery._data( elem, deferDataKey ); if ( defer && ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { // Give room for hard-coded callbacks to fire first // and eventually mark/queue something else on the element setTimeout( function() { if ( !jQuery._data( elem, queueDataKey ) && !jQuery._data( elem, markDataKey ) ) { jQuery.removeData( elem, deferDataKey, true ); defer.fire(); } }, 0 ); } } jQuery.extend({ _mark: function( elem, type ) { if ( elem ) { type = ( type || "fx" ) + "mark"; jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); } }, _unmark: function( force, elem, type ) { if ( force !== true ) { type = elem; elem = force; force = false; } if ( elem ) { type = type || "fx"; var key = type + "mark", count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); if ( count ) { jQuery._data( elem, key, count ); } else { jQuery.removeData( elem, key, true ); handleQueueMarkDefer( elem, type, "mark" ); } } }, queue: function( elem, type, data ) { var q; if ( elem ) { type = ( type || "fx" ) + "queue"; q = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !q || jQuery.isArray(data) ) { q = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { q.push( data ); } } return q || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), fn = queue.shift(), hooks = {}; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } jQuery._data( elem, type + ".run", hooks ); fn.call( elem, function() { jQuery.dequeue( elem, type ); }, hooks ); } if ( !queue.length ) { jQuery.removeData( elem, type + "queue " + type + ".run", true ); handleQueueMarkDefer( elem, type, "queue" ); } } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, object ) { if ( typeof type !== "string" ) { object = type; type = undefined; } type = type || "fx"; var defer = jQuery.Deferred(), elements = this, i = elements.length, count = 1, deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", tmp; function resolve() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } } while( i-- ) { if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { count++; tmp.add( resolve ); } } resolve(); return defer.promise( object ); } }); var rclass = /[\n\t\r]/g, rspace = /\s+/, rreturn = /\r/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, getSetAttribute = jQuery.support.getSetAttribute, nodeHook, boolHook, fixSpecified; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); }, prop: function( name, value ) { return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { name = jQuery.propFix[ name ] || name; return this.each(function() { // try/catch handles cases where IE balks (such as removing a property on window) try { this[ name ] = undefined; delete this[ name ]; } catch( e ) {} }); }, addClass: function( value ) { var classNames, i, l, elem, setClass, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call(this, j, this.className) ); }); } if ( value && typeof value === "string" ) { classNames = value.split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 ) { if ( !elem.className && classNames.length === 1 ) { elem.className = value; } else { setClass = " " + elem.className + " "; for ( c = 0, cl = classNames.length; c < cl; c++ ) { if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { setClass += classNames[ c ] + " "; } } elem.className = jQuery.trim( setClass ); } } } } return this; }, removeClass: function( value ) { var classNames, i, l, elem, className, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call(this, j, this.className) ); }); } if ( (value && typeof value === "string") || value === undefined ) { classNames = ( value || "" ).split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { className = (" " + elem.className + " ").replace( rclass, " " ); for ( c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[ c ] + " ", " "); } elem.className = jQuery.trim( className ); } else { elem.className = ""; } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isBool = typeof stateVal === "boolean"; if ( jQuery.isFunction( value ) ) { return this.each(function( i ) { jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery( this ), state = stateVal, classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list state = isBool ? state : !self.hasClass( className ); self[ state ? "addClass" : "removeClass" ]( className ); } } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set jQuery._data( this, "__className__", this.className ); } // toggle whole className this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " ", i = 0, l = this.length; for ( ; i < l; i++ ) { if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } return false; }, val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } ret = elem.value; return typeof ret === "string" ? // handle most common string cases ret.replace(rreturn, "") : // handle cases where value is null/undef or number ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each(function( i ) { var self = jQuery(this), val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, self.val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); } }); jQuery.extend({ valHooks: { option: { get: function( elem ) { // attributes.value is undefined in Blackberry 4.7 but // uses .value. See #6932 var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text; } }, select: { get: function( elem ) { var value, i, max, option, index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; // Nothing was selected if ( index < 0 ) { return null; } // Loop through all the selected options i = one ? index : 0; max = one ? index + 1 : options.length; for ( ; i < max; i++ ) { option = options[ i ]; // Don't return options that are disabled or in a disabled optgroup if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } // Fixes Bug #2551 -- select.val() broken in IE after form.reset() if ( one && !values.length && options.length ) { return jQuery( options[ index ] ).val(); } return values; }, set: function( elem, value ) { var values = jQuery.makeArray( value ); jQuery(elem).find("option").each(function() { this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; }); if ( !values.length ) { elem.selectedIndex = -1; } return values; } } }, attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function( elem, name, value, pass ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } if ( pass && name in jQuery.attrFn ) { return jQuery( elem )[ name ]( value ); } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); // All attributes are lowercase // Grab necessary hook if one is defined if ( notxml ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { elem.setAttribute( name, "" + value ); return value; } } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { ret = elem.getAttribute( name ); // Non-existent attributes return null, we normalize to undefined return ret === null ? undefined : ret; } }, removeAttr: function( elem, value ) { var propName, attrNames, name, l, isBool, i = 0; if ( value && elem.nodeType === 1 ) { attrNames = value.toLowerCase().split( rspace ); l = attrNames.length; for ( ; i < l; i++ ) { name = attrNames[ i ]; if ( name ) { propName = jQuery.propFix[ name ] || name; isBool = rboolean.test( name ); // See #9699 for explanation of this approach (setting first, then removal) // Do not do this for boolean attributes (see #10870) if ( !isBool ) { jQuery.attr( elem, name, "" ); } elem.removeAttribute( getSetAttribute ? name : propName ); // Set corresponding property to false for boolean attributes if ( isBool && propName in elem ) { elem[ propName ] = false; } } } } }, attrHooks: { type: { set: function( elem, value ) { // We can't allow the type property to be changed (since it causes problems in IE) if ( rtype.test( elem.nodeName ) && elem.parentNode ) { jQuery.error( "type property can't be changed" ); } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to it's default in case type is set after value // This is for element creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } }, // Use the value property for back compat // Use the nodeHook for button elements in IE6/7 (#1954) value: { get: function( elem, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.get( elem, name ); } return name in elem ? elem.value : null; }, set: function( elem, value, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.set( elem, value, name ); } // Does not return so that setAttribute is also used elem.value = value; } } }, propFix: { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { return ( elem[ name ] = value ); } } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { return elem[ name ]; } } }, propHooks: { tabIndex: { get: function( elem ) { // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ var attributeNode = elem.getAttributeNode("tabindex"); return attributeNode && attributeNode.specified ? parseInt( attributeNode.value, 10 ) : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : undefined; } } } }); // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; // Hook for boolean attributes boolHook = { get: function( elem, name ) { // Align boolean attributes with corresponding properties // Fall back to attribute presence where some booleans are not supported var attrNode, property = jQuery.prop( elem, name ); return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined; }, set: function( elem, value, name ) { var propName; if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { // value is true since we know at this point it's type boolean and not false // Set boolean attributes to the same name and set the DOM property propName = jQuery.propFix[ name ] || name; if ( propName in elem ) { // Only set the IDL specifically if it already exists on the element elem[ propName ] = true; } elem.setAttribute( name, name.toLowerCase() ); } return name; } }; // IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !getSetAttribute ) { fixSpecified = { name: true, id: true, coords: true }; // Use this for any attribute in IE6/7 // This fixes almost every IE6/7 issue nodeHook = jQuery.valHooks.button = { get: function( elem, name ) { var ret; ret = elem.getAttributeNode( name ); return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? ret.nodeValue : undefined; }, set: function( elem, value, name ) { // Set the existing or create a new attribute node var ret = elem.getAttributeNode( name ); if ( !ret ) { ret = document.createAttribute( name ); elem.setAttributeNode( ret ); } return ( ret.nodeValue = value + "" ); } }; // Apply the nodeHook to tabindex jQuery.attrHooks.tabindex.set = nodeHook.set; // Set width and height to auto instead of 0 on empty string( Bug #8150 ) // This is for removals jQuery.each([ "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { if ( value === "" ) { elem.setAttribute( name, "auto" ); return value; } } }); }); // Set contenteditable to false on removals(#10429) // Setting to empty string throws an error as an invalid value jQuery.attrHooks.contenteditable = { get: nodeHook.get, set: function( elem, value, name ) { if ( value === "" ) { value = "false"; } nodeHook.set( elem, value, name ); } }; } // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { get: function( elem ) { var ret = elem.getAttribute( name, 2 ); return ret === null ? undefined : ret; } }); }); } if ( !jQuery.support.style ) { jQuery.attrHooks.style = { get: function( elem ) { // Return undefined in the case of empty string // Normalize to lowercase since IE uppercases css property names return elem.style.cssText.toLowerCase() || undefined; }, set: function( elem, value ) { return ( elem.style.cssText = "" + value ); } }; } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( !jQuery.support.optSelected ) { jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { get: function( elem ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; // Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } return null; } }); } // IE6/7 call enctype encoding if ( !jQuery.support.enctype ) { jQuery.propFix.enctype = "encoding"; } // Radios and checkboxes getter/setter if ( !jQuery.support.checkOn ) { jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { get: function( elem ) { // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified return elem.getAttribute("value") === null ? "on" : elem.value; } }; }); } jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); } } }); }); var rformElems = /^(?:textarea|input|select)$/i, rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, quickParse = function( selector ) { var quick = rquickIs.exec( selector ); if ( quick ) { // 0 1 2 3 // [ _, tag, id, class ] quick[1] = ( quick[1] || "" ).toLowerCase(); quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); } return quick; }, quickIs = function( elem, m ) { var attrs = elem.attributes || {}; return ( (!m[1] || elem.nodeName.toLowerCase() === m[1]) && (!m[2] || (attrs.id || {}).value === m[2]) && (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) ); }, hoverHack = function( events ) { return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); }; /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { add: function( elem, types, handler, data, selector ) { var elemData, eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, quick, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho) if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first events = elemData.events; if ( !events ) { elemData.events = events = {}; } eventHandle = elemData.handle; if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = jQuery.trim( hoverHack(types) ).split( " " ); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = tns[1]; namespaces = ( tns[2] || "" ).split( "." ).sort(); // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: tns[1], data: data, handler: handler, guid: handler.guid, selector: selector, quick: selector && quickParse( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first handlers = events[ type ]; if ( !handlers ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, global: {}, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), t, tns, type, origType, namespaces, origCount, j, events, special, handle, eventType, handleObj; if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = jQuery.trim( hoverHack( types || "" ) ).split(" "); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = origType = tns[1]; namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector? special.delegateType : special.bindType ) || type; eventType = events[ type ] || []; origCount = eventType.length; namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; // Remove matching events for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !namespaces || namespaces.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { eventType.splice( j--, 1 ); if ( handleObj.selector ) { eventType.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( eventType.length === 0 && origCount !== eventType.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { handle = elemData.handle; if ( handle ) { handle.elem = null; } // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery.removeData( elem, [ "events", "handle" ], true ); } }, // Events that are safe to short-circuit if no handlers are attached. // Native DOM events should not be added, they may have inline handlers. customEvent: { "getData": true, "setData": true, "changeData": true }, trigger: function( event, data, elem, onlyHandlers ) { // Don't do events on text and comment nodes if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { return; } // Event object or event type var type = event.type || event, namespaces = [], cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "!" ) >= 0 ) { // Exclusive events trigger only for the exact event (no namespaces) type = type.slice(0, -1); exclusive = true; } if ( type.indexOf( "." ) >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { // No jQuery handlers for this event type, and it can't have inline handlers return; } // Caller can pass in an Event, Object, or just an event type string event = typeof event === "object" ? // jQuery.Event object event[ jQuery.expando ] ? event : // Object literal new jQuery.Event( type, event ) : // Just the event type (string) new jQuery.Event( type ); event.type = type; event.isTrigger = true; event.exclusive = exclusive; event.namespace = namespaces.join( "." ); event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; // Handle a global trigger if ( !elem ) { // TODO: Stop taunting the data cache; remove global events and always attach to document cache = jQuery.cache; for ( i in cache ) { if ( cache[ i ].events && cache[ i ].events[ type ] ) { jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); } } return; } // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data != null ? jQuery.makeArray( data ) : []; data.unshift( event ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) eventPath = [[ elem, special.bindType || type ]]; if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; old = null; for ( ; cur; cur = cur.parentNode ) { eventPath.push([ cur, bubbleType ]); old = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( old && old === elem.ownerDocument ) { eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); } } // Fire handlers on the event path for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { cur = eventPath[i][0]; event.type = eventPath[i][1]; handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Note that this is a bare JS function and not a jQuery handler handle = ontype && cur[ ontype ]; if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { event.preventDefault(); } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) // IE<9 dies on focus/blur to hidden element (#1486) if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method old = elem[ ontype ]; if ( old ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( old ) { elem[ ontype ] = old; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event || window.event ); var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), delegateCount = handlers.delegateCount, args = [].slice.call( arguments, 0 ), run_all = !event.exclusive && !event.namespace, special = jQuery.event.special[ event.type ] || {}, handlerQueue = [], i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers that should run if there are delegated events // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && !(event.button && event.type === "click") ) { // Pregenerate a single jQuery object for reuse with .is() jqcur = jQuery(this); jqcur.context = this.ownerDocument || this; for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { // Don't process events on disabled elements (#6911, #8165) if ( cur.disabled !== true ) { selMatch = {}; matches = []; jqcur[0] = cur; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; sel = handleObj.selector; if ( selMatch[ sel ] === undefined ) { selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) ); } if ( selMatch[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, matches: matches }); } } } } // Add the remaining (directly-bound) handlers if ( handlers.length > delegateCount ) { handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); } // Run delegates first; they may want to stop propagation beneath us for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { matched = handlerQueue[ i ]; event.currentTarget = matched.elem; for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { handleObj = matched.matches[ j ]; // Triggered event must either 1) be non-exclusive and have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { event.data = handleObj.data; event.handleObj = handleObj; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { event.result = ret; if ( ret === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, // Includes some event props shared by KeyEvent and MouseEvent // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var eventDoc, doc, body, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, originalEvent = event, fixHook = jQuery.event.fixHooks[ event.type ] || {}, copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = jQuery.Event( originalEvent ); for ( i = copy.length; i; ) { prop = copy[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Target should not be a text node (#504, Safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) if ( event.metaKey === undefined ) { event.metaKey = event.ctrlKey; } return fixHook.filter? fixHook.filter( event, originalEvent ) : event; }, special: { ready: { // Make sure the ready event is setup setup: jQuery.bindReady }, load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { delegateType: "focusin" }, blur: { delegateType: "focusout" }, beforeunload: { setup: function( data, namespaces, eventHandle ) { // We only want to do this special case on windows if ( jQuery.isWindow( this ) ) { this.onbeforeunload = eventHandle; } }, teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; // Some plugins are using, but it's undocumented/deprecated and will be removed. // The 1.7 special event interface should provide all the hooks needed now. jQuery.event.handle = jQuery.event.dispatch; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE) } else { e.returnValue = false; } }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var target = this, related = event.relatedTarget, handleObj = event.handleObj, selector = handleObj.selector, ret; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !form._submit_attached ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submit_bubble = true; }); form._submit_attached = true; } }); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submit_bubble ) { delete event._submit_bubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !jQuery.support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; jQuery.event.simulate( "change", this, event, true ); } }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); elem._change_attached = true; } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0, handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } }, teardown: function() { if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // && selector != null // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event var handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( var type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { if ( this[0] ) { return jQuery.event.trigger( type, data, this[0], true ); } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, guid = fn.guid || jQuery.guid++, i = 0, toggler = function( event ) { // Figure out which function to execute var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this, arguments ) || false; }; // link all the functions, so any of them can unbind this click handler toggler.guid = guid; while ( i < args.length ) { args[ i++ ].guid = guid; } return this.click( toggler ); }, hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } }); jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { if ( fn == null ) { fn = data; data = null; } return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; if ( jQuery.attrFn ) { jQuery.attrFn[ name ] = true; } if ( rkeyEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; } if ( rmouseEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; } }); /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, expando = "sizcache" + (Math.random() + '').replace('.', ''), done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true, rBackslash = /\\/g, rReturn = /\r\n/g, rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function() { baseHasDuplicate = false; return 0; }); var Sizzle = function( selector, context, results, seed ) { results = results || []; context = context || document; var origContext = context; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var m, set, checkSet, extra, ret, cur, pop, i, prune = true, contextXML = Sizzle.isXML( context ), parts = [], soFar = selector; // Reset the position of the chunker regexp (start from head) do { chunker.exec( "" ); m = chunker.exec( soFar ); if ( m ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } } while ( m ); if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context, seed ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) { selector += parts.shift(); } set = posProcess( selector, set, seed ); } } } else { // Take a shortcut and set the context if the root selector is an ID // (but not if it'll be faster if the inner selector is an ID) if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray( set ); } else { prune = false; } while ( parts.length ) { cur = parts.pop(); pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { Sizzle.error( cur || selector ); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function( results ) { if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort( sortOrder ); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[ i - 1 ] ) { results.splice( i--, 1 ); } } } } return results; }; Sizzle.matches = function( expr, set ) { return Sizzle( expr, null, null, set ); }; Sizzle.matchesSelector = function( node, expr ) { return Sizzle( expr, null, null, [node] ).length > 0; }; Sizzle.find = function( expr, context, isXML ) { var set, i, len, match, type, left; if ( !expr ) { return []; } for ( i = 0, len = Expr.order.length; i < len; i++ ) { type = Expr.order[i]; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { left = match[1]; match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( "*" ) : []; } return { set: set, expr: expr }; }; Sizzle.filter = function( expr, set, inplace, not ) { var match, anyFound, type, found, item, filter, left, i, pass, old = expr, result = [], curLoop = set, isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); while ( expr && set.length ) { for ( type in Expr.filter ) { if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { filter = Expr.filter[ type ]; left = match[1]; anyFound = false; match.splice(1,1); if ( left.substr( left.length - 1 ) === "\\" ) { continue; } if ( curLoop === result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); pass = not ^ found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } // Improper expression if ( expr === old ) { if ( anyFound == null ) { Sizzle.error( expr ); } else { break; } } old = expr; } return curLoop; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Utility function for retreiving the text value of an array of DOM nodes * @param {Array|Element} elem */ var getText = Sizzle.getText = function( elem ) { var i, node, nodeType = elem.nodeType, ret = ""; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent || innerText for elements if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { // Replace IE's carriage returns return elem.innerText.replace( rReturn, '' ); } else { // Traverse it's children for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { // If no nodeType, this is expected to be an array for ( i = 0; (node = elem[i]); i++ ) { // Do not traverse comment nodes if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); }, type: function( elem ) { return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { part = part.toLowerCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function( checkSet, part ) { var elem, isPartStr = typeof part === "string", i = 0, l = checkSet.length; if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; } } } else { for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); }, "~": function( checkSet, part, isXML ) { var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); } }, find: { ID: function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [m] : []; } }, NAME: function( match, context ) { if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName( match[1] ); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function( match, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( match[1] ); } } }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function( match ) { return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { if ( match[1] === "nth" ) { if ( !match[2] ) { Sizzle.error( match[0] ); } match[2] = match[2].replace(/^\+|\s*/g, ''); // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); // calculate the numbers (first)n+(last) including if they are negative match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } else if ( match[2] ) { Sizzle.error( match[0] ); } // TODO: Move to normal caching system match[0] = done++; return match; }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } // Handle if an un-quoted value was used match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function( match, curLoop, inplace, result, not ) { if ( match[1] === "not" ) { // If we're dealing with a complex expression, or a simple one if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function( match ) { match.unshift( true ); return match; } }, filters: { enabled: function( elem ) { return elem.disabled === false && elem.type !== "hidden"; }, disabled: function( elem ) { return elem.disabled === true; }, checked: function( elem ) { return elem.checked === true; }, selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, parent: function( elem ) { return !!elem.firstChild; }, empty: function( elem ) { return !elem.firstChild; }, has: function( elem, i, match ) { return !!Sizzle( match[3], elem ).length; }, header: function( elem ) { return (/h\d/i).test( elem.nodeName ); }, text: function( elem ) { var attr = elem.getAttribute( "type" ), type = elem.type; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) // use getAttribute instead to test this case return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); }, radio: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; }, checkbox: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; }, file: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; }, password: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; }, submit: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "submit" === elem.type; }, image: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; }, reset: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "reset" === elem.type; }, button: function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && "button" === elem.type || name === "button"; }, input: function( elem ) { return (/input|select|textarea|button/i).test( elem.nodeName ); }, focus: function( elem ) { return elem === elem.ownerDocument.activeElement; } }, setFilters: { first: function( elem, i ) { return i === 0; }, last: function( elem, i, match, array ) { return i === array.length - 1; }, even: function( elem, i ) { return i % 2 === 0; }, odd: function( elem, i ) { return i % 2 === 1; }, lt: function( elem, i, match ) { return i < match[3] - 0; }, gt: function( elem, i, match ) { return i > match[3] - 0; }, nth: function( elem, i, match ) { return match[3] - 0 === i; }, eq: function( elem, i, match ) { return match[3] - 0 === i; } }, filter: { PSEUDO: function( elem, match, i, array ) { var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var j = 0, l = not.length; j < l; j++ ) { if ( not[j] === elem ) { return false; } } return true; } else { Sizzle.error( name ); } }, CHILD: function( elem, match ) { var first, last, doneName, parent, cache, count, diff, type = match[1], node = elem; switch ( type ) { case "only": case "first": while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; /* falls through */ case "last": while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) { return false; } } return true; case "nth": first = match[2]; last = match[3]; if ( first === 1 && last === 0 ) { return true; } doneName = match[0]; parent = elem.parentNode; if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent[ expando ] = doneName; } diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; } else { return ( diff % first === 0 && diff / first >= 0 ); } } }, ID: function( elem, match ) { return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function( elem, match ) { return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; }, CLASS: function( elem, match ) { return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function( elem, match ) { var name = match[1], result = Sizzle.attr ? Sizzle.attr( elem, name ) : Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : !type && Sizzle.attr ? result != null : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function( elem, match, i, array ) { var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS, fescape = function(all, num){ return "\\" + (num - 0 + 1); }; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); } // Expose origPOS // "global" as in regardless of relation to brackets/parens Expr.match.globalPOS = origPOS; var makeArray = function( array, results ) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch( e ) { makeArray = function( array, results ) { var i = 0, ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( ; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder, siblingCheck; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; return 0; } if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { return a.compareDocumentPosition ? -1 : 1; } return a.compareDocumentPosition(b) & 4 ? -1 : 1; }; } else { sortOrder = function( a, b ) { // The nodes are identical, we can exit early if ( a === b ) { hasDuplicate = true; return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes } else if ( a.sourceIndex && b.sourceIndex ) { return a.sourceIndex - b.sourceIndex; } var al, bl, ap = [], bp = [], aup = a.parentNode, bup = b.parentNode, cur = aup; // If the nodes are siblings (or identical) we can do a quick check if ( aup === bup ) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected } else if ( !aup ) { return -1; } else if ( !bup ) { return 1; } // Otherwise they're somewhere else in the tree so we need // to build up a full list of the parentNodes for comparison while ( cur ) { ap.unshift( cur ); cur = cur.parentNode; } cur = bup; while ( cur ) { bp.unshift( cur ); cur = cur.parentNode; } al = ap.length; bl = bp.length; // Start walking down the tree looking for a discrepancy for ( var i = 0; i < al && i < bl; i++ ) { if ( ap[i] !== bp[i] ) { return siblingCheck( ap[i], bp[i] ); } } // We ended someplace up the tree so do a sibling check return i === al ? siblingCheck( a, bp[i], -1 ) : siblingCheck( ap[i], b, 1 ); }; siblingCheck = function( a, b, ret ) { if ( a === b ) { return ret; } var cur = a.nextSibling; while ( cur ) { if ( cur === b ) { return -1; } cur = cur.nextSibling; } return 1; }; } // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("div"), id = "script" + (new Date()).getTime(), root = document.documentElement; form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly root.insertBefore( form, root.firstChild ); // The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( document.getElementById( id ) ) { Expr.find.ID = function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function( elem, match ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); // release memory in IE root = form = null; })(); (function(){ // Check to see if the browser returns only elements // when doing getElementsByTagName("*") // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); // Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function( match, context ) { var results = context.getElementsByTagName( match[1] ); // Filter out possible comments if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function( elem ) { return elem.getAttribute( "href", 2 ); }; } // release memory in IE div = null; })(); if ( document.querySelectorAll ) { (function(){ var oldSizzle = Sizzle, div = document.createElement("div"), id = "__sizzle__"; div.innerHTML = "

    "; // Safari can't handle uppercase or unicode characters when // in quirks mode. if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { return; } Sizzle = function( query, context, extra, seed ) { context = context || document; // Only use querySelectorAll on non-XML documents // (ID selectors don't work in non-HTML documents) if ( !seed && !Sizzle.isXML(context) ) { // See if we find a selector to speed up var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { // Speed-up: Sizzle("TAG") if ( match[1] ) { return makeArray( context.getElementsByTagName( query ), extra ); // Speed-up: Sizzle(".CLASS") } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { return makeArray( context.getElementsByClassName( match[2] ), extra ); } } if ( context.nodeType === 9 ) { // Speed-up: Sizzle("body") // The body element only exists once, optimize finding it if ( query === "body" && context.body ) { return makeArray( [ context.body ], extra ); // Speed-up: Sizzle("#ID") } else if ( match && match[3] ) { var elem = context.getElementById( match[3] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id === match[3] ) { return makeArray( [ elem ], extra ); } } else { return makeArray( [], extra ); } } try { return makeArray( context.querySelectorAll(query), extra ); } catch(qsaError) {} // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { var oldContext = context, old = context.getAttribute( "id" ), nid = old || id, hasParent = context.parentNode, relativeHierarchySelector = /^\s*[+~]/.test( query ); if ( !old ) { context.setAttribute( "id", nid ); } else { nid = nid.replace( /'/g, "\\$&" ); } if ( relativeHierarchySelector && hasParent ) { context = context.parentNode; } try { if ( !relativeHierarchySelector || hasParent ) { return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); } } catch(pseudoError) { } finally { if ( !old ) { oldContext.removeAttribute( "id" ); } } } } return oldSizzle(query, context, extra, seed); }; for ( var prop in oldSizzle ) { Sizzle[ prop ] = oldSizzle[ prop ]; } // release memory in IE div = null; })(); } (function(){ var html = document.documentElement, matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if ( matches ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9 fails this) var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), pseudoWorks = false; try { // This should fail with an exception // Gecko does not error, returns false instead matches.call( document.documentElement, "[test!='']:sizzle" ); } catch( pseudoError ) { pseudoWorks = true; } Sizzle.matchesSelector = function( node, expr ) { // Make sure that attribute selectors are quoted expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); if ( !Sizzle.isXML( node ) ) { try { if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { var ret = matches.call( node, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || !disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9, so check for that node.document && node.document.nodeType !== 11 ) { return ret; } } } catch(e) {} } return Sizzle(expr, null, null, [node]).length > 0; }; } })(); (function(){ var div = document.createElement("div"); div.innerHTML = "
    "; // Opera can't find a second classname (in 9.6) // Also, make sure that getElementsByClassName actually exists if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { return; } // Safari caches class attributes, doesn't catch changes (in 3.2) div.lastChild.className = "e"; if ( div.getElementsByClassName("e").length === 1 ) { return; } Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function( match, context, isXML ) { if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { return context.getElementsByClassName(match[1]); } }; // release memory in IE div = null; })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ elem[ expando ] = doneName; elem.sizset = i; } if ( elem.nodeName.toLowerCase() === cur ) { match = elem; break; } elem = elem[dir]; } checkSet[i] = match; } } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { elem[ expando ] = doneName; elem.sizset = i; } if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; } } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } } elem = elem[dir]; } checkSet[i] = match; } } } if ( document.documentElement.contains ) { Sizzle.contains = function( a, b ) { return a !== b && (a.contains ? a.contains(b) : true); }; } else if ( document.documentElement.compareDocumentPosition ) { Sizzle.contains = function( a, b ) { return !!(a.compareDocumentPosition(b) & 16); }; } else { Sizzle.contains = function() { return false; }; } Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; var posProcess = function( selector, context, seed ) { var match, tmpSet = [], later = "", root = context.nodeType ? [context] : context; // Position selectors must be done after the filter // And so must :not(positional) so we move all PSEUDOs to the end while ( (match = Expr.match.PSEUDO.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.PSEUDO, "" ); } selector = Expr.relative[selector] ? selector + "*" : selector; for ( var i = 0, l = root.length; i < l; i++ ) { Sizzle( selector, root[i], tmpSet, seed ); } return Sizzle.filter( later, tmpSet ); }; // EXPOSE // Override sizzle attribute retrieval Sizzle.attr = jQuery.attr; Sizzle.selectors.attrMap = {}; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; })(); var runtil = /Until$/, rparentsprev = /^(?:parents|prevUntil|prevAll)/, // Note: This RegExp should be improved, or likely pulled from Sizzle rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, POS = jQuery.expr.match.globalPOS, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend({ find: function( selector ) { var self = this, i, l; if ( typeof selector !== "string" ) { return jQuery( selector ).filter(function() { for ( i = 0, l = self.length; i < l; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }); } var ret = this.pushStack( "", "find", selector ), length, n, r; for ( i = 0, l = this.length; i < l; i++ ) { length = ret.length; jQuery.find( selector, this[i], ret ); if ( i > 0 ) { // Make sure that the results are unique for ( n = length; n < ret.length; n++ ) { for ( r = 0; r < length; r++ ) { if ( ret[r] === ret[n] ) { ret.splice(n--, 1); break; } } } } } return ret; }, has: function( target ) { var targets = jQuery( target ); return this.filter(function() { for ( var i = 0, l = targets.length; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, not: function( selector ) { return this.pushStack( winnow(this, selector, false), "not", selector); }, filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, is: function( selector ) { return !!selector && ( typeof selector === "string" ? // If this is a positional selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". POS.test( selector ) ? jQuery( selector, this.context ).index( this[0] ) >= 0 : jQuery.filter( selector, this ).length > 0 : this.filter( selector ).length > 0 ); }, closest: function( selectors, context ) { var ret = [], i, l, cur = this[0]; // Array (deprecated as of jQuery 1.7) if ( jQuery.isArray( selectors ) ) { var level = 1; while ( cur && cur.ownerDocument && cur !== context ) { for ( i = 0; i < selectors.length; i++ ) { if ( jQuery( cur ).is( selectors[ i ] ) ) { ret.push({ selector: selectors[ i ], elem: cur, level: level }); } } cur = cur.parentNode; level++; } return ret; } // String var pos = POS.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( i = 0, l = this.length; i < l; i++ ) { cur = this[i]; while ( cur ) { if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { ret.push( cur ); break; } else { cur = cur.parentNode; if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { break; } } } } ret = ret.length > 1 ? jQuery.unique( ret ) : ret; return this.pushStack( ret, "closest", selectors ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { var set = typeof selector === "string" ? jQuery( selector, context ) : jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? all : jQuery.unique( all ) ); }, andSelf: function() { return this.add( this.prevObject ); } }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). function isDisconnected( node ) { return !node || !node.parentNode || node.parentNode.nodeType === 11; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return jQuery.nth( elem, 2, "nextSibling" ); }, prev: function( elem ) { return jQuery.nth( elem, 2, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.makeArray( elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( !runtil.test( name ) ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } return this.pushStack( ret, name, slice.call( arguments ).join(",") ); }; }); jQuery.extend({ filter: function( expr, elems, not ) { if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, nth: function( cur, result, dir, elem ) { result = result || 1; var num = 0; for ( ; cur; cur = cur[dir] ) { if ( cur.nodeType === 1 && ++num === result ) { break; } } return cur; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); // Implement the identical functionality for filter and not function winnow( elements, qualifier, keep ) { // Can't pass null or undefined to indexOf in Firefox 4 // Set to 0 to skip string check qualifier = qualifier || 0; if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { var retVal = !!qualifier.call( elem, i, elem ); return retVal === keep; }); } else if ( qualifier.nodeType ) { return jQuery.grep(elements, function( elem, i ) { return ( elem === qualifier ) === keep; }); } else if ( typeof qualifier === "string" ) { var filtered = jQuery.grep(elements, function( elem ) { return elem.nodeType === 1; }); if ( isSimple.test( qualifier ) ) { return jQuery.filter(qualifier, filtered, !keep); } else { qualifier = jQuery.filter( qualifier, filtered ); } } return jQuery.grep(elements, function( elem, i ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; }); } function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, rtagName = /<([\w:]+)/, rtbody = /]", "i"), // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rscriptType = /\/(java|ecma)script/i, rcleanScript = /^\s*", "" ], legend: [ 1, "
    ", "
    " ], thead: [ 1, "", "
    " ], tr: [ 2, "", "
    " ], td: [ 3, "", "
    " ], col: [ 2, "", "
    " ], area: [ 1, "", "" ], _default: [ 0, "", "" ] }, safeFragment = createSafeFragment( document ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // IE can't serialize and

    ޴_d|_V//tAZ5Gѕ鷩i~JWl`>;=xJK:Qk(\JJgkxujc&/>3YRY BoǦuE5.˭9Rǒ=qIho%9d=J딅'wy5a}X{!ƈ5hb 6gaT :@'0˸i{t ,v1' ch-(O΅îK." ‹ѧY?Օ{4ڂtפ74 JH&&pNwp_qr˩AO$"w.cqوG gg.4vrHfx, aO LxHoc*Ppl[`m P2eHSz)̆ ^ d{iiN:r`Y.Œk6j$Yn4(Q .&~~%x+WLᆆsc].>ZC ¤{{?SK>ri /i|K%|Xm؜n6\_$Da*coK2Vi1N=Q2MIofbbt3=I}oS6jgږH3. tY-},2wV wȓ*Ξũ&ylP&\%Eh߼Vs  AP t`jc*~1Fv/һ8f {^^w1jfƗXXsޗJwtySf%\WM[پ>~B05[[V}fa|/ Ā_l0ICڿ6C#=&~>d͙ec6{0!c3„@@>fQ?]80 X|L/u~up#4_zD3H+WM6wTFdU eXKP3YʿqF(-! H gA71sZHqCOy8bOMыi(A~޵XfM@l]ʇF2RLQӉ^>xLC6Un/~7??<..$ E(t&?ł`Tt5!B轆K$BJ]r%+ |:w1>; / $_qC%O: +;F4?feJ@N\ؿ1x=&/%M؞MK;:N 8ھ;a~nCG7 L~H3~4%—fOj->mIZ1݌I>ހ\Bj[OʍÉ-@?1W>iL08Z7e, KLJ m5Lv3*J\b{*'<6ILٿ˖)wc4ֶ4>MƪM٨}*-ɢnHY6}Q:;;a#ylC?=3bu"[j>BYNؙ[4-ye =n%3-pJm&{K_#e?n䳒2kˡS?}9T3#!-V⃚$%.ZuEhsKm'780[Y+D%5uL*K:O(ҽg9a=K;Zվcܹ|Er\t^~|y^7V#sݩ꽵r^ZϒOVuJܓeh JWc]*!Dџ;FrPxUlT^*,9"i!mB o4;;C,mI:JSlLwsjGQxLbO鲽%ٗԾc5]hqZZ(W_{)G̈́@Ok18QOd " 3~,b'TOVD"oFOEx6Z, Y u\1s%_Ċ&cմ$-H<ku>_k>T;M-;_,{B Q'1nq9j;&M^ntv}} pr9pEB@@@@@@@$桽8(/{i 'NmnљO^Y|(>;$CƯ@T0 FD-oWEE#s.hkf]5<ӱ1-Oškq5Ke" Yt}5 A"һ~ѓs~ c +?y4ƬH[R4l ~ޘ_`rm/߻!WVEұE!7)nB?= G㈫%1{J=߈h>5y O_}d Q c2`hɃٽ}#`W齞"%>q\1x+[}Lۿ!߯W0NZZr[FsZqXn=> /⧊clLl.k2pxhG4@&jUg-ҳ$|HHI7lK*^I=Czz zGizGYzGzHp*ѣ =#3AZKhJ@oCFYAr<1İ@rd ',rkC!39Ӆ~$OS <ے&!r>{S׉xlOr^0}ZWH6`W C'mIݙlڜ.yg| |*! d8KJg6$W洠YvKM\|[}禳k ӫH_$F2?wlzc!C&7MOj3-|9r=,Qdi6w $J: g)dwSzޘztZֈMHH^mGF^Cbjnm4EV.IjJ纞䴅{s:dwٽZtOe6uf2}^߸[9JvvAu硃3IZ`B.YGΐ8uCoDk>*d\ҿYOvߢ[{Umj=}SȚȰudq&gsPDe]=g3dǑ'oڵukZ vd/yݝPtvgnDf7m{dEEغZQzĤ{q!d0vRr,mv%8?ClvN2"9d=&jLwޟri-$1ω`GnKj=O=ێ+vx4!BrNT_Αj9Su9 s*rss2rNVRъ9srWX 9Ny˹5/QS:圏S|5%J'.6|wJL X|~?1+V!!|Yc%T5Ӊ%xkˠ7Cg!ZfūtƞMhs>[!=UӰ7-#~"-a8ׄک'FH+;N/bS#\=taǯFE˲Zb6bA9-|Ⱥ=Q;uG^ sG/`hrÐU$7,#v:64Nz%nmt^0ߓF턪﷓lmơs2"lit~?7QTӸWWNV;p|R~J6y7Vyx3=b$bne8%y567aO sHs WUE3f,~=-O24NL|[}V!Aݼ_LhyKCq-բԦQJ_Ac SDF ?'Mc #ZxEvM +z]Y^;dF`9Ƽ_g+iwg/dǿ5v>}s)E+U $uak7PD L{6GM Or?ۑKi.rsǪU<ݛ>CAcw}z}i>Pf=ñ0p6s跡(}j5oorwDh8ቮflRpJk˿U= C vR(fHh)2u66,lD7<-M}ߤ!=7v$G4^`r‹o+|*kr~߻YjGD9]ҍ}RF?& ^?GK:= fNbjQ[ +8G}ڶ_C.J[/J{پ_^G I~lw*rvhW6w6~.g}N7}R.!$b{T_͡;eݙWӐ2M?/%!_ߟ}X.myVod؀$ %{d51ԸȦy̹&\wsE"]`iߪ$U}9F#Oh둣þ|-&&jW훑yL fx xϦ|j~{RЛ4:ɯ@4 0yh^~~Do۾z ne k2*[@zt3ޚK&CAusIp|QBGt iOOm;SgEÜ^2Q0Ij! tl9q\&>wn囨zW9w sY>OӾ ٙDW'EGiAwI3yc*K{٥֯`mt?W(q~.O+xiJet?oZ3Vegk4D"+ G@:fBǞD"+ Y DV@@@@@@@@@@@@@@$"HdD"+ Y DV@@@@@@@@@@@@@$"Hd#IO(H:s'Mq# IAy:-|!ASjp;Xu\)nX.x2'w- qty NՃռ-܅A}71&D-!G K<7Wm/;uG3j*/ǗaHP$O>iQE6/l1q27 8zKv{(K#_ִ!~IzLc2c U`X(nX8=t#GȦ`D"+BiȖة!ƂEldtonEOBi71ڼ\ZaΊ1^xY_Q &\583&W᧵wj9\oQ7pq<|WHB:MǜEh^}R<ұ}3=W]ĵoPHo!h€B< 7?6i18 J31Kj1h<`c`pTM05;|"IcVC mzPF†ۃzs(IK{h%|b3}R[Gvu'3OyM0T153 #|j[zkh[Sޙз20cN U=.՚m"Z[uҨ7~ɵCV>4F@5g)FEr547cZJu/FF|V_HW| z'#l,3vXiɹ*j~n192#IbrdqBOŧ؍his&s]g;4:kP"5S;WaU^>6J-KblinG_k,E -{ЁSyQ$7&}*2vi} NІv#Ԧџ}ҾfpONR2+vL(m0݌yv]ӳI6ܛGbJ&ըn CCߩcf3iHC>-[ nۺK@@lU~\n]uxȇ|xCʇNHG!65HsECzH`qzGIzGzG9zT=NjU@!MՠG-zԥG}z4G !: &$~t231iL/ %2 W!Y$1EOǭ-I\Z8\ !MFr}eG3=zϝq zV1A*tYGyځ~$)&Zo:-N9q!LnMG닔[ғu4Zۚse'>d#ɈXJޘt%([HӤUSL;Z[FƧXI)q4r.yRaUmȱ,¦3(q2F#t=IlJ8+237m"n<]kLL&z/B֏7 I^eIg_I_/ZDh39%ir{"Ξ%kTaׂoȕ,#f!qN#gؽw&$b QȌ#1v=^ځDڗ"J|u$ͬ'VgBd{PK6hiU$vK&Ӻ+l#;~3\$c gb4Cc3Ct|0>cW{)$qF?F:q'&-3ᓶ$HㄍnV G vHiMBhipE7!ظl_6%Ҿ um !g ?5TwP?roD~ =LN,(o%w_DNsM,J`&'.#d=GIˏ~FmWAb-z^Edi>ΔImj#v,ܽ:6(&?VnbO~>.@Fg42ىZ7g Tl|ʧ~eיOQym.{X)*8h}jaFd IFҢr!*#= WAll3n~&]9Lw,}-ESv$垚!fٰNC|y3>S̏>W~#Jbc$rIHi^=mo}&֞rtjXG2c_bUSW3Z&g)mb߻5,>l|dqјܫ,>X3[zoNsT&DiFuR9fd9"Pb0{RÀ@[`L3H2a1)ڠį:!HQOwc//rgX<ү zpW,f)}RSoo9t;[(Gs-ּ!)03lbݿdk_l{QdܜRWȦ 쥶BeOUݗŒ=9.4:#˗/'˗-䃴sJM Ip$^hYK O[΃Jc6~_,t`A]Yq¯q$崜.ٜ>, & uKI {4M2W:["w}"T}|<4F'_S˃4:81}tekC}k2By5k! f %At0$[0r*[3[jD|6PD lU%THIs"INh ܿ2㶅̎d6"ّ6BmIwض^N2EJ;E>C=p*[ȋk|0z00ba{$%IM_IECߡuȶb43SQSߚ h,nr R;;Ț5kȲr2&%V;^?"w&f#kGJ\p_ٮVtbV_^`6&)Oj]R޶_SːBV c>h[|bX"Gy'.7Va9ɒlXemhOu<\OLh䉮x"O}hdL,19{2IL~ f<~SԹX|eb!'߱+Upo9wbos^8rY$E.%t$ǫW ߐWOF-&XJydK&$Kl4D5h YyoQORMD־/c12*9c &Ց|6+ٚJcx&:ۍ'9虵j=R\]|@R'7g 1Qkt%6\MG$[)Z"~)3o1:ʼn-Y&%ƟWb楃/~!5d6pϚҾ.J0QjVeoTI?*Ս&LΗ9o*/Mg)%*ѲYIl$Ճ)<< `"u|bʗ4(/ޖwj7 /k*Fsqߺ7eE6ڃnGY,\E4bVVܚ<ˣ|R(UZ? +)彭mi}P77nyTywg|i[OvZ7X4P套Ґ֧BVDpG!t%/eteQ_Nui6|?TnUe[VoBl!ԭ Gcދʵ5_|=&=2|S.vi-"kdYwi!O{qB r'P|Qhg"_+Ϲ04Jy6ziԺ5o|FO'ת Y>oۗr<|rqi`}xE=0B:,&=Rr(U*.1pj=0*3"%cAAdY:<#Kp+V7c|EM^e_սcVYFu&sekqLoBr$/&m1([%Է-F yhK)-,Gݗ '`;~Tt'VeA@26bsj}^hUƔ8=JW^TQYf;dP<zǩ#AZB3A_3e=x ݉k'aet S_+"G5!Oǰςa|#|3k%v7fJ@|Dur ٯ7BfMQ1~'f%a{D{N0SITSGnfy/kfWV|V7 ߇3لKRՁl[ffbWU!iQKWb7<2]Ac1ױ36vC{nk;&FspJܞzlz \0 ,o>ƼZjI!w3/*;abM8~fw:/Ez ፓPn.Fs.S!++g"pO#ؕ@IhR LZޗf D[ ʓ)& Kn?IuaBvwo/4CPU9҅)y| pJTeq-vUt}"шYX,}%KRf%Xq> X*=3a[(҆UP:)h);>ϼD(t1oG 4=T 3ヵcܦ1P=p,AhUY_ն GZIROM"-DIcxf{N&E yH|.EHn CK}O?8a]QC fc_} /q*GyM_ϧPh?^ǘ1YOSo4vsEOa& DYii3dc]gQ=/^"S|g.|_vliq fm#V}jѝO$lٖZɖ~Q-KbKK235Me=WkLkiNUZ*r@Y}eW{ m?me{H+3zo|YRr &HUy V}JV/-^ޛ{w> dZcL$*He0_rA#M%R 3|S$v$%uM0YMhYɟՙHsoi1N3-Q^(ǻ&+Ӟ1~gs|[b~M]/h?2V_a2n^C6}`͟dSJ;%)Y-*EJLJϳ~}(y>zHYߍ Sf79ߛ([p_-4S#._s3[O1SGZ`--qW7:I{]qS^Y=KXw!j\o<\_gn."v. 4oXz0hj n F /} `ח-s-Қl ?-&=:3)Kod<ŏV)jN8i7s=m:m>iYz=5Sf w-ա F_>#8Jo̩xeÞT CY;a{L㛷9T&0Y'\ 4F{{O?27R:-z {ٷ/s"ڼ۷XVAՎF<<\Ahү*@1_Y}H FAڮ>LTFM{ J3o!|Ɣq9Mn؏Ќh  99𦺷e;Y`0X*hgw,H1y2zëfڿd>hdN\>_\F\샚OPsXñ}u{r{RWE#~M3 1=:P-j:QbIr_ j{ru?gpxN^~iSV7QoEf8Z]!HW:M.v Ѥ"^t,PI/ߗJMyǘir$??ǗGx=hm2?J9 JkW5@p' >$?iFuYߓT ?/E\]\1@ ^QߥKɊxj~նWsWݾ6lNIM+FvT2P&4fIz<݄ ՙŷ!G~ߧО(vGenWڿ<$(QP)hf~hsd?pqПGE_~8L@]Ցo>CoT1̫('^H3ZðZBbJN@@@o}R?'i}%OdI<|YBҋF]7"`zr߻|,#'f_RFAdPɑܢÇȰL-g?m.bӾ ."|=I/9>y8|$/o44Ih6$?e=-jC{q&Gw2Y8l'wDz~OpoLͼ'GmϋPy%vĿ* `ך6Og,Yq)9ɺyiB㉢Ep*-j;(+G̈́Z} G ͇8qvv|{ޗf J ^VC~QO4b\O*V =Ok+n]O΃hMۗP˳0J, _vXuvkphhh?(2/iÂ߿oꆀL_yVTwTEW:*#Ÿuǃ;6Ԡ㥭f.*X+kvq:ow4k+lB= ({1FSϰGE3{WnEx?{vs+>$?حo- {C%3of[ѾC(v| fTV?Qwrf,J$bŭmL6k`CȸP7"~?ۈ su_=vA*2A/vXDX(8~n-鎼dw̨1 Nؘ;f+GQXyu>xak ^L'#<,Uw6b|.ĭ|C(a"D6xR?|ʾ#j1jY.}>%V3 ]ܕ fKW9c_c;h]\3Ro}u{Kr/X5Üx929ZD"4'e&xȨ$}4_$l7hΌ >ǜ٣PK6@p5'jF)BG4liQQꡬlGBp[˾M=8SiO3jmsUu \]\7 ܔJ`޼GL>(ӯǯ3z*4:퉎i2QYr~k#zqޒ Pmvz;kY ͛#a(I:}Qm\j3֤VvhY{)Ǥp&GNT]{H'͊h'5oq>S>%.V%Y6Ig<5rzAbUvp4YS>Vt*QM"4h5F|676naUdbm}Q2%oEm>>E&"aTKJs%Dg;Х֍Ff6NǒmtPʑJeLOWIuiRy%>x1M.є?tS "b<[l?i1Q\.t#Gjpi_B6%nS#0^Pủ]Mcɩamv|$> `YUfav(-ۋaOL9Q Pl]:e]<%Ŋ&Wfݲnbw ~Z ƫ"'rc4^Żxp8>ٳFxwOz,f7x^@1LtR>`6-տFKa.)4Ysʣr4ѢxxWxeH6'Vȵ=Vd/*CY?tК]q;YC_1ujW1§&['~?NT1l49ǾFs>AZGq>j :4/oeˋB2Z7Cr8C>d])Tz@fSfhLvڒxȹrrd˚I;utRj0]KZǛS=MU66v^ecTkLɨt-zN9q!lΏ{c2e|r˲5d傑̇`~o[S*ʏDRoM''c r.\u䏐{s3~VF$I&f-#-cJ};ȿ;aj{RSg-'/ٶxsŕ/#2E>!(l;{FYi>j9ӿ/ޱm&SvoDBNL6lgF^8FdSj+oe\ ;?yJ$&BqrA%8H5u?"2r<Δg9drũV?RLREspZt=?H_^G8VH>s,n;#LSy霖B6cj'M͒_YKa߿.taՓE+IK!=2*ߋk?AۑdLL ]03TբxO[)r9)bcӴx{%mL%̝SҌy@oہ@(Rz@Ryx :{@эYs%v'Rg6 kjȺ=iTJϪ>7Kg`?{#<աb^(;-G(=}Un Xz-szDꥡՕ76V舗hE}#oH|ʾq/̰Ȉ9xq\EJP݋sZ\VsTڥWVG)D˗a=`ށ}"˖zV@QsFkt E%c,f|U(5A;l :S1U1tx%nBo;SMVlDf1>xRvkc|,vL㺴 V8#.wQ &${`EACOO, bSOѳ`{InzY K D W[ NjwQI?R1V!2^kG[{T/襵OBY l3.j^@ۿ\X;WRk*H8陸#u#|M:$qZ:|I|~T{+T8od9/v(a쮘=<{=~f+-"ĔnVZ`U,<*—g4~NЮSLZLu^gC{qVSM׫[;瀧~p &Y.!2g+:/ 嗫sC;ϻ^s(4dzQ_ߙHhSsjWlUR$N+R GNBص$\8&iw% ܆ѻu=mB YrOt(>0J\P2бOɤpgY$I"U$n۷A6mФIt?~{\~Z״HwBnd%{bwrwL"QһNwp%(Q(k WEgi>n:fK+ͯF)oxOi^VԴ^ʹdS)|uh 5Gfc?bQ&nH/{]ЮrzS4\ ݕh_$򩬸@˧V\ 7W۩f!uj+GRxbc9[%Pa S-.8(/,Wˀrlr^7 {2CPIvжu34i/Ɗ+;THRrS OHF'-0\ݤ7,i(SMDUV4!XGV#OxCW-!ki-{5MnqS9Mas_[獡"(ULOO=V(>f_ c0ar-0U]č0"IOT>%ê>@vn>-R$cӒa'z[oUOĸڃFa(Izj rHtI 9NO*< ,vz\=G$4~5&+oSwG#*޹|]1SqJ-8{%t<{(nx=x-\5*أL$rh寁aVh_s/*ZW'|~Tɸ1_?cy'fvꭝ] N]]dVs˗aS֍v粟1YwdNOϿ1bzr}t}{#B6AH)U?Q}v/N phgx0C ߹%G_@\i=+x-> ΦѮ!3/Y?H0Tp"K 9A7ʯ _hִ:Qw%Ks*#{<SvS:IMՋ)}Ɠ^/hbəyU9b GUDƞ7+n[4u]b׉S.?W)wT)Ap*_KE>{?5ڋ|zfW8E3OY+ܷQ"},?nԧ""1('ۗW"/-w*xY2l :D@;A~0S},-OlUX_ gJՀ7,%~h= x5a[5>S9le%Z8R Rǒ7?D^#ZZ+R ®yBk[3qrX&4bN[<\ŭ U=Ea7/f+J렧&v)ޅ#;ϯ[FBZR뾚 "E?|\;npx[\;bɶ+)"~g-l,S߱ {X#-k%]Ĺern[-SsK~n/AM' LZbқox}bblKaoW=Ⱥp imYӻD9H:jKbv%U=F5 #}߹^_A>ګ_ |u{ kc |8ÅmE~ZU-Ļ;&-&~k˾kd5kkk=O;Ω=2D i__K?\2k@zk 8/SGѺMXVl#a ËEjYڕz`+pV?)ڇkO{a225EaXqzfc9YBpxv>^bh?q8^ĵ_u⺽uJOAC ܎"4%@눁ga7gV0U,;՟/ nJ]Kt'WB _[5|jy~ [?©R79>M>|#E/"GuRzxKV9*_xC^eƿ7:@n/~-{2=9').1j(<#%W &15 sO]>8 e8ݳ5t6.kΦcfݪi[[f ˉwUoC<'dˏ<1*?졏)9Fi;vd/7ugyyܣ`[2I*O' S<5 }k9m==#k ODZMRjaLknWDa/7eژUژ/V#@ߍ`AiE?cZrӮ _ tZo_x>t_͹;.3Nz~a6_GNq97w?kVgco>[\Ci<͕\ 9?w?cNFzitˡH;@鸳w+MSYhzϘ*nz:YVմpÕu:S{s³T!L  ?Q#`@L,z0ȉu>32{"vٿ`:5El8l݈tĪLgT8hYw>Ø2Xi ?,Va`q.K{ўm]]C}iz !1T4J rQY'Ed'ؤGql%5*zhȢJjΒiEK59ٸ?.NvBjB!B,!B!B#KQ_N[VQh?e8q\%,^9wl[qMJB!B#KM/Ǐ!LWo_c8wMw@3+Z7j\xċE8Nh3 o=o OB!NT8*3ms0i5 %0m.PwT|6S0wAu3ۣN83ݧc.$Ev~.hXr[:LsB!Z[dkV`P./Z{I̜384z4g@j&rǃ_=%}/bu /m8/뱊XX{w>qw篸u(Փޓ?1ÕӰÆ|~Xd5G=amHR^M]_P;3}cRf9WytΌz*­'Oxr>5l*HL"Vu~s͓.ߧVCg޼Io~!3S[WB!$QnFPqWC%dRs/er|exDY SꊗTz}R̔uWSj.^ʊīxux(^uxSt:SzJm/W|Iٖ+'dy5[W..#~p#ߗKM31 B69>VFDr#:PlaY!R>?|h9FP|td$<3KBsφB]/W m; #Rn9C)>b\T2'\"3yOq|԰#_BS89;g^$aW+itd ?R c+%Z;H"@ &nY>A~򛛔<ʑ~&q|~?ޮÆȧ\'Vȃq'=-޳j{Bx3srf%+;b_ZܳxanH? Ɖ݊_[KV\6:Y[SZ*xWgB,'rc|?p̏#"pH*yXˣ%eIly.pK_8LO1`y &xW(adRB)qu8\eSJBWj:he-J~"%Uș"hp=4|F28~=Ŝ_׃HZlo;\ȁd8W% )üAϠr|6Ei2mõ'k~3],Uo~W+t똪J&9/ ǔ$q\A o1ı<1M<i3C zcCfg'`TTLXm)-E3ݒ6 "}EMcY*j#jpe{ԤVOkED\ۋ&y:vvÅ-?uɞ2142POA!'HUqf#+"EzeB!5ZL!B!FB!B%B!Bhd !B!B!B!4B!B,!B!YB!B!FB!B%B!B#K!B!B!B!4B!Bhd !B!YB!B!FB!B,!B!B#K!B!B!Bs5=֭^eHd$~F=SO=SO=Soz8y3w;הk:k7CEVﳬSO=SO=SO=Ws=l B` }EB+~QO=SO=SO=ǗF6k'gٜzꩧzꩧzꩧ>^4qUɕlSyzꩧzꩧzꩧ>^4q'Íj9y[ꩧzꩧzꩧ֠VY'ތzꩧzꩧzꩧ>^4q ER~SO=SO=SO=񠧑cHd](3zꩧzꩧz꩏}āZOVx>SO=SO=SO=[_ө-5eMfzꩧzꩧzꩧ8;k/U;ng;ꩧzꩧzꩧ8ֈY酱@?[=zꩧzꩧz꩏=l 1ތD=SO=SO=Sz8"L^_sszꩧzꩧz꩏?}ͦVZ˿q0¨zOHH@II rrrP\\ m<@cDsNz=堼\p8P~}|N?ꩧh45U֜ꩧz+XӉ͛#==0ghpQٳ+V@Æ ѦMG=S;}xܺd Rw)+=Do)^M>jb&/YD t5zꩯzm޽HKKSHRR¶m۰yft]}G=S[} F}U\mlMx7o{SԨ֚Y=O(B Vvz8" )@?uꩧڤW>zJbb3.2 J +m߽{Vaz꩏F6"uϜzꩧvKJJԮt)LC[q?~t؞h-&xݳ(pfᬏw?i0WqQ9y|ƥr3\[p^ %#Bz 5j;SO},4q/g2?Ͱ@M=S_999h֬YTX"%/< ?o !`C"MN#CGᚎ_bupੳ\#M@QЫ?:}u+ow ~.Gݤw.*ҫ^Tߗ^1nի,SO}tzwL5eMC=S_Jl:ubrJ=+&^eM} J`%bqisSqYOugat]1u719fN>J8Ǎ8X\C@b J\5wJ.O1aÆ:ŬSO=id*ZɳSO}-ח|h mo`xpgOpZz1b+{/R߻0{Wzc|l-G?xDO6{x'pϮ/`:gq8b? p33pW71r#1kqMV5C?to's0gBgmxAÏ+ ɛVgLX~+z( w8!!On:j(OϏXVʚ2&zꩧ>z=l !SꩧڪW֏,"1yۖ㲶KX \Rqp`{ 휆GxuXEeZS2GFҤ[k6ܲF1ػynn,R4-]O,][ˌЮxp*~`>pۻXw\٪jE?o[vat~/g1귻ZQ!aX2{G+޾_W}Jw1+<:tzt2ۆ_򻆢.Ų\$+?Ċ!t^Y\w\&oĴbךO118Yȍezꩧ>J=l 1ތD=SO}Y^)JxRࢭķ9(;V{-1`}vC ln<#pFnxXx-j(ۍ\6nx6N rzO,u8-6Ƀ.=G֦NPhuN`Û7}kE'{˿??1h}xѰy#|rB*$WyŒؾ?5wcGyƐ~8,ey#~骮'fQLX'~ 쀆]/~>y?2 zꩧ>:=l{Rh&/ٯPO=v}YYYo2kqړԢl\\vSMMMEP/piSTnoܻ_G=783ח Gl̋\OT=W=nrX|~s[-P•A/;r*a12ȻwAEؼs?Pqfq%Rg_Gp2zn*]'FRڶˆ .0XX2_c"-Ґ$!]F&R#Rғzꩧ>Z=l i п< aSO=+-nzhr{o&=_c 0sVR~5Ns+oJ3_ va/aZ%j4dHb D3۰7Q@+|bl^*,e⢆@X$GᄋVJmoݣD>\%AYj{L]*>2eceso)XzֈVY5ϛ SO}m+3o5};w;| yyyGyxmoWkҨ sg} 7fX<Cy{bj:{58$%#8_?7bXpI2t^9p5 s@!R23棦t4xw:7eЫǴGE8b{܁ᇁ{t ? a /bC8BLpoK. %J}MǁZ73<bM$ߩzk^2%ۢE C=y?7?@-Ws:v݅D'<2/B& ٘2i$DbHsӔū糚Dy<\vex0V.)b% pu>fIֶi9N 2 n?#Wav{}\+p:Y#_M7'aq/1c_Ѡw'өmW݁fDKavćXGG#$<4g3A?,q=95Su8$i/2%)#1'+;M6M6SO=Qk ,Y] 𷤷?,N4h񮼔dM>ig# SWSO=F2q۾@z{RHG,22$:pX3"Jrt2P$$MVV"[0!Q\r$8ӑiؿ2tw?5߼jTG+iUR\bߺ)=MiH?m41ob_ꩧ 4P*+)EmlMx7o{Ϟ85f`O0QO=F3%Eȑ#aFۅIqVC  P1SIUBfbaCnt8Īf7++Ī8c/7L{W*E'ZKLݻѴiSIJQO=GԪYDm5;SO}ԋΝ;=SeXb6'e`qSO=15^!3{Y5KRYzk^iTZ~7:j6qkoЦM+SO}L7A/Lh>SO=kdggcƍرc]#)WVvik#QO=GCVqj*@RO=S={⧟~͛HLs9G-cSO=1Շhd5=˺PgN=S_{R< Pg1^lHD(egҥXjOG=SC})1/c  Yg'7#+G}@3nToUzꩧzꩧzE_7Fn“0WJS`Fꩧzꩧzꩧ86=S\RUFVB'o2CK#`9hrW:/ Rzꩧzꩧzꩧ:yÇ->W1.庩_l܆Z'ٕCXY0f#ȼkd ١ٺ>}voٲeDŽ~2ThW**ꩧzꩧzꩧ/++;gϞ-JKmnbL5 /x4Ll03k6nPLbfS+U7$#Y?[A4!B!rwgA4I,7{̩2D7Ebr#k6 fFQ dx=Q.ߋ82؄F=0B!kZ1avL,,`8f6)-3Cx$ن G;eTI2 U |6j5 mj6PB!6ѓaEV`lU`&:TN["єbOsFHܜD.fS2lصB!`dZU6X_ 31N9tr#Q5@3ax0 O[t=݇`]ale^e[B!Bi-35PV(62\$V-3 }Jӛ`d "ACVB!B1LOʺar-Zja^q D0s%A>k6fs`F0nnUkҴB!R} mp[d.R3)Gq,(2S[Hg"kwV*1^YZ0k1!B!kV#1ZgÝj=@@ѦFFt ɃG;ln+R+(jZS1ґ-B!Tv][ex[;ccCP-N߈l4BIA""( +`%aP&6WUB!B fb8 glOQƆRkՅ8~\)@k\Lq"(DabNy%B!j6Ẉ9\3"Bj5)T _&Ì;iSHHA"&($fj3iwʘB!gn#LơljI ݴhDZPHZ ؆j5og k4&6-B!cnCȆkfÙ8i86_)8*9ÝʜJQ"wj>Z2*K1[d !BXu1Bmu#ɝt#6S,'y:F:ab͆6y f`,cIJEB!knY'5[Fb^cfl)%&7Ck 0kF֎ԼB!R}Lk8ڲ٪0v{ Z)#0vޭ.ѴB!Rm8Lmʸ2vg%2C 0~6j0C3",VVw(#rl,!B!5icdhm(+4ˇQX@Gjf@R;v҆ƖB!o\XޤOmݎ0pGb@c:LZpͬla:%λ]Y%B!jj8XEcbeוLjUkt5)y2vZb5')!B!5vocWnKt0᎓ fjXl`ň%B!$~ l8&6s̈́Pvc\=iS#k̆{YhBʆ2‚r , -!B!g`#1 l$6yGmb5a~#1\̸ +0ձ04B!T_jpˆcbp>517ȆZnnh,lp' d8Ȇ4B!T#H<њY5X9xW+#XY;23Y;{LڝI9P"I+YB!BFbf14תHߘHnU5/T l,LIU$B!SUf6K{\quX. ge2B!R6݌cedcmbG 33#1@䭴ck9cJR!B!blcahcalՆ2IL<3Y](ckVFca`i\ !Bx"OqIlq03 M@cZ#1܉B!2jHg7}bftǩ1@xg1eri)dheTUK!BVFWHZi5.SQ 'E]k'athʰ [d !BO.ݍ1mbcjvifشԆpڙ3B!R-o&64K[YF2pq@dKbn0B!Rk,b8-U=JqTb&JQll%Xw=%B!ծ.VᶡxZc+nlCXzIB!50ږH&lUY;6Z+j9!!B!gT=N,l4Zت0@&NWc;6JDMB!?3[EF2S"5vnJǩB!BS[ǐcVK΄H.kkj2cx*<B!ƅ*, CanQY%B!0Ue`8SJ1>>Z;p +*!B!4ȕ&xHͬ](4B!4r1q>iR$EM((#bmX|!B!ӐrrnSmL6YPv % !B!qk|+c ׸3FkfH;6PfH0٢K!B7)LU9ee"J}u1l%B!湪'e6>Q 3SAJQdDu&WB!BjZbdB!BA# b'!B!ƕFƖB!Bh\idwB!BhXidkd%B!РVg#+LO0B!B>$0 !B!B!B!4B!B,!B!YB!B!FB!B%B!B#K!B!B!B!4B!Bhd !B!YB!B! 0?-IENDB`DisplayCAL-3.5.0.0/theme/DisplayCAL-main_window-shadow.png0000644000076500000000000030024413242301274023030 0ustar devwheel00000000000000PNG  IHDR$ 9"tEXtSoftwareAdobe ImageReadyqe<FIDATxyUu1A J",ɶuW{kkߵl^ei%ڒ(@" 19u{NUuwuOwO {BUW8uΩy?(aB!B!dB A!B!}K!B!B.ל7•$((B!B!j_vA=HA!B!\9,P\ \12M!B!a<%땋h; !@!B!\Yrbi&@\8g1X. !B!2 P\8}LqX !B!26#,d PRW\(Ej "۾LbE}#B!Bh`<nj1cKnVQb,xBd[*\dL!B!'X|HpԦxY=% Dl tX B!Bh`}cyE8E 1%=s%ƛC"/t۩BE.mB!B!kXsIzOdZg%A"OtJDzB!BL@`()$#1(I61dȶM!B!+d`䰤Gz¨ksMjɛ!ӢpF6B!B!"ݶB>F[^tRTr Plg'2yM8I!B!+#Fd ku a"DZ>g#L0D.}!B!BHzH;"WR"(߳ȵXD5<&r&!B!20I-*2WӴMH%qe?U&FL:NQB!B!'Jd Б|g.אxH'JFe?Ǫ*FYtAQB!Bx1"$""6ĶSE %Eԇiňm'B!Boڟ?QK„$X9$2Npz?Hamߞ'G!B!\>u 11t6'׍"ײ jJ !B!rK|@ rI=d%Uՠ A!B!8N} g1"h6-"B!Bn4s]1 T$U+dÙKB!B!?LBCL52}%=$!B!<$ZAv&zL#CB!BQVe3V8n,R0%!B!rc![V䖑N-$tÀ22%QkWҢ< 0!B! iY4g1q_BҕLbܴ`STiu{/̸ }-Q[ׂB!B_ᆙRc\^׊'.QM!ΰmg0/b-aPízB!B!W\K|fJc㍁33npD8CjXX-T% 1@td8pA?'P B!BQjXB6D 0wC0 $rh{J4].ȼS=mB!BP]8zG}4y k.^~^ IȖ2g/ - i:"p+ M*2 az;E%рWCs@{4=&틺٦Qn}L{ [/Smǥ0z,ڄg׈ckES~)m_6B!Bu:zgݸ曳,Jt?"M,Q)Ѭz17c]'b~ TAt'KT4sCl~!%1*bc5B!D¡*`3q~0 mEb+^ؼo>ՎB!BDk@Ȧ\8nJNH0jD= JXP xDZ7G(ET7)'/D•.2^aVN4e3IolC;|`#x[4rcmC'F^y!؀OG"]Ka_ytH!B!)o(qrG©Ѐr17LE}D#w:& QiP=_w!vx:^pDA(]Kg}MCK ⦶~e=a>ǝ. z<s!Xaۓ_T$!B5㍒\uƫ("H6ЉqyHxݪb覇ĭ@ヮ NTYWzhi_s Ӥ3x"e+,ut4SHnZ|rv9M);\#1YEB!B!0\o\a!"W=`L!b(.U]Z#!n{h;_oRwYpc/$E*G=0Z0uZt+S4< ΐa۟Mp{D!E kVFs,A!B!ם!4ƪq=rF(DMӽj=dy C;ʿF߭+!h`C0w"s\Hn"vEۏ44's=8B<鉱[OܫDoF,lckJ1V KXL(׬gVB!B!Iq %!Uz<'bqrrv:޾UoEMtXhk;P /^I|[̶ƅYb6o2lfB`xlT"ڰy%n~Y,^_޸=Tj؂ ~*yhH׈_-6o+B!B'F\/H3k)ALs{δ/D'FI\( V| t<= qj̛Qci;6,Yءriċlb-q3Z?>D8ŗl7IہgvX)V9@3HNn:c,%B!oK%\i8EJw~9Osqk7^Ƕ=59rC_~~20yCU!ݎ {wz8*NRK&S) t_)xjAcf6E#!B!B OCo{Kl[zb8ֈPT\lپ]jnڕ3ᑕ(+)j6٧dFB!BnXJG\.*J,rM_ ڌ("npG5P[Q?,nFf [`nlcI 5h3e8N;^1.9)} Vg a *IƼ krǕvl^LB!Bo ADXp+6b1vhcb׎'%1 z풢J*ɡpoh<W9 |!B!E moē2Wwӛ[vlx2΄I; 2ΕK/eL1wTRi:~܅= (;‘!B!DB8HJׄg]`ݴ6Nh&, ԟŹSuo&$zq,_ccϭعwb4c0qMKs0K\'G}4`*e9!{\եi+B!B}v\V딄&Qlh2٦c-0Ѧ`wdr+= B!+"hقr:eض;Gw}{ =yk;N&};G!BHj:'&6#ضf/r[p[9\ 1{B!Br ?S!Qj ْkkB!r% i>{cB!BZCB!B! B!B!dWTu3L!B!Q\QA⏛J9ÄB!Bu+2sHB!B!d¡ A!B! !B!B& B!Bp(HB!B!d¡ A!B! !B!B&l|ӏ {xÐ7,aq. Ry.by]w`ђYvۆ?Zհ=x("~_lVV<|0K]ۢS_E@"zQ}xP 0\,-!XzXqy,N6"f!KX,qPb8b\梋4Zc=%]B!rSu*H+B$r[J1 qC^"r ^S !|%Q?w*̆L[D }$_WPPk ??aJ+iCF> 0^+.WX%`Δ:RKd]ȱ)lc674SMno>b d!"MFpC|*~s !B!\%A"ԸܺAH&|nM.ǰf`gm+Q-AB )DuKEuq>9o8#.k¶tEaŮ<ʇw-DYU)$zhaׅ؃w߾Q'~|(-ʅ QSZfQPj=T=Ͷ>T;" lk+NnBhp=#="[0ňc$O\}B!Bo K5^0a#N7ADž*ql8dXzE$Dۍ{,@ʹ% ''yTW]1lA°#▼F]AD^h)X9gJ >Kl϶-:(ć.kξ~;و 0![3"N1qra y> Ҟ'!B!  7( (qIh@k8 瑂X jk̛> :KaCag? B]bq1wNl0▼n{GZ E#8tc0AH!"xR?m̜ cj*R"bA46Ù泈 ^G$" `$ ;f'A!B!$.XB F}|;/K5!W |x/.@<#Bz:pG;#ȅU0c 2CJP N08ztCa/!d'b\4Ԛ}ѺWXjL5 zpDzz`Cy"v3qeWˌ`T r>gB!B!$.$F"J(Cto#"e5e8; !-{nV)j 9:}!ݯ@)pa抩_/qA{F$H1b450c"L¢ 0Jap8(D s$'O| 4=z3Oϰ+ĕgB!B EX )CZVc+o^@= ِ]²\[\Ǖvh›cDb L^Rb %p\Q[P|9sQ3"buahT#yJ(/2&Fe WB\Oٯlg~H'Td%jl[E~ 'cOs7+%pUVrK#2?!kPLZP̅G9PC~zO ZuqQR\ԛ" ѦDXFHo3 LO%2͜rW!A9!cB!PB+9D6/d~H{~gE:a%sK ChWC5`Cl;{k|>3d2KqkG Ç0<96De"4B AALEvaCAHӰt/~s}!/B}rq%DgD ։srg8*g8)Bhb8E8Ue8\c!J)U0Wm>(ՇP?!B13{dR&A!B`%t4!FPT1B.^a-MEܣ@vCqp1}Y%e0 %nviGBA\B<2g fpR8=7D[7PGD!D 1$RxI+Bv(j3ϕ1  3]Y]ޡ dޛ-fF͑l-\Mtz>g4gڞEPr[ymԺ>,53EII1/N/UB=|S#FEH>o:NGW"A!BK$%L"mF^j~5gA.rnF\7 xCig#a oGt F]YGP5H#qWNtb[S+%Eß}&̝Y]m fl;؊F_PŦ?s|%|o00]WsgAuxgZCկj(x)5 _˾a8zϢB i{㫏 }~D/k2?O0 |.V-#v;g6"b P5yG 8獘g p$jtՅS)5WLM$!B qɂ$O!D"EiB@bƒSPՔP aVPaxN0 b aP5 #|[N?C!>°mKpRԸT0 n/Lg/p ŽЌCII+m/@n^ Ĩrn5V.c;|lBo}t߲oFT"`z9̬ӫ@JXs{܋򐐩OW)V/DIaCŜDŽcS,qrڶߥnVOo?>sfaA|CtF_9'oܟu$[0/ ~1|M*q|9,ngī;E $!A!B-H B8yHs3p1!\K!e4V c[iee0 Fm6T!|~(Myp{GU.lJj Cxv%@5:E%䤕Nc-nd] wvdKߨ6ͫ9ӫQYZo_"zx.|?+uͩuaI m_3tཚþbOboEIQAh Epw0߅G?/o?6d~}֝fbz4f{q>#p+܌~>2 |k0 n=?gufw/ʢ}wU_5B!Fp D,%>9%!P [0KyxЫ|Pk|b5?Y#TF0G9[`WSFհJbwa=y5~<|4|SxOߎ|v#Nbe,kA{>]~Q 6]̪-Qc{H K5&W_PZ@1"XB:6.A[-2\zyJö]3q?zutt 5( Xi2쯾A/ B!B(H\)FDŽ,H` " K(Q| /F0jbB50bߠۼW,PEHjgDF/^5E TQV!ĕr/G aő"CcKԱD-y DJ((F$2!ysq@y 1{Z w9w ?0<\D,W/G+K;1C#u,^ssܺ"|9ʹ1{quXly Kܸe\.KՃ>sߣw/5cPd'eRڎv?|e)ch Nۦubhxpq9?"Ihn':8؅&F~r_E>/a I;Ew"̚Vè./ݫϮê9expn󗫞XD@i[  >qX@yE ta䮽4B!SPE5L&R5!%D5 F^rsAhE:B]؇W\t$'+S*h' fׅ<_&y3(]+v-PH4R],l#VHHb<2s$eMCsw 8_-)~)=OEUP[;$>p L-[r zpyCRI>| wM=i7TdVK͐1΀p ~u,ZueyvQc7FTӓħxhi͈7Ù~dS (Spk>89b]|Ԏ xȠrM|/̷3*+]2} bkknY|;L5xjF{u?g1_xxv{#w|:^րjhn%Q B!eAMd(BDTI#! O>P\ vR=~JX#8) ݍ5#-oo@$Ѽ#t$9, lk7S@P1RR_ ʽQG0o@lbsCqCQOFxqO63ŒdXXŪedm=8օYjwG{2 s]^ey԰;)D.tTh&Y7ß7]"!B-Bː %+_>q,92 mGw>PT TW7$cHpAD{'+~/|)ք9B4dCknU1b%l] EqGk-,|ص} =:5% 5^y+LC$ů;ni^U> Q^Z]vŽMXw2̘2 wͫٝݣ*U(5=V: {PϪ2dsd+j b<V5S97Mf؍|} }^+=KooŰFN "Fϐ_h&(, r(և.َ̟[)}x<U!B!$.uu!Lp  5-$1PR xɩo* <U0<“4DKUS;- U5 ;WA(*;0/Zi h ]vMEqI ⨑ k n̛a%W} (yt5"C #!CZCϏTĈhr@Ы$4+}+ l=sH1"%H6#ꝐUHPQ[ og%4^x(n骣.hTCOzBKm;%N( Ѩj˛0SjliԻވe .[>E˚>ļk+zS,iY1&8b5of-S $X9pwƩW`$,x0~%!!2?FO0x_~œ/r΢9tE5}I̯>I .ƌnt ·L!BoWC£&,aN)aҞ\ X/,!<#%~4%>1@*TjXWD><4 8~wGx&;njDmeCS{zUYà!B!$."Dq?n:B4$°+*JzH2UE(˜Њ)J MAo F< >'M)hhXX CO\nTWaC8Up][ԡfĦˊg>1*O`mAadYڕy'K{1sri?]|p<~mC:ł, F"@o)HT9F)]RPō(\F7,r?J ^Vxa*l*fi?h| Vt|WcgĀ**%iZ]xEKwǂ1E};CkC>~~Nv[(n:-Zd2Vq2hy~ 7kw'+nlߝ&*J !B!ĥ9bX&PLR3W&REZJ b)Hh%X((f[ S)Qai5pMA#R9W;BO1d1"VnVWBoq%l"J{E /qd.;4#(5!" %stՋڧWSQ3VW`ݚxly 6z5zʸ/*cU,&΀_b4?>{lܿf*K q vfC󀂭ņVNo_m1ׇN:a\G"#{xvvqo9rYu-Tį+GVρە"ӆ[̅Iy\ ^_5hG_4\%FNA⟰h[r nS0E 8\Ǝ*zh*zB#B!P4VZ4 YVـ0Gl#􎈉1uAnZ 1"]BQ gm/qRdJ"6 WH&TpE-DDb[ l1".B製"詞0 +1ئC :lQZ St]"SC.b02U}`0!Gt |Gyt>cU}>f6LEEI!jܺh:Ӫ!wC~챫JA;eqϿ1c8ҍ7a0=+1<-CEY1>q"!|]*Nvd~Gtv=ݷ>[\UoÿMҟ=KHڽb<IJS0‹}yHưit<҅^*]R^#GsA!B qi-a#ae~a CqxG؋@Uj%ԑ)id+K*`0-)FmL/ĵa"YQD0Ff P ]Kl詞N5tc|^Op[zT[j'dG Rhq1/J-"VZq$r@TFGt{cY;U0wd|98Cy- x]%t[Dp<U矿r{LA3]l TDeqm-Eh> gc0M o}xgHqgSj*]>ٸ:5+FA1M5yS"Ku${2+a&().9osͪGdkj"@Bx[Ed>=V3jko:&B!BAW,)m2)4mA{B#|jZq:Ř Q(+{uOܰrJ1bP2,FPv[Du۠2 #\#%;!b %*3a/Ê:7ȭ¦VdF Q ex>hg-31m$,Q#4T<֘0$'tp![ǦP=GN521YzeQT1æ`?vL[Qcov?؇{̲xk6M-*^,Ոbj|yQY2V/_ CYYP?:+E\xh ](8!>YeD8H!4#!dB!B(HLHp "VU10z@Xś:jP=*VȰ @U6*2#{D&D7-nPbL+/Ǝ#xPy rf ,ϊqΜ:|H +c^&הqAԗՁ| k=U%ز:hG6x|xVSfR""irB!B(H\fa,aIqu  rDZH(Hv9%ra" WX9TM}0 cMPFl۾ןkVF4'<#FQBGz/Qy%0ZZ =YW!,K0^Na(iJ\{^5^-nc`F/`D# ]UOIz~HWgW֘iu6̨Wl?v#vS1ٓ |y oÞ3}0胶a ?y>jR`K9/h(/5) Z沣-C.ؘS&OR[(^P4j.-˰}XsQl 8aڥҖ"[TS 6v}#b^qg4 3e;'fSq)-E+l,!Bp G@H֟USPQ;HMhZ,kK0O̠;DW?~,'{Ods^pˢc,nn6EF WriXXU 0Y98@><,U 8уo{hQJ8xk*1?Go!$vݤRu,L.Çᦅ().Jێ&WDMU.qB3algX2gj<|åKZ Ixhn ϞIxX#;2/?8/}b,*mY=f±sy',.B!B N[Hi6P-:HO0y$wb R_/S94[ NN+we%sEӈ ZfJn<..DdxHRa„ـ> TY!j:>:rϽv?ނ33o[I,svϽ LV9 {:Xh?Պ{V/:Q~fs;ݾ>]b2sUaIX\_3k`# z?{ބUe JJ Ntkxw |/:~FD z\LHnw(?םX,aqz^Ӊ,)=ѳ]A=%d1Zڂϯ;W΃E0;/Ί{NwCCӴ(1e18Wf:a&?uK8bމȘ! '. I (ET[hYwzϩުu^ߗϡN9ܺ<z˶Z(Y98&W]lM1DOkI;3t~xXc̝4S&yHd>ދƶ#8$om](`"|V5VmFԛ'T^f3A^sȡZ'HEVaW !B!ĩHcE9U0>d2Ae?6zز[eIӌ:G!@|y+S~Ch1).1=Si^&mŴ]=&B0X <||]􃇎BikHaBQ¢Rs4{4 %7j<_&[ڊ/2xԈP>MDP=Q1T\2 xEغk?|8k^zT=y6׵ z?>cVm,=jBZU}{G \loEȓl89=d{g\ q\ z-ݓqr{m?"p+ =$!B9-(b~i$bFCm^A̭VOj^ PSXw_XeBfN Cc]#mǾĶqVh7<#B3:$l Hy^d!coX{#E iprQG_JoaXgk@;tه0} c!BjϛLΨ WhBxaףMtzz4CfY䔄B!ݜQ6sFja ;)$|X;ixBzDXK,T(0ħEaH%6+޼xB(alxsnX3|rHGм(n3QKHνPݒ2%!B!۳)Ԯwk!c>& 1B=oz :@BDu&45qHOқ1ׇ Eʘ&bHz%P6r(B0s7J6 !B!dH{H)@b؆[6m(2Dф[G۟ g6ck=%Аlq ғ4eA06XfrˤaX}la?<_󎨮=wL˂B!BH$҉k$4ᵫA=V +5Q0Wj|,W# pB< ?jaxFmY?w2Gr>7.zv /I]OB!B &F8%Aҕ!hi.]>0$żb#Ըwu$#MPLmc XD˺AÚT;!U9#t捰B!Bș-HCQ&&f`C pY"vhiīǒXF`Hkt:koxfeA15`Mli&4zj+!B!3PAIQi`q`A!RS)Da%gK"KMpgj:ĉ#nWu M !B!3RH%?o6mQ#«OF10046ԧ(>$,Bp ʂ=AFsG1B!BHߥZfҚy{mA m>QzFkxtB$Dp=S,H/3^ k^&B!B!H1bB(' AB(DRbuO2d3BuxH8[8=l׋ézS)\&$ԭG)̊ܗ[8PО1!9ʆU8pmx۹7v*Tƒ5ג3"eFMPcho^*ci͟)1ϘMsr>u9ӇrCK˰\\ϚЩb_yex:2Iw|׾0)ֶ-fۿ' //ޔѓXum/f~SKܯKb}k뵴}nx-轒:Ue5\mҏ:}Rn{63(y/n6>]OƟ@K,]_R3[,`G15!. OƲTcΑ}!BH_G=$B0!:c7'ūS=6Ѐ]F58(Q!QR+J(ګ_sNKLi)3HL}5!L(^nzҏ3-#nejpYV'H$C)<ĵ(ƹc]Fb,y"ʲZ۶㮽?z}-/ȓ1I۞rYVrԯzO{T Ķ[xivn44b-߁Owc[0h"=e?iOw?G5.uo.o_h9ws|_e[WLl)T']{#>U]qg_&}r*Sv-7^ڤa+M,# mяi}L%>u\ۦ3lc3*vk `2͸w>{Ǘ%3Nxm2m+0wVM5ikc?|[bݲ0ĩ$ڄl-ZQ4$"8xjG 8,6c4,J9͑1bD1u%y1C4<O EtpKX+TGn k}<6 E2kȈ+BU$;]DM#m{GxƲn;Bwz% -/llߤygDOkkc+_ݓm@U8D6dN&jDǶiLMն<.`㊵=ƒ~5Vb}i&&ƙ+1jGb߰AT']3::zlǼ] o?=y~/J{?v| FCayU:6g38=^iя&ݸVخ?m_R;@z;͖;ںwM&ګ-zs XXXXXXH$У!Rkȩi|1>c](Y/x3~EJ:O>`x!ϰxE(p`!a*#m h2 xLz$Xz&kn㟸ُa7cpDgQ)7_mw>Øُ6_.M 6owO7LwmЙv2#cmvjkNwgsSb+ >< Q#I76'Ef,vZ;'NJ{?vsc-Z?lkF0Gi^Kk:ymSމ{6}QZ?.{VwkQ|<^v?؎/w/]"y[S\7>[>i:Cw !rӣD0# Ek0˘E X Q-+eu@p&OpxX!a魠&lYRqB8: B".ŮI#<(^¨eC'_z/tCH]/ 56bق1~x3v{_sߕ{*:LדBw_+C4ꊵv ¨?ZbTon_Йsb=wv(bdޥ#Wt3WRJhk|a;νXzdֆ ( !Blz4dC (ZV(ZE ">|5D#hY 0ė,a{ 6:<%\dD:#>և,a@,nɥ2"Qf/^5n.-7a连~'{mIk!Ocz6D;СcvǝyjIqTmt{f:B ɽa'@i1*QMҀ;xyt\ۦ3lLQ(կF-/؊'21}q>ϥKGж){b$ݶ&E !BHoAa1*b)PDbgH&FD-bdp'М= jQ!5Ͳ"DܓRhXCdY寴 u _3R,[mk^fY_կĖ[m/rKTo.¼%βgދox3m/SmWaML@?]@r_TJ?Ow^o eSSd76iuIv1Ac:wy&Ϩ]YO摘e5uZnyu\9=3-g1fحyޭ>5u`ׄykı6F3߱+u;UĨ綰]~cϏ11u)l0D >MP4q  ċ?BnDA'I{~ ԜW,xF;“:"f[QdjbNY{TKH6 T=lCKbh|RpX|ˋݤ0nMh4_#&[~' ]А䗲WGc؟VNYV7w⮥ӺWEyQ%MXvG[Ƿa-JܟK\<7q=U)q};s^-Q>= IX_fx*TY^k-+{%{?veqJ⿦b5&bNgum:sfUyDՓ@<Ȑ M.=2D[ ^'&#Cג>Q=r[B!⑿{"?q8m{&ey15#ku5-W!t!">j9#YC>cڐϥ#n„[(_ہO0e 0c*Tfv7l}mAe9ಟH(a **Ev\%w\J?A(薼\7]7~bKq0BH\NgB!=DMCbk qKftzH#jP?-vjSo,'f]SI1%Tr03aDHl$UHGiC c\K)xHxN]<%x|hTo#x cO_N3jt,ZO5X B 1]X U jJ(P1!*<v1uzM8ߩM irGXE]`p#h@|\ 50< 86:Zߣtr?bmŨ>/ !ҟѐ{ 5rCxcC}ԇ| 06<Y.zO8< uF%dC5Q(ڼu U;U3DCq4 GE$ ! $\Czh1'NB!B/!Q-P%t{Fxb^.!jZ0 Spkz\mO5p 'i j&ƅpJ!B!=zE1%&0q0t3Z·k˲,"LGY3sKnćѴ$ : *HwtœV"q N B!B!$MPU-x ^7cvoP.|@yO܌yk]C8h –RutjXg2IG&b֑6q"CNkAQB!B #]f+ 'Dr{T>-ÜMteN?! 7aB 6zKȆskB!B #1U:[$(s3] P!=%I-FD H˜7h{yH^U(56ƽ##b0BEB!B V[I;$yb>5dÜw]9XbB|PP!2E0I8 Ąjr2T#jxGX<$`lX䐟B!B(HQ㢄]Эфc(@!@~6 La moS6LH$#wĖCPDB11mt $ϺI!B!i!A_ujLnP,mhrI`/(2YFXe] H&L9ħvYkh{GyyGp B!B!$(D KJK؆CZi1FZhޗFNBDw&L$&Ls^PZxv1BᒕB!B $Դy2QZ/&>"fg9D=d@([2˄Q3f&DI֥*y&ęhjh '%D!B!3XjzAjYIxFM8,F"[S-#*:Yػ%:B6+TtV1BmnFD 1BqZaB!B!$()ռ<7kL!V409u p rz8w.PU"j!c$* *`< j(-PN>ˌ шa}XB!B!U0TzSy4".J4`8r Z8 8 v%P!U*:$񦰮O"sF47CvKk5Tơ2w!B! Ie$FtbDb!bg"%l v8r3eLHPzYGPJcF 4ĈP>Â$tB!B aH ZY(]9 8$j FJl$r^3a֑3p8PU{}X~8hC#fC0ň$61B0B!B(H"j/vQ"Yd ziG ,?6La5|  Df!4 EmlUH&FX҂2o!B! QbF5e\e$[sN(DO\iQO뀶wD,'5eP #]$Ir.BaDmm'L#I<#7B!BPSM2ݓ«rxc#qsU[֊Ɔ<>l{;KKsTYf (-m4D$G52'C5!B!PH{Jeĭae[;>CPь@;6?ѦbzzrD#l@I,IdB)(mmB ?b v,OpaB!B!$2'*JI]F=D E0^/"l+ط7 O{r<g@~V.pO,\:gl$[BQ Gy"ZFkHFuP)FB!B YABO2|!A=6Y#q і0Ec1#A/yyՂE8{]lp P65"Ўh{;pj4d ֜"D=)FB!B qL jH^(iEK=g'GѦ ͢nPZHS)DhЪ4k?+Yey͛y$ O, ݰjZQ {kE. J =˥! A(7{\]߈?;sdz|ΊW=EpB!bb!.!JHAQ ABI#Dx?a*'7!B!kK08^}pzR=og *yx: KE~19\#Jr5|+r=礩-PDsCŰB۲$a`|k9~Pq}zc[W䏟բ-o 1X?D C!)Fxt9#†W1f\@BDߪˑElP׫'B! /ε[jkzg tΰ`1?xD a y6F }\,> Dcnd/CuMsx}eUOBľ 0ģ[xe.o!V<]ߛVD Q~s u#JuL)jo|B!9o Y/q[iξ`D Y3NzHCsqD1mA6x:qd3nLO\ kӮJ[]kj_[.ӹĝל%/~Hy K1'(!PDVi٦s>WUXU0C E/yMXg=x}DcݏUNO[,4b>X0mTc9&q 1^@qlk956vnW!'uݱ^[+`N@B!}Q0z:+9F~vS0h 厼 pd@ߋТ܄u=;Kh$_Z;jqxȆ1'TU=~(GTMPƒsM"F)\gj&T猖ɫMKX; z}nYk0|r\,.Jrp'oe;$ ^f㉚0^>0O@)cn<nxE "zRrTLml悈tDaG״K_߈eX"FLÜF \2 #! < ŦqxFtۋc{^!{Ƚc!u |bv0xLoyCXZ\b ,XLy } {pgaD,,yX›?c@M?}[^)k5o 4,\Y'*=K:M~z2 uH4^%A! 7xc&;SO=-mmw43f.5 (;wttB(KC3}CJ)H_&Q5 :$KyGP1H'ES"$4?t"&(UX8#.*8f+'q>PUŲeX ;캹?е_hND&>vOmr_r#ЄM `O7w0QMkVaBҋ^A͜D1a=mM|S9 f?QC6ݍ)i(9igd&ZZ`A8=K:MWۛk&Hp+E-kj!BH:O$q5tK;f~dvB'LF|7vipɜrg!G9i"C* %tCzyhE?]E7ε^ЂU=s(D9"qY~:-Rn)քa{HPȜ혼pøsx}ј",~F4>g3ĢT:=2pnaUl0y:>8D^ hl⿝K/ѧ,Bo)a͛)v K> eΆc-Pڐ@yyQ;budxBmy^g7yl>+3/֕bT_'B!>H%ۗ F̙3m!rky^v6,2Y'[>Lluk;ەy,>=܌pT6伖9ԥY^1ZI+ň(x;{mO%=!V(`-< N! BD뤷D<^88CuD:ཫ ݐ=}{[Lkz2"c% ^HS{wOA](y5 HpMWlә󦇵d4e])FmYHB!3ĝwމ_&Fh %ys:d}0EA6@6#d~`8o@,4F 6}G[%r9|xF~f`zAR7o8L6ňaMtYk^ Iv'Wzwq%=ק{e5x#0\'r,*&lEZn-$~ ]a0iň J1jxT@! hjjJ%b; ri+9n2I5^3 DKa_J )4oǗD&q.#+m~7g V!L"D%t )һ 0rDE^۠Yl\X<~¨P~@e"2C{G0vj$tQ|s񰂌zQ+E K! mEc<7=A'3؄Ȩ*A!(*&EyFXw0ol0CT"((#hyd$2dc&,ƒ.Tdk[ڐAktz`pk~D0Lp扰FҀoBi7b&[ICnӒCb:{K#C,۲!1`&b%uEMk¸-}ڼ7ls$os WƽL~f<߂K+bw[CPSB.eMz܅'Vbs|AWۛtbMߜz.}Ե S?B!}X aR=8g /Т\L]ܥD}@B3䰢sBDPWѼ.\Ϸ3re]GD;=C"D0P;QCxRȐa=S#\$.C_oGd{Ė it=4iQ.V\`ʣoaQ]}3ͼrT 1X,ze%vz9읐4gڇMT$֧BĐ8CZvqiKtR,r /ځua'M5c BHA %ٸ!8{>c,j5Zs8_;%@+ _坞\tZ tD6Fғ]v_Tpdc.([_Đ%y m/DGe,楓Sej->cey15#kc7qAM"XP8s~oG%0u3!Ig:2x , A!e˙_}#/ץ2-Qw2f¨"T +ұ"XÉ`ʸnog]Nf@ϣ'=$K+?/M,o}G[_k/ϛxr9E ڴg=$"I5"E7sF>Nf?kQJ#fC3B[O8|phM 2Nbş;憐&ܡNYOa.ņ4X'S%εLٙnk]،ie10Wqoفm11Y=QɄDB ( B!鈇)7=p53NnH!dbY1 obw ) EHLd.I0Z\O i6zMm==$(>B!BHA )0(d몷@w r5 ع?[i,TG^$(<B!B$Q+}Cx>u!B!BX<B!Bmx șLD!B!o@A ƄB!r B!B!:$!B!P B!BHCAB!B! B!B!:$!B!P B!BHCAB!B! B!B!:$!B!P B!BHCAB!B! B!B!:$!B!P B!BHCAB!B! B!B!:$!B!P B!BHՓ;wy !B!~J=ozHB!B!ס A!B!^!B!Bz B!Bu(HB!B!ס A!B!^!B!Bz B!Bu(HB!B!ס A!B!^!B!Bz B!Bu(HB!B!ס A!B!^!B!Bz B!Bu(HB!B!ס A!B!^'B!r*QQ ALa@iY ^ އfػ.J_%_CA/UEii = !x<<BN=^Ec16Ohtx/t|M AQ >'ChU#F?HՋIH #!CΆ!S?E"*d8Xqza(A2C>w|:V|>SҞD"6KO(>Bz~Q7PQ/ꨗ+,(5 _J F\ԄC5!m}5*?ʧŸ'JaT&rE),ї ;~SoBiyC r3xP|k1)(,,BNN.~z_߾BWDH1'M_mRڊG~o!KV; A26 LrM004 o&lXh ,k׮6JR ~;?΋ҏ2d ya2S(c͚Ehm-& gnCYao5`6lz7#?+aƍ:]h/ѼREP$"V֔G~A!  .qtA'$ N(g{EEM0 8p F[7}t :4A0Ka֬Yq$'CQQM0ۓǏ/s!/o8!Ho(-"^2QopXjED-;{h7s&Ox"mżmQѸߏO6mPCP#>G*bYďùr ~!8ܣy(֊lDɘфDx AN.l6T  ׿/tFryS*:mCK1tP5cُxsuHL 1܁(*#WY>e_{6'ػ8[7Eak<ն|?8ݖu +et/E,k LJǎmǹ.ĺucذ2΀o,*ՈzEQomw\qgK_jn? q P}goNto?9J!$i䩗jݿvˋJW8v 6-\}5{>ʮ*Ew~#[Sċ a&LRҡVbƴس8foG,$:1u tz0efhM"Jo|,Vrذ1x街PX,aK^g Dg~sQPZʓ߇PފA#ZA8i^gy7ec#C0;Q1313pA/|P gi/MM )7D_jkj%yK\\9(T 8!|^ԬE- U^GV(t<,&n&~(~+%Dyrc9- /پ\mǹ/osιD&ElO;W7mfQ/Geeg™33 hu }Dh;r{h,1M[prO6jA PXM>Uks6"g$# q/`йKxG6 N&uU!ڋߟgc50rPng-[A!]H&2$~(/ 7so+(w8nz>7zڽ ,@={DĈ"QQs[-&]q&F ͙F^%ĉ;Qf /)Qp=(F$KKzTA2WLJ0F4ټ(P 诮kYgi&Crډ _}g6|=mv(.W~uqtj,?q".h$~/bѽBK=%dEr"d1+QdɒZuHF&v?k>tգ`A b)gE(BT`"m~|:!LF&p&9UB~ZċW+޺w5jK šBl. ñ~W#BLU‚Jq_]]-ȋl"S}D"8peeer*Gpڽ{7/F'דesaDu3F_nԛ$-^Deވzrxk{m S(|V .\_ I`>ޘ5y8V_@ !$șN^^Kd8VntI߸CLjdž~e1"+_g/ƕ`xy]5sg[o:mjQ__[qFm:dfر#,{_F0ħ~͛7KOw]WQR#Cav!$7BkiBIUT+vqIۧˬPC9c!;[H[((&o.#9S"˿ rs1y?lyqD=O!;r K5چ}}Ϳ~bO6ӗץ|2r(qy{u5+O'cX0q<0~l=xR-_&_K.3}-چ'<Oɗ/5^lƓӟĨQ[nYj{GwokFf#/ַ4!;ۃ'Q$Ǽyg%;ܹh1*4o+VT+/HP!#uƄj(ϯhNzJ !2^O2y\K'[wvϊ{_o˳F,ߺaot 6&1^Uş9ZYwD+c. k"p‡;{ܐḃcrO^)B9A mwYӴsWY  B:Đ!#).d"JTZ_Z"f2,kLZiBZ{%}‚/|~p]uq\{"l{njHvj6?f(fmFzD7_h>OșjS@z@{k`;po~?[̘[3򗼽o/#=߻7V*d8HlK05o[Ҍx*Tw{j0kUV=M߶EȰ$lr2/Ŏ_6+6J _yχ֧?6cx|(U&,lX77n>L9碔)xklU-_IZ'Uě%0$e߸i6V1/[bYߘ2V݋[[nLFmu6OѮ/+=&so[.[-׷ͭ} G(\^.~2H¸4Wjoz1#vM{!u4ex?$W3lhGݗjd%X+z#=sYCًx/z޽YŚʕ+?jQ‘ahPdeg™B F Tw|ۓLuWTѿ?ZijCܐ^4__61"Ĉ] %Aaw؜⎌")kz,LF[su9nL? :b_S"$I;?3=n݅i/)G ڐc7ܲ%]c~)A;u~֙xg,Uk4eflO? e FU X7%~ u#O!YJ.jp\nq3)쐨.s fPx[;6&h,Kvnw6$^/_n…4@?o}q\T2Kkʱ~dL,Rlv?wM+0kExE̱Q7Or]*=yFEr}@勚vO7Q7}}NMUWo49ďQ37&9tqۓ_~2 YJC/q$%nio9!T{ImhXIKR/$Nrr ]~7UEx]Oj/ &Z}/@U2y(t \z xIzF\1bMÎY?ctE7>0>^,6<cײ2{9&,ϥE/&3P ]y9zwU'g"u =*ګzl#?Kl~bWAjMx cZ<*5 du*k J/♙WKJ;cbTն=yMo<ZܦɪėJlv]xYdMr i/m߈m۪yqAm8TDT'[0F^:v[wI|ei ~&`&\nT$zX6vnƨI%xynԛ$-^Deވzӧz-g/{(]6ْuVdV͑ H~MМck,\/ |UoVP= m&4Պ L钎5Cb8 3 :ؿbk_6VJES KTd%;sϹu_{{|ϳHksT!& l`Dk.;<Ah/aG$XIߐ__/V$< 7U3t/,r/a>ĉdʙ3:,Z5"6B iIp ѩFH{6?{ZZh>25]?]F#v~|\ΤC!?BS[R2f\1[:?hdʛ%).p-.l.5PБ(-wȩ&~ ͷ|t斥Ǎ5` toI@\o/$؆ m;D2:˘X|PҒGKk{!d?Ӎ6k51bLwFfiѧK 8[#e k}*q89ƦNvNgt; յ8;9R5P^"7rwHmg%x檑}Si|UՌ FLc`tk|6 6To1~F /^4@X"0PH\Gyr|u9{t`0 y2?Ƕ0}PO?u72 K˫!3<0aɏ S%mB7GHI}c?ׯʇ%F^rQ 3G{vr@ջ}9"SU)}SNT^~mtQ= ԃy$֫.ī^>@j7k9'11VsI}8jBtQ:MN9C FyܹVsy#"rdstvGqUׯݛSpqXX9dM=*zqT%O2p@o/.SGLָ7NWOq1ص:7Q_n~+,|\Ls' nFXX F >Dfo/Ѻ.q 'j1=hb<(uOxmd9CUgmYx6GV%3>~U# 7:FH1s7AuK5"Ȍ\{x:"0]|:h'݇]?;s:dg'm ZE~K3kcd5 9r˃˛oTUX"?wMy߮ 2K).[ͱ#PX1ijmfiioinigcʶO9srikiv|T/I>,?.=;v^ڤM[W~=,{Tm8=8$otߎ(ZlPyomn o5KHKR||M.IadNs[W}K:01JvOkCU^x8Ny&/ >=(a5PAI7kէD3na#Z`3zYƴ>ߤߟ9ؙ ⿓_\ok}^/#۹ 1A4GUQ^vI:Uȷէu'EVOпQx^kX.ۿ#3ܚlTD;oBuuwviP:&"]m[7I]%g{$}GusB4a=TsxCha엡HWo-52`3{Z\䆯fC*2gfvXI_wIq r+w#tֽyW<;ΐkEׄ]ocPT@n Ȍ]뎵º ,}{,鵭d͓ݿYC#u >|]j,O߶'|_~W Azq!?qpn:~smUk!V:l-m:y1]{yM.9%YRnOSG:a؃=r`Z[#4vI"!|{W]igvi׏ezQ MRo~ZPdvHƭgu +(pOʸk/GR}F|0y#@?.km:`ዉ5nzC~80>ۿIN㶣K*T8?^-Fwaĸ3ƛ _}v7}Fw'"XMϹNHcY[ _{5[ں4yΙ7r>*MOKIsdРg`BuNxTb/_&˘:|2{Иnx1i1X2&q1r2cd+ox[>xNjY?L&|I*f&{Rov%9,Njs3aRfe-'ŧ|^.p04~E9TU|/}R_RCa9~H <'_m}.ю^ 7MW!hGߔNJҠȌ= Owy%\:X#d{*苷IRp?=?.TqꩢyEIbL~R=(ih$!1j׸|j8Gk~M6ޔ{&#/ZO! MdHb|ܓ+ԘstzӽcL7c 7bn;#||lXS6pc4c[Ҍ5hLW1%tYtEeϮ9N^{zU_D ɹçeȸVꎳr@Z- Ub$ɘqê#?3Lv><|Ho}iz:DXm$gΜȂX"S|^I|  $K.㇒1e_ȩ35Tiii#;ywjp HTaj\2x<|R7BNFmL|$$S=9 Hqdإ2:z^w?Ba GәKsCFOV͸K>ضF"5Gd*mgi|?HJ\ 0b5Q`yI09%IޙqrhBsA*Α8(ṈD:u2?R l*p}rkz4Hc5gʳ55W^e_,WMT6UF dcLw˜n1ύ՘n1Ut F 21rY)+3ɨZ-[8:x~0XtNNnNwt7X]cb9ynu,]vYxJ_*퍱E8( v7r9r饣d΀壻,s9_ϮFOռV&SSfKsMA؎XyߨЇ~yӿEt-íý/n=8&s,97ednAF݌q^WW8yc>1݃t7hL1h鮻ΘnHXCƴsmRz| *_{़zD%|lxm|#)Zre\y/$'2;b*dܸ2r2d00`$$&!U)/<"7,獭M/ȅ dq9z8q~Y^/g__/,F|^*_472/M;*S}<*Z  ]%;{HN[|<\(:l!睥3ᄏ`,Rs I4K3hcVcc!t.-YT SfGpz_lk=-c~Bx78Xj@C&tFpZzRpi'P@ߡ iF=ɒ=+n˰Vokm>+[](=.c\+&.%_)?9xpj;|7@Rn2~"k_#i#~0p-#(0 Eٗzp =9]A b'`[ HuXƸMcVqƯ|n Rj;\!Fm.*i_;/;/vȶGJ비_eߞ8-Irhx$Gcǎ(uWӨ1/u:)8#[ IK+ÆLYن}'IS imo](Krِ12'sϓ%IbxIyfWyoohA{{.ƚM.TC:| ;TG1 JtĘCڂ%LLg?Zu53_)*69e.M3_rӁ""n`\ 2my]3B#^rv ~'H|B@gfd$p3{m/=I]>].)cGL/OĶXc3 7t (#Jr@Q]6߿ѫw;]++J&q?{VPB :bT}WͶDL#BehokظXǓV{*E]W܂ m1]O)5z8y'#ʃordA±N&bd$Oː1 jjFHĉ)2t0\'뤦惐p}V-7)ï_^##^*Iq@#3?~HgQIƴUFMX?y'䓳t`lp J j/.U&8qZKDkNg$1rI0Q5wg5өáenfԻ z +p1bfitH3p1XTbF[@9?_c&Oɰo?$>M֦5#Ndf[.Ȉ=tRL1 blެ_kkřq>aCLߛH~*..^%}=T׿~ q&yuKkR_OΝ?+OyD5r;{@O~hB1_ĤdП$gN߶g.+FIʐ!`]… Bol?9"Z\ (4\&'ؖoVojOq0zIq~XI*>X65mL9c$t1;en1tCl5Um"{k^1ES2$sTjmqr:QN} ?K2#F$ƵE.| OihoA7.'t@5~E9k-|YWyo3_b% nq}.9_gU?=kF.|605 1C프t\,12dt\1ﬤ^Al؄i1rhg{a|ׁF14zY@Lg>:H"I9{(Iyd ,fKZ%ix$ Ё Ռ\?g/iK%R#H[<@qN?-=z/ {_9/jdI@QG@D u$@QG@D u$@QG@D u$@œǎ;HKW]uD5$@QG@D u$@QG@D]|w.|ǎ0>+VeSCD u$@QG@D u$@QG@D u$@QG@D u$@QG@D u$@QG@D u, Q+%9+}Ւ˗յXu:mbx3@/wjHTK1!_:z[ڀDNI4448^ _,:&^$ )J@ M륒 jF R]cT6&ϬfYl~x{5.|5gξ͋}7/]O^@5*6f|}S/|ymLyܶŚǞmpg#HD\zR)4ㆫnYAϒJ3UJq>]nkHJ7:߼T͙{Pi^b^rKi'H/ؖRoR{?(ZѱƼ:UHAxt)hp5iXgD54\Ɔ=p#rd#6ֽ٤sgy+\-sJ3`~PQiK4l~}3PR6M!kHg܂ 0;Zq/ό7(V%\oJ$Ong6ot|_>-xyp5mJq yV_8~P5/ AQG8o~j N.Մyt{͋m3lBI3kYnfs gDW^|$;D@BTpvUfJY̔n"M^`>>F:GH_54,Jԑ ,/?!/ϕwԨ铧ܛ֮^ݹ!Hg9K8I'U=k,8ku4S" "w3ӳ›xI=0?بV!kDD}Z@@&VU/\ ’[fP*hʧtʻɆliny&h-Ϡ:\37B[jq؛X惍萘L g7Ǚ̿~EczI2R Rtiְ]*RQp^US1޶Veo3_}a+x{xޕkbIZvԐdeCWHY|: H# : H# : H# : H# : HMel֬Y=zy]}f_)/{[N>3 no:t( GΜ9r}B u$@QOHjnnݻرc*Çt̔!CHl,DHP_m&"mmmѡo$''ˍ7(_~F=L֭[#2`^&Tȑ#RVV&;vo|2zh~hؼyKpWZ)))''Nw}Wנ裏ޓvw+\rE ')tSRZNVui]%fiG}_6lۥ֯COSzJWMs=FmQˎ$o?H[(eZyye)s='gt_vWƸͯ_dm}(ǪXk^y>p1"^}U5jUW]%#FaÆIjjz뭲`P]vG8)yr3ŧd1S^w c]n_|_/Jw>JG]mWs/w=[T'U{co\y2@aǤQ5Q$"JUG=yyuH~[ouQmΜ9z[..eKeT0$﹥ 6 ԨUpy=7q_AVn,9 2d>ע23wabVX̜,23ċ[Wu]pg*_e|YjBE¾ϥRPVvCm l}YWpmk%ΏmsmD -QӖHn.(mHA5PT qܹse钐5 B3Fϟ/Ǐ5$yyǤK1;;q^r<B6q5[+˽ SʙyFYyye̶l^T8*) FEmKB:WySHe;!W=uig.tTžE*(ud.y((uꞪ=qD`*SN_WaՒ ŋ/p4QWw3g7rxlcJHLԚ@ԭQ.Xd͟* V,U֕y͛.J=Pe|aXˮ0o6K+ eKՆW̚ݸmA]/l0/uHrڷ3fܤWȲnJ+dYvlxwݔR,22O}\L9|_M55PvdcРAMMMQ.$./bg˔';IΨ= :vܫw!#< 㮕k/RYKG+Y[GTJrJegDbR,%t,|ZPA篖l9krQk< F~6p WJÝ2) p'x^7"E@""S۷D(T)2EUT=7sP@T5VkͯjX.Qt5IPV*ihkF}':(gWf$6#nxUA7 đy8o cM瘿M#yl=tR#x"g87GJY-x捥3F[ BV4Y U-%%tJښfi/^iM>jjDÚ`QOy)&[}4po*bg{͌?p~{=;8.OUPjUU4rH][^ٳg;7B0P}M(֬YA>Ww_۠^j^5~!CZOw?IO\jڒpK7t~Io~~+&3jԴ5Jc5Je˖S鯨i.uLܠ/"5sg2Ls\qSo#5u(P q+&!ȮLZ^BJc7 MPx;T ߎbY RUpt"j$;#=qזU-pDVX>6ntKGfs'9hnb_oIAp;$L &UAgfFebT=*\ŦMt>Sef??{e]?JͻN,ANS{ArYMsG+ aVşg+<@a' j-cqji[!?X@ yۆI*q{ ّzj V҅a?K(TZE̙3{ [UW[ zoo2T:faZW'Mv H~` rjmp]jyj=`oQK_***r6mg43/﷣^je fOd W{eN/ʼfEx7+?aB@mf="f%FF o[*@{yf>gaZ_֜d{@!uAm{77_ 6%m;U&_ {ff왘nP]uTu}VO>O:8۪2c `ҤI=71$?nLҦ̖ 3rdԞ~zm~)U7Qg 3HQ]8>bjgk?4:˜mxGZ햝{ȕS;WgT z}؎ r+rdM+.n #T2'7:ݴ^* o06o4rdg"}.٧fgfRfr*8֬#9K{ryRQ3onmu}s5~-p{t3ݪRkf[S`UzA/GE>N@"TÇ}[?:ǩX ف:+mY^{|p =ءoojG1YZMj x!|R/GLt{TwW=kK8j8 n|N#y+Opx};v$R^vu%(`DDwn:)s fWT7 1o>S)9^ׄȳo֊Y{5]ts ln;GV_O!?C |T4=A!j&SmSu  uT5 :}0Du tC6|s=V=-SܕPwGt}/GB3Z/J }̔XUloHۙkǓuD!OSP~,Q5+xK$侀ߝ`"uS7Vۨ.MfHml\t>{&EefT-7HdbT?N*PT0X5P |iiij)nFv].#mWYPS02ʛ"N@"TUXVM'T{}QzBuVi!5jGDm*۷RkT#T//&᲎iDףڠ:zM] VG7Gp?PIn%B௞6+{)zѹ`*Mk$%kCl{d:4#ض>Ίl7Eԩ 96\C4Ѳ]wu:qIg杺ZF@"@<2{Uw޿eB樜xm+ҳhlVj0{꠱6B% Ձ>Fp-@4[5ₕ.!3Ԉ.3KaTq%޵7yw,3K$+d̷~nT[Y-%R,Y4o6ZκRd t="j;#?fFRoKyRVĞþ7K5ȷgaڭzuA.j?OOUg?Ϝ}G zTFPT9PTuܹ T'V@ RTZuWUcj5;zo=LPwMnayоrKH!e,k&}]~j l,nYGs:0M׮Pjם9./%ko DMMJEc-˶E}Ep]+Qm㦸bijQZ 3W?[&fne+G g7Ǚ̿~Ec"[l 3F ʳdT,+不k"Cg8R=%"}aS͚5+<;T5T3$۝={VnS P ռ#''G,; F4L>tȍl]M;ǏߙW !/:K_Kj>@XuH?0mj5_6޷=^bK]P.D~ XA~Ij(I).A Gsy#h$%#33=D[o;TUn:PVYٽS5ABK`kIvλwy)dCո=Q= @GE@/fA,E8aHSٻwIPߥ˔)SdڴiCO| U0p];31"O'E@Od -c/!a@Uиo5q^ޝDy(KDjcG=#@h# 5PØM }* T@sW4=/h: H# : H# : H# : HM;k֬.Ϳe8޶ov>}:G>M6@ɒxWKkeu~}Ų9ۛ6jijWL`K|zwq@_^݇#?}\ͅ"=.صorlЖAVJ33]jW"%նI>+3 WuHqVAp$3)Srd_k7ɩޟgN⤉i29T EP= "]w@"FS)mU!j7¥tG&dT̕n*bh/,df"UDݗ jEѻnG@e,wx͛e:=]RJe.*W}zvl?sՒϽn$ZiO:|]fN@O"\CWy'Bf?$zDBn#k*uC7صuh\M{?"dXkeStyT\S rݧo 2Putr{IQīc72Wl")[=.Ek_HR綥-BOxW Gz̋fMRkUtwaݪ? Nn8RT~k {UBSp^͝)q$ ٯ\rf 4*gMdͭuFy9%mrK['W]LIfUM6몞FfbάߩN=lfݕ.';T}L[wṔUA k!D%s萘 TX8o>|`'~h.э5k۝we8:MH&7p?D^cm1_zfv}ǫW-1TFozU@'}CDv%ǎ66lL4I222dȐ!ÁgSNIGGw駟`wiii{O^uӁv]j$''u]'_Wt! 1T0N>o}}aD* BbbbQl"9sF U`BՒP#G?/2o޼ zm@vudW>)u +%o2wl+\LV3pq_T@+nNS5Q?Oe]&999rWʻ+/[ 5\(ȑ##wuO>go/ԲVV'KV4P k=. -v[#HJUםj歭}cyR,[~x[u筕zy)8k#vNY4'Vt6|ܴ+篵Fsvz>0' kLHGDu7^ط׌l¡ >STT3 U;B#Ə/wqr-2f:̴ϔiʻUНal;P(bI3urǓUljoL*C9:.l5*d6TW%l M.λ}U)YY#ݳwj|0zD,XȮr>uT5Ǘsj率R[7u,VЭ}ͧڭ/l ip3mO]O%7_ Ͻ)^¹?x^ b@c egE4 '3eyUXk `FdJ#ɞsy<A6pqߋ`(vVjQ?Zy2ysu-[s)-TdᄅΠUS PM!Tĉ!6=;שgPMhx׿lݺUrssH={7B9qF9zߊO)9(}4g:x] K|gy{I?92^U*BWH5Ki&+f|&Vz.>F!cyUUfAVO=ju9m+}@t\4_+7̱ u(w6kL߶5H塛IaJiB5}\lg!wP)!;(:qd0BQ+ qIgsO,VҾ`P~;V.rQ+H"][(\])u*X[G&Hw_+hF ;C"obwH7( ATI՟<.᧑3g_8#y㷝* KӪE.ӧO{%H%FwvČPmQA {HLL۷cݙ.M_xDE$bΗ|N7/֣[>NmO*V5'aUl}}_ZV%Z~g5|tBWYO' *(ȘOK}"Dx IaYNԪ Oܪ[P8d$K!Q_O5>NQbl[9$ڇW|>{ytuo[pZⷃp ~~G:[=󖛚*<[] HkHD/BN"T^7Ѱ/KQۨ6TPCu>PdB4#rYW#\T~ϭe+,u_V$Z/2Rui~xGj[+试y^UWy7(+U}v-tT *3O!em^SKjCl+/ ޠSlR{Z^_qWIf2fO`(Hn\`qjh>,G̠ %~co;9a8ข*kY3ȳĶƺ|-y*#2d\wu^5T۶m5!gk5:m4^z(DB3WРaeࠅキSMmM/%zR njU߽~RXv[[/qjdRIBۂ~ϖeou3ߩ6̙)ܱpVZ 3Wua=[-|&lR9;1"BxVw4(+n~3MspwUٚt%"|zD$p]agKh6XZ^XG)U//ܯmeHjb;s]A)ۡu g̿MĞk۲q_D6S}СC… RWW;Too ;Tpy~!PVsU;bΝreGٳgۼ#G[oU5bzuX_+o3' 懋Ɛ=Ė-[daͣ[ڐ@jȏܐ秓5RuйDVp~[f͚Ҵ /]yGÇeݺuNH*Koe.H>#XuH?0mj5_6޷=^bPC5VHJq)A t5!eƇ+1s""@W͜9SpsI5Fg=Z3vS Cj:T4T͈n F\ DЯ&,HIՆ( DHJ2WUTm}{~ڽ{9rDwrSW>#T3x f tٳP1Fӗ$?C5@ӕ$F@DM65=~"1l# : H# : H# : Hcb$z76L/h lz#`(D<[˾-RP$G"M'yX)"(BtL< @f{]جuNUuWUTuuM'Nowչ|;| ( P8$p0H@` st׿F0X z+Z[l A  ( P8$p0H@` A  ( P8$p0H@` A Þ_~Y~ / ?я駟rck'O69qp ; 7|[ߒ _J.] X3*y,]w{r7W\ȡ3H~Woȳ>+/^9rDmp8~=zTJk+h eP{FwnnNN[84gH( ~V>SO= j2*|cEOOOO>|տMo Uts|_^zilo~}^J_4e}$!=9II"`^NV]!2,WnE׷"[N+~W|%2ßi"y$a'϶ AbPe8ڒ˫ρ{|wwSoP^%׿^{{~~ON>-o6L_C)™Tkq[wvvUfռzd=ѓ^oC(iFH{6!:;JZUA@ȫM=zy kcRfuhxxI/@mxG+_ԆexP `,#GꫯG( eP^j[?#3r֑mO&JCL sr aRc';=}}fdsXEu(`+WVۻӱ#9t]>NP[)z!}2w}#[oƅQPoܨT*RVnӃ'xB?c,Ė3ޗasڲt;+t1g>˲׵z؝9*\2 kZqԥ\ "Oy$'u;|'YnGaNUt0x{e=wGe6G&]9udH' @TeǨ[}?[A'I?ǡi`J>:16mƟ/6u}4 O6aԙ+g;mGކvP}_'zwh;2J(O eɕEY4eMfJ]q)_YJcPYuq ֲf98rMVwu<'z'etm.hIl7 USKî'q$#"\PVʕ=嘲ޓn/%+=p㘢WB7ݮ*4rHٚܭo5@¬z0s^,x >J\{#-mjVqΓ i҅ nraoּF5nYED̬nx?XXZgS۲٩B Yvd^Wg(+Q!r;!3w/RFSƝ\CIWz|&v@lyeoI:g>f1y&oUf!t-Cj貮vM#*A|S oy Ibv1o 9I-O<3.-LCl? 3gu2?#KgGD3}9cm#Ue΋>z\c,㓔AQJo e!m >;>3u{}R.j8wwo|>g?˹9W껁#sȞBjh>H&GF5}n(2'qEhͱTjٿ9Rw+fkBY yWcDu-.Rm_-[(Y8ƇJMj*+z`ѕ=mXřxK^l; _5w+9y=3,]^Yf:g>4tY)Zu9{fN9ڛqXS*9i\}ُq6pYŬ6.}3M*2[N)g GD3m3B_9<ȢWi~:ǁbt=Yֱd궧|e8#R2y\0HQX& e Pc(gDr-z "_җ_γeE5;U5jkB[=WGŻ8q"Lyͳlwy;&m6 e2r$jk*g䌞[m;g^﫷+t=$`_gQ`4lN!Wׇl*\>{`9El 6~*)j#&,nLeGA\x5eˢ … >ׇX&'EB??#֫f!ˈՒT}i]FU6kDY MVduVvlGo kkAYM{5Tq]̢ $cW7֓,啷Κƙ0l5eXArx<&z$>OG`g ;20,bVͩ-̵D?ξ)rڈq8qri-}8NJIEI(Q|Pca <#~ӟ7h:uJnӠs=rW#u;ZPߡ4_V}q/lжĹvW\̌&[H.TQZ mU4QTVͪw[֕~Y;σݟ:]m` |߅h[n) ^KzO"{L^zbJRyCgcLǸ Aݶ"cIL5N99Gm #eC ^_Sv!v0mFݬma֓vgLʺ9.q̤{#F!qmۼoH%L2.2_90J_84C0H P[#7ꪫ~ȯɓ''|R{i+m.wNJ[?/|"i 2u=-:Ln7̭p)dԪ5]:ا*#{;j^ʪhg;n:אBuruȑ7fC} VgVy\ա~EopNOB5:_ ̧ .+oM3N3v/ܨNf&HQamnp3mKwRO>ʲSαi>S}y,aۺTG?>K?&ߙڞ#Is 0fJ%9 =*ܿ Qc_<էޑkbz)g>%9vXpootU8)=/%ME^6;AZ]H+QY {%$/۱ds'xѹ^u.kΥ>_r>_ \=_q&A \{Ejd1F]w%_tpxؗT &|Wm*/#ZkhTmO~^}Յd6^x&8$c[Qs-V&\UVoCp梏&_0L2H^CA^5To +sxrlcZ0m~'_pH* Hq5F6pN=MUoP(_qoPGG}8}(ouu, 1(2L(τ}{#nEyJ.?KZ{cQF=9~/lېHi~]'5 b, :P; ~Ht0remf=$2<ws>~fFKn{ԛ5ojěfy[ߪfLABmP5zP˯g=*ΗPW:{BI*麲T$OJ[*/+l7o||ڽԥ}v]aT)2P=irw6>ޟo881SbFl=k<ѫH g SzVo7 kz֠׍τ瞸4d"B3) ǖQd~"W"3%?|_yW u62nNv|R^%Bos2)[xVM5$M)̖Wi4|Oy#ǽT ٘YeW2;> n4{ sb++chu(>Qҹ Kln;ҩ-٫E/m^aBj јr#/MQ9D_Fck׹ȼ}:mjZ}쪥MvGeYg&04'뮓ߗSNG?|s*`Tԡ?䳟>5F(Cߎ8{WOvwOc5k(XYݱV^O ^]VSkw6euYR_'Iyi˧/ۇISbs3\h(PeVʎQK)JeyѳrjpG>)ސs?, /r0a?Ou8o/q⦛nүUFL[5ʳRZ-b5uV!4-o^#Qn4cUq.DT1ʻ S9cy*21ա<ҹ$5ޖ͎}W;g[URֿ^H(Q5m@ȣnLj;J^|uTvK{{S1>(Vsk]'ҏfByJ,..}'\s6B7olnnjP..^ -26FΟ?,_Ez!/~177'odĜUy_voTuƙtaNt vN{}A̫{btۍv)ᑬv͔0*gR(Cq_k:g;2JH,zTUV[`VyFn0KYfUK_A;GY]0kb\L^ҴjP.պGx~֨~+o F\uURTׯ+_=җ$w' _<#z+Ƴ>+ַ_|3}Q2vǿ;$SC6,C.Bs䈼u^{nFPCWomvĉ%eQTWT6+ݝթ,ҎNn^{BZ/:׫~~͹KK+ߣQ`ǏgJ {1y_rmPuzcq =CyX(C~"g֖6 KMujQd})\ӎ@=*oy['3;2&¡Xk-Mgܲ3-G/  ( P8$p0H@` A  ( P8$p0H@` sg_g /ȏ~#y?\pA~1kɓ򶷽MN8!7pá4Hz=o~#ַ?6HWK.߼(2V<3J7u]'{xrW)9r /|ߕo|ŋGkF?.GR$+cB&B;Sn 'ABy??|+ڐ ^333׿^oPߩ ꫯjo As= /wNG|ImmPah rP u;Ny߭](PX+#_ jc=&nWoP9/O~=3oP<6H( >"*#GꫯF~<*Զ]w/~1WJRZi_מҊ\t=yy)*A^qY Kվð/Kb.Ťxt˼n^T<[+m\d=?:mfRSm4֡/pXym' AyF|_zHoPO>˭ު wT*Vrm1x 'Ƙ{i9]it{V0e1y(.mY&fTwR.>oV 4MyCm|ᱤW"r=Aq(wCSBAϜAQjE*-Ւm)z9 Ju±[5A!]\pZala 7L}CmzE&?,odL/(/LY cnMMՊy~x#_V۽;Au]a87C+n>4ek>_(K:ӤamkYdo(hX mTFkAo60} 9b_zigT}' .x^ߓotW4iJk3qO k~ l6'\/7v+U{lWq1Ǖi\"~Q$i'ixB0U}j*0kg=-mkG[({)D(#w}f^:\. lSO=%峟|o0A7Q]~6<άHېԤV7l7ܗmk[;*3NV+j=k[2mDu݆txIމ7 TweϝzYN˹Ad{ޟ$#I2tĤ4 n-,-  z"%(ul܁d9x?|-I=[[OkJ5V=NLIR=H G*Sũ+:ݬ9g?תxo\tO}S?S… ?s=˿_u??{/^4~t{饗rɛ՞|m*R뵢դҳ&!~kTW $& yQ! +\=cueI: ӓ`v*YWXضL$D.} w2S4u9?TWgtV"0@ne!8 7z0CCzvb=cxµ.4gӰՠ<#vBC /ȣ>*Poy[oW~p@P.ז0r)]I >wy+xʳEY[QŒŕrHSNQJ|:Ӑu"䐀 Ctٍ^n;s?t+T\Dwzfqٹ"ˋ3U4q-+דz0b}yF<<[P\K{LR4)L1jRwdzYXlʶʲ,}Ҥ51ы0RdžjL\f2C &6ۣ4u4eH~>/l|iN['4.WݮoN)c jOSSN7l2B(BexgQD+:Pm$ Ygs[]wޥϥIrFVwl7ꨯJj94iInrviv :26|l}iHMg`ڂX7ڝHJs*yc-pöȼ=劽ECMz*RvH~W*ˋ2Ztmn^e_.CGٌ89$m}i%)h;0H_~Y{#(Jwz8 oرc:4!o}[!iP wu?~gP^qM7ݤj+c=v@Rqz$l-x߾48eb`{xBb~6xS{Eb~n Uv*4i[HJg4&UB<,bNuj9ioPwu :`{I3xD$E=0 'Q]uoInzke3(E{\l;ueEf4eо&M#ۭ4qLS&4/≕M&.o8t$v?Y_g-4)4Q:3% o;0H?PoPƀ4 >Y\\nA{E=?s" ׸k gj^kfNNL:^78P[I2H ePo8h⥗^ҟ=62U뮻NUox<= _Rv%T$N~w-ǏG :č7(z׻ G}T~u^iQo7 o~o}kpF-+NW˼g^sz\3QW׊i+&|DѨ꼆[oUj]{+GLOj׾5WyE}Fͯ sAvӘh啠I(O@qpkw}饗c=wkbYު>9<Ѿ tդېd2 +8քemXP?я??b\{*Çڪ<37oo7lA{0Yl^ ؗyw{= (ם`.e_|4$'m<+P<[\*tM癦Td772 ɧ<[q:\@mrJ/ ^?Hزa.\y_/;Г'|RDS+L y(;;;+- ,{mO[N;{]{x~W̖}6e;R/?@M~擻gdq|k_7WefՄ+z=қYJsxMawmsU[IR _`*0DE).Ab,\wur)mP e8uh~g?Ϫpr皗ez5 s'Y^?\ki#LUs! =6@!]뙝=\ӓ4=Ts`j|?onŶG8y5 ie?gN{;2,Ֆ (EBֵ˥גe{^{] d3w֟K sPbp [x"9J|Y?(DG6Z'/#oIװpVj"+-Y>{s9-쇖30F-,E"a-Hfߪ%?`ȌX\\OZڠ<&Զ/jcwK 7k/zH~_s*co+>Ğcvdk*g䌞Ym=;5ɴ۹6rx~mCmIY߲vY)d9(2p@!%*wH+(pd䪫J"~-W^)/ɗ%;?-_G[1}Yַ%_3裏ߔ~C[ƚw{wmM,ϝSĦj_ gkc:q]9^|[R6eS[ ů=IgF ZЖu+_y'!qJHأٓ w:Rk9[bBieD(Oя~T_jk2T /? e\8r䈞;vLZ曵CyWOJy#R18qxŝey6$]cd]F .LU;kQkx^V?Q_'j9O̐-#0o9RRΙ%P^W8:p>s|>}$ PmYqt r'xѹ^u.kΥ>_r>_ \=_qAP4$p"lz `JC  ( P8$p0H@` A  ( P8$p0H@` A  ( P8$p0H@` A  ( P8$p0HL핒VھT/H{=CNpXJC}CW'$_y k~} ۾ϗ䠊DNʲ8ʳH= pp#9]it{m„&sa#W4.S=79M+442gw{7a˴S_`tɩtH+AbR'K-\&LMJ[<OiOS"n]92*jF+/LLY|!װ0SBF#:Iϋyԓ`:1>`(ct<םlL"z*^ t2mt5M*\R|}[^_mp;-#S6fմeGiK iZw&+SkXE\R>U|OzYfks/ijے_%1diN60'cFߙˎ-V6pc+8vl Q~d֑})ڒmQڐ'fNY.ys~ƉsfQ+6Sx+72ϲݑz S&tr:Vc˳VNoHˊ4,x]qU]JCέpuլ+ ްxӳ0"ˋ3 1G sa&i-R[oyr:nXƁqiBoffDL\6&DWӖelܖf u~!1=4]MڲմhՊ)q%ʲ,Ό>e),39AkI[/L=;:y<pAbMD-kҤr[6Jzm'Z.!o˜AթEy$`dęZ ~Nun.we_jߒ%f1b5ֻUzz2qYɪUke5…(r 6s:9_5~Ykxe+z|}LBp! J졍 ;.Qi5xp8j-l8'q:O /&7d!:q$&su2uLh+̮ M̏az{dQ%³]탷Nx[i}|e6'򊭿{M"t<,r1PAթEyIIu ".7m2x 徑<էށ@JwIrE0#eIfG0Pa>RBy ywk}\:5R/9/篸"ig_ךRYpP׶R[8H8ز1ŨV.@{wD9G}NlPƹe ( P8$p0H@` A  ( JIG'u/TA.Yr,JY r3QW׊Q*_ Yׅ'+E-?UuPv?r1*;|/ۛiJ9eTVoC( /xHLjCԥV<>˷s$;~0ṛW!}qTFiƀw7݁t;+ٖőY#vL`>XG-澨 dh^X']au~l~9mHgtT}4̧ܷ]ȪumDI:[6dZG!ca'VMҐnПsR+jQB?l֜IqzZ{֑n{OrZޓ6M&4ewwˆr7*͌K)JXRl ?<kJϾ++߄0ΰ`}!*3ƈprbI˾lo1Tu6FT֩Qt0.g{̧POZ4ѿu8u}dh/)$mtܽŚvkH?)xgpFly4^gOn t|gk֬_kN&7Mk\4ak4jtKΫ8}1eGC{qm]| 'ξY_?NGcqϚ Rź继FD^%UNos;q姮ԜIN^?*n`0}WY\v,/Τm?!z2 #FgfVwI 4 &Y]j9} j3e^ScM8a,r%.&ߚOd7!VuVIƂY*eOcLq'e nYAge"gon:h觉 5N0FoAƻ8&j}]W di~b"܄16{e%K""=yfm-[4ݮ1]u8梃AFCԅxBIRD3&`=cn`"͑G̭}Wo׆2N֔dz3)׏qwemQ~<3o L} S2 NX\h1zSƑ<|w5'9EQxt_s(N4묙_omAW kmuc)ꓞז|+۬ǬzH=زap5oM$'c64n9MXդRGL(f$ uRz=m /,,Dv@ۛKj9y}u[M{wmKfS5EjvU Ww@j-yQnr-+?t֏ۨXd$G te;n9 xT1!| ']O5)C-d@BŠ=ӬViS0,e^!G)UIliszYƑWA=9'k13ԓt3Hʯ/u4]oZ*4hF{Cڲ5ѹ:j^r?;̫jCitz6}vl1^0ѥN,q sg2VM%y)$m’:ݟ.K L9in(.Ք.|ƹ3 g8;{K%pa59 [xճV+ݒYoꜧ_8[mRY^Q)w\gՆӸ7Sim.]m\oG&bJ(TX12[`Lଳ-{Ҥ;e9+݆V'i_wrpm,~e!edT@Y:7A_TɢINW o7S[/ C~W'(uD3Oje&g248q_Ek&xʳ̓x$`Ђn^{X#t)kGMs&AA )>sMm˺vo0Kzgrh}}xpFIsi8fw3z} /mLYOƥ8]WI`[;y7V#{&M2Q{.A٦:gXפ\)Z_Oq1գY&mq1. ^)k\MXu+SIGhArHn^k.=[0ڗu3}eX{9g2 $Xǐ(Y|Oxv|x:Tu|ՁfoAq^֤]iPH^@Ꞿn\D }Pu.(iqʧ__:Q+zOEwEW+0,JM=0 V szy dp7̭טxtqf7up_`F=;Ρd=_W3SF6jA6|mM+)%'/]vQ).=z4>+0&  uh|ߡcg1VM%ðd4rJmT)~*ܿ Qc_<էށ@J "!O@%vO3udmI0Vl&c `n^{BZ/:׫~~͹KK+ߣwٗ5uw u~WjK98)~MrV"# i8{+"+(0#98Pdnp`?lPƹeC-p0H@` A  ( P8$p0HL8RZi^)I"VaͯOd}$+2=([%L,A<1eOp1LZK%ϕNy-quگV6S4@iu3Ogtg5.ۑlʻܲKxݕI =rkhd $ 76zmةB0rHtNi#!چiŨiJKz >'sD.I,+[%f5`]Mz:c8(K>6u!u)X))j <5]kufuGkL )2OL't BѐZ.adĴgrwښΩ]`P! .kgRkIL" "ܔѬY2`p[<אJsMmT|s\-D.w$KZ)zF16EIl9wv Wpu~`=-yrN{<ѪYJk0 #Z? t;2LIk&zbSۓ>G}vMSnN'\nXĩN9LA<r)7&3ge@܍N{&L)' v%lSsٌ`Umt<#\OyٕIIGI6.icUReS:+д+k1 ov.V.}_B\1quorҷeէm}0Kk5Q>>yR$.{cҺI5'Twu]e}?we9-Wd=Yv ܿTnfTYX8yq}TZ\5'v2 Y=-rq# o#}(ljl#lLR*79IV)U/Lt+t;&Lf[Z?}FJ5IvGE$"?q]ےn:Wq9*OiOh#s]̖= 4Dg|lad3,kp?w*7A{,1"t*R}YيۮqD&mp[uk2ɐXc24u9۹Z#} q21(@cOA&aԵQ1@a(Ew(92RcuܺZ:a]7XMuuj]ON˺k]|իIg ֤6z_qo6zZa?Vhj=uQg'S~bK/ẽ_&ϘYr Is|9'=A+m5g녉 0Po)Dꛁ\ 87,}cϳA9Ӟ -q-a2w%è+6mW/o@6̟֐3է8KAeoF/M0 xGy.};XkԾ/my7Uc䞆U9אp~眾$mGԵ*'W9%R& mYXɌ#I圦hߍI[l6%NCkcoDySث)=5vU{캜g{sHjwzZ Ə+b+fiԙ"aWyTcO;39g|v;%'yy眙92W?/ɭ&_8o ߪVFCTݓ ~^m;=fݔ[ sué.권U)snAuRJn|~gu ߋ` `8M:W:!ivb] ~3_UF}S%doNԣqd-^}=,}ߕp<e֩_\omL*;M2]ce~}t->>lN}L?reSz1`o7]A߂y3.Lo"5N_Z4l7w5Ҽn{Z=לXGǢl|ŵga? ?k= nZ $^OId[Uk͐g4w]{cTւѼ%7ina{MBgɌ\;<5էt{}|Od]{STkI.$nʭsr<褌;8/ʖQIs6 >k[e^R7S!MsbynL{ȆD5?ӓ dZ7(lS⻫?|lfg|ljY#6*gzf(JW";H1\W^чbOuMze2QiK23ͭzYAV/c*~暯]]{=wVg^KA$Mܒ9NtYi~]Y8ԖcKSOXϐdս;s{bb._ݖ[};ΰ8?i%iN6dEW LW2X@ F&4&.WZsԑxޛT~P[>-'kKrvadn~;xi9@jbӴȂ'(a)w;.xwWT}v;'r h &] *r"6Mw?=p&r7X\t٠X%l9M\-7ITE0wW2bmѪlZYet-߫[IR:~H ~vB8 `$N@8 `$N@8dHL>Eё_;ex4[73p.N:+aw%*ݱ|m8FWVS]"vMaʫcF,YG@!rs|rR8H, Iuw'튰./]6q`['eP[Z5O]2ۚMLk] N7Kg3EH_ؘߢu^Zɂ#})9o-'lӺLz? /+S-r/ g[@%n=h]n*7o9VfשTcסA2PCMs*Peu`ԩ4NZJ][g@߳i6>om0J{=E^yq'iMC.2;4)V2SLqNYY $vNñqہp^<>pJ.kFjK.K˹#rIu\U]VTOTrSuLu|?U=:UeZ+5]֗2vU+TwlJvzܶ4ֽ EeSt6l^6M`<1Zq봶ʯǦٮs> oyO6i>2 (w^qi|(9]. q'S2-_[{s?g|Duy|l% 譌{]m[3MO/T %Ean}<(Ș>ߙ 4:&k/ܸ=pT2^7$Ss9eQ>|O<ԡǸ v?ds'^{h?eH`8|zDjfG2ߜ}wmص&5Ow2;0+D7y*[^NkJG{+!xnwg}11269ݤ+{ߓ5)9*y'Ì 1Ep۰=vMƑjgtvdƁ&vM4%_jmol[cv)xO1{־tT+kOWbzju{Ƙ؛t?<2zM> *Vކӱkx=fzסca@Cn$<2{]ϴQ.K,KjK}FW'vRpjHpMkw?-֖%?S?ӰT2Qe8 `$N@8 `$N@8 `$N@8 `$N@8 `$N@8 `$N@8 `zJ Yko[k@ꫯvuo[e8 `$N@8 `$N@8 `$N@8 `$N@1EboƉ'ދ^{-}?-[^xqy_\r`Q`ywȑ#/h\vetҸoVDO[oxw+o1."# ?xkn-/sx8=Xի,*Ɛ`QxWsT*XfMXB3sΉ*/\OeXh!{gرciolO OHo'?Vl t'Ji0\0 /7ps5פ3rSa& I6oeD\>YL馛Ya|MP`LOOW_јN<6iB]'>8|`8ߎ_|1/_^w_:B`3.Kd0l 7P9rH\{b922V|4C׾׿_tBfqP;P -$*Ie˖uX f$%/~IWd掾xd* zdGʬx<rMlyly 7}}!z$w`K-MSr袋:HB4kG>sNO Lk׮{b=T)bϱcql'9Г ʩ z7Gv}OĦ-q'ռپvLvAkbmt4.4D Ɖ'K/6.Y7I`"i%wذaCڝ#x475TtoÑ;Yw~kc+9.x饗bŊ> -$ɀw^Ϸ%K"i1Qnw%۝OC~W%F}sZ6yd[5 mձ;bXS%,VRKăWuYߒ-t>Wdc.}[.彜?HB z]#/8HZL:t(~]9~_O?V-6d|umhyة. 7=kO_o`jea#2'뿍ˋvG=;֞o=y$6ֱv5$IHH/_IOwǘ۪v4o-K佌s=7=@@D2 4k11~7~ߤRu4x;Ҋt_֕;8]^nd?ywf?ݓ'S_`%wd@5}՞ L+[޻|i\;fkcGuo-:{9I˟$ ,RoP@ԟ%'-#}xGoOݧW6ڕ>L\<=7 7W/h[jZqwϭ-q0~_j%;z4ƴ4Y-m$`(${m#>qƭ7K_R\y6Vǟks{$-6ɤ+nINлNƞ]."ǝ?&"bOfM\= =W?6$ ]6IoI > ~6mJAXti-i_3ȟbw ?EHt4rJB4W^;: d,{HBTؒ ?я?iꪫbɒ%Wwd6?SX Gt(kFyG~O4UX4t1pi G#kZvsvi7mHmA$]6W\qE<3bŊ"]3W_~yGAD8v,Q8%iz9~XH_{&wecλ#~P?NhX^Xnߵ߉Ħd܄kǎ;=bs^w= yOv d8$6Bi7e+ d>(Wr\̶f%۱%KkKS|*% x_TuY>]`X H0 N8!(Y% F<% 5 VRH+xGU ,xI7{.֬YN L@%/Bayw'Ho/ F( Eaʕ<|ɴw 7G?Q /R|5%ƥ^ׯOǕ8tP9礭(ztdʗ_~9fffo}s EG@E':Y~t>7P8\{n\q8`,f HT%g??t`1ZW6 Qɹ{0*m3h@ v1wzcD`C:XA$c 1lU3Jc#`=n&نuSW "1ۗ8;whwψ-!* :^P'~F7 J8^0fUD^PQ@"oVZHp)SoCgG  F1v8eE1eǐ( `Dx@VX >dne4taѬWDc׍ƸAK;{jP$A'/ 'ؑelhF!#%/_4~DQl!5ZbBSeZM#<G"귫gf#("11RTbddmvI܁+%e4sdO4(1P0 0 ]NfnOf-,Z$<d&;oIԞ6 F4@͂ٺ|cPR :T.yH7X7LpIp4 HT2ihthMTQD^P(д;X>F3Afs3#ALmDcv HH g ٠hu3m#%`DD^@YJAPYH4MyA HöF DL@@DLq`C D/ JD=Al c4[FD~N"ǔ f JDL䵒L!nE"#Z% E嵎(Tv #-vl|e#oJ N2SYk #9i6Du[͠,`^$ LD#*qyNYf&* A3j@UZQifk##-n+9l`"P^ E*%o촟yiy'"Z1й E-%V[T*12RX/ 칢n#mWiv ,Rf2Af[=V)|B;6$(v^tz7 CG vR4Dހ(@wnZ?ÏuvEp4*zzQfFJ$fWG)4֧Ď#:M.p=7AU5BeIENDB`DisplayCAL-3.5.0.0/theme/icon-reflection.png0000644000076500000000000013571713230230670020400 0ustar devwheel00000000000000PNG  IHDRPtEXtSoftwareAdobe ImageReadyqe<qIDATxieU bȌ3+3+kJ2H B22X ƀVՀnײn?n{^ئ馛66js37{vsJQ""# wޘ/<uuu@||P___:::ſ~W666It:]xw@? XjP'P !4M~wORO{HuAmo_)n-y9~Q_{_CMh^s̹?ڼzԊz܂cA>~Ψg)ѧBL9yOݹRo۶JQ|Iw- s]+Ch~LO]XwrxVaܙQKԟзo}opfB.: Pϭ^pٍ{ ~p?>͛$GgX[?n^.ԿWߺRR^iUݎPK!ea~(&]/QUCnHBjVO_~-6C[D}S7k '5SiVV_ZY]h>]+&uB\P/y(I:k5S[V ^hNmU !{hԓ6nEqKj-euM^V {T {{Bo2`[*QaT/=zՏ|#w9=a0ӅۉB Zv*J;:@UJ^\P~Mt:?8@BԊ}2e!.S 4` cH{G0gw~rMԹz7/V:xDe?ߟT=||Qk*~zrަ<47MLbo3X Ɣ@f CF?9Vw|rVJ[/t12FCL:nQXImO+ȾM ďP-zG.Z_vP?Hn'Վ_*dEy 9eLX0l%Bzr!DJIp`d`N&`juD[TG}e{-%>/KPvleQ]U]z7MO߿ڕ '~H-ajiikzq]ϮC.e[2R'0 ۬PrmT<Ewu(Q|[}?Z͓\0Q1R,gb;K%IB.W::0*x]CO0c=c/C8( j7 +ш^) _}dXh>+W fA oX?R%@}vu ߯Ok:cz?K{  ȭ{ _p`Ď(\K rr c5m!тz7E1@r$Yϻ#8_nB( L7 RPM~\e33ߪ_hzrk{ á呼f8 \;"acn`E?nCVBwISPC9:`&_Co Ē<[ޫR5ݻ1Q׳`ߨ߂nuY$y7r͖f)O'+'!'9A&ƌ"-(&s?3E|cߘ;xwb4'[ ?/`%w AJ/M:.v&*+W` g>H=@|i ?7h\Y1 + Q 2l; 0J Oڵ c.efWI6")a;2S=Ξ3yB qs]p<;q`oBYr?GB5 !sTsG_wmnbdBw-B0,6dEdd)AO%BQzXP̊A3>;#3I$ð@9PEO[QM8  T~1T2~W{^{OM+5rSB}oooR5&qq ,-UN&n)ZQX [|( !`p?ݹ>S+c ܿĸf㓹z Pr!&b!d"B spsȐ7S]L/{ofkY (C #k UD*V%)Xbyh|!Vr@ D`DE qcELUKD-5]Bg-\;`F +ؤkH"JOd``ڞs!ahg# $H% G@.iCCLD"~OŧV>X*a ~gCSLL~MP0{+j<9A(z_Oww`W *ZY'܍p?%l&N8 V. Vz1ZP:,ޢ,-?jc) k 9 ,C.{p~frGG6hZ^OLa7Ҫ>/ 52w n08 ;PvF=/?hn,G?f՛P~_:g(:O/u`nx^9u"rUfkGx*[Lp%IܗDLJ0 [0hL{d{+DV׸bX,$k8?;.; d$\NDkp7Ēv%2M`l e4z3 ]SםjOh7vl>ԧK !t~QJtIn},h6A-I<&Li+bDVĻ W~LQ.\;蚫#@(wKt[3>1wT3d\"&:~4u;c85kn !2 r&F!!c(,(™ -eJ< e9FPFnEeI3y>Ks"8+5p#V{BGp (L%ZX6Ðs<{G13 YEsBWBW=`ϴNid퓀"RPLt$ok]:ܽl,Rnwn3?5쓪1<~pR;{*f&Lw&c(exlݱ( n`!% A} ;EIm진S(Lt$"x$d#yfHDLϠP$-XT֑YbK' ^z7͘|S@4u^>/N}V׮(0BnMzbMO$zSR-~XY&QSP8)'ޱ5uBS-Xl~t_'$#5K iGYr1E|/ 7 < *\ vr'iqξE-^W;QXpx%בƕ>Ä6>C70 MFrD邱{꠻S P'oS޸.`yU8sʊq"xs'SD4X\j!qy~kc? ?o܅zR܈ߩK͒K͐)"bg!tZ"%ML4y/@ 4(ey*i­ [2!>"V fCYH 4pIZ $ϑE9>9׊Ob]=ܡu*Z#3"BZY5“ &Jw&@ԑ=|q ;+soY;??޾R|ݵO|6\?ﮫv!±oE(r@B0A.KJdMfx֤E2n{ A7*q}FE}c$*ЎI):=C'RUgSx`JZZ@sU|3xUk3;MS63 /~\ x*L,%^,xxCU}3P7>o`:}yQME=\߅6 N^ H!AF' ▅Pn0("<5d69eX1I K':S'7yAgb0Wގ:\\ґcآ57=5Y) "C}=Un> 0q*ʨ J۸Eoc{e\y}qK}ZzW_qfsg~a{cs~:8Ɏb z 6(Hul%Xü1L+?( 9zBc#DbI[v13SJ޻4Ylsy@{S/bl_?E!&xk!YiyPR{0Ӎ5]y >Df88.IXZk8Q!ӄA[gܮ\=ϿrN^mS.6f~pvi 3?+kCo??3{[Ncsm@㓏Y Sh[a*]o=vM+ySp?oUK| ]0f !dk a^߫w(qGF;% ܵHz+2K%lG@`s*lvga&Y++pnpp 1. < bu}7&L+\g_ylhUx|ߏeyEig[;cB7^L'kÚJ.ֈh %!6vib;%b4,>.yKrYaB.SPX,S;! 96r%>NJYam6eD2+^@URv#tAj'9g׌r_A(D>a㴮:ҍҹ6fImEO<=@u?6ƟݛTK(GBRs=ZywЦՋGW1n. 1>>iI)T[xvh=mD3MS(Zy!B R%iN7 +ɬlS;)_wdӧ_Sg/ǃK3@by&Mgkw۶mw4I5侼?3d>m?+]>_w2!`΍2nۺg2R1Ⱥsƭn{N' Mߵ]3q#s++X({,w 9Vͷ&X+'$WTt4ar?'u2f,\a+X$p6`"`łVsO=>wIm IcvXMsxOcS_x.nf'A"+ǠX7%(}qڛzH]|!!1N d Ksg-j~ Ym1dW@`Qۘ>:QLކP^径LdzjT0N՛F ;5ĸzgE:^:weTI7LM87ogo|qEbRDWbY+;};/csP>47͍Mux!OA>|Y>!7Ej׍Ύ4bP$rDŽY@c1SJA5E93`&ws,|l k$ LHQjUG ]<"7IIjxbC 904t1R]x`ٸIKo_ngbrM֘.aZJ&Z'{vF&eLiR5Щ9X]w?v>w~uwub"4`D! dпϫc̫ԊQ75ܬTNge4V?H[paYTs׸S8A&S" aT0=mN`:/iįδޑyl)Ć(g?^) W> %n%SfJJy Iw"\ֿ^+;`a o՛w?;U%|ß>߀Y~YqֵxKSzMR/n-Zt#CKd5`11U;pb)5lt[=[RviEJ¾<^ g`*aϗs$4{q7T5vK2EAS?zg# YpFlҵ#(0ɔ Q"n/k0@,_M{껾OOnU? p% ax] m{0ZFLP)wqQ0ZWyC=p[?r1`sˇ*{dzJK<@%c 6dC8ܧvY,e(*?(`fKL皬fςIt/6TH%&2$+'Wϫ׳}b@/_oHeJx˳yhdY@aSIZ9{74|v|'|O1O ;{ޕ.a[+:}::~P|\}\DYNd26iϜZft5JkGԢyDR/21Ah*HLL0}0tn'GlžC35Yev'idđ>t[\" \(*xU8thӉ]~{V@`v73/?|~:,5n޹8˰uD}:00U]^C_~_UG/|mm։"A:jYhnyJ^s' `Rr\8q0eÖ&F;c^w IOebeF|UEPQUx1-t46M ҭ!.Qq(ZF 7R֭Ł YZs]cGoCP(3.O(D )dx{ه{_%_wnIWs:?eQ?V󢺀Ԓ#VAꁅb]Rg3icn͒z j.lT'9=n:nB^&9Yo2ފ%@W8t~-\g#؆,b xAIpE]?5l]D{!jԉN 堌.hN3 b~3$jm_o.`QfU|\|ilN8C?t}J/л{·&! JODn Eq"HgܟX!ʌNnr=b6L$9ߢn>d\?EvMOA"tLhSb:^>%쪯^z f48处m{B+96 JCTc7N+1ܞ>,՛ 7_]TގZ6=2ǕVfvex⛿/~śPo{;>AY'% GCV@2ZC mVvX$H-S bj=Cp-1pNV&SNΕv%A] Za sbS?3ܩ$54IǬ P̈́dc"*4ٴ3puPVDpݓ0:t'EɼXRm˃>b~ u[R8I.iiR ! "P/sdnxEMw1rWDlym*r_O隶GPQ<Ǝ d 1)h!ג"=5(;!!ȇ|psg0˩)xo%BvOC5?Xt͇֩pʉo> =~o hJj/PJ{5w<2>x"8SX.l{kzܸ_=w[_^R"AD֢Z=.G(zi YPy!S\#G X+l&nqyRLy;YG-IH&-^^6ҮE,9NA_k]y/GWinRBxe6G5<)`l2.tb[}^3#xk07; Ap:yi <NgLG`}] X}4%)%.ZOLe ;o:@wtm>QUյ9ub!F@Nc ` [lax5I߇"t56~@xYs4#:%6ɘy&n[F!!,QAceXuL 6ajwOIfwܼ8t]++`zj B8_* uv{t'փo:@LMSf ̚ ,^@HIޖo~l원}z`?Cz:Y>>Fs*eXVwrLr U\'|>qk W:nre&y+M?MJRƒ܄C;IxY"-a<1˧1;L`$b~Ɂ(%U0(33am3i/6!D̹ur4|C[wPY'z:e}t/H%Im>>dG2[`lFk\t/q ?鋥T$1:Esp#yRH}iJW嗾Ν Ǐnqp'Ej|ccʕ,U%yAhno]m|Q} ZSX~ Oo7EO9pdogY? V޴ТHvpچe-B#hEmOƛPv0 1a:xm M!f~(ܱ.ts<Jk܏ ){~9aH~JJ!-p2qxښ }DhML:D캐jpF=zRAK$S&W,+ܾ G KJzsGy/w RǮIحc8gpMv_.b~hy |UpQA+(O1;ksKĻ}Ux@okV^^ ݉%Mpw;7'6jfq0ZbU }ԖIyÎL^&wzM:lQG`9NH4NyIlxRњ*HuYvs%7.b5pPj7]3!QIdNMy+G5č n+[MiqϷvt|!j׾EC2 ķD* <%.3yt-X]6DF#S&r + 12BY [^Lճ?U #ieZ+ C'3蒟2B4qc~ȕťvG3V㠍.?VP땬DDǏ0؉4yl>^nva$`Tv(ڤ: eIA=A&šnxhVRFC41֜{EHSjW6a9%ʎ#3z_؄b+X7)1AgyUXVeP8ww:K dBXv,Oޒaӵ ԩ~^+in+7> Ycrðx:"V߹Ѕc)@J:5"9Ħ̧! nB9rA[$^ewa-= GNSԇ󡥣kǰv\!v4_CHZ H'E4UA1(u;#Eru@p-Wغͪu5b!Ň!{.=geN1CX^2 p&]gУ03h`*äM޳ז{fvn7–g`qztxcɴۄ({׻|^f*$(m"Y$px~EC=zzt˯čŒm4-KȨɄەYj^h?2{c ЦP`*i9ukʕpP\M:.kx 6'jA6^2e:,S9SoBeRZ盒}Wf?@xEWRV\r+P׃^EWYB/V̺&%s^JdB9b\ v&ꏎ}Fe_܋ix'z_63g.}s:|>ȩzL<&_oa|G1SII|&%9ɶmWk:f㦨.Lĉ`ȴٷs^Um4;t:i;3.?=/ߞ3@mVrT G`px9Nok}ޯrrKvm7[9+j\m =Uŕ((kȸ|6"?3/w7?3:q~Kt9׉h5fDRVy#]Oq e1 DAYPǴX*Ͽ1-yޯHxUElGO._ڠ]ʥ&3vut"/|Չ[3ΪP2*u\Um6%|1sigtr ȋdO62!m޾k oxRY`׮%iY[u/|׮}@gf^=+[1(9Pd'Jw-;~|&y3YO"4j P4A'"KTc,QWWݧ;,]TViٵspSM0Sإi/ ȸiUdEX/P [gv"j<.yjAZg\T@Z,W9VtkAifʉ'HlpL[n R~]Ϯ.>rc맏=VVQ/vlrž#&ŒT.b|hnEer6,6^*bvK 8wՃzb#Is81/ߘ6n:jV"XdQkm L]$R0&ŃfcIhCcBbH== tu9n%7 w ҖeER N?T-%c[WxYPa9O~Ÿx~Hna)3Q2'v! Mؽ4.!ڙ^ų[ɧ@Cg~D "FƪzqQ9~mSaxғv7;@/Z-S[Bkt22E\MTt} 2#a1Bw ;' w_Z5svV4-WA1\VWat8Cm9{*Ldz#e~َ̝]v|Nܬ2S8~CUd {7`JCF\Hq52X"x"UPAE1BGz s P;Pe6fr1HـIy\bEތ[L$Bm eɖmU2W[S`;R5dz$V]^/^yqn# LGNA2;[ Vdw,wja"nVO^`5J7 Fno tW#_ZAZ 9&XpB =з0پ,DZtOe^S2HaKA? 摹;hAP- 0s݅k[1Uٞh =z"-+@dm# !& }܃z"ݹ3 \kKw哬 *y]ڏ r!4âE^'ZZ>rdŢOJ- o- o歹dkuw}*(HhY|ZVK0`inQCWez;51(3P$+ac-D7_VNyIQϖuL ؇i;9 VL #Pת?E:3H!qm˰ymp0cojع74qCG #໿8P%gz7mݿqsx/ _'f̟Y.!=/IC2-  %~ )׺P1 S坛cvT1N@;Xa!2p jt6<[0`;FliVxߴ%n Wug\ ;Gq\7jĽBo2/>?{ٸ}ęƿjfЩe_Փpo۽j.8ڤÔ&I ?+-~Kfi'$~&F0 2q]dy'¶ (K3$1{jmOʫSTI@Uc}0.γ| KM.H۵i9>kǔWV A=&?-1BݡKo8i.LGݥ%s,wcYX<)=Qs*"HMYV( *?>zߣ7PEQUylQ=7:RF g[ lH%oCMOynF- \#Ʌɭzx+]6+K w^d;e*$}0a9f*|'_*`\R,aGX\ bChozM<'p6 wꐻ&OjdlP} 22 :rf Jԁ%j!(r@KrvkF 8 (.*v3 R` 6d_9sDF"irvW?fn_AV)N(Ka;Ǩa颊iuBjXڻ2ަzZǖib`QydQh /ٗ{EN:=tyzR^%sf1K#\aۛ{+aNep`zܵ˩rN$cf9q8.GJ/,ѹ>d)+n^B_\ 5Qdthur"Or Oc$@RJdZ'!RP%2+,'@O,B1S:~6A3oнQCc;,vA $#Z<+ 犹V١c-+ Um,zGbyܼ 7_ۅrgbdP/T ЂAF^r㮩L9)$ ʢs[r?os fqՠmJlSn6S;HC[>>-2`lQM@jŰ d"- p2i^ QKD98tS '&ӓjtgֱz LsG! ،ts˧pZO+S<|r V{$-}Ix-kWa{kj\I'=]!Z"DYU4D1Gdl/ L{JG\0[+jۆDsiPQ#?C;5uRA,/?;tcO4] U[Dd10bSю;)s\@8+gۺcV3ʂh"B#:4VR`*H e:Pok#63R`zk7 ==lY@8rz6Di8ol՗)ȊLE5cd% wwP,y$p(!IH s |>c> `OۏSxis>ؼ|1++֮D\5b@޵)$3?H Z"#XEW*zW L̞SV>lDK`s٧ ⳎN:!u2帷h>u;+rS/a5b;`y#b P^I/y1<<[ɐ"F}Os&[`pSM'y~ $-Xl2~Z]F8UκHK-7hFa7 s7ly*3ʫq^ܢJ >>z{Rzs8wwSO -HV`,V-F5S1 p S//<7u `>qlz- zoа@_DS-]ޔ D0k=TfdCΒ&  3:LBsدCBÜP7(}ejzOI/)0=\Ҟ7D]h i>d ^TިM>f8a'2uBw2=YOy5~'>+ "'!ox Ԝlȣiw":o*cE7"kݝeֳ\8{dHDhMLBEV.l2rDuO=RBՏsmHG/K򼊕j4Z'զAV`Ē%UmQ{7Uۻ+ʽۑnCgXO |Q0ˍUM^|b#0А B}{^YL}+P z L$2S];ǗKxmGnBK @mf2!+fT:?G/T˓+5W>H@,)WoSdYrN[&kW@x% ~Vy%LLSVOa|-؂W(!':+ƍuɂ\ΫP."I$3y8ʍJܷXL7W>&8bm)K9Ef@L袘{c( [Ȓ MKfn!1 Gp%䵑شJ,6CI=#^[E,vX5]Tw -RP0X$[j Sl ` f,uA> e8S0\ (R`z7OP3vYfuTǫ|XY;]߅_݅m#tjf.:MH0Bx=^D2V{31, []/@ 8[+2!3)8HryΧP CŸ[jZg1UHpMH%8Ψ"#)z="#j \JW`(s. M]fcۯU[c z}7Ofͨ(εڝ( m*In4}_ jfe1Bc*">ǙZ抅9+!/N\!6sEwlnRSB&1H)" ΧE7S5b jJeղI Ɵ#s0P :Ⱥ8e#tY9, Tf I'+ \ *:a7f]+jX;A&uo8n ҕ1Fj t#ct=c"7Čd3M#N@j8YF1D1fJ~閑$x>6mi(F Kd4[#n..brBh8YQ\I]ǤN ,PtC&]%^VBm] v?'!<$1꼮ĴWWrSRVC6H@ `/a"/nVY˳zEH}Y!n*cj>=$ np}Ž :\} ܚ Þ!p<Ȟ'BTQu2PvgɼnD} K:܃53("\҂Эrr$bFVU %0$D}]ryȚJ2 X#b,E$ҘLEKʽ;LGǕ)4} Y*v[i=;Yv3L0g =îrVD{yGpk]{e!)QZUQsX*`iݫ)r(1Lb*z bOZ9΁*eхc6Qk㓌f 4J͖2|ihWn]$@@2LƉپL{'uTai2+@8H>wD-]dq鼯:jZ{w8[AO]Z}4b˚"*%P`dBNQǝZ`{n.հ3q3w-;S{Ia\}{,ʅ8jP;*8b"Ub|z6Pְr,3WL /j̍`B-9M_ ()1Pu]oR{ڮ`՜14;>$Zܓ[A$2,m`ەԒ[Y TtbJ29^ b^&ZFkJ(tL1L (1w Nl ٫L`c+ev*}K+uML̆RLv9Rykں,$+d.npdrR4|BWN##IߎXdˑM"yZsEr[@0t1x-HdZHkWI]0 hJ㭢9QxWze ~haff> 7 (s'0^Tq:=f35XFpsRf2;i|htHJoavB;NOb [[C">6Y2ۉ;5[0ڰZ~ԖNP e^yw `uy3Qf BMӅ vVy$;Lo`zy*| 0%C)5& W@MFN,#yXjgZ^z'.rσ&mwlZiiek7TԦ|8Inݼ+ e[V`Z_.24M>';d<cl cQTn;;3zkcJw.IsGId oSRbph-KZ.}}g_jEmKuP\|X6) v"n1N g( =M(l no4G/\^W=c<~ L ^.nq9 J8"1iv"ݖr$)*HS GX5p @kXqPg@p_)`NiRQ ( M|𳫄ǽ)ܺ.`]Ή u:xG4dd߳}sHgut ֟u [1K!d2VQ$<5_ITuROox .U`3UPJ6Lw*2)cZT:ӷ]n`q-eRC5Y ~QVUZ\; Ӣt|5 (\ eJܼ&$kJyc4&mnn N F2PSɼJFu#E()i񈷷 sSkg(EZ>u6=` %.xeMl~`@J&%o[ՙB³r5_6X`=؂X\ߝV@(0ueF]x,e1U`!S*O&ܺ޲^s7{jbFA@k8tݝDN'KgsĨDqDD {>k}UPUPŻn{ZK}{8({Tܗul hPԡsT9q`'é7HܾK[,=8iOfĈcsG)I"E3BKHmLBܓBf1#歏=BoWy@B GO\s+SP[M^Ҙ]b.!7䀃Z3הXl3zr+v\D2QjpihL՟-DL2pAf {8BŦ7҆:d$<өu 1("] E91T038;u%-#TɔAܨR[ U5ƐDH, Yo}.}߳u ɷWwO>616H6@L[ yuD]{-v<ӕ@hwכ+Zv>pD~:;Vdk!'Dܢ:4Bcjqoxq-F]F{Xy8Q$ H2"t`TlW#y:]S'J$h`9˜c -jMeA ۢQ`"`+31B =޲%ɇ7qvA@^r[79֪JUyYbJCY,|~KZ.~ּ{eslnSt]:n?J/Z)KLDK+I0gU]忺&pcb0L@}sJ &|)6$VCNYr>W V6I^݈uTK[Y In֦ (qj5|w_ZU'FǩE'$p'~ep|Ǜ,,.]="\|AcKKLкBW֫.榚jWK{$OHP :嬒!C0:_'׸اuVN^d)(+s^}H tVi%eP !2{3ipL<.i0=}K}n=e@߸góS{tNȾKX <KQi&x_ib_c@bгa6p]!@N+dnDlJ:@ݼl͵({2<~9*F$I1F't".+aUF8ƏJ=ciGzUmuzbz^=}:.@vxyv-[TߍO@Y^$ML/-?^eIo;T*]SWz7ԡVŲ8Uejfmzp OB5U'pX:vn!-/ڳ0{ZPWߣ?Ϸ.''RIxIL0nD68@bnx`$q=gmqp>i'ge\BX?z>M!4@D"xd;7$soy&***~xvc N=ZTJ{ӓe${cH=Za ssQ. urO݊aիw;NH do.PA:0 "`71Ns {xqSz=:-UTd+iF}fZb053Gb.U6MuW2v, *$qܘ7=YOn~o}wG-7[ >މtl7(ut;EpA)R%f8,qdiV䑄JI9 /v#{&ˇ; CA^,k$@.@I4 O7k-OM6TIT̓uԮWBR e1ݭBb.f5ņ*K BES܆OhcIO&7=[E6c5#xq0y,;s7Yt9\K0{RC* x݇bӎ1Fju5X7O[P$Kdž._Blx:h"EW!zWEK6ԣf-U#c%'jYV͌K`$=Oh>О[E6Sq:~x ^"8(Q01V oD`:k)n*-Skiq=cyQ[h"*2DXljS`NlB֪*]g=J\ 92Va0 -yn@S+\Ea'K)'jG\{~n4dj`s(hH!*~80 $[%iq84nB}X20P8fN}|\({LR NfE}t@U%NVX={(SWݾ}ϞbS"7!PK^pgEt b${r)*MA1 J|`V%p+0Xm6,VmVhARIC9ȡ]ّ-NtN)spm3ct* uQ*zbЉp7!OOPT1c:Vgih,l ̰-t 6z dzM[R0TL0 3 ̓V(Z9ymġ_Z9.!v,A"$]9Hgbw;`x Eiωm(1EVO<-nUcoY謿2 -JQ^{^ȗ?-bk?}÷GvP &jYKqj^~nZmƂ$NZ&wNۈ`Vhfmb K%zLu-r tZyWU rJt݅1xԢ%vOz6uKџ~f}ڑ< {=;g/Kỷ0D$Ƹ8oL+I vi)KmLL$( (am#dū2[=,{ۆeW^KaXFUbPX 3$JNxk$M#yStLۉ:뇿sm%G["AՖӱTzTm#¢ί K`Jju*2mX$zt i[ H1dЃX7%(l^Bl #$ <_d<$Ep@NЄrL\)V=<54kE<@垒P4?xյa`2sxBR6Je1TY- tWJu#XfņHЁ8:JZ4Y=,DNLD^TW=ቛ41ał-Q2LKç\+b>ޜd^zrIT4뽧c& 3(ahWL})p]nsdשS2 ^˛f,2wTY- sH}r/fC,:,wxh+D$ bqNz>WDk _i^s lJ`-G6m dCi ᝑA2z>Dڌ 'Fd0)i5;J}flrx RdC{?Z$ATrOR*=j.8vd_ jpEKATS@J]Q:|P׵2asooK|tcۈu͍ORLp7,R-d&PmV+{@OD:srR,{oqwnP# (}?zw\,x^e4J/`YpXyZ{[8į{kJ+HT)r/$SN#@N˺d'H)dy U@IAgCP&%EI,̕2@ Ik -D+aC~%x#[@ܾn6 7{~O7 鉀YP@Y[ rR< Q% :2򯔳[9@ϚɁL쌁Td]k#: ["$ɂ%j8uSB2#,ֱ2gҼ70fDY0"bZNKR|G;d/2C(S10o?p. u:V ?{Ug?n?!2BB:"PUd=B0j|a[_$@.CO*]w"{ 3Q3?ېNXghJ^"PQg#YЈWMT0iAnSoeI>!⼖!Aw`fF3wû7;.kڭz /Vomm#)l+/ b,p;41BYf*9k׷Ftj^r0v{8Estk pI L4Q{ xiDrT -kWvM˼HDt=~vj]@ VJdl[>{'R5y;,S[̀s% v, ڍ+Vt{<'.bv,eF/f q[PqXn2"xL bFSndJ~|Z7)+Fc33PJ_2ga1M08% 䵲%^ݠ Ozv,UF'Vӭ}rz<}n_9d)B[P&ՙ7)I&%ҹ# x!A.Rԇb""]gcI ;nkCMt \+E-gj6c"s骹yy9I[/ d${]Z湒EU 9Ơ[ޕEX`Y1Fϕk̙]IC&iIڱ_!s ?bp5Hɸzn Vv<>BHX(lvӧx A[Xr撾&],c")$P<@E K)AiVk4T %m2fMI i {~]O'&åxė+G(4mʐ +Գ;;wE/+%הgˇE [E@$l11OG"RnoJa) +D MnyR#q36M ((s׉w]:q4%U#f ]8(cL9v\֯~0thZ&}=% Z M-uUy8A$륨""9(Ƽt=ʚUk0.@IB\%ݽRG&-7Wҁ|yOnT/GG|ԋPb< &'/ff@ ЈNQxU;&"qۄ+^3tM$@$ Q5{/1c%= Zgu=Pň)"SHL 1.VZH$р)5u{(1< d3qEߦh@r,P<3z@=bRtSnZMn8555XvuZWvjIykn杷}/g 7c1?>7gkWJ+^4#`>%T K!Kӊ`PIe`f_)!AA$  -@#̈́rށ8OqY4lUO,d9CO^LM"M0[ːrBqvڵvM8LG-LhZ-]_c *ik$S>A}?-^UVj[V@MѼEV`|)P5DsS5V@NyLpf'谆!B@ I/M( iCɁ# DPUV`q75?vˎ[ӻQR$>9g z _z;HLJ]UyK YA&^HI\; `QW(nbE*_ lnt9zl!/߲RKķSc|vՏ2~~՚W~ŕ_ZY'c#BxRG B#&V˲IE^!!0`"RjmCBP٤$'Yo; 8/1c: |#։4Gf UgMHQ7Thp8/0Lk: fz-&^?XyYsQAF>rh"5(lKP3L}zY0z߇?w4jQU8RuE*b\Iʕ'03OQ@rc#,VN% rbOF'{1cAa,n[]CDR5nıCU TK?ο`˺ EJnNj"1_{jJeQuN G(Ꙧ.1۩G3ObquZ:b*DbT){wlPFhp9DK]w~f_RsvlAgԹL3/r)ut~>rioDG%DFRNCC+"A^y1sYIX-E0Dؽ(ihZY.s,Ari,?y?1hyF7@+Ǯ@-81S.RڌB^Ŕ9 i dfĘ&FO IMQ߮Ol[?ۇծUgw.`h_s.ok/lxG.,2Rk[9нv{.|7TW1JN2Blhi,iMbY)<<,A1&`Y!X+T+%& NQ`:&iښ~쁫]M*7:qq͛aӦMj ʢK+ ~7RO_;β֊O@zZ;Ԧ'3#{ͺ!d>j6g+ɰYp%r` 7 UzJ}aײk86Gtu*" [@"OP S_0TajqϤg ޸ImώSC V홡=;? CK.O}SO?:묳}NV;nԻn%,? ƞUk@+$Oha X)g1qu/X?DZ*C=3m~Z myP42.цt7d#VwWPALVQԂCsZS ; 9.7V?4G&xrvzcz1;/_?3c,رp8X⳻7.v볖rVkE?l^O<딾UP~يd_PM?ï9w%0iĩ+7c6=ҋۀ8hj@ $\AX?:I@&[(r`BЕ*-TW>/\GF'줵p.>WZ>X"D L &q*%DC<>߿ pBZ*`$:Q`! *@GT\e3!+='V%$l $ ]06(BRF.;eg^8w$`=սjNE]>U' J#G Q7Px]@eKȶD[xh@X -|gϷ e`H(̞557ȗq?''ta QWM fntzۭs[ux˥YpU$aU)d|DT(0m`ZፑKTro&mQ'ohkA6dY]$kvg7VX2U8jg< AѨLVm٪s_߻|˦&ad쑟ZK:f) +_^z]ߊJQ;%R!4kx`=#Kgd WN@fve/w}5#itWmP+_Q6,CT cJ\;o8&7}xj] ct PʩSwJ׮=q`HDIBG\˦oHuK0,I''}, @fuFD\Mhfy u|<yxCdHKz`T0_(*ɫO=O;2ۘ=giΆsZP w9![LQ6Q Tpy%-I7-D *R`n,h\D,? kl͇Wu '?4ƠMHPDO O^qloO<~k&s5~Mk֯Q$Qn)e`%P~xvpv _<}Xݾ?N() e\Њ`(wg,~xhq,c5*"CˀkƇUJ{<-+b;)V==lkaj PϔSy˲opMZ?J%.^"@|"Y]* F^oZ$'a"ddy@h$^XЍX-Έ:i´{ 7ޒfɀȴ@i433[^v2'7)A:qW,̧ B9Wx qKU9Mi'W_+ܰ<1 $01/eRF pRL%T@^r1%2GTEo1ֹ)>G'sĺLt vEد#H+@bGquG Oq׏t`|CkRv1׃R T{{Nrut[&K:3xax'߹w`/IH Zr٢,AdDĝ%x$#"@['~o &j;S !M\w vX7\B=`'5hvz{;03:+"Dd.$[fČO|;VVz6zyӟ.+WUzy|hϵH2e^FDF$",6 oRbA,Gv!!8%QkN§Q'B]R˯-籔NZv.;^Z׬ZzbWקTN[KwVz*Xe:#~s./w@ҡ>|.J>"\n dXj̅NV2;A1 #o4~JthBf e`+a?iӊn/&?#jLRX.+] 5++]%-!$.В/{,}^^ %뵡"ւtD}9z3 TT:Ioш~{"8,_,ß!PeD^Zhj.E}DFu Kj,om\p8wJ쎴~ QI=KeۈҦzw"Ɋ x.*%ַ~}}],ԡ)K?leK4 &9ipY'>1cjӞ,̎*cswd-xX 3Jؚ,)RBc 3Ibl@td+ik,"Wa@ ymh'VJt QqSk6eb/_IkƁ3.{g|mrh PLA7^IhIA ؽsoAN>ȅP@68T AGv1C2OqR3p;) kҷ6z3Y<#ʹ#4MMt7Vn8Ϟ }KtzG胗BEۆU:!HJ $/$A14BZY P<) 1aI!3"#{h..Q@UL..$C_",FY=+cHgPժb'&bx6LK]kNx{>WX2쿽&|~T Yfb<A*qgUډYV<˜O_0PvpIl&, \pAkH5nqNJ3.~n2( ̇@ j2˪Ê;?n\0(|zޛ/ ^+1ge-L]l r`Hwj)C?5dĎriPK=* [S.z}/hZ8=$r']]򣀠J c TVj::͗E/|s a<Jbanb$K`1l׀C3tOX8zLݒÊ!!-JR(OdX_]ט}5PWk +*L)DRX'&']OeꁲLe IkWu{. < 8߆X!V-t <ǏMx\׽/W&(&3,R& ovz1ZM$%2RR#Iչ a" \ӘrkT`/Ye+r xZa(0%m Q4Z*,ћ)qW.8j5"Aeqkc a1fo\庌CHԸx[JTɔ[0q; &]WW@-fLCGTid::D0iDg(~Ԃ *AƋ՝4Ƿ͞u.+?9Nq* XhY"ư_ LFeb"7r<,OΈa2KqG<%Jw$'_Q(90ۇM>i.aiBb‚d,IbK`ʯ43`?q*TxCb ԇJ-fT&E~Ur;g6+6uI,f24RɨsfıETrt{.BEb1--W9$S א\`FYX1]=\LVsߎ<+@DiN20&$sv (c%uȪķύq)=yG@t䲏X"L PYCvS*˿$O8PP@)"18r e4 -Qj׷&)۫P<ݑhqOjEvDs7 N*\OȌn@ֿṕ/|SI{@ظT~T!!$Z)@JP1y,3 I3\qb{6̱(9]lV"`#s "AS ͚hHz R^4 L=>?0Gb%ϻҘ=3v0Y@~/\}QdY,\YIdrOCy/Թ]9ə$Nisa"U eo z6\(3b⦈TEK`=gliSv}'pbH^f2Xu *  ,L".xmyjoZ!v\ed JRyd'pDvyܖ,Qd HEgb*HvFYq5O@nU0 .S}^$%!Ny(O!Ey0f,f1U Nd*KT' vO9]V->ߣ 3.9[j9$'͗]Žs; KJ@wG{C JйL' ӑ ,НDMpCP, bvݾfˊ/:7weHxK\C4]x.^@Y"?4fE\0 IbXuꋢn[{/z+A̚LH"5,tػݳ{*0X.Z`Tbz)*B5}%bNa6sߦ#,O\0݂ -=z9p`9(|7P"h1*OnLY (0%eeSQpc{ҋ_L,Y{l%o6|wPb,QHn[@X# TDTDmazrepcu@{^n+s$Mpc~}: qɬr  +IW3^D:Z#Eu#z2zO;qKb%HU9RDv N~  p^EzUDz rhC]b&Ӏ( 6] T&U*?R쟄(.ǽ_W4L.5PU/8lN{Xs{3z;@Į(a(1wLu2%K|`2"u!d&\4FL#ܤVC< ɏ<'LijE,)aFmh*]* _3> 7%I$*bMе$8(^/9bh25XH $Z< 5^6U$| e#.3(`i04ЂciA%atY5Dz6~ eIK)V3[Bh)e$/5d6 tP{Z*-&XtLr "&Tɯ@mX^g/cVֿ- ժup^ U*h/uS~aJn9{jznuX3NLbY'ݜĦ8K,k5RkYĺiCHTU1/JT| +%eWAzH0$KŊu‛(kAJeս d.%C&<: Yvy_ -t!mFȶOБhuL:H[ECy^t8?}4NVV~\*#=vq99ᩂn`^{(s/` 8u\{G| ii PKNK%@-NKC9_+𕎰IENDB`DisplayCAL-3.5.0.0/theme/icons/0000755000076500000000000000000013242313606015713 5ustar devwheel00000000000000DisplayCAL-3.5.0.0/theme/icons/favicon.ico0000644000076500000000000001246613231461031020037 0ustar devwheel00000000000000  & h( @    lG$bzP)S)ρT*S*S+U*T*|R+mJ'b  :'({P(U*W+Y,\-].]/^0^/]/\/Y.X-~U-;)(g:lZ.[-]/_/_0`0`1a2a2c3c3c4d5b4_3\1vR-l JikɦVEd6b2c2c3c4d4d5e5f6g7h8h8e7a5[3܂Q6`jheάUGk:f6g6h7i8j9k9k:l:lo>o>i=b8 d^hxv]|n9v8ԳSca_]ZXֵRIuCq?r@rAsBtBrBm>]7i J3"i9줡m=v|Fm;EY_\ZXUSQܺMH{FwExFyGuDpAM7!" d5j:t?Yq?u@LZZWURPMKHFEGzJvFj@ . o?m;w[GlvBvCEոQWTROMJHEC@>@zA/"a8ZsAq=sEtAW}zGzGzGKPPNKIFDA><94*[pBtAs@tAwEkԌP}J}JKƥMLJGEB?=:83޸+vH˧vCuCvC{M{H}|y\MNOPָLFC@>;963, }MwDxExE}Q|JLג|zythPQRSPG?<:751, QyGzG{H{IgMSzvuswTTUVWŦO?8631+ W|J|J|K}LPQ_{vsrou‡YXXYZÖZնI42/)X챀O~MMN\STntspollؒ`\\]]_V9-(YɶVOOPQ\WW~qpmkigg__‘`ÒaÓaƕbJ$Z]QRSTY[[NjnljhfcqÓbēbŕbŕcƖdĔcP~VScUTTVjo\]_ܗkigeca|ŖeŖeƖeǖg“dUSdL3 e켎^VXXY^__Ýjwhfdb`^pʇfəhɚiciM2 bh[Y[[“a”bÕcrjeca_][`ߎkʚj^tPÙnf\]^wŖhĕeŖeƖf|db`^\ZYUivNf\Ɲq“e^_aǗfǘgǙhȚh`^\ZZYWE\ÚqȞsÕg“bÓcwȚiɚjɚjʜlА][ZXYMv[@ǝuɡvŘiŕeɛkʛk˜l˝lͤrx[Z\S,WsRȡwͤzʞpƙh̝m̞n͞o͞oΫ{g^X7mƝu[ΧΥzƛpΟoΠpϡrѤxôU[ṃ|ȫ보ҧyө}өϤxÖicNȱ鰰餤Ȭ}ˠwN`??(  V+~S*[~S*zT+zU-[X/oDV.W+W+Z,Z.Z.Y.Y/[3~v0ZWZDe6e5g7f7d6`5`70h`xUֵSf`ǨQEp>o?l=h to avoid XSS via location.hash (#9521) quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, // Check if a string has a non-whitespace character in it rnotwhite = /\S/, // Used for trimming whitespace trimLeft = /^\s+/, trimRight = /\s+$/, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // JSON RegExp rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, // Useragent RegExp rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, rmsie = /(msie) ([\w.]+)/, rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, // Matches dashed string for camelizing rdashAlpha = /-([a-z]|[0-9])/ig, rmsPrefix = /^-ms-/, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return ( letter + "" ).toUpperCase(); }, // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, // For matching the engine and version of the browser browserMatch, // The deferred used on DOM ready readyList, // The ready event handler DOMContentLoaded, // Save a reference to some core methods toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, // [[Class]] -> type pairs class2type = {}; jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = quickExpr.exec( selector ); } // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; doc = ( context ? context.ownerDocument || context : document ); // If a single string is passed in and it's a single tag // just do a createElement and skip the rest ret = rsingleTag.exec( selector ); if ( ret ) { if ( jQuery.isPlainObject( context ) ) { selector = [ document.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); } else { selector = [ doc.createElement( ret[1] ) ]; } } else { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; } return jQuery.merge( this, selector ); // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The current version of jQuery being used jquery: "1.7.2", // The default length of a jQuery object is 0 length: 0, // The number of elements contained in the matched element set size: function() { return this.length; }, toArray: function() { return slice.call( this, 0 ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this[ this.length + num ] : this[ num ] ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = this.constructor(); if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); } else { jQuery.merge( ret, elems ); } // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; if ( name === "find" ) { ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; } else if ( name ) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // Add the callback readyList.add( fn ); return this; }, eq: function( i ) { i = +i; return i === -1 ? this.slice( i ) : this.slice( i, i + 1 ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ), "slice", slice.call(arguments).join(",") ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Either a released hold or an DOMready/load event and not yet ready if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.fireWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger( "ready" ).off( "ready" ); } } }, bindReady: function() { if ( readyList ) { return; } readyList = jQuery.Callbacks( "once memory" ); // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready return setTimeout( jQuery.ready, 1 ); } // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent( "onreadystatechange", DOMContentLoaded ); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, isWindow: function( obj ) { return obj != null && obj == obj.window; }, isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); }, type: function( obj ) { return obj == null ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }, isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, isEmptyObject: function( obj ) { for ( var name in obj ) { return false; } return true; }, error: function( msg ) { throw new Error( msg ); }, parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { return ( new Function( "return " + data ) )(); } jQuery.error( "Invalid JSON: " + data ); }, // Cross-browser xml parsing parseXML: function( data ) { if ( typeof data !== "string" || !data ) { return null; } var xml, tmp; try { if ( window.DOMParser ) { // Standard tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } else { // IE xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } } catch( e ) { xml = undefined; } if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }, noop: function() {}, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && rnotwhite.test( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }, // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( object[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { break; } } } } return object; }, // Use native String.trim function wherever possible trim: trim ? function( text ) { return text == null ? "" : trim.call( text ); } : // Otherwise use our own trimming functionality function( text ) { return text == null ? "" : text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); }, // results is for internal usage only makeArray: function( array, results ) { var ret = results || []; if ( array != null ) { // The window, strings (and functions) also have 'length' // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 var type = jQuery.type( array ); if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { push.call( ret, array ); } else { jQuery.merge( ret, array ); } } return ret; }, inArray: function( elem, array, i ) { var len; if ( array ) { if ( indexOf ) { return indexOf.call( array, elem, i ); } len = array.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in array && array[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var i = first.length, j = 0; if ( typeof second.length === "number" ) { for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var ret = [], retVal; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, key, ret = [], i = 0, length = elems.length, // jquery objects are treated as arrays isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; // Go through the array, translating each of the items to their if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } // Go through every key on the object, } else { for ( key in elems ) { value = callback( elems[ key ], key, arg ); if ( value != null ) { ret[ ret.length ] = value; } } } // Flatten any nested arrays return ret.concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { if ( typeof context === "string" ) { var tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind var args = slice.call( arguments, 2 ), proxy = function() { return fn.apply( context, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy; }, // Mutifunctional method to get and set values to a collection // The value/s can optionally be executed if it's a function access: function( elems, fn, key, value, chainable, emptyGet, pass ) { var exec, bulk = key == null, i = 0, length = elems.length; // Sets many values if ( key && typeof key === "object" ) { for ( i in key ) { jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); } chainable = 1; // Sets one value } else if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = pass === undefined && jQuery.isFunction( value ); if ( bulk ) { // Bulk operations only iterate when executing function values if ( exec ) { exec = fn; fn = function( elem, key, value ) { return exec.call( jQuery( elem ), value ); }; // Otherwise they run against the entire set } else { fn.call( elems, value ); fn = null; } } if ( fn ) { for (; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } } chainable = 1; } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }, now: function() { return ( new Date() ).getTime(); }, // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { ua = ua.toLowerCase(); var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; }, sub: function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }, browser: {} }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { jQuery.browser[ browserMatch.browser ] = true; jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { jQuery.browser.safari = true; } // IE doesn't match non-breaking spaces with \s if ( rnotwhite.test( "\xA0" ) ) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; } // All jQuery objects should point back to these rootjQuery = jQuery(document); // Cleanup functions for the document ready method if ( document.addEventListener ) { DOMContentLoaded = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); }; } else if ( document.attachEvent ) { DOMContentLoaded = function() { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( document.readyState === "complete" ) { document.detachEvent( "onreadystatechange", DOMContentLoaded ); jQuery.ready(); } }; } // The DOM ready check for Internet Explorer function doScrollCheck() { if ( jQuery.isReady ) { return; } try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch(e) { setTimeout( doScrollCheck, 1 ); return; } // and execute any waiting functions jQuery.ready(); } return jQuery; })(); // String to Object flags format cache var flagsCache = {}; // Convert String-formatted flags into Object-formatted ones and store in cache function createFlags( flags ) { var object = flagsCache[ flags ] = {}, i, length; flags = flags.split( /\s+/ ); for ( i = 0, length = flags.length; i < length; i++ ) { object[ flags[i] ] = true; } return object; } /* * Create a callback list using the following parameters: * * flags: an optional list of space-separated flags that will change how * the callback list behaves * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible flags: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // (we check in cache first) flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; var // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = [], // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // Flag to know if list is currently firing firing, // First callback to fire (used internally by add and fireWith) firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // Add one or several callbacks to the list add = function( args ) { var i, length, elem, type, actual; for ( i = 0, length = args.length; i < length; i++ ) { elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { // Inspect recursively add( elem ); } else if ( type === "function" ) { // Add if not in unique mode and callback is not in if ( !flags.unique || !self.has( elem ) ) { list.push( elem ); } } } }, // Fire callbacks fire = function( context, args ) { args = args || []; memory = !flags.memory || [ context, args ]; fired = true; firing = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { memory = true; // Mark as halted break; } } firing = false; if ( list ) { if ( !flags.once ) { if ( stack && stack.length ) { memory = stack.shift(); self.fireWith( memory[ 0 ], memory[ 1 ] ); } } else if ( memory === true ) { self.disable(); } else { list = []; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { var length = list.length; add( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away, unless previous // firing was halted (stopOnFalse) } else if ( memory && memory !== true ) { firingStart = length; fire( memory[ 0 ], memory[ 1 ] ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { var args = arguments, argIndex = 0, argLength = args.length; for ( ; argIndex < argLength ; argIndex++ ) { for ( var i = 0; i < list.length; i++ ) { if ( args[ argIndex ] === list[ i ] ) { // Handle firingIndex and firingLength if ( firing ) { if ( i <= firingLength ) { firingLength--; if ( i <= firingIndex ) { firingIndex--; } } } // Remove the element list.splice( i--, 1 ); // If we have some unicity property then // we only need to do this once if ( flags.unique ) { break; } } } } } return this; }, // Control if a given callback is in the list has: function( fn ) { if ( list ) { var i = 0, length = list.length; for ( ; i < length; i++ ) { if ( fn === list[ i ] ) { return true; } } } return false; }, // Remove all callbacks from the list empty: function() { list = []; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory || memory === true ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( stack ) { if ( firing ) { if ( !flags.once ) { stack.push( [ context, args ] ); } } else if ( !( flags.once && memory ) ) { fire( context, args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; var // Static reference to slice sliceDeferred = [].slice; jQuery.extend({ Deferred: function( func ) { var doneList = jQuery.Callbacks( "once memory" ), failList = jQuery.Callbacks( "once memory" ), progressList = jQuery.Callbacks( "memory" ), state = "pending", lists = { resolve: doneList, reject: failList, notify: progressList }, promise = { done: doneList.add, fail: failList.add, progress: progressList.add, state: function() { return state; }, // Deprecated isResolved: doneList.fired, isRejected: failList.fired, then: function( doneCallbacks, failCallbacks, progressCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); return this; }, always: function() { deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); return this; }, pipe: function( fnDone, fnFail, fnProgress ) { return jQuery.Deferred(function( newDefer ) { jQuery.each( { done: [ fnDone, "resolve" ], fail: [ fnFail, "reject" ], progress: [ fnProgress, "notify" ] }, function( handler, data ) { var fn = data[ 0 ], action = data[ 1 ], returned; if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); } else { newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); } }); } else { deferred[ handler ]( newDefer[ action ] ); } }); }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { if ( obj == null ) { obj = promise; } else { for ( var key in promise ) { obj[ key ] = promise[ key ]; } } return obj; } }, deferred = promise.promise({}), key; for ( key in lists ) { deferred[ key ] = lists[ key ].fire; deferred[ key + "With" ] = lists[ key ].fireWith; } // Handle state deferred.done( function() { state = "resolved"; }, failList.disable, progressList.lock ).fail( function() { state = "rejected"; }, doneList.disable, progressList.lock ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( firstParam ) { var args = sliceDeferred.call( arguments, 0 ), i = 0, length = args.length, pValues = new Array( length ), count = length, pCount = length, deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? firstParam : jQuery.Deferred(), promise = deferred.promise(); function resolveFunc( i ) { return function( value ) { args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; if ( !( --count ) ) { deferred.resolveWith( deferred, args ); } }; } function progressFunc( i ) { return function( value ) { pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; deferred.notifyWith( promise, pValues ); }; } if ( length > 1 ) { for ( ; i < length; i++ ) { if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); } else { --count; } } if ( !count ) { deferred.resolveWith( deferred, args ); } } else if ( deferred !== firstParam ) { deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); } return promise; } }); jQuery.support = (function() { var support, all, a, select, opt, input, fragment, tds, events, eventName, i, isSupported, div = document.createElement( "div" ), documentElement = document.documentElement; // Preliminary tests div.setAttribute("className", "t"); div.innerHTML = "
    a"; all = div.getElementsByTagName( "*" ); a = div.getElementsByTagName( "a" )[ 0 ]; // Can't get basic test support if ( !all || !all.length || !a ) { return {}; } // First batch of supports tests select = document.createElement( "select" ); opt = select.appendChild( document.createElement("option") ); input = div.getElementsByTagName( "input" )[ 0 ]; support = { // IE strips leading whitespace when .innerHTML is used leadingWhitespace: ( div.firstChild.nodeType === 3 ), // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables tbody: !div.getElementsByTagName("tbody").length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE htmlSerialize: !!div.getElementsByTagName("link").length, // Get the style information from getAttribute // (IE uses .cssText instead) style: /top/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) hrefNormalized: ( a.getAttribute("href") === "/a" ), // Make sure that element opacity exists // (IE uses filter instead) // Use a regex to work around a WebKit issue. See #5145 opacity: /^0.55/.test( a.style.opacity ), // Verify style float existence // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) checkOn: ( input.value === "on" ), // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: opt.selected, // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) getSetAttribute: div.className !== "t", // Tests for enctype support on a form(#6743) enctype: !!document.createElement("form").enctype, // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", // Will be defined later submitBubbles: true, changeBubbles: true, focusinBubbles: false, deleteExpando: true, noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, reliableMarginRight: true, pixelMargin: true }; // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); // Make sure checked status is properly cloned input.checked = true; support.noCloneChecked = input.cloneNode( true ).checked; // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { delete div.test; } catch( e ) { support.deleteExpando = false; } if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { div.attachEvent( "onclick", function() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) support.noCloneEvent = false; }); div.cloneNode( true ).fireEvent( "onclick" ); } // Check if a radio maintains its value // after being appended to the DOM input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; input.setAttribute("checked", "checked"); // #11217 - WebKit loses check when the name is after the checked attribute input.setAttribute( "name", "t" ); div.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( div.lastChild ); // WebKit doesn't clone checked state correctly in fragments support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) support.appendChecked = input.checked; fragment.removeChild( input ); fragment.appendChild( div ); // Technique from Juriy Zaytsev // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ // We only care about the case where non-standard event systems // are used, namely in IE. Short-circuiting here helps us to // avoid an eval call (in setAttribute) which can cause CSP // to go haywire. See: https://developer.mozilla.org/en/Security/CSP if ( div.attachEvent ) { for ( i in { submit: 1, change: 1, focusin: 1 }) { eventName = "on" + i; isSupported = ( eventName in div ); if ( !isSupported ) { div.setAttribute( eventName, "return;" ); isSupported = ( typeof div[ eventName ] === "function" ); } support[ i + "Bubbles" ] = isSupported; } } fragment.removeChild( div ); // Null elements to avoid leaks in IE fragment = select = opt = div = input = null; // Run tests that need a body at doc ready jQuery(function() { var container, outer, inner, table, td, offsetSupport, marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, paddingMarginBorderVisibility, paddingMarginBorder, body = document.getElementsByTagName("body")[0]; if ( !body ) { // Return for frameset docs that don't have a body return; } conMarginTop = 1; paddingMarginBorder = "padding:0;margin:0;border:"; positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; html = "

    uw}= lߤ?q7n;x<ݹ z5p|sg0>n='|7mCxC_"{(VAp{j>U@{ȶOl 7y{gq̓6~ 76w6z0sﺴvY>  PgЗ8@w^~~:N~P[Z@؉E}A 9}a0>'~~x϶7xW:arorҍ߽*FWiot2]6ùvOy}>/Nt3g赀 x IjA ]]Iə6l@Q f~3ߟT|7vCno ۋQ 7^1.nAdwZ8kgz8 ^7uwCIӽAx> ~[3 x qu=@Z l{v曝/:B,∛Wp͑Wp+.`lz^>ҝXǛ;W>O~a{ݠ7mCxCo  > v_:{ӧxkRe6!>N7v> o~6OfS~g;g= Gs^9>{i3U{d7mCxCoݣ@w'<>}lBnusAn{{f;m\!2fg4n}-4-jus϶f[@\>JGo%^~ߋ- W{ݡ7mCxCov{~:rvt81 CŦ `^X^0W@{HYsx]MZV}>9ht'OwY:nBo<ۆ^g&== Ɔ6)h+j5֖?`n&gו L 3k3WLy_o"$he໳9KG97z647:U2Ww`]Wk#өv93wj۩JzsG6r'9RSc:8^_`ǭ,ԗꜳ"6 2/ߙ7Ք9|#+K}S'&;Ao<ۆ^'=}~C|:sctu%;{e`dmn&%s h7f0kːJ{A~L+W }fׄfs}nќyNV໮'ugZg G7= vt>mAV@;r Z,({ۛ\l)W^[߹3WY7f2v:2 A}沥 z/0O'=|ۣ| |'/=Aoޫx ~|M7^:A;knt Br8e2x3[eRrn7wLs)/3v”VbO u3DҬko͜~yVnu>}BoohoKx v%̇2W׏; 1ASA2K!g-ոB7 lI25{_]xNE[ZK SEb-ϭ|Sw}S2ݪ_{{=2ƳmhoޫuKW:ߺo88Ep땕nN&&wPNF w65[$v@ltqLpN+`=iy=GFMgWʞ zA,b닦<_oX>2;֯=tχA56dzmho1JwiO?+72؝ݞ;m]mJe24q?S҂v<ғY79ha~] ]4i!-%} P𤅂~fsݘdo-uƔgMn[]V蝴Iݍ_|z3Xaw_`]ۜoЧS[Aw|Zl^t9%SNn)9>N֙eY=;KXW@$|8+a+^2M0B/s.LW)NdT0fR2ց7=+LDۇzӛ+.ޫry647RY@M&#5}yvD tf<2ȹa}ÍF9pPެg|?tKrꪌ,A\(`' Wr}__"5sy̛N3my_nh2ilz ;Kgʣn-aS}WaμuZ҃@& ezSIPrurIv\F%+*w›7yx!` 2-”ߧxL<ZJK% # >릩}2\^VQzkN&5?k.mgރJ/ܼP=[̗ x۸`xn__t3ARΤifа /: $w$[vi^. +yhWLRdjH"hk2MjI!VW9%gW}7OSU[˛лlӵ>/<|,.o<ۆ^# ~sg`/}}Χ`3ZL2̼/UҺly=MrEd: tɤaKYpsޭsi+a܄Ĭ5!@L]$%1V(0)x R2ZX}wl1Bpl.ڬĩe)àw8憎,U7 x-eW@X}~hv:e a|C7\(ZZANd% 8hId4cpCëpL S4D* tudzdP߷R*aM”Ɛ2*z@ﺥkCo<ۆK~mN,I켛5%>}W-N(W鐑K !>!Vfu7-{o+2bog/$۵(HDV3414G*iJ* h+2TJYLQ-ʙƸJX(۫8 =Y־àwUNﺥ7 x3Sʼng?D <vN3*e.< `4ZZt 3xҺqr |p.PH2-yޘ{['9Mcʹ]⼿()!X&+SLL dH>0%ք>2Uno^2s f .ׁ[U.oohoukuwk.ƳNr6tO ` Ind02 0V@`ɚʔσ<,g a?wN $D&?@ ' C͚bf)d*%Ff2u?̢X# ۞ˆXV=67mCxCxvwow/c˻'oe̵oN? {;3~fnl a4\\]:DMcX־\w%C;οv)b{VMJ\WRT.R $ 𤔰C77e=rR}o~iQ\_!4]KC*7zg֬nέJ+" ηNZh䖴tlA.Q *aE՛Kд?eڶVCh +-Vѓq] .{-n-eN[3nt?2&e X\kJUZShrC&%2v8B97P ; DnάAJ kPf/Ӑ+hY%|>EPXˡb̈)iʚ-Y*ڄ27m}=ji3qklz2vo9C]VD·S O8 ZjBsz.3*Gl:#\&JnXʝ2%vpKd>.=ʖvg ѥV' (Hz}UD#k4ʔ)#1itm-޾{IQe6ώ3_z=Kg^ {v6桻;m͎"(ϗ8?vnA m\1a"Z6eaZ2BQ`XAeZ@3Y H@Knp:sbv9vͭ,3$eWf )emW2$#Ȉ7ΚmDf[g Tx!02<]=Ґ-ݶyUys?~e. ^uYs<ۆ^ ^Mel2E>|nĭl+,&o V!r; wVY˛i4š))t0idV3Y98.C.0# $Z0,wyARPE*eYT=ūė, .˦&[:Zu)3QNN sx)!̶+<:3t]϶ ]Eww'mkovaTnv2M4fM+Ζj`J6xl^R̍rְD$Y+伜!eA$u`2wٺKsiy:3"7YB@H4R\?*UTژBvF9;o'nZxCxC]V2}&1Z'dGNNǣ6hμz]wY_ gAtEEAg> 2tr>)SK3 $3ԫXAoqsBjDEMn.˺p_ڜYpsV\^5+wհ>ݝn-mqnRkk)h &r3#6zv` Zsetd#`@Aw[EtՐsT!SC[I+*Qz>$:Jʘ2Eɪ"dH-P&@" u0SH $tH),{Ñ DJȾ^V%``n}`Wv{;OϞ̩eekƳmhoǷә'yY93gmv)ڬm6vi6Y7+~Xf]6$3[IkpNP3h2 qoJ4En0R\@.jc^ESe @1SA֔̚ f"b:Kiq}kDgP[BPѵ4;c=Y2"м_[~iSn 0ޔWʚxCxCo8 ^S.+gf}Z#&x[׃C*Nv-徃ރ`gh1k8d07]U2i+`N[zZg\޹*.fV~rMjۖJ;!BBLE֢eP=@fH"{ ~BO3^=;# u%*Dѻ+-0.eD5r'%ػu5>cޫDy)͌½&y''w$&;84)Y!47̍haGɜZAV+ڰB_ FZe@TFؕ4s<=%#hB%$d 0+d.eJJ0L2RHP,3CWZ3ak99 )' QGjsyNZ.sJ\ޭ}e3,UTVN|)U<&1S*iPJ>BB*On=ٳG--Ca=aҿKvqOKn)1f(enO @>+xCxC+V=/gOu|䳻My4WSCvKQھ3&܅ӲsԢy4w`Qt5's6%NC# >מrFRow/:=y;zDЪIXO}&g_Og~Tu VYN!xKZ!"3 Q{Y :r)1 Q;!A0Ҷki3JΝ-3 ܮ.O:ʹLۮ=UD᪲uxWNjgУ嬨Oj~vㄾurYL=6RAݡ% `6TgZd.LFV.&o gfy>aTqܻ7{Gʬ_<`%;|qs>>s\.&S@1،xE נ2ҬDmKa $gev,,Tnry@-[ròmk ;ߝf(ٶm:,g*afMEp Wo;Z ksw`lXӘ0ېX?v>s)egGffje̬r{UgO~+X} ;WmO@[~/:2<VE}|w\|s%@}E"3DDf[KevAOiqy`+2fb)|,̲?"fɓM_/(Xx^鉓xCxCxf`U36.wPaU$OəmNiXMFS47`6t',`PLY#k͘AF'wy_{zl9:|-{ W)? g(9?,Ƌ}C,'5kMXJFe'͵^3{~RH̾6PIik''d;YxƮ?wX ^òaЛVkaLlknuwLwrjl11w0S.22a6J^ %jitE0smΞ/§cm7U^Pc> /;?_M+礓.)ʔ5+rw<#=Q2{5Iֵuj}R_]^Zzu&<3[SPPײfTKY\79747zoܳZkIM٘MImn1O_άRss"25vIF䀛l" vuZt47l^mϞM/ 7nE+jOߓл_ $*g" D9)DGh^`@S. `YuâuC0Jh}^W•e-[eO7647jwaB-\h߿l88:m#?[U`j`y3-₻Kgsay]pwR&)M#iH|y:#4~;_IC3o |gބ_g l ?i/XN(ALeDOdHYι-JɜKNe(1wpfC(B}xE#;ò&x~֔[t~"oF ,𰁕w ]- Mm:ӈvNIIps`\R$dl^i O\fւ5g͸"f\ݬyi4=?W-+; ſ U8 6?E7֒f2Lz֥X`SYT(4P9YR:=YB5SMnZ:}up+hsG/yw~zh~ֶnrfk&*Eod\74z6r"}Z˙U,'Gd@#m9+P}=s'5̬@afO+/}k*w~ K{>o^ cg"sZ^PTdAHW:թޑgG ˕tH}uX}ofL}{#Ixlgub7N'-~Rd67tG˩V87M5M#& xXVqr@oэ`Kߎp3яNj/~h0Mmj KMp=W z)/դfk;\^֭e[\gad$u$"[&5!01Cs@Y8?w'5"^7_6|nw2\iiK&q6~>b\z~Vkk4k4-'ݍw<׽36́㧀 _/qR}OB dF*gW"2˄fWP%H,iF[Yâʖ,fs+f0㠬|[wf\}[я^cxCxC'[+ ͻӑݺȣhKݰf}2,,mZluԕ&ɥ&gԤ$Fr2zui&7n`ho ''5B[zv, x0_+%' F ^/ (HO Z,5Yg*03U(=@NlhבX~/g f[AȺ+,><f]}RY W#]6MzC?m&ݻa{u@8eG&ZoZ[b5bP*qag3֤P/gGfF3ں=G̜p;/mgw/ځ;#l?K)@vv./dJa6ؕ9Wn)iǨ,^P[$f*:$}u)dHͼƹ(>&5,2xk$aߝ ^$\=m5rn)`ͥ]|rI3>6iB54T׼]Mi^F{L_~߻VNU̾\Sʌ@LZ̞U\Xԗ@r{ãŲfVPϴ>Zl_52eZtV4a?|>747t=(t ݽe~8uJ/oG] lk&NktL$j:JOXwPy32/GaF3ӳgԀ?g: |7܏ggma>](T_l`Qj.Rʞ9<ЉQe܂;#1WppяgO͛W䝧2^]:?򍶾<X!ad69sZʛܖ9wAs7#&*SE-2a]/=w?7wc?Cvw?qOݦkLZ&7kbs)kZ2́%+7ש#m+S$u f]ݺIlDzohouoݳn:Onz6̜Óٴ[M |ٟlKqhX@Mj0+p^MkFNun-;[w^~t}'>?^˻y/iS\Iv5.H@tfz0geOԼ< (18{d,\Y Ȟ]xk07747o?wrRl YQC*Fru <3N 7:Uh宄_|G9747Xwݵbkmݮ <,[EDKO d9wg󁕥Ynw ߀ovw;? L?Dy}Zʌ [s2{Tn#VPF3Q@)Hu 3D`6wa08{W&6s?xܧ9747Zw-OO!g^sRO}Y3xXܴMk@sOnTT&6ˎ fY ,vuRNO /*v~|[[4?|\SO?jT:+r^aJlՓ98Й1 9Ko9;9S39oS@tuwxCxCo$G)r:>jëm+W Y]9_G@)Fְ/{4W''t_"[OnhkIr3oVjLl%mw=;}<`b^g3;fW/`qЗ,6]mn\æg\΁͈ d5,Ue  xh%Ҿ?_z/p'>\f{ ifx؊UGd!:8SKqk8%l sZ :6<ޚ[uqp~~1z~;?_?(cݩC/e *h~)xP 쀗xˎMu3Qw7Vw;rs$gSbؘ[NHof1DN٬yr"4Չ ֭:dMj.M4??V ]-ګ4K槾8?%'> /gO~Bz(X# 32#Y;x\LXee UTaP4iksϼN0<^7.^羵}vIAgsn;2Ֆ*{d@7pk.k$kPelxeŘooM  W%/b _=c]%z X6Ա׺ps&xAGgbХVsy3Jɹ[oݥm[d> =I?Ȏf3Xl &u'Ը.c34qY'PW6/WMh``n=dF^ԶG)Qt5N`CW8rL9yrsgjmVDa8U ^>ubȺ`VC+N֓ݾQu~[[SN>?SOşxdJ#a<Œ99\+8Ut͖Qg^ʘʹz"f߹C^'80:~vkxy$RxCxC_k'u MLv6M2%mjSd}S <(gGc &[b \wu$i6Χ3 p3k򦛱{+$&̷R$G/:m~v;ii#օ{+̎\ԌyY+ lgft s'g uhSεLfvu0%Si3k=v'枅]3 nk}=|uiAxsnĆb#9ɖRޔdd@M664zu`ex5q oGoww/?xgǐ;xz)A=) iN4'sFG #{i[AqKe,P2 QʐmS0G=Oo e !>O+<>zgnwrz {rfsxfݬi &wl5 :jju M}6h|nMmZY.&K;Ͼp)[ O.>9#_De*:ʾ4cqsz 3Cs=ia):B;Hg8Kz݀ڽ#[}Mtֶ5rb4!؜湔1&'lkpu+q 6YO˰nn.78}>MCux\|~fsT{/}M?2*l^1Բ(zY _dvfIi Ϊ?uNK *v32I2"ԽFv[VnFߜ-++7"Gsoho^%| Mޗ}ɓi[L76gZkV9-3WՋ1Gm>j&`6ㄽJjw߷%ml|=_eGQ3 '+k\F-F"S^IPnWάջ L1wpVb^v3n].:Y3YMhȼ{l-WEeAL^;Sm`-5(綺< tx9>79s3yk+^wKI ?OfF& ,+B۝fqWMoJtUD!r&]PXbֲ'Sm[n,wdB}ux,~H dcޫ _69qlaycLM}_~W*eݻk.Y.V$U laFG.=r9-B em_ eږWzhnOI*77476?m"4i#X8MS+GrwOtM6*kW.likfFpy+_ʳ?{mJϠvm?i5?B|o~9r٠5|)Mdڶ%swUVR1,ƜDXR -Dh=|5׿y+Ľ80x>u )i按}rPfҽ1'&m\u+W7QuNM.ф`a#itsW";K P-o^Pkٝ?w2QL2!dԑJe2U IUgt jR3$tS0C93X3pa9 998^E7lsވc5-mIdm(4' *V aMf:8wyNC#*xN`N-046_' Z71i _J]."8\2"2lY aVkuwxU'.wj=wiٶyn3ݴm[*X9$ =6o[{yMlR3ds gSdN7Ev|v^JKT+-1|`aN֐et`u w>GcA$m wWO ~ߍ_!P? /ݛ?wIJ`R]ʬ 瀐@ C "*W7#;Bf$2, F3~Y9S/IyovVD;.&ttW Tx-q#S$sRCTaeMZrY& , D`NLZn" l`rxRDx =yݲ&Aj^V֜f|d Y[F$EtXMi gzSp.,ǃUDF3˯@M'o{׾Al3|n/xkrsB-IgXRf >xן3^J A%kRafugv5P=Z`p+\?GQ rrUB[Ͼug}fv:%6<͛ڼp1\Vloho}C]M x[ov4WQײ7.h>I-Q.EkOTВ-Wa Rڬ^DCL^+l4"`A3qO OI|_o;n<'p\g"j > ?0)|sГVWdsc*sqyd<"=yv\щٳG&UDTRܝGW,Fݭ1{*V VVk W3}Ø_)Iq4mfx6e{ ni +gCun4EoZViϯמn@+Y[`'npAѬGvۯx^~|EAp |7ոE8z q9i? aA@ڼt=9PUJe0LI@$2LD,0r`hc> Q:Tyt&G}Y:mm*99Tbn=Nyآ< 6bLJiV'>϶TsXx}N HB6Er љQtVe͖520k-+ui"jbkf\TXwl D6sct]fF f f0ZO䙻½wg>~sp8]Π~|16 ff IRP*Rf&L! _P=!1R$z^D0nH1f#60K xra7747o?r&_]^zM}.o߹= X:-([CNf^C1/jz.#O}iۇ>eAvŸszq:$TKT"!(3j>3ep%%+G!KBNed2* %.df&E(msVy5̗6Gz nYs֑wټLi]uȉFp\h cV}>ћQMK ܌M;*mN64$,G&# 0#E'lOdUito˰۩=ڧ9z/YBBՌ:7.YLAe"SB(8;@zdX2wI)3Be+sUfHwwTFf"O1ûG99,:ˢ.S܌=δmӃw0747bRs{=S'kvfG܏'tsӔg\Z6xXrqw 9CWڄ\k` =8EB= 7:jB0rtF(3T!U(H)D<)'ܶ2v;$%!T?*[R%h *A Jd9Cc){V! S+X.Y_u.n~ m]. :I)lȖTzdzn{yYZ'4;+yﲲ&f7nf-ϖ\{ydV+'&M6L#GgKi2n> =Ck2b-`f" 3U$eVF ;%KcoVS:E@ ,IdE>C(:@F&bzm.W@M_+zZ],*aL;R  عJt﫻[UlkJXq^o !NY?,kn^AMimm>Jz >ux5nTrhU钜 )XK 0[wV[l)cҹr)Y掀7FDe]L_Q˄pf1OZA5@xfy$;eDeYo`,'])SP?TY}P;twf]J}Rb[zA_X7xW5Ww _DN2LyiI-0B^}試,Z0Z , 0r̓L+[Wd T60zhvO;p\' Ytב ДJ2@pvAGFC CA%+R&!0tw-"SqUL8ܰr^+ϞϜ{isÞ8_wy֛7us)b Ѳ%ڲył4I&i˂-SyEd S8R֔]|bͩXd L4Txf1 Z,D.`&)`Q0#jw&" .1tA7+cZD0}sBӕm P=,;b am4gn"U7Sޜi5֦ euxJp[\NU?o3s8aaј˞G^ٹ&S4fDA 8DUO\uKvy0 u Jz-*@kuf﫻 Vyr&pEnohoKvly˛"H]ә8 3'm-mj-ajB\zA0j@: -Lv+ KYDmXx +.$6V} KA=S5rUZL@JR&ڊAeMkZ#v3~gxfow>1{ҦE9~^oi'Nd8ș:"E+NJfg8mU c Zyks Js U*_Le&IV*wT;j)*#CPTD/Ž~:SJ$P~ҕ>cWr~뺻6S{3wxCxC xyٍ27ӭͦpDnt<9ٓfflRBo)? =d\aMUv4:MF_u\S,!0ckK*&*% ť4Ա (\]^ )-ʤL$R!/ѳ}ص~f- =L-h=; Tz L͹ $&e澻;#m&3=ur<xCxCx*k^vUi3l 5dҬm[Mj4bۇ^5Ras4M4w V,ͬL˾hZ:`F-k*flUYfS*@[>IlI="zJ;Z#؛֔5D" %h2)=yLd-@ѲH ,>GȖR *Cw34= ׏s'afxY~^n´=fd43O`zkp$k;\z r#DaNYJX6VÞ"@3ԼʚK&%p[tfuL" Th"IKBVP91A&BpsRTFl)0\!mCȖdڷEnڇBq&<=hXտz\.lf#>7 y Mj01e[A'7w( ZOV]}\e˦amXvZɢ7ܗKm٣5PuQU)Ide!I,%ua@g, V_/3Y8d FVo@gd]2};xf3pPO'=.w7747X(e5 wš˳٦{fKi<>r)[:4zxfSGG7|^ݷ3eE &.ÊsNbj SDhݺR_]wd.M֩eEuXB K\zqVA $=춘"+r~] Coe.f#N>_[X'-I[zwht9\:||<^`.UK^Ӛ4 ƴC&΁'\^ּQһoW'P[_[wckrs&TN y= @ȔpJyvco=u;u2v};ogRkqw{;747x8]U[]^lGw7tF=ٜaRc4ĺJlW⬒T 7Z4YZFپ[e-no}d%G=sy<8ßFBե[ʘJ)$ '.]Ծ2`GTlfB٧HWshZ{vMRͻ~)s\{isWsw^ܽ-g =n=fdB/h ڷiI MmRc.6eՋT<*yڲV ŭiJ\fvj{%LE i}U` &U K.a );2[Vo/n)P W2r!`M]q*{wa)sPu\\f~C,E^YSNz%rmNB!)ȫUg1K_'MbQcځ6k^᥄,yOlWIJYߗ)\}i,bpLJEW'}إ*f`˖7XaGJ1Zt쎢8r7͞dyW^ ^y|'ry+[3o?<x5лMD5Zū||2肟|i%-4i]ɒdpe UBY,2!W@MZC]f ,Τ d*;S=v6vI é2 \WC,Л֎,eIṿ0>EEVLp&*\\usgudA,~G XJ0xzI/?4%i)ȱ"z谔"squLjuuuSoJCصMղEmN98!BtwNOJH]}>9e[y{SEM ْk_/ha&haH-ex$#&_i}%i.10j5r{~eWn7Z+suKIrx?Xb: SZG\:gRZd9Zf1/~a^+`zO/Bo-mzs,If[nW8/,o-s!@f@ᗾ Y󵤩-e4yO"s9 T^.N)Svr^r Э}W.~X/nmA]o'SgJ[KO<;{^? 8Wcfd*sVD!l~A0{YpKڥoᒲ^9s)s^L(,}ǠҗrҔY,ڕ)MҺ3a`$;6/ԃJ}>647Z.o-mCo-m^zU.Bynj|_zE$w}ݍfi-NMIz:y5XA%`UEz)hZ<jeX%T \s1lkhBu3[VO;tef꺬@0%֭+ki)fv}?sp.Pv)ZL\A'*L5/]<Ӕ5W̫Jy v)nohoq:.zWީOvcM̖}lIwUig+@Y73(9aۙ.J8;-_Jv n,0NU"ԭ&*S[ $gK]kҴ881nnji޵uU%SwmV7Yln!Gѻ=\CXZl_yɲն ʹnITvZ?wr+f+uْ[Ag,ۺAw*~7uslru*`_<Ӻ{$ۻ嶍; .>H*&g439lQN&W֛sЃt:鴪۱-$>v{,DIv߉%b<<#xcSPn#ID/L{cKs3)sƖlbf6izTxL|}λ Fۙbm7|8'4ힶ'IU杭me|$g4޹6vD7:Ie+l\wJYUtoؽ|a"vG-e<<#xS6EO~\UTdIa^W&[PSYRbf_?W& `8ni0,knM+!C34nIh&fuL$sEҾ\wX$sdk?e i؝2<<#xiohSRSڡ5h6&Tֆ0vImrD'Ie&rƧTz&TXoj뭩|S 89޶猅Ζ;f[|<<;xDoҼ,k[,/Jsj6HRnW6L{9yp3.MZ&M.5yD?4?ڟ;\\3t{q_N&ZY_&,uckڛ+{ENB ;P..0C쮿k(v6H@\74틞$ҵ,-q>W3SgdĺC8m(MlVu8ߕTf<79$LlqкϷlǭv׼W3 *Cx=D 7oLW $M^wt<<3x=IzA=Holh _5͢llo,θ:3 o,c}d(r \7˗utlskB<͍nVU.,]ơf7>bG@pы75zg;&|5Ok:̝ТM݆+ ڙZZ4Q_;E.\;7KᜰR4i{@żv~Eu3ᅥˡIRz.lL [\K_|<<907͍Mf #Xrk%IլvLNܢů,tW!riN ]<ՅM^w<<]f~ϛM ]#x xxMP>~|,!zC[(̗wƖC6!~S"wUf*7؎b[/z祾MB-''ٲ9pőK!tar(tO; }?퍅O}S_?!~Uhm@IPjfl.m(lqu8p"՗kq{B'I/B7%v;;W;xC{Iҋ^n-#?I_u$X02b:M]Ͷc,a(jIR/}|g>Yf.cC7SB76IYbG@;릻CbҼ\.{ܬohoC5%Q u^$iѧő{?|v;D.zM; CM{}S$_,w=C%"S80 ^G%}wͦsa$"7ȅ#wTw<<xF&I.ms?%l!n47?_$t1xSww(qSb8joN_NZPyʞȝ2=ik $̛?MF0x~=8M@Nء [q=i>v}$T8p{'p&tR(c"xJ Ԡv0l"G@)A'2z{}82IѦ#G@,;2C7{5MhM>=Ic=p>۸<<ڂIuSuG Ue~Z/efծݽnʪe䳎`0 ~бq `0o0 !x`0  ``0 C`07 `0 ``0 C`07 `0 `0o0 !x`0  ``0 `0o0 !x`0  ``0 C`07 `0 ``0 C`07 `0 `0o0 !x`0  ``0 `0o0 !x`0  ``0 C`07 `0 ``0 C`07 `0 `0o0 !x`0  ``0 `0o0 !x`0  ``0 C`07 `0 ``0 C`07 `0 `0o0 !x`0  ``0 `0o0 !x`0  ``0 C`07 `0 ``0 C`07 `0 `0o0 !x`0  `0 `0o0 !x`0  ``0 C`07 `0  ``0 C`07 `0 `0o0 !x`0  `0 `0o0 !x`0  ``0 C`07 `0  ``0 C`07 `0 `0o0 !x`0  `0 `ѥK0Ck\ϩT=Ui0o0ߧ8C% A{z~_m\!B )DľyMDpq!xཫiD8Gg`# xz3q{^y*~}/SWX<!_!x!x!x$poWJnp}`wü.o&uu $ |mǯ ܛ ۱1>}pޮ^w+]q >$c{{4܉GϽ ~J o7-*|g`,xнw~{m8$by/;{?·#(Dl7/3n0o}-toW侊ݛ̈́i[ ;W]a }߄oq!x=ୄXs /_(_= M$Q{+!xn˼.C(>s0;~:(r_4' ӊU77- *r}ܞFVVq{.??TK?Ž͕?x?҇v"x"x,O+w=3v5)/_uoG&| |@ԮIBw]䞻wv{<ܱ@Χ S~ލbu,ngYw34fNg۫  [~ݽ_g$xv˸+6WByE(!nVv$j+OMt鋋k7!nynKm};àNnVUsr{+{%KE} 7θ$xoK%sULr۶cʋgWvn;rtq*ng7c?&n2'7;Jl۞p>]npvWspR\sx~P;žX-ϝ"z i]]m>^BxЭ"gnM&z *tb$y;wyƓ(Q:UT1&})O*pSI0r┏-99 ߃vgzЈ8C=$tO]{jĄ~Нd[%nspd8NJr)F6-O0-_8<6ߓDh_q74chcG,7dƝ$~^{wVỿ;wn*|g`#v}l|+;:\}s%L M[u9vO\?OսN얮TvK=.zo ^sg>^BcC^ڙtWvRx9UoIv:/n*z u4MDoq!x@Sgl:xxW̳>PfBwiUtMĮ4[!Lb).OjWrp]?by|jKM:gBEvۺY:N~1œS}U&ss<:cƭ878~#8CR/u[n>a*t7'pXm Iл[;En Ϻ{k 5Z"Nآccwݽ-ory~$b@2\T\¸ _*|I7ٔ𭢷=QܽE&vEo`&xO-v0NM? V]l(RUnݶ8Q&%fJ$+= gd!|fƆ&4-'n&cӄ]KdUVq[o& uwz?Ֆ y䭗k3n0o.Iw?Dnp,v[HcOs_i%\ ]Sr"'"*WK;LZm)R ZNI˃OΜD ^S2]<Ax<Ǘ<-,!Znrt"nikδ?Ӕ6PƔkQK7S͋ dͮn(UvִNqwM~ŝ\Eoj:v{7*|3nK0xf[╧cWw;1ϼ;]q{+)Y& ^Lmٸf$i{4CL&)LpabwKlO la.!i@񦋵 Ew^`]I SӔkx=mqk7a-rvf86]4Kus&q'0R蜵i=wS;1'W].{S47glwq'o% x{ "_*zv/gU$z_2^/+"ɖ`8{K |ZGwlo adj( 7/SnmmNnZ&:a&k>.4|6E 㒿K* !l:rtuĀS[\]Ġv$ʖh-sql\>4Y`NW,Oi1 ']SzY*W-| ky^qN2ݝnwsxW_eYhsi |?;vwnw؝"O/m缘Ҧm"8)M599quulݬ%g4HU*iF[MY43 C8.Ryܵ SkኇRչϐfҎD& g&y/aJ&Xa1ӴVz#v]{ Lٛҗ0o]sC6iU^vQ-QkOtzgn|GE,}d:vzO^o77x/oR/Ƽg"ř_}pqno%vرfmuu2;[S^N"rL\m>,iQ}dp434Å록i)zKHfV S4 H0"Z/ YaOOLCiP,}U+ӕkOge KãN}wfS|3ѻ{ cuwo&vYNFM"y,v2xW3y2dl)h-L9pFt #NSy9cZ c:h1hJJ z_ {qZm n5  ,$S28ɠ&OhJ8Jd:4A7ސ"0,Ȅe -<`2 !@4ﱉ;~6a~zcxosx|S>UlJ 7mwʼr{;;crblw9)eI-a}3nSӪ.lqpM($ro4eDṆ1Ǎa˃h}3:"t^?}@%U2d$&ڻTP*d }Y 3.Eul.20늾IC7t'9"ڥzl)fP 8 +حB'O%vaiǛĮo L, o5c-^qT8j"Lapa(-0\$P%. 0@B$HjKKN^,!̵V3 c2M<IP H( )K$+% E@d .HKLPARGpazlzxF o;Iexl7f'1]<9ݶ>s?#38C^w xgwR Sl\[Fn_qUMykM['`U֯_n cMr[7Lzd#m <'5Mi4ȦF dKQ0&9'45 `1hrfdsfCd6211֖ @#蘰4a  Yn@6iXoDFZ3iBM4<&>)ip1`c [o4$'<7aw>ѼYb>uvc9-3^qm3/~c<m_>S /I;vw^y{LL9W'=퉭'أMsvn)Pimg !n&d9e3Y`؈Ԓp|/t;|:@6I `c"!Hk [M&&#a7tNtNpۘ7D$aN'&87tM2:`Sh0MZLVc.Otyjc.6N@iYqbm.}bh֦.޴*zK^/.;̫Yl$gsh@s546FL&6fD[`S̀ɀͦtrb[_6`hl.4.W47pMNIha naF+׵1& FKo F'34z*zqy3o=8}g;I= 7ww:se e¾"VPfvU T*v}2R Bd3ibm; Y N*t5њ;lShqll1[#r2ӆDh*ǵ|ashp iZ|ڿ5ŝݿ:BMi>МLL0: 6%tllpn3&'M9)otwS9d7ldzYL0czצ&P~,zH'o+wyg65.>š7g ynrwk(&wTގ۞'فc 7?mvD6ټ׹Ix$f\ƽH8 Ks3eihJ(5A(#yZ@$)R +K+¾\#ЏJ4Hy5>p$eL0 <=TH H%Hޠ`jJ3{Nh1;4OdxaB4{<2&)lhq#6| M'mKsӽSP6qNj˿Mҵ+6 7xÙ7_ngŽNvғd4_;z)}\gb&ۍbg0G6'jj1 U|"Zs1iIjV!rLFز6rN6؈15HH`6Ц|zZ3p2p%] rȦFc9VO|1ҬyyɁr{ԛ'Z4i"ӥf4FgsY9Os۞bnϞc[/>w+n]`0o3~;7<=/Dدp Ud镫۶f:Mj huFh,Ts]` %M4NvDR&d&#! $@ٔYF'IT,dN5t,,}Jav SQC1d]؞*v|?An-"^O7!KFᵝy)?κ5 n"kS91r^fƠ-GbG)ne+oGZ' ` NZZQߪ2 Iz\ lV95мrzf;jK`=(o d`k>­͚˃y5Weg3*1&#'7&XcA4x,jT4wkG49[̙0<&7-dн;<7Qm-73N;ǡ~f~Za}o3r_ 7xuwZ{᳝x+'y ܝ`67LƔ@MI 3UXAӄvE;eB`pH7+MD)h<`L%^M &gZ  mE_j7c@*tY٠{ RdE !IO 0T"\"+. FHKYD$`B: '42M3rhݽ[XZs@Z h0u˜u/'8]=x|'a1Lz0os{;q9!o] ,y:ӼFPf!fK 5"LMx6L5s"= J=vkRpFݛj 0 ­D$H­b?>i;&OCUY7[V:S2Z,&<̈́L02i2$҉*!2r DX_v$%<A C%zDzf} Br & #l1lOp{3tf&Mو ̫+- {M+*īDl,;S1q6i6wn&5af\ [)|sU`>7( )s3fLP8k3P.`)hev(T9ޖ@ ZzWR J\҇WqƄQ Z0d e3f@HF1bT$x4Tf(+E+D&-:, uЃӉ/9mw˾}5˻xmõ #>x[+^m_ުYp> iUaqђ.q;.5g DjA++Ggay7UߝLZp3ZѬȸ0ɫU!if0gߝEasgG5PQ>1Ws0IOv ^UxrY7D!pn62i5S';ec #Yj(pM&UtqhDet nI'WBk)Gc44F aU Q$PEj +qdLb q}x>eF@ I9tK1a,G(QSYy@) iDR# F{"D'@BN c3& .*Zu) JwmC3G[ssu;^oNNnlnlf<,57Ff\_7FKdk|'տt:V)w9fV #8i<f\2W '+ogӘn=` yzn:dfF;l?y;˫^^zˏW#7obk?흘 Ͷm݃s!!{;Ϥ /wjt 3NFSb4V/RVm lӅfΜ7ͪj@X- V6: 7r/rsK^7d *j,ˇښSjeZ#xa:(gJ0e`aJ$hHRTZ&dJ HdJ| re"nE>H.iґ-fKxxyL tjR5Y6+[I8L' l5i >8pr6@[Xџּ!7 yy>J ͸N.-#M {5z;K8$NM 0ҳ!j٘t I=&sgol&sHw`V R6YKAK9 2 Q=*e"vDUt35X*,}LSj# &B]2T9; ET4̄,YJ "p&2A:ZႥ$:\R8&3FKM$* 3f9)6г7XFliC [܋İ+/+pe0or[Ùs҃$:O,֛)Id~ RNLAFGi\VCNh&t(dbWn/h&{bQ4M*Y34@,樢B\h4Y *b٫u һH^<@R) )/{)"PyDd _%-4`lA(tl=*\ X*;{L-M@M\i W2Kw8Ib˫'Q6oŖG!`k輳[qhw7WdtXN1h%Bb--'`05L\"S.cQ T`a4D߶@N5ai2/a\ƉYKg^2Οq$KQʖ;xæ˻my D- J2.\mo6\`RU V-:i X%.dJ%iJ8HZ9N/uugZ$`Ε[%iB6iiޡ6װk_=s7G`aBzYdg`aI4 ɦiݍf٪it3"-͌H npɝ4Ep0MU49k*X [nKb^ czRzϽmZfjVcAI  @wNhwg&&1)`eǺCCj X5=0D,,IE@5%<5HGC.I(0Âhf) &W\( WJFOܨNr:py:װfDL|bÓ%tyyc \۴ibX}^Ùg,,4-aUHAe9d*GZ#i,)8r4ol.hVa.^9:.XՒ20Ï~͖ic*v$6? pp<3~f>?o_ՃW  dUT)-;*r bj}c~W_~4o0o՟y:.v^5o773ͻY_6`{-t[A&#QSœΰhrT~:#L#Xa˪t#J>N`*n Ykً?t;4PR[%?Eg'B>8C^K_ W^/{+,IْKLF1J]H\};[9Ks V% ]tt HAn54<`iEM\ "$R2 Ys91bӓ{6ӧk*?\ U^;_ w/_;wgNl*'Sc6d3[$ݳFXѲ6d2hini[>tȗ3XGBa2.fw&1: nTn kN\V | mrܟGq fs33 w,p~%zX E#[`zw73_}8_7TU՜iP UjRkQ PS.ՅhR.GĢ Ja@KS@ͭEj6wDO0i!4[t&Gm34:l^GlΟFF`~Ff7L|S$a5kj6Váɨ-EYF3i?Z,KLdh%乌#ҙd$:Tڜۑ[\_t N? M?On ]+|c|O?"w|DO //(b/O*ɤ)`E_C4@B&Y"W:dhH2 KܺR(p&-Rpe-U75*E˦L ި'5#6;|s+?n}VniGX™ضM<;ofpfdF3^i,0z,oe hS^VՖtX49Z4 r~l/vN-(7,bGsy~/vHg%| _te I pA#q?c142po??qo~.jz4-T], $t,kPfM:cINhftvHF ~;~2&ZX71UBKZ4 QV]0!g*LWZe0]3z&;&45v>N/cyy?Yrsz J1a8H$e lAHI9GӀ*`) GXuf2k,&Y7]4'ݠ* ?w 9?_l#>w '-w$xG7?O1ξf5YUFPג\&AV =Dôu@% <|h~{6OdOswory;xy+x'@7;g@wu?MLz2,".,YMM&[h4YWU޲gi_ Vѱ| 4-y;?O,oEbqu_ /Y !gwr[݌X05چ7Z:l1&`k苅 GA, F|ASxz!T+>n],1;_{Ͻ/_02,V:}/ \VEnfYҺNrrFLd+:sZl\BfpV0^`ڋKQU9C?t <=&ǟ~u&/*hO[R)i4uJD"u3j ΋vLX hJq錦 S\c`?,߯lX\՚E*:tH ӹLTrecA*}%t-&7e?P<+?sϽN*.":;wY7"8?~M7b:h7_J-mY}5 F[BɵBՄNZŚ)bEUR }Wy;r;rzw]p7&P+Зi+@UeNOK4&K%䲛p/vtc7ܺ:&'8<ޏzx?su>9d!!xwcR~v RVQSLW_T9jy <٢zӍB(:{GGep'//^<l/nͮVdOI}sG pm5g([03•Wgl-ϓ}9L5"aUi"0^v\QQNS6&_=;rz}>57xx?恼noܿҶhW.%dkQK뫛HCMZQ9m#V}:kt?+O#S Ӈ zl{şrm*˺XDZ9Ptj(P ^|Øn5K!2Y W΢f^/\SyJ >0VW73qJUKBLڇǦd^MUex2V̘pTUCJpXS` LKbm _/̗1Y53y\ Q|4gϰZݪ].~99 hl0ڊ`X Q/*_WM Ud,tr&Ͻ[v5yMcD?6?<W/kږpvr;>r"2DZdpXgiV8j6ke9?':U%~@;yϼ&ȵB")rռ7 YrK/iK^g#וD_ ihYjΣzFK`t,Oᓼ2;sܻ7OŮ3^+ @%t)cѓ/A9UajՂ ҌZN|U?۾X=v=qU}G#?lO=L1,WWSC&W<aNx gP9rcgl:8 }07xO84'7;?*`^m=jw9[}JEXVs/}xSZk KaVs>Gk>n K6s}[Eg?䶦? AY}e+ 9ԄSSh7^nM 4VI>&&I;jGXf2&."rf2csUceCq-e0Ǯfau%|ޯFl'y5­ƥMKV{c]T|-7/" FGs4OAN;۝ȉ9=5H"Ku [! zGe jpyw8R6# $E,'mܳ1RO."T{cU& dXM"C`lCؒU&ʓdf3V˓Moҋ7 gԇb<8әl[?{xͮ]LɈ wOPk/'@ !eaAKUXd T.e_w9ʀ|~4@G 2FΓ>~ 8s 4:-GEEթwx*\C̣p'`MWB~T <َ\E{LCVhƺO YX*?v~\D(,_$ew"O*Ա< 8~O% xtİZmmu7zփ\ ;r5Ǿߵ= ?̧ɩ\M̖Lc:rw4ȎYpi{ YQsspeʋ?p\ٝE`QLޮC+ߕ]['D{Ekky!f!xn؏;+vZۏ.w|kϙ^m/_pvg~ 8uU-/D)G(hL_V;voמ׽  |Hx<̎gm>}=] n˫<0* _uvyU{or' y8ՒpPG}Cwy7U"f%G F{)!\ gOe}'W zWqج83ssHji_-4$\ '![!xOt"n?M]*v>kEv']˙ތ!֧=6O~;{k >|'8èB`6F;\j%B]#-N5k^޻k9}MӫIJcI78]f׋WYKorrg8ٟ\W͑7)u+]8Z J"ķϦ8k78 p tqv{1l뺾)S"M%C. (p@8S.ng`}v7 ֪M?tZ]O׽TqB9 i=RK@}73@^>5Q0q^JȃE͈WG*EV{#OunyArh}ZÖ޻@'4g3ZP7`bzjFI)ӗ\rtUYB % 25A 9<R~]xuobJby .3 D^!zmpI֯$DLy2{sK/^;w!x/|N'.ǢVjNO[Nqi2!0DҨ`\G_mx&B.-{SRbF%y:=_.{]l!'޼އۨhy}7*w9W7'xCPJ2#6:`.8ڟ%?Zu$Sda:.X$C7m k~;!xWs.on> rIa,ed*ɬT TR5.mKQ !Q'Q./_ξ^"[x5ǫ6` ~x*^/oӭ(V[/UBĚdIs|ţ={)_y}xݏ2g=n}z{``𮘦W+3U}xyE*--qSIRXr"űq)\T!N-DE0)QE?q ??.ftA{]c|$v} ֡ҿ' x[7_#ʻ2KaA+WeMIQ kհ$2 g%2hTe2 7).,GaLZ[|~lS+67x<_uWu֗*)r~~|ui X~G."rVsKNJ$si[W2CN,Sr>w"[7':a[_GCm'߼P&RC @WiUcq\*lU dã&xK蓬@.ۤrmIl`]>]ޮWAK(-3PzJPh aA9@@J&eZ ].L*J8?}[9'įGgx._~]x?njqlPRFBBh/lK*3%<% T@&LXk?b, i|}+1Wz(B[oڙz].}xz%a |~v nd9;F_:,Wy̑zsK1U֧"Y*u6`,*KfF ehTFP̴G=_+ae~6sS߸&vǢ7'/ճg?V8Ur>G,!H %*,,*W˔X8RKd&j_Hu3ۉR $+ջF75FK`u`݉y /V}wFRɬ,dݥW^=xh Ͼ[ 39m6ufFmznʩ' Gf(. tRҸ,Y&-ME#&iFTSB$\)4P(s2A?9'06/7*sx 2j 8yWWwoo2>&W_oN^C>dT~- df5ϩ)C@d2ajC/J,@\gfE!Ð)1Kpm];seZCǝǢ$NI qۅͮ_ʣ%`ќͺ&fv&fN2f- 2!&eDu5%M 02(ҒLzXLHXfuXPp2PHwXsg+MpO]>>cQ>|Nxůz忹axMj{ 6wS -^y# 2 H]R~&,jOTTG+2MnJf)ijS M ,,E,`գ͹H|ZO 87xWŗ˟p)څ.D󝛚vbIī:!#- 1-03eʒTv!nB",H`01=`U-aZDR@ID03^<B' >[+}n?Oc,~3xÅ<"QwQ3\`y님 Usf_5 o˓YMPfD@BTtD"2ڡ\MP2GfZ,qKr2xEmid#-+9e3S!GJpG3Dˍ6M$b\:F_` _^tmδk&\ÚMLȂՂMWKMJX4IdM(A:LX:C= %K#}VE.즄LSj%)X`4A/տO>7XR 7_o ~ 9Pٿ8rn؇*E.P]wo!^'g5=E,,SFfhTkd ]Bz"@fgPLz$)xKO5Ehn#M"ZK T>4eh.ۤۗ:ND'۷bm07x|k;?n û镳&odi) [c74g9"% F(, F &M˨hʐDVqK2ɨ/'B"jV"L: c_~3;E U–G<pa§/A8+!-o0 Y7VAJT!HM.DGHW"!mwGfdDR!o4ddz{fzm,35UŔ;s5 )Lo=%a g<)fS,+gKa`A)-flhtCDwxz&-IH˔e BdD_:\T'6P@òIVmҌ?}0pe W1㫰8` .)q> |=z~kLYݓj$^Ȭ\]TKɼ`"ˌ* *BP!MeluzdgÕTr]!Ww,p:6|7sB%&j4fК^NW $2+ Ң I04&22ddª ffܝu(qY`;eZ1O2zd+&|wɦ\RcF`}5atM^L!Dž;C_~üS\aMYeddfBdZj H9"m K.M$)#!YiNh%H8 $L ݲ5K\h03/'>cXq{ut%n\#ÍgGN^z|=JrCBT"jss%E!-{zaMDɞB)d`JX#=/A:'TnHڬ67i!2k!UK%)&SLP}g>Ol?}1Oc#]A7#~g~Y,>ū%pZ^ma٥,qS P#f2n!CLI ˶^j/^ADFz{1ѳPJ)$"ꭥ'Mf{(P1 ÙCa,wPM8{(XM I 5L Ao|tjBRԼc930.oZL (yraz$)'n@KZ@ KkiLL2z0gYĸ(@3$1Vh7^ۗ?ӻgg<\vKzo&:<5YTt3oM&Y4ue6Qb7FKd" b5`&5x%tx&("jk+D)%,=S!+lW\cD%E ߙ<ܕy8eq-%TJGeTÞQ xZSZTd 8 ;ΡPNjȴNQdI-aP02]@#kydzW/}-B 4h!E&M̸hM?Ycx!x[WyMk!@3x9SA攱yc;M$$'"a-DLUwv5dzU?O?D3U6eҤXݼ A'3v_K}Ndd"Id3 #q2&Η˷Dd`^8Mei'8( fm+54 BCNyKlt,h8=3P͕Fϭ6:/i^W:75:UVP'a ws][[Xp DzQk'_O4'RP(nK1&CM LYob1oFB O]Ufx3d4T3,ѹN* f&:逛`v]'dw} D2p]Fwݐb]JX6&4JHkI[eNAa PZ)I]\biitNP&ƞJlC \LKB. 9j(9Z<6e}>`/}n3~J|;ߕ?Ov1>Mg0_5MWMy{dc˓M3޺`J W2ED6DJR5} aጦ.Cny#0d:"s=JP J@Px̐8XK[.1vbH QԒ"נ C .K\ A !2%%=Ð! &Ⱦ>1!;,oNy2!F;NzE<ZL)>ɼB8H`7s:jd{y<=y9^~{^͢W|G߼>_y4vk/8Fs'Wqs<])N34Yi"ɖ2RO=Gcp^:ɖ 2Eʺ>d L]TJI~Ȑ)uTgZ RBPZ#gϓ%uZ!L0DAUf1!c0!:qᙞ#=s8ڞ ɰR@=p'\cH,[G b[s;,%É&'ac l%G#xsRpٺK6.&غlI-lݚ0iqly*e|17RKpb ),шRA#HK#X:qPOǾ-f[2]4dk!Lh lEstzt.q~5˭VR搟nnC3FE:H 2-t&.g,mqC٧wʦ,<m$7#h&;=4 0?[գ~]ʜfYmҖ|vx×# r=^AʚoJy_?t Hz[i.^ s.C7圤3#DG:-hCE) cVj 'dw B1cR1-!pru}!ԕ(-G[$s%.#q<6D6P&יt!;90>:NcO q1$GPhԳ1 ‡0iI?0]2AԹz$hR9ݔG˶n78'U) uBτ_:3*i?}ח?N]r9Gs+m.{n^xҖ&NǩcΥb)Gͩ3SHKSK%M3 Z4n=E>Y|4e!Ѽ%}40 @,D-#{c}Nܤw!ױuMc?Ҕ]z)JsȄ8ʟ>BS0h[鑦DcD=a+'Rr]Υ!6{gNGʧfi-؍ 4F7&cMԤ.e>;N'*ӓ7LwU,JxŇ,kޗn?諽6=|ũeLYқ&]z }lxL4z M )z*fKf# jtKz50)!BS!u _GO["A-@.i4䐚3ȱYer{@\ FvY;B@)q2v!CKd}ҚK36e掐-Zf]tpt]]$r[|fr65il7fYg}$z43q.%&xtdhdѳӕpTKf6MʆkѤ4]\IS%LoL4$nȮd:Mi-Ѓ"xCvO? B:2ոpz^;Ҕ{ $]EwRE-Aˠ, `&3 H҂ROz$=n ݈pe\ןc$Feb$$¤0ZJ3vS1\1,CԳ@!ѓ-hv1lcN7W8ْiHЖ<}='7y@|]{h$7OSI=Sl 0ף kؗ'GS_Xc g5;;zh˽w4M̽;30w6Yxx #A5W%&oݝlBxZ9eTM6Y1.9кe1^ಶ0_GLj6[φn});-):7yvv6+Cs&n1PjTPe L-BqX+r\dhf#yl.MuAj@Ӯfm%}.Cn4l_-}g=(Wxo޹`&Mz/̮ؕbu8X^=0쮦$>G4ȓhmk PlR:}9 7{= n-ծ>&*6O0I3J7Nׯ<9hی:,]c%o7*lZEFij:^I[{{~(}tWW/Iz?n]vᏮⰮ{,A44]S9qZS]MBԷsr'cL\*Aͦϐm2E4]oe9v@^_Jk,µInK}mں[RD2i)sZᥦ;={מCz粛5UzdgްIIw%WPIzŃķ]J{TxC~[KFrdvĹ&]h|jԦ+2J nn݋Oc w鸟۲gXTv%W|h'=7~􎏺e <)]WMzzh_i]Uعrk): Ht7S)uUh \f1m+cn"|{{k0ZnضʠResגB}MuM2 5%}Mr'=xW!usٽMtIvkzMHv^^>w}ķqyMymkvjm/.ȉl:YɎg%lx͵-2e<[Sڹ6-m-eݺfhKv^.^ y[tu=]zQ? G><7~Rٕ^һť?/7>kO5I`\N|&7is@FL (S̷ʙ7I.<]=Zt.ͭ&r6ѵݫL,:x5>='] ([xCzp[|ħ{G {UZ.y}Z.l6MILx[{6jm>GR'|];$q k[ٱa>%MrNu,}:}?}{EcˮW[x-=`r[zŷIGշo&R9yuauo&x[E{w|;uV5 Z˳m`IbKӫtCv6K. N_n$wQvoiP +%C ]oon\w[~m]ڻOU؆`{e}yR۹Įʕ2N?Q^h_]{o/.O%K޾1y (?;ὫJ{ow7v(4ߓ-Uu[#7t+OZ)/]iKhp[n[ Íuv nܹ%gW6':ȮW-wM{7n^vEX~ !-.X/{]Bʣߕsݐqҹ6^2tJn 'n 5=FO3ѝKQOoսIv>JxE 1]]_'sON~b-g~s"Ð&<ܔ٬߻W =IRw \p<.wÞ^}#NM9~{w.MrwHu?JxE =gk.ueϻx/^v$&k*|)o7F]<r/__w[r[w4h7St~4ٕ^c 3a` ģP&Hk7xgko]bۄvJ^_nen^XSnIG] (?noM}x.MaO.7 CG Cl/^ޛzLr?/Mt%W{?L~wI\p~5_dy۹nsx@76%{$ʮWZxSzo{ kr}>ݖۛdvJ-EW+JxEx?P|o$xu2?';# kro$o1=?JxE 9 =]wuww:(ޅmrJxE = מK;.BKn"W -?'ѕ^s5E~W{{G\ (i{b{3+w0[Pܷn@~rW9~NB+(#%D2?(JxE3I",E (2nҤX"+^QWA|hQQ]EQxEQE ((JxEQEQ+(^QEQ(WEQ%((EQ%((EQE ((JxEQEQ+(^QEQ(WEQ%(WEQ%((EQE ((JxEQEQ+(^QEQ(WEQ(WEQ%((EQE ((JxEQEQ+(^QEQ(^QEQ(WEQ%((EQE ((JxEQEQ+(^QEQ+(^QEQ(WEQ%((EQE ((JxEQEQ+(JxEQEQ+(^QEQ(WEQ%((EQE ((JxEQE ((JxEQEQ+(^QEQ(WEQ%((EQE ((EQE ((JxEQEQ+(^QEQ(WEQ%((EQ%((EQE ((JxEQE$_KIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/splash_anim_04.png0000644000076500000000000011510112665102044024331 0ustar devwheel00000000000000PNG  IHDRjIDATx۳yމ=/sƑ@ $JF#5:x3f ;tg_Y[__8VFvxf"F,$( @7j}|֗;kWcΝP_Z|#%ahhhhhl\U%9ASz7Wm\?q k384744؟we|Boo^?F\{G;g!1κq |P{/Ϋx]'}`=0Y7Iw۸_u|]{wY&~xq֍no <>. fdORo/cyMHpu!On[-+x}=~V;1 # q֍no{1v }q@;m{O[~1z;l>/|?2g8> ~!wǁ& ^->xC|{ z?tnuxC^B&GAOt/޵仅›q|WߢY7x|EWw>uaGv[˧zk}<.~S{@x vs{w|^5o}c=~q֍no} W}=c;<1Eot|١p`u+| ;ՙ!wעz5< ~*nuxCnK{n y{؎!Q;Z3Bv}yvWO7:}[&w pwuz4Dm-{? q֍no t_l^w C-p[+=;.`[|͓}qƍǭx%N6Eivswm_swns|N/շouzy@wݣ w.y[\\ǀ[*+7~fzl9ɯ;/G_y|S9Cwf8}7B |?荳nuxCOxv !w hr[ ٙ'Pz=@n1o|/}f8=>쑕\my.pqzp; .Yٕ65. |<ŵ\;~B;q֍no _!nݭ햯̟!`3߶cw=rwWʽSSng9\r{lYoLǀq<|wMl6b.|vpn߳s,;u{#q֍no==Q;tuϜi4wUV^9z>n\ ʍSc&=n5ˁ۫Z@0'Vgv\`=as߷ãs;Jq /zpƩT'v{aCmWczq֍no==/rC՝Ɩod{~4A˧*bSww 泇ڜZQrȦ V\wgu, L,{(sxٜXm8C蛢CG!Oab[`ߥt:_oιX-{/\1>0荳nuxCxvֶ<ݽض' ֕u::yKMtއ)Ko ]ƺn\ܫ}˷c֜]c fܪ^9|ŶZ[MlKk~ʮv/]p,B]]i|?@0y|2g8K{GlsO10g9jk%LSEt1%4;tH3(kULڶ8Mځ,"vѼ< p.&4>&I+!f)iJEdɣ 2Њ]B=׉//z=vl]\j՘ڜ!v8OiiFp]—Wj-(Z-v&d oK4esnd: 2JtkRkXŘ83ؒ&eo榔X* Ocj FdLCv2 s(ݗ9>mLjh- Inz_)̪,\};V?xJkgpx [__xOToV`Nwڼ"Cwy4f:9fZ@I-tHN*\djJLiD*lU+H#3k`5VU,Ŷ'E敥Dy^f:EGMl&S+??1<8/t<ݏ'm9W.mb٫_xwzv=<\`w}|&ص0|apʌҦDTVC6PI.\H}6 I(ъh4zH*Q.@fL>Gth߅4S9<`2V&,]@@UZ)DCZ0T4'(*A2EiIdO)2spGL<*`{deNObBk7m{TC=7G^?Xz⁽zvI|Dhshh4XHn_}~.lݱ˳k\G,[Av%Q*-itOq.f Xp/ piȒrr{FF,i8ňtXFyRU< }`l֞$%[d™ \' %dPZdx4eU* $}}+jQN2u^-ڞ‘(mo΅i޽Yۂ,5]o7w_l0 šo\waw.vymv'sv 6aW2YRae3dBg4(-记ݵ˖Sdrh'Lh&acfj.nA"7 ܃O&iAO3 F$[&D3&*@w~<@R&@yoy7zPd D4&y"&̢$'LOKc0M*L*33=e_2 2-Ռ jԺʂ- q'vXunO\_1WZdsYey psM~7zDryCCxCÙ-o_2e%o=Mn㔫折<Ȥ-v#^ͭ(Hԉ 4<-, "`p gy)MކL4 hGY:`Htvn`r RKIa _yA-rHP"3-Ad0DJPӪ1`'l zP`d'`02VQ ,)zz'VV(\@Xmt8ɜmΒ vq.Q,+Xv`i;kIYEK+j.dt|4s7DqLm܊ ly3i&0AM2a_=stld^ W[vP{HH쫁(%B*}HH)RhZ' \'RHrP(,LX$ 1lFaaR*C)@o`+qu<̓=e)gq3"&'ٮn]VHN$ ƕ&VF, (&#'Nt99(Nr/F(t`6(+'8Ƣb@Nϑʙ2J1KO3tsKGz1Ϝ,N[ed4SdTI/++K6.-00N>">}so ~ bCC =摻Zɜ˲U'69 cZ,<'qέHnVb;Erbbt\KuH4rx,2IpC+6Ӽ\`s2КE2+50}(%@]۟@@2mTUmi./ºVSƆ[k[׀6S_tho}ӣw]N&x3')>d(s_ "jqKRѪm\,3=)T [—(lm0WC֠'7m:m{x>}qcrk`_oK73Gxsho8]g[{랿[6VPblCzX{)Y.+<܌^ *2 z,i4HɕV@҈V0eiqGLB 3`9=Fi ij!N^fqLk[R&hZlE+LH[C:+,iiH)K&R 0,ԭ!0C2J\ZAz=Q@0`Hrszyz"Hj=K"@Jm*d̒)gn]m [.yv.V'y.xcГM^4v {:w_ܝֳaJu 1׾_lnz\b1A'4z)̢ }qqc`g0&rᖆmXk_H7:-֙wGڲ66c۲n"@kpRV-=ޏN*'5"VWI.Y:el 2 " CL&$`00ii vq4 T^Ҁ+jei}tm:I!%1/aj LgR3THR#` JS$sЦ!Lb+&U(2 Kܫ*4!«2DIK&.Osj<2%.\ ` )VzܜN;:X,a8-I\DIcYz8Fj͉l$gz`3e Nl(ހ dIrV ؖZ5 }&Wl$R in@iN )&xI &3[Zڮւy& p&^P /1e£8j}c"؜* *-r+7E{ȏp-ysopholwg^'~l,]QUNP bJ&%UHb`%*in>wgq'dttDq8 {*<(Oۈͭܞ`p riAhkK`A|L"NT&\wK|]|l>Z3CZPڂ$X"ÐLE`ucP,EJ߅% yCa*̶0= a!UsT lp&Xa>lUSC0dsyYJiU8ʫ ̫vq\nnom}$Ǫ')$g[vj*a;­t1annb@ g7Y(eqxͭI+t4g{ص- &:̈I+m4X 4|=Kn֧l=JYeoB `S;qWoO|֔]M2h, MauAK(Aq*%6g&G-UQR:'&$P݀ȶQ1Pp$=ia+jX7&3`v˃< r5B p^au6'"$r:%F)IrQܺϭ`67j1]FJC Ce(9<н@-(T@78 D'I:ͼ8eNSk2]f`/\mlZ)L@D$ JM%P RL bYc BKCwJ,J2bTx)RLo5waM܊+np+51BCxCYA8ڠh X2=iuZZI*F/` $h&YsG 3-}wY<IƥA4;c u;Zъ_k us>'OE:t|F|B'>=w؟\q]XmoZ(tn2k.Y@ɞڴLOY 9 ,sׂjgkÁ;vu8c?F o|?SuPaϿ뢁{"ZE"hR(zhR R+1IYR)&[YRtK)-9^t$-a-|3噜Rvm.ʓ-3N"Wۗy s'4@5mjw&`Q:nIuLJ;Sd{L{Emɫ%EX@76۲sϴr5/z%CKF> k{ `AQ1B^brhy4\^|/ݹG'VhvWsi/赚ݛ?vOL#@,W?c^Xh(6-FƖ[-m~7!%ӭW3)&9AgP;|G3qpڀbg;G_۠ 򔢙̌saptۡצ4^ ۄ钵C0d.%(a1]%YZe%N[#ΥGwW?.KX"Y"@YĔ3]L~ O;ڄiiiVF-q }Xlz_},al3wlY5б~SO珀=Gc2BYw>+_J-/Ikf2g_)4a˿Rɋ䂙Joivrd k2EIlkJhqҮМފYGC{ =VZ xs:Uu#,=Ų=|گUhLim2%p " mP,VrGjÚ@P_zsqo]ʋ_j_\sswW7p}y゗3wƏEs?LVo~[Ѯ˘LXll8(&2K@&m dXN*4-e_ !i$l ֌4CE,<^Ɗqqq.̧+su2 {-?߿&lnڵ&y&e+&BZJBcksH gNm{5Gs&66gҼٲ٠Lւu-+_+bځͺAC3?|zp#wq.o){ր8јR}OlKemJ`Apɶ5Ym`LAR,`. BX c$s' :V ^bN$d6k_<ޡj͚X&ww*>ELחSO5c o)G*3ZɣEFm \۞V6{-la='wZiK!wc>Yj >&u@G?.9gGs*ϝ{U%Q{k[YZ2XG7DC.,E,$}k×A{:_t*5WFnoho}9yokSWbԊYdjrP4O]&-NS-6*i+7|fTbhoh]D*Rlkڐpzo?ZOӚ[Њ!.S잮A96Fo.7N?tuKs}ZBKxs_?)o1y6__>6F>?)ע ]Vi0kՙe@kCHk4 4o87@fC:+uzϦw[ٶ ݠGwc]]I1 )V5|xUaV4ՍmVÛ-Lٷ۾ u@7aj} iރ[g΀EX:̀?}<mU|ӳ^ݻֆߜ^>=Iӧw kY AF@zXs}RjSW$cw[ 7ͻ*Oq:j6?3|;;6E2o,ͨυn9>[0Ծll S۫g]0u>3ݕ^OQ }~ӄxqJ$K_R sz(0ͺ3?wp3âyܪe&tnC/y͕Қ0447YoEu;ĦkYcƈ-N&{n}/L0֜Z|(+>Zlq#mQ@;ƍF3!`_xp=A-q{^@ v9/Vh-qXxُ4cn[%~2_Wx-c (S2/vC LU# Wrz46'- Nۜސ}ųq0V,vi&IMTIU-O'3ROHZ*5 50VvO]m^~0x9*'YKO8w\ۗW`,j 찶~ƺE2zu&԰vp{/f(K".'y0NAa &\o  -b}Mk,>?ضtPv; ߋiaq|T/T VnP=d˫狡\]Vz kO=g6π>7] (Z< ۅ3M [h`j9<Z ƶFqc-՛}r}ps;nwgW܇,ֺgt~=JS]j33wSõ++FY~qADc=^Mp.nndTǭ ٚ0447t۶,p+ІZ3Qo!? ~hɱ~lnLC jn9B&ƆǷ9K][ [.N^ Z@ he]kBКۚP!}^(,Ҁnd: [v^j)op`mڻb>*Cpr؏w yCpG L%,diP7.m۰ZpЃg <(PYg*5=[ 0 7=8[r]Z҄k,d|q{g^$maiToe=mοb)0mO'9_-GE+τvB/>w9o}sǧ`fBo[?]ߖ\m<1Ng]lK/ }澼CEyf)VM跇Ø։ЏÐޟ|O{CWgOlwy#@gBs~Q_ ewڇS\nZn /. hC.&E>S3ihoףhk;|=@*Gn)־p 1 ,6kWnpwx |4ؽ]-'?xHaaJ%]z(Ȱ=ox(Un+ۓAU7۟ !7L;kՃ7hlrX~`?=[$O+rViuEƻ m@.&ӨcuÏ[o^+_,?`~XW >\oIn8•!u˜3߅1 [:+ݞ8k5>^avq7׊ǵʯr|tŇ-]|ntaJa^7lbɧア"29Ïx}#[ ,AIk_/L}Jx6/wC}]g G*So^؃ڵ|Ƅǽ,y:[')~p. 5/jt 9 ß]x^x[^P?z(c|sFHQs1ǝT{npnCCxC?2,n<.OqfLo/eht,ʇD…d~mw&Tm6O<L %[b~vͪ! R@ML=)-U)6ssohzO^ruMnchmO-uw]td5'BsyWO' 8o(;E 0`}2&Lj;p{{Xe_o`-vE-(3!.n<5U pƺ? o^CX Ɏܝ,w7qPŏv0z7kלٮZRMGC<۠iyLG03JO@>]=k >pnJᐲD";)Vޘځ'}BN-nnR wLECA'чjk]ݖZsgˋ Eh-Tt]+V/H =9^}RǮEF e2N}]B6%HIfJoNG2Wnnzӯ&$J2;D5p, {> ؚpx h+a-0˴9!j?Aʝ[*8%(wnkYχ/ry?TxǾgZ\xf[rE.7'B%LqFV ]zT|^갠߼%N'W_xgcww<^ldz-(*[8يL;|yBiKXW#pso}hKÙy?pyg~d`ovK$$Z@)e7I,U=9;땛tE>| zp]<~NztQƱc *K(=,O-' P2w%-ҥ4w?v-3|8^?87݋^Kd. e)0EpTcR;gVTԟLk/W6E׾}|tohoUY=xdJ8F1;@Tzfc ܜ>^QZ_S 產졶4- ,9w<~wf[*nɚ{^k\㒦*kTv-MQ .aWTuym  =rb٩\ɣ0TkpZSUg.9"LJJy! Vb3si_u( [p:rx~ܓ32=Pۿ}nFm[cfLdВkO]j>Es>7nCxCa~xʶlTBj!sW"f7,rpRB-'~roFy|WC_4 h3aanϾkCjR iRP 璿#$d/l}$&20mڇ01xUz/Հ},<{A[23J+u'RbfZ:I)].d\2! %JH2L68Ƞt7^G=FC;o|eL`ZwS IEAk{MIAeZfs{q_Ba-\]+{-D]h:;[ z8zԊ0;%294;&v>(][H\brd$bsDóqͶt~BBH|L;U< wxw}ZulTR)ٮeW$lhaTZզ!Әaj,u)JVh.zc:נ;D<}_&P BK&&h"%ֆlE.l++[KB"{#G-&K%Z^){Ȗb/uא'-K|pv /?T[~o  TB3)D VIkpHZUVJhew}oiOIbyi^"9Pz2ZZ.{kR6veU}uʼ"`l=o'f R`Rjw-VOTыQ"g! ҈.5Bӑ5!Ɍ쥁 doOuqyoaܾo>G8z}w_ޒl`S&"MRBB.wG)VhM^!kLYSC!:J88;_{ڀГf2_]/_OKV"l a/y9X^"?:npyM9kn=n U~vr=Ͼ֝e:!\Z>" 1{'$B3uT<πE֠`څ+#۔E8GB8Pk64Z^[Zϋo,(Y٧,3(WE$5KjFkaZyB&<T Q]\L>vΨ zځw*g:;r _~_D}|z[o|7%e%}h./{-O.00@mYԒ|9ViB@ seX{h4m|=+4_zϺi郇CKf\(E*siVE}(tZ֓l* )3Ht>_=5 _+[wC^oh<M̚?\?_vP0"rEb12ظ6&ARx[#g#k,&&ƔvjӼ}fu ю0^U%z\ɥty l:ŋb2JpvjbXaA{iQ%h`"C40pVnJO ՛!3Ғ$" `%%&3M`+~O]}4[8k![SU_iaa;>t][vM/R//W߻Jw2"\őj!ZݠG DJDo@O,L\AE2\ 90;I%pSmpg$z&oaq\ }z)֗'y[v)R(KJaQzl+Hi"A3!2Ҁh&UHghH( C2`h]DC Z5~oW~)Lr`w\x7#<[c ~ċ}Vw;> `|@h8>`RۿƩŨLdOxzGCBʚl fH%3eA"=|h+"}z4%Xd'ˬHdeWl0uZ(<=8$ڎoڔ0;:{7C_-A{:ntqšӆҪnsŭ9k' Ĕ`ȓB,t³Y[4eLh`L2Sf})IS9HUX;=߽?\ .u?¯e)>'1<^34q1H\^^rr_CƿojY@H m : T),u-?dҪZe1}!ڞ<-]VMՑ %}+z-$Lwe+GMWnCxC{zG>V kfus)V@3Lf8FyfLaED+:Z?$FZtS!Ô2ت!HcZp)P"P$6P |_t]CY 8Z=]\w P8K?ǐXa6:-?py~}~k5 IzX*ٖh[7h2Cn`[R`H'iZ5ݤDI* SIN+EB)Xy+3DTr~g휕v^9 ߌE1sCN-! WA|s2_ߗ{e*C-C)D"z ٪)kc`h =-B݂3 DZ)2̬dd BD@E۵2WU9vt<7@847/Ca*θ)i\ WK Eb1E _%E[4'SZz"(>;#&JTјZlGY 3=( =@:{;?7XAh0k%`K0p$ 8^a} ?߅w| Q@8/?oI4}VXidRRm]r fD_6l%łHXM2R XdE)i59Q'Tdmzޢ3=DRLەVTުpV9ms*o_{F͡tٛØgLpT>_2U 5ٲr噖2,S"&L}4=ЃvsrwRL3Hgf“HKCZkPH!QH j` ~ɝ/l>5ؼ$Nu-yӁk!v+0|e9p CQA\ºdj{|9Y˿?ߗ2%V6F-ЦfQaUh T=&I jz +#cb"id(Jd׮h*kUj+:X)\dm5IefB.z_M]w~ׄ)yq֌+ӥ4Wtβuœ#ަ(D;ۢ5]`iTK0I , 2x ӃN H<]|SioCK(9% ʝ{k|~_rt +t V2& y8[~JRQT@ @Y# 2`!S&3-T!m^JxiY Biٵ-Lr> 7VwK`hwY_rޛުRɎ.TWM\Xom씥P""J(gRIOC(D]LfXzkәL0i%*0瑁E kbEҞO7Ľr >{s|Ys~ݻ?ޘۃ; 췮mLR_)TbJѝ[RUPf4يXT&H~7sFjRR=nj"v]2k6x2Ym4*!  I]n0!`[ ٙ)ZX6'h|`o`uSkƒSwek%9ӍOK:# P3K$-2T9ɒi3Q&U1I&@AQzq0 ID/tX,~_?k~#w|Z8akAp{Aȓ; B~?ykWWeMvFbe!}kDmd+Me8U3R- ټr!lURPݮEYu-cՌ)vQg(iֲӍl |u}%CCxCHeyJ<K=Re@7ˉ2%$-i&r6CV= ÕLZT)ddt1eLS`ol9 FP(ѐ d8Hh}܈(K"]|䕓/^ŋ֧hC'w܇:y㨰^̿r[&R_&:–BJ̀MLD΀2`-I (Ew(><Xd\NMe.XjLHNj3W-w߅?[Ww|CxCM/0YcK V=mbs;VxPwJYBS 5UJHTN&y-YKЂIeB%X%ML+UTaj &Q4Q$H}: rKF46 хL B~?y.><n7DM7|ͧo%DFLH.H(2D2TL!TvUPՔ*I H,2ƒl!O*DD0uTlmڮ~^6{T*`7nnߢYagC€{W/\o}{O\Rj!OBt:x$E& J=kIH$b+7i!X) QrlcIC2*m}E$5^2m{'urn^oo>ynTܪ&+5sfE3ݷܩ>7Vl>47$CʐGˤT"@pٔ ez ^jiSH&,,S2aTQKf2-ڦ R2۵X;:|+K&uߡ.zye]i:*^/RS -EMB=a3\bM^5⑬g:B 1hi$JA$e`)hTZ A-fMLH)]4 3a W/L[~@OIǔ &72omuR[JF@j[R~A 2Zc”Va-Ӈ-#S^[oךYî̌CjIKe-RdJ `Q2UMTY$,tVY0m&q3r%{NOmaup;c a>?l<ƌ]>fx gʦKmZX3Vssymi( V@I:Ey(L#%0 a^`( E* :!A )d $d>Aс4̓Z7M!pewlci$8~+M$slCmI?aa\Tu:%@!!"Ź C5DВچJ+($m ,[E0XifY"s1Bٓ^Aa iS˲R} G=Tv:O~4T(Nג8Z|.mjTsӗ<3-"AELDu֞$D.ˑeYz޿@::)R2њ5쑤&2a__HAMiJEEEFp?{`@qK3 K;/"1YtQC0_E'|ZteG=fc*C7lj}$-o0tɤ1-t=0eԺb\k7Bǔg8ii[6 dk ֗sԗg(J=F+,ځ#hnfngϞCW]>k#T.lvz!6F/ML~(^װj^WU9(aB{HJy/5e(!( Q肇`4! sc;̆BQ 3 ṋG G-G鍨д.F#d0"8qU DvH=(&B]c t8ut3}"Jt#h2l,3l̻}ي24&^N[+{M@nMgy~o)$|j@wĕ5yGDU>.X/|JsIUI@x7Xpiv 5qFpLm*,pjNz2HEQQ K6fKЊYP;r<0ְ‡n( djs\rqX[XIp 1ZTarh#i,_ _en&FE qYj#(E *̚F3m}Y3b;+;ev(R U #l֮l^P9uh7әWU}Ǟ?!әG$wo7_yzvzg,Ns5uzMV䌪΀:E\f!WЄteC {`d zX~zH嵀FhHk@4F j"6!v:&c(u-`5]dIش!4$0u-&NavNNӣa|ǿcgaXC5h*NzcbK yf/ Q,a`F`< EkE&2 W#}Yf+|P:\tfd|+o?CZİEbW< U]1}XLBBbD\ tL\ujtR[qMAЭW:"&ui@fcX8P*)X>T¡B8rc"8C4FanFhpKlbe 8&0kj?홖34D #uy/ #c} f`GYQ %& X&"چNMD=Qh2I͓ d`Mj#\iw+ۇ_ /]%)Қkon^pWy] }5鏏zl6H.I%?| } WgϡWQVkQhrhNm\Hmbٰ 'Em㦘̼Gpu %;X4X7D4VT RjqBuEc)qT;-}#X4A ٍ: lRIJ4of7p7+S`$Wz4G$6L6N0F<8H1]%daEDwp6YhP' aމ(,Bp*#F:9؈hU5ڄ\ NW(g?>.G/Fu)k:3+4$V{󯾹yۯGҷtɺwͥVgi v+toT( 0\dY+@E1zA}L1kћGM` gNc5!f ]a `ТaF@jF0꠺Nhhcc8KhmFh)4 t`,2--Qh#thƱ5Fvna0jDvniBnbNB[eYiC¢yZhCdW(np!۾% otwI /`,˱n3ۺv4Sv\MM]o\ޢ5ڣt \=XɎI(Yu(0FSfC|P7 D wSl،ԨЄzzٍfMPרI btաbD4i!4}w=LCʻ|\3Ag[Qxq#Ym uKYr}1\ת!dMؠ.1`T_ln0~veoA|_ v %{H^< bFz7;S*x֬&dmQ& /(Boҫ]X2i"+HdB(n!e9 Cuk\vƔ|{EwC~23\1|ô4 N>`"LLTDVEbv`aNnpmPܢtiݬH.۟u^ewnWCv.4ɹ ٍ#$AVi&\"7=y%ŸgZsHo#]o{.y ޸&rӧ8g]]s5]?ˮ* F3k1X{F7qT V~oB]!\s8n֖mtt bVly.MGǺu5#Kޚ/N[*?OBYY6*6f1SPFX]GagaشІ -b"glܢH5yIz ٍtɹFwO}I /ɸMa90Ne"<<^6q~#JH5vTzNت`٩ˆMP@'.[E1o  G ]NzɇĂ% yij'}.6ZMm 9""uDRq2-v32vy_Ȁ|=c$e7"D݄Aݜ1%ż 6r`Ho:}q Y_z":"mi?"jɼCf Ve{|CSv~.OHq"]뛰&l0!|+\O)lQOZEw갃&nGA5Ne7^g!$/cW`[#=x<3'alLk1os`c:Ks4ӹ9FoksϴFJXY#5Z[%E㬮ՠ #BxO)^K>Vx޿ۛS|>Dzh|\دwWgk77~* lFQ`4@]d\JOJOs) W_-8_5DxE*nK\֋̺>u β~ou Kt[Ew!"vfե*Uz~Fg;vCglV`? v>:7~uqz۫Qy[~ʭmlQi8׸l }V]wIqȫH}>^\+-Xc`c%^|g#^K~H}no|F{OTziS=-kԧno 0^V }|%>g  =t{lNAY;gmDp>]m!.WZ'{` Kvq*_*WoyG.ou)S>`o}wW~*U|n1x<*~~K6m;%8;]1-wXgk'Qn-Pn.fwLEUOC%Fe|` 1=VK%)s}D|?{wNs}b^ݝ-?h$uO]N#)ὢEPWvs-7^ޖj`ʷ;-+:DaU7*S%_ܼs] /I%Kx*O]?{T~'Q=-C"ndw{_]ooU8=[w䮶Ee95[$+:_-eBKlriNeX囫Y*TxwITt,'[%$[t?RxI /뿻Y! }8t{|9}L Nv*7?>xΫ*?y_.gv7/.&n{/TGtxyۢ{Cro⃢:`^^9һK|f"U~a_]galW8!S #w/7/.u*7^{rq,h%5EY.OEwV_qvCtIv)$D/ڻ-tߩ &~Sxu^LYM`wr:ϝ[vʩVէߍHչ˿^=>Dv~T٥^C VOn=?U~ !_"|og}C(;C|}F.VCloJo;'$K%){&><~}ќo>'mÃ/xn!dw~٥^c޸7xm}x TmW՛v[nXҔ-\WtH'] /I%?>Bzۮ Ώ2Wϐm!Ьr/N"? {/'wEKRxɏ-I|_O `3y>D򞢔b!r^O.^K~ }&Oy~'g>}&SvC옟RxI /){}SMp}>{Y.ZxA|"/_y[J}>QL9:K%)$$=~K% 5߂guO:i~vԏ?]%I /H~#3)$$9g?'!^)O.$)$ߤؒ$$7I1E$)$EJK%I$U$I$)$I$I%I$I /I$IRxI$IK$I^$I$I$$I$I$$I$)$I$I%I$I /I$IRxI$IK$I^$I$I^$I$I$$I$)$I$I%I$I /I$IRxI$IK$I^$IK$I^$I$I$$I$)$I$I%I$I /I$IRxI$IK$IRxI$IK$I^$I$I$$I$)$I$I%I$I /I$IRxI$I /I$IRxI$IK$I^$I$I$$I$)$I$I%I$I /I$I%I$I /I$IRxI$IK$I^$I$I$$I$)$I$I%I$)$I$I%I$I /I$IRxI$IK$I^$I$I$$I$)$I$$I$)$I$I%I$I /I$IRxI$IK$I^$I$I$$I$I$$I$)$I$)HIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/splash_anim_05.png0000644000076500000000000011623112665102044024337 0ustar devwheel00000000000000PNG  IHDRj`IDATxٓlyމ=~+jOgLb R$(1jZ--;CajW" RK-,I (@gCUe}_|\Uj}pA$*keV:/w$ IS044444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444474444447444447444444744444474444447444444744444474444447444444744444474444474444447444444744444474444447444444744444474444447444444744444744444474444447444444744444474444447444444744444vT)wX8L|jdp"|?|Ͽ_x~r^gZk7Unɹ {o݀ 97474ݳ~=W02>}7X?/B?#D 0nBm<|!tO݄|W UȽU|VZ'~#~?% ·$^w/{mC{ܓvȮ YMp?'>]zE^<<#~J _x MAooho;>tork8- j[Su0{toU^k]Q> |G'd7747~د{V=+]9ip}.p5OCk?o&= O|xCxx? |-WËvܞ }V=ٽ~y^x~C=n]:uv^Rs:- |]{~M l hjkd7@)t9Nuri[7B> z%ޯo|V'Anynȉ= l_hVpۨ;[Vo8ٞ9<ͭ<&,zs]!̷9g߷a xpKepzxCxxO=躳M[n=ro`Xs3N.=wFo~k{.'nLݥC-[@oug޻  tk7‹><•7nRyCNj;WsogpnoKpo|P]k 9^S] . z^z3&{77473]Ի j~t V wq3y#6O=?~uMzס-.tX0nBׁobz¯ ^~ hWw+3~77747MCÚYy?_9- rPeQN][d~\p1=\z:f`9k|gJ]5D7Gv b '߾ e]WmT> tr;*pSwN'BQ{RxQ[T'Ou M4= xkX.U(s [F?_ &tp}8̫|`wtbgǼ[s 렷uó@oohon W>yf56١Uou[C.~Zȭm96kKE al;jz*mvY{N*GX,*Z?'8l9A= XŅ:6v|[w{>zOzxCxx'}57P]uv*U.# NUܜKrRlx ӎaMl_*מ렷7'w pٝ^[=7rsR|yx/[m;<lnҖ7 m|HAo zxCxx?p]d|WAW^\`WXVh5 c+8\_Ŵr|lKP%y+!5WCfaRjVut#/6qY8Ku9uo𭡷 ky|kU}?7747ݥ[`&-*{Ԗ&KFʢ>O/9NTcF٬S+|R\wn]rw::ϟ1=~ĕ<^qwtv&߻*ĩs 5*]3sxÜ%yrTߎMy- knoo>?G/1ͧyxNQr- ..N뒮dĺ .-0qq~=O%Y3WLW5cŭ f#-!ΙE3]\~&].ٞ71/l qև;=-m/giwo纃z~jwvO?H݃%[ݽ1zjݭ3Am%\ɪEIm%w•On i.D\t=W+:\͌!ht\Ӿ8k!D7ߎ6*߹m5?v6%&O!z7:]ݫwN|<;\@5V2i+J :WMK-v[rxkJ 9]TIySA/V)hԏyf0m6eX(t^m $dY j~PˬV.e]\Zd• Np%IVTflor@#+] UK^roE K- ;km 3b l T=){a߽{vj >6rӍ/z2>odp߇1+&;nss\㫚S3fy#| [*j-ͺ oL8*˵'x< evXF$SMIjqY p8ԼsކҘҘ|{9Y~vsggG[-yf*oj-8qM۔G:ʇ5NpwzxCϢ2Nʧ_n9,2x~/x1['ƜnVq骬ynT͜{NɚB$3U,U|&dԜFhJڻ3<~jD.BXqy54 L AWC'H;@Rٽm7;rqO936)ZJ4]ݔɋ4-LU fÒ$*0SFzB(Ȭ-NK8㱄Q>(?v2(::0e< Ag4ye)mnzŦ!.;W|Վm PiVUs|~/ ZNu1.Boohov߽s6v xn)uIyb\ؙ i&IBfL,"dp&Qp.Q~ b4xtGxZ2tLETmUmR ws ,nt\Hfrlftct7"p{0H6&P\5iLE1Y7\4@R s_%h Ru eK&!!h BV`#E,$ja Q  siϜ7ϒ6v'g4w<S!{?W 6] Q|gF|GۖS0 MOFkK.veUUw74%Pâ:7 7+VyTDESPH 7dML$&EBLEnM'3 D,ƅDBSp7MEf@NY8h](&s)&J9 Ig,aL,0pJi^a,ղVfӾwⵅSgXhxorΓK8ů)A?ݡ^}-Nj]=PRM5Tm#nP[u bps š]RK",[%4fJ.L3tLrQ&Ivoe,`<Ț%Ortڗ4?˒tbBRY{Lu2!R)ª1\:*S͹4 cTfz*= 6 CٖnҦc`{/y[Nwy-9QQ ?[\=䫶7647 }p%y|JJ++żװK3/CZD\L!wWI IT1(39L&fŒIDYzskh\ `zT$. *3a ` R !<ȐH`06Ō)O iT,A֒8eijD2Ҩ0EìڧL!‹+v43s33/n<2TDݦN:@ov<BDs{}vy8\k ;0m/ð||޳%h,)OaSuyB;jb;my0$MfNîZqQ7Kҩly؊,d0daVHPk3\d.hjՏ$^ӑ deThZG[BtD,eD(Ĕ-'AJE;!("x*' (0OVlsԋi'|[dYKRZmw `ߪ92b[K{m }U?B~ O [;ד~Mrba'>DDx2 sX ]4Zf"&OU7P.X4x[L'}-SnZ Qw}A~ .gMfC4 I9K5dK0uG,e“9!IȢ FyDL Ci3X+ꤧ%Dj]7ofu#Ì(뼍zyGvsλf;. c|'lnhof~v>Br;{㔹 [Bd֍UwGti}]"bvf$:EbP4&bWxfʐL;BiH(0UHΘl"((KxxUft&iRf/jhuu#0 8VKoUnj^zX븗k{V+4xCxC™7vy%4l{oV\0/0` >Y afE$2BlUF*pJ.r9CrHh.Z:[D6H ZA4iN҈`3o4lHoT[ +fsebRwfmB0(ED1@$L,,J1UDT$Qh'#CɢjNX @*9E`(pyYxRZ{sx^m8TYcK5g 747ܳ3ǿ]q"WdIdNn,KZl@][gH9 dY`at2 iUY+ 2WZW;dIs9A ez{ `Npxj1MliLlu) mI/Ch1af4meJ CfZ) fOH gXHY6{$A@E H\0H('YfP:!DbԴZ$Tb#0P:3wSc"'FNʡ[.U߃z_kwwqvwqiTVɳf)oDO5YKUstȘ%fL"=iaN@+} 0Z/^l0nZ`4F/\![dmt+c1h߮{<Y}*rž6i zL& E['4emuZflLXAPmfK)QYbd)V aV` Y Ƀ^Qgˬ .OY'ir':tfU3F}j wo:hd';o,bՆm臈6Ӽ5q.,djJ6gܞ\(4-UN [!3KX:%MFkWƏ(3L4vxAҤk(Qmg^P8.FǡD3{'>2Ra\2dkPDm1!&\ѪP-h 4y=hmµ6;қ߉4jf7!Ey±/0R>)Io?x/Ή4۷I ߮Zm1/ܿNWaM>47847:_ l g*|7=1j,](ֈ@KCBfJn2.IVYbkU=ɔn2I4st#Eoݶ 4aY69x؏|V }>KOY}`zS{RR8E1s)$P*}%,LTg-秶1֓A4%'$" 2A3# F<͗>=RJ Α37 磓vY.{f>^tVΡ.™WRlv')ŝwmDYEًUFNܻAi%[3Z?^+L1Sk=0@&&oNXA|]#` j@o7 i̚{2aVҊSھt᧎5(Pgd+IH%UcyֲwdPIӰ #T.ZͅO/#zǡDKTYMiPfYŬP*2H&L9 3Κl=p[AY8VsyW]1|P=d ]_\݃{ݦ6~,ssw |daa9 RE^ 3#Pgc@(tKJ4"3l"Dќxs=&#[rVI}v!͋.Qd=AjBRt ZJ_jt2-;<[ CB@67̂V"ۏ΀6 4P5A% fB- 0-|MDQ2깸UA ZYq=3 +CCxC߽w(n4"vũ6)O2X7&wV+UMj9v3V1<,؜g_:,.OSTzM)QҙAZtxZa08zSz{^ww}hi\#A`c״ZBgQT:^"!;E 6YhiH>2"nu3D&YmqU-ڏ$,UT, aIHJO7fmdʜ І%e ˜d,Ŧ,/N [ b7!ûp<ؖ047j_{ aU]nũ[J8Eww0gŋ"2 <ҍdAZot/%duCf.9^ P09Vd0Y.I7# dP-G֌ hiV~i,twK|nĝ{\,TLd73쭲9t𛛓ފUx\mE:%g Y*=/@F+׎Od;fֲfyÅA,@ka{&B6Da,rVNjrd.5%ed fyheKkBϘ^g"xOk>[yWÙOgO!f*זZ# =ͼ7эa,Q,Q L4Me1"[{/`M,h 'UP t̰r~,qiW0M̻;9{я/?_ykXZLZbղ}k׾pwYl Z8Ù4k+ϢM9[ 0 B@cCK=obC>äL+fZ#d"FpsWT *^ n`5!EX_tƿ7~zu*{Zew "J%*dbM >hATYkoAV", +ȄN@a2eqXSՍ4) Miy)PJΔHh33 }l26ilXn<^s8 m~|x@oho9x|Պ`wۜwdD)E8'F "4ۤ:^*=fa4Na.5PٲxNpbkW0T!G„Pe{=Nx[[XW`[v xWoG($?ŏ_rK+L4w^`f8{Čh摫<~SOw>l_N^ NdW3~{|7YUdd!F\h [eR5JN*T[$$B2:ZUS -r fRzf;hdT-%9L3MriOPvO k<ހл6$\TɥJΒʳM_&XZ+O4Go?h$ᕓMn4LO;NSkk1 &`2/ m^\(w]~~5w n | #8'&ߘ|v JJuzWG_ͯ,?xEᅻ>'q{_ſ*&Yj*RASE6Lo?'NuU% -$HS8$TfՕ'ҴS^%-Ķͮ%:esa؝ǃ _|:ajn)xVΜ'0X,ئ/6S$4omJLb03 ,pGAҫ<ǼHyko(*{VܼWc`&䃳⃷~Z[nB~tyK?hW=gt 5:o7lw''yg~B?_"W^.))ZeP 9ZޖLQ*<)< jmqof7@ ֶ]t[ԢIUN ,!˓ggrZBz4Ee9vC$`;kuwSstEv>mm3R K *4ыNʒ4z\Zsr5t֖QW(3#a xc7>o[ W (Zwmszeuсӿ}ziW| UusfI[=g" x~y8cK=ơht/ fCxح(z٠ÿdf[enV*ѳ'26ߪ҆ҺkjWX> Bsߵ0~ld'G`͛46_L@.k`݌avXC8MBd9`0Q_sNt кurV <#Бc~ !ج^۷_ ̇;9yk qIX[ZqP9 $n '4Ysz2Y5$LE&9e%`PJ垭oEka͓ˀӭuq Z6>8D;ngkn[l`i7H3O;i2W XÜoN&Cimp]uV l> 4d\qy˱>_?[OvuWAv7+Ǟw/wB<,^/}~TZ!p oƶծOD"Ho n-./M=#`*;)MnTGT8G§2޽w™!"0ݢKL(ǃ$#<{HaW`7G[;'H$Skh?ꅨ/`\-P&n.Ξ7{l~€p&- UG\OzAQNs;XX6Ҙ.U3<4Q%XRy$f˜.лkf3v%㛧^- KVt[=f&Z"LEF5wk6gN4qg>sY{tSyK>iI'73sq| q_"pj W_{|$zt[踅IXk9O8apSncm];̕Hzi{g\57=S(טyrp|'i'"w~+b},!(đH( ̕FrjaFZYŖ[*`Zb+}dH4O++q[?4g^Dcn?ePm~ѕxUǏ'E ,8dodow˿pR?ud?r&q)(-$[=,=!؆{&IKGz%IyU7(!áu'~h3;Ar!}w{/_;W/V+km*xqU4疜"zf}2+NGRFZ+-甥F֠Ъ>shDz^~坅Pr=wǚ@wOPۇEhU4=yOq67gWY{۞YK=V룬E4K4LԵWVDThز|>۽B/\\޺ AkuWnm_|O-rI\]z^suq,<{$c+G\ZppsM^<^oť7`74 3e7Uq+ < ti`>rwiƴ7Dw5.c/ }$i|x+-k7g<¯w |7: }:ō1nO_W,sMa'^ 6۬ˬw>Mm!b{h vRCҞpx왧O/\n`;4 /*K/^L'aufĸ$ldmJ"X/yp"-(i}k;-Xnp%LI`Z8͍cC?9? ?ИS+gl ǯwO\1~0iifj9Cm(:xU&X ~5k'O^zf Ƽi+lj W*Xe~py@N#KeQmhsXkKH3`bmvTVZO]\sñr|?} +/g~4*Za̕* bݖ.ߖe+泋˓ҮO[ތ/db[~WwO&aML" mtkOXC5Ay?Пp]+ˏ_86kpߵ/ޏlc:}hƄ7 Z״p&Ӛ%/m‹?߿,/(Yn>ǀO,t/shWrz+.'l3"P׏<\ڸ1VpO9\U$,ʕp3@X- Q%wWTɧ^Ќ1gsho=E;Rr<1Pd6eZi@IZ咤<8.mc\֒s&ۿxɹ*w(^Y~^nPAE+|]_? +\rr~qo\\ħ uʄSY`_?Q +-=%=w' "LJa"[U+@ Wʃ*1_nZvs)\Y&ʡgvxP\.L9o]̥ojZ lswpiۀG]m$s}}A ]\ư*tYzFת k1TyĪJ3hvhOՖ2BK`:eZPI0y|YOb`Y 3&v \w -AC p(_)dYڠLiNC6}1f6M}ddCPJ`_Bgݩxac5#xc}KyLx,mc*7'az%~"Rre=/;<;pgWX; |g癬*dvz{ t .Psqh~tu}}lj]칥[4i]ݢ;gDUc޺ryWX@&;d~lI%^~76*.ZħYɲr`ٗ؝`=g'jgz=0b W-/  7Oޥ:~N K%ۆ7mo/;rK|#uNwfCxC{EC}J8x@p,D9I\jnXoTeínYnrXp)/eA*aM2/T J}XrŹ/E*/^u Wc=Y޿ MaGGWs<;.~B3mNn)<\;z\U.ro xw_tsz@ԪBpyQ)Š۔=leԘPsrW£TwzƥbIytxKʴMPvW>'\1kDooؕy2iZB@d5D SJ}6oho{{qh12nYXۏ~co=I5< Y{R_Sq8 jWﯝ&x_>qtp.$_{àiFb\Υ 's(\"-_O*Iv0 O]f0aTusr &ڳ6Q)X"Hʹ^_X=vݨ箫Ƽ`eVW4׿E(,?$0!K:@lKa v<,q| zWH Vh76=~*\sd.[bߕ* y=◖K$$KSڶǾ}|rCB4wL]nG85+uץJ`8|uRC^]ut8 ޹v1oz;y>W UX嵼2ţM5J ܌ R8C,`1z&Ȗ~g蕋=^Z7__x׍c83;ϯ*3W໚ϛnL}J?m ^A~6%7۠{Laxx_vv'<#?\/vr}~CxC5ؖzK"]RxhEXaX.I4 au(kz lխ\W@rzj{#7M%LQ~l/NԪĖy{lJm1C{7|Jqt8vlQHBre%X)]YLS1o܈LGw ?oxzչ}]e R6}WsU߲~ڑC:M2dǭOtʪh۳hgt\5+F+лwG'p]rvh~0<*P7:^T&"⿹μz[+c5o?&R3Xع4x] {^XEymu_F?B^Jyanhot=7,՚[%`Zwr=l'*xQ-G@ǔw'\“/ +3zȪ}|邖+-PKq(ZY.˕1\ZDLPܜIKeJS&A(LTB*oy">~o/ukh5ګN_d;yziPWJD 2)[f +<yVD.\nnL8 :پryJ8*J0)] $J5'%,2Ȑ(cRު1:[HBA*#×U\ȼz?~z޿'@n{~i}{{^Iaٜ\)[ʪQ26Z!U{Bd2~[S{/ߓ$% I+&0[ԛSK"M3)2[(hњ[V֏'RtC\"H ݬ.&ZVjV6?\f?9-:&^i\@dفj!lNC-T{n޴\U E.joD"/75}~V[}JH3Wz;?"!u(gLH" ) "<)2 ) d*ӂ.ym՛sH b hU|ݥޓ{ԆM|Bs^W[@w틎UK)3W:TgAL*]} zUak*WgTWrk )Ѭߚ  ~o v ෿/_u!ͺ:/˜ӻߐBly`ReX=WɂRd—%1HF(Y&橽x%aho=Ӌ_e_Lv zp\SHX$,޽%lIt0~|UI]U8ʍtCxCOg_(B^bIj8:l -i ]tfA2 ($2L ,T7(\n3W#{GE%')~w}}zvO-/foktw~_6Mvu+B2zN/ۑ%C=2M%3=ijv kZ en˥څmRuv V*lwjCxCLOkM͎Z;<8sO1*)%r=X UcO1gg)K ピls5 *]W_g[Z^/o?o=ob$V?]W]//z+T$teXЊT Zh[uxH6T: C;pEA!fl1#C3MȝKs{[t!gotOvrC?`Y6-7;j[W)*{ go{ep! YFFaJFپ LtcܟL<f S:v.)"-rX4$7IeiSha W'ae<~[Go}xYf7xXc?tŕMa[Fe0(R [JJi$Zh3ZGL`—^M@F鲊D{Ȳ.I~{{wP۝Ij Erdpj' $, j+gB SL Zj,m C61 @e5YDf/{o~S!'֋b q?O8>^Z /a_]" n':~F7Aݷ_V٫ECDh] B(UV[ JdkHS z Q"#\%Ssd5E .#@e`rd'ΊsB}NBkYZлx'Ծi,w<1L}7.`vֳBRd(z+ e20YnYH9%dȔ/woR8EZ@˲~7?+/q~?ga(7Bn 0_?2LXH:TRP +AZ2-Z*+"2XUKTʔKdfE~k.LAmN >\0 '-35Zbâs;p3@847t߂|z7I/Nwļe4948~m8eAYD2AĔdF?T=$=Xl%宅(C`& IIDk 7TxqB\JV;=uC_+9C_/AL( >GxAlqxWA|xQ ow7cB: +/aCz Ck( Dw W,bFiܔAldu$}6o/ޒpW@/{;s4)z:Gy<_šmʡ*mVM4/Ӽ%|L\ QbD,JZ)Mɤ4%Ц#" HnBz <, 0<|y\}Gǀg"P5n@au?f|?RD8_ pq)[23hYj!*EK1MI*f g6޷Ze,#VIYەYȂh'q.96PҶ#lpxp2]\m7?zWTj~#G{x"wM+\Q!\&3I!9w @bE/0ZV<ӂ&W$L 1].PAӃ J^HE5 5Ȁg x=;9}dn}[j9d]![rG@%y.7Bo+_m| $z/AHxR) E@>-UlwloR?S2L*JfcR%ah@m+[OHTQlQ@:dz[||ʀ5& =UxܿwEpuZbPse2!K*aFg zYѷ&D%#ȄT+-)dF+#TUI& U!Y̔BRJ/fmZČ<^xyo._W6D2k* D$JՄf 3L5 )RPր*hRD Y+ViZcO%صuMuRZ"ћr2mbu㯱wo?Z֢''k+5v&x%KtlcbRB}XS &CQaUV%U!CPTԲ ve TKrlU+ j{f~;Be~]7/jRuD2Ym kes}IѶW(L VvF^d$L eSF8~}|S5K'~BlkBߞ^p!͡wKWoA{%=o!ʺ|I٩L ȩfK5yHl}4%3Jϔ<ŖdÜA%A' hBRCL2ADqzBfJz~vR [’\.>PKPa<6q%CnH0w~ߞ ! jLf*@XD Y]!y-}^iH8݁fuKHʓj8[3DC e- ;®7'm-y@oh<0z@qho{Ӓ{cޮ5/bK]u2λWx>J#a+䅽zu =|x.y̶{U] H)؞[ o7Q^(p/srTNUEhImX8%=-R2iP c2pL3QhemU!= RZ{魟}hRk檁۬\zkj/<\MmjV(ʐՀN"dQ36Zi3QAy FJΖ:l=vEۉǩ ܵVͥ,?6 VK[z*.幤򐪓fR۬؛B5Jl aD* Z$ F EL"ӂDZDPemJ]M ,xKIij~oh)_~oß;q9,8x:>Gkz~ߋlqH*)E_NޖB+PbBaYQi-TU!h߳"ShjZBjd e+SUUNe@<;=z-mɓnwohoYÚ&~kw?Tu&̧JB9j %d%agc`[L 3 fc1%G50"d bz 47%2]f9) *)m[_>Wng}}>/,'1JXs<雧߉|7)q&*R@m?n B @%`FkwRU^FF@ʣsVi@[o^)e $u%ً%B$SO6&OTaգ|tf@;cy/|~jx£%y>8=˻/vٞ”YYyom'O_՛'+ Z(5lWuTW&5Z~a@ëZc]e02ա+%eQ24KCP&UAdRʴ6m/HےXs ݊Urdq#pLVV$i2^}563zyQKjlh4SS$,D %[gybYڔnP1)6>Ɩ{&Ýcd$xR B2*s#)5xʬ1Rcț6hnMr(s>z)ȍianMc rz:/k|s^\Ę<,4˵-AH9n۱A56M`As#iw4!czYCv̄{04i+Q1!}dmgES$}e-|nc|kZђpz:RӋ%➛Ń_} oOMMruMS5l@)mݧ?pr}>tfQ+/?O>5πm_B_f]fgB}SOMԕnZNMΩ6E39en褱ej)m*AE+<4St h҄>hL5JT3RZN!35@Fm]pY3N4X>dgcN3̴&'GY4^|04$KxiKHc -0X#Bi9Z+@1<""-Mh ZQS[b-,@Gg,ؐh0Oo̠3dѴ݈摺ߊn:׏Nu_Q+=y}%O`ko;y[} DW4XJ5p#S& -lq7 puc!,G(G8FִwKՅݨ2}%$PT[{ЍiN)-M1">H1m Ru!KQ-l4'sJ F lF#s:{%2YMxa)kãtfyڦc ř~[p *ɍ_$W% 却 Hָ٥/['6-؀f] Sΰ4'@&:3!ZXbJOohL@&NA$I9Z+/=8#=9#hHƚek(Z{< &eNT1]MA2b?  m=%M4=[&pu A<6JQ(*i41ؙk["}Lc1i4{R0 Qmy01L5! ]>/D=N8df"غ(\ɶ?ÛFLgN@ms%pxLݟ?❨}x ?[~_~2[|ĞRTnc[!ل)rL- .بƌ9x_fZML)fɉ|-{ǐG ieH a :eA :!r}L`\(uB@OgIt";2 CRPî4 Cc2hHPALI)_#  c$i !S@ =MA:8EZr,\I&NRY'LP9%'= O$J~%;A2XDp B]PT>hDo߱Ft7Q]BR!hD(@E:{z7,b2Ht }dhl@#;"2K`PW:;f٨M 5j,eg{Zs3]mM⚺cMgzc)aMglƱ`cH+aə4,ZaLSQ;,#@ʐ-IY)LZC4MA.r\)KXCPiٕ KXҚ=  t¨g)`UAt4uNH6[f K&tefS(b@)i2dĖf]?^mv}δN={c6|ܧ_̊JiO? |{|}8Y~+\Oi aLcl\jS;?L>n3)86m}q#6³5t3rDhlIК {JnÔʣu2G6$:4i,6t:H0A =`#@3>a@q̏Z(cRؾQbtN6Ҩ4*ei-ed9uB@0a.m%RMb4 fSr9E:Aƙ^dOuxhAin׍8Fw~!Ӛݟ\6uZq3-mܼ5N}4 mL9sLz5f:yJ7jbeҙY!g攜S=]iJz8iJ AgF%f=Mʠe QNfȑ% K: ؅+R?Dz ms)zY-Cv nd f$1eNH0X40:Ѝ;&Q>ƎȘ3 ]3O#kMٵIL5z#tHc;h'SJ]z Yl.>.9r]s6dg|ȯJXbMtݝu Ω' ۮ)ihL֦3i)'ќZ4,Ll4P2sD4yh1dٜ>6x %763:a3A7 @hԐum]q!) i$8FdbLO]ta(4e4ɴ5kEq/:@|#;h}~ZݒM s'{qtN._?NewzՋ'WS״7,okZw+qN [6LYgZ- \l gC2frZ ) CIa"sLF%@<í Oa!tpD‚P7ebcFTG` `M˗:q9a,$uI;," IAS銔-[s<$3-FdNl id k},( cVٙ1h<oܦ.,7(}7l{%vv~yToPz!U:GЧ_8>< i9qʼn7}rPÄ66 S};E5% qRck#nNFK`)yfdLOf1-ޙ-t_Gd`늢>X|Z20Z*~%0lL~ĴlܸP1ǡ aDьJCMK# ܄NKSQ4$Kc'Lְ p| `D3ape2 ڀ@^:'4R eL'~</óϤE=ozμLXHޛԍ >s.n)T 6Fҙ!2ҏ2XftNCmLZXf0KY 51emsuMpӹOv((5o2O3? 7+=w|,ZZc릫kkKo!NΑNk]}2S&[b) PeQH:S<-JɺےˆIjٍJKerm)=CS4u҈-M l X&,DX&I}G"SWNυKzoXhHK!F$ᶋqvHUH1GGbE%6 #S,2}8I{y벹kw%6}twWvO`twOoE4W45Sqj1쇿y#SJvKxE VK({hu'3Yv'=Ni77m|Vbc& M.#&ZoyTLy#>LjQb$wə,>fXL8 [đF•M qoCq 4mk`|#Z)>Ǣv#[ELi譳EgEU{56|%m#y /<^xۛ7y^'Y+Jx%]ݍJwmy~oeWxldIyDJz^j3҉6!SlM6+n/19vWM|D}eX^r\g/ nߠ6}c1 kz!-MQ&h,sJYN˦Cr&'[[ ,]{4nnҗIχf}'C'W>JxśP}x+y+~K~qg/?c+8#׍Kmߍo.jϝ>:m6-w#yδ!E'vscr٬g|1L:Hii2lsr3M&M6ocCtnOhw~IX\&߁)n>+cF0UrZK҅Qbi=˦eꜺ7!&}&듮I8I :vn7͙"?;S;F~18W DN&((pj]3mg:m󦩝M،IGf搤˦i3sU|w^/`RIsd8~QJxt7JnSnlu#>u^z׬>M;1".Mf&FT=ٍ6"_딶ݍu-ƈ8xeٯo =ʮW)ז ?Oرo-lG쥗Y㚓L<vɞ?OFc6봖fob}-^9dkSiZq s(L%i<ɻ>[tAEG1V:^}{ˏ]ˮW-[{Y|vWz$i};^2h-sD;DRӶ}Tt裲s/?oߍxN1dw#er!_Ti! nvLj mqf7jǢy9.IMgINTZ𛓍zsz;ido/?~7?}+w)P)%<ޫ./nR{|5L{v_";kAZlǛyEKUz\~d˙v!i'7z|ښd*x{w%Fܖ>%Z-vw+:u!}kˍ$*W>v5GۅN/?{PvǢFj{XZv%W^7;~gzҋu-b9L{˙Gƙv~u<iۛFHm^)t$D`K9y>(幛qwGpn<<w!Nt^t5Ma 4\<]xT| 7\n4VὯ>^Q+MKo/kquķݤ9]AFXrδ{xKb/N=rxJxE >o("[mw,:}<'/}RO8%)M-7»ܾ|_8koݕܱ{|7pۏΟ٣vj+%}7ڻMkҜ/;߱Mhz؞\A }~Hf}"{Hp#9_ vw%Gk*zPt?/+DeW+Jx{{ރ?~ma񫿶:/O=~Lˣt?(ey<1w>h+|o > >ѽ$]ɮW.7Hu[ oo_\>%x,vV=/cɵ ~*es쎊SN9Jtwew+ٕ^A{ݖ}}7^.DwrOH~9${{DvH] (Lxo(!k/}r{wTy_Zl焯 !W~]z6.eW+Jx^G|?ͫg]'ɇRm 3W}W=$!<(^Q+}h]r!߼Y4xoR- %/&?Q!׾!dW+Jxw&ޛJꫤ]_WpOVt%W|{/ ez] (ὥE>oM{m{}?ѕcz ŧF/RT+[ }K]?>$({^Grz ]5%W߱^ݽ_uC](JxE7ͷm}Ш$WG~}F#%W{9{LB,%S\2LoQ?yέ}T]DQb)(JxE^QiԢFEQ.z (^QEQ(WEQ%((EQE ((JxEQEQ+(JxEQEQ+(^QEQ(WEQ%((EQE ((JxEQE ((JxEQEQ+(^QEQ(WEQ%((EQE ((EQE ((JxEQEQ+(^QEQ(WEQ%((EQ%((EQE ((JxEQEQ+(^QEQ(WEQ%(WEQ%((EQE ((JxEQEQ+(^QEQ(WEQ(WEQ%((EQE ((JxEQEQ+(^QEQ(^QEQ(WEQ%((EQE ((JxEQEQ+(^QEQ+(^QEQ(WEQ%((EQE ((JxEQEQ+(JxEQEoN$!IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/splash_anim_06.png0000644000076500000000000011721412665102044024342 0ustar devwheel00000000000000PNG  IHDRjSIDATxۓdyމ=~+{q$A@Cb4 Ob+3W_Wք1vxKP-Q($H `л{߷2WeUu>bSD"3WfeWe^|#%ahhhhhux >9ރN)>5~U|[ yi|hhohm7CxCCn?_?g@phohQOϬS ~_gx /|_ T`oߝFҟGG:Ob{; @|W|J8;Y*͡?͠ė?O ŧ{Z~ȟ<4s'8G-|q}M<5i!^ව D>bǩoohOw w O5g8y oc_Mpoho w+ǟrv˧^Njמw{[Ns~/U5 ~AG ^?r7&;-^? |xCxx&5% t[@w8X w5;|ōKfM77kzW=rc[l .RGWgm ?M?[-p<ŕC yGWnw߻G v5n]s/s-G O>\Țc5е{'Vt>9*ȶ:zs'ov|M9msvt%̙`!c02~[lv!WkzxCxx&; |-v{tekur57WžgHDnYKK&V8.#՜ ~mi|?ԮXťM07747an9`w-yLrs%ldRݽ\Wm+M#dhjm Yv`͘W\4$oZPLv8ruJNؕ\›ASu4ǓJ׺Eʶwyb^@YUϞفpL3`z;ZeC~Wv= Qgǃ]u̒KӕܘffbYZP PvC` RV%,``jf0AL9|IC1h2 7W39Cds;?S4 (R!TTZ#3J*] 4 (CNWh> 0&'% Ӏ<l[+u@u.Li P%`j10 ॖL".c[S݄vs4+]d( iH8gڻbZzXY5?lέMY8!ؼ;&ow>ui}P!k[ v޽@I{p1 q.'*aH'6t`Q)!t$$5]ZYQ 8MIy%@Ѿ5ܹ7H 9;J8yp&@ Lx@QR4[i L-IWBIpgfSdgf݄AS!]bi-! +-/9ihkѝl[3/rzwbkgs>r$‚zS6zOpwW`j|rN'd2Yg0cJY,6"$ZCBC=: K%HViq|] ]^qn0.cq J0&(jpr;&%)h:eI֜ jLS[Aqœ- /A1Tmqu{l-9_KhᬭyG:]ؔͻ*֚\]' .qN.o8>0w4sa%RUlI0`WȎls ES7n ^=U,A(k &Qi, iVL)䤒*n$횉`v&IID^$iI) -; DX(a!PWmpIiHU$ *A<ɬ(DHl'ԣy C(if騆9,K㜏Ϊ8oh69!s rixb[E>C+byCC މ v͙uཱ}e7AvݱJzo9Q-8ddgGm"ZQQ2c2-VJJhi679D!̖F: "Vlql2dj̝ _푹rv gj׋jI\7#-'' ƕ -bգ.$c!=HMeI2%"ǁKBs lm4v 0[Sz[\]Nrw"m?89=86VoUz78#\w3'Mo8C-;\Xٽ<߱v̻[b՘1Ynl:`&L-V闖d*Ɠ>cnLϭ{Cw]rip/@Vd6 =% v%p,|s~y|Q,,!^{vvƉmqw)^LŐݽST'EȔ2KKNy.}zLÔNR,t4&`8`=o+P, acn-{2[wjI*S=,:3AHTR 3deʌTW M2tYﴰfƖ!Y夛Ϊ'ALnbBkB'5 ݨzO\`w只n$v&j)խ,iŐN0IT[d6)Zh!#= 2 QtSe5cA"-)$+9Vri\)u_ }BD_=d-Ccsa2VZ\BXo2HWZ+mƔdBp0i Ff'Iׂ"deFe O0M Vf z[ԣ9+aK`g!{TA{gă;KU g ,[󞔟{r'EmCxCO g>:k\\S\`Ev{% YzfZuwc2-&OY+1 7gҊ֝C9I~\.)p% n2ZBZV^\LPq%LYzXZ$ )6&?IHji i)e+,I&ESLRBͪjs0T&-@OՃul&-IrMnyPs3'˜=Amt < Xx.?P٭[zV>bZr/'u| _ |PehoÇMLvigyoge]7ae)>edn%t)FH0m/<`QK+ekt9L 2k7ZGo*}`&Y,Dto @M)@&ERLbD KBzT&p (-)2D(,%kL@H#-(I%YzLJ"huC@rH̨)gn*O܌ac В#ҠIȄT`ZKR@qS{ґ $!%hDiHUd(P$,I$Pd33J7 d3fi:h"M\6r$0?4vsJؙxy|VE,sp gp K X ]۞,.4q[[ W`i4 Y`gO@x(m((D24gk69,'9,-Ue\cJCL%ۜib2rHk V"2]Z߮9>&-=FkGh;;Ԋ.(% h#ІȐ'٦2J#R"/GXcɷWw.xtvl[&!r򖿥|vm |Zwws ۏ)^հGm\eŔ]g1`nRkgf7+F$3FD)*I T1Z:@K#̝1MR J""?WT&L BkP @fA)"cd SRn[<63ԅHCeY{Ba]nc.Ye:Mۧzd'i 9^dކR/.cKM[F[pxCCOݛ/掷α;;%P6 s>9 3^ .Y3nAU&̩C%B͂ Y2۶YKҪGz CMJ̥+uguWxC;M㓷%N4푝z f]ahhoXP"Iϭ%!]y ĜDΥ%fuWIӐVj4&S&ҳ!,f,+ѷR^C!I0.V=$ipU|fiOMQi%A6"Z-ArhL(*òNCeʠZagVc@pZbM,lMQQ:p,!5Қ\:ՙ)'xˣK/ģc@>pO~/:lnhoKUSĚG'7xdZ-0ei=|v7.G1Lk}v|#dVȰSܠ QDOZi4dl%\,]l(#M=-'F c=;%6>D1-[O;RR?nٜS <ӂ -+V Ҥd5#< lfZ<"K+Q9笓\IiL6.jIʖT!y|pC{`7@747b Nsf~@v vv>5)4`1AW2M`xH3`i;Y@&2* j{]䐙#i->`ZsmS"ӐFZ #MD`CZG5 RTte eܒe}oRdH&dP(h!F)2-HM"R耣H!T#iÔyS네Gq՘ZxpW)I eL4umnoho/¦A\[RǢ"T O, oMFZdZ5 13&I4E:zHxҝ&CCPfNQ$dͽ 49e:[A5hRf dʿW.\S;>>.y)I1<fAN/'p6-K1ZNZS;$D4y[#íjn ,]=W֦f(t&Jj.k4#]Nߚް,V19&rז4-70$2 JKɀLcBL"IȄ'[L~z~|O?4Cm4_u}9q Y2n'ksqi}k,E+-tf4 t4#k!MK oki6Q% `I3./W-׺eFZ=d̥$$D2 `[:'F" zTAK @4ԊTDS")&L!Oyۓi=3= d)ضQ7 La6C$B V4 Ho}YV34T7^Fݸm6=BQ)ә,7Ӓm4jIH; AK$ PQ1$H0)K--6, `fՔZ-p@=WG1݁&y3 nB3-ҡšsKRyyކMuzir1*3KL.* W‰O}OR8ͽ2{`y ;\~):fnt٥M6E¬4V^RNNQ@Û+'#ZufSV`K&:pJPQୗΜ0kK dBi- F[3IW/>Wj{7nJ&Z7g}sZ9yGwNQ2kb?6#@ PL$jda=\CHʲCIB.xb Xʠ]ӛ2`J0g^dcY!HL8B0if3jᙎBipDLtmOtvB9tsē7% =-[͟[,DO;<GF4K0LdapR%IT$MRaz-tfDmC4Nt: CnH0 Њc5[H/g~/m/?l[ZIn- @T z9~7s>TMRk8Z9[}' ^@(@ew%,Ew3F23l5R$uJk<)l&*m6@}y>cTJoЀ|ۧ! 9N m{`pf:OpqwKӼi^>KfIv 憒Vp:nL)'`$e(@/j62npp'=O?/`nV4mY449a%Y^c/ؗ7~oGO˳YZQ4&SF2\$Ph9F {aDg2`+ϴf%27$fMs% ɔE!m>yDMZZ~wngg/3|ć8K}<_EeЊU`Vh.o{$bJ WlGМv/F<LJz:(OtWIWb}Sm++&QA Wh Kws> 4yOOG6h\m찺>t~z<_f$r/[ɳ?@ Kо^)쓫d2Փ$L" iIYoi%< !  @KJwy"}$S(d%9e6'bm[ mf0Oɘ,Lj/.OG\З[#: §K|vCxCJ/Pl=xf.--gwဇX'zQ;q# 7O!̼1=3(toC. !ۂWڟ6emZh36aϜρîu5*y>}5_?g|}O%& ih{F`60Ӑmj tDK֖/ZUm)V9Jy0^S` 31,@8Fl)=e5#c픾Obqye^5wּ)9˜CxCOyS3Pl}\{[ 1n`lu٦{9LVYZws3\eAstdhF,mZ7q$M'/o%tg[07w\sJnxǁKw^zsne*3<_><۷LmwmQO4S Aӭd(a}Y]Jz“ȒiӾuсDb y8ae/V:B a1 IG3[ $M M &$޲ ,p g # v7^Ł<ĵ4w:OJ-şqGjS-0 ʶlPwd߲9)l"ypN"a)OA [ }9fh#~ poץ.͹xW֡K>؊Ϭ E"%w0?o~~|Ԧ6Ȝ-k6h\%~I0Lkp6Y!6%eWehØa+Ň'(^zO,sR+Z=yٖ\<)' rLTQ^`t%6}:0s|/߷Vyjc`m=27K'ZUxz뷏 6X9;^fSz|?l+j^ъ֯BhC|4köqm3<$Hzey];+Am*K!KGodKxz@;穡_ 9K/Oijӽ[G{4gELY6gEm1ռ̧Lqf~ZDBCk.3C[/[`YZByUp_yͿ:!`CAW: /+ܧ\ ~_[ybv3awoEK_>a(LFi9L{.l_C^mewyjvIҊXǸ;747{>s_Gwncov~4ৱrw7tDҎ7m{/RFWwzK_bێn{s~}AF϶Bde M&YmB."\Ȋo=7}aaXs ǝ#oo}hoa} +V/jX'vh.1J[Oʪuȵ ˈ"#ƊҧUp6G{_~v[B۠ d)vnv[g򟵪`$c7Bϯz*P'k$Y9_Z>s 1vv'Te#ĺ9sQ +;Н7 >7au`_ |t+CO5N<~Ɖ9h6߀K;B;֮f99h*0K O@&v`9ܡUn$E.a_9lKJUW;P'?~ /OP [!VrP/g6} +oU2sU]”6j$Ȣص#euB*i+•]}nh8?lE' .?6O44!ML'L}C9BR@:@NWk+Na=@~V[6ϬÚ'?|e??khyš|*!ޮuUQK ?xM:nSSLŒmٮYI2LX)6P@$C "2OP, %9-v>?6U'Х]hS&[%$ T?%D7 ̈́˒4W ddo]8A~7}xr l,O[\-`Sj%DnC8W_^'QJg"ɾML!+53IǑd 0'aWo,.G3uOp]#l7zhb}aˢl}Z@,'e$t;Yxmy\-v_DP|nvZpn)o~DK|͛{o_噩M_Y(}q[ Uxօi@@ CZIgk^߯aKrZž7cw\M }pmZ޻]\A.薶5/o#dj?[*7rɴfj2ոYm|1_~/=L{a+W|=gn^[Ðh{RzӸdݯ8s${ùE!aIx^={uS\9~G^y={Pr LYn+\)YS;YҡG o 6bxAhlF{UwoYfoCϞgZ?v/WӲܕpcf{]z|p[_z> r҂Ɖʯv_׳1K@\bA{xCC~r(<]{ݤboE֪4c~d֫26 vr{yOK&W~/9S{0t5BXp4`Ͽ>s4Wo/%ԙ+"luƁW>7S櫓UWWO5Ws@nhoQ Ҧ6D.{cAwf-q1 ,NNӎ&JF]~WAh|~[.?zhLe_dfx-_3/e.i̶w8Qi7E<eބ"Qcs4޹~񟒷 't0W"aK`-ijCwTPu 3=*y܁ zvan>bv,[gYճWDm_^+RQ*hO$om[n+Py_wn|Tr}Zڤ\eZd{ 8-r+W w!G)_E 6&g8o+Zr4]Mŵ]ڏ;vCGBs퐌څ,0[Ls.tI}mg*YDC.tq.{wׁ|vBoG+دªA +0P)sW Oj7!u[KbUJ߀^ON>:\#]][c9{shLs صLs)ni#<% Wgp恾7[tv_ }wߐptkٴVp6^o<օC-ņ>L= Onvo93:nыRtžKR×:[.PzȲڏ_VcGz+r9Ti KQ}b.2Vop-6pMCxC^{<;Bi`-{-0[6v8%/՚ 8@oR/{vhg,@ YkUgPIZIa{g[쏽ͼyE…m~dz8|)TY\]=1v%'/OQ4JlMjK_Qk>5-][/>_ ip\Wk.[-,]}U"s_aϕ׺ͶPo꟫h/ޓ'ˣǴ%Y:i0_˲[vojd;3-sۼaB8xM[Oַ?!pyK}/zvK (=)Ggbz"@LysչiS̆>|篃v0BSաۨ4[&m ^-Jd4hզrsxn" 9.uQy%NteGO7ϟxEZ_S͛o7GLlf\u;9G>IIcnu',Oju\S̵m0iWmyRaR&bRܲ:#ݱYUq 2!AAI+_LWp[U7>z\g.ԏ]uv:UkrHm/zwc~/H!%mvw*νּlΟ5*n{z\Wvr𤻿UUe*HQXb]K.Me +32J6xoܓ*5 ?r? VVU; vmN LJ]ȒRRr{Dzq˵ʓf>kP~xCCk/v;p{<ޮ/oךF\b/fR̰Vvl])J4w׮ߴNÔO[zGKf\]g?v1t{e`<K=)v0mC߃@q[m7%nu#947A])tvxnϗ|얦usWXㄶ'#D6iJ1{:%4pnkΓ~#ysC (3ׁXUejVګy-6=$q\qqr| @$zNGrhoMx$A/Mjz\3rzBLBDoFl՚KrHzXZ- K__' n/?Ho\ I= hD_ohho|"^7_UOaFC1&T/6ѵoVlV4)`(aOKCcrnw~6WÕy`s+X9tWh7 @`(- oySX R&K/ȥv?! tj <:sw:xcoho׺o:ݶ>+Ɩ}2G3,rSijP  Ф_C7IE+OE KCǷ9>b,qK*9h7|ؙ7ҮR`͠Cl\W{iLPƋq 臅+naR3VvZz!Pe]x> J* QVǢjPQ佊$6[Sb!椄j!~=7?޸p[r;`*JӒCR!Z ݽ6 %jIfyhb\k5itgvw5Oś~Kcym.̨3+%%TkvN0%AfA=~2pDZzҕb5 _ǯ793LW>T}v[[1??hd*3|qH*?ݣE2+H2\-m l3湆cgw\& W.B%G5+nGX_E|ЁOgN~[ƈ![ڃͥ$k'hH ^b}!rytզ| L涰BTr.oKPZZx2 f7`l_% Cުz=} gzk7 0&bd-}ؽ|&sǎrykMZvǡz;9[bs۴5j_f>w\+f_UL X:^m 9pux67ØRD(VBȝ=!.O?[ǃЦ>{:?xU vYt]Z- ]S2,UOprCxCOR\xKh>a͉XœNf4f[Jdrً,V)dJ$P;JA Ӡ, <ѫoO=o^ٺ^ ==~?ƧJMhZousg}3J>m믷|r|{_Vcz_+ߍdjjO1k-esI)$1aİ;vy$XUÙه3-uQHF:η2`i V{wV+_~^UൗΦl7e3Qh.p0=1 7)` $ҠL 9Pa -ALR>,ayޚv~ĄxOg-)>Odzxf3$N~a9M\Fp ?9v,d5|߀a0'8m !]mׁ5֡C5ʝ|{/9+22 RQjS (eXbZ뫣U0[ץTXP mT\>*f,i-z8sl.tCxCO^syNlr7,O3}]iU m M2JSr+MTz-2(J QB*-{M4 D!iRH x+w^|Q%';]{`^BD=bF. 0C\q/`7BX>v<w!o`?Cg5>EJvTfRmD1Z"`G&VIF0X1*-CWCZʢ4T%Vog1hL .cԮvW7647gg޾9ĹB6ݵ3FEXWh\h@LFd % ek՞LDa*Ml=cJВL:2 =ͷ| -\+]^;wGXq6خRҠ̲}x g8{l70/ðم"`&oq~RAV0o72hFV+ADIK@RXZ 03$Y֬`j"6 F#hM`P x6@Jͫ+JshoW)syA_<1HT6əIm^aۉ);y(*yz΄U0%7ȃ45 * #MAB>[w~S]Xs\N;i^=Bm5TpP ("Ff8 T| `;} L!!Z,.Sж4E0EXY3I[kW`.gm@cB:,$`2ojjMsɋMr5ǞrCxC\ nYPl|(vSbf3`eZTLUdT#=[&2X,%1A[CyDUk􍯷 )$FB`dªZ>+D %[B Ķ0A-ܜBʘ z$YR>K5}\J7 <v˻3sh-txCֵ dt9t~rq 2vZzŦ0En3IlB֛WE(+K ]FyfV4!YI1`Ie I&H' Mo;\ WrU5UGXww{oa@WaqCi0u.m~+"HfRd&P,SiRHd&f!)Ӛc 3Y>2L Y3͢TYf";\ꭁ[l 3/mpfsrkz-M+o?sr|--'P>C[&*bA G`Qˆl'2pTeUB&d="`#BՔ ċP*ԕlObiyu]3bw|2#wǖ\}NŌ~٢^|˳_շPAEB)F&3*P"$cJb6,[S C^̴HKH\tD[9a9 >;.bXkcސӫ07͇^'.:&2CRyjcjnXnlniv d_`FO)LkK&3h Q̛, IJ1mdH7D5rC{E^@]`@yWwз99BDPU" 1ڼQddZ,RiYs1`ۄ ִ>-%Q)H XUY3-URZssa\$=IZ™oS3FHs'' yO[r^y6Me.TTVUMHLceڦlP޵dI ,j`2n  Ff@ mmH{LL<[wzL{f=X=]8s=dl٭ VPf{%F_˜X=B{e}L׶WIJP.S@-EӵGoPZIlRV',HV2ӚîF@[%S40"IW]$V6$:DP:v;`Ւ[ycdhho^^ Ћo4&UyIv=ϊcϣmVL[1I: "DBd"M( fN!Ҙn3-dӄHx}T (@QlB 3X^gf[_\Wi  pHrypU #h7;o7/9hd 0d+\jBbՁڶd2\jLyۊж!$ȄL j6\'PjqB( j,sy3ߴrZ(L!͡w|'w;<fyۖ#hZڢ5$ZT= ikcƒJFzfz1,lHR"M!!{~¯7؅5ח]&qKNPf=kփȜQ?ףJPT6:{N!dZHSEFLIA) Uy"Y%TVITXf82 YTmbY}t[͗U/kQmsxmInѫXᷞ{E#74;ӗ~zB ^C% n O(gKt j>zƪ IYUSXjJi PD6}J*!ɓIKp)Bg|i.ߡ%+6+)kg߿ssчY/%oVenMh P!)aրܿZ@$h{m@}|%'ˬSDɀmA!ր^y> V8mn}ysIVn0z CCxCO^ݳ;9kO 0XJ Y(0 Ĝ2 1VH k( ,N$|/^?賗?ɞ_k[OloþNbW%پ}o (4G0^WǿH57IdE1@DY"ČU1#¤ y(-/*$*ڠZl f5,<(0B2R&jͥÛ'œI%B!l cMgw >Q`ПU]-xO kZ#"/@Uf`t]jMy i5-I8,.mTH hd@U)&dt0}iV_R? PCFo}_^?2JNkwF`biT_ b985𖞽~ο:?*L }C쎎ZBsC`a SE"̀UJQM(S>CQ **# jYY)ֶ)Ua n00Ld0jy-[V k#EHLH}7~_|izUq~$(wp"}aՊͲTȋ _gVSJ@TQB([L^!LuF-Oק̈́ Ay%#*ȬL%|NGd[UfXʫXtjs4} zVXFV6}%D.՝@zEh2Yl{ k.ENBwaw~L\ GwThyGmYu%V2'ප-X@ni%`F+Ќ(-?7EA"ۆ E@W !mXGކ1SanhNAm{?z>WB3.o o UN׀μ[A/?;kGNAֆ V1TWm2!"`xF&- ",[$YnP0v$Y'}N4$X]ծJ|'qvG(Z zvkUG9k$o=O29!ʹd$Ñ3Rji  tRՃ<be,lz#RL^L)]U Yְ' ȣo'up_|^XX_]71׭mm"F\R@ITL-ef%дUŔ܃:em -.'i= )L= dZNYK ƙ* d 倩R,a<m!l@Nq[_?٧._zg?~9W+ Gm}ΟVɊ be9+Y_kGUEYu LUIKzIsx^G!t3d jP&kkI2k$x3KC bGܗr[as6jZPhD^m̔`K^ɭ;OП~ٗ(<>?;fOgA(4* 5 R$!Y(ƺ5Ƹ$ѱ#h},ztC M^cnNb(m6]bj,θ(c{1kgK\uۋYxhoAxK&»[xˇe$DyXΠü 6{y+^lu>~C>0oL,,º15s2?ѶᥐA#$d C8 Gc)FEXCU@Q(ƱU*DhB$hƶg@G{.l[5K'zUDB\vY1 f FzABW$nCr@8zt8=(ݣjW r%niѻ7j4";6a|Ztu6&#|y(T^:B>'^WGy zmRnEsEX 4׌SL]n(`^X8-Xp*)${]y">ɥXgo, +*6u3LaQA#땝 2 A ٣7a@" D, 5HP8tAU*=H 膱,Pd.ōJ@4`0 icݙCΑ<#qc_ԕئ lb5:QRCoaȵUN{Y&Dtx͈VmSx]%;t^Nٹ8k 4EP5[q;zH'8TgͽKtwI /_Q^] VvGyN^ZڤDKz XblKeEwQ$iEU z%%h   R>jS 2F&cG$j(GGQ(CҚ'ntnn[k's#$_&IךuZ.RX$a#/D6c C:J>pN3G/-6>vhDm&m 4cr2l \YxϖNen$I%o} _, |?n_'rn0šf &g jmJDh9xŢ(*dhf2J2QDVڲ`!cdMBn"QEa 4&T tŰRA@s.d8VlH.QЂ!,m\'@ GqT#s4\>J#lpx54E ./1]5z> Y0(Dc>!hoƈe{ AkKEI8qLMf,H%v{f\qbx =*b.JߋEcrQ ۽SVfp2T@LݣKt1Wzca*,\T'"Q"Ὠ/O2_g9u7oڦhaGdf'CsH]3j9z].;jNfD uP4DWt'pwFwļqCug4H⎀1֠Cr@!1a. >TH}l-ZEX(h]3ː]0v tqɍo즲ʎ;\n E71e5wXlG!p ͋} ^{ 5u?z-ތC`]l.6;"z@-6NEwj!ԉp(=J4:"gFzxQo-@/ C%:Nk YR\)(|₹m'vƼ(TY :;apL^5!o.S[?uTxuᰟ~ >4O.܁6 mDZ$zr[ߔ(>jȬע"'z c,JTX F_17+ HE*&3, -h4D"c lF8ҘL4;K" aEQUZs9(WY/KʈǞ+XϣЗhP`nJtJߨŐ:慑,*Q|DkNs'cOЩn E7sBX3oa&zQcqJk.c1 ą?:ӗw(sov|pi8?I wGwx^HoMkxk^q+}iЗ&s#jw@ib旓95w2|DusFDp#8")':Gp j4UNEbtHK1ND$tFtPj.5/b&zGD(o o`n1{%꓇iIy``Kʲ@#܁p'Z٣{QP{b*nrfإ0SknPX4~'Nic~V,-Q܃qzIvIdJr+Gy7SO^criUo--l.֪Ŵ=3o#m@]1qyD ﭔ2V |0HU!sW#V VTDLRA[4320B2M6c*.yL>(iKa%֝VO䤠rHlpB贠5\ 4Ƣ32S> A줱W&AQы0RÁfѧnpxmkFLCvrmk6/E(}iٝ6X(l܎f/v xCtoݩ̔`^yt\\>Z{:5-UX+9ٻelՍSV!%|LE.G gPya2=ꭢԁo2tZދza.)_ C!e]Khb4X_ֈMK9 L>7X (.(\jn@wFM P7yzpX^'oa^+MQC8u7x_¢aEfZ)nl S..+u7{YgT.g_eHgCbٙ~ ({i-CØ 'ֶc 7$y*Q /֢ cͯTTe?DEѢTyjƚZ̜E&ɤbXf^ &-QZ]AX@016,XVWQΝہrnDXhVN0vSY.X{`-&  x0Nh͸|LR^7q}Uk³_kw=҃O=S3ҩS|D{tJt'jto[@aaAQa޽[D wZGPa{ gVս|'&fF7C&w[tVZj>A-,Tux޺~MUԝjNVD:-s@_a=Lp>H_#b$=J2 VY3ԢO1dWGlm`(v7eͬUv\ȹܭNwJeftF%o|d4wG/R~}=KF,$a=ժN9_bm0Ei^EaE> daVQSWdUbR%(SV B2¸L%#fA6{cWL,2\'qAi!jtM>6u—) nc%WqL@KxYlK$78ᴎm:ԅɂv=&ks c^  ΓXg]gRG˭* "y3ou/^J,ɔf~S7Ӛkjf{š!xqHm%lMX'/rüM;"F=6[8EXѵ)7Eg5V] R",T,P kJӂ+ te!J( ),g el+ nv-mqt\  22F#{RBQtzqa0ys.%,gcP+&:%swTD'Zbכ؋f3GZewYC[pAgX,R< ũ_Avx;FwLRx)7M»)1A'W)'v:»Mz^|c>S*Nژ,X &ҭDZw6/LMB="kFak¥rY+m/ ьϽzWc@,kw*[ky|,]3s6\Fbuq Jtыޘ=Sp Ԯ]b/"fmBt1umgur`ȏ[$O,c)Ko*^KXxwIÕnFyһ8Jz}{}s`^ō&0qQuԲ.hRe &  UE|#kVYE*\q `W)K[h6 Q֏^eT/vbOtMx?{9+^KIxһ-_3_7o_3߂Ox`Uz*˱=Y-&oFZs% ZYERE, c'^a8$a ^;OkTx ܮRS, C˚(FdCr¡Gm[R"Q2u[i*ۆG sM6M*i~&OK"\OqG?z_ٽFxch%yk╛k?+_30t >S ⮹_FOn(o͜S[s5%FXǜSפ)¶C&'Rv(4jf" "/  .E2@ 5}WGp< JI1} /cz%5ɥ-`I*e,^pt֣cߎu4Zf\F-JꨁSxtD6 hc`;Π8j`{)^ndP`{ \l_v2Ő݃]&?"]du.Q0|t7o'm}#=xDbb:nSB-7F{abd2qꢖu_-l#ͅRYYsc`r-Q`c)!\SZZR1i<JscPmYCP+&Ti`<um@ZË~|=SĞS#R3x\`lupkvg1Vߊˎ* VOONGr{u.{$?|!|!dRx,<,s?["wO"o6o<' ec=P>֊@'k֨јCceW\n^UxHihKzЮauMA1L뾤_\Ӌc!5W1bFQV%[<ѫ cAvg`dxӫ Av\ bOx@xo?~gW?8^^K0௟^7o7|tml^lX"=l'CmzR&R"V-'µsM_~Z'\"4j^ %VA|oMktm8ݖKl5E\#w{z,1cs!{ѱqƓqfǑqZsїΛ'%w\Ȯ)Ihut 5#rx{6kG-ESzNVƂRg\*2d8oƺl)Ryi ~҆;V>eKRxK[=Wzoa7VKZq1޼G{oPEOmG*}ÍYE*klen?>W=$9qo+VCG]7mY^nb`뱦0_l8W qY)̋๾yӽeWW굲!7:Rxor(szOnJ.J#EؽķF}>(;ܷF}KJ eG]֗*6WmR3ʡuCԴ46;b36#*rG)2$FDV٭[eWK섻Av)$|彋| >h/ʕe|.0jP6 Q1$> (;~Kl| BSmi5ݹ]kSx)[w-ZRr]"Y# zUtkwybc|vZ!!RN.Uv??~aW]WO:^K/I*ݧV}h1Uć緋oT̻s!ey]~h7vS~=3IM:6@59sTrܑx,b;yٌBlWz9/Ĺʖ^ncm7_۫VK%)C [wt5>.G{)^,[ķqcp=~7ﮧ8!(j]o~\VF/]\5ѝ?jC&i- v[rwkl/nM}*}ٽ!)${׋}WJ>; HXQK|a-nڃ q߱o0g)| o߽J_ָ.5}yCr'Rr^s4QЏU<9[պeM}yDgō:8={y-n,<}{>x?^KIo_qՠ[G=:jn)!}`=d/rB<'bku!򖢕)mWC3\6Gn}^Ga]_ϱ~P~^".p)${O=ݔķ6)n} _~Ǜ"u^yIZ:*R{{8G? K1_ v7e\Omޔݫw?RxI /9 戮 u}'1ߑI=_w^$mO~<*9*Z)OhoݱV}e}.&@zw c_j}ra}"A) .e^!{K?Dyխ;ݯ}}Mdw$%^Kޫރޫw+SCrEJxzmM=vqew>RxI /kբzsVic)~ÍfGKLJGNq_ޥe=6GwV+z}D:}%-^K޻ޣޗ^>OZWDu[7;q[%x~e Lm?a[׽)^K>@z7Z%5 ~m;{o#ݿG!RxI /`{G齋y]E$GrݿRxI /{C-ڼM?ew_JrOM?K%) E{׻ ̛۟¼+{U?>g'^K~2}h}]w1oq=֛|?RxMjC"Bo =" !C0EF N{ջ g-$I%5awDRF?ExLk}Ô]K2{?{+&!]?>T$X.I%{^ŽJrzu7I~HkC|)$$.>+$S}L$$W|D}>z?$I%?;=nLYUʼ_744746ޛġ׏3 8474?R~phoh"gy?rohohr!|ߏOs~CxCC?DxGgg~uohohc _s~\B>~P67474C?_q;C?Ǔ !\EAY <_i?p~ĀЀ9~| {a9Êr#<KY}_: ?ƿ5s# y~pco㍃c+ 9YCxxu=hث8 |T> ݱ^G~QEyp j|o{x#2gLOZ8Ozccu'W=O1S&Yë|{|qr vp[Wqл?v'nGcq c=)$ ~G.n?> |=$?ޏ tr1؞hO;޼ ioּ$5+nK9?, (`A-|ʞrܳ><l'9'7{WwӃ罌{:C߫7]= |/wQޏv t n}~̏^h|n m.P'o<_77{ZwSn! |xCxx?nSw#rqCAwf~k=ĭ, W88Kqn9~| s\h m~'Χ5nwwt~ "~[|xCxx? =oG1 , p8vgz/pny|y̏`tbs<|': aqwwU5V_7AI{^$яv>ŏ Aِ|[o_q4JCAnyB_ ׯϧ *& Xh8.ໃ;C>-Ň\ު W!L6~B~z_ ⏢sh8y`'=x˞tCܦk fcգms3Nxl/x׳wW9;<s+7p-6aK6;?Mno^ӫ=HHt 'aivuk% >K(wpҾI[[c(VLuC0a \\ׁ;r}6\8,МP7)nqutY:/֏%-`'j3gM7.Me?i&: rSaUכ02uHP9s!Ť MeU%u -SY>]ZUtmq5}ϼy7747"`ρ;S]ücǖcvy%o+9kci{,Tlyun^TalvjbrB=q\-68i\ xZw &еb,9 fU 5va+6wAu }szkU z_uu> 0`;>׮5[@NRf{/t3Ņ6;`.ObK~qqKhV Xݱ[`[l೥'O55g|w\1RTqNj$^Br;^z",k=+;77>8~tM!vWÖǷqn]kgJfl 9&,U,dl~H b&qI !ISK8GfӺ%x T؇C3a Qe^PmI۩ UHAD[i(yԌ4Gͫ& 1m!XaIQ9h¬%9c.Oj" 'xS5w+]L/c.Noy+<ج1ʵ[n/#Fpz .`_hyn=@)as.J;mOi$Fnn9XRn&q)DY™zQH'@=+(;GL9 cRwaZWwM2{>/MYM.GҬ^Y$f4EPl`+yS]dWdn+<}K+–]sw4#Cooh4>'\Mc}v[򖸍3+^;I5Iؘ:'[ቘS$^c•2cQhh^UIL4CN-.,i0f\NĆ%j#BP! 2Y!Pt3r% yZ 31o$UaVYVVL4(H]X\lT956v͍Nu-\ۃWB\pFp%@ns=e q>!ͧ7z^Ʈxݴtkm8j&buunJ '7jOʳv@׀E زfdu7:<0dm;jOuzfR-y\n)fKcDdp_"*+]g7gmڪ@VnQyCakxn|j˻q;6eN<<ӻ 747"wbf{ss /ػ:s cY4z).'nl8uJ>t vkw\{Hc&:vp8˕LMڜ-d,9ѫ,4exǠ.{>/$(k*dF$=0Z4]`\#{l.ʐd.?swIe'騒!g, g]c4da=5OTـ7qK&b^zr/h90v=)k^~WKvkw,vn{VR v&16i.'dNSs*&LS pIn),b(QLwfɽc[]—'ޖk-Mԫ<ҪЗ0fw\Dɀ-i&2l +NPefșEI_[N c*9ɼ fCu6LWZ!3\zxC(ZzF4> ր;!^Wcz0O&Hbd9UM)^M-+; pKJ4(JRKzjP.S0Bsx˧״0,.vKJ0  ^ыt< |Ș"`2fpyEȄIY EL"r =~] \LJ+JU,^n{W8+x⾽חa8p#=p居,?ohoj 7RеPvSٶ ǰ}*S ֆf^Ĭ0B ]ђE%EiOdf@x` cQ2[Mr [~ۛk!˽tY?+lWҜDi$R2VIdu:Yr{^F!-Q9k#c2̣u2]S:a8ٺ_oJ^WF'i՚CK<ęfk6{B-N)|ħ> FHsCϵ7]w +DV:wIM[`WOd'IA'D، S O[u{GZ"rgZ™F_Brd&8 Z ( 1D8s{]t@/aϽӓqXَbm{\ ==kɢ>dZ$- 7W[gU^"yA*ɬW$gU5˓?V8k-$niⵦwy÷'>\qy#943ݳnqvkmq2s{Jg><-,"N,4YfM"(fbH7 aObv %M7%4G<2s$ad˃HF (I#v-*do) V, JV_vEK˴yt2ȰBLZz!3=̃%[,AD- Zb[IPDE eX"c=IuI noU[W5N5UNYlū׆[lņlzx̡ǞF>x-}w[4^]b%Y+:9ʖP&Jsp7vRbJ8e[X谫>EoP9m J%[z#bIF,aNC'iVbRLiU\,YO5ofy , ܘMAz\+N6PV%|wW7\GKwz|賅1T|Pμ$f)7-Zql`qcr >R*1װK3GIӗH$t:Z9a{ѕXއzH5'K5-$V/H"MHvoThB eHL` '$R\ -,jN@ 7iSpfjJe1o#5KTDT ,PPP2m^l zY'1uR]{ܪ:.xށ65 ;4cc@kpv #ww#yc??ݽ7kW=U4 )\^!>'ӲU-}۪YҪ{AZ(Z 3[3m9l9t J{W\FQt(\&A0c;FS>BDwrIʖx~70$ )fo^ c0 -MpJk= J ,M$$ʶ-2:kp}*20IU0=$0s,w\4be%EkbO8=P@:M0%K.96B3dSKx UL4CFBI0^f[NRI">EcRVIPi0ijۅdC$@㽡,!e)TT3l SVέ?&TYeNU6YKTZ)goW dl{R [y[x=rcS`6@747k:ٶP MyB,]8ޖJfK44岹4Y> 갋Τ,Yh]r'[K(\^^ﭽ40&hime@Diғ݇\ru[ [ZS5<)VmU - X%^ڙN%lج"BփHcW2KϬ*HȔ6O EPuqT<%}O57:.Z6Y`7@747bt(%9ݕ szǦ MGoA:kI6STq}wlŧt3Ms(Y5f NgZ-h ,-K&<6F;(r|Ŭ/EL>z9=,(L"-}lѫ6њ[ғ-$dU m2i!"{qL0,\NYX2&i5El.94JL%݃)X2*RD%l}gmXR&ۚ'Y.=a|Z^i:h)`h%9874g.v:mDl"ڸ'xU&baⴕU#KAR 9I(X`i"LHI؜MAl` werIwDJb$mn͍lm0il7w9,á >^ AB+3S06ѴLZVpIw'I*lބ h+j8@%W-w=OVh'Db%P7m[/1s E$TݐnJŘŵ*G΂+tœ.`(Iza(KhMA; [x.O^]Ҷ|;]OL,iYLo3}ͭ{ g,wɒX ʲ maD.f&ZI1D-/Bm6g`qvdeJf40"]@(2cK)YڤkLBryip%\!6cA#wgp\σۋ}k4X@LeD>3IԮhE(ETMgz{ɴt)]d[,Yk2Õt2F{'_aniޫM2G Y t4fz}3}}5^kmm&H`iMhM<@.ͭ~o>r۾$ m.H&B_ BiFXϫNE5$<#C  VIbzґbmZ0*WP%aiP)4LR= eʈL}K`vCxC?] +}txegewq z ,Vn[glt3LڰHDIO)$= |_t 5apblU <=;5^op>.ӖuΖ<28X^.?x/>Ng+_''wViD[1h}Nu*M,M}D'Hk)E*@~4@ZBUh\5F˒m,᜙t*n0$f7t ii^B@+-H8c y#p¼}I8wqw_gb)Z4oSxJr hog/}Кvԩ-+Fmh=&X̐'͙NcZY'C Y&,5ctK 1hBhjߋDo#Ƭ0ʌCIpO>wqœ۠׸4k˔Af^?7앯|oqbB(/*XV Aߊ> N9غ<[ߝw3&<DldhHrX*ӘH2ѥTے^Ծc@ D"TH,jEQnms{xgU-qR+dMVuDAܺ2(SSM&58$`0w7$J fi -։LmNd`tS&gz{..95y~'~_-T,[q і%L,H4 rl ٣U /6T#}QZ^^=TJ%@MX ḓӜ[4I^%ڗ抶syqV\Yd/v RNc>*|c >z)Xq"Qd+N`JēZ&-@}^%]c `- %Kn(,_2D,i0BZ9j~{xrq |1ܞ-㐦kmT$Ab~7[Cn.)&Z?^a2` ^B"ۚb), (yk7)(y7d("En!XuHʒL{uZ_E)@MX-9iћ|C3nlKzlCϢҮכ.'!jޘG2914IZ4)K3‚`*,|?,D[Ŧ Ha-̙+tМ}?{Lvsr=~loӁ._;^ʿ~M] az4f.cV`V`,a潯@pME f"Kk[}J5Kx[T'ip8i4V6c8emMҬZ-)Ҟ0t|dho菁[n?8-NMYفΛȮOO1Ji&Wb<-h. 9Yܘce$ގ޹ 'ep`pvws8^ԟĦr1sc@X?wFW?W¼XZ_!& f ކBnj=,rd'ёrfVJFۇ*iVY`uZv빙W"X2M }Z֌؄ tuVgw|\8CxXg۞1`Gn:t`~41&9;mr h'0c9<, ~437pX^|O~77pq0]9rt^GP=vxm>sd,ԧUMEtɭ5Q`V6q6(Kb+Yxh=5u#wVGA2Kq Ɯm=FIS]NȔ68^2 747 guy^-ǣJ,Ъ/9Z/YXp&GMl{`iQhNSl"eV h'~l{孫훿?ZQ`~p;QWNmz':bW'_WCNنaӖV npƒf daAf2+FXR=mi#U߄_,>PEi!%|S\^Oe}s }>|p:(ZQwoǯO6][7m/ D*&f1V ,]L,\EOGiq.y_lSWGK>un;ZBo_n/em[”BWmm~ 8I Up^w`\}+!͋{\h PuT#lM@)iJ37$Kf3$9)YiR%0R퍨)7\ӵ8K̖+@jI]QWwSV+wi @3>\'-C0Jswul^)+mr(!D[X8nU@EtHX)\̽2YLNh}x&39[(tC/pswK1ou_1ciS 77x۟nO^_o_ \%޻~;~> L% kQ6aD&dDX P2e<”&5F%OC&EZfԉpXdF1I&)<[#sJ+3ȶWjJ8AW}wm;?:LJ|r3p37wwsO@$fL XziLoM,(U tg]vYdzDK%Fwnk('4 zV[]Ozl5i[|/w> ~ey)I~Ȝ^ۯ/~^W>̋|MȈ2D4Bt9mC^m$J Y-J Rfyl  7ᏂHӽlFLٳhaK}q+<,^ypxCC7{?i[7۽AU@F& @dŦL.KT?1 veeig߾nܒtS'&,1i0xEdF6W>{y-϶\܍M?ts7; ,k.OOW[Cn}9D>WtznLૂl mZh'ݳDIx8B p$hI+4m+M;"B4TrJ@mM"0hNlqvE]Nk9[n߿RRu[s{`zyYZ֖vZyں6EObQKn,͘F"n&#Z߿R[lli>_ĕu7>Z[:2z<{8]ӟy3[z ݴۓZzZqJi;(kPDP&8ՖZ8}U֖qWǬm0g;&o9=7^؜ kt xt>~_i_~QxM~-z,n8}5ik?#I_\,6i'Xf&6d-֒O^M=8YP/MX2_!6˲Q\6Z2b%\HO߿|su7/cJw|Xԡ֟pr{{w9^/.V<< ^_3πth)'-ffN gza *m&!N%MS{,K[5v)s;v&$ =^я(D.< squ&Z&(cZ^/ !ГD)W[;CRnC'OF}Z[|G`gaOIٽgh78}ߥ_[`/4kG,{mL`+Z>lq`V1% mI.5h[AOp|CxCOE^y:9=R'?-|5d7`tQ\@‘NfhO밍ꃣaja̖ןtbjYCmVy+qyK.ƌ=Knq VԀxyU *n%~W7 bsKd6n-Ǐ<>o']q5JlE >> kTi=W=pynmC’[3K]UgNriLQL3YqBvDۄ`hE0 i%3D`FK B+h$u5b_UmU[]s_>OlvѦTx r(Ws4?{38KK_ ?wjrܻOHm LɔːtI)KU֊64FdtXk)%k-oeQV{+H\<m-\cг+? r悕ӫ6F&&h['̜, }n븁V"a%S$X sr3Rk KOb"%̬Z؃lpplמߎK~$pz<~ [75?'Oxx](orٻ_3.L2$X ap% 0a- 0FT 4e>R=ġi^{]'6L/T'6ڂW|kel'mP:HЬ5pW9ӝKncU|빚+ŷsM':[z7 O.p;r~ Ko kdyA_8_;O 2Mi)Ih;+% uZJQ"9"Lƀ?XFnGOOK ڀСiE ;1 ܞ\8- S,.6\D:0yAN:\<νؚ@R&{Ri{Ův\r~ I+kpZY2vjB|?}@•#%q>]B\8f{Be}]^fL@ETw R6mz)d :7)yXr}q6/΄͡^~xxIц=97S~-'~ xY__~5Ce V$$K:.IK%LKPCdT\jB6O#I@5'ѵ  X{cguIkzul ED;e1Zٻ$v֍2EnKr8+ iN~C8'>7g|~C78ݚAkv2\_e|歍}["F [:CxZ >gϖ5'dȓ 䟺ݐVW竡|^lrզe2ڝv30{QI oH#J~n҃umEo*VFoiFX T#|{݁O};'u-=?`?p);-+n2殘߂D8 p-e ض@d+B1]sr}t+0gwpu635{}GԀС7RleJޱ2&B~4Zd"L>ɺ[VhaL5вh$ 4Ad/go`]n|_y w~}]Ø?eg#nʾ|\CMG۹xk}m76XU8i}ɴއ*I$۠ {rC 0?/̆x>Tݿ >vin^eK 6=fl3ySI g nfC\|#*Y``ڽ^. ,pv&nڿ:Z]1߱ry_B?k}j[6p%aw=yM=hAXv7MEOr|) >E Ǽ9vN~&1 ][Sq\f[F>Z妵'J@i~ p[C.Vy ~=[rzcG՞p,%4Bއ{ WJ3RǛ'hqaǀ]^s:47C]LV^{lqytbb!;mK?N2v27p. n>ǀ&YϏ@ˏqz[Ǜ2W~H` QNO{ T/S_'`b?^f~ep{CxC/TDZ휹ܜJZx4flCw3:[vņ׭J`J^ ؑ{;1WY<엋L=%y j~>N{WjlaMo/iFv2XM+VSWp~A687McŞU׫j;-Oa0uJ&eK mDFQa@'OZxT(rۧepšCG|f֡GêX}8lK' ,K^hCEo-3l@nho|8ޒrFrx o.y( S;ys[ȈwS^)Te|fM _Ai܏/Ѧ™>΢2>ΆuAƝ`V.;֏~?j1X{ pيPJ<f!̼扆Kŭn XZ t'$-Tw|-zkhρ\g2D8+LvM4v Vc?p/(bqTIJc}6K`k$kQ LAhnc-!GǫogD] nIIs]8ޯI`:q-Z^r=DJ۟>{po(mύ?f~?7Uc8< m.xnP41VvC.9-uf}Bq;ozsvnϛ'S:Sv N|]얋lL$YAI÷{&gMϻ % X.y}3zazv߈4%hԺ@k<^?™CxC]3bÆAuω=gɵ;z8s}8Yws߷ T_|N7xL-q6MVQu򞯠':\!oճrHit~;;*ք{747 $,K8s.P]_imE?nOX.aLbd6/JΖcoTSAw>&|}5c/\>(}a;P59L vڵ>*zT$GsI|CxC?b]=̫9(:p|.;U I6VVj?ohDž-1 xQҎBqFvqD,7znhoG6^, =7Bs7]WߟE\[k0X9<=W' UKDspfJPI* ?yDIy֗^aufc.NA 6ݳ{w[ݒ[;=dm uyܚ@j͡L /q.􌬁m׫ӱ %_T?9l۵:8ƜW\ȳcR،rg00^iYghho?Z&\]xerwǵc4]|ޜ\ᔀ$2@xW7>ܦǀ*3+MGo}<ޒۿwaN>=Z#QU8pk Veіhq\~%mU*; [.՗i}va}׺Ы`9EHZbhH-(%N@kw#S*VC#7747qK_z~ru&̨NC|T= ΄B,EQyzܪO 1>"0Xc>8:k{G-o7`X?H =q[u| fjJG34ozykhhoƉ+l9f8\*4w3(=3wP0f WR'zXŸ=N-|T.aRl_W 1~)~,8P&nrs+Wֹiz{bB]X@st`+b%kի(X"W QM- ”kNzηi Yv=loDޫ01j7QPݏeL;<[_#BIH] e| ;c=k-? yԖޜ{@Q;@mft%yΖJʬH yn_*o.|$_ක¥/O{n+2UqjфL]"jsWSz=xz(s=eV=qX\ޜ1B ί&i-}I"ԝ\L2Ha0╏|3њ047ۿb>VjytF;[a3y? )7Tge^ݙHڥywGxu{Wd=<&Dٯp w^ehlQ4MUgPuP7#ëDdjkfJ\h>>Ћw[kޚ.\Y`weRTg&"[6x l&E--jbsvXA-1&&~>gw=<tSTsxUAK}rk$M A`Bj9:KٿU?F=UZ4uLUxEKWʦ8 w }t}O?\X?v܀~ '\nw @X Es;^"V@5ȵKx3>ZX[?E:Tbu9ݭC75Ǭ\~pzk%X* !(Eez&R@6˥D^<R#˜^cF*5 }|ZaG9kC-GWV9Uxՙ\BLiՎm!iuR\aC7n-6_/>.}y%Gk?@`: g&Ƌ 8O~:la빥\GS0f=}(&e O X~^~%N9"s,L2 Yg5A1Wp)T3 J@`e o.~_ik>m_%npuËGCח|zK-$!^H[`&tx-+aűHPR+R٧cQ+fO`YUKpn96647zZk4ǯ{Hkk#8¬'Xyv}^P` ]xЫ0{K.*H™-'I)HӇ`Ī5a  WOB닣L;o1 GN%wm𪫐pKt~Ґ`" Af.anos;poˢy>gl6 T[0zx *^B% ϾeADv{hU#G(RQdzP* 3 2ClRL]=@@u6Z"MGl އzO-Y ~? ±_~]'`Gի[pCg,Ň=yWw܄~x{_;gXj!HI! !$3MfD% dC5מD)]s1|o3BUuJ,CxC/V@'-AE=wOBnZ4 }LXEɑlj(&0ǃI:AV(ֵB>w!]| /.~?/gy~yv~t=:~L}{0\mMw߄m P2-[x2M SJ?oͲPZuKŭBtɍ C;v;_0$K_=Ⱦo$wmG^)]e[NJM |d1( !``h3.YBm`jIֶZMX5N= }-}#9>O3I~Unrph{>숼wWOx&~ed U+|տiWA$B!"ӕ$ɐ`0%L-3%(A(kIX,QDoGd{]۔h!h)-kHRzNw7647|: k ̭@zRQ2zf\AֵlPJ4$-TS>naOz{NGNoe[p?&%~`5lx;\βcv|m78BG쀫ug'ooDXV"h-df5RZ\%Rm zU%DzR%J3=ҮKoBo>JRlm4V+'{L܂.Ϡ ,UG榊>B;t~r~Cz۝E"Jf4ӗ2AJ`{DD"vcJm.[Hi6kNG+t89 ZFshoio?DpSJOPiE-Z :e28:~P4YBIE+78/SZRAd*4=ǤA[5֕cݼC];WzzO\=^0gesvKQJd8<~rkVm!^HaL0P)L1M3% HBt `\ P׽(9dT"ur 1< _<'3s( -Q5-= IF%0fHL$( hK S ;kۻy._>lDPf"9Rj@0d@^ޒMc"{B8`ƌ~_xKN/+ qs?T $R @h 0SiLWrK: #{@V5Nļ.[\><~xcЋ4ysuHsY^(m<e0 }&y *( )"LBmjkʻ_~Y4-:[fV^bYwD- g;neZ^ϟ:Ngn3D^~]R,`ٲ)"a2HID12(o!PIQIEQ"2%IFVxwyͥY8Ӥ.xK|GӺRG r3B ȃS `D-e0iΪܒ"CIK2(*4h*0A cP2`LCcveo~篿l}bMו3:W)%oj@cy"[k@j D,K&h#5ME0#JhU~%DZJX/lٺ2B h<9Zp&hUoi-a+胗kpd:H^#=0]bct-gkd6Pl DLK4IDd BV Lu $KpdrxچUHq]-n7g*O/a/ga(;sSX\ꔚg_m]z !Thq % ʶ@T c2$6HFt-%}J]62+|0rtxC\%Bþy_vxp ;P[|v&V2OC7o4[ZO^L+F( #I)I~$#Y a k5Lj ~&7[ß{8hS];8(WNr5}OU5f{pL(,&|x7v9ð5POk{*߼́Pd"-@0eȢ2i\f F:RJDkbEkmD#- x**4fYI 1[nLlS%t-KSzgQڅ2[~}<>Լ:A@ՑS l5)EBbdRSɶ#%x&*3Y$If! !1e XozdAȎauO^ alce]a|_P p>wwu )"@&2 FԔ9$6V2+4 S3 d5 VHSuF%ĭ%- B[dS.VYy-uCX4477;{/C(炜*Th)fNr1YIc`!,|UJ9&#r(KZ2DBmU dE#逥3wͯ՟ln)]iAEZ*xmub èvp;q] _ANOaʔG]K6 ԶEBdV)c"ڀLGE>IXD%bVGZ/܏f,ۖlE:(Q@E)k#<mcT6ӊ- KHY{@ S ^}2f,w,"#Ț[ Qj/TُkǶyz+piXȔ_S6%B!d$3AT!RU932ɬBϔe@T29tք0&$,3jg:r>D*=K1,Bs&ض pQ6I -Bd=8 747z<[ӫJm \z h[jy®:3q=ж0Զ0Tx&SY2:}}\r]9>H:=jR̚@TSe(Rfzoޞ*Eߛau5؎7bFAnln?WK4I X E5 5 YIBBMS3Ba 03DzX9FFRp(Q@>+jNj^Z.:Ҿ`kֈ WXt =xZ@}rR+k \a&5tLϨFgIA5l2X[M{zkdMS i9;HB ]{^NBʰ$7k6_>twk- a+ewz[;lQ8v}1#?߻DT)CRMf &A`.J)D)2*5i d YsyȄ"JܞgzHd06K+\zɥ쮼;~X7A0e4rxCOԓ5zp8K.OHҦՂj%` pfV+%Km [#k2DdLl;]YI*|( N2`hE.V-#JW 39yn޹vz1 _+;õ)=߾\߷~J ^b[Zׂ ! 2ȠU"Ą5& j`nSD HChmP!YkOɐUDo a6ަk;e•f0NLJ[g*nDp ~آȱR Q=VcbFlvtD'@4`Y5DRjh"ZoX`.PJ.#n?8S{iٷ,,Ɖٮ"Ul_6,Wk~>b^z+19h$ȶΧOɠq5̾5%F̶-`W^Zef,` 6AdDes@j}|Ed2kQ0Rvi2'uk. ^ ;w._юWh.A/A`;wtnm$tAVY—'sJy%but fZ4AP"l.V)sڐM $0Y!!0Ad 7)L^_OYÏjjkC]*5:߿?ߧ٧'ORn )E3Gt,T!!AFͅYoTPA x|Ό+>aYZ)H2ճ$XZ*rk*a3 4w+0VQ7974tsX.[GyM#1A瀽X Xi+ۮ_AlڍA6ȺCj.󤭹u*&IS@ֽi0orxUYߞw@4(/@@"O|@<?<ݏ?WGdB CwlH@^gٯ+cfVUYdgw f- nU@`AƎ`\DuFhtEor8[Hd@AR&[h(Z ѨC%CKݱetE~ ?DwͅyMwW%;훏gy|mv0Qht"V<aCP3\ucNv3d4yf7EvZnd  _5j{v=]+bnm}ަ1D a Hsn`嚵 Du" MFdahp8I fQZ٠ei?8ej@n`b1|Z@m{>hՌX .5a0t1[M2ք;_Yق!㾘,͊ ja.v7&޼z{$({}ZcťB U{|%KuY x'WQ+={zگ3 g˫%[Mvvn&ѡÑaց>:։hZ'1Wkb'ea@b`-ȽB0Aa1ehr YX䮠hf 5Z92fA. )[ !72X6ϕKV匊<*M(gQ' BEgk\*0<]u)ޛ|9)Бk˞:hNs]ڹpvN-xVK*ۏBsAtW̢W1 WW)(ۏcv'Q:hYi{r2_}n@s`@:.3j ,>Hyf1LlFe͉hBF0 zyq,\9?2ofyWSX3F'a+=ٸǰѤ [$sZf& 5M01ZX&m`Cce6c@kH\҄ZFq.)Xnz* ڡ2aY' &:d`bfx)S‚ );rU(L̓ Arߜ7GP:{s:  y91G+yt4d`vF';w6~ș2iE 9v+m[S.ܹXIO_"<#Ew:K`ExEZjxX4#b h1т攁e1i3ŸqB8DC .@Dk! ]ԆؚB0T7{ j~ 2lyX2[X0w$c\,v3rrsIeS7LεK$Y0B`b9 EucB[6!uޜpa.Нpkv] zP& 9t7~g,a؏-g.nעn>&q깙T-^n;zo?}~_m|̜ve/b|a4m7 #H=8^yReZցhh[لH0`4Z!.X$g dBH6'[1N PQ ()s_4+#:I\aLd5+$-2"tYd?0G#;'BћNsIYBz.m̾<ɼy7ME(1#Թ4SY>b S[p iqzM.uYB,JxśOyA?( zE(6)=nX0мIN-zr|yԴ 2R 0Xo1Rk0D S57F9EM`1!p4e@ !W%b mSFϑst遚#9)gA K%DU.Myٓ.bi$Pb'+\N: ApnÙZЙpc.1Ѣ;V@t Ns1 Mk;m|ݥ;®DwvG:˟MBI+^{B2t7?;g/~M)6]Aphmtj~6c ەz7ü>Ssn=%{~" `@wC)S<{@}#r*bWSO?TwqB3| "/l5PM=x4uw;c:ɥOӹmzmolhW+SP2qL :ࣱEƆ!H@rG*d Ml1t@h fAX7Yg?M , "p}Ct['}yGo>5繜̕)u.'D&څƽ+w/Md ;>,M‹'q_! %Ģ&s~wwL/ۭ>?-_z?n?5]^kY4w&[) (iQd(2ljy{gkR3Y (Zpav 2Ec`hl&( X6( `by԰Dzغ0gs!ڼrȎW\E|D~7 d[9BXhYRKJ)x 8-E AuS i#:ɜ"Fn q7F/9AbpXcLsɂn[ &W)˵ci jL-˸G`$VWpTj_1y=A?m_<6b =nXb '6r=X55knT-bb xd4Gc'ŰhaGs[ t 2H01F`&6-d NȍB:<& MasK¼r4gB ѡ ܷc ts\⪵u==РlC0][׫vA`8n\Nd>ttx}wOۢEzEyӬ6O;߆ND53;ۉ>] SZp녯1L "(9 ZrSJf6D [ Fl f-tls|\R}&1zXг1=f nhY?. E0- DFM WsPjcnFW `|!es*sj`G&p#0 Bs3\9wcۯDYVjICp؋ >_.7;-82N=.K` (+9yRHO>/^'=Yp.چ2qdbh:H/ oog!EzY߬ukjˡZ3u30D2s㺱)LjDdjs$!ǎ-hWdwHgZ6J}P7 nKhErG^<0Qz<$N-ȳiNONCBcكO7Dz_gJSW}~͜wS[Ȯu]bح.#Kv-8Lzz7;eםݝ,,&[o^9t˟d3pbƢv#rPgl;m7q>!+L=bnpўb)hY9c?0!K"!0ɐKW$O²xE!EhNЦ!g膜K,Q,2 #C& G'n#D(fP܍q=?.1*` qUXguu]bq܋/.7٭vϞ(/Z>=Kz}mj*pd|UCE*( 6- V &D[~F-ZF\ =%(%R[BNhz X R g3b>B4B7u IfS{\'4{ʏ\a V7e77,>.J[hR)5㜲_[qi :,h7YWzNn& n\2Gt3 Bt%8 ޴_)-װc:%D)}66a0Q ƅ?J.ΠۡNE.d‹w] (";<׿[%3oˑD5Gz]69Zxq-ΤQ9ޒ΄Qnsf}\D10e*M̳⳹-AA5 F~La^Wn;X Z<]?jq~|RvB7v%WJ N~qZ㗙\Ǧ|tVe1y%+ք,8XR]-)L5q"8<-iԹa⸤,\nZZ3O#mYs*C̑„rf!ΓT&RnnLzV>iƮ6a4hF = ,0_nȎxW;}ݿl‹'ǟs)y.c;M-s9-⪻E/:(l=՝:-S]e"ENevEa,ޖ“~}? 8qycz2\!}i:nʼ:z۔^`e7 㔂[f3Q29E-煰/Sw.Cv%W+>S靊O&j{Ƴ_D{kE/">nbC#̸硷C o~8^IQ1'G~o^Kbs;Dq±l]]뼉Tp?֔m#Co߰ձqg6y:oݣWTNw*/|/] (*٣w9c'<h{&n4"%nC#,ӈN>dz羿H!Vir`N$s{֯2+V~4]"~֖4&iY-s硘qaІp4{gkq/g\Wd7 q vch. QiKyٕ];F,hP'Q_v6!͇|PD#5( T0tح6/zɉܒGs|.)$^Q+Uxo+=[1h/."#ޯ/͖Ǐ4csrWۯmHZdxEb'[8bcq.&` ;`]n:X V[qA _MG^ :Dv$-y݌>}&ߌRxMv%WviR9]>k᧢;<+;tL]녦WJxF{Cdyk&D!xWRJ.,^Q+>>P.{i!]%ƇmvnFrw/fC] (Lxo!7)#]|[]ܿ?8ѕ^m%6ެEEvk+7FfotɮWDxo)wR|Oy[D(^Q+oa}+ٽ5~%-zKy5k 1@#j]Q?Pv\k@ޣx}O?_Q; !b{!FtZJ%W?K&s~(\Q+?5S+JxE{LoQ~f5%(uQKdEQ+*J85i(-((JxEQEQ+(^QEQ(WEQ%((EQE ((EQE ((JxEQEQ+(^QEQ(WEQ%((EQ%((EQE ((JxEQEQ+(^QEQ(WEQ%(WEQ%((EQE ((JxEQEQ+(^QEQ(WEQ(WEQ%((EQE ((JxEQEQ+(^QEQ(^QEQ(WEQ%((EQE ((JxEQEQ+(^QEQ+(^QEQ(WEQ%((EQE ((JxEQEQ+(JxEQEQ+(^QEQ(WEQ%((EQE ((JxEQE ((JxEQEQ+(^QEQ(WEQ%((EQ?˖!IENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/splash_anim_08.png0000644000076500000000000012040412665102044024337 0ustar devwheel00000000000000PNG  IHDRjIDATxٳl[vއ}se}WP $@%lDH&Cp֋܅Q'(Il$RTDC X(T_uv{c|~se̳inSW+]FKI]6~CCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCxCCCCCCO_;xo_SO~sW7744@3CCxChw384744!<CxCC |?Cˇ!A?QBPO}"Q974gt!}9?yT }`pΟ>~@G^c?jg}< 77474?W }PGy~Y0^^E8ЀG: 5sK/ Arsr 7ý0it[? )&yl}{0 ~[4=Nohoh~w _(0x|\ ǟS@,X/77H_# i~$>sy kx-nSw>\68?KM= }=9?y\^dP0!~ww#[-[;>R7B缃W@p7&wKx7ߏ[nߛxcD777~ x?ؽhݵ/rO5? )D4gwortk͘1|W{no =]?"UxCxCJ E wk ܲ.prs9y7-Nv - }Xm|NWTGwN!ν.yVm"+7o-un Z&w-:>y.p7𦮃ޢw>Eww> (ςݳ\sZ]s8z[Mz!YNv77φ-.u S\xxqu #£zWN`ohLZayBBi{x$RЙD"N!G+F;uěܝϻ<;/\77.CG-<1'MĹ]l?e˼G|z۶2?C +m|R?/ѵGWwa=@w-S+8m\b};vi5ׯţiPnBG5c-<>*daWVC=nӢ;Z;oǗ<.7 }0v }v^9܋nF7A9:q=|Z_Wy:G>:GvggԚw:|p )0z\Cq]AѴyñi1q7uJ6 ֤ 5S]ʾbsKTLV1Vn.<`7+=x[կ]=?:q8(އO[}7- }PBy?T:-&6x綆:/נb@kƖrkx5kMbU& 7A:[1AX;\)Gn=B k<+6Teكz VCh⾮i BGӟvBhyv:en=NDt앛;=Ob`ZA8ssW` ` t8p8]Z`Hf&L)%2DKF՚DUl١LJI;ws`Zi-<%)C<lE=z-W{3)0o 7a9~,`wZN/X˅o=j6GgMI{'9bXA}-a*+=0ׅ7R!?zrzC9Pu~t W[ő-;\2aGE+[H 7ج, 3'(G<h8rk 9\[xms_b+Gi.Epx }$~^v_=v]\]`jnLiEǠ3bXiNY?wے[XI!{NC]l ZǷ DY_REI/aO}DDLB;a.?yJ-pT$\)SadKrLos;vr5gv3/{/% Xw _;Qd\C~`{vGV;{/۝5؁-@uD2X4%ʚī;ewk+ZU# >,*cN0䱛'N@eU]zEZV?YPג8*d6S!b(4R4aWr+Kb J^YFeѤ@`b3&nu<8 *]捊=^Ewm|y|_u ol@oh4>o}<8:w;c vZ+Ak[s{[h}g'QYbwp(ILD\{$ՔT| km]@IhWfVuzzK2a2V%LG(0səc,-E~J2fM5}_̩]=Bw(X=-c=U/=-.YCK? z#9ѝS]ޖy4w8ǹ-yfSŔ͖HDF؈;ML 8=hauL ̔YCJ3nFKR L=%"/  ]Z*7S{M pikN/*B2IBMf }zeI(Lb‚& 0`-,@)WfmI*w4iנ'+np p =m<{x%[6-.,Cy~x/BK;K%gz%[Y,ؕL:)&'$SV7kdtÜfɥPE  $Ŕp,o {*8= N|"BOP7}OXDx&\oEDiTLPVdPJOG803AMrdBPY;zM$ʭvpwv<%pKpTo!6oٝkU~XsCohh47ܻ؝ݽ*l9ݷodk]7#'4 X2E-e2BT =eKN/ ,u ((Lnz[ݝ X_<XoU8cl[I<-:.+l)*d܇>Ds#`L*e.;0cǒ^ fV–Kn\zD䄝v4q+ns8˃ęZ~\==wش(hqy_?ƯQC#97~ x'™C_݋أxivgÚT[n Ksf/:LbThy;JJS.cZwmn*s 9 r ܄C&ģ}KA,`:@1 >n B|(u%i"2rzU jfM Uxʤ)rx[]?Q֤*+Ҕz3H)wBnz;ӧ{{-[WNx/z!d?NCoր8͇c܀|;y.&fնUjZ[)| eي[I,n&Fi,Lc!Ȥ%b-hFe k[蒁aD5uf+nOr6ֲwtZxSk.ÛЪ3a: K%qzM2KU S&P$3 2Td:vn]"K37:`q/ptwusb|;#=GxshokIpmN|=ؙ`W'<3ĕjibpA&HZ$KdISILs7dp,K 3n`:' N"Yrx0 j J@܄`mNO-aÓ"0SES i?eInbb$]AAPgL/ҚUW.Kŕ Z H;Gw >;ٍ'8}+r ;*Un޶ܝRZlSȢWc.8-9{iLFt9=j f`&#L! `XSjI,YU[UJ['q _ OZe4'[4S$ou\GZ> KA8%M(JTCxTZ5KP,*UT/9[ DYYHb]bޠjdE ]1Y+'>T9q!{T|ߎP6n\)&"ce*CV.2)%˽{k9>xFf2R " #A[~ F4Ӹj>nz VJE iK~NeJoPKP򟠔msH2JC3=KmM筘0!n!+-1U)&!,*f֢g0+7\siov7?n~\UKVVV6y] I˜|b(+J%AZzU4s[kB EZ8Iii"i&KhIgJ'e4ITHQ0`q}.[v}50 d2I!̴^BesTez@HK2L3=-Ri PaTn i.P왖iJp6L9oFe]"/2؊}0ʕ6sUF`a7S^aB+'Öp|F\Wa/LYgwwvg-|\mU;sZ~.bcur|2Hd-FI+Q t(#$3O*Jw%NQfaf t ֶAPÒ-) @QJL:yF HۯoM jXYI TP0ޓgh)ii"&QiITH&N"<`:rJֺ!iP&(dԩR^!tye(VaପXiĽKL,k v@o |oڛx#o A  =ݽ*ୋZe.oqw) :ٶ`lţc-vx\!݂Yu,ȋ &Y Z ]^$kB4:(3ڄ 6zepŖ[9> 6N-t @piI'@%I%Ze',҂dRĠj3Sd T3 }Y%ښ:& J \KKV9%ly֪MYqmRʮ+lyKYx}Y;-t ^89474tC _;n^;;.h:OL,kFIKʢ v.PNh怅yV"U6nF#i%Ô3&Nu--.oq ՙCCxC9c]ּYQXPM",/Rww::Y*v[urwWg`h.i&Cmp M,!ˢ23]4KW>;X iҫ#pYЌ f*pNKR,H"CB:h-d t(~SDHZsuD. \] -x$cHVBoRo- fIH91"@@@)Hf0XZ * E-XGbƔJ ͢4(qs&C"TXaVrw|pk֜1%{6`w= 747n|o]/@8ۭ:Txu}٥mC"ظ1cbLhm 23Ln4gE%]rL3Z:ԊS62KdFh2]0fnrK#kefI, Ύ|Z{ˮ}ױ ,dK ,e@6IK@k?L2dpsh"I% t0*Z'p!0]b,TC3 A&._*WTY`e}׷S6Ops }z \ÖJMxxe0e-T婢4YmfN.KɭҔLˢއNR0kaHi0K8֛Mf4e+d[,dV4 Q-fsZ]ʖI+c {+r6׻zqw@h*dʁl B/&5RYVÒL*KC`0sI4̅*UN PJuDQZnteت cc*W - GXГny~GgRL3x5f`wGf,ckO&o94,s2dP'ha>Of'8LLO3c24QE8D`&ĞKCdB1P*UIj]Ú-ɶ6;626 _d}-PTJ'[ K ! ͈\1ڏD64@$EiL&YX&; Q+Ԫ>,գpTۡ|x^  Mۯp\w sHQ!G hr{Ƿ( {Cxm;xu&PK+h1Q*NLOBN0Y5sU_("ݓ.,`zhRQth5pSka[I2c@h<mDپ ^Q6|3 n X^ G018$x@p&肵eڐl32pd_(%ZE m6FB@UxPIY 0>h3:|Vy:KQPW b.Sg7czdCxC[kqwY 3iE+ ģ{wۂf&q&p瓑rGS)S:Ayhh[zÜ"MOi}wͅaZEއ.Sswj5!w}SEǸDB]ݫjt^%S7M`Vڮw>dwߜnժ-]ⲚܵO=#Q ̀ŌR$*EnB遌M*66y .ٕ&%vv %"Ԗ@atЭ2xYo| j m$x?wwۏpNg(- @̯ZHs{ 4,պamxs6+D,4+Vt"]&E#X错`!im zS+5 wYx{sy/lmCt6tqXg_=[z嬟÷>gXTܴ"_t$w3Lզ6JLt]*D+\ܜL4WYd(5RbJQƾ5At$ irU_gZ(rqq{[F;vykgpp}&"s_xΧd+=gUk52RmhWيXz$CI(3j?FP}ȶ1y cRRBd;Ȗ&x=?d݆jˊ֦qwy+iy\ۥk8-w`5/t`aL&nhaL-7oۚTaq.VJ -N(2'LtmAa9L𶼧|էX/Hه.cvMHsAJ; u.y%ic`>_B}mw`PVYe>H43H7yz@ѳ-۞(Š/xu`ad+paO mJZe َBpKEgYUvd4'8!OQys8*z8;z|š;TzhoGMoUgږGwi yrXXےhk _"eTk:-*ŋNVZWebS0P7"YzMLM%=ɴPRtQfi&QN2ᔕtăϼ<'xl[98—} fN*6Ύ3OC0c:'Ov5{öq&UO%#  \-i3YݼHnѝ[[mIF҂f[ Z"V~߇2Wkt~~\Ģ|-y2h\8I[oWr5po7^zs[R׵* mr JRP6I`[F$˂l)4w.!m&\er$ :Kj)ձ[VIeI8tkk߭uxUxh5O  nlިͷ(n &APNf}++jM&j&gq??h{ɭ:wuu.O7q)hYfk|_X;?zq8[=O)o@DZJVb@F!Y, L)D'ZkG@iOSZ t8BIai24O7s;S3َj.nI 69^ncЏnڐ4=}}4M@ue̜lCYHX etg'Y[j0*M(&1Y`d梥xhxiL-?'[mR4=M?Xpf?/?o~4hu`aYg>cv/X^s?wDxTR ꣩V Yd_7|6%eQ(HUKZyg*&BeMP4&<ڌy|n;rr\Te>e zna>Yˡ{,$DzВQHM`8QR SfU ͜lI0IoY"ZyHl%&0ΑȒ]g[=A :*^oEt|q-3.M˗/[x/돑=& Z JKq RmD4 9e:YڎTegfP}e{ S}a QIk pv1|[IXJ'>K{Oy;< ,!+̾ ( p j14 l3" $eX.!4 Bh ?'0bIkI1͉%pН7p K^q% Z_g_^¤I$0$&%LHysv)e7  !Iٳ.LldslS 9i.',{kvÚ7n* =[tuxN[к4_m6; D15'Zy oZAEu  myfo?h L *1A$b^l#Dэj aU|Z8ivn\[r eis~|o`vڹ ;d?v|>>&}ίO}}z#\^Y%B M\zS44d Zpijz³΢j3=Ooݪ@H 7475/ XVN.JWC3}E_\WY ڲvpk>WMh[No}tGc׼vqwO\:Li'N/qxkwc²?'P;W_w%%wBjΕ aLL:3mڞC#%VZZH\ᒔmjMrr[-wpq[8{/=eaU-E-ft>U='1 ڦ{ȑJP\Y/f1LBLJ $_W:?C[*y?[ǁ61qtr r;?u 0[ ޺ ٯW' -%,x&))e8(&C\ wfj\G/ j D^ڙhؑNXFsV;C'^ytLIdiK;tPr 4ҁtlZL,`;mii[o (S\[γDeJYdWOqc8qvsrív خZ!Nr1vQ~ZlYm1g# lx&U޻QA@SX*rJ[;s- 1<{X;4Ћ-C]Lǐ=qAtв7K6EAʜS$ڰtZFsF؜Fxsy)ڸjȗ*iOfkux x5W۷P6.EPM9:q/*u/)keߋV2$#-^ai D/;ZH*RY5;lBϑohoB7WysԦ]Ҡm mldX,z.Ky/iiEVg2@ UXt.Veww`w6Sy9?ZY9O+]x7|ǽvׅ6ׅB)XYݞV[E⿩M",MieQm j9?Q[*dFukeuZ&bٟל!w\h=ymغC"fki+UgR}Xtt0[AP7}+[NoS*6$Zz(i&L˦sdHҊUmр/ /?coVVKrU6xwuN.B5 Vgp2XFC$I DB^ZKjQ x%yӯ γoS9rxe:5 Fxua_S(tb_mDetcs 8UPK.)8֢0\V"uz=a v& N Vީoz~ ^~*O|N, u>o aŽW?G#mlkt"Ȅ4zd4IQmG^*%JB$JeyvC-"N>zڀmZë[ӳhØ 3V7lW4 j4alw"I8Orŀ3= tM~B?3~w<vNLM@2ɟ}XZL(epsZ3y+Pz*AEه5O۱cl,n6і0BM_)eEi!`mնУGQz)oQ֛o<MՂW_í=dtFƚ?"[w,;޼Y*%LZr|䣉Æ~r7;hg5>1~ -p< |l~wevO[!ӜFfá: ]z6⎓i/y;`647t8 4WޞCKj|rp 3&$M5Ԗ0cZ/~XkDNjYz>.Y?4CG}<ѭs[<WkV<@6,i.nh!`F;,ԁq?bl)TRITVlN{׷rtq[õ }(a̧dd>Ab-ǡ3Am+E*$!0Q>.-]g}z:[3w?nS؝pnrzy/=;~–q 0cWz'48U=ZP'7Zh< Uģa;XEg§k͡zwrغ:6ǐ[v~2sUUbб<og+4:8j DQ &t0 '-bk;eƃ3@}e~㯽]a%8ԡ l/O4m#L?- %-`p(Ot  =[_ܓ.z7^L\rwLwG541=4).imyiC'uY( 7 Gj79v|G,qE_S\V.O-лȏ} }iϟ"yImZ^/ÝݱU:j[gPa9}BxbGnּ.K],nvlPX3ئ!WY$_LK 򓖷Xߏ Pv\C\x|3-z;Op?[;`bv /}4|9`6 774t;%i&w UI]5f/y,oŽ*9}Ks{}N2MYܝط%p_~o?V-P{x '~8٥}[>|U',1#1`mr 0dzX)ff'vׅ+|`CxCϯi:?~~v=,.nqwbzlF0\5d8 f{ ej9B.\ԏ\k@Ex|7g8m oowpq;.R369=+ݻ ^| 3w߮SѭQ247g@ 9vÏsZn?P]9sI3Iu7{"=Mt.HT$;M|@{bVөsZo5Pz)XYWϹ{/eY@@}Xoonz…R{І~8`ZrwmHǏu{B١'^"'+,WtAaLM#w?{y~}~q;47"_yig7L-٭z󉏫ڸuQ>)%G?sZ4Nnj9;;h0ijPwuzgl' ڛ|P1bu>r4VlݚތНt\\Vz& HۿF١xe_k6*NjOoUMwm%ٛ.VTxSOVfW|ǁu׀FQ_zD̲~Slk$xz[]NMCxC}7Kt }k;XW 6Ѧ7Uo+m:P2IT?L~Zq _wxrF<ޟhg@ȭWY *_es *`)Jb=V3@747 1hV AHB/myKWu>SLmG,kxw=t~-~?ruqaG/ss<:8q!~ ?b:WJäJ רHo自wǷCq m^ : [-*2փ9vU K0|_-Z蓺x5hj敻[B3]_?_m ]Wp~ء-)q =1+ơ =kߪ`-ciU0&09;aޜ?o 7~ v=v0:.E'I=u3iJ>Pг+8+M,;@z?44\!͡ MP h& C^;v`{w|@F0nl~Im?}*6A~__fңkVE/xmK#b%~;*7`s(\nN0o  *3d}.AEʑ>^tq+0ar8_s- K3쉥+V6bl<;P2JP5 H%hGN]Z?_wC6E'`Uֽwk׷}]nV`j$J\I=lgEOL_OL.G~07б޻ݺxv4Oy/dQ+,D2 K mbJz)hU t( b8t#?įKCM2>ϬK|T[;qu7݀uUkG'՘yU`[0%j ]6Gء$v\xhKђ{]Z'K QD|ϡ[%[:nTv| lP+w\?O\q>)lnPEXގ^T*8CTeIKaK@Js# 78476tѓnj z0i%:\'AͭX**BibUPD")E"uh[ ;<~o|@ - \tGvauf p'k ȄZ%`-K4G $kκ{jO[p 8zV>8zL(zq+7>}Mנ'oW8)Z_]ujS0@> }gJ4DIY: f/jIv!S?x|ŋ`=w|⺸.T}/#BYO~/c>Oup _҅,~Zx3B=~2WR@1語,^c.72dPfITTԣZzNo@ _^n,nhoSMTx9CUe?,*bXAKcZ!̔<Y.޾z\7\@0&r.ҐTM^'wtBB3'@Vs؀^-a/"r$jiH Ur5jdv$@&%eRSՙa].{2c'Z -!Q! ,ڷ1Hr5eZ]Onqx=|ݚ5<_cތjVWOlmhHXUnf3)̒HE }y 黜ޟ<ʝm.>] LJADL Lf䢠 D br~71˕kaCQK^o[!K{x |42O\ua\9v[8 G\),KX3Wo+,]ZEW>e)+ō>u=y4;[ͪn^o(``~lxJs‘V9:f ,ȰI6<:) =)*ɤDEij=zʪ!\|>yB{'!<[񱣶; CɍOy-oxi~᭫2QyUJr{û? a^k6O%R`ȐJHCXv y"wHtUdϐR%s+E>)[j-dYUUcÙdBTr*DbN?{'<#ɬ4ERG=[M_?8[YG/9P>9P! |rwy x}xXoqxw_B$B EbRO!Q$"d2Rewm)%}}Ejg߱ {?ux|1`ٚoZ{&t/ɖ!̤"6sϥf142-U[c^nݼ:׀Ѩ$:7s+|(w >6!'n'՚ ~7 :,?PQ@+˥plCXk2'zzVxVÙLlVâs2><:<AoZvZ,#\!/S(MLoCU3D *J&6R23}wG낕E+yӫ'No^,,qb۱u|gn~S׷@ P@<`sO\ZsmZ 2"a?A$ZlA[BiZ{u&+l.T Ibmc•,T+tW:m`A@Rb#=/=ϥkT`Jǥnp>I*15~0}e]Q™o.0#pldRoԔU@ݛoi+.:moEr? P1X{}4f+RL EAUA)MNwq7%qP?n` }0mf-ήNSHOx Tz/,bd )$!L4e)@$Aa֟{K[>svY_mH+֖Ў~ fDw0-&y<ٙ~ )bmYتf ( ѻgq\!0Xհ P2FH $2` v%UcʌM!nx+zpv?w'^:shhoz]Bg/Cw^oԌk>'IYmWjEYS&y;CfMꫵ],eDۚID[k ̻pw~qܬ랮`ļaspܟC׶<B-Tpgwae]鸱=~㷁w}@+Ufb)jΗBY#QLY&u abLFm$DLx,M 3 ]k,ܪ1*\h!>^i.s7 531#:u+'_6sz.gg62( zU0KZC%_-g׷nbf23`&@"J_zAfZ/^IQ>^W9We{Ǐgx z+8{>xmʖ%OZԞ ;_/oÿy7^R+NRۙrK"2A Hq} Kqb@Tʊe]f5FVi `uũoO0ەH=YwanC ~M3àO+5z;l-u7WG:IKff-wFAXD J,Z+`!A1ȄeRJQ,H0l|kOz@gvBn#"֎"=CbmQHO3I Ϙ2=-ҡD2Dm:7yH@4Qo+,}/jQ*ХC-z˱eKu7Q 6< (2{W]CJ[ߏ׿n?&J4T%RDfoIH"LD##"BYƠ"Rv2 S2,  =]WVcxdsazjʶ܇tlC%g􊔇P0̴QҐ z``( *cv%K6+40Wƻz~/m!OÓyl t2}pxٟ @8 /Gy1 Nٺl`"rs@)@2%2e̐!dY05KIaYeTfZmU, >V,iًAKSΪ9!{NİlUQ7+ }4يUd{ۣ'i)ʱ hE+CO\ •t];PgB\n[nqx3go1z j" mXFis5(aFjLBYi5 " \ZVH e BADB5,_kӾ=Uz YvZJX=z}W~?|t9GE"k"CH)zAʌD(9ęHLXe(%SQugD KX$Ɲ-T[DfcV;ͨ PYeqr gfBodñ|gٚ ReYj, DLYU2=L壙imBQNIUx~w\M`YOfiUEfpZOY{5`;}.2W__Wʨ* $#*e(Uj](dڪXU! ^asȨpP!E 2!E J5E"$CHaYBZ(4B̤Jm]0hyP)H!<26pf37'SR+$YsaJnjX&lޓVb+u4{s iWFrhoo|}bסW9>syF>>6ۘ]aN!rmY||v ;cZ2}Sgl.#QBki% PLtAD g 0JVSa%-?}Ͻv?Nj|"Pyu}B" ]BWxOO$ ۦ*, f3Hb^W"%.# @Su$̫Zs`FA*C%JF-@)"JвLSD%%Usm2$ZV6(MǶfCWnڃorho 3J{M^8fz/7Цc,ūIS SƜfpezD#2̫Sx'#I]1z$DŽ  Y rQpKuTnJ˿wG}3j+,Qv'7RTvx(e<ރ/76 P> F|ٗ%5)5.o!TD`)#zF&,fª)UTY5v6?3v(*4Id)<9[Jl+%V$XhwޝzZ%^o˨1:AVr51 flT! lsft2iL)ֶ!2AªA4&,%J5V'\ w6]MCc&l$&EyVȭ2Gkno7~?>żo`?n]/S<fp^{_[s[^wߖD$,IٷI{mlֆD6mJd2@f"J"hw+UJ$=dZE(UY61:w˒,;>q!-\h>z'5MB@/IDhdl_v5#2@¾"%<=ٶ Fa1fx̃ZÕmb)}nUsyQ+ 7 < +6?:s}8yy~"6YD _!s'14yކ6!0iIn3@AҔ'[f9 &em* r$$ h"L!%GW͏_̟GMq~1Kb[ti'i̵.7_ٯ>OI?Zz2a)bt%j7H2 HMR ϷI)!.]2EmĜ\Du7>9"&*49)͜TfVap6ЖJ>b/ct٧zU|%^Qi̧YOǍ._@/.{hKt=1_̱6nh179e8h.ê8wAdb9S( v$LײazPaRC0F) ~w/G"6:פyzsޖ7!e,-Be 6<ۤ9xY]r[DYHBЛCa#7 䖛 #NjyW`-ʞpg6 l;X!='D a^d$8OaPoet7@;:=?~({*ګ󻢄W{9/Rj_^\qM͆q 7D$Cm͐t0<0 D+m;kjq`i:(('ghjBsd# E–352ȌYaL0`zʢ}͐CeaA :s"#7*L V0r(1M(dY1\ pܝK2i)n!@ܣ5\<+429O0AFkiIeR.*deEUdVo.XLjWX6_ [LBۙPYMf,X|[L|t0pskA6' Mk. N"Ȳ@2"Xdm :`ng0 a X I0ytB@=83RȍPw6i6a>yʮ;žYpFpw{nN[Wl1tk5%C5} }o}/c o ݆1]5NxA؀OmF1@ H6P Bޡ SjZ-j 2SXф.,d" )ȲuVof/ZdbDo)&Zu D*`2)AU Z&*i6@@twG&H GnwZF} - me.\G g@=icpp #xyl#8,H3 3:U,eˬдq8ˣDwoۛWa cO]i=t=,/w'yC۽Z/3?%67FE9H6D t#d1̭{! >1 SC2I$9j &Zn@,–( dR}h I TfQuC ӛY|fqiWfJ>;K.L*)Mʡ ""(HbI{!,+8 (%\ ɴ,;,oYIW@9-+6ãA'tgd{CCn4y,:!y`4j]t BO8f#0tէ~]:`37Y[+JxxύY@?|}, l,1N{bA3¦a;oC=Z2xs :ja4C 3Jpef5(#:QYu6_RIjK4:F|[ e|,nQUt2u;pG=!" e>ѝ09#O>[m/ߟ Xht6> kקNz|C*}Fw%^Q۽~}1'2.v0pe: ʀpn= 1fxf}O@ Gh#zcXM!w&L6Mc2P! an`eLj#, 5Cn"DΙ^K//g[ "uHir[{"[,2u ptI.sZjyhm`hB!`>&ot!-[w[)h9+l8 G~9|gJۈK%ȎWbҚߑcLUڲ(Kto/CJ-ޜ6fކi[0A"S1 st;ld*R,dm6-tkdkTs{u_\6YE 0R\"=<Y |+(=W[]XHIa ܝAam°O1[a6l>$k뇨Ѭ#lhrGͽCF0018h5p:{`Z Ct6q}D}#r)-/ YⰀLMDڄNA&)C-0/qhCeegs GCH)ln>z9H3:6c:}N]{ ař3Zؾ,Z6g?Ė}xlsOUhVx'#?[?uy-:WqʔCMvd[1olw&~:lhm20YZsvdhmnf#ZXChY4PTiDia-ק,+-hbR%:W3o\]Xzs:x=@(H"gpY (BWλ a9sdc,#Y2}昜@Xy8,xuOYq{@ f쮶'ً\8_$7E~o5L> ++*a4)o}߲c,;} `FA)CD4 fe8Hy[3Rc2gD˦r;$Ж3a Ami fS(2)=7f-v؜᠉bF&7i*ї:0 ln4k @g A.Cw'C :z9Ӭ8 \\s 4J r }%2OݗcsZJ%xRnE}?:\{7ʣ6 aT4Aogu~Bܓ^)lWL6%YX(Fgw`̭B30lL>r| aaCp=Sl " {#eٖgRsv)-{iPҪﭛdD@˞Y-2t @n" " s2{(ܚ6G`0rD6qcb6( ޽ \\AlwdG ٽ)+%[K{߯~xTz9_tʗhήpm!ϱC'DJOhs' |F )Lڄ:F(GL3܁ g1K ++jo>{07?BJIHO&~ o39"k9g' OFo1Oˀ6mc e֮uW2Ŭ}&F[667 9kriZ)D4r=j(Zݙi.g|?,f"LWf9"Kqаee4us&G !Űܰ@op!lMhʎ>g #{na;m^blAcdFutS=,o$"=u(-Lŋ_H/r°;hiKnjY?kSD6#;ͤfZvM1ar,oRX)4Ђ uhOX3m\nK&pޖZFvFuTY+xiR-AoX-|Sl4<ε=ٰނnqYrG ||г玗8JAv}z;zTW+Jxoc{cjD|\?9t@ŵ2Jo1ٜϤy`Ax74% XeWu5CEx8Ͱ.olIc\YJpy,NqrJ^5Idk3%F"0eq d̚N?#7+ (%}5E[wx*"^`B ͸P pX鴼>5]]A`,|LSylKf_o)F}%W|;Gyõ\vvs["?;zc@EM2 yXD;ЛeZi iIn}x6xr@r;#ma47  [df,Swc<巙=%h6`t-'˃qNmi(Uv_sf{nZ"‡dx:+uW<75?6p$PʎA2Vq{W8Lo d bw1Kظ0O f:2S'qQ]Ϊ6N{ :f`pB&1:SYlPa&EJv򹽦-ciSPn]# ymܦ7ay>7LS| 疅&s[]MZCw7,>2 ૳)Я3\ŶJfeݽRUQ^^"Km>xFVωs>=pMg.T趝JCF{ 6Cw"@fte Q۩pw~}1}[I t jߚq<["h"=ӟޖM vS8ˈnw쎹 c:qX mgko^oٔ> m={2A/>ewUWJxo|L~Im>,`O#2HQ\ִ[,o?ۋ<V))Nko}AcZ>ey{f[ք9>Mvr d60Y]th[`?Ql6 ,T,w}.LU~W:Hn=[wWvg7ݳS%RŻ3Tj'Ns%?Ae&E7x~]_7~ka 욷Ę,lRٖ5Gv~'/gj<Xĥ3FM0k$vXECm6/RtB`qݚRv۝roֲ+'#wޔ|^?Cv|!u1BkAdSў).fgٺj"~haӡeijϟXӨny:IcDxas Y#\qnTX Hiksn]sw1ux6Tl\%n:9;vt&U*"W{};;ɉpz9;*Ԏ94EvNnL<9 0oNtGn?0=x7n?aN~>Meh:y2M90/b]4w"߈}v}=mpvg4*^xĖav*QQxDv%W{(1}3-]~d^^O6Ǘ4~<exs5 `>(&{PXD06-s,@-9:~ZrTtॉy-#54YܟiY:tl9Xk \VU*oVzPvA܋Ꞗ[o0Jv%WPQH?:%E{;͹ݪmōC57g8<%,no?JM>~:4|HbJSyޭ."$h\WSw7'$^f9=Ә]Fvw 﫥H|9=zVFuo] (KݍnKhׯ/(ς篧<Vښ g{wup#Irܩ:JvNeW+Jx%Bzodk;*=<භSwߕޝsÇxJpwv*[Tk'QF4&([@dhnHv莲{'ѽJxE5߄nBAvژs8Ho,h(_/?AzWqH sbo=ޚ gGv7ʺ=fM[J˟swmo/n^_ߩWQidJ_~t4w~x,=7{F.co~tXǷ>Fl%w548;Dgoߝݿs||n xw#uZ볻S.*ޗg߿?;]Ex%zJxߵVݕ"vy._ONxD3gtnrdt)OυEw_vjTW+ջP6?G|~[R[%!ޏ"yL!Q>&w8f{i|-*I!^=zOeϏNew*{,](/)B{[=|QV܍3|q["\ `Ft׮Or{Hr..(7g?g?&S}ܾ*$w]}VW+ջPė2zV=WNm|[i4OŷJk=*%{>٧o;O~-/˿}QR+ջP{eÏ}<,OyC|TCCvzF&=&Oq'}!٭[yK} ^ ޅ޷)o"E}w\X:=M]%sI)wnO]쾭6^ ޅއ~v#A?M)ˇ~>n+W7zI-_>CJx%zJxHsYQ=&7 mdX *N)JXN{>~cރ˦^ ޅ?p=MOb|He p?ܟio*dHpok룰W>Vr^OIH!9^??ޗ4WJxʯp{2|LjOE}ϕۻJ9_w V+Jxſ'o)}۾k|s?? 7I?O^Q+}˿<x0Ͽzw*˺}^+JxE ȃ~7קo>vEW+5c$-=CpJ';z}EQ+J|P0ۻNw%\Q+?}m>"*%7"w{x)%w;ߢ(4)E R,E (ޫ *Z(((EQE ((JxEQEQ+(^QEQ(WEQ%(WEQ%((EQE ((JxEQEQ+(^QEQ(WEQ(WEQ%((EQE ((JxEQEQ+(^QEQ(^QEQ(WEQ%((EQE ((JxEQEQ+(^QEQ+(^QEQ(WEQ%((EQE ((JxEQEQ+(JxEQEQ+(^QEQ(WEQ%((EQE ((JxEQE ((JxEQEQ+(^QEQ(WEQ%((EQE ((EQE ((JxEQEQ+(^QEQ(WEQ%((EQ%((EQE ((JxEQEQ+(^QEQ(i7 ەIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/splash_anim_09.png0000644000076500000000000011741212665102044024345 0ustar devwheel00000000000000PNG  IHDRjIDATxily;"L5PU$"MIDɒveCQ?@իji{jY-[lHJI T 5!};bGd9yNHkeEĎSd}?tuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu=KSbFN}KׁAWtuצ}~::g} ky Ձr>G A}ϧ: _>|=t) PC'q}~_/㿔~YO >HxY}=|-\MtC7g}uuuuݳGɏ|rcO Af9^칽4~ߗ泄|3?>hQ79{H;v%n|P}iш>{SC'wS؝^Wwx]޳qe @{-?+xq{E;>{z>soL?nc\S'nn g}޳p{~j!zxx]x`'@9 o7O:O :::>=mG }pv}X8^zf}~i}c`Z~~}'<<hO<%Nx w!&Pw@|s{Ao_IAn tpǎ]޼.y p~[B esw3 a]܏œz'U{vuuuއݳpo{?=h7ݕc:"1]k.`w`}tvF|m\E>>tsK-] .v`=-7nİܫx]z_l`H$ws7O,Cz9`m;v .׸9=!U]c!LY|K .]\tTn.XPuK/$ެuuuu}l{̣֡{5p|Kv71mtbmN7Gv=R2ixbuakv}W8;<MZ9a4ȭ- pKw\AYCu_^W^x*oσeCb`4wuu$ʴ{q{\ѝG$6]^L&`=H[AG + #+{+ n>1 WF$ĖK0+%P|6 *m AxlKgWZJu愢ͷX'z#-<ܻxAcn~pwx]u}?|)A|0=p;x$e1)nt#8sLX_r!Z^VVtN`<8I^찵 _.!mb n 1  ek5@$Llv\o.5X8a݀3Npyn|ow񂾆x _Wu_:>ؿ<6c ca[+<-1asEWQ-@X3h D%ps>͡Ip5ZW[5$Ud M­+ SU6-8~nj:/4`4Q np)쎟3쎹%}Vz0 7Nϳ5T|9zd>j`mp8UeoKXwnD2[éY`{.\ l ;/!(\iυv@w{w Rrš;6;LqWRg-f-GP#s W$ZqltULty)(ױ9`m7'w-]}~o/)|G˛ϙw=iÙW`w{%0^;Yزݣ06sm`L ;S:Ȧ9W'P\ں7S~P۰gEpYې Þ<'CPss %X M(37wNUͰ[aJGhJc n>8x%Kzooⅽ糂^^ivu_~*2݃eW<˓ݔc1-sxyTlt5腊b"=]FĶॢl'ٶ/D^.,omD<|Lk̹ CNZ8 j_$%)"8} q %F1VWG p 1szX=nQqS .k;^<==- aͷ6^ =xz7 qfW^3u52xx/e=~t\ma7ƵllKm` F$pzjEItea %V˸]&M21B1`X#0;:"%;W@ZN pBZ ' ̚3 i* "c t2mN*Q#*U {:F6nkCi{{.K|/`^xk/'z&[>> gkF]yn>o ;Z*i*TعL͍A<0$MiI wR$_6岠\$T Jz3;0AP]θ^s6`{ /zZ/ZA)wW좤sI ,|`1=3ᰉ6` %ZXSwy\::CV|Yƫ+Y۬`usˀmfAY֎ Yi!0b9iE&9.K1{0i2Z Cs3e@t0s_`هמk y*[L3Ҕ|-QP ve5LY\\Š R)]Gl\6QrQbX ѦAb5Jdu ZHn\be<mQ=mnKg99kg~ 瞺<ɾ; Vfwwv;oW lNC}_cnz*glGawU2xznW V=`eflW.`PVcNjqҒL՝Ȟ)Ø$BӣĆ3dTlvyܐ #o0b㹁Oh- .dE[  PX_ T(jë !Wjf5 'zAUƁ"+$qYSR#W1`hEk\k;E\ЊXԆJZacU7 MAv-0|#xr;w3|yy/OeUhFk <#ÚK̡,^׭\ ;) %rrJ8«܂tٗGtctZL2L4 &s m: S~3Zˎ@kXn2H!f`TX! *+T1 B HEJs1 *+-`aFV{XU NAJN j|b G410۬1<XOKF mm7( G W.a8=7svz]x]ڏ/|`\ח;jniH'W&/̫8)+s nꊤ,(V6=%\Z7_-uHYu1+ nRn.q%}x ;,(7fK.9I9L4|)ZMt#G-5( ts ^۵+41Ӏsy aAddK5'X!"Z:XBZ \1^ebsD[-Ȋj0k=* ASrkD@]M@#W4XW/筀eBAr 6`%֜]6bx]<jcyШñzۏ@eylwѝQbbe7E6@9#Ϸ'""[En *5]Cx& 2 ;eS1o$\0<& HCZ! se z[XGB ļef0k5 (,2צ1m+`P$hAFǥN`&TC8M&r$ʨi7ZEu CV}Zava50r. x*0n mc|u}Kkw_obts2wyݲp w^qV`eeJ7*&hՖ١f n(2t9$Q2*3 SbY8j[n s trZg6. (Lʰm06šf,)S(,``Y U( ԀqjM:LC6 cqN*3_&O44yVa(4rA#yQ9%@;5J m84ǷM;JhBð8얏g}xwwՙ nnI@sRYZaWѐq0 &SBob|2$cy,drMK ֮ 3لns6oXwy)l63D 00ZXXfXTL29.ю]sCbpۈ6:!tz#`˜JArOa'QP=XYQ*89" -`UvrQU+J3TW`Ġhqv6Xq C(1=uhڬw1\4 @up juVul Xe3X}y( ]娱&Zn g#S1e"Kș#UA"TV}ALc(ܯFr 69$msv܀ P` J ssbdaDm`tX (Z>Z&Q#ݠHհ\|'Vs{2@ˢj49bT/B$UFܸ'TVP]ܮX?1 ~S+ZY.V5.pyZB7z2__z'"x~ޟ'ՙ jSAG~jW,0raIٺe >2Sà-n%]_hX KЌ.XD`ӕ=y"=2œ9 9% 9tx&MK痯޹/0x`|F_V^޿'o=%&Za[ *kNN  m&d5W r PA.3H&yxrGzrV ]T5 N `(XUQиxdqKk \!F 0vA6`7Y_W^U/`Gxuv;|ݝfh.`2 sP& h1\d" T ANzEn; T΋tPչAn.ZqYƒbefe_fuĤT=_xŏ:lk++P #l|NYմPԤ j5Ba- ^(56D8D*"NƠMZ8jbV%<"AIU=`Ui`>VpXu+lPyq{K7`TNhYqVXW^ӻ^'\$ rWp* >K[(9Pől(ȑp %fVTdPPdYk0wzxeqbV\ P-4 a9}x]5*hL]wmw[0܍sw~sgòNo"2 1 ʪU\Nf nF!X춀ٷ'VYRV VX6hѩ8S!0De8mp> dM+l6XYȰ⨍iR y:׶ ??˸z=Ձd};}S৾݃{୳{ὄ~58Lfлĉ<S\`- KıQjCM0J0ECFSDDŠ`Ar *."&:\.ҁl6gD3"")jϿi:9l\h1쎵3Ag0[oF6+ʑb, 3 b~^s 6 $E6)M(#  i@HԺLa#lW'εV:ήm>w z%.aLJw݅æa;7e`c"-l*jG+F[E8 *CmVrvLVXEfXdIN(_%(d a`6_xoL ˅h;77;_66CTz/?szWnt|l34ZDvT57 rqB8sR ,fT%rmQ%G7z~ᄪV>UIbIRQĉnljW 9:5Y.eUE*l#oJS\Rh %n.p桻I*@Ͱ.KVhM P9+u6(KH1i pjnaF3 K=YSeDx^Bmpt53p`֣/f5Co *۾{nn/n W6;~xp~X `k@XVL45 R@rv"C8d% &h00I#r2 4L"`a4T(4G*ݾ{2-&j>=;]YW^GSX_'zVnJLpyb K`*m)ŲaL nr\ ل|Xst`fZzp:Ҧ^ I4t!+tݻO[uwT6¶m?2ԩn\uzmJ}&~o~aY=Z 9ڂʉ٬AFx`OlDgdU[Q Wa,2IX `&ux U1 & 2PZk"c9̀m֜7C{`o]z9{0#vE*v@҉}Æ9 V,JVn0 w>{scsZBPgw˜mp[oʰg>ћ5'h % 3)YcY}22#S!RKn*2=ݜyE.X nOpEN=3< mNe|ﺐ'qt7uu| û8OaK52/|mw/iN x+YuN'<h 0 gCvB%oB`guxvYty:Қe{U]Hwꝷ~_<jdVFȐMQs[I4a@5RI#JF!J`S1DDuU!d @ʨQm'DWQ[,+9д@-wՁt?#pvw/*s>0mcVp+stbJB K1z&h13zu3Ck?0%7B\jT|w&m_n =fO;3YaNorŦ_y7Da$&" ]d٘pEaXP!Ae J E2T. B+LIjsZR6:Q& d\ uuuu}8]Ãhk*/ӫM26p`c YO:ʦXa%diGBcaC@f zn(&&0KY/XN9@_/~l(̎Av@o#no٣)H,-\mAh$|O}7N~N2EO$q,GK2G"Su1BDut0A4 n6($1Gq5mfeX3x+6k,BX%E!]x?pqK=6qT/><̕ڗܐ8܁g g7V_!lL a\Ȅ4mptUܜ4SVsO -F½a\D~❳B\Ptxr[a\SGB>Ԗms-l{yO[/*NA"`*|. MalSV0SL*rܐR~u !3 (rTFֲJ9Ȅ[*GM< ?ChƜ/ÜK~߱oSqCAׁյ+V3\s:7m%PpZ2qam1Rs+>& n)WN8etRjJf08jީЙtf?t| Cw;;qxni<\BM.syeg^|P{}Yt`*'Wsk~-Y]0IR "y-F˓0k5X5܌TULT2J`a_LiE&t8uqkllDV,|!wӂðYw]=?06l%lM偀Ւm]ZG4$-ye~`P&L^aͭsLaLDNSŐ{43ky;aT29;@ ct<|!<͋&I'}%/)ǖUN (@Mf`u8B0x A M>dAу1a҄2T +L^J"+1d X'Nqs/2碖 }w\jS Ts7 aZ#HD`(9_J ]hM2L̇ v_}0}~n89X=m Ya0 B*tX ̡`8۬ *fȐQ݄k+ M<W. Wܞ&=sd+՟K^=ّ __d=m1SPvC+LV=9*-@Zڕ&vM h""P2 zj" &J;Vro:T|@7"\iHWgJ]c5Ԭ4$bk}P *H:yLaa.*7@ 2PʼnƉPfH=dfm9 Y,/_sr$/v"e;-š:y?[Bc9x=" - (h$:sUZ@h"A! TX U&%\ac4( &ptZM, 3g8Ѽ }nOXVoFB"n>i _i*'Yry g*wb(X]fc[ch)+YrZKM"yLe 3tSn>Ր-+2m1n;>qݗcq Wޕ&my(ݛTAeRM0P a\* 4USul9P`nʱ0Zo>vMq}=فØycyjf#6.y%JxZRiI2bBN  &1X =gErUt<@#i%O:/JA 9;tp4gi_E\g%G]>cR?-`@.ተ%CAjH4N@hrPs:AL`B k#PCfbVhJwK dU 6ljr-!f[W^74Cs8ra5f8]([o81;]>/+%Zt{Hh5KE6OB \ucZ\NN B0GÝ緃Xs]]mB" ussv.AX~7x/ }:M!J m؁jY|ҫK f1 2eh=7LEjL+p0d!%^:R2:Uxan:;;Z3 Izy=̗H;XǕݩG,yj '1dД!aFT7+U33N3Q2.{QGou<Phn w,9Cr C@,VqecT|W+ţwc?cł 1BFy*i&T4`` a!"vY=RkU EW j1)lQ[hC{ׁv\vF&慮-Vq9e  Qm㧲 uYͼ]i q `܅5,Y[U%|?nt\1Fo8_1> h_;o {'.?#<ue;rI/]EE.U5Zى2ar#Ȝr*$35[h*vd4T@F a\S{nk^`zrXn gz;FnI(S3Se 9`5U`t7RPdвrفg N#H \j9doe;¡Zâ.rr^-1E*gWlU@8vkv Nqp*''O}b_m7EHVMBYk9f !4gGr<ϐ`,el s)m#Ej!eH`pdtbh-W[:𺞬ăt|-ܐ6^fE.Ïb- -@*lY=N9~ u=6,d\(f0#iF4Wp 4z)+X >Ǖ|\|e;w)`0wYg P~?>76.OJ\O +@~ʰw7w~+!n$!."'P TM^= 9tg Тq3<Iπ۾- W d 3l Sf :smt?dLS a.T=ڴ+2\&Rs -r5w呅,@hd) !,^Zs#;x|ˁ~?v k{Š7| |.tmC <-Ái? W|z LS$#HT4U`nP% p!bdp3&pyTtC~3@<;Uk]x]Ay[jk?h q",pr#hL.tk={3Y- fA޶xH1I Ech™vPL[ ǿu'21oq`<~/^^~[;޹]{L0n[WӾӻVkџa ѡ9t+59Tb+Km[ ib,!LŰ;ͷ8EkȰrc\[cvuu=Y5ha1B;Z5^J`$=[҃lr3@&ܽoyYk_GE]f( c! P r쮿$d9]Ahs5\$q2v@\\憐:~"6iصi ǪYT'X`g/]%e 239f"Lڙr00,ǔl,VgE nkↇ7%Kj{&pvS:`]Ӥ_=Vu=9I$rDXL VrJDҦ3ԫZښ g _W^i@_TiUaaKP.4ɲ<$f5!%hYR h#h;rtcFh,( Ε9GSwN9>O?5xCǜ"X4+> W8E+{p&basڹ܅7CV_ q}, r+Xd5'\V I,s0gCdHn2: Yް0z=8mV{ܹ3|٪.F ͡MPrVmp|CfSǑ a M&a58.5Y$O?tnVǮ{ V7I0ޥ`W+Splv4{ÂF< ;|+ߣlI@0gfb;|m1 j:l?J*5p wuu9avK-tz3̀k7í]!fsdTpbYa@a9;ZTnaFi䄕Wx}nV8?B eqi<ė[ӟ\7u S}=G//$Xa6X 8d\V\BTT vڈZlOjzzM<:?M]wX#UsXslh7VӶz,T#D@5cVYS aԪ6ߍ/?o>΁k?yeBp]_ <`y jL?^;vlp_0C|` Cdr) L.<(MYdY2Px%0NoC}F^\]@oy;x QDk`XF_D*~eKλ|gW9C-޲=a\s~'gkUCZ@DN4| ;+] V.ք®GSѭ.nx>?nm9?sr" H'(VnW:3%r'__Aw#~ne#\_ lX UiJKU3;/}f;Qrbփ B#D ehH޵*zY]O ON\Og^>ؠt}Ґ. mKnnDd%X ,Ѧ ˡ.%q^^^)y xOkM@^EnV[_6<L™KWtt5A* %NN:"Q 35邽?`Omv'?۴╩d;¡F48weJylU973sz- #~ӛ޿b;%itF\y.6Gք% M c\ra*rA8?Ʌ[3on><J:\B/|7UdffuL%̏Cرx sQ3yups"Gswǎ||?WIMՍ椔vm! oօ9)˸w;l)&&~/9` փ;|5@Oe}àeKdrQ|' L@d2*Z)aBuOUW{7ǀq͏Q/ y/: %Xq 9wYN~u.Vq;&m7\ف:6VՔ-sW,  oW:-@BxejE`:Ü6/')2~ 7wa='”c34.NzX+Dtn-@NgX۩s/%_QaYn>-޺:𺞥{d ۤTX\F.“\!JP&I|V : p|}%1$1mm7`Yc߀cn\۵aEW{eA`?7-E)U "j .b3w178NNg0AMR󨹺Z{jL%2wgz ] ÜIXVj"Lj01L|aܻ"oyxK7E*.0'kg } 7rA2_[NZ \-dAԜ7&hg^kWI"fEmj yC=MQJ˱Dv|]7tu=V?jw\2څeS2ל|^%Ɖ1mJ3\>?Жv#6]!o_7Oqx;] s.Ճ -f5U&gjE.~fUWwx]:UklEZ!Y@Y3[!^ܫb_m .a?ܙkw;oqw8#NUWFC7C.8c9@B[)@(=]:0z6z\MF gdlNeUCTv !I+ Q܊;W7[3nSk_1al5 ^?w N^]1jas9 Jޑ|.'4@16u-֖0阳[m]^3^;LoCO8@݈@g͂MSHK7n1sÔLysK~Z#.G8/WC,#O/^sfW&b斄z% o 8MmήTҪQ)\C2 Ws7T1Gru vuuu=O 0L* fo{ܿ,yqRBmmGɢFeICB2esY2@tyϧ pN7ad^WztZmkh5U*Gš6 &2bimD-Oqd_)d < f;evO#w7`` -["~A,f@VlEȧ+b90 P"Z;G7-WN<P~x]]n04x'i+OiȱJFT%SU\ha}a4 ڛ5@|`/=~k\@8ق*dK-"Ƿt{Py՛ԸڼRrQOnu*HA Qgr?4٠(4D*Sh"0v#>DeJdUW^½ ^|/5)&͡R-.Y- (PUnfQTI~yph jS+dA|B@cl.[X6ZNuC=z\lv!̩A-tzNJUWu @߀M '|/UHhd9*rZ6F ,KڂJAտSwՁrkJm7G750rˣ2ҳBOPs˄ܢ@DϊM8V5p˱ng(=7hMGBK7xZ~-6Hf rm!uЀAmJl 2$(Y G_4 `dф  3+r]H/Aדyytɽ\R2ě KҤz+~h1#3DENW0*kl~6ck;elǏMv<s|{=|1Ţ| >rx휭myg}?^ DD*T1b~ڜ۰uԺA㹺z:?=B?SهeeݠiF<ò0W4YQQaE5*FDs|ϟ7poAqocu{xv=H.o gO;G Hޭ #\IQZ."h1cלmȢ!%t˻:n0J2RƤ0 IP-dž-ÙW\v՘S!̽fvO"! U:CmwT0*Dd .Ù~)sı̑6:Fi.Z::n. W!9UmΙ|{RlgCuU2$fcjm `ĝo*uxǝpf]8 Ao <gc6-oE+uv;tQ!@o^YeDLZQAF +Vq@ ')ڼ-Z8ZH](Cx]?hqxe T,J dcc6jd+Ra4yT]C5b ڄ[aeN%v iӋǛf%ep|Bhaxz({ÑmUistz'psݽprϛ]GΘ m&Į_/DsjB*h(^٭%^¾ۅ5c ].7[86*9𫸏ϕ6HHs<K Uborv5ߖ!mnvpg'}㫊t!K(2$&Q-*qP'Z LVAZsw}܍gP=?e'b[ ƂV@ՀUT.ݪք]@kPQKD|`i$"7/v!Af0e=Լ-a.b!xzzǜ߱7 x,svXŜsvj*O0EU"Fʨ`5 j[`FUHSvĜK[xsov{t4]x]7{t+\CwyѩDE;:Eo^kQ rs=_<=w<|yٍ Z9N/v \r{ZoN^/A/aM"BTlEفBw歒eĈ60co)wSW. g0$'tu'HoGFÚ'-D@ٖ!梕9d- )ΫO@kel UNdQWo{۷~yʬ=wK@n {.{Btw}_,n |عrY쯛V={X q}k"hUPEP0PX(e{^xBtwѼ9?V'x̡ʑ%Üs8sçMvu]Q5&>*PФh0^ V.0-gǐdrW` Zc*y%pF@VV`UDi}a|q3cF?yDAIoEk[wݍ=g9ڛs+~#añۆp&Hρo\-6PeFr]28L;'["P+ȨaYù*! *LY.ձLT몒6ZV1GeRk p"A_Wwx]]upey o̮N!')*OA!2<¼+&QVD֩}ղOOfs2UWEP1/nݵ*,+dm!ˮzLn\8}o>x\^;囿 Յc;Ȭuq{|ۮ9c'v_\=*"*BjY U2&XzIa`S*f#zek%ɲ|"sw1x~Y&Dف^WsНGpF/a\ݹXCQr(*(&m]aOΩD`nBL .RP0s$Z  $/Ow˸U?kv]qy3 Msx\ 7;u{>7'vc_)XgP`[Wo;˺~0ƄoUWoc{}̅I`EիIP5@<e;!v; `Np5TLejnf B xG9ƒ:Թ)U2TW϶M筅mh޸ڠ ™c=qW^W7X jAw@'2ߟu~^cA D@88D *Ҫ!C.f&Zd5HPj6v~*(/_/߼|ySyyar+0vnͱuu`cϢ-4oa8W_[+E|1lNNT\u AE7x;a/TU#Bjl}T3U RBj/?seX  0jBQç6J0۶)$.چ3x"CY;+[q&*4g\ƥmƢ&Ɠ1|*JNҪ̦sU4YŪ:Â0X bg2+bLqj.Jiuo[X sZ(4s O~o~-S~OL+3|woA(om/SQTn[o|MD jz*J5lb5X5UQSo$0&UYyRQ&RdDuƤ,ToݱmQ{~ׯwlXuzV꺪wwĝk.o[9b5Q.TM(|vy@Vn*0:XQ“[MFX +XyF.&[|wNxh@fY]6xٶZ3Ɯ^ip9 aMۺ][ߏ*()*=?.o)0ZXMn9bU1 N#U!jV䓨GH1*Zj˞r+jFpٖ3(B6>]nfw7XL^:zQb\tv8-vzT&ҘV7 e, `iXYp!V.MPp(%I⡊0Vu%cF(Ɲ?z{|_<_I=,g֯nZO/ru-\sy߿νHu hX"RB-0) pLP"Ñm- "T5y١P JZ V3!pk"L*j- N@j Dd~2ԑs4qHq DLᐭbD"gH疛@= ):>{īofǛvDr>;>:k[%M.X]6kW 7(VVi`@D# @Vk^^YĜJ$Yn sH"ߺo=_|//l>EBQmv*;+_~޷Gz"J4YP3!*.*#P$1B"`hvNBUV"gB juROlqBHwfJViZTPXpcY bY}v:̪Fl.oLV=& JbB8jC+ ކ!$dP8\ B"Ճ<.j 9HDZTb,bCIdI.V2=ŀ`UTɑ.E"pJ42ä" Fn -O߻= "-̦;uB׀jTtL0 @`̈! 5S.OBBhD I!T >) Ϝ<"X!8 W5@xª,OUפ5b2 n}! Xb۹UnJpZ tؾ߹PQc׸ e>vuuuǷw18XXS^BUA/5\d`YK''\CnNZHclV d -aJb dZ0܀P”E. C z.rBF @mb6].#ș% ?VTXX Z>$õRV:4Yۉ+e $ZMw"*FY@ULז.MUd!*FT.0Cqեdl*QLӺ"Fj&nێ$Ir3CwLK,A肼 %<^;t%B$C*3~]GfdV֩zvcbYQy77sW".ۉܨ"|T-.IRx˝=T\\}ٵd)iK+bX ZTP($UjSTYXTP8,.1⧎*thO&IU)^pm(*BU^jNQ-(]A5,dUA/OAf[r9.qc.sFQG!Hw {~H6S}|'(&]{tm%zw&e8ŵQ!eDJk7 nlkNeR5.>vL-Hwۏ;`{e 3$7<B~yeیDSZ >N``)"V!0AA*$8\JRzcl*QbBRBEXJSgH>E͇.Dva K'iݸF/%)f"VidL%dR'{Ew?]ԄB7A]AI1ʤt5 KwLP&GtTzC5QAL<&W.0r15tNqFwCG&\KRxG=.R#D//>DG |ݎq U?F׺ EISS=;b6r+ h``j@kEYlG u2it(!(Hz+X [HSE EAR]r&d T"E7~&^hqyqb.q*Qb?qFEWT~ ]t%dusbtq7.Qœ Ngi"iS1ٮL`0 MC?!ZsC?9`~+_vhr_+]KNQ - G_MGpc ^W[(!؎q/fGh[eR [4z1"&nP+ EbiEO[fKP`H~{J@(0ѨI1Єq7 Ȍ- .1RP%:28Kp*qţpOaoY7z qTy?~FX4smPV̪S]Lܕƞ҄PqkC {ǥ˶wa &M}1H(vݚ)bfE)sf ~CvR  і)oKx2;0S]e<~ %˫(o +FTnKS(f6ZQu*hJT"n(/8@`̹VChBqiD&4PЅP..}@A¤j)RF ec>[oJS޷ܢHIܲI.SQO81P bj Z2?JlN"rx+41uNݪ67\aKlFD 6PƉ4:5:-d*[mCvv &;_W꥟e6%WKzo_ÿ.N2?W靯EH@D Bt2PX".ۢ8 Zs j gԵ ɢPJqV.M`6\cܫ S6ĸDiR(Hq9(@\9 :"_ /ITּ3} n&̥M9฾ԫ3Ś)"g؀> 0آ"fZ&-:Lax)P7xQWNW2!Z#Q S ҫ@RVV5F Qc(ҴDWd8SewDlEhјҏ/ F MҢS%fJ6LT=Qaʰ tWq4aD PŶc7V<μk]zlQz3KOubաNݪa3D Sj4\$7=M\OIw)^eǧo_՗n/6'>065:XcK!XgU \Jmڌ*& дVX (Zh[T 4UX-9BY ]vĤHTBi;\F +B?jg"1lЏ+X汭 6+->Eu᠒$\ I  $T'L *iъO>4D7N&J֓b] ,~ .:>-橽5lzz} ~s9H:b6 %/i` BO:h"hXUB(N@(^R@BS TCL(92:3ؾ%f贗:!P'X!ݟpSGBbQOoXӛ?;'/NيM%4b=ѩ8}*j>֦.TO6Z6lm+|ٺ.M0T59Q֫ʹ} >I /Rw__GmޑE\"shlJ1P9.HER-soTR x1g 'T!dE(QuTzq Bjj"RJDoQh76.KiOEBTӅ,ss<l|}ǵPG1}ЌbVU8؞Sc>kvpF7Vx]1uW~L]we'yRvr{RrCdB}ȉ@p^(\׷gzR)F Ju]MmP*VUZUW,J/iEY"մ@$KP DD%`707) /*ֆ=y@M4F ^`!:!4%[ӸbBYҔpQZ ic'-cw]hb-dc<ӹCkiꘪT|5۶;z8NYljׯ޽"ێ zh{f /y$^wV/_| Qkr!m 4F [zb.(0P8lC+^hKpUC^z?x~)NŎ*乘C%@Ve>4}K20P+hBTXN$ kr>iqP))Uð4,>1mY8V\V\QZu-ƍ\9qu1s(a-;<@vLx ?!J~R$Ios. '؜dm MQ :U~(2ªPHo P)"*j`E=F *wX)0Ho4HzI"Il;J}4C-Jh;6/|Bl:D9rNo9 !'2Jr MpLevM f"dN}v׿8u}-=dTX̄d;S ]UHyz(qrnUlWܞ`7 `FW Y:8GU|+f K3VUTNxoo0NJ.Vkz1퀗(T}7)B Ĕ,Iw%8 qԬXHw"5/$Dao&Iű]+)hqk+1դnOc mPij?e)H~ {='g vh&^j*I%&d''Swb eg}]N}])Pp؊L#PDaBn N%`@L$+qz(E /RI @YS:8b5>397|b+iyLJQXlK^ OIi?dpP.NnݥX+S >e͇HV!8KHR$ʁ_hYvu!’L%{˚d1˝o?SxM\_JLw.3aqCs(id qbyV^ʾ?&Я .Db̡_^zIrƘ>z*vNheWܕ>m.kąhu_z2@rb؄ͯJ+D_0U5eXoJD6 m%Z|--NcFl}SXS'eߐ:_בR˙ȲdOHtңBy{KBy*gWEl-6j5d}d 7 h :ub]9@E!.(Ihj'"\YH!xN+8 q[_>qYx'\'>fVw}ݯ)N*h]b9 Ezڳ~Ql*ݓj1-W!WW! !jiLF뎄:=Q+GӛRa w edK2}T-Jz?|IlN`q[^~,/]SLԲ~dhP0.ѻ(V O)=DM/7_|mӰ6_?u)Xy`6酻9Ez71UVT棇bV? H)Q&Q2zuP,dvunYOw}Is)(e>_?wb&-=lוR}{nޤǾ,~%$6B^\bu-؜+CP9p(+6 VcN4َѪ"Q844FI[QnV =x/sBw￴6KbN? P'‹HuhJQN!.>!'FR;~H|[YS e ,zczNR}yrQHH 긪C@6cmF0l{R=dvI /GߩOzo^/ե^+ryMviߟOzF .czݭ^| (1@K{ ZapfbMof-ؿkyQ6iJxzk wBi5o=lYFЇ{ L#"F îLy](߽V1݋0] /w.7%7Kovu/{vM,v紒Vv-;pܼ+KYhu+}ؿYVw=uErWKfvV׺fR|'IMh5妁wkͪ7ŵqnHNtpU޾7D9oYv)$޼ͷOIRv鮯-qm<|VHuʲ1n{ݽ_B";9*R;R~KaN}Hp gqPSbZ>ubV=副˰/aΉnf Imzݜq'ޡ rNv>積<)ڈ};ؗ1.{ g,yܯ {LYζ.EdW<*&C**7N~; 7tG/}sJFOt6:3w7hH%!Ffwkۧ9ͥ>s޿]w,[v'xRv)/ٴ}觮u',9EzJp}p%ƭaگ+FŸ+@z +Ӯ2li4pTj+5vW4eN>"x8y@ N~+;Tm8rh.6ĸDCz-vDZ1n1n?XȮ؜"mBv8/g]d˄J%w\|%2)p^ӛ9Uܜ]uɭٯi/f}OGio:tw #eyrKsخ?S/n`bNuD֊J<CqF}}KEew20;Uj/S{PPp}y6g{>͌=VPtK!mV\^;NYKkXcNpKݙqߩݯbהf]]57̲E'dGg] /[z}R;%/znnsXPRz'ØN>[f[ l,y}n,xCtz>ߞg~xw/}y˸F<~G`~Rx)$xrNgqŷ|`}~3OHmQ<OnWn|rƣܧ:_JnW]7_g@a=i.٥RxI }|/vJ|?|~(9az[>﮸H>Lpp}WHpR4 ݭecE.MKg놅 wn~ kvx܎).^ /I>0һK|?|~ ٭d䵿~u<OXhb߱hgێg-0{g< <:4'/c̲;%?At&^ /Iһ+Jzz{ݻr[w+ULv;RHlmIy$ rPv=+^ /I}cw˯Z)f:|L15&es/1eg7%Y\ۥ!$t"?\.K阥0k?M=Tj`zRx)$\7mI[6JyLyHt˯7'$>Q|G@tC }~Ǔ]v'] /CzrqAmٱRNJS}z&ӏ浥N%SIT;O*o߾y?C#dX}rѥRxSH}j=E|wz)8jM'txJn˴x*YtW7ŗ\~ oIxx>ٽ|G_=D.K!tO<&"@ U|qz~oIKͲ\ ;k|_o ^?k&yO(D'y)$1'\{,,o[w !%Z;%6OIO5_<5Y 3*Rx?K=c_+)C_-N?,;Zyo~o>4(KRx)%?䓼ί??}sfѝ}9䓾c"cD[ /I%?Q=\??ǽC)v,RxI /Px?|'?2Շp#?>(¯ >WyV' [>5#:::>rQ9GPO5~O4;::>"~TxB}yOG8= uuuuu}Py> 8)'1=)O > Q8>={i,[>+Gxq{Ũ_::~{8p}X^י~K3pt~|~y0awWw]x={ PӇ zuuuuU=s>J$';zxx]? ؃k|';IK?>L~.i•u`Azx/󮏎v?$?qx>10-Oaɱ}=EW|>q/<̞%綞TOܣ~~\ǁ G^+`k@ ڮ{[05A4n:nNƓ*<)ujz]x]`4 ZOzQ|w$ \wGn:viw\fGAE+?HVY*]L*%z O8' h;v a^ROg'9v(wՖ={q]ܞuuuuȀi`,=4ދcq㑯yt]A:~iT gqϻɵgj |l/✫q.ϛ } | ܅~Tqׁu9W}#{kK@aw|{_c>6_~I= |?pO{ڕFruuu}YiT[㔬]~ K]0|wzmU0l[}x]xx9vrsW1±sۯjԫG)= )q;|ga^^^W޳އf,>oSݹp 'yǫw: cPx|Iws6𞅻6~f; c۹8Qh~τ8au4q|co!Ϸ:w;xp?}{Bjeua(W7߮q:;£nZs+œGߟhdcaGÎZ4mBLXs,?a^C\/m%Ltc.o 7Y(On(n3<|֧N}s4v ۆK'Q`h𻤢LJ6"j\u5sV%.;)..A0๻o@8CotF:xK5e^W^_}n1 a߀=j9h0+c{0\% ;p{0 +ꊂ@ y)F|@*QA*@9T < c!%fW7x p2Dž6 $o>NgGw~ <;WQ;\B; ingFsP@!΂@dsN00%9\6|h/Y0pd%-i8<¤I<i˜3NqK mK8'z3}X_^W^xKvKw7nꖰ{z;-ag ;=.tF%M#XA24.Ý3A3Ը]"LweY|B4ۀ5.aaJ$nC K.< cf<ЛaBoC>n x]x]x ;!|ή"ZvӪSg5F|S.]n([9NQ.\[BoqlOp՜.gr)%9l_/@ S>_Z&KZU#7o¨x֜>n oX.:>^4>0ߪo{2ؽR?m8,A˰[<`r: he&Y✿ 6;Al P~nV)'+x O~E$`rr&@R ^խˬ+2jy0t TȓCھߋ1rJM!w A9`kv+x3MBe|Ǡ7qo_}W\OY?60?YCve;nc 5mъ*,5,ruG[8G@[83ƣ^zC;G>%r,]vmQ u;H9$Kupb4'Vj~/`h-Y0@a Bb1L9ae Fl7r{0$9q y3gz$-侎"w2BPzal{\ma޿y-3aʪ:0겁o㫡혭 40,[3sе:4hvdma KRi&|^PḔӳ2 %TW4UZnJӚlZ'`rgh!2)@)dTΊm` S\`Jsz+lO]xাO>w :^՗¬C뙅.G`gΠ8펿xz䮂g9<`&lÙ1S 2ܶ 4,A,s0.p؂n˔.LY-q*ȸ y lwbİl0߂`DsxjߗȔl 9((b0%i`tS0XaHC029KɆZ7aS>Mn0bˆ[Nq .^CanᶾO/]k5P^#}UJ=+W9'`'w6Co(]Ux6;Ӯ6*6yFh ߆23V>Cp]`DY 48|o`iEܲz35ظ}N:[mae? n"`Σ-c5!lo4X{=dDhm)PdOOAaSa3i*1i Y8xnr\(̕D,TC ֹƉ.pԜ]ހ k*^xuQe} _{~ v"v].i'*nlڜϝAwvCxjlB6&*s ivѽl!MX^nbkίߵkymimn/i\ea5%JChbBZTq2v dbdLYut1d)iS99 #0fhcQ@d zɍ @؄1!xbHِ+$u>Uob\h*5Opfmq۸ 9C`^;z u:ѕ;eB;vx>pc|[m{mxaԜVihsXqd}w; N6 FV'wSP6ryż:?Ȃ^v3[wUZKFfskr @⪼A \BPN]0D }`!UKIK LDrAO“j~GŚ6F0ÐL 42v>$,Ɖn` >M yqS=M<"x`73gݾ~ xV.΀heY9.Σp}sv̇ba,FyXtm|t+h)KW-X( f0f56Z@jqf`6Dօq bRau^ b P&cC ҂@(T+O݂"ђHXtr3r%iH)F4 N8ZkCLt6l,p ۼ{w"Kxokޗ|_V^Ө~T Gkǁ7|eWr~=l.\89ަܬ`Cq &X)gf91a1ԂOYz+XQ&7U؅F`4ap,5,Cf%,CfAV2S{n1Ŗ9e36W7SU,5`TWܭiR;$s>ΰs$’Ȍְ>L:v[8$7C:6yl82"2 V`ܛ鈼-v}<0"w]wm> z=^WQ?o>ϼ[+1a9mNulɮBsgr[bAX0, )3*OͽaRB Bm3)kLـ:yRjALVfsת6 -(HahD@%0PCB70[-5rv[L5ZtXrH:A iLyGRP8E¬'1wSDd gxmj- JS{\d!p_Ún省}?zLgwz]x]Wq|ysÛ57ڬl]'e4BAQ&++x1Y!Od Nts97ynofcT2\5v6x9զm՝k {0j*0,鍃ն +,8I \.pib=A %42hQOj'dU'dڐNVPmQdm_v$u^5Y;L -r{fZiNry kRI2*A!j'3i@3AG! O(ծhb41\ 0k:$.t:OA3ω:61nr8!^ 8,7 @vuuu=v]ww^{`wν۵:g8>t+'`: NcIDU6i2pp"/k(8ʑ&&7(\C`3 4=94 f%Ak scY`+J!k:f gNmDN$hT2L&G:<:Y T,)03%fL2IDV3i0ȨK9prT, A&5c)XcS(4Hc$& h!m`(P^T# S"L09 XD`(, SȀUzL5Ob@@ ,[捶L'X ZhSk5;s=¼[;IzG hb1iQ^x>~uSKon=o<`rnp~ X8d eԊL69 &p,5Iȓ{T8ӜL{Yδڮz qbCm&g3 tf ܶ'WNxBm﮻۬nhnd>X7߬k.E^m=nGH$H2ʄeX+-!LHX& DD26U%HP/2*"LC 6奠.Nʀ8K:{+,CЄa:ŅVބ/-/lW]y>fzDw^I|pLɟo >d|,~eLC13b5}_s#Lr@j.0'8eez,ݜif1YYnRV}E` _/~ +.v_Vg`20 FS S֫7iOA+`@.xmK;\fڮr Isl 6-h9@հ&NY99?gyoBD-Bs@q]wNp h{E%/~];{v[&ocӘE+ JJKa1J.d EՕ&:Aŕ4#ڸ5 #N378)X8D-oVn&ZOv >nb%Fc{fW^9zDᄚ;>3߻y_wqZ!n꺟Nm>YUl:Qݗ9Ҵs!yЌ鵟It sRdq.!ڐڅ@/}o߹(?st@pg[};}'~[>tϖ/oح#JVn {W<? ;جTo+u=O9S<eK]:<2ۜM962R%" SunnΤLՁȺW|c?7^Q ) c^.^bڜs"<޶o $4m12^"2$ g L'D('3h_P 9$T zPNR4տ2B!$E8C۝W0aAF ^+oAףt|~-`LJ7p>nͪNQi ӈy(4=24g`jl720^V479< um`\ s{y9e5ߩ7L2|tULrKpc̊1kihuhW+prkl "V0`A|>\V +B]u}™W^-g7[k;H +UmGxx~U-Vq;N L:)A^LBSO|ZəCV (,܂^]F el7D@OY8li H.~ cuwIu(4mn5GF))t\Nd@n_zAPLBmۂ oaz /?.LlVΪy)Ȑ: 43uQa% AڎBȭ@ .^nuCl4#[P Yv1emo.A| fXzi VNb$(2d9 L8C@\{Cr%D/愹L2l2YdN-$qy!|;pc}1lj3w~ϕ$:4lbYCd # 9D!2{:ɐ A}A:44̔9}'fH%'Z{:Bṝ`9b[9큭;븼8ya53bwl}6lLO`Pp15*uԗ`e%z԰'4j.ȁ64Aw.xeݽC/}?)8<ޱc76K|hE2؋c~'wku3N(LC:#I:[H: (6u 4HuGgj^/ p!bPԅ XB%NhJQ&ВJ4'n1ZN@6!2Z‘p&:ܺ:J }xZ Wۅ2V'8;;Vl P"]*PsvdCs 29Y@I$cTm,-@0gm0'UXN xS7?9_gv0caw= vΩO0g-PIK /C5BHP!9Ȕ MzA`T*1&J0P2#e,y3ЗJ@q0qo6{rg{y SN:Uɺ(bk B9laC]` (&jN`at!81bљtmN@ww2Vd1Oװ2':lr8VN8,`.clGY@RsS:r0CfsffrGVhit?{{ҧ+`%Ύ -\l?#m¨vrPڲmscYZ^Wq-۱aXۥɳNO40MO•eS@] kJmc``A+,5LYw-Jef֖Śz?>u3]3P[@WΛD*2gwx+ Y^y{ocT4BiHS-JH z-nC[3 QwepRYY܌,ɤҦ>LA7!tjvӴۢٽ OtՁŧ g=; , ahfuG[mPhm7I1Md3vq2AVgdA9͒^:A|^4q)Oa|Qv n+ lsR46oDgg³lJ-\m L pLfX-Z]&j*oAP7ԐP6%")nsG@:xn <莅8wOGq2bpuR{bn9HRJ"fiPm4%$jX!f,N&+"6zKή&Gdy ~p9-߱:vew7 oL:  m8LxZ )\)&aD=Q3G iKde1;ji=D3?U-[̽MWmvG^y75!Ձ1v||78afYn)31T'^jA d:|-DyZ944r& cĺX)AWo߄0{y++2sh_՘nv0z֬7nƩ(.) mdV畉HIz&j^em5I1.HX44D'3R!71;k!*76' u3k[mv-[Z]Cf"$e2g00+CI#ŬW5Y:1`i`''// |XU5`o|w" ps4 $3MsWN@ ϕ~ʭo2/aJS윃:f,[.i.xĉ4H r Vr ¬ ".ح# ^`;'n./C]tVSءlܬD]dfjahdĐ.WZij"6֊Aδ|'/~8ǰBEA{׿ׁ7;]UԲݧz"=7|>-勓/|v;oqLVR:L&CPHg5L$QM_LPֶG3Ih4 v~H,ƈ] =\=*tuu=Ùs2+1Y`WnfAkJ9 dja& eruI2uDC2.&@2Y$wn:GӀ/?p[,HFs/˿< `_^zl/Dov7߼_U"e4joAiD] QjӪ2 u\{D BNPvV!V@ .syl* %{R^^ #o$sъ DU lNıyॆ>2PC՚6ZLFK-e #fe颥ZRii!ug}S*͖-D;+/_c_!p1U/۟/?_]׳/;ߝ#էp:Ο߿xv_:oFeݜ@c,M" ˔1[FK[=MVI!,BVWRlcXLS Ԫ6'9k8bngrt z]]x]W; un?Ģ͠MWI-\X*feZK/844&2YtuLh2߶H#-iuK)"[~K?K/c wx??z헿XCw~}qu"@w.\ށnwo_<N2{(grrY`L0!v9;ZXQЛ?~W/n/k1tn adݶ>_SU7:ASng6K JaW r+lm쬮|:aeaa-ܒ׾8j.v}vy=> ]r:Cky=ԱRʔ.$EXh࠺Dizi:;8hy: a0[='/ҍ!QkBo;T~~||sMyCs}[-2j'Lael(RNQ4 F Hz)$9 RF&Hp9k|YrUk^sgzI*u>9RJ8 u9 Pm:jXm#X6oj;G# ^>uW>+K-[@-AWn c/`W~ynO+w vw?Y,[Rbk0&NYD:22 prԽu:ݿ6uE>o|Ǡ'5@ڇts65:\Z 0js|id1:B,2UQl*Is/'kb[~|kv}}f{ .);bkY/? s/*5_02e6LJdf4:y[pq)P0Qw{W|s%vp!丅\x9CՏ("dnUã؂a4^XZʫ#<4e((&&\ x~+KG(_otعfx/a?i ւ~ڂJ1@& .hP 0Ǵ=^poeA5htxuu}C} 4d_T[[.]_,-La k)KaD=I1kkSL@C+݌o!WX%[g 5?^n|Tή,-⧭KUseuU]sa|,*vK98o0'qqO|thsi8ش?bz9 W YDllM aHN.n󥲀!8+w=`6*} ? cBvo]6I (Y<{=OO݆Agq`ӻ Giyukîj- %۬,]Xv'‰@RL2i0yœt1̗;ɗA..Aqob\Ec{D(s No}snTlSV-K; ]ڷt+!C LCX}/.YF\ϠaQ<ۊMfqt۪ϫ3jIwt|×fժڏ ZsW"*ck"e:n(#PJ€s7~wx;z\:=;[Cm ˫8<,0gל氨\p lpsJi*aM2UM+`զ,SZt{|ٞ^`{Ǯq.ź|ÜՖE! b:F-B@8 9&g;°.xD鳻~=*h@:)ǫ/}xyfW/g8Fm JX̤r v߃ش e^o]3AՁœgC'skijrI g֣.[ aPÞa@`Z,ÖW󾃻*x{gf -Uo[୻ʽ6tܯ\e{\3pXGQQnX$"M9eDaע0zQ!.]0qMc$Cjyq]%l9;Nخ 'LҲjJ#0v΄)w^` 8N!. Gc:w]>~,_(HC J]H#Y4btN~@j+ȃe:-8F|r<?Ԋ+o=_Ak9Em 5g>m= `9?} Cs_h\os|E.6f9GpW𳸁W@><7z }r^`] a,I/y kr⥽IL=wmQ{V;}o7;s~&�si[B\:+p- 0?' evuuu}p]Bte4}.j07kṚ˃:(K % 'I' 56U(8R.EK*~_şu| ?{(y2EcU}xK' }bCB.%j& FuSPQ{*pQbVzۂN 4[}Zزo¹J'tB-ęk!5]< `Y [!pEʞ G,gƻ-E>O5j$s{i*<l9s>?Y>^Vzf'Q-~&@5@(, MT>zήه6/5_#.šUЖ/4@fEoOb|p3ԑ;qY,^Mlf5@pP.xvh A޻Ay\`L޻28%ftoq[|]x]O7_^zgqA z>qRQ[(s33J=xj@Q"dT{6\,08 0;r~X#a}ǖ?| o ԥϣV@m I`qr x~I, -L"ĉ]f<- |4a9p fuuuuEpG"Uᔩ^Iv}vˊ0JJA0Y*1#/=+*3u~no@:B-`eu 췰!$q?|ygo#– +:bB$0Zg,kߟHD93N$\ۋ]Nr~7/1u= ]W^׳)t]+(kxUn]Togʜ[v!P`4Mz;R Nx`薥,p#:ptaLoSXpۛwtA Ð&{ }.*aE~oFCf]ՄQPYVkz-n>gygq$WaWw󅗭JPY lS\偔qv@ }W[{e%wŹ}GaAʁ< 6nK!9GT5 rmk4|޻jMXNAP֐=Y/; *FJĩ4wK{5H9>qxyEs A}8pw wwx)#tpf,//B?)R9r?wuıg[-lC5rz ԡs?;ԠՁëXf*Fši*&a*M1SaX20v s:vg\9pzTðʜ;|>`.\pa6G}mst=m֏ l6ZxTaȑ v3& GBuuu}j4t> 2@ c$M%Ri֎"4i3(J\*Xo#GWrrc ˉ]5:m>Uj5]\/ Zu##,uA;yJ _rV8p\p#B]x]O=bP+>14֥† TgE],0y n..Nhk]a~&.Up^ >)8[޻{X67x enhzydy <>6nu ~qƇ~hW#ⴸkeu`++14QDJHb\ Ub esW9\v[^]= "b?.8ԁ;,`#yo~?^f>Cj8ܞplJZ'R-LXTrLBY! [^c}x8yTޮt]K߂9c5득=Z@oڟP ӾuBvoNk%d&DfɤLv=r:oL Sc l~ٞW?Q &<ĿG*f8܏+>"dˍ0gYl#՘˜^!} oʔ4%mMuA o4Bʿ 7d2V"]M@6Fx0Μ3n̛5JnTa7m/y3}L(x؃t|>1`( wVR0w_@΅* IKν+Lޞ4!Cl$E4NNorf;.X d WzAk% %T^5AO jgo|+mPȶnޜ(2s/_vS|+|ho;-|uno} AЇM<5%ค$Qd\:9}Oކ] Gf"I: sn1(e6 Q^Euu<f移P汓;=MB-pvjɠ TZ$Ji[׵\:=mms,M-ؾs;qnOX@*,lN_BQ~r}G27MJw{m h⚋S“Pa!ʈ \CZ f!o/*ya}xr{';~]&{BZQy]x]O Wnoq6E8s@ydED3(9|?S%?Pr DV ԞWfB- Tf6{Y|LH\cHɠu< i<F͕{E>˞إcWm),!(TK`sjuU' gCr]x]?. ˀ,Cssô+Pqd]zm :0,rvq`&:J ,%Jw br#*9!Υ;s1^\] uV V=o磮.+j߿ [Vh.Cb{[bw^1 Z0q+C**êC#P fD 0:}Lɷw\6*kϋ:9n0؁#|b=.yqƜ!Hm]{ ZTZfq!05< k=҂bsxY`z{'ol<2#S t˜e2/,×e/711> {&OfĔK+Y;S# e(S;l]Pl[@$B+Q{j¬n 1ꆄV9%V]q˶ȬKvG1uuu}axfwxq:x6#jA%GtUlf,CT ekx3j)Kַopoa.OG`+m$t>\Qbr2YǶWpÚ/oqt XIUk.EߝaF-A>w_IeVvFPP',ҜÜnA+\ C` gV-+3OOby)tnViC3 >9DZs)Z!tFJd̤ ( p[fDX.m*qoPȬv|<8-V-UP6n l;>,[ݯZy| {X"dE%f[\7wx;_UX H61(  [L0 U0P"s/7 Gӄ滺꺖<"w\Cٕ]{6Y [VGvC "\%-CR%r_Gv^.8wxBi,›h8.nڶ&n/Z}+.𭭳wo/n 0OEᶬʌE#b\2 {mR8M`|Dj1  _&ZEHkm 8R2CU`^K A{>۸ߚ\bR-G-NplXr՛z|wȐBTfmsRPxuf-kxӣٹoQuۓrvH\|L8(;{Hc|c,-ÒwtvQϹ8AeXs^jy#LGrgbcLb!8'.zXefBHLoK;/(펅yy G-laln6wЗ؀JxƷaP R_~'o揽^7Aݶrv2Qan~_`B uaE|K)ltձIRlr7>LIf`3.)avw׽}yG>lͮл{~ϖkuض088S9NřCFD:\2b2J,B ҶɶZ.az??OI_BǛ7Gh^fG@mUP 1l.z,`X}οw}|M~g,} e>/Pye 9co}+CuttI2ee^Iԙ>;0#UF%?z,@nݺ;6.l-3<Ux]]OupG\+ZW)֪ͱ, 8 Ⱥ1p$B02b@,B92,>mwo;g½7e XApjnnΏ\s1lB;ֿ״vzw?ӯP~՛V+Jzry` Y؃ӷϿs#uOfe >(KD(-H% ka2V 2Iۃ$BYXwͰ-bpU,aڳvt]?r}t[>޿>LUΏ.QN\&yze2_ta2FK^.> -]9@rpNLs 2'h/UD1a%nzۣ_7Ψ ֭Wś! K 2! H&4xvIya}qOgd")ro}=7^W~N0 Pʚ?Ͱ;+M@(@R' ؜Ld&̡CuD ,S in0 qQVHϟ+X ^ÍP8r<`)D5HCfc\CxfB2Pj.dp +6)31u%P-c`,bL7Odf%6n!C ҏrx{]^sy\A(hb +jj%g2[NO3Vz/(Gd[`Ƞ&tyltVD'%s)TmNR%Eso{f7vU:a=Lc<_!Cڽ5!9M;ղj !$(* Ru~u#n˔ B*4=eaj ,Dz cv")X2;N+JiZQ,JXT*mf}#qIs68w#՚ ]x]x#ryޅ6^剻VX'A#& FҧT> ū]"Z倃  B !Qm.kZ &P^ @B&e&,%YPh|0޵{-iH'd!< 0ɶCTݰ# ëԪn5 2O4$H"B UR 0ystP ER9C o; `iT5:yȉXM MByVKǸ'p~x]~kΏ\Z%)ИLX4 !aAuJt { 0l 2П9ґTJPF$% 3TjXa0@ X" ad C*TszHIL1;`dQ;g L!/}ŭɨ3OFoCmOhdG-TnXX#lг\\ NqlN!mFjdRmQh ɔ[K e aɐL9yYԢN )j=Z:nHiHY[WL)X{0 )BCstd=ŀcd n@P 4UH0e}@Pin.bC"s(3k0U;[k r$3 ѲMI( *M*$v=ţWOS 13ңkrTeU*TmUEHJQC DaI6E~pIlm/2Zc= <*^Vf.Y/x>'ckJw.K\!6b,(j7I^3 cIEr]ju(rb"f1$]fydxO6`Y1Dao"ipj.v(Pb&JS{ݾ؞vF$2X[^rr.kv1c8*-7[$]"z2"DJ5vHqЪ uh"PSg% Z$%yL$PHjJ%T] 6ŒUyPz/>AqHo= *~h^o;#TcYüBԑܱ5n>3_ybUØ*Rk={'*P&CLV6!-ZD7GvvyjnS;' r{99_tˈ_,_am; '#]DR^jTWh4^{U谋l@94EIsLEĭ*9A`p6$-zL`*EH{?o׷.*8/3 ՄwfdhNX6Q`B.@M׊TE ]5K2dRD-d7&qe1GT(.hOS!;mzJtG Rx#Mk>%;t_|8_vE;KAGt㥭`%HALsE-G% vW5Dm*^m5ETs]P4*@ڠҗ'fMz[L[J U6Hcxl[2h `E j@Q]Z5 hb&rAO@ 2]jLdqirS1QXM<7ܬN '5]#dwlZ- G%2|VB]pduQr[l(b< ; R2v}uO%K 5J#Ҋ1SSB0HRX 5$--BkSVLE`VZd'@rAՖld@MPxRh 4w֗'գƸ1SV`Z]B$4नG]HڶpH&Ulg E[+]ݘ,Rsbv'YY=4JLB[SFyɭo4"׮J_%*Uܓ)L H tsTqPDphKd5apUQ5$\fyhӾW] oNъ[ }m.gޢ1|E:sVM/=0ba%T15c6`)ȫb.|MeG͆2zт NM\"A÷ [{h%G(lڱݵ}Q pNMzy*ӭa{ζȻ*e|v'qTHSBMuwbK %6.VS2BU ^$I4&@Kn)GSi)L@.poV&DX)B)6{xէtt~;ܒ~"k>{ѾP׬-V&ՑD1UIl*͉k(nqkEcя'pŦ5ALp9B .-E CIQG6'f؃^m` *J}$OSmL1fRu%}{b"{1vBtj=.ә}F(<(hzޱBX ^U\ED7jDyM.5ؔF0T;q&HUf5v/o* RU...(Yڅ<^c|YڊUڜdX]$(~ [jPwE 5?o1/uI$Mbq[C1vqPb:Ԉ5vPsH&7!n_9[GxpwmP#OJ}>Lz޿[G~]tα=a'M EPmeKɥ[X@0tR̘L"TT ڼ̐Wj_TV69v1@Nʳk}lڜZO]h|%:>hlN_թ9sˎ)JBg^Bzh[Oe2;4\^њi\7}=o2c v'&bM%~> (C*Q:0T.Rgk]9R &^5jmo9&> hxHfIm&9u䂩 G'V@&sTXC<.>ѠbJ_[Lv|6,~_py1LOI|7.KkZ=K+n7X03d5&x8`*4ĖFT\ &_=V21mzE)K9WqXk{5O|̆~_uSxyȏ^x;o>=ѭwy1Gt]zYf=e`tzvM5G|nқ+!˯H]RRp]d]2&׿ĻaNi"8n @>\:Oׯ?6=(< |DwXnE{_.+b./fI]e֏7,i]d%hGzsee U.I y4]k;(Lvxl-x[}]>dž9޽~Pt#OpG2)< Px/)C)}達,e].9U&e+8疑ݜ)Ex܈M|u=J8+mt2Su\|}v:}3?]Ύ݋Ɏ#G.Fy-ۣ~*7b,\/#YzGt=y8G4gqb-.\ExvYDycf[ 9e9Gl]S$:}of\̛Qb?_܎CROGᑏPx/(﫟Hm)t=[8;}ivmULi䓰#eTx}Rl.f-ew}@.?Qݾ޽d~EvG(S/`rnJ+!st=[\{wo\2[i]0ǚ^I~Cd]z˨m-::2[޿]WwSt!fjA(< ;/t߷ Q>Zsu֚(d/#ӣC$|29*B7}먭͕pf-~ .͡uI@}hˮOׂ_>e۞u_GᑏTx߁~!twR=W-]E]7es}}v_RnJk6T!]e|_>nymu$#e4<~cr=^B|qKo_VK޽UtBI==(.?,J}{,-5fw}z󸱭]/0so߬Es;(^Bt&; #?R=h.#.}#d<$bde }:]+Er뷯$+/-gxƧs^?[cw-xiHKz%B}}X[G{K巌ϩd&̢Y1Rnks_~}G\ʯ m?"<C2[FnZ!< l!٭>%_ Qx=.R)>z?;={s@x(*o>= _eIm~I}- Ds#Q #G>>Dw.]Jo} y>O~|{7Z$3yvɝ^9|{UpKncdzD Px&Jyd~K="\;ܐ_o_Z>M.PyFsMrw.eX={G?׾Wrow?ksȪr'Gr_7IџG^Xx߅sۛRvo_o<엳sw7/VG}go3W!bB×_ȽB[xOu!F#MF eΓg}ǟ]=_wW=Q__~?˥(": Px{SsY9$qhҫ-^ǞE (/79\y@O؀0{^%!1anxݺuVޘk=c:u@7s$#ﮰgjJo᭒n:u@ 4z DWaPʛD{'~yLWmnxݺ}m=RMf p|Z;˹p$!otTKҘ|[[n~ҁ7!1ʜ 4ܱrL{]CcK2Dc:uueq[&_:) N sgvs N(kS37=&>2D*/ jց׭"(nCn\] sZ:x&,P-u-nxݺĶ ډ#`5?եơ6g&<==[^n/ ұ#I& tK>XmT2qyZ]n>'*<>mq[8uI./º[^n/uhSusx-/qUs`y |V`uح[A-bZ[nNUIV9u޲YA#\n:u7PB]}.yԷyݺuum۔)"ȍ<-p۽c7uuYoyu(]۱xߩ::/ O[wx%,۪u׭[V׌_OqmS`xޯE[uu6 U/dvB{Xޱxס'-4kz[^n+]Uk/؁=ǎ" yL-+#^&N:;3uuY/+%i5w$|c[Q9&pS_O[8oZOnց׭gdӈ%q9}=Zk)veo gɢ<} uu)c41tbuGSC Sz7Mn?wLց׭KbĄkTsK󦒄gq.a4)|ޞݺuugh\C0S޳i&! n:u{IwbOơXgmcyϣgWn~mڪ8.e\X1 [ngUy=[^n#Be ~~[8Nw9M; ց׭˨qvK zXھ^mKSG uց׭sbD-9KV =9z7u1&tց׭˪iK-knRbtH,^wnxݺ=gMPZfaJok-\}74*{kvsls漍ndnWNUA yĘ{1G:uxCnCqʳŅNhr Bi6mFiwv3Qlb{w gӭ[^n*&@MeY:[$؁9y)̋Rwgv3Uov%[WsE:҃ˎAC[^n? |Rru8yJ l\<`w:u,Wt~āeGw5>)\ʻuuhwQ.gLJ8XgA8:нht׭[ϻ«Wmun״ {%]u'Q|tRˋ *b)n3+_|n:u4W猇Y4 pfumm OQy=ϳց׭[ga1"!ѯ ]5).^)&Wm oL?dnݺݤD뺦;qAkzu7`%l< 2[OO}@͕ oyj:e)Jyn]uɶZ 뫮*>5PM*)(>WzXdZb;2hef|:vOyg} ݺu׭ۧd^|ee:fnr فyP^n/T7~aV]o/͕C͎m9|>o/]]]>8mhu1ׁ[n>/TI8s9!MBbـZwsebKd,5w>'d'=y:uu٪4 hy6d{v";;[g\f>O{fҭ[ϡyDݓw5pKWI܉>5G`(-6w; >3ϗu*6wi܅Ty=ily9Woڻi=g3wT֩#|+n/,nݞ3n82X|y+3BOi6jAm;t'x:؈zi?4 6tN7M)?Vbq,~wj)źu{t]f*">,t cs.z]mCM̏O}ujn ܛ٭[ω›02LHq^-a67.AE/]M3`Nq[=+^nЭ[ϭ»rڲ-UײV,y6.,._cV>[r??,9+Xwց׭KlT,MUE&o^>0sYnRu29hS~w~Din*6Ϗt`\W~^nݞʫIV0˲l|s<Ӷ-gۀ.iĞ"gLl9vlu [xԃ͸a2՛bpx_+E5vus4MXygJ,9K/L_sT:u^[^nWՕ76&MLYN3:h+vXL'-́xNrhߛnsѭ[^nLW25?+8ЯS=8m@#Gwwgn^k&6M b-5W4]}^p >Ϫ֮ ,2HAvց׭ۧ AS$:)Yj?6ϚR[iSTv5k_Nir^)VpCqK n[`V \0d~h6s1|yh:(9dy e})iAu zJu{ɀ- ؓ` IMqjXܲ˔ J'677o=6Ys]n^"cYWI!'k )"[;啘۬|ra?sNocnyS\N>u`@[>~)@: *:nPQ|]u O{M24xityNyN=^n;=yx||s^zNu_^k,u[KQe|N3B:uxn5 &-?@/J:؁׭3ݩ6z}@|%z4wkTRr^>`^vUL|3NvOfOƉ 0N}ׯx:^2v>vkשOE==t؁׭Kx 7#<SowZkk Ocnׁ׭3rhbyv@O][阺`7_ޱs0uu;zn/Nqa7n 7QqN)ŝ7;x-_*2l;0kqz˸F/֭OUo8B{h?;pQ?z;A{_nr.i 4;X m z76QMOuu{$ ]gר%X N79P]s%\ƽJPiRa4;CQz:}A,nஃp~ֱ J}[ z,0a|j> aBO,:R`:}nmUMNPVpuk7X6M`otOل̛@Y2ϦC.j1Ao&DhZW^Mۨn:T |ځ&}ܤ]Ǚ2,]v gGy.%Amvp,nƖN1!19>Sy; j`$*8z-n0ցso[^;[,!e'w;Tw2I7uK>AkWZ1i'¶j\Ҵ 4 @AjBRAOÆ(A֭ SNPxTCgaH.ׁl-.@ۏ:刃pwwN7o<~Wq D`í90 F! TsFi0="~>|/\e'KYx,{n[7wm{|o7 yXWa|L]ycAb׃ kWŻ9WiK=n*/4=Wh\"Y"KR'B@ `*0:tv\oۭnxx/ x vi(`di R6k'+pvp܁^8z.] _;Jp7=n Ty !2* yƏ@:4|!brNϳMaցׁښ~؁jݕ~> 67wC`RtקvyE]ɽF3M~q啱fB Yi+ABJTAPE& qB#aWM6À =<]y:ցw"no㡀^w`kʍv305aޏkX1ݎERcmbs[0ܢCT{ڹ.SBɦ`ů [҅K1>Y,FB Zz0ddu(=yb T Z`6Z0D:4ǸeG! n2ؓzŽՇڬ >ϯ{E=::0'~^ƺuubjۿ~ݷ*އ=n^ٹ5,Vn]}fzff.la7aA0ej:oq>3)3(N!&ˤM" 8uX1)'hnZ('K%LڿKȀSTt.K/x<'32G8,3,iƚX^9j*\yU^`p1b͚QWՈ D+Q|2 iM"|R_k|RÄ0{o2@zu}ywlz:=5쮳7?{a.&xn tsL=q N8̨ Q̴]8\&zdv +ZvW! HihEk^-e\)yӵ xAY+r#՜,J'5#Vl:aoOhuȌi rmjkyrn= #H/,T$j-+LNG $,o_{Ar^"Y ~oC[^?gg'W}x8K/R]gC{+G 7X`u\;Q[j*[ È^Ί'*S [^Ie]Of\eb"`65qv^ں8w3 0A ɵ` 1(2|aF "$(z4 6*EX )? }Q- {1čhF\L+܊Vq.QVAUhSh+=_q|˺f*C[^gRv Koۻdtg.34/`gMeٗWW6I ]O74h,Cਃj:3fTL̤ӱo% 5l-3V,2#482k3blpu)Rsގ`չ~̍i=/='6d\ _'x@6uk|0:uu{!{wnoO*U&ؕvy~%ixymNl(zf2Y8Zgf&Pr0b M.CLQJd^4Tl撼Y$f?r1Mn-͸'0eV\-)1R+2׮FO𖸒fB15v ;wYDTE`lY "3P$Aa\4H>Q̻y TýQ`Am8t b&kZ!Ϊ.ƻ0 }bwlSG|6w$6_~̻?֯+֡׭ E<ޣm0{ Ĕyn| }`Vupa^e CuCFYNɕvJ>A[1dWy=%K H6w$ h$>Ӑr: ?n > >*_;8:~w vuL{3_)77W|rgZ 8dY<u7FMYƚM pȶb=Y*f)]} !d;OqE(p,$2`QA&k ,0R2ẗ́!q;W5TF`El܉eu~8}>9~)<'̘-P*D/ CnYf0Y*2fuÊPWt 65i,@U9½Qee(`>0:PZYW֨串zɵQGp&DK1ހtW>zXځۭ֭+"_Vjp+>~(31*.ͩEsg>e /W.%&ɪ Y}Hy `uvJ$xC@Xi"]ϐ>AHɬ# F 0XEY7$}ϟ}cîi50B8+ɰw=4ϖi cQh*O> {fWb F)o5َ0BXyVХT$\Lq@ՠoh͂*xZ[C6qoFl!'?8/ :6_ A37]N_rybG;/ 8no?׽~*Gf8ݢͳaq7:d 碛8h׆nhiRm=}%;#b||_|~'YsG B(+ BVk"Snc)*Ff}J* FRQUx`PuC*Pl` :Ҥ먡AC^`UU\EkY< w1*X?{zE@ďWdA|ODhP ,/ ?ŗa^|g^ϟsi~uv@`y*9GVUfNNSYW+ %cve +G\3 2C JsܥAԝ&Ǔ2 J"̿WP ụnvOYSGJǹ";Lvج3d\q ,+6'=desdf oAVxfWB0Ȫh`C2 hACA5gaF΂tSg_޻(95MN7yUGb#lm>fUbLQeK'@2C3 9Ձ鰠BaRFP}cԸD+F0PjQšP` 7A\CZְrEKc=g q% x}kЙtO*λw߉nxn\LNyto;Ov/d˳ lכ`:Ч6 >TD<;р60ʤpk &XAB0Uנ0'G`2,Fs _q^sb)Aeo܅ioeo@.Xogw#{a$"K=aPBJIpPC4' g-f*R9U7RPs5&bBp8$J8AQWPPh @$c)w%Wjcǵ=ó) ͗?oW3Wy=ׁ C]e LVjڜ52yelA\&y* `CxC3#̇Ө 9`tІ Y@hV0{/I 8H,͹ sYlv`6Sul-{.7zlw=2L58LZ)!LjA`DSvO N  J UB kQ*rUC5Yy*NGP]R> mª6fU c]LD3!} A6)x|λĻ$fn_uw~o0^&ܹmD !w".S[צUЊR`Jf\^gy:9x :+tf|anȂs p ViqYPF3#1PmϿ?8 lAmܘ^nMM;wn:\ ^1ÿ/1`(s0z!VYB1MF0PrH&C5#|N!dAF{QH$G0T`#RhTc VrXbȑEV1r Ur.ul\j^-_.Cr^|~qěasvیm a؁ c˸8ߩnTdE0)2{a-Ŭd-68yhY|Fjp`C `9"g9anA .jqIDi s ٫k<&X&p[ٖ i}7;gA kNOg\WGȈPvi :PD; bL ՆԖ)1 }aň˕sմ 2Xab JX`r`[5(Ȯ*'p1m]J\F :llSkj| Wb\ nց׭9ǯ[˘ٮ`xqeȝ՘.R=$qr&W0n9xv27-e3GНֈ""rCDJ'/jAP@a6T E]zLĺVP>X9*1r0f#=lUpwW„` c˵D=/E?νxrv Uk'':uuwqE f3@xy$=nkpSdPv8H(X8^*]lX9ճlV1Ts#\WQ{!AX82`53dna4 ϼT,N' g-n3W͒Uf'cv`3} _|R䨅mPKJ$yN!rxP!AR6 04wȼ&@` AQV$]d)rm0/9 ªs`V%sֳqs^*u!ǁmn^>a;OUlZ#6ΓLD)]3֣,eq7*mP5Oޒ^{] Uϸh^$7FV(f1pe K3,oީz{ r#4:%*} gu0|_E_ʹK"@WS>M_:B`.'B+B5,b< Վ] ÔQ}e%V. V+XPG ; `]c9\}x|^B Ó33\FK[fKuun?+mR4nή+w.rXbx,` ^a&WMm]`abp!E`>g SN fC1*ݦ!cXcG|x呾Ɠk𹒛+a?gm_aVV. 7sg22ml紹{s }5GeE dE6Dr!$-'J S jH"C*YPa!CdcYd1ݫ5n,F%jEDk3% J*wKzv_):uޕْM֏lvQv;W;=@E`4gIa)q6(%Z9%O7$̕mDb.c*A:(Ѷ y p]2d˃*fBj晵GU^wkvur9. s\R, xsq Y@ZG%PVU`p0w;dY-UjC ~P"]&W@,C"j `‡ D"d.EBJ R)^ (P<]7P#!2 .pIn QIѰ+Q+Bp&"ʊ51T`̙D NuE׭m)C*W>t1Ҵ2 vA ֑/}3M !KMQfk0,^)89v9̵t!:s WwD[tLL6,vYrr%SsRxs"eW&jx_Q8̤ Œb4# ,ADȬA B < *kЊjEM$Έ 93]XІ[%U1pI+AQ!,\\$cNDuߎ=n_wKu7__ĘMpOYj;[s\V|òO1I,5i2sViܪS ofFn\/ͳ5LLYv$aZ&5hWQWUf:+f.3TC0BfaK*\ k!Z5R A,0X ]5?Y BV9HC!l4V* _r6k;T'[^/"AWf,C,razLwh6uUoD Hª*Wb\9Zfd2UY2:+/silp7/ӮtN9Ɯ'#}hsFړ_Un8P+{ٚ<2xƿ*-y%cyV7K f1"!a @rA"V`DU**V$\R.,*9Ns*b E]0P@7* izx:IM7v[]SL"KJNg%ƜH( ÿbE?m@Z;(6Na9IXICh*}bo`CSxo=mw|4 =-`Kn!+; .ES@,g 9*DIeAZD,:+ f0D )z!ubd ku=(Ej0]p"3bʕ>וB8^CH&SHdf\d;|GJWcffXd3^MN g3 UV#"Q,ZݩX8MA"\a&j"CA EMaRmm 3r\V`"ˁėM5xjn n_`/1'͗R92iY!l[l5z .`^C&mL4AG6>1Ew6jn 1MCNOM-l>Tmq[$̔W HCE0CUjH{gAim zp &1BJ(JpJAe6 eCih5G+,D*=Bu THZ BҝITa䬅7[X<\ݭU6; ӵYتdqgFgn @u"`)AS@ F<Cp3bsfVc@aH~g%tnce6~!uY.fٗvnW𕉅aTYB`)^iUXTѶuyt0 ĈTjmrdaf2FgIBcȨ 8^<1(Q6XQTO&XZ][WpxݾN`sEwLMl.hE6=Cs_5Z8e21o2 80Y7N`UfD"fcj҂A6ܪ$ bv4̕/cwuz:o*$L,#+(Hc+VFOUf]!!1!G"@fY5X ݪCa ]!G`B(F= իI Ӊȡ|TrJuE@JD ovj Nm*ݭO:@7OPi61+R$IMp*e&7"\2k`&#en!:=>%|۰TY6OLݚ[קxʲtC 6WKfy-U GT,GpeU**ee:L^221:ID,j- A"@Pz::nl͹bsun)aY96 : 0Dq4eQि"#r6WY -YQdVN2X%0ދ%f )<%KsyF%gjp$,ZLTY4n?x* TBfd#"1l|* JZ4V0[Je!UYwjL1 Jɨ0p2ñ&}"jDZ(t,6,a|ˉPń҄CJжfi^wM->J9+3]C0+ffAsYuҐ*FXtcnF XȲXM"97s{ G`SG~W@)dZ=PKZp}g|/x  .^ JQm*"[T!Z+C0U*H,G1,w @B 0 F!9(K3*](1:Ѡ!V`Sv 9%U%!4% :}msL*癛Mdhu>T5 CHfM$: fZ haeW i[xX>@A&6ޱzcDn$FUef՚C _91!,L~ Cb 8!,PGR d DVC(麔ҮJFg'COx]!Z y98Omxo?-7Eqrde^_Ԛ}O%D Lj m=#8jӧ#Xb%mQ>4P6d-]wC[C)0r ]aЈjLד$+nF<[)rd[%I3F6Jkwʛſ8`@iq'^9S߅5_~y~']pi]oP@~;7?݈e` Jn,$c#3%C LVc6[dU UsXtNӥ!iE#"$3 $YN߫Nd6/ݚ-f+butW`6`=:ک!>@S8yY2 2Oәe912o}7**ų9-ٮď;άG˘5;g{|KH7}xJ|aOOK,ԥ+O_?">( Jt32g$(U,`3I$e4F0^&$YPrIF4VP8g̠VRZQb*.nx_tW捰;f8R*Ye h *kLH8zb2˶XMKZ6h~絩] &G@ʫ zyx=߾=*)>w|rg*Eh_ك˳_[0VeBGs_" YVRɑh`WQ4 ZKۆ ̅1$ZWQ+BwdxgmiO}q@/ww hܙ,s %dcei:CY]Q HeJaef6y: ^U S__Olt;|O_!1u4k|x׀ݡ \obw4MN|xPJ!ˬMFS5Ak`tc%0Gfd/]jʯfq4iPTD`,ME& R ӾRV.7oޭ\ݘIJTrBwPf 02Ieh.P4 dWuJ&jPR?`H*,=oxsM ZwK]we:5ryy^^~P৫ ~7W@ޟέ9"ҡB&NY]2H`=;SO!Xȳ@i (ahg>YN< -6p [sreA렂'z۴pqt`ظO)NXuXdB&rD\bn_yW~WV:lRğ.C1cGJpݺ3\o>6*ͳ /ͳ;j\_08ERb֦ @,XXe]hVG_IZ 3)Al7֚DkrapYݓ?f-j,͛\fuu}fQf]X N3VLV l$mjȱwmr+sX y(ml]*>D _ۗ9|v8e=kַۿc{/^f]ҧI6|_{#WDcSUck3.*Vg.-Z< !pb|n k<ׂqSuu )m/ +`Ðq@։`3eq{yguM١|m3EU ?@+ o`~5t~/5:pc?GJ^UWf*?i $T g_ہ궝[5Z1޳ ˖baH@"P2fjv.򭤬ۉ@+ݜd&w)[Nmg7 ;:}!y;VW4AȬ̶ m$a[n jPkNiD5엿ko-UNʑn | U|V<p~ϴ]So.n7)\ޜt)qJ0$Jc9FgffθK` GP(hpÔy%s!m枺زze ~ v{Roˌˋl/vȕTv؟؎-O WEK,O4YsȂ,ګw_k2?ƈ72W[s~ٵvY %?U;*3e}-Zܬo_W>a5<dPakdYr^k64uYiI*S&sPX{}ډa֭S6?gb1p.9!+@vbhCWckF1: Z"\鹯h+*l7@l!6ΰi O*:Cfl^^`V#+xcxl2.$fu*ۅm15S~rn̹3'{޳t|Ss:cL!ĐDV|^sZBMmҥ͐)?\Ws::Ȟ߹/U)=,McrJxۤ<]W,hfŨa@P| xc)|v['Ùa{OxoBl2/cWjʔ=f+g^}{L9wAdSMfA-7Ot`pHbJ}((]׏:%O x Yؙi4ܹ]@g]1#)S! ];*U|c+?z˻Zٓo=iZLO +&^+휫/ܚ5oo~qu`xqQHE츭t^FJEw>g+)?3)"G.Tr+5=Acj$9bh/MM<;ׁ׭ëm.z8d=q3xod}PMm]j)=,bu,k4S|\띷"!2D %C b2)]®n?vweDI5]ڽ`1uuu"wp{|s<9Lcͥ,2s UPZ[  Q AgҗǦuL96W@9^<-M з%ŏ5r9u]ew,-N7w[j?&5M) veQ^ ^m.Z\[QĊ57ILUw0sl۾oyOغuutc<ҽ M!G2'O[uqtj8P< %pe αiyހ\yR-޸{hv_[%ۈ?.ͨИ`Tx@*gjTĈ[*¥myig̔_Qa2, lI\zuԮͣE̸e]V8JQP(x|ip$+ƣSaa< 0Zi SNft!Bq=*,\jOřkvo<p.&L6M*(*n4P8Ovb]¦eDkr:|*uq4fnNkj@@AA`;,psγV/qL5`gY֥[!6eal}' Ňj Pu;WŨ .+og)Ŷ`֟nxݺ=?hU8@EC^ܐBAT A@ Ӭ Ù-:Cɱq9[U +,A.335y: I/(ϾܖEXľʛ2@B:&gz#*F m?^*,T[u9LM5mC` ,vMhP _fznq؁ Cĕ3rSn !U\"<_<#\HϥV%US@ ן?.ɓĄ8Y#e>`/HnrwNJ{ʥ.C{wv)SK;W)e1,e .swf9ю]#u@VW*L%de﹂q?C^igXn0bnx>`;~ڬr% Jèjƴ Ba!G?|}[.^~9pZa*4ApP*<0&Ǹ 5dĕC19 7~r@a^}7mm5yLͭ~T4WYEk흳̧v3%2 dw%ZIiDj ]㹃S!ׁց틨N{bJb9S(x&BzQ³jyY1won|-^j…a ?mswnʹ@-oAx]-Ȗ%|' 屺y9uz9rl6~m]'ԝ30\qH#CEfT}mV:$hW{F){s>|]MCٯ[tuu`Β@aAU2H%tgS! +p{#V3&vO=wKJۛ~]@1z,&# \\?XM4HE]4C DeTX۷?LZ`5A&` ʯ[^9S)e5-by1\ mfv?% V U,AOa^c>'Y_>a;ah"Ye|k|mt|.ټز|q+n̘J nc O@ QŪm&#d掬p3ԵZ)ž , jVA-['׬pbk\lV{bhˋYNLij,ͬϋmRK?t}l128[?ҖEcm lؠ`De`ĈG4wt,iyۯwWܕio/nݶ"Vqe9B`_LMzHۉ:Ap( v%!Cub r>P=~\n8fK`oW>kT]ᲊEb)8zT!1?(x,+/O+ 4moھiq{`l?%9vnxʽvd% WM穳+?9]382%`HyA)*X*28 6f,1Ѧ"l?[^D^<@SZnnxݾ`<&aٺ?`V2pʼmV!6Bb0aGW,nM: N~ bخK7q >_Pfs%Y,u6a۶dZlB,\\ZՇlbۆHuޭG-#̐;!r3<dY- !/?LڀЃ$SX"EJc$Fps=TU^wĎȪ>ݧ:ȓq] e 9iBݑ`7DeG)G؂_ޭ[svyWP\>l2g2 8)I""GWk޽,g[6E'aZnUݖ+sBu |`n\׀?s"I%kazm\U´C_ O R8DqzeLTLJJ{ 7(h=^L<`Vm>q x:BpW@t^>؞LM$.YapʟI{߹1-ssyljezW*0mfYL!>.MÏ?קLL9h-4%ٛ~X%pvk \kjQ:Isu:;Рi\܆6Uj(-dF)Uܼ;9 ?jK|r!`°&4M/x6d"P|"cZXBM7x8D電~k Z՗'~1/\*rҌ]͛[um>7'wf; ȇ$ѷv/!X6za@hSmB!nqJ/oCg&Jdnd;d0Ty[j3Н::B0 $<=ʫ=XxEM1!eb.-&A)nJ s³ãW+BRLjM"WAwXkJ[K| 6x_~BoN'b6͡s-q) myIˢ JSY)HV!PKBC-Wc̢Rrpey}:𺽢p[%@8] pl[TL4|͍ [nYFI.AEl8CݩT` Qo ZJh4x}qn8G'xm֝WV*X4b@CLS&&pidq Ztӷ+|^WKژ\7?>v_`a@Ѧ2W1lu XMIwϛjBibMB+3=J_WYʉN9tSw%ɝqCŦţKI@U1cyxs/18+u[%0T_  "1h/O]gä*Ux( BU8~?{o )xQu. K@Eʆ>YycϿfJ{ȮA07Jهkz]tZq>8L,PBanTnpqdCrq/7,Yrx6˛&&4`MJ]ܴuܖK~[+g<*/$3 jI$0% tp&xȤ⚨a J'H5i$Is@L)$S/|P )(bo_T~L 9e؀\g(#B\>lX @ePLIANP7?sol ttuZn 57F~~53PZF cVwc-#bKSCaɄ,FK&p -8L8 9Z$* C$DI_3%3ƽ'oȠũ fWz7.4'!!2G)<\99ⴝ )ܜ9EZ=1ȻӟJyMf,/]ٙX?2~#os 1du,fH88@IbbpXҩ| (.]\TQe &Ys၉ 4۲;ܙ-|Cmnm*.;|'yjO)$.A(CX]KsHb_Jݐ T%4&SC"1$PEL T % $PM$q!]F]G*Is(8 'S+`JDoq(:L!`N.P;Ӳˠ1-ܘ\LXS!"~7h-8AՀOCjATz"h4" 9S#8. kl h Қ6ܖnjFhM9KM3SSH (BIO)J :EB:cen4x2޲AeTJ$YJ8΃\`VTM|RWmͤuu6؝r orq>{FQJ/rqr%!5%b)Jjx^aw[wd9xrq1 (*.v83"t>@DFgʀ "3؜C$tTc(J,I` V@JZsIchx`E PbʼdBJ)lG+r" $Rd/*I*-^gqLn (b$%bqR&" y 7(E6Xx iJHi F5wqY#6X RqД1.jW[%G>LFցNͻImr޼R3:]s^G (6Ī&IB(`$Hk$pg?ag hUStkh) , *I+R0 sxiT(2vJ'"t/u C2Tޓ;*@#|٬1Fg#].JTDFl0~Tc΃C:wDT9E$  7&3TDC2dwAK  8=BpPg7Tq2;uu{ݚO% \.pu<`2S%xxqy'DNIR\w` 9Ǭ<:i,bք@D“BR$VMpѸa Lw1iѽ,PRN,55A\C1>bz`U I:Lnjv|kցUޓ6osuzQv[S!T;(g1U@]rƸSPZ20,BpKFRJIV)] gnͶ+2wB/ER VbKf _ݡ LI@DNe6^}QCQ9G я;nI>:BH+i䣊#$!)p+Ke /ܗgt6s]<{A]_n v7<z6NUgf( _KZF9{r$d8 TQ*cƀq周5Ҽ(Bb=RKM Pt@3A8< Z'S/SWxM \b:)Q$@|YYGJ`"|)8DDnϓ#=\R"!I(-8;V'縹. u6&3pkZ`ɭyv \Gpm:Lb,U 1rz~׵?̐7/G\O0}q]kNA6ayRf' 2{lZ6W T~?e`<*I#ZRc8pʻ y]AFS$ơ"%%qJ$ DsHQ:<9!)Cr ag8;ys83Mnq7c' .SJŰ_V*9umJo'ӧ91G&M v cX?)=5|- w x\ kQMi8TW UHV8N bDO.50X%Y ɤa,1ϡ4v㱄 7*ǘ8HƝc(C&] IUIPnjzri>Kݦ:vuufwId+8gfZ=LM’%yU$BiI/QR~$̐K1yW2! =IM24KwIoE<.S e&Hj" 'aWL`ER`aeI RZI)2SdeR}QWGg =;t$&?Oqevvu*װ{!s-RꯂnW~ z)*:ErnCB/\ԵX0%fa`~ NA+>ݬ['_HBX7+Dc%"(W+.P L" %9$Hq'W5nY3LC/%S6=DH=y)ɧ]{ QqUMu9箆þ&Ɲa0j_=⌎,WNTd1m*7M9--;ŕ]BӓV^?гIZҺmܰܰ%|Lv?rq?Z WgpVEJfUzsҊb}簤^M}\wrU|yI՘߸CIpn r U\ƒRUݐ`,y&Q&1QA~.E]N8m}0sጠ;{%JBΉ\-3v"/]u{9]t`k1z^s[I>Iϯ1)[P<6hSznPn/JP1E /K֯P2D/fEe)/nN؟8pأ d_s :JKiɖ"'28k2\zsFj5{ZR :0:Ue9yA`'$HMî(u^sSnZ>Ej÷eQvЂk(Y]+}񰗲,^U6ȴ<0תܔ3D|;k&'(@ 0)\\=joMңsLZyjK6Ͷg-nܗ,XD,Ws3$sbtz4߾iݩO ܎wf>kk,Ppu.5;Ы;exkpVTYuصsϰ_J 9 MeƝH`(IH'('S)joGObSKصȍ\ZZEo"3;|LyRa &ۀk7 WWvx8xjeXWw>֘HWuTP]9kR`Ux^q~61qyc{Uuձ&W)c,.Kqu2%,Yul;4\܏K_04*#EfBqf%g4q`w5}J2 ! |cN],qɢh)R >+>2~ g< ōyVԒ9iٱg$O]RLa׭+n;A=һM O5֪o,?z}O]5A{]TX7_U{5)f r͉->I6YU\=3HN\**8brsDipyj6'HwȔa7% %H<|_LM>|'v@絛1D@Eսbiqo÷C{RMйhg{olNrM퍻b wLW0KUx=L.>RC&.9VU%Wd,I*@*ϛJ۳3CmD߼zwUuO :: Tw]'Z`kYZZ[u.-jG $N&vy' e[Y(EE,>,6KڼӉ7*.xF,+4'i 27q' +NP/tځ޳޳>QܳUtqVM z}ZUkݞӺ<^z lUᵮǭt վI@褨Phƃ/OU|ko-eزR|kq [x\\\{>/U\]2 ._>'s]@S|岼jޣэ텄]^^xOߩ/OʦBkO]?ǃ7{F)Ar'h-?z[9.ϋsnB6n_ G5e"rQqRc3vx纒{uͯr[RˌJYM%V0ޘD¤֤'N-K"Pw$?#3+2y.=q] \/lځǡN= m)߽ҟ~-kfZ nnEyQ]{|&7|g_3un`~q|4(]9 xB.~Qn/'>4VO~u?oܟ ob?ު[>zռӺ gg`L(ܖO.Mpָ4WXAyP^*uuu{wWrrʫ?&95 {r' |ӱ2|6'`޾l7e ,Xu"txx>aIο<R۲ c{{\kr]"/-p rO[#w?mP U)'q!o<=m7ët/::}rPzvێn5ϵ}3Ƿ-Wnwݣs̑x{ ?iXS}aݽQW5q}GUy0}P~ o{//i ݞ0  A_d}]Ȣ/%|;?q=\v} ޼ևkkhc%JNq#+m׀{,{R ½uKz<>Ǡw}/~?{scۿ,OxIMSjrz_{Qŀps֛4S] 1B;p47w/#_>M+nxx/wiw* }j)p p7A~SosN!Hi {Mv_&ey*~6>j^O\7O}cvoX|rx6_V-dE-QRI,ГUsCUmn3 _ցׁ߳??^w7G w{o8|7YsD_wm>Zٝ5W| *~M5Ix::^I=?p_}{ [AOWW^;/懼_V;uH/C2v ٪-&na픖aw uu .`{Zmn6LvP^}@q@*O71d]Uj۱o{y_zM~Mց׭K+;'"7܍2,ǵt&Ԗb5>'\>\5=oqoʗI'_nxݺUn.2^_6{r=nr+m- [^n/ʫ>TYlu j[ ؾ-<y:u{9`'s jbz[稠lU^k@l|bWy:u{ ԝvxfwڭ& ަm ^-+u׭[[\.*LudzB/m5Z>֗sunnݞ] qU 2yH*c(<,X9JhJ*[}ўGx%@~t[Wxݺu{_A)4G}8}MelZZr}V0ܛ|ͥrǮ{zgvGnxݺVcu0DC Cl뾚0Izc>b{yiN,kIQP+Hsߞߞ=\?|Znnxݺ0X]_ ݴ^Ҽ}] 9;W|c}[_;zO uu}pU6ٗ˰+zCvlLJw/1A]4~}:ɦZ{\{_C?.xUʢuuB(aYu[Bg* 4֕Y7L˘[-oF}Nm}{Y_ҭ[dYK(rZɲoR~M]SuOֲn>_[gX:'8 qsv֭}Uy5)&$9qeRRiySUMIߔxtqr6EꚖP^pͫywyNPzݭ٭[+fvTaJu{rCm e5^#R>_-SڗON޵znݞS0’o"qu]D}:e+| s46($&h۵۪LsgYOܢqA?]u/ [†jfuYXmfk/Ƕ٘ uh͹7k]nxݺ+P .T nv)Һ)9ktn4]% W@ufu{!~qu76:ſj@U{ìt(mXF˱E,P-2)f{Z͵9$Ig9I[^nݞ fy(1%'jc]Nʶq¦n]Wbf{?Vu͹䋿?(:u{遷RvܧMK6Gk fTmAZ&X[<~X=[nݞ/N/aE fS/p=nG稕sv.cxsLEmqu}οyc W6jcݺu׭Tξi]A|+K5(nzkuy,W,); r"¢ d#[/t׭+n^Z1;aP27 ve<++* rځES8[">w]O%*D_6^LEH )&єv|+ӭ+n^_;,9&E7Ȭj q葹ʂtϫǙ٪ԀGTںXε\רBnxݺl&[TεyflM ˮ,5sS4*ódlYj),' u VICrв]$?<:u{ހ9yeX+lM%'AgUuحmV<>*HѼ$Rez}~5nwuy.KrNz7}D\>e:2)a&L#r&V_9ʴe }J}ީKۦcͥm{sӦؼٞ=7y-7生>?\:u{Wܖ`*Q@SP'd͸ v(e Rbd u y͍{ٔԘZA-p<-QP]UB}!n .nݞf`~Y׷bO9AzK2wiiϩMˀdu{oBC=5n,S#JRʤ\uܠ(?txݺu{~ZrT|[H>[ڇޡ [OZɚp(u:؜6i30'7%DK*p5 &`̘]0}JHAJVд" &4{jvݺ Bsl[vWYi6^z0m2s~^n~X&+5ʭU|Qo}F zTfa>p}%H6yukع!?ו^Wxݺuٯ/xݺu֭[^nݺ&߃nݺu֭[n>Y*+nݺu֭[nݺu֭[n:uų{ vIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/splash_anim_12.png0000644000076500000000000016261112665102044024340 0ustar devwheel00000000000000PNG  IHDRjPIDATxۯlYvމ}s\2+++*EĖ()Qb2`7 ng݀[ta@nw Z$UHɺeUN}50XvޱT9s ##b+.7n^{;ܼWkoONp.Bx< I_<}}GЭOƖpbwIT8x&Ix85[^n^hS{7npi%OZwB8 QTuuE=yCIU񯻪ƹ]c~c!nxݺy;2b(mpyܡݤڵ{lϋ*n^ݒ`bp_ \U-U,/Ύɶ|v[לnxݺ>_:5'@#ʋflE"j8%֭۫Uzvݵ3JgcSIۋ۽j)n,Miԝ?nH?TwMz9V}(I~𮏽y)ց׭ś5o{ޱ-yI/D=I[7z{X)On޼/݁"??6tl1P;]y}`)!ݙ/rvu}~m :C{$QwycKnRbz:u{͵_M[P'wb{(=tXW桙z Wnޔ/B)({ΎQ';f}Eyy]/#מ/xݺ3n澅PË勾&xHSrLҟ6bw0bnD`x(52 Mo{ΎG<Kî[7Kkn_L.w㨜۶dC0KPu]^ y]uuuF(= @o I-11&1c]owuυ˞} /ۏ=z9x=}2,Ǻ3Bŋnp-p̏{}dC񰇞F~H=e7ݔAzϻun%P5!vKur/ Gd٥[^n;hKlY*jZ#wHN`U/xr/c/nہ׭ۛ;n)9eܷh9F]DG!VzoCOB'KW>wfWyxݺ)v=/+sY`<>e :̛fSKC罭>Y>vz\8.Wn/"C&-M-oʼKY>;F>[W:v]uurZм%e3$It9ۗ.ޗǟM̛ܘsuuWss%7A`;4vI J_RmN?.sD82Wwݥف׭ۛ!O4?ᶌ̻;ߔrי|ǨW!O_Uwn Կ xݺ)ܻATCvX-ŻBe%vm<=fT?Zθc]_};u{S`7]]!͡w1R1 5*bp%ܴ' >VX%l;vׁ׭ۛ;jSoǛU!5G 0v2޷|%-oRv߅nu7WpKU?u]٧u|U]Rȗ c^Mcs ;4w[7z{qSM#ƛqӂ~A]=D.^*no&$-d>M|tf^nonOgHOvwAw$3.͠^ zlϟM)ց׭lx;6cs~l!j^:w-NsYnR~\aKucz^^no[.̶npy޶{l.l.S [p8Ϲ|&n=% Kn^w \oz-g>@%%ܥ}8x|5m.-.v9߃nMah<ִ))E&Sm/[$Q>uv\}MkrK͡ZO'| NӾnb~#UxyqW5>9_d 0o =-7]u׭<\ON I+n =:^0Yy(5Lvz/]c; [7Xݴ<$ƻAϳb5+sʾ)se7ux6 CmsBgы(Mkͻz:ϟ o\n/!>i^^no›"pOR!ow ij&RvM-!:caJ__<v7,`7>ց׭k%fwh> -9``_}#9 ?r ;2n71n$7yXۛJO=6oRJ/<>0ϸm"}Rk\S#W3amZa<:n~$fC`Ͳ[ia}Z@i{16=Gh{&-kow`wOR;+D_{Wg7ݞ,A86fw. [݈ ns{RjStZLv򚼹Q!etl"mF=ɜ;#ݼzRK;Y( }ZB^nox{w}nC&ߥ4வ}]0"@okO_:?ꖝTmR.n^Lnݙ{2ܖVۄM`\ں@cT!`i*'m̅zk7оc`w_}1zN@p٭[ڴ9 D1yms\E6?@m} vzjV^dm*E:eN֮ݯ'ʅva!`Yv3N֭Oxqk[o2%}mV ՗!㢼sd]β[ݮ^TueכBo:.bFƶ6ϛ0+Im|`mЛ+], _\vݼ>bv:*CAn^MIMMy{~cY;6yr>M)øan9v:W ;}NN9Ies] pc _os[ܦn*w\';БW.iĽMvRY&,rf?~{]ݺQv& k{~glvufU&JQݗjO؎7S.vwm g)EsI!/+.V*c-G\~`F`|o,u?>;;[^n=0Vkǖ<gs};͠m)טe{ZxZ+n>,~ b)#P̛jLC7~(%u{$uvln?緻}lԡ[u7`밅ODYsnvׁ;co_嘟ۧvX;}oy1Mkxݺ}aw{ ?Q^;=}TNn\&,G k.캈Yuvep-W?o>uRqJenYXn=QWxݺu{Պe/pYC͡=jp9{`gv׉OE|ݺ틪_T-\^5}~zL ¾쮮:v@]Wxݺ}@uw.5K{ =^k)?4|_˲t7=4h P˱ۦj8VewqޤPv/.nn_ϯ;ioЮLs+tһi7~_Ы:u)]].fNbAQAv<5~rKm25Q.޾x]l;; ;,`7Y?Q>ѯlx_COWˈ՞˾aWTag7rK[/ vy^ή/A| '/_&n}0\/QٳY +xݺ}mmK-@T\=p%vm-, 㣀w_c`x ^ڛva~UlǾC Z4wa7Xm[A" Zw]zZW{YuwvEn.ǯ<1KxG 2 mz ٽx7}},^.&멹| w?Y+]^n?Yfz¬ iW`%5ozͼ#@T5m;} G@or_ΓU5vv]فw~b }l ,~Yg nV b@-O 󆽧N<+:r/nʰccG} {K ^ww~{n~vp݇38bie[V -kWU;nq?w1-Coz_?` 92nݗxݺ} =c_-?H0%9@ JKJYfa Vf@X[dҀ(+C\<>ᰛ7}>E`wl'( ,:!~Û%+c9:;u{;)&7aqo_7*v}peI{ހ4_8 6-5Ks:ONްQxvPZrh|L Xl89G탟͞= v{Bazvnxݺ=$_'mj6ٖM5Yo֞wlDE cygt'e W C#}gnv|m Mz=f*[flms۸Aq#ےTx&,a;/?Nu9Q~K0HݵNvvfevuuK5/n3?~VAGB'n( )xݺ=QuǂqmjjA|{ZmfҤ m' [D8B!lKXu/ΰ( ~~4fi旘@oz2{cxW|OԱuu밻;t a_ǖ&GxK6ܞqW phEjMF'f$kyHP("܀֜vn8O֘o[Y(K.TTRsu7=o0^mt%ׁ׭unRwQ{u *)S tqY}h D|  Z`fwŔ9 9֎O *W ~PC?Л_ݨqNOx xOvz`;R 0/mSNY>nN PU* 4G !ZP3悔fק\ j݌NQjTM*sC" tu{}aw ;l3lm ض<ϚC{֞5a> ,a'&.+xݺ vxAgVmae ]sUzt=pRv Fm$@TaY A3!Zcc%dֶ.Km! /q$gk0nˍik 5 .T] 2WUD8|ǟrO۾8x^{޵I]ܡx)5mܓsgg¦d-4.Ҭ\a~D[S%ӬZ6 b-ַy4M )mjf:n]V nbsc6wgT͙DpH8xW@im?:C;*/cTݾݎ"dqN[i'7؎ҫLM6l#O mW#`D "BpnkNq;5nL^@I US vU9F}>P`N`soFI (M";x>|O}ZnTk|oNn_(%nw m}۹1v9&҄mp:0=$Ew?;nʹcS{~Bam\&po'VMݹX'4WJm(UeR}"TV  S( 8=k GXX^nǫa syفmfaSu{f47{|,8۾X]50@zmvԜjwk p>/?}.M-2F6?5j%xԜT z5)P3mLJ5u 8&` + :ۼm&_nݝvwuY.$,)aN2.f5|Q/sei"@sUVcf5_DQmB7y1m9uŷ,Þޔ2>)꺔*r JFDnWD^U[M'а> Z(z]^nwTw/v;ؖzjGсEQڇMpSnzIZ]\):52#izMwgD'[3 B"];*p94doCg3$jҌDi,1^kx1ho\&p=9zP 8峧MU} ˞فVw;` ^غ(`|Ϗ\An6herGpѭ%lx)5t c~fIV* 4H `.F A!X 8J ]$m&2RlG߽ ;r{D|_זhVAū+Ӑ]Vcv@s_rT21b J*V'B5`X˓Gz/Pj[]|oOn50fekT]^gɸi6lLbk0 |hY7wdN6M[ɍuZ  D:>hSk7&e⚳IJ鷱9oTw:83rid uC!Vjp$+Tj=TWDe@Xn|o2Ŧ)@a2LdJF^cyk_Yayf*`٠b ʀ] V#죷# 0 ?~;f9Ԁݭفjv;, }[$}6eogmq lj287&FU6.dd2Z9h!",x\=jm?Pr?7j63mbv u:t\)m C&yk6fk faTDV|rkZFYXREwN.; 8OU~ۯtYwkvu)[ݕ/볋&-!w 즘qK-o\Cͅ4!+#҄ɪҦkby⦓SJ0tSXsS# k!ךa` D1K":?V S7džc@~2l drIo6\x@p{q`QMqPA1jKܬ]Vd Ȁ<(gr^>} )py+?`K޲ߎ:f>}6n[2}/[ݸj (X֊͚ n3@- OLڬ.Qo=Q[ĩA`UjJJB*$Q$k(Z Z S GL:X`Q[ L:v6I"! +5լӔʀ\(d951%[ɡ0bb=:Y"lxbN?(ުJob4N::}`+&їw.ۗgLM-&7W% Y+g֒MHRU-6")i LNAwr Mʯ1IfŐX]fɵ8$VYKRF)DH@,&A0T&2WeTsN $V@5fJՑ̬sȢl;*OM嵙s@ɢlG#2 KY7R, $%XVlIX:q<_>y[£ z#\AN>.n_L r^ߩr]'mi-Y'Ɛ"Xcq-E56Vu[D=S4^ !If5 T7fHe0D(*lJ%)P5g Zj+LtoF&83NgܜuKLIpDوl@XJBC i$s!1PZkLPituF) "4>05Pལ`7ie<}z^/?_͛cw}.l7*n? ӷ*awyZU~`7p](!Z\e[ n 'fj`vlrHm\Aw"`"VzƶqI)%&) SpӨ2ՑLI\@* *KZQŎsUK b8s6`@`TuP)t `EYːWbm'Z1«PփxH+ ~k7Sq`0~3z_@:}!?wA>uZ?zo\w߳yaܺ5\a^%N^ݘ%x' ,nC0%8M唼9Ag&H*GLORuьrkQr(yj0Z &HA:a\DC-jTK0j jT3h4N/2%CDb$/"bt @U0kuFR%eHڡbљ]8EŊ XSDAe~/hm/zwi׭ .X  $1B Ԗb&%BAIYLj` '(?Ǻp†6a?A<}%Yp|D }|H04{J^7vg'UͷZ7m=Bo˛'],m¸j.KK-.(9); %23<#%'48!`Gh*(O$,:0iٖYьs'XKf 1JhHd!cZ Q Ru$2BPjT6G#M٥ |an: I©l2xhRGVs1*L5yȑUJWƲ^ud .Hә.5OգBdWI<0>9Ao7u 7JwOvu{=mw2~~:?{IUwVt}}Q6WusfIu913l\^Jklɭej( npB=jLצ#Z}܆(YB>LWI0>%\\=+vo}?98ei~xz-6q;s}RWB.'^Lj UWTE.I{IaL!k5m2\5A% 9 C+D 4kMjdu]&E N@A (EH%⵻t-p*C&0X :B P4EY8r{! QbjW Zh Xb6fqc +(te#B<]96B('jtE_A(Q *sMkwo >ICHx)@ ̷ >'[^/?[y{m?&[nGݝ?B pqV<T苲`aƧLQgSUSddd2,{/djsk,ϊ!dE^A 5YH$\`&Hs@^U3l;r5gt`\PL*"ɤhĪ!ԛ3`E%kR 4 Q9++[ɂRTmfpD,*4lNAך5MWd2uuc4JXCv%q1 +?}B.().='z4{k޾6bX^/ G vZ"c?{>>˪N+y޲2'ȥ + Vƕ3=0 U՛ >:6jYS"n{KPP~C*D=$~p2LdN(.)! )s! PRJ5.GIT5D-Xg'B:Si9IG jB#.)!! %h\UfEu"G +Yt$3rHz%*Êk%w4ٕix*aIjje zzJ^7E Qo={oIw;syu:QUvøɾPؕ<--C$gh%d(;@&dT5 U˙S!jm n3j)`N+uVAf\]FR\Zx0!) H)@g$NEЌdu"@ %\3-4ղZL+n@"y`P PKhQ!EƕeCØId/%pd+8 aE#.VbYAFN+qb%#b6"'ʞ!$ۏU (L9phڴ%`j;~nk5֭v{{/o}KpՍZ)XRuun wtjN:<,>퓽(9*:VFo.ʨR K %RVdaH^,5ڍEJ h8]^(4%Ц%nPn!t!* :MQKRT{ YD)(:捪UDdb+ 1BdSdXu"s2>J.fC* FEAS1_d&ȋF_ EQ'CÕ0CFQaH׬|Sqh|=<~]h}w~`s̳8d v9N%Nu[2JL+æ5:]F:@j4(r`VV(w־JrS$ auL&KӬj69 ,+lsu wcJ H) ?jVYZ B6A* Buf`XD (a OqFIuyU'Gh&g)Bqb#S^G)l*fFdA/(ezJIB:Nl(--`" LU:N$< d LQpI #Ȟ:qi Bưq4j&=B)ZN 3>5ܤȜϣ嵠K,^FA+2:4H i8gYqd҇PrUF&%D? B!&T Rs5C % <ȕJ-QXAHNL= s"e%Cd\XzejyK6#)2W.d6*(d)"%\KT^Rh jίAg!c孏¯ݥ9vT9]u{o~\Uuw5 M%Y.DsGK 9YW a/??3~s|}.ۇoV %ه!}lἔBD"ҒWJVEQ Pg =UhD:JdUwȣVPH ƨ(2G<7qa¨KWL%.S8`"˺xd+ ,*Q,ִє#I/"_[<;3ӓUu$q|W+^ +n__:n&۟*gv)2)Ye_6^*«+e,Zb0‹,`lrD2tKoBMdU5Zx )A1zJj)$Fr dfQ4 O?x#||Nl`g~T-]WRҔW]O^<9˓{2I,DXmQ( \U@RuN^H. 5C"t(Z0,JdD@3# yt/CY@Tv 8/Zlԕ]=,4:% $e3dWF(e0(4WbǗf>JY9C~= 9SyG:u; Ï޹nϛ\>5첁g'Um<aEZjH0E2: +CZCddN[v SNRpcMfJaD IUd A{4o|+)57nj-5uYo3:b6=(ė^^Y飳~\t)IȽ2,:A!4Ya梖@؆SG>faLJ)!J@FZJhy!ipa0D/$yr0Ap0N@.HB?(P퐑`d GAr Eud  9'+)@YYaRSN_*r sXUg |b9L!NЅNJA<.k gܚw!fցMwk.a :<gg^u=z6CUy1CN]`<ǡ+aSXNi+ N):\.F `Vм69aP g g0K%!- 0`d$jo||7 ,Hoͬi3+a:gmW&v H^/'^{RV `X!}VҗtboRB  . UTmFSRENNP" 2%;ڹe9üZ c1Gb#D^91@]=<ymI ĈK V %"x"[i)9;6x&VkBMܭ ]u ;Е_qͺjh&`w\'[ 4/RWu?KݖSM`Y¦j6 p:1XL^ ٫:4kup5yE5$G䞭$yq?'wvNθUs+%8KZPZ[5Բn g}N~q5Cu-J+5e3 C 3ǀ"\A9gCdc)DْbC`D]Y@(bc!`$/9y1Tȉ cPQ Fw O? @꣝5uSwG/ׄ>/՝TM'WU鍫M5Uǜ6]YʊM]eG3K֌KY뷙j6;ˠT̒P ae/n.2p&h&e`0OuO :}LBLn3^&jmhۆ*aUfS?ӗ/_>[+uʃyMtGId 8T_^CdrS$RD|\#:Kqpf%l3Ñʊ*' J T A$xjd`WpZ .HVRShcJK.k YD fn&x[}D]pu PgOߩU^Wx0 pgnӪyeuaR`j l5X rlpӊ lY'#X\,1SN`rڎ?En`L`. c LFg)a}NYv&ĕ)Û]ʜghnwmX +W+ǧy Oa KFXu޺jBmYD&0E Yq)bXeJ0f#"!3)#!Bb'T*2.h%hrQ].EIV@5jE]VYA|O&$B\<>{ < 虚xݺnan\颪qv5$a15e"T-\&77Y*\t(<JWÉR}iU9-m1%oQWdV͕94T`޶YB{I# sE@TP$7nMeT$kPq1`9E8ڪE#sEɲV laqFKL8d2#`af*+SY@Zh/h6«"i>iVgMmaab0yGq aIC5[3 `gsЌY%2A& =<}"N.8wmN1~m mmն gn ڽ`T U$'6 TZMEtN"2 R8XI%`T^LXEBAV CQ`!d, gx$[hE5УFMF$q$<3Zx!1 }8M/)珅bgO 5o_A:)6nrGηCmyv25fwrU5fkⵤsYYZM``-LQyD$kZFSEo,C28BN IPf\Jq:iƇWޞrt4ZLxsrunHN3_mҦPh{M 4-,f{ &P 2Z/ <+Pđfوfc,C(" Y W^.-X{I ;/0L*9v5ɠ+a( ɉAgqƵ9-!Jzn2z>PsحW m)N)Ta9>q ZKV&r<@9WCD] 4SbnVfJ^aij&!0!1iG߬MlᒜN{ 8oSglM6&7-`g VB5 2B*$:ֲYLRkwHS,E E fBa a!Q 2IQ{dkJ q]}ף\0ՠqL`5CU2h- W ` 2Wψ'xWСׁ n+s.GUjC;a*E ɥ ¸^S.թ浩9`A<)Y jaVGӂI4]2=ׅ):aH~c(׶)F7ء)8,m͝-bxCˬܔ"LK]wcN\5w;\ax:@ jQ_yI (XB^D 1t[,a>QB4(fQi*PqD 2$"5C&\"#LC4Bq n*f" PV>d8D$"ʍV9-|!J.Ks@e=z:~.=}0KmS>եuYIN+ !E0~L:2VP,Ĕ j'RkYBJYo]#2d0M1!-cr&SvPxl.MO[7'􉛶ۼMv SP1X>`KO~#JfY%5 (@E)2ŀ{(0:JP lMdRBnA)˵;5ZEō@+R(H0LPP @pPY1 ȨQ c` ) 3)yEp~yUO˩Z^\8\ ;}۠OSӫ M2iy8 VЅ(#Rê[Wp%aJh0$&eP3eV C pP3st/L_ҷ3aYa=6vZJJ)m;̟zXbRqCve"8¢ eB+u!, EA i9*Y(1h%̰2@ `R<H+Rq*1en?u1R ZhNՄ<2 <1O jߛn|XtAZҲ/fE;AxDm0 *ITm̛s0NHh^%DC6ɂ3h i RU&9e溜4pYπ75^rejw zf@f,r{2\<˳ rY`Uwf՝iRC!B53@@ :FF" ,@!V(A+&"P!5`4*K( "D\eڐ(u.aY W'G@n秵OFJ8,cSzy*Dxt|6Sءׁ]SUfmo=biQejfq*ZH~MSm;6ZzdHfaB0٬9e<g4n4Ih4dn>E-g}Rk[7Ds_r6orgky|LS_ߗNa~| E)=2+0j4,El3HN֡{:&(XXǑdNU` "L(0v1K*H #SUA䁸\)Z 'Bz]3m_ 6۶){s3ݶWltb{-X]f. =`1Ȭp9a>M6u_ߴӞr,mGqe͒Vz];w g[\TJugZSwކ'g|u1qb( TGe@T0%"h;٠PX # !1Ձ\T`l% PY=KM=F%XlۊT Q㉱H #3u2 LSre ?2W\[ψ&(Iue6M̜j<΢no> RFՙ4mm Y`#a`CHA .L!-WUBtdz˵n96=.k,oZ%­H0pӛ-@Uݥ݄M dGO.=(PYT@B"PVj2 g1T$^T%h ȢQP1Xj{5 U(pDQKmkFX2xȃ(Q22@+CT 1$ȩr"-A" #TV'tu{ݠ{mRvTMԮ)Tw&QKrc a6f2-ĂZ$bU)@i =f) ,M"=] 5q^O7V>g*Uª U{`ȉZ LM i $ SD3C󐅑3k4 Ei+ EGed=P]wknli3om/>YܵcМEGAnW -6YOZeiT@+jd¢eZDг3 V; Ujz s%RA X[(ĺu8lu(.2E<4礬N5.]̬x#0;TPkʐX->/~í5xMJo2ܦƮ) x':-!M4`ZGG"kY:i 33\ފ 9e0 # Bf ^ |X/OvR:)Lߺ/'`}B UV)n_``/1'oO ܹ_] ۤdsd"@mVC&L4QK'6Z\{2/gjse7Sxn/ [b6aʺLvKmued⧀V`N%/(BC PEUeTFMp,rAu+I:N#!U 5QbM^Lͱ+FAJˢv+wD BjRF\J#+mL^:ڼ{ӡׁst.ng n"xyֺ6K {謀btPianE YI$%"H`n7cX&XK,Y]fl>2k@g{\mϧ%Lz9ܥ,JZy)OPHdIT* JXLx z=*" c1CY 0WHA "*0 MIEa5SSfJ֠ ZW ʫQ%) c .nYD:^&N\%C6a=c2W'Սuu:!u7]%t,!:]d&3N;+2cM1^7a~natgnL[ k2W~^4Ց6cMMSܾDBI'['ۮ`"K-T 3iP!+pc j/x+=3-KUMsdQh8@@nEㅵ!ÔnC Hň1KHy0d3ܘhnTm2 "S&0#zJ^7 ;'}珀n pu}<[aM S19d`hĒ`W@U7!IApOj bnE\052jٗ;c)%߿w"J:jϽKsYn檜؁וbt]xNK7}f_d|Vkto;4]ll694 `m  -*,k`Ig"X` AGS VEWd & V (>`ŽH$R"X FPc2+P e0$:@Ȭnh0,l/,[UulqߏcV҄}Jn߾b5;Ӽl]m;1m>\&21T<9f̪C̼ՐP+ЍR !H5we5i>x~k{w <~ X= 9?Zw-F\dinza.V*Mz)0]A\2C @qD ҦVQczf/$JT7H![TdQ&% IT$ULdEr )0}%_єAi91!{qDaB!Q5s^]czȭ:}1]k6L:癛]­Kb7Y/jSdV]zj6!+N5z&3!@ ʭ0("IVe~.?lGLy,䓏-7ێ-sU7SgY3inN~Hlʲ~ss* @y%~?NK|D^Hh+` #r1F)p5(k:?E3:UGC-Ij.hQ`AJCS `E.}ĸ"o'`"+S\+S(f9L"BB&)`Utrtݲۛ`2 Ӵ8lD &,oI7#,;0iT4bu JqRTdLٲՃhJ _W ޾%v&%/*pq@..OLٚmZfbu !?WqYy(Fzdβ?I:sߎq;?TeJim2P!!Kku*t !c[LUH-T`na@51oAWO"L((ݑU`QuUVWU{iT-U 4<ĘQwpsv8vu)}\s'gj}!+zxl#ԈS\+S0)(aUyec*t6!LZ.H`F_O_Go}mC>C;p]Bg_K/Ōuq'?I=e2k:&JUߴ\e{ϦvOMb^l!i 2jG 8F o 9Xy{ݧO'kk$d:0Ax-3ڈZHB-1êܬ5`O//=u$Z`| ['@}E-5aOz} L@ZK`G n{jUY8N-_Է"C?qM UJB8(2Eg jJm+%EX]hJ(Vcx$a A@ 7#Z١Jye S*F9XP ~jńYܮ] }0z]^^޼Ta -0j\aЈ aAQe7#Zp^[N ,HJ;îVBff?ڿ޷gjD1 3o){/+~ | ՗Ooش Yϫnrl:>pٙlZhTO!~ϖ~w%Zȍ!#pRĂG E@aJFز3ɍ0"P{i TΛ k2 hOMEƚ !7U7X_d!#Tx5Tkr~xݾ ydgjuR ͵Uw9TEpLPZ{V^Z6S,dQjrQ %I,-Cjf&\@6=l5+UUљPu:!PXOg%lx3/|7u9ue C6-U^TP; Ŭ+$WUoف**=B1˲.P E[XG4Tݶ`M4Ȉ&G0yT&V5B@Ql*[vS57fk(QBUm٣߈gAx:[-Y3Nmjk1v^Z4E^NG" NlR (a |'u԰r S t u;X#M+=ۗn_ C@Μweq'I0ؤȪCqjy 2ILX]^ $ z1NO.Gr6pA5H-՝zLoyC ls1I^ .Qy7{,ɼCU $(J6i !QA7?K/%?ʯ~p¡ [aɔC!J`@{o燵9̼Vu5{$${|_,Ax(Ye67SLy(.Pj Ȅ1&1*<sHRD w~s?_ү2tBxե)͟>6;Ҟx %vhbvVBy: e=$.'%ueJjs_2曇?0MAH9D $ ɥEB)$g"g2eez%se֥Y{Jla>90piDd%s`mvvu0r7v8#8 }98'cLK2'':Z '@, uOT|O_uYaB4.M)o.I2uz[]$`Wm|&?_z(xPvMh6g\Y6jOX唍_!R$^W.."~36ߎ_FiCS EMą?QR 1e}E~L dFlU|&@&h{ӵ7g I eG* TC8ɻ}HLKMY72bvO op",__-_S*N nhᬍeдm{_C?|7j~"SJP~rDh̰y* 1z^ކ2c(%PU}sPrewO*G$1-駞n n/؃f \mCơF`d])skvhdS%U:V(Οup1[-gӿ /qjS=r| M;%uLE5]ͤ*l.V/:߹*`BOE0F4f4d tJp܇}AN< 6gͰki/"+#4Hmͤk Eߑ Q䵪X}^]denópU:bjp(@PõYzr+A&)#J]5/ԯ<}&"G:6eNV?/|;4LV~c1C1> kBJBmUZ"$0k܄JlV2yܾ~ Ý}  HN Gݶ2FPP2 %zBh#e&D+B,ʽ'l4RhxqI%O^:6Txx>mqyy2nqP&JHNX"6c! T|J̝7T٠.{yc-~gKy5]JkpvO.J&R7Fyo? P(ZijTtx=98E]J-,n&,|1Pa>ADnˀX9gb ٵ9`fMN{/ Lz>GDAcց= o 5# `I"$e:ŧ:viAA"%aPg?_jsf2lfVw'il֕X>;\'l̫Suӯ򷈯Rj"TS/3H`S`s`I=[`YZ]OɷM TBRĜŬ1Z< 37 ChQzP3(IXy')=6*%:2d|iPWux^pSm_JrkZ!NJ\:7iR[GsA >S~g~>#7mvgb*Z^>[io>|wcJ3ooE;w7jEɸTy6o]f6g{?Pb EMPJShX.+yDqrY 1pefd,K8_@%G鳧eucx>jF9Bt6d`M/YTH,tkoS*#3B$&Dx֮u[`nP׏1xqoUZ]_ )ƥY78C @|aNVqFsXe[J<x?o+39 8[)H S &((ƀF0HiT ܶU^i^*UցCo5,pzuܽYHqbbs6LZgGRhZ痢k)!ɓ;`봴^\GdL V+F1D٫ȁ۵ -x1 ɜ};?*}19CYgJҎjjr Q <<IO/ߎ"t(sTIJD"թpqδ)d{=5 Nj)n'WxݱLk4F- \t1 uJ@% \?3r-uYpPϦ{x|'Pt-6x 爮+Lw݇Z x;tyDEX ЭQ~u_+?sTC%S$FdN",#.jԀ/Ԟ5n[\4.@6aYDĸ]ukۆx&NBa[~;sXrxT1[泃+XMLKl6P'_t} Qx$1~^icw{/I(d}on"ye\80Ly 07bpBZv$\}U-E wbB0Hy) sD:FM&ET`in |9G[TPڳh<}yY^Ȟ˱/OK*\cbJKˑlrt]Q5 'O韥Itlڸݸܡs Ll| ?C|K]z.e[cu<|2XK0.'W$> ,*dv,@Qp5ULM7㣻ӋbGNMтȈDh[&\fĨ0cxb1fwe,XaړXѹ׏-\7C 1b Y ήsNNQLeZN!Cjǫj" b2~L%1M'P\,j^|+xy.n:3{?{'PXeV&uqqs8u].\4˺l4ۏSۗ/hERQ⥹3&+si0LSJ rlJckq=!@>GԵy|7 Kqm9Z. $A!4k;\n-bUy\u\ۥUE$,|eV 5_ZxH&Ae zi; |t*׬k3=5Qzvdz$8Q@2 )4c Je]WӖD|O!-`=?m!ׁ g&:G9Z` ,J91^v8"&1rx\(5,4/*Wg8n7qsuR,Cc|PM#K1Uw[ǒ:u;vf8ǫ/XqkWDU(^_\>c^n1.hg\6ufut 3 ڍ:5֮M0e nr-2`5 +*mƬ@lݚ]ϣJ4.eɨciI+enM|o";6 ]|&؁׭nZfP\-I 3ErJlISt&nV]5I8\uJt~\X+F\.\Uե6 j\&L%imU(>&|VTMF5ڬ̖ VoDN)6&/Svsd.T"QŠ4תa׾/ڒx o{zx>.xФ[S`XPkSi).Rc=|i7;Me$T` %mUQf؏Y 3Eapffp*Eh+\3@aOnZ'QY](ddk֚eޜ^ sݫ[uRᵉ*O6>uux'&V[sk c8N%p]%L`q{ux_U|i/3 WZ:rvalMK#F ?d\Ė)Cq Dqm#l蚂ZGeRkUh&H:Khr5]? <׼7A'VjU"tC*t dW^m(y@vqMѪ gUzhPZ4^"#1LfB)ZژElKq4)?pw$`ɶH'y?QQTJzc1(KpG@k =u>lxݺ䥠6'(2 f)',N*S9|H}%\DWJ`rHr\Ups4k2kŠN'%-~v:Xfm*< cnSgW3#Q*pGZ)9Ɠh[-՛u:0DL`QĆdTeW]Ƣ)% 7:8c|P6uu\N]W\x>"=)/ی94g2 <J;v/TUtzޙuu[`5HVnί~ b\xhw(3&ߛo"F7cMYU9`/ejfM(l)X YK'vouBScpδ){; F/ݠx^tGwW.Oӫ1jn*U~4x8s'"<^&P䢦tP<Iv'`5P0Tzso^ nL5%Iq7 Yg7_z~]WJBs u7-b|:֬5yq N'ݡ^{~xyM[ŷ.=hZ?7^mdtf_6h'34i6lvoZ֩Pw] ٌ݅vhR͎}kPB=KBKWux^tv/_rh5u[KKۂfCʺLM\Yd\<ܬ{pjMf,o3]} .BB@#JKDU Z#] fbsNqQփ:5>[^ GMbY%vXW`v8XxTBMœANS Ar zz#j$w2n;OpkγHě{u|;bSOWVN1آ>uݓ&tVcz3.(m(nꥍ&ADke+)͏Ut|$zB7_vxMn @%['ݹ6`ϫn"9aOsS),ͨ)*=~$ ֤Zfn罕"u.]`BÈF쐑1"cĈG'ŝZ/\` T2~3QPA7Yiq\2= P~'M9feW34\~ 1.c910wx#E i"Ko\@{Ja{ ǭC@;6Mخ~tuu{aOny7$f ч>.̩qF/ 9+ݖHqRߤձ-rܟA]qWeb@/@Wq_]yq.ox{s# RM X{u9e4/@Uـ{dQsd 9D),j*Bdb7KʢAJ&&W(M6Q6mƺuuBikx@aܟ ؕđt.N Dbt AqqqS+MwkݓVT_.J/O eWoW8W Ȱ?q/w[f#Tom|9ͼ[q@m˰͑Բ{<qC'O)t;wN cJ4 p$QiE&3K&BY &e-{Pwv|N߯nx>ʭ9<6/i|2fwV(B/̀|ĩ^GWb$&bg?>ך5EqrYW "WnVVÈ |`ݸZ_ո}YT7u]沅iz,giےWՃROoe;]a𺟓;?BI \n90;6%rvuenPv>-x6oNn<GovSut0WEYv6wZ, M '/%$1YqGJ%!e ܔPd1\l4$EI2/OZ.1wViݙ2J67*zqkQy^aXXVצZ<2S@EMPl-I,Kg=\n"Fӣͻ'WUvҪ<- )^ܗTFU6oL]Ih,q]%e^}eyL ŒE&ҁf=TF5CutqߞUH(B rqe(0H r: )$C)bU)`RkrszU^5;n{X^^= oJW?mk(d18ĵB̅%$:"Ȁ8mT)AɏxeK6?4&e鍍ҫ-u ܼQ;d\x}7o;k62u$ue]}Uq!}e >,BMk>JhFe<\qTWT_I"鳼+;{-SցC [}ɸ,L`YPaVG"'h!YeRj|x"ȃ)}.׸M7n6%7 'z\3Xƅ U=—x rٔ䦍Xs.k̫֓rٛBhxӄ*txuud71 C2:'z`p9dP@(PHs*(lRBuz{2nwL9nW`^~(v!|AwϺJ9Kf)]ġFOn)p848 ξ?.}k>KeT5{#kKB-x#KE =FUj1:yyָ'ݚdrFšy~uq_gsHJ'!K.*dx ,,<$Y2N> ٚ.Hv'+e23Jn7/-oyh}ҢE9j.f Amf 7e"xiآF!7__)\5gh>):N,sf%&T*Mqzdq>?7~7޼o@o'r7x˱&7ʽk+z-'ܡ[9eHsbNW .N#|DܠM&p p1CtDR4eʛVZ.w\QA`Xo-po+vm<͜28q0MPpP0⃡4DQABWyDH IPq;⍇xovs%t6&^s?zhH9_ 6k`׾!S?? K6mfԸj UPlj>ގER\ JMIit#J&hAA"d(~jRG@Bk5Jʼ\`3o.S(8ց1-+5^.̽6)̉6ZhfqP,*MI\:*Nٷ_?SO{p<\ |ҘJ.eO=2x`- gNgˇ}_zL:gww?~KïʙJwǵ[s],@oui N'`C @wS4tVFx9#U9KM}Bs y$' hEB 3 HgCbJ-¥pT^ha$0wp\kݤ :>D&d^7'ȑZ'er0&o(PIt(PؐL#) 1%2%AФ$I$BS2M.iBL@Ok>~.ΖZ^ )h@1dyL0LS٢nL}{_@y,6?g>/~榅X.+ļ] "T0diPi TIAOůsOT+<HӀסdHTU˰ % Po᛿Ss;`R JXRPm3w3KEr5^`i ܎B@vn)bh!Md5Թc"qu*]]\$&b1iH Hx`bb,1ƢKPM /M .nSxf+Y<u |O~ܖc;/jd a&(`J7W0P"PdJ1)UAU5b&P`JP}`JxJĠ~!~}Ť*Ux(f+>ʧzݗT7O% ȃe)ax Ͽ7~d6K՗›$4㓯_ [B4G\͠ ENO^wDI |6SY c [)V\5r"Fd1 6):(5 '8nWށׁsuk޾[2 ôx L 2&*tuCI!@Mj#􄦥&Q  yv#jp-mP&!56{Wf^^xTmw[A)Z>MF9/1=PݐHMRېe 4A&CJdI q! Qj4#L]}2r8?g7xED-N]7 ;ܗGo?䟾{p}llR) yy< r"Em"' XX4n~s7+) ;ǬVd9޷<>0^}3yC#2L&n6"NHQnDf*Q#Bg#Aqu2T!\1Do4cC @Q D6jWHedTԟȵ:D" |WO:+i}rF\/ke2r2'HNP;@e DkL]Iot5iI˄dc*yF4'7)i&55ayYw T:N]9-oGzJ43+/YFX@K%7+w[u>~v] @JK4ED-SU"jjHaL EE Hr\0; FB\>5aM4I&&P@U,9}0)+rd \$EiuTQDI-m kfɘ(EnpRt \(Zxɘ,xbHѓ[D f%ԦPs L)j>PBbtdqPc:KD'A:T]B8AG #>wt$,Hn&↖E-FʊCnPM^pHyslvtu.VrK1#8ZgT,b!HVD82Q{ʃb؉j&K+I$Od"^&઀E I dTREIb 7,M'PTrQez_HVQp:LHEg/bsefeP, h&INv5rdxBt@I$srRLM"Ս!@0Q@+1*AML'&n挔8# )*q̻CY`!!xhtyr?TdހmoGHIg K@E@ 'ѫP<INBSrDh)3\ę\AU(U$!HdrhIi ]`U0f WQvEJ$K& vه׹8ʼn(> #粜tt`BIH j (b $98Y&xl*AeLSH&Fʊĵ@Өҹ_6GV':*B -"nks/dSЅT'8:""I[ƫ@'}`T E wOFX4H TWu1%2")3ɧ)1Ȩ zԌԈ0x:cj^ձa.P:vS,8ym`!؁#-o/N'+dJZS8(mF@Bj*!aFH (!\LR R!IiHBI1b"H.AtDBcri-_X/򌮺q0ՎVZTko_5:FǵLΘa!JUPiBC*Mj$bo[ZzIy%jZ"N<o`'>&+@I* Wqu8"6P/@X57t86ynKFmawLn/{\䚓)у(Th;lR#ϓ(n %l4MYHTP-b)Q.u[eR xGb~)p*I*1nN\)ar# .;%4R N*Pb‘ T\RSJ£AdNN%CA3 U*5P).tS8}".2gZLZbF2?Tʼnc78\"-R!bBx<ޔ}nx>*:mT1[oSKpq ].b*Ev'FnHř2`ƌ<65 = c!PT (ʭj R-5i`Ҁhx`#@=+ r f* .!bJ`I8ܡ%Q.N^*0є@PfsH!*Q0dn#@uD_K^2%(P@P&ByOOu'&qCZosdOD߁8-LU)!]^mmuj,+~*59zT& bIIk$$ PFNq % " &Es6D#*]\$,)iXqZ4L5E&i0 YRVAl +`8͋'Ȅ8` L3sr GdG#eqJ1"Y"jc uEdɜREb:69JYi`e,ƭYYj-aNK.f`w7O )Ǽ]i35;:}x]Bmb{T^h%s5nFxQYA Z jVM&pȚ󝫊ÇrxVELnTEr 'R"LAKnB$(ݕq%ƶ%'Fէh^0Gj',0o-"ZUsFB4k$R"hr]%1BDMC#jL!lȐkFN9JR`3(2<`%`YAxx0NJLou: qnE1uk>khr+^Arޔ4*ms`L$#96SI0*dQ@c0*i2d'NB ]Rrr wؠ( EK;QP5r4PZS+ :158lWe.c\LW-5y)"~bH`;"0>}OjN.>ju8<ՄÂ1a$ QR@ӓCY}@5 fK#>Z SpLՍ&%T1nOĩP%n& avx>&ngQy ;4\.OؙgQB#"U>$vIqnvEALwsRYyt es%)>Y M t' !)2-]&G\h/$$`'e`#8!%ZeKEQ_ؐ166cVcL.QO.Ƙqg^z{$UFJyQaHΈYF ^22Z<PB=xm WRvBNYHypenZ YK+2\uwQ†\KqEFRHR\^}NI &Dו9pHx)51ɱnse4ƓGQ@h6&ƘU FJJ=Jt^I&7/դyp‡Pi-jKG(Z"EfBaDeA)1Z*r,9RjJ$v$(cm/G,eid5Ƭ=@QaTZO4dܝpeZH!Zy1P99H@RT@Б/@i SJuq'.LLO`RdCzq^lɅS%lîy[wZ=Iqy+S6;`w"F¦$wdNjS0QHqkíGK* ̀'gޖ8 fVuy%^s)/f ~ujP<X3Z+b5Nڨ'}UpU)ԣA@zbptב[%)깼@k$P-DžlFDݠX4M…ddB䔜JBQf9i` hUhȷD ٙЧjܖ YY ȃaLfWG,#GJޖ"d}c )CNMNP:?bzR poT!u7"}van^'ln#\.^#Ag m-0nmm6&2O,$ApOq8-:Uv-,σF)^.\T-6#0ێn.;|}pC݆vjepcqlw4E"^X݇'N'u]0E5#^^5ɅY-$ʮ4@o9zpÏAc~P? w'nsnRz`H2g1y{ 06AO(،V0QJ`\/j+7 &ȶq~*;5`J^m "S4@eV9V"W9V!"KTʟpY:F)nMބW'>4M`g&R7o+EyO˦Fm f.*0M^` Bu1uWsm> 8gfZ=LE v[)I,,Q#EU$aJ2N!ՀOBeDr2 YIyL@rq:24Ԟ8E9LEUnS^=ǤԈ6S"YQCוXYKGo!vHlOV I ͹),F)LPc(?6O-$24˱^k᫐ z:}Tuۯa,;BCѽofWA7 =Kq[`"YL9!`TXc|*@-T̀NEaM`Qi+3*1*x),qz&S_aN=EbnQCq8D"9]mK1;6p w- $Mp<>5삔n0W ⬸9+OTq]I^71 z>15tnZwxޱmm_ɕ8Bk,O/Oerm*_M^Mj/odVwv[LC b 1X'xEmEM]6npq]nbukP,Uy7Is< Z8%qy|si,MB m\w'@vl97+붋.,Cb=F/v *,Sun{VTv-=pm3 Ӱ9[.O+00bVOڭ7!] z.Z<\772ov}Ee-ܑi.Oqmlpml778/\>2⃜ܝm䜿hѦ+ ¥QiɅuo&ZvN̫[ gywyZBU<ͶQʠk×l7di6u ¶,?-Ew4n{Sn7S^? wWz7 NseǦLatfy|7szA<36/dR,•wu*^ .πa z@0^3Z}lC)KyvW|v\*V..>69ewP)@ f$wyy]j{!ħz(Sx|RB<[{}& xoٞRV*nZ11'@p,@`CǯG%Z9-C4mQZ0)^׾SVix4܁}-~@'tOѽ߫ߙcru|$<9T .֟b_mĖv5WlЋ]$v|⯙g,ȇwnw_Bƅ 8\ I=6s^UuU͝5տ7+$ϛmzN;@Ox~2{wn>ǟ{. 5<ެjgu{u-,qbNnɼww^-a6=9[*v] -]fU*x{Tɏ?( GonEe3qR>(‹ h/_)`[vӇ7~`$:^~oyG\ CY=Tz[۬{s|c[*=7n-ܕ26{rmU^6jmՐgwѸ-/ѝn-誽rYUyu>ip7S, +Җ-e\ԵI*x^ȧi?W:𺽀 TO 9LkMdiYq<\B~+P` ڨ]uu wx}Zn٪//]zJQWu{NNݝy =춭z lU]p sOr(2k]6{A]܋nJR>d*")d}Qm]] ?5?ukh]s|O!o!.Cuuuw[rvg ZAmk)!{rUo+5؃*X =-PZ=sx!]O Z~#cڬN+ՇF]5tgeR֟ T7$S|߃A@`ﶪ/}srP|c<ܣ{ݖVk`|Ҿk).ueŪ:B42+' 5Z!r*haVM_}>tRKS+Q| \^xOg߷~0w_WrZ=+GAx~` j[?V[_Z_.Rխݘ-8q?=^Vݝ kެ{}@B O)rs?Ys\^xڻn.[!k{^fV;{ln+O B-pqβ< [awCⴉMϣ\$!a^i׵Injoٷ~Vo~o5Nn VI1{7*nAP\}e$0dk_YVUAplS7 ?7(+xx^h=-r_ܨr#Z{?5\+C;ǟ8{m_= iڟ)|@p(_|ߺ]uB^^x? =ᓺ\ Ru:vy2|Z>U{^XWWU߬Z}4Ã.S.{[wK79@l3?'{߹wݣzȎxh_}Ӻ7Ǡց\N(>˿zx۳񭟹~!>xg_&o4&ۂ<5xʕZ|ׁׁKZvTл}޼?sxcÛ⹾/aнzg|7f\>;::}<,xm+n 5zv_Z,=?ϫno^{ ҁׁcD$}/>dH~ yx_{yOJtO{;:}4:c_l<8/=s_5o~V: =W~E^^^=7޿_:/y{O~-&ح@.Wʋց}8ވw^/I-~tCn?}xAAE<<m | }ПnxdɅ*H{;j_>+xx:^@[gϏu/WX$r2_񞟯lA:`Sct۷Q{Ǡz\SlAցׁ׭ bTU-^p| y١۪~e>zze>˯$:>D6[ Xf IvԸm|>^]^ۯ[Ͷ=Nݦ]_Ϸ>qڿ}>16!;[Wxݺ}|lK@BE d* !Z4ZMսfJU`U-M 9w;橪+_cOl,B kT5qRquc/n?cۭ֭],tZN p^\2.MUUIu,2$0ҹê}? H(#ٖ/* rDCϡ8-WYߡnxݺu{/`Ǘ1{B[y.1k&ׂds\M|l!ImU!U\_C:<桬E/94Bkqrl~:uA|3`ܮ2HhaVxl-mAdoVfޜrUZMD<lkQI:e<~u1dZN~nݺlSJue*%WWT@Se m B/Fij\%w]ۢ\ݮd,3'[Xx tl'׸JW[ VG_Z:#A~k\vu',p~cqo:\SBuU.T8'P - P}T=[/oR[~zXIR(˪NQ~kzt3=.kLK~Eu}%tA~S}N`Il@R-_8d~[P*1hmKڲ=VϙMYDM7#k??]urlh |{@EAe Yݯ'uSz4mnCin.bu69-2?<~}lվxs9?]u ً#0++mrQ!5f'EXQ}cx@Q[MM|.!KΎ\5*jU7eufͺϛh:ݨv]z_nݺ=/KҺ\JªGv'i"/g:,܁_W<.We ecי ~DɆ;6R =/L*EҪ+^؋eˎ+'Ⱥ8Zw1~زE1ߴ_֭{Rxhr`dF)0 =zF@tFyd6t1U\STd-+\VX;T@Gx}]pbObdCȟ~au4RYVtOR,˓._œ9p]K쳮;4KмC~,=йs^rm nWxݺu{Z9. ֭+nݺuց׭[nݺuu֭[nxݺu&xݺu֡׭[nݺu֭[n:uE֭[nxݺu֭[^nݺu׭[nݺuu֭[:u֭[nݺuU^^nݺu֭[n:u֭nxݺu֭[^nݺu׭ݺu~m֭[n:u֭[^nݺuց׭[nݺuu֭[nxݺu֭[^nݺuց׭[nݺuu֭[nxݺuQv[n>[uu֭Fuׁ׭[nݺ- Bnݺu [nݺu֭[n:u֭[nݺu֭[nݺu֭[n:u֭[nݺuց׭[nݺuu֭[nxݺu֭[^nݺuց׭[nݺuu֭[nxݺu֭[^nݺuց׭[n:u֭[nݺu֭[nݺu֭[n:u֭[nݺu֭[nݺu֭[n:u֭ƆIENDB`DisplayCAL-3.5.0.0/DisplayCAL/theme/splash_anim/splash_anim_13.png0000644000076500000000000017261412665102044024345 0ustar devwheel00000000000000PNG  IHDRjSIDATxIly݉fo!DP(*tc i!Ias \pXP\p(Ă4 UYPSfdf =w{_fȸaf͇wvTRX+K~%W%_ũ5~5=m/~2;gC–K|'c}tuYg1|ݏW -'£j=Csd}ֻ]П`t r us{ Ko%89鴻9TJS~ \sR)-nK,qg\AH v|q]|_Ǿ%o%83na'wY;V;uRy~]؇?j<ʒ\K0МRNj:U?i9yDsX9')Ɯ7ϵ2-= LoӨT0z05T_q}7_ e%X-S:|s:Kmy@s{ g6%X'Vx+Cwlێ:f~TK*sK,yq YS̭Y|--[b%rxSz⹛ 4{K kK*sK,ͷ}.!5S+:y}o4._/nK,Vq.xRW}YX!97.[b%*^'Sɻ)ey%Νf__9,}×xK,Vfos>f;Gܥ*:D1pz>>حîL|r^Kv)OK;Ӈsh)SaWtDY~K,1޹: sm1>&y"kk |~?<;z Xb ׁSCawt )ڇBuN*[wue%?o%ȵ@N(9LKw+;wCAԯ9^#0xK,^|O#)9 mRoXܿ=k6PK%Xx}kU{WJp;>s V+Vsݱ&w, Xb-tc0>8Εcc7>/_ vJ팽X-st9~=/u]9ag35u- Xb;Ƽ/R|cm'?]ݔŖo%1ǩN #Χ5Ҝ_>Gܱ*8|j9{?&,K'vcb};΅C&scFǾ6nim^My7Mvz[_K|S_e~Zަ3]C}QkZݡp2v-W=كwnWj!Py(\usA|jv vs!jW%k?"j|$;~Sx>Ԩ͠R[KiIx;|2z*]*Xz)^ JJ!pΌȷUQsmǒk[ew؁ə7oXF X+N@S)CCTۨ vG_X:<ӖT_,[_<CϡJ|*U6>I%{ Z<}96[PyK,[bj|R·ɹSuc@}s7S?/#kO gΏ@Nwœ^_\ XݩC<ywjxxӰ;Uw,}9t%+t3.b1[ιϘ[k%{#U@Tsܮ׭8WyK oK|uyw\r¹.1jS/#mAw930UvK|͙uw~{ʍsNo)}u݁{ v*؎/5xK,Rmo oЯ6_4)7:a*s>lμKKex6 X-ebv*ulۀo| 8_2yKkR+G@6'o>L, 1ȖXvMO9<Nw1mhS;S*'`G nS:bv}ƖC8},(%*Ƨx Qloчt^Bh;x_ew9փ4#nx(%ge߃g|?}[Z-k=|=7D3~1aq1e:PvsEwlM?z{K|UMdعO]d9-S1w_^c#xK? [_xU=`ֹm1M$ws]c?gWcOnıÅ7*, oK|]*§R|}O->baF77T>OaXfwv 7oYbK|%'k>P1Qf7Z*#;P͕]Zo%qm!7ՠj x{h5D@٘{s3K7ӛʏuevavدopwLoK|uŽ,c=V10~h|k7;U;uظA[ o%S0ɞ ozʻhoꊚ>|caW桪;vƜo(?֬Rpg7pf׎BxK,WbO@T5OW۽6P#g< vv{NubjNwcή?"~K|S2yy;.c_Wnt;yn<\ӝPri* u;ݏP, X+oJkۣ:Km!\cV=kuX}s2ӘwﴻqOu`n_ go%q}oA# {NuC9ΐt&C؝yP՝]n ZY_ٸ*wxթyXǼ_>DžkwDC |v?@c2HxK,U LZ1[B|5&Sz j8S r߾RZN >^~l(|ʡa\,vv7#>7չpnK|euIONMos76  SذCuU%n#e%o%jjuNۿO{n9ȌSǦY ^k:n~yȰ|vv%(%2}#WM` jyY{LuuN;Ľ\WW{?O8n,\w̹ώ=#}? '?N4p.(%ªr?G+n7_/=<~ cm u]7T桩܏(Sa TnFN,o%~`w>]k:9lT9Yyvp]4Y˧kaKa2V8^;6 cwiL~cIi. v9}i)YOxȻǑ=%zC\+#n7 kv刺[ÑaG|v,R]j6xK,s=ޏb5>SzmǞ5ZߚSǖ;Qtv 5|,qw,)%rFվgi;i :dܟ8rx"+M-=?tVpc8Puݱ&Ca*r?#z:=3-ėL?(<~7vCǷPb Љ7 xgTkx^0rcM*gd6؍o~#\`o%~@xxyiۻM7esG(#'SNv>=⾇4 :}+Ta32λ4Osw8xz; '^_߮-M|ƕxK,e9u6nV XM l9h O=-LWEVt,5We8=`> ,]z{Ęc)y4Y1I[z5LTN-q='~?i]v X;> r0,6~q/9=nRI5ҟmm]-rq``Si2G^aJܝw><64^uQoo2K* X˨ǚY@=)3x>\zڔ]3갼5%M njv*g:Z//J;LYqd~j)ݴ#w*%-ė@;TjiFd!3 f*8^3'44p}5S`Uk?c_ØNߨ_8\s0Awx|y;7 ||â-JgwN|]lݚ.qګ7)cSZ~ٚg@ܑafGot#»sw8e>ew`.~PT1^el%mޡ;>\Zo?MIhpwS}s.#&_}[WKq_4@/Ewl ǛT^c# >pJM e%*c YAn`yMS+s4pnc;L=|:1Ee@o S1@pz멡ܿF_o:p;%o%;>Ecm:OiN1kUޡn *waz/~vo Kx%~*[:wօHNCx-e *ljwU{ī׸UYϏ=cY(%"sTރ^}`c=HUl傻77q|+4~'_౭ocQxK,Ǯq1v0P ݂ .ZN)îLKݟ4c9ԚKtWŌo%hJ>}SGvL'hTfm-1_Lwv7Wv) x׿pt&imK|fgi.?_u8( 86^2x /¿ě_N`ݗZ_L7MCB%67샭:%-lw7uO'A J QQ9A nm) npx oW? }✾RwGv܅o1u(xK,Twv5́3M@t=G <޽AK.n€Vw v!>t*sТ-ėt7 Z=7Jrnps:kn# !!0~ YjXv] sNr{n@xK,yzN~D}[:s8Koj4` 1`1*sG ;͞0"B#kXw߭;c jq$qm|N͛U{~~op2`O |jm,֎vd͚]S~@ A!_¬0#oft| }S;}h@V7~tp%5ˑa9L]o`%?oŽQߡ`j>-,T\>G$HLȱVQh5_ٰ`s v&qoJS0<ց3!Sv݁C|zwyڇܖjwxxK,ł DX泔e[p]P8]&|!pTtIIVHC}n/D>N!llIȑc |JpxlwFn]Z~~'P>7 X]v>SpVE[_F*t\PJGZ6$5@Aެe>4;[=fg& A+SJ]az.-x+f2$>>t `ߢ-Ļ̦l@=Ɠ`RűMh1uv#>߱jتB@mLMkkUc T fc='VzO?;$>L2*m^!-[b/}nmޖfM):Tmm |5L q;Le7ȝwo%8e=i45g-5Vrn&+ڶkhihܔ]m@bmi4kvkbJe6cZmN[N@S~WA'+ TUQP[-PL'ivcC=zo~0kK|ـ@>cnCıg)@V fhyۦG.}-__ 0V Y[cd9֥)A(*R9lGv |`7V໿Cl6';U~KsK3~>bhZL{*0-i{*f-z4gkhv柮i$/P3'+S8!}_eQ;&wrȍWWՙsx*k%6A\eTzƜl>Sg5p뿛x z5*ҟQU:W Z.4'(j|ln`Lc :uJ=zD N'ns2/or9Ώ)ᦩ;5YLej684xՔ^h'ЄckRvnIڕvhnټš #nx=#wjOָ{;/B*sxK,{#nMkPuM_lS\ jSqzx5dUB8 "z=R0yf̚)LԀ R|U6)=̠w=ю(S{RCaxሰE-[b<z@o޺ܼ-J`*m[+0fe(3eWv\[%cY!PeW%'U9ukrR~SBڪ20tW8+eTN͕[ܞ{Q;tPxK,{w,v6h&?Цe0X.@*mbK2YeZ^ŜT^>ucsM JqV܍<ہ7 ;з= {s\@,\'n'GkNA[ߜ:-ja)a[Mݗ5W ^k6LPd@2MbL`l*ma\6 ,LL+c3ia${xw]F;V1]FQQPQ  ![yҬ5d=z7m{Q%_l}CCL/]S4ؕTY ovOx>S-Y*Mݔ֚RTNvewfO:^+k C0I 0]eMbށ5y' Š=e02Z/_]SsnܷaP k{oݹe\Җ jŽXw謝0[cn͝9Ƽ}]-٘}n Umݼ$ rSSTR]BFt|:-WֈW`$d9;EMI`Ƿ𗃰 @)re c}:yKݥ,x;=N\%{*O=z -l CmZm!e[U n0)]*s֨x 4A0%Xǰjv:N|pkY;|S2 o`龆c\9&3`e7owK?;O|ٍovm/z~;8SS ӷ)MSC6,] jn޸2.-ƈr7WgiO.2k=FX`ͬQj ͘ME$)B^G[ǷOxyTcEj[%{wQ%feەZ S3&mDU A YssB=%]Rv7? oS' c5w7Ln ]#[MVudr69E[gc&Yʾ+#تHHxGTEɜ mL9ky賄"- a&wC?kw|7w/,OAmQw X`w{z쩯Μ&h։mNjweV[u7lkBv+xoɮ3V5IX͘RXքb Pc  kqdkfz3KF8T!w_L=%K Yb?;G՝ sg8Uvf:o%M_ {&#z6)lyƜ[p^!-։ h 5'YWW0NM.9RڔȜg׀=Z23sg V+@EcF~mu];=9Kur1/W)l77sJAd@P nrHD #b5g.px]*/kxK|!T[oG[oڝP[ pƔ]Ǧks:O݅),b69)Y@]-`Ci@ i c@H҂ϱ)0N /!6v.шpEÙ5` UjxK|caw{ kEw5sgina!fI, mܻ>RAٝ9+hjTNAlSu0m3[ % zj0AMU槥RhSxOMۺPh[ZMQRYE js%o",  u! XnW=^t8^l f5I͕ݪuk>fx BI Tf$f ,-Uy= p* D m/vf2!a-)pBK&pDXu @a 3p~TX5xTK,[˝|&x<ݙy=ƶkvvq&v[7.'\BX驥0\EKkah)l%ru 03l #X"472{A2T!]_~6Q,MBAаJ::40 vz/W/O_>&_ {?s;3m9C.qm<ϩ*6k9p]dVcKեmΊ35Us5sh;b[g~mrk4^:dP4Uֆeen)\uJ톡aaY jY%lL7ݍ/W7Ϡ5{ߥ<^ 0-CD;~~D\NSSvfr5a|_yV aK@\>Le:Ph $mg5@g=f`Ml=pvmK6c!Lplrlm) 5rG*U Q[hy_5舡UK Y7k2;8_|>ЫI^j/>/u-QwUPSxAn g۔ڳ2tn ~US<es}YrJJk.m̰QoWeʓU3xKcfmE=rHĔ62_k 5bZ cMO]P8Pjr( X <- C 8XA7k3ԛ g :T{z pzxK!us`w>2(dW`i{ힳ@Xfݱ[=k=φET 2-@Z`jLۙ r۶a+b ø:*1l7!Ȁ]nPC(NJnp, by`C"t} 7+X8psn.n6}~w)c|lO\ϭ|_]nn=ۜr+wΛ&['֒6.=x9,:Wb4@!QgkPݥwz݅mWޟЦYF4 Q5W & VpY6PPTGՒuaGK/ D.%y6l/|ݟwLٽ[W'}(3{CsWL}wb =B3yPl>fD v m4&B%8f@Ȳ*ZvKo&*}w"<6Ee4GKUmSwѡe vu YC_yԯ~u dWߡyQ wZ݆}lP.>jd3 6(wue}e; 6A.SixB@1lYQKBB$ĐMc"# h &)2Hm# $ٜ 1os[x cdS鍆Z3Ygn/Fm.KX_P<5vl)w.}ܢ-UwΚɇ R;uv6P{0*q?iҘc.`&-[ϓ.pHy&]7aNO_9l 62S-hF">=z] )l?ߢ-Ѯ} ؁j~xSxkow.9o"{kJ;ܦJGҜ3;;F)g9@-ӌLȟR֟G͆@T~-('4^,Z4_MCMqsP<W ᣣVGVzYcWiKؔ:h\@7f__AC ;Im~[HE-[ RqWvA;m;Tu jV &)2 ihH@g15hёzgoK+cK,[sQr+Y^^^>o!΁Tz}-\kn{O$jzT!`"]m@jU`pBs:V|z.4vS-q'\xNeX{lLYʊ\McfMۢW1@9U # @kp!c~o%(Vd2 ^1EWr6Yzˍ 7kh(sE #wc&X{;gOi-[ v&حzpT1ؽ~ 1 +Lӛ[Zq9vpJF,{ :k#H8 P2T]su pF[gʃklm&wd TZ ښ BmCX6()zAsL)4VF3 fUF5Շl3AR]uvϮl$|wh C Lf 6M!u߬ (W.sA޼;RB8]Zb_gn)yk,>7NM&77بA5G򦅌vFA:Af8CLu;jo ,\ z̧֩ U"WT"`6Jٔ~$f3SjpK]0EKgh23"{a=-"ǚnfuvGdDUmU׆&rKm d7胱=Pz6F& ].K Wg*=I;|jo/Igy"Gy{WV^o=xb -awsveB[ewڰ</ (0SC (2Z X(ТVká+\ܮs"awּx*~p(!L$' sݏDZl21khekbtSz}LR69܂Y"z@A#kd I]$ U7ʛUPחUn~gW9/) g/2rrO-{ufa{K1Zj!H0"jtGH4p ҳ'c~׌[Ӭy@ C1-)-Wm:%0bfнv׸)@#6. ;XVj7%= R{wg\b?pd(oSw7wU^ͻ5'ؽyv.6҅ޯkDkg٤, 4V3e C#55x$;ₓ4Je7M9$f&Z Lv2-M1V-ӛoM  JYL !*:8-Y Z72ds4_lʼdˌh}uy%x: 3071ƄY0$Ϥ.M S` %o0OF^.-V7zZ m a1hhcRKv@3CQV$zi^LM1<[z ~|:a7?ٸ^Ao^˛.'m.K3|gQV-`Sb-ZȢ/g kFDA9oHJB)3ʑ)" dKn Mh1d.ڨ1ɝS\yeӥZ lbL1-zͽ㝀1ebpyH-DgmaO,bD :Ĵ6hm Bhd)MF7zF 6F-Km;zo\ 5tjm^AKm>~)kqK]ooL^WoC  シ̄ޯ*nެ׵aTj&$*S͖@0䅒J/PE]β71VJ5SY=a=d=tԓeb#gd Q{X7wi 1Fc nֈDB}FE*|S1ǍRo{w mQ} `wW|#{~/^ ^^;٦쮟< +X-;7v`&c\iL[; @.-#HV .ҙ Yl <]DIQdk^:6s 36aUɚ$/3ΠAD ur e9ˡhVxA!M7c ky!w˴`#ӔV#XJs9,P(x@Eˆ^ `*m&wurApCQ `D0H-0hmh!i0СTC2J3gT1Szsw׶'-)xK*F>;_vkb4;y/S٭{YBl cɆzk2`}I73dٌ?xBV l w(*=;ptnYsFvj,9&8 TFrٖg8&KQbj{4RfkZ@dPeBQMv%x%mިpI ̣m _@/b4h(b_X.Wj7~3la@!CP,FKAzT0hŕ{~m?5,ާSM+K:r_RSU>g׷? UZ76z*ى+s\arL - J``+m ,Cfi; Z2A;3Xi"ewg.႙QucNJڜm39b=:|AΝl@یE]IY YMY1J6Yu,"Z k#&NvMV!6# FE:!X&QDE҄7kApëp+0Q6FBS=]:5]^yH9,kj3WzC齽-1rQl )o15f:Csm֩ܮm>;0Rw608jqX VCZ\SDK\ eA $A^eV 5 0*p䚟\J3 nW,= YvnќPQϼl̄r!HKMU6K.RE?pMM9/ʁڡ-mNM6d|@OAhQ(cP-ЯXW|9k{8Zh j4zwVjtEAS7RWU)7O>zxKs%qَ Ao /M盋6۬pXW`@ k6WX̫la)m2LfZ 9+%#!`')` ܃@M^n9<Ҵ : Ôia\JS@42B1 5*f( "mEk4+? 4, BțA.*dI\p@Ξp0e6PE1TFB97'"V!*Kp`A@(Tnb;X{HzI,X -eto?nWϮb^_nwa57٬үSci0LoZjSeEjF%](Gw/aZS EUEɊڦ:lrI ,Xdp܁G7˨za;-}(g]ˬMV!10wTB&1v]B9(\L„k@aZX)Y:ə>v$ !X 1Xf "kFC0T Zk` cx>? jjKX!FG0!4v24Kmff4J]>jen[1q).[];Df5{7ى9LiNSVnZ:997M6S ] 󢄢dJ Z۶Cu\xcj#BpYxh{ܸR)8N$etd 9V>xv3r6+ma|~r}@?H&7Q`v9<ʼ nW\f kiMY>No12{U k rRhR;u$W6Lf?F@`‘A5l`A ΐe3'#rB\DB"T+ωpWڃ]jޓ5e,[;ݡo?}|La^^gf?}:)Yu_"H$'ب8ځ_ú^`-&G#n(dtHf0f!`լPr 23SXJsW6Sō"2c۽x3~5.g;з} 9nUJhXՖ#,3U(,5KK޷d9v: x= }=^fC)zy VDU$A!iFYDY7a5BD^J꺆LB*]5gjk>ͥ/|T.ކxK4a|7z"W؛+@7б5?Fvb`#ee̚ݸPso(h(k{hmt5pV(p .703KE)WXDXIZG\bU//U\2렜r81uUO Zcv_fCE Cp{SYJWS>+3|à~TfnMGlAPp72ٝ1hk2!n60X*QHʲȈA !"d/xEHVj.u*+$|`]rpyeTNݗE,fxK<ۻo^ <Mӂ5E`Xnò#_\Fp,`,씧p&PKreI$*@f YeBud :`~oo!6]N?Ź۪٥^| u7C? ; ym}BmjS>T4#{LTN`N*M =Aa#ȁhQc#s>2*BEs΃{!Vcq *ԀY xDeKKٛ5\Қo]ZN` xߞ.緧o',\K䔩6i=@擡kq ;zuYC6|NY2EXWۢQy騆Ղ\S MAVL[UnF 0ENsABeIԥ.q[/$f{An )96َ:b ˡTOGNu@A<"].*}M2@ ՟x%Xj4T@O@(gp`8l`D8r UIJE)b L5 D2hӄ"$-7)X{ o^zǤW<ۓwo>YJKo4y/9Vvv\uW'W`7&K%6se)Jʫ(.'PP\pGw'lhaXn2ur%r8GYj{ DG.[\ R,\>*:Π,Rsm,i-)Mԭ{S|)7'>B)#,` eZ# hڒsb2)!,śb1 OF=M  e U"FD*ŊPPD*EXP)`T XC Y)hV6Rt_Ҵ%o!v}'aw7\Oe:ޯ҄3nf? bX/rvSK) TT. fW0XMƚorJ.0&0hd2f2Z ZMlA8\mSTf=[`7FKM~S3@zvo#97*l3#-nL;UߠsA (z7R| X^ p#0G BAQ1*#"RUcP P"F pa*E*Q^e䕥1B`X( 0 !go2M~\='R Yly]@Y\ԯ[Js}'1ߩfr4cl.9sI Ye6XL^ VF9FOuhfRyE܂t7XI0l4Μs)9Da[CʶFNgڬ71v4u295n)Z|m;ڥ duŷTn\k0j($(њ' m2ڪh?τ8{9IZ*3qi>́hXVPA5\x&Sjp=WK* Eje/g;.ˏij7(9 cIi.[Y忶7ϳ!en;D !wyM*=bڴk ZUjk j̆Ezyn-m,cN Ý9a*pU!EpQseN׾?BY7lA8ݶys>k*ϛ{5x1鵋=ߤZ_ಕ el(L7 s B9"?o6P&`= pCr8$ 9!UTU* 1Vp``2 -hZG⤺U1teٶ]B.@-Ub Յ +~*T"|/Ӓ\ēu\Ti͋Td*!wq)L lYH1ۦG\]7K[3VW+U ,e< J<\֧JsKec5Xl3!oῄQu~{>~I9)j5ϳR3ЩNpS쏣0΄ =7 3 Ɯf7t~T:4 FF+>$P0b@ HEl" ҃'$~vHi<.1g2Ĝ"SpZS͹ l aW9^ TGjC+b,fM\=w@\ݛE-[v?]˚f8t7i+0ݐ) c+p5%]­9KSKJ7Q6Y % P^&_aYzsxK<$MsS5W;n֙W9a_Wx"{ n6Vr99U+oWҤ9<:vUEReӶ@(H d!aLVp:efitrt}>. 栛0s&&9hckViVAU ,*>_#b$cPdJ~dyگQAFFFecT.8T& pd!(黋~ 渕 TUXYs6+GXeM!3=kdbU;4!kЋKnI;gk c!UV37k+ R}oMkq%~WyE{S:16::QF]-u5[g^Uٸwϱet [u7ȣWZc9[J`s2WƠoeշҁr dsMӼyeJk6kA)9k&^xkZYYj;NM @W'ҳƋW!:.A&&՚Wf PV 0/<)L%T<*V KU!SVɢ\I΢*bvB00T ~1P;ZjvW ՈaxR7mho3-xK<;ܬom/6LUN]c`np4ts[01XhzaM>aXQ'٭1ljhc48DPM U|7-fWq۔vM*ݞwXRӮ+S p2k\9㭼=Vx>O߽,!B!rxt@|ܭEUR8ȭbWP9 :RdU/$3R"~c/0d&;lA! n~;Q檬 z*;AC6XX` yX_'7^T~~z w敟-b]k6;>t92śv2tY[oK @̔f4XWVVz1t0VT%Ԓ\D"s0"<hG.q 9E@sg#d: ioۗ t}U76Ҟ 6SqSn vs`uԜRS,j;fh*tm~>_QɏB]`0hR:*QQK[Yܪ,UTU5sLLBfJKƦ^WieR®ݬ_dOWA/>*êa2Y0t PwaX_Wυjīυ?>6>' ~C9* %xB noaׯfP2椔R$잿5=hYE9%6*;#Wc6E˦&./4SI;i೙',MW3W\r\FcEw/~:_[K)Ҕ8Hcb0KY s3s,Wu̴ ]cKkZ;M/<˗7lіeXejF)THKdРb)*@ְ"2T%q- = )barmIAVc,˰Bsb`9#hPdn b݁]c}z(}`(pn.담*y&y|> { Ėw ð/Ᶎ,oa*_/_TZr +Ҭ> cZ6­a"T8Ma v# e y& Cg^"{ , ̩- r-@*aggWs%gL:8sv{ΜU{Дf wN٬G˓޶'~mI|>#鏒fxu ƨ@9B'P 0VF D%TUDT 1 WSĐYPdP0 Pvj:aa*A5FXE3Ts"n=Bq,"YFjĦ#ش˛ CR q x\x󜸹8$cO>v`V;7-qN>ucn9\G*n>va"tnޔaWf+ZYVn5ϡҦޭlQ.X.hZЪ l0Wz8ØBD:B;FVMIo0nJ4/Mk^pRF&b2u0 v.кj ~uҘրGT6i;39>6&+Zh6$l7aEC%n/#|3Y˹` (!;558X1jCnUa5N!(TP%j67o" ۚ>eF3Z"ť. +rئHY=aS }w*C.ٵysI 73yu y~7'mQx xWJ?ݯMhݘ ~o;c[orEOOªSRj(UKo@.2̞lD̙j70sɢ4bAijf? ~ݞ7}tynϊ0nJ_>˼n?vyN5.9ݖ=P Vv}/66 jLeD`lZQFH>>AHK1[+BSҵ$D4aIJ : +aBV@+:3̕a;FB_Mg-b(Y7+ëB5ͅpuI\ },9g>)n E-[%9cIe6?ޫ!}#Mۉ*Ӹ0kGܬ4oiR}ʱcCIA!(@ f S` GLs(y+hNy%+zP@ƾr*BBodSnt-a574i+hݚ)ͭ=aHB,x]|?+ Umd.YV5>CDU Ř=ƶ`Tlkw VnA"\ ۔R S/Q*Xjl `7 gJsㆠ3T6EpЯ_(7۬2_)w9B(xK03mxfTW^5}yW )ϼMUZ3ye[*-]颥CYnJ(`[WEr>LsزI379Df Zi6TE.Q0]y!Te3Uw ^0b( ؘЛ}g8YL͛K6UUˈNyn^Ĵ(xK< `9yқ7!5%7o綄dchMgё>L_f>sh33\䀅ɕCP91:m  Y%(qL]3*rjg$[%-} J(dYKke #JR.d.!S01m( mƳKƧf1thN؎™$zc8$b\% {ci r!9ngʒaY$`<W9.LZO23`0FZ Gѝ xvcG߇|_M*]qvĘ'SJfiIELv;iD-+|vm,H323i@Jhr/ #1$HugjKSFY@Fruazd =&6uiZs%SJ -0bBrdHO[7b@=n) pcRŘ}JT?LXu˕4/BP% ڣ:kgzoz:n0xQQ{ & &lha޾rئNUN܏_[v\V xŷUK&郭lR1 9U`G)R Yr ,Ybh"54ULnDCf0*sѮ.My;P~676{75c*rOh1Ygu;Lk GUXs6v]o y^mΩ6WKNK O=-i(@r(\N+"geCia&BINu<1 0ګaVw t~B-m?90iRANi3vfn~ ds7psACVdS%qI[Dg3Fˇv5TD&DoRo<' fɭҤP0C̢T Q+PꀞDOjLy =P7 n(n:PP~9k%01eԺ4ufAмyi t#V1\4j#JvI@E k[7_{P:`? dl ߼2O},95xvUpfO-]!:vˬ=46sz:*BMKx$Ze&DsK聦19'244&9BNбc k.j FT>t#cSQ7&7{xeb` R?A T #фр<˔h 汩+窼f mxrZكgJg!8.i߬ zjKd)̚ݯmb`Ȫ`FLʫ0) Zw8uPK_.p"i{o~}cS?>`;sx>^ΚUfm{XM|0p1br]|f&1e ' ?D`lRF!1Do&H\OH ֖[7(cDV`q5.q)bY`Mׄ>,Q5X&Ʊ+U7 :Yb0Y۽ Bo@B'Mnٕ>Gčۼ._BUPN&P%HhD3&2 kDQAp@LFH3HUL T$l^|ow^s|q#n8,nxx~ݿkǘSv=v=p{e b M7tz2T./Qqȓ>hN "*ea[]$H z&](]H:- -ѻڽ}3YRy;%dWcwmg9vwtKi G})1-\Aإ|};O={G}AbE؉R1Ĝ.h0Bm$ ۞䈉vO9YPKE6Vy.(@G1Bvl٭w>"?JSvpHHTwb@*YȘEQqcE^ݪխWP{uum&xhd2= \.%Pvk !˜Jl) "*%JJ .AՒAs<$g(*B͢5&uIR.0Tί/W/ynBA< d(?{ \9YkoN5 SƂ2=Krz/(u@q!{kcpX?{ ?8sPd$d&R`@g1G"iI@0 )E Dl'Ķ m4s;H D$aܼ *yeYqq2лƄk܄tw3T&pF Kb ,1 jeZ¨HTFL,dZ/7w0M`|H.wkۿs`q]HqO 5MkP(mZ='9MN2W WXyoNW=v( ISaLbH0IBdIp)2K&Yˆ"&+[`M$M.|(vA}1w"PőykT:#HR]%Aɫ{BU+D`2#[aL ^z=t&}&<9[!n 20Ly(Q.'`dBYYx2IL++F )hXq@n}_z?pq5dYK%͙}l\L,W  pw|wtvZ.ԫ!Qco d}:p) n.E\6~->~j!]dQd9eqYiNg8q0¼<*!vG^.X"Y&YD" UTNZq2j6Ӌ~$YT,ܻ~l`WoU˷NȘ4 R< l?|uJ)Nပ+`:\9@"?䏲'&I! .kN*(}ހn*"Y2P!ESq>Q1>X2œ%9Be˾R{K782&1&:Ne*.*&q:0C W)CCSGe!eXD93Ns"C}D8Bڪ#CK:+MIG8\tz-nK ޵YnT^W W1@څ+s=T鈭 qfX4 fHƯk_*q1DM=ٳewHN9V>~H9NgїH9$eDV΀=[y`g&yhܸ hj(= qE<1Sh s;BX~>™i`MM ri!U uU_# =ݸ{xz]/ۿP/o\i.)PK& ` HR#Ha| SjJK[ BLW[k::=\@+&OwnXCO/2X+t RG@|=\_Ya2-/m&}cۅi0/GV\6}f~N*i͑ʟ9dpcd" }'#i1 A xY0+&22d pDPDoH@Axە2!F- 4`C,xA`l1Xdrx^ jMy28aRyYnk $ %+XJr0]Y *H)܆ 9SU@w1#TW^/ꮵ,1p\,*R-q y"*8pYnh:у/{gy˹qebO2 #_Jz26pڣ{>iF%Xlaܬdy[ rDe>Y6<3XB`f!> f' f3 i3p`oYd6ϔ1c d6 $Fb,mgv60ـi']/5]/VR^)]vqS闌UbN)k6f!\KTPU_loq3Fn_ʼ'} 1=O X`ȘcӗVl2~@6LI,^ott σżBNe0Liupr:,"qHȢQXHP@@8Ku=I Z#5dɛ :&>,ι(`][Xk/@+ꢦ@lFsT۠,o%q -l]|_ӽ 75byG(1 dՐҦTFkHKtmep rcs^Hvygۋd +#$`&SJ;Fh" YRI+,& s Ü2 1%2 ELyR2q2󜙇͗˥w]^7kNᬫ v>hwY(9ŇbK%O任:1o{uZ~=~"oFz&~;86nV"b~=6'șc4fܚ63wzu+3("fq&'I2"k+S%¨B-%2 Lx3ڝwM>D.,cJDJǓIHj35f^8) E1 T} ʚ&kI'cƶkp=^8\4!Ь˥Gř[ <}G5 \ GN!Jo3&396cߋhC51d͂5'i{w $M! bvymW6E c׫GOfp{v gG`uj^.ݾsV&W/lpIhI0)7㴺`u}в|?װF#+9o6ÜYR>.ǀp dztY )l *l&qyg5}=M:oc%«ʣ yfGJK"PSĝQ { .$u2 L $HCMw6,͋&@oGlq"9𦱄Pz sKC\C3vKbΫ47,2?8=&xyqt v1,P 0aW ڟy-8:gXA r1`1{G,]qڟvnIEFk$pG6FP:L! +,[i8n2gmTzle'@_ 9jԌeLor7FPe nj+Xa:[H)!i=~ޯ&'PKŴ '͙7^Ƚ鄣ZF\l%$i ʌ]1E¼i*5MC#qf*mVVL,u $-2^4X҄x\x1HqŘ+CSFɚ) W:FZO}j <9` Y [}R2xV+nZU nI+G9u4 ,8Bd3"90nn^=|(9X.`{,.$M-Ab E^(iGU?'O8}6L*!/ߚ}Ƿ+y.og5:{rg:M$ɤbT ,}>fe݀PSYar2<]͕]&Iwު&"%ΩM\˘^n\:̂d cZ?]y1ʵ(r"-Uw|^C3L, {,7b0qvس"nƓq hU7s9fG4~ysa xbrh_5lRQW' WYf ~M? ȋ{XO+_^$vJ$Y&Ib4R(DAdlABHY|:Ey7=S1:4,4nm4SzHC_)fO|vh^^CSΎح!_4]yGOX'c=U5r~Vy8ms(;@=-wK;z}U[șvQڴ<ˀoC]dUsa]Wy2XvxG!#ABٸ*[Npr7̎eN!RKJ|P,~\X}E2aU}G4 Qo굶|%x~/*KśX5/U(^_ژ w,[a9Wd\!"qB<C\)Kpj/Dz)bV# T-AJӐ8<˞+#zLٽW6Ixq Bi_ݗQ"qk$A WXYDf0H"癌@]U'<$:X|gK֬cՑ|>*XS:M&HJNA'u`/UD~-`21Կk,H€Z͖#8ZMVW]eJ+u-]IZ;˾#w e7*]630zqbʶq/c^`<ވcLiY.EeSHA"2B.E,XVGEua dny>HcZ,,xy b` ȿ<ݬ'U}x^u=>O^*t/k /ٲu %>,+NWл8Ǭ]"֨_6g0T;5"kqWyc@o,|mf'` ܙa 2bK"/NP ÅxAMUL:~D/n|`v@ G)X:,N.cr(ݙuҟ6y`VL֔xip)k14J/] ;S!Oo8- #7Χx/KXy1 fay_s1YR¥rGZ] |\*8c U 㲚ku][Y899:*Ab@Ir(M"<[iKA؄ja,ʟ٥x~@|sаR{m, |7WY3x&+ @bWK/g`|K_ ՘JJX㰗#!q pҞ؎1uNbP# t'pW˩]'d9~{*LY.A*hRb&ְ.dPDPYZ+T"2 cSKR_"q݁.DY TBd_^kneĴ>W^?p 9iYIsڡ)\>H_,}*.[WltOC$ ÅĔٍ}J@fܯ jzbtjɜ%O,AL*WrnWGڙZ0C`(#lo]D%e]BMA:+CsT |0}NL! uݖqKKE@擊kEVːMkt 3C?|IruZV7v _}ÁS!eB]#Wqi)ť /ԇr q,OoK} d)^lJ/Uۡzrq|m!q.g2?<~1s'ӑOqxrQS:($;ۉ]ovlLX1gƕΜǿ3|Y-yrv>hX]݂MkCNMoMO^[h(vXsS/ys_w.ۮ~ٸҚ1/* jIb2a,]c ;HX6+{C& P&mmPtyU pwX1Ld& _S?O˫E۵ޫ_n_ & SZȘjPK $D'0?~Cݻ;{%fPzq.Fcbuߧ89Mk*۟s,)'s7osee|,L3VZ#N.[Z~sԏtwarP쮧|ԇWm>'L0MEuFXN^ : \bnN^3Hؖ%"'3^"1 Ls9gj {^sߐrJy9Bឲ Saj{:>Io+~Q]xҜ34ʝ9@nݲk"k!&@gX{{$}9N`7`j٤?+& zژb̾ '8HT,%c|;'m͔]GZfpH٠X+;q|)d8AsegeWʃA!!I*=<^W 7;Ö0wxDz &*dLYs$tuxz6k;~֫"sA ey*c.[1)V[ؼCWwQIάnֽx)N,7n&lbuYjIh'240^ }JlCI oƢW%"ZJ].}Kax2W$f eO Z=YHgxT$1t{ ,Ayx^. "$qo |؊"Q4lZ;2Bx2(i|PW@iAli$LLѐgxk|q!]^Y{zxx#`;kHFx'7 X5uJ),N"ΐRFzIØ jdR#󌜔X&F׎/LZPbhZ[}~JKrw0h&Ԁφʙ/땰`x)Cοg ̞|,) Lɠ'doK`fKcU75{󢴉 .OUS]>Gl&@  o4%jljaۓy,ZkZKݾV2m S!Ν /8[ac.uڮ{:`Ӄ1؝81c@]XT7m)iO݂ ͈2%.ȚDI "HtڢeIY4ӑ%@P7 q(ĭ,8Oۻڱbsx@4;z&Gl ~ ^_#{šIy jPKnTO~᭧ vq_Ț@1 Pb eȥPҼw_ ~Ǘ/]轆5dSi/,q.ͼI1p/|UP ,)9*?, 8;ux3 \p{L8HauQzdQO1au[ʈC\\WVf5cE *1Yc2_:WNF>r%u꣋yAyHZem ɰ2Pej&RU# ..n w.=]?Zw>@WI\Z.b`~`St=nVǮ!cDƈ|~ۯ]kGH´- L;-]zt S3r6S~Nw8 'apq;`&V(1@)p7xL~tz&?>l&~Nt)M%Γ#0z!݌m}eGިҎ1l; 8sr rn*Ҍ ׵ o=Ysɏ߭b ^'oF2"mfP7]c !B㏏x|໾$H v<_t!7VS&UnM[ =)|-G k\vFzp};sti I-co\ddԩR-MR G!)t)f iz~BKAק+;[bc2eԞmyp\9\O[#iHm7.e qz&b k/&#,kLx^J<4'!R8bޓҿKpPLa$>ÕT;O7\QɆYeu۩[5`74 eOy>m; bHkG".ș+jY50o)^]fnҺ' gR-sJH9"3ӵ|fp8bR/c,(2s|"eū U| nQ+Iyuz,jZ?`el4/Pc 1@u Jlwd]c^١a:PzuIK/u4\7m2w veφLTM% 1!qOOvf^⳴r*Sz/sQfYʗ ;Nre=m+v;.iw8uk0>kƭ h,ǒɱ f׼VVGO%ȭ8Qv 33S]HO;HFt(^L''}8! ZI7H5Q7#?=NV|ɒ/+bu`<##2={YP:b%!"e@_"E+Uc׫3^W2\~Y<=z6ɣ58UI͘IX\,MyZd &jD(n(4fLo[7uhM ..`[J͗U{3#gbaO?ej$Y00_ÛXؤ؞\Ɇ6:ܻs\dP˒WJ蔍8) ]|z, "SJ3=uwunꖤlMxGYp<*6VUj3Nu[ Է9]ƨօF%i%mWP|dby+sxB9MI\C4{pt^LayJfy9`8!>߻81U5e $TBL!w'?kP oBif :V ֊$ԭ_z>S11fŦ_Lَ-M,eƁYzMY=FI7Q讦N n1fYGN(.U[6SPkDd(ijUUdZ,PG5+ ? \/XJ@BVHaweyDW{}XxnL0*.c R)h:s]is}k|eC6} irf;"禜d&.lfYlë׷jXݙpz ITi]2B鲩Ng/9 rO{1XK:њXyHB[d00紒GngiӮpb4rQʂYlReu_Zd4:9Პe<9[ O̮I]7dq ug$Rĥ t$*aV)3Pv'߿}t=mcw-==>^U, M ;][$9i׺}៾Ewy;ș^|ϘҀᔽgVךY%G_~I,8y4T0Vf!FBeYTJl#ӗOaF3vI\Qb8q~9V#'T+;Y2gOTA.;RțG剽m.WT^^/=Y!iCC*e8}pD)Wq&$.QRZ?[g+7'R4%˥eY 6wx/y7?x0~t?coTI.{mKFX]56r&/GxߩuNVۈX)\$:s2]2%8e?PGۖ^6{ [ -#;،Ő[l:Z X/חDTUh@!+vؘ`;Te~^^ 2M<^{啭e> .R@OQ[i"2AupNDfRKGG'K`jt^/DG-mc u0/ޚ5Ew}n>p#/?'W>_0 l*lF\buj$Porcv}_ bN<֎J_8// g@;q9uP6Q523,3MMez:vx`WRF@26g+8>w-؛W;A Щq,T"@*VYdMdLl\񝻆_qivJ^/{{훜͉啴塸6+1@N R\7a!=Aq >DkSȤ*@vdwֳ_ܽs9ۭ}e>jIb):93\2ɛsn,w1o''~_o=apq;7 /Cl$v![ɛ}w7G3)9wl! DWJObJKNOal1G8#ّFcx,w/CK;!b,5eom>I # tJs'LG<90dg[0S'V)+~ځ'LFq$Wu&~8?s;%e,ϓ5O.\>ʨK$v٭m@|LbS f`BVɄ`05ep((ᓠ)d%MTN巟j~ڿ騪hiL+hedAyy{*e*NZO'w7 r_+4P-"|9Aw'}B)VD
XL5\DCT.HH!ɩUlZ( K]tO ؆rZC6d<3ѹ)> i3#yݢN;X`5Fx͛_ߔ+c{=z9kR!3I\޸ɶR" Zs ln \a@M",ǔ)0AIHq&ûߴ{_oē&q2T7Ŋ'+搳?;>džQx͞tSc"iQ"&[d-~n>Ym*bGÃ?uVHR)ASΔU{l:1L*"JT" Ѕ"<u%d ̮JwwCq j^GD-o2vGG>SY0U9`(}@ҡĉY;.{w>l27o ݫ^1o*k sYj'2J-J>U$"C(Yذ /8U1"PӜ,"P L[/G#o K<LJ7i\-~cܻ+?}#.xtU;k]0><{/|`&@$c2@2B;hwڼf*lHvSiD^^-2tݐ4axE5ǐ3<>&s""%ۓX3Ͽv%9]"_Utz)[ U@'7dy]C6\Heph 99Y`T$"E@ThzD%`Q!SFTMO[? ThckK†zWٟΨ'>d/-*M9Whk @Hd>{TDV JwG|L ԬΠf,{,NP.wj,. u]48v9֋XH}I 0hc(ũK9/%6"SJc&oO#QY]Dst0:"@qKA.--Ó3ǽCb3 e*f@ r#ؔSYY٣:z@<{^/Ҟ^y*|6zXG⊣c\AtT5$0H5d$,A2%>E9dB`"drt@L@'Vԋ FEQEKgG}&%ShtR2HI"?E2PeL ZleIJǜ)[*5-$ W?]B4_8i Y$R3H }EuwL٪1w9TB QHh@DJ)N-@ eũ̽+敯L1ٰY }2+0r ~ ;>1O + 47;ıvH)o;3xuΫǨBجܴ$.xYBD0pe0ŰQuLP2*PM$.nBO$"j&uZ%TL&iD('*1A,*R,-et/t&)A2Ugdfdh +tA5.ȳK*L+)"F5@+2CA[쐣4P&"GBSWDkdJuRA]/eZxKFΑ2IVd%x%ϴ?_4:Rymێ w>ܾO~.Њ y@s ;Gu@qDEpP *#c3T/{dpهubB_)Fm zATS%$;!ئSEf#JeZkRUZT=|@2!mwsaȦ椖@%4Ag(Hr:\dLpY DIc:9Q7inX"lWP @JJem"gyMEq^ Tr]+^]`vsLISd0KAHSd!4L:&ӆRhLc.|8SaqU\ndu9LN+6ZVs2~a<~ ଚ4;z~!˻]NIx|X(ncD^}(ΔD 1VpY S4%!, y9R(̭e :j҂9\4pb (䂜JĽ S̩[,9M',*=q-aEbϛG(&p `=*0b+#D-eqD*0Vcn4F(YMcj_WEaӬhB;Jc{=Nt$ɴ&W&3:RE^ѵcW{e~x^]w6*w荼7"ARŐzyT* bIIΧe?E (#A:]5!gPI跩&zHXkPSO)1XN^phБ2P25<$fbTS#<6WjX@LE 2K1BGX ^BkgK il$V&Z^d*8#*9ޜ2[S'kWyNenIǴy829]-rXkOoV@+_\>zPuz{-? <15^}\`W@QYA Z jVM%’C4aÇp16/ƬXr 'R"L ` nB$"x4LdzEZY=iKJ ?q[-N-}/WFi5ODi(A9 X߳8<9d#'.KEhjCIW)dʡuQsC̀VЋIyLU .:_>׽4]jFRG\&`_T+A7a{r~Ț7ay_;_AG[4PMIV>= A23 "HT"0M1_W:BCֈ=2R!U"bABD KGLLޝW7 f!N[ 5 3`CHy(XVB'cdPRʛ\;z!!ygN`⊅:HDr#4F(%'S0 e0@BZ)Zȳx.w,L&  7bY% s6Կx |hߎcVcYuU{:W^ kHKʚ/7!v97lRevv&:qZ-^8|xON䔄.c. *rr@IkJ g5D) OMI%MD&G_h\`'wiLEi"%TC/&&Y)ZaΩ dIȀaq|[l R'P&Sf"'f^TTҐ,b:$0 r1 Õ#t81S\KXM RO(1-|Mg˹]eR sv^WnA.~Z.{\?5_wHi=leJMy 0GG^ 2ҕ"HFؠF")*R FU*aC< ξyN$< 5iC|خvbbXQcLc.Q.4(0yU6" P lWʯ&e)06xC r!88[#\l\=39VNl&Qe9hY# &.AgV# fΖqX -(ݏRNfs7Hm.zvZ"RM͛M$`0:-k/uU'W:ua7Y%t˪š!+Pzu$nW De3zhG5S!e⠦L - .D$zwӓ4n0U, mк].j@ِC0auֹ)-+};/&96f)# E)إ,Ԁݪ0!c F,yaRԝԩ^Lj4ObZOq𸮻C;lۮK?JS,<&pVd˫ y0hu3B}, 7,*\BU*1SV 1qűvUc´ʚbE,@c]r5y=nU>ϜU "/.'>qK<8IO, u$KJ9 {l{b0^jJIJ?7~,^{QiyRf^^Ț bӫbY/uEJA݊#Zb)R!K)%ؐbqkC13L`ru'4tI5͘ESdgE_0wD"mEW#|^ve9h0'j4ZȐiJh4u? 0ʐsrBrrQi r#ŃV>Ibu٦*g֞`|bJ英 y:\ ^ٵ)v]:bSw5LF $aބu324zU*媳 שd,2r_ٳ';M@z,i+LdS&.JUb.Hb@'=0%gIq:5}58%uɡ͍׸z]u͗qr--`Iܜۣlڱ Io(6K6%)( ȵFsyʾSOk$P- YA4MBTMdNed0plmU#B̵SՀ✀@"ٙY+Z":qg0°0a)ۍ3PL}i2|yp>/)dbؘMZ7g$jQnLb*3fAɅeNj`gqA^<2uˁ/驖^oXt㺽.0ڠ} ȃFL<)rs' 2 {Ul:_\y0yEPȘCHRm>a0tݱ9]/LRe)X\\^ȖyrnlQXc[fkPHR잞AX#)P,Cմ(SCx\~8GyJ>X^gבBcdgxnw{;t9mS"bw)0zBjtւaQK z2Zw`yy d۾^|j2-uM#|Dr*4NlNÊL BiX/H9WTJk)=:0lq N2ey5MHdHRX\]^g9s:@qܛ•TYfej|lT*3ϞތuVkëW6ozKYӬP&f\8tzZ=0kL\'IQ˞;;T|RkvJ rf IPL批m\E?L7Eeq+D Ur,?"XL9FԳʌ>|,W#p~T#@_8vK=/7ڱy˴߲F3tR Z#q[7RJ^%u'>ؽ]cyofWn~ z)2:ErnCQ6`5^0I5Be, b\a2( ip`p g(bOa_Jk6fT~F-@[c( Vs// ¥]5l7gGozV?>mARaslNo>{nӺ[{CuUe}W^/^]*7IId![&:Ώ,fj)ǐZtbϫá0-<1fͅ,:3!J /)eZe f 228;Nbd KӉU ڮg[|StY2x>+-àvy[`xG )3NZ0Dn~mS?5W)i3u>^eTs.ݕ7H"d6DtPzM1feziE1uaI111~W ۫=*2LV .6Voey3 .s>oAo\5 Pn3`N<=zD wyp˻>ۓrq~\erԋl'y3i3^TNM e |g'cnOѻz~6h.}=0ep4ol(3}, 8$"jb fCS'hmN we8LWKH`77b5ةG$\V<;Eoʘ-]dpYqs7.;\'JsrW3;~3d w_gLazll=Y4ofnGuyx__Zd*A3,07 vdD%XZex0y<V[}+,nMcNc*;;Z^`!eVs <NHܿH;^y^'tK^^_ty΀,m˂ ۣ8| zvkArY_^}Vm +h>7YT1 ȕm03!xq˾v|V of0w~On# ՌtB7ӫCw]߹ؗ[Оxzk xL.ζVg Nh+w/1oYn/+X]gh@m)Q& V*K@ey?~_n>;`x:Au߽lὋ.'-=KolM'kՒ\)؍{F ׼ަSy5ϗց}f n-պAw\WMn?_`/*=n z7?@ le{莔RHeyڀd^}itr^d!Ylepyeo*@lyvѝ%10Eu]/ׯg*ԝuSW|w5[R⬠7ѩ1je鼣rg7udg-??"9 sm=9]h>ys|e%] ރO^?ˀwO/*q>~? uP}\qol`_x9 : _C ]Go tg:Y벾/Ao]Ƿ vAr#g;^[-q!y;-+(=ݐ?`7d v2|_nj,`^ {1܃7.2o;=~|ONR <~` lUֶA&r7;.ْ˘-p~/t:u`{׽˥cEؖ2`uVCo\}en*ЭF6mer5ݫ(y:ug{/~ݧo'ɵ{ e-}z6f;;[po˛Hnj:uܫ<փ7+><ܡ>~!v@rց^xaEy?LA]W~5S~9 JCYV~&Wf7 vx:}f@yW?˜:?w.|zo|}yW˼9~E| u$]v~=>>箾|?>o}˗q^_A0{^]/`^0w _2лn}?雗Fc}7a{#ʫt:u |/r7˂up?yzo:,p{ ɫr:uK~/s_W|8$w7 >t:uK~|t8ǿ~;_ z:uY=o7\xgoVG7txzuŸv`^?Ӡ؁WVCz}\? /Kǯ;`K^z3&mtKW^zuիW^:իW^zիWxzիW^z5T΅}WZ? ΁@nׇ;b[<%߮+୵Z?3B;j LKP ~V`m<7kZkAxd-Dfv4x+|B<׿Zk}Fgz6v -] efw}xX xkzKp;|^u U-`6pZoz/n;~Kye(x\O9w|)K+୵ZۋG:"@pxڊŭ)/| rZ]~u |꣞G,հ|)n{]ozn98tXq9c =+|#K;E쳼~pI|)QWE xk֋cy֛9ޱ)LmD;IMAվZkln V׵2Omsƶʥo&.Gji*Ļ}aZ_>[򬥃 }\/RZUri?z1hV[k CjB;H;VK2{>HmMV xk`7A.WnzmԐcS9_z{}ԙޱd_ +୵Zk-̏c,V ?$^)ћXRV[kn%<+9~h5Y淽w8j! s^dj_Xo:I*Wp~\*Z~[^s]gX?w<վZk2-l͎X;RGq>{wޝ=+ ް}ae{+୵ZW Ǹ-!xӉ'WU25P||V[knL(dl;|[:Qefwׁmfx lJV[ku>C9@~/C_z7g8v} 7%<j_Xo~*_ ݩ+l-}Q/c2"7BXE6Rv_o~j8ځy2TPI`yUD0}(;ئU?yJksibw7;v]fl~\@3?}bc|}V xkzv͋<}} @[8ʖNIyvV!7 FV[kWλekVcdzkL$:9Ǯی~:Z"ٖr8"CC/NʧdJFz^H-.oY݋վZk}^A #l@!PY(fmV-Yusne˕Z@w㚠xMᦼKo4|7YNIy{ |)vݵZk}"^i^L_[_vW͙ܩYvY?̵C뮽ZWIa9IxxX:;my7{uZk,66XS,|fc{׬m t+[o^Wd7^󰮛@yԋbu/jZ+୵O-{Lo7(6WŁ~]Un ,Y,?s2Y vCW[kWUX}9gyK~ P[UbwhYԗ</'ZdxքC,_rn7/3\h,jNm,,b⫬Ii6j4 7>6N$9z=pgd+D'$y/B"261ZD֫n:v7yxngܜCrJ}`4jEdlaƁV[kW̧Aakc&,~XE'o{@:trH,ruH+zwZJ@YK\1dfWWxEROmOci)KԤS ]3W\o^=w,Ks–&C/u<ɀq~;;;1f-?yIx< |Z]C?\Aы;qn|cFg=-BS^gF_| -e=sZ+G]z Fw딖#qzk&;njϺ9ROݑw(1%ct+[o^mv7o_=0[mc';geusz]A{V F6sy_;rkدZk}rjܖw-7) ]xFgicHs~fvױ ل.?Z' hfPJ3kvyEIu~17>' ԣ-aK8lZrk3#,}.>: x@Wu3fpl.͔jQ 8 aZ\|ǎ G*%1e=Xx2d:n~]"{rֽA+୵+m!ԫ8U;@wnE#6mcrNxKF51ooy{ZkY3k̓׀;60~P=p"69e+JT n%x>ȯcua`w ]:_^j`~#޺Oq5h zfv $VM= Y~cyc90;nb7Y 'fݛ7Rtgexk*6>lYE;{lz+}A{h .:Akv%JcFkݖoG䟷]ܣhEBw||k o^9gvs%kӧCJ Ofw] O<іv=~~R{Vmdzc=fSi6fw6`v[oexkjIPTH*vylGر0\i1}PƤQ=&8l[X)ߡy1 Fg@o={Zk쬤`ň,zlX[wm`P瓂a:pe` _K{١mގ.D`o\n2 rsCKs`xpv(g Wf}:[o^5}K܂k`mO޹ncK8ݝ#\ ~3;yN\zlϱ6\?oyw 6CmC5c;C76[0@/7cpgZZkLviV7 @";q+2osdsh<(^:<L u[F:v]沝yh^7<|s(Uau ozz,+` fP {hm*vkx=zVbsv`!q4i;^xCׁݕ<<l;frV[kWE)X(7ka9՝ vٚ`^wgcf@T@;16mb?9><4;[\7 xkJx&mN0Waۘc?1cva{#P]梢8 _kINCv⛜ݕc`ݜY%;[+୵֫xþyR;'J[ćG"Wmd8c4N/21ef.u/L1ƅ*l얖~rW+୵+ |-vf;Tpȼ pQc_o~qx׵7ʼn.T9 [n>fi>L[X̟ޟLBcNgr>?myG}woc9GMFiHuH-Y!e1?oZkO$czi>|,qv&j HY>/<ו$gGsY,n> |w˙Z'dځ՛c=ݢ(go ւAb6kip?J:ʩx mj\aw5nxV[krvgdzׁup喝M EOfwcF쇬a嶠gmkiyaM]y}ptu15|^w xkSrǃ'}c.wb" <Ѭ% ƹ߰Ӟ<|&z6[մfuh`qvsʒjgb{s\zZo~u1g7Ͻۃjl,L ֭2chvͭLdu38> Ԝ U`ۘs`v`V[iV2~@;v]/ !r`g0G`ãr ^C b矵|^v oYRRx͌o)D=ycv;XR!+ikZ({׾~i,LY% {{AgƜEټ&\0F*#}75AY0?4ݒn~tZk}5]#N M 8@bC!7Ȁh謵( `l !va.wg㠷 G>~$,j?}[96m;Y]w|WnmܺkcAWCpQ [[= OA~9C ftC[Y^Zq6ی5dB]@8He=Gȭ!x@ŋђ- ~\/61ۯ7]LŮXEՙ[O Wc,`ͯ/f? x+୵Kt|=x~b`I f Hz6`Y;3aq7o{^%X:0.%8}uZު0;1L~?w|Y4Xz~,ޡKfGo%֊w+୵v"5? v 9^71x; Ao9ky+qbu#X1jz>[ 1-i8E!pg<:s9Zx8V9+Yy >;l;(GܡVfw|׾;fFaᭀZ//t09fpæ[? I&65 춉=9*6bgwro6{’X5'lsAohaW%\ՙ']>ݷ ,ۘms 9S*CM?1H_ xkq)~S@'^^>M}i# wڛ b,G6{"ۻ7,slH(*`mL&VL o]fvy 1|,#@7dCals<^żnnwLbL ㏡4kZw[Ec-yZܔa klmN~]38*9-TK/Fw$Q -Axv&~-6Xgm=LE΂GN?0˛[ \2 8m@<^\y6f5b!3fW[kj@qO>hl.0 Ȉڠift.S2Tu48ysaM ݝQ/4kvzFpEF(N-۝f"lV 58xmů4wj&ښlY1;f?X&,gv+f{(~VZ+vv6-BYCsvv0ˣi2 W& gX0sx݁P`DQSǟMc 솠lޮnV1>~Vz-%?fSfN)j ء`Xq^GeN㘢b3+B6l 5CȖȥ?/WM6Y4Bi&m zO&pYy$vc7\#W1,P]r;ꈉ["!֤ZA=Odz<ǴA2ladhjc{Xm ەv0OP=f764=u~Mڀuq"!Z*2SU[R`YrJEjxi:Zݛ +׀;{|Ɉjz xk@uSu6*ؕh4ndcg@jjmb@Mb6Subls,vvZk[#D Y4zˢK rB2ڝc"mE6YfNcY]K ]0+7O=>i11N  0մ5W[^ඬ&6g'n8kG䩋,5=yÛ}xn- 8ì9)=ǩ4ud{hPh@o[T50 tKc1M@߰Ѐ&9p =cOϾwuK>701W>7kD+KV[kT5w؝ԓ cњf)3ϖ_ϋqއYk;x~(SZ$ f2L=jl2F9dciSqqdq//J+ӛ'[?veuۿē-{_%.NZTb6tnex+Str⩳#9uFg׀ܡ(12;^ a% 89 M>h>m8|}U߿2G!VtiPz*6@ї 8r KZzְA!`N3ݰ9Ac/”dpHL M~Xof!U1[ T!}]ؽ xkR_S1vw >|v>8U|L[ȇ8N4*0cbTkN7oor)w#̫?6f&İo}0T% `@ч Vю0l[~j{ñ؛Օ`s9^ @j<|Gج;'0jz \'잵xsf1v=oLY?G\xdn66S;%>,vZ]i5W`ˢӲv$`!7p"fĘM߀2M7aoVgؾjf&b)S\mI >ty>;Y|kďޛK&w xktݳVn<71:; xsɤY7S|vc̊͊3Fh2þt0C 3D4[N n #SY4&MLZQ`Y(*OmW|pA+,g{>r?}C7#d-Y`Y(*ܜA L*!h-"@nDEZCtMHʼnlyZ ( lC(Y>+ Mbw)|;B'yErCG?Cb=vK5!ákb xkTmD+_fnǑMMq/.}q&^7vLQ |ڥ%F%@/M85qI[lLoV`A Q A=mT$0s.,//~K(B*+3\cwHb;?- Zvm̑`Z8h]%nhUؘڍPu޾1gZKBloJNjMݽ;TD  KIwJFE):f\tʙ)C,w+p36{inK`.{^_pD|Ļm̸.fքՃZ|;NyḿОeyhUbzi>;6h;x;@L ٧rvai @mmJ朮9Ԛ,Y|ilsj4Pч 2?,#T|wm۝o3Ý.l.@ikm,*) ׈Ǐg&RU"jIXoO؝nt-o7tcp6fdNiƴYfWk6aASsl|]9DyYs^WKm]K^$(Q%4DCX/"f͜ǥ3ܠLH;V P#6沝dueKVwl`wVZ,;՝ tn^Ģ 8\4Mu1?iNډ_Y(uc|> >Ҽ ҽMM ]@*4JF26!QQ#!js<"SZh30}|% I*;׮60Vg l" fdzZ*<"L3حZ?`wS`ێ݇Gny?irs, 6rC`0Enl6Zlfr.sx9 fW3}a8`\Z P'grf<Hq9 S!gDKRaijOӲnE ;8L=D[K!l^`˝v,o^My38讂,c*@|Ҝ{8RQ8*p6gg zyw>u6PTP0/@xK҄7;(E TҚdpHyB>p {~ԗ8ww?~R^n&?w?xg|`4W[v|Y nY ȯ<œפ|;}(Nfج9L`g{PPA8v8̃luQ@F=31@hHZ)i>oLƖCCJ h9P 4odLYr瞶wüNܮ.mTV[ew v&Oc| |n| [XC8G.ۜ,v WZL^M{ O[.ԶbyAQƽ@ ,>^ A@q+ C#vmf;-M+y~lf(%ۙрTV/EUB%\VB?>4{Q '1g72L;p}ņP^j&\fOAf-R 3;þ0$$H-$),#Tj)ۖYk>>Ogy7 ` xk})-Lx|\1`t~ /8,R);t37$. hۛ _|qfdb;ǽ5v4 #>*k<7ǥ>Fh/1lN6{ Ha[<7C'Kޓ=Itӑ}fiSoA>>Z`w* 0ڑ@ KVu:-a ڠ}F)Ϧy> [ڊ?~l, ] Om,Uoً:E&S##+\|l=S ff;K#HH]7yjcj| ;?o];^av+ح'=HT{cubc^;OlgB2|WE<96bvç' $ݾ7!  `m  ȝi*7HM˖$ Elbiqkh;:`i] '5f654YPCqO9_1t9;oCw^ jEqLhf.c$@9 !Z则ah=Iܔ::J ]Uubu|FǙ@b؝*կg*1=]ZWVnV[awe|;]'N9rXup)7AN6a )͛e+)Cș/=h~;!ͬhI)i2R̼9R'd{`Gz zsC2+*dﱔ ٝ;i1.l zyvlL¡'O~N@8́tsZ>fnw ؝6q8LGy̳]\ L gMM_h5y4{:gM])c$Kxur ۀ1TH $GIKeeN9J3O&SsBPDͬi쭛YJYD*?|Zbon`x[Ў\W ^4Wshm?3epY9>ٙ9l8޾'T18čȤTDaE ˞֚4FEsQFÊ,*tY(3;To.^@lD*g 6`qr2<6;[ߣ};Z'M))Pc7ecF_HҴ3O],`wۖ]Ӿ)*(tKR~37\T[cİLi澱{7 ͽ }7-p* ~""3ڬ6T60`,$i 8CfwLp4Rof;O\kcK͕C;s0NJ87?\$ޘfn]w29+\oW}`wۓ{0wfL7=Kbl#g&vGj\m0$DN;l4hllUrbofI+Ô> Dku4Tn"ەf Ɯi 3 B`6 "g pS&"^PSY 6`lVPg ^ӋWf:/v9͵~Kz_RN9ȭZ;unwRo$05ṕ bm>&! yY= @to]3vGS9?C3,F|]nFY`V0K{P0SȭBE"Vwֶ@hDU(jXJ@p[ii*."N2JnA:.|2[$Yev@bX]}& lĞd_G7nypzu*@ 旗Glqyz0ctKъјa:f51@@s9f&f S"|p#MOkbmkQ G/xEID *["I+@I .2$Hp-+4ʘ1a!zԗja<ڕX`zþ!!e8-Ө榩,E># ,Hz }QJz%YI,?Kzm %kP![|`s#(pNhϛg!$o)|W ,RCb{LG2B#ar] ne`}2&˂`fx_v '!d9KnW?9hAn.5~J43y"LPAfҵxKPhťZa0cVj"5̋o?xaFGDcv[̘Pq7QpWZ+"N 7-ݢ%96S(ŝ4K,G\Eހ™Nb"PC%#\4P5& o~xpv j$݁ɶ t\SjHٶj[&KM =^DkA>';=PS\"-I |QVt:l|AB6&P}1 ݿ(i u$Z]| w 3'-AmyLoeZ16041M*10A;lϵZF "3)Vـh:&EUfv)-C[3yhE a$?'_y\ j&U#w' G%JI$ D1R6Br]0wfJCT;R L7r>n`V uY $\t )PIb9cv%AR$SN cfuks^2{>h:6f n<v-i nl^*7w0lYZNKR)B48=Q^,}PoZ<5 Cֳ-7}l~kڳe4Nr"M .1[|s8tjmW)@exm_J1S4H4`\Զ!4\V,NS]q AGeptg5V$!6~Bh-KԦ.hO1Skf D=m7 o?nz9y{SX}._ܙ omٷ$8sZOƑ  0撒4L֗FII0dd7Rlr-w&% |JNc:Jαe&U }0&/aFx=ϮC(OnLr CȖ-x2!sqn$`ڴiow߲ n`eL(m0Tw#0ؒSJLU>5I4 A(ڬNH8 --tzS&PђqCa+[o@w]r^S׫lAm%]g;"luf 7| -Lh08E⍵1U.” g" LOsdoȈCsqn ڕI!8V љA=m䌸`Ç?{F!*zX;eW0Ès5 : h<(Ppb\fMSQ {q7(45ߜ <ņBHl}#`m w@;,z׍JTrbuq&h4pi'-m:>_T0[E-+i]K}Kp>GoºF?| vw v:3v(q<0D` kK.Z~iZS4Ț%"dAvZZi8KC0ڕ9w˰/cB^ y@1(q Hkl }]),mD5+a4rO;~OclY:s *8ʮ͝]ΰZe9C`I96,sv76@lV_yoğa3HhHFNjMV[y~ݼ~m>35s6}\9{`ښ^han X)Yrv>[v`pLKiNF5QJ23h^ل+14d|h mnF3M2L[A2ְTs1&q)Xe(TXDm\ ug PQ =9*j@(TTwrZJ; 2,;1spzjGkBp&f!.`ôod;O;a`x 0,E|RfwSF &66/uY aa+حt7 <ہ=H,} Ym7\Y~5μd^a# $ÕS*ULQ21J$#d ,fKpt.&()rH_j܂ LQHsrG)DyDsL/՞adaH m|iFo(k4YUpMRf1093XDN?{q)7 p[`rj27m "L#m8s kݰOkk;"KVڗ1G-j׭+v_2xQL/^=z0|7|ۙ(Y [T\ t9 2;)g X:<A4G̚Mo99@/1`L@+tt'X;SnJXPPmP$6D˼׭i^o\UCDwm*tt!I0zu#6.DU!?Ad^R4Fg5@ 橽6dcm-4[1$`{5kcηN>nk|9{/_}>{t? зg# 97ko뙙alaznՅ'C뭸5&$ o1*633d12*ʌd"q񹜅`%*@4pHf.,m.'Y-'D5JK? q.u2Pa@aFdBu`aSbA-UMBrܙTҭ7.;`+ *̟ ECWLP}#,|AQ#:s4[8f{*fF +W`&]o쮫ϼ σo7g;O@|=j^߁O џil[ r綇Yʫs;wV偐E2 \ 9֞RӲ͙kq2yT`=m $ qcb04׵ǜN-?StT01uS0Ka#LJșSv;\䝥߲)Is%'CdV¾yџKQI4 ̺(*\ŕ!GVvG4KFc0έTj[PZIr3'u4&/NV[c׏,[| b- 6v,+gg^LF,tojM @ ݓ{yIfwMP-/0P H$ ;kދOV 5&GL|sf!V9 %$h@M*7٥!'q jKS-Hʂ2& s:8txp/.w[T ښ Qd9ح"9U+ؠDJ a߽maaaF9RmU . Lzу@*>:irԘTa֍[tkg9Xi1 |6M2 Rԕa1f[.,o[Oߎ-nz sۿ}-;O}yb}ٔ-&- | 0X5=u;xu ֛N=`=JJLbm[㓊Jz-Ll >3  8I, eƓRoaX{֘`7F_]o3J YП{sS¦e&f_ l,(s"ތpZfP+߶IYD!.?QY"ɪq#ZM0<&Fg*ޤD> Ti¼o;׫ͧTKUnVhFXm@Zj&t-ڙl_,XIԗ[󵝹ZssYqvNC 2y29O]V]SĬl>gv@-DӘnҧ}̼fѡ m]*Y #%^ !̉!W_M8m8`|>,ЧS (-?OsрiA||?}xds׃Ѷyec]> (FKve2˲hb^N[.]4Q?UU*;<,f~Vj|'F7N|ff o  y|Be)EK w_3r$́2SW:7ơ)6dlh.!CA Kw2] ixdgjho7Cތ RΣo'5ը>ª"' VX0Y}$KCfB-4$RNܙ`zNיyw)B_4^3B^yM6|rNEZovr~}~|/A$oAii=v]LwmaO=d}e+Su+0ߖ?/fՒVdf\ *w aEAdf yDi(0/>{/ln4Hc6/ڛ cewwmoN3!J\bAXaNF%~Sg)yj[@ehR3r+Ϗe?mjer(®{l./L;vQ̷#TL5١jU]\ d!*#(5;6l,wsQҡ $~t=7}_zT]J3R([!&)}yìOQAZ*x,E/<@E.5طwolm[ֺ5*'&ȡы^>TV&a0C# : pXFBPnsmnK , v-4m8{Z+uKݲ.~q' 䯿bEItz`RA6&¶0 y  -R\nͮ`250dsZև40>09{6;(C*_‡C#7p?#i`sľ`e֮4}93;MmΒqn?_z;kV7! !"@38 Y rkH"qcC,(ɕ;t;Ȭ[h+QT"ST!*`-7e5DY5LF@b4BKr䟊%R P7*E<ҒK gy?ɚaՒBgT6F da_&+';RjW[z*3Y '-zt p#?f9y0,k}3NWlbuNLo`{`(݅TleA@U\E[.;mGآnlḲZLG$TO?=l۩[oTv*UЪXRJ!UTgA(Qn)?O4zxȬ nr9` K-IxooCtri:xa πOkr~}'O en;D AE~>LGM뻖LTo}*./ 0j1~V ChVw:U 3<g{ Eaa 3AEpHOgm?` 46: 8gwe6ӛY &FmNۿ 4y./}Mֺ}m[#o&+T5cuDzW8#sfP.z{g;փGO-Njҥ }R=)+hJ-'KMaQ3ԫ pDZC dV)1%\4\-]'Q *1ky&@ p?߲óm?(C}FwKSodЃĶZ .|bq-ښʓlaR`ߥPfb;i6ph*Mװēg;:XbvR)y怇y"Vm"7`.AF t19e~£ݿago9-OWg=ufx>tpvn+@quS0*).0[s>S TPo=b=H1v)&TEٷ_t_tc@Vvv^ыjOpGX5vp.D"JAVaܖ UE)m呙bT:,^ adR٢r+8m@t%UŽE9_=zq77ʱM9,B:W[Ygt׶<0۞h˳lUn7Wx|?{ ܬϭh926\JK#:vUERee&f-*J57="œR }Z9fn!Z w&:Vc.m֪tguWۗ :pGkQPHnw ŲFZHr2<=,I$o=Äހ`z7o#:h=QwJ{UEO*YC0 : " Rlo ]-&T!]>)FZ Y#V#l3XQek?ҧ{w f&6±#F#"JnzaՍ٢׽&%f;A+ݝ)D5AA-0#lI@ɌmPз%h{ Uw< L{0Y[ki,(X @?T}n嬮rg\ǼfǺűn)Tiyu噜}`g]T5"XH4,?[OkV*eΠ"$yoGd^@]O[j`"*Jt ֌+ DȐ,VFWHf@Վjhj}neb2;}& ' T@6sf1CKf@~A_!"%+р/Un[kle^]^>R}wMܹc`nm>~4ts01XdX4YM>°.SRJm`w1=q Z(WцVem;,W컴9(X. abR^N3NnU^anab &ѫ+h{JYv({? g1gf[fYۂm[A▭;'VGMm }SWcH+YImXa&:& w?۟hcc`^bOBTe#PAjq" ,2 erv9Ts DBT@y|c0zsX S{23PvR( mhpD y^.jb* x_n_q.ᶕEL?RүZ/|~hRk_%<,ͪORy*n RR338\ƐW8irܡg^i 3sjARi+TA{}>;xyMP+ӹ?M7>ց/볯 5}l1wlKjH$Ow貖AL5Wzg;JabGVU{xZ{*g A8@eH̍BEAo}+Z.rS$hUCa @KT! FX $QQpO M.KE0os86e~eP{-5iVUM7՟bw|dz5m9Dz^oSw7;bwsL; Vn7Z ۍF0m{jҦ:,!eNO낅Y2Gӂ sLA= ᙕ {#D9)ಷL{0'`q8˜=nr^11>ou>? `[qGZnQQbw "+~ӺsAգŀa!=dUY AVX0Ps,#QY3ł(k#DMe!D-L^*+LĶ0ZTV G0sRIfʘF! =#6dtzJ՟>/GSN28'C^J&Zr8ZKv]͖p}zA 8nPaiKK^ߞ?L_]&6k2pg0NpK{sY#{%J_XJ@T3Hek`T)\O4ckٝ̀o|Kf7! *ʬeYl^狶gR8L 3YV8欫m7wm^>2o0CӫM| vC> AU zU zU@3O՜Y@J0}l2z-'uu#"(fdUQjTlm+h0(SɎ%*2 fo~9_پ_ݭNYDC\!}-Qg/k`v}cs\[+u{MxbY=möpd/s!(5MƬn.nvrp,E\[nV@fˬ @Y8(0ut> N6\ Wg@octvy koi4cv͎Eۺt4a=x](;D_`vZzYTPTzz(t"sびG>[" VHYc"5U@zhجaL#j5PȀ`L!P5, p$ I9nFvIq*3#UnEb!Ym"&뫷Qñyy?ڟ ḫM ywQCBls DU0TvP˫̼.Sz!G̝Ff.Yf, 5}}|^D)ř+O3;̮5Gp:S"x>5U7! cԊz^HBOΣۺhCQUfZrx h9`DFK R!Fv}>L f&YԌ=B+I$h ɝ 0R:d;'E0UQE|r3rZF֖`lٞtv6 Wז xkTv}If6?ɐg1Qe ֦<?Fla`2gx}} 7x@i60mfLox>?N`6[5:9Wٹo?O>?%;˼LEHaݷ%+*\i- +Pa@f^`V q` yTX{*XPuXEG Xk"rHSߏN0'@@+݈ #V (T8ݹ٣"Qt`ec+-Z 14!j0E'>AD/W*ۚuhg5K VV[1le6PZ}yElU" v=FF23!:`ʍ2 J[[YTd2FdfHy% ь (Y9\Щ`.iLo9&J;+Bb;4 k;  ACJ_b E`e9+]攲G2VH- !׎bMZs a<]%S#FX w^3l@"n`VfpRAQf^7?}ga;iGCip(Ri|r&Z d LGf}p1x6gYs#۬@î8ڠk`vÇLM)5ۙDZ>Jp`L|jn "#X-ٝ&Ѓ`&,YPrW&Z4iF/SW Pl @ƅX }l__(D bSh14f/1Ur/w? fz6-@7Ayh>(FmLsY9|x72{X$,SZ؜+Û/-́ K-͛8ů-Aϥa7/60y?ڻF.{"L[(!$CnqZ v\ND*=@I^܌(9E#RKĦPA `1+;UMB`K/xq S5\30ASP8͌(YhWȐ+< ٦zL쎨2#LVSMpfrpmA}) wjLkln `|悔9ȍ;涄fch#e#-iFd++3\䀅ɕ